1
0
forked from mirrors/0ad

Do not let every entity with UnitAI listen to "OnGlobalConstructionFinished".

All entities with UnitAI wastefully listened to global
ConstructionFinished messages. Now the message is only sent to assigned
builders.

Differential Revision: D2697
Reviewed by: @wraitii.
This was SVN commit r23924.
This commit is contained in:
Freagarach
2020-08-03 10:13:54 +00:00
parent 7bf1bf3f66
commit 88dc6d8e1e
4 changed files with 29 additions and 6 deletions
@@ -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);
}
};
@@ -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()
@@ -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)
@@ -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");