mirror of
https://github.com/pmmp/PocketMine-MP.git
synced 2025-09-06 17:59:48 +00:00
this is only used by concrete powder currently, so it doesn't make much sense to reimplement it in every implementor of Fallable.
99 lines
3.1 KiB
PHP
99 lines
3.1 KiB
PHP
<?php
|
|
|
|
/*
|
|
*
|
|
* ____ _ _ __ __ _ __ __ ____
|
|
* | _ \ ___ ___| | _____| |_| \/ (_)_ __ ___ | \/ | _ \
|
|
* | |_) / _ \ / __| |/ / _ \ __| |\/| | | '_ \ / _ \_____| |\/| | |_) |
|
|
* | __/ (_) | (__| < __/ |_| | | | | | | | __/_____| | | | __/
|
|
* |_| \___/ \___|_|\_\___|\__|_| |_|_|_| |_|\___| |_| |_|_|
|
|
*
|
|
* This program is free software: you can redistribute it and/or modify
|
|
* it under the terms of the GNU Lesser General Public License as published by
|
|
* the Free Software Foundation, either version 3 of the License, or
|
|
* (at your option) any later version.
|
|
*
|
|
* @author PocketMine Team
|
|
* @link http://www.pocketmine.net/
|
|
*
|
|
*
|
|
*/
|
|
|
|
declare(strict_types=1);
|
|
|
|
namespace pocketmine\block;
|
|
|
|
use pocketmine\block\inventory\AnvilInventory;
|
|
use pocketmine\block\utils\Fallable;
|
|
use pocketmine\block\utils\FallableTrait;
|
|
use pocketmine\block\utils\HorizontalFacingTrait;
|
|
use pocketmine\block\utils\SupportType;
|
|
use pocketmine\data\runtime\RuntimeDataReader;
|
|
use pocketmine\data\runtime\RuntimeDataWriter;
|
|
use pocketmine\item\Item;
|
|
use pocketmine\math\AxisAlignedBB;
|
|
use pocketmine\math\Facing;
|
|
use pocketmine\math\Vector3;
|
|
use pocketmine\player\Player;
|
|
use pocketmine\world\BlockTransaction;
|
|
|
|
class Anvil extends Transparent implements Fallable{
|
|
use FallableTrait;
|
|
use HorizontalFacingTrait;
|
|
|
|
public const UNDAMAGED = 0;
|
|
public const SLIGHTLY_DAMAGED = 1;
|
|
public const VERY_DAMAGED = 2;
|
|
|
|
private int $damage = self::UNDAMAGED;
|
|
|
|
public function getRequiredTypeDataBits() : int{ return 2; }
|
|
|
|
protected function describeType(RuntimeDataReader|RuntimeDataWriter $w) : void{
|
|
$w->boundedInt(2, self::UNDAMAGED, self::VERY_DAMAGED, $this->damage);
|
|
}
|
|
|
|
public function getRequiredStateDataBits() : int{ return 2; }
|
|
|
|
protected function describeState(RuntimeDataReader|RuntimeDataWriter $w) : void{
|
|
$w->horizontalFacing($this->facing);
|
|
}
|
|
|
|
public function getDamage() : int{ return $this->damage; }
|
|
|
|
/** @return $this */
|
|
public function setDamage(int $damage) : self{
|
|
if($damage < self::UNDAMAGED || $damage > self::VERY_DAMAGED){
|
|
throw new \InvalidArgumentException("Damage must be in range " . self::UNDAMAGED . " ... " . self::VERY_DAMAGED);
|
|
}
|
|
$this->damage = $damage;
|
|
return $this;
|
|
}
|
|
|
|
/**
|
|
* @return AxisAlignedBB[]
|
|
*/
|
|
protected function recalculateCollisionBoxes() : array{
|
|
return [AxisAlignedBB::one()->squash(Facing::axis(Facing::rotateY($this->facing, false)), 1 / 8)];
|
|
}
|
|
|
|
public function getSupportType(int $facing) : SupportType{
|
|
return SupportType::NONE();
|
|
}
|
|
|
|
public function onInteract(Item $item, int $face, Vector3 $clickVector, ?Player $player = null, array &$returnedItems = []) : bool{
|
|
if($player instanceof Player){
|
|
$player->setCurrentWindow(new AnvilInventory($this->position));
|
|
}
|
|
|
|
return true;
|
|
}
|
|
|
|
public function place(BlockTransaction $tx, Item $item, Block $blockReplace, Block $blockClicked, int $face, Vector3 $clickVector, ?Player $player = null) : bool{
|
|
if($player !== null){
|
|
$this->facing = Facing::rotateY($player->getHorizontalFacing(), true);
|
|
}
|
|
return parent::place($tx, $item, $blockReplace, $blockClicked, $face, $clickVector, $player);
|
|
}
|
|
}
|