diff --git a/src/main/java/net/minestom/server/entity/Entity.java b/src/main/java/net/minestom/server/entity/Entity.java index 6c4ade79c..918803f13 100644 --- a/src/main/java/net/minestom/server/entity/Entity.java +++ b/src/main/java/net/minestom/server/entity/Entity.java @@ -6,11 +6,11 @@ import net.minestom.server.collision.BoundingBox; import net.minestom.server.collision.CollisionUtils; import net.minestom.server.data.Data; import net.minestom.server.data.DataContainer; -import net.minestom.server.event.CancellableEvent; -import net.minestom.server.event.entity.EntitySpawnEvent; import net.minestom.server.event.Event; import net.minestom.server.event.EventCallback; +import net.minestom.server.event.entity.EntitySpawnEvent; import net.minestom.server.event.entity.EntityTickEvent; +import net.minestom.server.event.handler.EventHandler; import net.minestom.server.instance.Chunk; import net.minestom.server.instance.Instance; import net.minestom.server.instance.block.CustomBlock; @@ -27,7 +27,7 @@ import java.util.concurrent.CopyOnWriteArraySet; import java.util.concurrent.atomic.AtomicInteger; import java.util.function.Consumer; -public abstract class Entity implements Viewable, DataContainer { +public abstract class Entity implements Viewable, EventHandler, DataContainer { private static Map entityById = new ConcurrentHashMap<>(); private static AtomicInteger lastEntityId = new AtomicInteger(); @@ -339,6 +339,7 @@ public abstract class Entity implements Viewable, DataContainer { /** * Returns the number of ticks this entity has been active for + * * @return */ public long getAliveTicks() { @@ -355,30 +356,18 @@ public abstract class Entity implements Viewable, DataContainer { } } + @Override public void addEventCallback(Class eventClass, EventCallback eventCallback) { List callbacks = getEventCallbacks(eventClass); callbacks.add(eventCallback); this.eventCallbacks.put(eventClass, callbacks); } + @Override public List getEventCallbacks(Class eventClass) { return eventCallbacks.getOrDefault(eventClass, new CopyOnWriteArrayList<>()); } - public void callEvent(Class eventClass, E event) { - List eventCallbacks = getEventCallbacks(eventClass); - for (EventCallback eventCallback : eventCallbacks) { - eventCallback.run(event); - } - } - - public void callCancellableEvent(Class eventClass, E event, Runnable runnable) { - callEvent(eventClass, event); - if (!event.isCancelled()) { - runnable.run(); - } - } - public int getEntityId() { return id; } diff --git a/src/main/java/net/minestom/server/event/handler/EventHandler.java b/src/main/java/net/minestom/server/event/handler/EventHandler.java new file mode 100644 index 000000000..ccc9ae440 --- /dev/null +++ b/src/main/java/net/minestom/server/event/handler/EventHandler.java @@ -0,0 +1,29 @@ +package net.minestom.server.event.handler; + +import net.minestom.server.event.CancellableEvent; +import net.minestom.server.event.Event; +import net.minestom.server.event.EventCallback; + +import java.util.List; + +public interface EventHandler { + + void addEventCallback(Class eventClass, EventCallback eventCallback); + + List getEventCallbacks(Class eventClass); + + default void callEvent(Class eventClass, E event) { + List eventCallbacks = getEventCallbacks(eventClass); + for (EventCallback eventCallback : eventCallbacks) { + eventCallback.run(event); + } + } + + default void callCancellableEvent(Class eventClass, E event, Runnable runnable) { + callEvent(eventClass, event); + if (!event.isCancelled()) { + runnable.run(); + } + } + +} diff --git a/src/main/java/net/minestom/server/instance/Instance.java b/src/main/java/net/minestom/server/instance/Instance.java index afdedbcca..c9de4a3cf 100644 --- a/src/main/java/net/minestom/server/instance/Instance.java +++ b/src/main/java/net/minestom/server/instance/Instance.java @@ -5,11 +5,11 @@ import net.minestom.server.MinecraftServer; import net.minestom.server.data.Data; import net.minestom.server.data.DataContainer; import net.minestom.server.entity.*; -import net.minestom.server.event.CancellableEvent; import net.minestom.server.event.Event; import net.minestom.server.event.EventCallback; import net.minestom.server.event.entity.AddEntityToInstanceEvent; import net.minestom.server.event.entity.RemoveEntityFromInstanceEvent; +import net.minestom.server.event.handler.EventHandler; import net.minestom.server.instance.batch.BlockBatch; import net.minestom.server.instance.batch.ChunkBatch; import net.minestom.server.instance.block.Block; @@ -31,7 +31,7 @@ import java.util.concurrent.CopyOnWriteArrayList; import java.util.concurrent.CopyOnWriteArraySet; import java.util.function.Consumer; -public abstract class Instance implements BlockModifier, DataContainer { +public abstract class Instance implements BlockModifier, EventHandler, DataContainer { protected static final ChunkLoader CHUNK_LOADER_IO = new ChunkLoader(); protected static final BlockManager BLOCK_MANAGER = MinecraftServer.getBlockManager(); @@ -274,30 +274,18 @@ public abstract class Instance implements BlockModifier, DataContainer { this.data = data; } + @Override public void addEventCallback(Class eventClass, EventCallback eventCallback) { List callbacks = getEventCallbacks(eventClass); callbacks.add(eventCallback); this.eventCallbacks.put(eventClass, callbacks); } + @Override public List getEventCallbacks(Class eventClass) { return eventCallbacks.getOrDefault(eventClass, new CopyOnWriteArrayList<>()); } - public void callEvent(Class eventClass, E event) { - List eventCallbacks = getEventCallbacks(eventClass); - for (EventCallback eventCallback : eventCallbacks) { - eventCallback.run(event); - } - } - - public void callCancellableEvent(Class eventClass, E event, Runnable runnable) { - callEvent(eventClass, event); - if (!event.isCancelled()) { - runnable.run(); - } - } - // UNSAFE METHODS (need most of time to be synchronized) public void addEntity(Entity entity) { @@ -406,7 +394,9 @@ public abstract class Instance implements BlockModifier, DataContainer { /** * Performs a single tick in the instance. * By default, does nothing + * * @param time the current time */ - public void tick(long time) { } + public void tick(long time) { + } } \ No newline at end of file