diff --git a/src/main/java/com/legacyminecraft/poseidon/commands/FlyCommand.java b/src/main/java/com/legacyminecraft/poseidon/commands/FlyCommand.java index 37546e3..e540581 100644 --- a/src/main/java/com/legacyminecraft/poseidon/commands/FlyCommand.java +++ b/src/main/java/com/legacyminecraft/poseidon/commands/FlyCommand.java @@ -11,7 +11,7 @@ public class FlyCommand extends Command { public FlyCommand(String name) { super(name); - this.description = "Toggles the server-side flight check exemption for yourself"; + this.description = "Toggles server-side flight for yourself"; this.usageMessage = "/fly"; } @@ -31,10 +31,10 @@ public class FlyCommand extends Command { player.flightAllowed = !player.flightAllowed; if (player.flightAllowed) { - sender.sendMessage(ChatColor.GREEN + "Flight check exemption enabled."); - sender.sendMessage(ChatColor.YELLOW + "A compatible client-side flight mod is required to fly."); + sender.sendMessage(ChatColor.GREEN + "Flight enabled."); + sender.sendMessage(ChatColor.YELLOW + "Look up to rise, look down or sneak to descend."); } else { - sender.sendMessage(ChatColor.YELLOW + "Flight check exemption disabled."); + sender.sendMessage(ChatColor.YELLOW + "Flight disabled."); } return true; diff --git a/src/main/java/net/minecraft/server/NetServerHandler.java b/src/main/java/net/minecraft/server/NetServerHandler.java index a228d34..c4284d9 100644 --- a/src/main/java/net/minecraft/server/NetServerHandler.java +++ b/src/main/java/net/minecraft/server/NetServerHandler.java @@ -187,6 +187,7 @@ public class NetServerHandler extends NetHandler implements ICommandListener { return; WorldServer worldserver = this.minecraftServer.getWorldServer(this.player.dimension); + boolean serverFlight = this.applyServerFlight(packet10flying); this.i = true; double d0; @@ -441,9 +442,42 @@ public class NetServerHandler extends NetHandler implements ICommandListener { this.player.onGround = packet10flying.g; this.minecraftServer.serverConfigurationManager.d(this.player); this.player.b(this.player.locY - d0, packet10flying.g); + + // A Beta client has no flight-ability packet. Keep its local position in + // sync with the server-controlled vertical movement while flying. + if (serverFlight) { + this.player.fallDistance = 0.0F; + this.sendPacket(new Packet13PlayerLookMove(this.player.locX, this.player.locY + 1.6200000047683716D, this.player.locY, this.player.locZ, this.player.yaw, this.player.pitch, false)); + } } } + /** + * Converts a normal Beta movement packet into server-side flight movement. + * Looking up rises, looking down descends, and sneaking always descends. + * The client still supplies horizontal movement, so its normal movement keys + * continue to work without a modified client. + */ + private boolean applyServerFlight(Packet10Flying packet10flying) { + if (!this.player.flightAllowed || !packet10flying.h || this.player.vehicle != null || this.player.isSleeping()) { + return false; + } + + double verticalSpeed = 0.0D; + if (this.player.isSneaking() || packet10flying.pitch > 25.0F) { + verticalSpeed = -0.32D; + } else if (packet10flying.pitch < -25.0F) { + verticalSpeed = 0.32D; + } + + packet10flying.y = this.player.locY + verticalSpeed; + packet10flying.stance = packet10flying.y + 1.6200000047683716D; + packet10flying.g = false; + this.player.motY = 0.0D; + this.player.fallDistance = 0.0F; + return true; + } + public void a(double d0, double d1, double d2, float f, float f1) { // CraftBukkit start - Delegate to teleport(Location) Player player = this.getPlayer(); diff --git a/target/classes/com/legacyminecraft/poseidon/commands/FlyCommand.class b/target/classes/com/legacyminecraft/poseidon/commands/FlyCommand.class index fca20d7..e76ad69 100644 Binary files a/target/classes/com/legacyminecraft/poseidon/commands/FlyCommand.class and b/target/classes/com/legacyminecraft/poseidon/commands/FlyCommand.class differ diff --git a/target/classes/net/minecraft/server/NetServerHandler.class b/target/classes/net/minecraft/server/NetServerHandler.class index 8e78bdb..ca35f1b 100644 Binary files a/target/classes/net/minecraft/server/NetServerHandler.class and b/target/classes/net/minecraft/server/NetServerHandler.class differ diff --git a/target/original-poseidon-craftbukkit-1.0.0.jar b/target/original-poseidon-craftbukkit-1.0.0.jar index 5b4224e..0b503f0 100644 Binary files a/target/original-poseidon-craftbukkit-1.0.0.jar and b/target/original-poseidon-craftbukkit-1.0.0.jar differ diff --git a/target/poseidon-craftbukkit-1.0.0.jar b/target/poseidon-craftbukkit-1.0.0.jar index 456dd2b..8f06b7e 100644 Binary files a/target/poseidon-craftbukkit-1.0.0.jar and b/target/poseidon-craftbukkit-1.0.0.jar differ