|
| 1 | +package dev.isxander.debugify.mixins.basic.mc219981; |
| 2 | + |
| 3 | +import com.llamalad7.mixinextras.expression.Definition; |
| 4 | +import com.llamalad7.mixinextras.expression.Expression; |
| 5 | +import com.llamalad7.mixinextras.injector.wrapoperation.Operation; |
| 6 | +import com.llamalad7.mixinextras.injector.wrapoperation.WrapOperation; |
| 7 | +import dev.isxander.debugify.fixes.BugFix; |
| 8 | +import dev.isxander.debugify.fixes.FixCategory; |
| 9 | +import net.minecraft.world.entity.EntityType; |
| 10 | +import net.minecraft.world.entity.ai.attributes.AttributeInstance; |
| 11 | +import net.minecraft.world.entity.ai.attributes.AttributeModifier; |
| 12 | +import net.minecraft.world.entity.monster.Monster; |
| 13 | +import net.minecraft.world.entity.monster.Zombie; |
| 14 | +import net.minecraft.world.level.Level; |
| 15 | +import org.spongepowered.asm.mixin.Mixin; |
| 16 | +import org.spongepowered.asm.mixin.injection.At; |
| 17 | + |
| 18 | +@BugFix(id = "MC-219981", category = FixCategory.BASIC, env = BugFix.Env.SERVER, description = "If zombies spawned with max health over 20 (leader zombie bonus), they will have 20 health instead of their max health") |
| 19 | +@Mixin(Zombie.class) |
| 20 | +public class ZombieMixin extends Monster { |
| 21 | + protected ZombieMixin(EntityType<? extends Monster> entityType, Level level) { |
| 22 | + super(entityType, level); |
| 23 | + } |
| 24 | + |
| 25 | + @Definition(id = "getAttribute", method = "Lnet/minecraft/world/entity/monster/Zombie;getAttribute(Lnet/minecraft/core/Holder;)Lnet/minecraft/world/entity/ai/attributes/AttributeInstance;") |
| 26 | + @Definition(id = "MAX_HEALTH", field = "Lnet/minecraft/world/entity/ai/attributes/Attributes;MAX_HEALTH:Lnet/minecraft/core/Holder;") |
| 27 | + @Definition(id = "addOrReplacePermanentModifier", method = "Lnet/minecraft/world/entity/ai/attributes/AttributeInstance;addOrReplacePermanentModifier(Lnet/minecraft/world/entity/ai/attributes/AttributeModifier;)V") |
| 28 | + @Definition(id = "LEADER_ZOMBIE_BONUS_ID", field = "Lnet/minecraft/world/entity/monster/Zombie;LEADER_ZOMBIE_BONUS_ID:Lnet/minecraft/resources/ResourceLocation;") |
| 29 | + @Definition(id = "AttributeModifier", type = AttributeModifier.class) |
| 30 | + @Expression("this.getAttribute(MAX_HEALTH).addOrReplacePermanentModifier(new AttributeModifier(LEADER_ZOMBIE_BONUS_ID, ?, ?))") |
| 31 | + @WrapOperation(method = "handleAttributes", at = @At("MIXINEXTRAS:EXPRESSION")) |
| 32 | + private void fixLeaderZombieHealth(AttributeInstance instance, AttributeModifier modifier, Operation<Void> original) { |
| 33 | + float damageTaken = this.getMaxHealth() - this.getHealth(); |
| 34 | + |
| 35 | + // apply attribute, max health will increase |
| 36 | + original.call(instance, modifier); |
| 37 | + |
| 38 | + this.setHealth(this.getMaxHealth() - damageTaken); |
| 39 | + } |
| 40 | +} |
0 commit comments