Récupérer les packets envoyés au joueur ?



  • Je me suis pas mal renseigné sur les packets avec notamment le tutoriel écrit et vidéo du site mais je ne comprends toujours pas si on peut récupérer un certain packet envoyé au joueur.
    En fait, j'aimerais récupérer la vie du joueur ( en solo comme en multi ) mais les events " LivingHurtEvent " et " LivingHealEvent " ne marchant pas sur serveurs, j'aimerais récupérer le packet qui gère la vie qui est envoyé au joueur. J'ai essayé d'envoyer un packet au seveur et qu'il renvoie la vie du joueur mais je ne trouve pas le packet à renvoyé. Donc j'aimerais savoir si c'est possible de récupérer les packets qui sont envoyé au joueur et si oui comment. Merci à ceux qui m'aideront 🙂

    PS : Excusez-moi si c'est une question bête et que j'aurais du juste un peu mieux me renseigner.


  • Correcteurs

    Et pourquoi utiliser les packets pour intercepter? Tu peux tout simplement utiliser les events et envoyer un packet un serveur quand la vie se modifie?

    
    @SubscribeEvent
    public void onHurt(LivingHurtEvent event)
    {
        ….
        Mod.instance.network.sendToServer(...);
        ....
    }
    
    


  • C'est-à-dire ? Je comprends pas trop quel packet j'enverrais au serveur et qu'est-ce que je recevrais. Excuse-moi, je ne suis pas hyper familier avec les packets.


  • Administrateurs

    La vie est un dataWatcher, donc c'est de base synchro entre le client et le serveur. Inutile de vouloir passer par des paquets.


  • Correcteurs

    En plus, de toute façon je ne cois pas que tu aies besoin de packet, je crois que tu vas chercher un peu trop loin.



  • Les évènements livongHeal et LivingHurtEvent sont bien appelés côté serveur car je les ai utilisé dans mon HGVS, envoi ton code, il doit te manquer quelque chose



  • Voilà mon code avec les events LivingHealEvent et LivingHurtEvent :

    
    package com.Toinou.LifeBarMod;
    
    import net.minecraft.entity.EntityLivingBase;
    import net.minecraft.entity.player.EntityPlayer;
    import net.minecraft.util.ChatComponentTranslation;
    import net.minecraftforge.event.entity.living.LivingHealEvent;
    import net.minecraftforge.event.entity.living.LivingHurtEvent;
    import net.minecraftforge.fml.common.eventhandler.SubscribeEvent;
    
    public class EventClass {
    
        @SubscribeEvent
        public void onPlayerHeal(LivingHealEvent e) {
    
            if(e.entity instanceof EntityPlayer) {
    
                EntityPlayer p = (EntityPlayer) e.entity;
    
                float Vie = ((EntityLivingBase) p).getHealth();
                String strVie = String.valueOf(Vie);
                p.addChatMessage(new ChatComponentTranslation(strVie));
    
            }
        }
    
        @SubscribeEvent
        public void onPlayerHurt(LivingHurtEvent e) {
    
            if(e.entity instanceof EntityPlayer) {
    
                EntityPlayer p = (EntityPlayer) e.entity;
    
                float Vie = ((EntityLivingBase) p).getHealth();
                String strVie = String.valueOf(Vie);
                p.addChatMessage(new ChatComponentTranslation(strVie));
    
            }
        }
    }
    
    

    Et je ne sais pas trop pourquoi, ça ne marche qu'en solo. Et puis, ce qui est embêtant avec ces deux events, c'est qu'ils me retournent la vie avant de prendre les dégâts ou que la vie remonte.

    J'avais essayé de récupérer la vie avec un PlayerTickEvent, ça marchait très bien en solo et sur les serveurs vanilla, mais sur les serveurs de mini-jeux par exemple, il me renvoyait des données très bizarres.


  • Rédacteurs

    Ces events te retournent la vie avant sa modification car ils sont 'annulable' en faisant un ```java
    event.setCanceled(true)

    
    Pour les LivingHurtEvent :
    
    ```java
    
    if(e.entity instanceof EntityPlayer)
    {
    EntityPlayer player = (EntityPlayer)e.entity;
    float vie = player.getHealth() - e.ammount;
    }
    
    

    Et pour le LivingHealEvent:

    
    if(e.entity instanceof EntityPlayer)
    {
    EntityPlayer player = (EntityPlayer)e.entity;
    float vie = player.getHealth() + e.amount;
    }
    
    

    Tiens, amount ne s'écrit pas pareil (en 1.8 ent tout cas) selon l'event.



  • @'bodri':

    Ces events te retournent la vie avant sa modification car ils sont 'annulable' en faisant un ```java
    event.setCanceled(true)

    
    Pour les LivingHurtEvent :
    
    ```java
    
    if(e.entity instanceof EntityPlayer)
    {
    EntityPlayer player = (EntityPlayer)e.entity;
    float vie = player.getHealth() - e.ammount;
    }
    
    

    Et pour le LivingHealEvent:

    
    if(e.entity instanceof EntityPlayer)
    {
    EntityPlayer player = (EntityPlayer)e.entity;
    float vie = player.getHealth() + e.amount;
    }
    
    

    Tiens, amount ne s'écrit pas pareil (en 1.8 ent tout cas) selon l'event.

    Ah d'accord merci pour les conseils. Et du coup, comme c'est un event qui peuvent être cancel, il ne marche pas sur serveur ( sinon ca serait un peu cheaté 😛 ). Personne connaît un moyen simple de récupérer la vie du joueur sur serveur ?


  • Rédacteurs

    Si j'ai bien compris tu cherche à faire un mod client seulement qui récupère la vie des joueurs, c'est cela ?



  • Oui, c'est ça, je veux récupérer la vie du joueur quand elle change.


  • Rédacteurs

    Essai ça, peut être :

    
    public class EventClientListener { //Enregistré côté client seulement
    
    @SubscribeEvent
    public void onRenderGameOverlay(RenderGameOverlayEvent e) //J'ai pris cet event parce que c'est un event client et qu'il est exécuter sans aucune action
    {
    Ordering ordering = Ordering.from(new PlayerComparator()); //Pour trier les joueurs, c'est le système de minecraft
    NetHandlerPlayClient nethandler = Minecraft.getMinecraft().thePlayer.sendQueue;
    List list = ordering.sortedCopy(nethandler.func_175106_d());
    Iterator iterator = list.iterator();
    
    while(iterator.hasNext())
    {
    NetworkPlayerInfo playerinfo = (NetworkPlayerInfo)iterator.next();
    EntityPlayer player = Minecraft.getMinecraft().theWorld.getPlayerEntityByUUID(playerinfo.getGameProfile().getId());
    Minecraft.getMinecraft().thePlayer.sendChatMessage(player.getName() + " a " + player.getHealth() + " demi-coeurs");
    }
    
    }
    
    @SideOnly(Side.CLIENT)
    static class PlayerComparator implements Comparator // trie un fonction des teams et des modes de jeu (je crois)
    {
    private PlayerComparator() {}
    
    public int comparation(NetworkPlayerInfo p_178952_1_, NetworkPlayerInfo p_178952_2_)
    {
    ScorePlayerTeam scoreplayerteam = p_178952_1_.getPlayerTeam();
    ScorePlayerTeam scoreplayerteam1 = p_178952_2_.getPlayerTeam();
    return ComparisonChain.start().compareTrueFirst(p_178952_1_.getGameType() != WorldSettings.GameType.SPECTATOR, p_178952_2_.getGameType() != WorldSettings.GameType.SPECTATOR).compare(scoreplayerteam != null ? scoreplayerteam.getRegisteredName() : "", scoreplayerteam1 != null ? scoreplayerteam1.getRegisteredName() : "").compare(p_178952_1_.getGameProfile().getName(), p_178952_2_.getGameProfile().getName()).result();
    }
    
    public int compare(Object p_compare_1_, Object p_compare_2_)
    {
    return comparation((NetworkPlayerInfo)p_compare_1_, (NetworkPlayerInfo)p_compare_2_);
    }
    }
    }
    
    

    Après faut que t'arrive à afficher seulement lorsque les joueur prend un dégâts ou gagne de la vie, pour le comparator tu peux juste faire :

    
    Ordering ordering = Ordering.from(new Comparator() {
    
    @Override
    public int compare(Object o1, Object o2) {
    return 0;
    }
    });
    
    

    Mais ça triera rien du tout normalement.



  • Je comprends pas tout mais bon x) je vais tester ça tout de suite 🙂



  • Bon, déjà, j'ai modifié le fait que ça envoie un message dans le chat et j'ai mis que ça m’envoyai un message. Ca marche parfaitement en solo et sur les serveurs vanilla mais sur les serveurs bukkit, ca crash des que je me co 😕

    Voici le rapport de crash si ça peut intéréssé :

    
    –-- Minecraft Crash Report ----
    
    WARNING: coremods are present:
    Contact their authors BEFORE contacting forge
    
    // Don't be sad. I'll do better next time, I promise!
    
    Time: 04/10/15 14:11
    Description: Unexpected error
    
    java.lang.NullPointerException: Unexpected error
        at com.Toinou.LifeBarMod.EventClass.onRenderGameOverlay(EventClass.java:77)
        at net.minecraftforge.fml.common.eventhandler.ASMEventHandler_6_EventClass_onRenderGameOverlay_RenderGameOverlayEvent.invoke(.dynamic)
        at net.minecraftforge.fml.common.eventhandler.ASMEventHandler.invoke(ASMEventHandler.java:55)
        at net.minecraftforge.fml.common.eventhandler.EventBus.post(EventBus.java:138)
        at net.minecraftforge.client.GuiIngameForge.pre(GuiIngameForge.java:854)
        at net.minecraftforge.client.GuiIngameForge.func_175180_a(GuiIngameForge.java:108)
        at net.minecraft.client.renderer.EntityRenderer.func_78480_b(EntityRenderer.java:1266)
        at net.minecraft.client.Minecraft.func_71411_J(Minecraft.java:1055)
        at net.minecraft.client.Minecraft.func_99999_d(Minecraft.java:345)
        at net.minecraft.client.main.Main.main(SourceFile:120)
        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 net.minecraft.launchwrapper.Launch.launch(Launch.java:135)
        at net.minecraft.launchwrapper.Launch.main(Launch.java:28)
    
    A detailed walkthrough of the error, its code path and all known details is as follows:
    ---------------------------------------------------------------------------------------
    
    -- Head --
    Stacktrace:
        at com.Toinou.LifeBarMod.EventClass.onRenderGameOverlay(EventClass.java:77)
        at net.minecraftforge.fml.common.eventhandler.ASMEventHandler_6_EventClass_onRenderGameOverlay_RenderGameOverlayEvent.invoke(.dynamic)
        at net.minecraftforge.fml.common.eventhandler.ASMEventHandler.invoke(ASMEventHandler.java:55)
        at net.minecraftforge.fml.common.eventhandler.EventBus.post(EventBus.java:138)
        at net.minecraftforge.client.GuiIngameForge.pre(GuiIngameForge.java:854)
        at net.minecraftforge.client.GuiIngameForge.func_175180_a(GuiIngameForge.java:108)
    
    -- Affected level --
    Details:
        Level name: MpServer
        All players: 1 total; [EntityPlayerSP['Toinou9120'/1643, l='MpServer', x=8,50, y=65,00, z=8,50]]
        Chunk stats: MultiplayerChunkCache: 1, 1
        Level seed: 0
        Level generator: ID 01 - flat, ver 0\. Features enabled: false
        Level generator options:
        Level spawn location: -26,00,50,00,89,00 - World: (-26,50,89), Chunk: (at 6,3,9 in -2,5; contains blocks -32,0,80 to -17,255,95), Region: (-1,0; contains chunks -32,0 to -1,31, blocks -512,0,0 to -1,255,511)
        Level time: 0 game time, 0 day time
        Level dimension: 0
        Level storage version: 0x00000 - Unknown?
        Level weather: Rain time: 0 (now: false), thunder time: 0 (now: false)
        Level game mode: Game mode: survival (ID 0). Hardcore: false. Cheats: false
        Forced entities: 1 total; [EntityPlayerSP['Toinou9120'/1643, l='MpServer', x=8,50, y=65,00, z=8,50]]
        Retry entities: 0 total; []
        Server brand: BungeeCord (git:BungeeCord-Bootstrap:1.8-SNAPSHOT:fa828eb:unknown) <- Spigot
        Server type: Non-integrated multiplayer server
    Stacktrace:
        at net.minecraft.client.multiplayer.WorldClient.func_72914_a(WorldClient.java:407)
        at net.minecraft.client.Minecraft.func_71396_d(Minecraft.java:2502)
        at net.minecraft.client.Minecraft.func_99999_d(Minecraft.java:374)
        at net.minecraft.client.main.Main.main(SourceFile:120)
        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 net.minecraft.launchwrapper.Launch.launch(Launch.java:135)
        at net.minecraft.launchwrapper.Launch.main(Launch.java:28)
    
    – System Details --
    Details:
        Minecraft Version: 1.8
        Operating System: Windows 7 (amd64) version 6.1
        Java Version: 1.7.0_75, Oracle Corporation
        Java VM Version: Java HotSpot(TM) 64-Bit Server VM (mixed mode), Oracle Corporation
        Memory: 116998584 bytes (111 MB) / 384229376 bytes (366 MB) up to 2134114304 bytes (2035 MB)
        JVM Flags: 6 total; -XX:HeapDumpPath=MojangTricksIntelDriversForPerformance_javaw.exe_minecraft.exe.heapdump -Xmx2G -XX:+UseConcMarkSweepGC -XX:+CMSIncrementalMode -XX:-UseAdaptiveSizePolicy -Xmn128M
        IntCache: cache: 0, tcache: 0, allocated: 0, tallocated: 0
        FML: MCP v9.10 FML v8.0.99.99 Minecraft Forge 11.14.3.1450 Optifine OptiFine_1.8_HD_U_D5 4 mods loaded, 4 mods active
        States: 'U' = Unloaded 'L' = Loaded 'C' = Constructed 'H' = Pre-initialized 'I' = Initialized 'J' = Post-initialized 'A' = Available 'D' = Disabled 'E' = Errored
        UCHIJA    mcp{9.05} [Minecraft Coder Pack] (minecraft.jar)
        UCHIJA    FML{8.0.99.99} [Forge Mod Loader] (forge-1.8-11.14.3.1450.jar)
        UCHIJA    Forge{11.14.3.1450} [Minecraft Forge] (forge-1.8-11.14.3.1450.jar)
        UCHIJA    LBM{1.0} [LifeBarMod] (LifeBar Mod 16.jar)
        Loaded coremods (and transformers):
        GL info: ' Vendor: 'ATI Technologies Inc.' Version: '4.5.13399 Compatibility Profile Context 15.200.1062.1004' Renderer: 'AMD Radeon HD 6450'
        Launched Version: 1.8-Forge11.14.3.1450
        LWJGL: 2.9.1
        OpenGL: AMD Radeon HD 6450 GL version 4.5.13399 Compatibility Profile Context 15.200.1062.1004, ATI Technologies Inc.
        GL Caps: Using GL 1.3 multitexturing.
    Using GL 1.3 texture combiners.
    Using framebuffer objects because OpenGL 3.0 is supported and separate blending is supported.
    Shaders are available because OpenGL 2.1 is supported.
    VBOs are available because OpenGL 1.5 is supported.
    
        Using VBOs: Yes
        Is Modded: Definitely; Client brand changed to 'fml,forge'
        Type: Client (map_client.txt)
        Resource Packs: [faithful32pack.zip, OCD pack 1.8 [Perso].zip, thebaum64_sky.zip]
        Current Language: §eEnglish (§bColor§e)
        Profiler Position: N/A (disabled)
    
    

  • Rédacteurs

    Ta classe event ? stp



  • Voilà :

    
    package com.Toinou.LifeBarMod;
    
    import java.util.Comparator;
    import java.util.Iterator;
    import java.util.List;
    
    import net.minecraft.client.Minecraft;
    import net.minecraft.client.network.NetHandlerPlayClient;
    import net.minecraft.client.network.NetworkPlayerInfo;
    import net.minecraft.entity.player.EntityPlayer;
    import net.minecraft.scoreboard.ScorePlayerTeam;
    import net.minecraft.util.ChatComponentTranslation;
    import net.minecraft.world.WorldSettings;
    import net.minecraftforge.client.event.RenderGameOverlayEvent;
    import net.minecraftforge.fml.common.eventhandler.SubscribeEvent;
    import net.minecraftforge.fml.relauncher.Side;
    import net.minecraftforge.fml.relauncher.SideOnly;
    
    import com.google.common.collect.ComparisonChain;
    import com.google.common.collect.Ordering;
    
    public class EventClass {
    
        @SubscribeEvent
        public void onRenderGameOverlay(RenderGameOverlayEvent e) //J'ai pris cet event parce que c'est un event client et qu'il est exécuter sans aucune action
        {
            Ordering ordering = Ordering.from(new PlayerComparator()); //Pour trier les joueurs, c'est le système de minecraft
            NetHandlerPlayClient nethandler = Minecraft.getMinecraft().thePlayer.sendQueue;
            List list = ordering.sortedCopy(nethandler.func_175106_d());
            Iterator iterator = list.iterator();
    
            while(iterator.hasNext())
            {
                NetworkPlayerInfo playerinfo = (NetworkPlayerInfo)iterator.next();
                EntityPlayer player = Minecraft.getMinecraft().theWorld.getPlayerEntityByUUID(playerinfo.getGameProfile().getId());
                float Vie = player.getHealth();
                String strVie = String.valueOf(Vie);
                Minecraft.getMinecraft().thePlayer.addChatMessage(new ChatComponentTranslation(strVie));
            }
    
        }
    
            @SideOnly(Side.CLIENT)
            static class PlayerComparator implements Comparator // trie un fonction des teams et des modes de jeu (je crois)
            {
                private PlayerComparator() {}
    
                public int comparation(NetworkPlayerInfo p_178952_1_, NetworkPlayerInfo p_178952_2_)
                {
                    ScorePlayerTeam scoreplayerteam = p_178952_1_.getPlayerTeam();
                    ScorePlayerTeam scoreplayerteam1 = p_178952_2_.getPlayerTeam();
                    return ComparisonChain.start().compareTrueFirst(p_178952_1_.getGameType() != WorldSettings.GameType.SPECTATOR, p_178952_2_.getGameType() != WorldSettings.GameType.SPECTATOR).compare(scoreplayerteam != null ? scoreplayerteam.getRegisteredName() : "", scoreplayerteam1 != null ? scoreplayerteam1.getRegisteredName() : "").compare(p_178952_1_.getGameProfile().getName(), p_178952_2_.getGameProfile().getName()).result();
                }
    
                public int compare(Object p_compare_1_, Object p_compare_2_)
                {
                    return comparation((NetworkPlayerInfo)p_compare_1_, (NetworkPlayerInfo)p_compare_2_);
                }
            }
    
    }
    
    

  • Rédacteurs

    Tu est sûr d'avoir mis toute ta classe ?



  • Ouais, sûr


  • Rédacteurs

    Le crash report informe d'un NPE ligne 77 mais il n'y a même pas 77 lignes dans ta classe 😕



  • Ah c'est parce que j'avais des anciens tests que j'ai mis en commentaire et du coup je les ai pas mis dans ce que j'ai copié collé, j'avais pas pensé à ça désolé 😕
    Donc voici ma classe avec les commentaires compris dedans :

    
    package com.Toinou.LifeBarMod;
    
    import java.util.Comparator;
    import java.util.Iterator;
    import java.util.List;
    
    import net.minecraft.client.Minecraft;
    import net.minecraft.client.network.NetHandlerPlayClient;
    import net.minecraft.client.network.NetworkPlayerInfo;
    import net.minecraft.entity.player.EntityPlayer;
    import net.minecraft.scoreboard.ScorePlayerTeam;
    import net.minecraft.util.ChatComponentTranslation;
    import net.minecraft.world.WorldSettings;
    import net.minecraftforge.client.event.RenderGameOverlayEvent;
    import net.minecraftforge.fml.common.eventhandler.SubscribeEvent;
    import net.minecraftforge.fml.relauncher.Side;
    import net.minecraftforge.fml.relauncher.SideOnly;
    
    import com.google.common.collect.ComparisonChain;
    import com.google.common.collect.Ordering;
    
    public class EventClass {
    
        /*@SubscribeEvent
        public void onPlayerHeal(LivingHealEvent e) {
    
            if(e.entity instanceof EntityPlayer) {
    
                EntityPlayer p = (EntityPlayer) e.entity;
    
                float Vie = ((EntityLivingBase) p).getHealth();
                String strVie = String.valueOf(Vie);
                p.addChatMessage(new ChatComponentTranslation(strVie));
    
            }
        }
    
        @SubscribeEvent
        public void onPlayerHurt(LivingHurtEvent e) {
    
            if(e.entity instanceof EntityPlayer) {
    
                EntityPlayer p = (EntityPlayer) e.entity;
    
                float Vie = ((EntityLivingBase) p).getHealth();
                String strVie = String.valueOf(Vie);
                p.addChatMessage(new ChatComponentTranslation(strVie));
    
            }
        }
    
        @SubscribeEvent
        public void onPlayerTickEvent(PlayerTickEvent e) {
    
            String strVie = String.valueOf(Vie);
            String strAncVie = String.valueOf(AncienneVie);
            EntityPlayer p = e.player;
            Vie = p.getHealth();
            String strVie = String.valueOf(Vie);
            p.addChatMessage(new ChatComponentTranslation(strVie));
    
        }*/
    
        @SubscribeEvent
        public void onRenderGameOverlay(RenderGameOverlayEvent e) //J'ai pris cet event parce que c'est un event client et qu'il est exécuter sans aucune action
        {
            Ordering ordering = Ordering.from(new PlayerComparator()); //Pour trier les joueurs, c'est le système de minecraft
            NetHandlerPlayClient nethandler = Minecraft.getMinecraft().thePlayer.sendQueue;
            List list = ordering.sortedCopy(nethandler.func_175106_d());
            Iterator iterator = list.iterator();
    
            while(iterator.hasNext())
            {
                NetworkPlayerInfo playerinfo = (NetworkPlayerInfo)iterator.next();
                EntityPlayer player = Minecraft.getMinecraft().theWorld.getPlayerEntityByUUID(playerinfo.getGameProfile().getId());
                float Vie = player.getHealth();
                String strVie = String.valueOf(Vie);
                Minecraft.getMinecraft().thePlayer.addChatMessage(new ChatComponentTranslation(strVie));
            }
    
        }
    
            @SideOnly(Side.CLIENT)
            static class PlayerComparator implements Comparator // trie un fonction des teams et des modes de jeu (je crois)
            {
                private PlayerComparator() {}
    
                public int comparation(NetworkPlayerInfo p_178952_1_, NetworkPlayerInfo p_178952_2_)
                {
                    ScorePlayerTeam scoreplayerteam = p_178952_1_.getPlayerTeam();
                    ScorePlayerTeam scoreplayerteam1 = p_178952_2_.getPlayerTeam();
                    return ComparisonChain.start().compareTrueFirst(p_178952_1_.getGameType() != WorldSettings.GameType.SPECTATOR, p_178952_2_.getGameType() != WorldSettings.GameType.SPECTATOR).compare(scoreplayerteam != null ? scoreplayerteam.getRegisteredName() : "", scoreplayerteam1 != null ? scoreplayerteam1.getRegisteredName() : "").compare(p_178952_1_.getGameProfile().getName(), p_178952_2_.getGameProfile().getName()).result();
                }
    
                public int compare(Object p_compare_1_, Object p_compare_2_)
                {
                    return comparation((NetworkPlayerInfo)p_compare_1_, (NetworkPlayerInfo)p_compare_2_);
                }
            }
    
    }
    
    

    EDIT : Il y a quelque chose de bizarre, dans Eclipse, la ligne 77 c'est " float Vie = player.getHealth() " et la, la ligne 77, c'est celle d'au dessus