Joueur tp dans un monde au respawn s'il a tué



  • Salut
    J'ai un problème pour le tp dans un monde que j'ai créer.
    J'ai créer une variable qui dit que si le joueur tue un animal, une créature aquatique, une créature ambiante, ça met une variable de type boolean sur true (au départ j'ai fait un int qui ajoute 1, mais pour la suite j'ai mis ça en pensant que c'était ça mon problème). J'ai aussi fait (ou plutôt voulu faire) que si le joueur meurt alors qu'il a tuer une créature autre qu'un monstre (donc si la variable vaut true), ça le tp dans un monde quand il respawn. Mais voilà mon problème : il respawn dans l'Overworld.
    Voilà ce que j'ai mis :

    package This_is_Halloween;
    
    import This_is_Halloween.World.Frightful.TeleporterFrightful;
    import This_is_Halloween.World.Underworld.TeleporterUnderworld;
    import cpw.mods.fml.common.eventhandler.SubscribeEvent;
    import cpw.mods.fml.common.gameevent.PlayerEvent;
    import net.minecraft.client.entity.EntityClientPlayerMP;
    import net.minecraft.client.entity.EntityPlayerSP;
    import net.minecraft.entity.Entity;
    import net.minecraft.entity.EntityAgeable;
    import net.minecraft.entity.passive.EntityAmbientCreature;
    import net.minecraft.entity.passive.EntityAnimal;
    import net.minecraft.entity.passive.EntityWaterMob;
    import net.minecraft.entity.player.EntityPlayer;
    import net.minecraft.entity.player.EntityPlayerMP;
    import net.minecraft.server.MinecraftServer;
    import net.minecraftforge.event.entity.EntityJoinWorldEvent;
    import net.minecraftforge.event.entity.living.LivingDeathEvent;
    import net.minecraftforge.event.entity.living.LivingSpawnEvent;
    
    public class CommonEventHandler {
    
    boolean killed = false;
    
    @SubscribeEvent
    public void OnPlayerKill(LivingDeathEvent event)
    {
    if (event.entity instanceof EntityAmbientCreature && event.source.getEntity() instanceof EntityPlayer)
    {
    killed = true;
    }
    
    else if (event.entity instanceof EntityAnimal && event.source.getEntity() instanceof EntityPlayer)
    {
    killed = true;
    }
    
    else if (event.entity instanceof EntityWaterMob && event.source.getEntity() instanceof EntityPlayer)
    {
    killed = true;
    }
    
    else if (event.entity instanceof EntityAgeable && event.source.getEntity() instanceof EntityPlayer)
    {
    killed = true;
    }
    
    System.out.println(killed);
    }
    
    @SubscribeEvent
    public void OnPlayerDead(LivingSpawnEvent event)
    {
    System.out.println("test fonction");
    if (event.entity != null & event.entity instanceof EntityPlayerMP)
    {
    System.out.println("test joueur 'détécté'");
    if (killed = true)
    {
    System.out.println("test boolean vaut true");
    EntityPlayerMP player = (EntityPlayerMP)event.entity;
    player.mcServer.getConfigurationManager().transferPlayerToDimension(player, This_is_Halloween.dimension2ID, new TeleporterUnderworld(player.mcServer.worldServerForDimension(This_is_Halloween.dimension2ID)));
    killed = false;
    }
    }
    }
    
    }
    
    

    Si vous regarder à la deuxième fonction, vous verrez que la console doit afficher 3 messages différents. Or, vient ici le probème : ça n'affiche que le 1er message. En gros, la fonction marche, mais pas le reste. Le problème doit probablement être au niveau de la condition que le joueur soit EntityPlayerMP. Sauf que c'est censé être ça normalement  😕 . J'ai quand même essayé de remplacer par EntityPlayer, EntityPlayerSP, EntityClientPlayerMP, mais rien.

    Au départ j'avais cru que c'est le tp qui ne marchais pas, mais si il marche bien. J'ai tester de créer un bloc de tp pour y aller et ça m'y emmène bien.

    L'erreur est sur la condition, mais je ne vois pas quoi mettre d'autre

    Si vous savez comment faire pour régler ce bug, ou si vous avez un autre moyen pour faire ce que je veux faire je suis preneur.

    Merci d'avance


  • Administrateurs

    Salut,
    Essaies sinon avec PlayerEvent.Clone en vérifiant que event.wasDeath a pour valeur true.



  • Salut
    Merci. Mais ça marche plus ou moins : quand je tue un animal et que je meurs, je suis tp. C'est bien ce que je voulais. Mais je suis tp dans le Nether. Pourtant le monde marche bien puisque j'ai créer un portail juste pour test et ça m'y emmène bien.
    Le 2ème problème est que quand je meurs sans avoir tuer (donc quand ma variable vaut false), ça me tp quand même dans le nether mais il ne s'affiche pendant une demi-seconde avant de me déconnecter en ayant comme message Illegal Stance. Dans la console, il y a ceci :

    [17:52:36] [Server thread/WARN]: Player735 had an illegal stance: 0.0
    [17:52:36] [Server thread/INFO]: Player735 lost connection: TextComponent{text='Illegal stance', siblings=[], style=Style{hasParent=false, color=null, bold=null, italic=null, underlined=null, obfuscated=null, clickEvent=null, hoverEvent=null}}
    [17:52:36] [Server thread/INFO]: Player735 left the game
    [17:52:36] [Server thread/INFO]: Stopping singleplayer server as player logged out
    

    Déjà je ne comprend pas pourquoi ça veut me tp alors que normalement je doit pas bouger. Ensuite, je vois pas pourquoi ça me dit position illégal

    EDIT : j'ai testé de dire que si la variable vaut false, ça me tp dans l'Overworld au respawn grâce à cette ligne :

    player.mcServer.getConfigurationManager().transferPlayerToDimension(player, 0, new TeleporterUnderworld(player.mcServer.worldServerForDimension(0)));
    
    

    Résultats : dans le jeu, ça me marque que j'ai été déconnecté, mais dans la console ça me marque quand même illegal stance sans que je puisse rien voir en jeu. Du coup, je sais même pas où ça me tp 😕


  • Administrateurs

    Pour le tp c'est en effet étrange. Il faudrait print avant et après le tp la dimension du joueur.

    Et pour la déconnexion c'est pareil, s'il ne devrait pas être tp c'est qu'il y a un problème avec une de tes conditions. Il faut print dans la console les valeurs des booléennes utilisés dans la condition pour comprendre pourquoi ça ne veut pas.



  • Quand la variable vaut true et que je me tue, ça me donne ça (sans déco) :

    true
    [18:20:47] [Server thread/INFO]: Player814 fell out of the world
    [18:20:47] [Client thread/INFO]: [CHAT] Player814 fell out of the world
    [18:20:47] [Client thread/INFO]: [CHAT] Ouch! That looked like it hurt
    [18:20:49] [Server thread/INFO] [STDOUT]: [This_is_Halloween.CommonEventHandler:OnPlayerDead:58]: test boolean vaut true : le joueur a tué, ce n'est pas bien !
    [18:20:49] [Server thread/INFO] [STDOUT]: [This_is_Halloween.CommonEventHandler:OnPlayerDead:61]: est (ou doit être) tp dans l'Underworld
    [18:20:52] [Server thread/INFO]: Saving and pausing game…
    [18:20:52] [Server thread/INFO]: Saving chunks for level 'New World'/Overworld
    [18:20:52] [Server thread/INFO]: Saving chunks for level 'New World'/Nether
    [18:20:52] [Server thread/INFO]: Saving chunks for level 'New World'/The End
    [18:20:52] [Server thread/INFO]: Saving chunks for level 'New World'/Frightful
    [18:20:52] [Server thread/INFO]: Saving chunks for level 'New World'/Underworld
    
    

    et quand la variable vaut false et que je me tue, ça me donne ça (avec déco) :

    false
    [18:23:30] [Server thread/INFO]: Player814 fell out of the world
    [18:23:30] [Client thread/INFO]: [CHAT] Player814 fell out of the world
    [18:23:30] [Client thread/INFO]: [CHAT] Ouch! That looked like it hurt
    false
    false
    [18:23:33] [Server thread/INFO] [STDOUT]: [This_is_Halloween.CommonEventHandler:OnPlayerDead:58]: test boolean vaut true : le joueur a tué, ce n'est pas bien !
    [18:23:33] [Server thread/INFO] [STDOUT]: [This_is_Halloween.CommonEventHandler:OnPlayerDead:61]: est (ou doit être) tp dans l'Underworld
    [18:23:33] [Server thread/WARN]: Fetching addPacket for removed entity
    [18:23:34] [Server thread/WARN]: Player814 had an illegal stance: 0.0
    [18:23:34] [Server thread/WARN]: Player814 had an illegal stance: 0.0
    [18:23:34] [Server thread/WARN]: Player814 had an illegal stance: 0.0
    [18:23:34] [Server thread/WARN]: Player814 had an illegal stance: 0.0
    [18:23:34] [Server thread/WARN]: Player814 had an illegal stance: 0.0
    [18:23:34] [Server thread/INFO]: Player814 lost connection: TextComponent{text='Illegal stance', siblings=[], style=Style{hasParent=false, color=null, bold=null, italic=null, underlined=null, obfuscated=null, clickEvent=null, hoverEvent=null}}
    [18:23:34] [Server thread/INFO]: Player814 left the game
    [18:23:34] [Server thread/INFO]: Stopping singleplayer server as player logged out
    [18:23:34] [Server thread/INFO]: Stopping server
    [18:23:34] [Server thread/INFO]: Saving players
    [18:23:34] [Server thread/INFO]: Saving worlds
    [18:23:34] [Server thread/INFO]: Saving chunks for level 'New World'/Overworld
    [18:23:34] [Server thread/INFO]: Saving chunks for level 'New World'/Nether
    [18:23:34] [Server thread/INFO]: Saving chunks for level 'New World'/The End
    [18:23:34] [Server thread/INFO]: Saving chunks for level 'New World'/Frightful
    [18:23:34] [Server thread/INFO]: Saving chunks for level 'New World'/Underworld
    [18:23:36] [Server thread/INFO] [FML]: Unloading dimension 0
    [18:23:36] [Server thread/INFO] [FML]: Unloading dimension -1
    [18:23:36] [Server thread/INFO] [FML]: Unloading dimension 1
    [18:23:36] [Server thread/INFO] [FML]: Unloading dimension -5
    [18:23:36] [Server thread/INFO] [FML]: Unloading dimension -10
    [18:23:36] [Server thread/INFO] [FML]: Applying holder lookups
    [18:23:36] [Server thread/INFO] [FML]: Holder lookups applied
    

    Et voilà mon code java :

    package This_is_Halloween;
    
    import This_is_Halloween.World.Frightful.TeleporterFrightful;
    import This_is_Halloween.World.Underworld.TeleporterUnderworld;
    import cpw.mods.fml.common.eventhandler.SubscribeEvent;
    import net.minecraft.client.entity.EntityClientPlayerMP;
    import net.minecraft.client.entity.EntityPlayerSP;
    import net.minecraft.entity.Entity;
    import net.minecraft.entity.EntityAgeable;
    import net.minecraft.entity.passive.EntityAmbientCreature;
    import net.minecraft.entity.passive.EntityAnimal;
    import net.minecraft.entity.passive.EntityWaterMob;
    import net.minecraft.entity.player.EntityPlayer;
    import net.minecraft.entity.player.EntityPlayerMP;
    import net.minecraft.server.MinecraftServer;
    import net.minecraftforge.event.entity.EntityJoinWorldEvent;
    import net.minecraftforge.event.entity.living.LivingDeathEvent;
    import net.minecraftforge.event.entity.living.LivingSpawnEvent;
    import net.minecraftforge.event.entity.player.PlayerEvent;
    
    public class CommonEventHandler {
    
    boolean killed = false;
    
    @SubscribeEvent
    public void OnPlayerKill(LivingDeathEvent event)
    {
    if (event.entity instanceof EntityAmbientCreature && event.source.getEntity() instanceof EntityPlayer)
    {
    killed = true;
    }
    
    else if (event.entity instanceof EntityAnimal && event.source.getEntity() instanceof EntityPlayer)
    {
    killed = true;
    }
    
    else if (event.entity instanceof EntityWaterMob && event.source.getEntity() instanceof EntityPlayer)
    {
    killed = true;
    }
    
    else if (event.entity instanceof EntityAgeable && event.source.getEntity() instanceof EntityPlayer)
    {
    killed = true;
    }
    
    System.out.println(killed);
    }
    
    @SubscribeEvent
    public void OnPlayerDead(PlayerEvent.Clone event)
    {
    if (event.wasDeath == true)
    {
    if (killed = true)
    {
    System.out.println("test boolean vaut true : le joueur a tué, ce n'est pas bien !");
    EntityPlayerMP player = (EntityPlayerMP)event.entity;
    player.mcServer.getConfigurationManager().transferPlayerToDimension(player, This_is_Halloween.dimension2ID, new TeleporterUnderworld(player.mcServer.worldServerForDimension(This_is_Halloween.dimension2ID)));
    System.out.println("est (ou doit être) tp dans l'Underworld");
    killed = false;
    }
    else if (killed = false)
    {
    System.out.println("test boolean vaut false : le joueur n'a pas tué, c'est bien !");
    EntityPlayerMP player = (EntityPlayerMP)event.entity;
    player.mcServer.getConfigurationManager().transferPlayerToDimension(player, 0, new TeleporterUnderworld(player.mcServer.worldServerForDimension(0)));
    System.out.println("n'est pas censé être tp");
    }
    }
    }
    
    }
    
    

    Si on compare les 2, on peut voir que quand la variable est false et qu'on meurs, ça éxecute quand même la condition true, comme si la variable vallait true. Ca doit être dû à ça la position illégale. Ca exécute la mauvaise partie du code je ne comprend pas 😕

    Pour ce qui est du tp quand la variable vaut true, c'est un mystère.


  • Administrateurs

    if(killed)
    {

    }
    else
    {
    }
    Ou encore
    if(killed == true)

    == -> test de condition.
    = -> affectation de valeur.



  • Salut
    Désolé de la réponse si tardive
    Effectivement, c'est mieux avec deux égales

    Mais maintenant, que j'ai tué ou pas ça m'emmène dans le Nether (qu'est ce qu'il viens faire là lui ?). Sans doute une erreur dans le code du monde, ou celui du tp.

    Mais j'ai changé mes plans, j'ai une autre idée pour le mod. Dans ma tête ça a l'air bien, j'espère dans le jeu aussi. En tout cas, je n'ai plus besoin d'être tp comme je voulais faire au début de ce post.

    Merci pour tes réponses 🙂

    PS : du coup, j'en fais quoi du topic ? je le met en résolu ou pas (vu que ça bug encore) ?



  • Sans suite conviendrait je pense

    Envoyé de mon RAINBOW LITE 4G en utilisant Tapatalk