From c4c315f6a01a9154d297f899c4b9dc7b9c48678a Mon Sep 17 00:00:00 2001 From: leper Date: Sat, 27 Aug 2016 15:26:23 +0000 Subject: [PATCH] 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. --- .../public/maps/scripts/ConquestCommon.js | 22 +++++++++---------- .../simulation/components/CeasefireManager.js | 18 +++++++-------- .../public/simulation/components/Damage.js | 11 ++-------- .../simulation/components/PlayerManager.js | 4 ---- .../components/tests/test_Damage.js | 1 - .../public/simulation/helpers/InitGame.js | 7 +++--- 6 files changed, 24 insertions(+), 39 deletions(-) diff --git a/binaries/data/mods/public/maps/scripts/ConquestCommon.js b/binaries/data/mods/public/maps/scripts/ConquestCommon.js index 767c18ce99..e66d2124e4 100644 --- a/binaries/data/mods/public/maps/scripts/ConquestCommon.js +++ b/binaries/data/mods/public/maps/scripts/ConquestCommon.js @@ -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; }; diff --git a/binaries/data/mods/public/simulation/components/CeasefireManager.js b/binaries/data/mods/public/simulation/components/CeasefireManager.js index e0e9ce00db..2f2e37f27f 100644 --- a/binaries/data/mods/public/simulation/components/CeasefireManager.js +++ b/binaries/data/mods/public/simulation/components/CeasefireManager.js @@ -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; diff --git a/binaries/data/mods/public/simulation/components/Damage.js b/binaries/data/mods/public/simulation/components/Damage.js index 9756092fd8..04d4d246d9 100644 --- a/binaries/data/mods/public/simulation/components/Damage.js +++ b/binaries/data/mods/public/simulation/components/Damage.js @@ -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); }; diff --git a/binaries/data/mods/public/simulation/components/PlayerManager.js b/binaries/data/mods/public/simulation/components/PlayerManager.js index a9f898e28e..4576704758 100644 --- a/binaries/data/mods/public/simulation/components/PlayerManager.js +++ b/binaries/data/mods/public/simulation/components/PlayerManager.js @@ -104,8 +104,4 @@ PlayerManager.prototype.RemoveLastPlayer = function() Engine.DestroyEntity(lastId); }; -PlayerManager.prototype.GetAllPlayerEntities = function() -{ - return this.playerEntities; -}; Engine.RegisterSystemComponentType(IID_PlayerManager, "PlayerManager", PlayerManager); diff --git a/binaries/data/mods/public/simulation/components/tests/test_Damage.js b/binaries/data/mods/public/simulation/components/tests/test_Damage.js index 1715008f3e..b5d7e26c05 100644 --- a/binaries/data/mods/public/simulation/components/tests/test_Damage.js +++ b/binaries/data/mods/public/simulation/components/tests/test_Damage.js @@ -53,7 +53,6 @@ AddMock(atkPlayerEntity, IID_Player, { AddMock(SYSTEM_ENTITY, IID_PlayerManager, { GetPlayerByID: (id) => atkPlayerEntity, - GetAllPlayerEntities: () => [attackerOwner, targetOwner], }); AddMock(SYSTEM_ENTITY, IID_RangeManager, { diff --git a/binaries/data/mods/public/simulation/helpers/InitGame.js b/binaries/data/mods/public/simulation/helpers/InitGame.js index 980ec658d1..1541946a79 100644 --- a/binaries/data/mods/public/simulation/helpers/InitGame.js +++ b/binaries/data/mods/public/simulation/helpers/InitGame.js @@ -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(); }