- 28
- 0
Я прочитал эту статью, а затем я сделал GUI. Перевод - Графический интерфейс пользователя с блоком хранения
Я пытаюсь реализовать, что если я нажму кнопку «положить», элемент в первом слоте будет удален, индикатор будет заполнен один за другим, и если я нажму кнопку четыре раза, конкретный элемент будет быть добавлен в центральный слот. Все работает, но есть проблема: после удаления предмета из слота я закрываю инвентарь, снова кликаю на блок или щелкаю в слоте и возвращаюсь к нему до удаления предмета. Также, если я попытаюсь отнести добавленный предмет посередине к инвентарю, он будет удален; я хочу правильно удалить или добавить элементы в определенный слот в графическом интерфейсе. Я думаю, что есть проблема с запоминающим устройством, но я не знаю, как ее решить.
Я пытаюсь реализовать, что если я нажму кнопку «положить», элемент в первом слоте будет удален, индикатор будет заполнен один за другим, и если я нажму кнопку четыре раза, конкретный элемент будет быть добавлен в центральный слот. Все работает, но есть проблема: после удаления предмета из слота я закрываю инвентарь, снова кликаю на блок или щелкаю в слоте и возвращаюсь к нему до удаления предмета. Также, если я попытаюсь отнести добавленный предмет посередине к инвентарю, он будет удален; я хочу правильно удалить или добавить элементы в определенный слот в графическом интерфейсе. Я думаю, что есть проблема с запоминающим устройством, но я не знаю, как ее решить.
test - Streamable
Check out this video on Streamable using your phone, tablet or desktop.
streamable.com
Container Class:
public class BreadContainer extends Container {
private TileEntityBreadFurnace te;
public static int bread_int = 0;
public BreadContainer(IInventory inventory, TileEntityBreadFurnace te) {
this.te = te;
addCustomSlots(inventory);
addPlayerSlots(inventory);
}
private void addPlayerSlots(IInventory inventory) {
for(int row=0;row<3;++row) {
for(int col = 0; col < 9; ++ col) {
int x = 8 + col * 18;
int y = row * 18 + 84;
this.addSlotToContainer(new Slot(inventory,col + row * 9 + 10,x,y));
}
}
for(int row = 0; row < 9; ++row) {
int x = 8 + row * 18;
int y = 58 + 84;
this.addSlotToContainer(new Slot(inventory,row,x,y));
}
}
private void addCustomSlots(IInventory inventory) {
IItemHandler iItemHandler = this.te.getCapability(CapabilityItemHandler.ITEM_HANDLER_CAPABILITY, null);
int slotIndex = 0;
addSlotToContainer(new SlotItemHandler(iItemHandler,slotIndex++,26,38));
addSlotToContainer(new SlotItemHandler(iItemHandler,slotIndex++,79,33));
addSlotToContainer(new SlotItemHandler(iItemHandler,slotIndex++,133,38));
BreadContainerGui.slot0 = (SlotItemHandler)getSlot(0);
BreadContainerGui.slot1 = (SlotItemHandler)getSlot(1);
BreadContainerGui.slot2 = (SlotItemHandler)getSlot(2);
}
@Override
public ItemStack transferStackInSlot(EntityPlayer playerIn, int index) {
ItemStack itemstack = ItemStack.EMPTY;
Slot slot = this.inventorySlots.get(index);
if (slot != null && slot.getHasStack()) {
ItemStack itemstack1 = slot.getStack();
itemstack = itemstack1.copy();
if (index < TileEntityBreadFurnace.SIZE) {
if (!this.mergeItemStack(itemstack1, TileEntityBreadFurnace.SIZE, this.inventorySlots.size(), true)) {
return ItemStack.EMPTY;
}
} else if (!this.mergeItemStack(itemstack1, 0, TileEntityBreadFurnace.SIZE, false)) {
return ItemStack.EMPTY;
}
if (itemstack1.isEmpty()) {
slot.putStack(ItemStack.EMPTY);
} else {
slot.onSlotChanged();
}
}
return itemstack;
}
@Override
public boolean canInteractWith(EntityPlayer playerIn) {
return true;
}
}
GuiContainer Class:
public class BreadContainerGui extends GuiContainer {
public static final int WIDTH = 176, HEIGHT = 166;
public static SlotItemHandler slot0,slot1,slot2;
private static final ResourceLocation background = new ResourceLocation(ChickenSkin.MODID, "textures/gui/furnace.png");
public BreadContainerGui(BreadContainer container) {
super(container);
xSize = WIDTH;
ySize = HEIGHT;
}
@Override
public void initGui() {
super.initGui();
this.buttonList.add(new GuiCustomButton(0,guiLeft + 15,guiTop + 60,fontRenderer.getStringWidth("ssss") + 7,12,"put"));
this.buttonList.add(new GuiCustomButton(1,guiLeft + 122,guiTop + 60,fontRenderer.getStringWidth("ssss") + 7,12,"put"));
}
@Override
protected void drawGuiContainerForegroundLayer(int mouseX, int mouseY) {
drawCenteredString(mc.fontRenderer,"FISH MACHINE", 88,5,new Color(255,255,255).getRGB());
drawCenteredString(mc.fontRenderer,String.valueOf(BreadContainer.bread_int),88,20,new Color(255,255,255).getRGB());
mc.getTextureManager().bindTexture(background);
if(BreadContainer.bread_int == 0) {
drawTexturedModalRect(79,56,176,13,17,0);
}
else if(BreadContainer.bread_int == 1) {
drawTexturedModalRect(79,56,176,13,17,6);
}
else if(BreadContainer.bread_int == 2) {
drawTexturedModalRect(79,56,176,13,17,12);
}
else if(BreadContainer.bread_int == 3) {
drawTexturedModalRect(79,56,176,13,17,18);
}
else if(BreadContainer.bread_int == 4) {
drawTexturedModalRect(79,56,176,13,17,24);
}
else if(BreadContainer.bread_int >= 5) {
slot1.putStack(new ItemStack(Items.COOKED_FISH));
BreadContainer.bread_int = 0;
}
}
@Override
protected void actionPerformed(GuiButton button) throws IOException {
switch (button.id) {
case 0:
if(slot0.getStack().getItem() == Items.FISH && slot2.getStack().getItem() == Items.FLINT_AND_STEEL) {
slot0.getStack().setCount(slot0.getStack().getCount() - 1);
slot2.getStack().setCount(slot0.getStack().getCount() - 1);
BreadContainer.bread_int++;
}
}
}
@Override
public void updateScreen() {
super.updateScreen();
}
@Override
protected void drawGuiContainerBackgroundLayer(float partialTicks, int mouseX, int mouseY) {
drawDefaultBackground();
mc.getTextureManager().bindTexture(background);
drawTexturedModalRect(guiLeft,guiTop,0,0,xSize,ySize);
}
}
TileEntity Class:
public class TileEntityBreadFurnace extends TileEntity {
public static final int SIZE = 3;
private ItemStackHandler itemStackHandler = new ItemStackHandler(SIZE) {
@Override
protected void onContentsChanged(int slot) {
TileEntityBreadFurnace.this.markDirty();
}
};
@Override
public void readFromNBT(NBTTagCompound compound) {
super.readFromNBT(compound);
if(compound.hasKey("items")) {
itemStackHandler.deserializeNBT((NBTTagCompound)compound.getTag("items"));
}
}
@Override
public NBTTagCompound writeToNBT(NBTTagCompound compound) {
super.writeToNBT(compound);
compound.setTag("items", itemStackHandler.serializeNBT());
return compound;
}
public boolean canInteractWith(EntityPlayer player) {
return !isInvalid() && player.getDistanceSq(pos.add(0.5D,0.5D,0.5D)) <= 64D;
}
@Override
public boolean hasCapability(Capability<?> capability, @Nullable EnumFacing facing) {
if(capability == CapabilityItemHandler.ITEM_HANDLER_CAPABILITY) {
return true;
}
return super.hasCapability(capability,facing);
}
@Override
public <T> T getCapability(Capability<T> capability, @Nullable EnumFacing facing) {
if(capability == CapabilityItemHandler.ITEM_HANDLER_CAPABILITY) {
return CapabilityItemHandler.ITEM_HANDLER_CAPABILITY.cast(itemStackHandler);
}
return super.getCapability(capability, facing);
}
}