diff --git a/src/main/java/net/minestom/server/event/EventContext.java b/src/main/java/net/minestom/server/event/EventContext.java new file mode 100644 index 000000000..6d4e56339 --- /dev/null +++ b/src/main/java/net/minestom/server/event/EventContext.java @@ -0,0 +1,19 @@ +package net.minestom.server.event; + +import org.jetbrains.annotations.NotNull; + +import java.util.Map; + +public interface EventContext { + @NotNull T filter(@NotNull EventFilter filter); + + void mutate(@NotNull E event); + + @NotNull EventNode currentNode(); + + int executionCount(); + + static EventContext filters(Map, ?> filters) { + throw new UnsupportedOperationException(); + } +} diff --git a/src/main/java/net/minestom/server/event/EventNode.java b/src/main/java/net/minestom/server/event/EventNode.java index ab1740abe..f48237ce4 100644 --- a/src/main/java/net/minestom/server/event/EventNode.java +++ b/src/main/java/net/minestom/server/event/EventNode.java @@ -10,6 +10,7 @@ import org.jetbrains.annotations.Nullable; import java.util.List; import java.util.Set; +import java.util.function.BiConsumer; import java.util.function.BiPredicate; import java.util.function.Consumer; import java.util.function.Predicate; @@ -358,4 +359,14 @@ public sealed interface EventNode permits EventNodeImpl { @ApiStatus.Experimental void unregister(@NotNull EventBinding binding); + + default E call(@NotNull EventContext context, @NotNull E event) { + throw new UnsupportedOperationException(); + } + + @Contract(value = "_, _ -> this") + default @NotNull EventNode addListener(@NotNull Class eventType, + @NotNull BiConsumer, E> listener) { + throw new UnsupportedOperationException(); + } } diff --git a/src/test/java/net/minestom/server/event/EventRecordTest.java b/src/test/java/net/minestom/server/event/EventRecordTest.java new file mode 100644 index 000000000..c5618795b --- /dev/null +++ b/src/test/java/net/minestom/server/event/EventRecordTest.java @@ -0,0 +1,52 @@ +package net.minestom.server.event; + +import net.minestom.server.coordinate.Pos; +import net.minestom.server.event.trait.ItemEvent; +import net.minestom.server.item.ItemStack; +import net.minestom.server.item.Material; +import org.jetbrains.annotations.NotNull; +import org.junit.jupiter.api.Test; + +import java.util.Map; + +import static org.junit.jupiter.api.Assertions.assertEquals; + +public class EventRecordTest { + + record ActionAt(Pos position) implements ItemEvent { + @Override + public @NotNull ItemStack getItemStack() { + // FIXME: Will be removed, as events will not be responsible for the filters anymore + throw new UnsupportedOperationException(); + } + } + + @Test + public void testCall() { + var node = EventNode.all("main"); + ItemStack item = ItemStack.of(Material.DIAMOND); + var action = new ActionAt(Pos.ZERO); + var mutated = new ActionAt(new Pos(1, 1, 1)); + node.addListener(ActionAt.class, (context, event) -> { + assertEquals(action, event); + + ItemStack filter = context.filter(EventFilter.ITEM); + assertEquals(item, filter); + assertEquals(0, context.executionCount()); + assertEquals(node, context.currentNode()); + context.mutate(mutated); + }); + ActionAt result = node.call(EventContext.filters(Map.of(EventFilter.ITEM, item)), action); + assertEquals(mutated, result); + } + + @Test + public void currentNode() { + var node = EventNode.all("main"); + node.addListener(ActionAt.class, (context, event) -> { + var current = context.currentNode(); + assertEquals(node, current); + }); + node.call(EventContext.filters(Map.of()), new ActionAt(Pos.ZERO)); + } +}