From e42b44bb14f1627034cf5d8cd5c84cd9f14d6092 Mon Sep 17 00:00:00 2001 From: Big Bad Waffle Date: Sat, 2 Feb 2019 20:06:10 +0200 Subject: [PATCH] fixes #1122 --- src/client/js/components/components.js | 31 +++++++++++++++++++++-- src/client/js/components/gatherer.js | 6 ++++- src/client/js/components/keyboardMover.js | 6 ++++- src/client/js/components/mouseMover.js | 6 +++-- src/client/js/components/pather.js | 4 +++ src/client/js/components/player.js | 6 ++++- src/client/js/components/serverActions.js | 6 ++++- 7 files changed, 57 insertions(+), 8 deletions(-) diff --git a/src/client/js/components/components.js b/src/client/js/components/components.js index 389524b6..1917399d 100644 --- a/src/client/js/components/components.js +++ b/src/client/js/components/components.js @@ -37,10 +37,37 @@ let components = [ return 'js/components/' + c; }); -define(components, function () { +define([ + ...components, + '../system/events' +], function () { + const events = arguments[arguments.length - 1]; + + const hookEvent = function (e, cb) { + if (!this.eventList[e]) + this.eventList[e] = []; + + this.eventList[e].push(cb); + events.on(e, cb); + }; + + const unhookEvents = function () { + Object.entries(this.eventList).forEach(([eventName, callbacks]) => { + callbacks.forEach(c => events.off(eventName, c)); + }); + }; + let templates = {}; - [].forEach.call(arguments, function (t) { + [].forEach.call(arguments, function (t, i) { + //Don't do this for the events module + if (i === arguments.length - 1) + return; + + t.eventList = {}; + t.hookEvent = hookEvent.bind(t); + t.unhookEvents = unhookEvents.bind(t); + templates[t.type] = t; }); diff --git a/src/client/js/components/gatherer.js b/src/client/js/components/gatherer.js index 7c5aa936..0f3a81f1 100644 --- a/src/client/js/components/gatherer.js +++ b/src/client/js/components/gatherer.js @@ -13,7 +13,7 @@ define([ init: function () { this.obj.on('onKeyDown', this.onKeyDown.bind(this)); - events.on('onRezone', this.onRezone.bind(this)); + this.hookEvent('onRezone', this.onRezone.bind(this)); }, extend: function (msg) { @@ -72,6 +72,10 @@ define([ method: 'gather' } }); + }, + + destroy: function () { + this.unhookEvents(); } }; }); diff --git a/src/client/js/components/keyboardMover.js b/src/client/js/components/keyboardMover.js index 19143a57..23c5fc6c 100644 --- a/src/client/js/components/keyboardMover.js +++ b/src/client/js/components/keyboardMover.js @@ -16,7 +16,7 @@ define([ moveCdMax: 8, init: function () { - events.on('onCanvasKeyDown', this.onCanvasKeyDown.bind(this)); + this.hookEvent('onCanvasKeyDown', this.onCanvasKeyDown.bind(this)); }, update: function () { @@ -74,6 +74,10 @@ define([ this.moveCd = this.moveCdMax; this.obj.pather.add(newX, newY); + }, + + destroy: function () { + this.unhookEvents(); } }; }); diff --git a/src/client/js/components/mouseMover.js b/src/client/js/components/mouseMover.js index 8324c271..79ef4d47 100644 --- a/src/client/js/components/mouseMover.js +++ b/src/client/js/components/mouseMover.js @@ -29,8 +29,8 @@ define([ sprite: null, init: function () { - events.on('onUiHover', this.onUiHover.bind(this, true)); - events.on('onUiLeave', this.onUiHover.bind(this, false)); + this.hookEvent('onUiHover', this.onUiHover.bind(this, true)); + this.hookEvent('onUiLeave', this.onUiHover.bind(this, false)); this.sprite = renderer.buildObject({ layerName: 'effects', @@ -76,6 +76,8 @@ define([ renderer.destroyObject({ sprite: this.sprite }); + + this.unhookEvents(); } }; }); diff --git a/src/client/js/components/pather.js b/src/client/js/components/pather.js index 0e615f10..8ec2932f 100644 --- a/src/client/js/components/pather.js +++ b/src/client/js/components/pather.js @@ -116,6 +116,10 @@ define([ return; } } + }, + + destroy: function () { + this.unhookEvents(); } }; }); diff --git a/src/client/js/components/player.js b/src/client/js/components/player.js index 7bb3f95b..6ab39b7e 100644 --- a/src/client/js/components/player.js +++ b/src/client/js/components/player.js @@ -30,7 +30,7 @@ define([ obj.addComponent('serverActions'); obj.addComponent('pather'); - events.on('onRespawn', this.onRespawn.bind(this)); + this.hookEvent('onRespawn', this.onRespawn.bind(this)); events.emit('onGetPortrait', obj.portrait); }, @@ -70,6 +70,10 @@ define([ onRespawn: function (position) { this.positionCamera(position.x, position.y, true); + }, + + destroy: function () { + this.unhookEvents(); } }; }); diff --git a/src/client/js/components/serverActions.js b/src/client/js/components/serverActions.js index f5b8d0a9..b1bc09a5 100644 --- a/src/client/js/components/serverActions.js +++ b/src/client/js/components/serverActions.js @@ -11,7 +11,7 @@ define([ actions: [], init: function (blueprint) { - events.on('onKeyUp', this.onKeyUp.bind(this)); + this.hookEvent('onKeyUp', this.onKeyUp.bind(this)); }, onKeyUp: function (key) { @@ -55,6 +55,10 @@ define([ } events.emit('onGetServerActions', this.actions); + }, + + destroy: function () { + this.unhookEvents(); } }; });