Ticket #4161: 0001-Remove-cmpPlayerManager.GetAllPlayerEntities-which-l.patch

File 0001-Remove-cmpPlayerManager.GetAllPlayerEntities-which-l.patch, 9.2 KB (added by leper, 8 years ago)
  • binaries/data/mods/public/maps/scripts/ConquestCommon.js

    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)  
    1010        return;
    1111
    1212    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);
    1414
    1515    if (!this.conquestEntitiesByPlayer[msg.from])
    1616    {
    Trigger.prototype.ConquestHandlerOwnerShipChanged = function(msg)  
    1919        return;
    2020    }
    2121
    22     let entities = this.conquestEntitiesByPlayer[msg.from].entities;
     22    let entities = this.conquestEntitiesByPlayer[msg.from];
    2323    let index = entities.indexOf(msg.entity);
    2424
    2525    if (index >= 0)
    Trigger.prototype.ConquestAddStructure = function(msg)  
    5454        return;
    5555    }
    5656
    57     if (this.conquestEntitiesByPlayer[player].entities.indexOf(msg.building) >= 0)
     57    if (this.conquestEntitiesByPlayer[player].indexOf(msg.building) >= 0)
    5858        return;
    5959
    60     this.conquestEntitiesByPlayer[player].entities.push(msg.building);
     60    this.conquestEntitiesByPlayer[player].push(msg.building);
    6161}
    6262
    6363Trigger.prototype.ConquestTrainingFinished = function(msg)
    Trigger.prototype.ConquestTrainingFinished = function(msg)  
    7171        warn("ConquestTrainingFinished: Unknown player " + player);
    7272        return;
    7373    }
    74     this.conquestEntitiesByPlayer[player].entities.push(...msg.entities);
     74    this.conquestEntitiesByPlayer[player].push(...msg.entities);
    7575};
    7676
    7777Trigger.prototype.ConquestStartGameCount = function()
    Trigger.prototype.ConquestStartGameCount = function()  
    8383    }
    8484
    8585    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;
    9186
     87    let numPlayers = Engine.QueryInterface(SYSTEM_ENTITY, IID_PlayerManager).GetNumPlayers();
     88    for (let i = 0; i < numPlayers; ++i)
     89    {
    9290        let filterEntity = ent => TriggerHelper.EntityHasClass(ent, this.conquestClassFilter)
    9391            && !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    }
    9694
    9795    this.conquestDataInit = true;
    9896};
  • binaries/data/mods/public/simulation/components/CeasefireManager.js

    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)  
    6969    if (!this.ceasefireIsActive)
    7070    {
    7171        // 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)
    7474            // 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());
    7676
    7777        // 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)
    8080                if (this.diplomacyBeforeCeasefire[i-1][j] < 0)
    81                     Engine.QueryInterface(playerEntities[i], IID_Player).SetNeutral(j);
     81                    QueryPlayerIDInterface(i).SetNeutral(j);
    8282    }
    8383
    8484    this.ceasefireIsActive = true;
    CeasefireManager.prototype.StopCeasefire = function()  
    115115    }, this.postCountdownMessageDuration);
    116116
    117117    // 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]);
    121121
    122122    this.ceasefireIsActive = false;
    123123    this.ceasefireTime = 0;
  • binaries/data/mods/public/simulation/components/Damage.js

    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)  
    232232 * Gets entities near a give point for given players.
    233233 * @param {Vector2D} origin - the point to check around.
    234234 * @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.
    236236 * @return {number[]} - the id's of the entities in range of the given point.
    237237 */
    238238Damage.prototype.EntitiesNearPoint = function(origin, radius, players)
    239239{
    240240    // If there is insufficient data return an empty array.
    241     if (!origin || !radius)
     241    if (!origin || !radius || !players)
    242242        return [];
    243243
    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 
    251244    return Engine.QueryInterface(SYSTEM_ENTITY, IID_RangeManager).ExecuteQueryAroundPos(origin, 0, radius, players, IID_DamageReceiver);
    252245};
    253246
  • binaries/data/mods/public/simulation/components/PlayerManager.js

    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()  
    104104    Engine.DestroyEntity(lastId);
    105105};
    106106
    107 PlayerManager.prototype.GetAllPlayerEntities = function()
    108 {
    109     return this.playerEntities;
    110 };
    111107Engine.RegisterSystemComponentType(IID_PlayerManager, "PlayerManager", PlayerManager);
  • binaries/data/mods/public/simulation/components/tests/test_Damage.js

    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, {  
    5353
    5454AddMock(SYSTEM_ENTITY, IID_PlayerManager, {
    5555    GetPlayerByID: (id) => atkPlayerEntity,
    56     GetAllPlayerEntities: () => [attackerOwner, targetOwner],
    5756});
    5857
    5958AddMock(SYSTEM_ENTITY, IID_RangeManager, {
  • binaries/data/mods/public/simulation/helpers/InitGame.js

    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()  
    1111    Engine.BroadcastMessage(MT_SkirmishReplace, {});
    1212    Engine.FlushDestroyedEntities();
    1313
    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
    1716    {
    18         let cmpTechnologyManager = Engine.QueryInterface(playerId, IID_TechnologyManager);
     17        let cmpTechnologyManager = QueryPlayerIDInterface(i, IID_TechnologyManager);
    1918        if (cmpTechnologyManager)
    2019            cmpTechnologyManager.UpdateAutoResearch();
    2120    }