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

      Et oui ! De la même manière que tu as le stuff de Player80, car c’est un monde solo 😉

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

        Du coup ce qui veut dire que le code est correct ?

        1 réponse Dernière réponse Répondre Citer 0
        • Wind_BladeW Hors-ligne
          Wind_Blade
          dernière édition par

          Lance un serveur et deux clients pour test, tout simplements

          1 réponse Dernière réponse Répondre Citer 0
          • N Hors-ligne
            nwmqpa
            dernière édition par

            Comme il l’a été dit plus haut, tu rencontre ce problème a cause d’un monde solo.
            Cependant, il se peut que tu rencontre un second problème lors de la synchronisation des packets après la mort de ton joueur/changement de dimension.

            D’apres ce que j’ai pu remarquer, les packets n’ont pas l’air de s’envoyer correctement lors du PlayerEvent.Clone, dans ce cas, délaye les de 1 ou 2 ticks avant de l’envoyer.

            "Que la ForceTri soit avec toi !"
            Maitre Yoda - The Legend of Zelda : Mystery of Solarus XD
            [/a…

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

              Bien, effectivement après tests sur serveur cela semble fonctionner.

              Autre petit point.

              Dans la lignée de ma Mana ici présente de défini un nouveau “pseudo” rp au joueur donc je stocke ma capability, jusque là tout va bien, mais j’ai aussi modifier le système de rendu du joueur, mais impossible d’afficher la valeur de la capability (le pseudo rp donc), tout passe par packets je suppose, mais impossible de faire en sorte que le joueur A voit le pseudo RP du joueur B.

              Une idée ?

              Pour l’exemple prenons ma Mana actuelle, j’ai juste fait un c/c sauf que c’est un String et non un Float ^^

              Wind_BladeW 1 réponse Dernière réponse Répondre Citer 0
              • Wind_BladeW Hors-ligne
                Wind_Blade @Ama
                dernière édition par Wind_Blade

                @ama a dit dans Erreur de synchronisation Client/Serveur :

                Bien, effectivement après tests sur serveur cela semble fonctionner.

                Autre petit point.

                Dans la lignée de ma Mana ici présente de défini un nouveau “pseudo” rp au joueur donc je stocke ma capability, jusque là tout va bien, mais j’ai aussi modifier le système de rendu du joueur, mais impossible d’afficher la valeur de la capability (le pseudo rp donc), tout passe par packets je suppose, mais impossible de faire en sorte que le joueur A voit le pseudo RP du joueur B.

                Une idée ?

                Pour l’exemple prenons ma Mana actuelle, j’ai juste fait un c/c sauf que c’est un String et non un Float ^^

                Tu veut dire stocker un String dans un packet ? tu peut faire

                @Override
                public void fromBytes(ByteBuf buf) {
                	this.type = ByteBufUtils.readUTF8String(buf);
                }
                
                @Override
                public void toBytes(ByteBuf buf) {
                	ByteBufUtils.writeUTF8String(buf, this.type);
                }
                
                1 réponse Dernière réponse Répondre Citer 0
                • BrokenSwingB Hors-ligne
                  BrokenSwing Moddeurs confirmés Rédacteurs
                  dernière édition par

                  Au lieu de synchroniser les données seulement avec le joueur possédant la capability (comme c’est le cas pour la mana), il te faut envoyer à tous les clients cette donnée

                  1 réponse Dernière réponse Répondre Citer 0
                  • N Hors-ligne
                    nwmqpa
                    dernière édition par

                    Cette ressource pourrait potentiellement t’etre utile, bien qu’elle n’utilise pas les capabilities
                    https://github.com/Tschipp/fakename

                    "Que la ForceTri soit avec toi !"
                    Maitre Yoda - The Legend of Zelda : Mystery of Solarus XD
                    [/a…

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

                      Très bien, j’ai essayé donc de send le packet à tout le monde
                      via un sendToAll seulement, j’ai se problème lors de l’affichage.

                      text alternatif

                      On voit ici que je défini le nom "LEL "au Player614, mais le “LEL” j’affiche à tous les clients mais pas à celui qui a cette valeur.
                      Le test à été réalisé en serveur et non pas sur un monde local, ou en solo bien évidemment.

                      Voilà mon code.

                      Code de rendu du pseudo.
                      :::

                      @SideOnly(Side.CLIENT)
                      	@SubscribeEvent
                      	public static void onPrePlayerRender(RenderPlayerEvent.Pre event) {
                      		EntityPlayer player = event.getEntityPlayer();
                      		RenderManager renderManager = event.getRenderer().getRenderManager();
                      		double d0 = player.getDistanceSq(renderManager.renderViewEntity);
                      		double maxDistance = 64D;
                      
                      		IRPName rpName = player.getCapability(RPNameProvider.RPNAME_CAP, null);
                      
                      		if (d0 <= (maxDistance * maxDistance)) {
                      			boolean flag = player.isSneaking();
                      			float f = renderManager.playerViewY;
                      			float f1 = renderManager.playerViewX;
                      			boolean flag1 = renderManager.options.thirdPersonView == 2;
                      			float f2 = player.height + 0.5F - (flag ? 0.25F : 0.0F);
                      			EntityRenderer.drawNameplate(renderManager.getFontRenderer(), rpName.getName(), (float) event.getX(), (float) event.getY() + f2 + 0.25F, (float) event.getZ(), 0, f, f1, flag1, flag);
                      		}
                      	}
                      

                      :::

                      PacketRPName.java
                      :::

                      public class PacketRPName implements IMessage {
                      
                      	private String name;
                      	private int playerID;
                      
                      	public PacketRPName() {}
                      
                      	public PacketRPName(EntityPlayer playerIn, String valueIn) {
                      		this.name = valueIn;
                      		this.playerID = playerIn.getEntityId();
                      	}
                      
                      	@Override
                      	public void fromBytes(ByteBuf buf) {
                      		this.name = ByteBufUtils.readUTF8String(buf);
                      		this.playerID = buf.readInt();
                      	}
                      
                      	@Override
                      	public void toBytes(ByteBuf buf) {
                      		ByteBufUtils.writeUTF8String(buf, this.name);
                      		buf.writeInt(this.playerID);
                      	}
                      
                      	public static class Handler implements IMessageHandler<PacketRPName, IMessage> {
                      
                      		@Override
                      		public IMessage onMessage(PacketRPName message, MessageContext ctx) {
                      			Caminelot.getProxy().getThreadListener(ctx).addScheduledTask(() -> {
                      				final EntityPlayer player = Caminelot.getProxy().getPlayer(ctx);
                      				IRPName rpName = player.getCapability(RPNameProvider.RPNAME_CAP, null);
                      				rpName.set(player, message.playerID, message.name);
                      			});
                      			return null;
                      		}
                      	}
                      }
                      

                      :::

                      RPNameCommande.java (la commande qui assigne le nom RP)
                      :::

                      
                      public class RPNameCommand extends CommandBase {
                      	public RPNameCommand() {
                      
                      	}
                      
                      	@Override
                      	public String getName() {
                      		return "rpname";
                      	}
                      
                      	@Override
                      	public String getUsage(ICommandSender sender) {
                      		return "/rpname <assign|remove> <player> <title>";
                      	}
                      
                      	@Override
                      	public void execute(MinecraftServer server, ICommandSender sender, String[] args) throws CommandException {
                      		if (args.length >= 2 && args[0].length() > 0 && args[1].length() > 0) {
                      			if (args[0].equalsIgnoreCase("assign") && args.length >= 3) {
                      				if (args[2].length() > 0) {
                      					// NAKConfig.addTitles(args[1], args[2]);
                      					EntityPlayer player;
                      					player = getPlayer(server, sender, 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(player, player.getEntityId(), title);
                      					rpname.synchronize();
                      					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")) {
                      				EntityPlayer player;
                      				player = getPlayer(server, sender, args[1]);
                      				IRPName rpname = player.getCapability(RPNameProvider.RPNAME_CAP, null);
                      				String title = "undefined";
                      				rpname.set(player, player.getEntityId(), title);
                      				rpname.synchronize();
                      				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);
                      		}
                      	}
                      
                      	private static void wrongUsage(ICommandSender sender) {
                      		TextComponentTranslation textComponantTranslation1 = new TextComponentTranslation("Error, usage : /rpname <assign|remove> <player> <rpname>", "");
                      		textComponantTranslation1.getStyle().setColor(TextFormatting.RED);
                      		sender.sendMessage(textComponantTranslation1);
                      	}
                      
                      	public List<String> getTabCompletions(MinecraftServer server, ICommandSender sender, String[] args, @Nullable BlockPos targetPos) {
                      		if (args.length == 1) {
                      			return getListOfStringsMatchingLastWord(args, new String[] { "assign", "remove" });
                      		} else if (args.length == 2) {
                      			return getListOfStringsMatchingLastWord(args, server.getOnlinePlayerNames());
                      		} else {
                      			return Collections.<String>emptyList();
                      		}
                      	}
                      
                      }
                      

                      :::

                      RPname.java qui implémente IRPName
                      :::

                      /**
                       * Default implementation of IRPName
                       */
                      public class RPName implements IRPName {
                      	public String name = "undefined";
                      	private int playerID;
                      	private EntityPlayer player;
                      
                      	public RPName() {}
                      
                      	@Override
                      	public void set(EntityPlayer playerIn, int playerIDIn, String nameIn) {
                      		this.player = playerIn;
                      		this.playerID = playerIDIn;
                      		this.name = nameIn;
                      		this.synchronize();
                      	}
                      
                      	@Override
                      	public String getName() {
                      		return this.name;
                      	}
                      
                      	@Override
                      	public void synchronize() {
                      		if (this.player != null && !this.player.getEntityWorld().isRemote)
                      			Caminelot.getNetwork().sendToAll(new PacketRPName(this.player, this.getName()));
                      	}
                      }
                      

                      :::

                      Je pense que mon erreur viens du rendu, ou de la commande.
                      Seulement j’ai vraiment du mal avec cette notion de packets et de quelles informations doivent transiter ou non.
                      Et encore plus pour récupérer la dite information apparemment.

                      Encore merci de votre aide !

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

                        Petit up ^^’

                        1 réponse Dernière réponse Répondre Citer 0
                        • N Hors-ligne
                          nwmqpa
                          dernière édition par

                          Le probleme vient de ton packet handler.

                          La capability a beau etre attachée a tous les joueurs, lors de ton Caminelot.getProxy().getPlayer(ctx), tu n’obtiens que le joueur du client. Cependant, la capability doit etre présente chez tous les joueurs.

                          Essaie d’envoyer les données de tous les joueurs a tous les joueurs (c’est tres moche, mais en attendant que tu vois l’effet voulu, ca suffira), en envoyant chaun des pseudos RP a tous les joueurs et en le donnant au joueur concerné.

                          Petit conseil, utilise getEntityId(); pour identifier une entité dans le monde (les ids sont le memes client/serveur)

                          "Que la ForceTri soit avec toi !"
                          Maitre Yoda - The Legend of Zelda : Mystery of Solarus XD
                          [/a…

                          1 réponse Dernière réponse Répondre Citer 0
                          • BrokenSwingB Hors-ligne
                            BrokenSwing Moddeurs confirmés Rédacteurs
                            dernière édition par

                            Plutôt sendToAllTracking que sendToAll

                            Exemple : https://github.com/MFFbrokenSwing/LeJambonMFF-PremiereEdition/blob/master/src/main/java/speakingcat/common/capability/MessageKeeper.java#L32

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

                              J’ai pas accès à ton repo @BrokenSwing 😢

                              1 réponse Dernière réponse Répondre Citer 0
                              • BrokenSwingB Hors-ligne
                                BrokenSwing Moddeurs confirmés Rédacteurs
                                dernière édition par

                                Pas grave, en gros, tu dois utiliser sendToAllTracking plutôt que sendToAll pour envoyer ton paquet.

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

                                  Toujours pareil, ça change rien.

                                  Dois-je vous renvoyer mon code ?

                                  1 réponse Dernière réponse Répondre Citer 0
                                  • BrokenSwingB Hors-ligne
                                    BrokenSwing Moddeurs confirmés Rédacteurs
                                    dernière édition par

                                    Vas-y, renvoie le tout 😉

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

                                      Bon,

                                      Je suis pas bon dans ce foutoir de packets et de capability.

                                      Voilà les classes qui t’interesse.

                                      La Commande
                                      :::

                                      
                                      public class RPNameCommand extends CommandBase {
                                      	public RPNameCommand() {
                                      
                                      	}
                                      
                                      	@Override
                                      	public String getName() {
                                      		return "rpname";
                                      	}
                                      
                                      	@Override
                                      	public String getUsage(ICommandSender sender) {
                                      		return "/rpname <assign|remove> <player> <title>";
                                      	}
                                      
                                      	@Override
                                      	public void execute(MinecraftServer server, ICommandSender sender, String[] args) throws CommandException {
                                      		if (args.length >= 2 && args[0].length() > 0 && args[1].length() > 0) {
                                      			if (args[0].equalsIgnoreCase("assign") && args.length >= 3) {
                                      				if (args[2].length() > 0) {
                                      					// NAKConfig.addTitles(args[1], args[2]);
                                      					EntityPlayer player;
                                      					player = getPlayer(server, sender, 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(player.getUniqueID().toString(), title);
                                      
                                      					// TODO Sending Packet Command #1
                                      					Caminelot.getNetwork().sendToAllTracking(new PacketRPName(player.getUniqueID().toString(), title), 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")) {
                                      				EntityPlayer player;
                                      				player = getPlayer(server, sender, args[1]);
                                      				IRPName rpname = player.getCapability(RPNameProvider.RPNAME_CAP, null);
                                      				String title = "undefined";
                                      				rpname.set(player.getUniqueID().toString(), title);
                                      
                                      				// TODO Sending Packet Command #2
                                      				Caminelot.getNetwork().sendToAllTracking(new PacketRPName(player.getUniqueID().toString(), title), 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);
                                      		}
                                      	}
                                      
                                      	private static void wrongUsage(ICommandSender sender) {
                                      		TextComponentTranslation textComponantTranslation1 = new TextComponentTranslation("Error, usage : /rpname <assign|remove> <player> <rpname>", "");
                                      		textComponantTranslation1.getStyle().setColor(TextFormatting.RED);
                                      		sender.sendMessage(textComponantTranslation1);
                                      	}
                                      
                                      	public List<String> getTabCompletions(MinecraftServer server, ICommandSender sender, String[] args, @Nullable BlockPos targetPos) {
                                      		if (args.length == 1) {
                                      			return getListOfStringsMatchingLastWord(args, new String[] { "assign", "remove" });
                                      		} else if (args.length == 2) {
                                      			return getListOfStringsMatchingLastWord(args, server.getOnlinePlayerNames());
                                      		} else {
                                      			return Collections.<String>emptyList();
                                      		}
                                      	}
                                      
                                      }
                                      
                                      

                                      :::

                                      La Classe du Packet

                                      :::

                                      
                                      public class PacketRPName implements IMessage {
                                      
                                      	private String name;
                                      	private String playerID;
                                      
                                      	public PacketRPName() {}
                                      
                                      	public PacketRPName(String playerIDIn, String valueIn) {
                                      		this.name = valueIn;
                                      		this.playerID = playerIDIn;
                                      	}
                                      
                                      	@Override
                                      	public void fromBytes(ByteBuf buf) {
                                      		this.name = ByteBufUtils.readUTF8String(buf);
                                      		this.playerID = ByteBufUtils.readUTF8String(buf);
                                      	}
                                      
                                      	@Override
                                      	public void toBytes(ByteBuf buf) {
                                      		ByteBufUtils.writeUTF8String(buf, this.name);
                                      		ByteBufUtils.writeUTF8String(buf, this.playerID);
                                      	}
                                      
                                      	public static class Handler implements IMessageHandler<PacketRPName, IMessage> {
                                      
                                      		@Override
                                      		public IMessage onMessage(PacketRPName message, MessageContext ctx) {
                                      			EntityPlayerMP serverPlayer = ctx.getServerHandler().player;
                                      
                                      			serverPlayer.getServerWorld().addScheduledTask(() -> {
                                      				IRPName rpName = serverPlayer.getCapability(RPNameProvider.RPNAME_CAP, null);
                                      				rpName.set(message.playerID, message.name);
                                      			});
                                      			return null;
                                      		}
                                      	}
                                      }
                                      

                                      :::

                                      Le NetworkHandler

                                      :::

                                      public class NetworkHandler {
                                      
                                      	public static void registerPacket() {
                                      		registerMessage(PacketRPName.Handler.class, PacketRPName.class, Side.CLIENT, 2);
                                      		registerMessage(PacketRPName.Handler.class, PacketRPName.class, Side.SERVER, 3);
                                      	}
                                      
                                      	private static <REQ extends IMessage, REPLY extends IMessage> void registerMessage(final Class<? extends IMessageHandler<REQ, REPLY>> messageHandler, final Class<REQ> requestMessageType,
                                      			final Side receivingSide, int desc) {
                                      		Caminelot.getNetwork().registerMessage(messageHandler, requestMessageType, desc, receivingSide);
                                      	}
                                      }
                                      

                                      :::

                                      Les Events pour la Capability

                                      :::

                                      package fr.caminelot.common.capability.player;
                                      
                                      import fr.caminelot.common.Caminelot;
                                      import fr.caminelot.common.capability.player.mana.IMana;
                                      import fr.caminelot.common.capability.player.mana.ManaProvider;
                                      import fr.caminelot.common.capability.player.rpname.IRPName;
                                      import fr.caminelot.common.capability.player.rpname.RPNameProvider;
                                      import fr.caminelot.common.network.packet.rpname.PacketRPName;
                                      import net.minecraft.client.renderer.EntityRenderer;
                                      import net.minecraft.client.renderer.entity.RenderManager;
                                      import net.minecraft.entity.Entity;
                                      import net.minecraft.entity.player.EntityPlayer;
                                      import net.minecraft.entity.player.EntityPlayer.SleepResult;
                                      import net.minecraft.entity.player.EntityPlayerMP;
                                      import net.minecraft.util.text.TextComponentString;
                                      import net.minecraftforge.client.event.RenderPlayerEvent;
                                      import net.minecraftforge.event.entity.living.LivingFallEvent;
                                      import net.minecraftforge.event.entity.player.PlayerEvent;
                                      import net.minecraftforge.event.entity.player.PlayerSleepInBedEvent;
                                      import net.minecraftforge.fml.common.Mod.EventBusSubscriber;
                                      import net.minecraftforge.fml.common.eventhandler.SubscribeEvent;
                                      import net.minecraftforge.fml.common.gameevent.PlayerEvent.PlayerLoggedInEvent;
                                      import net.minecraftforge.fml.common.gameevent.PlayerEvent.PlayerLoggedOutEvent;
                                      import net.minecraftforge.fml.relauncher.Side;
                                      import net.minecraftforge.fml.relauncher.SideOnly;
                                      
                                      @EventBusSubscriber(modid = Caminelot.MODID)
                                      public class CapabilityEventHandler {
                                      
                                      	@SubscribeEvent
                                      	public static void onPlayerLogsIn(PlayerLoggedInEvent event) {
                                      		EntityPlayer player = event.player;
                                      		IRPName rpName = player.getCapability(RPNameProvider.RPNAME_CAP, null);
                                      
                                      		String message = String.format("Hello there, your RP Name is %s.", rpName.getName());
                                      		player.sendMessage(new TextComponentString(message));
                                      	}
                                      
                                      
                                      	/**
                                      	 * Copy data from dead player to the new player
                                      	 */
                                      	@SubscribeEvent
                                      	public static void onPlayerClone(PlayerEvent.Clone event) {
                                      		EntityPlayer player = event.getEntityPlayer();
                                      		// ====RPName
                                      		IRPName rpName = player.getCapability(RPNameProvider.RPNAME_CAP, null);
                                      		IRPName oldRpName = event.getOriginal().getCapability(RPNameProvider.RPNAME_CAP, null);
                                      		rpName.set(player.getUniqueID().toString(), oldRpName.getName());
                                      	}
                                      
                                      	@SideOnly(Side.CLIENT)
                                      	@SubscribeEvent
                                      	public static void onPrePlayerRender(RenderPlayerEvent.Pre event) {
                                      		EntityPlayer player = event.getEntityPlayer();
                                      		RenderManager renderManager = event.getRenderer().getRenderManager();
                                      		double d0 = player.getDistanceSq(renderManager.renderViewEntity);
                                      		double maxDistance = 64D;
                                      
                                      		IRPName rpName = player.getCapability(RPNameProvider.RPNAME_CAP, null);
                                      
                                      		if (d0 <= (maxDistance * maxDistance)) {
                                      			boolean flag = player.isSneaking();
                                      			float f = renderManager.playerViewY;
                                      			float f1 = renderManager.playerViewX;
                                      			boolean flag1 = renderManager.options.thirdPersonView == 2;
                                      			float f2 = player.height + 0.5F - (flag ? 0.25F : 0.0F);
                                      			EntityRenderer.drawNameplate(renderManager.getFontRenderer(), rpName.getName(), (float) event.getX(), (float) event.getY() + f2 + 0.25F, (float) event.getZ(), 0, f, f1, flag1, flag);
                                      		}
                                      	}
                                      
                                      }
                                      
                                      

                                      :::

                                      Classe RPName

                                      :::

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

                                      :::

                                      Classe Storage de la Capability

                                      :::

                                      
                                      public class RPNameStorage implements IStorage<IRPName> {
                                      	@Override
                                      	public NBTBase writeNBT(Capability<IRPName> capability, IRPName instance, EnumFacing side) {
                                      		return new NBTTagString(instance.getName());
                                      	}
                                      
                                      	@Override
                                      	public void readNBT(Capability<IRPName> capability, IRPName instance, EnumFacing side, NBTBase nbt) {
                                      		instance.set("none", ((NBTTagString) nbt).getString());
                                      	}
                                      }
                                      

                                      :::

                                      Classe Provider de la Capability

                                      :::

                                      
                                      public class RPNameProvider implements ICapabilitySerializable<NBTBase> {
                                      	@CapabilityInject(IRPName.class)
                                      	public static final Capability<IRPName> RPNAME_CAP = null;
                                      
                                      	private IRPName instance = RPNAME_CAP.getDefaultInstance();
                                      
                                      	@Override
                                      	public boolean hasCapability(Capability<?> capability, EnumFacing facing) {
                                      		return capability == RPNAME_CAP;
                                      	}
                                      
                                      	@Override
                                      	public <T> T getCapability(Capability<T> capability, EnumFacing facing) {
                                      		return capability == RPNAME_CAP ? RPNAME_CAP.<T>cast(this.instance) : null;
                                      	}
                                      
                                      	@Override
                                      	public NBTBase serializeNBT() {
                                      		return RPNAME_CAP.getStorage().writeNBT(RPNAME_CAP, this.instance, null);
                                      	}
                                      
                                      	@Override
                                      	public void deserializeNBT(NBTBase nbt) {
                                      		RPNAME_CAP.getStorage().readNBT(RPNAME_CAP, this.instance, null, nbt);
                                      	}
                                      }
                                      

                                      :::

                                      Enregistrement de la capability

                                      • Dans le pre-init du CommonProxy

                                      :::

                                      CapabilityManager.INSTANCE.register(IRPName.class, new RPNameStorage(), RPName::new);
                                      

                                      :::

                                      1 réponse Dernière réponse Répondre Citer 0
                                      • 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
                                          • 1 / 2
                                          • Premier message
                                            Dernier message
                                          Design by Woryk
                                          ContactMentions Légales

                                          MINECRAFT FORGE FRANCE © 2024

                                          Powered by NodeBB