diff --git a/bootstrap/bungeecord/build.gradle.kts b/bootstrap/bungeecord/build.gradle.kts index 910e50723..c9ae080d9 100644 --- a/bootstrap/bungeecord/build.gradle.kts +++ b/bootstrap/bungeecord/build.gradle.kts @@ -9,6 +9,7 @@ platformRelocate("com.fasterxml.jackson") platformRelocate("io.netty.channel.kqueue") // This is not used because relocating breaks natives, but we must include it or else we get ClassDefNotFound platformRelocate("net.kyori") platformRelocate("org.yaml") // Broken as of 1.20 +platformRelocate("org.bstats") // These dependencies are already present on the platform provided(libs.bungeecord.proxy) diff --git a/bootstrap/bungeecord/src/main/java/org/geysermc/geyser/platform/bungeecord/GeyserBungeeConfiguration.java b/bootstrap/bungeecord/src/main/java/org/geysermc/geyser/platform/bungeecord/GeyserBungeeConfiguration.java deleted file mode 100644 index bc084a34e..000000000 --- a/bootstrap/bungeecord/src/main/java/org/geysermc/geyser/platform/bungeecord/GeyserBungeeConfiguration.java +++ /dev/null @@ -1,50 +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.platform.bungeecord; - -import com.fasterxml.jackson.annotation.JsonIgnore; -import com.fasterxml.jackson.annotation.JsonIgnoreProperties; -import lombok.Getter; -import net.md_5.bungee.api.plugin.Plugin; -import org.geysermc.geyser.FloodgateKeyLoader; -import org.geysermc.geyser.configuration.GeyserJacksonConfiguration; - -import java.nio.file.Path; - -@Getter -@JsonIgnoreProperties(ignoreUnknown = true) -public final class GeyserBungeeConfiguration extends GeyserJacksonConfiguration { - @JsonIgnore - private Path floodgateKeyPath; - - public void loadFloodgate(GeyserBungeePlugin plugin) { - Plugin floodgate = plugin.getProxy().getPluginManager().getPlugin("floodgate"); - Path geyserDataFolder = plugin.getDataFolder().toPath(); - Path floodgateDataFolder = floodgate != null ? floodgate.getDataFolder().toPath() : null; - - floodgateKeyPath = FloodgateKeyLoader.getKeyPath(this, floodgateDataFolder, geyserDataFolder, plugin.getGeyserLogger()); - } -} diff --git a/bootstrap/bungeecord/src/main/java/org/geysermc/geyser/platform/bungeecord/GeyserBungeeInjector.java b/bootstrap/bungeecord/src/main/java/org/geysermc/geyser/platform/bungeecord/GeyserBungeeInjector.java index fbd3bbd6e..53df33acc 100644 --- a/bootstrap/bungeecord/src/main/java/org/geysermc/geyser/platform/bungeecord/GeyserBungeeInjector.java +++ b/bootstrap/bungeecord/src/main/java/org/geysermc/geyser/platform/bungeecord/GeyserBungeeInjector.java @@ -40,8 +40,8 @@ import net.md_5.bungee.api.plugin.Plugin; import net.md_5.bungee.event.EventHandler; import net.md_5.bungee.netty.PipelineUtils; import org.checkerframework.checker.nullness.qual.NonNull; -import org.geysermc.geyser.GeyserBootstrap; import org.geysermc.geyser.GeyserImpl; +import org.geysermc.geyser.GeyserPluginBootstrap; import org.geysermc.geyser.network.netty.GeyserInjector; import org.geysermc.geyser.network.netty.LocalServerChannelWrapper; import org.geysermc.geyser.network.netty.LocalSession; @@ -67,7 +67,7 @@ public class GeyserBungeeInjector extends GeyserInjector implements Listener { @Override @SuppressWarnings("unchecked") - protected void initializeLocalChannel0(GeyserBootstrap bootstrap) throws Exception { + protected void initializeLocalChannel0(GeyserPluginBootstrap bootstrap) throws Exception { // TODO - allow Geyser to specify its own listener info properties if (proxy.getConfig().getListeners().size() != 1) { throw new UnsupportedOperationException("Geyser does not currently support multiple listeners with injection! " + @@ -142,7 +142,7 @@ public class GeyserBungeeInjector extends GeyserInjector implements Listener { } initChannel.invoke(channelInitializer, ch); - if (bootstrap.config().asPluginConfig().orElseThrow().useDirectConnection()) { + if (bootstrap.config().useDirectConnection()) { ch.pipeline().addAfter(PipelineUtils.PACKET_ENCODER, "geyser-compression-disabler", new GeyserBungeeCompressionDisabler()); } @@ -191,7 +191,7 @@ public class GeyserBungeeInjector extends GeyserInjector implements Listener { this.bungeeChannels = null; if (this.localChannel != null) { shutdown(); - initializeLocalChannel(GeyserImpl.getInstance().getBootstrap()); + initializeLocalChannel((GeyserPluginBootstrap) GeyserImpl.getInstance().getBootstrap()); } } } diff --git a/bootstrap/bungeecord/src/main/java/org/geysermc/geyser/platform/bungeecord/GeyserBungeePlugin.java b/bootstrap/bungeecord/src/main/java/org/geysermc/geyser/platform/bungeecord/GeyserBungeePlugin.java index cd6b59f64..2a356140b 100644 --- a/bootstrap/bungeecord/src/main/java/org/geysermc/geyser/platform/bungeecord/GeyserBungeePlugin.java +++ b/bootstrap/bungeecord/src/main/java/org/geysermc/geyser/platform/bungeecord/GeyserBungeePlugin.java @@ -32,19 +32,20 @@ import net.md_5.bungee.api.plugin.Plugin; import net.md_5.bungee.protocol.ProtocolConstants; import org.checkerframework.checker.nullness.qual.NonNull; import org.checkerframework.checker.nullness.qual.Nullable; -import org.geysermc.geyser.GeyserBootstrap; +import org.geysermc.geyser.FloodgateKeyLoader; import org.geysermc.geyser.GeyserImpl; +import org.geysermc.geyser.GeyserPluginBootstrap; import org.geysermc.geyser.api.command.Command; import org.geysermc.geyser.api.extension.Extension; import org.geysermc.geyser.api.util.PlatformType; import org.geysermc.geyser.command.GeyserCommandManager; -import org.geysermc.geyser.configuration.GeyserConfiguration; +import org.geysermc.geyser.configuration.ConfigLoaderTemp; +import org.geysermc.geyser.configuration.GeyserPluginConfig; import org.geysermc.geyser.dump.BootstrapDumpInfo; import org.geysermc.geyser.ping.GeyserLegacyPingPassthrough; import org.geysermc.geyser.ping.IGeyserPingPassthrough; import org.geysermc.geyser.platform.bungeecord.command.GeyserBungeeCommandExecutor; import org.geysermc.geyser.text.GeyserLocale; -import org.geysermc.geyser.util.FileUtils; import java.io.File; import java.io.IOException; @@ -56,13 +57,12 @@ import java.nio.file.Paths; import java.util.Collection; import java.util.Map; import java.util.Optional; -import java.util.UUID; import java.util.concurrent.TimeUnit; -public class GeyserBungeePlugin extends Plugin implements GeyserBootstrap { +public class GeyserBungeePlugin extends Plugin implements GeyserPluginBootstrap { private GeyserCommandManager geyserCommandManager; - private GeyserBungeeConfiguration geyserConfig; + private GeyserPluginConfig geyserConfig; private GeyserBungeeInjector geyserInjector; private final GeyserBungeeLogger geyserLogger = new GeyserBungeeLogger(getLogger()); private IGeyserPingPassthrough geyserBungeePingPassthrough; @@ -95,8 +95,7 @@ public class GeyserBungeePlugin extends Plugin implements GeyserBootstrap { if (!this.loadConfig()) { return; } - this.geyserLogger.setDebug(geyserConfig.isDebugMode()); - GeyserConfiguration.checkGeyserConfiguration(geyserConfig, geyserLogger); + this.geyserLogger.setDebug(geyserConfig.debugMode()); this.geyser = GeyserImpl.load(PlatformType.BUNGEECORD, this); this.geyserInjector = new GeyserBungeeInjector(this); } @@ -140,8 +139,7 @@ public class GeyserBungeePlugin extends Plugin implements GeyserBootstrap { if (!loadConfig()) { return; } - this.geyserLogger.setDebug(geyserConfig.isDebugMode()); - GeyserConfiguration.checkGeyserConfiguration(geyserConfig, geyserLogger); + this.geyserLogger.setDebug(geyserConfig.debugMode()); } else { // For consistency with other platforms - create command manager before GeyserImpl#start() // This ensures the command events are called before the item/block ones are @@ -151,7 +149,7 @@ public class GeyserBungeePlugin extends Plugin implements GeyserBootstrap { // Force-disable query if enabled, or else Geyser won't enable for (ListenerInfo info : getProxy().getConfig().getListeners()) { - if (info.isQueryEnabled() && info.getQueryPort() == geyserConfig.getBedrock().port()) { + if (info.isQueryEnabled() && info.getQueryPort() == geyserConfig.bedrock().port()) { try { Field queryField = ListenerInfo.class.getDeclaredField("queryEnabled"); queryField.setAccessible(true); @@ -169,7 +167,7 @@ public class GeyserBungeePlugin extends Plugin implements GeyserBootstrap { GeyserImpl.start(); - if (geyserConfig.isLegacyPingPassthrough()) { + if (!geyserConfig.integratedPingPassthrough()) { this.geyserBungeePingPassthrough = GeyserLegacyPingPassthrough.init(geyser); } else { this.geyserBungeePingPassthrough = new GeyserBungeePingPassthrough(getProxy()); @@ -216,8 +214,8 @@ public class GeyserBungeePlugin extends Plugin implements GeyserBootstrap { } @Override - public GeyserBungeeConfiguration getGeyserConfig() { - return geyserConfig; + public GeyserPluginConfig config() { + return this.geyserConfig; } @Override @@ -269,11 +267,16 @@ public class GeyserBungeePlugin extends Plugin implements GeyserBootstrap { @Override public boolean testFloodgatePluginPresent() { - if (getProxy().getPluginManager().getPlugin("floodgate") != null) { - geyserConfig.loadFloodgate(this); - return true; - } - return false; + return getProxy().getPluginManager().getPlugin("floodgate") != null; + } + + @Override + public Path getFloodgateKeyPath() { + Plugin floodgate = getProxy().getPluginManager().getPlugin("floodgate"); + Path geyserDataFolder = getDataFolder().toPath(); + Path floodgateDataFolder = floodgate != null ? floodgate.getDataFolder().toPath() : null; + + return FloodgateKeyLoader.getKeyPath(geyserConfig, floodgateDataFolder, geyserDataFolder, geyserLogger); } private Optional findCompatibleListener() { @@ -286,14 +289,13 @@ public class GeyserBungeePlugin extends Plugin implements GeyserBootstrap { @SuppressWarnings("BooleanMethodIsAlwaysInverted") private boolean loadConfig() { try { - if (!getDataFolder().exists()) //noinspection ResultOfMethodCallIgnored + if (!getDataFolder().exists()) { + //noinspection ResultOfMethodCallIgnored getDataFolder().mkdir(); - File configFile = FileUtils.fileOrCopiedFromResource(new File(getDataFolder(), "config.yml"), - "config.yml", (x) -> x.replaceAll("generateduuid", UUID.randomUUID().toString()), this); - this.geyserConfig = FileUtils.loadConfig(configFile, GeyserBungeeConfiguration.class); + } + this.geyserConfig = ConfigLoaderTemp.load(new File(getDataFolder(), "config.yml"), GeyserPluginConfig.class); } catch (IOException ex) { geyserLogger.error(GeyserLocale.getLocaleStringLog("geyser.config.failed"), ex); - ex.printStackTrace(); return false; } return true; diff --git a/bootstrap/mod/fabric/build.gradle.kts b/bootstrap/mod/fabric/build.gradle.kts index 25bd0af9d..c9e531bb5 100644 --- a/bootstrap/mod/fabric/build.gradle.kts +++ b/bootstrap/mod/fabric/build.gradle.kts @@ -50,6 +50,7 @@ application { relocate("org.cloudburstmc.netty") relocate("org.cloudburstmc.protocol") relocate("com.github.steveice10.mc.auth") +platformRelocate("org.bstats") tasks { remapJar { @@ -67,4 +68,4 @@ modrinth { dependencies { required.project("fabric-api") } -} \ No newline at end of file +} diff --git a/bootstrap/mod/fabric/src/main/java/org/geysermc/geyser/platform/fabric/GeyserFabricPlatform.java b/bootstrap/mod/fabric/src/main/java/org/geysermc/geyser/platform/fabric/GeyserFabricPlatform.java index 4631ab493..345da4459 100644 --- a/bootstrap/mod/fabric/src/main/java/org/geysermc/geyser/platform/fabric/GeyserFabricPlatform.java +++ b/bootstrap/mod/fabric/src/main/java/org/geysermc/geyser/platform/fabric/GeyserFabricPlatform.java @@ -73,7 +73,7 @@ public class GeyserFabricPlatform implements GeyserModPlatform { Optional floodgate = FabricLoader.getInstance().getModContainer("floodgate"); if (floodgate.isPresent()) { Path floodgateDataFolder = FabricLoader.getInstance().getConfigDir().resolve("floodgate"); - bootstrap.getGeyserConfig().loadFloodgate(bootstrap, floodgateDataFolder); + bootstrap.loadFloodgate(floodgateDataFolder); return true; } diff --git a/bootstrap/mod/neoforge/src/main/java/org/geysermc/geyser/platform/neoforge/GeyserNeoForgePlatform.java b/bootstrap/mod/neoforge/src/main/java/org/geysermc/geyser/platform/neoforge/GeyserNeoForgePlatform.java index 41562baf3..c314009fb 100644 --- a/bootstrap/mod/neoforge/src/main/java/org/geysermc/geyser/platform/neoforge/GeyserNeoForgePlatform.java +++ b/bootstrap/mod/neoforge/src/main/java/org/geysermc/geyser/platform/neoforge/GeyserNeoForgePlatform.java @@ -73,7 +73,7 @@ public class GeyserNeoForgePlatform implements GeyserModPlatform { public boolean testFloodgatePluginPresent(@NonNull GeyserModBootstrap bootstrap) { if (ModList.get().isLoaded("floodgate")) { Path floodgateDataFolder = FMLPaths.CONFIGDIR.get().resolve("floodgate"); - bootstrap.getGeyserConfig().loadFloodgate(bootstrap, floodgateDataFolder); + bootstrap.loadFloodgate(floodgateDataFolder); return true; } return false; diff --git a/bootstrap/mod/src/main/java/org/geysermc/geyser/platform/mod/GeyserModBootstrap.java b/bootstrap/mod/src/main/java/org/geysermc/geyser/platform/mod/GeyserModBootstrap.java index d7373f0a9..c8597bc54 100644 --- a/bootstrap/mod/src/main/java/org/geysermc/geyser/platform/mod/GeyserModBootstrap.java +++ b/bootstrap/mod/src/main/java/org/geysermc/geyser/platform/mod/GeyserModBootstrap.java @@ -36,14 +36,16 @@ import net.minecraft.server.MinecraftServer; import net.minecraft.world.entity.player.Player; import org.checkerframework.checker.nullness.qual.NonNull; import org.checkerframework.checker.nullness.qual.Nullable; -import org.geysermc.geyser.GeyserBootstrap; +import org.geysermc.geyser.FloodgateKeyLoader; import org.geysermc.geyser.GeyserImpl; import org.geysermc.geyser.GeyserLogger; +import org.geysermc.geyser.GeyserPluginBootstrap; import org.geysermc.geyser.api.command.Command; import org.geysermc.geyser.api.extension.Extension; import org.geysermc.geyser.command.GeyserCommand; import org.geysermc.geyser.command.GeyserCommandManager; -import org.geysermc.geyser.configuration.GeyserConfiguration; +import org.geysermc.geyser.configuration.ConfigLoaderTemp; +import org.geysermc.geyser.configuration.GeyserPluginConfig; import org.geysermc.geyser.dump.BootstrapDumpInfo; import org.geysermc.geyser.level.WorldManager; import org.geysermc.geyser.ping.GeyserLegacyPingPassthrough; @@ -52,18 +54,15 @@ import org.geysermc.geyser.platform.mod.command.GeyserModCommandExecutor; import org.geysermc.geyser.platform.mod.platform.GeyserModPlatform; import org.geysermc.geyser.platform.mod.world.GeyserModWorldManager; import org.geysermc.geyser.text.GeyserLocale; -import org.geysermc.geyser.util.FileUtils; -import java.io.File; import java.io.IOException; import java.io.InputStream; import java.net.SocketAddress; import java.nio.file.Path; import java.util.Map; -import java.util.UUID; @RequiredArgsConstructor -public abstract class GeyserModBootstrap implements GeyserBootstrap { +public abstract class GeyserModBootstrap implements GeyserPluginBootstrap { @Getter private static GeyserModBootstrap instance; @@ -77,7 +76,7 @@ public abstract class GeyserModBootstrap implements GeyserBootstrap { private MinecraftServer server; private GeyserCommandManager geyserCommandManager; - private GeyserModConfiguration geyserConfig; + private GeyserPluginConfig geyserConfig; private GeyserModInjector geyserInjector; private final GeyserModLogger geyserLogger = new GeyserModLogger(); private IGeyserPingPassthrough geyserPingPassthrough; @@ -91,8 +90,7 @@ public abstract class GeyserModBootstrap implements GeyserBootstrap { if (!loadConfig()) { return; } - this.geyserLogger.setDebug(geyserConfig.isDebugMode()); - GeyserConfiguration.checkGeyserConfiguration(geyserConfig, geyserLogger); + this.geyserLogger.setDebug(geyserConfig.debugMode()); this.geyser = GeyserImpl.load(this.platform.platformType(), this); // Create command manager here, since the permission handler on neo needs it @@ -105,13 +103,12 @@ public abstract class GeyserModBootstrap implements GeyserBootstrap { if (!loadConfig()) { return; } - this.geyserLogger.setDebug(geyserConfig.isDebugMode()); - GeyserConfiguration.checkGeyserConfiguration(geyserConfig, geyserLogger); + this.geyserLogger.setDebug(geyserConfig.debugMode()); } GeyserImpl.start(); - if (geyserConfig.isLegacyPingPassthrough()) { + if (!geyserConfig.integratedPingPassthrough()) { this.geyserPingPassthrough = GeyserLegacyPingPassthrough.init(geyser); } else { this.geyserPingPassthrough = new ModPingPassthrough(server, geyserLogger); @@ -196,7 +193,7 @@ public abstract class GeyserModBootstrap implements GeyserBootstrap { } @Override - public GeyserModConfiguration getGeyserConfig() { + public GeyserPluginConfig config() { return geyserConfig; } @@ -249,12 +246,8 @@ public abstract class GeyserModBootstrap implements GeyserBootstrap { @Override public int getServerPort() { - if (isServer()) { - return ((GeyserServerPortGetter) server).geyser$getServerPort(); - } else { - // Set in the IntegratedServerMixin - return geyserConfig.getRemote().port(); - } + // TODO test + return ((GeyserServerPortGetter) server).geyser$getServerPort(); } public abstract boolean isServer(); @@ -264,6 +257,17 @@ public abstract class GeyserModBootstrap implements GeyserBootstrap { return this.platform.testFloodgatePluginPresent(this); } + private Path floodgateKeyPath; + + public void loadFloodgate(Path floodgateDataFolder) { + floodgateKeyPath = FloodgateKeyLoader.getKeyPath(geyserConfig, floodgateDataFolder, dataFolder, geyserLogger); + } + + @Override + public Path getFloodgateKeyPath() { + return floodgateKeyPath; + } + @Nullable @Override public InputStream getResourceOrNull(String resource) { @@ -282,13 +286,10 @@ public abstract class GeyserModBootstrap implements GeyserBootstrap { dataFolder.toFile().mkdir(); } - File configFile = FileUtils.fileOrCopiedFromResource(dataFolder.resolve("config.yml").toFile(), "config.yml", - (x) -> x.replaceAll("generateduuid", UUID.randomUUID().toString()), this); - this.geyserConfig = FileUtils.loadConfig(configFile, GeyserModConfiguration.class); + this.geyserConfig = ConfigLoaderTemp.load(dataFolder.resolve("config.yml").toFile(), GeyserPluginConfig.class); return true; } catch (IOException ex) { geyserLogger.error(GeyserLocale.getLocaleStringLog("geyser.config.failed"), ex); - ex.printStackTrace(); return false; } } diff --git a/bootstrap/mod/src/main/java/org/geysermc/geyser/platform/mod/GeyserModConfiguration.java b/bootstrap/mod/src/main/java/org/geysermc/geyser/platform/mod/GeyserModConfiguration.java deleted file mode 100644 index a24380bd6..000000000 --- a/bootstrap/mod/src/main/java/org/geysermc/geyser/platform/mod/GeyserModConfiguration.java +++ /dev/null @@ -1,48 +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.platform.mod; - -import com.fasterxml.jackson.annotation.JsonIgnore; -import org.geysermc.geyser.FloodgateKeyLoader; -import org.geysermc.geyser.configuration.GeyserJacksonConfiguration; - -import java.nio.file.Path; - -public class GeyserModConfiguration extends GeyserJacksonConfiguration { - @JsonIgnore - private Path floodgateKeyPath; - - public void loadFloodgate(GeyserModBootstrap geyser, Path floodgateDataFolder) { - Path geyserDataFolder = geyser.getConfigFolder(); - - floodgateKeyPath = FloodgateKeyLoader.getKeyPath(this, floodgateDataFolder, geyserDataFolder, geyser.getGeyserLogger()); - } - - @Override - public Path getFloodgateKeyPath() { - return floodgateKeyPath; - } -} diff --git a/bootstrap/mod/src/main/java/org/geysermc/geyser/platform/mod/GeyserModInjector.java b/bootstrap/mod/src/main/java/org/geysermc/geyser/platform/mod/GeyserModInjector.java index 89a92d789..5346124fb 100644 --- a/bootstrap/mod/src/main/java/org/geysermc/geyser/platform/mod/GeyserModInjector.java +++ b/bootstrap/mod/src/main/java/org/geysermc/geyser/platform/mod/GeyserModInjector.java @@ -38,6 +38,7 @@ import net.minecraft.server.network.ServerConnectionListener; import org.checkerframework.checker.nullness.qual.NonNull; import org.geysermc.geyser.GeyserBootstrap; import org.geysermc.geyser.GeyserImpl; +import org.geysermc.geyser.GeyserPluginBootstrap; import org.geysermc.geyser.network.netty.GeyserInjector; import org.geysermc.geyser.network.netty.LocalServerChannelWrapper; import org.geysermc.geyser.platform.mod.platform.GeyserModPlatform; @@ -63,7 +64,7 @@ public class GeyserModInjector extends GeyserInjector { } @Override - protected void initializeLocalChannel0(GeyserBootstrap bootstrap) throws Exception { + protected void initializeLocalChannel0(GeyserPluginBootstrap bootstrap) throws Exception { ServerConnectionListener connection = this.server.getConnection(); // Find the channel that Minecraft uses to listen to connections @@ -96,7 +97,7 @@ public class GeyserModInjector extends GeyserInjector { int index = ch.pipeline().names().indexOf("encoder"); String baseName = index != -1 ? "encoder" : "outbound_config"; - if (bootstrap.config().asPluginConfig().orElseThrow().disableCompression()) { + if (bootstrap.config().disableCompression()) { ch.pipeline().addAfter(baseName, "geyser-compression-disabler", new GeyserModCompressionDisabler()); } } diff --git a/bootstrap/spigot/build.gradle.kts b/bootstrap/spigot/build.gradle.kts index e4161164e..810bbc5b2 100644 --- a/bootstrap/spigot/build.gradle.kts +++ b/bootstrap/spigot/build.gradle.kts @@ -42,6 +42,7 @@ platformRelocate("org.yaml") // Broken as of 1.20 platformRelocate("org.spongepowered") platformRelocate("io.leangen.geantyref") platformRelocate("marcono1234.gson") +platformRelocate("org.bstats") // These dependencies are already present on the platform provided(libs.viaversion) diff --git a/bootstrap/spigot/src/main/java/org/geysermc/geyser/platform/spigot/GeyserSpigotConfiguration.java b/bootstrap/spigot/src/main/java/org/geysermc/geyser/platform/spigot/GeyserSpigotConfiguration.java deleted file mode 100644 index 3320ffa65..000000000 --- a/bootstrap/spigot/src/main/java/org/geysermc/geyser/platform/spigot/GeyserSpigotConfiguration.java +++ /dev/null @@ -1,51 +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.platform.spigot; - -import com.fasterxml.jackson.annotation.JsonIgnore; -import com.fasterxml.jackson.annotation.JsonIgnoreProperties; -import lombok.Getter; -import org.bukkit.Bukkit; -import org.bukkit.plugin.Plugin; -import org.geysermc.geyser.FloodgateKeyLoader; -import org.geysermc.geyser.configuration.GeyserJacksonConfiguration; - -import java.nio.file.Path; - -@Getter -@JsonIgnoreProperties(ignoreUnknown = true) -public final class GeyserSpigotConfiguration extends GeyserJacksonConfiguration { - @JsonIgnore - private Path floodgateKeyPath; - - public void loadFloodgate(GeyserSpigotPlugin plugin) { - Plugin floodgate = Bukkit.getPluginManager().getPlugin("floodgate"); - Path geyserDataFolder = plugin.getDataFolder().toPath(); - Path floodgateDataFolder = floodgate != null ? floodgate.getDataFolder().toPath() : null; - - floodgateKeyPath = FloodgateKeyLoader.getKeyPath(this, floodgateDataFolder, geyserDataFolder, plugin.getGeyserLogger()); - } -} diff --git a/bootstrap/spigot/src/main/java/org/geysermc/geyser/platform/spigot/GeyserSpigotInjector.java b/bootstrap/spigot/src/main/java/org/geysermc/geyser/platform/spigot/GeyserSpigotInjector.java index d1d4b50ea..bb6295b6a 100644 --- a/bootstrap/spigot/src/main/java/org/geysermc/geyser/platform/spigot/GeyserSpigotInjector.java +++ b/bootstrap/spigot/src/main/java/org/geysermc/geyser/platform/spigot/GeyserSpigotInjector.java @@ -25,6 +25,7 @@ package org.geysermc.geyser.platform.spigot; +import org.geysermc.geyser.GeyserPluginBootstrap; import org.geysermc.mcprotocollib.protocol.MinecraftProtocol; import com.viaversion.viaversion.bukkit.handlers.BukkitChannelInitializer; import io.netty.bootstrap.ServerBootstrap; @@ -60,7 +61,7 @@ public class GeyserSpigotInjector extends GeyserInjector { @Override @SuppressWarnings("unchecked") - protected void initializeLocalChannel0(GeyserBootstrap bootstrap) throws Exception { + protected void initializeLocalChannel0(GeyserPluginBootstrap bootstrap) throws Exception { Class serverClazz; try { serverClazz = Class.forName("net.minecraft.server.MinecraftServer"); @@ -122,7 +123,7 @@ public class GeyserSpigotInjector extends GeyserInjector { int index = ch.pipeline().names().indexOf("encoder"); String baseName = index != -1 ? "encoder" : "outbound_config"; - if (bootstrap.config().asPluginConfig().orElseThrow().disableCompression() && GeyserSpigotCompressionDisabler.ENABLED) { + if (bootstrap.config().disableCompression() && GeyserSpigotCompressionDisabler.ENABLED) { ch.pipeline().addAfter(baseName, "geyser-compression-disabler", new GeyserSpigotCompressionDisabler()); } } diff --git a/bootstrap/spigot/src/main/java/org/geysermc/geyser/platform/spigot/GeyserSpigotPlugin.java b/bootstrap/spigot/src/main/java/org/geysermc/geyser/platform/spigot/GeyserSpigotPlugin.java index 60be30725..1eccca30e 100644 --- a/bootstrap/spigot/src/main/java/org/geysermc/geyser/platform/spigot/GeyserSpigotPlugin.java +++ b/bootstrap/spigot/src/main/java/org/geysermc/geyser/platform/spigot/GeyserSpigotPlugin.java @@ -44,8 +44,9 @@ import org.bukkit.plugin.Plugin; import org.bukkit.plugin.java.JavaPlugin; import org.checkerframework.checker.nullness.qual.NonNull; import org.geysermc.geyser.Constants; -import org.geysermc.geyser.GeyserBootstrap; +import org.geysermc.geyser.FloodgateKeyLoader; import org.geysermc.geyser.GeyserImpl; +import org.geysermc.geyser.GeyserPluginBootstrap; import org.geysermc.geyser.adapters.paper.PaperAdapters; import org.geysermc.geyser.adapters.spigot.SpigotAdapters; import org.geysermc.geyser.api.command.Command; @@ -53,7 +54,6 @@ import org.geysermc.geyser.api.extension.Extension; import org.geysermc.geyser.api.util.PlatformType; import org.geysermc.geyser.command.GeyserCommandManager; import org.geysermc.geyser.configuration.ConfigLoaderTemp; -import org.geysermc.geyser.configuration.GeyserConfiguration; import org.geysermc.geyser.configuration.GeyserPluginConfig; import org.geysermc.geyser.dump.BootstrapDumpInfo; import org.geysermc.geyser.level.WorldManager; @@ -69,7 +69,6 @@ import org.geysermc.geyser.platform.spigot.world.manager.GeyserSpigotLegacyNativ import org.geysermc.geyser.platform.spigot.world.manager.GeyserSpigotNativeWorldManager; import org.geysermc.geyser.platform.spigot.world.manager.GeyserSpigotWorldManager; import org.geysermc.geyser.text.GeyserLocale; -import org.geysermc.geyser.util.FileUtils; import java.io.File; import java.io.IOException; @@ -80,12 +79,11 @@ import java.nio.file.Path; import java.util.List; import java.util.Map; import java.util.Objects; -import java.util.UUID; -public class GeyserSpigotPlugin extends JavaPlugin implements GeyserBootstrap { +public class GeyserSpigotPlugin extends JavaPlugin implements GeyserPluginBootstrap { private GeyserSpigotCommandManager geyserCommandManager; - private GeyserSpigotConfiguration geyserConfig; + private GeyserPluginConfig geyserConfig; private GeyserSpigotInjector geyserInjector; private final GeyserSpigotLogger geyserLogger = GeyserPaperLogger.supported() ? new GeyserPaperLogger(this, getLogger()) : new GeyserSpigotLogger(getLogger()); @@ -156,8 +154,7 @@ public class GeyserSpigotPlugin extends JavaPlugin implements GeyserBootstrap { if (!loadConfig()) { return; } - this.geyserLogger.setDebug(geyserConfig.isDebugMode()); - GeyserConfiguration.checkGeyserConfiguration(geyserConfig, geyserLogger); + this.geyserLogger.setDebug(geyserConfig.debugMode()); // Turn "(MC: 1.16.4)" into 1.16.4. this.minecraftVersion = Bukkit.getServer().getVersion().split("\\(MC: ")[1].split("\\)")[0]; @@ -209,13 +206,12 @@ public class GeyserSpigotPlugin extends JavaPlugin implements GeyserBootstrap { if (!loadConfig()) { return; } - this.geyserLogger.setDebug(this.geyserConfig.isDebugMode()); - GeyserConfiguration.checkGeyserConfiguration(geyserConfig, geyserLogger); + this.geyserLogger.setDebug(this.geyserConfig.debugMode()); } GeyserImpl.start(); - if (geyserConfig.isLegacyPingPassthrough()) { + if (!geyserConfig.integratedPingPassthrough()) { this.geyserSpigotPingPassthrough = GeyserLegacyPingPassthrough.init(geyser); } else { if (ReflectedNames.checkPaperPingEvent()) { @@ -269,7 +265,7 @@ public class GeyserSpigotPlugin extends JavaPlugin implements GeyserBootstrap { } geyserLogger.debug("Using world manager of type: " + this.geyserWorldManager.getClass().getSimpleName()); } catch (Throwable e) { - if (geyserConfig.isDebugMode()) { + if (geyserConfig.debugMode()) { geyserLogger.debug("Error while attempting to find NMS adapter. Most likely, this can be safely ignored. :)"); e.printStackTrace(); } @@ -382,8 +378,8 @@ public class GeyserSpigotPlugin extends JavaPlugin implements GeyserBootstrap { } @Override - public GeyserSpigotConfiguration getGeyserConfig() { - return geyserConfig; + public GeyserPluginConfig config() { + return this.geyserConfig; } @Override @@ -469,11 +465,16 @@ public class GeyserSpigotPlugin extends JavaPlugin implements GeyserBootstrap { @Override public boolean testFloodgatePluginPresent() { - if (Bukkit.getPluginManager().getPlugin("floodgate") != null) { - geyserConfig.loadFloodgate(this); - return true; - } - return false; + return Bukkit.getPluginManager().getPlugin("floodgate") != null; + } + + @Override + public Path getFloodgateKeyPath() { + Plugin floodgate = Bukkit.getPluginManager().getPlugin("floodgate"); + Path geyserDataFolder = getDataFolder().toPath(); + Path floodgateDataFolder = floodgate != null ? floodgate.getDataFolder().toPath() : null; + + return FloodgateKeyLoader.getKeyPath(geyserConfig, floodgateDataFolder, geyserDataFolder, geyserLogger); } @SuppressWarnings("BooleanMethodIsAlwaysInverted") @@ -484,10 +485,7 @@ public class GeyserSpigotPlugin extends JavaPlugin implements GeyserBootstrap { //noinspection ResultOfMethodCallIgnored getDataFolder().mkdir(); } - File configFile = FileUtils.fileOrCopiedFromResource(new File(getDataFolder(), "config.yml"), "config.yml", - (x) -> x.replaceAll("generateduuid", UUID.randomUUID().toString()), this); - this.geyserConfig = FileUtils.loadConfig(configFile, GeyserSpigotConfiguration.class); - ConfigLoaderTemp.load(new File(getDataFolder(), "config.yml"), GeyserPluginConfig.class); + this.geyserConfig = ConfigLoaderTemp.load(new File(getDataFolder(), "config.yml"), GeyserPluginConfig.class); } catch (IOException ex) { geyserLogger.error(GeyserLocale.getLocaleStringLog("geyser.config.failed"), ex); ex.printStackTrace(); diff --git a/bootstrap/standalone/src/main/java/org/geysermc/geyser/platform/standalone/GeyserStandaloneConfiguration.java b/bootstrap/standalone/src/main/java/org/geysermc/geyser/platform/standalone/GeyserStandaloneConfiguration.java deleted file mode 100644 index 1102ed0a9..000000000 --- a/bootstrap/standalone/src/main/java/org/geysermc/geyser/platform/standalone/GeyserStandaloneConfiguration.java +++ /dev/null @@ -1,42 +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.platform.standalone; - -import com.fasterxml.jackson.annotation.JsonIgnoreProperties; -import lombok.Getter; -import org.geysermc.geyser.configuration.GeyserJacksonConfiguration; - -import java.nio.file.Path; -import java.nio.file.Paths; - -@Getter -@JsonIgnoreProperties(ignoreUnknown = true) -public final class GeyserStandaloneConfiguration extends GeyserJacksonConfiguration { - @Override - public Path getFloodgateKeyPath() { - return Paths.get(getFloodgateKeyFile()); - } -} diff --git a/bootstrap/velocity/build.gradle.kts b/bootstrap/velocity/build.gradle.kts index 4daad9784..103e40dac 100644 --- a/bootstrap/velocity/build.gradle.kts +++ b/bootstrap/velocity/build.gradle.kts @@ -9,6 +9,7 @@ platformRelocate("com.fasterxml.jackson") platformRelocate("it.unimi.dsi.fastutil") platformRelocate("net.kyori.adventure.text.serializer.gson.legacyimpl") platformRelocate("org.yaml") +platformRelocate("org.bstats") exclude("com.google.*:*") @@ -74,4 +75,4 @@ tasks.withType { modrinth { uploadFile.set(tasks.getByPath("shadowJar")) loaders.addAll("velocity") -} \ No newline at end of file +} diff --git a/bootstrap/velocity/src/main/java/org/geysermc/geyser/platform/velocity/GeyserVelocityConfiguration.java b/bootstrap/velocity/src/main/java/org/geysermc/geyser/platform/velocity/GeyserVelocityConfiguration.java deleted file mode 100644 index 4c8ea53cc..000000000 --- a/bootstrap/velocity/src/main/java/org/geysermc/geyser/platform/velocity/GeyserVelocityConfiguration.java +++ /dev/null @@ -1,52 +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.platform.velocity; - -import com.fasterxml.jackson.annotation.JsonIgnore; -import com.fasterxml.jackson.annotation.JsonIgnoreProperties; -import com.velocitypowered.api.plugin.PluginContainer; -import com.velocitypowered.api.proxy.ProxyServer; -import lombok.Getter; -import org.geysermc.geyser.FloodgateKeyLoader; -import org.geysermc.geyser.configuration.GeyserJacksonConfiguration; - -import java.io.File; -import java.nio.file.Path; -import java.nio.file.Paths; -import java.util.Optional; - -@Getter -@JsonIgnoreProperties(ignoreUnknown = true) -public final class GeyserVelocityConfiguration extends GeyserJacksonConfiguration { - @JsonIgnore - private Path floodgateKeyPath; - - public void loadFloodgate(GeyserVelocityPlugin plugin, ProxyServer proxyServer, File dataFolder) { - Optional floodgate = proxyServer.getPluginManager().getPlugin("floodgate"); - Path floodgateDataPath = floodgate.isPresent() ? Paths.get("plugins/floodgate/") : null; - floodgateKeyPath = FloodgateKeyLoader.getKeyPath(this, floodgateDataPath, dataFolder.toPath(), plugin.getGeyserLogger()); - } -} diff --git a/bootstrap/velocity/src/main/java/org/geysermc/geyser/platform/velocity/GeyserVelocityPlugin.java b/bootstrap/velocity/src/main/java/org/geysermc/geyser/platform/velocity/GeyserVelocityPlugin.java index 539bdadbf..edda21d28 100644 --- a/bootstrap/velocity/src/main/java/org/geysermc/geyser/platform/velocity/GeyserVelocityPlugin.java +++ b/bootstrap/velocity/src/main/java/org/geysermc/geyser/platform/velocity/GeyserVelocityPlugin.java @@ -34,42 +34,43 @@ import com.velocitypowered.api.event.proxy.ProxyShutdownEvent; import com.velocitypowered.api.network.ListenerType; import com.velocitypowered.api.network.ProtocolVersion; import com.velocitypowered.api.plugin.Plugin; +import com.velocitypowered.api.plugin.PluginContainer; import com.velocitypowered.api.proxy.ProxyServer; import lombok.Getter; import org.checkerframework.checker.nullness.qual.NonNull; import org.checkerframework.checker.nullness.qual.Nullable; -import org.geysermc.geyser.GeyserBootstrap; +import org.geysermc.geyser.FloodgateKeyLoader; import org.geysermc.geyser.GeyserImpl; +import org.geysermc.geyser.GeyserPluginBootstrap; import org.geysermc.geyser.api.command.Command; import org.geysermc.geyser.api.extension.Extension; import org.geysermc.geyser.api.util.PlatformType; import org.geysermc.geyser.command.GeyserCommandManager; -import org.geysermc.geyser.configuration.GeyserConfiguration; +import org.geysermc.geyser.configuration.ConfigLoaderTemp; +import org.geysermc.geyser.configuration.GeyserPluginConfig; import org.geysermc.geyser.dump.BootstrapDumpInfo; import org.geysermc.geyser.network.GameProtocol; import org.geysermc.geyser.ping.GeyserLegacyPingPassthrough; import org.geysermc.geyser.ping.IGeyserPingPassthrough; import org.geysermc.geyser.platform.velocity.command.GeyserVelocityCommandExecutor; import org.geysermc.geyser.text.GeyserLocale; -import org.geysermc.geyser.util.FileUtils; import org.slf4j.Logger; -import java.io.File; import java.io.IOException; import java.net.SocketAddress; import java.nio.file.Path; import java.nio.file.Paths; import java.util.Map; -import java.util.UUID; +import java.util.Optional; @Plugin(id = "geyser", name = GeyserImpl.NAME + "-Velocity", version = GeyserImpl.VERSION, url = "https://geysermc.org", authors = "GeyserMC") -public class GeyserVelocityPlugin implements GeyserBootstrap { +public class GeyserVelocityPlugin implements GeyserPluginBootstrap { private final ProxyServer proxyServer; private final CommandManager commandManager; private final GeyserVelocityLogger geyserLogger; private GeyserCommandManager geyserCommandManager; - private GeyserVelocityConfiguration geyserConfig; + private GeyserPluginConfig geyserConfig; private GeyserVelocityInjector geyserInjector; private IGeyserPingPassthrough geyserPingPassthrough; private GeyserImpl geyser; @@ -101,8 +102,7 @@ public class GeyserVelocityPlugin implements GeyserBootstrap { if (!loadConfig()) { return; } - this.geyserLogger.setDebug(geyserConfig.isDebugMode()); - GeyserConfiguration.checkGeyserConfiguration(geyserConfig, geyserLogger); + this.geyserLogger.setDebug(geyserConfig.debugMode()); this.geyser = GeyserImpl.load(PlatformType.VELOCITY, this); this.geyserInjector = new GeyserVelocityInjector(proxyServer); @@ -114,8 +114,7 @@ public class GeyserVelocityPlugin implements GeyserBootstrap { if (!loadConfig()) { return; } - this.geyserLogger.setDebug(geyserConfig.isDebugMode()); - GeyserConfiguration.checkGeyserConfiguration(geyserConfig, geyserLogger); + this.geyserLogger.setDebug(geyserConfig.debugMode()); } else { this.geyserCommandManager = new GeyserCommandManager(geyser); this.geyserCommandManager.init(); @@ -123,7 +122,7 @@ public class GeyserVelocityPlugin implements GeyserBootstrap { GeyserImpl.start(); - if (geyserConfig.isLegacyPingPassthrough()) { + if (!geyserConfig.integratedPingPassthrough()) { this.geyserPingPassthrough = GeyserLegacyPingPassthrough.init(geyser); } else { this.geyserPingPassthrough = new GeyserVelocityPingPassthrough(proxyServer); @@ -165,7 +164,7 @@ public class GeyserVelocityPlugin implements GeyserBootstrap { } @Override - public GeyserVelocityConfiguration getGeyserConfig() { + public GeyserPluginConfig config() { return geyserConfig; } @@ -232,22 +231,24 @@ public class GeyserVelocityPlugin implements GeyserBootstrap { @Override public boolean testFloodgatePluginPresent() { var floodgate = proxyServer.getPluginManager().getPlugin("floodgate"); - if (floodgate.isPresent()) { - geyserConfig.loadFloodgate(this, proxyServer, configFolder.toFile()); - return true; - } - return false; + return floodgate.isPresent(); + } + + @Override + public Path getFloodgateKeyPath() { + Optional floodgate = proxyServer.getPluginManager().getPlugin("floodgate"); + Path floodgateDataPath = floodgate.isPresent() ? Paths.get("plugins/floodgate/") : null; + return FloodgateKeyLoader.getKeyPath(geyserConfig, floodgateDataPath, configFolder, geyserLogger); } @SuppressWarnings("BooleanMethodIsAlwaysInverted") private boolean loadConfig() { try { - if (!configFolder.toFile().exists()) + if (!configFolder.toFile().exists()) { //noinspection ResultOfMethodCallIgnored configFolder.toFile().mkdirs(); - File configFile = FileUtils.fileOrCopiedFromResource(configFolder.resolve("config.yml").toFile(), - "config.yml", (x) -> x.replaceAll("generateduuid", UUID.randomUUID().toString()), this); - this.geyserConfig = FileUtils.loadConfig(configFile, GeyserVelocityConfiguration.class); + } + this.geyserConfig = ConfigLoaderTemp.load(configFolder.resolve("config.yml").toFile(), GeyserPluginConfig.class); } catch (IOException ex) { geyserLogger.error(GeyserLocale.getLocaleStringLog("geyser.config.failed"), ex); ex.printStackTrace(); diff --git a/bootstrap/viaproxy/build.gradle.kts b/bootstrap/viaproxy/build.gradle.kts index 6eadc790f..358622d63 100644 --- a/bootstrap/viaproxy/build.gradle.kts +++ b/bootstrap/viaproxy/build.gradle.kts @@ -8,6 +8,7 @@ platformRelocate("net.kyori") platformRelocate("org.yaml") platformRelocate("it.unimi.dsi.fastutil") platformRelocate("org.cloudburstmc.netty") +platformRelocate("org.bstats") // These dependencies are already present on the platform provided(libs.viaproxy) diff --git a/bootstrap/viaproxy/src/main/java/org/geysermc/geyser/platform/viaproxy/GeyserViaProxyConfiguration.java b/bootstrap/viaproxy/src/main/java/org/geysermc/geyser/platform/viaproxy/GeyserViaProxyConfiguration.java deleted file mode 100644 index afc46fa6a..000000000 --- a/bootstrap/viaproxy/src/main/java/org/geysermc/geyser/platform/viaproxy/GeyserViaProxyConfiguration.java +++ /dev/null @@ -1,67 +0,0 @@ -/* - * Copyright (c) 2019-2023 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.platform.viaproxy; - -import com.fasterxml.jackson.annotation.JsonIgnoreProperties; -import net.raphimc.vialegacy.api.LegacyProtocolVersion; -import net.raphimc.viaproxy.ViaProxy; -import net.raphimc.viaproxy.protocoltranslator.viaproxy.ViaProxyConfig; -import org.geysermc.geyser.configuration.GeyserJacksonConfiguration; - -import java.io.File; -import java.nio.file.Path; - -@JsonIgnoreProperties(ignoreUnknown = true) -@SuppressWarnings("FieldMayBeFinal") // Jackson requires that the fields are not final -public class GeyserViaProxyConfiguration extends GeyserJacksonConfiguration { - - private RemoteConfiguration remote = new RemoteConfiguration() { - @Override - public boolean isForwardHost() { - return super.isForwardHost() || !ViaProxy.getConfig().getWildcardDomainHandling().equals(ViaProxyConfig.WildcardDomainHandling.NONE); - } - }; - - @Override - public Path getFloodgateKeyPath() { - return new File(GeyserViaProxyPlugin.ROOT_FOLDER, this.getFloodgateKeyFile()).toPath(); - } - - @Override - public int getPingPassthroughInterval() { - int interval = super.getPingPassthroughInterval(); - if (interval < 15 && ViaProxy.getConfig().getTargetVersion() != null && ViaProxy.getConfig().getTargetVersion().olderThanOrEqualTo(LegacyProtocolVersion.r1_6_4)) { - // <= 1.6.4 servers sometimes block incoming connections from an IP address if too many connections are made - interval = 15; - } - return interval; - } - - @Override - public RemoteConfiguration getRemote() { - return this.remote; - } - -} diff --git a/bootstrap/viaproxy/src/main/java/org/geysermc/geyser/platform/viaproxy/GeyserViaProxyPlugin.java b/bootstrap/viaproxy/src/main/java/org/geysermc/geyser/platform/viaproxy/GeyserViaProxyPlugin.java index bdc80335a..04276f64d 100644 --- a/bootstrap/viaproxy/src/main/java/org/geysermc/geyser/platform/viaproxy/GeyserViaProxyPlugin.java +++ b/bootstrap/viaproxy/src/main/java/org/geysermc/geyser/platform/viaproxy/GeyserViaProxyPlugin.java @@ -33,24 +33,26 @@ import net.raphimc.viaproxy.plugins.events.ConsoleCommandEvent; import net.raphimc.viaproxy.plugins.events.ProxyStartEvent; import net.raphimc.viaproxy.plugins.events.ProxyStopEvent; import net.raphimc.viaproxy.plugins.events.ShouldVerifyOnlineModeEvent; +import net.raphimc.viaproxy.protocoltranslator.viaproxy.ViaProxyConfig; import org.apache.logging.log4j.LogManager; -import org.geysermc.geyser.GeyserBootstrap; import org.geysermc.geyser.GeyserImpl; import org.geysermc.geyser.GeyserLogger; +import org.geysermc.geyser.GeyserPluginBootstrap; import org.geysermc.geyser.api.event.EventRegistrar; import org.geysermc.geyser.api.network.AuthType; import org.geysermc.geyser.api.util.PlatformType; import org.geysermc.geyser.command.GeyserCommandManager; -import org.geysermc.geyser.configuration.GeyserConfiguration; +import org.geysermc.geyser.configuration.ConfigLoaderTemp; +import org.geysermc.geyser.configuration.GeyserPluginConfig; import org.geysermc.geyser.dump.BootstrapDumpInfo; import org.geysermc.geyser.ping.GeyserLegacyPingPassthrough; import org.geysermc.geyser.ping.IGeyserPingPassthrough; import org.geysermc.geyser.platform.viaproxy.listener.GeyserServerTransferListener; import org.geysermc.geyser.session.GeyserSession; import org.geysermc.geyser.text.GeyserLocale; -import org.geysermc.geyser.util.FileUtils; import org.geysermc.geyser.util.LoopbackUtil; import org.jetbrains.annotations.NotNull; +import org.spongepowered.configurate.serialize.SerializationException; import java.io.File; import java.io.IOException; @@ -59,12 +61,12 @@ import java.nio.file.Files; import java.nio.file.Path; import java.util.UUID; -public class GeyserViaProxyPlugin extends ViaProxyPlugin implements GeyserBootstrap, EventRegistrar { +public class GeyserViaProxyPlugin extends ViaProxyPlugin implements GeyserPluginBootstrap, EventRegistrar { - public static final File ROOT_FOLDER = new File(PluginManager.PLUGINS_DIR, "Geyser"); + private static final File ROOT_FOLDER = new File(PluginManager.PLUGINS_DIR, "Geyser"); private final GeyserViaProxyLogger logger = new GeyserViaProxyLogger(LogManager.getLogger("Geyser")); - private GeyserViaProxyConfiguration config; + private GeyserPluginConfig config; private GeyserImpl geyser; private GeyserCommandManager commandManager; private IGeyserPingPassthrough pingPassthrough; @@ -156,7 +158,7 @@ public class GeyserViaProxyPlugin extends ViaProxyPlugin implements GeyserBootst } @Override - public GeyserConfiguration getGeyserConfig() { + public GeyserPluginConfig config() { return this.config; } @@ -209,17 +211,35 @@ public class GeyserViaProxyPlugin extends ViaProxyPlugin implements GeyserBootst return false; } + @Override + public Path getFloodgateKeyPath() { + return new File(ROOT_FOLDER, config.floodgateKeyFile()).toPath(); + } + private boolean loadConfig() { try { - final File configFile = FileUtils.fileOrCopiedFromResource(new File(ROOT_FOLDER, "config.yml"), "config.yml", s -> s.replaceAll("generateduuid", UUID.randomUUID().toString()), this); - this.config = FileUtils.loadConfig(configFile, GeyserViaProxyConfiguration.class); + this.config = ConfigLoaderTemp.load(new File(ROOT_FOLDER, "config.yml"), GeyserPluginConfig.class, node -> { + try { + if (!ViaProxy.getConfig().getWildcardDomainHandling().equals(ViaProxyConfig.WildcardDomainHandling.NONE)) { // TODO + node.node("java", "forward-host").set(true); + } + + var pingPassthroughInterval = node.node("ping-passthrough-interval"); + int interval = pingPassthroughInterval.getInt(); + if (interval < 15 && ViaProxy.getConfig().getTargetVersion() != null && ViaProxy.getConfig().getTargetVersion().olderThanOrEqualTo(LegacyProtocolVersion.r1_6_4)) { + // <= 1.6.4 servers sometimes block incoming connections from an IP address if too many connections are made + node.set(15); + } + } catch (SerializationException e) { + throw new RuntimeException(e); + } + }); } catch (IOException e) { this.logger.severe(GeyserLocale.getLocaleStringLog("geyser.config.failed"), e); return false; } - this.config.getRemote().setAuthType(Files.isRegularFile(this.config.getFloodgateKeyPath()) ? AuthType.FLOODGATE : AuthType.OFFLINE); - this.logger.setDebug(this.config.isDebugMode()); - GeyserConfiguration.checkGeyserConfiguration(this.config, this.logger); + this.config.java().authType(Files.isRegularFile(getFloodgateKeyPath()) ? AuthType.FLOODGATE : AuthType.OFFLINE); + this.logger.setDebug(this.config.debugMode()); return true; } diff --git a/core/src/main/java/org/geysermc/geyser/FloodgateKeyLoader.java b/core/src/main/java/org/geysermc/geyser/FloodgateKeyLoader.java index 761e67a67..abaa8e626 100644 --- a/core/src/main/java/org/geysermc/geyser/FloodgateKeyLoader.java +++ b/core/src/main/java/org/geysermc/geyser/FloodgateKeyLoader.java @@ -25,14 +25,14 @@ package org.geysermc.geyser; -import org.geysermc.geyser.configuration.GeyserJacksonConfiguration; +import org.geysermc.geyser.configuration.GeyserConfig; import org.geysermc.geyser.text.GeyserLocale; import java.nio.file.Files; import java.nio.file.Path; public class FloodgateKeyLoader { - public static Path getKeyPath(GeyserJacksonConfiguration config, Path floodgateDataFolder, Path geyserDataFolder, GeyserLogger logger) { + public static Path getKeyPath(GeyserConfig config, Path floodgateDataFolder, Path geyserDataFolder, GeyserLogger logger) { // Always prioritize Floodgate's key, if it is installed. // This mostly prevents people from trying to copy the key and corrupting it in the process if (floodgateDataFolder != null) { @@ -45,13 +45,7 @@ public class FloodgateKeyLoader { } } - Path floodgateKey; - if (config.getFloodgateKeyFile().equals("public-key.pem")) { - logger.debug("Floodgate 2.0 doesn't use a public/private key system anymore. We'll search for key.pem instead"); - floodgateKey = geyserDataFolder.resolve("key.pem"); - } else { - floodgateKey = geyserDataFolder.resolve(config.getFloodgateKeyFile()); - } + Path floodgateKey = geyserDataFolder.resolve(config.floodgateKeyFile()); if (!Files.exists(floodgateKey)) { logger.error(GeyserLocale.getLocaleStringLog("geyser.bootstrap.floodgate.not_installed")); diff --git a/core/src/main/java/org/geysermc/geyser/GeyserBootstrap.java b/core/src/main/java/org/geysermc/geyser/GeyserBootstrap.java index 96a0078bd..270323608 100644 --- a/core/src/main/java/org/geysermc/geyser/GeyserBootstrap.java +++ b/core/src/main/java/org/geysermc/geyser/GeyserBootstrap.java @@ -29,7 +29,6 @@ import org.checkerframework.checker.nullness.qual.NonNull; import org.checkerframework.checker.nullness.qual.Nullable; import org.geysermc.geyser.command.GeyserCommandManager; import org.geysermc.geyser.configuration.GeyserConfig; -import org.geysermc.geyser.configuration.GeyserConfiguration; import org.geysermc.geyser.dump.BootstrapDumpInfo; import org.geysermc.geyser.level.GeyserWorldManager; import org.geysermc.geyser.level.WorldManager; @@ -68,15 +67,6 @@ public interface GeyserBootstrap { */ void onGeyserShutdown(); - /** - * Returns the current GeyserConfiguration - * - * @return The current GeyserConfiguration - */ - default GeyserConfiguration getGeyserConfig() { - throw new UnsupportedOperationException(); - } - /** * Returns the current GeyserConfig * diff --git a/core/src/main/java/org/geysermc/geyser/configuration/GeyserConfiguration.java b/core/src/main/java/org/geysermc/geyser/configuration/GeyserConfiguration.java deleted file mode 100644 index 88bb98171..000000000 --- a/core/src/main/java/org/geysermc/geyser/configuration/GeyserConfiguration.java +++ /dev/null @@ -1,191 +0,0 @@ -/* - * Copyright (c) 2019-2024 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.configuration; - -import com.fasterxml.jackson.annotation.JsonIgnore; -import org.geysermc.geyser.GeyserLogger; -import org.geysermc.geyser.api.network.AuthType; -import org.geysermc.geyser.api.network.BedrockListener; -import org.geysermc.geyser.api.network.RemoteServer; -import org.geysermc.geyser.network.CIDRMatcher; -import org.geysermc.geyser.network.GameProtocol; -import org.geysermc.geyser.text.GeyserLocale; - -import java.nio.file.Path; -import java.util.List; - -public interface GeyserConfiguration { - /** - * If the config was originally 'auto' before the values changed - */ - void setAutoconfiguredRemote(boolean autoconfiguredRemote); - - // Modify this when you introduce breaking changes into the config - int CURRENT_CONFIG_VERSION = 4; - - IBedrockConfiguration getBedrock(); - - IRemoteConfiguration getRemote(); - - List getSavedUserLogins(); - - @SuppressWarnings("BooleanMethodIsAlwaysInverted") - boolean isCommandSuggestions(); - - @JsonIgnore - boolean isPassthroughMotd(); - - @JsonIgnore - boolean isPassthroughPlayerCounts(); - - @JsonIgnore - boolean isLegacyPingPassthrough(); - - int getPingPassthroughInterval(); - - boolean isForwardPlayerPing(); - - int getMaxPlayers(); - - boolean isDebugMode(); - - @Deprecated - boolean isAllowThirdPartyCapes(); - - @Deprecated - boolean isAllowThirdPartyEars(); - - String getShowCooldown(); - - boolean isShowCoordinates(); - - boolean isDisableBedrockScaffolding(); - - EmoteOffhandWorkaroundOption getEmoteOffhandWorkaround(); - - String getDefaultLocale(); - - Path getFloodgateKeyPath(); - - boolean isAddNonBedrockItems(); - - boolean isAboveBedrockNetherBuilding(); - - boolean isForceResourcePacks(); - - @SuppressWarnings("BooleanMethodIsAlwaysInverted") - boolean isXboxAchievementsEnabled(); - - int getCacheImages(); - - boolean isAllowCustomSkulls(); - - int getMaxVisibleCustomSkulls(); - - int getCustomSkullRenderDistance(); - - boolean isLogPlayerIpAddresses(); - - boolean isNotifyOnNewBedrockUpdate(); - - String getUnusableSpaceBlock(); - - IMetricsInfo getMetrics(); - - int getPendingAuthenticationTimeout(); - - boolean isAutoconfiguredRemote(); - - interface IBedrockConfiguration extends BedrockListener { - void setAddress(String address); - - void setPort(int port); - - void setBroadcastPort(int broadcastPort); - - boolean isCloneRemotePort(); - - int getCompressionLevel(); - - boolean isEnableProxyProtocol(); - - List getProxyProtocolWhitelistedIPs(); - - /** - * @return Unmodifiable list of {@link CIDRMatcher}s from {@link #getProxyProtocolWhitelistedIPs()} - */ - List getWhitelistedIPsMatchers(); - } - - interface IRemoteConfiguration extends RemoteServer { - - void setAddress(String address); - - void setPort(int port); - - boolean isUseProxyProtocol(); - - boolean isForwardHost(); - - default String minecraftVersion() { - return GameProtocol.getJavaMinecraftVersion(); - } - - default int protocolVersion() { - return GameProtocol.getJavaProtocolVersion(); - } - - void setAuthType(AuthType authType); - } - - interface IMetricsInfo { - - boolean isEnabled(); - - String getUniqueId(); - } - - int getScoreboardPacketThreshold(); - - // if u have offline mode enabled pls be safe - boolean isEnableProxyConnections(); - - int getMtu(); - - boolean isUseDirectConnection(); - - boolean isDisableCompression(); - - int getConfigVersion(); - - static void checkGeyserConfiguration(GeyserConfiguration geyserConfig, GeyserLogger geyserLogger) { - if (geyserConfig.getConfigVersion() < CURRENT_CONFIG_VERSION) { - geyserLogger.warning(GeyserLocale.getLocaleStringLog("geyser.bootstrap.config.outdated")); - } else if (geyserConfig.getConfigVersion() > CURRENT_CONFIG_VERSION) { - geyserLogger.warning(GeyserLocale.getLocaleStringLog("geyser.bootstrap.config.too_new")); - } - } -} diff --git a/core/src/main/java/org/geysermc/geyser/configuration/GeyserJacksonConfiguration.java b/core/src/main/java/org/geysermc/geyser/configuration/GeyserJacksonConfiguration.java deleted file mode 100644 index 81ac824e4..000000000 --- a/core/src/main/java/org/geysermc/geyser/configuration/GeyserJacksonConfiguration.java +++ /dev/null @@ -1,366 +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.configuration; - -import com.fasterxml.jackson.annotation.JsonIgnore; -import com.fasterxml.jackson.annotation.JsonIgnoreProperties; -import com.fasterxml.jackson.annotation.JsonProperty; -import com.fasterxml.jackson.core.JsonParser; -import com.fasterxml.jackson.databind.DeserializationContext; -import com.fasterxml.jackson.databind.JsonDeserializer; -import com.fasterxml.jackson.databind.annotation.JsonDeserialize; -import lombok.Getter; -import lombok.Setter; -import org.checkerframework.checker.nullness.qual.NonNull; -import org.geysermc.geyser.GeyserImpl; -import org.geysermc.geyser.api.network.AuthType; -import org.geysermc.geyser.network.CIDRMatcher; -import org.geysermc.geyser.text.AsteriskSerializer; -import org.geysermc.geyser.text.GeyserLocale; -import org.geysermc.geyser.util.WebUtils; - -import java.io.IOException; -import java.nio.file.Path; -import java.util.ArrayList; -import java.util.Collections; -import java.util.List; -import java.util.UUID; -import java.util.stream.Collectors; - -@Getter -@JsonIgnoreProperties(ignoreUnknown = true) -@SuppressWarnings("FieldMayBeFinal") // Jackson requires that the fields are not final -public abstract class GeyserJacksonConfiguration implements GeyserConfiguration { - - @Setter - private boolean autoconfiguredRemote = false; - - private BedrockConfiguration bedrock = new BedrockConfiguration(); - private RemoteConfiguration remote = new RemoteConfiguration(); - - @JsonProperty("saved-user-logins") - private List savedUserLogins = Collections.emptyList(); - - @JsonProperty("floodgate-key-file") - private String floodgateKeyFile = "key.pem"; - - public abstract Path getFloodgateKeyPath(); - - @JsonProperty("command-suggestions") - private boolean commandSuggestions = true; - - @JsonProperty("passthrough-motd") - private boolean isPassthroughMotd = false; - - @JsonProperty("passthrough-player-counts") - private boolean isPassthroughPlayerCounts = false; - - @JsonProperty("legacy-ping-passthrough") - private boolean isLegacyPingPassthrough = false; - - @JsonProperty("ping-passthrough-interval") - private int pingPassthroughInterval = 3; - - @JsonProperty("forward-player-ping") - private boolean forwardPlayerPing = false; - - @JsonProperty("max-players") - private int maxPlayers = 100; - - @JsonProperty("debug-mode") - private boolean debugMode = false; - - @JsonProperty("allow-third-party-capes") - private boolean allowThirdPartyCapes = false; - - @JsonProperty("show-cooldown") - private String showCooldown = "title"; - - @JsonProperty("show-coordinates") - private boolean showCoordinates = true; - - @JsonProperty("disable-bedrock-scaffolding") - private boolean disableBedrockScaffolding = false; - - @JsonDeserialize(using = EmoteOffhandWorkaroundOption.Deserializer.class) - @JsonProperty("emote-offhand-workaround") - private EmoteOffhandWorkaroundOption emoteOffhandWorkaround = EmoteOffhandWorkaroundOption.DISABLED; - - @JsonProperty("allow-third-party-ears") - private boolean allowThirdPartyEars = false; - - @JsonProperty("default-locale") - private String defaultLocale = null; // is null by default so system language takes priority - - @JsonProperty("cache-images") - private int cacheImages = 0; - - @JsonProperty("allow-custom-skulls") - private boolean allowCustomSkulls = true; - - @JsonProperty("max-visible-custom-skulls") - private int maxVisibleCustomSkulls = 128; - - @JsonProperty("custom-skull-render-distance") - private int customSkullRenderDistance = 32; - - @JsonProperty("add-non-bedrock-items") - private boolean addNonBedrockItems = true; - - @JsonProperty("above-bedrock-nether-building") - private boolean aboveBedrockNetherBuilding = false; - - @JsonProperty("force-resource-packs") - private boolean forceResourcePacks = true; - - @JsonProperty("xbox-achievements-enabled") - private boolean xboxAchievementsEnabled = false; - - @JsonProperty("log-player-ip-addresses") - private boolean logPlayerIpAddresses = true; - - @JsonProperty("notify-on-new-bedrock-update") - private boolean notifyOnNewBedrockUpdate = true; - - @JsonProperty("unusable-space-block") - private String unusableSpaceBlock = "minecraft:barrier"; - - private MetricsInfo metrics = new MetricsInfo(); - - @JsonProperty("pending-authentication-timeout") - private int pendingAuthenticationTimeout = 120; - - @JsonIgnoreProperties(ignoreUnknown = true) - public static class BedrockConfiguration implements IBedrockConfiguration { - @AsteriskSerializer.Asterisk(isIp = true) - @JsonProperty("address") - @Setter - private String address = "0.0.0.0"; - - @Override - public @NonNull String address() { - return address; - } - - @Setter - @JsonProperty("port") - private int port = 19132; - - @Override - public int port() { - return port; - } - - @Setter - @JsonProperty("broadcast-port") - private int broadcastPort = 0; - - @Override - public int broadcastPort() { - return broadcastPort; - } - - @Getter - @JsonProperty("clone-remote-port") - private boolean cloneRemotePort = false; - - @JsonProperty("motd1") - private String motd1 = "GeyserMC"; - - @Override - public String primaryMotd() { - return motd1; - } - - @JsonProperty("motd2") - private String motd2 = "Geyser"; - - @Override - public String secondaryMotd() { - return motd2; - } - - @JsonProperty("server-name") - private String serverName = GeyserImpl.NAME; - - @Override - public String serverName() { - return serverName; - } - - @JsonProperty("compression-level") - private int compressionLevel = 6; - - public int getCompressionLevel() { - return Math.max(-1, Math.min(compressionLevel, 9)); - } - - @Getter - @JsonProperty("enable-proxy-protocol") - private boolean enableProxyProtocol = false; - - @Getter - @JsonProperty("proxy-protocol-whitelisted-ips") - private List proxyProtocolWhitelistedIPs = Collections.emptyList(); - - @JsonIgnore - private List whitelistedIPsMatchers = null; - - @Override - public List getWhitelistedIPsMatchers() { - // Effective Java, Third Edition; Item 83: Use lazy initialization judiciously - List matchers = this.whitelistedIPsMatchers; - if (matchers == null) { - synchronized (this) { - // Check if proxyProtocolWhitelistedIPs contains URLs we need to fetch and parse by line - List whitelistedCIDRs = new ArrayList<>(); - for (String ip: proxyProtocolWhitelistedIPs) { - if (!ip.startsWith("http")) { - whitelistedCIDRs.add(ip); - continue; - } - - WebUtils.getLineStream(ip).forEach(whitelistedCIDRs::add); - } - - this.whitelistedIPsMatchers = matchers = whitelistedCIDRs.stream() - .map(CIDRMatcher::new) - .collect(Collectors.toList()); - } - } - return Collections.unmodifiableList(matchers); - } - } - - @JsonIgnoreProperties(ignoreUnknown = true) - public static class RemoteConfiguration implements IRemoteConfiguration { - @Setter - @AsteriskSerializer.Asterisk(isIp = true) - @JsonProperty("address") - private String address = "auto"; - - @Override - public String address() { - return address; - } - - @JsonDeserialize(using = PortDeserializer.class) - @Setter - @JsonProperty("port") - private int port = 25565; - - @Override - public int port() { - return port; - } - - @Setter - @JsonDeserialize(using = AuthTypeDeserializer.class) - @JsonProperty("auth-type") - private AuthType authType = AuthType.ONLINE; - - @Override - public @NonNull AuthType authType() { - return authType; - } - - @Override - public boolean resolveSrv() { - return false; - } - - @Getter - @JsonProperty("use-proxy-protocol") - private boolean useProxyProtocol = false; - - @Getter - @JsonProperty("forward-hostname") - private boolean forwardHost = false; - } - - @Getter - @JsonIgnoreProperties(ignoreUnknown = true) - public static class MetricsInfo implements IMetricsInfo { - private boolean enabled = true; - - @JsonDeserialize(using = MetricsIdDeserializer.class) - @JsonProperty("uuid") - private String uniqueId = UUID.randomUUID().toString(); - - private static class MetricsIdDeserializer extends JsonDeserializer { - @Override - public String deserialize(JsonParser p, DeserializationContext ctxt) throws IOException { - String uuid = p.getValueAsString(); - if ("generateduuid".equals(uuid)) { - // Compensate for configs not copied from the jar - return UUID.randomUUID().toString(); - } - return uuid; - } - } - } - - @JsonProperty("scoreboard-packet-threshold") - private int scoreboardPacketThreshold = 10; - - @JsonProperty("enable-proxy-connections") - private boolean enableProxyConnections = false; - - @JsonProperty("mtu") - private int mtu = 1400; - - @JsonProperty("use-direct-connection") - private boolean useDirectConnection = true; - - @JsonProperty("disable-compression") - private boolean isDisableCompression = true; - - @JsonProperty("config-version") - private int configVersion = 0; - - /** - * Ensure that the port deserializes in the config as a number no matter what. - */ - protected static class PortDeserializer extends JsonDeserializer { - @Override - public Integer deserialize(JsonParser p, DeserializationContext ctxt) throws IOException { - String value = p.getValueAsString(); - try { - return Integer.parseInt(value); - } catch (NumberFormatException e) { - System.err.println(GeyserLocale.getLocaleStringLog("geyser.bootstrap.config.invalid_port")); - return 25565; - } - } - } - - public static class AuthTypeDeserializer extends JsonDeserializer { - @Override - public AuthType deserialize(JsonParser p, DeserializationContext ctxt) throws IOException { - return AuthType.getByName(p.getValueAsString()); - } - } -} diff --git a/core/src/main/java/org/geysermc/geyser/configuration/GeyserPluginConfig.java b/core/src/main/java/org/geysermc/geyser/configuration/GeyserPluginConfig.java index c2f9b97a0..2ae6214e0 100644 --- a/core/src/main/java/org/geysermc/geyser/configuration/GeyserPluginConfig.java +++ b/core/src/main/java/org/geysermc/geyser/configuration/GeyserPluginConfig.java @@ -25,15 +25,13 @@ package org.geysermc.geyser.configuration; -import org.geysermc.geyser.GeyserImpl; import org.spongepowered.configurate.interfaces.meta.Exclude; +import org.spongepowered.configurate.interfaces.meta.Field; import org.spongepowered.configurate.interfaces.meta.Hidden; import org.spongepowered.configurate.interfaces.meta.defaults.DefaultBoolean; import org.spongepowered.configurate.objectmapping.ConfigSerializable; import org.spongepowered.configurate.objectmapping.meta.Comment; -import java.io.File; - @ConfigSerializable public interface GeyserPluginConfig extends GeyserConfig { @Override @@ -54,35 +52,18 @@ public interface GeyserPluginConfig extends GeyserConfig { @ConfigSerializable interface IntegratedJavaConfig extends JavaConfig { @Override - @Exclude - default String address() { - return GeyserImpl.getInstance().getBootstrap().getServerBindAddress(); - } + @Field + String address(); @Override - default void address(String address) { - throw new IllegalStateException(); - } + void address(String address); @Override - @Exclude - default int port() { - return GeyserImpl.getInstance().getBootstrap().getServerPort(); - } + @Field + int port(); @Override - default void port(int port) { - throw new IllegalStateException(); - } - -// @Nonnull -// @Comment(""" -// What type of authentication Bedrock players will be checked against when logging into the Java server. -// Floodgate allows Bedrock players to join without needing a Java account. It's not recommended to change this.""") -// @Override -// default AuthType authType() { -// return AuthType.FLOODGATE; -// } + void port(int port); @Override @Exclude diff --git a/core/src/main/java/org/geysermc/geyser/dump/DumpInfo.java b/core/src/main/java/org/geysermc/geyser/dump/DumpInfo.java index a6186026c..d8e03be25 100644 --- a/core/src/main/java/org/geysermc/geyser/dump/DumpInfo.java +++ b/core/src/main/java/org/geysermc/geyser/dump/DumpInfo.java @@ -36,7 +36,6 @@ import it.unimi.dsi.fastutil.objects.Object2IntOpenHashMap; import lombok.Getter; import org.cloudburstmc.protocol.bedrock.codec.BedrockCodec; import org.geysermc.floodgate.util.DeviceOs; -import org.geysermc.floodgate.util.FloodgateInfoHolder; import org.geysermc.geyser.GeyserImpl; import org.geysermc.geyser.api.GeyserApi; import org.geysermc.geyser.api.extension.Extension; @@ -61,7 +60,6 @@ import java.util.HashMap; import java.util.List; import java.util.Locale; import java.util.Map; -import java.util.Properties; import java.util.stream.Collectors; @Getter @@ -75,7 +73,6 @@ public class DumpInfo { private final String systemEncoding; private final GitInfo gitInfo; private final GeyserConfig config; - private final Floodgate floodgate; private final Object2IntMap userPlatforms; private final int connectionAttempts; private final HashInfo hashInfo; @@ -96,7 +93,6 @@ public class DumpInfo { this.gitInfo = new GitInfo(GeyserImpl.BUILD_NUMBER, GeyserImpl.COMMIT.substring(0, 7), GeyserImpl.COMMIT, GeyserImpl.BRANCH, GeyserImpl.REPOSITORY); this.config = GeyserImpl.getInstance().config(); - this.floodgate = new Floodgate(); String md5Hash = "unknown"; String sha256Hash = "unknown"; @@ -233,17 +229,6 @@ public class DumpInfo { } } - @Getter - public static class Floodgate { - private final Properties gitInfo; - private final Object config; - - Floodgate() { - this.gitInfo = FloodgateInfoHolder.getGitProperties(); - this.config = FloodgateInfoHolder.getConfig(); - } - } - @Getter public static class LogsInfo { private String link; diff --git a/core/src/main/java/org/geysermc/geyser/session/GeyserSession.java b/core/src/main/java/org/geysermc/geyser/session/GeyserSession.java index 2d5f2cbdc..e04146e2f 100644 --- a/core/src/main/java/org/geysermc/geyser/session/GeyserSession.java +++ b/core/src/main/java/org/geysermc/geyser/session/GeyserSession.java @@ -115,7 +115,7 @@ import org.geysermc.geyser.api.network.AuthType; import org.geysermc.geyser.api.network.RemoteServer; import org.geysermc.geyser.api.util.PlatformType; import org.geysermc.geyser.command.GeyserCommandSource; -import org.geysermc.geyser.configuration.GeyserConfiguration; +import org.geysermc.geyser.configuration.GeyserConfig; import org.geysermc.geyser.entity.EntityDefinitions; import org.geysermc.geyser.entity.GeyserEntityData; import org.geysermc.geyser.entity.attribute.GeyserAttributeType; @@ -600,7 +600,7 @@ public class GeyserSession implements GeyserConnection, GeyserCommandSource { /** * A cache of IDs from ClientboundKeepAlivePackets that have been sent to the Bedrock client, but haven't been returned to the server. - * Only used if {@link GeyserConfiguration#isForwardPlayerPing()} is enabled. + * Only used if {@link GeyserConfig#forwardPlayerPing()} is enabled. */ private final Queue keepAliveCache = new ConcurrentLinkedQueue<>(); diff --git a/core/src/main/java/org/geysermc/geyser/session/cache/PreferencesCache.java b/core/src/main/java/org/geysermc/geyser/session/cache/PreferencesCache.java index 78a6b75fe..7eee215fa 100644 --- a/core/src/main/java/org/geysermc/geyser/session/cache/PreferencesCache.java +++ b/core/src/main/java/org/geysermc/geyser/session/cache/PreferencesCache.java @@ -27,7 +27,7 @@ package org.geysermc.geyser.session.cache; import lombok.Getter; import lombok.Setter; -import org.geysermc.geyser.configuration.GeyserConfiguration; +import org.geysermc.geyser.configuration.GeyserConfig; import org.geysermc.geyser.session.GeyserSession; import org.geysermc.geyser.util.CooldownUtils; @@ -72,7 +72,7 @@ public class PreferencesCache { * If {@link #prefersShowCoordinates} is true, coordinates will be shown, unless either of the following conditions apply:
*
* {@link GeyserSession#isReducedDebugInfo()} is enabled - * {@link GeyserConfiguration#isShowCoordinates()} is disabled + * {@link GeyserConfig#showCoordinates()} is disabled */ public void updateShowCoordinates() { allowShowCoordinates = !session.isReducedDebugInfo() && session.getGeyser().config().showCoordinates();