Darkona Posted January 18, 2015 Share Posted January 18, 2015 Hello mates. I'm using IExtendedProperties to save information about a player. I use a custom player renderer to render a model on the player depending on the custom property. Synchronization between the server and the player works correctly, but the problem arises whn I want to render other players: they can't see the model. I realize that each client knows about its personal IExtendedProperties, but do not know about other client's. Any recommendation on an approach that would make all clients in rendering distance know that certain players have the property set? My current approach is sending packets to all players nearby each other every second or so, saving the data in a HashMap<UUID,NBTTagCompound> in the client proxy if the player != Minecraft...thePlayer, and when rendering doing a lookup in said HasMap based on the player's UUID. Is there something I'm missing that could make this easier? Quote Link to comment Share on other sites More sharing options...
Darkona Posted January 18, 2015 Author Share Posted January 18, 2015 I get it, thanks diesieben. My only doubt is if the EntityID is the same for the server world and the client world. My guess is yes but I remember seeing somewhere else that there's a persistent ID, and then there's IDs. I'm coding your proposal at the moment to see how it goes anyway. Quote Link to comment Share on other sites More sharing options...
Darkona Posted January 18, 2015 Author Share Posted January 18, 2015 public void func_151248_b(Entity p_151248_1_, Packet p_151248_2_) this expects a packet, and I assume I could use the old packet250custompayload for this. but a little down below there's this: public Set<net.minecraft.entity.player.EntityPlayer> getTrackingPlayers(Entity entity) which appears to return a set of the players tracking an entity. This looks like a better approach, considering I'm using the new networking wrapper thing. I'll test this out and if it doesn't work, packet250 it is (which I don't want to use since I'm sending an NBT and that would be a lot of refactoring) Quote Link to comment Share on other sites More sharing options...
Darkona Posted January 18, 2015 Author Share Posted January 18, 2015 This is in the property class public static void syncToNear(EntityPlayer player) { if(player.worldObj instanceof WorldServer) { WorldServer world = (WorldServer)player.worldObj; SyncPropertiesPacket.Message msg = new SyncPropertiesPacket.Message(player.getEntityId(), get(player).getData()); world.getEntityTracker().func_151248_b(player, ModNetwork.net.getPacketFrom(msg)); } } And this is in the client side: public void synchronizePlayer(int id, NBTTagCompound properties) { Entity entity = Minecraft.getMinecraft().theWorld.getEntityByID(id); if(entity != null && entity instanceof EntityPlayer) { EntityPlayer player = (EntityPlayer)entity; if(BackpackProperty.get(player) == null) BackpackProperty.register(player); BackpackProperty.get(player).loadNBTData(properties); if(player == Minecraft.getMinecraft().thePlayer) { if (player.openContainer != null && player.openContainer instanceof IWearableContainer) { player.openContainer.detectAndSendChanges(); } } } } Works perfectly. Thanks so much, diesieben, you just saved me like 5 solid hours or more of messing around. Quote Link to comment Share on other sites More sharing options...
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.