Index: ps/trunk/binaries/data/mods/public/simulation/ai/common-api/entity.js =================================================================== --- ps/trunk/binaries/data/mods/public/simulation/ai/common-api/entity.js +++ ps/trunk/binaries/data/mods/public/simulation/ai/common-api/entity.js @@ -743,6 +743,10 @@ return undefined; }, + "garrisonHolderID": function() { + return this._entity.garrisonHolderID; + }, + "garrisoned": function() { return this._entity.garrisoned; }, "garrisonedSlots": function() { Index: ps/trunk/binaries/data/mods/public/simulation/ai/petra/headquarters.js =================================================================== --- ps/trunk/binaries/data/mods/public/simulation/ai/petra/headquarters.js +++ ps/trunk/binaries/data/mods/public/simulation/ai/petra/headquarters.js @@ -398,8 +398,7 @@ if (!ent.position()) { // we are autogarrisoned, check that the holder is registered in the garrisonManager - let holderId = ent.unitAIOrderData()[0].target; - let holder = gameState.getEntityById(holderId); + let holder = gameState.getEntityById(ent.garrisonHolderID()); if (holder) this.garrisonManager.registerHolder(gameState, holder); } Index: ps/trunk/binaries/data/mods/public/simulation/components/AIProxy.js =================================================================== --- ps/trunk/binaries/data/mods/public/simulation/components/AIProxy.js +++ ps/trunk/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.garrisonHolderID = msg.holderID; +}; + AIProxy.prototype.OnCapturePointsChanged = function(msg) { if (!this.NotifyChange()) @@ -327,6 +334,13 @@ ret.garrisoned = cmpGarrisonHolder.GetEntities(); } + let cmpGarrisonable = Engine.QueryInterface(this.entity, IID_Garrisonable); + if (cmpGarrisonable) + { + // Updated by OnGarrisonedStateChanged + ret.garrisonHolderID = cmpGarrisonable.HolderID(); + } + let cmpTerritoryDecay = Engine.QueryInterface(this.entity, IID_TerritoryDecay); if (cmpTerritoryDecay) ret.decaying = cmpTerritoryDecay.IsDecaying(); Index: ps/trunk/binaries/data/mods/public/simulation/components/Garrisonable.js =================================================================== --- ps/trunk/binaries/data/mods/public/simulation/components/Garrisonable.js +++ ps/trunk/binaries/data/mods/public/simulation/components/Garrisonable.js @@ -88,6 +88,10 @@ if (cmpPosition) cmpPosition.MoveOutOfWorld(); + Engine.PostMessage(this.entity, MT_GarrisonedStateChanged, { + "holderID": target + }); + if (renamed) return true; @@ -161,6 +165,10 @@ if (cmpAura && cmpAura.HasGarrisonAura()) cmpAura.RemoveGarrisonAura(this.holder); + Engine.PostMessage(this.entity, MT_GarrisonedStateChanged, { + "holderID": INVALID_ENTITY + }); + if (renamed) return true; Index: ps/trunk/binaries/data/mods/public/simulation/components/interfaces/Garrisonable.js =================================================================== --- ps/trunk/binaries/data/mods/public/simulation/components/interfaces/Garrisonable.js +++ ps/trunk/binaries/data/mods/public/simulation/components/interfaces/Garrisonable.js @@ -1 +1,7 @@ Engine.RegisterInterface("Garrisonable"); + +/** + * Message of the form { "holderID": number } + * sent from the Garrisonable component whenever the garrisoned state changes. + */ +Engine.RegisterMessageType("GarrisonedStateChanged");