diff --git a/gradle.properties b/gradle.properties index 0ddbc52..f5d3061 100644 --- a/gradle.properties +++ b/gradle.properties @@ -9,7 +9,7 @@ yarn_mappings=1.20.2+build.4 loader_version=0.14.24 # Mod Properties -mod_version=1.0.0 +mod_version=1.1.1 maven_group=ru.octol1ttle.knockdowns archives_base_name=knockdowns diff --git a/src/client/java/ru/octol1ttle/knockdowns/KnockdownsClient.java b/src/client/java/ru/octol1ttle/knockdowns/KnockdownsClient.java index 889224a..25ff0de 100644 --- a/src/client/java/ru/octol1ttle/knockdowns/KnockdownsClient.java +++ b/src/client/java/ru/octol1ttle/knockdowns/KnockdownsClient.java @@ -81,7 +81,7 @@ public class KnockdownsClient implements ClientModInitializer { PacketByteBuf buf = PacketByteBufs.create(); buf.writeUuid(entity.getUuid()); - ClientPlayNetworking.send(KnockdownsNetworkingConstants.C2S_REQUEST_PLAYER_KNOCKED_DOWN, buf); + ClientPlayNetworking.send(KnockdownsNetworkingConstants.C2S_REQUEST_PLAYER_KNOCKED_DOWN, PacketByteBufs.copy(buf)); ClientPlayNetworking.send(KnockdownsNetworkingConstants.C2S_REQUEST_PLAYER_REVIVING, buf); } }); diff --git a/src/main/java/ru/octol1ttle/knockdowns/Knockdowns.java b/src/main/java/ru/octol1ttle/knockdowns/Knockdowns.java index 39c228f..a59282c 100644 --- a/src/main/java/ru/octol1ttle/knockdowns/Knockdowns.java +++ b/src/main/java/ru/octol1ttle/knockdowns/Knockdowns.java @@ -25,6 +25,7 @@ import net.minecraft.util.ActionResult; import net.minecraft.util.Hand; import net.minecraft.util.Identifier; import net.minecraft.util.TypedActionResult; +import net.minecraft.world.GameRules; import ru.octol1ttle.knockdowns.api.IKnockableDown; import ru.octol1ttle.knockdowns.network.KnockdownsNetworkingConstants; @@ -54,13 +55,18 @@ public class Knockdowns implements ModInitializer { return true; } + ServerPlayerEntity serverPlayer = (ServerPlayerEntity) entity; // TODO: timer + if (!serverPlayer.getWorld().getGameRules().getBoolean(GameRules.KEEP_INVENTORY)) { + serverPlayer.getInventory().dropAll(); + } entity.setHealth(1.0f); entity.setInvulnerable(true); entity.setGlowing(true); entity.setAir(entity.getMaxAir()); - entity.setFireTicks(0); + entity.extinguish(); entity.setFrozenTicks(0); + entity.setOnFire(false); entity.clearStatusEffects(); knockableDown.knockdowns$setKnockedDown(true); @@ -69,8 +75,6 @@ public class Knockdowns implements ModInitializer { buf.writeUuid(entity.getUuid()); buf.writeBoolean(true); - ServerPlayerEntity serverPlayer = (ServerPlayerEntity) entity; - ServerPlayNetworking.send(serverPlayer, KnockdownsNetworkingConstants.S2C_SEND_PLAYER_KNOCKED_DOWN, buf); for (ServerPlayerEntity player : PlayerLookup.tracking(entity)) { ServerPlayNetworking.send(player, KnockdownsNetworkingConstants.S2C_SEND_PLAYER_KNOCKED_DOWN, buf); 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;