Résolu Donner un random item au onItemRightClick
-
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!
-
Tu peux faire un tableau avec tous tes items :
public static Item[] randItems = new Item[]{ClassePrincipale.item1, ClassePrincipale.item2 …};
Ensuite pour le randomItem 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. -
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; } }
-
En effet c’est une bonne idée aussi avec un enum.
-
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?
-
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
-
Super merci!
-
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; } }
-
Ah, ça à l’air plus simple mais à quoi les chiffres qui accompagnent les items correspondent?
-
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).