diff --git a/src/client/js/components/attackAnimation.js b/src/client/js/components/attackAnimation.js index 0acbafd8..0835a066 100644 --- a/src/client/js/components/attackAnimation.js +++ b/src/client/js/components/attackAnimation.js @@ -52,6 +52,8 @@ define([ if (this.noSprite) this.obj.sheetName = null; + + this.sprite.visible = this.obj.isVisible; }, renderManual: function () { @@ -66,7 +68,7 @@ define([ if (this.destroyObject) this.obj.destroyed = true; else { - if (this.obj.sprite && this.hideSprite) + if (this.obj.isVisible && this.obj.sprite) this.obj.sprite.visible = true; this.destroyed = true; diff --git a/src/client/js/components/explosion.js b/src/client/js/components/explosion.js index de7833e3..5bc11047 100644 --- a/src/client/js/components/explosion.js +++ b/src/client/js/components/explosion.js @@ -65,6 +65,9 @@ define([ }, explode: function (blueprint) { + if (!this.obj.isVisible) + return; + let particles = this.obj.addComponent('particles', this.blueprint); particles.emitter.update(0.2); diff --git a/src/client/js/components/particles.js b/src/client/js/components/particles.js index b1c99f4b..a1ff6229 100644 --- a/src/client/js/components/particles.js +++ b/src/client/js/components/particles.js @@ -17,6 +17,8 @@ define([ this.blueprint.obj = this.obj; this.emitter = renderer.buildEmitter(this.blueprint); + + this.setVisible(this.obj.isVisible); }, setVisible: function (visible) { diff --git a/src/client/js/objects/objBase.js b/src/client/js/objects/objBase.js index e63357ad..56129346 100644 --- a/src/client/js/objects/objBase.js +++ b/src/client/js/objects/objBase.js @@ -108,6 +108,28 @@ define([ stats.updateHpSprite(); }, + updateVisibility: function () { + const { x, y, hidden, isVisible } = this; + + const vis = ( + !hidden && + ( + this.self || + ( + renderer.sprites[x] && + renderer.sprites[x][y].length > 0 && + !renderer.isHidden(x, y) + ) + ) + ); + + if (vis === isVisible) + return; + + this.isVisible = vis; + this.setVisible(vis); + }, + setVisible: function (visible) { if (this.sprite) this.sprite.visible = visible; @@ -115,10 +137,17 @@ define([ if (this.nameSprite) this.nameSprite.visible = (visible && config.showNames); - this.components.forEach(c => { - if (c.setVisible) - c.setVisible(visible); - }); + if (!visible && this.stats && this.stats.hpSprite && this.stats.hpSprite.visible) { + this.stats.hpSprite.visible = false; + this.stats.hpSpriteInner.visible = false; + } + + if (!visible && this) { + this.components.forEach(c => { + if (c.setVisible) + c.setVisible(visible); + }); + } }, destroy: function () { diff --git a/src/client/js/objects/objects.js b/src/client/js/objects/objects.js index b8a0fb9d..079158fa 100644 --- a/src/client/js/objects/objects.js +++ b/src/client/js/objects/objects.js @@ -136,6 +136,31 @@ define([ obj[p] = value; } + if (obj.sheetName) { + obj.sprite = renderer.buildObject(obj); + if (template.hidden) { + obj.sprite.visible = false; + if (obj.nameSprite) + obj.nameSprite.visible = false; + if ((obj.stats) && (obj.stats.hpSprite)) { + obj.stats.hpSprite.visible = false; + obj.stats.hpSpriteInner.visible = false; + } + } + } + + if ((obj.name) && (obj.sprite)) { + obj.nameSprite = renderer.buildText({ + layerName: 'effects', + text: obj.name, + x: (obj.x * scale) + (scale / 2), + y: (obj.y * scale) + scale + }); + } + + //We need to set visibility before components kick in as they sometimes need access to isVisible + obj.updateVisibility(); + components.forEach(function (c) { //Map ids to objects let keys = Object.keys(c).filter(function (k) { @@ -154,19 +179,6 @@ define([ obj.addComponent(c.type, c); }, this); - if (obj.sheetName) { - obj.sprite = renderer.buildObject(obj); - if (template.hidden) { - obj.sprite.visible = false; - if (obj.nameSprite) - obj.nameSprite.visible = false; - if ((obj.stats) && (obj.stats.hpSprite)) { - obj.stats.hpSprite.visible = false; - obj.stats.hpSpriteInner.visible = false; - } - } - } - if (obj.self) { events.emit('onGetPlayer', obj); window.player = obj; @@ -179,28 +191,6 @@ define([ }, true); } - if ((obj.name) && (obj.sprite)) { - obj.nameSprite = renderer.buildText({ - layerName: 'effects', - text: obj.name, - x: (obj.x * scale) + (scale / 2), - y: (obj.y * scale) + scale - }); - } - - if (renderer.sprites) { - let isVisible = ( - obj.self || - ( - renderer.sprites[obj.x] && - renderer.sprites[obj.x][obj.y].length > 0 && - !renderer.isHidden(obj.x, obj.y) - ) - ); - - obj.setVisible(isVisible); - } - this.objects.push(obj); return obj; @@ -265,22 +255,6 @@ define([ if (((template.sheetName) || (template.cell)) && (sprite)) renderer.setSprite(obj); - if (sprite) { - if (template.hidden !== null) { - sprite.visible = !template.hidden; - if (obj.nameSprite) - obj.nameSprite.visible = config.showNames; - if ((obj.stats) && (obj.stats.hpSprite)) { - obj.stats.hpSprite.visible = !template.hidden; - obj.stats.hpSpriteInner.visible = !template.hidden; - } - } - } - - if ((template.x !== 0) || (template.y !== 0)) { - if (obj.stats) - obj.stats.updateHpSprite(); - } if ((!obj.sprite) && (template.sheetName)) obj.sprite = renderer.buildObject(obj); @@ -292,27 +266,15 @@ define([ x: (obj.x * scale) + (scale / 2), y: (obj.y * scale) + scale }); - obj.nameSprite.visible = config.showNames; } - if (obj.sprite) { - let ix = ~~obj.x; - let iy = ~~obj.y; - - let isVisible = ( - !!obj.player || - ( - !obj.hidden && - renderer.sprites[ix] && - renderer.sprites[ix][iy] && - renderer.sprites[ix][iy].length > 0 && - !renderer.isHidden(obj.x, obj.y) - ) - ); - obj.setVisible(isVisible); - } + if ((template.x !== 0) || (template.y !== 0)) { + obj.updateVisibility(); + obj.setSpritePosition(); - obj.setSpritePosition(); + if (obj.stats) + obj.stats.updateHpSprite(); + } }, update: function () { diff --git a/src/server/config/spells/spellProjectile.js b/src/server/config/spells/spellProjectile.js index ab81d598..92a77709 100644 --- a/src/server/config/spells/spellProjectile.js +++ b/src/server/config/spells/spellProjectile.js @@ -33,6 +33,8 @@ module.exports = { let projectileConfig = { caster: this.obj.id, extraTargets: 0, + x: obj.x, + y: obj.y, components: [{ idSource: this.obj.id, idTarget: target.id,