Added EventHandler interface

This commit is contained in:
Felix Cravic 2020-05-08 06:54:33 +02:00
parent 0daae4d831
commit 3741b22484
3 changed files with 42 additions and 34 deletions

View File

@ -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<Integer, Entity> 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 <E extends Event> void addEventCallback(Class<E> eventClass, EventCallback<E> eventCallback) {
List<EventCallback> callbacks = getEventCallbacks(eventClass);
callbacks.add(eventCallback);
this.eventCallbacks.put(eventClass, callbacks);
}
@Override
public <E extends Event> List<EventCallback> getEventCallbacks(Class<E> eventClass) {
return eventCallbacks.getOrDefault(eventClass, new CopyOnWriteArrayList<>());
}
public <E extends Event> void callEvent(Class<E> eventClass, E event) {
List<EventCallback> eventCallbacks = getEventCallbacks(eventClass);
for (EventCallback<E> eventCallback : eventCallbacks) {
eventCallback.run(event);
}
}
public <E extends CancellableEvent> void callCancellableEvent(Class<E> eventClass, E event, Runnable runnable) {
callEvent(eventClass, event);
if (!event.isCancelled()) {
runnable.run();
}
}
public int getEntityId() {
return id;
}

View File

@ -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 {
<E extends Event> void addEventCallback(Class<E> eventClass, EventCallback<E> eventCallback);
<E extends Event> List<EventCallback> getEventCallbacks(Class<E> eventClass);
default <E extends Event> void callEvent(Class<E> eventClass, E event) {
List<EventCallback> eventCallbacks = getEventCallbacks(eventClass);
for (EventCallback<E> eventCallback : eventCallbacks) {
eventCallback.run(event);
}
}
default <E extends CancellableEvent> void callCancellableEvent(Class<E> eventClass, E event, Runnable runnable) {
callEvent(eventClass, event);
if (!event.isCancelled()) {
runnable.run();
}
}
}

View File

@ -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 <E extends Event> void addEventCallback(Class<E> eventClass, EventCallback<E> eventCallback) {
List<EventCallback> callbacks = getEventCallbacks(eventClass);
callbacks.add(eventCallback);
this.eventCallbacks.put(eventClass, callbacks);
}
@Override
public <E extends Event> List<EventCallback> getEventCallbacks(Class<E> eventClass) {
return eventCallbacks.getOrDefault(eventClass, new CopyOnWriteArrayList<>());
}
public <E extends Event> void callEvent(Class<E> eventClass, E event) {
List<EventCallback> eventCallbacks = getEventCallbacks(eventClass);
for (EventCallback<E> eventCallback : eventCallbacks) {
eventCallback.run(event);
}
}
public <E extends CancellableEvent> void callCancellableEvent(Class<E> 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) {
}
}