diff --git a/src/client/js/objects/objects.js b/src/client/js/objects/objects.js index 01cce11f..86f8e4f3 100644 --- a/src/client/js/objects/objects.js +++ b/src/client/js/objects/objects.js @@ -95,7 +95,7 @@ define([ if (oldZone === null) o.destroy(); - else if ((o.zoneId === oldZone) && (!o.has('player'))) + else if (o.zoneId === oldZone) o.destroy(); } diff --git a/src/server/components/portal/sendObjToZone.js b/src/server/components/portal/sendObjToZone.js index f16d9eff..a2b4c4dd 100644 --- a/src/server/components/portal/sendObjToZone.js +++ b/src/server/components/portal/sendObjToZone.js @@ -1,5 +1,7 @@ const sendObjToZone = async ({ obj, invokingObj, zoneName, toPos, toRelativePos }) => { - const { instance: { physics, syncer: globalSyncer } } = obj; + const { serverId, instance: { physics, syncer: globalSyncer } } = obj; + + globalSyncer.flushForTarget(serverId); if (obj.zoneName === zoneName) { physics.removeObject(obj, obj.x, obj.y); diff --git a/src/server/components/social/rezone.js b/src/server/components/social/rezone.js index 01ba018d..e3edbc07 100644 --- a/src/server/components/social/rezone.js +++ b/src/server/components/social/rezone.js @@ -1,18 +1,10 @@ -module.exports = async (cpnSocial, targetZone) => { - const { obj } = cpnSocial; - - obj.fireEvent('beforeRezone'); +const sendObjToZone = require('../portal/sendObjToZone'); - obj.destroyed = true; - - const simpleObj = obj.getSimple(true, false, true); +module.exports = (cpnSocial, targetZone) => { + const { obj } = cpnSocial; - process.send({ - method: 'rezone', - id: obj.serverId, - args: { - obj: simpleObj, - newZone: targetZone - } + sendObjToZone({ + obj, + zoneName: targetZone }); }; diff --git a/src/server/world/syncer.js b/src/server/world/syncer.js index 70786282..a75e4eb5 100644 --- a/src/server/world/syncer.js +++ b/src/server/world/syncer.js @@ -14,7 +14,7 @@ module.exports = { let oList = objects.objects; let oLen = oList.length; - let pList = oList.filter(f => f.player); + let pList = oList.filter(f => f.player && !f.destroyed); let pLen = pList.length; if (pLen === 0) @@ -166,6 +166,16 @@ module.exports = { }); }, + flushForTarget: function (targetServerId) { + const buffer = this.buffer; + + for (let p in buffer) { + const list = buffer[p]; + + list.spliceWhere(l => l.to === targetServerId); + } + }, + send: function () { if (!this.dirty) return;