Erreur de synchronisation Client/Serveur


  • Rédacteurs

    Ok, je vois où est ton problème actuellement.
    Ce que tu devrais faire à mon avis c'est changer la classe RPName de façon à ce qu'elle ne contienne plus l'unique ID car tu ne t'en sert pas :

    public class RPName implements IRPName {
    	private String name = "undefined";
    
    	public RPName() {}
    
    	@Override
    	public void set(String nameIn) {
    		this.name = nameIn;
    	}
    
    	@Override
    	public String getName() {
    		return this.name;
    	}
    
    }
    

    Bien sûr ta capability devient donc :

    public interface IRPName
    {
          void set(String name);
          String getName();
    }
    

    Ensuite, ton plus gros problème vient de l'handler de ton paquet. Ce que tu fais est tout simplement incorrect. Déjà on va passer l'id de l'entité dans le paquet plutôt que l'UUID du joueur, ce sera mieux. Puis, grâce à cet id on pourra récupérer cette entité et changer son nom RP :

    public class PacketRPName implements IMessage
    {
    
        private String name;
        private int entityId;
    
        public PacketRPName() {}
    
        public PacketRPName(EntityPlayerMP player) {
            this.name = player.getCapability(RPNameProvider.RPNAME_CAP, null).getName();
            this.entityId= player.getEntityId();
        }
    
        @Override
        public void fromBytes(ByteBuf buf) {
            this.name = ByteBufUtils.readUTF8String(buf);
            this.entityId = buf.readInt();
        }
    
        @Override
        public void toBytes(ByteBuf buf) {
            ByteBufUtils.writeUTF8String(buf, this.name);
            buf.writeInt(this.entityId);
        }
    
        public static class Handler implements IMessageHandler<PacketRPName, IMessage>
        {
    
            @SideOnly(Side.CLIENT)
            @Override
            public IMessage onMessage(PacketRPName message, MessageContext ctx) {
                Minecraft.getMinecraft().addScheduledTask(() -> 
                {
                    Entity entity = Minecraft.getMinecraft().player.world.getEntityByID(message.entityId);
                    if(entity instanceof EntityPlayer) // Vérifie que entity != null et au passage que c'est bien un joueur, au cas où
                    {
                        entity.getCapability(RPNameProvider.RPNAME_CAP, null).set(message.name);
                    }
                });
                return null;
            }
        }
    }
    

    Du coup il va aussi falloir modifier un peu ta commande :

    @Override
    public void execute(MinecraftServer server, ICommandSender sender, String[] args) throws CommandException {
        if (args.length >= 2) {
            if (args[0].equalsIgnoreCase("assign") && args.length >= 3) {
                if (args[2].length() > 0) {
                    // NAKConfig.addTitles(args[1], args[2]);
                    EntityPlayerMP player = getPlayer(server, null, args[1]);
                    IRPName rpname = player.getCapability(RPNameProvider.RPNAME_CAP, null);
                    String title = "";
                    for (int i = 2; i < args.length; i++) {
                        title = title + args[i];
                    }
                    rpname.set(title);
    
                    // TODO Sending Packet Command #1
                    Caminelot.getNetwork().sendToAllTracking(new PacketRPName(player), player);
    
                    TextComponentTranslation textComponantTranslation1 = new TextComponentTranslation("Title " + title + " assigned to " + args[1] + " with success!", "");
                    textComponantTranslation1.getStyle().setColor(TextFormatting.GREEN);
                    sender.sendMessage(textComponantTranslation1);
                } else {
                    wrongUsage(sender);
                }
            } else if (args[0].equalsIgnoreCase("remove")) {
                EntityPlayerMP playerr = getPlayer(server, sender, args[1]);
                IRPName rpname = player.getCapability(RPNameProvider.RPNAME_CAP, null);
                rpname.set("undefined");
    
                // TODO Sending Packet Command #2
                Caminelot.getNetwork().sendToAllTracking(new PacketRPName(player), player);
    
                TextComponentTranslation textComponantTranslation1 = new TextComponentTranslation("Title removed to " + args[1] + " with success!", "");
                textComponantTranslation1.getStyle().setColor(TextFormatting.GREEN);
                sender.sendMessage(textComponantTranslation1);
            } else {
                wrongUsage(sender);
            }
        } else {
            wrongUsage(sender);
        }
    }
    

    Pour ce qui est de l'enregistrement du paquet tu n'a besoin de l'envoyer sur un seul côté donc tu as seulement besoin de la ligne :

    registerMessage(PacketRPName.Handler.class, PacketRPName.class, Side.CLIENT, 2);
    

    Il te faut aussi modifier un peu le storage de ta capability :

    instance.set(((NBTTagString) nbt).getString());
    

    Et il te faut rajouter un event dans ta classe d'event qui ressemble à ça :

    @SubscribeEvent
    public static void onStartTracking(PlayerEvent.StartTracking event) {
        if(event.getTarget() instanceof EntityPlayerMP)
        {
            Caminelot.getNetwork().sendTo((EntityPlayerMP)event.getEntityPlayer(), new PacketRPName(event.getTarget()));
        }
    }
    

    Voilà, ça devrait fonctionner



  • Ce message a été supprimé !