From 8894999249b1aa959d880bafe28c49ca6559ea60 Mon Sep 17 00:00:00 2001 From: lcy0x1 Date: Thu, 18 Jul 2024 16:49:42 +0800 Subject: [PATCH] enchantment improvements --- gradle.properties | 6 +- .../compat/patchouli/PatchouliHelper.java | 2 +- .../compat/patchouli/PatchouliProvider.java | 5 +- .../java/dev/xkmc/l2core/init/L2LibReg.java | 1 + .../java/dev/xkmc/l2core/init/L2TagGen.java | 16 +++-- .../dev/xkmc/l2core/init/reg/ench/EECVal.java | 6 +- .../xkmc/l2core/init/reg/ench/EnchHolder.java | 7 +++ .../xkmc/l2core/init/reg/ench/EnchReg.java | 46 +++++++++----- .../init/reg/ench/LegacyEnchantment.java | 63 +++++++++++++++++++ .../init/reg/registrate/L2Registrate.java | 36 +++++++++++ .../xkmc/l2core/init/reg/simple/DCReg.java | 5 ++ .../dev/xkmc/l2core/init/reg/simple/SR.java | 6 +- .../dev/xkmc/l2core/init/reg/simple/Val.java | 11 ++++ .../l2core/mixin/ConfigTrackerAccessor.java | 16 +++++ .../serial/config/RecordDataProvider.java | 9 +-- .../configval/AbstractConfigParser.java | 9 ++- .../ingredients/EnchantmentIngredient.java | 10 +++ .../dev/xkmc/l2core/util/TeleportTool.java | 52 +++++++++++++++ src/main/resources/l2core.mixins.json | 1 + 19 files changed, 270 insertions(+), 37 deletions(-) create mode 100644 src/main/java/dev/xkmc/l2core/init/reg/ench/EnchHolder.java create mode 100644 src/main/java/dev/xkmc/l2core/mixin/ConfigTrackerAccessor.java create mode 100644 src/main/java/dev/xkmc/l2core/util/TeleportTool.java diff --git a/gradle.properties b/gradle.properties index dcbc4a4..07c70a5 100644 --- a/gradle.properties +++ b/gradle.properties @@ -10,7 +10,7 @@ neogradle.subsystems.parchment.mappingsVersion=2024.06.02 minecraft_version=1.21 minecraft_version_range=[1.21,1.22) -neo_version=21.0.38-beta +neo_version=21.0.93-beta neo_version_range=[21.0,) loader_version_range=[2,) @@ -18,7 +18,7 @@ loader_version_range=[2,) mod_id=l2core mod_name=L2Core mod_license=LGPL-2.1 -mod_version=3.0.5-pre13 +mod_version=3.0.5-pre25 mod_group_id=dev.xkmc mod_authors=lcy0x1 mod_description=Core Library mod for all L2 mods @@ -26,7 +26,7 @@ mod_description=Core Library mod for all L2 mods jei_minecraft_version = 1.21-neoforge jei_version = 19.0.0.7 -registrate_version = MC1.21-1.4.1 +registrate_version = MC1.21-1.4.4+fcb9a93 lljij = false rootMod = false diff --git a/src/main/java/dev/xkmc/l2core/compat/patchouli/PatchouliHelper.java b/src/main/java/dev/xkmc/l2core/compat/patchouli/PatchouliHelper.java index 04b83a4..b8e3806 100644 --- a/src/main/java/dev/xkmc/l2core/compat/patchouli/PatchouliHelper.java +++ b/src/main/java/dev/xkmc/l2core/compat/patchouli/PatchouliHelper.java @@ -19,7 +19,7 @@ import java.util.function.Supplier; public class PatchouliHelper { - public static final ProviderType PATCHOULI = ProviderType.register("patchouli", (p, e) -> new PatchouliProvider(p, e.getLookupProvider(), e.getGenerator())); + public static final ProviderType PATCHOULI = ProviderType.register("patchouli", PatchouliProvider::new); public static ItemStack getBook(ResourceLocation book) { return ItemStack.EMPTY; // TODO ItemModBook.forBook(book); diff --git a/src/main/java/dev/xkmc/l2core/compat/patchouli/PatchouliProvider.java b/src/main/java/dev/xkmc/l2core/compat/patchouli/PatchouliProvider.java index 29df236..0fcf44e 100644 --- a/src/main/java/dev/xkmc/l2core/compat/patchouli/PatchouliProvider.java +++ b/src/main/java/dev/xkmc/l2core/compat/patchouli/PatchouliProvider.java @@ -5,6 +5,7 @@ import com.tterrag.registrate.providers.RegistrateProvider; import dev.xkmc.l2core.serial.config.RecordDataProvider; import net.minecraft.core.HolderLookup; import net.minecraft.data.DataGenerator; +import net.minecraft.data.PackOutput; import net.neoforged.fml.LogicalSide; import java.util.concurrent.CompletableFuture; @@ -16,8 +17,8 @@ public class PatchouliProvider extends RecordDataProvider implements RegistrateP private BiConsumer map; - public PatchouliProvider(AbstractRegistrate owner, CompletableFuture pvd, DataGenerator gen) { - super(gen, pvd, "Patchouli Provider"); + public PatchouliProvider(AbstractRegistrate owner, PackOutput output, CompletableFuture pvd) { + super(output, pvd, "Patchouli Provider"); this.owner = owner; } diff --git a/src/main/java/dev/xkmc/l2core/init/L2LibReg.java b/src/main/java/dev/xkmc/l2core/init/L2LibReg.java index 8e65ddc..e20ff96 100644 --- a/src/main/java/dev/xkmc/l2core/init/L2LibReg.java +++ b/src/main/java/dev/xkmc/l2core/init/L2LibReg.java @@ -1,5 +1,6 @@ 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; diff --git a/src/main/java/dev/xkmc/l2core/init/L2TagGen.java b/src/main/java/dev/xkmc/l2core/init/L2TagGen.java index 316545b..6e00e6f 100644 --- a/src/main/java/dev/xkmc/l2core/init/L2TagGen.java +++ b/src/main/java/dev/xkmc/l2core/init/L2TagGen.java @@ -10,16 +10,19 @@ import net.minecraft.resources.ResourceLocation; import net.minecraft.tags.TagKey; import net.minecraft.world.effect.MobEffect; import net.minecraft.world.entity.ai.attributes.Attribute; +import net.minecraft.world.item.enchantment.Enchantment; public class L2TagGen { public static ProviderType> getProvider(ResourceKey> id, Registry reg) { String name = id.location().getPath(); - return ProviderType.register("tags/" + name, - type -> (p, e) -> new RegistrateTagsProvider.IntrinsicImpl<>(p, type, name, - e.getGenerator().getPackOutput(), id, e.getLookupProvider(), - ench -> reg.getResourceKey(ench).get(), - e.getExistingFileHelper())); + return ProviderType.registerIntrinsicTag("tags/" + name, name, id, + ench -> reg.getResourceKey(ench).orElseThrow()); + } + + public static ProviderType> getProvider(ResourceKey> id) { + String name = id.location().getPath(); + return ProviderType.registerDynamicTag("tags/" + name, name, id); } public static final ProviderType> EFF_TAGS = @@ -28,6 +31,9 @@ public class L2TagGen { public static final ProviderType> ATTR_TAGS = getProvider(Registries.ATTRIBUTE, BuiltInRegistries.ATTRIBUTE); + public static final ProviderType> ENCH_TAGS = + getProvider(Registries.ENCHANTMENT); + public static final TagKey TRACKED_EFFECTS = effectTag(ResourceLocation.fromNamespaceAndPath(L2Core.MODID, "tracked_effects")); public static void onEffectTagGen(RegistrateTagsProvider.IntrinsicImpl pvd) { diff --git a/src/main/java/dev/xkmc/l2core/init/reg/ench/EECVal.java b/src/main/java/dev/xkmc/l2core/init/reg/ench/EECVal.java index 48f2863..6ca86ad 100644 --- a/src/main/java/dev/xkmc/l2core/init/reg/ench/EECVal.java +++ b/src/main/java/dev/xkmc/l2core/init/reg/ench/EECVal.java @@ -106,14 +106,14 @@ public interface EECVal extends Val extends Val> { + interface Special extends Val>> { record Impl( - DeferredHolder, DataComponentType> val + DeferredHolder, DataComponentType>> val ) implements Special { @Override - public DataComponentType get() { + public DataComponentType> get() { return val.get(); } diff --git a/src/main/java/dev/xkmc/l2core/init/reg/ench/EnchHolder.java b/src/main/java/dev/xkmc/l2core/init/reg/ench/EnchHolder.java new file mode 100644 index 0000000..60bbbf8 --- /dev/null +++ b/src/main/java/dev/xkmc/l2core/init/reg/ench/EnchHolder.java @@ -0,0 +1,7 @@ +package dev.xkmc.l2core.init.reg.ench; + +import net.minecraft.core.Holder; +import net.minecraft.world.item.enchantment.Enchantment; + +public record EnchHolder(Holder holder, T val, int lv) { +} diff --git a/src/main/java/dev/xkmc/l2core/init/reg/ench/EnchReg.java b/src/main/java/dev/xkmc/l2core/init/reg/ench/EnchReg.java index fbf381e..71d4b1d 100644 --- a/src/main/java/dev/xkmc/l2core/init/reg/ench/EnchReg.java +++ b/src/main/java/dev/xkmc/l2core/init/reg/ench/EnchReg.java @@ -1,17 +1,18 @@ package dev.xkmc.l2core.init.reg.ench; import com.mojang.serialization.Codec; +import com.tterrag.registrate.providers.ProviderType; +import com.tterrag.registrate.providers.RegistrateTagsProvider; import cpw.mods.util.Lazy; +import dev.xkmc.l2core.init.L2LibReg; +import dev.xkmc.l2core.init.L2TagGen; import dev.xkmc.l2core.init.reg.registrate.L2Registrate; import dev.xkmc.l2core.init.reg.simple.Reg; -import net.minecraft.core.HolderLookup; import net.minecraft.core.component.DataComponentType; import net.minecraft.core.registries.BuiltInRegistries; import net.minecraft.core.registries.Registries; -import net.minecraft.data.tags.TagsProvider; import net.minecraft.data.worldgen.BootstrapContext; import net.minecraft.resources.ResourceKey; -import net.minecraft.tags.TagKey; import net.minecraft.util.Unit; import net.minecraft.world.item.enchantment.ConditionalEffect; import net.minecraft.world.item.enchantment.Enchantment; @@ -24,8 +25,10 @@ import net.neoforged.neoforge.registries.DeferredRegister; import java.util.ArrayList; import java.util.List; import java.util.function.Function; +import java.util.function.Supplier; import java.util.function.UnaryOperator; +@SuppressWarnings("unused") public class EnchReg { public static EnchReg of(Reg reg, L2Registrate pvd) { @@ -33,13 +36,19 @@ public class EnchReg { } private final DeferredRegister> reg; + private final DeferredRegister legacy; private final L2Registrate pvd; private final List list = new ArrayList<>(); private EnchReg(Reg reg, L2Registrate pvd) { this.reg = reg.make(BuiltInRegistries.ENCHANTMENT_EFFECT_COMPONENT_TYPE); + this.legacy = reg.make(L2LibReg.ENCH.get()); this.pvd = pvd; + pvd.addDataGenerator(L2TagGen.ENCH_TAGS, this::doTagGen); + var init = pvd.getDataGenInitializer(); + init.add(Registries.ENCHANTMENT, this::build); + init.addDependency(ProviderType.DYNAMIC, L2TagGen.ENCH_TAGS); } private DeferredHolder, DataComponentType> reg(String id, Codec codec) { @@ -51,7 +60,7 @@ public class EnchReg { } public EECVal.Special special(String id, Codec codec) { - return new EECVal.Special.Impl<>(reg(id, codec)); + return new EECVal.Special.Impl<>(reg(id, codec.listOf())); } public EECVal eff(String id, Codec codec, LootContextParamSet loot) { @@ -65,33 +74,42 @@ public class EnchReg { ).listOf())); } - public EnchVal ench(String id, String name, String desc, UnaryOperator cons) { + private T enchBase(String id, String name, String desc, Function, T> factory) { var key = ResourceKey.create(Registries.ENCHANTMENT, pvd.loc(id)); pvd.addRawLang("enchantment." + pvd.getModid() + "." + id, name); pvd.addRawLang("enchantment." + pvd.getModid() + "." + id + ".desc", desc); - var ans = new EnchVal.Simple(key, Lazy.of(() -> cons.apply(new EnchVal.Builder(key.location())))); + var ans = factory.apply(key); list.add(ans); return ans; } + public EnchVal ench(String id, String name, String desc, UnaryOperator cons) { + return enchBase(id, name, desc, key -> new EnchVal.Simple(key, + Lazy.of(() -> cons.apply(new EnchVal.Builder(key.location()))))); + } + public EnchVal.Flag enchFlag(String id, String name, String desc, UnaryOperator cons) { - var key = ResourceKey.create(Registries.ENCHANTMENT, pvd.loc(id)); - pvd.addRawLang("enchantment." + pvd.getModid() + "." + id, name); - pvd.addRawLang("enchantment." + pvd.getModid() + "." + id + ".desc", desc); var unit = unit(id); - var ans = new EnchVal.FlagImpl(unit, key, Lazy.of(() -> cons.apply(new EnchVal.Builder(key.location()).effect(e -> e.withEffect(unit.get()))))); - list.add(ans); - return ans; + return enchBase(id, name, desc, key -> new EnchVal.FlagImpl(unit, key, + Lazy.of(() -> cons.apply(new EnchVal.Builder(key.location()).effect(e -> + e.withEffect(unit.get())))))); + } + + public EnchVal enchLegacy(String id, String name, String desc, UnaryOperator cons, Supplier factory) { + var unit = legacy.register(id, factory); + return enchBase(id, name, desc, key -> new EnchVal.Simple(key, + Lazy.of(() -> cons.apply(new EnchVal.Builder(key.location()).effect(e -> + e.withSpecialEffect(L2LibReg.LEGACY.get(), List.of(unit.get()))))))); } public void build(BootstrapContext ctx) { for (var e : list) ctx.register(e.id(), e.builder().get().build(ctx, e.id().location())); } - public void doTagGen(Function, TagsProvider.TagAppender> func, HolderLookup.Provider pvd) { + public void doTagGen(RegistrateTagsProvider pvd) { for (var e : list) { for (var t : e.builder().get().tags) { - func.apply(t).add(e.id()); + pvd.addTag(t).add(e.id()); } } } diff --git a/src/main/java/dev/xkmc/l2core/init/reg/ench/LegacyEnchantment.java b/src/main/java/dev/xkmc/l2core/init/reg/ench/LegacyEnchantment.java index 8a5fea8..5e18854 100644 --- a/src/main/java/dev/xkmc/l2core/init/reg/ench/LegacyEnchantment.java +++ b/src/main/java/dev/xkmc/l2core/init/reg/ench/LegacyEnchantment.java @@ -1,6 +1,69 @@ package dev.xkmc.l2core.init.reg.ench; +import dev.xkmc.l2core.init.L2LibReg; +import dev.xkmc.l2serial.util.Wrappers; +import net.minecraft.ChatFormatting; +import net.minecraft.core.Holder; +import net.minecraft.core.component.DataComponents; +import net.minecraft.core.registries.Registries; +import net.minecraft.network.chat.Component; +import net.minecraft.world.entity.EquipmentSlot; +import net.minecraft.world.entity.LivingEntity; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.item.enchantment.Enchantment; +import net.minecraft.world.item.enchantment.ItemEnchantments; +import net.neoforged.neoforge.common.CommonHooks; +import org.jetbrains.annotations.Nullable; + +import java.util.*; + public class LegacyEnchantment { + @Nullable + public static T firstOf(Holder ench, Class cls) { + for (var e : ench.value().getEffects(L2LibReg.LEGACY.get())) { + if (cls.isInstance(e)) { + return Wrappers.cast(e); + } + } + return null; + } + + public static Optional findFirst(Holder ench, Class cls) { + return Optional.ofNullable(firstOf(ench, cls)); + } + + public static List> findAll(ItemStack stack, Class cls, boolean intrinsic) { + var reg = CommonHooks.resolveLookup(Registries.ENCHANTMENT); + if (reg == null) return List.of(); + List> ans = new ArrayList<>(); + ItemEnchantments enchs = intrinsic ? + stack.getOrDefault(DataComponents.ENCHANTMENTS, ItemEnchantments.EMPTY) : + stack.getAllEnchantments(reg); + for (var e : enchs.entrySet()) { + var t = firstOf(e.getKey(), cls); + if (t != null) ans.add(new EnchHolder<>(e.getKey(), t, e.getIntValue())); + } + return ans; + } + + public static Map accumulateOnEntity(LivingEntity le, Class cls, boolean intrinsic) { + LinkedHashMap map = new LinkedHashMap<>(); + for (EquipmentSlot slot : EquipmentSlot.values()) { + ItemStack stack = le.getItemBySlot(slot); + if (stack.isEmpty() || !stack.isEnchanted()) continue; + var list = findAll(stack, cls, intrinsic); + for (var e : list) { + if (e.holder().value().matchingSlot(slot)) { + map.compute(e.val(), (k, v) -> (v == null ? 0 : v) + e.lv()); + } + } + } + return map; + } + + public List descFull(int lv, String key, boolean alt, boolean book) { + return List.of(Component.translatable(key).withStyle(ChatFormatting.DARK_GRAY)); + } } diff --git a/src/main/java/dev/xkmc/l2core/init/reg/registrate/L2Registrate.java b/src/main/java/dev/xkmc/l2core/init/reg/registrate/L2Registrate.java index 5b72893..477fc2b 100644 --- a/src/main/java/dev/xkmc/l2core/init/reg/registrate/L2Registrate.java +++ b/src/main/java/dev/xkmc/l2core/init/reg/registrate/L2Registrate.java @@ -6,13 +6,19 @@ import com.tterrag.registrate.builders.BuilderCallback; import com.tterrag.registrate.builders.NoConfigBuilder; import com.tterrag.registrate.providers.RegistrateLangProvider; import com.tterrag.registrate.util.OneTimeEventReceiver; +import com.tterrag.registrate.util.RegistrateDistExecutor; import com.tterrag.registrate.util.entry.RegistryEntry; import com.tterrag.registrate.util.nullness.NonNullSupplier; import com.tterrag.registrate.util.nullness.NonnullType; import dev.xkmc.l2core.init.L2Core; +import dev.xkmc.l2core.init.reg.simple.Val; import dev.xkmc.l2serial.serialization.custom_handler.CodecHandler; import dev.xkmc.l2serial.util.Wrappers; +import net.minecraft.client.particle.ParticleEngine; +import net.minecraft.client.particle.ParticleProvider; import net.minecraft.core.Registry; +import net.minecraft.core.particles.ParticleOptions; +import net.minecraft.core.particles.ParticleType; import net.minecraft.core.registries.BuiltInRegistries; import net.minecraft.core.registries.Registries; import net.minecraft.network.chat.Component; @@ -25,7 +31,9 @@ import net.minecraft.world.item.CreativeModeTabs; import net.minecraft.world.item.Item; import net.minecraft.world.item.Items; import net.minecraft.world.item.alchemy.Potion; +import net.neoforged.api.distmarker.Dist; import net.neoforged.fml.ModLoadingContext; +import net.neoforged.neoforge.client.event.RegisterParticleProvidersEvent; import net.neoforged.neoforge.data.loading.DatagenModLoader; import net.neoforged.neoforge.registries.NewRegistryEvent; import net.neoforged.neoforge.registries.RegistryBuilder; @@ -81,6 +89,16 @@ public class L2Registrate extends AbstractRegistrate { return new SimpleEntry<>(ans); } + public > Val + particle(String name, NonNullSupplier sup, NonNullSupplier> pvd) { + RegistryEntry, R> ans = entry(name, (cb) -> new NoConfigBuilder<>(this, this, name, cb, + Registries.PARTICLE_TYPE, sup)).register(); + RegistrateDistExecutor.unsafeRunWhenOn(Dist.CLIENT, () -> () -> + OneTimeEventReceiver.addModListener(this, RegisterParticleProvidersEvent.class, + event -> pvd.get().register(event, ans.get()))); + return new Val.Registrate<>(ans); + } + @SuppressWarnings({"unsafe"}) public RegistryInstance newRegistry(String id, Class cls, Consumer> cons) { ResourceKey> key = ResourceKey.createRegistryKey(ResourceLocation.fromNamespaceAndPath(getModid(), id)); @@ -215,4 +233,22 @@ public class L2Registrate extends AbstractRegistrate { } + public interface ParticleSupplier { + + static ParticleSupplier provider(ParticleProvider pvd) { + return (event, type) -> event.registerSpecial(type, pvd); + } + + static ParticleSupplier sprite(ParticleProvider.Sprite pvd) { + return (event, type) -> event.registerSprite(type, pvd); + } + + static ParticleSupplier spriteSet(ParticleEngine.SpriteParticleRegistration pvd) { + return (event, type) -> event.registerSpriteSet(type, pvd); + } + + void register(RegisterParticleProvidersEvent event, ParticleType type); + + } + } \ No newline at end of file diff --git a/src/main/java/dev/xkmc/l2core/init/reg/simple/DCReg.java b/src/main/java/dev/xkmc/l2core/init/reg/simple/DCReg.java index 4da7b12..8cbcced 100644 --- a/src/main/java/dev/xkmc/l2core/init/reg/simple/DCReg.java +++ b/src/main/java/dev/xkmc/l2core/init/reg/simple/DCReg.java @@ -11,6 +11,7 @@ import net.minecraft.network.chat.Component; import net.minecraft.network.chat.ComponentSerialization; import net.minecraft.network.codec.ByteBufCodecs; import net.minecraft.network.codec.StreamCodec; +import net.minecraft.util.Unit; import net.minecraft.world.item.ItemStack; import net.neoforged.neoforge.registries.DeferredHolder; import net.neoforged.neoforge.registries.DeferredRegister; @@ -34,6 +35,10 @@ public record DCReg(DeferredRegister> reg) { return reg(id, cdc, cdc.toNetwork(), cache); } + public DCVal unit(String id) { + return reg(id, Unit.CODEC, StreamCodec.unit(Unit.INSTANCE), false); + } + public DCVal intVal(String id) { return reg(id, Codec.INT, ByteBufCodecs.INT, false); } diff --git a/src/main/java/dev/xkmc/l2core/init/reg/simple/SR.java b/src/main/java/dev/xkmc/l2core/init/reg/simple/SR.java index 1801d22..e0b34f1 100644 --- a/src/main/java/dev/xkmc/l2core/init/reg/simple/SR.java +++ b/src/main/java/dev/xkmc/l2core/init/reg/simple/SR.java @@ -19,15 +19,15 @@ public record SR(DeferredRegister reg) { return new SR<>(parent.make(reg)); } - public Val reg(String id, Supplier sup) { + public ValImpl reg(String id, Supplier sup) { return new ValImpl<>(reg.register(id, sup)); } - public Val reg(String id, Function sup) { + public ValImpl reg(String id, Function sup) { return new ValImpl<>(reg.register(id, sup)); } - private record ValImpl(DeferredHolder val) implements Val { + public record ValImpl(DeferredHolder val) implements Val { @Override public T get() { diff --git a/src/main/java/dev/xkmc/l2core/init/reg/simple/Val.java b/src/main/java/dev/xkmc/l2core/init/reg/simple/Val.java index cadb91b..1e34771 100644 --- a/src/main/java/dev/xkmc/l2core/init/reg/simple/Val.java +++ b/src/main/java/dev/xkmc/l2core/init/reg/simple/Val.java @@ -1,9 +1,20 @@ package dev.xkmc.l2core.init.reg.simple; +import com.tterrag.registrate.util.entry.RegistryEntry; + import java.util.function.Supplier; public interface Val extends Supplier { T get(); + record Registrate(RegistryEntry entry) implements Val { + + @Override + public T get() { + return entry.get(); + } + + } + } diff --git a/src/main/java/dev/xkmc/l2core/mixin/ConfigTrackerAccessor.java b/src/main/java/dev/xkmc/l2core/mixin/ConfigTrackerAccessor.java new file mode 100644 index 0000000..f35a9f6 --- /dev/null +++ b/src/main/java/dev/xkmc/l2core/mixin/ConfigTrackerAccessor.java @@ -0,0 +1,16 @@ +package dev.xkmc.l2core.mixin; + +import net.neoforged.fml.config.ConfigTracker; +import net.neoforged.fml.config.ModConfig; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.gen.Accessor; + +import java.util.concurrent.ConcurrentHashMap; + +@Mixin(ConfigTracker.class) +public interface ConfigTrackerAccessor { + + @Accessor + public ConcurrentHashMap getFileMap(); + +} diff --git a/src/main/java/dev/xkmc/l2core/serial/config/RecordDataProvider.java b/src/main/java/dev/xkmc/l2core/serial/config/RecordDataProvider.java index 3dc9a9a..1d594b8 100644 --- a/src/main/java/dev/xkmc/l2core/serial/config/RecordDataProvider.java +++ b/src/main/java/dev/xkmc/l2core/serial/config/RecordDataProvider.java @@ -6,6 +6,7 @@ import net.minecraft.core.HolderLookup; import net.minecraft.data.CachedOutput; import net.minecraft.data.DataGenerator; import net.minecraft.data.DataProvider; +import net.minecraft.data.PackOutput; import java.nio.file.Path; import java.util.ArrayList; @@ -16,13 +17,13 @@ import java.util.concurrent.CompletableFuture; import java.util.function.BiConsumer; public abstract class RecordDataProvider implements DataProvider { - private final DataGenerator generator; + private final PackOutput output; private final CompletableFuture pvd; private final String name; private final Map map = new HashMap<>(); - public RecordDataProvider(DataGenerator generator, CompletableFuture pvd, String name) { - this.generator = generator; + public RecordDataProvider(PackOutput output, CompletableFuture pvd, String name) { + this.output = output; this.pvd = pvd; this.name = name; } @@ -31,7 +32,7 @@ public abstract class RecordDataProvider implements DataProvider { public CompletableFuture run(CachedOutput cache) { return pvd.thenCompose(pvd -> { - Path folder = this.generator.getPackOutput().getOutputFolder(); + Path folder = output.getOutputFolder(); this.add(this.map::put); List> list = new ArrayList<>(); this.map.forEach((k, v) -> { diff --git a/src/main/java/dev/xkmc/l2core/serial/configval/AbstractConfigParser.java b/src/main/java/dev/xkmc/l2core/serial/configval/AbstractConfigParser.java index 16b5fe8..8241db5 100644 --- a/src/main/java/dev/xkmc/l2core/serial/configval/AbstractConfigParser.java +++ b/src/main/java/dev/xkmc/l2core/serial/configval/AbstractConfigParser.java @@ -1,6 +1,8 @@ package dev.xkmc.l2core.serial.configval; +import dev.xkmc.l2core.mixin.ConfigTrackerAccessor; import net.neoforged.fml.config.ConfigTracker; +import net.neoforged.neoforge.common.ModConfigSpec; import java.util.List; import java.util.Optional; @@ -8,8 +10,11 @@ import java.util.Optional; public class AbstractConfigParser { public static Optional parse(String path, List line) { - return Optional.ofNullable(ConfigTracker.INSTANCE.fileMap().get(path)) - .map(file -> file.getConfigData().get(line)); + var file = ((ConfigTrackerAccessor) ConfigTracker.INSTANCE).getFileMap().get(path); + if (file == null) return Optional.empty(); + var spec = file.getSpec(); + if (!(spec instanceof ModConfigSpec modSpec) || !modSpec.isLoaded()) return Optional.empty(); + return Optional.ofNullable(modSpec.getValues().get(line)); } } diff --git a/src/main/java/dev/xkmc/l2core/serial/ingredients/EnchantmentIngredient.java b/src/main/java/dev/xkmc/l2core/serial/ingredients/EnchantmentIngredient.java index 79356bc..1f8ef84 100644 --- a/src/main/java/dev/xkmc/l2core/serial/ingredients/EnchantmentIngredient.java +++ b/src/main/java/dev/xkmc/l2core/serial/ingredients/EnchantmentIngredient.java @@ -1,7 +1,11 @@ package dev.xkmc.l2core.serial.ingredients; import dev.xkmc.l2core.init.L2LibReg; +import dev.xkmc.l2core.util.DataGenOnly; import net.minecraft.core.Holder; +import net.minecraft.core.HolderLookup; +import net.minecraft.core.registries.Registries; +import net.minecraft.resources.ResourceKey; import net.minecraft.world.item.EnchantedBookItem; import net.minecraft.world.item.ItemStack; import net.minecraft.world.item.crafting.Ingredient; @@ -20,6 +24,12 @@ public record EnchantmentIngredient(Holder enchantment, int minLeve return new EnchantmentIngredient(ench, min).toVanilla(); } + @DataGenOnly + public static Ingredient of(HolderLookup.Provider pvd, ResourceKey ench, int min) { + var holder = pvd.lookup(Registries.ENCHANTMENT).orElseThrow().getOrThrow(ench); + return of(holder, min); + } + @Override public Stream getItems() { var ench = enchantment.value(); diff --git a/src/main/java/dev/xkmc/l2core/util/TeleportTool.java b/src/main/java/dev/xkmc/l2core/util/TeleportTool.java new file mode 100644 index 0000000..ab28543 --- /dev/null +++ b/src/main/java/dev/xkmc/l2core/util/TeleportTool.java @@ -0,0 +1,52 @@ +package dev.xkmc.l2core.util; + +import net.minecraft.core.BlockPos; +import net.minecraft.server.level.ServerLevel; +import net.minecraft.server.level.ServerPlayer; +import net.minecraft.util.Mth; +import net.minecraft.world.entity.Entity; +import net.minecraft.world.entity.LivingEntity; +import net.minecraft.world.entity.PathfinderMob; +import net.minecraft.world.level.Level; +import net.minecraft.world.level.portal.DimensionTransition; +import net.neoforged.neoforge.event.EventHooks; +import net.neoforged.neoforge.event.entity.EntityTeleportEvent; + +import java.util.Set; + +public class TeleportTool { + + public static void teleportHome(ServerLevel world, ServerPlayer player) { + DimensionTransition respawn = player.findRespawnPositionAndUseSpawnBlock(true, DimensionTransition.DO_NOTHING); + if (world == respawn.newLevel()) { + player.moveTo(respawn.pos(), respawn.yRot(), respawn.xRot()); + } else { + var pos = respawn.pos(); + performTeleport(player, respawn.newLevel(), pos.x, pos.y, pos.z, respawn.yRot(), respawn.xRot()); + } + } + + public static void performTeleport(Entity e, ServerLevel level, double x, double y, double z, float yaw, float pitch) { + EntityTeleportEvent.TeleportCommand event = EventHooks.onEntityTeleportCommand(e, x, y, z); + if (event.isCanceled()) return; + x = event.getTargetX(); + y = event.getTargetY(); + z = event.getTargetZ(); + BlockPos blockpos = BlockPos.containing(x, y, z); + if (!Level.isInSpawnableBounds(blockpos)) return; + float yr = Mth.wrapDegrees(yaw); + float xr = Mth.wrapDegrees(pitch); + if (e.teleportTo(level, x, y, z, Set.of(), yr, xr)) { + if (e instanceof LivingEntity le) { + if (!le.isFallFlying()) { + e.setDeltaMovement(e.getDeltaMovement().multiply(1.0, 0.0, 1.0)); + e.setOnGround(true); + } + } + if (e instanceof PathfinderMob mob) { + mob.getNavigation().stop(); + } + } + } + +} diff --git a/src/main/resources/l2core.mixins.json b/src/main/resources/l2core.mixins.json index 2c6ac9c..0b85140 100644 --- a/src/main/resources/l2core.mixins.json +++ b/src/main/resources/l2core.mixins.json @@ -4,6 +4,7 @@ "package": "dev.xkmc.l2core.mixin", "compatibilityLevel": "JAVA_21", "mixins": [ + "ConfigTrackerAccessor" ], "client": [ ],