• S'inscrire
    • Se connecter
    • Recherche
    • Récent
    • Mots-clés
    • Populaire
    • Utilisateurs
    • Groupes

    Résolu Donner un random item au onItemRightClick

    1.7.x
    1.7.2
    3
    10
    2640
    Charger plus de messages
    • Du plus ancien au plus récent
    • Du plus récent au plus ancien
    • Les plus votés
    Répondre
    • Répondre à l'aide d'un nouveau sujet
    Se connecter pour répondre
    Ce sujet a été supprimé. Seuls les utilisateurs avec les droits d'administration peuvent le voir.
    • L
      Laserflip33 dernière édition par

      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 réponse Dernière réponse Répondre Citer 0
      • robin4002
        robin4002 Moddeurs confirmés Rédacteurs Administrateurs dernière édition par

        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 réponse Dernière réponse Répondre Citer 0
        • SCAREX
          SCAREX dernière édition par

          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 réponse Dernière réponse Répondre Citer 0
          • robin4002
            robin4002 Moddeurs confirmés Rédacteurs Administrateurs dernière édition par

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

            1 réponse Dernière réponse Répondre Citer 0
            • L
              Laserflip33 dernière édition par

              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 réponse Dernière réponse Répondre Citer 0
              • robin4002
                robin4002 Moddeurs confirmés Rédacteurs Administrateurs dernière édition par

                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 réponse Dernière réponse Répondre Citer 0
                • L
                  Laserflip33 dernière édition par

                  Super merci! 🙂

                  1 réponse Dernière réponse Répondre Citer 0
                  • SCAREX
                    SCAREX dernière édition par

                    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 réponse Dernière réponse Répondre Citer 0
                    • L
                      Laserflip33 dernière édition par

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

                      1 réponse Dernière réponse Répondre Citer 0
                      • SCAREX
                        SCAREX dernière édition par

                        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 réponse Dernière réponse Répondre Citer 0
                        • 1 / 1
                        • Premier message
                          Dernier message
                        Design by Woryk
                        Contact / Mentions Légales

                        MINECRAFT FORGE FRANCE © 2018

                        Powered by NodeBB