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 ae2c59d13..33004e72a 100644 --- a/src/main/java/de/bixilon/minosoft/protocol/network/Connection.java +++ b/src/main/java/de/bixilon/minosoft/protocol/network/Connection.java @@ -45,7 +45,6 @@ import java.util.concurrent.atomic.AtomicBoolean; public class Connection { public static int lastConnectionId; private final Network network = Network.getNetworkInstance(this); - private final PacketHandler handler = new PacketHandler(this); private final PacketSender sender = new PacketSender(this); private final LinkedBlockingQueue handlingQueue = new LinkedBlockingQueue<>(); private final VelocityHandler velocityHandler = new VelocityHandler(this); @@ -159,10 +158,6 @@ public class Connection { } } - public PacketHandler getHandler() { - return this.handler; - } - public void handle(ClientboundPacket p) { this.handlingQueue.add(p); } @@ -213,7 +208,7 @@ public class Connection { if (fireEvent(event)) { continue; } - packet.handle(getHandler()); + packet.handle(this); } catch (Throwable e) { Log.printException(e, LogLevels.PROTOCOL); } diff --git a/src/main/java/de/bixilon/minosoft/protocol/network/socket/SocketNetwork.java b/src/main/java/de/bixilon/minosoft/protocol/network/socket/SocketNetwork.java index 7dcc9901a..a1305de13 100644 --- a/src/main/java/de/bixilon/minosoft/protocol/network/socket/SocketNetwork.java +++ b/src/main/java/de/bixilon/minosoft/protocol/network/socket/SocketNetwork.java @@ -19,7 +19,7 @@ import de.bixilon.minosoft.protocol.network.Connection; import de.bixilon.minosoft.protocol.network.Network; import de.bixilon.minosoft.protocol.packets.ClientboundPacket; import de.bixilon.minosoft.protocol.packets.ServerboundPacket; -import de.bixilon.minosoft.protocol.packets.clientbound.interfaces.PacketCompressionInterface; +import de.bixilon.minosoft.protocol.packets.clientbound.interfaces.CompressionThresholdChange; import de.bixilon.minosoft.protocol.packets.clientbound.login.PacketEncryptionRequest; import de.bixilon.minosoft.protocol.packets.clientbound.login.PacketLoginSuccess; import de.bixilon.minosoft.protocol.packets.serverbound.login.PacketEncryptionResponse; @@ -210,7 +210,7 @@ public class SocketNetwork implements Network { // set special settings to avoid miss timing issues if (packetInstance instanceof PacketLoginSuccess) { this.connection.setConnectionState(ConnectionStates.PLAY); - } else if (packetInstance instanceof PacketCompressionInterface compressionPacket) { + } else if (packetInstance instanceof CompressionThresholdChange compressionPacket) { this.compressionThreshold = compressionPacket.getThreshold(); } else if (packetInstance instanceof PacketEncryptionRequest) { // wait until response is ready diff --git a/src/main/java/de/bixilon/minosoft/protocol/packets/ClientboundPacket.java b/src/main/java/de/bixilon/minosoft/protocol/packets/ClientboundPacket.java index 72ba598f7..ed4b39943 100644 --- a/src/main/java/de/bixilon/minosoft/protocol/packets/ClientboundPacket.java +++ b/src/main/java/de/bixilon/minosoft/protocol/packets/ClientboundPacket.java @@ -13,12 +13,12 @@ package de.bixilon.minosoft.protocol.packets; +import de.bixilon.minosoft.protocol.network.Connection; import de.bixilon.minosoft.protocol.protocol.InByteBuffer; -import de.bixilon.minosoft.protocol.protocol.PacketHandler; -// packet to send to client -public interface ClientboundPacket extends Packet { - boolean read(InByteBuffer buffer) throws Exception; +public abstract class ClientboundPacket implements Packet { + public abstract boolean read(InByteBuffer buffer) throws Exception; - void handle(PacketHandler h); + public void handle(Connection connection) { + } } diff --git a/src/main/java/de/bixilon/minosoft/protocol/packets/clientbound/interfaces/PacketCompressionInterface.java b/src/main/java/de/bixilon/minosoft/protocol/packets/clientbound/interfaces/CompressionThresholdChange.java similarity index 88% rename from src/main/java/de/bixilon/minosoft/protocol/packets/clientbound/interfaces/PacketCompressionInterface.java rename to src/main/java/de/bixilon/minosoft/protocol/packets/clientbound/interfaces/CompressionThresholdChange.java index 9e2c92811..3ed5e2089 100644 --- a/src/main/java/de/bixilon/minosoft/protocol/packets/clientbound/interfaces/PacketCompressionInterface.java +++ b/src/main/java/de/bixilon/minosoft/protocol/packets/clientbound/interfaces/CompressionThresholdChange.java @@ -15,6 +15,6 @@ package de.bixilon.minosoft.protocol.packets.clientbound.interfaces; import de.bixilon.minosoft.protocol.packets.ClientboundPacket; -public interface PacketCompressionInterface extends ClientboundPacket { - int getThreshold(); +public abstract class CompressionThresholdChange extends ClientboundPacket { + public abstract int getThreshold(); } diff --git a/src/main/java/de/bixilon/minosoft/protocol/packets/clientbound/login/PacketEncryptionRequest.java b/src/main/java/de/bixilon/minosoft/protocol/packets/clientbound/login/PacketEncryptionRequest.java index 504d6cf1e..cc7399adf 100644 --- a/src/main/java/de/bixilon/minosoft/protocol/packets/clientbound/login/PacketEncryptionRequest.java +++ b/src/main/java/de/bixilon/minosoft/protocol/packets/clientbound/login/PacketEncryptionRequest.java @@ -14,11 +14,17 @@ package de.bixilon.minosoft.protocol.packets.clientbound.login; import de.bixilon.minosoft.logging.Log; +import de.bixilon.minosoft.protocol.network.Connection; import de.bixilon.minosoft.protocol.packets.ClientboundPacket; +import de.bixilon.minosoft.protocol.packets.serverbound.login.PacketEncryptionResponse; +import de.bixilon.minosoft.protocol.protocol.CryptManager; import de.bixilon.minosoft.protocol.protocol.InByteBuffer; -import de.bixilon.minosoft.protocol.protocol.PacketHandler; -public class PacketEncryptionRequest implements ClientboundPacket { +import javax.crypto.SecretKey; +import java.math.BigInteger; +import java.security.PublicKey; + +public class PacketEncryptionRequest extends ClientboundPacket { String serverId; // normally empty byte[] publicKey; @@ -33,8 +39,12 @@ public class PacketEncryptionRequest implements ClientboundPacket { } @Override - public void handle(PacketHandler h) { - h.handle(this); + public void handle(Connection connection) { + SecretKey secretKey = CryptManager.createNewSharedKey(); + PublicKey publicKey = CryptManager.decodePublicKey(getPublicKey()); + String serverHash = new BigInteger(CryptManager.getServerHash(getServerId(), publicKey, secretKey)).toString(16); + connection.getPlayer().getAccount().join(serverHash); + connection.sendPacket(new PacketEncryptionResponse(secretKey, getVerifyToken(), publicKey)); } @Override diff --git a/src/main/java/de/bixilon/minosoft/protocol/packets/clientbound/login/PacketLoginDisconnect.java b/src/main/java/de/bixilon/minosoft/protocol/packets/clientbound/login/PacketLoginDisconnect.java index 66d4b7455..d55255212 100644 --- a/src/main/java/de/bixilon/minosoft/protocol/packets/clientbound/login/PacketLoginDisconnect.java +++ b/src/main/java/de/bixilon/minosoft/protocol/packets/clientbound/login/PacketLoginDisconnect.java @@ -15,11 +15,12 @@ package de.bixilon.minosoft.protocol.packets.clientbound.login; import de.bixilon.minosoft.data.text.ChatComponent; import de.bixilon.minosoft.logging.Log; +import de.bixilon.minosoft.modding.event.events.LoginDisconnectEvent; +import de.bixilon.minosoft.protocol.network.Connection; import de.bixilon.minosoft.protocol.packets.ClientboundPacket; import de.bixilon.minosoft.protocol.protocol.InByteBuffer; -import de.bixilon.minosoft.protocol.protocol.PacketHandler; -public class PacketLoginDisconnect implements ClientboundPacket { +public class PacketLoginDisconnect extends ClientboundPacket { ChatComponent reason; @Override @@ -29,8 +30,10 @@ public class PacketLoginDisconnect implements ClientboundPacket { } @Override - public void handle(PacketHandler h) { - h.handle(this); + public void handle(Connection connection) { + connection.fireEvent(new LoginDisconnectEvent(connection, getReason())); + Log.info(String.format("Disconnecting from server (reason=%s)", getReason().getANSIColoredMessage())); + connection.disconnect(); } @Override diff --git a/src/main/java/de/bixilon/minosoft/protocol/packets/clientbound/login/PacketLoginPluginRequest.java b/src/main/java/de/bixilon/minosoft/protocol/packets/clientbound/login/PacketLoginPluginRequest.java index cd0ddfe91..a426c525a 100644 --- a/src/main/java/de/bixilon/minosoft/protocol/packets/clientbound/login/PacketLoginPluginRequest.java +++ b/src/main/java/de/bixilon/minosoft/protocol/packets/clientbound/login/PacketLoginPluginRequest.java @@ -14,12 +14,12 @@ package de.bixilon.minosoft.protocol.packets.clientbound.login; import de.bixilon.minosoft.logging.Log; +import de.bixilon.minosoft.modding.event.events.LoginPluginMessageRequestEvent; import de.bixilon.minosoft.protocol.network.Connection; import de.bixilon.minosoft.protocol.packets.ClientboundPacket; import de.bixilon.minosoft.protocol.protocol.InByteBuffer; -import de.bixilon.minosoft.protocol.protocol.PacketHandler; -public class PacketLoginPluginRequest implements ClientboundPacket { +public class PacketLoginPluginRequest extends ClientboundPacket { int messageId; String channel; byte[] data; @@ -35,8 +35,8 @@ public class PacketLoginPluginRequest implements ClientboundPacket { } @Override - public void handle(PacketHandler h) { - h.handle(this); + public void handle(Connection connection) { + connection.fireEvent(new LoginPluginMessageRequestEvent(this.connection, this)); } @Override diff --git a/src/main/java/de/bixilon/minosoft/protocol/packets/clientbound/login/PacketLoginSetCompression.java b/src/main/java/de/bixilon/minosoft/protocol/packets/clientbound/login/PacketLoginSetCompression.java index 50638ea83..83799c95f 100644 --- a/src/main/java/de/bixilon/minosoft/protocol/packets/clientbound/login/PacketLoginSetCompression.java +++ b/src/main/java/de/bixilon/minosoft/protocol/packets/clientbound/login/PacketLoginSetCompression.java @@ -14,11 +14,10 @@ package de.bixilon.minosoft.protocol.packets.clientbound.login; import de.bixilon.minosoft.logging.Log; -import de.bixilon.minosoft.protocol.packets.clientbound.interfaces.PacketCompressionInterface; +import de.bixilon.minosoft.protocol.packets.clientbound.interfaces.CompressionThresholdChange; import de.bixilon.minosoft.protocol.protocol.InByteBuffer; -import de.bixilon.minosoft.protocol.protocol.PacketHandler; -public class PacketLoginSetCompression implements PacketCompressionInterface { +public class PacketLoginSetCompression extends CompressionThresholdChange { int threshold; @Override @@ -27,11 +26,6 @@ public class PacketLoginSetCompression implements PacketCompressionInterface { return true; } - @Override - public void handle(PacketHandler h) { - h.handle(this); - } - @Override public void log() { Log.protocol(String.format("[IN] Received set compression packet (threshold=%d)", this.threshold)); diff --git a/src/main/java/de/bixilon/minosoft/protocol/packets/clientbound/login/PacketLoginSuccess.java b/src/main/java/de/bixilon/minosoft/protocol/packets/clientbound/login/PacketLoginSuccess.java index 482feea2b..04a7c17b9 100644 --- a/src/main/java/de/bixilon/minosoft/protocol/packets/clientbound/login/PacketLoginSuccess.java +++ b/src/main/java/de/bixilon/minosoft/protocol/packets/clientbound/login/PacketLoginSuccess.java @@ -16,12 +16,11 @@ package de.bixilon.minosoft.protocol.packets.clientbound.login; import de.bixilon.minosoft.logging.Log; import de.bixilon.minosoft.protocol.packets.ClientboundPacket; import de.bixilon.minosoft.protocol.protocol.InByteBuffer; -import de.bixilon.minosoft.protocol.protocol.PacketHandler; import de.bixilon.minosoft.util.Util; import java.util.UUID; -public class PacketLoginSuccess implements ClientboundPacket { +public class PacketLoginSuccess extends ClientboundPacket { UUID uuid; String username; @@ -37,11 +36,6 @@ public class PacketLoginSuccess implements ClientboundPacket { return true; } - @Override - public void handle(PacketHandler h) { - h.handle(this); - } - @Override public void log() { Log.protocol(String.format("[IN] Receiving login success packet (username=%s, UUID=%s)", this.username, this.uuid)); diff --git a/src/main/java/de/bixilon/minosoft/protocol/packets/clientbound/play/PacketAcknowledgePlayerDigging.java b/src/main/java/de/bixilon/minosoft/protocol/packets/clientbound/play/PacketAcknowledgePlayerDigging.java index 2ba055a09..70d76cedd 100644 --- a/src/main/java/de/bixilon/minosoft/protocol/packets/clientbound/play/PacketAcknowledgePlayerDigging.java +++ b/src/main/java/de/bixilon/minosoft/protocol/packets/clientbound/play/PacketAcknowledgePlayerDigging.java @@ -19,9 +19,8 @@ import de.bixilon.minosoft.logging.Log; import de.bixilon.minosoft.protocol.packets.ClientboundPacket; import de.bixilon.minosoft.protocol.packets.serverbound.play.PacketPlayerDigging; import de.bixilon.minosoft.protocol.protocol.InByteBuffer; -import de.bixilon.minosoft.protocol.protocol.PacketHandler; -public class PacketAcknowledgePlayerDigging implements ClientboundPacket { +public class PacketAcknowledgePlayerDigging extends ClientboundPacket { BlockPosition position; Block block; PacketPlayerDigging.DiggingStatus status; @@ -36,11 +35,6 @@ public class PacketAcknowledgePlayerDigging implements ClientboundPacket { return true; } - @Override - public void handle(PacketHandler h) { - h.handle(this); - } - @Override public void log() { Log.protocol(String.format("[IN] Received acknowledge digging packet (position=%s, block=%s, status=%s, successful=%s)", this.position, this.block, this.status, this.successful)); diff --git a/src/main/java/de/bixilon/minosoft/protocol/packets/clientbound/play/PacketAdvancements.java b/src/main/java/de/bixilon/minosoft/protocol/packets/clientbound/play/PacketAdvancements.java index 613b6653e..37978ca61 100644 --- a/src/main/java/de/bixilon/minosoft/protocol/packets/clientbound/play/PacketAdvancements.java +++ b/src/main/java/de/bixilon/minosoft/protocol/packets/clientbound/play/PacketAdvancements.java @@ -22,13 +22,12 @@ import de.bixilon.minosoft.data.text.ChatComponent; import de.bixilon.minosoft.logging.Log; import de.bixilon.minosoft.protocol.packets.ClientboundPacket; import de.bixilon.minosoft.protocol.protocol.InByteBuffer; -import de.bixilon.minosoft.protocol.protocol.PacketHandler; import de.bixilon.minosoft.util.BitByte; import java.util.ArrayList; import java.util.HashMap; -public class PacketAdvancements implements ClientboundPacket { +public class PacketAdvancements extends ClientboundPacket { final HashMap advancements = new HashMap<>(); final HashMap progresses = new HashMap<>(); boolean reset; @@ -101,11 +100,6 @@ public class PacketAdvancements implements ClientboundPacket { return true; } - @Override - public void handle(PacketHandler h) { - h.handle(this); - } - @Override public void log() { Log.protocol(String.format("[IN] Receiving advancements (reset=%s, advancements=%s, progresses=%s)", this.reset, this.advancements.size(), this.progresses.size())); diff --git a/src/main/java/de/bixilon/minosoft/protocol/packets/clientbound/play/PacketAttachEntity.java b/src/main/java/de/bixilon/minosoft/protocol/packets/clientbound/play/PacketAttachEntity.java index c2c3713cf..f78ffda6b 100644 --- a/src/main/java/de/bixilon/minosoft/protocol/packets/clientbound/play/PacketAttachEntity.java +++ b/src/main/java/de/bixilon/minosoft/protocol/packets/clientbound/play/PacketAttachEntity.java @@ -13,12 +13,13 @@ package de.bixilon.minosoft.protocol.packets.clientbound.play; +import de.bixilon.minosoft.data.entities.entities.Entity; import de.bixilon.minosoft.logging.Log; +import de.bixilon.minosoft.protocol.network.Connection; import de.bixilon.minosoft.protocol.packets.ClientboundPacket; import de.bixilon.minosoft.protocol.protocol.InByteBuffer; -import de.bixilon.minosoft.protocol.protocol.PacketHandler; -public class PacketAttachEntity implements ClientboundPacket { +public class PacketAttachEntity extends ClientboundPacket { int entityId; int vehicleId; boolean leash; @@ -36,8 +37,14 @@ public class PacketAttachEntity implements ClientboundPacket { } @Override - public void handle(PacketHandler h) { - h.handle(this); + public void handle(Connection connection) { + Entity entity = connection.getPlayer().getWorld().getEntity(getEntityId()); + if (entity == null) { + // thanks mojang + return; + } + entity.attachTo(getVehicleId()); + // ToDo leash support } @Override diff --git a/src/main/java/de/bixilon/minosoft/protocol/packets/clientbound/play/PacketBlockAction.java b/src/main/java/de/bixilon/minosoft/protocol/packets/clientbound/play/PacketBlockAction.java index 1fe557ae7..0bd39c10c 100644 --- a/src/main/java/de/bixilon/minosoft/protocol/packets/clientbound/play/PacketBlockAction.java +++ b/src/main/java/de/bixilon/minosoft/protocol/packets/clientbound/play/PacketBlockAction.java @@ -17,11 +17,12 @@ import de.bixilon.minosoft.data.mappings.BlockId; import de.bixilon.minosoft.data.mappings.blocks.actions.*; import de.bixilon.minosoft.data.world.BlockPosition; import de.bixilon.minosoft.logging.Log; +import de.bixilon.minosoft.modding.event.events.BlockActionEvent; +import de.bixilon.minosoft.protocol.network.Connection; import de.bixilon.minosoft.protocol.packets.ClientboundPacket; import de.bixilon.minosoft.protocol.protocol.InByteBuffer; -import de.bixilon.minosoft.protocol.protocol.PacketHandler; -public class PacketBlockAction implements ClientboundPacket { +public class PacketBlockAction extends ClientboundPacket { BlockPosition position; BlockAction data; @@ -58,8 +59,11 @@ public class PacketBlockAction implements ClientboundPacket { } @Override - public void handle(PacketHandler h) { - h.handle(this); + public void handle(Connection connection) { + BlockActionEvent event = new BlockActionEvent(connection, this); + if (connection.fireEvent(event)) { + return; + } } @Override diff --git a/src/main/java/de/bixilon/minosoft/protocol/packets/clientbound/play/PacketBlockBreakAnimation.java b/src/main/java/de/bixilon/minosoft/protocol/packets/clientbound/play/PacketBlockBreakAnimation.java index 89a73eb8b..9813b83dd 100644 --- a/src/main/java/de/bixilon/minosoft/protocol/packets/clientbound/play/PacketBlockBreakAnimation.java +++ b/src/main/java/de/bixilon/minosoft/protocol/packets/clientbound/play/PacketBlockBreakAnimation.java @@ -15,11 +15,12 @@ package de.bixilon.minosoft.protocol.packets.clientbound.play; import de.bixilon.minosoft.data.world.BlockPosition; import de.bixilon.minosoft.logging.Log; +import de.bixilon.minosoft.modding.event.events.BlockBreakAnimationEvent; +import de.bixilon.minosoft.protocol.network.Connection; import de.bixilon.minosoft.protocol.packets.ClientboundPacket; import de.bixilon.minosoft.protocol.protocol.InByteBuffer; -import de.bixilon.minosoft.protocol.protocol.PacketHandler; -public class PacketBlockBreakAnimation implements ClientboundPacket { +public class PacketBlockBreakAnimation extends ClientboundPacket { int entityId; BlockPosition position; byte stage; @@ -38,8 +39,11 @@ public class PacketBlockBreakAnimation implements ClientboundPacket { } @Override - public void handle(PacketHandler h) { - h.handle(this); + public void handle(Connection connection) { + BlockBreakAnimationEvent event = new BlockBreakAnimationEvent(connection, this); + if (connection.fireEvent(event)) { + return; + } } @Override diff --git a/src/main/java/de/bixilon/minosoft/protocol/packets/clientbound/play/PacketBlockChange.java b/src/main/java/de/bixilon/minosoft/protocol/packets/clientbound/play/PacketBlockChange.java index e889c0d41..fa12e50cd 100644 --- a/src/main/java/de/bixilon/minosoft/protocol/packets/clientbound/play/PacketBlockChange.java +++ b/src/main/java/de/bixilon/minosoft/protocol/packets/clientbound/play/PacketBlockChange.java @@ -15,12 +15,14 @@ package de.bixilon.minosoft.protocol.packets.clientbound.play; import de.bixilon.minosoft.data.mappings.blocks.Block; import de.bixilon.minosoft.data.world.BlockPosition; +import de.bixilon.minosoft.data.world.Chunk; import de.bixilon.minosoft.logging.Log; +import de.bixilon.minosoft.modding.event.events.BlockChangeEvent; +import de.bixilon.minosoft.protocol.network.Connection; import de.bixilon.minosoft.protocol.packets.ClientboundPacket; import de.bixilon.minosoft.protocol.protocol.InByteBuffer; -import de.bixilon.minosoft.protocol.protocol.PacketHandler; -public class PacketBlockChange implements ClientboundPacket { +public class PacketBlockChange extends ClientboundPacket { BlockPosition position; Block block; @@ -38,8 +40,15 @@ public class PacketBlockChange implements ClientboundPacket { } @Override - public void handle(PacketHandler h) { - h.handle(this); + public void handle(Connection connection) { + Chunk chunk = connection.getPlayer().getWorld().getChunk(getPosition().getChunkLocation()); + if (chunk == null) { + // thanks mojang + return; + } + connection.fireEvent(new BlockChangeEvent(connection, this)); + + chunk.setBlock(getPosition().getInChunkLocation(), getBlock()); } @Override diff --git a/src/main/java/de/bixilon/minosoft/protocol/packets/clientbound/play/PacketBlockEntityMetadata.java b/src/main/java/de/bixilon/minosoft/protocol/packets/clientbound/play/PacketBlockEntityMetadata.java index f5201eb5a..745a68ee5 100644 --- a/src/main/java/de/bixilon/minosoft/protocol/packets/clientbound/play/PacketBlockEntityMetadata.java +++ b/src/main/java/de/bixilon/minosoft/protocol/packets/clientbound/play/PacketBlockEntityMetadata.java @@ -18,12 +18,13 @@ import de.bixilon.minosoft.data.VersionValueMap; import de.bixilon.minosoft.data.entities.block.BlockEntityMetaData; import de.bixilon.minosoft.data.world.BlockPosition; import de.bixilon.minosoft.logging.Log; +import de.bixilon.minosoft.modding.event.events.BlockEntityMetaDataChangeEvent; +import de.bixilon.minosoft.protocol.network.Connection; import de.bixilon.minosoft.protocol.packets.ClientboundPacket; import de.bixilon.minosoft.protocol.protocol.InByteBuffer; -import de.bixilon.minosoft.protocol.protocol.PacketHandler; import de.bixilon.minosoft.util.nbt.tag.CompoundTag; -public class PacketBlockEntityMetadata implements ClientboundPacket { +public class PacketBlockEntityMetadata extends ClientboundPacket { BlockPosition position; BlockEntityActions action; BlockEntityMetaData data; @@ -43,8 +44,9 @@ public class PacketBlockEntityMetadata implements ClientboundPacket { } @Override - public void handle(PacketHandler h) { - h.handle(this); + public void handle(Connection connection) { + connection.fireEvent(new BlockEntityMetaDataChangeEvent(connection, this)); + connection.getPlayer().getWorld().setBlockEntityData(getPosition(), getData()); } @Override diff --git a/src/main/java/de/bixilon/minosoft/protocol/packets/clientbound/play/PacketBossBar.java b/src/main/java/de/bixilon/minosoft/protocol/packets/clientbound/play/PacketBossBar.java index 314d16537..896a19b3b 100644 --- a/src/main/java/de/bixilon/minosoft/protocol/packets/clientbound/play/PacketBossBar.java +++ b/src/main/java/de/bixilon/minosoft/protocol/packets/clientbound/play/PacketBossBar.java @@ -15,14 +15,15 @@ package de.bixilon.minosoft.protocol.packets.clientbound.play; import de.bixilon.minosoft.data.text.ChatComponent; import de.bixilon.minosoft.logging.Log; +import de.bixilon.minosoft.modding.event.events.BossBarChangeEvent; +import de.bixilon.minosoft.protocol.network.Connection; import de.bixilon.minosoft.protocol.packets.ClientboundPacket; import de.bixilon.minosoft.protocol.protocol.InByteBuffer; -import de.bixilon.minosoft.protocol.protocol.PacketHandler; import de.bixilon.minosoft.util.BitByte; import java.util.UUID; -public class PacketBossBar implements ClientboundPacket { +public class PacketBossBar extends ClientboundPacket { UUID uuid; BossBarActions action; @@ -57,8 +58,11 @@ public class PacketBossBar implements ClientboundPacket { } @Override - public void handle(PacketHandler h) { - h.handle(this); + public void handle(Connection connection) { + BossBarChangeEvent event = new BossBarChangeEvent(connection, this); + if (connection.fireEvent(event)) { + return; + } } @Override diff --git a/src/main/java/de/bixilon/minosoft/protocol/packets/clientbound/play/PacketCamera.java b/src/main/java/de/bixilon/minosoft/protocol/packets/clientbound/play/PacketCamera.java index 68465ca0b..bdd26af50 100644 --- a/src/main/java/de/bixilon/minosoft/protocol/packets/clientbound/play/PacketCamera.java +++ b/src/main/java/de/bixilon/minosoft/protocol/packets/clientbound/play/PacketCamera.java @@ -16,9 +16,8 @@ package de.bixilon.minosoft.protocol.packets.clientbound.play; import de.bixilon.minosoft.logging.Log; import de.bixilon.minosoft.protocol.packets.ClientboundPacket; import de.bixilon.minosoft.protocol.protocol.InByteBuffer; -import de.bixilon.minosoft.protocol.protocol.PacketHandler; -public class PacketCamera implements ClientboundPacket { +public class PacketCamera extends ClientboundPacket { int entityId; @Override @@ -27,11 +26,6 @@ public class PacketCamera implements ClientboundPacket { return true; } - @Override - public void handle(PacketHandler h) { - h.handle(this); - } - @Override public void log() { Log.protocol(String.format("[IN] Receiving camera packet (entityId=%d)", this.entityId)); diff --git a/src/main/java/de/bixilon/minosoft/protocol/packets/clientbound/play/PacketChangeGameState.java b/src/main/java/de/bixilon/minosoft/protocol/packets/clientbound/play/PacketChangeGameState.java index f7a7f443e..d1c80c254 100644 --- a/src/main/java/de/bixilon/minosoft/protocol/packets/clientbound/play/PacketChangeGameState.java +++ b/src/main/java/de/bixilon/minosoft/protocol/packets/clientbound/play/PacketChangeGameState.java @@ -13,14 +13,16 @@ package de.bixilon.minosoft.protocol.packets.clientbound.play; +import de.bixilon.minosoft.data.GameModes; import de.bixilon.minosoft.data.MapSet; import de.bixilon.minosoft.data.VersionValueMap; import de.bixilon.minosoft.logging.Log; +import de.bixilon.minosoft.modding.event.events.ChangeGameStateEvent; +import de.bixilon.minosoft.protocol.network.Connection; import de.bixilon.minosoft.protocol.packets.ClientboundPacket; import de.bixilon.minosoft.protocol.protocol.InByteBuffer; -import de.bixilon.minosoft.protocol.protocol.PacketHandler; -public class PacketChangeGameState implements ClientboundPacket { +public class PacketChangeGameState extends ClientboundPacket { Reason reason; float value; @@ -32,8 +34,24 @@ public class PacketChangeGameState implements ClientboundPacket { } @Override - public void handle(PacketHandler h) { - h.handle(this); + public void handle(Connection connection) { + ChangeGameStateEvent event = new ChangeGameStateEvent(connection, this); + if (connection.fireEvent(event)) { + return; + } + + Log.game(switch (getReason()) { + case START_RAINING -> "Received weather packet: Starting rain..."; + case STOP_RAINING -> "Received weather packet: Stopping rain..."; + case CHANGE_GAMEMODE -> String.format("Received game mode change: Now in %s", GameModes.byId(getIntValue())); + default -> ""; + }); + + switch (getReason()) { + case STOP_RAINING -> connection.getPlayer().getWorld().setRaining(false); + case START_RAINING -> connection.getPlayer().getWorld().setRaining(true); + case CHANGE_GAMEMODE -> connection.getPlayer().setGameMode(GameModes.byId(getIntValue())); + } } @Override diff --git a/src/main/java/de/bixilon/minosoft/protocol/packets/clientbound/play/PacketChatMessageReceiving.java b/src/main/java/de/bixilon/minosoft/protocol/packets/clientbound/play/PacketChatMessageReceiving.java index 053867602..1bf0b1094 100644 --- a/src/main/java/de/bixilon/minosoft/protocol/packets/clientbound/play/PacketChatMessageReceiving.java +++ b/src/main/java/de/bixilon/minosoft/protocol/packets/clientbound/play/PacketChatMessageReceiving.java @@ -16,13 +16,14 @@ package de.bixilon.minosoft.protocol.packets.clientbound.play; import de.bixilon.minosoft.data.ChatTextPositions; import de.bixilon.minosoft.data.text.ChatComponent; import de.bixilon.minosoft.logging.Log; +import de.bixilon.minosoft.modding.event.events.ChatMessageReceivingEvent; +import de.bixilon.minosoft.protocol.network.Connection; import de.bixilon.minosoft.protocol.packets.ClientboundPacket; import de.bixilon.minosoft.protocol.protocol.InByteBuffer; -import de.bixilon.minosoft.protocol.protocol.PacketHandler; import java.util.UUID; -public class PacketChatMessageReceiving implements ClientboundPacket { +public class PacketChatMessageReceiving extends ClientboundPacket { ChatComponent message; ChatTextPositions position; UUID sender; @@ -42,8 +43,16 @@ public class PacketChatMessageReceiving implements ClientboundPacket { } @Override - public void handle(PacketHandler h) { - h.handle(this); + public void handle(Connection connection) { + ChatMessageReceivingEvent event = new ChatMessageReceivingEvent(connection, this); + if (connection.fireEvent(event)) { + return; + } + Log.game(switch (getPosition()) { + case SYSTEM_MESSAGE -> "[SYSTEM] "; + case ABOVE_HOTBAR -> "[HOTBAR] "; + default -> "[CHAT] "; + } + event.getMessage()); } @Override diff --git a/src/main/java/de/bixilon/minosoft/protocol/packets/clientbound/play/PacketChunkBulk.java b/src/main/java/de/bixilon/minosoft/protocol/packets/clientbound/play/PacketChunkBulk.java index b601bd77b..fa5495811 100644 --- a/src/main/java/de/bixilon/minosoft/protocol/packets/clientbound/play/PacketChunkBulk.java +++ b/src/main/java/de/bixilon/minosoft/protocol/packets/clientbound/play/PacketChunkBulk.java @@ -16,15 +16,16 @@ package de.bixilon.minosoft.protocol.packets.clientbound.play; import de.bixilon.minosoft.data.world.Chunk; import de.bixilon.minosoft.data.world.ChunkLocation; import de.bixilon.minosoft.logging.Log; +import de.bixilon.minosoft.modding.event.events.ChunkDataChangeEvent; +import de.bixilon.minosoft.protocol.network.Connection; import de.bixilon.minosoft.protocol.packets.ClientboundPacket; import de.bixilon.minosoft.protocol.protocol.InByteBuffer; -import de.bixilon.minosoft.protocol.protocol.PacketHandler; import de.bixilon.minosoft.util.ChunkUtil; import de.bixilon.minosoft.util.Util; import java.util.HashMap; -public class PacketChunkBulk implements ClientboundPacket { +public class PacketChunkBulk extends ClientboundPacket { final HashMap chunks = new HashMap<>(); @Override @@ -73,8 +74,10 @@ public class PacketChunkBulk implements ClientboundPacket { } @Override - public void handle(PacketHandler h) { - h.handle(this); + public void handle(Connection connection) { + getChunks().forEach(((location, chunk) -> connection.fireEvent(new ChunkDataChangeEvent(connection, location, chunk)))); + + connection.getPlayer().getWorld().setChunks(getChunks()); } @Override diff --git a/src/main/java/de/bixilon/minosoft/protocol/packets/clientbound/play/PacketChunkData.java b/src/main/java/de/bixilon/minosoft/protocol/packets/clientbound/play/PacketChunkData.java index 311a85884..0cbb1a5ad 100644 --- a/src/main/java/de/bixilon/minosoft/protocol/packets/clientbound/play/PacketChunkData.java +++ b/src/main/java/de/bixilon/minosoft/protocol/packets/clientbound/play/PacketChunkData.java @@ -18,16 +18,18 @@ import de.bixilon.minosoft.data.world.BlockPosition; import de.bixilon.minosoft.data.world.Chunk; import de.bixilon.minosoft.data.world.ChunkLocation; import de.bixilon.minosoft.logging.Log; +import de.bixilon.minosoft.modding.event.events.BlockEntityMetaDataChangeEvent; +import de.bixilon.minosoft.modding.event.events.ChunkDataChangeEvent; +import de.bixilon.minosoft.protocol.network.Connection; import de.bixilon.minosoft.protocol.packets.ClientboundPacket; import de.bixilon.minosoft.protocol.protocol.InByteBuffer; -import de.bixilon.minosoft.protocol.protocol.PacketHandler; import de.bixilon.minosoft.util.ChunkUtil; import de.bixilon.minosoft.util.Util; import de.bixilon.minosoft.util.nbt.tag.CompoundTag; import java.util.HashMap; -public class PacketChunkData implements ClientboundPacket { +public class PacketChunkData extends ClientboundPacket { final HashMap blockEntities = new HashMap<>(); ChunkLocation location; Chunk chunk; @@ -117,8 +119,12 @@ public class PacketChunkData implements ClientboundPacket { } @Override - public void handle(PacketHandler h) { - h.handle(this); + public void handle(Connection connection) { + getBlockEntities().forEach(((position, compoundTag) -> connection.fireEvent(new BlockEntityMetaDataChangeEvent(connection, position, null, compoundTag)))); + connection.fireEvent(new ChunkDataChangeEvent(connection, this)); + + connection.getPlayer().getWorld().setChunk(getLocation(), getChunk()); + connection.getPlayer().getWorld().setBlockEntityData(getBlockEntities()); } @Override diff --git a/src/main/java/de/bixilon/minosoft/protocol/packets/clientbound/play/PacketCloseWindowReceiving.java b/src/main/java/de/bixilon/minosoft/protocol/packets/clientbound/play/PacketCloseWindowReceiving.java index cecffbff1..08f34ba6b 100644 --- a/src/main/java/de/bixilon/minosoft/protocol/packets/clientbound/play/PacketCloseWindowReceiving.java +++ b/src/main/java/de/bixilon/minosoft/protocol/packets/clientbound/play/PacketCloseWindowReceiving.java @@ -14,11 +14,12 @@ package de.bixilon.minosoft.protocol.packets.clientbound.play; import de.bixilon.minosoft.logging.Log; +import de.bixilon.minosoft.modding.event.events.CloseWindowEvent; +import de.bixilon.minosoft.protocol.network.Connection; import de.bixilon.minosoft.protocol.packets.ClientboundPacket; import de.bixilon.minosoft.protocol.protocol.InByteBuffer; -import de.bixilon.minosoft.protocol.protocol.PacketHandler; -public class PacketCloseWindowReceiving implements ClientboundPacket { +public class PacketCloseWindowReceiving extends ClientboundPacket { byte windowId; @Override @@ -28,8 +29,13 @@ public class PacketCloseWindowReceiving implements ClientboundPacket { } @Override - public void handle(PacketHandler h) { - h.handle(this); + public void handle(Connection connection) { + CloseWindowEvent event = new CloseWindowEvent(connection, this); + if (connection.fireEvent(event)) { + return; + } + + connection.getPlayer().deleteInventory(getWindowId()); } @Override diff --git a/src/main/java/de/bixilon/minosoft/protocol/packets/clientbound/play/PacketCollectItem.java b/src/main/java/de/bixilon/minosoft/protocol/packets/clientbound/play/PacketCollectItem.java index a77343414..0487d5fea 100644 --- a/src/main/java/de/bixilon/minosoft/protocol/packets/clientbound/play/PacketCollectItem.java +++ b/src/main/java/de/bixilon/minosoft/protocol/packets/clientbound/play/PacketCollectItem.java @@ -14,11 +14,12 @@ package de.bixilon.minosoft.protocol.packets.clientbound.play; import de.bixilon.minosoft.logging.Log; +import de.bixilon.minosoft.modding.event.events.CollectItemAnimationEvent; +import de.bixilon.minosoft.protocol.network.Connection; import de.bixilon.minosoft.protocol.packets.ClientboundPacket; import de.bixilon.minosoft.protocol.protocol.InByteBuffer; -import de.bixilon.minosoft.protocol.protocol.PacketHandler; -public class PacketCollectItem implements ClientboundPacket { +public class PacketCollectItem extends ClientboundPacket { int itemEntityId; int collectorEntityId; int count; @@ -38,8 +39,11 @@ public class PacketCollectItem implements ClientboundPacket { } @Override - public void handle(PacketHandler h) { - h.handle(this); + public void handle(Connection connection) { + if (connection.fireEvent(new CollectItemAnimationEvent(connection, this))) { + return; + } + // ToDo } @Override diff --git a/src/main/java/de/bixilon/minosoft/protocol/packets/clientbound/play/PacketCombatEvent.java b/src/main/java/de/bixilon/minosoft/protocol/packets/clientbound/play/PacketCombatEvent.java index 0e7624905..414e3dc05 100644 --- a/src/main/java/de/bixilon/minosoft/protocol/packets/clientbound/play/PacketCombatEvent.java +++ b/src/main/java/de/bixilon/minosoft/protocol/packets/clientbound/play/PacketCombatEvent.java @@ -17,9 +17,8 @@ import de.bixilon.minosoft.data.text.ChatComponent; import de.bixilon.minosoft.logging.Log; import de.bixilon.minosoft.protocol.packets.ClientboundPacket; import de.bixilon.minosoft.protocol.protocol.InByteBuffer; -import de.bixilon.minosoft.protocol.protocol.PacketHandler; -public class PacketCombatEvent implements ClientboundPacket { +public class PacketCombatEvent extends ClientboundPacket { CombatEvents action; int duration; @@ -44,11 +43,6 @@ public class PacketCombatEvent implements ClientboundPacket { return true; } - @Override - public void handle(PacketHandler h) { - h.handle(this); - } - @Override public void log() { switch (this.action) { diff --git a/src/main/java/de/bixilon/minosoft/protocol/packets/clientbound/play/PacketConfirmTransactionReceiving.java b/src/main/java/de/bixilon/minosoft/protocol/packets/clientbound/play/PacketConfirmTransactionReceiving.java index bf3d5ebcf..5c8312da4 100644 --- a/src/main/java/de/bixilon/minosoft/protocol/packets/clientbound/play/PacketConfirmTransactionReceiving.java +++ b/src/main/java/de/bixilon/minosoft/protocol/packets/clientbound/play/PacketConfirmTransactionReceiving.java @@ -16,9 +16,8 @@ package de.bixilon.minosoft.protocol.packets.clientbound.play; import de.bixilon.minosoft.logging.Log; import de.bixilon.minosoft.protocol.packets.ClientboundPacket; import de.bixilon.minosoft.protocol.protocol.InByteBuffer; -import de.bixilon.minosoft.protocol.protocol.PacketHandler; -public class PacketConfirmTransactionReceiving implements ClientboundPacket { +public class PacketConfirmTransactionReceiving extends ClientboundPacket { byte windowId; short actionNumber; boolean accepted; @@ -31,11 +30,6 @@ public class PacketConfirmTransactionReceiving implements ClientboundPacket { return true; } - @Override - public void handle(PacketHandler h) { - h.handle(this); - } - @Override public void log() { Log.protocol(String.format("[IN] Closing inventory (windowId=%d)", this.windowId)); diff --git a/src/main/java/de/bixilon/minosoft/protocol/packets/clientbound/play/PacketCraftRecipeResponse.java b/src/main/java/de/bixilon/minosoft/protocol/packets/clientbound/play/PacketCraftRecipeResponse.java index 8d4b59283..2171a546a 100644 --- a/src/main/java/de/bixilon/minosoft/protocol/packets/clientbound/play/PacketCraftRecipeResponse.java +++ b/src/main/java/de/bixilon/minosoft/protocol/packets/clientbound/play/PacketCraftRecipeResponse.java @@ -16,9 +16,8 @@ package de.bixilon.minosoft.protocol.packets.clientbound.play; import de.bixilon.minosoft.logging.Log; import de.bixilon.minosoft.protocol.packets.ClientboundPacket; import de.bixilon.minosoft.protocol.protocol.InByteBuffer; -import de.bixilon.minosoft.protocol.protocol.PacketHandler; -public class PacketCraftRecipeResponse implements ClientboundPacket { +public class PacketCraftRecipeResponse extends ClientboundPacket { byte windowId; int recipeId; String recipeName; @@ -35,11 +34,6 @@ public class PacketCraftRecipeResponse implements ClientboundPacket { return true; } - @Override - public void handle(PacketHandler h) { - h.handle(this); - } - @Override public void log() { Log.protocol(String.format("[IN] Received Crafting recipe response (windowId=%d, recipeId=%d)", this.windowId, this.recipeId)); diff --git a/src/main/java/de/bixilon/minosoft/protocol/packets/clientbound/play/PacketDeclareCommands.java b/src/main/java/de/bixilon/minosoft/protocol/packets/clientbound/play/PacketDeclareCommands.java index a1c9e4acb..5b9e14660 100644 --- a/src/main/java/de/bixilon/minosoft/protocol/packets/clientbound/play/PacketDeclareCommands.java +++ b/src/main/java/de/bixilon/minosoft/protocol/packets/clientbound/play/PacketDeclareCommands.java @@ -15,12 +15,13 @@ package de.bixilon.minosoft.protocol.packets.clientbound.play; import de.bixilon.minosoft.data.commands.CommandNode; import de.bixilon.minosoft.data.commands.CommandRootNode; +import de.bixilon.minosoft.data.commands.parser.exceptions.CommandParseException; import de.bixilon.minosoft.logging.Log; +import de.bixilon.minosoft.protocol.network.Connection; import de.bixilon.minosoft.protocol.packets.ClientboundPacket; import de.bixilon.minosoft.protocol.protocol.InByteBuffer; -import de.bixilon.minosoft.protocol.protocol.PacketHandler; -public class PacketDeclareCommands implements ClientboundPacket { +public class PacketDeclareCommands extends ClientboundPacket { private CommandRootNode rootNode; @Override @@ -35,8 +36,31 @@ public class PacketDeclareCommands implements ClientboundPacket { } @Override - public void handle(PacketHandler h) { - h.handle(this); + public void handle(Connection connection) { + connection.setCommandRootNode(getRootNode()); + // ToDo: Remove these dummy commands + String[] commands = { + "msg Bixilon TestReason 2Paramter 3 4 asd asd", + "msg @a[name=Bixilon, level=23, gamemode=!survival] trest asd 12312 sad123123213", + "help", + "team list", + "tasdasda", + "msg @a[ name = \"Bixilon\" ] asd", + "msg @a[ name = Bixilon ] asd asdsadasd", + "msg @a[ name = Bixilon ,team= ] asd asdsadasd", + "msg @a[ name = Bixilon , team =!] asd asdsadasd", + "give Bixilon minecraft:acacia_boat", + "give Bixilon minecraft:acacia_boat{asd:12}", + }; + for (String command : commands) { + try { + getRootNode().isSyntaxCorrect(connection, command); + Log.game("Command \"%s\" is valid", command); + } catch (CommandParseException e) { + Log.game("Command \"%s\" is invalid, %s: %s", command, e.getClass().getSimpleName(), e.getErrorMessage()); + e.printStackTrace(); + } + } } @Override diff --git a/src/main/java/de/bixilon/minosoft/protocol/packets/clientbound/play/PacketDeclareRecipes.java b/src/main/java/de/bixilon/minosoft/protocol/packets/clientbound/play/PacketDeclareRecipes.java index 584cc457c..056f1b8b4 100644 --- a/src/main/java/de/bixilon/minosoft/protocol/packets/clientbound/play/PacketDeclareRecipes.java +++ b/src/main/java/de/bixilon/minosoft/protocol/packets/clientbound/play/PacketDeclareRecipes.java @@ -20,11 +20,11 @@ import de.bixilon.minosoft.data.mappings.recipes.Ingredient; import de.bixilon.minosoft.data.mappings.recipes.Recipe; import de.bixilon.minosoft.data.mappings.recipes.RecipeTypes; import de.bixilon.minosoft.logging.Log; +import de.bixilon.minosoft.protocol.network.Connection; import de.bixilon.minosoft.protocol.packets.ClientboundPacket; import de.bixilon.minosoft.protocol.protocol.InByteBuffer; -import de.bixilon.minosoft.protocol.protocol.PacketHandler; -public class PacketDeclareRecipes implements ClientboundPacket { +public class PacketDeclareRecipes extends ClientboundPacket { private final HashBiMap recipes = HashBiMap.create(); @Override @@ -85,8 +85,8 @@ public class PacketDeclareRecipes implements ClientboundPacket { } @Override - public void handle(PacketHandler h) { - h.handle(this); + public void handle(Connection connection) { + connection.getRecipes().registerCustomRecipes(getRecipes()); } @Override diff --git a/src/main/java/de/bixilon/minosoft/protocol/packets/clientbound/play/PacketDestroyEntity.java b/src/main/java/de/bixilon/minosoft/protocol/packets/clientbound/play/PacketDestroyEntity.java index dbd10cfa5..c40567db3 100644 --- a/src/main/java/de/bixilon/minosoft/protocol/packets/clientbound/play/PacketDestroyEntity.java +++ b/src/main/java/de/bixilon/minosoft/protocol/packets/clientbound/play/PacketDestroyEntity.java @@ -14,13 +14,14 @@ package de.bixilon.minosoft.protocol.packets.clientbound.play; import de.bixilon.minosoft.logging.Log; +import de.bixilon.minosoft.modding.event.events.EntityDespawnEvent; +import de.bixilon.minosoft.protocol.network.Connection; import de.bixilon.minosoft.protocol.packets.ClientboundPacket; import de.bixilon.minosoft.protocol.protocol.InByteBuffer; -import de.bixilon.minosoft.protocol.protocol.PacketHandler; import java.util.Arrays; -public class PacketDestroyEntity implements ClientboundPacket { +public class PacketDestroyEntity extends ClientboundPacket { int[] entityIds; @Override @@ -38,8 +39,12 @@ public class PacketDestroyEntity implements ClientboundPacket { } @Override - public void handle(PacketHandler h) { - h.handle(this); + public void handle(Connection connection) { + connection.fireEvent(new EntityDespawnEvent(connection, this)); + + for (int entityId : getEntityIds()) { + connection.getPlayer().getWorld().removeEntity(entityId); + } } @Override diff --git a/src/main/java/de/bixilon/minosoft/protocol/packets/clientbound/play/PacketDisconnect.java b/src/main/java/de/bixilon/minosoft/protocol/packets/clientbound/play/PacketDisconnect.java index 89911658d..24c040c39 100644 --- a/src/main/java/de/bixilon/minosoft/protocol/packets/clientbound/play/PacketDisconnect.java +++ b/src/main/java/de/bixilon/minosoft/protocol/packets/clientbound/play/PacketDisconnect.java @@ -15,11 +15,12 @@ package de.bixilon.minosoft.protocol.packets.clientbound.play; import de.bixilon.minosoft.data.text.ChatComponent; import de.bixilon.minosoft.logging.Log; +import de.bixilon.minosoft.modding.event.events.LoginDisconnectEvent; +import de.bixilon.minosoft.protocol.network.Connection; import de.bixilon.minosoft.protocol.packets.ClientboundPacket; import de.bixilon.minosoft.protocol.protocol.InByteBuffer; -import de.bixilon.minosoft.protocol.protocol.PacketHandler; -public class PacketDisconnect implements ClientboundPacket { +public class PacketDisconnect extends ClientboundPacket { ChatComponent reason; @Override @@ -29,8 +30,10 @@ public class PacketDisconnect implements ClientboundPacket { } @Override - public void handle(PacketHandler h) { - h.handle(this); + public void handle(Connection connection) { + connection.fireEvent(new LoginDisconnectEvent(connection, this)); + // got kicked + connection.disconnect(); } @Override diff --git a/src/main/java/de/bixilon/minosoft/protocol/packets/clientbound/play/PacketEffect.java b/src/main/java/de/bixilon/minosoft/protocol/packets/clientbound/play/PacketEffect.java index 5c490ca9e..1e7af51d8 100644 --- a/src/main/java/de/bixilon/minosoft/protocol/packets/clientbound/play/PacketEffect.java +++ b/src/main/java/de/bixilon/minosoft/protocol/packets/clientbound/play/PacketEffect.java @@ -17,11 +17,12 @@ import de.bixilon.minosoft.data.MapSet; import de.bixilon.minosoft.data.VersionValueMap; import de.bixilon.minosoft.data.world.BlockPosition; import de.bixilon.minosoft.logging.Log; +import de.bixilon.minosoft.modding.event.events.EffectEvent; +import de.bixilon.minosoft.protocol.network.Connection; import de.bixilon.minosoft.protocol.packets.ClientboundPacket; import de.bixilon.minosoft.protocol.protocol.InByteBuffer; -import de.bixilon.minosoft.protocol.protocol.PacketHandler; -public class PacketEffect implements ClientboundPacket { +public class PacketEffect extends ClientboundPacket { EffectEffects effect; BlockPosition position; int data; @@ -41,8 +42,10 @@ public class PacketEffect implements ClientboundPacket { } @Override - public void handle(PacketHandler h) { - h.handle(this); + public void handle(Connection connection) { + if (connection.fireEvent(new EffectEvent(connection, this))) { + return; + } } @Override diff --git a/src/main/java/de/bixilon/minosoft/protocol/packets/clientbound/play/PacketEntityAnimation.java b/src/main/java/de/bixilon/minosoft/protocol/packets/clientbound/play/PacketEntityAnimation.java index f19bd430f..92cd22706 100644 --- a/src/main/java/de/bixilon/minosoft/protocol/packets/clientbound/play/PacketEntityAnimation.java +++ b/src/main/java/de/bixilon/minosoft/protocol/packets/clientbound/play/PacketEntityAnimation.java @@ -18,9 +18,8 @@ import de.bixilon.minosoft.data.VersionValueMap; import de.bixilon.minosoft.logging.Log; import de.bixilon.minosoft.protocol.packets.ClientboundPacket; import de.bixilon.minosoft.protocol.protocol.InByteBuffer; -import de.bixilon.minosoft.protocol.protocol.PacketHandler; -public class PacketEntityAnimation implements ClientboundPacket { +public class PacketEntityAnimation extends ClientboundPacket { int entityId; EntityAnimations animation; @@ -31,11 +30,6 @@ public class PacketEntityAnimation implements ClientboundPacket { return true; } - @Override - public void handle(PacketHandler h) { - h.handle(this); - } - @Override public void log() { Log.protocol(String.format("[IN] Play entity animation (entityId=%d, animation=%s)", this.entityId, this.animation)); diff --git a/src/main/java/de/bixilon/minosoft/protocol/packets/clientbound/play/PacketEntityEffect.java b/src/main/java/de/bixilon/minosoft/protocol/packets/clientbound/play/PacketEntityEffect.java index ba75d16b9..a9f5107aa 100644 --- a/src/main/java/de/bixilon/minosoft/protocol/packets/clientbound/play/PacketEntityEffect.java +++ b/src/main/java/de/bixilon/minosoft/protocol/packets/clientbound/play/PacketEntityEffect.java @@ -14,13 +14,14 @@ package de.bixilon.minosoft.protocol.packets.clientbound.play; import de.bixilon.minosoft.data.entities.StatusEffect; +import de.bixilon.minosoft.data.entities.entities.Entity; import de.bixilon.minosoft.logging.Log; +import de.bixilon.minosoft.protocol.network.Connection; import de.bixilon.minosoft.protocol.packets.ClientboundPacket; import de.bixilon.minosoft.protocol.protocol.InByteBuffer; -import de.bixilon.minosoft.protocol.protocol.PacketHandler; import de.bixilon.minosoft.util.BitByte; -public class PacketEntityEffect implements ClientboundPacket { +public class PacketEntityEffect extends ClientboundPacket { int entityId; StatusEffect effect; boolean isAmbient; @@ -51,8 +52,13 @@ public class PacketEntityEffect implements ClientboundPacket { } @Override - public void handle(PacketHandler h) { - h.handle(this); + public void handle(Connection connection) { + Entity entity = connection.getPlayer().getWorld().getEntity(getEntityId()); + if (entity == null) { + // thanks mojang + return; + } + entity.addEffect(getEffect()); } @Override diff --git a/src/main/java/de/bixilon/minosoft/protocol/packets/clientbound/play/PacketEntityEquipment.java b/src/main/java/de/bixilon/minosoft/protocol/packets/clientbound/play/PacketEntityEquipment.java index 83f8683de..732b328b2 100644 --- a/src/main/java/de/bixilon/minosoft/protocol/packets/clientbound/play/PacketEntityEquipment.java +++ b/src/main/java/de/bixilon/minosoft/protocol/packets/clientbound/play/PacketEntityEquipment.java @@ -13,17 +13,19 @@ package de.bixilon.minosoft.protocol.packets.clientbound.play; +import de.bixilon.minosoft.data.entities.entities.Entity; import de.bixilon.minosoft.data.inventory.InventorySlots; import de.bixilon.minosoft.data.inventory.Slot; import de.bixilon.minosoft.logging.Log; +import de.bixilon.minosoft.modding.event.events.EntityEquipmentChangeEvent; +import de.bixilon.minosoft.protocol.network.Connection; import de.bixilon.minosoft.protocol.packets.ClientboundPacket; import de.bixilon.minosoft.protocol.protocol.InByteBuffer; -import de.bixilon.minosoft.protocol.protocol.PacketHandler; import java.util.HashMap; import java.util.Map; -public class PacketEntityEquipment implements ClientboundPacket { +public class PacketEntityEquipment extends ClientboundPacket { final HashMap slots = new HashMap<>(); int entityId; @@ -51,8 +53,15 @@ public class PacketEntityEquipment implements ClientboundPacket { } @Override - public void handle(PacketHandler h) { - h.handle(this); + public void handle(Connection connection) { + connection.fireEvent(new EntityEquipmentChangeEvent(connection, this)); + + Entity entity = connection.getPlayer().getWorld().getEntity(getEntityId()); + if (entity == null) { + // thanks mojang + return; + } + entity.setEquipment(getSlots()); } @Override diff --git a/src/main/java/de/bixilon/minosoft/protocol/packets/clientbound/play/PacketEntityEvent.java b/src/main/java/de/bixilon/minosoft/protocol/packets/clientbound/play/PacketEntityEvent.java index eeec4f974..4eabbe61a 100644 --- a/src/main/java/de/bixilon/minosoft/protocol/packets/clientbound/play/PacketEntityEvent.java +++ b/src/main/java/de/bixilon/minosoft/protocol/packets/clientbound/play/PacketEntityEvent.java @@ -16,9 +16,8 @@ package de.bixilon.minosoft.protocol.packets.clientbound.play; import de.bixilon.minosoft.logging.Log; import de.bixilon.minosoft.protocol.packets.ClientboundPacket; import de.bixilon.minosoft.protocol.protocol.InByteBuffer; -import de.bixilon.minosoft.protocol.protocol.PacketHandler; -public class PacketEntityEvent implements ClientboundPacket { +public class PacketEntityEvent extends ClientboundPacket { int entityId; byte eventId; @@ -29,11 +28,6 @@ public class PacketEntityEvent implements ClientboundPacket { return true; } - @Override - public void handle(PacketHandler h) { - h.handle(this); - } - @Override public void log() { Log.protocol(String.format("[IN] Entity status: (entityId=%d, eventId=%s)", this.entityId, this.eventId)); diff --git a/src/main/java/de/bixilon/minosoft/protocol/packets/clientbound/play/PacketEntityHeadRotation.java b/src/main/java/de/bixilon/minosoft/protocol/packets/clientbound/play/PacketEntityHeadRotation.java index 20c3c918f..018131b59 100644 --- a/src/main/java/de/bixilon/minosoft/protocol/packets/clientbound/play/PacketEntityHeadRotation.java +++ b/src/main/java/de/bixilon/minosoft/protocol/packets/clientbound/play/PacketEntityHeadRotation.java @@ -13,12 +13,13 @@ package de.bixilon.minosoft.protocol.packets.clientbound.play; +import de.bixilon.minosoft.data.entities.entities.Entity; import de.bixilon.minosoft.logging.Log; +import de.bixilon.minosoft.protocol.network.Connection; import de.bixilon.minosoft.protocol.packets.ClientboundPacket; import de.bixilon.minosoft.protocol.protocol.InByteBuffer; -import de.bixilon.minosoft.protocol.protocol.PacketHandler; -public class PacketEntityHeadRotation implements ClientboundPacket { +public class PacketEntityHeadRotation extends ClientboundPacket { int entityId; short headYaw; @@ -31,8 +32,13 @@ public class PacketEntityHeadRotation implements ClientboundPacket { } @Override - public void handle(PacketHandler h) { - h.handle(this); + public void handle(Connection connection) { + Entity entity = connection.getPlayer().getWorld().getEntity(getEntityId()); + if (entity == null) { + // thanks mojang + return; + } + entity.setHeadRotation(getHeadYaw()); } @Override diff --git a/src/main/java/de/bixilon/minosoft/protocol/packets/clientbound/play/PacketEntityInitialisation.java b/src/main/java/de/bixilon/minosoft/protocol/packets/clientbound/play/PacketEntityInitialisation.java index c8fbb9ab9..2c3494786 100644 --- a/src/main/java/de/bixilon/minosoft/protocol/packets/clientbound/play/PacketEntityInitialisation.java +++ b/src/main/java/de/bixilon/minosoft/protocol/packets/clientbound/play/PacketEntityInitialisation.java @@ -16,9 +16,8 @@ package de.bixilon.minosoft.protocol.packets.clientbound.play; import de.bixilon.minosoft.logging.Log; import de.bixilon.minosoft.protocol.packets.ClientboundPacket; import de.bixilon.minosoft.protocol.protocol.InByteBuffer; -import de.bixilon.minosoft.protocol.protocol.PacketHandler; -public class PacketEntityInitialisation implements ClientboundPacket { +public class PacketEntityInitialisation extends ClientboundPacket { int entityId; @Override @@ -27,11 +26,6 @@ public class PacketEntityInitialisation implements ClientboundPacket { return true; } - @Override - public void handle(PacketHandler h) { - h.handle(this); - } - @Override public void log() { Log.protocol(String.format("[IN] Initialising entity (entityId=%d)", this.entityId)); diff --git a/src/main/java/de/bixilon/minosoft/protocol/packets/clientbound/play/PacketEntityMetadata.java b/src/main/java/de/bixilon/minosoft/protocol/packets/clientbound/play/PacketEntityMetadata.java index a25322b4c..67f358c06 100644 --- a/src/main/java/de/bixilon/minosoft/protocol/packets/clientbound/play/PacketEntityMetadata.java +++ b/src/main/java/de/bixilon/minosoft/protocol/packets/clientbound/play/PacketEntityMetadata.java @@ -14,12 +14,13 @@ package de.bixilon.minosoft.protocol.packets.clientbound.play; import de.bixilon.minosoft.data.entities.EntityMetaData; +import de.bixilon.minosoft.data.entities.entities.Entity; import de.bixilon.minosoft.logging.Log; +import de.bixilon.minosoft.protocol.network.Connection; import de.bixilon.minosoft.protocol.packets.ClientboundPacket; import de.bixilon.minosoft.protocol.protocol.InByteBuffer; -import de.bixilon.minosoft.protocol.protocol.PacketHandler; -public class PacketEntityMetadata implements ClientboundPacket { +public class PacketEntityMetadata extends ClientboundPacket { int entityId; EntityMetaData entityMetaData; @@ -31,8 +32,13 @@ public class PacketEntityMetadata implements ClientboundPacket { } @Override - public void handle(PacketHandler h) { - h.handle(this); + public void handle(Connection connection) { + Entity entity = connection.getPlayer().getWorld().getEntity(getEntityId()); + if (entity == null) { + // thanks mojang + return; + } + entity.setMetaData(getEntityData()); } @Override diff --git a/src/main/java/de/bixilon/minosoft/protocol/packets/clientbound/play/PacketEntityMovement.java b/src/main/java/de/bixilon/minosoft/protocol/packets/clientbound/play/PacketEntityMovement.java index 16eb6f5a8..6722aef43 100644 --- a/src/main/java/de/bixilon/minosoft/protocol/packets/clientbound/play/PacketEntityMovement.java +++ b/src/main/java/de/bixilon/minosoft/protocol/packets/clientbound/play/PacketEntityMovement.java @@ -14,12 +14,13 @@ package de.bixilon.minosoft.protocol.packets.clientbound.play; import de.bixilon.minosoft.data.entities.RelativeLocation; +import de.bixilon.minosoft.data.entities.entities.Entity; import de.bixilon.minosoft.logging.Log; +import de.bixilon.minosoft.protocol.network.Connection; import de.bixilon.minosoft.protocol.packets.ClientboundPacket; import de.bixilon.minosoft.protocol.protocol.InByteBuffer; -import de.bixilon.minosoft.protocol.protocol.PacketHandler; -public class PacketEntityMovement implements ClientboundPacket { +public class PacketEntityMovement extends ClientboundPacket { int entityId; RelativeLocation location; boolean onGround; @@ -39,8 +40,13 @@ public class PacketEntityMovement implements ClientboundPacket { } @Override - public void handle(PacketHandler h) { - h.handle(this); + public void handle(Connection connection) { + Entity entity = connection.getPlayer().getWorld().getEntity(getEntityId()); + if (entity == null) { + // thanks mojang + return; + } + entity.setLocation(getRelativeLocation()); } @Override diff --git a/src/main/java/de/bixilon/minosoft/protocol/packets/clientbound/play/PacketEntityMovementAndRotation.java b/src/main/java/de/bixilon/minosoft/protocol/packets/clientbound/play/PacketEntityMovementAndRotation.java index 74220262e..7d1703ef5 100644 --- a/src/main/java/de/bixilon/minosoft/protocol/packets/clientbound/play/PacketEntityMovementAndRotation.java +++ b/src/main/java/de/bixilon/minosoft/protocol/packets/clientbound/play/PacketEntityMovementAndRotation.java @@ -14,12 +14,13 @@ package de.bixilon.minosoft.protocol.packets.clientbound.play; import de.bixilon.minosoft.data.entities.RelativeLocation; +import de.bixilon.minosoft.data.entities.entities.Entity; import de.bixilon.minosoft.logging.Log; +import de.bixilon.minosoft.protocol.network.Connection; import de.bixilon.minosoft.protocol.packets.ClientboundPacket; import de.bixilon.minosoft.protocol.protocol.InByteBuffer; -import de.bixilon.minosoft.protocol.protocol.PacketHandler; -public class PacketEntityMovementAndRotation implements ClientboundPacket { +public class PacketEntityMovementAndRotation extends ClientboundPacket { int entityId; RelativeLocation location; short yaw; @@ -44,8 +45,14 @@ public class PacketEntityMovementAndRotation implements ClientboundPacket { } @Override - public void handle(PacketHandler h) { - h.handle(this); + public void handle(Connection connection) { + Entity entity = connection.getPlayer().getWorld().getEntity(getEntityId()); + if (entity == null) { + // thanks mojang + return; + } + entity.setLocation(getRelativeLocation()); + entity.setRotation(getYaw(), getPitch()); } @Override diff --git a/src/main/java/de/bixilon/minosoft/protocol/packets/clientbound/play/PacketEntityProperties.java b/src/main/java/de/bixilon/minosoft/protocol/packets/clientbound/play/PacketEntityProperties.java index a89d48301..7fe5b1120 100644 --- a/src/main/java/de/bixilon/minosoft/protocol/packets/clientbound/play/PacketEntityProperties.java +++ b/src/main/java/de/bixilon/minosoft/protocol/packets/clientbound/play/PacketEntityProperties.java @@ -18,12 +18,11 @@ import de.bixilon.minosoft.data.entities.EntityPropertyKeys; import de.bixilon.minosoft.logging.Log; import de.bixilon.minosoft.protocol.packets.ClientboundPacket; import de.bixilon.minosoft.protocol.protocol.InByteBuffer; -import de.bixilon.minosoft.protocol.protocol.PacketHandler; import java.util.HashMap; import java.util.UUID; -public class PacketEntityProperties implements ClientboundPacket { +public class PacketEntityProperties extends ClientboundPacket { final HashMap properties = new HashMap<>(); int entityId; @@ -62,11 +61,6 @@ public class PacketEntityProperties implements ClientboundPacket { return true; } - @Override - public void handle(PacketHandler h) { - h.handle(this); - } - @Override public void log() { Log.protocol(String.format("[IN] Received entity properties (entityId=%d)", this.entityId)); diff --git a/src/main/java/de/bixilon/minosoft/protocol/packets/clientbound/play/PacketEntityRotation.java b/src/main/java/de/bixilon/minosoft/protocol/packets/clientbound/play/PacketEntityRotation.java index 8689f6ffa..34e6fd8da 100644 --- a/src/main/java/de/bixilon/minosoft/protocol/packets/clientbound/play/PacketEntityRotation.java +++ b/src/main/java/de/bixilon/minosoft/protocol/packets/clientbound/play/PacketEntityRotation.java @@ -13,12 +13,13 @@ package de.bixilon.minosoft.protocol.packets.clientbound.play; +import de.bixilon.minosoft.data.entities.entities.Entity; import de.bixilon.minosoft.logging.Log; +import de.bixilon.minosoft.protocol.network.Connection; import de.bixilon.minosoft.protocol.packets.ClientboundPacket; import de.bixilon.minosoft.protocol.protocol.InByteBuffer; -import de.bixilon.minosoft.protocol.protocol.PacketHandler; -public class PacketEntityRotation implements ClientboundPacket { +public class PacketEntityRotation extends ClientboundPacket { int entityId; short yaw; short pitch; @@ -38,8 +39,13 @@ public class PacketEntityRotation implements ClientboundPacket { } @Override - public void handle(PacketHandler h) { - h.handle(this); + public void handle(Connection connection) { + Entity entity = connection.getPlayer().getWorld().getEntity(getEntityId()); + if (entity == null) { + // thanks mojang + return; + } + entity.setRotation(getYaw(), getPitch()); } @Override diff --git a/src/main/java/de/bixilon/minosoft/protocol/packets/clientbound/play/PacketEntitySoundEffect.java b/src/main/java/de/bixilon/minosoft/protocol/packets/clientbound/play/PacketEntitySoundEffect.java index 671ce71b4..0192646e3 100644 --- a/src/main/java/de/bixilon/minosoft/protocol/packets/clientbound/play/PacketEntitySoundEffect.java +++ b/src/main/java/de/bixilon/minosoft/protocol/packets/clientbound/play/PacketEntitySoundEffect.java @@ -17,9 +17,8 @@ import de.bixilon.minosoft.data.SoundCategories; import de.bixilon.minosoft.logging.Log; import de.bixilon.minosoft.protocol.packets.ClientboundPacket; import de.bixilon.minosoft.protocol.protocol.InByteBuffer; -import de.bixilon.minosoft.protocol.protocol.PacketHandler; -public class PacketEntitySoundEffect implements ClientboundPacket { +public class PacketEntitySoundEffect extends ClientboundPacket { int soundId; SoundCategories category; int entityId; @@ -36,11 +35,6 @@ public class PacketEntitySoundEffect implements ClientboundPacket { return true; } - @Override - public void handle(PacketHandler h) { - h.handle(this); - } - @Override public void log() { Log.protocol(String.format("[IN] Play sound entity effect (soundId=%d, category=%s, entityId=%d, volume=%s, pitch=%s)", this.soundId, this.category, this.entityId, this.volume, this.pitch)); diff --git a/src/main/java/de/bixilon/minosoft/protocol/packets/clientbound/play/PacketEntityTeleport.java b/src/main/java/de/bixilon/minosoft/protocol/packets/clientbound/play/PacketEntityTeleport.java index 3f3c23009..b5488d94f 100644 --- a/src/main/java/de/bixilon/minosoft/protocol/packets/clientbound/play/PacketEntityTeleport.java +++ b/src/main/java/de/bixilon/minosoft/protocol/packets/clientbound/play/PacketEntityTeleport.java @@ -14,12 +14,13 @@ package de.bixilon.minosoft.protocol.packets.clientbound.play; import de.bixilon.minosoft.data.entities.Location; +import de.bixilon.minosoft.data.entities.entities.Entity; import de.bixilon.minosoft.logging.Log; +import de.bixilon.minosoft.protocol.network.Connection; import de.bixilon.minosoft.protocol.packets.ClientboundPacket; import de.bixilon.minosoft.protocol.protocol.InByteBuffer; -import de.bixilon.minosoft.protocol.protocol.PacketHandler; -public class PacketEntityTeleport implements ClientboundPacket { +public class PacketEntityTeleport extends ClientboundPacket { int entityId; Location location; short yaw; @@ -45,8 +46,14 @@ public class PacketEntityTeleport implements ClientboundPacket { } @Override - public void handle(PacketHandler h) { - h.handle(this); + public void handle(Connection connection) { + Entity entity = connection.getPlayer().getWorld().getEntity(getEntityId()); + if (entity == null) { + // thanks mojang + return; + } + entity.setLocation(getRelativeLocation()); + entity.setRotation(getYaw(), getPitch()); } @Override diff --git a/src/main/java/de/bixilon/minosoft/protocol/packets/clientbound/play/PacketEntityVelocity.java b/src/main/java/de/bixilon/minosoft/protocol/packets/clientbound/play/PacketEntityVelocity.java index 619cfdcd1..bea5e7419 100644 --- a/src/main/java/de/bixilon/minosoft/protocol/packets/clientbound/play/PacketEntityVelocity.java +++ b/src/main/java/de/bixilon/minosoft/protocol/packets/clientbound/play/PacketEntityVelocity.java @@ -14,12 +14,13 @@ package de.bixilon.minosoft.protocol.packets.clientbound.play; import de.bixilon.minosoft.data.entities.Velocity; +import de.bixilon.minosoft.data.entities.entities.Entity; import de.bixilon.minosoft.logging.Log; +import de.bixilon.minosoft.protocol.network.Connection; import de.bixilon.minosoft.protocol.packets.ClientboundPacket; import de.bixilon.minosoft.protocol.protocol.InByteBuffer; -import de.bixilon.minosoft.protocol.protocol.PacketHandler; -public class PacketEntityVelocity implements ClientboundPacket { +public class PacketEntityVelocity extends ClientboundPacket { int entityId; Velocity velocity; @@ -32,8 +33,14 @@ public class PacketEntityVelocity implements ClientboundPacket { } @Override - public void handle(PacketHandler h) { - h.handle(this); + public void handle(Connection connection) { + Entity entity = connection.getPlayer().getWorld().getEntity(getEntityId()); + + if (entity == null) { + // thanks mojang + return; + } + connection.getVelocityHandler().handleVelocity(entity, getVelocity()); } @Override diff --git a/src/main/java/de/bixilon/minosoft/protocol/packets/clientbound/play/PacketExplosion.java b/src/main/java/de/bixilon/minosoft/protocol/packets/clientbound/play/PacketExplosion.java index 13003524e..b65da731b 100644 --- a/src/main/java/de/bixilon/minosoft/protocol/packets/clientbound/play/PacketExplosion.java +++ b/src/main/java/de/bixilon/minosoft/protocol/packets/clientbound/play/PacketExplosion.java @@ -14,12 +14,13 @@ package de.bixilon.minosoft.protocol.packets.clientbound.play; import de.bixilon.minosoft.data.entities.Location; +import de.bixilon.minosoft.data.world.BlockPosition; import de.bixilon.minosoft.logging.Log; +import de.bixilon.minosoft.protocol.network.Connection; import de.bixilon.minosoft.protocol.packets.ClientboundPacket; import de.bixilon.minosoft.protocol.protocol.InByteBuffer; -import de.bixilon.minosoft.protocol.protocol.PacketHandler; -public class PacketExplosion implements ClientboundPacket { +public class PacketExplosion extends ClientboundPacket { Location location; float radius; byte[][] records; @@ -49,8 +50,16 @@ public class PacketExplosion implements ClientboundPacket { } @Override - public void handle(PacketHandler h) { - h.handle(this); + public void handle(Connection connection) { + // remove all blocks set by explosion + for (byte[] record : getRecords()) { + int x = ((int) getLocation().getX()) + record[0]; + int y = ((int) getLocation().getY()) + record[1]; + int z = ((int) getLocation().getZ()) + record[2]; + BlockPosition blockPosition = new BlockPosition(x, (short) y, z); + connection.getPlayer().getWorld().setBlock(blockPosition, null); + } + // ToDo: motion support } @Override diff --git a/src/main/java/de/bixilon/minosoft/protocol/packets/clientbound/play/PacketFacePlayer.java b/src/main/java/de/bixilon/minosoft/protocol/packets/clientbound/play/PacketFacePlayer.java index 7a1bfa15e..f348b05c3 100644 --- a/src/main/java/de/bixilon/minosoft/protocol/packets/clientbound/play/PacketFacePlayer.java +++ b/src/main/java/de/bixilon/minosoft/protocol/packets/clientbound/play/PacketFacePlayer.java @@ -17,9 +17,8 @@ import de.bixilon.minosoft.data.entities.Location; import de.bixilon.minosoft.logging.Log; import de.bixilon.minosoft.protocol.packets.ClientboundPacket; import de.bixilon.minosoft.protocol.protocol.InByteBuffer; -import de.bixilon.minosoft.protocol.protocol.PacketHandler; -public class PacketFacePlayer implements ClientboundPacket { +public class PacketFacePlayer extends ClientboundPacket { PlayerFaces face; Location location; int entityId = -1; @@ -37,11 +36,6 @@ public class PacketFacePlayer implements ClientboundPacket { return true; } - @Override - public void handle(PacketHandler h) { - h.handle(this); - } - @Override public void log() { Log.protocol(String.format("[IN] Received face player packet (face=%s, location=%s, entityId=%d, entityFace=%s)", this.face, this.location, this.entityId, this.entityFace)); diff --git a/src/main/java/de/bixilon/minosoft/protocol/packets/clientbound/play/PacketHeldItemChangeReceiving.java b/src/main/java/de/bixilon/minosoft/protocol/packets/clientbound/play/PacketHeldItemChangeReceiving.java index 18defdb27..c224ac7fc 100644 --- a/src/main/java/de/bixilon/minosoft/protocol/packets/clientbound/play/PacketHeldItemChangeReceiving.java +++ b/src/main/java/de/bixilon/minosoft/protocol/packets/clientbound/play/PacketHeldItemChangeReceiving.java @@ -14,11 +14,11 @@ package de.bixilon.minosoft.protocol.packets.clientbound.play; import de.bixilon.minosoft.logging.Log; +import de.bixilon.minosoft.protocol.network.Connection; import de.bixilon.minosoft.protocol.packets.ClientboundPacket; import de.bixilon.minosoft.protocol.protocol.InByteBuffer; -import de.bixilon.minosoft.protocol.protocol.PacketHandler; -public class PacketHeldItemChangeReceiving implements ClientboundPacket { +public class PacketHeldItemChangeReceiving extends ClientboundPacket { byte slot; @Override @@ -28,8 +28,8 @@ public class PacketHeldItemChangeReceiving implements ClientboundPacket { } @Override - public void handle(PacketHandler h) { - h.handle(this); + public void handle(Connection connection) { + connection.getPlayer().setSelectedSlot(getSlot()); } @Override diff --git a/src/main/java/de/bixilon/minosoft/protocol/packets/clientbound/play/PacketJoinGame.java b/src/main/java/de/bixilon/minosoft/protocol/packets/clientbound/play/PacketJoinGame.java index 47a2ec244..aa24f5552 100644 --- a/src/main/java/de/bixilon/minosoft/protocol/packets/clientbound/play/PacketJoinGame.java +++ b/src/main/java/de/bixilon/minosoft/protocol/packets/clientbound/play/PacketJoinGame.java @@ -17,11 +17,13 @@ import com.google.common.collect.HashBiMap; import de.bixilon.minosoft.data.Difficulties; import de.bixilon.minosoft.data.GameModes; import de.bixilon.minosoft.data.LevelTypes; +import de.bixilon.minosoft.data.entities.entities.player.PlayerEntity; import de.bixilon.minosoft.data.mappings.Dimension; import de.bixilon.minosoft.logging.Log; +import de.bixilon.minosoft.modding.event.events.JoinGameEvent; +import de.bixilon.minosoft.protocol.network.Connection; import de.bixilon.minosoft.protocol.packets.ClientboundPacket; import de.bixilon.minosoft.protocol.protocol.InByteBuffer; -import de.bixilon.minosoft.protocol.protocol.PacketHandler; import de.bixilon.minosoft.protocol.protocol.ProtocolDefinition; import de.bixilon.minosoft.util.BitByte; import de.bixilon.minosoft.util.nbt.tag.CompoundTag; @@ -30,7 +32,7 @@ import de.bixilon.minosoft.util.nbt.tag.NBTTag; import java.util.HashMap; -public class PacketJoinGame implements ClientboundPacket { +public class PacketJoinGame extends ClientboundPacket { int entityId; boolean hardcore; GameModes gameMode; @@ -140,8 +142,19 @@ public class PacketJoinGame implements ClientboundPacket { } @Override - public void handle(PacketHandler h) { - h.handle(this); + public void handle(Connection connection) { + if (connection.fireEvent(new JoinGameEvent(connection, this))) { + return; + } + + connection.getPlayer().setGameMode(getGameMode()); + connection.getPlayer().getWorld().setHardcore(isHardcore()); + connection.getMapping().setDimensions(getDimensions()); + connection.getPlayer().getWorld().setDimension(getDimension()); + PlayerEntity entity = new PlayerEntity(connection, getEntityId(), connection.getPlayer().getPlayerUUID(), null, null, connection.getPlayer().getPlayerName(), null, null); + connection.getPlayer().setEntity(entity); + connection.getPlayer().getWorld().addEntity(entity); + connection.getSender().sendChatMessage("I am alive! ~ Minosoft"); } private HashMap> parseDimensionCodec(NBTTag nbt, int versionId) { diff --git a/src/main/java/de/bixilon/minosoft/protocol/packets/clientbound/play/PacketKeepAlive.java b/src/main/java/de/bixilon/minosoft/protocol/packets/clientbound/play/PacketKeepAlive.java index 6a28261dc..4c26b92bc 100644 --- a/src/main/java/de/bixilon/minosoft/protocol/packets/clientbound/play/PacketKeepAlive.java +++ b/src/main/java/de/bixilon/minosoft/protocol/packets/clientbound/play/PacketKeepAlive.java @@ -14,12 +14,13 @@ package de.bixilon.minosoft.protocol.packets.clientbound.play; import de.bixilon.minosoft.logging.Log; +import de.bixilon.minosoft.protocol.network.Connection; import de.bixilon.minosoft.protocol.packets.ClientboundPacket; +import de.bixilon.minosoft.protocol.packets.serverbound.play.PacketKeepAliveResponse; import de.bixilon.minosoft.protocol.protocol.InByteBuffer; -import de.bixilon.minosoft.protocol.protocol.PacketHandler; -public class PacketKeepAlive implements ClientboundPacket { - long id; +public class PacketKeepAlive extends ClientboundPacket { + private long id; @Override public boolean read(InByteBuffer buffer) { @@ -36,8 +37,8 @@ public class PacketKeepAlive implements ClientboundPacket { } @Override - public void handle(PacketHandler h) { - h.handle(this); + public void handle(Connection connection) { + connection.sendPacket(new PacketKeepAliveResponse(getId())); } @Override diff --git a/src/main/java/de/bixilon/minosoft/protocol/packets/clientbound/play/PacketMapData.java b/src/main/java/de/bixilon/minosoft/protocol/packets/clientbound/play/PacketMapData.java index 52a005bab..8cf1cc71a 100644 --- a/src/main/java/de/bixilon/minosoft/protocol/packets/clientbound/play/PacketMapData.java +++ b/src/main/java/de/bixilon/minosoft/protocol/packets/clientbound/play/PacketMapData.java @@ -17,11 +17,10 @@ import de.bixilon.minosoft.data.text.ChatComponent; import de.bixilon.minosoft.logging.Log; import de.bixilon.minosoft.protocol.packets.ClientboundPacket; import de.bixilon.minosoft.protocol.protocol.InByteBuffer; -import de.bixilon.minosoft.protocol.protocol.PacketHandler; import java.util.ArrayList; -public class PacketMapData implements ClientboundPacket { +public class PacketMapData extends ClientboundPacket { int mapId; PacketMapDataDataActions dataData; @@ -119,11 +118,6 @@ public class PacketMapData implements ClientboundPacket { return true; } - @Override - public void handle(PacketHandler h) { - h.handle(this); - } - @Override public void log() { Log.protocol(String.format("[IN] Received map meta data (mapId=%d)", this.mapId)); diff --git a/src/main/java/de/bixilon/minosoft/protocol/packets/clientbound/play/PacketMultiBlockChange.java b/src/main/java/de/bixilon/minosoft/protocol/packets/clientbound/play/PacketMultiBlockChange.java index 5315acb79..8f761203b 100644 --- a/src/main/java/de/bixilon/minosoft/protocol/packets/clientbound/play/PacketMultiBlockChange.java +++ b/src/main/java/de/bixilon/minosoft/protocol/packets/clientbound/play/PacketMultiBlockChange.java @@ -14,16 +14,18 @@ package de.bixilon.minosoft.protocol.packets.clientbound.play; import de.bixilon.minosoft.data.mappings.blocks.Block; +import de.bixilon.minosoft.data.world.Chunk; import de.bixilon.minosoft.data.world.ChunkLocation; import de.bixilon.minosoft.data.world.InChunkLocation; import de.bixilon.minosoft.logging.Log; +import de.bixilon.minosoft.modding.event.events.MultiBlockChangeEvent; +import de.bixilon.minosoft.protocol.network.Connection; import de.bixilon.minosoft.protocol.packets.ClientboundPacket; import de.bixilon.minosoft.protocol.protocol.InByteBuffer; -import de.bixilon.minosoft.protocol.protocol.PacketHandler; import java.util.HashMap; -public class PacketMultiBlockChange implements ClientboundPacket { +public class PacketMultiBlockChange extends ClientboundPacket { final HashMap blocks = new HashMap<>(); ChunkLocation location; @@ -74,8 +76,14 @@ public class PacketMultiBlockChange implements ClientboundPacket { } @Override - public void handle(PacketHandler h) { - h.handle(this); + public void handle(Connection connection) { + Chunk chunk = connection.getPlayer().getWorld().getChunk(getLocation()); + if (chunk == null) { + // thanks mojang + return; + } + connection.fireEvent(new MultiBlockChangeEvent(connection, this)); + chunk.setBlocks(getBlocks()); } @Override diff --git a/src/main/java/de/bixilon/minosoft/protocol/packets/clientbound/play/PacketNBTQueryResponse.java b/src/main/java/de/bixilon/minosoft/protocol/packets/clientbound/play/PacketNBTQueryResponse.java index fe647de25..d556cbfc9 100644 --- a/src/main/java/de/bixilon/minosoft/protocol/packets/clientbound/play/PacketNBTQueryResponse.java +++ b/src/main/java/de/bixilon/minosoft/protocol/packets/clientbound/play/PacketNBTQueryResponse.java @@ -16,10 +16,9 @@ package de.bixilon.minosoft.protocol.packets.clientbound.play; import de.bixilon.minosoft.logging.Log; import de.bixilon.minosoft.protocol.packets.ClientboundPacket; import de.bixilon.minosoft.protocol.protocol.InByteBuffer; -import de.bixilon.minosoft.protocol.protocol.PacketHandler; import de.bixilon.minosoft.util.nbt.tag.CompoundTag; -public class PacketNBTQueryResponse implements ClientboundPacket { +public class PacketNBTQueryResponse extends ClientboundPacket { int transactionId; CompoundTag tag; @@ -30,11 +29,6 @@ public class PacketNBTQueryResponse implements ClientboundPacket { return true; } - @Override - public void handle(PacketHandler h) { - h.handle(this); - } - @Override public void log() { Log.protocol(String.format("[IN] Received nbt response (transactionId=%d, nbt=%s)", this.transactionId, this.tag.toString())); diff --git a/src/main/java/de/bixilon/minosoft/protocol/packets/clientbound/play/PacketNamedSoundEffect.java b/src/main/java/de/bixilon/minosoft/protocol/packets/clientbound/play/PacketNamedSoundEffect.java index b54a394cc..c40e5837f 100644 --- a/src/main/java/de/bixilon/minosoft/protocol/packets/clientbound/play/PacketNamedSoundEffect.java +++ b/src/main/java/de/bixilon/minosoft/protocol/packets/clientbound/play/PacketNamedSoundEffect.java @@ -18,10 +18,9 @@ import de.bixilon.minosoft.data.entities.Location; import de.bixilon.minosoft.logging.Log; import de.bixilon.minosoft.protocol.packets.ClientboundPacket; import de.bixilon.minosoft.protocol.protocol.InByteBuffer; -import de.bixilon.minosoft.protocol.protocol.PacketHandler; import de.bixilon.minosoft.protocol.protocol.ProtocolDefinition; -public class PacketNamedSoundEffect implements ClientboundPacket { +public class PacketNamedSoundEffect extends ClientboundPacket { Location location; String sound; float volume; @@ -58,10 +57,6 @@ public class PacketNamedSoundEffect implements ClientboundPacket { return true; } - @Override - public void handle(PacketHandler h) { - h.handle(this); - } @Override public void log() { diff --git a/src/main/java/de/bixilon/minosoft/protocol/packets/clientbound/play/PacketOpenBook.java b/src/main/java/de/bixilon/minosoft/protocol/packets/clientbound/play/PacketOpenBook.java index 4b2d6aff4..168d221ba 100644 --- a/src/main/java/de/bixilon/minosoft/protocol/packets/clientbound/play/PacketOpenBook.java +++ b/src/main/java/de/bixilon/minosoft/protocol/packets/clientbound/play/PacketOpenBook.java @@ -17,9 +17,8 @@ import de.bixilon.minosoft.data.player.Hands; import de.bixilon.minosoft.logging.Log; import de.bixilon.minosoft.protocol.packets.ClientboundPacket; import de.bixilon.minosoft.protocol.protocol.InByteBuffer; -import de.bixilon.minosoft.protocol.protocol.PacketHandler; -public class PacketOpenBook implements ClientboundPacket { +public class PacketOpenBook extends ClientboundPacket { Hands hand; @Override @@ -32,11 +31,6 @@ public class PacketOpenBook implements ClientboundPacket { return true; } - @Override - public void handle(PacketHandler h) { - h.handle(this); - } - @Override public void log() { Log.protocol(String.format("[IN] Received open book packet (hand=%s)", this.hand)); diff --git a/src/main/java/de/bixilon/minosoft/protocol/packets/clientbound/play/PacketOpenHorseWindow.java b/src/main/java/de/bixilon/minosoft/protocol/packets/clientbound/play/PacketOpenHorseWindow.java index 41859c084..7b9695338 100644 --- a/src/main/java/de/bixilon/minosoft/protocol/packets/clientbound/play/PacketOpenHorseWindow.java +++ b/src/main/java/de/bixilon/minosoft/protocol/packets/clientbound/play/PacketOpenHorseWindow.java @@ -16,9 +16,8 @@ package de.bixilon.minosoft.protocol.packets.clientbound.play; import de.bixilon.minosoft.logging.Log; import de.bixilon.minosoft.protocol.packets.ClientboundPacket; import de.bixilon.minosoft.protocol.protocol.InByteBuffer; -import de.bixilon.minosoft.protocol.protocol.PacketHandler; -public class PacketOpenHorseWindow implements ClientboundPacket { +public class PacketOpenHorseWindow extends ClientboundPacket { byte windowId; int slotCount; int entityId; @@ -31,11 +30,6 @@ public class PacketOpenHorseWindow implements ClientboundPacket { return true; } - @Override - public void handle(PacketHandler h) { - h.handle(this); - } - @Override public void log() { Log.protocol(String.format("[IN] Received open horse window packet (windowId=%d, slotCount=%d, entityId=%s)", this.windowId, this.slotCount, this.entityId)); diff --git a/src/main/java/de/bixilon/minosoft/protocol/packets/clientbound/play/PacketOpenSignEditor.java b/src/main/java/de/bixilon/minosoft/protocol/packets/clientbound/play/PacketOpenSignEditor.java index d7aab53e0..d5881fa11 100644 --- a/src/main/java/de/bixilon/minosoft/protocol/packets/clientbound/play/PacketOpenSignEditor.java +++ b/src/main/java/de/bixilon/minosoft/protocol/packets/clientbound/play/PacketOpenSignEditor.java @@ -15,11 +15,12 @@ package de.bixilon.minosoft.protocol.packets.clientbound.play; import de.bixilon.minosoft.data.world.BlockPosition; import de.bixilon.minosoft.logging.Log; +import de.bixilon.minosoft.modding.event.events.OpenSignEditorEvent; +import de.bixilon.minosoft.protocol.network.Connection; import de.bixilon.minosoft.protocol.packets.ClientboundPacket; import de.bixilon.minosoft.protocol.protocol.InByteBuffer; -import de.bixilon.minosoft.protocol.protocol.PacketHandler; -public class PacketOpenSignEditor implements ClientboundPacket { +public class PacketOpenSignEditor extends ClientboundPacket { BlockPosition position; @Override @@ -33,8 +34,11 @@ public class PacketOpenSignEditor implements ClientboundPacket { } @Override - public void handle(PacketHandler h) { - h.handle(this); + public void handle(Connection connection) { + OpenSignEditorEvent event = new OpenSignEditorEvent(connection, this); + if (connection.fireEvent(event)) { + return; + } } @Override diff --git a/src/main/java/de/bixilon/minosoft/protocol/packets/clientbound/play/PacketOpenWindow.java b/src/main/java/de/bixilon/minosoft/protocol/packets/clientbound/play/PacketOpenWindow.java index d47589ac4..1012b81c6 100644 --- a/src/main/java/de/bixilon/minosoft/protocol/packets/clientbound/play/PacketOpenWindow.java +++ b/src/main/java/de/bixilon/minosoft/protocol/packets/clientbound/play/PacketOpenWindow.java @@ -17,11 +17,11 @@ import de.bixilon.minosoft.data.inventory.InventoryProperties; import de.bixilon.minosoft.data.inventory.InventoryTypes; import de.bixilon.minosoft.data.text.ChatComponent; import de.bixilon.minosoft.logging.Log; +import de.bixilon.minosoft.protocol.network.Connection; import de.bixilon.minosoft.protocol.packets.ClientboundPacket; import de.bixilon.minosoft.protocol.protocol.InByteBuffer; -import de.bixilon.minosoft.protocol.protocol.PacketHandler; -public class PacketOpenWindow implements ClientboundPacket { +public class PacketOpenWindow extends ClientboundPacket { byte windowId; InventoryTypes type; ChatComponent title; @@ -55,8 +55,8 @@ public class PacketOpenWindow implements ClientboundPacket { } @Override - public void handle(PacketHandler h) { - h.handle(this); + public void handle(Connection connection) { + connection.getPlayer().createInventory(getInventoryProperties()); } @Override diff --git a/src/main/java/de/bixilon/minosoft/protocol/packets/clientbound/play/PacketParticle.java b/src/main/java/de/bixilon/minosoft/protocol/packets/clientbound/play/PacketParticle.java index 3622a62cb..87925cf74 100644 --- a/src/main/java/de/bixilon/minosoft/protocol/packets/clientbound/play/PacketParticle.java +++ b/src/main/java/de/bixilon/minosoft/protocol/packets/clientbound/play/PacketParticle.java @@ -17,11 +17,12 @@ import de.bixilon.minosoft.data.entities.Location; import de.bixilon.minosoft.data.mappings.particle.Particle; import de.bixilon.minosoft.data.mappings.particle.data.ParticleData; import de.bixilon.minosoft.logging.Log; +import de.bixilon.minosoft.modding.event.events.ParticleSpawnEvent; +import de.bixilon.minosoft.protocol.network.Connection; import de.bixilon.minosoft.protocol.packets.ClientboundPacket; import de.bixilon.minosoft.protocol.protocol.InByteBuffer; -import de.bixilon.minosoft.protocol.protocol.PacketHandler; -public class PacketParticle implements ClientboundPacket { +public class PacketParticle extends ClientboundPacket { Particle particleType; ParticleData particleData; boolean longDistance; @@ -71,8 +72,10 @@ public class PacketParticle implements ClientboundPacket { } @Override - public void handle(PacketHandler h) { - h.handle(this); + public void handle(Connection connection) { + if (connection.fireEvent(new ParticleSpawnEvent(connection, this))) { + return; + } } @Override 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 613ccbc0a..1bd7eec35 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 @@ -16,10 +16,9 @@ package de.bixilon.minosoft.protocol.packets.clientbound.play; import de.bixilon.minosoft.logging.Log; import de.bixilon.minosoft.protocol.packets.ClientboundPacket; import de.bixilon.minosoft.protocol.protocol.InByteBuffer; -import de.bixilon.minosoft.protocol.protocol.PacketHandler; import de.bixilon.minosoft.util.BitByte; -public class PacketPlayerAbilitiesReceiving implements ClientboundPacket { +public class PacketPlayerAbilitiesReceiving extends ClientboundPacket { boolean creative; // is this needed? receiving the gameMode in change Game state boolean flying; boolean canFly; @@ -49,11 +48,6 @@ public class PacketPlayerAbilitiesReceiving implements ClientboundPacket { return true; } - @Override - public void handle(PacketHandler h) { - h.handle(this); - } - @Override public void log() { Log.protocol(String.format("[IN] Received player abilities packet: (creative=%s, flying=%s, canFly=%s, godMode=%s, flyingSpeed=%s, walkingSpeed=%s)", this.creative, this.flying, this.canFly, this.godMode, this.flyingSpeed, this.walkingSpeed)); diff --git a/src/main/java/de/bixilon/minosoft/protocol/packets/clientbound/play/PacketPlayerListItem.java b/src/main/java/de/bixilon/minosoft/protocol/packets/clientbound/play/PacketPlayerListItem.java index e7cc1c2c8..9304af8a4 100644 --- a/src/main/java/de/bixilon/minosoft/protocol/packets/clientbound/play/PacketPlayerListItem.java +++ b/src/main/java/de/bixilon/minosoft/protocol/packets/clientbound/play/PacketPlayerListItem.java @@ -14,20 +14,22 @@ package de.bixilon.minosoft.protocol.packets.clientbound.play; import de.bixilon.minosoft.data.GameModes; +import de.bixilon.minosoft.data.player.PlayerListItem; import de.bixilon.minosoft.data.player.PlayerListItemBulk; import de.bixilon.minosoft.data.player.PlayerProperties; import de.bixilon.minosoft.data.player.PlayerProperty; import de.bixilon.minosoft.data.text.ChatComponent; import de.bixilon.minosoft.logging.Log; +import de.bixilon.minosoft.modding.event.events.PlayerListItemChangeEvent; +import de.bixilon.minosoft.protocol.network.Connection; import de.bixilon.minosoft.protocol.packets.ClientboundPacket; import de.bixilon.minosoft.protocol.protocol.InByteBuffer; -import de.bixilon.minosoft.protocol.protocol.PacketHandler; import java.util.ArrayList; import java.util.HashMap; import java.util.UUID; -public class PacketPlayerListItem implements ClientboundPacket { +public class PacketPlayerListItem extends ClientboundPacket { final ArrayList playerList = new ArrayList<>(); @Override @@ -76,8 +78,48 @@ public class PacketPlayerListItem implements ClientboundPacket { } @Override - public void handle(PacketHandler h) { - h.handle(this); + public void handle(Connection connection) { + if (connection.fireEvent(new PlayerListItemChangeEvent(connection, this))) { + return; + } + for (PlayerListItemBulk bulk : getPlayerList()) { + PlayerListItem item = connection.getPlayer().getPlayerList().get(bulk.getUUID()); + if (item == null && !bulk.isLegacy()) { + // Aaaaah. Fuck this shit. The server sends us bullshit! + continue; + } + switch (bulk.getAction()) { + case ADD -> connection.getPlayer().getPlayerList().put(bulk.getUUID(), new PlayerListItem(bulk.getUUID(), bulk.getName(), bulk.getPing(), bulk.getGameMode(), bulk.getDisplayName(), bulk.getProperties())); + case UPDATE_LATENCY -> { + if (bulk.isLegacy()) { + // add or update + if (item == null) { + // create + UUID uuid = UUID.randomUUID(); + connection.getPlayer().getPlayerList().put(uuid, new PlayerListItem(uuid, bulk.getName(), bulk.getPing())); + } else { + // update ping + item.setPing(bulk.getPing()); + } + continue; + } + connection.getPlayer().getPlayerList().get(bulk.getUUID()).setPing(bulk.getPing()); + } + case REMOVE_PLAYER -> { + if (bulk.isLegacy()) { + if (item == null) { + // not initialized yet + continue; + } + connection.getPlayer().getPlayerList().remove(connection.getPlayer().getPlayerListItem(bulk.getName()).getUUID()); + continue; + } + connection.getPlayer().getPlayerList().remove(bulk.getUUID()); + } + case UPDATE_GAMEMODE -> item.setGameMode(bulk.getGameMode()); + case UPDATE_DISPLAY_NAME -> item.setDisplayName(bulk.getDisplayName()); + } + } } @Override diff --git a/src/main/java/de/bixilon/minosoft/protocol/packets/clientbound/play/PacketPlayerPositionAndRotation.java b/src/main/java/de/bixilon/minosoft/protocol/packets/clientbound/play/PacketPlayerPositionAndRotation.java index 1227f06bf..bb59cd424 100644 --- a/src/main/java/de/bixilon/minosoft/protocol/packets/clientbound/play/PacketPlayerPositionAndRotation.java +++ b/src/main/java/de/bixilon/minosoft/protocol/packets/clientbound/play/PacketPlayerPositionAndRotation.java @@ -16,11 +16,13 @@ package de.bixilon.minosoft.protocol.packets.clientbound.play; import de.bixilon.minosoft.data.entities.EntityRotation; import de.bixilon.minosoft.data.entities.Location; import de.bixilon.minosoft.logging.Log; +import de.bixilon.minosoft.protocol.network.Connection; import de.bixilon.minosoft.protocol.packets.ClientboundPacket; +import de.bixilon.minosoft.protocol.packets.serverbound.play.PacketConfirmTeleport; +import de.bixilon.minosoft.protocol.packets.serverbound.play.PacketPlayerPositionAndRotationSending; import de.bixilon.minosoft.protocol.protocol.InByteBuffer; -import de.bixilon.minosoft.protocol.protocol.PacketHandler; -public class PacketPlayerPositionAndRotation implements ClientboundPacket { +public class PacketPlayerPositionAndRotation extends ClientboundPacket { Location location; EntityRotation rotation; boolean onGround; @@ -45,8 +47,14 @@ public class PacketPlayerPositionAndRotation implements ClientboundPacket { } @Override - public void handle(PacketHandler h) { - h.handle(this); + public void handle(Connection connection) { + // ToDo: GUI should do this + connection.getPlayer().getEntity().setLocation(getLocation()); + if (connection.getVersion().getVersionId() >= 79) { + connection.sendPacket(new PacketConfirmTeleport(getTeleportId())); + } else { + connection.sendPacket(new PacketPlayerPositionAndRotationSending(getLocation(), getRotation(), isOnGround())); + } } @Override diff --git a/src/main/java/de/bixilon/minosoft/protocol/packets/clientbound/play/PacketPluginMessageReceiving.java b/src/main/java/de/bixilon/minosoft/protocol/packets/clientbound/play/PacketPluginMessageReceiving.java index 7c055ca0e..3af8da2c0 100644 --- a/src/main/java/de/bixilon/minosoft/protocol/packets/clientbound/play/PacketPluginMessageReceiving.java +++ b/src/main/java/de/bixilon/minosoft/protocol/packets/clientbound/play/PacketPluginMessageReceiving.java @@ -13,13 +13,17 @@ package de.bixilon.minosoft.protocol.packets.clientbound.play; +import de.bixilon.minosoft.Minosoft; +import de.bixilon.minosoft.config.ConfigurationPaths; import de.bixilon.minosoft.logging.Log; +import de.bixilon.minosoft.modding.channels.DefaultPluginChannels; +import de.bixilon.minosoft.modding.event.events.PluginMessageReceiveEvent; import de.bixilon.minosoft.protocol.network.Connection; import de.bixilon.minosoft.protocol.packets.ClientboundPacket; import de.bixilon.minosoft.protocol.protocol.InByteBuffer; -import de.bixilon.minosoft.protocol.protocol.PacketHandler; +import de.bixilon.minosoft.protocol.protocol.OutByteBuffer; -public class PacketPluginMessageReceiving implements ClientboundPacket { +public class PacketPluginMessageReceiving extends ClientboundPacket { String channel; byte[] data; Connection connection; @@ -39,8 +43,37 @@ public class PacketPluginMessageReceiving implements ClientboundPacket { } @Override - public void handle(PacketHandler h) { - h.handle(this); + public void handle(Connection connection) { + if (getChannel().equals(DefaultPluginChannels.MC_BRAND.getChangeableIdentifier().get(connection.getVersion().getVersionId()))) { + InByteBuffer data = getDataAsBuffer(); + String serverVersion; + String clientVersion = (Minosoft.getConfig().getBoolean(ConfigurationPaths.BooleanPaths.NETWORK_FAKE_CLIENT_BRAND) ? "vanilla" : "Minosoft"); + OutByteBuffer toSend = new OutByteBuffer(connection); + if (connection.getVersion().getVersionId() < 29) { + // no length prefix + serverVersion = new String(data.getBytes()); + toSend.writeBytes(clientVersion.getBytes()); + } else { + // length prefix + serverVersion = data.readString(); + toSend.writeString(clientVersion); + } + Log.info(String.format("Server is running \"%s\", connected with %s", serverVersion, connection.getVersion().getVersionName())); + + connection.getSender().sendPluginMessageData(DefaultPluginChannels.MC_BRAND.getChangeableIdentifier().get(connection.getVersion().getVersionId()), toSend); + return; + } + + // MC|StopSound + if (getChannel().equals(DefaultPluginChannels.MC_BRAND.getChangeableIdentifier().get(connection.getVersion().getVersionId()))) { + // it is basically a packet, handle it like a packet: + PacketStopSound packet = new PacketStopSound(); + packet.read(getDataAsBuffer()); + packet.handle(connection); + return; + } + + connection.fireEvent(new PluginMessageReceiveEvent(connection, this)); } @Override diff --git a/src/main/java/de/bixilon/minosoft/protocol/packets/clientbound/play/PacketRemoveEntityEffect.java b/src/main/java/de/bixilon/minosoft/protocol/packets/clientbound/play/PacketRemoveEntityEffect.java index f6130fb05..0d850b712 100644 --- a/src/main/java/de/bixilon/minosoft/protocol/packets/clientbound/play/PacketRemoveEntityEffect.java +++ b/src/main/java/de/bixilon/minosoft/protocol/packets/clientbound/play/PacketRemoveEntityEffect.java @@ -13,13 +13,14 @@ package de.bixilon.minosoft.protocol.packets.clientbound.play; +import de.bixilon.minosoft.data.entities.entities.Entity; import de.bixilon.minosoft.data.mappings.MobEffect; import de.bixilon.minosoft.logging.Log; +import de.bixilon.minosoft.protocol.network.Connection; import de.bixilon.minosoft.protocol.packets.ClientboundPacket; import de.bixilon.minosoft.protocol.protocol.InByteBuffer; -import de.bixilon.minosoft.protocol.protocol.PacketHandler; -public class PacketRemoveEntityEffect implements ClientboundPacket { +public class PacketRemoveEntityEffect extends ClientboundPacket { int entityId; MobEffect effect; @@ -32,8 +33,13 @@ public class PacketRemoveEntityEffect implements ClientboundPacket { } @Override - public void handle(PacketHandler h) { - h.handle(this); + public void handle(Connection connection) { + Entity entity = connection.getPlayer().getWorld().getEntity(getEntityId()); + if (entity == null) { + // thanks mojang + return; + } + entity.removeEffect(getEffect()); } @Override diff --git a/src/main/java/de/bixilon/minosoft/protocol/packets/clientbound/play/PacketResourcePackSend.java b/src/main/java/de/bixilon/minosoft/protocol/packets/clientbound/play/PacketResourcePackSend.java index 14b8b3bd2..64c3884e8 100644 --- a/src/main/java/de/bixilon/minosoft/protocol/packets/clientbound/play/PacketResourcePackSend.java +++ b/src/main/java/de/bixilon/minosoft/protocol/packets/clientbound/play/PacketResourcePackSend.java @@ -14,11 +14,12 @@ package de.bixilon.minosoft.protocol.packets.clientbound.play; import de.bixilon.minosoft.logging.Log; +import de.bixilon.minosoft.modding.event.events.ResourcePackChangeEvent; +import de.bixilon.minosoft.protocol.network.Connection; import de.bixilon.minosoft.protocol.packets.ClientboundPacket; import de.bixilon.minosoft.protocol.protocol.InByteBuffer; -import de.bixilon.minosoft.protocol.protocol.PacketHandler; -public class PacketResourcePackSend implements ClientboundPacket { +public class PacketResourcePackSend extends ClientboundPacket { String url; String hash; boolean forced; @@ -34,8 +35,11 @@ public class PacketResourcePackSend implements ClientboundPacket { } @Override - public void handle(PacketHandler h) { - h.handle(this); + public void handle(Connection connection) { + ResourcePackChangeEvent event = new ResourcePackChangeEvent(connection, this); + if (connection.fireEvent(event)) { + return; + } } @Override diff --git a/src/main/java/de/bixilon/minosoft/protocol/packets/clientbound/play/PacketRespawn.java b/src/main/java/de/bixilon/minosoft/protocol/packets/clientbound/play/PacketRespawn.java index 2ed8a8abb..cef62bb5a 100644 --- a/src/main/java/de/bixilon/minosoft/protocol/packets/clientbound/play/PacketRespawn.java +++ b/src/main/java/de/bixilon/minosoft/protocol/packets/clientbound/play/PacketRespawn.java @@ -18,12 +18,13 @@ import de.bixilon.minosoft.data.GameModes; import de.bixilon.minosoft.data.LevelTypes; import de.bixilon.minosoft.data.mappings.Dimension; import de.bixilon.minosoft.logging.Log; +import de.bixilon.minosoft.modding.event.events.RespawnEvent; +import de.bixilon.minosoft.protocol.network.Connection; import de.bixilon.minosoft.protocol.packets.ClientboundPacket; import de.bixilon.minosoft.protocol.protocol.InByteBuffer; -import de.bixilon.minosoft.protocol.protocol.PacketHandler; import de.bixilon.minosoft.util.nbt.tag.CompoundTag; -public class PacketRespawn implements ClientboundPacket { +public class PacketRespawn extends ClientboundPacket { Dimension dimension; Difficulties difficulty; GameModes gameMode; @@ -76,8 +77,16 @@ public class PacketRespawn implements ClientboundPacket { } @Override - public void handle(PacketHandler h) { - h.handle(this); + public void handle(Connection connection) { + if (connection.fireEvent(new RespawnEvent(connection, this))) { + return; + } + + // clear all chunks + connection.getPlayer().getWorld().getAllChunks().clear(); + connection.getPlayer().getWorld().setDimension(getDimension()); + connection.getPlayer().setSpawnConfirmed(false); + connection.getPlayer().setGameMode(getGameMode()); } @Override diff --git a/src/main/java/de/bixilon/minosoft/protocol/packets/clientbound/play/PacketScoreboardDisplayScoreboard.java b/src/main/java/de/bixilon/minosoft/protocol/packets/clientbound/play/PacketScoreboardDisplayScoreboard.java index a9d8a7646..e3daadc14 100644 --- a/src/main/java/de/bixilon/minosoft/protocol/packets/clientbound/play/PacketScoreboardDisplayScoreboard.java +++ b/src/main/java/de/bixilon/minosoft/protocol/packets/clientbound/play/PacketScoreboardDisplayScoreboard.java @@ -16,9 +16,8 @@ package de.bixilon.minosoft.protocol.packets.clientbound.play; import de.bixilon.minosoft.logging.Log; import de.bixilon.minosoft.protocol.packets.ClientboundPacket; import de.bixilon.minosoft.protocol.protocol.InByteBuffer; -import de.bixilon.minosoft.protocol.protocol.PacketHandler; -public class PacketScoreboardDisplayScoreboard implements ClientboundPacket { +public class PacketScoreboardDisplayScoreboard extends ClientboundPacket { ScoreboardAnimations action; String scoreName; @@ -29,11 +28,6 @@ public class PacketScoreboardDisplayScoreboard implements ClientboundPacket { return true; } - @Override - public void handle(PacketHandler h) { - h.handle(this); - } - @Override public void log() { Log.protocol(String.format("[IN] Received display scoreboard packet (position=%s, scoreName=\"%s\"", this.action, this.scoreName)); diff --git a/src/main/java/de/bixilon/minosoft/protocol/packets/clientbound/play/PacketScoreboardObjective.java b/src/main/java/de/bixilon/minosoft/protocol/packets/clientbound/play/PacketScoreboardObjective.java index e6f05788a..617cc6b94 100644 --- a/src/main/java/de/bixilon/minosoft/protocol/packets/clientbound/play/PacketScoreboardObjective.java +++ b/src/main/java/de/bixilon/minosoft/protocol/packets/clientbound/play/PacketScoreboardObjective.java @@ -13,13 +13,14 @@ package de.bixilon.minosoft.protocol.packets.clientbound.play; +import de.bixilon.minosoft.data.scoreboard.ScoreboardObjective; import de.bixilon.minosoft.data.text.ChatComponent; import de.bixilon.minosoft.logging.Log; +import de.bixilon.minosoft.protocol.network.Connection; import de.bixilon.minosoft.protocol.packets.ClientboundPacket; import de.bixilon.minosoft.protocol.protocol.InByteBuffer; -import de.bixilon.minosoft.protocol.protocol.PacketHandler; -public class PacketScoreboardObjective implements ClientboundPacket { +public class PacketScoreboardObjective extends ClientboundPacket { String name; ChatComponent value; ScoreboardObjectiveActions action; @@ -52,8 +53,12 @@ public class PacketScoreboardObjective implements ClientboundPacket { } @Override - public void handle(PacketHandler h) { - h.handle(this); + public void handle(Connection connection) { + switch (getAction()) { + case CREATE -> connection.getPlayer().getScoreboardManager().addObjective(new ScoreboardObjective(getName(), getValue())); + case UPDATE -> connection.getPlayer().getScoreboardManager().getObjective(getName()).setValue(getValue()); + case REMOVE -> connection.getPlayer().getScoreboardManager().removeObjective(getName()); + } } @Override diff --git a/src/main/java/de/bixilon/minosoft/protocol/packets/clientbound/play/PacketScoreboardUpdateScore.java b/src/main/java/de/bixilon/minosoft/protocol/packets/clientbound/play/PacketScoreboardUpdateScore.java index bf5e72511..ce5d3b292 100644 --- a/src/main/java/de/bixilon/minosoft/protocol/packets/clientbound/play/PacketScoreboardUpdateScore.java +++ b/src/main/java/de/bixilon/minosoft/protocol/packets/clientbound/play/PacketScoreboardUpdateScore.java @@ -13,12 +13,14 @@ package de.bixilon.minosoft.protocol.packets.clientbound.play; +import de.bixilon.minosoft.data.scoreboard.ScoreboardObjective; +import de.bixilon.minosoft.data.scoreboard.ScoreboardScore; import de.bixilon.minosoft.logging.Log; +import de.bixilon.minosoft.protocol.network.Connection; import de.bixilon.minosoft.protocol.packets.ClientboundPacket; import de.bixilon.minosoft.protocol.protocol.InByteBuffer; -import de.bixilon.minosoft.protocol.protocol.PacketHandler; -public class PacketScoreboardUpdateScore implements ClientboundPacket { +public class PacketScoreboardUpdateScore extends ClientboundPacket { String itemName; ScoreboardUpdateScoreActions action; String scoreName; @@ -48,8 +50,17 @@ public class PacketScoreboardUpdateScore implements ClientboundPacket { } @Override - public void handle(PacketHandler h) { - h.handle(this); + public void handle(Connection connection) { + switch (getAction()) { + case CREATE_UPDATE -> connection.getPlayer().getScoreboardManager().getObjective(getScoreName()).addScore(new ScoreboardScore(getItemName(), getScoreName(), getScoreValue())); + case REMOVE -> { + ScoreboardObjective objective = connection.getPlayer().getScoreboardManager().getObjective(getScoreName()); + if (objective != null) { + // thanks mojang + objective.removeScore(getItemName()); + } + } + } } @Override diff --git a/src/main/java/de/bixilon/minosoft/protocol/packets/clientbound/play/PacketSelectAdvancementTab.java b/src/main/java/de/bixilon/minosoft/protocol/packets/clientbound/play/PacketSelectAdvancementTab.java index e5a568f70..c674bda32 100644 --- a/src/main/java/de/bixilon/minosoft/protocol/packets/clientbound/play/PacketSelectAdvancementTab.java +++ b/src/main/java/de/bixilon/minosoft/protocol/packets/clientbound/play/PacketSelectAdvancementTab.java @@ -17,9 +17,8 @@ import de.bixilon.minosoft.data.ChangeableIdentifier; import de.bixilon.minosoft.logging.Log; import de.bixilon.minosoft.protocol.packets.ClientboundPacket; import de.bixilon.minosoft.protocol.protocol.InByteBuffer; -import de.bixilon.minosoft.protocol.protocol.PacketHandler; -public class PacketSelectAdvancementTab implements ClientboundPacket { +public class PacketSelectAdvancementTab extends ClientboundPacket { AdvancementTabs tab; @Override @@ -30,11 +29,6 @@ public class PacketSelectAdvancementTab implements ClientboundPacket { return true; } - @Override - public void handle(PacketHandler h) { - h.handle(this); - } - @Override public void log() { Log.protocol(String.format("[IN] Received select advancement tab (tab=%s)", this.tab)); 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 index 18a6c36f3..f4b6c83d6 100644 --- 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 @@ -17,9 +17,8 @@ import de.bixilon.minosoft.data.Difficulties; import de.bixilon.minosoft.logging.Log; import de.bixilon.minosoft.protocol.packets.ClientboundPacket; import de.bixilon.minosoft.protocol.protocol.InByteBuffer; -import de.bixilon.minosoft.protocol.protocol.PacketHandler; -public class PacketServerDifficulty implements ClientboundPacket { +public class PacketServerDifficulty extends ClientboundPacket { Difficulties difficulty; boolean locked; @@ -32,11 +31,6 @@ public class PacketServerDifficulty implements ClientboundPacket { return true; } - @Override - public void handle(PacketHandler h) { - h.handle(this); - } - @Override public void log() { Log.protocol(String.format("[IN] Received server difficulty (difficulty=%s)", this.difficulty)); diff --git a/src/main/java/de/bixilon/minosoft/protocol/packets/clientbound/play/PacketSetCompression.java b/src/main/java/de/bixilon/minosoft/protocol/packets/clientbound/play/PacketSetCompression.java index 1b213df49..e10462992 100644 --- a/src/main/java/de/bixilon/minosoft/protocol/packets/clientbound/play/PacketSetCompression.java +++ b/src/main/java/de/bixilon/minosoft/protocol/packets/clientbound/play/PacketSetCompression.java @@ -14,11 +14,10 @@ package de.bixilon.minosoft.protocol.packets.clientbound.play; import de.bixilon.minosoft.logging.Log; -import de.bixilon.minosoft.protocol.packets.clientbound.interfaces.PacketCompressionInterface; +import de.bixilon.minosoft.protocol.packets.clientbound.interfaces.CompressionThresholdChange; import de.bixilon.minosoft.protocol.protocol.InByteBuffer; -import de.bixilon.minosoft.protocol.protocol.PacketHandler; -public class PacketSetCompression implements PacketCompressionInterface { +public class PacketSetCompression extends CompressionThresholdChange { int threshold; @Override @@ -27,11 +26,6 @@ public class PacketSetCompression implements PacketCompressionInterface { return true; } - @Override - public void handle(PacketHandler h) { - h.handle(this); - } - @Override public void log() { Log.protocol(String.format("[IN] Received set compression packet (threshold=%d)", this.threshold)); diff --git a/src/main/java/de/bixilon/minosoft/protocol/packets/clientbound/play/PacketSetCooldown.java b/src/main/java/de/bixilon/minosoft/protocol/packets/clientbound/play/PacketSetCooldown.java index d99a6fa8e..ef0b3eb21 100644 --- a/src/main/java/de/bixilon/minosoft/protocol/packets/clientbound/play/PacketSetCooldown.java +++ b/src/main/java/de/bixilon/minosoft/protocol/packets/clientbound/play/PacketSetCooldown.java @@ -16,9 +16,8 @@ package de.bixilon.minosoft.protocol.packets.clientbound.play; import de.bixilon.minosoft.logging.Log; import de.bixilon.minosoft.protocol.packets.ClientboundPacket; import de.bixilon.minosoft.protocol.protocol.InByteBuffer; -import de.bixilon.minosoft.protocol.protocol.PacketHandler; -public class PacketSetCooldown implements ClientboundPacket { +public class PacketSetCooldown extends ClientboundPacket { int item; int cooldownTicks; @@ -30,11 +29,6 @@ public class PacketSetCooldown implements ClientboundPacket { return true; } - @Override - public void handle(PacketHandler h) { - h.handle(this); - } - @Override public void log() { Log.protocol(String.format("[IN] Receiving item cooldown (item=%s, coolDown=%dt)", this.item, this.cooldownTicks)); diff --git a/src/main/java/de/bixilon/minosoft/protocol/packets/clientbound/play/PacketSetExperience.java b/src/main/java/de/bixilon/minosoft/protocol/packets/clientbound/play/PacketSetExperience.java index 620f561da..32a96a279 100644 --- a/src/main/java/de/bixilon/minosoft/protocol/packets/clientbound/play/PacketSetExperience.java +++ b/src/main/java/de/bixilon/minosoft/protocol/packets/clientbound/play/PacketSetExperience.java @@ -14,11 +14,12 @@ package de.bixilon.minosoft.protocol.packets.clientbound.play; import de.bixilon.minosoft.logging.Log; +import de.bixilon.minosoft.modding.event.events.ExperienceChangeEvent; +import de.bixilon.minosoft.protocol.network.Connection; import de.bixilon.minosoft.protocol.packets.ClientboundPacket; import de.bixilon.minosoft.protocol.protocol.InByteBuffer; -import de.bixilon.minosoft.protocol.protocol.PacketHandler; -public class PacketSetExperience implements ClientboundPacket { +public class PacketSetExperience extends ClientboundPacket { float bar; int level; int total; @@ -37,8 +38,13 @@ public class PacketSetExperience implements ClientboundPacket { } @Override - public void handle(PacketHandler h) { - h.handle(this); + public void handle(Connection connection) { + if (connection.fireEvent(new ExperienceChangeEvent(connection, this))) { + return; + } + + connection.getPlayer().setLevel(getLevel()); + connection.getPlayer().setTotalExperience(getTotal()); } @Override diff --git a/src/main/java/de/bixilon/minosoft/protocol/packets/clientbound/play/PacketSetPassenger.java b/src/main/java/de/bixilon/minosoft/protocol/packets/clientbound/play/PacketSetPassenger.java index a5f9de92c..d8e1caf70 100644 --- a/src/main/java/de/bixilon/minosoft/protocol/packets/clientbound/play/PacketSetPassenger.java +++ b/src/main/java/de/bixilon/minosoft/protocol/packets/clientbound/play/PacketSetPassenger.java @@ -16,9 +16,8 @@ package de.bixilon.minosoft.protocol.packets.clientbound.play; import de.bixilon.minosoft.logging.Log; import de.bixilon.minosoft.protocol.packets.ClientboundPacket; import de.bixilon.minosoft.protocol.protocol.InByteBuffer; -import de.bixilon.minosoft.protocol.protocol.PacketHandler; -public class PacketSetPassenger implements ClientboundPacket { +public class PacketSetPassenger extends ClientboundPacket { int vehicleId; int[] entityIds; @@ -32,11 +31,6 @@ public class PacketSetPassenger implements ClientboundPacket { return true; } - @Override - public void handle(PacketHandler h) { - h.handle(this); - } - @Override public void log() { Log.protocol(String.format("[IN] Attaching %d entities (vehicleId=%d)", this.entityIds.length, this.vehicleId)); diff --git a/src/main/java/de/bixilon/minosoft/protocol/packets/clientbound/play/PacketSetSlot.java b/src/main/java/de/bixilon/minosoft/protocol/packets/clientbound/play/PacketSetSlot.java index 2b4e5b157..966bbaea6 100644 --- a/src/main/java/de/bixilon/minosoft/protocol/packets/clientbound/play/PacketSetSlot.java +++ b/src/main/java/de/bixilon/minosoft/protocol/packets/clientbound/play/PacketSetSlot.java @@ -15,11 +15,12 @@ package de.bixilon.minosoft.protocol.packets.clientbound.play; import de.bixilon.minosoft.data.inventory.Slot; import de.bixilon.minosoft.logging.Log; +import de.bixilon.minosoft.modding.event.events.SingleSlotChangeEvent; +import de.bixilon.minosoft.protocol.network.Connection; import de.bixilon.minosoft.protocol.packets.ClientboundPacket; import de.bixilon.minosoft.protocol.protocol.InByteBuffer; -import de.bixilon.minosoft.protocol.protocol.PacketHandler; -public class PacketSetSlot implements ClientboundPacket { +public class PacketSetSlot extends ClientboundPacket { byte windowId; short slotId; Slot slot; // ToDo use enum Slots @@ -33,8 +34,15 @@ public class PacketSetSlot implements ClientboundPacket { } @Override - public void handle(PacketHandler h) { - h.handle(this); + public void handle(Connection connection) { + connection.fireEvent(new SingleSlotChangeEvent(connection, this)); + + if (getWindowId() == -1) { + // thanks mojang + // ToDo: what is windowId -1 + return; + } + connection.getPlayer().setSlot(getWindowId(), getSlotId(), getSlot()); } @Override diff --git a/src/main/java/de/bixilon/minosoft/protocol/packets/clientbound/play/PacketSoundEffect.java b/src/main/java/de/bixilon/minosoft/protocol/packets/clientbound/play/PacketSoundEffect.java index 43f12a681..433fd7eb3 100644 --- a/src/main/java/de/bixilon/minosoft/protocol/packets/clientbound/play/PacketSoundEffect.java +++ b/src/main/java/de/bixilon/minosoft/protocol/packets/clientbound/play/PacketSoundEffect.java @@ -18,10 +18,9 @@ import de.bixilon.minosoft.data.entities.Location; import de.bixilon.minosoft.logging.Log; import de.bixilon.minosoft.protocol.packets.ClientboundPacket; import de.bixilon.minosoft.protocol.protocol.InByteBuffer; -import de.bixilon.minosoft.protocol.protocol.PacketHandler; import de.bixilon.minosoft.protocol.protocol.ProtocolDefinition; -public class PacketSoundEffect implements ClientboundPacket { +public class PacketSoundEffect extends ClientboundPacket { Location location; SoundCategories category; int soundId; @@ -52,11 +51,6 @@ public class PacketSoundEffect implements ClientboundPacket { return true; } - @Override - public void handle(PacketHandler h) { - h.handle(this); - } - @Override public void log() { Log.protocol(String.format("[IN] Play sound effect (soundId=%d, category=%s, volume=%s, pitch=%s, location=%s)", this.soundId, this.category, this.volume, this.pitch, this.location)); diff --git a/src/main/java/de/bixilon/minosoft/protocol/packets/clientbound/play/PacketSpawnExperienceOrb.java b/src/main/java/de/bixilon/minosoft/protocol/packets/clientbound/play/PacketSpawnExperienceOrb.java index 2d50bbd86..256028645 100644 --- a/src/main/java/de/bixilon/minosoft/protocol/packets/clientbound/play/PacketSpawnExperienceOrb.java +++ b/src/main/java/de/bixilon/minosoft/protocol/packets/clientbound/play/PacketSpawnExperienceOrb.java @@ -16,11 +16,12 @@ package de.bixilon.minosoft.protocol.packets.clientbound.play; import de.bixilon.minosoft.data.entities.Location; import de.bixilon.minosoft.data.entities.entities.ExperienceOrb; import de.bixilon.minosoft.logging.Log; +import de.bixilon.minosoft.modding.event.events.EntitySpawnEvent; +import de.bixilon.minosoft.protocol.network.Connection; import de.bixilon.minosoft.protocol.packets.ClientboundPacket; import de.bixilon.minosoft.protocol.protocol.InByteBuffer; -import de.bixilon.minosoft.protocol.protocol.PacketHandler; -public class PacketSpawnExperienceOrb implements ClientboundPacket { +public class PacketSpawnExperienceOrb extends ClientboundPacket { ExperienceOrb entity; @Override @@ -38,8 +39,10 @@ public class PacketSpawnExperienceOrb implements ClientboundPacket { } @Override - public void handle(PacketHandler h) { - h.handle(this); + public void handle(Connection connection) { + connection.fireEvent(new EntitySpawnEvent(connection, this)); + + connection.getPlayer().getWorld().addEntity(getEntity()); } @Override diff --git a/src/main/java/de/bixilon/minosoft/protocol/packets/clientbound/play/PacketSpawnLocation.java b/src/main/java/de/bixilon/minosoft/protocol/packets/clientbound/play/PacketSpawnLocation.java index e14fccd47..ee73ccb3c 100644 --- a/src/main/java/de/bixilon/minosoft/protocol/packets/clientbound/play/PacketSpawnLocation.java +++ b/src/main/java/de/bixilon/minosoft/protocol/packets/clientbound/play/PacketSpawnLocation.java @@ -15,11 +15,12 @@ package de.bixilon.minosoft.protocol.packets.clientbound.play; import de.bixilon.minosoft.data.world.BlockPosition; import de.bixilon.minosoft.logging.Log; +import de.bixilon.minosoft.modding.event.events.SpawnLocationChangeEvent; +import de.bixilon.minosoft.protocol.network.Connection; import de.bixilon.minosoft.protocol.packets.ClientboundPacket; import de.bixilon.minosoft.protocol.protocol.InByteBuffer; -import de.bixilon.minosoft.protocol.protocol.PacketHandler; -public class PacketSpawnLocation implements ClientboundPacket { +public class PacketSpawnLocation extends ClientboundPacket { BlockPosition location; @Override @@ -33,8 +34,9 @@ public class PacketSpawnLocation implements ClientboundPacket { } @Override - public void handle(PacketHandler h) { - h.handle(this); + public void handle(Connection connection) { + connection.fireEvent(new SpawnLocationChangeEvent(connection, this)); + connection.getPlayer().setSpawnLocation(getSpawnLocation()); } @Override diff --git a/src/main/java/de/bixilon/minosoft/protocol/packets/clientbound/play/PacketSpawnMob.java b/src/main/java/de/bixilon/minosoft/protocol/packets/clientbound/play/PacketSpawnMob.java index 97f1ea379..46e7834d0 100644 --- a/src/main/java/de/bixilon/minosoft/protocol/packets/clientbound/play/PacketSpawnMob.java +++ b/src/main/java/de/bixilon/minosoft/protocol/packets/clientbound/play/PacketSpawnMob.java @@ -21,15 +21,15 @@ import de.bixilon.minosoft.data.entities.entities.Entity; import de.bixilon.minosoft.data.entities.entities.UnknownEntityException; import de.bixilon.minosoft.data.mappings.VersionTweaker; import de.bixilon.minosoft.logging.Log; +import de.bixilon.minosoft.modding.event.events.EntitySpawnEvent; import de.bixilon.minosoft.protocol.network.Connection; import de.bixilon.minosoft.protocol.packets.ClientboundPacket; import de.bixilon.minosoft.protocol.protocol.InByteBuffer; -import de.bixilon.minosoft.protocol.protocol.PacketHandler; import java.lang.reflect.InvocationTargetException; import java.util.UUID; -public class PacketSpawnMob implements ClientboundPacket { +public class PacketSpawnMob extends ClientboundPacket { Entity entity; Velocity velocity; @@ -79,8 +79,11 @@ public class PacketSpawnMob implements ClientboundPacket { } @Override - public void handle(PacketHandler h) { - h.handle(this); + public void handle(Connection connection) { + connection.fireEvent(new EntitySpawnEvent(connection, this)); + + connection.getPlayer().getWorld().addEntity(getEntity()); + connection.getVelocityHandler().handleVelocity(getEntity(), getVelocity()); } @Override 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 5fb25958b..01c4f3f8e 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 @@ -21,15 +21,15 @@ import de.bixilon.minosoft.data.entities.entities.Entity; import de.bixilon.minosoft.data.entities.entities.UnknownEntityException; import de.bixilon.minosoft.data.mappings.VersionTweaker; import de.bixilon.minosoft.logging.Log; +import de.bixilon.minosoft.modding.event.events.EntitySpawnEvent; import de.bixilon.minosoft.protocol.network.Connection; import de.bixilon.minosoft.protocol.packets.ClientboundPacket; import de.bixilon.minosoft.protocol.protocol.InByteBuffer; -import de.bixilon.minosoft.protocol.protocol.PacketHandler; import java.lang.reflect.InvocationTargetException; import java.util.UUID; -public class PacketSpawnObject implements ClientboundPacket { +public class PacketSpawnObject extends ClientboundPacket { Entity entity; Velocity velocity; @@ -89,8 +89,11 @@ public class PacketSpawnObject implements ClientboundPacket { } @Override - public void handle(PacketHandler h) { - h.handle(this); + public void handle(Connection connection) { + connection.fireEvent(new EntitySpawnEvent(connection, this)); + + connection.getPlayer().getWorld().addEntity(getEntity()); + connection.getVelocityHandler().handleVelocity(getEntity(), getVelocity()); } @Override diff --git a/src/main/java/de/bixilon/minosoft/protocol/packets/clientbound/play/PacketSpawnPainting.java b/src/main/java/de/bixilon/minosoft/protocol/packets/clientbound/play/PacketSpawnPainting.java index a687a4de0..4d82cad0f 100644 --- a/src/main/java/de/bixilon/minosoft/protocol/packets/clientbound/play/PacketSpawnPainting.java +++ b/src/main/java/de/bixilon/minosoft/protocol/packets/clientbound/play/PacketSpawnPainting.java @@ -18,13 +18,14 @@ import de.bixilon.minosoft.data.entities.entities.decoration.Painting; import de.bixilon.minosoft.data.mappings.Motive; import de.bixilon.minosoft.data.world.BlockPosition; import de.bixilon.minosoft.logging.Log; +import de.bixilon.minosoft.modding.event.events.EntitySpawnEvent; +import de.bixilon.minosoft.protocol.network.Connection; import de.bixilon.minosoft.protocol.packets.ClientboundPacket; import de.bixilon.minosoft.protocol.protocol.InByteBuffer; -import de.bixilon.minosoft.protocol.protocol.PacketHandler; import java.util.UUID; -public class PacketSpawnPainting implements ClientboundPacket { +public class PacketSpawnPainting extends ClientboundPacket { Painting entity; @Override @@ -54,8 +55,10 @@ public class PacketSpawnPainting implements ClientboundPacket { } @Override - public void handle(PacketHandler h) { - h.handle(this); + public void handle(Connection connection) { + connection.fireEvent(new EntitySpawnEvent(connection, this)); + + connection.getPlayer().getWorld().addEntity(getEntity()); } @Override diff --git a/src/main/java/de/bixilon/minosoft/protocol/packets/clientbound/play/PacketSpawnPlayer.java b/src/main/java/de/bixilon/minosoft/protocol/packets/clientbound/play/PacketSpawnPlayer.java index ed68f4e32..0141ecf8b 100644 --- a/src/main/java/de/bixilon/minosoft/protocol/packets/clientbound/play/PacketSpawnPlayer.java +++ b/src/main/java/de/bixilon/minosoft/protocol/packets/clientbound/play/PacketSpawnPlayer.java @@ -21,14 +21,15 @@ import de.bixilon.minosoft.data.entities.Velocity; import de.bixilon.minosoft.data.entities.entities.player.PlayerEntity; import de.bixilon.minosoft.data.mappings.Item; import de.bixilon.minosoft.logging.Log; +import de.bixilon.minosoft.modding.event.events.EntitySpawnEvent; +import de.bixilon.minosoft.protocol.network.Connection; import de.bixilon.minosoft.protocol.packets.ClientboundPacket; import de.bixilon.minosoft.protocol.protocol.InByteBuffer; -import de.bixilon.minosoft.protocol.protocol.PacketHandler; import java.util.HashSet; import java.util.UUID; -public class PacketSpawnPlayer implements ClientboundPacket { +public class PacketSpawnPlayer extends ClientboundPacket { PlayerEntity entity; Velocity velocity; @@ -74,8 +75,11 @@ public class PacketSpawnPlayer implements ClientboundPacket { } @Override - public void handle(PacketHandler h) { - h.handle(this); + public void handle(Connection connection) { + connection.fireEvent(new EntitySpawnEvent(connection, this)); + + connection.getPlayer().getWorld().addEntity(getEntity()); + connection.getVelocityHandler().handleVelocity(getEntity(), getVelocity()); } @Override diff --git a/src/main/java/de/bixilon/minosoft/protocol/packets/clientbound/play/PacketSpawnWeatherEntity.java b/src/main/java/de/bixilon/minosoft/protocol/packets/clientbound/play/PacketSpawnWeatherEntity.java index 115a05a24..8bf91b0d5 100644 --- a/src/main/java/de/bixilon/minosoft/protocol/packets/clientbound/play/PacketSpawnWeatherEntity.java +++ b/src/main/java/de/bixilon/minosoft/protocol/packets/clientbound/play/PacketSpawnWeatherEntity.java @@ -16,11 +16,13 @@ package de.bixilon.minosoft.protocol.packets.clientbound.play; import de.bixilon.minosoft.data.entities.Location; import de.bixilon.minosoft.data.entities.entities.LightningBolt; import de.bixilon.minosoft.logging.Log; +import de.bixilon.minosoft.modding.event.events.EntitySpawnEvent; +import de.bixilon.minosoft.modding.event.events.LightningBoltSpawnEvent; +import de.bixilon.minosoft.protocol.network.Connection; import de.bixilon.minosoft.protocol.packets.ClientboundPacket; import de.bixilon.minosoft.protocol.protocol.InByteBuffer; -import de.bixilon.minosoft.protocol.protocol.PacketHandler; -public class PacketSpawnWeatherEntity implements ClientboundPacket { +public class PacketSpawnWeatherEntity extends ClientboundPacket { LightningBolt entity; @Override @@ -38,8 +40,9 @@ public class PacketSpawnWeatherEntity implements ClientboundPacket { } @Override - public void handle(PacketHandler h) { - h.handle(this); + public void handle(Connection connection) { + connection.fireEvent(new EntitySpawnEvent(connection, this)); + connection.fireEvent(new LightningBoltSpawnEvent(connection, this)); } @Override diff --git a/src/main/java/de/bixilon/minosoft/protocol/packets/clientbound/play/PacketStatistics.java b/src/main/java/de/bixilon/minosoft/protocol/packets/clientbound/play/PacketStatistics.java index 5dff4f309..14c08b938 100644 --- a/src/main/java/de/bixilon/minosoft/protocol/packets/clientbound/play/PacketStatistics.java +++ b/src/main/java/de/bixilon/minosoft/protocol/packets/clientbound/play/PacketStatistics.java @@ -18,11 +18,10 @@ import de.bixilon.minosoft.data.mappings.statistics.StatisticCategories; import de.bixilon.minosoft.logging.Log; import de.bixilon.minosoft.protocol.packets.ClientboundPacket; import de.bixilon.minosoft.protocol.protocol.InByteBuffer; -import de.bixilon.minosoft.protocol.protocol.PacketHandler; import java.util.HashMap; -public class PacketStatistics implements ClientboundPacket { +public class PacketStatistics extends ClientboundPacket { final HashMap statistics = new HashMap<>(); @Override @@ -39,11 +38,6 @@ public class PacketStatistics implements ClientboundPacket { return true; } - @Override - public void handle(PacketHandler h) { - h.handle(this); - } - @Override public void log() { Log.protocol(String.format("[IN] Received player statistics (count=%d)", this.statistics.size())); diff --git a/src/main/java/de/bixilon/minosoft/protocol/packets/clientbound/play/PacketStopSound.java b/src/main/java/de/bixilon/minosoft/protocol/packets/clientbound/play/PacketStopSound.java index 73b658584..5fcf5b2e2 100644 --- a/src/main/java/de/bixilon/minosoft/protocol/packets/clientbound/play/PacketStopSound.java +++ b/src/main/java/de/bixilon/minosoft/protocol/packets/clientbound/play/PacketStopSound.java @@ -18,10 +18,9 @@ import de.bixilon.minosoft.data.mappings.ModIdentifier; import de.bixilon.minosoft.logging.Log; import de.bixilon.minosoft.protocol.packets.ClientboundPacket; import de.bixilon.minosoft.protocol.protocol.InByteBuffer; -import de.bixilon.minosoft.protocol.protocol.PacketHandler; import de.bixilon.minosoft.util.BitByte; -public class PacketStopSound implements ClientboundPacket { +public class PacketStopSound extends ClientboundPacket { SoundCategories category; ModIdentifier soundIdentifier; @@ -42,11 +41,6 @@ public class PacketStopSound implements ClientboundPacket { return true; } - @Override - public void handle(PacketHandler h) { - h.handle(this); - } - @Override public void log() { Log.protocol(String.format("[IN] Received stop sound (category=%s, soundIdentifier=%s)", this.category, this.soundIdentifier)); diff --git a/src/main/java/de/bixilon/minosoft/protocol/packets/clientbound/play/PacketTabCompleteReceiving.java b/src/main/java/de/bixilon/minosoft/protocol/packets/clientbound/play/PacketTabCompleteReceiving.java index 9103b1e94..002d7fe5c 100644 --- a/src/main/java/de/bixilon/minosoft/protocol/packets/clientbound/play/PacketTabCompleteReceiving.java +++ b/src/main/java/de/bixilon/minosoft/protocol/packets/clientbound/play/PacketTabCompleteReceiving.java @@ -16,9 +16,8 @@ package de.bixilon.minosoft.protocol.packets.clientbound.play; import de.bixilon.minosoft.logging.Log; import de.bixilon.minosoft.protocol.packets.ClientboundPacket; import de.bixilon.minosoft.protocol.protocol.InByteBuffer; -import de.bixilon.minosoft.protocol.protocol.PacketHandler; -public class PacketTabCompleteReceiving implements ClientboundPacket { +public class PacketTabCompleteReceiving extends ClientboundPacket { int count; String[] match; @@ -41,11 +40,6 @@ public class PacketTabCompleteReceiving implements ClientboundPacket { return false; } - @Override - public void handle(PacketHandler h) { - h.handle(this); - } - @Override public void log() { Log.protocol(String.format("[IN] Received tab complete for message(count=%d)", this.count)); diff --git a/src/main/java/de/bixilon/minosoft/protocol/packets/clientbound/play/PacketTabHeaderAndFooter.java b/src/main/java/de/bixilon/minosoft/protocol/packets/clientbound/play/PacketTabHeaderAndFooter.java index 6ca4fb1b7..c357d219e 100644 --- a/src/main/java/de/bixilon/minosoft/protocol/packets/clientbound/play/PacketTabHeaderAndFooter.java +++ b/src/main/java/de/bixilon/minosoft/protocol/packets/clientbound/play/PacketTabHeaderAndFooter.java @@ -15,11 +15,12 @@ package de.bixilon.minosoft.protocol.packets.clientbound.play; import de.bixilon.minosoft.data.text.ChatComponent; import de.bixilon.minosoft.logging.Log; +import de.bixilon.minosoft.modding.event.events.PlayerListInfoChangeEvent; +import de.bixilon.minosoft.protocol.network.Connection; import de.bixilon.minosoft.protocol.packets.ClientboundPacket; import de.bixilon.minosoft.protocol.protocol.InByteBuffer; -import de.bixilon.minosoft.protocol.protocol.PacketHandler; -public class PacketTabHeaderAndFooter implements ClientboundPacket { +public class PacketTabHeaderAndFooter extends ClientboundPacket { ChatComponent header; ChatComponent footer; @@ -31,8 +32,13 @@ public class PacketTabHeaderAndFooter implements ClientboundPacket { } @Override - public void handle(PacketHandler h) { - h.handle(this); + public void handle(Connection connection) { + if (connection.fireEvent(new PlayerListInfoChangeEvent(connection, this))) { + return; + } + + connection.getPlayer().setTabHeader(getHeader()); + connection.getPlayer().setTabFooter(getFooter()); } @Override diff --git a/src/main/java/de/bixilon/minosoft/protocol/packets/clientbound/play/PacketTags.java b/src/main/java/de/bixilon/minosoft/protocol/packets/clientbound/play/PacketTags.java index a52731450..796d8fe42 100644 --- a/src/main/java/de/bixilon/minosoft/protocol/packets/clientbound/play/PacketTags.java +++ b/src/main/java/de/bixilon/minosoft/protocol/packets/clientbound/play/PacketTags.java @@ -17,9 +17,8 @@ import de.bixilon.minosoft.data.Tag; import de.bixilon.minosoft.logging.Log; import de.bixilon.minosoft.protocol.packets.ClientboundPacket; import de.bixilon.minosoft.protocol.protocol.InByteBuffer; -import de.bixilon.minosoft.protocol.protocol.PacketHandler; -public class PacketTags implements ClientboundPacket { +public class PacketTags extends ClientboundPacket { Tag[] blockTags; Tag[] itemTags; Tag[] fluidTags; @@ -44,11 +43,6 @@ public class PacketTags implements ClientboundPacket { return ret; } - @Override - public void handle(PacketHandler h) { - h.handle(this); - } - @Override public void log() { Log.protocol(String.format("[IN] Received tags (blockLength=%d, itemLength=%d, fluidLength=%d, entityLength=%d)", this.blockTags.length, this.itemTags.length, this.fluidTags.length, ((this.entityTags == null) ? 0 : this.entityTags.length))); diff --git a/src/main/java/de/bixilon/minosoft/protocol/packets/clientbound/play/PacketTeams.java b/src/main/java/de/bixilon/minosoft/protocol/packets/clientbound/play/PacketTeams.java index 216efd3c4..19785796f 100644 --- a/src/main/java/de/bixilon/minosoft/protocol/packets/clientbound/play/PacketTeams.java +++ b/src/main/java/de/bixilon/minosoft/protocol/packets/clientbound/play/PacketTeams.java @@ -13,16 +13,19 @@ package de.bixilon.minosoft.protocol.packets.clientbound.play; +import de.bixilon.minosoft.data.scoreboard.Team; import de.bixilon.minosoft.data.text.ChatCode; import de.bixilon.minosoft.data.text.ChatColors; import de.bixilon.minosoft.data.text.ChatComponent; import de.bixilon.minosoft.logging.Log; +import de.bixilon.minosoft.protocol.network.Connection; import de.bixilon.minosoft.protocol.packets.ClientboundPacket; import de.bixilon.minosoft.protocol.protocol.InByteBuffer; -import de.bixilon.minosoft.protocol.protocol.PacketHandler; import de.bixilon.minosoft.util.BitByte; -public class PacketTeams implements ClientboundPacket { +import java.util.Arrays; + +public class PacketTeams extends ClientboundPacket { String name; TeamActions action; ChatComponent displayName; @@ -84,8 +87,14 @@ public class PacketTeams implements ClientboundPacket { } @Override - public void handle(PacketHandler h) { - h.handle(this); + public void handle(Connection connection) { + switch (getAction()) { + case CREATE -> connection.getPlayer().getScoreboardManager().addTeam(new Team(getName(), getDisplayName(), getPrefix(), getSuffix(), isFriendlyFireEnabled(), isSeeingFriendlyInvisibles(), getPlayerNames())); + case INFORMATION_UPDATE -> connection.getPlayer().getScoreboardManager().getTeam(getName()).updateInformation(getDisplayName(), getPrefix(), getSuffix(), isFriendlyFireEnabled(), isSeeingFriendlyInvisibles()); + case REMOVE -> connection.getPlayer().getScoreboardManager().removeTeam(getName()); + case PLAYER_ADD -> connection.getPlayer().getScoreboardManager().getTeam(getName()).addPlayers(Arrays.asList(getPlayerNames())); + case PLAYER_REMOVE -> connection.getPlayer().getScoreboardManager().getTeam(getName()).removePlayers(Arrays.asList(getPlayerNames())); + } } private void setFriendlyFireByLegacy(byte raw) { diff --git a/src/main/java/de/bixilon/minosoft/protocol/packets/clientbound/play/PacketTimeUpdate.java b/src/main/java/de/bixilon/minosoft/protocol/packets/clientbound/play/PacketTimeUpdate.java index 8fe07aa80..03c075f3d 100644 --- a/src/main/java/de/bixilon/minosoft/protocol/packets/clientbound/play/PacketTimeUpdate.java +++ b/src/main/java/de/bixilon/minosoft/protocol/packets/clientbound/play/PacketTimeUpdate.java @@ -14,11 +14,12 @@ package de.bixilon.minosoft.protocol.packets.clientbound.play; import de.bixilon.minosoft.logging.Log; +import de.bixilon.minosoft.modding.event.events.TimeChangeEvent; +import de.bixilon.minosoft.protocol.network.Connection; import de.bixilon.minosoft.protocol.packets.ClientboundPacket; import de.bixilon.minosoft.protocol.protocol.InByteBuffer; -import de.bixilon.minosoft.protocol.protocol.PacketHandler; -public class PacketTimeUpdate implements ClientboundPacket { +public class PacketTimeUpdate extends ClientboundPacket { long worldAge; long timeOfDay; @@ -30,8 +31,10 @@ public class PacketTimeUpdate implements ClientboundPacket { } @Override - public void handle(PacketHandler h) { - h.handle(this); + public void handle(Connection connection) { + if (connection.fireEvent(new TimeChangeEvent(connection, this))) { + return; + } } @Override diff --git a/src/main/java/de/bixilon/minosoft/protocol/packets/clientbound/play/PacketTitle.java b/src/main/java/de/bixilon/minosoft/protocol/packets/clientbound/play/PacketTitle.java index 5cae83bdc..ba6615ead 100644 --- a/src/main/java/de/bixilon/minosoft/protocol/packets/clientbound/play/PacketTitle.java +++ b/src/main/java/de/bixilon/minosoft/protocol/packets/clientbound/play/PacketTitle.java @@ -18,11 +18,12 @@ import de.bixilon.minosoft.data.VersionValueMap; import de.bixilon.minosoft.data.mappings.versions.Versions; import de.bixilon.minosoft.data.text.ChatComponent; import de.bixilon.minosoft.logging.Log; +import de.bixilon.minosoft.modding.event.events.TitleChangeEvent; +import de.bixilon.minosoft.protocol.network.Connection; import de.bixilon.minosoft.protocol.packets.ClientboundPacket; import de.bixilon.minosoft.protocol.protocol.InByteBuffer; -import de.bixilon.minosoft.protocol.protocol.PacketHandler; -public class PacketTitle implements ClientboundPacket { +public class PacketTitle extends ClientboundPacket { TitleActions action; // fields depend on action @@ -48,8 +49,10 @@ public class PacketTitle implements ClientboundPacket { } @Override - public void handle(PacketHandler h) { - h.handle(this); + public void handle(Connection connection) { + if (connection.fireEvent(new TitleChangeEvent(connection, this))) { + return; + } } @Override diff --git a/src/main/java/de/bixilon/minosoft/protocol/packets/clientbound/play/PacketTradeList.java b/src/main/java/de/bixilon/minosoft/protocol/packets/clientbound/play/PacketTradeList.java index b1aea7e3f..7f4fce880 100644 --- a/src/main/java/de/bixilon/minosoft/protocol/packets/clientbound/play/PacketTradeList.java +++ b/src/main/java/de/bixilon/minosoft/protocol/packets/clientbound/play/PacketTradeList.java @@ -19,9 +19,8 @@ import de.bixilon.minosoft.data.inventory.Slot; import de.bixilon.minosoft.logging.Log; import de.bixilon.minosoft.protocol.packets.ClientboundPacket; import de.bixilon.minosoft.protocol.protocol.InByteBuffer; -import de.bixilon.minosoft.protocol.protocol.PacketHandler; -public class PacketTradeList implements ClientboundPacket { +public class PacketTradeList extends ClientboundPacket { int windowId; Trade[] trades; VillagerData.VillagerLevels level; @@ -61,11 +60,6 @@ public class PacketTradeList implements ClientboundPacket { return true; } - @Override - public void handle(PacketHandler h) { - h.handle(this); - } - @Override public void log() { Log.protocol(String.format("[IN] Received select trade packet (windowId=%d, tradeLength=%d, level=%s, experience=%d, regularVillager=%s, canRestock=%s)", this.windowId, this.trades.length, this.level, this.experience, this.isRegularVillager, this.canRestock)); diff --git a/src/main/java/de/bixilon/minosoft/protocol/packets/clientbound/play/PacketUnloadChunk.java b/src/main/java/de/bixilon/minosoft/protocol/packets/clientbound/play/PacketUnloadChunk.java index e2e4ea32c..7ee4c2167 100644 --- a/src/main/java/de/bixilon/minosoft/protocol/packets/clientbound/play/PacketUnloadChunk.java +++ b/src/main/java/de/bixilon/minosoft/protocol/packets/clientbound/play/PacketUnloadChunk.java @@ -15,11 +15,11 @@ package de.bixilon.minosoft.protocol.packets.clientbound.play; import de.bixilon.minosoft.data.world.ChunkLocation; import de.bixilon.minosoft.logging.Log; +import de.bixilon.minosoft.protocol.network.Connection; import de.bixilon.minosoft.protocol.packets.ClientboundPacket; import de.bixilon.minosoft.protocol.protocol.InByteBuffer; -import de.bixilon.minosoft.protocol.protocol.PacketHandler; -public class PacketUnloadChunk implements ClientboundPacket { +public class PacketUnloadChunk extends ClientboundPacket { ChunkLocation location; @Override @@ -29,8 +29,8 @@ public class PacketUnloadChunk implements ClientboundPacket { } @Override - public void handle(PacketHandler h) { - h.handle(this); + public void handle(Connection connection) { + connection.getPlayer().getWorld().unloadChunk(getLocation()); } @Override diff --git a/src/main/java/de/bixilon/minosoft/protocol/packets/clientbound/play/PacketUnlockRecipes.java b/src/main/java/de/bixilon/minosoft/protocol/packets/clientbound/play/PacketUnlockRecipes.java index 11ed16003..0fa290aa7 100644 --- a/src/main/java/de/bixilon/minosoft/protocol/packets/clientbound/play/PacketUnlockRecipes.java +++ b/src/main/java/de/bixilon/minosoft/protocol/packets/clientbound/play/PacketUnlockRecipes.java @@ -17,9 +17,8 @@ import de.bixilon.minosoft.data.mappings.recipes.Recipe; import de.bixilon.minosoft.logging.Log; import de.bixilon.minosoft.protocol.packets.ClientboundPacket; import de.bixilon.minosoft.protocol.protocol.InByteBuffer; -import de.bixilon.minosoft.protocol.protocol.PacketHandler; -public class PacketUnlockRecipes implements ClientboundPacket { +public class PacketUnlockRecipes extends ClientboundPacket { private UnlockRecipeActions action; private boolean isCraftingBookOpen; private boolean isSmeltingBookOpen; @@ -72,11 +71,6 @@ public class PacketUnlockRecipes implements ClientboundPacket { return true; } - @Override - public void handle(PacketHandler h) { - h.handle(this); - } - @Override public void log() { Log.protocol(String.format("[IN] Received unlock crafting recipe packet (action=%s, isCraftingBookOpen=%s, isFilteringActive=%s, isSmeltingBookOpen=%s, isSmeltingFilteringActive=%s listedLength=%d, taggedLength=%s)", this.action, this.isCraftingBookOpen, this.isCraftingFilteringActive, this.isSmeltingBookOpen, this.isSmeltingFilteringActive, this.listed.length, ((this.tagged == null) ? 0 : this.tagged.length))); diff --git a/src/main/java/de/bixilon/minosoft/protocol/packets/clientbound/play/PacketUpdateHealth.java b/src/main/java/de/bixilon/minosoft/protocol/packets/clientbound/play/PacketUpdateHealth.java index d79f5b013..39ab12047 100644 --- a/src/main/java/de/bixilon/minosoft/protocol/packets/clientbound/play/PacketUpdateHealth.java +++ b/src/main/java/de/bixilon/minosoft/protocol/packets/clientbound/play/PacketUpdateHealth.java @@ -14,11 +14,12 @@ package de.bixilon.minosoft.protocol.packets.clientbound.play; import de.bixilon.minosoft.logging.Log; +import de.bixilon.minosoft.modding.event.events.UpdateHealthEvent; +import de.bixilon.minosoft.protocol.network.Connection; import de.bixilon.minosoft.protocol.packets.ClientboundPacket; import de.bixilon.minosoft.protocol.protocol.InByteBuffer; -import de.bixilon.minosoft.protocol.protocol.PacketHandler; -public class PacketUpdateHealth implements ClientboundPacket { +public class PacketUpdateHealth extends ClientboundPacket { float health; int food; float saturation; @@ -36,8 +37,16 @@ public class PacketUpdateHealth implements ClientboundPacket { } @Override - public void handle(PacketHandler h) { - h.handle(this); + public void handle(Connection connection) { + connection.fireEvent(new UpdateHealthEvent(connection, this)); + + connection.getPlayer().setFood(getFood()); + connection.getPlayer().setHealth(getHealth()); + connection.getPlayer().setSaturation(getSaturation()); + if (getHealth() <= 0.0F) { + // do respawn + connection.getSender().respawn(); + } } @Override diff --git a/src/main/java/de/bixilon/minosoft/protocol/packets/clientbound/play/PacketUpdateLight.java b/src/main/java/de/bixilon/minosoft/protocol/packets/clientbound/play/PacketUpdateLight.java index 90a4e2e62..f164efa05 100644 --- a/src/main/java/de/bixilon/minosoft/protocol/packets/clientbound/play/PacketUpdateLight.java +++ b/src/main/java/de/bixilon/minosoft/protocol/packets/clientbound/play/PacketUpdateLight.java @@ -17,10 +17,9 @@ import de.bixilon.minosoft.data.world.ChunkLocation; import de.bixilon.minosoft.logging.Log; import de.bixilon.minosoft.protocol.packets.ClientboundPacket; import de.bixilon.minosoft.protocol.protocol.InByteBuffer; -import de.bixilon.minosoft.protocol.protocol.PacketHandler; import de.bixilon.minosoft.util.ChunkUtil; -public class PacketUpdateLight implements ClientboundPacket { +public class PacketUpdateLight extends ClientboundPacket { ChunkLocation location; @Override @@ -38,11 +37,6 @@ public class PacketUpdateLight implements ClientboundPacket { return true; } - @Override - public void handle(PacketHandler h) { - h.handle(this); - } - @Override public void log() { Log.protocol(String.format("[IN] Received light update (location=%s)", this.location)); diff --git a/src/main/java/de/bixilon/minosoft/protocol/packets/clientbound/play/PacketUpdateSignReceiving.java b/src/main/java/de/bixilon/minosoft/protocol/packets/clientbound/play/PacketUpdateSignReceiving.java index 464b3b13d..0dd86e20d 100644 --- a/src/main/java/de/bixilon/minosoft/protocol/packets/clientbound/play/PacketUpdateSignReceiving.java +++ b/src/main/java/de/bixilon/minosoft/protocol/packets/clientbound/play/PacketUpdateSignReceiving.java @@ -16,11 +16,13 @@ package de.bixilon.minosoft.protocol.packets.clientbound.play; import de.bixilon.minosoft.data.text.ChatComponent; import de.bixilon.minosoft.data.world.BlockPosition; import de.bixilon.minosoft.logging.Log; +import de.bixilon.minosoft.protocol.network.Connection; import de.bixilon.minosoft.protocol.packets.ClientboundPacket; import de.bixilon.minosoft.protocol.protocol.InByteBuffer; -import de.bixilon.minosoft.protocol.protocol.PacketHandler; +import de.bixilon.minosoft.util.nbt.tag.CompoundTag; +import de.bixilon.minosoft.util.nbt.tag.StringTag; -public class PacketUpdateSignReceiving implements ClientboundPacket { +public class PacketUpdateSignReceiving extends ClientboundPacket { final ChatComponent[] lines = new ChatComponent[4]; BlockPosition position; @@ -38,8 +40,14 @@ public class PacketUpdateSignReceiving implements ClientboundPacket { } @Override - public void handle(PacketHandler h) { - h.handle(this); + public void handle(Connection connection) { + CompoundTag nbt = new CompoundTag(); + nbt.writeBlockPosition(getPosition()); + nbt.writeTag("id", new StringTag("minecraft:sign")); + for (int i = 0; i < 4; i++) { + nbt.writeTag(String.format("Text%d", (i + 1)), new StringTag(getLines()[i].getLegacyText())); + } + // ToDo: handle sign updates } @Override diff --git a/src/main/java/de/bixilon/minosoft/protocol/packets/clientbound/play/PacketUpdateViewDistance.java b/src/main/java/de/bixilon/minosoft/protocol/packets/clientbound/play/PacketUpdateViewDistance.java index fd6576071..fdfab00ae 100644 --- a/src/main/java/de/bixilon/minosoft/protocol/packets/clientbound/play/PacketUpdateViewDistance.java +++ b/src/main/java/de/bixilon/minosoft/protocol/packets/clientbound/play/PacketUpdateViewDistance.java @@ -16,9 +16,8 @@ package de.bixilon.minosoft.protocol.packets.clientbound.play; import de.bixilon.minosoft.logging.Log; import de.bixilon.minosoft.protocol.packets.ClientboundPacket; import de.bixilon.minosoft.protocol.protocol.InByteBuffer; -import de.bixilon.minosoft.protocol.protocol.PacketHandler; -public class PacketUpdateViewDistance implements ClientboundPacket { +public class PacketUpdateViewDistance extends ClientboundPacket { int viewDistance; @Override @@ -27,11 +26,6 @@ public class PacketUpdateViewDistance implements ClientboundPacket { return true; } - @Override - public void handle(PacketHandler h) { - h.handle(this); - } - @Override public void log() { Log.protocol(String.format("[IN] Received view distance update (viewDistance=%s)", this.viewDistance)); diff --git a/src/main/java/de/bixilon/minosoft/protocol/packets/clientbound/play/PacketUpdateViewPosition.java b/src/main/java/de/bixilon/minosoft/protocol/packets/clientbound/play/PacketUpdateViewPosition.java index 899cb3c63..a898f9ce4 100644 --- a/src/main/java/de/bixilon/minosoft/protocol/packets/clientbound/play/PacketUpdateViewPosition.java +++ b/src/main/java/de/bixilon/minosoft/protocol/packets/clientbound/play/PacketUpdateViewPosition.java @@ -17,9 +17,8 @@ import de.bixilon.minosoft.data.world.ChunkLocation; import de.bixilon.minosoft.logging.Log; import de.bixilon.minosoft.protocol.packets.ClientboundPacket; import de.bixilon.minosoft.protocol.protocol.InByteBuffer; -import de.bixilon.minosoft.protocol.protocol.PacketHandler; -public class PacketUpdateViewPosition implements ClientboundPacket { +public class PacketUpdateViewPosition extends ClientboundPacket { ChunkLocation location; @Override @@ -28,11 +27,6 @@ public class PacketUpdateViewPosition implements ClientboundPacket { return true; } - @Override - public void handle(PacketHandler h) { - h.handle(this); - } - @Override public void log() { Log.protocol(String.format("[IN] Received view position update (location=%s)", this.location)); diff --git a/src/main/java/de/bixilon/minosoft/protocol/packets/clientbound/play/PacketUseBed.java b/src/main/java/de/bixilon/minosoft/protocol/packets/clientbound/play/PacketUseBed.java index 7b4c8c7cb..8285eac9b 100644 --- a/src/main/java/de/bixilon/minosoft/protocol/packets/clientbound/play/PacketUseBed.java +++ b/src/main/java/de/bixilon/minosoft/protocol/packets/clientbound/play/PacketUseBed.java @@ -17,9 +17,8 @@ import de.bixilon.minosoft.data.world.BlockPosition; import de.bixilon.minosoft.logging.Log; import de.bixilon.minosoft.protocol.packets.ClientboundPacket; import de.bixilon.minosoft.protocol.protocol.InByteBuffer; -import de.bixilon.minosoft.protocol.protocol.PacketHandler; -public class PacketUseBed implements ClientboundPacket { +public class PacketUseBed extends ClientboundPacket { int entityId; BlockPosition position; @@ -34,11 +33,6 @@ public class PacketUseBed implements ClientboundPacket { return true; } - @Override - public void handle(PacketHandler h) { - h.handle(this); - } - @Override public void log() { Log.protocol(String.format("[IN] Entity used bed at %s (entityId=%d)", this.position, this.entityId)); diff --git a/src/main/java/de/bixilon/minosoft/protocol/packets/clientbound/play/PacketVehicleMovement.java b/src/main/java/de/bixilon/minosoft/protocol/packets/clientbound/play/PacketVehicleMovement.java index ccb699a2f..5c085c800 100644 --- a/src/main/java/de/bixilon/minosoft/protocol/packets/clientbound/play/PacketVehicleMovement.java +++ b/src/main/java/de/bixilon/minosoft/protocol/packets/clientbound/play/PacketVehicleMovement.java @@ -17,9 +17,8 @@ import de.bixilon.minosoft.data.entities.Location; import de.bixilon.minosoft.logging.Log; import de.bixilon.minosoft.protocol.packets.ClientboundPacket; import de.bixilon.minosoft.protocol.protocol.InByteBuffer; -import de.bixilon.minosoft.protocol.protocol.PacketHandler; -public class PacketVehicleMovement implements ClientboundPacket { +public class PacketVehicleMovement extends ClientboundPacket { Location location; float yaw; float pitch; @@ -32,11 +31,6 @@ public class PacketVehicleMovement implements ClientboundPacket { return true; } - @Override - public void handle(PacketHandler h) { - h.handle(this); - } - @Override public void log() { Log.protocol(String.format("[IN] Received vehicle movement (location=%s, yaw=%s, pitch=%s)", this.location, this.yaw, this.pitch)); diff --git a/src/main/java/de/bixilon/minosoft/protocol/packets/clientbound/play/PacketWindowItems.java b/src/main/java/de/bixilon/minosoft/protocol/packets/clientbound/play/PacketWindowItems.java index 2a6fd5d17..31c9b9f2e 100644 --- a/src/main/java/de/bixilon/minosoft/protocol/packets/clientbound/play/PacketWindowItems.java +++ b/src/main/java/de/bixilon/minosoft/protocol/packets/clientbound/play/PacketWindowItems.java @@ -15,11 +15,12 @@ package de.bixilon.minosoft.protocol.packets.clientbound.play; import de.bixilon.minosoft.data.inventory.Slot; import de.bixilon.minosoft.logging.Log; +import de.bixilon.minosoft.modding.event.events.MultiSlotChangeEvent; +import de.bixilon.minosoft.protocol.network.Connection; import de.bixilon.minosoft.protocol.packets.ClientboundPacket; import de.bixilon.minosoft.protocol.protocol.InByteBuffer; -import de.bixilon.minosoft.protocol.protocol.PacketHandler; -public class PacketWindowItems implements ClientboundPacket { +public class PacketWindowItems extends ClientboundPacket { byte windowId; Slot[] data; @@ -34,8 +35,10 @@ public class PacketWindowItems implements ClientboundPacket { } @Override - public void handle(PacketHandler h) { - h.handle(this); + public void handle(Connection connection) { + connection.fireEvent(new MultiSlotChangeEvent(connection, this)); + + connection.getPlayer().setInventory(getWindowId(), getData()); } @Override diff --git a/src/main/java/de/bixilon/minosoft/protocol/packets/clientbound/play/PacketWindowProperty.java b/src/main/java/de/bixilon/minosoft/protocol/packets/clientbound/play/PacketWindowProperty.java index 60ab670d6..d36f3b97b 100644 --- a/src/main/java/de/bixilon/minosoft/protocol/packets/clientbound/play/PacketWindowProperty.java +++ b/src/main/java/de/bixilon/minosoft/protocol/packets/clientbound/play/PacketWindowProperty.java @@ -16,9 +16,8 @@ package de.bixilon.minosoft.protocol.packets.clientbound.play; import de.bixilon.minosoft.logging.Log; import de.bixilon.minosoft.protocol.packets.ClientboundPacket; import de.bixilon.minosoft.protocol.protocol.InByteBuffer; -import de.bixilon.minosoft.protocol.protocol.PacketHandler; -public class PacketWindowProperty implements ClientboundPacket { +public class PacketWindowProperty extends ClientboundPacket { byte windowId; short property; short value; @@ -31,11 +30,6 @@ public class PacketWindowProperty implements ClientboundPacket { return true; } - @Override - public void handle(PacketHandler h) { - h.handle(this); - } - @Override public void log() { Log.protocol(String.format("[IN] Received window property (windowId=%d, property=%d, value=%d)", this.windowId, this.property, this.value)); diff --git a/src/main/java/de/bixilon/minosoft/protocol/packets/clientbound/play/PacketWorldBorder.java b/src/main/java/de/bixilon/minosoft/protocol/packets/clientbound/play/PacketWorldBorder.java index 9fc647f30..99ac688f4 100644 --- a/src/main/java/de/bixilon/minosoft/protocol/packets/clientbound/play/PacketWorldBorder.java +++ b/src/main/java/de/bixilon/minosoft/protocol/packets/clientbound/play/PacketWorldBorder.java @@ -16,9 +16,8 @@ package de.bixilon.minosoft.protocol.packets.clientbound.play; import de.bixilon.minosoft.logging.Log; import de.bixilon.minosoft.protocol.packets.ClientboundPacket; import de.bixilon.minosoft.protocol.protocol.InByteBuffer; -import de.bixilon.minosoft.protocol.protocol.PacketHandler; -public class PacketWorldBorder implements ClientboundPacket { +public class PacketWorldBorder extends ClientboundPacket { WorldBorderActions action; // fields depend on action @@ -65,11 +64,6 @@ public class PacketWorldBorder implements ClientboundPacket { return true; } - @Override - public void handle(PacketHandler h) { - h.handle(this); - } - @Override public void log() { switch (this.action) { diff --git a/src/main/java/de/bixilon/minosoft/protocol/packets/clientbound/status/PacketStatusPong.java b/src/main/java/de/bixilon/minosoft/protocol/packets/clientbound/status/PacketStatusPong.java index d9477e83f..4a93cd4d5 100644 --- a/src/main/java/de/bixilon/minosoft/protocol/packets/clientbound/status/PacketStatusPong.java +++ b/src/main/java/de/bixilon/minosoft/protocol/packets/clientbound/status/PacketStatusPong.java @@ -13,12 +13,15 @@ package de.bixilon.minosoft.protocol.packets.clientbound.status; +import de.bixilon.minosoft.data.player.PingBars; import de.bixilon.minosoft.logging.Log; +import de.bixilon.minosoft.modding.event.events.StatusPongEvent; +import de.bixilon.minosoft.protocol.network.Connection; import de.bixilon.minosoft.protocol.packets.ClientboundPacket; +import de.bixilon.minosoft.protocol.protocol.ConnectionPing; import de.bixilon.minosoft.protocol.protocol.InByteBuffer; -import de.bixilon.minosoft.protocol.protocol.PacketHandler; -public class PacketStatusPong implements ClientboundPacket { +public class PacketStatusPong extends ClientboundPacket { long id; @Override @@ -28,8 +31,24 @@ public class PacketStatusPong implements ClientboundPacket { } @Override - public void handle(PacketHandler h) { - h.handle(this); + public void handle(Connection connection) { + connection.fireEvent(new StatusPongEvent(connection, this)); + + ConnectionPing ping = connection.getConnectionStatusPing(); + if (ping.getPingId() != getID()) { + Log.warn(String.format("Server sent unknown ping answer (pingId=%d, expected=%d)", getID(), ping.getPingId())); + return; + } + long pingDifference = System.currentTimeMillis() - ping.getSendingTime(); + Log.debug(String.format("Pong received (ping=%dms, pingBars=%s)", pingDifference, PingBars.byPing(pingDifference))); + switch (connection.getReason()) { + case PING -> connection.disconnect();// pong arrived, closing connection + case GET_VERSION -> { + // reconnect... + connection.disconnect(); + Log.info(String.format("Server is running on version %s (versionId=%d, protocolId=%d), reconnecting...", connection.getVersion().getVersionName(), connection.getVersion().getVersionId(), connection.getVersion().getProtocolId())); + } + } } @Override diff --git a/src/main/java/de/bixilon/minosoft/protocol/packets/clientbound/status/PacketStatusResponse.java b/src/main/java/de/bixilon/minosoft/protocol/packets/clientbound/status/PacketStatusResponse.java index 8bdeab56e..0984f75f0 100644 --- a/src/main/java/de/bixilon/minosoft/protocol/packets/clientbound/status/PacketStatusResponse.java +++ b/src/main/java/de/bixilon/minosoft/protocol/packets/clientbound/status/PacketStatusResponse.java @@ -13,13 +13,18 @@ package de.bixilon.minosoft.protocol.packets.clientbound.status; +import de.bixilon.minosoft.data.mappings.versions.Version; +import de.bixilon.minosoft.data.mappings.versions.Versions; import de.bixilon.minosoft.logging.Log; +import de.bixilon.minosoft.modding.event.events.StatusResponseEvent; +import de.bixilon.minosoft.protocol.network.Connection; import de.bixilon.minosoft.protocol.packets.ClientboundPacket; +import de.bixilon.minosoft.protocol.packets.serverbound.status.PacketStatusPing; import de.bixilon.minosoft.protocol.ping.ServerListPing; +import de.bixilon.minosoft.protocol.protocol.ConnectionPing; import de.bixilon.minosoft.protocol.protocol.InByteBuffer; -import de.bixilon.minosoft.protocol.protocol.PacketHandler; -public class PacketStatusResponse implements ClientboundPacket { +public class PacketStatusResponse extends ClientboundPacket { ServerListPing response; @Override @@ -29,8 +34,28 @@ public class PacketStatusResponse implements ClientboundPacket { } @Override - public void handle(PacketHandler h) { - h.handle(this); + public void handle(Connection connection) { + connection.fireEvent(new StatusResponseEvent(connection, this)); + + // now we know the version, set it, if the config allows it + Version version; + int protocolId = -1; + if (connection.getDesiredVersionNumber() != -1) { + protocolId = Versions.getVersionById(connection.getDesiredVersionNumber()).getProtocolId(); + } + if (protocolId == -1) { + protocolId = getResponse().getProtocolId(); + } + version = Versions.getVersionByProtocolId(protocolId); + if (version == null) { + Log.fatal(String.format("Server is running on unknown version or a invalid version was forced (protocolId=%d, brand=\"%s\")", protocolId, getResponse().getServerBrand())); + } else { + connection.setVersion(version); + } + Log.info(String.format("Status response received: %s/%s online. MotD: '%s'", getResponse().getPlayerOnline(), getResponse().getMaxPlayers(), getResponse().getMotd().getANSIColoredMessage())); + connection.handlePingCallbacks(getResponse()); + connection.setConnectionStatusPing(new ConnectionPing()); + connection.sendPacket(new PacketStatusPing(connection.getConnectionStatusPing())); } @Override diff --git a/src/main/java/de/bixilon/minosoft/protocol/protocol/PacketHandler.java b/src/main/java/de/bixilon/minosoft/protocol/protocol/PacketHandler.java deleted file mode 100644 index f52060b26..000000000 --- a/src/main/java/de/bixilon/minosoft/protocol/protocol/PacketHandler.java +++ /dev/null @@ -1,830 +0,0 @@ -/* - * 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.protocol; - -import de.bixilon.minosoft.Minosoft; -import de.bixilon.minosoft.config.ConfigurationPaths; -import de.bixilon.minosoft.data.GameModes; -import de.bixilon.minosoft.data.commands.parser.exceptions.CommandParseException; -import de.bixilon.minosoft.data.entities.entities.Entity; -import de.bixilon.minosoft.data.entities.entities.player.PlayerEntity; -import de.bixilon.minosoft.data.mappings.versions.Version; -import de.bixilon.minosoft.data.mappings.versions.Versions; -import de.bixilon.minosoft.data.player.PingBars; -import de.bixilon.minosoft.data.player.PlayerListItem; -import de.bixilon.minosoft.data.player.PlayerListItemBulk; -import de.bixilon.minosoft.data.scoreboard.ScoreboardObjective; -import de.bixilon.minosoft.data.scoreboard.ScoreboardScore; -import de.bixilon.minosoft.data.scoreboard.Team; -import de.bixilon.minosoft.data.world.BlockPosition; -import de.bixilon.minosoft.data.world.Chunk; -import de.bixilon.minosoft.logging.Log; -import de.bixilon.minosoft.modding.channels.DefaultPluginChannels; -import de.bixilon.minosoft.modding.event.events.*; -import de.bixilon.minosoft.protocol.network.Connection; -import de.bixilon.minosoft.protocol.packets.clientbound.login.*; -import de.bixilon.minosoft.protocol.packets.clientbound.play.*; -import de.bixilon.minosoft.protocol.packets.clientbound.status.PacketStatusPong; -import de.bixilon.minosoft.protocol.packets.clientbound.status.PacketStatusResponse; -import de.bixilon.minosoft.protocol.packets.serverbound.login.PacketEncryptionResponse; -import de.bixilon.minosoft.protocol.packets.serverbound.play.PacketConfirmTeleport; -import de.bixilon.minosoft.protocol.packets.serverbound.play.PacketKeepAliveResponse; -import de.bixilon.minosoft.protocol.packets.serverbound.play.PacketPlayerPositionAndRotationSending; -import de.bixilon.minosoft.protocol.packets.serverbound.status.PacketStatusPing; -import de.bixilon.minosoft.util.nbt.tag.CompoundTag; -import de.bixilon.minosoft.util.nbt.tag.StringTag; - -import javax.crypto.SecretKey; -import java.math.BigInteger; -import java.security.PublicKey; -import java.util.Arrays; -import java.util.UUID; - -public class PacketHandler { - private final Connection connection; - - public PacketHandler(Connection connection) { - this.connection = connection; - } - - public void handle(PacketStatusResponse pkg) { - this.connection.fireEvent(new StatusResponseEvent(this.connection, pkg)); - - // now we know the version, set it, if the config allows it - Version version; - int protocolId = -1; - if (this.connection.getDesiredVersionNumber() != -1) { - protocolId = Versions.getVersionById(this.connection.getDesiredVersionNumber()).getProtocolId(); - } - if (protocolId == -1) { - protocolId = pkg.getResponse().getProtocolId(); - } - version = Versions.getVersionByProtocolId(protocolId); - if (version == null) { - Log.fatal(String.format("Server is running on unknown version or a invalid version was forced (protocolId=%d, brand=\"%s\")", protocolId, pkg.getResponse().getServerBrand())); - } else { - this.connection.setVersion(version); - } - Log.info(String.format("Status response received: %s/%s online. MotD: '%s'", pkg.getResponse().getPlayerOnline(), pkg.getResponse().getMaxPlayers(), pkg.getResponse().getMotd().getANSIColoredMessage())); - this.connection.handlePingCallbacks(pkg.getResponse()); - this.connection.setConnectionStatusPing(new ConnectionPing()); - this.connection.sendPacket(new PacketStatusPing(this.connection.getConnectionStatusPing())); - } - - public void handle(PacketStatusPong pkg) { - this.connection.fireEvent(new StatusPongEvent(this.connection, pkg)); - - ConnectionPing ping = this.connection.getConnectionStatusPing(); - if (ping.getPingId() != pkg.getID()) { - Log.warn(String.format("Server sent unknown ping answer (pingId=%d, expected=%d)", pkg.getID(), ping.getPingId())); - return; - } - long pingDifference = System.currentTimeMillis() - ping.getSendingTime(); - Log.debug(String.format("Pong received (ping=%dms, pingBars=%s)", pingDifference, PingBars.byPing(pingDifference))); - switch (this.connection.getReason()) { - case PING -> this.connection.disconnect();// pong arrived, closing connection - case GET_VERSION -> { - // reconnect... - this.connection.disconnect(); - Log.info(String.format("Server is running on version %s (versionId=%d, protocolId=%d), reconnecting...", this.connection.getVersion().getVersionName(), this.connection.getVersion().getVersionId(), this.connection.getVersion().getProtocolId())); - } - } - } - - public void handle(PacketEncryptionRequest pkg) { - SecretKey secretKey = CryptManager.createNewSharedKey(); - PublicKey publicKey = CryptManager.decodePublicKey(pkg.getPublicKey()); - String serverHash = new BigInteger(CryptManager.getServerHash(pkg.getServerId(), publicKey, secretKey)).toString(16); - this.connection.getPlayer().getAccount().join(serverHash); - this.connection.sendPacket(new PacketEncryptionResponse(secretKey, pkg.getVerifyToken(), publicKey)); - } - - public void handle(PacketLoginSuccess pkg) { - } - - public void handle(PacketJoinGame pkg) { - if (this.connection.fireEvent(new JoinGameEvent(this.connection, pkg))) { - return; - } - - this.connection.getPlayer().setGameMode(pkg.getGameMode()); - this.connection.getPlayer().getWorld().setHardcore(pkg.isHardcore()); - this.connection.getMapping().setDimensions(pkg.getDimensions()); - this.connection.getPlayer().getWorld().setDimension(pkg.getDimension()); - PlayerEntity entity = new PlayerEntity(this.connection, pkg.getEntityId(), this.connection.getPlayer().getPlayerUUID(), null, null, this.connection.getPlayer().getPlayerName(), null, null); - this.connection.getPlayer().setEntity(entity); - this.connection.getPlayer().getWorld().addEntity(entity); - this.connection.getSender().sendChatMessage("I am alive! ~ Minosoft"); - } - - public void handle(PacketLoginDisconnect pkg) { - this.connection.fireEvent(new LoginDisconnectEvent(this.connection, pkg.getReason())); - Log.info(String.format("Disconnecting from server (reason=%s)", pkg.getReason().getANSIColoredMessage())); - this.connection.disconnect(); - } - - public void handle(PacketPlayerListItem pkg) { - if (this.connection.fireEvent(new PlayerListItemChangeEvent(this.connection, pkg))) { - return; - } - for (PlayerListItemBulk bulk : pkg.getPlayerList()) { - PlayerListItem item = this.connection.getPlayer().getPlayerList().get(bulk.getUUID()); - if (item == null && !bulk.isLegacy()) { - // Aaaaah. Fuck this shit. The server sends us bullshit! - continue; - } - switch (bulk.getAction()) { - case ADD -> this.connection.getPlayer().getPlayerList().put(bulk.getUUID(), new PlayerListItem(bulk.getUUID(), bulk.getName(), bulk.getPing(), bulk.getGameMode(), bulk.getDisplayName(), bulk.getProperties())); - case UPDATE_LATENCY -> { - if (bulk.isLegacy()) { - // add or update - if (item == null) { - // create - UUID uuid = UUID.randomUUID(); - this.connection.getPlayer().getPlayerList().put(uuid, new PlayerListItem(uuid, bulk.getName(), bulk.getPing())); - } else { - // update ping - item.setPing(bulk.getPing()); - } - continue; - } - this.connection.getPlayer().getPlayerList().get(bulk.getUUID()).setPing(bulk.getPing()); - } - case REMOVE_PLAYER -> { - if (bulk.isLegacy()) { - if (item == null) { - // not initialized yet - continue; - } - this.connection.getPlayer().getPlayerList().remove(this.connection.getPlayer().getPlayerListItem(bulk.getName()).getUUID()); - continue; - } - this.connection.getPlayer().getPlayerList().remove(bulk.getUUID()); - } - case UPDATE_GAMEMODE -> item.setGameMode(bulk.getGameMode()); - case UPDATE_DISPLAY_NAME -> item.setDisplayName(bulk.getDisplayName()); - } - } - } - - public void handle(PacketTimeUpdate pkg) { - if (this.connection.fireEvent(new TimeChangeEvent(this.connection, pkg))) { - return; - } - } - - public void handle(PacketKeepAlive pkg) { - this.connection.sendPacket(new PacketKeepAliveResponse(pkg.getId())); - } - - public void handle(PacketChunkBulk pkg) { - pkg.getChunks().forEach(((location, chunk) -> this.connection.fireEvent(new ChunkDataChangeEvent(this.connection, location, chunk)))); - - this.connection.getPlayer().getWorld().setChunks(pkg.getChunks()); - } - - public void handle(PacketUpdateHealth pkg) { - this.connection.fireEvent(new UpdateHealthEvent(this.connection, pkg)); - - this.connection.getPlayer().setFood(pkg.getFood()); - this.connection.getPlayer().setHealth(pkg.getHealth()); - this.connection.getPlayer().setSaturation(pkg.getSaturation()); - if (pkg.getHealth() <= 0.0F) { - // do respawn - this.connection.getSender().respawn(); - } - } - - public void handle(PacketPluginMessageReceiving pkg) { - if (pkg.getChannel().equals(DefaultPluginChannels.MC_BRAND.getChangeableIdentifier().get(this.connection.getVersion().getVersionId()))) { - InByteBuffer data = pkg.getDataAsBuffer(); - String serverVersion; - String clientVersion = (Minosoft.getConfig().getBoolean(ConfigurationPaths.BooleanPaths.NETWORK_FAKE_CLIENT_BRAND) ? "vanilla" : "Minosoft"); - OutByteBuffer toSend = new OutByteBuffer(this.connection); - if (this.connection.getVersion().getVersionId() < 29) { - // no length prefix - serverVersion = new String(data.getBytes()); - toSend.writeBytes(clientVersion.getBytes()); - } else { - // length prefix - serverVersion = data.readString(); - toSend.writeString(clientVersion); - } - Log.info(String.format("Server is running \"%s\", connected with %s", serverVersion, this.connection.getVersion().getVersionName())); - - this.connection.getSender().sendPluginMessageData(DefaultPluginChannels.MC_BRAND.getChangeableIdentifier().get(this.connection.getVersion().getVersionId()), toSend); - return; - } - - // MC|StopSound - if (pkg.getChannel().equals(DefaultPluginChannels.MC_BRAND.getChangeableIdentifier().get(this.connection.getVersion().getVersionId()))) { - // it is basically a packet, handle it like a packet: - PacketStopSound packet = new PacketStopSound(); - packet.read(pkg.getDataAsBuffer()); - handle(packet); - return; - } - - this.connection.fireEvent(new PluginMessageReceiveEvent(this.connection, pkg)); - } - - public void handle(PacketSpawnLocation pkg) { - this.connection.fireEvent(new SpawnLocationChangeEvent(this.connection, pkg)); - this.connection.getPlayer().setSpawnLocation(pkg.getSpawnLocation()); - } - - public void handle(PacketChatMessageReceiving pkg) { - ChatMessageReceivingEvent event = new ChatMessageReceivingEvent(this.connection, pkg); - if (this.connection.fireEvent(event)) { - return; - } - Log.game(switch (pkg.getPosition()) { - case SYSTEM_MESSAGE -> "[SYSTEM] "; - case ABOVE_HOTBAR -> "[HOTBAR] "; - default -> "[CHAT] "; - } + event.getMessage()); - } - - public void handle(PacketDisconnect pkg) { - this.connection.fireEvent(new LoginDisconnectEvent(this.connection, pkg)); - // got kicked - this.connection.disconnect(); - } - - public void handle(PacketHeldItemChangeReceiving pkg) { - this.connection.getPlayer().setSelectedSlot(pkg.getSlot()); - } - - public void handle(PacketSetExperience pkg) { - if (this.connection.fireEvent(new ExperienceChangeEvent(this.connection, pkg))) { - return; - } - - this.connection.getPlayer().setLevel(pkg.getLevel()); - this.connection.getPlayer().setTotalExperience(pkg.getTotal()); - } - - public void handle(PacketChangeGameState pkg) { - ChangeGameStateEvent event = new ChangeGameStateEvent(this.connection, pkg); - if (this.connection.fireEvent(event)) { - return; - } - - Log.game(switch (pkg.getReason()) { - case START_RAINING -> "Received weather packet: Starting rain..."; - case STOP_RAINING -> "Received weather packet: Stopping rain..."; - case CHANGE_GAMEMODE -> String.format("Received game mode change: Now in %s", GameModes.byId(pkg.getIntValue())); - default -> ""; - }); - - switch (pkg.getReason()) { - case STOP_RAINING -> this.connection.getPlayer().getWorld().setRaining(false); - case START_RAINING -> this.connection.getPlayer().getWorld().setRaining(true); - case CHANGE_GAMEMODE -> this.connection.getPlayer().setGameMode(GameModes.byId(pkg.getIntValue())); - } - } - - public void handle(PacketSpawnMob pkg) { - this.connection.fireEvent(new EntitySpawnEvent(this.connection, pkg)); - - this.connection.getPlayer().getWorld().addEntity(pkg.getEntity()); - this.connection.getVelocityHandler().handleVelocity(pkg.getEntity(), pkg.getVelocity()); - } - - public void handle(PacketEntityMovementAndRotation pkg) { - Entity entity = this.connection.getPlayer().getWorld().getEntity(pkg.getEntityId()); - if (entity == null) { - // thanks mojang - return; - } - entity.setLocation(pkg.getRelativeLocation()); - entity.setRotation(pkg.getYaw(), pkg.getPitch()); - } - - public void handle(PacketEntityMovement pkg) { - Entity entity = this.connection.getPlayer().getWorld().getEntity(pkg.getEntityId()); - if (entity == null) { - // thanks mojang - return; - } - entity.setLocation(pkg.getRelativeLocation()); - } - - public void handle(PacketEntityRotation pkg) { - Entity entity = this.connection.getPlayer().getWorld().getEntity(pkg.getEntityId()); - if (entity == null) { - // thanks mojang - return; - } - entity.setRotation(pkg.getYaw(), pkg.getPitch()); - } - - public void handle(PacketDestroyEntity pkg) { - this.connection.fireEvent(new EntityDespawnEvent(this.connection, pkg)); - - for (int entityId : pkg.getEntityIds()) { - this.connection.getPlayer().getWorld().removeEntity(entityId); - } - } - - public void handle(PacketEntityVelocity pkg) { - Entity entity = this.connection.getPlayer().getWorld().getEntity(pkg.getEntityId()); - - if (entity == null) { - // thanks mojang - return; - } - this.connection.getVelocityHandler().handleVelocity(entity, pkg.getVelocity()); - } - - public void handle(PacketSpawnPlayer pkg) { - this.connection.fireEvent(new EntitySpawnEvent(this.connection, pkg)); - - this.connection.getPlayer().getWorld().addEntity(pkg.getEntity()); - this.connection.getVelocityHandler().handleVelocity(pkg.getEntity(), pkg.getVelocity()); - } - - public void handle(PacketEntityTeleport pkg) { - Entity entity = this.connection.getPlayer().getWorld().getEntity(pkg.getEntityId()); - if (entity == null) { - // thanks mojang - return; - } - entity.setLocation(pkg.getRelativeLocation()); - entity.setRotation(pkg.getYaw(), pkg.getPitch()); - } - - public void handle(PacketEntityHeadRotation pkg) { - Entity entity = this.connection.getPlayer().getWorld().getEntity(pkg.getEntityId()); - if (entity == null) { - // thanks mojang - return; - } - entity.setHeadRotation(pkg.getHeadYaw()); - } - - public void handle(PacketWindowItems pkg) { - this.connection.fireEvent(new MultiSlotChangeEvent(this.connection, pkg)); - - this.connection.getPlayer().setInventory(pkg.getWindowId(), pkg.getData()); - } - - public void handle(PacketEntityMetadata pkg) { - Entity entity = this.connection.getPlayer().getWorld().getEntity(pkg.getEntityId()); - if (entity == null) { - // thanks mojang - return; - } - entity.setMetaData(pkg.getEntityData()); - } - - public void handle(PacketEntityEquipment pkg) { - this.connection.fireEvent(new EntityEquipmentChangeEvent(this.connection, pkg)); - - Entity entity = this.connection.getPlayer().getWorld().getEntity(pkg.getEntityId()); - if (entity == null) { - // thanks mojang - return; - } - entity.setEquipment(pkg.getSlots()); - } - - public void handle(PacketBlockChange pkg) { - Chunk chunk = this.connection.getPlayer().getWorld().getChunk(pkg.getPosition().getChunkLocation()); - if (chunk == null) { - // thanks mojang - return; - } - this.connection.fireEvent(new BlockChangeEvent(this.connection, pkg)); - - chunk.setBlock(pkg.getPosition().getInChunkLocation(), pkg.getBlock()); - } - - public void handle(PacketMultiBlockChange pkg) { - Chunk chunk = this.connection.getPlayer().getWorld().getChunk(pkg.getLocation()); - if (chunk == null) { - // thanks mojang - return; - } - this.connection.fireEvent(new MultiBlockChangeEvent(this.connection, pkg)); - chunk.setBlocks(pkg.getBlocks()); - } - - public void handle(PacketRespawn pkg) { - if (this.connection.fireEvent(new RespawnEvent(this.connection, pkg))) { - return; - } - - // clear all chunks - this.connection.getPlayer().getWorld().getAllChunks().clear(); - this.connection.getPlayer().getWorld().setDimension(pkg.getDimension()); - this.connection.getPlayer().setSpawnConfirmed(false); - this.connection.getPlayer().setGameMode(pkg.getGameMode()); - } - - public void handle(PacketOpenSignEditor pkg) { - OpenSignEditorEvent event = new OpenSignEditorEvent(this.connection, pkg); - if (this.connection.fireEvent(event)) { - return; - } - } - - public void handle(PacketSpawnObject pkg) { - this.connection.fireEvent(new EntitySpawnEvent(this.connection, pkg)); - - this.connection.getPlayer().getWorld().addEntity(pkg.getEntity()); - this.connection.getVelocityHandler().handleVelocity(pkg.getEntity(), pkg.getVelocity()); - } - - public void handle(PacketSpawnExperienceOrb pkg) { - this.connection.fireEvent(new EntitySpawnEvent(this.connection, pkg)); - - this.connection.getPlayer().getWorld().addEntity(pkg.getEntity()); - } - - public void handle(PacketSpawnWeatherEntity pkg) { - this.connection.fireEvent(new EntitySpawnEvent(this.connection, pkg)); - this.connection.fireEvent(new LightningBoltSpawnEvent(this.connection, pkg)); - } - - public void handle(PacketChunkData pkg) { - pkg.getBlockEntities().forEach(((position, compoundTag) -> this.connection.fireEvent(new BlockEntityMetaDataChangeEvent(this.connection, position, null, compoundTag)))); - this.connection.fireEvent(new ChunkDataChangeEvent(this.connection, pkg)); - - this.connection.getPlayer().getWorld().setChunk(pkg.getLocation(), pkg.getChunk()); - this.connection.getPlayer().getWorld().setBlockEntityData(pkg.getBlockEntities()); - } - - public void handle(PacketEntityEffect pkg) { - Entity entity = this.connection.getPlayer().getWorld().getEntity(pkg.getEntityId()); - if (entity == null) { - // thanks mojang - return; - } - entity.addEffect(pkg.getEffect()); - } - - public void handle(PacketRemoveEntityEffect pkg) { - Entity entity = this.connection.getPlayer().getWorld().getEntity(pkg.getEntityId()); - if (entity == null) { - // thanks mojang - return; - } - entity.removeEffect(pkg.getEffect()); - } - - public void handle(PacketUpdateSignReceiving pkg) { - CompoundTag nbt = new CompoundTag(); - nbt.writeBlockPosition(pkg.getPosition()); - nbt.writeTag("id", new StringTag("minecraft:sign")); - for (int i = 0; i < 4; i++) { - nbt.writeTag(String.format("Text%d", (i + 1)), new StringTag(pkg.getLines()[i].getLegacyText())); - } - // ToDo: handle sign updates - } - - public void handle(PacketEntityAnimation pkg) { - // ToDo - } - - public void handle(PacketEntityEvent pkg) { - // ToDo - } - - public void handle(PacketNamedSoundEffect pkg) { - // ToDo - } - - public void handle(PacketPlayerAbilitiesReceiving pkg) { - // ToDo: used to set fly abilities - } - - public void handle(PacketPlayerPositionAndRotation pkg) { - // ToDo: GUI should do this - this.connection.getPlayer().getEntity().setLocation(pkg.getLocation()); - if (this.connection.getVersion().getVersionId() >= 79) { - this.connection.sendPacket(new PacketConfirmTeleport(pkg.getTeleportId())); - } else { - this.connection.sendPacket(new PacketPlayerPositionAndRotationSending(pkg.getLocation(), pkg.getRotation(), pkg.isOnGround())); - } - } - - public void handle(PacketAttachEntity pkg) { - Entity entity = this.connection.getPlayer().getWorld().getEntity(pkg.getEntityId()); - if (entity == null) { - // thanks mojang - return; - } - entity.attachTo(pkg.getVehicleId()); - // ToDo leash support - } - - public void handle(PacketUseBed pkg) { - } - - public void handle(PacketBlockEntityMetadata pkg) { - this.connection.fireEvent(new BlockEntityMetaDataChangeEvent(this.connection, pkg)); - this.connection.getPlayer().getWorld().setBlockEntityData(pkg.getPosition(), pkg.getData()); - } - - public void handle(PacketBlockBreakAnimation pkg) { - BlockBreakAnimationEvent event = new BlockBreakAnimationEvent(this.connection, pkg); - if (this.connection.fireEvent(event)) { - return; - } - } - - public void handle(PacketBlockAction pkg) { - BlockActionEvent event = new BlockActionEvent(this.connection, pkg); - if (this.connection.fireEvent(event)) { - return; - } - } - - public void handle(PacketExplosion pkg) { - // remove all blocks set by explosion - for (byte[] record : pkg.getRecords()) { - int x = ((int) pkg.getLocation().getX()) + record[0]; - int y = ((int) pkg.getLocation().getY()) + record[1]; - int z = ((int) pkg.getLocation().getZ()) + record[2]; - BlockPosition blockPosition = new BlockPosition(x, (short) y, z); - this.connection.getPlayer().getWorld().setBlock(blockPosition, null); - } - // ToDo: motion support - } - - public void handle(PacketCollectItem pkg) { - if (this.connection.fireEvent(new CollectItemAnimationEvent(this.connection, pkg))) { - return; - } - // ToDo - } - - public void handle(PacketOpenWindow pkg) { - this.connection.getPlayer().createInventory(pkg.getInventoryProperties()); - } - - public void handle(PacketCloseWindowReceiving pkg) { - CloseWindowEvent event = new CloseWindowEvent(this.connection, pkg); - if (this.connection.fireEvent(event)) { - return; - } - - this.connection.getPlayer().deleteInventory(pkg.getWindowId()); - } - - public void handle(PacketSetSlot pkg) { - this.connection.fireEvent(new SingleSlotChangeEvent(this.connection, pkg)); - - if (pkg.getWindowId() == -1) { - // thanks mojang - // ToDo: what is windowId -1 - return; - } - this.connection.getPlayer().setSlot(pkg.getWindowId(), pkg.getSlotId(), pkg.getSlot()); - } - - public void handle(PacketWindowProperty pkg) { - // ToDo - } - - public void handle(PacketConfirmTransactionReceiving pkg) { - // ToDo - } - - public void handle(PacketStatistics pkg) { - // ToDo - } - - public void handle(PacketTabCompleteReceiving pkg) { - // ToDo - } - - public void handle(PacketSpawnPainting pkg) { - this.connection.fireEvent(new EntitySpawnEvent(this.connection, pkg)); - - this.connection.getPlayer().getWorld().addEntity(pkg.getEntity()); - } - - public void handle(PacketParticle pkg) { - if (this.connection.fireEvent(new ParticleSpawnEvent(this.connection, pkg))) { - return; - } - } - - public void handle(PacketEffect pkg) { - if (this.connection.fireEvent(new EffectEvent(this.connection, pkg))) { - return; - } - } - - public void handle(PacketScoreboardObjective pkg) { - switch (pkg.getAction()) { - case CREATE -> this.connection.getPlayer().getScoreboardManager().addObjective(new ScoreboardObjective(pkg.getName(), pkg.getValue())); - case UPDATE -> this.connection.getPlayer().getScoreboardManager().getObjective(pkg.getName()).setValue(pkg.getValue()); - case REMOVE -> this.connection.getPlayer().getScoreboardManager().removeObjective(pkg.getName()); - } - } - - public void handle(PacketScoreboardUpdateScore pkg) { - switch (pkg.getAction()) { - case CREATE_UPDATE -> this.connection.getPlayer().getScoreboardManager().getObjective(pkg.getScoreName()).addScore(new ScoreboardScore(pkg.getItemName(), pkg.getScoreName(), pkg.getScoreValue())); - case REMOVE -> { - ScoreboardObjective objective = this.connection.getPlayer().getScoreboardManager().getObjective(pkg.getScoreName()); - if (objective != null) { - // thanks mojang - objective.removeScore(pkg.getItemName()); - } - } - } - } - - public void handle(PacketScoreboardDisplayScoreboard pkg) { - // ToDo - } - - public void handle(PacketTeams pkg) { - switch (pkg.getAction()) { - case CREATE -> this.connection.getPlayer().getScoreboardManager().addTeam(new Team(pkg.getName(), pkg.getDisplayName(), pkg.getPrefix(), pkg.getSuffix(), pkg.isFriendlyFireEnabled(), pkg.isSeeingFriendlyInvisibles(), pkg.getPlayerNames())); - case INFORMATION_UPDATE -> this.connection.getPlayer().getScoreboardManager().getTeam(pkg.getName()).updateInformation(pkg.getDisplayName(), pkg.getPrefix(), pkg.getSuffix(), pkg.isFriendlyFireEnabled(), pkg.isSeeingFriendlyInvisibles()); - case REMOVE -> this.connection.getPlayer().getScoreboardManager().removeTeam(pkg.getName()); - case PLAYER_ADD -> this.connection.getPlayer().getScoreboardManager().getTeam(pkg.getName()).addPlayers(Arrays.asList(pkg.getPlayerNames())); - case PLAYER_REMOVE -> this.connection.getPlayer().getScoreboardManager().getTeam(pkg.getName()).removePlayers(Arrays.asList(pkg.getPlayerNames())); - } - } - - public void handle(PacketMapData pkg) { - // ToDo - } - - public void handle(PacketLoginSetCompression pkg) { - } - - public void handle(PacketServerDifficulty pkg) { - } - - public void handle(PacketTabHeaderAndFooter pkg) { - if (this.connection.fireEvent(new PlayerListInfoChangeEvent(this.connection, pkg))) { - return; - } - - this.connection.getPlayer().setTabHeader(pkg.getHeader()); - this.connection.getPlayer().setTabFooter(pkg.getFooter()); - } - - public void handle(PacketResourcePackSend pkg) { - ResourcePackChangeEvent event = new ResourcePackChangeEvent(this.connection, pkg); - if (this.connection.fireEvent(event)) { - return; - } - } - - public void handle(PacketEntityProperties pkg) { - // ToDo - } - - public void handle(PacketWorldBorder pkg) { - // ToDo - } - - public void handle(PacketTitle pkg) { - if (this.connection.fireEvent(new TitleChangeEvent(this.connection, pkg))) { - return; - } - - } - - public void handle(PacketCombatEvent pkg) { - // ToDo - } - - public void handle(PacketCamera pkg) { - // ToDo - } - - public void handle(PacketUnloadChunk pkg) { - this.connection.getPlayer().getWorld().unloadChunk(pkg.getLocation()); - } - - public void handle(PacketSoundEffect pkg) { - // ToDo - } - - public void handle(PacketBossBar pkg) { - BossBarChangeEvent event = new BossBarChangeEvent(this.connection, pkg); - if (this.connection.fireEvent(event)) { - return; - } - } - - public void handle(PacketSetPassenger pkg) { - // ToDo - } - - public void handle(PacketSetCooldown pkg) { - } - - public void handle(PacketCraftRecipeResponse pkg) { - } - - public void handle(PacketUnlockRecipes pkg) { - } - - public void handle(PacketSelectAdvancementTab pkg) { - } - - public void handle(PacketAdvancements pkg) { - } - - public void handle(PacketNBTQueryResponse pkg) { - } - - public void handle(PacketFacePlayer pkg) { - } - - public void handle(PacketTags pkg) { - // ToDo - } - - public void handle(PacketDeclareRecipes pkg) { - this.connection.getRecipes().registerCustomRecipes(pkg.getRecipes()); - } - - public void handle(PacketStopSound pkg) { - } - - public void handle(PacketUpdateLight pkg) { - } - - public void handle(PacketUpdateViewPosition pkg) { - } - - public void handle(PacketUpdateViewDistance pkg) { - } - - public void handle(PacketOpenHorseWindow pkg) { - } - - public void handle(PacketTradeList pkg) { - } - - public void handle(PacketOpenBook pkg) { - } - - public void handle(PacketAcknowledgePlayerDigging pkg) { - } - - public void handle(PacketLoginPluginRequest pkg) { - this.connection.fireEvent(new LoginPluginMessageRequestEvent(this.connection, pkg)); - } - - public void handle(PacketEntitySoundEffect pkg) { - } - - public void handle(PacketSetCompression pkg) { - } - - public void handle(PacketEntityInitialisation pkg) { - } - - public void handle(PacketVehicleMovement pkg) { - } - - public void handle(PacketDeclareCommands pkg) { - this.connection.setCommandRootNode(pkg.getRootNode()); - // ToDo: Remove these dummy commands - String[] commands = { - "msg Bixilon TestReason 2Paramter 3 4 asd asd", - "msg @a[name=Bixilon, level=23, gamemode=!survival] trest asd 12312 sad123123213", - "help", - "team list", - "tasdasda", - "msg @a[ name = \"Bixilon\" ] asd", - "msg @a[ name = Bixilon ] asd asdsadasd", - "msg @a[ name = Bixilon ,team= ] asd asdsadasd", - "msg @a[ name = Bixilon , team =!] asd asdsadasd", - "give Bixilon minecraft:acacia_boat", - "give Bixilon minecraft:acacia_boat{asd:12}", - }; - for (String command : commands) { - try { - pkg.getRootNode().isSyntaxCorrect(this.connection, command); - Log.game("Command \"%s\" is valid", command); - } catch (CommandParseException e) { - Log.game("Command \"%s\" is invalid, %s: %s", command, e.getClass().getSimpleName(), e.getErrorMessage()); - e.printStackTrace(); - } - } - } -}