Проблема с GUI. Как создать inventory для блока.

Ari

38
0
Вот есть у меня код который открывает GUI:
Код:
package com.example.examplemod;

import net.minecraft.client.Minecraft;
import net.minecraft.entity.player.EntityPlayer;
import net.minecraft.entity.player.InventoryPlayer;
import net.minecraft.inventory.Container;
import net.minecraft.inventory.IInventory;
import net.minecraft.inventory.InventoryBasic;
import net.minecraft.inventory.Slot;
import net.minecraft.item.ItemStack;
import net.minecraft.tileentity.TileEntity;
import net.minecraft.world.World;

public class ContainerDryingRack extends Container {
    public InventoryPlayer i;
    public static int slotID;
    public ContainerDryingRack(InventoryPlayer inventory, TileEntityDryingRack dryingRack) 
    {
        System.out.print("OpenGUI ID:" + ExampleMod.index);
        i = inventory;
        this.addSlotToContainer(new Slot(inventory, /*Slot ID-->*/0, 8, 142));
        this.addSlotToContainer(new Slot(inventory, /*Slot ID-->*/1, 26, 142));
        this.addSlotToContainer(new Slot(inventory, /*Slot ID-->*/2, 44, 142));
        this.addSlotToContainer(new Slot(inventory, /*Slot ID-->*/3, 62, 142));
        this.addSlotToContainer(new Slot(inventory, /*Slot ID-->*/4, 80, 142));
        this.addSlotToContainer(new Slot(inventory, /*Slot ID-->*/5, 98, 142));
        this.addSlotToContainer(new Slot(inventory, /*Slot ID-->*/6, 116, 142));
        this.addSlotToContainer(new Slot(inventory, /*Slot ID-->*/7, 134, 142));
        this.addSlotToContainer(new Slot(inventory, /*Slot ID-->*/8, 152, 142));
        
        this.addSlotToContainer(new Slot(inventory, /*Slot ID-->*/9, 8, 84));
        this.addSlotToContainer(new Slot(inventory, /*Slot ID-->*/10, 26, 84));
        this.addSlotToContainer(new Slot(inventory, /*Slot ID-->*/11, 44, 84));
        this.addSlotToContainer(new Slot(inventory, /*Slot ID-->*/12, 62, 84));
        this.addSlotToContainer(new Slot(inventory, /*Slot ID-->*/13, 80, 84));
        this.addSlotToContainer(new Slot(inventory, /*Slot ID-->*/14, 98, 84));
        this.addSlotToContainer(new Slot(inventory, /*Slot ID-->*/15, 116, 84));
        this.addSlotToContainer(new Slot(inventory, /*Slot ID-->*/16, 134, 84));
        this.addSlotToContainer(new Slot(inventory, /*Slot ID-->*/17, 152, 84));
        
        this.addSlotToContainer(new Slot(inventory, /*Slot ID-->*/18, 8, 102));
        this.addSlotToContainer(new Slot(inventory, /*Slot ID-->*/19, 26, 102));
        this.addSlotToContainer(new Slot(inventory, /*Slot ID-->*/20, 44, 102));
        this.addSlotToContainer(new Slot(inventory, /*Slot ID-->*/21, 62, 102));
        this.addSlotToContainer(new Slot(inventory, /*Slot ID-->*/22, 80, 102));
        this.addSlotToContainer(new Slot(inventory, /*Slot ID-->*/23, 98, 102));
        this.addSlotToContainer(new Slot(inventory, /*Slot ID-->*/24, 116, 102));
        this.addSlotToContainer(new Slot(inventory, /*Slot ID-->*/25, 134, 102));
        this.addSlotToContainer(new Slot(inventory, /*Slot ID-->*/26, 152, 102));
        
        this.addSlotToContainer(new Slot(inventory, /*Slot ID-->*/27, 8, 120));
        this.addSlotToContainer(new Slot(inventory, /*Slot ID-->*/28, 26, 120));
        this.addSlotToContainer(new Slot(inventory, /*Slot ID-->*/29, 44, 120));
        this.addSlotToContainer(new Slot(inventory, /*Slot ID-->*/30, 62, 120));
        this.addSlotToContainer(new Slot(inventory, /*Slot ID-->*/31, 80, 120));
        this.addSlotToContainer(new Slot(inventory, /*Slot ID-->*/32, 98, 120));
        this.addSlotToContainer(new Slot(inventory, /*Slot ID-->*/33, 116, 120));
        this.addSlotToContainer(new Slot(inventory, /*Slot ID-->*/34, 134, 120));
        this.addSlotToContainer(new Slot(inventory, /*Slot ID-->*/35, 152, 120));
        System.out.print(dryingRack.SlotID);
        this.slotID = 36;
        this.addSlotToContainer(new Slot(inventory, /*Slot ID-->*/this.slotID, 44, 14));
        this.slotID = 37;
        this.addSlotToContainer(new Slot(inventory, /*Slot ID-->*/this.slotID, 44, 50));
        this.addSlotToContainer(new Slot(inventory, /*Slot ID-->*/38, 116, 32));
    }
    @Override
    public boolean canInteractWith(EntityPlayer p_75145_1_) {
        // TODO Auto-generated method stub
        return i.isUseableByPlayer(p_75145_1_);
    }
    @Override
    public ItemStack transferStackInSlot(EntityPlayer playerIn, int fromSlot) {
        ItemStack previous = null;
        Slot slot = (Slot) this.inventorySlots.get(fromSlot);

        if (slot != null && slot.getHasStack()) {
            ItemStack current = slot.getStack();
            previous = current.copy();

            if (fromSlot < 3) {
                // From TE Inventory to Player Inventory
                if (!this.mergeItemStack(current, 3, 39, true))
                    return null;
            } else {
                // From Player Inventory to TE Inventory
                if (!this.mergeItemStack(current, 0, 2, false))
                    return null;
            }

            if (current.stackSize == 0)
                slot.putStack((ItemStack) null);
            else
                slot.onSlotChanged();

            if (current.stackSize == previous.stackSize)
                return null;
            slot.onPickupFromSlot(playerIn, current);
        }

        return previous;
    }
}
Все работает супер. Но есть одна проблемка у всех GUI общие слоты.
Вот скрины:
u8XRW9a.jpg

KdUKXch.jpg
H4Z76hn.jpg

Теперь ставлю второй блок.
fBFLSHi.jpg

Открываю.
WnoWjF4.jpg

А там уже занято. И так можно до бесконечности делать.


в Google лазил примерно 3ч понял только то что нужно создать еще один inventory которой будет у каждого блока свой. И туда пихать item. Вопрос такой как создать этот самый inventory и присвоить его блоку ?
PS: Только пожалуйста опешите по подробные. Я Java не очень хорошо знаю. Зарание спасибо за ответ. :)
PSS: this.slotID = 36; это так для теста хотел очень извращеным способом сделать но не получилось :С
 
Более подробно рассказать всё равно не получиться, так как есть моменты которые нужно понимать самому или писать код для и под себя.
Как создать инвентарь бывают разные варианты. Но тебе скорее всего надо будет твоему TileEntityDryingRack дать IInventory.
Код:
public class TileEntityDryingRack extends TileEntity implements IInventory
Думаю в блоке у тебя должно:
Код:
implements ITileEntityProvider
или
Код:
extends BlockContainer
второе не рекомендуется (в каком-то смысле).
В конструкторе твоего контейнера ContainerDryingRack нужно будет сделать проверку на то, что аргумент dryingRack не равен нулю и является IInventory:
Код:
if (dryingRack != null && dryingRack instanceof IInventory) {
IInventory inv = (IInventory)dryingRack;
//тут должны быть слоты инвентаря из [b]TileEntityDryingRack[/b].
}
Дальше он попросит по-добавлять методов, примеры что должно быть написано можно взять из net.minecraft.tileentity.TileEntityFurnace или net.minecraft.inventory.InventoryBasic.

---

Код:
this.addSlotToContainer(new Slot(inventory, 0, 8, 142));
inventory - используемый инвентарь
0 - id этого инвентаря.
8 - местоположение слота по координате X
127 - местоположение слотапо координате Y
Для твоего нужно НЕ:
Код:
        this.addSlotToContainer(new Slot(inventory, /*Slot ID-->*/this.slotID, 44, 14));
        this.addSlotToContainer(new Slot(inventory, /*Slot ID-->*/this.slotID, 44, 50));
        this.addSlotToContainer(new Slot(inventory, /*Slot ID-->*/38, 116, 32));
А:
Код:
        this.addSlotToContainer(new Slot(inv, 0, 44, 14));
        this.addSlotToContainer(new Slot(inv, 1, 44, 50));
        this.addSlotToContainer(new Slot(inv, 2, 116, 32));
Т.е.
Код:
    public ContainerDryingRack(InventoryPlayer inventory, TileEntityDryingRack dryingRack) 
    {
        i = inventory;

if (dryingRack != null && dryingRack instanceof IInventory) {
IInventory inv = (IInventory)dryingRack;
        this.addSlotToContainer(new Slot(inv, 0, 44, 14));
        this.addSlotToContainer(new Slot(inv, 1, 44, 50));
        this.addSlotToContainer(new Slot(inv, 2, 116, 32));
}

        this.addSlotToContainer(new Slot(inventory, /*Slot ID-->*/0, 8, 142));
        this.addSlotToContainer(new Slot(inventory, /*Slot ID-->*/1, 26, 142));
        this.addSlotToContainer(new Slot(inventory, /*Slot ID-->*/2, 44, 142));
        this.addSlotToContainer(new Slot(inventory, /*Slot ID-->*/3, 62, 142));
        this.addSlotToContainer(new Slot(inventory, /*Slot ID-->*/4, 80, 142));
        this.addSlotToContainer(new Slot(inventory, /*Slot ID-->*/5, 98, 142));
        this.addSlotToContainer(new Slot(inventory, /*Slot ID-->*/6, 116, 142));
        this.addSlotToContainer(new Slot(inventory, /*Slot ID-->*/7, 134, 142));
        this.addSlotToContainer(new Slot(inventory, /*Slot ID-->*/8, 152, 142));
        
        this.addSlotToContainer(new Slot(inventory, /*Slot ID-->*/9, 8, 84));
        this.addSlotToContainer(new Slot(inventory, /*Slot ID-->*/10, 26, 84));
        this.addSlotToContainer(new Slot(inventory, /*Slot ID-->*/11, 44, 84));
        this.addSlotToContainer(new Slot(inventory, /*Slot ID-->*/12, 62, 84));
        this.addSlotToContainer(new Slot(inventory, /*Slot ID-->*/13, 80, 84));
        this.addSlotToContainer(new Slot(inventory, /*Slot ID-->*/14, 98, 84));
        this.addSlotToContainer(new Slot(inventory, /*Slot ID-->*/15, 116, 84));
        this.addSlotToContainer(new Slot(inventory, /*Slot ID-->*/16, 134, 84));
        this.addSlotToContainer(new Slot(inventory, /*Slot ID-->*/17, 152, 84));
        
        this.addSlotToContainer(new Slot(inventory, /*Slot ID-->*/18, 8, 102));
        this.addSlotToContainer(new Slot(inventory, /*Slot ID-->*/19, 26, 102));
        this.addSlotToContainer(new Slot(inventory, /*Slot ID-->*/20, 44, 102));
        this.addSlotToContainer(new Slot(inventory, /*Slot ID-->*/21, 62, 102));
        this.addSlotToContainer(new Slot(inventory, /*Slot ID-->*/22, 80, 102));
        this.addSlotToContainer(new Slot(inventory, /*Slot ID-->*/23, 98, 102));
        this.addSlotToContainer(new Slot(inventory, /*Slot ID-->*/24, 116, 102));
        this.addSlotToContainer(new Slot(inventory, /*Slot ID-->*/25, 134, 102));
        this.addSlotToContainer(new Slot(inventory, /*Slot ID-->*/26, 152, 102));
        
        this.addSlotToContainer(new Slot(inventory, /*Slot ID-->*/27, 8, 120));
        this.addSlotToContainer(new Slot(inventory, /*Slot ID-->*/28, 26, 120));
        this.addSlotToContainer(new Slot(inventory, /*Slot ID-->*/29, 44, 120));
        this.addSlotToContainer(new Slot(inventory, /*Slot ID-->*/30, 62, 120));
        this.addSlotToContainer(new Slot(inventory, /*Slot ID-->*/31, 80, 120));
        this.addSlotToContainer(new Slot(inventory, /*Slot ID-->*/32, 98, 120));
        this.addSlotToContainer(new Slot(inventory, /*Slot ID-->*/33, 116, 120));
        this.addSlotToContainer(new Slot(inventory, /*Slot ID-->*/34, 134, 120));
        this.addSlotToContainer(new Slot(inventory, /*Slot ID-->*/35, 152, 120));

    }
Те иды которые ты использовал, возможно могут принадлежать слотам брони или типа того.
[merge_posts_bbcode]Добавлено: 21.01.2016 00:11:36[/merge_posts_bbcode]

Так-же от TileEntityFurnace возьми примеры сохранение инвентаря для NBT.
И ещё возможно понадобиться добавить в твой TileEntityDryingRack добавить пару методов:
Код:
    @Override
    public Packet getDescriptionPacket() {
        NBTTagCompound nbt = new NBTTagCompound();
        writeToNBT(nbt);
        return new S35PacketUpdateTileEntity(xCoord, yCoord, zCoord, 0, nbt);
    }

    @Override
    public void onDataPacket(NetworkManager net, S35PacketUpdateTileEntity packet) {
        readFromNBT(packet.func_148857_g());
    }
 
Вы все таки лудший! Спасибки :)
[merge_posts_bbcode]Добавлено: 21.01.2016 13:22:28[/merge_posts_bbcode]

Только вот опять проблема.
В эти 3 слота нельзя положить вещи.

[merge_posts_bbcode]Добавлено: 21.01.2016 13:24:21[/merge_posts_bbcode]

Я так понимаю проблема в:
Код:
package com.example.examplemod;

import net.minecraft.entity.player.EntityPlayer;
import net.minecraft.inventory.IInventory;
import net.minecraft.item.ItemStack;
import net.minecraft.tileentity.TileEntity;

public class TileEntityDryingRack extends TileEntity implements IInventory
{

    @Override
    public int getSizeInventory() {
        return 0;
    }

    @Override
    public ItemStack getStackInSlot(int p_70301_1_) {
        // TODO Auto-generated method stub
        return null;
    }

    @Override
    public ItemStack decrStackSize(int p_70298_1_, int p_70298_2_) {
        // TODO Auto-generated method stub
        return null;
    }

    @Override
    public ItemStack getStackInSlotOnClosing(int p_70304_1_) {
        // TODO Auto-generated method stub
        return null;
    }

    @Override
    public void setInventorySlotContents(int p_70299_1_, ItemStack p_70299_2_) {
        // TODO Auto-generated method stub
        
    }

    @Override
    public String getInventoryName() {
        // TODO Auto-generated method stub
        return null;
    }

    @Override
    public boolean hasCustomInventoryName() {
        // TODO Auto-generated method stub
        return false;
    }

    @Override
    public int getInventoryStackLimit() {
        // TODO Auto-generated method stub
        return 0;
    }

    @Override
    public boolean isUseableByPlayer(EntityPlayer p_70300_1_) {
        // TODO Auto-generated method stub
        return false;
    }

    @Override
    public void openInventory() {
        // TODO Auto-generated method stub
        
    }

    @Override
    public void closeInventory() {
        // TODO Auto-generated method stub
        
    }

    @Override
    public boolean isItemValidForSlot(int p_94041_1_, ItemStack p_94041_2_) {
        // TODO Auto-generated method stub
        return false;
    }
}
 
Да, в этом проблема, я же писал:
timaxa007 написал(а):
Дальше он попросит по-добавлять методов, примеры что должно быть написано можно взять из net.minecraft.tileentity.TileEntityFurnace или net.minecraft.inventory.InventoryBasic.
 
Сори я только что проснулса. Не все прочитал.
[merge_posts_bbcode]Добавлено: 21.01.2016 13:58:07[/merge_posts_bbcode]

О... Спасибки. Скопировал кусок кода от куда вы сказали все заработало :)
 
Назад
Сверху