From 4fa4f50d8a35999784f6ff54eb6f15f18678a8f3 Mon Sep 17 00:00:00 2001 From: Nan1t Date: Sat, 28 Nov 2020 10:52:22 +0200 Subject: [PATCH] Added gamemode switching in config. Sending player abilities packet to disable flying in spectator mode --- build.gradle | 2 +- .../limbo/configuration/LimboConfig.java | 6 ++++ .../limbo/connection/ClientConnection.java | 11 +++++-- .../packets/play/PacketPlayerAbilities.java | 31 +++++++++++++++++++ .../nanit/limbo/protocol/registry/State.java | 1 + src/main/resources/settings.yml | 7 +++++ 6 files changed, 55 insertions(+), 3 deletions(-) create mode 100644 src/main/java/ru/nanit/limbo/protocol/packets/play/PacketPlayerAbilities.java diff --git a/build.gradle b/build.gradle index 8ab354a..d3f24ce 100644 --- a/build.gradle +++ b/build.gradle @@ -4,7 +4,7 @@ plugins { } group 'ru.nanit' -version '1.0' +version '1.1' repositories { mavenCentral() diff --git a/src/main/java/ru/nanit/limbo/configuration/LimboConfig.java b/src/main/java/ru/nanit/limbo/configuration/LimboConfig.java index 9fe0096..d64daab 100644 --- a/src/main/java/ru/nanit/limbo/configuration/LimboConfig.java +++ b/src/main/java/ru/nanit/limbo/configuration/LimboConfig.java @@ -19,6 +19,7 @@ public final class LimboConfig { private String dimensionType; private Position spawnPosition; + private int gameMode; private boolean useJoinMessage; private boolean useBossBar; @@ -45,6 +46,7 @@ public final class LimboConfig { pingData = conf.getNode("ping").getValue(PingData.class); dimensionType = conf.getNode("dimension").getString(); spawnPosition = conf.getNode("spawnPosition").getValue(Position.class); + gameMode = conf.getNode("gameMode").getInt(); useJoinMessage = conf.getNode("joinMessage", "enable").getBoolean(); useBossBar = conf.getNode("bossBar", "enable").getBoolean(); @@ -79,6 +81,10 @@ public final class LimboConfig { return spawnPosition; } + public int getGameMode() { + return gameMode; + } + public InfoForwarding getInfoForwarding() { return infoForwarding; } diff --git a/src/main/java/ru/nanit/limbo/connection/ClientConnection.java b/src/main/java/ru/nanit/limbo/connection/ClientConnection.java index 4cbf956..078c360 100644 --- a/src/main/java/ru/nanit/limbo/connection/ClientConnection.java +++ b/src/main/java/ru/nanit/limbo/connection/ClientConnection.java @@ -186,7 +186,7 @@ public class ClientConnection extends ChannelInboundHandlerAdapter { joinGame.setEntityId(0); joinGame.setEnableRespawnScreen(true); joinGame.setFlat(false); - joinGame.setGameMode(2); + joinGame.setGameMode(server.getConfig().getGameMode()); joinGame.setHardcore(false); joinGame.setMaxPlayers(server.getConfig().getMaxPlayers()); joinGame.setPreviousGameMode(-1); @@ -199,6 +199,12 @@ public class ClientConnection extends ChannelInboundHandlerAdapter { joinGame.setDimensionCodec(server.getDimensionRegistry().getCodec()); joinGame.setDimension(server.getDimensionRegistry().getDefaultDimension()); + PacketPlayerAbilities abilities = new PacketPlayerAbilities(); + + abilities.setFlyingSpeed(0.0F); + abilities.setFlags(0x02); + abilities.setFieldOfView(0.1F); + PacketPlayerPositionAndLook positionAndLook = new PacketPlayerPositionAndLook(); positionAndLook.setX(server.getConfig().getSpawnPosition().getX()); @@ -211,9 +217,10 @@ public class ClientConnection extends ChannelInboundHandlerAdapter { PacketPlayerInfo info = new PacketPlayerInfo(); info.setConnection(this); - info.setGameMode(2); + info.setGameMode(server.getConfig().getGameMode()); sendPacket(joinGame); + sendPacket(abilities); sendPacket(positionAndLook); sendPacket(info); diff --git a/src/main/java/ru/nanit/limbo/protocol/packets/play/PacketPlayerAbilities.java b/src/main/java/ru/nanit/limbo/protocol/packets/play/PacketPlayerAbilities.java new file mode 100644 index 0000000..d59a6c3 --- /dev/null +++ b/src/main/java/ru/nanit/limbo/protocol/packets/play/PacketPlayerAbilities.java @@ -0,0 +1,31 @@ +package ru.nanit.limbo.protocol.packets.play; + +import ru.nanit.limbo.protocol.ByteMessage; +import ru.nanit.limbo.protocol.PacketOut; + +public class PacketPlayerAbilities implements PacketOut { + + private int flags = 0x02; + private float flyingSpeed = 0.0F; + private float fieldOfView = 0.1F; + + public void setFlags(int flags) { + this.flags = flags; + } + + public void setFlyingSpeed(float flyingSpeed) { + this.flyingSpeed = flyingSpeed; + } + + public void setFieldOfView(float fieldOfView) { + this.fieldOfView = fieldOfView; + } + + @Override + public void encode(ByteMessage msg) { + msg.writeByte(flags); + msg.writeFloat(flyingSpeed); + msg.writeFloat(fieldOfView); + } + +} diff --git a/src/main/java/ru/nanit/limbo/protocol/registry/State.java b/src/main/java/ru/nanit/limbo/protocol/registry/State.java index 4bc20d2..3e6d81b 100644 --- a/src/main/java/ru/nanit/limbo/protocol/registry/State.java +++ b/src/main/java/ru/nanit/limbo/protocol/registry/State.java @@ -40,6 +40,7 @@ public enum State { { serverBound.register(0x10, PacketKeepAlive::new); clientBound.register(0x24, PacketJoinGame::new); + clientBound.register(0x30, PacketPlayerAbilities::new); clientBound.register(0x34, PacketPlayerPositionAndLook::new); clientBound.register(0x1F, PacketKeepAlive::new); clientBound.register(0x0E, PacketChatMessage::new); diff --git a/src/main/resources/settings.yml b/src/main/resources/settings.yml index 5e2a98f..e46ddf8 100644 --- a/src/main/resources/settings.yml +++ b/src/main/resources/settings.yml @@ -26,6 +26,13 @@ spawnPosition: yaw: 0.0 pitch: 0.0 +# Setup player's game mode +# 0 - Survival +# 1 - Creative (hide HP and food bar) +# 2 - Adventure +# 3 - Spectator (hide all UI bars) +gameMode: 1 + # Message sends when player join to server joinMessage: enable: true