Résolu Utilisation de gradlew runServer
-
Coucou les moddeurs !
Je reviens d’entre les défunts ayant retrouvé un goût soudain à Minecraft, et surtout au Minecraft moddé. Il allait ainsi de soi que je me remette moi-même au modding.
J’ai donc ressorti mes vieilles idées des cartons, et ai pris mon courage à deux mains : j’ai réinstallé Forge.
Alors à la toute base je voulais modder en Vanilla, parce que c’est comme ça que j’ai moddé pendant 95% de mon aventure (les 5% restant étant 4% à Rei’s ModLoader et 1% à Forge), mais Minecraft Coder Pack n’est plus à jour depuis … bien des versions. Et puis bon, si Forge me permet plus de compatibilité, pourquoi pas. Même si j’ai pour projet de faire un mod privé pour des copains et moi même.
Je vous fait le topo, j’ai réinstallé Forge MDK dans un dossier créé pour l’occasion. Vu que ça fait un moment que j’ai pas touché au Java j’ai mis à jour JRE et JDK en 1.8.0_241. J’ai viré mes installations foireuses de Gradle pour être certains d’être à jour et stable de ce côté là (en 4.9). Bref tout se passe à merveille. Je peux lancer le client sans souci, et au moment où je lance le serveur : paf, une erreur.
Le chargement se fait jusqu’à la détection du mod :
[m[36m[03:30:33] [pool-2-thread-1/DEBUG] [ne.mi.fm.ja.FMLJavaModLanguageProvider/SCAN]: Found @Mod class fr.epharos.test.MainClass with id testforge
Mais après ça survient l’erreur fatidique :
could not dispatch a message to daemon
Et connexion coupée, processus arrêté, me voilà fort embêté.
J’ai à peu près tout essayé, du refresh-dependencies, au --stop, en passant par des clean en pagaille et une réinstall du MDK, … mais rien n’y fait.
Sachant que par contre, je peux ouvrir un serveur LAN à partir du client, est-ce qu’utiliser un serveur comme ça revient au même que lancer un serveur par le runServer ?
Merci de votre lecture, en espérant que vous pourrez voler à mon secours
(<-- par ailleurs, cet emoji c’est un high-five pas un emoji prière :face_with_raised_eyebrow:)
Bises, Epharos.
-
Problème résolu,
Je me suis tapé tout le fichier de log de daemon pour trouver finalement en plein milieu :
You need to agree to the EULA in order to run the server. Go to eula.txt for more info.
Le fait que les EULA ne soient pas acceptées par défaut sur un minecraft_server, ça freeze le daemon qui timeout au bout de quelques secondes et qui cause le crash du coup.
Conclusion, si jamais vous avez la même erreur que moi : pensez à aller accepter les EULA dans eula.txt (dossier run de votre dossier de modding)Merci pour ton aide en tout cas Ama :winking_face:
-
Mama, Epharos de retour dans le Game !
Ça fait plaisir de te revoir dans les parages !(J’ai pas la réponse à ton problème par contre)
Mais Re-Bienvenue !
-
Ahah, ça fait plaisir de revoir les têtes de l’époque :beaming_face_with_smiling_eyes:
J’étais repassé il y a quelques mois pour essayer de mettre à jour Craft My Mod, j’avais tout de fonctionnel sauf le chargement des ressources utilisateur (modèles, textures, …) et vu que j’ai repris les études après, j’ai mis ça de côté, du coup j’étais revenu en coup de vent. Mais cette fois, je compte rester, j’ai quelques idées à mettre en code :winking_face_with_tongue:Pour mon problème franchement je sais pas, j’ai essayé beaucoup de choses, j’ai épluché StackOverflow, reddit, GitHub, … personne n’a de solution fonctionnelle pour moi :loudly_crying_face:
Merci ! :smiling_face:
-
Fais voir ta classe principale ?
-
Pour le coup, j’ai tout de base, j’ai même pas commencé à coder, je voulais juste voir où se logguait (ralala les anglicismes) le pre-init, init et post-init en serveur. Dans le doute, je mets quand même le code :
package fr.epharos.test; import java.util.stream.Collectors; import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; import net.minecraft.block.Block; import net.minecraft.block.Blocks; import net.minecraftforge.common.MinecraftForge; import net.minecraftforge.event.RegistryEvent; import net.minecraftforge.eventbus.api.SubscribeEvent; import net.minecraftforge.fml.InterModComms; import net.minecraftforge.fml.common.Mod; import net.minecraftforge.fml.event.lifecycle.FMLClientSetupEvent; import net.minecraftforge.fml.event.lifecycle.FMLCommonSetupEvent; import net.minecraftforge.fml.event.lifecycle.InterModEnqueueEvent; import net.minecraftforge.fml.event.lifecycle.InterModProcessEvent; import net.minecraftforge.fml.event.server.FMLServerStartingEvent; import net.minecraftforge.fml.javafmlmod.FMLJavaModLoadingContext; @Mod("test") public class MainClass { private static final Logger LOGGER = LogManager.getLogger(); public MainClass() { // Register the setup method for modloading FMLJavaModLoadingContext.get().getModEventBus().addListener(this::setup); // Register the enqueueIMC method for modloading FMLJavaModLoadingContext.get().getModEventBus().addListener(this::enqueueIMC); // Register the processIMC method for modloading FMLJavaModLoadingContext.get().getModEventBus().addListener(this::processIMC); // Register the doClientStuff method for modloading FMLJavaModLoadingContext.get().getModEventBus().addListener(this::doClientStuff); // Register ourselves for server and other game events we are interested in MinecraftForge.EVENT_BUS.register(this); } private void setup(final FMLCommonSetupEvent event) { LOGGER.info("HELLO FROM PREINIT"); LOGGER.info("DIRT BLOCK >> {}", Blocks.DIRT.getRegistryName()); } private void doClientStuff(final FMLClientSetupEvent event) { // do something that can only be done on the client LOGGER.info("Got game settings {}", event.getMinecraftSupplier().get().gameSettings); } private void enqueueIMC(final InterModEnqueueEvent event) { // some example code to dispatch IMC to another mod InterModComms.sendTo("examplemod", "helloworld", () -> { LOGGER.info("Hello world from the MDK"); return "Hello world";}); } private void processIMC(final InterModProcessEvent event) { // some example code to receive and process InterModComms from other mods LOGGER.info("Got IMC {}", event.getIMCStream(). map(m->m.getMessageSupplier().get()). collect(Collectors.toList())); } // You can use SubscribeEvent and let the Event Bus discover methods to call @SubscribeEvent public void onServerStarting(FMLServerStartingEvent event) { // do something when the server starts LOGGER.info("HELLO from server starting"); } // You can use EventBusSubscriber to automatically subscribe events on the contained class (this is subscribing to the MOD // Event bus for receiving Registry Events) @Mod.EventBusSubscriber(bus = Mod.EventBusSubscriber.Bus.MOD) public static class RegistryEvents { @SubscribeEvent public static void onBlocksRegistry(final RegistryEvent.Register<Block> blockRegistryEvent) { // register a new block here LOGGER.info("HELLO from Register Block"); } } }
J’ai lu une explication qui disait que les classes anonymes (comme ici le RegistryEvents) pouvait causer un crash de daemon, du coup j’ai essayé en la mettant en commentaire mais rien n’a changé.
J’ai également checké si mon mod n’était pas en side ClientOnly mais ce n’est pas le cas.Petite précision aussi, c’est le MDK de la 1.15.2, j’ai remarqué qu’ils utilisaient les mapping de 1.14.3, je sais pas si ça peut jouer sur quelque chose à ce niveau là ?
-
Je voulais justement voir si ta classe principale était anonyme.
Non je pense pas que les mappings 1.14 fasse n’importe quoi.C’est pas commun comme erreur ça.
Voyons ton mods.toml ?
-
J’ai l’impression que c’est plutôt rare oui :face_with_tears_of_joy:
# This is an example mods.toml file. It contains the data relating to the loading mods. # There are several mandatory fields (#mandatory), and many more that are optional (#optional). # The overall format is standard TOML format, v0.5.0. # Note that there are a couple of TOML lists in this file. # Find more information on toml format here: https://github.com/toml-lang/toml # The name of the mod loader type to load - for regular FML @Mod mods it should be javafml modLoader="javafml" #mandatory # A version range to match for said mod loader - for regular FML @Mod it will be the forge version loaderVersion="[31,)" #mandatory This is typically bumped every Minecraft version by Forge. See our download page for lists of versions. # A URL to refer people to when problems occur with this mod issueTrackerURL="http://my.issue.tracker/" #optional # A list of mods - how many allowed here is determined by the individual mod loader [[mods]] #mandatory # The modid of the mod modId="test" #mandatory # The version number of the mod - there's a few well known ${} variables useable here or just hardcode it version="${file.jarVersion}" #mandatory # A display name for the mod displayName="Test" #mandatory # A URL to query for updates for this mod. See the JSON update specification <here> updateJSONURL="http://myurl.me/" #optional # A URL for the "homepage" for this mod, displayed in the mod UI displayURL="http://example.com/" #optional # A file name (in the root of the mod JAR) containing a logo for display logoFile="examplemod.png" #optional # A text field displayed in the mod UI credits="Thanks for this example mod goes to Java" #optional # A text field displayed in the mod UI authors="Love, Cheese and small house plants" #optional # The description text for the mod (multi line!) (#mandatory) description=''' This is a long form description of the mod. You can write whatever you want here Have some lorem ipsum. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Sed mollis lacinia magna. Orci varius natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Sed sagittis luctus odio eu tempus. Interdum et malesuada fames ac ante ipsum primis in faucibus. Pellentesque volutpat ligula eget lacus auctor sagittis. In hac habitasse platea dictumst. Nunc gravida elit vitae sem vehicula efficitur. Donec mattis ipsum et arcu lobortis, eleifend sagittis sem rutrum. Cras pharetra quam eget posuere fermentum. Sed id tincidunt justo. Lorem ipsum dolor sit amet, consectetur adipiscing elit. ''' # A dependency - use the . to indicate dependency for a specific modid. Dependencies are optional. [[dependencies.examplemod]] #optional # the modid of the dependency modId="forge" #mandatory # Does this dependency have to exist - if not, ordering below must be specified mandatory=true #mandatory # The version range of the dependency versionRange="[31,)" #mandatory # An ordering relationship for the dependency - BEFORE or AFTER required if the relationship is not mandatory ordering="NONE" # Side this dependency is applied on - BOTH, CLIENT or SERVER side="BOTH" # Here's another dependency [[dependencies.examplemod]] modId="minecraft" mandatory=true versionRange="[1.15.2]" ordering="NONE" side="BOTH"
Théoriquement tout est bon ce côté là aussi, j’ai quasi rien touché à par le modId et le displayName (et j’ai rajouté des retours à la ligne aussi pour que ça soit plus lisible)
-
Mouais, je m’en doutais aussi.
J’ai pu lire de ça et là que ça ce produit dans le Deamon de Gradle est kill.
Il faudrait que tu regarde comment relancer le deamon.
Ou alors le kill de force, pour voir si il y en a pas deux de lancés truc du genre. -
Problème résolu,
Je me suis tapé tout le fichier de log de daemon pour trouver finalement en plein milieu :
You need to agree to the EULA in order to run the server. Go to eula.txt for more info.
Le fait que les EULA ne soient pas acceptées par défaut sur un minecraft_server, ça freeze le daemon qui timeout au bout de quelques secondes et qui cause le crash du coup.
Conclusion, si jamais vous avez la même erreur que moi : pensez à aller accepter les EULA dans eula.txt (dossier run de votre dossier de modding)Merci pour ton aide en tout cas Ama :winking_face:
-
J’allais justement faire le remarque sur le fichier eula en voyant que le client fonctionne mais pas le serveur.
Mais j’ai été trop lent ! -
Si seulement ça s’affichait par défaut dans les logs, et que je sois pas obligé de check le fichier log de daemon qui fait quand même 2.5Mo … :face_with_tears_of_joy:
-
Le mieux est de lancer via son IDE, utilises
gradlew genTonIDERuns
pour créé les fichiers de lancement pour ton IDE (IDE compatible : Eclipse, Idea, VSCode) -
C’est ce que je faisais au début, mais ça bloquait sur
Found @Mod class fr.epharos.test.MainClass with id testforge
avant de couper le processus, c’est pour ça que je suis passé par la console de windows, en espérant avoir plus de détails sur le crash, sans trop de succès :sad_but_relieved_face: