- Баллы
- 76
- Имя в Minecraft
- IcedwinterZ
Как сделать что-бы при выкидывании предметов на землю (в одну точку) на их месте появлялся другой предмет (Типа альтернативный крафт)
Следуйте инструкциям в видео ниже, чтобы узнать, как установить наш сайт как веб-приложение на главный экран вашего устройства.
Примечание: Эта функция может быть недоступна в некоторых браузерах.
Ты забыл newКак то так.Код:e.getDrop().clear(); e.getDrop().add(ItemStack(Material.тыры-пыры));
Я же не готовый код давал... А так информацию к размышлению. Типа в каком направление копать.Ты забыл new
new ItemStack(Material.тыры-пыры)
А как получить итемы дропнутых вещейКак то так.Код:e.getDrop().clear(); e.getDrop().add(ItemStack(Material.тыры-пыры));
e.getDrops();А как получить итемы дропнутых вещей
@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));
}
}
//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));
}
}