-
Quand tu tapes une commande, l’exécution se fait sur le serveur.
Donc pour ce cas, il faut que tu appels la fonction sql directement dans la fonction exécute de ta commande puis que tu envoies la réponse par paquet. -
J’obtiens cette erreur :
[21:19:19] [main/INFO] [minecraft/GuiNewChat]: [CHAT] Cette commande a échoué suite à une erreur inconnueCommande :
public class SimpleCommand extends CommandBase { @Override public String getName() { return "getplayerdata"; } @Override public String getUsage(ICommandSender sender) { return null; } @Override public boolean checkPermission(MinecraftServer server, ICommandSender sender) { return true; } @Override public void execute(MinecraftServer server, ICommandSender sender, String[] args) throws CommandException { if(sender instanceof EntityPlayer) { SQLDatabase.getValue("users", "grade", "" + Minecraft.getMinecraft().player.getDisplayNameString(), "pseudo"); } } } -
Rien d’autre dans la console ?
Si oui, mets l’appel de ta fonction getValue dans un try catch et log l’exception. -
Effectivement, l’erreur contient ceci également :
[21:59:00] [Server thread/WARN] [minecraft/CommandHandler]: Couldn't process command: getplayerdata java.lang.NoClassDefFoundError: net/minecraft/client/Minecraft at fr.minewarfare.commands.SimpleCommand.execute(SimpleCommand.java:35) ~[SimpleCommand.class:?] at net.minecraft.command.CommandHandler.tryExecute(CommandHandler.java:126) [CommandHandler.class:?] at net.minecraft.command.CommandHandler.executeCommand(CommandHandler.java:98) [CommandHandler.class:?] at net.minecraft.network.NetHandlerPlayServer.handleSlashCommand(NetHandlerPlayServer.java:1003) [NetHandlerPlayServer.class:?] at net.minecraft.network.NetHandlerPlayServer.processChatMessage(NetHandlerPlayServer.java:979) [NetHandlerPlayServer.class:?] at net.minecraft.network.play.client.CPacketChatMessage.processPacket(CPacketChatMessage.java:47) [CPacketChatMessage.class:?] at net.minecraft.network.play.client.CPacketChatMessage.processPacket(CPacketChatMessage.java:8) [CPacketChatMessage.class:?] at net.minecraft.network.PacketThreadUtil$1.run(PacketThreadUtil.java:21) [PacketThreadUtil$1.class:?] at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:511) [?:1.8.0_201] at java.util.concurrent.FutureTask.run$$$capture(FutureTask.java:266) [?:1.8.0_201] at java.util.concurrent.FutureTask.run(FutureTask.java) [?:1.8.0_201] at net.minecraft.util.Util.runTask(Util.java:53) [Util.class:?] at net.minecraft.server.MinecraftServer.updateTimeLightAndEntities(MinecraftServer.java:798) [MinecraftServer.class:?] at net.minecraft.server.dedicated.DedicatedServer.updateTimeLightAndEntities(DedicatedServer.java:415) [DedicatedServer.class:?] at net.minecraft.server.MinecraftServer.tick(MinecraftServer.java:743) [MinecraftServer.class:?] at net.minecraft.server.MinecraftServer.run(MinecraftServer.java:592) [MinecraftServer.class:?] at java.lang.Thread.run(Thread.java:748) [?:1.8.0_201] Caused by: java.lang.ClassNotFoundException: net.minecraft.client.Minecraft at net.minecraft.launchwrapper.LaunchClassLoader.findClass(LaunchClassLoader.java:191) ~[launchwrapper-1.12.jar:?] at java.lang.ClassLoader.loadClass(ClassLoader.java:424) ~[?:1.8.0_201] at java.lang.ClassLoader.loadClass(ClassLoader.java:357) ~[?:1.8.0_201] ... 17 more Caused by: net.minecraftforge.fml.common.asm.ASMTransformerWrapper$TransformerException: Exception in class transformer net.minecraftforge.fml.common.asm.transformers.SideTransformer@59bbb974 from coremod FMLCorePlugin at net.minecraftforge.fml.common.asm.ASMTransformerWrapper$TransformerWrapper.transform(ASMTransformerWrapper.java:260) ~[forgeSrc-1.12.2-14.23.5.2768.jar:?] at net.minecraft.launchwrapper.LaunchClassLoader.runTransformers(LaunchClassLoader.java:279) ~[launchwrapper-1.12.jar:?] at net.minecraft.launchwrapper.LaunchClassLoader.findClass(LaunchClassLoader.java:176) ~[launchwrapper-1.12.jar:?] at java.lang.ClassLoader.loadClass(ClassLoader.java:424) ~[?:1.8.0_201] at java.lang.ClassLoader.loadClass(ClassLoader.java:357) ~[?:1.8.0_201] ... 17 more Caused by: java.lang.RuntimeException: Attempted to load class net/minecraft/client/Minecraft for invalid side SERVER at net.minecraftforge.fml.common.asm.transformers.SideTransformer.transform(SideTransformer.java:62) ~[forgeSrc-1.12.2-14.23.5.2768.jar:?] at net.minecraftforge.fml.common.asm.ASMTransformerWrapper$TransformerWrapper.transform(ASMTransformerWrapper.java:256) ~[forgeSrc-1.12.2-14.23.5.2768.jar:?] at net.minecraft.launchwrapper.LaunchClassLoader.runTransformers(LaunchClassLoader.java:279) ~[launchwrapper-1.12.jar:?] at net.minecraft.launchwrapper.LaunchClassLoader.findClass(LaunchClassLoader.java:176) ~[launchwrapper-1.12.jar:?] at java.lang.ClassLoader.loadClass(ClassLoader.java:424) ~[?:1.8.0_201] at java.lang.ClassLoader.loadClass(ClassLoader.java:357) ~[?:1.8.0_201] ... 17 more -
Ah oui, c’est à cause du
Minecraft.getMinecraft().playerdans ta fonction execute. Il n’est pas possible d’utiliser la classe Minecraft côté serveur.
Et dans ton cas il suffit de faire(EntityPlayer)senderpour récupérer le joueur qui a exécuté la commande. -
C’est bon, j’ai une autre erreur maintenant, ça doit venir du (EntityPlayer)sender, ça doit fausser la requête SQL.
J’ai essayé avec (EntityPlayer)sender.getDisplayName() ça ne fonctionne pas non plus (ça correspond au stringRecover)[22:18:24] [Server thread/INFO] [STDOUT]: [fr.minewarfare.SQLDatabase:getValue:26]: Successfully connected to database [22:18:24] [Server thread/INFO] [STDOUT]: [fr.minewarfare.SQLDatabase:getValue:42]: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'Cobra45'/200, l='world', x=259,30, y=76,00, z=-114,15]'' at line 1public static void getValue(String table, String sectionRecover, String stringRecover, String recoverSection) { String returnString = null; try { Connection con = DriverManager.getConnection(urlbase + host + "/" + database, user, pass); System.out.println("Successfully connected to database"); Statement q = con.createStatement(); String sql = "SELECT * FROM " + table + " WHERE " + recoverSection + " = '" + stringRecover + "'"; ResultSet rs = q.executeQuery(sql); while (rs.next()) { returnString = rs.getString(sectionRecover); } q.close(); con.close(); Main.network.sendToServer(new PacketSQLGetResult(returnString)); } catch (SQLException err) { System.out.println(err.getMessage()); } } -
C’est comme ça la bonne syntaxe pour appeler une fonction d’une variable cast :
((EntityPlayer)sender).getDisplayName()Ou alors :
EntityPlayer player = (EntityPlayer)sender; player.getDisplayName() -
Toujours une erreur avec les deux. Elle semble juste un peu différente sur la fin
[23:03:13] [Server thread/INFO] [STDOUT]: [fr.minewarfare.SQLDatabase:getValue:42]: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'Cobra45', siblings=[], style=Style{hasParent=true, color=null, bold=null, itali' at line 1@Override public void execute(MinecraftServer server, ICommandSender sender, String[] args) throws CommandException { if(sender instanceof EntityPlayer) { SQLDatabase.getValue("users", "grade", "" + ((EntityPlayer)sender).getDisplayName(), "pseudo"); } }@Override public void execute(MinecraftServer server, ICommandSender sender, String[] args) throws CommandException { if(sender instanceof EntityPlayer) { EntityPlayer player = (EntityPlayer)sender; SQLDatabase.getValue("users", "grade", "" + player.getDisplayName(), "pseudo"); } } -
getDisplayName ne renvois pas un string mais un
ITextComponent.
Il faut utiliserplayer.getGameProfile().getName()pour avoir le nom du joueur en string (et il serait mieux de gérer les données utilisateurs en fonction du UUID, sinon en cas de changement de pseudo tu vas avoir des problèmes). -
Tout fonctionne, merci.