redo event system
This commit is contained in:
parent
17fc677643
commit
1527ddda93
22 changed files with 213 additions and 283 deletions
|
@ -13,6 +13,7 @@
|
||||||
<option value="$PROJECT_DIR$/common" />
|
<option value="$PROJECT_DIR$/common" />
|
||||||
<option value="$PROJECT_DIR$/platforms" />
|
<option value="$PROJECT_DIR$/platforms" />
|
||||||
<option value="$PROJECT_DIR$/platforms/spigot" />
|
<option value="$PROJECT_DIR$/platforms/spigot" />
|
||||||
|
<option value="$PROJECT_DIR$/test-plugin" />
|
||||||
</set>
|
</set>
|
||||||
</option>
|
</option>
|
||||||
</GradleProjectSettings>
|
</GradleProjectSettings>
|
||||||
|
|
|
@ -4,5 +4,5 @@
|
||||||
<component name="FrameworkDetectionExcludesConfiguration">
|
<component name="FrameworkDetectionExcludesConfiguration">
|
||||||
<file type="web" url="file://$PROJECT_DIR$" />
|
<file type="web" url="file://$PROJECT_DIR$" />
|
||||||
</component>
|
</component>
|
||||||
<component name="ProjectRootManager" version="2" languageLevel="JDK_1_8" default="true" project-jdk-name="temurin-1.8" project-jdk-type="JavaSDK" />
|
<component name="ProjectRootManager" version="2" languageLevel="JDK_1_8" default="true" project-jdk-name="corretto-17" project-jdk-type="JavaSDK" />
|
||||||
</project>
|
</project>
|
|
@ -5,25 +5,28 @@
|
||||||
</component>
|
</component>
|
||||||
<component name="ChangeListManager">
|
<component name="ChangeListManager">
|
||||||
<list default="true" id="9d5d9b6f-43c8-41a4-bb42-a66ffc96c9b0" name="Changes" comment="">
|
<list default="true" id="9d5d9b6f-43c8-41a4-bb42-a66ffc96c9b0" name="Changes" comment="">
|
||||||
<change afterPath="$PROJECT_DIR$/api/src/main/java/me/tofaa/entitylib/TrackedEntity.java" afterDir="false" />
|
<change afterPath="$PROJECT_DIR$/api/src/main/java/me/tofaa/entitylib/event/EventCallback.java" afterDir="false" />
|
||||||
<change afterPath="$PROJECT_DIR$/api/src/main/java/me/tofaa/entitylib/event/CancellableEntityLibEvent.java" afterDir="false" />
|
<change afterPath="$PROJECT_DIR$/api/src/main/java/me/tofaa/entitylib/event/EventHandler.java" afterDir="false" />
|
||||||
<change afterPath="$PROJECT_DIR$/api/src/main/java/me/tofaa/entitylib/event/types/tracking/GeneralTrackingEvent.java" afterDir="false" />
|
<change afterPath="$PROJECT_DIR$/api/src/main/java/me/tofaa/entitylib/event/EventHandlerImpl.java" afterDir="false" />
|
||||||
<change afterPath="$PROJECT_DIR$/api/src/main/java/me/tofaa/entitylib/event/types/tracking/UserStopTrackingEntityEvent.java" afterDir="false" />
|
<change beforePath="$PROJECT_DIR$/.idea/gradle.xml" beforeDir="false" afterPath="$PROJECT_DIR$/.idea/gradle.xml" afterDir="false" />
|
||||||
<change afterPath="$PROJECT_DIR$/api/src/main/java/me/tofaa/entitylib/event/types/tracking/UserTrackingEntityEvent.java" afterDir="false" />
|
|
||||||
<change afterPath="$PROJECT_DIR$/common/src/main/java/me/tofaa/entitylib/common/AbstractTrackedEntity.java" afterDir="false" />
|
|
||||||
<change afterPath="$PROJECT_DIR$/platforms/spigot/src/main/java/me/tofaa/entitylib/spigot/InternalRegistryListener.java" afterDir="false" />
|
|
||||||
<change afterPath="$PROJECT_DIR$/platforms/spigot/src/main/java/me/tofaa/entitylib/spigot/SpigotEntity.java" afterDir="false" />
|
|
||||||
<change beforePath="$PROJECT_DIR$/.idea/misc.xml" beforeDir="false" afterPath="$PROJECT_DIR$/.idea/misc.xml" afterDir="false" />
|
<change beforePath="$PROJECT_DIR$/.idea/misc.xml" beforeDir="false" afterPath="$PROJECT_DIR$/.idea/misc.xml" afterDir="false" />
|
||||||
<change beforePath="$PROJECT_DIR$/.idea/workspace.xml" beforeDir="false" afterPath="$PROJECT_DIR$/.idea/workspace.xml" afterDir="false" />
|
<change beforePath="$PROJECT_DIR$/.idea/workspace.xml" beforeDir="false" afterPath="$PROJECT_DIR$/.idea/workspace.xml" afterDir="false" />
|
||||||
<change beforePath="$PROJECT_DIR$/api/src/main/java/me/tofaa/entitylib/APIConfig.java" beforeDir="false" afterPath="$PROJECT_DIR$/api/src/main/java/me/tofaa/entitylib/APIConfig.java" afterDir="false" />
|
<change beforePath="$PROJECT_DIR$/api/src/main/java/me/tofaa/entitylib/APIConfig.java" beforeDir="false" afterPath="$PROJECT_DIR$/api/src/main/java/me/tofaa/entitylib/APIConfig.java" afterDir="false" />
|
||||||
<change beforePath="$PROJECT_DIR$/api/src/main/java/me/tofaa/entitylib/Platform.java" beforeDir="false" afterPath="$PROJECT_DIR$/api/src/main/java/me/tofaa/entitylib/Platform.java" afterDir="false" />
|
<change beforePath="$PROJECT_DIR$/api/src/main/java/me/tofaa/entitylib/Platform.java" beforeDir="false" afterPath="$PROJECT_DIR$/api/src/main/java/me/tofaa/entitylib/Platform.java" afterDir="false" />
|
||||||
<change beforePath="$PROJECT_DIR$/api/src/main/java/me/tofaa/entitylib/event/EntityLibEvent.java" beforeDir="false" afterPath="$PROJECT_DIR$/api/src/main/java/me/tofaa/entitylib/event/EntityLibEvent.java" afterDir="false" />
|
<change beforePath="$PROJECT_DIR$/api/src/main/java/me/tofaa/entitylib/event/EventBus.java" beforeDir="false" />
|
||||||
<change beforePath="$PROJECT_DIR$/api/src/main/java/me/tofaa/entitylib/event/EventBus.java" beforeDir="false" afterPath="$PROJECT_DIR$/api/src/main/java/me/tofaa/entitylib/event/EventBus.java" afterDir="false" />
|
<change beforePath="$PROJECT_DIR$/api/src/main/java/me/tofaa/entitylib/event/EventBusAsync.java" beforeDir="false" />
|
||||||
<change beforePath="$PROJECT_DIR$/api/src/main/java/me/tofaa/entitylib/event/types/UserReceiveMetaUpdateEvent.java" beforeDir="false" afterPath="$PROJECT_DIR$/api/src/main/java/me/tofaa/entitylib/event/types/UserReceiveMetaUpdateEvent.java" afterDir="false" />
|
<change beforePath="$PROJECT_DIR$/api/src/main/java/me/tofaa/entitylib/event/EventBusSync.java" beforeDir="false" />
|
||||||
<change beforePath="$PROJECT_DIR$/api/src/main/java/me/tofaa/entitylib/event/types/UserRefreshEntityEvent.java" beforeDir="false" afterPath="$PROJECT_DIR$/api/src/main/java/me/tofaa/entitylib/event/types/UserRefreshEntityEvent.java" afterDir="false" />
|
<change beforePath="$PROJECT_DIR$/api/src/main/java/me/tofaa/entitylib/event/EventListener.java" beforeDir="false" afterPath="$PROJECT_DIR$/api/src/main/java/me/tofaa/entitylib/event/EventListener.java" afterDir="false" />
|
||||||
<change beforePath="$PROJECT_DIR$/api/src/main/java/me/tofaa/entitylib/wrapper/WrapperEntity.java" beforeDir="false" afterPath="$PROJECT_DIR$/api/src/main/java/me/tofaa/entitylib/wrapper/WrapperEntity.java" afterDir="false" />
|
<change beforePath="$PROJECT_DIR$/api/src/main/java/me/tofaa/entitylib/event/types/UserReceiveMetaUpdateEvent.java" beforeDir="false" />
|
||||||
|
<change beforePath="$PROJECT_DIR$/api/src/main/java/me/tofaa/entitylib/event/types/UserRefreshEntityEvent.java" beforeDir="false" />
|
||||||
|
<change beforePath="$PROJECT_DIR$/api/src/main/java/me/tofaa/entitylib/event/types/tracking/GeneralTrackingEvent.java" beforeDir="false" afterPath="$PROJECT_DIR$/api/src/main/java/me/tofaa/entitylib/event/types/GeneralTrackingEvent.java" afterDir="false" />
|
||||||
|
<change beforePath="$PROJECT_DIR$/api/src/main/java/me/tofaa/entitylib/event/types/tracking/UserStopTrackingEntityEvent.java" beforeDir="false" afterPath="$PROJECT_DIR$/api/src/main/java/me/tofaa/entitylib/event/types/UserStopTrackingEntityEvent.java" afterDir="false" />
|
||||||
|
<change beforePath="$PROJECT_DIR$/api/src/main/java/me/tofaa/entitylib/event/types/tracking/UserTrackingEntityEvent.java" beforeDir="false" afterPath="$PROJECT_DIR$/api/src/main/java/me/tofaa/entitylib/event/types/UserTrackingEntityEvent.java" afterDir="false" />
|
||||||
<change beforePath="$PROJECT_DIR$/common/src/main/java/me/tofaa/entitylib/common/AbstractPlatform.java" beforeDir="false" afterPath="$PROJECT_DIR$/common/src/main/java/me/tofaa/entitylib/common/AbstractPlatform.java" afterDir="false" />
|
<change beforePath="$PROJECT_DIR$/common/src/main/java/me/tofaa/entitylib/common/AbstractPlatform.java" beforeDir="false" afterPath="$PROJECT_DIR$/common/src/main/java/me/tofaa/entitylib/common/AbstractPlatform.java" afterDir="false" />
|
||||||
<change beforePath="$PROJECT_DIR$/platforms/spigot/src/main/java/me/tofaa/entitylib/spigot/SpigotEntityLibPlatform.java" beforeDir="false" afterPath="$PROJECT_DIR$/platforms/spigot/src/main/java/me/tofaa/entitylib/spigot/SpigotEntityLibPlatform.java" afterDir="false" />
|
<change beforePath="$PROJECT_DIR$/platforms/spigot/src/main/java/me/tofaa/entitylib/spigot/InternalRegistryListener.java" beforeDir="false" afterPath="$PROJECT_DIR$/platforms/spigot/src/main/java/me/tofaa/entitylib/spigot/InternalRegistryListener.java" afterDir="false" />
|
||||||
|
<change beforePath="$PROJECT_DIR$/settings.gradle" beforeDir="false" afterPath="$PROJECT_DIR$/settings.gradle" afterDir="false" />
|
||||||
|
<change beforePath="$PROJECT_DIR$/test-plugin/build.gradle" beforeDir="false" afterPath="$PROJECT_DIR$/test-plugin/build.gradle" afterDir="false" />
|
||||||
|
<change beforePath="$PROJECT_DIR$/test-plugin/src/main/java/me/tofaa/testentitylib/TestEntityLibPlugin.java" beforeDir="false" afterPath="$PROJECT_DIR$/test-plugin/src/main/java/me/tofaa/testentitylib/TestEntityLibPlugin.java" afterDir="false" />
|
||||||
</list>
|
</list>
|
||||||
<option name="SHOW_DIALOG" value="false" />
|
<option name="SHOW_DIALOG" value="false" />
|
||||||
<option name="HIGHLIGHT_CONFLICTS" value="true" />
|
<option name="HIGHLIGHT_CONFLICTS" value="true" />
|
||||||
|
@ -144,7 +147,7 @@
|
||||||
<recent name="D:\Github\EntityLib\test-plugin" />
|
<recent name="D:\Github\EntityLib\test-plugin" />
|
||||||
</key>
|
</key>
|
||||||
</component>
|
</component>
|
||||||
<component name="RunManager" selected="Gradle.EntityLib [publish]">
|
<component name="RunManager" selected="Gradle.EntityLib:test-plugin [runServer]">
|
||||||
<configuration name="Main" type="Application" factoryName="Application" temporary="true" nameIsGenerated="true">
|
<configuration name="Main" type="Application" factoryName="Application" temporary="true" nameIsGenerated="true">
|
||||||
<option name="MAIN_CLASS_NAME" value="me.tofaa.entitylib.codegen.Main" />
|
<option name="MAIN_CLASS_NAME" value="me.tofaa.entitylib.codegen.Main" />
|
||||||
<module name="EntityLib.code-gen.main" />
|
<module name="EntityLib.code-gen.main" />
|
||||||
|
@ -248,9 +251,9 @@
|
||||||
</configuration>
|
</configuration>
|
||||||
<recent_temporary>
|
<recent_temporary>
|
||||||
<list>
|
<list>
|
||||||
|
<item itemvalue="Gradle.EntityLib:test-plugin [runServer]" />
|
||||||
<item itemvalue="Gradle.EntityLib [publish]" />
|
<item itemvalue="Gradle.EntityLib [publish]" />
|
||||||
<item itemvalue="Gradle.EntityLib:test-plugin [publish]" />
|
<item itemvalue="Gradle.EntityLib:test-plugin [publish]" />
|
||||||
<item itemvalue="Gradle.EntityLib:test-plugin [runServer]" />
|
|
||||||
<item itemvalue="Gradle.EntityLib:test-plugin [shadowJar]" />
|
<item itemvalue="Gradle.EntityLib:test-plugin [shadowJar]" />
|
||||||
<item itemvalue="Application.Main" />
|
<item itemvalue="Application.Main" />
|
||||||
</list>
|
</list>
|
||||||
|
@ -319,7 +322,8 @@
|
||||||
<workItem from="1708264836358" duration="46000" />
|
<workItem from="1708264836358" duration="46000" />
|
||||||
<workItem from="1708265094998" duration="204000" />
|
<workItem from="1708265094998" duration="204000" />
|
||||||
<workItem from="1708265345702" duration="358000" />
|
<workItem from="1708265345702" duration="358000" />
|
||||||
<workItem from="1708343107313" duration="7795000" />
|
<workItem from="1708343107313" duration="8276000" />
|
||||||
|
<workItem from="1708352150286" duration="1520000" />
|
||||||
</task>
|
</task>
|
||||||
<servers />
|
<servers />
|
||||||
</component>
|
</component>
|
||||||
|
|
|
@ -18,7 +18,6 @@ public final class APIConfig {
|
||||||
private boolean checkForUpdates = false;
|
private boolean checkForUpdates = false;
|
||||||
private boolean tickTickables = false;
|
private boolean tickTickables = false;
|
||||||
private boolean platformLogger = false;
|
private boolean platformLogger = false;
|
||||||
private boolean useAsyncEvents = false;
|
|
||||||
private boolean defaultCommands = false;
|
private boolean defaultCommands = false;
|
||||||
private boolean platformTracking = false;
|
private boolean platformTracking = false;
|
||||||
|
|
||||||
|
@ -72,11 +71,6 @@ public final class APIConfig {
|
||||||
return this;
|
return this;
|
||||||
}
|
}
|
||||||
|
|
||||||
public @NotNull APIConfig useAsyncEvents() {
|
|
||||||
this.useAsyncEvents = true;
|
|
||||||
return this;
|
|
||||||
}
|
|
||||||
|
|
||||||
public boolean shouldRegisterDefaultCommands() {
|
public boolean shouldRegisterDefaultCommands() {
|
||||||
return defaultCommands;
|
return defaultCommands;
|
||||||
}
|
}
|
||||||
|
@ -101,10 +95,6 @@ public final class APIConfig {
|
||||||
return platformLogger;
|
return platformLogger;
|
||||||
}
|
}
|
||||||
|
|
||||||
public boolean shouldUseAsyncEvents() {
|
|
||||||
return useAsyncEvents;
|
|
||||||
}
|
|
||||||
|
|
||||||
public boolean shouldTrackPlatformEntities() {
|
public boolean shouldTrackPlatformEntities() {
|
||||||
return platformTracking;
|
return platformTracking;
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,10 +1,9 @@
|
||||||
package me.tofaa.entitylib;
|
package me.tofaa.entitylib;
|
||||||
|
|
||||||
import me.tofaa.entitylib.event.EventBus;
|
import me.tofaa.entitylib.event.EventHandler;
|
||||||
import org.jetbrains.annotations.NotNull;
|
import org.jetbrains.annotations.NotNull;
|
||||||
import org.jetbrains.annotations.Nullable;
|
import org.jetbrains.annotations.Nullable;
|
||||||
|
|
||||||
import java.util.concurrent.CompletableFuture;
|
|
||||||
import java.util.logging.Logger;
|
import java.util.logging.Logger;
|
||||||
import java.util.stream.Stream;
|
import java.util.stream.Stream;
|
||||||
|
|
||||||
|
@ -61,11 +60,10 @@ public interface Platform<P> {
|
||||||
@NotNull Logger getLogger();
|
@NotNull Logger getLogger();
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Gets the event bus for the platform.
|
* Gets the event handler for the platform.
|
||||||
* WARNING: If you have {@link APIConfig#shouldUseAsyncEvents()} set to true, cast this to {@link EventBus.Async} when handling cancelled events.
|
|
||||||
* @return
|
* @return
|
||||||
*/
|
*/
|
||||||
@NotNull EventBus getEventBus();
|
@NotNull EventHandler getEventHandler();
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Sets up the API for the platform. This method should be called automatically by the platform. Don't call it yourself.
|
* Sets up the API for the platform. This method should be called automatically by the platform. Don't call it yourself.
|
||||||
|
|
|
@ -1,62 +0,0 @@
|
||||||
package me.tofaa.entitylib.event;
|
|
||||||
|
|
||||||
import org.jetbrains.annotations.NotNull;
|
|
||||||
|
|
||||||
import java.util.function.Consumer;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* A basic EventBus for scheduling and handling {@link EntityLibEvent}
|
|
||||||
* Async event busses are not thread safe, and should be handled with care. This means theres no guarantee that the event will be cancelled in time.
|
|
||||||
*/
|
|
||||||
public interface EventBus {
|
|
||||||
|
|
||||||
static @NotNull EventBus newBus(boolean async) {
|
|
||||||
return async ? new EventBusAsync() : new EventBusSync();
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Adds a listener to the EventBus.
|
|
||||||
* @param listener The listener object
|
|
||||||
* @param <T> The type of {@link EntityLibEvent}
|
|
||||||
*/
|
|
||||||
<T extends EntityLibEvent> void addListener(@NotNull EventListener<T> listener);
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Adds a listener to the EventBus.
|
|
||||||
* @param eventClass The events class
|
|
||||||
* @param consumer The consumer for the event.
|
|
||||||
* @param <T> The type of {@link EntityLibEvent}
|
|
||||||
*/
|
|
||||||
<T extends EntityLibEvent> void addListener(@NotNull Class<T> eventClass, @NotNull Consumer<T> consumer);
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Removes a listener from the EventBus.
|
|
||||||
* @param listener the listener object.
|
|
||||||
* @param <T> The type of {@link EntityLibEvent}
|
|
||||||
*/
|
|
||||||
<T extends EntityLibEvent> void removeListener(@NotNull EventListener<T> listener);
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Calls the event and processes all the attached {@link EventListener} for the event.
|
|
||||||
* If your bus is async, rather than using this, use {@link Async#call(EntityLibEvent, Consumer)} to avoid any race conditions.
|
|
||||||
* @param event the event object to process handlers for.
|
|
||||||
* @return the same event object, but already modified.
|
|
||||||
* @param <T> The type of {@link EntityLibEvent}
|
|
||||||
*/
|
|
||||||
<T extends EntityLibEvent> @NotNull T call(@NotNull T event);
|
|
||||||
|
|
||||||
|
|
||||||
interface Async extends EventBus {
|
|
||||||
|
|
||||||
/**
|
|
||||||
* A safer way to handle and process an event. Does exactly what {@link EventBus#call(EntityLibEvent)} does but allows you to attach a callback, rather than working with it yourself,
|
|
||||||
* the callback is executed on the thread this is called, and not the main thread.
|
|
||||||
* @param event the event object to process handlers for.
|
|
||||||
* @param completionCallback the callback handled after the event is consumed async
|
|
||||||
* @param <T> The type of {@link EntityLibEvent}
|
|
||||||
*/
|
|
||||||
<T extends EntityLibEvent> void call(@NotNull T event, @NotNull Consumer<T> completionCallback);
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
|
@ -1,60 +0,0 @@
|
||||||
package me.tofaa.entitylib.event;
|
|
||||||
|
|
||||||
import org.jetbrains.annotations.NotNull;
|
|
||||||
|
|
||||||
import java.util.HashSet;
|
|
||||||
import java.util.Map;
|
|
||||||
import java.util.concurrent.ConcurrentHashMap;
|
|
||||||
import java.util.concurrent.LinkedBlockingQueue;
|
|
||||||
import java.util.concurrent.ThreadPoolExecutor;
|
|
||||||
import java.util.concurrent.TimeUnit;
|
|
||||||
import java.util.function.Consumer;
|
|
||||||
|
|
||||||
final class EventBusAsync implements EventBus.Async {
|
|
||||||
|
|
||||||
private final Map listeners = new ConcurrentHashMap();
|
|
||||||
private final ThreadPoolExecutor executor = new ThreadPoolExecutor(1, 4, 60, TimeUnit.SECONDS, new LinkedBlockingQueue<>());
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public <T extends EntityLibEvent> void addListener(@NotNull EventListener<T> listener) {
|
|
||||||
if (listeners.containsKey(listener.getEventClass())) {
|
|
||||||
listeners.put(listener.getEventClass(), new HashSet<>());
|
|
||||||
}
|
|
||||||
((HashSet) listeners.get(listener.getEventClass())).add(listener);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public <T extends EntityLibEvent> void addListener(@NotNull Class<T> eventClass, @NotNull Consumer<T> consumer) {
|
|
||||||
addListener(EventListener.generateListener(eventClass, consumer));
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public <T extends EntityLibEvent> void removeListener(@NotNull EventListener<T> listener) {
|
|
||||||
if (listeners.containsKey(listener.getEventClass())) {
|
|
||||||
((HashSet) listeners.get(listener.getEventClass())).remove(listener);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public <T extends EntityLibEvent> @NotNull T call(@NotNull T event) {
|
|
||||||
executor.execute(() -> dispatchEvent(event));
|
|
||||||
return event;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
private <T extends EntityLibEvent> void dispatchEvent(T event) {
|
|
||||||
if (!listeners.containsKey(event.getClass())) return;
|
|
||||||
HashSet<EventListener<T>> consumers = (HashSet<EventListener<T>>) listeners.get(event.getClass());
|
|
||||||
consumers.forEach(consumer -> consumer.handle(event));
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public <T extends EntityLibEvent> void call(@NotNull T event, @NotNull Consumer<T> completionCallback) {
|
|
||||||
executor.execute(() -> {
|
|
||||||
dispatchEvent(event);
|
|
||||||
completionCallback.accept(event);
|
|
||||||
});
|
|
||||||
}
|
|
||||||
}
|
|
|
@ -1,43 +0,0 @@
|
||||||
package me.tofaa.entitylib.event;
|
|
||||||
|
|
||||||
|
|
||||||
import org.jetbrains.annotations.NotNull;
|
|
||||||
|
|
||||||
import java.util.HashSet;
|
|
||||||
import java.util.Map;
|
|
||||||
import java.util.concurrent.ConcurrentHashMap;
|
|
||||||
import java.util.function.Consumer;
|
|
||||||
|
|
||||||
@SuppressWarnings("unchecked")
|
|
||||||
class EventBusSync implements EventBus {
|
|
||||||
|
|
||||||
private final Map listeners = new ConcurrentHashMap();
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public <T extends EntityLibEvent> void addListener(@NotNull EventListener<T> listener) {
|
|
||||||
if (listeners.containsKey(listener.getEventClass())) {
|
|
||||||
listeners.put(listener.getEventClass(), new HashSet<>());
|
|
||||||
}
|
|
||||||
((HashSet) listeners.get(listener.getEventClass())).add(listener);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public <T extends EntityLibEvent> void addListener(@NotNull Class<T> eventClass, @NotNull Consumer<T> consumer) {
|
|
||||||
addListener(EventListener.generateListener(eventClass, consumer));
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public <T extends EntityLibEvent> void removeListener(@NotNull EventListener<T> listener) {
|
|
||||||
if (listeners.containsKey(listener.getEventClass())) {
|
|
||||||
((HashSet) listeners.get(listener.getEventClass())).remove(listener);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public <T extends EntityLibEvent> @NotNull T call(@NotNull T event) {
|
|
||||||
if (!listeners.containsKey(event.getClass())) return event;
|
|
||||||
HashSet<EventListener<T>> consumers = (HashSet<EventListener<T>>) listeners.get(event.getClass());
|
|
||||||
consumers.forEach(consumer -> consumer.handle(event));
|
|
||||||
return event;
|
|
||||||
}
|
|
||||||
}
|
|
|
@ -0,0 +1,10 @@
|
||||||
|
package me.tofaa.entitylib.event;
|
||||||
|
|
||||||
|
import org.jetbrains.annotations.NotNull;
|
||||||
|
|
||||||
|
@FunctionalInterface
|
||||||
|
public interface EventCallback<E extends EntityLibEvent> {
|
||||||
|
|
||||||
|
void run(@NotNull E event);
|
||||||
|
|
||||||
|
}
|
115
api/src/main/java/me/tofaa/entitylib/event/EventHandler.java
Normal file
115
api/src/main/java/me/tofaa/entitylib/event/EventHandler.java
Normal file
|
@ -0,0 +1,115 @@
|
||||||
|
package me.tofaa.entitylib.event;
|
||||||
|
|
||||||
|
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 EntityLibEvent} listeners assigned to it.
|
||||||
|
*/
|
||||||
|
public interface EventHandler {
|
||||||
|
|
||||||
|
static @NotNull EventHandler create() {
|
||||||
|
return new EventHandlerImpl();
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Gets a {@link Map} containing all the listeners assigned to a specific {@link EntityLibEvent} type.
|
||||||
|
*
|
||||||
|
* @return a {@link Map} with all the listeners
|
||||||
|
*/
|
||||||
|
@NotNull
|
||||||
|
Map<Class<? extends EntityLibEvent>, Collection<EventCallback>> getEventCallbacksMap();
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 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 EntityLibEvent> boolean addEventCallback(@NotNull Class<E> eventClass, @NotNull EventCallback<E> 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 EntityLibEvent> boolean removeEventCallback(@NotNull Class<E> eventClass, @NotNull EventCallback<E> eventCallback) {
|
||||||
|
Collection<EventCallback> callbacks = getEventCallbacks(eventClass);
|
||||||
|
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 EntityLibEvent> 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 EntityLibEvent} they are linked.
|
||||||
|
*
|
||||||
|
* @return a {@link Stream} containing all the callbacks
|
||||||
|
*/
|
||||||
|
@NotNull
|
||||||
|
default Stream<EventCallback> getEventCallbacks() {
|
||||||
|
return getEventCallbacksMap().values().stream().flatMap(Collection::stream);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Calls the specified {@link EntityLibEvent} with all the assigned {@link EventCallback}.
|
||||||
|
* <p>
|
||||||
|
* Events are always called in the current thread.
|
||||||
|
*
|
||||||
|
* @param eventClass the event class
|
||||||
|
* @param event the event object
|
||||||
|
* @param <E> the event type
|
||||||
|
*/
|
||||||
|
default <E extends EntityLibEvent> void callEvent(@NotNull Class<E> eventClass, @NotNull E event) {
|
||||||
|
final Collection<EventCallback> eventCallbacks = getEventCallbacks(eventClass);
|
||||||
|
runEvent(eventCallbacks, event);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Calls a {@link CancellableEntityLibEvent} and execute {@code successCallback} if the {@link EntityLibEvent} is not cancelled.
|
||||||
|
* <p>
|
||||||
|
* Does call {@link #callEvent(Class, EntityLibEvent)} internally.
|
||||||
|
*
|
||||||
|
* @param eventClass the event class
|
||||||
|
* @param event the event object
|
||||||
|
* @param successCallback the callback called when the event is not cancelled
|
||||||
|
* @param <E> the event type
|
||||||
|
* @see #callEvent(Class, EntityLibEvent)
|
||||||
|
*/
|
||||||
|
default <E extends EntityLibEvent & CancellableEntityLibEvent> void callCancellableEvent(@NotNull Class<E> eventClass,
|
||||||
|
@NotNull E event,
|
||||||
|
@NotNull Runnable successCallback) {
|
||||||
|
callEvent(eventClass, event);
|
||||||
|
if (!event.isCancelled()) {
|
||||||
|
successCallback.run();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
default <E extends EntityLibEvent> void runEvent(@NotNull Collection<EventCallback> eventCallbacks, @NotNull E event) {
|
||||||
|
for (EventCallback<E> eventCallback : eventCallbacks) {
|
||||||
|
eventCallback.run(event);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
|
@ -0,0 +1,27 @@
|
||||||
|
package me.tofaa.entitylib.event;
|
||||||
|
|
||||||
|
import org.jetbrains.annotations.NotNull;
|
||||||
|
|
||||||
|
import java.util.Collection;
|
||||||
|
import java.util.Map;
|
||||||
|
import java.util.concurrent.ConcurrentHashMap;
|
||||||
|
|
||||||
|
final class EventHandlerImpl implements EventHandler {
|
||||||
|
|
||||||
|
// Events
|
||||||
|
private final Map<Class<? extends EntityLibEvent>, Collection<EventCallback>> eventCallbacks = new ConcurrentHashMap<>();
|
||||||
|
|
||||||
|
EventHandlerImpl() {
|
||||||
|
}
|
||||||
|
|
||||||
|
public <T extends EntityLibEvent> void registerListener(EventListener<T> listener) {
|
||||||
|
addEventCallback(listener.getEventClass(), EventListener.createEventCallback(listener));
|
||||||
|
}
|
||||||
|
|
||||||
|
@NotNull
|
||||||
|
@Override
|
||||||
|
public Map<Class<? extends EntityLibEvent>, Collection<EventCallback>> getEventCallbacksMap() {
|
||||||
|
return eventCallbacks;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
|
@ -10,6 +10,10 @@ public interface EventListener<E extends EntityLibEvent> {
|
||||||
|
|
||||||
void handle(@NotNull E event);
|
void handle(@NotNull E event);
|
||||||
|
|
||||||
|
static <T extends EntityLibEvent> EventCallback<T> createEventCallback(@NotNull EventListener<T> listener) {
|
||||||
|
return listener::handle;
|
||||||
|
}
|
||||||
|
|
||||||
static <T extends EntityLibEvent> EventListener<T> generateListener(Class<T> eventClass, Consumer<T> consumer) {
|
static <T extends EntityLibEvent> EventListener<T> generateListener(Class<T> eventClass, Consumer<T> consumer) {
|
||||||
return new EventListener<T>() {
|
return new EventListener<T>() {
|
||||||
@Override
|
@Override
|
||||||
|
|
|
@ -1,4 +1,4 @@
|
||||||
package me.tofaa.entitylib.event.types.tracking;
|
package me.tofaa.entitylib.event.types;
|
||||||
|
|
||||||
import com.github.retrooper.packetevents.protocol.player.User;
|
import com.github.retrooper.packetevents.protocol.player.User;
|
||||||
import me.tofaa.entitylib.TrackedEntity;
|
import me.tofaa.entitylib.TrackedEntity;
|
|
@ -1,31 +0,0 @@
|
||||||
package me.tofaa.entitylib.event.types;
|
|
||||||
|
|
||||||
import com.github.retrooper.packetevents.protocol.player.User;
|
|
||||||
import me.tofaa.entitylib.event.CancellableEntityLibEvent;
|
|
||||||
import me.tofaa.entitylib.event.EntityLibEvent;
|
|
||||||
import me.tofaa.entitylib.meta.EntityMeta;
|
|
||||||
|
|
||||||
public final class UserReceiveMetaUpdateEvent implements CancellableEntityLibEvent {
|
|
||||||
|
|
||||||
private final User user;
|
|
||||||
private boolean cancelled;
|
|
||||||
private EntityMeta meta;
|
|
||||||
|
|
||||||
public UserReceiveMetaUpdateEvent(User user) {
|
|
||||||
this.user = user;
|
|
||||||
}
|
|
||||||
|
|
||||||
public User getUser() {
|
|
||||||
return user;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public boolean isCancelled() {
|
|
||||||
return cancelled;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void setCancelled(boolean cancelled) {
|
|
||||||
this.cancelled = cancelled;
|
|
||||||
}
|
|
||||||
}
|
|
|
@ -1,37 +0,0 @@
|
||||||
package me.tofaa.entitylib.event.types;
|
|
||||||
|
|
||||||
import com.github.retrooper.packetevents.protocol.player.User;
|
|
||||||
import me.tofaa.entitylib.event.CancellableEntityLibEvent;
|
|
||||||
import me.tofaa.entitylib.event.EntityLibEvent;
|
|
||||||
import me.tofaa.entitylib.wrapper.WrapperEntity;
|
|
||||||
|
|
||||||
public class UserRefreshEntityEvent implements CancellableEntityLibEvent {
|
|
||||||
|
|
||||||
private final User user;
|
|
||||||
private final WrapperEntity entity;
|
|
||||||
private boolean cancelled;
|
|
||||||
|
|
||||||
public UserRefreshEntityEvent(User user, WrapperEntity entity) {
|
|
||||||
this.user = user;
|
|
||||||
this.entity = entity;
|
|
||||||
}
|
|
||||||
|
|
||||||
public User getUser() {
|
|
||||||
return user;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
public WrapperEntity getEntity() {
|
|
||||||
return entity;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public boolean isCancelled() {
|
|
||||||
return cancelled;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void setCancelled(boolean cancelled) {
|
|
||||||
this.cancelled = cancelled;
|
|
||||||
}
|
|
||||||
}
|
|
|
@ -1,11 +1,12 @@
|
||||||
package me.tofaa.entitylib.event.types.tracking;
|
package me.tofaa.entitylib.event.types;
|
||||||
|
|
||||||
import com.github.retrooper.packetevents.protocol.player.User;
|
import com.github.retrooper.packetevents.protocol.player.User;
|
||||||
import me.tofaa.entitylib.TrackedEntity;
|
import me.tofaa.entitylib.TrackedEntity;
|
||||||
|
|
||||||
|
import me.tofaa.entitylib.event.EntityLibEvent;
|
||||||
import org.jetbrains.annotations.NotNull;
|
import org.jetbrains.annotations.NotNull;
|
||||||
|
|
||||||
public class UserStopTrackingEntityEvent extends GeneralTrackingEvent {
|
public class UserStopTrackingEntityEvent extends GeneralTrackingEvent implements EntityLibEvent {
|
||||||
|
|
||||||
|
|
||||||
public UserStopTrackingEntityEvent(@NotNull User user, @NotNull TrackedEntity entity) {
|
public UserStopTrackingEntityEvent(@NotNull User user, @NotNull TrackedEntity entity) {
|
|
@ -1,10 +1,11 @@
|
||||||
package me.tofaa.entitylib.event.types.tracking;
|
package me.tofaa.entitylib.event.types;
|
||||||
|
|
||||||
import com.github.retrooper.packetevents.protocol.player.User;
|
import com.github.retrooper.packetevents.protocol.player.User;
|
||||||
import me.tofaa.entitylib.TrackedEntity;
|
import me.tofaa.entitylib.TrackedEntity;
|
||||||
|
import me.tofaa.entitylib.event.EntityLibEvent;
|
||||||
import org.jetbrains.annotations.NotNull;
|
import org.jetbrains.annotations.NotNull;
|
||||||
|
|
||||||
public final class UserTrackingEntityEvent extends GeneralTrackingEvent {
|
public final class UserTrackingEntityEvent extends GeneralTrackingEvent implements EntityLibEvent {
|
||||||
|
|
||||||
|
|
||||||
public UserTrackingEntityEvent(@NotNull User user, @NotNull TrackedEntity entity) {
|
public UserTrackingEntityEvent(@NotNull User user, @NotNull TrackedEntity entity) {
|
|
@ -1,11 +1,10 @@
|
||||||
package me.tofaa.entitylib.common;
|
package me.tofaa.entitylib.common;
|
||||||
|
|
||||||
import me.tofaa.entitylib.*;
|
import me.tofaa.entitylib.*;
|
||||||
import me.tofaa.entitylib.event.EventBus;
|
import me.tofaa.entitylib.event.EventHandler;
|
||||||
import org.jetbrains.annotations.NotNull;
|
import org.jetbrains.annotations.NotNull;
|
||||||
import org.jetbrains.annotations.Nullable;
|
import org.jetbrains.annotations.Nullable;
|
||||||
|
|
||||||
import java.util.concurrent.CompletableFuture;
|
|
||||||
import java.util.logging.Logger;
|
import java.util.logging.Logger;
|
||||||
import java.util.stream.Stream;
|
import java.util.stream.Stream;
|
||||||
|
|
||||||
|
@ -14,7 +13,7 @@ public abstract class AbstractPlatform<P> implements Platform<P> {
|
||||||
|
|
||||||
protected final P handle;
|
protected final P handle;
|
||||||
protected Logger logger;
|
protected Logger logger;
|
||||||
private EventBus eventBus;
|
private EventHandler eventHandler;
|
||||||
private EntityIdProvider entityIdProvider;
|
private EntityIdProvider entityIdProvider;
|
||||||
private EntityUuidProvider entityUuidProvider;
|
private EntityUuidProvider entityUuidProvider;
|
||||||
|
|
||||||
|
@ -36,11 +35,9 @@ public abstract class AbstractPlatform<P> implements Platform<P> {
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void setupApi(@NotNull APIConfig settings) {
|
public void setupApi(@NotNull APIConfig settings) {
|
||||||
this.eventBus = EventBus.newBus(settings.shouldUseAsyncEvents());
|
this.eventHandler = EventHandler.create();
|
||||||
this.entityIdProvider = new EntityIdProvider.DefaultEntityIdProvider();
|
this.entityIdProvider = new EntityIdProvider.DefaultEntityIdProvider();
|
||||||
this.entityUuidProvider = new EntityUuidProvider.DefaultEntityUuidProvider();
|
this.entityUuidProvider = new EntityUuidProvider.DefaultEntityUuidProvider();
|
||||||
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@NotNull
|
@NotNull
|
||||||
|
@ -73,8 +70,8 @@ public abstract class AbstractPlatform<P> implements Platform<P> {
|
||||||
|
|
||||||
@NotNull
|
@NotNull
|
||||||
@Override
|
@Override
|
||||||
public EventBus getEventBus() {
|
public EventHandler getEventHandler() {
|
||||||
return eventBus;
|
return eventHandler;
|
||||||
}
|
}
|
||||||
|
|
||||||
@NotNull
|
@NotNull
|
||||||
|
|
|
@ -9,8 +9,8 @@ import com.github.retrooper.packetevents.wrapper.play.server.WrapperPlayServerDe
|
||||||
import com.github.retrooper.packetevents.wrapper.play.server.WrapperPlayServerSpawnEntity;
|
import com.github.retrooper.packetevents.wrapper.play.server.WrapperPlayServerSpawnEntity;
|
||||||
import com.github.retrooper.packetevents.wrapper.play.server.WrapperPlayServerSpawnExperienceOrb;
|
import com.github.retrooper.packetevents.wrapper.play.server.WrapperPlayServerSpawnExperienceOrb;
|
||||||
import me.tofaa.entitylib.TrackedEntity;
|
import me.tofaa.entitylib.TrackedEntity;
|
||||||
import me.tofaa.entitylib.event.types.tracking.UserStopTrackingEntityEvent;
|
import me.tofaa.entitylib.event.types.UserStopTrackingEntityEvent;
|
||||||
import me.tofaa.entitylib.event.types.tracking.UserTrackingEntityEvent;
|
import me.tofaa.entitylib.event.types.UserTrackingEntityEvent;
|
||||||
import org.bukkit.entity.Entity;
|
import org.bukkit.entity.Entity;
|
||||||
import org.bukkit.event.EventHandler;
|
import org.bukkit.event.EventHandler;
|
||||||
import org.bukkit.event.Listener;
|
import org.bukkit.event.Listener;
|
||||||
|
|
|
@ -1,4 +1,5 @@
|
||||||
rootProject.name = 'EntityLib'
|
rootProject.name = 'EntityLib'
|
||||||
|
include 'test-plugin'
|
||||||
include 'api'
|
include 'api'
|
||||||
include 'platforms:spigot'
|
include 'platforms:spigot'
|
||||||
findProject(':platforms:spigot')?.name = 'spigot'
|
findProject(':platforms:spigot')?.name = 'spigot'
|
||||||
|
|
|
@ -7,6 +7,12 @@ plugins {
|
||||||
|
|
||||||
group = 'me.tofaa.peentitymeta'
|
group = 'me.tofaa.peentitymeta'
|
||||||
version = '1.0-SNAPSHOT'
|
version = '1.0-SNAPSHOT'
|
||||||
|
// java 17
|
||||||
|
java {
|
||||||
|
toolchain {
|
||||||
|
languageVersion.set(JavaLanguageVersion.of(17))
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
repositories {
|
repositories {
|
||||||
mavenCentral()
|
mavenCentral()
|
||||||
|
@ -27,7 +33,7 @@ repositories {
|
||||||
dependencies {
|
dependencies {
|
||||||
compileOnly('org.spigotmc:spigot-api:1.20.1-R0.1-SNAPSHOT')
|
compileOnly('org.spigotmc:spigot-api:1.20.1-R0.1-SNAPSHOT')
|
||||||
compileOnly('com.github.retrooper.packetevents:spigot:2.0.2')
|
compileOnly('com.github.retrooper.packetevents:spigot:2.0.2')
|
||||||
implementation("com.github.Tofaa2.EntityLib:spigot:2.0.0-SNAPSHOT")
|
implementation(project(":platforms:spigot"))
|
||||||
}
|
}
|
||||||
|
|
||||||
tasks {
|
tasks {
|
||||||
|
|
|
@ -9,7 +9,7 @@ import me.tofaa.entitylib.meta.mobs.passive.ChickenMeta;
|
||||||
import me.tofaa.entitylib.spigot.SpigotEntityLibAPI;
|
import me.tofaa.entitylib.spigot.SpigotEntityLibAPI;
|
||||||
import me.tofaa.entitylib.spigot.SpigotEntityLibPlatform;
|
import me.tofaa.entitylib.spigot.SpigotEntityLibPlatform;
|
||||||
import me.tofaa.entitylib.wrapper.WrapperEntity;
|
import me.tofaa.entitylib.wrapper.WrapperEntity;
|
||||||
import org.bukkit.World;
|
import me.tofaa.entitylib.event.types.*;
|
||||||
import org.bukkit.command.Command;
|
import org.bukkit.command.Command;
|
||||||
import org.bukkit.command.CommandExecutor;
|
import org.bukkit.command.CommandExecutor;
|
||||||
import org.bukkit.command.CommandSender;
|
import org.bukkit.command.CommandSender;
|
||||||
|
@ -35,6 +35,14 @@ public class TestEntityLibPlugin extends JavaPlugin implements CommandExecutor {
|
||||||
EntityLib.init(platform, settings);
|
EntityLib.init(platform, settings);
|
||||||
api = platform.getAPI();
|
api = platform.getAPI();
|
||||||
getCommand("testapi").setExecutor(this);
|
getCommand("testapi").setExecutor(this);
|
||||||
|
platform.getEventHandler().addEventCallback(UserTrackingEntityEvent.class, event -> {
|
||||||
|
System.out.println("Tracking: " + event.getEntity().getEntityId());
|
||||||
|
System.out.println("Size: " + platform.queryPlatformEntities().toArray().length);
|
||||||
|
});
|
||||||
|
platform.getEventHandler().addEventCallback(UserStopTrackingEntityEvent.class, event -> {
|
||||||
|
System.out.println("Stop Tracking: " + event.getEntity().getEntityId());
|
||||||
|
System.out.println("Size: " + platform.queryPlatformEntities().toArray().length);
|
||||||
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
|
Loading…
Reference in a new issue