From f3dbd8b9278f7b8738d9e002bd8e09c4ab3e419a Mon Sep 17 00:00:00 2001 From: Bixilon Date: Mon, 22 Jun 2020 20:05:04 +0200 Subject: [PATCH] fix many bugs in 1.8 (also in compression), more 1.8 wip --- .../datatypes/entities/objects/Arrow.java | 3 +- .../game/datatypes/entities/objects/Boat.java | 3 +- .../game/datatypes/entities/objects/Egg.java | 3 +- .../entities/objects/EnderCrystal.java | 3 +- .../entities/objects/Enderpearl.java | 3 +- .../entities/objects/EyeOfEnder.java | 3 +- .../entities/objects/FallingBlock.java | 3 +- .../entities/objects/FallingDragonEgg.java | 3 +- .../datatypes/entities/objects/FireBall.java | 3 +- .../entities/objects/FireCharge.java | 3 +- .../datatypes/entities/objects/Firework.java | 3 +- .../entities/objects/FishingFloat.java | 3 +- .../datatypes/entities/objects/ItemFrame.java | 3 +- .../datatypes/entities/objects/ItemStack.java | 3 +- .../datatypes/entities/objects/LeashKnot.java | 3 +- .../datatypes/entities/objects/Minecart.java | 3 +- .../datatypes/entities/objects/PrimedTNT.java | 3 +- .../datatypes/entities/objects/Snowball.java | 3 +- .../entities/objects/ThrownExpBottle.java | 3 +- .../entities/objects/ThrownPotion.java | 3 +- .../entities/objects/WitherSkull.java | 3 +- .../channels/PluginChannelHandler.java | 5 ++ .../minosoft/protocol/network/Connection.java | 21 +++++--- .../minosoft/protocol/network/Network.java | 7 ++- .../play/PacketPlayerAbilitiesReceiving.java | 14 ++++-- .../play/PacketScoreboardTeams.java | 31 ++++++++---- .../play/PacketServerDifficulty.java | 49 +++++++++++++++++++ .../clientbound/play/PacketSpawnObject.java | 13 +++-- .../play/PacketPlayerAbilitiesSending.java | 3 +- .../protocol/protocol/OutPacketBuffer.java | 10 ++-- .../protocol/protocol/PacketHandler.java | 3 ++ .../minosoft/protocol/protocol/Protocol.java | 1 + 32 files changed, 147 insertions(+), 73 deletions(-) create mode 100644 src/main/java/de/bixilon/minosoft/protocol/packets/clientbound/play/PacketServerDifficulty.java diff --git a/src/main/java/de/bixilon/minosoft/game/datatypes/entities/objects/Arrow.java b/src/main/java/de/bixilon/minosoft/game/datatypes/entities/objects/Arrow.java index 12de2e613..355a2b6ec 100644 --- a/src/main/java/de/bixilon/minosoft/game/datatypes/entities/objects/Arrow.java +++ b/src/main/java/de/bixilon/minosoft/game/datatypes/entities/objects/Arrow.java @@ -27,10 +27,9 @@ public class Arrow extends EntityObject implements ObjectInterface { this.shooter = additionalInt; } - public Arrow(int id, Location location, short yaw, short pitch, int additionalInt, Velocity velocity, EntityMetaData metaData) { + public Arrow(int id, Location location, short yaw, short pitch, int additionalInt, Velocity velocity) { super(id, location, yaw, pitch, velocity); this.shooter = additionalInt; - this.metaData = (ArrowMetaData) metaData; } @Override diff --git a/src/main/java/de/bixilon/minosoft/game/datatypes/entities/objects/Boat.java b/src/main/java/de/bixilon/minosoft/game/datatypes/entities/objects/Boat.java index c74844fad..dce844d98 100644 --- a/src/main/java/de/bixilon/minosoft/game/datatypes/entities/objects/Boat.java +++ b/src/main/java/de/bixilon/minosoft/game/datatypes/entities/objects/Boat.java @@ -26,9 +26,8 @@ public class Boat extends EntityObject implements ObjectInterface { // boat does not have any additional info } - public Boat(int id, Location location, short yaw, short pitch, int additionalInt, Velocity velocity, EntityMetaData metaData) { + public Boat(int id, Location location, short yaw, short pitch, int additionalInt, Velocity velocity) { super(id, location, yaw, pitch, velocity); - this.metaData = (BoatMetaData) metaData; } @Override diff --git a/src/main/java/de/bixilon/minosoft/game/datatypes/entities/objects/Egg.java b/src/main/java/de/bixilon/minosoft/game/datatypes/entities/objects/Egg.java index 611559664..644592446 100644 --- a/src/main/java/de/bixilon/minosoft/game/datatypes/entities/objects/Egg.java +++ b/src/main/java/de/bixilon/minosoft/game/datatypes/entities/objects/Egg.java @@ -26,10 +26,9 @@ public class Egg extends EntityObject implements ObjectInterface { this.thrower = additionalInt; } - public Egg(int id, Location location, short yaw, short pitch, int additionalInt, Velocity velocity, EntityMetaData metaData) { + public Egg(int id, Location location, short yaw, short pitch, int additionalInt, Velocity velocity) { super(id, location, yaw, pitch, velocity); this.thrower = additionalInt; - this.metaData = metaData; } @Override diff --git a/src/main/java/de/bixilon/minosoft/game/datatypes/entities/objects/EnderCrystal.java b/src/main/java/de/bixilon/minosoft/game/datatypes/entities/objects/EnderCrystal.java index a8e5a2811..d5d238cc2 100644 --- a/src/main/java/de/bixilon/minosoft/game/datatypes/entities/objects/EnderCrystal.java +++ b/src/main/java/de/bixilon/minosoft/game/datatypes/entities/objects/EnderCrystal.java @@ -25,9 +25,8 @@ public class EnderCrystal extends EntityObject implements ObjectInterface { // objects do not spawn with metadata... reading additional info from the following int } - public EnderCrystal(int id, Location location, short yaw, short pitch, int additionalInt, Velocity velocity, EntityMetaData metaData) { + public EnderCrystal(int id, Location location, short yaw, short pitch, int additionalInt, Velocity velocity) { super(id, location, yaw, pitch, velocity); - this.metaData = (EnderCrystalMetaData) metaData; } @Override diff --git a/src/main/java/de/bixilon/minosoft/game/datatypes/entities/objects/Enderpearl.java b/src/main/java/de/bixilon/minosoft/game/datatypes/entities/objects/Enderpearl.java index b5d6ca2ad..5a7d817af 100644 --- a/src/main/java/de/bixilon/minosoft/game/datatypes/entities/objects/Enderpearl.java +++ b/src/main/java/de/bixilon/minosoft/game/datatypes/entities/objects/Enderpearl.java @@ -24,9 +24,8 @@ public class Enderpearl extends EntityObject implements ObjectInterface { // objects do not spawn with metadata... reading additional info from the following int } - public Enderpearl(int id, Location location, short yaw, short pitch, int additionalInt, Velocity velocity, EntityMetaData metaData) { + public Enderpearl(int id, Location location, short yaw, short pitch, int additionalInt, Velocity velocity) { super(id, location, yaw, pitch, velocity); - this.metaData = metaData; } @Override diff --git a/src/main/java/de/bixilon/minosoft/game/datatypes/entities/objects/EyeOfEnder.java b/src/main/java/de/bixilon/minosoft/game/datatypes/entities/objects/EyeOfEnder.java index 2fbf14580..541047523 100644 --- a/src/main/java/de/bixilon/minosoft/game/datatypes/entities/objects/EyeOfEnder.java +++ b/src/main/java/de/bixilon/minosoft/game/datatypes/entities/objects/EyeOfEnder.java @@ -24,9 +24,8 @@ public class EyeOfEnder extends EntityObject implements ObjectInterface { // objects do not spawn with metadata... reading additional info from the following int } - public EyeOfEnder(int id, Location location, short yaw, short pitch, int additionalInt, Velocity velocity, EntityMetaData metaData) { + public EyeOfEnder(int id, Location location, short yaw, short pitch, int additionalInt, Velocity velocity) { super(id, location, yaw, pitch, velocity); - this.metaData = metaData; } @Override diff --git a/src/main/java/de/bixilon/minosoft/game/datatypes/entities/objects/FallingBlock.java b/src/main/java/de/bixilon/minosoft/game/datatypes/entities/objects/FallingBlock.java index 7531e6cba..8f6238a97 100644 --- a/src/main/java/de/bixilon/minosoft/game/datatypes/entities/objects/FallingBlock.java +++ b/src/main/java/de/bixilon/minosoft/game/datatypes/entities/objects/FallingBlock.java @@ -27,10 +27,9 @@ public class FallingBlock extends EntityObject implements ObjectInterface { block = Blocks.byLegacy(additionalInt & 0xFFF, additionalInt >> 12); } - public FallingBlock(int id, Location location, short yaw, short pitch, int additionalInt, Velocity velocity, EntityMetaData metaData) { + public FallingBlock(int id, Location location, short yaw, short pitch, int additionalInt, Velocity velocity) { super(id, location, yaw, pitch, velocity); block = Blocks.byLegacy(additionalInt & 0xFFF, additionalInt >> 12); - this.metaData = metaData; } @Override diff --git a/src/main/java/de/bixilon/minosoft/game/datatypes/entities/objects/FallingDragonEgg.java b/src/main/java/de/bixilon/minosoft/game/datatypes/entities/objects/FallingDragonEgg.java index 43911e728..0c3ea1283 100644 --- a/src/main/java/de/bixilon/minosoft/game/datatypes/entities/objects/FallingDragonEgg.java +++ b/src/main/java/de/bixilon/minosoft/game/datatypes/entities/objects/FallingDragonEgg.java @@ -24,9 +24,8 @@ public class FallingDragonEgg extends EntityObject implements ObjectInterface { // objects do not spawn with metadata... reading additional info from the following int } - public FallingDragonEgg(int id, Location location, short yaw, short pitch, int additionalInt, Velocity velocity, EntityMetaData metaData) { + public FallingDragonEgg(int id, Location location, short yaw, short pitch, int additionalInt, Velocity velocity) { super(id, location, yaw, pitch, velocity); - this.metaData = metaData; } @Override diff --git a/src/main/java/de/bixilon/minosoft/game/datatypes/entities/objects/FireBall.java b/src/main/java/de/bixilon/minosoft/game/datatypes/entities/objects/FireBall.java index 33abf94b8..af192bfd0 100644 --- a/src/main/java/de/bixilon/minosoft/game/datatypes/entities/objects/FireBall.java +++ b/src/main/java/de/bixilon/minosoft/game/datatypes/entities/objects/FireBall.java @@ -26,10 +26,9 @@ public class FireBall extends EntityObject implements ObjectInterface { this.thrower = additionalInt; } - public FireBall(int id, Location location, short yaw, short pitch, int additionalInt, Velocity velocity, EntityMetaData metaData) { + public FireBall(int id, Location location, short yaw, short pitch, int additionalInt, Velocity velocity) { super(id, location, yaw, pitch, velocity); this.thrower = additionalInt; - this.metaData = metaData; } @Override diff --git a/src/main/java/de/bixilon/minosoft/game/datatypes/entities/objects/FireCharge.java b/src/main/java/de/bixilon/minosoft/game/datatypes/entities/objects/FireCharge.java index 4f5e1cd25..92c2f3569 100644 --- a/src/main/java/de/bixilon/minosoft/game/datatypes/entities/objects/FireCharge.java +++ b/src/main/java/de/bixilon/minosoft/game/datatypes/entities/objects/FireCharge.java @@ -26,10 +26,9 @@ public class FireCharge extends EntityObject implements ObjectInterface { this.thrower = additionalInt; } - public FireCharge(int id, Location location, short yaw, short pitch, int additionalInt, Velocity velocity, EntityMetaData metaData) { + public FireCharge(int id, Location location, short yaw, short pitch, int additionalInt, Velocity velocity) { super(id, location, yaw, pitch, velocity); this.thrower = additionalInt; - this.metaData = metaData; } @Override diff --git a/src/main/java/de/bixilon/minosoft/game/datatypes/entities/objects/Firework.java b/src/main/java/de/bixilon/minosoft/game/datatypes/entities/objects/Firework.java index 7ee5ee4c7..2b5cce017 100644 --- a/src/main/java/de/bixilon/minosoft/game/datatypes/entities/objects/Firework.java +++ b/src/main/java/de/bixilon/minosoft/game/datatypes/entities/objects/Firework.java @@ -25,9 +25,8 @@ public class Firework extends EntityObject implements ObjectInterface { // objects do not spawn with metadata... reading additional info from the following int } - public Firework(int id, Location location, short yaw, short pitch, int additionalInt, Velocity velocity, EntityMetaData metaData) { + public Firework(int id, Location location, short yaw, short pitch, int additionalInt, Velocity velocity) { super(id, location, yaw, pitch, velocity); - this.metaData = (FireworkMetaData) metaData; } @Override diff --git a/src/main/java/de/bixilon/minosoft/game/datatypes/entities/objects/FishingFloat.java b/src/main/java/de/bixilon/minosoft/game/datatypes/entities/objects/FishingFloat.java index 2aa3b9e0a..1df950a39 100644 --- a/src/main/java/de/bixilon/minosoft/game/datatypes/entities/objects/FishingFloat.java +++ b/src/main/java/de/bixilon/minosoft/game/datatypes/entities/objects/FishingFloat.java @@ -26,10 +26,9 @@ public class FishingFloat extends EntityObject implements ObjectInterface { this.owner = additionalInt; } - public FishingFloat(int id, Location location, short yaw, short pitch, int additionalInt, Velocity velocity, EntityMetaData metaData) { + public FishingFloat(int id, Location location, short yaw, short pitch, int additionalInt, Velocity velocity) { super(id, location, yaw, pitch, velocity); this.owner = additionalInt; - this.metaData = metaData; } @Override diff --git a/src/main/java/de/bixilon/minosoft/game/datatypes/entities/objects/ItemFrame.java b/src/main/java/de/bixilon/minosoft/game/datatypes/entities/objects/ItemFrame.java index d0b6c4f52..fdfbbc007 100644 --- a/src/main/java/de/bixilon/minosoft/game/datatypes/entities/objects/ItemFrame.java +++ b/src/main/java/de/bixilon/minosoft/game/datatypes/entities/objects/ItemFrame.java @@ -27,10 +27,9 @@ public class ItemFrame extends EntityObject implements ObjectInterface { direction = FrameDirection.byId(additionalInt); } - public ItemFrame(int id, Location location, short yaw, short pitch, int additionalInt, Velocity velocity, EntityMetaData metaData) { + public ItemFrame(int id, Location location, short yaw, short pitch, int additionalInt, Velocity velocity) { super(id, location, yaw, pitch, velocity); direction = FrameDirection.byId(additionalInt); - this.metaData = (ItemFrameMetaData) metaData; } @Override diff --git a/src/main/java/de/bixilon/minosoft/game/datatypes/entities/objects/ItemStack.java b/src/main/java/de/bixilon/minosoft/game/datatypes/entities/objects/ItemStack.java index 6654e51a9..bb89bb417 100644 --- a/src/main/java/de/bixilon/minosoft/game/datatypes/entities/objects/ItemStack.java +++ b/src/main/java/de/bixilon/minosoft/game/datatypes/entities/objects/ItemStack.java @@ -25,9 +25,8 @@ public class ItemStack extends EntityObject implements ObjectInterface { // objects do not spawn with metadata... reading additional info from the following int } - public ItemStack(int id, Location location, short yaw, short pitch, int additionalInt, Velocity velocity, EntityMetaData metaData) { + public ItemStack(int id, Location location, short yaw, short pitch, int additionalInt, Velocity velocity) { super(id, location, yaw, pitch, velocity); - this.metaData = (ItemMetaData) metaData; } @Override diff --git a/src/main/java/de/bixilon/minosoft/game/datatypes/entities/objects/LeashKnot.java b/src/main/java/de/bixilon/minosoft/game/datatypes/entities/objects/LeashKnot.java index 75c7f70a6..9d85f018b 100644 --- a/src/main/java/de/bixilon/minosoft/game/datatypes/entities/objects/LeashKnot.java +++ b/src/main/java/de/bixilon/minosoft/game/datatypes/entities/objects/LeashKnot.java @@ -24,9 +24,8 @@ public class LeashKnot extends EntityObject implements ObjectInterface { // objects do not spawn with metadata... reading additional info from the following int } - public LeashKnot(int id, Location location, short yaw, short pitch, int additionalInt, Velocity velocity, EntityMetaData metaData) { + public LeashKnot(int id, Location location, short yaw, short pitch, int additionalInt, Velocity velocity) { super(id, location, yaw, pitch, velocity); - this.metaData = metaData; } @Override diff --git a/src/main/java/de/bixilon/minosoft/game/datatypes/entities/objects/Minecart.java b/src/main/java/de/bixilon/minosoft/game/datatypes/entities/objects/Minecart.java index f2cb26684..495dc4078 100644 --- a/src/main/java/de/bixilon/minosoft/game/datatypes/entities/objects/Minecart.java +++ b/src/main/java/de/bixilon/minosoft/game/datatypes/entities/objects/Minecart.java @@ -26,10 +26,9 @@ public class Minecart extends EntityObject implements ObjectInterface { type = MinecartType.byType(additionalInt); } - public Minecart(int id, Location location, short yaw, short pitch, int additionalInt, Velocity velocity, EntityMetaData metaData) { + public Minecart(int id, Location location, short yaw, short pitch, int additionalInt, Velocity velocity) { super(id, location, yaw, pitch, velocity); type = MinecartType.byType(additionalInt); - this.metaData = (MinecartMetaData) metaData; } @Override diff --git a/src/main/java/de/bixilon/minosoft/game/datatypes/entities/objects/PrimedTNT.java b/src/main/java/de/bixilon/minosoft/game/datatypes/entities/objects/PrimedTNT.java index 3f8818575..333108f01 100644 --- a/src/main/java/de/bixilon/minosoft/game/datatypes/entities/objects/PrimedTNT.java +++ b/src/main/java/de/bixilon/minosoft/game/datatypes/entities/objects/PrimedTNT.java @@ -24,9 +24,8 @@ public class PrimedTNT extends EntityObject implements ObjectInterface { // objects do not spawn with metadata... reading additional info from the following int } - public PrimedTNT(int id, Location location, short yaw, short pitch, int additionalInt, Velocity velocity, EntityMetaData metaData) { + public PrimedTNT(int id, Location location, short yaw, short pitch, int additionalInt, Velocity velocity) { super(id, location, yaw, pitch, velocity); - this.metaData = metaData; } @Override diff --git a/src/main/java/de/bixilon/minosoft/game/datatypes/entities/objects/Snowball.java b/src/main/java/de/bixilon/minosoft/game/datatypes/entities/objects/Snowball.java index cf379f49f..e10cb0f86 100644 --- a/src/main/java/de/bixilon/minosoft/game/datatypes/entities/objects/Snowball.java +++ b/src/main/java/de/bixilon/minosoft/game/datatypes/entities/objects/Snowball.java @@ -26,10 +26,9 @@ public class Snowball extends EntityObject implements ObjectInterface { this.thrower = additionalInt; } - public Snowball(int id, Location location, short yaw, short pitch, int additionalInt, Velocity velocity, EntityMetaData metaData) { + public Snowball(int id, Location location, short yaw, short pitch, int additionalInt, Velocity velocity) { super(id, location, yaw, pitch, velocity); this.thrower = additionalInt; - this.metaData = metaData; } @Override diff --git a/src/main/java/de/bixilon/minosoft/game/datatypes/entities/objects/ThrownExpBottle.java b/src/main/java/de/bixilon/minosoft/game/datatypes/entities/objects/ThrownExpBottle.java index 583e8fc82..f1efb118c 100644 --- a/src/main/java/de/bixilon/minosoft/game/datatypes/entities/objects/ThrownExpBottle.java +++ b/src/main/java/de/bixilon/minosoft/game/datatypes/entities/objects/ThrownExpBottle.java @@ -24,9 +24,8 @@ public class ThrownExpBottle extends EntityObject implements ObjectInterface { // objects do not spawn with metadata... reading additional info from the following int } - public ThrownExpBottle(int id, Location location, short yaw, short pitch, int additionalInt, Velocity velocity, EntityMetaData metaData) { + public ThrownExpBottle(int id, Location location, short yaw, short pitch, int additionalInt, Velocity velocity) { super(id, location, yaw, pitch, velocity); - this.metaData = metaData; } @Override diff --git a/src/main/java/de/bixilon/minosoft/game/datatypes/entities/objects/ThrownPotion.java b/src/main/java/de/bixilon/minosoft/game/datatypes/entities/objects/ThrownPotion.java index 2dcd2645f..bde36cba7 100644 --- a/src/main/java/de/bixilon/minosoft/game/datatypes/entities/objects/ThrownPotion.java +++ b/src/main/java/de/bixilon/minosoft/game/datatypes/entities/objects/ThrownPotion.java @@ -26,10 +26,9 @@ public class ThrownPotion extends EntityObject implements ObjectInterface { this.potion = additionalInt; } - public ThrownPotion(int id, Location location, short yaw, short pitch, int additionalInt, Velocity velocity, EntityMetaData metaData) { + public ThrownPotion(int id, Location location, short yaw, short pitch, int additionalInt, Velocity velocity) { super(id, location, yaw, pitch, velocity); this.potion = additionalInt; - this.metaData = metaData; } @Override diff --git a/src/main/java/de/bixilon/minosoft/game/datatypes/entities/objects/WitherSkull.java b/src/main/java/de/bixilon/minosoft/game/datatypes/entities/objects/WitherSkull.java index 14c2511c5..d1e0cb33a 100644 --- a/src/main/java/de/bixilon/minosoft/game/datatypes/entities/objects/WitherSkull.java +++ b/src/main/java/de/bixilon/minosoft/game/datatypes/entities/objects/WitherSkull.java @@ -26,10 +26,9 @@ public class WitherSkull extends EntityObject implements ObjectInterface { this.thrower = additionalInt; } - public WitherSkull(int id, Location location, short yaw, short pitch, int additionalInt, Velocity velocity, EntityMetaData metaData) { + public WitherSkull(int id, Location location, short yaw, short pitch, int additionalInt, Velocity velocity) { super(id, location, yaw, pitch, velocity); this.thrower = additionalInt; - this.metaData = metaData; } @Override diff --git a/src/main/java/de/bixilon/minosoft/protocol/modding/channels/PluginChannelHandler.java b/src/main/java/de/bixilon/minosoft/protocol/modding/channels/PluginChannelHandler.java index 1906fabec..38f8fe039 100644 --- a/src/main/java/de/bixilon/minosoft/protocol/modding/channels/PluginChannelHandler.java +++ b/src/main/java/de/bixilon/minosoft/protocol/modding/channels/PluginChannelHandler.java @@ -17,6 +17,7 @@ import de.bixilon.minosoft.logging.Log; import de.bixilon.minosoft.protocol.network.Connection; import de.bixilon.minosoft.protocol.packets.serverbound.play.PacketPluginMessageSending; import de.bixilon.minosoft.protocol.protocol.InByteBuffer; +import de.bixilon.minosoft.protocol.protocol.OutByteBuffer; import java.util.ArrayList; import java.util.HashMap; @@ -91,6 +92,10 @@ public class PluginChannelHandler { connection.sendPacket(new PacketPluginMessageSending(channel, data)); } + public void sendRawData(String channel, OutByteBuffer buffer) { + connection.sendPacket(new PacketPluginMessageSending(channel, buffer.getOutBytes())); + } + public void registerServerChannel(String name) { if (DefaultPluginChannels.byName(name) != null) { // channel is a default channel, can not register diff --git a/src/main/java/de/bixilon/minosoft/protocol/network/Connection.java b/src/main/java/de/bixilon/minosoft/protocol/network/Connection.java index eb471e0bb..cd520ed67 100644 --- a/src/main/java/de/bixilon/minosoft/protocol/network/Connection.java +++ b/src/main/java/de/bixilon/minosoft/protocol/network/Connection.java @@ -26,10 +26,7 @@ import de.bixilon.minosoft.protocol.packets.serverbound.login.PacketLoginStart; import de.bixilon.minosoft.protocol.packets.serverbound.play.PacketChatMessage; import de.bixilon.minosoft.protocol.packets.serverbound.status.PacketStatusPing; import de.bixilon.minosoft.protocol.packets.serverbound.status.PacketStatusRequest; -import de.bixilon.minosoft.protocol.protocol.ConnectionReason; -import de.bixilon.minosoft.protocol.protocol.ConnectionState; -import de.bixilon.minosoft.protocol.protocol.PacketHandler; -import de.bixilon.minosoft.protocol.protocol.ProtocolVersion; +import de.bixilon.minosoft.protocol.protocol.*; import java.util.ArrayList; @@ -192,9 +189,21 @@ public class Connection { public void registerDefaultChannels() { // MC|Brand getPluginChannelHandler().registerClientHandler(DefaultPluginChannels.MC_BRAND.getName(), (handler, buffer) -> { - Log.info(String.format("Server is running %s on version %s", new String(buffer.readBytes(buffer.getBytesLeft())), getVersion().getName())); + String serverVersion; + String clientVersion = (Minosoft.getConfig().getBoolean(GameConfiguration.NETWORK_FAKE_CLIENT_BRAND) ? "vanilla" : "Minosoft"); + OutByteBuffer toSend = new OutByteBuffer(); + if (getVersion() == ProtocolVersion.VERSION_1_7_10) { + // no length prefix + serverVersion = new String(buffer.readBytes(buffer.getBytesLeft())); + toSend.writeBytes(clientVersion.getBytes()); + } else { + // length prefix + serverVersion = buffer.readString(); + toSend.writeString(clientVersion); + } + Log.info(String.format("Server is running %s, connected with %s", serverVersion, getVersion().getName())); - getPluginChannelHandler().sendRawData(DefaultPluginChannels.MC_BRAND.getName(), (Minosoft.getConfig().getBoolean(GameConfiguration.NETWORK_FAKE_CLIENT_BRAND) ? "vanilla" : "Minosoft").getBytes()); + getPluginChannelHandler().sendRawData(DefaultPluginChannels.MC_BRAND.getName(), toSend); }); } diff --git a/src/main/java/de/bixilon/minosoft/protocol/network/Network.java b/src/main/java/de/bixilon/minosoft/protocol/network/Network.java index ad4017aa7..78db95731 100644 --- a/src/main/java/de/bixilon/minosoft/protocol/network/Network.java +++ b/src/main/java/de/bixilon/minosoft/protocol/network/Network.java @@ -155,7 +155,12 @@ public class Network { outRawBuffer.writeBytes(data); } data = outRawBuffer.getOutBytes(); - + } else { + // append packet length + OutByteBuffer bufferWithLengthPrefix = new OutByteBuffer(); + bufferWithLengthPrefix.writeVarInt(data.length); + bufferWithLengthPrefix.writeBytes(data); + data = bufferWithLengthPrefix.getOutBytes(); } diff --git a/src/main/java/de/bixilon/minosoft/protocol/packets/clientbound/play/PacketPlayerAbilitiesReceiving.java b/src/main/java/de/bixilon/minosoft/protocol/packets/clientbound/play/PacketPlayerAbilitiesReceiving.java index ce34e8daf..54af412a7 100644 --- a/src/main/java/de/bixilon/minosoft/protocol/packets/clientbound/play/PacketPlayerAbilitiesReceiving.java +++ b/src/main/java/de/bixilon/minosoft/protocol/packets/clientbound/play/PacketPlayerAbilitiesReceiving.java @@ -32,7 +32,7 @@ public class PacketPlayerAbilitiesReceiving implements ClientboundPacket { @Override public void read(InPacketBuffer buffer, ProtocolVersion v) { switch (v) { - case VERSION_1_7_10: + case VERSION_1_7_10: { byte flags = buffer.readByte(); creative = BitByte.isBitSet(flags, 0); flying = BitByte.isBitSet(flags, 1); @@ -41,9 +41,17 @@ public class PacketPlayerAbilitiesReceiving implements ClientboundPacket { flyingSpeed = buffer.readFloat(); walkingSpeed = buffer.readFloat(); break; - case VERSION_1_8: - //ToDo + } + case VERSION_1_8: { + byte flags = buffer.readByte(); + godMode = BitByte.isBitSet(flags, 0); + flying = BitByte.isBitSet(flags, 1); + canFly = BitByte.isBitSet(flags, 2); + creative = BitByte.isBitSet(flags, 3); + flyingSpeed = buffer.readFloat(); + // ToDo Entity Properties break; + } } } diff --git a/src/main/java/de/bixilon/minosoft/protocol/packets/clientbound/play/PacketScoreboardTeams.java b/src/main/java/de/bixilon/minosoft/protocol/packets/clientbound/play/PacketScoreboardTeams.java index 775bb05a9..c4c0de3d2 100644 --- a/src/main/java/de/bixilon/minosoft/protocol/packets/clientbound/play/PacketScoreboardTeams.java +++ b/src/main/java/de/bixilon/minosoft/protocol/packets/clientbound/play/PacketScoreboardTeams.java @@ -44,15 +44,9 @@ public class PacketScoreboardTeams implements ClientboundPacket { prefix = buffer.readString(); suffix = buffer.readString(); friendlyFire = ScoreboardFriendlyFire.byId(buffer.readByte()); - if (v.getVersion() >= ProtocolVersion.VERSION_1_8.getVersion()) { - // color and nametag - nameTagVisibility = ScoreboardNameTagVisibility.byName(buffer.readString()); - color = TextComponent.ChatAttributes.byColor(ChatColor.byId(buffer.readByte())); - } else { - // default values - nameTagVisibility = ScoreboardNameTagVisibility.ALWAYS; - color = TextComponent.ChatAttributes.WHITE; - } + // default values + nameTagVisibility = ScoreboardNameTagVisibility.ALWAYS; + color = TextComponent.ChatAttributes.WHITE; } if (action == ScoreboardTeamAction.CREATE || action == ScoreboardTeamAction.PLAYER_ADD || action == ScoreboardTeamAction.PLAYER_REMOVE) { short playerCount = buffer.readShort(); @@ -62,6 +56,25 @@ public class PacketScoreboardTeams implements ClientboundPacket { } } break; + case VERSION_1_8: + name = buffer.readString(); + action = ScoreboardTeamAction.byId(buffer.readByte()); + if (action == ScoreboardTeamAction.CREATE || action == ScoreboardTeamAction.INFORMATION_UPDATE) { + displayName = buffer.readString(); + prefix = buffer.readString(); + suffix = buffer.readString(); + friendlyFire = ScoreboardFriendlyFire.byId(buffer.readByte()); + nameTagVisibility = ScoreboardNameTagVisibility.byName(buffer.readString()); + color = TextComponent.ChatAttributes.byColor(ChatColor.byId(buffer.readByte())); + } + if (action == ScoreboardTeamAction.CREATE || action == ScoreboardTeamAction.PLAYER_ADD || action == ScoreboardTeamAction.PLAYER_REMOVE) { + int playerCount = buffer.readVarInt(); + playerNames = new String[playerCount]; + for (int i = 0; i < playerCount; i++) { + playerNames[i] = buffer.readString(); + } + } + break; } } diff --git a/src/main/java/de/bixilon/minosoft/protocol/packets/clientbound/play/PacketServerDifficulty.java b/src/main/java/de/bixilon/minosoft/protocol/packets/clientbound/play/PacketServerDifficulty.java new file mode 100644 index 000000000..8ae85f317 --- /dev/null +++ b/src/main/java/de/bixilon/minosoft/protocol/packets/clientbound/play/PacketServerDifficulty.java @@ -0,0 +1,49 @@ +/* + * Codename Minosoft + * Copyright (C) 2020 Moritz Zwerger + * + * This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License along with this program. If not, see . + * + * This software is not affiliated with Mojang AB, the original developer of Minecraft. + */ + +package de.bixilon.minosoft.protocol.packets.clientbound.play; + +import de.bixilon.minosoft.game.datatypes.Difficulty; +import de.bixilon.minosoft.logging.Log; +import de.bixilon.minosoft.protocol.packets.ClientboundPacket; +import de.bixilon.minosoft.protocol.protocol.InPacketBuffer; +import de.bixilon.minosoft.protocol.protocol.PacketHandler; +import de.bixilon.minosoft.protocol.protocol.ProtocolVersion; + +public class PacketServerDifficulty implements ClientboundPacket { + Difficulty difficulty; + + + @Override + public void read(InPacketBuffer buffer, ProtocolVersion v) { + switch (v) { + case VERSION_1_8: + difficulty = Difficulty.byId(buffer.readByte()); + break; + } + } + + @Override + public void log() { + Log.protocol(String.format("Received server difficulty (difficulty=%s)", difficulty.name())); + } + + @Override + public void handle(PacketHandler h) { + h.handle(this); + } + + public Difficulty getDifficulty() { + return difficulty; + } +} diff --git a/src/main/java/de/bixilon/minosoft/protocol/packets/clientbound/play/PacketSpawnObject.java b/src/main/java/de/bixilon/minosoft/protocol/packets/clientbound/play/PacketSpawnObject.java index f6eac79e6..6686d746e 100644 --- a/src/main/java/de/bixilon/minosoft/protocol/packets/clientbound/play/PacketSpawnObject.java +++ b/src/main/java/de/bixilon/minosoft/protocol/packets/clientbound/play/PacketSpawnObject.java @@ -57,21 +57,26 @@ public class PacketSpawnObject implements ClientboundPacket { public void read(InPacketBuffer buffer, ProtocolVersion v) { switch (v) { case VERSION_1_7_10: + case VERSION_1_8: int entityId = buffer.readVarInt(); Objects type = Objects.byType(buffer.readByte()); Location location = new Location(buffer.readFixedPointNumberInteger(), buffer.readFixedPointNumberInteger(), buffer.readFixedPointNumberInteger()); short pitch = buffer.readAngle(); short yaw = buffer.readAngle(); + int data = buffer.readInteger(); try { if (v.getVersion() >= ProtocolVersion.VERSION_1_8.getVersion()) { // velocity present AND metadata - Velocity velocity = new Velocity(buffer.readShort(), buffer.readShort(), buffer.readShort()); - EntityMetaData metaData = getEntityData(object.getMetaDataClass(), buffer, v); - object = type.getClazz().getConstructor(int.class, Location.class, short.class, short.class, int.class, Velocity.class, EntityMetaData.class).newInstance(entityId, location, yaw, pitch, buffer.readInteger(), velocity, metaData); + + Velocity velocity = null; + if (data != 0) { + velocity = new Velocity(buffer.readShort(), buffer.readShort(), buffer.readShort()); + } + object = type.getClazz().getConstructor(int.class, Location.class, short.class, short.class, int.class, Velocity.class).newInstance(entityId, location, yaw, pitch, data, velocity); } else { - object = type.getClazz().getConstructor(int.class, Location.class, short.class, short.class, int.class).newInstance(entityId, location, yaw, pitch, buffer.readInteger()); + object = type.getClazz().getConstructor(int.class, Location.class, short.class, short.class, int.class).newInstance(entityId, location, yaw, pitch, data); } } catch (InstantiationException | IllegalAccessException | InvocationTargetException | NoSuchMethodException e) { e.printStackTrace(); diff --git a/src/main/java/de/bixilon/minosoft/protocol/packets/serverbound/play/PacketPlayerAbilitiesSending.java b/src/main/java/de/bixilon/minosoft/protocol/packets/serverbound/play/PacketPlayerAbilitiesSending.java index c538c73a1..9a527c172 100644 --- a/src/main/java/de/bixilon/minosoft/protocol/packets/serverbound/play/PacketPlayerAbilitiesSending.java +++ b/src/main/java/de/bixilon/minosoft/protocol/packets/serverbound/play/PacketPlayerAbilitiesSending.java @@ -44,13 +44,14 @@ public class PacketPlayerAbilitiesSending implements ServerboundPacket { this.godMode = false; this.flyingSpeed = 0.05F; this.walkingSpeed = 0.1F; + log(); } @Override public OutPacketBuffer write(ProtocolVersion v) { - OutPacketBuffer buffer = new OutPacketBuffer(v.getPacketCommand(Packets.Serverbound.PLAY_CLIENT_SETTINGS)); + OutPacketBuffer buffer = new OutPacketBuffer(v.getPacketCommand(Packets.Serverbound.PLAY_PLAYER_ABILITIES)); switch (v) { case VERSION_1_7_10: case VERSION_1_8: diff --git a/src/main/java/de/bixilon/minosoft/protocol/protocol/OutPacketBuffer.java b/src/main/java/de/bixilon/minosoft/protocol/protocol/OutPacketBuffer.java index 2ce7f883b..0c11894f8 100644 --- a/src/main/java/de/bixilon/minosoft/protocol/protocol/OutPacketBuffer.java +++ b/src/main/java/de/bixilon/minosoft/protocol/protocol/OutPacketBuffer.java @@ -30,19 +30,15 @@ public class OutPacketBuffer extends OutByteBuffer { @Override public byte[] getOutBytes() { - // ToDo: compression List before = getBytes(); List after = new ArrayList<>(); - List last = new ArrayList<>(); writeVarInt(getCommand(), after); // second: command after.addAll(before); // rest ist raw data - writeVarInt(after.size(), last); // first var int: length - last.addAll(after); // rest ist raw data - byte[] ret = new byte[last.size()]; - for (int i = 0; i < last.size(); i++) { - ret[i] = last.get(i); + byte[] ret = new byte[after.size()]; + for (int i = 0; i < after.size(); i++) { + ret[i] = after.get(i); } return ret; } diff --git a/src/main/java/de/bixilon/minosoft/protocol/protocol/PacketHandler.java b/src/main/java/de/bixilon/minosoft/protocol/protocol/PacketHandler.java index bb5f1e02f..c7632c453 100644 --- a/src/main/java/de/bixilon/minosoft/protocol/protocol/PacketHandler.java +++ b/src/main/java/de/bixilon/minosoft/protocol/protocol/PacketHandler.java @@ -436,4 +436,7 @@ public class PacketHandler { public void handle(PacketLoginSetCompression pkg) { } + + public void handle(PacketServerDifficulty pkg) { + } } diff --git a/src/main/java/de/bixilon/minosoft/protocol/protocol/Protocol.java b/src/main/java/de/bixilon/minosoft/protocol/protocol/Protocol.java index 1073ec610..8ebf35ad2 100644 --- a/src/main/java/de/bixilon/minosoft/protocol/protocol/Protocol.java +++ b/src/main/java/de/bixilon/minosoft/protocol/protocol/Protocol.java @@ -113,6 +113,7 @@ public abstract class Protocol implements ProtocolInterface { packetClassMapping.put(Packets.Clientbound.PLAY_TEAMS, PacketScoreboardTeams.class); packetClassMapping.put(Packets.Clientbound.PLAY_DISPLAY_SCOREBOARD, PacketScoreboardDisplayScoreboard.class); packetClassMapping.put(Packets.Clientbound.PLAY_MAP_DATA, PacketMapData.class); + packetClassMapping.put(Packets.Clientbound.PLAY_SERVER_DIFFICULTY, PacketServerDifficulty.class); } public static ProtocolVersion getLowestVersionSupported() {