Minestom/src/main/java/net/minestom/server/event/EventFilter.java

68 lines
2.4 KiB
Java
Raw Normal View History

2021-06-02 20:23:50 +02:00
package net.minestom.server.event;
import net.minestom.server.entity.Entity;
import net.minestom.server.entity.Player;
2021-06-02 22:47:45 +02:00
import net.minestom.server.event.trait.*;
import net.minestom.server.instance.Instance;
import net.minestom.server.inventory.Inventory;
import net.minestom.server.item.ItemStack;
2021-06-02 20:23:50 +02:00
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
import java.util.function.Function;
2021-06-08 22:58:48 +02:00
/**
* Represents a filter for a specific {@link Event} type.
* <p>
* The handler represents a "target" of the event. This can be used
* to create filters for all events of a specific type using information
* about the target.
* <p>
* For example, the target of a {@link PlayerEvent} is a {@link Player} so
* you could create a player event filter which checks if the target player
* is in creative mode.
*
* @param <E> The event type to filter
* @param <H> The handler type to filter on.
*/
public interface EventFilter<E extends Event, H> {
2021-06-02 20:23:50 +02:00
2021-06-02 23:04:35 +02:00
EventFilter<Event, ?> ALL = from(Event.class, null);
2021-06-02 22:58:43 +02:00
EventFilter<EntityEvent, Entity> ENTITY = from(EntityEvent.class, EntityEvent::getEntity);
EventFilter<PlayerEvent, Player> PLAYER = from(PlayerEvent.class, PlayerEvent::getPlayer);
EventFilter<ItemEvent, ItemStack> ITEM = from(ItemEvent.class, ItemEvent::getItemStack);
EventFilter<InstanceEvent, Instance> INSTANCE = from(InstanceEvent.class, InstanceEvent::getInstance);
EventFilter<InventoryEvent, Inventory> INVENTORY = from(InventoryEvent.class, InventoryEvent::getInventory);
2021-06-02 20:23:50 +02:00
static <E extends Event, H> EventFilter<E, H> from(@NotNull Class<E> eventType,
2021-06-02 22:55:24 +02:00
@Nullable Function<E, H> handlerGetter) {
2021-06-02 20:23:50 +02:00
return new EventFilter<>() {
@Override
public @Nullable H getHandler(@NotNull E event) {
2021-06-02 22:55:24 +02:00
return handlerGetter != null ? handlerGetter.apply(event) : null;
2021-06-02 20:23:50 +02:00
}
@Override
public @NotNull Class<E> getEventType() {
return eventType;
}
};
}
2021-06-08 22:58:48 +02:00
/**
* Gets the handler for the given event instance, or null if the event
* type has no handler.
*
* @param event The event instance
* @return The handler, if it exists for the given event
*/
2021-06-02 20:23:50 +02:00
@Nullable H getHandler(@NotNull E event);
2021-06-08 22:58:48 +02:00
/**
* The event type to filter on.
*
* @return The event type.
*/
2021-06-02 20:23:50 +02:00
@NotNull Class<E> getEventType();
}