fix: save KnockedDown state to player NBT

This commit is contained in:
Octol1ttle 2023-10-31 10:29:36 +05:00
parent 22a7d5b036
commit 430b79c162
Signed by: Octol1ttle
GPG key ID: B77C34313AEE1FFF

View file

@ -4,9 +4,12 @@ import com.llamalad7.mixinextras.injector.ModifyExpressionValue;
import com.llamalad7.mixinextras.injector.ModifyReturnValue; import com.llamalad7.mixinextras.injector.ModifyReturnValue;
import java.util.UUID; import java.util.UUID;
import net.minecraft.entity.player.PlayerEntity; import net.minecraft.entity.player.PlayerEntity;
import net.minecraft.nbt.NbtCompound;
import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.Mixin;
import org.spongepowered.asm.mixin.Unique; import org.spongepowered.asm.mixin.Unique;
import org.spongepowered.asm.mixin.injection.At; 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; import ru.octol1ttle.knockdowns.api.IKnockableDown;
@Mixin(PlayerEntity.class) @Mixin(PlayerEntity.class)
@ -15,11 +18,9 @@ public abstract class PlayerEntityMixin implements IKnockableDown {
private boolean knockedDown; private boolean knockedDown;
@Unique @Unique
private boolean beingRevived; private boolean beingRevived;
@Unique
private int reviveAt;
@ModifyExpressionValue(method = "updatePose", at = @At(value = "INVOKE", target = "Lnet/minecraft/entity/player/PlayerEntity;isSwimming()Z")) @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; PlayerEntity player = (PlayerEntity)(Object)this;
if (!(player instanceof IKnockableDown knockableDown)) { if (!(player instanceof IKnockableDown knockableDown)) {
throw new IllegalStateException(); throw new IllegalStateException();
@ -29,10 +30,20 @@ public abstract class PlayerEntityMixin implements IKnockableDown {
} }
@ModifyReturnValue(method = "canFoodHeal", at = @At("RETURN")) @ModifyReturnValue(method = "canFoodHeal", at = @At("RETURN"))
private boolean canFoodHeal(boolean original) { private boolean dontHealIfKnockedDown(boolean original) {
return original && !this.knockdowns$isKnockedDown(); 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 @Override
public boolean knockdowns$isKnockedDown() { public boolean knockdowns$isKnockedDown() {
return knockedDown; return knockedDown;