Махинации в контейнере

Версия Minecraft
1.12.2
2,932
44
598
Доброго времени суток Земляне и Чужие!
Сегодня у меня появилось два вопроса. Как сделать:

1. Что бы когда навёл курсор на предмет и кликнул по нему ЛКМ в своём контейнере он взялся и заменился на другой?
2. Что бы когда нажал на предмет(-ы, если их несколько в одном слоте) ПКМ, произошла замена на другие рандомные из массива?

~~~
Я просто не пойму как работать с массивами предметов на 1.12.2 и как сделать махинации с предметами в контейнере.
 
Решение
А то, что он слот не проверяет и вызывается, вроде, только на клиенте - норм?

Но как-то не очень работает
ГАИК, **** умный человек, ты ж не первый день кодишь..
Что за "топ" названия переменныХ?

new ItemStack(DiceRegister.DICE).getItem() - втф, Гаик, не первый день..
clearMatchingItems - вроде норм метод, только проверяй, что этот метод возвращает > 0, ибо у тебя тогда просто по ПКМ предметом будет выдаваться рандом.
addItemStackToInventory - если инвентарь фулл, он вернет false, что он не может добавить, ты это тоже не просчитываешь.
С рандомом вроде норм, но делай еще .copy(), потому что ты там хранишь готовые стаки, если там изменить count, то гг.

3,005
192
592
Ну, в контейнере slotClick переопределяешь.
Проверяешь, что за слот, проверяешь Л/П КМ.
Рандом из массива - ну, Гарик, ну это уж в гугле точно есть.
mass[rand.nextInt(mass.length)]
 
2,932
44
598
Рандом из массива - ну, Гарик, ну это уж в гугле точно есть.
mass[rand.nextInt(mass.length)]
Я в качестве примера вот так сделал:
Java:
    public static ItemStack[] random = new ItemStack[] {
            new ItemStack(DiceRegister.DICE,1,0),
            new ItemStack(DiceRegister.DICE,1,1),
            new ItemStack(DiceRegister.DICE,1,2)
    };

    @Override
    public ActionResult<ItemStack> onItemRightClick(World World, final EntityPlayer EntityPlayer, EnumHand hand) {

        EntityPlayer.setActiveHand(hand);
        ItemStack ItemStack = EntityPlayer.getHeldItem(hand);

        EntityPlayer.getCooldownTracker().setCooldown(this, 25);

        if (!World.isRemote) {

                EntityPlayer.inventory.clearMatchingItems(new ItemStack(DiceRegister.DICE).getItem(), 0, 1, null);

                EntityPlayer.inventory.addItemStackToInventory(random[World.rand.nextInt(random.length)]);

        }

        return new ActionResult<ItemStack>(EnumActionResult.SUCCESS, ItemStack);

    }
Но как-то не очень работает, предмет не выдаётся.
 
7,099
324
1,510
onItemRightClick это когда в ingame гуи игрок держит предмет в руке и нажимает пкм.
Тебе нужен Container#slotClick, судя по первому сообщению
 
3,005
192
592
А то, что он слот не проверяет и вызывается, вроде, только на клиенте - норм?

Но как-то не очень работает
ГАИК, **** умный человек, ты ж не первый день кодишь..
Что за "топ" названия переменныХ?

new ItemStack(DiceRegister.DICE).getItem() - втф, Гаик, не первый день..
clearMatchingItems - вроде норм метод, только проверяй, что этот метод возвращает > 0, ибо у тебя тогда просто по ПКМ предметом будет выдаваться рандом.
addItemStackToInventory - если инвентарь фулл, он вернет false, что он не может добавить, ты это тоже не просчитываешь.
С рандомом вроде норм, но делай еще .copy(), потому что ты там хранишь готовые стаки, если там изменить count, то гг.

как их в GUI отловить/проверить
В контейнере slotClick, писал же выше..
 
Сверху