diff --git a/src/pocketmine/network/mcpe/handler/InGamePacketHandler.php b/src/pocketmine/network/mcpe/handler/InGamePacketHandler.php index ffa482680..2014968d4 100644 --- a/src/pocketmine/network/mcpe/handler/InGamePacketHandler.php +++ b/src/pocketmine/network/mcpe/handler/InGamePacketHandler.php @@ -26,10 +26,14 @@ namespace pocketmine\network\mcpe\handler; use pocketmine\block\ItemFrame; use pocketmine\block\Sign; use pocketmine\block\utils\SignText; +use pocketmine\event\player\PlayerEditBookEvent; use pocketmine\inventory\transaction\action\InventoryAction; use pocketmine\inventory\transaction\CraftingTransaction; use pocketmine\inventory\transaction\InventoryTransaction; use pocketmine\inventory\transaction\TransactionValidationException; +use pocketmine\item\Item; +use pocketmine\item\WritableBook; +use pocketmine\item\WrittenBook; use pocketmine\math\Vector3; use pocketmine\nbt\NbtDataException; use pocketmine\nbt\tag\StringTag; @@ -587,7 +591,52 @@ class InGamePacketHandler extends PacketHandler{ } public function handleBookEdit(BookEditPacket $packet) : bool{ - return $this->player->handleBookEdit($packet); + //TODO: break this up into book API things + $oldBook = $this->player->getInventory()->getItem($packet->inventorySlot); + if(!($oldBook instanceof WritableBook)){ + return false; + } + + $newBook = clone $oldBook; + $modifiedPages = []; + + switch($packet->type){ + case BookEditPacket::TYPE_REPLACE_PAGE: + $newBook->setPageText($packet->pageNumber, $packet->text); + $modifiedPages[] = $packet->pageNumber; + break; + case BookEditPacket::TYPE_ADD_PAGE: + $newBook->insertPage($packet->pageNumber, $packet->text); + $modifiedPages[] = $packet->pageNumber; + break; + case BookEditPacket::TYPE_DELETE_PAGE: + $newBook->deletePage($packet->pageNumber); + $modifiedPages[] = $packet->pageNumber; + break; + case BookEditPacket::TYPE_SWAP_PAGES: + $newBook->swapPages($packet->pageNumber, $packet->secondaryPageNumber); + $modifiedPages = [$packet->pageNumber, $packet->secondaryPageNumber]; + break; + case BookEditPacket::TYPE_SIGN_BOOK: + /** @var WrittenBook $newBook */ + $newBook = Item::get(Item::WRITTEN_BOOK, 0, 1, $newBook->getNamedTag()); + $newBook->setAuthor($packet->author); + $newBook->setTitle($packet->title); + $newBook->setGeneration(WrittenBook::GENERATION_ORIGINAL); + break; + default: + return false; + } + + $event = new PlayerEditBookEvent($this->player, $oldBook, $newBook, $packet->type, $modifiedPages); + $event->call(); + if($event->isCancelled()){ + return true; + } + + $this->player->getInventory()->setItem($packet->inventorySlot, $event->getNewBook()); + + return true; } public function handleModalFormResponse(ModalFormResponsePacket $packet) : bool{ diff --git a/src/pocketmine/player/Player.php b/src/pocketmine/player/Player.php index 359966821..ef588a0f2 100644 --- a/src/pocketmine/player/Player.php +++ b/src/pocketmine/player/Player.php @@ -50,7 +50,6 @@ use pocketmine\event\player\PlayerChangeSkinEvent; use pocketmine\event\player\PlayerChatEvent; use pocketmine\event\player\PlayerCommandPreprocessEvent; use pocketmine\event\player\PlayerDeathEvent; -use pocketmine\event\player\PlayerEditBookEvent; use pocketmine\event\player\PlayerExhaustEvent; use pocketmine\event\player\PlayerGameModeChangeEvent; use pocketmine\event\player\PlayerInteractEvent; @@ -78,8 +77,6 @@ use pocketmine\item\enchantment\EnchantmentInstance; use pocketmine\item\enchantment\MeleeWeaponEnchantment; use pocketmine\item\Item; use pocketmine\item\ItemUseResult; -use pocketmine\item\WritableBook; -use pocketmine\item\WrittenBook; use pocketmine\lang\TextContainer; use pocketmine\lang\TranslationContainer; use pocketmine\math\Vector3; @@ -91,7 +88,6 @@ use pocketmine\nbt\tag\IntTag; use pocketmine\nbt\tag\ListTag; use pocketmine\network\mcpe\NetworkSession; use pocketmine\network\mcpe\protocol\AnimatePacket; -use pocketmine\network\mcpe\protocol\BookEditPacket; use pocketmine\network\mcpe\protocol\ClientboundPacket; use pocketmine\network\mcpe\protocol\LevelEventPacket; use pocketmine\network\mcpe\protocol\MovePlayerPacket; @@ -2041,55 +2037,6 @@ class Player extends Human implements CommandSender, ChunkLoader, ChunkListener, $this->world->dropItem($this->add(0, 1.3, 0), $item, $this->getDirectionVector()->multiply(0.4), 40); } - public function handleBookEdit(BookEditPacket $packet) : bool{ - /** @var WritableBook $oldBook */ - $oldBook = $this->inventory->getItem($packet->inventorySlot); - if(!($oldBook instanceof WritableBook)){ - return false; - } - - $newBook = clone $oldBook; - $modifiedPages = []; - - switch($packet->type){ - case BookEditPacket::TYPE_REPLACE_PAGE: - $newBook->setPageText($packet->pageNumber, $packet->text); - $modifiedPages[] = $packet->pageNumber; - break; - case BookEditPacket::TYPE_ADD_PAGE: - $newBook->insertPage($packet->pageNumber, $packet->text); - $modifiedPages[] = $packet->pageNumber; - break; - case BookEditPacket::TYPE_DELETE_PAGE: - $newBook->deletePage($packet->pageNumber); - $modifiedPages[] = $packet->pageNumber; - break; - case BookEditPacket::TYPE_SWAP_PAGES: - $newBook->swapPages($packet->pageNumber, $packet->secondaryPageNumber); - $modifiedPages = [$packet->pageNumber, $packet->secondaryPageNumber]; - break; - case BookEditPacket::TYPE_SIGN_BOOK: - /** @var WrittenBook $newBook */ - $newBook = Item::get(Item::WRITTEN_BOOK, 0, 1, $newBook->getNamedTag()); - $newBook->setAuthor($packet->author); - $newBook->setTitle($packet->title); - $newBook->setGeneration(WrittenBook::GENERATION_ORIGINAL); - break; - default: - return false; - } - - $event = new PlayerEditBookEvent($this, $oldBook, $newBook, $packet->type, $modifiedPages); - $event->call(); - if($event->isCancelled()){ - return true; - } - - $this->getInventory()->setItem($packet->inventorySlot, $event->getNewBook()); - - return true; - } - /** * @param ClientboundPacket $packet * @param bool $immediate