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) {