diff --git a/Account/accountSocket.ts b/Account/accountSocket.ts
index 403ecbe..4e6eb4c 100644
--- a/Account/accountSocket.ts
+++ b/Account/accountSocket.ts
@@ -1,21 +1,24 @@
-import { game } from "../game";
+import { loginResponse } from "../Classes/loginResponse";
+import { playerData } from "../Classes/playerData";
import { userData } from "../Classes/userData";
import { users } from "./users";
+import { players } from "../Player/players";
export function registerAccountCallbacks(socket){
- function emitLogin(result : userData, registered:boolean = false){
- if(result != null){
- socket.emit("account/login", JSON.stringify(userData.makeSafe(result, socket.id)));
- socket.user = result
+ function emitLogin(user : userData, player:playerData, registered:boolean = false){
+ if(user != null){
+ socket.emit("account/login", JSON.stringify(new loginResponse(true, user, player)));
+ socket.user = user
+ socket.player = player
if(registered){
- console.log(`User ${(result as userData).login} registerd and logged in`);
+ console.log(`User ${(user as userData).login} registerd and logged in`);
}
else{
- console.log(`User ${(result as userData).login} logged in`);
+ console.log(`User ${(user as userData).login} logged in`);
}
}
else{
- socket.emit("account/login", "");
+ socket.emit("account/login", JSON.stringify(new loginResponse(false, null, null)));
console.log("Login Failed");
}
}
@@ -24,17 +27,27 @@ export function registerAccountCallbacks(socket){
let buff = Buffer.from(data, 'base64');
let json : userData = JSON.parse(buff.toString('utf-8'));
if (!json.login || !json.password) return
- let result = users.createUser(json.login, json.password);
- emitLogin(result, true);
+ let result = users.createUser(json.login, json.password);
+ let player = null
+ if(result != null){
+ player = players.createPlayer(result.id)
+ }
+
+ emitLogin(result, player);
});
socket.on('account/login', (data) => {
let buff = Buffer.from(data, 'base64');
let json : userData = JSON.parse(buff.toString('utf-8'));
if (!json.login || !json.password) return
- let result = users.readUser(json.login, json.password);
- emitLogin(result);
+ let result = users.readUser(json.login, json.password);
+ let player = null
+ if(result != null){
+ player = players.readPlayer(result.id)
+ }
+
+ emitLogin(result, player);
});
}
\ No newline at end of file
diff --git a/Account/users.ts b/Account/users.ts
index c14e373..07772ac 100644
--- a/Account/users.ts
+++ b/Account/users.ts
@@ -45,20 +45,13 @@ export class users{
}
static loadUsers(){
- let maxItemId = 0;
+ fs.mkdirSync(`Database/Users/`, { recursive: true })
fs.readdir(`Database/Users/`, (err, files) => {
files.forEach(file => {
fs.readFile(`Database/Users/${file}`, (err, data) => {
if (err) throw err;
- let user = JSON.parse(data);
+ let user : userData = JSON.parse(data);
game.accountsDB.push(user);
- if(user.playerData != null){
- user.playerData.inventory.items.forEach(i=>{
- if(i.id > maxItemId){
- game.itemCount = maxItemId = i.id
- }
- })
- }
console.log(`Loaded ${user.login}`);
});
});
diff --git a/Classes/lobbyState.ts b/Classes/lobbyState.ts
index d39a0b9..b06824f 100644
--- a/Classes/lobbyState.ts
+++ b/Classes/lobbyState.ts
@@ -1,17 +1,49 @@
import { physicsObject } from "../Classes/physicsObject";
import { playerData } from "../Classes/playerData";
+import { userData } from "./userData";
export class lobbyState{
- hostSocket : string
+ hostId : number
+ users : userData[] = [];
players : playerData[] = [];
objects : physicsObject[] = [];
copyLight(){
let lobby = Object.assign({}, this);
lobby.players = []
+ lobby.users = []
for (let i = 0; i < this.players.length; i++) {
lobby.players.push(playerData.copyLight(this.players[i]));
}
return lobby
}
+
+ addUser(userData, playerData){
+ let uIdx = this.users.findIndex(u=>u.id == userData.id)
+ let pIdx = this.players.findIndex(u=>u.id == playerData.id)
+ if(uIdx != -1 || pIdx != -1){
+ console.log("User " + userData.login + " is already in the game!")
+ return false;
+ }
+
+ this.users.push(userData)
+ this.players.push(playerData)
+ return true
+ }
+
+ removeUser(id){
+ let idx = this.users.findIndex(u=>u.id == id)
+ if(idx != -1){
+ this.users.splice(idx, 1)
+ }
+
+ idx = this.players.findIndex(u=>u.id == id)
+ if(idx != -1){
+ this.players.splice(idx, 1)
+ }
+ }
+
+ findPlayer(id: number){
+ return this.players.find(p=>p.id == id)
+ }
}
\ No newline at end of file
diff --git a/Classes/loginResponse.ts b/Classes/loginResponse.ts
new file mode 100644
index 0000000..fd9c1d0
--- /dev/null
+++ b/Classes/loginResponse.ts
@@ -0,0 +1,16 @@
+import { playerData } from "./playerData"
+import { userData } from "./userData"
+
+export class loginResponse{
+ result : boolean
+ userData : userData
+ playerData : playerData
+
+ constructor(result : boolean, user : userData, player : playerData){
+ this.result = result;
+ if(result){
+ this.userData = userData.makeSafe(user);
+ this.playerData = player;
+ }
+ }
+}
\ No newline at end of file
diff --git a/Classes/playerData.ts b/Classes/playerData.ts
index 19f9b19..fda06a2 100644
--- a/Classes/playerData.ts
+++ b/Classes/playerData.ts
@@ -2,17 +2,15 @@ import { physicsObject } from "./physicsObject";
import { playerInventory } from "./playerInventory";
export class playerData{
- socketId : string
- userName : string
+ id : number
characterId : number
inventory : playerInventory = new playerInventory()
rigidbody : physicsObject = new physicsObject()
static copyLight(data : playerData){
- let player : any = Object.assign({}, data);
- delete player.userName
- delete player.characterId
- delete player.inventory
+ let player : any = {}
+ player.id = data.id
+ player.rigidbody = data.rigidbody
return player
}
}
\ No newline at end of file
diff --git a/Classes/userData.ts b/Classes/userData.ts
index 235a224..5154a18 100644
--- a/Classes/userData.ts
+++ b/Classes/userData.ts
@@ -6,7 +6,6 @@ export class userData{
checksum: number;
login: string;
password: string;
- playerData: playerData = null
constructor(id:number, login:string, password:string){
this.id = id;
@@ -15,9 +14,8 @@ export class userData{
this.checksum = 0;
}
- static makeSafe(user : userData, socketId : string){
+ static makeSafe(user : userData){
let safeUser : any = Object.assign({}, user);
- safeUser.socketId = socketId
delete safeUser.password
delete safeUser.checksum
return safeUser
diff --git a/Items/itemSocket.ts b/Items/itemSocket.ts
index a90dff9..51b1c44 100644
--- a/Items/itemSocket.ts
+++ b/Items/itemSocket.ts
@@ -14,19 +14,16 @@ export function registerItemCallbacks(socket){
let buff = Buffer.from(data, 'base64');
let data1 : itemData = JSON.parse(buff.toString('utf-8'));
- let player : playerData = socket.user.playerData
+ let player : playerData = socket.player
if(player != null){
let message = socket.user.login + " picked up "
- if(data1.rarity >= 90){
- console.log("epic")
+ if(data1.rarity >= 95){
message += "" + data1.name + " (epic)"
}
- else if(data1.rarity >= 60){
- console.log("rare")
+ else if(data1.rarity >= 75){
message += "" + data1.name + " (rare)"
}
- else if(data1.rarity >= 40){
- console.log("uncommon")
+ else if(data1.rarity >= 60){
message += "" + data1.name + " (uncommon)"
}
else
diff --git a/Lobby/lobbySocket.ts b/Lobby/lobbySocket.ts
index 3152945..a2c7678 100644
--- a/Lobby/lobbySocket.ts
+++ b/Lobby/lobbySocket.ts
@@ -1,7 +1,6 @@
import { lobbyMessage } from "../Classes/lobbyMessage";
import { playerData } from "../Classes/playerData"
import { playerInventory } from "../Classes/playerInventory";
-import { userData } from "../Classes/userData";
import { game } from "../game";
export function registerLobbyCallbacks(socket){
@@ -11,16 +10,10 @@ export function registerLobbyCallbacks(socket){
let buff = Buffer.from(data, 'base64');
let data1 : playerData = JSON.parse(buff.toString('utf-8'));
- let pd = new playerData()
- pd.socketId = socket.id
- pd.userName = socket.user.login
- pd.characterId = data1.characterId;
- pd.inventory = data1.inventory;
- socket.user.playerData = pd
-
- game.lobbyState.players.push(socket.user.playerData)
+ socket.player.characterId = data1.characterId
+ game.lobbyState.addUser(socket.user, socket.player)
game.socketIO.emit("lobby/playerJoin", JSON.stringify(game.lobbyState))
- socket.emit('lobby/messages', JSON.stringify(game.messages))
+ game.addMessage(new lobbyMessage(socket.user.login + " joined"))
});
socket.on('lobby/playerUpdate', (data) => {
@@ -28,14 +21,13 @@ export function registerLobbyCallbacks(socket){
let buff = Buffer.from(data, 'base64');
let data1 : playerData = JSON.parse(buff.toString('utf-8'));
- data1.socketId = socket.id
- let idx = game.lobbyState.players.findIndex((pl) => pl.socketId == socket.id)
- if(idx == -1){
+ let player = game.lobbyState.findPlayer(socket.user.id)
+ if(player == null){
console.log("Error! Player not spawned!")
}
else{
- game.lobbyState.players[idx].rigidbody = data1.rigidbody
+ player.rigidbody = data1.rigidbody
}
});
@@ -54,10 +46,11 @@ export function registerLobbyCallbacks(socket){
let buff = Buffer.from(data, 'base64');
let data1 : playerData = JSON.parse(buff.toString('utf-8'));
- socket.user.playerData.inventory = data1.inventory
- playerInventory.validate(socket.user.playerData.inventory)
+ let player = game.lobbyState.findPlayer(socket.user.id)
+ player.inventory = data1.inventory
+ playerInventory.validate(player.inventory)
- game.socketIO.emit("lobby/loadoutChanged", JSON.stringify(socket.user.playerData))
+ game.socketIO.emit("lobby/loadoutChanged", JSON.stringify(player))
});
socket.on('lobby/message', (data) => {
diff --git a/Player/players.ts b/Player/players.ts
new file mode 100644
index 0000000..ce91fdd
--- /dev/null
+++ b/Player/players.ts
@@ -0,0 +1,49 @@
+import { game } from "../game";
+import { userData } from "../Classes/userData";
+import { playerData } from "../Classes/playerData";
+const fs = require('fs');
+
+export class players{
+ static createPlayer(id){
+ if (players.readPlayer(id) != null){
+ console.log(`Player ${id} alread exists`);
+ return null;
+ }
+
+ var player = new playerData();
+ player.id = id
+ game.playersDB.push(player);
+ return player;
+ }
+
+ static readPlayer(id : number){
+ let player = game.playersDB.find(u=>u.id == id);
+ return player;
+ }
+
+ static savePlayers(){
+ game.playersDB.forEach(player => {
+ let data = JSON.stringify(player, null, 2);
+ fs.writeFileSync(`Database/Players/${player.id}.json`, data);
+ });
+ }
+
+ static loadPlayers(){
+ fs.mkdirSync(`Database/Players/`, { recursive: true })
+ fs.readdir(`Database/Players/`, (err, files) => {
+ files.forEach(file => {
+ fs.readFile(`Database/Players/${file}`, (err, data) => {
+ if (err) throw err;
+ let player : playerData = JSON.parse(data);
+ game.playersDB.push(player);
+ player.inventory.items.forEach(i=>{
+ if(i.id > game.itemCount){
+ game.itemCount = i.id
+ }
+ })
+ console.log(`Loaded pl ${player.id}`);
+ });
+ });
+ });
+ }
+}
\ No newline at end of file
diff --git a/game.ts b/game.ts
index e8ebe55..a9a920e 100644
--- a/game.ts
+++ b/game.ts
@@ -1,6 +1,7 @@
import { userData } from "./Classes/userData";
import { lobbyMessage } from "./Classes/lobbyMessage";
import { lobbyState } from "./Classes/lobbyState";
+import { playerData } from "./Classes/playerData";
const fs = require('fs');
export class game{
@@ -8,6 +9,7 @@ export class game{
static itemCount : number = 0
static accountsDB : userData[] = []
+ static playersDB : playerData[] = []
/** Key: socket ID*/
static lobbyState : lobbyState = new lobbyState()
diff --git a/index.ts b/index.ts
index 0d454d1..b7c1499 100644
--- a/index.ts
+++ b/index.ts
@@ -4,6 +4,7 @@ import { registerLobbyCallbacks } from "./Lobby/lobbySocket";
import { playerData } from "./Classes/playerData";
import { game } from "./game";
import { registerItemCallbacks } from "./Items/itemSocket";
+import { players } from "./Player/players";
const express = require("express");
const app = express();
@@ -22,6 +23,7 @@ const io = require("socket.io")(server, {
});
users.loadUsers();
+players.loadPlayers();
io.on('connection', (socket) => {
console.log("Got connection!");
@@ -36,10 +38,7 @@ io.on('connection', (socket) => {
socket.on("disconnect", () => {
socket.disconnect()
if(socket.hasOwnProperty("user")){
- let idx = game.lobbyState.players.findIndex((pl) => pl.socketId == socket.id)
- if(idx != -1){
- game.lobbyState.players.splice(idx, 1)
- }
+ game.lobbyState.removeUser(socket.user.id)
delete socket.user
}
console.log(socket.id + " disconnected");
@@ -54,13 +53,13 @@ io.on('connection', (socket) => {
setInterval(() => {
let userCount = game.lobbyState.players.length
if(userCount > 0){
- game.lobbyState.hostSocket = game.lobbyState.players[0].socketId
+ game.lobbyState.hostId = game.lobbyState.users[0].id
io.emit('lobby', JSON.stringify(game.lobbyState.copyLight()))
}
}, 1000/30)
setInterval(() => {
- console.log("Connected losers: " + game.lobbyState.players.length);
+ console.log("Players: " + game.lobbyState.players.length + ", users: " + game.lobbyState.users.length);
}, 60 * 1000)
process.on('SIGINT', function () {
@@ -69,5 +68,6 @@ process.on('SIGINT', function () {
});
process.on('exit', function () {
users.saveUsers();
+ players.savePlayers();
console.log("exitted");
});
\ No newline at end of file