Фильтр на предметы.

Версия Minecraft
1.7.10
90
1
Здравствуйте. Как сделать так чтоб в слот моего блока можно было положить только конкретную вещь, например только камень или дубовые доски. А все остальное положить в данный слот нельзя было бы. Что нужно прописать и где? В Tile моего блока?
 
Ты гуи всегда одно и то же открываешь.
Просто return new ... сделай.
 
Thunder написал(а):
зачем тебе глобальная переменная гуи. убери ее вообще и возвращай только новые обьекты

Вообще это костыль. так как когда я всегда новые экземпляры возвращаю, то дичь творится: Все вещи которые я кладу в слот удваиваются. и при попытке нажать на слот ЛКМ, если в нём что то есть то он очищается. Вот как бы эту проблему решить..
 
Doc написал(а):
Пссс, код скинь...

Вот код всего что есть:
public class BlockTestContainer extends Container {
   public BlockTestTile testTile;
   private int z=0;

   public BlockTestContainer(InventoryPlayer player,BlockTestTile tile){
       testTile=tile;


       addSlotToContainer(new TestSlot(tile,0,79,40));//8+4*18 8 -отступ от края, 18-длина одной ячейки

       int i;

       for (i = 0; i < 3; ++i)
       {
           for (int j = 0; j < 9; ++j)
           {
               this.addSlotToContainer(new Slot(player, j + i * 9 + 9, 8 + j * 18, 84 + i * 18));
           }
       }

       for (i = 0; i < 9; ++i)
       {
           this.addSlotToContainer(new Slot(player, i, 8 + i * 18, 142));
       }
   }

   @Override
   public ItemStack transferStackInSlot(EntityPlayer playerIn, int fromSlot) {
       ItemStack itemstack = null;
       Slot slot = (Slot)this.inventorySlots.get(fromSlot);

       if (slot != null && slot.getHasStack())
       {
           ItemStack itemstack1 = slot.getStack();
           itemstack = itemstack1.copy();

           if (fromSlot < 9)
           {
               if (!this.mergeItemStack(itemstack1, 9, this.inventorySlots.size(), true))
               {
                   return null;
               }
           }
           else if (!this.mergeItemStack(itemstack1, 0, 9, false))
           {
               return null;
           }
          // BlockTestGuiHandler
           if (itemstack1.stackSize == 0)
           {
               slot.putStack((ItemStack)null);
           }
           else
           {
               slot.onSlotChanged();
           }
       }
       return itemstack;
   }

   @Override
   public boolean canInteractWith(EntityPlayer player) {
       return testTile.isUseableByPlayer(player);
   }

}
метод из класса блока с гуи
@Override
public boolean onBlockActivated(World world, int x, int y, int z, EntityPlayer player,
                               int p_149727_6_, float p_149727_7_, float p_149727_8_, float p_149727_9_) {
 
   tile = (BlockTestTile) world.getTileEntity(x, y, z);
   if (tile != null) {
       if (!player.isSneaking()&&!world.isRemote) {
           player.openGui(instance, 0, world, x, y, z);
           return true;
       } else {
           return false;
       }


   } else return false;
public class BlockTestGuiHandler implements IGuiHandler {
   @Override
   public Object getServerGuiElement(int ID, EntityPlayer player, World world, int x, int y, int z) {
       switch (ID) {
           case 0: {
               if (world.getBlock(x, y, z).equals(TestMod.BlockTest)) {
                   return new BlockTestContainer(player.inventory, BlockTest.tile);
               }
           }
       }
       return null;
   }

   @SideOnly(Side.CLIENT)
   @Override
   public Object getClientGuiElement(int ID, EntityPlayer player, World world, int x, int y, int z) {
           switch (ID) {
               case 0: {
                   if (world.getBlock(x, y, z).equals(TestMod.BlockTest))
                       return new TestBlockGui(player.inventory, BlockTest.tile);
               }

       }
       return null;
   }
}
public class BlockTestTile extends TileEntity implements ISidedInventory,IPipeConnection{
   private ItemStack[] testItemStack=new ItemStack[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 testItemStack.length;
   }

   @Override
   public ItemStack getStackInSlot(int index) {
       if (index < 0 || index >= this.getSizeInventory())
           return null;
       return this.testItemStack[index];
   }

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

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

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

               return itemstack;
           }
       }
       else
       {
           return null;
       }
   }

   @Override
   public ItemStack getStackInSlotOnClosing(int p_70304_1_) {

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

   @SideOnly(Side.CLIENT)
   @Override
   public void setInventorySlotContents(int index, ItemStack stack) {
           if(stack!=null) {
         //      if (stack.getItem().equals(ItemLoader.filter) || stack.getItem().equals(ItemLoader.charcoalFilter)) {
               this.testItemStack[index] = stack;

               if (stack.stackSize > this.getInventoryStackLimit()) {

                       stack.stackSize = this.getInventoryStackLimit();
                   }
                   //System.out.println("stack: "+Integer.toString(stack.stackSize));
                   //System.out.println("index: "+Integer.toString(index));
               }
          // }
   }

   @Override
   public String getInventoryName() {
       return "TestInventory";
   }

   @Override
   public boolean hasCustomInventoryName() {
       return true;
   }

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

   @Override
   public boolean isUseableByPlayer(EntityPlayer p_70300_1_) {
       return this.worldObj.getTileEntity(this.xCoord, this.yCoord, this.zCoord) != this ? false : p_70300_1_.getDistanceSq((double)this.xCoord + 0.5D,
               (double)this.yCoord + 0.5D, (double)this.zCoord + 0.5D) <= 64.0D;
   }

   @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() == Item.getItemFromBlock(Blocks.cobblestone);
       } else return false;
   }



   @Override
   public ConnectOverride overridePipeConnection(IPipeTile.PipeType pipeType, ForgeDirection forgeDirection) {
       if(pipeType!= IPipeTile.PipeType.ITEM) {
           return ConnectOverride.CONNECT;
       }else {
           return ConnectOverride.DISCONNECT;
       }
   }
}
@SideOnly(Side.CLIENT)
public class TestBlockGui extends GuiContainer {
   public TestBlockGui(InventoryPlayer inventory, BlockTestTile testTile){
       super(new BlockTestContainer(inventory,testTile));
   }
   private ResourceLocation location=new ResourceLocation(TestMod.MODID+":textures/gui/testui.png");
   @Override
   protected void drawGuiContainerBackgroundLayer(float p_146976_1_, int p_146976_2_, int p_146976_3_) {
       GL11.glColor4f(1F,1F,1F,1F);
       mc.renderEngine.bindTexture(location);
       int q=(width-xSize)/2;
       int ui=(height-ySize)/2;
       drawTexturedModalRect(q,ui,0,0,xSize,ySize);

   }
}
@Mod(modid="testmod" /*идентификатор мода*/,name="Test Mod" /*имя мода*/,version="1.0")
public class TestMod {
   public static final String MODID = "testMod";
   public static final String VERSION = "1.0";

   // Объявляем новый блок
   public static Block BlockTest;
   public static Fluid testFluid = new Fluid("testFluid");
   public static Block fluidBlock;

   @Mod.Instance(MODID)
   public static TestMod INSTANCE;

   @Mod.EventHandler
   public void preInit(FMLPreInitializationEvent event) {
       // Определяем, что BlockTest - это блок с материалом "Камень (rock)"
       // Далее регистрируем его в Forge под уникальным именем "testblock"
       BlockTest = (new BlockTest(Material.rock,this));
       GameRegistry.registerBlock(BlockTest, "testblock");
       LanguageRegistry.addName(BlockTest, "Test");
       //Minecraft
       //Block
       /*FluidRegistry.registerFluid(testFluid);
       fluidBlock = new BlockTestFluid(testFluid, TestMaterial.getTestMaterial());
       GameRegistry.registerBlock(fluidBlock, "testfluid");
       LanguageRegistry.addName(fluidBlock, "Test fluid");
       FluidContainerRegistry.registerFluidContainer(testFluid,new ItemStack(ItemLoader.freshWaterBucket),
               new ItemStack(Items.bucket));*/
       //TransportR

       //BlockFurnace

       GameRegistry.registerTileEntity(BlockTestTile.class,MODID+":BlockTestTile");
   }
   @Mod.EventHandler
   public void postInit(FMLPostInitializationEvent event){
       //MinecraftForge.EVENT_BUS.register(BucketHandler.INSTANCE);
   }
   @Mod.EventHandler
   public void Init(FMLInitializationEvent event){
       NetworkRegistry.INSTANCE.registerGuiHandler(this,new BlockTestGuiHandler());

   }


}


Thunder написал(а):
Наверное проблема в контейнере тогда, наверное

Я тут классы все скинул чуть выше. Не подскажешь, в чем может быть проблема? Уже всю голову сломал над этим


Нашел НЕкостыльное решение: в GuiHandler нужно в обоих методах использовать (BlockTestTile)world.getTileEntity(x,y,z));
Спасибо всем за помощь!)
 
Назад
Сверху