[1.7.10]Вопрос по гуи, подскажите как взаимодействовать со слотами.

102
0
У меня есть гуи
Код:
package spellflex.kuroi.rpg.gui;

import org.lwjgl.input.Keyboard;
import org.lwjgl.opengl.GL11;

import spellflex.kuroi.rpg.Setings;
import cpw.mods.fml.common.FMLCommonHandler;
import net.minecraft.client.gui.GuiButton;
import net.minecraft.client.gui.GuiScreen;
import net.minecraft.client.gui.inventory.GuiContainer;
import net.minecraft.client.resources.I18n;
import net.minecraft.entity.player.EntityPlayer;
import net.minecraft.init.Blocks;
import net.minecraft.item.ItemStack;
import net.minecraft.server.MinecraftServer;
import net.minecraft.util.ResourceLocation;
import net.minecraft.world.World;

public class GuiWindow extends GuiContainer
{
int xSize = 190;
int ySize = 190;

public GuiWindow(World world, int i, int j, int k, EntityPlayer entity){
    super(new GuiContainerMod((EntityPlayer)entity, world, i, j, k));
}

protected void drawGuiContainerBackgroundLayer(float par1, int par2, int par3)
{
    GL11.glColor4f(1.0F, 1.0F, 1.0F, 1.0F);
    this.mc.renderEngine.bindTexture(new ResourceLocation(Setings.MODID +":textures/GUI/UpWeapons.png"));
    int k = (this.width - xSize) / 2;
    int l = (this.height - ySize) / 2;
    this.drawTexturedModalRect(k, l, 0, 0, xSize, ySize);
}

protected void drawGuiContainerForegroundLayer(int par1, int par2){
    this.fontRendererObj.drawString(I18n.format("container.inventory", new Object[0]), 8, 73, 4210752);
}

}
и
Код:
package spellflex.kuroi.rpg.gui;

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.InventoryCraftResult;
import net.minecraft.inventory.InventoryCrafting;
import net.minecraft.inventory.Slot;
import net.minecraft.inventory.SlotCrafting;
import net.minecraft.item.ItemStack;
import net.minecraft.world.World;

public class GuiContainerMod extends Container  {
    public InventoryCrafting craftMatrix = new InventoryCrafting(this, 3, 3);
    private World worldObj;

    public GuiContainerMod (EntityPlayer player, World world, int i2, int j2, int k){
        this.worldObj = world;
        this.addSlotToContainer(new Slot(new TileEntitySlot(), 0, 30, 17));
        this.addSlotToContainer(new Slot(new TileEntitySlot(), 1, 30+18, 17));
        this.addSlotToContainer(new Slot(new TileEntitySlot(), 2, 30+9, 17+18));
        bindPlayerInventory(player.inventory);
    }

    protected void bindPlayerInventory(InventoryPlayer inventoryPlayer) {
        
        int i;
        for(i = 0; i < 3; ++i){
            for(int j = 0; j < 9; ++j){
                this.addSlotToContainer(new Slot(inventoryPlayer, j + i * 9 + 9, 8 + j * 18, 84 + i * 18));
            }
        }
        
        for(i = 0; i < 9; ++i){
            this.addSlotToContainer(new Slot(inventoryPlayer, i , 8 + i * 18 , 142));
        }
    }

    @Override
    public boolean canInteractWith(EntityPlayer p_75145_1_) {
        return craftMatrix.isUseableByPlayer(p_75145_1_);
    }
    public void onContainerClosed(EntityPlayer p_75134_1_)
    {
        super.onContainerClosed(p_75134_1_);

        if (!this.worldObj.isRemote)
        {
            for (int i = 0; i < 9; ++i)
            {
                ItemStack itemstack = new TileEntitySlot().getStackInSlotOnClosing(i);

                if (itemstack != null)
                {
                    p_75134_1_.dropPlayerItemWithRandomChoice(itemstack, false);
                }
            }
        }
    }

    public ItemStack transferStackInSlot(EntityPlayer player, int slot) {
        return null;
    }
}
Как мне реализовать взаимодействие со слотами, то есть что бы проверялось лежит ли в слоте определенный итем? И еще вопрос, почему у меня в инвентаре предметы не перемещаются мышкой?
 
Agravaine написал(а):
Что тебе нужно?
Проверить лежит ли в слоте например яблоко. Данная запись будет верная?
Код:
    if (this.mc.thePlayer.openContainer.inventorySlots.get(1) == Items.apple){
        this.mc.thePlayer.openContainer.inventorySlots.set(2, Items.golden_apple);
    }
И почему у меня не двигаются предметы в инвентаре при помощи мышки?
 
Asd73 написал(а):
Проверять на клиенте или на сервере?
Я на клиенте делал так: https://bitbucket.org/Shuleshkin/nedocomputers/src/4965f076cda37969b8c13465b3a93852d77830df/src/main/java/nedocomputers/client/GuiCPU.java?at=default#cl-83

Код:
public InventoryCrafting craftMatrix = new InventoryCrafting(this, 3, 3);
Зачем тебе это? В методе canInteractWith можно возвращать true.
что это? зачем мне матрица рабочего стола?
 
Asd73 написал(а):
Вот и я про то же. Это у тебя в классе GuiContainerMod.
оно ни где не используется, я пробовал с ним поработать, но потом удалил. Без него ничего не меняется.
[merge_posts_bbcode]Добавлено: 28.10.2014 21:43:22[/merge_posts_bbcode]

Так вы мне поможете разобраться почему у меня не перемещаются предметы в слотах инвентаря? при попытки взять предмет он на долю секунды берется и ложится обратно.
 
this.addSlotToContainer(new Slot(new TileEntitySlot(), 0, 30, 17));
А это как объяснить? Что такое TileEntitySlot?
 
Asd73 написал(а):
this.addSlotToContainer(new Slot(new TileEntitySlot(), 0, 30, 17));
А это как объяснить? Что такое TileEntitySlot?
Код:
package spellflex.kuroi.rpg.gui;

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

public class TileEntitySlot extends TileEntity implements IInventory {

        private ItemStack[] inv;

        public TileEntitySlot(){
                inv = new ItemStack[9];
        }
        
        @Override
        public int getSizeInventory() {
                return inv.length;
        }

        @Override
        public ItemStack getStackInSlot(int slot) {
                return inv[slot];
        }
        
        @Override
        public void setInventorySlotContents(int slot, ItemStack stack) {
                inv[slot] = stack;
                if (stack != null && stack.stackSize > getInventoryStackLimit()) {
                        stack.stackSize = getInventoryStackLimit();
                }               
        }

        @Override
        public ItemStack decrStackSize(int slot, int amt) {
                ItemStack stack = getStackInSlot(slot);
                if (stack != null) {
                        if (stack.stackSize <= amt) {
                                setInventorySlotContents(slot, null);
                        } else {
                                stack = stack.splitStack(amt);
                                if (stack.stackSize == 0) {
                                        setInventorySlotContents(slot, null);
                                }
                        }
                }
                return stack;
        }

        @Override
        public ItemStack getStackInSlotOnClosing(int slot) {
                ItemStack stack = getStackInSlot(slot);
                if (stack != null) {
                        setInventorySlotContents(slot, null);
                }
                return stack;
        }
        
        @Override
        public int getInventoryStackLimit() {
                return 64;
        }

        @Override
        public boolean isUseableByPlayer(EntityPlayer player) {
                return worldObj.getTileEntity(xCoord, yCoord, zCoord) == this &&
                player.getDistanceSq(xCoord + 0.5, yCoord + 0.5, zCoord + 0.5) < 64;
        }

        public void openChest() {}

        public void closeChest() {}

        @Override
        public void writeToNBT(NBTTagCompound tagCompound) {
                super.writeToNBT(tagCompound);
                                
                NBTTagList itemList = new NBTTagList();
                for (int i = 0; i < inv.length; i++) {
                        ItemStack stack = inv[i];
                        if (stack != null) {
                                NBTTagCompound tag = new NBTTagCompound();
                                tag.setByte("Slot", (byte) i);
                                stack.writeToNBT(tag);
                                itemList.appendTag(tag);
                        }
                }
                tagCompound.setTag("Inventory", itemList);
        }

                @Override
                public String getInventoryName() {
                        return "spellflexrpg.upweapons";
                }

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

                @Override
                public void openInventory() {
                }

                @Override
                public void closeInventory() {
                }

                @Override
                public boolean isItemValidForSlot(int p_94041_1_, ItemStack p_94041_2_) {
                    return false;
                }
}
 
В джаве "new Конструктор()" создает объект.
1) Зачем тебе там несколько объектов?
2) Создавать объект класса TileEntitySlot нужно в блоке, в методе createNewTileEntity. При этом созданный объект будет использоваться внутри майнкрафта. А если ты просто создашь объект и никуда не передашь ссылку на него, то никто об этом объекте не узнает.

Вместо new TileEntitySlot() нужно вставить world.getTileEntity(x, y, z), то есть ссылку на уже использующийся в игре TileEntity.
 
Agravaine написал(а):
Они у тебя не перемещаются потому что ты открываешь гуи НЕ через player.openGui.
Код:
player.openGui(Main.instance, 1, world, 0, 0, 0);
[merge_posts_bbcode]Добавлено: 28.10.2014 22:55:42[/merge_posts_bbcode]

Asd73 написал(а):
В джаве "new Конструктор()" создает объект.
1) Зачем тебе там несколько объектов?
2) Создавать объект класса TileEntitySlot нужно в блоке, в методе createNewTileEntity. При этом созданный объект будет использоваться внутри майнкрафта. А если ты просто создашь объект и никуда не передашь ссылку на него, то никто об этом объекте не узнает.

Вместо new TileEntitySlot() нужно вставить world.getTileEntity(x, y, z), то есть ссылку на уже использующийся в игре TileEntity.
не понял твоего бреда. ты видемо вообще не понимаешь что говоришь. и очем речь идет. С твоей ахинеей крашит при открытии гуи, а с моей все слоты, являются рабочими. Да и я спрашивал, почему не перемещаются предметы при помощи мыши и как обрабатывать нахождение предмета в слоте.
 
Agravaine написал(а):
Он правильно говорит!
не знаю, что он говорит, но то что он написал нет ни в одном примере ни в одном гуи маина. да и от темы отклоняемся. Интересует, почему не работает перемещение предметов.
 
ЧУВАК, ТЫ ТАЙЛ ВООБЩЕ НОВЫЙ ДАЕШЬ!
ЕГО НАДО В АРГУМЕНТЫ ДАВАТЬ И ПИХАТЬ В СЛОТ, А В ГУИ ХАНДЛЕРЕ В КОНСТРУКТОР ДАВАТЬ world.getTileEntity(x, y, z)!
[merge_posts_bbcode]Добавлено: 29.10.2014 00:20:00[/merge_posts_bbcode]

В КОНТЕЙНЕР ПЕЧИ ЗАГЛЯНь.
 
Вот и помогай людям...
Да, из-за этого не может возникнуть невозможность перемещения предметов.
Но из-за этого предметы в инвентаре блока будут просто исчезать.
Kuroi написал(а):
нет ни в одном примере ни в одном гуи маина.
Да неужели?
http://www.minecraftforge.net/wiki/Containers_and_GUIs
Контейнер
Код:
public ContainerTiny (InventoryPlayer inventoryPlayer, TileEntityTiny te){
tileEntity = te;
...
addSlotToContainer(new Slot(tileEntity, j + i * 3, 62 + j * 18, 17 + i * 18));


GuiHandler
Код:
                TileEntity tileEntity = world.getBlockTileEntity(x, y, z);
                if(tileEntity instanceof TileEntityTiny){
                        return new ContainerTiny(player.inventory, (TileEntityTiny) tileEntity);
Ну и чем это отличается от того что я написал выше?
Ты похоже не понимаешь что такое объект и ссылка на объект.
 
Asd73 написал(а):
Вот и помогай людям...
Да, из-за этого не может возникнуть невозможность перемещения предметов.
Но из-за этого предметы в инвентаре блока будут просто исчезать.
Kuroi написал(а):
нет ни в одном примере ни в одном гуи маина.
Да неужели?
http://www.minecraftforge.net/wiki/Containers_and_GUIs
Контейнер
Код:
public ContainerTiny (InventoryPlayer inventoryPlayer, TileEntityTiny te){
tileEntity = te;
...
addSlotToContainer(new Slot(tileEntity, j + i * 3, 62 + j * 18, 17 + i * 18));


GuiHandler
Код:
                TileEntity tileEntity = world.getBlockTileEntity(x, y, z);
                if(tileEntity instanceof TileEntityTiny){
                        return new ContainerTiny(player.inventory, (TileEntityTiny) tileEntity);
Ну и чем это отличается от того что я написал выше?
Ты похоже не понимаешь что такое объект и ссылка на объект.
Вообще перестало гуи открываться. getBlockTileEntity подчеркивает красным.
Код:
TileEntity tileEntity = world.getTileEntity(x, y, z);
            if(tileEntity instanceof TileEntitySlot){
                return new GuiContainerMod(player.inventory, (TileEntitySlot) tileEntity);
            }
я наверное инвалид, вообще не понимаю что за фигня, вы говорите, что так правельно, но так не работает тоже.
GuiHandler.class
Код:
package spellflex.kuroi.rpg.gui;

import net.minecraft.entity.player.EntityPlayer;
import net.minecraft.entity.player.InventoryPlayer;
import net.minecraft.tileentity.TileEntity;
import net.minecraft.world.World;
import cpw.mods.fml.common.network.IGuiHandler;

public class GuiHandler implements IGuiHandler {

    public Object getServerGuiElement(int ID, EntityPlayer player, World world, int x, int y, int z) {
        switch(ID){
        case 1:
            TileEntity tileEntity = world.getTileEntity(x, y, z);
            if(tileEntity instanceof TileEntitySlot){
                return new GuiContainerMod(player.inventory, (TileEntitySlot) tileEntity);
            }
        default:
            return null;
        }
    }

    @Override
    public Object getClientGuiElement(int ID, EntityPlayer player, World world, int x, int y, int z) {
        switch(ID){
        case 1:
            TileEntity tileEntity = world.getTileEntity(x, y, z);
            if(tileEntity instanceof TileEntitySlot){
                return new GuiWindow(player.inventory, (TileEntitySlot) tileEntity);
            }
        default:
            return null;
        }
    }

}
GuiContainerMod.class
Код:
package spellflex.kuroi.rpg.gui;

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.InventoryCraftResult;
import net.minecraft.inventory.InventoryCrafting;
import net.minecraft.inventory.Slot;
import net.minecraft.inventory.SlotCrafting;
import net.minecraft.item.ItemStack;
import net.minecraft.world.World;

public class GuiContainerMod extends Container  {
    private World worldObj;

    public GuiContainerMod (InventoryPlayer inventoryPlayer, TileEntitySlot te){
        this.worldObj = Minecraft.getMinecraft().theWorld;
        this.addSlotToContainer(new Slot(te, 1, 30+18, 17));
        this.addSlotToContainer(new Slot(te, 2, 30+18, 17+18));
        bindPlayerInventory(inventoryPlayer);
    }

    protected void bindPlayerInventory(InventoryPlayer inventoryPlayer) {
        
        int i;
        for(i = 0; i < 3; ++i){
            for(int j = 0; j < 9; ++j){
                this.addSlotToContainer(new Slot(inventoryPlayer, j + i * 9 + 9, 8 + j * 18, 84 + i * 18));
            }
        }
        
        for(i = 0; i < 9; ++i){
            this.addSlotToContainer(new Slot(inventoryPlayer, i , 8 + i * 18 , 142));
        }
    }

    @Override
    public boolean canInteractWith(EntityPlayer p_75145_1_) {
        return new TileEntitySlot().isUseableByPlayer(p_75145_1_);
    }
    public void onContainerClosed(EntityPlayer p_75134_1_)
    {
        super.onContainerClosed(p_75134_1_);

        if (!this.worldObj.isRemote)
        {
            for (int i = 0; i < 3; ++i)
            {
                ItemStack itemstack = new TileEntitySlot().getStackInSlotOnClosing(i);

                if (itemstack != null)
                {
                    p_75134_1_.dropPlayerItemWithRandomChoice(itemstack, false);
                }
            }
        }
    }

    public ItemStack transferStackInSlot(EntityPlayer player, int slot) {
        return null;
    }
}
GuiWindow.class
Код:
package spellflex.kuroi.rpg.gui;

import org.lwjgl.input.Keyboard;
import org.lwjgl.opengl.GL11;

import spellflex.kuroi.rpg.Setings;
import cpw.mods.fml.common.FMLCommonHandler;
import net.minecraft.client.gui.GuiButton;
import net.minecraft.client.gui.GuiScreen;
import net.minecraft.client.gui.inventory.GuiContainer;
import net.minecraft.client.resources.I18n;
import net.minecraft.entity.player.EntityPlayer;
import net.minecraft.entity.player.InventoryPlayer;
import net.minecraft.init.Blocks;
import net.minecraft.item.ItemStack;
import net.minecraft.server.MinecraftServer;
import net.minecraft.util.ResourceLocation;
import net.minecraft.world.World;

public class GuiWindow extends GuiContainer
{
int xSize = 190;
int ySize = 190;

public GuiWindow(InventoryPlayer inventory, TileEntitySlot tileEntity) {
    super(new GuiContainerMod(inventory, tileEntity));
}

protected void drawGuiContainerBackgroundLayer(float par1, int par2, int par3)
{
    GL11.glColor4f(1.0F, 1.0F, 1.0F, 1.0F);
    this.mc.renderEngine.bindTexture(new ResourceLocation(Setings.MODID +":textures/GUI/UpWeapons.png"));
    int k = (this.width - xSize) / 2;
    int l = (this.height - ySize) / 2;
    this.drawTexturedModalRect(k, l, 0, 0, xSize, ySize);
}

protected void drawGuiContainerForegroundLayer(int par1, int par2){
    this.fontRendererObj.drawString(I18n.format("container.inventory", new Object[0]), 8, 73, 4210752);
}

}
TileEntitySlot.class
Код:
package spellflex.kuroi.rpg.gui;

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

public class TileEntitySlot extends TileEntity implements IInventory {

        private ItemStack[] inv;

        public TileEntitySlot(){
                inv = new ItemStack[9];
        }
        
        @Override
        public int getSizeInventory() {
                return inv.length;
        }

        @Override
        public ItemStack getStackInSlot(int slot) {
                return inv[slot];
        }
        
        @Override
        public void setInventorySlotContents(int slot, ItemStack stack) {
                inv[slot] = stack;
                if (stack != null && stack.stackSize > getInventoryStackLimit()) {
                        stack.stackSize = getInventoryStackLimit();
                }               
        }

        @Override
        public ItemStack decrStackSize(int slot, int amt) {
                ItemStack stack = getStackInSlot(slot);
                if (stack != null) {
                        if (stack.stackSize <= amt) {
                                setInventorySlotContents(slot, null);
                        } else {
                                stack = stack.splitStack(amt);
                                if (stack.stackSize == 0) {
                                        setInventorySlotContents(slot, null);
                                }
                        }
                }
                return stack;
        }

        @Override
        public ItemStack getStackInSlotOnClosing(int slot) {
                ItemStack stack = getStackInSlot(slot);
                if (stack != null) {
                        setInventorySlotContents(slot, null);
                }
                return stack;
        }
        
        @Override
        public int getInventoryStackLimit() {
                return 64;
        }

        @Override
        public boolean isUseableByPlayer(EntityPlayer player) {
                return worldObj.getTileEntity(xCoord, yCoord, zCoord) == this &&
                player.getDistanceSq(xCoord + 0.5, yCoord + 0.5, zCoord + 0.5) < 64;
        }

        public void openChest() {}

        public void closeChest() {}

        @Override
        public void writeToNBT(NBTTagCompound tagCompound) {
                super.writeToNBT(tagCompound);
                                
                NBTTagList itemList = new NBTTagList();
                for (int i = 0; i < inv.length; i++) {
                        ItemStack stack = inv[i];
                        if (stack != null) {
                                NBTTagCompound tag = new NBTTagCompound();
                                tag.setByte("Slot", (byte) i);
                                stack.writeToNBT(tag);
                                itemList.appendTag(tag);
                        }
                }
                tagCompound.setTag("Inventory", itemList);
        }

                @Override
                public String getInventoryName() {
                        return "spellflexrpg.upweapons";
                }

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

                @Override
                public void openInventory() {
                }

                @Override
                public void closeInventory() {
                }

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


Что и где не так? только по подробнее плиз. Мозги кипят о того, что и сам на пробовал и от того, что многие пишут непонятно для меня. Я всю жизнь писал на php с джава вроде как но, вот пытаюсь понять этот модинг, учиться всегда лучше на практике. Если у кого есть возможность и желание исправьте мой код и покажите где, что я нарукокрючел.
 
Назад
Сверху