From 13046a8602a1f9499dd2618e10c94fe1fb316849 Mon Sep 17 00:00:00 2001 From: Tim203 Date: Sat, 13 Aug 2022 22:48:12 +0200 Subject: [PATCH] Fixed building and switched event library --- api/base/build.gradle.kts | 3 +- .../org/geysermc/geyser/api/GeyserApi.java | 6 - .../geysermc/geyser/api/event/EventBus.java | 63 +---------- ...{Cancellable.java => EventSubscriber.java} | 26 ++--- .../geyser/api/event/EventSubscription.java | 82 -------------- .../geyser/api/event/ExtensionEventBus.java | 31 +----- ...ent.java => ExtensionEventSubscriber.java} | 15 +-- .../geysermc/geyser/api/event/Subscribe.java | 103 ----------------- .../api/event/connection/ConnectionEvent.java | 2 +- .../downstream/ServerDefineCommandsEvent.java | 2 +- .../GeyserDefineCustomItemsEvent.java | 29 ++--- .../GeyserLoadResourcePacksEvent.java | 2 +- .../lifecycle/GeyserPostInitializeEvent.java | 2 +- .../lifecycle/GeyserPreInitializeEvent.java | 2 +- .../event/lifecycle/GeyserShutdownEvent.java | 2 +- build-logic/src/main/kotlin/Versions.kt | 2 +- core/build.gradle.kts | 3 - .../java/org/geysermc/geyser/GeyserImpl.java | 12 -- .../event/AbstractEventSubscription.java | 68 ------------ .../event/GeneratedEventSubscription.java | 60 ---------- .../geysermc/geyser/event/GeyserEventBus.java | 105 ++++-------------- ...iption.java => GeyserEventSubscriber.java} | 35 ++---- .../event/type/DefineCustomItemsEvent.java | 85 ++++++++++++++ .../event/GeyserExtensionEventBus.java | 72 +++++------- .../populator/ItemRegistryPopulator.java | 3 +- 25 files changed, 193 insertions(+), 622 deletions(-) rename api/geyser/src/main/java/org/geysermc/geyser/api/event/{Cancellable.java => EventSubscriber.java} (74%) delete mode 100644 api/geyser/src/main/java/org/geysermc/geyser/api/event/EventSubscription.java rename api/geyser/src/main/java/org/geysermc/geyser/api/event/{Event.java => ExtensionEventSubscriber.java} (85%) delete mode 100644 api/geyser/src/main/java/org/geysermc/geyser/api/event/Subscribe.java delete mode 100644 core/src/main/java/org/geysermc/geyser/event/AbstractEventSubscription.java delete mode 100644 core/src/main/java/org/geysermc/geyser/event/GeneratedEventSubscription.java rename core/src/main/java/org/geysermc/geyser/event/{BaseEventSubscription.java => GeyserEventSubscriber.java} (55%) create mode 100644 core/src/main/java/org/geysermc/geyser/event/type/DefineCustomItemsEvent.java diff --git a/api/base/build.gradle.kts b/api/base/build.gradle.kts index c9ddf4489..03f08c6d2 100644 --- a/api/base/build.gradle.kts +++ b/api/base/build.gradle.kts @@ -1,5 +1,4 @@ dependencies { api("org.geysermc.cumulus", "cumulus", Versions.cumulusVersion) + api("org.geysermc.event", "events", Versions.eventsVersion) } - -provided("net.kyori", "event-api", Versions.eventVersion) diff --git a/api/geyser/src/main/java/org/geysermc/geyser/api/GeyserApi.java b/api/geyser/src/main/java/org/geysermc/geyser/api/GeyserApi.java index 9b584b985..82f0566fe 100644 --- a/api/geyser/src/main/java/org/geysermc/geyser/api/GeyserApi.java +++ b/api/geyser/src/main/java/org/geysermc/geyser/api/GeyserApi.java @@ -55,12 +55,6 @@ public interface GeyserApi extends GeyserApiBase { @Override @Nullable GeyserConnection connectionByXuid(@NonNull String xuid); - /** - * {@inheritDoc} - */ - @Override - @Nullable GeyserConnection connectionByUsername(@NonNull String username); - /** * {@inheritDoc} */ diff --git a/api/geyser/src/main/java/org/geysermc/geyser/api/event/EventBus.java b/api/geyser/src/main/java/org/geysermc/geyser/api/event/EventBus.java index b13f12300..c42698d47 100644 --- a/api/geyser/src/main/java/org/geysermc/geyser/api/event/EventBus.java +++ b/api/geyser/src/main/java/org/geysermc/geyser/api/event/EventBus.java @@ -26,71 +26,18 @@ package org.geysermc.geyser.api.event; import org.checkerframework.checker.nullness.qual.NonNull; +import org.geysermc.event.Event; +import org.geysermc.event.bus.OwnedEventBus; import org.geysermc.geyser.api.extension.Extension; import java.util.Set; -import java.util.function.Consumer; /** * Represents a bus capable of subscribing * or "listening" to events and firing them. */ -public interface EventBus { - - /** - * Subscribes to the given event see {@link EventSubscription}. - * - * The difference between this method and {@link ExtensionEventBus#subscribe(Class, Consumer)} - * is that this method takes in an extension parameter which allows for - * the event to be unsubscribed upon extension disable and reloads. - * - * @param extension the extension to subscribe the event to - * @param eventClass the class of the event - * @param consumer the consumer for handling the event - * @param the event class - * @return the event subscription - */ +public interface EventBus extends OwnedEventBus> { + @Override @NonNull - EventSubscription subscribe(@NonNull Extension extension, @NonNull Class eventClass, @NonNull Consumer consumer); - - /** - * Unsubscribes the given {@link EventSubscription}. - * - * @param subscription the event subscription - */ - void unsubscribe(@NonNull EventSubscription subscription); - - /** - * Registers events for the given listener. - * - * @param extension the extension registering the event - * @param eventHolder the listener - */ - void register(@NonNull Extension extension, @NonNull Object eventHolder); - - /** - * Unregisters all events from a given {@link Extension}. - * - * @param extension the extension - */ - void unregisterAll(@NonNull Extension extension); - - /** - * Fires the given {@link Event} and returns the result. - * - * @param event the event to fire - * - * @return true if the event successfully fired - */ - boolean fire(@NonNull Event event); - - /** - * Gets the subscriptions for the given event class. - * - * @param eventClass the event class - * @param the value - * @return the subscriptions for the event class - */ - @NonNull - Set> subscriptions(@NonNull Class eventClass); + Set> subscribers(@NonNull Class eventClass); } diff --git a/api/geyser/src/main/java/org/geysermc/geyser/api/event/Cancellable.java b/api/geyser/src/main/java/org/geysermc/geyser/api/event/EventSubscriber.java similarity index 74% rename from api/geyser/src/main/java/org/geysermc/geyser/api/event/Cancellable.java rename to api/geyser/src/main/java/org/geysermc/geyser/api/event/EventSubscriber.java index 94d0b832d..7ce5b7883 100644 --- a/api/geyser/src/main/java/org/geysermc/geyser/api/event/Cancellable.java +++ b/api/geyser/src/main/java/org/geysermc/geyser/api/event/EventSubscriber.java @@ -25,22 +25,16 @@ package org.geysermc.geyser.api.event; +import org.geysermc.event.Event; +import org.geysermc.event.subscribe.OwnedSubscriber; +import org.geysermc.geyser.api.extension.Extension; + /** - * Represents a cancellable event. + * Represents a subscribed listener to a {@link Event}. Wraps around + * the event and is capable of unsubscribing from the event or give + * information about it. + * + * @param the class of the event */ -public interface Cancellable { - - /** - * Gets if the event is cancelled. - * - * @return if the event is cancelled - */ - boolean isCancelled(); - - /** - * Cancels the event. - * - * @param cancelled if the event is cancelled - */ - void setCancelled(boolean cancelled); +public interface EventSubscriber extends OwnedSubscriber { } diff --git a/api/geyser/src/main/java/org/geysermc/geyser/api/event/EventSubscription.java b/api/geyser/src/main/java/org/geysermc/geyser/api/event/EventSubscription.java deleted file mode 100644 index 9a04b697c..000000000 --- a/api/geyser/src/main/java/org/geysermc/geyser/api/event/EventSubscription.java +++ /dev/null @@ -1,82 +0,0 @@ -/* - * Copyright (c) 2019-2022 GeyserMC. http://geysermc.org - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - * THE SOFTWARE. - * - * @author GeyserMC - * @link https://github.com/GeyserMC/Geyser - */ - -package org.geysermc.geyser.api.event; - -import org.checkerframework.checker.nullness.qual.NonNull; -import org.geysermc.geyser.api.extension.Extension; - -/** - * Represents a subscribed listener to a {@link Event}. Wraps around - * the event and is capable of unsubscribing from the event or give - * information about it. - * - * @param the class of the event - */ -public interface EventSubscription { - - /** - * Gets the event class. - * - * @return the event class - */ - @NonNull - Class eventClass(); - - /** - * Gets the {@link Extension} that owns this - * event subscription. - * - * @return the extension that owns this subscription - */ - @NonNull - Extension owner(); - - /** - * Gets the post order of this event subscription. - * - * @return the post order of this event subscription - */ - Subscribe.PostOrder order(); - - /** - * Gets if this event subscription is active. - * - * @return if this event subscription is active - */ - boolean isActive(); - - /** - * Unsubscribes from this event listener - */ - void unsubscribe(); - - /** - * Invokes the given event - * - * @param event the event - */ - void invoke(@NonNull T event) throws Throwable; -} diff --git a/api/geyser/src/main/java/org/geysermc/geyser/api/event/ExtensionEventBus.java b/api/geyser/src/main/java/org/geysermc/geyser/api/event/ExtensionEventBus.java index db0209e5f..172c0f9de 100644 --- a/api/geyser/src/main/java/org/geysermc/geyser/api/event/ExtensionEventBus.java +++ b/api/geyser/src/main/java/org/geysermc/geyser/api/event/ExtensionEventBus.java @@ -26,36 +26,15 @@ package org.geysermc.geyser.api.event; import org.checkerframework.checker.nullness.qual.NonNull; +import org.geysermc.event.Event; -import java.util.function.Consumer; +import java.util.Set; /** * An {@link EventBus} with additional methods that implicitly * set the extension instance. - * */ -public interface ExtensionEventBus extends EventBus { - - /** - * Subscribes to the given event see {@link EventSubscription}. - * - * @param eventClass the class of the event - * @param consumer the consumer for handling the event - * @param the event class - * @return the event subscription - */ - @NonNull - EventSubscription subscribe(@NonNull Class eventClass, @NonNull Consumer consumer); - - /** - * Registers events for the given listener. - * - * @param eventHolder the listener - */ - void register(@NonNull Object eventHolder); - - /** - * Unregisters all events for this extension. - */ - void unregisterAll(); +public interface ExtensionEventBus extends org.geysermc.event.bus.EventBus> { + @Override + @NonNull Set> subscribers(@NonNull Class eventClass); } diff --git a/api/geyser/src/main/java/org/geysermc/geyser/api/event/Event.java b/api/geyser/src/main/java/org/geysermc/geyser/api/event/ExtensionEventSubscriber.java similarity index 85% rename from api/geyser/src/main/java/org/geysermc/geyser/api/event/Event.java rename to api/geyser/src/main/java/org/geysermc/geyser/api/event/ExtensionEventSubscriber.java index c32e1701e..9c5fffa2f 100644 --- a/api/geyser/src/main/java/org/geysermc/geyser/api/event/Event.java +++ b/api/geyser/src/main/java/org/geysermc/geyser/api/event/ExtensionEventSubscriber.java @@ -25,17 +25,8 @@ package org.geysermc.geyser.api.event; -/** - * Represents an event. - */ -public interface Event { +import org.geysermc.event.Event; +import org.geysermc.event.subscribe.Subscriber; - /** - * Gets if the event is async. - * - * @return if the event is async - */ - default boolean isAsync() { - return false; - } +public interface ExtensionEventSubscriber extends Subscriber { } diff --git a/api/geyser/src/main/java/org/geysermc/geyser/api/event/Subscribe.java b/api/geyser/src/main/java/org/geysermc/geyser/api/event/Subscribe.java deleted file mode 100644 index 488fa0ea3..000000000 --- a/api/geyser/src/main/java/org/geysermc/geyser/api/event/Subscribe.java +++ /dev/null @@ -1,103 +0,0 @@ -/* - * Copyright (c) 2019-2022 GeyserMC. http://geysermc.org - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - * THE SOFTWARE. - * - * @author GeyserMC - * @link https://github.com/GeyserMC/Geyser - */ - -package org.geysermc.geyser.api.event; - -import java.lang.annotation.ElementType; -import java.lang.annotation.Retention; -import java.lang.annotation.RetentionPolicy; -import java.lang.annotation.Target; - -/** - * An annotation used to signify the given method is - * an {@link Event}. Only should be applied to methods - * where the class containing them is designated for - * events specifically. - * - * When using {@link EventBus#subscribe}, this annotation should - * not be applied whatsoever as it will have no use and potentially - * throw errors due to it being used wrongly. - */ -@Retention(RetentionPolicy.RUNTIME) -@Target(ElementType.METHOD) -public @interface Subscribe { - - /** - * The {@link PostOrder} of the event - * - * @return the post order of the event - */ - Subscribe.PostOrder postOrder() default PostOrder.NORMAL; - - /** - * Represents the post order of an event. - */ - enum PostOrder { - - /** - * The lowest priority. Called first to - * allow for other events to customize - * the outcome - */ - FIRST(net.kyori.event.PostOrders.FIRST), - - /** - * The second lowest priority. - */ - EARLY(net.kyori.event.PostOrders.EARLY), - - /** - * Normal priority. Event is neither - * important nor unimportant - */ - NORMAL(net.kyori.event.PostOrders.NORMAL), - - /** - * The second highest priority - */ - LATE(net.kyori.event.PostOrders.LATE), - - /** - * The highest of importance! Event is called - * last and has the final say in the outcome - */ - LAST(net.kyori.event.PostOrders.LAST); - - private final int postOrder; - - PostOrder(int postOrder) { - this.postOrder = postOrder; - } - - /** - * The numerical post order value. - * - * @return numerical post order value - */ - public int postOrder() { - return this.postOrder; - } - } -} \ No newline at end of file diff --git a/api/geyser/src/main/java/org/geysermc/geyser/api/event/connection/ConnectionEvent.java b/api/geyser/src/main/java/org/geysermc/geyser/api/event/connection/ConnectionEvent.java index 48f3acdb7..158f14d53 100644 --- a/api/geyser/src/main/java/org/geysermc/geyser/api/event/connection/ConnectionEvent.java +++ b/api/geyser/src/main/java/org/geysermc/geyser/api/event/connection/ConnectionEvent.java @@ -26,8 +26,8 @@ package org.geysermc.geyser.api.event.connection; import org.checkerframework.checker.nullness.qual.NonNull; +import org.geysermc.event.Event; import org.geysermc.geyser.api.connection.GeyserConnection; -import org.geysermc.geyser.api.event.Event; /** * An event that contains a {@link GeyserConnection}. diff --git a/api/geyser/src/main/java/org/geysermc/geyser/api/event/downstream/ServerDefineCommandsEvent.java b/api/geyser/src/main/java/org/geysermc/geyser/api/event/downstream/ServerDefineCommandsEvent.java index 2ab1b9611..e46492b36 100644 --- a/api/geyser/src/main/java/org/geysermc/geyser/api/event/downstream/ServerDefineCommandsEvent.java +++ b/api/geyser/src/main/java/org/geysermc/geyser/api/event/downstream/ServerDefineCommandsEvent.java @@ -26,8 +26,8 @@ package org.geysermc.geyser.api.event.downstream; import org.checkerframework.checker.nullness.qual.NonNull; +import org.geysermc.event.Cancellable; import org.geysermc.geyser.api.connection.GeyserConnection; -import org.geysermc.geyser.api.event.Cancellable; import org.geysermc.geyser.api.event.connection.ConnectionEvent; import java.util.Set; diff --git a/api/geyser/src/main/java/org/geysermc/geyser/api/event/lifecycle/GeyserDefineCustomItemsEvent.java b/api/geyser/src/main/java/org/geysermc/geyser/api/event/lifecycle/GeyserDefineCustomItemsEvent.java index 308b39d22..bfed5d534 100644 --- a/api/geyser/src/main/java/org/geysermc/geyser/api/event/lifecycle/GeyserDefineCustomItemsEvent.java +++ b/api/geyser/src/main/java/org/geysermc/geyser/api/event/lifecycle/GeyserDefineCustomItemsEvent.java @@ -25,45 +25,34 @@ package org.geysermc.geyser.api.event.lifecycle; -import com.google.common.collect.Multimap; import org.checkerframework.checker.nullness.qual.NonNull; -import org.geysermc.geyser.api.event.Event; +import org.geysermc.event.Event; import org.geysermc.geyser.api.item.custom.CustomItemData; import org.geysermc.geyser.api.item.custom.NonVanillaCustomItemData; -import java.util.*; +import java.util.Collection; +import java.util.List; +import java.util.Map; /** * Called on Geyser's startup when looking for custom items. Custom items must be registered through this event. * * This event will not be called if the "add non-Bedrock items" setting is disabled in the Geyser config. */ -public abstract class GeyserDefineCustomItemsEvent implements Event { - private final Multimap customItems; - private final List nonVanillaCustomItems; - - public GeyserDefineCustomItemsEvent(Multimap customItems, List nonVanillaCustomItems) { - this.customItems = customItems; - this.nonVanillaCustomItems = nonVanillaCustomItems; - } - +public interface GeyserDefineCustomItemsEvent extends Event { /** * Gets a multimap of all the already registered custom items indexed by the item's extended java item's identifier. * * @return a multimap of all the already registered custom items */ - public Map> getExistingCustomItems() { - return Collections.unmodifiableMap(this.customItems.asMap()); - } + Map> getExistingCustomItems(); /** * Gets the list of the already registered non-vanilla custom items. * * @return the list of the already registered non-vanilla custom items */ - public List getExistingNonVanillaCustomItems() { - return Collections.unmodifiableList(this.nonVanillaCustomItems); - } + List getExistingNonVanillaCustomItems(); /** * Registers a custom item with a base Java item. This is used to register items with custom textures and properties @@ -73,7 +62,7 @@ public abstract class GeyserDefineCustomItemsEvent implements Event { * @param customItemData the custom item data to register * @return if the item was registered */ - public abstract boolean register(@NonNull String identifier, @NonNull CustomItemData customItemData); + boolean register(@NonNull String identifier, @NonNull CustomItemData customItemData); /** * Registers a custom item with no base item. This is used for mods. @@ -81,5 +70,5 @@ public abstract class GeyserDefineCustomItemsEvent implements Event { * @param customItemData the custom item data to register * @return if the item was registered */ - public abstract boolean register(@NonNull NonVanillaCustomItemData customItemData); + boolean register(@NonNull NonVanillaCustomItemData customItemData); } \ No newline at end of file diff --git a/api/geyser/src/main/java/org/geysermc/geyser/api/event/lifecycle/GeyserLoadResourcePacksEvent.java b/api/geyser/src/main/java/org/geysermc/geyser/api/event/lifecycle/GeyserLoadResourcePacksEvent.java index 0f181aedf..e9b283ecb 100644 --- a/api/geyser/src/main/java/org/geysermc/geyser/api/event/lifecycle/GeyserLoadResourcePacksEvent.java +++ b/api/geyser/src/main/java/org/geysermc/geyser/api/event/lifecycle/GeyserLoadResourcePacksEvent.java @@ -26,7 +26,7 @@ package org.geysermc.geyser.api.event.lifecycle; import org.checkerframework.checker.nullness.qual.NonNull; -import org.geysermc.geyser.api.event.Event; +import org.geysermc.event.Event; import java.nio.file.Path; import java.util.List; diff --git a/api/geyser/src/main/java/org/geysermc/geyser/api/event/lifecycle/GeyserPostInitializeEvent.java b/api/geyser/src/main/java/org/geysermc/geyser/api/event/lifecycle/GeyserPostInitializeEvent.java index 94e42e075..9e88c017b 100644 --- a/api/geyser/src/main/java/org/geysermc/geyser/api/event/lifecycle/GeyserPostInitializeEvent.java +++ b/api/geyser/src/main/java/org/geysermc/geyser/api/event/lifecycle/GeyserPostInitializeEvent.java @@ -26,7 +26,7 @@ package org.geysermc.geyser.api.event.lifecycle; import org.checkerframework.checker.nullness.qual.NonNull; -import org.geysermc.geyser.api.event.Event; +import org.geysermc.event.Event; import org.geysermc.geyser.api.event.EventBus; import org.geysermc.geyser.api.extension.ExtensionManager; diff --git a/api/geyser/src/main/java/org/geysermc/geyser/api/event/lifecycle/GeyserPreInitializeEvent.java b/api/geyser/src/main/java/org/geysermc/geyser/api/event/lifecycle/GeyserPreInitializeEvent.java index fa130c883..2be0272dc 100644 --- a/api/geyser/src/main/java/org/geysermc/geyser/api/event/lifecycle/GeyserPreInitializeEvent.java +++ b/api/geyser/src/main/java/org/geysermc/geyser/api/event/lifecycle/GeyserPreInitializeEvent.java @@ -26,7 +26,7 @@ package org.geysermc.geyser.api.event.lifecycle; import org.checkerframework.checker.nullness.qual.NonNull; -import org.geysermc.geyser.api.event.Event; +import org.geysermc.event.Event; import org.geysermc.geyser.api.event.EventBus; import org.geysermc.geyser.api.extension.ExtensionManager; diff --git a/api/geyser/src/main/java/org/geysermc/geyser/api/event/lifecycle/GeyserShutdownEvent.java b/api/geyser/src/main/java/org/geysermc/geyser/api/event/lifecycle/GeyserShutdownEvent.java index a0fc2294b..f2fab901d 100644 --- a/api/geyser/src/main/java/org/geysermc/geyser/api/event/lifecycle/GeyserShutdownEvent.java +++ b/api/geyser/src/main/java/org/geysermc/geyser/api/event/lifecycle/GeyserShutdownEvent.java @@ -26,8 +26,8 @@ package org.geysermc.geyser.api.event.lifecycle; import org.checkerframework.checker.nullness.qual.NonNull; +import org.geysermc.event.Event; import org.geysermc.geyser.api.command.CommandManager; -import org.geysermc.geyser.api.event.Event; import org.geysermc.geyser.api.event.EventBus; import org.geysermc.geyser.api.extension.ExtensionManager; diff --git a/build-logic/src/main/kotlin/Versions.kt b/build-logic/src/main/kotlin/Versions.kt index d9af831f0..f7b20cca1 100644 --- a/build-logic/src/main/kotlin/Versions.kt +++ b/build-logic/src/main/kotlin/Versions.kt @@ -39,9 +39,9 @@ object Versions { const val mcprotocollibversion = "9f78bd5" const val packetlibVersion = "3.0" const val adventureVersion = "4.9.3" - const val eventVersion = "3.0.0" const val junitVersion = "4.13.1" const val checkerQualVersion = "3.19.0" const val cumulusVersion = "1.1.1" + const val eventsVersion = "1.0-SNAPSHOT" const val log4jVersion = "2.17.1" } \ No newline at end of file diff --git a/core/build.gradle.kts b/core/build.gradle.kts index 602e0e8e3..83591e7ad 100644 --- a/core/build.gradle.kts +++ b/core/build.gradle.kts @@ -67,9 +67,6 @@ dependencies { implementation("net.kyori", "adventure-text-serializer-legacy", Versions.adventureVersion) implementation("net.kyori", "adventure-text-serializer-plain", Versions.adventureVersion) - // Kyori Misc - implementation("net.kyori", "event-api", Versions.eventVersion) - // Test testImplementation("junit", "junit", Versions.junitVersion) diff --git a/core/src/main/java/org/geysermc/geyser/GeyserImpl.java b/core/src/main/java/org/geysermc/geyser/GeyserImpl.java index 94a2b4304..87a40c828 100644 --- a/core/src/main/java/org/geysermc/geyser/GeyserImpl.java +++ b/core/src/main/java/org/geysermc/geyser/GeyserImpl.java @@ -467,18 +467,6 @@ public class GeyserImpl implements GeyserApi { this.eventBus.fire(new GeyserPostInitializeEvent(this.extensionManager, this.eventBus)); } - @Override - public @Nullable GeyserSession connectionByUsername(@NonNull String username) { - for (GeyserSession session : sessionManager.getAllSessions()) { - if (session.bedrockUsername().equals(username) || session.getProtocol().getProfile().getName().equals( - username)) { - return session; - } - } - - return null; - } - @Override public @NonNull List onlineConnections() { return sessionManager.getAllSessions(); diff --git a/core/src/main/java/org/geysermc/geyser/event/AbstractEventSubscription.java b/core/src/main/java/org/geysermc/geyser/event/AbstractEventSubscription.java deleted file mode 100644 index 69dc74935..000000000 --- a/core/src/main/java/org/geysermc/geyser/event/AbstractEventSubscription.java +++ /dev/null @@ -1,68 +0,0 @@ -/* - * Copyright (c) 2019-2022 GeyserMC. http://geysermc.org - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - * THE SOFTWARE. - * - * @author GeyserMC - * @link https://github.com/GeyserMC/Geyser - */ - -package org.geysermc.geyser.event; - -import lombok.AccessLevel; -import lombok.Getter; -import lombok.RequiredArgsConstructor; -import lombok.experimental.Accessors; -import net.kyori.event.EventSubscriber; -import org.geysermc.geyser.api.event.Event; -import org.geysermc.geyser.api.event.EventBus; -import org.geysermc.geyser.api.event.EventSubscription; -import org.geysermc.geyser.api.event.Subscribe; -import org.geysermc.geyser.api.extension.Extension; - -@Getter -@Accessors(fluent = true) -@RequiredArgsConstructor -public abstract class AbstractEventSubscription implements EventSubscription, EventSubscriber { - protected final EventBus eventBus; - protected final Class eventClass; - protected final Extension owner; - protected final Subscribe.PostOrder order; - @Getter(AccessLevel.NONE) private boolean active; - - @Override - public boolean isActive() { - return this.active; - } - - @Override - public void unsubscribe() { - if (!this.active) { - return; - } - - this.active = false; - this.eventBus.unsubscribe(this); - } - - @Override - public int postOrder() { - return this.order.postOrder(); - } -} diff --git a/core/src/main/java/org/geysermc/geyser/event/GeneratedEventSubscription.java b/core/src/main/java/org/geysermc/geyser/event/GeneratedEventSubscription.java deleted file mode 100644 index b1ba7bf8b..000000000 --- a/core/src/main/java/org/geysermc/geyser/event/GeneratedEventSubscription.java +++ /dev/null @@ -1,60 +0,0 @@ -/* - * Copyright (c) 2019-2022 GeyserMC. http://geysermc.org - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - * THE SOFTWARE. - * - * @author GeyserMC - * @link https://github.com/GeyserMC/Geyser - */ - -package org.geysermc.geyser.event; - -import lombok.Getter; -import lombok.experimental.Accessors; -import org.checkerframework.checker.nullness.qual.NonNull; -import org.geysermc.geyser.api.event.Event; -import org.geysermc.geyser.api.event.EventBus; -import org.geysermc.geyser.api.event.Subscribe; -import org.geysermc.geyser.api.extension.Extension; - -import java.util.function.BiConsumer; - -@Getter -@Accessors(fluent = true) -public class GeneratedEventSubscription extends AbstractEventSubscription { - private final Object eventHolder; - private final BiConsumer eventConsumer; - - public GeneratedEventSubscription(EventBus eventBus, Class eventClass, Extension owner, Subscribe.PostOrder order, Object eventHolder, BiConsumer eventConsumer) { - super(eventBus, eventClass, owner, order); - - this.eventHolder = eventHolder; - this.eventConsumer = eventConsumer; - } - - @Override - public void invoke(@NonNull T event) throws Throwable { - try { - this.eventConsumer.accept(this.eventHolder, event); - } catch (Throwable ex) { - this.owner.logger().warning("Unable to fire event " + event.getClass().getSimpleName() + " with subscription " + this.eventConsumer.getClass().getSimpleName()); - ex.printStackTrace(); - } - } -} diff --git a/core/src/main/java/org/geysermc/geyser/event/GeyserEventBus.java b/core/src/main/java/org/geysermc/geyser/event/GeyserEventBus.java index 60e354ac9..7d0d6336d 100644 --- a/core/src/main/java/org/geysermc/geyser/event/GeyserEventBus.java +++ b/core/src/main/java/org/geysermc/geyser/event/GeyserEventBus.java @@ -25,97 +25,40 @@ package org.geysermc.geyser.event; -import net.kyori.event.EventSubscriber; -import net.kyori.event.SimpleEventBus; import org.checkerframework.checker.nullness.qual.NonNull; -import org.geysermc.geyser.api.event.Event; +import org.geysermc.event.Event; +import org.geysermc.event.bus.impl.OwnedEventBusImpl; +import org.geysermc.event.subscribe.OwnedSubscriber; +import org.geysermc.event.subscribe.Subscribe; import org.geysermc.geyser.api.event.EventBus; -import org.geysermc.geyser.api.event.EventSubscription; -import org.geysermc.geyser.api.event.Subscribe; +import org.geysermc.geyser.api.event.EventSubscriber; import org.geysermc.geyser.api.extension.Extension; -import org.lanternpowered.lmbda.LambdaFactory; -import java.lang.invoke.MethodHandles; -import java.lang.reflect.Method; import java.util.Set; import java.util.function.BiConsumer; import java.util.function.Consumer; -import java.util.function.Predicate; -import java.util.stream.Collectors; -public class GeyserEventBus implements EventBus { - private static final MethodHandles.Lookup CALLER = MethodHandles.lookup(); +@SuppressWarnings("unchecked") +public final class GeyserEventBus extends OwnedEventBusImpl> + implements EventBus { + @Override + protected > B makeSubscription( + Extension owner, Class eventClass, Subscribe subscribe, + L listener, BiConsumer handler) { + return (B) new GeyserEventSubscriber<>( + owner, eventClass, subscribe.postOrder(), subscribe.ignoreCancelled(), listener, handler + ); + } - private final SimpleEventBus bus = new SimpleEventBus<>(Event.class); + @Override + protected > B makeSubscription( + Extension owner, Class eventClass, Consumer handler) { + return (B) new GeyserEventSubscriber<>(owner, eventClass, handler); + } + @Override @NonNull - @Override - public EventSubscription subscribe(@NonNull Extension extension, @NonNull Class eventClass, @NonNull Consumer consumer) { - return this.subscribe(eventClass, consumer, extension, Subscribe.PostOrder.NORMAL); - } - - @Override - public void unsubscribe(@NonNull EventSubscription subscription) { - this.bus.unregister((AbstractEventSubscription) subscription); - } - - @SuppressWarnings("unchecked") - @Override - public void register(@NonNull Extension extension, @NonNull Object eventHolder) { - for (Method method : eventHolder.getClass().getMethods()) { - if (!method.isAnnotationPresent(Subscribe.class)) { - continue; - } - - if (method.getParameterCount() > 1) { - continue; - } - - if (!Event.class.isAssignableFrom(method.getParameters()[0].getType())) { - continue; - } - - Subscribe subscribe = method.getAnnotation(Subscribe.class); - - try { - Class type = (Class) method.getParameters()[0].getType(); - this.subscribe(type, eventHolder, LambdaFactory.createBiConsumer(CALLER.unreflect(method)), extension, subscribe.postOrder()); - } catch (IllegalAccessException ex) { - ex.printStackTrace(); - } - } - } - - @Override - public void unregisterAll(@NonNull Extension extension) { - this.bus.unregister((Predicate>) subscriber -> extension.equals(((AbstractEventSubscription) subscriber).owner())); - } - - @Override - public boolean fire(@NonNull Event event) { - return this.bus.post(event).wasSuccessful(); - } - - @SuppressWarnings("unchecked") - @NonNull - @Override - public Set> subscriptions(@NonNull Class eventClass) { - return bus.subscribers().values() - .stream() - .filter(sub -> sub instanceof EventSubscription && ((EventSubscription) sub).eventClass().isAssignableFrom(eventClass)) - .map(sub -> ((EventSubscription) sub)) - .collect(Collectors.toSet()); - } - - private EventSubscription subscribe(Class eventClass, Consumer handler, Extension extension, Subscribe.PostOrder postOrder) { - BaseEventSubscription eventSubscription = new BaseEventSubscription<>(this, eventClass, extension, postOrder, handler); - this.bus.register(eventClass, eventSubscription); - return eventSubscription; - } - - private EventSubscription subscribe(Class eventClass, Object eventHolder, BiConsumer handler, Extension extension, Subscribe.PostOrder postOrder) { - GeneratedEventSubscription eventSubscription = new GeneratedEventSubscription<>(this, eventClass, extension, postOrder, eventHolder, handler); - this.bus.register(eventClass, eventSubscription); - return eventSubscription; + public Set> subscribers(@NonNull Class eventClass) { + return castGenericSet(super.subscribers(eventClass)); } } diff --git a/core/src/main/java/org/geysermc/geyser/event/BaseEventSubscription.java b/core/src/main/java/org/geysermc/geyser/event/GeyserEventSubscriber.java similarity index 55% rename from core/src/main/java/org/geysermc/geyser/event/BaseEventSubscription.java rename to core/src/main/java/org/geysermc/geyser/event/GeyserEventSubscriber.java index 79df94e5d..6fac82b96 100644 --- a/core/src/main/java/org/geysermc/geyser/event/BaseEventSubscription.java +++ b/core/src/main/java/org/geysermc/geyser/event/GeyserEventSubscriber.java @@ -25,34 +25,23 @@ package org.geysermc.geyser.event; -import lombok.Getter; -import lombok.experimental.Accessors; -import org.checkerframework.checker.nullness.qual.NonNull; -import org.geysermc.geyser.api.event.Event; -import org.geysermc.geyser.api.event.EventBus; -import org.geysermc.geyser.api.event.Subscribe; +import org.geysermc.event.Event; +import org.geysermc.event.PostOrder; +import org.geysermc.event.subscribe.impl.OwnedSubscriberImpl; +import org.geysermc.geyser.api.event.ExtensionEventSubscriber; import org.geysermc.geyser.api.extension.Extension; +import java.util.function.BiConsumer; import java.util.function.Consumer; -@Getter -@Accessors(fluent = true) -public class BaseEventSubscription extends AbstractEventSubscription { - private final Consumer eventConsumer; - - public BaseEventSubscription(EventBus eventBus, Class eventClass, Extension owner, Subscribe.PostOrder order, Consumer eventConsumer) { - super(eventBus, eventClass, owner, order); - - this.eventConsumer = eventConsumer; +public final class GeyserEventSubscriber extends OwnedSubscriberImpl + implements ExtensionEventSubscriber { + GeyserEventSubscriber(Extension owner, Class eventClass, Consumer handler) { + super(owner, eventClass, handler); } - @Override - public void invoke(@NonNull T event) throws Throwable { - try { - this.eventConsumer.accept(event); - } catch (Throwable ex) { - this.owner.logger().warning("Unable to fire event " + event.getClass().getSimpleName() + " with subscription " + this.eventConsumer.getClass().getSimpleName()); - ex.printStackTrace(); - } + GeyserEventSubscriber(Extension owner, Class eventClass, PostOrder postOrder, boolean ignoreCancelled, + H handlerInstance, BiConsumer handler) { + super(owner, eventClass, postOrder, ignoreCancelled, handlerInstance, handler); } } diff --git a/core/src/main/java/org/geysermc/geyser/event/type/DefineCustomItemsEvent.java b/core/src/main/java/org/geysermc/geyser/event/type/DefineCustomItemsEvent.java new file mode 100644 index 000000000..9011bfb3a --- /dev/null +++ b/core/src/main/java/org/geysermc/geyser/event/type/DefineCustomItemsEvent.java @@ -0,0 +1,85 @@ +/* + * Copyright (c) 2019-2022 GeyserMC. http://geysermc.org + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + * THE SOFTWARE. + * + * @author GeyserMC + * @link https://github.com/GeyserMC/Geyser + */ + +package org.geysermc.geyser.event.type; + +import com.google.common.collect.Multimap; +import org.checkerframework.checker.nullness.qual.NonNull; +import org.geysermc.geyser.api.event.lifecycle.GeyserDefineCustomItemsEvent; +import org.geysermc.geyser.api.item.custom.CustomItemData; +import org.geysermc.geyser.api.item.custom.NonVanillaCustomItemData; + +import java.util.Collection; +import java.util.Collections; +import java.util.List; +import java.util.Map; + +public abstract class DefineCustomItemsEvent implements GeyserDefineCustomItemsEvent { + private final Multimap customItems; + private final List nonVanillaCustomItems; + + public DefineCustomItemsEvent(Multimap customItems, List nonVanillaCustomItems) { + this.customItems = customItems; + this.nonVanillaCustomItems = nonVanillaCustomItems; + } + + /** + * Gets a multimap of all the already registered custom items indexed by the item's extended java item's identifier. + * + * @return a multimap of all the already registered custom items + */ + @Override + public Map> getExistingCustomItems() { + return Collections.unmodifiableMap(this.customItems.asMap()); + } + + /** + * Gets the list of the already registered non-vanilla custom items. + * + * @return the list of the already registered non-vanilla custom items + */ + @Override + public List getExistingNonVanillaCustomItems() { + return Collections.unmodifiableList(this.nonVanillaCustomItems); + } + + /** + * Registers a custom item with a base Java item. This is used to register items with custom textures and properties + * based on NBT data. + * + * @param identifier the base (java) item + * @param customItemData the custom item data to register + * @return if the item was registered + */ + public abstract boolean register(@NonNull String identifier, @NonNull CustomItemData customItemData); + + /** + * Registers a custom item with no base item. This is used for mods. + * + * @param customItemData the custom item data to register + * @return if the item was registered + */ + public abstract boolean register(@NonNull NonVanillaCustomItemData customItemData); +} diff --git a/core/src/main/java/org/geysermc/geyser/extension/event/GeyserExtensionEventBus.java b/core/src/main/java/org/geysermc/geyser/extension/event/GeyserExtensionEventBus.java index 4104871fa..d1a647be7 100644 --- a/core/src/main/java/org/geysermc/geyser/extension/event/GeyserExtensionEventBus.java +++ b/core/src/main/java/org/geysermc/geyser/extension/event/GeyserExtensionEventBus.java @@ -26,62 +26,50 @@ package org.geysermc.geyser.extension.event; import org.checkerframework.checker.nullness.qual.NonNull; -import org.geysermc.geyser.api.event.Event; +import org.geysermc.event.Event; +import org.geysermc.event.bus.impl.EventBusImpl; +import org.geysermc.event.subscribe.Subscribe; +import org.geysermc.event.subscribe.Subscriber; import org.geysermc.geyser.api.event.EventBus; -import org.geysermc.geyser.api.event.EventSubscription; +import org.geysermc.geyser.api.event.EventSubscriber; import org.geysermc.geyser.api.event.ExtensionEventBus; +import org.geysermc.geyser.api.event.ExtensionEventSubscriber; import org.geysermc.geyser.api.extension.Extension; import java.util.Set; +import java.util.function.BiConsumer; import java.util.function.Consumer; -public record GeyserExtensionEventBus(EventBus eventBus, - Extension extension) implements ExtensionEventBus { - @NonNull +public record GeyserExtensionEventBus(EventBus eventBus, Extension extension) implements ExtensionEventBus { @Override - public EventSubscription subscribe(@NonNull Class eventClass, @NonNull Consumer consumer) { - return this.eventBus.subscribe(this.extension, eventClass, consumer); - } - - @Override - public void register(@NonNull Object eventHolder) { - this.eventBus.register(this.extension, eventHolder); - } - - @Override - public void unregisterAll() { - this.eventBus.unregisterAll(this.extension); - } - - @NonNull - @Override - public EventSubscription subscribe(@NonNull Extension extension, @NonNull Class eventClass, @NonNull Consumer consumer) { - return this.eventBus.subscribe(extension, eventClass, consumer); - } - - @Override - public void unsubscribe(@NonNull EventSubscription subscription) { - this.eventBus.unsubscribe(subscription); - } - - @Override - public void register(@NonNull Extension extension, @NonNull Object eventHolder) { - this.eventBus.register(extension, eventHolder); - } - - @Override - public void unregisterAll(@NonNull Extension extension) { - this.eventBus.unregisterAll(extension); + public void unsubscribe(@NonNull EventSubscriber subscription) { + eventBus.unsubscribe(subscription); } @Override public boolean fire(@NonNull Event event) { - return this.eventBus.fire(event); + return eventBus.fire(event); } - @NonNull @Override - public Set> subscriptions(@NonNull Class eventClass) { - return this.eventBus.subscriptions(eventClass); + public @NonNull Set> subscribers(@NonNull Class eventClass) { + return eventBus.subscribers(eventClass); + } + + @Override + public void register(@NonNull Object listener) { + eventBus.register(extension, listener); + } + + @Override + @SuppressWarnings("unchecked") + public > @NonNull U subscribe( + @NonNull Class eventClass, @NonNull Consumer consumer) { + return eventBus.subscribe(extension, eventClass, consumer); + } + + @Override + public void unregisterAll() { + eventBus.unregisterAll(extension); } } diff --git a/core/src/main/java/org/geysermc/geyser/registry/populator/ItemRegistryPopulator.java b/core/src/main/java/org/geysermc/geyser/registry/populator/ItemRegistryPopulator.java index 72ec4af1e..e6d1cb3e4 100644 --- a/core/src/main/java/org/geysermc/geyser/registry/populator/ItemRegistryPopulator.java +++ b/core/src/main/java/org/geysermc/geyser/registry/populator/ItemRegistryPopulator.java @@ -52,6 +52,7 @@ import org.geysermc.geyser.api.event.lifecycle.GeyserDefineCustomItemsEvent; import org.geysermc.geyser.api.item.custom.CustomItemData; import org.geysermc.geyser.api.item.custom.CustomItemOptions; import org.geysermc.geyser.api.item.custom.NonVanillaCustomItemData; +import org.geysermc.geyser.event.type.DefineCustomItemsEvent; import org.geysermc.geyser.inventory.item.StoredItemMappings; import org.geysermc.geyser.item.GeyserCustomMappingData; import org.geysermc.geyser.item.mappings.MappingsConfigReader; @@ -108,7 +109,7 @@ public class ItemRegistryPopulator { }); nonVanillaCustomItems = new ObjectArrayList<>(); - GeyserImpl.getInstance().eventBus().fire(new GeyserDefineCustomItemsEvent(customItems, nonVanillaCustomItems) { + GeyserImpl.getInstance().eventBus().fire(new DefineCustomItemsEvent(customItems, nonVanillaCustomItems) { @Override public boolean register(@NonNull String identifier, @NonNull CustomItemData customItemData) { if (CustomItemRegistryPopulator.initialCheck(identifier, customItemData, items)) {