Résolu [1.12] Obtenir chemin dossier resources pour JavaIO
-
Salut,
Mon problème arrive que quand j’essaye de récupérer tous ce qu’il y a dans mon dossier resources/assets/lifegui/jsonstats.
Car cette fois je ne veux pas l’utiliser pour créer des textures de blocs, item etc. mais je veux juste l’utilisera afin de faire des bases de données au joueur donc j’ai essayé de récupérer la liste afin que quand le joueur se connecte cela vérifie s’il possède déjà un Json.
Code:
package fr.silvertaurus.PlayerStats; import fr.silvertaurus.utils.Reference; import net.minecraft.util.ResourceLocation; import net.minecraftforge.event.entity.EntityJoinWorldEvent; import net.minecraftforge.fml.common.eventhandler.SubscribeEvent; import java.io.File; import java.util.ArrayList; public class CreateJsonPlayerStats { @SubscribeEvent public void CreateJsonStats(EntityJoinWorldEvent e) { ResourceLocation path = new ResourceLocation(Reference.MOD_ID, "JsonStats/"); File Repertoire = new File(path.getResourcePath()); File[] files = Repertoire.listFiles(); for(int a = 0; a < files.length; a++) { System.out.println(files.toString()); } } }
Mais mon jeux crash
Erreur:[20:11:49] [Client thread/INFO] [STDOUT]: [net.minecraft.init.Bootstrap:printToSYSOUT:629]: ---- Minecraft Crash Report ---- // Ooh. Shiny. Time: 12/27/18 8:11 PM Description: Exception in server tick loop java.lang.NullPointerException: Exception in server tick loop at fr.silvertaurus.PlayerStats.CreateJsonPlayerStats.CreateJsonStats(CreateJsonPlayerStats.java:20) at net.minecraftforge.fml.common.eventhandler.ASMEventHandler_4_CreateJsonPlayerStats_CreateJsonStats_EntityJoinWorldEvent.invoke(.dynamic) at net.minecraftforge.fml.common.eventhandler.ASMEventHandler.invoke(ASMEventHandler.java:90) at net.minecraftforge.fml.common.eventhandler.EventBus.post(EventBus.java:182) at net.minecraft.world.WorldServer.loadEntities(WorldServer.java:1128) at net.minecraft.world.chunk.Chunk.onLoad(Chunk.java:920) at net.minecraftforge.common.chunkio.ChunkIOProvider.syncCallback(ChunkIOProvider.java:109) at net.minecraftforge.common.chunkio.ChunkIOExecutor.syncChunkLoad(ChunkIOExecutor.java:94) at net.minecraft.world.gen.ChunkProviderServer.loadChunk(ChunkProviderServer.java:130) at net.minecraft.world.gen.ChunkProviderServer.loadChunk(ChunkProviderServer.java:101) at net.minecraft.world.gen.ChunkProviderServer.provideChunk(ChunkProviderServer.java:147) at net.minecraft.server.MinecraftServer.initialWorldChunkLoad(MinecraftServer.java:383) at net.minecraft.server.integrated.IntegratedServer.loadAllWorlds(IntegratedServer.java:143) at net.minecraft.server.integrated.IntegratedServer.init(IntegratedServer.java:160) at net.minecraft.server.MinecraftServer.run(MinecraftServer.java:552) at java.lang.Thread.run(Thread.java:748) A detailed walkthrough of the error, its code path and all known details is as follows: --------------------------------------------------------------------------------------- -- System Details -- Details: Minecraft Version: 1.12.2 Operating System: Windows 7 (amd64) version 6.1 Java Version: 1.8.0_191, Oracle Corporation Java VM Version: Java HotSpot(TM) 64-Bit Server VM (mixed mode), Oracle Corporation Memory: 237976328 bytes (226 MB) / 638058496 bytes (608 MB) up to 1428160512 bytes (1362 MB) JVM Flags: 0 total; IntCache: cache: 0, tcache: 0, allocated: 0, tallocated: 0 FML: MCP 9.42 Powered by Forge 14.23.5.2796 5 mods loaded, 5 mods active States: 'U' = Unloaded 'L' = Loaded 'C' = Constructed 'H' = Pre-initialized 'I' = Initialized 'J' = Post-initialized 'A' = Available 'D' = Disabled 'E' = Errored | State | ID | Version | Source | Signature | |:------ |:--------- |:------------ |:----------------------------------------------------- |:--------- | | LCHIJA | minecraft | 1.12.2 | minecraft.jar | None | | LCHIJA | mcp | 9.42 | minecraft.jar | None | | LCHIJA | FML | 8.0.99.99 | forgeSrc-1.12.2-14.23.5.2796.jar | None | | LCHIJA | forge | 14.23.5.2796 | forgeSrc-1.12.2-14.23.5.2796.jar | None | | LCHIJA | lifegui | 1.0.0 | com.yourname.modid.forge-1.12.2-14.23.5.2796-mdk.main | None | Loaded coremods (and transformers): GL info: ~~ERROR~~ RuntimeException: No OpenGL context found in the current thread. Profiler Position: N/A (disabled) Player Count: 0 / 8; [] Type: Integrated Server (map_client.txt) Is Modded: Definitely; Client brand changed to 'fml,forge' [20:11:49] [Client thread/INFO] [STDOUT]: [net.minecraft.init.Bootstrap:printToSYSOUT:629]: #@!@# Game crashed! Crash report saved to: #@!@# .\crash-reports\crash-2018-12-27_20.11.48-server.txt AL lib: (EE) alc_cleanup: 1 device not closed Process finished with exit code -1
Après si jamais vous avez une meilleure méthode pour faire ce que je veux, ce serait sympa si vous pourriez me la donner ^^Merci de votre compréhension
-
t’as juste a créer un fichier et a écrire dedans…
puis si il existe alors tu le lis sinon tu en créer unFile f = new File("./json_stats.json"); // The file will be located into minecraft root directory ('.minecraft/json_stats.json') or server root directory (the directory that contains your minecraft server jar file) if (f.exists()) { // Read file... } else { // Create default empty file or other things }
-
yo, deja sache que tu ne peux pas ecrire dans un fichier se trouvant dans un jar ou meme en creer
public void CreateJsonStats(EntityJoinWorldEvent e)
et les noms de fonctions prennent pas de majuscules
un jar c’est comme une archive ZIP c’est un fichier pas un répertoire donc tu ne peux pas récupérer comme ca contenun pour le stockage utilise directement un fichier situé en dehors de ton jar (genre dans le dossier config de minecraft par exemple ou alors ailleurs, ca c’est comme tu veux apres)
-
Hey merci de ton aide j’aimerais savoir si tu avais un exemple de code ??
-
t’as juste a créer un fichier et a écrire dedans…
puis si il existe alors tu le lis sinon tu en créer unFile f = new File("./json_stats.json"); // The file will be located into minecraft root directory ('.minecraft/json_stats.json') or server root directory (the directory that contains your minecraft server jar file) if (f.exists()) { // Read file... } else { // Create default empty file or other things }
-
Merci de t’es réponse ainsi que du bout de code afin de m’orienter ^^
-
Pour la solutin voici mon code afin de vérifier si cela fonctionne correctement
package fr.silvertaurus.PlayerStats; import net.minecraft.client.Minecraft; import net.minecraftforge.event.entity.EntityJoinWorldEvent; import net.minecraftforge.fml.common.eventhandler.SubscribeEvent; import java.io.*; public class CreateJsonPlayerStats { File f = new File("./Test.json"); @SubscribeEvent public void CreateJsonStats(EntityJoinWorldEvent e) throws IOException { if(e.getEntity().equals(Minecraft.getMinecraft().player)) { if (f.exists()) { System.out.println("Le fichier "+f.getName()+" existe déjà !"); System.out.println("Chemin d'accès : "+f.getPath()); return; } else { System.out.println("Le fichier "+f.getName()+" n'existe pas !" ); System.out.println("Création du fichier ..." ); f.createNewFile(); ///!\ Ceci sera à supprimer cela permet de bien vérifier les étapes si la création du fichier vide ///!\ est un succès après vous le remplissez à la suite du f.createNewFile(); if(f.exists()) { System.out.println("Création du fichier réussie !" ); System.out.println("Chemin d'accès : "+f.getPath()); return; } else { System.out.println("Création du fichier échouer !" ); return; } } } } }
-
attention ton code fonctionnera pas coté server ca va faire crash le server, il faut que ton event doit enregistrer client only ! si ce n’est pas deja fait
Minecraft etant une class Client le serveur ne la possede donc pas
et je vois pas l’interet du check de l’entity c’est useless etandonné que cet event est appelé pour chaque joueur venant de rejoindre le monde
deplus les noms de method/fonction ne commence jamais par un maj en java
public void CreateJsonStats(EntityJoinWorldEvent e)
=> Java Code Convention <=
et aussi a quoi sert ton systeme tu veux stocké quoi en fait ?
-
Salut j’aimerais faire un system de leveling avec des statistiques, genre force, Vitesse minage, Armur, Agiliter etc. Mais là je n’arrive pas a Créer, lire, Modifier un json, dans mon développement d’applications j’utiliser [javax] mais là quand j’essaye avec il n’y a pas [javax] donc pourrais-tu m’aider si jamais tu as un <snipet> de méthode pour l’utilisation de JSON ?
Ps: pour l’enregistrement de mes évenements j’utilise MinecraftForge
L’alternative trouver :
package fr.silvertaurus.PlayerStats; import com.google.gson.JsonObject; import net.minecraft.client.Minecraft; import net.minecraft.entity.player.EntityPlayer; import net.minecraftforge.event.entity.EntityJoinWorldEvent; import net.minecraftforge.fml.common.eventhandler.SubscribeEvent; import java.io.*; import java.util.ArrayList; public class CreateJsonPlayerStats { @SubscribeEvent public void CreateJsonStats(EntityJoinWorldEvent e) throws IOException { if(e.getEntity().equals(Minecraft.getMinecraft().player)) { EntityPlayer p = Minecraft.getMinecraft().player; File folder = new File("./JsonStats"); if(folder.exists()) { File[] listFile = folder.listFiles(); ArrayList<String> filePlayer = new ArrayList<>(); for(File f : listFile) { filePlayer.add(f.getName()); } if(filePlayer.contains(p.getUniqueID()+".json")) { System.out.println("Un fichier pour ce joueur éxiste déjà !"); } else { this.CreateJson(p, p.getUniqueID().toString()); } } else { folder.mkdir(); this.CreateJson(p, p.getUniqueID().toString()); System.out.println("Création du fichier de stats du joueur "+p.getName()); } } } public void CreateJson(EntityPlayer p, String fileName) throws IOException { File f = new File("./JsonStats/"+fileName+".json"); String jsonFilePath = f.getPath(); JsonObject json = new JsonObject(); json.addProperty("PlayerName", p.getName()); json.addProperty("Level", "0"); json.addProperty("Experience", "0"); FileWriter file = new FileWriter(jsonFilePath); file.write(String.valueOf(json)); file.close(); } }
Normalement j’aurais du faire cela si le [javax] fonctionne
public void CreateJson(String fileName) throws IOException { File f = new File("./JsonStats/"+fileName+".json"); String jsonFilePath = f.getPath(); JsonObject json = new JsonObject(); json.put("level", 0); try(FileWriter file = new FileWriter(jsonFilePath)) { file.write(Jsoner.prettyPrint(json.toJson())); file.flush(); } }
@SpyMan a dit dans [1.12] Obtenir chemin dossier resources pour JavaIO :
attention ton code fonctionnera pas coté server ca va faire crash le server, il faut que ton event doit enregistrer client only ! si ce n’est pas deja fait
Minecraft etant une class Client le serveur ne la possede donc pas
et je vois pas l’interet du check de l’entity c’est useless etandonné que cet event est appelé pour chaque joueur venant de rejoindre le monde
deplus les noms de method/fonction ne commence jamais par un maj en java
public void CreateJsonStats(EntityJoinWorldEvent e)
=> Java Code Convention <=
et aussi a quoi sert ton systeme tu veux stocké quoi en fait ?
-
deja si c’est juste pour stocké quelques valeurs comme ca autant utiliser les properties de java…
et en plus tu a fait n’importe quoi, c’est pas comme ca que l’on utiliser la lib GSON
de plus je comprends pas pourquoi tu me parle de Javax…
pour utiliser GSON : http://www.javacreed.com/simple-gson-example/et les noms de methods/fonctions en java commence par une minuscule ainsi que les noms de variable
Je t’invite a lire la Java Code Convention afin de normaliser ton code
=> https://www.oracle.com/technetwork/java/codeconventions-150003.pdf <= -
Merci de t’es explication, c’est se que j’avais remarquer quand je JSO N Object, cela utiliser la librairie Gson et je l’apprend.
-
Voici ma solution après l’apprentissage de Gson:
package fr.silvertaurus; import fr.silvertaurus.GuiClient.GuiLife; import fr.silvertaurus.PlayerStats.CreateJsonPlayerStats; import fr.silvertaurus.proxy.CommonProxy; import fr.silvertaurus.utils.PlayerStatsSerialisationManager; import fr.silvertaurus.utils.Reference; import net.minecraftforge.common.MinecraftForge; import net.minecraftforge.fml.common.Mod; import net.minecraftforge.fml.common.SidedProxy; import net.minecraftforge.fml.common.event.FMLInitializationEvent; import net.minecraftforge.fml.common.event.FMLPostInitializationEvent; import net.minecraftforge.fml.common.event.FMLPreInitializationEvent; @Mod(modid = Reference.MOD_ID, name = Reference.MOD_NAME, version = Reference.MOD_VERSION) public class Main { @Mod.Instance(Reference.MOD_ID) public static Main instance; @SidedProxy(clientSide = Reference.CLIENT_PROXY, serverSide = Reference.SERVEUR_PROXY) public static CommonProxy proxy; private PlayerStatsSerialisationManager playerStatsSerialisation; public Main() { this.playerStatsSerialisation = new PlayerStatsSerialisationManager(); MinecraftForge.EVENT_BUS.register(new CreateJsonPlayerStats()); MinecraftForge.EVENT_BUS.register(new GuiLife()); } @Mod.EventHandler public void preInit(FMLPreInitializationEvent e) { proxy.preInit(); } @Mod.EventHandler public void Init(FMLInitializationEvent e) { proxy.init(); } @Mod.EventHandler public void postInit(FMLPostInitializationEvent e) { proxy.postInit(); } public PlayerStatsSerialisationManager getPlayerStatsSerialisation() { return playerStatsSerialisation; } }
package fr.silvertaurus.utils; import net.minecraft.client.Minecraft; public class PlayerStatsJson { private String playerName; private int level; private int experience; public PlayerStatsJson(String playerName, int level, int experience) { this.playerName = playerName; this.level = level; this.experience = experience; } public int getExperience() { return experience; } public String getPlayerName() { return playerName; } public int getLevel() { return level; } }
package fr.silvertaurus.PlayerStats; import com.google.gson.JsonObject; import fr.silvertaurus.Main; import fr.silvertaurus.utils.JsonFileManager; import fr.silvertaurus.utils.PlayerStatsJson; import fr.silvertaurus.utils.PlayerStatsSerialisationManager; import net.minecraft.client.Minecraft; import net.minecraft.entity.player.EntityPlayer; import net.minecraftforge.event.entity.EntityJoinWorldEvent; import net.minecraftforge.fml.common.eventhandler.SubscribeEvent; import java.io.*; public class CreateJsonPlayerStats { @SubscribeEvent public void onPlayerJoinEvent(EntityJoinWorldEvent e) throws IOException { if(e.getEntity() instanceof EntityPlayer) { File file = new File("./LifeGui/JsonPlayer/"+e.getEntity().getUniqueID()+".json"); PlayerStatsSerialisationManager playerStatsSerialisationManager = Main.instance.getPlayerStatsSerialisation(); if(file.exists()) { String json = JsonFileManager.loadFile(file); PlayerStatsJson playerStatsJson = playerStatsSerialisationManager.deserialise(json); } else { PlayerStatsJson playerStatsJson = new PlayerStatsJson(e.getEntity().getName(), 0, 0); String json = playerStatsSerialisationManager.serialise(playerStatsJson); JsonFileManager.saveFile(file, json); } } } }
package fr.silvertaurus.utils; import com.google.gson.Gson; import com.google.gson.GsonBuilder; public class PlayerStatsSerialisationManager { private Gson gson; public PlayerStatsSerialisationManager() { this.gson = new Gson(); } private Gson GsonCreateInstance() { return new GsonBuilder() .setPrettyPrinting() .serializeNulls() .disableHtmlEscaping() .create(); } public String serialise(PlayerStatsJson playerStatsJson) { return this.gson.toJson(playerStatsJson); } public PlayerStatsJson deserialise(String json) { return this.gson.fromJson(json, PlayerStatsJson.class); } }
package fr.silvertaurus.utils; import com.google.gson.JsonObject; import java.io.*; public class JsonFileManager { public static void createFile(File file) throws IOException { if(!file.exists()) { file.getParentFile().mkdirs(); file.createNewFile(); return; } } public static void saveFile(File file, String text) throws IOException { final FileWriter fw; createFile(file); fw = new FileWriter(file); fw.write(text); fw.flush(); fw.close(); } public static String loadFile(File file) throws IOException { if(file.exists()) { final BufferedReader bufferedReader = new BufferedReader(new FileReader(file)); final StringBuilder text = new StringBuilder(); String line; while((line = bufferedReader.readLine()) != null) { text.append(line); } bufferedReader.close(); return text.toString(); } return ""; } }
-
mouais c’est pas encore ca…
sinon Gson#fromJson pour recupérer un instance d’un PlayerStats a partir d’un fichier
et Gson#toJson pour convertir l’instance de class en text json que tu peux apres stocker dans un fichier