From 7bfc95e0bb8115c3dc893cdb44a4ff9ceb8272ec Mon Sep 17 00:00:00 2001 From: MrMasrozYTLIVE <61359286+MrMasrozYTLIVE@users.noreply.github.com> Date: Mon, 6 May 2024 20:12:05 +0300 Subject: [PATCH] Did some minor changes. Added ChatColor class. Made PacketMapChunk way faster by pregenerating example chunk instead of generating it on each 'writeData()' call. I'll most likely will do some more changes soon? Or i'll forget about it for 5 months again eh. --- src/MinecraftServer.ts | 2 +- src/Player.ts | 2 +- src/packet/impl/login/PacketLogin.ts | 10 +++++-- src/packet/impl/login/PacketServerList.ts | 3 +- src/packet/impl/world/PacketMapChunk.ts | 34 ++++++++++++----------- src/utils/ChatColor.ts | 18 ++++++++++++ src/utils/PlayerManager.ts | 3 +- 7 files changed, 49 insertions(+), 23 deletions(-) create mode 100644 src/utils/ChatColor.ts diff --git a/src/MinecraftServer.ts b/src/MinecraftServer.ts index 88669ed..834f817 100644 --- a/src/MinecraftServer.ts +++ b/src/MinecraftServer.ts @@ -2,7 +2,6 @@ import { PacketManager } from "./utils/PacketManager"; import {PlayerManager} from "./utils/PlayerManager"; import {Server} from "node:net"; // TODO: Replace with https://bun.sh/docs/api/tcp import {PacketDisconnectKick} from "./packet/impl/player/PacketDisconnectKick"; -import {Player} from "./Player"; export class MinecraftServer { public server: Server = new Server(); @@ -10,6 +9,7 @@ export class MinecraftServer { public static PlayerManagers = new Map(); // EntityMap = new Map(); + public static MAX_PLAYERS = 20; public async start() { this.server.listen(25565, async () => { diff --git a/src/Player.ts b/src/Player.ts index c45ed2d..97ea264 100644 --- a/src/Player.ts +++ b/src/Player.ts @@ -12,7 +12,7 @@ export class Player extends Entity { public xPosition: number = 0; public prevXPosition: number = this.xPosition; - public yPosition: number = 100; + public yPosition: number = 140; public prevYPosition: number = this.yPosition; public zPosition: number = 0; public prevZPosition: number = this.zPosition; diff --git a/src/packet/impl/login/PacketLogin.ts b/src/packet/impl/login/PacketLogin.ts index 6459006..179bed1 100644 --- a/src/packet/impl/login/PacketLogin.ts +++ b/src/packet/impl/login/PacketLogin.ts @@ -9,6 +9,8 @@ import {PacketPreChunk} from "../world/PacketPreChunk"; import {PacketMapChunk} from "../world/PacketMapChunk"; import {PacketPosition} from "../player/PacketPosition"; import {PacketPositionLook} from "../player/PacketPositionLook"; +import {MinecraftServer} from "../../../MinecraftServer"; +import {ChatColor} from "../../../utils/ChatColor"; export class PacketLogin extends Packet { constructor() { @@ -19,15 +21,17 @@ export class PacketLogin extends Packet { readData(reader: IReader, player: Player) { const protocol = reader.readInt(); - if(protocol > 14) player.playerManager.kickPlayer(`Server is outdated!`); - else if (protocol < 14) player.playerManager.kickPlayer(`Client is outdated!`); + if(protocol > 14) return player.playerManager.kickPlayer(`Server is outdated!`); + else if (protocol < 14) return player.playerManager.kickPlayer(`Client is outdated!`); + + if(MinecraftServer.PlayerManagers.size > MinecraftServer.MAX_PLAYERS) return player.playerManager.kickPlayer(`Server is full!`); const username = reader.readString16(); const seed = reader.readLong(); const dimension = reader.readByte(); player.playerManager.sendPacket(this); player.playerManager.sendPacket(new PacketPositionLook()); - PlayerManager.sendPacketToAll(new PacketChat(`§e<${username}> has joined the game.`)); + PlayerManager.sendPacketToAll(new PacketChat(`${ChatColor.YELLOW}<${username}> has joined the game.`)); player.playerManager.sendPacket(new PacketPreChunk()); player.playerManager.sendPacket(new PacketMapChunk()); diff --git a/src/packet/impl/login/PacketServerList.ts b/src/packet/impl/login/PacketServerList.ts index 342806d..f7d5e6a 100644 --- a/src/packet/impl/login/PacketServerList.ts +++ b/src/packet/impl/login/PacketServerList.ts @@ -3,6 +3,7 @@ import {PacketEnum} from "../../../utils/PacketEnum"; import {createWriter, Endian, IReader} from "bufferstuff"; import {Player} from "../../../Player"; import {PlayerManager} from "../../../utils/PlayerManager"; +import {MinecraftServer} from "../../../MinecraftServer"; export class PacketServerList extends Packet { constructor() { @@ -12,7 +13,7 @@ export class PacketServerList extends Packet { } readData(reader: IReader, player: Player) { - player.playerManager.kickPlayer(`Beta 1.7.3 Server§0§0`); + player.playerManager.kickPlayer(`Beta 1.7.3 Server§${MinecraftServer.PlayerManagers.size}§${MinecraftServer.MAX_PLAYERS}`); } writeData() { diff --git a/src/packet/impl/world/PacketMapChunk.ts b/src/packet/impl/world/PacketMapChunk.ts index 2d2fcd7..d50ac7b 100644 --- a/src/packet/impl/world/PacketMapChunk.ts +++ b/src/packet/impl/world/PacketMapChunk.ts @@ -6,30 +6,32 @@ import {deflate} from "node:zlib"; import * as zlib from "zlib"; export class PacketMapChunk extends Packet { + public world: Buffer; + constructor() { super({ packetID: PacketEnum.MapChunk }) + + const chunk = createWriter(Endian.BE); + + for(let x = 0; x < 256; x++) { + for(let i = 0; i < 90; i++) { + chunk.writeByte(1); + } + + for(let i = 0; i < 38; i++) { + chunk.writeByte(0); + } + } + + this.world = zlib.deflateSync(chunk.toBuffer()); } readData(reader: IReader, player: Player) { } writeData() { - const world = createWriter(Endian.BE); - - for(let x = 0; x < 256; x++) { - for(let i = 0; i < 10; i++) { - world.writeByte(1); - } - - for(let i = 0; i < 118; i++) { - world.writeByte(0); - } - } - - const buf = zlib.deflateSync(world.toBuffer()); - return createWriter(Endian.BE).writeUByte(this.options.packetID) .writeInt(0) .writeShort(0) @@ -37,8 +39,8 @@ export class PacketMapChunk extends Packet { .writeByte(15) .writeByte(127) .writeByte(15) - .writeInt(buf.length) - .writeBuffer(buf) + .writeInt(this.world.length) + .writeBuffer(this.world) .toBuffer(); } } \ No newline at end of file diff --git a/src/utils/ChatColor.ts b/src/utils/ChatColor.ts new file mode 100644 index 0000000..b46cf7e --- /dev/null +++ b/src/utils/ChatColor.ts @@ -0,0 +1,18 @@ +export class ChatColor { + public static DARK_RED: string = "§4"; + public static RED: string = "§c"; + public static GOLD: string = "§6"; + public static YELLOW: string = "§e"; + public static DARK_GREEN: string = "§2"; + public static GREEN: string = "§a"; + public static AQUA: string = "§b"; + public static DARK_AQUA: string = "§3"; + public static DARK_BLUE: string = "§1"; + public static BLUE: string = "§9"; + public static LIGHT_PURPLE: string = "§d"; + public static DARK_PURPLE: string = "§5"; + public static WHITE: string = "§f"; + public static GRAY: string = "§7"; + public static DARK_GRAY: string = "§8"; + public static BLACK: string = "§0"; +} \ No newline at end of file diff --git a/src/utils/PlayerManager.ts b/src/utils/PlayerManager.ts index 0e78730..b8a391e 100644 --- a/src/utils/PlayerManager.ts +++ b/src/utils/PlayerManager.ts @@ -8,6 +8,7 @@ import {PacketManager} from "./PacketManager"; import {MinecraftServer} from "../MinecraftServer"; import {PacketEnum} from "./PacketEnum"; import {PacketHandshake} from "../packet/impl/login/PacketHandshake"; +import {ChatColor} from "./ChatColor"; export class PlayerManager { public player: Player; @@ -71,7 +72,7 @@ export class PlayerManager { if(MinecraftServer.debug) console.log(`Player ${this.username} left. Deleting from the map!`); MinecraftServer.PlayerManagers.delete(this.username); - PlayerManager.sendPacketToAll(new PacketChat(`§e<${this.username}> left the game.`)); + PlayerManager.sendPacketToAll(new PacketChat(`${ChatColor.YELLOW}<${this.username}> left the game.`)); } public static getPlayer(username: String) {