GuiHandler

Версия Minecraft
1.7.10
608
5
15
В GuiHandler есть 2 метода. getServerGuiElement, getClientGuiElement

Я так понял, что это сделано для синхронизации?
Сделал я gui, container, всё как обычно. Но при перемещении/закрытии открытии происходит какая-то фигня. То в слоты для брони залетят предметы, то продаблятся, и прочие аномалии.

Или надо как-то вручную синхронизировать?
Код:
package ua.svk.WipeChest.gui;

import cpw.mods.fml.common.network.IGuiHandler;
import net.minecraft.entity.player.EntityPlayer;
import net.minecraft.item.ItemStack;
import net.minecraft.world.World;
import ua.svk.WipeChest.base.MainMod;

public class GuiHandler implements IGuiHandler
{
 public Object getServerGuiElement(int id, EntityPlayer player, World world, int x, int y, int z)
 {
 ItemStack stack = player.getCurrentEquippedItem();

 if(id == 0 && stack != null && stack.hasTagCompound())
 {
 System.out.println("+");
 return new ContainerWipeChest(player.inventory, new InventoryWipeChest());
 }
 else
 {
 return null;
 }
 }

 public Object getClientGuiElement(int id, EntityPlayer player, World world, int x, int y, int z)
 {
 ItemStack stack = player.getCurrentEquippedItem();

 if(id == 0 && stack != null && stack.hasTagCompound())
 {
 System.out.println("+");
 return new GuiWipeChest(player.inventory, new InventoryWipeChest());
 }
 else
 {
 return null;
 }
 }
}
Код:
package ua.svk.WipeChest.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.Slot;
import net.minecraft.item.ItemStack;

public class ContainerWipeChest extends Container
{
 public ContainerWipeChest(InventoryPlayer playerInventory, InventoryWipeChest inv)
 { 
 for(int i = 0; i < 9; i++)
 {
 this.addSlotToContainer(new Slot(playerInventory, i, 106+i*18, 110+57));
 }
 
 for(int i = 0;i < 3; i++)
 {
 for(int j = 0; j < 9;j++)
 {
 this.addSlotToContainer(new Slot(playerInventory, 9+j+i*9, 106+18*j, 110+i*18));
 }
 }
 }

 @Override
 public boolean canInteractWith(EntityPlayer player)
 {
 return true;
 }
}
Код:
package ua.svk.WipeChest.gui;

import org.lwjgl.opengl.GL11;

import net.minecraft.client.gui.inventory.GuiContainer;
import net.minecraft.entity.player.InventoryPlayer;
import net.minecraft.util.ResourceLocation;
import ua.svk.WipeChest.RenderHelper;
import ua.svk.WipeChest.base.ModInfo;

public class GuiWipeChest extends GuiContainer
{
 ResourceLocation texture = new ResourceLocation(ModInfo.MODID, "textures/gui/bg.png");
 
 public GuiWipeChest(InventoryPlayer playerInventory, InventoryWipeChest inv)
 {
 super(new ContainerWipeChest(playerInventory, inv));
 }

 @Override
 protected void drawGuiContainerBackgroundLayer(float f, int x, int y)
 { 
 GL11.glTranslatef(0, 0.2F, 0);
 RenderHelper.drawTextureRect(texture, this.guiLeft, this.guiTop, this.xSize, this.ySize);
 GL11.glTranslatef(0, -0.2F, 0);
 }
 
 @Override
 public void initGui()
 {
 super.xSize = 374;
 super.ySize = 203;
 super.guiLeft = (this.width - this.xSize) / 2;
 super.guiTop = (this.height - this.ySize) / 2;
 }
}
 
Если бред именно с инвентарем - следовательно ты его не так добавляешь.
(через пару часов посмотрю, скажу что-то конкретное)


И да, без добавления TE - оно корректно работает?
 
С твоим кодом вообще путаются слоты.


Я вообще юзаю только PlayerInventory, и с ним вот такие баги. Может без TileEntity надо как-то по другому слоты добавлять?


Скопировал код из контейнера игрока, те же баги только в профиль...
Щас попробую из крафт верстака...


Хрен его знает...
Буду тогда надеятся на помощь...
Если нет, то свою реализацию пилить придётся...
 
В итеме вроде бы другие методы должны применяться.
(Посмотри мод с рюкзаками, там все гуд)
https://github.com/gr8pefish/IronBackpacks/blob/master-1.7.10/src/main/java/main/ironbackpacks/container/backpack/ContainerBackpack.java#L93-L104
 
Ну я хз тогда, бред какой-то получается, ибо должно все работать.
 
http://imgur.com/llgtb2M
Рукопоп кто-то? Мне кажется? Или нет...

public FC(InventoryPlayer p) {
for (int i = 0; i < 3; i++)
for (int j = 0; j < 9; j++)
addSlotToContainer(new Slot(p, j + i * 9 + 9, 50 + j * 18, 30 + i * 18));
for (int i = 0; i < 9; i++)
addSlotToContainer(new Slot(p, i, 50 + i * 18, 90));
}
public FG(InventoryPlayer p) {
super(new FC(p));
}
if (!worldIn.isRemote)
player.openGui(instance, 0, worldIn, pos.getX(), pos.getY(), pos.getZ());
У меня все ок. Код скинул. Хз.
 
Абсолютно так же, на код глянь :(


Есть идея...
В моде на рюкзаки, в качестве IInvetory передаётся не player.inventory, а сам player 0_o
Может в этом вся фича...
 
Назад
Сверху