Remove cmpPlayerManager.GetAllPlayerEntities() which leaked internal data.

And all uses thereof could easily be replaced.
This changes the data structure of cmpTrigger.conquestEntitiesByPlayer
to
not store the player entity at all, and since that is now gone replaces
the
object by the array that was its sole property.

Refs #4161.
Reviewed by: fatherbushido
This was SVN commit r18645.
This commit is contained in:
leper 2016-08-27 15:26:23 +00:00
parent 737ede0f89
commit c4c315f6a0
6 changed files with 24 additions and 39 deletions

View File

@ -10,7 +10,7 @@ Trigger.prototype.ConquestHandlerOwnerShipChanged = function(msg)
return;
if (msg.to > 0 && this.conquestEntitiesByPlayer[msg.to])
this.conquestEntitiesByPlayer[msg.to].entities.push(msg.entity);
this.conquestEntitiesByPlayer[msg.to].push(msg.entity);
if (!this.conquestEntitiesByPlayer[msg.from])
{
@ -19,7 +19,7 @@ Trigger.prototype.ConquestHandlerOwnerShipChanged = function(msg)
return;
}
let entities = this.conquestEntitiesByPlayer[msg.from].entities;
let entities = this.conquestEntitiesByPlayer[msg.from];
let index = entities.indexOf(msg.entity);
if (index >= 0)
@ -54,10 +54,10 @@ Trigger.prototype.ConquestAddStructure = function(msg)
return;
}
if (this.conquestEntitiesByPlayer[player].entities.indexOf(msg.building) >= 0)
if (this.conquestEntitiesByPlayer[player].indexOf(msg.building) >= 0)
return;
this.conquestEntitiesByPlayer[player].entities.push(msg.building);
this.conquestEntitiesByPlayer[player].push(msg.building);
}
Trigger.prototype.ConquestTrainingFinished = function(msg)
@ -71,7 +71,7 @@ Trigger.prototype.ConquestTrainingFinished = function(msg)
warn("ConquestTrainingFinished: Unknown player " + player);
return;
}
this.conquestEntitiesByPlayer[player].entities.push(...msg.entities);
this.conquestEntitiesByPlayer[player].push(...msg.entities);
};
Trigger.prototype.ConquestStartGameCount = function()
@ -83,16 +83,14 @@ Trigger.prototype.ConquestStartGameCount = function()
}
let cmpRangeManager = Engine.QueryInterface(SYSTEM_ENTITY, IID_RangeManager);
let cmpPlayerManager = Engine.QueryInterface(SYSTEM_ENTITY, IID_PlayerManager);
cmpPlayerManager.GetAllPlayerEntities().forEach((elem, i) => {
if (i == 0)
return;
let numPlayers = Engine.QueryInterface(SYSTEM_ENTITY, IID_PlayerManager).GetNumPlayers();
for (let i = 1; i < numPlayers; ++i)
{
let filterEntity = ent => TriggerHelper.EntityHasClass(ent, this.conquestClassFilter)
&& !Engine.QueryInterface(ent, IID_Foundation);
this.conquestEntitiesByPlayer[i] = {"player" : elem, "entities" : [...cmpRangeManager.GetEntitiesByPlayer(i).filter(filterEntity)]};
});
this.conquestEntitiesByPlayer[i] = [...cmpRangeManager.GetEntitiesByPlayer(i).filter(filterEntity)];
}
this.conquestDataInit = true;
};

View File

@ -69,16 +69,16 @@ CeasefireManager.prototype.StartCeasefire = function(ceasefireTime)
if (!this.ceasefireIsActive)
{
// Save diplomacy
let playerEntities = Engine.QueryInterface(SYSTEM_ENTITY, IID_PlayerManager).GetAllPlayerEntities();
for (let i = 1; i < playerEntities.length; ++i)
let numPlayers = Engine.QueryInterface(SYSTEM_ENTITY, IID_PlayerManager).GetNumPlayers();
for (let i = 1; i < numPlayers; ++i)
// Copy array with slice(), otherwise it will change
this.diplomacyBeforeCeasefire.push(Engine.QueryInterface(playerEntities[i], IID_Player).GetDiplomacy().slice());
this.diplomacyBeforeCeasefire.push(QueryPlayerIDInterface(i).GetDiplomacy().slice());
// Set every enemy (except gaia) to neutral
for (let i = 1; i < playerEntities.length; ++i)
for (let j = 1; j < playerEntities.length; ++j)
for (let i = 1; i < numPlayers; ++i)
for (let j = 1; j < numPlayers; ++j)
if (this.diplomacyBeforeCeasefire[i-1][j] < 0)
Engine.QueryInterface(playerEntities[i], IID_Player).SetNeutral(j);
QueryPlayerIDInterface(i).SetNeutral(j);
}
this.ceasefireIsActive = true;
@ -115,9 +115,9 @@ CeasefireManager.prototype.StopCeasefire = function()
}, this.postCountdownMessageDuration);
// Reset diplomacies to original settings
let playerEntities = Engine.QueryInterface(SYSTEM_ENTITY, IID_PlayerManager).GetAllPlayerEntities();
for (let i = 1; i < playerEntities.length; ++i)
Engine.QueryInterface(playerEntities[i], IID_Player).SetDiplomacy(this.diplomacyBeforeCeasefire[i-1]);
let numPlayers = Engine.QueryInterface(SYSTEM_ENTITY, IID_PlayerManager).GetNumPlayers();
for (let i = 1; i < numPlayers; ++i)
QueryPlayerIDInterface(i).SetDiplomacy(this.diplomacyBeforeCeasefire[i-1]);
this.ceasefireIsActive = false;
this.ceasefireTime = 0;

View File

@ -232,22 +232,15 @@ Damage.prototype.CauseDamage = function(data)
* Gets entities near a give point for given players.
* @param {Vector2D} origin - the point to check around.
* @param {number} radius - the radius around the point to check.
* @param {number[]} [players] - the players of which we need to check entities. If players is not included, entities from all players are used.
* @param {number[]} players - the players of which we need to check entities.
* @return {number[]} - the id's of the entities in range of the given point.
*/
Damage.prototype.EntitiesNearPoint = function(origin, radius, players)
{
// If there is insufficient data return an empty array.
if (!origin || !radius)
if (!origin || !radius || !players)
return [];
// If the players parameter is not specified use all players.
if (!players)
{
let playerEntities = Engine.QueryInterface(SYSTEM_ENTITY, IID_PlayerManager).GetAllPlayerEntities();
players = playerEntities.map((ent) => Engine.QueryInterface(ent, IID_Player).GetPlayerID());
}
return Engine.QueryInterface(SYSTEM_ENTITY, IID_RangeManager).ExecuteQueryAroundPos(origin, 0, radius, players, IID_DamageReceiver);
};

View File

@ -104,8 +104,4 @@ PlayerManager.prototype.RemoveLastPlayer = function()
Engine.DestroyEntity(lastId);
};
PlayerManager.prototype.GetAllPlayerEntities = function()
{
return this.playerEntities;
};
Engine.RegisterSystemComponentType(IID_PlayerManager, "PlayerManager", PlayerManager);

View File

@ -53,7 +53,6 @@ AddMock(atkPlayerEntity, IID_Player, {
AddMock(SYSTEM_ENTITY, IID_PlayerManager, {
GetPlayerByID: (id) => atkPlayerEntity,
GetAllPlayerEntities: () => [attackerOwner, targetOwner],
});
AddMock(SYSTEM_ENTITY, IID_RangeManager, {

View File

@ -11,11 +11,10 @@ function PreInitGame()
Engine.BroadcastMessage(MT_SkirmishReplace, {});
Engine.FlushDestroyedEntities();
let cmpPlayerManager = Engine.QueryInterface(SYSTEM_ENTITY, IID_PlayerManager);
let playerIds = cmpPlayerManager.GetAllPlayerEntities().slice(1); // ignore gaia
for (let playerId of playerIds)
let numPlayers = Engine.QueryInterface(SYSTEM_ENTITY, IID_PlayerManager).GetNumPlayers();
for (let i = 1; i < numPlayers; ++i) // ignore gaia
{
let cmpTechnologyManager = Engine.QueryInterface(playerId, IID_TechnologyManager);
let cmpTechnologyManager = QueryPlayerIDInterface(i, IID_TechnologyManager);
if (cmpTechnologyManager)
cmpTechnologyManager.UpdateAutoResearch();
}