custom ench desc: further flex
This commit is contained in:
		@@ -18,7 +18,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.7-pre4
 | 
					mod_version=3.0.7-pre9
 | 
				
			||||||
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
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -1,5 +1,6 @@
 | 
				
			|||||||
package dev.xkmc.l2core.base.entity;
 | 
					package dev.xkmc.l2core.base.entity;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					import com.mojang.datafixers.util.Pair;
 | 
				
			||||||
import com.mojang.serialization.Codec;
 | 
					import com.mojang.serialization.Codec;
 | 
				
			||||||
import net.minecraft.core.BlockPos;
 | 
					import net.minecraft.core.BlockPos;
 | 
				
			||||||
import net.minecraft.core.RegistryAccess;
 | 
					import net.minecraft.core.RegistryAccess;
 | 
				
			||||||
@@ -25,9 +26,9 @@ public class SyncedData {
 | 
				
			|||||||
	public static final Serializer<Optional<UUID>> UUID;
 | 
						public static final Serializer<Optional<UUID>> UUID;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	static {
 | 
						static {
 | 
				
			||||||
		INT = new Serializer<>(EntityDataSerializers.INT, Codec.INT);
 | 
							INT = new Simple<>(EntityDataSerializers.INT, Codec.INT);
 | 
				
			||||||
		BLOCK_POS = new Serializer<>(EntityDataSerializers.BLOCK_POS, BlockPos.CODEC);
 | 
							BLOCK_POS = new Simple<>(EntityDataSerializers.BLOCK_POS, BlockPos.CODEC);
 | 
				
			||||||
		UUID = new Serializer<>(EntityDataSerializers.OPTIONAL_UUID, UUIDUtil.CODEC.xmap(Optional::of, Optional::get));
 | 
							UUID = new Opt<>(EntityDataSerializers.OPTIONAL_UUID, UUIDUtil.CODEC);
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	private final Definer cls;
 | 
						private final Definer cls;
 | 
				
			||||||
@@ -71,7 +72,7 @@ public class SyncedData {
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
		private Data(Serializer<T> ser, T init, @Nullable String name) {
 | 
							private Data(Serializer<T> ser, T init, @Nullable String name) {
 | 
				
			||||||
			this.ser = ser;
 | 
								this.ser = ser;
 | 
				
			||||||
			this.data = cls.define(ser.ser());
 | 
								this.data = cls.define(ser.data());
 | 
				
			||||||
			this.init = init;
 | 
								this.init = init;
 | 
				
			||||||
			this.name = name;
 | 
								this.name = name;
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
@@ -93,7 +94,19 @@ public class SyncedData {
 | 
				
			|||||||
		}
 | 
							}
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	public record Serializer<T>(EntityDataSerializer<T> ser, Codec<T> codec) {
 | 
						public interface Serializer<T> {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							EntityDataSerializer<T> data();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							@Nullable
 | 
				
			||||||
 | 
							Tag write(RegistryAccess pvd, T t);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							@Nullable
 | 
				
			||||||
 | 
							T read(RegistryAccess pvd, Tag tag);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						public record Simple<T>(EntityDataSerializer<T> data, Codec<T> codec) implements Serializer<T> {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		@Nullable
 | 
							@Nullable
 | 
				
			||||||
		public Tag write(RegistryAccess pvd, T t) {
 | 
							public Tag write(RegistryAccess pvd, T t) {
 | 
				
			||||||
@@ -107,6 +120,19 @@ public class SyncedData {
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						public record Opt<T>(EntityDataSerializer<Optional<T>> data, Codec<T> codec) implements Serializer<Optional<T>> {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							@Nullable
 | 
				
			||||||
 | 
							public Tag write(RegistryAccess pvd, Optional<T> val) {
 | 
				
			||||||
 | 
								return val.map(e -> codec.encodeStart(pvd.createSerializationContext(NbtOps.INSTANCE), e).getOrThrow()).orElse(null);
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							public Optional<T> read(RegistryAccess pvd, Tag tag) {
 | 
				
			||||||
 | 
								return codec.decode(pvd.createSerializationContext(NbtOps.INSTANCE), tag).result().map(Pair::getFirst);
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	public interface Definer {
 | 
						public interface Definer {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		<T> EntityDataAccessor<T> define(EntityDataSerializer<T> ser);
 | 
							<T> EntityDataAccessor<T> define(EntityDataSerializer<T> ser);
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -83,8 +83,14 @@ public class ClientEventHandler {
 | 
				
			|||||||
				compound.set(i, Either.left(comp));
 | 
									compound.set(i, Either.left(comp));
 | 
				
			||||||
				flag = true;
 | 
									flag = true;
 | 
				
			||||||
			} else color = EnchColor.DEFAULT;
 | 
								} else color = EnchColor.DEFAULT;
 | 
				
			||||||
			if (skip) continue;
 | 
					
 | 
				
			||||||
			var legacy = LegacyEnchantment.findFirst(ench.get(), CustomDescEnchantment.class);
 | 
								var legacy = LegacyEnchantment.findFirst(ench.get(), CustomDescEnchantment.class);
 | 
				
			||||||
 | 
								if (legacy.isPresent()){
 | 
				
			||||||
 | 
									comp = legacy.get().title(stack, list.get(i), alt, book, color);
 | 
				
			||||||
 | 
									compound.set(i, Either.left(comp));
 | 
				
			||||||
 | 
									flag = true;
 | 
				
			||||||
 | 
								}
 | 
				
			||||||
 | 
								if (skip) continue;
 | 
				
			||||||
			if (legacy.isEmpty()) {
 | 
								if (legacy.isEmpty()) {
 | 
				
			||||||
				if (I18n.exists(tr.getKey() + ".desc")) {
 | 
									if (I18n.exists(tr.getKey() + ".desc")) {
 | 
				
			||||||
					compound.set(i, Either.right(List.of(comp, Component.translatable(tr.getKey() + ".desc")
 | 
										compound.set(i, Either.right(List.of(comp, Component.translatable(tr.getKey() + ".desc")
 | 
				
			||||||
@@ -93,7 +99,7 @@ public class ClientEventHandler {
 | 
				
			|||||||
				}
 | 
									}
 | 
				
			||||||
			} else {
 | 
								} else {
 | 
				
			||||||
				int lv = map.getLevel(ench.get());
 | 
									int lv = map.getLevel(ench.get());
 | 
				
			||||||
				var es = legacy.get().descFull(lv, tr.getKey() + ".desc", alt, book, color);
 | 
									var es = legacy.get().descFull(stack, 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()));
 | 
									compound.set(i, Either.right(Stream.concat(Stream.of(comp), es.stream().map(e -> (Component) lit.copy().append(e))).toList()));
 | 
				
			||||||
				flag = true;
 | 
									flag = true;
 | 
				
			||||||
			}
 | 
								}
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -6,15 +6,26 @@ import net.minecraft.network.chat.MutableComponent;
 | 
				
			|||||||
import net.minecraft.world.effect.MobEffect;
 | 
					import net.minecraft.world.effect.MobEffect;
 | 
				
			||||||
import net.minecraft.world.effect.MobEffectInstance;
 | 
					import net.minecraft.world.effect.MobEffectInstance;
 | 
				
			||||||
import net.minecraft.world.effect.MobEffectUtil;
 | 
					import net.minecraft.world.effect.MobEffectUtil;
 | 
				
			||||||
 | 
					import net.minecraft.world.item.ItemStack;
 | 
				
			||||||
 | 
					import org.jetbrains.annotations.ApiStatus;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
import java.util.List;
 | 
					import java.util.List;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
public interface CustomDescEnchantment {
 | 
					public interface CustomDescEnchantment {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						default List<Component> descFull(ItemStack stack, int lv, String key, boolean alt, boolean book, EnchColor color) {
 | 
				
			||||||
 | 
							return descFull(lv, key, alt, book, color);
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						@ApiStatus.OverrideOnly
 | 
				
			||||||
	default List<Component> descFull(int lv, String key, boolean alt, boolean book, EnchColor color) {
 | 
						default List<Component> descFull(int lv, String key, boolean alt, boolean book, EnchColor color) {
 | 
				
			||||||
		return List.of(Component.translatable(key).withStyle(color.desc()));
 | 
							return List.of(Component.translatable(key).withStyle(color.desc()));
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						default Component title(ItemStack stack, Component comp, boolean alt, boolean book, EnchColor color) {
 | 
				
			||||||
 | 
							return comp.copy().withStyle(color.base());
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	static MutableComponent perc(double val) {
 | 
						static MutableComponent perc(double val) {
 | 
				
			||||||
		return Component.literal(Math.round(val * 100) + "%").withStyle(ChatFormatting.DARK_AQUA);
 | 
							return Component.literal(Math.round(val * 100) + "%").withStyle(ChatFormatting.DARK_AQUA);
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -95,11 +95,12 @@ public class EnchReg {
 | 
				
			|||||||
						e.withEffect(unit.get()))))));
 | 
											e.withEffect(unit.get()))))));
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	public EnchVal enchLegacy(String id, String name, String desc, UnaryOperator<EnchVal.Builder> cons, Supplier<LegacyEnchantment> factory) {
 | 
						public <T extends LegacyEnchantment> EnchVal.Legacy<T> enchLegacy(String id, String name, String desc, UnaryOperator<EnchVal.Builder> cons, Supplier<T> factory) {
 | 
				
			||||||
		var unit = legacy.register(id, factory);
 | 
							var unit = legacy.register(id, factory);
 | 
				
			||||||
		return enchBase(id, name, desc, key -> new EnchVal.Simple(key,
 | 
							return enchBase(id, name, desc, key -> new EnchVal.LegacyImpl<>(key, unit,
 | 
				
			||||||
				Lazy.of(() -> cons.apply(new EnchVal.Builder(key.location()).effect(e ->
 | 
									Lazy.of(() -> cons.apply(new EnchVal.Builder(key.location()).effect(e ->
 | 
				
			||||||
						e.withSpecialEffect(L2LibReg.LEGACY.get(), List.of(unit.get())))))));
 | 
											e.withSpecialEffect(L2LibReg.LEGACY.get(), List.of(unit.get())))))
 | 
				
			||||||
 | 
							));
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	public void build(BootstrapContext<Enchantment> ctx) {
 | 
						public void build(BootstrapContext<Enchantment> ctx) {
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -18,6 +18,7 @@ import net.minecraft.world.item.enchantment.ItemEnchantments;
 | 
				
			|||||||
import net.neoforged.neoforge.common.CommonHooks;
 | 
					import net.neoforged.neoforge.common.CommonHooks;
 | 
				
			||||||
import net.neoforged.neoforge.common.Tags;
 | 
					import net.neoforged.neoforge.common.Tags;
 | 
				
			||||||
import net.neoforged.neoforge.common.util.Lazy;
 | 
					import net.neoforged.neoforge.common.util.Lazy;
 | 
				
			||||||
 | 
					import net.neoforged.neoforge.registries.DeferredHolder;
 | 
				
			||||||
import org.jetbrains.annotations.Nullable;
 | 
					import org.jetbrains.annotations.Nullable;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
import java.util.ArrayList;
 | 
					import java.util.ArrayList;
 | 
				
			||||||
@@ -62,6 +63,12 @@ public interface EnchVal {
 | 
				
			|||||||
		EECVal.Flag unit();
 | 
							EECVal.Flag unit();
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						interface Legacy<T extends LegacyEnchantment> extends EnchVal {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							DeferredHolder<LegacyEnchantment, T> legacy();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	record Simple(ResourceKey<Enchantment> id, Lazy<Builder> builder) implements Impl {
 | 
						record Simple(ResourceKey<Enchantment> id, Lazy<Builder> builder) implements Impl {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
@@ -70,6 +77,12 @@ public interface EnchVal {
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						record LegacyImpl<T extends LegacyEnchantment>(
 | 
				
			||||||
 | 
								ResourceKey<Enchantment> id, DeferredHolder<LegacyEnchantment, T> legacy, Lazy<Builder> builder
 | 
				
			||||||
 | 
						) implements Legacy<T>, Impl {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	class Builder {
 | 
						class Builder {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		private HolderSetBuilder<Item> supported, primary;
 | 
							private HolderSetBuilder<Item> supported, primary;
 | 
				
			||||||
 
 | 
				
			|||||||
		Reference in New Issue
	
	Block a user