From 37bc1273ee9c40d9d7348850cb0c8644dc280d6d Mon Sep 17 00:00:00 2001 From: Shoghi Cervantes Date: Tue, 17 Mar 2015 17:49:10 +0100 Subject: [PATCH] Implemented double chest fix, closes #2744, fixes #2493 --- src/pocketmine/Player.php | 2 +- src/pocketmine/inventory/BaseInventory.php | 4 +++- .../inventory/DoubleChestInventory.php | 21 ++++++++++++------- 3 files changed, 18 insertions(+), 9 deletions(-) diff --git a/src/pocketmine/Player.php b/src/pocketmine/Player.php index a604dee7f..b2c82a9a7 100644 --- a/src/pocketmine/Player.php +++ b/src/pocketmine/Player.php @@ -1279,7 +1279,7 @@ class Player extends Human implements CommandSender, InventoryHolder, IPlayer{ if($diff > 0.6 and $expectedVelocity < $this->speed->y and !$this->server->getAllowFlight()){ if($this->inAirTicks < 100){ $this->setMotion(new Vector3(0, $expectedVelocity, 0)); - }elseif($this->kick("Flying is not enabled on this server")) + }elseif($this->kick("Flying is not enabled on this server")){ return false; } } diff --git a/src/pocketmine/inventory/BaseInventory.php b/src/pocketmine/inventory/BaseInventory.php index 5025fd5b7..b0df84533 100644 --- a/src/pocketmine/inventory/BaseInventory.php +++ b/src/pocketmine/inventory/BaseInventory.php @@ -115,7 +115,9 @@ abstract class BaseInventory implements Inventory{ $this->clear($i); } }else{ - $this->setItem($i, $items[$i]); + if (!$this->setItem($i, $items[$i])){ + $this->clear($i); + } } } } diff --git a/src/pocketmine/inventory/DoubleChestInventory.php b/src/pocketmine/inventory/DoubleChestInventory.php index 5d6bef991..2c87ca503 100644 --- a/src/pocketmine/inventory/DoubleChestInventory.php +++ b/src/pocketmine/inventory/DoubleChestInventory.php @@ -37,7 +37,8 @@ class DoubleChestInventory extends ChestInventory implements InventoryHolder{ public function __construct(Chest $left, Chest $right){ $this->left = $left->getRealInventory(); $this->right = $right->getRealInventory(); - BaseInventory::__construct($this, InventoryType::get(InventoryType::DOUBLE_CHEST)); + $items = array_merge($this->left->getContents(), $this->right->getContents()); + BaseInventory::__construct($this, InventoryType::get(InventoryType::DOUBLE_CHEST), $items); } public function getInventory(){ @@ -77,13 +78,19 @@ class DoubleChestInventory extends ChestInventory implements InventoryHolder{ $items = array_slice($items, 0, $this->size, true); } - parent::setContents($items); - $leftItems = array_slice($items, 0, $this->left->getSize(), true); - $this->left->setContents($leftItems); - if(count($items) > $this->left->getSize()){ - $rightItems = array_slice($items, $this->left->getSize() - 1, $this->right->getSize(), true); - $this->right->setContents($rightItems); + for($i = 0; $i < $this->size; ++$i){ + if(!isset($items[$i])){ + if ($i < $this->left->size){ + if(isset($this->left->slots[$i])){ + $this->clear($i); + } + }elseif(isset($this->right->slots[$i - $this->left->size])){ + $this->clear($i); + } + }elseif(!$this->setItem($i, $items[$i])){ + $this->clear($i); + } } }