diff --git a/src/main/kotlin/ru/dbotthepony/mc/otm/capability/MatteryPlayerCapability.kt b/src/main/kotlin/ru/dbotthepony/mc/otm/capability/MatteryPlayerCapability.kt index fcd6c734b..c11d81a68 100644 --- a/src/main/kotlin/ru/dbotthepony/mc/otm/capability/MatteryPlayerCapability.kt +++ b/src/main/kotlin/ru/dbotthepony/mc/otm/capability/MatteryPlayerCapability.kt @@ -12,7 +12,10 @@ import net.minecraft.server.level.ServerPlayer import net.minecraft.tags.TagKey import net.minecraft.world.Difficulty import net.minecraft.world.effect.MobEffect +import net.minecraft.world.effect.MobEffectInstance +import net.minecraft.world.effect.MobEffects import net.minecraft.world.entity.Entity +import net.minecraft.world.entity.LivingEntity import net.minecraft.world.entity.MobSpawnType import net.minecraft.world.entity.boss.wither.WitherBoss import net.minecraft.world.entity.monster.Phantom @@ -1259,6 +1262,26 @@ class MatteryPlayerCapability(val ply: Player) : ICapabilityProvider, INBTSerial } } + /** + * hooked into LivingEntity through coremod script + */ + @JvmStatic + fun addEatEffectHook(iterator: Iterator>, entity: LivingEntity): Iterator> { + if (entity !is Player) { + return iterator + } + + val mattery = entity.matteryPlayer ?: return iterator + + if (mattery.isAndroid) { + return iterator.filter { + it.first.effect != MobEffects.HUNGER + } + } + + return iterator + } + /** * this method is hooked through coremod transformer */ diff --git a/src/main/resources/coremods/code_injector.js b/src/main/resources/coremods/code_injector.js index 040e5eacf..78cb5895f 100644 --- a/src/main/resources/coremods/code_injector.js +++ b/src/main/resources/coremods/code_injector.js @@ -599,6 +599,28 @@ function initializeCoreMod() { return node }), + 'LivingEntity#addEatEffect patch for androids': method('net.minecraft.world.entity.LivingEntity.m_21063_(Lnet/minecraft/world/item/ItemStack;Lnet/minecraft/world/level/Level;Lnet/minecraft/world/entity/LivingEntity;)V', function(node) { + for (var i = 0; i < node.instructions.size(); i++) { + var instr = node.instructions.get(i) + + if (instr.getOpcode() == opcodesRemapped.invokeinterface && instr.name == "iterator") { + putInstructions(node, node.instructions.get(i), [ + new VarInsnNode(opcodesRemapped.aload, 0), + new MethodInsnNode( + opcodesRemapped.invokestatic, + 'ru/dbotthepony/mc/otm/capability/MatteryPlayerCapability', + 'addEatEffectHook', + '(Ljava/util/Iterator;Lnet/minecraft/world/entity/LivingEntity;)Ljava/util/Iterator;' + ), + ]) + + return node + } + } + + return node + }), + 'Inventory#dropAll': injectAtTail( 'net.minecraft.world.entity.player.Inventory.m_36071_()V', [