diff --git a/master.js b/master.js index 9b713d98..a50684bf 100644 --- a/master.js +++ b/master.js @@ -621,8 +621,18 @@ class slaveMapper { mapRequesters[data.requesterID].socket.emit("displayChunk", data); }); // slaveMapper sent us an entity update, process - this.socket.on("sendEntity", function(entity){ - mapRequesters[entity.requesterID].socket.emit("displayEntity", entity); + this.socket.on("sendEntity", entity => { + Object.keys(mapRequesters).forEach(requesterName => { + let requester = mapRequesters[requesterName]; + if(requester.lastBeat < (Date.now() - 30000)){ + console.log("There are currently "+Object.keys(mapRequesters).length+" map requesters, deleting one on timeout"); + delete mapRequesters[requesterName]; // we have to use the full name here or we will only kill the pointer + } + if(requester.instanceID == this.instanceID){ + // this mapRequester is listening to this slaveMapper, so we send it updates + requester.socket.emit("displayEntity", entity); + } + }); }); } } @@ -632,7 +642,12 @@ class mapRequester { this.requesterID = requesterID; this.socket = socket; this.instanceID = instanceID; + this.lastBeat = Date.now(); + this.socket.on("heartbeat", () => { + // we aren't ready to die yet apparently + this.lastBeat = Date.now(); + }); this.socket.on("requestChunk", loc => { loc.requesterID = this.requesterID; let instanceID = loc.instanceID || this.instanceID; @@ -659,7 +674,7 @@ io.on('connection', function (socket) { // data {instanceID:""} let requesterID = Math.random().toString(); mapRequesters[requesterID] = new mapRequester(requesterID, socket, data.instanceID); - + socket.emit("mapRequesterReady", true); console.log("SOCKET registered map requester for "+data.instanceID); }); }); diff --git a/sharedPlugins/remoteMap/chunkStore.js b/sharedPlugins/remoteMap/chunkStore.js index 69cd9c63..f8a4ee66 100644 --- a/sharedPlugins/remoteMap/chunkStore.js +++ b/sharedPlugins/remoteMap/chunkStore.js @@ -48,7 +48,7 @@ module.exports = class chunkStore { }); }); resolve(); - this.eventEmitter.emit("change", [{x,y}]); + this.eventEmitter.emit("change", {x,y}); } }); }); @@ -58,7 +58,6 @@ module.exports = class chunkStore { this.db.find({x:Math.floor(x), y:Math.floor(y)}, (err, docs) => { if(err) reject(err); resolve(docs); - this.eventEmitter.emit("change", docs); }); }); } diff --git a/sharedPlugins/remoteMap/index.js b/sharedPlugins/remoteMap/index.js index 6244275c..4b613399 100644 --- a/sharedPlugins/remoteMap/index.js +++ b/sharedPlugins/remoteMap/index.js @@ -12,12 +12,23 @@ class remoteMap { // initialize chunk database this.chunkMap = new chunkStore(this.config.unique, 64, "./database/chunkStore/"); + this.chunkMap.onEntityChange(entity => { + console.log("Entity changed: ") + console.log(entity); + // check valid coordinates (dunno what could go wrong, but can never be too sure) + if(entity && entity.x !== undefined && !isNaN(Number(entity.x)) && entity.y !== undefined && !isNaN(Number(entity.y))){ + this.socket.emit("sendEntity", entity); + } + }); // set up websocket communication and handle requests from web interface users (which are going through master) // socket should be a global this.socket = ioClient("http://"+this.config.masterIP+":"+this.config.masterPort); this.socket.on("hello", data => { this.socket.emit("registerSlaveMapper", {instanceID: this.config.unique}); + setInterval(()=>{ + this.socket.emit("heartbeat"); // send our heartbeat to prevent being assumed dead + },10000); }); this.socket.on("getChunk", req => { console.log("getChunk is not supported!"); @@ -27,11 +38,11 @@ class remoteMap { });*/ }); this.socket.on("getEntity", req => { - if(req.requesterID && req.x && !isNaN(Number(req.x)) && req.y && !isNaN(Number(req.y))){ + // check for valid coordinates + if(req.x !== undefined && !isNaN(Number(req.x)) && req.y !== undefined && !isNaN(Number(req.y))){ this.chunkMap.getEntity(req.x, req.y).then(entities => { if(entities && entities.length > 0){ entities.forEach(entity => { - entity.requesterID = req.requesterID; this.socket.emit("sendEntity", entity); }); } @@ -45,9 +56,8 @@ class remoteMap { } scriptOutput(data){ if(data){ - //this.messageInterface(data); + this.messageInterface(data); // express-transport-belt -35.5 -14.5 - data = data.split(" "); if(data && data[0] == undefined){ console.log("empty: "); diff --git a/static/remoteMap.html b/static/remoteMap.html index a21e4791..a0d1a77a 100644 --- a/static/remoteMap.html +++ b/static/remoteMap.html @@ -9,7 +9,7 @@ <%- include("sidebar.html") %>