/src/pocketmine/tile/Furnace.php
https://gitlab.com/Skull3x/ClearSky · PHP · 287 lines · 216 code · 44 blank · 27 comment · 29 complexity · db006902a37bfaa774665880b79d0578 MD5 · raw file
- <?php
- namespace pocketmine\tile;
- use pocketmine\block\Block;
- use pocketmine\event\inventory\FurnaceBurnEvent;
- use pocketmine\event\inventory\FurnaceSmeltEvent;
- use pocketmine\inventory\FurnaceInventory;
- use pocketmine\inventory\FurnaceRecipe;
- use pocketmine\inventory\InventoryHolder;
- use pocketmine\item\Item;
- use pocketmine\level\format\FullChunk;
- use pocketmine\nbt\NBT;
- use pocketmine\nbt\tag\Compound;
- use pocketmine\nbt\tag\Enum;
- use pocketmine\nbt\tag\Short;
- use pocketmine\nbt\tag\String;
- use pocketmine\nbt\tag\Int;
- use pocketmine\network\Network;
- use pocketmine\network\protocol\ContainerSetDataPacket;
- class Furnace extends Spawnable implements InventoryHolder, Container, Nameable{
- /** @var FurnaceInventory */
- protected $inventory;
- public function __construct(FullChunk $chunk, Compound $nbt){
- parent::__construct($chunk, $nbt);
- $this->inventory = new FurnaceInventory($this);
- if(!isset($this->namedtag->Items) or !($this->namedtag->Items instanceof Enum)){
- $this->namedtag->Items = new Enum("Items", []);
- $this->namedtag->Items->setTagType(NBT::TAG_Compound);
- }
- for($i = 0; $i < $this->getSize(); ++$i){
- $this->inventory->setItem($i, $this->getItem($i));
- }
- if(!isset($this->namedtag->BurnTime) or $this->namedtag["BurnTime"] < 0){
- $this->namedtag->BurnTime = new Short("BurnTime", 0);
- }
- if(!isset($this->namedtag->CookTime) or $this->namedtag["CookTime"] < 0 or ($this->namedtag["BurnTime"] === 0 and $this->namedtag["CookTime"] > 0)){
- $this->namedtag->CookTime = new Short("CookTime", 0);
- }
- if(!isset($this->namedtag->MaxTime)){
- $this->namedtag->MaxTime = new Short("BurnTime", $this->namedtag["BurnTime"]);
- $this->namedtag->BurnTicks = new Short("BurnTicks", 0);
- }
- if($this->namedtag["BurnTime"] > 0){
- $this->scheduleUpdate();
- }
- }
- public function getName(){
- return isset($this->namedtag->CustomName) ? $this->namedtag->CustomName->getValue() : "Furnace";
- }
- public function hasName(){
- return isset($this->namedtag->CustomName);
- }
- public function setName($str){
- if($str === ""){
- unset($this->namedtag->CustomName);
- return;
- }
- $this->namedtag->CustomName = new String("CustomName", $str);
- }
- public function close(){
- if($this->closed === false){
- foreach($this->getInventory()->getViewers() as $player){
- $player->removeWindow($this->getInventory());
- }
- parent::close();
- }
- }
- public function saveNBT(){
- $this->namedtag->Items = new Enum("Items", []);
- $this->namedtag->Items->setTagType(NBT::TAG_Compound);
- for($index = 0; $index < $this->getSize(); ++$index){
- $this->setItem($index, $this->inventory->getItem($index));
- }
- }
- /**
- * @return int
- */
- public function getSize(){
- return 3;
- }
- /**
- * @param $index
- *
- * @return int
- */
- protected function getSlotIndex($index){
- foreach($this->namedtag->Items as $i => $slot){
- if($slot["Slot"] === $index){
- return $i;
- }
- }
- return -1;
- }
- /**
- * This method should not be used by plugins, use the Inventory
- *
- * @param int $index
- *
- * @return Item
- */
- public function getItem($index){
- $i = $this->getSlotIndex($index);
- if($i < 0){
- return Item::get(Item::AIR, 0, 0);
- }else{
- return NBT::getItemHelper($this->namedtag->Items[$i]);
- }
- }
- /**
- * This method should not be used by plugins, use the Inventory
- *
- * @param int $index
- * @param Item $item
- *
- * @return bool
- */
- public function setItem($index, Item $item){
- $i = $this->getSlotIndex($index);
- $d = NBT::putItemHelper($item, $index);
- if($item->getId() === Item::AIR or $item->getCount() <= 0){
- if($i >= 0){
- unset($this->namedtag->Items[$i]);
- }
- }elseif($i < 0){
- for($i = 0; $i <= $this->getSize(); ++$i){
- if(!isset($this->namedtag->Items[$i])){
- break;
- }
- }
- $this->namedtag->Items[$i] = $d;
- }else{
- $this->namedtag->Items[$i] = $d;
- }
- return true;
- }
- /**
- * @return FurnaceInventory
- */
- public function getInventory(){
- return $this->inventory;
- }
- protected function checkFuel(Item $fuel){
- $this->server->getPluginManager()->callEvent($ev = new FurnaceBurnEvent($this, $fuel, $fuel->getFuelTime()));
- if($ev->isCancelled()){
- return;
- }
- $this->namedtag->MaxTime = new Short("MaxTime", $ev->getBurnTime());
- $this->namedtag->BurnTime = new Short("BurnTime", $ev->getBurnTime());
- $this->namedtag->BurnTicks = new Short("BurnTicks", 0);
- if($this->getBlock()->getId() === Item::FURNACE){
- $this->getLevel()->setBlock($this, Block::get(Item::BURNING_FURNACE, $this->getBlock()->getDamage()), true);
- }
- if($this->namedtag["BurnTime"] > 0 and $ev->isBurning()){
- $fuel->setCount($fuel->getCount() - 1);
- if($fuel->getCount() === 0){
- $fuel = Item::get(Item::AIR, 0, 0);
- }
- $this->inventory->setFuel($fuel);
- }
- }
- public function onUpdate(){
- if($this->closed === true){
- return false;
- }
- $this->timings->startTiming();
- $ret = false;
- $fuel = $this->inventory->getFuel();
- $raw = $this->inventory->getSmelting();
- $product = $this->inventory->getResult();
- $smelt = $this->server->getCraftingManager()->matchFurnaceRecipe($raw);
- $canSmelt = ($smelt instanceof FurnaceRecipe and $raw->getCount() > 0 and (($smelt->getResult()->equals($product) and $product->getCount() < $product->getMaxStackSize()) or $product->getId() === Item::AIR));
- if($this->namedtag["BurnTime"] <= 0 and $canSmelt and $fuel->getFuelTime() !== null and $fuel->getCount() > 0){
- $this->checkFuel($fuel);
- }
- if($this->namedtag["BurnTime"] > 0){
- $this->namedtag->BurnTime = new Short("BurnTime", $this->namedtag["BurnTime"] - 1);
- $this->namedtag->BurnTicks = new Short("BurnTicks", ceil(($this->namedtag["BurnTime"] / $this->namedtag["MaxTime"] * 200)));
- if($smelt instanceof FurnaceRecipe and $canSmelt){
- $this->namedtag->CookTime = new Short("CookTime", $this->namedtag["CookTime"] + 1);
- if($this->namedtag["CookTime"] >= 200){ //10 seconds
- $product = Item::get($smelt->getResult()->getId(), $smelt->getResult()->getDamage(), $product->getCount() + 1);
- $this->server->getPluginManager()->callEvent($ev = new FurnaceSmeltEvent($this, $raw, $product));
- if(!$ev->isCancelled()){
- $this->inventory->setResult($ev->getResult());
- $raw->setCount($raw->getCount() - 1);
- if($raw->getCount() === 0){
- $raw = Item::get(Item::AIR, 0, 0);
- }
- $this->inventory->setSmelting($raw);
- }
- $this->namedtag->CookTime = new Short("CookTime", $this->namedtag["CookTime"] - 200);
- }
- }elseif($this->namedtag["BurnTime"] <= 0){
- $this->namedtag->BurnTime = new Short("BurnTime", 0);
- $this->namedtag->CookTime = new Short("CookTime", 0);
- $this->namedtag->BurnTicks = new Short("BurnTicks", 0);
- }else{
- $this->namedtag->CookTime = new Short("CookTime", 0);
- }
- $ret = true;
- }else{
- ;
- if($this->getBlock()->getId() === Item::BURNING_FURNACE){
- $this->getLevel()->setBlock($this, Block::get(Item::FURNACE, $this->getBlock()->getDamage()), true);
- }
- $this->namedtag->BurnTime = new Short("BurnTime", 0);
- $this->namedtag->CookTime = new Short("CookTime", 0);
- $this->namedtag->BurnTicks = new Short("BurnTicks", 0);
- }
- foreach($this->getInventory()->getViewers() as $player){
- $windowId = $player->getWindowId($this->getInventory());
- if($windowId > 0){
- $pk = new ContainerSetDataPacket();
- $pk->windowid = $windowId;
- $pk->property = 0; //Smelting
- $pk->value = floor($this->namedtag["CookTime"]);
- $player->dataPacket($pk);
- $pk = new ContainerSetDataPacket();
- $pk->windowid = $windowId;
- $pk->property = 1; //Fire icon
- $pk->value = $this->namedtag["BurnTicks"];
- $player->dataPacket($pk);
- }
- }
- $this->lastUpdate = microtime(true);
- $this->timings->stopTiming();
- return $ret;
- }
-
- public function getSpawnCompound(){
- $nbt = new Compound("", [
- new String("id", Tile::FURNACE),
- new Int("x", (int) $this->x),
- new Int("y", (int) $this->y),
- new Int("z", (int) $this->z),
- new Short("BurnTime", $this->namedtag["BurnTime"]),
- new Short("CookTime", $this->namedtag["CookTime"]),
- new Short("BurnDuration", $this->namedtag["BurnTicks"])
- ]);
-
- if($this->hasName()){
- $nbt->CustomName = $this->namedtag->CustomName;
- }
- return $nbt;
- }
- }