From e45c60c225d0f8e67c6bdecf7560e39c29be77e8 Mon Sep 17 00:00:00 2001 From: TheMode Date: Tue, 4 May 2021 00:46:18 +0200 Subject: [PATCH 001/104] Initial revamped event listening API --- .../java/net/minestom/server/event/Event.java | 83 +++++++++++++++++++ src/test/java/demo/PlayerInit.java | 11 +++ 2 files changed, 94 insertions(+) diff --git a/src/main/java/net/minestom/server/event/Event.java b/src/main/java/net/minestom/server/event/Event.java index 047a6980e..3348f6653 100644 --- a/src/main/java/net/minestom/server/event/Event.java +++ b/src/main/java/net/minestom/server/event/Event.java @@ -1,6 +1,14 @@ package net.minestom.server.event; import net.minestom.server.event.handler.EventHandler; +import org.jetbrains.annotations.NotNull; + +import java.util.ArrayList; +import java.util.List; +import java.util.Set; +import java.util.concurrent.CopyOnWriteArraySet; +import java.util.function.Consumer; +import java.util.function.Function; /** * Object which can be listened to by an {@link EventHandler}. @@ -8,4 +16,79 @@ import net.minestom.server.event.handler.EventHandler; * Called using {@link EventHandler#callEvent(Class, Event)}. */ public class Event { + + public static Listener.Builder entity(Class eventType) { + return new Listener.Builder<>(eventType); + } + + public static Listener.Builder player(Class eventType) { + return new Listener.Builder<>(eventType); + } + + + public static class Listener { + + private final Class eventType; + private final Set attach = new CopyOnWriteArraySet<>(); + private final Consumer combined; + + private Listener(Class eventType, @NotNull Consumer combined) { + this.eventType = eventType; + this.combined = combined; + } + + public void attachTo(@NotNull EventHandler handler) { + final boolean success = this.attach.add(handler); + if (success) { + handler.addEventCallback(eventType, combined::accept); + } + } + + public void detachFrom(@NotNull EventHandler handler) { + final boolean success = this.attach.remove(handler); + if (success) { + handler.removeEventCallback(eventType, combined::accept); + } + } + + public static class Builder { + + private final Class eventType; + + private List> filters = new ArrayList<>(); + private Consumer handler; + + private Builder(Class eventType) { + this.eventType = eventType; + } + + public Builder filter(Function filter) { + this.filters.add(filter); + return this; + } + + public Builder handler(Consumer handler) { + this.handler = handler; + return this; + } + + public Listener build() { + return new Listener<>(eventType, event -> { + // Filtering + if (!filters.isEmpty()) { + if (filters.stream().anyMatch(tBooleanFunction -> !tBooleanFunction.apply(event))) { + // Cancelled + return; + } + } + + // Handler + if (handler != null) { + handler.accept(event); + } + }); + } + } + } + } diff --git a/src/test/java/demo/PlayerInit.java b/src/test/java/demo/PlayerInit.java index 6ac680612..6c68581ed 100644 --- a/src/test/java/demo/PlayerInit.java +++ b/src/test/java/demo/PlayerInit.java @@ -11,6 +11,7 @@ import net.minestom.server.entity.GameMode; import net.minestom.server.entity.ItemEntity; import net.minestom.server.entity.Player; import net.minestom.server.entity.damage.DamageType; +import net.minestom.server.event.Event; import net.minestom.server.event.GlobalEventHandler; import net.minestom.server.event.entity.EntityAttackEvent; import net.minestom.server.event.item.ItemDropEvent; @@ -136,6 +137,16 @@ public class PlayerInit { GlobalEventHandler globalEventHandler = MinecraftServer.getGlobalEventHandler(); + connectionManager.addPlayerInitialization(player -> { + + var listener = Event.player(PlayerChatEvent.class) + .filter(playerChatEvent -> player.isCreative()) + .handler(playerChatEvent -> Audiences.players().sendMessage(Component.text("Listener is working!"))) + .build(); + listener.attachTo(player); + + }); + globalEventHandler.addEventCallback(EntityAttackEvent.class, event -> { final Entity source = event.getEntity(); final Entity entity = event.getTarget(); From 4012b6d0bdd62ab55f05291d7366445e21e9a82a Mon Sep 17 00:00:00 2001 From: TheMode Date: Tue, 4 May 2021 23:26:51 +0200 Subject: [PATCH 002/104] Use a predicate instead of boolean function --- src/main/java/net/minestom/server/event/Event.java | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/main/java/net/minestom/server/event/Event.java b/src/main/java/net/minestom/server/event/Event.java index 3348f6653..2aebbac11 100644 --- a/src/main/java/net/minestom/server/event/Event.java +++ b/src/main/java/net/minestom/server/event/Event.java @@ -8,7 +8,7 @@ import java.util.List; import java.util.Set; import java.util.concurrent.CopyOnWriteArraySet; import java.util.function.Consumer; -import java.util.function.Function; +import java.util.function.Predicate; /** * Object which can be listened to by an {@link EventHandler}. @@ -55,14 +55,14 @@ public class Event { private final Class eventType; - private List> filters = new ArrayList<>(); + private List> filters = new ArrayList<>(); private Consumer handler; private Builder(Class eventType) { this.eventType = eventType; } - public Builder filter(Function filter) { + public Builder filter(Predicate filter) { this.filters.add(filter); return this; } @@ -76,7 +76,7 @@ public class Event { return new Listener<>(eventType, event -> { // Filtering if (!filters.isEmpty()) { - if (filters.stream().anyMatch(tBooleanFunction -> !tBooleanFunction.apply(event))) { + if (filters.stream().anyMatch(filter -> !filter.test(event))) { // Cancelled return; } From 3cb7cdaea83d932556c31af73bf1e37800d75ea4 Mon Sep 17 00:00:00 2001 From: TheMode Date: Tue, 11 May 2021 04:52:57 +0200 Subject: [PATCH 003/104] Create EventListener class --- .../java/net/minestom/server/event/Event.java | 84 +------------------ .../minestom/server/event/EventListener.java | 76 +++++++++++++++++ 2 files changed, 80 insertions(+), 80 deletions(-) create mode 100644 src/main/java/net/minestom/server/event/EventListener.java diff --git a/src/main/java/net/minestom/server/event/Event.java b/src/main/java/net/minestom/server/event/Event.java index 2aebbac11..e3322b671 100644 --- a/src/main/java/net/minestom/server/event/Event.java +++ b/src/main/java/net/minestom/server/event/Event.java @@ -1,14 +1,6 @@ package net.minestom.server.event; import net.minestom.server.event.handler.EventHandler; -import org.jetbrains.annotations.NotNull; - -import java.util.ArrayList; -import java.util.List; -import java.util.Set; -import java.util.concurrent.CopyOnWriteArraySet; -import java.util.function.Consumer; -import java.util.function.Predicate; /** * Object which can be listened to by an {@link EventHandler}. @@ -16,79 +8,11 @@ import java.util.function.Predicate; * Called using {@link EventHandler#callEvent(Class, Event)}. */ public class Event { - - public static Listener.Builder entity(Class eventType) { - return new Listener.Builder<>(eventType); + public static EventListener.Builder entity(Class eventType) { + return new EventListener.Builder<>(eventType); } - public static Listener.Builder player(Class eventType) { - return new Listener.Builder<>(eventType); + public static EventListener.Builder player(Class eventType) { + return new EventListener.Builder<>(eventType); } - - - public static class Listener { - - private final Class eventType; - private final Set attach = new CopyOnWriteArraySet<>(); - private final Consumer combined; - - private Listener(Class eventType, @NotNull Consumer combined) { - this.eventType = eventType; - this.combined = combined; - } - - public void attachTo(@NotNull EventHandler handler) { - final boolean success = this.attach.add(handler); - if (success) { - handler.addEventCallback(eventType, combined::accept); - } - } - - public void detachFrom(@NotNull EventHandler handler) { - final boolean success = this.attach.remove(handler); - if (success) { - handler.removeEventCallback(eventType, combined::accept); - } - } - - public static class Builder { - - private final Class eventType; - - private List> filters = new ArrayList<>(); - private Consumer handler; - - private Builder(Class eventType) { - this.eventType = eventType; - } - - public Builder filter(Predicate filter) { - this.filters.add(filter); - return this; - } - - public Builder handler(Consumer handler) { - this.handler = handler; - return this; - } - - public Listener build() { - return new Listener<>(eventType, event -> { - // Filtering - if (!filters.isEmpty()) { - if (filters.stream().anyMatch(filter -> !filter.test(event))) { - // Cancelled - return; - } - } - - // Handler - if (handler != null) { - handler.accept(event); - } - }); - } - } - } - } diff --git a/src/main/java/net/minestom/server/event/EventListener.java b/src/main/java/net/minestom/server/event/EventListener.java new file mode 100644 index 000000000..6fbbf334a --- /dev/null +++ b/src/main/java/net/minestom/server/event/EventListener.java @@ -0,0 +1,76 @@ +package net.minestom.server.event; + +import net.minestom.server.event.handler.EventHandler; +import org.jetbrains.annotations.NotNull; + +import java.util.ArrayList; +import java.util.List; +import java.util.Set; +import java.util.concurrent.CopyOnWriteArraySet; +import java.util.function.Consumer; +import java.util.function.Predicate; + +public class EventListener { + + private final Class eventType; + private final Set attach = new CopyOnWriteArraySet<>(); + private final Consumer combined; + + private EventListener(Class eventType, @NotNull Consumer combined) { + this.eventType = eventType; + this.combined = combined; + } + + public void attachTo(@NotNull EventHandler handler) { + final boolean success = this.attach.add(handler); + if (success) { + handler.addEventCallback(eventType, combined::accept); + } + } + + public void detachFrom(@NotNull EventHandler handler) { + final boolean success = this.attach.remove(handler); + if (success) { + handler.removeEventCallback(eventType, combined::accept); + } + } + + public static class Builder { + + private final Class eventType; + + private List> filters = new ArrayList<>(); + private Consumer handler; + + protected Builder(Class eventType) { + this.eventType = eventType; + } + + public EventListener.Builder filter(Predicate filter) { + this.filters.add(filter); + return this; + } + + public EventListener.Builder handler(Consumer handler) { + this.handler = handler; + return this; + } + + public EventListener build() { + return new EventListener<>(eventType, event -> { + // Filtering + if (!filters.isEmpty()) { + if (filters.stream().anyMatch(filter -> !filter.test(event))) { + // Cancelled + return; + } + } + + // Handler + if (handler != null) { + handler.accept(event); + } + }); + } + } +} From 36942708bb3435769fed7615248ea28927e982e5 Mon Sep 17 00:00:00 2001 From: TheMode Date: Thu, 13 May 2021 09:11:02 +0200 Subject: [PATCH 004/104] Introduce EventGroup --- .../java/net/minestom/server/event/Event.java | 5 ++++ .../net/minestom/server/event/EventGroup.java | 27 +++++++++++++++++++ .../minestom/server/event/EventListener.java | 4 ++- .../minestom/server/event/ListenerAttach.java | 10 +++++++ src/test/java/demo/PlayerInit.java | 5 +++- 5 files changed, 49 insertions(+), 2 deletions(-) create mode 100644 src/main/java/net/minestom/server/event/EventGroup.java create mode 100644 src/main/java/net/minestom/server/event/ListenerAttach.java diff --git a/src/main/java/net/minestom/server/event/Event.java b/src/main/java/net/minestom/server/event/Event.java index e3322b671..eb2ba5333 100644 --- a/src/main/java/net/minestom/server/event/Event.java +++ b/src/main/java/net/minestom/server/event/Event.java @@ -1,6 +1,7 @@ package net.minestom.server.event; import net.minestom.server.event.handler.EventHandler; +import org.jetbrains.annotations.NotNull; /** * Object which can be listened to by an {@link EventHandler}. @@ -8,6 +9,10 @@ import net.minestom.server.event.handler.EventHandler; * Called using {@link EventHandler#callEvent(Class, Event)}. */ public class Event { + public static EventGroup group(@NotNull EventListener... listeners) { + return new EventGroup(listeners); + } + public static EventListener.Builder entity(Class eventType) { return new EventListener.Builder<>(eventType); } diff --git a/src/main/java/net/minestom/server/event/EventGroup.java b/src/main/java/net/minestom/server/event/EventGroup.java new file mode 100644 index 000000000..258b9cfa6 --- /dev/null +++ b/src/main/java/net/minestom/server/event/EventGroup.java @@ -0,0 +1,27 @@ +package net.minestom.server.event; + +import net.minestom.server.event.handler.EventHandler; +import org.jetbrains.annotations.NotNull; + +public class EventGroup implements ListenerAttach { + + private final EventListener[] listeners; + + protected EventGroup(@NotNull EventListener... listeners) { + this.listeners = listeners; + } + + @Override + public void attachTo(@NotNull EventHandler handler) { + for (EventListener listener : listeners) { + listener.attachTo(handler); + } + } + + @Override + public void detachFrom(@NotNull EventHandler handler) { + for (EventListener listener : listeners) { + listener.detachFrom(handler); + } + } +} diff --git a/src/main/java/net/minestom/server/event/EventListener.java b/src/main/java/net/minestom/server/event/EventListener.java index 6fbbf334a..b19b80d24 100644 --- a/src/main/java/net/minestom/server/event/EventListener.java +++ b/src/main/java/net/minestom/server/event/EventListener.java @@ -10,7 +10,7 @@ import java.util.concurrent.CopyOnWriteArraySet; import java.util.function.Consumer; import java.util.function.Predicate; -public class EventListener { +public class EventListener implements ListenerAttach { private final Class eventType; private final Set attach = new CopyOnWriteArraySet<>(); @@ -21,6 +21,7 @@ public class EventListener { this.combined = combined; } + @Override public void attachTo(@NotNull EventHandler handler) { final boolean success = this.attach.add(handler); if (success) { @@ -28,6 +29,7 @@ public class EventListener { } } + @Override public void detachFrom(@NotNull EventHandler handler) { final boolean success = this.attach.remove(handler); if (success) { diff --git a/src/main/java/net/minestom/server/event/ListenerAttach.java b/src/main/java/net/minestom/server/event/ListenerAttach.java new file mode 100644 index 000000000..7f3122db4 --- /dev/null +++ b/src/main/java/net/minestom/server/event/ListenerAttach.java @@ -0,0 +1,10 @@ +package net.minestom.server.event; + +import net.minestom.server.event.handler.EventHandler; +import org.jetbrains.annotations.NotNull; + +public interface ListenerAttach { + void attachTo(@NotNull EventHandler handler); + + void detachFrom(@NotNull EventHandler handler); +} diff --git a/src/test/java/demo/PlayerInit.java b/src/test/java/demo/PlayerInit.java index 6c68581ed..e8eec1940 100644 --- a/src/test/java/demo/PlayerInit.java +++ b/src/test/java/demo/PlayerInit.java @@ -143,7 +143,10 @@ public class PlayerInit { .filter(playerChatEvent -> player.isCreative()) .handler(playerChatEvent -> Audiences.players().sendMessage(Component.text("Listener is working!"))) .build(); - listener.attachTo(player); + //listener.attachTo(player); + + var group = Event.group(listener); + group.attachTo(player); }); From 02fe4c65a230dfbb04b10c5db4a0f4e19261f606 Mon Sep 17 00:00:00 2001 From: TheMode Date: Wed, 2 Jun 2021 07:09:15 +0200 Subject: [PATCH 005/104] Use traits for events --- .../minestom/server/event/EntityEvent.java | 23 ------------------- .../java/net/minestom/server/event/Event.java | 12 ---------- .../minestom/server/event/PlayerEvent.java | 23 ------------------- .../event/entity/EntityAttackEvent.java | 13 ++++++++--- .../event/entity/EntityDamageEvent.java | 9 +++++--- .../server/event/entity/EntityDeathEvent.java | 13 ++++++++--- .../server/event/entity/EntityFireEvent.java | 14 ++++++++--- .../event/entity/EntityItemMergeEvent.java | 9 +++++--- .../event/entity/EntityPotionAddEvent.java | 14 ++++++++--- .../event/entity/EntityPotionRemoveEvent.java | 13 ++++++++--- .../server/event/entity/EntityShootEvent.java | 12 +++++++--- .../server/event/entity/EntitySpawnEvent.java | 8 ++++--- .../server/event/entity/EntityTickEvent.java | 13 ++++++++--- .../event/entity/EntityVelocityEvent.java | 8 ++++--- .../event/player/AdvancementTabEvent.java | 13 ++++++++--- .../player/AsyncPlayerPreLoginEvent.java | 13 ++++++++--- .../event/player/PlayerBlockBreakEvent.java | 13 ++++++++--- .../player/PlayerBlockInteractEvent.java | 13 ++++++++--- .../event/player/PlayerBlockPlaceEvent.java | 13 ++++++++--- .../player/PlayerChangeHeldSlotEvent.java | 13 ++++++++--- .../server/event/player/PlayerChatEvent.java | 13 ++++++++--- .../event/player/PlayerChunkLoadEvent.java | 13 ++++++++--- .../event/player/PlayerChunkUnloadEvent.java | 13 ++++++++--- .../event/player/PlayerCommandEvent.java | 13 ++++++++--- .../server/event/player/PlayerDeathEvent.java | 13 ++++++++--- .../event/player/PlayerDisconnectEvent.java | 14 ++++++++--- .../server/event/player/PlayerEatEvent.java | 13 ++++++++--- .../player/PlayerEntityInteractEvent.java | 13 ++++++++--- .../player/PlayerHandAnimationEvent.java | 13 ++++++++--- .../player/PlayerItemAnimationEvent.java | 13 ++++++++--- .../server/event/player/PlayerLoginEvent.java | 13 ++++++++--- .../server/event/player/PlayerMoveEvent.java | 13 ++++++++--- .../player/PlayerPluginMessageEvent.java | 13 ++++++++--- .../event/player/PlayerPreEatEvent.java | 13 ++++++++--- .../player/PlayerResourcePackStatusEvent.java | 13 ++++++++--- .../event/player/PlayerRespawnEvent.java | 13 ++++++++--- .../player/PlayerSettingsChangeEvent.java | 9 +++++--- .../event/player/PlayerSkinInitEvent.java | 13 ++++++++--- .../server/event/player/PlayerSpawnEvent.java | 13 ++++++++--- .../event/player/PlayerStartDiggingEvent.java | 13 ++++++++--- .../event/player/PlayerStartFlyingEvent.java | 14 ++++++++--- .../PlayerStartFlyingWithElytraEvent.java | 14 ++++++++--- .../player/PlayerStartSneakingEvent.java | 14 ++++++++--- .../player/PlayerStartSprintingEvent.java | 14 ++++++++--- .../event/player/PlayerStopFlyingEvent.java | 14 ++++++++--- .../PlayerStopFlyingWithElytraEvent.java | 14 ++++++++--- .../event/player/PlayerStopSneakingEvent.java | 14 ++++++++--- .../player/PlayerStopSprintingEvent.java | 14 ++++++++--- .../event/player/PlayerSwapItemEvent.java | 13 ++++++++--- .../server/event/player/PlayerTickEvent.java | 14 ++++++++--- .../event/player/PlayerUseItemEvent.java | 13 ++++++++--- .../player/PlayerUseItemOnBlockEvent.java | 13 ++++++++--- .../server/event/trait/EntityEvent.java | 14 +++++++++++ .../server/event/trait/ItemEvent.java | 8 +++++++ .../server/event/trait/PlayerEvent.java | 14 +++++++++++ src/test/java/demo/PlayerInit.java | 15 ------------ 56 files changed, 515 insertions(+), 220 deletions(-) delete mode 100644 src/main/java/net/minestom/server/event/EntityEvent.java delete mode 100644 src/main/java/net/minestom/server/event/PlayerEvent.java create mode 100644 src/main/java/net/minestom/server/event/trait/EntityEvent.java create mode 100644 src/main/java/net/minestom/server/event/trait/ItemEvent.java create mode 100644 src/main/java/net/minestom/server/event/trait/PlayerEvent.java diff --git a/src/main/java/net/minestom/server/event/EntityEvent.java b/src/main/java/net/minestom/server/event/EntityEvent.java deleted file mode 100644 index 49485c1e2..000000000 --- a/src/main/java/net/minestom/server/event/EntityEvent.java +++ /dev/null @@ -1,23 +0,0 @@ -package net.minestom.server.event; - -import net.minestom.server.entity.Entity; -import org.jetbrains.annotations.NotNull; - -public class EntityEvent extends Event { - - protected final Entity entity; - - public EntityEvent(@NotNull Entity entity) { - this.entity = entity; - } - - /** - * Gets the entity of this event. - * - * @return the entity - */ - @NotNull - public Entity getEntity() { - return entity; - } -} diff --git a/src/main/java/net/minestom/server/event/Event.java b/src/main/java/net/minestom/server/event/Event.java index eb2ba5333..047a6980e 100644 --- a/src/main/java/net/minestom/server/event/Event.java +++ b/src/main/java/net/minestom/server/event/Event.java @@ -1,7 +1,6 @@ package net.minestom.server.event; import net.minestom.server.event.handler.EventHandler; -import org.jetbrains.annotations.NotNull; /** * Object which can be listened to by an {@link EventHandler}. @@ -9,15 +8,4 @@ import org.jetbrains.annotations.NotNull; * Called using {@link EventHandler#callEvent(Class, Event)}. */ public class Event { - public static EventGroup group(@NotNull EventListener... listeners) { - return new EventGroup(listeners); - } - - public static EventListener.Builder entity(Class eventType) { - return new EventListener.Builder<>(eventType); - } - - public static EventListener.Builder player(Class eventType) { - return new EventListener.Builder<>(eventType); - } } diff --git a/src/main/java/net/minestom/server/event/PlayerEvent.java b/src/main/java/net/minestom/server/event/PlayerEvent.java deleted file mode 100644 index 21185ebbe..000000000 --- a/src/main/java/net/minestom/server/event/PlayerEvent.java +++ /dev/null @@ -1,23 +0,0 @@ -package net.minestom.server.event; - -import net.minestom.server.entity.Player; -import org.jetbrains.annotations.NotNull; - -public class PlayerEvent extends Event { - - protected final Player player; - - public PlayerEvent(@NotNull Player player) { - this.player = player; - } - - /** - * Gets the player. - * - * @return the player - */ - @NotNull - public Player getPlayer() { - return player; - } -} diff --git a/src/main/java/net/minestom/server/event/entity/EntityAttackEvent.java b/src/main/java/net/minestom/server/event/entity/EntityAttackEvent.java index 13b2a8ebc..4c0f89b58 100644 --- a/src/main/java/net/minestom/server/event/entity/EntityAttackEvent.java +++ b/src/main/java/net/minestom/server/event/entity/EntityAttackEvent.java @@ -1,22 +1,29 @@ package net.minestom.server.event.entity; import net.minestom.server.entity.Entity; -import net.minestom.server.event.EntityEvent; +import net.minestom.server.event.Event; +import net.minestom.server.event.trait.EntityEvent; import org.jetbrains.annotations.NotNull; /** * Called when a player does a left click on an entity or with * {@link net.minestom.server.entity.EntityCreature#attack(Entity)}. */ -public class EntityAttackEvent extends EntityEvent { +public class EntityAttackEvent extends Event implements EntityEvent { + private final Entity entity; private final Entity target; public EntityAttackEvent(@NotNull Entity source, @NotNull Entity target) { - super(source); + this.entity = source; this.target = target; } + @Override + public @NotNull Entity getEntity() { + return entity; + } + /** * @return the target of the attack */ diff --git a/src/main/java/net/minestom/server/event/entity/EntityDamageEvent.java b/src/main/java/net/minestom/server/event/entity/EntityDamageEvent.java index 5ea4aad2b..a7b9ec8df 100644 --- a/src/main/java/net/minestom/server/event/entity/EntityDamageEvent.java +++ b/src/main/java/net/minestom/server/event/entity/EntityDamageEvent.java @@ -1,23 +1,26 @@ package net.minestom.server.event.entity; +import net.minestom.server.entity.Entity; import net.minestom.server.entity.LivingEntity; import net.minestom.server.entity.damage.DamageType; import net.minestom.server.event.CancellableEvent; -import net.minestom.server.event.EntityEvent; +import net.minestom.server.event.Event; +import net.minestom.server.event.trait.EntityEvent; import org.jetbrains.annotations.NotNull; /** * Called with {@link LivingEntity#damage(DamageType, float)}. */ -public class EntityDamageEvent extends EntityEvent implements CancellableEvent { +public class EntityDamageEvent extends Event implements EntityEvent, CancellableEvent { + private final Entity entity; private final DamageType damageType; private float damage; private boolean cancelled; public EntityDamageEvent(@NotNull LivingEntity entity, @NotNull DamageType damageType, float damage) { - super(entity); + this.entity = entity; this.damageType = damageType; this.damage = damage; } diff --git a/src/main/java/net/minestom/server/event/entity/EntityDeathEvent.java b/src/main/java/net/minestom/server/event/entity/EntityDeathEvent.java index 7bb3c7b7a..2e5a26e29 100644 --- a/src/main/java/net/minestom/server/event/entity/EntityDeathEvent.java +++ b/src/main/java/net/minestom/server/event/entity/EntityDeathEvent.java @@ -1,14 +1,21 @@ package net.minestom.server.event.entity; import net.minestom.server.entity.Entity; -import net.minestom.server.event.EntityEvent; +import net.minestom.server.event.Event; +import net.minestom.server.event.trait.EntityEvent; import org.jetbrains.annotations.NotNull; -public class EntityDeathEvent extends EntityEvent { +public class EntityDeathEvent extends Event implements EntityEvent { // TODO cause + private final Entity entity; public EntityDeathEvent(@NotNull Entity entity) { - super(entity); + this.entity = entity; + } + + @Override + public @NotNull Entity getEntity() { + return entity; } } diff --git a/src/main/java/net/minestom/server/event/entity/EntityFireEvent.java b/src/main/java/net/minestom/server/event/entity/EntityFireEvent.java index 8a1355af3..8ade431aa 100644 --- a/src/main/java/net/minestom/server/event/entity/EntityFireEvent.java +++ b/src/main/java/net/minestom/server/event/entity/EntityFireEvent.java @@ -2,18 +2,21 @@ package net.minestom.server.event.entity; import net.minestom.server.entity.Entity; import net.minestom.server.event.CancellableEvent; -import net.minestom.server.event.EntityEvent; +import net.minestom.server.event.Event; +import net.minestom.server.event.trait.EntityEvent; import net.minestom.server.utils.time.TimeUnit; +import org.jetbrains.annotations.NotNull; -public class EntityFireEvent extends EntityEvent implements CancellableEvent { +public class EntityFireEvent extends Event implements EntityEvent, CancellableEvent { + private final Entity entity; private int duration; private TimeUnit timeUnit; private boolean cancelled; public EntityFireEvent(Entity entity, int duration, TimeUnit timeUnit) { - super(entity); + this.entity = entity; setFireTime(duration, timeUnit); } @@ -43,4 +46,9 @@ public class EntityFireEvent extends EntityEvent implements CancellableEvent { public void setCancelled(boolean cancel) { this.cancelled = cancel; } + + @Override + public @NotNull Entity getEntity() { + return entity; + } } diff --git a/src/main/java/net/minestom/server/event/entity/EntityItemMergeEvent.java b/src/main/java/net/minestom/server/event/entity/EntityItemMergeEvent.java index 09a155e84..3e151a06b 100644 --- a/src/main/java/net/minestom/server/event/entity/EntityItemMergeEvent.java +++ b/src/main/java/net/minestom/server/event/entity/EntityItemMergeEvent.java @@ -1,23 +1,26 @@ package net.minestom.server.event.entity; +import net.minestom.server.entity.Entity; import net.minestom.server.entity.ItemEntity; import net.minestom.server.event.CancellableEvent; -import net.minestom.server.event.EntityEvent; +import net.minestom.server.event.Event; +import net.minestom.server.event.trait.EntityEvent; import net.minestom.server.item.ItemStack; import org.jetbrains.annotations.NotNull; /** * Called when two {@link ItemEntity} are merging their {@link ItemStack} together to form a sole entity. */ -public class EntityItemMergeEvent extends EntityEvent implements CancellableEvent { +public class EntityItemMergeEvent extends Event implements EntityEvent, CancellableEvent { + private Entity entity; private final ItemEntity merged; private ItemStack result; private boolean cancelled; public EntityItemMergeEvent(@NotNull ItemEntity source, @NotNull ItemEntity merged, @NotNull ItemStack result) { - super(source); + this.entity = source; this.merged = merged; this.result = result; } diff --git a/src/main/java/net/minestom/server/event/entity/EntityPotionAddEvent.java b/src/main/java/net/minestom/server/event/entity/EntityPotionAddEvent.java index cde952db5..7f1290027 100644 --- a/src/main/java/net/minestom/server/event/entity/EntityPotionAddEvent.java +++ b/src/main/java/net/minestom/server/event/entity/EntityPotionAddEvent.java @@ -1,19 +1,27 @@ package net.minestom.server.event.entity; import net.minestom.server.entity.Entity; -import net.minestom.server.event.EntityEvent; +import net.minestom.server.event.Event; +import net.minestom.server.event.trait.EntityEvent; import net.minestom.server.potion.Potion; import org.jetbrains.annotations.NotNull; -public class EntityPotionAddEvent extends EntityEvent { +public class EntityPotionAddEvent extends Event implements EntityEvent { + private final Entity entity; private final Potion potion; public EntityPotionAddEvent(@NotNull Entity entity, @NotNull Potion potion) { - super(entity); + this.entity = entity; this.potion = potion; } + @NotNull + @Override + public Entity getEntity() { + return entity; + } + /** * Returns the potion that was added. * diff --git a/src/main/java/net/minestom/server/event/entity/EntityPotionRemoveEvent.java b/src/main/java/net/minestom/server/event/entity/EntityPotionRemoveEvent.java index 1ca787a18..0e1ee1552 100644 --- a/src/main/java/net/minestom/server/event/entity/EntityPotionRemoveEvent.java +++ b/src/main/java/net/minestom/server/event/entity/EntityPotionRemoveEvent.java @@ -1,16 +1,18 @@ package net.minestom.server.event.entity; import net.minestom.server.entity.Entity; -import net.minestom.server.event.EntityEvent; +import net.minestom.server.event.Event; +import net.minestom.server.event.trait.EntityEvent; import net.minestom.server.potion.Potion; import org.jetbrains.annotations.NotNull; -public class EntityPotionRemoveEvent extends EntityEvent { +public class EntityPotionRemoveEvent extends Event implements EntityEvent { + private final Entity entity; private final Potion potion; public EntityPotionRemoveEvent(@NotNull Entity entity, @NotNull Potion potion) { - super(entity); + this.entity = entity; this.potion = potion; } @@ -23,4 +25,9 @@ public class EntityPotionRemoveEvent extends EntityEvent { public Potion getPotion() { return potion; } + + @Override + public @NotNull Entity getEntity() { + return entity; + } } diff --git a/src/main/java/net/minestom/server/event/entity/EntityShootEvent.java b/src/main/java/net/minestom/server/event/entity/EntityShootEvent.java index 7ca2df360..db5a229df 100644 --- a/src/main/java/net/minestom/server/event/entity/EntityShootEvent.java +++ b/src/main/java/net/minestom/server/event/entity/EntityShootEvent.java @@ -2,15 +2,17 @@ package net.minestom.server.event.entity; import net.minestom.server.entity.Entity; import net.minestom.server.event.CancellableEvent; -import net.minestom.server.event.EntityEvent; +import net.minestom.server.event.Event; +import net.minestom.server.event.trait.EntityEvent; import net.minestom.server.utils.Position; import org.jetbrains.annotations.NotNull; /** * Called with {@link net.minestom.server.entity.type.projectile.EntityProjectile#shoot(Position, double, double)} */ -public class EntityShootEvent extends EntityEvent implements CancellableEvent { +public class EntityShootEvent extends Event implements EntityEvent, CancellableEvent { + private final Entity entity; private final Entity projectile; private final Position to; private double power; @@ -19,7 +21,7 @@ public class EntityShootEvent extends EntityEvent implements CancellableEvent { private boolean cancelled; public EntityShootEvent(@NotNull Entity entity, @NotNull Entity projectile, @NotNull Position to, double power, double spread) { - super(entity); + this.entity = entity; this.projectile = projectile; this.to = to; this.power = power; @@ -90,4 +92,8 @@ public class EntityShootEvent extends EntityEvent implements CancellableEvent { this.cancelled = cancel; } + @Override + public @NotNull Entity getEntity() { + return entity; + } } diff --git a/src/main/java/net/minestom/server/event/entity/EntitySpawnEvent.java b/src/main/java/net/minestom/server/event/entity/EntitySpawnEvent.java index a53b66ee4..4c8643135 100644 --- a/src/main/java/net/minestom/server/event/entity/EntitySpawnEvent.java +++ b/src/main/java/net/minestom/server/event/entity/EntitySpawnEvent.java @@ -1,19 +1,21 @@ package net.minestom.server.event.entity; import net.minestom.server.entity.Entity; -import net.minestom.server.event.EntityEvent; +import net.minestom.server.event.Event; +import net.minestom.server.event.trait.EntityEvent; import net.minestom.server.instance.Instance; import org.jetbrains.annotations.NotNull; /** * Called when a new instance is set for an entity. */ -public class EntitySpawnEvent extends EntityEvent { +public class EntitySpawnEvent extends Event implements EntityEvent { + private final Entity entity; private final Instance spawnInstance; public EntitySpawnEvent(@NotNull Entity entity, @NotNull Instance spawnInstance) { - super(entity); + this.entity = entity; this.spawnInstance = spawnInstance; } diff --git a/src/main/java/net/minestom/server/event/entity/EntityTickEvent.java b/src/main/java/net/minestom/server/event/entity/EntityTickEvent.java index 0e81c3313..fc7c0c9cf 100644 --- a/src/main/java/net/minestom/server/event/entity/EntityTickEvent.java +++ b/src/main/java/net/minestom/server/event/entity/EntityTickEvent.java @@ -1,17 +1,24 @@ package net.minestom.server.event.entity; import net.minestom.server.entity.Entity; -import net.minestom.server.event.EntityEvent; +import net.minestom.server.event.Event; +import net.minestom.server.event.trait.EntityEvent; import org.jetbrains.annotations.NotNull; /** * Called when an entity ticks itself. * Same event instance used for all tick events for the same entity. */ -public class EntityTickEvent extends EntityEvent { +public class EntityTickEvent extends Event implements EntityEvent { + + private final Entity entity; public EntityTickEvent(@NotNull Entity entity) { - super(entity); + this.entity = entity; } + @Override + public @NotNull Entity getEntity() { + return entity; + } } diff --git a/src/main/java/net/minestom/server/event/entity/EntityVelocityEvent.java b/src/main/java/net/minestom/server/event/entity/EntityVelocityEvent.java index ae0024f99..877b5cf85 100644 --- a/src/main/java/net/minestom/server/event/entity/EntityVelocityEvent.java +++ b/src/main/java/net/minestom/server/event/entity/EntityVelocityEvent.java @@ -2,21 +2,23 @@ package net.minestom.server.event.entity; import net.minestom.server.entity.Entity; import net.minestom.server.event.CancellableEvent; -import net.minestom.server.event.EntityEvent; +import net.minestom.server.event.Event; +import net.minestom.server.event.trait.EntityEvent; import net.minestom.server.utils.Vector; import org.jetbrains.annotations.NotNull; /** * Called when a velocity is applied to an entity using {@link Entity#setVelocity(Vector)}. */ -public class EntityVelocityEvent extends EntityEvent implements CancellableEvent { +public class EntityVelocityEvent extends Event implements EntityEvent, CancellableEvent { + private final Entity entity; private Vector velocity; private boolean cancelled; public EntityVelocityEvent(@NotNull Entity entity, @NotNull Vector velocity) { - super(entity); + this.entity = entity; this.velocity = velocity; } diff --git a/src/main/java/net/minestom/server/event/player/AdvancementTabEvent.java b/src/main/java/net/minestom/server/event/player/AdvancementTabEvent.java index 6270b9887..33d40c021 100644 --- a/src/main/java/net/minestom/server/event/player/AdvancementTabEvent.java +++ b/src/main/java/net/minestom/server/event/player/AdvancementTabEvent.java @@ -2,20 +2,22 @@ package net.minestom.server.event.player; import net.minestom.server.advancements.AdvancementAction; import net.minestom.server.entity.Player; -import net.minestom.server.event.PlayerEvent; +import net.minestom.server.event.Event; +import net.minestom.server.event.trait.PlayerEvent; import org.jetbrains.annotations.NotNull; /** * Called when a {@link Player} opens the advancement screens or switch the tab * and when he closes the screen. */ -public class AdvancementTabEvent extends PlayerEvent { +public class AdvancementTabEvent extends Event implements PlayerEvent { + private final Player player; private final AdvancementAction action; private final String tabId; public AdvancementTabEvent(@NotNull Player player, @NotNull AdvancementAction action, @NotNull String tabId) { - super(player); + this.player = player; this.action = action; this.tabId = tabId; } @@ -41,4 +43,9 @@ public class AdvancementTabEvent extends PlayerEvent { public String getTabId() { return tabId; } + + @Override + public @NotNull Player getPlayer() { + return player; + } } diff --git a/src/main/java/net/minestom/server/event/player/AsyncPlayerPreLoginEvent.java b/src/main/java/net/minestom/server/event/player/AsyncPlayerPreLoginEvent.java index 612dc063b..35363bf70 100644 --- a/src/main/java/net/minestom/server/event/player/AsyncPlayerPreLoginEvent.java +++ b/src/main/java/net/minestom/server/event/player/AsyncPlayerPreLoginEvent.java @@ -1,7 +1,8 @@ package net.minestom.server.event.player; import net.minestom.server.entity.Player; -import net.minestom.server.event.PlayerEvent; +import net.minestom.server.event.Event; +import net.minestom.server.event.trait.PlayerEvent; import org.jetbrains.annotations.NotNull; import java.util.UUID; @@ -10,13 +11,14 @@ import java.util.UUID; * Called before the player initialization, it can be used to kick the player before any connection * or to change his final username/uuid. */ -public class AsyncPlayerPreLoginEvent extends PlayerEvent { +public class AsyncPlayerPreLoginEvent extends Event implements PlayerEvent { + private final Player player; private String username; private UUID playerUuid; public AsyncPlayerPreLoginEvent(@NotNull Player player, @NotNull String username, @NotNull UUID playerUuid) { - super(player); + this.player = player; this.username = username; this.playerUuid = playerUuid; } @@ -58,4 +60,9 @@ public class AsyncPlayerPreLoginEvent extends PlayerEvent { public void setPlayerUuid(@NotNull UUID playerUuid) { this.playerUuid = playerUuid; } + + @Override + public @NotNull Player getPlayer() { + return player; + } } diff --git a/src/main/java/net/minestom/server/event/player/PlayerBlockBreakEvent.java b/src/main/java/net/minestom/server/event/player/PlayerBlockBreakEvent.java index 57c370c44..2d89352fc 100644 --- a/src/main/java/net/minestom/server/event/player/PlayerBlockBreakEvent.java +++ b/src/main/java/net/minestom/server/event/player/PlayerBlockBreakEvent.java @@ -3,7 +3,8 @@ package net.minestom.server.event.player; import net.minestom.server.MinecraftServer; import net.minestom.server.entity.Player; import net.minestom.server.event.CancellableEvent; -import net.minestom.server.event.PlayerEvent; +import net.minestom.server.event.Event; +import net.minestom.server.event.trait.PlayerEvent; import net.minestom.server.instance.block.BlockManager; import net.minestom.server.instance.block.CustomBlock; import net.minestom.server.utils.BlockPosition; @@ -11,10 +12,11 @@ import net.minestom.server.utils.validate.Check; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; -public class PlayerBlockBreakEvent extends PlayerEvent implements CancellableEvent { +public class PlayerBlockBreakEvent extends Event implements PlayerEvent, CancellableEvent { private static final BlockManager BLOCK_MANAGER = MinecraftServer.getBlockManager(); + private final Player player; private final BlockPosition blockPosition; private final short blockStateId; @@ -28,7 +30,7 @@ public class PlayerBlockBreakEvent extends PlayerEvent implements CancellableEve public PlayerBlockBreakEvent(@NotNull Player player, @NotNull BlockPosition blockPosition, short blockStateId, @Nullable CustomBlock customBlock, short resultBlockStateId, short resultCustomBlockId) { - super(player); + this.player = player; this.blockPosition = blockPosition; @@ -151,4 +153,9 @@ public class PlayerBlockBreakEvent extends PlayerEvent implements CancellableEve public void setCancelled(boolean cancel) { this.cancelled = cancel; } + + @Override + public @NotNull Player getPlayer() { + return player; + } } diff --git a/src/main/java/net/minestom/server/event/player/PlayerBlockInteractEvent.java b/src/main/java/net/minestom/server/event/player/PlayerBlockInteractEvent.java index da1075a34..a9fc6a365 100644 --- a/src/main/java/net/minestom/server/event/player/PlayerBlockInteractEvent.java +++ b/src/main/java/net/minestom/server/event/player/PlayerBlockInteractEvent.java @@ -2,7 +2,8 @@ package net.minestom.server.event.player; import net.minestom.server.entity.Player; import net.minestom.server.event.CancellableEvent; -import net.minestom.server.event.PlayerEvent; +import net.minestom.server.event.Event; +import net.minestom.server.event.trait.PlayerEvent; import net.minestom.server.instance.block.BlockFace; import net.minestom.server.utils.BlockPosition; import org.jetbrains.annotations.NotNull; @@ -11,8 +12,9 @@ import org.jetbrains.annotations.NotNull; * Called when a player interacts with a block (right-click). * This is also called when a block is placed. */ -public class PlayerBlockInteractEvent extends PlayerEvent implements CancellableEvent { +public class PlayerBlockInteractEvent extends Event implements PlayerEvent, CancellableEvent { + private final Player player; private final BlockPosition blockPosition; private final Player.Hand hand; private final BlockFace blockFace; @@ -27,7 +29,7 @@ public class PlayerBlockInteractEvent extends PlayerEvent implements Cancellable public PlayerBlockInteractEvent(@NotNull Player player, @NotNull BlockPosition blockPosition, @NotNull Player.Hand hand, @NotNull BlockFace blockFace) { - super(player); + this.player = player; this.blockPosition = blockPosition; this.hand = hand; this.blockFace = blockFace; @@ -85,4 +87,9 @@ public class PlayerBlockInteractEvent extends PlayerEvent implements Cancellable public void setCancelled(boolean cancel) { this.cancelled = cancel; } + + @Override + public @NotNull Player getPlayer() { + return player; + } } diff --git a/src/main/java/net/minestom/server/event/player/PlayerBlockPlaceEvent.java b/src/main/java/net/minestom/server/event/player/PlayerBlockPlaceEvent.java index 2651b92d5..0e462dabb 100644 --- a/src/main/java/net/minestom/server/event/player/PlayerBlockPlaceEvent.java +++ b/src/main/java/net/minestom/server/event/player/PlayerBlockPlaceEvent.java @@ -4,7 +4,8 @@ import net.minestom.server.MinecraftServer; import net.minestom.server.data.Data; import net.minestom.server.entity.Player; import net.minestom.server.event.CancellableEvent; -import net.minestom.server.event.PlayerEvent; +import net.minestom.server.event.Event; +import net.minestom.server.event.trait.PlayerEvent; import net.minestom.server.instance.block.Block; import net.minestom.server.instance.block.BlockManager; import net.minestom.server.instance.block.CustomBlock; @@ -16,10 +17,11 @@ import org.jetbrains.annotations.Nullable; /** * Called when a player tries placing a block. */ -public class PlayerBlockPlaceEvent extends PlayerEvent implements CancellableEvent { +public class PlayerBlockPlaceEvent extends Event implements PlayerEvent, CancellableEvent { private static final BlockManager BLOCK_MANAGER = MinecraftServer.getBlockManager(); + private final Player player; private short blockStateId; private short customBlockId; private Data blockData; @@ -32,7 +34,7 @@ public class PlayerBlockPlaceEvent extends PlayerEvent implements CancellableEve public PlayerBlockPlaceEvent(@NotNull Player player, @NotNull Block block, @NotNull BlockPosition blockPosition, @NotNull Player.Hand hand) { - super(player); + this.player = player; this.blockStateId = block.getBlockId(); this.blockPosition = blockPosition; this.hand = hand; @@ -176,4 +178,9 @@ public class PlayerBlockPlaceEvent extends PlayerEvent implements CancellableEve public void setCancelled(boolean cancel) { this.cancelled = cancel; } + + @Override + public @NotNull Player getPlayer() { + return player; + } } diff --git a/src/main/java/net/minestom/server/event/player/PlayerChangeHeldSlotEvent.java b/src/main/java/net/minestom/server/event/player/PlayerChangeHeldSlotEvent.java index d3c0a0c48..b452f094c 100644 --- a/src/main/java/net/minestom/server/event/player/PlayerChangeHeldSlotEvent.java +++ b/src/main/java/net/minestom/server/event/player/PlayerChangeHeldSlotEvent.java @@ -2,7 +2,8 @@ package net.minestom.server.event.player; import net.minestom.server.entity.Player; import net.minestom.server.event.CancellableEvent; -import net.minestom.server.event.PlayerEvent; +import net.minestom.server.event.Event; +import net.minestom.server.event.trait.PlayerEvent; import net.minestom.server.utils.MathUtils; import net.minestom.server.utils.validate.Check; import org.jetbrains.annotations.NotNull; @@ -10,14 +11,15 @@ import org.jetbrains.annotations.NotNull; /** * Called when a player change his held slot (by pressing 1-9 keys). */ -public class PlayerChangeHeldSlotEvent extends PlayerEvent implements CancellableEvent { +public class PlayerChangeHeldSlotEvent extends Event implements PlayerEvent, CancellableEvent { + private final Player player; private byte slot; private boolean cancelled; public PlayerChangeHeldSlotEvent(@NotNull Player player, byte slot) { - super(player); + this.player = player; this.slot = slot; } @@ -50,4 +52,9 @@ public class PlayerChangeHeldSlotEvent extends PlayerEvent implements Cancellabl public void setCancelled(boolean cancel) { this.cancelled = cancel; } + + @Override + public @NotNull Player getPlayer() { + return player; + } } diff --git a/src/main/java/net/minestom/server/event/player/PlayerChatEvent.java b/src/main/java/net/minestom/server/event/player/PlayerChatEvent.java index b840e81e2..223c34158 100644 --- a/src/main/java/net/minestom/server/event/player/PlayerChatEvent.java +++ b/src/main/java/net/minestom/server/event/player/PlayerChatEvent.java @@ -4,7 +4,8 @@ import net.kyori.adventure.text.Component; import net.minestom.server.chat.JsonMessage; import net.minestom.server.entity.Player; import net.minestom.server.event.CancellableEvent; -import net.minestom.server.event.PlayerEvent; +import net.minestom.server.event.Event; +import net.minestom.server.event.trait.PlayerEvent; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; @@ -17,8 +18,9 @@ import java.util.function.Supplier; * Called every time a {@link Player} write and send something in the chat. * The event can be cancelled to do not send anything, and the format can be changed. */ -public class PlayerChatEvent extends PlayerEvent implements CancellableEvent { +public class PlayerChatEvent extends Event implements PlayerEvent, CancellableEvent { + private final Player player; private final Collection recipients; private final Supplier defaultChatFormat; private String message; @@ -29,7 +31,7 @@ public class PlayerChatEvent extends PlayerEvent implements CancellableEvent { public PlayerChatEvent(@NotNull Player player, @NotNull Collection recipients, @NotNull Supplier defaultChatFormat, @NotNull String message) { - super(player); + this.player = player; this.recipients = new ArrayList<>(recipients); this.defaultChatFormat = defaultChatFormat; this.message = message; @@ -108,4 +110,9 @@ public class PlayerChatEvent extends PlayerEvent implements CancellableEvent { public void setCancelled(boolean cancel) { this.cancelled = cancel; } + + @Override + public @NotNull Player getPlayer() { + return player; + } } diff --git a/src/main/java/net/minestom/server/event/player/PlayerChunkLoadEvent.java b/src/main/java/net/minestom/server/event/player/PlayerChunkLoadEvent.java index b312ae85d..d4317324c 100644 --- a/src/main/java/net/minestom/server/event/player/PlayerChunkLoadEvent.java +++ b/src/main/java/net/minestom/server/event/player/PlayerChunkLoadEvent.java @@ -1,18 +1,20 @@ package net.minestom.server.event.player; import net.minestom.server.entity.Player; -import net.minestom.server.event.PlayerEvent; +import net.minestom.server.event.Event; +import net.minestom.server.event.trait.PlayerEvent; import org.jetbrains.annotations.NotNull; /** * Called when a player receive a new chunk data. */ -public class PlayerChunkLoadEvent extends PlayerEvent { +public class PlayerChunkLoadEvent extends Event implements PlayerEvent { + private final Player player; private final int chunkX, chunkZ; public PlayerChunkLoadEvent(@NotNull Player player, int chunkX, int chunkZ) { - super(player); + this.player = player; this.chunkX = chunkX; this.chunkZ = chunkZ; } @@ -34,4 +36,9 @@ public class PlayerChunkLoadEvent extends PlayerEvent { public int getChunkZ() { return chunkZ; } + + @Override + public @NotNull Player getPlayer() { + return player; + } } diff --git a/src/main/java/net/minestom/server/event/player/PlayerChunkUnloadEvent.java b/src/main/java/net/minestom/server/event/player/PlayerChunkUnloadEvent.java index e8ab23be5..e2b79f751 100644 --- a/src/main/java/net/minestom/server/event/player/PlayerChunkUnloadEvent.java +++ b/src/main/java/net/minestom/server/event/player/PlayerChunkUnloadEvent.java @@ -1,7 +1,8 @@ package net.minestom.server.event.player; import net.minestom.server.entity.Player; -import net.minestom.server.event.PlayerEvent; +import net.minestom.server.event.Event; +import net.minestom.server.event.trait.PlayerEvent; import org.jetbrains.annotations.NotNull; /** @@ -9,12 +10,13 @@ import org.jetbrains.annotations.NotNull; *

* Could be used to unload the chunk internally in order to save memory. */ -public class PlayerChunkUnloadEvent extends PlayerEvent { +public class PlayerChunkUnloadEvent extends Event implements PlayerEvent { + private final Player player; private final int chunkX, chunkZ; public PlayerChunkUnloadEvent(@NotNull Player player, int chunkX, int chunkZ) { - super(player); + this.player = player; this.chunkX = chunkX; this.chunkZ = chunkZ; } @@ -36,4 +38,9 @@ public class PlayerChunkUnloadEvent extends PlayerEvent { public int getChunkZ() { return chunkZ; } + + @Override + public @NotNull Player getPlayer() { + return player; + } } diff --git a/src/main/java/net/minestom/server/event/player/PlayerCommandEvent.java b/src/main/java/net/minestom/server/event/player/PlayerCommandEvent.java index 6e977c067..a1507bc85 100644 --- a/src/main/java/net/minestom/server/event/player/PlayerCommandEvent.java +++ b/src/main/java/net/minestom/server/event/player/PlayerCommandEvent.java @@ -2,20 +2,22 @@ package net.minestom.server.event.player; import net.minestom.server.entity.Player; import net.minestom.server.event.CancellableEvent; -import net.minestom.server.event.PlayerEvent; +import net.minestom.server.event.Event; +import net.minestom.server.event.trait.PlayerEvent; import org.jetbrains.annotations.NotNull; /** * Called every time a player send a message starting by '/'. */ -public class PlayerCommandEvent extends PlayerEvent implements CancellableEvent { +public class PlayerCommandEvent extends Event implements PlayerEvent, CancellableEvent { + private final Player player; private String command; private boolean cancelled; public PlayerCommandEvent(@NotNull Player player, @NotNull String command) { - super(player); + this.player = player; this.command = command; } @@ -47,4 +49,9 @@ public class PlayerCommandEvent extends PlayerEvent implements CancellableEvent public void setCancelled(boolean cancel) { this.cancelled = cancel; } + + @Override + public @NotNull Player getPlayer() { + return player; + } } diff --git a/src/main/java/net/minestom/server/event/player/PlayerDeathEvent.java b/src/main/java/net/minestom/server/event/player/PlayerDeathEvent.java index 466c26d62..34ab1abf4 100644 --- a/src/main/java/net/minestom/server/event/player/PlayerDeathEvent.java +++ b/src/main/java/net/minestom/server/event/player/PlayerDeathEvent.java @@ -3,15 +3,17 @@ package net.minestom.server.event.player; import net.kyori.adventure.text.Component; import net.minestom.server.chat.JsonMessage; import net.minestom.server.entity.Player; -import net.minestom.server.event.PlayerEvent; +import net.minestom.server.event.Event; +import net.minestom.server.event.trait.PlayerEvent; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; /** * Called when a player die in {@link Player#kill()}. */ -public class PlayerDeathEvent extends PlayerEvent { +public class PlayerDeathEvent extends Event implements PlayerEvent { + private final Player player; private Component deathText; private Component chatMessage; @@ -24,7 +26,7 @@ public class PlayerDeathEvent extends PlayerEvent { } public PlayerDeathEvent(@NotNull Player player, Component deathText, Component chatMessage) { - super(player); + this.player = player; this.deathText = deathText; this.chatMessage = chatMessage; } @@ -112,4 +114,9 @@ public class PlayerDeathEvent extends PlayerEvent { public void setChatMessage(@Nullable Component chatMessage) { this.chatMessage = chatMessage; } + + @Override + public @NotNull Player getPlayer() { + return player; + } } diff --git a/src/main/java/net/minestom/server/event/player/PlayerDisconnectEvent.java b/src/main/java/net/minestom/server/event/player/PlayerDisconnectEvent.java index 93335cbb3..fdfb5123c 100644 --- a/src/main/java/net/minestom/server/event/player/PlayerDisconnectEvent.java +++ b/src/main/java/net/minestom/server/event/player/PlayerDisconnectEvent.java @@ -1,15 +1,23 @@ package net.minestom.server.event.player; import net.minestom.server.entity.Player; -import net.minestom.server.event.PlayerEvent; +import net.minestom.server.event.Event; +import net.minestom.server.event.trait.PlayerEvent; import org.jetbrains.annotations.NotNull; /** * Called when a player disconnect. */ -public class PlayerDisconnectEvent extends PlayerEvent { +public class PlayerDisconnectEvent extends Event implements PlayerEvent { + + private final Player player; public PlayerDisconnectEvent(@NotNull Player player) { - super(player); + this.player = player; + } + + @Override + public @NotNull Player getPlayer() { + return player; } } diff --git a/src/main/java/net/minestom/server/event/player/PlayerEatEvent.java b/src/main/java/net/minestom/server/event/player/PlayerEatEvent.java index 41009774a..28ead0f54 100644 --- a/src/main/java/net/minestom/server/event/player/PlayerEatEvent.java +++ b/src/main/java/net/minestom/server/event/player/PlayerEatEvent.java @@ -1,20 +1,22 @@ package net.minestom.server.event.player; import net.minestom.server.entity.Player; -import net.minestom.server.event.PlayerEvent; +import net.minestom.server.event.Event; +import net.minestom.server.event.trait.PlayerEvent; import net.minestom.server.item.ItemStack; import org.jetbrains.annotations.NotNull; /** * Called when a player is finished eating. */ -public class PlayerEatEvent extends PlayerEvent { +public class PlayerEatEvent extends Event implements PlayerEvent { + private final Player player; private final ItemStack foodItem; private final Player.Hand hand; public PlayerEatEvent(@NotNull Player player, @NotNull ItemStack foodItem, @NotNull Player.Hand hand) { - super(player); + this.player = player; this.foodItem = foodItem; this.hand = hand; } @@ -31,4 +33,9 @@ public class PlayerEatEvent extends PlayerEvent { public @NotNull Player.Hand getHand() { return hand; } + + @Override + public @NotNull Player getPlayer() { + return player; + } } diff --git a/src/main/java/net/minestom/server/event/player/PlayerEntityInteractEvent.java b/src/main/java/net/minestom/server/event/player/PlayerEntityInteractEvent.java index d5c8da5e9..2b41ac1ba 100644 --- a/src/main/java/net/minestom/server/event/player/PlayerEntityInteractEvent.java +++ b/src/main/java/net/minestom/server/event/player/PlayerEntityInteractEvent.java @@ -2,19 +2,21 @@ package net.minestom.server.event.player; import net.minestom.server.entity.Entity; import net.minestom.server.entity.Player; -import net.minestom.server.event.PlayerEvent; +import net.minestom.server.event.Event; +import net.minestom.server.event.trait.PlayerEvent; import org.jetbrains.annotations.NotNull; /** * Called when a {@link Player} interacts (right-click) with an {@link Entity}. */ -public class PlayerEntityInteractEvent extends PlayerEvent { +public class PlayerEntityInteractEvent extends Event implements PlayerEvent { + private final Player player; private final Entity entityTarget; private final Player.Hand hand; public PlayerEntityInteractEvent(@NotNull Player player, @NotNull Entity entityTarget, @NotNull Player.Hand hand) { - super(player); + this.player = player; this.entityTarget = entityTarget; this.hand = hand; } @@ -38,4 +40,9 @@ public class PlayerEntityInteractEvent extends PlayerEvent { public Player.Hand getHand() { return hand; } + + @Override + public @NotNull Player getPlayer() { + return player; + } } \ No newline at end of file diff --git a/src/main/java/net/minestom/server/event/player/PlayerHandAnimationEvent.java b/src/main/java/net/minestom/server/event/player/PlayerHandAnimationEvent.java index 7d9ba9d21..735ba6232 100644 --- a/src/main/java/net/minestom/server/event/player/PlayerHandAnimationEvent.java +++ b/src/main/java/net/minestom/server/event/player/PlayerHandAnimationEvent.java @@ -2,20 +2,22 @@ package net.minestom.server.event.player; import net.minestom.server.entity.Player; import net.minestom.server.event.CancellableEvent; -import net.minestom.server.event.PlayerEvent; +import net.minestom.server.event.Event; +import net.minestom.server.event.trait.PlayerEvent; import org.jetbrains.annotations.NotNull; /** * Called when the player swings his hand. */ -public class PlayerHandAnimationEvent extends PlayerEvent implements CancellableEvent { +public class PlayerHandAnimationEvent extends Event implements PlayerEvent, CancellableEvent { + private final Player player; private final Player.Hand hand; private boolean cancelled; public PlayerHandAnimationEvent(@NotNull Player player, @NotNull Player.Hand hand) { - super(player); + this.player = player; this.hand = hand; } @@ -38,4 +40,9 @@ public class PlayerHandAnimationEvent extends PlayerEvent implements Cancellable public void setCancelled(boolean cancel) { this.cancelled = cancel; } + + @Override + public @NotNull Player getPlayer() { + return player; + } } diff --git a/src/main/java/net/minestom/server/event/player/PlayerItemAnimationEvent.java b/src/main/java/net/minestom/server/event/player/PlayerItemAnimationEvent.java index 335108736..8f8cfb4f0 100644 --- a/src/main/java/net/minestom/server/event/player/PlayerItemAnimationEvent.java +++ b/src/main/java/net/minestom/server/event/player/PlayerItemAnimationEvent.java @@ -2,7 +2,8 @@ package net.minestom.server.event.player; import net.minestom.server.entity.Player; import net.minestom.server.event.CancellableEvent; -import net.minestom.server.event.PlayerEvent; +import net.minestom.server.event.Event; +import net.minestom.server.event.trait.PlayerEvent; import org.jetbrains.annotations.NotNull; /** @@ -10,14 +11,15 @@ import org.jetbrains.annotations.NotNull; * * @see ItemAnimationType */ -public class PlayerItemAnimationEvent extends PlayerEvent implements CancellableEvent { +public class PlayerItemAnimationEvent extends Event implements PlayerEvent, CancellableEvent { + private final Player player; private final ItemAnimationType armAnimationType; private boolean cancelled; public PlayerItemAnimationEvent(@NotNull Player player, @NotNull ItemAnimationType armAnimationType) { - super(player); + this.player = player; this.armAnimationType = armAnimationType; } @@ -31,6 +33,11 @@ public class PlayerItemAnimationEvent extends PlayerEvent implements Cancellable return armAnimationType; } + @Override + public @NotNull Player getPlayer() { + return player; + } + public enum ItemAnimationType { BOW, CROSSBOW, diff --git a/src/main/java/net/minestom/server/event/player/PlayerLoginEvent.java b/src/main/java/net/minestom/server/event/player/PlayerLoginEvent.java index 817e8a94c..e55e1fb64 100644 --- a/src/main/java/net/minestom/server/event/player/PlayerLoginEvent.java +++ b/src/main/java/net/minestom/server/event/player/PlayerLoginEvent.java @@ -1,7 +1,8 @@ package net.minestom.server.event.player; import net.minestom.server.entity.Player; -import net.minestom.server.event.PlayerEvent; +import net.minestom.server.event.Event; +import net.minestom.server.event.trait.PlayerEvent; import net.minestom.server.instance.Instance; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; @@ -16,12 +17,13 @@ import org.jetbrains.annotations.Nullable; *

* WARNING: defining the spawning instance is MANDATORY. */ -public class PlayerLoginEvent extends PlayerEvent { +public class PlayerLoginEvent extends Event implements PlayerEvent { + private final Player player; private Instance spawningInstance; public PlayerLoginEvent(@NotNull Player player) { - super(player); + this.player = player; } /** @@ -44,4 +46,9 @@ public class PlayerLoginEvent extends PlayerEvent { public void setSpawningInstance(@NotNull Instance instance) { this.spawningInstance = instance; } + + @Override + public @NotNull Player getPlayer() { + return player; + } } diff --git a/src/main/java/net/minestom/server/event/player/PlayerMoveEvent.java b/src/main/java/net/minestom/server/event/player/PlayerMoveEvent.java index 2190a7dbe..1bd8e0ee6 100644 --- a/src/main/java/net/minestom/server/event/player/PlayerMoveEvent.java +++ b/src/main/java/net/minestom/server/event/player/PlayerMoveEvent.java @@ -2,21 +2,23 @@ package net.minestom.server.event.player; import net.minestom.server.entity.Player; import net.minestom.server.event.CancellableEvent; -import net.minestom.server.event.PlayerEvent; +import net.minestom.server.event.Event; +import net.minestom.server.event.trait.PlayerEvent; import net.minestom.server.utils.Position; import org.jetbrains.annotations.NotNull; /** * Called when a player is modifying his position. */ -public class PlayerMoveEvent extends PlayerEvent implements CancellableEvent { +public class PlayerMoveEvent extends Event implements PlayerEvent, CancellableEvent { + private final Player player; private Position newPosition; private boolean cancelled; public PlayerMoveEvent(@NotNull Player player, @NotNull Position newPosition) { - super(player); + this.player = player; this.newPosition = newPosition; } @@ -48,4 +50,9 @@ public class PlayerMoveEvent extends PlayerEvent implements CancellableEvent { public void setCancelled(boolean cancel) { this.cancelled = cancel; } + + @Override + public @NotNull Player getPlayer() { + return player; + } } diff --git a/src/main/java/net/minestom/server/event/player/PlayerPluginMessageEvent.java b/src/main/java/net/minestom/server/event/player/PlayerPluginMessageEvent.java index 6f14dd180..c72fff956 100644 --- a/src/main/java/net/minestom/server/event/player/PlayerPluginMessageEvent.java +++ b/src/main/java/net/minestom/server/event/player/PlayerPluginMessageEvent.java @@ -1,19 +1,21 @@ package net.minestom.server.event.player; import net.minestom.server.entity.Player; -import net.minestom.server.event.PlayerEvent; +import net.minestom.server.event.Event; +import net.minestom.server.event.trait.PlayerEvent; import org.jetbrains.annotations.NotNull; /** * Called when a player send {@link net.minestom.server.network.packet.client.play.ClientPluginMessagePacket}. */ -public class PlayerPluginMessageEvent extends PlayerEvent { +public class PlayerPluginMessageEvent extends Event implements PlayerEvent { + private final Player player; private final String identifier; private final byte[] message; public PlayerPluginMessageEvent(@NotNull Player player, @NotNull String identifier, @NotNull byte[] message) { - super(player); + this.player = player; this.identifier = identifier; this.message = message; } @@ -47,4 +49,9 @@ public class PlayerPluginMessageEvent extends PlayerEvent { public String getMessageString() { return new String(message); } + + @Override + public @NotNull Player getPlayer() { + return player; + } } diff --git a/src/main/java/net/minestom/server/event/player/PlayerPreEatEvent.java b/src/main/java/net/minestom/server/event/player/PlayerPreEatEvent.java index f2d909c1e..69fb087d9 100644 --- a/src/main/java/net/minestom/server/event/player/PlayerPreEatEvent.java +++ b/src/main/java/net/minestom/server/event/player/PlayerPreEatEvent.java @@ -2,7 +2,8 @@ package net.minestom.server.event.player; import net.minestom.server.entity.Player; import net.minestom.server.event.CancellableEvent; -import net.minestom.server.event.PlayerEvent; +import net.minestom.server.event.Event; +import net.minestom.server.event.trait.PlayerEvent; import net.minestom.server.item.ItemStack; import org.jetbrains.annotations.NotNull; @@ -11,8 +12,9 @@ import org.jetbrains.annotations.NotNull; * or to cancel its processing, cancelling the event means that the player will * continue the animation indefinitely. */ -public class PlayerPreEatEvent extends PlayerEvent implements CancellableEvent { +public class PlayerPreEatEvent extends Event implements PlayerEvent, CancellableEvent { + private final Player player; private final ItemStack foodItem; private final Player.Hand hand; private long eatingTime; @@ -20,7 +22,7 @@ public class PlayerPreEatEvent extends PlayerEvent implements CancellableEvent { private boolean cancelled; public PlayerPreEatEvent(@NotNull Player player, @NotNull ItemStack foodItem, @NotNull Player.Hand hand, long eatingTime) { - super(player); + this.player = player; this.foodItem = foodItem; this.hand = hand; this.eatingTime = eatingTime; @@ -68,4 +70,9 @@ public class PlayerPreEatEvent extends PlayerEvent implements CancellableEvent { public void setCancelled(boolean cancel) { this.cancelled = cancel; } + + @Override + public @NotNull Player getPlayer() { + return player; + } } diff --git a/src/main/java/net/minestom/server/event/player/PlayerResourcePackStatusEvent.java b/src/main/java/net/minestom/server/event/player/PlayerResourcePackStatusEvent.java index 1d367e846..a2f516598 100644 --- a/src/main/java/net/minestom/server/event/player/PlayerResourcePackStatusEvent.java +++ b/src/main/java/net/minestom/server/event/player/PlayerResourcePackStatusEvent.java @@ -1,19 +1,21 @@ package net.minestom.server.event.player; import net.minestom.server.entity.Player; -import net.minestom.server.event.PlayerEvent; +import net.minestom.server.event.Event; +import net.minestom.server.event.trait.PlayerEvent; import net.minestom.server.resourcepack.ResourcePackStatus; import org.jetbrains.annotations.NotNull; /** * Called when a player warns the server of a resource pack status. */ -public class PlayerResourcePackStatusEvent extends PlayerEvent { +public class PlayerResourcePackStatusEvent extends Event implements PlayerEvent { + private final Player player; private final ResourcePackStatus status; public PlayerResourcePackStatusEvent(@NotNull Player player, @NotNull ResourcePackStatus status) { - super(player); + this.player = player; this.status = status; } @@ -26,4 +28,9 @@ public class PlayerResourcePackStatusEvent extends PlayerEvent { public ResourcePackStatus getStatus() { return status; } + + @Override + public @NotNull Player getPlayer() { + return player; + } } diff --git a/src/main/java/net/minestom/server/event/player/PlayerRespawnEvent.java b/src/main/java/net/minestom/server/event/player/PlayerRespawnEvent.java index 598a9d729..f7d4e9200 100644 --- a/src/main/java/net/minestom/server/event/player/PlayerRespawnEvent.java +++ b/src/main/java/net/minestom/server/event/player/PlayerRespawnEvent.java @@ -1,7 +1,8 @@ package net.minestom.server.event.player; import net.minestom.server.entity.Player; -import net.minestom.server.event.PlayerEvent; +import net.minestom.server.event.Event; +import net.minestom.server.event.trait.PlayerEvent; import net.minestom.server.utils.Position; import org.jetbrains.annotations.NotNull; @@ -9,12 +10,13 @@ import org.jetbrains.annotations.NotNull; * Called when {@link Player#respawn()} is executed (for custom respawn or as a result of * {@link net.minestom.server.network.packet.client.play.ClientStatusPacket} */ -public class PlayerRespawnEvent extends PlayerEvent { +public class PlayerRespawnEvent extends Event implements PlayerEvent { + private final Player player; private Position respawnPosition; public PlayerRespawnEvent(@NotNull Player player) { - super(player); + this.player = player; this.respawnPosition = player.getRespawnPoint(); } @@ -38,4 +40,9 @@ public class PlayerRespawnEvent extends PlayerEvent { public void setRespawnPosition(@NotNull Position respawnPosition) { this.respawnPosition = respawnPosition; } + + @Override + public @NotNull Player getPlayer() { + return player; + } } diff --git a/src/main/java/net/minestom/server/event/player/PlayerSettingsChangeEvent.java b/src/main/java/net/minestom/server/event/player/PlayerSettingsChangeEvent.java index d876c4d4d..fdb4f3d94 100644 --- a/src/main/java/net/minestom/server/event/player/PlayerSettingsChangeEvent.java +++ b/src/main/java/net/minestom/server/event/player/PlayerSettingsChangeEvent.java @@ -1,16 +1,19 @@ package net.minestom.server.event.player; import net.minestom.server.entity.Player; -import net.minestom.server.event.PlayerEvent; +import net.minestom.server.event.Event; +import net.minestom.server.event.trait.PlayerEvent; import org.jetbrains.annotations.NotNull; /** * Called after the player signals the server that his settings has been modified. */ -public class PlayerSettingsChangeEvent extends PlayerEvent { +public class PlayerSettingsChangeEvent extends Event implements PlayerEvent { + + private final Player player; public PlayerSettingsChangeEvent(@NotNull Player player) { - super(player); + this.player = player; } /** diff --git a/src/main/java/net/minestom/server/event/player/PlayerSkinInitEvent.java b/src/main/java/net/minestom/server/event/player/PlayerSkinInitEvent.java index d8cb40644..0a1fb2ec6 100644 --- a/src/main/java/net/minestom/server/event/player/PlayerSkinInitEvent.java +++ b/src/main/java/net/minestom/server/event/player/PlayerSkinInitEvent.java @@ -2,19 +2,21 @@ package net.minestom.server.event.player; import net.minestom.server.entity.Player; import net.minestom.server.entity.PlayerSkin; -import net.minestom.server.event.PlayerEvent; +import net.minestom.server.event.Event; +import net.minestom.server.event.trait.PlayerEvent; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; /** * Called at the player connection to initialize his skin. */ -public class PlayerSkinInitEvent extends PlayerEvent { +public class PlayerSkinInitEvent extends Event implements PlayerEvent { + private final Player player; private PlayerSkin skin; public PlayerSkinInitEvent(@NotNull Player player, @Nullable PlayerSkin currentSkin) { - super(player); + this.player = player; this.skin = currentSkin; } @@ -36,4 +38,9 @@ public class PlayerSkinInitEvent extends PlayerEvent { public void setSkin(@Nullable PlayerSkin skin) { this.skin = skin; } + + @Override + public @NotNull Player getPlayer() { + return player; + } } diff --git a/src/main/java/net/minestom/server/event/player/PlayerSpawnEvent.java b/src/main/java/net/minestom/server/event/player/PlayerSpawnEvent.java index 6c4f393a2..6ed7c53b2 100644 --- a/src/main/java/net/minestom/server/event/player/PlayerSpawnEvent.java +++ b/src/main/java/net/minestom/server/event/player/PlayerSpawnEvent.java @@ -1,20 +1,22 @@ package net.minestom.server.event.player; import net.minestom.server.entity.Player; -import net.minestom.server.event.PlayerEvent; +import net.minestom.server.event.Event; +import net.minestom.server.event.trait.PlayerEvent; import net.minestom.server.instance.Instance; import org.jetbrains.annotations.NotNull; /** * Called when a new instance is set for a player. */ -public class PlayerSpawnEvent extends PlayerEvent { +public class PlayerSpawnEvent extends Event implements PlayerEvent { + private final Player player; private final Instance spawnInstance; private final boolean firstSpawn; public PlayerSpawnEvent(@NotNull Player player, @NotNull Instance spawnInstance, boolean firstSpawn) { - super(player); + this.player = player; this.spawnInstance = spawnInstance; this.firstSpawn = firstSpawn; } @@ -37,4 +39,9 @@ public class PlayerSpawnEvent extends PlayerEvent { public boolean isFirstSpawn() { return firstSpawn; } + + @Override + public @NotNull Player getPlayer() { + return player; + } } diff --git a/src/main/java/net/minestom/server/event/player/PlayerStartDiggingEvent.java b/src/main/java/net/minestom/server/event/player/PlayerStartDiggingEvent.java index a8b00c515..21a245937 100644 --- a/src/main/java/net/minestom/server/event/player/PlayerStartDiggingEvent.java +++ b/src/main/java/net/minestom/server/event/player/PlayerStartDiggingEvent.java @@ -2,7 +2,8 @@ package net.minestom.server.event.player; import net.minestom.server.entity.Player; import net.minestom.server.event.CancellableEvent; -import net.minestom.server.event.PlayerEvent; +import net.minestom.server.event.Event; +import net.minestom.server.event.trait.PlayerEvent; import net.minestom.server.utils.BlockPosition; import org.jetbrains.annotations.NotNull; @@ -14,8 +15,9 @@ import org.jetbrains.annotations.NotNull; * (could be because of high latency or a modified client) so cancelling {@link PlayerBlockBreakEvent} is also necessary. * Could be fixed in future Minestom version. */ -public class PlayerStartDiggingEvent extends PlayerEvent implements CancellableEvent { +public class PlayerStartDiggingEvent extends Event implements PlayerEvent, CancellableEvent { + private final Player player; private final BlockPosition blockPosition; private final int blockStateId; private final int customBlockId; @@ -23,7 +25,7 @@ public class PlayerStartDiggingEvent extends PlayerEvent implements CancellableE private boolean cancelled; public PlayerStartDiggingEvent(@NotNull Player player, @NotNull BlockPosition blockPosition, int blockStateId, int customBlockId) { - super(player); + this.player = player; this.blockPosition = blockPosition; this.blockStateId = blockStateId; this.customBlockId = customBlockId; @@ -66,4 +68,9 @@ public class PlayerStartDiggingEvent extends PlayerEvent implements CancellableE public void setCancelled(boolean cancel) { this.cancelled = cancel; } + + @Override + public @NotNull Player getPlayer() { + return player; + } } diff --git a/src/main/java/net/minestom/server/event/player/PlayerStartFlyingEvent.java b/src/main/java/net/minestom/server/event/player/PlayerStartFlyingEvent.java index aefdf9ee0..be8c94a02 100644 --- a/src/main/java/net/minestom/server/event/player/PlayerStartFlyingEvent.java +++ b/src/main/java/net/minestom/server/event/player/PlayerStartFlyingEvent.java @@ -1,15 +1,23 @@ package net.minestom.server.event.player; import net.minestom.server.entity.Player; -import net.minestom.server.event.PlayerEvent; +import net.minestom.server.event.Event; +import net.minestom.server.event.trait.PlayerEvent; import org.jetbrains.annotations.NotNull; /** * Called when a player start flying. */ -public class PlayerStartFlyingEvent extends PlayerEvent { +public class PlayerStartFlyingEvent extends Event implements PlayerEvent { + + private final Player player; public PlayerStartFlyingEvent(@NotNull Player player) { - super(player); + this.player = player; + } + + @Override + public @NotNull Player getPlayer() { + return player; } } diff --git a/src/main/java/net/minestom/server/event/player/PlayerStartFlyingWithElytraEvent.java b/src/main/java/net/minestom/server/event/player/PlayerStartFlyingWithElytraEvent.java index 28ca41575..8d35e9afb 100644 --- a/src/main/java/net/minestom/server/event/player/PlayerStartFlyingWithElytraEvent.java +++ b/src/main/java/net/minestom/server/event/player/PlayerStartFlyingWithElytraEvent.java @@ -1,12 +1,20 @@ package net.minestom.server.event.player; import net.minestom.server.entity.Player; -import net.minestom.server.event.PlayerEvent; +import net.minestom.server.event.Event; +import net.minestom.server.event.trait.PlayerEvent; import org.jetbrains.annotations.NotNull; -public class PlayerStartFlyingWithElytraEvent extends PlayerEvent { +public class PlayerStartFlyingWithElytraEvent extends Event implements PlayerEvent { + + private final Player player; public PlayerStartFlyingWithElytraEvent(@NotNull Player player) { - super(player); + this.player = player; + } + + @Override + public @NotNull Player getPlayer() { + return player; } } diff --git a/src/main/java/net/minestom/server/event/player/PlayerStartSneakingEvent.java b/src/main/java/net/minestom/server/event/player/PlayerStartSneakingEvent.java index 198ca1093..8e73326be 100644 --- a/src/main/java/net/minestom/server/event/player/PlayerStartSneakingEvent.java +++ b/src/main/java/net/minestom/server/event/player/PlayerStartSneakingEvent.java @@ -1,15 +1,23 @@ package net.minestom.server.event.player; import net.minestom.server.entity.Player; -import net.minestom.server.event.PlayerEvent; +import net.minestom.server.event.Event; +import net.minestom.server.event.trait.PlayerEvent; import org.jetbrains.annotations.NotNull; /** * Called when a player starts sneaking. */ -public class PlayerStartSneakingEvent extends PlayerEvent { +public class PlayerStartSneakingEvent extends Event implements PlayerEvent { + + private final Player player; public PlayerStartSneakingEvent(@NotNull Player player) { - super(player); + this.player = player; + } + + @Override + public @NotNull Player getPlayer() { + return player; } } diff --git a/src/main/java/net/minestom/server/event/player/PlayerStartSprintingEvent.java b/src/main/java/net/minestom/server/event/player/PlayerStartSprintingEvent.java index e517a80e3..273f4c22a 100644 --- a/src/main/java/net/minestom/server/event/player/PlayerStartSprintingEvent.java +++ b/src/main/java/net/minestom/server/event/player/PlayerStartSprintingEvent.java @@ -1,15 +1,23 @@ package net.minestom.server.event.player; import net.minestom.server.entity.Player; -import net.minestom.server.event.PlayerEvent; +import net.minestom.server.event.Event; +import net.minestom.server.event.trait.PlayerEvent; import org.jetbrains.annotations.NotNull; /** * Called when a player starts sprinting. */ -public class PlayerStartSprintingEvent extends PlayerEvent { +public class PlayerStartSprintingEvent extends Event implements PlayerEvent { + + private final Player player; public PlayerStartSprintingEvent(@NotNull Player player) { - super(player); + this.player = player; + } + + @Override + public @NotNull Player getPlayer() { + return player; } } diff --git a/src/main/java/net/minestom/server/event/player/PlayerStopFlyingEvent.java b/src/main/java/net/minestom/server/event/player/PlayerStopFlyingEvent.java index 027de80c9..2b541e042 100644 --- a/src/main/java/net/minestom/server/event/player/PlayerStopFlyingEvent.java +++ b/src/main/java/net/minestom/server/event/player/PlayerStopFlyingEvent.java @@ -1,15 +1,23 @@ package net.minestom.server.event.player; import net.minestom.server.entity.Player; -import net.minestom.server.event.PlayerEvent; +import net.minestom.server.event.Event; +import net.minestom.server.event.trait.PlayerEvent; import org.jetbrains.annotations.NotNull; /** * Called when a player stop flying. */ -public class PlayerStopFlyingEvent extends PlayerEvent { +public class PlayerStopFlyingEvent extends Event implements PlayerEvent { + + private final Player player; public PlayerStopFlyingEvent(@NotNull Player player) { - super(player); + this.player = player; + } + + @Override + public @NotNull Player getPlayer() { + return player; } } diff --git a/src/main/java/net/minestom/server/event/player/PlayerStopFlyingWithElytraEvent.java b/src/main/java/net/minestom/server/event/player/PlayerStopFlyingWithElytraEvent.java index 314f16e22..320d7b2ad 100644 --- a/src/main/java/net/minestom/server/event/player/PlayerStopFlyingWithElytraEvent.java +++ b/src/main/java/net/minestom/server/event/player/PlayerStopFlyingWithElytraEvent.java @@ -1,12 +1,20 @@ package net.minestom.server.event.player; import net.minestom.server.entity.Player; -import net.minestom.server.event.PlayerEvent; +import net.minestom.server.event.Event; +import net.minestom.server.event.trait.PlayerEvent; import org.jetbrains.annotations.NotNull; -public class PlayerStopFlyingWithElytraEvent extends PlayerEvent { +public class PlayerStopFlyingWithElytraEvent extends Event implements PlayerEvent { + + private final Player player; public PlayerStopFlyingWithElytraEvent(@NotNull Player player) { - super(player); + this.player = player; + } + + @Override + public @NotNull Player getPlayer() { + return player; } } diff --git a/src/main/java/net/minestom/server/event/player/PlayerStopSneakingEvent.java b/src/main/java/net/minestom/server/event/player/PlayerStopSneakingEvent.java index 9601bd7e6..d51200aba 100644 --- a/src/main/java/net/minestom/server/event/player/PlayerStopSneakingEvent.java +++ b/src/main/java/net/minestom/server/event/player/PlayerStopSneakingEvent.java @@ -1,15 +1,23 @@ package net.minestom.server.event.player; import net.minestom.server.entity.Player; -import net.minestom.server.event.PlayerEvent; +import net.minestom.server.event.Event; +import net.minestom.server.event.trait.PlayerEvent; import org.jetbrains.annotations.NotNull; /** * Called when a player stops sneaking. */ -public class PlayerStopSneakingEvent extends PlayerEvent { +public class PlayerStopSneakingEvent extends Event implements PlayerEvent { + + private final Player player; public PlayerStopSneakingEvent(@NotNull Player player) { - super(player); + this.player = player; + } + + @Override + public @NotNull Player getPlayer() { + return player; } } diff --git a/src/main/java/net/minestom/server/event/player/PlayerStopSprintingEvent.java b/src/main/java/net/minestom/server/event/player/PlayerStopSprintingEvent.java index cd15590e8..72e1eca23 100644 --- a/src/main/java/net/minestom/server/event/player/PlayerStopSprintingEvent.java +++ b/src/main/java/net/minestom/server/event/player/PlayerStopSprintingEvent.java @@ -1,15 +1,23 @@ package net.minestom.server.event.player; import net.minestom.server.entity.Player; -import net.minestom.server.event.PlayerEvent; +import net.minestom.server.event.Event; +import net.minestom.server.event.trait.PlayerEvent; import org.jetbrains.annotations.NotNull; /** * Called when a player stops sprinting. */ -public class PlayerStopSprintingEvent extends PlayerEvent { +public class PlayerStopSprintingEvent extends Event implements PlayerEvent { + + private final Player player; public PlayerStopSprintingEvent(@NotNull Player player) { - super(player); + this.player = player; + } + + @Override + public @NotNull Player getPlayer() { + return player; } } diff --git a/src/main/java/net/minestom/server/event/player/PlayerSwapItemEvent.java b/src/main/java/net/minestom/server/event/player/PlayerSwapItemEvent.java index 2aff53cb0..824ac5791 100644 --- a/src/main/java/net/minestom/server/event/player/PlayerSwapItemEvent.java +++ b/src/main/java/net/minestom/server/event/player/PlayerSwapItemEvent.java @@ -2,22 +2,24 @@ package net.minestom.server.event.player; import net.minestom.server.entity.Player; import net.minestom.server.event.CancellableEvent; -import net.minestom.server.event.PlayerEvent; +import net.minestom.server.event.Event; +import net.minestom.server.event.trait.PlayerEvent; import net.minestom.server.item.ItemStack; import org.jetbrains.annotations.NotNull; /** * Called when a player is trying to swap his main and off hand item. */ -public class PlayerSwapItemEvent extends PlayerEvent implements CancellableEvent { +public class PlayerSwapItemEvent extends Event implements PlayerEvent, CancellableEvent { + private final Player player; private ItemStack mainHandItem; private ItemStack offHandItem; private boolean cancelled; public PlayerSwapItemEvent(@NotNull Player player, @NotNull ItemStack mainHandItem, @NotNull ItemStack offHandItem) { - super(player); + this.player = player; this.mainHandItem = mainHandItem; this.offHandItem = offHandItem; } @@ -69,4 +71,9 @@ public class PlayerSwapItemEvent extends PlayerEvent implements CancellableEvent public void setCancelled(boolean cancel) { this.cancelled = cancel; } + + @Override + public @NotNull Player getPlayer() { + return player; + } } diff --git a/src/main/java/net/minestom/server/event/player/PlayerTickEvent.java b/src/main/java/net/minestom/server/event/player/PlayerTickEvent.java index 1872fa2da..92e62c94b 100644 --- a/src/main/java/net/minestom/server/event/player/PlayerTickEvent.java +++ b/src/main/java/net/minestom/server/event/player/PlayerTickEvent.java @@ -1,15 +1,23 @@ package net.minestom.server.event.player; import net.minestom.server.entity.Player; -import net.minestom.server.event.PlayerEvent; +import net.minestom.server.event.Event; +import net.minestom.server.event.trait.PlayerEvent; import org.jetbrains.annotations.NotNull; /** * Called at each player tick. */ -public class PlayerTickEvent extends PlayerEvent { +public class PlayerTickEvent extends Event implements PlayerEvent { + + private final Player player; public PlayerTickEvent(@NotNull Player player) { - super(player); + this.player = player; + } + + @Override + public @NotNull Player getPlayer() { + return player; } } diff --git a/src/main/java/net/minestom/server/event/player/PlayerUseItemEvent.java b/src/main/java/net/minestom/server/event/player/PlayerUseItemEvent.java index d32567e45..95404ca84 100644 --- a/src/main/java/net/minestom/server/event/player/PlayerUseItemEvent.java +++ b/src/main/java/net/minestom/server/event/player/PlayerUseItemEvent.java @@ -2,22 +2,24 @@ package net.minestom.server.event.player; import net.minestom.server.entity.Player; import net.minestom.server.event.CancellableEvent; -import net.minestom.server.event.PlayerEvent; +import net.minestom.server.event.Event; +import net.minestom.server.event.trait.PlayerEvent; import net.minestom.server.item.ItemStack; import org.jetbrains.annotations.NotNull; /** * Event when an item is used without clicking on a block. */ -public class PlayerUseItemEvent extends PlayerEvent implements CancellableEvent { +public class PlayerUseItemEvent extends Event implements PlayerEvent, CancellableEvent { + private final Player player; private final Player.Hand hand; private final ItemStack itemStack; private boolean cancelled; public PlayerUseItemEvent(@NotNull Player player, @NotNull Player.Hand hand, @NotNull ItemStack itemStack) { - super(player); + this.player = player; this.hand = hand; this.itemStack = itemStack; } @@ -51,4 +53,9 @@ public class PlayerUseItemEvent extends PlayerEvent implements CancellableEvent public void setCancelled(boolean cancel) { this.cancelled = cancel; } + + @Override + public @NotNull Player getPlayer() { + return player; + } } diff --git a/src/main/java/net/minestom/server/event/player/PlayerUseItemOnBlockEvent.java b/src/main/java/net/minestom/server/event/player/PlayerUseItemOnBlockEvent.java index 88dbcfb32..41345e6cd 100644 --- a/src/main/java/net/minestom/server/event/player/PlayerUseItemOnBlockEvent.java +++ b/src/main/java/net/minestom/server/event/player/PlayerUseItemOnBlockEvent.java @@ -1,7 +1,8 @@ package net.minestom.server.event.player; import net.minestom.server.entity.Player; -import net.minestom.server.event.PlayerEvent; +import net.minestom.server.event.Event; +import net.minestom.server.event.trait.PlayerEvent; import net.minestom.server.item.ItemStack; import net.minestom.server.utils.BlockPosition; import net.minestom.server.utils.Direction; @@ -10,8 +11,9 @@ import org.jetbrains.annotations.NotNull; /** * Used when a player is clicking on a block with an item (but is not a block in item form). */ -public class PlayerUseItemOnBlockEvent extends PlayerEvent { +public class PlayerUseItemOnBlockEvent extends Event implements PlayerEvent { + private final Player player; private final Player.Hand hand; private final ItemStack itemStack; private final BlockPosition position; @@ -20,7 +22,7 @@ public class PlayerUseItemOnBlockEvent extends PlayerEvent { public PlayerUseItemOnBlockEvent(@NotNull Player player, @NotNull Player.Hand hand, @NotNull ItemStack itemStack, @NotNull BlockPosition position, @NotNull Direction blockFace) { - super(player); + this.player = player; this.hand = hand; this.itemStack = itemStack; this.position = position; @@ -66,4 +68,9 @@ public class PlayerUseItemOnBlockEvent extends PlayerEvent { public ItemStack getItemStack() { return itemStack; } + + @Override + public @NotNull Player getPlayer() { + return player; + } } diff --git a/src/main/java/net/minestom/server/event/trait/EntityEvent.java b/src/main/java/net/minestom/server/event/trait/EntityEvent.java new file mode 100644 index 000000000..bf202e9bb --- /dev/null +++ b/src/main/java/net/minestom/server/event/trait/EntityEvent.java @@ -0,0 +1,14 @@ +package net.minestom.server.event.trait; + +import net.minestom.server.entity.Entity; +import org.jetbrains.annotations.NotNull; + +public interface EntityEvent { + + /** + * Gets the entity of this event. + * + * @return the entity + */ + @NotNull Entity getEntity(); +} diff --git a/src/main/java/net/minestom/server/event/trait/ItemEvent.java b/src/main/java/net/minestom/server/event/trait/ItemEvent.java new file mode 100644 index 000000000..c70d28494 --- /dev/null +++ b/src/main/java/net/minestom/server/event/trait/ItemEvent.java @@ -0,0 +1,8 @@ +package net.minestom.server.event.trait; + +import net.minestom.server.item.ItemStack; +import org.jetbrains.annotations.NotNull; + +public interface ItemEvent { + @NotNull ItemStack getItemStack(); +} diff --git a/src/main/java/net/minestom/server/event/trait/PlayerEvent.java b/src/main/java/net/minestom/server/event/trait/PlayerEvent.java new file mode 100644 index 000000000..95641dd25 --- /dev/null +++ b/src/main/java/net/minestom/server/event/trait/PlayerEvent.java @@ -0,0 +1,14 @@ +package net.minestom.server.event.trait; + +import net.minestom.server.entity.Player; +import org.jetbrains.annotations.NotNull; + +public interface PlayerEvent { + + /** + * Gets the player. + * + * @return the player + */ + @NotNull Player getPlayer(); +} diff --git a/src/test/java/demo/PlayerInit.java b/src/test/java/demo/PlayerInit.java index e8eec1940..529d14f86 100644 --- a/src/test/java/demo/PlayerInit.java +++ b/src/test/java/demo/PlayerInit.java @@ -11,7 +11,6 @@ import net.minestom.server.entity.GameMode; import net.minestom.server.entity.ItemEntity; import net.minestom.server.entity.Player; import net.minestom.server.entity.damage.DamageType; -import net.minestom.server.event.Event; import net.minestom.server.event.GlobalEventHandler; import net.minestom.server.event.entity.EntityAttackEvent; import net.minestom.server.event.item.ItemDropEvent; @@ -136,20 +135,6 @@ public class PlayerInit { // EVENT REGISTERING GlobalEventHandler globalEventHandler = MinecraftServer.getGlobalEventHandler(); - - connectionManager.addPlayerInitialization(player -> { - - var listener = Event.player(PlayerChatEvent.class) - .filter(playerChatEvent -> player.isCreative()) - .handler(playerChatEvent -> Audiences.players().sendMessage(Component.text("Listener is working!"))) - .build(); - //listener.attachTo(player); - - var group = Event.group(listener); - group.attachTo(player); - - }); - globalEventHandler.addEventCallback(EntityAttackEvent.class, event -> { final Entity source = event.getEntity(); final Entity entity = event.getTarget(); From 9c87b4d54f1c7ecc0e3a39d4fc4e97c2ad141d1b Mon Sep 17 00:00:00 2001 From: TheMode Date: Wed, 2 Jun 2021 07:15:28 +0200 Subject: [PATCH 006/104] Add EventTrait interface --- .../java/net/minestom/server/event/trait/EntityEvent.java | 2 +- src/main/java/net/minestom/server/event/trait/EventTrait.java | 4 ++++ src/main/java/net/minestom/server/event/trait/ItemEvent.java | 2 +- .../java/net/minestom/server/event/trait/PlayerEvent.java | 2 +- 4 files changed, 7 insertions(+), 3 deletions(-) create mode 100644 src/main/java/net/minestom/server/event/trait/EventTrait.java diff --git a/src/main/java/net/minestom/server/event/trait/EntityEvent.java b/src/main/java/net/minestom/server/event/trait/EntityEvent.java index bf202e9bb..776767d6a 100644 --- a/src/main/java/net/minestom/server/event/trait/EntityEvent.java +++ b/src/main/java/net/minestom/server/event/trait/EntityEvent.java @@ -3,7 +3,7 @@ package net.minestom.server.event.trait; import net.minestom.server.entity.Entity; import org.jetbrains.annotations.NotNull; -public interface EntityEvent { +public interface EntityEvent extends EventTrait { /** * Gets the entity of this event. diff --git a/src/main/java/net/minestom/server/event/trait/EventTrait.java b/src/main/java/net/minestom/server/event/trait/EventTrait.java new file mode 100644 index 000000000..ad07db749 --- /dev/null +++ b/src/main/java/net/minestom/server/event/trait/EventTrait.java @@ -0,0 +1,4 @@ +package net.minestom.server.event.trait; + +public interface EventTrait { +} diff --git a/src/main/java/net/minestom/server/event/trait/ItemEvent.java b/src/main/java/net/minestom/server/event/trait/ItemEvent.java index c70d28494..15701fc8f 100644 --- a/src/main/java/net/minestom/server/event/trait/ItemEvent.java +++ b/src/main/java/net/minestom/server/event/trait/ItemEvent.java @@ -3,6 +3,6 @@ package net.minestom.server.event.trait; import net.minestom.server.item.ItemStack; import org.jetbrains.annotations.NotNull; -public interface ItemEvent { +public interface ItemEvent extends EventTrait { @NotNull ItemStack getItemStack(); } diff --git a/src/main/java/net/minestom/server/event/trait/PlayerEvent.java b/src/main/java/net/minestom/server/event/trait/PlayerEvent.java index 95641dd25..813e5a7fc 100644 --- a/src/main/java/net/minestom/server/event/trait/PlayerEvent.java +++ b/src/main/java/net/minestom/server/event/trait/PlayerEvent.java @@ -3,7 +3,7 @@ package net.minestom.server.event.trait; import net.minestom.server.entity.Player; import org.jetbrains.annotations.NotNull; -public interface PlayerEvent { +public interface PlayerEvent extends EventTrait { /** * Gets the player. From 2d8474282b5fec6b377831188fc5ada9954dbba3 Mon Sep 17 00:00:00 2001 From: TheMode Date: Wed, 2 Jun 2021 08:17:03 +0200 Subject: [PATCH 007/104] Made Event an interface --- .../java/net/minestom/server/event/CancellableEvent.java | 2 +- src/main/java/net/minestom/server/event/Event.java | 4 ++-- .../java/net/minestom/server/event/EventListener.java | 4 ++++ .../java/net/minestom/server/event/InstanceEvent.java | 2 +- .../java/net/minestom/server/event/InventoryEvent.java | 2 +- .../minestom/server/event/entity/EntityAttackEvent.java | 3 +-- .../minestom/server/event/entity/EntityDamageEvent.java | 3 +-- .../minestom/server/event/entity/EntityDeathEvent.java | 3 +-- .../net/minestom/server/event/entity/EntityFireEvent.java | 3 +-- .../server/event/entity/EntityItemMergeEvent.java | 3 +-- .../server/event/entity/EntityPotionAddEvent.java | 3 +-- .../server/event/entity/EntityPotionRemoveEvent.java | 3 +-- .../minestom/server/event/entity/EntityShootEvent.java | 3 +-- .../minestom/server/event/entity/EntitySpawnEvent.java | 3 +-- .../net/minestom/server/event/entity/EntityTickEvent.java | 3 +-- .../minestom/server/event/entity/EntityVelocityEvent.java | 3 +-- .../net/minestom/server/event/item/EntityEquipEvent.java | 2 +- .../net/minestom/server/event/item/ItemDropEvent.java | 2 +- .../minestom/server/event/item/ItemUpdateStateEvent.java | 2 +- .../minestom/server/event/item/PickupExperienceEvent.java | 2 +- .../net/minestom/server/event/item/PickupItemEvent.java | 2 +- .../minestom/server/event/player/AdvancementTabEvent.java | 2 +- .../server/event/player/AsyncPlayerPreLoginEvent.java | 2 +- .../server/event/player/PlayerBlockBreakEvent.java | 2 +- .../server/event/player/PlayerBlockInteractEvent.java | 2 +- .../server/event/player/PlayerBlockPlaceEvent.java | 2 +- .../server/event/player/PlayerChangeHeldSlotEvent.java | 2 +- .../net/minestom/server/event/player/PlayerChatEvent.java | 2 +- .../server/event/player/PlayerChunkLoadEvent.java | 2 +- .../server/event/player/PlayerChunkUnloadEvent.java | 2 +- .../minestom/server/event/player/PlayerCommandEvent.java | 2 +- .../minestom/server/event/player/PlayerDeathEvent.java | 2 +- .../server/event/player/PlayerDisconnectEvent.java | 2 +- .../net/minestom/server/event/player/PlayerEatEvent.java | 2 +- .../server/event/player/PlayerEntityInteractEvent.java | 2 +- .../server/event/player/PlayerHandAnimationEvent.java | 2 +- .../server/event/player/PlayerItemAnimationEvent.java | 2 +- .../minestom/server/event/player/PlayerLoginEvent.java | 2 +- .../net/minestom/server/event/player/PlayerMoveEvent.java | 2 +- .../server/event/player/PlayerPluginMessageEvent.java | 2 +- .../minestom/server/event/player/PlayerPreEatEvent.java | 2 +- .../event/player/PlayerResourcePackStatusEvent.java | 2 +- .../minestom/server/event/player/PlayerRespawnEvent.java | 2 +- .../server/event/player/PlayerSettingsChangeEvent.java | 2 +- .../minestom/server/event/player/PlayerSkinInitEvent.java | 2 +- .../minestom/server/event/player/PlayerSpawnEvent.java | 2 +- .../server/event/player/PlayerStartDiggingEvent.java | 2 +- .../server/event/player/PlayerStartFlyingEvent.java | 2 +- .../event/player/PlayerStartFlyingWithElytraEvent.java | 2 +- .../server/event/player/PlayerStartSneakingEvent.java | 2 +- .../server/event/player/PlayerStartSprintingEvent.java | 2 +- .../server/event/player/PlayerStopFlyingEvent.java | 2 +- .../event/player/PlayerStopFlyingWithElytraEvent.java | 2 +- .../server/event/player/PlayerStopSneakingEvent.java | 2 +- .../server/event/player/PlayerStopSprintingEvent.java | 2 +- .../minestom/server/event/player/PlayerSwapItemEvent.java | 2 +- .../net/minestom/server/event/player/PlayerTickEvent.java | 3 +-- .../minestom/server/event/player/PlayerUseItemEvent.java | 2 +- .../server/event/player/PlayerUseItemOnBlockEvent.java | 2 +- .../minestom/server/event/player/UpdateTagListEvent.java | 2 +- .../minestom/server/event/server/ServerListPingEvent.java | 7 +++---- .../java/net/minestom/server/event/trait/EventTrait.java | 4 +++- .../minestom/server/extras/query/event/QueryEvent.java | 7 +++---- src/test/java/demo/PlayerInit.java | 8 ++++++++ 64 files changed, 81 insertions(+), 81 deletions(-) diff --git a/src/main/java/net/minestom/server/event/CancellableEvent.java b/src/main/java/net/minestom/server/event/CancellableEvent.java index e04d9ea5b..8ae37b32b 100644 --- a/src/main/java/net/minestom/server/event/CancellableEvent.java +++ b/src/main/java/net/minestom/server/event/CancellableEvent.java @@ -3,7 +3,7 @@ package net.minestom.server.event; /** * Represents an {@link Event} which can be cancelled. */ -public interface CancellableEvent { +public interface CancellableEvent extends Event{ /** * Gets if the {@link Event} should be cancelled or not. diff --git a/src/main/java/net/minestom/server/event/Event.java b/src/main/java/net/minestom/server/event/Event.java index 047a6980e..6253a2cd4 100644 --- a/src/main/java/net/minestom/server/event/Event.java +++ b/src/main/java/net/minestom/server/event/Event.java @@ -3,9 +3,9 @@ package net.minestom.server.event; import net.minestom.server.event.handler.EventHandler; /** - * Object which can be listened to by an {@link EventHandler}. + * Event which can be listened to by an {@link EventHandler}. *

* Called using {@link EventHandler#callEvent(Class, Event)}. */ -public class Event { +public interface Event { } diff --git a/src/main/java/net/minestom/server/event/EventListener.java b/src/main/java/net/minestom/server/event/EventListener.java index b19b80d24..2c5379802 100644 --- a/src/main/java/net/minestom/server/event/EventListener.java +++ b/src/main/java/net/minestom/server/event/EventListener.java @@ -21,6 +21,10 @@ public class EventListener implements ListenerAttach { this.combined = combined; } + public static EventListener.Builder of(Class eventType) { + return new EventListener.Builder<>(eventType); + } + @Override public void attachTo(@NotNull EventHandler handler) { final boolean success = this.attach.add(handler); diff --git a/src/main/java/net/minestom/server/event/InstanceEvent.java b/src/main/java/net/minestom/server/event/InstanceEvent.java index fc7ba05da..d6348c345 100644 --- a/src/main/java/net/minestom/server/event/InstanceEvent.java +++ b/src/main/java/net/minestom/server/event/InstanceEvent.java @@ -3,7 +3,7 @@ package net.minestom.server.event; import net.minestom.server.instance.Instance; import org.jetbrains.annotations.NotNull; -public class InstanceEvent extends Event { +public class InstanceEvent implements Event { protected final Instance instance; diff --git a/src/main/java/net/minestom/server/event/InventoryEvent.java b/src/main/java/net/minestom/server/event/InventoryEvent.java index ada529220..58d4db57c 100644 --- a/src/main/java/net/minestom/server/event/InventoryEvent.java +++ b/src/main/java/net/minestom/server/event/InventoryEvent.java @@ -3,7 +3,7 @@ package net.minestom.server.event; import net.minestom.server.inventory.Inventory; import org.jetbrains.annotations.Nullable; -public class InventoryEvent extends Event { +public class InventoryEvent implements Event { protected Inventory inventory; diff --git a/src/main/java/net/minestom/server/event/entity/EntityAttackEvent.java b/src/main/java/net/minestom/server/event/entity/EntityAttackEvent.java index 4c0f89b58..b56323bfe 100644 --- a/src/main/java/net/minestom/server/event/entity/EntityAttackEvent.java +++ b/src/main/java/net/minestom/server/event/entity/EntityAttackEvent.java @@ -1,7 +1,6 @@ package net.minestom.server.event.entity; import net.minestom.server.entity.Entity; -import net.minestom.server.event.Event; import net.minestom.server.event.trait.EntityEvent; import org.jetbrains.annotations.NotNull; @@ -9,7 +8,7 @@ import org.jetbrains.annotations.NotNull; * Called when a player does a left click on an entity or with * {@link net.minestom.server.entity.EntityCreature#attack(Entity)}. */ -public class EntityAttackEvent extends Event implements EntityEvent { +public class EntityAttackEvent implements EntityEvent { private final Entity entity; private final Entity target; diff --git a/src/main/java/net/minestom/server/event/entity/EntityDamageEvent.java b/src/main/java/net/minestom/server/event/entity/EntityDamageEvent.java index a7b9ec8df..9caaeae2a 100644 --- a/src/main/java/net/minestom/server/event/entity/EntityDamageEvent.java +++ b/src/main/java/net/minestom/server/event/entity/EntityDamageEvent.java @@ -4,14 +4,13 @@ import net.minestom.server.entity.Entity; import net.minestom.server.entity.LivingEntity; import net.minestom.server.entity.damage.DamageType; import net.minestom.server.event.CancellableEvent; -import net.minestom.server.event.Event; import net.minestom.server.event.trait.EntityEvent; import org.jetbrains.annotations.NotNull; /** * Called with {@link LivingEntity#damage(DamageType, float)}. */ -public class EntityDamageEvent extends Event implements EntityEvent, CancellableEvent { +public class EntityDamageEvent implements EntityEvent, CancellableEvent { private final Entity entity; private final DamageType damageType; diff --git a/src/main/java/net/minestom/server/event/entity/EntityDeathEvent.java b/src/main/java/net/minestom/server/event/entity/EntityDeathEvent.java index 2e5a26e29..875a84dea 100644 --- a/src/main/java/net/minestom/server/event/entity/EntityDeathEvent.java +++ b/src/main/java/net/minestom/server/event/entity/EntityDeathEvent.java @@ -1,11 +1,10 @@ package net.minestom.server.event.entity; import net.minestom.server.entity.Entity; -import net.minestom.server.event.Event; import net.minestom.server.event.trait.EntityEvent; import org.jetbrains.annotations.NotNull; -public class EntityDeathEvent extends Event implements EntityEvent { +public class EntityDeathEvent implements EntityEvent { // TODO cause private final Entity entity; diff --git a/src/main/java/net/minestom/server/event/entity/EntityFireEvent.java b/src/main/java/net/minestom/server/event/entity/EntityFireEvent.java index 8ade431aa..656b6ea6c 100644 --- a/src/main/java/net/minestom/server/event/entity/EntityFireEvent.java +++ b/src/main/java/net/minestom/server/event/entity/EntityFireEvent.java @@ -2,12 +2,11 @@ package net.minestom.server.event.entity; import net.minestom.server.entity.Entity; import net.minestom.server.event.CancellableEvent; -import net.minestom.server.event.Event; import net.minestom.server.event.trait.EntityEvent; import net.minestom.server.utils.time.TimeUnit; import org.jetbrains.annotations.NotNull; -public class EntityFireEvent extends Event implements EntityEvent, CancellableEvent { +public class EntityFireEvent implements EntityEvent, CancellableEvent { private final Entity entity; private int duration; diff --git a/src/main/java/net/minestom/server/event/entity/EntityItemMergeEvent.java b/src/main/java/net/minestom/server/event/entity/EntityItemMergeEvent.java index 3e151a06b..9520d2e26 100644 --- a/src/main/java/net/minestom/server/event/entity/EntityItemMergeEvent.java +++ b/src/main/java/net/minestom/server/event/entity/EntityItemMergeEvent.java @@ -3,7 +3,6 @@ package net.minestom.server.event.entity; import net.minestom.server.entity.Entity; import net.minestom.server.entity.ItemEntity; import net.minestom.server.event.CancellableEvent; -import net.minestom.server.event.Event; import net.minestom.server.event.trait.EntityEvent; import net.minestom.server.item.ItemStack; import org.jetbrains.annotations.NotNull; @@ -11,7 +10,7 @@ import org.jetbrains.annotations.NotNull; /** * Called when two {@link ItemEntity} are merging their {@link ItemStack} together to form a sole entity. */ -public class EntityItemMergeEvent extends Event implements EntityEvent, CancellableEvent { +public class EntityItemMergeEvent implements EntityEvent, CancellableEvent { private Entity entity; private final ItemEntity merged; diff --git a/src/main/java/net/minestom/server/event/entity/EntityPotionAddEvent.java b/src/main/java/net/minestom/server/event/entity/EntityPotionAddEvent.java index 7f1290027..ee5517b21 100644 --- a/src/main/java/net/minestom/server/event/entity/EntityPotionAddEvent.java +++ b/src/main/java/net/minestom/server/event/entity/EntityPotionAddEvent.java @@ -1,12 +1,11 @@ package net.minestom.server.event.entity; import net.minestom.server.entity.Entity; -import net.minestom.server.event.Event; import net.minestom.server.event.trait.EntityEvent; import net.minestom.server.potion.Potion; import org.jetbrains.annotations.NotNull; -public class EntityPotionAddEvent extends Event implements EntityEvent { +public class EntityPotionAddEvent implements EntityEvent { private final Entity entity; private final Potion potion; diff --git a/src/main/java/net/minestom/server/event/entity/EntityPotionRemoveEvent.java b/src/main/java/net/minestom/server/event/entity/EntityPotionRemoveEvent.java index 0e1ee1552..e320cf4be 100644 --- a/src/main/java/net/minestom/server/event/entity/EntityPotionRemoveEvent.java +++ b/src/main/java/net/minestom/server/event/entity/EntityPotionRemoveEvent.java @@ -1,12 +1,11 @@ package net.minestom.server.event.entity; import net.minestom.server.entity.Entity; -import net.minestom.server.event.Event; import net.minestom.server.event.trait.EntityEvent; import net.minestom.server.potion.Potion; import org.jetbrains.annotations.NotNull; -public class EntityPotionRemoveEvent extends Event implements EntityEvent { +public class EntityPotionRemoveEvent implements EntityEvent { private final Entity entity; private final Potion potion; diff --git a/src/main/java/net/minestom/server/event/entity/EntityShootEvent.java b/src/main/java/net/minestom/server/event/entity/EntityShootEvent.java index db5a229df..4da755082 100644 --- a/src/main/java/net/minestom/server/event/entity/EntityShootEvent.java +++ b/src/main/java/net/minestom/server/event/entity/EntityShootEvent.java @@ -2,7 +2,6 @@ package net.minestom.server.event.entity; import net.minestom.server.entity.Entity; import net.minestom.server.event.CancellableEvent; -import net.minestom.server.event.Event; import net.minestom.server.event.trait.EntityEvent; import net.minestom.server.utils.Position; import org.jetbrains.annotations.NotNull; @@ -10,7 +9,7 @@ import org.jetbrains.annotations.NotNull; /** * Called with {@link net.minestom.server.entity.type.projectile.EntityProjectile#shoot(Position, double, double)} */ -public class EntityShootEvent extends Event implements EntityEvent, CancellableEvent { +public class EntityShootEvent implements EntityEvent, CancellableEvent { private final Entity entity; private final Entity projectile; diff --git a/src/main/java/net/minestom/server/event/entity/EntitySpawnEvent.java b/src/main/java/net/minestom/server/event/entity/EntitySpawnEvent.java index 4c8643135..1fa94e1b3 100644 --- a/src/main/java/net/minestom/server/event/entity/EntitySpawnEvent.java +++ b/src/main/java/net/minestom/server/event/entity/EntitySpawnEvent.java @@ -1,7 +1,6 @@ package net.minestom.server.event.entity; import net.minestom.server.entity.Entity; -import net.minestom.server.event.Event; import net.minestom.server.event.trait.EntityEvent; import net.minestom.server.instance.Instance; import org.jetbrains.annotations.NotNull; @@ -9,7 +8,7 @@ import org.jetbrains.annotations.NotNull; /** * Called when a new instance is set for an entity. */ -public class EntitySpawnEvent extends Event implements EntityEvent { +public class EntitySpawnEvent implements EntityEvent { private final Entity entity; private final Instance spawnInstance; diff --git a/src/main/java/net/minestom/server/event/entity/EntityTickEvent.java b/src/main/java/net/minestom/server/event/entity/EntityTickEvent.java index fc7c0c9cf..7ab2eb97b 100644 --- a/src/main/java/net/minestom/server/event/entity/EntityTickEvent.java +++ b/src/main/java/net/minestom/server/event/entity/EntityTickEvent.java @@ -1,7 +1,6 @@ package net.minestom.server.event.entity; import net.minestom.server.entity.Entity; -import net.minestom.server.event.Event; import net.minestom.server.event.trait.EntityEvent; import org.jetbrains.annotations.NotNull; @@ -9,7 +8,7 @@ import org.jetbrains.annotations.NotNull; * Called when an entity ticks itself. * Same event instance used for all tick events for the same entity. */ -public class EntityTickEvent extends Event implements EntityEvent { +public class EntityTickEvent implements EntityEvent { private final Entity entity; diff --git a/src/main/java/net/minestom/server/event/entity/EntityVelocityEvent.java b/src/main/java/net/minestom/server/event/entity/EntityVelocityEvent.java index 877b5cf85..58835077a 100644 --- a/src/main/java/net/minestom/server/event/entity/EntityVelocityEvent.java +++ b/src/main/java/net/minestom/server/event/entity/EntityVelocityEvent.java @@ -2,7 +2,6 @@ package net.minestom.server.event.entity; import net.minestom.server.entity.Entity; import net.minestom.server.event.CancellableEvent; -import net.minestom.server.event.Event; import net.minestom.server.event.trait.EntityEvent; import net.minestom.server.utils.Vector; import org.jetbrains.annotations.NotNull; @@ -10,7 +9,7 @@ import org.jetbrains.annotations.NotNull; /** * Called when a velocity is applied to an entity using {@link Entity#setVelocity(Vector)}. */ -public class EntityVelocityEvent extends Event implements EntityEvent, CancellableEvent { +public class EntityVelocityEvent implements EntityEvent, CancellableEvent { private final Entity entity; private Vector velocity; diff --git a/src/main/java/net/minestom/server/event/item/EntityEquipEvent.java b/src/main/java/net/minestom/server/event/item/EntityEquipEvent.java index 501273eaf..281dd3019 100644 --- a/src/main/java/net/minestom/server/event/item/EntityEquipEvent.java +++ b/src/main/java/net/minestom/server/event/item/EntityEquipEvent.java @@ -6,7 +6,7 @@ import net.minestom.server.event.Event; import net.minestom.server.item.ItemStack; import org.jetbrains.annotations.NotNull; -public class EntityEquipEvent extends Event { +public class EntityEquipEvent implements Event { private final Entity entity; private ItemStack equippedItem; diff --git a/src/main/java/net/minestom/server/event/item/ItemDropEvent.java b/src/main/java/net/minestom/server/event/item/ItemDropEvent.java index 4ec4591ab..14ef70248 100644 --- a/src/main/java/net/minestom/server/event/item/ItemDropEvent.java +++ b/src/main/java/net/minestom/server/event/item/ItemDropEvent.java @@ -6,7 +6,7 @@ import net.minestom.server.event.Event; import net.minestom.server.item.ItemStack; import org.jetbrains.annotations.NotNull; -public class ItemDropEvent extends Event implements CancellableEvent { +public class ItemDropEvent implements CancellableEvent { private final Player player; private final ItemStack itemStack; diff --git a/src/main/java/net/minestom/server/event/item/ItemUpdateStateEvent.java b/src/main/java/net/minestom/server/event/item/ItemUpdateStateEvent.java index 201602499..b08a67c18 100644 --- a/src/main/java/net/minestom/server/event/item/ItemUpdateStateEvent.java +++ b/src/main/java/net/minestom/server/event/item/ItemUpdateStateEvent.java @@ -5,7 +5,7 @@ import net.minestom.server.event.Event; import net.minestom.server.item.ItemStack; import org.jetbrains.annotations.NotNull; -public class ItemUpdateStateEvent extends Event { +public class ItemUpdateStateEvent implements Event { private final Player player; private final Player.Hand hand; diff --git a/src/main/java/net/minestom/server/event/item/PickupExperienceEvent.java b/src/main/java/net/minestom/server/event/item/PickupExperienceEvent.java index a1fa19188..dea63b993 100644 --- a/src/main/java/net/minestom/server/event/item/PickupExperienceEvent.java +++ b/src/main/java/net/minestom/server/event/item/PickupExperienceEvent.java @@ -5,7 +5,7 @@ import net.minestom.server.event.CancellableEvent; import net.minestom.server.event.Event; import org.jetbrains.annotations.NotNull; -public class PickupExperienceEvent extends Event implements CancellableEvent { +public class PickupExperienceEvent implements CancellableEvent { private final ExperienceOrb experienceOrb; private short experienceCount; diff --git a/src/main/java/net/minestom/server/event/item/PickupItemEvent.java b/src/main/java/net/minestom/server/event/item/PickupItemEvent.java index 04347c412..e2f150748 100644 --- a/src/main/java/net/minestom/server/event/item/PickupItemEvent.java +++ b/src/main/java/net/minestom/server/event/item/PickupItemEvent.java @@ -7,7 +7,7 @@ import net.minestom.server.event.Event; import net.minestom.server.item.ItemStack; import org.jetbrains.annotations.NotNull; -public class PickupItemEvent extends Event implements CancellableEvent { +public class PickupItemEvent implements CancellableEvent { private final LivingEntity livingEntity; private final ItemEntity itemEntity; diff --git a/src/main/java/net/minestom/server/event/player/AdvancementTabEvent.java b/src/main/java/net/minestom/server/event/player/AdvancementTabEvent.java index 33d40c021..8eea66777 100644 --- a/src/main/java/net/minestom/server/event/player/AdvancementTabEvent.java +++ b/src/main/java/net/minestom/server/event/player/AdvancementTabEvent.java @@ -10,7 +10,7 @@ import org.jetbrains.annotations.NotNull; * Called when a {@link Player} opens the advancement screens or switch the tab * and when he closes the screen. */ -public class AdvancementTabEvent extends Event implements PlayerEvent { +public class AdvancementTabEvent implements PlayerEvent { private final Player player; private final AdvancementAction action; diff --git a/src/main/java/net/minestom/server/event/player/AsyncPlayerPreLoginEvent.java b/src/main/java/net/minestom/server/event/player/AsyncPlayerPreLoginEvent.java index 35363bf70..3b67b438d 100644 --- a/src/main/java/net/minestom/server/event/player/AsyncPlayerPreLoginEvent.java +++ b/src/main/java/net/minestom/server/event/player/AsyncPlayerPreLoginEvent.java @@ -11,7 +11,7 @@ import java.util.UUID; * Called before the player initialization, it can be used to kick the player before any connection * or to change his final username/uuid. */ -public class AsyncPlayerPreLoginEvent extends Event implements PlayerEvent { +public class AsyncPlayerPreLoginEvent implements PlayerEvent { private final Player player; private String username; diff --git a/src/main/java/net/minestom/server/event/player/PlayerBlockBreakEvent.java b/src/main/java/net/minestom/server/event/player/PlayerBlockBreakEvent.java index 2d89352fc..60d55afad 100644 --- a/src/main/java/net/minestom/server/event/player/PlayerBlockBreakEvent.java +++ b/src/main/java/net/minestom/server/event/player/PlayerBlockBreakEvent.java @@ -12,7 +12,7 @@ import net.minestom.server.utils.validate.Check; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; -public class PlayerBlockBreakEvent extends Event implements PlayerEvent, CancellableEvent { +public class PlayerBlockBreakEvent implements PlayerEvent, CancellableEvent { private static final BlockManager BLOCK_MANAGER = MinecraftServer.getBlockManager(); diff --git a/src/main/java/net/minestom/server/event/player/PlayerBlockInteractEvent.java b/src/main/java/net/minestom/server/event/player/PlayerBlockInteractEvent.java index a9fc6a365..a05f998fa 100644 --- a/src/main/java/net/minestom/server/event/player/PlayerBlockInteractEvent.java +++ b/src/main/java/net/minestom/server/event/player/PlayerBlockInteractEvent.java @@ -12,7 +12,7 @@ import org.jetbrains.annotations.NotNull; * Called when a player interacts with a block (right-click). * This is also called when a block is placed. */ -public class PlayerBlockInteractEvent extends Event implements PlayerEvent, CancellableEvent { +public class PlayerBlockInteractEvent implements PlayerEvent, CancellableEvent { private final Player player; private final BlockPosition blockPosition; diff --git a/src/main/java/net/minestom/server/event/player/PlayerBlockPlaceEvent.java b/src/main/java/net/minestom/server/event/player/PlayerBlockPlaceEvent.java index 0e462dabb..448333f2c 100644 --- a/src/main/java/net/minestom/server/event/player/PlayerBlockPlaceEvent.java +++ b/src/main/java/net/minestom/server/event/player/PlayerBlockPlaceEvent.java @@ -17,7 +17,7 @@ import org.jetbrains.annotations.Nullable; /** * Called when a player tries placing a block. */ -public class PlayerBlockPlaceEvent extends Event implements PlayerEvent, CancellableEvent { +public class PlayerBlockPlaceEvent implements PlayerEvent, CancellableEvent { private static final BlockManager BLOCK_MANAGER = MinecraftServer.getBlockManager(); diff --git a/src/main/java/net/minestom/server/event/player/PlayerChangeHeldSlotEvent.java b/src/main/java/net/minestom/server/event/player/PlayerChangeHeldSlotEvent.java index b452f094c..facfd773a 100644 --- a/src/main/java/net/minestom/server/event/player/PlayerChangeHeldSlotEvent.java +++ b/src/main/java/net/minestom/server/event/player/PlayerChangeHeldSlotEvent.java @@ -11,7 +11,7 @@ import org.jetbrains.annotations.NotNull; /** * Called when a player change his held slot (by pressing 1-9 keys). */ -public class PlayerChangeHeldSlotEvent extends Event implements PlayerEvent, CancellableEvent { +public class PlayerChangeHeldSlotEvent implements PlayerEvent, CancellableEvent { private final Player player; private byte slot; diff --git a/src/main/java/net/minestom/server/event/player/PlayerChatEvent.java b/src/main/java/net/minestom/server/event/player/PlayerChatEvent.java index 223c34158..8aa80e465 100644 --- a/src/main/java/net/minestom/server/event/player/PlayerChatEvent.java +++ b/src/main/java/net/minestom/server/event/player/PlayerChatEvent.java @@ -18,7 +18,7 @@ import java.util.function.Supplier; * Called every time a {@link Player} write and send something in the chat. * The event can be cancelled to do not send anything, and the format can be changed. */ -public class PlayerChatEvent extends Event implements PlayerEvent, CancellableEvent { +public class PlayerChatEvent implements PlayerEvent, CancellableEvent { private final Player player; private final Collection recipients; diff --git a/src/main/java/net/minestom/server/event/player/PlayerChunkLoadEvent.java b/src/main/java/net/minestom/server/event/player/PlayerChunkLoadEvent.java index d4317324c..ff3c66851 100644 --- a/src/main/java/net/minestom/server/event/player/PlayerChunkLoadEvent.java +++ b/src/main/java/net/minestom/server/event/player/PlayerChunkLoadEvent.java @@ -8,7 +8,7 @@ import org.jetbrains.annotations.NotNull; /** * Called when a player receive a new chunk data. */ -public class PlayerChunkLoadEvent extends Event implements PlayerEvent { +public class PlayerChunkLoadEvent implements PlayerEvent { private final Player player; private final int chunkX, chunkZ; diff --git a/src/main/java/net/minestom/server/event/player/PlayerChunkUnloadEvent.java b/src/main/java/net/minestom/server/event/player/PlayerChunkUnloadEvent.java index e2b79f751..5a11e9d95 100644 --- a/src/main/java/net/minestom/server/event/player/PlayerChunkUnloadEvent.java +++ b/src/main/java/net/minestom/server/event/player/PlayerChunkUnloadEvent.java @@ -10,7 +10,7 @@ import org.jetbrains.annotations.NotNull; *

* Could be used to unload the chunk internally in order to save memory. */ -public class PlayerChunkUnloadEvent extends Event implements PlayerEvent { +public class PlayerChunkUnloadEvent implements PlayerEvent { private final Player player; private final int chunkX, chunkZ; diff --git a/src/main/java/net/minestom/server/event/player/PlayerCommandEvent.java b/src/main/java/net/minestom/server/event/player/PlayerCommandEvent.java index a1507bc85..f63079a73 100644 --- a/src/main/java/net/minestom/server/event/player/PlayerCommandEvent.java +++ b/src/main/java/net/minestom/server/event/player/PlayerCommandEvent.java @@ -9,7 +9,7 @@ import org.jetbrains.annotations.NotNull; /** * Called every time a player send a message starting by '/'. */ -public class PlayerCommandEvent extends Event implements PlayerEvent, CancellableEvent { +public class PlayerCommandEvent implements PlayerEvent, CancellableEvent { private final Player player; private String command; diff --git a/src/main/java/net/minestom/server/event/player/PlayerDeathEvent.java b/src/main/java/net/minestom/server/event/player/PlayerDeathEvent.java index 34ab1abf4..c1d06195f 100644 --- a/src/main/java/net/minestom/server/event/player/PlayerDeathEvent.java +++ b/src/main/java/net/minestom/server/event/player/PlayerDeathEvent.java @@ -11,7 +11,7 @@ import org.jetbrains.annotations.Nullable; /** * Called when a player die in {@link Player#kill()}. */ -public class PlayerDeathEvent extends Event implements PlayerEvent { +public class PlayerDeathEvent implements PlayerEvent { private final Player player; private Component deathText; diff --git a/src/main/java/net/minestom/server/event/player/PlayerDisconnectEvent.java b/src/main/java/net/minestom/server/event/player/PlayerDisconnectEvent.java index fdfb5123c..acfe4898d 100644 --- a/src/main/java/net/minestom/server/event/player/PlayerDisconnectEvent.java +++ b/src/main/java/net/minestom/server/event/player/PlayerDisconnectEvent.java @@ -8,7 +8,7 @@ import org.jetbrains.annotations.NotNull; /** * Called when a player disconnect. */ -public class PlayerDisconnectEvent extends Event implements PlayerEvent { +public class PlayerDisconnectEvent implements PlayerEvent { private final Player player; diff --git a/src/main/java/net/minestom/server/event/player/PlayerEatEvent.java b/src/main/java/net/minestom/server/event/player/PlayerEatEvent.java index 28ead0f54..9983a4159 100644 --- a/src/main/java/net/minestom/server/event/player/PlayerEatEvent.java +++ b/src/main/java/net/minestom/server/event/player/PlayerEatEvent.java @@ -9,7 +9,7 @@ import org.jetbrains.annotations.NotNull; /** * Called when a player is finished eating. */ -public class PlayerEatEvent extends Event implements PlayerEvent { +public class PlayerEatEvent implements PlayerEvent { private final Player player; private final ItemStack foodItem; diff --git a/src/main/java/net/minestom/server/event/player/PlayerEntityInteractEvent.java b/src/main/java/net/minestom/server/event/player/PlayerEntityInteractEvent.java index 2b41ac1ba..a3f4f3c44 100644 --- a/src/main/java/net/minestom/server/event/player/PlayerEntityInteractEvent.java +++ b/src/main/java/net/minestom/server/event/player/PlayerEntityInteractEvent.java @@ -9,7 +9,7 @@ import org.jetbrains.annotations.NotNull; /** * Called when a {@link Player} interacts (right-click) with an {@link Entity}. */ -public class PlayerEntityInteractEvent extends Event implements PlayerEvent { +public class PlayerEntityInteractEvent implements PlayerEvent { private final Player player; private final Entity entityTarget; diff --git a/src/main/java/net/minestom/server/event/player/PlayerHandAnimationEvent.java b/src/main/java/net/minestom/server/event/player/PlayerHandAnimationEvent.java index 735ba6232..af0538a38 100644 --- a/src/main/java/net/minestom/server/event/player/PlayerHandAnimationEvent.java +++ b/src/main/java/net/minestom/server/event/player/PlayerHandAnimationEvent.java @@ -9,7 +9,7 @@ import org.jetbrains.annotations.NotNull; /** * Called when the player swings his hand. */ -public class PlayerHandAnimationEvent extends Event implements PlayerEvent, CancellableEvent { +public class PlayerHandAnimationEvent implements PlayerEvent, CancellableEvent { private final Player player; private final Player.Hand hand; diff --git a/src/main/java/net/minestom/server/event/player/PlayerItemAnimationEvent.java b/src/main/java/net/minestom/server/event/player/PlayerItemAnimationEvent.java index 8f8cfb4f0..c6e223c73 100644 --- a/src/main/java/net/minestom/server/event/player/PlayerItemAnimationEvent.java +++ b/src/main/java/net/minestom/server/event/player/PlayerItemAnimationEvent.java @@ -11,7 +11,7 @@ import org.jetbrains.annotations.NotNull; * * @see ItemAnimationType */ -public class PlayerItemAnimationEvent extends Event implements PlayerEvent, CancellableEvent { +public class PlayerItemAnimationEvent implements PlayerEvent, CancellableEvent { private final Player player; private final ItemAnimationType armAnimationType; diff --git a/src/main/java/net/minestom/server/event/player/PlayerLoginEvent.java b/src/main/java/net/minestom/server/event/player/PlayerLoginEvent.java index e55e1fb64..7de2e246d 100644 --- a/src/main/java/net/minestom/server/event/player/PlayerLoginEvent.java +++ b/src/main/java/net/minestom/server/event/player/PlayerLoginEvent.java @@ -17,7 +17,7 @@ import org.jetbrains.annotations.Nullable; *

* WARNING: defining the spawning instance is MANDATORY. */ -public class PlayerLoginEvent extends Event implements PlayerEvent { +public class PlayerLoginEvent implements PlayerEvent { private final Player player; private Instance spawningInstance; diff --git a/src/main/java/net/minestom/server/event/player/PlayerMoveEvent.java b/src/main/java/net/minestom/server/event/player/PlayerMoveEvent.java index 1bd8e0ee6..36a8d942f 100644 --- a/src/main/java/net/minestom/server/event/player/PlayerMoveEvent.java +++ b/src/main/java/net/minestom/server/event/player/PlayerMoveEvent.java @@ -10,7 +10,7 @@ import org.jetbrains.annotations.NotNull; /** * Called when a player is modifying his position. */ -public class PlayerMoveEvent extends Event implements PlayerEvent, CancellableEvent { +public class PlayerMoveEvent implements PlayerEvent, CancellableEvent { private final Player player; private Position newPosition; diff --git a/src/main/java/net/minestom/server/event/player/PlayerPluginMessageEvent.java b/src/main/java/net/minestom/server/event/player/PlayerPluginMessageEvent.java index c72fff956..297829653 100644 --- a/src/main/java/net/minestom/server/event/player/PlayerPluginMessageEvent.java +++ b/src/main/java/net/minestom/server/event/player/PlayerPluginMessageEvent.java @@ -8,7 +8,7 @@ import org.jetbrains.annotations.NotNull; /** * Called when a player send {@link net.minestom.server.network.packet.client.play.ClientPluginMessagePacket}. */ -public class PlayerPluginMessageEvent extends Event implements PlayerEvent { +public class PlayerPluginMessageEvent implements PlayerEvent { private final Player player; private final String identifier; diff --git a/src/main/java/net/minestom/server/event/player/PlayerPreEatEvent.java b/src/main/java/net/minestom/server/event/player/PlayerPreEatEvent.java index 69fb087d9..9fd8ff8cf 100644 --- a/src/main/java/net/minestom/server/event/player/PlayerPreEatEvent.java +++ b/src/main/java/net/minestom/server/event/player/PlayerPreEatEvent.java @@ -12,7 +12,7 @@ import org.jetbrains.annotations.NotNull; * or to cancel its processing, cancelling the event means that the player will * continue the animation indefinitely. */ -public class PlayerPreEatEvent extends Event implements PlayerEvent, CancellableEvent { +public class PlayerPreEatEvent implements PlayerEvent, CancellableEvent { private final Player player; private final ItemStack foodItem; diff --git a/src/main/java/net/minestom/server/event/player/PlayerResourcePackStatusEvent.java b/src/main/java/net/minestom/server/event/player/PlayerResourcePackStatusEvent.java index a2f516598..f9d00430e 100644 --- a/src/main/java/net/minestom/server/event/player/PlayerResourcePackStatusEvent.java +++ b/src/main/java/net/minestom/server/event/player/PlayerResourcePackStatusEvent.java @@ -9,7 +9,7 @@ import org.jetbrains.annotations.NotNull; /** * Called when a player warns the server of a resource pack status. */ -public class PlayerResourcePackStatusEvent extends Event implements PlayerEvent { +public class PlayerResourcePackStatusEvent implements PlayerEvent { private final Player player; private final ResourcePackStatus status; diff --git a/src/main/java/net/minestom/server/event/player/PlayerRespawnEvent.java b/src/main/java/net/minestom/server/event/player/PlayerRespawnEvent.java index f7d4e9200..a064e0efb 100644 --- a/src/main/java/net/minestom/server/event/player/PlayerRespawnEvent.java +++ b/src/main/java/net/minestom/server/event/player/PlayerRespawnEvent.java @@ -10,7 +10,7 @@ import org.jetbrains.annotations.NotNull; * Called when {@link Player#respawn()} is executed (for custom respawn or as a result of * {@link net.minestom.server.network.packet.client.play.ClientStatusPacket} */ -public class PlayerRespawnEvent extends Event implements PlayerEvent { +public class PlayerRespawnEvent implements PlayerEvent { private final Player player; private Position respawnPosition; diff --git a/src/main/java/net/minestom/server/event/player/PlayerSettingsChangeEvent.java b/src/main/java/net/minestom/server/event/player/PlayerSettingsChangeEvent.java index fdb4f3d94..18cb592ac 100644 --- a/src/main/java/net/minestom/server/event/player/PlayerSettingsChangeEvent.java +++ b/src/main/java/net/minestom/server/event/player/PlayerSettingsChangeEvent.java @@ -8,7 +8,7 @@ import org.jetbrains.annotations.NotNull; /** * Called after the player signals the server that his settings has been modified. */ -public class PlayerSettingsChangeEvent extends Event implements PlayerEvent { +public class PlayerSettingsChangeEvent implements PlayerEvent { private final Player player; diff --git a/src/main/java/net/minestom/server/event/player/PlayerSkinInitEvent.java b/src/main/java/net/minestom/server/event/player/PlayerSkinInitEvent.java index 0a1fb2ec6..0104d3dac 100644 --- a/src/main/java/net/minestom/server/event/player/PlayerSkinInitEvent.java +++ b/src/main/java/net/minestom/server/event/player/PlayerSkinInitEvent.java @@ -10,7 +10,7 @@ import org.jetbrains.annotations.Nullable; /** * Called at the player connection to initialize his skin. */ -public class PlayerSkinInitEvent extends Event implements PlayerEvent { +public class PlayerSkinInitEvent implements PlayerEvent { private final Player player; private PlayerSkin skin; diff --git a/src/main/java/net/minestom/server/event/player/PlayerSpawnEvent.java b/src/main/java/net/minestom/server/event/player/PlayerSpawnEvent.java index 6ed7c53b2..e975dc55a 100644 --- a/src/main/java/net/minestom/server/event/player/PlayerSpawnEvent.java +++ b/src/main/java/net/minestom/server/event/player/PlayerSpawnEvent.java @@ -9,7 +9,7 @@ import org.jetbrains.annotations.NotNull; /** * Called when a new instance is set for a player. */ -public class PlayerSpawnEvent extends Event implements PlayerEvent { +public class PlayerSpawnEvent implements PlayerEvent { private final Player player; private final Instance spawnInstance; diff --git a/src/main/java/net/minestom/server/event/player/PlayerStartDiggingEvent.java b/src/main/java/net/minestom/server/event/player/PlayerStartDiggingEvent.java index 21a245937..4fe149a2c 100644 --- a/src/main/java/net/minestom/server/event/player/PlayerStartDiggingEvent.java +++ b/src/main/java/net/minestom/server/event/player/PlayerStartDiggingEvent.java @@ -15,7 +15,7 @@ import org.jetbrains.annotations.NotNull; * (could be because of high latency or a modified client) so cancelling {@link PlayerBlockBreakEvent} is also necessary. * Could be fixed in future Minestom version. */ -public class PlayerStartDiggingEvent extends Event implements PlayerEvent, CancellableEvent { +public class PlayerStartDiggingEvent implements PlayerEvent, CancellableEvent { private final Player player; private final BlockPosition blockPosition; diff --git a/src/main/java/net/minestom/server/event/player/PlayerStartFlyingEvent.java b/src/main/java/net/minestom/server/event/player/PlayerStartFlyingEvent.java index be8c94a02..5ab26e589 100644 --- a/src/main/java/net/minestom/server/event/player/PlayerStartFlyingEvent.java +++ b/src/main/java/net/minestom/server/event/player/PlayerStartFlyingEvent.java @@ -8,7 +8,7 @@ import org.jetbrains.annotations.NotNull; /** * Called when a player start flying. */ -public class PlayerStartFlyingEvent extends Event implements PlayerEvent { +public class PlayerStartFlyingEvent implements PlayerEvent { private final Player player; diff --git a/src/main/java/net/minestom/server/event/player/PlayerStartFlyingWithElytraEvent.java b/src/main/java/net/minestom/server/event/player/PlayerStartFlyingWithElytraEvent.java index 8d35e9afb..9b29bd1c2 100644 --- a/src/main/java/net/minestom/server/event/player/PlayerStartFlyingWithElytraEvent.java +++ b/src/main/java/net/minestom/server/event/player/PlayerStartFlyingWithElytraEvent.java @@ -5,7 +5,7 @@ import net.minestom.server.event.Event; import net.minestom.server.event.trait.PlayerEvent; import org.jetbrains.annotations.NotNull; -public class PlayerStartFlyingWithElytraEvent extends Event implements PlayerEvent { +public class PlayerStartFlyingWithElytraEvent implements PlayerEvent { private final Player player; diff --git a/src/main/java/net/minestom/server/event/player/PlayerStartSneakingEvent.java b/src/main/java/net/minestom/server/event/player/PlayerStartSneakingEvent.java index 8e73326be..2e2c334ec 100644 --- a/src/main/java/net/minestom/server/event/player/PlayerStartSneakingEvent.java +++ b/src/main/java/net/minestom/server/event/player/PlayerStartSneakingEvent.java @@ -8,7 +8,7 @@ import org.jetbrains.annotations.NotNull; /** * Called when a player starts sneaking. */ -public class PlayerStartSneakingEvent extends Event implements PlayerEvent { +public class PlayerStartSneakingEvent implements PlayerEvent { private final Player player; diff --git a/src/main/java/net/minestom/server/event/player/PlayerStartSprintingEvent.java b/src/main/java/net/minestom/server/event/player/PlayerStartSprintingEvent.java index 273f4c22a..0f5e27ccd 100644 --- a/src/main/java/net/minestom/server/event/player/PlayerStartSprintingEvent.java +++ b/src/main/java/net/minestom/server/event/player/PlayerStartSprintingEvent.java @@ -8,7 +8,7 @@ import org.jetbrains.annotations.NotNull; /** * Called when a player starts sprinting. */ -public class PlayerStartSprintingEvent extends Event implements PlayerEvent { +public class PlayerStartSprintingEvent implements PlayerEvent { private final Player player; diff --git a/src/main/java/net/minestom/server/event/player/PlayerStopFlyingEvent.java b/src/main/java/net/minestom/server/event/player/PlayerStopFlyingEvent.java index 2b541e042..c2b8f449d 100644 --- a/src/main/java/net/minestom/server/event/player/PlayerStopFlyingEvent.java +++ b/src/main/java/net/minestom/server/event/player/PlayerStopFlyingEvent.java @@ -8,7 +8,7 @@ import org.jetbrains.annotations.NotNull; /** * Called when a player stop flying. */ -public class PlayerStopFlyingEvent extends Event implements PlayerEvent { +public class PlayerStopFlyingEvent implements PlayerEvent { private final Player player; diff --git a/src/main/java/net/minestom/server/event/player/PlayerStopFlyingWithElytraEvent.java b/src/main/java/net/minestom/server/event/player/PlayerStopFlyingWithElytraEvent.java index 320d7b2ad..d0715943a 100644 --- a/src/main/java/net/minestom/server/event/player/PlayerStopFlyingWithElytraEvent.java +++ b/src/main/java/net/minestom/server/event/player/PlayerStopFlyingWithElytraEvent.java @@ -5,7 +5,7 @@ import net.minestom.server.event.Event; import net.minestom.server.event.trait.PlayerEvent; import org.jetbrains.annotations.NotNull; -public class PlayerStopFlyingWithElytraEvent extends Event implements PlayerEvent { +public class PlayerStopFlyingWithElytraEvent implements PlayerEvent { private final Player player; diff --git a/src/main/java/net/minestom/server/event/player/PlayerStopSneakingEvent.java b/src/main/java/net/minestom/server/event/player/PlayerStopSneakingEvent.java index d51200aba..47c461ed3 100644 --- a/src/main/java/net/minestom/server/event/player/PlayerStopSneakingEvent.java +++ b/src/main/java/net/minestom/server/event/player/PlayerStopSneakingEvent.java @@ -8,7 +8,7 @@ import org.jetbrains.annotations.NotNull; /** * Called when a player stops sneaking. */ -public class PlayerStopSneakingEvent extends Event implements PlayerEvent { +public class PlayerStopSneakingEvent implements PlayerEvent { private final Player player; diff --git a/src/main/java/net/minestom/server/event/player/PlayerStopSprintingEvent.java b/src/main/java/net/minestom/server/event/player/PlayerStopSprintingEvent.java index 72e1eca23..6e1e05b26 100644 --- a/src/main/java/net/minestom/server/event/player/PlayerStopSprintingEvent.java +++ b/src/main/java/net/minestom/server/event/player/PlayerStopSprintingEvent.java @@ -8,7 +8,7 @@ import org.jetbrains.annotations.NotNull; /** * Called when a player stops sprinting. */ -public class PlayerStopSprintingEvent extends Event implements PlayerEvent { +public class PlayerStopSprintingEvent implements PlayerEvent { private final Player player; diff --git a/src/main/java/net/minestom/server/event/player/PlayerSwapItemEvent.java b/src/main/java/net/minestom/server/event/player/PlayerSwapItemEvent.java index 824ac5791..c1533801b 100644 --- a/src/main/java/net/minestom/server/event/player/PlayerSwapItemEvent.java +++ b/src/main/java/net/minestom/server/event/player/PlayerSwapItemEvent.java @@ -10,7 +10,7 @@ import org.jetbrains.annotations.NotNull; /** * Called when a player is trying to swap his main and off hand item. */ -public class PlayerSwapItemEvent extends Event implements PlayerEvent, CancellableEvent { +public class PlayerSwapItemEvent implements PlayerEvent, CancellableEvent { private final Player player; private ItemStack mainHandItem; diff --git a/src/main/java/net/minestom/server/event/player/PlayerTickEvent.java b/src/main/java/net/minestom/server/event/player/PlayerTickEvent.java index 92e62c94b..57472ba7a 100644 --- a/src/main/java/net/minestom/server/event/player/PlayerTickEvent.java +++ b/src/main/java/net/minestom/server/event/player/PlayerTickEvent.java @@ -1,14 +1,13 @@ package net.minestom.server.event.player; import net.minestom.server.entity.Player; -import net.minestom.server.event.Event; import net.minestom.server.event.trait.PlayerEvent; import org.jetbrains.annotations.NotNull; /** * Called at each player tick. */ -public class PlayerTickEvent extends Event implements PlayerEvent { +public class PlayerTickEvent implements PlayerEvent { private final Player player; diff --git a/src/main/java/net/minestom/server/event/player/PlayerUseItemEvent.java b/src/main/java/net/minestom/server/event/player/PlayerUseItemEvent.java index 95404ca84..54108d29f 100644 --- a/src/main/java/net/minestom/server/event/player/PlayerUseItemEvent.java +++ b/src/main/java/net/minestom/server/event/player/PlayerUseItemEvent.java @@ -10,7 +10,7 @@ import org.jetbrains.annotations.NotNull; /** * Event when an item is used without clicking on a block. */ -public class PlayerUseItemEvent extends Event implements PlayerEvent, CancellableEvent { +public class PlayerUseItemEvent implements PlayerEvent, CancellableEvent { private final Player player; private final Player.Hand hand; diff --git a/src/main/java/net/minestom/server/event/player/PlayerUseItemOnBlockEvent.java b/src/main/java/net/minestom/server/event/player/PlayerUseItemOnBlockEvent.java index 41345e6cd..b329a5b76 100644 --- a/src/main/java/net/minestom/server/event/player/PlayerUseItemOnBlockEvent.java +++ b/src/main/java/net/minestom/server/event/player/PlayerUseItemOnBlockEvent.java @@ -11,7 +11,7 @@ import org.jetbrains.annotations.NotNull; /** * Used when a player is clicking on a block with an item (but is not a block in item form). */ -public class PlayerUseItemOnBlockEvent extends Event implements PlayerEvent { +public class PlayerUseItemOnBlockEvent implements PlayerEvent { private final Player player; private final Player.Hand hand; diff --git a/src/main/java/net/minestom/server/event/player/UpdateTagListEvent.java b/src/main/java/net/minestom/server/event/player/UpdateTagListEvent.java index a68777609..38ddedf7e 100644 --- a/src/main/java/net/minestom/server/event/player/UpdateTagListEvent.java +++ b/src/main/java/net/minestom/server/event/player/UpdateTagListEvent.java @@ -4,7 +4,7 @@ import net.minestom.server.event.Event; import net.minestom.server.network.packet.server.play.TagsPacket; import org.jetbrains.annotations.NotNull; -public class UpdateTagListEvent extends Event { +public class UpdateTagListEvent implements Event { private TagsPacket packet; diff --git a/src/main/java/net/minestom/server/event/server/ServerListPingEvent.java b/src/main/java/net/minestom/server/event/server/ServerListPingEvent.java index bc5f81f54..ab9551152 100644 --- a/src/main/java/net/minestom/server/event/server/ServerListPingEvent.java +++ b/src/main/java/net/minestom/server/event/server/ServerListPingEvent.java @@ -2,7 +2,6 @@ package net.minestom.server.event.server; import net.minestom.server.MinecraftServer; import net.minestom.server.event.CancellableEvent; -import net.minestom.server.event.Event; import net.minestom.server.network.player.PlayerConnection; import net.minestom.server.ping.ResponseData; import net.minestom.server.ping.ResponseDataConsumer; @@ -16,7 +15,7 @@ import java.util.Objects; * Called when a {@link PlayerConnection} sends a status packet, * usually to display information on the server list. */ -public class ServerListPingEvent extends Event implements CancellableEvent { +public class ServerListPingEvent implements CancellableEvent { private final PlayerConnection connection; private final ServerListPingType type; @@ -36,7 +35,7 @@ public class ServerListPingEvent extends Event implements CancellableEvent { * Creates a new server list ping event. * * @param connection the player connection, if the ping type is modern - * @param type the ping type to respond with + * @param type the ping type to respond with */ public ServerListPingEvent(@Nullable PlayerConnection connection, @NotNull ServerListPingType type) { //noinspection deprecation we need to continue doing this until the consumer is removed - todo remove @@ -86,7 +85,7 @@ public class ServerListPingEvent extends Event implements CancellableEvent { * @return the ping type */ public @NotNull ServerListPingType getPingType() { - return type; + return type; } @Override diff --git a/src/main/java/net/minestom/server/event/trait/EventTrait.java b/src/main/java/net/minestom/server/event/trait/EventTrait.java index ad07db749..1b5732094 100644 --- a/src/main/java/net/minestom/server/event/trait/EventTrait.java +++ b/src/main/java/net/minestom/server/event/trait/EventTrait.java @@ -1,4 +1,6 @@ package net.minestom.server.event.trait; -public interface EventTrait { +import net.minestom.server.event.Event; + +public interface EventTrait extends Event { } diff --git a/src/main/java/net/minestom/server/extras/query/event/QueryEvent.java b/src/main/java/net/minestom/server/extras/query/event/QueryEvent.java index d8365c1ba..88569c687 100644 --- a/src/main/java/net/minestom/server/extras/query/event/QueryEvent.java +++ b/src/main/java/net/minestom/server/extras/query/event/QueryEvent.java @@ -1,7 +1,6 @@ package net.minestom.server.extras.query.event; import net.minestom.server.event.CancellableEvent; -import net.minestom.server.event.Event; import net.minestom.server.utils.binary.Writeable; import org.jetbrains.annotations.NotNull; @@ -13,7 +12,7 @@ import java.util.Objects; * * @param the type of the response */ -public abstract class QueryEvent extends Event implements CancellableEvent { +public abstract class QueryEvent implements CancellableEvent { private final SocketAddress sender; private final int sessionID; @@ -23,9 +22,9 @@ public abstract class QueryEvent extends Event implements C /** * Creates a new query event. * - * @param sender the sender + * @param sender the sender * @param sessionID the session ID of the query sender - * @param response the initial response + * @param response the initial response */ public QueryEvent(@NotNull SocketAddress sender, int sessionID, @NotNull T response) { this.sender = sender; diff --git a/src/test/java/demo/PlayerInit.java b/src/test/java/demo/PlayerInit.java index 529d14f86..eb511aafc 100644 --- a/src/test/java/demo/PlayerInit.java +++ b/src/test/java/demo/PlayerInit.java @@ -11,11 +11,14 @@ import net.minestom.server.entity.GameMode; import net.minestom.server.entity.ItemEntity; import net.minestom.server.entity.Player; import net.minestom.server.entity.damage.DamageType; +import net.minestom.server.event.EventListener; +import net.minestom.server.event.EventNode; import net.minestom.server.event.GlobalEventHandler; import net.minestom.server.event.entity.EntityAttackEvent; import net.minestom.server.event.item.ItemDropEvent; import net.minestom.server.event.item.PickupItemEvent; import net.minestom.server.event.player.*; +import net.minestom.server.event.trait.PlayerEvent; import net.minestom.server.instance.Chunk; import net.minestom.server.instance.Instance; import net.minestom.server.instance.InstanceContainer; @@ -134,6 +137,11 @@ public class PlayerInit { // EVENT REGISTERING + var node = EventNode.create(PlayerEvent.class); + node.addListener(EventListener.of(PlayerTickEvent.class) + .handler(playerTickEvent -> System.out.println("Player tick!")) + .build()); + GlobalEventHandler globalEventHandler = MinecraftServer.getGlobalEventHandler(); globalEventHandler.addEventCallback(EntityAttackEvent.class, event -> { final Entity source = event.getEntity(); From 77f74bb7dc3355d22be6bf0b6ecf3a9a6a975284 Mon Sep 17 00:00:00 2001 From: TheMode Date: Wed, 2 Jun 2021 08:17:21 +0200 Subject: [PATCH 008/104] Introduce EventNode --- .../net/minestom/server/event/EventNode.java | 37 +++++++++++++++++++ 1 file changed, 37 insertions(+) create mode 100644 src/main/java/net/minestom/server/event/EventNode.java diff --git a/src/main/java/net/minestom/server/event/EventNode.java b/src/main/java/net/minestom/server/event/EventNode.java new file mode 100644 index 000000000..ce824ac00 --- /dev/null +++ b/src/main/java/net/minestom/server/event/EventNode.java @@ -0,0 +1,37 @@ +package net.minestom.server.event; + +import net.minestom.server.event.handler.EventHandler; +import net.minestom.server.event.trait.EventTrait; + +import java.util.function.Consumer; +import java.util.function.Predicate; + +public class EventNode { + + private EventNode() { + } + + public static EventNode create() { + return null; + } + + public static EventNode create(Class eventType) { + return new EventNode<>(); + } + + public static EventNode conditional(Class eventType, + Class handlerType, + Predicate predicate) { + return new EventNode<>(); + } + + public static EventNode unique(Class eventType, EventHandler handler) { + return new EventNode<>(); + } + + public void addListener(EventListener listener) { + } + + public void addListener(Class eventClass, Consumer listener) { + } +} From f88a2f38833f5215a07f3fff1a38e0275f145fea Mon Sep 17 00:00:00 2001 From: TheMode Date: Wed, 2 Jun 2021 08:24:02 +0200 Subject: [PATCH 009/104] Dont allow every event --- src/main/java/net/minestom/server/event/EventNode.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/net/minestom/server/event/EventNode.java b/src/main/java/net/minestom/server/event/EventNode.java index ce824ac00..f0e1fa8a4 100644 --- a/src/main/java/net/minestom/server/event/EventNode.java +++ b/src/main/java/net/minestom/server/event/EventNode.java @@ -32,6 +32,6 @@ public class EventNode { public void addListener(EventListener listener) { } - public void addListener(Class eventClass, Consumer listener) { + public void addListener(Class eventClass, Consumer listener) { } } From 52547c5bd67294ff6b7e8bdf3a4b231b27137617 Mon Sep 17 00:00:00 2001 From: TheMode Date: Wed, 2 Jun 2021 08:59:46 +0200 Subject: [PATCH 010/104] Rename create method --- src/main/java/net/minestom/server/event/EventNode.java | 8 ++++---- src/test/java/demo/PlayerInit.java | 2 +- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/src/main/java/net/minestom/server/event/EventNode.java b/src/main/java/net/minestom/server/event/EventNode.java index f0e1fa8a4..817c978fd 100644 --- a/src/main/java/net/minestom/server/event/EventNode.java +++ b/src/main/java/net/minestom/server/event/EventNode.java @@ -15,16 +15,16 @@ public class EventNode { return null; } - public static EventNode create(Class eventType) { - return new EventNode<>(); - } - public static EventNode conditional(Class eventType, Class handlerType, Predicate predicate) { return new EventNode<>(); } + public static EventNode conditional(Class eventType) { + return new EventNode<>(); + } + public static EventNode unique(Class eventType, EventHandler handler) { return new EventNode<>(); } diff --git a/src/test/java/demo/PlayerInit.java b/src/test/java/demo/PlayerInit.java index eb511aafc..c96020a83 100644 --- a/src/test/java/demo/PlayerInit.java +++ b/src/test/java/demo/PlayerInit.java @@ -137,7 +137,7 @@ public class PlayerInit { // EVENT REGISTERING - var node = EventNode.create(PlayerEvent.class); + var node = EventNode.conditional(PlayerEvent.class); node.addListener(EventListener.of(PlayerTickEvent.class) .handler(playerTickEvent -> System.out.println("Player tick!")) .build()); From 0b6c7b0b0e8a18d3bd96f4cd6e10fc6ac3385fd2 Mon Sep 17 00:00:00 2001 From: TheMode Date: Wed, 2 Jun 2021 09:06:04 +0200 Subject: [PATCH 011/104] Delete EventTrait --- .../net/minestom/server/event/EventNode.java | 21 +++++++++---------- .../server/event/trait/EntityEvent.java | 3 ++- .../server/event/trait/EventTrait.java | 6 ------ .../server/event/trait/ItemEvent.java | 3 ++- .../server/event/trait/PlayerEvent.java | 3 ++- src/test/java/demo/PlayerInit.java | 4 ++++ 6 files changed, 20 insertions(+), 20 deletions(-) delete mode 100644 src/main/java/net/minestom/server/event/trait/EventTrait.java diff --git a/src/main/java/net/minestom/server/event/EventNode.java b/src/main/java/net/minestom/server/event/EventNode.java index 817c978fd..2b9668aae 100644 --- a/src/main/java/net/minestom/server/event/EventNode.java +++ b/src/main/java/net/minestom/server/event/EventNode.java @@ -1,31 +1,30 @@ package net.minestom.server.event; import net.minestom.server.event.handler.EventHandler; -import net.minestom.server.event.trait.EventTrait; import java.util.function.Consumer; import java.util.function.Predicate; -public class EventNode { +public class EventNode { private EventNode() { } - public static EventNode create() { - return null; - } - - public static EventNode conditional(Class eventType, - Class handlerType, - Predicate predicate) { + public static EventNode create() { return new EventNode<>(); } - public static EventNode conditional(Class eventType) { + public static EventNode conditional(Class eventType, + Class handlerType, + Predicate predicate) { return new EventNode<>(); } - public static EventNode unique(Class eventType, EventHandler handler) { + public static EventNode conditional(Class eventType) { + return new EventNode<>(); + } + + public static EventNode unique(Class eventType, EventHandler handler) { return new EventNode<>(); } diff --git a/src/main/java/net/minestom/server/event/trait/EntityEvent.java b/src/main/java/net/minestom/server/event/trait/EntityEvent.java index 776767d6a..44469d44f 100644 --- a/src/main/java/net/minestom/server/event/trait/EntityEvent.java +++ b/src/main/java/net/minestom/server/event/trait/EntityEvent.java @@ -1,9 +1,10 @@ package net.minestom.server.event.trait; import net.minestom.server.entity.Entity; +import net.minestom.server.event.Event; import org.jetbrains.annotations.NotNull; -public interface EntityEvent extends EventTrait { +public interface EntityEvent extends Event { /** * Gets the entity of this event. diff --git a/src/main/java/net/minestom/server/event/trait/EventTrait.java b/src/main/java/net/minestom/server/event/trait/EventTrait.java deleted file mode 100644 index 1b5732094..000000000 --- a/src/main/java/net/minestom/server/event/trait/EventTrait.java +++ /dev/null @@ -1,6 +0,0 @@ -package net.minestom.server.event.trait; - -import net.minestom.server.event.Event; - -public interface EventTrait extends Event { -} diff --git a/src/main/java/net/minestom/server/event/trait/ItemEvent.java b/src/main/java/net/minestom/server/event/trait/ItemEvent.java index 15701fc8f..5ccecded4 100644 --- a/src/main/java/net/minestom/server/event/trait/ItemEvent.java +++ b/src/main/java/net/minestom/server/event/trait/ItemEvent.java @@ -1,8 +1,9 @@ package net.minestom.server.event.trait; +import net.minestom.server.event.Event; import net.minestom.server.item.ItemStack; import org.jetbrains.annotations.NotNull; -public interface ItemEvent extends EventTrait { +public interface ItemEvent extends Event { @NotNull ItemStack getItemStack(); } diff --git a/src/main/java/net/minestom/server/event/trait/PlayerEvent.java b/src/main/java/net/minestom/server/event/trait/PlayerEvent.java index 813e5a7fc..efb03c6bc 100644 --- a/src/main/java/net/minestom/server/event/trait/PlayerEvent.java +++ b/src/main/java/net/minestom/server/event/trait/PlayerEvent.java @@ -1,9 +1,10 @@ package net.minestom.server.event.trait; import net.minestom.server.entity.Player; +import net.minestom.server.event.Event; import org.jetbrains.annotations.NotNull; -public interface PlayerEvent extends EventTrait { +public interface PlayerEvent extends Event { /** * Gets the player. diff --git a/src/test/java/demo/PlayerInit.java b/src/test/java/demo/PlayerInit.java index c96020a83..2d075c60a 100644 --- a/src/test/java/demo/PlayerInit.java +++ b/src/test/java/demo/PlayerInit.java @@ -142,6 +142,10 @@ public class PlayerInit { .handler(playerTickEvent -> System.out.println("Player tick!")) .build()); + var empty = EventNode.create(); + empty.addListener(PlayerMoveEvent.class, (event) -> { + }); + GlobalEventHandler globalEventHandler = MinecraftServer.getGlobalEventHandler(); globalEventHandler.addEventCallback(EntityAttackEvent.class, event -> { final Entity source = event.getEntity(); From 096e1de9b534301d6fe7e430472b154d9aab2174 Mon Sep 17 00:00:00 2001 From: TheMode Date: Wed, 2 Jun 2021 09:21:13 +0200 Subject: [PATCH 012/104] Delete EventGroup.java, make InstanceEvent an interface --- .../net/minestom/server/event/EventGroup.java | 27 ------------------- .../minestom/server/event/InstanceEvent.java | 23 ---------------- .../instance/AddEntityToInstanceEvent.java | 13 ++++++--- .../instance/InstanceChunkLoadEvent.java | 12 ++++++--- .../instance/InstanceChunkUnloadEvent.java | 13 ++++++--- .../event/instance/InstanceTickEvent.java | 12 ++++++--- .../RemoveEntityFromInstanceEvent.java | 13 ++++++--- .../server/event/trait/InstanceEvent.java | 15 +++++++++++ 8 files changed, 62 insertions(+), 66 deletions(-) delete mode 100644 src/main/java/net/minestom/server/event/EventGroup.java delete mode 100644 src/main/java/net/minestom/server/event/InstanceEvent.java create mode 100644 src/main/java/net/minestom/server/event/trait/InstanceEvent.java diff --git a/src/main/java/net/minestom/server/event/EventGroup.java b/src/main/java/net/minestom/server/event/EventGroup.java deleted file mode 100644 index 258b9cfa6..000000000 --- a/src/main/java/net/minestom/server/event/EventGroup.java +++ /dev/null @@ -1,27 +0,0 @@ -package net.minestom.server.event; - -import net.minestom.server.event.handler.EventHandler; -import org.jetbrains.annotations.NotNull; - -public class EventGroup implements ListenerAttach { - - private final EventListener[] listeners; - - protected EventGroup(@NotNull EventListener... listeners) { - this.listeners = listeners; - } - - @Override - public void attachTo(@NotNull EventHandler handler) { - for (EventListener listener : listeners) { - listener.attachTo(handler); - } - } - - @Override - public void detachFrom(@NotNull EventHandler handler) { - for (EventListener listener : listeners) { - listener.detachFrom(handler); - } - } -} diff --git a/src/main/java/net/minestom/server/event/InstanceEvent.java b/src/main/java/net/minestom/server/event/InstanceEvent.java deleted file mode 100644 index d6348c345..000000000 --- a/src/main/java/net/minestom/server/event/InstanceEvent.java +++ /dev/null @@ -1,23 +0,0 @@ -package net.minestom.server.event; - -import net.minestom.server.instance.Instance; -import org.jetbrains.annotations.NotNull; - -public class InstanceEvent implements Event { - - protected final Instance instance; - - public InstanceEvent(@NotNull Instance instance) { - this.instance = instance; - } - - /** - * Gets the instance. - * - * @return instance - */ - @NotNull - public Instance getInstance() { - return instance; - } -} \ No newline at end of file diff --git a/src/main/java/net/minestom/server/event/instance/AddEntityToInstanceEvent.java b/src/main/java/net/minestom/server/event/instance/AddEntityToInstanceEvent.java index 861d6f891..71c003806 100644 --- a/src/main/java/net/minestom/server/event/instance/AddEntityToInstanceEvent.java +++ b/src/main/java/net/minestom/server/event/instance/AddEntityToInstanceEvent.java @@ -2,7 +2,8 @@ package net.minestom.server.event.instance; import net.minestom.server.entity.Entity; import net.minestom.server.event.CancellableEvent; -import net.minestom.server.event.InstanceEvent; +import net.minestom.server.event.trait.EntityEvent; +import net.minestom.server.event.trait.InstanceEvent; import net.minestom.server.instance.Instance; import org.jetbrains.annotations.NotNull; @@ -10,17 +11,23 @@ import org.jetbrains.annotations.NotNull; * Called by an Instance when an entity is added to it. * Can be used attach data. */ -public class AddEntityToInstanceEvent extends InstanceEvent implements CancellableEvent { +public class AddEntityToInstanceEvent implements InstanceEvent, EntityEvent, CancellableEvent { + private final Instance instance; private final Entity entity; private boolean cancelled; public AddEntityToInstanceEvent(@NotNull Instance instance, @NotNull Entity entity) { - super(instance); + this.instance = instance; this.entity = entity; } + @Override + public @NotNull Instance getInstance() { + return instance; + } + /** * Entity being added. * diff --git a/src/main/java/net/minestom/server/event/instance/InstanceChunkLoadEvent.java b/src/main/java/net/minestom/server/event/instance/InstanceChunkLoadEvent.java index c102d75b1..4b03ca434 100644 --- a/src/main/java/net/minestom/server/event/instance/InstanceChunkLoadEvent.java +++ b/src/main/java/net/minestom/server/event/instance/InstanceChunkLoadEvent.java @@ -1,22 +1,28 @@ package net.minestom.server.event.instance; -import net.minestom.server.event.InstanceEvent; +import net.minestom.server.event.trait.InstanceEvent; import net.minestom.server.instance.Instance; import org.jetbrains.annotations.NotNull; /** * Called when a chunk in an instance is loaded. */ -public class InstanceChunkLoadEvent extends InstanceEvent { +public class InstanceChunkLoadEvent implements InstanceEvent { + private final Instance instance; private final int chunkX, chunkZ; public InstanceChunkLoadEvent(@NotNull Instance instance, int chunkX, int chunkZ) { - super(instance); + this.instance = instance; this.chunkX = chunkX; this.chunkZ = chunkZ; } + @Override + public @NotNull Instance getInstance() { + return instance; + } + /** * Gets the chunk X. * diff --git a/src/main/java/net/minestom/server/event/instance/InstanceChunkUnloadEvent.java b/src/main/java/net/minestom/server/event/instance/InstanceChunkUnloadEvent.java index 306aaf107..aa3ae7fa2 100644 --- a/src/main/java/net/minestom/server/event/instance/InstanceChunkUnloadEvent.java +++ b/src/main/java/net/minestom/server/event/instance/InstanceChunkUnloadEvent.java @@ -1,22 +1,28 @@ package net.minestom.server.event.instance; -import net.minestom.server.event.InstanceEvent; +import net.minestom.server.event.trait.InstanceEvent; import net.minestom.server.instance.Instance; import org.jetbrains.annotations.NotNull; /** * Called when a chunk in an instance is unloaded. */ -public class InstanceChunkUnloadEvent extends InstanceEvent { +public class InstanceChunkUnloadEvent implements InstanceEvent { + private final Instance instance; private final int chunkX, chunkZ; public InstanceChunkUnloadEvent(@NotNull Instance instance, int chunkX, int chunkZ) { - super(instance); + this.instance = instance; this.chunkX = chunkX; this.chunkZ = chunkZ; } + @Override + public @NotNull Instance getInstance() { + return instance; + } + /** * Gets the chunk X. * @@ -34,5 +40,4 @@ public class InstanceChunkUnloadEvent extends InstanceEvent { public int getChunkZ() { return chunkZ; } - } diff --git a/src/main/java/net/minestom/server/event/instance/InstanceTickEvent.java b/src/main/java/net/minestom/server/event/instance/InstanceTickEvent.java index eef4c67a6..b689cd228 100644 --- a/src/main/java/net/minestom/server/event/instance/InstanceTickEvent.java +++ b/src/main/java/net/minestom/server/event/instance/InstanceTickEvent.java @@ -1,21 +1,27 @@ package net.minestom.server.event.instance; -import net.minestom.server.event.InstanceEvent; +import net.minestom.server.event.trait.InstanceEvent; import net.minestom.server.instance.Instance; import org.jetbrains.annotations.NotNull; /** * Called when an instance processes a tick. */ -public class InstanceTickEvent extends InstanceEvent { +public class InstanceTickEvent implements InstanceEvent { + private final Instance instance; private final int duration; public InstanceTickEvent(@NotNull Instance instance, long time, long lastTickAge) { - super(instance); + this.instance = instance; this.duration = (int) (time - lastTickAge); } + @Override + public @NotNull Instance getInstance() { + return instance; + } + /** * Gets the duration of the tick in ms. * diff --git a/src/main/java/net/minestom/server/event/instance/RemoveEntityFromInstanceEvent.java b/src/main/java/net/minestom/server/event/instance/RemoveEntityFromInstanceEvent.java index fe180ffea..868aafbc0 100644 --- a/src/main/java/net/minestom/server/event/instance/RemoveEntityFromInstanceEvent.java +++ b/src/main/java/net/minestom/server/event/instance/RemoveEntityFromInstanceEvent.java @@ -2,24 +2,31 @@ package net.minestom.server.event.instance; import net.minestom.server.entity.Entity; import net.minestom.server.event.CancellableEvent; -import net.minestom.server.event.InstanceEvent; +import net.minestom.server.event.trait.EntityEvent; +import net.minestom.server.event.trait.InstanceEvent; import net.minestom.server.instance.Instance; import org.jetbrains.annotations.NotNull; /** * Called by an Instance when an entity is removed from it. */ -public class RemoveEntityFromInstanceEvent extends InstanceEvent implements CancellableEvent { +public class RemoveEntityFromInstanceEvent implements InstanceEvent, EntityEvent, CancellableEvent { + private final Instance instance; private final Entity entity; private boolean cancelled; public RemoveEntityFromInstanceEvent(@NotNull Instance instance, @NotNull Entity entity) { - super(instance); + this.instance = instance; this.entity = entity; } + @Override + public @NotNull Instance getInstance() { + return instance; + } + /** * Gets the entity being removed. * diff --git a/src/main/java/net/minestom/server/event/trait/InstanceEvent.java b/src/main/java/net/minestom/server/event/trait/InstanceEvent.java new file mode 100644 index 000000000..af1f6d326 --- /dev/null +++ b/src/main/java/net/minestom/server/event/trait/InstanceEvent.java @@ -0,0 +1,15 @@ +package net.minestom.server.event.trait; + +import net.minestom.server.event.Event; +import net.minestom.server.instance.Instance; +import org.jetbrains.annotations.NotNull; + +public interface InstanceEvent extends Event { + + /** + * Gets the instance. + * + * @return instance + */ + @NotNull Instance getInstance(); +} \ No newline at end of file From 80b2dd2747d53b8e190edee414598e3edde56995 Mon Sep 17 00:00:00 2001 From: TheMode Date: Wed, 2 Jun 2021 09:25:08 +0200 Subject: [PATCH 013/104] Make InventoryEvent an interface --- .../minestom/server/event/InventoryEvent.java | 23 ------------------- .../event/inventory/InventoryClickEvent.java | 13 ++++++++--- .../event/inventory/InventoryCloseEvent.java | 13 ++++++++--- .../event/inventory/InventoryOpenEvent.java | 8 ++++--- .../inventory/InventoryPreClickEvent.java | 13 ++++++++--- .../server/event/trait/InventoryEvent.java | 15 ++++++++++++ 6 files changed, 50 insertions(+), 35 deletions(-) delete mode 100644 src/main/java/net/minestom/server/event/InventoryEvent.java create mode 100644 src/main/java/net/minestom/server/event/trait/InventoryEvent.java diff --git a/src/main/java/net/minestom/server/event/InventoryEvent.java b/src/main/java/net/minestom/server/event/InventoryEvent.java deleted file mode 100644 index 58d4db57c..000000000 --- a/src/main/java/net/minestom/server/event/InventoryEvent.java +++ /dev/null @@ -1,23 +0,0 @@ -package net.minestom.server.event; - -import net.minestom.server.inventory.Inventory; -import org.jetbrains.annotations.Nullable; - -public class InventoryEvent implements Event { - - protected Inventory inventory; - - public InventoryEvent(@Nullable Inventory inventory) { - this.inventory = inventory; - } - - /** - * Gets the inventory. - * - * @return the inventory, null if this is a player's inventory - */ - @Nullable - public Inventory getInventory() { - return inventory; - } -} \ No newline at end of file diff --git a/src/main/java/net/minestom/server/event/inventory/InventoryClickEvent.java b/src/main/java/net/minestom/server/event/inventory/InventoryClickEvent.java index b7e9a89bb..c7ce5381b 100644 --- a/src/main/java/net/minestom/server/event/inventory/InventoryClickEvent.java +++ b/src/main/java/net/minestom/server/event/inventory/InventoryClickEvent.java @@ -1,7 +1,8 @@ package net.minestom.server.event.inventory; import net.minestom.server.entity.Player; -import net.minestom.server.event.InventoryEvent; +import net.minestom.server.event.trait.InventoryEvent; +import net.minestom.server.event.trait.PlayerEvent; import net.minestom.server.inventory.Inventory; import net.minestom.server.inventory.click.ClickType; import net.minestom.server.item.ItemStack; @@ -12,8 +13,9 @@ import org.jetbrains.annotations.Nullable; * Called after {@link InventoryPreClickEvent}, this event cannot be cancelled and items related to the click * are already moved. */ -public class InventoryClickEvent extends InventoryEvent { +public class InventoryClickEvent implements InventoryEvent, PlayerEvent { + private final Inventory inventory; private final Player player; private final int slot; private final ClickType clickType; @@ -23,7 +25,7 @@ public class InventoryClickEvent extends InventoryEvent { public InventoryClickEvent(@Nullable Inventory inventory, @NotNull Player player, int slot, @NotNull ClickType clickType, @NotNull ItemStack clicked, @NotNull ItemStack cursor) { - super(inventory); + this.inventory = inventory; this.player = player; this.slot = slot; this.clickType = clickType; @@ -79,4 +81,9 @@ public class InventoryClickEvent extends InventoryEvent { public ItemStack getCursorItem() { return cursorItem; } + + @Override + public @Nullable Inventory getInventory() { + return inventory; + } } diff --git a/src/main/java/net/minestom/server/event/inventory/InventoryCloseEvent.java b/src/main/java/net/minestom/server/event/inventory/InventoryCloseEvent.java index 881d64e07..ec6579799 100644 --- a/src/main/java/net/minestom/server/event/inventory/InventoryCloseEvent.java +++ b/src/main/java/net/minestom/server/event/inventory/InventoryCloseEvent.java @@ -1,7 +1,8 @@ package net.minestom.server.event.inventory; import net.minestom.server.entity.Player; -import net.minestom.server.event.InventoryEvent; +import net.minestom.server.event.trait.InventoryEvent; +import net.minestom.server.event.trait.PlayerEvent; import net.minestom.server.inventory.Inventory; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; @@ -9,13 +10,14 @@ import org.jetbrains.annotations.Nullable; /** * Called when an {@link Inventory} is closed by a player. */ -public class InventoryCloseEvent extends InventoryEvent { +public class InventoryCloseEvent implements InventoryEvent, PlayerEvent { + private final Inventory inventory; private final Player player; private Inventory newInventory; public InventoryCloseEvent(@Nullable Inventory inventory, @NotNull Player player) { - super(inventory); + this.inventory = inventory; this.player = player; } @@ -47,4 +49,9 @@ public class InventoryCloseEvent extends InventoryEvent { public void setNewInventory(@Nullable Inventory newInventory) { this.newInventory = newInventory; } + + @Override + public @Nullable Inventory getInventory() { + return inventory; + } } diff --git a/src/main/java/net/minestom/server/event/inventory/InventoryOpenEvent.java b/src/main/java/net/minestom/server/event/inventory/InventoryOpenEvent.java index 6b02eb717..d73682243 100644 --- a/src/main/java/net/minestom/server/event/inventory/InventoryOpenEvent.java +++ b/src/main/java/net/minestom/server/event/inventory/InventoryOpenEvent.java @@ -2,7 +2,8 @@ package net.minestom.server.event.inventory; import net.minestom.server.entity.Player; import net.minestom.server.event.CancellableEvent; -import net.minestom.server.event.InventoryEvent; +import net.minestom.server.event.trait.InventoryEvent; +import net.minestom.server.event.trait.PlayerEvent; import net.minestom.server.inventory.Inventory; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; @@ -12,14 +13,15 @@ import org.jetbrains.annotations.Nullable; *

* Executed by {@link Player#openInventory(Inventory)}. */ -public class InventoryOpenEvent extends InventoryEvent implements CancellableEvent { +public class InventoryOpenEvent implements InventoryEvent, PlayerEvent, CancellableEvent { + private Inventory inventory; private final Player player; private boolean cancelled; public InventoryOpenEvent(@Nullable Inventory inventory, @NotNull Player player) { - super(inventory); + this.inventory = inventory; this.player = player; } diff --git a/src/main/java/net/minestom/server/event/inventory/InventoryPreClickEvent.java b/src/main/java/net/minestom/server/event/inventory/InventoryPreClickEvent.java index ca4733b38..cf483e8bc 100644 --- a/src/main/java/net/minestom/server/event/inventory/InventoryPreClickEvent.java +++ b/src/main/java/net/minestom/server/event/inventory/InventoryPreClickEvent.java @@ -2,7 +2,8 @@ package net.minestom.server.event.inventory; import net.minestom.server.entity.Player; import net.minestom.server.event.CancellableEvent; -import net.minestom.server.event.InventoryEvent; +import net.minestom.server.event.trait.InventoryEvent; +import net.minestom.server.event.trait.PlayerEvent; import net.minestom.server.inventory.Inventory; import net.minestom.server.inventory.click.ClickType; import net.minestom.server.item.ItemStack; @@ -12,8 +13,9 @@ import org.jetbrains.annotations.Nullable; /** * Called before {@link InventoryClickEvent}, used to potentially cancel the click. */ -public class InventoryPreClickEvent extends InventoryEvent implements CancellableEvent { +public class InventoryPreClickEvent implements InventoryEvent, PlayerEvent, CancellableEvent { + private final Inventory inventory; private final Player player; private final int slot; private final ClickType clickType; @@ -26,7 +28,7 @@ public class InventoryPreClickEvent extends InventoryEvent implements Cancellabl @NotNull Player player, int slot, @NotNull ClickType clickType, @NotNull ItemStack clicked, @NotNull ItemStack cursor) { - super(inventory); + this.inventory = inventory; this.player = player; this.slot = slot; this.clickType = clickType; @@ -110,4 +112,9 @@ public class InventoryPreClickEvent extends InventoryEvent implements Cancellabl public void setCancelled(boolean cancel) { this.cancelled = cancel; } + + @Override + public @Nullable Inventory getInventory() { + return inventory; + } } diff --git a/src/main/java/net/minestom/server/event/trait/InventoryEvent.java b/src/main/java/net/minestom/server/event/trait/InventoryEvent.java new file mode 100644 index 000000000..d102f5d20 --- /dev/null +++ b/src/main/java/net/minestom/server/event/trait/InventoryEvent.java @@ -0,0 +1,15 @@ +package net.minestom.server.event.trait; + +import net.minestom.server.event.Event; +import net.minestom.server.inventory.Inventory; +import org.jetbrains.annotations.Nullable; + +public interface InventoryEvent extends Event { + + /** + * Gets the inventory. + * + * @return the inventory, null if this is a player's inventory + */ + @Nullable Inventory getInventory(); +} \ No newline at end of file From 5474116e7ae51706e386c59fb1365cc3a6f62923 Mon Sep 17 00:00:00 2001 From: TheMode Date: Wed, 2 Jun 2021 09:50:18 +0200 Subject: [PATCH 014/104] Add EventNode#addChild --- src/main/java/net/minestom/server/event/EventNode.java | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/main/java/net/minestom/server/event/EventNode.java b/src/main/java/net/minestom/server/event/EventNode.java index 2b9668aae..dae9c512c 100644 --- a/src/main/java/net/minestom/server/event/EventNode.java +++ b/src/main/java/net/minestom/server/event/EventNode.java @@ -28,6 +28,9 @@ public class EventNode { return new EventNode<>(); } + public void addChild(EventNode child) { + } + public void addListener(EventListener listener) { } From f4db18ea6ce5cb101fa2db0835b5dfb8b362b3ce Mon Sep 17 00:00:00 2001 From: TheMode Date: Wed, 2 Jun 2021 10:19:23 +0200 Subject: [PATCH 015/104] Start EventNode implementation --- .../net/minestom/server/event/EventNode.java | 42 +++++++++++++++---- 1 file changed, 33 insertions(+), 9 deletions(-) diff --git a/src/main/java/net/minestom/server/event/EventNode.java b/src/main/java/net/minestom/server/event/EventNode.java index dae9c512c..674c7f6b0 100644 --- a/src/main/java/net/minestom/server/event/EventNode.java +++ b/src/main/java/net/minestom/server/event/EventNode.java @@ -1,12 +1,21 @@ package net.minestom.server.event; import net.minestom.server.event.handler.EventHandler; +import org.jetbrains.annotations.NotNull; +import java.util.Collections; +import java.util.List; +import java.util.concurrent.CopyOnWriteArrayList; import java.util.function.Consumer; import java.util.function.Predicate; public class EventNode { + private final String name = "debug"; + private final List> listeners = new CopyOnWriteArrayList<>(); + private final List> children = new CopyOnWriteArrayList<>(); + private final Predicate condition = t -> true; + private EventNode() { } @@ -14,26 +23,41 @@ public class EventNode { return new EventNode<>(); } - public static EventNode conditional(Class eventType, - Class handlerType, - Predicate predicate) { + public static EventNode conditional(@NotNull Class type, + @NotNull Predicate predicate) { return new EventNode<>(); } - public static EventNode conditional(Class eventType) { + public static EventNode conditional(@NotNull Class eventType) { + return conditional(eventType, t -> true); + } + + public static EventNode unique(@NotNull Class eventType, + @NotNull EventHandler handler) { return new EventNode<>(); } - public static EventNode unique(Class eventType, EventHandler handler) { - return new EventNode<>(); + public void addChild(@NotNull EventNode child) { + this.children.add(child); } - public void addChild(EventNode child) { + public void addListener(@NotNull EventListener listener) { + this.listeners.add(listener); } - public void addListener(EventListener listener) { + public void addListener(@NotNull Class eventClass, @NotNull Consumer<@NotNull E> listener) { + addListener(EventListener.of(eventClass).handler(listener).build()); } - public void addListener(Class eventClass, Consumer listener) { + public @NotNull String getName() { + return name; + } + + public @NotNull List<@NotNull EventNode> getChildren() { + return Collections.unmodifiableList(children); + } + + public @NotNull Predicate<@NotNull T> getCondition() { + return condition; } } From 4f7192b6c7653bad16cda03e2b84830ca8c84bfa Mon Sep 17 00:00:00 2001 From: TheMode Date: Wed, 2 Jun 2021 10:34:01 +0200 Subject: [PATCH 016/104] Can now call an event from anywhere in the tree --- .../minestom/server/event/EventListener.java | 28 ++++--------------- .../net/minestom/server/event/EventNode.java | 13 ++++++--- .../minestom/server/event/ListenerAttach.java | 10 ------- 3 files changed, 14 insertions(+), 37 deletions(-) delete mode 100644 src/main/java/net/minestom/server/event/ListenerAttach.java diff --git a/src/main/java/net/minestom/server/event/EventListener.java b/src/main/java/net/minestom/server/event/EventListener.java index 2c5379802..24cf4b2cf 100644 --- a/src/main/java/net/minestom/server/event/EventListener.java +++ b/src/main/java/net/minestom/server/event/EventListener.java @@ -1,23 +1,17 @@ package net.minestom.server.event; -import net.minestom.server.event.handler.EventHandler; import org.jetbrains.annotations.NotNull; import java.util.ArrayList; import java.util.List; -import java.util.Set; -import java.util.concurrent.CopyOnWriteArraySet; import java.util.function.Consumer; import java.util.function.Predicate; -public class EventListener implements ListenerAttach { +public class EventListener { - private final Class eventType; - private final Set attach = new CopyOnWriteArraySet<>(); private final Consumer combined; - private EventListener(Class eventType, @NotNull Consumer combined) { - this.eventType = eventType; + private EventListener(@NotNull Consumer combined) { this.combined = combined; } @@ -25,20 +19,8 @@ public class EventListener implements ListenerAttach { return new EventListener.Builder<>(eventType); } - @Override - public void attachTo(@NotNull EventHandler handler) { - final boolean success = this.attach.add(handler); - if (success) { - handler.addEventCallback(eventType, combined::accept); - } - } - - @Override - public void detachFrom(@NotNull EventHandler handler) { - final boolean success = this.attach.remove(handler); - if (success) { - handler.removeEventCallback(eventType, combined::accept); - } + protected Consumer getCombined() { + return combined; } public static class Builder { @@ -63,7 +45,7 @@ public class EventListener implements ListenerAttach { } public EventListener build() { - return new EventListener<>(eventType, event -> { + return new EventListener<>(event -> { // Filtering if (!filters.isEmpty()) { if (filters.stream().anyMatch(filter -> !filter.test(event))) { diff --git a/src/main/java/net/minestom/server/event/EventNode.java b/src/main/java/net/minestom/server/event/EventNode.java index 674c7f6b0..4b177ca20 100644 --- a/src/main/java/net/minestom/server/event/EventNode.java +++ b/src/main/java/net/minestom/server/event/EventNode.java @@ -12,8 +12,8 @@ import java.util.function.Predicate; public class EventNode { private final String name = "debug"; - private final List> listeners = new CopyOnWriteArrayList<>(); - private final List> children = new CopyOnWriteArrayList<>(); + private final List> listeners = new CopyOnWriteArrayList<>(); + private final List> children = new CopyOnWriteArrayList<>(); private final Predicate condition = t -> true; private EventNode() { @@ -37,12 +37,17 @@ public class EventNode { return new EventNode<>(); } + public void call(@NotNull T event) { + this.listeners.forEach(eventListener -> eventListener.getCombined().accept(event)); + this.children.forEach(eventNode -> eventNode.call(event)); + } + public void addChild(@NotNull EventNode child) { - this.children.add(child); + this.children.add((EventNode) child); } public void addListener(@NotNull EventListener listener) { - this.listeners.add(listener); + this.listeners.add((EventListener) listener); } public void addListener(@NotNull Class eventClass, @NotNull Consumer<@NotNull E> listener) { diff --git a/src/main/java/net/minestom/server/event/ListenerAttach.java b/src/main/java/net/minestom/server/event/ListenerAttach.java deleted file mode 100644 index 7f3122db4..000000000 --- a/src/main/java/net/minestom/server/event/ListenerAttach.java +++ /dev/null @@ -1,10 +0,0 @@ -package net.minestom.server.event; - -import net.minestom.server.event.handler.EventHandler; -import org.jetbrains.annotations.NotNull; - -public interface ListenerAttach { - void attachTo(@NotNull EventHandler handler); - - void detachFrom(@NotNull EventHandler handler); -} From c3f52031e610ae8cfdb2855577098c48301169b9 Mon Sep 17 00:00:00 2001 From: TheMode Date: Wed, 2 Jun 2021 10:52:20 +0200 Subject: [PATCH 017/104] Added EventNodeConditional --- .../net/minestom/server/event/EventNode.java | 29 +++++++++---------- .../server/event/EventNodeConditional.java | 27 +++++++++++++++++ 2 files changed, 40 insertions(+), 16 deletions(-) create mode 100644 src/main/java/net/minestom/server/event/EventNodeConditional.java diff --git a/src/main/java/net/minestom/server/event/EventNode.java b/src/main/java/net/minestom/server/event/EventNode.java index 4b177ca20..09c4462bc 100644 --- a/src/main/java/net/minestom/server/event/EventNode.java +++ b/src/main/java/net/minestom/server/event/EventNode.java @@ -1,6 +1,5 @@ package net.minestom.server.event; -import net.minestom.server.event.handler.EventHandler; import org.jetbrains.annotations.NotNull; import java.util.Collections; @@ -9,35 +8,37 @@ import java.util.concurrent.CopyOnWriteArrayList; import java.util.function.Consumer; import java.util.function.Predicate; -public class EventNode { +public abstract class EventNode { private final String name = "debug"; private final List> listeners = new CopyOnWriteArrayList<>(); private final List> children = new CopyOnWriteArrayList<>(); - private final Predicate condition = t -> true; - private EventNode() { - } + private static final EventNode EMPTY = new EventNode<>() { + @Override + protected boolean isValid(@NotNull Event event) { + return true; + } + }; public static EventNode create() { - return new EventNode<>(); + return EMPTY; } public static EventNode conditional(@NotNull Class type, @NotNull Predicate predicate) { - return new EventNode<>(); + return new EventNodeConditional<>(predicate); } public static EventNode conditional(@NotNull Class eventType) { return conditional(eventType, t -> true); } - public static EventNode unique(@NotNull Class eventType, - @NotNull EventHandler handler) { - return new EventNode<>(); - } + protected abstract boolean isValid(@NotNull T event); public void call(@NotNull T event) { + if (!isValid(event)) + return; this.listeners.forEach(eventListener -> eventListener.getCombined().accept(event)); this.children.forEach(eventNode -> eventNode.call(event)); } @@ -58,11 +59,7 @@ public class EventNode { return name; } - public @NotNull List<@NotNull EventNode> getChildren() { + public @NotNull List<@NotNull EventNode> getChildren() { return Collections.unmodifiableList(children); } - - public @NotNull Predicate<@NotNull T> getCondition() { - return condition; - } } diff --git a/src/main/java/net/minestom/server/event/EventNodeConditional.java b/src/main/java/net/minestom/server/event/EventNodeConditional.java new file mode 100644 index 000000000..ec37e4eec --- /dev/null +++ b/src/main/java/net/minestom/server/event/EventNodeConditional.java @@ -0,0 +1,27 @@ +package net.minestom.server.event; + +import org.jetbrains.annotations.NotNull; + +import java.util.function.Predicate; + +public class EventNodeConditional extends EventNode { + + private volatile Predicate predicate; + + protected EventNodeConditional(Predicate predicate) { + this.predicate = predicate; + } + + @Override + protected boolean isValid(@NotNull T event) { + return predicate.test(event); + } + + public Predicate getPredicate() { + return predicate; + } + + public void setPredicate(Predicate predicate) { + this.predicate = predicate; + } +} From bc2a075b605d94b1502bbe02f263d9743ba7ebd4 Mon Sep 17 00:00:00 2001 From: TheMode Date: Wed, 2 Jun 2021 11:08:48 +0200 Subject: [PATCH 018/104] Fix event calling --- .../net/minestom/server/event/EventListener.java | 15 ++++++--------- .../net/minestom/server/event/EventNode.java | 16 ++++++++++++---- .../server/event/EventNodeConditional.java | 11 +++++++---- 3 files changed, 25 insertions(+), 17 deletions(-) diff --git a/src/main/java/net/minestom/server/event/EventListener.java b/src/main/java/net/minestom/server/event/EventListener.java index 24cf4b2cf..03c6ab9e4 100644 --- a/src/main/java/net/minestom/server/event/EventListener.java +++ b/src/main/java/net/minestom/server/event/EventListener.java @@ -9,20 +9,18 @@ import java.util.function.Predicate; public class EventListener { - private final Consumer combined; + protected final Class type; + protected final Consumer combined; - private EventListener(@NotNull Consumer combined) { + private EventListener(@NotNull Class type, @NotNull Consumer combined) { + this.type = type; this.combined = combined; } - public static EventListener.Builder of(Class eventType) { + public static EventListener.Builder of(@NotNull Class eventType) { return new EventListener.Builder<>(eventType); } - protected Consumer getCombined() { - return combined; - } - public static class Builder { private final Class eventType; @@ -45,7 +43,7 @@ public class EventListener { } public EventListener build() { - return new EventListener<>(event -> { + return new EventListener<>(eventType, event -> { // Filtering if (!filters.isEmpty()) { if (filters.stream().anyMatch(filter -> !filter.test(event))) { @@ -53,7 +51,6 @@ public class EventListener { return; } } - // Handler if (handler != null) { handler.accept(event); diff --git a/src/main/java/net/minestom/server/event/EventNode.java b/src/main/java/net/minestom/server/event/EventNode.java index 09c4462bc..c21c03512 100644 --- a/src/main/java/net/minestom/server/event/EventNode.java +++ b/src/main/java/net/minestom/server/event/EventNode.java @@ -4,6 +4,8 @@ import org.jetbrains.annotations.NotNull; import java.util.Collections; import java.util.List; +import java.util.Map; +import java.util.concurrent.ConcurrentHashMap; import java.util.concurrent.CopyOnWriteArrayList; import java.util.function.Consumer; import java.util.function.Predicate; @@ -11,7 +13,8 @@ import java.util.function.Predicate; public abstract class EventNode { private final String name = "debug"; - private final List> listeners = new CopyOnWriteArrayList<>(); + + private final Map, List>> listenerMap = new ConcurrentHashMap<>(); private final List> children = new CopyOnWriteArrayList<>(); private static final EventNode EMPTY = new EventNode<>() { @@ -27,7 +30,7 @@ public abstract class EventNode { public static EventNode conditional(@NotNull Class type, @NotNull Predicate predicate) { - return new EventNodeConditional<>(predicate); + return new EventNodeConditional<>(type, predicate); } public static EventNode conditional(@NotNull Class eventType) { @@ -39,7 +42,11 @@ public abstract class EventNode { public void call(@NotNull T event) { if (!isValid(event)) return; - this.listeners.forEach(eventListener -> eventListener.getCombined().accept(event)); + final var listeners = listenerMap.get(event.getClass()); + if (listeners != null && !listeners.isEmpty()) { + listeners.forEach(eventListener -> + eventListener.combined.accept(event)); + } this.children.forEach(eventNode -> eventNode.call(event)); } @@ -48,7 +55,8 @@ public abstract class EventNode { } public void addListener(@NotNull EventListener listener) { - this.listeners.add((EventListener) listener); + this.listenerMap.computeIfAbsent(listener.type, aClass -> new CopyOnWriteArrayList<>()) + .add((EventListener) listener); } public void addListener(@NotNull Class eventClass, @NotNull Consumer<@NotNull E> listener) { diff --git a/src/main/java/net/minestom/server/event/EventNodeConditional.java b/src/main/java/net/minestom/server/event/EventNodeConditional.java index ec37e4eec..5bd70c085 100644 --- a/src/main/java/net/minestom/server/event/EventNodeConditional.java +++ b/src/main/java/net/minestom/server/event/EventNodeConditional.java @@ -6,22 +6,25 @@ import java.util.function.Predicate; public class EventNodeConditional extends EventNode { + private final Class type; private volatile Predicate predicate; - protected EventNodeConditional(Predicate predicate) { + protected EventNodeConditional(Class type, Predicate predicate) { + this.type = type; this.predicate = predicate; } @Override protected boolean isValid(@NotNull T event) { - return predicate.test(event); + final boolean typeCheck = type.isAssignableFrom(event.getClass()); + return typeCheck && predicate.test(event); } - public Predicate getPredicate() { + public @NotNull Predicate<@NotNull T> getPredicate() { return predicate; } - public void setPredicate(Predicate predicate) { + public void setPredicate(@NotNull Predicate<@NotNull T> predicate) { this.predicate = predicate; } } From 5d1b7429348eb92b844bbe7918e55b6e4fde7fc3 Mon Sep 17 00:00:00 2001 From: TheMode Date: Wed, 2 Jun 2021 11:18:26 +0200 Subject: [PATCH 019/104] Move type check inside EventNode --- .../net/minestom/server/event/EventNode.java | 27 ++++++++++++------- .../server/event/EventNodeConditional.java | 8 +++--- 2 files changed, 21 insertions(+), 14 deletions(-) diff --git a/src/main/java/net/minestom/server/event/EventNode.java b/src/main/java/net/minestom/server/event/EventNode.java index c21c03512..0834ea2eb 100644 --- a/src/main/java/net/minestom/server/event/EventNode.java +++ b/src/main/java/net/minestom/server/event/EventNode.java @@ -10,19 +10,20 @@ import java.util.concurrent.CopyOnWriteArrayList; import java.util.function.Consumer; import java.util.function.Predicate; -public abstract class EventNode { +public class EventNode { private final String name = "debug"; private final Map, List>> listenerMap = new ConcurrentHashMap<>(); private final List> children = new CopyOnWriteArrayList<>(); - private static final EventNode EMPTY = new EventNode<>() { - @Override - protected boolean isValid(@NotNull Event event) { - return true; - } - }; + protected final Class type; + + protected EventNode(Class type) { + this.type = type; + } + + private static final EventNode EMPTY = new EventNode<>(Event.class); public static EventNode create() { return EMPTY; @@ -37,11 +38,19 @@ public abstract class EventNode { return conditional(eventType, t -> true); } - protected abstract boolean isValid(@NotNull T event); + protected boolean condition(@NotNull T event) { + return true; + } public void call(@NotNull T event) { - if (!isValid(event)) + if (!type.isAssignableFrom(event.getClass())) { + // Invalid event type return; + } + if (!condition(event)) { + // Cancelled by superclass + return; + } final var listeners = listenerMap.get(event.getClass()); if (listeners != null && !listeners.isEmpty()) { listeners.forEach(eventListener -> diff --git a/src/main/java/net/minestom/server/event/EventNodeConditional.java b/src/main/java/net/minestom/server/event/EventNodeConditional.java index 5bd70c085..fb3982bc9 100644 --- a/src/main/java/net/minestom/server/event/EventNodeConditional.java +++ b/src/main/java/net/minestom/server/event/EventNodeConditional.java @@ -6,18 +6,16 @@ import java.util.function.Predicate; public class EventNodeConditional extends EventNode { - private final Class type; private volatile Predicate predicate; protected EventNodeConditional(Class type, Predicate predicate) { - this.type = type; + super(type); this.predicate = predicate; } @Override - protected boolean isValid(@NotNull T event) { - final boolean typeCheck = type.isAssignableFrom(event.getClass()); - return typeCheck && predicate.test(event); + protected boolean condition(@NotNull T event) { + return predicate.test(event); } public @NotNull Predicate<@NotNull T> getPredicate() { From 12c620df7a0ab897cd994b4d8e1e1aadb243d714 Mon Sep 17 00:00:00 2001 From: TheMode Date: Wed, 2 Jun 2021 11:26:36 +0200 Subject: [PATCH 020/104] Fix conditional factory not actually having a condition --- src/main/java/net/minestom/server/event/EventNode.java | 8 ++++---- src/test/java/demo/PlayerInit.java | 2 +- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/src/main/java/net/minestom/server/event/EventNode.java b/src/main/java/net/minestom/server/event/EventNode.java index 0834ea2eb..30ffb35d9 100644 --- a/src/main/java/net/minestom/server/event/EventNode.java +++ b/src/main/java/net/minestom/server/event/EventNode.java @@ -29,15 +29,15 @@ public class EventNode { return EMPTY; } + public static EventNode create(@NotNull Class type) { + return new EventNode<>(type); + } + public static EventNode conditional(@NotNull Class type, @NotNull Predicate predicate) { return new EventNodeConditional<>(type, predicate); } - public static EventNode conditional(@NotNull Class eventType) { - return conditional(eventType, t -> true); - } - protected boolean condition(@NotNull T event) { return true; } diff --git a/src/test/java/demo/PlayerInit.java b/src/test/java/demo/PlayerInit.java index 2d075c60a..af355b3d2 100644 --- a/src/test/java/demo/PlayerInit.java +++ b/src/test/java/demo/PlayerInit.java @@ -137,7 +137,7 @@ public class PlayerInit { // EVENT REGISTERING - var node = EventNode.conditional(PlayerEvent.class); + var node = EventNode.create(PlayerEvent.class); node.addListener(EventListener.of(PlayerTickEvent.class) .handler(playerTickEvent -> System.out.println("Player tick!")) .build()); From bdfa164695ab99337eeb09aafa0f43fe416dc83d Mon Sep 17 00:00:00 2001 From: TheMode Date: Wed, 2 Jun 2021 11:29:16 +0200 Subject: [PATCH 021/104] Do not reuse node objects --- src/main/java/net/minestom/server/event/EventNode.java | 10 ++++------ 1 file changed, 4 insertions(+), 6 deletions(-) diff --git a/src/main/java/net/minestom/server/event/EventNode.java b/src/main/java/net/minestom/server/event/EventNode.java index 30ffb35d9..dbba4c1b1 100644 --- a/src/main/java/net/minestom/server/event/EventNode.java +++ b/src/main/java/net/minestom/server/event/EventNode.java @@ -23,16 +23,14 @@ public class EventNode { this.type = type; } - private static final EventNode EMPTY = new EventNode<>(Event.class); - - public static EventNode create() { - return EMPTY; - } - public static EventNode create(@NotNull Class type) { return new EventNode<>(type); } + public static EventNode create() { + return create(Event.class); + } + public static EventNode conditional(@NotNull Class type, @NotNull Predicate predicate) { return new EventNodeConditional<>(type, predicate); From 305aa3e8d9c6702f89d45f33c05394611a5796dc Mon Sep 17 00:00:00 2001 From: TheMode Date: Wed, 2 Jun 2021 12:12:14 +0200 Subject: [PATCH 022/104] Add support for listener expiration count --- .../minestom/server/event/EventListener.java | 35 ++++++++++++++++--- .../net/minestom/server/event/EventNode.java | 8 +++-- src/test/java/demo/PlayerInit.java | 1 + 3 files changed, 38 insertions(+), 6 deletions(-) diff --git a/src/main/java/net/minestom/server/event/EventListener.java b/src/main/java/net/minestom/server/event/EventListener.java index 03c6ab9e4..b960d788e 100644 --- a/src/main/java/net/minestom/server/event/EventListener.java +++ b/src/main/java/net/minestom/server/event/EventListener.java @@ -1,20 +1,23 @@ package net.minestom.server.event; +import net.minestom.server.utils.time.UpdateOption; import org.jetbrains.annotations.NotNull; import java.util.ArrayList; import java.util.List; +import java.util.concurrent.atomic.AtomicInteger; import java.util.function.Consumer; +import java.util.function.Function; import java.util.function.Predicate; public class EventListener { protected final Class type; - protected final Consumer combined; + protected final Function executor; - private EventListener(@NotNull Class type, @NotNull Consumer combined) { + private EventListener(@NotNull Class type, @NotNull Function executor) { this.type = type; - this.combined = combined; + this.executor = executor; } public static EventListener.Builder of(@NotNull Class eventType) { @@ -26,6 +29,8 @@ public class EventListener { private final Class eventType; private List> filters = new ArrayList<>(); + private int expirationCount; + private UpdateOption expirationTime; private Consumer handler; protected Builder(Class eventType) { @@ -37,25 +42,47 @@ public class EventListener { return this; } + public EventListener.Builder expirationCount(int expirationCount) { + this.expirationCount = expirationCount; + return this; + } + public EventListener.Builder handler(Consumer handler) { this.handler = handler; return this; } public EventListener build() { + AtomicInteger expirationCount = new AtomicInteger(this.expirationCount); + final boolean hasExpirationCount = expirationCount.get() > 0; + + final var filters = new ArrayList<>(this.filters); + final var handler = this.handler; return new EventListener<>(eventType, event -> { // Filtering if (!filters.isEmpty()) { if (filters.stream().anyMatch(filter -> !filter.test(event))) { // Cancelled - return; + return Result.INVALID; } } // Handler if (handler != null) { handler.accept(event); } + // Expiration check + if (hasExpirationCount && expirationCount.decrementAndGet() == 0) { + return Result.EXPIRED; + } + return Result.SUCCESS; }); } } + + + enum Result { + SUCCESS, + INVALID, + EXPIRED + } } diff --git a/src/main/java/net/minestom/server/event/EventNode.java b/src/main/java/net/minestom/server/event/EventNode.java index dbba4c1b1..6726f4fc9 100644 --- a/src/main/java/net/minestom/server/event/EventNode.java +++ b/src/main/java/net/minestom/server/event/EventNode.java @@ -51,8 +51,12 @@ public class EventNode { } final var listeners = listenerMap.get(event.getClass()); if (listeners != null && !listeners.isEmpty()) { - listeners.forEach(eventListener -> - eventListener.combined.accept(event)); + listeners.forEach(listener -> { + final EventListener.Result result = listener.executor.apply(event); + if (result == EventListener.Result.EXPIRED) { + listeners.remove(listener); + } + }); } this.children.forEach(eventNode -> eventNode.call(event)); } diff --git a/src/test/java/demo/PlayerInit.java b/src/test/java/demo/PlayerInit.java index af355b3d2..0a763acbf 100644 --- a/src/test/java/demo/PlayerInit.java +++ b/src/test/java/demo/PlayerInit.java @@ -140,6 +140,7 @@ public class PlayerInit { var node = EventNode.create(PlayerEvent.class); node.addListener(EventListener.of(PlayerTickEvent.class) .handler(playerTickEvent -> System.out.println("Player tick!")) + .expirationCount(2) .build()); var empty = EventNode.create(); From cd30a97cbb76c634d59ab3e70216d2dbf4a38f8d Mon Sep 17 00:00:00 2001 From: TheMode Date: Wed, 2 Jun 2021 18:04:08 +0200 Subject: [PATCH 023/104] Make PlayerEvent extends EntityEvent --- .../net/minestom/server/event/trait/PlayerEvent.java | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) diff --git a/src/main/java/net/minestom/server/event/trait/PlayerEvent.java b/src/main/java/net/minestom/server/event/trait/PlayerEvent.java index efb03c6bc..2fb8834fd 100644 --- a/src/main/java/net/minestom/server/event/trait/PlayerEvent.java +++ b/src/main/java/net/minestom/server/event/trait/PlayerEvent.java @@ -1,10 +1,9 @@ package net.minestom.server.event.trait; import net.minestom.server.entity.Player; -import net.minestom.server.event.Event; import org.jetbrains.annotations.NotNull; -public interface PlayerEvent extends Event { +public interface PlayerEvent extends EntityEvent { /** * Gets the player. @@ -12,4 +11,12 @@ public interface PlayerEvent extends Event { * @return the player */ @NotNull Player getPlayer(); + + /** + * Returns {@link #getPlayer()}. + */ + @Override + default @NotNull Player getEntity() { + return getPlayer(); + } } From a835a479ae51d1489aab5f52d1ab9932cf68d2e5 Mon Sep 17 00:00:00 2001 From: TheMode Date: Wed, 2 Jun 2021 18:13:17 +0200 Subject: [PATCH 024/104] Added EventNode#map --- .../net/minestom/server/event/EventNode.java | 8 +++++ .../minestom/server/event/EventNodeMap.java | 34 +++++++++++++++++++ 2 files changed, 42 insertions(+) create mode 100644 src/main/java/net/minestom/server/event/EventNodeMap.java diff --git a/src/main/java/net/minestom/server/event/EventNode.java b/src/main/java/net/minestom/server/event/EventNode.java index 6726f4fc9..902f48ea6 100644 --- a/src/main/java/net/minestom/server/event/EventNode.java +++ b/src/main/java/net/minestom/server/event/EventNode.java @@ -1,5 +1,6 @@ package net.minestom.server.event; +import net.minestom.server.event.handler.EventHandler; import org.jetbrains.annotations.NotNull; import java.util.Collections; @@ -8,6 +9,7 @@ import java.util.Map; import java.util.concurrent.ConcurrentHashMap; import java.util.concurrent.CopyOnWriteArrayList; import java.util.function.Consumer; +import java.util.function.Function; import java.util.function.Predicate; public class EventNode { @@ -36,6 +38,12 @@ public class EventNode { return new EventNodeConditional<>(type, predicate); } + public static EventNode map(@NotNull Class eventType, + @NotNull Class handlerType, + @NotNull Function handlerGetter) { + return new EventNodeMap<>(eventType, handlerGetter); + } + protected boolean condition(@NotNull T event) { return true; } diff --git a/src/main/java/net/minestom/server/event/EventNodeMap.java b/src/main/java/net/minestom/server/event/EventNodeMap.java new file mode 100644 index 000000000..4ca91c3d2 --- /dev/null +++ b/src/main/java/net/minestom/server/event/EventNodeMap.java @@ -0,0 +1,34 @@ +package net.minestom.server.event; + +import net.minestom.server.event.handler.EventHandler; +import org.jetbrains.annotations.NotNull; + +import java.util.List; +import java.util.concurrent.CopyOnWriteArrayList; +import java.util.function.Function; + +public class EventNodeMap extends EventNode { + + private final Function handlerGetter; + + private final List entries = new CopyOnWriteArrayList<>(); + + protected EventNodeMap(Class eventType, Function handlerGetter) { + super(eventType); + this.handlerGetter = handlerGetter; + } + + @Override + protected boolean condition(@NotNull T event) { + final var eventHandler = handlerGetter.apply(event); + return entries.contains(eventHandler); + } + + public void addEntry(@NotNull H handler) { + this.entries.add(handler); + } + + public void removeEntry(@NotNull H handler) { + this.entries.remove(handler); + } +} From 0d6dde3ff5e00111de2703e3c6801aa4537ef5ac Mon Sep 17 00:00:00 2001 From: TheMode Date: Wed, 2 Jun 2021 19:17:08 +0200 Subject: [PATCH 025/104] Make EventNode an interface --- .../net/minestom/server/event/EventNode.java | 77 ++++--------------- .../server/event/EventNodeConditional.java | 2 +- .../minestom/server/event/EventNodeImpl.java | 70 +++++++++++++++++ .../minestom/server/event/EventNodeMap.java | 2 +- 4 files changed, 87 insertions(+), 64 deletions(-) create mode 100644 src/main/java/net/minestom/server/event/EventNodeImpl.java diff --git a/src/main/java/net/minestom/server/event/EventNode.java b/src/main/java/net/minestom/server/event/EventNode.java index 902f48ea6..fd59584ee 100644 --- a/src/main/java/net/minestom/server/event/EventNode.java +++ b/src/main/java/net/minestom/server/event/EventNode.java @@ -3,90 +3,43 @@ package net.minestom.server.event; import net.minestom.server.event.handler.EventHandler; import org.jetbrains.annotations.NotNull; -import java.util.Collections; import java.util.List; -import java.util.Map; -import java.util.concurrent.ConcurrentHashMap; -import java.util.concurrent.CopyOnWriteArrayList; import java.util.function.Consumer; import java.util.function.Function; import java.util.function.Predicate; -public class EventNode { +public interface EventNode { - private final String name = "debug"; - - private final Map, List>> listenerMap = new ConcurrentHashMap<>(); - private final List> children = new CopyOnWriteArrayList<>(); - - protected final Class type; - - protected EventNode(Class type) { - this.type = type; + static EventNode create(@NotNull Class type) { + return new EventNodeImpl<>(type); } - public static EventNode create(@NotNull Class type) { - return new EventNode<>(type); - } - - public static EventNode create() { + static EventNode create() { return create(Event.class); } - public static EventNode conditional(@NotNull Class type, - @NotNull Predicate predicate) { + static EventNode conditional(@NotNull Class type, + @NotNull Predicate predicate) { return new EventNodeConditional<>(type, predicate); } - public static EventNode map(@NotNull Class eventType, - @NotNull Class handlerType, - @NotNull Function handlerGetter) { + static EventNode map(@NotNull Class eventType, + @NotNull Class handlerType, + @NotNull Function handlerGetter) { return new EventNodeMap<>(eventType, handlerGetter); } - protected boolean condition(@NotNull T event) { - return true; - } + void call(@NotNull T event); - public void call(@NotNull T event) { - if (!type.isAssignableFrom(event.getClass())) { - // Invalid event type - return; - } - if (!condition(event)) { - // Cancelled by superclass - return; - } - final var listeners = listenerMap.get(event.getClass()); - if (listeners != null && !listeners.isEmpty()) { - listeners.forEach(listener -> { - final EventListener.Result result = listener.executor.apply(event); - if (result == EventListener.Result.EXPIRED) { - listeners.remove(listener); - } - }); - } - this.children.forEach(eventNode -> eventNode.call(event)); - } + void addChild(@NotNull EventNode child); - public void addChild(@NotNull EventNode child) { - this.children.add((EventNode) child); - } + void addListener(@NotNull EventListener listener); - public void addListener(@NotNull EventListener listener) { - this.listenerMap.computeIfAbsent(listener.type, aClass -> new CopyOnWriteArrayList<>()) - .add((EventListener) listener); - } - - public void addListener(@NotNull Class eventClass, @NotNull Consumer<@NotNull E> listener) { + default void addListener(@NotNull Class eventClass, @NotNull Consumer<@NotNull E> listener) { addListener(EventListener.of(eventClass).handler(listener).build()); } - public @NotNull String getName() { - return name; - } + @NotNull String getName(); - public @NotNull List<@NotNull EventNode> getChildren() { - return Collections.unmodifiableList(children); - } + @NotNull List<@NotNull EventNode> getChildren(); } diff --git a/src/main/java/net/minestom/server/event/EventNodeConditional.java b/src/main/java/net/minestom/server/event/EventNodeConditional.java index fb3982bc9..7ba2948e4 100644 --- a/src/main/java/net/minestom/server/event/EventNodeConditional.java +++ b/src/main/java/net/minestom/server/event/EventNodeConditional.java @@ -4,7 +4,7 @@ import org.jetbrains.annotations.NotNull; import java.util.function.Predicate; -public class EventNodeConditional extends EventNode { +public class EventNodeConditional extends EventNodeImpl { private volatile Predicate predicate; diff --git a/src/main/java/net/minestom/server/event/EventNodeImpl.java b/src/main/java/net/minestom/server/event/EventNodeImpl.java new file mode 100644 index 000000000..2e0add8b8 --- /dev/null +++ b/src/main/java/net/minestom/server/event/EventNodeImpl.java @@ -0,0 +1,70 @@ +package net.minestom.server.event; + +import org.jetbrains.annotations.NotNull; + +import java.util.Collections; +import java.util.List; +import java.util.Map; +import java.util.concurrent.ConcurrentHashMap; +import java.util.concurrent.CopyOnWriteArrayList; + +class EventNodeImpl implements EventNode { + + private final String name = "debug"; + + private final Map, List>> listenerMap = new ConcurrentHashMap<>(); + private final List> children = new CopyOnWriteArrayList<>(); + + protected final Class type; + + protected EventNodeImpl(Class type) { + this.type = type; + } + + protected boolean condition(@NotNull T event) { + return true; + } + + @Override + public void call(@NotNull T event) { + if (!type.isAssignableFrom(event.getClass())) { + // Invalid event type + return; + } + if (!condition(event)) { + // Cancelled by superclass + return; + } + final var listeners = listenerMap.get(event.getClass()); + if (listeners != null && !listeners.isEmpty()) { + listeners.forEach(listener -> { + final EventListener.Result result = listener.executor.apply(event); + if (result == EventListener.Result.EXPIRED) { + listeners.remove(listener); + } + }); + } + this.children.forEach(eventNode -> eventNode.call(event)); + } + + @Override + public void addChild(@NotNull EventNode child) { + this.children.add((EventNode) child); + } + + @Override + public void addListener(@NotNull EventListener listener) { + this.listenerMap.computeIfAbsent(listener.type, aClass -> new CopyOnWriteArrayList<>()) + .add((EventListener) listener); + } + + @Override + public @NotNull String getName() { + return name; + } + + @Override + public @NotNull List<@NotNull EventNode> getChildren() { + return Collections.unmodifiableList(children); + } +} diff --git a/src/main/java/net/minestom/server/event/EventNodeMap.java b/src/main/java/net/minestom/server/event/EventNodeMap.java index 4ca91c3d2..31881a816 100644 --- a/src/main/java/net/minestom/server/event/EventNodeMap.java +++ b/src/main/java/net/minestom/server/event/EventNodeMap.java @@ -7,7 +7,7 @@ import java.util.List; import java.util.concurrent.CopyOnWriteArrayList; import java.util.function.Function; -public class EventNodeMap extends EventNode { +public class EventNodeMap extends EventNodeImpl { private final Function handlerGetter; From f6fe41cfe997d9098b900baba53dcd6e023c47a6 Mon Sep 17 00:00:00 2001 From: TheMode Date: Wed, 2 Jun 2021 19:28:02 +0200 Subject: [PATCH 026/104] Return proper type --- .../java/net/minestom/server/event/EventNode.java | 12 ++++++------ .../event/{EventNodeMap.java => EventNodeList.java} | 4 ++-- 2 files changed, 8 insertions(+), 8 deletions(-) rename src/main/java/net/minestom/server/event/{EventNodeMap.java => EventNodeList.java} (82%) diff --git a/src/main/java/net/minestom/server/event/EventNode.java b/src/main/java/net/minestom/server/event/EventNode.java index fd59584ee..5f2c3c781 100644 --- a/src/main/java/net/minestom/server/event/EventNode.java +++ b/src/main/java/net/minestom/server/event/EventNode.java @@ -18,15 +18,15 @@ public interface EventNode { return create(Event.class); } - static EventNode conditional(@NotNull Class type, - @NotNull Predicate predicate) { + static EventNodeConditional conditional(@NotNull Class type, + @NotNull Predicate predicate) { return new EventNodeConditional<>(type, predicate); } - static EventNode map(@NotNull Class eventType, - @NotNull Class handlerType, - @NotNull Function handlerGetter) { - return new EventNodeMap<>(eventType, handlerGetter); + static EventNodeList list(@NotNull Class eventType, + @NotNull Class handlerType, + @NotNull Function handlerGetter) { + return new EventNodeList<>(eventType, handlerGetter); } void call(@NotNull T event); diff --git a/src/main/java/net/minestom/server/event/EventNodeMap.java b/src/main/java/net/minestom/server/event/EventNodeList.java similarity index 82% rename from src/main/java/net/minestom/server/event/EventNodeMap.java rename to src/main/java/net/minestom/server/event/EventNodeList.java index 31881a816..55d39f283 100644 --- a/src/main/java/net/minestom/server/event/EventNodeMap.java +++ b/src/main/java/net/minestom/server/event/EventNodeList.java @@ -7,13 +7,13 @@ import java.util.List; import java.util.concurrent.CopyOnWriteArrayList; import java.util.function.Function; -public class EventNodeMap extends EventNodeImpl { +public class EventNodeList extends EventNodeImpl { private final Function handlerGetter; private final List entries = new CopyOnWriteArrayList<>(); - protected EventNodeMap(Class eventType, Function handlerGetter) { + protected EventNodeList(Class eventType, Function handlerGetter) { super(eventType); this.handlerGetter = handlerGetter; } From 8fa4c22d1fa76a9c457a1203f03b19316cff626c Mon Sep 17 00:00:00 2001 From: TheMode Date: Wed, 2 Jun 2021 19:44:44 +0200 Subject: [PATCH 027/104] Rename EventNode#create methods --- src/main/java/net/minestom/server/event/EventNode.java | 6 +++--- src/test/java/demo/PlayerInit.java | 9 +++++++-- 2 files changed, 10 insertions(+), 5 deletions(-) diff --git a/src/main/java/net/minestom/server/event/EventNode.java b/src/main/java/net/minestom/server/event/EventNode.java index 5f2c3c781..d02464009 100644 --- a/src/main/java/net/minestom/server/event/EventNode.java +++ b/src/main/java/net/minestom/server/event/EventNode.java @@ -10,12 +10,12 @@ import java.util.function.Predicate; public interface EventNode { - static EventNode create(@NotNull Class type) { + static EventNode type(@NotNull Class type) { return new EventNodeImpl<>(type); } - static EventNode create() { - return create(Event.class); + static EventNode all() { + return type(Event.class); } static EventNodeConditional conditional(@NotNull Class type, diff --git a/src/test/java/demo/PlayerInit.java b/src/test/java/demo/PlayerInit.java index 0a763acbf..012964aca 100644 --- a/src/test/java/demo/PlayerInit.java +++ b/src/test/java/demo/PlayerInit.java @@ -137,16 +137,21 @@ public class PlayerInit { // EVENT REGISTERING - var node = EventNode.create(PlayerEvent.class); + var node = EventNode.type(PlayerEvent.class); node.addListener(EventListener.of(PlayerTickEvent.class) .handler(playerTickEvent -> System.out.println("Player tick!")) .expirationCount(2) .build()); - var empty = EventNode.create(); + var empty = EventNode.all(); empty.addListener(PlayerMoveEvent.class, (event) -> { }); + var map = EventNode.list(PlayerEvent.class, Player.class, PlayerEvent::getPlayer); + map.addListener(PlayerMoveEvent.class, playerMoveEvent -> { + System.out.println("move"); + }); + GlobalEventHandler globalEventHandler = MinecraftServer.getGlobalEventHandler(); globalEventHandler.addEventCallback(EntityAttackEvent.class, event -> { final Entity source = event.getEntity(); From 11bdcdf92acaadeb179c5ebd4aff7f89bafb4b52 Mon Sep 17 00:00:00 2001 From: TheMode Date: Wed, 2 Jun 2021 19:50:23 +0200 Subject: [PATCH 028/104] Add EventNode#removeListener --- src/main/java/net/minestom/server/event/EventNode.java | 2 ++ .../java/net/minestom/server/event/EventNodeImpl.java | 8 ++++++++ 2 files changed, 10 insertions(+) diff --git a/src/main/java/net/minestom/server/event/EventNode.java b/src/main/java/net/minestom/server/event/EventNode.java index d02464009..615879052 100644 --- a/src/main/java/net/minestom/server/event/EventNode.java +++ b/src/main/java/net/minestom/server/event/EventNode.java @@ -35,6 +35,8 @@ public interface EventNode { void addListener(@NotNull EventListener listener); + void removeListener(@NotNull EventListener listener); + default void addListener(@NotNull Class eventClass, @NotNull Consumer<@NotNull E> listener) { addListener(EventListener.of(eventClass).handler(listener).build()); } diff --git a/src/main/java/net/minestom/server/event/EventNodeImpl.java b/src/main/java/net/minestom/server/event/EventNodeImpl.java index 2e0add8b8..0c9b5dc16 100644 --- a/src/main/java/net/minestom/server/event/EventNodeImpl.java +++ b/src/main/java/net/minestom/server/event/EventNodeImpl.java @@ -58,6 +58,14 @@ class EventNodeImpl implements EventNode { .add((EventListener) listener); } + @Override + public void removeListener(@NotNull EventListener listener) { + var listeners = listenerMap.get(listener.type); + if (listeners == null || listeners.isEmpty()) + return; + listeners.remove(listener); + } + @Override public @NotNull String getName() { return name; From aa5a182788eea3e556f77097643d37458a2f8e86 Mon Sep 17 00:00:00 2001 From: TheMode Date: Wed, 2 Jun 2021 19:52:05 +0200 Subject: [PATCH 029/104] Add EventNode#removeChild --- src/main/java/net/minestom/server/event/EventNode.java | 2 ++ src/main/java/net/minestom/server/event/EventNodeImpl.java | 5 +++++ 2 files changed, 7 insertions(+) diff --git a/src/main/java/net/minestom/server/event/EventNode.java b/src/main/java/net/minestom/server/event/EventNode.java index 615879052..21ce0f70e 100644 --- a/src/main/java/net/minestom/server/event/EventNode.java +++ b/src/main/java/net/minestom/server/event/EventNode.java @@ -33,6 +33,8 @@ public interface EventNode { void addChild(@NotNull EventNode child); + void removeChild(@NotNull EventNode child); + void addListener(@NotNull EventListener listener); void removeListener(@NotNull EventListener listener); diff --git a/src/main/java/net/minestom/server/event/EventNodeImpl.java b/src/main/java/net/minestom/server/event/EventNodeImpl.java index 0c9b5dc16..cc23dd219 100644 --- a/src/main/java/net/minestom/server/event/EventNodeImpl.java +++ b/src/main/java/net/minestom/server/event/EventNodeImpl.java @@ -52,6 +52,11 @@ class EventNodeImpl implements EventNode { this.children.add((EventNode) child); } + @Override + public void removeChild(@NotNull EventNode child) { + this.children.remove(child); + } + @Override public void addListener(@NotNull EventListener listener) { this.listenerMap.computeIfAbsent(listener.type, aClass -> new CopyOnWriteArrayList<>()) From 7aee71719675000789b9b9775e77412590dd5010 Mon Sep 17 00:00:00 2001 From: TheMode Date: Wed, 2 Jun 2021 20:23:50 +0200 Subject: [PATCH 030/104] Add EventFilter --- .../server/event/CancellableEvent.java | 3 +- .../minestom/server/event/EventFilter.java | 52 +++++++++++++++++++ .../minestom/server/event/EventListener.java | 7 ++- .../net/minestom/server/event/EventNode.java | 18 +++++-- .../minestom/server/event/EventNodeList.java | 11 ++-- src/test/java/demo/PlayerInit.java | 5 +- 6 files changed, 82 insertions(+), 14 deletions(-) create mode 100644 src/main/java/net/minestom/server/event/EventFilter.java diff --git a/src/main/java/net/minestom/server/event/CancellableEvent.java b/src/main/java/net/minestom/server/event/CancellableEvent.java index 8ae37b32b..ef821f834 100644 --- a/src/main/java/net/minestom/server/event/CancellableEvent.java +++ b/src/main/java/net/minestom/server/event/CancellableEvent.java @@ -3,7 +3,7 @@ package net.minestom.server.event; /** * Represents an {@link Event} which can be cancelled. */ -public interface CancellableEvent extends Event{ +public interface CancellableEvent extends Event { /** * Gets if the {@link Event} should be cancelled or not. @@ -18,5 +18,4 @@ public interface CancellableEvent extends Event{ * @param cancel true if the event should be cancelled, false otherwise */ void setCancelled(boolean cancel); - } diff --git a/src/main/java/net/minestom/server/event/EventFilter.java b/src/main/java/net/minestom/server/event/EventFilter.java new file mode 100644 index 000000000..d3a9577b7 --- /dev/null +++ b/src/main/java/net/minestom/server/event/EventFilter.java @@ -0,0 +1,52 @@ +package net.minestom.server.event; + +import net.minestom.server.entity.Entity; +import net.minestom.server.entity.Player; +import net.minestom.server.event.handler.EventHandler; +import net.minestom.server.event.trait.EntityEvent; +import net.minestom.server.event.trait.PlayerEvent; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; + +import java.util.function.Function; + +public interface EventFilter { + + EventFilter ALL = from(Event.class); + EventFilter ENTITY = from(EntityEvent.class, Entity.class, EntityEvent::getEntity); + EventFilter PLAYER = from(PlayerEvent.class, Player.class, PlayerEvent::getPlayer); + + static EventFilter from(@NotNull Class eventType, + @NotNull Class handlerType, + @NotNull Function handlerGetter) { + return new EventFilter<>() { + @Override + public @Nullable H getHandler(@NotNull E event) { + return handlerGetter.apply(event); + } + + @Override + public @NotNull Class getEventType() { + return eventType; + } + }; + } + + static EventFilter from(@NotNull Class type) { + return new EventFilter<>() { + @Override + public @Nullable H getHandler(@NotNull E event) { + return null; + } + + @Override + public @NotNull Class getEventType() { + return type; + } + }; + } + + @Nullable H getHandler(@NotNull E event); + + @NotNull Class getEventType(); +} diff --git a/src/main/java/net/minestom/server/event/EventListener.java b/src/main/java/net/minestom/server/event/EventListener.java index b960d788e..56beca997 100644 --- a/src/main/java/net/minestom/server/event/EventListener.java +++ b/src/main/java/net/minestom/server/event/EventListener.java @@ -28,7 +28,7 @@ public class EventListener { private final Class eventType; - private List> filters = new ArrayList<>(); + private final List> filters = new ArrayList<>(); private int expirationCount; private UpdateOption expirationTime; private Consumer handler; @@ -47,6 +47,11 @@ public class EventListener { return this; } + public EventListener.Builder expirationTime(UpdateOption expirationTime) { + this.expirationTime = expirationTime; + return this; + } + public EventListener.Builder handler(Consumer handler) { this.handler = handler; return this; diff --git a/src/main/java/net/minestom/server/event/EventNode.java b/src/main/java/net/minestom/server/event/EventNode.java index 21ce0f70e..9a6aae551 100644 --- a/src/main/java/net/minestom/server/event/EventNode.java +++ b/src/main/java/net/minestom/server/event/EventNode.java @@ -10,12 +10,16 @@ import java.util.function.Predicate; public interface EventNode { + static EventNode type(@NotNull EventFilter filter) { + return new EventNodeImpl<>(filter.getEventType()); + } + static EventNode type(@NotNull Class type) { - return new EventNodeImpl<>(type); + return type(EventFilter.from(type)); } static EventNode all() { - return type(Event.class); + return type(EventFilter.ALL); } static EventNodeConditional conditional(@NotNull Class type, @@ -23,10 +27,18 @@ public interface EventNode { return new EventNodeConditional<>(type, predicate); } + static EventNodeList list(@NotNull EventFilter filter) { + return new EventNodeList<>(filter); + } + + static EventNodeList list(@NotNull Class eventType, EventFilter parser) { + return (EventNodeList) list(parser); + } + static EventNodeList list(@NotNull Class eventType, @NotNull Class handlerType, @NotNull Function handlerGetter) { - return new EventNodeList<>(eventType, handlerGetter); + return list(EventFilter.from(eventType, handlerType, handlerGetter)); } void call(@NotNull T event); diff --git a/src/main/java/net/minestom/server/event/EventNodeList.java b/src/main/java/net/minestom/server/event/EventNodeList.java index 55d39f283..680585630 100644 --- a/src/main/java/net/minestom/server/event/EventNodeList.java +++ b/src/main/java/net/minestom/server/event/EventNodeList.java @@ -5,22 +5,21 @@ import org.jetbrains.annotations.NotNull; import java.util.List; import java.util.concurrent.CopyOnWriteArrayList; -import java.util.function.Function; public class EventNodeList extends EventNodeImpl { - private final Function handlerGetter; + private final EventFilter filter; private final List entries = new CopyOnWriteArrayList<>(); - protected EventNodeList(Class eventType, Function handlerGetter) { - super(eventType); - this.handlerGetter = handlerGetter; + protected EventNodeList(EventFilter filter) { + super(filter.getEventType()); + this.filter = filter; } @Override protected boolean condition(@NotNull T event) { - final var eventHandler = handlerGetter.apply(event); + final var eventHandler = filter.getHandler(event); return entries.contains(eventHandler); } diff --git a/src/test/java/demo/PlayerInit.java b/src/test/java/demo/PlayerInit.java index 012964aca..b6efcbd57 100644 --- a/src/test/java/demo/PlayerInit.java +++ b/src/test/java/demo/PlayerInit.java @@ -11,6 +11,7 @@ import net.minestom.server.entity.GameMode; import net.minestom.server.entity.ItemEntity; import net.minestom.server.entity.Player; import net.minestom.server.entity.damage.DamageType; +import net.minestom.server.event.EventFilter; import net.minestom.server.event.EventListener; import net.minestom.server.event.EventNode; import net.minestom.server.event.GlobalEventHandler; @@ -147,8 +148,8 @@ public class PlayerInit { empty.addListener(PlayerMoveEvent.class, (event) -> { }); - var map = EventNode.list(PlayerEvent.class, Player.class, PlayerEvent::getPlayer); - map.addListener(PlayerMoveEvent.class, playerMoveEvent -> { + var list = EventNode.list(EventFilter.PLAYER); + list.addListener(PlayerMoveEvent.class, playerMoveEvent -> { System.out.println("move"); }); From e670a0a40d5a70eafcfaed322548297d0360d8b9 Mon Sep 17 00:00:00 2001 From: TheMode Date: Wed, 2 Jun 2021 20:25:37 +0200 Subject: [PATCH 031/104] Remove unnecessary method --- src/main/java/net/minestom/server/event/EventNode.java | 4 ---- 1 file changed, 4 deletions(-) diff --git a/src/main/java/net/minestom/server/event/EventNode.java b/src/main/java/net/minestom/server/event/EventNode.java index 9a6aae551..5dc9a3ee4 100644 --- a/src/main/java/net/minestom/server/event/EventNode.java +++ b/src/main/java/net/minestom/server/event/EventNode.java @@ -31,10 +31,6 @@ public interface EventNode { return new EventNodeList<>(filter); } - static EventNodeList list(@NotNull Class eventType, EventFilter parser) { - return (EventNodeList) list(parser); - } - static EventNodeList list(@NotNull Class eventType, @NotNull Class handlerType, @NotNull Function handlerGetter) { From 15ae5fd3c1ab5ccd19a8d2c3c72f578ff1f983b0 Mon Sep 17 00:00:00 2001 From: TheMode Date: Wed, 2 Jun 2021 20:33:35 +0200 Subject: [PATCH 032/104] Force the use of EventFilter --- .../net/minestom/server/event/EventNode.java | 21 +++++-------------- .../server/event/EventNodeConditional.java | 7 ++++--- .../minestom/server/event/EventNodeImpl.java | 11 +++++----- .../minestom/server/event/EventNodeList.java | 7 ++----- src/test/java/demo/PlayerInit.java | 3 +-- 5 files changed, 18 insertions(+), 31 deletions(-) diff --git a/src/main/java/net/minestom/server/event/EventNode.java b/src/main/java/net/minestom/server/event/EventNode.java index 5dc9a3ee4..d753dc53e 100644 --- a/src/main/java/net/minestom/server/event/EventNode.java +++ b/src/main/java/net/minestom/server/event/EventNode.java @@ -5,38 +5,27 @@ import org.jetbrains.annotations.NotNull; import java.util.List; import java.util.function.Consumer; -import java.util.function.Function; import java.util.function.Predicate; public interface EventNode { - static EventNode type(@NotNull EventFilter filter) { - return new EventNodeImpl<>(filter.getEventType()); - } - - static EventNode type(@NotNull Class type) { - return type(EventFilter.from(type)); + static EventNode type(@NotNull EventFilter filter) { + return new EventNodeImpl<>(filter); } static EventNode all() { return type(EventFilter.ALL); } - static EventNodeConditional conditional(@NotNull Class type, - @NotNull Predicate predicate) { - return new EventNodeConditional<>(type, predicate); + static EventNodeConditional conditional(@NotNull EventFilter filter, + @NotNull Predicate predicate) { + return new EventNodeConditional<>(filter, predicate); } static EventNodeList list(@NotNull EventFilter filter) { return new EventNodeList<>(filter); } - static EventNodeList list(@NotNull Class eventType, - @NotNull Class handlerType, - @NotNull Function handlerGetter) { - return list(EventFilter.from(eventType, handlerType, handlerGetter)); - } - void call(@NotNull T event); void addChild(@NotNull EventNode child); diff --git a/src/main/java/net/minestom/server/event/EventNodeConditional.java b/src/main/java/net/minestom/server/event/EventNodeConditional.java index 7ba2948e4..3f8676978 100644 --- a/src/main/java/net/minestom/server/event/EventNodeConditional.java +++ b/src/main/java/net/minestom/server/event/EventNodeConditional.java @@ -1,15 +1,16 @@ package net.minestom.server.event; +import net.minestom.server.event.handler.EventHandler; import org.jetbrains.annotations.NotNull; import java.util.function.Predicate; -public class EventNodeConditional extends EventNodeImpl { +public class EventNodeConditional extends EventNodeImpl { private volatile Predicate predicate; - protected EventNodeConditional(Class type, Predicate predicate) { - super(type); + protected EventNodeConditional(EventFilter filter, Predicate predicate) { + super(filter); this.predicate = predicate; } diff --git a/src/main/java/net/minestom/server/event/EventNodeImpl.java b/src/main/java/net/minestom/server/event/EventNodeImpl.java index cc23dd219..72811af1f 100644 --- a/src/main/java/net/minestom/server/event/EventNodeImpl.java +++ b/src/main/java/net/minestom/server/event/EventNodeImpl.java @@ -1,5 +1,6 @@ package net.minestom.server.event; +import net.minestom.server.event.handler.EventHandler; import org.jetbrains.annotations.NotNull; import java.util.Collections; @@ -8,17 +9,17 @@ import java.util.Map; import java.util.concurrent.ConcurrentHashMap; import java.util.concurrent.CopyOnWriteArrayList; -class EventNodeImpl implements EventNode { +class EventNodeImpl implements EventNode { private final String name = "debug"; private final Map, List>> listenerMap = new ConcurrentHashMap<>(); private final List> children = new CopyOnWriteArrayList<>(); - protected final Class type; + protected final EventFilter filter; - protected EventNodeImpl(Class type) { - this.type = type; + protected EventNodeImpl(EventFilter filter) { + this.filter = filter; } protected boolean condition(@NotNull T event) { @@ -27,7 +28,7 @@ class EventNodeImpl implements EventNode { @Override public void call(@NotNull T event) { - if (!type.isAssignableFrom(event.getClass())) { + if (!filter.getEventType().isAssignableFrom(event.getClass())) { // Invalid event type return; } diff --git a/src/main/java/net/minestom/server/event/EventNodeList.java b/src/main/java/net/minestom/server/event/EventNodeList.java index 680585630..b7e383509 100644 --- a/src/main/java/net/minestom/server/event/EventNodeList.java +++ b/src/main/java/net/minestom/server/event/EventNodeList.java @@ -6,15 +6,12 @@ import org.jetbrains.annotations.NotNull; import java.util.List; import java.util.concurrent.CopyOnWriteArrayList; -public class EventNodeList extends EventNodeImpl { - - private final EventFilter filter; +public class EventNodeList extends EventNodeImpl { private final List entries = new CopyOnWriteArrayList<>(); protected EventNodeList(EventFilter filter) { - super(filter.getEventType()); - this.filter = filter; + super(filter); } @Override diff --git a/src/test/java/demo/PlayerInit.java b/src/test/java/demo/PlayerInit.java index b6efcbd57..0b2800a9b 100644 --- a/src/test/java/demo/PlayerInit.java +++ b/src/test/java/demo/PlayerInit.java @@ -19,7 +19,6 @@ import net.minestom.server.event.entity.EntityAttackEvent; import net.minestom.server.event.item.ItemDropEvent; import net.minestom.server.event.item.PickupItemEvent; import net.minestom.server.event.player.*; -import net.minestom.server.event.trait.PlayerEvent; import net.minestom.server.instance.Chunk; import net.minestom.server.instance.Instance; import net.minestom.server.instance.InstanceContainer; @@ -138,7 +137,7 @@ public class PlayerInit { // EVENT REGISTERING - var node = EventNode.type(PlayerEvent.class); + var node = EventNode.type(EventFilter.PLAYER); node.addListener(EventListener.of(PlayerTickEvent.class) .handler(playerTickEvent -> System.out.println("Player tick!")) .expirationCount(2) From ee99c9450910742439f702239c158b72c79d4e26 Mon Sep 17 00:00:00 2001 From: TheMode Date: Wed, 2 Jun 2021 20:53:02 +0200 Subject: [PATCH 033/104] Remove unnecessary generic --- src/main/java/net/minestom/server/event/EventNode.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/net/minestom/server/event/EventNode.java b/src/main/java/net/minestom/server/event/EventNode.java index d753dc53e..8fd69009c 100644 --- a/src/main/java/net/minestom/server/event/EventNode.java +++ b/src/main/java/net/minestom/server/event/EventNode.java @@ -9,7 +9,7 @@ import java.util.function.Predicate; public interface EventNode { - static EventNode type(@NotNull EventFilter filter) { + static EventNode type(@NotNull EventFilter filter) { return new EventNodeImpl<>(filter); } From c95c8430b67c2a8a65e7a66206ad3d0427b1dcae Mon Sep 17 00:00:00 2001 From: TheMode Date: Wed, 2 Jun 2021 20:56:47 +0200 Subject: [PATCH 034/104] Force the use of EventListener --- .../java/net/minestom/server/event/EventListener.java | 6 +++++- src/main/java/net/minestom/server/event/EventNode.java | 5 ----- src/test/java/demo/PlayerInit.java | 10 +++++----- 3 files changed, 10 insertions(+), 11 deletions(-) diff --git a/src/main/java/net/minestom/server/event/EventListener.java b/src/main/java/net/minestom/server/event/EventListener.java index 56beca997..550cd79e2 100644 --- a/src/main/java/net/minestom/server/event/EventListener.java +++ b/src/main/java/net/minestom/server/event/EventListener.java @@ -20,10 +20,14 @@ public class EventListener { this.executor = executor; } - public static EventListener.Builder of(@NotNull Class eventType) { + public static EventListener.Builder builder(@NotNull Class eventType) { return new EventListener.Builder<>(eventType); } + public static EventListener of(@NotNull Class eventType, @NotNull Consumer<@NotNull T> listener) { + return EventListener.builder(eventType).handler(listener).build(); + } + public static class Builder { private final Class eventType; diff --git a/src/main/java/net/minestom/server/event/EventNode.java b/src/main/java/net/minestom/server/event/EventNode.java index 8fd69009c..d7dc8dcbc 100644 --- a/src/main/java/net/minestom/server/event/EventNode.java +++ b/src/main/java/net/minestom/server/event/EventNode.java @@ -4,7 +4,6 @@ import net.minestom.server.event.handler.EventHandler; import org.jetbrains.annotations.NotNull; import java.util.List; -import java.util.function.Consumer; import java.util.function.Predicate; public interface EventNode { @@ -36,10 +35,6 @@ public interface EventNode { void removeListener(@NotNull EventListener listener); - default void addListener(@NotNull Class eventClass, @NotNull Consumer<@NotNull E> listener) { - addListener(EventListener.of(eventClass).handler(listener).build()); - } - @NotNull String getName(); @NotNull List<@NotNull EventNode> getChildren(); diff --git a/src/test/java/demo/PlayerInit.java b/src/test/java/demo/PlayerInit.java index 0b2800a9b..125858c99 100644 --- a/src/test/java/demo/PlayerInit.java +++ b/src/test/java/demo/PlayerInit.java @@ -138,19 +138,19 @@ public class PlayerInit { // EVENT REGISTERING var node = EventNode.type(EventFilter.PLAYER); - node.addListener(EventListener.of(PlayerTickEvent.class) + node.addListener(EventListener.builder(PlayerTickEvent.class) .handler(playerTickEvent -> System.out.println("Player tick!")) .expirationCount(2) .build()); var empty = EventNode.all(); - empty.addListener(PlayerMoveEvent.class, (event) -> { - }); + empty.addListener(EventListener.of(PlayerMoveEvent.class, (event) -> { + })); var list = EventNode.list(EventFilter.PLAYER); - list.addListener(PlayerMoveEvent.class, playerMoveEvent -> { + list.addListener(EventListener.of(PlayerMoveEvent.class, playerMoveEvent -> { System.out.println("move"); - }); + })); GlobalEventHandler globalEventHandler = MinecraftServer.getGlobalEventHandler(); globalEventHandler.addEventCallback(EntityAttackEvent.class, event -> { From 4f127b2e0ed0fcb80a0fe93b2140df41d2eba9c4 Mon Sep 17 00:00:00 2001 From: TheMode Date: Wed, 2 Jun 2021 21:08:10 +0200 Subject: [PATCH 035/104] Separate conditional event from conditional handler --- .../java/net/minestom/server/event/EventNode.java | 13 ++++++++++++- .../minestom/server/event/EventNodeConditional.java | 12 ++++++------ .../net/minestom/server/event/EventNodeImpl.java | 6 ++++++ src/test/java/demo/PlayerInit.java | 9 ++++++--- 4 files changed, 30 insertions(+), 10 deletions(-) diff --git a/src/main/java/net/minestom/server/event/EventNode.java b/src/main/java/net/minestom/server/event/EventNode.java index d7dc8dcbc..67d6358b1 100644 --- a/src/main/java/net/minestom/server/event/EventNode.java +++ b/src/main/java/net/minestom/server/event/EventNode.java @@ -4,6 +4,7 @@ import net.minestom.server.event.handler.EventHandler; import org.jetbrains.annotations.NotNull; import java.util.List; +import java.util.function.BiPredicate; import java.util.function.Predicate; public interface EventNode { @@ -17,10 +18,20 @@ public interface EventNode { } static EventNodeConditional conditional(@NotNull EventFilter filter, - @NotNull Predicate predicate) { + @NotNull BiPredicate predicate) { return new EventNodeConditional<>(filter, predicate); } + static EventNodeConditional conditionalEvent(@NotNull EventFilter filter, + @NotNull Predicate predicate) { + return conditional(filter, (e, h) -> predicate.test(e)); + } + + static EventNodeConditional conditionalHandler(@NotNull EventFilter filter, + @NotNull Predicate predicate) { + return conditional(filter, (e, h) -> predicate.test(h)); + } + static EventNodeList list(@NotNull EventFilter filter) { return new EventNodeList<>(filter); } diff --git a/src/main/java/net/minestom/server/event/EventNodeConditional.java b/src/main/java/net/minestom/server/event/EventNodeConditional.java index 3f8676978..308a0a4a1 100644 --- a/src/main/java/net/minestom/server/event/EventNodeConditional.java +++ b/src/main/java/net/minestom/server/event/EventNodeConditional.java @@ -3,27 +3,27 @@ package net.minestom.server.event; import net.minestom.server.event.handler.EventHandler; import org.jetbrains.annotations.NotNull; -import java.util.function.Predicate; +import java.util.function.BiPredicate; public class EventNodeConditional extends EventNodeImpl { - private volatile Predicate predicate; + private volatile BiPredicate predicate; - protected EventNodeConditional(EventFilter filter, Predicate predicate) { + protected EventNodeConditional(EventFilter filter, BiPredicate predicate) { super(filter); this.predicate = predicate; } @Override protected boolean condition(@NotNull T event) { - return predicate.test(event); + return predicate.test(event, filter.getHandler(event)); } - public @NotNull Predicate<@NotNull T> getPredicate() { + public @NotNull BiPredicate getPredicate() { return predicate; } - public void setPredicate(@NotNull Predicate<@NotNull T> predicate) { + public void setPredicate(@NotNull BiPredicate predicate) { this.predicate = predicate; } } diff --git a/src/main/java/net/minestom/server/event/EventNodeImpl.java b/src/main/java/net/minestom/server/event/EventNodeImpl.java index 72811af1f..e6b25b983 100644 --- a/src/main/java/net/minestom/server/event/EventNodeImpl.java +++ b/src/main/java/net/minestom/server/event/EventNodeImpl.java @@ -22,6 +22,12 @@ class EventNodeImpl implements EventNod this.filter = filter; } + /** + * Condition to enter the node. + * + * @param event the called event + * @return true to enter the node, false otherwise + */ protected boolean condition(@NotNull T event) { return true; } diff --git a/src/test/java/demo/PlayerInit.java b/src/test/java/demo/PlayerInit.java index 125858c99..589624ef0 100644 --- a/src/test/java/demo/PlayerInit.java +++ b/src/test/java/demo/PlayerInit.java @@ -147,11 +147,14 @@ public class PlayerInit { empty.addListener(EventListener.of(PlayerMoveEvent.class, (event) -> { })); - var list = EventNode.list(EventFilter.PLAYER); - list.addListener(EventListener.of(PlayerMoveEvent.class, playerMoveEvent -> { - System.out.println("move"); + var conditional = EventNode.conditionalHandler(EventFilter.PLAYER, Player::isCreative); + conditional.addListener(EventListener.of(PlayerMoveEvent.class, (event) -> { + System.out.println("creative player moved"); })); + var list = EventNode.list(EventFilter.PLAYER); + list.addListener(EventListener.of(PlayerMoveEvent.class, playerMoveEvent -> System.out.println("move"))); + GlobalEventHandler globalEventHandler = MinecraftServer.getGlobalEventHandler(); globalEventHandler.addEventCallback(EntityAttackEvent.class, event -> { final Entity source = event.getEntity(); From 2977bb7b669c21bcaa68b846ab132362a93858b8 Mon Sep 17 00:00:00 2001 From: TheMode Date: Wed, 2 Jun 2021 21:14:48 +0200 Subject: [PATCH 036/104] Make EventListener an interface --- .../minestom/server/event/EventListener.java | 73 +++++++++++-------- .../minestom/server/event/EventNodeImpl.java | 6 +- 2 files changed, 46 insertions(+), 33 deletions(-) diff --git a/src/main/java/net/minestom/server/event/EventListener.java b/src/main/java/net/minestom/server/event/EventListener.java index 550cd79e2..93497f279 100644 --- a/src/main/java/net/minestom/server/event/EventListener.java +++ b/src/main/java/net/minestom/server/event/EventListener.java @@ -7,28 +7,34 @@ import java.util.ArrayList; import java.util.List; import java.util.concurrent.atomic.AtomicInteger; import java.util.function.Consumer; -import java.util.function.Function; import java.util.function.Predicate; -public class EventListener { +public interface EventListener { - protected final Class type; - protected final Function executor; + @NotNull Class getEventType(); - private EventListener(@NotNull Class type, @NotNull Function executor) { - this.type = type; - this.executor = executor; - } + @NotNull Result run(@NotNull T event); - public static EventListener.Builder builder(@NotNull Class eventType) { + static EventListener.Builder builder(@NotNull Class eventType) { return new EventListener.Builder<>(eventType); } - public static EventListener of(@NotNull Class eventType, @NotNull Consumer<@NotNull T> listener) { - return EventListener.builder(eventType).handler(listener).build(); + static EventListener of(@NotNull Class eventType, @NotNull Consumer<@NotNull T> listener) { + return new EventListener<>() { + @Override + public @NotNull Class getEventType() { + return eventType; + } + + @Override + public @NotNull Result run(@NotNull T event) { + listener.accept(event); + return Result.SUCCESS; + } + }; } - public static class Builder { + class Builder { private final Class eventType; @@ -61,34 +67,41 @@ public class EventListener { return this; } - public EventListener build() { + public @NotNull EventListener build() { AtomicInteger expirationCount = new AtomicInteger(this.expirationCount); final boolean hasExpirationCount = expirationCount.get() > 0; final var filters = new ArrayList<>(this.filters); final var handler = this.handler; - return new EventListener<>(eventType, event -> { - // Filtering - if (!filters.isEmpty()) { - if (filters.stream().anyMatch(filter -> !filter.test(event))) { - // Cancelled - return Result.INVALID; + return new EventListener<>() { + @Override + public @NotNull Class getEventType() { + return eventType; + } + + @Override + public @NotNull Result run(@NotNull T event) { + // Filtering + if (!filters.isEmpty()) { + if (filters.stream().anyMatch(filter -> !filter.test(event))) { + // Cancelled + return Result.INVALID; + } } + // Handler + if (handler != null) { + handler.accept(event); + } + // Expiration check + if (hasExpirationCount && expirationCount.decrementAndGet() == 0) { + return Result.EXPIRED; + } + return Result.SUCCESS; } - // Handler - if (handler != null) { - handler.accept(event); - } - // Expiration check - if (hasExpirationCount && expirationCount.decrementAndGet() == 0) { - return Result.EXPIRED; - } - return Result.SUCCESS; - }); + }; } } - enum Result { SUCCESS, INVALID, diff --git a/src/main/java/net/minestom/server/event/EventNodeImpl.java b/src/main/java/net/minestom/server/event/EventNodeImpl.java index e6b25b983..a50ff0088 100644 --- a/src/main/java/net/minestom/server/event/EventNodeImpl.java +++ b/src/main/java/net/minestom/server/event/EventNodeImpl.java @@ -45,7 +45,7 @@ class EventNodeImpl implements EventNod final var listeners = listenerMap.get(event.getClass()); if (listeners != null && !listeners.isEmpty()) { listeners.forEach(listener -> { - final EventListener.Result result = listener.executor.apply(event); + final EventListener.Result result = listener.run(event); if (result == EventListener.Result.EXPIRED) { listeners.remove(listener); } @@ -66,13 +66,13 @@ class EventNodeImpl implements EventNod @Override public void addListener(@NotNull EventListener listener) { - this.listenerMap.computeIfAbsent(listener.type, aClass -> new CopyOnWriteArrayList<>()) + this.listenerMap.computeIfAbsent(listener.getEventType(), aClass -> new CopyOnWriteArrayList<>()) .add((EventListener) listener); } @Override public void removeListener(@NotNull EventListener listener) { - var listeners = listenerMap.get(listener.type); + var listeners = listenerMap.get(listener.getEventType()); if (listeners == null || listeners.isEmpty()) return; listeners.remove(listener); From 6cbc31b11427c0e83676fc05cc536ed43f338e3d Mon Sep 17 00:00:00 2001 From: TheMode Date: Wed, 2 Jun 2021 21:18:18 +0200 Subject: [PATCH 037/104] Allow filtering on more than just EventHandler --- .../net/minestom/server/event/EventFilter.java | 10 +++++----- .../net/minestom/server/event/EventNode.java | 17 ++++++++--------- .../server/event/EventNodeConditional.java | 3 +-- .../minestom/server/event/EventNodeImpl.java | 3 +-- .../minestom/server/event/EventNodeList.java | 3 +-- 5 files changed, 16 insertions(+), 20 deletions(-) diff --git a/src/main/java/net/minestom/server/event/EventFilter.java b/src/main/java/net/minestom/server/event/EventFilter.java index d3a9577b7..afcc0a167 100644 --- a/src/main/java/net/minestom/server/event/EventFilter.java +++ b/src/main/java/net/minestom/server/event/EventFilter.java @@ -10,15 +10,15 @@ import org.jetbrains.annotations.Nullable; import java.util.function.Function; -public interface EventFilter { +public interface EventFilter { EventFilter ALL = from(Event.class); EventFilter ENTITY = from(EntityEvent.class, Entity.class, EntityEvent::getEntity); EventFilter PLAYER = from(PlayerEvent.class, Player.class, PlayerEvent::getPlayer); - static EventFilter from(@NotNull Class eventType, - @NotNull Class handlerType, - @NotNull Function handlerGetter) { + static EventFilter from(@NotNull Class eventType, + @NotNull Class handlerType, + @NotNull Function handlerGetter) { return new EventFilter<>() { @Override public @Nullable H getHandler(@NotNull E event) { @@ -32,7 +32,7 @@ public interface EventFilter { }; } - static EventFilter from(@NotNull Class type) { + static EventFilter from(@NotNull Class type) { return new EventFilter<>() { @Override public @Nullable H getHandler(@NotNull E event) { diff --git a/src/main/java/net/minestom/server/event/EventNode.java b/src/main/java/net/minestom/server/event/EventNode.java index 67d6358b1..33dfb854e 100644 --- a/src/main/java/net/minestom/server/event/EventNode.java +++ b/src/main/java/net/minestom/server/event/EventNode.java @@ -1,6 +1,5 @@ package net.minestom.server.event; -import net.minestom.server.event.handler.EventHandler; import org.jetbrains.annotations.NotNull; import java.util.List; @@ -9,7 +8,7 @@ import java.util.function.Predicate; public interface EventNode { - static EventNode type(@NotNull EventFilter filter) { + static EventNode type(@NotNull EventFilter filter) { return new EventNodeImpl<>(filter); } @@ -17,22 +16,22 @@ public interface EventNode { return type(EventFilter.ALL); } - static EventNodeConditional conditional(@NotNull EventFilter filter, - @NotNull BiPredicate predicate) { + static EventNodeConditional conditional(@NotNull EventFilter filter, + @NotNull BiPredicate predicate) { return new EventNodeConditional<>(filter, predicate); } - static EventNodeConditional conditionalEvent(@NotNull EventFilter filter, - @NotNull Predicate predicate) { + static EventNodeConditional conditionalEvent(@NotNull EventFilter filter, + @NotNull Predicate predicate) { return conditional(filter, (e, h) -> predicate.test(e)); } - static EventNodeConditional conditionalHandler(@NotNull EventFilter filter, - @NotNull Predicate predicate) { + static EventNodeConditional conditionalHandler(@NotNull EventFilter filter, + @NotNull Predicate predicate) { return conditional(filter, (e, h) -> predicate.test(h)); } - static EventNodeList list(@NotNull EventFilter filter) { + static EventNodeList list(@NotNull EventFilter filter) { return new EventNodeList<>(filter); } diff --git a/src/main/java/net/minestom/server/event/EventNodeConditional.java b/src/main/java/net/minestom/server/event/EventNodeConditional.java index 308a0a4a1..4f0d5d68a 100644 --- a/src/main/java/net/minestom/server/event/EventNodeConditional.java +++ b/src/main/java/net/minestom/server/event/EventNodeConditional.java @@ -1,11 +1,10 @@ package net.minestom.server.event; -import net.minestom.server.event.handler.EventHandler; import org.jetbrains.annotations.NotNull; import java.util.function.BiPredicate; -public class EventNodeConditional extends EventNodeImpl { +public class EventNodeConditional extends EventNodeImpl { private volatile BiPredicate predicate; diff --git a/src/main/java/net/minestom/server/event/EventNodeImpl.java b/src/main/java/net/minestom/server/event/EventNodeImpl.java index a50ff0088..b29c88aca 100644 --- a/src/main/java/net/minestom/server/event/EventNodeImpl.java +++ b/src/main/java/net/minestom/server/event/EventNodeImpl.java @@ -1,6 +1,5 @@ package net.minestom.server.event; -import net.minestom.server.event.handler.EventHandler; import org.jetbrains.annotations.NotNull; import java.util.Collections; @@ -9,7 +8,7 @@ import java.util.Map; import java.util.concurrent.ConcurrentHashMap; import java.util.concurrent.CopyOnWriteArrayList; -class EventNodeImpl implements EventNode { +class EventNodeImpl implements EventNode { private final String name = "debug"; diff --git a/src/main/java/net/minestom/server/event/EventNodeList.java b/src/main/java/net/minestom/server/event/EventNodeList.java index b7e383509..fe482591f 100644 --- a/src/main/java/net/minestom/server/event/EventNodeList.java +++ b/src/main/java/net/minestom/server/event/EventNodeList.java @@ -1,12 +1,11 @@ package net.minestom.server.event; -import net.minestom.server.event.handler.EventHandler; import org.jetbrains.annotations.NotNull; import java.util.List; import java.util.concurrent.CopyOnWriteArrayList; -public class EventNodeList extends EventNodeImpl { +public class EventNodeList extends EventNodeImpl { private final List entries = new CopyOnWriteArrayList<>(); From d58cd3b578bc48e3e811d23b6c2d2c7d660b74da Mon Sep 17 00:00:00 2001 From: TheMode Date: Wed, 2 Jun 2021 22:47:45 +0200 Subject: [PATCH 038/104] Add remaining filters --- src/main/java/net/minestom/server/event/EventFilter.java | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/src/main/java/net/minestom/server/event/EventFilter.java b/src/main/java/net/minestom/server/event/EventFilter.java index afcc0a167..ce26461e9 100644 --- a/src/main/java/net/minestom/server/event/EventFilter.java +++ b/src/main/java/net/minestom/server/event/EventFilter.java @@ -3,8 +3,10 @@ package net.minestom.server.event; import net.minestom.server.entity.Entity; import net.minestom.server.entity.Player; import net.minestom.server.event.handler.EventHandler; -import net.minestom.server.event.trait.EntityEvent; -import net.minestom.server.event.trait.PlayerEvent; +import net.minestom.server.event.trait.*; +import net.minestom.server.instance.Instance; +import net.minestom.server.inventory.Inventory; +import net.minestom.server.item.ItemStack; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; @@ -15,6 +17,9 @@ public interface EventFilter { EventFilter ALL = from(Event.class); EventFilter ENTITY = from(EntityEvent.class, Entity.class, EntityEvent::getEntity); EventFilter PLAYER = from(PlayerEvent.class, Player.class, PlayerEvent::getPlayer); + EventFilter ITEM = from(ItemEvent.class, ItemStack.class, ItemEvent::getItemStack); + EventFilter INSTANCE = from(InstanceEvent.class, Instance.class, InstanceEvent::getInstance); + EventFilter INVENTORY = from(InventoryEvent.class, Inventory.class, InventoryEvent::getInventory); static EventFilter from(@NotNull Class eventType, @NotNull Class handlerType, From b1714641e8f2ae446ac68b8872af1b35ed617b78 Mon Sep 17 00:00:00 2001 From: TheMode Date: Wed, 2 Jun 2021 22:51:11 +0200 Subject: [PATCH 039/104] Use Object for EventFilter#ALL --- src/main/java/net/minestom/server/event/EventFilter.java | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/src/main/java/net/minestom/server/event/EventFilter.java b/src/main/java/net/minestom/server/event/EventFilter.java index ce26461e9..c6f591109 100644 --- a/src/main/java/net/minestom/server/event/EventFilter.java +++ b/src/main/java/net/minestom/server/event/EventFilter.java @@ -2,7 +2,6 @@ package net.minestom.server.event; import net.minestom.server.entity.Entity; import net.minestom.server.entity.Player; -import net.minestom.server.event.handler.EventHandler; import net.minestom.server.event.trait.*; import net.minestom.server.instance.Instance; import net.minestom.server.inventory.Inventory; @@ -14,7 +13,7 @@ import java.util.function.Function; public interface EventFilter { - EventFilter ALL = from(Event.class); + EventFilter ALL = from(Event.class); EventFilter ENTITY = from(EntityEvent.class, Entity.class, EntityEvent::getEntity); EventFilter PLAYER = from(PlayerEvent.class, Player.class, PlayerEvent::getPlayer); EventFilter ITEM = from(ItemEvent.class, ItemStack.class, ItemEvent::getItemStack); From 5b42ce4a522c0e1d6f0e4818742d5a107cb5fe56 Mon Sep 17 00:00:00 2001 From: TheMode Date: Wed, 2 Jun 2021 22:55:24 +0200 Subject: [PATCH 040/104] Reuse EventFilter code --- .../minestom/server/event/EventFilter.java | 20 +++++-------------- 1 file changed, 5 insertions(+), 15 deletions(-) diff --git a/src/main/java/net/minestom/server/event/EventFilter.java b/src/main/java/net/minestom/server/event/EventFilter.java index c6f591109..2ece64c1d 100644 --- a/src/main/java/net/minestom/server/event/EventFilter.java +++ b/src/main/java/net/minestom/server/event/EventFilter.java @@ -13,7 +13,7 @@ import java.util.function.Function; public interface EventFilter { - EventFilter ALL = from(Event.class); + EventFilter ALL = from(Event.class); EventFilter ENTITY = from(EntityEvent.class, Entity.class, EntityEvent::getEntity); EventFilter PLAYER = from(PlayerEvent.class, Player.class, PlayerEvent::getPlayer); EventFilter ITEM = from(ItemEvent.class, ItemStack.class, ItemEvent::getItemStack); @@ -21,12 +21,12 @@ public interface EventFilter { EventFilter INVENTORY = from(InventoryEvent.class, Inventory.class, InventoryEvent::getInventory); static EventFilter from(@NotNull Class eventType, - @NotNull Class handlerType, - @NotNull Function handlerGetter) { + @Nullable Class handlerType, + @Nullable Function handlerGetter) { return new EventFilter<>() { @Override public @Nullable H getHandler(@NotNull E event) { - return handlerGetter.apply(event); + return handlerGetter != null ? handlerGetter.apply(event) : null; } @Override @@ -37,17 +37,7 @@ public interface EventFilter { } static EventFilter from(@NotNull Class type) { - return new EventFilter<>() { - @Override - public @Nullable H getHandler(@NotNull E event) { - return null; - } - - @Override - public @NotNull Class getEventType() { - return type; - } - }; + return from(type, null, null); } @Nullable H getHandler(@NotNull E event); From 1a9bdd93d75d7ab5f155029157d26feb343f5b5f Mon Sep 17 00:00:00 2001 From: TheMode Date: Wed, 2 Jun 2021 22:58:43 +0200 Subject: [PATCH 041/104] Remove unused parameter --- .../java/net/minestom/server/event/EventFilter.java | 13 ++++++------- 1 file changed, 6 insertions(+), 7 deletions(-) diff --git a/src/main/java/net/minestom/server/event/EventFilter.java b/src/main/java/net/minestom/server/event/EventFilter.java index 2ece64c1d..8035e9a29 100644 --- a/src/main/java/net/minestom/server/event/EventFilter.java +++ b/src/main/java/net/minestom/server/event/EventFilter.java @@ -14,14 +14,13 @@ import java.util.function.Function; public interface EventFilter { EventFilter ALL = from(Event.class); - EventFilter ENTITY = from(EntityEvent.class, Entity.class, EntityEvent::getEntity); - EventFilter PLAYER = from(PlayerEvent.class, Player.class, PlayerEvent::getPlayer); - EventFilter ITEM = from(ItemEvent.class, ItemStack.class, ItemEvent::getItemStack); - EventFilter INSTANCE = from(InstanceEvent.class, Instance.class, InstanceEvent::getInstance); - EventFilter INVENTORY = from(InventoryEvent.class, Inventory.class, InventoryEvent::getInventory); + EventFilter ENTITY = from(EntityEvent.class, EntityEvent::getEntity); + EventFilter PLAYER = from(PlayerEvent.class, PlayerEvent::getPlayer); + EventFilter ITEM = from(ItemEvent.class, ItemEvent::getItemStack); + EventFilter INSTANCE = from(InstanceEvent.class, InstanceEvent::getInstance); + EventFilter INVENTORY = from(InventoryEvent.class, InventoryEvent::getInventory); static EventFilter from(@NotNull Class eventType, - @Nullable Class handlerType, @Nullable Function handlerGetter) { return new EventFilter<>() { @Override @@ -37,7 +36,7 @@ public interface EventFilter { } static EventFilter from(@NotNull Class type) { - return from(type, null, null); + return from(type, null); } @Nullable H getHandler(@NotNull E event); From 8f3b52a8b98e65ac1e30f4f4bf0bcabba102a55c Mon Sep 17 00:00:00 2001 From: TheMode Date: Wed, 2 Jun 2021 23:04:35 +0200 Subject: [PATCH 042/104] Inline method --- src/main/java/net/minestom/server/event/EventFilter.java | 6 +----- 1 file changed, 1 insertion(+), 5 deletions(-) diff --git a/src/main/java/net/minestom/server/event/EventFilter.java b/src/main/java/net/minestom/server/event/EventFilter.java index 8035e9a29..3bdda0dea 100644 --- a/src/main/java/net/minestom/server/event/EventFilter.java +++ b/src/main/java/net/minestom/server/event/EventFilter.java @@ -13,7 +13,7 @@ import java.util.function.Function; public interface EventFilter { - EventFilter ALL = from(Event.class); + EventFilter ALL = from(Event.class, null); EventFilter ENTITY = from(EntityEvent.class, EntityEvent::getEntity); EventFilter PLAYER = from(PlayerEvent.class, PlayerEvent::getPlayer); EventFilter ITEM = from(ItemEvent.class, ItemEvent::getItemStack); @@ -35,10 +35,6 @@ public interface EventFilter { }; } - static EventFilter from(@NotNull Class type) { - return from(type, null); - } - @Nullable H getHandler(@NotNull E event); @NotNull Class getEventType(); From f8eb211d0d8b38031ba94760d98a4f2278ea192d Mon Sep 17 00:00:00 2001 From: TheMode Date: Thu, 3 Jun 2021 00:48:37 +0200 Subject: [PATCH 043/104] Add node mapping support, for per-object listeners --- .../net/minestom/server/event/EventNode.java | 4 +++ .../minestom/server/event/EventNodeImpl.java | 27 +++++++++++++++++++ src/test/java/demo/PlayerInit.java | 17 +++++++++--- 3 files changed, 44 insertions(+), 4 deletions(-) diff --git a/src/main/java/net/minestom/server/event/EventNode.java b/src/main/java/net/minestom/server/event/EventNode.java index 33dfb854e..ec57de3eb 100644 --- a/src/main/java/net/minestom/server/event/EventNode.java +++ b/src/main/java/net/minestom/server/event/EventNode.java @@ -45,6 +45,10 @@ public interface EventNode { void removeListener(@NotNull EventListener listener); + void map(@NotNull EventFilter filter, @NotNull V value, @NotNull EventNode node); + + void removeMap(@NotNull Object value); + @NotNull String getName(); @NotNull List<@NotNull EventNode> getChildren(); diff --git a/src/main/java/net/minestom/server/event/EventNodeImpl.java b/src/main/java/net/minestom/server/event/EventNodeImpl.java index b29c88aca..8af952a51 100644 --- a/src/main/java/net/minestom/server/event/EventNodeImpl.java +++ b/src/main/java/net/minestom/server/event/EventNodeImpl.java @@ -13,6 +13,7 @@ class EventNodeImpl implements EventNode { private final String name = "debug"; private final Map, List>> listenerMap = new ConcurrentHashMap<>(); + private final Map> redirectionMap = new ConcurrentHashMap<>(); private final List> children = new CopyOnWriteArrayList<>(); protected final EventFilter filter; @@ -41,6 +42,13 @@ class EventNodeImpl implements EventNode { // Cancelled by superclass return; } + // Process redirection + final H handler = filter.getHandler(event); + final var entry = redirectionMap.get(handler); + if (entry != null) { + entry.node.call(event); + } + // Process listener list final var listeners = listenerMap.get(event.getClass()); if (listeners != null && !listeners.isEmpty()) { listeners.forEach(listener -> { @@ -50,6 +58,7 @@ class EventNodeImpl implements EventNode { } }); } + // Process children this.children.forEach(eventNode -> eventNode.call(event)); } @@ -77,6 +86,19 @@ class EventNodeImpl implements EventNode { listeners.remove(listener); } + @Override + public void map(@NotNull EventFilter filter, @NotNull V value, @NotNull EventNode node) { + RedirectionEntry entry = new RedirectionEntry<>(); + entry.filter = filter; + entry.node = node; + this.redirectionMap.put(value, (RedirectionEntry) entry); + } + + @Override + public void removeMap(@NotNull Object value) { + this.redirectionMap.remove(value); + } + @Override public @NotNull String getName() { return name; @@ -86,4 +108,9 @@ class EventNodeImpl implements EventNode { public @NotNull List<@NotNull EventNode> getChildren() { return Collections.unmodifiableList(children); } + + private static class RedirectionEntry { + EventFilter filter; + EventNode node; + } } diff --git a/src/test/java/demo/PlayerInit.java b/src/test/java/demo/PlayerInit.java index 589624ef0..5b7c11359 100644 --- a/src/test/java/demo/PlayerInit.java +++ b/src/test/java/demo/PlayerInit.java @@ -147,13 +147,22 @@ public class PlayerInit { empty.addListener(EventListener.of(PlayerMoveEvent.class, (event) -> { })); + /* + * Map a node to a single element + * + * var test = EventNode.type(EventFilter.ENTITY); + * test.addListener(EventListener.of(PlayerMoveEvent.class, (event) -> + * System.out.println("creative player moved"))); + * empty.map(EventFilter.ENTITY, entity, test); + */ + var conditional = EventNode.conditionalHandler(EventFilter.PLAYER, Player::isCreative); - conditional.addListener(EventListener.of(PlayerMoveEvent.class, (event) -> { - System.out.println("creative player moved"); - })); + conditional.addListener(EventListener.of(PlayerMoveEvent.class, (event) -> + System.out.println("creative player moved"))); var list = EventNode.list(EventFilter.PLAYER); - list.addListener(EventListener.of(PlayerMoveEvent.class, playerMoveEvent -> System.out.println("move"))); + list.addListener(EventListener.of(PlayerMoveEvent.class, event -> + System.out.println("move"))); GlobalEventHandler globalEventHandler = MinecraftServer.getGlobalEventHandler(); globalEventHandler.addEventCallback(EntityAttackEvent.class, event -> { From 65c303766fc49a98f61541977e57535335361d31 Mon Sep 17 00:00:00 2001 From: TheMode Date: Thu, 3 Jun 2021 03:27:30 +0200 Subject: [PATCH 044/104] Make EventNode a class, fast exist when no children can listen to an event --- .../net/minestom/server/event/EventNode.java | 194 ++++++++++++++++-- .../server/event/EventNodeConditional.java | 4 +- .../minestom/server/event/EventNodeImpl.java | 116 ----------- .../minestom/server/event/EventNodeList.java | 2 +- src/test/java/demo/PlayerInit.java | 10 +- 5 files changed, 183 insertions(+), 143 deletions(-) delete mode 100644 src/main/java/net/minestom/server/event/EventNodeImpl.java diff --git a/src/main/java/net/minestom/server/event/EventNode.java b/src/main/java/net/minestom/server/event/EventNode.java index ec57de3eb..01998b63b 100644 --- a/src/main/java/net/minestom/server/event/EventNode.java +++ b/src/main/java/net/minestom/server/event/EventNode.java @@ -1,55 +1,209 @@ package net.minestom.server.event; +import it.unimi.dsi.fastutil.objects.Object2IntMap; +import it.unimi.dsi.fastutil.objects.Object2IntOpenHashMap; import org.jetbrains.annotations.NotNull; +import java.util.Collections; import java.util.List; +import java.util.Map; +import java.util.Set; +import java.util.concurrent.ConcurrentHashMap; +import java.util.concurrent.CopyOnWriteArrayList; +import java.util.concurrent.CopyOnWriteArraySet; import java.util.function.BiPredicate; import java.util.function.Predicate; -public interface EventNode { +public class EventNode { - static EventNode type(@NotNull EventFilter filter) { - return new EventNodeImpl<>(filter); + public static EventNode type(@NotNull EventFilter filter) { + return new EventNode<>(filter); } - static EventNode all() { + public static EventNode all() { return type(EventFilter.ALL); } - static EventNodeConditional conditional(@NotNull EventFilter filter, - @NotNull BiPredicate predicate) { + public static EventNodeConditional conditional(@NotNull EventFilter filter, + @NotNull BiPredicate predicate) { return new EventNodeConditional<>(filter, predicate); } - static EventNodeConditional conditionalEvent(@NotNull EventFilter filter, - @NotNull Predicate predicate) { + public static EventNodeConditional conditionalEvent(@NotNull EventFilter filter, + @NotNull Predicate predicate) { return conditional(filter, (e, h) -> predicate.test(e)); } - static EventNodeConditional conditionalHandler(@NotNull EventFilter filter, - @NotNull Predicate predicate) { + public static EventNodeConditional conditionalHandler(@NotNull EventFilter filter, + @NotNull Predicate predicate) { return conditional(filter, (e, h) -> predicate.test(h)); } - static EventNodeList list(@NotNull EventFilter filter) { + public static EventNodeList list(@NotNull EventFilter filter) { return new EventNodeList<>(filter); } - void call(@NotNull T event); + private volatile String name = "unknown"; - void addChild(@NotNull EventNode child); + private final Map, List>> listenerMap = new ConcurrentHashMap<>(); + private final Map> redirectionMap = new ConcurrentHashMap<>(); + private final Set> children = new CopyOnWriteArraySet<>(); - void removeChild(@NotNull EventNode child); + protected final EventFilter filter; - void addListener(@NotNull EventListener listener); + // Tree data + private volatile EventNode parent; + private final Object lock = new Object(); + private final Object2IntMap> childEventMap = new Object2IntOpenHashMap<>(); - void removeListener(@NotNull EventListener listener); + protected EventNode(EventFilter filter) { + this.filter = filter; + } - void map(@NotNull EventFilter filter, @NotNull V value, @NotNull EventNode node); + /** + * Condition to enter the node. + * + * @param event the called event + * @return true to enter the node, false otherwise + */ + protected boolean condition(@NotNull T event) { + return true; + } - void removeMap(@NotNull Object value); + public void call(@NotNull T event) { + final var eventClass = event.getClass(); + if (!filter.getEventType().isAssignableFrom(eventClass)) { + // Invalid event type + return; + } + if (!condition(event)) { + // Cancelled by superclass + return; + } + // Process redirection + final Object handler = filter.getHandler(event); + if (handler != null) { + final var entry = redirectionMap.get(handler); + if (entry != null) { + entry.node.call(event); + } + } + // Process listener list + final var listeners = listenerMap.get(eventClass); + if (listeners != null && !listeners.isEmpty()) { + listeners.forEach(listener -> { + final EventListener.Result result = listener.run(event); + if (result == EventListener.Result.EXPIRED) { + listeners.remove(listener); + } + }); + } + // Process children + synchronized (lock) { + final int childCount = childEventMap.getInt(eventClass); + if (childCount < 1) { + // No listener in children + return; + } + } + this.children.forEach(eventNode -> eventNode.call(event)); + } - @NotNull String getName(); + public void addChild(@NotNull EventNode child) { + final boolean result = this.children.add((EventNode) child); + if (result) { + child.parent = this; + // Increase listener count + synchronized (lock) { + child.listenerMap.forEach((eventClass, eventListeners) -> { + final int childCount = eventListeners.size(); + increaseListenerCount(eventClass, childCount); + }); + } + } + } - @NotNull List<@NotNull EventNode> getChildren(); + public void removeChild(@NotNull EventNode child) { + final boolean result = this.children.remove(child); + if (result) { + child.parent = null; + // Decrease listener count + synchronized (lock) { + child.listenerMap.forEach((eventClass, eventListeners) -> { + final int childCount = eventListeners.size(); + decreaseListenerCount(eventClass, childCount); + }); + } + } + } + + public void addListener(@NotNull EventListener listener) { + final var eventType = listener.getEventType(); + this.listenerMap.computeIfAbsent(eventType, aClass -> new CopyOnWriteArrayList<>()) + .add((EventListener) listener); + if (parent != null) { + synchronized (parent.lock) { + parent.increaseListenerCount(eventType, 1); + } + } + } + + public void removeListener(@NotNull EventListener listener) { + final var eventType = listener.getEventType(); + var listeners = listenerMap.get(eventType); + if (listeners == null || listeners.isEmpty()) + return; + final boolean removed = listeners.remove(listener); + if (removed && parent != null) { + synchronized (parent.lock) { + parent.decreaseListenerCount(eventType, 1); + } + } + } + + public void map(@NotNull EventFilter filter, @NotNull V value, @NotNull EventNode node) { + RedirectionEntry entry = new RedirectionEntry<>(); + entry.filter = filter; + entry.node = node; + this.redirectionMap.put(value, (RedirectionEntry) entry); + } + + public void removeMap(@NotNull Object value) { + this.redirectionMap.remove(value); + } + + public @NotNull String getName() { + return name; + } + + public void setName(@NotNull String name) { + this.name = name; + } + + public @NotNull Set<@NotNull EventNode> getChildren() { + return Collections.unmodifiableSet(children); + } + + private void increaseListenerCount(Class eventClass, int count) { + final int current = childEventMap.getInt(eventClass); + final int result = current + count; + this.childEventMap.put(eventClass, result); + } + + private void decreaseListenerCount(Class eventClass, int count) { + final int current = childEventMap.getInt(eventClass); + final int result = current - count; + if (result == 0) { + this.childEventMap.removeInt(eventClass); + } else if (result > 0) { + this.childEventMap.put(eventClass, result); + } else { + throw new IllegalStateException("Something wrong happened, listener count: " + result); + } + } + + private static class RedirectionEntry { + EventFilter filter; + EventNode node; + } } diff --git a/src/main/java/net/minestom/server/event/EventNodeConditional.java b/src/main/java/net/minestom/server/event/EventNodeConditional.java index 4f0d5d68a..447eb2013 100644 --- a/src/main/java/net/minestom/server/event/EventNodeConditional.java +++ b/src/main/java/net/minestom/server/event/EventNodeConditional.java @@ -4,7 +4,7 @@ import org.jetbrains.annotations.NotNull; import java.util.function.BiPredicate; -public class EventNodeConditional extends EventNodeImpl { +public class EventNodeConditional extends EventNode { private volatile BiPredicate predicate; @@ -15,7 +15,7 @@ public class EventNodeConditional extends EventNodeImpl getPredicate() { diff --git a/src/main/java/net/minestom/server/event/EventNodeImpl.java b/src/main/java/net/minestom/server/event/EventNodeImpl.java deleted file mode 100644 index 8af952a51..000000000 --- a/src/main/java/net/minestom/server/event/EventNodeImpl.java +++ /dev/null @@ -1,116 +0,0 @@ -package net.minestom.server.event; - -import org.jetbrains.annotations.NotNull; - -import java.util.Collections; -import java.util.List; -import java.util.Map; -import java.util.concurrent.ConcurrentHashMap; -import java.util.concurrent.CopyOnWriteArrayList; - -class EventNodeImpl implements EventNode { - - private final String name = "debug"; - - private final Map, List>> listenerMap = new ConcurrentHashMap<>(); - private final Map> redirectionMap = new ConcurrentHashMap<>(); - private final List> children = new CopyOnWriteArrayList<>(); - - protected final EventFilter filter; - - protected EventNodeImpl(EventFilter filter) { - this.filter = filter; - } - - /** - * Condition to enter the node. - * - * @param event the called event - * @return true to enter the node, false otherwise - */ - protected boolean condition(@NotNull T event) { - return true; - } - - @Override - public void call(@NotNull T event) { - if (!filter.getEventType().isAssignableFrom(event.getClass())) { - // Invalid event type - return; - } - if (!condition(event)) { - // Cancelled by superclass - return; - } - // Process redirection - final H handler = filter.getHandler(event); - final var entry = redirectionMap.get(handler); - if (entry != null) { - entry.node.call(event); - } - // Process listener list - final var listeners = listenerMap.get(event.getClass()); - if (listeners != null && !listeners.isEmpty()) { - listeners.forEach(listener -> { - final EventListener.Result result = listener.run(event); - if (result == EventListener.Result.EXPIRED) { - listeners.remove(listener); - } - }); - } - // Process children - this.children.forEach(eventNode -> eventNode.call(event)); - } - - @Override - public void addChild(@NotNull EventNode child) { - this.children.add((EventNode) child); - } - - @Override - public void removeChild(@NotNull EventNode child) { - this.children.remove(child); - } - - @Override - public void addListener(@NotNull EventListener listener) { - this.listenerMap.computeIfAbsent(listener.getEventType(), aClass -> new CopyOnWriteArrayList<>()) - .add((EventListener) listener); - } - - @Override - public void removeListener(@NotNull EventListener listener) { - var listeners = listenerMap.get(listener.getEventType()); - if (listeners == null || listeners.isEmpty()) - return; - listeners.remove(listener); - } - - @Override - public void map(@NotNull EventFilter filter, @NotNull V value, @NotNull EventNode node) { - RedirectionEntry entry = new RedirectionEntry<>(); - entry.filter = filter; - entry.node = node; - this.redirectionMap.put(value, (RedirectionEntry) entry); - } - - @Override - public void removeMap(@NotNull Object value) { - this.redirectionMap.remove(value); - } - - @Override - public @NotNull String getName() { - return name; - } - - @Override - public @NotNull List<@NotNull EventNode> getChildren() { - return Collections.unmodifiableList(children); - } - - private static class RedirectionEntry { - EventFilter filter; - EventNode node; - } -} diff --git a/src/main/java/net/minestom/server/event/EventNodeList.java b/src/main/java/net/minestom/server/event/EventNodeList.java index fe482591f..378203976 100644 --- a/src/main/java/net/minestom/server/event/EventNodeList.java +++ b/src/main/java/net/minestom/server/event/EventNodeList.java @@ -5,7 +5,7 @@ import org.jetbrains.annotations.NotNull; import java.util.List; import java.util.concurrent.CopyOnWriteArrayList; -public class EventNodeList extends EventNodeImpl { +public class EventNodeList extends EventNode { private final List entries = new CopyOnWriteArrayList<>(); diff --git a/src/test/java/demo/PlayerInit.java b/src/test/java/demo/PlayerInit.java index 5b7c11359..96f6c9bd6 100644 --- a/src/test/java/demo/PlayerInit.java +++ b/src/test/java/demo/PlayerInit.java @@ -137,16 +137,18 @@ public class PlayerInit { // EVENT REGISTERING + var empty = EventNode.all(); + empty.setName("empty"); + empty.addListener(EventListener.of(PlayerMoveEvent.class, (event) -> { + })); + var node = EventNode.type(EventFilter.PLAYER); + node.setName("node"); node.addListener(EventListener.builder(PlayerTickEvent.class) .handler(playerTickEvent -> System.out.println("Player tick!")) .expirationCount(2) .build()); - var empty = EventNode.all(); - empty.addListener(EventListener.of(PlayerMoveEvent.class, (event) -> { - })); - /* * Map a node to a single element * From 3727f3f9549a37c14de8cf972b05d8e552e3610a Mon Sep 17 00:00:00 2001 From: TheMode Date: Thu, 3 Jun 2021 03:37:41 +0200 Subject: [PATCH 045/104] Use a global lock when modifying tree data --- .../net/minestom/server/event/EventNode.java | 74 +++++++++++-------- 1 file changed, 42 insertions(+), 32 deletions(-) diff --git a/src/main/java/net/minestom/server/event/EventNode.java b/src/main/java/net/minestom/server/event/EventNode.java index 01998b63b..abfa260b9 100644 --- a/src/main/java/net/minestom/server/event/EventNode.java +++ b/src/main/java/net/minestom/server/event/EventNode.java @@ -52,6 +52,8 @@ public class EventNode { protected final EventFilter filter; // Tree data + private static final Object GLOBAL_CHILD_LOCK = new Object(); + private volatile EventNode parent; private final Object lock = new Object(); private final Object2IntMap> childEventMap = new Object2IntOpenHashMap<>(); @@ -110,53 +112,61 @@ public class EventNode { } public void addChild(@NotNull EventNode child) { - final boolean result = this.children.add((EventNode) child); - if (result) { - child.parent = this; - // Increase listener count - synchronized (lock) { - child.listenerMap.forEach((eventClass, eventListeners) -> { - final int childCount = eventListeners.size(); - increaseListenerCount(eventClass, childCount); - }); + synchronized (GLOBAL_CHILD_LOCK) { + final boolean result = this.children.add((EventNode) child); + if (result) { + child.parent = this; + // Increase listener count + synchronized (lock) { + child.listenerMap.forEach((eventClass, eventListeners) -> { + final int childCount = eventListeners.size() + child.childEventMap.getInt(eventClass); + increaseListenerCount(eventClass, childCount); + }); + } } } } public void removeChild(@NotNull EventNode child) { - final boolean result = this.children.remove(child); - if (result) { - child.parent = null; - // Decrease listener count - synchronized (lock) { - child.listenerMap.forEach((eventClass, eventListeners) -> { - final int childCount = eventListeners.size(); - decreaseListenerCount(eventClass, childCount); - }); + synchronized (GLOBAL_CHILD_LOCK) { + final boolean result = this.children.remove(child); + if (result) { + child.parent = null; + // Decrease listener count + synchronized (lock) { + child.listenerMap.forEach((eventClass, eventListeners) -> { + final int childCount = eventListeners.size() + child.childEventMap.getInt(eventClass); + decreaseListenerCount(eventClass, childCount); + }); + } } } } public void addListener(@NotNull EventListener listener) { - final var eventType = listener.getEventType(); - this.listenerMap.computeIfAbsent(eventType, aClass -> new CopyOnWriteArrayList<>()) - .add((EventListener) listener); - if (parent != null) { - synchronized (parent.lock) { - parent.increaseListenerCount(eventType, 1); + synchronized (GLOBAL_CHILD_LOCK) { + final var eventType = listener.getEventType(); + this.listenerMap.computeIfAbsent(eventType, aClass -> new CopyOnWriteArrayList<>()) + .add((EventListener) listener); + if (parent != null) { + synchronized (parent.lock) { + parent.increaseListenerCount(eventType, 1); + } } } } public void removeListener(@NotNull EventListener listener) { - final var eventType = listener.getEventType(); - var listeners = listenerMap.get(eventType); - if (listeners == null || listeners.isEmpty()) - return; - final boolean removed = listeners.remove(listener); - if (removed && parent != null) { - synchronized (parent.lock) { - parent.decreaseListenerCount(eventType, 1); + synchronized (GLOBAL_CHILD_LOCK) { + final var eventType = listener.getEventType(); + var listeners = listenerMap.get(eventType); + if (listeners == null || listeners.isEmpty()) + return; + final boolean removed = listeners.remove(listener); + if (removed && parent != null) { + synchronized (parent.lock) { + parent.decreaseListenerCount(eventType, 1); + } } } } From 493c397efe938037ad9a6cb98bceaef92ef237bb Mon Sep 17 00:00:00 2001 From: TheMode Date: Thu, 3 Jun 2021 03:39:37 +0200 Subject: [PATCH 046/104] Remove EventNodeList.java --- .../net/minestom/server/event/EventNode.java | 4 --- .../minestom/server/event/EventNodeList.java | 29 ------------------- src/test/java/demo/PlayerInit.java | 13 +++++---- 3 files changed, 8 insertions(+), 38 deletions(-) delete mode 100644 src/main/java/net/minestom/server/event/EventNodeList.java diff --git a/src/main/java/net/minestom/server/event/EventNode.java b/src/main/java/net/minestom/server/event/EventNode.java index abfa260b9..f8bf90e3c 100644 --- a/src/main/java/net/minestom/server/event/EventNode.java +++ b/src/main/java/net/minestom/server/event/EventNode.java @@ -39,10 +39,6 @@ public class EventNode { return conditional(filter, (e, h) -> predicate.test(h)); } - public static EventNodeList list(@NotNull EventFilter filter) { - return new EventNodeList<>(filter); - } - private volatile String name = "unknown"; private final Map, List>> listenerMap = new ConcurrentHashMap<>(); diff --git a/src/main/java/net/minestom/server/event/EventNodeList.java b/src/main/java/net/minestom/server/event/EventNodeList.java deleted file mode 100644 index 378203976..000000000 --- a/src/main/java/net/minestom/server/event/EventNodeList.java +++ /dev/null @@ -1,29 +0,0 @@ -package net.minestom.server.event; - -import org.jetbrains.annotations.NotNull; - -import java.util.List; -import java.util.concurrent.CopyOnWriteArrayList; - -public class EventNodeList extends EventNode { - - private final List entries = new CopyOnWriteArrayList<>(); - - protected EventNodeList(EventFilter filter) { - super(filter); - } - - @Override - protected boolean condition(@NotNull T event) { - final var eventHandler = filter.getHandler(event); - return entries.contains(eventHandler); - } - - public void addEntry(@NotNull H handler) { - this.entries.add(handler); - } - - public void removeEntry(@NotNull H handler) { - this.entries.remove(handler); - } -} diff --git a/src/test/java/demo/PlayerInit.java b/src/test/java/demo/PlayerInit.java index 96f6c9bd6..44e6da961 100644 --- a/src/test/java/demo/PlayerInit.java +++ b/src/test/java/demo/PlayerInit.java @@ -146,9 +146,16 @@ public class PlayerInit { node.setName("node"); node.addListener(EventListener.builder(PlayerTickEvent.class) .handler(playerTickEvent -> System.out.println("Player tick!")) - .expirationCount(2) + .expirationCount(50) .build()); + empty.addChild(node); + node.call(new PlayerTickEvent(null)); + empty.call(new PlayerTickEvent(null)); + empty.removeChild(node); + node.call(new PlayerTickEvent(null)); + empty.call(new PlayerTickEvent(null)); + /* * Map a node to a single element * @@ -162,10 +169,6 @@ public class PlayerInit { conditional.addListener(EventListener.of(PlayerMoveEvent.class, (event) -> System.out.println("creative player moved"))); - var list = EventNode.list(EventFilter.PLAYER); - list.addListener(EventListener.of(PlayerMoveEvent.class, event -> - System.out.println("move"))); - GlobalEventHandler globalEventHandler = MinecraftServer.getGlobalEventHandler(); globalEventHandler.addEventCallback(EntityAttackEvent.class, event -> { final Entity source = event.getEntity(); From 5fa750fde3f8facc1014450dcb6941c41f7eb532 Mon Sep 17 00:00:00 2001 From: TheMode Date: Thu, 3 Jun 2021 03:56:05 +0200 Subject: [PATCH 047/104] Remove EventNodeConditional.java --- .../net/minestom/server/event/EventNode.java | 62 +++++++++++-------- .../server/event/EventNodeConditional.java | 28 --------- src/test/java/demo/PlayerInit.java | 15 ++--- 3 files changed, 41 insertions(+), 64 deletions(-) delete mode 100644 src/main/java/net/minestom/server/event/EventNodeConditional.java diff --git a/src/main/java/net/minestom/server/event/EventNode.java b/src/main/java/net/minestom/server/event/EventNode.java index f8bf90e3c..f7b3befd2 100644 --- a/src/main/java/net/minestom/server/event/EventNode.java +++ b/src/main/java/net/minestom/server/event/EventNode.java @@ -14,48 +14,48 @@ import java.util.concurrent.CopyOnWriteArraySet; import java.util.function.BiPredicate; import java.util.function.Predicate; -public class EventNode { +public class EventNode { - public static EventNode type(@NotNull EventFilter filter) { - return new EventNode<>(filter); + public static EventNode type(@NotNull EventFilter filter) { + return new EventNode<>(filter, (e, v) -> true); } - public static EventNode all() { + public static EventNode all() { return type(EventFilter.ALL); } - public static EventNodeConditional conditional(@NotNull EventFilter filter, - @NotNull BiPredicate predicate) { - return new EventNodeConditional<>(filter, predicate); + public static EventNode predicate(@NotNull EventFilter filter, + @NotNull BiPredicate predicate) { + return new EventNode<>(filter, predicate); } - public static EventNodeConditional conditionalEvent(@NotNull EventFilter filter, - @NotNull Predicate predicate) { - return conditional(filter, (e, h) -> predicate.test(e)); + public static EventNode predicateEvent(@NotNull EventFilter filter, + @NotNull Predicate predicate) { + return predicate(filter, (e, h) -> predicate.test(e)); } - public static EventNodeConditional conditionalHandler(@NotNull EventFilter filter, - @NotNull Predicate predicate) { - return conditional(filter, (e, h) -> predicate.test(h)); + public static EventNode predicateValue(@NotNull EventFilter filter, + @NotNull Predicate predicate) { + return predicate(filter, (e, h) -> predicate.test(h)); } - private volatile String name = "unknown"; - private final Map, List>> listenerMap = new ConcurrentHashMap<>(); private final Map> redirectionMap = new ConcurrentHashMap<>(); - private final Set> children = new CopyOnWriteArraySet<>(); + private final Set> children = new CopyOnWriteArraySet<>(); - protected final EventFilter filter; + protected final EventFilter filter; + protected volatile BiPredicate predicate; + private volatile String name = "unknown"; // Tree data private static final Object GLOBAL_CHILD_LOCK = new Object(); - - private volatile EventNode parent; + private volatile EventNode parent; private final Object lock = new Object(); private final Object2IntMap> childEventMap = new Object2IntOpenHashMap<>(); - protected EventNode(EventFilter filter) { + protected EventNode(EventFilter filter, BiPredicate predicate) { this.filter = filter; + this.predicate = predicate; } /** @@ -65,7 +65,7 @@ public class EventNode { * @return true to enter the node, false otherwise */ protected boolean condition(@NotNull T event) { - return true; + return predicate.test(event, filter.getHandler(event)); } public void call(@NotNull T event) { @@ -107,9 +107,9 @@ public class EventNode { this.children.forEach(eventNode -> eventNode.call(event)); } - public void addChild(@NotNull EventNode child) { + public void addChild(@NotNull EventNode child) { synchronized (GLOBAL_CHILD_LOCK) { - final boolean result = this.children.add((EventNode) child); + final boolean result = this.children.add((EventNode) child); if (result) { child.parent = this; // Increase listener count @@ -123,7 +123,7 @@ public class EventNode { } } - public void removeChild(@NotNull EventNode child) { + public void removeChild(@NotNull EventNode child) { synchronized (GLOBAL_CHILD_LOCK) { final boolean result = this.children.remove(child); if (result) { @@ -167,7 +167,15 @@ public class EventNode { } } - public void map(@NotNull EventFilter filter, @NotNull V value, @NotNull EventNode node) { + public @NotNull BiPredicate getPredicate() { + return predicate; + } + + public void setPredicate(@NotNull BiPredicate predicate) { + this.predicate = predicate; + } + + public void map(@NotNull EventFilter filter, @NotNull V2 value, @NotNull EventNode node) { RedirectionEntry entry = new RedirectionEntry<>(); entry.filter = filter; entry.node = node; @@ -186,7 +194,7 @@ public class EventNode { this.name = name; } - public @NotNull Set<@NotNull EventNode> getChildren() { + public @NotNull Set<@NotNull EventNode> getChildren() { return Collections.unmodifiableSet(children); } @@ -210,6 +218,6 @@ public class EventNode { private static class RedirectionEntry { EventFilter filter; - EventNode node; + EventNode node; } } diff --git a/src/main/java/net/minestom/server/event/EventNodeConditional.java b/src/main/java/net/minestom/server/event/EventNodeConditional.java deleted file mode 100644 index 447eb2013..000000000 --- a/src/main/java/net/minestom/server/event/EventNodeConditional.java +++ /dev/null @@ -1,28 +0,0 @@ -package net.minestom.server.event; - -import org.jetbrains.annotations.NotNull; - -import java.util.function.BiPredicate; - -public class EventNodeConditional extends EventNode { - - private volatile BiPredicate predicate; - - protected EventNodeConditional(EventFilter filter, BiPredicate predicate) { - super(filter); - this.predicate = predicate; - } - - @Override - protected boolean condition(@NotNull T event) { - return predicate.test(event, (H) filter.getHandler(event)); - } - - public @NotNull BiPredicate getPredicate() { - return predicate; - } - - public void setPredicate(@NotNull BiPredicate predicate) { - this.predicate = predicate; - } -} diff --git a/src/test/java/demo/PlayerInit.java b/src/test/java/demo/PlayerInit.java index 44e6da961..867e35aa8 100644 --- a/src/test/java/demo/PlayerInit.java +++ b/src/test/java/demo/PlayerInit.java @@ -156,16 +156,8 @@ public class PlayerInit { node.call(new PlayerTickEvent(null)); empty.call(new PlayerTickEvent(null)); - /* - * Map a node to a single element - * - * var test = EventNode.type(EventFilter.ENTITY); - * test.addListener(EventListener.of(PlayerMoveEvent.class, (event) -> - * System.out.println("creative player moved"))); - * empty.map(EventFilter.ENTITY, entity, test); - */ - var conditional = EventNode.conditionalHandler(EventFilter.PLAYER, Player::isCreative); + var conditional = EventNode.predicateValue(EventFilter.PLAYER, Player::isCreative); conditional.addListener(EventListener.of(PlayerMoveEvent.class, (event) -> System.out.println("creative player moved"))); @@ -188,6 +180,11 @@ public class PlayerInit { if (source instanceof Player) { ((Player) source).sendMessage("You attacked something!"); } + + var test = EventNode.type(EventFilter.ENTITY); + test.addListener(EventListener.of(PlayerMoveEvent.class, (e) -> + System.out.println("Test movement"))); + empty.map(EventFilter.ENTITY, source, test); }); globalEventHandler.addEventCallback(PlayerDeathEvent.class, event -> { From d5cce1156202918aadad3788d0046c911536c00c Mon Sep 17 00:00:00 2001 From: TheMode Date: Thu, 3 Jun 2021 04:26:47 +0200 Subject: [PATCH 048/104] Remove second generic from EventNode --- .../net/minestom/server/event/EventNode.java | 53 ++++++++----------- src/test/java/demo/PlayerInit.java | 7 --- 2 files changed, 23 insertions(+), 37 deletions(-) diff --git a/src/main/java/net/minestom/server/event/EventNode.java b/src/main/java/net/minestom/server/event/EventNode.java index f7b3befd2..019eab90f 100644 --- a/src/main/java/net/minestom/server/event/EventNode.java +++ b/src/main/java/net/minestom/server/event/EventNode.java @@ -14,46 +14,46 @@ import java.util.concurrent.CopyOnWriteArraySet; import java.util.function.BiPredicate; import java.util.function.Predicate; -public class EventNode { +public class EventNode { - public static EventNode type(@NotNull EventFilter filter) { + public static EventNode type(@NotNull EventFilter filter) { return new EventNode<>(filter, (e, v) -> true); } - public static EventNode all() { + public static EventNode all() { return type(EventFilter.ALL); } - public static EventNode predicate(@NotNull EventFilter filter, - @NotNull BiPredicate predicate) { - return new EventNode<>(filter, predicate); + public static EventNode predicate(@NotNull EventFilter filter, + @NotNull BiPredicate predicate) { + return new EventNode<>(filter, (e, o) -> predicate.test(e, (V) o)); } - public static EventNode predicateEvent(@NotNull EventFilter filter, - @NotNull Predicate predicate) { + public static EventNode predicateEvent(@NotNull EventFilter filter, + @NotNull Predicate predicate) { return predicate(filter, (e, h) -> predicate.test(e)); } - public static EventNode predicateValue(@NotNull EventFilter filter, - @NotNull Predicate predicate) { + public static EventNode predicateValue(@NotNull EventFilter filter, + @NotNull Predicate predicate) { return predicate(filter, (e, h) -> predicate.test(h)); } private final Map, List>> listenerMap = new ConcurrentHashMap<>(); private final Map> redirectionMap = new ConcurrentHashMap<>(); - private final Set> children = new CopyOnWriteArraySet<>(); + private final Set> children = new CopyOnWriteArraySet<>(); - protected final EventFilter filter; - protected volatile BiPredicate predicate; + protected final EventFilter filter; + protected final BiPredicate predicate; private volatile String name = "unknown"; // Tree data private static final Object GLOBAL_CHILD_LOCK = new Object(); - private volatile EventNode parent; + private volatile EventNode parent; private final Object lock = new Object(); private final Object2IntMap> childEventMap = new Object2IntOpenHashMap<>(); - protected EventNode(EventFilter filter, BiPredicate predicate) { + protected EventNode(EventFilter filter, BiPredicate predicate) { this.filter = filter; this.predicate = predicate; } @@ -65,7 +65,8 @@ public class EventNode { * @return true to enter the node, false otherwise */ protected boolean condition(@NotNull T event) { - return predicate.test(event, filter.getHandler(event)); + final var value = filter.getHandler(event); + return predicate.test(event, value); } public void call(@NotNull T event) { @@ -107,9 +108,9 @@ public class EventNode { this.children.forEach(eventNode -> eventNode.call(event)); } - public void addChild(@NotNull EventNode child) { + public void addChild(@NotNull EventNode child) { synchronized (GLOBAL_CHILD_LOCK) { - final boolean result = this.children.add((EventNode) child); + final boolean result = this.children.add((EventNode) child); if (result) { child.parent = this; // Increase listener count @@ -123,7 +124,7 @@ public class EventNode { } } - public void removeChild(@NotNull EventNode child) { + public void removeChild(@NotNull EventNode child) { synchronized (GLOBAL_CHILD_LOCK) { final boolean result = this.children.remove(child); if (result) { @@ -167,15 +168,7 @@ public class EventNode { } } - public @NotNull BiPredicate getPredicate() { - return predicate; - } - - public void setPredicate(@NotNull BiPredicate predicate) { - this.predicate = predicate; - } - - public void map(@NotNull EventFilter filter, @NotNull V2 value, @NotNull EventNode node) { + public void map(@NotNull EventFilter filter, @NotNull V2 value, @NotNull EventNode node) { RedirectionEntry entry = new RedirectionEntry<>(); entry.filter = filter; entry.node = node; @@ -194,7 +187,7 @@ public class EventNode { this.name = name; } - public @NotNull Set<@NotNull EventNode> getChildren() { + public @NotNull Set<@NotNull EventNode> getChildren() { return Collections.unmodifiableSet(children); } @@ -218,6 +211,6 @@ public class EventNode { private static class RedirectionEntry { EventFilter filter; - EventNode node; + EventNode node; } } diff --git a/src/test/java/demo/PlayerInit.java b/src/test/java/demo/PlayerInit.java index 867e35aa8..f2616b204 100644 --- a/src/test/java/demo/PlayerInit.java +++ b/src/test/java/demo/PlayerInit.java @@ -149,13 +149,6 @@ public class PlayerInit { .expirationCount(50) .build()); - empty.addChild(node); - node.call(new PlayerTickEvent(null)); - empty.call(new PlayerTickEvent(null)); - empty.removeChild(node); - node.call(new PlayerTickEvent(null)); - empty.call(new PlayerTickEvent(null)); - var conditional = EventNode.predicateValue(EventFilter.PLAYER, Player::isCreative); conditional.addListener(EventListener.of(PlayerMoveEvent.class, (event) -> From 8ec33bb6c8abc3ff5a6a1b8a51eb520a0fe7bc97 Mon Sep 17 00:00:00 2001 From: TheMode Date: Thu, 3 Jun 2021 04:41:08 +0200 Subject: [PATCH 049/104] EventNode methods return self --- .../net/minestom/server/event/EventNode.java | 23 ++++++++++------ src/test/java/demo/PlayerInit.java | 26 +++++++++---------- 2 files changed, 27 insertions(+), 22 deletions(-) diff --git a/src/main/java/net/minestom/server/event/EventNode.java b/src/main/java/net/minestom/server/event/EventNode.java index 019eab90f..2976f1e15 100644 --- a/src/main/java/net/minestom/server/event/EventNode.java +++ b/src/main/java/net/minestom/server/event/EventNode.java @@ -108,7 +108,7 @@ public class EventNode { this.children.forEach(eventNode -> eventNode.call(event)); } - public void addChild(@NotNull EventNode child) { + public EventNode addChild(@NotNull EventNode child) { synchronized (GLOBAL_CHILD_LOCK) { final boolean result = this.children.add((EventNode) child); if (result) { @@ -122,9 +122,10 @@ public class EventNode { } } } + return this; } - public void removeChild(@NotNull EventNode child) { + public EventNode removeChild(@NotNull EventNode child) { synchronized (GLOBAL_CHILD_LOCK) { final boolean result = this.children.remove(child); if (result) { @@ -138,9 +139,10 @@ public class EventNode { } } } + return this; } - public void addListener(@NotNull EventListener listener) { + public EventNode addListener(@NotNull EventListener listener) { synchronized (GLOBAL_CHILD_LOCK) { final var eventType = listener.getEventType(); this.listenerMap.computeIfAbsent(eventType, aClass -> new CopyOnWriteArrayList<>()) @@ -151,14 +153,15 @@ public class EventNode { } } } + return this; } - public void removeListener(@NotNull EventListener listener) { + public EventNode removeListener(@NotNull EventListener listener) { synchronized (GLOBAL_CHILD_LOCK) { final var eventType = listener.getEventType(); var listeners = listenerMap.get(eventType); if (listeners == null || listeners.isEmpty()) - return; + return this; final boolean removed = listeners.remove(listener); if (removed && parent != null) { synchronized (parent.lock) { @@ -166,25 +169,29 @@ public class EventNode { } } } + return this; } - public void map(@NotNull EventFilter filter, @NotNull V2 value, @NotNull EventNode node) { + public EventNode map(@NotNull EventFilter filter, @NotNull V2 value, @NotNull EventNode node) { RedirectionEntry entry = new RedirectionEntry<>(); entry.filter = filter; entry.node = node; this.redirectionMap.put(value, (RedirectionEntry) entry); + return this; } - public void removeMap(@NotNull Object value) { + public EventNode removeMap(@NotNull Object value) { this.redirectionMap.remove(value); + return this; } public @NotNull String getName() { return name; } - public void setName(@NotNull String name) { + public EventNode setName(@NotNull String name) { this.name = name; + return this; } public @NotNull Set<@NotNull EventNode> getChildren() { diff --git a/src/test/java/demo/PlayerInit.java b/src/test/java/demo/PlayerInit.java index f2616b204..50000bcb0 100644 --- a/src/test/java/demo/PlayerInit.java +++ b/src/test/java/demo/PlayerInit.java @@ -137,22 +137,20 @@ public class PlayerInit { // EVENT REGISTERING - var empty = EventNode.all(); - empty.setName("empty"); - empty.addListener(EventListener.of(PlayerMoveEvent.class, (event) -> { - })); + var empty = EventNode.all() + .setName("empty") + .addListener(EventListener.of(PlayerMoveEvent.class, (event) -> { + })); - var node = EventNode.type(EventFilter.PLAYER); - node.setName("node"); - node.addListener(EventListener.builder(PlayerTickEvent.class) - .handler(playerTickEvent -> System.out.println("Player tick!")) - .expirationCount(50) - .build()); + var node = EventNode.type(EventFilter.PLAYER) + .setName("node") + .addListener(EventListener.builder(PlayerTickEvent.class) + .handler(playerTickEvent -> System.out.println("Player tick!")) + .expirationCount(50) + .build()); - - var conditional = EventNode.predicateValue(EventFilter.PLAYER, Player::isCreative); - conditional.addListener(EventListener.of(PlayerMoveEvent.class, (event) -> - System.out.println("creative player moved"))); + var conditional = EventNode.predicateValue(EventFilter.PLAYER, Player::isCreative) + .addListener(EventListener.of(PlayerMoveEvent.class, (event) -> System.out.println("creative player moved"))); GlobalEventHandler globalEventHandler = MinecraftServer.getGlobalEventHandler(); globalEventHandler.addEventCallback(EntityAttackEvent.class, event -> { From e300d3ec57c07382c2efee0d675d502288480c40 Mon Sep 17 00:00:00 2001 From: TheMode Date: Thu, 3 Jun 2021 05:59:13 +0200 Subject: [PATCH 050/104] Simplify EventNode#map --- .../net/minestom/server/event/EventNode.java | 20 ++++++------------- src/test/java/demo/PlayerInit.java | 2 +- 2 files changed, 7 insertions(+), 15 deletions(-) diff --git a/src/main/java/net/minestom/server/event/EventNode.java b/src/main/java/net/minestom/server/event/EventNode.java index 2976f1e15..b27ff1ac1 100644 --- a/src/main/java/net/minestom/server/event/EventNode.java +++ b/src/main/java/net/minestom/server/event/EventNode.java @@ -40,7 +40,7 @@ public class EventNode { } private final Map, List>> listenerMap = new ConcurrentHashMap<>(); - private final Map> redirectionMap = new ConcurrentHashMap<>(); + private final Map> redirectionMap = new ConcurrentHashMap<>(); private final Set> children = new CopyOnWriteArraySet<>(); protected final EventFilter filter; @@ -82,9 +82,9 @@ public class EventNode { // Process redirection final Object handler = filter.getHandler(event); if (handler != null) { - final var entry = redirectionMap.get(handler); - if (entry != null) { - entry.node.call(event); + final var node = redirectionMap.get(handler); + if (node != null) { + node.call(event); } } // Process listener list @@ -172,11 +172,8 @@ public class EventNode { return this; } - public EventNode map(@NotNull EventFilter filter, @NotNull V2 value, @NotNull EventNode node) { - RedirectionEntry entry = new RedirectionEntry<>(); - entry.filter = filter; - entry.node = node; - this.redirectionMap.put(value, (RedirectionEntry) entry); + public EventNode map(@NotNull Object value, @NotNull EventNode node) { + this.redirectionMap.put(value, (EventNode) node); return this; } @@ -215,9 +212,4 @@ public class EventNode { throw new IllegalStateException("Something wrong happened, listener count: " + result); } } - - private static class RedirectionEntry { - EventFilter filter; - EventNode node; - } } diff --git a/src/test/java/demo/PlayerInit.java b/src/test/java/demo/PlayerInit.java index 50000bcb0..9c30ecd29 100644 --- a/src/test/java/demo/PlayerInit.java +++ b/src/test/java/demo/PlayerInit.java @@ -175,7 +175,7 @@ public class PlayerInit { var test = EventNode.type(EventFilter.ENTITY); test.addListener(EventListener.of(PlayerMoveEvent.class, (e) -> System.out.println("Test movement"))); - empty.map(EventFilter.ENTITY, source, test); + empty.map(source, test); }); globalEventHandler.addEventCallback(PlayerDeathEvent.class, event -> { From 8d284649f487c4aecfa99ba04c6ba232eb5789b3 Mon Sep 17 00:00:00 2001 From: TheMode Date: Thu, 3 Jun 2021 06:34:01 +0200 Subject: [PATCH 051/104] Inline node creation --- src/test/java/demo/PlayerInit.java | 8 +++----- 1 file changed, 3 insertions(+), 5 deletions(-) diff --git a/src/test/java/demo/PlayerInit.java b/src/test/java/demo/PlayerInit.java index 9c30ecd29..171e8cb12 100644 --- a/src/test/java/demo/PlayerInit.java +++ b/src/test/java/demo/PlayerInit.java @@ -171,11 +171,9 @@ public class PlayerInit { if (source instanceof Player) { ((Player) source).sendMessage("You attacked something!"); } - - var test = EventNode.type(EventFilter.ENTITY); - test.addListener(EventListener.of(PlayerMoveEvent.class, (e) -> - System.out.println("Test movement"))); - empty.map(source, test); + empty.map(source, EventNode.type(EventFilter.ENTITY) + .addListener(EventListener.of(PlayerMoveEvent.class, (e) -> + System.out.println("Test movement")))); }); globalEventHandler.addEventCallback(PlayerDeathEvent.class, event -> { From e5031ff37eafd585ca434a36ab8b4987730a9741 Mon Sep 17 00:00:00 2001 From: TheMode Date: Thu, 3 Jun 2021 09:47:48 +0200 Subject: [PATCH 052/104] Prevent a node from having its parent as child --- src/main/java/net/minestom/server/event/EventNode.java | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/src/main/java/net/minestom/server/event/EventNode.java b/src/main/java/net/minestom/server/event/EventNode.java index b27ff1ac1..5052abf99 100644 --- a/src/main/java/net/minestom/server/event/EventNode.java +++ b/src/main/java/net/minestom/server/event/EventNode.java @@ -2,12 +2,10 @@ package net.minestom.server.event; import it.unimi.dsi.fastutil.objects.Object2IntMap; import it.unimi.dsi.fastutil.objects.Object2IntOpenHashMap; +import net.minestom.server.utils.validate.Check; import org.jetbrains.annotations.NotNull; -import java.util.Collections; -import java.util.List; -import java.util.Map; -import java.util.Set; +import java.util.*; import java.util.concurrent.ConcurrentHashMap; import java.util.concurrent.CopyOnWriteArrayList; import java.util.concurrent.CopyOnWriteArraySet; @@ -110,6 +108,7 @@ public class EventNode { public EventNode addChild(@NotNull EventNode child) { synchronized (GLOBAL_CHILD_LOCK) { + Check.stateCondition(Objects.equals(parent, child), "Cannot have a child as parent"); final boolean result = this.children.add((EventNode) child); if (result) { child.parent = this; From 81e2072bc53c7dfdc2f2d99cfe9cbce4b273b00c Mon Sep 17 00:00:00 2001 From: TheMode Date: Thu, 3 Jun 2021 20:46:11 +0200 Subject: [PATCH 053/104] Add shortcut to add listener --- .../java/net/minestom/server/event/EventNode.java | 5 +++++ src/test/java/demo/PlayerInit.java | 13 ++++++++----- 2 files changed, 13 insertions(+), 5 deletions(-) diff --git a/src/main/java/net/minestom/server/event/EventNode.java b/src/main/java/net/minestom/server/event/EventNode.java index 5052abf99..f43a5f6b4 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 java.util.concurrent.ConcurrentHashMap; import java.util.concurrent.CopyOnWriteArrayList; import java.util.concurrent.CopyOnWriteArraySet; import java.util.function.BiPredicate; +import java.util.function.Consumer; import java.util.function.Predicate; public class EventNode { @@ -171,6 +172,10 @@ public class EventNode { return this; } + public EventNode addListener(@NotNull Class eventType, @NotNull Consumer<@NotNull E> listener) { + return addListener(EventListener.of(eventType, listener)); + } + public EventNode map(@NotNull Object value, @NotNull EventNode node) { this.redirectionMap.put(value, (EventNode) node); return this; diff --git a/src/test/java/demo/PlayerInit.java b/src/test/java/demo/PlayerInit.java index 171e8cb12..3f4657242 100644 --- a/src/test/java/demo/PlayerInit.java +++ b/src/test/java/demo/PlayerInit.java @@ -139,8 +139,8 @@ public class PlayerInit { var empty = EventNode.all() .setName("empty") - .addListener(EventListener.of(PlayerMoveEvent.class, (event) -> { - })); + .addListener(PlayerMoveEvent.class, (event) -> { + }); var node = EventNode.type(EventFilter.PLAYER) .setName("node") @@ -150,7 +150,10 @@ public class PlayerInit { .build()); var conditional = EventNode.predicateValue(EventFilter.PLAYER, Player::isCreative) - .addListener(EventListener.of(PlayerMoveEvent.class, (event) -> System.out.println("creative player moved"))); + .addListener(PlayerMoveEvent.class, (event) -> System.out.println("creative player moved")); + + node.addChild(conditional); + node.call(new PlayerTickEvent(null)); GlobalEventHandler globalEventHandler = MinecraftServer.getGlobalEventHandler(); globalEventHandler.addEventCallback(EntityAttackEvent.class, event -> { @@ -172,8 +175,8 @@ public class PlayerInit { ((Player) source).sendMessage("You attacked something!"); } empty.map(source, EventNode.type(EventFilter.ENTITY) - .addListener(EventListener.of(PlayerMoveEvent.class, (e) -> - System.out.println("Test movement")))); + .addListener(PlayerMoveEvent.class, (e) -> + System.out.println("Test movement"))); }); globalEventHandler.addEventCallback(PlayerDeathEvent.class, event -> { From 27bdbe7275aced5c2c708ea09f1d25d4ff6ad547 Mon Sep 17 00:00:00 2001 From: TheMode Date: Thu, 3 Jun 2021 20:59:05 +0200 Subject: [PATCH 054/104] Rename removeMap to unmap --- src/main/java/net/minestom/server/event/EventNode.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/net/minestom/server/event/EventNode.java b/src/main/java/net/minestom/server/event/EventNode.java index f43a5f6b4..8d564ad28 100644 --- a/src/main/java/net/minestom/server/event/EventNode.java +++ b/src/main/java/net/minestom/server/event/EventNode.java @@ -181,7 +181,7 @@ public class EventNode { return this; } - public EventNode removeMap(@NotNull Object value) { + public EventNode unmap(@NotNull Object value) { this.redirectionMap.remove(value); return this; } From 9177e94d1bc7f22a27fb8c8428cf02a40128ed3a Mon Sep 17 00:00:00 2001 From: TheMode Date: Thu, 3 Jun 2021 21:39:38 +0200 Subject: [PATCH 055/104] Allow node predicate based on tag --- .../java/net/minestom/server/event/EventNode.java | 14 ++++++++++++++ src/test/java/demo/PlayerInit.java | 3 +++ 2 files changed, 17 insertions(+) diff --git a/src/main/java/net/minestom/server/event/EventNode.java b/src/main/java/net/minestom/server/event/EventNode.java index 8d564ad28..25d06e988 100644 --- a/src/main/java/net/minestom/server/event/EventNode.java +++ b/src/main/java/net/minestom/server/event/EventNode.java @@ -2,8 +2,11 @@ package net.minestom.server.event; import it.unimi.dsi.fastutil.objects.Object2IntMap; import it.unimi.dsi.fastutil.objects.Object2IntOpenHashMap; +import net.minestom.server.tag.Tag; +import net.minestom.server.tag.TagReadable; import net.minestom.server.utils.validate.Check; import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; import java.util.*; import java.util.concurrent.ConcurrentHashMap; @@ -38,6 +41,17 @@ public class EventNode { return predicate(filter, (e, h) -> predicate.test(h)); } + public static EventNode predicateTag(@NotNull EventFilter filter, + @NotNull Tag tag) { + return predicate(filter, (e, h) -> h.hasTag(tag)); + } + + public static EventNode predicateTag(@NotNull EventFilter filter, + @NotNull Tag tag, + @NotNull Predicate<@Nullable V2> consumer) { + return predicate(filter, (e, h) -> consumer.test(h.getTag(tag))); + } + private final Map, List>> listenerMap = new ConcurrentHashMap<>(); private final Map> redirectionMap = new ConcurrentHashMap<>(); private final Set> children = new CopyOnWriteArraySet<>(); diff --git a/src/test/java/demo/PlayerInit.java b/src/test/java/demo/PlayerInit.java index 3f4657242..672fa7285 100644 --- a/src/test/java/demo/PlayerInit.java +++ b/src/test/java/demo/PlayerInit.java @@ -35,6 +35,7 @@ import net.minestom.server.item.metadata.CompassMeta; import net.minestom.server.monitoring.BenchmarkManager; import net.minestom.server.monitoring.TickMonitor; import net.minestom.server.network.ConnectionManager; +import net.minestom.server.tag.Tag; import net.minestom.server.utils.MathUtils; import net.minestom.server.utils.Position; import net.minestom.server.utils.Vector; @@ -152,6 +153,8 @@ public class PlayerInit { var conditional = EventNode.predicateValue(EventFilter.PLAYER, Player::isCreative) .addListener(PlayerMoveEvent.class, (event) -> System.out.println("creative player moved")); + var tagNode = EventNode.predicateTag(EventFilter.ITEM, Tag.String("tag"), s -> s != null && !s.isEmpty()); + node.addChild(conditional); node.call(new PlayerTickEvent(null)); From a15717ae4938fc03b34bbff2812e737002d4fcb5 Mon Sep 17 00:00:00 2001 From: TheMode Date: Thu, 3 Jun 2021 21:41:28 +0200 Subject: [PATCH 056/104] Remove unnecessary generic --- src/main/java/net/minestom/server/event/EventNode.java | 10 +++++----- src/test/java/demo/PlayerInit.java | 2 +- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/src/main/java/net/minestom/server/event/EventNode.java b/src/main/java/net/minestom/server/event/EventNode.java index 25d06e988..e184846f9 100644 --- a/src/main/java/net/minestom/server/event/EventNode.java +++ b/src/main/java/net/minestom/server/event/EventNode.java @@ -41,14 +41,14 @@ public class EventNode { return predicate(filter, (e, h) -> predicate.test(h)); } - public static EventNode predicateTag(@NotNull EventFilter filter, - @NotNull Tag tag) { + public static EventNode predicateTag(@NotNull EventFilter filter, + @NotNull Tag tag) { return predicate(filter, (e, h) -> h.hasTag(tag)); } - public static EventNode predicateTag(@NotNull EventFilter filter, - @NotNull Tag tag, - @NotNull Predicate<@Nullable V2> consumer) { + public static EventNode predicateTag(@NotNull EventFilter filter, + @NotNull Tag tag, + @NotNull Predicate<@Nullable V> consumer) { return predicate(filter, (e, h) -> consumer.test(h.getTag(tag))); } diff --git a/src/test/java/demo/PlayerInit.java b/src/test/java/demo/PlayerInit.java index 672fa7285..7462d28dd 100644 --- a/src/test/java/demo/PlayerInit.java +++ b/src/test/java/demo/PlayerInit.java @@ -153,7 +153,7 @@ public class PlayerInit { var conditional = EventNode.predicateValue(EventFilter.PLAYER, Player::isCreative) .addListener(PlayerMoveEvent.class, (event) -> System.out.println("creative player moved")); - var tagNode = EventNode.predicateTag(EventFilter.ITEM, Tag.String("tag"), s -> s != null && !s.isEmpty()); + var tagNode = EventNode.predicateTag(EventFilter.ITEM, Tag.String("tag")); node.addChild(conditional); node.call(new PlayerTickEvent(null)); From 734e6f5bcba8483ad0bf8c8801186a9f4ee1c875 Mon Sep 17 00:00:00 2001 From: TheMode Date: Thu, 3 Jun 2021 21:54:07 +0200 Subject: [PATCH 057/104] Remove `predicate` from the EventNode factory methods --- .../net/minestom/server/event/EventNode.java | 19 ++++++++++--------- src/test/java/demo/PlayerInit.java | 9 ++++++--- 2 files changed, 16 insertions(+), 12 deletions(-) diff --git a/src/main/java/net/minestom/server/event/EventNode.java b/src/main/java/net/minestom/server/event/EventNode.java index e184846f9..1af122b97 100644 --- a/src/main/java/net/minestom/server/event/EventNode.java +++ b/src/main/java/net/minestom/server/event/EventNode.java @@ -31,24 +31,24 @@ public class EventNode { return new EventNode<>(filter, (e, o) -> predicate.test(e, (V) o)); } - public static EventNode predicateEvent(@NotNull EventFilter filter, - @NotNull Predicate predicate) { + public static EventNode event(@NotNull EventFilter filter, + @NotNull Predicate predicate) { return predicate(filter, (e, h) -> predicate.test(e)); } - public static EventNode predicateValue(@NotNull EventFilter filter, - @NotNull Predicate predicate) { + public static EventNode value(@NotNull EventFilter filter, + @NotNull Predicate predicate) { return predicate(filter, (e, h) -> predicate.test(h)); } - public static EventNode predicateTag(@NotNull EventFilter filter, - @NotNull Tag tag) { + public static EventNode tag(@NotNull EventFilter filter, + @NotNull Tag tag) { return predicate(filter, (e, h) -> h.hasTag(tag)); } - public static EventNode predicateTag(@NotNull EventFilter filter, - @NotNull Tag tag, - @NotNull Predicate<@Nullable V> consumer) { + public static EventNode tag(@NotNull EventFilter filter, + @NotNull Tag tag, + @NotNull Predicate<@Nullable V> consumer) { return predicate(filter, (e, h) -> consumer.test(h.getTag(tag))); } @@ -79,6 +79,7 @@ public class EventNode { */ protected boolean condition(@NotNull T event) { final var value = filter.getHandler(event); + System.out.println("test "+event+" "+value); return predicate.test(event, value); } diff --git a/src/test/java/demo/PlayerInit.java b/src/test/java/demo/PlayerInit.java index 7462d28dd..ad7b4693a 100644 --- a/src/test/java/demo/PlayerInit.java +++ b/src/test/java/demo/PlayerInit.java @@ -150,13 +150,16 @@ public class PlayerInit { .expirationCount(50) .build()); - var conditional = EventNode.predicateValue(EventFilter.PLAYER, Player::isCreative) + var conditional = EventNode.value(EventFilter.PLAYER, Player::isCreative) .addListener(PlayerMoveEvent.class, (event) -> System.out.println("creative player moved")); - var tagNode = EventNode.predicateTag(EventFilter.ITEM, Tag.String("tag")); + var tagNode = EventNode.tag(EventFilter.ITEM, Tag.String("tag")); node.addChild(conditional); - node.call(new PlayerTickEvent(null)); + node.addChild(EventNode.value(EventFilter.PLAYER, player -> player.getUsername().equals("TheMode911")) + .addListener(PlayerMoveEvent.class, event -> System.out.println("move!")) + .addListener(PlayerTickEvent.class, event -> System.out.println("tick!"))); + //node.addChild(tagNode); -> Error: cannot add an item listener to a player node GlobalEventHandler globalEventHandler = MinecraftServer.getGlobalEventHandler(); globalEventHandler.addEventCallback(EntityAttackEvent.class, event -> { From 5aa8d95ed94e60ab9a8c74ebe771b7e34f5fe154 Mon Sep 17 00:00:00 2001 From: TheMode Date: Thu, 3 Jun 2021 21:54:42 +0200 Subject: [PATCH 058/104] Remove debug print --- src/main/java/net/minestom/server/event/EventNode.java | 1 - 1 file changed, 1 deletion(-) diff --git a/src/main/java/net/minestom/server/event/EventNode.java b/src/main/java/net/minestom/server/event/EventNode.java index 1af122b97..9d0e8bfe2 100644 --- a/src/main/java/net/minestom/server/event/EventNode.java +++ b/src/main/java/net/minestom/server/event/EventNode.java @@ -79,7 +79,6 @@ public class EventNode { */ protected boolean condition(@NotNull T event) { final var value = filter.getHandler(event); - System.out.println("test "+event+" "+value); return predicate.test(event, value); } From 94e315e3b27cce92f8e4af2cdc969277b127bcab Mon Sep 17 00:00:00 2001 From: TheMode Date: Thu, 3 Jun 2021 21:59:27 +0200 Subject: [PATCH 059/104] Rename `predicate` to `type` --- .../net/minestom/server/event/EventNode.java | 20 +++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git a/src/main/java/net/minestom/server/event/EventNode.java b/src/main/java/net/minestom/server/event/EventNode.java index 9d0e8bfe2..18c4390bf 100644 --- a/src/main/java/net/minestom/server/event/EventNode.java +++ b/src/main/java/net/minestom/server/event/EventNode.java @@ -18,38 +18,38 @@ import java.util.function.Predicate; public class EventNode { - public static EventNode type(@NotNull EventFilter filter) { - return new EventNode<>(filter, (e, v) -> true); - } - public static EventNode all() { return type(EventFilter.ALL); } - public static EventNode predicate(@NotNull EventFilter filter, - @NotNull BiPredicate predicate) { + public static EventNode type(@NotNull EventFilter filter, + @NotNull BiPredicate predicate) { return new EventNode<>(filter, (e, o) -> predicate.test(e, (V) o)); } + public static EventNode type(@NotNull EventFilter filter) { + return type(filter, (e, v) -> true); + } + public static EventNode event(@NotNull EventFilter filter, @NotNull Predicate predicate) { - return predicate(filter, (e, h) -> predicate.test(e)); + return type(filter, (e, h) -> predicate.test(e)); } public static EventNode value(@NotNull EventFilter filter, @NotNull Predicate predicate) { - return predicate(filter, (e, h) -> predicate.test(h)); + return type(filter, (e, h) -> predicate.test(h)); } public static EventNode tag(@NotNull EventFilter filter, @NotNull Tag tag) { - return predicate(filter, (e, h) -> h.hasTag(tag)); + return type(filter, (e, h) -> h.hasTag(tag)); } public static EventNode tag(@NotNull EventFilter filter, @NotNull Tag tag, @NotNull Predicate<@Nullable V> consumer) { - return predicate(filter, (e, h) -> consumer.test(h.getTag(tag))); + return type(filter, (e, h) -> consumer.test(h.getTag(tag))); } private final Map, List>> listenerMap = new ConcurrentHashMap<>(); From f1ddedfb44bec2a44a9fe1a9131d59b649ccaef3 Mon Sep 17 00:00:00 2001 From: TheMode Date: Fri, 4 Jun 2021 00:30:48 +0200 Subject: [PATCH 060/104] Add EventNode#getParent --- src/main/java/net/minestom/server/event/EventNode.java | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/src/main/java/net/minestom/server/event/EventNode.java b/src/main/java/net/minestom/server/event/EventNode.java index 18c4390bf..f5c052ec3 100644 --- a/src/main/java/net/minestom/server/event/EventNode.java +++ b/src/main/java/net/minestom/server/event/EventNode.java @@ -123,6 +123,7 @@ public class EventNode { public EventNode addChild(@NotNull EventNode child) { synchronized (GLOBAL_CHILD_LOCK) { + Check.stateCondition(child.parent != null, "Node already has a parent"); Check.stateCondition(Objects.equals(parent, child), "Cannot have a child as parent"); final boolean result = this.children.add((EventNode) child); if (result) { @@ -209,6 +210,10 @@ public class EventNode { return this; } + public @Nullable EventNode getParent() { + return parent; + } + public @NotNull Set<@NotNull EventNode> getChildren() { return Collections.unmodifiableSet(children); } From 5d3bae3d7ff8b7fff5d3fb84e64931dbaa5b8e21 Mon Sep 17 00:00:00 2001 From: TheMode Date: Fri, 4 Jun 2021 00:54:36 +0200 Subject: [PATCH 061/104] Make some events implement ItemEvent --- .../server/event/item/ItemDropEvent.java | 4 +-- .../event/item/ItemUpdateStateEvent.java | 25 ++++++++++--------- .../server/event/item/PickupItemEvent.java | 15 ++++++----- .../event/player/PlayerUseItemEvent.java | 4 +-- .../player/PlayerUseItemOnBlockEvent.java | 4 +-- 5 files changed, 28 insertions(+), 24 deletions(-) diff --git a/src/main/java/net/minestom/server/event/item/ItemDropEvent.java b/src/main/java/net/minestom/server/event/item/ItemDropEvent.java index 14ef70248..ba6b52018 100644 --- a/src/main/java/net/minestom/server/event/item/ItemDropEvent.java +++ b/src/main/java/net/minestom/server/event/item/ItemDropEvent.java @@ -2,11 +2,11 @@ package net.minestom.server.event.item; import net.minestom.server.entity.Player; import net.minestom.server.event.CancellableEvent; -import net.minestom.server.event.Event; +import net.minestom.server.event.trait.ItemEvent; import net.minestom.server.item.ItemStack; import org.jetbrains.annotations.NotNull; -public class ItemDropEvent implements CancellableEvent { +public class ItemDropEvent implements ItemEvent, CancellableEvent { private final Player player; private final ItemStack itemStack; diff --git a/src/main/java/net/minestom/server/event/item/ItemUpdateStateEvent.java b/src/main/java/net/minestom/server/event/item/ItemUpdateStateEvent.java index b08a67c18..817f08b7c 100644 --- a/src/main/java/net/minestom/server/event/item/ItemUpdateStateEvent.java +++ b/src/main/java/net/minestom/server/event/item/ItemUpdateStateEvent.java @@ -1,11 +1,12 @@ package net.minestom.server.event.item; import net.minestom.server.entity.Player; -import net.minestom.server.event.Event; +import net.minestom.server.event.trait.ItemEvent; +import net.minestom.server.event.trait.PlayerEvent; import net.minestom.server.item.ItemStack; import org.jetbrains.annotations.NotNull; -public class ItemUpdateStateEvent implements Event { +public class ItemUpdateStateEvent implements PlayerEvent, ItemEvent { private final Player player; private final Player.Hand hand; @@ -18,21 +19,11 @@ public class ItemUpdateStateEvent implements Event { this.itemStack = itemStack; } - @NotNull - public Player getPlayer() { - return player; - } - @NotNull public Player.Hand getHand() { return hand; } - @NotNull - public ItemStack getItemStack() { - return itemStack; - } - public void setHandAnimation(boolean handAnimation) { this.handAnimation = handAnimation; } @@ -40,4 +31,14 @@ public class ItemUpdateStateEvent implements Event { public boolean hasHandAnimation() { return handAnimation; } + + @Override + public @NotNull ItemStack getItemStack() { + return itemStack; + } + + @Override + public @NotNull Player getPlayer() { + return player; + } } diff --git a/src/main/java/net/minestom/server/event/item/PickupItemEvent.java b/src/main/java/net/minestom/server/event/item/PickupItemEvent.java index e2f150748..4e336ca7c 100644 --- a/src/main/java/net/minestom/server/event/item/PickupItemEvent.java +++ b/src/main/java/net/minestom/server/event/item/PickupItemEvent.java @@ -1,13 +1,15 @@ package net.minestom.server.event.item; +import net.minestom.server.entity.Entity; import net.minestom.server.entity.ItemEntity; import net.minestom.server.entity.LivingEntity; import net.minestom.server.event.CancellableEvent; -import net.minestom.server.event.Event; +import net.minestom.server.event.trait.EntityEvent; +import net.minestom.server.event.trait.ItemEvent; import net.minestom.server.item.ItemStack; import org.jetbrains.annotations.NotNull; -public class PickupItemEvent implements CancellableEvent { +public class PickupItemEvent implements EntityEvent, ItemEvent, CancellableEvent { private final LivingEntity livingEntity; private final ItemEntity itemEntity; @@ -29,10 +31,6 @@ public class PickupItemEvent implements CancellableEvent { return itemEntity; } - /** - * @deprecated use {@link #getItemEntity()} and {@link ItemEntity#getItemStack()}. - */ - @Deprecated @NotNull public ItemStack getItemStack() { return getItemEntity().getItemStack(); @@ -47,4 +45,9 @@ public class PickupItemEvent implements CancellableEvent { public void setCancelled(boolean cancel) { this.cancelled = cancel; } + + @Override + public @NotNull Entity getEntity() { + return livingEntity; + } } diff --git a/src/main/java/net/minestom/server/event/player/PlayerUseItemEvent.java b/src/main/java/net/minestom/server/event/player/PlayerUseItemEvent.java index 54108d29f..579bc6888 100644 --- a/src/main/java/net/minestom/server/event/player/PlayerUseItemEvent.java +++ b/src/main/java/net/minestom/server/event/player/PlayerUseItemEvent.java @@ -2,7 +2,7 @@ package net.minestom.server.event.player; import net.minestom.server.entity.Player; import net.minestom.server.event.CancellableEvent; -import net.minestom.server.event.Event; +import net.minestom.server.event.trait.ItemEvent; import net.minestom.server.event.trait.PlayerEvent; import net.minestom.server.item.ItemStack; import org.jetbrains.annotations.NotNull; @@ -10,7 +10,7 @@ import org.jetbrains.annotations.NotNull; /** * Event when an item is used without clicking on a block. */ -public class PlayerUseItemEvent implements PlayerEvent, CancellableEvent { +public class PlayerUseItemEvent implements PlayerEvent, ItemEvent, CancellableEvent { private final Player player; private final Player.Hand hand; diff --git a/src/main/java/net/minestom/server/event/player/PlayerUseItemOnBlockEvent.java b/src/main/java/net/minestom/server/event/player/PlayerUseItemOnBlockEvent.java index b329a5b76..7a6f243f2 100644 --- a/src/main/java/net/minestom/server/event/player/PlayerUseItemOnBlockEvent.java +++ b/src/main/java/net/minestom/server/event/player/PlayerUseItemOnBlockEvent.java @@ -1,7 +1,7 @@ package net.minestom.server.event.player; import net.minestom.server.entity.Player; -import net.minestom.server.event.Event; +import net.minestom.server.event.trait.ItemEvent; import net.minestom.server.event.trait.PlayerEvent; import net.minestom.server.item.ItemStack; import net.minestom.server.utils.BlockPosition; @@ -11,7 +11,7 @@ import org.jetbrains.annotations.NotNull; /** * Used when a player is clicking on a block with an item (but is not a block in item form). */ -public class PlayerUseItemOnBlockEvent implements PlayerEvent { +public class PlayerUseItemOnBlockEvent implements PlayerEvent, ItemEvent { private final Player player; private final Player.Hand hand; From 8b255651abc7288cfba2a59b9677979e9eafb828 Mon Sep 17 00:00:00 2001 From: TheMode Date: Fri, 4 Jun 2021 03:48:51 +0200 Subject: [PATCH 062/104] Call events using EventDispatcher --- .../net/minestom/server/MinecraftServer.java | 7 ++ .../server/command/CommandManager.java | 3 +- .../net/minestom/server/entity/Entity.java | 25 +++---- .../server/entity/EntityCreature.java | 3 +- .../minestom/server/entity/ItemEntity.java | 3 +- .../minestom/server/entity/LivingEntity.java | 18 +++-- .../net/minestom/server/entity/Player.java | 35 +++++----- .../type/decoration/EntityArmorStand.java | 3 +- .../type/projectile/EntityProjectile.java | 11 +-- .../server/event/EventDispatcher.java | 15 ++++ .../net/minestom/server/event/EventNode.java | 35 +++++++--- .../server/event/handler/EventHandler.java | 68 ++----------------- .../minestom/server/extras/lan/OpenToLAN.java | 7 +- .../minestom/server/extras/query/Query.java | 13 ++-- .../net/minestom/server/instance/Chunk.java | 13 ++-- .../minestom/server/instance/Instance.java | 7 +- .../server/instance/InstanceContainer.java | 7 +- .../inventory/InventoryClickHandler.java | 3 +- .../server/inventory/PlayerInventory.java | 3 +- .../click/InventoryClickProcessor.java | 9 +-- .../server/listener/AbilitiesListener.java | 5 +- .../listener/AdvancementTabListener.java | 3 +- .../server/listener/AnimationListener.java | 3 +- .../listener/BlockPlacementListener.java | 7 +- .../server/listener/ChatMessageListener.java | 3 +- .../server/listener/EntityActionListener.java | 11 +-- .../listener/PlayerDiggingListener.java | 5 +- .../server/listener/PlayerHeldListener.java | 3 +- .../listener/PlayerPositionListener.java | 3 +- .../listener/PluginMessageListener.java | 3 +- .../server/listener/ResourcePackListener.java | 3 +- .../server/listener/SettingsListener.java | 3 +- .../server/listener/UseEntityListener.java | 5 +- .../server/listener/UseItemListener.java | 7 +- .../server/listener/WindowListener.java | 3 +- .../server/network/ConnectionManager.java | 5 +- .../netty/codec/LegacyPingHandler.java | 5 +- .../client/status/StatusRequestPacket.java | 4 +- src/test/java/demo/PlayerInit.java | 4 ++ 39 files changed, 194 insertions(+), 179 deletions(-) create mode 100644 src/main/java/net/minestom/server/event/EventDispatcher.java diff --git a/src/main/java/net/minestom/server/MinecraftServer.java b/src/main/java/net/minestom/server/MinecraftServer.java index 4057bace8..545ab891b 100644 --- a/src/main/java/net/minestom/server/MinecraftServer.java +++ b/src/main/java/net/minestom/server/MinecraftServer.java @@ -8,6 +8,8 @@ import net.minestom.server.data.DataType; import net.minestom.server.data.SerializableData; import net.minestom.server.entity.EntityType; import net.minestom.server.entity.Player; +import net.minestom.server.event.Event; +import net.minestom.server.event.EventNode; import net.minestom.server.event.GlobalEventHandler; import net.minestom.server.exception.ExceptionManager; import net.minestom.server.extensions.Extension; @@ -124,6 +126,7 @@ public final class MinecraftServer { private static ExtensionManager extensionManager; private static final GlobalEventHandler GLOBAL_EVENT_HANDLER = new GlobalEventHandler(); + private static final EventNode GLOBAL_EVENT_NODE = EventNode.all(); private static UpdateManager updateManager; private static MinecraftServer minecraftServer; @@ -303,6 +306,10 @@ public final class MinecraftServer { return GLOBAL_EVENT_HANDLER; } + public static @NotNull EventNode getGlobalEventNode() { + return GLOBAL_EVENT_NODE; + } + /** * Gets the manager handling all incoming packets * diff --git a/src/main/java/net/minestom/server/command/CommandManager.java b/src/main/java/net/minestom/server/command/CommandManager.java index 94c1adf05..ad9b5e5df 100644 --- a/src/main/java/net/minestom/server/command/CommandManager.java +++ b/src/main/java/net/minestom/server/command/CommandManager.java @@ -11,6 +11,7 @@ import net.minestom.server.command.builder.parser.ArgumentQueryResult; import net.minestom.server.command.builder.parser.CommandParser; import net.minestom.server.command.builder.parser.CommandQueryResult; import net.minestom.server.entity.Player; +import net.minestom.server.event.EventDispatcher; import net.minestom.server.event.player.PlayerCommandEvent; import net.minestom.server.network.packet.server.play.DeclareCommandsPacket; import net.minestom.server.utils.ArrayUtils; @@ -104,7 +105,7 @@ public final class CommandManager { Player player = (Player) sender; PlayerCommandEvent playerCommandEvent = new PlayerCommandEvent(player, command); - player.callEvent(PlayerCommandEvent.class, playerCommandEvent); + EventDispatcher.call(playerCommandEvent); if (playerCommandEvent.isCancelled()) return CommandResult.of(CommandResult.Type.CANCELLED, command); diff --git a/src/main/java/net/minestom/server/entity/Entity.java b/src/main/java/net/minestom/server/entity/Entity.java index d30c80fc0..dddab7a40 100644 --- a/src/main/java/net/minestom/server/entity/Entity.java +++ b/src/main/java/net/minestom/server/entity/Entity.java @@ -18,6 +18,7 @@ import net.minestom.server.data.DataContainer; import net.minestom.server.entity.metadata.EntityMeta; import net.minestom.server.event.Event; import net.minestom.server.event.EventCallback; +import net.minestom.server.event.EventDispatcher; import net.minestom.server.event.entity.*; import net.minestom.server.event.handler.EventHandler; import net.minestom.server.instance.Chunk; @@ -645,7 +646,7 @@ public class Entity implements Viewable, Tickable, EventHandler, DataContainer, update(time); ticks++; - callEvent(EntityTickEvent.class, tickEvent); // reuse tickEvent to avoid recreating it each tick + EventDispatcher.call(tickEvent); // reuse tickEvent to avoid recreating it each tick // remove expired effects if (!effects.isEmpty()) { @@ -655,10 +656,7 @@ public class Entity implements Viewable, Tickable, EventHandler, DataContainer, if (time >= timedPotion.getStartingTime() + potionTime) { // Send the packet that the potion should no longer be applied timedPotion.getPotion().sendRemovePacket(this); - callEvent(EntityPotionRemoveEvent.class, new EntityPotionRemoveEvent( - this, - timedPotion.getPotion() - )); + EventDispatcher.call(new EntityPotionRemoveEvent(this, timedPotion.getPotion())); return true; } return false; @@ -916,8 +914,7 @@ public class Entity implements Viewable, Tickable, EventHandler, DataContainer, refreshCurrentChunk(instance.getChunkAt(position.getX(), position.getZ())); instance.UNSAFE_addEntity(this); spawn(); - EntitySpawnEvent entitySpawnEvent = new EntitySpawnEvent(this, instance); - callEvent(EntitySpawnEvent.class, entitySpawnEvent); + EventDispatcher.call(new EntitySpawnEvent(this, instance)); } /** @@ -950,7 +947,7 @@ public class Entity implements Viewable, Tickable, EventHandler, DataContainer, */ public void setVelocity(@NotNull Vector velocity) { EntityVelocityEvent entityVelocityEvent = new EntityVelocityEvent(this, velocity); - callCancellableEvent(EntityVelocityEvent.class, entityVelocityEvent, () -> { + EventDispatcher.callCancellable(entityVelocityEvent, () -> { this.velocity.copy(entityVelocityEvent.getVelocity()); sendPacketToViewersAndSelf(getVelocityPacket()); }); @@ -1464,7 +1461,7 @@ public class Entity implements Viewable, Tickable, EventHandler, DataContainer, removeEffect(potion.getEffect()); this.effects.add(new TimedPotion(potion, System.currentTimeMillis())); potion.sendAddPacket(this); - callEvent(EntityPotionAddEvent.class, new EntityPotionAddEvent(this, potion)); + EventDispatcher.call(new EntityPotionAddEvent(this, potion)); } /** @@ -1476,10 +1473,7 @@ public class Entity implements Viewable, Tickable, EventHandler, DataContainer, this.effects.removeIf(timedPotion -> { if (timedPotion.getPotion().getEffect() == effect) { timedPotion.getPotion().sendRemovePacket(this); - callEvent(EntityPotionRemoveEvent.class, new EntityPotionRemoveEvent( - this, - timedPotion.getPotion() - )); + EventDispatcher.call(new EntityPotionRemoveEvent(this, timedPotion.getPotion())); return true; } return false; @@ -1492,10 +1486,7 @@ public class Entity implements Viewable, Tickable, EventHandler, DataContainer, public void clearEffects() { for (TimedPotion timedPotion : effects) { timedPotion.getPotion().sendRemovePacket(this); - callEvent(EntityPotionRemoveEvent.class, new EntityPotionRemoveEvent( - this, - timedPotion.getPotion() - )); + EventDispatcher.call(new EntityPotionRemoveEvent(this, timedPotion.getPotion())); } this.effects.clear(); } diff --git a/src/main/java/net/minestom/server/entity/EntityCreature.java b/src/main/java/net/minestom/server/entity/EntityCreature.java index 77de37bdf..e7f7e18be 100644 --- a/src/main/java/net/minestom/server/entity/EntityCreature.java +++ b/src/main/java/net/minestom/server/entity/EntityCreature.java @@ -6,6 +6,7 @@ import net.minestom.server.entity.ai.EntityAI; import net.minestom.server.entity.ai.EntityAIGroup; import net.minestom.server.entity.pathfinding.NavigableEntity; import net.minestom.server.entity.pathfinding.Navigator; +import net.minestom.server.event.EventDispatcher; import net.minestom.server.event.entity.EntityAttackEvent; import net.minestom.server.instance.Instance; import net.minestom.server.utils.Position; @@ -146,7 +147,7 @@ public class EntityCreature extends LivingEntity implements NavigableEntity, Ent if (swingHand) swingMainHand(); EntityAttackEvent attackEvent = new EntityAttackEvent(this, target); - callEvent(EntityAttackEvent.class, attackEvent); + EventDispatcher.call(attackEvent); } /** diff --git a/src/main/java/net/minestom/server/entity/ItemEntity.java b/src/main/java/net/minestom/server/entity/ItemEntity.java index 8ee4b7ea6..c110740a0 100644 --- a/src/main/java/net/minestom/server/entity/ItemEntity.java +++ b/src/main/java/net/minestom/server/entity/ItemEntity.java @@ -1,5 +1,6 @@ package net.minestom.server.entity; +import net.minestom.server.event.EventDispatcher; import net.minestom.server.event.entity.EntityItemMergeEvent; import net.minestom.server.instance.Chunk; import net.minestom.server.instance.Instance; @@ -112,7 +113,7 @@ public class ItemEntity extends ObjectEntity { final ItemStack result = stackingRule.apply(itemStack, totalAmount); EntityItemMergeEvent entityItemMergeEvent = new EntityItemMergeEvent(this, itemEntity, result); - callCancellableEvent(EntityItemMergeEvent.class, entityItemMergeEvent, () -> { + EventDispatcher.callCancellable(entityItemMergeEvent, () -> { setItemStack(entityItemMergeEvent.getResult()); itemEntity.remove(); }); diff --git a/src/main/java/net/minestom/server/entity/LivingEntity.java b/src/main/java/net/minestom/server/entity/LivingEntity.java index 3267e0337..674acfc68 100644 --- a/src/main/java/net/minestom/server/entity/LivingEntity.java +++ b/src/main/java/net/minestom/server/entity/LivingEntity.java @@ -7,6 +7,7 @@ import net.minestom.server.attribute.Attributes; import net.minestom.server.collision.BoundingBox; import net.minestom.server.entity.damage.DamageType; import net.minestom.server.entity.metadata.LivingEntityMeta; +import net.minestom.server.event.EventDispatcher; import net.minestom.server.event.entity.EntityDamageEvent; import net.minestom.server.event.entity.EntityDeathEvent; import net.minestom.server.event.entity.EntityFireEvent; @@ -17,7 +18,10 @@ import net.minestom.server.instance.block.Block; import net.minestom.server.inventory.EquipmentHandler; import net.minestom.server.item.ItemStack; import net.minestom.server.network.ConnectionState; -import net.minestom.server.network.packet.server.play.*; +import net.minestom.server.network.packet.server.play.CollectItemPacket; +import net.minestom.server.network.packet.server.play.EntityAnimationPacket; +import net.minestom.server.network.packet.server.play.EntityPropertiesPacket; +import net.minestom.server.network.packet.server.play.SoundEffectPacket; import net.minestom.server.network.player.PlayerConnection; import net.minestom.server.scoreboard.Team; import net.minestom.server.sound.SoundEvent; @@ -193,7 +197,7 @@ public class LivingEntity extends Entity implements EquipmentHandler { private ItemStack getEquipmentItem(@NotNull ItemStack itemStack, @NotNull EquipmentSlot slot) { EntityEquipEvent entityEquipEvent = new EntityEquipEvent(this, itemStack, slot); - callEvent(EntityEquipEvent.class, entityEquipEvent); + EventDispatcher.call(entityEquipEvent); return entityEquipEvent.getEquippedItem(); } @@ -232,7 +236,7 @@ public class LivingEntity extends Entity implements EquipmentHandler { if (itemEntity.shouldRemove() || itemEntity.isRemoveScheduled()) continue; PickupItemEvent pickupItemEvent = new PickupItemEvent(this, itemEntity); - callCancellableEvent(PickupItemEvent.class, pickupItemEvent, () -> { + EventDispatcher.callCancellable(pickupItemEvent, () -> { final ItemStack item = itemEntity.getItemStack(); CollectItemPacket collectItemPacket = new CollectItemPacket(); @@ -305,7 +309,7 @@ public class LivingEntity extends Entity implements EquipmentHandler { } EntityDeathEvent entityDeathEvent = new EntityDeathEvent(this); - callEvent(EntityDeathEvent.class, entityDeathEvent); + EventDispatcher.call(entityDeathEvent); } /** @@ -329,7 +333,7 @@ public class LivingEntity extends Entity implements EquipmentHandler { // Do not start fire event if the fire needs to be removed (< 0 duration) if (duration > 0) { - callCancellableEvent(EntityFireEvent.class, entityFireEvent, () -> { + EventDispatcher.callCancellable(entityFireEvent, () -> { final long fireTime = entityFireEvent.getFireTime(TimeUnit.MILLISECOND); setOnFire(true); fireExtinguishTime = System.currentTimeMillis() + fireTime; @@ -354,7 +358,7 @@ public class LivingEntity extends Entity implements EquipmentHandler { } EntityDamageEvent entityDamageEvent = new EntityDamageEvent(this, type, value); - callCancellableEvent(EntityDamageEvent.class, entityDamageEvent, () -> { + EventDispatcher.callCancellable(entityDamageEvent, () -> { // Set the last damage type since the event is not cancelled this.lastDamageSource = entityDamageEvent.getDamageType(); @@ -602,7 +606,7 @@ public class LivingEntity extends Entity implements EquipmentHandler { public void setFlyingWithElytra(boolean isFlying) { this.entityMeta.setFlyingWithElytra(isFlying); } - + /** * Used to change the {@code isDead} internal field. * diff --git a/src/main/java/net/minestom/server/entity/Player.java b/src/main/java/net/minestom/server/entity/Player.java index 49bd4ec3f..5c1adf626 100644 --- a/src/main/java/net/minestom/server/entity/Player.java +++ b/src/main/java/net/minestom/server/entity/Player.java @@ -30,6 +30,7 @@ import net.minestom.server.effects.Effects; import net.minestom.server.entity.damage.DamageType; import net.minestom.server.entity.fakeplayer.FakePlayer; import net.minestom.server.entity.vehicle.PlayerVehicleInformation; +import net.minestom.server.event.EventDispatcher; import net.minestom.server.event.inventory.InventoryOpenEvent; import net.minestom.server.event.item.ItemDropEvent; import net.minestom.server.event.item.ItemUpdateStateEvent; @@ -38,14 +39,14 @@ import net.minestom.server.event.player.*; import net.minestom.server.instance.Chunk; import net.minestom.server.instance.Instance; import net.minestom.server.instance.block.CustomBlock; -import net.minestom.server.message.ChatMessageType; -import net.minestom.server.message.ChatPosition; import net.minestom.server.inventory.Inventory; import net.minestom.server.inventory.PlayerInventory; import net.minestom.server.item.ItemStack; import net.minestom.server.item.Material; import net.minestom.server.item.metadata.WrittenBookMeta; import net.minestom.server.listener.PlayerDiggingListener; +import net.minestom.server.message.ChatMessageType; +import net.minestom.server.message.ChatPosition; import net.minestom.server.message.Messenger; import net.minestom.server.network.ConnectionManager; import net.minestom.server.network.ConnectionState; @@ -250,7 +251,7 @@ public class Player extends LivingEntity implements CommandSender, Localizable, // Add player to list with spawning skin PlayerSkinInitEvent skinInitEvent = new PlayerSkinInitEvent(this, skin); - callEvent(PlayerSkinInitEvent.class, skinInitEvent); + EventDispatcher.call(skinInitEvent); this.skin = skinInitEvent.getSkin(); // FIXME: when using Geyser, this line remove the skin of the client playerConnection.sendPacket(getAddPlayerToList()); @@ -296,7 +297,7 @@ public class Player extends LivingEntity implements CommandSender, Localizable, TagsPacket tags = TagsPacket.getRequiredTagsPacket(); UpdateTagListEvent event = new UpdateTagListEvent(tags); - callEvent(UpdateTagListEvent.class, event); + EventDispatcher.call(event); this.playerConnection.sendPacket(tags); } @@ -388,7 +389,7 @@ public class Player extends LivingEntity implements CommandSender, Localizable, if (experienceOrb.shouldRemove() || experienceOrb.isRemoveScheduled()) continue; PickupExperienceEvent pickupExperienceEvent = new PickupExperienceEvent(experienceOrb); - callCancellableEvent(PickupExperienceEvent.class, pickupExperienceEvent, () -> { + EventDispatcher.callCancellable(pickupExperienceEvent, () -> { short experienceCount = pickupExperienceEvent.getExperienceCount(); // TODO give to player entity.remove(); }); @@ -414,7 +415,7 @@ public class Player extends LivingEntity implements CommandSender, Localizable, if (isFood) { PlayerEatEvent playerEatEvent = new PlayerEatEvent(this, foodItem, eatingHand); - callEvent(PlayerEatEvent.class, playerEatEvent); + EventDispatcher.call(playerEatEvent); } refreshEating(null); @@ -422,7 +423,7 @@ public class Player extends LivingEntity implements CommandSender, Localizable, } // Tick event - callEvent(PlayerTickEvent.class, playerTickEvent); + EventDispatcher.call(playerTickEvent); } @Override @@ -452,7 +453,7 @@ public class Player extends LivingEntity implements CommandSender, Localizable, // Call player death event PlayerDeathEvent playerDeathEvent = new PlayerDeathEvent(this, deathText, chatMessage); - callEvent(PlayerDeathEvent.class, playerDeathEvent); + EventDispatcher.call(playerDeathEvent); deathText = playerDeathEvent.getDeathText(); chatMessage = playerDeathEvent.getChatMessage(); @@ -489,7 +490,7 @@ public class Player extends LivingEntity implements CommandSender, Localizable, respawnPacket.isFlat = levelFlat; getPlayerConnection().sendPacket(respawnPacket); PlayerRespawnEvent respawnEvent = new PlayerRespawnEvent(this); - callEvent(PlayerRespawnEvent.class, respawnEvent); + EventDispatcher.call(respawnEvent); refreshIsDead(false); // Runnable called when teleportation is successful (after loading and sending necessary chunk) @@ -511,7 +512,7 @@ public class Player extends LivingEntity implements CommandSender, Localizable, if (isRemoved()) return; - callEvent(PlayerDisconnectEvent.class, new PlayerDisconnectEvent(this)); + EventDispatcher.call(new PlayerDisconnectEvent(this)); super.remove(); this.packets.clear(); @@ -669,7 +670,7 @@ public class Player extends LivingEntity implements CommandSender, Localizable, } PlayerSpawnEvent spawnEvent = new PlayerSpawnEvent(this, instance, firstSpawn); - callEvent(PlayerSpawnEvent.class, spawnEvent); + EventDispatcher.call(spawnEvent); } /** @@ -1333,7 +1334,7 @@ public class Player extends LivingEntity implements CommandSender, Localizable, } ItemDropEvent itemDropEvent = new ItemDropEvent(this, item); - callEvent(ItemDropEvent.class, itemDropEvent); + EventDispatcher.call(itemDropEvent); return !itemDropEvent.isCancelled(); } @@ -1860,7 +1861,7 @@ public class Player extends LivingEntity implements CommandSender, Localizable, InventoryOpenEvent inventoryOpenEvent = new InventoryOpenEvent(inventory, this); - callCancellableEvent(InventoryOpenEvent.class, inventoryOpenEvent, () -> { + EventDispatcher.callCancellable(inventoryOpenEvent, () -> { Inventory openInventory = getOpenInventory(); if (openInventory != null) { openInventory.removeViewer(this); @@ -2227,9 +2228,9 @@ public class Player extends LivingEntity implements CommandSender, Localizable, public void refreshOnGround(boolean onGround) { this.onGround = onGround; - if(this.onGround && this.isFlyingWithElytra()) { + if (this.onGround && this.isFlyingWithElytra()) { this.setFlyingWithElytra(false); - this.callEvent(PlayerStopFlyingWithElytraEvent.class, new PlayerStopFlyingWithElytraEvent(this)); + EventDispatcher.call(new PlayerStopFlyingWithElytraEvent(this)); } } @@ -2302,7 +2303,7 @@ public class Player extends LivingEntity implements CommandSender, Localizable, return null; ItemUpdateStateEvent itemUpdateStateEvent = new ItemUpdateStateEvent(this, hand, updatedItem); - callEvent(ItemUpdateStateEvent.class, itemUpdateStateEvent); + EventDispatcher.call(itemUpdateStateEvent); return itemUpdateStateEvent; } @@ -2676,7 +2677,7 @@ public class Player extends LivingEntity implements CommandSender, Localizable, * * @param locale the player locale * @param viewDistance the player view distance - * @param chatMessageType the chat messages the player wishes to receive + * @param chatMessageType the chat messages the player wishes to receive * @param chatColors if chat colors should be displayed * @param displayedSkinParts the player displayed skin parts * @param mainHand the player main hand diff --git a/src/main/java/net/minestom/server/entity/type/decoration/EntityArmorStand.java b/src/main/java/net/minestom/server/entity/type/decoration/EntityArmorStand.java index 121146e7b..0942c646f 100644 --- a/src/main/java/net/minestom/server/entity/type/decoration/EntityArmorStand.java +++ b/src/main/java/net/minestom/server/entity/type/decoration/EntityArmorStand.java @@ -1,6 +1,7 @@ package net.minestom.server.entity.type.decoration; import net.minestom.server.entity.*; +import net.minestom.server.event.EventDispatcher; import net.minestom.server.event.item.EntityEquipEvent; import net.minestom.server.inventory.EquipmentHandler; import net.minestom.server.item.ItemStack; @@ -237,7 +238,7 @@ public class EntityArmorStand extends ObjectEntity implements EquipmentHandler { private ItemStack getEquipmentItem(@NotNull ItemStack itemStack, @NotNull EquipmentSlot slot) { EntityEquipEvent entityEquipEvent = new EntityEquipEvent(this, itemStack, slot); - callEvent(EntityEquipEvent.class, entityEquipEvent); + EventDispatcher.call(entityEquipEvent); return entityEquipEvent.getEquippedItem(); } } diff --git a/src/main/java/net/minestom/server/entity/type/projectile/EntityProjectile.java b/src/main/java/net/minestom/server/entity/type/projectile/EntityProjectile.java index 06576788c..1e5227d79 100644 --- a/src/main/java/net/minestom/server/entity/type/projectile/EntityProjectile.java +++ b/src/main/java/net/minestom/server/entity/type/projectile/EntityProjectile.java @@ -4,6 +4,7 @@ import net.minestom.server.entity.Entity; import net.minestom.server.entity.EntityType; import net.minestom.server.entity.LivingEntity; import net.minestom.server.entity.metadata.ProjectileMeta; +import net.minestom.server.event.EventDispatcher; import net.minestom.server.event.entity.EntityAttackEvent; import net.minestom.server.event.entity.EntityShootEvent; import net.minestom.server.instance.Chunk; @@ -71,14 +72,14 @@ public class EntityProjectile extends Entity { } public void shoot(Position to, double power, double spread) { - EntityShootEvent event = new EntityShootEvent(this.shooter, this, to, power, spread); - this.shooter.callEvent(EntityShootEvent.class, event); - if (event.isCancelled()) { + EntityShootEvent shootEvent = new EntityShootEvent(this.shooter, this, to, power, spread); + EventDispatcher.call(shootEvent); + if (shootEvent.isCancelled()) { remove(); return; } Position from = this.shooter.getPosition().clone().add(0D, this.shooter.getEyeHeight(), 0D); - shoot(from, to, event.getPower(), event.getSpread()); + shoot(from, to, shootEvent.getPower(), shootEvent.getSpread()); } private void shoot(@NotNull Position from, @NotNull Position to, double power, double spread) { @@ -193,7 +194,7 @@ public class EntityProjectile extends Entity { if (victimOptional.isPresent()) { LivingEntity victim = (LivingEntity) victimOptional.get(); victim.setArrowCount(victim.getArrowCount() + 1); - callEvent(EntityAttackEvent.class, new EntityAttackEvent(this, victim)); + EventDispatcher.call(new EntityAttackEvent(this, victim)); remove(); return super.onGround; } diff --git a/src/main/java/net/minestom/server/event/EventDispatcher.java b/src/main/java/net/minestom/server/event/EventDispatcher.java new file mode 100644 index 000000000..83de820ee --- /dev/null +++ b/src/main/java/net/minestom/server/event/EventDispatcher.java @@ -0,0 +1,15 @@ +package net.minestom.server.event; + +import net.minestom.server.MinecraftServer; +import org.jetbrains.annotations.NotNull; + +public class EventDispatcher { + + public static void call(@NotNull Event event) { + MinecraftServer.getGlobalEventNode().call(event); + } + + public static void callCancellable(@NotNull CancellableEvent event, @NotNull Runnable successCallback) { + MinecraftServer.getGlobalEventNode().callCancellable(event, successCallback); + } +} diff --git a/src/main/java/net/minestom/server/event/EventNode.java b/src/main/java/net/minestom/server/event/EventNode.java index f5c052ec3..e8c212fbd 100644 --- a/src/main/java/net/minestom/server/event/EventNode.java +++ b/src/main/java/net/minestom/server/event/EventNode.java @@ -58,6 +58,7 @@ public class EventNode { protected final EventFilter filter; protected final BiPredicate predicate; + protected final Class eventType; private volatile String name = "unknown"; // Tree data @@ -69,6 +70,7 @@ public class EventNode { protected EventNode(EventFilter filter, BiPredicate predicate) { this.filter = filter; this.predicate = predicate; + this.eventType = filter.getEventType(); } /** @@ -84,7 +86,7 @@ public class EventNode { public void call(@NotNull T event) { final var eventClass = event.getClass(); - if (!filter.getEventType().isAssignableFrom(eventClass)) { + if (!eventType.isAssignableFrom(eventClass)) { // Invalid event type return; } @@ -121,6 +123,29 @@ public class EventNode { this.children.forEach(eventNode -> eventNode.call(event)); } + public void callCancellable(@NotNull T event, @NotNull Runnable successCallback) { + call(event); + if (!(event instanceof CancellableEvent) || !((CancellableEvent) event).isCancelled()) { + successCallback.run(); + } + } + + public @Nullable EventNode getParent() { + return parent; + } + + public @NotNull Set<@NotNull EventNode> getChildren() { + return Collections.unmodifiableSet(children); + } + + public @NotNull EventNode findChild(@NotNull String name, Class eventType) { + return null; + } + + public @NotNull EventNode findChild(@NotNull String name) { + return findChild(name, eventType); + } + public EventNode addChild(@NotNull EventNode child) { synchronized (GLOBAL_CHILD_LOCK) { Check.stateCondition(child.parent != null, "Node already has a parent"); @@ -210,14 +235,6 @@ public class EventNode { return this; } - public @Nullable EventNode getParent() { - return parent; - } - - public @NotNull Set<@NotNull EventNode> getChildren() { - return Collections.unmodifiableSet(children); - } - private void increaseListenerCount(Class eventClass, int count) { final int current = childEventMap.getInt(eventClass); final int result = current + count; diff --git a/src/main/java/net/minestom/server/event/handler/EventHandler.java b/src/main/java/net/minestom/server/event/handler/EventHandler.java index 36d19851d..e3526c416 100644 --- a/src/main/java/net/minestom/server/event/handler/EventHandler.java +++ b/src/main/java/net/minestom/server/event/handler/EventHandler.java @@ -1,14 +1,10 @@ package net.minestom.server.event.handler; import net.minestom.server.MinecraftServer; -import net.minestom.server.entity.Entity; -import net.minestom.server.event.CancellableEvent; import net.minestom.server.event.Event; import net.minestom.server.event.EventCallback; -import net.minestom.server.event.GlobalEventHandler; import net.minestom.server.extensions.IExtensionObserver; import net.minestom.server.extras.selfmodification.MinestomRootClassLoader; -import net.minestom.server.instance.Instance; import org.jetbrains.annotations.NotNull; import java.util.Collection; @@ -48,7 +44,7 @@ public interface EventHandler extends IExtensionObserver { */ default boolean addEventCallback(@NotNull Class eventClass, @NotNull EventCallback eventCallback) { String extensionSource = MinestomRootClassLoader.findExtensionObjectOwner(eventCallback); - if(extensionSource != null) { + if (extensionSource != null) { MinecraftServer.getExtensionManager().getExtension(extensionSource).observe(this); getExtensionCallbacks(extensionSource).add(eventCallback); } @@ -68,7 +64,7 @@ public interface EventHandler extends IExtensionObserver { default boolean removeEventCallback(@NotNull Class eventClass, @NotNull EventCallback eventCallback) { Collection callbacks = getEventCallbacks(eventClass); String extensionSource = MinestomRootClassLoader.findExtensionObjectOwner(eventCallback); - if(extensionSource != null) { + if (extensionSource != null) { getExtensionCallbacks(extensionSource).remove(eventCallback); } @@ -97,72 +93,18 @@ public interface EventHandler extends IExtensionObserver { return getEventCallbacksMap().values().stream().flatMap(Collection::stream); } - /** - * Calls the specified {@link Event} with all the assigned {@link EventCallback}. - *

- * Events are always called in the current thread. - * - * @param eventClass the event class - * @param event the event object - * @param the event type - */ - default void callEvent(@NotNull Class eventClass, @NotNull E event) { - - try { - - // Global listeners - if (!(this instanceof GlobalEventHandler)) { - final GlobalEventHandler globalEventHandler = MinecraftServer.getGlobalEventHandler(); - runEvent(globalEventHandler.getEventCallbacks(eventClass), event); - } - - // Local listeners - final Collection eventCallbacks = getEventCallbacks(eventClass); - runEvent(eventCallbacks, event); - - // Call the same event for the current entity instance - if (this instanceof Entity) { - final Instance instance = ((Entity) this).getInstance(); - if (instance != null) { - runEvent(instance.getEventCallbacks(eventClass), event); - } - } - } catch (Exception exception) { - MinecraftServer.getExceptionManager().handleException(exception); - } - } - - /** - * Calls a {@link CancellableEvent} and execute {@code successCallback} if the {@link Event} is not cancelled. - *

- * Does call {@link #callEvent(Class, Event)} internally. - * - * @param eventClass the event class - * @param event the event object - * @param successCallback the callback called when the event is not cancelled - * @param the event type - * @see #callEvent(Class, Event) - */ - default void callCancellableEvent(@NotNull Class eventClass, - @NotNull E event, - @NotNull Runnable successCallback) { - callEvent(eventClass, event); - if (!event.isCancelled()) { - successCallback.run(); - } - } - /** * Remove all event callbacks owned by the given extension + * * @param extension the extension to remove callbacks from */ default void removeCallbacksOwnedByExtension(String extension) { Collection> extensionCallbacks = getExtensionCallbacks(extension); - for(EventCallback callback : extensionCallbacks) { + for (EventCallback callback : extensionCallbacks) { // try to remove this callback from all callback collections // we do this because we do not have information about the event class at this point - for(Collection eventCallbacks : getEventCallbacksMap().values()) { + for (Collection eventCallbacks : getEventCallbacksMap().values()) { eventCallbacks.remove(callback); } } diff --git a/src/main/java/net/minestom/server/extras/lan/OpenToLAN.java b/src/main/java/net/minestom/server/extras/lan/OpenToLAN.java index 247852250..85a713ea8 100644 --- a/src/main/java/net/minestom/server/extras/lan/OpenToLAN.java +++ b/src/main/java/net/minestom/server/extras/lan/OpenToLAN.java @@ -1,6 +1,7 @@ package net.minestom.server.extras.lan; import net.minestom.server.MinecraftServer; +import net.minestom.server.event.EventDispatcher; import net.minestom.server.event.server.ServerListPingEvent; import net.minestom.server.timer.Task; import net.minestom.server.utils.NetworkUtils; @@ -25,6 +26,7 @@ import static net.minestom.server.ping.ServerListPingType.OPEN_TO_LAN; * Instead it simply sends the packets needed to trick the Minecraft client into thinking * that this is a single-player world that has been opened to LANfor it to be displayed on * the bottom of the server list. + * * @see wiki.vg */ public class OpenToLAN { @@ -37,7 +39,8 @@ public class OpenToLAN { private static volatile DatagramPacket packet = null; private static volatile Task task = null; - private OpenToLAN() { } + private OpenToLAN() { + } /** * Opens the server to LAN with the default config. @@ -121,7 +124,7 @@ public class OpenToLAN { if (MinecraftServer.getNettyServer().getPort() != 0) { if (packet == null || eventCooldown.isReady(System.currentTimeMillis())) { final ServerListPingEvent event = new ServerListPingEvent(OPEN_TO_LAN); - MinecraftServer.getGlobalEventHandler().callEvent(ServerListPingEvent.class, event); + EventDispatcher.call(event); final byte[] data = OPEN_TO_LAN.getPingResponse(event.getResponseData()).getBytes(StandardCharsets.UTF_8); packet = new DatagramPacket(data, data.length, PING_ADDRESS); diff --git a/src/main/java/net/minestom/server/extras/query/Query.java b/src/main/java/net/minestom/server/extras/query/Query.java index 5d301aca2..a99225607 100644 --- a/src/main/java/net/minestom/server/extras/query/Query.java +++ b/src/main/java/net/minestom/server/extras/query/Query.java @@ -6,6 +6,7 @@ import it.unimi.dsi.fastutil.ints.Int2ObjectMap; import it.unimi.dsi.fastutil.ints.Int2ObjectMaps; import it.unimi.dsi.fastutil.ints.Int2ObjectOpenHashMap; import net.minestom.server.MinecraftServer; +import net.minestom.server.event.EventDispatcher; import net.minestom.server.extras.query.event.BasicQueryEvent; import net.minestom.server.extras.query.event.FullQueryEvent; import net.minestom.server.timer.Task; @@ -28,6 +29,7 @@ import java.util.Random; /** * Utility class to manage responses to the GameSpy4 Query Protocol. + * * @see wiki.vg */ public class Query { @@ -41,7 +43,8 @@ public class Query { private static volatile Thread thread; private static volatile Task task; - private Query() { } + private Query() { + } /** * Starts the query system, responding to queries on a random port, logging if it could not be started. @@ -190,12 +193,12 @@ public class Query { if (remaining == 0) { // basic BasicQueryEvent event = new BasicQueryEvent(sender, sessionID); - MinecraftServer.getGlobalEventHandler().callCancellableEvent(BasicQueryEvent.class, event, - () -> sendResponse(event.getQueryResponse(), sessionID, sender)); + EventDispatcher.callCancellable(event, () -> + sendResponse(event.getQueryResponse(), sessionID, sender)); } else if (remaining == 5) { // full FullQueryEvent event = new FullQueryEvent(sender, sessionID); - MinecraftServer.getGlobalEventHandler().callCancellableEvent(FullQueryEvent.class, event, - () -> sendResponse(event.getQueryResponse(), sessionID, sender)); + EventDispatcher.callCancellable(event, () -> + sendResponse(event.getQueryResponse(), sessionID, sender)); } } } diff --git a/src/main/java/net/minestom/server/instance/Chunk.java b/src/main/java/net/minestom/server/instance/Chunk.java index 53987e804..b2d1d76b5 100644 --- a/src/main/java/net/minestom/server/instance/Chunk.java +++ b/src/main/java/net/minestom/server/instance/Chunk.java @@ -7,6 +7,7 @@ import net.minestom.server.data.Data; import net.minestom.server.data.DataContainer; import net.minestom.server.entity.Player; import net.minestom.server.entity.pathfinding.PFColumnarSpace; +import net.minestom.server.event.EventDispatcher; import net.minestom.server.event.player.PlayerChunkLoadEvent; import net.minestom.server.event.player.PlayerChunkUnloadEvent; import net.minestom.server.instance.block.Block; @@ -417,10 +418,10 @@ public abstract class Chunk implements Viewable, Tickable, DataContainer { UpdateLightPacket updateLightPacket = new UpdateLightPacket(getIdentifier(), getLastChangeTime()); updateLightPacket.chunkX = getChunkX(); updateLightPacket.chunkZ = getChunkZ(); - updateLightPacket.skyLightMask = 0b111111111111111111; - updateLightPacket.emptySkyLightMask = 0b000000000000000000; - updateLightPacket.blockLightMask = 0b000000000000000000; - updateLightPacket.emptyBlockLightMask = 0b111111111111111111; + updateLightPacket.skyLightMask = 0b111111111111111111; + updateLightPacket.emptySkyLightMask = 0b000000000000000000; + updateLightPacket.blockLightMask = 0b000000000000000000; + updateLightPacket.emptyBlockLightMask = 0b111111111111111111; byte[] bytes = new byte[2048]; Arrays.fill(bytes, (byte) 0xFF); final List temp = new ArrayList<>(18); @@ -466,7 +467,7 @@ public abstract class Chunk implements Viewable, Tickable, DataContainer { if (result) { PlayerChunkLoadEvent playerChunkLoadEvent = new PlayerChunkLoadEvent(player, chunkX, chunkZ); - player.callEvent(PlayerChunkLoadEvent.class, playerChunkLoadEvent); + EventDispatcher.call(playerChunkLoadEvent); } return result; @@ -488,7 +489,7 @@ public abstract class Chunk implements Viewable, Tickable, DataContainer { if (result) { PlayerChunkUnloadEvent playerChunkUnloadEvent = new PlayerChunkUnloadEvent(player, chunkX, chunkZ); - player.callEvent(PlayerChunkUnloadEvent.class, playerChunkUnloadEvent); + EventDispatcher.call(playerChunkUnloadEvent); } return result; diff --git a/src/main/java/net/minestom/server/instance/Instance.java b/src/main/java/net/minestom/server/instance/Instance.java index 5392143fa..31dab30d1 100644 --- a/src/main/java/net/minestom/server/instance/Instance.java +++ b/src/main/java/net/minestom/server/instance/Instance.java @@ -14,6 +14,7 @@ import net.minestom.server.entity.Player; import net.minestom.server.entity.pathfinding.PFInstanceSpace; import net.minestom.server.event.Event; import net.minestom.server.event.EventCallback; +import net.minestom.server.event.EventDispatcher; import net.minestom.server.event.handler.EventHandler; import net.minestom.server.event.instance.AddEntityToInstanceEvent; import net.minestom.server.event.instance.InstanceTickEvent; @@ -862,7 +863,7 @@ public abstract class Instance implements BlockModifier, Tickable, EventHandler, lastInstance.UNSAFE_removeEntity(entity); // If entity is in another instance, remove it from there and add it to this } AddEntityToInstanceEvent event = new AddEntityToInstanceEvent(this, entity); - callCancellableEvent(AddEntityToInstanceEvent.class, event, () -> { + EventDispatcher.callCancellable(event, () -> { final Position entityPosition = entity.getPosition(); final boolean isPlayer = entity instanceof Player; @@ -907,7 +908,7 @@ public abstract class Instance implements BlockModifier, Tickable, EventHandler, return; RemoveEntityFromInstanceEvent event = new RemoveEntityFromInstanceEvent(this, entity); - callCancellableEvent(RemoveEntityFromInstanceEvent.class, event, () -> { + EventDispatcher.callCancellable(event, () -> { // Remove this entity from players viewable list and send delete entities packet entity.getViewers().forEach(entity::removeViewer); @@ -1039,7 +1040,7 @@ public abstract class Instance implements BlockModifier, Tickable, EventHandler, { // Process tick events InstanceTickEvent chunkTickEvent = new InstanceTickEvent(this, time, lastTickAge); - callEvent(InstanceTickEvent.class, chunkTickEvent); + EventDispatcher.call(chunkTickEvent); // Set last tick age lastTickAge = time; diff --git a/src/main/java/net/minestom/server/instance/InstanceContainer.java b/src/main/java/net/minestom/server/instance/InstanceContainer.java index a744f210a..8d6e511f6 100644 --- a/src/main/java/net/minestom/server/instance/InstanceContainer.java +++ b/src/main/java/net/minestom/server/instance/InstanceContainer.java @@ -4,6 +4,7 @@ import net.minestom.server.MinecraftServer; import net.minestom.server.data.Data; import net.minestom.server.data.SerializableData; import net.minestom.server.entity.Player; +import net.minestom.server.event.EventDispatcher; import net.minestom.server.event.instance.InstanceChunkLoadEvent; import net.minestom.server.event.instance.InstanceChunkUnloadEvent; import net.minestom.server.event.player.PlayerBlockBreakEvent; @@ -384,7 +385,7 @@ public class InstanceContainer extends Instance { final CustomBlock customBlock = getCustomBlock(x, y, z); PlayerBlockBreakEvent blockBreakEvent = new PlayerBlockBreakEvent(player, blockPosition, blockStateId, customBlock, (short) 0, (short) 0); - player.callEvent(PlayerBlockBreakEvent.class, blockBreakEvent); + EventDispatcher.call(blockBreakEvent); final boolean allowed = !blockBreakEvent.isCancelled(); if (allowed) { // Break or change the broken block based on event result @@ -835,11 +836,11 @@ public class InstanceContainer extends Instance { private void callChunkLoadEvent(int chunkX, int chunkZ) { InstanceChunkLoadEvent chunkLoadEvent = new InstanceChunkLoadEvent(this, chunkX, chunkZ); - callEvent(InstanceChunkLoadEvent.class, chunkLoadEvent); + EventDispatcher.call(chunkLoadEvent); } private void callChunkUnloadEvent(int chunkX, int chunkZ) { InstanceChunkUnloadEvent chunkUnloadEvent = new InstanceChunkUnloadEvent(this, chunkX, chunkZ); - callEvent(InstanceChunkUnloadEvent.class, chunkUnloadEvent); + EventDispatcher.call(chunkUnloadEvent); } } \ No newline at end of file diff --git a/src/main/java/net/minestom/server/inventory/InventoryClickHandler.java b/src/main/java/net/minestom/server/inventory/InventoryClickHandler.java index 03c588a7a..60151dad5 100644 --- a/src/main/java/net/minestom/server/inventory/InventoryClickHandler.java +++ b/src/main/java/net/minestom/server/inventory/InventoryClickHandler.java @@ -1,6 +1,7 @@ package net.minestom.server.inventory; import net.minestom.server.entity.Player; +import net.minestom.server.event.EventDispatcher; import net.minestom.server.event.inventory.InventoryClickEvent; import net.minestom.server.inventory.click.ClickType; import net.minestom.server.item.ItemStack; @@ -78,7 +79,7 @@ public interface InventoryClickHandler { default void callClickEvent(@NotNull Player player, Inventory inventory, int slot, @NotNull ClickType clickType, @NotNull ItemStack clicked, @NotNull ItemStack cursor) { InventoryClickEvent inventoryClickEvent = new InventoryClickEvent(inventory, player, slot, clickType, clicked, cursor); - player.callEvent(InventoryClickEvent.class, inventoryClickEvent); + EventDispatcher.call(inventoryClickEvent); } } diff --git a/src/main/java/net/minestom/server/inventory/PlayerInventory.java b/src/main/java/net/minestom/server/inventory/PlayerInventory.java index a4723b8fd..512046eab 100644 --- a/src/main/java/net/minestom/server/inventory/PlayerInventory.java +++ b/src/main/java/net/minestom/server/inventory/PlayerInventory.java @@ -2,6 +2,7 @@ package net.minestom.server.inventory; import net.minestom.server.entity.EquipmentSlot; import net.minestom.server.entity.Player; +import net.minestom.server.event.EventDispatcher; import net.minestom.server.event.item.EntityEquipEvent; import net.minestom.server.inventory.click.ClickType; import net.minestom.server.inventory.click.InventoryClickResult; @@ -189,7 +190,7 @@ public class PlayerInventory extends AbstractInventory implements EquipmentHandl if (equipmentSlot != null) { EntityEquipEvent entityEquipEvent = new EntityEquipEvent(player, itemStack, equipmentSlot); - player.callEvent(EntityEquipEvent.class, entityEquipEvent); + EventDispatcher.call(entityEquipEvent); itemStack = entityEquipEvent.getEquippedItem(); } diff --git a/src/main/java/net/minestom/server/inventory/click/InventoryClickProcessor.java b/src/main/java/net/minestom/server/inventory/click/InventoryClickProcessor.java index df23a86bf..5d08ca3c5 100644 --- a/src/main/java/net/minestom/server/inventory/click/InventoryClickProcessor.java +++ b/src/main/java/net/minestom/server/inventory/click/InventoryClickProcessor.java @@ -4,6 +4,7 @@ import it.unimi.dsi.fastutil.ints.Int2ObjectFunction; import it.unimi.dsi.fastutil.ints.IntOpenHashSet; import it.unimi.dsi.fastutil.ints.IntSet; import net.minestom.server.entity.Player; +import net.minestom.server.event.EventDispatcher; import net.minestom.server.event.inventory.InventoryClickEvent; import net.minestom.server.event.inventory.InventoryPreClickEvent; import net.minestom.server.inventory.AbstractInventory; @@ -187,7 +188,7 @@ public class InventoryClickProcessor { var pair = TransactionType.ADD.process(targetInventory, clicked, (index, itemStack) -> { InventoryClickResult result = startCondition(targetInventory, player, index, ClickType.SHIFT_CLICK, itemStack, cursor); - if(result.isCancel()){ + if (result.isCancel()) { clickResult.setRefresh(true); return false; } @@ -214,7 +215,7 @@ public class InventoryClickProcessor { if (index == slot) // Prevent item lose/duplication return false; InventoryClickResult result = startCondition(targetInventory, player, index, ClickType.SHIFT_CLICK, itemStack, cursor); - if(result.isCancel()){ + if (result.isCancel()) { clickResult.setRefresh(true); return false; } @@ -509,7 +510,7 @@ public class InventoryClickProcessor { { InventoryPreClickEvent inventoryPreClickEvent = new InventoryPreClickEvent(inventory, player, slot, clickType, clickResult.getClicked(), clickResult.getCursor()); - player.callEvent(InventoryPreClickEvent.class, inventoryPreClickEvent); + EventDispatcher.call(inventoryPreClickEvent); clickResult.setCursor(inventoryPreClickEvent.getCursorItem()); clickResult.setClicked(inventoryPreClickEvent.getClickedItem()); @@ -565,7 +566,7 @@ public class InventoryClickProcessor { private void callClickEvent(@NotNull Player player, @Nullable Inventory inventory, int slot, @NotNull ClickType clickType, @NotNull ItemStack clicked, @NotNull ItemStack cursor) { InventoryClickEvent inventoryClickEvent = new InventoryClickEvent(inventory, player, slot, clickType, clicked, cursor); - player.callEvent(InventoryClickEvent.class, inventoryClickEvent); + EventDispatcher.call(inventoryClickEvent); } public void clearCache(@NotNull Player player) { diff --git a/src/main/java/net/minestom/server/listener/AbilitiesListener.java b/src/main/java/net/minestom/server/listener/AbilitiesListener.java index aa71a60bc..c2894465d 100644 --- a/src/main/java/net/minestom/server/listener/AbilitiesListener.java +++ b/src/main/java/net/minestom/server/listener/AbilitiesListener.java @@ -1,6 +1,7 @@ package net.minestom.server.listener; import net.minestom.server.entity.Player; +import net.minestom.server.event.EventDispatcher; import net.minestom.server.event.player.PlayerStartFlyingEvent; import net.minestom.server.event.player.PlayerStopFlyingEvent; import net.minestom.server.network.packet.client.play.ClientPlayerAbilitiesPacket; @@ -17,10 +18,10 @@ public class AbilitiesListener { if (isFlying) { PlayerStartFlyingEvent startFlyingEvent = new PlayerStartFlyingEvent(player); - player.callEvent(PlayerStartFlyingEvent.class, startFlyingEvent); + EventDispatcher.call(startFlyingEvent); } else { PlayerStopFlyingEvent stopFlyingEvent = new PlayerStopFlyingEvent(player); - player.callEvent(PlayerStopFlyingEvent.class, stopFlyingEvent); + EventDispatcher.call(stopFlyingEvent); } } } diff --git a/src/main/java/net/minestom/server/listener/AdvancementTabListener.java b/src/main/java/net/minestom/server/listener/AdvancementTabListener.java index 1802f6732..5e917f7ae 100644 --- a/src/main/java/net/minestom/server/listener/AdvancementTabListener.java +++ b/src/main/java/net/minestom/server/listener/AdvancementTabListener.java @@ -2,6 +2,7 @@ package net.minestom.server.listener; import net.minestom.server.advancements.AdvancementAction; import net.minestom.server.entity.Player; +import net.minestom.server.event.EventDispatcher; import net.minestom.server.event.player.AdvancementTabEvent; import net.minestom.server.network.packet.client.play.ClientAdvancementTabPacket; @@ -12,6 +13,6 @@ public class AdvancementTabListener { final String tabId = packet.tabIdentifier; AdvancementTabEvent advancementTabEvent = new AdvancementTabEvent(player, action, tabId); - player.callEvent(AdvancementTabEvent.class, advancementTabEvent); + EventDispatcher.call(advancementTabEvent); } } diff --git a/src/main/java/net/minestom/server/listener/AnimationListener.java b/src/main/java/net/minestom/server/listener/AnimationListener.java index c40511a3b..6058e7b45 100644 --- a/src/main/java/net/minestom/server/listener/AnimationListener.java +++ b/src/main/java/net/minestom/server/listener/AnimationListener.java @@ -1,6 +1,7 @@ package net.minestom.server.listener; import net.minestom.server.entity.Player; +import net.minestom.server.event.EventDispatcher; import net.minestom.server.event.player.PlayerHandAnimationEvent; import net.minestom.server.item.ItemStack; import net.minestom.server.network.packet.client.play.ClientAnimationPacket; @@ -12,7 +13,7 @@ public class AnimationListener { final ItemStack itemStack = player.getItemInHand(hand); //itemStack.onLeftClick(player, hand); PlayerHandAnimationEvent handAnimationEvent = new PlayerHandAnimationEvent(player, hand); - player.callCancellableEvent(PlayerHandAnimationEvent.class, handAnimationEvent, () -> { + EventDispatcher.callCancellable(handAnimationEvent, () -> { switch (hand) { case MAIN: player.swingMainHand(); diff --git a/src/main/java/net/minestom/server/listener/BlockPlacementListener.java b/src/main/java/net/minestom/server/listener/BlockPlacementListener.java index 2eab9562a..79c2d4cd0 100644 --- a/src/main/java/net/minestom/server/listener/BlockPlacementListener.java +++ b/src/main/java/net/minestom/server/listener/BlockPlacementListener.java @@ -6,6 +6,7 @@ import net.minestom.server.entity.Entity; import net.minestom.server.entity.EntityType; import net.minestom.server.entity.GameMode; import net.minestom.server.entity.Player; +import net.minestom.server.event.EventDispatcher; import net.minestom.server.event.player.PlayerBlockInteractEvent; import net.minestom.server.event.player.PlayerBlockPlaceEvent; import net.minestom.server.event.player.PlayerUseItemOnBlockEvent; @@ -57,7 +58,7 @@ public class BlockPlacementListener { PlayerBlockInteractEvent playerBlockInteractEvent = new PlayerBlockInteractEvent(player, blockPosition, hand, blockFace); playerBlockInteractEvent.setCancelled(cancel); playerBlockInteractEvent.setBlockingItemUse(cancel); - player.callCancellableEvent(PlayerBlockInteractEvent.class, playerBlockInteractEvent, () -> { + EventDispatcher.callCancellable(playerBlockInteractEvent, () -> { final CustomBlock customBlock = instance.getCustomBlock(blockPosition); if (customBlock != null) { final Data data = instance.getBlockData(blockPosition); @@ -146,7 +147,7 @@ public class BlockPlacementListener { PlayerBlockPlaceEvent playerBlockPlaceEvent = new PlayerBlockPlaceEvent(player, block, blockPosition, packet.hand); playerBlockPlaceEvent.consumeBlock(player.getGameMode() != GameMode.CREATIVE); - player.callEvent(PlayerBlockPlaceEvent.class, playerBlockPlaceEvent); + EventDispatcher.call(playerBlockPlaceEvent); if (!playerBlockPlaceEvent.isCancelled()) { // BlockPlacementRule check @@ -189,7 +190,7 @@ public class BlockPlacementListener { // Player didn't try to place a block but interacted with one final BlockPosition usePosition = blockPosition.clone().subtract(offsetX, offsetY, offsetZ); PlayerUseItemOnBlockEvent event = new PlayerUseItemOnBlockEvent(player, hand, usedItem, usePosition, direction); - player.callEvent(PlayerUseItemOnBlockEvent.class, event); + EventDispatcher.call(event); refreshChunk = true; } diff --git a/src/main/java/net/minestom/server/listener/ChatMessageListener.java b/src/main/java/net/minestom/server/listener/ChatMessageListener.java index cc1f491df..bc251f7a5 100644 --- a/src/main/java/net/minestom/server/listener/ChatMessageListener.java +++ b/src/main/java/net/minestom/server/listener/ChatMessageListener.java @@ -5,6 +5,7 @@ import net.kyori.adventure.text.event.ClickEvent; import net.minestom.server.MinecraftServer; import net.minestom.server.command.CommandManager; import net.minestom.server.entity.Player; +import net.minestom.server.event.EventDispatcher; import net.minestom.server.event.player.PlayerChatEvent; import net.minestom.server.message.ChatPosition; import net.minestom.server.message.Messenger; @@ -49,7 +50,7 @@ public class ChatMessageListener { PlayerChatEvent playerChatEvent = new PlayerChatEvent(player, players, () -> buildDefaultChatMessage(player, message), message); // Call the event - player.callCancellableEvent(PlayerChatEvent.class, playerChatEvent, () -> { + EventDispatcher.callCancellable(playerChatEvent, () -> { final Function formatFunction = playerChatEvent.getChatFormatFunction(); Component textObject; diff --git a/src/main/java/net/minestom/server/listener/EntityActionListener.java b/src/main/java/net/minestom/server/listener/EntityActionListener.java index dea235c90..7ca503080 100644 --- a/src/main/java/net/minestom/server/listener/EntityActionListener.java +++ b/src/main/java/net/minestom/server/listener/EntityActionListener.java @@ -1,6 +1,7 @@ package net.minestom.server.listener; import net.minestom.server.entity.Player; +import net.minestom.server.event.EventDispatcher; import net.minestom.server.event.player.*; import net.minestom.server.network.packet.client.play.ClientEntityActionPacket; @@ -35,9 +36,9 @@ public class EntityActionListener { if (oldState != sneaking) { if (sneaking) { - player.callEvent(PlayerStartSneakingEvent.class, new PlayerStartSneakingEvent(player)); + EventDispatcher.call(new PlayerStartSneakingEvent(player)); } else { - player.callEvent(PlayerStopSneakingEvent.class, new PlayerStopSneakingEvent(player)); + EventDispatcher.call(new PlayerStopSneakingEvent(player)); } } } @@ -49,15 +50,15 @@ public class EntityActionListener { if (oldState != sprinting) { if (sprinting) { - player.callEvent(PlayerStartSprintingEvent.class, new PlayerStartSprintingEvent(player)); + EventDispatcher.call(new PlayerStartSprintingEvent(player)); } else { - player.callEvent(PlayerStopSprintingEvent.class, new PlayerStopSprintingEvent(player)); + EventDispatcher.call(new PlayerStopSprintingEvent(player)); } } } private static void startFlyingElytra(Player player) { player.setFlyingWithElytra(true); - player.callEvent(PlayerStartFlyingWithElytraEvent.class, new PlayerStartFlyingWithElytraEvent(player)); + EventDispatcher.call(new PlayerStartFlyingWithElytraEvent(player)); } } diff --git a/src/main/java/net/minestom/server/listener/PlayerDiggingListener.java b/src/main/java/net/minestom/server/listener/PlayerDiggingListener.java index 351c78bac..04f03483e 100644 --- a/src/main/java/net/minestom/server/listener/PlayerDiggingListener.java +++ b/src/main/java/net/minestom/server/listener/PlayerDiggingListener.java @@ -2,6 +2,7 @@ package net.minestom.server.listener; import net.minestom.server.entity.GameMode; import net.minestom.server.entity.Player; +import net.minestom.server.event.EventDispatcher; import net.minestom.server.event.item.ItemUpdateStateEvent; import net.minestom.server.event.player.PlayerStartDiggingEvent; import net.minestom.server.event.player.PlayerSwapItemEvent; @@ -67,7 +68,7 @@ public class PlayerDiggingListener { final int customBlockId = customBlock == null ? 0 : customBlock.getCustomBlockId(); PlayerStartDiggingEvent playerStartDiggingEvent = new PlayerStartDiggingEvent(player, blockPosition, blockStateId, customBlockId); - player.callEvent(PlayerStartDiggingEvent.class, playerStartDiggingEvent); + EventDispatcher.call(playerStartDiggingEvent); if (playerStartDiggingEvent.isCancelled()) { addEffect(player); @@ -159,7 +160,7 @@ public class PlayerDiggingListener { final ItemStack offHand = playerInventory.getItemInOffHand(); PlayerSwapItemEvent swapItemEvent = new PlayerSwapItemEvent(player, offHand, mainHand); - player.callCancellableEvent(PlayerSwapItemEvent.class, swapItemEvent, () -> { + EventDispatcher.callCancellable(swapItemEvent, () -> { playerInventory.setItemInMainHand(swapItemEvent.getMainHandItem()); playerInventory.setItemInOffHand(swapItemEvent.getOffHandItem()); }); diff --git a/src/main/java/net/minestom/server/listener/PlayerHeldListener.java b/src/main/java/net/minestom/server/listener/PlayerHeldListener.java index 7bd713ac1..196df6c24 100644 --- a/src/main/java/net/minestom/server/listener/PlayerHeldListener.java +++ b/src/main/java/net/minestom/server/listener/PlayerHeldListener.java @@ -1,6 +1,7 @@ package net.minestom.server.listener; import net.minestom.server.entity.Player; +import net.minestom.server.event.EventDispatcher; import net.minestom.server.event.player.PlayerChangeHeldSlotEvent; import net.minestom.server.network.packet.client.play.ClientHeldItemChangePacket; import net.minestom.server.utils.MathUtils; @@ -16,7 +17,7 @@ public class PlayerHeldListener { final byte slot = (byte) packet.slot; PlayerChangeHeldSlotEvent changeHeldSlotEvent = new PlayerChangeHeldSlotEvent(player, slot); - player.callEvent(PlayerChangeHeldSlotEvent.class, changeHeldSlotEvent); + EventDispatcher.call(changeHeldSlotEvent); if (!changeHeldSlotEvent.isCancelled()) { // Event hasn't been canceled, process it diff --git a/src/main/java/net/minestom/server/listener/PlayerPositionListener.java b/src/main/java/net/minestom/server/listener/PlayerPositionListener.java index aea47ba8b..aadbe5a17 100644 --- a/src/main/java/net/minestom/server/listener/PlayerPositionListener.java +++ b/src/main/java/net/minestom/server/listener/PlayerPositionListener.java @@ -1,6 +1,7 @@ package net.minestom.server.listener; import net.minestom.server.entity.Player; +import net.minestom.server.event.EventDispatcher; import net.minestom.server.event.player.PlayerMoveEvent; import net.minestom.server.instance.Instance; import net.minestom.server.network.packet.client.play.*; @@ -74,7 +75,7 @@ public class PlayerPositionListener { final Position cachedPosition = newPosition.clone(); PlayerMoveEvent playerMoveEvent = new PlayerMoveEvent(player, newPosition); - player.callEvent(PlayerMoveEvent.class, playerMoveEvent); + EventDispatcher.call(playerMoveEvent); // True if the event call changed the player position (possibly a teleport) final boolean positionChanged = !currentPosition.equals(player.getPosition()); diff --git a/src/main/java/net/minestom/server/listener/PluginMessageListener.java b/src/main/java/net/minestom/server/listener/PluginMessageListener.java index 9bd798614..22d3e4d04 100644 --- a/src/main/java/net/minestom/server/listener/PluginMessageListener.java +++ b/src/main/java/net/minestom/server/listener/PluginMessageListener.java @@ -1,6 +1,7 @@ package net.minestom.server.listener; import net.minestom.server.entity.Player; +import net.minestom.server.event.EventDispatcher; import net.minestom.server.event.player.PlayerPluginMessageEvent; import net.minestom.server.network.packet.client.play.ClientPluginMessagePacket; @@ -8,7 +9,7 @@ public class PluginMessageListener { public static void listener(ClientPluginMessagePacket packet, Player player) { PlayerPluginMessageEvent pluginMessageEvent = new PlayerPluginMessageEvent(player, packet.channel, packet.data); - player.callEvent(PlayerPluginMessageEvent.class, pluginMessageEvent); + EventDispatcher.call(pluginMessageEvent); } } diff --git a/src/main/java/net/minestom/server/listener/ResourcePackListener.java b/src/main/java/net/minestom/server/listener/ResourcePackListener.java index 8af588f63..5bbaa1368 100644 --- a/src/main/java/net/minestom/server/listener/ResourcePackListener.java +++ b/src/main/java/net/minestom/server/listener/ResourcePackListener.java @@ -1,6 +1,7 @@ package net.minestom.server.listener; import net.minestom.server.entity.Player; +import net.minestom.server.event.EventDispatcher; import net.minestom.server.event.player.PlayerResourcePackStatusEvent; import net.minestom.server.network.packet.client.play.ClientResourcePackStatusPacket; import net.minestom.server.resourcepack.ResourcePackStatus; @@ -10,6 +11,6 @@ public class ResourcePackListener { public static void listener(ClientResourcePackStatusPacket packet, Player player) { final ResourcePackStatus result = packet.result; PlayerResourcePackStatusEvent resourcePackStatusEvent = new PlayerResourcePackStatusEvent(player, result); - player.callEvent(PlayerResourcePackStatusEvent.class, resourcePackStatusEvent); + EventDispatcher.call(resourcePackStatusEvent); } } diff --git a/src/main/java/net/minestom/server/listener/SettingsListener.java b/src/main/java/net/minestom/server/listener/SettingsListener.java index 3099a8226..0dcd01db3 100644 --- a/src/main/java/net/minestom/server/listener/SettingsListener.java +++ b/src/main/java/net/minestom/server/listener/SettingsListener.java @@ -1,6 +1,7 @@ package net.minestom.server.listener; import net.minestom.server.entity.Player; +import net.minestom.server.event.EventDispatcher; import net.minestom.server.event.player.PlayerSettingsChangeEvent; import net.minestom.server.network.packet.client.play.ClientSettingsPacket; @@ -11,7 +12,7 @@ public class SettingsListener { settings.refresh(packet.locale, packet.viewDistance, packet.chatMessageType, packet.chatColors, packet.displayedSkinParts, packet.mainHand); PlayerSettingsChangeEvent playerSettingsChangeEvent = new PlayerSettingsChangeEvent(player); - player.callEvent(PlayerSettingsChangeEvent.class, playerSettingsChangeEvent); + EventDispatcher.call(playerSettingsChangeEvent); } } diff --git a/src/main/java/net/minestom/server/listener/UseEntityListener.java b/src/main/java/net/minestom/server/listener/UseEntityListener.java index 321f6eb78..3628797a2 100644 --- a/src/main/java/net/minestom/server/listener/UseEntityListener.java +++ b/src/main/java/net/minestom/server/listener/UseEntityListener.java @@ -3,6 +3,7 @@ package net.minestom.server.listener; import net.minestom.server.entity.Entity; import net.minestom.server.entity.LivingEntity; import net.minestom.server.entity.Player; +import net.minestom.server.event.EventDispatcher; import net.minestom.server.event.entity.EntityAttackEvent; import net.minestom.server.event.player.PlayerEntityInteractEvent; import net.minestom.server.network.packet.client.play.ClientInteractEntityPacket; @@ -24,10 +25,10 @@ public class UseEntityListener { return; EntityAttackEvent entityAttackEvent = new EntityAttackEvent(player, entity); - player.callEvent(EntityAttackEvent.class, entityAttackEvent); + EventDispatcher.call(entityAttackEvent); } else if (type == ClientInteractEntityPacket.Type.INTERACT) { PlayerEntityInteractEvent playerEntityInteractEvent = new PlayerEntityInteractEvent(player, entity, packet.hand); - player.callEvent(PlayerEntityInteractEvent.class, playerEntityInteractEvent); + EventDispatcher.call(playerEntityInteractEvent); } else { // TODO find difference with INTERACT //PlayerEntityInteractEvent playerEntityInteractEvent = new PlayerEntityInteractEvent(player, entity, packet.hand); diff --git a/src/main/java/net/minestom/server/listener/UseItemListener.java b/src/main/java/net/minestom/server/listener/UseItemListener.java index df80bed7b..6f6fffc43 100644 --- a/src/main/java/net/minestom/server/listener/UseItemListener.java +++ b/src/main/java/net/minestom/server/listener/UseItemListener.java @@ -1,6 +1,7 @@ package net.minestom.server.listener; import net.minestom.server.entity.Player; +import net.minestom.server.event.EventDispatcher; import net.minestom.server.event.player.PlayerItemAnimationEvent; import net.minestom.server.event.player.PlayerPreEatEvent; import net.minestom.server.event.player.PlayerUseItemEvent; @@ -17,7 +18,7 @@ public class UseItemListener { ItemStack itemStack = hand == Player.Hand.MAIN ? inventory.getItemInMainHand() : inventory.getItemInOffHand(); //itemStack.onRightClick(player, hand); PlayerUseItemEvent useItemEvent = new PlayerUseItemEvent(player, hand, itemStack); - player.callEvent(PlayerUseItemEvent.class, useItemEvent); + EventDispatcher.call(useItemEvent); final PlayerInventory playerInventory = player.getInventory(); if (useItemEvent.isCancelled()) { @@ -63,12 +64,12 @@ public class UseItemListener { // Eating code, contains the eating time customisation PlayerPreEatEvent playerPreEatEvent = new PlayerPreEatEvent(player, itemStack, hand, player.getDefaultEatingTime()); - player.callCancellableEvent(PlayerPreEatEvent.class, playerPreEatEvent, () -> player.refreshEating(hand, playerPreEatEvent.getEatingTime())); + EventDispatcher.callCancellable(playerPreEatEvent, () -> player.refreshEating(hand, playerPreEatEvent.getEatingTime())); } if (itemAnimationType != null) { PlayerItemAnimationEvent playerItemAnimationEvent = new PlayerItemAnimationEvent(player, itemAnimationType); - player.callCancellableEvent(PlayerItemAnimationEvent.class, playerItemAnimationEvent, () -> { + EventDispatcher.callCancellable(playerItemAnimationEvent, () -> { player.refreshActiveHand(true, hand == Player.Hand.OFF, riptideSpinAttack); player.sendPacketToViewers(player.getMetadataPacket()); }); diff --git a/src/main/java/net/minestom/server/listener/WindowListener.java b/src/main/java/net/minestom/server/listener/WindowListener.java index eb9b942ed..863a8865e 100644 --- a/src/main/java/net/minestom/server/listener/WindowListener.java +++ b/src/main/java/net/minestom/server/listener/WindowListener.java @@ -1,6 +1,7 @@ package net.minestom.server.listener; import net.minestom.server.entity.Player; +import net.minestom.server.event.EventDispatcher; import net.minestom.server.event.inventory.InventoryCloseEvent; import net.minestom.server.inventory.Inventory; import net.minestom.server.inventory.InventoryClickHandler; @@ -111,7 +112,7 @@ public class WindowListener { public static void closeWindowListener(ClientCloseWindowPacket packet, Player player) { // if windowId == 0 then it is player's inventory, meaning that they hadn't been any open inventory packet InventoryCloseEvent inventoryCloseEvent = new InventoryCloseEvent(player.getOpenInventory(), player); - player.callEvent(InventoryCloseEvent.class, inventoryCloseEvent); + EventDispatcher.call(inventoryCloseEvent); player.closeInventory(); diff --git a/src/main/java/net/minestom/server/network/ConnectionManager.java b/src/main/java/net/minestom/server/network/ConnectionManager.java index 67ae73556..81df1eb5b 100644 --- a/src/main/java/net/minestom/server/network/ConnectionManager.java +++ b/src/main/java/net/minestom/server/network/ConnectionManager.java @@ -9,6 +9,7 @@ import net.minestom.server.adventure.audience.Audiences; import net.minestom.server.chat.JsonMessage; import net.minestom.server.entity.Player; import net.minestom.server.entity.fakeplayer.FakePlayer; +import net.minestom.server.event.EventDispatcher; import net.minestom.server.event.player.AsyncPlayerPreLoginEvent; import net.minestom.server.event.player.PlayerLoginEvent; import net.minestom.server.instance.Instance; @@ -419,7 +420,7 @@ public final class ConnectionManager { // Call pre login event AsyncPlayerPreLoginEvent asyncPlayerPreLoginEvent = new AsyncPlayerPreLoginEvent(player, username, uuid); - player.callEvent(AsyncPlayerPreLoginEvent.class, asyncPlayerPreLoginEvent); + EventDispatcher.call(asyncPlayerPreLoginEvent); // Close the player channel if he has been disconnected (kick) final boolean online = player.isOnline(); @@ -543,7 +544,7 @@ public final class ConnectionManager { while ((waitingPlayer = waitingPlayers.poll()) != null) { PlayerLoginEvent loginEvent = new PlayerLoginEvent(waitingPlayer); - waitingPlayer.callEvent(PlayerLoginEvent.class, loginEvent); + EventDispatcher.call(loginEvent); final Instance spawningInstance = loginEvent.getSpawningInstance(); Check.notNull(spawningInstance, "You need to specify a spawning instance in the PlayerLoginEvent"); diff --git a/src/main/java/net/minestom/server/network/netty/codec/LegacyPingHandler.java b/src/main/java/net/minestom/server/network/netty/codec/LegacyPingHandler.java index b54e8cffa..f94ea785c 100644 --- a/src/main/java/net/minestom/server/network/netty/codec/LegacyPingHandler.java +++ b/src/main/java/net/minestom/server/network/netty/codec/LegacyPingHandler.java @@ -6,6 +6,7 @@ import io.netty.channel.ChannelFutureListener; import io.netty.channel.ChannelHandlerContext; import io.netty.channel.ChannelInboundHandlerAdapter; import net.minestom.server.MinecraftServer; +import net.minestom.server.event.EventDispatcher; import net.minestom.server.event.server.ServerListPingEvent; import net.minestom.server.ping.ServerListPingType; import org.jetbrains.annotations.NotNull; @@ -138,12 +139,12 @@ public class LegacyPingHandler extends ChannelInboundHandlerAdapter { * Calls a {@link ServerListPingEvent} and sends the response, if the event was not cancelled. * * @param version the version - * @param ctx the context + * @param ctx the context * @return {@code true} if the response was cancelled, {@code false} otherwise */ private static boolean trySendResponse(@NotNull ServerListPingType version, @NotNull ChannelHandlerContext ctx) { final ServerListPingEvent event = new ServerListPingEvent(version); - MinecraftServer.getGlobalEventHandler().callEvent(ServerListPingEvent.class, event); + EventDispatcher.call(event); if (event.isCancelled()) { return true; diff --git a/src/main/java/net/minestom/server/network/packet/client/status/StatusRequestPacket.java b/src/main/java/net/minestom/server/network/packet/client/status/StatusRequestPacket.java index 5a6f908b0..94128833d 100644 --- a/src/main/java/net/minestom/server/network/packet/client/status/StatusRequestPacket.java +++ b/src/main/java/net/minestom/server/network/packet/client/status/StatusRequestPacket.java @@ -1,6 +1,6 @@ package net.minestom.server.network.packet.client.status; -import net.minestom.server.MinecraftServer; +import net.minestom.server.event.EventDispatcher; import net.minestom.server.event.server.ServerListPingEvent; import net.minestom.server.network.packet.client.ClientPreplayPacket; import net.minestom.server.network.packet.server.handshake.ResponsePacket; @@ -16,7 +16,7 @@ public class StatusRequestPacket implements ClientPreplayPacket { public void process(@NotNull PlayerConnection connection) { final ServerListPingType pingVersion = ServerListPingType.fromModernProtocolVersion(connection.getProtocolVersion()); final ServerListPingEvent statusRequestEvent = new ServerListPingEvent(connection, pingVersion); - MinecraftServer.getGlobalEventHandler().callCancellableEvent(ServerListPingEvent.class, statusRequestEvent, () -> { + EventDispatcher.callCancellable(statusRequestEvent, () -> { final ResponsePacket responsePacket = new ResponsePacket(); responsePacket.jsonResponse = pingVersion.getPingResponse(statusRequestEvent.getResponseData()); diff --git a/src/test/java/demo/PlayerInit.java b/src/test/java/demo/PlayerInit.java index ad7b4693a..4a17b1ca7 100644 --- a/src/test/java/demo/PlayerInit.java +++ b/src/test/java/demo/PlayerInit.java @@ -159,6 +159,10 @@ public class PlayerInit { node.addChild(EventNode.value(EventFilter.PLAYER, player -> player.getUsername().equals("TheMode911")) .addListener(PlayerMoveEvent.class, event -> System.out.println("move!")) .addListener(PlayerTickEvent.class, event -> System.out.println("tick!"))); + + //var child = node.findChild("name"); + //child.addListener(PlayerTickEvent.class, (event) -> { + //}); //node.addChild(tagNode); -> Error: cannot add an item listener to a player node GlobalEventHandler globalEventHandler = MinecraftServer.getGlobalEventHandler(); From d81df24132867583393ca2d6205b78591ab0359e Mon Sep 17 00:00:00 2001 From: TheMode Date: Fri, 4 Jun 2021 04:05:57 +0200 Subject: [PATCH 063/104] Support old EventHandler API --- .../net/minestom/server/MinecraftServer.java | 2 +- .../net/minestom/server/entity/Entity.java | 23 ++-- .../server/event/GlobalEventHandler.java | 23 +--- .../server/event/handler/EventHandler.java | 120 +----------------- .../minestom/server/instance/Instance.java | 23 ++-- 5 files changed, 32 insertions(+), 159 deletions(-) diff --git a/src/main/java/net/minestom/server/MinecraftServer.java b/src/main/java/net/minestom/server/MinecraftServer.java index 545ab891b..134b4a8a7 100644 --- a/src/main/java/net/minestom/server/MinecraftServer.java +++ b/src/main/java/net/minestom/server/MinecraftServer.java @@ -125,8 +125,8 @@ public final class MinecraftServer { private static ExtensionManager extensionManager; - private static final GlobalEventHandler GLOBAL_EVENT_HANDLER = new GlobalEventHandler(); private static final EventNode GLOBAL_EVENT_NODE = EventNode.all(); + private static final GlobalEventHandler GLOBAL_EVENT_HANDLER = new GlobalEventHandler(); private static UpdateManager updateManager; private static MinecraftServer minecraftServer; diff --git a/src/main/java/net/minestom/server/entity/Entity.java b/src/main/java/net/minestom/server/entity/Entity.java index dddab7a40..4fc0276c0 100644 --- a/src/main/java/net/minestom/server/entity/Entity.java +++ b/src/main/java/net/minestom/server/entity/Entity.java @@ -16,11 +16,12 @@ import net.minestom.server.collision.CollisionUtils; import net.minestom.server.data.Data; import net.minestom.server.data.DataContainer; import net.minestom.server.entity.metadata.EntityMeta; -import net.minestom.server.event.Event; -import net.minestom.server.event.EventCallback; import net.minestom.server.event.EventDispatcher; +import net.minestom.server.event.EventFilter; +import net.minestom.server.event.EventNode; import net.minestom.server.event.entity.*; import net.minestom.server.event.handler.EventHandler; +import net.minestom.server.event.trait.EntityEvent; import net.minestom.server.instance.Chunk; import net.minestom.server.instance.Instance; import net.minestom.server.instance.InstanceManager; @@ -62,7 +63,7 @@ import java.util.function.UnaryOperator; *

* To create your own entity you probably want to extends {@link LivingEntity} or {@link EntityCreature} instead. */ -public class Entity implements Viewable, Tickable, EventHandler, DataContainer, PermissionHandler, HoverEventSource { +public class Entity implements Viewable, Tickable, EventHandler, DataContainer, PermissionHandler, HoverEventSource { private static final Map ENTITY_BY_ID = new ConcurrentHashMap<>(); private static final Map ENTITY_BY_UUID = new ConcurrentHashMap<>(); @@ -117,8 +118,7 @@ public class Entity implements Viewable, Tickable, EventHandler, DataContainer, private long lastAbsoluteSynchronizationTime; // Events - private final Map, Collection> eventCallbacks = new ConcurrentHashMap<>(); - private final Map>> extensionCallbacks = new ConcurrentHashMap<>(); + private final EventNode eventNode = EventNode.type(EventFilter.ENTITY); protected Metadata metadata = new Metadata(this); protected EntityMeta entityMeta; @@ -155,6 +155,8 @@ public class Entity implements Viewable, Tickable, EventHandler, DataContainer, Entity.ENTITY_BY_ID.put(id, this); Entity.ENTITY_BY_UUID.put(uuid, this); + + MinecraftServer.getGlobalEventNode().map(this, eventNode); } public Entity(@NotNull EntityType entityType) { @@ -769,16 +771,9 @@ public class Entity implements Viewable, Tickable, EventHandler, DataContainer, } } - @NotNull @Override - public Map, Collection> getEventCallbacksMap() { - return eventCallbacks; - } - - @NotNull - @Override - public Collection> getExtensionCallbacks(String extension) { - return extensionCallbacks.computeIfAbsent(extension, e -> new CopyOnWriteArrayList<>()); + public @NotNull EventNode getEventNode() { + return eventNode; } /** diff --git a/src/main/java/net/minestom/server/event/GlobalEventHandler.java b/src/main/java/net/minestom/server/event/GlobalEventHandler.java index 69c2d12b4..41d8a724a 100644 --- a/src/main/java/net/minestom/server/event/GlobalEventHandler.java +++ b/src/main/java/net/minestom/server/event/GlobalEventHandler.java @@ -1,31 +1,22 @@ package net.minestom.server.event; +import net.minestom.server.MinecraftServer; import net.minestom.server.event.handler.EventHandler; import org.jetbrains.annotations.NotNull; -import java.util.Collection; -import java.util.Map; -import java.util.concurrent.ConcurrentHashMap; -import java.util.concurrent.CopyOnWriteArrayList; - /** * Object containing all the global event listeners. */ -public final class GlobalEventHandler implements EventHandler { +public final class GlobalEventHandler implements EventHandler { - // Events - private final Map, Collection> eventCallbacks = new ConcurrentHashMap<>(); - private final Map>> extensionCallbacks = new ConcurrentHashMap<>(); + private final EventNode node = EventNode.all(); - @NotNull - @Override - public Map, Collection> getEventCallbacksMap() { - return eventCallbacks; + { + MinecraftServer.getGlobalEventNode().addChild(node); } - @NotNull @Override - public Collection> getExtensionCallbacks(String extension) { - return extensionCallbacks.computeIfAbsent(extension, e -> new CopyOnWriteArrayList<>()); + public @NotNull EventNode getEventNode() { + return node; } } diff --git a/src/main/java/net/minestom/server/event/handler/EventHandler.java b/src/main/java/net/minestom/server/event/handler/EventHandler.java index e3526c416..c78dcc9c3 100644 --- a/src/main/java/net/minestom/server/event/handler/EventHandler.java +++ b/src/main/java/net/minestom/server/event/handler/EventHandler.java @@ -1,126 +1,20 @@ package net.minestom.server.event.handler; -import net.minestom.server.MinecraftServer; import net.minestom.server.event.Event; import net.minestom.server.event.EventCallback; -import net.minestom.server.extensions.IExtensionObserver; -import net.minestom.server.extras.selfmodification.MinestomRootClassLoader; +import net.minestom.server.event.EventNode; import org.jetbrains.annotations.NotNull; -import java.util.Collection; -import java.util.Map; -import java.util.concurrent.CopyOnWriteArraySet; -import java.util.stream.Stream; - /** * Represents an element which can have {@link Event} listeners assigned to it. */ -public interface EventHandler extends IExtensionObserver { +public interface EventHandler { - /** - * Gets a {@link Map} containing all the listeners assigned to a specific {@link Event} type. - * - * @return a {@link Map} with all the listeners - */ - @NotNull - Map, Collection> getEventCallbacksMap(); + @NotNull EventNode getEventNode(); - /** - * Gets a {@link Collection} containing all the listeners assigned to a specific extension (represented by its name). - * Used to unload all callbacks when the extension is unloaded - * - * @return a {@link Collection} with all the listeners - */ - @NotNull - Collection> getExtensionCallbacks(String extension); - - /** - * Adds a new event callback for the specified type {@code eventClass}. - * - * @param eventClass the event class - * @param eventCallback the event callback - * @param the event type - * @return true if the callback collection changed as a result of the call - */ - default boolean addEventCallback(@NotNull Class eventClass, @NotNull EventCallback eventCallback) { - String extensionSource = MinestomRootClassLoader.findExtensionObjectOwner(eventCallback); - if (extensionSource != null) { - MinecraftServer.getExtensionManager().getExtension(extensionSource).observe(this); - getExtensionCallbacks(extensionSource).add(eventCallback); - } - - Collection callbacks = getEventCallbacks(eventClass); - return callbacks.add(eventCallback); + default boolean addEventCallback(@NotNull Class eventClass, @NotNull EventCallback eventCallback) { + var node = getEventNode(); + node.addListener(eventClass, eventCallback::run); + return true; } - - /** - * Removes an event callback. - * - * @param eventClass the event class - * @param eventCallback the event callback - * @param the event type - * @return true if the callback was removed as a result of this call - */ - default boolean removeEventCallback(@NotNull Class eventClass, @NotNull EventCallback eventCallback) { - Collection callbacks = getEventCallbacks(eventClass); - String extensionSource = MinestomRootClassLoader.findExtensionObjectOwner(eventCallback); - if (extensionSource != null) { - getExtensionCallbacks(extensionSource).remove(eventCallback); - } - - return callbacks.remove(eventCallback); - } - - /** - * Gets the event callbacks of a specific event type. - * - * @param eventClass the event class - * @param the event type - * @return all event callbacks for the specified type {@code eventClass} - */ - @NotNull - default Collection getEventCallbacks(@NotNull Class eventClass) { - return getEventCallbacksMap().computeIfAbsent(eventClass, clazz -> new CopyOnWriteArraySet<>()); - } - - /** - * Gets a {@link Stream} containing all the {@link EventCallback}, no matter to which {@link Event} they are linked. - * - * @return a {@link Stream} containing all the callbacks - */ - @NotNull - default Stream getEventCallbacks() { - return getEventCallbacksMap().values().stream().flatMap(Collection::stream); - } - - /** - * Remove all event callbacks owned by the given extension - * - * @param extension the extension to remove callbacks from - */ - default void removeCallbacksOwnedByExtension(String extension) { - Collection> extensionCallbacks = getExtensionCallbacks(extension); - for (EventCallback callback : extensionCallbacks) { - - // try to remove this callback from all callback collections - // we do this because we do not have information about the event class at this point - for (Collection eventCallbacks : getEventCallbacksMap().values()) { - eventCallbacks.remove(callback); - } - } - - extensionCallbacks.clear(); - } - - private void runEvent(@NotNull Collection eventCallbacks, @NotNull E event) { - for (EventCallback eventCallback : eventCallbacks) { - eventCallback.run(event); - } - } - - @Override - default void onExtensionUnload(String extensionName) { - removeCallbacksOwnedByExtension(extensionName); - } - } diff --git a/src/main/java/net/minestom/server/instance/Instance.java b/src/main/java/net/minestom/server/instance/Instance.java index 31dab30d1..00f1f1bf2 100644 --- a/src/main/java/net/minestom/server/instance/Instance.java +++ b/src/main/java/net/minestom/server/instance/Instance.java @@ -12,13 +12,14 @@ import net.minestom.server.entity.EntityCreature; import net.minestom.server.entity.ExperienceOrb; import net.minestom.server.entity.Player; import net.minestom.server.entity.pathfinding.PFInstanceSpace; -import net.minestom.server.event.Event; -import net.minestom.server.event.EventCallback; import net.minestom.server.event.EventDispatcher; +import net.minestom.server.event.EventFilter; +import net.minestom.server.event.EventNode; import net.minestom.server.event.handler.EventHandler; import net.minestom.server.event.instance.AddEntityToInstanceEvent; import net.minestom.server.event.instance.InstanceTickEvent; import net.minestom.server.event.instance.RemoveEntityFromInstanceEvent; +import net.minestom.server.event.trait.InstanceEvent; import net.minestom.server.instance.block.Block; import net.minestom.server.instance.block.BlockManager; import net.minestom.server.instance.block.CustomBlock; @@ -43,7 +44,6 @@ import org.jetbrains.annotations.Nullable; import java.util.*; import java.util.concurrent.ConcurrentHashMap; -import java.util.concurrent.CopyOnWriteArrayList; import java.util.function.Consumer; /** @@ -57,7 +57,7 @@ import java.util.function.Consumer; * you need to be sure to signal the {@link UpdateManager} of the changes using * {@link UpdateManager#signalChunkLoad(Chunk)} and {@link UpdateManager#signalChunkUnload(Chunk)}. */ -public abstract class Instance implements BlockModifier, Tickable, EventHandler, DataContainer, PacketGroupingAudience { +public abstract class Instance implements BlockModifier, Tickable, EventHandler, DataContainer, PacketGroupingAudience { protected static final BlockManager BLOCK_MANAGER = MinecraftServer.getBlockManager(); protected static final UpdateManager UPDATE_MANAGER = MinecraftServer.getUpdateManager(); @@ -80,8 +80,7 @@ public abstract class Instance implements BlockModifier, Tickable, EventHandler, // Field for tick events private long lastTickAge = System.currentTimeMillis(); - private final Map, Collection> eventCallbacks = new ConcurrentHashMap<>(); - private final Map>> extensionCallbacks = new ConcurrentHashMap<>(); + private final EventNode eventNode = EventNode.type(EventFilter.INSTANCE); // Entities present in this instance protected final Set entities = ConcurrentHashMap.newKeySet(); @@ -120,6 +119,7 @@ public abstract class Instance implements BlockModifier, Tickable, EventHandler, this.dimensionType = dimensionType; this.worldBorder = new WorldBorder(this); + MinecraftServer.getGlobalEventNode().map(this, eventNode); } /** @@ -834,16 +834,9 @@ public abstract class Instance implements BlockModifier, Tickable, EventHandler, this.data = data; } - @NotNull @Override - public Map, Collection> getEventCallbacksMap() { - return eventCallbacks; - } - - @NotNull - @Override - public Collection> getExtensionCallbacks(String extension) { - return extensionCallbacks.computeIfAbsent(extension, e -> new CopyOnWriteArrayList<>()); + public @NotNull EventNode getEventNode() { + return eventNode; } // UNSAFE METHODS (need most of time to be synchronized) From c4d521cde5e0875d5173c6fc1f45834b840475bb Mon Sep 17 00:00:00 2001 From: TheMode Date: Fri, 4 Jun 2021 04:10:13 +0200 Subject: [PATCH 064/104] All node should have a name --- .../net/minestom/server/MinecraftServer.java | 2 +- .../net/minestom/server/entity/Entity.java | 3 +- .../net/minestom/server/event/EventNode.java | 44 ++++++++++--------- .../server/event/GlobalEventHandler.java | 2 +- .../minestom/server/instance/Instance.java | 4 +- src/test/java/demo/PlayerInit.java | 15 +++---- 6 files changed, 35 insertions(+), 35 deletions(-) diff --git a/src/main/java/net/minestom/server/MinecraftServer.java b/src/main/java/net/minestom/server/MinecraftServer.java index 134b4a8a7..00b0c4d3e 100644 --- a/src/main/java/net/minestom/server/MinecraftServer.java +++ b/src/main/java/net/minestom/server/MinecraftServer.java @@ -125,7 +125,7 @@ public final class MinecraftServer { private static ExtensionManager extensionManager; - private static final EventNode GLOBAL_EVENT_NODE = EventNode.all(); + private static final EventNode GLOBAL_EVENT_NODE = EventNode.all("global"); private static final GlobalEventHandler GLOBAL_EVENT_HANDLER = new GlobalEventHandler(); private static UpdateManager updateManager; diff --git a/src/main/java/net/minestom/server/entity/Entity.java b/src/main/java/net/minestom/server/entity/Entity.java index 4fc0276c0..0a4334fb2 100644 --- a/src/main/java/net/minestom/server/entity/Entity.java +++ b/src/main/java/net/minestom/server/entity/Entity.java @@ -118,7 +118,7 @@ public class Entity implements Viewable, Tickable, EventHandler, Da private long lastAbsoluteSynchronizationTime; // Events - private final EventNode eventNode = EventNode.type(EventFilter.ENTITY); + private final EventNode eventNode; protected Metadata metadata = new Metadata(this); protected EntityMeta entityMeta; @@ -156,6 +156,7 @@ public class Entity implements Viewable, Tickable, EventHandler, Da Entity.ENTITY_BY_ID.put(id, this); Entity.ENTITY_BY_UUID.put(uuid, this); + this.eventNode = EventNode.type("entity-" + uuid, EventFilter.ENTITY); MinecraftServer.getGlobalEventNode().map(this, eventNode); } diff --git a/src/main/java/net/minestom/server/event/EventNode.java b/src/main/java/net/minestom/server/event/EventNode.java index e8c212fbd..a86754049 100644 --- a/src/main/java/net/minestom/server/event/EventNode.java +++ b/src/main/java/net/minestom/server/event/EventNode.java @@ -18,48 +18,54 @@ import java.util.function.Predicate; public class EventNode { - public static EventNode all() { - return type(EventFilter.ALL); + public static EventNode all(@NotNull String name) { + return type(name, EventFilter.ALL); } - public static EventNode type(@NotNull EventFilter filter, + public static EventNode type(@NotNull String name, + @NotNull EventFilter filter, @NotNull BiPredicate predicate) { - return new EventNode<>(filter, (e, o) -> predicate.test(e, (V) o)); + return new EventNode<>(name, filter, (e, o) -> predicate.test(e, (V) o)); } - public static EventNode type(@NotNull EventFilter filter) { - return type(filter, (e, v) -> true); + public static EventNode type(@NotNull String name, + @NotNull EventFilter filter) { + return type(name, filter, (e, v) -> true); } - public static EventNode event(@NotNull EventFilter filter, + public static EventNode event(@NotNull String name, + @NotNull EventFilter filter, @NotNull Predicate predicate) { - return type(filter, (e, h) -> predicate.test(e)); + return type(name, filter, (e, h) -> predicate.test(e)); } - public static EventNode value(@NotNull EventFilter filter, + public static EventNode value(@NotNull String name, + @NotNull EventFilter filter, @NotNull Predicate predicate) { - return type(filter, (e, h) -> predicate.test(h)); + return type(name, filter, (e, h) -> predicate.test(h)); } - public static EventNode tag(@NotNull EventFilter filter, + public static EventNode tag(@NotNull String name, + @NotNull EventFilter filter, @NotNull Tag tag) { - return type(filter, (e, h) -> h.hasTag(tag)); + return type(name, filter, (e, h) -> h.hasTag(tag)); } - public static EventNode tag(@NotNull EventFilter filter, + public static EventNode tag(@NotNull String name, + @NotNull EventFilter filter, @NotNull Tag tag, @NotNull Predicate<@Nullable V> consumer) { - return type(filter, (e, h) -> consumer.test(h.getTag(tag))); + return type(name, filter, (e, h) -> consumer.test(h.getTag(tag))); } private final Map, List>> listenerMap = new ConcurrentHashMap<>(); private final Map> redirectionMap = new ConcurrentHashMap<>(); private final Set> children = new CopyOnWriteArraySet<>(); + protected final String name; protected final EventFilter filter; protected final BiPredicate predicate; protected final Class eventType; - private volatile String name = "unknown"; // Tree data private static final Object GLOBAL_CHILD_LOCK = new Object(); @@ -67,7 +73,8 @@ public class EventNode { private final Object lock = new Object(); private final Object2IntMap> childEventMap = new Object2IntOpenHashMap<>(); - protected EventNode(EventFilter filter, BiPredicate predicate) { + protected EventNode(String name, EventFilter filter, BiPredicate predicate) { + this.name = name; this.filter = filter; this.predicate = predicate; this.eventType = filter.getEventType(); @@ -230,11 +237,6 @@ public class EventNode { return name; } - public EventNode setName(@NotNull String name) { - this.name = name; - return this; - } - private void increaseListenerCount(Class eventClass, int count) { final int current = childEventMap.getInt(eventClass); final int result = current + count; diff --git a/src/main/java/net/minestom/server/event/GlobalEventHandler.java b/src/main/java/net/minestom/server/event/GlobalEventHandler.java index 41d8a724a..c6a1de8d9 100644 --- a/src/main/java/net/minestom/server/event/GlobalEventHandler.java +++ b/src/main/java/net/minestom/server/event/GlobalEventHandler.java @@ -9,7 +9,7 @@ import org.jetbrains.annotations.NotNull; */ public final class GlobalEventHandler implements EventHandler { - private final EventNode node = EventNode.all(); + private final EventNode node = EventNode.all("global-handler"); { MinecraftServer.getGlobalEventNode().addChild(node); diff --git a/src/main/java/net/minestom/server/instance/Instance.java b/src/main/java/net/minestom/server/instance/Instance.java index 00f1f1bf2..020423513 100644 --- a/src/main/java/net/minestom/server/instance/Instance.java +++ b/src/main/java/net/minestom/server/instance/Instance.java @@ -80,7 +80,7 @@ public abstract class Instance implements BlockModifier, Tickable, EventHandler< // Field for tick events private long lastTickAge = System.currentTimeMillis(); - private final EventNode eventNode = EventNode.type(EventFilter.INSTANCE); + private final EventNode eventNode; // Entities present in this instance protected final Set entities = ConcurrentHashMap.newKeySet(); @@ -119,6 +119,8 @@ public abstract class Instance implements BlockModifier, Tickable, EventHandler< this.dimensionType = dimensionType; this.worldBorder = new WorldBorder(this); + + this.eventNode = EventNode.type("instance-" + uniqueId, EventFilter.INSTANCE); MinecraftServer.getGlobalEventNode().map(this, eventNode); } diff --git a/src/test/java/demo/PlayerInit.java b/src/test/java/demo/PlayerInit.java index 4a17b1ca7..52b7b6b41 100644 --- a/src/test/java/demo/PlayerInit.java +++ b/src/test/java/demo/PlayerInit.java @@ -138,25 +138,23 @@ public class PlayerInit { // EVENT REGISTERING - var empty = EventNode.all() - .setName("empty") + var empty = EventNode.all("empty-demo") .addListener(PlayerMoveEvent.class, (event) -> { }); - var node = EventNode.type(EventFilter.PLAYER) - .setName("node") + var node = EventNode.type("test1", EventFilter.PLAYER) .addListener(EventListener.builder(PlayerTickEvent.class) .handler(playerTickEvent -> System.out.println("Player tick!")) .expirationCount(50) .build()); - var conditional = EventNode.value(EventFilter.PLAYER, Player::isCreative) + var conditional = EventNode.value("test2", EventFilter.PLAYER, Player::isCreative) .addListener(PlayerMoveEvent.class, (event) -> System.out.println("creative player moved")); - var tagNode = EventNode.tag(EventFilter.ITEM, Tag.String("tag")); + var tagNode = EventNode.tag("test-tag", EventFilter.ITEM, Tag.String("tag")); node.addChild(conditional); - node.addChild(EventNode.value(EventFilter.PLAYER, player -> player.getUsername().equals("TheMode911")) + node.addChild(EventNode.value("test-builder", EventFilter.PLAYER, player -> player.getUsername().equals("TheMode911")) .addListener(PlayerMoveEvent.class, event -> System.out.println("move!")) .addListener(PlayerTickEvent.class, event -> System.out.println("tick!"))); @@ -184,9 +182,6 @@ public class PlayerInit { if (source instanceof Player) { ((Player) source).sendMessage("You attacked something!"); } - empty.map(source, EventNode.type(EventFilter.ENTITY) - .addListener(PlayerMoveEvent.class, (e) -> - System.out.println("Test movement"))); }); globalEventHandler.addEventCallback(PlayerDeathEvent.class, event -> { From f39fc8c81ec6b10bb694c6e2a40a59414a8eb328 Mon Sep 17 00:00:00 2001 From: TheMode Date: Fri, 4 Jun 2021 04:14:41 +0200 Subject: [PATCH 065/104] Fast exit when a node as no child --- src/main/java/net/minestom/server/event/EventNode.java | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/src/main/java/net/minestom/server/event/EventNode.java b/src/main/java/net/minestom/server/event/EventNode.java index a86754049..82316d584 100644 --- a/src/main/java/net/minestom/server/event/EventNode.java +++ b/src/main/java/net/minestom/server/event/EventNode.java @@ -121,8 +121,7 @@ public class EventNode { } // Process children synchronized (lock) { - final int childCount = childEventMap.getInt(eventClass); - if (childCount < 1) { + if (childEventMap.isEmpty() || childEventMap.getInt(eventClass) < 1) { // No listener in children return; } From 80c6bb3fa51db532debd2b1d93991d5e6900df4e Mon Sep 17 00:00:00 2001 From: TheMode Date: Fri, 4 Jun 2021 04:24:25 +0200 Subject: [PATCH 066/104] Deprecate GlobalEventHandler --- src/main/java/net/minestom/server/MinecraftServer.java | 2 ++ .../java/net/minestom/server/event/GlobalEventHandler.java | 3 +++ 2 files changed, 5 insertions(+) diff --git a/src/main/java/net/minestom/server/MinecraftServer.java b/src/main/java/net/minestom/server/MinecraftServer.java index 00b0c4d3e..0780c0e4b 100644 --- a/src/main/java/net/minestom/server/MinecraftServer.java +++ b/src/main/java/net/minestom/server/MinecraftServer.java @@ -300,8 +300,10 @@ public final class MinecraftServer { * Used to register event callback at a global scale. * * @return the global event handler + * @deprecated use {@link #getGlobalEventNode()} */ @NotNull + @Deprecated public static GlobalEventHandler getGlobalEventHandler() { return GLOBAL_EVENT_HANDLER; } diff --git a/src/main/java/net/minestom/server/event/GlobalEventHandler.java b/src/main/java/net/minestom/server/event/GlobalEventHandler.java index c6a1de8d9..351ab08ba 100644 --- a/src/main/java/net/minestom/server/event/GlobalEventHandler.java +++ b/src/main/java/net/minestom/server/event/GlobalEventHandler.java @@ -6,7 +6,10 @@ import org.jetbrains.annotations.NotNull; /** * Object containing all the global event listeners. + * + * @deprecated use {@link MinecraftServer#getGlobalEventNode()} */ +@Deprecated public final class GlobalEventHandler implements EventHandler { private final EventNode node = EventNode.all("global-handler"); From a585e4e45b1adb172fbf3e519286db4a1f83092f Mon Sep 17 00:00:00 2001 From: TheMode Date: Fri, 4 Jun 2021 04:39:45 +0200 Subject: [PATCH 067/104] Improve event calling performance --- .../net/minestom/server/event/EventNode.java | 36 ++++++++++++------- 1 file changed, 24 insertions(+), 12 deletions(-) diff --git a/src/main/java/net/minestom/server/event/EventNode.java b/src/main/java/net/minestom/server/event/EventNode.java index 82316d584..783a37adb 100644 --- a/src/main/java/net/minestom/server/event/EventNode.java +++ b/src/main/java/net/minestom/server/event/EventNode.java @@ -25,37 +25,43 @@ public class EventNode { public static EventNode type(@NotNull String name, @NotNull EventFilter filter, @NotNull BiPredicate predicate) { - return new EventNode<>(name, filter, (e, o) -> predicate.test(e, (V) o)); + return create(name, filter, predicate); } public static EventNode type(@NotNull String name, @NotNull EventFilter filter) { - return type(name, filter, (e, v) -> true); + return create(name, filter, null); } public static EventNode event(@NotNull String name, @NotNull EventFilter filter, @NotNull Predicate predicate) { - return type(name, filter, (e, h) -> predicate.test(e)); + return create(name, filter, (e, h) -> predicate.test(e)); } public static EventNode value(@NotNull String name, @NotNull EventFilter filter, @NotNull Predicate predicate) { - return type(name, filter, (e, h) -> predicate.test(h)); + return create(name, filter, (e, h) -> predicate.test(h)); } public static EventNode tag(@NotNull String name, @NotNull EventFilter filter, @NotNull Tag tag) { - return type(name, filter, (e, h) -> h.hasTag(tag)); + return create(name, filter, (e, h) -> h.hasTag(tag)); } public static EventNode tag(@NotNull String name, @NotNull EventFilter filter, @NotNull Tag tag, @NotNull Predicate<@Nullable V> consumer) { - return type(name, filter, (e, h) -> consumer.test(h.getTag(tag))); + return create(name, filter, (e, h) -> consumer.test(h.getTag(tag))); + } + + private static EventNode create(@NotNull String name, + @NotNull EventFilter filter, + @Nullable BiPredicate predicate) { + return new EventNode<>(name, filter, predicate != null ? (e, o) -> predicate.test(e, (V) o) : null); } private final Map, List>> listenerMap = new ConcurrentHashMap<>(); @@ -73,7 +79,9 @@ public class EventNode { private final Object lock = new Object(); private final Object2IntMap> childEventMap = new Object2IntOpenHashMap<>(); - protected EventNode(String name, EventFilter filter, BiPredicate predicate) { + protected EventNode(@NotNull String name, + @NotNull EventFilter filter, + @Nullable BiPredicate predicate) { this.name = name; this.filter = filter; this.predicate = predicate; @@ -87,6 +95,8 @@ public class EventNode { * @return true to enter the node, false otherwise */ protected boolean condition(@NotNull T event) { + if (predicate == null) + return true; final var value = filter.getHandler(event); return predicate.test(event, value); } @@ -102,11 +112,13 @@ public class EventNode { return; } // Process redirection - final Object handler = filter.getHandler(event); - if (handler != null) { - final var node = redirectionMap.get(handler); - if (node != null) { - node.call(event); + if (filter != null) { + final Object handler = filter.getHandler(event); + if (handler != null && !redirectionMap.isEmpty()) { + final var node = redirectionMap.get(handler); + if (node != null) { + node.call(event); + } } } // Process listener list From d9b26f84d35436a19b342ee9045c1747323943ce Mon Sep 17 00:00:00 2001 From: TheMode Date: Fri, 4 Jun 2021 04:54:07 +0200 Subject: [PATCH 068/104] Keep using GlobalEventHandler --- .../net/minestom/server/MinecraftServer.java | 12 +-------- .../net/minestom/server/entity/Entity.java | 2 +- .../server/event/EventDispatcher.java | 4 +-- .../server/event/GlobalEventHandler.java | 26 +++++++++---------- .../minestom/server/instance/Instance.java | 2 +- 5 files changed, 17 insertions(+), 29 deletions(-) diff --git a/src/main/java/net/minestom/server/MinecraftServer.java b/src/main/java/net/minestom/server/MinecraftServer.java index 0780c0e4b..cc1b63a8c 100644 --- a/src/main/java/net/minestom/server/MinecraftServer.java +++ b/src/main/java/net/minestom/server/MinecraftServer.java @@ -8,8 +8,6 @@ import net.minestom.server.data.DataType; import net.minestom.server.data.SerializableData; import net.minestom.server.entity.EntityType; import net.minestom.server.entity.Player; -import net.minestom.server.event.Event; -import net.minestom.server.event.EventNode; import net.minestom.server.event.GlobalEventHandler; import net.minestom.server.exception.ExceptionManager; import net.minestom.server.extensions.Extension; @@ -125,7 +123,6 @@ public final class MinecraftServer { private static ExtensionManager extensionManager; - private static final EventNode GLOBAL_EVENT_NODE = EventNode.all("global"); private static final GlobalEventHandler GLOBAL_EVENT_HANDLER = new GlobalEventHandler(); private static UpdateManager updateManager; @@ -300,18 +297,11 @@ public final class MinecraftServer { * Used to register event callback at a global scale. * * @return the global event handler - * @deprecated use {@link #getGlobalEventNode()} */ - @NotNull - @Deprecated - public static GlobalEventHandler getGlobalEventHandler() { + public static @NotNull GlobalEventHandler getGlobalEventHandler() { return GLOBAL_EVENT_HANDLER; } - public static @NotNull EventNode getGlobalEventNode() { - return GLOBAL_EVENT_NODE; - } - /** * Gets the manager handling all incoming packets * diff --git a/src/main/java/net/minestom/server/entity/Entity.java b/src/main/java/net/minestom/server/entity/Entity.java index 0a4334fb2..db8afd81c 100644 --- a/src/main/java/net/minestom/server/entity/Entity.java +++ b/src/main/java/net/minestom/server/entity/Entity.java @@ -157,7 +157,7 @@ public class Entity implements Viewable, Tickable, EventHandler, Da Entity.ENTITY_BY_UUID.put(uuid, this); this.eventNode = EventNode.type("entity-" + uuid, EventFilter.ENTITY); - MinecraftServer.getGlobalEventNode().map(this, eventNode); + MinecraftServer.getGlobalEventHandler().map(this, eventNode); } public Entity(@NotNull EntityType entityType) { diff --git a/src/main/java/net/minestom/server/event/EventDispatcher.java b/src/main/java/net/minestom/server/event/EventDispatcher.java index 83de820ee..1b3a38737 100644 --- a/src/main/java/net/minestom/server/event/EventDispatcher.java +++ b/src/main/java/net/minestom/server/event/EventDispatcher.java @@ -6,10 +6,10 @@ import org.jetbrains.annotations.NotNull; public class EventDispatcher { public static void call(@NotNull Event event) { - MinecraftServer.getGlobalEventNode().call(event); + MinecraftServer.getGlobalEventHandler().call(event); } public static void callCancellable(@NotNull CancellableEvent event, @NotNull Runnable successCallback) { - MinecraftServer.getGlobalEventNode().callCancellable(event, successCallback); + MinecraftServer.getGlobalEventHandler().callCancellable(event, successCallback); } } diff --git a/src/main/java/net/minestom/server/event/GlobalEventHandler.java b/src/main/java/net/minestom/server/event/GlobalEventHandler.java index 351ab08ba..0e1a8c94f 100644 --- a/src/main/java/net/minestom/server/event/GlobalEventHandler.java +++ b/src/main/java/net/minestom/server/event/GlobalEventHandler.java @@ -1,25 +1,23 @@ package net.minestom.server.event; -import net.minestom.server.MinecraftServer; -import net.minestom.server.event.handler.EventHandler; import org.jetbrains.annotations.NotNull; +import java.util.function.Consumer; + /** * Object containing all the global event listeners. - * - * @deprecated use {@link MinecraftServer#getGlobalEventNode()} */ -@Deprecated -public final class GlobalEventHandler implements EventHandler { - - private final EventNode node = EventNode.all("global-handler"); - - { - MinecraftServer.getGlobalEventNode().addChild(node); +public final class GlobalEventHandler extends EventNode { + public GlobalEventHandler() { + super("global", EventFilter.ALL, null); } - @Override - public @NotNull EventNode getEventNode() { - return node; + /** + * @deprecated use {@link #addListener(Class, Consumer)} + */ + @Deprecated + public boolean addEventCallback(@NotNull Class eventClass, @NotNull EventCallback eventCallback) { + addListener(eventClass, eventCallback::run); + return true; } } diff --git a/src/main/java/net/minestom/server/instance/Instance.java b/src/main/java/net/minestom/server/instance/Instance.java index 020423513..030e67b3a 100644 --- a/src/main/java/net/minestom/server/instance/Instance.java +++ b/src/main/java/net/minestom/server/instance/Instance.java @@ -121,7 +121,7 @@ public abstract class Instance implements BlockModifier, Tickable, EventHandler< this.worldBorder = new WorldBorder(this); this.eventNode = EventNode.type("instance-" + uniqueId, EventFilter.INSTANCE); - MinecraftServer.getGlobalEventNode().map(this, eventNode); + MinecraftServer.getGlobalEventHandler().map(this, eventNode); } /** From a5a2a71d697c4550a5a64ebbbc0e107bfcf2acc7 Mon Sep 17 00:00:00 2001 From: TheMode Date: Fri, 4 Jun 2021 07:37:13 +0200 Subject: [PATCH 069/104] Replace deprecated methods, showcase how to append to the global node --- src/test/java/demo/PlayerInit.java | 54 +++++++++++------------------- 1 file changed, 19 insertions(+), 35 deletions(-) diff --git a/src/test/java/demo/PlayerInit.java b/src/test/java/demo/PlayerInit.java index 52b7b6b41..5a7ec7fdd 100644 --- a/src/test/java/demo/PlayerInit.java +++ b/src/test/java/demo/PlayerInit.java @@ -5,14 +5,12 @@ import demo.generator.NoiseTestGenerator; import net.kyori.adventure.text.Component; import net.minestom.server.MinecraftServer; import net.minestom.server.adventure.audience.Audiences; -import net.minestom.server.chat.ColoredText; import net.minestom.server.entity.Entity; import net.minestom.server.entity.GameMode; import net.minestom.server.entity.ItemEntity; import net.minestom.server.entity.Player; import net.minestom.server.entity.damage.DamageType; import net.minestom.server.event.EventFilter; -import net.minestom.server.event.EventListener; import net.minestom.server.event.EventNode; import net.minestom.server.event.GlobalEventHandler; import net.minestom.server.event.entity.EntityAttackEvent; @@ -35,7 +33,6 @@ import net.minestom.server.item.metadata.CompassMeta; import net.minestom.server.monitoring.BenchmarkManager; import net.minestom.server.monitoring.TickMonitor; import net.minestom.server.network.ConnectionManager; -import net.minestom.server.tag.Tag; import net.minestom.server.utils.MathUtils; import net.minestom.server.utils.Position; import net.minestom.server.utils.Vector; @@ -138,25 +135,12 @@ public class PlayerInit { // EVENT REGISTERING - var empty = EventNode.all("empty-demo") - .addListener(PlayerMoveEvent.class, (event) -> { - }); - - var node = EventNode.type("test1", EventFilter.PLAYER) - .addListener(EventListener.builder(PlayerTickEvent.class) - .handler(playerTickEvent -> System.out.println("Player tick!")) - .expirationCount(50) - .build()); - - var conditional = EventNode.value("test2", EventFilter.PLAYER, Player::isCreative) - .addListener(PlayerMoveEvent.class, (event) -> System.out.println("creative player moved")); - - var tagNode = EventNode.tag("test-tag", EventFilter.ITEM, Tag.String("tag")); - - node.addChild(conditional); - node.addChild(EventNode.value("test-builder", EventFilter.PLAYER, player -> player.getUsername().equals("TheMode911")) + var globalNode = MinecraftServer.getGlobalEventHandler(); + var node = EventNode.value("test-builder", EventFilter.PLAYER, player -> player.getUsername().equals("TheMode911")) .addListener(PlayerMoveEvent.class, event -> System.out.println("move!")) - .addListener(PlayerTickEvent.class, event -> System.out.println("tick!"))); + .addListener(PlayerTickEvent.class, event -> System.out.println("tick!")); + globalNode.addChild(node); + globalNode.removeChild(node); //var child = node.findChild("name"); //child.addListener(PlayerTickEvent.class, (event) -> { @@ -164,7 +148,7 @@ public class PlayerInit { //node.addChild(tagNode); -> Error: cannot add an item listener to a player node GlobalEventHandler globalEventHandler = MinecraftServer.getGlobalEventHandler(); - globalEventHandler.addEventCallback(EntityAttackEvent.class, event -> { + globalEventHandler.addListener(EntityAttackEvent.class, event -> { final Entity source = event.getEntity(); final Entity entity = event.getTarget(); if (entity instanceof Player) { @@ -184,11 +168,11 @@ public class PlayerInit { } }); - globalEventHandler.addEventCallback(PlayerDeathEvent.class, event -> { - event.setChatMessage(ColoredText.of("custom death message")); + globalEventHandler.addListener(PlayerDeathEvent.class, event -> { + event.setChatMessage(Component.text("custom death message")); }); - globalEventHandler.addEventCallback(PlayerBlockPlaceEvent.class, event -> { + globalEventHandler.addListener(PlayerBlockPlaceEvent.class, event -> { if (event.getHand() != Player.Hand.MAIN) return; @@ -204,7 +188,7 @@ public class PlayerInit { }); - globalEventHandler.addEventCallback(PlayerBlockInteractEvent.class, event -> { + globalEventHandler.addListener(PlayerBlockInteractEvent.class, event -> { if (event.getHand() != Player.Hand.MAIN) return; final Player player = event.getPlayer(); @@ -216,7 +200,7 @@ public class PlayerInit { player.sendMessage("CHUNK COUNT " + player.getInstance().getChunks().size()); }); - globalEventHandler.addEventCallback(PickupItemEvent.class, event -> { + globalEventHandler.addListener(PickupItemEvent.class, event -> { final Entity entity = event.getLivingEntity(); if (entity instanceof Player) { // Cancel event if player does not have enough inventory space @@ -225,7 +209,7 @@ public class PlayerInit { } }); - globalEventHandler.addEventCallback(ItemDropEvent.class, event -> { + globalEventHandler.addListener(ItemDropEvent.class, event -> { final Player player = event.getPlayer(); ItemStack droppedItem = event.getItemStack(); @@ -237,12 +221,12 @@ public class PlayerInit { itemEntity.setVelocity(velocity); }); - globalEventHandler.addEventCallback(PlayerDisconnectEvent.class, event -> { + globalEventHandler.addListener(PlayerDisconnectEvent.class, event -> { final Player player = event.getPlayer(); System.out.println("DISCONNECTION " + player.getUsername()); }); - globalEventHandler.addEventCallback(PlayerLoginEvent.class, event -> { + globalEventHandler.addListener(PlayerLoginEvent.class, event -> { final Player player = event.getPlayer(); var instances = MinecraftServer.getInstanceManager().getInstances(); @@ -260,7 +244,7 @@ public class PlayerInit { }); }); - globalEventHandler.addEventCallback(PlayerSpawnEvent.class, event -> { + globalEventHandler.addListener(PlayerSpawnEvent.class, event -> { final Player player = event.getPlayer(); player.setGameMode(GameMode.CREATIVE); @@ -292,23 +276,23 @@ public class PlayerInit { } }); - globalEventHandler.addEventCallback(PlayerBlockBreakEvent.class, event -> { + globalEventHandler.addListener(PlayerBlockBreakEvent.class, event -> { final short blockStateId = event.getBlockStateId(); System.out.println("broke " + blockStateId + " " + Block.fromStateId(blockStateId)); }); - globalEventHandler.addEventCallback(PlayerUseItemEvent.class, useEvent -> { + globalEventHandler.addListener(PlayerUseItemEvent.class, useEvent -> { final Player player = useEvent.getPlayer(); player.sendMessage("Using item in air: " + useEvent.getItemStack().getMaterial()); }); - globalEventHandler.addEventCallback(PlayerUseItemOnBlockEvent.class, useEvent -> { + globalEventHandler.addListener(PlayerUseItemOnBlockEvent.class, useEvent -> { final Player player = useEvent.getPlayer(); player.sendMessage("Main item: " + player.getInventory().getItemInMainHand().getMaterial()); player.sendMessage("Using item on block: " + useEvent.getItemStack().getMaterial() + " at " + useEvent.getPosition() + " on face " + useEvent.getBlockFace()); }); - globalEventHandler.addEventCallback(PlayerChunkUnloadEvent.class, event -> { + globalEventHandler.addListener(PlayerChunkUnloadEvent.class, event -> { final Player player = event.getPlayer(); final Instance instance = player.getInstance(); From 030e5b6857d26979eb511454e3fb8a0060b5ad78 Mon Sep 17 00:00:00 2001 From: TheMode Date: Fri, 4 Jun 2021 07:45:15 +0200 Subject: [PATCH 070/104] Create #addListener0 to ensure proper stacktrace when adding a listener --- .../net/minestom/server/event/EventNode.java | 34 +++++++++++-------- 1 file changed, 19 insertions(+), 15 deletions(-) diff --git a/src/main/java/net/minestom/server/event/EventNode.java b/src/main/java/net/minestom/server/event/EventNode.java index 783a37adb..a9941885d 100644 --- a/src/main/java/net/minestom/server/event/EventNode.java +++ b/src/main/java/net/minestom/server/event/EventNode.java @@ -201,17 +201,11 @@ public class EventNode { } public EventNode addListener(@NotNull EventListener listener) { - synchronized (GLOBAL_CHILD_LOCK) { - final var eventType = listener.getEventType(); - this.listenerMap.computeIfAbsent(eventType, aClass -> new CopyOnWriteArrayList<>()) - .add((EventListener) listener); - if (parent != null) { - synchronized (parent.lock) { - parent.increaseListenerCount(eventType, 1); - } - } - } - return this; + return addListener0(listener); + } + + public EventNode addListener(@NotNull Class eventType, @NotNull Consumer<@NotNull E> listener) { + return addListener0(EventListener.of(eventType, listener)); } public EventNode removeListener(@NotNull EventListener listener) { @@ -230,10 +224,6 @@ public class EventNode { return this; } - public EventNode addListener(@NotNull Class eventType, @NotNull Consumer<@NotNull E> listener) { - return addListener(EventListener.of(eventType, listener)); - } - public EventNode map(@NotNull Object value, @NotNull EventNode node) { this.redirectionMap.put(value, (EventNode) node); return this; @@ -248,6 +238,20 @@ public class EventNode { return name; } + private EventNode addListener0(@NotNull EventListener listener) { + synchronized (GLOBAL_CHILD_LOCK) { + final var eventType = listener.getEventType(); + this.listenerMap.computeIfAbsent(eventType, aClass -> new CopyOnWriteArrayList<>()) + .add((EventListener) listener); + if (parent != null) { + synchronized (parent.lock) { + parent.increaseListenerCount(eventType, 1); + } + } + } + return this; + } + private void increaseListenerCount(Class eventClass, int count) { final int current = childEventMap.getInt(eventClass); final int result = current + count; From b979c9b6242e1156e0dc250b872492b1874671e7 Mon Sep 17 00:00:00 2001 From: TheMode Date: Fri, 4 Jun 2021 09:50:26 +0200 Subject: [PATCH 071/104] Temporary fix for mapped object --- .../net/minestom/server/event/EventNode.java | 35 +++++++++++++++---- 1 file changed, 28 insertions(+), 7 deletions(-) diff --git a/src/main/java/net/minestom/server/event/EventNode.java b/src/main/java/net/minestom/server/event/EventNode.java index a9941885d..230dd16ec 100644 --- a/src/main/java/net/minestom/server/event/EventNode.java +++ b/src/main/java/net/minestom/server/event/EventNode.java @@ -64,6 +64,21 @@ public class EventNode { return new EventNode<>(name, filter, predicate != null ? (e, o) -> predicate.test(e, (V) o) : null); } + private static final Map, EventFilter> REDIRECTION_MAP = new ConcurrentHashMap<>(); + + private static void registerMapping(EventFilter filter) { + final var type = filter.getEventType(); + REDIRECTION_MAP.put(type, (EventFilter) filter); + } + + static { + registerMapping(EventFilter.ENTITY); + registerMapping(EventFilter.PLAYER); + registerMapping(EventFilter.ITEM); + registerMapping(EventFilter.INSTANCE); + registerMapping(EventFilter.INVENTORY); + } + private final Map, List>> listenerMap = new ConcurrentHashMap<>(); private final Map> redirectionMap = new ConcurrentHashMap<>(); private final Set> children = new CopyOnWriteArraySet<>(); @@ -112,15 +127,21 @@ public class EventNode { return; } // Process redirection - if (filter != null) { - final Object handler = filter.getHandler(event); - if (handler != null && !redirectionMap.isEmpty()) { - final var node = redirectionMap.get(handler); - if (node != null) { - node.call(event); + if (!redirectionMap.isEmpty()) { + // Loop through register redirection + REDIRECTION_MAP.forEach((aClass, f) -> { + if (aClass.isAssignableFrom(eventClass)) { + final Object handler = f.getHandler(event); + if (handler != null) { + final var node = redirectionMap.get(handler); + if (node != null) { + node.call(event); + } + } } - } + }); } + // Process listener list final var listeners = listenerMap.get(eventClass); if (listeners != null && !listeners.isEmpty()) { From 2872a2532527a4810b61e4baccb3a24d00a0b6f1 Mon Sep 17 00:00:00 2001 From: TheMode Date: Fri, 4 Jun 2021 10:07:46 +0200 Subject: [PATCH 072/104] Improve redirection performance --- .../net/minestom/server/event/EventNode.java | 32 +++++++++++++------ 1 file changed, 23 insertions(+), 9 deletions(-) diff --git a/src/main/java/net/minestom/server/event/EventNode.java b/src/main/java/net/minestom/server/event/EventNode.java index 230dd16ec..4260e0570 100644 --- a/src/main/java/net/minestom/server/event/EventNode.java +++ b/src/main/java/net/minestom/server/event/EventNode.java @@ -65,6 +65,7 @@ public class EventNode { } private static final Map, EventFilter> REDIRECTION_MAP = new ConcurrentHashMap<>(); + private static final Map, List>> REDIRECTION_CACHE = new ConcurrentHashMap<>(); private static void registerMapping(EventFilter filter) { final var type = filter.getEventType(); @@ -129,19 +130,16 @@ public class EventNode { // Process redirection if (!redirectionMap.isEmpty()) { // Loop through register redirection - REDIRECTION_MAP.forEach((aClass, f) -> { - if (aClass.isAssignableFrom(eventClass)) { - final Object handler = f.getHandler(event); - if (handler != null) { - final var node = redirectionMap.get(handler); - if (node != null) { - node.call(event); - } + getRedirectionCache(event).forEach(redirectionFilter -> { + final Object handler = redirectionFilter.getHandler(event); + if (handler != null) { + final var node = redirectionMap.get(handler); + if (node != null) { + node.call(event); } } }); } - // Process listener list final var listeners = listenerMap.get(eventClass); if (listeners != null && !listeners.isEmpty()) { @@ -290,4 +288,20 @@ public class EventNode { throw new IllegalStateException("Something wrong happened, listener count: " + result); } } + + private static List> getRedirectionCache(Event event) { + return REDIRECTION_CACHE.computeIfAbsent(event.getClass(), + aClass -> findFilters(event)); + } + + private static List> findFilters(Event event) { + final var eventClass = event.getClass(); + List> filters = new ArrayList<>(); + REDIRECTION_MAP.forEach((aClass, f) -> { + if (aClass.isAssignableFrom(eventClass)) { + filters.add(f); + } + }); + return filters; + } } From 25f1183a1b2ab220133b29fc9f9319df9dc2c34f Mon Sep 17 00:00:00 2001 From: TheMode Date: Fri, 4 Jun 2021 21:12:27 +0200 Subject: [PATCH 073/104] Remove EventNode#map --- .../net/minestom/server/entity/Entity.java | 4 +- .../net/minestom/server/event/EventNode.java | 56 ------------------- .../server/event/handler/EventHandler.java | 5 ++ .../minestom/server/instance/Instance.java | 4 +- src/test/java/demo/PlayerInit.java | 4 ++ 5 files changed, 13 insertions(+), 60 deletions(-) diff --git a/src/main/java/net/minestom/server/entity/Entity.java b/src/main/java/net/minestom/server/entity/Entity.java index db8afd81c..0b06dcae5 100644 --- a/src/main/java/net/minestom/server/entity/Entity.java +++ b/src/main/java/net/minestom/server/entity/Entity.java @@ -156,8 +156,8 @@ public class Entity implements Viewable, Tickable, EventHandler, Da Entity.ENTITY_BY_ID.put(id, this); Entity.ENTITY_BY_UUID.put(uuid, this); - this.eventNode = EventNode.type("entity-" + uuid, EventFilter.ENTITY); - MinecraftServer.getGlobalEventHandler().map(this, eventNode); + this.eventNode = EventNode.value("entity-" + uuid, EventFilter.ENTITY, this::equals); + MinecraftServer.getGlobalEventHandler().addChild(eventNode); } public Entity(@NotNull EntityType entityType) { diff --git a/src/main/java/net/minestom/server/event/EventNode.java b/src/main/java/net/minestom/server/event/EventNode.java index 4260e0570..3b2ce732a 100644 --- a/src/main/java/net/minestom/server/event/EventNode.java +++ b/src/main/java/net/minestom/server/event/EventNode.java @@ -64,24 +64,7 @@ public class EventNode { return new EventNode<>(name, filter, predicate != null ? (e, o) -> predicate.test(e, (V) o) : null); } - private static final Map, EventFilter> REDIRECTION_MAP = new ConcurrentHashMap<>(); - private static final Map, List>> REDIRECTION_CACHE = new ConcurrentHashMap<>(); - - private static void registerMapping(EventFilter filter) { - final var type = filter.getEventType(); - REDIRECTION_MAP.put(type, (EventFilter) filter); - } - - static { - registerMapping(EventFilter.ENTITY); - registerMapping(EventFilter.PLAYER); - registerMapping(EventFilter.ITEM); - registerMapping(EventFilter.INSTANCE); - registerMapping(EventFilter.INVENTORY); - } - private final Map, List>> listenerMap = new ConcurrentHashMap<>(); - private final Map> redirectionMap = new ConcurrentHashMap<>(); private final Set> children = new CopyOnWriteArraySet<>(); protected final String name; @@ -127,19 +110,6 @@ public class EventNode { // Cancelled by superclass return; } - // Process redirection - if (!redirectionMap.isEmpty()) { - // Loop through register redirection - getRedirectionCache(event).forEach(redirectionFilter -> { - final Object handler = redirectionFilter.getHandler(event); - if (handler != null) { - final var node = redirectionMap.get(handler); - if (node != null) { - node.call(event); - } - } - }); - } // Process listener list final var listeners = listenerMap.get(eventClass); if (listeners != null && !listeners.isEmpty()) { @@ -243,16 +213,6 @@ public class EventNode { return this; } - public EventNode map(@NotNull Object value, @NotNull EventNode node) { - this.redirectionMap.put(value, (EventNode) node); - return this; - } - - public EventNode unmap(@NotNull Object value) { - this.redirectionMap.remove(value); - return this; - } - public @NotNull String getName() { return name; } @@ -288,20 +248,4 @@ public class EventNode { throw new IllegalStateException("Something wrong happened, listener count: " + result); } } - - private static List> getRedirectionCache(Event event) { - return REDIRECTION_CACHE.computeIfAbsent(event.getClass(), - aClass -> findFilters(event)); - } - - private static List> findFilters(Event event) { - final var eventClass = event.getClass(); - List> filters = new ArrayList<>(); - REDIRECTION_MAP.forEach((aClass, f) -> { - if (aClass.isAssignableFrom(eventClass)) { - filters.add(f); - } - }); - return filters; - } } diff --git a/src/main/java/net/minestom/server/event/handler/EventHandler.java b/src/main/java/net/minestom/server/event/handler/EventHandler.java index c78dcc9c3..95fc48b77 100644 --- a/src/main/java/net/minestom/server/event/handler/EventHandler.java +++ b/src/main/java/net/minestom/server/event/handler/EventHandler.java @@ -7,11 +7,16 @@ import org.jetbrains.annotations.NotNull; /** * Represents an element which can have {@link Event} listeners assigned to it. + *

+ * Use {@link EventNode} directly. */ +@Deprecated public interface EventHandler { + @Deprecated @NotNull EventNode getEventNode(); + @Deprecated default boolean addEventCallback(@NotNull Class eventClass, @NotNull EventCallback eventCallback) { var node = getEventNode(); node.addListener(eventClass, eventCallback::run); diff --git a/src/main/java/net/minestom/server/instance/Instance.java b/src/main/java/net/minestom/server/instance/Instance.java index 030e67b3a..b9dd86d39 100644 --- a/src/main/java/net/minestom/server/instance/Instance.java +++ b/src/main/java/net/minestom/server/instance/Instance.java @@ -120,8 +120,8 @@ public abstract class Instance implements BlockModifier, Tickable, EventHandler< this.worldBorder = new WorldBorder(this); - this.eventNode = EventNode.type("instance-" + uniqueId, EventFilter.INSTANCE); - MinecraftServer.getGlobalEventHandler().map(this, eventNode); + this.eventNode = EventNode.value("instance-" + uniqueId, EventFilter.INSTANCE, this::equals); + MinecraftServer.getGlobalEventHandler().addChild(eventNode); } /** diff --git a/src/test/java/demo/PlayerInit.java b/src/test/java/demo/PlayerInit.java index 5a7ec7fdd..537cd55b5 100644 --- a/src/test/java/demo/PlayerInit.java +++ b/src/test/java/demo/PlayerInit.java @@ -133,6 +133,10 @@ public class PlayerInit { packetController.setCancel(false); }); + connectionManager.addPlayerInitialization(player -> { + player.addEventCallback(PlayerTickEvent.class, event -> {}); + }); + // EVENT REGISTERING var globalNode = MinecraftServer.getGlobalEventHandler(); From 3dfd4678d5775447d2afa3fe8e957e6be22ac6d9 Mon Sep 17 00:00:00 2001 From: TheMode Date: Sat, 5 Jun 2021 01:04:51 +0200 Subject: [PATCH 074/104] Add `PlayerPacketEvent` --- .../event/player/PlayerPacketEvent.java | 38 +++++++++++++++++++ .../manager/PacketListenerManager.java | 20 ++++++++-- 2 files changed, 54 insertions(+), 4 deletions(-) create mode 100644 src/main/java/net/minestom/server/event/player/PlayerPacketEvent.java diff --git a/src/main/java/net/minestom/server/event/player/PlayerPacketEvent.java b/src/main/java/net/minestom/server/event/player/PlayerPacketEvent.java new file mode 100644 index 000000000..16e40806f --- /dev/null +++ b/src/main/java/net/minestom/server/event/player/PlayerPacketEvent.java @@ -0,0 +1,38 @@ +package net.minestom.server.event.player; + +import net.minestom.server.entity.Player; +import net.minestom.server.event.CancellableEvent; +import net.minestom.server.event.trait.PlayerEvent; +import net.minestom.server.network.packet.client.ClientPacket; +import org.jetbrains.annotations.NotNull; + +public class PlayerPacketEvent implements PlayerEvent, CancellableEvent { + + private final Player player; + private final ClientPacket packet; + private boolean cancelled; + + public PlayerPacketEvent(Player player, ClientPacket packet) { + this.player = player; + this.packet = packet; + } + + @Override + public @NotNull Player getPlayer() { + return player; + } + + public @NotNull ClientPacket getPacket() { + return packet; + } + + @Override + public boolean isCancelled() { + return cancelled; + } + + @Override + public void setCancelled(boolean cancel) { + this.cancelled = cancel; + } +} diff --git a/src/main/java/net/minestom/server/listener/manager/PacketListenerManager.java b/src/main/java/net/minestom/server/listener/manager/PacketListenerManager.java index 72f944ca0..48b0bced1 100644 --- a/src/main/java/net/minestom/server/listener/manager/PacketListenerManager.java +++ b/src/main/java/net/minestom/server/listener/manager/PacketListenerManager.java @@ -2,6 +2,8 @@ package net.minestom.server.listener.manager; import net.minestom.server.MinecraftServer; import net.minestom.server.entity.Player; +import net.minestom.server.event.EventDispatcher; +import net.minestom.server.event.player.PlayerPacketEvent; import net.minestom.server.listener.*; import net.minestom.server.network.ConnectionManager; import net.minestom.server.network.packet.client.ClientPlayPacket; @@ -74,13 +76,23 @@ public final class PacketListenerManager { LOGGER.warn("Packet " + clazz + " does not have any default listener! (The issue comes from Minestom)"); } - final PacketController packetController = new PacketController(); - for (ClientPacketConsumer clientPacketConsumer : CONNECTION_MANAGER.getReceivePacketConsumers()) { - clientPacketConsumer.accept(player, packetController, packet); + // TODO remove legacy + { + final PacketController packetController = new PacketController(); + for (ClientPacketConsumer clientPacketConsumer : CONNECTION_MANAGER.getReceivePacketConsumers()) { + clientPacketConsumer.accept(player, packetController, packet); + } + + if (packetController.isCancel()) + return; } - if (packetController.isCancel()) + // Event + PlayerPacketEvent playerPacketEvent = new PlayerPacketEvent(player, packet); + EventDispatcher.call(playerPacketEvent); + if (playerPacketEvent.isCancelled()) { return; + } // Finally execute the listener if (packetListenerConsumer != null) { From 180a3fa898f438a9f07504a71e4d35d1ef66c80d Mon Sep 17 00:00:00 2001 From: TheMode Date: Sun, 6 Jun 2021 07:28:07 +0200 Subject: [PATCH 075/104] Improve event calling performance, reduce memory footprint --- .../net/minestom/server/event/EventNode.java | 100 ++++++++++-------- 1 file changed, 57 insertions(+), 43 deletions(-) diff --git a/src/main/java/net/minestom/server/event/EventNode.java b/src/main/java/net/minestom/server/event/EventNode.java index 3b2ce732a..31a42f6bc 100644 --- a/src/main/java/net/minestom/server/event/EventNode.java +++ b/src/main/java/net/minestom/server/event/EventNode.java @@ -1,7 +1,5 @@ package net.minestom.server.event; -import it.unimi.dsi.fastutil.objects.Object2IntMap; -import it.unimi.dsi.fastutil.objects.Object2IntOpenHashMap; import net.minestom.server.tag.Tag; import net.minestom.server.tag.TagReadable; import net.minestom.server.utils.validate.Check; @@ -12,6 +10,7 @@ import java.util.*; import java.util.concurrent.ConcurrentHashMap; import java.util.concurrent.CopyOnWriteArrayList; import java.util.concurrent.CopyOnWriteArraySet; +import java.util.concurrent.atomic.AtomicIntegerFieldUpdater; import java.util.function.BiPredicate; import java.util.function.Consumer; import java.util.function.Predicate; @@ -64,19 +63,17 @@ public class EventNode { return new EventNode<>(name, filter, predicate != null ? (e, o) -> predicate.test(e, (V) o) : null); } - private final Map, List>> listenerMap = new ConcurrentHashMap<>(); + private static final Object GLOBAL_CHILD_LOCK = new Object(); + private final Object lock = new Object(); + + private final Map, ListenerEntry> listenerMap = new ConcurrentHashMap<>(); private final Set> children = new CopyOnWriteArraySet<>(); protected final String name; protected final EventFilter filter; protected final BiPredicate predicate; protected final Class eventType; - - // Tree data - private static final Object GLOBAL_CHILD_LOCK = new Object(); private volatile EventNode parent; - private final Object lock = new Object(); - private final Object2IntMap> childEventMap = new Object2IntOpenHashMap<>(); protected EventNode(@NotNull String name, @NotNull EventFilter filter, @@ -101,8 +98,7 @@ public class EventNode { } public void call(@NotNull T event) { - final var eventClass = event.getClass(); - if (!eventType.isAssignableFrom(eventClass)) { + if (!eventType.isInstance(event)) { // Invalid event type return; } @@ -111,7 +107,13 @@ public class EventNode { return; } // Process listener list - final var listeners = listenerMap.get(eventClass); + final var entry = listenerMap.get(event.getClass()); + if (entry == null) { + // No listener nor children + return; + } + + final var listeners = entry.listeners; if (listeners != null && !listeners.isEmpty()) { listeners.forEach(listener -> { final EventListener.Result result = listener.run(event); @@ -121,13 +123,9 @@ public class EventNode { }); } // Process children - synchronized (lock) { - if (childEventMap.isEmpty() || childEventMap.getInt(eventClass) < 1) { - // No listener in children - return; - } + if (entry.childCount > 0) { + this.children.forEach(eventNode -> eventNode.call(event)); } - this.children.forEach(eventNode -> eventNode.call(event)); } public void callCancellable(@NotNull T event, @NotNull Runnable successCallback) { @@ -137,6 +135,10 @@ public class EventNode { } } + public @NotNull String getName() { + return name; + } + public @Nullable EventNode getParent() { return parent; } @@ -163,8 +165,11 @@ public class EventNode { // Increase listener count synchronized (lock) { child.listenerMap.forEach((eventClass, eventListeners) -> { - final int childCount = eventListeners.size() + child.childEventMap.getInt(eventClass); - increaseListenerCount(eventClass, childCount); + final var entry = child.listenerMap.get(eventClass); + if (entry == null) + return; + final int childCount = entry.listeners.size() + entry.childCount; + increaseChildListenerCount(eventClass, childCount); }); } } @@ -180,8 +185,11 @@ public class EventNode { // Decrease listener count synchronized (lock) { child.listenerMap.forEach((eventClass, eventListeners) -> { - final int childCount = eventListeners.size() + child.childEventMap.getInt(eventClass); - decreaseListenerCount(eventClass, childCount); + final var entry = child.listenerMap.get(eventClass); + if (entry == null) + return; + final int childCount = entry.listeners.size() + entry.childCount; + decreaseChildListenerCount(eventClass, childCount); }); } } @@ -200,52 +208,58 @@ public class EventNode { public EventNode removeListener(@NotNull EventListener listener) { synchronized (GLOBAL_CHILD_LOCK) { final var eventType = listener.getEventType(); - var listeners = listenerMap.get(eventType); - if (listeners == null || listeners.isEmpty()) + var entry = listenerMap.get(eventType); + if (entry == null) return this; + var listeners = entry.listeners; final boolean removed = listeners.remove(listener); if (removed && parent != null) { synchronized (parent.lock) { - parent.decreaseListenerCount(eventType, 1); + parent.decreaseChildListenerCount(eventType, 1); } } } return this; } - public @NotNull String getName() { - return name; - } - private EventNode addListener0(@NotNull EventListener listener) { synchronized (GLOBAL_CHILD_LOCK) { final var eventType = listener.getEventType(); - this.listenerMap.computeIfAbsent(eventType, aClass -> new CopyOnWriteArrayList<>()) - .add((EventListener) listener); + var entry = listenerMap.computeIfAbsent(eventType, aClass -> new ListenerEntry<>()); + entry.listeners.add((EventListener) listener); if (parent != null) { synchronized (parent.lock) { - parent.increaseListenerCount(eventType, 1); + parent.increaseChildListenerCount(eventType, 1); } } } return this; } - private void increaseListenerCount(Class eventClass, int count) { - final int current = childEventMap.getInt(eventClass); - final int result = current + count; - this.childEventMap.put(eventClass, result); + private void increaseChildListenerCount(Class eventClass, int count) { + var entry = listenerMap.computeIfAbsent(eventClass, aClass -> new ListenerEntry<>()); + ListenerEntry.addAndGet(entry, count); } - private void decreaseListenerCount(Class eventClass, int count) { - final int current = childEventMap.getInt(eventClass); - final int result = current - count; - if (result == 0) { - this.childEventMap.removeInt(eventClass); - } else if (result > 0) { - this.childEventMap.put(eventClass, result); - } else { + private void decreaseChildListenerCount(Class eventClass, int count) { + var entry = listenerMap.computeIfAbsent(eventClass, aClass -> new ListenerEntry<>()); + final int result = ListenerEntry.addAndGet(entry, -count); + if (result == 0 && entry.listeners.isEmpty()) { + this.listenerMap.remove(eventClass); + } else if (result < 0) { throw new IllegalStateException("Something wrong happened, listener count: " + result); } } + + private static class ListenerEntry { + private static final AtomicIntegerFieldUpdater CHILD_UPDATER = + AtomicIntegerFieldUpdater.newUpdater(ListenerEntry.class, "childCount"); + + List> listeners = new CopyOnWriteArrayList<>(); + volatile int childCount; + + private static int addAndGet(ListenerEntry entry, int add) { + return CHILD_UPDATER.addAndGet(entry, add); + } + } } From 9594d848bca8113bb08f20a3d5e122a01abc041e Mon Sep 17 00:00:00 2001 From: TheMode Date: Sun, 6 Jun 2021 07:34:33 +0200 Subject: [PATCH 076/104] Use for-each loops during event calling --- src/main/java/net/minestom/server/event/EventNode.java | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/src/main/java/net/minestom/server/event/EventNode.java b/src/main/java/net/minestom/server/event/EventNode.java index 31a42f6bc..5aac8f499 100644 --- a/src/main/java/net/minestom/server/event/EventNode.java +++ b/src/main/java/net/minestom/server/event/EventNode.java @@ -115,16 +115,18 @@ public class EventNode { final var listeners = entry.listeners; if (listeners != null && !listeners.isEmpty()) { - listeners.forEach(listener -> { + for (EventListener listener : listeners) { final EventListener.Result result = listener.run(event); if (result == EventListener.Result.EXPIRED) { listeners.remove(listener); } - }); + } } // Process children if (entry.childCount > 0) { - this.children.forEach(eventNode -> eventNode.call(event)); + for (EventNode child : children) { + child.call(event); + } } } From c930eed412cb78c0c00ebf54f1e982b51df26e18 Mon Sep 17 00:00:00 2001 From: TheMode Date: Sun, 6 Jun 2021 07:55:30 +0200 Subject: [PATCH 077/104] propagate listener changes to parents --- src/main/java/net/minestom/server/event/EventNode.java | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/src/main/java/net/minestom/server/event/EventNode.java b/src/main/java/net/minestom/server/event/EventNode.java index 5aac8f499..63249e0e7 100644 --- a/src/main/java/net/minestom/server/event/EventNode.java +++ b/src/main/java/net/minestom/server/event/EventNode.java @@ -114,7 +114,7 @@ public class EventNode { } final var listeners = entry.listeners; - if (listeners != null && !listeners.isEmpty()) { + if (!listeners.isEmpty()) { for (EventListener listener : listeners) { final EventListener.Result result = listener.run(event); if (result == EventListener.Result.EXPIRED) { @@ -241,6 +241,9 @@ public class EventNode { private void increaseChildListenerCount(Class eventClass, int count) { var entry = listenerMap.computeIfAbsent(eventClass, aClass -> new ListenerEntry<>()); ListenerEntry.addAndGet(entry, count); + if (parent != null) { + parent.increaseChildListenerCount(eventClass, count); + } } private void decreaseChildListenerCount(Class eventClass, int count) { @@ -251,6 +254,9 @@ public class EventNode { } else if (result < 0) { throw new IllegalStateException("Something wrong happened, listener count: " + result); } + if (parent != null) { + parent.decreaseChildListenerCount(eventClass, count); + } } private static class ListenerEntry { From cf1e5222ca47eededdfd26146d999327ddd46543 Mon Sep 17 00:00:00 2001 From: TheMode Date: Tue, 8 Jun 2021 13:05:12 +0200 Subject: [PATCH 078/104] Fix rebase --- .../java/net/minestom/server/listener/UseItemListener.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/main/java/net/minestom/server/listener/UseItemListener.java b/src/main/java/net/minestom/server/listener/UseItemListener.java index 01245c1ab..8a29466e8 100644 --- a/src/main/java/net/minestom/server/listener/UseItemListener.java +++ b/src/main/java/net/minestom/server/listener/UseItemListener.java @@ -66,7 +66,7 @@ public class UseItemListener { // Eating code, contains the eating time customisation PlayerPreEatEvent playerPreEatEvent = new PlayerPreEatEvent(player, itemStack, hand, player.getDefaultEatingTime()); - player.callCancellableEvent(PlayerPreEatEvent.class, playerPreEatEvent, () -> player.refreshEating(hand, playerPreEatEvent.getEatingTime())); + EventDispatcher.callCancellable(playerPreEatEvent, () -> player.refreshEating(hand, playerPreEatEvent.getEatingTime())); if (playerPreEatEvent.isCancelled()) { cancelAnimation = true; @@ -75,7 +75,7 @@ public class UseItemListener { if (!cancelAnimation && itemAnimationType != null) { PlayerItemAnimationEvent playerItemAnimationEvent = new PlayerItemAnimationEvent(player, itemAnimationType); - player.callCancellableEvent(PlayerItemAnimationEvent.class, playerItemAnimationEvent, () -> { + EventDispatcher.callCancellable(playerItemAnimationEvent, () -> { player.refreshActiveHand(true, hand == Player.Hand.OFF, riptideSpinAttack); player.sendPacketToViewers(player.getMetadataPacket()); }); From f47159d131744d3385254eba8375fa66f7121a6d Mon Sep 17 00:00:00 2001 From: TheMode Date: Tue, 8 Jun 2021 13:47:10 +0200 Subject: [PATCH 079/104] Add EventNode#setPriority --- .../net/minestom/server/event/EventNode.java | 16 +++++++++++++--- 1 file changed, 13 insertions(+), 3 deletions(-) diff --git a/src/main/java/net/minestom/server/event/EventNode.java b/src/main/java/net/minestom/server/event/EventNode.java index 63249e0e7..910c4953d 100644 --- a/src/main/java/net/minestom/server/event/EventNode.java +++ b/src/main/java/net/minestom/server/event/EventNode.java @@ -73,6 +73,7 @@ public class EventNode { protected final EventFilter filter; protected final BiPredicate predicate; protected final Class eventType; + private volatile int priority; private volatile EventNode parent; protected EventNode(@NotNull String name, @@ -124,9 +125,9 @@ public class EventNode { } // Process children if (entry.childCount > 0) { - for (EventNode child : children) { - child.call(event); - } + this.children.stream() + .sorted(Comparator.comparing(EventNode::getPriority)) + .forEach(child -> child.call(event)); } } @@ -141,6 +142,15 @@ public class EventNode { return name; } + public int getPriority() { + return priority; + } + + public EventNode setPriority(int priority) { + this.priority = priority; + return this; + } + public @Nullable EventNode getParent() { return parent; } From 9705915e21b243f266b261629dc8902a14ea51f9 Mon Sep 17 00:00:00 2001 From: TheMode Date: Tue, 8 Jun 2021 14:07:27 +0200 Subject: [PATCH 080/104] Add support for predicate expiration --- .../minestom/server/event/EventListener.java | 21 +++++++++++-------- 1 file changed, 12 insertions(+), 9 deletions(-) diff --git a/src/main/java/net/minestom/server/event/EventListener.java b/src/main/java/net/minestom/server/event/EventListener.java index 93497f279..6bc1a9fe4 100644 --- a/src/main/java/net/minestom/server/event/EventListener.java +++ b/src/main/java/net/minestom/server/event/EventListener.java @@ -1,6 +1,5 @@ package net.minestom.server.event; -import net.minestom.server.utils.time.UpdateOption; import org.jetbrains.annotations.NotNull; import java.util.ArrayList; @@ -39,8 +38,8 @@ public interface EventListener { private final Class eventType; private final List> filters = new ArrayList<>(); - private int expirationCount; - private UpdateOption expirationTime; + private int expireCount; + private Predicate expireWhen; private Consumer handler; protected Builder(Class eventType) { @@ -52,13 +51,13 @@ public interface EventListener { return this; } - public EventListener.Builder expirationCount(int expirationCount) { - this.expirationCount = expirationCount; + public EventListener.Builder expireCount(int expireCount) { + this.expireCount = expireCount; return this; } - public EventListener.Builder expirationTime(UpdateOption expirationTime) { - this.expirationTime = expirationTime; + public EventListener.Builder expireWhen(Predicate expireWhen) { + this.expireWhen = expireWhen; return this; } @@ -68,7 +67,7 @@ public interface EventListener { } public @NotNull EventListener build() { - AtomicInteger expirationCount = new AtomicInteger(this.expirationCount); + AtomicInteger expirationCount = new AtomicInteger(this.expireCount); final boolean hasExpirationCount = expirationCount.get() > 0; final var filters = new ArrayList<>(this.filters); @@ -81,6 +80,10 @@ public interface EventListener { @Override public @NotNull Result run(@NotNull T event) { + // Expiration predicate + if (expireWhen != null && expireWhen.test(event)) { + return Result.EXPIRED; + } // Filtering if (!filters.isEmpty()) { if (filters.stream().anyMatch(filter -> !filter.test(event))) { @@ -92,7 +95,7 @@ public interface EventListener { if (handler != null) { handler.accept(event); } - // Expiration check + // Expiration count if (hasExpirationCount && expirationCount.decrementAndGet() == 0) { return Result.EXPIRED; } From 5469190e64e22d6e17518183dc64574f7e451024 Mon Sep 17 00:00:00 2001 From: TheMode Date: Tue, 8 Jun 2021 14:15:30 +0200 Subject: [PATCH 081/104] Add annotations --- .../minestom/server/event/EventListener.java | 24 ++++--- .../net/minestom/server/event/EventNode.java | 68 ++++++++++++------- 2 files changed, 59 insertions(+), 33 deletions(-) diff --git a/src/main/java/net/minestom/server/event/EventListener.java b/src/main/java/net/minestom/server/event/EventListener.java index 6bc1a9fe4..63c100c43 100644 --- a/src/main/java/net/minestom/server/event/EventListener.java +++ b/src/main/java/net/minestom/server/event/EventListener.java @@ -1,5 +1,6 @@ package net.minestom.server.event; +import org.jetbrains.annotations.Contract; import org.jetbrains.annotations.NotNull; import java.util.ArrayList; @@ -14,11 +15,13 @@ public interface EventListener { @NotNull Result run(@NotNull T event); - static EventListener.Builder builder(@NotNull Class eventType) { + @Contract(pure = true) + static EventListener.@NotNull Builder builder(@NotNull Class eventType) { return new EventListener.Builder<>(eventType); } - static EventListener of(@NotNull Class eventType, @NotNull Consumer<@NotNull T> listener) { + @Contract(pure = true) + static @NotNull EventListener of(@NotNull Class eventType, @NotNull Consumer<@NotNull T> listener) { return new EventListener<>() { @Override public @NotNull Class getEventType() { @@ -34,9 +37,7 @@ public interface EventListener { } class Builder { - private final Class eventType; - private final List> filters = new ArrayList<>(); private int expireCount; private Predicate expireWhen; @@ -46,30 +47,37 @@ public interface EventListener { this.eventType = eventType; } - public EventListener.Builder filter(Predicate filter) { + @Contract(value = "_ -> this") + public @NotNull EventListener.Builder filter(Predicate filter) { this.filters.add(filter); return this; } - public EventListener.Builder expireCount(int expireCount) { + @Contract(value = "_ -> this") + public @NotNull EventListener.Builder expireCount(int expireCount) { this.expireCount = expireCount; return this; } - public EventListener.Builder expireWhen(Predicate expireWhen) { + @Contract(value = "_ -> this") + public @NotNull EventListener.Builder expireWhen(Predicate expireWhen) { this.expireWhen = expireWhen; return this; } - public EventListener.Builder handler(Consumer handler) { + @Contract(value = "_ -> this") + public @NotNull EventListener.Builder handler(Consumer handler) { this.handler = handler; return this; } + @Contract(value = "-> new", pure = true) public @NotNull EventListener build() { AtomicInteger expirationCount = new AtomicInteger(this.expireCount); final boolean hasExpirationCount = expirationCount.get() > 0; + final Predicate expireWhen = this.expireWhen; + final var filters = new ArrayList<>(this.filters); final var handler = this.handler; return new EventListener<>() { diff --git a/src/main/java/net/minestom/server/event/EventNode.java b/src/main/java/net/minestom/server/event/EventNode.java index 910c4953d..f0ed8415d 100644 --- a/src/main/java/net/minestom/server/event/EventNode.java +++ b/src/main/java/net/minestom/server/event/EventNode.java @@ -3,6 +3,7 @@ package net.minestom.server.event; import net.minestom.server.tag.Tag; import net.minestom.server.tag.TagReadable; import net.minestom.server.utils.validate.Check; +import org.jetbrains.annotations.Contract; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; @@ -17,43 +18,50 @@ import java.util.function.Predicate; public class EventNode { - public static EventNode all(@NotNull String name) { + @Contract(value = "_ -> new", pure = true) + public static @NotNull EventNode all(@NotNull String name) { return type(name, EventFilter.ALL); } - public static EventNode type(@NotNull String name, - @NotNull EventFilter filter, - @NotNull BiPredicate predicate) { + @Contract(value = "_, _, _ -> new", pure = true) + public static @NotNull EventNode type(@NotNull String name, + @NotNull EventFilter filter, + @NotNull BiPredicate predicate) { return create(name, filter, predicate); } - public static EventNode type(@NotNull String name, - @NotNull EventFilter filter) { + @Contract(value = "_, _ -> new", pure = true) + public static @NotNull EventNode type(@NotNull String name, + @NotNull EventFilter filter) { return create(name, filter, null); } - public static EventNode event(@NotNull String name, - @NotNull EventFilter filter, - @NotNull Predicate predicate) { + @Contract(value = "_, _, _ -> new", pure = true) + public static @NotNull EventNode event(@NotNull String name, + @NotNull EventFilter filter, + @NotNull Predicate predicate) { return create(name, filter, (e, h) -> predicate.test(e)); } - public static EventNode value(@NotNull String name, - @NotNull EventFilter filter, - @NotNull Predicate predicate) { + @Contract(value = "_, _, _ -> new", pure = true) + public static @NotNull EventNode value(@NotNull String name, + @NotNull EventFilter filter, + @NotNull Predicate predicate) { return create(name, filter, (e, h) -> predicate.test(h)); } - public static EventNode tag(@NotNull String name, - @NotNull EventFilter filter, - @NotNull Tag tag) { + @Contract(value = "_, _, _ -> new", pure = true) + public static @NotNull EventNode tag(@NotNull String name, + @NotNull EventFilter filter, + @NotNull Tag tag) { return create(name, filter, (e, h) -> h.hasTag(tag)); } - public static EventNode tag(@NotNull String name, - @NotNull EventFilter filter, - @NotNull Tag tag, - @NotNull Predicate<@Nullable V> consumer) { + @Contract(value = "_, _, _, _ -> new", pure = true) + public static @NotNull EventNode tag(@NotNull String name, + @NotNull EventFilter filter, + @NotNull Tag tag, + @NotNull Predicate<@Nullable V> consumer) { return create(name, filter, (e, h) -> consumer.test(h.getTag(tag))); } @@ -138,23 +146,28 @@ public class EventNode { } } + @Contract(pure = true) public @NotNull String getName() { return name; } + @Contract(pure = true) public int getPriority() { return priority; } - public EventNode setPriority(int priority) { + @Contract(value = "_ -> this") + public @NotNull EventNode setPriority(int priority) { this.priority = priority; return this; } + @Contract(pure = true) public @Nullable EventNode getParent() { return parent; } + @Contract(pure = true) public @NotNull Set<@NotNull EventNode> getChildren() { return Collections.unmodifiableSet(children); } @@ -167,7 +180,8 @@ public class EventNode { return findChild(name, eventType); } - public EventNode addChild(@NotNull EventNode child) { + @Contract(value = "_ -> this") + public @NotNull EventNode addChild(@NotNull EventNode child) { synchronized (GLOBAL_CHILD_LOCK) { Check.stateCondition(child.parent != null, "Node already has a parent"); Check.stateCondition(Objects.equals(parent, child), "Cannot have a child as parent"); @@ -189,7 +203,8 @@ public class EventNode { return this; } - public EventNode removeChild(@NotNull EventNode child) { + @Contract(value = "_ -> this") + public @NotNull EventNode removeChild(@NotNull EventNode child) { synchronized (GLOBAL_CHILD_LOCK) { final boolean result = this.children.remove(child); if (result) { @@ -209,15 +224,18 @@ public class EventNode { return this; } - public EventNode addListener(@NotNull EventListener listener) { + @Contract(value = "_ -> this") + public @NotNull EventNode addListener(@NotNull EventListener listener) { return addListener0(listener); } - public EventNode addListener(@NotNull Class eventType, @NotNull Consumer<@NotNull E> listener) { + @Contract(value = "_, _ -> this") + public @NotNull EventNode addListener(@NotNull Class eventType, @NotNull Consumer<@NotNull E> listener) { return addListener0(EventListener.of(eventType, listener)); } - public EventNode removeListener(@NotNull EventListener listener) { + @Contract(value = "_ -> this") + public @NotNull EventNode removeListener(@NotNull EventListener listener) { synchronized (GLOBAL_CHILD_LOCK) { final var eventType = listener.getEventType(); var entry = listenerMap.get(eventType); From 1e90d67511b30980c1ffda847c6a248b7244e774 Mon Sep 17 00:00:00 2001 From: TheMode Date: Tue, 8 Jun 2021 14:20:48 +0200 Subject: [PATCH 082/104] Formatting --- .../java/net/minestom/server/event/trait/InstanceEvent.java | 2 +- .../java/net/minestom/server/event/trait/InventoryEvent.java | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/main/java/net/minestom/server/event/trait/InstanceEvent.java b/src/main/java/net/minestom/server/event/trait/InstanceEvent.java index af1f6d326..d122c290a 100644 --- a/src/main/java/net/minestom/server/event/trait/InstanceEvent.java +++ b/src/main/java/net/minestom/server/event/trait/InstanceEvent.java @@ -12,4 +12,4 @@ public interface InstanceEvent extends Event { * @return instance */ @NotNull Instance getInstance(); -} \ No newline at end of file +} diff --git a/src/main/java/net/minestom/server/event/trait/InventoryEvent.java b/src/main/java/net/minestom/server/event/trait/InventoryEvent.java index d102f5d20..25d26d4ad 100644 --- a/src/main/java/net/minestom/server/event/trait/InventoryEvent.java +++ b/src/main/java/net/minestom/server/event/trait/InventoryEvent.java @@ -12,4 +12,4 @@ public interface InventoryEvent extends Event { * @return the inventory, null if this is a player's inventory */ @Nullable Inventory getInventory(); -} \ No newline at end of file +} From 8c6d7ad1c334afca1a0bcf40b1caf91dca3418b6 Mon Sep 17 00:00:00 2001 From: TheMode Date: Tue, 8 Jun 2021 16:25:46 +0200 Subject: [PATCH 083/104] Provide an event node per extension --- .../minestom/server/extensions/Extension.java | 17 ++++++++++++-- .../server/extensions/ExtensionManager.java | 23 ++++++++++++++++++- 2 files changed, 37 insertions(+), 3 deletions(-) diff --git a/src/main/java/net/minestom/server/extensions/Extension.java b/src/main/java/net/minestom/server/extensions/Extension.java index 1272751cc..f3cbac22e 100644 --- a/src/main/java/net/minestom/server/extensions/Extension.java +++ b/src/main/java/net/minestom/server/extensions/Extension.java @@ -1,5 +1,7 @@ package net.minestom.server.extensions; +import net.minestom.server.event.Event; +import net.minestom.server.event.EventNode; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; import org.slf4j.Logger; @@ -14,7 +16,9 @@ import java.nio.file.Files; import java.nio.file.Path; import java.nio.file.Paths; import java.nio.file.StandardCopyOption; -import java.util.*; +import java.util.Collections; +import java.util.HashSet; +import java.util.Set; import java.util.concurrent.ConcurrentHashMap; import java.util.function.Consumer; @@ -25,6 +29,9 @@ public abstract class Extension { // Set by reflection @SuppressWarnings("unused") private Logger logger; + // Set by reflection + @SuppressWarnings("unused") + private EventNode eventNode; /** * Observers that will be notified of events related to this extension. @@ -78,6 +85,7 @@ public abstract class Extension { /** * Gets the logger for the extension + * * @return The logger for the extension */ @NotNull @@ -85,6 +93,10 @@ public abstract class Extension { return logger; } + public @NotNull EventNode getEventNode() { + return eventNode; + } + public @NotNull Path getDataDirectory() { return getOrigin().getDataDirectory(); } @@ -209,6 +221,7 @@ public abstract class Extension { /** * Calls some action on all valid observers of this extension + * * @param action code to execute on each observer */ public void triggerChange(Consumer action) { @@ -234,7 +247,7 @@ public abstract class Extension { */ public void cleanupObservers() { Reference ref; - while((ref = observerReferenceQueue.poll()) != null) { + while ((ref = observerReferenceQueue.poll()) != null) { observers.remove(ref); } } diff --git a/src/main/java/net/minestom/server/extensions/ExtensionManager.java b/src/main/java/net/minestom/server/extensions/ExtensionManager.java index 95ca6452e..53ca4e7f7 100644 --- a/src/main/java/net/minestom/server/extensions/ExtensionManager.java +++ b/src/main/java/net/minestom/server/extensions/ExtensionManager.java @@ -5,6 +5,8 @@ import net.minestom.dependencies.DependencyGetter; import net.minestom.dependencies.ResolvedDependency; import net.minestom.dependencies.maven.MavenRepository; import net.minestom.server.MinecraftServer; +import net.minestom.server.event.Event; +import net.minestom.server.event.EventNode; import net.minestom.server.extras.selfmodification.MinestomExtensionClassLoader; import net.minestom.server.extras.selfmodification.MinestomRootClassLoader; import net.minestom.server.ping.ResponseDataConsumer; @@ -25,7 +27,6 @@ import java.lang.reflect.Field; import java.lang.reflect.InvocationTargetException; import java.net.URL; import java.nio.file.Path; -import java.nio.file.Paths; import java.util.*; import java.util.stream.Collectors; import java.util.zip.ZipFile; @@ -280,6 +281,22 @@ public class ExtensionManager { LOGGER.error("Main class '{}' in '{}' has no logger field.", mainClass, extensionName, e); } + // Set event node + try { + EventNode eventNode = EventNode.all(extensionName); // Use the extension name + Field loggerField = Extension.class.getDeclaredField("eventNode"); + loggerField.setAccessible(true); + loggerField.set(extension, eventNode); + + MinecraftServer.getGlobalEventHandler().addChild(eventNode); + } catch (IllegalAccessException e) { + // We made it accessible, should not occur + MinecraftServer.getExceptionManager().handleException(e); + } catch (NoSuchFieldException e) { + // This should also not occur + LOGGER.error("Main class '{}' in '{}' has no event node field.", mainClass, extensionName, e); + } + // add dependents to pre-existing extensions, so that they can easily be found during reloading for (String dependencyName : discoveredExtension.getDependencies()) { Extension dependency = extensions.get(dependencyName.toLowerCase()); @@ -660,6 +677,10 @@ public class ExtensionManager { ext.triggerChange(observer -> observer.onExtensionUnload(extensionName)); // TODO: more callback types + // Remove event node + EventNode eventNode = ext.getEventNode(); + MinecraftServer.getGlobalEventHandler().removeChild(eventNode); + ext.postTerminate(); ext.unload(); From 92ca5f6be697765a6534619fae04da10c86e2b36 Mon Sep 17 00:00:00 2001 From: TheMode Date: Tue, 8 Jun 2021 16:43:22 +0200 Subject: [PATCH 084/104] Simplify PlayerInit --- src/test/java/demo/PlayerInit.java | 278 ++++++++--------------------- 1 file changed, 72 insertions(+), 206 deletions(-) diff --git a/src/test/java/demo/PlayerInit.java b/src/test/java/demo/PlayerInit.java index 537cd55b5..e7cc656aa 100644 --- a/src/test/java/demo/PlayerInit.java +++ b/src/test/java/demo/PlayerInit.java @@ -10,29 +10,27 @@ import net.minestom.server.entity.GameMode; import net.minestom.server.entity.ItemEntity; import net.minestom.server.entity.Player; import net.minestom.server.entity.damage.DamageType; -import net.minestom.server.event.EventFilter; +import net.minestom.server.event.Event; import net.minestom.server.event.EventNode; -import net.minestom.server.event.GlobalEventHandler; import net.minestom.server.event.entity.EntityAttackEvent; import net.minestom.server.event.item.ItemDropEvent; import net.minestom.server.event.item.PickupItemEvent; -import net.minestom.server.event.player.*; -import net.minestom.server.instance.Chunk; +import net.minestom.server.event.player.PlayerDeathEvent; +import net.minestom.server.event.player.PlayerDisconnectEvent; +import net.minestom.server.event.player.PlayerLoginEvent; +import net.minestom.server.event.player.PlayerSpawnEvent; import net.minestom.server.instance.Instance; import net.minestom.server.instance.InstanceContainer; import net.minestom.server.instance.InstanceManager; import net.minestom.server.instance.block.Block; -import net.minestom.server.instance.block.CustomBlock; import net.minestom.server.inventory.Inventory; import net.minestom.server.inventory.InventoryType; -import net.minestom.server.inventory.PlayerInventory; import net.minestom.server.item.ItemStack; import net.minestom.server.item.ItemTag; import net.minestom.server.item.Material; import net.minestom.server.item.metadata.CompassMeta; import net.minestom.server.monitoring.BenchmarkManager; import net.minestom.server.monitoring.TickMonitor; -import net.minestom.server.network.ConnectionManager; import net.minestom.server.utils.MathUtils; import net.minestom.server.utils.Position; import net.minestom.server.utils.Vector; @@ -40,7 +38,6 @@ import net.minestom.server.utils.time.TimeUnit; import net.minestom.server.world.DimensionType; import java.util.Collection; -import java.util.Collections; import java.util.Random; import java.util.Set; import java.util.concurrent.ThreadLocalRandom; @@ -50,6 +47,70 @@ public class PlayerInit { private static final Inventory inventory; + private static final EventNode DEMO_NODE = EventNode.all("demo") + .addListener(EntityAttackEvent.class, event -> { + final Entity source = event.getEntity(); + final Entity entity = event.getTarget(); + if (entity instanceof Player) { + Player target = (Player) entity; + Vector velocity = source.getPosition().clone().getDirection().multiply(4); + velocity.setY(3.5f); + target.setVelocity(velocity); + target.damage(DamageType.fromEntity(source), 5); + } else { + Vector velocity = source.getPosition().clone().getDirection().multiply(3); + velocity.setY(3f); + entity.setVelocity(velocity); + } + + if (source instanceof Player) { + ((Player) source).sendMessage("You attacked something!"); + } + }) + .addListener(PlayerDeathEvent.class, event -> event.setChatMessage(Component.text("custom death message"))) + .addListener(PickupItemEvent.class, event -> { + final Entity entity = event.getLivingEntity(); + if (entity instanceof Player) { + // Cancel event if player does not have enough inventory space + final ItemStack itemStack = event.getItemEntity().getItemStack(); + event.setCancelled(!((Player) entity).getInventory().addItemStack(itemStack)); + } + }) + .addListener(ItemDropEvent.class, event -> { + final Player player = event.getPlayer(); + ItemStack droppedItem = event.getItemStack(); + + Position position = player.getPosition().clone().add(0, 1.5f, 0); + ItemEntity itemEntity = new ItemEntity(droppedItem, position); + itemEntity.setPickupDelay(500, TimeUnit.MILLISECOND); + itemEntity.setInstance(player.getInstance()); + Vector velocity = player.getPosition().clone().getDirection().multiply(6); + itemEntity.setVelocity(velocity); + }) + .addListener(PlayerDisconnectEvent.class, event -> System.out.println("DISCONNECTION " + event.getPlayer().getUsername())) + .addListener(PlayerLoginEvent.class, event -> { + final Player player = event.getPlayer(); + + var instances = MinecraftServer.getInstanceManager().getInstances(); + Instance instance = instances.stream().skip(new Random().nextInt(instances.size())).findFirst().orElse(null); + event.setSpawningInstance(instance); + int x = Math.abs(ThreadLocalRandom.current().nextInt()) % 500 - 250; + int z = Math.abs(ThreadLocalRandom.current().nextInt()) % 500 - 250; + player.setRespawnPoint(new Position(0, 42f, 0)); + }) + .addListener(PlayerSpawnEvent.class, event -> { + final Player player = event.getPlayer(); + player.setGameMode(GameMode.CREATIVE); + player.setPermissionLevel(4); + ItemStack itemStack = ItemStack.builder(Material.STONE) + .amount(64) + .meta(itemMetaBuilder -> + itemMetaBuilder.canPlaceOn(Set.of(Block.STONE)) + .canDestroy(Set.of(Block.DIAMOND_ORE))) + .build(); + player.getInventory().addItemStack(itemStack); + }); + static { InstanceManager instanceManager = MinecraftServer.getInstanceManager(); //StorageLocation storageLocation = MinecraftServer.getStorageManager().getLocation("instance_data", new StorageOptions().setCompression(true)); @@ -93,16 +154,13 @@ public class PlayerInit { private static AtomicReference LAST_TICK = new AtomicReference<>(); public static void init() { - ConnectionManager connectionManager = MinecraftServer.getConnectionManager(); - BenchmarkManager benchmarkManager = MinecraftServer.getBenchmarkManager(); - + MinecraftServer.getGlobalEventHandler().addChild(DEMO_NODE); MinecraftServer.getUpdateManager().addTickMonitor(tickMonitor -> LAST_TICK.set(tickMonitor)); + BenchmarkManager benchmarkManager = MinecraftServer.getBenchmarkManager(); MinecraftServer.getSchedulerManager().buildTask(() -> { - - Collection players = connectionManager.getOnlinePlayers(); - + Collection players = MinecraftServer.getConnectionManager().getOnlinePlayers(); if (players.isEmpty()) return; @@ -110,7 +168,6 @@ public class PlayerInit { ramUsage /= 1e6; // bytes to MB TickMonitor tickMonitor = LAST_TICK.get(); - final Component header = Component.text("RAM USAGE: " + ramUsage + " MB") .append(Component.newline()) .append(Component.text("TICK TIME: " + MathUtils.round(tickMonitor.getTickTime(), 2) + "ms")) @@ -118,198 +175,7 @@ public class PlayerInit { .append(Component.text("ACQ TIME: " + MathUtils.round(tickMonitor.getAcquisitionTime(), 2) + "ms")); final Component footer = benchmarkManager.getCpuMonitoringMessage(); Audiences.players().sendPlayerListHeaderAndFooter(header, footer); - }).repeat(10, TimeUnit.TICK).schedule(); - - connectionManager.onPacketReceive((player, packetController, packet) -> { - // Listen to all received packet - //System.out.println("PACKET: "+packet.getClass().getSimpleName()); - packetController.setCancel(false); - }); - - connectionManager.onPacketSend((players, packetController, packet) -> { - // Listen to all sent packet - //System.out.println("PACKET: " + packet.getClass().getSimpleName()); - packetController.setCancel(false); - }); - - connectionManager.addPlayerInitialization(player -> { - player.addEventCallback(PlayerTickEvent.class, event -> {}); - }); - - // EVENT REGISTERING - - var globalNode = MinecraftServer.getGlobalEventHandler(); - var node = EventNode.value("test-builder", EventFilter.PLAYER, player -> player.getUsername().equals("TheMode911")) - .addListener(PlayerMoveEvent.class, event -> System.out.println("move!")) - .addListener(PlayerTickEvent.class, event -> System.out.println("tick!")); - globalNode.addChild(node); - globalNode.removeChild(node); - - //var child = node.findChild("name"); - //child.addListener(PlayerTickEvent.class, (event) -> { - //}); - //node.addChild(tagNode); -> Error: cannot add an item listener to a player node - - GlobalEventHandler globalEventHandler = MinecraftServer.getGlobalEventHandler(); - globalEventHandler.addListener(EntityAttackEvent.class, event -> { - final Entity source = event.getEntity(); - final Entity entity = event.getTarget(); - if (entity instanceof Player) { - Player target = (Player) entity; - Vector velocity = source.getPosition().clone().getDirection().multiply(4); - velocity.setY(3.5f); - target.setVelocity(velocity); - target.damage(DamageType.fromEntity(source), 5); - } else { - Vector velocity = source.getPosition().clone().getDirection().multiply(3); - velocity.setY(3f); - entity.setVelocity(velocity); - } - - if (source instanceof Player) { - ((Player) source).sendMessage("You attacked something!"); - } - }); - - globalEventHandler.addListener(PlayerDeathEvent.class, event -> { - event.setChatMessage(Component.text("custom death message")); - }); - - globalEventHandler.addListener(PlayerBlockPlaceEvent.class, event -> { - if (event.getHand() != Player.Hand.MAIN) - return; - - final Block block = Block.fromStateId(event.getBlockStateId()); - - if (block == Block.STONE) { - event.setCustomBlock("custom_block"); - System.out.println("custom stone"); - } - if (block == Block.TORCH) { - event.setCustomBlock((short) 3); // custom torch block - } - - }); - - globalEventHandler.addListener(PlayerBlockInteractEvent.class, event -> { - if (event.getHand() != Player.Hand.MAIN) - return; - final Player player = event.getPlayer(); - - final short blockStateId = player.getInstance().getBlockStateId(event.getBlockPosition()); - final CustomBlock customBlock = player.getInstance().getCustomBlock(event.getBlockPosition()); - final Block block = Block.fromStateId(blockStateId); - player.sendMessage("You clicked at the block " + block + " " + customBlock); - player.sendMessage("CHUNK COUNT " + player.getInstance().getChunks().size()); - }); - - globalEventHandler.addListener(PickupItemEvent.class, event -> { - final Entity entity = event.getLivingEntity(); - if (entity instanceof Player) { - // Cancel event if player does not have enough inventory space - final ItemStack itemStack = event.getItemEntity().getItemStack(); - event.setCancelled(!((Player) entity).getInventory().addItemStack(itemStack)); - } - }); - - globalEventHandler.addListener(ItemDropEvent.class, event -> { - final Player player = event.getPlayer(); - ItemStack droppedItem = event.getItemStack(); - - Position position = player.getPosition().clone().add(0, 1.5f, 0); - ItemEntity itemEntity = new ItemEntity(droppedItem, position); - itemEntity.setPickupDelay(500, TimeUnit.MILLISECOND); - itemEntity.setInstance(player.getInstance()); - Vector velocity = player.getPosition().clone().getDirection().multiply(6); - itemEntity.setVelocity(velocity); - }); - - globalEventHandler.addListener(PlayerDisconnectEvent.class, event -> { - final Player player = event.getPlayer(); - System.out.println("DISCONNECTION " + player.getUsername()); - }); - - globalEventHandler.addListener(PlayerLoginEvent.class, event -> { - final Player player = event.getPlayer(); - - var instances = MinecraftServer.getInstanceManager().getInstances(); - Instance instance = instances.stream().skip(new Random().nextInt(instances.size())).findFirst().orElse(null); - event.setSpawningInstance(instance); - int x = Math.abs(ThreadLocalRandom.current().nextInt()) % 500 - 250; - int z = Math.abs(ThreadLocalRandom.current().nextInt()) % 500 - 250; - player.setRespawnPoint(new Position(0, 42f, 0)); - - player.getInventory().addInventoryCondition((p, slot, clickType, inventoryConditionResult) -> { - if (slot == -999) - return; - //ItemStack itemStack = p.getInventory().getItemStack(slot); - //System.out.println("test " + itemStack.getIdentifier() + " " + itemStack.getData()); - }); - }); - - globalEventHandler.addListener(PlayerSpawnEvent.class, event -> { - final Player player = event.getPlayer(); - player.setGameMode(GameMode.CREATIVE); - - player.setPermissionLevel(4); - - PlayerInventory inventory = player.getInventory(); - ItemStack itemStack = ItemStack.builder(Material.STONE) - .amount(64) - .meta(itemMetaBuilder -> - itemMetaBuilder.canPlaceOn(Set.of(Block.STONE)) - .canDestroy(Set.of(Block.DIAMOND_ORE))) - .build(); - - //itemStack = itemStack.withStore(storeBuilder -> storeBuilder.set("key2", 25, Integer::sum)); - - inventory.addItemStack(itemStack); - - { - ItemStack item = ItemStack.builder(Material.DIAMOND_CHESTPLATE) - .displayName(Component.text("test")) - .lore(Component.text("lore")) - .build(); - - //inventory.setChestplate(item); - - inventory.setChestplate(item.with(itemStackBuilder -> { - itemStackBuilder.lore(Collections.emptyList()); - })); - } - }); - - globalEventHandler.addListener(PlayerBlockBreakEvent.class, event -> { - final short blockStateId = event.getBlockStateId(); - System.out.println("broke " + blockStateId + " " + Block.fromStateId(blockStateId)); - }); - - globalEventHandler.addListener(PlayerUseItemEvent.class, useEvent -> { - final Player player = useEvent.getPlayer(); - player.sendMessage("Using item in air: " + useEvent.getItemStack().getMaterial()); - }); - - globalEventHandler.addListener(PlayerUseItemOnBlockEvent.class, useEvent -> { - final Player player = useEvent.getPlayer(); - player.sendMessage("Main item: " + player.getInventory().getItemInMainHand().getMaterial()); - player.sendMessage("Using item on block: " + useEvent.getItemStack().getMaterial() + " at " + useEvent.getPosition() + " on face " + useEvent.getBlockFace()); - }); - - globalEventHandler.addListener(PlayerChunkUnloadEvent.class, event -> { - final Player player = event.getPlayer(); - final Instance instance = player.getInstance(); - - Chunk chunk = instance.getChunk(event.getChunkX(), event.getChunkZ()); - - if (chunk == null) - return; - - // Unload the chunk (save memory) if it has no remaining viewer - if (chunk.getViewers().isEmpty()) { - //player.getInstance().unloadChunk(chunk); - } - }); } From eb3cdd14952361e8ba09e534ad3150850391922e Mon Sep 17 00:00:00 2001 From: TheMode Date: Tue, 8 Jun 2021 16:55:21 +0200 Subject: [PATCH 085/104] Added EventNode#findChildren --- .../net/minestom/server/event/EventNode.java | 24 +++++++++++++++---- 1 file changed, 20 insertions(+), 4 deletions(-) diff --git a/src/main/java/net/minestom/server/event/EventNode.java b/src/main/java/net/minestom/server/event/EventNode.java index f0ed8415d..4a440cf55 100644 --- a/src/main/java/net/minestom/server/event/EventNode.java +++ b/src/main/java/net/minestom/server/event/EventNode.java @@ -172,12 +172,28 @@ public class EventNode { return Collections.unmodifiableSet(children); } - public @NotNull EventNode findChild(@NotNull String name, Class eventType) { - return null; + @Contract(pure = true) + public @NotNull List> findChildren(@NotNull String name, Class eventType) { + synchronized (GLOBAL_CHILD_LOCK) { + if (children.isEmpty()) { + return Collections.emptyList(); + } + List> result = new ArrayList<>(); + this.children.forEach(child -> { + final boolean nameCheck = child.getName().equals(name); + final boolean typeCheck = child.eventType.isAssignableFrom(eventType); + if (nameCheck && typeCheck) { + result.add((EventNode) child); + } + result.addAll(child.findChildren(name, eventType)); + }); + return result; + } } - public @NotNull EventNode findChild(@NotNull String name) { - return findChild(name, eventType); + @Contract(pure = true) + public @NotNull List> findChildren(@NotNull String name) { + return findChildren(name, eventType); } @Contract(value = "_ -> this") From 34cde8390aa574469d4d6a2737b38d12dd9eb2d6 Mon Sep 17 00:00:00 2001 From: TheMode Date: Tue, 8 Jun 2021 17:09:24 +0200 Subject: [PATCH 086/104] Add more node children manipulation methods --- .../net/minestom/server/event/EventNode.java | 53 ++++++++++++++++--- src/test/java/demo/PlayerInit.java | 8 ++- 2 files changed, 54 insertions(+), 7 deletions(-) diff --git a/src/main/java/net/minestom/server/event/EventNode.java b/src/main/java/net/minestom/server/event/EventNode.java index 4a440cf55..55d49948f 100644 --- a/src/main/java/net/minestom/server/event/EventNode.java +++ b/src/main/java/net/minestom/server/event/EventNode.java @@ -174,15 +174,13 @@ public class EventNode { @Contract(pure = true) public @NotNull List> findChildren(@NotNull String name, Class eventType) { + if (children.isEmpty()) { + return Collections.emptyList(); + } synchronized (GLOBAL_CHILD_LOCK) { - if (children.isEmpty()) { - return Collections.emptyList(); - } List> result = new ArrayList<>(); this.children.forEach(child -> { - final boolean nameCheck = child.getName().equals(name); - final boolean typeCheck = child.eventType.isAssignableFrom(eventType); - if (nameCheck && typeCheck) { + if (EventNode.equals(child, name, eventType)) { result.add((EventNode) child); } result.addAll(child.findChildren(name, eventType)); @@ -196,6 +194,43 @@ public class EventNode { return findChildren(name, eventType); } + public void replaceChildren(@NotNull String name, @NotNull Class eventType, @NotNull EventNode eventNode) { + if (children.isEmpty()) { + return; + } + synchronized (GLOBAL_CHILD_LOCK) { + this.children.forEach(child -> { + if (EventNode.equals(child, name, eventType)) { + removeChild(child); + addChild(eventNode); + } + child.replaceChildren(name, eventType, eventNode); + }); + } + } + + public void replaceChildren(@NotNull String name, @NotNull EventNode eventNode) { + replaceChildren(name, eventType, eventNode); + } + + public void removeChildren(@NotNull String name, @NotNull Class eventType) { + if (children.isEmpty()) { + return; + } + synchronized (GLOBAL_CHILD_LOCK) { + this.children.forEach(child -> { + if (EventNode.equals(child, name, eventType)) { + removeChild(child); + } + child.removeChildren(name, eventType); + }); + } + } + + public void removeChildren(@NotNull String name) { + removeChildren(name, eventType); + } + @Contract(value = "_ -> this") public @NotNull EventNode addChild(@NotNull EventNode child) { synchronized (GLOBAL_CHILD_LOCK) { @@ -303,6 +338,12 @@ public class EventNode { } } + private static boolean equals(EventNode node, String name, Class eventType) { + final boolean nameCheck = node.getName().equals(name); + final boolean typeCheck = node.eventType.isAssignableFrom(eventType); + return nameCheck && typeCheck; + } + private static class ListenerEntry { private static final AtomicIntegerFieldUpdater CHILD_UPDATER = AtomicIntegerFieldUpdater.newUpdater(ListenerEntry.class, "childCount"); diff --git a/src/test/java/demo/PlayerInit.java b/src/test/java/demo/PlayerInit.java index e7cc656aa..7688bbf7d 100644 --- a/src/test/java/demo/PlayerInit.java +++ b/src/test/java/demo/PlayerInit.java @@ -154,7 +154,13 @@ public class PlayerInit { private static AtomicReference LAST_TICK = new AtomicReference<>(); public static void init() { - MinecraftServer.getGlobalEventHandler().addChild(DEMO_NODE); + var eventHandler = MinecraftServer.getGlobalEventHandler(); + eventHandler.addChild(DEMO_NODE); + var children = eventHandler.findChildren("demo", Event.class); + eventHandler.replaceChildren("demo", Event.class, EventNode.all("new_demo")); + eventHandler.replaceChildren("new_demo", EventNode.all("new_demo2")); + eventHandler.removeChildren("new_demo2"); + MinecraftServer.getUpdateManager().addTickMonitor(tickMonitor -> LAST_TICK.set(tickMonitor)); From 3fae5ed35f8c6b748259673581495761655f2edd Mon Sep 17 00:00:00 2001 From: TheMode Date: Tue, 8 Jun 2021 17:18:00 +0200 Subject: [PATCH 087/104] Fix checks --- .../java/net/minestom/server/event/EventNode.java | 9 ++++++--- src/test/java/demo/PlayerInit.java | 12 +++++------- 2 files changed, 11 insertions(+), 10 deletions(-) diff --git a/src/main/java/net/minestom/server/event/EventNode.java b/src/main/java/net/minestom/server/event/EventNode.java index 55d49948f..fd6e2dbd0 100644 --- a/src/main/java/net/minestom/server/event/EventNode.java +++ b/src/main/java/net/minestom/server/event/EventNode.java @@ -107,7 +107,8 @@ public class EventNode { } public void call(@NotNull T event) { - if (!eventType.isInstance(event)) { + final var eventClass = event.getClass(); + if (!eventType.isAssignableFrom(eventClass)) { // Invalid event type return; } @@ -116,7 +117,7 @@ public class EventNode { return; } // Process listener list - final var entry = listenerMap.get(event.getClass()); + final var entry = listenerMap.get(eventClass); if (entry == null) { // No listener nor children return; @@ -203,6 +204,7 @@ public class EventNode { if (EventNode.equals(child, name, eventType)) { removeChild(child); addChild(eventNode); + return; } child.replaceChildren(name, eventType, eventNode); }); @@ -221,6 +223,7 @@ public class EventNode { this.children.forEach(child -> { if (EventNode.equals(child, name, eventType)) { removeChild(child); + return; } child.removeChildren(name, eventType); }); @@ -340,7 +343,7 @@ public class EventNode { private static boolean equals(EventNode node, String name, Class eventType) { final boolean nameCheck = node.getName().equals(name); - final boolean typeCheck = node.eventType.isAssignableFrom(eventType); + final boolean typeCheck = eventType.isAssignableFrom(node.eventType); return nameCheck && typeCheck; } diff --git a/src/test/java/demo/PlayerInit.java b/src/test/java/demo/PlayerInit.java index 7688bbf7d..485347368 100644 --- a/src/test/java/demo/PlayerInit.java +++ b/src/test/java/demo/PlayerInit.java @@ -11,14 +11,13 @@ import net.minestom.server.entity.ItemEntity; import net.minestom.server.entity.Player; import net.minestom.server.entity.damage.DamageType; import net.minestom.server.event.Event; +import net.minestom.server.event.EventFilter; import net.minestom.server.event.EventNode; import net.minestom.server.event.entity.EntityAttackEvent; import net.minestom.server.event.item.ItemDropEvent; import net.minestom.server.event.item.PickupItemEvent; -import net.minestom.server.event.player.PlayerDeathEvent; -import net.minestom.server.event.player.PlayerDisconnectEvent; -import net.minestom.server.event.player.PlayerLoginEvent; -import net.minestom.server.event.player.PlayerSpawnEvent; +import net.minestom.server.event.player.*; +import net.minestom.server.event.trait.PlayerEvent; import net.minestom.server.instance.Instance; import net.minestom.server.instance.InstanceContainer; import net.minestom.server.instance.InstanceManager; @@ -157,9 +156,8 @@ public class PlayerInit { var eventHandler = MinecraftServer.getGlobalEventHandler(); eventHandler.addChild(DEMO_NODE); var children = eventHandler.findChildren("demo", Event.class); - eventHandler.replaceChildren("demo", Event.class, EventNode.all("new_demo")); - eventHandler.replaceChildren("new_demo", EventNode.all("new_demo2")); - eventHandler.removeChildren("new_demo2"); + + eventHandler.replaceChildren("demo", PlayerEvent.class, EventNode.type("random", EventFilter.PLAYER)); MinecraftServer.getUpdateManager().addTickMonitor(tickMonitor -> LAST_TICK.set(tickMonitor)); From d38c0368fc48ef080b387675286760e14a5c8c2d Mon Sep 17 00:00:00 2001 From: Matt Worzala Date: Tue, 8 Jun 2021 16:58:48 -0400 Subject: [PATCH 088/104] add event api javadocs v1 --- .../server/event/CancellableEvent.java | 1 + .../java/net/minestom/server/event/Event.java | 2 +- .../minestom/server/event/EventFilter.java | 26 +++ .../minestom/server/event/EventListener.java | 35 +++ .../net/minestom/server/event/EventNode.java | 199 +++++++++++++++++- .../server/event/trait/EntityEvent.java | 3 + .../server/event/trait/InstanceEvent.java | 3 + .../server/event/trait/InventoryEvent.java | 3 + .../server/event/trait/ItemEvent.java | 3 + .../server/event/trait/PlayerEvent.java | 3 + 10 files changed, 270 insertions(+), 8 deletions(-) diff --git a/src/main/java/net/minestom/server/event/CancellableEvent.java b/src/main/java/net/minestom/server/event/CancellableEvent.java index ef821f834..aae8df57d 100644 --- a/src/main/java/net/minestom/server/event/CancellableEvent.java +++ b/src/main/java/net/minestom/server/event/CancellableEvent.java @@ -2,6 +2,7 @@ package net.minestom.server.event; /** * Represents an {@link Event} which can be cancelled. + * Called using {@link EventDispatcher#callCancellable(CancellableEvent, Runnable)}. */ public interface CancellableEvent extends Event { diff --git a/src/main/java/net/minestom/server/event/Event.java b/src/main/java/net/minestom/server/event/Event.java index 6253a2cd4..7c2408b1a 100644 --- a/src/main/java/net/minestom/server/event/Event.java +++ b/src/main/java/net/minestom/server/event/Event.java @@ -5,7 +5,7 @@ import net.minestom.server.event.handler.EventHandler; /** * Event which can be listened to by an {@link EventHandler}. *

- * Called using {@link EventHandler#callEvent(Class, Event)}. + * Called using {@link EventDispatcher#call(Event)}. */ public interface Event { } diff --git a/src/main/java/net/minestom/server/event/EventFilter.java b/src/main/java/net/minestom/server/event/EventFilter.java index 3bdda0dea..4a7740266 100644 --- a/src/main/java/net/minestom/server/event/EventFilter.java +++ b/src/main/java/net/minestom/server/event/EventFilter.java @@ -11,6 +11,20 @@ import org.jetbrains.annotations.Nullable; import java.util.function.Function; +/** + * Represents a filter for a specific {@link Event} type. + *

+ * 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. + *

+ * 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 The event type to filter + * @param The handler type to filter on. + */ public interface EventFilter { EventFilter ALL = from(Event.class, null); @@ -35,7 +49,19 @@ public interface EventFilter { }; } + /** + * 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 + */ @Nullable H getHandler(@NotNull E event); + /** + * The event type to filter on. + * + * @return The event type. + */ @NotNull Class getEventType(); } diff --git a/src/main/java/net/minestom/server/event/EventListener.java b/src/main/java/net/minestom/server/event/EventListener.java index 63c100c43..3d2c41036 100644 --- a/src/main/java/net/minestom/server/event/EventListener.java +++ b/src/main/java/net/minestom/server/event/EventListener.java @@ -9,6 +9,13 @@ import java.util.concurrent.atomic.AtomicInteger; import java.util.function.Consumer; import java.util.function.Predicate; +/** + * Represents an event listener (handler) in an event graph. + *

+ * A listener is responsible for executing some action based on an event triggering. + * + * @param The event type being handled. + */ public interface EventListener { @NotNull Class getEventType(); @@ -20,6 +27,15 @@ public interface EventListener { return new EventListener.Builder<>(eventType); } + /** + * Create an event listener without any special options. The given listener will be executed + * if the event passes all parent filtering. + * + * @param eventType The event type to handle + * @param listener The handler function + * @param The event type to handle + * @return An event listener with the given properties + */ @Contract(pure = true) static @NotNull EventListener of(@NotNull Class eventType, @NotNull Consumer<@NotNull T> listener) { return new EventListener<>() { @@ -47,24 +63,43 @@ public interface EventListener { this.eventType = eventType; } + /** + * Adds a filter to the executor of this listener. The executor will only + * be called if this condition passes on the given event. + */ @Contract(value = "_ -> this") public @NotNull EventListener.Builder filter(Predicate filter) { this.filters.add(filter); return this; } + /** + * Removes this listener after it has been executed the given number of times. + * + * @param expireCount The number of times to execute + */ @Contract(value = "_ -> this") public @NotNull EventListener.Builder expireCount(int expireCount) { this.expireCount = expireCount; return this; } + /** + * Expires this listener when it passes the given condition. The expiration will + * happen before the event is executed. + * + * @param expireWhen The condition to test + */ @Contract(value = "_ -> this") public @NotNull EventListener.Builder expireWhen(Predicate expireWhen) { this.expireWhen = expireWhen; return this; } + /** + * Sets the handler for this event listener. This will be executed if the listener passes + * all conditions. + */ @Contract(value = "_ -> this") public @NotNull EventListener.Builder handler(Consumer handler) { this.handler = handler; diff --git a/src/main/java/net/minestom/server/event/EventNode.java b/src/main/java/net/minestom/server/event/EventNode.java index fd6e2dbd0..6b02e7f19 100644 --- a/src/main/java/net/minestom/server/event/EventNode.java +++ b/src/main/java/net/minestom/server/event/EventNode.java @@ -16,26 +16,67 @@ import java.util.function.BiPredicate; import java.util.function.Consumer; import java.util.function.Predicate; +/** + * Represents a single node in an event graph. + *

+ * A node may contain any number of children and/or listeners. When an event is called, + * the node will filter it based on the parameters given at creation and then propagate + * it down to child nodes and listeners if it passes. + * + * @param The event type accepted by this node + */ public class EventNode { + /** + * Creates an event node which accepts any event type with no filtering. + * + * @param name The name of the node + * @return An event node with no filtering + */ @Contract(value = "_ -> new", pure = true) public static @NotNull EventNode all(@NotNull String name) { return type(name, EventFilter.ALL); } - @Contract(value = "_, _, _ -> new", pure = true) - public static @NotNull EventNode type(@NotNull String name, - @NotNull EventFilter filter, - @NotNull BiPredicate predicate) { - return create(name, filter, predicate); - } - + /** + * Creates an event node which accepts any event of the given type. The type is provided + * by the {@link EventFilter}. + *

+ * For example, you could create an event filter which only accepts player events with the following + *

+     * var playerEventNode = EventNode.type("demo", EventFilter.PLAYER);
+     * 
+ * + * @param name The name of the event node + * @param filter The event type filter to apply + * @param The resulting event type of the node + * @return A node with just an event type filter + */ @Contract(value = "_, _ -> new", pure = true) public static @NotNull EventNode type(@NotNull String name, @NotNull EventFilter filter) { return create(name, filter, null); } + /** + * Creates an event node which accepts any event of the given type which passes + * the provided condition. The condition is based on the event object itself. + *

+ * For example, you could create an event filter which only accepts player events + * where the player is in the pos x/z quadrant of the world. + *

+     * var playerInPosXZNode = EventNode.event("abc", EventFilter.PLAYER, event -> {
+     *     var position = event.getPlayer().getPosition();
+     *     return position.getX() > 0 && position.getZ() > 0;
+     * });
+     * 
+ * + * @param name The name of the event node + * @param filter The event type filter to apply + * @param predicate The event condition + * @param The resulting event type of the node + * @return A node with an event type filter as well as a condition on the event. + */ @Contract(value = "_, _, _ -> new", pure = true) public static @NotNull EventNode event(@NotNull String name, @NotNull EventFilter filter, @@ -43,6 +84,52 @@ public class EventNode { return create(name, filter, (e, h) -> predicate.test(e)); } + /** + * Creates an event node which accepts any event of the given type which passes + * the provided condition. The condition is based on the event object as well as + * the event handler type defined in the {@link EventFilter}. + *

+ * For example, you could create an event filter which only accepts player events + * where the player is in the pos x/z quadrant of the world. + *

+     * var playerInPosXZNode = EventNode.type("abc", EventFilter.PLAYER, (event, player) -> {
+     *     var position = player.getPosition();
+     *     return position.getX() > 0 && position.getZ() > 0;
+     * });
+     * 
+ * + * @param name The name of the event node + * @param filter The event type filter to apply + * @param predicate The event condition + * @param The resulting event type of the node + * @param The handler type of the event filter + * @return A node with an event type filter as well as a condition on the event. + */ + @Contract(value = "_, _, _ -> new", pure = true) + public static @NotNull EventNode type(@NotNull String name, + @NotNull EventFilter filter, + @NotNull BiPredicate predicate) { + return create(name, filter, predicate); + } + + /** + * Creates an event node which accepts any event of the given type which passes + * the provided condition. The condition is based on the event handler defined + * by the {@link EventFilter}. + *

+ * For example, you could create an event filter which only accepts player events + * where the player is in creative mode. + *

+     * var playerIsCreative = EventNode.value("abc", EventFilter.PLAYER, Player::isCreative);
+     * 
+ * + * @param name The name of the event node + * @param filter The event type filter to apply + * @param predicate The event condition + * @param The resulting event type of the node + * @param The handler type of the event filter + * @return A node with an event type filter as well as a condition on the event. + */ @Contract(value = "_, _, _ -> new", pure = true) public static @NotNull EventNode value(@NotNull String name, @NotNull EventFilter filter, @@ -50,6 +137,18 @@ public class EventNode { return create(name, filter, (e, h) -> predicate.test(h)); } + /** + * Creates an event node which accepts any event of the given type which has a handler who + * has the given tag. + * + * The {@link EventFilter}'s resulting event type must be {@link TagReadable}. + * + * @param name The name of the event node + * @param filter The event type filter to apply + * @param tag The tag which must be contained on the event handler + * @param The resulting event type of the node + * @return A node with an event type filter as well as a handler with the provided tag + */ @Contract(value = "_, _, _ -> new", pure = true) public static @NotNull EventNode tag(@NotNull String name, @NotNull EventFilter filter, @@ -57,6 +156,17 @@ public class EventNode { return create(name, filter, (e, h) -> h.hasTag(tag)); } + /** + * Creates an event node which accepts any event of the given type which has a handler who + * has an applicable tag. An applicable tag means that it passes the given condition. + * + * @param name The name of the event node + * @param filter The event type filter to apply + * @param tag The tag which must be contained on the event handler + * @param consumer The condition to test against the tag, if it exists. + * @param The resulting event type of the node + * @return A node with an event type filter as well as a handler with the provided tag + */ @Contract(value = "_, _, _, _ -> new", pure = true) public static @NotNull EventNode tag(@NotNull String name, @NotNull EventFilter filter, @@ -106,6 +216,15 @@ public class EventNode { return predicate.test(event, value); } + /** + * Executes the given event on this node. The event must pass all conditions before + * it will be forwarded to the listeners. + *

+ * Calling an event on a node will execute all child nodes, however, an event may be + * called anywhere on the event graph and it will propagate down from there only. + * + * @param event the event to execute + */ public void call(@NotNull T event) { final var eventClass = event.getClass(); if (!eventType.isAssignableFrom(eventClass)) { @@ -140,6 +259,13 @@ public class EventNode { } } + /** + * Execute a cancellable event with a callback to execute if the event is successful. + * Event conditions and propagation is the same as {@link #call(Event)}. + * + * @param event The event to execute + * @param successCallback A callback if the event is not cancelled + */ public void callCancellable(@NotNull T event, @NotNull Runnable successCallback) { call(event); if (!(event instanceof CancellableEvent) || !((CancellableEvent) event).isCancelled()) { @@ -168,11 +294,24 @@ public class EventNode { return parent; } + /** + * Returns an unmodifiable view of the children in this node. + * + * @see #addChild(EventNode) + * @see #removeChild(EventNode) + */ @Contract(pure = true) public @NotNull Set<@NotNull EventNode> getChildren() { return Collections.unmodifiableSet(children); } + /** + * Locates all child nodes with the given name and event type recursively starting at this node. + * + * @param name The event node name to filter for + * @param eventType The event node type to filter for + * @return All matching event nodes + */ @Contract(pure = true) public @NotNull List> findChildren(@NotNull String name, Class eventType) { if (children.isEmpty()) { @@ -190,11 +329,26 @@ public class EventNode { } } + /** + * Locates all child nodes with the given name and event type recursively starting at this node. + * + * @param name The event name to filter for + * @return All matching event nodes + */ @Contract(pure = true) public @NotNull List> findChildren(@NotNull String name) { return findChildren(name, eventType); } + /** + * Replaces all children matching the given name and type recursively starting from this node. + *

+ * Node: The callee may not be replaced by this call. + * + * @param name The event name to filter for + * @param eventType The event node type to filter for + * @param eventNode The replacement node + */ public void replaceChildren(@NotNull String name, @NotNull Class eventType, @NotNull EventNode eventNode) { if (children.isEmpty()) { return; @@ -211,10 +365,24 @@ public class EventNode { } } + /** + * Replaces all children matching the given name and type recursively starting from this node. + *

+ * Node: The callee may not be replaced by this call. + * + * @param name The node name to filter for + * @param eventNode The replacement node + */ public void replaceChildren(@NotNull String name, @NotNull EventNode eventNode) { replaceChildren(name, eventType, eventNode); } + /** + * Recursively removes children with the given name and type starting at this node. + * + * @param name The node name to filter for + * @param eventType The node type to filter for + */ public void removeChildren(@NotNull String name, @NotNull Class eventType) { if (children.isEmpty()) { return; @@ -230,10 +398,21 @@ public class EventNode { } } + /** + * Recursively removes children with the given name starting at this node. + * + * @param name The node name to filter for + */ public void removeChildren(@NotNull String name) { removeChildren(name, eventType); } + /** + * Directly adds a child node to this node. + * + * @param child The child to add + * @return this, can be used for chaining + */ @Contract(value = "_ -> this") public @NotNull EventNode addChild(@NotNull EventNode child) { synchronized (GLOBAL_CHILD_LOCK) { @@ -257,6 +436,12 @@ public class EventNode { return this; } + /** + * Directly removes the given child from this node. + * + * @param child The child to remove + * @return this, can be used for chaining + */ @Contract(value = "_ -> this") public @NotNull EventNode removeChild(@NotNull EventNode child) { synchronized (GLOBAL_CHILD_LOCK) { diff --git a/src/main/java/net/minestom/server/event/trait/EntityEvent.java b/src/main/java/net/minestom/server/event/trait/EntityEvent.java index 44469d44f..dd78a2027 100644 --- a/src/main/java/net/minestom/server/event/trait/EntityEvent.java +++ b/src/main/java/net/minestom/server/event/trait/EntityEvent.java @@ -4,6 +4,9 @@ import net.minestom.server.entity.Entity; import net.minestom.server.event.Event; import org.jetbrains.annotations.NotNull; +/** + * Represents any event called on an {@link Entity}. + */ public interface EntityEvent extends Event { /** diff --git a/src/main/java/net/minestom/server/event/trait/InstanceEvent.java b/src/main/java/net/minestom/server/event/trait/InstanceEvent.java index d122c290a..7defc9b03 100644 --- a/src/main/java/net/minestom/server/event/trait/InstanceEvent.java +++ b/src/main/java/net/minestom/server/event/trait/InstanceEvent.java @@ -4,6 +4,9 @@ import net.minestom.server.event.Event; import net.minestom.server.instance.Instance; import org.jetbrains.annotations.NotNull; +/** + * Represents any event targeting an {@link Instance}. + */ public interface InstanceEvent extends Event { /** diff --git a/src/main/java/net/minestom/server/event/trait/InventoryEvent.java b/src/main/java/net/minestom/server/event/trait/InventoryEvent.java index 25d26d4ad..726741531 100644 --- a/src/main/java/net/minestom/server/event/trait/InventoryEvent.java +++ b/src/main/java/net/minestom/server/event/trait/InventoryEvent.java @@ -4,6 +4,9 @@ import net.minestom.server.event.Event; import net.minestom.server.inventory.Inventory; import org.jetbrains.annotations.Nullable; +/** + * Represents any event inside an {@link Inventory}. + */ public interface InventoryEvent extends Event { /** diff --git a/src/main/java/net/minestom/server/event/trait/ItemEvent.java b/src/main/java/net/minestom/server/event/trait/ItemEvent.java index 5ccecded4..fc30a769d 100644 --- a/src/main/java/net/minestom/server/event/trait/ItemEvent.java +++ b/src/main/java/net/minestom/server/event/trait/ItemEvent.java @@ -4,6 +4,9 @@ import net.minestom.server.event.Event; import net.minestom.server.item.ItemStack; import org.jetbrains.annotations.NotNull; +/** + * Represents any event called about an {@link ItemStack}. + */ public interface ItemEvent extends Event { @NotNull ItemStack getItemStack(); } diff --git a/src/main/java/net/minestom/server/event/trait/PlayerEvent.java b/src/main/java/net/minestom/server/event/trait/PlayerEvent.java index 2fb8834fd..8ca030995 100644 --- a/src/main/java/net/minestom/server/event/trait/PlayerEvent.java +++ b/src/main/java/net/minestom/server/event/trait/PlayerEvent.java @@ -3,6 +3,9 @@ package net.minestom.server.event.trait; import net.minestom.server.entity.Player; import org.jetbrains.annotations.NotNull; +/** + * Represents any event called on a {@link Player}. + */ public interface PlayerEvent extends EntityEvent { /** From fc70d4528ea5df848b35157e88516d0f7f6e55dc Mon Sep 17 00:00:00 2001 From: TheMode Date: Wed, 9 Jun 2021 06:52:00 +0200 Subject: [PATCH 089/104] formatting --- .../net/minestom/server/event/EventNode.java | 54 +++++++++---------- 1 file changed, 27 insertions(+), 27 deletions(-) diff --git a/src/main/java/net/minestom/server/event/EventNode.java b/src/main/java/net/minestom/server/event/EventNode.java index 6b02e7f19..e0ff0ba4e 100644 --- a/src/main/java/net/minestom/server/event/EventNode.java +++ b/src/main/java/net/minestom/server/event/EventNode.java @@ -47,9 +47,9 @@ public class EventNode { * var playerEventNode = EventNode.type("demo", EventFilter.PLAYER); * * - * @param name The name of the event node + * @param name The name of the event node * @param filter The event type filter to apply - * @param The resulting event type of the node + * @param The resulting event type of the node * @return A node with just an event type filter */ @Contract(value = "_, _ -> new", pure = true) @@ -71,10 +71,10 @@ public class EventNode { * }); * * - * @param name The name of the event node - * @param filter The event type filter to apply + * @param name The name of the event node + * @param filter The event type filter to apply * @param predicate The event condition - * @param The resulting event type of the node + * @param The resulting event type of the node * @return A node with an event type filter as well as a condition on the event. */ @Contract(value = "_, _, _ -> new", pure = true) @@ -98,11 +98,11 @@ public class EventNode { * }); * * - * @param name The name of the event node - * @param filter The event type filter to apply + * @param name The name of the event node + * @param filter The event type filter to apply * @param predicate The event condition - * @param The resulting event type of the node - * @param The handler type of the event filter + * @param The resulting event type of the node + * @param The handler type of the event filter * @return A node with an event type filter as well as a condition on the event. */ @Contract(value = "_, _, _ -> new", pure = true) @@ -123,11 +123,11 @@ public class EventNode { * var playerIsCreative = EventNode.value("abc", EventFilter.PLAYER, Player::isCreative); * * - * @param name The name of the event node - * @param filter The event type filter to apply + * @param name The name of the event node + * @param filter The event type filter to apply * @param predicate The event condition - * @param The resulting event type of the node - * @param The handler type of the event filter + * @param The resulting event type of the node + * @param The handler type of the event filter * @return A node with an event type filter as well as a condition on the event. */ @Contract(value = "_, _, _ -> new", pure = true) @@ -140,13 +140,13 @@ public class EventNode { /** * Creates an event node which accepts any event of the given type which has a handler who * has the given tag. - * + *

* The {@link EventFilter}'s resulting event type must be {@link TagReadable}. * - * @param name The name of the event node + * @param name The name of the event node * @param filter The event type filter to apply - * @param tag The tag which must be contained on the event handler - * @param The resulting event type of the node + * @param tag The tag which must be contained on the event handler + * @param The resulting event type of the node * @return A node with an event type filter as well as a handler with the provided tag */ @Contract(value = "_, _, _ -> new", pure = true) @@ -160,11 +160,11 @@ public class EventNode { * Creates an event node which accepts any event of the given type which has a handler who * has an applicable tag. An applicable tag means that it passes the given condition. * - * @param name The name of the event node - * @param filter The event type filter to apply - * @param tag The tag which must be contained on the event handler + * @param name The name of the event node + * @param filter The event type filter to apply + * @param tag The tag which must be contained on the event handler * @param consumer The condition to test against the tag, if it exists. - * @param The resulting event type of the node + * @param The resulting event type of the node * @return A node with an event type filter as well as a handler with the provided tag */ @Contract(value = "_, _, _, _ -> new", pure = true) @@ -263,7 +263,7 @@ public class EventNode { * Execute a cancellable event with a callback to execute if the event is successful. * Event conditions and propagation is the same as {@link #call(Event)}. * - * @param event The event to execute + * @param event The event to execute * @param successCallback A callback if the event is not cancelled */ public void callCancellable(@NotNull T event, @NotNull Runnable successCallback) { @@ -308,7 +308,7 @@ public class EventNode { /** * Locates all child nodes with the given name and event type recursively starting at this node. * - * @param name The event node name to filter for + * @param name The event node name to filter for * @param eventType The event node type to filter for * @return All matching event nodes */ @@ -345,7 +345,7 @@ public class EventNode { *

* Node: The callee may not be replaced by this call. * - * @param name The event name to filter for + * @param name The event name to filter for * @param eventType The event node type to filter for * @param eventNode The replacement node */ @@ -370,7 +370,7 @@ public class EventNode { *

* Node: The callee may not be replaced by this call. * - * @param name The node name to filter for + * @param name The node name to filter for * @param eventNode The replacement node */ public void replaceChildren(@NotNull String name, @NotNull EventNode eventNode) { @@ -380,10 +380,10 @@ public class EventNode { /** * Recursively removes children with the given name and type starting at this node. * - * @param name The node name to filter for + * @param name The node name to filter for * @param eventType The node type to filter for */ - public void removeChildren(@NotNull String name, @NotNull Class eventType) { + public void removeChildren(@NotNull String name, @NotNull Class eventType) { if (children.isEmpty()) { return; } From dd44b752c3268be9ce4a4ddd7138ddfc34c74c18 Mon Sep 17 00:00:00 2001 From: TheMode Date: Wed, 9 Jun 2021 06:57:08 +0200 Subject: [PATCH 090/104] Remove addListener0 --- .../net/minestom/server/event/EventNode.java | 28 ++++++++----------- 1 file changed, 12 insertions(+), 16 deletions(-) diff --git a/src/main/java/net/minestom/server/event/EventNode.java b/src/main/java/net/minestom/server/event/EventNode.java index e0ff0ba4e..2a02c00a6 100644 --- a/src/main/java/net/minestom/server/event/EventNode.java +++ b/src/main/java/net/minestom/server/event/EventNode.java @@ -465,12 +465,22 @@ public class EventNode { @Contract(value = "_ -> this") public @NotNull EventNode addListener(@NotNull EventListener listener) { - return addListener0(listener); + synchronized (GLOBAL_CHILD_LOCK) { + final var eventType = listener.getEventType(); + var entry = listenerMap.computeIfAbsent(eventType, aClass -> new ListenerEntry<>()); + entry.listeners.add((EventListener) listener); + if (parent != null) { + synchronized (parent.lock) { + parent.increaseChildListenerCount(eventType, 1); + } + } + } + return this; } @Contract(value = "_, _ -> this") public @NotNull EventNode addListener(@NotNull Class eventType, @NotNull Consumer<@NotNull E> listener) { - return addListener0(EventListener.of(eventType, listener)); + return addListener(EventListener.of(eventType, listener)); } @Contract(value = "_ -> this") @@ -491,20 +501,6 @@ public class EventNode { return this; } - private EventNode addListener0(@NotNull EventListener listener) { - synchronized (GLOBAL_CHILD_LOCK) { - final var eventType = listener.getEventType(); - var entry = listenerMap.computeIfAbsent(eventType, aClass -> new ListenerEntry<>()); - entry.listeners.add((EventListener) listener); - if (parent != null) { - synchronized (parent.lock) { - parent.increaseChildListenerCount(eventType, 1); - } - } - } - return this; - } - private void increaseChildListenerCount(Class eventClass, int count) { var entry = listenerMap.computeIfAbsent(eventClass, aClass -> new ListenerEntry<>()); ListenerEntry.addAndGet(entry, count); From 16d85971950d887fb9acec19a39c5335a1fa3d69 Mon Sep 17 00:00:00 2001 From: TheMode Date: Wed, 9 Jun 2021 07:11:01 +0200 Subject: [PATCH 091/104] Make CancellableEvent a trait --- src/main/java/net/minestom/server/event/EventDispatcher.java | 1 + src/main/java/net/minestom/server/event/EventNode.java | 1 + .../net/minestom/server/event/entity/EntityDamageEvent.java | 2 +- .../net/minestom/server/event/entity/EntityFireEvent.java | 2 +- .../minestom/server/event/entity/EntityItemMergeEvent.java | 2 +- .../net/minestom/server/event/entity/EntityShootEvent.java | 2 +- .../minestom/server/event/entity/EntityVelocityEvent.java | 2 +- .../server/event/instance/AddEntityToInstanceEvent.java | 2 +- .../server/event/instance/RemoveEntityFromInstanceEvent.java | 2 +- .../minestom/server/event/inventory/InventoryOpenEvent.java | 2 +- .../server/event/inventory/InventoryPreClickEvent.java | 2 +- .../java/net/minestom/server/event/item/ItemDropEvent.java | 2 +- .../minestom/server/event/item/PickupExperienceEvent.java | 3 +-- .../java/net/minestom/server/event/item/PickupItemEvent.java | 2 +- .../minestom/server/event/player/PlayerBlockBreakEvent.java | 3 +-- .../server/event/player/PlayerBlockInteractEvent.java | 3 +-- .../minestom/server/event/player/PlayerBlockPlaceEvent.java | 3 +-- .../server/event/player/PlayerChangeHeldSlotEvent.java | 3 +-- .../net/minestom/server/event/player/PlayerChatEvent.java | 3 +-- .../net/minestom/server/event/player/PlayerCommandEvent.java | 3 +-- .../server/event/player/PlayerHandAnimationEvent.java | 3 +-- .../server/event/player/PlayerItemAnimationEvent.java | 3 +-- .../net/minestom/server/event/player/PlayerMoveEvent.java | 3 +-- .../net/minestom/server/event/player/PlayerPacketEvent.java | 2 +- .../net/minestom/server/event/player/PlayerPreEatEvent.java | 3 +-- .../server/event/player/PlayerStartDiggingEvent.java | 3 +-- .../minestom/server/event/player/PlayerSwapItemEvent.java | 3 +-- .../net/minestom/server/event/player/PlayerUseItemEvent.java | 2 +- .../minestom/server/event/server/ServerListPingEvent.java | 2 +- .../minestom/server/event/{ => trait}/CancellableEvent.java | 5 ++++- .../net/minestom/server/extras/query/event/QueryEvent.java | 2 +- 31 files changed, 34 insertions(+), 42 deletions(-) rename src/main/java/net/minestom/server/event/{ => trait}/CancellableEvent.java (80%) diff --git a/src/main/java/net/minestom/server/event/EventDispatcher.java b/src/main/java/net/minestom/server/event/EventDispatcher.java index 1b3a38737..2cbdeb130 100644 --- a/src/main/java/net/minestom/server/event/EventDispatcher.java +++ b/src/main/java/net/minestom/server/event/EventDispatcher.java @@ -1,6 +1,7 @@ package net.minestom.server.event; import net.minestom.server.MinecraftServer; +import net.minestom.server.event.trait.CancellableEvent; import org.jetbrains.annotations.NotNull; public class EventDispatcher { diff --git a/src/main/java/net/minestom/server/event/EventNode.java b/src/main/java/net/minestom/server/event/EventNode.java index 2a02c00a6..06624a9dc 100644 --- a/src/main/java/net/minestom/server/event/EventNode.java +++ b/src/main/java/net/minestom/server/event/EventNode.java @@ -1,5 +1,6 @@ package net.minestom.server.event; +import net.minestom.server.event.trait.CancellableEvent; import net.minestom.server.tag.Tag; import net.minestom.server.tag.TagReadable; import net.minestom.server.utils.validate.Check; diff --git a/src/main/java/net/minestom/server/event/entity/EntityDamageEvent.java b/src/main/java/net/minestom/server/event/entity/EntityDamageEvent.java index 9caaeae2a..2060c5238 100644 --- a/src/main/java/net/minestom/server/event/entity/EntityDamageEvent.java +++ b/src/main/java/net/minestom/server/event/entity/EntityDamageEvent.java @@ -3,7 +3,7 @@ package net.minestom.server.event.entity; import net.minestom.server.entity.Entity; import net.minestom.server.entity.LivingEntity; import net.minestom.server.entity.damage.DamageType; -import net.minestom.server.event.CancellableEvent; +import net.minestom.server.event.trait.CancellableEvent; import net.minestom.server.event.trait.EntityEvent; import org.jetbrains.annotations.NotNull; diff --git a/src/main/java/net/minestom/server/event/entity/EntityFireEvent.java b/src/main/java/net/minestom/server/event/entity/EntityFireEvent.java index 656b6ea6c..5ffdad699 100644 --- a/src/main/java/net/minestom/server/event/entity/EntityFireEvent.java +++ b/src/main/java/net/minestom/server/event/entity/EntityFireEvent.java @@ -1,7 +1,7 @@ package net.minestom.server.event.entity; import net.minestom.server.entity.Entity; -import net.minestom.server.event.CancellableEvent; +import net.minestom.server.event.trait.CancellableEvent; import net.minestom.server.event.trait.EntityEvent; import net.minestom.server.utils.time.TimeUnit; import org.jetbrains.annotations.NotNull; diff --git a/src/main/java/net/minestom/server/event/entity/EntityItemMergeEvent.java b/src/main/java/net/minestom/server/event/entity/EntityItemMergeEvent.java index 9520d2e26..3a5510890 100644 --- a/src/main/java/net/minestom/server/event/entity/EntityItemMergeEvent.java +++ b/src/main/java/net/minestom/server/event/entity/EntityItemMergeEvent.java @@ -2,7 +2,7 @@ package net.minestom.server.event.entity; import net.minestom.server.entity.Entity; import net.minestom.server.entity.ItemEntity; -import net.minestom.server.event.CancellableEvent; +import net.minestom.server.event.trait.CancellableEvent; import net.minestom.server.event.trait.EntityEvent; import net.minestom.server.item.ItemStack; import org.jetbrains.annotations.NotNull; diff --git a/src/main/java/net/minestom/server/event/entity/EntityShootEvent.java b/src/main/java/net/minestom/server/event/entity/EntityShootEvent.java index 4da755082..034b64a88 100644 --- a/src/main/java/net/minestom/server/event/entity/EntityShootEvent.java +++ b/src/main/java/net/minestom/server/event/entity/EntityShootEvent.java @@ -1,7 +1,7 @@ package net.minestom.server.event.entity; import net.minestom.server.entity.Entity; -import net.minestom.server.event.CancellableEvent; +import net.minestom.server.event.trait.CancellableEvent; import net.minestom.server.event.trait.EntityEvent; import net.minestom.server.utils.Position; import org.jetbrains.annotations.NotNull; diff --git a/src/main/java/net/minestom/server/event/entity/EntityVelocityEvent.java b/src/main/java/net/minestom/server/event/entity/EntityVelocityEvent.java index 58835077a..9ccdf6377 100644 --- a/src/main/java/net/minestom/server/event/entity/EntityVelocityEvent.java +++ b/src/main/java/net/minestom/server/event/entity/EntityVelocityEvent.java @@ -1,7 +1,7 @@ package net.minestom.server.event.entity; import net.minestom.server.entity.Entity; -import net.minestom.server.event.CancellableEvent; +import net.minestom.server.event.trait.CancellableEvent; import net.minestom.server.event.trait.EntityEvent; import net.minestom.server.utils.Vector; import org.jetbrains.annotations.NotNull; diff --git a/src/main/java/net/minestom/server/event/instance/AddEntityToInstanceEvent.java b/src/main/java/net/minestom/server/event/instance/AddEntityToInstanceEvent.java index 71c003806..d04ab4658 100644 --- a/src/main/java/net/minestom/server/event/instance/AddEntityToInstanceEvent.java +++ b/src/main/java/net/minestom/server/event/instance/AddEntityToInstanceEvent.java @@ -1,7 +1,7 @@ package net.minestom.server.event.instance; import net.minestom.server.entity.Entity; -import net.minestom.server.event.CancellableEvent; +import net.minestom.server.event.trait.CancellableEvent; import net.minestom.server.event.trait.EntityEvent; import net.minestom.server.event.trait.InstanceEvent; import net.minestom.server.instance.Instance; diff --git a/src/main/java/net/minestom/server/event/instance/RemoveEntityFromInstanceEvent.java b/src/main/java/net/minestom/server/event/instance/RemoveEntityFromInstanceEvent.java index 868aafbc0..134dc2d62 100644 --- a/src/main/java/net/minestom/server/event/instance/RemoveEntityFromInstanceEvent.java +++ b/src/main/java/net/minestom/server/event/instance/RemoveEntityFromInstanceEvent.java @@ -1,7 +1,7 @@ package net.minestom.server.event.instance; import net.minestom.server.entity.Entity; -import net.minestom.server.event.CancellableEvent; +import net.minestom.server.event.trait.CancellableEvent; import net.minestom.server.event.trait.EntityEvent; import net.minestom.server.event.trait.InstanceEvent; import net.minestom.server.instance.Instance; diff --git a/src/main/java/net/minestom/server/event/inventory/InventoryOpenEvent.java b/src/main/java/net/minestom/server/event/inventory/InventoryOpenEvent.java index d73682243..f4a30129b 100644 --- a/src/main/java/net/minestom/server/event/inventory/InventoryOpenEvent.java +++ b/src/main/java/net/minestom/server/event/inventory/InventoryOpenEvent.java @@ -1,7 +1,7 @@ package net.minestom.server.event.inventory; import net.minestom.server.entity.Player; -import net.minestom.server.event.CancellableEvent; +import net.minestom.server.event.trait.CancellableEvent; import net.minestom.server.event.trait.InventoryEvent; import net.minestom.server.event.trait.PlayerEvent; import net.minestom.server.inventory.Inventory; diff --git a/src/main/java/net/minestom/server/event/inventory/InventoryPreClickEvent.java b/src/main/java/net/minestom/server/event/inventory/InventoryPreClickEvent.java index cf483e8bc..13abd19bb 100644 --- a/src/main/java/net/minestom/server/event/inventory/InventoryPreClickEvent.java +++ b/src/main/java/net/minestom/server/event/inventory/InventoryPreClickEvent.java @@ -1,7 +1,7 @@ package net.minestom.server.event.inventory; import net.minestom.server.entity.Player; -import net.minestom.server.event.CancellableEvent; +import net.minestom.server.event.trait.CancellableEvent; import net.minestom.server.event.trait.InventoryEvent; import net.minestom.server.event.trait.PlayerEvent; import net.minestom.server.inventory.Inventory; diff --git a/src/main/java/net/minestom/server/event/item/ItemDropEvent.java b/src/main/java/net/minestom/server/event/item/ItemDropEvent.java index ba6b52018..ecca1e1ca 100644 --- a/src/main/java/net/minestom/server/event/item/ItemDropEvent.java +++ b/src/main/java/net/minestom/server/event/item/ItemDropEvent.java @@ -1,7 +1,7 @@ package net.minestom.server.event.item; import net.minestom.server.entity.Player; -import net.minestom.server.event.CancellableEvent; +import net.minestom.server.event.trait.CancellableEvent; import net.minestom.server.event.trait.ItemEvent; import net.minestom.server.item.ItemStack; import org.jetbrains.annotations.NotNull; diff --git a/src/main/java/net/minestom/server/event/item/PickupExperienceEvent.java b/src/main/java/net/minestom/server/event/item/PickupExperienceEvent.java index dea63b993..832ee6f52 100644 --- a/src/main/java/net/minestom/server/event/item/PickupExperienceEvent.java +++ b/src/main/java/net/minestom/server/event/item/PickupExperienceEvent.java @@ -1,8 +1,7 @@ package net.minestom.server.event.item; import net.minestom.server.entity.ExperienceOrb; -import net.minestom.server.event.CancellableEvent; -import net.minestom.server.event.Event; +import net.minestom.server.event.trait.CancellableEvent; import org.jetbrains.annotations.NotNull; public class PickupExperienceEvent implements CancellableEvent { diff --git a/src/main/java/net/minestom/server/event/item/PickupItemEvent.java b/src/main/java/net/minestom/server/event/item/PickupItemEvent.java index 4e336ca7c..de5310458 100644 --- a/src/main/java/net/minestom/server/event/item/PickupItemEvent.java +++ b/src/main/java/net/minestom/server/event/item/PickupItemEvent.java @@ -3,7 +3,7 @@ package net.minestom.server.event.item; import net.minestom.server.entity.Entity; import net.minestom.server.entity.ItemEntity; import net.minestom.server.entity.LivingEntity; -import net.minestom.server.event.CancellableEvent; +import net.minestom.server.event.trait.CancellableEvent; import net.minestom.server.event.trait.EntityEvent; import net.minestom.server.event.trait.ItemEvent; import net.minestom.server.item.ItemStack; diff --git a/src/main/java/net/minestom/server/event/player/PlayerBlockBreakEvent.java b/src/main/java/net/minestom/server/event/player/PlayerBlockBreakEvent.java index 60d55afad..82909ff1a 100644 --- a/src/main/java/net/minestom/server/event/player/PlayerBlockBreakEvent.java +++ b/src/main/java/net/minestom/server/event/player/PlayerBlockBreakEvent.java @@ -2,8 +2,7 @@ package net.minestom.server.event.player; import net.minestom.server.MinecraftServer; import net.minestom.server.entity.Player; -import net.minestom.server.event.CancellableEvent; -import net.minestom.server.event.Event; +import net.minestom.server.event.trait.CancellableEvent; import net.minestom.server.event.trait.PlayerEvent; import net.minestom.server.instance.block.BlockManager; import net.minestom.server.instance.block.CustomBlock; diff --git a/src/main/java/net/minestom/server/event/player/PlayerBlockInteractEvent.java b/src/main/java/net/minestom/server/event/player/PlayerBlockInteractEvent.java index a05f998fa..af17b6bec 100644 --- a/src/main/java/net/minestom/server/event/player/PlayerBlockInteractEvent.java +++ b/src/main/java/net/minestom/server/event/player/PlayerBlockInteractEvent.java @@ -1,8 +1,7 @@ package net.minestom.server.event.player; import net.minestom.server.entity.Player; -import net.minestom.server.event.CancellableEvent; -import net.minestom.server.event.Event; +import net.minestom.server.event.trait.CancellableEvent; import net.minestom.server.event.trait.PlayerEvent; import net.minestom.server.instance.block.BlockFace; import net.minestom.server.utils.BlockPosition; diff --git a/src/main/java/net/minestom/server/event/player/PlayerBlockPlaceEvent.java b/src/main/java/net/minestom/server/event/player/PlayerBlockPlaceEvent.java index 448333f2c..37bd54e95 100644 --- a/src/main/java/net/minestom/server/event/player/PlayerBlockPlaceEvent.java +++ b/src/main/java/net/minestom/server/event/player/PlayerBlockPlaceEvent.java @@ -3,8 +3,7 @@ package net.minestom.server.event.player; import net.minestom.server.MinecraftServer; import net.minestom.server.data.Data; import net.minestom.server.entity.Player; -import net.minestom.server.event.CancellableEvent; -import net.minestom.server.event.Event; +import net.minestom.server.event.trait.CancellableEvent; import net.minestom.server.event.trait.PlayerEvent; import net.minestom.server.instance.block.Block; import net.minestom.server.instance.block.BlockManager; diff --git a/src/main/java/net/minestom/server/event/player/PlayerChangeHeldSlotEvent.java b/src/main/java/net/minestom/server/event/player/PlayerChangeHeldSlotEvent.java index facfd773a..1f37650d3 100644 --- a/src/main/java/net/minestom/server/event/player/PlayerChangeHeldSlotEvent.java +++ b/src/main/java/net/minestom/server/event/player/PlayerChangeHeldSlotEvent.java @@ -1,8 +1,7 @@ package net.minestom.server.event.player; import net.minestom.server.entity.Player; -import net.minestom.server.event.CancellableEvent; -import net.minestom.server.event.Event; +import net.minestom.server.event.trait.CancellableEvent; import net.minestom.server.event.trait.PlayerEvent; import net.minestom.server.utils.MathUtils; import net.minestom.server.utils.validate.Check; diff --git a/src/main/java/net/minestom/server/event/player/PlayerChatEvent.java b/src/main/java/net/minestom/server/event/player/PlayerChatEvent.java index 8aa80e465..2b0c196a5 100644 --- a/src/main/java/net/minestom/server/event/player/PlayerChatEvent.java +++ b/src/main/java/net/minestom/server/event/player/PlayerChatEvent.java @@ -3,8 +3,7 @@ package net.minestom.server.event.player; import net.kyori.adventure.text.Component; import net.minestom.server.chat.JsonMessage; import net.minestom.server.entity.Player; -import net.minestom.server.event.CancellableEvent; -import net.minestom.server.event.Event; +import net.minestom.server.event.trait.CancellableEvent; import net.minestom.server.event.trait.PlayerEvent; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; diff --git a/src/main/java/net/minestom/server/event/player/PlayerCommandEvent.java b/src/main/java/net/minestom/server/event/player/PlayerCommandEvent.java index f63079a73..648c68975 100644 --- a/src/main/java/net/minestom/server/event/player/PlayerCommandEvent.java +++ b/src/main/java/net/minestom/server/event/player/PlayerCommandEvent.java @@ -1,8 +1,7 @@ package net.minestom.server.event.player; import net.minestom.server.entity.Player; -import net.minestom.server.event.CancellableEvent; -import net.minestom.server.event.Event; +import net.minestom.server.event.trait.CancellableEvent; import net.minestom.server.event.trait.PlayerEvent; import org.jetbrains.annotations.NotNull; diff --git a/src/main/java/net/minestom/server/event/player/PlayerHandAnimationEvent.java b/src/main/java/net/minestom/server/event/player/PlayerHandAnimationEvent.java index af0538a38..598e00d77 100644 --- a/src/main/java/net/minestom/server/event/player/PlayerHandAnimationEvent.java +++ b/src/main/java/net/minestom/server/event/player/PlayerHandAnimationEvent.java @@ -1,8 +1,7 @@ package net.minestom.server.event.player; import net.minestom.server.entity.Player; -import net.minestom.server.event.CancellableEvent; -import net.minestom.server.event.Event; +import net.minestom.server.event.trait.CancellableEvent; import net.minestom.server.event.trait.PlayerEvent; import org.jetbrains.annotations.NotNull; diff --git a/src/main/java/net/minestom/server/event/player/PlayerItemAnimationEvent.java b/src/main/java/net/minestom/server/event/player/PlayerItemAnimationEvent.java index c6e223c73..0c0b7661c 100644 --- a/src/main/java/net/minestom/server/event/player/PlayerItemAnimationEvent.java +++ b/src/main/java/net/minestom/server/event/player/PlayerItemAnimationEvent.java @@ -1,8 +1,7 @@ package net.minestom.server.event.player; import net.minestom.server.entity.Player; -import net.minestom.server.event.CancellableEvent; -import net.minestom.server.event.Event; +import net.minestom.server.event.trait.CancellableEvent; import net.minestom.server.event.trait.PlayerEvent; import org.jetbrains.annotations.NotNull; diff --git a/src/main/java/net/minestom/server/event/player/PlayerMoveEvent.java b/src/main/java/net/minestom/server/event/player/PlayerMoveEvent.java index 36a8d942f..2d7bf046d 100644 --- a/src/main/java/net/minestom/server/event/player/PlayerMoveEvent.java +++ b/src/main/java/net/minestom/server/event/player/PlayerMoveEvent.java @@ -1,8 +1,7 @@ package net.minestom.server.event.player; import net.minestom.server.entity.Player; -import net.minestom.server.event.CancellableEvent; -import net.minestom.server.event.Event; +import net.minestom.server.event.trait.CancellableEvent; import net.minestom.server.event.trait.PlayerEvent; import net.minestom.server.utils.Position; import org.jetbrains.annotations.NotNull; diff --git a/src/main/java/net/minestom/server/event/player/PlayerPacketEvent.java b/src/main/java/net/minestom/server/event/player/PlayerPacketEvent.java index 16e40806f..e2ff8fe2a 100644 --- a/src/main/java/net/minestom/server/event/player/PlayerPacketEvent.java +++ b/src/main/java/net/minestom/server/event/player/PlayerPacketEvent.java @@ -1,7 +1,7 @@ package net.minestom.server.event.player; import net.minestom.server.entity.Player; -import net.minestom.server.event.CancellableEvent; +import net.minestom.server.event.trait.CancellableEvent; import net.minestom.server.event.trait.PlayerEvent; import net.minestom.server.network.packet.client.ClientPacket; import org.jetbrains.annotations.NotNull; diff --git a/src/main/java/net/minestom/server/event/player/PlayerPreEatEvent.java b/src/main/java/net/minestom/server/event/player/PlayerPreEatEvent.java index 9fd8ff8cf..ee6638de5 100644 --- a/src/main/java/net/minestom/server/event/player/PlayerPreEatEvent.java +++ b/src/main/java/net/minestom/server/event/player/PlayerPreEatEvent.java @@ -1,8 +1,7 @@ package net.minestom.server.event.player; import net.minestom.server.entity.Player; -import net.minestom.server.event.CancellableEvent; -import net.minestom.server.event.Event; +import net.minestom.server.event.trait.CancellableEvent; import net.minestom.server.event.trait.PlayerEvent; import net.minestom.server.item.ItemStack; import org.jetbrains.annotations.NotNull; diff --git a/src/main/java/net/minestom/server/event/player/PlayerStartDiggingEvent.java b/src/main/java/net/minestom/server/event/player/PlayerStartDiggingEvent.java index 4fe149a2c..10d0a6dc6 100644 --- a/src/main/java/net/minestom/server/event/player/PlayerStartDiggingEvent.java +++ b/src/main/java/net/minestom/server/event/player/PlayerStartDiggingEvent.java @@ -1,8 +1,7 @@ package net.minestom.server.event.player; import net.minestom.server.entity.Player; -import net.minestom.server.event.CancellableEvent; -import net.minestom.server.event.Event; +import net.minestom.server.event.trait.CancellableEvent; import net.minestom.server.event.trait.PlayerEvent; import net.minestom.server.utils.BlockPosition; import org.jetbrains.annotations.NotNull; diff --git a/src/main/java/net/minestom/server/event/player/PlayerSwapItemEvent.java b/src/main/java/net/minestom/server/event/player/PlayerSwapItemEvent.java index c1533801b..e7cfef32d 100644 --- a/src/main/java/net/minestom/server/event/player/PlayerSwapItemEvent.java +++ b/src/main/java/net/minestom/server/event/player/PlayerSwapItemEvent.java @@ -1,8 +1,7 @@ package net.minestom.server.event.player; import net.minestom.server.entity.Player; -import net.minestom.server.event.CancellableEvent; -import net.minestom.server.event.Event; +import net.minestom.server.event.trait.CancellableEvent; import net.minestom.server.event.trait.PlayerEvent; import net.minestom.server.item.ItemStack; import org.jetbrains.annotations.NotNull; diff --git a/src/main/java/net/minestom/server/event/player/PlayerUseItemEvent.java b/src/main/java/net/minestom/server/event/player/PlayerUseItemEvent.java index 579bc6888..2e1db2ce1 100644 --- a/src/main/java/net/minestom/server/event/player/PlayerUseItemEvent.java +++ b/src/main/java/net/minestom/server/event/player/PlayerUseItemEvent.java @@ -1,7 +1,7 @@ package net.minestom.server.event.player; import net.minestom.server.entity.Player; -import net.minestom.server.event.CancellableEvent; +import net.minestom.server.event.trait.CancellableEvent; import net.minestom.server.event.trait.ItemEvent; import net.minestom.server.event.trait.PlayerEvent; import net.minestom.server.item.ItemStack; diff --git a/src/main/java/net/minestom/server/event/server/ServerListPingEvent.java b/src/main/java/net/minestom/server/event/server/ServerListPingEvent.java index ab9551152..633a0ea14 100644 --- a/src/main/java/net/minestom/server/event/server/ServerListPingEvent.java +++ b/src/main/java/net/minestom/server/event/server/ServerListPingEvent.java @@ -1,7 +1,7 @@ package net.minestom.server.event.server; import net.minestom.server.MinecraftServer; -import net.minestom.server.event.CancellableEvent; +import net.minestom.server.event.trait.CancellableEvent; import net.minestom.server.network.player.PlayerConnection; import net.minestom.server.ping.ResponseData; import net.minestom.server.ping.ResponseDataConsumer; diff --git a/src/main/java/net/minestom/server/event/CancellableEvent.java b/src/main/java/net/minestom/server/event/trait/CancellableEvent.java similarity index 80% rename from src/main/java/net/minestom/server/event/CancellableEvent.java rename to src/main/java/net/minestom/server/event/trait/CancellableEvent.java index aae8df57d..e75efce9c 100644 --- a/src/main/java/net/minestom/server/event/CancellableEvent.java +++ b/src/main/java/net/minestom/server/event/trait/CancellableEvent.java @@ -1,4 +1,7 @@ -package net.minestom.server.event; +package net.minestom.server.event.trait; + +import net.minestom.server.event.Event; +import net.minestom.server.event.EventDispatcher; /** * Represents an {@link Event} which can be cancelled. diff --git a/src/main/java/net/minestom/server/extras/query/event/QueryEvent.java b/src/main/java/net/minestom/server/extras/query/event/QueryEvent.java index 88569c687..6db13d118 100644 --- a/src/main/java/net/minestom/server/extras/query/event/QueryEvent.java +++ b/src/main/java/net/minestom/server/extras/query/event/QueryEvent.java @@ -1,6 +1,6 @@ package net.minestom.server.extras.query.event; -import net.minestom.server.event.CancellableEvent; +import net.minestom.server.event.trait.CancellableEvent; import net.minestom.server.utils.binary.Writeable; import org.jetbrains.annotations.NotNull; From 68ba4b232d4c1937207f9bdc6843ec92b2c11921 Mon Sep 17 00:00:00 2001 From: TheMode Date: Wed, 9 Jun 2021 08:25:32 +0200 Subject: [PATCH 092/104] Remove EventHandler mention in Event --- src/main/java/net/minestom/server/event/Event.java | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/src/main/java/net/minestom/server/event/Event.java b/src/main/java/net/minestom/server/event/Event.java index 7c2408b1a..417701c83 100644 --- a/src/main/java/net/minestom/server/event/Event.java +++ b/src/main/java/net/minestom/server/event/Event.java @@ -1,9 +1,7 @@ package net.minestom.server.event; -import net.minestom.server.event.handler.EventHandler; - /** - * Event which can be listened to by an {@link EventHandler}. + * Event which can be listened to by an {@link EventNode}. *

* Called using {@link EventDispatcher#call(Event)}. */ From d800c94dcc3873f874977a708ebe2d443c07d2ac Mon Sep 17 00:00:00 2001 From: TheMode Date: Wed, 9 Jun 2021 08:25:56 +0200 Subject: [PATCH 093/104] Remove EventHandler mention in Event --- src/main/java/net/minestom/server/event/Event.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/net/minestom/server/event/Event.java b/src/main/java/net/minestom/server/event/Event.java index 417701c83..a41a18286 100644 --- a/src/main/java/net/minestom/server/event/Event.java +++ b/src/main/java/net/minestom/server/event/Event.java @@ -1,7 +1,7 @@ package net.minestom.server.event; /** - * Event which can be listened to by an {@link EventNode}. + * Event which can be listened to by an {@link EventNode} using {@link EventNode#addListener(EventListener)}. *

* Called using {@link EventDispatcher#call(Event)}. */ From 12a215349d69421d47a24a566d2ca7a58f4dbace Mon Sep 17 00:00:00 2001 From: TheMode Date: Wed, 9 Jun 2021 08:31:06 +0200 Subject: [PATCH 094/104] Lazily add eventhandler node to root for backward compatibility --- src/main/java/net/minestom/server/entity/Entity.java | 10 +++++++++- .../minestom/server/event/handler/EventHandler.java | 4 +++- .../java/net/minestom/server/instance/Instance.java | 10 +++++++++- 3 files changed, 21 insertions(+), 3 deletions(-) diff --git a/src/main/java/net/minestom/server/entity/Entity.java b/src/main/java/net/minestom/server/entity/Entity.java index 0b06dcae5..7eb950cc9 100644 --- a/src/main/java/net/minestom/server/entity/Entity.java +++ b/src/main/java/net/minestom/server/entity/Entity.java @@ -16,6 +16,7 @@ import net.minestom.server.collision.CollisionUtils; import net.minestom.server.data.Data; import net.minestom.server.data.DataContainer; import net.minestom.server.entity.metadata.EntityMeta; +import net.minestom.server.event.EventCallback; import net.minestom.server.event.EventDispatcher; import net.minestom.server.event.EventFilter; import net.minestom.server.event.EventNode; @@ -157,7 +158,6 @@ public class Entity implements Viewable, Tickable, EventHandler, Da Entity.ENTITY_BY_UUID.put(uuid, this); this.eventNode = EventNode.value("entity-" + uuid, EventFilter.ENTITY, this::equals); - MinecraftServer.getGlobalEventHandler().addChild(eventNode); } public Entity(@NotNull EntityType entityType) { @@ -777,6 +777,14 @@ public class Entity implements Viewable, Tickable, EventHandler, Da return eventNode; } + @Override + public synchronized boolean addEventCallback(@NotNull Class eventClass, @NotNull EventCallback eventCallback) { + if (eventNode.getParent() == null) { + MinecraftServer.getGlobalEventHandler().addChild(eventNode); + } + return EventHandler.super.addEventCallback(eventClass, eventCallback); + } + /** * Each entity has an unique id (server-wide) which will change after a restart. * diff --git a/src/main/java/net/minestom/server/event/handler/EventHandler.java b/src/main/java/net/minestom/server/event/handler/EventHandler.java index 95fc48b77..0518e3a9b 100644 --- a/src/main/java/net/minestom/server/event/handler/EventHandler.java +++ b/src/main/java/net/minestom/server/event/handler/EventHandler.java @@ -3,6 +3,7 @@ package net.minestom.server.event.handler; import net.minestom.server.event.Event; import net.minestom.server.event.EventCallback; import net.minestom.server.event.EventNode; +import org.jetbrains.annotations.ApiStatus; import org.jetbrains.annotations.NotNull; /** @@ -13,7 +14,8 @@ import org.jetbrains.annotations.NotNull; @Deprecated public interface EventHandler { - @Deprecated + @ApiStatus.Internal + @Deprecated(forRemoval = true) @NotNull EventNode getEventNode(); @Deprecated diff --git a/src/main/java/net/minestom/server/instance/Instance.java b/src/main/java/net/minestom/server/instance/Instance.java index b9dd86d39..3e7c81261 100644 --- a/src/main/java/net/minestom/server/instance/Instance.java +++ b/src/main/java/net/minestom/server/instance/Instance.java @@ -12,6 +12,7 @@ import net.minestom.server.entity.EntityCreature; import net.minestom.server.entity.ExperienceOrb; import net.minestom.server.entity.Player; import net.minestom.server.entity.pathfinding.PFInstanceSpace; +import net.minestom.server.event.EventCallback; import net.minestom.server.event.EventDispatcher; import net.minestom.server.event.EventFilter; import net.minestom.server.event.EventNode; @@ -121,7 +122,6 @@ public abstract class Instance implements BlockModifier, Tickable, EventHandler< this.worldBorder = new WorldBorder(this); this.eventNode = EventNode.value("instance-" + uniqueId, EventFilter.INSTANCE, this::equals); - MinecraftServer.getGlobalEventHandler().addChild(eventNode); } /** @@ -841,6 +841,14 @@ public abstract class Instance implements BlockModifier, Tickable, EventHandler< return eventNode; } + @Override + public synchronized boolean addEventCallback(@NotNull Class eventClass, @NotNull EventCallback eventCallback) { + if (eventNode.getParent() == null) { + MinecraftServer.getGlobalEventHandler().addChild(eventNode); + } + return EventHandler.super.addEventCallback(eventClass, eventCallback); + } + // UNSAFE METHODS (need most of time to be synchronized) /** From 0bd4a6829024079be842a7e9c6a353119fceccf3 Mon Sep 17 00:00:00 2001 From: TheMode Date: Wed, 9 Jun 2021 08:46:19 +0200 Subject: [PATCH 095/104] Added ignoreCancelled option for EventListener --- .../minestom/server/event/EventListener.java | 25 +++++++++++++++++-- 1 file changed, 23 insertions(+), 2 deletions(-) diff --git a/src/main/java/net/minestom/server/event/EventListener.java b/src/main/java/net/minestom/server/event/EventListener.java index 3d2c41036..32b6f9f2b 100644 --- a/src/main/java/net/minestom/server/event/EventListener.java +++ b/src/main/java/net/minestom/server/event/EventListener.java @@ -1,5 +1,6 @@ package net.minestom.server.event; +import net.minestom.server.event.trait.CancellableEvent; import org.jetbrains.annotations.Contract; import org.jetbrains.annotations.NotNull; @@ -32,8 +33,8 @@ public interface EventListener { * if the event passes all parent filtering. * * @param eventType The event type to handle - * @param listener The handler function - * @param The event type to handle + * @param listener The handler function + * @param The event type to handle * @return An event listener with the given properties */ @Contract(pure = true) @@ -55,6 +56,7 @@ public interface EventListener { class Builder { private final Class eventType; private final List> filters = new ArrayList<>(); + private boolean ignoreCancelled; private int expireCount; private Predicate expireWhen; private Consumer handler; @@ -73,6 +75,19 @@ public interface EventListener { return this; } + /** + * Specifies if the handler should still be called if {@link CancellableEvent#isCancelled()} returns {@code true}. + *

+ * Default is set to {@code false}. + * + * @param ignoreCancelled True to still process the event when cancelled + */ + @Contract(value = "_ -> this") + public @NotNull EventListener.Builder ignoreCancelled(boolean ignoreCancelled) { + this.ignoreCancelled = ignoreCancelled; + return this; + } + /** * Removes this listener after it has been executed the given number of times. * @@ -108,6 +123,7 @@ public interface EventListener { @Contract(value = "-> new", pure = true) public @NotNull EventListener build() { + final boolean ignoreCancelled = this.ignoreCancelled; AtomicInteger expirationCount = new AtomicInteger(this.expireCount); final boolean hasExpirationCount = expirationCount.get() > 0; @@ -123,6 +139,11 @@ public interface EventListener { @Override public @NotNull Result run(@NotNull T event) { + // Event cancellation + if (!ignoreCancelled && event instanceof CancellableEvent && + ((CancellableEvent) event).isCancelled()) { + return Result.INVALID; + } // Expiration predicate if (expireWhen != null && expireWhen.test(event)) { return Result.EXPIRED; From 603e3293a60d1242b8aa905fc6e2f58d890c37d0 Mon Sep 17 00:00:00 2001 From: TheMode Date: Wed, 9 Jun 2021 14:05:37 +0200 Subject: [PATCH 096/104] Catch event exceptions --- .../java/net/minestom/server/event/EventListener.java | 3 ++- src/main/java/net/minestom/server/event/EventNode.java | 9 ++++++++- 2 files changed, 10 insertions(+), 2 deletions(-) diff --git a/src/main/java/net/minestom/server/event/EventListener.java b/src/main/java/net/minestom/server/event/EventListener.java index 32b6f9f2b..8dc085ed9 100644 --- a/src/main/java/net/minestom/server/event/EventListener.java +++ b/src/main/java/net/minestom/server/event/EventListener.java @@ -172,6 +172,7 @@ public interface EventListener { enum Result { SUCCESS, INVALID, - EXPIRED + EXPIRED, + EXCEPTION } } diff --git a/src/main/java/net/minestom/server/event/EventNode.java b/src/main/java/net/minestom/server/event/EventNode.java index 06624a9dc..0557fbcea 100644 --- a/src/main/java/net/minestom/server/event/EventNode.java +++ b/src/main/java/net/minestom/server/event/EventNode.java @@ -1,5 +1,6 @@ package net.minestom.server.event; +import net.minestom.server.MinecraftServer; import net.minestom.server.event.trait.CancellableEvent; import net.minestom.server.tag.Tag; import net.minestom.server.tag.TagReadable; @@ -246,7 +247,13 @@ public class EventNode { final var listeners = entry.listeners; if (!listeners.isEmpty()) { for (EventListener listener : listeners) { - final EventListener.Result result = listener.run(event); + EventListener.Result result; + try { + result = listener.run(event); + } catch (Exception e) { + result = EventListener.Result.EXCEPTION; + MinecraftServer.getExceptionManager().handleException(e); + } if (result == EventListener.Result.EXPIRED) { listeners.remove(listener); } From 13350d0ab86dba84821bbeec8657f212e73912d7 Mon Sep 17 00:00:00 2001 From: TheMode Date: Wed, 9 Jun 2021 22:01:46 +0200 Subject: [PATCH 097/104] Fix ignoreCancelled option --- .../java/net/minestom/server/event/EventListener.java | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/main/java/net/minestom/server/event/EventListener.java b/src/main/java/net/minestom/server/event/EventListener.java index 8dc085ed9..ee70640fb 100644 --- a/src/main/java/net/minestom/server/event/EventListener.java +++ b/src/main/java/net/minestom/server/event/EventListener.java @@ -56,7 +56,7 @@ public interface EventListener { class Builder { private final Class eventType; private final List> filters = new ArrayList<>(); - private boolean ignoreCancelled; + private boolean ignoreCancelled = true; private int expireCount; private Predicate expireWhen; private Consumer handler; @@ -78,9 +78,9 @@ public interface EventListener { /** * Specifies if the handler should still be called if {@link CancellableEvent#isCancelled()} returns {@code true}. *

- * Default is set to {@code false}. + * Default is set to {@code true}. * - * @param ignoreCancelled True to still process the event when cancelled + * @param ignoreCancelled True to stop processing the event when cancelled */ @Contract(value = "_ -> this") public @NotNull EventListener.Builder ignoreCancelled(boolean ignoreCancelled) { @@ -140,7 +140,7 @@ public interface EventListener { @Override public @NotNull Result run(@NotNull T event) { // Event cancellation - if (!ignoreCancelled && event instanceof CancellableEvent && + if (ignoreCancelled && event instanceof CancellableEvent && ((CancellableEvent) event).isCancelled()) { return Result.INVALID; } From 6ef40e08c743328299f254b2cec7985bd2313938 Mon Sep 17 00:00:00 2001 From: TheMode Date: Thu, 10 Jun 2021 09:01:49 +0200 Subject: [PATCH 098/104] Link to the packet event --- .../net/minestom/server/network/ConnectionManager.java | 8 ++------ 1 file changed, 2 insertions(+), 6 deletions(-) diff --git a/src/main/java/net/minestom/server/network/ConnectionManager.java b/src/main/java/net/minestom/server/network/ConnectionManager.java index 81df1eb5b..66024bb5c 100644 --- a/src/main/java/net/minestom/server/network/ConnectionManager.java +++ b/src/main/java/net/minestom/server/network/ConnectionManager.java @@ -188,9 +188,7 @@ public final class ConnectionManager { * Gets all the listeners which are called for each packet received. * * @return a list of packet's consumers - * @deprecated all packet listening methods will ultimately be removed. - * May or may not work depending on the packet. - * It is instead recommended to use a proxy, improving scalability and increasing server performance + * @deprecated see {@link net.minestom.server.event.player.PlayerPacketEvent} */ @NotNull @Deprecated @@ -202,9 +200,7 @@ public final class ConnectionManager { * Adds a consumer to call once a packet is received. * * @param clientPacketConsumer the packet consumer - * @deprecated all packet listening methods will ultimately be removed. - * May or may not work depending on the packet. - * It is instead recommended to use a proxy, improving scalability and increasing server performance + * @deprecated listen to {@link net.minestom.server.event.player.PlayerPacketEvent} */ @Deprecated public void onPacketReceive(@NotNull ClientPacketConsumer clientPacketConsumer) { From 3b80335134e94935048cd28ddb5dea014bb3b4c5 Mon Sep 17 00:00:00 2001 From: TheMode Date: Thu, 10 Jun 2021 11:53:50 +0200 Subject: [PATCH 099/104] Avoid foreach for sensitive code --- .../net/minestom/server/event/EventListener.java | 8 +++++--- .../net/minestom/server/event/EventNode.java | 16 ++++++++-------- 2 files changed, 13 insertions(+), 11 deletions(-) diff --git a/src/main/java/net/minestom/server/event/EventListener.java b/src/main/java/net/minestom/server/event/EventListener.java index ee70640fb..df6d7a1bd 100644 --- a/src/main/java/net/minestom/server/event/EventListener.java +++ b/src/main/java/net/minestom/server/event/EventListener.java @@ -150,9 +150,11 @@ public interface EventListener { } // Filtering if (!filters.isEmpty()) { - if (filters.stream().anyMatch(filter -> !filter.test(event))) { - // Cancelled - return Result.INVALID; + for (var filter : filters) { + if (!filter.test(event)) { + // Cancelled + return Result.INVALID; + } } } // Handler diff --git a/src/main/java/net/minestom/server/event/EventNode.java b/src/main/java/net/minestom/server/event/EventNode.java index 0557fbcea..7f8b14692 100644 --- a/src/main/java/net/minestom/server/event/EventNode.java +++ b/src/main/java/net/minestom/server/event/EventNode.java @@ -327,12 +327,12 @@ public class EventNode { } synchronized (GLOBAL_CHILD_LOCK) { List> result = new ArrayList<>(); - this.children.forEach(child -> { + for (EventNode child : children) { if (EventNode.equals(child, name, eventType)) { result.add((EventNode) child); } result.addAll(child.findChildren(name, eventType)); - }); + } return result; } } @@ -362,14 +362,14 @@ public class EventNode { return; } synchronized (GLOBAL_CHILD_LOCK) { - this.children.forEach(child -> { + for (EventNode child : children) { if (EventNode.equals(child, name, eventType)) { removeChild(child); addChild(eventNode); - return; + continue; } child.replaceChildren(name, eventType, eventNode); - }); + } } } @@ -396,13 +396,13 @@ public class EventNode { return; } synchronized (GLOBAL_CHILD_LOCK) { - this.children.forEach(child -> { + for (EventNode child : children) { if (EventNode.equals(child, name, eventType)) { removeChild(child); - return; + continue; } child.removeChildren(name, eventType); - }); + } } } From 74d323126fa2cd4206b3014f1901fe1aad628290 Mon Sep 17 00:00:00 2001 From: TheMode Date: Thu, 10 Jun 2021 11:57:13 +0200 Subject: [PATCH 100/104] Add traits to EntityEquipEvent --- .../server/event/item/EntityEquipEvent.java | 29 ++++++++++++------- 1 file changed, 18 insertions(+), 11 deletions(-) diff --git a/src/main/java/net/minestom/server/event/item/EntityEquipEvent.java b/src/main/java/net/minestom/server/event/item/EntityEquipEvent.java index 281dd3019..c761989d0 100644 --- a/src/main/java/net/minestom/server/event/item/EntityEquipEvent.java +++ b/src/main/java/net/minestom/server/event/item/EntityEquipEvent.java @@ -2,11 +2,12 @@ package net.minestom.server.event.item; import net.minestom.server.entity.Entity; import net.minestom.server.entity.EquipmentSlot; -import net.minestom.server.event.Event; +import net.minestom.server.event.trait.EntityEvent; +import net.minestom.server.event.trait.ItemEvent; import net.minestom.server.item.ItemStack; import org.jetbrains.annotations.NotNull; -public class EntityEquipEvent implements Event { +public class EntityEquipEvent implements EntityEvent, ItemEvent { private final Entity entity; private ItemStack equippedItem; @@ -18,13 +19,7 @@ public class EntityEquipEvent implements Event { this.slot = slot; } - @NotNull - public Entity getEntity() { - return entity; - } - - @NotNull - public ItemStack getEquippedItem() { + public @NotNull ItemStack getEquippedItem() { return equippedItem; } @@ -32,8 +27,20 @@ public class EntityEquipEvent implements Event { this.equippedItem = armorItem; } - @NotNull - public EquipmentSlot getSlot() { + public @NotNull EquipmentSlot getSlot() { return slot; } + + /** + * Same as {@link #getEquippedItem()}. + */ + @Override + public @NotNull ItemStack getItemStack() { + return equippedItem; + } + + @Override + public @NotNull Entity getEntity() { + return entity; + } } From ea05a6f784b150d9fca4b9bd7d4e994272733c6a Mon Sep 17 00:00:00 2001 From: TheMode Date: Thu, 10 Jun 2021 11:58:48 +0200 Subject: [PATCH 101/104] Add trait to ItemDropEvent --- .../net/minestom/server/event/item/ItemDropEvent.java | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/src/main/java/net/minestom/server/event/item/ItemDropEvent.java b/src/main/java/net/minestom/server/event/item/ItemDropEvent.java index ecca1e1ca..0652d854d 100644 --- a/src/main/java/net/minestom/server/event/item/ItemDropEvent.java +++ b/src/main/java/net/minestom/server/event/item/ItemDropEvent.java @@ -3,10 +3,11 @@ package net.minestom.server.event.item; import net.minestom.server.entity.Player; import net.minestom.server.event.trait.CancellableEvent; import net.minestom.server.event.trait.ItemEvent; +import net.minestom.server.event.trait.PlayerEvent; import net.minestom.server.item.ItemStack; import org.jetbrains.annotations.NotNull; -public class ItemDropEvent implements ItemEvent, CancellableEvent { +public class ItemDropEvent implements PlayerEvent, ItemEvent, CancellableEvent { private final Player player; private final ItemStack itemStack; @@ -18,8 +19,8 @@ public class ItemDropEvent implements ItemEvent, CancellableEvent { this.itemStack = itemStack; } - @NotNull - public Player getPlayer() { + @Override + public @NotNull Player getPlayer() { return player; } @@ -37,4 +38,5 @@ public class ItemDropEvent implements ItemEvent, CancellableEvent { public void setCancelled(boolean cancel) { this.cancelled = cancel; } + } From c0e956bef5beb59906e8edb2692f6f7a97af6984 Mon Sep 17 00:00:00 2001 From: TheMode Date: Thu, 10 Jun 2021 14:41:44 +0200 Subject: [PATCH 102/104] Fix javadoc --- src/main/java/net/minestom/server/event/EventNode.java | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/main/java/net/minestom/server/event/EventNode.java b/src/main/java/net/minestom/server/event/EventNode.java index 7f8b14692..7fec44fd9 100644 --- a/src/main/java/net/minestom/server/event/EventNode.java +++ b/src/main/java/net/minestom/server/event/EventNode.java @@ -66,12 +66,12 @@ public class EventNode { *

* For example, you could create an event filter which only accepts player events * where the player is in the pos x/z quadrant of the world. - *

+     * 

{@code
      * var playerInPosXZNode = EventNode.event("abc", EventFilter.PLAYER, event -> {
      *     var position = event.getPlayer().getPosition();
      *     return position.getX() > 0 && position.getZ() > 0;
      * });
-     * 
+ * }
* * @param name The name of the event node * @param filter The event type filter to apply @@ -93,12 +93,12 @@ public class EventNode { *

* For example, you could create an event filter which only accepts player events * where the player is in the pos x/z quadrant of the world. - *

+     * 

{@code
      * var playerInPosXZNode = EventNode.type("abc", EventFilter.PLAYER, (event, player) -> {
      *     var position = player.getPosition();
      *     return position.getX() > 0 && position.getZ() > 0;
      * });
-     * 
+ * }
* * @param name The name of the event node * @param filter The event type filter to apply From f2bf27c86e5e2eff2c0104ef0f57559ed661aeeb Mon Sep 17 00:00:00 2001 From: TheMode Date: Mon, 14 Jun 2021 00:18:53 +0200 Subject: [PATCH 103/104] Fix rebase --- .../server/event/server/ClientPingServerEvent.java | 12 ++++++------ .../network/packet/client/status/PingPacket.java | 7 ++++--- 2 files changed, 10 insertions(+), 9 deletions(-) diff --git a/src/main/java/net/minestom/server/event/server/ClientPingServerEvent.java b/src/main/java/net/minestom/server/event/server/ClientPingServerEvent.java index 8571001c5..f1cddd191 100644 --- a/src/main/java/net/minestom/server/event/server/ClientPingServerEvent.java +++ b/src/main/java/net/minestom/server/event/server/ClientPingServerEvent.java @@ -1,7 +1,6 @@ package net.minestom.server.event.server; -import net.minestom.server.event.CancellableEvent; -import net.minestom.server.event.Event; +import net.minestom.server.event.trait.CancellableEvent; import net.minestom.server.network.player.PlayerConnection; import net.minestom.server.utils.time.TimeUnit; import net.minestom.server.utils.time.UpdateOption; @@ -14,7 +13,7 @@ import org.jetbrains.annotations.NotNull; * * @see ServerListPingEvent */ -public class ClientPingServerEvent extends Event implements CancellableEvent { +public class ClientPingServerEvent implements CancellableEvent { private static final UpdateOption DEFAULT_DELAY = new UpdateOption(0, TimeUnit.MILLISECOND); private final PlayerConnection connection; @@ -27,7 +26,7 @@ public class ClientPingServerEvent extends Event implements CancellableEvent { * Creates a new client ping server event with 0 delay * * @param connection the player connection - * @param payload the payload the client sent + * @param payload the payload the client sent */ public ClientPingServerEvent(@NotNull PlayerConnection connection, long payload) { this.connection = connection; @@ -39,7 +38,7 @@ public class ClientPingServerEvent extends Event implements CancellableEvent { * Creates a new client ping server event with 0 delay * * @param connection the player connection - * @param payload the payload the client sent + * @param payload the payload the client sent */ public ClientPingServerEvent(@NotNull PlayerConnection connection, long payload, UpdateOption delay) { this.connection = connection; @@ -69,8 +68,9 @@ public class ClientPingServerEvent extends Event implements CancellableEvent { /** * Sets the payload to respond with. - * + *

* Note: This should be the same as the client sent, however vanilla 1.17 seems to be OK with a different payload. + * * @param payload the payload */ public void setPayload(long payload) { diff --git a/src/main/java/net/minestom/server/network/packet/client/status/PingPacket.java b/src/main/java/net/minestom/server/network/packet/client/status/PingPacket.java index 6a8b4599d..b5b1dd779 100644 --- a/src/main/java/net/minestom/server/network/packet/client/status/PingPacket.java +++ b/src/main/java/net/minestom/server/network/packet/client/status/PingPacket.java @@ -1,7 +1,7 @@ package net.minestom.server.network.packet.client.status; -import net.kyori.adventure.text.Component; import net.minestom.server.MinecraftServer; +import net.minestom.server.event.EventDispatcher; import net.minestom.server.event.server.ClientPingServerEvent; import net.minestom.server.network.packet.client.ClientPreplayPacket; import net.minestom.server.network.packet.server.status.PongPacket; @@ -14,12 +14,13 @@ public class PingPacket implements ClientPreplayPacket { private long number; - public PingPacket() {} + public PingPacket() { + } @Override public void process(@NotNull PlayerConnection connection) { final ClientPingServerEvent clientPingEvent = new ClientPingServerEvent(connection, number); - MinecraftServer.getGlobalEventHandler().callEvent(ClientPingServerEvent.class, clientPingEvent); + EventDispatcher.call(clientPingEvent); if (clientPingEvent.isCancelled()) { connection.disconnect(); From 6315bd5c610b539975f0fc17f86823e030552f32 Mon Sep 17 00:00:00 2001 From: TheMode Date: Mon, 14 Jun 2021 14:42:10 +0200 Subject: [PATCH 104/104] Add try-catch for EventNode condition --- src/main/java/net/minestom/server/event/EventNode.java | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/src/main/java/net/minestom/server/event/EventNode.java b/src/main/java/net/minestom/server/event/EventNode.java index 7fec44fd9..c6b359564 100644 --- a/src/main/java/net/minestom/server/event/EventNode.java +++ b/src/main/java/net/minestom/server/event/EventNode.java @@ -215,7 +215,12 @@ public class EventNode { if (predicate == null) return true; final var value = filter.getHandler(event); - return predicate.test(event, value); + try { + return predicate.test(event, value); + } catch (Exception e) { + MinecraftServer.getExceptionManager().handleException(e); + return false; + } } /**