From 083a5947e68faff5a4df45a3750d49ea2c3840a8 Mon Sep 17 00:00:00 2001 From: Angen Date: Thu, 30 Jan 2020 21:13:42 +0000 Subject: [PATCH] Do not create range query with no enemies Do not create range query with no enemies as that triggers warning in range manager. This situation occurs when player has no enemies so empty list is returned. Fixing CCmpRangeManager: No owners in query for entity 0 warning refs 38b2e37a61 Differential Revision: https://code.wildfiregames.com/D2601 Fixes: #5666 Reviewed by: @Freagarach This was SVN commit r23467. --- binaries/data/mods/public/simulation/components/UnitAI.js | 5 ++++- .../mods/public/simulation/components/tests/test_UnitAI.js | 4 ++-- binaries/data/mods/public/simulation/helpers/Attacking.js | 6 +++++- 3 files changed, 11 insertions(+), 4 deletions(-) diff --git a/binaries/data/mods/public/simulation/components/UnitAI.js b/binaries/data/mods/public/simulation/components/UnitAI.js index 3d3145bcd7..1be662b261 100644 --- a/binaries/data/mods/public/simulation/components/UnitAI.js +++ b/binaries/data/mods/public/simulation/components/UnitAI.js @@ -3581,7 +3581,10 @@ UnitAI.prototype.SetupRangeQuery = function(enable = true) // Exclude allies, and self // TODO: How to handle neutral players - Special query to attack military only? - var players = cmpPlayer.GetEnemies(); + let players = cmpPlayer.GetEnemies(); + if (!players.length) + return; + var range = this.GetQueryRange(IID_Attack); this.losRangeQuery = cmpRangeManager.CreateActiveQuery(this.entity, range.min, range.max, players, IID_Resistance, cmpRangeManager.GetEntityFlagMask("normal")); diff --git a/binaries/data/mods/public/simulation/components/tests/test_UnitAI.js b/binaries/data/mods/public/simulation/components/tests/test_UnitAI.js index 2338f52a16..3a95f9e371 100644 --- a/binaries/data/mods/public/simulation/components/tests/test_UnitAI.js +++ b/binaries/data/mods/public/simulation/components/tests/test_UnitAI.js @@ -61,7 +61,7 @@ function TestFormationExiting(mode) AddMock(playerEntity, IID_Player, { IsAlly: function() { return false; }, IsEnemy: function() { return true; }, - GetEnemies: function() { return []; }, + GetEnemies: function() { return [2]; }, }); AddMock(SYSTEM_ENTITY, IID_ObstructionManager, { @@ -219,7 +219,7 @@ function TestMoveIntoFormationWhileAttacking() AddMock(playerEntity, IID_Player, { IsAlly: function() { return false; }, IsEnemy: function() { return true; }, - GetEnemies: function() { return []; }, + GetEnemies: function() { return [2]; }, }); // create units diff --git a/binaries/data/mods/public/simulation/helpers/Attacking.js b/binaries/data/mods/public/simulation/helpers/Attacking.js index d7ae6175a2..c16d0ae625 100644 --- a/binaries/data/mods/public/simulation/helpers/Attacking.js +++ b/binaries/data/mods/public/simulation/helpers/Attacking.js @@ -303,7 +303,7 @@ Attacking.prototype.HandleAttackEffects = function(attackType, attackData, targe Attacking.prototype.EntitiesNearPoint = function(origin, radius, players) { // If there is insufficient data return an empty array. - if (!origin || !radius || !players) + if (!origin || !radius || !players || !players.length) return []; let cmpRangeManager = Engine.QueryInterface(SYSTEM_ENTITY, IID_RangeManager); @@ -312,8 +312,12 @@ Attacking.prototype.EntitiesNearPoint = function(origin, radius, players) let gaiaEntities = []; let gaiaIndex = players.indexOf(0); if (gaiaIndex !== -1) + { // splice() modifies players in-place and returns [0] gaiaEntities = gaiaEntities.concat(cmpRangeManager.ExecuteQueryAroundPos(origin, 0, radius, players.splice(gaiaIndex, 1), IID_Health)); + if (!players.length) + return gaiaEntities; + } return cmpRangeManager.ExecuteQueryAroundPos(origin, 0, radius, players, 0).concat(gaiaEntities); };