Задетектить падение предмета в котёл

  • Автор темы Автор темы Snowmaze
  • Дата начала Дата начала
Статус
Закрыто для дальнейших ответов.

Snowmaze

Участник
Пользователь
Баллы
36
А есть способ нормально задетектить падение предмета в котёл? Или надо мониторить каждый кинутый предмет самому? 1.12.2 версия
 
А есть способ нормально задетектить падение предмета в котёл? Или надо мониторить каждый кинутый предмет самому? 1.12.2 версия
Нету, насколько я знаю. Но такая механика используется в ванили для тушения игроков, которые прыгнули в котёл с водой. Возможно NMS чем-то поможет в этом плане.

Или надо мониторить каждый кинутый предмет самому?
В целом да.
Сделал это за тебя, ибо самому будет интересно поюзать.
PHP:
import org.bukkit.entity.Entity;
import org.bukkit.event.HandlerList;
import org.bukkit.event.entity.EntityEvent;

public class EntityFallEvent extends EntityEvent {
    private static final HandlerList handlers = new HandlerList();

    public EntityFallEvent(Entity entity) {
        super(entity);
    }

    @Override
    public HandlerList getHandlers() {
        return handlers;
    }

    @SuppressWarnings("unused")
    public static HandlerList getHandlerList() {
        return handlers;
    }
}

PHP:
new BukkitRunnable() {
    String key = "pOnGround";

    @Override
    public void run() {
        for (World world : Bukkit.getWorlds()) {
            for (Entity entity : world.getEntities()) {
                boolean actualOnGround = entity.isOnGround();
                Boolean previousOnGround = getNbtValue(entity, key, Boolean.class, null);
                if (previousOnGround == null) {
                    setNbtValue(plugin, entity, key, actualOnGround);
                    continue;
                }
                if (previousOnGround == actualOnGround) continue;
                if (actualOnGround)
                    Bukkit.getPluginManager().callEvent(new EntityFallEvent(entity));
                setNbtValue(plugin, entity, key, actualOnGround);
            }
        }
    }
}.runTaskTimer(plugin, 1L, 1L);

PHP:
private static <T> T getNbtValue(@Nonnull Entity entity, @Nonnull String key, @Nonnull Class<T> type, @Nullable T defaults) {
    Iterator<MetadataValue> iterator = entity.getMetadata(key).iterator();
    return iterator.hasNext() ? type.cast(iterator.next().value()) : defaults;
}

private static void setNbtValue(@Nonnull Plugin plugin, @Nonnull Entity entity, @Nonnull String key, @Nullable Object value) {
    entity.setMetadata(key, new FixedMetadataValue(plugin, value));
}

PHP:
    @EventHandler
    private void on(EntityFallEvent event) {
        Entity entity = event.getEntity();
        if (!(entity instanceof Item)) return;
        Block block = entity.getLocation().getBlock();
        if (block.getType() != Material.CAULDRON) return;
        Item item = (Item) entity;
        ItemStack stack = item.getItemStack();
        Bukkit.broadcastMessage("Предмет " + stack.getType() + " упал в котёл");
    }
 
Последнее редактирование:
Нету, насколько я знаю. Но такая механика используется в ванили для тушения игроков, которые прыгнули в котёл с водой. Возможно NMS чем-то поможет в этом плане.


В целом да.
Сделал это за тебя, ибо самому будет интересно поюзать.
PHP:
import org.bukkit.entity.Entity;
import org.bukkit.event.HandlerList;
import org.bukkit.event.entity.EntityEvent;

public class EntityFallEvent extends EntityEvent {
    private static final HandlerList handlers = new HandlerList();

    public EntityFallEvent(Entity entity) {
        super(entity);
    }

    @Override
    public HandlerList getHandlers() {
        return handlers;
    }

    @SuppressWarnings("unused")
    public static HandlerList getHandlerList() {
        return handlers;
    }
}

PHP:
new BukkitRunnable() {
    String key = "pOnGround";

    @Override
    public void run() {
        for (World world : Bukkit.getWorlds()) {
            for (Entity entity : world.getEntities()) {
                boolean actualOnGround = entity.isOnGround();
                Boolean previousOnGround = getNbtValue(entity, key, Boolean.class, null);
                if (previousOnGround == null) {
                    setNbtValue(plugin, entity, key, actualOnGround);
                    continue;
                }
                if (previousOnGround == actualOnGround) continue;
                if (actualOnGround)
                    Bukkit.getPluginManager().callEvent(new EntityFallEvent(entity));
                setNbtValue(plugin, entity, key, actualOnGround);
            }
        }
    }
}.runTaskTimer(plugin, 1L, 1L);

PHP:
private static <T> T getNbtValue(@Nonnull Entity entity, @Nonnull String key, @Nonnull Class<T> type, @Nullable T defaults) {
    Iterator<MetadataValue> iterator = entity.getMetadata(key).iterator();
    return iterator.hasNext() ? type.cast(iterator.next().value()) : defaults;
}

private static void setNbtValue(@Nonnull Plugin plugin, @Nonnull Entity entity, @Nonnull String key, @Nullable Object value) {
    entity.setMetadata(key, new FixedMetadataValue(plugin, value));
}

PHP:
    @EventHandler
    private void on(EntityFallEvent event) {
        Entity entity = event.getEntity();
        if (!(entity instanceof Item)) return;
        Block block = entity.getLocation().getBlock();
        if (block.getType() != Material.CAULDRON) return;
        Item item = (Item) entity;
        ItemStack stack = item.getItemStack();
        Bukkit.broadcastMessage("Предмет " + stack.getType() + " упал в котёл");
    }
Спасибо, работает. Только оно неплохо так грузит для моей локалки с 1 онлайном
upload_2019-7-5_13-53-38.png
 
Последнее редактирование:
Ну, оптимизируй так, чтобы не грузил )
Можешь попробовать увеличить время между выполнениями раннабла шедулером
а, сейчас посмотрели на сервере, вообще не лагает
lbUUOGdTVLc.jpg

всё
 
Статус
Закрыто для дальнейших ответов.
Назад
Верх