KF-MMO-Server/index.ts

105 lines
3.3 KiB
TypeScript

import './socketExtended.js';
import 'reflect-metadata';
import express from 'express';
import { createServer } from 'http';
import { Server as SocketIOServer } from 'socket.io';
import { game } from "./game.js";
import { characters } from "./Characters/characters.js";
import { registerItemCallbacks } from "./Items/itemSocket.js";
import { registerLobbyCallbacks } from "./Lobby/lobbySocket.js";
import { registerAccountCallbacks } from "./Account/accountSocket.js";
import { registerLevelCallbacks } from "./Level/levelSocket.js";
import { registerQuestCallbacks } from "./Quest/questSocket.js";
import { DatabaseController } from './Database/dbcontroller.js';
import { SocketExtended } from './socketExtended.js';
import { Endpoints } from './endpoints.js';
const app = express();
const port = 3000;
const server = createServer(app);
export const db = await DatabaseController.create('./Database/mydb.sqlite3');
server.listen(port, () => {
console.log(`Server listening at port ${port}`);
});
const io = game.socketIO = new SocketIOServer(server, {
path: "/webmmo/",
cors: {
origin: '\*',
methods: ["GET", "POST"]
}
});
io.on('connection', (socket : SocketExtended) => {
console.log("Got connection!");
socket.emit("connectSuccess", "");
registerAccountCallbacks(socket);
registerLobbyCallbacks(socket);
registerItemCallbacks(socket);
registerLevelCallbacks(socket);
registerQuestCallbacks(socket);
socket.io = io;
socket.on("disconnect", () => {
socket.disconnect()
if(socket.character != null){
characters.savePlayer(db, socket.character)
}
game.lobbyState.removeUser(socket)
console.log(socket.id + " disconnected");
});
// socket.on('error',function(er){
// console.log(er);
// });
});
//Send player updates to everyone
setInterval(async () => {
let userCount = game.lobbyState.activeUsers.length
if(userCount > 0){
game.lobbyState.rooms.forEach(room=>{
let roomData = room.copyUpdate()
io.in(room.id).emit(Endpoints.LevelUpdate, JSON.stringify(roomData))
})
game.lobbyState.activeUsers.forEach(u=>{
u.character.resetDamageInfo()
})
}
}, 1000/30)
setInterval(() => {
let lobbyState = game.lobbyState
console.clear()
console.log("Players:")
for(let i = 0; i < lobbyState.activeUsers.length; i++){
console.log(lobbyState.activeUsers[i].user.login + " " + lobbyState.activeUsers[i].character.room)
}
console.log("Rooms:")
for(let i = 0; i < lobbyState.rooms.length; i++){
console.log(lobbyState.rooms[i].id + " " + lobbyState.rooms[i].hostId)
lobbyState.rooms[i].objects.forEach(object => {
console.log("\t" + object.id + ": " + JSON.stringify(object.rigidbody))
});
}
console.log("Dungeon:")
for(let i = 0; i < lobbyState.dungeons.length; i++){
console.log(lobbyState.dungeons[i].entranceId + " " + lobbyState.dungeons[i].playerCount)
}
}, 5000)
process.on('uncaughtException', function (err) {
console.log('Caught exception: ', err);
});
process.on('SIGINT', function () {
console.log('Ctrl-C...');
process.exit(2);
});
process.on('exit', function () {
console.log("exitted");
});