40    private const TAG_FIRST_INPUT_ITEM = 
"Item1"; 
 
   41    private const TAG_SECOND_INPUT_ITEM = 
"Item2"; 
 
   42    private const TAG_THIRD_INPUT_ITEM = 
"Item3"; 
 
   43    private const TAG_FOURTH_INPUT_ITEM = 
"Item4"; 
 
   45    private const TAG_FIRST_COOKING_TIME = 
"ItemTime1"; 
 
   46    private const TAG_SECOND_COOKING_TIME = 
"ItemTime2"; 
 
   47    private const TAG_THIRD_COOKING_TIME = 
"ItemTime3"; 
 
   48    private const TAG_FOURTH_COOKING_TIME = 
"ItemTime4"; 
 
   52    private array $cookingTimes = [];
 
   55        parent::__construct($world, $pos);
 
   57        $this->inventory->getListeners()->add(CallbackInventoryListener::onAnyChange(
 
   58            static function(
Inventory $unused) use ($world, $pos) : 
void{
 
   60                if($block instanceof BlockCampfire){
 
   68        return $this->inventory;
 
   72        return $this->inventory;
 
   80        return $this->cookingTimes;
 
 
   88        $this->cookingTimes = $cookingTimes;
 
 
   91    public function readSaveData(
CompoundTag $nbt) : void{
 
   93        $listeners = $this->inventory->getListeners()->toArray();
 
   94        $this->inventory->getListeners()->remove(...$listeners); 
 
   96        $baseErrorContext = 
"Campfire ($this->position)";
 
   98            [0, self::TAG_FIRST_INPUT_ITEM, self::TAG_FIRST_COOKING_TIME],
 
   99            [1, self::TAG_SECOND_INPUT_ITEM, self::TAG_SECOND_COOKING_TIME],
 
  100            [2, self::TAG_THIRD_INPUT_ITEM, self::TAG_THIRD_COOKING_TIME],
 
  101            [3, self::TAG_FOURTH_INPUT_ITEM, self::TAG_FOURTH_COOKING_TIME],
 
  102        ] as [$slot, $itemTag, $cookingTimeTag]){
 
  104                $items[$slot] = Item::safeNbtDeserialize($tag, 
"$baseErrorContext slot $slot");
 
  106            if(($tag = $nbt->
getTag($cookingTimeTag)) instanceof IntTag){
 
  107                $this->cookingTimes[$slot] = $tag->getValue();
 
  110        $this->inventory->setContents($items);
 
  111        $this->inventory->getListeners()->add(...$listeners);
 
  116            [0, self::TAG_FIRST_INPUT_ITEM, self::TAG_FIRST_COOKING_TIME],
 
  117            [1, self::TAG_SECOND_INPUT_ITEM, self::TAG_SECOND_COOKING_TIME],
 
  118            [2, self::TAG_THIRD_INPUT_ITEM, self::TAG_THIRD_COOKING_TIME],
 
  119            [3, self::TAG_FOURTH_INPUT_ITEM, self::TAG_FOURTH_COOKING_TIME],
 
  120        ] as [$slot, $itemTag, $cookingTimeTag]){
 
  121            $item = $this->inventory->getItem($slot);
 
  122            if(!$item->isNull()){
 
  123                $nbt->setTag($itemTag, $item->nbtSerialize());
 
  124                if(isset($this->cookingTimes[$slot])){
 
  125                    $nbt->setInt($cookingTimeTag, $this->cookingTimes[$slot]);
 
 
  133            0 => self::TAG_FIRST_INPUT_ITEM,
 
  134            1 => self::TAG_SECOND_INPUT_ITEM,
 
  135            2 => self::TAG_THIRD_INPUT_ITEM,
 
  136            3 => self::TAG_FOURTH_INPUT_ITEM
 
  138            $item = $this->inventory->getItem($slot);
 
  139            if(!$item->isNull()){
 
  140                $nbt->setTag($tag, TypeConverter::getInstance()->getItemTranslator()->toNetworkNbt($item));