cache the affected players in order to remove the template bonuses given by auras from the right players before adding them again.

This was SVN commit r15298.
This commit is contained in:
sanderd17 2014-06-05 11:24:31 +00:00
parent 2d1f9c33dc
commit 55760f6413

View File

@ -27,9 +27,13 @@ Auras.prototype.Init = function()
this.templateName = cmpTemplateManager.GetCurrentTemplateName(this.entity); this.templateName = cmpTemplateManager.GetCurrentTemplateName(this.entity);
var auraNames = this.GetAuraNames(); var auraNames = this.GetAuraNames();
this.auras = {}; this.auras = {};
this.affectedPlayers = {};
var cmpTechnologyTemplateManager = Engine.QueryInterface(SYSTEM_ENTITY, IID_TechnologyTemplateManager); var cmpTechnologyTemplateManager = Engine.QueryInterface(SYSTEM_ENTITY, IID_TechnologyTemplateManager);
for each (var name in auraNames) for each (var name in auraNames)
{
this.auras[name] = cmpTechnologyTemplateManager.GetAuraTemplate(name); this.auras[name] = cmpTechnologyTemplateManager.GetAuraTemplate(name);
this.affectedPlayers[name] = []; // will be calculated on ownership change
}
}; };
Auras.prototype.GetAuraNames = function() Auras.prototype.GetAuraNames = function()
@ -57,18 +61,23 @@ Auras.prototype.GetModifications = function(name)
}; };
Auras.prototype.GetAffectedPlayers = function(name) Auras.prototype.GetAffectedPlayers = function(name)
{
return this.affectedPlayers[name];
};
Auras.prototype.CalculateAffectedPlayers = function(name)
{ {
if (this.auras[name].affectedPlayers) if (this.auras[name].affectedPlayers)
var affectedPlayers = this.auras[name].affectedPlayers; var affectedPlayers = this.auras[name].affectedPlayers;
else else
var affectedPlayers = ["Player"]; var affectedPlayers = ["Player"];
var ret = []; this.affectedPlayers[name] = [];
var cmpPlayer = QueryOwnerInterface(this.entity, IID_Player); var cmpPlayer = QueryOwnerInterface(this.entity, IID_Player);
if (!cmpPlayer) if (!cmpPlayer)
return ret; return;
var cmpPlayerManager = Engine.QueryInterface(SYSTEM_ENTITY, IID_PlayerManager); var cmpPlayerManager = Engine.QueryInterface(SYSTEM_ENTITY, IID_PlayerManager);
var numPlayers = cmpPlayerManager.GetNumPlayers(); var numPlayers = cmpPlayerManager.GetNumPlayers();
@ -79,12 +88,11 @@ Auras.prototype.GetAffectedPlayers = function(name)
{ {
if (p == "Player" ? cmpPlayer.GetPlayerID() == i : cmpPlayer["Is" + p](i)) if (p == "Player" ? cmpPlayer.GetPlayerID() == i : cmpPlayer["Is" + p](i))
{ {
ret.push(i); this.affectedPlayers[name].push(i);
break; break;
} }
} }
} }
return ret;
}; };
Auras.prototype.HasFormationAura = function() Auras.prototype.HasFormationAura = function()
@ -158,6 +166,9 @@ Auras.prototype.Clean = function()
for each (var name in auraNames) for each (var name in auraNames)
{ {
// only calculate the affected players on re-applying the bonuses
// this makes sure the template bonuses are removed from the correct players
this.CalculateAffectedPlayers(name);
// initialise range query // initialise range query
this[name] = {}; this[name] = {};
this[name].targetUnits = []; this[name].targetUnits = [];