Problème de lit
-
Utilise un thread pour tp au bout de une seconde.
-
Dans le code que je t’ai donné, le joueur est téléporté quand il spawn même s’il a un lit.
-
Robin : Malheureusement le thread ne fait que retarder le spawn d’une seconde
Et même avec l’autre event ça ne fonctionne pas :CScarex : Chez moi ça ne fonctionne toujours pas

-
Tu as bien mis exactement le même code ?
-
Oui Scarex, complétement identique

-
Tu as bien pensé à mettre event.entityPlayer pour le setPosition, tu as l’effet de fire resistance ?
-
Oui tout fonctionne très bien, la téléportation sans le lit et le fire resistance dans tous les cas. J’ai pris le temps aussi de rajouter cette condition pour pallier au problème éventuelle et ça fonctionne parfaitement :
if(player.worldObj.provider.getDimensionId() == 0){}Dans le pire des cas sinon on vas pas débattre pendant une heure pour un petit problème comme ça et puis tempi.
-
Vérifier la version de Forge que vous utilisez chacun.
-
“forge-1.8-11.14.3.1449”
-
1.8 11.14.1.1336 : je l’ai mis sur mon mod de test que je ne mets pas à jour souvent. Je mets à jour mon workspace.
-
Dans ce cas faut check s’il n’y a pas eu un changement du côté de Forge.
-
1.8 11.14.3.1450 : fonctionne, le problème vient de toi. As-tu bien enregistré l’événement avec MinecraftForge et non FMLComonHandler ?
Je te renvois le code utilisé :
@SubscribeEvent public void onLivingDeath(LivingDeathEvent event) { if (event.entityLiving instanceof EntityPlayer) { EntityPlayer player = (EntityPlayer) event.entityLiving; for (int i = 0; i < player.inventory.getSizeInventory(); i++) { if (player.inventory.getStackInSlot(i) != null && player.inventory.getStackInSlot(i).getItem() == Items.apple) { BlockPos pos = player.getPosition(); 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 onEntitySpawn(PlayerEvent.Clone event) { if (event.wasDeath) { EntityPlayer player = event.original; if (player.getEntityData().getBoolean("ring")) { event.entityPlayer.addPotionEffect(new PotionEffect(Potion.fireResistance.getId(), 800, 0, true, false)); event.entityPlayer.setPosition(player.getEntityData().getInteger("posX"), player.getEntityData().getInteger("posY"), player.getEntityData().getInteger("posZ")); } } } -
Oui heureusement que oui ^^’ Et j’ai fais du copier coller, mais vraiment, pourtant quand on définie un point de spawn avec le lit et qu’ensuite on essaye de ce suicider avec la bague dans l’inventaire rien à faire la téléportation ne fonctionne pas :C
Ps: J’ai update vers la dernière version de forge mais même dans l’autre aussi ça ne marchais pas alors il doit vraiment y avoir un problème quelque pars.
-
Effectivement, j’ai regardé un peu le code, et en fait le clone est appelé après la téléportation au spawn mais avant la téléportation au lit.
La seule solution que j’ai pu trouvé c’est d’utiliser le PlayerRespawnEvent de fml qui est appelé après, le seul problème c’est que les NBT tags ne sont pas clonés avec, il faut donc utiliser le clone event pour copier les NBT dans les tags du nouveau joueur pour ensuite les utiliser dans le PlayerRespawnEvent.
-
PlayerRespawnEvent vient aussi de Forge non ?
-
Euh en tout cas il est dans le package de fml.
-
Alors du coup j’ai essayé ça :
public class EmotionLifeEvent { @SubscribeEvent public void onLivingDeath(LivingDeathEvent e) { if(e.entityLiving instanceof EntityPlayer) { EntityPlayer player = (EntityPlayer)e.entityLiving; for(int i = 0; i < player.inventory.getSizeInventory(); i++) { if(player.inventory.getStackInSlot(i) != null && player.inventory.getStackInSlot(i).getItem() == EmotionItems.purpuraRing) { BlockPos pos = player.getPosition(); 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 onEntitySpawn(PlayerEvent.Clone e) { if(e.wasDeath) { EntityPlayer player = e.original; if(player.getEntityData().getBoolean("ring")) { e.entityPlayer.getEntityData().setBoolean("ring", player.getEntityData().getBoolean("ring")); e.entityPlayer.getEntityData().setInteger("posX", player.getEntityData().getInteger("posX")); e.entityPlayer.getEntityData().setInteger("posY", player.getEntityData().getInteger("posY")); e.entityPlayer.getEntityData().setInteger("posZ", player.getEntityData().getInteger("posZ")); } } } @SubscribeEvent public void onEntityWake(PlayerRespawnEvent e) { EntityPlayer player = e.player; if(player.getEntityData().getBoolean("ring")) { 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")); } } }Mais le dernier événement “PlayerRespawnEvent” n’est pas appelé du tout je suppose donc qu’il s’enregistre avec :
FMLCommonHandler.instance().bus().register();Et non pas :
MinecraftForge.EVENT_BUS.register();Bref sinon c’est pas grave dans le pire des cas la bague ne fonctionnera que si le spawn point est indéfinie et puis tempi un.
-
Il faut l’enregistrer avec FMLCommonHandler et faire attention à ne pas confondre les 2 classes qui s’appellent PlayerEvent.
-
Ah bah c’est bon j’ai réglé le problème je m’apprêtais à laisser tomber mais au final j’ai créé juste une nouvelle classe :
public class EmotionRespawnEvent { @SubscribeEvent public void onEntityWake(PlayerRespawnEvent e) { EntityPlayer player = e.player; System.out.print("PLAYER RESPAWNED AFTER BED !!!!!!"); if(player.getEntityData().getBoolean("ring")) { 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); } } }Que j’ai enregistré comme je l’ai dis avec :
FMLCommonHandler.instance().bus().register();Et au final c’est enfin réglé, alleluia ! Bref merci à vous deux en tous cas, c’est vrai que j’ai du mal à comprendre pourquoi le post à était aussi long mais au final ça marche alors c’est pas grave.
-
Tu peux utiliser la même classe.
