Résolu Liste de personne.
-
Bonjour,
Alors je vous explique se que je cherches à faire:
A l’aide d’une commande ajouter le pseudo d’un joueur dans une liste avec un commentaire du genre: /add <pseudo>SalutSalut! et pouvoir retirer les gens de cette liste avec le: /remove <pseudo>puis lire la liste avec les pseudos et les commentaire: /read
Je cherches aussi si c’est possible de faire une genre de permissions a la commande.
Pour les commandes je sais faire mais je vois pas comment faire pour la liste et je veux que la liste soit “sauvegarder” a chaque redémarrage du serveur etc…
Voilà j’espère être assez clair dans mes explications sinon dite le moi !
Merciii :)</pseudo></pseudo>
-
Rien de très compliqué, pour les commandes y’a tout dans ta classe de commande.
Le “SalutSalut!” correspond à quoi ?
Pour ce qui d’enregistrer les données soit tu les mets dans un fichier à part (dans le dossier config par exemple), soit tu l’enregistres dans les données du monde
-
@‘SCAREX’:
Rien de très compliqué, pour les commandes y’a tout dans ta classe de commande.
Le “SalutSalut!” correspond à quoi ?
Pour ce qui d’enregistrer les données soit tu les mets dans un fichier à part (dans le dossier config par exemple), soit tu l’enregistres dans les données du monde
D’acc le SalutSalut! correspond au commentaire que l’on peu mettre en ajoutant le joueur dans la liste
Et comme liste vous me conseillez de prendre quoi?
EDIT:
Question:
Pour stock la hashmap comment je peux faire ?
-
Comme il l’a dit, tu as 2 choix: Tu peux le stocker dans le monde ou dans un fichier externe. L’avantage du fichier externe est qu’il est le même sur tous les mondes, ce qui peut être un problème dans certains cas (tu peux aussi le rendre différents pour chaque monde, mais autant utiliser le WorldSavedData)
-
Je serrai d’avis de faire ça avec un fichier externe.
Un tuto pour ça ? ou simplement de l’aide serai la bienvenue !
merci
-
Sous quel format veux-tu enregistrer tes données ? JSON, Fichier de config de ton mod, fichier texte …
-
@‘BrokenSwing’:
Sous quel format veux-tu enregistrer tes données ? JSON, Fichier de config de ton mod, fichier texte …
Fichier texte je penses fin le plus simple x)
-
Ok, du coup tu veux sauvegarder les données seulement lorsque que le serveur s’éteint ou à chaque modification de la HashMap ?
-
@‘BrokenSwing’:
Ok, du coup tu veux sauvegarder les données seulement lorsque que le serveur s’éteint ou à chaque modification de la HashMap ?
A chaque modification de la hashmap.
-
Ok, maintenant dit-moi où tu bloques ? Tu sais utiliser le package java.io ?
-
Dans ton cas, c’est du Java tout simplement, tu peux regarder des tutos sur l’écriture dans un fichier.
-
@‘BrokenSwing’:
Ok, maintenant dit-moi où tu bloques ? Tu sais utiliser le package java.io ?
Bah le truc c’est que je bloque simplement au enregistrement sur un dossier externe.
Le package java.io correspond a quoi ? ^^
edit:
J’ai trouvé ça:
[size=x-smallpackage com.test; import java.io.*; public class A { public static void main(String[] args) { String pathFrom = "c:\\folderFrom\\jaros.jar"; byte[] tab = lire1(pathFrom); String pathTo = "C:\\folderTo\\jaros.jar"; ecrire(pathTo, tab); System.out.println("test"); } public static byte[] lire1(String pathFrom) { // Lire le fichier byte[] tabReadData = null; File file = new File(pathFrom); try { FileInputStream fin = new FileInputStream(file); tabReadData = new byte[(int) file.length()]; fin.read(tabReadData); } catch (FileNotFoundException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } return tabReadData; } public static byte[] lire2(String pathFrom) { File file = new File(pathFrom); byte[] fileData = new byte[(int) file.length()]; DataInputStream dis; try { dis = new DataInputStream(new FileInputStream(file)); dis.readFully(fileData); dis.close(); } catch (FileNotFoundException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } return fileData; } public static void ecrire(String pathTo, byte[] tab) { try { FileOutputStream fos = new FileOutputStream(pathTo); fos.write(tab); fos.close(); } catch (FileNotFoundException ex) { ex.printStackTrace(); } catch (IOException ioe) { ioe.printStackTrace(); } } }]
Du coup maintenant je vois a quoi correspond le package java.io et je comprends presque rien ^^
-
Ce que tu cherches a faire, ça s’appelle la sérialization.
Il existe plein (vraiment plein) de tutoriel la dessus.
C’est complètement *** d’utiliser ton propre format pour sérialiser tes données surtout lorsque tu n’as aucune connaissance en Java.Dans le classpath standard de Minecraft et de Forge, tu as l’API Gson qui te permet de faire simplement un fichier JSON.
Un tutoriel est disponible ici : http://www.jmdoudoux.fr/java/dej/chap-gson.htm
-
@‘RedRelay’:
Ce que tu cherches a faire, ça s’appelle la sérialization.
Il existe plein (vraiment plein) de tutoriel la dessus.
C’est complètement *** d’utiliser ton propre format pour sérialiser tes données surtout lorsque tu n’as aucune connaissance en Java.Dans le classpath standard de Minecraft et de Forge, tu as l’API Gson qui te permet de faire simplement un fichier JSON.
Un tutoriel est disponible ici : http://www.jmdoudoux.fr/java/dej/chap-gson.htm
Merci,
Je penses tenir quelques chose dis moi:
package com.CSC.net.Commands; import java.util.HashMap; import com.CSC.net.json.TestSerialisation; import net.minecraft.client.Minecraft; import net.minecraft.command.CommandBase; import net.minecraft.command.CommandException; import net.minecraft.command.ICommandSender; import net.minecraft.entity.player.EntityPlayerMP; import net.minecraft.server.MinecraftServer; import net.minecraft.util.ChatComponentText; import net.minecraft.util.EnumChatFormatting; public class WantedaddCommand extends CommandBase{ HashMap <string, string="">array = new HashMap(); @Override public String getName() { return "add"; } @Override public String getCommandUsage(ICommandSender sender) { return "conjure <text>"; } @Override public void execute(ICommandSender sender, String[] args) throws CommandException { EntityPlayerMP entityplayermp = getPlayer(sender, args[0]); StringBuilder builder = new StringBuilder(); for (int i = 1; i < args.length; i++) builder.append(args* + " "); String reason = builder.toString(); if(sender.canUseCommand(3, "add")) { if(args.length >= 2) { sender.addChatMessage(new ChatComponentText(entityplayermp.getDisplayNameString() + "ajouter pour: " + builder)); TestSerialisation.valeurs.put(args[0], builder); } else { sender.addChatMessage(new ChatComponentText(EnumChatFormatting.RED + "Usage: /add <player><raison>")); } } else { sender.addChatMessage(new ChatComponentText(EnumChatFormatting.RED + "Vous ne pouvez pas faire cette commande!")); } } }
package com.CSC.net.json; import java.util.HashMap; import java.util.Map; import com.google.gson.Gson; import com.google.gson.GsonBuilder; public class TestSerialisation { public static Map <string, stringbuilder="">valeurs = new HashMap<string, stringbuilder="">(); public static void main(final String[] args) { final GsonBuilder builder = new GsonBuilder(); final Gson gson = builder.create(); System.out.println(valeurs); final String json = gson.toJson(valeurs); System.out.println("Resultat = " + json); } }
Je supposes qu’il faut enregistrer la classe TestSerialisation.</string,></string,></raison></player></text></string,>
-
Heu … non.
public class MesDonneesASauvegarderDansUnFichier { /** * Ta Map * A peut être une String pour le nom du joueur ou l'UUID du joueur * B peut être une String pour ce que tu as a enregister ou une liste de String */ private final Map <a, b="">map = new HashMap<a, b="">(); /** * On met en private pour que seule la fonction static load(File) puisse créer une instance de cet classe */ private MesDonneesASauvegarderDansUnFichier() { } /** * Ajoute une information a la map (appelé par la commande) */ public void add( /* params … */) { } /** * Sauvegarde la contenu de ta classe dans le fichier * @param file le fichier ou tu souhaite le sauvegarder */ public void save(File file) { final GsonBuilder builder = new GsonBuilder(); final Gson gson = builder.create(); final FileWriter writer = new FileWriter(file); gson.toJson(this, writer); writer.close(); } /** * Charge ton instance via le fichier, si celui-ci n'existe pas ou contient de erreurs, une nouvelle instance est créé * @param file * @return */ public static MesDonneesASauvegarderDansUnFichier load(File file) { final GsonBuilder builder = new GsonBuilder(); final Gson gson = builder.create(); final FileReader reader = new FileReader(file); MesDonneesASauvegarderDansUnFichier loaded = null; try { loaded = gson.fromJson(reader, MesDonneesASauvegarderDansUnFichier.class); }catch(JsonParseException e) { loaded = new MesDonneesASauvegarderDansUnFichier(); } reader.close(); } }
PS : Pour la commande, la construction de la chaine par le StringBuilder, c’est de faire le traitement après tes conditions sender.canUseCommand() et args.length, sans quoi tu fais le traitement pour rien dans le cas ou tu ne passes pas dans cette condition.</a,></a,>
-
@‘RedRelay’:
Heu … non.
public class MesDonneesASauvegarderDansUnFichier { /** * Ta Map * A peut être une String pour le nom du joueur ou l'UUID du joueur * B peut être une String pour ce que tu as a enregister ou une liste de String */ private final Map <a, b="">map = new HashMap<a, b="">(); /** * On met en private pour que seule la fonction static load(File) puisse créer une instance de cet classe */ private MesDonneesASauvegarderDansUnFichier() { } /** * Ajoute une information a la map (appelé par la commande) */ public void add( /* params … */) { } /** * Sauvegarde la contenu de ta classe dans le fichier * @param file le fichier ou tu souhaite le sauvegarder */ public void save(File file) { final GsonBuilder builder = new GsonBuilder(); final Gson gson = builder.create(); final FileWriter writer = new FileWriter(file); gson.toJson(this, writer); writer.close(); } /** * Charge ton instance via le fichier, si celui-ci n'existe pas ou contient de erreurs, une nouvelle instance est créé * @param file * @return */ public static MesDonneesASauvegarderDansUnFichier load(File file) { final GsonBuilder builder = new GsonBuilder(); final Gson gson = builder.create(); final FileReader reader = new FileReader(file); MesDonneesASauvegarderDansUnFichier loaded = null; try { loaded = gson.fromJson(reader, MesDonneesASauvegarderDansUnFichier.class); }catch(JsonParseException e) { loaded = new MesDonneesASauvegarderDansUnFichier(); } reader.close(); } }
PS : Pour la commande, la construction de la chaine par le StringBuilder, c’est de faire le traitement après tes conditions sender.canUseCommand() et args.length, sans quoi tu fais le traitement pour rien dans le cas ou tu ne passes pas dans cette condition.</a,></a,>
D’acc,
Du coup j’ai ça:
package com.CSC.net.json; import java.io.File; import java.io.FileNotFoundException; import java.io.FileReader; import java.io.FileWriter; import java.io.IOException; import java.util.HashMap; import java.util.Map; import com.CSC.net.Commands.WantedaddCommand; import com.google.gson.Gson; import com.google.gson.GsonBuilder; import com.google.gson.JsonParseException; public class MesDonneesASauvegarderDansUnFichier { /** * Ta Map * A peut être une String pour le nom du joueur ou l'UUID du joueur * B peut être une String pour ce que tu as a enregister ou une liste de String */ private final Map <string, stringbuilder="">map = new HashMap<string, stringbuilder="">(); /** * On met en private pour que seule la fonction static load(File) puisse créer une instance de cet classe */ private MesDonneesASauvegarderDansUnFichier() { } /** * Ajoute une information a la map (appelé par la commande) */ public void add(String string, StringBuilder stringbuilder) { string = WantedaddCommand.m; stringbuilder = WantedaddCommand.s; map.put(string, stringbuilder); } /** * Sauvegarde la contenu de ta classe dans le fichier * @param file le fichier ou tu souhaite le sauvegarder * @throws IOException */ public void save(File file) throws IOException { final GsonBuilder builder = new GsonBuilder(); final Gson gson = builder.create(); final FileWriter writer = new FileWriter(file); gson.toJson(this, writer); writer.close(); } /** * Charge ton instance via le fichier, si celui-ci n'existe pas ou contient de erreurs, une nouvelle instance est créé * @param file * @return * @throws IOException */ public static MesDonneesASauvegarderDansUnFichier load(File file) throws IOException { final GsonBuilder builder = new GsonBuilder(); final Gson gson = builder.create(); final FileReader reader = new FileReader(file); MesDonneesASauvegarderDansUnFichier loaded = null; try { loaded = gson.fromJson(reader, MesDonneesASauvegarderDansUnFichier.class); }catch(JsonParseException e) { loaded = new MesDonneesASauvegarderDansUnFichier(); } reader.close(); return loaded; } }
Mais j’ai un problème tu me dis que je dois appeler la fonction add quand j’execute la commande mais le problème est que add n’est pas en static du coup je fais comment ?
Commande:
package com.CSC.net.Commands; import java.util.HashMap; import com.CSC.net.json.MesDonneesASauvegarderDansUnFichier; import net.minecraft.client.Minecraft; import net.minecraft.command.CommandBase; import net.minecraft.command.CommandException; import net.minecraft.command.ICommandSender; import net.minecraft.entity.player.EntityPlayerMP; import net.minecraft.server.MinecraftServer; import net.minecraft.util.ChatComponentText; import net.minecraft.util.EnumChatFormatting; public class WantedaddCommand extends CommandBase{ public static String m; public static StringBuilder s; @Override public String getName() { return "add"; } @Override public String getCommandUsage(ICommandSender sender) { return "conjure <text>"; } @Override public void execute(ICommandSender sender, String[] args) throws CommandException { EntityPlayerMP entityplayermp = getPlayer(sender, args[0]); m = entityplayermp.getDisplayNameString(); if(sender.canUseCommand(3, "add")) { if(args.length >= 2) { StringBuilder builder = new StringBuilder(); for (int i = 1; i < args.length; i++) builder.append(args* + " "); String reason = builder.toString(); s = builder; sender.addChatMessage(new ChatComponentText(entityplayermp.getDisplayNameString() + "ajouter pour: " + builder)); MesDonneesASauvegarderDansUnFichier. // ici je fais comment ? } else { sender.addChatMessage(new ChatComponentText(EnumChatFormatting.RED + "Usage: /add <player><raison>")); } } else { sender.addChatMessage(new ChatComponentText(EnumChatFormatting.RED + "Vous ne pouvez pas faire cette commande!")); } } } ```</raison></player></text></string,></string,>
-
On ne stocke pas des StringBuilder dans ta Map.
Dans la classe principale de ton mod, tu ajoute un attribut static privé qui sera l’instance de ta classe a sauvegardé que tu aura chargé dans le preInit() via la méthode load.
Ensuite tu fais un getter static dans ta classe principale pour pour accéder a ton objet et donc a ta méthode add a partir de la commande.Dans ta commande, String m et StringBuilder s, n’ont pas lieu d’exister.
// ici je fais comment ? TaClassPrincipale.getMesDonneesASauvegarderDansUnFichier().add(…)
-
@‘RedRelay’:
On ne stocke pas des StringBuilder dans ta Map.
Dans la classe principale de ton mod, tu ajoute un attribut static privé qui sera l’instance de ta classe a sauvegardé que tu aura chargé dans le preInit() via la méthode load.
Ensuite tu fais un getter static dans ta classe principale pour pour accéder a ton objet et donc a ta méthode add a partir de la commande.Dans ta commande, String m et StringBuilder s, n’ont pas lieu d’exister.
// ici je fais comment ? TaClassPrincipale.getMesDonneesASauvegarderDansUnFichier().add(…)
Ah okkk c’est bon du coup
Mais le fichier est créer ou est s’appelle comment ?
Merci en tout cas !!!
Edit:
Ah j’ai crash car le fichier est introuvable mdr donc du coup c’est bon oublie la question j’essaye et je te dis!!
Crash quand j’execute la commande:
[18:25:52] [Client thread/INFO]: [CHAT] Cette commande a échoué suite à une erreur inconnue [18:26:56] [Server thread/ERROR]: Couldn't process command: 'add floriangabet salut c'est un test' java.lang.NullPointerException at com.CSC.net.Commands.WantedaddCommand.execute(WantedaddCommand.java:50) ~[WantedaddCommand.class:?] at net.minecraft.command.CommandHandler.tryExecute(CommandHandler.java:110) [CommandHandler.class:?] at net.minecraft.command.CommandHandler.executeCommand(CommandHandler.java:87) [CommandHandler.class:?] at net.minecraft.network.NetHandlerPlayServer.handleSlashCommand(NetHandlerPlayServer.java:853) [NetHandlerPlayServer.class:?] at net.minecraft.network.NetHandlerPlayServer.processChatMessage(NetHandlerPlayServer.java:829) [NetHandlerPlayServer.class:?] at net.minecraft.network.play.client.C01PacketChatMessage.processPacket(C01PacketChatMessage.java:44) [C01PacketChatMessage.class:?] at net.minecraft.network.play.client.C01PacketChatMessage.processPacket(C01PacketChatMessage.java:57) [C01PacketChatMessage.class:?] at net.minecraft.network.PacketThreadUtil$1.run(PacketThreadUtil.java:24) [PacketThreadUtil$1.class:?] at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:511) [?:1.8.0_45] at java.util.concurrent.FutureTask.run(FutureTask.java:266) [?:1.8.0_45] at net.minecraftforge.fml.common.FMLCommonHandler.callFuture(FMLCommonHandler.java:709) [FMLCommonHandler.class:?] at net.minecraft.server.MinecraftServer.updateTimeLightAndEntities(MinecraftServer.java:726) [MinecraftServer.class:?] at net.minecraft.server.MinecraftServer.tick(MinecraftServer.java:669) [MinecraftServer.class:?] at net.minecraft.server.integrated.IntegratedServer.tick(IntegratedServer.java:171) [IntegratedServer.class:?] at net.minecraft.server.MinecraftServer.run(MinecraftServer.java:540) [MinecraftServer.class:?] at java.lang.Thread.run(Thread.java:745) [?:1.8.0_45] [18:26:56] [Client thread/INFO]: [CHAT] floriangabetajouter pour: salut c'est un test [18:26:56] [Client thread/INFO]: [CHAT] Cette commande a échoué suite à une erreur inconnue
J’ai du mal comprendre pour le getter j’ai fais ça:
public static MesDonneesASauvegarderDansUnFichier getter;
-
La c’est du Java de base, il faut sérieusement que tu t’y mette avant de continuer ton mod.
Les tutoriels de JM Doudoux sont très complet, fait au moins la partis 1 et 2 avant de commencer à modder : http://www.jmdoudoux.fr/accueil_java.htmpublic class TaClassPrincipale { private static MesDonneesASauvegarderDansUnFichier donnees; public void onPreInit(FMLPreInitializationEvent evt) { donnes = MesDonneesASauvegarderDansUnFichier.load(new File("path/vers/ou/tu/veux/ecrire/les/donnees/sur/le/disque")); } public static MesDonneesASauvegarderDansUnFichier getDonnees() { return donnees; } }
-
@‘RedRelay’:
La c’est du Java de base, il faut sérieusement que tu t’y mette avant de continuer ton mod.
Les tutoriels de JM Doudoux sont très complet, fait au moins la partis 1 et 2 avant de commencer à modder : http://www.jmdoudoux.fr/accueil_java.htmpublic class TaClassPrincipale { private static MesDonneesASauvegarderDansUnFichier donnees; public void onPreInit(FMLPreInitializationEvent evt) { donnes = MesDonneesASauvegarderDansUnFichier.load(new File("path/vers/ou/tu/veux/ecrire/les/donnees/sur/le/disque")); } public static MesDonneesASauvegarderDansUnFichier getDonnees() { return donnees; } }
J’avais pas bien compris…
Pour le new File je fais un event.getSuggestedConfigurationFile Comme ça il se retrouve dans le fichier config.
Sinon j’ai toujours le crash…
[18:5
5:37] [Server thread/ERROR]: Couldn't process command: 'add floriangabet salut c un test' java.lang.NullPointerException at com.CSC.net.Commands.WantedaddCommand.execute(WantedaddCommand.java:45) ~[WantedaddCommand.class:?] at net.minecraft.command.CommandHandler.tryExecute(CommandHandler.java:110) [CommandHandler.class:?] at net.minecraft.command.CommandHandler.executeCommand(CommandHandler.java:87) [CommandHandler.class:?] at net.minecraft.network.NetHandlerPlayServer.handleSlashCommand(NetHandlerPlayServer.java:853) [NetHandlerPlayServer.class:?] at net.minecraft.network.NetHandlerPlayServer.processChatMessage(NetHandlerPlayServer.java:829) [NetHandlerPlayServer.class:?] at net.minecraft.network.play.client.C01PacketChatMessage.processPacket(C01PacketChatMessage.java:44) [C01PacketChatMessage.class:?] at net.minecraft.network.play.client.C01PacketChatMessage.processPacket(C01PacketChatMessage.java:57) [C01PacketChatMessage.class:?] at net.minecraft.network.PacketThreadUtil$1.run(PacketThreadUtil.java:24) [PacketThreadUtil$1.class:?] at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:511) [?:1.8.0_45] at java.util.concurrent.FutureTask.run(FutureTask.java:266) [?:1.8.0_45] at net.minecraftforge.fml.common.FMLCommonHandler.callFuture(FMLCommonHandler.java:709) [FMLCommonHandler.class:?] at net.minecraft.server.MinecraftServer.updateTimeLightAndEntities(MinecraftServer.java:726) [MinecraftServer.class:?] at net.minecraft.server.MinecraftServer.tick(MinecraftServer.java:669) [MinecraftServer.class:?] at net.minecraft.server.integrated.IntegratedServer.tick(IntegratedServer.java:171) [IntegratedServer.class:?] at net.minecraft.server.MinecraftServer.run(MinecraftServer.java:540) [MinecraftServer.class:?] at java.lang.Thread.run(Thread.java:745) [?:1.8.0_45] [18:55:37] [Client thread/INFO]: [CHAT] floriangabetajouter pour: salut c un test [18:55:37] [Client thread/INFO]: [CHAT] Cette commande a échoué suite à une erreur inconnue
ligne 45 pointe ici:
Main.getDonnees().add(args[0], reason);