From cbea81f9ce47f3c063338f00943a75b4a5cc7fda Mon Sep 17 00:00:00 2001 From: Ryan Fox Date: Wed, 28 Oct 2020 00:24:51 +0000 Subject: [PATCH] Add persistent flight When a player disconnects while flying in survival mode, they will plummet to their deaths while reconnecting. These changes prevent that. If a player is currently flying, their flight will not be disabled unless the setGameMode method is called in the ServerPlayerEntity, which is how the GameMode is usually set. Since the GameMode is initially set using the interaction manager instead, players should be safe. :-) --- .../party/_2a03/mc/mixin/MixinGameMode.java | 32 +++++++++++++++++++ .../mc/mixin/MixinServerPlayerEntity.java | 9 ++++++ .../minecraft-tweaks-2a03.mixins.json | 1 + 3 files changed, 42 insertions(+) create mode 100644 src/main/java/party/_2a03/mc/mixin/MixinGameMode.java diff --git a/src/main/java/party/_2a03/mc/mixin/MixinGameMode.java b/src/main/java/party/_2a03/mc/mixin/MixinGameMode.java new file mode 100644 index 0000000..d966c46 --- /dev/null +++ b/src/main/java/party/_2a03/mc/mixin/MixinGameMode.java @@ -0,0 +1,32 @@ +package party._2a03.mc.mixin; + +import net.minecraft.entity.player.PlayerAbilities; +import net.minecraft.world.GameMode; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.Shadow; +import org.spongepowered.asm.mixin.injection.At; +import org.spongepowered.asm.mixin.injection.Inject; +import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; +import party._2a03.mc.util.Config; + +@Mixin(GameMode.class) +public class MixinGameMode { + private boolean flying; + + @Inject(method = "setAbilities", at = @At("HEAD")) + public void checkFlight(PlayerAbilities abilities, CallbackInfo ci) { + this.flying = abilities.flying; + } + + @Inject(method = "setAbilities", at = @At("TAIL")) + public void restoreFlight(PlayerAbilities abilities, CallbackInfo ci) { + if (!Config.getBool("persistentFlight")) + return; + if (abilities.flying) + return; + if (this.flying) { + abilities.allowFlying = true; + abilities.flying = true; + } + } +} diff --git a/src/main/java/party/_2a03/mc/mixin/MixinServerPlayerEntity.java b/src/main/java/party/_2a03/mc/mixin/MixinServerPlayerEntity.java index 78e2af9..289b0e2 100644 --- a/src/main/java/party/_2a03/mc/mixin/MixinServerPlayerEntity.java +++ b/src/main/java/party/_2a03/mc/mixin/MixinServerPlayerEntity.java @@ -3,6 +3,7 @@ package party._2a03.mc.mixin; import net.minecraft.entity.player.PlayerEntity; import net.minecraft.server.network.ServerPlayerEntity; import net.minecraft.util.registry.RegistryKey; +import net.minecraft.world.GameMode; import net.minecraft.world.World; import org.spongepowered.asm.mixin.injection.At; import org.spongepowered.asm.mixin.injection.Inject; @@ -29,4 +30,12 @@ public abstract class MixinServerPlayerEntity extends PlayerEntity { ci.cancel(); } } + + @Inject(method = "setGameMode", at = @At(value = "INVOKE", target = "Lnet/minecraft/server/network/ServerPlayerEntity;sendAbilitiesUpdate()V")) + public void disableFlightIfSafe(GameMode gameMode, CallbackInfo ci) { + if (gameMode != GameMode.CREATIVE && gameMode != GameMode.SPECTATOR) { + this.abilities.allowFlying = false; + this.abilities.flying = false; + } + } } diff --git a/src/main/resources/minecraft-tweaks-2a03.mixins.json b/src/main/resources/minecraft-tweaks-2a03.mixins.json index 332c58a..f026041 100644 --- a/src/main/resources/minecraft-tweaks-2a03.mixins.json +++ b/src/main/resources/minecraft-tweaks-2a03.mixins.json @@ -3,6 +3,7 @@ "package": "party._2a03.mc.mixin", "compatibilityLevel": "JAVA_8", "server": [ + "MixinGameMode", "MixinGameModeCommand", "MixinRespawnAnchorBlock", "MixinServerPlayerEntity",