diff --git a/platform/fabric/build.gradle.kts b/platform/fabric/build.gradle.kts index d348a3331..cdfa4300b 100644 --- a/platform/fabric/build.gradle.kts +++ b/platform/fabric/build.gradle.kts @@ -63,10 +63,13 @@ loom { } runs { + getByName("client") { + programArgs("--username", "A") + } + configureEach { isIdeConfigGenerated = true - vmArgs += "-Dwaila.enableTestPlugin=true" - vmArgs += "-Dwaila.debugCommands=true" + runDir = "run/${namer.determineName(this)}" } } } diff --git a/platform/fabric/src/main/java/mcp/mobius/waila/fabric/FabricClientCommand.java b/platform/fabric/src/main/java/mcp/mobius/waila/fabric/FabricClientCommand.java index 3615278f0..2ee3f9c47 100644 --- a/platform/fabric/src/main/java/mcp/mobius/waila/fabric/FabricClientCommand.java +++ b/platform/fabric/src/main/java/mcp/mobius/waila/fabric/FabricClientCommand.java @@ -1,5 +1,7 @@ package mcp.mobius.waila.fabric; +import java.util.function.Supplier; + import com.mojang.brigadier.arguments.ArgumentType; import com.mojang.brigadier.builder.LiteralArgumentBuilder; import com.mojang.brigadier.builder.RequiredArgumentBuilder; @@ -10,33 +12,24 @@ public class FabricClientCommand extends ClientCommand { - public FabricClientCommand() { - super(new ArgumentBuilderFactory<>() { - @Override - public LiteralArgumentBuilder literal(String name) { - return ClientCommandManager.literal(name); - } - - @Override - public RequiredArgumentBuilder required(String name, ArgumentType type) { - return ClientCommandManager.argument(name, type); - } - }); + @Override + protected LiteralArgumentBuilder literal(String name) { + return ClientCommandManager.literal(name); + } + + @Override + protected RequiredArgumentBuilder argument(String name, ArgumentType type) { + return ClientCommandManager.argument(name, type); + } + + @Override + protected void success(FabricClientCommandSource source, Supplier msg) { + source.sendFeedback(msg.get()); } @Override - protected FeedbackSender feedback(FabricClientCommandSource source) { - return new FeedbackSender() { - @Override - public void success(Component message) { - source.sendFeedback(message); - } - - @Override - public void fail(Component message) { - source.sendError(message); - } - }; + protected void fail(FabricClientCommandSource source, Component msg) { + source.sendError(msg); } } diff --git a/platform/fabric/src/main/java/mcp/mobius/waila/fabric/FabricPluginLoader.java b/platform/fabric/src/main/java/mcp/mobius/waila/fabric/FabricPluginLoader.java index 37935876b..2b4a45b7e 100644 --- a/platform/fabric/src/main/java/mcp/mobius/waila/fabric/FabricPluginLoader.java +++ b/platform/fabric/src/main/java/mcp/mobius/waila/fabric/FabricPluginLoader.java @@ -100,7 +100,7 @@ protected void gatherPlugins() { continue; } - PluginInfo.register(mod.getMetadata().getId(), id, side, initializer, requiredDeps, true); + PluginInfo.register(mod.getMetadata().getId(), id, side, initializer, requiredDeps, true, true); } } } diff --git a/platform/fabric/src/main/java/mcp/mobius/waila/fabric/FabricWaila.java b/platform/fabric/src/main/java/mcp/mobius/waila/fabric/FabricWaila.java index 161488a05..89159f75e 100644 --- a/platform/fabric/src/main/java/mcp/mobius/waila/fabric/FabricWaila.java +++ b/platform/fabric/src/main/java/mcp/mobius/waila/fabric/FabricWaila.java @@ -5,6 +5,7 @@ import mcp.mobius.waila.config.PluginConfig; import mcp.mobius.waila.debug.DumpGenerator; import mcp.mobius.waila.network.Packets; +import mcp.mobius.waila.plugin.PluginLoader; import mcp.mobius.waila.util.ModInfo; import net.fabricmc.api.ModInitializer; import net.fabricmc.fabric.api.command.v2.CommandRegistrationCallback; @@ -24,7 +25,7 @@ public void onInitialize() { Packets.initServer(); CommandRegistrationCallback.EVENT.register((dispatcher, registryAccess, environment) -> - ServerCommand.register(dispatcher)); + new ServerCommand().register(dispatcher)); ServerLifecycleEvents.SERVER_STARTING.register(server -> PluginConfig.reload()); ServerLifecycleEvents.SERVER_STOPPED.register(server -> onServerStopped()); @@ -40,7 +41,7 @@ public void onInitialize() { .ifPresent(m -> DumpGenerator.VERSIONS.put(m.getName(), m.getVersion().getFriendlyString())); } - new FabricPluginLoader().loadPlugins(); + PluginLoader.INSTANCE.loadPlugins(); } } diff --git a/platform/fabric/src/main/resources/META-INF/services/mcp.mobius.waila.plugin.PluginLoader b/platform/fabric/src/main/resources/META-INF/services/mcp.mobius.waila.plugin.PluginLoader new file mode 100644 index 000000000..dbe4ffb1d --- /dev/null +++ b/platform/fabric/src/main/resources/META-INF/services/mcp.mobius.waila.plugin.PluginLoader @@ -0,0 +1 @@ +mcp.mobius.waila.fabric.FabricPluginLoader diff --git a/platform/fabric/src/main/resources/waila_plugins.json b/platform/fabric/src/main/resources/waila_plugins.json index 043905e95..344b9133c 100644 --- a/platform/fabric/src/main/resources/waila_plugins.json +++ b/platform/fabric/src/main/resources/waila_plugins.json @@ -33,5 +33,10 @@ "initializer": "mcp.mobius.waila.plugin.trenergy.WailaPluginTeamRebornEnergy", "side" : "*", "required" : ["team_reborn_energy"] + }, + + "waila:test" : { + "initializer" : "mcp.mobius.waila.plugin.test.WailaPluginTest", + "defaultEnabled": false } } diff --git a/platform/forge/build.gradle.kts b/platform/forge/build.gradle.kts index 69721e683..94c41a0b4 100644 --- a/platform/forge/build.gradle.kts +++ b/platform/forge/build.gradle.kts @@ -1,4 +1,3 @@ -import net.minecraftforge.gradle.common.util.RunConfig import java.text.SimpleDateFormat import java.util.* @@ -21,12 +20,13 @@ dependencies { // https://www.curseforge.com/minecraft/mc-mods/travelers-backpack/files/4584396 // runtimeOnly(fg.deobf("curse.maven:travelers-backpack-321117:4584396")) - + when (rootProp["recipeViewer"]) { "rei" -> { runtimeOnly(fg.deobf("me.shedaniel:RoughlyEnoughItems-forge:${rootProp["rei"]}")) // runtimeOnly(fg.deobf("me.shedaniel:RoughlyEnoughItems-plugin-compatibilities-forge:${rootProp["rei"]}")) } + "jei" -> rootProp["jei"].split("-").also { (mc, jei) -> runtimeOnly(fg.deobf("mezz.jei:jei-${mc}-forge:${jei}")) } @@ -50,17 +50,19 @@ sourceSets { minecraft { mappings("official", rootProp["minecraft"]) runs { - val runConfig = Action { - workingDirectory(file("run")) + create("server") + create("client") { + args("--username", "A") + } + + configureEach { + workingDirectory(file("run/${namer.determineName(this)}")) ideaModule("${rootProject.name}.${project.name}.main") - property("waila.enableTestPlugin", "true") - property("waila.debugCommands", "true") + source(sourceSets["main"]) source(sourceSets["plugin"]) rootProject.sourceSets.forEach { source(it) } } - create("client", runConfig) - create("server", runConfig) } } diff --git a/platform/forge/src/main/java/mcp/mobius/waila/forge/ForgeClientCommand.java b/platform/forge/src/main/java/mcp/mobius/waila/forge/ForgeClientCommand.java index 11ab15efa..30bf0ac8d 100644 --- a/platform/forge/src/main/java/mcp/mobius/waila/forge/ForgeClientCommand.java +++ b/platform/forge/src/main/java/mcp/mobius/waila/forge/ForgeClientCommand.java @@ -1,5 +1,7 @@ package mcp.mobius.waila.forge; +import java.util.function.Supplier; + import com.mojang.brigadier.arguments.ArgumentType; import com.mojang.brigadier.builder.LiteralArgumentBuilder; import com.mojang.brigadier.builder.RequiredArgumentBuilder; @@ -10,33 +12,24 @@ public class ForgeClientCommand extends ClientCommand { - public ForgeClientCommand() { - super(new ArgumentBuilderFactory<>() { - @Override - public LiteralArgumentBuilder literal(String name) { - return Commands.literal(name); - } - - @Override - public RequiredArgumentBuilder required(String name, ArgumentType type) { - return Commands.argument(name, type); - } - }); + @Override + protected LiteralArgumentBuilder literal(String name) { + return Commands.literal(name); + } + + @Override + protected RequiredArgumentBuilder argument(String name, ArgumentType type) { + return Commands.argument(name, type); + } + + @Override + protected void success(CommandSourceStack source, Supplier msg) { + source.sendSuccess(msg, false); } @Override - protected FeedbackSender feedback(CommandSourceStack source) { - return new FeedbackSender() { - @Override - public void success(Component message) { - source.sendSuccess(() -> message, false); - } - - @Override - public void fail(Component message) { - source.sendFailure(message); - } - }; + protected void fail(CommandSourceStack source, Component msg) { + source.sendFailure(msg); } } diff --git a/platform/forge/src/main/java/mcp/mobius/waila/forge/ForgePluginLoader.java b/platform/forge/src/main/java/mcp/mobius/waila/forge/ForgePluginLoader.java index 2a553b057..bf8709cf1 100644 --- a/platform/forge/src/main/java/mcp/mobius/waila/forge/ForgePluginLoader.java +++ b/platform/forge/src/main/java/mcp/mobius/waila/forge/ForgePluginLoader.java @@ -46,7 +46,7 @@ protected void gatherPlugins() { } if (satisfied) { - PluginInfo.register(modFile.getMods().get(0).getModId(), id, side, annotation.memberName(), Arrays.asList(required), true); + PluginInfo.register(modFile.getMods().get(0).getModId(), id, side, annotation.memberName(), Arrays.asList(required), true, true); } } } diff --git a/platform/forge/src/main/java/mcp/mobius/waila/forge/ForgeWaila.java b/platform/forge/src/main/java/mcp/mobius/waila/forge/ForgeWaila.java index e0c918b67..5d6025ed2 100644 --- a/platform/forge/src/main/java/mcp/mobius/waila/forge/ForgeWaila.java +++ b/platform/forge/src/main/java/mcp/mobius/waila/forge/ForgeWaila.java @@ -6,6 +6,7 @@ import mcp.mobius.waila.config.PluginConfig; import mcp.mobius.waila.debug.DumpGenerator; import mcp.mobius.waila.network.Packets; +import mcp.mobius.waila.plugin.PluginLoader; import net.minecraftforge.event.RegisterCommandsEvent; import net.minecraftforge.event.TagsUpdatedEvent; import net.minecraftforge.event.server.ServerStartingEvent; @@ -37,7 +38,7 @@ static void setup(FMLCommonSetupEvent event) { @SubscribeEvent static void loadComplete(FMLLoadCompleteEvent event) { - new ForgePluginLoader().loadPlugins(); + PluginLoader.INSTANCE.loadPlugins(); } @EventBusSubscriber(modid = WailaConstants.WAILA) @@ -60,7 +61,7 @@ static void tagReload(TagsUpdatedEvent event) { @SubscribeEvent static void registerCommands(RegisterCommandsEvent event) { - ServerCommand.register(event.getDispatcher()); + new ServerCommand().register(event.getDispatcher()); } } diff --git a/platform/forge/src/main/resources/META-INF/services/mcp.mobius.waila.plugin.PluginLoader b/platform/forge/src/main/resources/META-INF/services/mcp.mobius.waila.plugin.PluginLoader new file mode 100644 index 000000000..f263e58d3 --- /dev/null +++ b/platform/forge/src/main/resources/META-INF/services/mcp.mobius.waila.plugin.PluginLoader @@ -0,0 +1 @@ +mcp.mobius.waila.forge.ForgePluginLoader diff --git a/platform/forge/src/main/resources/waila_plugins.json b/platform/forge/src/main/resources/waila_plugins.json index dda9a52a1..60853d570 100644 --- a/platform/forge/src/main/resources/waila_plugins.json +++ b/platform/forge/src/main/resources/waila_plugins.json @@ -27,5 +27,10 @@ "initializer": "mcp.mobius.waila.plugin.forge.WailaPluginForge", "side" : "*", "required" : ["forge"] + }, + + "waila:test" : { + "initializer" : "mcp.mobius.waila.plugin.test.WailaPluginTest", + "defaultEnabled": false } } diff --git a/platform/neo/build.gradle.kts b/platform/neo/build.gradle.kts index 007c01c63..fe08bb8a5 100644 --- a/platform/neo/build.gradle.kts +++ b/platform/neo/build.gradle.kts @@ -1,5 +1,3 @@ -import net.neoforged.gradle.dsl.common.runs.run.Run - plugins { id("net.neoforged.gradle.userdev") version "7.0.+" } @@ -26,18 +24,18 @@ sourceSets { } runs { - val runConfig = Action { - workingDirectory(file("run")) - jvmArgument("-Dwaila.enableTestPlugin=true") - jvmArgument("-Dwaila.debugCommands=true") + create("server") + create("client") { + programArguments("--username", "A") + } + + configureEach { + workingDirectory(file("run/${namer.determineName(this)}")) modSource(sourceSets["main"]) modSource(sourceSets["plugin"]) modSource(sourceSets["dummy"]) } - - create("client", runConfig) - create("server", runConfig) } tasks.processResources { diff --git a/platform/neo/src/main/java/mcp/mobius/waila/neo/NeoClientCommand.java b/platform/neo/src/main/java/mcp/mobius/waila/neo/NeoClientCommand.java index e36805a64..4c995ee13 100644 --- a/platform/neo/src/main/java/mcp/mobius/waila/neo/NeoClientCommand.java +++ b/platform/neo/src/main/java/mcp/mobius/waila/neo/NeoClientCommand.java @@ -1,5 +1,7 @@ package mcp.mobius.waila.neo; +import java.util.function.Supplier; + import com.mojang.brigadier.arguments.ArgumentType; import com.mojang.brigadier.builder.LiteralArgumentBuilder; import com.mojang.brigadier.builder.RequiredArgumentBuilder; @@ -10,33 +12,24 @@ public class NeoClientCommand extends ClientCommand { - public NeoClientCommand() { - super(new ArgumentBuilderFactory<>() { - @Override - public LiteralArgumentBuilder literal(String name) { - return Commands.literal(name); - } - - @Override - public RequiredArgumentBuilder required(String name, ArgumentType type) { - return Commands.argument(name, type); - } - }); + @Override + protected LiteralArgumentBuilder literal(String name) { + return Commands.literal(name); + } + + @Override + protected RequiredArgumentBuilder argument(String name, ArgumentType type) { + return Commands.argument(name, type); + } + + @Override + protected void success(CommandSourceStack source, Supplier msg) { + source.sendSuccess(msg, false); } @Override - protected FeedbackSender feedback(CommandSourceStack source) { - return new FeedbackSender() { - @Override - public void success(Component message) { - source.sendSuccess(() -> message, false); - } - - @Override - public void fail(Component message) { - source.sendFailure(message); - } - }; + protected void fail(CommandSourceStack source, Component msg) { + source.sendFailure(msg); } } diff --git a/platform/neo/src/main/java/mcp/mobius/waila/neo/NeoWaila.java b/platform/neo/src/main/java/mcp/mobius/waila/neo/NeoWaila.java index e7cb85e5b..58c73bf26 100644 --- a/platform/neo/src/main/java/mcp/mobius/waila/neo/NeoWaila.java +++ b/platform/neo/src/main/java/mcp/mobius/waila/neo/NeoWaila.java @@ -6,6 +6,7 @@ import mcp.mobius.waila.config.PluginConfig; import mcp.mobius.waila.debug.DumpGenerator; import mcp.mobius.waila.network.Packets; +import mcp.mobius.waila.plugin.PluginLoader; import net.neoforged.bus.api.SubscribeEvent; import net.neoforged.fml.ModContainer; import net.neoforged.fml.ModList; @@ -37,7 +38,7 @@ static void setup(FMLCommonSetupEvent event) { @SubscribeEvent static void loadComplete(FMLLoadCompleteEvent event) { - new NeoPluginLoader().loadPlugins(); + PluginLoader.INSTANCE.loadPlugins(); } @EventBusSubscriber(modid = WailaConstants.WAILA) @@ -60,7 +61,7 @@ static void tagReload(TagsUpdatedEvent event) { @SubscribeEvent static void registerCommands(RegisterCommandsEvent event) { - ServerCommand.register(event.getDispatcher()); + new ServerCommand().register(event.getDispatcher()); } } diff --git a/platform/neo/src/main/resources/META-INF/services/mcp.mobius.waila.plugin.PluginLoader b/platform/neo/src/main/resources/META-INF/services/mcp.mobius.waila.plugin.PluginLoader new file mode 100644 index 000000000..7fa406382 --- /dev/null +++ b/platform/neo/src/main/resources/META-INF/services/mcp.mobius.waila.plugin.PluginLoader @@ -0,0 +1 @@ +mcp.mobius.waila.neo.NeoPluginLoader diff --git a/platform/neo/src/main/resources/waila_plugins.json b/platform/neo/src/main/resources/waila_plugins.json index afd08c3dd..0f21517d2 100644 --- a/platform/neo/src/main/resources/waila_plugins.json +++ b/platform/neo/src/main/resources/waila_plugins.json @@ -27,5 +27,10 @@ "initializer": "mcp.mobius.waila.plugin.neo.WailaPluginNeo", "side" : "*", "required" : ["neoforge"] + }, + + "waila:test" : { + "initializer" : "mcp.mobius.waila.plugin.test.WailaPluginTest", + "defaultEnabled": false } } diff --git a/platform/quilt/build.gradle.kts b/platform/quilt/build.gradle.kts index 35b307a53..235a9b6b9 100644 --- a/platform/quilt/build.gradle.kts +++ b/platform/quilt/build.gradle.kts @@ -59,10 +59,13 @@ loom { } runs { + getByName("client") { + programArgs("--username", "A") + } + configureEach { isIdeConfigGenerated = true - vmArgs += "-Dwaila.enableTestPlugin=true" - vmArgs += "-Dwaila.debugCommands=true" + runDir = "run/${namer.determineName(this)}" } } } diff --git a/platform/quilt/src/main/java/mcp/mobius/waila/quilt/QuiltClientCommand.java b/platform/quilt/src/main/java/mcp/mobius/waila/quilt/QuiltClientCommand.java index f87eba49c..65d5df33a 100644 --- a/platform/quilt/src/main/java/mcp/mobius/waila/quilt/QuiltClientCommand.java +++ b/platform/quilt/src/main/java/mcp/mobius/waila/quilt/QuiltClientCommand.java @@ -10,33 +10,24 @@ public class QuiltClientCommand extends ClientCommand { - public QuiltClientCommand() { - super(new ArgumentBuilderFactory<>() { - @Override - public LiteralArgumentBuilder literal(String name) { - return ClientCommandManager.literal(name); - } + @Override + protected LiteralArgumentBuilder literal(String name) { + return ClientCommandManager.literal(name); + } - @Override - public RequiredArgumentBuilder required(String name, ArgumentType type) { - return ClientCommandManager.argument(name, type); - } - }); + @Override + protected RequiredArgumentBuilder argument(String name, ArgumentType type) { + return ClientCommandManager.argument(name, type); } @Override - protected FeedbackSender feedback(QuiltClientCommandSource source) { - return new FeedbackSender() { - @Override - public void success(Component message) { - source.sendFeedback(message); - } + protected void success(QuiltClientCommandSource source, Supplier msg) { + source.sendFeedback(msg.get()); + } - @Override - public void fail(Component message) { - source.sendError(message); - } - }; + @Override + protected void fail(QuiltClientCommandSource source, Component msg) { + source.sendError(msg); } } diff --git a/platform/quilt/src/main/java/mcp/mobius/waila/quilt/QuiltPluginLoader.java b/platform/quilt/src/main/java/mcp/mobius/waila/quilt/QuiltPluginLoader.java index 573bbc6f1..37ac2fa3b 100644 --- a/platform/quilt/src/main/java/mcp/mobius/waila/quilt/QuiltPluginLoader.java +++ b/platform/quilt/src/main/java/mcp/mobius/waila/quilt/QuiltPluginLoader.java @@ -105,7 +105,7 @@ protected void gatherPlugins() { continue; } - PluginInfo.register(mod.metadata().id(), id, side, initializer, requiredDeps, true); + PluginInfo.register(mod.metadata().id(), id, side, initializer, requiredDeps, true, true); } } } diff --git a/platform/quilt/src/main/java/mcp/mobius/waila/quilt/QuiltWaila.java b/platform/quilt/src/main/java/mcp/mobius/waila/quilt/QuiltWaila.java index 3e80d6774..cc5fcff25 100644 --- a/platform/quilt/src/main/java/mcp/mobius/waila/quilt/QuiltWaila.java +++ b/platform/quilt/src/main/java/mcp/mobius/waila/quilt/QuiltWaila.java @@ -5,6 +5,7 @@ import mcp.mobius.waila.config.PluginConfig; import mcp.mobius.waila.debug.DumpGenerator; import mcp.mobius.waila.network.Packets; +import mcp.mobius.waila.plugin.PluginLoader; import org.quiltmc.loader.api.ModContainer; import org.quiltmc.loader.api.QuiltLoader; import org.quiltmc.qsl.base.api.entrypoint.ModInitializer; @@ -18,7 +19,7 @@ public void onInitialize(ModContainer mod) { Packets.initServer(); CommandRegistrationCallback.EVENT.register((dispatcher, registryAccess, environment) -> - ServerCommand.register(dispatcher)); + new ServerCommand().register(dispatcher)); ServerLifecycleEvents.STARTING.register(server -> PluginConfig.reload()); ServerLifecycleEvents.STOPPED.register(server -> onServerStopped()); @@ -30,7 +31,7 @@ public void onInitialize(ModContainer mod) { .ifPresent(m -> DumpGenerator.VERSIONS.put(m.name(), m.version().raw())); } - new QuiltPluginLoader().loadPlugins(); + PluginLoader.INSTANCE.loadPlugins(); } } diff --git a/platform/quilt/src/main/resources/META-INF/services/mcp.mobius.waila.plugin.PluginLoader b/platform/quilt/src/main/resources/META-INF/services/mcp.mobius.waila.plugin.PluginLoader new file mode 100644 index 000000000..5e91a7611 --- /dev/null +++ b/platform/quilt/src/main/resources/META-INF/services/mcp.mobius.waila.plugin.PluginLoader @@ -0,0 +1 @@ +mcp.mobius.waila.quilt.QuiltPluginLoader diff --git a/platform/quilt/src/main/resources/waila_plugins.json b/platform/quilt/src/main/resources/waila_plugins.json index c3b215b0c..494851968 100644 --- a/platform/quilt/src/main/resources/waila_plugins.json +++ b/platform/quilt/src/main/resources/waila_plugins.json @@ -33,5 +33,10 @@ "initializer": "mcp.mobius.waila.plugin.trenergy.WailaPluginTeamRebornEnergy", "side" : "*", "required" : ["team_reborn_energy"] + }, + + "waila:test" : { + "initializer" : "mcp.mobius.waila.plugin.test.WailaPluginTest", + "defaultEnabled": false } } diff --git a/src/api/java/mcp/mobius/waila/api/IJsonConfig.java b/src/api/java/mcp/mobius/waila/api/IJsonConfig.java index a5cc017e9..d1097deae 100644 --- a/src/api/java/mcp/mobius/waila/api/IJsonConfig.java +++ b/src/api/java/mcp/mobius/waila/api/IJsonConfig.java @@ -7,6 +7,7 @@ import java.util.function.ToIntFunction; import com.google.gson.Gson; +import com.google.gson.reflect.TypeToken; import mcp.mobius.waila.api.__internal__.IApiService; import org.jetbrains.annotations.ApiStatus; import org.jetbrains.annotations.Nullable; @@ -19,10 +20,22 @@ @ApiStatus.NonExtendable public interface IJsonConfig { + /** + * Creates a builder for concrete config type. + */ static Builder0 of(Class clazz) { return IApiService.INSTANCE.createConfigBuilder(clazz); } + /** + * Creates a builder for generic config type. + *

+ * Note: the {@linkplain Builder1#factory(Supplier) object factory} must be specified. + */ + static Builder0 of(TypeToken type) { + return IApiService.INSTANCE.createConfigBuilder(type.getType()); + } + /** * Get current value */ diff --git a/src/api/java/mcp/mobius/waila/api/IPluginInfo.java b/src/api/java/mcp/mobius/waila/api/IPluginInfo.java index a3274af1d..5ee244ef6 100644 --- a/src/api/java/mcp/mobius/waila/api/IPluginInfo.java +++ b/src/api/java/mcp/mobius/waila/api/IPluginInfo.java @@ -32,6 +32,8 @@ static Collection getAll() { List getRequiredModIds(); + boolean isEnabled(); + enum Side { /** * This plugin only loaded on the client jar. diff --git a/src/api/java/mcp/mobius/waila/api/__internal__/IApiService.java b/src/api/java/mcp/mobius/waila/api/__internal__/IApiService.java index 6926d0da5..a2a93afa9 100644 --- a/src/api/java/mcp/mobius/waila/api/__internal__/IApiService.java +++ b/src/api/java/mcp/mobius/waila/api/__internal__/IApiService.java @@ -1,5 +1,6 @@ package mcp.mobius.waila.api.__internal__; +import java.lang.reflect.Type; import java.nio.file.Path; import java.util.Collection; import java.util.List; @@ -37,7 +38,7 @@ public interface IApiService { IBlacklistConfig getBlacklistConfig(); - IJsonConfig.Builder0 createConfigBuilder(Class clazz); + IJsonConfig.Builder0 createConfigBuilder(Type type); IModInfo getModInfo(String namespace); diff --git a/src/main/java/mcp/mobius/waila/WailaClient.java b/src/main/java/mcp/mobius/waila/WailaClient.java index bc7dc95fe..52efc3e87 100644 --- a/src/main/java/mcp/mobius/waila/WailaClient.java +++ b/src/main/java/mcp/mobius/waila/WailaClient.java @@ -91,7 +91,7 @@ protected static void onClientTick() { protected static void onItemTooltip(ItemStack stack, List tooltip) { if (PluginConfig.CLIENT.getBoolean(WailaConstants.CONFIG_SHOW_ITEM_MOD_NAME)) { - for (var listener : Registrar.INSTANCE.eventListeners.get(Object.class)) { + for (var listener : Registrar.get().eventListeners.get(Object.class)) { var name = listener.instance().getHoveredItemModName(stack, PluginConfig.CLIENT); if (name != null) { tooltip.add(IWailaConfig.get().getFormatter().modName(name)); diff --git a/src/main/java/mcp/mobius/waila/access/DataReader.java b/src/main/java/mcp/mobius/waila/access/DataReader.java index 4ee3ae4cf..9f8886920 100644 --- a/src/main/java/mcp/mobius/waila/access/DataReader.java +++ b/src/main/java/mcp/mobius/waila/access/DataReader.java @@ -52,7 +52,7 @@ public void reset(@Nullable CompoundTag raw) { @SuppressWarnings("unchecked") public static IData readTypedPacket(FriendlyByteBuf buf) { var id = buf.readResourceLocation(); - var serializer = (IData.Serializer) Registrar.INSTANCE.dataId2Serializer.get(id); + var serializer = (IData.Serializer) Registrar.get().dataId2Serializer.get(id); return serializer.read(buf); } @@ -76,7 +76,7 @@ public void invalidate(Class type) { public void add(IData data) { clean = false; - typed.put(Registrar.INSTANCE.impl2ApiDataType.get(data.getClass()), data); + typed.put(Registrar.get().impl2ApiDataType.get(data.getClass()), data); } } diff --git a/src/main/java/mcp/mobius/waila/access/DataWriter.java b/src/main/java/mcp/mobius/waila/access/DataWriter.java index 7af8659c8..859004f51 100644 --- a/src/main/java/mcp/mobius/waila/access/DataWriter.java +++ b/src/main/java/mcp/mobius/waila/access/DataWriter.java @@ -143,7 +143,7 @@ public void tryAppend(Player player, P provider, A accessor, PluginConfig } private void assertType(Class type) { - Preconditions.checkArgument(Registrar.INSTANCE.dataType2Id.containsKey(type), "Data type is not registered"); + Preconditions.checkArgument(Registrar.get().dataType2Id.containsKey(type), "Data type is not registered"); Preconditions.checkState(!immediate.containsKey(type), "Data is already immediately added"); } diff --git a/src/main/java/mcp/mobius/waila/command/ArgumentBuilderBuilder.java b/src/main/java/mcp/mobius/waila/command/ArgumentBuilderBuilder.java index f5213be15..cced08ffc 100644 --- a/src/main/java/mcp/mobius/waila/command/ArgumentBuilderBuilder.java +++ b/src/main/java/mcp/mobius/waila/command/ArgumentBuilderBuilder.java @@ -2,6 +2,7 @@ import java.util.ArrayDeque; import java.util.Deque; +import java.util.function.Consumer; import java.util.function.Predicate; import com.google.common.base.Preconditions; @@ -23,6 +24,11 @@ public ArgumentBuilderBuilder(LiteralArgumentBuilder root) { deque.push(root); } + public ArgumentBuilderBuilder then(Consumer> builder) { + builder.accept(this); + return this; + } + public ArgumentBuilderBuilder then(ArgumentBuilder builder) { deque.push(builder); return this; diff --git a/src/main/java/mcp/mobius/waila/command/ClientCommand.java b/src/main/java/mcp/mobius/waila/command/ClientCommand.java index bc5b92bb0..134f2e5de 100644 --- a/src/main/java/mcp/mobius/waila/command/ClientCommand.java +++ b/src/main/java/mcp/mobius/waila/command/ClientCommand.java @@ -3,12 +3,8 @@ import java.util.Arrays; import com.google.gson.JsonPrimitive; -import com.mojang.brigadier.CommandDispatcher; -import com.mojang.brigadier.arguments.ArgumentType; import com.mojang.brigadier.arguments.BoolArgumentType; import com.mojang.brigadier.arguments.StringArgumentType; -import com.mojang.brigadier.builder.LiteralArgumentBuilder; -import com.mojang.brigadier.builder.RequiredArgumentBuilder; import mcp.mobius.waila.Waila; import mcp.mobius.waila.WailaClient; import mcp.mobius.waila.api.WailaConstants; @@ -16,6 +12,8 @@ import mcp.mobius.waila.config.ConfigEntry; import mcp.mobius.waila.config.PluginConfig; import mcp.mobius.waila.gui.screen.HomeScreen; +import mcp.mobius.waila.plugin.PluginInfo; +import mcp.mobius.waila.plugin.PluginLoader; import net.minecraft.client.Minecraft; import net.minecraft.commands.arguments.ResourceLocationArgument; import net.minecraft.network.chat.Component; @@ -24,22 +22,28 @@ import static net.minecraft.commands.SharedSuggestionProvider.suggest; import static net.minecraft.commands.SharedSuggestionProvider.suggestResource; -public abstract class ClientCommand { +public abstract class ClientCommand extends CommonCommand { - private final ArgumentBuilderFactory argument; - - protected ClientCommand(ArgumentBuilderFactory argument) { - this.argument = argument; + public ClientCommand() { + super(WailaConstants.NAMESPACE + "c"); } - protected abstract FeedbackSender feedback(S source); + @Override + protected boolean pluginCommandRequirement(S source) { + return !Minecraft.getInstance().hasSingleplayerServer(); + } - public final void register(CommandDispatcher dispatcher) { - var command = new ArgumentBuilderBuilder<>(argument.literal(WailaConstants.NAMESPACE + "c")) + @Override + protected boolean isPluginDisabledOnServer(PluginInfo plugin) { + return plugin.isDisabledOnServer(); + } - .then(argument.literal("config")) + @Override + protected final void register(ArgumentBuilderBuilder command) { + command + .then(literal("config")) - .then(argument.literal("open")) + .then(literal("open")) .executes(context -> { var client = Minecraft.getInstance(); client.tell(() -> client.setScreen(new HomeScreen(client.screen))); @@ -48,30 +52,30 @@ public final void register(CommandDispatcher dispatcher) { .pop("open") - .then(argument.literal("plugin")) + .then(literal("plugin")) - .then(argument.required("id", ResourceLocationArgument.id())) + .then(argument("id", ResourceLocationArgument.id())) .suggests((context, builder) -> suggestResource(PluginConfig.getAllKeys(), builder)) .executes(context -> { - var feedback = feedback(context.getSource()); + var source = context.getSource(); var id = context.getArgument("id", ResourceLocation.class); ConfigEntry entry = PluginConfig.getEntry(id); if (entry == null) { - feedback.fail(Component.translatable(Tl.Command.Config.UNKNOWN_ID, id)); + fail(source, Component.translatable(Tl.Command.Config.UNKNOWN_ID, id)); return 0; } - feedback.success(Component.translatable(Tl.Command.Config.Get.ID, id)); - feedback.success(Component.translatable(Tl.Command.Config.Get.SYNCED, entry.isSynced())); - feedback.success(Component.translatable(Tl.Command.Config.Get.CURRENT_VALUE, entry.getValue(false).toString())); - feedback.success(Component.translatable(Tl.Command.Config.Get.DEFAULT_VALUE, entry.getDefaultValue().toString())); + success(source, () -> Component.translatable(Tl.Command.Config.Get.ID, id)); + success(source, () -> Component.translatable(Tl.Command.Config.Get.SYNCED, entry.isSynced())); + success(source, () -> Component.translatable(Tl.Command.Config.Get.CURRENT_VALUE, entry.getValue(false).toString())); + success(source, () -> Component.translatable(Tl.Command.Config.Get.DEFAULT_VALUE, entry.getDefaultValue().toString())); if (entry.isServerRequired()) { - feedback.success(Component.translatable(Tl.Command.Config.Get.CLIENT_ONLY_VALUE, entry.getClientOnlyValue().toString())); + success(source, () -> Component.translatable(Tl.Command.Config.Get.CLIENT_ONLY_VALUE, entry.getClientOnlyValue().toString())); } return 1; }) - .then(argument.required("value", StringArgumentType.word())) + .then(argument("value", StringArgumentType.word())) .suggests((context, builder) -> { var id = context.getArgument("id", ResourceLocation.class); var entry = PluginConfig.getEntry(id); @@ -88,25 +92,25 @@ public final void register(CommandDispatcher dispatcher) { return suggest(new String[0], builder); }) .executes(context -> { - var feedback = feedback(context.getSource()); + var source = context.getSource(); var id = context.getArgument("id", ResourceLocation.class); var entry = PluginConfig.getEntry(id); if (entry == null) { - feedback.fail(Component.translatable(Tl.Command.Config.UNKNOWN_ID, id)); + fail(source, Component.translatable(Tl.Command.Config.UNKNOWN_ID, id)); return 0; } if (entry.blocksClientEdit() && Minecraft.getInstance().getCurrentServer() != null) { - feedback.fail(Component.translatable(Tl.Command.Config.Set.SYNCED, id)); + fail(source, Component.translatable(Tl.Command.Config.Set.SYNCED, id)); } var jsonValue = new JsonPrimitive(context.getArgument("value", String.class)); try { entry.setLocalValue(entry.getType().parser.apply(jsonValue, entry.getDefaultValue())); - feedback.success(Component.translatable(Tl.Command.Config.Set.SUCCESS, id, entry.getLocalValue())); + success(source, () -> Component.translatable(Tl.Command.Config.Set.SUCCESS, id, entry.getLocalValue())); return 1; } catch (Throwable throwable) { - feedback.fail(Component.translatable(Tl.Command.Config.Set.PARSE_FAIL, throwable.getMessage())); + fail(source, Component.translatable(Tl.Command.Config.Set.PARSE_FAIL, throwable.getMessage())); throwable.printStackTrace(); return 0; } @@ -114,66 +118,57 @@ public final void register(CommandDispatcher dispatcher) { .pop("value", "id", "plugin", "config") - .then(argument.literal("overlay")) - .then(argument.required("enabled", BoolArgumentType.bool())) + .then(literal("overlay")) + .then(argument("enabled", BoolArgumentType.bool())) .suggests((context, builder) -> suggest(new String[]{String.valueOf(!Waila.CONFIG.get().getGeneral().isDisplayTooltip())}, builder)) .executes(context -> { - var feedback = feedback(context.getSource()); + var source = context.getSource(); var enabled = BoolArgumentType.getBool(context, "enabled"); Waila.CONFIG.get().getGeneral().setDisplayTooltip(enabled); - feedback.success(Component.translatable(enabled ? Tl.Command.Overlay.TRUE : Tl.Command.Overlay.FALSE)); + success(source, () -> Component.translatable(enabled ? Tl.Command.Overlay.TRUE : Tl.Command.Overlay.FALSE)); return enabled ? 1 : 0; }) .pop("enabled", "overlay"); if (Waila.ENABLE_DEBUG_COMMAND) command - .then(argument.literal("debug")) + .then(literal("debug")) - .then(argument.literal("showComponentBounds")) - .then(argument.required("enabled", BoolArgumentType.bool())) + .then(literal("showComponentBounds")) + .then(argument("enabled", BoolArgumentType.bool())) .suggests((context, builder) -> suggest(new String[]{String.valueOf(!WailaClient.showComponentBounds)}, builder)) .executes(context -> { - var feedback = feedback(context.getSource()); + var source = context.getSource(); var enabled = BoolArgumentType.getBool(context, "enabled"); Minecraft.getInstance().execute(() -> WailaClient.showComponentBounds = enabled); - feedback.success(Component.literal((enabled ? "En" : "Dis") + "abled component bounds")); + success(source, () -> Component.literal((enabled ? "En" : "Dis") + "abled component bounds")); return enabled ? 1 : 0; }) .pop("enabled", "showComponentBounds") - .then(argument.literal("showFps")) - .then(argument.required("enabled", BoolArgumentType.bool())) + .then(literal("showFps")) + .then(argument("enabled", BoolArgumentType.bool())) .suggests((context, builder) -> suggest(new String[]{String.valueOf(!WailaClient.showFps)}, builder)) .executes(context -> { - var feedback = feedback(context.getSource()); + var source = context.getSource(); var enabled = BoolArgumentType.getBool(context, "enabled"); Minecraft.getInstance().execute(() -> WailaClient.showFps = enabled); - feedback.success(Component.literal((enabled ? "En" : "Dis") + "abled FPS display")); + success(source, () -> Component.literal((enabled ? "En" : "Dis") + "abled FPS display")); return enabled ? 1 : 0; }) .pop("enabled", "showFps") .pop("debug"); - - command.register(dispatcher); } - protected interface ArgumentBuilderFactory { - - LiteralArgumentBuilder literal(String name); - - RequiredArgumentBuilder required(String name, ArgumentType type); - + @Override + protected Minecraft getExecutor(S source) { + return Minecraft.getInstance(); } - protected interface FeedbackSender { - - void success(Component message); - - void fail(Component message); - + @Override + protected void reloadPlugins(Minecraft executor) { + PluginLoader.reloadClientPlugins(); } - } diff --git a/src/main/java/mcp/mobius/waila/command/CommonCommand.java b/src/main/java/mcp/mobius/waila/command/CommonCommand.java new file mode 100644 index 000000000..eb9740716 --- /dev/null +++ b/src/main/java/mcp/mobius/waila/command/CommonCommand.java @@ -0,0 +1,163 @@ +package mcp.mobius.waila.command; + +import java.util.concurrent.Executor; +import java.util.function.Supplier; +import java.util.stream.Stream; + +import com.mojang.brigadier.CommandDispatcher; +import com.mojang.brigadier.arguments.ArgumentType; +import com.mojang.brigadier.builder.LiteralArgumentBuilder; +import com.mojang.brigadier.builder.RequiredArgumentBuilder; +import com.mojang.brigadier.context.CommandContext; +import com.mojang.brigadier.suggestion.SuggestionProvider; +import mcp.mobius.waila.api.IPluginInfo; +import mcp.mobius.waila.buildconst.Tl; +import mcp.mobius.waila.plugin.PluginInfo; +import net.minecraft.ChatFormatting; +import net.minecraft.commands.arguments.ResourceLocationArgument; +import net.minecraft.network.chat.Component; +import net.minecraft.network.chat.ComponentUtils; +import net.minecraft.network.chat.HoverEvent; +import net.minecraft.resources.ResourceLocation; + +import static net.minecraft.commands.SharedSuggestionProvider.suggestResource; + +public abstract class CommonCommand { + + private final String root; + + protected CommonCommand(String root) { + this.root = root; + } + + protected abstract void register(ArgumentBuilderBuilder command); + + protected abstract LiteralArgumentBuilder literal(String name); + + protected abstract RequiredArgumentBuilder argument(String name, ArgumentType type); + + protected abstract void success(S source, Supplier msg); + + protected abstract void fail(S source, Component msg); + + protected abstract E getExecutor(S source); + + protected abstract void reloadPlugins(E executor); + + protected abstract boolean pluginCommandRequirement(S source); + + protected boolean isPluginDisabledOnServer(PluginInfo plugin) { + return false; + } + + public final void register(CommandDispatcher dispatcher) { + new ArgumentBuilderBuilder<>(literal(root)) + .then(literal("plugin")) + .requires(this::pluginCommandRequirement) + + .then(literal("list")) + .executes(context -> { + var source = context.getSource(); + return listPlugins(source, true) + listPlugins(source, false); + }) + + .then(literal("enabled")) + .executes(context -> listPlugins(context.getSource(), true)) + .pop("enabled") + + .then(literal("available")) + .executes(context -> listPlugins(context.getSource(), false)) + .pop("available") + .pop("list") + + .then(literal("enable")) + .then(argument("name", ResourceLocationArgument.id())) + .suggests(suggestPlugins(false)) + .executes(context -> modifyPlugin(context, true)) + .pop("name", "enable") + + .then(literal("disable")) + .then(argument("name", ResourceLocationArgument.id())) + .suggests(suggestPlugins(true)) + .executes(context -> modifyPlugin(context, false)) + .pop("name", "disable") + + .then(literal("reload")) + .executes(context -> { + var source = context.getSource(); + var executor = getExecutor(source); + + executor.execute(() -> reloadPlugins(executor)); + success(source, () -> Component.translatable(Tl.Command.Plugin.RELOAD)); + return 1; + }) + .pop("reload") + + .pop("plugin") + + .then(this::register) + .register(dispatcher); + } + + private Stream getPlugins(boolean enabled) { + return PluginInfo.getAll().stream().filter(it -> enabled == it.isEnabled()); + } + + private int listPlugins(S source, boolean enabled) { + var plugins = getPlugins(enabled).toList(); + + if (plugins.isEmpty()) success(source, () -> Component.translatable( + enabled ? Tl.Command.Plugin.List.Enabled.NONE : Tl.Command.Plugin.List.Available.NONE)); + else success(source, () -> Component.translatable( + enabled ? Tl.Command.Plugin.List.Enabled.SUCCESS : Tl.Command.Plugin.List.Available.SUCCESS, + plugins.size(), + ComponentUtils.formatList(plugins, p -> ComponentUtils.wrapInSquareBrackets(Component.literal(p.getPluginId().toString())).withStyle(s -> s + .withColor(enabled ? ChatFormatting.GREEN : ChatFormatting.RED) + .withHoverEvent(new HoverEvent(HoverEvent.Action.SHOW_TEXT, Component.empty().append(p.getModInfo().getName())))) + ))); + + return plugins.size(); + } + + private SuggestionProvider suggestPlugins(boolean enabled) { + return (context, builder) -> suggestResource(getPlugins(enabled) + .map(it -> (PluginInfo) it) + .filter(it -> !it.isLocked() && !isPluginDisabledOnServer(it)) + .map(IPluginInfo::getPluginId), builder); + } + + private int modifyPlugin(CommandContext context, boolean enable) { + var source = context.getSource(); + var executor = getExecutor(source); + + var id = context.getArgument("name", ResourceLocation.class); + var name = id.toString(); + + var plugin = (PluginInfo) PluginInfo.get(id); + if (plugin == null) { + fail(source, Component.translatable(Tl.Command.Plugin.UNKNOWN, name)); + return 0; + } + + if (plugin.isLocked()) { + fail(source, Component.translatable(Tl.Command.Plugin.LOCKED, name)); + return 0; + } + + if (isPluginDisabledOnServer(plugin)) { + fail(source, Component.translatable(Tl.Command.Plugin.DISABLED_ON_SERVER, name)); + return 0; + } + + executor.execute(() -> { + plugin.setEnabled(enable); + reloadPlugins(executor); + }); + + success(source, () -> Component.translatable( + enable ? Tl.Command.Plugin.Modify.ENABLE : Tl.Command.Plugin.Modify.DISABLE, + name)); + return 1; + } + +} diff --git a/src/main/java/mcp/mobius/waila/command/ServerCommand.java b/src/main/java/mcp/mobius/waila/command/ServerCommand.java index 65f949fe9..bb4a8acd7 100644 --- a/src/main/java/mcp/mobius/waila/command/ServerCommand.java +++ b/src/main/java/mcp/mobius/waila/command/ServerCommand.java @@ -1,7 +1,11 @@ package mcp.mobius.waila.command; -import com.mojang.brigadier.CommandDispatcher; +import java.util.function.Supplier; + +import com.mojang.brigadier.arguments.ArgumentType; import com.mojang.brigadier.arguments.StringArgumentType; +import com.mojang.brigadier.builder.LiteralArgumentBuilder; +import com.mojang.brigadier.builder.RequiredArgumentBuilder; import lol.bai.badpackets.api.PacketSender; import mcp.mobius.waila.Waila; import mcp.mobius.waila.api.WailaConstants; @@ -9,21 +13,33 @@ import mcp.mobius.waila.debug.DumpGenerator; import mcp.mobius.waila.mixin.BaseContainerBlockEntityAccess; import mcp.mobius.waila.network.play.s2c.GenerateClientDumpPlayS2CPacket; +import mcp.mobius.waila.plugin.PluginLoader; import net.minecraft.commands.CommandSourceStack; import net.minecraft.commands.Commands; import net.minecraft.commands.arguments.coordinates.BlockPosArgument; import net.minecraft.network.chat.ClickEvent; import net.minecraft.network.chat.Component; +import net.minecraft.server.MinecraftServer; import net.minecraft.server.level.ServerPlayer; import net.minecraft.world.InteractionHand; import net.minecraft.world.LockCode; import net.minecraft.world.item.ItemStack; import net.minecraft.world.item.Items; -public class ServerCommand { +public class ServerCommand extends CommonCommand { + + public ServerCommand() { + super(WailaConstants.NAMESPACE); + } + + @Override + protected boolean pluginCommandRequirement(CommandSourceStack source) { + return source.hasPermission(Commands.LEVEL_ADMINS); + } - public static void register(CommandDispatcher dispatcher) { - var command = new ArgumentBuilderBuilder<>(Commands.literal(WailaConstants.NAMESPACE)) + @Override + protected void register(ArgumentBuilderBuilder command) { + command .then(Commands.literal("dump")) .requires(source -> source.hasPermission(Commands.LEVEL_ADMINS)) .executes(context -> { @@ -45,7 +61,6 @@ public static void register(CommandDispatcher dispatcher) { return 0; } }) - .pop("dump"); if (Waila.ENABLE_DEBUG_COMMAND) command @@ -72,7 +87,7 @@ public static void register(CommandDispatcher dispatcher) { source.sendSuccess(() -> Component.literal("Locked container " + pos.toShortString() + " with lock \"" + lock + "\""), false); return 1; } else { - source.sendFailure(Component.literal("Couldn't lock container "+pos.toShortString())); + source.sendFailure(Component.literal("Couldn't lock container " + pos.toShortString())); } return 0; @@ -80,8 +95,36 @@ public static void register(CommandDispatcher dispatcher) { .pop("lock", "pos", "lockContainer") .pop("debug"); + } + + @Override + protected LiteralArgumentBuilder literal(String name) { + return Commands.literal(name); + } + + @Override + protected RequiredArgumentBuilder argument(String name, ArgumentType type) { + return Commands.argument(name, type); + } + + @Override + protected void success(CommandSourceStack source, Supplier msg) { + source.sendSuccess(msg, false); + } + + @Override + protected void fail(CommandSourceStack source, Component msg) { + source.sendFailure(msg); + } + + @Override + protected MinecraftServer getExecutor(CommandSourceStack source) { + return source.getServer(); + } - command.register(dispatcher); + @Override + protected void reloadPlugins(MinecraftServer executor) { + PluginLoader.reloadServerPlugins(executor); } } diff --git a/src/main/java/mcp/mobius/waila/config/BlacklistConfig.java b/src/main/java/mcp/mobius/waila/config/BlacklistConfig.java index c3a5a089f..33ee7198f 100644 --- a/src/main/java/mcp/mobius/waila/config/BlacklistConfig.java +++ b/src/main/java/mcp/mobius/waila/config/BlacklistConfig.java @@ -114,8 +114,8 @@ public JsonElement serialize(BlacklistConfig src, Type typeOfSrc, JsonSerializat var object = new JsonObject(); var comments = """ - On the SERVER, changes will be applied after the server is restarted - On the CLIENT, changes will be applied after player quit and rejoin a world + Run /waila reload to apply changes server-wide. + Run /wailac reload to apply changes to only your client. Rule Operators: @namespace - Filter objects based on their namespace location diff --git a/src/main/java/mcp/mobius/waila/config/ConfigEntry.java b/src/main/java/mcp/mobius/waila/config/ConfigEntry.java index 440dd1ff8..4abbd0c1d 100644 --- a/src/main/java/mcp/mobius/waila/config/ConfigEntry.java +++ b/src/main/java/mcp/mobius/waila/config/ConfigEntry.java @@ -7,6 +7,7 @@ import com.google.common.base.Preconditions; import com.google.gson.JsonPrimitive; +import mcp.mobius.waila.api.IPluginInfo; import net.minecraft.resources.ResourceLocation; import org.jetbrains.annotations.Nullable; @@ -20,6 +21,7 @@ public class ConfigEntry { public static final Type> ENUM = new Type<>((e, d) -> Enum.valueOf(d.getDeclaringClass(), e.getAsString()), e -> new JsonPrimitive(e.name())); public static final Type PATH = new Type<>((e, d) -> null, e -> null); + private final IPluginInfo origin; private final ResourceLocation id; private final T defaultValue; private final T clientOnlyValue; @@ -31,7 +33,8 @@ public class ConfigEntry { private T serverValue; private T localValue; - private ConfigEntry(ResourceLocation id, T defaultValue, T clientOnlyValue, boolean serverRequired, boolean merged, Type type) { + private ConfigEntry(IPluginInfo origin, ResourceLocation id, T defaultValue, T clientOnlyValue, boolean serverRequired, boolean merged, Type type) { + this.origin = origin; this.id = id; this.defaultValue = defaultValue; this.localValue = defaultValue; @@ -45,6 +48,10 @@ public Type getType() { return type; } + public IPluginInfo getOrigin() { + return origin; + } + public ResourceLocation getId() { return id; } @@ -125,8 +132,8 @@ public Type(BiFunction parser, Function s this.serializer = serializer; } - public ConfigEntry create(ResourceLocation id, T defaultValue, T clientOnlyValue, boolean serverRequired, boolean merged) { - return new ConfigEntry<>(id, defaultValue, clientOnlyValue, serverRequired, merged, this); + public ConfigEntry create(IPluginInfo origin, ResourceLocation id, T defaultValue, T clientOnlyValue, boolean serverRequired, boolean merged) { + return new ConfigEntry<>(origin, id, defaultValue, clientOnlyValue, serverRequired, merged, this); } } diff --git a/src/main/java/mcp/mobius/waila/config/JsonConfig.java b/src/main/java/mcp/mobius/waila/config/JsonConfig.java index d3dc6ccd5..209641ca0 100644 --- a/src/main/java/mcp/mobius/waila/config/JsonConfig.java +++ b/src/main/java/mcp/mobius/waila/config/JsonConfig.java @@ -1,6 +1,7 @@ package mcp.mobius.waila.config; import java.io.File; +import java.lang.reflect.Type; import java.nio.file.Files; import java.nio.file.Path; import java.nio.file.Paths; @@ -11,11 +12,13 @@ import java.util.function.Supplier; import java.util.function.ToIntFunction; +import com.google.common.base.Preconditions; import com.google.gson.Gson; import com.google.gson.GsonBuilder; import mcp.mobius.waila.Waila; import mcp.mobius.waila.api.IJsonConfig; import mcp.mobius.waila.mcless.config.ConfigIo; +import mcp.mobius.waila.util.CachedSupplier; import mcp.mobius.waila.util.Log; import org.jetbrains.annotations.Nullable; @@ -36,7 +39,7 @@ public class JsonConfig implements IJsonConfig { private final ConfigIo io; private final CachedSupplier getter; - JsonConfig(Path path, Class clazz, Supplier factory, Gson gson, int currentVersion, ToIntFunction versionGetter, ObjIntConsumer versionSetter) { + JsonConfig(Path path, Type clazz, Supplier factory, Gson gson, int currentVersion, ToIntFunction versionGetter, ObjIntConsumer versionSetter) { this.path = path.toAbsolutePath(); this.io = new ConfigIo<>(LOG::warn, LOG::error, gson, clazz, factory, currentVersion, versionGetter, versionSetter); this.getter = new CachedSupplier<>(() -> io.read(this.path)); @@ -93,7 +96,7 @@ public void backup(@Nullable String cause) { public static class Builder implements Builder0, Builder1 { - final Class clazz; + final Type type; Path path; Gson gson; int currentVersion; @@ -102,15 +105,16 @@ public static class Builder implements Builder0, Builder1 { Supplier factory; @SuppressWarnings("unchecked") - public Builder(Class clazz) { - this.clazz = clazz; + public Builder(Type type) { + this.type = type; this.gson = DEFAULT_GSON; this.currentVersion = 0; this.versionGetter = DEFAULT_VERSION_GETTER; this.versionSetter = DEFAULT_VERSION_SETTER; - this.factory = () -> { + + if (type instanceof Class clazz) this.factory = () -> { try { - return clazz.getConstructor().newInstance(); + return (T) clazz.getConstructor().newInstance(); } catch (Exception e) { throw new RuntimeException("Failed to create new config instance", e); } @@ -157,26 +161,8 @@ public Builder1 gson(Gson gson) { @Override public IJsonConfig build() { - return new JsonConfig<>(path, clazz, factory, gson, currentVersion, versionGetter, versionSetter); - } - - } - - static class CachedSupplier { - - private final Supplier supplier; - private T value; - - public CachedSupplier(Supplier supplier) { - this.supplier = supplier; - } - - public T get() { - return value == null ? value = supplier.get() : value; - } - - public void invalidate() { - this.value = null; + Preconditions.checkNotNull(factory, "Default value factory must not be null"); + return new JsonConfig<>(path, type, factory, gson, currentVersion, versionGetter, versionSetter); } } diff --git a/src/main/java/mcp/mobius/waila/config/PluginConfig.java b/src/main/java/mcp/mobius/waila/config/PluginConfig.java index 71c4d0d8a..69888ce3d 100644 --- a/src/main/java/mcp/mobius/waila/config/PluginConfig.java +++ b/src/main/java/mcp/mobius/waila/config/PluginConfig.java @@ -8,6 +8,7 @@ import java.util.Map; import java.util.Set; import java.util.stream.Collectors; +import java.util.stream.Stream; import com.google.gson.GsonBuilder; import com.google.gson.JsonPrimitive; @@ -34,20 +35,25 @@ public enum PluginConfig implements IPluginConfig { }.getType(), LinkedHashMap::new); - public static final Map> CONFIGS = new LinkedHashMap<>(); + private static final Map> CONFIGS = new LinkedHashMap<>(); public static void addConfig(ConfigEntry entry) { CONFIGS.put(entry.getId(), entry); } + private static Stream getKeyStream() { + return CONFIGS.keySet().stream() + .filter(it -> getEntry(it).getOrigin().isEnabled()); + } + public static Set getAllKeys(String namespace) { - return getAllKeys().stream() + return getKeyStream() .filter(id -> id.getNamespace().equals(namespace)) .collect(Collectors.toCollection(LinkedHashSet::new)); } public static Set getAllKeys() { - return CONFIGS.keySet(); + return getKeyStream().collect(Collectors.toCollection(LinkedHashSet::new)); } public static Set> getSyncableConfigs() { @@ -110,9 +116,11 @@ private static void writeConfig() { } private T getValue(ResourceLocation key, T defaultValue) { - return CONFIGS.containsKey(key) - ? (T) CONFIGS.get(key).getValue(this == SERVER) - : defaultValue; + var entry = CONFIGS.get(key); + if (entry != null && entry.getOrigin().isEnabled()) { + return (T) entry.getValue(this == SERVER); + } + return defaultValue; } @Override diff --git a/src/main/java/mcp/mobius/waila/debug/DumpGenerator.java b/src/main/java/mcp/mobius/waila/debug/DumpGenerator.java index 2a3910ad8..6d70f681d 100644 --- a/src/main/java/mcp/mobius/waila/debug/DumpGenerator.java +++ b/src/main/java/mcp/mobius/waila/debug/DumpGenerator.java @@ -37,7 +37,7 @@ public static Path generate(String name) { var builder = new StringBuilder("# Waila Dump"); - var registrar = Registrar.INSTANCE; + var registrar = Registrar.get(); builder.append("\n## Versions"); builder.append("\n| Dependency | Version |"); diff --git a/src/main/java/mcp/mobius/waila/gui/hud/ComponentHandler.java b/src/main/java/mcp/mobius/waila/gui/hud/ComponentHandler.java index 586249fdb..41489fe00 100644 --- a/src/main/java/mcp/mobius/waila/gui/hud/ComponentHandler.java +++ b/src/main/java/mcp/mobius/waila/gui/hud/ComponentHandler.java @@ -25,7 +25,7 @@ public class ComponentHandler { public static void requestBlockData(ClientAccessor accessor) { - var registrar = Registrar.INSTANCE; + var registrar = Registrar.get(); var block = accessor.getBlock(); var blockEntity = accessor.getBlockEntity(); @@ -62,7 +62,7 @@ public static void gatherBlock(ClientAccessor accessor, Tooltip tooltip, Tooltip @SuppressWarnings("DuplicatedCode") private static void handleBlock(ClientAccessor accessor, Tooltip tooltip, Object obj, TooltipPosition position) { - var registrar = Registrar.INSTANCE; + var registrar = Registrar.get(); var providers = registrar.blockComponent.get(position).get(obj); for (var entry : providers) { var provider = entry.instance(); @@ -79,7 +79,7 @@ private static void handleBlock(ClientAccessor accessor, Tooltip tooltip, Object } public static void requestEntityData(Entity entity, ClientAccessor accessor) { - var registrar = Registrar.INSTANCE; + var registrar = Registrar.get(); var trueEntity = accessor.getEntity(); var rate = Waila.CONFIG.get().getGeneral().getRateLimit(); @@ -103,7 +103,7 @@ public static void requestEntityData(Entity entity, ClientAccessor accessor) { @SuppressWarnings("DuplicatedCode") public static void gatherEntity(Entity entity, ClientAccessor accessor, Tooltip tooltip, TooltipPosition position) { - var registrar = Registrar.INSTANCE; + var registrar = Registrar.get(); var providers = registrar.entityComponent.get(position).get(entity); for (var entry : providers) { @@ -121,7 +121,7 @@ public static void gatherEntity(Entity entity, ClientAccessor accessor, Tooltip } public static ITooltipComponent getIcon(HitResult target) { - var registrar = Registrar.INSTANCE; + var registrar = Registrar.get(); var data = ClientAccessor.INSTANCE; var config = PluginConfig.CLIENT; @@ -173,7 +173,7 @@ public static Entity getOverrideEntity(HitResult target) { return null; } - var registrar = Registrar.INSTANCE; + var registrar = Registrar.get(); var entity = ((EntityHitResult) target).getEntity(); var overrideProviders = registrar.entityOverride.get(entity); @@ -188,7 +188,7 @@ public static Entity getOverrideEntity(HitResult target) { } public static BlockState getOverrideBlock(HitResult target) { - var registrar = Registrar.INSTANCE; + var registrar = Registrar.get(); Level world = Minecraft.getInstance().level; if (world == null) return null; diff --git a/src/main/java/mcp/mobius/waila/gui/hud/TooltipHandler.java b/src/main/java/mcp/mobius/waila/gui/hud/TooltipHandler.java index 7cdfec670..34468dc6c 100644 --- a/src/main/java/mcp/mobius/waila/gui/hud/TooltipHandler.java +++ b/src/main/java/mcp/mobius/waila/gui/hud/TooltipHandler.java @@ -66,14 +66,14 @@ public static void tick() { Vec3 castOrigin = null; Vec3 castDirection = null; - var picker = Registrar.INSTANCE.picker; + var picker = Registrar.get().picker; if (picker != null) { // TODO: remove castOrigin = camera.getEyePosition(frameTime); castDirection = camera.getViewVector(frameTime); picker.pick(PickerAccessor.of(client, camera, pickRange, frameTime), results, PluginConfig.CLIENT); } else { - for (var entry : Registrar.INSTANCE.raycastVectorProviders.get(Object.class)) { + for (var entry : Registrar.get().raycastVectorProviders.get(Object.class)) { var provider = entry.instance(); if (!provider.isEnabled(PluginConfig.CLIENT)) continue; diff --git a/src/main/java/mcp/mobius/waila/gui/hud/TooltipRenderer.java b/src/main/java/mcp/mobius/waila/gui/hud/TooltipRenderer.java index ea9d8c01a..4cfd5bb74 100644 --- a/src/main/java/mcp/mobius/waila/gui/hud/TooltipRenderer.java +++ b/src/main/java/mcp/mobius/waila/gui/hud/TooltipRenderer.java @@ -99,7 +99,7 @@ public static Rectangle endBuild() { Preconditions.checkState(started); if (state.fireEvent()) { - for (var listener : Registrar.INSTANCE.eventListeners.get(Object.class)) { + for (var listener : Registrar.get().eventListeners.get(Object.class)) { listener.instance().onHandleTooltip(TOOLTIP, ClientAccessor.INSTANCE, PluginConfig.CLIENT); } } @@ -268,7 +268,7 @@ private static void render0(Minecraft client, GuiGraphics ctx, float delta) { if (state.fireEvent()) { var canceller = EventCanceller.INSTANCE; canceller.setCanceled(false); - for (var listener : Registrar.INSTANCE.eventListeners.get(Object.class)) { + for (var listener : Registrar.get().eventListeners.get(Object.class)) { listener.instance().onBeforeTooltipRender(ctx, rect, ClientAccessor.INSTANCE, PluginConfig.CLIENT, canceller); if (canceller.isCanceled()) { ctx.pose().popPose(); @@ -305,7 +305,7 @@ private static void render0(Minecraft client, GuiGraphics ctx, float delta) { RenderSystem.disableBlend(); if (state.fireEvent()) { - for (var listener : Registrar.INSTANCE.eventListeners.get(Object.class)) { + for (var listener : Registrar.get().eventListeners.get(Object.class)) { listener.instance().onAfterTooltipRender(ctx, rect, ClientAccessor.INSTANCE, PluginConfig.CLIENT); } } diff --git a/src/main/java/mcp/mobius/waila/gui/hud/theme/ThemeDefinition.java b/src/main/java/mcp/mobius/waila/gui/hud/theme/ThemeDefinition.java index f168173b1..cb87a3b01 100644 --- a/src/main/java/mcp/mobius/waila/gui/hud/theme/ThemeDefinition.java +++ b/src/main/java/mcp/mobius/waila/gui/hud/theme/ThemeDefinition.java @@ -69,7 +69,7 @@ public static ThemeDefinition deserialize(ResourceLocation id, JsonElement js ? new ResourceLocation(object.get("type").getAsString()) : WailaConstants.THEME_TYPE_GRADIENT; - var type = Registrar.INSTANCE.themeTypes.get(typeId); + var type = Registrar.get().themeTypes.get(typeId); Map values = new HashMap<>(); type.properties.forEach((key, prop) -> { @@ -110,7 +110,7 @@ public ThemeDefinition deserialize(JsonElement json, Type typeOfT, JsonDeseri public JsonElement serialize(ThemeDefinition src, Type typeOfSrc, JsonSerializationContext context) { var object = new JsonObject(); object.addProperty("id", src.id.toString()); - object.addProperty("type", Registrar.INSTANCE.themeTypes.inverse().get(src.type).toString()); + object.addProperty("type", Registrar.get().themeTypes.inverse().get(src.type).toString()); src.type.properties.forEach((key, prop) -> { var propType = prop.type; diff --git a/src/main/java/mcp/mobius/waila/gui/hud/theme/ThemeType.java b/src/main/java/mcp/mobius/waila/gui/hud/theme/ThemeType.java index 8b77a4830..eef6e8f63 100644 --- a/src/main/java/mcp/mobius/waila/gui/hud/theme/ThemeType.java +++ b/src/main/java/mcp/mobius/waila/gui/hud/theme/ThemeType.java @@ -51,7 +51,7 @@ public T create(Map attr) { } public ResourceLocation getId() { - return Objects.requireNonNull(Registrar.INSTANCE.themeTypes.inverse().get(this)); + return Objects.requireNonNull(Registrar.get().themeTypes.inverse().get(this)); } private ThemeType property(String name, Class type, V exampleValue, C context) { diff --git a/src/main/java/mcp/mobius/waila/gui/screen/AutoClosableScreen.java b/src/main/java/mcp/mobius/waila/gui/screen/AutoClosableScreen.java index a37606b80..6b02a78df 100644 --- a/src/main/java/mcp/mobius/waila/gui/screen/AutoClosableScreen.java +++ b/src/main/java/mcp/mobius/waila/gui/screen/AutoClosableScreen.java @@ -1,8 +1,5 @@ package mcp.mobius.waila.gui.screen; -import javax.annotation.ParametersAreNonnullByDefault; - -import net.minecraft.MethodsReturnNonnullByDefault; import net.minecraft.client.Minecraft; import net.minecraft.client.gui.GuiGraphics; import net.minecraft.client.gui.screens.inventory.AbstractContainerScreen; @@ -11,9 +8,7 @@ import net.minecraft.world.inventory.AbstractContainerMenu; import net.minecraft.world.item.ItemStack; -@MethodsReturnNonnullByDefault -@ParametersAreNonnullByDefault -@SuppressWarnings("ConstantConditions") +@SuppressWarnings("DataFlowIssue") public class AutoClosableScreen extends AbstractContainerScreen { private AutoClosableScreen() { diff --git a/src/main/java/mcp/mobius/waila/gui/screen/ConfigScreen.java b/src/main/java/mcp/mobius/waila/gui/screen/ConfigScreen.java index 285f3a5a9..b7d62d95e 100644 --- a/src/main/java/mcp/mobius/waila/gui/screen/ConfigScreen.java +++ b/src/main/java/mcp/mobius/waila/gui/screen/ConfigScreen.java @@ -2,23 +2,32 @@ import java.util.List; +import com.mojang.blaze3d.platform.InputConstants; +import mcp.mobius.waila.buildconst.Tl; import mcp.mobius.waila.gui.widget.ConfigListWidget; import mcp.mobius.waila.gui.widget.value.ConfigValue; +import net.minecraft.ChatFormatting; import net.minecraft.client.gui.GuiGraphics; import net.minecraft.client.gui.components.EditBox; import net.minecraft.client.gui.components.events.GuiEventListener; +import net.minecraft.client.gui.components.toasts.SystemToast; import net.minecraft.client.gui.screens.Screen; import net.minecraft.network.chat.CommonComponents; import net.minecraft.network.chat.Component; import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; import static mcp.mobius.waila.util.DisplayUtil.createButton; -public abstract class ConfigScreen extends Screen { +public abstract class ConfigScreen extends YesIAmSureTheClientInstanceIsPresentByTheTimeIUseItScreen { private final Screen parent; - private final Runnable saver; - private final Runnable canceller; + private final @Nullable Runnable saver; + private final @Nullable Runnable canceller; + + private boolean showEscWarning = true; + private long lastEscPressTime = 0; + private int escPressed = 0; @SuppressWarnings("unchecked") private final List children = (List) children(); @@ -26,7 +35,7 @@ public abstract class ConfigScreen extends Screen { protected boolean cancelled; - public ConfigScreen(Screen parent, Component title, Runnable saver, Runnable canceller) { + public ConfigScreen(Screen parent, Component title, @Nullable Runnable saver, @Nullable Runnable canceller) { super(title); this.parent = parent; @@ -119,11 +128,40 @@ public boolean mouseClicked(double mouseX, double mouseY, int button) { @Override public boolean shouldCloseOnEsc() { + if (showEscWarning) { + var now = System.currentTimeMillis(); + if ((now - lastEscPressTime) > 2 * 1000) { + escPressed = 0; + } + + lastEscPressTime = now; + escPressed++; + if (escPressed > 5) { + minecraft.getToasts().addToast(new SystemToast( + SystemToast.SystemToastId.PACK_COPY_FAILURE, + Component.translatable(Tl.Gui.EscWarning.UMM), + Component.translatable(Tl.Gui.EscWarning.LMAO, + CommonComponents.GUI_DONE.copy().withStyle(ChatFormatting.GOLD), + CommonComponents.GUI_CANCEL.copy().withStyle(ChatFormatting.DARK_PURPLE)) + )); + showEscWarning = false; + escPressed = 0; + } + } + return false; } @Override - @SuppressWarnings("ConstantConditions") + public boolean keyReleased(int keyCode, int scanCode, int modifiers) { + if (keyCode == InputConstants.KEY_ESCAPE) { + showEscWarning = true; + } + + return super.keyReleased(keyCode, scanCode, modifiers); + } + + @Override public void onClose() { minecraft.setScreen(parent); } diff --git a/src/main/java/mcp/mobius/waila/gui/screen/CreditsScreen.java b/src/main/java/mcp/mobius/waila/gui/screen/CreditsScreen.java index 2758815ab..fd9e006f8 100644 --- a/src/main/java/mcp/mobius/waila/gui/screen/CreditsScreen.java +++ b/src/main/java/mcp/mobius/waila/gui/screen/CreditsScreen.java @@ -23,7 +23,7 @@ import static mcp.mobius.waila.util.DisplayUtil.createButton; -public class CreditsScreen extends Screen { +public class CreditsScreen extends YesIAmSureTheClientInstanceIsPresentByTheTimeIUseItScreen { private final Screen parent; @@ -34,7 +34,6 @@ protected CreditsScreen(Screen parent) { } @Override - @SuppressWarnings("ConstantConditions") protected void init() { super.init(); @@ -70,7 +69,6 @@ public void render(@NotNull GuiGraphics ctx, int mouseX, int mouseY, float parti } @Override - @SuppressWarnings("ConstantConditions") public void onClose() { minecraft.setScreen(parent); } diff --git a/src/main/java/mcp/mobius/waila/gui/screen/HomeScreen.java b/src/main/java/mcp/mobius/waila/gui/screen/HomeScreen.java index 63d128165..985785e52 100644 --- a/src/main/java/mcp/mobius/waila/gui/screen/HomeScreen.java +++ b/src/main/java/mcp/mobius/waila/gui/screen/HomeScreen.java @@ -10,7 +10,7 @@ import static mcp.mobius.waila.util.DisplayUtil.createButton; -public class HomeScreen extends Screen { +public class HomeScreen extends YesIAmSureTheClientInstanceIsPresentByTheTimeIUseItScreen { private final Screen parent; @@ -21,21 +21,24 @@ public HomeScreen(Screen parent) { } @Override - @SuppressWarnings("ConstantConditions") protected void init() { - addRenderableWidget(createButton(width / 2 - 100, height / 2 - 48, 200, 20, Component.translatable(Tl.Gui.WAILA_SETTINGS, WailaConstants.MOD_NAME), w -> + super.init(); + + addRenderableWidget(createButton(width / 2 - 100, height / 2 - 60, 200, 20, Component.translatable(Tl.Gui.WAILA_SETTINGS, WailaConstants.MOD_NAME), w -> minecraft.setScreen(new WailaConfigScreen(this)))); - addRenderableWidget(createButton(width / 2 - 100, height / 2 - 24, 200, 20, Component.translatable(Tl.Gui.PLUGIN_SETTINGS), w -> + addRenderableWidget(createButton(width / 2 - 100, height / 2 - 36, 200, 20, Component.translatable(Tl.Gui.Plugin.TOGGLE), w -> + minecraft.setScreen(new PluginToggleScreen(this)))); + addRenderableWidget(createButton(width / 2 - 100, height / 2 - 12, 200, 20, Component.translatable(Tl.Gui.Plugin.SETTINGS), w -> minecraft.setScreen(new PluginConfigScreen(this)))); - addRenderableWidget(createButton(width / 2 - 100, height / 2, 200, 20, Component.translatable(Tl.Gui.CREDITS), w -> + addRenderableWidget(createButton(width / 2 - 100, height / 2 + 12, 200, 20, Component.translatable(Tl.Gui.CREDITS), w -> minecraft.setScreen(new CreditsScreen(this)))); - addRenderableWidget(createButton(width / 2 - 50, height / 2 + 24, 100, 20, CommonComponents.GUI_DONE, w -> + addRenderableWidget(createButton(width / 2 - 50, height / 2 + 36, 100, 20, CommonComponents.GUI_DONE, w -> minecraft.setScreen(parent))); } @Override public void render(@NotNull GuiGraphics ctx, int x, int y, float partialTicks) { - ctx.drawCenteredString(font, title.getString(), width / 2, height / 2 - 50 - font.lineHeight, 0xFFFFFF); + ctx.drawCenteredString(font, title.getString(), width / 2, height / 2 - 62 - font.lineHeight, 0xFFFFFF); super.render(ctx, x, y, partialTicks); } diff --git a/src/main/java/mcp/mobius/waila/gui/screen/PluginConfigScreen.java b/src/main/java/mcp/mobius/waila/gui/screen/PluginConfigScreen.java index e6db22956..04a3f0e00 100644 --- a/src/main/java/mcp/mobius/waila/gui/screen/PluginConfigScreen.java +++ b/src/main/java/mcp/mobius/waila/gui/screen/PluginConfigScreen.java @@ -28,7 +28,6 @@ import net.minecraft.network.chat.Component; import net.minecraft.resources.ResourceLocation; -@SuppressWarnings({"unchecked", "rawtypes"}) public class PluginConfigScreen extends ConfigScreen { private static final String NO_CATEGORY = "no_category"; @@ -36,31 +35,34 @@ public class PluginConfigScreen extends ConfigScreen { static { register(ConfigEntry.BOOLEAN, (key, name, value, defaultValue, save) -> new BooleanValue(name, value, defaultValue, save)); - register(ConfigEntry.INTEGER, (key, name, value, defaultValue, save) -> new IntInputValue(name, value, defaultValue, save, Registrar.INSTANCE.intConfigFormats.get(key))); + register(ConfigEntry.INTEGER, (key, name, value, defaultValue, save) -> new IntInputValue(name, value, defaultValue, save, Registrar.get().intConfigFormats.get(key))); register(ConfigEntry.DOUBLE, (key, name, value, defaultValue, save) -> new InputValue<>(name, value, defaultValue, save, InputValue.DECIMAL)); register(ConfigEntry.STRING, (key, name, value, defaultValue, save) -> new InputValue<>(name, value, defaultValue, save, InputValue.ANY)); + + //noinspection rawtypes,unchecked register(ConfigEntry.ENUM, (key, name, value, defaultValue, save) -> new EnumValue(name, value.getDeclaringClass().getEnumConstants(), value, defaultValue, save)); } public PluginConfigScreen(Screen parent) { - super(parent, Component.translatable(Tl.Gui.PLUGIN_SETTINGS), PluginConfig::save, PluginConfig::reload); + super(parent, Component.translatable(Tl.Gui.Plugin.SETTINGS), PluginConfig::save, PluginConfig::reload); } + @SuppressWarnings("unchecked") private static void register(ConfigEntry.Type type, ConfigValueFunction function) { ENTRY_TO_VALUE.put((ConfigEntry.Type) type, (ConfigValueFunction) function); } @Override - @SuppressWarnings("ConstantConditions") public ConfigListWidget getOptions() { var options = new ConfigListWidget(this, minecraft, width, height, 32, height - 32, 26, PluginConfig::save); for (var namespace : PluginConfig.getNamespaces()) { var namespaceTlKey = Tl.Config.PLUGIN_ + namespace; var keys = PluginConfig.getAllKeys(namespace); + if (keys.isEmpty()) continue; options.with(new ButtonEntry(namespaceTlKey, 100, 20, w -> minecraft.setScreen(new ConfigScreen(PluginConfigScreen.this, - Component.translatable(Tl.Gui.PLUGIN_SETTINGS).append(" > ").withStyle(ChatFormatting.DARK_GRAY) + Component.translatable(Tl.Gui.Plugin.SETTINGS).append(" > ").withStyle(ChatFormatting.DARK_GRAY) .append(Component.translatable(namespaceTlKey).withStyle(ChatFormatting.WHITE))) { @Override public ConfigListWidget getOptions() { diff --git a/src/main/java/mcp/mobius/waila/gui/screen/PluginToggleScreen.java b/src/main/java/mcp/mobius/waila/gui/screen/PluginToggleScreen.java new file mode 100644 index 000000000..4e0ee07f9 --- /dev/null +++ b/src/main/java/mcp/mobius/waila/gui/screen/PluginToggleScreen.java @@ -0,0 +1,55 @@ +package mcp.mobius.waila.gui.screen; + +import mcp.mobius.waila.api.IWailaConfig; +import mcp.mobius.waila.buildconst.Tl; +import mcp.mobius.waila.gui.widget.ConfigListWidget; +import mcp.mobius.waila.gui.widget.value.BooleanValue; +import mcp.mobius.waila.plugin.PluginInfo; +import mcp.mobius.waila.plugin.PluginLoader; +import net.minecraft.client.gui.screens.Screen; +import net.minecraft.network.chat.Component; +import net.minecraft.network.chat.MutableComponent; + +public class PluginToggleScreen extends ConfigScreen { + + public PluginToggleScreen(Screen parent) { + super(parent, Component.translatable(Tl.Gui.Plugin.TOGGLE)); + } + + @Override + public ConfigListWidget getOptions() { + var options = new ConfigListWidget(this, minecraft, width, height, 32, height - 32, 26, () -> { + var integratedServer = minecraft.getSingleplayerServer(); + + if (integratedServer != null) { + PluginLoader.reloadServerPlugins(integratedServer); + } else { + PluginLoader.reloadClientPlugins(); + } + }); + + for (var plugin : PluginInfo.getAll()) { + var impl = (PluginInfo) plugin; + var toggle = new BooleanValue(null, plugin.isEnabled(), null, impl::setEnabled) { + @Override + public MutableComponent getTitle() { + return Component.literal(plugin.getPluginId().toString()); + } + + @Override + public Component getDescription() { + return IWailaConfig.get().getFormatter().modName(plugin.getModInfo().getName()); + } + }; + + if (impl.isLocked()) { + toggle.disable(Tl.Gui.Plugin.Toggle.LOCKED); + } + + options.add(toggle); + } + + return options; + } + +} diff --git a/src/main/java/mcp/mobius/waila/gui/screen/ThemeEditorScreen.java b/src/main/java/mcp/mobius/waila/gui/screen/ThemeEditorScreen.java index 80cef1290..f9fc15745 100644 --- a/src/main/java/mcp/mobius/waila/gui/screen/ThemeEditorScreen.java +++ b/src/main/java/mcp/mobius/waila/gui/screen/ThemeEditorScreen.java @@ -75,7 +75,6 @@ public void init() { } @Override - @SuppressWarnings("ConstantConditions") public ConfigListWidget getOptions() { options = new ConfigListWidget(this, minecraft, width, height, parent.buildPreview(previewState).height * 2 + 4, height - 32, 26, () -> {}); @@ -90,14 +89,14 @@ public ConfigListWidget getOptions() { if (typeVal == null) { typeVal = new CycleValue(Tl.Config.OverlayThemeEditor.TYPE, - Registrar.INSTANCE.themeTypes.keySet().stream().map(ResourceLocation::toString).sorted(String::compareToIgnoreCase).toArray(String[]::new), + Registrar.get().themeTypes.keySet().stream().map(ResourceLocation::toString).sorted(String::compareToIgnoreCase).toArray(String[]::new), type.getId().toString(), val -> {}, false) { @Override public void setValue(String value) { if (options.save(true)) { super.setValue(value); - type = Registrar.INSTANCE.themeTypes.get(new ResourceLocation(value)); + type = Registrar.get().themeTypes.get(new ResourceLocation(value)); options.children().removeIf(it -> it.category.equals(I18n.get(Tl.Config.OverlayThemeEditor.ATTRIBUTES))); addTypeProperties(options); options.init(); @@ -183,7 +182,6 @@ protected void renderForeground(GuiGraphics ctx, int rowLeft, int rowWidth, int } @Override - @SuppressWarnings("ConstantConditions") public void onClose() { if (cancelled) { TooltipRenderer.resetState(); diff --git a/src/main/java/mcp/mobius/waila/gui/screen/YesIAmSureTheClientInstanceIsPresentByTheTimeIUseItScreen.java b/src/main/java/mcp/mobius/waila/gui/screen/YesIAmSureTheClientInstanceIsPresentByTheTimeIUseItScreen.java new file mode 100644 index 000000000..87ff68029 --- /dev/null +++ b/src/main/java/mcp/mobius/waila/gui/screen/YesIAmSureTheClientInstanceIsPresentByTheTimeIUseItScreen.java @@ -0,0 +1,24 @@ +package mcp.mobius.waila.gui.screen; + +import net.minecraft.client.Minecraft; +import net.minecraft.client.gui.screens.Screen; +import net.minecraft.network.chat.Component; +import org.jetbrains.annotations.NotNull; + +@SuppressWarnings({"NotNullFieldNotInitialized", "DataFlowIssue"}) +public abstract class YesIAmSureTheClientInstanceIsPresentByTheTimeIUseItScreen extends Screen { + + @NotNull + Minecraft minecraft; + + public YesIAmSureTheClientInstanceIsPresentByTheTimeIUseItScreen(Component title) { + super(title); + } + + @Override + protected void init() { + super.init(); + this.minecraft = super.minecraft; + } + +} diff --git a/src/main/java/mcp/mobius/waila/gui/widget/ButtonEntry.java b/src/main/java/mcp/mobius/waila/gui/widget/ButtonEntry.java index c2c81a9a2..a43fa030d 100644 --- a/src/main/java/mcp/mobius/waila/gui/widget/ButtonEntry.java +++ b/src/main/java/mcp/mobius/waila/gui/widget/ButtonEntry.java @@ -38,7 +38,7 @@ public ButtonEntry(String name, String button, int width, int height, Button.OnP public void render(@NotNull GuiGraphics ctx, int index, int rowTop, int rowLeft, int width, int height, int mouseX, int mouseY, boolean hovered, float deltaTime) { super.render(ctx, index, rowTop, rowLeft, width, height, mouseX, mouseY, hovered, deltaTime); - ctx.drawString(client.font, title, rowLeft, rowTop + (height - client.font.lineHeight) / 2, 16777215); + ctx.drawString(client.font, title, rowLeft, rowTop + (height - client.font.lineHeight) / 2, 0xFFFFFF); this.button.setX(rowLeft + width - button.getWidth()); this.button.setY(rowTop + (height - button.getHeight()) / 2); this.button.render(ctx, mouseX, mouseY, deltaTime); diff --git a/src/main/java/mcp/mobius/waila/gui/widget/CategoryEntry.java b/src/main/java/mcp/mobius/waila/gui/widget/CategoryEntry.java index f996f4ef1..ae16e2077 100644 --- a/src/main/java/mcp/mobius/waila/gui/widget/CategoryEntry.java +++ b/src/main/java/mcp/mobius/waila/gui/widget/CategoryEntry.java @@ -12,7 +12,6 @@ public CategoryEntry(String title) { @Override public void render(@NotNull GuiGraphics ctx, int index, int rowTop, int rowLeft, int width, int height, int mouseX, int mouseY, boolean hovered, float deltaTime) { -// ctx.drawString(client.font, category, rowLeft, rowTop + height - client.font.lineHeight, 0xFFFFFF); ctx.drawCenteredString(client.font, category, rowLeft + width / 2, rowTop + height - client.font.lineHeight, 0xFFFFFF); } diff --git a/src/main/java/mcp/mobius/waila/gui/widget/ConfigListWidget.java b/src/main/java/mcp/mobius/waila/gui/widget/ConfigListWidget.java index d371e687b..dc409132b 100644 --- a/src/main/java/mcp/mobius/waila/gui/widget/ConfigListWidget.java +++ b/src/main/java/mcp/mobius/waila/gui/widget/ConfigListWidget.java @@ -22,7 +22,7 @@ public class ConfigListWidget extends ContainerObjectSelectionList { private final ConfigScreen owner; - private final Runnable diskWriter; + private final @Nullable Runnable diskWriter; private int topOffset; private int bottomOffset; @@ -31,7 +31,7 @@ public class ConfigListWidget extends ContainerObjectSelectionList unfilteredChildren; - public ConfigListWidget(ConfigScreen owner, Minecraft client, int width, int height, int top, int bottom, int itemHeight, Runnable diskWriter) { + public ConfigListWidget(ConfigScreen owner, Minecraft client, int width, int height, int top, int bottom, int itemHeight, @Nullable Runnable diskWriter) { super(client, width, height, top, itemHeight - 4); this.owner = owner; diff --git a/src/main/java/mcp/mobius/waila/gui/widget/value/ConfigValue.java b/src/main/java/mcp/mobius/waila/gui/widget/value/ConfigValue.java index 497661315..4e3db8c31 100644 --- a/src/main/java/mcp/mobius/waila/gui/widget/value/ConfigValue.java +++ b/src/main/java/mcp/mobius/waila/gui/widget/value/ConfigValue.java @@ -60,6 +60,8 @@ public ConfigValue(String translationKey, T value, @Nullable T defaultValue, Con public final void render(@NotNull GuiGraphics ctx, int index, int rowTop, int rowLeft, int width, int height, int mouseX, int mouseY, boolean hovered, float deltaTime) { super.render(ctx, index, rowTop, rowLeft, width, height, mouseX, mouseY, hovered, deltaTime); + var title = getTitle(); + if (isDisabled()) title.withStyle(ChatFormatting.STRIKETHROUGH, ChatFormatting.GRAY); else if (!isValueValid()) title.withStyle(ChatFormatting.ITALIC, ChatFormatting.RED); else if (!value.equals(initialValue)) title.withStyle(ChatFormatting.ITALIC, ChatFormatting.YELLOW); @@ -91,12 +93,12 @@ public void renderTooltip(GuiGraphics ctx, int mouseX, int mouseY) { } } - var hasDescTl = I18n.exists(getDescription()); - if (id != null || hasDescTl || (isDisabled() && disabledReason != null)) { + var desc = getDescription(); + if (id != null || desc != null || (isDisabled() && disabledReason != null)) { var title = getTitle().getString(); List tooltip = Lists.newArrayList(Component.literal(title).getVisualOrderText()); - if (hasDescTl) { - tooltip.addAll(client.font.split(Component.translatable(getDescription()).withStyle(ChatFormatting.GRAY), 250)); + if (desc != null) { + tooltip.addAll(client.font.split(desc, 250)); } if (isDisabled() && disabledReason != null) { tooltip.addAll(client.font.split(Component.translatable(disabledReason).withStyle(ChatFormatting.RED), 250)); @@ -114,9 +116,11 @@ public boolean isValueValid() { @Override public boolean match(String filter) { - var match = super.match(filter) || StringUtils.containsIgnoreCase(title.getString(), filter); + var match = super.match(filter) || StringUtils.containsIgnoreCase(getTitle().getString(), filter); if (id != null) match = match || StringUtils.containsIgnoreCase(id, filter); - if (I18n.exists(getDescription())) match = match || StringUtils.containsIgnoreCase(I18n.get(getDescription()), filter); + + var desc = getDescription(); + if (desc != null) match = match || StringUtils.containsIgnoreCase(desc.getString(), filter); return match; } @@ -149,12 +153,13 @@ public Button getResetButton() { return resetButton; } - public Component getTitle() { + public MutableComponent getTitle() { return title; } - public String getDescription() { - return description; + @Nullable + public Component getDescription() { + return I18n.exists(description) ? Component.translatable(description).withStyle(ChatFormatting.GRAY) : null; } public int getX() { @@ -173,6 +178,11 @@ protected void resetValue() { setValue(defaultValue); } + public void enable() { + this.disabledReason = null; + this.disabled = false; + } + public void disable(@Nullable String reason) { this.disabledReason = reason; this.disabled = true; diff --git a/src/main/java/mcp/mobius/waila/network/Packets.java b/src/main/java/mcp/mobius/waila/network/Packets.java index 3ff2a9ccd..d64bccf0f 100644 --- a/src/main/java/mcp/mobius/waila/network/Packets.java +++ b/src/main/java/mcp/mobius/waila/network/Packets.java @@ -1,23 +1,20 @@ package mcp.mobius.waila.network; -import java.util.stream.Collectors; - import lol.bai.badpackets.api.PacketSender; import lol.bai.badpackets.api.config.ConfigPackets; import lol.bai.badpackets.api.play.PlayPackets; -import mcp.mobius.waila.Waila; -import mcp.mobius.waila.config.ConfigEntry; -import mcp.mobius.waila.config.PluginConfig; import mcp.mobius.waila.network.Packet.ConfigC2S; import mcp.mobius.waila.network.Packet.ConfigS2C; import mcp.mobius.waila.network.Packet.PlayC2S; import mcp.mobius.waila.network.Packet.PlayS2C; import mcp.mobius.waila.network.common.VersionPayload; import mcp.mobius.waila.network.common.c2s.VersionCommonC2SPacket; -import mcp.mobius.waila.network.config.s2c.BlacklistSyncConfigS2CPacket; -import mcp.mobius.waila.network.config.s2c.ConfigSyncConfigS2CPacket; +import mcp.mobius.waila.network.common.s2c.BlacklistSyncCommonS2CPacket; +import mcp.mobius.waila.network.common.s2c.ConfigSyncCommonS2CPacket; +import mcp.mobius.waila.network.common.s2c.PluginSyncCommonS2CPacket; import mcp.mobius.waila.network.config.s2c.VersionConfigS2CPacket; import mcp.mobius.waila.network.play.c2s.BlockDataRequestPlayC2SPacket; +import mcp.mobius.waila.network.play.c2s.ConfigSyncRequestPlayC2SPacket; import mcp.mobius.waila.network.play.c2s.EntityDataRequestPlayC2SPacket; import mcp.mobius.waila.network.play.c2s.RawDataRequestContextPlayC2SPacket; import mcp.mobius.waila.network.play.c2s.TypedDataRequestContextPlayC2SPacket; @@ -35,6 +32,7 @@ public static void initServer() { // Play register(new BlockDataRequestPlayC2SPacket()); + register(new ConfigSyncRequestPlayC2SPacket()); register(new EntityDataRequestPlayC2SPacket()); register(new RawDataRequestContextPlayC2SPacket()); register(new TypedDataRequestContextPlayC2SPacket()); @@ -51,10 +49,13 @@ public static void initServer() { } public static void initClient() { + // Common + register(new PluginSyncCommonS2CPacket()); + register(new ConfigSyncCommonS2CPacket()); + register(new BlacklistSyncCommonS2CPacket()); + // Config register(new VersionConfigS2CPacket()); - register(new ConfigSyncConfigS2CPacket()); - register(new BlacklistSyncConfigS2CPacket()); // Play register(new GenerateClientDumpPlayS2CPacket()); @@ -81,12 +82,9 @@ private static void sendVersionPacket(PacketSender sender) { private static void sendS2CHandshakePackets(PacketSender sender) { sendVersionPacket(sender); - var blacklistConfig = Waila.BLACKLIST_CONFIG.get(); - sender.send(new BlacklistSyncConfigS2CPacket.Payload( - blacklistConfig.blocks, blacklistConfig.blockEntityTypes, blacklistConfig.entityTypes)); - - sender.send(new ConfigSyncConfigS2CPacket.Payload(PluginConfig.getSyncableConfigs().stream() - .collect(Collectors.toMap(ConfigEntry::getId, ConfigEntry::getLocalValue)))); + sender.send(new PluginSyncCommonS2CPacket.Payload()); + sender.send(new BlacklistSyncCommonS2CPacket.Payload()); + sender.send(new ConfigSyncCommonS2CPacket.Payload()); } } diff --git a/src/main/java/mcp/mobius/waila/network/config/s2c/BlacklistSyncConfigS2CPacket.java b/src/main/java/mcp/mobius/waila/network/common/s2c/BlacklistSyncCommonS2CPacket.java similarity index 71% rename from src/main/java/mcp/mobius/waila/network/config/s2c/BlacklistSyncConfigS2CPacket.java rename to src/main/java/mcp/mobius/waila/network/common/s2c/BlacklistSyncCommonS2CPacket.java index 681f1a8bb..eb65b892c 100644 --- a/src/main/java/mcp/mobius/waila/network/config/s2c/BlacklistSyncConfigS2CPacket.java +++ b/src/main/java/mcp/mobius/waila/network/common/s2c/BlacklistSyncCommonS2CPacket.java @@ -1,4 +1,4 @@ -package mcp.mobius.waila.network.config.s2c; +package mcp.mobius.waila.network.common.s2c; import java.util.HashSet; import java.util.Set; @@ -8,12 +8,15 @@ import mcp.mobius.waila.network.Packet; import net.minecraft.client.Minecraft; import net.minecraft.client.multiplayer.ClientConfigurationPacketListenerImpl; +import net.minecraft.client.multiplayer.ClientPacketListener; import net.minecraft.network.FriendlyByteBuf; import net.minecraft.network.protocol.common.custom.CustomPacketPayload; import net.minecraft.resources.ResourceLocation; import org.jetbrains.annotations.NotNull; -public class BlacklistSyncConfigS2CPacket implements Packet.ConfigS2C { +public class BlacklistSyncCommonS2CPacket implements + Packet.ConfigS2C, + Packet.PlayS2C { public static final ResourceLocation ID = Waila.id("blacklist"); @@ -30,9 +33,18 @@ public Payload read(FriendlyByteBuf buf) { buf.readCollection(HashSet::new, FriendlyByteBuf::readUtf)); } + private static void receive(Payload payload) { + Waila.BLACKLIST_CONFIG.get().getView().sync(payload.blockRules, payload.blockEntityRules, payload.entityRules); + } + @Override public void receive(Minecraft client, ClientConfigurationPacketListenerImpl handler, Payload payload, PacketSender responseSender) { - Waila.BLACKLIST_CONFIG.get().getView().sync(payload.blockRules, payload.blockEntityRules, payload.entityRules); + receive(payload); + } + + @Override + public void receive(Minecraft client, ClientPacketListener handler, Payload payload, PacketSender responseSender) { + receive(payload); } public record Payload( @@ -41,6 +53,10 @@ public record Payload( Set entityRules ) implements CustomPacketPayload { + public Payload() { + this(Waila.BLACKLIST_CONFIG.get().blocks, Waila.BLACKLIST_CONFIG.get().blockEntityTypes, Waila.BLACKLIST_CONFIG.get().entityTypes); + } + @Override public void write(@NotNull FriendlyByteBuf buf) { buf.writeCollection(blockRules, FriendlyByteBuf::writeUtf); diff --git a/src/main/java/mcp/mobius/waila/network/config/s2c/ConfigSyncConfigS2CPacket.java b/src/main/java/mcp/mobius/waila/network/common/s2c/ConfigSyncCommonS2CPacket.java similarity index 83% rename from src/main/java/mcp/mobius/waila/network/config/s2c/ConfigSyncConfigS2CPacket.java rename to src/main/java/mcp/mobius/waila/network/common/s2c/ConfigSyncCommonS2CPacket.java index 924000081..fa4597f64 100644 --- a/src/main/java/mcp/mobius/waila/network/config/s2c/ConfigSyncConfigS2CPacket.java +++ b/src/main/java/mcp/mobius/waila/network/common/s2c/ConfigSyncCommonS2CPacket.java @@ -1,4 +1,4 @@ -package mcp.mobius.waila.network.config.s2c; +package mcp.mobius.waila.network.common.s2c; import java.util.HashMap; import java.util.Map; @@ -7,11 +7,13 @@ import com.google.gson.Gson; import lol.bai.badpackets.api.PacketSender; import mcp.mobius.waila.Waila; +import mcp.mobius.waila.config.ConfigEntry; import mcp.mobius.waila.config.PluginConfig; import mcp.mobius.waila.network.Packet; import mcp.mobius.waila.util.Log; import net.minecraft.client.Minecraft; import net.minecraft.client.multiplayer.ClientConfigurationPacketListenerImpl; +import net.minecraft.client.multiplayer.ClientPacketListener; import net.minecraft.network.FriendlyByteBuf; import net.minecraft.network.protocol.common.custom.CustomPacketPayload; import net.minecraft.resources.ResourceLocation; @@ -22,7 +24,9 @@ import static mcp.mobius.waila.mcless.network.NetworkConstants.CONFIG_INT; import static mcp.mobius.waila.mcless.network.NetworkConstants.CONFIG_STRING; -public class ConfigSyncConfigS2CPacket implements Packet.ConfigS2C { +public class ConfigSyncCommonS2CPacket implements + Packet.ConfigS2C, + Packet.PlayS2C { public static final ResourceLocation ID = Waila.id("config"); @@ -56,8 +60,7 @@ public Payload read(FriendlyByteBuf buf) { return new Payload(map); } - @Override - public void receive(Minecraft client, ClientConfigurationPacketListenerImpl handler, Payload payload, PacketSender responseSender) { + private static void receive(Payload payload) { var map = payload.map; for (var config : PluginConfig.getSyncableConfigs()) { @@ -79,10 +82,26 @@ public void receive(Minecraft client, ClientConfigurationPacketListenerImpl hand LOG.info("Received config from the server: {}", GSON.toJson(map)); } + @Override + public void receive(Minecraft client, ClientConfigurationPacketListenerImpl handler, Payload payload, PacketSender responseSender) { + receive(payload); + } + + @Override + public void receive(Minecraft client, ClientPacketListener handler, Payload payload, PacketSender responseSender) { + receive(payload); + } + public record Payload( - Map map + Map map ) implements CustomPacketPayload { + public Payload() { + this(PluginConfig.getSyncableConfigs().stream() + .filter(it -> it.getOrigin().isEnabled()) + .collect(Collectors.toMap(ConfigEntry::getId, ConfigEntry::getLocalValue))); + } + @Override public void write(@NotNull FriendlyByteBuf buf) { var groups = map.keySet().stream() diff --git a/src/main/java/mcp/mobius/waila/network/common/s2c/PluginSyncCommonS2CPacket.java b/src/main/java/mcp/mobius/waila/network/common/s2c/PluginSyncCommonS2CPacket.java new file mode 100644 index 000000000..2d86e5c78 --- /dev/null +++ b/src/main/java/mcp/mobius/waila/network/common/s2c/PluginSyncCommonS2CPacket.java @@ -0,0 +1,77 @@ +package mcp.mobius.waila.network.common.s2c; + +import java.util.List; + +import lol.bai.badpackets.api.PacketSender; +import mcp.mobius.waila.Waila; +import mcp.mobius.waila.api.IPluginInfo; +import mcp.mobius.waila.network.Packet; +import mcp.mobius.waila.plugin.PluginInfo; +import mcp.mobius.waila.plugin.PluginLoader; +import net.minecraft.client.Minecraft; +import net.minecraft.client.multiplayer.ClientConfigurationPacketListenerImpl; +import net.minecraft.client.multiplayer.ClientPacketListener; +import net.minecraft.network.FriendlyByteBuf; +import net.minecraft.network.protocol.common.custom.CustomPacketPayload; +import net.minecraft.resources.ResourceLocation; + +public class PluginSyncCommonS2CPacket implements + Packet.ConfigS2C, + Packet.PlayS2C { + + public static final ResourceLocation ID = Waila.id("plugin"); + + @Override + public ResourceLocation id() { + return ID; + } + + @Override + public Payload read(FriendlyByteBuf buf) { + return new Payload(buf.readList(FriendlyByteBuf::readResourceLocation)); + } + + private static void receive(Payload payload) { + PluginInfo.refresh(); + + for (var plugin : payload.plugins) { + ((PluginInfo) IPluginInfo.get(plugin)).setDisabledOnServer(true); + } + + PluginLoader.INSTANCE.loadPlugins(); + } + + @Override + public void receive(Minecraft client, ClientConfigurationPacketListenerImpl handler, Payload payload, PacketSender responseSender) { + receive(payload); + } + + @Override + public void receive(Minecraft client, ClientPacketListener handler, Payload payload, PacketSender responseSender) { + receive(payload); + } + + public record Payload( + List plugins + ) implements CustomPacketPayload { + + public Payload() { + this(PluginInfo.getAll().stream() + .filter(it -> !it.isEnabled()) + .map(IPluginInfo::getPluginId) + .toList()); + } + + @Override + public void write(FriendlyByteBuf buf) { + buf.writeCollection(plugins, FriendlyByteBuf::writeResourceLocation); + } + + @Override + public ResourceLocation id() { + return ID; + } + + } + +} diff --git a/src/main/java/mcp/mobius/waila/network/play/c2s/BlockDataRequestPlayC2SPacket.java b/src/main/java/mcp/mobius/waila/network/play/c2s/BlockDataRequestPlayC2SPacket.java index cb3c1a268..d3ea21706 100644 --- a/src/main/java/mcp/mobius/waila/network/play/c2s/BlockDataRequestPlayC2SPacket.java +++ b/src/main/java/mcp/mobius/waila/network/play/c2s/BlockDataRequestPlayC2SPacket.java @@ -39,7 +39,7 @@ public Payload read(FriendlyByteBuf buf) { public void receive(MinecraftServer server, ServerPlayer player, ServerGamePacketListenerImpl handler, Payload payload, PacketSender responseSender) { var hitResult = payload.hitResult; - var registrar = Registrar.INSTANCE; + var registrar = Registrar.get(); var world = player.level(); var pos = hitResult.getBlockPos(); diff --git a/src/main/java/mcp/mobius/waila/network/play/c2s/ConfigSyncRequestPlayC2SPacket.java b/src/main/java/mcp/mobius/waila/network/play/c2s/ConfigSyncRequestPlayC2SPacket.java new file mode 100644 index 000000000..612648ab2 --- /dev/null +++ b/src/main/java/mcp/mobius/waila/network/play/c2s/ConfigSyncRequestPlayC2SPacket.java @@ -0,0 +1,48 @@ +package mcp.mobius.waila.network.play.c2s; + +import lol.bai.badpackets.api.PacketSender; +import mcp.mobius.waila.Waila; +import mcp.mobius.waila.network.Packet; +import mcp.mobius.waila.network.common.s2c.BlacklistSyncCommonS2CPacket; +import mcp.mobius.waila.network.common.s2c.ConfigSyncCommonS2CPacket; +import net.minecraft.network.FriendlyByteBuf; +import net.minecraft.network.protocol.common.custom.CustomPacketPayload; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.server.MinecraftServer; +import net.minecraft.server.level.ServerPlayer; +import net.minecraft.server.network.ServerGamePacketListenerImpl; + +public class ConfigSyncRequestPlayC2SPacket implements Packet.PlayC2S { + + public static final ResourceLocation ID = Waila.id("config_sync_req"); + + @Override + public ResourceLocation id() { + return ID; + } + + @Override + public Payload read(FriendlyByteBuf buf) { + return new Payload(); + } + + @Override + public void receive(MinecraftServer server, ServerPlayer player, ServerGamePacketListenerImpl handler, Payload payload, PacketSender responseSender) { + responseSender.send(new BlacklistSyncCommonS2CPacket.Payload()); + responseSender.send(new ConfigSyncCommonS2CPacket.Payload()); + } + + public record Payload() implements CustomPacketPayload { + + @Override + public void write(FriendlyByteBuf buf) { + } + + @Override + public ResourceLocation id() { + return ID; + } + + } + +} diff --git a/src/main/java/mcp/mobius/waila/network/play/c2s/EntityDataRequestPlayC2SPacket.java b/src/main/java/mcp/mobius/waila/network/play/c2s/EntityDataRequestPlayC2SPacket.java index 00a311aa5..3a30e6c6e 100644 --- a/src/main/java/mcp/mobius/waila/network/play/c2s/EntityDataRequestPlayC2SPacket.java +++ b/src/main/java/mcp/mobius/waila/network/play/c2s/EntityDataRequestPlayC2SPacket.java @@ -40,7 +40,7 @@ public void receive(MinecraftServer server, ServerPlayer player, ServerGamePacke var entityId = payload.entityId; var hitPos = payload.hitPos; - var registrar = Registrar.INSTANCE; + var registrar = Registrar.get(); var world = player.level(); var entity = world.getEntity(entityId); diff --git a/src/main/java/mcp/mobius/waila/network/play/c2s/TypedDataRequestContextPlayC2SPacket.java b/src/main/java/mcp/mobius/waila/network/play/c2s/TypedDataRequestContextPlayC2SPacket.java index 3540291ba..784fa8aab 100644 --- a/src/main/java/mcp/mobius/waila/network/play/c2s/TypedDataRequestContextPlayC2SPacket.java +++ b/src/main/java/mcp/mobius/waila/network/play/c2s/TypedDataRequestContextPlayC2SPacket.java @@ -39,7 +39,7 @@ public record Payload( @Override public void write(FriendlyByteBuf buf) { - buf.writeResourceLocation(Registrar.INSTANCE.dataType2Id.get(ctx.getClass())); + buf.writeResourceLocation(Registrar.get().dataType2Id.get(ctx.getClass())); ctx.write(buf); } diff --git a/src/main/java/mcp/mobius/waila/network/play/s2c/TypedDataResponsePlayS2CPacket.java b/src/main/java/mcp/mobius/waila/network/play/s2c/TypedDataResponsePlayS2CPacket.java index fac4e7977..f52a8bbe7 100644 --- a/src/main/java/mcp/mobius/waila/network/play/s2c/TypedDataResponsePlayS2CPacket.java +++ b/src/main/java/mcp/mobius/waila/network/play/s2c/TypedDataResponsePlayS2CPacket.java @@ -38,7 +38,7 @@ public record Payload( @Override public void write(FriendlyByteBuf buf) { - buf.writeResourceLocation(Registrar.INSTANCE.dataType2Id.get(data.getClass())); + buf.writeResourceLocation(Registrar.get().dataType2Id.get(data.getClass())); data.write(buf); } diff --git a/src/main/java/mcp/mobius/waila/plugin/PluginInfo.java b/src/main/java/mcp/mobius/waila/plugin/PluginInfo.java index 87d391880..45de3d581 100644 --- a/src/main/java/mcp/mobius/waila/plugin/PluginInfo.java +++ b/src/main/java/mcp/mobius/waila/plugin/PluginInfo.java @@ -4,13 +4,17 @@ import java.util.LinkedHashMap; import java.util.List; import java.util.Map; -import java.util.function.Supplier; import java.util.stream.Collectors; -import com.google.common.base.Suppliers; +import com.google.gson.GsonBuilder; +import com.google.gson.reflect.TypeToken; +import mcp.mobius.waila.Waila; +import mcp.mobius.waila.api.IJsonConfig; import mcp.mobius.waila.api.IModInfo; import mcp.mobius.waila.api.IPluginInfo; import mcp.mobius.waila.api.IWailaPlugin; +import mcp.mobius.waila.api.WailaConstants; +import mcp.mobius.waila.util.CachedSupplier; import mcp.mobius.waila.util.Log; import mcp.mobius.waila.util.ModInfo; import net.minecraft.resources.ResourceLocation; @@ -18,9 +22,20 @@ public class PluginInfo implements IPluginInfo { private static final Log LOG = Log.create(); + private static final ResourceLocation CORE = Waila.id("core"); + + private static final IJsonConfig> TOGGLE = IJsonConfig.of(new TypeToken>() { + }) + .file(WailaConstants.NAMESPACE + "/" + "plugin_toggle") + .factory(LinkedHashMap::new) + .gson(new GsonBuilder() + .setPrettyPrinting() + .registerTypeAdapter(ResourceLocation.class, new ResourceLocation.Serializer()) + .create()) + .build(); private static final Map PLUGIN_ID_TO_PLUGIN_INFO = new LinkedHashMap<>(); - private static final Supplier>> MOD_ID_TO_PLUGIN_INFOS = Suppliers.memoize(() -> + private static final CachedSupplier>> MOD_ID_TO_PLUGIN_INFOS = new CachedSupplier<>(() -> PLUGIN_ID_TO_PLUGIN_INFO.values().stream().collect(Collectors.groupingBy(p -> p.getModInfo().getId()))); private final ModInfo modInfo; @@ -30,6 +45,8 @@ public class PluginInfo implements IPluginInfo { private final List requiredModIds; private final boolean legacy; + private boolean disabledOnServer; + private PluginInfo(ModInfo modInfo, ResourceLocation pluginId, Side side, IWailaPlugin initializer, List requiredModIds, boolean legacy) { this.modInfo = modInfo; this.pluginId = pluginId; @@ -39,7 +56,7 @@ private PluginInfo(ModInfo modInfo, ResourceLocation pluginId, Side side, IWaila this.legacy = legacy; } - public static void register(String modId, String pluginIdStr, Side side, String initializerStr, List required, boolean legacy) { + public static void register(String modId, String pluginIdStr, Side side, String initializerStr, List required, boolean defaultEnabled, boolean legacy) { try { var rl = new ResourceLocation(pluginIdStr); if (PLUGIN_ID_TO_PLUGIN_INFO.containsKey(rl)) { @@ -53,6 +70,7 @@ public static void register(String modId, String pluginIdStr, Side side, String var initializer = (IWailaPlugin) Class.forName(initializerStr).getConstructor().newInstance(); PLUGIN_ID_TO_PLUGIN_INFO.put(rl, new PluginInfo(ModInfo.get(modId), rl, side, initializer, required, legacy)); + TOGGLE.get().putIfAbsent(rl, defaultEnabled); } catch (Throwable t) { LOG.error("Error creating instance of plugin " + pluginIdStr, t); } @@ -95,8 +113,39 @@ public List getRequiredModIds() { return requiredModIds; } + @Override + public boolean isEnabled() { + if (disabledOnServer) return false; + return isLocked() || TOGGLE.get().get(getPluginId()); + } + public boolean isLegacy() { return legacy; } + public boolean isLocked() { + return pluginId.equals(CORE); + } + + public boolean isDisabledOnServer() { + return disabledOnServer; + } + + public void setDisabledOnServer(boolean disabledOnServer) { + this.disabledOnServer = disabledOnServer; + } + + public void setEnabled(boolean enabled) { + TOGGLE.get().put(getPluginId(), enabled); + } + + public static void refresh() { + TOGGLE.invalidate(); + getAll().forEach(it -> ((PluginInfo) it).disabledOnServer = false); + } + + public static void saveToggleConfig() { + TOGGLE.save(); + } + } diff --git a/src/main/java/mcp/mobius/waila/plugin/PluginLoader.java b/src/main/java/mcp/mobius/waila/plugin/PluginLoader.java index 98f75af1e..413b7ac3a 100644 --- a/src/main/java/mcp/mobius/waila/plugin/PluginLoader.java +++ b/src/main/java/mcp/mobius/waila/plugin/PluginLoader.java @@ -5,26 +5,33 @@ import java.nio.file.Files; import java.nio.file.Path; import java.util.ArrayList; -import java.util.Collections; import java.util.List; import java.util.Map; import java.util.Objects; import java.util.stream.Collectors; import com.google.gson.JsonParser; +import lol.bai.badpackets.api.PacketSender; import mcp.mobius.waila.Waila; import mcp.mobius.waila.api.IPluginInfo; -import mcp.mobius.waila.api.WailaConstants; +import mcp.mobius.waila.api.__internal__.Internals; import mcp.mobius.waila.config.PluginConfig; +import mcp.mobius.waila.network.common.s2c.BlacklistSyncCommonS2CPacket; +import mcp.mobius.waila.network.common.s2c.ConfigSyncCommonS2CPacket; +import mcp.mobius.waila.network.common.s2c.PluginSyncCommonS2CPacket; +import mcp.mobius.waila.network.play.c2s.ConfigSyncRequestPlayC2SPacket; import mcp.mobius.waila.registry.Registrar; import mcp.mobius.waila.service.ICommonService; import mcp.mobius.waila.util.Log; import mcp.mobius.waila.util.ModInfo; +import net.minecraft.client.Minecraft; +import net.minecraft.server.MinecraftServer; public abstract class PluginLoader { + public static final PluginLoader INSTANCE = Internals.loadService(PluginLoader.class); + private static final Log LOG = Log.create(); - private static final boolean ENABLE_TEST_PLUGIN = Boolean.getBoolean("waila.enableTestPlugin"); protected static final String[] PLUGIN_JSON_FILES = { "waila_plugins.json", @@ -34,6 +41,7 @@ public abstract class PluginLoader { protected static final String KEY_INITIALIZER = "initializer"; protected static final String KEY_SIDE = "side"; protected static final String KEY_REQUIRED = "required"; + protected static final String KEY_DEFAULT_ENABLED = "defaultEnabled"; protected static final Map SIDES = Map.of( "client", IPluginInfo.Side.CLIENT, "server", IPluginInfo.Side.SERVER, @@ -41,6 +49,33 @@ public abstract class PluginLoader { "*", IPluginInfo.Side.BOTH ); + private boolean gathered = false; + + public static void reloadServerPlugins(MinecraftServer server) { + PluginInfo.refresh(); + INSTANCE.loadPlugins(); + + server.getPlayerList().getPlayers().forEach(player -> { + var sender = PacketSender.s2c(player); + if (!sender.canSend(PluginSyncCommonS2CPacket.ID)) return; + + if (!server.isSingleplayerOwner(player.getGameProfile())) { + sender.send(new PluginSyncCommonS2CPacket.Payload()); + } + + sender.send(new BlacklistSyncCommonS2CPacket.Payload()); + sender.send(new ConfigSyncCommonS2CPacket.Payload()); + }); + } + + public static void reloadClientPlugins() { + INSTANCE.loadPlugins(); + + if (Minecraft.getInstance().getConnection() != null && PacketSender.c2s().canSend(ConfigSyncRequestPlayC2SPacket.ID)) { + PacketSender.c2s().send(new ConfigSyncRequestPlayC2SPacket.Payload()); + } + } + protected abstract void gatherPlugins(); protected void readPluginsJson(String modId, Path path) { @@ -73,20 +108,24 @@ protected void readPluginsJson(String modId, Path path) { } } - PluginInfo.register(modId, pluginId, side, initializer, required, false); + var defaultEnabled = !plugin.has(KEY_DEFAULT_ENABLED) || plugin.get(KEY_DEFAULT_ENABLED).getAsBoolean(); + + PluginInfo.register(modId, pluginId, side, initializer, required, defaultEnabled, false); } } catch (IOException e) { throw new RuntimeException(readError(path), e); } } - public void loadPlugins() { - gatherPlugins(); + public final void loadPlugins() { + Registrar.destroy(); - if (ENABLE_TEST_PLUGIN) { - PluginInfo.register(WailaConstants.MOD_ID, "waila:test", IPluginInfo.Side.BOTH, "mcp.mobius.waila.plugin.test.WailaTest", Collections.emptyList(), false); + if (!gathered) { + gathered = true; + gatherPlugins(); } + PluginInfo.saveToggleConfig(); IPluginInfo extraPlugin = null; // TODO: remove legacy method on Minecraft 1.21 @@ -95,7 +134,7 @@ public void loadPlugins() { if (info.getPluginId().equals(Waila.id("extra"))) { extraPlugin = info; } else { - register(info); + initialize(info); } if (((PluginInfo) info).isLegacy()) { @@ -103,7 +142,7 @@ public void loadPlugins() { } } - if (extraPlugin != null) register(extraPlugin); + if (extraPlugin != null) initialize(extraPlugin); if (!legacyPlugins.isEmpty()) { LOG.warn("Found plugins registered via legacy platform-dependant method:"); @@ -111,13 +150,21 @@ public void loadPlugins() { LOG.warn("The method will be removed on Minecraft 1.21"); } - Registrar.INSTANCE.lock(); + Registrar.get().lock(); PluginConfig.reload(); } - private void register(IPluginInfo info) { - LOG.info("Registering plugin {} at {}", info.getPluginId(), info.getInitializer().getClass().getCanonicalName()); - info.getInitializer().register(Registrar.INSTANCE); + private void initialize(IPluginInfo info) { + Registrar.get().attach(info); + + if (info.isEnabled()) { + LOG.info("Initializing plugin {} at {}", info.getPluginId(), info.getInitializer().getClass().getCanonicalName()); + } else { + LOG.info("Skipping disabled plugin {}", info.getPluginId()); + } + + info.getInitializer().register(Registrar.get()); + Registrar.get().attach(null); } private static String readError(Path path) { diff --git a/src/main/java/mcp/mobius/waila/registry/Registrar.java b/src/main/java/mcp/mobius/waila/registry/Registrar.java index 01e95bae0..5cfa17521 100644 --- a/src/main/java/mcp/mobius/waila/registry/Registrar.java +++ b/src/main/java/mcp/mobius/waila/registry/Registrar.java @@ -18,6 +18,7 @@ import mcp.mobius.waila.api.IEntityComponentProvider; import mcp.mobius.waila.api.IEventListener; import mcp.mobius.waila.api.IObjectPicker; +import mcp.mobius.waila.api.IPluginInfo; import mcp.mobius.waila.api.IRayCastVectorProvider; import mcp.mobius.waila.api.IRegistrar; import mcp.mobius.waila.api.ITheme; @@ -28,6 +29,7 @@ import mcp.mobius.waila.config.ConfigEntry; import mcp.mobius.waila.config.PluginConfig; import mcp.mobius.waila.gui.hud.theme.ThemeType; +import mcp.mobius.waila.util.CachedSupplier; import mcp.mobius.waila.util.Log; import mcp.mobius.waila.util.TypeUtil; import net.minecraft.Util; @@ -41,9 +43,9 @@ import net.minecraft.world.level.block.entity.BlockEntityType; import org.jetbrains.annotations.Nullable; -public enum Registrar implements IRegistrar { +public class Registrar implements IRegistrar { - INSTANCE; + private static final CachedSupplier INSTANCE = new CachedSupplier<>(Registrar::new); private static final Log LOG = Log.create(); @@ -84,11 +86,24 @@ public enum Registrar implements IRegistrar { public IObjectPicker picker = null; private int pickerPriority = Integer.MAX_VALUE; + private @Nullable IPluginInfo plugin; private boolean locked = false; + public static Registrar get() { + return INSTANCE.get(); + } + + public static void destroy() { + INSTANCE.invalidate(); + } + + public void attach(@Nullable IPluginInfo plugin) { + this.plugin = plugin; + } + private void addConfig(ResourceLocation key, T defaultValue, T clientOnlyValue, boolean serverRequired, boolean merged, ConfigEntry.Type type) { assertLock(); - PluginConfig.addConfig(type.create(key, defaultValue, clientOnlyValue, serverRequired, merged)); + PluginConfig.addConfig(type.create(plugin, key, defaultValue, clientOnlyValue, serverRequired, merged)); } @SafeVarargs @@ -164,6 +179,7 @@ public > void addSyncedConfig(ResourceLocation key, T defaultV @Override public void addEventListener(IEventListener listener, int priority) { + if (skip()) return; assertLock(); eventListeners.add(Object.class, listener, priority); } @@ -180,6 +196,7 @@ public void addBlacklist(BlockEntityType... blockEntityTypes) { @Override public void addOverride(IBlockComponentProvider provider, Class clazz, int priority) { + if (skip()) return; if (Waila.CLIENT_SIDE) { assertLock(); assertPriority(priority); @@ -189,6 +206,7 @@ public void addOverride(IBlockComponentProvider provider, Class clazz, in @Override public void addIcon(IBlockComponentProvider provider, Class clazz, int priority) { + if (skip()) return; if (Waila.CLIENT_SIDE) { assertLock(); assertPriority(priority); @@ -199,6 +217,7 @@ public void addIcon(IBlockComponentProvider provider, Class clazz, int pr @Override public void addComponent(IBlockComponentProvider provider, TooltipPosition position, Class clazz, int priority) { + if (skip()) return; if (Waila.CLIENT_SIDE) { assertLock(); assertPriority(priority); @@ -209,6 +228,7 @@ public void addComponent(IBlockComponentProvider provider, TooltipPosition p @Override public void addDataContext(IBlockComponentProvider provider, Class clazz) { + if (skip()) return; if (Waila.CLIENT_SIDE) { assertLock(); warnTargetClass(provider, clazz); @@ -219,6 +239,7 @@ public void addDataContext(IBlockComponentProvider provider, Class clazz) @Override @SuppressWarnings("unchecked") public void addBlockData(IDataProvider provider, Class clazz, int priority) { + if (skip()) return; assertLock(); assertPriority(priority); warnTargetClass(provider, clazz); @@ -232,6 +253,7 @@ public void addBlacklist(EntityType... entityTypes) { @Override public void addOverride(IEntityComponentProvider provider, Class clazz, int priority) { + if (skip()) return; if (Waila.CLIENT_SIDE) { assertLock(); assertPriority(priority); @@ -242,6 +264,7 @@ public void addOverride(IEntityComponentProvider provider, Class clazz, i @Override public void addIcon(IEntityComponentProvider provider, Class clazz, int priority) { + if (skip()) return; if (Waila.CLIENT_SIDE) { assertLock(); assertPriority(priority); @@ -252,6 +275,7 @@ public void addIcon(IEntityComponentProvider provider, Class clazz, int p @Override public void addComponent(IEntityComponentProvider provider, TooltipPosition position, Class clazz, int priority) { + if (skip()) return; if (Waila.CLIENT_SIDE) { assertLock(); assertPriority(priority); @@ -262,6 +286,7 @@ public void addComponent(IEntityComponentProvider provider, TooltipPosition @Override public void addDataContext(IEntityComponentProvider provider, Class clazz) { + if (skip()) return; if (Waila.CLIENT_SIDE) { assertLock(); warnTargetClass(provider, clazz); @@ -272,6 +297,7 @@ public void addDataContext(IEntityComponentProvider provider, Class clazz @Override @SuppressWarnings("unchecked") public void addEntityData(IDataProvider provider, Class clazz, int priority) { + if (skip()) return; assertLock(); assertPriority(priority); warnTargetClass(provider, clazz); @@ -301,6 +327,7 @@ public void addThemeType(ResourceLocation id, IThemeType t @Override public void addRayCastVector(IRayCastVectorProvider provider, int priority) { + if (skip()) return; if (Waila.CLIENT_SIDE) { assertLock(); raycastVectorProviders.add(Object.class, provider, priority); @@ -309,6 +336,7 @@ public void addRayCastVector(IRayCastVectorProvider provider, int priority) { @Override public void replacePicker(IObjectPicker picker, int priority) { + if (skip()) return; if (Waila.CLIENT_SIDE) { assertLock(); assertPriority(priority); @@ -353,14 +381,22 @@ public void lock() { } + private void assertPlugin() { + Preconditions.checkNotNull(plugin, "Tried to register things outside the register method"); + } + + private boolean skip() { + assertPlugin(); + return !plugin.isEnabled(); + } + private void assertLock() { - Preconditions.checkState(!locked, - "Tried to register new component after the registrar is locked"); + assertPlugin(); + Preconditions.checkState(!locked, "Tried to register new component after the registrar is locked"); } private void assertPriority(int priority) { - Preconditions.checkArgument(priority >= 0, - "Priority must be equals or more than 0"); + Preconditions.checkArgument(priority >= 0, "Priority must be equals or more than 0"); } private void warnTargetClass(Object object, Class clazz) { diff --git a/src/main/java/mcp/mobius/waila/service/ApiService.java b/src/main/java/mcp/mobius/waila/service/ApiService.java index 25da91734..1389a317a 100644 --- a/src/main/java/mcp/mobius/waila/service/ApiService.java +++ b/src/main/java/mcp/mobius/waila/service/ApiService.java @@ -1,5 +1,6 @@ package mcp.mobius.waila.service; +import java.lang.reflect.Type; import java.nio.file.Path; import java.util.Collection; import java.util.Comparator; @@ -79,8 +80,8 @@ public IBlacklistConfig getBlacklistConfig() { } @Override - public IJsonConfig.Builder0 createConfigBuilder(Class clazz) { - return new JsonConfig.Builder<>(clazz); + public IJsonConfig.Builder0 createConfigBuilder(Type type) { + return new JsonConfig.Builder<>(type); } @Override diff --git a/src/main/java/mcp/mobius/waila/util/CachedSupplier.java b/src/main/java/mcp/mobius/waila/util/CachedSupplier.java new file mode 100644 index 000000000..f137a5d27 --- /dev/null +++ b/src/main/java/mcp/mobius/waila/util/CachedSupplier.java @@ -0,0 +1,23 @@ +package mcp.mobius.waila.util; + +import java.util.function.Supplier; + +public class CachedSupplier implements Supplier { + + private final Supplier supplier; + private T value; + + public CachedSupplier(Supplier supplier) { + this.supplier = supplier; + } + + @Override + public T get() { + return value == null ? value = supplier.get() : value; + } + + public void invalidate() { + this.value = null; + } + +} diff --git a/src/minecraftless/java/mcp/mobius/waila/mcless/network/NetworkConstants.java b/src/minecraftless/java/mcp/mobius/waila/mcless/network/NetworkConstants.java index 2ac006e14..c3ba48824 100644 --- a/src/minecraftless/java/mcp/mobius/waila/mcless/network/NetworkConstants.java +++ b/src/minecraftless/java/mcp/mobius/waila/mcless/network/NetworkConstants.java @@ -2,7 +2,7 @@ public class NetworkConstants { - public static final int NETWORK_VERSION = 7; + public static final int NETWORK_VERSION = 8; public static final byte CONFIG_BOOL = 0; public static final byte CONFIG_INT = 1; diff --git a/src/pluginTest/java/mcp/mobius/waila/plugin/test/WailaTest.java b/src/pluginTest/java/mcp/mobius/waila/plugin/test/WailaPluginTest.java similarity index 98% rename from src/pluginTest/java/mcp/mobius/waila/plugin/test/WailaTest.java rename to src/pluginTest/java/mcp/mobius/waila/plugin/test/WailaPluginTest.java index 0a0c0da2e..fc9aa043e 100644 --- a/src/pluginTest/java/mcp/mobius/waila/plugin/test/WailaTest.java +++ b/src/pluginTest/java/mcp/mobius/waila/plugin/test/WailaPluginTest.java @@ -14,7 +14,7 @@ import net.minecraft.world.level.block.entity.BarrelBlockEntity; @SuppressWarnings("unused") -public class WailaTest implements IWailaPlugin { +public class WailaPluginTest implements IWailaPlugin { @Override public void register(IRegistrar registrar) { diff --git a/src/resources/resources/assets/waila/lang/de_de.json b/src/resources/resources/assets/waila/lang/de_de.json index 59fc01cc6..310ffdcc1 100644 --- a/src/resources/resources/assets/waila/lang/de_de.json +++ b/src/resources/resources/assets/waila/lang/de_de.json @@ -1,6 +1,7 @@ { "tooltip.waila.crop_growth" : "Gewachsen", "tooltip.waila.crop_growable" : "Kann wachsen", + "tooltip.waila.crop_mature" : "Ausgewachsen", "tooltip.waila.empty" : "Leer", "tooltip.waila.delay" : "Verzögerung", @@ -42,6 +43,29 @@ + + + + + + + + + + + + + + + + + + + + + + + @@ -65,7 +89,27 @@ "gui.waila.configuration" : "%s Konfiguration", "gui.waila.waila_settings" : "%s Einstellung", - "gui.waila.plugin_settings" : "Plugin Einstellungen", + + + + + + + + + + + + + + + + + + + + + @@ -163,6 +207,7 @@ + "config.waila.overlay_color" : "Farbe", @@ -254,6 +299,13 @@ + + + + + + + @@ -320,6 +372,9 @@ + + + diff --git a/src/resources/resources/assets/waila/lang/en_us.json b/src/resources/resources/assets/waila/lang/en_us.json index e090ea687..5434fc8b2 100644 --- a/src/resources/resources/assets/waila/lang/en_us.json +++ b/src/resources/resources/assets/waila/lang/en_us.json @@ -89,7 +89,14 @@ "gui.waila.configuration" : "%s Configuration", "gui.waila.waila_settings" : "%s Settings", - "gui.waila.plugin_settings" : "Plugin Settings", + + "gui.waila.esc_warning.umm" : "Umm...", + "gui.waila.esc_warning.lmao" : "Press the %s or %s button to close", + + "gui.waila.plugin.toggle" : "Plugin Toggles", + "gui.waila.plugin.toggle.disabled_on_server" : "This plugin is disabled on the server", + "gui.waila.plugin.toggle.locked" : "Can't disable this plugin", + "gui.waila.plugin.settings" : "Plugin Settings", "gui.waila.credits" : "Credits", "gui.waila.credits.original_mod_by" : "Original \"WAILA\" Mod by", @@ -99,8 +106,21 @@ "command.waila.server_dump_success" : "Successfully dumped dedicated server to %s", "command.waila.local_dump_success" : "Successfully dumped local server to %s", "command.waila.client_dump_success" : "Successfully dumped client to %s", + + "command.waila.plugin.reload" : "Plugins reloaded", + "command.waila.plugin.list.available.none" : "There are no more plugins available", + "command.waila.plugin.list.available.success" : "There are %s plugin(s) available: %s", + "command.waila.plugin.list.enabled.none" : "There are no plugins enabled", + "command.waila.plugin.list.enabled.success" : "There are %s plugin(s) enabled: %s", + "command.waila.plugin.modify.disable" : "Disabling plugin %s", + "command.waila.plugin.modify.enable" : "Enabling plugin %s", + "command.waila.plugin.unknown" : "Unknown plugin '%s'", + "command.waila.plugin.locked" : "Locked plugin '%s'", + "command.waila.plugin.disabled_on_server" : "Plugin '%s' is disabled on server", + "command.waila.overlay.true" : "Overlay enabled", "command.waila.overlay.false" : "Overlay disabled", + "command.waila.config.unknown_id" : "Unknown plugin config id %s", "command.waila.config.get.id" : "Plugin config id: %s", "command.waila.config.get.synced" : "Synced: %s", diff --git a/src/resources/resources/assets/waila/lang/es_ar.json b/src/resources/resources/assets/waila/lang/es_ar.json index 9ed4a510f..9a405dfb4 100644 --- a/src/resources/resources/assets/waila/lang/es_ar.json +++ b/src/resources/resources/assets/waila/lang/es_ar.json @@ -1,5 +1,7 @@ { "tooltip.waila.crop_growth" : "Desarrollo", + + "tooltip.waila.crop_mature" : "Maduro", "tooltip.waila.empty" : "Vacío", "tooltip.waila.delay" : "Demora", @@ -9,6 +11,8 @@ "tooltip.waila.state" : "Estado", "tooltip.waila.state_on" : "Activo", "tooltip.waila.state_off" : "Inactivo", + + "tooltip.waila.power" : "Poder", "tooltip.waila.sneak_for_details" : "Detalles al agacharse", "tooltip.waila.compost_level" : "Nivel de composta", @@ -31,6 +35,9 @@ + + + "tooltip.waila.instrument.harp" : "Arpa", @@ -59,10 +66,37 @@ + + + + + + + + + + + + + + + + + + + + "gui.waila.configuration" : "%s — Configuración", "gui.waila.waila_settings" : "Opciones de %s", - "gui.waila.plugin_settings" : "Opciones del plugin", + + + + + + + + @@ -77,6 +111,19 @@ + + + + + + + + + + + + + @@ -127,6 +174,7 @@ + "config.waila.overlay_pos_x" : "Desplazamiento en X", "config.waila.overlay_pos_x_desc" : "Posición en X relativa al anclaje de pantalla\nLa posición es afectada por la escala", "config.waila.overlay_pos_y" : "Desplazamiento en Y", @@ -188,6 +236,8 @@ "key.waila.show_recipe_input" : "Ver uso de receta", "key.waila.show_recipe_output" : "Ver receta", + + "config.waila.plugin_minecraft" : "Minecraft", "config.waila.plugin_minecraft.item_entity" : "Ver entidad de item", @@ -203,6 +253,8 @@ "config.waila.plugin_minecraft.spawner_type" : "Ver tipo de generador", "config.waila.plugin_minecraft.crop_progress" : "Ver progreso de cultivos", + + "config.waila.plugin_minecraft.redstone" : "Redstone", "config.waila.plugin_minecraft.redstone.lever" : "Ver estado de palanca", "config.waila.plugin_minecraft.redstone.repeater" : "Ver demora de repetidor", @@ -252,6 +304,9 @@ + + + @@ -317,6 +372,9 @@ + + + diff --git a/src/resources/resources/assets/waila/lang/es_cl.json b/src/resources/resources/assets/waila/lang/es_cl.json index 9ed4a510f..9a405dfb4 100644 --- a/src/resources/resources/assets/waila/lang/es_cl.json +++ b/src/resources/resources/assets/waila/lang/es_cl.json @@ -1,5 +1,7 @@ { "tooltip.waila.crop_growth" : "Desarrollo", + + "tooltip.waila.crop_mature" : "Maduro", "tooltip.waila.empty" : "Vacío", "tooltip.waila.delay" : "Demora", @@ -9,6 +11,8 @@ "tooltip.waila.state" : "Estado", "tooltip.waila.state_on" : "Activo", "tooltip.waila.state_off" : "Inactivo", + + "tooltip.waila.power" : "Poder", "tooltip.waila.sneak_for_details" : "Detalles al agacharse", "tooltip.waila.compost_level" : "Nivel de composta", @@ -31,6 +35,9 @@ + + + "tooltip.waila.instrument.harp" : "Arpa", @@ -59,10 +66,37 @@ + + + + + + + + + + + + + + + + + + + + "gui.waila.configuration" : "%s — Configuración", "gui.waila.waila_settings" : "Opciones de %s", - "gui.waila.plugin_settings" : "Opciones del plugin", + + + + + + + + @@ -77,6 +111,19 @@ + + + + + + + + + + + + + @@ -127,6 +174,7 @@ + "config.waila.overlay_pos_x" : "Desplazamiento en X", "config.waila.overlay_pos_x_desc" : "Posición en X relativa al anclaje de pantalla\nLa posición es afectada por la escala", "config.waila.overlay_pos_y" : "Desplazamiento en Y", @@ -188,6 +236,8 @@ "key.waila.show_recipe_input" : "Ver uso de receta", "key.waila.show_recipe_output" : "Ver receta", + + "config.waila.plugin_minecraft" : "Minecraft", "config.waila.plugin_minecraft.item_entity" : "Ver entidad de item", @@ -203,6 +253,8 @@ "config.waila.plugin_minecraft.spawner_type" : "Ver tipo de generador", "config.waila.plugin_minecraft.crop_progress" : "Ver progreso de cultivos", + + "config.waila.plugin_minecraft.redstone" : "Redstone", "config.waila.plugin_minecraft.redstone.lever" : "Ver estado de palanca", "config.waila.plugin_minecraft.redstone.repeater" : "Ver demora de repetidor", @@ -252,6 +304,9 @@ + + + @@ -317,6 +372,9 @@ + + + diff --git a/src/resources/resources/assets/waila/lang/es_ec.json b/src/resources/resources/assets/waila/lang/es_ec.json index 9ed4a510f..9a405dfb4 100644 --- a/src/resources/resources/assets/waila/lang/es_ec.json +++ b/src/resources/resources/assets/waila/lang/es_ec.json @@ -1,5 +1,7 @@ { "tooltip.waila.crop_growth" : "Desarrollo", + + "tooltip.waila.crop_mature" : "Maduro", "tooltip.waila.empty" : "Vacío", "tooltip.waila.delay" : "Demora", @@ -9,6 +11,8 @@ "tooltip.waila.state" : "Estado", "tooltip.waila.state_on" : "Activo", "tooltip.waila.state_off" : "Inactivo", + + "tooltip.waila.power" : "Poder", "tooltip.waila.sneak_for_details" : "Detalles al agacharse", "tooltip.waila.compost_level" : "Nivel de composta", @@ -31,6 +35,9 @@ + + + "tooltip.waila.instrument.harp" : "Arpa", @@ -59,10 +66,37 @@ + + + + + + + + + + + + + + + + + + + + "gui.waila.configuration" : "%s — Configuración", "gui.waila.waila_settings" : "Opciones de %s", - "gui.waila.plugin_settings" : "Opciones del plugin", + + + + + + + + @@ -77,6 +111,19 @@ + + + + + + + + + + + + + @@ -127,6 +174,7 @@ + "config.waila.overlay_pos_x" : "Desplazamiento en X", "config.waila.overlay_pos_x_desc" : "Posición en X relativa al anclaje de pantalla\nLa posición es afectada por la escala", "config.waila.overlay_pos_y" : "Desplazamiento en Y", @@ -188,6 +236,8 @@ "key.waila.show_recipe_input" : "Ver uso de receta", "key.waila.show_recipe_output" : "Ver receta", + + "config.waila.plugin_minecraft" : "Minecraft", "config.waila.plugin_minecraft.item_entity" : "Ver entidad de item", @@ -203,6 +253,8 @@ "config.waila.plugin_minecraft.spawner_type" : "Ver tipo de generador", "config.waila.plugin_minecraft.crop_progress" : "Ver progreso de cultivos", + + "config.waila.plugin_minecraft.redstone" : "Redstone", "config.waila.plugin_minecraft.redstone.lever" : "Ver estado de palanca", "config.waila.plugin_minecraft.redstone.repeater" : "Ver demora de repetidor", @@ -252,6 +304,9 @@ + + + @@ -317,6 +372,9 @@ + + + diff --git a/src/resources/resources/assets/waila/lang/es_es.json b/src/resources/resources/assets/waila/lang/es_es.json index 9ed4a510f..9a405dfb4 100644 --- a/src/resources/resources/assets/waila/lang/es_es.json +++ b/src/resources/resources/assets/waila/lang/es_es.json @@ -1,5 +1,7 @@ { "tooltip.waila.crop_growth" : "Desarrollo", + + "tooltip.waila.crop_mature" : "Maduro", "tooltip.waila.empty" : "Vacío", "tooltip.waila.delay" : "Demora", @@ -9,6 +11,8 @@ "tooltip.waila.state" : "Estado", "tooltip.waila.state_on" : "Activo", "tooltip.waila.state_off" : "Inactivo", + + "tooltip.waila.power" : "Poder", "tooltip.waila.sneak_for_details" : "Detalles al agacharse", "tooltip.waila.compost_level" : "Nivel de composta", @@ -31,6 +35,9 @@ + + + "tooltip.waila.instrument.harp" : "Arpa", @@ -59,10 +66,37 @@ + + + + + + + + + + + + + + + + + + + + "gui.waila.configuration" : "%s — Configuración", "gui.waila.waila_settings" : "Opciones de %s", - "gui.waila.plugin_settings" : "Opciones del plugin", + + + + + + + + @@ -77,6 +111,19 @@ + + + + + + + + + + + + + @@ -127,6 +174,7 @@ + "config.waila.overlay_pos_x" : "Desplazamiento en X", "config.waila.overlay_pos_x_desc" : "Posición en X relativa al anclaje de pantalla\nLa posición es afectada por la escala", "config.waila.overlay_pos_y" : "Desplazamiento en Y", @@ -188,6 +236,8 @@ "key.waila.show_recipe_input" : "Ver uso de receta", "key.waila.show_recipe_output" : "Ver receta", + + "config.waila.plugin_minecraft" : "Minecraft", "config.waila.plugin_minecraft.item_entity" : "Ver entidad de item", @@ -203,6 +253,8 @@ "config.waila.plugin_minecraft.spawner_type" : "Ver tipo de generador", "config.waila.plugin_minecraft.crop_progress" : "Ver progreso de cultivos", + + "config.waila.plugin_minecraft.redstone" : "Redstone", "config.waila.plugin_minecraft.redstone.lever" : "Ver estado de palanca", "config.waila.plugin_minecraft.redstone.repeater" : "Ver demora de repetidor", @@ -252,6 +304,9 @@ + + + @@ -317,6 +372,9 @@ + + + diff --git a/src/resources/resources/assets/waila/lang/es_mx.json b/src/resources/resources/assets/waila/lang/es_mx.json index 9ed4a510f..9a405dfb4 100644 --- a/src/resources/resources/assets/waila/lang/es_mx.json +++ b/src/resources/resources/assets/waila/lang/es_mx.json @@ -1,5 +1,7 @@ { "tooltip.waila.crop_growth" : "Desarrollo", + + "tooltip.waila.crop_mature" : "Maduro", "tooltip.waila.empty" : "Vacío", "tooltip.waila.delay" : "Demora", @@ -9,6 +11,8 @@ "tooltip.waila.state" : "Estado", "tooltip.waila.state_on" : "Activo", "tooltip.waila.state_off" : "Inactivo", + + "tooltip.waila.power" : "Poder", "tooltip.waila.sneak_for_details" : "Detalles al agacharse", "tooltip.waila.compost_level" : "Nivel de composta", @@ -31,6 +35,9 @@ + + + "tooltip.waila.instrument.harp" : "Arpa", @@ -59,10 +66,37 @@ + + + + + + + + + + + + + + + + + + + + "gui.waila.configuration" : "%s — Configuración", "gui.waila.waila_settings" : "Opciones de %s", - "gui.waila.plugin_settings" : "Opciones del plugin", + + + + + + + + @@ -77,6 +111,19 @@ + + + + + + + + + + + + + @@ -127,6 +174,7 @@ + "config.waila.overlay_pos_x" : "Desplazamiento en X", "config.waila.overlay_pos_x_desc" : "Posición en X relativa al anclaje de pantalla\nLa posición es afectada por la escala", "config.waila.overlay_pos_y" : "Desplazamiento en Y", @@ -188,6 +236,8 @@ "key.waila.show_recipe_input" : "Ver uso de receta", "key.waila.show_recipe_output" : "Ver receta", + + "config.waila.plugin_minecraft" : "Minecraft", "config.waila.plugin_minecraft.item_entity" : "Ver entidad de item", @@ -203,6 +253,8 @@ "config.waila.plugin_minecraft.spawner_type" : "Ver tipo de generador", "config.waila.plugin_minecraft.crop_progress" : "Ver progreso de cultivos", + + "config.waila.plugin_minecraft.redstone" : "Redstone", "config.waila.plugin_minecraft.redstone.lever" : "Ver estado de palanca", "config.waila.plugin_minecraft.redstone.repeater" : "Ver demora de repetidor", @@ -252,6 +304,9 @@ + + + @@ -317,6 +372,9 @@ + + + diff --git a/src/resources/resources/assets/waila/lang/es_uy.json b/src/resources/resources/assets/waila/lang/es_uy.json index 9ed4a510f..9a405dfb4 100644 --- a/src/resources/resources/assets/waila/lang/es_uy.json +++ b/src/resources/resources/assets/waila/lang/es_uy.json @@ -1,5 +1,7 @@ { "tooltip.waila.crop_growth" : "Desarrollo", + + "tooltip.waila.crop_mature" : "Maduro", "tooltip.waila.empty" : "Vacío", "tooltip.waila.delay" : "Demora", @@ -9,6 +11,8 @@ "tooltip.waila.state" : "Estado", "tooltip.waila.state_on" : "Activo", "tooltip.waila.state_off" : "Inactivo", + + "tooltip.waila.power" : "Poder", "tooltip.waila.sneak_for_details" : "Detalles al agacharse", "tooltip.waila.compost_level" : "Nivel de composta", @@ -31,6 +35,9 @@ + + + "tooltip.waila.instrument.harp" : "Arpa", @@ -59,10 +66,37 @@ + + + + + + + + + + + + + + + + + + + + "gui.waila.configuration" : "%s — Configuración", "gui.waila.waila_settings" : "Opciones de %s", - "gui.waila.plugin_settings" : "Opciones del plugin", + + + + + + + + @@ -77,6 +111,19 @@ + + + + + + + + + + + + + @@ -127,6 +174,7 @@ + "config.waila.overlay_pos_x" : "Desplazamiento en X", "config.waila.overlay_pos_x_desc" : "Posición en X relativa al anclaje de pantalla\nLa posición es afectada por la escala", "config.waila.overlay_pos_y" : "Desplazamiento en Y", @@ -188,6 +236,8 @@ "key.waila.show_recipe_input" : "Ver uso de receta", "key.waila.show_recipe_output" : "Ver receta", + + "config.waila.plugin_minecraft" : "Minecraft", "config.waila.plugin_minecraft.item_entity" : "Ver entidad de item", @@ -203,6 +253,8 @@ "config.waila.plugin_minecraft.spawner_type" : "Ver tipo de generador", "config.waila.plugin_minecraft.crop_progress" : "Ver progreso de cultivos", + + "config.waila.plugin_minecraft.redstone" : "Redstone", "config.waila.plugin_minecraft.redstone.lever" : "Ver estado de palanca", "config.waila.plugin_minecraft.redstone.repeater" : "Ver demora de repetidor", @@ -252,6 +304,9 @@ + + + @@ -317,6 +372,9 @@ + + + diff --git a/src/resources/resources/assets/waila/lang/es_ve.json b/src/resources/resources/assets/waila/lang/es_ve.json index 9ed4a510f..9a405dfb4 100644 --- a/src/resources/resources/assets/waila/lang/es_ve.json +++ b/src/resources/resources/assets/waila/lang/es_ve.json @@ -1,5 +1,7 @@ { "tooltip.waila.crop_growth" : "Desarrollo", + + "tooltip.waila.crop_mature" : "Maduro", "tooltip.waila.empty" : "Vacío", "tooltip.waila.delay" : "Demora", @@ -9,6 +11,8 @@ "tooltip.waila.state" : "Estado", "tooltip.waila.state_on" : "Activo", "tooltip.waila.state_off" : "Inactivo", + + "tooltip.waila.power" : "Poder", "tooltip.waila.sneak_for_details" : "Detalles al agacharse", "tooltip.waila.compost_level" : "Nivel de composta", @@ -31,6 +35,9 @@ + + + "tooltip.waila.instrument.harp" : "Arpa", @@ -59,10 +66,37 @@ + + + + + + + + + + + + + + + + + + + + "gui.waila.configuration" : "%s — Configuración", "gui.waila.waila_settings" : "Opciones de %s", - "gui.waila.plugin_settings" : "Opciones del plugin", + + + + + + + + @@ -77,6 +111,19 @@ + + + + + + + + + + + + + @@ -127,6 +174,7 @@ + "config.waila.overlay_pos_x" : "Desplazamiento en X", "config.waila.overlay_pos_x_desc" : "Posición en X relativa al anclaje de pantalla\nLa posición es afectada por la escala", "config.waila.overlay_pos_y" : "Desplazamiento en Y", @@ -188,6 +236,8 @@ "key.waila.show_recipe_input" : "Ver uso de receta", "key.waila.show_recipe_output" : "Ver receta", + + "config.waila.plugin_minecraft" : "Minecraft", "config.waila.plugin_minecraft.item_entity" : "Ver entidad de item", @@ -203,6 +253,8 @@ "config.waila.plugin_minecraft.spawner_type" : "Ver tipo de generador", "config.waila.plugin_minecraft.crop_progress" : "Ver progreso de cultivos", + + "config.waila.plugin_minecraft.redstone" : "Redstone", "config.waila.plugin_minecraft.redstone.lever" : "Ver estado de palanca", "config.waila.plugin_minecraft.redstone.repeater" : "Ver demora de repetidor", @@ -252,6 +304,9 @@ + + + @@ -317,6 +372,9 @@ + + + diff --git a/src/resources/resources/assets/waila/lang/ja_jp.json b/src/resources/resources/assets/waila/lang/ja_jp.json index af86095c1..d892eb4ed 100644 --- a/src/resources/resources/assets/waila/lang/ja_jp.json +++ b/src/resources/resources/assets/waila/lang/ja_jp.json @@ -1,5 +1,7 @@ { "tooltip.waila.crop_growth" : "成長", + + "tooltip.waila.crop_mature" : "完全", "tooltip.waila.empty" : "空", "tooltip.waila.delay" : "遅延", @@ -9,6 +11,8 @@ "tooltip.waila.state" : "状態", "tooltip.waila.state_on" : "入", "tooltip.waila.state_off" : "切", + + "tooltip.waila.power" : "動力", "tooltip.waila.sneak_for_details" : "スニークすることで詳細", "tooltip.waila.compost_level" : "堆肥レベル", @@ -31,6 +35,9 @@ + + + "tooltip.waila.instrument.harp" : "ハープ", @@ -59,10 +66,37 @@ + + + + + + + + + + + + + + + + + + + + "gui.waila.configuration" : "%s配置", "gui.waila.waila_settings" : "%s設定", - "gui.waila.plugin_settings" : "プラグイン設定", + + + + + + + + @@ -77,6 +111,19 @@ + + + + + + + + + + + + + @@ -127,6 +174,7 @@ + "config.waila.overlay_pos_x" : "xオフセット", "config.waila.overlay_pos_x_desc" : "xは画面アンカーから比較的にある\n位置はスケールに寄って違う", "config.waila.overlay_pos_y" : "yオフセット", @@ -188,6 +236,8 @@ "key.waila.show_recipe_input" : "レシピ使用の表示", "key.waila.show_recipe_output" : "レシピの表示", + + "config.waila.plugin_minecraft" : "Minecraft", "config.waila.plugin_minecraft.item_entity" : "アイテムのエンティティの表示", @@ -203,6 +253,8 @@ "config.waila.plugin_minecraft.spawner_type" : "スポナー種類の表示", "config.waila.plugin_minecraft.crop_progress" : "作物の成長の表示", + + "config.waila.plugin_minecraft.redstone" : "レッドストーン", "config.waila.plugin_minecraft.redstone.lever" : "レバーの状態を表示", "config.waila.plugin_minecraft.redstone.repeater" : "リピーター遅延の表示", @@ -252,6 +304,9 @@ + + + @@ -317,6 +372,9 @@ + + + diff --git a/src/resources/resources/assets/waila/lang/ko_kr.json b/src/resources/resources/assets/waila/lang/ko_kr.json index 787baecdd..d32afdf04 100644 --- a/src/resources/resources/assets/waila/lang/ko_kr.json +++ b/src/resources/resources/assets/waila/lang/ko_kr.json @@ -1,5 +1,7 @@ { "tooltip.waila.crop_growth" : "성장 상태", + + "tooltip.waila.crop_mature" : "다 자람", "tooltip.waila.empty" : "비어 있음", "tooltip.waila.delay" : "지연 시간", @@ -9,6 +11,8 @@ "tooltip.waila.state" : "상태", "tooltip.waila.state_on" : "켜짐", "tooltip.waila.state_off" : "꺼짐", + + "tooltip.waila.power" : "전력", "tooltip.waila.sneak_for_details" : "상세 정보를 보려면 앉기를 누르세요", "tooltip.waila.compost_level" : "퇴비통 레벨", @@ -31,6 +35,9 @@ + + + "tooltip.waila.instrument.harp" : "하프", @@ -59,10 +66,37 @@ + + + + + + + + + + + + + + + + + + + + "gui.waila.configuration" : "%s 환경설정", "gui.waila.waila_settings" : "%s 설정", - "gui.waila.plugin_settings" : "플러그인 설정", + + + + + + + + "gui.waila.credits" : "크레딧", "gui.waila.credits.original_mod_by" : "원본 \"WAILA\" 모드 제작", @@ -77,6 +111,19 @@ + + + + + + + + + + + + + @@ -127,6 +174,7 @@ + "config.waila.overlay_pos_x" : "X 오프셋", "config.waila.overlay_pos_x_desc" : "화면 고정 값 기준 X 좌표\n위치는 크기에 영향을 받습니다.", "config.waila.overlay_pos_y" : "Y 오프셋", @@ -188,6 +236,8 @@ "key.waila.show_recipe_input" : "조합법 사용처 표시", "key.waila.show_recipe_output" : "조합법 표시", + + "config.waila.plugin_minecraft" : "마인크래프트", "config.waila.plugin_minecraft.item_entity" : "아이템 개체 표시", @@ -203,6 +253,8 @@ "config.waila.plugin_minecraft.spawner_type" : "스포너 종류 표시", "config.waila.plugin_minecraft.crop_progress" : "작물 성장 상태 표시", + + "config.waila.plugin_minecraft.redstone" : "레드스톤", "config.waila.plugin_minecraft.redstone.lever" : "레버 상태 표시", "config.waila.plugin_minecraft.redstone.repeater" : "중계기 딜레이 표시", @@ -252,6 +304,9 @@ + + + @@ -317,6 +372,9 @@ + + + diff --git a/src/resources/resources/assets/waila/lang/pl_pl.json b/src/resources/resources/assets/waila/lang/pl_pl.json index edf08b978..60d4f39ea 100644 --- a/src/resources/resources/assets/waila/lang/pl_pl.json +++ b/src/resources/resources/assets/waila/lang/pl_pl.json @@ -1,5 +1,7 @@ { "tooltip.waila.crop_growth" : "Stadium rozwoju", + + "tooltip.waila.crop_mature" : "Dojrzałe", "tooltip.waila.empty" : "Puste", "tooltip.waila.delay" : "Opóźnienie", @@ -9,6 +11,8 @@ "tooltip.waila.state" : "Stan", "tooltip.waila.state_on" : "Wł.", "tooltip.waila.state_off" : "Wył.", + + "tooltip.waila.power" : "Zasilanie", "tooltip.waila.sneak_for_details" : "Skradaj się, by wyświetlić szczegóły", @@ -39,6 +43,29 @@ + + + + + + + + + + + + + + + + + + + + + + + @@ -62,7 +89,27 @@ "gui.waila.configuration" : "%s — konfiguracja", "gui.waila.waila_settings" : "%s — ustawienia", - "gui.waila.plugin_settings" : "Ustawienia pluginu", + + + + + + + + + + + + + + + + + + + + + @@ -135,6 +182,7 @@ + "config.waila.overlay_scale" : "Skala wyświetlacza", @@ -188,6 +236,8 @@ + + "config.waila.plugin_minecraft" : "Minecraft", @@ -253,6 +303,11 @@ + + + + + @@ -317,6 +372,9 @@ + + + diff --git a/src/resources/resources/assets/waila/lang/ru_ru.json b/src/resources/resources/assets/waila/lang/ru_ru.json index 5e0f8b802..2801d0068 100644 --- a/src/resources/resources/assets/waila/lang/ru_ru.json +++ b/src/resources/resources/assets/waila/lang/ru_ru.json @@ -1,5 +1,7 @@ { "tooltip.waila.crop_growth" : "Зрелость", + + "tooltip.waila.crop_mature" : "Созрело", "tooltip.waila.empty" : "Пусто", "tooltip.waila.delay" : "Задержка", @@ -9,6 +11,8 @@ "tooltip.waila.state" : "Состояние", "tooltip.waila.state_on" : "Вкл.", "tooltip.waila.state_off" : "Выкл.", + + "tooltip.waila.power" : "Мощность", "tooltip.waila.sneak_for_details" : "Присядьте для подробностей", "tooltip.waila.compost_level" : "Уровень компоста", @@ -25,6 +29,8 @@ "tooltip.waila.panda.personality" : "Особая черта", "tooltip.waila.panda.traits" : "Характер", + + "tooltip.waila.panda.gene" : "_DO_NOT_TRANSLATE_", "tooltip.waila.panda.gene.normal" : "Обычная", "tooltip.waila.panda.gene.lazy" : "Ленивая", "tooltip.waila.panda.gene.worried" : "Грустная", @@ -33,6 +39,7 @@ "tooltip.waila.panda.gene.weak" : "Уставшая", "tooltip.waila.panda.gene.aggressive" : "Злая", + "tooltip.waila.instrument" : "_DO_NOT_TRANSLATE_", "tooltip.waila.instrument.harp" : "Арфа", "tooltip.waila.instrument.basedrum" : "Большой барабан", "tooltip.waila.instrument.snare" : "Малый барабан", @@ -59,10 +66,37 @@ "tooltip.waila.extra.energy" : "Энергия", "tooltip.waila.extra.unknown_fluid" : "Неизвестная жидкость", + + + + + + + + + + + + + + + + + + + + "gui.waila.configuration" : "Конфигурация %s", "gui.waila.waila_settings" : "Настройки %s", - "gui.waila.plugin_settings" : "Настроки плагинов", + + + + + + + + "gui.waila.credits" : "Благодарности", "gui.waila.credits.original_mod_by" : "Оригинальный \"WAILA\" от", @@ -72,8 +106,21 @@ "command.waila.server_dump_success" : "Выделенный сервер успешно сброшен до %s", "command.waila.local_dump_success" : "Локальный сервер успешно сброшен до %s", "command.waila.client_dump_success" : "Клиент успешно сброшен до %s", + + + + + + + + + + + + "command.waila.overlay.true" : "Оверлей включен", "command.waila.overlay.false" : "Оверлей выключен", + "command.waila.config.unknown_id" : "ID конфигурации неизвестного плагина %s", "command.waila.config.get.id" : "ID конфигурации плагина: %s", "command.waila.config.get.synced" : "Синхронизировано: %s", @@ -127,6 +174,7 @@ "config.waila.overlay_fps" : "Лимит FPS для подсказки", "config.waila.overlay_fps_desc" : "Снижает частоту отрисовки подсказки для общего увеличения FPS\nУстановите 0 чтобы снять лимит", + "config.waila.overlay_pos_x" : "Смещение по X", "config.waila.overlay_pos_x_desc" : "Позиция X относительно привязки экрана\nРазмер влияет на позицию", "config.waila.overlay_pos_y" : "Смещение по Y", @@ -188,6 +236,8 @@ "key.waila.show_recipe_input" : "Отображать применение в рецептах", "key.waila.show_recipe_output" : "Отображать рецепты", + "config.waila.plugin_" : "_DO_NOT_TRANSLATE_", + "config.waila.plugin_minecraft" : "Minecraft", "config.waila.plugin_minecraft.item_entity" : "Отображать сущности предметов", "config.waila.plugin_minecraft.breaking_progress" : "Прогресс ломания", @@ -203,6 +253,8 @@ "config.waila.plugin_minecraft.override.vehicle_desc" : "Скрывать вагонетки, лошадей и прочие сущности, если игрок сидит на них", "config.waila.plugin_minecraft.spawner_type" : "Отображать тип рассадника", "config.waila.plugin_minecraft.crop_progress" : "Отображать зрелость урожая", + + "config.waila.plugin_minecraft.redstone" : "Редстоун", "config.waila.plugin_minecraft.redstone.lever" : "Отображать положение рычага", "config.waila.plugin_minecraft.redstone.repeater" : "Отображать задержку повторителя", @@ -273,6 +325,13 @@ "config.waila.plugin_waila.icon_position_middle" : "Посередине", "config.waila.plugin_waila.icon_position_bottom" : "Внизу", + + + + + + + "config.waila.plugin_wailax" : "Waila Extra", "config.waila.plugin_wailax.energy" : "Энергия", "config.waila.plugin_wailax.energy.enabled_block" : "Энергия блоков", @@ -319,9 +378,5 @@ "theme.waila.plugin_waila.nine_patch.regionRight" : "Регион: правый", "theme.waila.plugin_waila.nine_patch.mode" : "Режим отрисовки", "theme.waila.plugin_waila.nine_patch.mode_stretch" : "Растягивание", - "theme.waila.plugin_waila.nine_patch.mode_tile" : "Плитка", - - "tooltip.waila.instrument" : "_DO_NOT_TRANSLATE_", - "tooltip.waila.panda.gene" : "_DO_NOT_TRANSLATE_", - "config.waila.plugin_" : "_DO_NOT_TRANSLATE_" + "theme.waila.plugin_waila.nine_patch.mode_tile" : "Плитка" } diff --git a/src/resources/resources/assets/waila/lang/sv_se.json b/src/resources/resources/assets/waila/lang/sv_se.json index 1cb466321..2eb16f2de 100644 --- a/src/resources/resources/assets/waila/lang/sv_se.json +++ b/src/resources/resources/assets/waila/lang/sv_se.json @@ -1,5 +1,7 @@ { "tooltip.waila.crop_growth" : "Tillväxt", + + "tooltip.waila.crop_mature" : "Fullvuxen", "tooltip.waila.empty" : "Tom", "tooltip.waila.delay" : "Fördröjning", @@ -9,6 +11,8 @@ "tooltip.waila.state" : "Tillstånd", "tooltip.waila.state_on" : "PÅ", "tooltip.waila.state_off" : "AV", + + "tooltip.waila.power" : "Styrka", "tooltip.waila.sneak_for_details" : "Smyg för information", "tooltip.waila.compost_level" : "Kompostnivå", @@ -33,6 +37,9 @@ + + + "tooltip.waila.instrument" : "_DO_NOT_TRANSLATE_", "tooltip.waila.instrument.harp" : "Harpa", "tooltip.waila.instrument.basedrum" : "Bastrumma", "tooltip.waila.instrument.snare" : "Virveltrumma", @@ -59,10 +66,37 @@ "tooltip.waila.extra.energy" : "Energi", "tooltip.waila.extra.unknown_fluid" : "Okänd vätska", + + + + + + + + + + + + + + + + + + + + "gui.waila.configuration" : "Konfiguration för %s", "gui.waila.waila_settings" : "Inställningar för %s", - "gui.waila.plugin_settings" : "Inställningar för insticksprogram", + + + + + + + + "gui.waila.credits" : "Erkännande", "gui.waila.credits.original_mod_by" : "Originalmodden \"WAILA\" av", @@ -72,8 +106,21 @@ "command.waila.server_dump_success" : "Dedikerad server dumpades till %s", "command.waila.local_dump_success" : "Lokal server dumpades till %s", "command.waila.client_dump_success" : "Klient dumpades till %s", + + + + + + + + + + + + "command.waila.overlay.true" : "Överlägg har aktiverats", "command.waila.overlay.false" : "Överlägg har inaktiverats", + "command.waila.config.unknown_id" : "Insticksprogrammets konfigurerings-ID %s är okänt", "command.waila.config.get.id" : "Konfigurerings-ID för insticksprogram: %s", "command.waila.config.get.synced" : "Synkad: %s", @@ -127,6 +174,7 @@ + "config.waila.overlay_pos_x" : "X-förskjutning", "config.waila.overlay_pos_x_desc" : "X-position relativt från skärmankaret\nPositionen påverkas av skalan", "config.waila.overlay_pos_y" : "Y-förskjutning", @@ -188,6 +236,8 @@ "key.waila.show_recipe_input" : "Visa receptanvändning", "key.waila.show_recipe_output" : "Visa recept", + "config.waila.plugin_" : "_DO_NOT_TRANSLATE_", + "config.waila.plugin_minecraft" : "Minecraft", "config.waila.plugin_minecraft.item_entity" : "Visa föremålsentiteter", "config.waila.plugin_minecraft.breaking_progress" : "Blockbrytningsförlopp", @@ -203,6 +253,8 @@ "config.waila.plugin_minecraft.override.vehicle_desc" : "Dölj gruvvagnar, hästar och andra färdmedelsentiteter när spelar färdas på den", "config.waila.plugin_minecraft.spawner_type" : "Visa typ av monsterskapare", "config.waila.plugin_minecraft.crop_progress" : "Visa grödförlopp", + + "config.waila.plugin_minecraft.redstone" : "Redstone", "config.waila.plugin_minecraft.redstone.lever" : "Visa spaktillstånd", "config.waila.plugin_minecraft.redstone.repeater" : "Visa uppreparfördröjning", @@ -256,6 +308,9 @@ + + + "config.waila.plugin_waila" : "Waila Core", "config.waila.plugin_waila.show_mod_name" : "Visa modnamn", "config.waila.plugin_waila.show_item_mod_name" : "Visa modnamn för föremål", @@ -270,6 +325,13 @@ "config.waila.plugin_waila.icon_position_middle" : "Mitten", "config.waila.plugin_waila.icon_position_bottom" : "Underkant", + + + + + + + "config.waila.plugin_wailax" : "Waila Extra", "config.waila.plugin_wailax.energy" : "Energi", "config.waila.plugin_wailax.energy.enabled_block" : "Visa blockenergi", @@ -316,9 +378,5 @@ "theme.waila.plugin_waila.nine_patch.regionRight" : "Region: Högerkant", "theme.waila.plugin_waila.nine_patch.mode" : "Ritningsläge", "theme.waila.plugin_waila.nine_patch.mode_stretch" : "Sträck ut", - "theme.waila.plugin_waila.nine_patch.mode_tile" : "Upprepa", - - "tooltip.waila.instrument" : "_DO_NOT_TRANSLATE_", - - "config.waila.plugin_" : "_DO_NOT_TRANSLATE_" + "theme.waila.plugin_waila.nine_patch.mode_tile" : "Upprepa" } diff --git a/src/resources/resources/assets/waila/lang/zh_cn.json b/src/resources/resources/assets/waila/lang/zh_cn.json index 5444fcd7d..b688c428b 100644 --- a/src/resources/resources/assets/waila/lang/zh_cn.json +++ b/src/resources/resources/assets/waila/lang/zh_cn.json @@ -37,6 +37,9 @@ + + + "tooltip.waila.instrument" : "_DO_NOT_TRANSLATE_", "tooltip.waila.instrument.harp" : "竖琴", "tooltip.waila.instrument.basedrum" : "底鼓", "tooltip.waila.instrument.snare" : "小军鼓", @@ -63,10 +66,37 @@ "tooltip.waila.extra.energy" : "能量", "tooltip.waila.extra.unknown_fluid" : "未知流体", + + + + + + + + + + + + + + + + + + + + "gui.waila.configuration" : "%s配置", "gui.waila.waila_settings" : "%s设置", - "gui.waila.plugin_settings" : "插件设置", + + + + + + + + "gui.waila.credits" : "致谢名单", "gui.waila.credits.original_mod_by" : "“WAILA”模组原作者", @@ -76,8 +106,21 @@ "command.waila.server_dump_success" : "成功转存专用服务器到%s", "command.waila.local_dump_success" : "成功转存本地服务器到%s", "command.waila.client_dump_success" : "成功转存客户到%s", + + + + + + + + + + + + "command.waila.overlay.true" : "启用覆盖", "command.waila.overlay.false" : "禁用覆盖", + "command.waila.config.unknown_id" : "未知的插件配置ID:%s", "command.waila.config.get.id" : "插件配置ID:%s", "command.waila.config.get.synced" : "同步:%s", @@ -131,6 +174,7 @@ + "config.waila.overlay_pos_x" : "X轴偏移", "config.waila.overlay_pos_x_desc" : "相对于屏幕锚点的X坐标\n坐标受尺寸影响", "config.waila.overlay_pos_y" : "Y轴偏移", @@ -192,6 +236,8 @@ "key.waila.show_recipe_input" : "显示配方用途", "key.waila.show_recipe_output" : "显示配方", + "config.waila.plugin_" : "_DO_NOT_TRANSLATE_", + "config.waila.plugin_minecraft" : "Minecraft", "config.waila.plugin_minecraft.item_entity" : "显示物品实体", "config.waila.plugin_minecraft.breaking_progress" : "挖掘进度", @@ -262,6 +308,9 @@ + + + "config.waila.plugin_waila" : "Waila核心", "config.waila.plugin_waila.show_mod_name" : "显示模组名称", "config.waila.plugin_waila.show_item_mod_name" : "显示物品模组名称", @@ -276,6 +325,13 @@ "config.waila.plugin_waila.icon_position_middle" : "中间", "config.waila.plugin_waila.icon_position_bottom" : "底部", + + + + + + + "config.waila.plugin_wailax" : "Waila附加", "config.waila.plugin_wailax.energy" : "能量", "config.waila.plugin_wailax.energy.enabled_block" : "显示方块能量", @@ -322,9 +378,5 @@ "theme.waila.plugin_waila.nine_patch.regionRight" : "区域:右侧", "theme.waila.plugin_waila.nine_patch.mode" : "图案契合度", "theme.waila.plugin_waila.nine_patch.mode_stretch" : "拉伸", - "theme.waila.plugin_waila.nine_patch.mode_tile" : "平铺", - - "tooltip.waila.instrument" : "_DO_NOT_TRANSLATE_", - - "config.waila.plugin_" : "_DO_NOT_TRANSLATE_" + "theme.waila.plugin_waila.nine_patch.mode_tile" : "平铺" } diff --git a/src/resources/resources/assets/waila/lang/zh_tw.json b/src/resources/resources/assets/waila/lang/zh_tw.json index 580f271e1..7b729d1f9 100644 --- a/src/resources/resources/assets/waila/lang/zh_tw.json +++ b/src/resources/resources/assets/waila/lang/zh_tw.json @@ -1,5 +1,7 @@ { "tooltip.waila.crop_growth" : "生長進度", + + "tooltip.waila.crop_mature" : "成熟", "tooltip.waila.empty" : "空", "tooltip.waila.delay" : "延遲", @@ -9,6 +11,8 @@ "tooltip.waila.state" : "狀態", "tooltip.waila.state_on" : "開", "tooltip.waila.state_off" : "關", + + "tooltip.waila.power" : "訊號強度", "tooltip.waila.sneak_for_details" : "潛行顯示詳細資訊", "tooltip.waila.compost_level" : "堆肥桶等級", @@ -33,6 +37,9 @@ + + + "tooltip.waila.instrument.harp" : "豎琴", "tooltip.waila.instrument.basedrum" : "大鼓", "tooltip.waila.instrument.snare" : "小鼓", @@ -59,10 +66,37 @@ + + + + + + + + + + + + + + + + + + + + "gui.waila.configuration" : "%s 組態", "gui.waila.waila_settings" : "%s 設定", - "gui.waila.plugin_settings" : "附屬設定", + + + + + + + + "gui.waila.credits" : "銘謝名單", "gui.waila.credits.original_mod_by" : "原始模組《WAILA》作者", @@ -77,6 +111,19 @@ + + + + + + + + + + + + + @@ -127,6 +174,7 @@ + "config.waila.overlay_pos_x" : "X 軸偏移量", "config.waila.overlay_pos_x_desc" : "相對於畫面錨點的 X 軸位置\n位置會受放大比例影響", "config.waila.overlay_pos_y" : "Y 軸偏移量", @@ -188,6 +236,8 @@ "key.waila.show_recipe_input" : "顯示合成用途", "key.waila.show_recipe_output" : "顯示合成配方", + + "config.waila.plugin_minecraft" : "Minecraft", "config.waila.plugin_minecraft.item_entity" : "顯示物品實體", "config.waila.plugin_minecraft.breaking_progress" : "挖掘進度", @@ -203,6 +253,8 @@ "config.waila.plugin_minecraft.spawner_type" : "顯示生怪磚類型", "config.waila.plugin_minecraft.crop_progress" : "顯示作物生長進度", + + "config.waila.plugin_minecraft.redstone" : "紅石", "config.waila.plugin_minecraft.redstone.lever" : "顯示控制桿狀態", "config.waila.plugin_minecraft.redstone.repeater" : "顯示中繼器延遲", @@ -252,6 +304,9 @@ + + + @@ -317,6 +372,9 @@ + + +