MadModder Posted November 10, 2015 Posted November 10, 2015 Hi everyone, I have a little problem with my "machine", but it will probably apply to it more like a "chest". When I place any item in my input slot, nothing strange happens, but if I try to take that item out then it seems copied. It looks that my machine has that item in the input slot, but it stops working (if(inputSlot.stackSize == 0) progress = 0). It's something like ghost item: it disappears if I try to take it out or reopen the GUI. I had the same problem with shift-clicking, but it was solved by: if(te.worldObj.isRemote) return null; in Container.transferStackInSlot. I know that it is client-server sync problem, but I have no idea what piece of code I should modify in that case. My TileEntity: http://pastebin.com/VxFVf8qj and Container: http://pastebin.com/edwPCweR Did anyone had similar problem? Quote Sorry if I write something wrong in English, I'm not native English speaker.
coolAlias Posted November 10, 2015 Posted November 10, 2015 You shouldn't need to check if the world is remote in your transferStackInSlot method - it can run the same on both sides. #onInventoryChanged is when you are supposed to iterate through all the stacks and replace any that have stack size of 0 with null. Calling super on an interface method (e.g. #onInventoryChanged) does absolutely nothing - interfaces do not provide implementations. You really shouldn't need to constantly mark your block for an update. Look at TileEntityFurnace and you'll see it never calls that method; you probably shouldn't, either. Use your Container properly for sending data to the client side via #detectAndSendChanges etc. In fact, the best advice I can give you is seriously look more closely at TileEntityFurnace and model your methods off of those. You are all over the place in there. Also, don't use FMLCommonHandler#getEffectiveSide when you already have a world object; world.isRemote gives you the side much more efficiently. Quote http://i.imgur.com/NdrFdld.png[/img]
MadModder Posted November 10, 2015 Author Posted November 10, 2015 Thanks! It finally works! I checked worldObj.isRemote in #transferStackInSlot because it seemed to remove that issue when shift-clicking. Now, when I iterate through stacks in #onInventoryChanged, I don't need that. When I was changing my code basing on your advises, I observed one interesting thing: Calling super on #onInventoryChanged should do something, because it's implemented in Basic TileEntity from Minecraft. Also, I found out that TileEntityFurnace doesn't implement onInventoryChanged. When I'm implementing a method and super does nothing, then eclipse shows an error if I try to call it. Anyways, I removed that super - it did nothing in my case. Quote Sorry if I write something wrong in English, I'm not native English speaker.
coolAlias Posted November 11, 2015 Posted November 11, 2015 The base TileEntity class in 1.6.4 implements IInventory? I don't recall that being the case, and it certainly isn't since then, but glad it all worked out for you anyway. Quote http://i.imgur.com/NdrFdld.png[/img]
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.