Résolu Loot d'un MobCustom/LivingDeathEvent
-
Salut, je reviens sur un détail qui me perturbe.
On m’avait aidé pour faire en sorte que lors de la mort d’un certain mob (j’en ai 3 différents mais même principe), il loot un item parmi une liste.
Ma liste fait 100 items, avec 4 items différents.
1 fois l’item A
5 fois l’item B
10 fois l’item C
le reste l’item DMon problème n’est pas les probabilités de loot, mais que les mobs ne droppent pas toujours à leur mort.
:::
public static ItemStack[] randItems = new ItemStack[] { new ItemStack(ModPg2.itemRandomMunition, 1), new ItemStack(ModPg2.itemRandomMunition, 1), new ItemStack(ModPg2.itemRandomMunition, 1), new ItemStack(ModPg2.itemRandomMunition, 1), new ItemStack(ModPg2.itemRandomMunition, 1), new ItemStack(ModPg2.itemRandomMunition, 1), new ItemStack(ModPg2.itemRandomMunition, 1), new ItemStack(ModPg2.itemRandomMunition, 1), new ItemStack(ModPg2.itemRandomMunition, 1), new ItemStack(ModPg2.itemRandomMunition, 1), new ItemStack(ModPg2.itemRandomMunition, 1), new ItemStack(ModPg2.itemRandomMunition, 1), new ItemStack(ModPg2.itemRandomMunition, 1), new ItemStack(ModPg2.itemRandomMunition, 1), new ItemStack(ModPg2.itemRandomMunition, 1), new ItemStack(ModPg2.itemRandomMunition, 1), new ItemStack(ModPg2.itemRandomMunition, 1), new ItemStack(ModPg2.itemRandomMunition, 1), new ItemStack(ModPg2.itemRandomMunition, 1), new ItemStack(ModPg2.itemRandomMunition, 1), new ItemStack(ModPg2.itemRandomMunition, 1), new ItemStack(ModPg2.itemRandomMunition, 1), new ItemStack(ModPg2.itemRandomMunition, 1), new ItemStack(ModPg2.itemRandomMunition, 1), new ItemStack(ModPg2.itemRandomMunition, 1), new ItemStack(ModPg2.itemRandomMunition, 1), new ItemStack(ModPg2.itemRandomMunition, 1), new ItemStack(ModPg2.itemRandomMunition, 1), new ItemStack(ModPg2.itemRandomMunition, 1), new ItemStack(ModPg2.itemRandomMunition, 1), new ItemStack(ModPg2.itemMetadata, 1, 0), new ItemStack(ModPg2.itemRandomMunition, 1), new ItemStack(ModPg2.itemRandomMunition, 1), new ItemStack(ModPg2.itemRandomMunition, 1), new ItemStack(ModPg2.itemRandomMunition, 1), new ItemStack(ModPg2.itemRandomMunition, 1), new ItemStack(ModPg2.itemRandomMunition, 1), new ItemStack(ModPg2.itemRandomMunition, 1), new ItemStack(ModPg2.itemRandomMunition, 1), new ItemStack(ModPg2.itemRandomMunition, 1), new ItemStack(ModPg2.itemMetadata, 1, 0), new ItemStack(ModPg2.itemRandomMunition, 1), new ItemStack(ModPg2.itemRandomMunition, 1), new ItemStack(ModPg2.itemRandomMunition, 1), new ItemStack(ModPg2.itemRandomMunition, 1), new ItemStack(ModPg2.itemRandomMunition, 1), new ItemStack(ModPg2.itemRandomMunition, 1), new ItemStack(ModPg2.itemRandomMunition, 1), new ItemStack(ModPg2.itemRandomMunition, 1), new ItemStack(ModPg2.itemRandomMunition, 1), new ItemStack(ModPg2.itemMetadata, 1, 0), new ItemStack(ModPg2.itemRandomMunition, 1), new ItemStack(ModPg2.itemRandomMunition, 1), new ItemStack(ModPg2.itemRandomMunition, 1), new ItemStack(ModPg2.itemRandomMunition, 1), new ItemStack(ModPg2.itemRandomMunition, 1), new ItemStack(ModPg2.itemRandomMunition, 1), new ItemStack(ModPg2.itemRandomMunition, 1), new ItemStack(ModPg2.itemRandomMunition, 1), new ItemStack(ModPg2.itemRandomMunition, 1), new ItemStack(ModPg2.itemMetadata, 1, 0), new ItemStack(ModPg2.itemRandomMunition, 1), new ItemStack(ModPg2.itemRandomMunition, 1), new ItemStack(ModPg2.itemRandomMunition, 1), new ItemStack(ModPg2.itemRandomMunition, 1), new ItemStack(ModPg2.itemRandomMunition, 1), new ItemStack(ModPg2.itemRandomMunition, 1), new ItemStack(ModPg2.itemRandomMunition, 1), new ItemStack(ModPg2.itemRandomMunition, 1), new ItemStack(ModPg2.itemRandomMunition, 1), new ItemStack(ModPg2.itemMetadata, 1, 0), new ItemStack(ModPg2.itemRandomMunition, 1), new ItemStack(ModPg2.itemRandomMunition, 1), new ItemStack(ModPg2.itemRandomMunition, 1), new ItemStack(ModPg2.itemRandomMunition, 1), new ItemStack(ModPg2.itemRandomMunition, 1), new ItemStack(ModPg2.itemRandomMunition, 1), new ItemStack(ModPg2.itemRandomMunition, 1), new ItemStack(ModPg2.itemRandomMunition, 1), new ItemStack(ModPg2.itemRandomMunition, 1), new ItemStack(ModPg2.itemMetadata, 1, 1), new ItemStack(ModPg2.itemRandomMunition, 1), new ItemStack(ModPg2.itemRandomMunition, 1), new ItemStack(ModPg2.itemRandomMunition, 1), new ItemStack(ModPg2.itemRandomMunition, 1), new ItemStack(ModPg2.itemRandomMunition, 1), new ItemStack(ModPg2.itemRandomMunition, 1), new ItemStack(ModPg2.itemRandomMunition, 1), new ItemStack(ModPg2.itemRandomMunition, 1), new ItemStack(ModPg2.itemRandomMunition, 1), new ItemStack(ModPg2.itemMetadata, 1, 2), new ItemStack(ModPg2.itemMetadata, 1, 2), new ItemStack(ModPg2.itemMetadata, 1, 2), new ItemStack(ModPg2.itemMetadata, 1, 2), new ItemStack(ModPg2.itemMetadata, 1, 2), new ItemStack(ModPg2.itemMetadata, 1, 2), new ItemStack(ModPg2.itemMetadata, 1, 2), new ItemStack(ModPg2.itemMetadata, 1, 2), new ItemStack(ModPg2.itemMetadata, 1, 2), new ItemStack(ModPg2.itemMetadata, 1, 2), }; @SubscribeEvent public void onEntityKilled(LivingDeathEvent event) { if(!event.entityLiving.worldObj.isRemote && (event.entityLiving instanceof EntityMobGangster || event.entityLiving instanceof EntityMobGangster2)) { for(int j = 0 ; j < 2; ++j) { event.entityLiving.entityDropItem(randItems[event.entityLiving.worldObj.rand.nextInt(randItems.length)], 1); } } if(!event.entityLiving.worldObj.isRemote && event.entityLiving instanceof EntityMobGangster3) { for(int j = 0 ; j < 3; ++j) { event.entityLiving.entityDropItem(randItems[event.entityLiving.worldObj.rand.nextInt(randItems.length)], 1); } } }
:::
Voilà donc logiquement à chaque fois les deux premiers mobs devraient drop 2 items au hasard parmi la liste et le troisième lui devrait en dropper 3 différents.
Eh bien ce n’est pas toujours le cas. -
Il faudrait que tu débug ton code en ajoutant des println de la valeur itemstack. Et autre chose traitant de ton tableau, 100 item dans un tableau ! C’est vraiment pas l’idéal, tu devrais faire un système de pourcentage avec la classe Random
-
Alors, on m’a dis ça en effet.
Pour le tableau je ferais ça de la manière la plus appropriée si on m’indique la marche à suivre (si tu as un sujet traitant de ça je serais ravi car ce tableau de 100 est une façon de faire que j’ai trouvé ailleurs sur le forum)Si je passe par un event c’est que je ne sais pas faire récupérer un ItemStack dans la fonction ```java
public EntityItem dropItem(Item p_145779_1_, int p_145779_2_)Sinon pour le débug j'ai fais ça: ::: ```java public static ItemStack[] randItems = new ItemStack[] { new ItemStack(ModPg2.itemRandomMunition, 1), new ItemStack(ModPg2.itemMetadata, 1, 0), new ItemStack(ModPg2.itemMetadata, 1, 1), new ItemStack(ModPg2.itemMetadata, 1, 2), }; @SubscribeEvent public void onEntityKilled(LivingDeathEvent event) { if(!event.entityLiving.worldObj.isRemote && (event.entityLiving instanceof EntityMobGangster || event.entityLiving instanceof EntityMobGangster2)) { for(int j = 0 ; j < 2; ++j) { event.entityLiving.entityDropItem(randItems[event.entityLiving.worldObj.rand.nextInt(randItems.length)], 1); System.out.println(randItems[event.entityLiving.worldObj.rand.nextInt(randItems.length)]); } } if(!event.entityLiving.worldObj.isRemote && event.entityLiving instanceof EntityMobGangster3) { for(int j = 0 ; j < 3; ++j) { event.entityLiving.entityDropItem(randItems[event.entityLiving.worldObj.rand.nextInt(randItems.length)], 1); System.out.println(randItems[event.entityLiving.worldObj.rand.nextInt(randItems.length)]); } } }
:::
Donc mon tableau n’a plus que 4 choses dedans.
Et là… Gros wtf je dirais."Apparement une fois que chaque élément du tableau a été loot au moins une fois, il n’est plus “lootable”.
Alors si je fais spawn 20mobs d’un coup et qu’il ne reste plus qu’un élément qui n’a pas été loot, il sera loot suivant sa proba (donc ici 1 chance sur 4) par les 20 mobs."
De plus, quand je tue un mob, j’ai ça par exemple dans ma console:
[20:08:16] [Server thread/INFO] [STDOUT]: [fr.powergame.modpg2.common.LivingEventHandler:onEntityKilled:43]: 1xitem.itemMetadata@2
[20:08:16] [Server thread/INFO] [STDOUT]: [fr.powergame.modpg2.common.LivingEventHandler:onEntityKilled:43]: 1xitem.itemMetadata@2
Alors que comme loot en jeu j’ai un itemMetadata de metadata 1 et l’autre 2 (alors que dans la console les deux sont de metadata 2)
[20:08:16] [Server thread/INFO] [STDOUT]: [fr.powergame.modpg2.common.LivingEventHandler:onEntityKilled:43]: 1xitem.itemMetadata@2
[20:08:16] [Server thread/INFO] [STDOUT]: [fr.powergame.modpg2.common.LivingEventHandler:onEntityKilled:43]: 1xitem.itemMetadata@2
[20:10:25] [Server thread/INFO] [STDOUT]: [fr.powergame.modpg2.common.LivingEventHandler:onEntityKilled:43]: 1xitem.itemRandomMunition@0
[20:10:25] [Server thread/INFO] [STDOUT]: [fr.powergame.modpg2.common.LivingEventHandler:onEntityKilled:43]: 0xitem.itemMetadata@1
[20:10:32] [Server thread/INFO] [STDOUT]: [fr.powergame.modpg2.common.LivingEventHandler:onEntityKilled:43]: 0xitem.itemMetadata@2
[20:10:32] [Server thread/INFO] [STDOUT]: [fr.powergame.modpg2.common.LivingEventHandler:onEntityKilled:43]: 0xitem.itemMetadata@1
[20:10:45] [Server thread/INFO] [STDOUT]: [fr.powergame.modpg2.common.LivingEventHandler:onEntityKilled:43]: 1xitem.itemRandomMunition@0
[20:10:45] [Server thread/INFO] [STDOUT]: [fr.powergame.modpg2.common.LivingEventHandler:onEntityKilled:43]: 1xitem.itemRandomMunition@0
[20:12:08] [Server thread/INFO] [STDOUT]: [fr.powergame.modpg2.common.LivingEventHandler:onEntityKilled:43]: 0xitem.itemMetadata@2
[20:12:08] [Server thread/INFO] [STDOUT]: [fr.powergame.modpg2.common.LivingEventHandler:onEntityKilled:43]: 0xitem.itemMetadata@1
[20:12:13] [Server thread/INFO] [STDOUT]: [fr.powergame.modpg2.common.LivingEventHandler:onEntityKilled:43]: 0xitem.itemMetadata@2
[20:12:13] [Server thread/INFO] [STDOUT]: [fr.powergame.modpg2.common.LivingEventHandler:onEntityKilled:43]: 0xitem.itemMetadata@0
[20:12:13] [Server thread/INFO] [STDOUT]: [fr.powergame.modpg2.common.LivingEventHandler:onEntityKilled:43]: 0xitem.itemMetadata@2
[20:12:13] [Server thread/INFO] [STDOUT]: [fr.powergame.modpg2.common.LivingEventHandler:onEntityKilled:43]: 0xitem.itemMetadata@0Voilà l’ensemble de mon test.
A chaque fois la mort du mob entraine deux loots.
Dès qu’un loot de chaque est fait cela passe à “0xitem…” et donc rien n’est plus loot.
Et[20:10:45] [Server thread/INFO] [STDOUT]: [fr.powergame.modpg2.common.LivingEventHandler:onEntityKilled:43]: 1xitem.itemRandomMunition@0
[20:10:45] [Server thread/INFO] [STDOUT]: [fr.powergame.modpg2.common.LivingEventHandler:onEntityKilled:43]: 1xitem.itemRandomMunition@0
c’est l’exemple même où, quand un dernier élément n’a pas été loot, il peut être loot 2fois d’un coup(ou Xfois d’un coup) et ne l’est plus du tout après, comme le reste.
-
Comme tu n’as que 4 item le mieux c’est de générer un nombre entre 0 et 100.
Si ce nombre est 0, tu drop l’item A.
Si ce nombre est supérieur à 0 et inférieur ou égal à 5 tu drop l’item B.
Si ce nombre est supérieur à 5 et inférieur ou égal à 15 tu drop l’item C.
Sinon tu drop d’item D. -
Ouki super, faire comme ça c’est tellement plus simple (pour moi) surtout x]
:::
@SubscribeEvent public void onEntityKilled(LivingDeathEvent event) { Random rand = new Random(); ItemStack stack1 = new ItemStack(ModPg2.itemRandomMunition, 1); ItemStack stack2 = new ItemStack(ModPg2.itemMetadata, 1, 0); ItemStack stack3 = new ItemStack(ModPg2.itemMetadata, 1, 1); ItemStack stack4 = new ItemStack(ModPg2.itemMetadata, 1, 2); if(!event.entityLiving.worldObj.isRemote && (event.entityLiving instanceof EntityMobGangster || event.entityLiving instanceof EntityMobGangster2)) { for(int j = 0 ; j < 2; ++j) { if (rand.nextInt(99) == 0) { // 1/100 event.entityLiving.entityDropItem(stack3, 1); System.out.println(stack3); } if (rand.nextInt(99) > 0 && rand.nextInt(99) <= 5) { // 5/100 event.entityLiving.entityDropItem(stack2, 1); System.out.println(stack2); } if (rand.nextInt(99) > 5 && rand.nextInt(99) <= 15) { // 10/100 event.entityLiving.entityDropItem(stack4, 1); System.out.println(stack4); } if (rand.nextInt(99) > 15) { // 84/100 event.entityLiving.entityDropItem(stack1, 1); System.out.println(stack1); } } } }
:::
Chose que je ne comprend pas, il arrive qu’un mob (EntityMobGangster1 ici) loot 3items. Alors que la boucle for ne lui permet d’en loot que 2 logiquement.
Caractéristique, cela arrive souvent (tout le temps je ne sais pas, je teste) quand un item à “faible” proba est loot (ceux ayant moins de 10 chances sur 100 d’être loot). -
Car tu créé un int random à chaque fois.
Il faut réutiliser le même :int randInt = rand.nextInt(99); if (randInt == 0) { event.entityLiving.entityDropItem(stack3, 1); System.out.println(stack3); } if (randInt > 0 && randInt <= 5) ….
-
Ouki merci, je passe en résolu
Merci bien pour cet éclairage sur les proba, très utile.
Je me suis rendu compte également que rand.nextInt(99) va de 0 à 99 (99 non compris), donc je repasse sur du rand.nextInt(100)
J’avais cru bien faire. -
En effet il faut mettre 100.