From 41676a09bc933b06c7a48988ae4d57d2d3cef065 Mon Sep 17 00:00:00 2001 From: Thomas Date: Mon, 2 Nov 2020 15:15:48 +0100 Subject: [PATCH] Fixed server, dockerfile draft --- Dockerfile | 25 ++++++++++--- client/src/store/socketPlugin.js | 2 +- server/package-lock.json | 5 +++ server/package.json | 1 + server/src/game.js | 64 +++++++++++++++++++------------- server/src/models/player.js | 2 +- server/src/models/wall.js | 2 +- server/src/server.js | 2 +- 8 files changed, 68 insertions(+), 35 deletions(-) diff --git a/Dockerfile b/Dockerfile index e901529..3b2f119 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,6 +1,19 @@ -FROM alpine:edge -MAINTAINER gltron -RUN apk --update add openjdk11-jre -COPY tronio.jar /home/tronio.jar -CMD ["java","-jar","/home/tronio.jar"] -EXPOSE 8181 +# https://medium.com/bb-tutorials-and-thoughts/packaging-your-vue-js-app-with-nodejs-backend-for-production-83abe213532c + +FROM node:10 AS ui-build +WORKDIR /usr/src/app +COPY client/ ./client/ +RUN cd client && npm install && npm run build + +FROM node:10 AS server-build +WORKDIR /root/ +COPY --from=ui-build /usr/src/app/client/dist ./server/dist +COPY server/package*.json ./server/ +RUN cd server && npm install +COPY server/src ./server/ + +EXPOSE 3000 + +CMD ["npm", "start"] + + diff --git a/client/src/store/socketPlugin.js b/client/src/store/socketPlugin.js index d6665f0..66502f6 100644 --- a/client/src/store/socketPlugin.js +++ b/client/src/store/socketPlugin.js @@ -1,6 +1,6 @@ import { ToastProgrammatic as Toast } from 'buefy' -const connection = new WebSocket('ws://localhost:8181/socket') +const connection = new WebSocket('ws://localhost:3000/socket') // const connection = new WebSocket('wss://tronio.gltronic.ovh/socket') export default function createSocketPlugin () { diff --git a/server/package-lock.json b/server/package-lock.json index 9bff68d..d2c187b 100644 --- a/server/package-lock.json +++ b/server/package-lock.json @@ -1860,6 +1860,11 @@ "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz", "integrity": "sha1-n5VxD1CiZ5R7LMwSR0HBAoQn5xM=" }, + "uuid": { + "version": "8.3.1", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.1.tgz", + "integrity": "sha512-FOmRr+FmWEIG8uhZv6C2bTgEVXsHk08kE7mPlrBbEe+c3r9pjceVPgupIfNIhc4yx55H69OXANrUaSuu9eInKg==" + }, "v8-compile-cache": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/v8-compile-cache/-/v8-compile-cache-2.2.0.tgz", diff --git a/server/package.json b/server/package.json index cef5fcb..626de9c 100644 --- a/server/package.json +++ b/server/package.json @@ -15,6 +15,7 @@ "license": "ISC", "dependencies": { "express": "^4.17.1", + "uuid": "^8.3.1", "ws": "^7.3.1" }, "devDependencies": { diff --git a/server/src/game.js b/server/src/game.js index 3950382..2361fe6 100644 --- a/server/src/game.js +++ b/server/src/game.js @@ -1,39 +1,51 @@ +const { v4: uuidv4 } = require('uuid') const Player = require('./models/player') const gameSettings = require('./models/gameSettings') -const players = new Map() -const sockets = new Map() +const players = {} +const sockets = {} + +let updateInterval = -1 let lastUpdateTime = Date.now() let doUpdate = true function login (connection, name) { - sockets[connection.id] = connection - players[connection.id] = new Player(connection.id, name) + const id = uuidv4() + connection.id = id + sockets[id] = connection + players[id] = new Player(id, name) - connection.send({ + connection.send(JSON.stringify({ type: 'login', - player: players[connection.id] - }) + player: players[id] + })) - connection.send({ + connection.send(JSON.stringify({ type: 'gameSettings', gameSettings: gameSettings - }) + })) + + if (updateInterval === -1) updateInterval = setInterval(() => step(), 1000) } function logout (connection) { - sockets.delete(connection.id) - players.delete(connection.id) + delete sockets[connection.id] + delete players[connection.id] + + if (Object.keys(players).length === 0) { + clearInterval(updateInterval) + updateInterval = -1 + } } function respawn (connection) { players[connection.id].reset() - connection.send({ + connection.send(JSON.stringify({ type: 'gamePlayerSpawn', player: players[connection.id] - }) + })) } function update (connection, player) { @@ -42,10 +54,10 @@ function update (connection, player) { function kill (player) { player.kill() - sockets[player.id].send({ + sockets[player.id].send(JSON.stringify({ type: 'gamePlayerDead', player: player - }) + })) } function step () { @@ -54,22 +66,24 @@ function step () { const tickToSimulate = (durationSinceLastUpdate * 120) / 1000 lastUpdateTime = currentTime - players.forEach((player, id) => { + // console.log('UPDATE ' + currentTime + ' doUpdate ' + doUpdate) + + Object.values(players).forEach((player) => { if (player.isOutOfBorders()) kill(player) - players.forEach((player2, id2) => { + Object.values(players).forEach((player2) => { if (player.state === 'DEAD') return for (let i = 0; i < player2.walls.length - 2; i++) { // Prevent self destroy on last wall - if (id === id2 && i >= player2.walls.length - 1) break + if (player === player2 && i >= player2.walls.length - 1) break const wallA = player2.walls[i] const wallB = player2.walls[i + 1] if (player.isCloseToWall(wallA, wallB)) { if (player.isCrossingLine(wallA, wallB)) { - if (id !== id2) player2.score += 300 + if (player !== player2) player2.score += 300 kill(player) return } @@ -78,7 +92,7 @@ function step () { }) }) - players.forEach((player, id) => { + Object.values(players).forEach((player) => { player.step(tickToSimulate) }) @@ -89,16 +103,16 @@ function step () { function broadcastUpdate () { const update = { type: 'update', - players: players, + players: Object.values(players), time: lastUpdateTime } - sockets.forEach((connection, id) => { - connection.send(update) + + console.log('Broadcast ' + JSON.stringify(update)) + Object.values(sockets).forEach((connection) => { + connection.send(JSON.stringify(update)) }) } -setInterval(() => step(), 1000 / 60) - module.exports = { login, logout, diff --git a/server/src/models/player.js b/server/src/models/player.js index 338903a..d30e940 100644 --- a/server/src/models/player.js +++ b/server/src/models/player.js @@ -71,4 +71,4 @@ class Player { } } -module.exports = { Player } +module.exports = Player diff --git a/server/src/models/wall.js b/server/src/models/wall.js index a0b0446..28b0f7c 100644 --- a/server/src/models/wall.js +++ b/server/src/models/wall.js @@ -5,4 +5,4 @@ class Wall { } } -module.exports = { Wall } +module.exports = Wall diff --git a/server/src/server.js b/server/src/server.js index 9845fcd..ba74940 100644 --- a/server/src/server.js +++ b/server/src/server.js @@ -15,7 +15,7 @@ const server = app.listen(port, () => { const wss = new WebSocketServer({ server }) wss.on('connection', function (connection) { - connection.on('close', game.logout(connection)) + connection.on('close', () => game.logout(connection)) connection.on('message', (message) => { let data