diff --git a/binaries/data/mods/public/simulation/components/Foundation.js b/binaries/data/mods/public/simulation/components/Foundation.js index c465e38218..d05b4a9b57 100644 --- a/binaries/data/mods/public/simulation/components/Foundation.js +++ b/binaries/data/mods/public/simulation/components/Foundation.js @@ -457,6 +457,15 @@ Foundation.prototype.Build = function(builderEnt, work) { "entity": this.entity, "newentity": building }); Engine.PostMessage(this.entity, MT_EntityRenamed, { "entity": this.entity, "newentity": building }); + // Inform the builders that repairing has finished. + // This not done by listening to a global message due to performance. + for (let builder of this.GetBuilders()) + { + let cmpUnitAIBuilder = Engine.QueryInterface(builder, IID_UnitAI); + if (cmpUnitAIBuilder) + cmpUnitAIBuilder.ConstructionFinished({ "entity": this.entity, "newentity": building }); + } + Engine.DestroyEntity(this.entity); } }; diff --git a/binaries/data/mods/public/simulation/components/Repairable.js b/binaries/data/mods/public/simulation/components/Repairable.js index 3d98f1f350..86b05bde19 100644 --- a/binaries/data/mods/public/simulation/components/Repairable.js +++ b/binaries/data/mods/public/simulation/components/Repairable.js @@ -129,7 +129,18 @@ Repairable.prototype.Repair = function(builderEnt, rate) // If we repaired all the damage, send a message to entities to stop repairing this building if (amount >= damage) + { Engine.PostMessage(this.entity, MT_ConstructionFinished, { "entity": this.entity, "newentity": this.entity }); + + // Inform the builders that repairing has finished. + // This not done by listening to a global message due to performance. + for (let builder of this.GetBuilders()) + { + let cmpUnitAIBuilder = Engine.QueryInterface(builder, IID_UnitAI); + if (cmpUnitAIBuilder) + cmpUnitAIBuilder.ConstructionFinished({ "entity": this.entity, "newentity": this.entity }); + } + } }; Repairable.prototype.GetRepairRate = function() diff --git a/binaries/data/mods/public/simulation/components/UnitAI.js b/binaries/data/mods/public/simulation/components/UnitAI.js index 4c08d7be30..47aa6b0071 100644 --- a/binaries/data/mods/public/simulation/components/UnitAI.js +++ b/binaries/data/mods/public/simulation/components/UnitAI.js @@ -2857,7 +2857,7 @@ UnitAI.prototype.UnitFsmSpec = { { // The building was already finished/fully repaired before we arrived; // let the ConstructionFinished handler handle this. - this.OnGlobalConstructionFinished({"entity": this.repairTarget, "newentity": this.repairTarget}); + this.ConstructionFinished({ "entity": this.repairTarget, "newentity": this.repairTarget }); return true; } @@ -4191,12 +4191,14 @@ UnitAI.prototype.OnMotionUpdate = function(msg) this.UnitFsm.ProcessMessage(this, Object.assign({ "type": "MovementUpdate" }, msg)); }; -UnitAI.prototype.OnGlobalConstructionFinished = function(msg) +/** + * Called directly by cmpFoundation and cmpRepairable to + * inform builders that repairing has finished. + * This not done by listening to a global message due to performance. + */ +UnitAI.prototype.ConstructionFinished = function(msg) { - // TODO: This is a bit inefficient since every unit listens to every - // construction message - ideally we could scope it to only the one we're building - - this.UnitFsm.ProcessMessage(this, {"type": "ConstructionFinished", "data": msg}); + this.UnitFsm.ProcessMessage(this, { "type": "ConstructionFinished", "data": msg }); }; UnitAI.prototype.OnGlobalEntityRenamed = function(msg) diff --git a/binaries/data/mods/public/simulation/components/tests/test_Foundation.js b/binaries/data/mods/public/simulation/components/tests/test_Foundation.js index c5d723148b..3085ecee03 100644 --- a/binaries/data/mods/public/simulation/components/tests/test_Foundation.js +++ b/binaries/data/mods/public/simulation/components/tests/test_Foundation.js @@ -10,6 +10,7 @@ Engine.LoadComponentScript("interfaces/StatisticsTracker.js"); Engine.LoadComponentScript("interfaces/TerritoryDecay.js"); Engine.LoadComponentScript("interfaces/Trigger.js"); Engine.LoadComponentScript("interfaces/Timer.js"); +Engine.LoadComponentScript("interfaces/UnitAI.js"); Engine.LoadComponentScript("AutoBuildable.js"); Engine.LoadComponentScript("Foundation.js"); Engine.LoadComponentScript("Timer.js");