Loot d'un MobCustom/LivingDeathEvent


  • Correcteurs

    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 D

    Mon problème n'est pas les probabilités de loot, mais que les mobs ne droppent pas toujours à leur mort.

    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 😃


  • Correcteurs

    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:
    
    
    
    

    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@0

    Voilà 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.


  • Administrateurs

    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.


  • Correcteurs

    Ouki super, faire comme ça c'est tellement plus simple (pour moi) surtout x]

    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).


  • Administrateurs

    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)
    ….
    

  • Correcteurs

    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.


  • Administrateurs

    En effet il faut mettre 100.