Résolu Problème de lit
-
Bonjour à tous aujourd’hui j’ai un petit problème de lit,
Donc voilà j’ai créé une bague qui permet une fois dans l’inventaire du joueur mort de respawn à l’endroit de sa mort, le code :
public class EmotionLifeEvent { private boolean ring; private BlockPos position; @SubscribeEvent public void whenHurt(LivingAttackEvent e) { if(e.entity instanceof EntityPlayer) { EntityPlayer player = (EntityPlayer)e.entity; BlockPos pos = player.getPosition(); position = pos; // Check All Inventory for(int i = 0; i < player.inventory.getSizeInventory(); i++) { if(player.inventory.getStackInSlot(i) != null && player.inventory.getStackInSlot(i).getItem() == EmotionItems.purpuraRing) ring = true; } } } @SubscribeEvent public void whenSpawn(Clone e) { EntityPlayer player = e.entityPlayer; if(e.wasDeath == true) { if(ring == true) { int posX = position.getX(); int posY = position.getY() + 1; int posZ = position.getZ(); for(int i = 0; i <= 5; ++i) { if(i == 5) { // Prevent The Lava Death player.addPotionEffect(new PotionEffect(Potion.fireResistance.getId(), 800, 0, true, false)); player.setPosition(posX, posY, posZ); ring = false; } } } } } }
Rien de très compliqué en soit, je pense que le code seras clair pour tout le monde. Bon déjà d’une je pense que malheureusement ce code ne tienne pas la route spécialement quand deux joueurs meurs en même temps et même si c’est sûrement la chose la plus rare je pense devoir prévenir ce genre d’éventualité (je pense rajouter un tableau des joueurs et les effacer quand ils respawnent mais je ne suis pas sûr du résultat alors je préfère attendre vos commentaires), second problème et pas des moindres j’ai remarqué en jouant avec que si le point de spawn était déjà définie par un lit la téléportation ne fonctionne plus et je n’ai aucune idée du pourquoi du comment
Donc voilà si quelqu’un à déjà côtoyé ce genre de problème ou est assez pro pour savoir comment le résoudre, merci d’avance !
-
Ton boolean et les pos tu devrais les mettre dans le tag du joueur (player.getEntityData().setBoolean …)
Pour le problème du lit, franchement, je ne sais pas non plus d’où ça vient
Il me semble qu’il y a un event respawn, essaye avec celui-là. -
Alors j’ai essayé ça :
public class EmotionLifeEvent { @SubscribeEvent public void whenHurt(LivingAttackEvent e) { if(e.entity instanceof EntityPlayer) { EntityPlayer player = (EntityPlayer)e.entity; BlockPos pos = player.getPosition(); // Check All Inventory for(int i = 0; i < player.inventory.getSizeInventory(); i++) { if(player.inventory.getStackInSlot(i) != null && player.inventory.getStackInSlot(i).getItem() == EmotionItems.purpuraRing) { player.getEntityData().setBoolean("ring", true); player.getEntityData().setInteger("posX", pos.getX()); player.getEntityData().setInteger("posY", pos.getY()); player.getEntityData().setInteger("posZ", pos.getZ()); } } } } @SubscribeEvent public void whenSpawn(Clone e) { EntityPlayer player = e.entityPlayer; if(e.wasDeath == true) { if(player.getEntityData().getBoolean("ring") == true) { for(int i = 0; i <= 5; ++i) { if(i == 5) { // Prevent The Lava Death player.addPotionEffect(new PotionEffect(Potion.fireResistance.getId(), 800, 0, true, false)); player.setPosition(player.getEntityData().getInteger("posX"), player.getEntityData().getInteger("posY"), player.getEntityData().getInteger("posZ")); player.getEntityData().setBoolean("ring", false); } } } } } }
Mais maintenant ça ne marche plus du tout aurais-je fais une erreur ? (A la base je ne pensais pas qu’on pouvais utiliser entity data sur un joueur alors j’ai pue faire une bêtise :S) Sinon pour les events de respawn j’ai essayé “LivingSpawnEvent” mais aucune idée si ça fonctionne puisque qu’à cause du code que j’ai rajouté ça ne fonctionne plus du tout ^^’
Ps: Pour le lit j’avais essayé :
player.setSpawnPoint(position, true);
Et d’augmenter le timer mais ça n’a pas fonctionné, le lit prend le devant
-
Utilise le LivingDeathEvent pour la mort. Le == true est inutile puisque c’est un booléen.
à quoi sert ce code ?
for(int i = 0; i <= 5; ++i) { if(i == 5) { // Prevent The Lava Death player.addPotionEffect(new PotionEffect(Potion.fireResistance.getId(), 800, 0, true, false)); player.setPosition(player.getEntityData().getInteger("posX"), player.getEntityData().getInteger("posY"), player.getEntityData().getInteger("posZ")); player.getEntityData().setBoolean("ring", false); } }
-
Utilise if(event.original.getBoolean(“ring”))
-
Je sais bien mais ça me parait plus clair comme ça ,) Il sert à ajouter un effet de potion de protection au feu au cas où le joueur est mort dans de la lave (je voulais l’enfermer dans une cage de verre mais il étais téléporté au dessus et puis ça marche très bien comme ça alors ^^), téléporte le joueur à la position de sa mort et initialise la valeur “ring” à false.
Ps: Le LivingDeathEvent :
/** * LivingDeathEvent is fired when an Entity dies. * This event is fired whenever an Entity dies in * EntityLivingBase#onDeath(DamageSource), * EntityPlayer#onDeath(DamageSource), and * EntityPlayerMP#onDeath(DamageSource). * * This event is fired via the {@link ForgeHooks#onLivingDeath(EntityLivingBase, DamageSource)}. * * {@link #source} contains the DamageSource that caused the entity to die. * * This event is {@link Cancelable}. * If this event is canceled, the Entity does not die. * * This event does not have a result. {@link HasResult} * * This event is fired on the {@link MinecraftForge#EVENT_BUS}. **/
Ce déclenche à la mort est non au spawn
-
Robin, j’ai utilisé pas mal de System.out.print() tous relativement intéressant. D’une première part la valeur “ring” est égal à false lors du deuxième event, j’ai donc placé un print lors de la condition :
if(player.inventory.getStackInSlot(i) != null && player.inventory.getStackInSlot(i).getItem() == EmotionItems.purpuraRing) {}
Et celle-ci ce lance bien conformément à ce que je lui demande, j’ai ensuite placé un print pour connaitre la valeur “ring” à la fin de cette condition comme ça :
if(player.inventory.getStackInSlot(i) != null && player.inventory.getStackInSlot(i).getItem() == EmotionItems.purpuraRing) { player.getEntityData().setBoolean("ring", true); player.getEntityData().setInteger("posX", pos.getX()); player.getEntityData().setInteger("posY", pos.getY()); player.getEntityData().setInteger("posZ", pos.getZ()); System.out.print(player.getEntityData().getBoolean("ring")); }
Mais ce dernier n’apparait pas dans la console, je suppose donc que l’erreur viens de là.
-
Je parle pour le premier événement.
Ce code ne fait absolument rien : supprime la boucle.
for(int i = 0; i <= 5; ++i) // Tu fais une boucle qui va jusqu'à 5 { if(i == 5) // Mais tu veux que ce code soit appelé seulement une fois arrivé à 5 donc la boucle est inutile { // De plus tu n'utilises pas la variable i // Prevent The Lava Death player.addPotionEffect(new PotionEffect(Potion.fireResistance.getId(), 800, 0, true, false)); player.setPosition(player.getEntityData().getInteger("posX"), player.getEntityData().getInteger("posY"), player.getEntityData().getInteger("posZ")); player.getEntityData().setBoolean("ring", false); } }
Pour l’événement de spawn, tu devrais utiliser le LivingSpawnEvent ou le EntityJoinWorldEvent.
-
Scarex : Ah oui le premier, justement les deux fonctionnes alors je vais rester comme ça si ça ne pose pas de problème ^^ Ensuite j’ai rajouté ce petit timer car sinon le jeu crashait quand j’essayais de téléporter le joueur en même temps que le monde au point de spawn initiale, ensuite comme je l’ai dis j’ai essayé le “LivingSpawnEvent” et je le remettrais plus tard si ça ne fonctionne pas comme ça mais pour le moment l’erreur ne viens pas de là je le crains
-
Renvoi ton code.
-
public class EmotionLifeEvent { @SubscribeEvent public void whenHurt(LivingAttackEvent e) { if(e.entity instanceof EntityPlayer) { EntityPlayer player = (EntityPlayer)e.entity; BlockPos pos = player.getPosition(); // Check All Inventory for(int i = 0; i < player.inventory.getSizeInventory(); i++) { if(player.inventory.getStackInSlot(i) != null && player.inventory.getStackInSlot(i).getItem() == EmotionItems.purpuraRing) { player.getEntityData().setBoolean("ring", true); player.getEntityData().setInteger("posX", pos.getX()); player.getEntityData().setInteger("posY", pos.getY()); player.getEntityData().setInteger("posZ", pos.getZ()); System.out.print(player.getEntityData().getBoolean("ring")); } } } } @SubscribeEvent public void whenSpawn(Clone e) { EntityPlayer player = e.original; if(e.wasDeath == true) { if(player.getEntityData().getBoolean("ring")) { for(int i = 0; i <= 5; ++i) { if(i == 5) { // Prevent The Lava Death player.addPotionEffect(new PotionEffect(Potion.fireResistance.getId(), 800, 0, true, false)); player.setPosition(player.getEntityData().getInteger("posX"), player.getEntityData().getInteger("posY"), player.getEntityData().getInteger("posZ")); player.getEntityData().setBoolean("ring", false); } } } } } }
-
Tu n’as pas supprimé la boucle. Regarde jusqu’où le code va et fait une System.out.println du tag compound du joueur.
-
Déjà expliqué et déjà fais ,)
-
moi, j’ai une question. Si le joueur meurt dans le nether ou l’end ?
-
Évitons les questions délicates veut tu x) Je ferais une conditions plus tard ça posera aucun problème d’abord il faudrait régler le problème précédemment cité.
-
Tu as expliqué pourquoi tu mettais un effet de fire resistance, pas pourquoi tu utilises une boucle inutile.
Où est placé ton ring ? Est-ce bien l’item purpuraRing et non un item extends purpuraRing ? Rajouter un System.out.println dans ta boucle pour afficher le contenu du slot et son index.
-
Si justement j’ai expliqué ça aussi ,) Et ça fonctionne très bien comme je l’ai écris aussi, l’erreur ne viens pas de là. Je vais devoir me citer je crois ^^
-
Au lieu de mettre cette boucle tu devrais faire un thread.
-
J’avais crue voir ça pour faire un timer oui, mais si ça fonctionne comme ça je me suis dis que c’était très bien, je le modifierais à l’occasion.
-
@‘SCAREX’:
Où est placé ton ring ? Est-ce bien l’item purpuraRing et non un item extends purpuraRing ? Rajouter un System.out.println dans ta boucle pour afficher le contenu du slot et son index.
Et pour cette question ?