contract(0.025, 0, 0.025)->trim(Facing::UP, 0.05)]; } public function getSupportType(int $facing) : SupportType{ return SupportType::NONE; } public function onPostPlace() : void{ $world = $this->position->getWorld(); $tile = $world->getTile($this->position); if($tile instanceof TileChest){ foreach([false, true] as $clockwise){ $side = Facing::rotateY($this->facing, $clockwise); $c = $this->getSide($side); if($c instanceof Chest && $c->hasSameTypeId($this) && $c->facing === $this->facing){ $pair = $world->getTile($c->position); if($pair instanceof TileChest && !$pair->isPaired()){ [$left, $right] = $clockwise ? [$c, $this] : [$this, $c]; $ev = new ChestPairEvent($left, $right); $ev->call(); if(!$ev->isCancelled() && $world->getBlock($this->position)->hasSameTypeId($this) && $world->getBlock($c->position)->hasSameTypeId($c)){ $pair->pairWith($tile); $tile->pairWith($pair); break; } } } } } } public function onInteract(Item $item, int $face, Vector3 $clickVector, ?Player $player = null, array &$returnedItems = []) : bool{ if($player instanceof Player){ $world = $this->position->getWorld(); $chest = $world->getTile($this->position); if($chest instanceof TileChest){ if( !$this->getSide(Facing::UP)->isTransparent() || (($pair = $chest->getPair()) !== null && !$pair->getBlock()->getSide(Facing::UP)->isTransparent()) || !$chest->canOpenWith($item->getCustomName()) ){ return true; } $window = null; if($chest->isPaired()){ foreach([false, true] as $clockwise){ $sideFacing = Facing::rotateY($this->facing, $clockwise); $side = $this->position->getSide($sideFacing); $pair = $world->getTile($side); if($pair instanceof TileChest && $pair->getPair() === $chest){ [$left, $right] = $clockwise ? [$pair, $chest] : [$chest, $pair]; $doubleInventory = $left->getDoubleInventory() ?? $right->getDoubleInventory(); if($doubleInventory === null){ $doubleInventory = new DoubleChestInventory($left->getInventory(), $right->getInventory()); $left->setDoubleInventory($doubleInventory); $right->setDoubleInventory($doubleInventory); } $window = new DoubleChestInventoryWindow($player, $doubleInventory, $left->getPosition(), $right->getPosition()); break; } } } $player->setCurrentWindow($window ?? new ChestInventoryWindow($player, $chest->getInventory(), $this->position)); } } return true; } public function getFuelTime() : int{ return 300; } }