mirror of
https://github.com/Minestom/Minestom.git
synced 2024-09-27 14:13:24 +02:00
Support old EventHandler API
This commit is contained in:
parent
8b255651ab
commit
d81df24132
@ -125,8 +125,8 @@ public final class MinecraftServer {
|
|||||||
|
|
||||||
private static ExtensionManager extensionManager;
|
private static ExtensionManager extensionManager;
|
||||||
|
|
||||||
private static final GlobalEventHandler GLOBAL_EVENT_HANDLER = new GlobalEventHandler();
|
|
||||||
private static final EventNode<Event> GLOBAL_EVENT_NODE = EventNode.all();
|
private static final EventNode<Event> GLOBAL_EVENT_NODE = EventNode.all();
|
||||||
|
private static final GlobalEventHandler GLOBAL_EVENT_HANDLER = new GlobalEventHandler();
|
||||||
|
|
||||||
private static UpdateManager updateManager;
|
private static UpdateManager updateManager;
|
||||||
private static MinecraftServer minecraftServer;
|
private static MinecraftServer minecraftServer;
|
||||||
|
@ -16,11 +16,12 @@ import net.minestom.server.collision.CollisionUtils;
|
|||||||
import net.minestom.server.data.Data;
|
import net.minestom.server.data.Data;
|
||||||
import net.minestom.server.data.DataContainer;
|
import net.minestom.server.data.DataContainer;
|
||||||
import net.minestom.server.entity.metadata.EntityMeta;
|
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.EventDispatcher;
|
||||||
|
import net.minestom.server.event.EventFilter;
|
||||||
|
import net.minestom.server.event.EventNode;
|
||||||
import net.minestom.server.event.entity.*;
|
import net.minestom.server.event.entity.*;
|
||||||
import net.minestom.server.event.handler.EventHandler;
|
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.Chunk;
|
||||||
import net.minestom.server.instance.Instance;
|
import net.minestom.server.instance.Instance;
|
||||||
import net.minestom.server.instance.InstanceManager;
|
import net.minestom.server.instance.InstanceManager;
|
||||||
@ -62,7 +63,7 @@ import java.util.function.UnaryOperator;
|
|||||||
* <p>
|
* <p>
|
||||||
* To create your own entity you probably want to extends {@link LivingEntity} or {@link EntityCreature} instead.
|
* 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<ShowEntity> {
|
public class Entity implements Viewable, Tickable, EventHandler<EntityEvent>, DataContainer, PermissionHandler, HoverEventSource<ShowEntity> {
|
||||||
|
|
||||||
private static final Map<Integer, Entity> ENTITY_BY_ID = new ConcurrentHashMap<>();
|
private static final Map<Integer, Entity> ENTITY_BY_ID = new ConcurrentHashMap<>();
|
||||||
private static final Map<UUID, Entity> ENTITY_BY_UUID = new ConcurrentHashMap<>();
|
private static final Map<UUID, Entity> ENTITY_BY_UUID = new ConcurrentHashMap<>();
|
||||||
@ -117,8 +118,7 @@ public class Entity implements Viewable, Tickable, EventHandler, DataContainer,
|
|||||||
private long lastAbsoluteSynchronizationTime;
|
private long lastAbsoluteSynchronizationTime;
|
||||||
|
|
||||||
// Events
|
// Events
|
||||||
private final Map<Class<? extends Event>, Collection<EventCallback>> eventCallbacks = new ConcurrentHashMap<>();
|
private final EventNode<EntityEvent> eventNode = EventNode.type(EventFilter.ENTITY);
|
||||||
private final Map<String, Collection<EventCallback<?>>> extensionCallbacks = new ConcurrentHashMap<>();
|
|
||||||
|
|
||||||
protected Metadata metadata = new Metadata(this);
|
protected Metadata metadata = new Metadata(this);
|
||||||
protected EntityMeta entityMeta;
|
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_ID.put(id, this);
|
||||||
Entity.ENTITY_BY_UUID.put(uuid, this);
|
Entity.ENTITY_BY_UUID.put(uuid, this);
|
||||||
|
|
||||||
|
MinecraftServer.getGlobalEventNode().map(this, eventNode);
|
||||||
}
|
}
|
||||||
|
|
||||||
public Entity(@NotNull EntityType entityType) {
|
public Entity(@NotNull EntityType entityType) {
|
||||||
@ -769,16 +771,9 @@ public class Entity implements Viewable, Tickable, EventHandler, DataContainer,
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@NotNull
|
|
||||||
@Override
|
@Override
|
||||||
public Map<Class<? extends Event>, Collection<EventCallback>> getEventCallbacksMap() {
|
public @NotNull EventNode<EntityEvent> getEventNode() {
|
||||||
return eventCallbacks;
|
return eventNode;
|
||||||
}
|
|
||||||
|
|
||||||
@NotNull
|
|
||||||
@Override
|
|
||||||
public Collection<EventCallback<?>> getExtensionCallbacks(String extension) {
|
|
||||||
return extensionCallbacks.computeIfAbsent(extension, e -> new CopyOnWriteArrayList<>());
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -1,31 +1,22 @@
|
|||||||
package net.minestom.server.event;
|
package net.minestom.server.event;
|
||||||
|
|
||||||
|
import net.minestom.server.MinecraftServer;
|
||||||
import net.minestom.server.event.handler.EventHandler;
|
import net.minestom.server.event.handler.EventHandler;
|
||||||
import org.jetbrains.annotations.NotNull;
|
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.
|
* Object containing all the global event listeners.
|
||||||
*/
|
*/
|
||||||
public final class GlobalEventHandler implements EventHandler {
|
public final class GlobalEventHandler implements EventHandler<Event> {
|
||||||
|
|
||||||
// Events
|
private final EventNode<Event> node = EventNode.all();
|
||||||
private final Map<Class<? extends Event>, Collection<EventCallback>> eventCallbacks = new ConcurrentHashMap<>();
|
|
||||||
private final Map<String, Collection<EventCallback<?>>> extensionCallbacks = new ConcurrentHashMap<>();
|
|
||||||
|
|
||||||
@NotNull
|
{
|
||||||
@Override
|
MinecraftServer.getGlobalEventNode().addChild(node);
|
||||||
public Map<Class<? extends Event>, Collection<EventCallback>> getEventCallbacksMap() {
|
|
||||||
return eventCallbacks;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@NotNull
|
|
||||||
@Override
|
@Override
|
||||||
public Collection<EventCallback<?>> getExtensionCallbacks(String extension) {
|
public @NotNull EventNode<Event> getEventNode() {
|
||||||
return extensionCallbacks.computeIfAbsent(extension, e -> new CopyOnWriteArrayList<>());
|
return node;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -1,126 +1,20 @@
|
|||||||
package net.minestom.server.event.handler;
|
package net.minestom.server.event.handler;
|
||||||
|
|
||||||
import net.minestom.server.MinecraftServer;
|
|
||||||
import net.minestom.server.event.Event;
|
import net.minestom.server.event.Event;
|
||||||
import net.minestom.server.event.EventCallback;
|
import net.minestom.server.event.EventCallback;
|
||||||
import net.minestom.server.extensions.IExtensionObserver;
|
import net.minestom.server.event.EventNode;
|
||||||
import net.minestom.server.extras.selfmodification.MinestomRootClassLoader;
|
|
||||||
import org.jetbrains.annotations.NotNull;
|
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.
|
* Represents an element which can have {@link Event} listeners assigned to it.
|
||||||
*/
|
*/
|
||||||
public interface EventHandler extends IExtensionObserver {
|
public interface EventHandler<T extends Event> {
|
||||||
|
|
||||||
/**
|
@NotNull EventNode<T> getEventNode();
|
||||||
* 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<Class<? extends Event>, Collection<EventCallback>> getEventCallbacksMap();
|
|
||||||
|
|
||||||
/**
|
default <V extends T> boolean addEventCallback(@NotNull Class<V> eventClass, @NotNull EventCallback<V> eventCallback) {
|
||||||
* Gets a {@link Collection} containing all the listeners assigned to a specific extension (represented by its name).
|
var node = getEventNode();
|
||||||
* Used to unload all callbacks when the extension is unloaded
|
node.addListener(eventClass, eventCallback::run);
|
||||||
*
|
return true;
|
||||||
* @return a {@link Collection} with all the listeners
|
|
||||||
*/
|
|
||||||
@NotNull
|
|
||||||
Collection<EventCallback<?>> 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 <E> the event type
|
|
||||||
* @return true if the callback collection changed as a result of the call
|
|
||||||
*/
|
|
||||||
default <E extends Event> boolean addEventCallback(@NotNull Class<E> eventClass, @NotNull EventCallback<E> eventCallback) {
|
|
||||||
String extensionSource = MinestomRootClassLoader.findExtensionObjectOwner(eventCallback);
|
|
||||||
if (extensionSource != null) {
|
|
||||||
MinecraftServer.getExtensionManager().getExtension(extensionSource).observe(this);
|
|
||||||
getExtensionCallbacks(extensionSource).add(eventCallback);
|
|
||||||
}
|
|
||||||
|
|
||||||
Collection<EventCallback> callbacks = getEventCallbacks(eventClass);
|
|
||||||
return callbacks.add(eventCallback);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
|
||||||
* Removes an event callback.
|
|
||||||
*
|
|
||||||
* @param eventClass the event class
|
|
||||||
* @param eventCallback the event callback
|
|
||||||
* @param <E> the event type
|
|
||||||
* @return true if the callback was removed as a result of this call
|
|
||||||
*/
|
|
||||||
default <E extends Event> boolean removeEventCallback(@NotNull Class<E> eventClass, @NotNull EventCallback<E> eventCallback) {
|
|
||||||
Collection<EventCallback> 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 <E> the event type
|
|
||||||
* @return all event callbacks for the specified type {@code eventClass}
|
|
||||||
*/
|
|
||||||
@NotNull
|
|
||||||
default <E extends Event> Collection<EventCallback> getEventCallbacks(@NotNull Class<E> 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<EventCallback> 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<EventCallback<?>> 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<EventCallback> eventCallbacks : getEventCallbacksMap().values()) {
|
|
||||||
eventCallbacks.remove(callback);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
extensionCallbacks.clear();
|
|
||||||
}
|
|
||||||
|
|
||||||
private <E extends Event> void runEvent(@NotNull Collection<EventCallback> eventCallbacks, @NotNull E event) {
|
|
||||||
for (EventCallback<E> eventCallback : eventCallbacks) {
|
|
||||||
eventCallback.run(event);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
default void onExtensionUnload(String extensionName) {
|
|
||||||
removeCallbacksOwnedByExtension(extensionName);
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -12,13 +12,14 @@ import net.minestom.server.entity.EntityCreature;
|
|||||||
import net.minestom.server.entity.ExperienceOrb;
|
import net.minestom.server.entity.ExperienceOrb;
|
||||||
import net.minestom.server.entity.Player;
|
import net.minestom.server.entity.Player;
|
||||||
import net.minestom.server.entity.pathfinding.PFInstanceSpace;
|
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.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.handler.EventHandler;
|
||||||
import net.minestom.server.event.instance.AddEntityToInstanceEvent;
|
import net.minestom.server.event.instance.AddEntityToInstanceEvent;
|
||||||
import net.minestom.server.event.instance.InstanceTickEvent;
|
import net.minestom.server.event.instance.InstanceTickEvent;
|
||||||
import net.minestom.server.event.instance.RemoveEntityFromInstanceEvent;
|
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.Block;
|
||||||
import net.minestom.server.instance.block.BlockManager;
|
import net.minestom.server.instance.block.BlockManager;
|
||||||
import net.minestom.server.instance.block.CustomBlock;
|
import net.minestom.server.instance.block.CustomBlock;
|
||||||
@ -43,7 +44,6 @@ import org.jetbrains.annotations.Nullable;
|
|||||||
|
|
||||||
import java.util.*;
|
import java.util.*;
|
||||||
import java.util.concurrent.ConcurrentHashMap;
|
import java.util.concurrent.ConcurrentHashMap;
|
||||||
import java.util.concurrent.CopyOnWriteArrayList;
|
|
||||||
import java.util.function.Consumer;
|
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
|
* you need to be sure to signal the {@link UpdateManager} of the changes using
|
||||||
* {@link UpdateManager#signalChunkLoad(Chunk)} and {@link UpdateManager#signalChunkUnload(Chunk)}.
|
* {@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<InstanceEvent>, DataContainer, PacketGroupingAudience {
|
||||||
|
|
||||||
protected static final BlockManager BLOCK_MANAGER = MinecraftServer.getBlockManager();
|
protected static final BlockManager BLOCK_MANAGER = MinecraftServer.getBlockManager();
|
||||||
protected static final UpdateManager UPDATE_MANAGER = MinecraftServer.getUpdateManager();
|
protected static final UpdateManager UPDATE_MANAGER = MinecraftServer.getUpdateManager();
|
||||||
@ -80,8 +80,7 @@ public abstract class Instance implements BlockModifier, Tickable, EventHandler,
|
|||||||
// Field for tick events
|
// Field for tick events
|
||||||
private long lastTickAge = System.currentTimeMillis();
|
private long lastTickAge = System.currentTimeMillis();
|
||||||
|
|
||||||
private final Map<Class<? extends Event>, Collection<EventCallback>> eventCallbacks = new ConcurrentHashMap<>();
|
private final EventNode<InstanceEvent> eventNode = EventNode.type(EventFilter.INSTANCE);
|
||||||
private final Map<String, Collection<EventCallback<?>>> extensionCallbacks = new ConcurrentHashMap<>();
|
|
||||||
|
|
||||||
// Entities present in this instance
|
// Entities present in this instance
|
||||||
protected final Set<Entity> entities = ConcurrentHashMap.newKeySet();
|
protected final Set<Entity> entities = ConcurrentHashMap.newKeySet();
|
||||||
@ -120,6 +119,7 @@ public abstract class Instance implements BlockModifier, Tickable, EventHandler,
|
|||||||
this.dimensionType = dimensionType;
|
this.dimensionType = dimensionType;
|
||||||
|
|
||||||
this.worldBorder = new WorldBorder(this);
|
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;
|
this.data = data;
|
||||||
}
|
}
|
||||||
|
|
||||||
@NotNull
|
|
||||||
@Override
|
@Override
|
||||||
public Map<Class<? extends Event>, Collection<EventCallback>> getEventCallbacksMap() {
|
public @NotNull EventNode<InstanceEvent> getEventNode() {
|
||||||
return eventCallbacks;
|
return eventNode;
|
||||||
}
|
|
||||||
|
|
||||||
@NotNull
|
|
||||||
@Override
|
|
||||||
public Collection<EventCallback<?>> getExtensionCallbacks(String extension) {
|
|
||||||
return extensionCallbacks.computeIfAbsent(extension, e -> new CopyOnWriteArrayList<>());
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// UNSAFE METHODS (need most of time to be synchronized)
|
// UNSAFE METHODS (need most of time to be synchronized)
|
||||||
|
Loading…
Reference in New Issue
Block a user