Index: binaries/data/mods/public/gui/hotkeys/spec/ingame.json =================================================================== --- binaries/data/mods/public/gui/hotkeys/spec/ingame.json +++ binaries/data/mods/public/gui/hotkeys/spec/ingame.json @@ -158,6 +158,14 @@ "session.queueunit.8": { "name": "Queue 8th unit", "desc": "Add eighth unit type to queue." + }, + "session.queueunit.autoqueueon": { + "name": "Auto-Queue On", + "desc": "Turn on Auto-Queue for selected structures." + }, + "session.queueunit.autoqueueoff": { + "name": "Auto-Queue Off", + "desc": "Turn off Auto-Queue for selected structures." } } } Index: binaries/data/mods/public/gui/session/hotkeys/training.xml =================================================================== --- binaries/data/mods/public/gui/session/hotkeys/training.xml +++ binaries/data/mods/public/gui/session/hotkeys/training.xml @@ -34,4 +34,14 @@ addTrainingByPosition(6); + + + + turnAutoQueueOn(); + + + + + turnAutoQueueOff(); + 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.production.entities; + }) + }); +} + +function turnAutoQueueOff() +{ + Engine.PostNetworkCommand({ + "type": "autoqueue-off", + "entities": g_Selection.toList().filter(ent => { + let state = GetEntityState(ent); + return state && !!state.production.entities; + }) + }); +} 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,47 @@ // This command button is always disabled. }, "allowedPlayers": ["Ally", "Observer"] - } + }, + + "autoqueue-on": { + "getInfo": function(entStates) + { + if (entStates.every(entState => !entState.production || !entState.production.entities || entState.production.autoqueue)) + return false; + return { + "tooltip": colorizeHotkey("%(hotkey)s" + " ", "session.queueunit.autoqueueon") + + translate("Turn on auto-queue for selected structures."), + "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.production || !entState.production.entities || !entState.production.autoqueue)) + return false; + return { + "tooltip": colorizeHotkey("%(hotkey)s" + " ", "session.queueunit.autoqueueoff") + + translate("Turn off auto-queue for selected structures."), + "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,12 +337,15 @@ let cmpProductionQueue = Engine.QueryInterface(ent, IID_ProductionQueue); if (cmpProductionQueue) + { ret.production = { "entities": cmpProductionQueue.GetEntitiesList(), "technologies": cmpProductionQueue.GetTechnologiesList(), "techCostMultiplier": cmpProductionQueue.GetTechCostMultiplier(), - "queue": cmpProductionQueue.GetQueue() + "queue": cmpProductionQueue.GetQueue(), + "autoqueue": cmpProductionQueue.GetEntitiesList() && cmpProductionQueue.IsAutoQueueOn() }; + } 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"]) + ""; @@ -63,6 +68,7 @@ // "timeTotal": 15000, // msecs // "timeRemaining": 10000, // msecs // } + this.autoqueue = this.template.AutoQueue == "true"; }; /* @@ -73,6 +79,30 @@ return Array.from(this.entitiesMap.values()); }; +/* + * Get current Auto-Queue status. + */ +ProductionQueue.prototype.IsAutoQueueOn = function() +{ + return this.autoqueue; +}; + +/* + * Turn on Auto-Queue. + */ +ProductionQueue.prototype.TurnAutoQueueOn = function() +{ + this.autoqueue = true; +}; + +/* + * Turn off Auto-Queue. + */ +ProductionQueue.prototype.TurnAutoQueueOff = function() +{ + this.autoqueue = false; +}; + /** * Calculate the new list of producible entities * and update any entities currently being produced. @@ -855,6 +885,8 @@ } time -= item.timeRemaining; + if (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) + { + let cmpProductionQueue = Engine.QueryInterface(ent, IID_ProductionQueue); + if (cmpProductionQueue) + cmpProductionQueue.TurnAutoQueueOn(); + } + }, + + "autoqueue-off": function(player, cmd, data) + { + for (let ent of data.entities) + { + let cmpProductionQueue = Engine.QueryInterface(ent, IID_ProductionQueue); + if (cmpProductionQueue) + cmpProductionQueue.TurnAutoQueueOff(); + } + }, + }; /**