diff --git a/src/main/java/net/minestom/server/entity/Entity.java b/src/main/java/net/minestom/server/entity/Entity.java index d7d5d4c7f..769b7ccf9 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.coordinate.Pos; import net.minestom.server.coordinate.Vec; import net.minestom.server.entity.metadata.EntityMeta; import net.minestom.server.event.EventDispatcher; +import net.minestom.server.event.ListenerHandle; import net.minestom.server.event.entity.*; import net.minestom.server.instance.Chunk; import net.minestom.server.instance.Instance; @@ -64,6 +65,8 @@ public class Entity implements Viewable, Tickable, TagHandler, PermissionHandler private static final Map ENTITY_BY_UUID = new ConcurrentHashMap<>(); private static final AtomicInteger LAST_ENTITY_ID = new AtomicInteger(); + private static final ListenerHandle ENTITY_TICK_HANDLER = EventDispatcher.getHandle(EntityTickEvent.class); + protected Instance instance; protected Chunk currentChunk; protected Pos position; @@ -445,7 +448,7 @@ public class Entity implements Viewable, Tickable, TagHandler, PermissionHandler update(time); ticks++; - EventDispatcher.call(new EntityTickEvent(this)); + EventDispatcher.call(new EntityTickEvent(this), ENTITY_TICK_HANDLER); // remove expired effects effectTick(time); diff --git a/src/main/java/net/minestom/server/entity/Player.java b/src/main/java/net/minestom/server/entity/Player.java index 21e533eb3..a9a8520a2 100644 --- a/src/main/java/net/minestom/server/entity/Player.java +++ b/src/main/java/net/minestom/server/entity/Player.java @@ -32,6 +32,7 @@ import net.minestom.server.entity.fakeplayer.FakePlayer; import net.minestom.server.entity.metadata.PlayerMeta; import net.minestom.server.entity.vehicle.PlayerVehicleInformation; import net.minestom.server.event.EventDispatcher; +import net.minestom.server.event.ListenerHandle; import net.minestom.server.event.inventory.InventoryOpenEvent; import net.minestom.server.event.item.ItemDropEvent; import net.minestom.server.event.item.ItemUpdateStateEvent; @@ -98,6 +99,8 @@ import java.util.function.UnaryOperator; */ public class Player extends LivingEntity implements CommandSender, Localizable, HoverEventSource, Identified, NamedAndIdentified { + private static final ListenerHandle PLAYER_TICK_HANDLER = EventDispatcher.getHandle(PlayerTickEvent.class); + private long lastKeepAlive; private boolean answerKeepAlive; @@ -166,9 +169,6 @@ public class Player extends LivingEntity implements CommandSender, Localizable, // Vehicle private final PlayerVehicleInformation vehicleInformation = new PlayerVehicleInformation(); - // Tick related - private final PlayerTickEvent playerTickEvent = new PlayerTickEvent(this); - // Adventure private Identity identity; private final Pointers pointers; @@ -353,7 +353,7 @@ public class Player extends LivingEntity implements CommandSender, Localizable, } // Tick event - EventDispatcher.call(playerTickEvent); + EventDispatcher.call(new PlayerTickEvent(this), PLAYER_TICK_HANDLER); } @Override diff --git a/src/main/java/net/minestom/server/event/EventDispatcher.java b/src/main/java/net/minestom/server/event/EventDispatcher.java index 2cbdeb130..05a1f5986 100644 --- a/src/main/java/net/minestom/server/event/EventDispatcher.java +++ b/src/main/java/net/minestom/server/event/EventDispatcher.java @@ -10,6 +10,14 @@ public class EventDispatcher { MinecraftServer.getGlobalEventHandler().call(event); } + public static void call(@NotNull E event, @NotNull ListenerHandle handle) { + MinecraftServer.getGlobalEventHandler().call(event, handle); + } + + public static ListenerHandle getHandle(@NotNull Class handleType) { + return MinecraftServer.getGlobalEventHandler().getHandle(handleType); + } + public static void callCancellable(@NotNull CancellableEvent event, @NotNull Runnable successCallback) { MinecraftServer.getGlobalEventHandler().callCancellable(event, successCallback); } diff --git a/src/main/java/net/minestom/server/instance/Instance.java b/src/main/java/net/minestom/server/instance/Instance.java index c4443de78..fceca0bac 100644 --- a/src/main/java/net/minestom/server/instance/Instance.java +++ b/src/main/java/net/minestom/server/instance/Instance.java @@ -17,6 +17,7 @@ import net.minestom.server.entity.ExperienceOrb; import net.minestom.server.entity.Player; import net.minestom.server.entity.pathfinding.PFInstanceSpace; import net.minestom.server.event.EventDispatcher; +import net.minestom.server.event.ListenerHandle; import net.minestom.server.event.instance.AddEntityToInstanceEvent; import net.minestom.server.event.instance.InstanceTickEvent; import net.minestom.server.event.instance.RemoveEntityFromInstanceEvent; @@ -61,6 +62,8 @@ public abstract class Instance implements BlockGetter, BlockSetter, Tickable, Ta protected static final BlockManager BLOCK_MANAGER = MinecraftServer.getBlockManager(); protected static final UpdateManager UPDATE_MANAGER = MinecraftServer.getUpdateManager(); + private static final ListenerHandle INSTANCE_TICK_HANDLER = EventDispatcher.getHandle(InstanceTickEvent.class); + private boolean registered; private final DimensionType dimensionType; @@ -705,7 +708,7 @@ public abstract class Instance implements BlockGetter, BlockSetter, Tickable, Ta // Tick event { // Process tick events - EventDispatcher.call(new InstanceTickEvent(this, time, lastTickAge)); + EventDispatcher.call(new InstanceTickEvent(this, time, lastTickAge), INSTANCE_TICK_HANDLER); // Set last tick age this.lastTickAge = time; } diff --git a/src/main/java/net/minestom/server/listener/PlayerPositionListener.java b/src/main/java/net/minestom/server/listener/PlayerPositionListener.java index 29e040782..635b5f97c 100644 --- a/src/main/java/net/minestom/server/listener/PlayerPositionListener.java +++ b/src/main/java/net/minestom/server/listener/PlayerPositionListener.java @@ -3,6 +3,7 @@ package net.minestom.server.listener; import net.minestom.server.coordinate.Pos; import net.minestom.server.entity.Player; import net.minestom.server.event.EventDispatcher; +import net.minestom.server.event.ListenerHandle; import net.minestom.server.event.player.PlayerMoveEvent; import net.minestom.server.instance.Instance; import net.minestom.server.network.packet.client.play.*; @@ -11,6 +12,8 @@ import org.jetbrains.annotations.NotNull; public class PlayerPositionListener { + private static final ListenerHandle PLAYER_MOVE_HANDLER = EventDispatcher.getHandle(PlayerMoveEvent.class); + public static void playerPacketListener(ClientPlayerPacket packet, Player player) { player.refreshOnGround(packet.onGround); } @@ -53,7 +56,7 @@ public class PlayerPositionListener { } PlayerMoveEvent playerMoveEvent = new PlayerMoveEvent(player, newPosition); - EventDispatcher.call(playerMoveEvent); + EventDispatcher.call(playerMoveEvent, PLAYER_MOVE_HANDLER); // True if the event call changed the player position (possibly a teleport) if (!playerMoveEvent.isCancelled() && currentPosition.equals(player.getPosition())) { // Move the player 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 a76894151..835dbed3a 100644 --- a/src/main/java/net/minestom/server/listener/manager/PacketListenerManager.java +++ b/src/main/java/net/minestom/server/listener/manager/PacketListenerManager.java @@ -3,6 +3,7 @@ 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.ListenerHandle; import net.minestom.server.event.player.PlayerPacketEvent; import net.minestom.server.listener.*; import net.minestom.server.network.ConnectionManager; @@ -23,6 +24,8 @@ public final class PacketListenerManager { public final static Logger LOGGER = LoggerFactory.getLogger(PacketListenerManager.class); private static final ConnectionManager CONNECTION_MANAGER = MinecraftServer.getConnectionManager(); + private static final ListenerHandle PLAYER_PACKET_HANDLER = EventDispatcher.getHandle(PlayerPacketEvent.class); + private final Map, PacketListenerConsumer> listeners = new ConcurrentHashMap<>(); public PacketListenerManager() { @@ -89,7 +92,7 @@ public final class PacketListenerManager { // Event PlayerPacketEvent playerPacketEvent = new PlayerPacketEvent(player, packet); - EventDispatcher.call(playerPacketEvent); + EventDispatcher.call(playerPacketEvent, PLAYER_PACKET_HANDLER); if (playerPacketEvent.isCancelled()) { return; }