Хостинг серверов Minecraft playvds.com
  1. Вы находитесь в русском сообществе Bukkit. Мы - администраторы серверов Minecraft, разрабатываем собственные плагины и переводим на русский язык плагины наших собратьев из других стран.
    Скрыть объявление

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

Тема в разделе "Разработка плагинов для новичков", создана пользователем IcedwinterZ, 24 июл 2016.

  1. Автор темы
    IcedwinterZ

    IcedwinterZ Активный участник Пользователь

    Баллы:
    76
    Имя в Minecraft:
    IcedwinterZ
    Как сделать что-бы при выкидывании предметов на землю (в одну точку) на их месте появлялся другой предмет (Типа альтернативный крафт)
     
  2. Хостинг MineCraft
    <
  3. Derik

    Derik Активный участник Пользователь

    Баллы:
    76
    Имя в Minecraft:
    Derik
    Код:
    e.getDrop().clear();
    e.getDrop().add(ItemStack(Material.тыры-пыры));
    Как то так.
     
  4. Типа админ:D

    Типа админ:D Активный участник Пользователь

    Баллы:
    76
    Имя в Minecraft:
    B1ruk
    Ты забыл new
    new ItemStack(Material.тыры-пыры)
     
  5. Derik

    Derik Активный участник Пользователь

    Баллы:
    76
    Имя в Minecraft:
    Derik
    Я же не готовый код давал... А так информацию к размышлению. Типа в каком направление копать.
     
  6. Автор темы
    IcedwinterZ

    IcedwinterZ Активный участник Пользователь

    Баллы:
    76
    Имя в Minecraft:
    IcedwinterZ
    А как получить итемы дропнутых вещей
     
  7. Derik

    Derik Активный участник Пользователь

    Баллы:
    76
    Имя в Minecraft:
    Derik
    e.getDrops();

    Вернет List с ItemStack.
    С листа уже по цыклу смотриш какие ItemStack тебе вернулись.[DOUBLEPOST=1469397969,1469396876][/DOUBLEPOST]
    Код:
        @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));
            }
        }
     
    Последнее редактирование: 25 июл 2016
  8. Dereku

    Dereku Старожил

    Баллы:
    173
    Skype:
    derek_unavailable
    Имя в Minecraft:
    _Dereku
    Пишу сразу - ни за какие коврижки не пиши так.
    Тут написано в стиле "разжевать и положить", в действительности так писать нельзя.
    Ну, можно проверить на работоспособность, но не в плагин такое. Это фу.

    Код:
    //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));
        }
    }
     

Поделиться этой страницей