From 4d634a1c150da116938d858b3d263859792a3b6e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?K=C3=A4seToatz?= Date: Wed, 3 Dec 2025 19:53:46 +0100 Subject: [PATCH] Add mixins for block and entity placeholder cleanup Introduces BlockMixin and EntityMixin to handle removal of placeholder ArmorStand entities when pressure plates are broken and when fishing rod item entities are discarded. Also updates Util to mark spawned placeholders with a custom data flag, and registers new mixins in stasisrods.mixins.json. Bumps mod version to 1.4. --- gradle.properties | 2 +- .../stasisrods/mixin/BlockMixin.java | 35 +++++++++++++++++++ .../stasisrods/mixin/EntityMixin.java | 29 +++++++++++++++ .../com/kasetoatz/stasisrods/util/Util.java | 1 + src/main/resources/stasisrods.mixins.json | 2 ++ 5 files changed, 68 insertions(+), 1 deletion(-) create mode 100644 src/main/java/com/kasetoatz/stasisrods/mixin/BlockMixin.java create mode 100644 src/main/java/com/kasetoatz/stasisrods/mixin/EntityMixin.java diff --git a/gradle.properties b/gradle.properties index 90fa290..ab16f1e 100644 --- a/gradle.properties +++ b/gradle.properties @@ -7,7 +7,7 @@ yarn_mappings=1.21.10+build.2 loader_version=0.17.3 loom_version=1.12-SNAPSHOT # Mod Properties -mod_version=1.3 +mod_version=1.4 maven_group=com.kasetoatz archives_base_name=StasisRods # Dependencies diff --git a/src/main/java/com/kasetoatz/stasisrods/mixin/BlockMixin.java b/src/main/java/com/kasetoatz/stasisrods/mixin/BlockMixin.java new file mode 100644 index 0000000..982764f --- /dev/null +++ b/src/main/java/com/kasetoatz/stasisrods/mixin/BlockMixin.java @@ -0,0 +1,35 @@ +package com.kasetoatz.stasisrods.mixin; + +import net.minecraft.block.Block; +import net.minecraft.block.BlockState; +import net.minecraft.component.DataComponentTypes; +import net.minecraft.component.type.NbtComponent; +import net.minecraft.entity.Entity; +import net.minecraft.entity.decoration.ArmorStandEntity; +import net.minecraft.entity.player.PlayerEntity; +import net.minecraft.registry.tag.BlockTags; +import net.minecraft.util.math.BlockPos; +import net.minecraft.util.math.Box; +import net.minecraft.world.World; +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; + +import java.util.List; +import java.util.Objects; + +@Mixin(Block.class) +public class BlockMixin +{ + @Inject(method="onBreak", at=@At("HEAD")) + public void onBreak(World world, BlockPos pos, BlockState state, PlayerEntity player, CallbackInfoReturnable cir) + { + if (!state.isIn(BlockTags.PRESSURE_PLATES)) + { + return; + } + List entities = world.getEntitiesByClass(ArmorStandEntity.class, Box.of(pos.toBottomCenterPos(), 0.5, 0.5, 0.5), entity -> Objects.requireNonNullElse(entity.get(DataComponentTypes.CUSTOM_DATA), NbtComponent.DEFAULT).copyNbt().getBoolean("isPlaceholder", false)); + entities.forEach(Entity::discard); + } +} diff --git a/src/main/java/com/kasetoatz/stasisrods/mixin/EntityMixin.java b/src/main/java/com/kasetoatz/stasisrods/mixin/EntityMixin.java new file mode 100644 index 0000000..9c5f5e5 --- /dev/null +++ b/src/main/java/com/kasetoatz/stasisrods/mixin/EntityMixin.java @@ -0,0 +1,29 @@ +package com.kasetoatz.stasisrods.mixin; + +import net.minecraft.entity.Entity; +import net.minecraft.entity.ItemEntity; +import net.minecraft.item.Items; +import net.minecraft.world.World; +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.Inject; +import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; + +import static com.kasetoatz.stasisrods.util.Util.tryDiscardPlaceholder; + +@Mixin(Entity.class) +public abstract class EntityMixin +{ + @Shadow public abstract World getEntityWorld(); + + @Inject(method="discard", at=@At("HEAD")) + public void discard(CallbackInfo ci) + { + Entity entity = (Entity)(Object)this; + if (entity instanceof ItemEntity item && item.getStack().getItem() == Items.FISHING_ROD) + { + tryDiscardPlaceholder(item.getStack(), getEntityWorld().getServer()); + } + } +} diff --git a/src/main/java/com/kasetoatz/stasisrods/util/Util.java b/src/main/java/com/kasetoatz/stasisrods/util/Util.java index f814b95..6a898e1 100644 --- a/src/main/java/com/kasetoatz/stasisrods/util/Util.java +++ b/src/main/java/com/kasetoatz/stasisrods/util/Util.java @@ -50,6 +50,7 @@ public class Util public static ArmorStandEntity spawnPlaceholder(World world, Vec3d pos) { ArmorStandEntity placeholder = new ArmorStandEntity(world, pos.getX(), pos.getY(), pos.getZ()); + placeholder.setComponent(DataComponentTypes.CUSTOM_DATA, NbtComponent.DEFAULT.apply(nbt -> nbt.putBoolean("isPlaceholder", true))); placeholder.setHideBasePlate(true); placeholder.setInvisible(true); placeholder.setInvulnerable(true); diff --git a/src/main/resources/stasisrods.mixins.json b/src/main/resources/stasisrods.mixins.json index 1473fd8..ae684e4 100644 --- a/src/main/resources/stasisrods.mixins.json +++ b/src/main/resources/stasisrods.mixins.json @@ -4,6 +4,8 @@ "package": "com.kasetoatz.stasisrods.mixin", "compatibilityLevel": "JAVA_21", "mixins": [ + "BlockMixin", + "EntityMixin", "FishingRodItemMixin" ], "client": [