GUI внутри игрока 1.12.2

Версия Minecraft
1.12.2
API
Forge
122
4
6
Привет всем. Немного застопорился в написании.

2022-06-14_17.39.49.png2022-06-14_17.39.52.png2022-06-14_17.42.32.png2022-06-14_17.42.39.png2022-06-14_17.42.42.png

Ни как не могу написать слот для для предметов слева. Постоянно крашит майн если добавляю слоты туда. + ко всему прочему нужно распределение по типу для каждого слота в левой части, пробовал код из baubles но опять же крашит. Подскажите кто за это шарит, заранее спасибо.
То что сейчас есть:
ContainerTrinkets:
public class ContainerTrinkets extends Container {
    public final InventoryCrafting craftMatrix = new InventoryCrafting(this, 2, 2);
    public final InventoryCraftResult craftResult = new InventoryCraftResult();
    public ITrinketContainerHandler trinket;
    private final EntityPlayer player;
    private static final EntityEquipmentSlot[] equipmentSlots = new EntityEquipmentSlot[] { EntityEquipmentSlot.HEAD, EntityEquipmentSlot.CHEST, EntityEquipmentSlot.LEGS, EntityEquipmentSlot.FEET};
    
    public ContainerTrinkets(final InventoryPlayer playerInv, boolean client, final EntityPlayer player) {
        this.player = player;
        this.addSlotToContainer(new SlotCrafting(playerInv.player, this.craftMatrix, this.craftResult, 0, 154, 28));
        
        int slotRowAmount;
        int slotRowLength;
        
        //Кравт
        for (slotRowAmount = 0; slotRowAmount < 2; ++slotRowAmount) for (slotRowLength = 0; slotRowLength < 2; ++slotRowLength) {
            this.addSlotToContainer(new Slot(this.craftMatrix, slotRowLength + slotRowAmount * 2, 98 + slotRowLength * 18, 18 + slotRowAmount * 18));
        }
        
        //this.addSlotToContainer(new SlotTrinket(player, trinket, 0, 77, 8));
        
        //Броня
        for (slotRowAmount = 0; slotRowAmount < 4; ++slotRowAmount) {
            final EntityEquipmentSlot entityequipmentslot = ContainerTrinkets.equipmentSlots[slotRowAmount];

            this.addSlotToContainer(new Slot(playerInv, 36 + (3 - slotRowAmount), 8, 8 + slotRowAmount * 18) {
                public int getSlotStackLimit() { return 1; }
                public boolean isItemValid(ItemStack stack) { return stack.getItem().isValidArmor(stack, entityequipmentslot, player); }
                public boolean canTakeStack(EntityPlayer player) {
                    ItemStack stack = this.getStack();
                    return !stack.isEmpty() && !player.isCreative() && EnchantmentHelper.hasBindingCurse(stack) ? false : super.canTakeStack(player);
                }
                public String getSlotTexture() { return ItemArmor.EMPTY_SLOT_NAMES[entityequipmentslot.getIndex()]; }
            });
        }
        //Инвентарь
        for (slotRowAmount = 0; slotRowAmount < 3; ++slotRowAmount) for (slotRowLength = 0; slotRowLength < 9; ++slotRowLength) {
            this.addSlotToContainer(new Slot(playerInv, slotRowLength + (slotRowAmount + 1) * 9, 8 + slotRowLength * 18, 84 + slotRowAmount * 18));
        }
        //Хотбар
        for (slotRowAmount = 0; slotRowAmount < 9; ++slotRowAmount) {
            this.addSlotToContainer(new Slot(playerInv, slotRowAmount, 8 + slotRowAmount * 18, 142));
        }
        //Слот щита
        this.addSlotToContainer(new Slot(playerInv, 40, 77, 62) {
            public boolean isItemValid(ItemStack stack) {
                return super.isItemValid(stack);
            }
            public String getSlotTexture() {
                return "minecraft:items/empty_armor_slot_shield";
            }
        });
        this.onCraftMatrixChanged(this.craftMatrix);
    }
    
    public void onCraftMatrixChanged(IInventory par1IInventory) {
        this.slotChangedCraftingGrid(this.player.getEntityWorld(), this.player, this.craftMatrix, this.craftResult);
    }

    public void onContainerClosed(EntityPlayer player) {
        super.onContainerClosed(player);
        this.craftResult.clear();
        if (!player.world.isRemote) this.clearContainer(player, player.world, this.craftMatrix);
    }
    
    @Override
    public ItemStack transferStackInSlot(EntityPlayer player, int index) {
        ItemStack itemstack = ItemStack.EMPTY;
        Slot slot = (Slot)this.inventorySlots.get(index);

        if (slot != null && slot.getHasStack()) {
            ItemStack itemstack1 = slot.getStack();
            itemstack = itemstack1.copy();

            EntityEquipmentSlot entityequipmentslot = EntityLiving.getSlotForItemStack(itemstack);
            
            int slotShift = trinket.getSlots();

            if (index == 0) {
                if (!this.mergeItemStack(itemstack1, 9+ slotShift, 45+ slotShift, true)) return ItemStack.EMPTY;
                slot.onSlotChange(itemstack1, itemstack);
            }
            else if (index >= 1 && index < 5) if (!this.mergeItemStack(itemstack1, 9+ slotShift, 45+ slotShift, false)) return ItemStack.EMPTY;
            else if (index >= 5 && index < 9) if (!this.mergeItemStack(itemstack1, 9+ slotShift, 45+ slotShift, false)) return ItemStack.EMPTY;
            // baubles -> inv
            else if (index >= 9 && index < 9+slotShift) if (!this.mergeItemStack(itemstack1, 9+ slotShift, 45+ slotShift, false)) return ItemStack.EMPTY;
            // inv -> armor
            else if (entityequipmentslot.getSlotType() == EntityEquipmentSlot.Type.ARMOR && !((Slot)this.inventorySlots.get(8 - entityequipmentslot.getIndex())).getHasStack()) {
                int i = 8 - entityequipmentslot.getIndex();
                if (!this.mergeItemStack(itemstack1, i, i + 1, false)) return ItemStack.EMPTY;
            }
            // inv -> offhand
            else if (entityequipmentslot == EntityEquipmentSlot.OFFHAND && !((Slot)this.inventorySlots.get(45+ slotShift)).getHasStack()) {
                if (!this.mergeItemStack(itemstack1, 45+ slotShift, 46+ slotShift, false)) return ItemStack.EMPTY;
            }
            else if (index >= 9+ slotShift && index < 36+ slotShift) {
                if (!this.mergeItemStack(itemstack1, 36+ slotShift, 45+ slotShift, false)) return ItemStack.EMPTY;
            }
            else if (index >= 36+ slotShift && index < 45+ slotShift) {
                if (!this.mergeItemStack(itemstack1, 9+ slotShift, 36+ slotShift, false)) return ItemStack.EMPTY;
            }
            else if (!this.mergeItemStack(itemstack1, 9+ slotShift, 45+ slotShift, false)) return ItemStack.EMPTY;
            
            if (itemstack1.isEmpty()) slot.putStack(ItemStack.EMPTY); else slot.onSlotChanged();
            if (itemstack1.getCount() == itemstack.getCount()) return ItemStack.EMPTY;

            ItemStack itemstack2 = slot.onTake(player, itemstack1);

            if (index == 0) player.dropItem(itemstack2, false);
        }
        return itemstack;
    }

    public boolean canMergeSlot(ItemStack stack, Slot slot) {
        return slot.inventory != this.craftResult && super.canMergeSlot(stack, slot);
    }
    
    public boolean canInteractWith(EntityPlayer player) {
        return true;
    }
    
}
ITrinketContainerHandler:
public interface ITrinketContainerHandler extends IItemHandlerModifiable {
    public boolean isItemValidForSlot(int slot, ItemStack stack, EntityLivingBase player);

    /**
     * Used internally to prevent equip/unequip events from triggering when they shouldn't
     */
    public boolean isEventBlocked();
    public void setEventBlock(boolean blockEvents);

    /**
     * Used internally for syncing. Indicates if the inventory has changed since last sync
     */
    boolean isChanged(int slot);
    void setChanged(int slot, boolean changed);

    public void setPlayer(EntityLivingBase player);
}
SlotTrinket:
public class SlotTrinket extends SlotItemHandler {
    int slot;
    EntityPlayer player;

    public SlotTrinket(EntityPlayer player, ITrinketContainerHandler itemHandler, int index, int xPosition, int yPosition) {
        super(itemHandler, index, xPosition, yPosition);
        this.slot = index;
        this.player = player;
    }

    public boolean isItemValid(ItemStack stack) {
        return ((ITrinketContainerHandler) this.getItemHandler()).isItemValidForSlot(this.slot, stack, this.player);
    }

    public int getSlotStackLimit() {
        return 1;
    }
}
 
122
4
6
CustomSlot:
public class CustomSlot extends SlotItemHandler {

    int tSlot;
    EntityPlayer player;

    public CustomSlot(EntityPlayer player, ITrinketContainerHandler itemHandler, int slot, int par4, int par5) {
        super(itemHandler, slot, par4, par5);
        this.tSlot = slot;
        this.player = player;
    }

    /**
     * Check if the stack is a valid item for this slot.
     */
    @Override
    public boolean isItemValid(ItemStack stack) {
        return ((ITrinketContainerHandler) getItemHandler()).isItemValidForSlot(tSlot, stack, player);
    }

    @Override
    public boolean canTakeStack(EntityPlayer player) {
        ItemStack stack = getStack();
        if(stack.isEmpty()) return false;
        ITrinket bauble = stack.getCapability(TrinketsCapabilities.CAPABILITY_ITEM_TRINKET, null);
        return bauble.canUnequip(stack, player);
    }

    @Override
    public ItemStack onTake(EntityPlayer playerIn, ItemStack stack) {
        if (!getHasStack() && !((ITrinketContainerHandler) getItemHandler()).isEventBlocked() &&
                stack.hasCapability(TrinketsCapabilities.CAPABILITY_ITEM_TRINKET, null)) {
            stack.getCapability(TrinketsCapabilities.CAPABILITY_ITEM_TRINKET, null).onUnequipped(stack, playerIn);
        }
        super.onTake(playerIn, stack);
        return stack;
    }

    @Override
    public void putStack(ItemStack stack) {
        if (getHasStack() && !ItemStack.areItemStacksEqual(stack,getStack()) &&
                !((ITrinketContainerHandler) getItemHandler()).isEventBlocked() &&
                getStack().hasCapability(TrinketsCapabilities.CAPABILITY_ITEM_TRINKET, null)) {
            getStack().getCapability(TrinketsCapabilities.CAPABILITY_ITEM_TRINKET, null).onUnequipped(getStack(), player);
        }

        ItemStack oldstack = getStack().copy();
        super.putStack(stack);

        if (getHasStack() && !ItemStack.areItemStacksEqual(oldstack,getStack())
                && !((ITrinketContainerHandler) getItemHandler()).isEventBlocked() &&
                getStack().hasCapability(TrinketsCapabilities.CAPABILITY_ITEM_TRINKET, null)) {
            getStack().getCapability(TrinketsCapabilities.CAPABILITY_ITEM_TRINKET, null).onEquipped(getStack(), player);
        }
    }

    @Override
    public int getSlotStackLimit() {
        return 1;
    }
}
ContainerTrinkets:
public class ContainerTrinkets extends Container {
    public final InventoryCrafting craftMatrix = new InventoryCrafting(this, 2, 2);
    public final InventoryCraftResult craftResult = new InventoryCraftResult();
    public ITrinketContainerHandler trinket;
    
    public boolean isLocalWorld;
    private final EntityPlayer _player;
    private static final EntityEquipmentSlot[] equipmentSlots = new EntityEquipmentSlot[] { EntityEquipmentSlot.HEAD, EntityEquipmentSlot.CHEST, EntityEquipmentSlot.LEGS, EntityEquipmentSlot.FEET};
    
    public ContainerTrinkets(InventoryPlayer playerInv, boolean par2, EntityPlayer player) {
        this.isLocalWorld = par2;
        this._player = player;
        trinket = player.getCapability(TrinketsCapabilities.CAPABILITY_TRINKET, null);
        
        this.addSlotToContainer(new SlotCrafting(playerInv.player, this.craftMatrix, this.craftResult, 0, 154, 28));
        
        int slotRowAmount;
        int slotRowLength;
        
        //Кравт
        for (slotRowAmount = 0; slotRowAmount < 2; ++slotRowAmount) for (slotRowLength = 0; slotRowLength < 2; ++slotRowLength) {
            this.addSlotToContainer(new Slot(this.craftMatrix, slotRowLength + slotRowAmount * 2, 98 + slotRowLength * 18, 18 + slotRowAmount * 18));
        }
        
        this.addSlotToContainer(new CustomSlot(player, trinket, 0, -45, 8));
        this.addSlotToContainer(new CustomSlot(player, trinket, 1, -26, 8));
        this.addSlotToContainer(new CustomSlot(player, trinket, 2, -45, 26));
        this.addSlotToContainer(new CustomSlot(player, trinket, 3, -26, 26));
        this.addSlotToContainer(new CustomSlot(player, trinket, 4, -45, 44));
        this.addSlotToContainer(new CustomSlot(player, trinket, 5, -26, 44));
        this.addSlotToContainer(new CustomSlot(player, trinket, 6, -45, 62));
        this.addSlotToContainer(new CustomSlot(player, trinket, 7, -26, 62));
        this.addSlotToContainer(new CustomSlot(player, trinket, 8, -45, 80));
        this.addSlotToContainer(new CustomSlot(player, trinket, 9, -26, 80));
        
        //Броня
        for (slotRowAmount = 0; slotRowAmount < 4; ++slotRowAmount) {
            final EntityEquipmentSlot entityequipmentslot = ContainerTrinkets.equipmentSlots[slotRowAmount];

            this.addSlotToContainer(new Slot(playerInv, 36 + (3 - slotRowAmount), 8, 8 + slotRowAmount * 18) {
                @Override public int getSlotStackLimit() { return 1; }
                @Override public boolean isItemValid(ItemStack stack) { return stack.getItem().isValidArmor(stack, entityequipmentslot, player); }
                @Override public boolean canTakeStack(EntityPlayer player) {
                    ItemStack stack = this.getStack();
                    return !stack.isEmpty() && !player.isCreative() && EnchantmentHelper.hasBindingCurse(stack) ? false : super.canTakeStack(player);
                }
                @Override public String getSlotTexture() { return ItemArmor.EMPTY_SLOT_NAMES[entityequipmentslot.getIndex()]; }
            });
        }
        //Инвентарь
        for (slotRowAmount = 0; slotRowAmount < 3; ++slotRowAmount) for (slotRowLength = 0; slotRowLength < 9; ++slotRowLength) {
            this.addSlotToContainer(new Slot(playerInv, slotRowLength + (slotRowAmount + 1) * 9, 8 + slotRowLength * 18, 84 + slotRowAmount * 18));
        }
        //Хотбар
        for (slotRowAmount = 0; slotRowAmount < 9; ++slotRowAmount) {
            this.addSlotToContainer(new Slot(playerInv, slotRowAmount, 8 + slotRowAmount * 18, 142));
        }
        //Слот щита
        this.addSlotToContainer(new Slot(playerInv, 40, 77, 62) {
            @Override public boolean isItemValid(ItemStack stack) { return super.isItemValid(stack); }
            @Override public String getSlotTexture() { return "minecraft:items/empty_armor_slot_shield"; }
        });
        this.onCraftMatrixChanged(this.craftMatrix);
    }
    
    @Override
    public void onCraftMatrixChanged(IInventory par1IInventory) {
        this.slotChangedCraftingGrid(this._player.getEntityWorld(), this._player, this.craftMatrix, this.craftResult);
    }
    
    @Override
    public void onContainerClosed(EntityPlayer player) {
        super.onContainerClosed(player);
        this.craftResult.clear();
        if (!player.world.isRemote) this.clearContainer(player, player.world, this.craftMatrix);
    }
    
    @Override
    public boolean canInteractWith(EntityPlayer par1EntityPlayer) { return true; }
    
    @Override
    public ItemStack transferStackInSlot(EntityPlayer playerIn, int index) {
        ItemStack itemstack = ItemStack.EMPTY;
        Slot slot = (Slot)this.inventorySlots.get(index);

        if (slot != null && slot.getHasStack()) {
            ItemStack itemstack1 = slot.getStack();
            itemstack = itemstack1.copy();

            EntityEquipmentSlot entityequipmentslot = EntityLiving.getSlotForItemStack(itemstack);
            
            int slotShift = trinket.getSlots();

            if (index == 0) {
                if (!this.mergeItemStack(itemstack1, 9+ slotShift, 45+ slotShift, true)) return ItemStack.EMPTY;
                slot.onSlotChange(itemstack1, itemstack);
            }
            else if (index >= 1 && index < 5) if (!this.mergeItemStack(itemstack1, 9+ slotShift, 45+ slotShift, false)) return ItemStack.EMPTY;
            else if (index >= 5 && index < 9) if (!this.mergeItemStack(itemstack1, 9+ slotShift, 45+ slotShift, false)) return ItemStack.EMPTY;
            
            // baubles -> inv
            else if (index >= 9 && index < 9+slotShift) if (!this.mergeItemStack(itemstack1, 9+ slotShift, 45+ slotShift, false)) return ItemStack.EMPTY;
            // inv -> armor
            else if (entityequipmentslot.getSlotType() == EntityEquipmentSlot.Type.ARMOR && !((Slot)this.inventorySlots.get(8 - entityequipmentslot.getIndex())).getHasStack()) {
                int i = 8 - entityequipmentslot.getIndex();
                if (!this.mergeItemStack(itemstack1, i, i + 1, false)) return ItemStack.EMPTY;
            }
            // inv -> offhand
            else if (entityequipmentslot == EntityEquipmentSlot.OFFHAND && !((Slot)this.inventorySlots.get(45+ slotShift)).getHasStack()) if (!this.mergeItemStack(itemstack1, 45+ slotShift, 46+ slotShift, false)) return ItemStack.EMPTY;
            // inv -> bauble
            else if (itemstack.hasCapability(TrinketsCapabilities.CAPABILITY_ITEM_TRINKET, null)) {
                ITrinket bauble = itemstack.getCapability(TrinketsCapabilities.CAPABILITY_ITEM_TRINKET, null);
                for (int baubleSlot : bauble.getBaubleType(itemstack).getValidSlots()) {
                    if ( bauble.canEquip(itemstack1, _player) && !((Slot)this.inventorySlots.get(baubleSlot+9)).getHasStack() &&
                            !this.mergeItemStack(itemstack1, baubleSlot+9, baubleSlot + 10, false)) return ItemStack.EMPTY;
                    if (itemstack1.getCount() == 0) break;
                }
            }
            else if (index >= 9+ slotShift && index < 36+ slotShift) if (!this.mergeItemStack(itemstack1, 36+ slotShift, 45+ slotShift, false)) return ItemStack.EMPTY;
            else if (index >= 36+ slotShift && index < 45+ slotShift) if (!this.mergeItemStack(itemstack1, 9+ slotShift, 36+ slotShift, false)) return ItemStack.EMPTY;
            else if (!this.mergeItemStack(itemstack1, 9+ slotShift, 45+ slotShift, false)) return ItemStack.EMPTY;
            if (itemstack1.isEmpty()) slot.putStack(ItemStack.EMPTY); else slot.onSlotChanged();
            if (itemstack1.getCount() == itemstack.getCount()) return ItemStack.EMPTY;
            if (itemstack1.isEmpty() && !trinket.isEventBlocked() && slot instanceof CustomSlot &&
                    itemstack.hasCapability(TrinketsCapabilities.CAPABILITY_ITEM_TRINKET, null)) {
                itemstack.getCapability(TrinketsCapabilities.CAPABILITY_ITEM_TRINKET, null).onUnequipped(itemstack, playerIn);
            }
            ItemStack itemstack2 = slot.onTake(playerIn, itemstack1);
            if (index == 0) playerIn.dropItem(itemstack2, false);
        }
        return itemstack;
    }

      @Override
      public boolean canMergeSlot(ItemStack stack, Slot slot) {
          return slot.inventory != this.craftResult && super.canMergeSlot(stack, slot);
      }
}
Java:
@EventHandler public static void preInit(FMLPreInitializationEvent event) {
        CapabilityManager.INSTANCE.register(ITrinketContainerHandler.class, new TrinketsCapabilities.CapabilityBaubles<ITrinketContainerHandler>(), TContainer.class);
        CapabilityManager.INSTANCE.register(ITrinket.class, new TrinketsCapabilities.CapabilityItemTrinketStorage(), () -> new TrinketItem(TrinketType.TRINKET));
        
        proxy.preInit(event);
}
Java:
@EventHandler public static void init(FMLInitializationEvent event) {
        NetworkRegistry.INSTANCE.registerGuiHandler(MODID, new GuiHandler());
        
        proxy.init(event);
}
Java:
public class GuiHandler implements IGuiHandler {
    @Override
    public Object getServerGuiElement(int id, EntityPlayer player, World world, int x, int y, int z) {
        if (world instanceof WorldServer) switch (id) {
            case GuiTrinkets.ID : return new ContainerTrinkets(player.inventory, !world.isRemote, player);
        }
        return null;
    }
    @Override
    public Object getClientGuiElement(int id, EntityPlayer player, World world, int x, int y, int z) {
        if (world instanceof WorldClient)switch (id) {
            case GuiTrinkets.ID : return new GuiTrinkets(player);
        }
        return null;
    }
}

Java:
java.lang.NullPointerException: Rendering screen
    at net.minecraftforge.items.SlotItemHandler.getStack(SlotItemHandler.java:79)
    at net.minecraft.client.gui.inventory.GuiContainer.drawSlot(GuiContainer.java:234)
    at net.minecraft.client.gui.inventory.GuiContainer.drawScreen(GuiContainer.java:116)
    at net.minecraft.client.renderer.InventoryEffectRenderer.drawScreen(InventoryEffectRenderer.java:59)
    at the_end_game.gui.inventory.GuiTrinkets.drawScreen(GuiTrinkets.java:24)
    at net.minecraftforge.client.ForgeHooksClient.drawScreen(ForgeHooksClient.java:396)
    at net.minecraft.client.renderer.EntityRenderer.updateCameraAndRender(EntityRenderer.java:1177)
    at net.minecraft.client.Minecraft.runGameLoop(Minecraft.java:1209)
    at net.minecraft.client.Minecraft.run(Minecraft.java:442)
    at net.minecraft.client.main.Main.main(Main.java:118)
    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 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.minecraftforge.gradle.GradleStartCommon.launch(GradleStartCommon.java:97)
    at GradleStart.main(GradleStart.java:25)
я уже несколько раз переписывал но все равно крашит при открытии инвенторя
 
Я тебе конечно с этим не совсем помогу если пооучишь достоцный ответ маякни мне, мне тоже надо. Но я сделал немного по лругому.
Зачем менять что то старое если можно создать независящее новое, я просто создал новый ГИП и оснастил его полуинвентарем. подключаешь на любую свободную клавише и паба у тебя открывается дополнительные слоты не конфликтующие с ванильным инвентарем.
 
627
72
178
проблема с отображением надписей предметов в инвенторе.
для этого отдельный метод в своём гуи вызывать надо. в drawScreen после всего - this.renderHoveredToolTip(mouseX, mouseY);
(но с него сначала нужно снять protected модификатор через AT)
public net.minecraft.client.gui.inventory.GuiContainer func_191948_b(II)V на stable-маппингах так должно быть
 
122
4
6
Кнопка не нажимается
Java:
public class CustomButton extends GuiButton {
    private final GuiContainer perentGui;
    public ResourceLocation IMG_GUI = new ResourceLocation(Main.MODID + ":textures/gui/trinkets_inventori.png");
   
    public CustomButton(int buttonId, GuiContainer gui, int x, int y, int widthIn, int heightIn, String buttonText) {
        super(buttonId, x, y, widthIn, heightIn, buttonText);
        this.perentGui = gui;
    }
   
    @Override //Вот эта часть 
    public boolean mousePressed(Minecraft mc, int mouseX, int mouseY) {
        boolean pressed = super.mousePressed(mc, mouseX - this.perentGui.getGuiLeft(), mouseY);
        if (pressed) {
            if (perentGui instanceof GuiInventory) NetworkHandler.network.sendToServer(new OpenInventoryMessage());
             else {
                ((CustimGui) perentGui).displayNormalInventory();
                NetworkHandler.network.sendToServer(new OpenNormalInventoryMessage());
            }
        }
        return pressed;
    } //------------------//
   
    public void drawButton(Minecraft mc, int mouseX, int mouseY, float partialTicks) {
        if (this.visible) {
            FontRenderer fontrenderer = mc.fontRenderer;
            mc.getTextureManager().bindTexture(IMG_GUI);
            GlStateManager.color(1.0F, 1.0F, 1.0F, 1.0F);
            this.hovered = mouseX >= this.x && mouseY >= this.y && mouseX < this.x + this.width && mouseY < this.y + this.height;
            int k = this.getHoverState(this.hovered);

            GlStateManager.enableBlend();
            GlStateManager.tryBlendFuncSeparate(GlStateManager.SourceFactor.SRC_ALPHA, GlStateManager.DestFactor.ONE_MINUS_SRC_ALPHA, GlStateManager.SourceFactor.ONE, GlStateManager.DestFactor.ZERO);
            GlStateManager.blendFunc(GlStateManager.SourceFactor.SRC_ALPHA, GlStateManager.DestFactor.ONE_MINUS_SRC_ALPHA);
           
            if (k == 1) this.drawTexturedModalRect(x, y, 72, 0, 20, 20); else this.drawTexturedModalRect(x, y, 72, 20, 20, 20);
           
            this.mouseDragged(mc, mouseX, mouseY);
            int j = 14737632;
            if (packedFGColour != 0) j = packedFGColour;
            else if (!this.enabled) j = 10526880;
            else if (this.hovered) j = 16777120;
            this.drawCenteredString(fontrenderer, this.displayString, this.x + this.width / 2, this.y + (this.height - 8) / 2, j);
        }
    }
}
 
122
4
6
Java:
public void drawScreen(int mouseX, int mouseY, float partialTicks) {
        this.drawDefaultBackground(); //темный задник
        super.drawScreen(mouseX, mouseY, partialTicks);
        this.oldMouseX = (float)mouseX;
        this.oldMouseY = (float)mouseY;
        this.renderHoveredToolTip(mouseX, mouseY); //отрисовка надписей
    }
    
    @Override
    protected void drawGuiContainerForegroundLayer(int mouseX, int mouseY) {
        this.fontRenderer.drawString(I18n.format("container.crafting"), 97, 8, 4210752);
    }
    
    protected void drawGuiContainerBackgroundLayer(float partialTicks, int mouseX, int mouseY) {
        GlStateManager.pushMatrix();
        GlStateManager.color(1.0f, 1.0f, 1.0f, 1.0f);
        
        this.mc.getTextureManager().bindTexture(GuiInventory.INVENTORY_BACKGROUND);
        this.drawTexturedModalRect(this.guiLeft, this.guiTop, 0, 0, this.xSize, this.ySize);
        
        this.mc.getTextureManager().bindTexture(IMG_GUI);
        this.drawTexturedModalRect(this.guiLeft +- 53, this.guiTop, 0, 0, 51, 104);
        
        GlStateManager.color(1.0F, 1.0F, 1.0F, 1.0F);
        GuiInventory.drawEntityOnScreen(this.guiLeft + 51, this.guiTop + 75, 30, (float) (this.guiLeft + 51) - this.oldMouseX, (float) (this.guiTop + 75 - 50) - this.oldMouseY, this.mc.player);
        GlStateManager.popMatrix();
    }

    public void displayNormalInventory() {
        GuiInventory gui = new GuiInventory(this.mc.player);
        ReflectionHelper.setPrivateValue(GuiInventory.class, gui, this.oldMouseX, "oldMouseX", "field_147048_u");
        ReflectionHelper.setPrivateValue(GuiInventory.class, gui, this.oldMouseY, "oldMouseY", "field_147047_v");
        this.mc.displayGuiScreen(gui);
    }
При нажатии кнопки переключается инвентарь и дергается моделька игрока
 
627
72
178
Java:
    public void drawScreen(int mouseX, int mouseY, float partialTicks) {
        this.drawDefaultBackground(); //òåìíûé çàäíèê
        this.oldMouseX = (float)mouseX;
        this.oldMouseY = (float)mouseY;
        super.drawScreen(mouseX, mouseY, partialTicks);
        this.renderHoveredToolTip(mouseX, mouseY);
    }
вот так сделай. у тебя в коде сначала первый тик рисуется игрок, и только после этого присваиваются нормальные значения положения мышки
 
122
4
6
я создал кастомные слоты для определенного типа предмета и сам предмет, однако выглядит крайне печально если у кого есть идеи как можно это улучшить пожалуйста подскажите.
сам слот:
public class AmuletSlot extends Slot {

    private final EntityPlayer thePlayer;
    private int removeCount;

    public AmuletSlot(EntityPlayer player, IInventory inventoryIn, int slotIndex, int xPosition, int yPosition){
        super(inventoryIn, slotIndex, xPosition, yPosition);
        this.thePlayer = player;
    }
    public boolean isItemValid(@Nullable ItemStack stack) {
        if (stack.getItem() instanceof BasicTrinketItems && BasicTrinketItems.isAmulet(stack)) return true;
        return false;
    }
}
основа для побрякушек:
public class BasicTrinketItems extends Item implements IHasModel {
    public enum TypeSlot {
        AMULET,
        BRACER,
        RING,
        CHARM_HEALTH,
        CHARM_ARMOR;
    }
   
    public BasicTrinketItems(String name, int maxStackSize) {
        setUnlocalizedName(name);
        setRegistryName(name);
        setMaxStackSize(maxStackSize);
        setCreativeTab(Main.TEG);
       
        ItemsInit.ITEMS.add(this);
    }
    @Override public void registerModels() { Main.proxy.registerItemRenderer(this, 0, "inventory"); }
   
    //public void onEquipped(ItemStack itemstack, EntityLivingBase player) { player.playSound(SoundEvents.ITEM_ARMOR_EQUIP_DIAMOND, .75F, 1.9f); }
    //public void onUnequipped(ItemStack itemstack, EntityLivingBase player) { player.playSound(SoundEvents.ITEM_ARMOR_EQUIP_DIAMOND, .75F, 2f); }
   
    public void setType(TypeSlot type, ItemStack stack) {
        if (type == TypeSlot.AMULET) ItemNBTHelper.setBoolean(stack, "amulet", true);
        if (type == TypeSlot.BRACER) ItemNBTHelper.setBoolean(stack, "bracer", true);
        if (type == TypeSlot.RING) ItemNBTHelper.setBoolean(stack, "ring", true);
        if (type == TypeSlot.CHARM_HEALTH) ItemNBTHelper.setBoolean(stack, "charm_h", true);
        if (type == TypeSlot.CHARM_ARMOR) ItemNBTHelper.setBoolean(stack, "charm_a", true);
    }
   
    public static boolean isAmulet(ItemStack stack) { return ItemNBTHelper.getBoolean(stack, "amulet", false); }
    public static boolean isBracer(ItemStack stack) { return ItemNBTHelper.getBoolean(stack, "bracer", false); }
    public static boolean isRing(ItemStack stack) { return ItemNBTHelper.getBoolean(stack, "ring", false); }
    public static boolean isCharmH(ItemStack stack) { return ItemNBTHelper.getBoolean(stack, "charm_h", false); }
    public static boolean isCharmA(ItemStack stack) { return ItemNBTHelper.getBoolean(stack, "charm_a", false); }
   
    @Override
    public void addInformation(ItemStack stack, @Nullable World world, List<String> list, ITooltipFlag flag) {
        if (isAmulet(stack)) list.add(I18n.translateToLocalFormatted("____1"));
        if (isBracer(stack)) list.add(I18n.translateToLocalFormatted("____2"));
        if (isRing(stack)) list.add(I18n.translateToLocalFormatted("____3"));
        if (isCharmH(stack)) list.add(I18n.translateToLocalFormatted("____4"));
        if (isCharmA(stack)) list.add(I18n.translateToLocalFormatted("____5"));
    }
    @Override
    public void onUpdate(ItemStack stack, World world, Entity entity, int slot, boolean isSelected) {}
}
побрякушка:
public class CustomAmulet extends BasicTrinketItems {

    public CustomAmulet(String name, int maxStackSize) {
        super(name, maxStackSize);
    }
   
    @Override
    public void onUpdate(ItemStack stack, World world, Entity entity, int slot, boolean isSelected) {
        setType(TypeSlot.AMULET, stack);
    }
}
 
Последнее редактирование:
122
4
6
Вроде все решил но осталась одна проблем вот как ее исправит я прям совсем хз, буду рад если подскажите.
Java:
@SubscribeEvent
    public void livingUpdate(LivingUpdateEvent e) {
        Entity entity = e.getEntity();
        if (entity instanceof EntityPlayer) {
            ICAPCustomInventory cap = entity.getCapability(CAPCustomInventoryProvider.INVENTORY_CAP, null);
            CustomInventory inv = cap.getInventory();
       
            ItemStack stack = inv.getStacks().get(1);
            Item item = stack.getItem();
       
        /*if (inv.getStackInSlot(1).getItem() == item) {
            System.out.println("yes");
        } else System.out.println("no");*/
            if (inv.getStackInSlot(1).getItem() == (item = ItemsInit.RING)) {
                System.out.println("yes");
            } else System.out.println("no");
        }
    }
 
Последнее редактирование:
72
4
12
подскажите пожалуйста
Тебе клиент пишет "no", а это значит, что когда ты перемещаешься между измерениями у тебя аннулируется информация об аксессуарах на клиенте.

Теперь, когда ты жмакаешь кнопку открытия гуишки - сервер досылает клиенту информацию об предметах в слотах. Если так сильно хочешь, то шли пакет об аксессуарах при изменении измерения, но я не вижу смысла в этом :)
 
Сверху