Рандомный дроп вещей из предмета.

Статус
В этой теме нельзя размещать новые ответы.
Доброго времени суток всем. 
Появился вопрос . Допустим у меня есть предмет (Х), как сделать что-бы при нажатии ПКМ по данному предмету из него дропались другие вещи (Y,Z) в процентном соотношении допустим 30х70%. Если это вообще возможно .
 
Я читал тему подобные моему запросу ([font=Verdana, Helvetica, Arial, sans-serif]onItemRightClick) . Но увидел немного не то что мне нужно . Мне нужен как бы контейнер (лотарея) в одном предмете. Есть предмет из которого дропаються другие предметы с определенным шансом (как кейсы в CS GO) . А как это реализовать не знаю к сожалению не столь силен в коде .(
[/font]
 
Код:
Random rand = new Random();

public ItemStack onItemRightClick(ItemStack stack, World world, EntityPlayer player) {
    if(rand.nextInt(10) == 0 || rand.nextInt(10) == 1 || rand.nextInt(10) == 2){
        player.inventory.addItemStackToInventory(new ItemStack(Items.apple));
    }
    else{
        player.inventory.addItemStackToInventory(new ItemStack(Items.bone));
    }
    return stack;
}
Вроде бы как-то так, с 30% будет выдаваться яблоко, с 70% - кость. Стоит учитывать, что предмет не исчезнет (для этого нужно приписать: 
Код:
--stack.stackSize;
чтобы удалить сам итем). +Если слоты забиты ничего не будет выпадет на землю, просто исчезнет предмет и ничего не даст в замен. Чтобы это исправить нужно дописать ещё несколько строк, код можно найти в ванильном пузырьке.

P.S. Код набросал быстро, используя свои файлы, на работоспособность не проверен.
 

timaxa007

Модератор
5,831
409
672
30% - Алмаз
70% - Адский нарост (nether_wart)
Результат из (стака) 64 попыток дропа:
b8a4173745767104b84e461cefae3d2a.jpg


50% - Палка
35% - Древесный уголь
15% - (Каменный) уголь
25% - (Сырой) Стейк (Говядины)
5% - Алмаз
1% - Адский нарост (nether_wart)
0,001% - Адская звезда (nether_star)
Результат из (стака) 64 попыток дропа:
eb4e0b747f23d42f441a90e45edd32f3.jpg

Код:
import java.util.ArrayList;

import net.minecraft.block.Block;
import net.minecraft.creativetab.CreativeTabs;
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 ItemItemWithChance extends Item {

    private ArrayList<DropsItem> list_drops = new ArrayList<DropsItem>();

    public ItemItemWithChance() {
        super();
        setCreativeTab(CreativeTabs.tabMisc);

        addItemWithChance(50F, Items.stick);
        addItemWithChance(35F, new ItemStack(Items.coal, 1, 1));
        addItemWithChance(15F, new ItemStack(Items.coal, 1, 0));
        addItemWithChance(25F, Items.beef);
        addItemWithChance(5F, Items.diamond);
        addItemWithChance(1F, Items.nether_wart);
        addItemWithChance(0.001F, Items.nether_star);
        /*
        addItemWithChance(30F, Items.diamond);
        addItemWithChance(70F, Items.nether_wart);
         */
    }

    @Override
    public ItemStack onItemRightClick(ItemStack is, World world, EntityPlayer player) {
        if (!world.isRemote) {
            float p = world.rand.nextFloat() * getChanceMax();
            ItemStack item_drop = null;
            if (list_drops != null)
                for (int i = 0; i < list_drops.size(); ++i) {
                    if (list_drops.get(i) != null) {
                        if (list_drops.get(i).getChanceA() <= p && list_drops.get(i).getChanceB() > p) {
                            item_drop = list_drops.get(i).getItem().copy();
                            //System.out.println("onItemRightClick - " + p + ",  " + item_drop);
                            break;
                        }
                    }
                }
            if (item_drop != null) {
                player.func_146097_a(item_drop, false, false);
                //player.inventory.addItemStackToInventory(item_drop);
                --is.stackSize;
            }
        }
        return is;
    }

    public void addItemWithChance(float chance, Object item) {
        float a = 0F;
        if (list_drops != null && list_drops.size() > 0) {
            float b = -1F;
            for (int i = 0; i < list_drops.size(); ++i) {
                if (list_drops.get(i) != null) {
                    if (b < list_drops.get(i).getChanceB()) b = list_drops.get(i).getChanceB();
                    else continue;
                } else continue;
            }
            if (b != -1F) a = b;
        }
        list_drops.add(new DropsItem(a, a + chance, item));
    }

    public float getChanceMax() {
        float a = 0F;
        if (list_drops != null && list_drops.size() > 0) {
            float b = -1;
            for (int i = 0; i < list_drops.size(); ++i) {
                if (list_drops.get(i) != null) {
                    if (b < list_drops.get(i).getChanceB()) b = list_drops.get(i).getChanceB();
                    else continue;
                } else continue;
            }
            if (b != -1) a = b;
        }
        return a;
    }

    private static class DropsItem {

        private ItemStack item;
        private float chanceA;
        private float chanceB;

        private DropsItem(float chanceA, float chanceB, Object item) {
            if (item == null) return;
            if (item != null) {
                if (item instanceof Block) this.item = new ItemStack((Block)item);
                else if (item instanceof Item) this.item = new ItemStack((Item)item);
                else if (item instanceof ItemStack) this.item = (ItemStack)item;
                //this.item = item;
            }
            this.chanceA = chanceA;
            this.chanceB = chanceB;
        }

        public ItemStack getItem() {
            return item;
        }

        public float getChanceA() {
            return chanceA;
        }

        public float getChanceB() {
            return chanceB;
        }

    }

}
 
Статус
В этой теме нельзя размещать новые ответы.
Сверху