redo event system

This commit is contained in:
Tofaa 2024-02-19 18:48:17 +04:00
parent 17fc677643
commit 1527ddda93
22 changed files with 213 additions and 283 deletions

View file

@ -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>

View file

@ -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>

View file

@ -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>

View file

@ -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;
} }

View file

@ -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.

View file

@ -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);
}
}

View file

@ -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);
});
}
}

View file

@ -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;
}
}

View file

@ -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);
}

View 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);
}
}
}

View file

@ -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;
}
}

View file

@ -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

View file

@ -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;

View file

@ -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;
}
}

View file

@ -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;
}
}

View file

@ -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) {

View file

@ -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) {

View file

@ -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

View file

@ -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;

View file

@ -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'

View file

@ -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 {

View file

@ -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