Mod Résolu [MOD Forge] Interface Graphique - Problème avec la classe "GuiScreen"

Americium

Aventurier
7 Février 2020
13
2
3
28
Bonjour !

Je vous écris aujourd'hui pour vous demander de l'aide sur l'un de mes projets actuels.
Je suis entrain de réaliser une interface graphique à l'aide de la classe GuiScreen.
Pour commencer j'ai téléchargé le mdk de forge sur le site officiel en version 1.10.2.

J'ai fait toutes les configurations requises pour préparer le dossier comme "gradlew setupDecompWorkspace".
Donc à partir de là j'ai commencé à suivre un tutoriel pour créer mon interface graphique en faisant du simple copier/coller en modifiant juste le nom de ma classe.
J'ai fait quelques modifications d'autres fichiers tels que Minecraft.java & KeyBinding.Java & GameSettings.java.

Comme vous vous en doutez ma classe hérite bien de GuiScreen. Lorsque je compile mon projet je n'ai pas de problème mais lorsque je démarre mon serveur avec forge, j'ai le problème suivant :
Code:
net.minecraftforge.fml.common.LoaderExceptionModCrash: Caught exception from AmPutationMods (AmPutationMods)
Caused by: java.lang.ClassNotFoundException: fr.Americium.AmPutationService.AmPutationMods
    at net.minecraft.launchwrapper.LaunchClassLoader.findClass(LaunchClassLoader.java:191)
    at java.lang.ClassLoader.loadClass(Unknown Source)
    at java.lang.ClassLoader.loadClass(Unknown Source)
    at net.minecraftforge.fml.common.ModClassLoader.loadClass(ModClassLoader.java:75)
    at java.lang.Class.forName0(Native Method)
    at java.lang.Class.forName(Unknown Source)
    at net.minecraftforge.fml.common.FMLModContainer.constructMod(FMLModContainer.java:521)
    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.EventSubscriber.handleEvent(EventSubscriber.java:74)
    at com.google.common.eventbus.SynchronizedEventSubscriber.handleEvent(SynchronizedEventSubscriber.java:47)
    at com.google.common.eventbus.EventBus.dispatch(EventBus.java:322)
    at com.google.common.eventbus.EventBus.dispatchQueuedEvents(EventBus.java:304)
    at com.google.common.eventbus.EventBus.post(EventBus.java:275)
    at net.minecraftforge.fml.common.LoadController.sendEventToModContainer(LoadController.java:243)
    at net.minecraftforge.fml.common.LoadController.propogateStateMessage(LoadController.java:221)
    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.EventSubscriber.handleEvent(EventSubscriber.java:74)
    at com.google.common.eventbus.SynchronizedEventSubscriber.handleEvent(SynchronizedEventSubscriber.java:47)
    at com.google.common.eventbus.EventBus.dispatch(EventBus.java:322)
    at com.google.common.eventbus.EventBus.dispatchQueuedEvents(EventBus.java:304)
    at com.google.common.eventbus.EventBus.post(EventBus.java:275)
    at net.minecraftforge.fml.common.LoadController.distributeStateMessage(LoadController.java:145)
    at net.minecraftforge.fml.common.Loader.loadMods(Loader.java:559)
    at net.minecraftforge.fml.server.FMLServerHandler.beginServerLoading(FMLServerHandler.java:98)
    at net.minecraftforge.fml.common.FMLCommonHandler.onServerStart(FMLCommonHandler.java:328)
    at net.minecraft.server.dedicated.DedicatedServer.func_71197_b(DedicatedServer.java:121)
    at net.minecraft.server.MinecraftServer.run(MinecraftServer.java:431)
    at java.lang.Thread.run(Unknown Source)
Caused by: java.lang.NoClassDefFoundError: net/minecraft/client/gui/GuiScreen
    at java.lang.ClassLoader.defineClass1(Native Method)
    at java.lang.ClassLoader.defineClass(Unknown Source)
    at java.security.SecureClassLoader.defineClass(Unknown Source)
    at net.minecraft.launchwrapper.LaunchClassLoader.findClass(LaunchClassLoader.java:182)
    ... 33 more
Caused by: java.lang.ClassNotFoundException: net.minecraft.client.gui.GuiScreen
    at net.minecraft.launchwrapper.LaunchClassLoader.findClass(LaunchClassLoader.java:101)
    at java.lang.ClassLoader.loadClass(Unknown Source)
    at java.lang.ClassLoader.loadClass(Unknown Source)
    ... 37 more

En soit avec les logs j'ai compris d'où venait l'erreur. Le mod n'arrive pas à trouver la classe "GuiScreen". Mais la question que je me pose c'est pourquoi il ne trouve pas la classe "GuiScreen".
J'ai essayé de regarder dans les dossiers du projet et j'ai bien la classe java et la classe compilée. Donc je ne comprends pas pourquoi il ne la trouve pas !

Pour information supplémentaire :
J'ai modifié le build path pour ajouter le dossier "Source"à la compilation vue que je modifiais certains fichiers.

Merci de votre aide !
Cordialement,
Americium.
 

Detobel36

Créateur de plugins (PhoenixRebirth)
Support
17 Août 2012
10 530
24
2 247
347
27
Bruxelles - Belgique
www.phoenix-rebirth.fr
Salut,

Wait wait...
La class "GuiScreen" se trouve du côté "client". Pourquoi vouloir le mettre sur le serveur ?

Le mod doit ouvrir la fenêtre sur le client. Le serveur il s'en fiche de cette information...


Cordialement,
Detobel36
 

Americium

Aventurier
7 Février 2020
13
2
3
28
D'accord je comprends un peu mieux ...
Il y a pas un moyen pour le mettre côté serveur ? En soit ce que je veux c'est que le client puisse ouvrir l'IHM sur mon serveur. Du fait que l'IHM sera relié à un plugin spécifique de mon serveur.
Parce que si je me trompe pas, le mod client peut être utilisé sur tous les serveurs.
 

Detobel36

Créateur de plugins (PhoenixRebirth)
Support
17 Août 2012
10 530
24
2 247
347
27
Bruxelles - Belgique
www.phoenix-rebirth.fr
Salut,

Attend, je ne suis pas sûr de comprendre. Je ne sais pas ce qu'est "IHM" déjà :/

Mais reprenons depuis le début (pour reprendre la phrase de max bird), un mod est de base installé sur le client. On installe des mods du côté serveur juste pour qu'ils soient "compatibles".
En gros, le mod gère de l'affichage. Il n'y a d'utilité d'avoir un mod sur un serveur qu pour modifier les informations qui sont envoyé du serveur au client. Donc les potentiels nouveaux blocks/item mais également les déplacement.
Si tu fais un mod qui affiche les statistiques du joueurs, le serveur doit envoyer les statistiques et le client les affiches. Donc le mod côté serveur va juste envoyer des chiffres qui seront après afficher d'une certaine manière par le mod (sur le client). Le jour où tu veux changer l'affichage, il n'y a rien a faire côté serveur.

Pour que ça marche, il faut que tous les joueurs ai le mod. Ils ne peuvent pas voir quelque chose qu'il n'ont pas...

Ici j'ai décrit l'envoie d'information via un mod, c'est également possible (en partie) de le faire via plugin. Envoyer des statistiques ça peut être un plugin. Envoyer un nouveau type de block ça c'est pas nickel (ce n'est pas le but d'un plugin).


Cordialement,
Detobel36
 

Americium

Aventurier
7 Février 2020
13
2
3
28
Ah d'accord j'avoue être un peu déçu sur le coup que le serveur ne puisse pas "imposer" un mod sans que les clients doivent l'installer.
Après je pense que le mod peut communiquer avec le mod serveur/plugin pour savoir s'il est compatible et du coup s'il peut interagir.

Je l'ai passé sur le client mais j'ai un problème avec l'initialisation de la classe :
Code:
java.lang.NoSuchMethodException: fr.Americium.AmPutationService.AmPutationMods.<init>()

J'ai regardé sur internet et il indique de mettre un constructeur vide ce que j'ai fais et je n'ai aucune modification toujours la même erreur.
Tu as une idée ?

Cordialement,
Americium
 

Detobel36

Créateur de plugins (PhoenixRebirth)
Support
17 Août 2012
10 530
24
2 247
347
27
Bruxelles - Belgique
www.phoenix-rebirth.fr
Salut,

Tu as une idée ?
Je ne m'y connais pas en développement de mod. Donc précisément non, je ne sais pas.
En voyant le code je peux te dire s'il y a des erreurs Java. Mais pas si c'est un problème "mod" ;)

Ah d'accord j'avoue être un peu déçu sur le coup que le serveur ne puisse pas "imposer" un mod sans que les clients doivent l'installer.
Si ça existait cela veut dire que minecraft doit download des choses avant de se connecter au serveur. Mais ça voudrait dire qu'on pourrait se connecter en "n'importe quel version" à un serveur. Qu'on pourrait rajouter des blocks avec un plugin...
Soit dit en passant, ce système est discutable d'un point de vue sécurité... Si le serveur peut faire download n'importe quel fichier. Et bien il pourrait très bien te faire download un programme malveillant.
Bref, tout ceci n'est pas possible avec la version "vanilla" du client minecraft.

Et c'est pour ça que tu as des "launcher" pour les serveurs moddés... Il est difficile d'imposer une liste de mod à installer avant de se connecter à un serveur. Donc on fourni un launcher qui va automatiquement contenir tous les mods.


Cordialement,
Detobel36
 

Americium

Aventurier
7 Février 2020
13
2
3
28
Salut !

Pas de moquerie mais j'ai trouvé l'erreur ...
En faite j'avais deux fichiers un avec juste le nom du mod et l'autre avec le nom du mod et la version forge.
Sauf que sans que je m'en aperçoive Eclipse compilait avec l'ancien nom que j'utilisais soit le nom du mod uniquement. Et j'utilisais l'autre ....
J'avais résolu le problème mais j'utilisais un mod qui datait de la veille ...

Maintenant la seule question que j'ai :
Lorsque je démarre mon mod via Eclipse je n'ai aucun soucis.
Lorsque je le fais via Minecraft, j'ai le mod dans ma liste mais j'ai aucune modification en ce qui concerne l'ouverture de l'interface lors de mon appui clavier.
C'est à dire que je pense que le fichier Minecraft.java & GameSettings.java ne sont pas re-générés à l'ajout de mon mod.
Est ce que je dois le recompiler et l'ajouter à ma version ?
(Est ce que je dois ouvrir un autre sujet pour ça ?)

Cordialement,
Americium
 

Detobel36

Créateur de plugins (PhoenixRebirth)
Support
17 Août 2012
10 530
24
2 247
347
27
Bruxelles - Belgique
www.phoenix-rebirth.fr
Salut,

Pas de moquerie mais j'ai trouvé l'erreur ...
On est personne pour juger ;) C'est normal d'apprendre et de débuter. Tout le monde est passé par la.

Lorsque je le fais via Minecraft, j'ai le mod dans ma liste mais j'ai aucune modification en ce qui concerne l'ouverture de l'interface lors de mon appui clavier.
C'est à dire que je pense que le fichier Minecraft.java & GameSettings.java ne sont pas re-générés à l'ajout de mon mod.
Est ce que je dois le recompiler et l'ajouter à ma version ?
(Est ce que je dois ouvrir un autre sujet pour ça ?)
Je n'en ai absolument aucune idée...
Du coup: boule ninja ! @robin4002 ? :D
Tu sais nous faire profiter de son savoir ? :p


Cordialement,
Detobel36
 

Americium

Aventurier
7 Février 2020
13
2
3
28
Salut Detobel36,

J'ai finalement réussi très très tard hier soir à réussir à afficher l'interface graphique !
Du coup il me reste plus qu'à faire le reste !

Merci pour l'aide en tout cas ;)
 
  • J'aime
Reactions: Detobel36