From 0171a58f26c68999fe55cd4ff195a57353a556a8 Mon Sep 17 00:00:00 2001 From: Atrik Date: Sun, 12 Apr 2026 08:16:32 +0200 Subject: [PATCH] Handle empty Auras reference in checkrefs --- .../public/simulation/components/Auras.js | 30 +++++++++---------- source/tools/entity/checkrefs.py | 13 ++++---- 2 files changed, 22 insertions(+), 21 deletions(-) diff --git a/binaries/data/mods/public/simulation/components/Auras.js b/binaries/data/mods/public/simulation/components/Auras.js index 9c0501acec..960c8a8d87 100644 --- a/binaries/data/mods/public/simulation/components/Auras.js +++ b/binaries/data/mods/public/simulation/components/Auras.js @@ -84,14 +84,9 @@ Auras.prototype.GetRangeOverlays = function() { const rangeOverlays = []; - // Check if this is a preview entity - const cmpVisibility = Engine.QueryInterface(this.entity, IID_Visibility); - const isPreview = cmpVisibility && cmpVisibility.GetPreview && cmpVisibility.GetPreview(); - for (const name of this.GetAuraNames()) { - // For preview entities, show auras even if isApplied is false - if (!this.IsRangeAura(name) || (!isPreview && !this[name].isApplied)) + if (!this.IsRangeAura(name) || !this.AreTechnologyRequirementsMet(name)) continue; const rangeOverlay = AuraTemplates.Get(name).rangeOverlay; @@ -144,22 +139,27 @@ Auras.prototype.CalculateAffectedPlayers = function(name) } }; -Auras.prototype.CanApply = function(name) +Auras.prototype.AreTechnologyRequirementsMet = function(name) { - // Check if this is a preview entity via Visibility component - // If it is, then we don't apply the aura - const cmpVisibility = Engine.QueryInterface(this.entity, IID_Visibility); - if (cmpVisibility && cmpVisibility.GetPreview && cmpVisibility.GetPreview()) - return false; - - if (!AuraTemplates.Get(name).requiredTechnology) + const aura = AuraTemplates.Get(name); + if (!aura || !aura.requiredTechnology) return true; const cmpTechnologyManager = QueryOwnerInterface(this.entity, IID_TechnologyManager); if (!cmpTechnologyManager) return false; - return cmpTechnologyManager.IsTechnologyResearched(AuraTemplates.Get(name).requiredTechnology); + return cmpTechnologyManager.IsTechnologyResearched(aura.requiredTechnology); +}; + +Auras.prototype.CanApply = function(name) +{ + // Check if this is a preview entity + const cmpVisibility = Engine.QueryInterface(this.entity, IID_Visibility); + if (cmpVisibility && cmpVisibility.GetPreview && cmpVisibility.GetPreview()) + return false; + + return this.AreTechnologyRequirementsMet(name); }; Auras.prototype.HasFormationAura = function() diff --git a/source/tools/entity/checkrefs.py b/source/tools/entity/checkrefs.py index 3c801b4d03..c9591f0d88 100755 --- a/source/tools/entity/checkrefs.py +++ b/source/tools/entity/checkrefs.py @@ -432,12 +432,13 @@ class CheckRefs: cmp_auras = entity.find("Auras") if cmp_auras is not None: aura_string = cmp_auras.text - for aura in aura_string.split(): - if not aura: - continue - if aura.startswith("-"): - continue - self.deps.append((fp, Path(f"simulation/data/auras/{aura}.json"))) + if aura_string: + for aura in aura_string.split(): + if not aura: + continue + if aura.startswith("-"): + continue + self.deps.append((fp, Path(f"simulation/data/auras/{aura}.json"))) cmp_identity = entity.find("Identity") if cmp_identity is not None: