diff --git a/src/API/BanAPI.php b/src/API/BanAPI.php index 9353e9c01..d03075062 100644 --- a/src/API/BanAPI.php +++ b/src/API/BanAPI.php @@ -38,10 +38,10 @@ class BanAPI{ } public function init(){ - $this->whitelist = new Config(DATA_PATH."white-list.txt", CONFIG_LIST);//Open whitelist list file - $this->bannedIPs = new Config(DATA_PATH."banned-ips.txt", CONFIG_LIST);//Open Banned IPs list file - $this->banned = new Config(DATA_PATH."banned.txt", CONFIG_LIST);//Open Banned Usernames list file - $this->ops = new Config(DATA_PATH."ops.txt", CONFIG_LIST);//Open list of OPs + $this->whitelist = new Config(DATA_PATH."white-list.txt", Config::LIST);//Open whitelist list file + $this->bannedIPs = new Config(DATA_PATH."banned-ips.txt", Config::LIST);//Open Banned IPs list file + $this->banned = new Config(DATA_PATH."banned.txt", Config::LIST);//Open Banned Usernames list file + $this->ops = new Config(DATA_PATH."ops.txt", Config::LIST);//Open list of OPs $this->server->api->console->register("banip", " [IP|player]", array($this, "commandHandler")); $this->server->api->console->register("ban", " [username]", array($this, "commandHandler")); $this->server->api->console->register("kick", " [reason ...]", array($this, "commandHandler")); @@ -211,7 +211,7 @@ class BanAPI{ $output .= "Player \"$user\" added to white-list\n"; break; case "reload": - $this->whitelist = new Config(DATA_PATH."white-list.txt", CONFIG_LIST); + $this->whitelist = new Config(DATA_PATH."white-list.txt", Config::LIST); break; case "list": $output .= "White-list: ".implode(", ", $this->whitelist->getAll(true))."\n"; @@ -256,7 +256,7 @@ class BanAPI{ $output .= "IP \"$ip\" added to ban list\n"; break; case "reload": - $this->bannedIPs = new Config(DATA_PATH."banned-ips.txt", CONFIG_LIST); + $this->bannedIPs = new Config(DATA_PATH."banned-ips.txt", Config::LIST); break; case "list": $output .= "IP ban list: ".implode(", ", $this->bannedIPs->getAll(true))."\n"; @@ -294,7 +294,7 @@ class BanAPI{ $output .= "Player \"$user\" added to ban list\n"; break; case "reload": - $this->banned = new Config(DATA_PATH."banned.txt", CONFIG_LIST); + $this->banned = new Config(DATA_PATH."banned.txt", Config::LIST); break; case "list": $output .= "Ban list: ".implode(", ", $this->banned->getAll(true))."\n"; diff --git a/src/API/LevelAPI.php b/src/API/LevelAPI.php index d5d92929f..9d9b1565d 100644 --- a/src/API/LevelAPI.php +++ b/src/API/LevelAPI.php @@ -155,12 +155,12 @@ class LevelAPI{ console("[ERROR] Could not load level \"".$name."\""); return false; } - $entities = new Config($path."entities.yml", CONFIG_YAML); + $entities = new Config($path."entities.yml", Config::YAML); if(file_exists($path."tileEntities.yml")){ @rename($path."tileEntities.yml", $path."tiles.yml"); } - $tiles = new Config($path."tiles.yml", CONFIG_YAML); - $blockUpdates = new Config($path."bupdates.yml", CONFIG_YAML); + $tiles = new Config($path."tiles.yml", Config::YAML); + $blockUpdates = new Config($path."bupdates.yml", Config::YAML); $this->levels[$name] = new Level($level, $entities, $tiles, $blockUpdates, $name); foreach($entities->getAll() as $entity){ if(!isset($entity["id"])){ diff --git a/src/API/PlayerAPI.php b/src/API/PlayerAPI.php index 4468ca2c7..a590c5466 100644 --- a/src/API/PlayerAPI.php +++ b/src/API/PlayerAPI.php @@ -502,10 +502,10 @@ class PlayerAPI{ if(!file_exists(DATA_PATH."players/".$iname.".yml")){ console("[NOTICE] Player data not found for \"".$iname."\", creating new profile"); - $data = new Config(DATA_PATH."players/".$iname.".yml", CONFIG_YAML, $default); + $data = new Config(DATA_PATH."players/".$iname.".yml", Config::YAML, $default); $data->save(); }else{ - $data = new Config(DATA_PATH."players/".$iname.".yml", CONFIG_YAML, $default); + $data = new Config(DATA_PATH."players/".$iname.".yml", Config::YAML, $default); } if(($data->get("gamemode") & 0x01) === 1){ diff --git a/src/API/PluginAPI.php b/src/API/PluginAPI.php index 65a7dcd73..04822d576 100644 --- a/src/API/PluginAPI.php +++ b/src/API/PluginAPI.php @@ -191,7 +191,7 @@ class PluginAPI extends stdClass{ return false; } $path = $this->configPath($plugin); - $cnf = new Config($path."config.yml", CONFIG_YAML, $default); + $cnf = new Config($path."config.yml", Config::YAML, $default); $cnf->save(); return $path; } diff --git a/src/API/ServerAPI.php b/src/API/ServerAPI.php index 53f6ed6a7..fecf022d2 100644 --- a/src/API/ServerAPI.php +++ b/src/API/ServerAPI.php @@ -110,7 +110,7 @@ class ServerAPI{ console("[INFO] Starting Minecraft PE server version ".FORMAT_AQUA.CURRENT_MINECRAFT_VERSION); console("[INFO] Loading properties..."); - $this->config = new Config(DATA_PATH . "server.properties", CONFIG_PROPERTIES, array( + $this->config = new Config(DATA_PATH . "server.properties", Config::PROPERTIES, array( "server-name" => "Minecraft: PE Server", "description" => "Server made using PocketMine-MP", "motd" => "Welcome @player to this server!", diff --git a/src/Player.php b/src/Player.php index 08216b7e8..40ede5726 100644 --- a/src/Player.php +++ b/src/Player.php @@ -2426,22 +2426,6 @@ class Player{ $this->bufferLen += 6 + $len; return array(); } - - public function isPermissionSet($nodeName){ - - } - - public function hasPermission($nodeName){ - return $this->isPermissionSet($nodeName) and PermissionsAPI::hasPermission($nodeName, $this); - } - - public function setPermission($nodeName, $boolean){ - - } - - public function unsetPermission($nodeName, $boolean){ - - } /** * @return string diff --git a/src/nbt/NBT.php b/src/nbt/NBT.php new file mode 100644 index 000000000..edc1d1d2b --- /dev/null +++ b/src/nbt/NBT.php @@ -0,0 +1,36 @@ +saveData(); @mkdir(dirname($this->file)."/chunks/", 0755); if(!file_exists(dirname($this->file)."/entities.yml")){ - $entities = new Config(dirname($this->file)."/entities.yml", CONFIG_YAML); + $entities = new Config(dirname($this->file)."/entities.yml", Config::YAML); $entities->save(); } if(!file_exists(dirname($this->file)."/tiles.yml")){ - $tiles = new Config(dirname($this->file)."/tiles.yml", CONFIG_YAML); + $tiles = new Config(dirname($this->file)."/tiles.yml", Config::YAML); $tiles->save(); } } diff --git a/src/utils/Config.php b/src/utils/Config.php index f491e9a52..0debcf914 100644 --- a/src/utils/Config.php +++ b/src/utils/Config.php @@ -19,14 +19,7 @@ * */ -define("CONFIG_DETECT", -1); //Detect by file extension -define("CONFIG_PROPERTIES", 0); // .properties -define("CONFIG_CNF", CONFIG_PROPERTIES); // .cnf -define("CONFIG_JSON", 1); // .js, .json -define("CONFIG_YAML", 2); // .yml, .yaml -//define("CONFIG_EXPORT", 3); // .export, .xport -define("CONFIG_SERIALIZED", 4); // .sl -define("CONFIG_LIST", 5); // .txt, .list + /** * Class Config @@ -34,6 +27,15 @@ define("CONFIG_LIST", 5); // .txt, .list * Config Class for simple config manipulation of multiple formats. */ class Config{ + const DETECT = -1; //Detect by file extension + const PROPERTIES = 0; // .properties + const CNF = PROPERTIES; // .cnf + const JSON = 1; // .js, .json + const YAML = 2; // .yml, .yaml + //const EXPORT = 3; // .export, .xport + const SERIALIZED = 4; // .sl + const LIST = 5; // .txt, .list + /** * @var array */ @@ -49,23 +51,23 @@ class Config{ /** * @var integer */ - private $type = CONFIG_DETECT; + private $type = Config::DETECT; public static $formats = array( - "properties" => CONFIG_PROPERTIES, - "cnf" => CONFIG_CNF, - "conf" => CONFIG_CNF, - "config" => CONFIG_CNF, - "json" => CONFIG_JSON, - "js" => CONFIG_JSON, - "yml" => CONFIG_YAML, - "yaml" => CONFIG_YAML, - //"export" => CONFIG_EXPORT, - //"xport" => CONFIG_EXPORT, - "sl" => CONFIG_SERIALIZED, - "serialize" => CONFIG_SERIALIZED, - "txt" => CONFIG_LIST, - "list" => CONFIG_LIST, + "properties" => Config::PROPERTIES, + "cnf" => Config::CNF, + "conf" => Config::CNF, + "config" => Config::CNF, + "json" => Config::JSON, + "js" => Config::JSON, + "yml" => Config::YAML, + "yaml" => Config::YAML, + //"export" => Config::EXPORT, + //"xport" => Config::EXPORT, + "sl" => Config::SERIALIZED, + "serialize" => Config::SERIALIZED, + "txt" => Config::LIST, + "list" => Config::LIST, ); /** @@ -74,8 +76,9 @@ class Config{ * @param array $default * @param null|boolean $correct */ - public function __construct($file, $type = CONFIG_DETECT, $default = array(), &$correct = null){ + public function __construct($file, $type = Config::DETECT, $default = array(), &$correct = null){ $this->load($file, $type, $default); + $correct = $this->correct; } public function reload(){ @@ -96,7 +99,7 @@ class Config{ * * @return boolean */ - public function load($file, $type = CONFIG_DETECT, $default = array()){ + public function load($file, $type = Config::DETECT, $default = array()){ $this->correct = true; $this->type = (int) $type; $this->file = $file; @@ -107,7 +110,7 @@ class Config{ $this->config = $default; $this->save(); }else{ - if($this->type === CONFIG_DETECT){ + if($this->type === Config::DETECT){ $extension = explode(".", basename($this->file)); $extension = strtolower(trim(array_pop($extension))); if(isset(Config::$formats[$extension])){ @@ -119,21 +122,21 @@ class Config{ if($this->correct === true){ $content = @file_get_contents($this->file); switch($this->type){ - case CONFIG_PROPERTIES: - case CONFIG_CNF: + case Config::PROPERTIES: + case Config::CNF: $this->parseProperties($content); break; - case CONFIG_JSON: + case Config::JSON: $this->config = @json_decode($content, true); break; - case CONFIG_YAML: + case Config::YAML: $content = $this->fixYAMLIndexes($content); $this->config = yaml_parse($content); break; - case CONFIG_SERIALIZED: + case Config::SERIALIZED: $this->config = @unserialize($content); break; - case CONFIG_LIST: + case Config::LIST: $this->parseList($content); break; default: @@ -166,20 +169,20 @@ class Config{ public function save(){ if($this->correct === true){ switch($this->type){ - case CONFIG_PROPERTIES: - case CONFIG_CNF: + case Config::PROPERTIES: + case Config::CNF: $content = $this->writeProperties(); break; - case CONFIG_JSON: + case Config::JSON: $content = json_encode($this->config, JSON_PRETTY_PRINT | JSON_BIGINT_AS_STRING); break; - case CONFIG_YAML: + case Config::YAML: $content = yaml_emit($this->config, YAML_UTF8_ENCODING); break; - case CONFIG_SERIALIZED: + case Config::SERIALIZED: $content = @serialize($this->config); break; - case CONFIG_LIST: + case Config::LIST: $content = implode("\r\n", array_keys($this->config)); break; } diff --git a/src/utils/NBT.php b/src/utils/NBT.php index daa6b3932..dcbb11017 100644 --- a/src/utils/NBT.php +++ b/src/utils/NBT.php @@ -19,7 +19,7 @@ * */ -class NBT{ +class NBTOld{ public $tree = array(); public $binary = b""; private $offset = 0; diff --git a/src/wizard/Installer.php b/src/wizard/Installer.php index e7dd1070f..b7c62605a 100644 --- a/src/wizard/Installer.php +++ b/src/wizard/Installer.php @@ -82,7 +82,7 @@ LICENSE; } private function generateBaseConfig(){ - $config = new Config(DATA_PATH . "server.properties", CONFIG_PROPERTIES); + $config = new Config(DATA_PATH . "server.properties", Config::PROPERTIES); echo "[?] ".$this->lang->name_your_server." (".self::DEFAULT_NAME."): "; $config->set("server-name", $this->getInput(self::DEFAULT_NAME)); echo "[*] ".$this->lang->port_warning."\n"; @@ -122,13 +122,13 @@ LICENSE; if($op === ""){ echo "[!] ".$this->lang->op_warning."\n"; }else{ - $ops = new Config(DATA_PATH."ops.txt", CONFIG_LIST); + $ops = new Config(DATA_PATH."ops.txt", Config::LIST); $ops->set($op, true); $ops->save(); } echo "[*] ".$this->lang->whitelist_info."\n"; echo "[?] ".$this->lang->whitelist_enable." (y/N): "; - $config = new Config(DATA_PATH . "server.properties", CONFIG_PROPERTIES); + $config = new Config(DATA_PATH . "server.properties", Config::PROPERTIES); if(strtolower($this->getInput("n")) === "y"){ echo "[!] ".$this->lang->whitelist_warning."\n"; $config->set("white-list", true); @@ -139,7 +139,7 @@ LICENSE; } private function networkFunctions(){ - $config = new Config(DATA_PATH . "server.properties", CONFIG_PROPERTIES); + $config = new Config(DATA_PATH . "server.properties", Config::PROPERTIES); echo "[!] ".$this->lang->query_warning1."\n"; echo "[!] ".$this->lang->query_warning2."\n"; echo "[?] ".$this->lang->query_disable." (y/N): "; diff --git a/src/world/Level.php b/src/world/Level.php index 01a256dde..fb49ef32f 100644 --- a/src/world/Level.php +++ b/src/world/Level.php @@ -20,16 +20,25 @@ */ class Level{ - public $entities, $tiles, $blockUpdates, $nextSave, $players = array(), $level; + public $entities = array(); + public $chunkEntities = array(); + + public $tiles = array(); + + public $entitiesConfig; + public $tilesConfig; + public $blockUpdatesConfig; + + public $nextSave, $players = array(), $level; private $time, $startCheck, $startTime, $server, $name, $usedChunks, $changedBlocks, $changedCount, $stopTime, $generator; public function __construct(PMFLevel $level, Config $entities, Config $tiles, Config $blockUpdates, $name){ $this->server = ServerAPI::request(); $this->level = $level; $this->level->level = $this; - $this->entities = $entities; - $this->tiles = $tiles; - $this->blockUpdates = $blockUpdates; + $this->entitiesConfig = $entities; + $this->tilesConfig = $tiles; + $this->blockUpdatesConfig = $blockUpdates; $this->startTime = $this->time = (int) $this->level->getData("time"); $this->nextSave = $this->startCheck = microtime(true); $this->nextSave += 90; @@ -58,10 +67,11 @@ class Level{ } public function useChunk($X, $Z, Player $player){ - if(!isset($this->usedChunks[$X.".".$Z])){ - $this->usedChunks[$X.".".$Z] = array(); + $index = PMFLevel::getIndex($X, $Z); + if(!isset($this->usedChunks[$index])){ + $this->usedChunks[$index] = array(); } - $this->usedChunks[$X.".".$Z][$player->CID] = true; + $this->usedChunks[$index][$player->CID] = true; if(isset($this->level)){ $this->level->loadChunk($X, $Z); } @@ -74,7 +84,7 @@ class Level{ } public function freeChunk($X, $Z, Player $player){ - unset($this->usedChunks[$X.".".$Z][$player->CID]); + unset($this->usedChunks[PMFLevel::getIndex($X, $Z)][$player->CID]); } public function isChunkPopulated($X, $Z){ @@ -183,115 +193,7 @@ class Level{ } if($extra !== false){ - $entities = array(); - foreach($this->server->api->entity->getAll($this) as $entity){ - if($entity->class === ENTITY_MOB){ - $entities[] = array( - "id" => $entity->type, - "Color" => @$entity->data["Color"], - "Sheared" => @$entity->data["Sheared"], - "Health" => $entity->health, - "Pos" => array( - 0 => $entity->x, - 1 => $entity->y, - 2 => $entity->z, - ), - "Rotation" => array( - 0 => $entity->yaw, - 1 => $entity->pitch, - ), - ); - }elseif($entity->class === ENTITY_OBJECT){ - if($entity->type === OBJECT_PAINTING){ - $entities[] = array( - "id" => $entity->type, - "TileX" => $entity->x, - "TileY" => $entity->y, - "TileZ" => $entity->z, - "Health" => $entity->health, - "Motive" => $entity->data["Motive"], - "Pos" => array( - 0 => $entity->x, - 1 => $entity->y, - 2 => $entity->z, - ), - "Rotation" => array( - 0 => $entity->yaw, - 1 => $entity->pitch, - ), - ); - }else{ - $entities[] = array( - "id" => $entity->type, - "Health" => $entity->health, - "Pos" => array( - 0 => $entity->x, - 1 => $entity->y, - 2 => $entity->z, - ), - "Rotation" => array( - 0 => $entity->yaw, - 1 => $entity->pitch, - ), - ); - } - }elseif($entity->class === ENTITY_FALLING){ - $entities[] = array( - "id" => $entity->type, - "Health" => $entity->health, - "Tile" => $entity->data["Tile"], - "Pos" => array( - 0 => $entity->x, - 1 => $entity->y, - 2 => $entity->z, - ), - "Rotation" => array( - 0 => 0, - 1 => 0, - ), - ); - }elseif($entity->class === ENTITY_ITEM){ - $entities[] = array( - "id" => 64, - "Item" => array( - "id" => $entity->type, - "Damage" => $entity->meta, - "Count" => $entity->stack, - ), - "Health" => $entity->health, - "Pos" => array( - 0 => $entity->x, - 1 => $entity->y, - 2 => $entity->z, - ), - "Rotation" => array( - 0 => 0, - 1 => 0, - ), - ); - } - } - $this->entities->setAll($entities); - $this->entities->save(); - $tiles = array(); - foreach($this->server->api->tile->getAll($this) as $tile){ - $tiles[] = $tile->data; - } - $this->tiles->setAll($tiles); - $this->tiles->save(); - $blockUpdates = array(); - $updates = $this->server->query("SELECT x,y,z,type,delay FROM blockUpdates WHERE level = '".$this->getName()."';"); - if($updates !== false and $updates !== true){ - $timeu = microtime(true); - while(($bupdate = $updates->fetchArray(SQLITE3_ASSOC)) !== false){ - $bupdate["delay"] = max(1, ($bupdate["delay"] - $timeu) * 20); - $blockUpdates[] = $bupdate; - } - } - - $this->blockUpdates->setAll($blockUpdates); - $this->blockUpdates->save(); } diff --git a/src/world/LevelImport.php b/src/world/LevelImport.php index b2af2f7ab..7d2ecf491 100644 --- a/src/world/LevelImport.php +++ b/src/world/LevelImport.php @@ -29,9 +29,9 @@ class LevelImport{ if(file_exists($this->path."tileEntities.dat")){ //OldPM $level = unserialize(file_get_contents($this->path."level.dat")); console("[INFO] Importing OldPM level \"".$level["LevelName"]."\" to PMF format"); - $entities = new Config($this->path."entities.yml", CONFIG_YAML, unserialize(file_get_contents($this->path."entities.dat"))); + $entities = new Config($this->path."entities.yml", Config::YAML, unserialize(file_get_contents($this->path."entities.dat"))); $entities->save(); - $tiles = new Config($this->path."tiles.yml", CONFIG_YAML, unserialize(file_get_contents($this->path."tileEntities.dat"))); + $tiles = new Config($this->path."tiles.yml", Config::YAML, unserialize(file_get_contents($this->path."tileEntities.dat"))); $tiles->save(); }elseif(file_exists($this->path."chunks.dat") and file_exists($this->path."level.dat")){ //Pocket $nbt = new NBT(); @@ -49,9 +49,9 @@ class LevelImport{ } $tiles = $entities["TileEntities"]; $entities = $entities["Entities"]; - $entities = new Config($this->path."entities.yml", CONFIG_YAML, $entities); + $entities = new Config($this->path."entities.yml", Config::YAML, $entities); $entities->save(); - $tiles = new Config($this->path."tiles.yml", CONFIG_YAML, $tiles); + $tiles = new Config($this->path."tiles.yml", Config::YAML, $tiles); $tiles->save(); }else{ return false; diff --git a/src/world/generator/WorldGenerator.php b/src/world/generator/WorldGenerator.php index 9e7d52393..35787683a 100644 --- a/src/world/generator/WorldGenerator.php +++ b/src/world/generator/WorldGenerator.php @@ -39,9 +39,9 @@ class WorldGenerator{ "generatorSettings" => $this->generator->getSettings(), "extra" => "" )); - $entities = new Config($this->path."entities.yml", CONFIG_YAML); - $tiles = new Config($this->path."tiles.yml", CONFIG_YAML); - $blockUpdates = new Config($this->path."bupdates.yml", CONFIG_YAML); + $entities = new Config($this->path."entities.yml", Config::YAML); + $tiles = new Config($this->path."tiles.yml", Config::YAML); + $blockUpdates = new Config($this->path."bupdates.yml", Config::YAML); $this->level = new Level($level, $entities, $tiles, $blockUpdates, $name); }