Résolu Fonction gerer que par le client et non par le serveur
-
Bonsoir, j’ai creer un systeme de metier, le probleme c’est que le systeme qui gere l’xp fonctionne que cotê client. Je sais pas si c’est possible de faire en sorte que l’xp soit gerer coté client ET cotê serveur. J’ai suivi un tuto pour creer un packet, qui fonctionne bien en solo mais en multi, la valeur xp ne s’augmente pas car je pense que l’xp n’est pas gerer sur le serveur bref… Comment on fait en sorte que ma methode addXp ajoute de l’xp a un joueur sur le serveur et le sauvegarde? J’attend vos réponses si vous pouvez m’aider. Merci à tous ceux qui veulent bien m’aider
-
Bonjour,
Peux-tu envoyer le code en rapport avec ta gestion d’xp ?
-
public void addXp(int value) { xp += value; if (getManager().xp >= getManager().maxXp + 1) { getManager().xp = 0; if (getManager().level == this.number) { getManager().level++; this.number++; getManager().maxXp += 500; } } }
package fr.zunf1x.icemc.packets; import fr.zunf1x.icemc.utils.ExperienceManager; import io.netty.buffer.ByteBuf; import net.minecraft.entity.player.EntityPlayerMP; import net.minecraftforge.fml.common.network.simpleimpl.IMessage; import net.minecraftforge.fml.common.network.simpleimpl.IMessageHandler; import net.minecraftforge.fml.common.network.simpleimpl.MessageContext; public class PacketJobsXP implements IMessage { private int xp; private int maxXp; private int level; public PacketJobsXP() { } public PacketJobsXP(int xp, int maxXp, int level) { this.xp = xp; this.maxXp = maxXp; this.level = level; } @Override public void fromBytes(ByteBuf buf) { this.xp = buf.readInt(); this.maxXp = buf.readInt(); this.level = buf.readInt(); } @Override public void toBytes(ByteBuf buf) { buf.writeInt(this.xp); buf.writeInt(this.maxXp); buf.writeInt(this.level); } public static class Handler implements IMessageHandler<PacketJobsXP, IMessage> { @Override public IMessage onMessage(PacketJobsXP message, MessageContext ctx) { EntityPlayerMP player = ctx.getServerHandler().player; ExperienceManager.getManager().addXp(250); return null; } } }
if (button.id == 0) { IceMC.network.sendToServer(new PacketJobsXP(ExperienceManager.getManager().xp, ExperienceManager.getManager().maxXp, ExperienceManager.getManager().level)); }
-
Ta fonction addXp tu l’appel où et elle se trouve dans quoi comme classe ?
Parce que là j’ai l’impression que tu essaies de synchro des valeurs calculé sur le client vers le serveur, ce qui est une très mauvaise idée puisqu’un joueur pourrait envoyer un fausse valeur pour tricher.
Tu dois mettre en place la logique inverse : le serveur doit faire tout les calcules et la valeur doit être synchronisé avec le client.
Si tu as une capabilité pour l’xp, le plus simple est de synchro les valeurs à la connexion du joueur, quand il rejoint le monde (tu peux utiliser l’event LivingJoinWorldEvent pour ça). -
il faut faire une capability?
-
Pas obligatoirement mais c’est mieux. Tu gère comment ton xp actuellement et la sauvegarde de sa valeur ?
-
je n’ai pas encore de sauvegarde mais j’ajoute l’xp a une variable dans mon code
-
Ok donc c’est probablement il semble variable qui tu as dans une classe, pas étonnant que rien ne fonctionne côté serveur du-coup (tout le monde aura la même valeur). Il te faut une capability pour faire les choses correctement.
-
Okay merci ^^
-
Bonjour,
Ne pas oublier qu’il ne faut rien gérer côté client, surtout pas de fonction qui attribut quelque chose sans sécurité côté serveur, sinon 3 minutes suffisent pour que votre mod devient “le mod à ne surtout pas ajouter sur le serveur”, comme blibliocraft et beaucoup d’autres mods qui ont eu de très grosses faille car ils gèrent côté client strictement sans vérification supplémentaire côté serveur et POUF.
C’était juste un rappel au cas où
-
Okay merci!