Обновление слота

Версия Minecraft
1.7.10
90
1
Здравствуйте. Возникла проблема с обновлением слота. У меня есть кастомный гуи для моего механизма с 2-мя слотами. В процессе работы этого механизма используются фильтры. Они кладутся в верхний слот. После того как фильтр загрязнился, он исчезает, а в нижний слот добавляется загрязненный фильтр. Проблема в том, что когда в нижнем слоте уже есть один загрязненный фильтр, то после добавления еще одного по идее их должно быть 2 в нижнем слоте. Но если не нажимать на слот, то число предметов в слоте  графически не меняется. На самом деле их количество увеличивается, как и должно быть. То есть пока не нажмешь на слот и не возьмешь из него эти грязные фильтры то не узнаешь сколько их там, как будто один. Короче, не происходит графического обновления количества предметов в стаке в слоте. Фильтры добавляю в слот в методе litterFilter.
Код конечно грязный, но это черновая модель, потом весь мусор убирается. Это test-версия =)
Как это исправить и обновить слот?
public class BlockTestTile extends TileEntity implements ISidedInventory,IPipeConnection,IFluidHandler{
   private String inventoryTitle="CustomName";
   public int idBlock=new Random().nextInt();
   public boolean activeBlock=false;
   private int slotsCount=2;
   private ItemStack[] inventoryContents;
   private List field_70480_d;
   private boolean field_94051_e;
   public static final int SLOTCOUNT=2;
   public final Tank tank1;
   public final Tank tank2;
   public TankManager<Tank> tankManager;

   long startTime=new Date().getTime();
   int t=0;
   int damage=0;

   public BlockTestTile(String inventoryTitle, boolean p_i1561_2_)
   {
       if(this.inventoryContents==null) {
           this.inventoryContents = new ItemStack[SLOTCOUNT];
       }

       this.inventoryTitle = inventoryTitle;
       this.field_94051_e = p_i1561_2_;
       this.slotsCount = SLOTCOUNT;
       tank1 = new Tank("tank", 16000, this);
       tank2=new Tank("tank2",16000,this);
       tankManager= new TankManager<>();
       this.tankManager.add(this.tank1);
       this.tankManager.add(this.tank2);
//     activeBlock=worldObj.isBlockIndirectlyGettingPowered(xCoord,yCoord,zCoord);

   }
   public BlockTestTile(){
       if(this.inventoryContents==null) {
           this.inventoryContents = new ItemStack[SLOTCOUNT];
       }
       tank1 = new Tank("tank", 16000, this);
       tank2=new Tank("tank2",16000,this);
       tankManager= new TankManager<>();
       this.tankManager.add(this.tank1);
       this.tankManager.add(this.tank2);
      // tankManager= new TankManager<>();
      // this.tankManager.add(this.tank);
      // ContainerFurnace
   }

   public void func_110134_a(IInvBasic p_110134_1_)
   {
       if (this.field_70480_d == null)
       {
           this.field_70480_d = new ArrayList();
       }

       this.field_70480_d.add(p_110134_1_);
   }

   public void func_110132_b(IInvBasic p_110132_1_)
   {
       this.field_70480_d.remove(p_110132_1_);
   }

   public void func_110133_a(String p_110133_1_)
   {
       this.field_94051_e = true;
       this.inventoryTitle = p_110133_1_;
   }

   @Override
   public int[] getAccessibleSlotsFromSide(int p_94128_1_) {
       return new int[0];
   }

   @Override
   public boolean canInsertItem(int p_102007_1_, ItemStack p_102007_2_, int p_102007_3_) {
       return this.isItemValidForSlot(p_102007_1_, p_102007_2_);
   }

   @Override
   public boolean canExtractItem(int p_102008_1_, ItemStack p_102008_2_, int p_102008_3_) {
       return false;
   }

   @Override
   public int getSizeInventory()
   {
       return this.slotsCount;
   }

   @Override
   public ItemStack getStackInSlot(int index) {
       //Minecraft.getMinecraft().thePlayer.sendChatMessage("SLOT: "+index);
       if(this.inventoryContents!=null){
           return index >= 0 && index < this.inventoryContents.length ? this.inventoryContents[index] : null;
       }else
           return null;

   }

   @Override
   public ItemStack decrStackSize(int p_70298_1_, int p_70298_2_) {
       if (this.inventoryContents[p_70298_1_] != null)
       {
           ItemStack itemstack;

           if (this.inventoryContents[p_70298_1_].stackSize <= p_70298_2_)
           {
               itemstack = this.inventoryContents[p_70298_1_];
               this.inventoryContents[p_70298_1_] = null;
               this.markDirty();
               return itemstack;
           }
           else
           {
               itemstack = this.inventoryContents[p_70298_1_].splitStack(p_70298_2_);

               if (this.inventoryContents[p_70298_1_].stackSize == 0)
               {
                   this.inventoryContents[p_70298_1_] = null;
               }

               this.markDirty();
               return itemstack;
           }
       }
       else
       {
           return null;
       }
   }

   @Override
   public ItemStack getStackInSlotOnClosing(int p_70304_1_) {

       if (this.inventoryContents[p_70304_1_] != null)
       {
           ItemStack itemstack = this.inventoryContents[p_70304_1_];
           this.inventoryContents[p_70304_1_] = null;
           return itemstack;
       }
       else
       {
           return null;
       }

   }

   @SideOnly(Side.CLIENT)
   @Override
   public void setInventorySlotContents(int index, ItemStack stack) {
       if(this.inventoryContents!=null) {
           this.inventoryContents[index] = stack;
           if(stack!=null&&stack.getItem()==ItemLoader.filter) {
               damage = stack.getItemDamage();//Нужно проверить!
               Minecraft.getMinecraft().thePlayer.sendChatMessage("item: "+stack.getItem()+", damage: " + damage);
           }


           if (stack != null && stack.stackSize > this.getInventoryStackLimit()) {
               stack.stackSize = this.getInventoryStackLimit();

           }

           this.markDirty();
       }

   }
   @Override
   public void markDirty()
   {
       if (this.field_70480_d != null)
       {
           for (int i = 0; i < this.field_70480_d.size(); ++i)
           {
               ((IInventory)this.field_70480_d.get(i)).markDirty();
           }
       }
   }

   @Override
   public String getInventoryName()
   {
       return this.hasCustomInventoryName() ? this.inventoryTitle : "container.testblock";
   }

   @Override
   public boolean hasCustomInventoryName()
   {
       return this.field_94051_e;
   }

   @Override
   public int getInventoryStackLimit() {
       return 1;
   }

   @Override
   public boolean isUseableByPlayer(EntityPlayer p_70300_1_)
   {
       return true;
   }

   @Override
   public void openInventory() {}

   @Override
   public void closeInventory() {}

   @Override
   public boolean isItemValidForSlot(int p_94041_1_, ItemStack p_94041_2_) {
       if(p_94041_2_!=null){
           return p_94041_2_.getItem() == ItemLoader.filter;
       } else return false;
       //return true;
   }
       //TO DO
   @Override
   public void readFromNBT(NBTTagCompound data) {
       super.readFromNBT(data);
       System.out.println("READ");
       NBTTagList nbttaglist = data.getTagList("Items", 10);
       inventoryContents = new ItemStack[2];

       if (data.hasKey("CustomName", 8))
       {
           this.inventoryTitle = data.getString("CustomName");
       }

       for (int i = 0; i < nbttaglist.tagCount(); i++)
       {
           NBTTagCompound nbttagcompound1 = nbttaglist.getCompoundTagAt(i);
           int j = nbttagcompound1.getByte("Slot") & 255;

           if (j >= 0 && j < this.inventoryContents.length)
           {
               this.inventoryContents[j] = ItemStack.loadItemStackFromNBT(nbttagcompound1);
           }
           boolean acBl=nbttagcompound1.getBoolean("powerActive");
           activeBlock=acBl;
           try {
               System.out.println("ACTIVE BLOCK READ " + activeBlock);
               Minecraft.getMinecraft().thePlayer.sendChatMessage("ACTIVE BLOCK READ " + activeBlock);
           }catch (Exception e){

           }
       }
   }
       //TO DO
   @Override
   public void writeToNBT(NBTTagCompound data) {
       super.writeToNBT(data);
       System.out.println("WRITE");
       NBTTagList nbttaglist = new NBTTagList();

       for (int i = 0; i < this.inventoryContents.length; i++)
       {
           if (this.inventoryContents != null)
           {
               NBTTagCompound nbttagcompound1 = new NBTTagCompound();
               nbttagcompound1.setByte("Slot", (byte)i);
               nbttagcompound1.setBoolean("powerActive",activeBlock);
               System.out.println("ACTIVE BLOCK WRITE "+activeBlock);
               Minecraft.getMinecraft().thePlayer.sendChatMessage("ACTIVE BLOCK WRITE "+activeBlock);
               this.inventoryContents.writeToNBT(nbttagcompound1);

               nbttaglist.appendTag(nbttagcompound1);
           }
       }

       data.setTag("Items", nbttaglist);

       if (this.hasCustomInventoryName())
       {
           data.setString("CustomName", this.inventoryTitle);
       }
   }

   @Override
   public ConnectOverride overridePipeConnection(IPipeTile.PipeType pipeType, ForgeDirection forgeDirection) {
       if(pipeType!= IPipeTile.PipeType.ITEM) {
           return ConnectOverride.CONNECT;
       }else {
           return ConnectOverride.DISCONNECT;
       }
   }

   public ItemStack[] getInventoryContents() {
       return inventoryContents;
   }



   public FluidTankInfo[] getTankInfo(ForgeDirection direction) {
       return this.tankManager.getTankInfo(direction);
   }
   @Override
   public int fill(ForgeDirection from, FluidStack resource, boolean doFill) {
       if(resource != null && resource.getFluid() != null) {
           if(resource.getFluid()==FluidRegistry.WATER) {
              // tank2.fill(new FluidStack(TestMod.testFluid,resource.amount), doFill);
               return this.tank1.fill(resource, doFill);

           } else if(resource.getFluid()==TestMod.testFluid)
           {
               return this.tank2.fill(resource, doFill);
           }else
               return 0;
           }else
               return 0;

   }

   @Override
   public FluidStack drain(ForgeDirection from, FluidStack resource, boolean doDrain) {
       if(resource==null){
           return null;
       }//else if(activeBlock){
        //   tank.getFluid().amount-=100;
           if(tank2.getFluid()!=null) {
               //try {
                  //Minecraft.getMinecraft().thePlayer.sendChatMessage("amount1: " + tank1.getFluid().amount);
                   //Minecraft.getMinecraft().thePlayer.sendChatMessage("amount2: " + resource.amount);
               //} catch (Exception e) {
                //   e.printStackTrace();
              // }
               //this.tank1.drain(resource.amount, doDrain);
              // Minecraft.getMinecraft().thePlayer.sendChatMessage("amount: " + resource.amount);
               //Слив из аппарата в трубу?
               return tank2.drain(resource.amount,doDrain);
           /*if(FluidRegistry.WATER == resource.getFluid()){
              return this.tank.drain(resource.amount, doDrain);
           }else {
               return null;

           }*/
           }else return null;
      // }else return null;
      // return null;
       //return resource == null?null:(this.tankCoolant.getFluidType() == resource.getFluid()?this.tankCoolant.drain(resource.amount, doDrain):(this.tankFuel.getFluidType() == resource.getFluid()?this.tankFuel.drain(resource.amount, doDrain):null));
   }

   @Override
   public FluidStack drain(ForgeDirection from, int maxDrain, boolean doDrain) {
     //  return this.tank.drain(maxDrain, doDrain);
       //if(tank1.getFluid()!=null&&activeBlock) {
     //  if(activeBlock){
          // this.tank1.drain(maxDrain, doDrain);
       Minecraft.getMinecraft().thePlayer.sendChatMessage("amount: " + maxDrain);
           return tank2.drain(maxDrain,doDrain);
       //}else return null;


   }

   public boolean canFill(ForgeDirection from, Fluid fluid) {

       return fluid==FluidRegistry.WATER;
   }

   public boolean canDrain(ForgeDirection from, Fluid fluid) {

       return fluid==TestMod.testFluid;
   }

  @Override
   public void updateEntity() {
       super.updateEntity();
       //try {
           //if (inventoryContents[0] != null && inventoryContents[0].equals(new ItemStack(ItemLoader.filter))) {
       if(!worldObj.isRemote) {
          // long a = new Date().getTime();

           //System.out.println("INVENTORY :"+(inventoryContents[0] != null &&inventoryContents[0].getItem().equals(ItemLoader.filter)));
           if (checkCondition()) {
               if(new Date().getTime()%1000<50){
                   clearWater();
               }
               //true раз в секунду
             //  timer.scheduleAtFixedRate(task,0,1000);
               //if ((a - startTime) > 1000) {

                   //}

                   //tank2.fill(new FluidStack(TestMod.testFluid,tank1.drain(100, true).amount), true);
                   //}
                //  startTime = a;
               //}

           }
       }
           //Minecraft.getMinecraft().thePlayer.sendChatMessage("update event");
     //  }catch (Exception e){
       //    e.printStackTrace();
      // }

   }

   /*public int getFluidLightLevel() {
       FluidStack tankFluid = this.tank.getFluid();
       return tankFluid != null && tankFluid.amount != 0?tankFluid.getFluid().getLuminosity(tankFluid):0;
   }

   public int calculateComparatorInputOverride() {
       FluidTankInfo[] info = this.getTankInfo(ForgeDirection.UNKNOWN);
       return info.length > 0 && info[0] != null && info[0].fluid != null?info[0].fluid.amount * 15 / info[0].capacity:0;
   }


   public int getComparatorInputOverride() {
       return this.cachedComparatorOverride;
   }*/
   public void litterFilter(int damage,ItemStack[] inventory){
       System.out.println("INVLITTER: "+inventoryContents.length);
       ItemStack dirtyFilter=new ItemStack(ItemLoader.dirtyFilter);
       if(damage>=5){
          // int countDirtyFilter;
           if(inventory[1]!=null){
               dirtyFilter.stackSize=inventory[1].stackSize+1;
               inventory[0]=null;
               inventory[1]=dirtyFilter;
           }else {
               inventory[0]=null;
               inventory[1]=dirtyFilter;
              // countDirtyFilter=0;
           }


           /*if(!inventory[0].equals(dirtyFilter)) {
               inventory[0] = dirtyFilter;
           }*/


       }
   }
   public boolean checkCondition(){
       if(inventoryContents[0] != null &&inventoryContents[0].getItem().equals(ItemLoader.filter)){
           return tank1.getFluid() != null && activeBlock;
       }else return false;
   }
           public void clearWater() {
               t+=20;
               if (t == 400) {
                   damage++;
                   inventoryContents[0].setItemDamage(damage);
                   t = 0;
                   System.out.println("INV: "+inventoryContents.length);
                   litterFilter(damage, inventoryContents);
                   Minecraft.getMinecraft().thePlayer.sendChatMessage("damage: " + damage);
               }
               // System.out.println("TIME: " + (a - startTime));
               //if (tank1.getFluid() != null) {
               tank1.drain(30, true);
               tank2.fill(new FluidStack(TestMod.testFluid, 20), true);

               try {
                   Minecraft.getMinecraft().thePlayer.sendChatMessage("V water: " + tank1.getFluid().amount);
                   Minecraft.getMinecraft().thePlayer.sendChatMessage("V fresh water: " + tank2.getFluid().amount);
                   Minecraft.getMinecraft().thePlayer.sendChatMessage("t: " + t);
               }catch (Exception e){
                   e.printStackTrace();
               }
           }
}
 
Назад
Сверху