diff --git a/src/PocketMine/Achievement.php b/src/PocketMine/Achievement.php index c0f082bef..07fcc97b3 100644 --- a/src/PocketMine/Achievement.php +++ b/src/PocketMine/Achievement.php @@ -104,8 +104,8 @@ abstract class Achievement{ public static function broadcast(Player $player, $achievementId){ if(isset(Achievement::$list[$achievementId])){ - if(Server::getInstance()->api->getProperty("announce-player-achievements") == true){ - Player::broadcastMessage($player->getDisplayName() . " has just earned the achievement " . Achievement::$list[$achievementId]["name"]); + if(Server::getInstance()->getConfigString("announce-player-achievements", true) === true){ + Server::getInstance()->broadcastMessage($player->getDisplayName() . " has just earned the achievement " . Achievement::$list[$achievementId]["name"]); }else{ $player->sendMessage("You have just earned the achievement " . Achievement::$list[$achievementId]["name"]); } diff --git a/src/PocketMine/Player.php b/src/PocketMine/Player.php index dd7e31f50..06ccef356 100644 --- a/src/PocketMine/Player.php +++ b/src/PocketMine/Player.php @@ -38,25 +38,20 @@ use PocketMine\NBT\Tag\Int; use PocketMine\NBT\Tag\Short; use PocketMine\NBT\Tag\String; use PocketMine\Network\Protocol\AdventureSettingsPacket; -use PocketMine\Network\Protocol\AnimatePacket; use PocketMine\Network\Protocol\ChunkDataPacket; use PocketMine\Network\Protocol\ContainerClosePacket; use PocketMine\Network\Protocol\ContainerSetContentPacket; -use PocketMine\Network\Protocol\ContainerSetDataPacket; use PocketMine\Network\Protocol\ContainerSetSlotPacket; use PocketMine\Network\Protocol\DataPacket; use PocketMine\Network\Protocol\DisconnectPacket; -use PocketMine\Network\Protocol\EntityEventPacket; use PocketMine\Network\Protocol\Info as ProtocolInfo; use PocketMine\Network\Protocol\LoginStatusPacket; use PocketMine\Network\Protocol\MessagePacket; use PocketMine\Network\Protocol\PongPacket; use PocketMine\Network\Protocol\ServerHandshakePacket; -use PocketMine\Network\Protocol\SetEntityDataPacket; use PocketMine\Network\Protocol\SetSpawnPositionPacket; use PocketMine\Network\Protocol\SetTimePacket; use PocketMine\Network\Protocol\StartGamePacket; -use PocketMine\Network\Protocol\TakeItemEntityPacket; use PocketMine\Network\Protocol\TileEventPacket; use PocketMine\Network\Protocol\UnknownPacket; use PocketMine\Network\Protocol\UpdateBlockPacket; @@ -85,8 +80,6 @@ use PocketMine\Utils\Utils; * @package PocketMine */ class Player extends Human implements CommandSender{ - const BROADCAST_CHANNEL_ADMINISTRATIVE = "pocketmine.broadcast.admin"; - const BROADCAST_CHANNEL_USERS = "pocketmine.broadcast.user"; const SURVIVAL = 0; const CREATIVE = 1; @@ -103,7 +96,6 @@ class Player extends Human implements CommandSender{ */ public static $list = array(); - public $auth = false; public $CID; public $MTU; public $spawned = false; @@ -139,10 +131,10 @@ class Player extends Human implements CommandSender{ private $resendQueue = array(); private $ackQueue = array(); private $receiveCount = -1; + /** @var \PocketMine\Network\RakNet\Packet */ private $buffer; private $bufferLen = 0; private $nextBuffer = 0; - private $evid = array(); private $timeout; private $counter = array(0, 0, 0, 0); private $viewDistance; @@ -166,6 +158,7 @@ class Player extends Human implements CommandSender{ */ private $tasks = array(); + /** @var PermissibleBase */ private $perm = null; @@ -342,12 +335,20 @@ class Player extends Human implements CommandSender{ console("[DEBUG] New Session started with " . $ip . ":" . $port . ". MTU " . $this->MTU . ", Client ID " . $this->clientID, true, true, 2); } + /** + * @param string $achievementId + */ public function removeAchievement($achievementId){ if($this->hasAchievement($achievementId)){ $this->achievements[$achievementId] = false; } } + /** + * @param string $achievementId + * + * @return bool + */ public function hasAchievement($achievementId){ if(!isset(Achievement::$list[$achievementId]) or !isset($this->achievements)){ $this->achievements = array(); @@ -362,36 +363,70 @@ class Player extends Human implements CommandSender{ return true; } + /** + * @return bool + */ public function isConnected(){ return $this->connected === true; } + /** + * Gets the "friendly" name to display of this player to use in the chat. + * + * @return string + */ public function getDisplayName(){ return $this->displayName; } + /** + * @param string $name + */ public function setDisplayName($name){ $this->displayName = $name; } - public function getIP(){ + /** + * Gets the player IP address + * + * @return string + */ + public function getAddress(){ return $this->ip; } + /** + * @return int + */ public function getPort(){ return $this->port; } + /** + * @return bool + */ public function isSleeping(){ return $this->sleeping instanceof Vector3; } + /** + * Sets the chunk send flags for a specific index + * + * WARNING: Do not use this, it's only for internal use. + * Changes to this function won't be recorded on the version. + * + * @param int $index + * @param int $flags + */ public function setChunkIndex($index, $flags){ if(isset($this->chunksLoaded[$index])){ $this->chunksLoaded[$index] |= $flags; } } + /** + * @return Position + */ public function getSpawn(){ return $this->spawnPosition; } @@ -399,6 +434,9 @@ class Player extends Human implements CommandSender{ /** * Sends, if available, the next ordered chunk to the client * + * WARNING: Do not use this, it's only for internal use. + * Changes to this function won't be recorded on the version. + * * @param bool $force * @param bool $ev * @@ -492,6 +530,13 @@ class Player extends Human implements CommandSender{ } } + /** + * + * WARNING: Do not use this, it's only for internal use. + * Changes to this function won't be recorded on the version. + * + * @return bool + */ public function orderChunks(){ if($this->connected === false){ return false; @@ -548,6 +593,8 @@ class Player extends Human implements CommandSender{ } /** + * Sends an ordered DataPacket to the send buffer + * * @param DataPacket $packet * * @return array|bool @@ -617,6 +664,14 @@ class Player extends Human implements CommandSender{ return $cnts; } + /** + * Sends a raw Packet to the conection + * + * WARNING: Do not use this, it's only for internal use. + * Changes to this function won't be recorded on the version. + * + * @param Packet $packet + */ public function send(Packet $packet){ if($this->connected === true){ $packet->ip = $this->ip; @@ -625,6 +680,12 @@ class Player extends Human implements CommandSender{ } } + /** + * Forces sending the buffer + * + * WARNING: Do not use this, it's only for internal use. + * Changes to this function won't be recorded on the version. + */ public function sendBuffer(){ if($this->connected === true){ if($this->bufferLen > 0 and $this->buffer instanceof Packet){ @@ -688,13 +749,17 @@ class Player extends Human implements CommandSender{ //} } + /** + * WARNING: Do not use this, it's only for internal use. + * Changes to this function won't be recorded on the version. + */ public function checkSleep(){ if($this->sleeping !== false){ //TODO if($this->server->api->time->getPhase($this->level) === "night"){ foreach($this->level->getPlayers() as $p){ if($p->sleeping === false){ - return false; + return; } } $this->server->api->time->set("day", $this->level); @@ -703,13 +768,11 @@ class Player extends Human implements CommandSender{ } } } + + return; } - /** - * @param mixed $data - * @param string $event - */ - public function eventHandler($data, $event){ + /*public function eventHandler($data, $event){ switch($event){ //TODO, obsolete case "tile.update": @@ -807,8 +870,13 @@ class Player extends Human implements CommandSender{ } break; } - } + }*/ + /** + * @param string $achievementId + * + * @return bool + */ public function awardAchievement($achievementId){ if(isset(Achievement::$list[$achievementId]) and !$this->hasAchievement($achievementId)){ foreach(Achievement::$list[$achievementId]["requires"] as $requerimentId){ @@ -830,10 +898,21 @@ class Player extends Human implements CommandSender{ return false; } + /** + * @return int + */ public function getGamemode(){ return $this->gamemode; } + /** + * Sets the gamemode, and if needed, kicks the player + * TODO: Check if Mojang adds the ability to change gamemode without kicking players + * + * @param int $gm + * + * @return bool + */ public function setGamemode($gm){ if($gm < 0 or $gm > 3 or $this->gamemode === $gm){ return false; @@ -859,6 +938,14 @@ class Player extends Human implements CommandSender{ return true; } + /** + * Sends all the option flags + * + * WARNING: Do not use this, it's only for internal use. + * Changes to this function won't be recorded on the version. + * + * @param bool $nametags + */ public function sendSettings($nametags = true){ /* bit mask | flag name @@ -909,6 +996,12 @@ class Player extends Human implements CommandSender{ $this->dataPacket($pk); } + /** + * WARNING: Do not use this, it's only for internal use. + * Changes to this function won't be recorded on the version. + * + * @return bool + */ public function measureLag(){ if($this->connected === false){ return false; @@ -928,18 +1021,39 @@ class Player extends Human implements CommandSender{ $this->lastMeasure = microtime(true); } + /** + * WARNING: Experimental method + * + * @return int + */ public function getLag(){ return $this->lagStat * 1000; } + /** + * WARNING: Experimental method + * + * @return int + */ public function getPacketLoss(){ return $this->packetLoss; } + /** + * WARNING: Experimental method + * + * @return float + */ public function getBandwidth(){ return array_sum($this->bandwidthStats) / max(1, count($this->bandwidthStats)); } + /** + * WARNING: Do not use this, it's only for internal use. + * Changes to this function won't be recorded on the version. + * + * @return bool + */ public function clearQueue(){ if($this->connected === false){ return false; @@ -956,6 +1070,12 @@ class Player extends Human implements CommandSender{ } } + /** + * WARNING: Do not use this, it's only for internal use. + * Changes to this function won't be recorded on the version. + * + * @return bool + */ public function handlePacketQueues(){ if($this->connected === false){ return false; @@ -1047,6 +1167,9 @@ class Player extends Human implements CommandSender{ * Handles a Minecraft packet * TODO: Separate all of this in handlers * + * WARNING: Do not use this, it's only for internal use. + * Changes to this function won't be recorded on the version. + * * @param DataPacket $packet */ public function handleDataPacket(DataPacket $packet){ @@ -1098,10 +1221,10 @@ class Player extends Human implements CommandSender{ $this->loginData = array("clientId" => $packet->clientId, "loginData" => $packet->loginData); //TODO: op things - if(count(Player::$list) > $this->server->getMaxPlayers() and !$this->server->api->ban->isOp($this->iusername)){ - $this->kick("server full"); - - return; + if(count(Player::$list) > $this->server->getMaxPlayers()){ + if($this->kick("server full") === true){ + return; + } } if($packet->protocol1 !== ProtocolInfo::CURRENT_PROTOCOL){ if($packet->protocol1 < ProtocolInfo::CURRENT_PROTOCOL){ @@ -1134,14 +1257,13 @@ class Player extends Human implements CommandSender{ $this->close($this->username . " has left the game", "Server is white-listed"); return; - }elseif($this->server->getNameBans()->isBanned(strtolower($this->getName())) or $this->server->getIPBans()->isBanned($this->getIP())){ + }elseif($this->server->getNameBans()->isBanned(strtolower($this->getName())) or $this->server->getIPBans()->isBanned($this->getAddress())){ $this->close($this->username . " has left the game", "You are banned"); return; } - $this->server->getPluginManager()->subscribeToPermission(Player::BROADCAST_CHANNEL_ADMINISTRATIVE, $this); - $this->server->getPluginManager()->subscribeToPermission(Player::BROADCAST_CHANNEL_USERS, $this); - $this->loggedIn = true; + $this->server->getPluginManager()->subscribeToPermission(Server::BROADCAST_CHANNEL_ADMINISTRATIVE, $this); + $this->server->getPluginManager()->subscribeToPermission(Server::BROADCAST_CHANNEL_USERS, $this); $u = Player::get($this->iusername, false, true); if(count($u) > 0){ @@ -1179,9 +1301,8 @@ class Player extends Human implements CommandSender{ } Player::saveOffline($this->username, $nbt); - $this->auth = true; - parent::__construct($this->level, $nbt); + $this->loggedIn = true; if(($this->gamemode & 0x01) === 0x01){ $this->slot = 0; @@ -1246,6 +1367,7 @@ class Player extends Human implements CommandSender{ if($this->spawned !== false){ break; } + //TODO //$this->heal($this->data->get("health"), "spawn", true); $this->spawned = true; $this->spawnToAll(); @@ -2138,10 +2260,10 @@ class Player extends Human implements CommandSender{ Player::saveOffline($this->username, $this->namedtag); } if(isset($ev) and $this->username != "" and $this->spawned !== false and $ev->getQuitMessage() != ""){ - Player::broadcastMessage($ev->getQuitMessage()); + $this->server->broadcastMessage($ev->getQuitMessage()); } - $this->server->getPluginManager()->unsubscribeFromPermission(Player::BROADCAST_CHANNEL_ADMINISTRATIVE, $this); - $this->server->getPluginManager()->unsubscribeFromPermission(Player::BROADCAST_CHANNEL_USERS, $this); + $this->server->getPluginManager()->unsubscribeFromPermission(Server::BROADCAST_CHANNEL_ADMINISTRATIVE, $this); + $this->server->getPluginManager()->unsubscribeFromPermission(Server::BROADCAST_CHANNEL_USERS, $this); $this->spawned = false; console("[INFO] " . TextFormat::AQUA . $this->username . TextFormat::RESET . "[/" . $this->ip . ":" . $this->port . "] logged out due to " . $reason); $this->windows = array(); @@ -2208,15 +2330,6 @@ class Player extends Human implements CommandSender{ return array($pk->seqNumber); } - /** - * Broadcasts a message to all the players - * - * @param string $message - */ - public static function broadcastMessage($message){ - self::groupChat($message, Server::getInstance()->getPluginManager()->getPermissionSubscriptions(Player::BROADCAST_CHANNEL_USERS)); - } - /** * @return Player[] */ @@ -2380,20 +2493,6 @@ class Player extends Human implements CommandSender{ file_put_contents(Server::getInstance()->getDataPath() . "players/" . strtolower($name) . ".dat", $nbt->writeCompressed()); } - /** - * Sends a message to a group of players - * - * @param string $message - * @param Player[] $players - */ - public static function groupChat($message, array $players){ - foreach($players as $p){ - if($p instanceof CommandSender){ - $p->sendMessage($message); - } - } - } - /** * Gets the username * diff --git a/src/PocketMine/Server.php b/src/PocketMine/Server.php index b6d60f405..bef0fee6e 100644 --- a/src/PocketMine/Server.php +++ b/src/PocketMine/Server.php @@ -52,6 +52,7 @@ use PocketMine\Plugin\Plugin; use PocketMine\Plugin\PluginLoadOrder; use PocketMine\Plugin\PluginManager; use PocketMine\Recipes\Crafting; +use PocketMine\Scheduler\CallbackTask; use PocketMine\Scheduler\ServerScheduler; use PocketMine\Scheduler\TickScheduler; use PocketMine\Tile\Tile; @@ -61,6 +62,9 @@ use PocketMine\Utils\Utils; use PocketMine\Utils\VersionString; class Server{ + const BROADCAST_CHANNEL_ADMINISTRATIVE = "pocketmine.broadcast.admin"; + const BROADCAST_CHANNEL_USERS = "pocketmine.broadcast.user"; + /** @var Server */ private static $instance = null; @@ -688,7 +692,7 @@ class Server{ $this->consoleSender = new ConsoleCommandSender(); $this->commandMap = new SimpleCommandMap($this); $this->pluginManager = new PluginManager($this, $this->commandMap); - $this->pluginManager->subscribeToPermission(Player::BROADCAST_CHANNEL_ADMINISTRATIVE, $this->consoleSender); + $this->pluginManager->subscribeToPermission(Server::BROADCAST_CHANNEL_ADMINISTRATIVE, $this->consoleSender); $this->pluginManager->registerInterface("PocketMine\\Plugin\\FolderPluginLoader"); $this->pluginManager->loadPlugins($this->pluginPath); @@ -710,18 +714,45 @@ class Server{ $this->server->schedule(6000, array($this, "sendUsage"), array(), true); //Send the info after 5 minutes have passed $this->sendUsage(); } - if($this->getProperty("auto-save") === true){ - $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->schedule(2, array($this, "checkTickUpdates"), array(), true); + $this->scheduler->scheduleRepeatingTask(new CallbackTask("PocketMine\\Utils\\Cache::cleanup"), 20 * 45); + if($this->getConfigBoolean("auto-save", true) === true){ + $this->scheduler->scheduleRepeatingTask(new CallbackTask(array($this, "doAutoSave")), 18000); + } $this->enablePlugins(PluginLoadOrder::POSTWORLD); } + /** + * @param $message + * + * @return int + */ + public function broadcastMessage($message){ + return $this->broadcast($message, self::BROADCAST_CHANNEL_USERS); + } + + /** + * @param string $message + * @param string $permission + * + * @return int + */ + public function broadcast($message, $permission){ + $count = 0; + foreach($this->pluginManager->getPermissionSubscriptions($permission) as $permissible){ + if($permissible instanceof CommandSender and $permissible->hasPermission($permission)){ + $permissible->sendMessage($message); + ++$count; + } + } + + return $count; + } + + /** * @param int $type */ @@ -747,10 +778,6 @@ class Server{ */ public function loadPlugin(Plugin $plugin){ $this->pluginManager->enablePlugin($plugin); - - foreach($plugin->getDescription()->getPermisions() as $perm){ - $this->pluginManager->addPermission($perm); - } } public function disablePlugins(){ @@ -979,13 +1006,13 @@ class Server{ //TODO: Add level blocks //Do level ticks - foreach(Level::$list as $level){ + foreach(Level::getAll() as $level){ $level->doTick(); } } - public function autoSave(){ - console("[DEBUG] Saving....", true, true, 2); + public function doAutoSave(){ + $this->broadcast(TextFormat::GRAY . "Saving...", self::BROADCAST_CHANNEL_ADMINISTRATIVE); Level::saveAll(); } diff --git a/src/PocketMine/command/Command.php b/src/PocketMine/command/Command.php index 8f2034527..b4d62bbc1 100644 --- a/src/PocketMine/command/Command.php +++ b/src/PocketMine/command/Command.php @@ -24,7 +24,6 @@ */ namespace PocketMine\Command; -use PocketMine\Player; use PocketMine\Server; use PocketMine\Utils\TextFormat; @@ -286,7 +285,7 @@ abstract class Command{ //Command minecarts or command blocks are not implemented - $users = Server::getInstance()->getPluginManager()->getPermissionSubscriptions(Player::BROADCAST_CHANNEL_ADMINISTRATIVE); + $users = Server::getInstance()->getPluginManager()->getPermissionSubscriptions(Server::BROADCAST_CHANNEL_ADMINISTRATIVE); $colored = TextFormat::GRAY . TextFormat::ITALIC . "[$result" . TextFormat::GRAY . TextFormat::ITALIC . "]"; if($sendToSource === true and !($source instanceof ConsoleCommandSender)){ $source->sendMessage($message); diff --git a/src/PocketMine/command/defaults/BanIpCommand.php b/src/PocketMine/command/defaults/BanIpCommand.php index f3c9e10c9..33a6d0e3a 100644 --- a/src/PocketMine/command/defaults/BanIpCommand.php +++ b/src/PocketMine/command/defaults/BanIpCommand.php @@ -56,7 +56,7 @@ class BanIpCommand extends VanillaCommand{ $this->processIPBan($value, $sender, $reason); }else{ if(($player = Player::get($value, true)) instanceof Player){ - $this->processIPBan($player->getIP(), $sender, $reason); + $this->processIPBan($player->getAddress(), $sender, $reason); }else{ $sender->sendMessage(TextFormat::RED . "Usage: " . $this->usageMessage); @@ -71,7 +71,7 @@ class BanIpCommand extends VanillaCommand{ Server::getInstance()->getIPBans()->addBan($ip, $reason, null, $sender->getName()); foreach(Player::getAll() as $player){ - if($player->getIP() === $ip){ + if($player->getAddress() === $ip){ $player->kick("You have been IP banned."); } } diff --git a/src/PocketMine/command/defaults/MeCommand.php b/src/PocketMine/command/defaults/MeCommand.php index 60a717409..f762cf024 100644 --- a/src/PocketMine/command/defaults/MeCommand.php +++ b/src/PocketMine/command/defaults/MeCommand.php @@ -23,6 +23,7 @@ namespace PocketMine\Command\Defaults; use PocketMine\Command\CommandSender; use PocketMine\Player; +use PocketMine\Server; use PocketMine\Utils\TextFormat; class MeCommand extends VanillaCommand{ @@ -54,7 +55,7 @@ class MeCommand extends VanillaCommand{ $message .= $sender->getName(); } - Player::broadcastMessage($message . " " . implode(" ", $args)); + Server::getInstance()->broadcastMessage($message . " " . implode(" ", $args)); return true; } diff --git a/src/PocketMine/command/defaults/SayCommand.php b/src/PocketMine/command/defaults/SayCommand.php index 1dad6b21c..4151bc063 100644 --- a/src/PocketMine/command/defaults/SayCommand.php +++ b/src/PocketMine/command/defaults/SayCommand.php @@ -24,6 +24,7 @@ namespace PocketMine\Command\Defaults; use PocketMine\Command\CommandSender; use PocketMine\Command\ConsoleCommandSender; use PocketMine\Player; +use PocketMine\Server; use PocketMine\Utils\TextFormat; class SayCommand extends VanillaCommand{ @@ -57,7 +58,7 @@ class SayCommand extends VanillaCommand{ $message .= $sender->getName(); } $message .= TextFormat::LIGHT_PURPLE . "] " . implode(" ", $args); - Player::broadcastMessage($message); + Server::getInstance()->broadcastMessage($message); return true; } diff --git a/src/PocketMine/level/Level.php b/src/PocketMine/level/Level.php index 5d672148e..575540d0d 100644 --- a/src/PocketMine/level/Level.php +++ b/src/PocketMine/level/Level.php @@ -296,9 +296,10 @@ class Level{ $level->save(true, true); } - foreach($blockUpdates->getAll() as $bupdate){ + //TODO + /*foreach($blockUpdates->getAll() as $bupdate){ Server::getInstance()->api->block->scheduleBlockUpdate(new Position((int) $bupdate["x"], (int) $bupdate["y"], (int) $bupdate["z"], $level), (float) $bupdate["delay"], (int) $bupdate["type"]); - } + }*/ return true; } @@ -306,7 +307,7 @@ class Level{ /** * Generates a new level * - * @param $name + * @param string $name * @param bool $seed * @param bool $generator * @param bool|array $options @@ -341,7 +342,7 @@ class Level{ /** * Searches if a level exists on file * - * @param $name + * @param string $name * * @return bool */ @@ -416,35 +417,75 @@ class Level{ return true; } + /** + * Gets the chunks being used by players + * + * @param int $X + * @param int $Z + * + * @return Player[][] + */ public function getUsingChunk($X, $Z){ $index = LevelFormat::getIndex($X, $Z); return isset($this->usedChunks[$index]) ? $this->usedChunks[$index] : array(); } + /** + * WARNING: Do not use this, it's only for internal use. + * Changes to this function won't be recorded on the version. + * + * @param int $X + * @param int $Z + * @param Player $player + */ public function useChunk($X, $Z, Player $player){ $index = LevelFormat::getIndex($X, $Z); $this->loadChunk($X, $Z); $this->usedChunks[$index][$player->CID] = $player; } + /** + * WARNING: Do not use this, it's only for internal use. + * Changes to this function won't be recorded on the version. + * + * @param Player $player + */ public function freeAllChunks(Player $player){ foreach($this->usedChunks as $i => $c){ unset($this->usedChunks[$i][$player->CID]); } } + /** + * WARNING: Do not use this, it's only for internal use. + * Changes to this function won't be recorded on the version. + * + * @param int $X + * @param int $Z + * @param Player $player + */ public function freeChunk($X, $Z, Player $player){ unset($this->usedChunks[LevelFormat::getIndex($X, $Z)][$player->CID]); } + /** + * @param int $X + * @param int $Z + * + * @return bool + */ public function isChunkPopulated($X, $Z){ return $this->level->isPopulated($X, $Z); } + /** + * WARNING: Do not use this, it's only for internal use. + * Changes to this function won't be recorded on the version. + */ public function checkTime(){ if(!isset($this->level)){ - return false; + return; } $now = microtime(true); if($this->stopTime == true){ @@ -462,6 +503,12 @@ class Level{ return; } + /** + * WARNING: Do not use this, it's only for internal use. + * Changes to this function won't be recorded on the version. + * + * @return bool + */ public function doTick(){ if(!isset($this->level)){ return false; @@ -518,7 +565,8 @@ class Level{ $block = $this->getBlockRaw(new Vector3(($X << 4) + mt_rand(0, 15), ($Y << 4) + mt_rand(0, 15), ($Z << 4) + mt_rand(0, 15))); if($block instanceof Block){ if($block->onUpdate(self::BLOCK_UPDATE_RANDOM) === self::BLOCK_UPDATE_NORMAL){ - $this->server->api->block->blockUpdateAround($block); + //TODO + //$this->server->api->block->blockUpdateAround($block); } } } @@ -543,6 +591,12 @@ class Level{ } } + /** + * @param int $X + * @param int $Z + * + * @return bool + */ public function generateChunk($X, $Z){ ++$this->level->isGenerating; $this->generator->generateChunk($X, $Z); @@ -551,6 +605,12 @@ class Level{ return true; } + /** + * @param int $X + * @param int $Z + * + * @return bool + */ public function populateChunk($X, $Z){ $this->level->setPopulated($X, $Z); $this->generator->populateChunk($X, $Z); @@ -567,6 +627,12 @@ class Level{ } } + /** + * @param bool $force + * @param bool $extra + * + * @return bool + */ public function save($force = false, $extra = true){ if(!isset($this->level)){ return false; @@ -617,12 +683,22 @@ class Level{ } } + /** + * @param Vector3 $pos + * + * @return Block + */ public function getBlockRaw(Vector3 $pos){ $b = $this->level->getBlock($pos->x, $pos->y, $pos->z); return Block::get($b[0], $b[1], new Position($pos->x, $pos->y, $pos->z, $this)); } + /** + * @param Vector3 $pos + * + * @return bool|Block + */ public function getBlock(Vector3 $pos){ if($pos instanceof Position and $pos->level !== $this){ return false; @@ -632,6 +708,14 @@ class Level{ return Block::get($b[0], $b[1], new Position($pos->x, $pos->y, $pos->z, $this)); } + /** + * @param Vector3 $pos + * @param Block $block + * @param bool $direct + * @param bool $send + * + * @return bool + */ public function setBlockRaw(Vector3 $pos, Block $block, $direct = true, $send = true){ if(($ret = $this->level->setBlock($pos->x, $pos->y, $pos->z, $block->getID(), $block->getMetadata())) === true and $send !== false){ if($direct === true){ @@ -667,6 +751,15 @@ class Level{ return $ret; } + /** + * @param Vector3 $pos + * @param Block $block + * @param bool $update + * @param bool $tiles + * @param bool $direct + * + * @return bool + */ public function setBlock(Vector3 $pos, Block $block, $update = true, $tiles = false, $direct = false){ if((($pos instanceof Position) and $pos->level !== $this) or $pos->x < 0 or $pos->y < 0 or $pos->z < 0){ return false; @@ -705,7 +798,8 @@ class Level{ } if($update === true){ - $this->server->api->block->blockUpdateAround($pos, self::BLOCK_UPDATE_NORMAL, 1); + //TODO + //$this->server->api->block->blockUpdateAround($pos, self::BLOCK_UPDATE_NORMAL, 1); } if($tiles === true){ if(($t = $this->getTile($pos)) instanceof Tile){ @@ -1286,6 +1380,7 @@ class Level{ } public function scheduleBlockUpdate(Position $pos, $delay, $type = self::BLOCK_UPDATE_SCHEDULED){ - return $this->server->api->block->scheduleBlockUpdate($pos, $delay, $type); + //TODO + //return $this->server->api->block->scheduleBlockUpdate($pos, $delay, $type); } } diff --git a/src/PocketMine/network/protocol/DataPacket.php b/src/PocketMine/network/protocol/DataPacket.php index ef522c0b1..6f4112bed 100644 --- a/src/PocketMine/network/protocol/DataPacket.php +++ b/src/PocketMine/network/protocol/DataPacket.php @@ -24,7 +24,7 @@ namespace PocketMine\Network\Protocol; use PocketMine\Item\Item; use PocketMine\Utils\Utils; -abstract class DataPacket{ +abstract class DataPacket extends \stdClass{ private $offset = 0; public $buffer = ""; diff --git a/src/PocketMine/plugin/PluginDescription.php b/src/PocketMine/plugin/PluginDescription.php index 95fd06090..70086066d 100644 --- a/src/PocketMine/plugin/PluginDescription.php +++ b/src/PocketMine/plugin/PluginDescription.php @@ -183,7 +183,7 @@ class PluginDescription{ /** * @return Permission[] */ - public function getPermisions(){ + public function getPermissions(){ return $this->permissions; } diff --git a/src/PocketMine/plugin/PluginManager.php b/src/PocketMine/plugin/PluginManager.php index 82b817ec7..2767bb617 100644 --- a/src/PocketMine/plugin/PluginManager.php +++ b/src/PocketMine/plugin/PluginManager.php @@ -500,7 +500,7 @@ class PluginManager{ $this->commandMap->registerAll($plugin->getDescription()->getName(), $pluginCommands); } - foreach($plugin->getDescription()->getPermisions() as $perm){ + foreach($plugin->getDescription()->getPermissions() as $perm){ $this->addPermission($perm); } @@ -573,7 +573,7 @@ class PluginManager{ $plugin->getPluginLoader()->disablePlugin($plugin); $this->server->getScheduler()->cancelTasks($plugin); HandlerList::unregisterAll($plugin); - foreach($plugin->getDescription()->getCommands() as $perm){ + foreach($plugin->getDescription()->getPermissions() as $perm){ $this->removePermission($perm); } }