From 4cb12170831bfeeac43458c330e2ab2322ac3570 Mon Sep 17 00:00:00 2001 From: bundabrg Date: Mon, 6 Jul 2020 17:51:55 +0800 Subject: [PATCH] Add Events to allow overriding core functionality --- .../geysermc/connector/GeyserConnector.java | 7 ++- .../connector/event/EventManager.java | 8 +++- .../events/BedrockCodecRegistryEvent.java | 39 ++++++++++++++++ .../events/BlockEntityRegistryEvent.java | 45 +++++++++++++++++++ .../event/events/CancellableGeyserEvent.java | 11 +++-- .../events/DownstreamPacketReceiveEvent.java | 11 ++--- .../events/DownstreamPacketSendEvent.java | 11 ++--- .../connector/event/events/GeyserEvent.java | 3 ++ .../events/ItemRemapperRegistryEvent.java | 45 +++++++++++++++++++ .../events/PacketTranslatorRegistryEvent.java | 43 ++++++++++++++++++ .../event/events/PluginDisableEvent.java | 10 ++--- .../event/events/PluginEnableEvent.java | 10 ++--- .../event/events/PluginMessageEvent.java | 14 +++--- .../event/events/ResourceReadEvent.java | 41 +++++++++++++++++ .../events/SoundHandlerRegistryEvent.java | 45 +++++++++++++++++++ .../events/UpstreamPacketReceiveEvent.java | 13 +++--- .../event/events/UpstreamPacketSendEvent.java | 14 +++--- .../translators/PacketTranslatorRegistry.java | 8 +++- .../translators/item/ItemTranslator.java | 10 +++-- .../sound/SoundHandlerRegistry.java | 9 +++- .../world/block/BlockTranslator.java | 11 +++-- .../geysermc/connector/utils/FileUtils.java | 9 +++- 22 files changed, 353 insertions(+), 64 deletions(-) create mode 100644 connector/src/main/java/org/geysermc/connector/event/events/BedrockCodecRegistryEvent.java create mode 100644 connector/src/main/java/org/geysermc/connector/event/events/BlockEntityRegistryEvent.java create mode 100644 connector/src/main/java/org/geysermc/connector/event/events/ItemRemapperRegistryEvent.java create mode 100644 connector/src/main/java/org/geysermc/connector/event/events/PacketTranslatorRegistryEvent.java create mode 100644 connector/src/main/java/org/geysermc/connector/event/events/ResourceReadEvent.java create mode 100644 connector/src/main/java/org/geysermc/connector/event/events/SoundHandlerRegistryEvent.java diff --git a/connector/src/main/java/org/geysermc/connector/GeyserConnector.java b/connector/src/main/java/org/geysermc/connector/GeyserConnector.java index ae5194ba7c3..bf30ba559d2 100644 --- a/connector/src/main/java/org/geysermc/connector/GeyserConnector.java +++ b/connector/src/main/java/org/geysermc/connector/GeyserConnector.java @@ -38,6 +38,7 @@ import org.geysermc.connector.command.CommandManager; import org.geysermc.connector.event.EventManager; import org.geysermc.connector.configuration.GeyserConfiguration; +import org.geysermc.connector.event.events.BedrockCodecRegistryEvent; import org.geysermc.connector.metrics.Metrics; import org.geysermc.connector.network.ConnectorServerEventHandler; import org.geysermc.connector.network.remote.RemoteServer; @@ -77,7 +78,7 @@ public class GeyserConnector { public static final ObjectMapper JSON_MAPPER = new ObjectMapper().disable(DeserializationFeature.FAIL_ON_IGNORED_PROPERTIES); - public static final BedrockPacketCodec BEDROCK_PACKET_CODEC = Bedrock_v407.V407_CODEC; + public static BedrockPacketCodec BEDROCK_PACKET_CODEC; public static final String NAME = "Geyser"; public static final String VERSION = "DEV"; // A fallback for running in IDEs @@ -129,7 +130,9 @@ private GeyserConnector(PlatformType platformType, GeyserBootstrap bootstrap) { this.eventManager = new EventManager(this); this.pluginManager = new PluginManager(this, bootstrap.getConfigFolder().resolve("plugins").toFile()); - System.exit(1); + + // Set Codec + BEDROCK_PACKET_CODEC = eventManager.triggerEvent(new BedrockCodecRegistryEvent(Bedrock_v407.V407_CODEC)).getEvent().getCodec(); PacketTranslatorRegistry.init(); diff --git a/connector/src/main/java/org/geysermc/connector/event/EventManager.java b/connector/src/main/java/org/geysermc/connector/event/EventManager.java index b6921bd78ea..e9d1f9720c5 100644 --- a/connector/src/main/java/org/geysermc/connector/event/EventManager.java +++ b/connector/src/main/java/org/geysermc/connector/event/EventManager.java @@ -45,13 +45,19 @@ @SuppressWarnings("unused") @Getter -@AllArgsConstructor public class EventManager { + @Getter + private static EventManager instance; private final Map, PriorityQueue>> eventHandlers = new HashMap<>(); private final Map>> classEventHandlers = new HashMap<>(); private final GeyserConnector connector; + public EventManager(GeyserConnector connector) { + instance = this; + this.connector = connector; + } + /** * Trigger a new event. * diff --git a/connector/src/main/java/org/geysermc/connector/event/events/BedrockCodecRegistryEvent.java b/connector/src/main/java/org/geysermc/connector/event/events/BedrockCodecRegistryEvent.java new file mode 100644 index 00000000000..ebd3224dcf3 --- /dev/null +++ b/connector/src/main/java/org/geysermc/connector/event/events/BedrockCodecRegistryEvent.java @@ -0,0 +1,39 @@ +/* + * Copyright (c) 2019-2020 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.connector.event.events; + +import com.nukkitx.protocol.bedrock.BedrockPacketCodec; +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.EqualsAndHashCode; + +@EqualsAndHashCode(callSuper = true) +@AllArgsConstructor +@Data +public class BedrockCodecRegistryEvent extends GeyserEvent { + private BedrockPacketCodec codec; +} diff --git a/connector/src/main/java/org/geysermc/connector/event/events/BlockEntityRegistryEvent.java b/connector/src/main/java/org/geysermc/connector/event/events/BlockEntityRegistryEvent.java new file mode 100644 index 00000000000..440779a4cd3 --- /dev/null +++ b/connector/src/main/java/org/geysermc/connector/event/events/BlockEntityRegistryEvent.java @@ -0,0 +1,45 @@ +/* + * Copyright (c) 2019-2020 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.connector.event.events; + +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.Getter; +import lombok.ToString; + +import java.util.Set; + +/** + * Triggered when registering Packet Translators + */ +@EqualsAndHashCode(callSuper = true) +@AllArgsConstructor +@Data +public class BlockEntityRegistryEvent extends GeyserEvent { + private Set> registeredTranslators; +} diff --git a/connector/src/main/java/org/geysermc/connector/event/events/CancellableGeyserEvent.java b/connector/src/main/java/org/geysermc/connector/event/events/CancellableGeyserEvent.java index 582896ff85d..3e334b78fad 100644 --- a/connector/src/main/java/org/geysermc/connector/event/events/CancellableGeyserEvent.java +++ b/connector/src/main/java/org/geysermc/connector/event/events/CancellableGeyserEvent.java @@ -26,13 +26,12 @@ package org.geysermc.connector.event.events; -import lombok.Getter; -import lombok.Setter; -import lombok.ToString; +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.EqualsAndHashCode; -@Getter -@ToString +@EqualsAndHashCode(callSuper = true) +@Data public abstract class CancellableGeyserEvent extends GeyserEvent { - @Setter private boolean cancelled = false; } diff --git a/connector/src/main/java/org/geysermc/connector/event/events/DownstreamPacketReceiveEvent.java b/connector/src/main/java/org/geysermc/connector/event/events/DownstreamPacketReceiveEvent.java index 91bc83f9aa7..97bd9df1fe8 100644 --- a/connector/src/main/java/org/geysermc/connector/event/events/DownstreamPacketReceiveEvent.java +++ b/connector/src/main/java/org/geysermc/connector/event/events/DownstreamPacketReceiveEvent.java @@ -28,6 +28,8 @@ import com.github.steveice10.packetlib.packet.Packet; import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.EqualsAndHashCode; import lombok.Getter; import lombok.ToString; import org.geysermc.connector.network.session.GeyserSession; @@ -38,11 +40,10 @@ * If cancelled then regular processes of the packet will not proceed */ -@Getter -@ToString +@EqualsAndHashCode(callSuper = true) @AllArgsConstructor +@Data public class DownstreamPacketReceiveEvent extends CancellableGeyserEvent { - - private final GeyserSession session; - private final T packet; + private GeyserSession session; + private T packet; } diff --git a/connector/src/main/java/org/geysermc/connector/event/events/DownstreamPacketSendEvent.java b/connector/src/main/java/org/geysermc/connector/event/events/DownstreamPacketSendEvent.java index be5b7622cb8..dbd7fdfdd9f 100644 --- a/connector/src/main/java/org/geysermc/connector/event/events/DownstreamPacketSendEvent.java +++ b/connector/src/main/java/org/geysermc/connector/event/events/DownstreamPacketSendEvent.java @@ -28,6 +28,8 @@ import com.github.steveice10.packetlib.packet.Packet; import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.EqualsAndHashCode; import lombok.Getter; import lombok.ToString; import org.geysermc.connector.network.session.GeyserSession; @@ -38,11 +40,10 @@ * If cancelled then regular processes of the packet will not proceed */ -@Getter -@ToString +@EqualsAndHashCode(callSuper = true) @AllArgsConstructor +@Data public class DownstreamPacketSendEvent extends CancellableGeyserEvent { - - private final GeyserSession session; - private final T packet; + private GeyserSession session; + private T packet; } diff --git a/connector/src/main/java/org/geysermc/connector/event/events/GeyserEvent.java b/connector/src/main/java/org/geysermc/connector/event/events/GeyserEvent.java index db7f2f185b0..f9319158e02 100644 --- a/connector/src/main/java/org/geysermc/connector/event/events/GeyserEvent.java +++ b/connector/src/main/java/org/geysermc/connector/event/events/GeyserEvent.java @@ -26,5 +26,8 @@ package org.geysermc.connector.event.events; +import lombok.Data; + +@Data public abstract class GeyserEvent { } diff --git a/connector/src/main/java/org/geysermc/connector/event/events/ItemRemapperRegistryEvent.java b/connector/src/main/java/org/geysermc/connector/event/events/ItemRemapperRegistryEvent.java new file mode 100644 index 00000000000..45a8adacd45 --- /dev/null +++ b/connector/src/main/java/org/geysermc/connector/event/events/ItemRemapperRegistryEvent.java @@ -0,0 +1,45 @@ +/* + * Copyright (c) 2019-2020 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.connector.event.events; + +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.Getter; +import lombok.ToString; + +import java.util.Set; + +/** + * Triggered when registering Item Remapper Translators + */ +@EqualsAndHashCode(callSuper = true) +@AllArgsConstructor +@Data +public class ItemRemapperRegistryEvent extends GeyserEvent { + private Set> registeredTranslators; +} diff --git a/connector/src/main/java/org/geysermc/connector/event/events/PacketTranslatorRegistryEvent.java b/connector/src/main/java/org/geysermc/connector/event/events/PacketTranslatorRegistryEvent.java new file mode 100644 index 00000000000..e3c47c1dd39 --- /dev/null +++ b/connector/src/main/java/org/geysermc/connector/event/events/PacketTranslatorRegistryEvent.java @@ -0,0 +1,43 @@ +/* + * Copyright (c) 2019-2020 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.connector.event.events; + +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.EqualsAndHashCode; + +import java.util.Set; + +/** + * Triggered when registering Packet Translators + */ +@EqualsAndHashCode(callSuper = true) +@AllArgsConstructor +@Data +public class PacketTranslatorRegistryEvent extends GeyserEvent { + private Set> registeredTranslators; +} diff --git a/connector/src/main/java/org/geysermc/connector/event/events/PluginDisableEvent.java b/connector/src/main/java/org/geysermc/connector/event/events/PluginDisableEvent.java index 2624b7cf3d6..4ad9cb826da 100644 --- a/connector/src/main/java/org/geysermc/connector/event/events/PluginDisableEvent.java +++ b/connector/src/main/java/org/geysermc/connector/event/events/PluginDisableEvent.java @@ -27,13 +27,13 @@ package org.geysermc.connector.event.events; import lombok.AllArgsConstructor; -import lombok.Getter; -import lombok.ToString; +import lombok.Data; +import lombok.EqualsAndHashCode; import org.geysermc.connector.plugin.GeyserPlugin; -@Getter -@ToString +@EqualsAndHashCode(callSuper = true) @AllArgsConstructor +@Data public class PluginDisableEvent extends GeyserEvent { - private final GeyserPlugin plugin; + private GeyserPlugin plugin; } diff --git a/connector/src/main/java/org/geysermc/connector/event/events/PluginEnableEvent.java b/connector/src/main/java/org/geysermc/connector/event/events/PluginEnableEvent.java index e70eb6dfcad..08867217fc1 100644 --- a/connector/src/main/java/org/geysermc/connector/event/events/PluginEnableEvent.java +++ b/connector/src/main/java/org/geysermc/connector/event/events/PluginEnableEvent.java @@ -27,13 +27,13 @@ package org.geysermc.connector.event.events; import lombok.AllArgsConstructor; -import lombok.Getter; -import lombok.ToString; +import lombok.Data; +import lombok.EqualsAndHashCode; import org.geysermc.connector.plugin.GeyserPlugin; -@Getter -@ToString +@EqualsAndHashCode(callSuper = true) @AllArgsConstructor +@Data public class PluginEnableEvent extends CancellableGeyserEvent { - private final GeyserPlugin plugin; + private GeyserPlugin plugin; } diff --git a/connector/src/main/java/org/geysermc/connector/event/events/PluginMessageEvent.java b/connector/src/main/java/org/geysermc/connector/event/events/PluginMessageEvent.java index 928c2b97a67..744459c0413 100644 --- a/connector/src/main/java/org/geysermc/connector/event/events/PluginMessageEvent.java +++ b/connector/src/main/java/org/geysermc/connector/event/events/PluginMessageEvent.java @@ -27,15 +27,15 @@ package org.geysermc.connector.event.events; import lombok.AllArgsConstructor; -import lombok.Getter; -import lombok.ToString; +import lombok.Data; +import lombok.EqualsAndHashCode; import org.geysermc.connector.network.session.GeyserSession; -@Getter -@ToString +@EqualsAndHashCode(callSuper = true) @AllArgsConstructor +@Data public class PluginMessageEvent extends CancellableGeyserEvent { - private final GeyserSession session; - private final String channel; - private final byte[] data; + private GeyserSession session; + private String channel; + private byte[] data; } diff --git a/connector/src/main/java/org/geysermc/connector/event/events/ResourceReadEvent.java b/connector/src/main/java/org/geysermc/connector/event/events/ResourceReadEvent.java new file mode 100644 index 00000000000..9d765d66e1f --- /dev/null +++ b/connector/src/main/java/org/geysermc/connector/event/events/ResourceReadEvent.java @@ -0,0 +1,41 @@ +/* + * Copyright (c) 2019-2020 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.connector.event.events; + +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.EqualsAndHashCode; + +import java.io.InputStream; + +@EqualsAndHashCode(callSuper = true) +@AllArgsConstructor +@Data +public class ResourceReadEvent extends GeyserEvent { + private String resourceName; + private InputStream inputStream; +} diff --git a/connector/src/main/java/org/geysermc/connector/event/events/SoundHandlerRegistryEvent.java b/connector/src/main/java/org/geysermc/connector/event/events/SoundHandlerRegistryEvent.java new file mode 100644 index 00000000000..95d16c92ed7 --- /dev/null +++ b/connector/src/main/java/org/geysermc/connector/event/events/SoundHandlerRegistryEvent.java @@ -0,0 +1,45 @@ +/* + * Copyright (c) 2019-2020 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.connector.event.events; + +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.Getter; +import lombok.ToString; + +import java.util.Set; + +/** + * Triggered when registering Sound Handlers + */ +@EqualsAndHashCode(callSuper = true) +@AllArgsConstructor +@Data +public class SoundHandlerRegistryEvent extends GeyserEvent { + private Set> registeredTranslators; +} diff --git a/connector/src/main/java/org/geysermc/connector/event/events/UpstreamPacketReceiveEvent.java b/connector/src/main/java/org/geysermc/connector/event/events/UpstreamPacketReceiveEvent.java index 54621bebda0..aca180ffb34 100644 --- a/connector/src/main/java/org/geysermc/connector/event/events/UpstreamPacketReceiveEvent.java +++ b/connector/src/main/java/org/geysermc/connector/event/events/UpstreamPacketReceiveEvent.java @@ -28,9 +28,8 @@ import com.nukkitx.protocol.bedrock.BedrockPacket; import lombok.AllArgsConstructor; -import lombok.Getter; -import lombok.Setter; -import lombok.ToString; +import lombok.Data; +import lombok.EqualsAndHashCode; import org.geysermc.connector.network.session.GeyserSession; /** @@ -39,11 +38,11 @@ * If cancelled then regular processes of the packet will not proceed */ -@Getter -@ToString +@EqualsAndHashCode(callSuper = true) @AllArgsConstructor +@Data public class UpstreamPacketReceiveEvent extends CancellableGeyserEvent { - private final GeyserSession session; - private final T packet; + private GeyserSession session; + private T packet; } diff --git a/connector/src/main/java/org/geysermc/connector/event/events/UpstreamPacketSendEvent.java b/connector/src/main/java/org/geysermc/connector/event/events/UpstreamPacketSendEvent.java index 48f48c91c71..1dd37f75bfb 100644 --- a/connector/src/main/java/org/geysermc/connector/event/events/UpstreamPacketSendEvent.java +++ b/connector/src/main/java/org/geysermc/connector/event/events/UpstreamPacketSendEvent.java @@ -28,9 +28,8 @@ import com.nukkitx.protocol.bedrock.BedrockPacket; import lombok.AllArgsConstructor; -import lombok.Getter; -import lombok.Setter; -import lombok.ToString; +import lombok.Data; +import lombok.EqualsAndHashCode; import org.geysermc.connector.network.session.GeyserSession; /** @@ -39,11 +38,10 @@ * If cancelled then regular processes of the packet will not proceed */ -@Getter -@ToString +@EqualsAndHashCode(callSuper = true) @AllArgsConstructor +@Data public class UpstreamPacketSendEvent extends CancellableGeyserEvent { - - private final GeyserSession session; - private final T packet; + private GeyserSession session; + private T packet; } diff --git a/connector/src/main/java/org/geysermc/connector/network/translators/PacketTranslatorRegistry.java b/connector/src/main/java/org/geysermc/connector/network/translators/PacketTranslatorRegistry.java index 92d2e910294..9c85982a636 100644 --- a/connector/src/main/java/org/geysermc/connector/network/translators/PacketTranslatorRegistry.java +++ b/connector/src/main/java/org/geysermc/connector/network/translators/PacketTranslatorRegistry.java @@ -32,6 +32,8 @@ import com.nukkitx.protocol.bedrock.BedrockPacket; import it.unimi.dsi.fastutil.objects.ObjectArrayList; import org.geysermc.connector.GeyserConnector; +import org.geysermc.connector.event.EventManager; +import org.geysermc.connector.event.events.PacketTranslatorRegistryEvent; import org.geysermc.connector.network.session.GeyserSession; import org.geysermc.connector.utils.LanguageUtils; import org.reflections.Reflections; @@ -48,9 +50,11 @@ public class PacketTranslatorRegistry { private static final ObjectArrayList> IGNORED_PACKETS = new ObjectArrayList<>(); static { - Reflections ref = new Reflections("org.geysermc.connector.network.translators"); + PacketTranslatorRegistryEvent event = EventManager.getInstance().triggerEvent(new PacketTranslatorRegistryEvent( + new Reflections("org.geysermc.connector.network.translators").getTypesAnnotatedWith(Translator.class)) + ).getEvent(); - for (Class clazz : ref.getTypesAnnotatedWith(Translator.class)) { + for (Class clazz : event.getRegisteredTranslators()) { Class packet = clazz.getAnnotation(Translator.class).packet(); GeyserConnector.getInstance().getLogger().debug("Found annotated translator: " + clazz.getCanonicalName() + " : " + packet.getSimpleName()); diff --git a/connector/src/main/java/org/geysermc/connector/network/translators/item/ItemTranslator.java b/connector/src/main/java/org/geysermc/connector/network/translators/item/ItemTranslator.java index 7811d9c0ae2..425869df4e0 100644 --- a/connector/src/main/java/org/geysermc/connector/network/translators/item/ItemTranslator.java +++ b/connector/src/main/java/org/geysermc/connector/network/translators/item/ItemTranslator.java @@ -47,6 +47,8 @@ import it.unimi.dsi.fastutil.ints.Int2ObjectMap; import it.unimi.dsi.fastutil.ints.Int2ObjectOpenHashMap; import org.geysermc.connector.GeyserConnector; +import org.geysermc.connector.event.EventManager; +import org.geysermc.connector.event.events.ItemRemapperRegistryEvent; import org.geysermc.connector.network.session.GeyserSession; import org.geysermc.connector.network.translators.ItemRemapper; import org.geysermc.connector.utils.MessageUtils; @@ -70,10 +72,12 @@ public static void init() { static { /* Load item translators */ - Reflections ref = new Reflections("org.geysermc.connector.network.translators.item"); - + ItemRemapperRegistryEvent itemRemapperEvent = EventManager.getInstance().triggerEvent(new ItemRemapperRegistryEvent( + new Reflections("org.geysermc.connector.network.translators.item").getTypesAnnotatedWith(ItemRemapper.class)) + ).getEvent(); + Map loadedNbtItemTranslators = new HashMap<>(); - for (Class clazz : ref.getTypesAnnotatedWith(ItemRemapper.class)) { + for (Class clazz : itemRemapperEvent.getRegisteredTranslators()) { int priority = clazz.getAnnotation(ItemRemapper.class).priority(); GeyserConnector.getInstance().getLogger().debug("Found annotated item translator: " + clazz.getCanonicalName()); diff --git a/connector/src/main/java/org/geysermc/connector/network/translators/sound/SoundHandlerRegistry.java b/connector/src/main/java/org/geysermc/connector/network/translators/sound/SoundHandlerRegistry.java index 260efb41696..b018bdcb0d8 100644 --- a/connector/src/main/java/org/geysermc/connector/network/translators/sound/SoundHandlerRegistry.java +++ b/connector/src/main/java/org/geysermc/connector/network/translators/sound/SoundHandlerRegistry.java @@ -26,6 +26,8 @@ package org.geysermc.connector.network.translators.sound; +import org.geysermc.connector.event.EventManager; +import org.geysermc.connector.event.events.SoundHandlerRegistryEvent; import org.reflections.Reflections; import java.util.HashMap; @@ -39,8 +41,11 @@ public class SoundHandlerRegistry { static final Map> INTERACTION_HANDLERS = new HashMap<>(); static { - Reflections ref = new Reflections("org.geysermc.connector.network.translators.sound"); - for (Class clazz : ref.getTypesAnnotatedWith(SoundHandler.class)) { + SoundHandlerRegistryEvent soundHandlerEvent = EventManager.getInstance().triggerEvent(new SoundHandlerRegistryEvent( + new Reflections("org.geysermc.connector.network.translators.sound").getTypesAnnotatedWith(SoundHandler.class)) + ).getEvent(); + + for (Class clazz : soundHandlerEvent.getRegisteredTranslators()) { try { SoundInteractionHandler interactionHandler = (SoundInteractionHandler) clazz.newInstance(); SoundHandler annotation = clazz.getAnnotation(SoundHandler.class); diff --git a/connector/src/main/java/org/geysermc/connector/network/translators/world/block/BlockTranslator.java b/connector/src/main/java/org/geysermc/connector/network/translators/world/block/BlockTranslator.java index e627b84547e..b1d81e4d436 100644 --- a/connector/src/main/java/org/geysermc/connector/network/translators/world/block/BlockTranslator.java +++ b/connector/src/main/java/org/geysermc/connector/network/translators/world/block/BlockTranslator.java @@ -38,6 +38,8 @@ import it.unimi.dsi.fastutil.objects.Object2IntMap; import it.unimi.dsi.fastutil.objects.Object2IntOpenHashMap; import org.geysermc.connector.GeyserConnector; +import org.geysermc.connector.event.EventManager; +import org.geysermc.connector.event.events.BlockEntityRegistryEvent; import org.geysermc.connector.network.translators.world.block.entity.BlockEntity; import org.geysermc.connector.utils.FileUtils; import org.reflections.Reflections; @@ -105,9 +107,10 @@ public class BlockTranslator { Object2IntMap addedStatesMap = new Object2IntOpenHashMap<>(); addedStatesMap.defaultReturnValue(-1); List paletteList = new ArrayList<>(); - - Reflections ref = new Reflections("org.geysermc.connector.network.translators.world.block.entity"); - ref.getTypesAnnotatedWith(BlockEntity.class); + + BlockEntityRegistryEvent blockEntityEvent = EventManager.getInstance().triggerEvent(new BlockEntityRegistryEvent( + new Reflections("org.geysermc.connector.network.translators.world.block.entity").getTypesAnnotatedWith(BlockEntity.class)) + ).getEvent(); int waterRuntimeId = -1; int javaRuntimeId = -1; @@ -153,7 +156,7 @@ public class BlockTranslator { // Used for adding all "special" Java block states to block state map String identifier; String bedrock_identifer = entry.getValue().get("bedrock_identifier").asText(); - for (Class clazz : ref.getTypesAnnotatedWith(BlockEntity.class)) { + for (Class clazz : blockEntityEvent.getRegisteredTranslators()) { identifier = clazz.getAnnotation(BlockEntity.class).regex(); // Endswith, or else the block bedrock gets picked up for bed if (bedrock_identifer.endsWith(identifier) && !identifier.equals("")) { diff --git a/connector/src/main/java/org/geysermc/connector/utils/FileUtils.java b/connector/src/main/java/org/geysermc/connector/utils/FileUtils.java index 0b7b5c5cf09..85110fd4c44 100644 --- a/connector/src/main/java/org/geysermc/connector/utils/FileUtils.java +++ b/connector/src/main/java/org/geysermc/connector/utils/FileUtils.java @@ -28,6 +28,8 @@ import com.fasterxml.jackson.databind.ObjectMapper; import com.fasterxml.jackson.dataformat.yaml.YAMLFactory; import org.geysermc.connector.GeyserConnector; +import org.geysermc.connector.event.EventManager; +import org.geysermc.connector.event.events.ResourceReadEvent; import java.io.File; import java.io.FileOutputStream; @@ -134,9 +136,12 @@ public static void writeFile(String name, char[] data) throws IOException { */ public static InputStream getResource(String resource) { InputStream stream = FileUtils.class.getClassLoader().getResourceAsStream(resource); - if (stream == null) { + + ResourceReadEvent event = EventManager.getInstance().triggerEvent(new ResourceReadEvent(resource, stream)).getEvent(); + + if (event.getInputStream() == null) { throw new AssertionError(LanguageUtils.getLocaleStringLog("geyser.toolbox.fail.resource", resource)); } - return stream; + return event.getInputStream(); } }