From c534c2729d0b347fc7d3d42490093317abbd41aa Mon Sep 17 00:00:00 2001 From: Shaun Date: Wed, 17 May 2017 09:25:40 +0200 Subject: [PATCH] Fixes #156 --- src/server/components/notice.js | 19 +++++++++---- src/server/components/stats.js | 47 ++++++++++++++++++++------------- 2 files changed, 42 insertions(+), 24 deletions(-) diff --git a/src/server/components/notice.js b/src/server/components/notice.js index 7417163b..e1be2038 100644 --- a/src/server/components/notice.js +++ b/src/server/components/notice.js @@ -69,11 +69,13 @@ define([ }, [obj.serverId]); }, - collisionExit: function(obj) { - if (!obj.player) - return; - else if ((this.maxLevel) && (obj.stats.values.level > this.maxLevel)) - return; + collisionExit: function(obj, force) { + if (!force) { + if (!obj.player) + return; + else if ((this.maxLevel) && (obj.stats.values.level > this.maxLevel)) + return; + } this.callAction(obj, 'exit'); @@ -83,6 +85,13 @@ define([ this.syncer.queue('onRemoveDialogue', { src: this.obj.id }, [obj.serverId]); + }, + + events: { + onCellPlayerLevelUp: function(obj) { + if ((this.maxLevel) && (obj.stats.values.level > this.maxLevel)) + this.collisionExit(obj, true); + } } }; }); \ No newline at end of file diff --git a/src/server/components/stats.js b/src/server/components/stats.js index ac842d42..2ec36a18 100644 --- a/src/server/components/stats.js +++ b/src/server/components/stats.js @@ -156,45 +156,54 @@ define([ }, getXp: function(amount) { - amount = ~~(amount * (1 + (this.values.xpIncrease / 100))); + var obj = this.obj; + var values = this.values; + + amount = ~~(amount * (1 + (values.xpIncrease / 100))); - this.values.xpTotal = ~~(this.values.xpTotal + amount); - this.values.xp = ~~(this.values.xp + amount); + values.xpTotal = ~~(values.xpTotal + amount); + values.xp = ~~(values.xp + amount); this.syncer.queue('onGetDamage', { - id: this.obj.id, + id: obj.id, event: true, text: '+' + amount + ' xp' }); var syncO = {}; - var didLevelUp = false; - while (this.values.xp >= this.values.xpMax) { + + while (values.xp >= values.xpMax) { didLevelUp = true; - this.values.xp -= this.values.xpMax; - this.values.level++; + values.xp -= values.xpMax; + values.level++; - this.values.hpMax += 40; + values.hpMax += 40; this.syncer.queue('onGetDamage', { - id: this.obj.id, + id: obj.id, event: true, text: 'level up' }); - this.obj.syncer.setObject(true, 'stats', 'values', 'level', this.values.level); - this.obj.syncer.setObject(true, 'stats', 'values', 'hpMax', this.values.hpMax); + obj.syncer.setObject(true, 'stats', 'values', 'level', values.level); + obj.syncer.setObject(true, 'stats', 'values', 'hpMax', values.hpMax); - syncO.level = this.values.level; + syncO.level = values.level; this.calcXpMax(); } - if (didLevelUp) - this.obj.auth.doSave(); + if (didLevelUp) { + var cellContents = obj.instance.physics.getCell(obj.x, obj.y); + cellContents.forEach(function(c) { + c.fireEvent('onCellPlayerLevelUp', obj); + }); + + obj.auth.doSave(); + } - this.obj.syncer.setObject(true, 'stats', 'values', 'xp', this.values.xp); + obj.syncer.setObject(true, 'stats', 'values', 'xp', this.values.xp); process.send({ method: 'object', @@ -237,13 +246,13 @@ define([ var amount = level * 10 * mult; if (Math.abs(levelDelta) <= 10) amount = ~~(((sourceLevel + levelDelta) * 10) * Math.pow(1 - (Math.abs(levelDelta) / 10), 2) * mult); - else + else amount = 0; a.obj.stats.getXp(amount, this.obj); } - - + + a.obj.fireEvent('afterKillMob', target); }