Index: binaries/data/mods/public/gui/session/unit_actions.js =================================================================== --- binaries/data/mods/public/gui/session/unit_actions.js +++ binaries/data/mods/public/gui/session/unit_actions.js @@ -630,7 +630,7 @@ }, "getActionInfo": function(entState, targetState) { - if (!entState.canGarrison || !targetState.garrisonHolder || + if (!entState.garrisonable || !targetState.garrisonHolder || !playerCheck(entState, targetState, ["Player", "MutualAlly"])) return false; Index: binaries/data/mods/public/simulation/components/GarrisonHolder.js =================================================================== --- binaries/data/mods/public/simulation/components/GarrisonHolder.js +++ binaries/data/mods/public/simulation/components/GarrisonHolder.js @@ -268,6 +268,10 @@ if (cmpAura && cmpAura.HasGarrisonAura()) cmpAura.ApplyGarrisonAura(this.entity); + let cmpGarrisonable = Engine.QueryInterface(entity, IID_Garrisonable); + if (cmpGarrisonable) + cmpGarrisonable.SetGarrisonHolder(this.entity); + Engine.PostMessage(this.entity, MT_GarrisonedUnitsChanged, { "added": [entity], "removed": [] }); return true; }; @@ -345,6 +349,10 @@ if (cmpPosition) cmpEntPosition.SetYRotation(cmpPosition.GetPosition().horizAngleTo(pos)); + let cmpGarrisonable = Engine.QueryInterface(entity, IID_Garrisonable); + if (cmpGarrisonable) + cmpGarrisonable.SetGarrisonHolder(INVALID_ENTITY); + Engine.PostMessage(this.entity, MT_GarrisonedUnitsChanged, { "added": [], "removed": [entity] }); return true; 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 @@ -4,8 +4,25 @@ Garrisonable.prototype.Init = function() { + this.garrisonHolder = INVALID_ENTITY; }; -Garrisonable.prototype.Serialize = null; +/** + * What the garrisonholder is, where this entity is garrisoned in. + * @return {number} The entity ID of the entity this entity is garrisoned in. + */ +Garrisonable.prototype.GetGarrisonHolder = function() +{ + return this.garrisonHolder; +}; + +/** + * Sets the garrisonholder, where this entity is garrisoned in. + * @param {number} entity - The entity ID of the entity this entity is garrisoned in. + */ +Garrisonable.prototype.SetGarrisonHolder = function(entity) +{ + this.garrisonHolder = entity || INVALID_ENTITY; +}; Engine.RegisterComponentType(IID_Garrisonable, "Garrisonable", Garrisonable); Index: binaries/data/mods/public/simulation/components/GuiInterface.js =================================================================== --- binaries/data/mods/public/simulation/components/GuiInterface.js +++ binaries/data/mods/public/simulation/components/GuiInterface.js @@ -363,7 +363,11 @@ "garrisonedEntitiesCount": cmpGarrisonHolder.GetGarrisonedEntitiesCount() }; - ret.canGarrison = !!Engine.QueryInterface(ent, IID_Garrisonable); + let cmpGarrisonable = Engine.QueryInterface(ent, IID_Garrisonable); + if (cmpGarrisonable) + ret.garrisonable = { + "garrisonHolder": cmpGarrisonable.GetGarrisonHolder() + }; let cmpUnitAI = Engine.QueryInterface(ent, IID_UnitAI); if (cmpUnitAI) Index: binaries/data/mods/public/simulation/components/UnitAI.js =================================================================== --- binaries/data/mods/public/simulation/components/UnitAI.js +++ binaries/data/mods/public/simulation/components/UnitAI.js @@ -3314,13 +3314,8 @@ UnitAI.prototype.GetGarrisonHolder = function() { - if (this.IsGarrisoned()) - { - for (let order of this.orderQueue) - if (order.type == "Garrison") - return order.data.target; - } - return INVALID_ENTITY; + let cmpGarrisonable = Engine.QueryInterface(this.entity, IID_Garrisonable) + return cmpGarrisonable ? cmpGarrisonable.GetGarrisonHolder() : INVALID_ENTITY; }; UnitAI.prototype.ShouldRespondToEndOfAlert = function() Index: binaries/data/mods/public/simulation/components/tests/test_GarrisonHolder.js =================================================================== --- binaries/data/mods/public/simulation/components/tests/test_GarrisonHolder.js +++ binaries/data/mods/public/simulation/components/tests/test_GarrisonHolder.js @@ -72,7 +72,9 @@ "GetOwner": () => friendlyPlayer }); - AddMock(i, IID_Garrisonable, {}); + AddMock(i, IID_Garrisonable, { + "SetGarrisonHolder": entity => {} + }); AddMock(i, IID_Position, { "GetHeightOffset": () => 0, Index: binaries/data/mods/public/simulation/components/tests/test_GuiInterface.js =================================================================== --- binaries/data/mods/public/simulation/components/tests/test_GuiInterface.js +++ binaries/data/mods/public/simulation/components/tests/test_GuiInterface.js @@ -581,7 +581,6 @@ "needsRepair": false, "needsHeal": true, "builder": true, - "canGarrison": false, "visibility": "visible", "isBarterMarket":true, "resourceTrickle": {