• Register
    • Login
    • Search
    • Recent
    • Tags
    • Popular
    • Users
    • Groups

    Solved Donner un random item au onItemRightClick

    1.7.x
    1.7.2
    3
    10
    2407
    Loading More Posts
    • Oldest to Newest
    • Newest to Oldest
    • Most Votes
    Reply
    • Reply as topic
    Log in to reply
    This topic has been deleted. Only users with topic management privileges can see it.
    • L
      Laserflip33 last edited by

      Bonjour, je voudrais obtenir un random item parmi une liste de 100 items et également deux items qui eux sont donnés de toute façon.

      Donc :

      • Right click avec l’item en question = 1 Random item (parmi une liste prédéfinie de 100) + 1 Item défini + 1 Item défini

      Pour l’instant, j’ai ceci comme code :

      import net.minecraft.entity.player.EntityPlayer;
      import net.minecraft.init.Items;
      import net.minecraft.item.Item;
      import net.minecraft.item.ItemStack;
      import net.minecraft.world.World;
      
      public class Paquet extends Item
      {
      public Paquet()
         {
      
         }
      
      public ItemStack onItemRightClick(ItemStack stack, World world, EntityPlayer player) {
      if(!world.isRemote)
      {
      player.dropItem(ModPhenix.vide, 1);
      player.dropItem(ModPhenix.chocolat, 1);
             player.setCurrentItemOrArmor(0, null);
             }
         return super.onItemRightClick(stack, world, player);
      }
      
      }
      

      La question se pose donc au niveau du random :

      • Comment définir la liste d’items random?
      • Comment give dans l’inventaire l’item en question
      • Comment faire pour que certains items soient plus rares que d’autre

      Désolé pour la requête un peu compliquée…

      Merci d’avance! 🙂

      1 Reply Last reply Reply Quote 0
      • robin4002
        robin4002 Moddeurs confirmés Rédacteurs Administrateurs last edited by

        Tu peux faire un tableau avec tous tes items :
        public static Item[] randItems = new Item[]{ClassePrincipale.item1, ClassePrincipale.item2 …};
        Ensuite pour le random

        Item randItem = randItems[world.rand.nextInt(randItems.lenth)]; récupère un item aléatoirement.
        if (!player.inventory.addItemStackToInventory(new ItemStack(randItem))) // ajoute l'item dans l'inventaire
        {
              player.dropItem(randItem, 1); // sauf si son inventaire est plein, on le drop.
        }
        
        

        Par contre pour gérer un système de probabilité c’est plus complexe.
        La façon la plus simple est de mettre deux fois un item dans le tableau pour avoir deux fois plus de chance de l’avoir, etc … Mais le code va devenir très vite illisible. (et bonjour l’optimisation si tu gère des grosses différences de proba (exemple un item qui a 1 chance/10 et un autre qui a une chance/1000).
        Il y a d’autre façon de gérer ça, via une HashMap d’item et d’int pour la proba, ou via un objet.

        1 Reply Last reply Reply Quote 0
        • SCAREX
          SCAREX last edited by

          Personnellement j’utilise des Enum avec en paramètre un nombre et à la fin je fais la somme de tous ces points.

          Exemple :

          
          public static enum EnumZombieDongeonRandomItem {
          DIAMOND(3, new ItemStack(Items.diamond), 1, 3),
          POTATO(10, new ItemStack(Items.potato), 10, 14),
          PICKAXE(3, new ItemStack(Items.diamond_pickaxe), 1, 0),
          APPLE(10, new ItemStack(Items.apple), 1, 10),
          IRON(5, new ItemStack(Items.iron_ingot), 1, 15),
          FLESH(5, new ItemStack(Items.rotten_flesh), 1, 15),
          CHESTPLATE(3, new ItemStack(Items.chainmail_chestplate), 1, 1),
          GOLD(5, new ItemStack(Items.gold_ingot), 1, 10),
          SADDLE(10, new ItemStack(Items.saddle), 1, 0),
          NAMETAG(10, new ItemStack(Items.name_tag), 1, 6);
          
          public static final Random rand = new Random();
          private int weight;
          private ItemStack stack;
          private int minChance;
          private int maxChance;
          
          private EnumZombieDongeonRandomItem(int weight, ItemStack stack, int minChance, int maxChance) {
          this.weight = weight;
          this.stack = stack;
          this.minChance = minChance;
          this.maxChance = maxChance;
          }
          
          public static ItemStack getRandomitem() {
          int i = rand.nextInt(62); // 62 ici est la somme, tu peux la calculer ou bien la calculer toi-même avant de compiler
          int j = -1;
          int k = 0;
          while (k < i) {
          k += values()[++j].weight;
          }
          ItemStack stack = values()[j].stack.copy();
          stack.stackSize = values()[j].maxChance > 0 ? values()[j].minChance + rand.nextInt(values()[j].maxChance) : 1;
          return stack;
          }
          }
          
          

          Site web contenant mes scripts : http://SCAREXgaming.github.io

          Pas de demandes de support par MP ni par skype SVP.
          Je n'accepte sur skype que l…

          1 Reply Last reply Reply Quote 0
          • robin4002
            robin4002 Moddeurs confirmés Rédacteurs Administrateurs last edited by

            En effet c’est une bonne idée aussi avec un enum.

            1 Reply Last reply Reply Quote 0
            • L
              Laserflip33 last edited by

              Merci robin, ça fonctionne même si avec 100 items le code devient en effet assez difficile à lire.
              @SCAREX : Ta méthode à l’air plus précise et plus complexe, j’essayerai pour des résultats très précis. Merci beaucoup!

              Sinon, rien à voir, vous savez comment colorer/styliser le titre d’un item?

              1 Reply Last reply Reply Quote 0
              • robin4002
                robin4002 Moddeurs confirmés Rédacteurs Administrateurs last edited by

                Dans le fichier lang tu mets § + [1-9] ou § + [a-f]
                Exemple :
                §6Nom d’item
                S’affichera en dorée en jeu. Tapes couleurs Minecraft sur google, tu pourra vite trouver les correspondances (il y a aussi moyen de mettre en gras, souligner, barrer, ou même faire en sorte que le nom change de caractère tout les temps)

                ÉDIT : http://minecraft-fr.gamepedia.com/Codes_de_mise_en_forme

                1 Reply Last reply Reply Quote 0
                • L
                  Laserflip33 last edited by

                  Super merci! 🙂

                  1 Reply Last reply Reply Quote 0
                  • SCAREX
                    SCAREX last edited by

                    J’ai aussi çà comme code :

                    
                    public enum EnumRandomItemStack {
                    EMERALD(new ItemStack(Items.emerald), 7),
                    DIAMOND_SWORD(new ItemStack(Items.diamond_sword), 0, Items.diamond_sword.getItemEnchantability() - 2),
                    GOLDEN_SWORD(new ItemStack(Items.golden_sword), 0, Items.golden_sword.getItemEnchantability()),
                    GOLDEN_CARROT(new ItemStack(Items.golden_carrot), 3),
                    GHAST_TEAR(new ItemStack(Items.ghast_tear), 2),
                    ARROW(new ItemStack(Items.arrow), 47),
                    COOKED_BEEF(new ItemStack(Items.cooked_beef), 47),
                    BOOK(new ItemStack(Items.book), 0, 20),
                    GOLD_INGOT(new ItemStack(Items.gold_ingot), 3),
                    IRON_INGOT(new ItemStack(Items.iron_ingot), 8),
                    NETHER_WART(new ItemStack(Items.nether_wart), 15),
                    FLINT(new ItemStack(Items.flint), 20),
                    STRING(new ItemStack(Items.string), 16),
                    MELON(new ItemStack(Items.melon), 5),
                    DIAMOND(new ItemStack(Items.diamond), 4),
                    FISHING_ROD(new ItemStack(Items.fishing_rod)),
                    DIAMOND_PICKAXE(new ItemStack(Items.diamond_pickaxe), 0, Items.diamond_pickaxe.getItemEnchantability() - 2),
                    IRON_PICKAXE(new ItemStack(Items.iron_pickaxe), 0, Items.iron_pickaxe.getItemEnchantability()),
                    RABBIT_STEW(new ItemStack(Items.rabbit_stew)),
                    LAVA_BUCKET(new ItemStack(Items.lava_bucket)),
                    TNT(new ItemStack(Blocks.tnt), 20),
                    SLIMEBALL(new ItemStack(Items.slime_ball), 8),
                    ENDER_CHEST(new ItemStack(Blocks.ender_chest), 2),
                    SUGAR_CANE(new ItemStack(Items.reeds), 32),
                    BREAD(new ItemStack(Items.bread), 64),
                    BREWING_STAND(new ItemStack(Items.brewing_stand), 2),
                    POTATO(new ItemStack(Items.potato), 15),
                    RECORD_CAT(new ItemStack(Items.record_cat)),
                    RECORD_FAR(new ItemStack(Items.record_far)),
                    JUKEBOX(new ItemStack(Blocks.jukebox)),
                    EMPTY_MAP(new ItemStack(Items.map), 4),
                    FERMENTED_SPIDER_EYE(new ItemStack(Items.fermented_spider_eye), 4),
                    MAGMA_CREAM(new ItemStack(Items.magma_cream), 5);
                    
                    public ItemStack stack;
                    public int isRandomStack;
                    public int isRandomEnchantment;
                    private final static Random rand = new Random();
                    
                    private EnumRandomItemStack(ItemStack stack, int randomSRange, int randomERange) {
                    this.stack = stack;
                    this.isRandomStack = randomSRange;
                    this.isRandomEnchantment = randomERange;
                    }
                    
                    private EnumRandomItemStack(ItemStack stack) {
                    this(stack, 0, 0);
                    }
                    
                    private EnumRandomItemStack(ItemStack stack, int r1) {
                    this(stack, r1, 0);
                    }
                    
                    public static ItemStack getRandomItemStack() {
                    int i = rand.nextInt(EnumRandomItemStack.values().length);
                    ItemStack stack1 = EnumRandomItemStack.values()*.stack.copy();
                    int a = EnumRandomItemStack.values()*.isRandomStack;
                    int b = EnumRandomItemStack.values()*.isRandomEnchantment;
                    if (a > 0) stack1.stackSize = rand.nextInt(a) + 1;
                    if (b > 0) EnchantmentHelper.addRandomEnchantment(rand, stack1, b);
                    return stack1;
                    }
                    }
                    
                    

                    Site web contenant mes scripts : http://SCAREXgaming.github.io

                    Pas de demandes de support par MP ni par skype SVP.
                    Je n'accepte sur skype que l…

                    1 Reply Last reply Reply Quote 0
                    • L
                      Laserflip33 last edited by

                      Ah, ça à l’air plus simple mais à quoi les chiffres qui accompagnent les items correspondent?

                      1 Reply Last reply Reply Quote 0
                      • SCAREX
                        SCAREX last edited by

                        Le premier est un nombre qui me permet de créer des stacks plus ou moins grands et le deuxième me permet d’avoir la niveau d’enchantement à utiliser (Items.diamond_pickaxe.getItemEnchantability() - 2) avec un chiffre aléatoire (pour ne pas avoir des enchantements trop cheatés).

                        Site web contenant mes scripts : http://SCAREXgaming.github.io

                        Pas de demandes de support par MP ni par skype SVP.
                        Je n'accepte sur skype que l…

                        1 Reply Last reply Reply Quote 0
                        • 1 / 1
                        • First post
                          Last post
                        Design by Woryk
                        Contact / Mentions Légales

                        MINECRAFT FORGE FRANCE © 2018

                        Powered by NodeBB