From 9a7594b43abdd0d6a83326ab5f53b8baf756a3ee Mon Sep 17 00:00:00 2001 From: Anhgelus Morhtuuzh Date: Mon, 13 Oct 2025 11:18:54 +0200 Subject: feat(hearts): disable store hearts in ec --- README.md | 5 ++++- .../java/world/anhgelus/lifesteal/LifeSteal.java | 8 ++++++++ .../anhgelus/lifesteal/mixin/InventoryMixin.java | 22 ++++++++++++++++++++++ src/main/resources/lifesteal.mixins.json | 1 + 4 files changed, 35 insertions(+), 1 deletion(-) create mode 100644 src/main/java/world/anhgelus/lifesteal/mixin/InventoryMixin.java diff --git a/README.md b/README.md index 807c42c..e187771 100644 --- a/README.md +++ b/README.md @@ -10,4 +10,7 @@ A player in the grace period cannot be attacked and cannot attack others. The time (in minutes) of the grace period can be set via the gamerule `lifesteal:gracePeriod` (default: 30). Hearts cannot be crafted by a player at/above 10 hearts. -You can enable this via the gamerule `lifesteal:canCraftHeartsAboveVanillaMax` (default: false). \ No newline at end of file +You can disable this via the gamerule `lifesteal:canCraftHeartsAboveVanillaMax` (default: false). + +Hearts cannot be stored in ender chests. +You can disable this via the gamerule `lifesteal:canStoreHeartsInEC` (default: false). \ No newline at end of file diff --git a/src/main/java/world/anhgelus/lifesteal/LifeSteal.java b/src/main/java/world/anhgelus/lifesteal/LifeSteal.java index f5f8892..d495792 100644 --- a/src/main/java/world/anhgelus/lifesteal/LifeSteal.java +++ b/src/main/java/world/anhgelus/lifesteal/LifeSteal.java @@ -55,6 +55,14 @@ public class LifeSteal implements ModInitializer { CAN_CRAFT_HEARTS_ABOVE_VANILLA_MAX = rule.get(); }) ); + public static boolean CAN_STORE_HEARTS_IN_EC = false; + public static final GameRules.Key RULE_CAN_STORE_HEARTS_EC = GameRuleRegistry.register( + MOD_ID + ":canStoreHeartsInEC", + GameRules.Category.MISC, + GameRuleFactory.createBooleanRule(CAN_STORE_HEARTS_IN_EC, (server, rule) -> { + CAN_STORE_HEARTS_IN_EC = rule.get(); + }) + ); @Override public void onInitialize() { diff --git a/src/main/java/world/anhgelus/lifesteal/mixin/InventoryMixin.java b/src/main/java/world/anhgelus/lifesteal/mixin/InventoryMixin.java new file mode 100644 index 0000000..6d2715b --- /dev/null +++ b/src/main/java/world/anhgelus/lifesteal/mixin/InventoryMixin.java @@ -0,0 +1,22 @@ +package world.anhgelus.lifesteal.mixin; + +import net.minecraft.inventory.EnderChestInventory; +import net.minecraft.inventory.SimpleInventory; +import net.minecraft.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; +import world.anhgelus.lifesteal.LifeSteal; +import world.anhgelus.lifesteal.LifeStealer; + +@Mixin(SimpleInventory.class) +public class InventoryMixin { + @Inject(at = @At(value = "HEAD"), method = "addStack", cancellable = true) + public void add(ItemStack is, CallbackInfoReturnable cir) { + if (LifeSteal.CAN_STORE_HEARTS_IN_EC) return; + final var inv = (SimpleInventory) (Object) this; + if (!(inv instanceof EnderChestInventory)) return; + if (LifeStealer.Manager.validHeart(is)) cir.setReturnValue(ItemStack.EMPTY); + } +} diff --git a/src/main/resources/lifesteal.mixins.json b/src/main/resources/lifesteal.mixins.json index 8e95873..59afe34 100644 --- a/src/main/resources/lifesteal.mixins.json +++ b/src/main/resources/lifesteal.mixins.json @@ -4,6 +4,7 @@ "package": "world.anhgelus.lifesteal.mixin", "compatibilityLevel": "JAVA_21", "mixins": [ + "InventoryMixin", "ItemMixin" ], "injectors": { -- cgit v1.2.3