mirror of
https://github.com/chylex/Minecraft-Server-Properties-Reload.git
synced 2025-05-23 20:34:10 +02:00
Add main mod files & prepare '/properties reload' command
This commit is contained in:
parent
7f231f0db1
commit
4bf0dc7419
Fabric
Forge
build.gradle.ktsgradle.propertiessettings.gradle.ktssrc/main
java/chylex/serverproperties
command
mixin
props
resources
46
Fabric/build.gradle.kts
Normal file
46
Fabric/build.gradle.kts
Normal file
@ -0,0 +1,46 @@
|
|||||||
|
val modId: String by project
|
||||||
|
val minecraftVersion: String by project
|
||||||
|
val fabricVersion: String by project
|
||||||
|
|
||||||
|
plugins {
|
||||||
|
idea
|
||||||
|
id("fabric-loom") version "0.9-SNAPSHOT"
|
||||||
|
}
|
||||||
|
|
||||||
|
dependencies {
|
||||||
|
minecraft("com.mojang:minecraft:$minecraftVersion")
|
||||||
|
modImplementation("net.fabricmc:fabric-loader:$fabricVersion")
|
||||||
|
mappings(loom.officialMojangMappings())
|
||||||
|
}
|
||||||
|
|
||||||
|
loom {
|
||||||
|
runs {
|
||||||
|
named("client") {
|
||||||
|
configName = "Fabric Client"
|
||||||
|
client()
|
||||||
|
runDir("run")
|
||||||
|
ideConfigGenerated(true)
|
||||||
|
}
|
||||||
|
|
||||||
|
named("server") {
|
||||||
|
configName = "Fabric Server"
|
||||||
|
server()
|
||||||
|
runDir("run")
|
||||||
|
ideConfigGenerated(true)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
mixin {
|
||||||
|
add(sourceSets.main.get(), "$modId.refmap.json")
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
tasks.processResources {
|
||||||
|
filesMatching("fabric.mod.json") {
|
||||||
|
expand(inputs.properties)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
tasks.remapJar {
|
||||||
|
archiveVersion.set(tasks.jar.get().archiveVersion)
|
||||||
|
}
|
22
Fabric/src/main/resources/fabric.mod.json
Normal file
22
Fabric/src/main/resources/fabric.mod.json
Normal file
@ -0,0 +1,22 @@
|
|||||||
|
{
|
||||||
|
"schemaVersion": 1,
|
||||||
|
"id": "serverpropertiesreload",
|
||||||
|
"name": "${name}",
|
||||||
|
"description": "${description}",
|
||||||
|
"version": "${version}",
|
||||||
|
"license": "${license}",
|
||||||
|
|
||||||
|
"authors": [
|
||||||
|
"${author}"
|
||||||
|
],
|
||||||
|
|
||||||
|
"contact": {
|
||||||
|
"issues": "${issuesURL}",
|
||||||
|
"sources": "${sourcesURL}"
|
||||||
|
},
|
||||||
|
|
||||||
|
"environment": "server",
|
||||||
|
"mixins": [
|
||||||
|
"serverpropertiesreload.mixins.json"
|
||||||
|
]
|
||||||
|
}
|
95
Forge/build.gradle.kts
Normal file
95
Forge/build.gradle.kts
Normal file
@ -0,0 +1,95 @@
|
|||||||
|
import net.minecraftforge.gradle.userdev.UserDevExtension
|
||||||
|
import org.gradle.api.file.DuplicatesStrategy.INCLUDE
|
||||||
|
import org.spongepowered.asm.gradle.plugins.MixinExtension
|
||||||
|
|
||||||
|
val modId: String by project
|
||||||
|
val minecraftVersion: String by project
|
||||||
|
val forgeVersion: String by project
|
||||||
|
val mixinVersion: String by project
|
||||||
|
|
||||||
|
buildscript {
|
||||||
|
repositories {
|
||||||
|
maven("https://maven.minecraftforge.net")
|
||||||
|
maven("https://repo.spongepowered.org/maven")
|
||||||
|
mavenCentral()
|
||||||
|
}
|
||||||
|
|
||||||
|
dependencies {
|
||||||
|
classpath(group = "net.minecraftforge.gradle", name = "ForgeGradle", version = "5.1.+") { isChanging = true }
|
||||||
|
classpath(group = "org.spongepowered", name = "mixingradle", version = "0.7-SNAPSHOT")
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
plugins {
|
||||||
|
java
|
||||||
|
eclipse
|
||||||
|
}
|
||||||
|
|
||||||
|
apply {
|
||||||
|
plugin("net.minecraftforge.gradle")
|
||||||
|
plugin("org.spongepowered.mixin")
|
||||||
|
}
|
||||||
|
|
||||||
|
dependencies {
|
||||||
|
"minecraft"("net.minecraftforge:forge:$minecraftVersion-$forgeVersion")
|
||||||
|
|
||||||
|
if (System.getProperty("idea.sync.active") != "true") {
|
||||||
|
annotationProcessor("org.spongepowered:mixin:$mixinVersion:processor")
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
configure<UserDevExtension> {
|
||||||
|
mappings("official", minecraftVersion)
|
||||||
|
|
||||||
|
runs {
|
||||||
|
create("client") {
|
||||||
|
taskName = "Client"
|
||||||
|
workingDirectory(rootProject.file("run"))
|
||||||
|
ideaModule("${rootProject.name}.${project.name}.main")
|
||||||
|
|
||||||
|
property("mixin.env.remapRefMap", "true")
|
||||||
|
property("mixin.env.refMapRemappingFile", "$projectDir/build/createSrgToMcp/output.srg")
|
||||||
|
arg("-mixin.config=$modId.mixins.json")
|
||||||
|
|
||||||
|
mods {
|
||||||
|
create(modId) {
|
||||||
|
source(sourceSets.main.get())
|
||||||
|
source(rootProject.sourceSets.main.get())
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
create("server") {
|
||||||
|
taskName = "Server"
|
||||||
|
workingDirectory(rootProject.file("run"))
|
||||||
|
ideaModule("${rootProject.name}.${project.name}.main")
|
||||||
|
|
||||||
|
property("mixin.env.remapRefMap", "true")
|
||||||
|
property("mixin.env.refMapRemappingFile", "$projectDir/build/createSrgToMcp/output.srg")
|
||||||
|
arg("-mixin.config=$modId.mixins.json")
|
||||||
|
|
||||||
|
mods {
|
||||||
|
create(modId) {
|
||||||
|
source(sourceSets.main.get())
|
||||||
|
source(rootProject.sourceSets.main.get())
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
configure<MixinExtension> {
|
||||||
|
add(sourceSets.main.get(), "$modId.refmap.json")
|
||||||
|
}
|
||||||
|
|
||||||
|
tasks.processResources {
|
||||||
|
from(sourceSets.main.get().resources.srcDirs) {
|
||||||
|
include("META-INF/mods.toml")
|
||||||
|
expand(inputs.properties)
|
||||||
|
duplicatesStrategy = INCLUDE
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
tasks.jar {
|
||||||
|
finalizedBy("reobfJar")
|
||||||
|
}
|
12
Forge/src/main/java/chylex/serverproperties/ForgeMod.java
Normal file
12
Forge/src/main/java/chylex/serverproperties/ForgeMod.java
Normal file
@ -0,0 +1,12 @@
|
|||||||
|
package chylex.serverproperties;
|
||||||
|
import net.minecraftforge.fml.IExtensionPoint.DisplayTest;
|
||||||
|
import net.minecraftforge.fml.ModLoadingContext;
|
||||||
|
import net.minecraftforge.fml.common.Mod;
|
||||||
|
import net.minecraftforge.fmllegacy.network.FMLNetworkConstants;
|
||||||
|
|
||||||
|
@Mod("serverpropertiesreload")
|
||||||
|
public final class ForgeMod {
|
||||||
|
public ForgeMod() {
|
||||||
|
ModLoadingContext.get().registerExtensionPoint(DisplayTest.class, () -> new DisplayTest(() -> FMLNetworkConstants.IGNORESERVERONLY, (a, b) -> true));
|
||||||
|
}
|
||||||
|
}
|
26
Forge/src/main/resources/META-INF/mods.toml
Normal file
26
Forge/src/main/resources/META-INF/mods.toml
Normal file
@ -0,0 +1,26 @@
|
|||||||
|
modLoader = "javafml"
|
||||||
|
loaderVersion = "[37,)"
|
||||||
|
|
||||||
|
authors = "${author}"
|
||||||
|
license = "${license}"
|
||||||
|
issueTrackerURL = "${issuesURL}"
|
||||||
|
|
||||||
|
[[mods]]
|
||||||
|
modId = "serverpropertiesreload"
|
||||||
|
version = "${version}"
|
||||||
|
displayName = "${name}"
|
||||||
|
description = "${description}"
|
||||||
|
|
||||||
|
[[dependencies.serverpropertiesreload]]
|
||||||
|
modId = "minecraft"
|
||||||
|
mandatory = true
|
||||||
|
versionRange = "[1.17.1,)"
|
||||||
|
ordering = "NONE"
|
||||||
|
side = "BOTH"
|
||||||
|
|
||||||
|
[[dependencies.serverpropertiesreload]]
|
||||||
|
modId = "forge"
|
||||||
|
mandatory = true
|
||||||
|
versionRange = "[37,)"
|
||||||
|
ordering = "NONE"
|
||||||
|
side = "BOTH"
|
146
build.gradle.kts
Normal file
146
build.gradle.kts
Normal file
@ -0,0 +1,146 @@
|
|||||||
|
import org.gradle.api.file.DuplicatesStrategy.EXCLUDE
|
||||||
|
import java.text.SimpleDateFormat
|
||||||
|
import java.util.Date
|
||||||
|
|
||||||
|
val modId: String by project
|
||||||
|
val modName: String by project
|
||||||
|
val modDescription: String by project
|
||||||
|
val modAuthor: String by project
|
||||||
|
val modVersion: String by project
|
||||||
|
val modLicense: String by project
|
||||||
|
val modSourcesURL: String by project
|
||||||
|
val modIssuesURL: String by project
|
||||||
|
|
||||||
|
val minecraftVersion: String by project
|
||||||
|
val mixinVersion: String by project
|
||||||
|
|
||||||
|
val modNameStripped = modName.replace(" ", "")
|
||||||
|
val jarVersion = "$minecraftVersion+v$modVersion"
|
||||||
|
|
||||||
|
buildscript {
|
||||||
|
repositories {
|
||||||
|
maven("https://repo.spongepowered.org/maven")
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
plugins {
|
||||||
|
`java-library`
|
||||||
|
idea
|
||||||
|
id("org.spongepowered.gradle.vanilla") version "0.2.1-SNAPSHOT"
|
||||||
|
}
|
||||||
|
|
||||||
|
idea {
|
||||||
|
module {
|
||||||
|
excludeDirs.add(project.file("run"))
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
repositories {
|
||||||
|
maven("https://repo.spongepowered.org/maven")
|
||||||
|
mavenCentral()
|
||||||
|
}
|
||||||
|
|
||||||
|
dependencies {
|
||||||
|
implementation("org.spongepowered:mixin:$mixinVersion")
|
||||||
|
api("com.google.code.findbugs:jsr305:3.0.2")
|
||||||
|
}
|
||||||
|
|
||||||
|
base {
|
||||||
|
archivesName.set("$modNameStripped-Common")
|
||||||
|
}
|
||||||
|
|
||||||
|
minecraft {
|
||||||
|
version(minecraftVersion)
|
||||||
|
runs.clear()
|
||||||
|
}
|
||||||
|
|
||||||
|
allprojects {
|
||||||
|
group = "com.$modAuthor.$modId"
|
||||||
|
version = modVersion
|
||||||
|
|
||||||
|
apply(plugin = "java")
|
||||||
|
|
||||||
|
dependencies {
|
||||||
|
implementation("org.jetbrains:annotations:22.0.0")
|
||||||
|
}
|
||||||
|
|
||||||
|
extensions.getByType<JavaPluginExtension>().apply {
|
||||||
|
toolchain.languageVersion.set(JavaLanguageVersion.of(16))
|
||||||
|
}
|
||||||
|
|
||||||
|
tasks.withType<JavaCompile> {
|
||||||
|
options.encoding = "UTF-8"
|
||||||
|
options.release.set(16)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
subprojects {
|
||||||
|
repositories {
|
||||||
|
maven("https://repo.spongepowered.org/maven")
|
||||||
|
}
|
||||||
|
|
||||||
|
dependencies {
|
||||||
|
implementation(rootProject)
|
||||||
|
}
|
||||||
|
|
||||||
|
base {
|
||||||
|
archivesName.set("$modNameStripped-${project.name}")
|
||||||
|
}
|
||||||
|
|
||||||
|
tasks.withType<JavaCompile> {
|
||||||
|
source({ rootProject.sourceSets.main.get().allSource })
|
||||||
|
}
|
||||||
|
|
||||||
|
tasks.processResources {
|
||||||
|
from(rootProject.sourceSets.main.get().resources)
|
||||||
|
|
||||||
|
inputs.property("name", modName)
|
||||||
|
inputs.property("description", modDescription)
|
||||||
|
inputs.property("version", modVersion)
|
||||||
|
inputs.property("author", modAuthor)
|
||||||
|
inputs.property("license", modLicense)
|
||||||
|
inputs.property("sourcesURL", modSourcesURL)
|
||||||
|
inputs.property("issuesURL", modIssuesURL)
|
||||||
|
}
|
||||||
|
|
||||||
|
tasks.jar {
|
||||||
|
archiveVersion.set(jarVersion)
|
||||||
|
|
||||||
|
from(rootProject.file("LICENSE"))
|
||||||
|
|
||||||
|
manifest {
|
||||||
|
attributes(
|
||||||
|
"Specification-Title" to modId,
|
||||||
|
"Specification-Vendor" to modAuthor,
|
||||||
|
"Specification-Version" to "1",
|
||||||
|
"Implementation-Title" to "$modNameStripped-${project.name}",
|
||||||
|
"Implementation-Vendor" to modAuthor,
|
||||||
|
"Implementation-Version" to modVersion,
|
||||||
|
"Implementation-Timestamp" to SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ssZ").format(Date()),
|
||||||
|
"MixinConfigs" to "$modId.mixins.json"
|
||||||
|
)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
tasks.register("setupIdea") {
|
||||||
|
group = "mod"
|
||||||
|
dependsOn(project(":Forge").tasks.getByName("genIntellijRuns"))
|
||||||
|
dependsOn(project(":Fabric").tasks.getByName("genSources"))
|
||||||
|
}
|
||||||
|
|
||||||
|
val copyJars = tasks.register<Copy>("copyJars") {
|
||||||
|
group = "build"
|
||||||
|
duplicatesStrategy = EXCLUDE
|
||||||
|
|
||||||
|
for (subproject in subprojects) {
|
||||||
|
dependsOn(subproject.tasks.build)
|
||||||
|
from(subproject.base.libsDirectory.file("${subproject.base.archivesName.get()}-$jarVersion.jar"))
|
||||||
|
}
|
||||||
|
|
||||||
|
into(file("${project.buildDir}/dist"))
|
||||||
|
}
|
||||||
|
|
||||||
|
tasks.build {
|
||||||
|
finalizedBy(copyJars)
|
||||||
|
}
|
19
gradle.properties
Normal file
19
gradle.properties
Normal file
@ -0,0 +1,19 @@
|
|||||||
|
# Mod
|
||||||
|
modId=serverpropertiesreload
|
||||||
|
modName=Server Properties Reload
|
||||||
|
modDescription=Adds '/properties' command to modify or reload server properties
|
||||||
|
modAuthor=chylex
|
||||||
|
modVersion=1.0.0
|
||||||
|
modLicense=MPL-2.0
|
||||||
|
modSourcesURL=https://github.com/chylex/Minecraft-Server-Properties-Reload
|
||||||
|
modIssuesURL=https://github.com/chylex/Minecraft-Server-Properties-Reload/issues
|
||||||
|
|
||||||
|
# Dependencies
|
||||||
|
minecraftVersion=1.17.1
|
||||||
|
forgeVersion=37.0.75
|
||||||
|
fabricVersion=0.11.7
|
||||||
|
mixinVersion=0.8.4
|
||||||
|
|
||||||
|
# Gradle
|
||||||
|
org.gradle.jvmargs=-Xmx3G
|
||||||
|
org.gradle.daemon=false
|
17
settings.gradle.kts
Normal file
17
settings.gradle.kts
Normal file
@ -0,0 +1,17 @@
|
|||||||
|
rootProject.name = "Server-Properties-Reload"
|
||||||
|
|
||||||
|
pluginManagement {
|
||||||
|
repositories {
|
||||||
|
gradlePluginPortal()
|
||||||
|
maven(url = "https://maven.fabricmc.net/") { name = "Fabric" }
|
||||||
|
maven(url = "https://repo.spongepowered.org/repository/maven-public/") { name = "Sponge Snapshots" }
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (settings.extra.has("forgeVersion")) {
|
||||||
|
include("Forge")
|
||||||
|
}
|
||||||
|
|
||||||
|
if (settings.extra.has("fabricVersion")) {
|
||||||
|
include("Fabric")
|
||||||
|
}
|
@ -0,0 +1,89 @@
|
|||||||
|
package chylex.serverproperties.command;
|
||||||
|
|
||||||
|
import chylex.serverproperties.mixin.DedicatedServerPropertiesMixin;
|
||||||
|
import chylex.serverproperties.mixin.SettingsMixin;
|
||||||
|
import chylex.serverproperties.props.ServerProperties;
|
||||||
|
import chylex.serverproperties.props.ServerProperty;
|
||||||
|
import com.mojang.brigadier.CommandDispatcher;
|
||||||
|
import net.minecraft.ChatFormatting;
|
||||||
|
import net.minecraft.commands.CommandSourceStack;
|
||||||
|
import net.minecraft.network.chat.TextComponent;
|
||||||
|
import net.minecraft.server.MinecraftServer;
|
||||||
|
import net.minecraft.server.dedicated.DedicatedServer;
|
||||||
|
import net.minecraft.server.dedicated.DedicatedServerProperties;
|
||||||
|
import java.nio.file.Paths;
|
||||||
|
import java.util.HashSet;
|
||||||
|
import java.util.Map.Entry;
|
||||||
|
import java.util.Set;
|
||||||
|
import static net.minecraft.commands.Commands.literal;
|
||||||
|
|
||||||
|
public final class PropertiesCommand {
|
||||||
|
private PropertiesCommand() {}
|
||||||
|
|
||||||
|
public static void register(final CommandDispatcher<CommandSourceStack> dispatcher) {
|
||||||
|
dispatcher.register(literal("properties")
|
||||||
|
.requires(s -> s.hasPermission(2))
|
||||||
|
.then(literal("reload")
|
||||||
|
.executes(c -> reloadPropertiesFile(c.getSource())))
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
@SuppressWarnings("CastToIncompatibleInterface")
|
||||||
|
private static int reloadPropertiesFile(final CommandSourceStack s) {
|
||||||
|
final MinecraftServer server = s.getServer();
|
||||||
|
|
||||||
|
if (!(server instanceof final DedicatedServer dedicatedServer)) {
|
||||||
|
s.sendFailure(new TextComponent("This command is only supported on dedicated servers!"));
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
final DedicatedServerProperties oldProperties = dedicatedServer.getProperties();
|
||||||
|
final DedicatedServerProperties newProperties = DedicatedServerProperties.fromFile(Paths.get("server.properties"));
|
||||||
|
final Set<String> unknownPropertyNames = new HashSet<>(((SettingsMixin)newProperties).getProperties().stringPropertyNames());
|
||||||
|
|
||||||
|
s.sendSuccess(new TextComponent("Reloading server properties:"), true);
|
||||||
|
|
||||||
|
int reloadedProperties = 0;
|
||||||
|
int failedProperties = 0;
|
||||||
|
|
||||||
|
for (final Entry<String, ServerProperty<?>> entry : ServerProperties.all().stream().sorted(Entry.comparingByKey()).toList()) {
|
||||||
|
final String name = entry.getKey();
|
||||||
|
final ServerProperty<?> prop = entry.getValue();
|
||||||
|
|
||||||
|
unknownPropertyNames.remove(name);
|
||||||
|
|
||||||
|
if (prop.hasChanged(oldProperties, newProperties)) {
|
||||||
|
final String oldValue = prop.toStringFrom(oldProperties);
|
||||||
|
final String newValue = prop.toStringFrom(newProperties);
|
||||||
|
|
||||||
|
try {
|
||||||
|
prop.apply(dedicatedServer, newProperties, (DedicatedServerPropertiesMixin)oldProperties);
|
||||||
|
} catch (final UnsupportedOperationException e) {
|
||||||
|
s.sendSuccess(new TextComponent(" " + name + ':').withStyle(ChatFormatting.RED)
|
||||||
|
.append(new TextComponent(" cannot be reloaded").withStyle(ChatFormatting.WHITE)), true);
|
||||||
|
|
||||||
|
++failedProperties;
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
s.sendSuccess(new TextComponent(" " + name + ": ").withStyle(ChatFormatting.LIGHT_PURPLE)
|
||||||
|
.append(new TextComponent(oldValue).withStyle(ChatFormatting.WHITE))
|
||||||
|
.append(new TextComponent(" -> ").withStyle(ChatFormatting.GRAY))
|
||||||
|
.append(new TextComponent(newValue).withStyle(ChatFormatting.WHITE)), true);
|
||||||
|
|
||||||
|
++reloadedProperties;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
for (final String name : unknownPropertyNames.stream().sorted().toList()) {
|
||||||
|
s.sendSuccess(new TextComponent(" " + name + ':').withStyle(ChatFormatting.GRAY)
|
||||||
|
.append(new TextComponent(" skipped unknown property").withStyle(ChatFormatting.WHITE)), true);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (reloadedProperties == 0 && failedProperties == 0) {
|
||||||
|
s.sendSuccess(new TextComponent(" Found no changes").withStyle(ChatFormatting.GRAY), true);
|
||||||
|
}
|
||||||
|
|
||||||
|
return reloadedProperties;
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,19 @@
|
|||||||
|
package chylex.serverproperties.mixin;
|
||||||
|
|
||||||
|
import chylex.serverproperties.command.PropertiesCommand;
|
||||||
|
import net.minecraft.commands.Commands;
|
||||||
|
import net.minecraft.commands.Commands.CommandSelection;
|
||||||
|
import org.spongepowered.asm.mixin.Mixin;
|
||||||
|
import org.spongepowered.asm.mixin.injection.At;
|
||||||
|
import org.spongepowered.asm.mixin.injection.Inject;
|
||||||
|
import org.spongepowered.asm.mixin.injection.callback.CallbackInfo;
|
||||||
|
|
||||||
|
@Mixin(Commands.class)
|
||||||
|
public class CommandMixin {
|
||||||
|
@Inject(method = "<init>", at = @At("RETURN"))
|
||||||
|
private void init(final CommandSelection commandSelection, final CallbackInfo ci) {
|
||||||
|
@SuppressWarnings("ConstantConditions")
|
||||||
|
final Commands commands = (Commands)(Object)this;
|
||||||
|
PropertiesCommand.register(commands.getDispatcher());
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,8 @@
|
|||||||
|
package chylex.serverproperties.mixin;
|
||||||
|
|
||||||
|
import net.minecraft.server.dedicated.DedicatedServerProperties;
|
||||||
|
import org.spongepowered.asm.mixin.Mixin;
|
||||||
|
|
||||||
|
@Mixin(DedicatedServerProperties.class)
|
||||||
|
public interface DedicatedServerPropertiesMixin {
|
||||||
|
}
|
@ -0,0 +1,12 @@
|
|||||||
|
package chylex.serverproperties.mixin;
|
||||||
|
|
||||||
|
import net.minecraft.server.dedicated.Settings;
|
||||||
|
import org.spongepowered.asm.mixin.Mixin;
|
||||||
|
import org.spongepowered.asm.mixin.gen.Accessor;
|
||||||
|
import java.util.Properties;
|
||||||
|
|
||||||
|
@Mixin(Settings.class)
|
||||||
|
public interface SettingsMixin {
|
||||||
|
@Accessor
|
||||||
|
Properties getProperties();
|
||||||
|
}
|
@ -0,0 +1,25 @@
|
|||||||
|
package chylex.serverproperties.props;
|
||||||
|
import java.util.Collection;
|
||||||
|
import java.util.Collections;
|
||||||
|
import java.util.HashMap;
|
||||||
|
import java.util.Map;
|
||||||
|
import java.util.Map.Entry;
|
||||||
|
|
||||||
|
public final class ServerProperties {
|
||||||
|
private static final Map<String, ServerProperty<?>> ALL = new HashMap<>();
|
||||||
|
|
||||||
|
public static Collection<Entry<String, ServerProperty<?>>> all() {
|
||||||
|
return Collections.unmodifiableCollection(ALL.entrySet());
|
||||||
|
}
|
||||||
|
|
||||||
|
private static void register(final String name, final ServerProperty<?> property) {
|
||||||
|
if (ALL.put(name, property) != null) {
|
||||||
|
throw new IllegalArgumentException("Server property with name '" + name + "' is already registered!");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
static {
|
||||||
|
}
|
||||||
|
|
||||||
|
private ServerProperties() {}
|
||||||
|
}
|
@ -0,0 +1,28 @@
|
|||||||
|
package chylex.serverproperties.props;
|
||||||
|
|
||||||
|
import chylex.serverproperties.mixin.DedicatedServerPropertiesMixin;
|
||||||
|
import net.minecraft.server.dedicated.DedicatedServer;
|
||||||
|
import net.minecraft.server.dedicated.DedicatedServerProperties;
|
||||||
|
import java.util.Objects;
|
||||||
|
|
||||||
|
public abstract class ServerProperty<T> {
|
||||||
|
public final boolean hasChanged(final DedicatedServerProperties oldProperties, final DedicatedServerProperties newProperties) {
|
||||||
|
return !Objects.equals(get(oldProperties), get(newProperties));
|
||||||
|
}
|
||||||
|
|
||||||
|
public final void apply(final DedicatedServer server, final DedicatedServerProperties source, final DedicatedServerPropertiesMixin target) {
|
||||||
|
apply(server, target, get(source));
|
||||||
|
}
|
||||||
|
|
||||||
|
public final String toStringFrom(final DedicatedServerProperties source) {
|
||||||
|
return toString(get(source));
|
||||||
|
}
|
||||||
|
|
||||||
|
public abstract T get(DedicatedServerProperties properties);
|
||||||
|
|
||||||
|
public abstract void apply(DedicatedServer server, DedicatedServerPropertiesMixin target, T value);
|
||||||
|
|
||||||
|
public String toString(final T value) {
|
||||||
|
return Objects.toString(value, "<null>");
|
||||||
|
}
|
||||||
|
}
|
7
src/main/resources/pack.mcmeta
Normal file
7
src/main/resources/pack.mcmeta
Normal file
@ -0,0 +1,7 @@
|
|||||||
|
{
|
||||||
|
"pack": {
|
||||||
|
"description": "Server Properties Reload",
|
||||||
|
"pack_format": 7,
|
||||||
|
"_comment": ""
|
||||||
|
}
|
||||||
|
}
|
15
src/main/resources/serverpropertiesreload.mixins.json
Normal file
15
src/main/resources/serverpropertiesreload.mixins.json
Normal file
@ -0,0 +1,15 @@
|
|||||||
|
{
|
||||||
|
"required": true,
|
||||||
|
"minVersion": "0.8",
|
||||||
|
"package": "chylex.serverproperties.mixin",
|
||||||
|
"refmap": "serverpropertiesreload.refmap.json",
|
||||||
|
"compatibilityLevel": "JAVA_16",
|
||||||
|
"server": [
|
||||||
|
"CommandMixin",
|
||||||
|
"DedicatedServerPropertiesMixin",
|
||||||
|
"SettingsMixin"
|
||||||
|
],
|
||||||
|
"injectors": {
|
||||||
|
"defaultRequire": 1
|
||||||
|
}
|
||||||
|
}
|
Loading…
Reference in New Issue
Block a user