From b6c1139b27165ea7bbf038e2b66dc246b501e862 Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Wed, 24 May 2017 14:25:48 +0100 Subject: [PATCH 1/8] Fixed lint scan ignoring PHP_BINARY argument --- tests/lint.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/lint.sh b/tests/lint.sh index 0668c2ac9..ac7d2e4e0 100755 --- a/tests/lint.sh +++ b/tests/lint.sh @@ -12,7 +12,7 @@ done echo Running PHP lint scans... -OUTPUT=`find ./src/pocketmine -name "*.php" -print0 | xargs -0 -n1 -P4 php -l` +OUTPUT=`find ./src/pocketmine -name "*.php" -print0 | xargs -0 -n1 -P4 $PHP_BINARY -l` if [ $? -ne 0 ]; then echo $OUTPUT | grep -v "No syntax errors" From 76ab3d42883492927067c0829fadfb18314e90a6 Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Wed, 24 May 2017 14:50:33 +0100 Subject: [PATCH 2/8] This worked fine locally... --- tests/lint.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/lint.sh b/tests/lint.sh index ac7d2e4e0..69ec00b30 100755 --- a/tests/lint.sh +++ b/tests/lint.sh @@ -12,7 +12,7 @@ done echo Running PHP lint scans... -OUTPUT=`find ./src/pocketmine -name "*.php" -print0 | xargs -0 -n1 -P4 $PHP_BINARY -l` +OUTPUT=`find ./src/pocketmine -name "*.php" -print0 | xargs -0 -n1 -P4 "$PHP_BINARY" -l` if [ $? -ne 0 ]; then echo $OUTPUT | grep -v "No syntax errors" From ca6826898b352d40f205c8bdc21c53091bcf6d2e Mon Sep 17 00:00:00 2001 From: Muqsit Rayyan Date: Thu, 25 May 2017 16:05:41 +0300 Subject: [PATCH 3/8] Added API method Server->broadcastTitle() (#932) --- src/pocketmine/Server.php | 30 ++++++++++++++++++++++++++++++ 1 file changed, 30 insertions(+) diff --git a/src/pocketmine/Server.php b/src/pocketmine/Server.php index 4af97a252..3d3b1743b 100644 --- a/src/pocketmine/Server.php +++ b/src/pocketmine/Server.php @@ -1716,6 +1716,36 @@ class Server{ return count($recipients); } + /** + * @param string $title + * @param string $subtitle + * @param int $fadeIn Duration in ticks for fade-in. If -1 is given, client-sided defaults will be used. + * @param int $stay Duration in ticks to stay on screen for + * @param int $fadeOut Duration in ticks for fade-out. + * @param Player[]|null $recipients + * + * @return int + */ + public function broadcastTitle(string $title, string $subtitle = "", int $fadeIn = -1, int $stay = -1, int $fadeOut = -1, $recipients = null){ + if(!is_array($recipients)){ + /** @var Player[] $recipients */ + $recipients = []; + + foreach($this->pluginManager->getPermissionSubscriptions(self::BROADCAST_CHANNEL_USERS) as $permissible){ + if($permissible instanceof Player and $permissible->hasPermission(self::BROADCAST_CHANNEL_USERS)){ + $recipients[spl_object_hash($permissible)] = $permissible; // do not send messages directly, or some might be repeated + } + } + } + + /** @var Player[] $recipients */ + foreach($recipients as $recipient){ + $recipient->addTitle($title, $subtitle, $fadeIn, $stay, $fadeOut); + } + + return count($recipients); + } + /** * @param string $message * @param string $permissions From 3446f68c746266d6bcc07965e8760abdd036ca17 Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Fri, 26 May 2017 13:46:34 +0100 Subject: [PATCH 4/8] Workaround for PowerShell escape code issue after using git in the same window I don't have any idea why the bug happens. Starting the server in a child PowerShell process resolves the issue. --- start.ps1 | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/start.ps1 b/start.ps1 index 1b94da0ca..62dca7128 100644 --- a/start.ps1 +++ b/start.ps1 @@ -20,7 +20,7 @@ if(Test-Path "PocketMine-MP.phar"){ } function StartServer{ - $command = $binary + " " + $file + " --enable-ansi" + $command = "powershell " + $binary + " " + $file + " --enable-ansi" iex $command } From 4c764072b241d329cc7d8cc7c0432b87f44e520a Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Fri, 26 May 2017 17:11:51 +0100 Subject: [PATCH 5/8] Check the entity is actually inside a block before trying to shove it out, fix #271 --- src/pocketmine/entity/Entity.php | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/pocketmine/entity/Entity.php b/src/pocketmine/entity/Entity.php index 60c6f4469..dec663191 100644 --- a/src/pocketmine/entity/Entity.php +++ b/src/pocketmine/entity/Entity.php @@ -862,6 +862,10 @@ abstract class Entity extends Location implements Metadatable{ } protected function checkObstruction($x, $y, $z){ + if(count($this->level->getCollisionCubes($this, $this->getBoundingBox(), false)) === 0){ + return false; + } + $i = Math::floorFloat($x); $j = Math::floorFloat($y); $k = Math::floorFloat($z); From 645d744e057b26596c9553289e1f75e67a728ee0 Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Fri, 26 May 2017 21:39:43 +0100 Subject: [PATCH 6/8] Added a check for Phar extension --- src/pocketmine/PocketMine.php | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/src/pocketmine/PocketMine.php b/src/pocketmine/PocketMine.php index 5503c9c22..8644af5e6 100644 --- a/src/pocketmine/PocketMine.php +++ b/src/pocketmine/PocketMine.php @@ -84,6 +84,12 @@ namespace pocketmine { * Enjoy it as much as I did writing it. I don't want to do it again. */ + if(!extension_loaded("phar")){ + echo "[CRITICAL] Unable to find the Phar extension." . PHP_EOL; + echo "[CRITICAL] Please use the installer provided on the homepage." . PHP_EOL; + exit(1); + } + if(\Phar::running(true) !== ""){ @define('pocketmine\PATH', \Phar::running(true) . "/"); }else{ From 0ad16c191925e350323b18d5fb2663bc6de4c923 Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Mon, 29 May 2017 18:50:45 +0100 Subject: [PATCH 7/8] Added PlayerDataSaveEvent, resolved #487 (#920) * Added PlayerDataSaveEvent, resolved #487 * Added getPlayer() to PlayerDataSaveEvent may return an IPlayer * Fixed quit messages This TranslationContainer vs. string mess... >_< --- src/pocketmine/Player.php | 3 +- src/pocketmine/Server.php | 14 ++-- .../event/player/PlayerDataSaveEvent.php | 78 +++++++++++++++++++ .../event/player/PlayerQuitEvent.php | 26 +++---- 4 files changed, 101 insertions(+), 20 deletions(-) create mode 100644 src/pocketmine/event/player/PlayerDataSaveEvent.php diff --git a/src/pocketmine/Player.php b/src/pocketmine/Player.php index 14f1c4c10..195027849 100644 --- a/src/pocketmine/Player.php +++ b/src/pocketmine/Player.php @@ -3604,7 +3604,6 @@ class Player extends Human implements CommandSender, InventoryHolder, ChunkLoade $this->server->getPluginManager()->unsubscribeFromPermission(Server::BROADCAST_CHANNEL_ADMINISTRATIVE, $this); if($this->joined){ - //TODO: add events for player data saving $this->save(); $this->server->getPluginManager()->callEvent($ev = new PlayerQuitEvent($this, $message)); @@ -3705,7 +3704,7 @@ class Player extends Human implements CommandSender, InventoryHolder, ChunkLoade } $this->namedtag["playerGameType"] = $this->gamemode; - $this->namedtag["lastPlayed"] = new LongTag("lastPlayed", floor(microtime(true) * 1000)); + $this->namedtag["lastPlayed"] = floor(microtime(true) * 1000); if($this->username != "" and $this->namedtag instanceof CompoundTag){ $this->server->saveOfflinePlayerData($this->username, $this->namedtag, $async); diff --git a/src/pocketmine/Server.php b/src/pocketmine/Server.php index 3d3b1743b..97c7a1aad 100644 --- a/src/pocketmine/Server.php +++ b/src/pocketmine/Server.php @@ -37,6 +37,7 @@ use pocketmine\entity\Entity; use pocketmine\event\HandlerList; use pocketmine\event\level\LevelInitEvent; use pocketmine\event\level\LevelLoadEvent; +use pocketmine\event\player\PlayerDataSaveEvent; use pocketmine\event\server\QueryRegenerateEvent; use pocketmine\event\server\ServerCommandEvent; use pocketmine\event\Timings; @@ -758,8 +759,6 @@ class Server{ $nbt->Motion->setTagType(NBT::TAG_Double); $nbt->Rotation->setTagType(NBT::TAG_Float); - $this->saveOfflinePlayerData($name, $nbt); - return $nbt; } @@ -769,11 +768,16 @@ class Server{ * @param CompoundTag $nbtTag * @param bool $async */ - public function saveOfflinePlayerData($name, CompoundTag $nbtTag, $async = false){ - if($this->shouldSavePlayerData()){ + public function saveOfflinePlayerData(string $name, CompoundTag $nbtTag, bool $async = false){ + $ev = new PlayerDataSaveEvent($nbtTag, $name); + $ev->setCancelled(!$this->shouldSavePlayerData()); + + $this->pluginManager->callEvent($ev); + + if(!$ev->isCancelled()){ $nbt = new NBT(NBT::BIG_ENDIAN); try{ - $nbt->setData($nbtTag); + $nbt->setData($ev->getSaveData()); if($async){ $this->getScheduler()->scheduleAsyncTask(new FileWriteTask($this->getDataPath() . "players/" . strtolower($name) . ".dat", $nbt->writeCompressed())); diff --git a/src/pocketmine/event/player/PlayerDataSaveEvent.php b/src/pocketmine/event/player/PlayerDataSaveEvent.php new file mode 100644 index 000000000..cbe8d7900 --- /dev/null +++ b/src/pocketmine/event/player/PlayerDataSaveEvent.php @@ -0,0 +1,78 @@ +data = $nbt; + $this->playerName = $playerName; + } + + /** + * Returns the data to be written to disk as a CompoundTag + * @return CompoundTag + */ + public function getSaveData() : CompoundTag{ + return $this->data; + } + + /** + * @param CompoundTag $data + */ + public function setSaveData(CompoundTag $data){ + $this->data = $data; + } + + /** + * Returns the username of the player whose data is being saved. This is not necessarily an online player. + * @return string + */ + public function getPlayerName() : string{ + return $this->playerName; + } + + /** + * Returns the player whose data is being saved. This may be a Player or an OfflinePlayer. + * @return IPlayer (Player or OfflinePlayer) + */ + public function getPlayer() : IPlayer{ + return Server::getInstance()->getOfflinePlayer($this->playerName); + } +} \ No newline at end of file diff --git a/src/pocketmine/event/player/PlayerQuitEvent.php b/src/pocketmine/event/player/PlayerQuitEvent.php index 37efeb4da..efb29e433 100644 --- a/src/pocketmine/event/player/PlayerQuitEvent.php +++ b/src/pocketmine/event/player/PlayerQuitEvent.php @@ -21,6 +21,7 @@ namespace pocketmine\event\player; +use pocketmine\event\TranslationContainer; use pocketmine\Player; /** @@ -29,30 +30,29 @@ use pocketmine\Player; class PlayerQuitEvent extends PlayerEvent{ public static $handlerList = null; - /** @var string */ + /** @var TranslationContainer|string */ protected $quitMessage; - protected $autoSave = true; - public function __construct(Player $player, $quitMessage, $autoSave = true){ + /** + * @param Player $player + * @param TranslationContainer|string $quitMessage + */ + public function __construct(Player $player, $quitMessage){ $this->player = $player; $this->quitMessage = $quitMessage; - $this->autoSave = $autoSave; } + /** + * @param TranslationContainer|string $quitMessage + */ public function setQuitMessage($quitMessage){ $this->quitMessage = $quitMessage; } + /** + * @return TranslationContainer|string + */ public function getQuitMessage(){ return $this->quitMessage; } - - public function getAutoSave(){ - return $this->autoSave; - } - - public function setAutoSave($value = true){ - $this->autoSave = (bool) $value; - } - } From f6ff03fc315386af4a6c62b940774a41e936a221 Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Tue, 30 May 2017 09:43:14 +0100 Subject: [PATCH 8/8] Added support for MCPACK resource packs --- src/pocketmine/resourcepacks/ResourcePackManager.php | 1 + 1 file changed, 1 insertion(+) diff --git a/src/pocketmine/resourcepacks/ResourcePackManager.php b/src/pocketmine/resourcepacks/ResourcePackManager.php index 125c31ce0..339fa113d 100644 --- a/src/pocketmine/resourcepacks/ResourcePackManager.php +++ b/src/pocketmine/resourcepacks/ResourcePackManager.php @@ -83,6 +83,7 @@ class ResourcePackManager{ $info = new \SplFileInfo($packPath); switch($info->getExtension()){ case "zip": + case "mcpack": $newPack = new ZippedResourcePack($packPath); break; default: