TileEntity Container

1,087
2
Проблема в том, что я хочу сделать пьедестал (Да да. В тауме уже есть, но мне нужен для моих нужд XD). Но вот чё-то заглянув в TileEntity не увидел что-либо связанное с контэйнером.
TODO:
  • Рендеринг предмета который будет в пьедестале.
  • 1 слот.
  • In & out предмета из этого слота
  • Конечно без велосипеда не сделать эту бульду.
НО! Подскажите хотя бы методы :) Память у меня куриная так, что всё забываю :) А вот с рендерингом лучше помогите ._.
[merge_posts_bbcode]Добавлено: 25.09.2015 21:41:15[/merge_posts_bbcode]

Чуточку пошарив код самого таума (Его пьедестала) увидел что да как. Решил попробовать сделать почти так же. Нифига не пашет)
 
Скажу то,что нужна будет синхронизация слотов сервера.Код есть,но только контейнера(то есть рендерить самому).Дать?
 
Код:
public class StorageTileEntity extends TileEntity implements IInventory {

    public int size;
    public ItemStack[] itemStacks;

    public void setSize(int size) {
        this.size = size;
        itemStacks = new ItemStack[size];
    }

    @Override
    public Packet getDescriptionPacket() {
        NBTTagCompound syncData = new NBTTagCompound();
        writeSyncData(syncData);
        return new S35PacketUpdateTileEntity(this.xCoord, this.yCoord, this.zCoord, 1, syncData);
    }

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

    @Override
    public ItemStack getStackInSlot(int p_70301_1_) {
        return itemStacks[p_70301_1_];
    }

    public void clearInventory() {
        for (int i = 0; i < getSizeInventory(); i++) {
            setInventorySlotContents(i, null);
            worldObj.markBlockForUpdate(xCoord, yCoord, zCoord);
            markDirty();
        }
    }

    @Override
    public ItemStack decrStackSize(int p_70298_1_, int p_70298_2_) {
        ItemStack stack = this.getStackInSlot(p_70298_1_);
        if (stack != null) {
            if (stack.stackSize <= p_70298_2_) {
                setInventorySlotContents(p_70298_1_, (ItemStack) null);
            } else {
                stack = stack.splitStack(p_70298_2_);
                if (stack.stackSize == 0) {
                    setInventorySlotContents(p_70298_1_, (ItemStack) null);
                }
            }
        }
        worldObj.markBlockForUpdate(xCoord, yCoord, zCoord);
        return stack;
    }

    @Override
    public ItemStack getStackInSlotOnClosing(int p_70304_1_) {
        if (itemStacks[p_70304_1_] != null) {
            ItemStack itemstack = itemStacks[p_70304_1_];
            itemStacks[p_70304_1_] = null;
            return itemstack;
        } else {
            return null;
        }
    }

    @Override
    public void readFromNBT(NBTTagCompound p_145839_1_) {
        super.readFromNBT(p_145839_1_);
        readSyncData(p_145839_1_);
    }

    @Override
    public void setInventorySlotContents(int p_70299_1_, ItemStack p_70299_2_) {
        itemStacks[p_70299_1_] = p_70299_2_;
        if (p_70299_2_ != null && p_70299_2_.stackSize > this.getInventoryStackLimit()) {
            p_70299_2_.stackSize = getInventoryStackLimit();
        }
        worldObj.markBlockForUpdate(xCoord, yCoord, zCoord);
    }

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

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

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

    @Override
    public boolean isUseableByPlayer(EntityPlayer p_70300_1_) {
        return !p_70300_1_.isDead;
    }

    @Override
    public void openInventory() {
    }

    @Override
    public void closeInventory() {
    }

    @Override
    public boolean isItemValidForSlot(int p_94041_1_, ItemStack p_94041_2_) {
        return false;
    }

    public void writeSyncData(NBTTagCompound nbt) {
        NBTTagList nbttaglist = new NBTTagList();
        for (int i = 0; i < getSizeInventory(); ++i) {
            if (itemStacks[i] != null) {
                NBTTagCompound nbttagcompound1 = new NBTTagCompound();
                nbttagcompound1.setByte("Slot", (byte) i);
                itemStacks[i].writeToNBT(nbttagcompound1);
                nbttaglist.appendTag(nbttagcompound1);
            }
        }
        nbt.setTag("Items", nbttaglist);
        nbt.setInteger("Size", size);
    }

    public void readSyncData(NBTTagCompound nbt) {
        size = nbt.getInteger("Size");
        setSize(size);
        NBTTagList nbttaglist = nbt.getTagList("Items", 10);
        for (int i = 0; i < nbttaglist.tagCount(); ++i) {
            NBTTagCompound nbttagcompound1 = nbttaglist.getCompoundTagAt(i);
            byte b0 = nbttagcompound1.getByte("Slot");
            if (b0 >= 0 && b0 < itemStacks.length) {
                itemStacks[b0] = ItemStack.loadItemStackFromNBT(nbttagcompound1);
            }
        }
    }

    @Override
    public void onDataPacket(NetworkManager net, S35PacketUpdateTileEntity pkt) {
        readSyncData(pkt.func_148857_g());
    }

    @Override
    public void writeToNBT(NBTTagCompound nbt) {
        super.writeToNBT(nbt);
        writeSyncData(nbt);
    }
}
 
ComingSoon, неа. Не работает :( По идее если будет правый клик по блоку, то он должен положиться в инвертарь этого пьедестала. А это работает если я сделал BlockBounds у этого блока?
[merge_posts_bbcode]Добавлено: 26.09.2015 14:14:24[/merge_posts_bbcode]

Ап.
 
Я дал код инвентаря(тот,что с гуи).У тебя задача ещё проще(при пкм берёшь тайл в коордах блока и каким-нибудь сеттером кладёшь итем)
 
В твой блок:
Код:
    @Override
    public boolean onBlockActivated(World world, int x, int y, int z, EntityPlayer player, int side, float hitX, float hitY, float hitZ) {
        IInventory inv = (IInventory)world.getTileEntity(x, y, z);
        ItemStack current_is = player.getCurrentEquippedItem();
        if (inv != null && current_is != null) {
            for (int i = 0; i < inv.getSizeInventory(); ++i) {
                if (inv.getStackInSlot(i) == null) {
                    inv.setInventorySlotContents(i, current_is);
                    current_is = null;
                    return true;
                }
            }
        }
        return super.onBlockActivated(world, x, y, z, player, side, hitX, hitY, hitZ);
    }
 
timaxa007 написал(а):
В твой блок:
Код:
    @Override
    public boolean onBlockActivated(World world, int x, int y, int z, EntityPlayer player, int side, float hitX, float hitY, float hitZ) {
        IInventory inv = (IInventory)world.getTileEntity(x, y, z);
        ItemStack current_is = player.getCurrentEquippedItem();
        if (inv != null && current_is != null) {
            for (int i = 0; i < inv.getSizeInventory(); ++i) {
                if (inv.getStackInSlot(i) == null) {
                    inv.setInventorySlotContents(i, current_is);
                    current_is = null;
                    return true;
                }
            }
        }
        return super.onBlockActivated(world, x, y, z, player, side, hitX, hitY, hitZ);
    }
Сейчас попробую :)
 
Назад
Сверху