Probleme avec un mob
-
Moi j’aurai utilisé le LivingDeathEvent et dedans j’aurais récupéré les items du joueur pour les passer dans l’inventaire du mob.
-
Sauf qu’une fois mort les items sont aux sol est non dans l’inventaire je me trompe ?
-
@‘EmotionFox’:
Sauf qu’une fois mort les items sont aux sol est non dans l’inventaire je me trompe ?
Non car l’event est déclenché avant ce qui se passe en vanilla (c’est pour ça que si on annule l’event, l’entité ne meurt pas)
-
- A Effacer-
-
@‘SCAREX’:
Tu ne veux pas qu’il récupère que ces Items, que veux-tu qu’il récupère d’autre ?
tout les item dans l inventaire du joueur bouffe, potion etc etc
j ai réussi a créé le tableau:http://puu.sh/ihB1d/934e99f19e.png
mais pas a le faire looter j’ai des array out of bounds exception lorsque le mob meurt je supprime le code du loot et je regarde ça demain a tête reposer trop longtemps que je me bat avec le même morceau de code vais tout casser xD -
Bon allez, je vais t’aider quand même j’aime pas voir les gens galérer 107 ans, l’essentiel c’est d’apprendre de ces erreurs alors relis le code jusqu’à le comprendre (les commentaires sont là pour ça).
public class TutoEventEmo { private BlockPos death; //Position joueur mort private ItemStack inventory[] = {}; //Le tableau @SubscribeEvent public void whenDeath(LivingDeathEvent e) { if(e.entity instanceof EntityPlayer) { EntityPlayer player = (EntityPlayer)e.entity; death = player.getPosition(); for(int i = 0; i < player.inventory.getSizeInventory(); i++) { if(player.inventory.getStackInSlot(i) != null) { inventory = new ItemStack[] {player.inventory.getStackInSlot(i)}; //Ajouter tableau chaque item } } player.inventory.clear(); //Clear inventaire } } @SubscribeEvent public void whenSpawn(Clone e) { if(e.wasDeath == true) //Si joueur est mort { for(int i = 0; i <= 5; i++) { if(i == 5) { EntityPlayer player = e.entityPlayer; World world = player.worldObj; EntityScorpion scorpion = new EntityScorpion(world); scorpion.setPosition(death.getX(), death.getY(), death.getZ()); world.spawnEntityInWorld(scorpion); if(scorpion.isDead) //Si scorpion est mort { for(int j = 0; j < inventory.length; j++) //Selon taille du tableau { player.dropItem(inventory*, true, false); //Drop item du tableau au joueur } } } } } } }Voilà, ça devrait marcher après si il y à des erreurs dis le moi et j’essayerais de t’aider (je suis pas du tout familiarisé au tableau) ,)
-
J’aurai plutôt fait comme ça :
public class TutoEventEmo { private BlockPos death; //Position joueur mort private ItemStack inventory[]; //Le tableau @SubscribeEvent public void whenDeath(LivingDeathEvent e) { if(e.entity instanceof EntityPlayer) { EntityPlayer player = (EntityPlayer)e.entity; death = player.getPosition(); inventory = new ItemStack[player.inventory.getSizeInventory()]; for(int i = 0; i < player.inventory.getSizeInventory(); i++) { if(player.inventory.getStackInSlot(i) != null) { inventory* = player.inventory.getStackInSlot(i); //Ajouter tableau chaque item } } player.inventory.clear(); //Clear inventaire } } @SubscribeEvent public void whenSpawn(Clone e) { if(e.wasDeath == true) //Si joueur est mort { for(int i = 0; i <= 5; i++) { if(i == 5) { EntityPlayer player = e.entityPlayer; World world = player.worldObj; EntityScorpion scorpion = new EntityScorpion(world); scorpion.setPosition(death.getX(), death.getY(), death.getZ()); world.spawnEntityInWorld(scorpion); if(scorpion.isDead) //Si scorpion est mort { for(int j = 0; j < inventory.length; j++) //Selon taille du tableau { player.dropItem(inventory*, true, false); //Drop item du tableau au joueur } } } } } } }ça fonctionnera un peu mieux …
Et la encore le code est perfectible, il faudrait mettre le tableau dans mob en question, sinon il va y avoir des problèmes. -
j’ ai modifier le code car j avait des erreur a BlockPos et dans le dropItem mais ça fonctionne toujours pas et le mob spawn sur le joueur seulement quand il respawn T_T j’ai une idée pour corriger le spawn du mob par contre il drop toujours pas mon tableau
private ItemStack inventory[]; //Le tableau @SubscribeEvent public void whenDeath(LivingDeathEvent e) { if(e.entity instanceof EntityPlayer) { EntityPlayer player = (EntityPlayer)e.entity; inventory = new ItemStack[player.inventory.getSizeInventory()]; for(int i = 0; i < player.inventory.getSizeInventory(); i++) { if(player.inventory.getStackInSlot(i) != null) { inventory* = player.inventory.getStackInSlot(i); //Ajouter tableau chaque item } } player.inventory.clearInventory(null, -1); //Clear inventaire tout les item ingnore les metadata } } @SubscribeEvent public void whenSpawn(Clone e) { if(e.wasDeath == true) //Si joueur est mort { for(int i = 0; i <= 5; i++) { if(i == 5) { EntityPlayer player = e.entityPlayer; World world = player.worldObj; //spawn entityReaper EntityReaper var2 = new EntityReaper(e.entityLiving.worldObj); var2.setLocationAndAngles(e.entityLiving.posX, e.entityLiving.posY, e.entityLiving.posZ, e.entityLiving.rotationYaw, e.entityLiving.rotationPitch); e.entityLiving.worldObj.spawnEntityInWorld(var2); if(var2.isDead) //Si scorpion est mort { for(int j = 0; j < inventory.length; j++) //Selon taille du tableau { player.entityDropItem(inventory*, 0); //Drop item du tableau au joueur } } } } } } }et quand j’utilise le DropItem() il me dit que les arguments son DropItem(Item, int) et considère que le tableau n’est pas un item
-
Ah oui effectivement t’es pas en 1.8 je viens de remarquer seulement ça maintenant, du coup je sais pas désolé mon code est fonctionnelle chez moi mais si on a pas la même version tu m’étonne, mais l’important est quand même là, tu connais les bases et sais comment tu doit faire. Essaye de te renseigner sur ce qui pose problème genre tuto, doc etc…
Ps: Si le monstre pop au joueur c’est parce que t’a pas gardé la pos lors de sa mort et que t’a pas changé les positions pour le spawn du monstre ,)
-
Pour le mob j ai déjà solutionné le problème mais pour le tableau ça marche pas T_T je comprend pas a quoi sert la float dans entityDropItem après le itemStack ;S
pour la fonction DropItem(Item,int) je sait que c’est Item, Nombre
je pense pas a une metadata en Float ce serait plutôt étrange ;S
peut être un probabilité de loot j’avoue que avec tout ces field ça me rend dingue U_uif(var2.isDead) //Si Reaper est mort { System.out.println("lel"); for(int j = 0; j < inventory.length; j++) //Selon taille du tableau { player.entityDropItem(inventory*, 110); //Drop item du tableau au joueur System.out.println(inventory*); } }ne s’execute carrément pas a la mort du mob je creuse un peu on est pret du but
-
Le float est un offset sur l’axe Y, met celui-ci à 0 çà devrait fonctionner.
-
if(var2.isDead) //Si Reaper est mort { System.out.println("lel"); for(int j = 0; j < inventory.length; j++) //Selon taille du tableau { player.entityDropItem(inventory*, 110); //Drop item du tableau au joueur System.out.println(inventory*); } }ce code a l’air de ne pas s’executer la mort du Mob :S
-
Explique moi clairement dans l’ordre des choses ce que tu veux qu’il se passe car je comprends pas trop, voici comment je le comprends :
- Le joueur meurt
- Une nouvelle entité est créée
- L’inventaire du joueur est transféré dans celui du mob
-
Il a était clair au début je trouve :
1. Quand le joueur meurt un monstre apparait sur sa dépouille
2. Quand le joueur respawn et tue le monstre il récupère tout sont inventaire précédemment perdue et non dropé au sol (pour donner un effet de, c’est le monstre qui a tout mangé)Essaye
if(var2.getHealth() == 0) //Si vie monstre = 0 -
j’y avait pas pensez au gethealth j’essaye de-suite
ca fonctionne pas je me demande si le if was dead y est pas pour quelque choses puisque le joueur respawn la condition est rompue le joueur est vivant donc pas moyen d’exécuter le code en desous
Edit: j’ai fait des test et a la condition if(var2.isdead ou var2.getHealth == 0) la condition ne s exécute jamais même si je la déplace en dehors du if wasDead je vais essaye de réécrire différemment le truc pour voir si ça marcheif(e.wasDeath == true) //Si joueur est mort { for(int i = 0; i <= 5; i++) { if(i == 5) { EntityPlayer player = e.entityPlayer; World world = player.worldObj; EntityReaper var2 = new EntityReaper(e.entityLiving.worldObj); var2.setLocationAndAngles(e.entityLiving.posX, e.entityLiving.posY, e.entityLiving.posZ, e.entityLiving.rotationYaw, e.entityLiving.rotationPitch); e.entityLiving.worldObj.spawnEntityInWorld(var2); if(var2.getHealth() == 0) //Si Reaper est mort { System.out.println("lel"); for(int j = 0; j < inventory.length; j++) //Selon taille du tableau { player.entityDropItem(inventory*, 110); //Drop item du tableau au joueur System.out.println(inventory*); } } } } } -
j ai essayer ça toujours rien
if(e.entityLiving instanceof EntityReaper) //Si Reaper est mort { if(!e.entityLiving.worldObj.isRemote){ System.out.println("lel"); for(int j = 0; j < inventory.length; j++) //Selon taille du tableau { player.entityDropItem(inventory*, 0); //Drop item du tableau au joueur System.out.println(inventory*); } }}je pense que le Clone event ne va pas avec T_T et si je le met dans un LivingDeadEvent j ai un cannot cast EntityReaper to EntityPlayer
-
En faite je me rend compte du probléme, dans le “LivingDeathEvent” en dehors de :
if(e.entity instanceof EntityPlayer}Tape une nouvelle condition :
if(e.entity instanceof EntityReaper) { if(var2.isDead) {}Et tout le reste à l’intérieur en oubliant pas de déplacer
private EntityReaper var2Tout en haut puis de le définir au final à sont endroit initial dans la condition if(e.entity instanceof EntityReaper) :
var2 = new EntityReaper(e.entityLiving.worldObj); -
En faite je suis désolé l’erreur viens de “moi”, aucun besoin d’utiliser l’event du respawn juste (j’ai fais l’erreur en pensant que le spawn du mob devait ce faire au spawn du joueur) :
public class EmoBaseEvent { private ItemStack inventory[] = {}; // Le tableau @SubscribeEvent public void whenDeath(LivingDeathEvent e) { EntityPlayer player = (EntityPlayer)e.entity; World world = player.worldObj; EntityScorpion scorpion = new EntityScorpion(world); BlockPos death = player.getPosition(); if(e.entity instanceof EntityPlayer) { inventory = new ItemStack[player.inventory.getSizeInventory()]; for(int i = 0; i < player.inventory.getSizeInventory(); i++) { if(player.inventory.getStackInSlot(i) != null) { inventory* = player.inventory.getStackInSlot(i); // Ajouter tableau chaque item } } player.inventory.clear(); // Clear inventaire scorpion.setPosition(death.getX(), death.getY(), death.getZ()); world.spawnEntityInWorld(scorpion); } if(e.entity instanceof EntityReaper) { for(int j = 0; j < inventory.length; j++) // Selon taille du tableau { player.dropItem(inventory*, true, false); // Drop item du tableau au joueur } } } }Après si tu compte faire pop régulièrement des monstres “Reaper” il serait préférable d’ajouter une condition avec une boolean.
-
Il reste des problèmes avec ce code. Le tableau n’est pas vidé. Si plusieurs joueurs meurt, le contenu de l’un va effacer celui de l’autre.
Il faudrait tout stocker dans l’entité, envoie-moi un zip ou un 7z de ton dossier src je vais regarder de mon côté demain. -
Mon Mod fait plus de 850 classe et je doit avouer que c est pas ultra bien ranger après si tu veut je peut cloner la partie du mob avec l évent citer au dessus je peut le mettre dans un mod plus petit histoire qu tu puisse travailler dessus
Après si tu compte faire pop régulièrement des monstres “Reaper” il serait préférable d’ajouter une condition avec une boolean.
pas besoin le mob sera unique et spawn uniquement a la place du joueur il n’auras pas de spawn naturel
dans mon cas c est pour simuler les zombification du joueur a sa mortle code fonctionne toujours pas ;c
:::–-- Minecraft Crash Report ---- // Oops. Time: 10/06/15 00:16 Description: Ticking memory connection java.lang.ClassCastException: virusz.mob.agressive.EntityReaper cannot be cast to net.minecraft.entity.player.EntityPlayer at virusz.event.StoreStuffEvent.whenDeath(StoreStuffEvent.java:17) at cpw.mods.fml.common.eventhandler.ASMEventHandler_16_StoreStuffEvent_whenDeath_LivingDeathEvent.invoke(.dynamic) at cpw.mods.fml.common.eventhandler.ASMEventHandler.invoke(ASMEventHandler.java:54) at cpw.mods.fml.common.eventhandler.EventBus.post(EventBus.java:138) at net.minecraftforge.common.ForgeHooks.onLivingDeath(ForgeHooks.java:305) at net.minecraft.entity.EntityLivingBase.onDeath(EntityLivingBase.java:982) at net.minecraft.entity.EntityLivingBase.attackEntityFrom(EntityLivingBase.java:940) at net.minecraft.entity.monster.EntityMob.attackEntityFrom(EntityMob.java:84) at net.minecraft.entity.player.EntityPlayer.attackTargetEntityWithCurrentItem(EntityPlayer.java:1386) at net.minecraft.network.NetHandlerPlayServer.processUseEntity(NetHandlerPlayServer.java:881) at net.minecraft.network.play.client.C02PacketUseEntity.processPacket(C02PacketUseEntity.java:51) at net.minecraft.network.play.client.C02PacketUseEntity.processPacket(C02PacketUseEntity.java:69) at net.minecraft.network.NetworkManager.processReceivedPackets(NetworkManager.java:241) at net.minecraft.network.NetworkSystem.networkTick(NetworkSystem.java:182) at net.minecraft.server.MinecraftServer.updateTimeLightAndEntities(MinecraftServer.java:726) at net.minecraft.server.MinecraftServer.tick(MinecraftServer.java:614) at net.minecraft.server.integrated.IntegratedServer.tick(IntegratedServer.java:118) at net.minecraft.server.MinecraftServer.run(MinecraftServer.java:485) at net.minecraft.server.MinecraftServer$2.run(MinecraftServer.java:752) A detailed walkthrough of the error, its code path and all known details is as follows: --------------------------------------------------------------------------------------- -- Head -- Stacktrace: at virusz.event.StoreStuffEvent.whenDeath(StoreStuffEvent.java:17) at cpw.mods.fml.common.eventhandler.ASMEventHandler_16_StoreStuffEvent_whenDeath_LivingDeathEvent.invoke(.dynamic) at cpw.mods.fml.common.eventhandler.ASMEventHandler.invoke(ASMEventHandler.java:54) at cpw.mods.fml.common.eventhandler.EventBus.post(EventBus.java:138) at net.minecraftforge.common.ForgeHooks.onLivingDeath(ForgeHooks.java:305) at net.minecraft.entity.EntityLivingBase.onDeath(EntityLivingBase.java:982) at net.minecraft.entity.EntityLivingBase.attackEntityFrom(EntityLivingBase.java:940) at net.minecraft.entity.monster.EntityMob.attackEntityFrom(EntityMob.java:84) at net.minecraft.entity.player.EntityPlayer.attackTargetEntityWithCurrentItem(EntityPlayer.java:1386) at net.minecraft.network.NetHandlerPlayServer.processUseEntity(NetHandlerPlayServer.java:881) at net.minecraft.network.play.client.C02PacketUseEntity.processPacket(C02PacketUseEntity.java:51) at net.minecraft.network.play.client.C02PacketUseEntity.processPacket(C02PacketUseEntity.java:69) at net.minecraft.network.NetworkManager.processReceivedPackets(NetworkManager.java:241) -- Ticking connection -- Details: Connection: net.minecraft.network.NetworkManager@16a446c0 Stacktrace: at net.minecraft.network.NetworkSystem.networkTick(NetworkSystem.java:182) at net.minecraft.server.MinecraftServer.updateTimeLightAndEntities(MinecraftServer.java:726) at net.minecraft.server.MinecraftServer.tick(MinecraftServer.java:614) at net.minecraft.server.integrated.IntegratedServer.tick(IntegratedServer.java:118) at net.minecraft.server.MinecraftServer.run(MinecraftServer.java:485) at net.minecraft.server.MinecraftServer$2.run(MinecraftServer.java:752) -- System Details -- Details: Minecraft Version: 1.7.10 Operating System: Windows 7 (amd64) version 6.1 Java Version: 1.8.0_45, Oracle Corporation Java VM Version: Java HotSpot(TM) 64-Bit Server VM (mixed mode), Oracle Corporation Memory: 905937736 bytes (863 MB) / 1037959168 bytes (989 MB) up to 1037959168 bytes (989 MB) JVM Flags: 3 total; -Xincgc -Xmx1024M -Xms1024M AABB Pool Size: 0 (0 bytes; 0 MB) allocated, 0 (0 bytes; 0 MB) used IntCache: cache: 0, tcache: 0, allocated: 0, tallocated: 0 FML: MCP v9.05 FML v7.10.85.1291 Minecraft Forge 10.13.2.1291 4 mods loaded, 4 mods active mcp{9.05} [Minecraft Coder Pack] (minecraft.jar) Unloaded->Constructed->Pre-initialized->Initialized->Post-initialized->Available->Available->Available->Available FML{7.10.85.1291} [Forge Mod Loader] (forgeSrc-1.7.10-10.13.2.1291.jar) Unloaded->Constructed->Pre-initialized->Initialized->Post-initialized->Available->Available->Available->Available Forge{10.13.2.1291} [Minecraft Forge] (forgeSrc-1.7.10-10.13.2.1291.jar) Unloaded->Constructed->Pre-initialized->Initialized->Post-initialized->Available->Available->Available->Available VirusZ{indev-0.1} [VirusZ] (bin) Unloaded->Constructed->Pre-initialized->Initialized->Post-initialized->Available->Available->Available->Available Profiler Position: N/A (disabled) Vec3 Pool Size: 0 (0 bytes; 0 MB) allocated, 0 (0 bytes; 0 MB) used Player Count: 1 / 8; [EntityPlayerMP['Player469'/92, l='New World', x=587,50, y=1,00, z=358,74]] Type: Integrated Server (map_client.txt) Is Modded: Definitely; Client brand changed to 'fml,forge':::
