From 142ec1dd0544095928d7d0ec488928f96e6ed91e Mon Sep 17 00:00:00 2001 From: Katboi01 Date: Wed, 20 Sep 2023 20:17:18 +0200 Subject: [PATCH] enemy damage sync --- Classes/enemyDamageInfo.ts | 5 ++++ Classes/enemyData.ts | 9 +++++++ Classes/levelState.ts | 11 ++++++++ Classes/lobbyState.ts | 5 ++-- Classes/playerData.ts | 6 +++++ Level/levelSocket.ts | 28 +++++++++++++++++++++ Lobby/lobbySocket.ts | 21 ++++++++-------- game.ts | 2 +- index.ts | 51 +++++++++++++++++++++++++++++++++++--- 9 files changed, 121 insertions(+), 17 deletions(-) create mode 100644 Classes/enemyDamageInfo.ts create mode 100644 Classes/enemyData.ts create mode 100644 Classes/levelState.ts create mode 100644 Level/levelSocket.ts diff --git a/Classes/enemyDamageInfo.ts b/Classes/enemyDamageInfo.ts new file mode 100644 index 0000000..73360cf --- /dev/null +++ b/Classes/enemyDamageInfo.ts @@ -0,0 +1,5 @@ +export class enemyDamageInfo{ + sourceId : number + targetId : number + damage : number +} \ No newline at end of file diff --git a/Classes/enemyData.ts b/Classes/enemyData.ts new file mode 100644 index 0000000..1897469 --- /dev/null +++ b/Classes/enemyData.ts @@ -0,0 +1,9 @@ +import { Stat } from "./itemData" +import { physicsObject } from "./physicsObject" + +export class enemyData{ + id : number + templateId : number + rigidbody : physicsObject + stats : Stat[] = [] +} \ No newline at end of file diff --git a/Classes/levelState.ts b/Classes/levelState.ts new file mode 100644 index 0000000..85107a6 --- /dev/null +++ b/Classes/levelState.ts @@ -0,0 +1,11 @@ +import { enemyData } from "./enemyData"; +import { physicsObject } from "./physicsObject"; +import { playerData } from "./playerData"; +import { userData } from "./userData"; + +export class levelState{ + id : string + hostId : number = -1 + enemies : enemyData[] = []; + objects : physicsObject[] = []; +} \ No newline at end of file diff --git a/Classes/lobbyState.ts b/Classes/lobbyState.ts index d1ba91b..a077123 100644 --- a/Classes/lobbyState.ts +++ b/Classes/lobbyState.ts @@ -1,12 +1,12 @@ import { physicsObject } from "../Classes/physicsObject"; import { playerData } from "../Classes/playerData"; +import { levelState } from "./levelState"; import { userData } from "./userData"; export class lobbyState{ - hostId : number users : userData[] = []; players : playerData[] = []; - objects : physicsObject[] = []; + rooms : levelState[] = [] copyLight(){ let lobby = Object.assign({}, this); @@ -15,6 +15,7 @@ export class lobbyState{ for (let i = 0; i < this.players.length; i++) { lobby.players.push(this.players[i].copyLight()); } + lobby.rooms = this.rooms return lobby } diff --git a/Classes/playerData.ts b/Classes/playerData.ts index 2e1889b..7fbd007 100644 --- a/Classes/playerData.ts +++ b/Classes/playerData.ts @@ -1,17 +1,23 @@ +import { game } from "../game"; +import { enemyDamageInfo } from "./enemyDamageInfo"; import { physicsObject } from "./physicsObject"; import { playerInventory } from "./playerInventory"; export class playerData{ id : number level : number = 1 + room : string = "0_0" characterId : number inventory : playerInventory = new playerInventory() rigidbody : physicsObject = new physicsObject() + damageInfo : enemyDamageInfo[] = [] copyLight(){ let player : any = {} player.id = this.id + player.room = this.room player.rigidbody = this.rigidbody + player.damageInfo = this.damageInfo return player } diff --git a/Level/levelSocket.ts b/Level/levelSocket.ts new file mode 100644 index 0000000..7122c87 --- /dev/null +++ b/Level/levelSocket.ts @@ -0,0 +1,28 @@ +import { levelState } from "../Classes/levelState"; +import { game } from "../game"; + +export function registerLevelCallbacks(socket){ + socket.on('level/update', (data) => { + if(!socket.hasOwnProperty("user")) return; + + let buff = Buffer.from(data, 'base64'); + let rawJson = JSON.parse(buff.toString('utf-8')); + let data1 : levelState = rawJson; + + let room = game.lobbyState.rooms.find(l=>l.id == data1.id) + if (room == null){ + room = new levelState() + room.id = data1.id + game.lobbyState.rooms.push(room) + } + + let player = socket.player + player.room = rawJson.player.room + player.rigidbody = rawJson.player.rigidbody + //only in non-host player + //player.damageInfo = rawJson.player.damageInfo + + room.enemies = data1.enemies + room.objects = data1.objects + }); +} \ No newline at end of file diff --git a/Lobby/lobbySocket.ts b/Lobby/lobbySocket.ts index 6dd66fc..7dc5ec0 100644 --- a/Lobby/lobbySocket.ts +++ b/Lobby/lobbySocket.ts @@ -1,6 +1,8 @@ import { lobbyMessage } from "../Classes/lobbyMessage"; +import { lobbyState } from "../Classes/lobbyState"; import { playerData } from "../Classes/playerData" import { playerInventory } from "../Classes/playerInventory"; +import { userData } from "../Classes/userData"; import { game } from "../game"; export function registerLobbyCallbacks(socket){ @@ -12,7 +14,11 @@ export function registerLobbyCallbacks(socket){ socket.player.characterId = data1.characterId game.lobbyState.addUser(socket.user, socket.player) - game.socketIO.emit("lobby/playerJoin", JSON.stringify(game.lobbyState)) + + let newLobbyState : lobbyState = Object.assign({}, game.lobbyState); + newLobbyState.users = newLobbyState.users.map(u=> userData.makeSafe(u)) + + game.socketIO.emit("lobby/playerJoin", JSON.stringify(newLobbyState)) game.addMessage(new lobbyMessage(socket.user.login + " joined")) }); @@ -22,24 +28,17 @@ export function registerLobbyCallbacks(socket){ let buff = Buffer.from(data, 'base64'); let data1 : playerData = JSON.parse(buff.toString('utf-8')); - let player = game.lobbyState.findPlayer(socket.user.id) + let player : playerData = socket.player if(player == null){ console.log("Error! Player not spawned!") } else{ + player.room = data1.room player.rigidbody = data1.rigidbody + player.damageInfo = player.damageInfo.concat(data1.damageInfo) } }); - socket.on('lobby/lobbyUpdate', (data) => { - if(!socket.hasOwnProperty("user")) return; - - let buff = Buffer.from(data, 'base64'); - let data1 = JSON.parse(buff.toString('utf-8')); - - game.lobbyState.objects = data1.objects - }); - socket.on('lobby/loadoutChanged', (data) => { if(!socket.hasOwnProperty("user")) return; diff --git a/game.ts b/game.ts index 952d262..c3add0b 100644 --- a/game.ts +++ b/game.ts @@ -3,6 +3,7 @@ import { lobbyMessage } from "./Classes/lobbyMessage"; import { lobbyState } from "./Classes/lobbyState"; import { playerData } from "./Classes/playerData"; import { persistentItemData } from "./Classes/itemData"; +import { levelState } from "./Classes/levelState"; const fs = require('fs'); export class game{ @@ -13,7 +14,6 @@ export class game{ static playersDB : playerData[] = [] static itemsDB : persistentItemData[] = [] - /** Key: socket ID*/ static lobbyState : lobbyState = new lobbyState() /** Max items: 20 */ diff --git a/index.ts b/index.ts index fe0001b..0ce7cc3 100644 --- a/index.ts +++ b/index.ts @@ -5,6 +5,8 @@ import { players } from "./Player/players"; import { registerItemCallbacks } from "./Items/itemSocket"; import { registerLobbyCallbacks } from "./Lobby/lobbySocket"; import { registerAccountCallbacks } from "./Account/accountSocket"; +import { registerLevelCallbacks } from "./Level/levelSocket"; +import { levelState } from "./Classes/levelState"; const express = require("express"); const app = express(); @@ -33,6 +35,7 @@ io.on('connection', (socket) => { registerAccountCallbacks(socket); registerLobbyCallbacks(socket); registerItemCallbacks(socket); + registerLevelCallbacks(socket); socket.io = game.socketIO = io; @@ -54,13 +57,55 @@ io.on('connection', (socket) => { setInterval(() => { let userCount = game.lobbyState.players.length if(userCount > 0){ - game.lobbyState.hostId = game.lobbyState.users[0].id - io.emit('lobby', JSON.stringify(game.lobbyState.copyLight())) + game.lobbyState.players.forEach(p=>{ + let room = game.lobbyState.rooms.find(r=>r.id == p.room) + if (room == null){ + room = new levelState() + room.id = p.room + game.lobbyState.rooms.push(room) + console.log("Added room " + room.id) + } + }) + let removeRooms = [] + for (let i = 0; i < game.lobbyState.rooms.length; i++){ + let room = game.lobbyState.rooms[i] + + //assign host to a room if there isn't one + if(room.hostId == -1){ + let hostPlayer = game.lobbyState.players.find(p=>p.room == room.id) + if(hostPlayer != null){ + room.hostId = hostPlayer.id + continue; + } + } + + //verify if host is still in the room + let hostPlayer = game.lobbyState.players.find(p=>p.id == room.hostId) + if(hostPlayer == null || hostPlayer.room != room.id){ + //if they aren't, find another + hostPlayer = game.lobbyState.players.find(p=>p.room == room.id) + if(hostPlayer != null){ + room.hostId = hostPlayer.id + } + else{ + room.hostId = -1 + removeRooms.push(i) + } + } + } + for(let i = removeRooms.length - 1; i >= 0; i--){ + console.log("no players in room " + game.lobbyState.rooms[removeRooms[i]] + ". removing.") + game.lobbyState.rooms.splice(removeRooms[i],1); + } + io.emit('lobby/update', JSON.stringify(game.lobbyState.copyLight())) + game.playersDB.forEach(p=>{ + p.damageInfo = [] + }) } }, 1000/30) setInterval(() => { - console.log("Players: " + game.lobbyState.players.length + ", users: " + game.lobbyState.users.length); + console.log("Players: " + game.lobbyState.players.length + ", users: " + game.lobbyState.users.length + ", rooms: " + game.lobbyState.rooms.length); }, 60 * 1000) process.on('SIGINT', function () {