forked from 0ad/0ad
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:
parent
737ede0f89
commit
c4c315f6a0
@ -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;
|
||||
};
|
||||
|
@ -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;
|
||||
|
@ -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);
|
||||
};
|
||||
|
||||
|
@ -104,8 +104,4 @@ PlayerManager.prototype.RemoveLastPlayer = function()
|
||||
Engine.DestroyEntity(lastId);
|
||||
};
|
||||
|
||||
PlayerManager.prototype.GetAllPlayerEntities = function()
|
||||
{
|
||||
return this.playerEntities;
|
||||
};
|
||||
Engine.RegisterSystemComponentType(IID_PlayerManager, "PlayerManager", PlayerManager);
|
||||
|
@ -53,7 +53,6 @@ AddMock(atkPlayerEntity, IID_Player, {
|
||||
|
||||
AddMock(SYSTEM_ENTITY, IID_PlayerManager, {
|
||||
GetPlayerByID: (id) => atkPlayerEntity,
|
||||
GetAllPlayerEntities: () => [attackerOwner, targetOwner],
|
||||
});
|
||||
|
||||
AddMock(SYSTEM_ENTITY, IID_RangeManager, {
|
||||
|
@ -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();
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user