From 2f1d143dc2dd4bd3ed59e4f8e9d07a08b7403aa5 Mon Sep 17 00:00:00 2001 From: mimo Date: Sun, 24 Aug 2014 11:51:03 +0000 Subject: [PATCH] give possibility to choose type of targets in moveAttack, fixes #2740 This was SVN commit r15671. --- binaries/data/config/default.cfg | 1 + .../mods/public/gui/session/unit_actions.js | 7 ++- .../public/simulation/ai/common-api/entity.js | 4 +- .../ai/common-api/entitycollection.js | 4 +- .../public/simulation/components/UnitAI.js | 43 ++++++++++++------- .../public/simulation/helpers/Commands.js | 2 +- 6 files changed, 40 insertions(+), 21 deletions(-) diff --git a/binaries/data/config/default.cfg b/binaries/data/config/default.cfg index 48eda558fa..89465ff673 100644 --- a/binaries/data/config/default.cfg +++ b/binaries/data/config/default.cfg @@ -278,6 +278,7 @@ hotkey.session.kill = Delete ; Destroy selected units hotkey.session.stop = "H" ; Stop the current action hotkey.session.attack = "Ctrl+Alt" ; Modifier to force attack instead of another action hotkey.session.attackmove = Ctrl ; Modifier to attackmove when clicking on a point +hotkey.session.attackmoveUnit = "Ctrl+Q" ; Modifier to attackmove targeting only units when clicking on a point hotkey.session.garrison = Ctrl ; Modifier to garrison when clicking on building hotkey.session.autorallypoint = Ctrl ; Modifier to set the rally point on the building itself hotkey.session.guard = "G" ; Modifier to escort/guard when clicking on unit/building diff --git a/binaries/data/mods/public/gui/session/unit_actions.js b/binaries/data/mods/public/gui/session/unit_actions.js index 1dab22c78e..adf1449963 100644 --- a/binaries/data/mods/public/gui/session/unit_actions.js +++ b/binaries/data/mods/public/gui/session/unit_actions.js @@ -60,7 +60,12 @@ var unitActions = { "execute": function(target, action, selection, queued) { - Engine.PostNetworkCommand({"type": "attack-walk", "entities": selection, "x": target.x, "z": target.z, "queued": queued}); + if (Engine.HotkeyIsPressed("session.attackmoveUnit")) + var targetClasses = { "attack": ["Unit"] }; + else + var targetClasses = { "attack": ["Unit", "Structure"] }; + + Engine.PostNetworkCommand({"type": "attack-walk", "entities": selection, "x": target.x, "z": target.z, "targetClasses": targetClasses, "queued": queued}); Engine.GuiInterfaceCall("PlaySound", { "name": "order_walk", "entity": selection[0] }); return true; }, diff --git a/binaries/data/mods/public/simulation/ai/common-api/entity.js b/binaries/data/mods/public/simulation/ai/common-api/entity.js index 814128dcf0..cc7d1b6c4e 100644 --- a/binaries/data/mods/public/simulation/ai/common-api/entity.js +++ b/binaries/data/mods/public/simulation/ai/common-api/entity.js @@ -720,9 +720,9 @@ m.Entity = m.Class({ return this; }, - attackMove: function(x, z, queued) { + attackMove: function(x, z, targetClasses, queued) { queued = queued || false; - Engine.PostCommand(PlayerID,{"type": "attack-walk", "entities": [this.id()], "x": x, "z": z, "queued": queued }); + Engine.PostCommand(PlayerID,{"type": "attack-walk", "entities": [this.id()], "x": x, "z": z, "targetClasses": targetClasses, "queued": queued }); return this; }, diff --git a/binaries/data/mods/public/simulation/ai/common-api/entitycollection.js b/binaries/data/mods/public/simulation/ai/common-api/entitycollection.js index 1ce23a4bf2..a885f99d87 100644 --- a/binaries/data/mods/public/simulation/ai/common-api/entitycollection.js +++ b/binaries/data/mods/public/simulation/ai/common-api/entitycollection.js @@ -228,10 +228,10 @@ m.EntityCollection.prototype.move = function(x, z, queued) return this; }; -m.EntityCollection.prototype.attackMove = function(x, z, queued) +m.EntityCollection.prototype.attackMove = function(x, z, targetClasses, queued) { queued = queued || false; - Engine.PostCommand(PlayerID,{"type": "attack-walk", "entities": this.toIdArray(), "x": x, "z": z, "queued": queued}); + Engine.PostCommand(PlayerID,{"type": "attack-walk", "entities": this.toIdArray(), "x": x, "z": z, "targetClasses": targetClasses, "queued": queued}); return this; }; diff --git a/binaries/data/mods/public/simulation/components/UnitAI.js b/binaries/data/mods/public/simulation/components/UnitAI.js index 22e1190467..256a6e3437 100644 --- a/binaries/data/mods/public/simulation/components/UnitAI.js +++ b/binaries/data/mods/public/simulation/components/UnitAI.js @@ -4920,10 +4920,11 @@ UnitAI.prototype.WalkToTarget = function(target, queued) /** * Adds walk-and-fight order to queue, this only occurs in response * to a player order, and so is forced. + * If targetClasses is given, only entities matching the targetClasses can be attacked. */ -UnitAI.prototype.WalkAndFight = function(x, z, queued) +UnitAI.prototype.WalkAndFight = function(x, z, targetClasses, queued) { - this.AddOrder("WalkAndFight", { "x": x, "z": z, "force": true }, queued); + this.AddOrder("WalkAndFight", { "x": x, "z": z, "targetClasses": targetClasses, "force": true }, queued); }; /** @@ -5328,29 +5329,41 @@ UnitAI.prototype.FindWalkAndFightTargets = function() var cmpFormation = Engine.QueryInterface(this.entity, IID_Formation); for each (var ent in cmpFormation.members) { - if (!(cmpUnitAI = Engine.QueryInterface(ent, IID_UnitAI))) + if (!(cmpUnitAI = Engine.QueryInterface(ent, IID_UnitAI))) continue; var targets = cmpUnitAI.GetTargetsFromUnit(); - for each (var targ in targets) + for (var targ of targets) { - if (cmpUnitAI.CanAttack(targ)) - { - this.PushOrderFront("Attack", { "target": targ, "force": true }); - return true; - } + if (!cmpUnitAI.CanAttack(targ)) + continue; + var cmpIdentity = Engine.QueryInterface(targ, IID_Identity); + if (cmpIdentity && this.order.data.targetClasses.attack + && !MatchesClassList(cmpIdentity.GetClassesList(), this.order.data.targetClasses.attack)) + continue; + if (cmpIdentity && this.order.data.targetClasses.avoid + && MatchesClassList(cmpIdentity.GetClassesList(), this.order.data.targetClasses.avoid)) + continue; + this.PushOrderFront("Attack", { "target": targ, "force": true }); + return true; } } return false; } var targets = this.GetTargetsFromUnit(); - for each (var targ in targets) + for (var targ of targets) { - if (this.CanAttack(targ)) - { - this.PushOrderFront("Attack", { "target": targ, "force": true }); - return true; - } + if (!this.CanAttack(targ)) + continue; + var cmpIdentity = Engine.QueryInterface(targ, IID_Identity); + if (cmpIdentity && this.order.data.targetClasses.attack + && !MatchesClassList(cmpIdentity.GetClassesList(), this.order.data.targetClasses.attack)) + continue; + if (cmpIdentity && this.order.data.targetClasses.avoid + && MatchesClassList(cmpIdentity.GetClassesList(), this.order.data.targetClasses.avoid)) + continue; + this.PushOrderFront("Attack", { "target": targ, "force": true }); + return true; } return false; }; diff --git a/binaries/data/mods/public/simulation/helpers/Commands.js b/binaries/data/mods/public/simulation/helpers/Commands.js index 90e28c5d59..d046b3549c 100644 --- a/binaries/data/mods/public/simulation/helpers/Commands.js +++ b/binaries/data/mods/public/simulation/helpers/Commands.js @@ -130,7 +130,7 @@ var commands = { "attack-walk": function(player, cmd, data) { GetFormationUnitAIs(data.entities, player).forEach(function(cmpUnitAI) { - cmpUnitAI.WalkAndFight(cmd.x, cmd.z, cmd.queued); + cmpUnitAI.WalkAndFight(cmd.x, cmd.z, cmd.targetClasses, cmd.queued); }); },