105 lines
No EOL
2.4 KiB
JavaScript
105 lines
No EOL
2.4 KiB
JavaScript
// Setup:
|
|
// npm install express
|
|
// npm install engine.io
|
|
// npm install eureca.io
|
|
|
|
// Pull in express
|
|
var express = require('express');
|
|
|
|
// Our app and server objects
|
|
var app = express(app);
|
|
var server = require('http').createServer(app);
|
|
|
|
// serve static files from the current directory
|
|
app.use(express.static(__dirname));
|
|
|
|
// get a eureca server
|
|
var EurecaServer = require('eureca.io').EurecaServer;
|
|
|
|
//create an instance of EurecaServer
|
|
var eurecaServer = new EurecaServer({
|
|
// Allow out communication functions
|
|
allow: ['handshake', 'spawnPlayer', 'kill', 'updateState']
|
|
});
|
|
|
|
// attach eurica to our server
|
|
eurecaServer.attach(server);
|
|
|
|
// Our list of clients
|
|
var clients = {};
|
|
|
|
// When a client connects
|
|
eurecaServer.onConnect(function(conn) {
|
|
|
|
console.log('Connection %s from ', conn.id, conn.remoteAddress);
|
|
|
|
// Grab the client proxy to call functions easily
|
|
var remote = eurecaServer.getClient(conn.id);
|
|
|
|
// Refuse multiple connections from the same IP
|
|
for (var c in clients) {
|
|
if ( clients[c].ip === conn.ip )
|
|
{
|
|
console.log("Refusing additional connection from ",conn.ip);
|
|
return;
|
|
}
|
|
}
|
|
|
|
// Handshake with the client sending it it's new ID
|
|
remote.handshake(conn.id);
|
|
|
|
// Inform the client of all other players to spawn
|
|
for (var c in clients) {
|
|
var x = clients[c].state ? clients[c].state.x : 0;
|
|
var y = clients[c].state ? clients[c].state.y : 0;
|
|
|
|
remote.spawnPlayer(clients[c].id, x, y);
|
|
}
|
|
|
|
// Inform other clients to spawn this player
|
|
for (var c in clients) {
|
|
var x = remote.state ? remote.state.x : 0;
|
|
var y = remote.state ? remote.state.y : 0;
|
|
|
|
clients[c].remote.spawnPlayer(conn.id, x, y);
|
|
}
|
|
|
|
// Add the client to our list
|
|
clients[conn.id] = {
|
|
id: conn.id,
|
|
remote: remote,
|
|
ip: conn.ip,
|
|
}
|
|
});
|
|
|
|
// When a client disconnects
|
|
eurecaServer.onDisconnect(function(conn) {
|
|
|
|
console.log('Disconnection ', conn.id);
|
|
|
|
// delete this client
|
|
delete clients[conn.id];
|
|
|
|
// Notify other clients of disconnection
|
|
for (var c in clients) {
|
|
clients[c].remote.kill(conn.id);
|
|
}
|
|
});
|
|
|
|
// When a client asks to update it's state
|
|
eurecaServer.exports.updateMe = function(state) {
|
|
|
|
// Get conncection info
|
|
var conn = this.connection;
|
|
|
|
// Send new state to all other clients
|
|
for (var c in clients) {
|
|
clients[c].remote.updateState(conn.id, state);
|
|
}
|
|
|
|
// store the last known state
|
|
clients[conn.id].state = state;
|
|
}
|
|
|
|
// Listen on port 80
|
|
server.listen(8000); |