fix token sync

This commit is contained in:
lcy0x1
2025-07-28 14:06:49 +08:00
parent adfadd5eb7
commit ea1d87e16d
18 changed files with 113 additions and 54 deletions

View File

@@ -1,9 +1,13 @@
plugins { plugins {
id 'java-library' id 'java-library'
id 'eclipse' id 'eclipse'
id 'idea' id 'idea'
id 'maven-publish' id 'maven-publish'
id 'net.neoforged.gradle.userdev' version '7.0.165' id 'net.neoforged.moddev' version '2.0.80'
id 'net.darkhax.curseforgegradle' version '[1.1.24,)'
id "at.stnwtr.gradle-secrets-plugin" version "1.0.1"
id "com.modrinth.minotaur" version "2.+"
} }
version = mod_version version = mod_version
@@ -17,37 +21,53 @@ base {
archivesName = mod_id archivesName = mod_id
} }
java {
withSourcesJar()
}
java.toolchain.languageVersion = JavaLanguageVersion.of(21) java.toolchain.languageVersion = JavaLanguageVersion.of(21)
minecraft.accessTransformers.file rootProject.file('src/main/resources/META-INF/accesstransformer.cfg') sourceSets {
client {}
server {}
data {}
common {}
}
runs { neoForge {
configureEach { // We currently only support NeoForge versions later than 21.0.x
systemProperty 'forge.logging.markers', 'REGISTRIES' // See https://projects.neoforged.net/neoforged/neoforge for the latest updates
systemProperty 'forge.logging.console.level', 'debug' version = "${neo_version}"
modSource project.sourceSets.main
// Validate AT files and raise errors when they have invalid targets
// This option is false by default, but turning it on is recommended
//validateAccessTransformers = true
accessTransformers.from "./src/main/resources/META-INF/accesstransformer.cfg"
runs {
client {
client()
}
data {
data()
programArguments.addAll '--mod', project.mod_id, '--all', '--output', file('src/generated/resources/').getAbsolutePath(), '--existing', file('src/main/resources/').getAbsolutePath()
}
server {
server()
}
} }
client {
systemProperty 'forge.enabledGameTestNamespaces', project.mod_id mods {
} "${mod_id}" {
server { sourceSet sourceSets.main
systemProperty 'forge.enabledGameTestNamespaces', project.mod_id }
}
gameTestServer {
systemProperty 'forge.enabledGameTestNamespaces', project.mod_id
}
data {
programArguments.addAll '--mod', project.mod_id, '--all', '--output', file('src/generated/resources/').getAbsolutePath(), '--existing', file('src/main/resources/').getAbsolutePath()
} }
} }
sourceSets.main.resources { srcDir 'src/generated/resources' } sourceSets.main.resources { srcDir 'src/generated/resources' }
dependencies {
implementation "net.neoforged:neoforge:${neo_version}"
}
tasks.withType(ProcessResources).configureEach { tasks.withType(ProcessResources).configureEach {
var replaceProperties = [ var replaceProperties = [
minecraft_version : minecraft_version, minecraft_version_range: minecraft_version_range, minecraft_version : minecraft_version, minecraft_version_range: minecraft_version_range,
@@ -83,10 +103,6 @@ tasks.withType(JavaCompile).configureEach {
if (lljij.toBoolean()) jarJar.enable() if (lljij.toBoolean()) jarJar.enable()
java {
withSourcesJar()
}
jar { jar {
manifest { manifest {
attributes([ attributes([

View File

@@ -8,9 +8,11 @@ org.gradle.debug=false
neogradle.subsystems.parchment.minecraftVersion=1.20.6 neogradle.subsystems.parchment.minecraftVersion=1.20.6
neogradle.subsystems.parchment.mappingsVersion=2024.06.02 neogradle.subsystems.parchment.mappingsVersion=2024.06.02
org.gradle.configuration-cache=false
minecraft_version=1.21.1 minecraft_version=1.21.1
minecraft_version_range=[1.21.1,1.22) minecraft_version_range=[1.21.1,1.22)
neo_version=21.1.93 neo_version=21.1.143
neo_version_range=[21.1.4,) neo_version_range=[21.1.4,)
loader_version_range=[2,) loader_version_range=[2,)
@@ -18,7 +20,7 @@ loader_version_range=[2,)
mod_id=l2core mod_id=l2core
mod_name=L2Core mod_name=L2Core
mod_license=LGPL-2.1 mod_license=LGPL-2.1
mod_version=3.0.8+8 mod_version=3.0.8+15
mod_group_id=dev.xkmc mod_group_id=dev.xkmc
mod_authors=lcy0x1 mod_authors=lcy0x1
mod_description=Core Library mod for all L2 mods mod_description=Core Library mod for all L2 mods

View File

@@ -1,6 +1,6 @@
distributionBase=GRADLE_USER_HOME distributionBase=GRADLE_USER_HOME
distributionPath=wrapper/dists distributionPath=wrapper/dists
distributionUrl=https\://services.gradle.org/distributions/gradle-8.8-bin.zip distributionUrl=https\://services.gradle.org/distributions/gradle-8.10-bin.zip
networkTimeout=10000 networkTimeout=10000
zipStoreBase=GRADLE_USER_HOME zipStoreBase=GRADLE_USER_HOME
zipStorePath=wrapper/dists zipStorePath=wrapper/dists

View File

@@ -7,5 +7,5 @@ pluginManagement {
} }
plugins { plugins {
id 'org.gradle.toolchains.foojay-resolver-convention' version '0.5.0' id 'org.gradle.toolchains.foojay-resolver-convention' version '0.8.0'
} }

View File

@@ -1,4 +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)] // 1.21.1 2025-07-26T01:42:31.138209 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 72a986cabe624a799bdb74cc1b5e67dd6f80baed assets/l2core/lang/en_ud.json
18ae34417262501a3c00959390185e01ffb2ae7c assets/l2core/lang/en_us.json 9eab006827655c8a83941f5d9c71681a1244378c assets/l2core/lang/en_us.json
35133e95f1c8fdd7a1c21afcc231fc0bffefb9a8 data/l2core/tags/mob_effect/tracked_effects.json 35133e95f1c8fdd7a1c21afcc231fc0bffefb9a8 data/l2core/tags/mob_effect/tracked_effects.json

View File

@@ -2,7 +2,9 @@
"l2core.configuration.addEnchantmentDescription": "suoıʇdıɹɔsǝᗡ ʇuǝɯʇuɐɥɔuƎ ppⱯ", "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.addEnchantmentDescription.tooltip": "SʎⱯMꞀⱯ 'ʎꞀNO‾⟘ℲIHS 'ƎꞀᗺⱯSIᗡ :sǝnןɐΛ pǝʍoןןⱯ",
"l2core.configuration.overlayZVal": "ʎɐןɹǝʌo ɹǝʇɔɐɹɐɥɔ ɯǝʇı ɟo ʇɥbıǝɥ ǝɥ⟘", "l2core.configuration.overlayZVal": "ʎɐןɹǝʌo ɹǝʇɔɐɹɐɥɔ ɯǝʇı ɟo ʇɥbıǝɥ ǝɥ⟘",
"l2core.configuration.overlayZVal.tooltip": "000000Ɩ ~ 000000Ɩ- :ǝbuɐᴚ", "l2core.configuration.overlayZVal.tooltip": "000000Ɩ ~ 000000Ɩ- :ǝbuɐᴚ \n0ϛᄅ :ʇןnɐɟǝᗡ ",
"l2core.configuration.renderOverlayIcons": "sǝıʇıʇuǝ uo suoɔı ʎɐןɹǝʌo ɹǝpuǝᴚ",
"l2core.configuration.renderOverlayIcons.tooltip": "",
"l2core.configuration.section.l2configs.l2core.client.toml": "uoıʇɐɹnbıɟuoƆ ʇuǝıןƆ ǝɹoƆᄅꞀ", "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.section.l2configs.l2core.client.toml.title": "uoıʇɐɹnbıɟuoƆ ʇuǝıןƆ ǝɹoƆᄅꞀ",
"l2core.configuration.title": "uoıʇɐɹnbıɟuoƆ ǝɹoƆᄅꞀ", "l2core.configuration.title": "uoıʇɐɹnbıɟuoƆ ǝɹoƆᄅꞀ",

View File

@@ -2,7 +2,9 @@
"l2core.configuration.addEnchantmentDescription": "Add Enchantment Descriptions", "l2core.configuration.addEnchantmentDescription": "Add Enchantment Descriptions",
"l2core.configuration.addEnchantmentDescription.tooltip": "Allowed Values: DISABLE, SHIFT_ONLY, ALWAYS", "l2core.configuration.addEnchantmentDescription.tooltip": "Allowed Values: DISABLE, SHIFT_ONLY, ALWAYS",
"l2core.configuration.overlayZVal": "The height of item character overlay", "l2core.configuration.overlayZVal": "The height of item character overlay",
"l2core.configuration.overlayZVal.tooltip": "Range: -1000000 ~ 1000000", "l2core.configuration.overlayZVal.tooltip": " Default: 250\n Range: -1000000 ~ 1000000",
"l2core.configuration.renderOverlayIcons": "Render overlay icons on entities",
"l2core.configuration.renderOverlayIcons.tooltip": "",
"l2core.configuration.section.l2configs.l2core.client.toml": "L2Core Client Configuration", "l2core.configuration.section.l2configs.l2core.client.toml": "L2Core Client Configuration",
"l2core.configuration.section.l2configs.l2core.client.toml.title": "L2Core Client Configuration", "l2core.configuration.section.l2configs.l2core.client.toml.title": "L2Core Client Configuration",
"l2core.configuration.title": "L2Core Configuration", "l2core.configuration.title": "L2Core Configuration",

View File

@@ -2,14 +2,17 @@ package dev.xkmc.l2core.capability.conditionals;
import dev.xkmc.l2core.init.L2LibReg; import dev.xkmc.l2core.init.L2LibReg;
import dev.xkmc.l2core.util.Proxy; import dev.xkmc.l2core.util.Proxy;
import dev.xkmc.l2serial.serialization.codec.PacketCodec;
import dev.xkmc.l2serial.util.Wrappers; import dev.xkmc.l2serial.util.Wrappers;
import net.minecraft.world.entity.player.Player; import net.minecraft.world.entity.player.Player;
public class ClientDataHandler { public class ClientDataHandler {
public static <T extends ConditionalToken> void handle(TokenKey<T> key, T token) { public static <T extends ConditionalToken> void handle(TokenKey<T> key, byte[] data) {
Player player = Proxy.getClientPlayer(); Player player = Proxy.getClientPlayer();
if (player == null) return; if (player == null) return;
var buf = PacketCodec.decode(player.registryAccess(), data);
T token = Wrappers.cast(PacketCodec.from(buf, ConditionalToken.class, null));
ConditionalToken old = L2LibReg.CONDITIONAL.type().getOrCreate(player).data.put(key, token); ConditionalToken old = L2LibReg.CONDITIONAL.type().getOrCreate(player).data.put(key, token);
if (token instanceof NetworkSensitiveToken<?> t) { if (token instanceof NetworkSensitiveToken<?> t) {
t.onSync(Wrappers.cast(old), player); t.onSync(Wrappers.cast(old), player);

View File

@@ -10,7 +10,7 @@ public interface NetworkSensitiveToken<T extends ConditionalToken> {
void onSync(@Nullable T old, Player player); void onSync(@Nullable T old, Player player);
default void sync(TokenKey<T> key, T token, ServerPlayer sp) { default void sync(TokenKey<T> key, T token, ServerPlayer sp) {
L2Core.PACKET_HANDLER.toClientPlayer(TokenToClient.of(key, token), sp); L2Core.PACKET_HANDLER.toClientPlayer(TokenToClient.of(sp.registryAccess(), key, token), sp);
} }
} }

View File

@@ -1,20 +1,23 @@
package dev.xkmc.l2core.capability.conditionals; package dev.xkmc.l2core.capability.conditionals;
import dev.xkmc.l2serial.network.SerialPacketBase; import dev.xkmc.l2serial.network.SerialPacketBase;
import dev.xkmc.l2serial.serialization.codec.PacketCodec;
import net.minecraft.core.RegistryAccess;
import net.minecraft.resources.ResourceLocation; import net.minecraft.resources.ResourceLocation;
import net.minecraft.world.entity.player.Player; import net.minecraft.world.entity.player.Player;
import org.jetbrains.annotations.Nullable; import org.jetbrains.annotations.Nullable;
public record TokenToClient(ResourceLocation id, ConditionalToken token) public record TokenToClient(ResourceLocation id, byte[] data)
implements SerialPacketBase<TokenToClient> { implements SerialPacketBase<TokenToClient> {
public static <T extends ConditionalToken> TokenToClient of(TokenKey<T> key, T token) { public static <T extends ConditionalToken> TokenToClient of(RegistryAccess access, TokenKey<T> key, T token) {
return new TokenToClient(key.asLocation(), token); var data = PacketCodec.toBytes(access, token, ConditionalToken.class, e -> true);
return new TokenToClient(key.asLocation(), data);
} }
@Override @Override
public void handle(@Nullable Player player) { public void handle(@Nullable Player player) {
ClientDataHandler.handle(TokenKey.of(id), token); ClientDataHandler.handle(TokenKey.of(id), data);
} }
} }

View File

@@ -6,6 +6,7 @@ import net.minecraft.server.level.ServerPlayer;
import net.neoforged.bus.api.EventPriority; import net.neoforged.bus.api.EventPriority;
import net.neoforged.bus.api.SubscribeEvent; import net.neoforged.bus.api.SubscribeEvent;
import net.neoforged.fml.common.EventBusSubscriber; import net.neoforged.fml.common.EventBusSubscriber;
import net.neoforged.neoforge.event.entity.EntityJoinLevelEvent;
import net.neoforged.neoforge.event.entity.player.PlayerEvent; import net.neoforged.neoforge.event.entity.player.PlayerEvent;
import net.neoforged.neoforge.event.tick.PlayerTickEvent; import net.neoforged.neoforge.event.tick.PlayerTickEvent;
@@ -25,6 +26,13 @@ public class BaseCapabilityEvents {
for (PlayerCapabilityHolder<?> holder : PlayerCapabilityHolder.INTERNAL_MAP.values()) { for (PlayerCapabilityHolder<?> holder : PlayerCapabilityHolder.INTERNAL_MAP.values()) {
ServerPlayer e = (ServerPlayer) event.getEntity(); ServerPlayer e = (ServerPlayer) event.getEntity();
holder.getOrCreate(e).onClone(e, event.isWasDeath()); holder.getOrCreate(e).onClone(e, event.isWasDeath());
}
}
@SubscribeEvent(priority = EventPriority.LOW)
public static void onPlayerJoinLevel(EntityJoinLevelEvent event) {
if (!(event.getEntity() instanceof ServerPlayer e)) return;
for (PlayerCapabilityHolder<?> holder : PlayerCapabilityHolder.INTERNAL_MAP.values()) {
holder.network.toClient(e); holder.network.toClient(e);
holder.network.toTracking(e); holder.network.toTracking(e);
} }

View File

@@ -9,6 +9,7 @@ import dev.xkmc.l2core.base.effects.ClientEffectCap;
import dev.xkmc.l2core.base.effects.EffectToClient; import dev.xkmc.l2core.base.effects.EffectToClient;
import dev.xkmc.l2core.base.effects.api.*; import dev.xkmc.l2core.base.effects.api.*;
import dev.xkmc.l2core.init.L2Core; import dev.xkmc.l2core.init.L2Core;
import dev.xkmc.l2core.init.L2CoreConfig;
import dev.xkmc.l2core.init.L2LibReg; import dev.xkmc.l2core.init.L2LibReg;
import dev.xkmc.l2core.util.Proxy; import dev.xkmc.l2core.util.Proxy;
import net.minecraft.Util; import net.minecraft.Util;
@@ -83,7 +84,11 @@ public class ClientEffectRenderEvents {
@SubscribeEvent @SubscribeEvent
public static void levelRenderLast(RenderLevelStageEvent event) { public static void levelRenderLast(RenderLevelStageEvent event) {
if (event.getStage() != RenderLevelStageEvent.Stage.AFTER_WEATHER) return; if (event.getStage() != RenderLevelStageEvent.Stage.AFTER_WEATHER) return;
if (ICONS.isEmpty()) return;
if (!L2CoreConfig.CLIENT.renderOverlayIcons.get()) {
ICONS.clear();
return;
}
DUMMY.setupRenderState(); DUMMY.setupRenderState();
DUMMY.clearRenderState(); DUMMY.clearRenderState();
MultiBufferSource.BufferSource buffers = Minecraft.getInstance().renderBuffers().bufferSource(); MultiBufferSource.BufferSource buffers = Minecraft.getInstance().renderBuffers().bufferSource();

View File

@@ -10,6 +10,7 @@ public class L2CoreConfig {
public final ModConfigSpec.IntValue overlayZVal; public final ModConfigSpec.IntValue overlayZVal;
public final ModConfigSpec.EnumValue<ClientEventHandler.EnchDesc> addEnchantmentDescription; public final ModConfigSpec.EnumValue<ClientEventHandler.EnchDesc> addEnchantmentDescription;
public final ModConfigSpec.BooleanValue renderOverlayIcons;
Client(Builder builder) { Client(Builder builder) {
markL2(); markL2();
@@ -17,6 +18,8 @@ public class L2CoreConfig {
.defineInRange("overlayZVal", 250, -1000000, 1000000); .defineInRange("overlayZVal", 250, -1000000, 1000000);
addEnchantmentDescription = builder.text("Add Enchantment Descriptions") addEnchantmentDescription = builder.text("Add Enchantment Descriptions")
.defineEnum("addEnchantmentDescription", ClientEventHandler.EnchDesc.ALWAYS); .defineEnum("addEnchantmentDescription", ClientEventHandler.EnchDesc.ALWAYS);
renderOverlayIcons = builder.text("Render overlay icons on entities")
.define("renderOverlayIcons", true);
} }
} }

View File

@@ -14,6 +14,7 @@ import dev.xkmc.l2core.init.L2Core;
import dev.xkmc.l2core.init.reg.simple.Val; import dev.xkmc.l2core.init.reg.simple.Val;
import dev.xkmc.l2core.util.ConfigInit; import dev.xkmc.l2core.util.ConfigInit;
import dev.xkmc.l2serial.serialization.custom_handler.CodecHandler; import dev.xkmc.l2serial.serialization.custom_handler.CodecHandler;
import dev.xkmc.l2serial.serialization.custom_handler.Handlers;
import dev.xkmc.l2serial.util.ModContainerHack; import dev.xkmc.l2serial.util.ModContainerHack;
import dev.xkmc.l2serial.util.Wrappers; import dev.xkmc.l2serial.util.Wrappers;
import net.minecraft.client.particle.ParticleEngine; import net.minecraft.client.particle.ParticleEngine;
@@ -21,7 +22,6 @@ import net.minecraft.client.particle.ParticleProvider;
import net.minecraft.core.Registry; import net.minecraft.core.Registry;
import net.minecraft.core.particles.ParticleOptions; import net.minecraft.core.particles.ParticleOptions;
import net.minecraft.core.particles.ParticleType; import net.minecraft.core.particles.ParticleType;
import net.minecraft.core.registries.BuiltInRegistries;
import net.minecraft.core.registries.Registries; import net.minecraft.core.registries.Registries;
import net.minecraft.network.chat.Component; import net.minecraft.network.chat.Component;
import net.minecraft.network.codec.ByteBufCodecs; import net.minecraft.network.codec.ByteBufCodecs;
@@ -146,6 +146,7 @@ public class L2Registrate extends AbstractRegistrate<L2Registrate> {
cons.accept(ans); cons.accept(ans);
var reg = ans.create(); var reg = ans.create();
new CodecHandler<>(Wrappers.cast(cls), reg.byNameCodec(), ByteBufCodecs.fromCodecWithRegistries(reg.byNameCodec())); new CodecHandler<>(Wrappers.cast(cls), reg.byNameCodec(), ByteBufCodecs.fromCodecWithRegistries(reg.byNameCodec()));
Handlers.registerReg(Wrappers.cast(cls), key);
OneTimeEventReceiver.addModListener(this, NewRegistryEvent.class, (e) -> e.register(reg)); OneTimeEventReceiver.addModListener(this, NewRegistryEvent.class, (e) -> e.register(reg));
return new RegistryInstance<>(reg, key); return new RegistryInstance<>(reg, key);
} }
@@ -246,13 +247,6 @@ public class L2Registrate extends AbstractRegistrate<L2Registrate> {
before = e.id; before = e.id;
} }
} }
for (var e : BuiltInRegistries.CREATIVE_MODE_TAB.entrySet()) {
var id = e.getKey().location();
if (known(id) || known(e.getValue())) {
continue;
}
b.withTabsAfter(id);
}
} }
private static boolean known(ResourceLocation id) { private static boolean known(ResourceLocation id) {

View File

@@ -0,0 +1,17 @@
package dev.xkmc.l2core.mixin;
import net.minecraft.core.registries.BuiltInRegistries;
import net.minecraft.world.item.CreativeModeTab;
import org.spongepowered.asm.mixin.Mixin;
@Mixin(CreativeModeTab.class)
public class CreativeModeTabMixin {
@Override
public String toString() {
CreativeModeTab tab = (CreativeModeTab) (Object) this;
var key = BuiltInRegistries.CREATIVE_MODE_TAB.getKey(tab);
return key == null ? "[Unregistered]" : key.toString();
}
}

View File

@@ -5,6 +5,7 @@ import net.minecraft.MethodsReturnNonnullByDefault;
import net.minecraft.network.RegistryFriendlyByteBuf; import net.minecraft.network.RegistryFriendlyByteBuf;
import net.minecraft.network.codec.StreamCodec; import net.minecraft.network.codec.StreamCodec;
import net.minecraft.world.item.ItemStack; import net.minecraft.world.item.ItemStack;
import net.minecraft.world.item.Items;
import net.minecraft.world.item.crafting.Ingredient; import net.minecraft.world.item.crafting.Ingredient;
import net.minecraft.world.item.crafting.SmithingTransformRecipe; import net.minecraft.world.item.crafting.SmithingTransformRecipe;
@@ -14,7 +15,7 @@ import javax.annotation.ParametersAreNonnullByDefault;
@MethodsReturnNonnullByDefault @MethodsReturnNonnullByDefault
public abstract class AbstractSmithingRecipe<T extends AbstractSmithingRecipe<T>> extends SmithingTransformRecipe { public abstract class AbstractSmithingRecipe<T extends AbstractSmithingRecipe<T>> extends SmithingTransformRecipe {
public static final Ingredient TEMPLATE_PLACEHOLDER = Ingredient.EMPTY; public static final Ingredient TEMPLATE_PLACEHOLDER = Ingredient.of(Items.PAPER);
public AbstractSmithingRecipe(Ingredient template, Ingredient base, Ingredient addition, ItemStack result) { public AbstractSmithingRecipe(Ingredient template, Ingredient base, Ingredient addition, ItemStack result) {
super(template, base, addition, result); super(template, base, addition, result);

View File

@@ -6,5 +6,7 @@
"l2core.configuration.overlayZVal.tooltip": "默认值250", "l2core.configuration.overlayZVal.tooltip": "默认值250",
"l2core.configuration.section.l2configs.l2core.client.toml": "莱特兰核心 - 客户端配置", "l2core.configuration.section.l2configs.l2core.client.toml": "莱特兰核心 - 客户端配置",
"l2core.configuration.section.l2configs.l2core.client.toml.title": "莱特兰核心 - 客户端配置", "l2core.configuration.section.l2configs.l2core.client.toml.title": "莱特兰核心 - 客户端配置",
"l2core.configuration.title": "莱特兰核心 - 配置" "l2core.configuration.title": "莱特兰核心 - 配置",
"l2core.configuration.renderOverlayIcons": "实体图标显示",
"l2core.configuration.renderOverlayIcons.tooltip": ""
} }

View File

@@ -4,11 +4,12 @@
"package": "dev.xkmc.l2core.mixin", "package": "dev.xkmc.l2core.mixin",
"compatibilityLevel": "JAVA_21", "compatibilityLevel": "JAVA_21",
"mixins": [ "mixins": [
"CreativeModeTabMixin"
], ],
"client": [ "client": [
], ],
"injectors": { "injectors": {
"defaultRequire": 1 "defaultRequire": 1
}, },
"minVersion": "0.8" "minVersion": "0.8"
} }