config val fix

This commit is contained in:
lcy0x1
2024-07-26 08:19:43 +08:00
parent 152d185cd1
commit 340cd07a30
27 changed files with 378 additions and 50 deletions

View File

@@ -145,4 +145,5 @@ dependencies {
implementation "mezz.jei:jei-${jei_minecraft_version}:${jei_version}"
implementation "com.tterrag.registrate:Registrate:${registrate_version}"
implementation "dev.xkmc:l2serial:${l2serial_ver}"
}
implementation "vazkii.patchouli:Patchouli:${patchouli_ver}"
}

View File

@@ -18,7 +18,7 @@ loader_version_range=[2,)
mod_id=l2core
mod_name=L2Core
mod_license=LGPL-2.1
mod_version=3.0.6-pre10
mod_version=3.0.6-pre19
mod_group_id=dev.xkmc
mod_authors=lcy0x1
mod_description=Core Library mod for all L2 mods
@@ -27,6 +27,7 @@ mod_description=Core Library mod for all L2 mods
jei_minecraft_version = 1.21-neoforge
jei_version = 19.5.0.44
registrate_version = MC1.21-1.4.7+5e718e9
patchouli_ver = 1.21-87-NEOFORGE-SNAPSHOT
lljij = false
rootMod = false

View File

@@ -1,4 +0,0 @@
// 1.21 2024-07-22T16:24:34.828971 Registrate Provider for l2core [Data Maps, Recipes, Advancements, Loot Tables, Tags (blocks), Tags (items), Tags (fluids), Tags (entity_types), generic_server_provider, Blockstates, Item models, Lang (en_us/en_ud), generic_client_provider, Tags (mob_effect), Tags (attribute), Tags (enchantment), Registries]
684b615cec06e91692b3ea45372b4a39ca4d36fc assets/l2core/lang/en_ud.json
9bed3d62e02ce678c56912f1cdfde3af63c74741 assets/l2core/lang/en_us.json
35133e95f1c8fdd7a1c21afcc231fc0bffefb9a8 data/l2core/tags/mob_effect/tracked_effects.json

View File

@@ -0,0 +1,4 @@
// 1.21 2024-07-25T11:38:15.636395 Registrate Provider for l2core [Registries, Data Maps, Recipes, Advancements, Loot Tables, Tags (blocks), Tags (items), Tags (fluids), Tags (entity_types), generic_server_provider, Blockstates, Item models, Lang (en_us/en_ud), generic_client_provider, Tags (mob_effect), Tags (attribute), Tags (enchantment)]
7fd8a37c6437c7cab27c53dbc0df73ececc1cd44 assets/l2core/lang/en_ud.json
18ae34417262501a3c00959390185e01ffb2ae7c assets/l2core/lang/en_us.json
35133e95f1c8fdd7a1c21afcc231fc0bffefb9a8 data/l2core/tags/mob_effect/tracked_effects.json

View File

@@ -1,3 +1,10 @@
{
"l2core.configuration.addEnchantmentDescription": "suoıʇdıɹɔsǝᗡ ʇuǝɯʇuɐɥɔuƎ ppⱯ",
"l2core.configuration.addEnchantmentDescription.tooltip": "SʎⱯMꞀⱯ 'ʎꞀNO‾⟘ℲIHS 'ƎꞀᗺⱯSIᗡ :sǝnןɐΛ pǝʍoןןⱯ",
"l2core.configuration.overlayZVal": "ʎɐןɹǝʌo ɹǝʇɔɐɹɐɥɔ ɯǝʇı ɟo ʇɥbıǝɥ ǝɥ⟘",
"l2core.configuration.overlayZVal.tooltip": "000000Ɩ ~ 000000Ɩ- :ǝbuɐᴚ",
"l2core.configuration.section.l2configs.l2core.client.toml": "uoıʇɐɹnbıɟuoƆ ʇuǝıןƆ ǝɹoƆᄅꞀ",
"l2core.configuration.section.l2configs.l2core.client.toml.title": "uoıʇɐɹnbıɟuoƆ ʇuǝıןƆ ǝɹoƆᄅꞀ",
"l2core.configuration.title": "uoıʇɐɹnbıɟuoƆ ǝɹoƆᄅꞀ",
"l2core.title": "ǝɹoƆᄅꞀ"
}

View File

@@ -1,3 +1,10 @@
{
"l2core.configuration.addEnchantmentDescription": "Add Enchantment Descriptions",
"l2core.configuration.addEnchantmentDescription.tooltip": "Allowed Values: DISABLE, SHIFT_ONLY, ALWAYS",
"l2core.configuration.overlayZVal": "The height of item character overlay",
"l2core.configuration.overlayZVal.tooltip": "Range: -1000000 ~ 1000000",
"l2core.configuration.section.l2configs.l2core.client.toml": "L2Core Client Configuration",
"l2core.configuration.section.l2configs.l2core.client.toml.title": "L2Core Client Configuration",
"l2core.configuration.title": "L2Core Configuration",
"l2core.title": "L2Core"
}

View File

@@ -5,9 +5,12 @@ import com.tterrag.registrate.util.DataIngredient;
import dev.xkmc.l2core.init.reg.registrate.L2Registrate;
import dev.xkmc.l2core.serial.advancements.RewardBuilder;
import dev.xkmc.l2core.serial.recipe.ConditionalRecipeWrapper;
import net.minecraft.Util;
import net.minecraft.core.registries.Registries;
import net.minecraft.data.recipes.RecipeBuilder;
import net.minecraft.nbt.CompoundTag;
import net.minecraft.data.recipes.RecipeCategory;
import net.minecraft.data.recipes.ShapedRecipeBuilder;
import net.minecraft.data.recipes.ShapelessRecipeBuilder;
import net.minecraft.resources.ResourceKey;
import net.minecraft.resources.ResourceLocation;
import net.minecraft.world.item.CreativeModeTab;
@@ -15,8 +18,14 @@ import net.minecraft.world.item.Item;
import net.minecraft.world.item.ItemStack;
import net.minecraft.world.level.storage.loot.LootPool;
import net.minecraft.world.level.storage.loot.LootTable;
import net.minecraft.world.level.storage.loot.entries.LootItem;
import net.minecraft.world.level.storage.loot.functions.SetComponentsFunction;
import net.neoforged.neoforge.client.model.generators.ModelFile;
import vazkii.patchouli.common.item.ItemModBook;
import vazkii.patchouli.common.item.PatchouliDataComponents;
import vazkii.patchouli.common.item.PatchouliItems;
import java.util.function.Consumer;
import java.util.function.Supplier;
public class PatchouliHelper {
@@ -24,14 +33,13 @@ public class PatchouliHelper {
public static final ProviderType<PatchouliProvider> PATCHOULI = ProviderType.registerServerData("patchouli", PatchouliProvider::new);
public static ItemStack getBook(ResourceLocation book) {
return ItemStack.EMPTY; // TODO ItemModBook.forBook(book);
return ItemModBook.forBook(book);
}
public static LootTable.Builder getBookLoot(ResourceLocation book) {
CompoundTag tag = new CompoundTag();
tag.putString("patchouli:book", book.toString());
return LootTable.lootTable().withPool(
LootPool.lootPool()//TODO .add(LootItem.lootTableItem(PatchouliItems.BOOK).apply(SetNbtFunction.setTag(tag)))
LootPool.lootPool().add(LootItem.lootTableItem(PatchouliItems.BOOK)
.apply(SetComponentsFunction.setComponent(PatchouliDataComponents.BOOK, book)))
);
}
@@ -59,15 +67,13 @@ public class PatchouliHelper {
return this;
}
/* TODO
public PatchouliHelper buildShapelessRecipe(Consumer<ShapelessPatchouliBuilder> cons, Supplier<Item> unlock) {
return buildRecipe(() -> Util.make(new ShapelessPatchouliBuilder(book), cons), unlock);
public PatchouliHelper buildShapelessRecipe(Consumer<ShapelessRecipeBuilder> cons, Supplier<Item> unlock) {
return buildRecipe(() -> Util.make(new ShapelessRecipeBuilder(RecipeCategory.MISC, getBook(book)), cons), unlock);
}
public PatchouliHelper buildShapedRecipe(Consumer<ShapedPatchouliBuilder> cons, Supplier<Item> unlock) {
return buildRecipe(() -> Util.make(new ShapedPatchouliBuilder(book), cons), unlock);
public PatchouliHelper buildShapedRecipe(Consumer<ShapedRecipeBuilder> cons, Supplier<Item> unlock) {
return buildRecipe(() -> Util.make(new ShapedRecipeBuilder(RecipeCategory.MISC, getBook(book)), cons), unlock);
}
*/
private PatchouliHelper buildRecipe(Supplier<RecipeBuilder> cons, Supplier<Item> unlock) {
reg.addDataGenerator(ProviderType.RECIPE, pvd -> {

View File

@@ -0,0 +1,107 @@
package dev.xkmc.l2core.events;
import com.mojang.datafixers.util.Either;
import dev.xkmc.l2core.init.L2Core;
import dev.xkmc.l2core.init.L2CoreConfig;
import dev.xkmc.l2core.init.L2LibReg;
import dev.xkmc.l2core.init.reg.ench.CustomDescEnchantment;
import dev.xkmc.l2core.init.reg.ench.EnchColor;
import dev.xkmc.l2core.init.reg.ench.LegacyEnchantment;
import net.minecraft.client.gui.screens.Screen;
import net.minecraft.client.resources.language.I18n;
import net.minecraft.core.registries.Registries;
import net.minecraft.network.chat.Component;
import net.minecraft.network.chat.contents.PlainTextContents;
import net.minecraft.network.chat.contents.TranslatableContents;
import net.minecraft.resources.ResourceKey;
import net.minecraft.resources.ResourceLocation;
import net.minecraft.world.item.ItemStack;
import net.minecraft.world.item.Items;
import net.minecraft.world.item.enchantment.EnchantmentHelper;
import net.neoforged.api.distmarker.Dist;
import net.neoforged.bus.api.EventPriority;
import net.neoforged.bus.api.SubscribeEvent;
import net.neoforged.fml.common.EventBusSubscriber;
import net.neoforged.neoforge.event.entity.player.ItemTooltipEvent;
import java.util.ArrayList;
import java.util.Collection;
import java.util.List;
import java.util.stream.Stream;
@EventBusSubscriber(value = Dist.CLIENT, modid = L2Core.MODID, bus = EventBusSubscriber.Bus.GAME)
public class ClientEventHandler {
public enum EnchDesc {
DISABLE, SHIFT_ONLY, ALWAYS
}
@SubscribeEvent(priority = EventPriority.LOW)
public static void modifyItemTooltip(ItemTooltipEvent event) {
var config = L2CoreConfig.CLIENT.addEnchantmentDescription.get();
boolean skip = config == EnchDesc.DISABLE || config == EnchDesc.SHIFT_ONLY && !Screen.hasShiftDown();
var list = event.getToolTip();
int n = list.size();
ItemStack stack = event.getItemStack();
if (!stack.isEnchanted() && !stack.is(Items.ENCHANTED_BOOK)) return;
var map = EnchantmentHelper.getEnchantmentsForCrafting(stack);
String prefix = "enchantment.";
String suffix = ".desc";
boolean alt = Screen.hasAltDown();
boolean flag = false;
boolean book = event.getItemStack().is(Items.ENCHANTED_BOOK);
var registries = event.getContext().registries();
if (registries == null) return;
var reg = registries.lookup(Registries.ENCHANTMENT);
if (reg.isEmpty()) return;
List<Either<Component, List<Component>>> compound = new ArrayList<>();
for (var e : list) {
compound.add(Either.left(e));
}
for (int i = 0; i < n; i++) {
Component comp = list.get(i);
Component lit;
if (comp.getContents() instanceof PlainTextContents.LiteralContents txt && comp.getSiblings().size() == 1) {
comp = comp.getSiblings().getFirst();
lit = Component.literal(txt.text());
} else lit = Component.empty();
if (!(comp.getContents() instanceof TranslatableContents tr)) continue;
if (!tr.getKey().startsWith(prefix)) continue;
if (tr.getKey().endsWith(suffix)) {
compound.set(i, Either.right(List.of()));
flag = true;
continue;
}
String id = tr.getKey().substring(prefix.length());
var rl = ResourceLocation.tryBySeparator(id, '.');
if (rl == null) continue;
var ench = reg.get().get(ResourceKey.create(Registries.ENCHANTMENT, rl));
if (ench.isEmpty()) continue;
var color = LegacyEnchantment.firstOf(ench.get(), L2LibReg.COLOR);
if (color != null) {
comp = comp.copy().withStyle(color.base());
compound.set(i, Either.left(comp));
flag = true;
} else color = EnchColor.DEFAULT;
if (skip) continue;
var legacy = LegacyEnchantment.findFirst(ench.get(), CustomDescEnchantment.class);
if (legacy.isEmpty()) {
if (I18n.exists(tr.getKey() + ".desc")) {
compound.set(i, Either.right(List.of(comp, Component.translatable(tr.getKey() + ".desc")
.withStyle(color.desc()))));
flag = true;
}
} else {
int lv = map.getLevel(ench.get());
var es = legacy.get().descFull(lv, tr.getKey() + ".desc", alt, book, color);
compound.set(i, Either.right(Stream.concat(Stream.of(comp), es.stream().map(e -> (Component) lit.copy().append(e))).toList()));
flag = true;
}
}
if (flag) {
list.clear();
list.addAll(compound.stream().flatMap(e -> e.map(Stream::of, Collection::stream)).toList());
}
}
}

View File

@@ -9,10 +9,7 @@ import dev.xkmc.l2serial.network.PacketHandler;
import dev.xkmc.l2serial.serialization.custom_handler.Handlers;
import net.minecraft.resources.ResourceLocation;
import net.neoforged.bus.api.IEventBus;
import net.neoforged.bus.api.SubscribeEvent;
import net.neoforged.fml.common.EventBusSubscriber;
import net.neoforged.fml.common.Mod;
import net.neoforged.neoforge.data.event.GatherDataEvent;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
@@ -36,6 +33,7 @@ public class L2Core {
public L2Core(IEventBus bus) {
L2LibReg.register();
L2CoreConfig.init();
Handlers.register();
REGISTRATE.addDataGenerator(L2TagGen.EFF_TAGS, L2TagGen::onEffectTagGen);
}

View File

@@ -0,0 +1,29 @@
package dev.xkmc.l2core.init;
import dev.xkmc.l2core.events.ClientEventHandler;
import dev.xkmc.l2core.util.ConfigInit;
import net.neoforged.neoforge.common.ModConfigSpec;
public class L2CoreConfig {
public static class Client extends ConfigInit {
public final ModConfigSpec.IntValue overlayZVal;
public final ModConfigSpec.EnumValue<ClientEventHandler.EnchDesc> addEnchantmentDescription;
Client(Builder builder) {
markL2();
overlayZVal = builder.text("The height of item character overlay")
.defineInRange("overlayZVal", 250, -1000000, 1000000);
addEnchantmentDescription = builder.text("Add Enchantment Descriptions")
.defineEnum("addEnchantmentDescription", ClientEventHandler.EnchDesc.ALWAYS);
}
}
public static final Client CLIENT = L2Core.REGISTRATE.registerClient(Client::new);
public static void init() {
}
}

View File

@@ -1,6 +1,5 @@
package dev.xkmc.l2core.init;
import com.tterrag.registrate.providers.ProviderType;
import dev.xkmc.l2core.base.effects.ClientEffectCap;
import dev.xkmc.l2core.base.menu.base.MenuLayoutConfig;
import dev.xkmc.l2core.capability.conditionals.ConditionalData;
@@ -8,6 +7,7 @@ import dev.xkmc.l2core.capability.conditionals.PlayerFlagData;
import dev.xkmc.l2core.capability.player.PlayerCapabilityNetworkHandler;
import dev.xkmc.l2core.init.reg.datapack.DatapackReg;
import dev.xkmc.l2core.init.reg.ench.EECVal;
import dev.xkmc.l2core.init.reg.ench.EnchColor;
import dev.xkmc.l2core.init.reg.ench.EnchReg;
import dev.xkmc.l2core.init.reg.ench.LegacyEnchantment;
import dev.xkmc.l2core.init.reg.registrate.L2Registrate;
@@ -69,8 +69,9 @@ public class L2LibReg {
// enchantment
public static final L2Registrate.RegistryInstance<LegacyEnchantment> ENCH =
L2Core.REGISTRATE.newRegistry("legacy_enchantment", LegacyEnchantment.class, e -> e.sync(true));
public static final EECVal.Special<LegacyEnchantment> LEGACY =
EnchReg.of(REG, L2Core.REGISTRATE).special("legacy", ENCH.reg().byNameCodec());
private static final EnchReg ENCH_REG = EnchReg.of(REG, L2Core.REGISTRATE);
public static final EECVal.Special<EnchColor> COLOR = ENCH_REG.special("color", EnchColor.CODEC);
public static final EECVal.Special<LegacyEnchantment> LEGACY = ENCH_REG.special("legacy", ENCH.reg().byNameCodec());
public static void register() {
}

View File

@@ -0,0 +1,78 @@
package dev.xkmc.l2core.init.reg.ench;
import net.minecraft.ChatFormatting;
import net.minecraft.network.chat.Component;
import net.minecraft.network.chat.MutableComponent;
import net.minecraft.world.effect.MobEffect;
import net.minecraft.world.effect.MobEffectInstance;
import net.minecraft.world.effect.MobEffectUtil;
import java.util.List;
public interface CustomDescEnchantment {
default List<Component> descFull(int lv, String key, boolean alt, boolean book, EnchColor color) {
return List.of(Component.translatable(key).withStyle(color.desc()));
}
static MutableComponent perc(double val) {
return Component.literal(Math.round(val * 100) + "%").withStyle(ChatFormatting.DARK_AQUA);
}
static MutableComponent perc(int lv, double val, boolean alt) {
return (alt ? Component.literal("[Lv]x" + (int) Math.round(val * 100) + "%") :
Component.literal((int) Math.round(lv * val * 100) + "%"))
.withStyle(ChatFormatting.DARK_AQUA);
}
static MutableComponent percSmall(int lv, double val, boolean alt) {
return (alt ? Component.literal("[Lv]x" + (int) Math.round(val * 10000) / 100d + "%") :
Component.literal((int) Math.round(lv * val * 10000) / 100d + "%"))
.withStyle(ChatFormatting.DARK_AQUA);
}
static MutableComponent num(int val) {
return Component.literal("" + val).withStyle(ChatFormatting.DARK_AQUA);
}
static MutableComponent num(int lv, int val, boolean alt) {
return (alt ? val == 1 ? Component.literal("[Lv]") : Component.literal("[Lv]x" + val) :
Component.literal(lv * val + ""))
.withStyle(ChatFormatting.DARK_AQUA);
}
static MutableComponent numSmall(double val) {
return Component.literal("" + val).withStyle(ChatFormatting.DARK_AQUA);
}
static MutableComponent numSmall(int lv, double val, boolean alt) {
return (alt ? val == 1 ? Component.literal("[Lv]") : Component.literal("[Lv]x" + val) :
Component.literal(lv * val + ""))
.withStyle(ChatFormatting.DARK_AQUA);
}
static Component ench(String key, MutableComponent... perc) {
return Component.translatable(key, (Object[]) perc).withStyle(ChatFormatting.GRAY);
}
static MutableComponent eff(MobEffectInstance ins) {
return eff(ins, true, true);
}
static MutableComponent eff(MobEffectInstance ins, boolean showLevel, boolean showDuration) {
MutableComponent desc = Component.translatable(ins.getDescriptionId());
if (showLevel && ins.getAmplifier() > 0) {
desc = Component.translatable("potion.withAmplifier", desc,
Component.translatable("potion.potency." + ins.getAmplifier()));
}
if (showDuration && !ins.endsWithin(19)) {
desc = Component.translatable("potion.withDuration", desc, MobEffectUtil.formatDuration(ins, 1, 20));
}
return desc.withStyle(ins.getEffect().value().getCategory().getTooltipFormatting());
}
static MutableComponent eff(MobEffect eff) {
return eff.getDisplayName().copy().withStyle(eff.getCategory().getTooltipFormatting());
}
}

View File

@@ -0,0 +1,16 @@
package dev.xkmc.l2core.init.reg.ench;
import com.mojang.serialization.Codec;
import com.mojang.serialization.codecs.RecordCodecBuilder;
import net.minecraft.ChatFormatting;
public record EnchColor(ChatFormatting base, ChatFormatting desc) {
public static final EnchColor DEFAULT = new EnchColor(ChatFormatting.GRAY, ChatFormatting.DARK_GRAY);
public static final Codec<EnchColor> CODEC = RecordCodecBuilder.create(i -> i.group(
ChatFormatting.CODEC.fieldOf("base").forGetter(e -> e.base),
ChatFormatting.CODEC.fieldOf("desc").forGetter(e -> e.desc)
).apply(i, EnchColor::new));
}

View File

@@ -1,6 +1,7 @@
package dev.xkmc.l2core.init.reg.ench;
import com.tterrag.registrate.providers.RegistrateProvider;
import dev.xkmc.l2core.init.L2LibReg;
import dev.xkmc.l2core.util.DataGenOnly;
import net.minecraft.core.Holder;
import net.minecraft.core.component.DataComponents;
@@ -169,6 +170,15 @@ public interface EnchVal {
return this;
}
public <T> Builder special(EECVal.Special<T> type, T val) {
this.effects.add(e -> e.withSpecialEffect(type.get(), List.of(val)));
return this;
}
public Builder color(EnchColor color) {
return special(L2LibReg.COLOR, color);
}
Enchantment build(BootstrapContext<Enchantment> ctx, ResourceLocation id) {
var items = ctx.registryLookup(Registries.ITEM).orElseThrow();
var enchs = ctx.lookup(Registries.ENCHANTMENT);

View File

@@ -19,6 +19,14 @@ import java.util.*;
public class LegacyEnchantment {
@Nullable
public static <T> T firstOf(Holder<Enchantment> ench, EECVal.Special<T> comp) {
for (var e : ench.value().getEffects(comp.get())) {
return Wrappers.cast(e);
}
return null;
}
@Nullable
public static <T> T firstOf(Holder<Enchantment> ench, Class<T> cls) {
for (var e : ench.value().getEffects(L2LibReg.LEGACY.get())) {
@@ -62,8 +70,4 @@ public class LegacyEnchantment {
return map;
}
public List<Component> descFull(int lv, String key, boolean alt, boolean book) {
return List.of(Component.translatable(key).withStyle(ChatFormatting.DARK_GRAY));
}
}

View File

@@ -74,6 +74,10 @@ public class L2Registrate extends AbstractRegistrate<L2Registrate> {
return ConfigInit.register(this, ModConfig.Type.CLIENT, factory);
}
public <T extends ConfigInit> T registerUnsynced(Function<ConfigInit.Builder, T> factory) {
return ConfigInit.register(this, ModConfig.Type.COMMON, factory);
}
public <T extends ConfigInit> T registerSynced(Function<ConfigInit.Builder, T> factory) {
return ConfigInit.register(this, ModConfig.Type.SERVER, factory);
}

View File

@@ -1,11 +1,14 @@
package dev.xkmc.l2core.serial.configval;
import dev.xkmc.l2core.init.L2Core;
import dev.xkmc.l2core.util.ConfigInit;
import dev.xkmc.l2serial.util.Wrappers;
import net.neoforged.fml.config.ConfigTracker;
import net.neoforged.fml.config.IConfigSpec;
import net.neoforged.fml.config.ModConfig;
import net.neoforged.neoforge.common.ModConfigSpec;
import javax.annotation.Nullable;
import java.util.List;
import java.util.Map;
import java.util.Optional;
@@ -14,26 +17,36 @@ public class AbstractConfigParser {
private static Map<String, ModConfig> getMap() {
try {
return Wrappers.cast(ConfigTracker.class.getDeclaredField("fileMap").get(ConfigTracker.INSTANCE));
var field = ConfigTracker.class.getDeclaredField("fileMap");
field.setAccessible(true);
return Wrappers.cast(field.get(ConfigTracker.INSTANCE));
} catch (Exception e) {
L2Core.LOGGER.throwing(e);
return Map.of();
}
}
public static Optional<Object> parse(String path, List<String> line) {
@Nullable
private static IConfigSpec getSpec(String path) {
var init = ConfigInit.get(path);
if (init != null) return init.getSpec();
var map = getMap();
var file = map.get(path);
if (file == null) {
L2Core.LOGGER.warn("File {} is not a config file", path);
return Optional.empty();
return null;
}
var spec = file.getSpec();
if (!(spec instanceof ModConfigSpec modSpec) || !modSpec.isLoaded()){
return file.getSpec();
}
public static Optional<Object> parse(String path, List<String> line) {
var spec = getSpec(path);
if (!(spec instanceof ModConfigSpec modSpec) || !modSpec.isLoaded()) {
L2Core.LOGGER.warn("File {} is not a loaded config file", path);
return Optional.empty();
}
return Optional.ofNullable(modSpec.getValues().get(line));
return Optional.<ModConfigSpec.ConfigValue<?>>ofNullable(modSpec.getValues().get(line))
.map(ModConfigSpec.ConfigValue::get);
}
}

View File

@@ -2,15 +2,17 @@ package dev.xkmc.l2core.serial.configval;
import com.mojang.datafixers.util.Either;
import com.mojang.serialization.Codec;
import dev.xkmc.l2core.util.ConfigInit;
import net.neoforged.neoforge.common.ModConfigSpec;
import java.util.List;
import java.util.function.BooleanSupplier;
import java.util.function.Function;
public record BooleanConfigValue(String path, List<String> line) implements BooleanSupplier {
public static BooleanConfigValue of(String file, ModConfigSpec.ConfigValue<Double> config) {
return new BooleanConfigValue(file, config.getPath());
public static <T extends ConfigInit> BooleanConfigValue of(T file, Function<T, ModConfigSpec.ConfigValue<Boolean>> config) {
return new BooleanConfigValue(file.getPath(), config.apply(file).getPath());
}
public static BooleanConfigValue of(String data) {

View File

@@ -2,15 +2,17 @@ package dev.xkmc.l2core.serial.configval;
import com.mojang.serialization.MapCodec;
import dev.xkmc.l2core.init.L2LibReg;
import dev.xkmc.l2core.util.ConfigInit;
import net.neoforged.neoforge.common.ModConfigSpec;
import net.neoforged.neoforge.common.conditions.ICondition;
import java.util.ArrayList;
import java.util.function.Function;
public record BooleanValueCondition(String path, ArrayList<String> line, boolean expected) implements ICondition {
public static BooleanValueCondition of(String file, ModConfigSpec.ConfigValue<Boolean> config, boolean value) {
return new BooleanValueCondition(file, new ArrayList<>(config.getPath()), value);
public static <T extends ConfigInit> BooleanValueCondition of(T file, Function<T, ModConfigSpec.ConfigValue<Boolean>> config, boolean value) {
return new BooleanValueCondition(file.getPath(), new ArrayList<>(config.apply(file).getPath()), value);
}
@Override

View File

@@ -2,15 +2,17 @@ package dev.xkmc.l2core.serial.configval;
import com.mojang.datafixers.util.Either;
import com.mojang.serialization.Codec;
import dev.xkmc.l2core.util.ConfigInit;
import net.neoforged.neoforge.common.ModConfigSpec;
import java.util.List;
import java.util.function.DoubleSupplier;
import java.util.function.Function;
public record DoubleConfigValue(String path, List<String> line) implements DoubleSupplier {
public static DoubleConfigValue of(String file, ModConfigSpec.ConfigValue<Double> config) {
return new DoubleConfigValue(file, config.getPath());
public static <T extends ConfigInit> DoubleConfigValue of(T file, Function<T, ModConfigSpec.ConfigValue<Double>> config) {
return new DoubleConfigValue(file.getPath(), config.apply(file).getPath());
}
public static DoubleConfigValue of(String data) {

View File

@@ -2,15 +2,17 @@ package dev.xkmc.l2core.serial.configval;
import com.mojang.serialization.MapCodec;
import dev.xkmc.l2core.init.L2LibReg;
import dev.xkmc.l2core.util.ConfigInit;
import net.neoforged.neoforge.common.ModConfigSpec;
import net.neoforged.neoforge.common.conditions.ICondition;
import java.util.ArrayList;
import java.util.function.Function;
public record DoubleValueCondition(String path, ArrayList<String> line, double low, double high) implements ICondition {
public static DoubleValueCondition of(String file, ModConfigSpec.ConfigValue<Double> config, double low, double high) {
return new DoubleValueCondition(file, new ArrayList<>(config.getPath()), low, high);
public static <T extends ConfigInit> DoubleValueCondition of(T file, Function<T, ModConfigSpec.ConfigValue<Double>> config, double low, double high) {
return new DoubleValueCondition(file.getPath(), new ArrayList<>(config.apply(file).getPath()), low, high);
}
@Override

View File

@@ -2,15 +2,17 @@ package dev.xkmc.l2core.serial.configval;
import com.mojang.datafixers.util.Either;
import com.mojang.serialization.Codec;
import dev.xkmc.l2core.util.ConfigInit;
import net.neoforged.neoforge.common.ModConfigSpec;
import java.util.List;
import java.util.function.Function;
import java.util.function.IntSupplier;
public record IntConfigValue(String path, List<String> line) implements IntSupplier {
public static IntConfigValue of(String file, ModConfigSpec.ConfigValue<Integer> config) {
return new IntConfigValue(file, config.getPath());
public static <T extends ConfigInit> IntConfigValue of(T file, Function<T, ModConfigSpec.ConfigValue<Integer>> config) {
return new IntConfigValue(file.getPath(), config.apply(file).getPath());
}
public static IntConfigValue of(String data) {

View File

@@ -2,15 +2,17 @@ package dev.xkmc.l2core.serial.configval;
import com.mojang.serialization.MapCodec;
import dev.xkmc.l2core.init.L2LibReg;
import dev.xkmc.l2core.util.ConfigInit;
import net.neoforged.neoforge.common.ModConfigSpec;
import net.neoforged.neoforge.common.conditions.ICondition;
import java.util.ArrayList;
import java.util.function.Function;
public record IntValueCondition(String path, ArrayList<String> line, int low, int high) implements ICondition {
public static IntValueCondition of(String file, ModConfigSpec.ConfigValue<Integer> config, int low, int high) {
return new IntValueCondition(file, new ArrayList<>(config.getPath()), low, high);
public static <T extends ConfigInit> IntValueCondition of(T file, Function<T, ModConfigSpec.ConfigValue<Double>> config, int low, int high) {
return new IntValueCondition(file.getPath(), new ArrayList<>(config.apply(file).getPath()), low, high);
}
@Override

View File

@@ -2,16 +2,18 @@ package dev.xkmc.l2core.serial.configval;
import com.mojang.serialization.MapCodec;
import dev.xkmc.l2core.init.L2LibReg;
import dev.xkmc.l2core.util.ConfigInit;
import net.neoforged.neoforge.common.ModConfigSpec;
import net.neoforged.neoforge.common.conditions.ICondition;
import java.util.ArrayList;
import java.util.List;
import java.util.function.Function;
public record ListStringValueCondition(String path, ArrayList<String> line, String key) implements ICondition {
public static ListStringValueCondition of(String file, ModConfigSpec.ConfigValue<List<String>> config, String key) {
return new ListStringValueCondition(file, new ArrayList<>(config.getPath()), key);
public static <T extends ConfigInit> ListStringValueCondition of(T file, Function<T, ModConfigSpec.ConfigValue<Double>> config, String key) {
return new ListStringValueCondition(file.getPath(), new ArrayList<>(config.apply(file).getPath()), key);
}
@Override

View File

@@ -2,15 +2,17 @@ package dev.xkmc.l2core.serial.configval;
import com.mojang.serialization.MapCodec;
import dev.xkmc.l2core.init.L2LibReg;
import dev.xkmc.l2core.util.ConfigInit;
import net.neoforged.neoforge.common.ModConfigSpec;
import net.neoforged.neoforge.common.conditions.ICondition;
import java.util.ArrayList;
import java.util.function.Function;
public record StringValueCondition(String path, ArrayList<String> line, String key) implements ICondition {
public static StringValueCondition of(String file, ModConfigSpec.ConfigValue<String> config, String key) {
return new StringValueCondition(file, new ArrayList<>(config.getPath()), key);
public static <T extends ConfigInit> StringValueCondition of(T file, Function<T, ModConfigSpec.ConfigValue<Double>> config, String key) {
return new StringValueCondition(file.getPath(), new ArrayList<>(config.apply(file).getPath()), key);
}
@Override

View File

@@ -12,15 +12,35 @@ import net.neoforged.neoforge.client.gui.ConfigurationScreen;
import net.neoforged.neoforge.client.gui.IConfigScreenFactory;
import net.neoforged.neoforge.common.ModConfigSpec;
import javax.annotation.Nullable;
import java.util.List;
import java.util.concurrent.ConcurrentHashMap;
import java.util.function.Function;
import java.util.function.Supplier;
public class ConfigInit {
private static final ConcurrentHashMap<String, ConfigInit> MAP = new ConcurrentHashMap<>();
@Nullable
public static ConfigInit get(String path) {
return MAP.get(path);
}
private String folder = null;
private String path = "";
public ModConfig.Type getType() {
return type;
}
public IConfigSpec getSpec() {
return spec;
}
private ModConfig.Type type;
private IConfigSpec spec;
public String getPath() {
return path;
}
@@ -52,6 +72,9 @@ public class ConfigInit {
String path = val.folder + mod.getModId() + "-" + type.extension() + ".toml";
mod.registerConfig(type, spec, path);
val.path = path;
val.type = type;
val.spec = spec;
MAP.put(path, val);
RegistrateDistExecutor.unsafeRunWhenOn(Dist.CLIENT, () -> () -> initClient(mod));
reg.initConfigTitle(mod);
String typeName = RegistrateLangProvider.toEnglishName(type.extension());

View File

@@ -1,3 +1,10 @@
{
"l2core.title": "莱特兰·核心"
"l2core.title": "莱特兰·核心",
"l2core.configuration.addEnchantmentDescription": "附魔描述显示",
"l2core.configuration.addEnchantmentDescription.tooltip": "包含莱特兰自身的依赖等级/配置的特殊附魔描述显示。\n其他附魔描述模组可能无法正常显示本模组部分附魔的描述。\n- DISABLE关闭附魔描述\n- SHIFT_ONLY只在按SHIFT时显示附魔描述\n- ALWAYS永远显示附魔描述",
"l2core.configuration.overlayZVal": "物品文字渲染高度",
"l2core.configuration.overlayZVal.tooltip": "默认值250",
"l2core.configuration.section.l2configs.l2core.client.toml": "莱特兰核心 - 客户端配置",
"l2core.configuration.section.l2configs.l2core.client.toml.title": "莱特兰核心 - 客户端配置",
"l2core.configuration.title": "莱特兰核心 - 配置"
}