Помогите Как сделать чтобы при выкидывании предметов...

IcedwinterZ

Активный участник
Пользователь
Баллы
76
Имя в Minecraft
IcedwinterZ
Как сделать что-бы при выкидывании предметов на землю (в одну точку) на их месте появлялся другой предмет (Типа альтернативный крафт)
 
Код:
e.getDrop().clear();
e.getDrop().add(ItemStack(Material.тыры-пыры));
Как то так.
 
А как получить итемы дропнутых вещей
e.getDrops();

Вернет List с ItemStack.
С листа уже по цыклу смотриш какие ItemStack тебе вернулись.
Java:
    @EventHandler
    public void dropss(EntityDeathEvent e){
        List<ItemStack> list = e.getDrops();
        for(int i = 0; i < e.getDrops().size(); i++){
            log.info("Drops - "+ list.get(i));
        }
    }
 
Последнее редактирование:
Пишу сразу - ни за какие коврижки не пиши так.
Тут написано в стиле "разжевать и положить", в действительности так писать нельзя.
Ну, можно проверить на работоспособность, но не в плагин такое. Это фу.

Java:
//Bad coding
private ArrayList<Item> items = new ArrayList<>();
//Добавляем наш предмет
public void onPlayerDropItem(PlayerDropItemEvent event) {
    items.add(event.getItemDrop());
}

public void unknownMethod() {
    for (Iterator<Item> it = items.iterator(); it.hasNext();) {
        Item item = it.next();
        //Если предмет ещё не упал
        if (!item.isOnGround()) {
            //Он нас не интересует
            continue;
        }
        //Иначе удаляем его из списка, потому что уже упал.
        it.remove();
        World world = item.getWorld();
        Location il = item.getLocation();
        //Ищем энтитей в радиусе трёх блоков
        Collection<Entity> nearbyEntities = world.getNearbyEntities(il, 3, 3, 3);
        ArrayList<Item> nearbyDrop = new ArrayList<>();
        //А после фильтруем их, ибо нам нужны только предметы
        nearbyEntities.stream().filter((entity) -> (entity.getType().equals(EntityType.DROPPED_ITEM))).forEach((entity) -> {
            nearbyDrop.add((Item) entity);
        });
        //После добавляем сам упавший предмет и отправляем это на проверку.
        nearbyDrop.add(item);
        this.craftingFactory(nearbyDrop);
    }
}
//Примерный рецепт
private List<ItemStack> repeaterRecept = Arrays.asList(
        new ItemStack(Material.COBBLESTONE, 3),
        new ItemStack(Material.REDSTONE_TORCH_ON, 2),
        new ItemStack(Material.REDSTONE, 1)
);
private void craftingFactory(ArrayList<Item> drop) {
    //Linked*?..
    HashMap<Item, ItemStack> itemStackByItem = new HashMap<>();
    //Делается это для удобной сверки по рецепту
    drop.stream().forEach(item -> {
        itemStackByItem.put(item, item.getItemStack());
    });

    //TODO: Использовать другой метод для сверки ItemStack
    //Если предметы, что валяются, можно объединить и получить что то
    if (itemStackByItem.values().containsAll(repeaterRecept)) {
        Location lastDropItem = null;
        //То удаляем предметы что в рецепте, сохраняя последнюю локацию
        for (Iterator<Map.Entry<Item, ItemStack>> it = itemStackByItem.entrySet().iterator(); it.hasNext();) {
            Map.Entry<Item, ItemStack> entry = it.next();
            if (repeaterRecept.contains(entry.getValue())) {
                lastDropItem = entry.getKey().getLocation();
                it.remove();
            }
        }
        //Просто проверка
        if (lastDropItem == null) {
            return;
        }
        //И дропаем результат крафта.
        lastDropItem.getWorld().dropItem(lastDropItem, new ItemStack(Material.DIODE_BLOCK_ON));
    }
}
 
Назад
Верх