diff --git a/build.gradle b/build.gradle index 9638c2445..3d08d85e2 100644 --- a/build.gradle +++ b/build.gradle @@ -100,8 +100,10 @@ processResources { "architectury_version": rootProject.architectury_version ] + println("[Process Resources] Replacing properties in resources: " + toReplace) + inputs.properties toReplace - filesMatching("META-INF/mods.toml") { + filesMatching("META-INF/neoforge.mods.toml") { expand toReplace } } diff --git a/gradle.properties b/gradle.properties index 7319a2ce8..e51509857 100644 --- a/gradle.properties +++ b/gradle.properties @@ -10,8 +10,8 @@ curseforge_id=238086 modrinth_id=umyGl7zF minecraft_version=1.20.6 neoforge_version=20.6.75-beta -rhino_version=2006.2.4-build.11 -min_rhino_version=2006.2.4-build.11 +rhino_version=2006.2.4-build.12 +min_rhino_version=2006.2.4-build.12 architectury_version=12.1.2 rei_version=15.0.728 #rei_comp_version=9.0.16 diff --git a/src/main/java/dev/latvian/mods/kubejs/BuiltinKubeJSPlugin.java b/src/main/java/dev/latvian/mods/kubejs/BuiltinKubeJSPlugin.java index 0253d719f..8e11399fe 100644 --- a/src/main/java/dev/latvian/mods/kubejs/BuiltinKubeJSPlugin.java +++ b/src/main/java/dev/latvian/mods/kubejs/BuiltinKubeJSPlugin.java @@ -7,6 +7,7 @@ import dev.latvian.mods.kubejs.bindings.AABBWrapper; import dev.latvian.mods.kubejs.bindings.BlockWrapper; import dev.latvian.mods.kubejs.bindings.ColorWrapper; +import dev.latvian.mods.kubejs.bindings.DamageSourceWrapper; import dev.latvian.mods.kubejs.bindings.DirectionWrapper; import dev.latvian.mods.kubejs.bindings.IngredientWrapper; import dev.latvian.mods.kubejs.bindings.ItemWrapper; @@ -103,9 +104,11 @@ import dev.latvian.mods.kubejs.recipe.schema.minecraft.StonecuttingRecipeSchema; import dev.latvian.mods.kubejs.registry.RegistryInfo; import dev.latvian.mods.kubejs.script.BindingsEvent; +import dev.latvian.mods.kubejs.script.KubeJSContext; import dev.latvian.mods.kubejs.script.PlatformWrapper; import dev.latvian.mods.kubejs.script.ScriptType; import dev.latvian.mods.kubejs.script.WrapperRegistry; +import dev.latvian.mods.kubejs.server.ScheduledServerEvent; import dev.latvian.mods.kubejs.server.ServerScriptManager; import dev.latvian.mods.kubejs.util.ClassFilter; import dev.latvian.mods.kubejs.util.FluidAmounts; @@ -344,8 +347,8 @@ public void registerBindings(BindingsEvent event) { // event.add("onEvent", new LegacyCodeHandler("onEvent()")); - if (event.type().isServer() && event.context().kjsFactory.manager instanceof ServerScriptManager sm && sm.server != null) { - var se = sm.server.kjs$getScheduledEvents(); + if (event.type().isServer() && event.context().kjsFactory.manager instanceof ServerScriptManager) { + var se = ScheduledServerEvent.EVENTS; event.add("setTimeout", new ScheduledEvents.TimeoutJSFunction(se, false, false)); event.add("clearTimeout", new ScheduledEvents.TimeoutJSFunction(se, true, false)); @@ -418,23 +421,23 @@ public void registerTypeWrappers(WrapperRegistry registry) { registry.registerSimple(JsonPrimitive.class, JsonIO::primitiveOf); registry.registerSimple(Path.class, UtilsJS::getPath); registry.registerSimple(File.class, UtilsJS::getFileFromPath); - registry.register(Unit.class, (cx, o, target) -> Painter.INSTANCE.unitOf(cx, o)); + registry.register(Unit.class, (cx, from, target) -> Painter.INSTANCE.unitOf(cx, from)); registry.registerSimple(TemporalAmount.class, UtilsJS::getTemporalAmount); registry.registerSimple(Duration.class, UtilsJS::getDuration); - registry.register(ResourceLocation.class, (cx, o, target) -> UtilsJS.getMCID(cx, o)); - registry.register(CompoundTag.class, (o, target) -> NBTUtils.isTagCompound(o), (cx, o, target) -> NBTUtils.toTagCompound(cx, o)); - registry.register(CollectionTag.class, (o, target) -> NBTUtils.isTagCollection(o), (cx, o, target) -> NBTUtils.toTagCollection(cx, o)); - registry.register(ListTag.class, (o, target) -> NBTUtils.isTagCollection(o), (cx, o, target) -> NBTUtils.toTagList(cx, o)); - registry.register(Tag.class, (cx, o, target) -> NBTUtils.toTag(cx, o)); - registry.register(DataComponentMap.class, (cx, o, target) -> KubeJSComponents.mapOf(cx, o)); - registry.register(DataComponentPatch.class, (cx, o, target) -> KubeJSComponents.patchOf(cx, o)); + registry.register(ResourceLocation.class, (cx, from, target) -> UtilsJS.getMCID(cx, from)); + registry.register(CompoundTag.class, (from, target) -> NBTUtils.isTagCompound(from), (cx, o, target) -> NBTUtils.toTagCompound(cx, o)); + registry.register(CollectionTag.class, (from, target) -> NBTUtils.isTagCollection(from), (cx, o, target) -> NBTUtils.toTagCollection(cx, o)); + registry.register(ListTag.class, (from, target) -> NBTUtils.isTagCollection(from), (cx, o, target) -> NBTUtils.toTagList(cx, o)); + registry.register(Tag.class, (cx, from, target) -> NBTUtils.toTag(cx, from)); + registry.register(DataComponentMap.class, (cx, from, target) -> KubeJSComponents.mapOf(cx, from)); + registry.register(DataComponentPatch.class, (cx, from, target) -> KubeJSComponents.patchOf(cx, from)); registry.registerSimple(BlockPos.class, UtilsJS::blockPosOf); registry.registerSimple(Vec3.class, UtilsJS::vec3Of); - registry.register(Item.class, (cx, o, target) -> ItemStackJS.getRawItem(cx, o)); - registry.register(ItemLike.class, (cx, o, target) -> ItemStackJS.getRawItem(cx, o)); + registry.register(Item.class, (cx, from, target) -> ItemStackJS.getRawItem(cx, from)); + registry.register(ItemLike.class, (cx, from, target) -> ItemStackJS.getRawItem(cx, from)); registry.registerEnumFromStringCodec(MobCategory.class, MobCategory.CODEC); registry.registerSimple(AABB.class, AABBWrapper::wrap); @@ -458,29 +461,28 @@ public void registerTypeWrappers(WrapperRegistry registry) { registry.registerSimple(InputItem.class, InputItem::of); registry.registerSimple(OutputItem.class, OutputItem::of); registry.registerSimple(BlockStatePredicate.class, BlockStatePredicate::of); - registry.register(RuleTest.class, (cx, o, target) -> BlockStatePredicate.ruleTestOf(cx, o)); + registry.register(RuleTest.class, (cx, from, target) -> BlockStatePredicate.ruleTestOf(cx, from)); registry.registerSimple(FluidStack.class, FluidWrapper::wrap); registry.registerSimple(dev.architectury.fluid.FluidStack.class, FluidWrapper::wrapArch); - registry.register(RecipeFilter.class, (cx, o, target) -> RecipeFilter.of(cx, o)); + registry.register(RecipeFilter.class, (cx, from, target) -> RecipeFilter.of(cx, from)); registry.registerSimple(IngredientActionFilter.class, IngredientActionFilter::filterOf); registry.registerSimple(Tier.class, ItemBuilder::toToolTier); registry.registerSimple(PlayerSelector.class, PlayerSelector::of); - // FIXME (high): Damage sources are dynamic registries now!! - //typeWrappers.registerSimple(DamageSource.class, DamageSourceWrapper::of); + registry.register(DamageSource.class, (cx, from, target) -> DamageSourceWrapper.of(cx, from)); registry.registerSimple(EntitySelector.class, UtilsJS::entitySelector); registry.registerSimple(ReplacementMatch.class, ReplacementMatch::of); registry.registerSimple(Stat.class, PlayerStatsJS::statOf); registry.registerSimple(MapColor.class, MapColorHelper::of); registry.register(SoundType.class, SoundTypeWrapper.INSTANCE); - registry.register(ParticleOptions.class, (cx, o, target) -> UtilsWrapper.particleOptions(cx, o)); - registry.register(ItemTintFunction.class, (cx, o, target) -> ItemTintFunction.of(cx, o)); - registry.register(BlockTintFunction.class, (cx, o, target) -> BlockTintFunction.of(cx, o)); + registry.register(ParticleOptions.class, (cx, from, target) -> UtilsWrapper.particleOptions(new WithContext<>((KubeJSContext) cx, from))); + registry.register(ItemTintFunction.class, (cx, from, target) -> ItemTintFunction.of(cx, from)); + registry.register(BlockTintFunction.class, (cx, from, target) -> BlockTintFunction.of(cx, from)); // components // registry.registerSimple(Component.class, TextWrapper::of); registry.registerSimple(MutableComponent.class, TextWrapper::of); registry.registerSimple(Color.class, ColorWrapper::of); - registry.registerSimple(TextColor.class, o -> ColorWrapper.of(o).createTextColorJS()); + registry.registerSimple(TextColor.class, from -> ColorWrapper.of(from).createTextColorJS()); registry.registerSimple(ClickEvent.class, TextWrapper::clickEventOf); // codecs diff --git a/src/main/java/dev/latvian/mods/kubejs/bindings/DamageSourceWrapper.java b/src/main/java/dev/latvian/mods/kubejs/bindings/DamageSourceWrapper.java index e221efdde..fe36bb466 100644 --- a/src/main/java/dev/latvian/mods/kubejs/bindings/DamageSourceWrapper.java +++ b/src/main/java/dev/latvian/mods/kubejs/bindings/DamageSourceWrapper.java @@ -1,33 +1,21 @@ package dev.latvian.mods.kubejs.bindings; -public class DamageSourceWrapper { - /*private static Map damageSourceMap; - - public static DamageSource of(Object name) { - if (name instanceof DamageSource damageSource) { - return damageSource; - } - - if (name instanceof Player player) { - return DamageSource.playerAttack(player); - } - - if (damageSourceMap == null) { - damageSourceMap = new HashMap<>(); +import dev.latvian.mods.kubejs.util.UtilsJS; +import dev.latvian.mods.rhino.Context; +import net.minecraft.core.registries.Registries; +import net.minecraft.resources.ResourceKey; +import net.minecraft.world.damagesource.DamageSource; +import net.minecraft.world.entity.LivingEntity; +import net.minecraft.world.entity.player.Player; +import net.neoforged.neoforge.server.ServerLifecycleHooks; - try { - for (var field : DamageSource.class.getDeclaredFields()) { - field.setAccessible(true); - - if (Modifier.isStatic(field.getModifiers()) && field.getType() == DamageSource.class) { - var s = (DamageSource) field.get(null); - damageSourceMap.put(s.getMsgId(), s); - } - } - } catch (Exception ignored) { - } - } - - return damageSourceMap.getOrDefault(String.valueOf(name), DamageSource.GENERIC); - }*/ +public class DamageSourceWrapper { + public static DamageSource of(Context cx, Object from) { + return switch (from) { + case DamageSource source -> source; + case Player player -> ServerLifecycleHooks.getCurrentServer().kjs$getOverworld().damageSources().playerAttack(player); + case LivingEntity livingEntity -> ServerLifecycleHooks.getCurrentServer().kjs$getOverworld().damageSources().mobAttack(livingEntity); + case null, default -> ServerLifecycleHooks.getCurrentServer().kjs$getOverworld().damageSources().source(ResourceKey.create(Registries.DAMAGE_TYPE, UtilsJS.getMCID(cx, from))); + }; + } } diff --git a/src/main/java/dev/latvian/mods/kubejs/bindings/UtilsWrapper.java b/src/main/java/dev/latvian/mods/kubejs/bindings/UtilsWrapper.java index c23f9a5b7..ce4f8d4a4 100644 --- a/src/main/java/dev/latvian/mods/kubejs/bindings/UtilsWrapper.java +++ b/src/main/java/dev/latvian/mods/kubejs/bindings/UtilsWrapper.java @@ -3,13 +3,12 @@ import com.google.gson.JsonElement; import com.mojang.brigadier.StringReader; import dev.latvian.mods.kubejs.registry.RegistryInfo; -import dev.latvian.mods.kubejs.script.KubeJSContext; import dev.latvian.mods.kubejs.typings.Info; import dev.latvian.mods.kubejs.util.CountingMap; import dev.latvian.mods.kubejs.util.Lazy; import dev.latvian.mods.kubejs.util.UtilsJS; +import dev.latvian.mods.kubejs.util.WithContext; import dev.latvian.mods.kubejs.util.WrappedJS; -import dev.latvian.mods.rhino.Context; import net.minecraft.Util; import net.minecraft.commands.arguments.ParticleArgument; import net.minecraft.core.particles.DustParticleOptions; @@ -223,13 +222,13 @@ static String snakeCaseToTitleCase(String string) { return UtilsJS.snakeCaseToTitleCase(string); } - static ParticleOptions particleOptions(Context cx, Object o) { - if (o instanceof ParticleOptions po) { + static ParticleOptions particleOptions(WithContext o) { + if (o.value() instanceof ParticleOptions po) { return po; } else if (o != null) { try { - var reader = new StringReader(o instanceof JsonElement j ? j.getAsString() : o.toString()); - return ParticleArgument.readParticle(reader, ((KubeJSContext) cx).getRegistries()); + var reader = new StringReader(o.value() instanceof JsonElement j ? j.getAsString() : o.toString()); + return ParticleArgument.readParticle(reader, o.cx().getRegistries()); } catch (Exception ignored) { } } diff --git a/src/main/java/dev/latvian/mods/kubejs/client/KubeJSErrorScreen.java b/src/main/java/dev/latvian/mods/kubejs/client/KubeJSErrorScreen.java index f380bd793..909fff88e 100644 --- a/src/main/java/dev/latvian/mods/kubejs/client/KubeJSErrorScreen.java +++ b/src/main/java/dev/latvian/mods/kubejs/client/KubeJSErrorScreen.java @@ -113,10 +113,10 @@ private void viewOther(Button button) { @Override public void render(GuiGraphics guiGraphics, int mx, int my, float delta) { - this.renderBackground(guiGraphics, mx, my, delta); + // this.renderBackground(guiGraphics, mx, my, delta); + super.render(guiGraphics, mx, my, delta); this.list.render(guiGraphics, mx, my, delta); guiGraphics.drawCenteredString(this.font, "KubeJS " + scriptType.name + " script " + (viewing == errors ? "errors" : "warnings"), this.width / 2, 12, 0xFFFFFF); - super.render(guiGraphics, mx, my, delta); } @Override diff --git a/src/main/java/dev/latvian/mods/kubejs/client/ScheduledClientEvent.java b/src/main/java/dev/latvian/mods/kubejs/client/ScheduledClientEvent.java index f5d4379db..d2d001f2c 100644 --- a/src/main/java/dev/latvian/mods/kubejs/client/ScheduledClientEvent.java +++ b/src/main/java/dev/latvian/mods/kubejs/client/ScheduledClientEvent.java @@ -4,9 +4,7 @@ import net.minecraft.client.Minecraft; public class ScheduledClientEvent extends ScheduledEvents.ScheduledEvent { - public static ScheduledEvents make(Minecraft client) { - return new ScheduledEvents(() -> new ScheduledClientEvent(client)); - } + public static final ScheduledEvents EVENTS = new ScheduledEvents(() -> new ScheduledClientEvent(Minecraft.getInstance())); public final Minecraft client; diff --git a/src/main/java/dev/latvian/mods/kubejs/client/painter/PainterObject.java b/src/main/java/dev/latvian/mods/kubejs/client/painter/PainterObject.java index df9e22f56..ea93dc9d7 100644 --- a/src/main/java/dev/latvian/mods/kubejs/client/painter/PainterObject.java +++ b/src/main/java/dev/latvian/mods/kubejs/client/painter/PainterObject.java @@ -1,6 +1,7 @@ package dev.latvian.mods.kubejs.client.painter; import dev.latvian.mods.kubejs.util.ConsoleJS; +import dev.latvian.mods.rhino.Context; import dev.latvian.mods.rhino.util.SpecialEquality; import dev.latvian.mods.unit.FixedBooleanUnit; import dev.latvian.mods.unit.Unit; @@ -50,7 +51,7 @@ public String toString() { } @Override - public boolean specialEquals(Object o, boolean shallow) { + public boolean specialEquals(Context cx, Object o, boolean shallow) { if (this == o || id == o) { return true; } else if (o instanceof PainterObject po) { diff --git a/src/main/java/dev/latvian/mods/kubejs/color/Color.java b/src/main/java/dev/latvian/mods/kubejs/color/Color.java index d21d6f7cf..55852eb87 100644 --- a/src/main/java/dev/latvian/mods/kubejs/color/Color.java +++ b/src/main/java/dev/latvian/mods/kubejs/color/Color.java @@ -1,6 +1,7 @@ package dev.latvian.mods.kubejs.color; import dev.latvian.mods.kubejs.bindings.ColorWrapper; +import dev.latvian.mods.rhino.Context; import dev.latvian.mods.rhino.util.SpecialEquality; import net.minecraft.network.chat.TextColor; @@ -28,7 +29,7 @@ default TextColor createTextColorJS() { } @Override - default boolean specialEquals(Object o, boolean shallow) { + default boolean specialEquals(Context cx, Object o, boolean shallow) { Color c = ColorWrapper.of(o); return shallow ? (getArgbJS() == c.getArgbJS()) : (getRgbJS() == c.getRgbJS()); } diff --git a/src/main/java/dev/latvian/mods/kubejs/core/ItemKJS.java b/src/main/java/dev/latvian/mods/kubejs/core/ItemKJS.java index 80475c820..58abb6c1e 100644 --- a/src/main/java/dev/latvian/mods/kubejs/core/ItemKJS.java +++ b/src/main/java/dev/latvian/mods/kubejs/core/ItemKJS.java @@ -1,19 +1,17 @@ package dev.latvian.mods.kubejs.core; -import dev.latvian.mods.kubejs.item.FoodBuilder; +import dev.architectury.registry.fuel.FuelRegistry; import dev.latvian.mods.kubejs.item.ItemBuilder; import dev.latvian.mods.kubejs.item.ItemStackKey; import dev.latvian.mods.kubejs.item.MutableToolTier; -import dev.latvian.mods.kubejs.registry.RegistryInfo; import dev.latvian.mods.kubejs.util.UtilsJS; import dev.latvian.mods.rhino.util.RemapPrefixForJS; import net.minecraft.Util; +import net.minecraft.core.component.DataComponentType; import net.minecraft.core.component.DataComponents; import net.minecraft.nbt.CompoundTag; import net.minecraft.resources.ResourceLocation; -import net.minecraft.world.food.FoodProperties; import net.minecraft.world.item.Item; -import net.minecraft.world.item.Rarity; import net.minecraft.world.item.TieredItem; import org.jetbrains.annotations.Nullable; @@ -42,11 +40,6 @@ public interface ItemKJS extends IngredientSupplierKJS { return kjs$getIdLocation().getNamespace(); } - default String kjs$getCreativeTab() { - var id = RegistryInfo.ITEM.getId(kjs$self()); - return id == null ? "unknown" : id.getNamespace(); - } - default void kjs$setItemBuilder(ItemBuilder b) { throw new NoMixinException(); } @@ -55,11 +48,7 @@ public interface ItemKJS extends IngredientSupplierKJS { throw new NoMixinException(); } - default void kjs$setMaxStackSize(int i) { - throw new NoMixinException(); - } - - default void kjs$setMaxDamage(int i) { + default void kjs$overrideComponent(DataComponentType type, T value) { throw new NoMixinException(); } @@ -67,20 +56,12 @@ public interface ItemKJS extends IngredientSupplierKJS { throw new NoMixinException(); } - default void kjs$setFireResistant(boolean b) { - throw new NoMixinException(); - } - - default void kjs$setRarity(Rarity r) { - throw new NoMixinException(); + default void kjs$setMaxStackSize(int i) { + kjs$overrideComponent(DataComponents.MAX_STACK_SIZE, i); } default void kjs$setBurnTime(int i) { - throw new NoMixinException(); - } - - default void kjs$setFoodProperties(FoodProperties properties) { - throw new NoMixinException(); + FuelRegistry.register(i, (Item) this); } default void kjs$setTier(Consumer c) { @@ -91,13 +72,6 @@ public interface ItemKJS extends IngredientSupplierKJS { } } - default void kjs$setFoodProperties(Consumer consumer) { - var fp = kjs$self().components().get(DataComponents.FOOD); - var builder = fp == null ? new FoodBuilder() : new FoodBuilder(fp); - consumer.accept(builder); - kjs$setFoodProperties(builder.build()); - } - default void kjs$setNameKey(String key) { throw new NoMixinException(); } diff --git a/src/main/java/dev/latvian/mods/kubejs/core/ItemStackKJS.java b/src/main/java/dev/latvian/mods/kubejs/core/ItemStackKJS.java index d91e7b3fe..95af88809 100644 --- a/src/main/java/dev/latvian/mods/kubejs/core/ItemStackKJS.java +++ b/src/main/java/dev/latvian/mods/kubejs/core/ItemStackKJS.java @@ -46,7 +46,7 @@ public interface ItemStackKJS extends SpecialEquality, NBTSerializable, JsonSeri } @Override - default boolean specialEquals(Object o, boolean shallow) { + default boolean specialEquals(Context cx, Object o, boolean shallow) { if (o instanceof CharSequence) { return kjs$getId().equals(UtilsJS.getID(o.toString())); } else if (o instanceof ItemStack s) { diff --git a/src/main/java/dev/latvian/mods/kubejs/core/mixin/common/EventHandlerBridgeMixin.java b/src/main/java/dev/latvian/mods/kubejs/core/mixin/common/EventHandlerBridgeMixin.java index 515021374..f184498c5 100644 --- a/src/main/java/dev/latvian/mods/kubejs/core/mixin/common/EventHandlerBridgeMixin.java +++ b/src/main/java/dev/latvian/mods/kubejs/core/mixin/common/EventHandlerBridgeMixin.java @@ -3,18 +3,22 @@ import dev.latvian.mods.kubejs.event.EventHandler; import dev.latvian.mods.kubejs.event.KubeEvent; import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.Unique; @SuppressWarnings("ReferenceToMixin") @Mixin(value = EventHandler.class, remap = false) public abstract class EventHandlerBridgeMixin { + @Unique public EventHandler cancelable() { return ((EventHandlerInvoker) this).callHasResult(); } + @Unique public boolean post(Object extraId, KubeEvent event) { return ((EventHandlerInvoker) this).callPost(event, extraId).interruptFalse(); } + @Unique public boolean post(KubeEvent event) { return ((EventHandlerInvoker) this).callPost(event, null).interruptFalse(); } diff --git a/src/main/java/dev/latvian/mods/kubejs/core/mixin/common/ItemMixin.java b/src/main/java/dev/latvian/mods/kubejs/core/mixin/common/ItemMixin.java index a0437ff2b..b5094c3bf 100644 --- a/src/main/java/dev/latvian/mods/kubejs/core/mixin/common/ItemMixin.java +++ b/src/main/java/dev/latvian/mods/kubejs/core/mixin/common/ItemMixin.java @@ -1,6 +1,5 @@ package dev.latvian.mods.kubejs.core.mixin.common; -import dev.architectury.registry.fuel.FuelRegistry; import dev.latvian.mods.kubejs.core.ItemKJS; import dev.latvian.mods.kubejs.item.ItemBuilder; import dev.latvian.mods.kubejs.item.ItemStackKey; @@ -8,6 +7,8 @@ import dev.latvian.mods.kubejs.util.UtilsJS; import dev.latvian.mods.rhino.util.RemapForJS; import dev.latvian.mods.rhino.util.RemapPrefixForJS; +import net.minecraft.core.component.DataComponentMap; +import net.minecraft.core.component.DataComponentType; import net.minecraft.nbt.CompoundTag; import net.minecraft.network.chat.Component; import net.minecraft.resources.ResourceLocation; @@ -15,11 +16,9 @@ import net.minecraft.world.InteractionResultHolder; import net.minecraft.world.entity.LivingEntity; import net.minecraft.world.entity.player.Player; -import net.minecraft.world.food.FoodProperties; import net.minecraft.world.item.Item; import net.minecraft.world.item.ItemStack; import net.minecraft.world.item.ItemUtils; -import net.minecraft.world.item.Rarity; import net.minecraft.world.item.TooltipFlag; import net.minecraft.world.item.UseAnim; import net.minecraft.world.item.crafting.Ingredient; @@ -27,6 +26,7 @@ import org.jetbrains.annotations.Nullable; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.Mutable; +import org.spongepowered.asm.mixin.Shadow; import org.spongepowered.asm.mixin.gen.Accessor; import org.spongepowered.asm.mixin.injection.At; import org.spongepowered.asm.mixin.injection.Inject; @@ -39,6 +39,8 @@ @Mixin(value = Item.class, priority = 1001) @RemapPrefixForJS("kjs$") public abstract class ItemMixin implements ItemKJS { + @Shadow + private DataComponentMap components; private ItemBuilder kjs$itemBuilder; private CompoundTag kjs$typeData; private Ingredient kjs$asIngredient; @@ -92,50 +94,26 @@ public abstract class ItemMixin implements ItemKJS { } @Override - @Accessor("maxStackSize") - @Mutable - public abstract void kjs$setMaxStackSize(int i); - - @Override - @Accessor("maxDamage") - @Mutable - public abstract void kjs$setMaxDamage(int i); + public void kjs$overrideComponent(DataComponentType type, T value) { + DataComponentMap.Builder builder = DataComponentMap.builder().addAll(this.components); + builder.set(type, value); + this.components = Item.Properties.COMPONENT_INTERNER.intern(Item.Properties.validateComponents(builder.build())); + } @Override @Accessor("craftingRemainingItem") @Mutable public abstract void kjs$setCraftingRemainder(Item i); - @Override - @Accessor("isFireResistant") - @Mutable - public abstract void kjs$setFireResistant(boolean b); - - @Override - @Accessor("rarity") - @Mutable - public abstract void kjs$setRarity(Rarity r); - - @Override - @RemapForJS("setBurnTime") - public void kjs$setBurnTime(int i) { - FuelRegistry.register(i, (Item) (Object) this); - } - - @Override - @Accessor("foodProperties") - @Mutable - public abstract void kjs$setFoodProperties(FoodProperties properties); - @Inject(method = "isFoil", at = @At("HEAD"), cancellable = true) - private void isFoilKJS(ItemStack itemStack, CallbackInfoReturnable ci) { + private void isFoil(ItemStack itemStack, CallbackInfoReturnable ci) { if (kjs$itemBuilder != null && kjs$itemBuilder.glow) { ci.setReturnValue(true); } } @Inject(method = "appendHoverText", at = @At("RETURN")) - private void appendHoverText(ItemStack stack, @Nullable Level level, List tooltip, TooltipFlag flagIn, CallbackInfo ci) { + private void appendHoverText(ItemStack stack, Item.TooltipContext context, List tooltip, TooltipFlag flagIn, CallbackInfo ci) { if (kjs$itemBuilder != null && !kjs$itemBuilder.tooltip.isEmpty()) { tooltip.addAll(kjs$itemBuilder.tooltip); } diff --git a/src/main/java/dev/latvian/mods/kubejs/core/mixin/common/ItemStackMixin.java b/src/main/java/dev/latvian/mods/kubejs/core/mixin/common/ItemStackMixin.java index 1e2df37e5..b400fcdb6 100644 --- a/src/main/java/dev/latvian/mods/kubejs/core/mixin/common/ItemStackMixin.java +++ b/src/main/java/dev/latvian/mods/kubejs/core/mixin/common/ItemStackMixin.java @@ -3,7 +3,6 @@ import dev.latvian.mods.kubejs.core.ItemStackKJS; import dev.latvian.mods.rhino.util.RemapForJS; import dev.latvian.mods.rhino.util.RemapPrefixForJS; -import net.minecraft.nbt.CompoundTag; import net.minecraft.world.item.ItemStack; import net.minecraft.world.item.enchantment.Enchantment; import org.spongepowered.asm.mixin.Mixin; @@ -15,16 +14,4 @@ public abstract class ItemStackMixin implements ItemStackKJS { @Shadow @RemapForJS("enchantStack") public abstract void enchant(Enchantment enchantment, int level); - - @Shadow - @RemapForJS("getNbt") - public abstract CompoundTag getTag(); - - @Shadow - @RemapForJS("setNbt") - public abstract void setTag(CompoundTag tag); - - @Shadow - @RemapForJS("hasNBT") - public abstract boolean hasTag(); } diff --git a/src/main/java/dev/latvian/mods/kubejs/core/mixin/common/MinecraftClientMixin.java b/src/main/java/dev/latvian/mods/kubejs/core/mixin/common/MinecraftClientMixin.java index db699e6b6..19c671ef7 100644 --- a/src/main/java/dev/latvian/mods/kubejs/core/mixin/common/MinecraftClientMixin.java +++ b/src/main/java/dev/latvian/mods/kubejs/core/mixin/common/MinecraftClientMixin.java @@ -13,7 +13,6 @@ import net.minecraft.client.Minecraft; import net.minecraft.server.packs.PackResources; import org.spongepowered.asm.mixin.Mixin; -import org.spongepowered.asm.mixin.Unique; import org.spongepowered.asm.mixin.injection.At; import org.spongepowered.asm.mixin.injection.Inject; import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; @@ -25,9 +24,6 @@ @Mixin(Minecraft.class) @RemapPrefixForJS("kjs$") public abstract class MinecraftClientMixin implements MinecraftClientKJS { - @Unique - private ScheduledEvents kjs$scheduledEvents; - @Inject(method = "", at = @At("RETURN")) private void kjs$init(CallbackInfo ci) { CompletableFuture.runAsync(() -> kjs$afterResourcesLoaded(false), kjs$self()); @@ -63,9 +59,7 @@ public abstract class MinecraftClientMixin implements MinecraftClientKJS { @Inject(method = "tick", at = @At("RETURN")) private void kjs$postTickClient(CallbackInfo ci) { if (kjs$self().level != null && kjs$self().player != null) { - if (kjs$scheduledEvents != null) { - kjs$scheduledEvents.tickAll(kjs$self().level.getGameTime()); - } + ScheduledClientEvent.EVENTS.tickAll(kjs$self().level.getGameTime()); if (ClientEvents.TICK.hasListeners()) { try { @@ -79,11 +73,7 @@ public abstract class MinecraftClientMixin implements MinecraftClientKJS { @Override public ScheduledEvents kjs$getScheduledEvents() { - if (kjs$scheduledEvents == null) { - kjs$scheduledEvents = ScheduledClientEvent.make(kjs$self()); - } - - return kjs$scheduledEvents; + return ScheduledClientEvent.EVENTS; } @Inject(method = "reloadResourcePacks(ZLnet/minecraft/client/Minecraft$GameLoadCookie;)Ljava/util/concurrent/CompletableFuture;", at = @At("TAIL")) diff --git a/src/main/java/dev/latvian/mods/kubejs/core/mixin/common/MinecraftServerMixin.java b/src/main/java/dev/latvian/mods/kubejs/core/mixin/common/MinecraftServerMixin.java index bfeb289aa..1e2f4d4a3 100644 --- a/src/main/java/dev/latvian/mods/kubejs/core/mixin/common/MinecraftServerMixin.java +++ b/src/main/java/dev/latvian/mods/kubejs/core/mixin/common/MinecraftServerMixin.java @@ -45,9 +45,6 @@ public abstract class MinecraftServerMixin implements MinecraftServerKJS { @Unique private final CompoundTag kjs$persistentData = new CompoundTag(); - @Unique - private ScheduledEvents kjs$scheduledEvents; - @Unique private ServerLevel kjs$overworld; @@ -92,9 +89,7 @@ public abstract class MinecraftServerMixin implements MinecraftServerKJS { @Inject(method = "tickServer", at = @At("RETURN")) private void kjs$postTickServer(BooleanSupplier booleanSupplier, CallbackInfo ci) { - if (kjs$scheduledEvents != null) { - kjs$scheduledEvents.tickAll(kjs$getOverworld().getGameTime()); - } + ScheduledServerEvent.EVENTS.tickAll(kjs$getOverworld().getGameTime()); if (!kjs$restoreInventories.isEmpty()) { for (var player : kjs$self().getPlayerList().getPlayers()) { @@ -119,11 +114,7 @@ public abstract class MinecraftServerMixin implements MinecraftServerKJS { @Override public ScheduledEvents kjs$getScheduledEvents() { - if (kjs$scheduledEvents == null) { - kjs$scheduledEvents = ScheduledServerEvent.make(kjs$self()); - } - - return kjs$scheduledEvents; + return ScheduledServerEvent.EVENTS; } @Override diff --git a/src/main/java/dev/latvian/mods/kubejs/core/mixin/common/NumericTagMixin.java b/src/main/java/dev/latvian/mods/kubejs/core/mixin/common/NumericTagMixin.java index aaad48fc7..c1540db87 100644 --- a/src/main/java/dev/latvian/mods/kubejs/core/mixin/common/NumericTagMixin.java +++ b/src/main/java/dev/latvian/mods/kubejs/core/mixin/common/NumericTagMixin.java @@ -1,5 +1,6 @@ package dev.latvian.mods.kubejs.core.mixin.common; +import dev.latvian.mods.rhino.Context; import dev.latvian.mods.rhino.util.SpecialEquality; import net.minecraft.nbt.NumericTag; import org.spongepowered.asm.mixin.Mixin; @@ -14,7 +15,7 @@ public abstract class NumericTagMixin implements SpecialEquality { public abstract double getAsDouble(); @Override - public boolean specialEquals(Object o, boolean shallow) { + public boolean specialEquals(Context cx, Object o, boolean shallow) { if (o instanceof Boolean b) { return b == (getAsByte() != 0); } else if (o instanceof Number n1) { diff --git a/src/main/java/dev/latvian/mods/kubejs/core/mixin/common/ResourceKeyMixin.java b/src/main/java/dev/latvian/mods/kubejs/core/mixin/common/ResourceKeyMixin.java index 4d7bd199b..b77a02529 100644 --- a/src/main/java/dev/latvian/mods/kubejs/core/mixin/common/ResourceKeyMixin.java +++ b/src/main/java/dev/latvian/mods/kubejs/core/mixin/common/ResourceKeyMixin.java @@ -1,5 +1,6 @@ package dev.latvian.mods.kubejs.core.mixin.common; +import dev.latvian.mods.rhino.Context; import dev.latvian.mods.rhino.util.RemapPrefixForJS; import dev.latvian.mods.rhino.util.SpecialEquality; import net.minecraft.resources.ResourceKey; @@ -30,7 +31,7 @@ public abstract class ResourceKeyMixin implements SpecialEquality { } @Override - public boolean specialEquals(Object o, boolean shallow) { + public boolean specialEquals(Context cx, Object o, boolean shallow) { if (this == o) { return true; } else if (o instanceof ResourceKey) { diff --git a/src/main/java/dev/latvian/mods/kubejs/core/mixin/common/ResourceLocationMixin.java b/src/main/java/dev/latvian/mods/kubejs/core/mixin/common/ResourceLocationMixin.java index 14de84a47..321d83c42 100644 --- a/src/main/java/dev/latvian/mods/kubejs/core/mixin/common/ResourceLocationMixin.java +++ b/src/main/java/dev/latvian/mods/kubejs/core/mixin/common/ResourceLocationMixin.java @@ -1,5 +1,6 @@ package dev.latvian.mods.kubejs.core.mixin.common; +import dev.latvian.mods.rhino.Context; import dev.latvian.mods.rhino.util.SpecialEquality; import net.minecraft.resources.ResourceLocation; import org.spongepowered.asm.mixin.Mixin; @@ -7,7 +8,7 @@ @Mixin(value = ResourceLocation.class, priority = 1001) public abstract class ResourceLocationMixin implements SpecialEquality { @Override - public boolean specialEquals(Object o, boolean shallow) { + public boolean specialEquals(Context cx, Object o, boolean shallow) { return equals(o instanceof ResourceLocation ? o : toString().equals(String.valueOf(o))); } } diff --git a/src/main/java/dev/latvian/mods/kubejs/core/mixin/common/StringTagMixin.java b/src/main/java/dev/latvian/mods/kubejs/core/mixin/common/StringTagMixin.java index 178eb4db0..81cb60533 100644 --- a/src/main/java/dev/latvian/mods/kubejs/core/mixin/common/StringTagMixin.java +++ b/src/main/java/dev/latvian/mods/kubejs/core/mixin/common/StringTagMixin.java @@ -1,5 +1,6 @@ package dev.latvian.mods.kubejs.core.mixin.common; +import dev.latvian.mods.rhino.Context; import dev.latvian.mods.rhino.util.SpecialEquality; import net.minecraft.nbt.StringTag; import org.spongepowered.asm.mixin.Mixin; @@ -11,7 +12,7 @@ public abstract class StringTagMixin implements SpecialEquality { public abstract String getAsString(); @Override - public boolean specialEquals(Object o, boolean shallow) { + public boolean specialEquals(Context cx, Object o, boolean shallow) { if (o instanceof CharSequence s) { return s.equals(getAsString()); } diff --git a/src/main/java/dev/latvian/mods/kubejs/core/mixin/common/inject_resources/MinecraftServerMixin.java b/src/main/java/dev/latvian/mods/kubejs/core/mixin/common/inject_resources/MinecraftServerMixin.java index e682b4d36..1abe8ce40 100644 --- a/src/main/java/dev/latvian/mods/kubejs/core/mixin/common/inject_resources/MinecraftServerMixin.java +++ b/src/main/java/dev/latvian/mods/kubejs/core/mixin/common/inject_resources/MinecraftServerMixin.java @@ -1,16 +1,21 @@ package dev.latvian.mods.kubejs.core.mixin.common.inject_resources; import dev.latvian.mods.kubejs.server.ServerScriptManager; +import net.minecraft.core.RegistryAccess; import net.minecraft.server.MinecraftServer; import net.minecraft.server.packs.resources.CloseableResourceManager; import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.Shadow; import org.spongepowered.asm.mixin.injection.At; import org.spongepowered.asm.mixin.injection.ModifyVariable; @Mixin(MinecraftServer.class) public abstract class MinecraftServerMixin { + @Shadow + public abstract RegistryAccess.Frozen registryAccess(); + @ModifyVariable(method = {"*"}, at = @At("STORE"), remap = false) public CloseableResourceManager wrapResourceManager(CloseableResourceManager original) { - return (ServerScriptManager.instance = new ServerScriptManager((MinecraftServer) (Object) this)).wrapResourceManager(original); + return (ServerScriptManager.instance = new ServerScriptManager(registryAccess())).wrapResourceManager(original); } } diff --git a/src/main/java/dev/latvian/mods/kubejs/level/BlockContainerJS.java b/src/main/java/dev/latvian/mods/kubejs/level/BlockContainerJS.java index 6893cb5f0..ae5cf669f 100644 --- a/src/main/java/dev/latvian/mods/kubejs/level/BlockContainerJS.java +++ b/src/main/java/dev/latvian/mods/kubejs/level/BlockContainerJS.java @@ -5,6 +5,7 @@ import dev.latvian.mods.kubejs.registry.RegistryInfo; import dev.latvian.mods.kubejs.util.Tags; import dev.latvian.mods.kubejs.util.UtilsJS; +import dev.latvian.mods.rhino.Context; import dev.latvian.mods.rhino.util.SpecialEquality; import net.minecraft.core.BlockPos; import net.minecraft.core.Direction; @@ -402,7 +403,7 @@ public ResourceLocation getBiomeId() { } @Override - public boolean specialEquals(Object o, boolean shallow) { + public boolean specialEquals(Context cx, Object o, boolean shallow) { if (o instanceof CharSequence || o instanceof ResourceLocation) { return getId().equals(o.toString()); } diff --git a/src/main/java/dev/latvian/mods/kubejs/script/KubeJSContext.java b/src/main/java/dev/latvian/mods/kubejs/script/KubeJSContext.java index 7d6a38cee..185187ea2 100644 --- a/src/main/java/dev/latvian/mods/kubejs/script/KubeJSContext.java +++ b/src/main/java/dev/latvian/mods/kubejs/script/KubeJSContext.java @@ -38,7 +38,11 @@ public KubeJSContext(KubeJSContextFactory factory) { @Override public boolean visibleToScripts(String fullClassName, ClassVisibilityContext type) { - return type != ClassVisibilityContext.CLASS_IN_PACKAGE || kjsFactory.manager.isClassAllowed(fullClassName); + if (type == ClassVisibilityContext.CLASS_IN_PACKAGE || type == ClassVisibilityContext.ARGUMENT) { + return kjsFactory.manager.isClassAllowed(fullClassName); + } + + return true; } public ScriptType getType() { diff --git a/src/main/java/dev/latvian/mods/kubejs/server/ScheduledServerEvent.java b/src/main/java/dev/latvian/mods/kubejs/server/ScheduledServerEvent.java index 6fbeb1bff..d426a1960 100644 --- a/src/main/java/dev/latvian/mods/kubejs/server/ScheduledServerEvent.java +++ b/src/main/java/dev/latvian/mods/kubejs/server/ScheduledServerEvent.java @@ -2,11 +2,10 @@ import dev.latvian.mods.kubejs.util.ScheduledEvents; import net.minecraft.server.MinecraftServer; +import net.neoforged.neoforge.server.ServerLifecycleHooks; public class ScheduledServerEvent extends ScheduledEvents.ScheduledEvent { - public static ScheduledEvents make(MinecraftServer server) { - return new ScheduledEvents(() -> new ScheduledServerEvent(server)); - } + public static final ScheduledEvents EVENTS = new ScheduledEvents(() -> new ScheduledServerEvent(ServerLifecycleHooks.getCurrentServer())); public final MinecraftServer server; diff --git a/src/main/java/dev/latvian/mods/kubejs/server/ServerScriptManager.java b/src/main/java/dev/latvian/mods/kubejs/server/ServerScriptManager.java index ff0ff8816..1e9520da1 100644 --- a/src/main/java/dev/latvian/mods/kubejs/server/ServerScriptManager.java +++ b/src/main/java/dev/latvian/mods/kubejs/server/ServerScriptManager.java @@ -17,7 +17,6 @@ import net.minecraft.core.RegistryAccess; import net.minecraft.network.chat.Component; import net.minecraft.resources.ResourceKey; -import net.minecraft.server.MinecraftServer; import net.minecraft.server.ReloadableServerResources; import net.minecraft.server.packs.FilePackResources; import net.minecraft.server.packs.PackLocationInfo; @@ -25,7 +24,6 @@ import net.minecraft.server.packs.repository.PackSource; import net.minecraft.server.packs.resources.CloseableResourceManager; import net.minecraft.server.packs.resources.MultiPackResourceManager; -import org.jetbrains.annotations.Nullable; import java.nio.file.Files; import java.util.HashMap; @@ -42,13 +40,11 @@ public static ScriptManager getScriptManager() { return instance; } - public final MinecraftServer server; public final Map, PreTagKubeEvent> preTagEvents = new ConcurrentHashMap<>(); - public ServerScriptManager(@Nullable MinecraftServer server) { + public ServerScriptManager(RegistryAccess registryAccess) { super(ScriptType.SERVER); - this.server = server; - this.registries = server.registryAccess(); + this.registries = registryAccess; try { if (Files.notExists(KubeJSPaths.DATA)) { diff --git a/src/main/java/dev/latvian/mods/kubejs/util/ConsoleJS.java b/src/main/java/dev/latvian/mods/kubejs/util/ConsoleJS.java index 2d35f8805..c8b5e8065 100644 --- a/src/main/java/dev/latvian/mods/kubejs/util/ConsoleJS.java +++ b/src/main/java/dev/latvian/mods/kubejs/util/ConsoleJS.java @@ -192,9 +192,13 @@ private ConsoleLine line(LogType type, Object object, @Nullable Throwable error) } if (line.sourceLines.isEmpty()) { - int[] lineP = {0}; - var source = Context.getSourcePositionFromStack(scriptType.manager.get().contextFactory.enter(), lineP); - line.withSourceLine(source, lineP[0]); + var factory = scriptType.manager.get().contextFactory; + + if (factory != null) { + int[] lineP = {0}; + var source = Context.getSourcePositionFromStack(factory.enter(), lineP); + line.withSourceLine(source, lineP[0]); + } } return line; diff --git a/src/main/java/dev/latvian/mods/kubejs/util/WithContext.java b/src/main/java/dev/latvian/mods/kubejs/util/WithContext.java index ec16f2099..57a05a563 100644 --- a/src/main/java/dev/latvian/mods/kubejs/util/WithContext.java +++ b/src/main/java/dev/latvian/mods/kubejs/util/WithContext.java @@ -11,7 +11,7 @@ public static WithContext of(Context cx, Object o, TypeInfo target) { if (cx instanceof KubeJSContext kcx) { var type = target.param(0); - if (type.convert()) { + if (type.shouldConvert()) { return new WithContext(kcx, cx.jsToJava(o, type)); } else { return new WithContext(kcx, o); diff --git a/src/main/resources/kubejs.accesswidener b/src/main/resources/kubejs.accesswidener index 4f430c5ea..05a85db68 100644 --- a/src/main/resources/kubejs.accesswidener +++ b/src/main/resources/kubejs.accesswidener @@ -1,6 +1,7 @@ accessWidener v2 named accessible class net/minecraft/server/MinecraftServer$ReloadableResources +accessible field net/minecraft/world/item/Item$Properties COMPONENT_INTERNER Lcom/google/common/collect/Interner; # nbt related accessible field net/minecraft/nbt/CompoundTag tags Ljava/util/Map;