1.7.10 | Создание особого предмета.

Всем доброго времени суток. Возник вопрос, как сделать особый предмет следующего типа:

1. Есть допустим предмет "ящик".
2. Есть предмет "ключ".

Надо сделать так, что бы предмет "ящик" не открывался без наличия предмета в инвентаре "ключ", а если ящик открывается - то из него выпадает случайный предмет из определенного списка. Как такое реализовать? Кто может хотя бы подсказать ориентировочный код такого "ящика" без "ключа"? Просто не догоняю, как это все записать в коде.
 
Agravaine написал(а):
Ну, на ПКМ дропай вещи.
Да вот хрен знает как записать лист предметов в дроп и что бы определенные вещи дропались с определенным шансом.
 
С помощью АСМа всё же можно добавить нужные методы в итемстак.
 
Надо форджу это сказать)))
---
Вот что мне ответили:
diesieben07 написал(а):
This is sadly not possible in an intuitive way. What do you want to be included in the hashCode? The ItemStack's NBT data? Only it's Item? It's Item and damage value? What about the stack size?
Everyone has a different use case and therefor it's not practical to override it.
The only meaningful way would be to check everything (including stack size). But then recipe lookups (which you are most likely referring to here) are no easier because an ItemStack with a stackSize of 5 is not equal to an ItemStack with a stackSize of 1, even though the recipe should still match. Same for NBT data and other things.
---
В принципе, он прав... А как тогда?
 
Agravaine написал(а):
Надо форджу это сказать)))
---
Вот что мне ответили:
diesieben07 написал(а):
This is sadly not possible in an intuitive way. What do you want to be included in the hashCode? The ItemStack's NBT data? Only it's Item? It's Item and damage value? What about the stack size?
Everyone has a different use case and therefor it's not practical to override it.
The only meaningful way would be to check everything (including stack size). But then recipe lookups (which you are most likely referring to here) are no easier because an ItemStack with a stackSize of 5 is not equal to an ItemStack with a stackSize of 1, even though the recipe should still match. Same for NBT data and other things.
---
В принципе, он прав... А как тогда?
Все это конечно занимательно, так что в итоге получаем? Нет такой возможности?
 
ы. Ну хранятся же как-то рецепты.
 
Ничего конкретного в сторону решения и не видно, класс.
 
Че, почему тут нет моего сообщения, лол.
Да вы гоните, нет решений.
Ну срать на хешкод (хотя реализовать его можно, тот человек прав, однако в данном случае нам нужно сохранять в хешкод лишь ид, метадату и 1 циферку из нбт - ключи не стакаются, правда это придется делать именно тебе, а не команде фордж, ибо тут появляются особенности твоего мода).
Завести в глобальном хранилище мода хешкарту, где ключом является тройка координат xyz, а значением - ID.
При каждом новом замке (первый ПКМ новым ключом (без NBT) по двери) пихать в мапу тройку координат двери + генерить первый свободный ID для ключа, в итемстак сохранять в NBT сам ID. Потом можно изи из координат двери достать нужный ID ключа для этой двери.
При уничтожении двери выкидывать из хешкарты соответствующую пару ключ-значение, но вот предмет уже не достать будет. Хотя я считаю, 3 миллиарда ID хватит по горло. Тем более что храниться будут далееееееееко не все.
Если что возьми long в качестве ID.
Т.е. получается ID каждый раз генерируется все больше, но память освобождается при разрушении двери.
Что у вас с фантазией?
 
Oldestkon написал(а):
Че, почему тут нет моего сообщения, лол.
Да вы гоните, нет решений.
Ну срать на хешкод (хотя реализовать его можно, тот человек прав, однако в данном случае нам нужно сохранять в хешкод лишь ид, метадату и 1 циферку из нбт - ключи не стакаются, правда это придется делать именно тебе, а не команде фордж, ибо тут появляются особенности твоего мода).
Завести в глобальном хранилище мода хешкарту, где ключом является тройка координат xyz, а значением - ID.
При каждом новом замке (первый ПКМ новым ключом (без NBT) по двери) пихать в мапу тройку координат двери + генерить первый свободный ID для ключа, в итемстак сохранять в NBT сам ID. Потом можно изи из координат двери достать нужный ID ключа для этой двери.
При уничтожении двери выкидывать из хешкарты соответствующую пару ключ-значение, но вот предмет уже не достать будет. Хотя я считаю, 3 миллиарда ID хватит по горло. Тем более что храниться будут далееееееееко не все.
Если что возьми long в качестве ID.
Т.е. получается ID каждый раз генерируется все больше, но память освобождается при разрушении двери.
Что у вас с фантазией?
Мне нужен итем, который при наличии ключа в инвентаре будет дропать из списка предметов случайный предмет с определенным шансом. Аналогия кейса из CS:GO.
 
Блжад, извиняюсь, не так прочитал вопрос.
Ключи одноразовые и подходят одинаково для всех кейсов, т.е. универсальные?
 
Oldestkon написал(а):
Блжад, извиняюсь, не так прочитал вопрос.
Ключи одноразовые и подходят одинаково для всех кейсов, т.е. универсальные?
Смотри:

1. Есть допустим три типа ящиков - к ним один ключ.
2. Есть два типа других ящиков - к ним другой ключ.

Смекаешь?
 
Смекаю.
Всё равно изи.
Ловим событие ПКМ на ящике - листаем весь инвентарь (пройтись по массиву предметов) - найти нужный тип ключа для данного ящика - если он есть - открыть ящик, (убить ключ, если надо).
Тебя вроде интересует рандомная выдача предметов?
Создаешь конфиг для мода, куда можно вписывать ID предметов, которые могут выпадать из нужных ящиков, далее загрузаешь их в массив.
Вот вырезка из одного моего мода:

Код:
    private ItemStack getRandomItem(Random r) {
        int l = Mod.lootItems.length;
        
        if (l < 1)
            return null;
        
        int j = r.nextInt(l);
        Item item = Item.itemsList[Mod.lootItems[j][0]]; 
        if (item == null) {
            return null;
        }
        return new ItemStack(item, 1, Mod.lootItems[j][1]);
    }
 
Oldestkon написал(а):
Смекаю.
Всё равно изи.
Ловим событие ПКМ на ящике - листаем весь инвентарь (пройтись по массиву предметов) - найти нужный тип ключа для данного ящика - если он есть - открыть ящик, (убить ключ, если надо).
Тебя вроде интересует рандомная выдача предметов?
Создаешь конфиг для мода, куда можно вписывать ID предметов, которые могут выпадать из нужных ящиков, далее загрузаешь их в массив.
Вот вырезка из одного моего мода:

Код:
    private ItemStack getRandomItem(Random r) {
        int l = Mod.lootItems.length;
        
        if (l < 1)
            return null;
        
        int j = r.nextInt(l);
        Item item = Item.itemsList[Mod.lootItems[j][0]]; 
        if (item == null) {
            return null;
        }
        return new ItemStack(item, 1, Mod.lootItems[j][1]);
    }
Спасиюочки, буду пробовать.
 
Назад
Сверху