forked from hpfxd/PandaSpigot
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy path0015-PandaSpigot-Configuration.patch
226 lines (215 loc) · 11 KB
/
0015-PandaSpigot-Configuration.patch
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
From: hpfxd <[email protected]>
Date: Sat, 30 Oct 2021 03:44:48 -0400
Subject: [PATCH] PandaSpigot Configuration
diff --git a/build.gradle.kts b/build.gradle.kts
index 242341aea3f7515693240a643ca1f39846208a9d..d130985a63c1074de418ce40a7035811a19e3115 100644
--- a/build.gradle.kts
+++ b/build.gradle.kts
@@ -12,6 +12,12 @@ repositories {
dependencies {
implementation(project(":pandaspigot-api"))
+ // PandaSpigot start - Configuration
+ implementation("com.hpfxd.configurate:configurate-eo-yaml:1.0.0") {
+ exclude(group = "org.checkerframework", module = "checker-qual")
+ }
+ // PandaSpigot end
+
// Minecraft libraries:
implementation("io.netty:netty-all:4.1.91.Final") // PandaSpigot - Update Netty to 4.1.x
implementation("com.mojang:authlib:1.5.21")
@@ -53,6 +59,13 @@ tasks {
mergeServiceFiles()
archiveClassifier.set("unmapped")
append("META-INF/io.netty.versions.properties")
+ // PandaSpigot start - Configuration
+ arrayOf(
+ "com.amihaiemil.eoyaml",
+ "org.spongepowered.configurate",
+ "io.leangen.geantyref",
+ ).forEach { relocate(it, "com.hpfxd.pandaspigot.libs.$it") }
+ // PandaSpigot end
val cbLibsPkg = "org.bukkit.craftbukkit.libs"
diff --git a/src/main/java/com/hpfxd/pandaspigot/config/PandaSpigotConfig.java b/src/main/java/com/hpfxd/pandaspigot/config/PandaSpigotConfig.java
new file mode 100644
index 0000000000000000000000000000000000000000..f021fd0c7622a788b809ecbf896162912ab4b0d0
--- /dev/null
+++ b/src/main/java/com/hpfxd/pandaspigot/config/PandaSpigotConfig.java
@@ -0,0 +1,96 @@
+package com.hpfxd.pandaspigot.config;
+
+import com.google.common.base.Throwables;
+import com.hpfxd.configurate.eoyaml.EOYamlConfigurationLoader;
+import net.minecraft.server.World;
+import org.spongepowered.configurate.CommentedConfigurationNode;
+import org.spongepowered.configurate.ConfigurationNode;
+import org.spongepowered.configurate.objectmapping.ConfigSerializable;
+import org.spongepowered.configurate.objectmapping.ObjectMapper;
+import org.spongepowered.configurate.objectmapping.meta.Comment;
+import org.spongepowered.configurate.util.MapFactories;
+import org.spongepowered.configurate.util.NamingSchemes;
+
+import java.io.File;
+import java.util.HashMap;
+import java.util.Map;
+
+@ConfigSerializable
+@SuppressWarnings({"FieldCanBeLocal", "FieldMayBeFinal"})
+public class PandaSpigotConfig {
+ private static PandaSpigotConfig config;
+ private static PandaSpigotWorldConfig defaultWorldConfig;
+ private static final Map<String, PandaSpigotWorldConfig> worldConfigs = new HashMap<>();
+
+ /**
+ * Initialize the configuration, and load it from a file.
+ * <p>
+ * This is called once on server startup, and every reload.
+ *
+ * @param file The configuration file.
+ */
+ public static void init(File file) {
+ EOYamlConfigurationLoader loader = EOYamlConfigurationLoader.builder()
+ .file(file)
+ .defaultOptions(o -> o
+ .header("This is the configuration file for PandaSpigot.\n" +
+ "Use caution when modifying settings, as some may impact gameplay in non-obvious ways.")
+ .mapFactory(MapFactories.insertionOrdered())
+ .serializers(build -> build.registerAnnotatedObjects(ObjectMapper.factoryBuilder()
+ .defaultNamingScheme(NamingSchemes.CAMEL_CASE)
+ .build())))
+ .build();
+
+ try {
+ CommentedConfigurationNode root = loader.load();
+ config = root.get(PandaSpigotConfig.class);
+
+ // worlds
+ CommentedConfigurationNode worldsNode = root.node("worlds")
+ .comment("The worlds section is for settings which can be configured per-world.\n" +
+ "\n" +
+ "Any settings in the \"default\" world will provide default values for\n" +
+ "other worlds which don't explicitly specify settings.\n" +
+ "\n" +
+ "To specify settings for a specific world, just add a new section with the world's name.");
+ ConfigurationNode defaultWorldNode = worldsNode.node("default");
+ defaultWorldConfig = defaultWorldNode.get(PandaSpigotWorldConfig.class);
+ defaultWorldNode.set(defaultWorldConfig); // populate default in config
+
+ root.set(config); // update backing node
+ loader.save(root);
+
+ // call after save
+ initWorlds(worldsNode);
+ } catch (Exception e) {
+ throw Throwables.propagate(e);
+ }
+ }
+
+ private static void initWorlds(ConfigurationNode node) throws Exception {
+ worldConfigs.clear();
+ for (Map.Entry<Object, ? extends ConfigurationNode> entry : node.childrenMap().entrySet()) {
+ Object worldName = entry.getKey();
+ if (worldName.equals("default")) continue; // skip "default"
+ ConfigurationNode worldNode = entry.getValue();
+
+ PandaSpigotWorldConfig worldConfig = worldNode.get(PandaSpigotWorldConfig.class);
+
+ worldConfigs.put(worldName.toString(), worldConfig);
+ }
+ }
+
+ public static PandaSpigotWorldConfig getWorldConfig(String worldName) {
+ return worldConfigs.getOrDefault(worldName, defaultWorldConfig);
+ }
+
+ public static PandaSpigotWorldConfig getWorldConfig(World world) {
+ return getWorldConfig(world.worldData.getName());
+ }
+
+ public static PandaSpigotConfig get() {
+ return config;
+ }
+
+ //------------------------------------------------------------------------
+}
diff --git a/src/main/java/com/hpfxd/pandaspigot/config/PandaSpigotWorldConfig.java b/src/main/java/com/hpfxd/pandaspigot/config/PandaSpigotWorldConfig.java
new file mode 100644
index 0000000000000000000000000000000000000000..9afaf630481a9533fb014f306d4d90b8de80a129
--- /dev/null
+++ b/src/main/java/com/hpfxd/pandaspigot/config/PandaSpigotWorldConfig.java
@@ -0,0 +1,9 @@
+package com.hpfxd.pandaspigot.config;
+
+import org.spongepowered.configurate.objectmapping.ConfigSerializable;
+import org.spongepowered.configurate.objectmapping.meta.Comment;
+
+@ConfigSerializable
+@SuppressWarnings({"FieldCanBeLocal", "FieldMayBeFinal"})
+public class PandaSpigotWorldConfig {
+}
diff --git a/src/main/java/net/minecraft/server/DedicatedServer.java b/src/main/java/net/minecraft/server/DedicatedServer.java
index ee6a6b379575b0d0b10b96bac4ae8e1ffa810b8f..09085582a95fc4c61034db70dd543c5e7da8ede7 100644
--- a/src/main/java/net/minecraft/server/DedicatedServer.java
+++ b/src/main/java/net/minecraft/server/DedicatedServer.java
@@ -198,6 +198,7 @@ public class DedicatedServer extends MinecraftServer implements IMinecraftServer
}
bindAddress = new java.net.InetSocketAddress(inetaddress, this.R());
}
+ com.hpfxd.pandaspigot.config.PandaSpigotConfig.init((File) options.valueOf("pandaspigot-settings"));
// PandaSpigot end
// PaperSpigot start
org.github.paperspigot.PaperSpigotConfig.init((File) options.valueOf("paper-settings"));
diff --git a/src/main/java/net/minecraft/server/World.java b/src/main/java/net/minecraft/server/World.java
index 8f3511f800818c36b9387b92376e0b9785ec52b5..375d991f1ede3b352027192f5eccd8a8b988d17f 100644
--- a/src/main/java/net/minecraft/server/World.java
+++ b/src/main/java/net/minecraft/server/World.java
@@ -163,6 +163,8 @@ public abstract class World implements IBlockAccess {
public final org.github.paperspigot.PaperSpigotWorldConfig paperSpigotConfig; // PaperSpigot
+ public com.hpfxd.pandaspigot.config.PandaSpigotWorldConfig pandaSpigotConfig; // PandaSpigot
+
public final co.aikar.timings.WorldTimingsHandler timings; // Spigot
public CraftWorld getWorld() {
@@ -180,6 +182,7 @@ public abstract class World implements IBlockAccess {
protected World(IDataManager idatamanager, WorldData worlddata, WorldProvider worldprovider, MethodProfiler methodprofiler, boolean flag, ChunkGenerator gen, org.bukkit.World.Environment env) {
this.spigotConfig = new org.spigotmc.SpigotWorldConfig( worlddata.getName() ); // Spigot
this.paperSpigotConfig = new org.github.paperspigot.PaperSpigotWorldConfig( worlddata.getName() ); // PaperSpigot
+ this.pandaSpigotConfig = com.hpfxd.pandaspigot.config.PandaSpigotConfig.getWorldConfig(worlddata.getName()); // PandaSpigot
this.generator = gen;
this.world = new CraftWorld((WorldServer) this, gen, env);
this.ticksPerAnimalSpawns = this.getServer().getTicksPerAnimalSpawns(); // CraftBukkit
diff --git a/src/main/java/org/bukkit/craftbukkit/CraftServer.java b/src/main/java/org/bukkit/craftbukkit/CraftServer.java
index ad8c5da90fc64825185aedcfdf89a6ff013a7a81..1caffab6e75abf6010e8f1f2d2a29a2a22692fb7 100644
--- a/src/main/java/org/bukkit/craftbukkit/CraftServer.java
+++ b/src/main/java/org/bukkit/craftbukkit/CraftServer.java
@@ -714,6 +714,7 @@ public final class CraftServer implements Server {
org.spigotmc.SpigotConfig.init((File) console.options.valueOf("spigot-settings")); // Spigot
org.github.paperspigot.PaperSpigotConfig.init((File) console.options.valueOf("paper-settings")); // PaperSpigot
+ com.hpfxd.pandaspigot.config.PandaSpigotConfig.init((File) console.options.valueOf("pandaspigot-settings")); // PandaSpigot
for (WorldServer world : console.worlds) {
world.worldData.setDifficulty(difficulty);
world.setSpawnFlags(monsters, animals);
@@ -730,6 +731,7 @@ public final class CraftServer implements Server {
}
world.spigotConfig.init(); // Spigot
world.paperSpigotConfig.init(); // PaperSpigot
+ world.pandaSpigotConfig = com.hpfxd.pandaspigot.config.PandaSpigotConfig.getWorldConfig(world); // PandaSpigot
}
pluginManager.clearPlugins();
diff --git a/src/main/java/org/bukkit/craftbukkit/Main.java b/src/main/java/org/bukkit/craftbukkit/Main.java
index 5c980fe2907d2ff01be793ab0654ab198f46e519..fc6061a800b6e8a61eda70aadc6abb3627805916 100644
--- a/src/main/java/org/bukkit/craftbukkit/Main.java
+++ b/src/main/java/org/bukkit/craftbukkit/Main.java
@@ -130,6 +130,14 @@ public class Main {
.defaultsTo(new File("paper.yml"))
.describedAs("Yml file");
// PaperSpigot End
+
+ // PandaSpigot start
+ acceptsAll(asList("pandaspigot-settings"), "File for PandaSpigot settings")
+ .withRequiredArg()
+ .ofType(File.class)
+ .defaultsTo(new File("pandaspigot.yml"))
+ .describedAs("Yml file");
+ // PandaSpigot end
}
};