Index: binaries/data/mods/public/simulation/ai/common-api/entity.js =================================================================== --- binaries/data/mods/public/simulation/ai/common-api/entity.js +++ binaries/data/mods/public/simulation/ai/common-api/entity.js @@ -743,6 +743,12 @@ return undefined; }, + "garrisonHolder": function() { + if (this._entity.garrisonHolder == INVALID_ENTITY) + return undefined; + return this._entity.garrisonHolder; + }, + "garrisoned": function() { return this._entity.garrisoned; }, "garrisonedSlots": function() { Index: binaries/data/mods/public/simulation/ai/petra/garrisonManager.js =================================================================== --- binaries/data/mods/public/simulation/ai/petra/garrisonManager.js +++ binaries/data/mods/public/simulation/ai/petra/garrisonManager.js @@ -94,7 +94,7 @@ } else { - if (ent.unitAIOrderData().some(order => order.target && order.target == id)) + if (ent.unitAIOrderData().some(order => order.target && order.target == id))//? continue; if (ent.getMetadata(PlayerID, "garrisonHolder") == id) { Index: binaries/data/mods/public/simulation/ai/petra/headquarters.js =================================================================== --- binaries/data/mods/public/simulation/ai/petra/headquarters.js +++ binaries/data/mods/public/simulation/ai/petra/headquarters.js @@ -398,7 +398,7 @@ if (!ent.position()) { // we are autogarrisoned, check that the holder is registered in the garrisonManager - let holderId = ent.unitAIOrderData()[0].target; + let holderId = ent.garrisonHolder(); let holder = gameState.getEntityById(holderId); if (holder) this.garrisonManager.registerHolder(gameState, holder); Index: binaries/data/mods/public/simulation/components/AIProxy.js =================================================================== --- binaries/data/mods/public/simulation/components/AIProxy.js +++ binaries/data/mods/public/simulation/components/AIProxy.js @@ -106,6 +106,13 @@ this.changes.hitpoints = msg.to; }; +AIProxy.prototype.OnGarrisonedStateChanged = function(msg) +{ + if (!this.NotifyChange()) + return; + this.changes.garrisonHolder = msg.holder; +}; + AIProxy.prototype.OnCapturePointsChanged = function(msg) { if (!this.NotifyChange()) Index: binaries/data/mods/public/simulation/components/Garrisonable.js =================================================================== --- binaries/data/mods/public/simulation/components/Garrisonable.js +++ binaries/data/mods/public/simulation/components/Garrisonable.js @@ -84,6 +84,10 @@ if (cmpPosition) cmpPosition.MoveOutOfWorld(); + Engine.PostMessage(this.entity, MT_GarrisonedStateChanged, { + "holder": entity + }); + if (renamed) return true; @@ -154,6 +158,10 @@ if (cmpAura && cmpAura.HasGarrisonAura()) cmpAura.RemoveGarrisonAura(this.holder); + Engine.PostMessage(this.entity, MT_GarrisonedStateChanged, { + "holder": INVALID_ENTITY + }); + if (renamed) return true; Index: binaries/data/mods/public/simulation/components/interfaces/Garrisonable.js =================================================================== --- binaries/data/mods/public/simulation/components/interfaces/Garrisonable.js +++ binaries/data/mods/public/simulation/components/interfaces/Garrisonable.js @@ -1 +1,7 @@ Engine.RegisterInterface("Garrisonable"); + +/** + * Message of the form { "holder": number } + * sent from the Garrisonable component whenever the garrisoned state changes. + */ +Engine.RegisterMessageType("GarrisonedStateChanged");