From 91c70885b89bacfed0e8f1806f5f45bddf1113c3 Mon Sep 17 00:00:00 2001 From: Hunter19823 Date: Mon, 4 Mar 2024 15:16:20 -0700 Subject: [PATCH 1/4] Added a mixin to ShapedRecipeMixin that appends NBT data to ItemStack when parsing result. --- .../core/mixin/fabric/ShapedRecipeMixin.java | 54 +++++++++++++++++++ .../main/resources/kubejs-fabric.mixins.json | 1 + 2 files changed, 55 insertions(+) create mode 100644 fabric/src/main/java/dev/latvian/mods/kubejs/core/mixin/fabric/ShapedRecipeMixin.java diff --git a/fabric/src/main/java/dev/latvian/mods/kubejs/core/mixin/fabric/ShapedRecipeMixin.java b/fabric/src/main/java/dev/latvian/mods/kubejs/core/mixin/fabric/ShapedRecipeMixin.java new file mode 100644 index 000000000..0f040c599 --- /dev/null +++ b/fabric/src/main/java/dev/latvian/mods/kubejs/core/mixin/fabric/ShapedRecipeMixin.java @@ -0,0 +1,54 @@ +package dev.latvian.mods.kubejs.core.mixin.fabric; + +import com.google.gson.JsonObject; +import com.google.gson.JsonSyntaxException; +import com.mojang.brigadier.exceptions.CommandSyntaxException; +import dev.latvian.mods.rhino.mod.util.NBTUtils; +import net.minecraft.nbt.CompoundTag; +import net.minecraft.nbt.TagParser; +import net.minecraft.util.GsonHelper; +import net.minecraft.world.item.ItemStack; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.injection.At; +import org.spongepowered.asm.mixin.injection.Inject; +import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; + +@Mixin(net.minecraft.world.item.crafting.ShapedRecipe.class) +public class ShapedRecipeMixin { + @Inject( + method = "itemStackFromJson", + at = @At( + value = "RETURN", + remap = false + ), + cancellable = false + ) + private static void itemStackFromJson(JsonObject jsonObject, CallbackInfoReturnable cir) { + if(cir.getReturnValue() == null || cir.getReturnValue() == ItemStack.EMPTY) { + return; + } + + if(jsonObject.has("nbt")) { + var json = jsonObject.get("nbt"); + // Process null + if (json == null || json.isJsonNull()) { + return; + } + + try { + CompoundTag tag = null; + if (json.isJsonObject()) { + // We use a normal .toString() to convert the json to string, and read it as SNBT. + // Using DynamicOps would mess with the type of integers and cause things like damage comparisons to fail... + tag = TagParser.parseTag(json.toString()); + } else { + // Assume it's a string representation of the NBT + tag = TagParser.parseTag(GsonHelper.convertToString(json, "nbt")); + } + cir.getReturnValue().getOrCreateTag().merge(tag); + } catch (CommandSyntaxException commandSyntaxException) { + throw new JsonSyntaxException("Invalid nbt tag: " + commandSyntaxException.getMessage()); + } + } + } +} diff --git a/fabric/src/main/resources/kubejs-fabric.mixins.json b/fabric/src/main/resources/kubejs-fabric.mixins.json index a961b44e0..974621e10 100644 --- a/fabric/src/main/resources/kubejs-fabric.mixins.json +++ b/fabric/src/main/resources/kubejs-fabric.mixins.json @@ -8,6 +8,7 @@ "DifferenceIngredientMixin", "IngredientMatchingMixin", "NbtIngredientMixin", + "ShapedRecipeMixin", "tools.shears.BlockInteractShearsMixin", "tools.shears.EntityInteractShearsMixin", "tools.shears.MatchToolMixin", From 7855843c34c4655589ae301b3c29a894a013fc77 Mon Sep 17 00:00:00 2001 From: Hunter19823 Date: Mon, 4 Mar 2024 20:27:46 -0700 Subject: [PATCH 2/4] Created a CarpetBlockBuilder --- .../mods/kubejs/BuiltinKubeJSPlugin.java | 2 + .../block/custom/CarpetBlockBuilder.java | 40 +++++++++++++++++++ 2 files changed, 42 insertions(+) create mode 100644 common/src/main/java/dev/latvian/mods/kubejs/block/custom/CarpetBlockBuilder.java diff --git a/common/src/main/java/dev/latvian/mods/kubejs/BuiltinKubeJSPlugin.java b/common/src/main/java/dev/latvian/mods/kubejs/BuiltinKubeJSPlugin.java index 007f338b8..de8179e45 100644 --- a/common/src/main/java/dev/latvian/mods/kubejs/BuiltinKubeJSPlugin.java +++ b/common/src/main/java/dev/latvian/mods/kubejs/BuiltinKubeJSPlugin.java @@ -34,6 +34,7 @@ import dev.latvian.mods.kubejs.block.MaterialListJS; import dev.latvian.mods.kubejs.block.SoundTypeWrapper; import dev.latvian.mods.kubejs.block.custom.BasicBlockJS; +import dev.latvian.mods.kubejs.block.custom.CarpetBlockBuilder; import dev.latvian.mods.kubejs.block.custom.CropBlockBuilder; import dev.latvian.mods.kubejs.block.custom.FallingBlockBuilder; import dev.latvian.mods.kubejs.block.custom.FenceBlockBuilder; @@ -194,6 +195,7 @@ public void init() { RegistryInfo.BLOCK.addType("falling", FallingBlockBuilder.class, FallingBlockBuilder::new); RegistryInfo.BLOCK.addType("crop", CropBlockBuilder.class, CropBlockBuilder::new); RegistryInfo.BLOCK.addType("cardinal", HorizontalDirectionalBlockBuilder.class, HorizontalDirectionalBlockBuilder::new); + RegistryInfo.BLOCK.addType("carpet", CarpetBlockBuilder.class, CarpetBlockBuilder::new); RegistryInfo.ITEM.addType("basic", BasicItemJS.Builder.class, BasicItemJS.Builder::new); RegistryInfo.ITEM.addType("sword", SwordItemBuilder.class, SwordItemBuilder::new); diff --git a/common/src/main/java/dev/latvian/mods/kubejs/block/custom/CarpetBlockBuilder.java b/common/src/main/java/dev/latvian/mods/kubejs/block/custom/CarpetBlockBuilder.java new file mode 100644 index 000000000..5743391a6 --- /dev/null +++ b/common/src/main/java/dev/latvian/mods/kubejs/block/custom/CarpetBlockBuilder.java @@ -0,0 +1,40 @@ +package dev.latvian.mods.kubejs.block.custom; + +import dev.latvian.mods.kubejs.client.VariantBlockStateGenerator; +import dev.latvian.mods.kubejs.generator.AssetJsonGenerator; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.tags.BlockTags; +import net.minecraft.world.level.block.Block; +import net.minecraft.world.level.block.CarpetBlock; + +public class CarpetBlockBuilder extends ShapedBlockBuilder { + public CarpetBlockBuilder(ResourceLocation i) { + super(i, "_carpet"); + tagBoth(BlockTags.WOOL_CARPETS.location()); + } + + @Override + public Block createObject() { + return new CarpetBlock(createProperties()); + } + + @Override + protected void generateBlockStateJson(VariantBlockStateGenerator bs) { + var mod = newID("block/", "").toString(); + bs.variant("", (v) -> v.model(mod)); + } + + @Override + protected void generateBlockModelJsons(AssetJsonGenerator generator) { + var texture = textures.get("texture").getAsString(); + + generator.blockModel(id, m -> { + m.parent("minecraft:block/carpet"); + m.texture("wool", texture); + }); + } + + public CarpetBlockBuilder texture(String texture) { + return (CarpetBlockBuilder) textureAll(texture); + } +} From e871bb2dc7c8a36f6c21eba2d109435db6dfa1c1 Mon Sep 17 00:00:00 2001 From: squoshi <95097230+squoshi@users.noreply.github.com> Date: Mon, 25 Mar 2024 15:07:37 -0500 Subject: [PATCH 3/4] Add hurtEnemy callback to ItemBuilder --- .../mods/kubejs/core/mixin/common/ItemMixin.java | 7 +++++++ .../dev/latvian/mods/kubejs/item/ItemBuilder.java | 15 +++++++++++++++ 2 files changed, 22 insertions(+) diff --git a/common/src/main/java/dev/latvian/mods/kubejs/core/mixin/common/ItemMixin.java b/common/src/main/java/dev/latvian/mods/kubejs/core/mixin/common/ItemMixin.java index 57c6b7acb..508d638c8 100644 --- a/common/src/main/java/dev/latvian/mods/kubejs/core/mixin/common/ItemMixin.java +++ b/common/src/main/java/dev/latvian/mods/kubejs/core/mixin/common/ItemMixin.java @@ -209,6 +209,13 @@ private void releaseUsing(ItemStack itemStack, Level level, LivingEntity livingE } } + @Inject(method = "hurtEnemy", at = @At("HEAD")) + private void hurtEnemy(ItemStack itemStack, LivingEntity livingEntity, LivingEntity livingEntity2, CallbackInfoReturnable cir) { + if (kjs$itemBuilder != null && kjs$itemBuilder.hurtEnemy != null) { + kjs$itemBuilder.hurtEnemy.test(new ItemBuilder.HurtEnemyContext(itemStack, livingEntity, livingEntity2)); + } + } + @Override public Ingredient kjs$asIngredient() { if (kjs$asIngredient == null) { diff --git a/common/src/main/java/dev/latvian/mods/kubejs/item/ItemBuilder.java b/common/src/main/java/dev/latvian/mods/kubejs/item/ItemBuilder.java index 640573caf..d8693280f 100644 --- a/common/src/main/java/dev/latvian/mods/kubejs/item/ItemBuilder.java +++ b/common/src/main/java/dev/latvian/mods/kubejs/item/ItemBuilder.java @@ -39,6 +39,7 @@ import java.util.UUID; import java.util.function.Consumer; import java.util.function.Function; +import java.util.function.Predicate; import java.util.function.ToIntFunction; @SuppressWarnings({"unused", "UnusedReturnValue"}) @@ -112,6 +113,7 @@ public static Tier toToolTier(Object o) { public transient UseCallback use; public transient FinishUsingCallback finishUsing; public transient ReleaseUsingCallback releaseUsing; + public transient Predicate hurtEnemy; public String texture; public String parentModel; @@ -140,6 +142,7 @@ public ItemBuilder(ResourceLocation i) { finishUsing = null; releaseUsing = null; fireResistant = false; + hurtEnemy = null; } @Override @@ -445,6 +448,16 @@ public ItemBuilder releaseUsing(ReleaseUsingCallback releaseUsing) { return this; } + @Info(""" + Gets called when the item is used to hurt an entity. + + For example, when using a sword to hit a mob, this is called. + """) + public ItemBuilder hurtEnemy(Predicate context) { + this.hurtEnemy = context; + return this; + } + @FunctionalInterface public interface UseCallback { boolean use(Level level, Player player, InteractionHand interactionHand); @@ -464,4 +477,6 @@ public interface ReleaseUsingCallback { public interface NameCallback { Component apply(ItemStack itemStack); } + + public record HurtEnemyContext(ItemStack getItem, LivingEntity getTarget, LivingEntity getAttacker) {} } \ No newline at end of file From ea289f1a11d2f5ebd684dcd6daf1be9f942fc4d9 Mon Sep 17 00:00:00 2001 From: squoshi <95097230+squoshi@users.noreply.github.com> Date: Mon, 25 Mar 2024 15:24:07 -0500 Subject: [PATCH 4/4] Fix return value on hurtEnemy --- .../dev/latvian/mods/kubejs/core/mixin/common/ItemMixin.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/common/src/main/java/dev/latvian/mods/kubejs/core/mixin/common/ItemMixin.java b/common/src/main/java/dev/latvian/mods/kubejs/core/mixin/common/ItemMixin.java index 508d638c8..5d0716cac 100644 --- a/common/src/main/java/dev/latvian/mods/kubejs/core/mixin/common/ItemMixin.java +++ b/common/src/main/java/dev/latvian/mods/kubejs/core/mixin/common/ItemMixin.java @@ -209,10 +209,10 @@ private void releaseUsing(ItemStack itemStack, Level level, LivingEntity livingE } } - @Inject(method = "hurtEnemy", at = @At("HEAD")) + @Inject(method = "hurtEnemy", at = @At("HEAD"), cancellable = true) private void hurtEnemy(ItemStack itemStack, LivingEntity livingEntity, LivingEntity livingEntity2, CallbackInfoReturnable cir) { if (kjs$itemBuilder != null && kjs$itemBuilder.hurtEnemy != null) { - kjs$itemBuilder.hurtEnemy.test(new ItemBuilder.HurtEnemyContext(itemStack, livingEntity, livingEntity2)); + cir.setReturnValue(kjs$itemBuilder.hurtEnemy.test(new ItemBuilder.HurtEnemyContext(itemStack, livingEntity, livingEntity2))); } }