Name Modifier tickée + détecter le GM du joueur



  • Bichour !
    j'ai un petit problème, enfin 2 petits problèmes :

    1er problème :
    J'ai créé un event forge qui modifie le pseudo du joueur en ajoutant un [Creative] si le joueur est en créatif.Le problème est que la méthode n'étant pas tickée, si je me met en survie, le [Creative] reste.

    Voici mon code :

    
    @SubscribeEvent(priority=EventPriority.NORMAL)
        public void onEvent(NameFormat event)
        {
            System.out.println("PNM OK!");
            if(event.displayname.equals("Infinite_X"))
            {
                event.displayname = ChatFormatting.DARK_RED + "[DEV]" + event.username;
            }
    
            if(event.entityPlayer.capabilities.isCreativeMode)
            {
                event.displayname = "[Creative]" + event.displayname;
            }
        }
    
    

    2ème problème :
    Ceci peut paraître bête mais je ne sais pas comment détecter si le joueur est en GameMode survival ou adventure …



  • Pour savoir le mode de jeux d'un joueur

    event.getPlayer().capabilities.isCreativeMode
    


  • Je sais mais c'est pour le mode Créatif  😄 ,c'est ce que j'ai mis dans mon code pour le mode créatif.



  • Salut,
    Il te faut une instance de EntityPlayerMP, ainsi tu pourras faire playerMP.interactionManager.gameType


  • Rédacteurs

    Pour que l'event NameFormat soit déclenché il faut que tu utilises cette fonction : https://github.com/MFFbrokenSwing/FactionModV2/blob/master/src/main/java/factionmod/handler/EventHandlerFaction.java#L209



  • @Plaigon
    J'ai pas l'interactionManager pour EntityPlayerMP …
    @BrokenSwing
    j'ai fait ça :

    
    public class PlayerNameModifier
    {
        @SubscribeEvent(priority=EventPriority.NORMAL)
        public void onEvent(NameFormat event)
        {
            EntityPlayerMP playerMP = (EntityPlayerMP) event.entityPlayer;
            System.out.println("PNM OK!");
            if(event.displayname.equals("Infinite_X"))
            {
                event.displayname = ChatFormatting.DARK_RED + "[DEV]" + event.username;
            }
    
            if(event.entityPlayer.capabilities.isCreativeMode)
            {
                event.displayname = "[Creative]" + event.displayname;
            }
        }
    
        @SubscribeEvent
        public void onPlayerTick(TickEvent.PlayerTickEvent event) 
        {
            event.player.refreshDisplayName();
        }
    }
    
    

    malheureusement quand je me met en mode survival, j'ai le [Creative] qui reste …  😕



  • En même temps, tu ne lui dis nulle part de l'enlever…

    
    if(event.entityPlayer.capabilities.isCreativeMode)
    event.displayname = "[Creative]" + event.displayname;
    else
    event.displayname = event.displayname.replace("[Creative]", "");
    
    


  • Essaie de débug pour voir où ça coince. Est-ce que PlayerTickEvent est bien enregistré sur le bon bus.
    Pour ton autre problème d'interactionManager, je vais voir en rentrant d'ici une petite heure.



  • @Dylem
    Fonctionne toujours pas …

    @Plaigon
    Voici ma classe :

    
    import com.mojang.realmsclient.gui.ChatFormatting;
    
    import cpw.mods.fml.common.eventhandler.EventPriority;
    import cpw.mods.fml.common.eventhandler.SubscribeEvent;
    import cpw.mods.fml.common.gameevent.TickEvent;
    import net.minecraft.entity.player.EntityPlayerMP;
    import net.minecraftforge.event.entity.player.PlayerEvent.NameFormat;
    
    public class PlayerNameModifier
    {
        @SubscribeEvent(priority=EventPriority.NORMAL)
        public void onEvent(NameFormat event)
        {
            EntityPlayerMP playerMP = (EntityPlayerMP) event.entityPlayer;
            System.out.println("PNM OK!");
            if(event.displayname.equals("Infinite_X"))
            {
                event.displayname = ChatFormatting.DARK_RED + "[DEV]" + event.username;
            }
    
            if(event.entityPlayer.capabilities.isCreativeMode)
            {
                event.displayname = "[Creative]" + event.displayname;
            }
            else
            {
                event.displayname = event.displayname.replace("[Creative]", "");
            }
    
            if(!event.entityPlayer.capabilities.isCreativeMode)
            {
                event.displayname = event.username;
            }
        }
    
        @SubscribeEvent
        public void onPlayerTick(TickEvent.PlayerTickEvent event) 
        {
            event.player.refreshDisplayName();
        }
    }
    
    

    voici la méthode init de ma classe principale :

    
    @EventHandler
        public void init(FMLInitializationEvent event)
        {
            proxy.registerRenders();
            NetworkRegistry.INSTANCE.registerGuiHandler(instance, new GuiHandlerIUtils());
            MinecraftForge.EVENT_BUS.register(new PlayerHeadLootOnDie());
            MinecraftForge.EVENT_BUS.register(new CustomFluidEvent());
            MinecraftForge.EVENT_BUS.register(new PlayerNameModifier());
        }
    
    

  • Rédacteurs

    @Dylem Pas besoin de l'enlever, le displayname que tu reçoit est "neutre". En gros le "[Creative]" ne reste pas, donc pas besoin de la remplacer.

    @Infinite Ton premier code devrait fonctionner mais j'ai tu as dû faire une erreur quelque part. Vérifie la valeur de event.entityPlayer.capabilities.isCreativeMode mais je doute que ça vienne de là.



  • Plutôt playerMP.theItemInWorldManager.getGameType()
    Mais tu ne peux instancier un EntityPlayerMP que côté serveur(je crois que NameFormat est uniquement déclenché client side). Du coup, il faudrait plutôt faire ainsi Minecraft.getMinecraft().currentGameType (mais variable private donc se servir d'un Access Transformer).
    Dernièrement, petite info, tu as le boolean PlayerControllerMP#gameIsSurvivalOrAdventure, si tu ne souhaites aucune dissociation entres ces deux games modes.


  • Rédacteurs

    NameFormat est déclenché côté serveur. Et c'est plutôt côté client que je ne suis pas sûr qu'il soit déclenché, j'ai la flemme de vérifier. Tout ça pour dire qu'il peux bien cast en EntityPlayerMP (mais du coup vérifier qu'il est server-side)