From 93fe2ffa8a8e49c582e3a8df5e595f6696b64538 Mon Sep 17 00:00:00 2001 From: Freagarach Date: Tue, 16 Mar 2021 05:49:36 +0000 Subject: [PATCH] Handle aura and production pause on GarrisonedStateChanged message. This reduces hard-coupling between the components. Refs. #6081 Differential revision: D3683 Reviewed by: @wraitii This was SVN commit r25062. --- .../mods/public/simulation/components/Auras.js | 11 +++++++++++ .../simulation/components/Garrisonable.js | 18 ++---------------- .../simulation/components/ProductionQueue.js | 8 ++++++++ .../components/tests/test_Garrisonable.js | 2 -- .../components/tests/test_Garrisoning.js | 2 -- 5 files changed, 21 insertions(+), 20 deletions(-) diff --git a/binaries/data/mods/public/simulation/components/Auras.js b/binaries/data/mods/public/simulation/components/Auras.js index c30f297ec6..4804b9ba58 100644 --- a/binaries/data/mods/public/simulation/components/Auras.js +++ b/binaries/data/mods/public/simulation/components/Auras.js @@ -505,4 +505,15 @@ Auras.prototype.OnGlobalPlayerDefeated = function(msg) this.Clean(); }; +Auras.prototype.OnGarrisonedStateChanged = function(msg) +{ + if (!this.HasGarrisonAura()) + return; + + if (msg.holderID != INVALID_ENTITY) + this.ApplyGarrisonAura(msg.holderID); + if (msg.olderHolder != INVALID_ENTITY) + this.RemoveGarrisonAura(msg.oldHolder); +}; + Engine.RegisterComponentType(IID_Auras, "Auras", Auras); diff --git a/binaries/data/mods/public/simulation/components/Garrisonable.js b/binaries/data/mods/public/simulation/components/Garrisonable.js index 9f45bacf95..21bf79697a 100644 --- a/binaries/data/mods/public/simulation/components/Garrisonable.js +++ b/binaries/data/mods/public/simulation/components/Garrisonable.js @@ -76,19 +76,12 @@ Garrisonable.prototype.Garrison = function(target, renamed = false) if (cmpUnitAI) cmpUnitAI.SetGarrisoned(); - let cmpProductionQueue = Engine.QueryInterface(this.entity, IID_ProductionQueue); - if (cmpProductionQueue) - cmpProductionQueue.PauseProduction(); - - let cmpAura = Engine.QueryInterface(this.entity, IID_Auras); - if (cmpAura && cmpAura.HasGarrisonAura()) - cmpAura.ApplyGarrisonAura(target); - let cmpPosition = Engine.QueryInterface(this.entity, IID_Position); if (cmpPosition) cmpPosition.MoveOutOfWorld(); Engine.PostMessage(this.entity, MT_GarrisonedStateChanged, { + "oldHolder": INVALID_ENTITY, "holderID": target }); @@ -157,15 +150,8 @@ Garrisonable.prototype.UnGarrison = function(forced = false, renamed = false) cmpUnitAI.UnsetGarrisoned(); } - let cmpProductionQueue = Engine.QueryInterface(this.entity, IID_ProductionQueue); - if (cmpProductionQueue) - cmpProductionQueue.UnpauseProduction(); - - let cmpAura = Engine.QueryInterface(this.entity, IID_Auras); - if (cmpAura && cmpAura.HasGarrisonAura()) - cmpAura.RemoveGarrisonAura(this.holder); - Engine.PostMessage(this.entity, MT_GarrisonedStateChanged, { + "oldHolder": this.holder, "holderID": INVALID_ENTITY }); diff --git a/binaries/data/mods/public/simulation/components/ProductionQueue.js b/binaries/data/mods/public/simulation/components/ProductionQueue.js index 1a92991d12..2c6dfa8165 100644 --- a/binaries/data/mods/public/simulation/components/ProductionQueue.js +++ b/binaries/data/mods/public/simulation/components/ProductionQueue.js @@ -967,4 +967,12 @@ ProductionQueue.prototype.OnDisabledTemplatesChanged = function(msg) this.CalculateEntitiesMap(); }; +ProductionQueue.prototype.OnGarrisonedStateChanged = function(msg) +{ + if (msg.holderID != INVALID_ENTITY) + this.PauseProduction(); + else + this.UnpauseProduction(); +}; + Engine.RegisterComponentType(IID_ProductionQueue, "ProductionQueue", ProductionQueue); diff --git a/binaries/data/mods/public/simulation/components/tests/test_Garrisonable.js b/binaries/data/mods/public/simulation/components/tests/test_Garrisonable.js index 1cc4317038..f36a5d75b3 100644 --- a/binaries/data/mods/public/simulation/components/tests/test_Garrisonable.js +++ b/binaries/data/mods/public/simulation/components/tests/test_Garrisonable.js @@ -1,7 +1,5 @@ -Engine.LoadComponentScript("interfaces/Auras.js"); Engine.LoadComponentScript("interfaces/Garrisonable.js"); Engine.LoadComponentScript("interfaces/GarrisonHolder.js"); -Engine.LoadComponentScript("interfaces/ProductionQueue.js"); Engine.LoadComponentScript("interfaces/UnitAI.js"); Engine.LoadComponentScript("Garrisonable.js"); diff --git a/binaries/data/mods/public/simulation/components/tests/test_Garrisoning.js b/binaries/data/mods/public/simulation/components/tests/test_Garrisoning.js index 3277607414..e3a5fb3a45 100644 --- a/binaries/data/mods/public/simulation/components/tests/test_Garrisoning.js +++ b/binaries/data/mods/public/simulation/components/tests/test_Garrisoning.js @@ -1,11 +1,9 @@ Engine.LoadHelperScript("ValueModification.js"); Engine.LoadHelperScript("Player.js"); -Engine.LoadComponentScript("interfaces/Auras.js"); Engine.LoadComponentScript("interfaces/Garrisonable.js"); Engine.LoadComponentScript("interfaces/GarrisonHolder.js"); Engine.LoadComponentScript("interfaces/Health.js"); Engine.LoadComponentScript("interfaces/ModifiersManager.js"); -Engine.LoadComponentScript("interfaces/ProductionQueue.js"); Engine.LoadComponentScript("interfaces/Timer.js"); Engine.LoadComponentScript("interfaces/TurretHolder.js"); Engine.LoadComponentScript("interfaces/UnitAI.js");