Event au chargement/déchargement d'une partie



  • Bonjour,

    Voici mon problème :

    • J'ai du code a exécuter côté serveur au chargement d'une partie : DataBase.initInstance().
    • Et du code a exécuter côté serveur au déchargement d'une partie : DataBase.killInstance().

    J'ai cherché du côté des events mais j'en n'en ai trouvé aucun qui me permettrait de faire ce que je veux.
    Il y a bien les events WorldEvent.load et WorldEvent.unload :

    package com.trcgames.dbSynchronizer;
    
    import com.trcgames.dbSynchronizer.dataBase.DataBase;
    import net.minecraftforge.event.world.WorldEvent;
    import net.minecraftforge.fml.common.eventhandler.SubscribeEvent;
    
    public class EventHandler{
    
        @SubscribeEvent
        public void onWorldLoad (WorldEvent.Load event){
            if (!event.getWorld().isRemote) DataBase.initInstance();
        }
    
        @SubscribeEvent
        public void onWorldUnload (WorldEvent.Unload event){
            if (!event.getWorld().isRemote) DataBase.killInstance();
        }
    }
    

    Le problème c'est qu'ils sont déclenchés 3 fois au chargement ou au déchargement de la partie. De plus Ils sont aussi déclenchés quand on change de dimension.

    Est-ce que vous avez une idée de comment je pourrais procéder ?
    Merci.


  • Correcteurs

    Si c'est seulement côté serveur, tu peux utiliser FMLServerStarting (ou Started) et FMLServerStopping (ou stopped). Par contre, ce sont des events qui utilisent l'annotation EventHandler, comme le preInit.



  • @'DiabolicaTrix':

    Si c'est seulement côté serveur, tu peux utiliser FMLServerStarting (ou Started) et FMLServerStopping (ou stopped). Par contre, ce sont des events qui utilisent l'annotation EventHandler, comme le preInit.

    Merci de la réactivité.
    Voici mon nouveau code :

    package com.trcgames.dbSynchronizer;
    
    import com.trcgames.dbSynchronizer.dataBase.DataBase;
    import net.minecraftforge.fml.common.Mod.EventHandler;
    import net.minecraftforge.fml.common.event.FMLServerStartingEvent;
    import net.minecraftforge.fml.common.event.FMLServerStoppingEvent;
    
    public class EventListener{
    
        @EventHandler
        public void onServerStarted (FMLServerStartedEvent event){
            DataBase.initInstance();
        }
    
        @EventHandler
        public void onServerStopped (FMLServerStoppedEvent event){
            DataBase.killInstance();
        }
    }
    

    Et voici la méthode init dans la classe principale de mon mod :

        @EventHandler
        public void init (FMLInitializationEvent event){
    
            // il faut bien passer par MinecraftForge.EVENT_BUS.register en 1.11 même pour un event FML. De toute façon j'ai aussi tester avec FMLCommonHandler.instance.bus.register
            MinecraftForge.EVENT_BUS.register (new EventListener ());
        }
    

    Le problème c'est que onServerStarted et onServerStopped ne sont jamais appelés. Que je soit en solo ou en multi.


  • Administrateurs

    Ils doivent être mis dans la classe principale.



  • @'robin4002':

    Ils doivent être mis dans la classe principale.

    Ha merci ça fonctionne ! 😄
    Est ce qu'il y a moyen de dédier une classe pour les events FML et de l'enregistrer. Comme on le fait avec les events Forge.



  • Vu qu'en 1.11 les events FML et Forge sont sur le même bus, tu n'as pas besoin de le faire.



  • Oui mais il n'y a vraiment pas moyen de faire une classe à part où il y a tous les events et enregister cette classe via la méthode init.
    Comme ça la classe principale du mod est plus aérée.


  • Administrateurs

    Non c'est pas possible, les @EventHandler ne peuvent que être dans la classe principale.



  • Ok c'est pas grave.
    Merci encore de votre aide. 😄