MFF

    Minecraft Forge France
    • Récent
    • Mots-clés
    • Populaire
    • Utilisateurs
    • Groupes
    • Forge Events
      • Automatique
      • Foncé
      • Clair
    • S'inscrire
    • Se connecter

    Erreur de synchronisation Client/Serveur

    Planifier Épinglé Verrouillé Déplacé Non résolu Sans suite
    22 Messages 5 Publieurs 2.9k Vues 2 Watching
    Charger plus de messages
    • Du plus ancien au plus récent
    • Du plus récent au plus ancien
    • Les plus votés
    Répondre
    • Répondre à l'aide d'un nouveau sujet
    Se connecter pour répondre
    Ce sujet a été supprimé. Seuls les utilisateurs avec les droits d'administration peuvent le voir.
    • BrokenSwingB Hors-ligne
      BrokenSwing Moddeurs confirmés Rédacteurs
      dernière édition par

      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

      1 réponse Dernière réponse Répondre Citer 1
      • AmaA Hors-ligne
        Ama
        dernière édition par

        Ce message a été supprimé !
        1 réponse Dernière réponse Répondre Citer 0
        • 1
        • 2
        • 2 / 2
        • Premier message
          Dernier message
        Design by Woryk
        ContactMentions Légales

        MINECRAFT FORGE FRANCE © 2024

        Powered by NodeBB