From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 From: MrPowerGamerBR Date: Sun, 22 Oct 2023 09:35:07 -0300 Subject: [PATCH] SparklyPaper config files diff --git a/src/main/java/net/minecraft/server/dedicated/DedicatedServer.java b/src/main/java/net/minecraft/server/dedicated/DedicatedServer.java index 1bfab581e59c607c7a30eeda17c88bb2938536f2..923e6a05f07922764b979ce7c3ebe708f81d9c8e 100644 --- a/src/main/java/net/minecraft/server/dedicated/DedicatedServer.java +++ b/src/main/java/net/minecraft/server/dedicated/DedicatedServer.java @@ -236,6 +236,15 @@ public class DedicatedServer extends MinecraftServer implements ServerInterface thread.start(); // Paper - Enhance console tab completions for brigadier commands; start console thread after MinecraftServer.console & PaperConfig are initialized io.papermc.paper.command.PaperCommands.registerCommands(this); // Paper - setup /paper command com.destroystokyo.paper.Metrics.PaperMetrics.startMetrics(); // Paper - start metrics + // SparklyPaper start + try { + net.sparklypower.sparklypaper.configs.SparklyPaperConfigUtils.INSTANCE.init((java.io.File) options.valueOf("sparklypaper-settings")); + } catch (Exception e) { + DedicatedServer.LOGGER.error("Unable to load server configuration", e); + return false; + } + net.sparklypower.sparklypaper.SparklyPaperCommands.INSTANCE.registerCommands(this); + // SparklyPaper end com.destroystokyo.paper.VersionHistoryManager.INSTANCE.getClass(); // Paper - load version history now this.setPvpAllowed(dedicatedserverproperties.pvp); diff --git a/src/main/java/net/minecraft/world/level/Level.java b/src/main/java/net/minecraft/world/level/Level.java index f1e085c712e4f128c813c3cf5340e6d2e4e55ccc..7fc7419988491dc558c10016a58ebaae485b6cfc 100644 --- a/src/main/java/net/minecraft/world/level/Level.java +++ b/src/main/java/net/minecraft/world/level/Level.java @@ -172,6 +172,7 @@ public abstract class Level implements LevelAccessor, AutoCloseable, ca.spottedl // Paper end - add paper world config public final com.destroystokyo.paper.antixray.ChunkPacketBlockController chunkPacketBlockController; // Paper - Anti-Xray + public net.sparklypower.sparklypaper.configs.SparklyPaperWorldConfig sparklyPaperConfig; // SparklyPaper public final co.aikar.timings.WorldTimingsHandler timings; // Paper public static BlockPos lastPhysicsProblem; // Spigot private org.spigotmc.TickLimiter entityLimiter; @@ -261,6 +262,7 @@ public abstract class Level implements LevelAccessor, AutoCloseable, ca.spottedl protected Level(WritableLevelData worlddatamutable, ResourceKey resourcekey, RegistryAccess iregistrycustom, Holder holder, Supplier supplier, boolean flag, boolean flag1, long i, int j, org.bukkit.generator.ChunkGenerator gen, org.bukkit.generator.BiomeProvider biomeProvider, org.bukkit.World.Environment env, java.util.function.Function paperWorldConfigCreator, java.util.concurrent.Executor executor) { // Paper - create paper world config & Anti-Xray this.spigotConfig = new org.spigotmc.SpigotWorldConfig(((net.minecraft.world.level.storage.PrimaryLevelData) worlddatamutable).getLevelName()); // Spigot this.paperConfig = paperWorldConfigCreator.apply(this.spigotConfig); // Paper - create paper world config + this.sparklyPaperConfig = net.sparklypower.sparklypaper.configs.SparklyPaperConfigUtils.INSTANCE.getWorldSettings(((net.minecraft.world.level.storage.PrimaryLevelData) worlddatamutable).getLevelName()); // SparklyPaper this.generator = gen; this.world = new CraftWorld((ServerLevel) this, gen, biomeProvider, env); diff --git a/src/main/java/net/sparklypower/sparklypaper/commands/SparklyPaperCommand.java b/src/main/java/net/sparklypower/sparklypaper/commands/SparklyPaperCommand.java new file mode 100644 index 0000000000000000000000000000000000000000..bc0ec96f91f7c9ab9f9a865a50f69707fab8fd27 --- /dev/null +++ b/src/main/java/net/sparklypower/sparklypaper/commands/SparklyPaperCommand.java @@ -0,0 +1,65 @@ +package net.sparklypower.sparklypaper.commands; + +import net.minecraft.server.MinecraftServer; +import net.minecraft.server.level.ServerLevel; +import net.sparklypower.sparklypaper.configs.SparklyPaperConfigUtils; +import org.bukkit.ChatColor; +import org.bukkit.Location; +import org.bukkit.command.Command; +import org.bukkit.command.CommandSender; + +import java.io.File; +import java.util.Collections; +import java.util.List; +import java.util.stream.Collectors; +import java.util.stream.Stream; + +public class SparklyPaperCommand extends Command { + public SparklyPaperCommand(String name) { + super(name); + this.description = "SparklyPaper related commands"; + this.usageMessage = "/sparklypaper [reload | version]"; + this.setPermission("bukkit.command.sparklypaper"); + } + + @Override + public List tabComplete(CommandSender sender, String alias, String[] args, Location location) throws IllegalArgumentException { + if (args.length == 1) { + return Stream.of("reload", "version") + .filter(arg -> arg.startsWith(args[0].toLowerCase())) + .collect(Collectors.toList()); + } + return Collections.emptyList(); + } + + @Override + public boolean execute(CommandSender sender, String commandLabel, String[] args) { + if (!testPermission(sender)) return true; + + if (args.length != 1) { + sender.sendMessage(ChatColor.RED + "Usage: " + usageMessage); + return false; + } + + if (args[0].equalsIgnoreCase("reload")) { + Command.broadcastCommandMessage(sender, ChatColor.RED + "Please note that this command is not supported and may cause issues."); + Command.broadcastCommandMessage(sender, ChatColor.RED + "If you encounter any issues please use the /stop command to restart your server."); + + MinecraftServer console = MinecraftServer.getServer(); + SparklyPaperConfigUtils.INSTANCE.init((File) console.options.valueOf("sparklypaper-settings")); + for (ServerLevel level : console.getAllLevels()) { + level.sparklyPaperConfig = SparklyPaperConfigUtils.INSTANCE.getWorldSettings(level.serverLevelData.getLevelName()); + } + console.server.reloadCount++; + + Command.broadcastCommandMessage(sender, ChatColor.GREEN + "SparklyPaper config reload complete."); + } else if (args[0].equalsIgnoreCase("version")) { + Command verCmd = org.bukkit.Bukkit.getServer().getCommandMap().getCommand("version"); + if (verCmd != null) { + return verCmd.execute(sender, commandLabel, new String[0]); + } + } + + return true; + } +} diff --git a/src/main/java/org/bukkit/craftbukkit/CraftServer.java b/src/main/java/org/bukkit/craftbukkit/CraftServer.java index caf6ff33b42472d30f28629470e12889f50490cc..52666b286d4e0099de93fcda83ad17e1b4b46dd6 100644 --- a/src/main/java/org/bukkit/craftbukkit/CraftServer.java +++ b/src/main/java/org/bukkit/craftbukkit/CraftServer.java @@ -111,6 +111,7 @@ import net.minecraft.world.level.storage.PlayerDataStorage; import net.minecraft.world.level.storage.PrimaryLevelData; import net.minecraft.world.level.validation.ContentValidationException; import net.minecraft.world.phys.Vec3; +import net.sparklypower.sparklypaper.configs.SparklyPaperConfigUtils; import org.bukkit.BanList; import org.bukkit.Bukkit; import org.bukkit.ChatColor; @@ -1059,6 +1060,7 @@ public final class CraftServer implements Server { org.spigotmc.SpigotConfig.init((File) this.console.options.valueOf("spigot-settings")); // Spigot this.console.paperConfigurations.reloadConfigs(this.console); + net.sparklypower.sparklypaper.configs.SparklyPaperConfigUtils.INSTANCE.init((File) console.options.valueOf("sparklypaper-settings")); // SparklyPaper for (ServerLevel world : this.console.getAllLevels()) { // world.serverLevelData.setDifficulty(config.difficulty); // Paper - per level difficulty world.setSpawnSettings(world.serverLevelData.getDifficulty() != Difficulty.PEACEFUL && config.spawnMonsters, config.spawnAnimals); // Paper - per level difficulty (from MinecraftServer#setDifficulty(ServerLevel, Difficulty, boolean)) @@ -1074,6 +1076,7 @@ public final class CraftServer implements Server { } } world.spigotConfig.init(); // Spigot + world.sparklyPaperConfig = SparklyPaperConfigUtils.INSTANCE.getWorldSettings(world.serverLevelData.getLevelName()); // SparklyPaper } Plugin[] pluginClone = pluginManager.getPlugins().clone(); // Paper @@ -1090,6 +1093,7 @@ public final class CraftServer implements Server { this.reloadData(); org.spigotmc.SpigotConfig.registerCommands(); // Spigot io.papermc.paper.command.PaperCommands.registerCommands(this.console); // Paper + net.sparklypower.sparklypaper.SparklyPaperCommands.INSTANCE.registerCommands(this.console); // SparklyPaper this.overrideAllCommandBlockCommands = this.commandsConfiguration.getStringList("command-block-overrides").contains("*"); this.ignoreVanillaPermissions = this.commandsConfiguration.getBoolean("ignore-vanilla-permissions"); diff --git a/src/main/java/org/bukkit/craftbukkit/Main.java b/src/main/java/org/bukkit/craftbukkit/Main.java index 6e1f92b45504cef0c4dcbbebf3df339ef4cad0a1..359326d832412de5616a7d38951d397781bc44e6 100644 --- a/src/main/java/org/bukkit/craftbukkit/Main.java +++ b/src/main/java/org/bukkit/craftbukkit/Main.java @@ -176,6 +176,14 @@ public class Main { .describedAs("Jar file"); // Paper end + // SparklyPaper Start + acceptsAll(asList("sparklypaper", "sparklypaper-settings"), "File for SparklyPaper settings") + .withRequiredArg() + .ofType(File.class) + .defaultsTo(new File("sparklypaper.yml")) + .describedAs("Yml file"); + // SparklyPaper end + // Paper start acceptsAll(asList("server-name"), "Name of the server") .withRequiredArg() diff --git a/src/main/kotlin/net/sparklypower/sparklypaper/SparklyPaperCommands.kt b/src/main/kotlin/net/sparklypower/sparklypaper/SparklyPaperCommands.kt new file mode 100644 index 0000000000000000000000000000000000000000..614e64ce6bf5bb7fab5758250927a0d3949d0917 --- /dev/null +++ b/src/main/kotlin/net/sparklypower/sparklypaper/SparklyPaperCommands.kt @@ -0,0 +1,22 @@ +package net.sparklypower.sparklypaper + +import net.minecraft.server.MinecraftServer +import net.sparklypower.sparklypaper.commands.SparklyPaperCommand +import org.bukkit.command.Command +import org.checkerframework.checker.nullness.qual.NonNull +import org.checkerframework.framework.qual.DefaultQualifier + +@DefaultQualifier(NonNull::class) +object SparklyPaperCommands { + private val COMMANDS = mapOf( + "sparklypaper" to SparklyPaperCommand("sparklypaper") + ) + + fun registerCommands(server: MinecraftServer) { + COMMANDS.forEach { (s: String, command: Command) -> + server.server.commandMap.register( + s, "SparklyPaper", command + ) + } + } +} \ No newline at end of file diff --git a/src/main/kotlin/net/sparklypower/sparklypaper/configs/SparklyPaperConfig.kt b/src/main/kotlin/net/sparklypower/sparklypaper/configs/SparklyPaperConfig.kt new file mode 100644 index 0000000000000000000000000000000000000000..6398c7b40ba82ffc8588eca458ce92c24dc8ac41 --- /dev/null +++ b/src/main/kotlin/net/sparklypower/sparklypaper/configs/SparklyPaperConfig.kt @@ -0,0 +1,17 @@ +package net.sparklypower.sparklypaper.configs + +import kotlinx.serialization.SerialName +import kotlinx.serialization.Serializable + +@Serializable +class SparklyPaperConfig( + @SerialName("parallel-world-ticking") + val parallelWorldTicking: ParallelWorldTicking, + @SerialName("world-settings") + val worldSettings: Map +) { + @Serializable + class ParallelWorldTicking( + val threads: Int + ) +} \ No newline at end of file diff --git a/src/main/kotlin/net/sparklypower/sparklypaper/configs/SparklyPaperConfigUtils.kt b/src/main/kotlin/net/sparklypower/sparklypaper/configs/SparklyPaperConfigUtils.kt new file mode 100644 index 0000000000000000000000000000000000000000..8b78f0e8b1de1a6a2506e686be9d71ced72352dd --- /dev/null +++ b/src/main/kotlin/net/sparklypower/sparklypaper/configs/SparklyPaperConfigUtils.kt @@ -0,0 +1,61 @@ +package net.sparklypower.sparklypaper.configs + +import com.charleskorn.kaml.Yaml +import com.charleskorn.kaml.YamlConfiguration +import com.google.common.base.Throwables +import kotlinx.serialization.SerializationException +import kotlinx.serialization.decodeFromString +import kotlinx.serialization.encodeToString +import org.bukkit.Bukkit +import java.io.File +import java.util.logging.Level + +object SparklyPaperConfigUtils { + val yaml = Yaml( + configuration = YamlConfiguration( + strictMode = false + ) + ) + lateinit var config: SparklyPaperConfig + + fun init(configFile: File) { + // Write default config if the file doesn't exist + if (!configFile.exists()) { + configFile.writeText( + yaml.encodeToString( + SparklyPaperConfig( + SparklyPaperConfig.ParallelWorldTicking( + threads = 8 + ), + mapOf( + "default" to SparklyPaperWorldConfig( + skipMapItemDataUpdatesIfMapDoesNotHaveCraftMapRenderer = true, + blazinglySimpleFarmChecks = SparklyPaperWorldConfig.BlazinglySimpleFarmChecks( + enabled = false, + defaultGrowthSpeed = 1.0f, + moistGrowthSpeed = 5.0f, + skipMiddleAgingStagesForCrops = true + ) + ) + ) + ) + ) + ) + } + + val loadedConfig = try { + yaml.decodeFromString(configFile.readText()) + } catch (e: SerializationException) { + Bukkit.getLogger().log(Level.SEVERE, "Could not load sparklypaper.yml, please correct your syntax errors", e) + throw Throwables.propagate(e) + } + // Rewrite the config file to remove old fields and stuff + // TODO: Maybe handle this in another way? This feels kinda bad + configFile.writeText(yaml.encodeToString(loadedConfig)) + config = loadedConfig + } + + fun getWorldSettings(levelName: String): SparklyPaperWorldConfig { + return config.worldSettings[levelName] ?: config.worldSettings["default"] ?: error("Missing default world-settings in sparklypaper.yml!") + } +} \ No newline at end of file diff --git a/src/main/kotlin/net/sparklypower/sparklypaper/configs/SparklyPaperWorldConfig.kt b/src/main/kotlin/net/sparklypower/sparklypaper/configs/SparklyPaperWorldConfig.kt new file mode 100644 index 0000000000000000000000000000000000000000..0909362629aa4f6cdfd4052b4b1dc847cbdb57d8 --- /dev/null +++ b/src/main/kotlin/net/sparklypower/sparklypaper/configs/SparklyPaperWorldConfig.kt @@ -0,0 +1,23 @@ +package net.sparklypower.sparklypaper.configs + +import kotlinx.serialization.SerialName +import kotlinx.serialization.Serializable + +@Serializable +class SparklyPaperWorldConfig( + @SerialName("skip-map-item-data-updates-if-map-does-not-have-craftmaprenderer") + val skipMapItemDataUpdatesIfMapDoesNotHaveCraftMapRenderer: Boolean, + @SerialName("blazingly-simple-farm-checks") + val blazinglySimpleFarmChecks: BlazinglySimpleFarmChecks, +) { + @Serializable + data class BlazinglySimpleFarmChecks( + val enabled: Boolean, + @SerialName("default-growth-speed") + val defaultGrowthSpeed: Float, + @SerialName("moist-growth-speed") + val moistGrowthSpeed: Float, + @SerialName("skip-middle-aging-stages-for-crops") + val skipMiddleAgingStagesForCrops: Boolean + ) +} \ No newline at end of file