diff --git a/src/main/java/io/akarin/server/core/PacketType.java b/src/main/java/io/akarin/server/core/PacketType.java index 859d1c240..cd0c99cc5 100644 --- a/src/main/java/io/akarin/server/core/PacketType.java +++ b/src/main/java/io/akarin/server/core/PacketType.java @@ -1,5 +1,12 @@ package io.akarin.server.core; public enum PacketType { // unused yet + STATUS_OUT_SERVER_INFO, + STATUS_OUT_PONG, + + PLAY_OUT_MAP_CHUNK, + PLAY_OUT_SPAWN_POSITION, + PLAY_OUT_CHAT, + UNKNOWN; } \ No newline at end of file diff --git a/src/main/java/net/minecraft/server/NetworkManager.java b/src/main/java/net/minecraft/server/NetworkManager.java index d60da0fa3..55351efe6 100644 --- a/src/main/java/net/minecraft/server/NetworkManager.java +++ b/src/main/java/net/minecraft/server/NetworkManager.java @@ -3,6 +3,7 @@ package net.minecraft.server; import com.google.common.collect.Lists; import com.google.common.util.concurrent.ThreadFactoryBuilder; +import io.akarin.server.core.PacketType; import io.netty.channel.Channel; import io.netty.channel.ChannelFuture; import io.netty.channel.ChannelFutureListener; @@ -221,7 +222,7 @@ public class NetworkManager extends SimpleChannelInboundHandler> { } private final void dispatchOrQueuePacketUnsafe(Packet packet, @Nullable GenericFutureListener> genericfuturelistener) { - boolean dispatch = packet instanceof PacketStatusOutPong || packet instanceof PacketStatusOutServerInfo || (packet instanceof PacketPlayOutMapChunk && ((PacketPlayOutMapChunk) packet).isReady()); + boolean dispatch = packet instanceof PacketStatusOutPong || packet instanceof PacketStatusOutServerInfo || (packet.getType() == PacketType.PLAY_OUT_MAP_CHUNK && ((PacketPlayOutMapChunk) packet).isReady()); if (dispatch) { this.dispatchPacket(packet, genericfuturelistener); } else { @@ -232,9 +233,10 @@ public class NetworkManager extends SimpleChannelInboundHandler> { private final void sendPacketQueueUnsafe() { while (!this.packetQueue.isEmpty()) { QueuedPacket queuedPacket = this.packetQueue.poll(packet -> - packet != null && - (!(packet.getPacket() instanceof PacketPlayOutMapChunk) || - (((PacketPlayOutMapChunk) packet.getPacket()).isReady())), null); + packet != null && ( + !(packet.getPacket().getType() == PacketType.PLAY_OUT_MAP_CHUNK) || + (((PacketPlayOutMapChunk) packet.getPacket()).isReady()) + ), null); if (queuedPacket != null) this.dispatchPacket(queuedPacket.getPacket(), queuedPacket.getGenericFutureListener()); @@ -333,7 +335,7 @@ public class NetworkManager extends SimpleChannelInboundHandler> { NetworkManager.QueuedPacket networkmanager_queuedpacket = (NetworkManager.QueuedPacket) this.getPacketQueue().peek(); // poll -> peek if (networkmanager_queuedpacket != null) { // Fix NPE (Spigot bug caused by handleDisconnection()) - if (networkmanager_queuedpacket.getPacket() instanceof PacketPlayOutMapChunk && !((PacketPlayOutMapChunk) networkmanager_queuedpacket.getPacket()).isReady()) { // Check if the peeked packet is a chunk packet which is not ready + if (networkmanager_queuedpacket.getPacket().getType() == PacketType.PLAY_OUT_MAP_CHUNK && !((PacketPlayOutMapChunk) networkmanager_queuedpacket.getPacket()).isReady()) { // Check if the peeked packet is a chunk packet which is not ready return false; // Return false if the peeked packet is a chunk packet which is not ready } else { this.getPacketQueue().poll(); // poll here diff --git a/src/main/java/net/minecraft/server/Packet.java b/src/main/java/net/minecraft/server/Packet.java index 99837a44a..8e0f8cf67 100644 --- a/src/main/java/net/minecraft/server/Packet.java +++ b/src/main/java/net/minecraft/server/Packet.java @@ -25,5 +25,9 @@ public interface Packet { public default io.akarin.server.core.PacketType getType() { return io.akarin.server.core.PacketType.UNKNOWN; } + + public default boolean canDispatchImmediately() { + return false; + } // Akarin end } diff --git a/src/main/java/net/minecraft/server/PacketPlayOutChat.java b/src/main/java/net/minecraft/server/PacketPlayOutChat.java index eba6aadad..d48be638c 100644 --- a/src/main/java/net/minecraft/server/PacketPlayOutChat.java +++ b/src/main/java/net/minecraft/server/PacketPlayOutChat.java @@ -57,4 +57,15 @@ public class PacketPlayOutChat implements Packet { public boolean a() { return true; } + // Akarin start + @Override + public io.akarin.server.core.PacketType getType() { + return io.akarin.server.core.PacketType.PLAY_OUT_CHAT; + } + + @Override + public boolean canDispatchImmediately() { + return true; + } + // Akarin end } diff --git a/src/main/java/net/minecraft/server/PacketPlayOutMapChunk.java b/src/main/java/net/minecraft/server/PacketPlayOutMapChunk.java index eb54bdb64..0cb15ca6b 100644 --- a/src/main/java/net/minecraft/server/PacketPlayOutMapChunk.java +++ b/src/main/java/net/minecraft/server/PacketPlayOutMapChunk.java @@ -204,4 +204,15 @@ public class PacketPlayOutMapChunk implements Packet { public boolean f() { return this.f; } + // Akarin start + @Override + public io.akarin.server.core.PacketType getType() { + return io.akarin.server.core.PacketType.PLAY_OUT_MAP_CHUNK; + } + + @Override + public boolean canDispatchImmediately() { + return this.ready; + } + // Akarin end } diff --git a/src/main/java/net/minecraft/server/PacketPlayOutSpawnPosition.java b/src/main/java/net/minecraft/server/PacketPlayOutSpawnPosition.java new file mode 100644 index 000000000..7d9f27e38 --- /dev/null +++ b/src/main/java/net/minecraft/server/PacketPlayOutSpawnPosition.java @@ -0,0 +1,37 @@ +package net.minecraft.server; + +import java.io.IOException; + +public class PacketPlayOutSpawnPosition implements Packet { + + public BlockPosition position; + + public PacketPlayOutSpawnPosition() {} + + public PacketPlayOutSpawnPosition(BlockPosition blockposition) { + this.position = blockposition; + } + + public void a(PacketDataSerializer packetdataserializer) throws IOException { + this.position = packetdataserializer.e(); + } + + public void b(PacketDataSerializer packetdataserializer) throws IOException { + packetdataserializer.a(this.position); + } + + public void a(PacketListenerPlayOut packetlistenerplayout) { + packetlistenerplayout.a(this); + } + // Akarin start + @Override + public io.akarin.server.core.PacketType getType() { + return io.akarin.server.core.PacketType.PLAY_OUT_SPAWN_POSITION; + } + + @Override + public boolean canDispatchImmediately() { + return true; + } + // Akarin end +} diff --git a/src/main/java/net/minecraft/server/PacketStatusOutPong.java b/src/main/java/net/minecraft/server/PacketStatusOutPong.java new file mode 100644 index 000000000..92dc95326 --- /dev/null +++ b/src/main/java/net/minecraft/server/PacketStatusOutPong.java @@ -0,0 +1,37 @@ +package net.minecraft.server; + +import java.io.IOException; + +public class PacketStatusOutPong implements Packet { + + private long a; + + public PacketStatusOutPong() {} + + public PacketStatusOutPong(long i) { + this.a = i; + } + + public void a(PacketDataSerializer packetdataserializer) throws IOException { + this.a = packetdataserializer.readLong(); + } + + public void b(PacketDataSerializer packetdataserializer) throws IOException { + packetdataserializer.writeLong(this.a); + } + + public void a(PacketStatusOutListener packetstatusoutlistener) { + packetstatusoutlistener.a(this); + } + // Akarin start + @Override + public io.akarin.server.core.PacketType getType() { + return io.akarin.server.core.PacketType.STATUS_OUT_PONG; + } + + @Override + public boolean canDispatchImmediately() { + return true; + } + // Akarin end +} diff --git a/src/main/java/net/minecraft/server/PacketStatusOutServerInfo.java b/src/main/java/net/minecraft/server/PacketStatusOutServerInfo.java new file mode 100644 index 000000000..86d47227d --- /dev/null +++ b/src/main/java/net/minecraft/server/PacketStatusOutServerInfo.java @@ -0,0 +1,40 @@ +package net.minecraft.server; + +import com.google.gson.Gson; +import com.google.gson.GsonBuilder; +import java.io.IOException; + +public class PacketStatusOutServerInfo implements Packet { + + private static final Gson a = (new GsonBuilder()).registerTypeAdapter(ServerPing.ServerData.class, new ServerPing.ServerData.Serializer()).registerTypeAdapter(ServerPing.ServerPingPlayerSample.class, new ServerPing.ServerPingPlayerSample.Serializer()).registerTypeAdapter(ServerPing.class, new ServerPing.Serializer()).registerTypeHierarchyAdapter(IChatBaseComponent.class, new IChatBaseComponent.ChatSerializer()).registerTypeHierarchyAdapter(ChatModifier.class, new ChatModifier.ChatModifierSerializer()).registerTypeAdapterFactory(new ChatTypeAdapterFactory()).create(); + private ServerPing b; + + public PacketStatusOutServerInfo() {} + + public PacketStatusOutServerInfo(ServerPing serverping) { + this.b = serverping; + } + + public void a(PacketDataSerializer packetdataserializer) throws IOException { + this.b = (ServerPing) ChatDeserializer.a(PacketStatusOutServerInfo.a, packetdataserializer.e(32767), ServerPing.class); + } + + public void b(PacketDataSerializer packetdataserializer) throws IOException { + packetdataserializer.a(PacketStatusOutServerInfo.a.toJson(this.b)); + } + + public void a(PacketStatusOutListener packetstatusoutlistener) { + packetstatusoutlistener.a(this); + } + // Akarin start + @Override + public io.akarin.server.core.PacketType getType() { + return io.akarin.server.core.PacketType.STATUS_OUT_SERVER_INFO; + } + + @Override + public boolean canDispatchImmediately() { + return true; + } + // Akarin end +} diff --git a/src/main/java/net/minecraft/server/PlayerConnection.java b/src/main/java/net/minecraft/server/PlayerConnection.java index 7ab8c3876..e1dedf860 100644 --- a/src/main/java/net/minecraft/server/PlayerConnection.java +++ b/src/main/java/net/minecraft/server/PlayerConnection.java @@ -7,6 +7,8 @@ import com.google.common.util.concurrent.Futures; import com.mojang.brigadier.ParseResults; import com.mojang.brigadier.StringReader; import com.mojang.brigadier.suggestion.Suggestions; + +import io.akarin.server.core.PacketType; import io.netty.util.concurrent.Future; import io.netty.util.concurrent.GenericFutureListener; @@ -1501,10 +1503,10 @@ public class PlayerConnection implements PacketListenerPlayIn, ITickable { if (this.processedDisconnect) return; - if (packet0 instanceof PacketPlayOutSpawnPosition) { + if (packet0.getType() == PacketType.PLAY_OUT_SPAWN_POSITION) { PacketPlayOutSpawnPosition packet6 = (PacketPlayOutSpawnPosition) packet0; this.player.compassTarget = new Location(this.getPlayer().getWorld(), packet6.position.getX(), packet6.position.getY(), packet6.position.getZ()); - } else if (packet1 instanceof PacketPlayOutSpawnPosition) { + } else if (packet1.getType() == PacketType.PLAY_OUT_SPAWN_POSITION) { PacketPlayOutSpawnPosition packet6 = (PacketPlayOutSpawnPosition) packet1; this.player.compassTarget = new Location(this.getPlayer().getWorld(), packet6.position.getX(), packet6.position.getY(), packet6.position.getZ()); } @@ -1526,13 +1528,13 @@ public class PlayerConnection implements PacketListenerPlayIn, ITickable { if (this.processedDisconnect) return; - if (packet0 instanceof PacketPlayOutSpawnPosition) { + if (packet0 .getType() == PacketType.PLAY_OUT_SPAWN_POSITION) { PacketPlayOutSpawnPosition packet6 = (PacketPlayOutSpawnPosition) packet0; this.player.compassTarget = new Location(this.getPlayer().getWorld(), packet6.position.getX(), packet6.position.getY(), packet6.position.getZ()); - } else if (packet1 instanceof PacketPlayOutSpawnPosition) { + } else if (packet1.getType() == PacketType.PLAY_OUT_SPAWN_POSITION) { PacketPlayOutSpawnPosition packet6 = (PacketPlayOutSpawnPosition) packet1; this.player.compassTarget = new Location(this.getPlayer().getWorld(), packet6.position.getX(), packet6.position.getY(), packet6.position.getZ()); - } else if (packet2 instanceof PacketPlayOutSpawnPosition) { + } else if (packet2.getType() == PacketType.PLAY_OUT_SPAWN_POSITION) { PacketPlayOutSpawnPosition packet6 = (PacketPlayOutSpawnPosition) packet2; this.player.compassTarget = new Location(this.getPlayer().getWorld(), packet6.position.getX(), packet6.position.getY(), packet6.position.getZ()); } @@ -1569,7 +1571,7 @@ public class PlayerConnection implements PacketListenerPlayIn, ITickable { // Akarin end public final void a(Packet packet, @Nullable GenericFutureListener> genericfuturelistener) { // Akarin - add final - if (packet instanceof PacketPlayOutChat) { + if (packet.getType() == PacketType.PLAY_OUT_CHAT) { // Akarin PacketPlayOutChat packetplayoutchat = (PacketPlayOutChat) packet; EntityHuman.EnumChatVisibility entityhuman_enumchatvisibility = this.player.getChatFlags(); @@ -1585,7 +1587,7 @@ public class PlayerConnection implements PacketListenerPlayIn, ITickable { // CraftBukkit start if (/*packet == null ||*/ this.processedDisconnect) { // Spigot // Akarin return; - } else if (packet instanceof PacketPlayOutSpawnPosition) { + } else if (packet.getType() == PacketType.PLAY_OUT_SPAWN_POSITION) { // Akarin PacketPlayOutSpawnPosition packet6 = (PacketPlayOutSpawnPosition) packet; this.player.compassTarget = new Location(this.getPlayer().getWorld(), packet6.position.getX(), packet6.position.getY(), packet6.position.getZ()); }