Index: binaries/data/mods/public/gui/session/selection_panels_helpers.js =================================================================== --- binaries/data/mods/public/gui/session/selection_panels_helpers.js +++ binaries/data/mods/public/gui/session/selection_panels_helpers.js @@ -546,3 +546,25 @@ }) }); } + +function turnAutoQueueOn() +{ + Engine.PostNetworkCommand({ + "type": "autoqueue-on", + "entities": g_Selection.toList().filter(ent => { + let state = GetEntityState(ent); + return state && !!state.isproducingunits; + }) + }); +} + +function turnAutoQueueOff() +{ + Engine.PostNetworkCommand({ + "type": "autoqueue-off", + "entities": g_Selection.toList().filter(ent => { + let state = GetEntityState(ent); + return state && !!state.isproducingunits; + }) + }); +} 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 @@ -1715,7 +1715,45 @@ // This command button is always disabled. }, "allowedPlayers": ["Ally", "Observer"] - } + }, + + "autoqueue-on": { + "getInfo": function(entStates) + { + if (entStates.every(entState => !entState.isproducingunits || entState.autoqueue)) + return false; + return { + "tooltip": translate("Turn on auto-queue for selected buildings."), + "icon": "autoqueue-on.png", + "enabled": true + }; + }, + "execute": function(entStates) + { + if (entStates.length) + turnAutoQueueOn(entStates.map(entState => entState.id)); + }, + "allowedPlayers": ["Player"] + }, + + "autoqueue-off": { + "getInfo": function(entStates) + { + if (entStates.every(entState => !entState.isproducingunits || !entState.autoqueue)) + return false; + return { + "tooltip": translate("Turn off auto-queue for selected buildings."), + "icon": "autoqueue-off.png", + "enabled": true + }; + }, + "execute": function(entStates) + { + if (entStates.length) + turnAutoQueueOff(entStates.map(entState => entState.id)); + }, + "allowedPlayers": ["Player"] + }, }; function playerCheck(entState, targetState, validPlayers) 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 @@ -337,6 +337,7 @@ let cmpProductionQueue = Engine.QueryInterface(ent, IID_ProductionQueue); if (cmpProductionQueue) + { ret.production = { "entities": cmpProductionQueue.GetEntitiesList(), "technologies": cmpProductionQueue.GetTechnologiesList(), @@ -343,6 +344,12 @@ "techCostMultiplier": cmpProductionQueue.GetTechCostMultiplier(), "queue": cmpProductionQueue.GetQueue() }; + if (ret.production.entities.length) + { + ret.isproducingunits = ret.production.entities.length > 0; + ret.autoqueue = cmpProductionQueue.GetAutoQueue(); + } + } let cmpTrader = Engine.QueryInterface(ent, IID_Trader); if (cmpTrader) Index: binaries/data/mods/public/simulation/components/ProductionQueue.js =================================================================== --- binaries/data/mods/public/simulation/components/ProductionQueue.js +++ binaries/data/mods/public/simulation/components/ProductionQueue.js @@ -27,6 +27,11 @@ "" + "" + "" + + "" + + "" + + "" + + "" + + "" + "" + Resources.BuildSchema("nonNegativeDecimal", ["time"]) + ""; @@ -73,6 +78,32 @@ return Array.from(this.entitiesMap.values()); }; +/* + * Get current Auto-Queue status. + */ +ProductionQueue.prototype.GetAutoQueue = function() +{ + return this.autoqueue; +}; + +/* + * Turn on Auto-Queue. + */ +ProductionQueue.prototype.TurnAutoQueueOn = function() +{ + this.autoqueue = true; + return this.autoqueue; +}; + +/* + * Turn off Auto-Queue. + */ +ProductionQueue.prototype.TurnAutoQueueOff = function() +{ + this.autoqueue = false; + return this.autoqueue; +}; + /** * Calculate the new list of producible entities * and update any entities currently being produced. @@ -855,6 +886,7 @@ } time -= item.timeRemaining; + item.unitTemplate && this.autoqueue && this.AddItem(item.unitTemplate, "unit", item.count, item.metadata); this.queue.shift(); Engine.PostMessage(this.entity, MT_ProductionQueueChanged, null); } Index: binaries/data/mods/public/simulation/helpers/Commands.js =================================================================== --- binaries/data/mods/public/simulation/helpers/Commands.js +++ binaries/data/mods/public/simulation/helpers/Commands.js @@ -877,6 +877,27 @@ cmpResourceDropsite.SetSharing(cmd.shared); } }, + + "autoqueue-on": function(player, cmd, data) + { + for (let ent of data.entities) + { + var cmpProductionQueue = Engine.QueryInterface(ent, IID_ProductionQueue); + if (cmpProductionQueue) + cmpProductionQueue.TurnAutoQueueOn(); + } + }, + + "autoqueue-off": function(player, cmd, data) + { + for (let ent of data.entities) + { + var cmpProductionQueue = Engine.QueryInterface(ent, IID_ProductionQueue); + if (cmpProductionQueue) + cmpProductionQueue.TurnAutoQueueOff(); + } + }, + }; /**