diff --git a/src/Connection.ts b/src/Connection.ts index 7b439fe..70bbacc 100644 --- a/src/Connection.ts +++ b/src/Connection.ts @@ -51,7 +51,7 @@ class Connection { /** @internal */ public incomingPacketFragment(data: number) { if (this.currentPacketFragment.push(data)) { - const p = this.currentPacketFragment.getTypedClient(); + const p = this.currentPacketFragment.getTypedClient(this); if (p) { p.execute(this, this.server); this.server.emit("packet", p, this); diff --git a/src/Packet.ts b/src/Packet.ts index d09fc0d..8d8f730 100644 --- a/src/Packet.ts +++ b/src/Packet.ts @@ -2,6 +2,7 @@ import ParsedPacket from "./ParsedPacket.js"; import {TypedClientPacket, TypedClientPacketStatic} from "./types/TypedPacket"; import HandshakePacket from "./packet/client/HandshakePacket.js"; import LoginPacket from "./packet/client/LoginPacket.js"; +import Connection from "./Connection"; export default class Packet { readonly #data: number[]; @@ -197,9 +198,9 @@ export default class Packet { /** * Get typed client packet */ - public getTypedClient(): TypedClientPacket | null { + public getTypedClient(conn: Connection): TypedClientPacket | null { for (const type of Packet.clientTypes) { - const p = type.isThisPacket(this.parse()); + const p = type.isThisPacket(this.parse(), conn); if (p !== null) return p; } return null; diff --git a/src/packet/client/HandshakePacket.ts b/src/packet/client/HandshakePacket.ts index 2dbaf3a..aaf16c9 100644 --- a/src/packet/client/HandshakePacket.ts +++ b/src/packet/client/HandshakePacket.ts @@ -31,9 +31,10 @@ export default class HandshakePacket { public static readonly id = 0x00; - public static isThisPacket(data: ParsedPacket): TypedClientPacket | null { - const p = new this(data); + public static isThisPacket(data: ParsedPacket, conn: Connection): TypedClientPacket | null { + if (conn.state !== Connection.State.NONE) return null; try { + const p = new this(data); return (p.packet.id === this.id && p.data.nextState === 2) ? p : null; } catch { diff --git a/src/packet/client/LoginPacket.ts b/src/packet/client/LoginPacket.ts index e644f86..d8163a8 100644 --- a/src/packet/client/LoginPacket.ts +++ b/src/packet/client/LoginPacket.ts @@ -30,9 +30,10 @@ export default class LoginPacket { public static readonly id = 0x00; - public static isThisPacket(data: ParsedPacket): TypedClientPacket | null { - const p = new this(data); + public static isThisPacket(data: ParsedPacket, conn: Connection): TypedClientPacket | null { + if (conn.state !== Connection.State.LOGIN) return null; try { + const p = new this(data); return (p.packet.id === this.id && p.data.username !== null && p.data.username.match(/^[.*]?[A-Za-z0-9_]{3,16}$/) !== null) ? p : null; } catch { diff --git a/src/types/TypedPacket.ts b/src/types/TypedPacket.ts index 23ab06e..d7f9d3b 100644 --- a/src/types/TypedPacket.ts +++ b/src/types/TypedPacket.ts @@ -13,5 +13,5 @@ export interface TypedClientPacketStatic { readonly id: number; - isThisPacket(data: ParsedPacket): TypedClientPacket | null; + isThisPacket(data: ParsedPacket, conn: Connection): TypedClientPacket | null; }