enemy damage sync

This commit is contained in:
Katboi01 2023-09-20 20:17:18 +02:00
parent 0beec15332
commit 142ec1dd05
9 changed files with 121 additions and 17 deletions

View File

@ -0,0 +1,5 @@
export class enemyDamageInfo{
sourceId : number
targetId : number
damage : number
}

9
Classes/enemyData.ts Normal file
View File

@ -0,0 +1,9 @@
import { Stat } from "./itemData"
import { physicsObject } from "./physicsObject"
export class enemyData{
id : number
templateId : number
rigidbody : physicsObject
stats : Stat[] = []
}

11
Classes/levelState.ts Normal file
View File

@ -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[] = [];
}

View File

@ -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
}

View File

@ -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
}

28
Level/levelSocket.ts Normal file
View File

@ -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
});
}

View File

@ -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;

View File

@ -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 */

View File

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