From 841530ad68fe0b69a56cd03be617b8c3bfbc9c5a Mon Sep 17 00:00:00 2001
From: leper <leper@wildfiregames.com>
Date: Mon, 22 Aug 2016 03:34:11 +0200
Subject: [PATCH 1/5] 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.
---
.../mods/public/maps/scripts/ConquestCommon.js | 22 ++++++++++------------
.../simulation/components/CeasefireManager.js | 18 +++++++++---------
.../mods/public/simulation/components/Damage.js | 11 ++---------
.../public/simulation/components/PlayerManager.js | 4 ----
.../simulation/components/tests/test_Damage.js | 1 -
.../mods/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 767c18c..f3eb561 100644
a
|
b
|
Trigger.prototype.ConquestHandlerOwnerShipChanged = function(msg)
|
10 | 10 | return; |
11 | 11 | |
12 | 12 | if (msg.to > 0 && this.conquestEntitiesByPlayer[msg.to]) |
13 | | this.conquestEntitiesByPlayer[msg.to].entities.push(msg.entity); |
| 13 | this.conquestEntitiesByPlayer[msg.to].push(msg.entity); |
14 | 14 | |
15 | 15 | if (!this.conquestEntitiesByPlayer[msg.from]) |
16 | 16 | { |
… |
… |
Trigger.prototype.ConquestHandlerOwnerShipChanged = function(msg)
|
19 | 19 | return; |
20 | 20 | } |
21 | 21 | |
22 | | let entities = this.conquestEntitiesByPlayer[msg.from].entities; |
| 22 | let entities = this.conquestEntitiesByPlayer[msg.from]; |
23 | 23 | let index = entities.indexOf(msg.entity); |
24 | 24 | |
25 | 25 | if (index >= 0) |
… |
… |
Trigger.prototype.ConquestAddStructure = function(msg)
|
54 | 54 | return; |
55 | 55 | } |
56 | 56 | |
57 | | if (this.conquestEntitiesByPlayer[player].entities.indexOf(msg.building) >= 0) |
| 57 | if (this.conquestEntitiesByPlayer[player].indexOf(msg.building) >= 0) |
58 | 58 | return; |
59 | 59 | |
60 | | this.conquestEntitiesByPlayer[player].entities.push(msg.building); |
| 60 | this.conquestEntitiesByPlayer[player].push(msg.building); |
61 | 61 | } |
62 | 62 | |
63 | 63 | Trigger.prototype.ConquestTrainingFinished = function(msg) |
… |
… |
Trigger.prototype.ConquestTrainingFinished = function(msg)
|
71 | 71 | warn("ConquestTrainingFinished: Unknown player " + player); |
72 | 72 | return; |
73 | 73 | } |
74 | | this.conquestEntitiesByPlayer[player].entities.push(...msg.entities); |
| 74 | this.conquestEntitiesByPlayer[player].push(...msg.entities); |
75 | 75 | }; |
76 | 76 | |
77 | 77 | Trigger.prototype.ConquestStartGameCount = function() |
… |
… |
Trigger.prototype.ConquestStartGameCount = function()
|
83 | 83 | } |
84 | 84 | |
85 | 85 | let cmpRangeManager = Engine.QueryInterface(SYSTEM_ENTITY, IID_RangeManager); |
86 | | let cmpPlayerManager = Engine.QueryInterface(SYSTEM_ENTITY, IID_PlayerManager); |
87 | | |
88 | | cmpPlayerManager.GetAllPlayerEntities().forEach((elem, i) => { |
89 | | if (i == 0) |
90 | | return; |
91 | 86 | |
| 87 | let numPlayers = Engine.QueryInterface(SYSTEM_ENTITY, IID_PlayerManager).GetNumPlayers(); |
| 88 | for (let i = 0; i < numPlayers; ++i) |
| 89 | { |
92 | 90 | let filterEntity = ent => TriggerHelper.EntityHasClass(ent, this.conquestClassFilter) |
93 | 91 | && !Engine.QueryInterface(ent, IID_Foundation); |
94 | | this.conquestEntitiesByPlayer[i] = {"player" : elem, "entities" : [...cmpRangeManager.GetEntitiesByPlayer(i).filter(filterEntity)]}; |
95 | | }); |
| 92 | this.conquestEntitiesByPlayer[i] = [...cmpRangeManager.GetEntitiesByPlayer(i).filter(filterEntity)]; |
| 93 | } |
96 | 94 | |
97 | 95 | this.conquestDataInit = true; |
98 | 96 | }; |
diff --git a/binaries/data/mods/public/simulation/components/CeasefireManager.js b/binaries/data/mods/public/simulation/components/CeasefireManager.js
index e0e9ce0..2f2e37f 100644
a
|
b
|
CeasefireManager.prototype.StartCeasefire = function(ceasefireTime)
|
69 | 69 | if (!this.ceasefireIsActive) |
70 | 70 | { |
71 | 71 | // Save diplomacy |
72 | | let playerEntities = Engine.QueryInterface(SYSTEM_ENTITY, IID_PlayerManager).GetAllPlayerEntities(); |
73 | | for (let i = 1; i < playerEntities.length; ++i) |
| 72 | let numPlayers = Engine.QueryInterface(SYSTEM_ENTITY, IID_PlayerManager).GetNumPlayers(); |
| 73 | for (let i = 1; i < numPlayers; ++i) |
74 | 74 | // Copy array with slice(), otherwise it will change |
75 | | this.diplomacyBeforeCeasefire.push(Engine.QueryInterface(playerEntities[i], IID_Player).GetDiplomacy().slice()); |
| 75 | this.diplomacyBeforeCeasefire.push(QueryPlayerIDInterface(i).GetDiplomacy().slice()); |
76 | 76 | |
77 | 77 | // Set every enemy (except gaia) to neutral |
78 | | for (let i = 1; i < playerEntities.length; ++i) |
79 | | for (let j = 1; j < playerEntities.length; ++j) |
| 78 | for (let i = 1; i < numPlayers; ++i) |
| 79 | for (let j = 1; j < numPlayers; ++j) |
80 | 80 | if (this.diplomacyBeforeCeasefire[i-1][j] < 0) |
81 | | Engine.QueryInterface(playerEntities[i], IID_Player).SetNeutral(j); |
| 81 | QueryPlayerIDInterface(i).SetNeutral(j); |
82 | 82 | } |
83 | 83 | |
84 | 84 | this.ceasefireIsActive = true; |
… |
… |
CeasefireManager.prototype.StopCeasefire = function()
|
115 | 115 | }, this.postCountdownMessageDuration); |
116 | 116 | |
117 | 117 | // Reset diplomacies to original settings |
118 | | let playerEntities = Engine.QueryInterface(SYSTEM_ENTITY, IID_PlayerManager).GetAllPlayerEntities(); |
119 | | for (let i = 1; i < playerEntities.length; ++i) |
120 | | Engine.QueryInterface(playerEntities[i], IID_Player).SetDiplomacy(this.diplomacyBeforeCeasefire[i-1]); |
| 118 | let numPlayers = Engine.QueryInterface(SYSTEM_ENTITY, IID_PlayerManager).GetNumPlayers(); |
| 119 | for (let i = 1; i < numPlayers; ++i) |
| 120 | QueryPlayerIDInterface(i).SetDiplomacy(this.diplomacyBeforeCeasefire[i-1]); |
121 | 121 | |
122 | 122 | this.ceasefireIsActive = false; |
123 | 123 | this.ceasefireTime = 0; |
diff --git a/binaries/data/mods/public/simulation/components/Damage.js b/binaries/data/mods/public/simulation/components/Damage.js
index 9756092..04d4d24 100644
a
|
b
|
Damage.prototype.CauseDamage = function(data)
|
232 | 232 | * Gets entities near a give point for given players. |
233 | 233 | * @param {Vector2D} origin - the point to check around. |
234 | 234 | * @param {number} radius - the radius around the point to check. |
235 | | * @param {number[]} [players] - the players of which we need to check entities. If players is not included, entities from all players are used. |
| 235 | * @param {number[]} players - the players of which we need to check entities. |
236 | 236 | * @return {number[]} - the id's of the entities in range of the given point. |
237 | 237 | */ |
238 | 238 | Damage.prototype.EntitiesNearPoint = function(origin, radius, players) |
239 | 239 | { |
240 | 240 | // If there is insufficient data return an empty array. |
241 | | if (!origin || !radius) |
| 241 | if (!origin || !radius || !players) |
242 | 242 | return []; |
243 | 243 | |
244 | | // If the players parameter is not specified use all players. |
245 | | if (!players) |
246 | | { |
247 | | let playerEntities = Engine.QueryInterface(SYSTEM_ENTITY, IID_PlayerManager).GetAllPlayerEntities(); |
248 | | players = playerEntities.map((ent) => Engine.QueryInterface(ent, IID_Player).GetPlayerID()); |
249 | | } |
250 | | |
251 | 244 | return Engine.QueryInterface(SYSTEM_ENTITY, IID_RangeManager).ExecuteQueryAroundPos(origin, 0, radius, players, IID_DamageReceiver); |
252 | 245 | }; |
253 | 246 | |
diff --git a/binaries/data/mods/public/simulation/components/PlayerManager.js b/binaries/data/mods/public/simulation/components/PlayerManager.js
index a9f898e..4576704 100644
a
|
b
|
PlayerManager.prototype.RemoveLastPlayer = function()
|
104 | 104 | Engine.DestroyEntity(lastId); |
105 | 105 | }; |
106 | 106 | |
107 | | PlayerManager.prototype.GetAllPlayerEntities = function() |
108 | | { |
109 | | return this.playerEntities; |
110 | | }; |
111 | 107 | 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 1715008..b5d7e26 100644
a
|
b
|
AddMock(atkPlayerEntity, IID_Player, {
|
53 | 53 | |
54 | 54 | AddMock(SYSTEM_ENTITY, IID_PlayerManager, { |
55 | 55 | GetPlayerByID: (id) => atkPlayerEntity, |
56 | | GetAllPlayerEntities: () => [attackerOwner, targetOwner], |
57 | 56 | }); |
58 | 57 | |
59 | 58 | 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 980ec65..1541946 100644
a
|
b
|
function PreInitGame()
|
11 | 11 | Engine.BroadcastMessage(MT_SkirmishReplace, {}); |
12 | 12 | Engine.FlushDestroyedEntities(); |
13 | 13 | |
14 | | let cmpPlayerManager = Engine.QueryInterface(SYSTEM_ENTITY, IID_PlayerManager); |
15 | | let playerIds = cmpPlayerManager.GetAllPlayerEntities().slice(1); // ignore gaia |
16 | | for (let playerId of playerIds) |
| 14 | let numPlayers = Engine.QueryInterface(SYSTEM_ENTITY, IID_PlayerManager).GetNumPlayers(); |
| 15 | for (let i = 1; i < numPlayers; ++i) // ignore gaia |
17 | 16 | { |
18 | | let cmpTechnologyManager = Engine.QueryInterface(playerId, IID_TechnologyManager); |
| 17 | let cmpTechnologyManager = QueryPlayerIDInterface(i, IID_TechnologyManager); |
19 | 18 | if (cmpTechnologyManager) |
20 | 19 | cmpTechnologyManager.UpdateAutoResearch(); |
21 | 20 | } |