From 430b79c1620700063ef2935bc76ca710217015ee Mon Sep 17 00:00:00 2001 From: Octol1ttle Date: Tue, 31 Oct 2023 10:29:36 +0500 Subject: [PATCH] fix: save KnockedDown state to player NBT --- .../knockdowns/mixin/PlayerEntityMixin.java | 19 +++++++++++++++---- 1 file changed, 15 insertions(+), 4 deletions(-) diff --git a/src/main/java/ru/octol1ttle/knockdowns/mixin/PlayerEntityMixin.java b/src/main/java/ru/octol1ttle/knockdowns/mixin/PlayerEntityMixin.java index 28a70a1..3852bee 100644 --- a/src/main/java/ru/octol1ttle/knockdowns/mixin/PlayerEntityMixin.java +++ b/src/main/java/ru/octol1ttle/knockdowns/mixin/PlayerEntityMixin.java @@ -4,9 +4,12 @@ import com.llamalad7.mixinextras.injector.ModifyExpressionValue; import com.llamalad7.mixinextras.injector.ModifyReturnValue; import java.util.UUID; import net.minecraft.entity.player.PlayerEntity; +import net.minecraft.nbt.NbtCompound; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.Unique; import org.spongepowered.asm.mixin.injection.At; +import org.spongepowered.asm.mixin.injection.Inject; +import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; import ru.octol1ttle.knockdowns.api.IKnockableDown; @Mixin(PlayerEntity.class) @@ -15,11 +18,9 @@ public abstract class PlayerEntityMixin implements IKnockableDown { private boolean knockedDown; @Unique private boolean beingRevived; - @Unique - private int reviveAt; @ModifyExpressionValue(method = "updatePose", at = @At(value = "INVOKE", target = "Lnet/minecraft/entity/player/PlayerEntity;isSwimming()Z")) - private boolean isKnockedDown(boolean original) { + private boolean enterSwimmingIfKnockedDown(boolean original) { PlayerEntity player = (PlayerEntity)(Object)this; if (!(player instanceof IKnockableDown knockableDown)) { throw new IllegalStateException(); @@ -29,10 +30,20 @@ public abstract class PlayerEntityMixin implements IKnockableDown { } @ModifyReturnValue(method = "canFoodHeal", at = @At("RETURN")) - private boolean canFoodHeal(boolean original) { + private boolean dontHealIfKnockedDown(boolean original) { return original && !this.knockdowns$isKnockedDown(); } + @Inject(method = "readCustomDataFromNbt", at = @At("TAIL")) + public void readKnockedDownFromNbt(NbtCompound nbt, CallbackInfo ci) { + this.knockedDown = nbt.getBoolean("KnockedDown"); + } + + @Inject(method = "writeCustomDataToNbt", at = @At("TAIL")) + public void writeKnockedDownToNbt(NbtCompound nbt, CallbackInfo ci) { + nbt.putBoolean("KnockedDown", this.knockedDown); + } + @Override public boolean knockdowns$isKnockedDown() { return knockedDown;