theishiopian Posted December 31, 2018 Posted December 31, 2018 I need to trigger code on the server when a particular event fires on the client. I have two questions: are uuid's the same on both the client and server, ie can I use the uuid of an entity on the client to find that same entity on the server, and if so, whats the best way to send a uuid in a packet? I tried looking into forges built in packet system, but it doesn't have a way to send uuids, only primitives and bytes, and I'd like to avoid converting a uuid into bytes if possible. Quote
Choonster Posted December 31, 2018 Posted December 31, 2018 (edited) Minecraft normally uses the entity ID (Entity#getEntityId) rather than the unique ID in networking situations (and this is its main purpose). This reduces unnecessary network traffic as the entity ID is a single 32-bit integer (that's actually compressed further) rather than a UUID that's sent as a pair of 64-bit integers. If you absolutely need to send a UUID, you can wrap the ByteBuf in a PacketBuffer and use PacketBuffer#readUniqueId/PacketBuffer#writeUniqueId to read/write UUIDs. Edited December 31, 2018 by Choonster Quote Please don't PM me to ask for help. Asking your question in a public thread preserves it for people who are having the same problem in the future.
TheRPGAdventurer Posted December 31, 2018 Posted December 31, 2018 Like this? but it crashes, with a classexception @Override public void fromBytes(ByteBuf buf) { PacketBuffer packetBuf = (PacketBuffer) buf; dragonId = packetBuf.readUniqueId(); controlState = buf.readByte(); } @Override public void toBytes(ByteBuf buf) { PacketBuffer packetBuf = (PacketBuffer) buf; packetBuf.writeUniqueId(dragonId); buf.writeByte(controlState); } Quote
Choonster Posted December 31, 2018 Posted December 31, 2018 On 12/31/2018 at 7:18 AM, TheRPGAdventurer said: Like this? but it crashes, with a classexception @Override public void fromBytes(ByteBuf buf) { PacketBuffer packetBuf = (PacketBuffer) buf; dragonId = packetBuf.readUniqueId(); controlState = buf.readByte(); } @Override public void toBytes(ByteBuf buf) { PacketBuffer packetBuf = (PacketBuffer) buf; packetBuf.writeUniqueId(dragonId); buf.writeByte(controlState); } Expand The ByteBuf passed to those methods isn't an instance of PacketBuffer, you need to create a new instance of PacketBuffer and pass the ByteBuf to the constructor. Quote Please don't PM me to ask for help. Asking your question in a public thread preserves it for people who are having the same problem in the future.
TheRPGAdventurer Posted December 31, 2018 Posted December 31, 2018 Like this @Override public void fromBytes(ByteBuf buf) { if(buf instanceof PacketBuffer) { PacketBuffer packetBuf = (PacketBuffer) buf; dragonId = packetBuf.readUniqueId(); } controlState = buf.readByte(); } @Override public void toBytes(ByteBuf buf) { if(buf instanceof PacketBuffer) { PacketBuffer packetBuf = (PacketBuffer) buf; packetBuf.writeUniqueId(dragonId); } buf.writeByte(controlState); } Quote
Choonster Posted December 31, 2018 Posted December 31, 2018 (edited) On 12/31/2018 at 7:35 AM, TheRPGAdventurer said: Like this @Override public void fromBytes(ByteBuf buf) { if(buf instanceof PacketBuffer) { PacketBuffer packetBuf = (PacketBuffer) buf; dragonId = packetBuf.readUniqueId(); } controlState = buf.readByte(); } @Override public void toBytes(ByteBuf buf) { if(buf instanceof PacketBuffer) { PacketBuffer packetBuf = (PacketBuffer) buf; packetBuf.writeUniqueId(dragonId); } buf.writeByte(controlState); } Expand No. As I said, those ByteBufs aren't PacketBuffers; so that code will never send the unique IDs. When I say "create a new instance", I mean "use the new operator". Edited December 31, 2018 by Choonster 1 Quote Please don't PM me to ask for help. Asking your question in a public thread preserves it for people who are having the same problem in the future.
theishiopian Posted January 1, 2019 Author Posted January 1, 2019 @Choonster would using the entityID work for players? I need the server to know when a player is left clicking, but the left click event is clientside only, hence the need for packets. Quote
Choonster Posted January 1, 2019 Posted January 1, 2019 On 1/1/2019 at 5:50 AM, theishiopian said: @Choonster would using the entityID work for players? I need the server to know when a player is left clicking, but the left click event is clientside only, hence the need for packets. Expand The entity ID should work for players, but it's not actually needed here. The player who sent the packet is available on the server side through the MessageContext, see this example in the documentation for more details. Quote Please don't PM me to ask for help. Asking your question in a public thread preserves it for people who are having the same problem in the future.
theishiopian Posted January 1, 2019 Author Posted January 1, 2019 Oh, so I can just send an empty packet from the player? Quote
Choonster Posted January 1, 2019 Posted January 1, 2019 On 1/1/2019 at 6:21 AM, theishiopian said: Oh, so I can just send an empty packet from the player? Expand Yes, that should work. 1 Quote Please don't PM me to ask for help. Asking your question in a public thread preserves it for people who are having the same problem in the future.
theishiopian Posted January 1, 2019 Author Posted January 1, 2019 (edited) @Choonster OK, I've got most of it set up, but I have one more question: How does the server know which player sent the packet? Do I have to specify somehow, or will the server somehow be able to tell? Currently, I have an event handler listening for PlayerInteract.LeftClickEmpty, which then sends an empty packet to the server like so: Core.INSTANCE.sendToServer(new DeflectPacket()); (I defined the networkwrapper instance in the core mod class temporarily, I'll move it to somewhere else later) EDIT: I tested it, and it works! But I'd still appreciate an explanation as to WHY it works. Edited January 1, 2019 by theishiopian testing Quote
Choonster Posted January 1, 2019 Posted January 1, 2019 On 1/1/2019 at 7:05 AM, theishiopian said: @Choonster OK, I've got most of it set up, but I have one more question: How does the server know which player sent the packet? Do I have to specify somehow, or will the server somehow be able to tell? Currently, I have an event handler listening for PlayerInteract.LeftClickEmpty, which then sends an empty packet to the server like so: Core.INSTANCE.sendToServer(new DeflectPacket()); (I defined the networkwrapper instance in the core mod class temporarily, I'll move it to somewhere else later) Expand The server maintains a network connection for each connected client along with a reference to the server-side player entity. When a packet is received on this connection, the server knows which player sent it and you can access the player through the NetworkContext. 1 Quote Please don't PM me to ask for help. Asking your question in a public thread preserves it for people who are having the same problem in the future.
theishiopian Posted January 1, 2019 Author Posted January 1, 2019 Oh, right, that makes sense. Only one player per client after all. Thank you! Quote
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.