diff --git a/gen_md.py b/gen_md.py index ffff1f1..b07f37e 100755 --- a/gen_md.py +++ b/gen_md.py @@ -30,7 +30,7 @@ DESCRIPTIONS: dict[str, dict] = {} for k, v in descriptions_raw.items(): rule_name = ( - re.compile(r'carpet\.rule\.(\w+)\.(?:desc|extra\.\d+|additional)') + re.compile(r'rug\.rule\.(\w+)\.(?:desc|extra\.\d+|additional)') .search(k) .group(1) ) diff --git a/src/main/java/de/rubixdev/rug/RugServer.java b/src/main/java/de/rubixdev/rug/RugServer.java index db5cf4a..b2e0acf 100644 --- a/src/main/java/de/rubixdev/rug/RugServer.java +++ b/src/main/java/de/rubixdev/rug/RugServer.java @@ -4,6 +4,7 @@ import carpet.CarpetServer; import carpet.api.settings.CarpetRule; import carpet.api.settings.RuleHelper; +import carpet.api.settings.SettingsManager; import carpet.script.Module; import com.google.common.base.CaseFormat; import com.google.common.collect.Lists; @@ -19,10 +20,7 @@ import java.nio.file.Files; import java.nio.file.Path; import java.nio.file.StandardCopyOption; -import java.util.Collection; -import java.util.Collections; -import java.util.List; -import java.util.Map; +import java.util.*; import java.util.stream.Stream; import net.fabricmc.api.ModInitializer; import net.fabricmc.fabric.api.event.player.UseBlockCallback; @@ -58,10 +56,10 @@ public class RugServer implements CarpetExtension, ModInitializer { public static final Logger LOGGER = LogManager.getLogger("Rug"); - public static final String MOD_ID = "rug"; -// public static final String MOD_NAME; + public static final String MOD_NAME; public static final String MOD_VERSION; + public static SettingsManager settingsManager; private static MinecraftServer minecraftServer; private static Path datapackPath; @@ -71,9 +69,9 @@ public class RugServer implements CarpetExtension, ModInitializer { .getModContainer(MOD_ID) .orElseThrow(RuntimeException::new) .getMetadata(); -// MOD_NAME = metadata.getName(); + MOD_NAME = metadata.getName(); MOD_VERSION = metadata.getVersion().getFriendlyString(); -// settingsManager = new SettingsManager(MOD_VERSION, MOD_ID, MOD_NAME); + settingsManager = new SettingsManager(MOD_VERSION, MOD_ID, MOD_NAME); } @Override @@ -86,10 +84,17 @@ public void onInitialize() { CarpetServer.manageExtension(new RugServer()); } + @Override + public SettingsManager extensionSettingsManager() { + return settingsManager; + } + @Override public void onGameStarted() { LOGGER.info("Rug Mod v" + MOD_VERSION + " loaded!"); + // load rules into both settings managers + settingsManager.parseSettingsClass(RugSettings.class); CarpetServer.settingsManager.parseSettingsClass(RugSettings.class); } @@ -107,8 +112,17 @@ public Map canHasTranslations(String lang) { } catch (IOException e) { return Collections.emptyMap(); } - Gson gson = new Gson(); - return gson.fromJson(jsonData, new TypeToken>() {}.getType()); + + // create translation keys for both Carpet and Rug settingsManagers + Map map = new Gson().fromJson(jsonData, new TypeToken>() {}.getType()); + Map map2 = new HashMap<>(); + map.forEach((key, value) -> { + map2.put(key, value); + if(key.startsWith("rug.rule.")) { + map2.put(key.replace("rug.rule.", "carpet.rule."), value); + } + }); + return map2; } @Override @@ -268,7 +282,7 @@ public static void initializeRugData(Path datapacksPath) { if (craftingRule == null) continue; String ruleName = craftingRule.name().isEmpty() ? f.getName() : craftingRule.name(); updateCraftingRule( - CarpetServer.settingsManager.getCarpetRule(ruleName), + settingsManager.getCarpetRule(ruleName), craftingRule.recipes(), craftingRule.recipeNamespace(), ruleName); @@ -276,14 +290,16 @@ public static void initializeRugData(Path datapacksPath) { } private static void registerCraftingRule(String ruleName, String[] recipes, String recipeNamespace) { - updateCraftingRule(CarpetServer.settingsManager.getCarpetRule(ruleName), recipes, recipeNamespace, ruleName); + updateCraftingRule(settingsManager.getCarpetRule(ruleName), recipes, recipeNamespace, ruleName); - CarpetServer.settingsManager.registerRuleObserver((source, rule, s) -> { + SettingsManager.RuleObserver observer = (source, rule, s) -> { if (rule.name().equals(ruleName)) { updateCraftingRule(rule, recipes, recipeNamespace, ruleName); reload(); } - }); + }; + settingsManager.registerRuleObserver(observer); + CarpetServer.settingsManager.registerRuleObserver(observer); } private static void updateCraftingRule( diff --git a/src/main/java/de/rubixdev/rug/mixins/MinecraftServerMixin.java b/src/main/java/de/rubixdev/rug/mixins/MinecraftServerMixin.java index a795caa..aeabf30 100644 --- a/src/main/java/de/rubixdev/rug/mixins/MinecraftServerMixin.java +++ b/src/main/java/de/rubixdev/rug/mixins/MinecraftServerMixin.java @@ -27,8 +27,9 @@ private static void loadRugData( CallbackInfoReturnable cir) { // if no session exists yet (still in world creation screen), then do nothing if (Storage.session == null) return; - // make Carpet load the config file early + // make Carpet load the config file(s) early CarpetServer.settingsManager.attachServer(null); + RugServer.settingsManager.attachServer(null); // initialize `RugData` datapack RugServer.initializeRugData(Storage.session.getDirectory(WorldSavePath.DATAPACKS)); } diff --git a/src/main/java/de/rubixdev/rug/mixins/SettingsManagerMixin.java b/src/main/java/de/rubixdev/rug/mixins/SettingsManagerMixin.java index 68b3640..f1dc6a7 100644 --- a/src/main/java/de/rubixdev/rug/mixins/SettingsManagerMixin.java +++ b/src/main/java/de/rubixdev/rug/mixins/SettingsManagerMixin.java @@ -1,11 +1,16 @@ package de.rubixdev.rug.mixins; +import carpet.api.settings.CarpetRule; import carpet.api.settings.SettingsManager; import carpet.utils.Messenger; import carpet.utils.Translations; import de.rubixdev.rug.RugServer; import de.rubixdev.rug.util.Storage; import java.nio.file.Path; +import java.util.Collection; +import java.util.Collections; +import java.util.Map; + import net.minecraft.server.MinecraftServer; import net.minecraft.server.command.ServerCommandSource; import net.minecraft.util.WorldSavePath; @@ -64,4 +69,16 @@ private ServerCommandSource catchNullServer2(MinecraftServer instance) { if (instance == null) return null; return instance.getCommandSource(); } + + @Redirect( + method = "loadConfigurationFromConf", + at = @At(value = "INVOKE", target = "Ljava/util/Map;values()Ljava/util/Collection;"), + remap = false) + private Collection> skipReset(Map> instance) { + // Skip resetting rules to default to allow reading from both carpet.conf and rug.conf. + // We are only allowed to do this because carpet.conf will always be read first, which already + // resets all rules to their defaults. (Otherwise settings could persist between worlds) + // TODO: this assumes that no Rug rules are overwritten by another extension in the CarpetServer.settingsManager + return (Object) this == RugServer.settingsManager ? Collections.emptyList() : instance.values(); + } } diff --git a/src/main/resources/assets/rug/lang/en_us.yml b/src/main/resources/assets/rug/lang/en_us.yml index 0179456..8c667e6 100644 --- a/src/main/resources/assets/rug/lang/en_us.yml +++ b/src/main/resources/assets/rug/lang/en_us.yml @@ -1,4 +1,4 @@ -carpet: +rug: rule: anvilledBlueIce: desc: Custom amount of packed ice crushed by falling anvils make one blue ice.