[Наконец-то решено!] Больше 45 слотов в гуи.

Статус
В этой теме нельзя размещать новые ответы.

svk

1,185
3
Как сделать больше 45 слотов в гуи?
Крашит :(

Код:
package com.svk.generateChests.GUI.container;

import java.util.Random;

import net.minecraft.entity.player.EntityPlayer;
import net.minecraft.entity.player.InventoryPlayer;
import net.minecraft.inventory.Container;
import net.minecraft.inventory.Slot;
import net.minecraft.item.ItemStack;

import com.svk.generateChests.Tile.TileGenerateChest;
import com.svk.generateChests.base.BaseClassMod;
import com.svk.generateChests.base.CommonProxy;
import com.svk.generateChests.packets.PacketsID;
import com.svk.generateChests.util.UtilPackerDataSet;

public class ContainerEditGenerateChest extends Container
{
    TileGenerateChest tileChest = null;
    public int startX = 0;
    public int startY = 0;
    
    public ContainerEditGenerateChest(InventoryPlayer inventoryPlayer, TileGenerateChest tileChest)
    {
        this.tileChest = tileChest;
        tileChest.openInventory();
        this.addPlayerSlots(inventoryPlayer);
        this.addCustomSlots(tileChest);
    }
    
    public void addCustomSlots(TileGenerateChest chest)
    {
        for(int i = 0; i < 8; i++)
        {
            this.addSlotToContainer(new Slot(tileChest, i,  8, 12 + 18*i));
            this.addSlotToContainer(new Slot(tileChest, i + 8,  53, 12 + 18*i));
        }
    }
    
    public void addPlayerSlots(InventoryPlayer inventoryPlayer)
    {
        for(int i = 0; i < 3; i++)
        {
            for(int j = 0; j < 9; j++)
            {
                this.addSlotToContainer(new Slot(inventoryPlayer, 9+j+i*9, 8+18*j, 166+i*18));
            }
        }
        
        for(int i = 0; i < 9; i++)
        {
            this.addSlotToContainer(new Slot(inventoryPlayer, i, 8 + i * 18, 224));
        }
    }
    
    public ItemStack transferStackInSlot(EntityPlayer p_82846_1_, int p_82846_2_)
    {
        return null;
    }

    @Override
    public boolean canInteractWith(EntityPlayer p_75145_1_) 
    {
        return true;
    }
}
 
Agravaine написал(а):
Ну так в тайле у себя больше сделай.
Как? Вот у меня стоит в контейнере, а толку ноль:
Код:
    public ItemStack[] slots = new ItemStack[100];
...
    @Override
    public int getSizeInventory() 
    {
        return this.slots.length;
    }

Крашит в контейнере:
Код:
java.lang.IndexOutOfBoundsException: Index: 45, Size: 45
    at java.util.ArrayList.rangeCheck(Unknown Source)
    at java.util.ArrayList.get(Unknown Source)
    at net.minecraft.inventory.Container.getSlot(Container.java:130)
    at net.minecraft.inventory.Container.putStacksInSlots(Container.java:558)
    at net.minecraft.client.network.NetHandlerPlayClient.handleWindowItems(NetHandlerPlayClient.java:1197)
    at net.minecraft.network.play.server.S30PacketWindowItems.processPacket(S30PacketWindowItems.java:70)
    at net.minecraft.network.play.server.S30PacketWindowItems.processPacket(S30PacketWindowItems.java:78)
    at net.minecraft.network.NetworkManager.processReceivedPackets(NetworkManager.java:241)
    at net.minecraft.client.multiplayer.PlayerControllerMP.updateController(PlayerControllerMP.java:317)
    at net.minecraft.client.Minecraft.runTick(Minecraft.java:1693)
    at net.minecraft.client.Minecraft.runGameLoop(Minecraft.java:1039)
    at net.minecraft.client.Minecraft.run(Minecraft.java:962)
    at net.minecraft.client.main.Main.main(Main.java:164)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
    at java.lang.reflect.Method.invoke(Unknown Source)
    at net.minecraft.launchwrapper.Launch.launch(Launch.java:135)
    at net.minecraft.launchwrapper.Launch.main(Launch.java:28)
    at net.minecraftforge.gradle.GradleStartCommon.launch(Unknown Source)
    at GradleStart.main(Unknown Source)
 
Код:
package com.svk.generateChests.Tile;

import java.util.ArrayList;

import com.svk.generateChests.base.CommonProxy;

import net.minecraft.entity.player.EntityPlayer;
import net.minecraft.inventory.ISidedInventory;
import net.minecraft.item.ItemStack;
import net.minecraft.nbt.NBTTagCompound;
import net.minecraft.nbt.NBTTagList;
import net.minecraft.tileentity.TileEntity;

public class TileGenerateChest extends TileEntity implements ISidedInventory
{
    public ItemStack[] slots = new ItemStack[100];
    
    public int[] procentSlot = null;
    public boolean setGen = false;
    
    public TileGenerateChest(){}
    
    public void updateEntity()
    {
    }

    public void readFromNBT(NBTTagCompound nbt)
    {
        super.readFromNBT(nbt);
        NBTTagList nbtItems = nbt.getTagList("Items", 10);
        this.slots = new ItemStack[this.getSizeInventory()];

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

            if (j >= 0 && j < this.slots.length)
            {
                this.slots[j] = ItemStack.loadItemStackFromNBT(nbt1);
            }
        }
        
        this.procentSlot = nbt.getIntArray("procentSlots");
        this.setGen = nbt.getBoolean("setGen");
    }
    
    public void writeToNBT(NBTTagCompound nbt)
    {
        super.writeToNBT(nbt);
        NBTTagList nbt1 = new NBTTagList();

        for (int i = 0; i < this.slots.length; ++i)
        {
            if (this.slots[i] != null)
            {
                NBTTagCompound nbt2 = new NBTTagCompound();
                nbt2.setByte("Slot", (byte)i);
                this.slots[i].writeToNBT(nbt2);
                nbt1.appendTag(nbt2);
            }
        }

        nbt.setTag("Items", nbt1);
        

           nbt.setIntArray("procentSlots", this.procentSlot);
        nbt.setBoolean("setGen",this.setGen);
    }
    
    @Override
    public int getSizeInventory() 
    {
        return this.slots.length;
    }

    @Override
    public ItemStack getStackInSlot(int i) 
    {
        return this.slots[i]; 
    }

    public ItemStack decrStackSize(int i, int j) 
    {
        if(this.slots[i] != null)
        {    
            ItemStack itemstack;
            
            if(this.slots[i].stackSize < j)
            {
                itemstack = this.slots[i];
                this.slots[i] = null;

                return itemstack;
            }
            else
            {
                itemstack = this.slots[i].splitStack(j);
                
                if(this.slots[i].stackSize == 0)
                {
                    this.slots[i] = null;
                }
                return itemstack;
            }
        }
        return null;
    }

    public ItemStack getStackInSlotOnClosing(int i) 
    {
        if(this.slots[i] != null)
        {
            ItemStack itemstack = this.slots[i];
            this.slots[i] = null;
            return itemstack;
        }
        return null;
    }
    
    @Override
    public void setInventorySlotContents(int i, ItemStack itemstack) 
    {
        this.slots[i] = itemstack;
        
        if(itemstack != null && itemstack.stackSize > this.getInventoryStackLimit())
        {
            itemstack.stackSize = this.getInventoryStackLimit();
        }
    }
    
    public void setInventoryName(String string)
    {
    }
    
    public String getInventoryName()
    {
        return "GenerateChest";
    }

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

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

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

    @Override
    public void openInventory() 
    {
    }

    @Override
    public void closeInventory() 
    {
    }

    @Override
    public boolean isItemValidForSlot(int slot, ItemStack itemStack) 
    {
        if(slots[slot] != null)
        {
            return true;
        }
        else
        {
            return false;
        }
    }

    @Override
    public int[] getAccessibleSlotsFromSide(int p_94128_1_) 
    {
        int slotsReturn[] = {};
        return slotsReturn;
    }

    @Override
    public boolean canInsertItem(int slot, ItemStack stack, int side) 
    {
        return isItemValidForSlot(slot, stack);
    }

    @Override
    public boolean canExtractItem(int slot, ItemStack stack, int side) 
    {
        return false;
    }
}
 
Контейнер в шапке.
Код:
this.addSlotToContainer(new Slot(tileChest, i,  8, 12 + 18*i));
 
Посмотрел исходники icornChest, видимо там надо ещё предопределять методы:
Код:
public Packet<?> getDescriptionPacket()
public void onDataPacket(NetworkManager net, S35PacketUpdateTileEntity pkt)
Щас попробуем.
 
Чёт я напортачил, если добавлять только слоты игрока, то какие-то финты с инвентарём вытворяет, перемешивает... Что за бред?
[merge_posts_bbcode]Добавлено: 20.12.2015 15:14:33[/merge_posts_bbcode]

Это я поменял местами, правильно так:
Код:
        for(int i = 0; i < 9; i++)
        {
            this.addSlotToContainer(new Slot(inventoryPlayer, i, 8 + i * 18, 224));
        }
        
        for(int i = 0;i < 3; i++)
        {
            for(int j = 0; j < 9;j++)
            {
                this.addSlotToContainer(new Slot(inventoryPlayer, 9+j+i*9, 8+18*j, 166+i*18));
            }
        }

Но крашит все равно, предопределение методов которые я написал выше не помогло.
 
Решено. Надо прописать это в Gui:
Код:
    @Override
    public void initGui()
    {
        super.initGui();
    }

Нашел решение на forge. Целый день убил на эту чёртову проблему...
 
svk написал(а):
Решено. Надо прописать это в Gui:
Код:
    @Override
    public void initGui()
    {
        super.initGui();
    }

Нашел решение на forge. Целый день убил на эту чёртову проблему...
Эти строки не имеют абсолютно никакого смысла и ничего не делают
 
Статус
В этой теме нельзя размещать новые ответы.
Назад
Сверху