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 :

    [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 🤨)

    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 😉



  • text alternatif

    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 😁
    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 😜

    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 😭

    Merci ! ☺



  • 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 😂

    # 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 😉


  • Moddeurs confirmés Rédacteurs Administrateurs

    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 ... 😂


  • Moddeurs confirmés Rédacteurs Administrateurs

    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 😥


Log in to reply