Jump to content

Tile Entity Syncing [Solved and vanilla bug found]


hydroflame
 Share

Recommended Posts

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.

how to debug 101:http://www.minecraftforge.net/wiki/Debug_101

-hydroflame, author of the forge revolution-

Link to comment
Share on other sites

You need the magic of PACKETS!

And a packet handler!

 

Packet250CustomPayload ahoy!

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.

Link to comment
Share on other sites

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.

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.

Link to comment
Share on other sites

...... 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-

how to debug 101:http://www.minecraftforge.net/wiki/Debug_101

-hydroflame, author of the forge revolution-

Link to comment
Share on other sites

Then you know more than I do.

I've dealt with packets like twice, both times I used Packet250.

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.

Link to comment
Share on other sites

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.

how to debug 101:http://www.minecraftforge.net/wiki/Debug_101

-hydroflame, author of the forge revolution-

Link to comment
Share on other sites

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.

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.

Link to comment
Share on other sites

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-

how to debug 101:http://www.minecraftforge.net/wiki/Debug_101

-hydroflame, author of the forge revolution-

Link to comment
Share on other sites

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.

Guest
Reply to this topic...

×   Pasted as rich text.   Restore formatting

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

 Share



×
×
  • Create New...

Important Information

By using this site, you agree to our Terms of Use.