robinch Posted May 30, 2015 Posted May 30, 2015 Hello! I'm working on a technic mod and I want to have a steam engine, that produces power. Therefor I have a Gui + Container. Everything works fine, but I can't move the items in the container. They always jump back again. Also the getServerGuiElement in my GuiHandler is never called. I don't know much about proxys so the error might be proxy-related The GuiHandler public class GuiHandler implements IGuiHandler{ @Override public Object getServerGuiElement(int ID, EntityPlayer player, World world, int x, int y, int z) { TileEntity entity = world.getTileEntity(x, y, z); switch(ID){ case AllTimesPhysics.steamEngineGuiId : if(entity instanceof SteamEngineTileEntity){ return new SteamEngineContainer(player.inventory, (SteamEngineTileEntity) entity); } } return null; } @Override public Object getClientGuiElement(int ID, EntityPlayer player, World world, int x, int y, int z) { TileEntity entity = world.getTileEntity(x, y, z); switch(ID){ case AllTimesPhysics.steamEngineGuiId : if(entity instanceof SteamEngineTileEntity){ return new SteamEngineGui(player.inventory, (SteamEngineTileEntity) entity); } } return null; } } The TileEntity public class SteamEngineTileEntity extends TileEntity implements ISidedInventory{ private String localiziedName; private ItemStack[] slots = new ItemStack[2]; public int energyStored; //max 10.000 public int waterStored; //max 6.000 | 2.000 per bucket public int burnTime; public int fuelTime; public boolean isBurning; public SteamEngineTileEntity(SteamEngine block){ } public void updateEntity() { isBurning = burnTime > 0; if(isBurning){ burnTime--; } if(worldObj.isRemote){ if(isBurning && waterStored > 0 && energyStored < 10000){ waterStored--; energyStored++; } if(burnTime == 0){ if(slots[0] != null && waterStored > 0 && energyStored < 10000){ if(getBurnTime(slots[0]) > 0){ burnTime = getBurnTime(slots[0]); fuelTime = burnTime; slots[0].stackSize--; } } } if(slots[1] != null){ if(slots[1].getItem() == Items.water_bucket && waterStored <= 4000){ slots[1] = new ItemStack(Items.bucket); waterStored += 2000; } } } } public void setGuiDisplayName(String displayName) { localiziedName = displayName; } public boolean hasCustomInventoryName() { return localiziedName != null && localiziedName.length() > 0; } public String getInventoryName() { return hasCustomInventoryName() ? localiziedName : "container.SteamEngine"; } public int getSizeInventory(){ return slots.length; } private int getBurnTime(ItemStack stack){ if(stack == null){ return 0; }else{ return GameRegistry.getFuelValue(stack); } } @Override public ItemStack getStackInSlot(int slot) { return slots[slot]; } @Override public ItemStack decrStackSize(int slot, int i) { ItemStack stack = getStackInSlot(slot); if(stack != null){ if(stack.stackSize <= i){ setInventorySlotContents(slot, null); }else{ stack = stack.splitStack(i); if(stack.stackSize == 0){ setInventorySlotContents(slot, null); } } return stack; } return null; } @Override public ItemStack getStackInSlotOnClosing(int slot) { ItemStack stack = getStackInSlot(slot); if (stack != null) { setInventorySlotContents(slot, null); } return stack; } @Override public void setInventorySlotContents(int slot, ItemStack stack) { slots[slot] = stack; if (stack != null && stack.stackSize > getInventoryStackLimit()) { stack.stackSize = getInventoryStackLimit(); } } @Override public int getInventoryStackLimit() { return 64; } @Override public boolean isUseableByPlayer(EntityPlayer player) { return worldObj.getTileEntity(xCoord, yCoord, zCoord) == this && player.getDistanceSq(xCoord + 0.5D, yCoord + 0.5D, zCoord + 0.5D) <= 64D; } public void openInventory() {} public void closeInventory() {} @Override public boolean isItemValidForSlot(int slot, ItemStack item) { return false; } @Override public int[] getAccessibleSlotsFromSide(int side) { int[] i = {}; return i; } @Override public boolean canInsertItem(int slot, ItemStack stack, int side) { return true; } @Override public boolean canExtractItem(int slot, ItemStack stack, int side) { return true; } } The Container public class SteamEngineContainer extends Container { private SteamEngineTileEntity steamEngine; private int lastburnTime; public SteamEngineContainer(InventoryPlayer inventory, SteamEngineTileEntity entity) { steamEngine = entity; addSlotToContainer(new Slot(entity, 0, 80, 54)); addSlotToContainer(new Slot(entity, 1, 80, 9)); for(int x = 0; x < 9; x++){ for(int y = 0; y < 3; y++){ addSlotToContainer(new Slot(inventory, y * 9 + x + 9, 8 + x * 18, 84 + y * 18)); } } for(int x = 0; x < 9; x++){ addSlotToContainer(new Slot(inventory, x, 8 + x * 18, 142)); } } public boolean canInteractWith(EntityPlayer player) { return true; } } I also have a gui, the block itself which opens the gui with: player.openGui(AllTimesPhysics.instance, AllTimesPhysics.steamEngineGuiId, world, x, y, z); In my mainclass i have: public static final int steamEngineGuiId = 10; GameRegistry.registerBlock(steamEngine, "SteamEngine"); GameRegistry.registerTileEntity(SteamEngineTileEntity.class, "SteamEngine"); steamEngine = new SteamEngine(Material.rock); NetworkRegistry.INSTANCE.registerGuiHandler(this, new GuiHandler()); If there is anything else needed, i'll post it! Quote
ItsAMysteriousYT Posted May 30, 2015 Posted May 30, 2015 You have to add some methods to your container: @Override public boolean canInteractWith(EntityPlayer player) { return this.inventory.isUseableByPlayer(player); } @Override public ItemStack transferStackInSlot(EntityPlayer p_82846_1_, int slotNumber) { ItemStack itemstack = null; Slot slot = (Slot) inventorySlots.get(slotNumber); if (slot != null && slot.getHasStack()) { ItemStack itemstack1 = slot.getStack(); itemstack = itemstack1.copy(); if (slotNumber < 15) { if (!this.mergeItemStack(itemstack1, 15, 51, false)) { return null; } } else if (!this.mergeItemStack(itemstack1, 0, 15, false)) { return null; } if (itemstack1.stackSize == 0) { slot.putStack((ItemStack) null); } else { slot.onSlotChanged(); } } slot.onPickupFromSlot(p_82846_1_, itemstack); return itemstack; } Quote
robinch Posted May 30, 2015 Author Posted May 30, 2015 public boolean onBlockActivated(World world, int x, int y, int z, EntityPlayer player, int side, float hitX, float hitY, float hitZ) { if(world.isRemote){ player.openGui(AllTimesPhysics.instance, AllTimesPhysics.steamEngineGuiId, world, x, y, z); } return true; } Quote
robinch Posted May 30, 2015 Author Posted May 30, 2015 I read this also in other thread, but as I said: I'm new with proxies and stuff. I'm sorry, I know this is basic knowledge, but could anyone pls describe how I call stuff server-only. Quote
robinch Posted May 30, 2015 Author Posted May 30, 2015 Ok Thanks. Now everything works fine I just forgot that one little ! infront of my world.isRemote Quote
Draco18s Posted May 30, 2015 Posted May 30, 2015 It might be one character, but it is quite literally the difference between black and white. Quote Apparently I'm a complete and utter jerk and come to this forum just like to make fun of people, be confrontational, and make your personal life miserable. If you think this is the case, JUST REPORT ME. Otherwise you're just going to get reported when you reply to my posts and point it out, because odds are, I was trying to be nice. Exception: If you do not understand Java, I WILL NOT HELP YOU and your thread will get locked. DO NOT PM ME WITH PROBLEMS. No help will be given.
Recommended Posts
Join the conversation
You can post now and register later. If you have an account, sign in now to post with your account.
Note: Your post will require moderator approval before it will be visible.