hydroflame Posted June 21, 2013 Posted June 21, 2013 Hey guys, here's my problem, I have a certain block with a tile entity and a menu on right click to change some value on it. Since the menu is client side only, you would want the change to propagate to other player, but I'm not sure what is the correct way. I know that on server side you can call world.markBlockForUpdate(x, y, z) (or some method with similar name, I'm not in front of my code so I'm not sure) and from there everything should take care of itself. so far my solution is to make a customload packet containing x, y, z of the tile entity and the change but when i arrive server side on the method "handle(manager, packet, player)" the only way I FOUND (I'm sort of hoping there's another method) to get to the world with the tile entity is to cast player as EntityPlayerMP and use the worldObj on it. BUT here's the problem, using this method, were expecting that the player will be in the same world as the Tile Entity when the packet is being processes and if for SOME reason the packet were to be processes much later and the player has had time to switch dimension. the change would not appear. At the moment its not a real problem. In my test the packets were always processes VERY quickly, but i know it's not a good thing that I'm relying on this. so my question is: does anyone know of a good reliable way to update tile entity from client to server to all client ? Thanks -hydroflame, FRev- extra: I research a bit into packet132TileEntityData and sending this kind of packet from client to server side will just kick the client. because server doesn't want these kind of packets. Quote how to debug 101:http://www.minecraftforge.net/wiki/Debug_101 -hydroflame, author of the forge revolution-
hydroflame Posted June 21, 2013 Author Posted June 21, 2013 bump Quote how to debug 101:http://www.minecraftforge.net/wiki/Debug_101 -hydroflame, author of the forge revolution-
Draco18s Posted June 21, 2013 Posted June 21, 2013 You need the magic of PACKETS! And a packet handler! Packet250CustomPayload ahoy! 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.
hydroflame Posted June 21, 2013 Author Posted June 21, 2013 have you been reading my post at all? Quote how to debug 101:http://www.minecraftforge.net/wiki/Debug_101 -hydroflame, author of the forge revolution-
Draco18s Posted June 21, 2013 Posted June 21, 2013 TileEntity has this function called... public Packet getDescriptionPacket() { return null; } You need to overide that, have it create a packet with the new data, then PacketDispatcher.sendPacketToServer(packet) Which then the packet will asrive at the server and you'll need to override public void onDataPacket(INetworkManager net, Packet132TileEntityData pkt) { } To read the packet, and also send that data back to all players. 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.
hydroflame Posted June 21, 2013 Author Posted June 21, 2013 ...... getDescriptionPacket is supposed to give a Packet132TileEntity, sending such packet to the server will kick the client. please refer to net.minecraft.client.multiplayer.NetClientHandler, net.minecraft.network.packet.NetHandler and net.minecraft.network.NetServerHandler refering to method handleTileEntityData the method "getDescriptionPacket" is supposed to be called server side and will manage to wich player it needs to be sent. so that player far away will not receive a packet for a tile entity that isnt even loaded. i wish to NOT overload my network with packet that dont need to be send. -hydroflame, FRev- Quote how to debug 101:http://www.minecraftforge.net/wiki/Debug_101 -hydroflame, author of the forge revolution-
Draco18s Posted June 21, 2013 Posted June 21, 2013 Then you know more than I do. I've dealt with packets like twice, both times I used Packet250. 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.
hydroflame Posted June 21, 2013 Author Posted June 21, 2013 Don't worry. I do have a working solution (using p250) it's just that there seems to be possible bug in it. I was jsut expecting that there would be a solid solution that doesnt have this kind of flaw may i ask from where you are getting the World variable when you arrive server side ? mines from a cast of Player to EntityplayerMP and from it i can get worldObj. Quote how to debug 101:http://www.minecraftforge.net/wiki/Debug_101 -hydroflame, author of the forge revolution-
Draco18s Posted June 21, 2013 Posted June 21, 2013 may i ask from where you are getting the World variable when you arrive server side ? mines from a cast of Player to EntityplayerMP and from it i can get worldObj. Like I said, twice. Both times server to client. 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.
hydroflame Posted June 21, 2013 Author Posted June 21, 2013 hmmmmmmmmm well nevermind all that. Even vanilla does the same thing. I even amde a test to make sure it was a bug. So since the NetHandler will try to use the world that the player is currently in. Theres a possibliity that the server will not be able to process the packet correctly. It wont make the server crash though because theres a check to see if the variable is not null. If someone ever send a packet changing tile entities to the server and changes world BEFORE the packet is processed (ex, click to send change and jump in the end) the packet will NOT take effect and you will have lost your changes. this is a bug btw but its a vanilla one. i did tested and reproduced it by setting a delay between arrival of the packet and process. used it with sign and command block. tl;dr version dont change Tile entity and switch dimension super fast. youll lose your progress (sign text or commands for exemple) Cheers, -hydroflame, author of FRev- Quote how to debug 101:http://www.minecraftforge.net/wiki/Debug_101 -hydroflame, author of the forge revolution-
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.