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

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

Discussion in 'Разработка плагинов для новичков' started by IcedwinterZ, Jul 24, 2016.

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

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

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

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

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

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

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

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

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

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

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

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

    Trophy Points:
    76
    Имя в Minecraft:
    Derik
    e.getDrops();

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

    Dereku Старожил

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

    Code:
    //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));
        }
    }
     

Share This Page