Вопрос Как разрешить класть предмет, но не забирать предметы созданные в меню?

Lefixses

Заблокирован
Сообщения
41
Пишу плагин на скупщика.
Не могу реализовать, чтобы игрок мог класть предметы из своего инвентаря в меню, но не мог брать предметы которые лежат в меню изначально.
Нейронка не помогает.
Помогите с кодом
 
Код:
@EventHandler (priority = EventPriority.LOWEST, ignoreCancelled = true)
public void onClick (InventoryClickEvent e) {
if (e.getCurrentItem() == null) {
    return;
}

if (e.getView().getType() == InventoryType.ANVIL
        || e.getView().getType() == InventoryType.BARREL
        || e.getView().getType() == InventoryType.BEACON
        || e.getView().getType() == InventoryType.BLAST_FURNACE
        || e.getView().getType() == InventoryType.BREWING
        || e.getView().getType() == InventoryType.CARTOGRAPHY
        || e.getView().getType() == InventoryType.CHEST
        || e.getView().getType() == InventoryType.DISPENSER
        || e.getView().getType() == InventoryType.DROPPER
        || e.getView().getType() == InventoryType.ENCHANTING
        || e.getView().getType() == InventoryType.ENDER_CHEST
        || e.getView().getType() == InventoryType.FURNACE
        || e.getView().getType() == InventoryType.GRINDSTONE
        || e.getView().getType() == InventoryType.HOPPER
        || e.getView().getType() == InventoryType.LECTERN
        || e.getView().getType() == InventoryType.LOOM
        || e.getView().getType() == InventoryType.MERCHANT
        || e.getView().getType() == InventoryType.WORKBENCH
        || e.getView().getType() == InventoryType.SHULKER_BOX
        || e.getView().getType() == InventoryType.SMITHING
        || e.getView().getType() == InventoryType.SMOKER
        || e.getView().getType() == InventoryType.STONECUTTER)
{
List<ItemStack> items = new ArrayList<>();
items.add(e.getCurrentItem());
items.add(e.getCursor());
items.add((e.getClick() == ClickType.NUMBER_KEY) ? e.getWhoClicked().getInventory().getItem(e.getHotbarButton()) : e.getCurrentItem());
for(ItemStack item : items) {
    if(item != null) {
        if (item.equals(your_item)) {
            e.setCancelled(true);
        }
    }
}


if (e.getCurrentItem().equals(your_item)) {
    e.setCancelled(true);
    return;
}
}

тут немного другой код, но на суть я тебя наввёл
 
Код:
@EventHandler (priority = EventPriority.LOWEST, ignoreCancelled = true)
public void onClick (InventoryClickEvent e) {
if (e.getCurrentItem() == null) {
    return;
}

if (e.getView().getType() == InventoryType.ANVIL
        || e.getView().getType() == InventoryType.BARREL
        || e.getView().getType() == InventoryType.BEACON
        || e.getView().getType() == InventoryType.BLAST_FURNACE
        || e.getView().getType() == InventoryType.BREWING
        || e.getView().getType() == InventoryType.CARTOGRAPHY
        || e.getView().getType() == InventoryType.CHEST
        || e.getView().getType() == InventoryType.DISPENSER
        || e.getView().getType() == InventoryType.DROPPER
        || e.getView().getType() == InventoryType.ENCHANTING
        || e.getView().getType() == InventoryType.ENDER_CHEST
        || e.getView().getType() == InventoryType.FURNACE
        || e.getView().getType() == InventoryType.GRINDSTONE
        || e.getView().getType() == InventoryType.HOPPER
        || e.getView().getType() == InventoryType.LECTERN
        || e.getView().getType() == InventoryType.LOOM
        || e.getView().getType() == InventoryType.MERCHANT
        || e.getView().getType() == InventoryType.WORKBENCH
        || e.getView().getType() == InventoryType.SHULKER_BOX
        || e.getView().getType() == InventoryType.SMITHING
        || e.getView().getType() == InventoryType.SMOKER
        || e.getView().getType() == InventoryType.STONECUTTER)
{
List<ItemStack> items = new ArrayList<>();
items.add(e.getCurrentItem());
items.add(e.getCursor());
items.add((e.getClick() == ClickType.NUMBER_KEY) ? e.getWhoClicked().getInventory().getItem(e.getHotbarButton()) : e.getCurrentItem());
for(ItemStack item : items) {
    if(item != null) {
        if (item.equals(your_item)) {
            e.setCancelled(true);
        }
    }
}


if (e.getCurrentItem().equals(your_item)) {
    e.setCancelled(true);
    return;
}
}

тут немного другой код, но на суть я тебя наввёл
тут наоборот, your_item положить нельзя, а всё что в инвентарях можно взять и положить
 
Есть метод e.getCursor(), выдает айтем стак который в курсоре, проверяй если e.getCursor() == null, отменяй ивент и не давай возможность забрать предметы в слоту, если курсор != нулл то вместо допустим красных стеклышек делай .setItem(index, e.getCursor());
 
Вам необходимо зарегистрироваться для просмотра изображений-вложений

у меня есть меню, в котором предметы настраиваются в конфиге, мне нужно чтобы любые предметы в инвентаре игрока
можно было класть в пустые слоты, а предметы из конфига нельзя трогать.
 
Есть метод e.getCursor(), выдает айтем стак который в курсоре, проверяй если e.getCursor() == null, отменяй ивент и не давай возможность забрать предметы в слоту, если курсор != нулл то вместо допустим красных стеклышек делай .setItem(index, e.getCursor());
а нет, не так
Объединено

Вам необходимо зарегистрироваться для просмотра изображений-вложений

у меня есть меню, в котором предметы настраиваются в конфиге, мне нужно чтобы любые предметы в инвентаре игрока
можно было класть в пустые слоты, а предметы из конфига нельзя трогать.
Уверен ты там в конфиге указываешь слоты на которых будут стоять предметы, сохрани этот список слотов и если slots.contains(e.getSlot()); то отменяй ивент
 
а нет, не так
Объединено


Уверен ты там в конфиге указываешь слоты на которых будут стоять предметы, сохрани этот список слотов и если slots.contains(e.getSlot()); то отменяй ивент
Вам необходимо зарегистрироваться для просмотра изображений-вложений
 
1. ставишь в конфиг слоты куда игрок МОЖЕТ класть предметы
2. if (e.getRawSlot() < inventory.getSize() && !userSlots.contains(e.getRawSlot()) e.setCancelled(true);
Вам необходимо зарегистрироваться для просмотра изображений-вложений
Вам необходимо зарегистрироваться для просмотра изображений-вложений

так?
Объединено

1. ставишь в конфиг слоты куда игрок МОЖЕТ класть предметы
2. if (e.getRawSlot() < inventory.getSize() && !userSlots.contains(e.getRawSlot()) e.setCancelled(true);
да, заработало, теперь я могу класть и брать предметы из указанных слотов, но теперь другая проблема, когда я закрываю инвентарь предметы пропадают, как это пофиксить?
 
Последнее редактирование:
когда я закрываю инвентарь предметы пропадают, как это пофиксить?
1. InventoryCloseEvent
2. for (int slot : getItemSlots()) { inventory.getItem(slot) -> item != null && !item.getType().isAir() -> player.getInventory().addItem(item) }
 
Последнее редактирование модератором:
Назад
Сверху Снизу