-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathserver.js
117 lines (89 loc) · 3.21 KB
/
server.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
var express = require('express')
, app = express(app)
, server = require('http').createServer(app);
// serve static files from the current directory
app.use(express.static(__dirname));
//we'll keep clients data here
var clients = {};
console.log('Start 3');
//get EurecaServer class
var Eureca = require('eureca.io');
//create an instance of EurecaServer
var eurecaServer = new Eureca.Server({allow: ['setId', 'spawnEnemy', 'kill', 'updateState']});
//attach eureca.io to our http server
eurecaServer.attach(server);
/**
* detect client connection
*/
eurecaServer.onConnect(function (conn) {
console.log('New Client id=%s ', conn.id, conn.remoteAddress);
//the getClient method provide a proxy allowing us to call remote client functions
var remote = eurecaServer.getClient(conn.id);
//register the client
clients[conn.id] = {id: conn.id, remote: remote};
//here we call setId (defined in the client side)
remote.setId(conn.id);
});
/**
* Detect client disconnection
*/
eurecaServer.onDisconnect(function (conn) {
console.log('Client disconnected ', conn.id);
// var removeId = clients[conn.id].id;
delete clients[conn.id];
for (var client in clients) {
var remote = clients[client].remote;
//here we call kill() method defined in the client side
remote.kill(conn.id);
}
});
/**
* Рукопожатие при создании игры (после onConnect)
*/
eurecaServer.exports.handshake = function () {
for (var c in clients) {
// console.log('::', clients);
var remote = clients[c].remote;
for (var client in clients) {
//send latest known position
var x = clients[client].laststate ? clients[client].laststate.x : 32;
var y = clients[client].laststate ? clients[client].laststate.y : 32;
// console.log('::', x, y, client.id);
remote.spawnEnemy(clients[client].id, x, y, clients[client].laststate);
}
}
};
/**
* Открывается со стороны клиента при каждом действии
* @param keys
*/
eurecaServer.exports.handleKeys = function (keys) {
var conn = this.connection;
var updatedClient = clients[conn.id];
for (var c in clients) {
clients[c].remote.updateState(updatedClient.id, keys);
}
var laststate = clients[conn.id].laststate ? clients[conn.id].laststate : {};
// if (typeof (keys.health) !== 'undefined')
// console.log('---', laststate.health, keys.health, conn.id);
// Сохранить последнее положение танка
if (keys.remove !== true) {
clients[conn.id].laststate = modifyLaststate(laststate, keys);
} else {
clients[conn.id].laststate = {};
}
};
///// SERVICE ///////
// Сохраняет в итоговом массиве только измененные значения
modifyLaststate = function (firstArray, addedArray) {
var c = {},
key;
firstArray = Object.assign(firstArray, addedArray);
for (key in firstArray) {
if (firstArray.hasOwnProperty(key)) {
c[key] = key in addedArray ? addedArray[key] : firstArray[key];
}
}
return c;
};
server.listen(8000);