Skip to content

Commit

Permalink
feat: use custom settings manager alongside carpet's own one
Browse files Browse the repository at this point in the history
  • Loading branch information
RubixDev committed Dec 14, 2023
1 parent 4bbdcef commit ba47b7b
Show file tree
Hide file tree
Showing 5 changed files with 51 additions and 17 deletions.
2 changes: 1 addition & 1 deletion gen_md.py
Original file line number Diff line number Diff line change
Expand Up @@ -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)
)
Expand Down
44 changes: 30 additions & 14 deletions src/main/java/de/rubixdev/rug/RugServer.java
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand All @@ -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;
Expand Down Expand Up @@ -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;
Expand All @@ -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
Expand All @@ -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);
}

Expand All @@ -107,8 +112,17 @@ public Map<String, String> canHasTranslations(String lang) {
} catch (IOException e) {
return Collections.emptyMap();
}
Gson gson = new Gson();
return gson.fromJson(jsonData, new TypeToken<Map<String, String>>() {}.getType());

// create translation keys for both Carpet and Rug settingsManagers
Map<String, String> map = new Gson().fromJson(jsonData, new TypeToken<Map<String, String>>() {}.getType());
Map<String, String> 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
Expand Down Expand Up @@ -268,22 +282,24 @@ 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);
}
}

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(
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -27,8 +27,9 @@ private static void loadRugData(
CallbackInfoReturnable<DataConfiguration> 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));
}
Expand Down
17 changes: 17 additions & 0 deletions src/main/java/de/rubixdev/rug/mixins/SettingsManagerMixin.java
Original file line number Diff line number Diff line change
@@ -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;
Expand Down Expand Up @@ -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<CarpetRule<?>> skipReset(Map<String, CarpetRule<?>> 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();
}
}
2 changes: 1 addition & 1 deletion src/main/resources/assets/rug/lang/en_us.yml
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
carpet:
rug:
rule:
anvilledBlueIce:
desc: Custom amount of packed ice crushed by falling anvils make one blue ice.
Expand Down

0 comments on commit ba47b7b

Please sign in to comment.