Skip to content

Commit d18f064

Browse files
committedJan 21, 2025
fix gameservers create, output
1 parent c4b8b0f commit d18f064

16 files changed

+154
-49
lines changed
 

‎Database/index.js

+54-5
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
const MongoClient = require("mongodb").MongoClient;
2-
const mongoClient = new MongoClient("mongodb://127.0.0.1:27017/");
2+
const config = require('../config');
3+
const mongoClient = new MongoClient(`mongodb://${config.database.host}/`);
34

45
class Database {
56
constructor() {
@@ -10,16 +11,16 @@ class Database {
1011
try {
1112
await mongoClient.connect();
1213

13-
this._db = mongoClient.db("l2db");
14+
this._db = mongoClient.db(config.database.dbname);
1415

1516
callback();
1617
} catch {
1718
throw new Error("database connected: failed");
1819
}
1920
}
2021

21-
async getAccountByLogin(login) {
22-
const user = await this._db.collection('accounts').findOne({ login });
22+
async getUserByLogin(login) {
23+
const user = await this._db.collection('users').findOne({ login });
2324

2425
if (user) {
2526
return user;
@@ -36,7 +37,7 @@ class Database {
3637
return await this._db.collection('characters').find({ login }).toArray();
3738
}
3839

39-
async checkNameExist(name) {
40+
async checkCharacterNameExists(name) {
4041
const character = await this._db.collection('characters').findOne({ name });
4142

4243
if (character) {
@@ -81,6 +82,54 @@ class Database {
8182
async deleteCharacterByObjectId(objectId) {
8283
await this._db.collection('characters').deleteOne({ objectId });
8384
}
85+
86+
async addGameServer(params) {
87+
await this._db.collection('gameservers').insertOne({
88+
id: params.id,
89+
host: params.host,
90+
port: params.port,
91+
ageLimit: params.ageLimit,
92+
isPvP: params.isPvP,
93+
maxPlayers: params.maxPlayers,
94+
status: params.status,
95+
type: params.type
96+
});
97+
}
98+
99+
async getGameServers() {
100+
return await this._db.collection('gameservers').find().toArray();
101+
}
102+
103+
async getGameServerById(id) {
104+
const gameserver = await this._db.collection('gameservers').findOne({ id });
105+
106+
if (gameserver) {
107+
return gameserver;
108+
} else {
109+
return null;
110+
}
111+
}
112+
113+
async checkGameServerExistsById(id) {
114+
const gameserver = await this._db.collection('gameservers').findOne({ id });
115+
116+
if (gameserver) {
117+
return true;
118+
} else {
119+
return false;
120+
}
121+
}
122+
123+
async updateGameServerById(id, field, value) {
124+
await this._db.collection('gameservers').updateOne(
125+
{ id },
126+
{
127+
$set: {
128+
[field]: value
129+
}
130+
}
131+
);
132+
}
84133
}
85134

86135
module.exports = new Database();

‎GameServer/ClientPackets/CharacterCreate.js

+2-2
Original file line numberDiff line numberDiff line change
@@ -85,9 +85,9 @@ class CharacterCreate {
8585
return;
8686
}
8787

88-
const isUsedName = await database.checkNameExist(this.name);
88+
const isUsedCharacterName = await database.checkCharacterNameExists(this.name);
8989

90-
if (isUsedName) {
90+
if (isUsedCharacterName) {
9191
this._client.sendPacket(new serverPackets.CharacterCreateFail(serverPackets.CharacterCreateFail.reason.REASON_NAME_ALREADY_EXISTS))
9292

9393
return;

‎GameServer/Server.js

+6-7
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,5 @@
11
const net = require('net');
22
const Client = require('./Client');
3-
const config = require('./../config');
43
const Player = require('./Models/Player');
54
const players = require('./Models/Players');
65

@@ -9,18 +8,18 @@ class Server {
98
this._server = null;
109
}
1110

12-
start(callback) {
11+
start(host, port, callback) {
1312
this._server = net.createServer(this._handler.bind(this));
1413

15-
this._server.on('listening', this._onListening.bind(this, callback));
14+
this._server.on('listening', this._onListening.bind(this, host, port, callback));
1615
this._server.on('connection', this._onConnection);
17-
this._server.listen(config.gameserver.port, config.gameserver.host);
16+
this._server.listen(port, host);
1817
}
1918

20-
_onListening(callback) {
21-
console.log(`game server listening on ${config.gameserver.host}:${config.gameserver.port}`);
19+
_onListening(host, port, callback) {
20+
console.log(`game server listening on ${host}:${port}`);
2221

23-
callback()
22+
callback();
2423
}
2524

2625
_onConnection() {

‎LoginServer/ClientPackets/RequestAuthLogin.js

+2-2
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,7 @@ class RequestAuthLogin {
2222
}
2323

2424
async _init() {
25-
const user = await database.getAccountByLogin(this.login);
25+
const user = await database.getUserByLogin(this.login);
2626

2727
if (!user) {
2828
this._client.sendPacket(new serverPackets.LoginFail(serverPackets.LoginFail.reason.REASON_USER_OR_PASS_WRONG));
@@ -36,7 +36,7 @@ class RequestAuthLogin {
3636
return;
3737
}
3838

39-
this._client.sendPacket(new serverPackets.LoginOk([0x00000000, 0x00000000]))
39+
this._client.sendPacket(new serverPackets.LoginOk([0x00000000, 0x00000000])); // fix
4040
}
4141
}
4242

‎LoginServer/ClientPackets/RequestServerList.js

+6-3
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
const serverPackets = require('./../ServerPackets/serverPackets');
22
const ClientPacket = require("./ClientPacket");
3-
const config = require('./../../config');
3+
const database = require('./../../Database');
44

55
class RequestServerList {
66
constructor(packet, client) {
@@ -22,8 +22,11 @@ class RequestServerList {
2222
return sessionKey1;
2323
}
2424

25-
_init() {
26-
this._client.sendPacket(new serverPackets.ServerList(config.gameserver.host, config.gameserver.port));
25+
async _init() {
26+
const gameservers = await database.getGameServers();
27+
const playersOnline = 0; // fix
28+
29+
this._client.sendPacket(new serverPackets.ServerList(gameservers, playersOnline));
2730
}
2831
}
2932

‎LoginServer/ClientPackets/RequestServerLogin.js

+1-1
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,7 @@ class RequestServerLogin {
2727
}
2828

2929
_init() {
30-
this._client.sendPacket(new serverPackets.PlayOk([0x00000000, 0x00000000]));
30+
this._client.sendPacket(new serverPackets.PlayOk([0x00000000, 0x00000000])); // fix
3131
}
3232
}
3333

‎LoginServer/ServerPackets/InitLS.js

+3-2
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,13 @@
11
const ServerPacket = require('./ServerPacket.js');
2+
const config = require('../../config')
23

34
class InitLS {
45
constructor() {
5-
this._sessionID = 0x03ed779c;
6+
this._sessionID = 0x00000000;
67
this._packet = new ServerPacket(9);
78
this._packet.writeC(0x00)
89
.writeD(this._sessionID)
9-
.writeD(30810); // Protocol version
10+
.writeD(config.main.SERVER_PROTOCOL_VERSION);
1011
}
1112

1213
getBuffer() {

‎LoginServer/ServerPackets/LoginOk.js

+5-5
Original file line numberDiff line numberDiff line change
@@ -1,17 +1,17 @@
11
const ServerPacket = require('./ServerPacket.js');
22

33
class LoginOk {
4-
constructor(SessionKey1) {
4+
constructor(sessionKey1) {
55
this._packet = new ServerPacket(48);
66
this._packet.writeC(0x03)
7-
.writeD(SessionKey1[0])
8-
.writeD(SessionKey1[1])
7+
.writeD(sessionKey1[0])
8+
.writeD(sessionKey1[1])
99
.writeD(0x00)
1010
.writeD(0x00)
11-
.writeD(0x000003ea) // unknown
1211
.writeD(0x00)
1312
.writeD(0x00)
14-
.writeD(0x02);
13+
.writeD(0x00)
14+
.writeD(0x00);
1515
}
1616

1717
getBuffer() {

‎LoginServer/ServerPackets/PlayOk.js

+3-3
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,11 @@
11
const ServerPacket = require('./ServerPacket.js');
22

33
class PlayOk {
4-
constructor(SessionKey2) {
4+
constructor(sessionKey2) {
55
this._packet = new ServerPacket(12);
66
this._packet.writeC(0x07)
7-
.writeD(SessionKey2[0])
8-
.writeD(SessionKey2[1]);
7+
.writeD(sessionKey2[0])
8+
.writeD(sessionKey2[1]);
99
}
1010

1111
getBuffer() {

‎LoginServer/ServerPackets/ServerList.js

+23-18
Original file line numberDiff line numberDiff line change
@@ -1,24 +1,29 @@
1-
const ServerPacket = require('./ServerPacket.js');
1+
const ServerPacket = require('./ServerPacket.js');
22

33
class ServerList {
4-
constructor(host, port, maxPlayer = 100) {
5-
host = host.split(".");
6-
7-
this._packet = new ServerPacket(20);
4+
constructor(gameservers, playersOnline) {
5+
this._packet = new ServerPacket(1 + 3 + (gameservers.length * (16 + 4)));
86
this._packet.writeC(0x04)
9-
.writeC(1) // Number of servers
10-
.writeC(0) // Last server
11-
.writeC(1) // Server ID
12-
.writeC(host[0]) // Server IP
13-
.writeC(host[1]) // Server IP
14-
.writeC(host[2]) // Server IP
15-
.writeC(host[3]) // Server IP
16-
.writeD(port) // Server port
17-
.writeC(0) // Age limit
18-
.writeC(0) // PVP ? YES - 1, NO - 0
19-
.writeH(0) // Number of players online
20-
.writeH(maxPlayer) // Max player
21-
.writeC(1); // 1 = UP, 0 - DOWN
7+
.writeC(gameservers.length)
8+
.writeC(0x00); // Last server. 0 for normal sorting
9+
10+
for (let i = 0; i < gameservers.length; i++) {
11+
const server = gameservers[i];
12+
const octets = server.host.split(".");
13+
14+
this._packet.writeC(server.id)
15+
.writeC(Number(octets[0]))
16+
.writeC(Number(octets[1]))
17+
.writeC(Number(octets[2]))
18+
.writeC(Number(octets[3]))
19+
.writeD(server.port)
20+
.writeC(server.ageLimit)
21+
.writeC(server.isPvP ? 0x01 : 0x00)
22+
.writeH(playersOnline)
23+
.writeH(server.maxPlayers)
24+
.writeC(server.status)
25+
.writeD(server.type);
26+
}
2227
}
2328

2429
getBuffer() {

‎config/database.js

+4
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
module.exports = {
2+
host: "127.0.0.1:27017",
3+
dbname: "l2db",
4+
}

‎config/gameserver.js

+4
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,8 @@
11
module.exports = {
2+
id: 1,
23
host: "127.0.0.1",
34
port: 7777,
5+
ageLimit: 0,
6+
isPvP: false,
7+
maxPlayers: 100
48
}

‎config/index.js

+2
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,11 @@
11
const main = require('./main');
22
const loginserver = require('./loginserver');
33
const gameserver = require('./gameserver');
4+
const database = require('./database');
45

56
module.exports = {
67
main,
78
loginserver,
89
gameserver,
10+
database,
911
}

‎enums/serverStatus.js

+4
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
module.exports = {
2+
STATUS_DOWN: 0,
3+
STATUS_UP: 1
4+
}

‎enums/serverTypes.js

+3
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
module.exports = {
2+
SERVER_NORMAL: 1,
3+
}

‎gameserver.js

+32-1
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,9 @@
11
const Server = require('./GameServer/Server');
22
const database = require('./Database');
33
const npcs = require('./GameServer/Models/Npcs');
4+
const config = require('./config');
5+
const serverStatus = require('./enums/serverStatus');
6+
const serverTypes = require('./enums/serverTypes');
47
const server = new Server();
58

69
async function run() {
@@ -15,7 +18,7 @@ async function run() {
1518
}
1619

1720
try {
18-
server.start(() => {
21+
server.start(config.gameserver.host, config.gameserver.port, async () => {
1922
// console.log('\n');
2023
// console.log('########################################');
2124
// console.log('# lineage2js #');
@@ -25,11 +28,39 @@ async function run() {
2528
// console.log('########################################');
2629
// console.log('\n');
2730

31+
const isGameServerExists = await database.checkGameServerExistsById(config.gameserver.id);
32+
33+
if (!isGameServerExists) {
34+
database.addGameServer({
35+
id: config.gameserver.id,
36+
host: config.gameserver.host,
37+
port: config.gameserver.port,
38+
ageLimit: config.gameserver.ageLimit,
39+
isPvP: config.gameserver.isPvP,
40+
maxPlayers: config.gameserver.maxPlayers,
41+
status: serverStatus.STATUS_DOWN,
42+
type: serverTypes.SERVER_NORMAL
43+
});
44+
}
45+
46+
const gameserver = await database.getGameServerById(config.gameserver.id);
47+
48+
await database.updateGameServerById(gameserver.id, "status", serverStatus.STATUS_UP);
49+
2850
npcs.spawn();
2951
});
3052
} catch {
3153

3254
}
3355
}
3456

57+
process.stdin.resume();
58+
process.on('SIGINT', async () => {
59+
const gameserver = await database.getGameServerById(config.gameserver.id);
60+
61+
await database.updateGameServerById(gameserver.id, "status", serverStatus.STATUS_DOWN);
62+
63+
process.exit(0);
64+
});
65+
3566
run();

0 commit comments

Comments
 (0)
Please sign in to comment.