First step to namespaces

This commit is contained in:
Shoghi Cervantes
2014-03-05 23:43:16 +01:00
parent 23b8fc32ff
commit 5ea31b57ce
406 changed files with 3418 additions and 3597 deletions

View File

@@ -19,6 +19,8 @@
*
*/
namespace PocketMine;
abstract class Achievement{
public static $list = array(
/*"openInventory" => array(

View File

@@ -19,6 +19,8 @@
*
*/
namespace PocketMine;
class BanAPI{
private $server;
/*
@@ -38,10 +40,10 @@ class BanAPI{
}
public function init(){
$this->whitelist = new Config(DATA_PATH."white-list.txt", Config::ENUM);//Open whitelist list file
$this->bannedIPs = new Config(DATA_PATH."banned-ips.txt", Config::ENUM);//Open Banned IPs list file
$this->banned = new Config(DATA_PATH."banned.txt", Config::ENUM);//Open Banned Usernames list file
$this->ops = new Config(DATA_PATH."ops.txt", Config::ENUM);//Open list of OPs
$this->whitelist = new Utils\Config(DATA."white-list.txt", Utils\Config::ENUM);//Open whitelist list file
$this->bannedIPs = new Utils\Config(DATA."banned-ips.txt", Utils\Config::ENUM);//Open Banned IPs list file
$this->banned = new Utils\Config(DATA."banned.txt", Utils\Config::ENUM);//Open Banned Usernames list file
$this->ops = new Utils\Config(DATA."ops.txt", Utils\Config::ENUM);//Open list of OPs
$this->server->api->console->register("banip", "<add|remove|list|reload> [IP|player]", array($this, "commandHandler"));
$this->server->api->console->register("ban", "<add|remove|list|reload> [username]", array($this, "commandHandler"));
$this->server->api->console->register("kick", "<player> [reason ...]", array($this, "commandHandler"));
@@ -211,7 +213,7 @@ class BanAPI{
$output .= "Player \"$user\" added to white-list\n";
break;
case "reload":
$this->whitelist = new Config(DATA_PATH."white-list.txt", Config::ENUM);
$this->whitelist = new Utils\Config(DATA."white-list.txt", Utils\Config::ENUM);
break;
case "list":
$output .= "White-list: ".implode(", ", $this->whitelist->getAll(true))."\n";
@@ -256,7 +258,7 @@ class BanAPI{
$output .= "IP \"$ip\" added to ban list\n";
break;
case "reload":
$this->bannedIPs = new Config(DATA_PATH."banned-ips.txt", Config::ENUM);
$this->bannedIPs = new Utils\Config(DATA."banned-ips.txt", Utils\Config::ENUM);
break;
case "list":
$output .= "IP ban list: ".implode(", ", $this->bannedIPs->getAll(true))."\n";
@@ -294,7 +296,7 @@ class BanAPI{
$output .= "Player \"$user\" added to ban list\n";
break;
case "reload":
$this->banned = new Config(DATA_PATH."banned.txt", Config::ENUM);
$this->banned = new Utils\Config(DATA."banned.txt", Utils\Config::ENUM);
break;
case "list":
$output .= "Ban list: ".implode(", ", $this->banned->getAll(true))."\n";

View File

@@ -19,6 +19,8 @@
*
*/
namespace PocketMine;
class BlockAPI{
private $server;
private $scheduledUpdates = array();
@@ -246,14 +248,14 @@ class BlockAPI{
}
}
public static function get($id, $meta = 0, $v = false){
public static function get($id, $meta = 0, Level\Position $v = null){
if(isset(Block::$class[$id])){
$classname = Block::$class[$id];
$b = new $classname($meta);
}else{
$b = new GenericBlock((int) $id, $meta);
$b = new Block\GenericBlock((int) $id, $meta);
}
if($v instanceof Position){
if($v instanceof Level\Position){
$b->position($v);
}
return $b;
@@ -261,11 +263,11 @@ class BlockAPI{
public static function getItem($id, $meta = 0, $count = 1){
$id = (int) $id;
if(isset(Item::$class[$id])){
$classname = Item::$class[$id];
if(isset(Item\Item::$class[$id])){
$classname = Item\Item::$class[$id];
$i = new $classname($meta, $count);
}else{
$i = new Item($id, $meta, $count);
$i = new Item\Item($id, $meta, $count);
}
return $i;
}
@@ -316,8 +318,8 @@ class BlockAPI{
return $output;
}
private function cancelAction(Block $block, Player $player, $send = true){
$pk = new UpdateBlockPacket;
private function cancelAction(Block\Block $block, Player $player, $send = true){
$pk = new Network\Protocol\UpdateBlockPacket;
$pk->x = $block->x;
$pk->y = $block->y;
$pk->z = $block->z;
@@ -330,7 +332,7 @@ class BlockAPI{
return false;
}
public function playerBlockBreak(Player $player, Vector3 $vector){
public function playerBlockBreak(Player $player, Math\Math\Vector3 $vector){
$target = $player->level->getBlock($vector);
$item = $player->getSlot($player->slot);
@@ -354,7 +356,7 @@ class BlockAPI{
return $this->cancelAction($target, $player, false);
}
if(($player->gamemode & 0x01) === 0 and $item->useOn($target) and $item->getMetadata() >= $item->getMaxDurability()){
$player->setSlot($player->slot, new Item(AIR, 0, 0));
$player->setSlot($player->slot, new Item\Item(AIR, 0, 0));
}
}else{
return $this->cancelAction($target, $player, false);
@@ -370,7 +372,7 @@ class BlockAPI{
return false;
}
public function playerBlockAction(Player $player, Vector3 $vector, $face, $fx, $fy, $fz){
public function playerBlockAction(Player $player, Math\Math\Vector3 $vector, $face, $fx, $fy, $fz){
if($face < 0 or $face > 5){
return false;
}
@@ -424,7 +426,7 @@ class BlockAPI{
$hand = $item->getBlock();
$hand->position($block);
}elseif($block->getID() === FIRE){
$player->level->setBlock($block, new AirBlock(), true, false, true);
$player->level->setBlock($block, new Block\AirBlock(), true, false, true);
return false;
}else{
return $this->cancelAction($block, $player, false);
@@ -451,16 +453,16 @@ class BlockAPI{
return $this->cancelAction($block, $player, false);
}
if($hand->getID() === SIGN_POST or $hand->getID() === WALL_SIGN){
new SignTile($player->level, new NBTTag_Compound(false, array(
"id" => new NBTTag_String("id", Tile::Sign),
"x" => new NBTTag_Int("x", $block->x),
"y" => new NBTTag_Int("y", $block->y),
"z" => new NBTTag_Int("z", $block->z),
"Text1" => new NBTTag_String("Text1", ""),
"Text2" => new NBTTag_String("Text2", ""),
"Text3" => new NBTTag_String("Text3", ""),
"Text4" => new NBTTag_String("Text4", ""),
"creator" => new NBTTag_String("creator", $player->getUsername())
new Tile\Sign($player->level, new NBT\Tag\Compound(false, array(
"id" => new NBT\Tag\String("id", Tile::Sign),
"x" => new NBT\Tag\Int("x", $block->x),
"y" => new NBT\Tag\Int("y", $block->y),
"z" => new NBT\Tag\Int("z", $block->z),
"Text1" => new NBT\Tag\String("Text1", ""),
"Text2" => new NBT\Tag\String("Text2", ""),
"Text3" => new NBT\Tag\String("Text3", ""),
"Text4" => new NBT\Tag\String("Text4", ""),
"creator" => new NBT\Tag\String("creator", $player->getUsername())
)));
}
@@ -474,7 +476,7 @@ class BlockAPI{
return false;
}
public function blockUpdateAround(Position $pos, $type = BLOCK_UPDATE_NORMAL, $delay = false){
public function blockUpdateAround(Level\Position $pos, $type = BLOCK_UPDATE_NORMAL, $delay = false){
if($delay !== false){
$this->scheduleBlockUpdate($pos->getSide(0), $delay, $type);
$this->scheduleBlockUpdate($pos->getSide(1), $delay, $type);
@@ -492,11 +494,11 @@ class BlockAPI{
}
}
public function blockUpdate(Position $pos, $type = BLOCK_UPDATE_NORMAL){
if(!($pos instanceof Block)){
public function blockUpdate(Level\Position $pos, $type = BLOCK_UPDATE_NORMAL){
if(!($pos instanceof Block\Block)){
$block = $pos->level->getBlock($pos);
}else{
$pos = new Position($pos->x, $pos->y, $pos->z, $pos->level);
$pos = new Level\Position($pos->x, $pos->y, $pos->z, $pos->level);
$block = $pos->level->getBlock($pos);
}
if($block === false){
@@ -510,7 +512,7 @@ class BlockAPI{
return $level;
}
public function scheduleBlockUpdate(Position $pos, $delay, $type = BLOCK_UPDATE_SCHEDULED){
public function scheduleBlockUpdate(Level\Position $pos, $delay, $type = BLOCK_UPDATE_SCHEDULED){
$type = (int) $type;
if($delay < 0){
return false;
@@ -530,7 +532,7 @@ class BlockAPI{
$time = microtime(true);
if(count($this->scheduledUpdates) > 0){
$update = $this->server->query("SELECT x,y,z,level,type FROM blockUpdates WHERE delay <= ".$time.";");
if($update instanceof SQLite3Result){
if($update instanceof \SQLite3Result){
$upp = array();
while(($up = $update->fetchArray(SQLITE3_ASSOC)) !== false){
$index = $up["x"].".".$up["y"].".".$up["z"].".".$up["level"].".".$up["type"];

View File

@@ -19,6 +19,8 @@
*
*/
namespace PocketMine;
class ChatAPI{
private $server;
function __construct(){
@@ -143,6 +145,7 @@ class ChatAPI{
$message["player"] = "";
}
//TODO: Remove Container
$this->server->handle("server.chat", new Container($message, $whitelist, $blacklist));
}
}

View File

@@ -19,6 +19,8 @@
*
*/
namespace PocketMine;
class ConsoleAPI{
private $loop, $server, $event, $help, $cmds, $alias;
function __construct(){
@@ -130,7 +132,7 @@ class ConsoleAPI{
$max = ceil(count($cmds) / 5);
$page = (int) (isset($params[0]) ? min($max, max(1, intval($params[0]))):1);
$output .= TextFormat::RED."-".TextFormat::RESET." Showing help page $page of $max (/help <page>) ".TextFormat::RED."-".TextFormat::RESET."\n";
$output .= Utils\TextFormat::RED."-".Utils\TextFormat::RESET." Showing help page $page of $max (/help <page>) ".Utils\TextFormat::RED."-".Utils\TextFormat::RESET."\n";
$current = 1;
foreach($cmds as $c => $h){
$curpage = (int) ceil($current / 5);
@@ -177,9 +179,9 @@ class ConsoleAPI{
return $this->run($this->alias[$cmd] . ($params !== "" ? " " .$params:""), $issuer, $cmd);
}
if($issuer instanceof Player){
console("[DEBUG] ".TextFormat::AQUA.$issuer->getUsername().TextFormat::RESET." issued server command: ".ltrim("$alias ")."/$cmd ".$params, true, true, 2);
console("[DEBUG] ".Utils\TextFormat::AQUA.$issuer->getUsername().Utils\TextFormat::RESET." issued server command: ".ltrim("$alias ")."/$cmd ".$params, true, true, 2);
}else{
console("[DEBUG] ".TextFormat::YELLOW."*".$issuer.TextFormat::RESET." issued server command: ".ltrim("$alias ")."/$cmd ".$params, true, true, 2);
console("[DEBUG] ".Utils\TextFormat::YELLOW."*".$issuer.Utils\TextFormat::RESET." issued server command: ".ltrim("$alias ")."/$cmd ".$params, true, true, 2);
}
if(preg_match_all('#@([@a-z]{1,})#', $params, $matches, PREG_OFFSET_CAPTURE) > 0){
@@ -285,7 +287,7 @@ class ConsoleAPI{
}
class ConsoleLoop extends Thread{
class ConsoleLoop extends \Thread{
public $line;
public $stop;
public $base;

View File

@@ -19,6 +19,9 @@
*
*/
namespace PocketMine;
use PocketMine;
class Container{
private $payload = "", $whitelist = false, $blacklist = false;
public function __construct($payload = "", $whitelist = false, $blacklist = false){

View File

@@ -19,6 +19,9 @@
*
*/
//TODO: REMOVE
namespace PocketMine;
class Deprecation{
public static $events = array(
@@ -31,5 +34,4 @@ class Deprecation{
"api.player.offline.save" => "player.offline.save",
);
}

View File

@@ -19,6 +19,8 @@
*
*/
__halt_compiler();
class EntityOLD extends Position{
public $age;
public $air;
@@ -346,11 +348,11 @@ class EntityOLD extends Position{
for($y = $startY; $y <= $endY; ++$y){
for($x = $startX; $x <= $endX; ++$x){
for($z = $startZ; $z <= $endZ; ++$z){
$b = $this->level->getBlock(new Vector3($x, $y, $z));
$b = $this->level->getBlock(new Math\Vector3($x, $y, $z));
switch($b->getID()){
case WATER:
case STILL_WATER: //Drowing
if($this->fire > 0 and $this->inBlock(new Vector3($x, $y, $z))){
if($this->fire > 0 and $this->inBlock(new Math\Vector3($x, $y, $z))){
$this->fire = 0;
$this->updateMetadata();
}
@@ -366,7 +368,7 @@ class EntityOLD extends Position{
break;
case LAVA: //Lava damage
case STILL_LAVA:
if($this->inBlock(new Vector3($x, $y, $z))){
if($this->inBlock(new Math\Vector3($x, $y, $z))){
$this->harm(5, "lava");
$this->fire = 300;
$this->updateMetadata();
@@ -374,7 +376,7 @@ class EntityOLD extends Position{
}
break;
case FIRE: //Fire block damage
if($this->inBlock(new Vector3($x, $y, $z))){
if($this->inBlock(new Math\Vector3($x, $y, $z))){
$this->harm(1, "fire");
$this->fire = 300;
$this->updateMetadata();
@@ -382,13 +384,13 @@ class EntityOLD extends Position{
}
break;
case CACTUS: //Cactus damage
if($this->touchingBlock(new Vector3($x, $y, $z))){
if($this->touchingBlock(new Math\Vector3($x, $y, $z))){
$this->harm(1, "cactus");
$hasUpdate = true;
}
break;
default:
if($this->inBlock(new Vector3($x, $y, $z), 0.7) and $y == $endY and $b->isTransparent === false and ($this->class === ENTITY_MOB or $this->class === ENTITY_PLAYER)){
if($this->inBlock(new Math\Vector3($x, $y, $z), 0.7) and $y == $endY and $b->isTransparent === false and ($this->class === ENTITY_MOB or $this->class === ENTITY_PLAYER)){
$this->harm(1, "suffocation"); //Suffocation
$hasUpdate = true;
}elseif($x == ($endX - 1) and $y == $endY and $z == ($endZ - 1)){
@@ -436,7 +438,7 @@ class EntityOLD extends Position{
$isFlying = true;
for($z = $startZ; $z <= $endZ; ++$z){
for($x = $startX; $x <= $endX; ++$x){
$v = new Vector3($x, $y, $z);
$v = new Math\Vector3($x, $y, $z);
if($this->isSupport($v, $this->size)){
$b = $this->level->getBlock($v);
if($b->isSolid === true){
@@ -474,14 +476,14 @@ class EntityOLD extends Position{
$z = (int) ($this->z - 0.5);
$lim = (int) floor($ny);
for($y = (int) ceil($this->y) - 1; $y >= $lim; --$y){
if($this->level->getBlock(new Vector3($x, $y, $z))->isSolid === true){
if($this->level->getBlock(new Math\Vector3($x, $y, $z))->isSolid === true){
$ny = $y + 1;
$this->speedY = 0;
$support = true;
if($this->class === ENTITY_FALLING){
$this->y = $ny;
$fall = $this->level->getBlock(new Vector3(intval($this->x - 0.5), intval(ceil($this->y)), intval($this->z - 0.5)));
$down = $this->level->getBlock(new Vector3(intval($this->x - 0.5), intval(ceil($this->y) - 1), intval($this->z - 0.5)));
$fall = $this->level->getBlock(new Math\Vector3(intval($this->x - 0.5), intval(ceil($this->y)), intval($this->z - 0.5)));
$down = $this->level->getBlock(new Math\Vector3(intval($this->x - 0.5), intval(ceil($this->y) - 1), intval($this->z - 0.5)));
if($fall->isFullBlock === false or $down->isFullBlock === false){
$this->server->api->entity->drop($this, BlockAPI::getItem($this->data["Tile"] & 0xFFFF, 0, 1), true);
}else{
@@ -534,8 +536,8 @@ class EntityOLD extends Position{
}
}elseif($this->fallY !== false){ //Fall damage!
if($y < $this->fallY){
$d = $this->level->getBlock(new Vector3($this->x, $y + 1, $this->z));
$d2 = $this->level->getBlock(new Vector3($this->x, $y + 2, $this->z));
$d = $this->level->getBlock(new Math\Vector3($this->x, $y + 1, $this->z));
$d2 = $this->level->getBlock(new Math\Vector3($this->x, $y + 2, $this->z));
$dmg = ($this->fallY - $y) - 3;
if($dmg > 0 and !($d instanceof LiquidBlock) and $d->getID() !== LADDER and $d->getID() !== COBWEB and !($d2 instanceof LiquidBlock) and $d2->getID() !== LADDER and $d2->getID() !== COBWEB){
$this->harm($dmg, "fall");
@@ -547,7 +549,7 @@ class EntityOLD extends Position{
}
$this->calculateVelocity();
if($this->speed <= 9 or ($this->speed <= 20 and ($this->player->gamemode & 0x01) === 0x01)){
$this->player->lastCorrect = new Vector3($this->last[0], $this->last[1], $this->last[2]);
$this->player->lastCorrect = new Math\Vector3($this->last[0], $this->last[1], $this->last[2]);
}
}
}
@@ -571,9 +573,9 @@ class EntityOLD extends Position{
if($this->class === ENTITY_PLAYER or ($this->last[5] + 8) < $now){
if($this->server->api->handle("entity.move", $this) === false){
if($this->class === ENTITY_PLAYER and $this->player instanceof Player){
$this->player->teleport(new Vector3($this->last[0], $this->last[1], $this->last[2]), $this->last[3], $this->last[4]);
$this->player->teleport(new Math\Vector3($this->last[0], $this->last[1], $this->last[2]), $this->last[3], $this->last[4]);
}else{
$this->setPosition(new Vector3($this->last[0], $this->last[1], $this->last[2]), $this->last[3], $this->last[4]);
$this->setPosition(new Math\Vector3($this->last[0], $this->last[1], $this->last[2]), $this->last[3], $this->last[4]);
}
}else{
$this->updateLast();
@@ -834,7 +836,7 @@ class EntityOLD extends Position{
$this->server->query("UPDATE entities SET pitch = ".$this->pitch.", yaw = ".$this->yaw." WHERE EID = ".$this->eid.";");
}
public function move(Vector3 $pos, $yaw = 0, $pitch = 0){
public function move(Math\Vector3 $pos, $yaw = 0, $pitch = 0){
$this->x += $pos->x;
$this->y += $pos->y;
$this->z += $pos->z;
@@ -849,7 +851,7 @@ class EntityOLD extends Position{
$this->server->query("UPDATE entities SET level = '".$this->level->getName()."', x = ".$this->x.", y = ".$this->y.", z = ".$this->z.", pitch = ".$this->pitch.", yaw = ".$this->yaw." WHERE EID = ".$this->eid.";");
}
public function setPosition(Vector3 $pos, $yaw = false, $pitch = false){
public function setPosition(Math\Vector3 $pos, $yaw = false, $pitch = false){
if($pos instanceof Position and $pos->level instanceof Level and $this->level !== $pos->level){
$this->level = $pos->level;
$this->server->preparedSQL->entity->setLevel->reset();
@@ -878,23 +880,23 @@ class EntityOLD extends Position{
$this->server->preparedSQL->entity->setPosition->execute();
}
public function inBlock(Vector3 $block, $radius = 0.8){
$me = new Vector3($this->x - 0.5, $this->y, $this->z - 0.5);
public function inBlock(Math\Vector3 $block, $radius = 0.8){
$me = new Math\Vector3($this->x - 0.5, $this->y, $this->z - 0.5);
if(($block->y == ((int) $this->y) or $block->y == (((int) $this->y) + 1)) and $block->maxPlainDistance($me) < $radius){
return true;
}
return false;
}
public function touchingBlock(Vector3 $block, $radius = 0.9){
$me = new Vector3($this->x - 0.5, $this->y, $this->z - 0.5);
public function touchingBlock(Math\Vector3 $block, $radius = 0.9){
$me = new Math\Vector3($this->x - 0.5, $this->y, $this->z - 0.5);
if(($block->y == (((int) $this->y) - 1) or $block->y == ((int) $this->y) or $block->y == (((int) $this->y) + 1)) and $block->maxPlainDistance($me) < $radius){
return true;
}
return false;
}
public function isSupport(Vector3 $pos, $radius = 1){
public function isSupport(Math\Vector3 $pos, $radius = 1){
$me = new Vector2($this->x - 0.5, $this->z - 0.5);
$diff = $this->y - $pos->y;
if($me->distance(new Vector2($pos->x, $pos->z)) < $radius and $diff > -0.7 and $diff < 1.6){

View File

@@ -2,11 +2,11 @@
/**
*
* ____ _ _ __ __ _ __ __ ____
* | _ \ ___ ___| | _____| |_| \/ (_)_ __ ___ | \/ | _ \
* ____ _ _ __ __ _ __ __ ____
* | _ \ ___ ___| | _____| |_| \/ (_)_ __ ___ | \/ | _ \
* | |_) / _ \ / __| |/ / _ \ __| |\/| | | '_ \ / _ \_____| |\/| | |_) |
* | __/ (_) | (__| < __/ |_| | | | | | | | __/_____| | | | __/
* |_| \___/ \___|_|\_\___|\__|_| |_|_|_| |_|\___| |_| |_|_|
* | __/ (_) | (__| < __/ |_| | | | | | | | __/_____| | | | __/
* |_| \___/ \___|_|\_\___|\__|_| |_|_|_| |_|\___| |_| |_|_|
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU Lesser General Public License as published by
@@ -15,9 +15,11 @@
*
* @author PocketMine Team
* @link http://www.pocketmine.net/
*
*
*/
*
*/
namespace PocketMine;
class LevelAPI{
private $server, $levels, $default;
@@ -80,7 +82,7 @@ class LevelAPI{
}
public function generateLevel($name, $seed = false, $generator = false){
if($this->levelExists($name)){
if($name == "" or $this->levelExists($name)){
return false;
}
$options = array();
@@ -92,12 +94,12 @@ class LevelAPI{
$generator = new $generator($options);
}else{
if(strtoupper($this->server->api->getProperty("level-type")) == "FLAT"){
$generator = new SuperflatGenerator($options);
$generator = new Level\Generator\Flat($options);
}else{
$generator = new NormalGenerator($options);
$generator = new Level\Generator\Normal($options);
}
}
$gen = new WorldGenerator($generator, $name, $seed === false ? Utils::readInt(Utils::getRandomBytes(4, false)):(int) $seed);
$gen = new Level\WorldGenerator($generator, $name, $seed === false ? Utils\Utils::readInt(Utils\Utils::getRandomBytes(4, false)):(int) $seed);
$gen->generate();
$gen->close();
return true;
@@ -107,9 +109,9 @@ class LevelAPI{
if($name === ""){
return false;
}
$path = DATA_PATH."worlds/".$name."/";
$path = DATA."worlds/".$name."/";
if($this->get($name) === false and !file_exists($path."level.pmf")){
$level = new LevelImport($path);
$level = new Level\LevelImport($path);
if($level->import() === false){
return false;
}
@@ -117,7 +119,7 @@ class LevelAPI{
return true;
}
public function unloadLevel(Level $level, $force = false){
public function unloadLevel(Level\Level $level, $force = false){
$name = $level->getName();
if($name === $this->default and $force !== true){
return false;
@@ -128,14 +130,6 @@ class LevelAPI{
foreach($level->getPlayers() as $player){
$player->teleport($this->server->spawn);
}
/*foreach($this->server->api->entity->getAll($level) as $entity){
if($entity->class !== ENTITY_PLAYER){
$entity->close();
}
}*/
/*foreach($this->server->api->tile->getAll($level) as $tile){
$tile->close();
}*/
$level->close();
unset($this->levels[$name]);
return true;
@@ -148,19 +142,19 @@ class LevelAPI{
console("[NOTICE] Level \"".$name."\" not found");
return false;
}
$path = DATA_PATH."worlds/".$name."/";
$path = DATA."worlds/".$name."/";
console("[INFO] Preparing level \"".$name."\"");
$level = new PMFLevel($path."level.pmf");
$level = new PMF\Level($path."level.pmf");
if(!$level->isLoaded){
console("[ERROR] Could not load level \"".$name."\"");
return false;
}
//$entities = new Config($path."entities.yml", Config::YAML);
//$entities = new Utils\Config($path."entities.yml", Utils\Config::YAML);
if(file_exists($path."tileEntities.yml")){
@rename($path."tileEntities.yml", $path."tiles.yml");
}
$blockUpdates = new Config($path."bupdates.yml", Config::YAML);
$this->levels[$name] = new Level($level, $name);
$blockUpdates = new Utils\Config($path."bupdates.yml", Utils\Config::YAML);
$this->levels[$name] = new Level\Level($level, $name);
/*foreach($entities->getAll() as $entity){
if(!isset($entity["id"])){
break;
@@ -177,39 +171,39 @@ class LevelAPI{
));
}elseif($entity["id"] === FALLING_SAND){
$e = $this->server->api->entity->add($this->levels[$name], ENTITY_FALLING, $entity["id"], $entity);
$e->setPosition(new Vector3($entity["Pos"][0], $entity["Pos"][1], $entity["Pos"][2]), $entity["Rotation"][0], $entity["Rotation"][1]);
$e->setPosition(new Math\Vector3($entity["Pos"][0], $entity["Pos"][1], $entity["Pos"][2]), $entity["Rotation"][0], $entity["Rotation"][1]);
$e->setHealth($entity["Health"]);
}elseif($entity["id"] === OBJECT_PAINTING or $entity["id"] === OBJECT_ARROW){ //Painting
$e = $this->server->api->entity->add($this->levels[$name], ENTITY_OBJECT, $entity["id"], $entity);
$e->setPosition(new Vector3($entity["Pos"][0], $entity["Pos"][1], $entity["Pos"][2]), $entity["Rotation"][0], $entity["Rotation"][1]);
$e->setPosition(new Math\Vector3($entity["Pos"][0], $entity["Pos"][1], $entity["Pos"][2]), $entity["Rotation"][0], $entity["Rotation"][1]);
$e->setHealth(1);
}else{
$e = $this->server->api->entity->add($this->levels[$name], ENTITY_MOB, $entity["id"], $entity);
$e->setPosition(new Vector3($entity["Pos"][0], $entity["Pos"][1], $entity["Pos"][2]), $entity["Rotation"][0], $entity["Rotation"][1]);
$e->setPosition(new Math\Vector3($entity["Pos"][0], $entity["Pos"][1], $entity["Pos"][2]), $entity["Rotation"][0], $entity["Rotation"][1]);
$e->setHealth($entity["Health"]);
}
}*/
if(file_exists($path ."tiles.yml")){
$tiles = new Config($path."tiles.yml", Config::YAML);
$tiles = new Utils\Config($path."tiles.yml", Utils\Config::YAML);
foreach($tiles->getAll() as $tile){
if(!isset($tile["id"])){
continue;
}
$this->levels[$name]->loadChunk($tile["x"] >> 4, $tile["z"] >> 4);
$nbt = new NBTTag_Compound(false, array());
$nbt = new NBT\Tag\Compound(false, array());
foreach($tile as $index => $data){
switch($index){
case "Items":
$tag = new NBTTag_List("Items", array());
$tag->setTagType(NBTTag::TAG_Compound);
$tag = new NBT\Tag\Enum("Items", array());
$tag->setTagType(NBT\TAG_Compound);
foreach($data as $slot => $fields){
$tag[(int) $slot] = new NBTTag_Compound(false, array(
"Count" => new NBTTag_Byte("Count", $fields["Count"]),
"Slot" => new NBTTag_Short("Slot", $fields["Slot"]),
"Damage" => new NBTTag_Short("Damage", $fields["Damage"]),
"id" => new NBTTag_String("id", $fields["id"])
$tag[(int) $slot] = new NBT\Tag\Compound(false, array(
"Count" => new NBT\Tag\Byte("Count", $fields["Count"]),
"Slot" => new NBT\Tag\Short("Slot", $fields["Slot"]),
"Damage" => new NBT\Tag\Short("Damage", $fields["Damage"]),
"id" => new NBT\Tag\String("id", $fields["id"])
));
}
$nbt["Items"] = $tag;
@@ -220,7 +214,7 @@ class LevelAPI{
case "Text2":
case "Text3":
case "Text4":
$nbt[$index] = new NBTTag_String($index, $data);
$nbt[$index] = new NBT\Tag\String($index, $data);
break;
case "x":
@@ -228,25 +222,25 @@ class LevelAPI{
case "z":
case "pairx":
case "pairz":
$nbt[$index] = new NBTTag_Int($index, $data);
$nbt[$index] = new NBT\Tag\Int($index, $data);
break;
case "BurnTime":
case "CookTime":
case "MaxTime":
$nbt[$index] = new NBTTag_Short($index, $data);
$nbt[$index] = new NBT\Tag\Short($index, $data);
break;
}
}
switch($tile["id"]){
case Tile::FURNACE:
new FurnaceTile($this->levels[$name], $nbt);
case Tile\Tile::FURNACE:
new Tile\Furnace($this->levels[$name], $nbt);
break;
case Tile::CHEST:
new ChestTile($this->levels[$name], $nbt);
case Tile\Tile::CHEST:
new Tile\Chest($this->levels[$name], $nbt);
break;
case Tile::SIGN:
new SignTile($this->levels[$name], $nbt);
case Tile\Tile::SIGN:
new Tile\Sign($this->levels[$name], $nbt);
break;
}
}
@@ -255,7 +249,7 @@ class LevelAPI{
}
foreach($blockUpdates->getAll() as $bupdate){
$this->server->api->block->scheduleBlockUpdate(new Position((int) $bupdate["x"],(int) $bupdate["y"],(int) $bupdate["z"], $this->levels[$name]), (float) $bupdate["delay"], (int) $bupdate["type"]);
$this->server->api->block->scheduleBlockUpdate(new Level\Position((int) $bupdate["x"],(int) $bupdate["y"],(int) $bupdate["z"], $this->levels[$name]), (float) $bupdate["delay"], (int) $bupdate["type"]);
}
return true;
}

File diff suppressed because it is too large Load Diff

View File

@@ -18,6 +18,8 @@
*
*
*/
namespace PocketMine;
class PlayerAPI{
private $server;
@@ -50,7 +52,7 @@ class PlayerAPI{
$result = $this->server->preparedSQL->selectPlayersToHeal->execute();
if($result !== false){
while(($player = $result->fetchArray()) !== false){
if(($player = Entity::get($player["EID"])) !== false){
if(($player = Entity\Entity::get($player["EID"])) !== false){
if($player->getHealth() <= 0){
continue;
}
@@ -63,8 +65,8 @@ class PlayerAPI{
break;
case "player.death":
if(is_numeric($data["cause"])){
$e = Entity::get($data["cause"]);
if($e instanceof Entity){
$e = Entity\Entity::get($data["cause"]);
if($e instanceof Entity\Entity){
switch($e->class){
case ENTITY_PLAYER:
$message = " was killed by ".$e->name;
@@ -137,19 +139,19 @@ class PlayerAPI{
$target = $issuer;
}
if(!($target instanceof Player) and !($target instanceof Level)){
if(!($target instanceof Player) and !($target instanceof Level\Level)){
$output .= "That player cannot be found.\n";
break;
}
if(count($params) === 3){
if($target instanceof Level){
$spawn = new Vector3(floatval(array_shift($params)), floatval(array_shift($params)), floatval(array_shift($params)));
$spawn = new Math\Vector3(floatval(array_shift($params)), floatval(array_shift($params)), floatval(array_shift($params)));
}else{
$spawn = new Position(floatval(array_shift($params)), floatval(array_shift($params)), floatval(array_shift($params)), $issuer->level);
$spawn = new Level\Position(floatval(array_shift($params)), floatval(array_shift($params)), floatval(array_shift($params)), $issuer->level);
}
}else{
$spawn = new Position($issuer->entity->x, $issuer->entity->y, $issuer->entity->z, $issuer->entity->level);
$spawn = new Level\Position($issuer->entity->x, $issuer->entity->y, $issuer->entity->z, $issuer->entity->level);
}
$target->setSpawn($spawn);
@@ -303,7 +305,7 @@ class PlayerAPI{
}
}
$player = Player::get($target);
if(($player instanceof Player) and ($player->entity instanceof Entity)){
if($player instanceof Player and $player->spawned === true){
$target = $player->getUsername();
$origin = Player::get($name);
if($origin instanceof Player){
@@ -316,12 +318,12 @@ class PlayerAPI{
public function tppos(&$name, &$x, &$y, &$z){
$player = Player::get($name);
if(($player instanceof Player) and ($player->entity instanceof Entity)){
if($player instanceof Player and $player->spawned === true){
$name = $player->getUsername();
$x = $x{0} === "~" ? $player->entity->x + floatval(substr($x, 1)):floatval($x);
$y = $y{0} === "~" ? $player->entity->y + floatval(substr($y, 1)):floatval($y);
$z = $z{0} === "~" ? $player->entity->z + floatval(substr($z, 1)):floatval($z);
$player->teleport(new Vector3($x, $y, $z));
$player->teleport(new Math\Vector3($x, $y, $z));
return true;
}
return false;

View File

@@ -19,13 +19,15 @@
*
*/
class PluginAPI extends stdClass{
namespace PocketMine;
class PluginAPI extends \stdClass{
private $server;
private $plugins = array();
private $randomNonce;
public function __construct(){
$this->server = ServerAPI::request();
$this->randomNonce = Utils::getRandomBytes(16, false);
$this->randomNonce = Utils\Utils::getRandomBytes(16, false);
$this->server->api->console->register("plugins", "", array($this, "commandHandler"));
$this->server->api->console->register("version", "", array($this, "commandHandler"));
$this->server->api->ban->cmdWhitelist("version");
@@ -42,7 +44,7 @@ class PluginAPI extends stdClass{
$output = $output === "Plugins: " ? "No plugins installed.\n" : substr($output, 0, -2)."\n";
break;
case "version":
$output = "PocketMine-MP ".MAJOR_VERSION."".CODENAME."」 API #".CURRENT_API_VERSION." for Minecraft: PE ".CURRENT_MINECRAFT_VERSION." protocol #".ProtocolInfo::CURRENT_PROTOCOL;
$output = "PocketMine-MP ".VERSION."".CODENAME."」 API #".API_VERSION." for Minecraft: PE ".MINECRAFT_VERSION." protocol #".Network\Protocol\Info::CURRENT_PROTOCOL;
if(GIT_COMMIT !== str_repeat("00", 20)){
$output .= " (git ".GIT_COMMIT.")";
}
@@ -77,7 +79,7 @@ class PluginAPI extends stdClass{
return false;
}
if(strtolower(substr($file, -3)) === "pmf"){
$pmf = new PMFPlugin($file);
$pmf = new PMF\Plugin($file);
$info = $pmf->getPluginInfo();
}else{
$content = file_get_contents($file);
@@ -111,7 +113,7 @@ class PluginAPI extends stdClass{
console("[ERROR] Failed parsing of ".basename($file));
return false;
}
console("[INFO] Loading plugin \"".TextFormat::GREEN.$info["name"].TextFormat::RESET."\" ".TextFormat::AQUA.$info["version"].TextFormat::RESET." by ".TextFormat::AQUA.$info["author"].TextFormat::RESET);
console("[INFO] Loading plugin \"".Utils\TextFormat::GREEN.$info["name"].Utils\TextFormat::RESET."\" ".Utils\TextFormat::AQUA.$info["version"].Utils\TextFormat::RESET." by ".Utils\TextFormat::AQUA.$info["author"].Utils\TextFormat::RESET);
if($info["class"] !== "none" and class_exists($info["class"])){
console("[ERROR] Failed loading plugin: class already exists");
return false;
@@ -123,8 +125,8 @@ class PluginAPI extends stdClass{
$className = $info["class"];
$apiversion = array_map("intval", explode(",", (string) $info["apiversion"]));
if(!in_array((string) CURRENT_API_VERSION, $apiversion)){
console("[WARNING] Plugin \"".$info["name"]."\" may not be compatible with the API (".$info["apiversion"]." != ".CURRENT_API_VERSION.")! It can crash or corrupt the server!");
if(!in_array(API_VERSION, $apiversion)){
console("[WARNING] Plugin \"".$info["name"]."\" may not be compatible with the API (".$info["apiversion"]." != ".API_VERSION.")! It can crash or corrupt the server!");
}
$identifier = $this->getIdentifier($info["name"], $info["author"]);
@@ -167,7 +169,7 @@ class PluginAPI extends stdClass{
}
public function pluginsPath(){
$path = join(DIRECTORY_SEPARATOR, array(DATA_PATH."plugins", ""));
$path = join(DIRECTORY_SEPARATOR, array(DATA."plugins", ""));
@mkdir($path);
return $path;
}
@@ -191,7 +193,7 @@ class PluginAPI extends stdClass{
return false;
}
$path = $this->configPath($plugin);
$cnf = new Config($path."config.yml", Config::YAML, $default);
$cnf = new Utils\Config($path."config.yml", Utils\Config::YAML, $default);
$cnf->save();
return $path;
}

View File

@@ -19,7 +19,9 @@
*
*/
class MainServer{
namespace PocketMine;
class Server{
public $tCnt;
public $serverID, $interface, $database, $version, $invisible, $tickMeasure, $preparedSQL, $spawn, $whitelist, $seed, $stop, $gamemode, $difficulty, $name, $maxClients, $eidCnt, $custom, $description, $motd, $port, $saveEnabled;
private $serverip, $evCnt, $handCnt, $events, $eventsID, $handlers, $serverType, $lastTick, $doTick, $ticks, $memoryStats, $schedule, $asyncThread, $async = array(), $asyncID = 0;
@@ -30,14 +32,14 @@ class MainServer{
public $api;
private function load(){
$this->version = new VersionString();
/*if(defined("DEBUG") and DEBUG >= 0){
$this->version = new Utils\VersionString();
if(defined("DEBUG") and DEBUG >= 0){
@cli_set_process_title("PocketMine-MP ".MAJOR_VERSION);
}*/
}
console("[INFO] Starting Minecraft PE server on ".($this->serverip === "0.0.0.0" ? "*":$this->serverip).":".$this->port);
define("BOOTUP_RANDOM", Utils::getRandomBytes(16));
$this->serverID = $this->serverID === false ? Utils::readLong(substr(Utils::getUniqueID(true, $this->serverip . $this->port), 8)):$this->serverID;
$this->seed = $this->seed === false ? Utils::readInt(Utils::getRandomBytes(4, false)):$this->seed;
define("BOOTUP_RANDOM", Utils\Utils::getRandomBytes(16));
$this->serverID = $this->serverID === false ? Utils\Utils::readLong(substr(Utils\Utils::getUniqueID(true, $this->serverip . $this->port), 8)):$this->serverID;
$this->seed = $this->seed === false ? Utils\Utils::readInt(Utils\Utils::getRandomBytes(4, false)):$this->seed;
$this->startDatabase();
$this->api = false;
$this->tCnt = 1;
@@ -60,11 +62,11 @@ class MainServer{
$this->whitelist = false;
$this->tickMeasure = array_fill(0, 40, 0);
$this->setType("normal");
$this->interface = new MinecraftInterface("255.255.255.255", $this->port, $this->serverip);
$this->interface = new Network\Handler("255.255.255.255", $this->port, $this->serverip);
$this->stop = false;
$this->ticks = 0;
if(!defined("NO_THREADS")){
$this->asyncThread = new AsyncMultipleQueue();
$this->asyncThread = new \AsyncMultipleQueue();
}
}
@@ -91,14 +93,14 @@ class MainServer{
public function titleTick(){
$time = microtime(true);
if(defined("DEBUG") and DEBUG >= 0 and ENABLE_ANSI === true){
echo "\x1b]0;PocketMine-MP ".MAJOR_VERSION." | Online ". count(Player::$list)."/".$this->maxClients." | RAM ".round((memory_get_usage() / 1024) / 1024, 2)."MB | U ".round(($this->interface->bandwidth[1] / max(1, $time - $this->interface->bandwidth[2])) / 1024, 2)." D ".round(($this->interface->bandwidth[0] / max(1, $time - $this->interface->bandwidth[2])) / 1024, 2)." kB/s | TPS ".$this->getTPS()."\x07";
if(defined("DEBUG") and DEBUG >= 0 and ANSI === true){
echo "\x1b]0;PocketMine-MP ".VERSION." | Online ". count(Player::$list)."/".$this->maxClients." | RAM ".round((memory_get_usage() / 1024) / 1024, 2)."MB | U ".round(($this->interface->bandwidth[1] / max(1, $time - $this->interface->bandwidth[2])) / 1024, 2)." D ".round(($this->interface->bandwidth[0] / max(1, $time - $this->interface->bandwidth[2])) / 1024, 2)." kB/s | TPS ".$this->getTPS()."\x07";
}
$this->interface->bandwidth = array(0, 0, $time);
}
public function loadEvents(){
if(ENABLE_ANSI === true){
if(ANSI === true){
$this->schedule(30, array($this, "titleTick"), array(), true);
}
$this->schedule(20 * 15, array($this, "checkTicks"), array(), true);
@@ -123,9 +125,9 @@ class MainServer{
}
public function startDatabase(){
$this->preparedSQL = new stdClass();
$this->preparedSQL->entity = new stdClass();
$this->database = new SQLite3(":memory:", SQLITE3_OPEN_READWRITE | SQLITE3_OPEN_CREATE);
$this->preparedSQL = new \stdClass();
$this->preparedSQL->entity = new \stdClass();
$this->database = new \SQLite3(":memory:", SQLITE3_OPEN_READWRITE | SQLITE3_OPEN_CREATE);
$this->query("PRAGMA journal_mode = OFF;");
$this->query("PRAGMA encoding = \"UTF-8\";");
$this->query("PRAGMA secure_delete = OFF;");
@@ -141,7 +143,7 @@ class MainServer{
public function query($sql, $fetch = false){
$result = $this->database->query($sql) or console("[ERROR] [SQL Error] ".$this->database->lastErrorMsg().". Query: ".$sql, true, true, 0);
if($fetch === true and ($result instanceof SQLite3Result)){
if($fetch === true and ($result instanceof \SQLite3Result)){
$result = $result->fetchArray(SQLITE3_ASSOC);
}
return $result;
@@ -152,7 +154,7 @@ class MainServer{
$info["tps"] = $this->getTPS();
$info["memory_usage"] = round((memory_get_usage() / 1024) / 1024, 2)."MB";
$info["memory_peak_usage"] = round((memory_get_peak_usage() / 1024) / 1024, 2)."MB";
$info["entities"] = count(Entity::$list);
$info["entities"] = count(Entity\Entity::$list);
$info["players"] = count(Player::$list);
$info["events"] = count($this->eventsID);
$info["handlers"] = $this->query("SELECT count(ID) as count FROM handlers;", true);
@@ -211,25 +213,25 @@ class MainServer{
$type = (int) $type;
switch($type){
case ASYNC_CURL_GET:
$d .= Utils::writeShort(strlen($data["url"])).$data["url"].(isset($data["timeout"]) ? Utils::writeShort($data["timeout"]) : Utils::writeShort(10));
$d .= Utils\Utils::writeShort(strlen($data["url"])).$data["url"].(isset($data["timeout"]) ? Utils\Utils::writeShort($data["timeout"]) : Utils\Utils::writeShort(10));
break;
case ASYNC_CURL_POST:
$d .= Utils::writeShort(strlen($data["url"])).$data["url"].(isset($data["timeout"]) ? Utils::writeShort($data["timeout"]) : Utils::writeShort(10));
$d .= Utils::writeShort(count($data["data"]));
$d .= Utils\Utils::writeShort(strlen($data["url"])).$data["url"].(isset($data["timeout"]) ? Utils\Utils::writeShort($data["timeout"]) : Utils\Utils::writeShort(10));
$d .= Utils\Utils::writeShort(count($data["data"]));
foreach($data["data"] as $key => $value){
$d .= Utils::writeShort(strlen($key)).$key . Utils::writeInt(strlen($value)).$value;
$d .= Utils\Utils::writeShort(strlen($key)).$key . Utils\Utils::writeInt(strlen($value)).$value;
}
break;
case ASYNC_FUNCTION:
$params = serialize($data["arguments"]);
$d .= Utils::writeShort(strlen($data["function"])).$data["function"] . Utils::writeInt(strlen($params)) . $params;
$d .= Utils\Utils::writeShort(strlen($data["function"])).$data["function"] . Utils\Utils::writeInt(strlen($params)) . $params;
break;
default:
return false;
}
$ID = $this->asyncID++;
$this->async[$ID] = $callable;
$this->asyncThread->input .= Utils::writeInt($ID).Utils::writeShort($type).$d;
$this->asyncThread->input .= Utils\Utils::writeInt($ID).Utils\Utils::writeShort($type).$d;
return $ID;
}
@@ -239,21 +241,21 @@ class MainServer{
}
if(isset($this->asyncThread->output{5})){
$offset = 0;
$ID = Utils::readInt(substr($this->asyncThread->output, $offset, 4));
$ID = Utils\Utils::readInt(substr($this->asyncThread->output, $offset, 4));
$offset += 4;
$type = Utils::readShort(substr($this->asyncThread->output, $offset, 2));
$type = Utils\Utils::readShort(substr($this->asyncThread->output, $offset, 2));
$offset += 2;
$data = array();
switch($type){
case ASYNC_CURL_GET:
case ASYNC_CURL_POST:
$len = Utils::readInt(substr($this->asyncThread->output, $offset, 4));
$len = Utils\Utils::readInt(substr($this->asyncThread->output, $offset, 4));
$offset += 4;
$data["result"] = substr($this->asyncThread->output, $offset, $len);
$offset += $len;
break;
case ASYNC_FUNCTION:
$len = Utils::readInt(substr($this->asyncThread->output, $offset, 4));
$len = Utils\Utils::readInt(substr($this->asyncThread->output, $offset, 4));
$offset += 4;
$data["result"] = unserialize(substr($this->asyncThread->output, $offset, $len));
$offset += $len;
@@ -307,7 +309,7 @@ class MainServer{
$this->preparedSQL->selectHandlers->bindValue(":name", $event, SQLITE3_TEXT);
$handlers = $this->preparedSQL->selectHandlers->execute();
$result = null;
if($handlers instanceof SQLite3Result){
if($handlers instanceof \SQLite3Result){
$call = array();
while(($hn = $handlers->fetchArray(SQLITE3_ASSOC)) !== false){
$call[(int) $hn["ID"]] = true;
@@ -424,14 +426,13 @@ class MainServer{
$dump .= "$line\r\n";
}
$dump .= "\r\n\r\n";
$version = new VersionString();
$dump .= "PocketMine-MP version: ".$version." #".$version->getNumber()." [Protocol ".ProtocolInfo::CURRENT_PROTOCOL."; API ".CURRENT_API_VERSION."]\r\n";
$version = new Utils\VersionString();
$dump .= "PocketMine-MP version: ".$version." #".$version->getNumber()." [Protocol ".Network\Protocol\Info::CURRENT_PROTOCOL."; API ".API_VERSION."]\r\n";
$dump .= "Git commit: ".GIT_COMMIT."\r\n";
$dump .= "Source SHA1 sum: ".SOURCE_SHA1SUM."\r\n";
$dump .= "uname -a: ".php_uname("a")."\r\n";
$dump .= "PHP Version: " .phpversion()."\r\n";
$dump .= "Zend version: ".zend_version()."\r\n";
$dump .= "OS : " .PHP_OS.", ".Utils::getOS()."\r\n";
$dump .= "OS : " .PHP_OS.", ".Utils\Utils::getOS()."\r\n";
$dump .= "Debug Info: ".var_export($this->debugInfo(false), true)."\r\n\r\n\r\n";
global $arguments;
$dump .= "Parameters: ".var_export($arguments, true)."\r\n\r\n\r\n";
@@ -483,17 +484,17 @@ class MainServer{
//return $ip . ":" . $port;
}
public function packetHandler(Packet $packet){
public function packetHandler(Network\Packet $packet){
$data =& $packet;
$CID = MainServer::clientID($packet->ip, $packet->port);
$CID = Server::clientID($packet->ip, $packet->port);
if(isset(Player::$list[$CID])){
Player::$list[$CID]->handlePacket($packet);
}else{
switch($packet->pid()){
case RakNetInfo::UNCONNECTED_PING:
case RakNetInfo::UNCONNECTED_PING_OPEN_CONNECTIONS:
case Network\RakNet\Info::UNCONNECTED_PING:
case Network\RakNet\Info::UNCONNECTED_PING_OPEN_CONNECTIONS:
if($this->invisible === true){
$pk = new RakNetPacket(RakNetInfo::UNCONNECTED_PONG);
$pk = new Network\RakNet\Packet(Network\RakNet\Info::UNCONNECTED_PONG);
$pk->pingID = $packet->pingID;
$pk->serverID = $this->serverID;
$pk->serverType = $this->serverType;
@@ -511,7 +512,7 @@ class MainServer{
}
$txt = substr($this->description, $this->custom["times_".$CID], $ln);
$txt .= substr($this->description, 0, $ln - strlen($txt));
$pk = new RakNetPacket(RakNetInfo::UNCONNECTED_PONG);
$pk = new Network\RakNet\Packet(Network\RakNet\Info::UNCONNECTED_PONG);
$pk->pingID = $packet->pingID;
$pk->serverID = $this->serverID;
$pk->serverType = $this->serverType . $this->name . " [".count(Player::$list)."/".$this->maxClients."] ".$txt;
@@ -520,16 +521,16 @@ class MainServer{
$this->send($pk);
$this->custom["times_".$CID] = ($this->custom["times_".$CID] + 1) % strlen($this->description);
break;
case RakNetInfo::OPEN_CONNECTION_REQUEST_1:
if($packet->structure !== RakNetInfo::STRUCTURE){
case Network\RakNet\Info::OPEN_CONNECTION_REQUEST_1:
if($packet->structure !== Network\RakNet\Info::STRUCTURE){
console("[DEBUG] Incorrect structure #".$packet->structure." from ".$packet->ip.":".$packet->port, true, true, 2);
$pk = new RakNetPacket(RakNetInfo::INCOMPATIBLE_PROTOCOL_VERSION);
$pk = new Network\RakNet\Packet(Network\RakNet\Info::INCOMPATIBLE_PROTOCOL_VERSION);
$pk->serverID = $this->serverID;
$pk->ip = $packet->ip;
$pk->port = $packet->port;
$this->send($pk);
}else{
$pk = new RakNetPacket(RakNetInfo::OPEN_CONNECTION_REPLY_1);
$pk = new Network\RakNet\Packet(Network\RakNet\Info::OPEN_CONNECTION_REPLY_1);
$pk->serverID = $this->serverID;
$pk->mtuSize = strlen($packet->buffer);
$pk->ip = $packet->ip;
@@ -537,13 +538,13 @@ class MainServer{
$this->send($pk);
}
break;
case RakNetInfo::OPEN_CONNECTION_REQUEST_2:
case Network\RakNet\Info::OPEN_CONNECTION_REQUEST_2:
if($this->invisible === true){
break;
}
new Player($packet->clientID, $packet->ip, $packet->port, $packet->mtuSize); //New Session!
$pk = new RakNetPacket(RakNetInfo::OPEN_CONNECTION_REPLY_2);
$pk = new Network\RakNet\Packet(Network\RakNet\Info::OPEN_CONNECTION_REPLY_2);
$pk->serverID = $this->serverID;
$pk->serverPort = $this->port;
$pk->mtuSize = $packet->mtuSize;
@@ -555,7 +556,7 @@ class MainServer{
}
}
public function send(Packet $packet){
public function send(Network\Packet $packet){
return $this->interface->writePacket($packet);
}
@@ -563,7 +564,7 @@ class MainServer{
$lastLoop = 0;
while($this->stop === false){
$packet = $this->interface->readPacket();
if($packet instanceof Packet){
if($packet instanceof Network\Packet){
$this->packetHandler($packet);
$lastLoop = 0;
}
@@ -624,7 +625,7 @@ class MainServer{
$actions = $this->preparedSQL->selectActions->execute();
$actionCount = 0;
if($actions instanceof SQLite3Result){
if($actions instanceof \SQLite3Result){
while(($action = $actions->fetchArray(SQLITE3_ASSOC)) !== false){
$cid = $action["ID"];
$this->preparedSQL->updateAction->reset();

View File

@@ -19,6 +19,8 @@
*
*/
namespace PocketMine;
class ServerAPI{
public $restart = false;
private static $serverRequest = false;
@@ -74,7 +76,7 @@ class ServerAPI{
public $player;
/**
* @return MainServer
* @return Server
*/
public static function request(){
return self::$serverRequest;
@@ -90,22 +92,22 @@ class ServerAPI{
}
public function load(){
@mkdir(DATA_PATH."players/", 0755);
@mkdir(DATA_PATH."worlds/", 0755);
@mkdir(DATA_PATH."plugins/", 0755);
@mkdir(DATA."players/", 0755);
@mkdir(DATA."worlds/", 0755);
@mkdir(DATA."plugins/", 0755);
//Init all the events
foreach(get_declared_classes() as $class){
if(is_subclass_of($class, "BaseEvent") and property_exists($class, "handlers") and property_exists($class, "handlerPriority")){
if(is_subclass_of($class, "Event") and property_exists($class, "handlers") and property_exists($class, "handlerPriority")){
$class::unregisterAll();
}
}
$version = new VersionString();
console("[INFO] Starting Minecraft PE server version ".TextFormat::AQUA.CURRENT_MINECRAFT_VERSION);
$version = new Utils\VersionString();
console("[INFO] Starting Minecraft PE server version ".Utils\TextFormat::AQUA.MINECRAFT_VERSION);
console("[INFO] Loading properties...");
$this->config = new Config(DATA_PATH . "server.properties", Config::PROPERTIES, array(
$this->config = new Utils\Config(DATA . "server.properties", Utils\Config::PROPERTIES, array(
"server-name" => "Minecraft: PE Server",
"description" => "Server made using PocketMine-MP",
"motd" => "Welcome @player to this server!",
@@ -132,7 +134,7 @@ class ServerAPI{
"level-type" => "DEFAULT",
"enable-query" => true,
"enable-rcon" => false,
"rcon.password" => substr(base64_encode(Utils::getRandomBytes(20, false)), 3, 10),
"rcon.password" => substr(base64_encode(Utils\Utils::getRandomBytes(20, false)), 3, 10),
"auto-save" => true,
));
@@ -147,52 +149,52 @@ class ServerAPI{
}
if($this->getProperty("upnp-forwarding") == true){
console("[INFO] [UPnP] Trying to port forward...");
UPnP_PortForward($this->getProperty("server-port"));
Network\UPnP\PortForward($this->getProperty("server-port"));
}
$this->server = new MainServer($this->getProperty("server-name"), $this->getProperty("gamemode"), ($seed = $this->getProperty("level-seed")) != "" ? (int) $seed:false, $this->getProperty("server-port"), ($ip = $this->getProperty("server-ip")) != "" ? $ip:"0.0.0.0");
$this->server = new Server($this->getProperty("server-name"), $this->getProperty("gamemode"), ($seed = $this->getProperty("level-seed")) != "" ? (int) $seed:false, $this->getProperty("server-port"), ($ip = $this->getProperty("server-ip")) != "" ? $ip:"0.0.0.0");
$this->server->api = $this;
self::$serverRequest = $this->server;
console("[INFO] This server is running PocketMine-MP version ".($version->isDev() ? TextFormat::YELLOW:"").MAJOR_VERSION.TextFormat::RESET." \"".CODENAME."\" (MCPE: ".CURRENT_MINECRAFT_VERSION.") (API ".CURRENT_API_VERSION.")", true, true, 0);
console("[INFO] This server is running PocketMine-MP version ".($version->isDev() ? Utils\TextFormat::YELLOW:"").VERSION.Utils\TextFormat::RESET." \"".CODENAME."\" (MCPE: ".MINECRAFT_VERSION.") (API ".API_VERSION.")", true, true, 0);
console("[INFO] PocketMine-MP is distributed under the LGPL License", true, true, 0);
if($this->getProperty("last-update") === false or ($this->getProperty("last-update") + 3600) < time()){
console("[INFO] Checking for new server version");
console("[INFO] Last check: ".TextFormat::AQUA.date("Y-m-d H:i:s", $this->getProperty("last-update"))."\x1b[0m");
console("[INFO] Last check: ".Utils\TextFormat::AQUA.date("Y-m-d H:i:s", $this->getProperty("last-update"))."\x1b[0m");
if($this->server->version->isDev()){
$info = json_decode(Utils::curl_get("https://api.github.com/repos/PocketMine/PocketMine-MP/commits"), true);
$info = json_decode(Utils\Utils::curl_get("https://api.github.com/repos/PocketMine/PocketMine-MP/commits"), true);
if($info === false or !isset($info[0])){
console("[ERROR] Github API error");
}else{
$last = new DateTime($info[0]["commit"]["committer"]["date"]);
$last = new \DateTime($info[0]["commit"]["committer"]["date"]);
$last = $last->getTimestamp();
if($last >= $this->getProperty("last-update") and $this->getProperty("last-update") !== false and GIT_COMMIT != $info[0]["sha"]){
console("[NOTICE] ".TextFormat::YELLOW."A new DEVELOPMENT version of PocketMine-MP has been released!");
console("[NOTICE] ".TextFormat::YELLOW."Commit \"".$info[0]["commit"]["message"]."\" [".substr($info[0]["sha"], 0, 10)."] by ".$info[0]["commit"]["committer"]["name"]);
console("[NOTICE] ".TextFormat::YELLOW."Get it at PocketMine.net or at https://github.com/PocketMine/PocketMine-MP/archive/".$info[0]["sha"].".zip");
console("[NOTICE] ".Utils\TextFormat::YELLOW."A new DEVELOPMENT version of PocketMine-MP has been released!");
console("[NOTICE] ".Utils\TextFormat::YELLOW."Commit \"".$info[0]["commit"]["message"]."\" [".substr($info[0]["sha"], 0, 10)."] by ".$info[0]["commit"]["committer"]["name"]);
console("[NOTICE] ".Utils\TextFormat::YELLOW."Get it at PocketMine.net or at https://github.com/PocketMine/PocketMine-MP/archive/".$info[0]["sha"].".zip");
console("[NOTICE] This message will dissapear after issuing the command \"/update-done\"");
}else{
$this->setProperty("last-update", time());
console("[INFO] ".TextFormat::AQUA."This is the latest DEVELOPMENT version");
console("[INFO] ".Utils\TextFormat::AQUA."This is the latest DEVELOPMENT version");
}
}
}else{
$info = json_decode(Utils::curl_get("https://api.github.com/repos/PocketMine/PocketMine-MP/tags"), true);
$info = json_decode(Utils\Utils::curl_get("https://api.github.com/repos/PocketMine/PocketMine-MP/tags"), true);
if($info === false or !isset($info[0])){
console("[ERROR] Github API error");
}else{
$newest = new VersionString(MAJOR_VERSION);
$newest = new Utils\VersionString(VERSION);
$newestN = $newest->getNumber();
$update = new VersionString($info[0]["name"]);
$update = new Utils\VersionString($info[0]["name"]);
$updateN = $update->getNumber();
if($updateN > $newestN){
console("[NOTICE] ".TextFormat::GREEN."A new STABLE version of PocketMine-MP has been released!");
console("[NOTICE] ".TextFormat::GREEN."Version \"".$info[0]["name"]."\" #".$updateN);
console("[NOTICE] ".Utils\TextFormat::GREEN."A new STABLE version of PocketMine-MP has been released!");
console("[NOTICE] ".Utils\TextFormat::GREEN."Version \"".$info[0]["name"]."\" #".$updateN);
console("[NOTICE] Get it at PocketMine.net or at ".$info[0]["zipball_url"]);
console("[NOTICE] This message will dissapear as soon as you update");
}else{
$this->setProperty("last-update", time());
console("[INFO] ".TextFormat::AQUA."This is the latest STABLE version");
console("[INFO] ".Utils\TextFormat::AQUA."This is the latest STABLE version");
}
}
}
@@ -200,14 +202,13 @@ class ServerAPI{
$this->loadProperties();
$this->loadAPI("console", "ConsoleAPI");
$this->loadAPI("level", "LevelAPI");
$this->loadAPI("block", "BlockAPI");
$this->loadAPI("chat", "ChatAPI");
$this->loadAPI("ban", "BanAPI");
$this->loadAPI("player", "PlayerAPI");
$this->loadAPI("time", "TimeAPI");
$this->apiList[] = $this->console = new ConsoleAPI();
$this->apiList[] = $this->level = new LevelAPI();
$this->apiList[] = $this->block = new BlockAPI();
$this->apiList[] = $this->chat = new ChatAPI();
$this->apiList[] = $this->ban = new BanAPI();
$this->apiList[] = $this->player = new PlayerAPI();
$this->apiList[] = $this->time = new TimeAPI();
foreach($this->apiList as $ob){
if(is_callable(array($ob, "init"))){
@@ -215,26 +216,25 @@ class ServerAPI{
}
}
$this->loadAPI("plugin", "PluginAPI"); //fix :(
$this->plugin->init();
$this->apiList[] = $this->plugin = new PluginAPI();
}
public function checkTickUpdates(){
//Update entities that need update
if(count(Entity::$needUpdate) > 0){
foreach(Entity::$needUpdate as $id => $entity){
if(count(Entity\Entity::$needUpdate) > 0){
foreach(EntityEntity::$needUpdate as $id => $entity){
if($entity->onUpdate() === false){
unset(Entity::$needUpdate[$id]);
unset(Entity\Entity::$needUpdate[$id]);
}
}
}
//Update tiles that need update
if(count(Tile::$needUpdate) > 0){
foreach(Tile::$needUpdate as $id => $tile){
if(count(Tile\Tile::$needUpdate) > 0){
foreach(Tile\Tile::$needUpdate as $id => $tile){
if($tile->onUpdate() === false){
unset(Tile::$needUpdate[$id]);
unset(Tile\Tile::$needUpdate[$id]);
}
}
}
@@ -243,7 +243,7 @@ class ServerAPI{
public function async(callable $callable, $params = array(), $remove = false){
$cnt = $this->asyncCnt++;
$this->asyncCalls[$cnt] = new Async($callable, $params);
$this->asyncCalls[$cnt] = new \Async($callable, $params);
return $remove === true ? $this->getAsync($cnt):$cnt;
}
@@ -272,13 +272,13 @@ class ServerAPI{
"data" => array(
"serverid" => $this->server->serverID,
"port" => $this->server->port,
"os" => Utils::getOS(),
"os" => Utils\Utils::getOS(),
"memory_total" => $this->getProperty("memory-limit"),
"memory_usage" => memory_get_usage(true),
"php_version" => PHP_VERSION,
"version" => MAJOR_VERSION,
"mc_version" => CURRENT_MINECRAFT_VERSION,
"protocol" => ProtocolInfo::CURRENT_PROTOCOL,
"version" => VERSION,
"mc_version" => MINECRAFT_VERSION,
"protocol" => Network\Protocol\Info::CURRENT_PROTOCOL,
"online" => count(Player::$list),
"max" => $this->server->maxClients,
"plugins" => $plist,
@@ -308,7 +308,7 @@ class ServerAPI{
$this->setProperty("memory-limit", "128M");
}
if($this->server instanceof MainServer){
if($this->server instanceof Server){
$this->server->setType($this->getProperty("server-type"));
$this->server->maxClients = $this->getProperty("max-players");
$this->server->description = $this->getProperty("description");
@@ -342,7 +342,7 @@ class ServerAPI{
break;
case "server-id":
if($v !== false){
$v = preg_match("/[^0-9\-]/", $v) > 0 ? Utils::readInt(substr(md5($v, true), 0, 4)):$v;
$v = preg_match("/[^0-9\-]/", $v) > 0 ? Utils\Utils::readInt(substr(md5($v, true), 0, 4)):$v;
}
break;
}
@@ -354,7 +354,7 @@ class ServerAPI{
}
public function init(){
if(!(self::$serverRequest instanceof MainServer)){
if(!(self::$serverRequest instanceof Server)){
self::$serverRequest = $this->server;
}
@@ -366,24 +366,24 @@ class ServerAPI{
$this->server->schedule(18000, array($this, "autoSave"), array(), true);
}
if(!defined("NO_THREADS") and $this->getProperty("enable-rcon") === true){
$this->rcon = new RCON($this->getProperty("rcon.password", ""), $this->getProperty("rcon.port", $this->getProperty("server-port")), ($ip = $this->getProperty("server-ip")) != "" ? $ip:"0.0.0.0", $this->getProperty("rcon.threads", 1), $this->getProperty("rcon.clients-per-thread", 50));
$this->rcon = new Network\RCON\RCON($this->getProperty("rcon.password", ""), $this->getProperty("rcon.port", $this->getProperty("server-port")), ($ip = $this->getProperty("server-ip")) != "" ? $ip:"0.0.0.0", $this->getProperty("rcon.threads", 1), $this->getProperty("rcon.clients-per-thread", 50));
}
if($this->getProperty("enable-query") === true){
$this->query = new QueryHandler();
$this->query = new Network\Query\QueryHandler();
}
CraftingRecipes::init();
Recipes\Crafting::init();
$this->schedule(2, array($this, "checkTickUpdates"), array(), true);
$this->server->init();
unregister_tick_function(array($this->server, "tick"));
$this->console->__destruct();
if($this->rcon instanceof RCON){
if($this->rcon instanceof Network\RCON\RCON){
$this->rcon->stop();
}
$this->__destruct();
if($this->getProperty("upnp-forwarding") === true ){
console("[INFO] [UPnP] Removing port forward...");
UPnP_RemovePortForward($this->getProperty("server-port"));
Network\UPnP\RemovePortForward($this->getProperty("server-port"));
}
return $this->restart;
}
@@ -427,8 +427,11 @@ class ServerAPI{
}
public function getProperty($name, $default = false){
if(($v = arg($name)) !== false){ //Allow for command-line arguments
$v = getopt("", array("$name::"));
if(isset($v[$name]) !== false){ //Allow for command-line arguments
$v = $v[$name];
switch(strtolower(trim($v))){
case "":
case "on":
case "true":
case "yes":
@@ -453,14 +456,8 @@ class ServerAPI{
case "server-port":
case "debug":
case "difficulty":
case "time-per-second":
$v = (int) $v;
break;
case "server-id":
if($v !== false){
$v = preg_match("/[^0-9\-]/", $v) > 0 ? Utils::readInt(substr(md5($v, true), 0, 4)):$v;
}
break;
}
return $v;
}
@@ -478,28 +475,4 @@ class ServerAPI{
public function getList(){
return $this->apiList;
}
public function loadAPI($name, $class, $dir = false){
if(isset($this->$name)){
return false;
}elseif(!class_exists($class)){
$internal = false;
if($dir === false){
$internal = true;
$dir = FILE_PATH."src/API/";
}
$file = $dir.$class.".php";
if(!file_exists($file)){
console("[ERROR] API ".$name." [".$class."] in ".$dir." doesn't exist", true, true, 0);
return false;
}
require_once($file);
}else{
$internal = true;
}
$this->$name = new $class();
$this->apiList[] = $this->$name;
console("[".($internal === true ? "INTERNAL":"DEBUG")."] API \x1b[36m".$name."\x1b[0m [\x1b[30;1m".$class."\x1b[0m] loaded", true, true, ($internal === true ? 3:2));
}
}

View File

@@ -19,6 +19,8 @@
*
*/
namespace PocketMine;
class TimeAPI{
public static $phases = array(
"day" => 0,

View File

@@ -47,15 +47,15 @@ class BurningFurnaceBlock extends SolidBlock{
$t = $this->level->getTile($this);
$furnace = false;
if($t instanceof FurnaceTile){
if($t instanceof Furnace){
$furnace = $t;
}else{
$furnace = new FurnaceTile($this->level, new NBTTag_Compound(false, array(
"Items" => new NBTTag_List("Items", array()),
"id" => new NBTTag_String("id", Tile::FURNACE),
"x" => new NBTTag_Int("x", $this->x),
"y" => new NBTTag_Int("y", $this->y),
"z" =>new NBTTag_Int("z", $this->z)
$furnace = new Furnace($this->level, new NBT\Tag\Compound(false, array(
"Items" => new NBT\Tag\List("Items", array()),
"id" => new NBT\Tag\String("id", Tile::FURNACE),
"x" => new NBT\Tag\Int("x", $this->x),
"y" => new NBT\Tag\Int("y", $this->y),
"z" =>new NBT\Tag\Int("z", $this->z)
)));
}
@@ -93,8 +93,8 @@ class BurningFurnaceBlock extends SolidBlock{
$drops[] = array(FURNACE, 0, 1);
}
$t = $this->level->getTile($this);
if($t instanceof FurnaceTile){
for($s = 0; $s < FurnaceTile::SLOTS; ++$s){
if($t instanceof Furnace){
for($s = 0; $s < Furnace::SLOTS; ++$s){
$slot = $t->getSlot($s);
if($slot->getID() > AIR and $slot->getCount() > 0){
$drops[] = array($slot->getID(), $slot->getMetadata(), $slot->getCount());

View File

@@ -38,7 +38,7 @@ class CactusBlock extends TransparentBlock{
if($this->getSide(0)->getID() !== CACTUS){
if($this->meta == 0x0F){
for($y = 1; $y < 3; ++$y){
$b = $this->level->getBlock(new Vector3($this->x, $this->y + $y, $this->z));
$b = $this->level->getBlock(new Math\Vector3($this->x, $this->y + $y, $this->z));
if($b->getID() === AIR){
$this->level->setBlock($b, new CactusBlock(), true, false, true);
break;

View File

@@ -44,7 +44,7 @@ class ChestBlock extends TransparentBlock{
}
$c = $this->getSide($side);
if(($c instanceof ChestBlock) and $c->getMetadata() === $this->meta){
if((($tile = $this->level->getTile($c)) instanceof ChestTile) and !$tile->isPaired()){
if((($tile = $this->level->getTile($c)) instanceof Chest) and !$tile->isPaired()){
$chest = $tile;
break;
}
@@ -52,15 +52,15 @@ class ChestBlock extends TransparentBlock{
}
$this->level->setBlock($block, $this, true, false, true);
$tile = new ChestTile($this->level, new NBTTag_Compound(false, array(
"Items" => new NBTTag_List("Items", array()),
"id" => new NBTTag_String("id", Tile::CHEST),
"x" => new NBTTag_Int("x", $this->x),
"y" => new NBTTag_Int("y", $this->y),
"z" =>new NBTTag_Int("z", $this->z)
$tile = new Chest($this->level, new NBT\Tag\Compound(false, array(
"Items" => new NBT\Tag\List("Items", array()),
"id" => new NBT\Tag\String("id", Tile::CHEST),
"x" => new NBT\Tag\Int("x", $this->x),
"y" => new NBT\Tag\Int("y", $this->y),
"z" =>new NBT\Tag\Int("z", $this->z)
)));
if($chest instanceof ChestTile){
if($chest instanceof Chest){
$chest->pairWith($tile);
$tile->pairWith($chest);
}
@@ -69,7 +69,7 @@ class ChestBlock extends TransparentBlock{
public function onBreak(Item $item, Player $player){
$t = $this->level->getTile($this);
if($t instanceof ChestTile){
if($t instanceof Chest){
$t->unpair();
}
$this->level->setBlock($this, new AirBlock(), true, true, true);
@@ -84,15 +84,15 @@ class ChestBlock extends TransparentBlock{
$t = $this->level->getTile($this);
$chest = false;
if($t instanceof ChestTile){
if($t instanceof Chest){
$chest = $t;
}else{
$chest = new ChestTile($this->level, new NBTTag_Compound(false, array(
"Items" => new NBTTag_List("Items", array()),
"id" => new NBTTag_String("id", Tile::CHEST),
"x" => new NBTTag_Int("x", $this->x),
"y" => new NBTTag_Int("y", $this->y),
"z" =>new NBTTag_Int("z", $this->z)
$chest = new Chest($this->level, new NBT\Tag\Compound(false, array(
"Items" => new NBT\Tag\List("Items", array()),
"id" => new NBT\Tag\String("id", Tile::CHEST),
"x" => new NBT\Tag\Int("x", $this->x),
"y" => new NBT\Tag\Int("y", $this->y),
"z" =>new NBT\Tag\Int("z", $this->z)
)));
}
@@ -111,8 +111,8 @@ class ChestBlock extends TransparentBlock{
array($this->id, 0, 1),
);
$t = $this->level->getTile($this);
if($t instanceof ChestTile){
for($s = 0; $s < ChestTile::SLOTS; ++$s){
if($t instanceof Chest){
for($s = 0; $s < Chest::SLOTS; ++$s){
$slot = $t->getSlot($s);
if($slot->getID() > AIR and $slot->getCount() > 0){
$drops[] = array($slot->getID(), $slot->getMetadata(), $slot->getCount());

Some files were not shown because too many files have changed in this diff Show More