diff --git a/src/server/components/follower.js b/src/server/components/follower.js new file mode 100644 index 00000000..8f0ddab0 --- /dev/null +++ b/src/server/components/follower.js @@ -0,0 +1,80 @@ +define([ + +], function( + +) { + return { + type: 'follower', + + master: null, + + lifetime: -1, + + fGetHighest: { + inCombat: null, + outOfCombat: null + }, + + bindEvents: function() { + this.lifetime = 30; + + this.fGetHighest.inCombat = this.master.aggro.getHighest.bind(this.master.aggro); + this.fGetHighest.outOfCombat = this.returnNoAggro.bind(this); + }, + + returnNoAggro: function() { + var master = this.master; + var obj = this.obj; + var mob = obj.mob; + + mob.originX = master.x + ~~((Math.random() * 2) * 2) - 1; + mob.originY = master.y + ~~((Math.random() * 2) * 2) - 1; + + return null; + }, + + despawn: function() { + var obj = this.obj; + + obj.destroyed = true; + this.obj.instance.syncer.queue('onGetObject', { + x: obj.x, + y: obj.y, + components: [{ + type: 'attackAnimation', + row: 0, + col: 4 + }] + }); + }, + + update: function() { + this.lifetime--; + if (this.lifetime <= 0) { + this.despawn(); + return; + } + + var obj = this.obj; + var master = this.master; + + if (master.destroyed) { + this.despawn(); + return; + } + + var doMove = ( + (Math.abs(obj.x - master.x) >= 10) || + (Math.abs(obj.y - master.y) >= 10) + ); + + if (doMove) { + if (obj.aggro.getHighest == this.fGetHighest.inCombat) + obj.mob.target = obj; + } + + + obj.aggro.getHighest = doMove ? this.fGetHighest.outOfCombat : this.fGetHighest.inCombat; + } + }; +}); \ No newline at end of file diff --git a/src/server/components/inventory.js b/src/server/components/inventory.js index 96e0bc88..40bc3285 100644 --- a/src/server/components/inventory.js +++ b/src/server/components/inventory.js @@ -40,12 +40,14 @@ define([ item.spell.properties = item.spell.properties || {}; item.spell.properties.range = item.range; } + } + + this.hookItemEvents(items); + for (var i = 0; i < iLen; i++) { this.getItem(items[i], true); } - this.hookItemEvents(); - if ((this.obj.player) && (!isTransfer)) { this.getDefaultAbilities(); @@ -75,8 +77,8 @@ define([ this.hookItemEvents(); }, - hookItemEvents: function() { - var items = this.items; + hookItemEvents: function(items) { + var items = items || this.items; var iLen = items.length; for (var i = 0; i < iLen; i++) { var item = items[i]; diff --git a/src/server/components/mob.js b/src/server/components/mob.js index 593ac9b9..a16934f8 100644 --- a/src/server/components/mob.js +++ b/src/server/components/mob.js @@ -31,7 +31,7 @@ define([ if (this.obj.aggro) target = this.obj.aggro.getHighest(); var goHome = false; - if (target) { + if ((target) && (target != this.obj)) { this.fight(target); return; } else if (this.target) { diff --git a/src/server/components/stats.js b/src/server/components/stats.js index ac842d42..b31fa39d 100644 --- a/src/server/components/stats.js +++ b/src/server/components/stats.js @@ -315,6 +315,10 @@ define([ if (death.success) { var deathEvent = {}; + var killSource = source; + if (source.follower) + killSource = source.follower.master; + if (source.player) source.stats.kill(this.obj); else diff --git a/src/server/config/factions/gaekatla.js b/src/server/config/factions/gaekatla.js index d3b76b2b..f62ea858 100644 --- a/src/server/config/factions/gaekatla.js +++ b/src/server/config/factions/gaekatla.js @@ -69,12 +69,20 @@ define([ y: mob.y, cell: 34, sheetName: 'mobs', - name: 'Squiggle' + name: 'Squiggle', + properties: { + cpnFollower: {} + }, + extraProperties: { + follower: { + master: this + } + } } }); mobBuilder.build(mob, { - level: 5, + level: item.level, faction: this.aggro.faction, walkDistance: 2, regular: { @@ -82,7 +90,14 @@ define([ hpMult: 1, dmgMult: 1 }, + spells: [{ + type: 'melee', + damage: 1, + statMult: 0.1 + }] }, false, 'regular'); + + mob.follower.bindEvents(); } } }, diff --git a/src/server/config/maps/city/zone.js b/src/server/config/maps/city/zone.js index fdc5d64f..a4a62e04 100644 --- a/src/server/config/maps/city/zone.js +++ b/src/server/config/maps/city/zone.js @@ -111,7 +111,7 @@ module.exports = { }, faction: { id: 'gaekatla', - tier: 6 + tier: 5 }, markup: { buy: 0.25,