From 0ad16c191925e350323b18d5fb2663bc6de4c923 Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Mon, 29 May 2017 18:50:45 +0100 Subject: [PATCH] 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; - } - }