1.7.x [1.7.x] Crée de nouvelle valeurs (données) joueurs sauvegarder (exemple : mana)



  • Rebonjour a vous tous, je vous sollicite de nouveau, car je me pose une question existentielle dans minecraft LoL 😛

    Je souhaite dans cette exemple crée un niveau de mana lié aux joueurs (sachant que cela peut fonctionner en solo comme en multi).

    Mes questions sont comment crée une nouvelle variable de joueur qui contiendrais le niveau de mana d'un joueur (avec un niveau max) ?

    Comme sauvegarder c'est variable, pour que si le joueur se reconnecte il récupérer la dernière valeur enregistrer ?

    Voici des liens de recherche que j'ai trouver (Création d'une barre de mana [ENGLISH]) mais j'avoue ne rien comprendre … d'après ce que j'ai compris les joueurs d'un serveur fonctionne sur un système de propriétés, et il faudrait fait une extension de propriétés des joueurs comme ici :

    public ExtendedPlayer(EntityPlayer player)
    {
        this.player = player;
        // Start with max mana. Every player starts with the same amount.
        this.currentMana = this.maxMana = 50;
    }
    
    

    Mais je trouve le tuto que je vous ai fournit mal fait car il précise pas ou il fait ces modification dans les classes, ça pourrait être pas mal d'en refaire un détaillé et en français, mais je ne pense pas avoir les compétences encore pour le faire


  • Moddeurs confirmés Rédacteurs Administrateurs

    Il y a déjà un tutoriel chez nous : http://www.minecraftforgefrance.fr/showthread.php?tid=905



  • Effectivement je ne l'avais pas vu celui la désoler … je laisse le sujet en suspend au cas ou merci robin4002


    Dans le tuto on parle de crée un Identifiant, un constructeur et 2 méthodes, il faut les crées

    entre :

    public class ExtendedEntityPropTuto implements IExtendedEntityProperties {
    

    et :

    
    @Override
    public void saveNBTData(NBTTagCompound compound) {
    // TODO Auto-generated method stub
    
    }
    

    c'est bien ça ?


  • Modérateurs

    Tu peux les mettre où tu veux dans la classe.



  • D'accord merci pour cette indication, sinon pour continuer le tuto j'ai télécharger FFMT API et je l'est mit dans le dossier mod pour l'execution du jeu, j'ai aussi suivi ceci :

    1- Cliquez sur le bouton "download zip" ou faite un fork du projet et clonez-le en local.
    2- Dans eclipse, faite un clic droit sur le projet Minecraft. Cliquez sur "new folder".
    3- Une page s'ouvre, nommez le dossier "FFMT Libs", cliquez sur avancez, selectionnez "Link to alternate location" et selectionnez le dossier common du projet github
    4- Faite la même chose pour le dossier resouces, et nommez le dossier "FFMT Libs resources"
    5- Ensuite cliquez droit à nouveau sur le projet Minecraft et faite "new source folder"
    6- Sélectionnez le dossier "FFMT Libs" et faite la même chose pour "FFMT Libs resources"

    Ce qui m'a enlever pas mal d'erreur malgrès tous je me retrouve avec les erreurs suivantes :

    –------------------------------------------------------------------

    Dans :

    public class PacketMoney extends AbstractPacket{
    
    private int maxMoney, Money;
    
    public PacketMoney(){
    
    }
    

    à la ligne :

    public class PacketMoney extends AbstractPacket{
    

    Erreur :

    The type PacketMoney must implement the inherited abstract method AbstractPacket.encodeInto(ChannelHandlerContext, PacketBuffer)
    

    Dans :

    @Override
    public void encodeInto(ChannelHandlerContext ctx, ByteBuf buffer) {
    buffer.writeInt(maxMoney);
    buffer.writeInt(money);
    
    }
    
    @Override
    public void decodeInto(ChannelHandlerContext ctx, ByteBuf buffer) {
    this.maxMoney = buffer.readInt();
    this.money = buffer.readInt();
    }
    

    aux lignes :

    public void encodeInto(ChannelHandlerContext ctx, ByteBuf buffer) {
    public void decodeInto(ChannelHandlerContext ctx, ByteBuf buffer) {
    

    Erreur :

    The method encodeInto(ChannelHandlerContext, ByteBuf) of type PacketMoney must override or implement a supertype method
    

    j'ai la possibilité d’implémenté la méthode mais je trouve sa bizarre car je ne pense pas qu'il soit nécessaire de modifier le FFMT API


  • Moddeurs confirmés Rédacteurs Administrateurs

    Il y a eu des changements récemment dans FFMT libs, j'ai refais le système de paquet car l'ancien provoquait des fuites de mémoire.
    Tu peux regarder sur nanotech mod comment l'utiliser :
    https://github.com/FFMT/nanotech_mod/blob/master/common/fr/mcnanotech/kevin_68/nanotechmod/main/core/NanotechMod.java#L61
    https://github.com/FFMT/nanotech_mod/tree/master/common/fr/mcnanotech/kevin_68/nanotechmod/main/network/packet



  • Bon bah je doit être nul 😛

    j'ai modifier ceci :

    public class PacketMoney extends AbstractPacket{
    

    Par cela :

    public class PacketMoney extends FFMTPacket{
    

    Donc j'ai résolu cette erreur grâce a tes explications.

    Mais concernant les autres commande je ne trouve aucun trace dans l'exemple du mod Nanotech, ce qui signifie effectivement que sa a changer mais je ne trouve aucun trace de ce qui le remplace 😕


    J'ai aussi rajouter cette ligne dans mon main :

    public static final PacketManager packetHandler = new PacketManager("fr.paramystick.tutoriel.main.packets", MODID, "TutorielMod");
    

    ce qui me permet d'après ce que j'ai compris, d’exécuter tous les packets contenu dans le packages "packets".

    Mais quand je lance le jeu j'ai tous ces erreurs :

    java.lang.ExceptionInInitializerError
    at java.lang.Class.forName0(Native Method)
    at java.lang.Class.forName(Unknown Source)
    at cpw.mods.fml.common.ProxyInjector.inject(ProxyInjector.java:42)
    at cpw.mods.fml.common.FMLModContainer.constructMod(FMLModContainer.java:492)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
    at java.lang.reflect.Method.invoke(Unknown Source)
    at com.google.common.eventbus.EventHandler.handleEvent(EventHandler.java:74)
    at com.google.common.eventbus.SynchronizedEventHandler.handleEvent(SynchronizedEventHandler.java:47)
    at com.google.common.eventbus.EventBus.dispatch(EventBus.java:314)
    at com.google.common.eventbus.EventBus.dispatchQueuedEvents(EventBus.java:296)
    at com.google.common.eventbus.EventBus.post(EventBus.java:267)
    at cpw.mods.fml.common.LoadController.sendEventToModContainer(LoadController.java:209)
    at cpw.mods.fml.common.LoadController.propogateStateMessage(LoadController.java:188)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
    at java.lang.reflect.Method.invoke(Unknown Source)
    at com.google.common.eventbus.EventHandler.handleEvent(EventHandler.java:74)
    at com.google.common.eventbus.SynchronizedEventHandler.handleEvent(SynchronizedEventHandler.java:47)
    at com.google.common.eventbus.EventBus.dispatch(EventBus.java:314)
    at com.google.common.eventbus.EventBus.dispatchQueuedEvents(EventBus.java:296)
    at com.google.common.eventbus.EventBus.post(EventBus.java:267)
    at cpw.mods.fml.common.LoadController.distributeStateMessage(LoadController.java:119)
    at cpw.mods.fml.common.Loader.loadMods(Loader.java:489)
    at cpw.mods.fml.client.FMLClientHandler.beginMinecraftLoading(FMLClientHandler.java:202)
    at net.minecraft.client.Minecraft.startGame(Minecraft.java:520)
    at net.minecraft.client.Minecraft.run(Minecraft.java:890)
    at net.minecraft.client.main.Main.main(Main.java:112)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
    at java.lang.reflect.Method.invoke(Unknown Source)
    at net.minecraft.launchwrapper.Launch.launch(Launch.java:134)
    at net.minecraft.launchwrapper.Launch.main(Launch.java:28)
    Caused by: java.lang.NullPointerException
    at fr.minecraftforgefrance.ffmtlibs.network.PacketManager.<init>(PacketManager.java:56)
    at fr.paramystick.tutoriel.core.TutorielMod.<clinit>(TutorielMod.java:39)
    … 36 more
    

    Si je commente la ligne 39 de mon main qui correspond a la ligne ci dessous j'ai le jeu qui se lance sans probleme (ce qui me parait logique vu qu'il n'existe aucun packet), est-ce que cela veut dire que mon fichier "ExtendedEntityPropMoney" fonctionne quand même ? et que mon probleme viendrait du packet "PacketMoney" ?

    public static final PacketManager packetHandler = new PacketManager("fr.paramystick.tutoriel.main.packets", MODID, "TutorielMod");
    

    une autre question, dans le tuto on parle de quelques méthode a mettre dans mon "EventHandler" dans qu'elle fichier faut-il mettre cela ? mon "Main", "ExtendedEntityPropMoney" ou bien "PacketMoney" ?
    [infobulle="Gugu42"]EventHandler : Dans votre event handler, vous allez avoir besoin de pas mal d'events…[/infobulle]</clinit></init>


  • Moddeurs confirmés Rédacteurs Administrateurs

    Tu peux m'envoyer tout le début de ta classe principale ?
    Oui c'est bien les paquets qui ne fonctionnent pas, normalement ton ExtendedEntityPropMoney devrait fonctionner.



  • package fr.paramystick.tutoriel.core;
    
    import net.minecraft.creativetab.CreativeTabs;
    import net.minecraftforge.common.MinecraftForge;
    import cpw.mods.fml.common.Mod;
    import cpw.mods.fml.common.Mod.EventHandler;
    import cpw.mods.fml.common.Mod.Instance;
    import cpw.mods.fml.common.SidedProxy;
    import cpw.mods.fml.common.event.FMLInitializationEvent;
    import cpw.mods.fml.common.event.FMLPostInitializationEvent;
    import cpw.mods.fml.common.event.FMLPreInitializationEvent;
    import fr.minecraftforgefrance.ffmtlibs.network.FFMTPacketHandler;
    import fr.minecraftforgefrance.ffmtlibs.network.PacketManager;
    import fr.paramystick.tutoriel.hud.InfoOverlay;
    
    @Mod(modid = "tutoriel", name = "Tutoriel Mod", version = "0.0.1", dependencies = "required-after:ffmtlibs")
    
    public class TutorielMod
    {
    /**
    * TutorielMod's mod Identifier
    */
    public static final String MODID = "TutorielMod";
    
    /**
    * La suite va se mettre ici
    */
    @Instance(MODID)
    public static TutorielMod modInstance;
    
    /**
    * Initialisation si on est coter SERVEUR ou CLIENT
    */
    @SidedProxy(clientSide = "fr.paramystick.tutoriel.core.ClientProxy", serverSide = "fr.paramystick.tutoriel.core.CommonProxy")
    public static CommonProxy proxy;
    
    /**
    * TutorielMod packethandler
    */
    public static final PacketManager packetHandler = new PacketManager("fr.paramystick.tutoriel.packets", MODID, "TutorielMod");
    
    

    Dit moi si tu as besoin de plus ! 😄


  • Moddeurs confirmés Rédacteurs Administrateurs

    Ta classe PacketMoney se trouve bien dans le package fr.paramystick.tutoriel.packets ?



  • celui de la classe "PacketMoney" ?


  • Moddeurs confirmés Rédacteurs Administrateurs

    J'ai modifié mon message, il est parti trop vite x)



  • Oui il se trouve bien dans ce package


  • Moddeurs confirmés Rédacteurs Administrateurs

    Hum je ne sais pas alors, c'est étrange je ne vois rien qui cause problème 😕



  • Je te donne la classe "PacketMoney" qui se trouve dans le package "fr.paramystick.tutoriel.packets" :

    package fr.paramystick.tutoriel.packets;
    
    import java.io.IOException;
    
    import net.minecraft.entity.player.EntityPlayer;
    import io.netty.buffer.ByteBuf;
    import io.netty.channel.ChannelHandlerContext;
    import fr.minecraftforgefrance.ffmtlibs.network.FFMTPacket;
    import fr.paramystick.tutoriel.extprop.ExtendedEntityPropMoney;
    
    public class PacketMoney extends FFMTPacket
    {
    private int maxMoney, Money;
    
    public PacketMoney()
    {}
    
    public PacketMoney(int maxMoney, int Money)
    {
    this.maxMoney = maxMoney;
    this.Money = Money;
    }
    
    @Override
    public void writeData(ByteBuf buffer) throws IOException
    {
    buffer.writeInt(maxMoney);
    buffer.writeInt(Money);
    }
    
    @Override
    public void readData(ByteBuf buffer)
    {
    this.maxMoney = buffer.readInt();
    this.Money = buffer.readInt();
    }
    
    @Override
    public void handleClientSide(EntityPlayer player)
    {
    ExtendedEntityPropMoney props = ExtendedEntityPropMoney.get(player);
    props.maxMoney = this.maxMoney;
    props.Money = this.Money;
    }
    
    @Override
    public void handleServerSide(EntityPlayer player)
    {
    ExtendedEntityPropMoney props = ExtendedEntityPropMoney.get(player);
    props.maxMoney = this.maxMoney;
    props.Money = this.Money;
    }
    }
    

  • Moddeurs confirmés Rédacteurs Administrateurs

    Ok, la si je vois le problème :
    package fr.paramystick.tutoriel.packets;

    public static final PacketManager packetHandler = new PacketManager("fr.paramystick.tutoriel.main.packets", MODID, "TutorielMod");

    Les deux packages ne correspondent pas.

    Utilise ce code :
    public static final PacketManager packetHandler = new PacketManager("fr.paramystick.tutoriel.packets", MODID, "TutorielMod");



  • Oui, sa aurait pu être sa mais c'est moi qui est fait une erreur de copier coller sur le forum dans mon main j'ai bien sa :

    public static final PacketManager packetHandler = new PacketManager("fr.paramystick.tutoriel.packets", MODID, "TutorielMod");
    

    et ma classe "PacketMoney" se trouve bien dans le package suivant :

    fr.paramystick.tutoriel.packets
    

    Si j'ai bien compris il envoie des packets au serveur grâce a cette ligne 39 :

    public static final PacketManager packetHandler = new PacketManager("fr.paramystick.tutoriel.packets", MODID, "TutorielMod");
    

    Mais dans le cas ou le serveur n'existe pas et que je suis en solo, sa ne déclencherai pas mon erreur a cause de sa ?


    Je rectifie, je viens de lancer en mode serveur et j'ai la même erreur


    J'ai commenter le contenu de toute les méthodes de la classe "PacketMoney", j'ai l'impression que l'erreur viendrais de l'extends "FFMTPacket"


    J'aimerais vérifier que j'ai pas fait d'erreur dans la classe "ExtendedEntityPropMoney", pour cela j'aimerai afficher la valeur de la variable "Money" dans mon InfoOverlay qui affiche sur l'écran HUD.

    Pour cela j'ai besoin de récuperer la varible dans ma classe "InfoOverlay", j'ai utiliser ceci, mais sa doit pas être de cette manière qu'il faut s'y prendre :

    ExtendedEntityPropMoney.get(player).Money
    

    Car il me demande de définir "player" j'ai donc rajouter ceci plus haut :

    EntityPlayer player = mc.thePlayer;
    

    Mais sa me déclenche des erreurs, donc je suppose que ce n'est pas de cette manière qu'il faut s'y prendre


  • Moddeurs confirmés Rédacteurs Administrateurs

    La ligne public static final PacketManager packetHandler = new PacketManager("fr.paramystick.tutoriel.packets", MODID, "TutorielMod");
    Permet d'initialisé ce qui gère les paquets de ton mod et d'enregistrer tout les paquets, celle ligne n'envoie pas de paquet.
    Pour l'envoyer c'est TutorielMod.packetHandler.sendTo…(new ClasseDeTonPacket(paramètres));
    sendTo ... il y en a plusieurs, sendToServer, sendTo avec comme argument le joueur, etc ...

    Je vois pas en quoi l'extends causerai problème 😕

    Pour le rendu, ça devrait être bon pourtant, si l'erreur est sur mc, remplace par FMLClientHandler.instance().getClient()



  • Je vais t'afficher la parti de mon codage qui cherche a récupérer la valeur Money et maxMoney pour l'afficher sur le HUD.

    Mon code compresser :

    private Minecraft mc = FMLClientHandler.instance().getClient();
    private final EntityPlayer player = mc.thePlayer;
    
    MoneyLong = ExtendedEntityPropMoney.get(player).Money;
    maxMoneyLong = ExtendedEntityPropMoney.get(player).maxMoney;
    
    FMLClientHandler.instance().getClient().fontRenderer.drawStringWithShadow("Money : "+MoneyLong+" / "+maxMoneyLong, 5, 25, 0xffffff);
    

    Erreur :

    java.lang.NullPointerException
    at fr.paramystick.tutoriel.hud.InfoOverlay.renderGameOverlay(InfoOverlay.java:45) ~[InfoOverlay.class:?]
    at cpw.mods.fml.common.eventhandler.ASMEventHandler_7_InfoOverlay_renderGameOverlay_Post.invoke(.dynamic) ~[?:?]
    at cpw.mods.fml.common.eventhandler.ASMEventHandler.invoke(ASMEventHandler.java:51) ~[ASMEventHandler.class:?]
    at cpw.mods.fml.common.eventhandler.EventBus.post(EventBus.java:122) ~[EventBus.class:?]
    at net.minecraftforge.client.GuiIngameForge.post(GuiIngameForge.java:900) ~[GuiIngameForge.class:?]
    at net.minecraftforge.client.GuiIngameForge.renderExperience(GuiIngameForge.java:548) ~[GuiIngameForge.class:?]
    at net.minecraftforge.client.GuiIngameForge.renderGameOverlay(GuiIngameForge.java:153) ~[GuiIngameForge.class:?]
    at net.minecraft.client.renderer.EntityRenderer.updateCameraAndRender(EntityRenderer.java:1121) ~[EntityRenderer.class:?]
    at net.minecraft.client.Minecraft.runGameLoop(Minecraft.java:1023) ~[Minecraft.class:?]
    at net.minecraft.client.Minecraft.run(Minecraft.java:910) [Minecraft.class:?]
    at net.minecraft.client.main.Main.main(Main.java:112) [Main.class:?]
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~[?:1.8.0]
    at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source) ~[?:1.8.0]
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source) ~[?:1.8.0]
    at java.lang.reflect.Method.invoke(Unknown Source) ~[?:1.8.0]
    at net.minecraft.launchwrapper.Launch.launch(Launch.java:134) [launchwrapper-1.9.jar:?]
    at net.minecraft.launchwrapper.Launch.main(Launch.java:28) [launchwrapper-1.9.jar:?]
    

    L'erreur est encore une valeur NULL et elle se situerai a ce niveau la :

    MoneyLong = ExtendedEntityPropMoney.get(player).Money;
    maxMoneyLong = ExtendedEntityPropMoney.get(player).maxMoney;
    

    Car si je met des valeur a la place tous ce passe bien, ex :

    MoneyLong = 5;
    maxMoneyLong = 10;
    

    AH mais attend je suis en train de penser il faut peut être initialiser les variable grâce au Event Handler, d’où ma question d’où il fallait les mettre dans qu'elle classe 😛


  • Moddeurs confirmés Rédacteurs Administrateurs

    En effet, j'ai bien l'impression qu'il te manque ça : https://www.minecraftforgefrance.fr/topic/799/extended-entity-properties#EventHandler


Log in to reply