Résolu [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
-
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 ?
-
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
-
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> -
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 !
-
Ta classe PacketMoney se trouve bien dans le package fr.paramystick.tutoriel.packets ?
-
celui de la classe “PacketMoney” ?
-
J’ai modifié mon message, il est parti trop vite x)
-
Oui il se trouve bien dans ce package
-
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; } }
-
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
-
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
-
En effet, j’ai bien l’impression qu’il te manque ça : https://www.minecraftforgefrance.fr/topic/799/extended-entity-properties#EventHandler