From 63490763922496ce988bdc041c6325b0a3342284 Mon Sep 17 00:00:00 2001 From: Alex Dcnh <140754794+Wishmaster117@users.noreply.github.com> Date: Mon, 27 Apr 2026 20:37:43 +0200 Subject: [PATCH 1/4] Add bridge-based RTI and pull control commands ## Summary This PR continues the chatless MultiBot migration by adding bridge-based combat control features around RTI targeting and pull preparation. ### Added - Added bridge-side support for safe combat command execution through `RUN~COMBAT`. - Added an allowlist for supported combat commands: - `co +focus` / `co -focus` - `co +dps assist` / `co -dps assist` - `co +tank assist` / `co -tank assist` - `co +aoe` / `co -aoe` - `co +wait for attack` / `co -wait for attack` - `wait for attack time X` - Added `COMBAT_ACK` responses for bridge command execution. - Added RTI-related command support through the bridge. - Added per-bot combat controls in the everybar. - Added a first Pull Control UI entry point for: - selected bot / party / raid scope - wait time - focus - DPS assist - AoE - RTI pull / attack actions - Added locale entries for the new combat and pull-control tooltips. ### Notes - Manual whisper commands such as `who`, `co ?`, `nc ?`, and `ss ?` remain untouched and functional. - No changes are made to `mod-playerbots`. - This PR focuses on removing UI-driven chat spam while keeping manual diagnostic commands available. - Pull Control UI layout is functional but may still receive visual polish in a follow-up PR. ## Testing - Verified that the addon sends `RUN~COMBAT` messages through the bridge. - Verified bridge RX logs for combat commands. - Verified per-bot combat command dispatch from the everybar. - Confirmed RTI/pull control work is now bridge-oriented instead of chat-parse-oriented. --- Core/MultiBotComm.lua | 33 +++ Core/MultiBotEvery.lua | 76 ++++++ Locales/MultiBotAceLocale-enGB.lua | 27 ++ Locales/MultiBotAceLocale-enUS.lua | 27 ++ Locales/MultiBotAceLocale-frFR.lua | 27 ++ UI/MultiBotMainUI.lua | 419 ++++++++++++++++++++++++++++- 6 files changed, 606 insertions(+), 3 deletions(-) diff --git a/Core/MultiBotComm.lua b/Core/MultiBotComm.lua index 59b9c6e..0e558e9 100644 --- a/Core/MultiBotComm.lua +++ b/Core/MultiBotComm.lua @@ -118,6 +118,7 @@ local function ensureBridgeState() state.glyphSeq = state.glyphSeq or 0 state.glyphActive = state.glyphActive or nil state.rtiSeq = state.rtiSeq or 0 + state.combatSeq = state.combatSeq or 0 return state end @@ -269,6 +270,31 @@ function Comm.RunRtiCommand(scope, target, command) return Comm.Send("RUN", "RTI~" .. scope .. "~" .. urlEncodeField(target) .. "~" .. token .. "~" .. urlEncodeField(command)) end +function Comm.RunCombatCommand(scope, target, command) + local state = ensureBridgeState() + + if not state.connected then + return false + end + + command = trim(command or "") + if command == "" then + return false + end + + scope = string.upper(trim(scope or "BOT")) + target = trim(target or "") + + if scope ~= "ALL" and scope ~= "GROUP" and scope ~= "BOT" then + return false + end + + state.combatSeq = (tonumber(state.combatSeq) or 0) + 1 + local token = tostring(math.floor(safeNow() * 1000)) .. "-" .. tostring(state.combatSeq) + + return Comm.Send("RUN", "COMBAT~" .. scope .. "~" .. urlEncodeField(target) .. "~" .. token .. "~" .. urlEncodeField(command)) +end + function Comm.RequestOutfits(name) local state = ensureBridgeState() name = trim(name) @@ -1615,6 +1641,13 @@ function Comm.HandleAddonMessage(prefix, message, distribution, sender) return true end + if opcode == "COMBAT_ACK" then + state.connected = true + state.lastError = nil + debugPrint("ADDON:RX", "COMBAT_ACK", payload or "") + return true + end + if opcode == "ERR" then state.lastError = payload debugPrint("ADDON:RX", "ERR", payload or "") diff --git a/Core/MultiBotEvery.lua b/Core/MultiBotEvery.lua index affc5ee..6cf3d6c 100644 --- a/Core/MultiBotEvery.lua +++ b/Core/MultiBotEvery.lua @@ -16,6 +16,64 @@ if not StaticPopupDialogs["MULTIBOT_AUTOGEAR_CONFIRM"] then } end +local function showEveryMessage(message) + if DEFAULT_CHAT_FRAME and DEFAULT_CHAT_FRAME.AddMessage then + DEFAULT_CHAT_FRAME:AddMessage("|cff33ff99MultiBot|r " .. tostring(message or "")) + elseif print then + print("MultiBot " .. tostring(message or "")) + end +end + +local function runBotCombatCommand(button, command) + if not button or type(command) ~= "string" or command == "" then + return false + end + + local botName = button.getName and button.getName() or "" + if botName == "" then + return false + end + + local comm = MultiBot and MultiBot.Comm or nil + if comm and comm.RunCombatCommand and comm.RunCombatCommand("BOT", botName, command) then + return true + end + + showEveryMessage(MultiBot.L("tips.every.combatbridge", "Bridge unavailable: combat command was not sent.")) + return false +end + +local function runBotCombatToggle(button, enableCommand, disableCommand) + if not button then + return + end + + if button.state then + if runBotCombatCommand(button, disableCommand) then + button.setDisable() + end + elseif runBotCombatCommand(button, enableCommand) then + button.setEnable() + end +end + +local function addBotCombatButton(parent, name, x, y, icon, tip, enableCommand, disableCommand) + local button = parent.addButton(name, x, y, icon, tip) + + if disableCommand then + button.setDisable() + button.doLeft = function(self) + runBotCombatToggle(self, enableCommand, disableCommand) + end + else + button.doLeft = function(self) + runBotCombatCommand(self, enableCommand) + end + end + + return button +end + MultiBot.addEvery = function(pFrame, pCombat, pNormal) -- MENU MISC -------------------------------------------- @@ -171,6 +229,24 @@ MultiBot.addEvery = function(pFrame, pCombat, pNormal) MultiBot.BuildBotRTIUI(pFrame, botName, 394, 0) end + local combatFrame = pFrame.addFrame("CombatCommands", 424, 29, nil, 58, 114) + combatFrame:Hide() + combatFrame._mbDropdownManaged = true + + pFrame.addButton("Combat", 424, 0, "Ability_Warrior_BattleShout", MultiBot.L("tips.every.combat")) + .doLeft = function() + MultiBot.ShowHideSwitch(combatFrame) + end + + addBotCombatButton(combatFrame, "CombatFocus", -28, 84, "Ability_Hunter_MasterMarksman", MultiBot.L("tips.every.combatfocus"), "co +focus", "co -focus") + addBotCombatButton(combatFrame, "CombatAoe", 0, 84, "Spell_Fire_SelfDestruct", MultiBot.L("tips.every.combataoe"), "co +aoe", "co -aoe") + addBotCombatButton(combatFrame, "CombatDpsAssist", -28, 56, "Ability_Hunter_Assassinate2", MultiBot.L("tips.every.combatdpsassist"), "co +dps assist", "co -dps assist") + addBotCombatButton(combatFrame, "CombatTankAssist", 0, 56, "Ability_Warrior_DefensiveStance", MultiBot.L("tips.every.combattankassist"), "co +tank assist", "co -tank assist") + addBotCombatButton(combatFrame, "CombatWait0", -28, 28, "Spell_Holy_BorrowedTime", MultiBot.L("tips.every.combatwait0"), "wait for attack time 0") + addBotCombatButton(combatFrame, "CombatWait3", 0, 28, "Spell_Holy_BorrowedTime", MultiBot.L("tips.every.combatwait3"), "wait for attack time 3") + addBotCombatButton(combatFrame, "CombatWait5", -28, 0, "Spell_Holy_BorrowedTime", MultiBot.L("tips.every.combatwait5"), "wait for attack time 5") + addBotCombatButton(combatFrame, "CombatWait10", 0, 0, "Spell_Holy_BorrowedTime", MultiBot.L("tips.every.combatwait10"), "wait for attack time 10") + pFrame.addButton("Spellbook", 274, 0, "inv_misc_book_09", MultiBot.L("tips.every.spellbook")).setDisable() .doLeft = function(pButton) if(pButton.state) then diff --git a/Locales/MultiBotAceLocale-enGB.lua b/Locales/MultiBotAceLocale-enGB.lua index 3c82ce9..a0ac2ef 100644 --- a/Locales/MultiBotAceLocale-enGB.lua +++ b/Locales/MultiBotAceLocale-enGB.lua @@ -661,6 +661,33 @@ local enGBValues = { ["tips.every.talent"] = "Talent|cffffffff\nOpens or closes this Bot's Talents window.\nThere is a time delay as the system loads the Bot's Talents data before opening the Talents window.|r\n\n|cffff0000Left-click to activate|r\n|cff999999(Executed by: Bot)|r", ["tips.every.wipe"] = "Wipe|cffffffff\nFully resets a Bot by killing it and resurrecting it.\nUseful in clearing its state (position, health, mana, etc.).|r\n\n|cffff0000Left-click: sends the wipe command to the selected Bot|r\n|cff999999(Executed by: Bot)|r", ["tips.every.settalent"] = "Set Talents|cffffffff\nDisplays a menu of available specialisations (PvE/PvP) for the selected Bot.\nSecondary specialisation unlocks at level 40.|r\n\n|cffff0000Left-click to toggle the Bot's talent template selector|r\n|cff999999(Executed by: Bot)|r", + ["tips.every.combat"] = "Combat|cffffffff\nOpens combat strategy and timing commands for this Bot.|r\n|cffff0000Left-click to open or close|r\n|cff999999(Executed by: Bot)|r", + ["tips.every.combatfocus"] = "Focus strategy|cffffffff\nToggles co +focus / co -focus for this Bot.|r\n|cffff0000Left-click to toggle|r\n|cff999999(Executed by: Bot)|r", + ["tips.every.combataoe"] = "AoE strategy|cffffffff\nToggles co +aoe / co -aoe for this Bot.|r\n|cffff0000Left-click to toggle|r\n|cff999999(Executed by: Bot)|r", + ["tips.every.combatdpsassist"] = "DPS assist strategy|cffffffff\nToggles co +dps assist / co -dps assist for this Bot.|r\n|cffff0000Left-click to toggle|r\n|cff999999(Executed by: Bot)|r", + ["tips.every.combattankassist"] = "Tank assist strategy|cffffffff\nToggles co +tank assist / co -tank assist for this Bot.|r\n|cffff0000Left-click to toggle|r\n|cff999999(Executed by: Bot)|r", + ["tips.every.combatwait0"] = "Wait for attack: 0 sec|cffffffff\nSends wait for attack time 0 to this Bot.|r\n|cffff0000Left-click to send|r\n|cff999999(Executed by: Bot)|r", + ["tips.every.combatwait3"] = "Wait for attack: 3 sec|cffffffff\nSends wait for attack time 3 to this Bot.|r\n|cffff0000Left-click to send|r\n|cff999999(Executed by: Bot)|r", + ["tips.every.combatwait5"] = "Wait for attack: 5 sec|cffffffff\nSends wait for attack time 5 to this Bot.|r\n|cffff0000Left-click to send|r\n|cff999999(Executed by: Bot)|r", + ["tips.every.combatwait10"] = "Wait for attack: 10 sec|cffffffff\nSends wait for attack time 10 to this Bot.|r\n|cffff0000Left-click to send|r\n|cff999999(Executed by: Bot)|r", + ["tips.main.pullcontrol"] = "Pull Control|cffffffff\nOpen bridge-based pull and combat controls.|r", + ["tips.main.pullscopebot"] = "Scope: selected bot|cffffffff\nCommands are sent only to the currently selected bot.|r", + ["tips.main.pullscopegroup"] = "Scope: group|cffffffff\nCommands are sent to grouped bots.|r", + ["tips.main.pullscopeall"] = "Scope: raid/all|cffffffff\nCommands are sent to all available bots.|r", + ["tips.main.pullwait"] = "Wait strategy|cffffffff\nToggles co +wait for attack / co -wait for attack and applies the selected wait time.|r", + ["tips.main.pullfocus"] = "Focus strategy|cffffffff\nToggles co +focus / co -focus.|r", + ["tips.main.pulldpsassist"] = "DPS Assist|cffffffff\nToggles co +dps assist / co -dps assist.|r", + ["tips.main.pullaoe"] = "AoE|cffffffff\nToggles co +aoe / co -aoe.|r", + ["tips.main.pullpresetsingle"] = "Single Target preset|cffffffff\nDisables AoE and enables DPS assist.|r", + ["tips.main.pullpresetaoe"] = "AoE Pack preset|cffffffff\nEnables AoE and DPS assist.|r", + ["tips.main.pullpresetsafe"] = "Safe Pull preset|cffffffff\nEnables focus, DPS assist and wait for attack.|r", + ["tips.main.pullpresetreset"] = "Reset combat preset|cffffffff\nDisables focus, DPS assist, AoE, tank assist and wait for attack.|r", + ["tips.main.pullrti"] = "Pull RTI Target|cffffffff\nSends pull rti target through the bridge.|r", + ["tips.main.attackrti"] = "Attack RTI Target|cffffffff\nSends attack rti target through the bridge.|r", + ["tips.main.pullwaittime"] = "Apply wait time|cffffffff\nSends wait for attack time using the slider value.|r", + ["info.pullcontrol.no_selected_bot"] = "Select a bot first for Selected scope.", + ["info.pullcontrol.bridge"] = "Combat bridge is not connected.", + ["tips.every.combatbridge"] = "Bridge unavailable: combat command was not sent.", ["tips.spec.dkbloodpve"] = "Blood – PvE|cffffffff\nFocused on self-healing and survivability in PvE.\nSecondary spec unlocked at level 40.|r\n\n|cffff0000Left-click to set as primary spec|r\n|cffff0000Right-click to set as secondary spec|r\n|cff999999(Executed by: Bot)|r", ["tips.spec.dkbloodpvp"] = "Blood – PvP|cffffffff\nIdeal for flag control and durability in PvP.\nSecondary spec unlocked at level 40.|r\n\n|cffff0000Left-click to set as primary spec|r\n|cffff0000Right-click to set as secondary spec|r\n|cff999999(Executed by: Bot)|r", ["tips.spec.dkbfrostpve"] = "Frost – PvE|cffffffff\nOptimised for burst damage and slows in PvE.\nSecondary spec unlocked at level 40.|r\n\n|cffff0000Left-click to set as primary spec|r\n|cffff0000Right-click to set as secondary spec|r\n|cff999999(Executed by: Bot)|r", diff --git a/Locales/MultiBotAceLocale-enUS.lua b/Locales/MultiBotAceLocale-enUS.lua index 2bfa1a2..03a04b2 100644 --- a/Locales/MultiBotAceLocale-enUS.lua +++ b/Locales/MultiBotAceLocale-enUS.lua @@ -661,6 +661,33 @@ local enUSValues = { ["tips.every.talent"] = "Talent|cffffffff\nOpens or closes this Bot's Talents window.\nThere is a time delay as the system loads the Bot's Talents data before opening the Talents window.|r\n\n|cffff0000Left-click to activate|r\n|cff999999(Executed by: Bot)|r", ["tips.every.wipe"] = "Wipe|cffffffff\nFully resets a Bot by killing it and resurrecting it.\nUseful in clearing its state (position, health, mana, etc.).|r\n\n|cffff0000Left-click: sends the wipe command to the selected Bot|r\n|cff999999(Executed by: Bot)|r", ["tips.every.settalent"] = "Set Talents|cffffffff\nDisplays a menu of available specializations (PvE/PvP) for the selected Bot.\nSecondary specialization unlocks at level 40.|r\n\n|cffff0000Left-click to toggle the Bot's talent template selector|r\n|cff999999(Executed by: Bot)|r", + ["tips.every.combat"] = "Combat|cffffffff\nOpens combat strategy and timing commands for this Bot.|r\n|cffff0000Left-click to open or close|r\n|cff999999(Executed by: Bot)|r", + ["tips.every.combatfocus"] = "Focus strategy|cffffffff\nToggles co +focus / co -focus for this Bot.|r\n|cffff0000Left-click to toggle|r\n|cff999999(Executed by: Bot)|r", + ["tips.every.combataoe"] = "AoE strategy|cffffffff\nToggles co +aoe / co -aoe for this Bot.|r\n|cffff0000Left-click to toggle|r\n|cff999999(Executed by: Bot)|r", + ["tips.every.combatdpsassist"] = "DPS assist strategy|cffffffff\nToggles co +dps assist / co -dps assist for this Bot.|r\n|cffff0000Left-click to toggle|r\n|cff999999(Executed by: Bot)|r", + ["tips.every.combattankassist"] = "Tank assist strategy|cffffffff\nToggles co +tank assist / co -tank assist for this Bot.|r\n|cffff0000Left-click to toggle|r\n|cff999999(Executed by: Bot)|r", + ["tips.every.combatwait0"] = "Wait for attack: 0 sec|cffffffff\nSends wait for attack time 0 to this Bot.|r\n|cffff0000Left-click to send|r\n|cff999999(Executed by: Bot)|r", + ["tips.every.combatwait3"] = "Wait for attack: 3 sec|cffffffff\nSends wait for attack time 3 to this Bot.|r\n|cffff0000Left-click to send|r\n|cff999999(Executed by: Bot)|r", + ["tips.every.combatwait5"] = "Wait for attack: 5 sec|cffffffff\nSends wait for attack time 5 to this Bot.|r\n|cffff0000Left-click to send|r\n|cff999999(Executed by: Bot)|r", + ["tips.every.combatwait10"] = "Wait for attack: 10 sec|cffffffff\nSends wait for attack time 10 to this Bot.|r\n|cffff0000Left-click to send|r\n|cff999999(Executed by: Bot)|r", + ["tips.main.pullcontrol"] = "Pull Control|cffffffff\nOpen bridge-based pull and combat controls.|r", + ["tips.main.pullscopebot"] = "Scope: selected bot|cffffffff\nCommands are sent only to the currently selected bot.|r", + ["tips.main.pullscopegroup"] = "Scope: group|cffffffff\nCommands are sent to grouped bots.|r", + ["tips.main.pullscopeall"] = "Scope: raid/all|cffffffff\nCommands are sent to all available bots.|r", + ["tips.main.pullwait"] = "Wait strategy|cffffffff\nToggles co +wait for attack / co -wait for attack and applies the selected wait time.|r", + ["tips.main.pullfocus"] = "Focus strategy|cffffffff\nToggles co +focus / co -focus.|r", + ["tips.main.pulldpsassist"] = "DPS Assist|cffffffff\nToggles co +dps assist / co -dps assist.|r", + ["tips.main.pullaoe"] = "AoE|cffffffff\nToggles co +aoe / co -aoe.|r", + ["tips.main.pullpresetsingle"] = "Single Target preset|cffffffff\nDisables AoE and enables DPS assist.|r", + ["tips.main.pullpresetaoe"] = "AoE Pack preset|cffffffff\nEnables AoE and DPS assist.|r", + ["tips.main.pullpresetsafe"] = "Safe Pull preset|cffffffff\nEnables focus, DPS assist and wait for attack.|r", + ["tips.main.pullpresetreset"] = "Reset combat preset|cffffffff\nDisables focus, DPS assist, AoE, tank assist and wait for attack.|r", + ["tips.main.pullrti"] = "Pull RTI Target|cffffffff\nSends pull rti target through the bridge.|r", + ["tips.main.attackrti"] = "Attack RTI Target|cffffffff\nSends attack rti target through the bridge.|r", + ["tips.main.pullwaittime"] = "Apply wait time|cffffffff\nSends wait for attack time using the slider value.|r", + ["info.pullcontrol.no_selected_bot"] = "Select a bot first for Selected scope.", + ["info.pullcontrol.bridge"] = "Combat bridge is not connected.", + ["tips.every.combatbridge"] = "Bridge unavailable: combat command was not sent.", ["tips.spec.dkbloodpve"] = "Blood – PvE|cffffffff\nFocused on self-healing and survivability in PvE.\nSecondary spec unlocked at level 40.|r\n\n|cffff0000Left-click to set as primary spec|r\n|cffff0000Right-click to set as secondary spec|r\n|cff999999(Executed by: Bot)|r", ["tips.spec.dkbloodpvp"] = "Blood – PvP|cffffffff\nIdeal for flag control and durability in PvP.\nSecondary spec unlocked at level 40.|r\n\n|cffff0000Left-click to set as primary spec|r\n|cffff0000Right-click to set as secondary spec|r\n|cff999999(Executed by: Bot)|r", ["tips.spec.dkbfrostpve"] = "Frost – PvE|cffffffff\nOptimized for burst damage and slows in PvE.\nSecondary spec unlocked at level 40.|r\n\n|cffff0000Left-click to set as primary spec|r\n|cffff0000Right-click to set as secondary spec|r\n|cff999999(Executed by: Bot)|r", diff --git a/Locales/MultiBotAceLocale-frFR.lua b/Locales/MultiBotAceLocale-frFR.lua index 7ab96e1..a3b1963 100644 --- a/Locales/MultiBotAceLocale-frFR.lua +++ b/Locales/MultiBotAceLocale-frFR.lua @@ -659,6 +659,33 @@ local frFRValues = { ["tips.every.talent"] = "Talent|cffffffff\nOuvre ou ferme les talents de ce Bot.\nCela s'ouvre avec un délai pendant que le système charge les valeurs des talents.|r\n\n|cffff0000Clic gauche pour ouvrir ou fermer les talents|r\n|cff999999(Ordre d'exécution : Bot)|r", ["tips.every.wipe"] = "Wipe|cffffffff\nRéinitialise complètement le bot en le faisant mourir puis ressusciter,\nutile pour débloquer son état (position, vie, mana, etc.).|r\n\n|cffff0000Clic gauche : envoie la commande wipe au bot sélectionné|r\n|cff999999(Ordre d'exécution : Bot)|r", ["tips.every.settalent"] = "Sélection des talents|cffffffff\nAffiche un menu des spécialisations disponibles (PvE/PvP) pour le bot sélectionné.\nLa spécialisation secondaire se débloque au niveau 40.|r\n\n|cffff0000Clic gauche pour afficher/masquer le sélecteur de modèles de talents du bot|r\n|cff999999(Ordre d'exécution : Bot)|r", + ["tips.every.combat"] = "Combat|cffffffff\nOuvre les commandes de stratégie et de temporisation de combat de ce bot.|r\n|cffff0000Clic gauche pour ouvrir ou fermer|r\n|cff999999(Ordre d'exécution : Bot)|r", + ["tips.every.combatfocus"] = "Stratégie Focus|cffffffff\nActive ou désactive co +focus / co -focus pour ce bot.|r\n|cffff0000Clic gauche pour basculer|r\n|cff999999(Ordre d'exécution : Bot)|r", + ["tips.every.combataoe"] = "Stratégie AoE|cffffffff\nActive ou désactive co +aoe / co -aoe pour ce bot.|r\n|cffff0000Clic gauche pour basculer|r\n|cff999999(Ordre d'exécution : Bot)|r", + ["tips.every.combatdpsassist"] = "Stratégie DPS Assist|cffffffff\nActive ou désactive co +dps assist / co -dps assist pour ce bot.|r\n|cffff0000Clic gauche pour basculer|r\n|cff999999(Ordre d'exécution : Bot)|r", + ["tips.every.combattankassist"] = "Stratégie Tank Assist|cffffffff\nActive ou désactive co +tank assist / co -tank assist pour ce bot.|r\n|cffff0000Clic gauche pour basculer|r\n|cff999999(Ordre d'exécution : Bot)|r", + ["tips.every.combatwait0"] = "Wait for attack : 0 sec|cffffffff\nEnvoie wait for attack time 0 à ce bot.|r\n|cffff0000Clic gauche pour envoyer|r\n|cff999999(Ordre d'exécution : Bot)|r", + ["tips.every.combatwait3"] = "Wait for attack : 3 sec|cffffffff\nEnvoie wait for attack time 3 à ce bot.|r\n|cffff0000Clic gauche pour envoyer|r\n|cff999999(Ordre d'exécution : Bot)|r", + ["tips.every.combatwait5"] = "Wait for attack : 5 sec|cffffffff\nEnvoie wait for attack time 5 à ce bot.|r\n|cffff0000Clic gauche pour envoyer|r\n|cff999999(Ordre d'exécution : Bot)|r", + ["tips.every.combatwait10"] = "Wait for attack : 10 sec|cffffffff\nEnvoie wait for attack time 10 à ce bot.|r\n|cffff0000Clic gauche pour envoyer|r\n|cff999999(Ordre d'exécution : Bot)|r", + ["tips.main.pullcontrol"] = "Pull Control|cffffffff\nOuvre les contrôles de pull et de combat via la bridge.|r", + ["tips.main.pullscopebot"] = "Scope : bot sélectionné|cffffffff\nLes commandes sont envoyées uniquement au bot actuellement sélectionné.|r", + ["tips.main.pullscopegroup"] = "Scope : groupe|cffffffff\nLes commandes sont envoyées aux bots groupés.|r", + ["tips.main.pullscopeall"] = "Scope : raid/tous|cffffffff\nLes commandes sont envoyées à tous les bots disponibles.|r", + ["tips.main.pullwait"] = "Stratégie Wait|cffffffff\nActive ou désactive co +wait for attack / co -wait for attack et applique le délai choisi.|r", + ["tips.main.pullfocus"] = "Stratégie Focus|cffffffff\nActive ou désactive co +focus / co -focus.|r", + ["tips.main.pulldpsassist"] = "DPS Assist|cffffffff\nActive ou désactive co +dps assist / co -dps assist.|r", + ["tips.main.pullaoe"] = "AoE|cffffffff\nActive ou désactive co +aoe / co -aoe.|r", + ["tips.main.pullpresetsingle"] = "Preset Single Target|cffffffff\nDésactive l'AoE et active DPS assist.|r", + ["tips.main.pullpresetaoe"] = "Preset AoE Pack|cffffffff\nActive l'AoE et DPS assist.|r", + ["tips.main.pullpresetsafe"] = "Preset Safe Pull|cffffffff\nActive focus, DPS assist et wait for attack.|r", + ["tips.main.pullpresetreset"] = "Reset combat|cffffffff\nDésactive focus, DPS assist, AoE, tank assist et wait for attack.|r", + ["tips.main.pullrti"] = "Pull RTI Target|cffffffff\nEnvoie pull rti target via la bridge.|r", + ["tips.main.attackrti"] = "Attack RTI Target|cffffffff\nEnvoie attack rti target via la bridge.|r", + ["tips.main.pullwaittime"] = "Appliquer le délai|cffffffff\nEnvoie wait for attack time avec la valeur du slider.|r", + ["info.pullcontrol.no_selected_bot"] = "Sélectionne d'abord un bot pour le scope Selected.", + ["info.pullcontrol.bridge"] = "La bridge combat n'est pas connectée.", + ["tips.every.combatbridge"] = "Bridge indisponible : la commande de combat n'a pas été envoyée.", ["tips.spec.dkbloodpve"] = "Sang – PvE|cffffffff\nSpécialisation axée sur l’auto-soin et la survie en environnement PvE.\nSecondaire débloquée au niveau 40.|r\n\n|cffff0000Clic gauche : définir comme spé principale|r\n|cffff0000Clic droit : définir comme spé secondaire|r\n|cff999999(Ordre d’exécution : Bot)|r", ["tips.spec.dkbloodpvp"] = "Sang – PvP|cffffffff\nIdéale pour le contrôle de drapeau et la résistance en JcJ.\nSecondaire débloquée au niveau 40.|r\n\n|cffff0000Clic gauche : définir comme spé principale|r\n|cffff0000Clic droit : définir comme spé secondaire|r\n|cff999999(Ordre d’exécution : Bot)|r", ["tips.spec.dkbfrostpve"] = "Givre – PvE|cffffffff\nOptimisée pour burst et ralentissements en PvE.\nSecondaire débloquée au niveau 40.|r\n\n|cffff0000Clic gauche : définir comme spé principale|r\n|cffff0000Clic droit : définir comme spé secondaire|r\n|cff999999(Ordre d’exécution : Bot)|r", diff --git a/UI/MultiBotMainUI.lua b/UI/MultiBotMainUI.lua index 3360118..7e4822b 100644 --- a/UI/MultiBotMainUI.lua +++ b/UI/MultiBotMainUI.lua @@ -333,6 +333,391 @@ local function createMainActionButton(mainFrame, definition) return button end +local function showPullControlError(key) + if UIErrorsFrame then + UIErrorsFrame:AddMessage(MultiBot.L(key), 1, 0.25, 0.25, 1) + end +end + +local function setPullControlButtonState(button, enabled) + if not button then + return + end + + button.state = enabled and true or false + button.mbActive = button.state + + if button.setEnable and button.setDisable then + if button.state then + button.setEnable() + else + button.setDisable() + end + return + end + + if button.icon and button.icon.SetDesaturated then + button.icon:SetDesaturated(not button.state) + end + + if button.border then + if button.state then + button.border:Show() + else + button.border:Hide() + end + end +end + +local function resolvePullControlScope(frame) + local scope = frame and frame._mbPullScope or "BOT" + local target = "" + + if scope == "BOT" then + target = UnitName("target") or "" + + if target == "" or target == UnitName("player") then + showPullControlError("info.pullcontrol.no_selected_bot") + return nil, nil + end + end + + return scope, target +end + +local function runPullControlCombatCommands(frame, commands) + local scope, target = resolvePullControlScope(frame) + if not scope then + return false + end + + local comm = MultiBot.Comm + if not comm or not comm.RunCombatCommand then + showPullControlError("info.pullcontrol.bridge") + return false + end + + local sent = false + + for _, command in ipairs(commands or {}) do + if comm.RunCombatCommand(scope, target, command) then + sent = true + end + end + + if not sent then + showPullControlError("info.pullcontrol.bridge") + end + + return sent +end + +local function runPullControlRtiCommand(frame, command) + local scope, target = resolvePullControlScope(frame) + if not scope then + return false + end + + local comm = MultiBot.Comm + if not comm or not comm.RunRtiCommand then + showPullControlError("info.pullcontrol.bridge") + return false + end + + if comm.RunRtiCommand(scope, target, command) then + return true + end + + showPullControlError("info.pullcontrol.bridge") + return false +end + +local function pullControlTooltip(owner, key) + if not owner or not GameTooltip then + return + end + + GameTooltip:SetOwner(owner, "ANCHOR_RIGHT") + GameTooltip:SetText(MultiBot.L(key), 1, 1, 1, true) + GameTooltip:Show() +end + +local function createPullControlIcon(frame, name, x, y, icon, tipKey, onLeft) + local button = CreateFrame("Button", nil, frame) + button:SetWidth(28) + button:SetHeight(28) + button:SetPoint("TOPLEFT", frame, "TOPLEFT", x, y) + button:RegisterForClicks("LeftButtonDown") + button:SetHighlightTexture("Interface\\Buttons\\ButtonHilight-Square", "ADD") + button:SetPushedTexture("Interface\\Buttons\\UI-Quickslot-Depress") + button.tipKey = tipKey + button.state = false + + button.icon = button:CreateTexture(nil, "BACKGROUND") + button.icon:SetTexture(MultiBot.SafeTexturePath(icon)) + button.icon:SetAllPoints(button) + if button.icon.SetTexCoord then + button.icon:SetTexCoord(0.08, 0.92, 0.08, 0.92) + end + + button.border = button:CreateTexture(nil, "ARTWORK") + button.border:SetTexture("Interface\\AddOns\\MultiBot\\Icons\\border.blp") + button.border:SetPoint("CENTER", button, "CENTER", 0, 0) + button.border:SetWidth(34) + button.border:SetHeight(34) + button.border:Hide() + + button:SetScript("OnEnter", function(self) + pullControlTooltip(self, self.tipKey) + end) + button:SetScript("OnLeave", function() + if GameTooltip then + GameTooltip:Hide() + end + end) + button:SetScript("OnClick", function(self) + if type(onLeft) == "function" then + onLeft(self) + end + end) + + frame.buttons[name] = button + return button +end + +local function createPullControlScopeButton(frame, name, x, text, tipKey, scope) + local button = CreateFrame("Button", "MultiBotPullControl" .. name, frame, "UIPanelButtonTemplate") + button:SetWidth(66) + button:SetHeight(20) + button:SetPoint("TOPLEFT", frame, "TOPLEFT", x, -28) + button:SetText(text) + button.tipKey = tipKey + button.scope = scope + + button:SetScript("OnEnter", function(self) + pullControlTooltip(self, self.tipKey) + end) + button:SetScript("OnLeave", function() + if GameTooltip then + GameTooltip:Hide() + end + end) + button:SetScript("OnClick", function(self) + frame._mbPullScope = self.scope + + for _, scopeButton in pairs(frame.scopeButtons) do + scopeButton:SetButtonState(scopeButton == self and "PUSHED" or "NORMAL", scopeButton == self) + end + end) + + frame.scopeButtons[name] = button + return button +end + +local function updatePullControlWaitLabel(frame) + if not frame or not frame.waitLabel then + return + end + + frame.waitLabel:SetText("Wait: " .. tostring(frame._mbWaitTime or 0) .. "s") +end + +local function setPullControlStates(frame, wait, focus, dpsAssist, dpsAoe) + setPullControlButtonState(frame.buttons["PullWait"], wait) + setPullControlButtonState(frame.buttons["PullFocus"], focus) + setPullControlButtonState(frame.buttons["PullDpsAssist"], dpsAssist) + setPullControlButtonState(frame.buttons["PullDpsAoe"], dpsAoe) +end + +local function createPullControlFrame(mainFrame, pullButton) + local frame = CreateFrame("Frame", "MultiBotPullControlFrame", mainFrame) + frame:SetWidth(232) + frame:SetHeight(176) + frame:SetFrameLevel((mainFrame:GetFrameLevel() or 0) + 12) + frame:EnableMouse(true) + frame:Hide() + + if pullButton then + frame:SetPoint("BOTTOMLEFT", pullButton, "BOTTOMRIGHT", 8, -140) + else + frame:SetPoint("TOPLEFT", mainFrame, "TOPRIGHT", 8, -340) + end + + frame.buttons = {} + frame.scopeButtons = {} + frame._mbDropdownManaged = true + frame._mbPullScope = "BOT" + frame._mbWaitTime = 3 + + frame.bg = frame:CreateTexture(nil, "BACKGROUND") + frame.bg:SetTexture("Interface\\Buttons\\WHITE8X8") + frame.bg:SetAllPoints(frame) + frame.bg:SetVertexColor(0, 0, 0, 0.78) + + frame:SetBackdrop({ + edgeFile = "Interface\\Tooltips\\UI-Tooltip-Border", + edgeSize = 12, + }) + frame:SetBackdropBorderColor(0.85, 0.85, 0.85, 0.85) + + frame.title = frame:CreateFontString(nil, "ARTWORK") + frame.title:SetFont("Fonts\\ARIALN.ttf", 12, "OUTLINE") + frame.title:SetPoint("TOPLEFT", frame, "TOPLEFT", 10, -8) + frame.title:SetText("Pull Control") + + createPullControlScopeButton(frame, "ScopeBot", 10, "Selected", "tips.main.pullscopebot", "BOT") + createPullControlScopeButton(frame, "ScopeGroup", 82, "Party", "tips.main.pullscopegroup", "GROUP") + createPullControlScopeButton(frame, "ScopeAll", 154, "Raid", "tips.main.pullscopeall", "ALL") + frame.scopeButtons.ScopeBot:SetButtonState("PUSHED", true) + + frame.waitLabel = frame:CreateFontString(nil, "ARTWORK") + frame.waitLabel:SetFont("Fonts\\ARIALN.ttf", 11, "OUTLINE") + frame.waitLabel:SetPoint("TOPLEFT", frame, "TOPLEFT", 10, -58) + + local waitSlider = CreateFrame("Slider", "MultiBotPullControlWaitSlider", frame, "OptionsSliderTemplate") + waitSlider:SetWidth(118) + waitSlider:SetHeight(16) + waitSlider:SetPoint("TOPLEFT", frame, "TOPLEFT", 92, -60) + waitSlider:SetMinMaxValues(0, 10) + waitSlider:SetValueStep(1) + waitSlider:SetValue(frame._mbWaitTime) + + if waitSlider.SetObeyStepOnDrag then + waitSlider:SetObeyStepOnDrag(true) + end + + if _G.MultiBotPullControlWaitSliderLow then + _G.MultiBotPullControlWaitSliderLow:SetText("0") + end + if _G.MultiBotPullControlWaitSliderHigh then + _G.MultiBotPullControlWaitSliderHigh:SetText("10") + end + if _G.MultiBotPullControlWaitSliderText then + _G.MultiBotPullControlWaitSliderText:SetText("") + end + + waitSlider:SetScript("OnValueChanged", function(_, value) + frame._mbWaitTime = math.floor((tonumber(value) or 0) + 0.5) + updatePullControlWaitLabel(frame) + + if frame.buttons["PullWait"] and frame.buttons["PullWait"].state then + runPullControlCombatCommands(frame, { + "wait for attack time " .. tostring(frame._mbWaitTime or 0), + }) + end + end) + + updatePullControlWaitLabel(frame) + + createPullControlIcon(frame, "PullWait", 10, -82, "Spell_Holy_BorrowedTime", "tips.main.pullwait", function(button) + if button.state then + if runPullControlCombatCommands(frame, { "wait for attack time 0" }) then + setPullControlButtonState(button, false) + end + return + end + + if runPullControlCombatCommands(frame, { + "wait for attack time " .. tostring(frame._mbWaitTime or 0), + }) then + setPullControlButtonState(button, true) + end + end) + + createPullControlIcon(frame, "PullFocus", 44, -82, "Ability_Hunter_MasterMarksman", "tips.main.pullfocus", function(button) + local enabled = not button.state + if runPullControlCombatCommands(frame, { enabled and "co +focus" or "co -focus" }) then + setPullControlButtonState(button, enabled) + end + end) + + createPullControlIcon(frame, "PullDpsAssist", 78, -82, "Ability_Hunter_Assassinate2", "tips.main.pulldpsassist", function(button) + local enabled = not button.state + if runPullControlCombatCommands(frame, { enabled and "co +dps assist" or "co -dps assist" }) then + setPullControlButtonState(button, enabled) + end + end) + + createPullControlIcon(frame, "PullDpsAoe", 112, -82, "Spell_Fire_SelfDestruct", "tips.main.pullaoe", function(button) + local enabled = not button.state + if runPullControlCombatCommands(frame, { enabled and "co +dps aoe" or "co -dps aoe" }) then + setPullControlButtonState(button, enabled) + end + end) + + createPullControlIcon(frame, "PullPresetSingle", 10, -118, "ability_warrior_punishingblow", "tips.main.pullpresetsingle", function() + if runPullControlCombatCommands(frame, { + "wait for attack time 2", + "co +focus", + "co +dps assist", + "co -dps aoe", + }) then + frame._mbWaitTime = 2 + waitSlider:SetValue(2) + setPullControlStates(frame, true, true, true, false) + end + end) + + createPullControlIcon(frame, "PullPresetAoe", 44, -118, "spell_fire_meteorstorm", "tips.main.pullpresetaoe", function() + if runPullControlCombatCommands(frame, { + "wait for attack time 1", + "co -focus", + "co +dps assist", + "co +dps aoe", + }) then + frame._mbWaitTime = 1 + waitSlider:SetValue(1) + setPullControlStates(frame, true, false, true, true) + end + end) + + createPullControlIcon(frame, "PullPresetSafe", 78, -118, "ability_hunter_snipershot", "tips.main.pullpresetsafe", function() + if runPullControlCombatCommands(frame, { + "wait for attack time 5", + "co +focus", + "co -dps aoe", + }) then + frame._mbWaitTime = 5 + waitSlider:SetValue(5) + setPullControlButtonState(frame.buttons["PullWait"], true) + setPullControlButtonState(frame.buttons["PullFocus"], true) + setPullControlButtonState(frame.buttons["PullDpsAoe"], false) + end + end) + + createPullControlIcon(frame, "PullPresetReset", 112, -118, "spell_shadow_charm", "tips.main.pullpresetreset", function() + if runPullControlCombatCommands(frame, { + "wait for attack time 0", + "co -focus", + "co -dps assist", + "co -dps aoe", + }) then + frame._mbWaitTime = 0 + waitSlider:SetValue(0) + setPullControlStates(frame, false, false, false, false) + end + end) + + createPullControlIcon(frame, "PullRtiTarget", 160, -82, "ability_hunter_markedfordeath", "tips.main.pullrti", function() + runPullControlRtiCommand(frame, "pull rti target") + end) + + createPullControlIcon(frame, "AttackRtiTarget", 194, -82, "ability_warrior_decisivestrike", "tips.main.attackrti", function() + runPullControlRtiCommand(frame, "attack rti target") + end) + + frame.actionsText = frame:CreateFontString(nil, "ARTWORK") + frame.actionsText:SetFont("Fonts\\ARIALN.ttf", 10, "OUTLINE") + frame.actionsText:SetPoint("TOPLEFT", frame, "TOPLEFT", 158, -118) + frame.actionsText:SetWidth(64) + frame.actionsText:SetJustifyH("CENTER") + frame.actionsText:SetText("RTI\nActions") + + setPullControlStates(frame, false, false, false, false) + + return frame +end + local function saveMultiBarPosition() local multiBar = MultiBot.frames and MultiBot.frames["MultiBar"] if not multiBar or not MultiBot.SetSavedLayoutValue or not MultiBot.toPoint then @@ -472,7 +857,19 @@ local function buildResolvedOrder(defaultOrder, savedOrder) for _, name in ipairs(defaultOrder) do if not seen[name] then - table.insert(resolved, name) + local insertAt = #resolved + 1 + local defaultIndex = findOrderIndex(defaultOrder, name) + + for index, resolvedName in ipairs(resolved) do + local resolvedDefaultIndex = findOrderIndex(defaultOrder, resolvedName) + if resolvedDefaultIndex and defaultIndex and resolvedDefaultIndex > defaultIndex then + insertAt = index + break + end + end + + table.insert(resolved, insertAt, name) + seen[name] = true end end @@ -689,6 +1086,7 @@ function MultiBot.InitializeMainUI(tMultiBar) "Release", "Stats", "Reward", + "PullControl", "Reset", "Actions", } @@ -858,11 +1256,26 @@ function MultiBot.InitializeMainUI(tMultiBar) local rewardButton = createRewardButton(mainFrame) wireShiftRightSwap(rewardButton, "Reward") + local pullControlButton = createMainActionButton(mainFrame, { + name = "PullControl", + y = 340, + icon = "ability_hunter_markedfordeath", + tip = "tips.main.pullcontrol", + doLeft = function(button) + if not button._mbPullControlFrame then + button._mbPullControlFrame = createPullControlFrame(mainFrame, button) + end + + MultiBot.ShowHideSwitch(button._mbPullControlFrame) + end, + }) + wireShiftRightSwap(pullControlButton, "PullControl") + refreshLeftLayout() createMainActionButton(mainFrame, { name = "Reset", - y = 340, + y = 374, icon = "inv_misc_tournaments_symbol_gnome", tip = "tips.main.reset", doLeft = function() @@ -873,7 +1286,7 @@ function MultiBot.InitializeMainUI(tMultiBar) createMainActionButton(mainFrame, { name = "Actions", - y = 374, + y = 408, icon = "inv_helmet_02", tip = "tips.main.action", doLeft = function() From 4246c1e7d7a65ff3fed0c6dbe6e5d0ce26c96e4f Mon Sep 17 00:00:00 2001 From: Wishmaster117 <140754794+Wishmaster117@users.noreply.github.com> Date: Tue, 28 Apr 2026 13:57:16 +0200 Subject: [PATCH 2/4] Adjust slider --- UI/MultiBotMainUI.lua | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/UI/MultiBotMainUI.lua b/UI/MultiBotMainUI.lua index 7e4822b..d613cce 100644 --- a/UI/MultiBotMainUI.lua +++ b/UI/MultiBotMainUI.lua @@ -577,7 +577,7 @@ local function createPullControlFrame(mainFrame, pullButton) local waitSlider = CreateFrame("Slider", "MultiBotPullControlWaitSlider", frame, "OptionsSliderTemplate") waitSlider:SetWidth(118) waitSlider:SetHeight(16) - waitSlider:SetPoint("TOPLEFT", frame, "TOPLEFT", 92, -60) + waitSlider:SetPoint("TOPLEFT", frame, "TOPLEFT", 92, -55) waitSlider:SetMinMaxValues(0, 10) waitSlider:SetValueStep(1) waitSlider:SetValue(frame._mbWaitTime) From 631e98f3b595caca3b0705aaa9fed7a0c17b5c59 Mon Sep 17 00:00:00 2001 From: Wishmaster117 <140754794+Wishmaster117@users.noreply.github.com> Date: Tue, 28 Apr 2026 14:07:21 +0200 Subject: [PATCH 3/4] add missing translations --- Locales/MultiBotAceLocale-deDE.lua | 27 +++++++++++++++++++++++++++ Locales/MultiBotAceLocale-esES.lua | 27 +++++++++++++++++++++++++++ Locales/MultiBotAceLocale-koKR.lua | 27 +++++++++++++++++++++++++++ Locales/MultiBotAceLocale-ruRU.lua | 27 +++++++++++++++++++++++++++ Locales/MultiBotAceLocale-zhCN.lua | 27 +++++++++++++++++++++++++++ 5 files changed, 135 insertions(+) diff --git a/Locales/MultiBotAceLocale-deDE.lua b/Locales/MultiBotAceLocale-deDE.lua index b5a8d66..3997129 100644 --- a/Locales/MultiBotAceLocale-deDE.lua +++ b/Locales/MultiBotAceLocale-deDE.lua @@ -657,6 +657,33 @@ local deDEValues = { ["tips.every.talent"] = "Talente|cffffffff\nDiese Schaltfläche öffnet oder schließt die Talente des Bots.\nDie Talente öffnen zeitverzögert, damit das System die Punkte laden kann.|r\n\n|cffff0000Linksklicken um das Talente zu öffnen oder schließen|r\n|cff999999(Execution-Order: Bot)|r", ["tips.every.wipe"] = "Wipe|cffffffff\nSetzt den Bot vollständig zurück, indem er getötet und wiederbelebt wird,\nnützlich zum Zurücksetzen seines Zustands (Position, Gesundheit, Mana usw.).|r\n\n|cffff0000Linksklick: sendet den Wipe-Befehl an den ausgewählten Bot|r\n|cff999999(Ausführungsreihenfolge: Bot)|r", ["tips.every.settalent"] = "Talente auswählen|cffffffff\nZeigt ein Menü der verfügbaren Spezialisierungen (PvE/PvP) für den ausgewählten Bot an.\nDie sekundäre Spezialisierung wird auf Stufe 40 freigeschaltet.|r\n\n|cffff0000Linksklick, um den Talentvorlagen-Selektor des Bots ein-/auszublenden|r\n|cff999999(Ausführungsreihenfolge: Bot)|r", + ["tips.every.combat"] = "Kampf|cffffffff\nÖffnet die Kampfstrategie- und Timing‑Befehle für diesen Bot.|r\n|cffff0000Linksklick zum Öffnen oder Schließen|r\n|cff999999(Ausführungsreihenfolge: Bot)|r", + ["tips.every.combatfocus"] = "Focus‑Strategie|cffffffff\nAktiviert oder deaktiviert co +focus / co -focus für diesen Bot.|r\n|cffff0000Linksklick zum Umschalten|r\n|cff999999(Ausführungsreihenfolge: Bot)|r", + ["tips.every.combataoe"] = "AoE‑Strategie|cffffffff\nAktiviert oder deaktiviert co +aoe / co -aoe für diesen Bot.|r\n|cffff0000Linksklick zum Umschalten|r\n|cff999999(Ausführungsreihenfolge: Bot)|r", + ["tips.every.combatdpsassist"] = "DPS‑Assist‑Strategie|cffffffff\nAktiviert oder deaktiviert co +dps assist / co -dps assist für diesen Bot.|r\n|cffff0000Linksklick zum Umschalten|r\n|cff999999(Ausführungsreihenfolge: Bot)|r", + ["tips.every.combattankassist"] = "Tank‑Assist‑Strategie|cffffffff\nAktiviert oder deaktiviert co +tank assist / co -tank assist für diesen Bot.|r\n|cffff0000Linksklick zum Umschalten|r\n|cff999999(Ausführungsreihenfolge: Bot)|r", + ["tips.every.combatwait0"] = "Wait for attack: 0 Sek.|cffffffff\nSendet wait for attack time 0 an diesen Bot.|r\n|cffff0000Linksklick zum Senden|r\n|cff999999(Ausführungsreihenfolge: Bot)|r", + ["tips.every.combatwait3"] = "Wait for attack: 3 Sek.|cffffffff\nSendet wait for attack time 3 an diesen Bot.|r\n|cffff0000Linksklick zum Senden|r\n|cff999999(Ausführungsreihenfolge: Bot)|r", + ["tips.every.combatwait5"] = "Wait for attack: 5 Sek.|cffffffff\nSendet wait for attack time 5 an diesen Bot.|r\n|cffff0000Linksklick zum Senden|r\n|cff999999(Ausführungsreihenfolge: Bot)|r", + ["tips.every.combatwait10"] = "Wait for attack: 10 Sek.|cffffffff\nSendet wait for attack time 10 an diesen Bot.|r\n|cffff0000Linksklick zum Senden|r\n|cff999999(Ausführungsreihenfolge: Bot)|r", + ["tips.main.pullcontrol"] = "Pull‑Kontrolle|cffffffff\nÖffnet die Pull‑ und Kampfsteuerung über die Bridge.|r", + ["tips.main.pullscopebot"] = "Scope: ausgewählter Bot|cffffffff\nBefehle werden nur an den aktuell ausgewählten Bot gesendet.|r", + ["tips.main.pullscopegroup"] = "Scope: Gruppe|cffffffff\nBefehle werden an gruppierte Bots gesendet.|r", + ["tips.main.pullscopeall"] = "Scope: Raid/Alle|cffffffff\nBefehle werden an alle verfügbaren Bots gesendet.|r", + ["tips.main.pullwait"] = "Wait‑Strategie|cffffffff\nAktiviert oder deaktiviert co +wait for attack / co -wait for attack und wendet den gewählten Delay an.|r", + ["tips.main.pullfocus"] = "Focus‑Strategie|cffffffff\nAktiviert oder deaktiviert co +focus / co -focus.|r", + ["tips.main.pulldpsassist"] = "DPS‑Assist|cffffffff\nAktiviert oder deaktiviert co +dps assist / co -dps assist.|r", + ["tips.main.pullaoe"] = "AoE|cffffffff\nAktiviert oder deaktiviert co +aoe / co -aoe.|r", + ["tips.main.pullpresetsingle"] = "Preset Single Target|cffffffff\nDeaktiviert AoE und aktiviert DPS assist.|r", + ["tips.main.pullpresetaoe"] = "Preset AoE Pack|cffffffff\nAktiviert AoE und DPS assist.|r", + ["tips.main.pullpresetsafe"] = "Preset Safe Pull|cffffffff\nAktiviert Focus, DPS assist und Wait for attack.|r", + ["tips.main.pullpresetreset"] = "Kampf zurücksetzen|cffffffff\nDeaktiviert Focus, DPS assist, AoE, Tank assist und Wait for attack.|r", + ["tips.main.pullrti"] = "Pull RTI‑Ziel|cffffffff\nSendet pull rti target über die Bridge.|r", + ["tips.main.attackrti"] = "Attack RTI‑Ziel|cffffffff\nSendet attack rti target über die Bridge.|r", + ["tips.main.pullwaittime"] = "Delay anwenden|cffffffff\nSendet wait for attack time mit dem Wert des Sliders.|r", + ["info.pullcontrol.no_selected_bot"] = "Wähle zuerst einen Bot für den Scope 'Selected' aus.", + ["info.pullcontrol.bridge"] = "Die Kampf‑Bridge ist nicht verbunden.", + ["tips.every.combatbridge"] = "Bridge nicht verfügbar: Der Kampfbefehl wurde nicht gesendet.", ["tips.spec.dkbloodpve"] = "Blut – PvE|cffffffff\nSpezialisiert auf Selbstheilung und Überleben im PvE.\nZweitspezialisierung ab Stufe 40 freigeschaltet.|r\n\n|cffff0000Linksklick: als Hauptspezialisierung festlegen|r\n|cffff0000Rechtsklick: als Zweitspezialisierung festlegen|r\n|cff999999(Ausführungsreihenfolge: Bot)|r", ["tips.spec.dkbloodpvp"] = "Blut – PvP|cffffffff\nIdeal für Flaggenträger und hohe Widerstandskraft im PvP.\nZweitspezialisierung ab Stufe 40 freigeschaltet.|r\n\n|cffff0000Linksklick: als Hauptspezialisierung festlegen|r\n|cffff0000Rechtsklick: als Zweitspezialisierung festlegen|r\n|cff999999(Ausführungsreihenfolge: Bot)|r", ["tips.spec.dkbfrostpve"] = "Frost – PvE|cffffffff\nOptimiert für Burst und Verlangsamungen im PvE.\nZweitspezialisierung ab Stufe 40 freigeschaltet.|r\n\n|cffff0000Linksklick: als Hauptspezialisierung festlegen|r\n|cffff0000Rechtsklick: als Zweitspezialisierung festlegen|r\n|cff999999(Ausführungsreihenfolge: Bot)|r", diff --git a/Locales/MultiBotAceLocale-esES.lua b/Locales/MultiBotAceLocale-esES.lua index 6bcbec8..e13239a 100644 --- a/Locales/MultiBotAceLocale-esES.lua +++ b/Locales/MultiBotAceLocale-esES.lua @@ -659,6 +659,33 @@ local esESValues = { ["tips.every.talent"] = "Talent|cffffffff\nAbre o cierra los talentos de este bot.\nSe abre con un retardo mientras el sistema carga los valores de talentos.|r\n\n|cffff0000Clic izquierdo para abrir o cerrar los talentos|r\n|cff999999(Execution-Order: Bot)|r", ["tips.every.wipe"] = "Wipe|cffffffff\nRestablece completamente el bot matándolo y resucitándolo,\nútil para limpiar su estado (posición, salud, maná, etc.).|r\n\n|cffff0000Clic izquierdo: envía el comando wipe al bot seleccionado|r\n|cff999999(Orden de ejecución: Bot)|r", ["tips.every.settalent"] = "Seleccionar talentos|cffffffff\nMuestra un menú de especializaciones disponibles (PvE/PvP) para el bot seleccionado.\nLa especialización secundaria se desbloquea al nivel 40.|r\n\n|cffff0000Clic izquierdo para alternar el selector de plantillas de talentos del bot|r\n|cff999999(Orden de ejecución: Bot)|r", + ["tips.every.combat"] = "Combate|cffffffff\nAbre los comandos de estrategia y temporización de combate para este bot.|r\n|cffff0000Clic izquierdo para abrir o cerrar|r\n|cff999999(Orden de ejecución: Bot)|r", + ["tips.every.combatfocus"] = "Estrategia Focus|cffffffff\nActiva o desactiva co +focus / co -focus para este bot.|r\n|cffff0000Clic izquierdo para alternar|r\n|cff999999(Orden de ejecución: Bot)|r", + ["tips.every.combataoe"] = "Estrategia AoE|cffffffff\nActiva o desactiva co +aoe / co -aoe para este bot.|r\n|cffff0000Clic izquierdo para alternar|r\n|cff999999(Orden de ejecución: Bot)|r", + ["tips.every.combatdpsassist"] = "Estrategia DPS Assist|cffffffff\nActiva o desactiva co +dps assist / co -dps assist para este bot.|r\n|cffff0000Clic izquierdo para alternar|r\n|cff999999(Orden de ejecución: Bot)|r", + ["tips.every.combattankassist"] = "Estrategia Tank Assist|cffffffff\nActiva o desactiva co +tank assist / co -tank assist para este bot.|r\n|cffff0000Clic izquierdo para alternar|r\n|cff999999(Orden de ejecución: Bot)|r", + ["tips.every.combatwait0"] = "Wait for attack: 0 seg|cffffffff\nEnvía wait for attack time 0 a este bot.|r\n|cffff0000Clic izquierdo para enviar|r\n|cff999999(Orden de ejecución: Bot)|r", + ["tips.every.combatwait3"] = "Wait for attack: 3 seg|cffffffff\nEnvía wait for attack time 3 a este bot.|r\n|cffff0000Clic izquierdo para enviar|r\n|cff999999(Orden de ejecución: Bot)|r", + ["tips.every.combatwait5"] = "Wait for attack: 5 seg|cffffffff\nEnvía wait for attack time 5 a este bot.|r\n|cffff0000Clic izquierdo para enviar|r\n|cff999999(Orden de ejecución: Bot)|r", + ["tips.every.combatwait10"] = "Wait for attack: 10 seg|cffffffff\nEnvía wait for attack time 10 a este bot.|r\n|cffff0000Clic izquierdo para enviar|r\n|cff999999(Orden de ejecución: Bot)|r", + ["tips.main.pullcontrol"] = "Control de Pull|cffffffff\nAbre los controles de pull y combate mediante la bridge.|r", + ["tips.main.pullscopebot"] = "Scope: bot seleccionado|cffffffff\nLos comandos se envían solo al bot seleccionado actualmente.|r", + ["tips.main.pullscopegroup"] = "Scope: grupo|cffffffff\nLos comandos se envían a los bots agrupados.|r", + ["tips.main.pullscopeall"] = "Scope: banda/todos|cffffffff\nLos comandos se envían a todos los bots disponibles.|r", + ["tips.main.pullwait"] = "Estrategia Wait|cffffffff\nActiva o desactiva co +wait for attack / co -wait for attack y aplica el retraso elegido.|r", + ["tips.main.pullfocus"] = "Estrategia Focus|cffffffff\nActiva o desactiva co +focus / co -focus.|r", + ["tips.main.pulldpsassist"] = "DPS Assist|cffffffff\nActiva o desactiva co +dps assist / co -dps assist.|r", + ["tips.main.pullaoe"] = "AoE|cffffffff\nActiva o desactiva co +aoe / co -aoe.|r", + ["tips.main.pullpresetsingle"] = "Preset Single Target|cffffffff\nDesactiva AoE y activa DPS assist.|r", + ["tips.main.pullpresetaoe"] = "Preset AoE Pack|cffffffff\nActiva AoE y DPS assist.|r", + ["tips.main.pullpresetsafe"] = "Preset Safe Pull|cffffffff\nActiva focus, DPS assist y wait for attack.|r", + ["tips.main.pullpresetreset"] = "Reiniciar combate|cffffffff\nDesactiva focus, DPS assist, AoE, tank assist y wait for attack.|r", + ["tips.main.pullrti"] = "Pull RTI Target|cffffffff\nEnvía pull rti target mediante la bridge.|r", + ["tips.main.attackrti"] = "Attack RTI Target|cffffffff\nEnvía attack rti target mediante la bridge.|r", + ["tips.main.pullwaittime"] = "Aplicar el retraso|cffffffff\nEnvía wait for attack time con el valor del slider.|r", + ["info.pullcontrol.no_selected_bot"] = "Selecciona primero un bot para el scope Selected.", + ["info.pullcontrol.bridge"] = "La bridge de combate no está conectada.", + ["tips.every.combatbridge"] = "Bridge no disponible: el comando de combate no ha sido enviado.", ["tips.spec.dkbloodpve"] = "Sangre – PvE|cffffffff\nEspecialización centrada en la autocuración y la supervivencia en PvE.\nSecundaria desbloqueada al nivel 40.|r\n\n|cffff0000Clic izquierdo: establecer como especialización principal|r\n|cffff0000Clic derecho: establecer como especialización secundaria|r\n|cff999999(Orden de ejecución: Bot)|r", ["tips.spec.dkbloodpvp"] = "Sangre – PvP|cffffffff\nIdeal para controlar la bandera y resistir en JcJ.\nSecundaria desbloqueada al nivel 40.|r\n\n|cffff0000Clic izquierdo: establecer como especialización principal|r\n|cffff0000Clic derecho: establecer como especialización secundaria|r\n|cff999999(Orden de ejecución: Bot)|r", ["tips.spec.dkbfrostpve"] = "Escarcha – PvE|cffffffff\nOptimizada para ráfagas y ralentizaciones en PvE.\nSecundaria desbloqueada al nivel 40.|r\n\n|cffff0000Clic izquierdo: establecer como especialización principal|r\n|cffff0000Clic derecho: establecer como especialización secundaria|r\n|cff999999(Orden de ejecución: Bot)|r", diff --git a/Locales/MultiBotAceLocale-koKR.lua b/Locales/MultiBotAceLocale-koKR.lua index 9b6d2cf..3d5f1d9 100644 --- a/Locales/MultiBotAceLocale-koKR.lua +++ b/Locales/MultiBotAceLocale-koKR.lua @@ -656,6 +656,33 @@ local koKRValues = { ["tips.every.talent"] = "재능|cffffffff\n이 로봇의 재능을 켜거나 끕니다.\n시스템이 재능 값을 로드하여 열 때 시간 지연이 발생합니다.|r\n\n|cffff0000 재능을 켜거나 끄려면 마우스 왼쪽 버튼을 클릭하세요|r\n|cff999999(명령 실행: 로봇)|r", ["tips.every.wipe"] = "Wipe|cffffffff\n봇을 죽였다가 부활시켜 완전히 초기화합니다,\n위치, 생명력, 마나 등 상태를 초기화하는 데 유용합니다.|r\n\n|cffff0000왼쪽 클릭: 선택된 봇에게 wipe 명령을 보냅니다|r\n|cff999999(실행 순서: 봇)|r", ["tips.every.settalent"] = "특성 설정|cffffffff\n선택된 봇의 사용 가능한 특성(PvE/PvP) 메뉴를 표시합니다.\n보조 특성은 레벨 40에 잠금 해제됩니다.|r\n\n|cffff0000왼쪽 클릭하여 봇의 특성 템플릿 선택기를 켜거나 끕니다|r\n|cff999999(실행 순서: 봇)|r", + ["tips.every.combat"] = "전투|cffffffff\n이 봇의 전투 전략 및 타이밍 명령을 엽니다.|r\n|cffff0000좌클릭으로 열기/닫기|r\n|cff999999(실행 순서: Bot)|r", + ["tips.every.combatfocus"] = "포커스 전략|cffffffff\n이 봇에 대해 co +focus / co -focus 를 활성화 또는 비활성화합니다.|r\n|cffff0000좌클릭으로 전환|r\n|cff999999(실행 순서: Bot)|r", + ["tips.every.combataoe"] = "광역(AoE) 전략|cffffffff\n이 봇에 대해 co +aoe / co -aoe 를 활성화 또는 비활성화합니다.|r\n|cffff0000좌클릭으로 전환|r\n|cff999999(실행 순서: Bot)|r", + ["tips.every.combatdpsassist"] = "DPS 지원 전략|cffffffff\n이 봇에 대해 co +dps assist / co -dps assist 를 활성화 또는 비활성화합니다.|r\n|cffff0000좌클릭으로 전환|r\n|cff999999(실행 순서: Bot)|r", + ["tips.every.combattankassist"] = "탱크 지원 전략|cffffffff\n이 봇에 대해 co +tank assist / co -tank assist 를 활성화 또는 비활성화합니다.|r\n|cffff0000좌클릭으로 전환|r\n|cff999999(실행 순서: Bot)|r", + ["tips.every.combatwait0"] = "Wait for attack: 0초|cffffffff\n이 봇에게 wait for attack time 0 을 보냅니다.|r\n|cffff0000좌클릭으로 전송|r\n|cff999999(실행 순서: Bot)|r", + ["tips.every.combatwait3"] = "Wait for attack: 3초|cffffffff\n이 봇에게 wait for attack time 3 을 보냅니다.|r\n|cffff0000좌클릭으로 전송|r\n|cff999999(실행 순서: Bot)|r", + ["tips.every.combatwait5"] = "Wait for attack: 5초|cffffffff\n이 봇에게 wait for attack time 5 을 보냅니다.|r\n|cffff0000좌클릭으로 전송|r\n|cff999999(실행 순서: Bot)|r", + ["tips.every.combatwait10"] = "Wait for attack: 10초|cffffffff\n이 봇에게 wait for attack time 10 을 보냅니다.|r\n|cffff0000좌클릭으로 전송|r\n|cff999999(실행 순서: Bot)|r", + ["tips.main.pullcontrol"] = "풀(Pull) 제어|cffffffff\n브리지를 통해 풀 및 전투 제어를 엽니다.|r", + ["tips.main.pullscopebot"] = "범위: 선택된 봇|cffffffff\n명령은 현재 선택된 봇에게만 전송됩니다.|r", + ["tips.main.pullscopegroup"] = "범위: 그룹|cffffffff\n명령은 그룹된 봇들에게 전송됩니다.|r", + ["tips.main.pullscopeall"] = "범위: 공격대/전체|cffffffff\n명령은 사용 가능한 모든 봇에게 전송됩니다.|r", + ["tips.main.pullwait"] = "Wait 전략|cffffffff\nco +wait for attack / co -wait for attack 을 활성화 또는 비활성화하고 선택된 지연 시간을 적용합니다.|r", + ["tips.main.pullfocus"] = "포커스 전략|cffffffff\nco +focus / co -focus 를 활성화 또는 비활성화합니다.|r", + ["tips.main.pulldpsassist"] = "DPS Assist|cffffffff\nco +dps assist / co -dps assist 를 활성화 또는 비활성화합니다.|r", + ["tips.main.pullaoe"] = "AoE|cffffffff\nco +aoe / co -aoe 를 활성화 또는 비활성화합니다.|r", + ["tips.main.pullpresetsingle"] = "프리셋: 단일 대상|cffffffff\nAoE를 비활성화하고 DPS assist를 활성화합니다.|r", + ["tips.main.pullpresetaoe"] = "프리셋: AoE 팩|cffffffff\nAoE와 DPS assist를 활성화합니다.|r", + ["tips.main.pullpresetsafe"] = "프리셋: 안전한 풀|cffffffff\nFocus, DPS assist, wait for attack 을 활성화합니다.|r", + ["tips.main.pullpresetreset"] = "전투 초기화|cffffffff\nFocus, DPS assist, AoE, tank assist, wait for attack 을 비활성화합니다.|r", + ["tips.main.pullrti"] = "RTI 대상 풀|cffffffff\n브리지를 통해 pull rti target 을 전송합니다.|r", + ["tips.main.attackrti"] = "RTI 대상 공격|cffffffff\n브리지를 통해 attack rti target 을 전송합니다.|r", + ["tips.main.pullwaittime"] = "지연 적용|cffffffff\n슬라이더 값으로 wait for attack time 을 전송합니다.|r", + ["info.pullcontrol.no_selected_bot"] = "Selected 범위를 사용하려면 먼저 봇을 선택하세요.", + ["info.pullcontrol.bridge"] = "전투 브리지가 연결되어 있지 않습니다.", + ["tips.every.combatbridge"] = "브리지 사용 불가: 전투 명령이 전송되지 않았습니다.", ["tips.spec.dkbloodpve"] = "혈기 – PvE|cffffffff\nPvE 환경에서 자가 치유와 생존에 중점을 둔 전문화입니다.\n보조 전문화는 40레벨부터 잠금 해제됩니다.|r\n\n|cffff0000왼쪽 클릭: 주 전문화로 설정|r\n|cffff0000오른쪽 클릭: 보조 전문화로 설정|r\n|cff999999(실행 순서: 봇)|r", ["tips.spec.dkbloodpvp"] = "혈기 – PvP|cffffffff\n깃발 방어 및 PvP 생존에 이상적입니다.\n보조 전문화는 40레벨부터 잠금 해제됩니다.|r\n\n|cffff0000왼쪽 클릭: 주 전문화로 설정|r\n|cffff0000오른쪽 클릭: 보조 전문화로 설정|r\n|cff999999(실행 순서: 봇)|r", ["tips.spec.dkbfrostpve"] = "냉기 – PvE|cffffffff\nPvE에서 폭발 피해와 느려짐에 최적화되었습니다.\n보조 전문화는 40레벨부터 잠금 해제됩니다.|r\n\n|cffff0000왼쪽 클릭: 주 전문화로 설정|r\n|cffff0000오른쪽 클릭: 보조 전문화로 설정|r\n|cff999999(실행 순서: 봇)|r", diff --git a/Locales/MultiBotAceLocale-ruRU.lua b/Locales/MultiBotAceLocale-ruRU.lua index 02489ec..4b82e1b 100644 --- a/Locales/MultiBotAceLocale-ruRU.lua +++ b/Locales/MultiBotAceLocale-ruRU.lua @@ -659,6 +659,33 @@ local ruRUValues = { ["tips.every.talent"] = "Таланты|cffffffff\nОткрывает или закрывает окно талантов этого бота.\nОткрывается с задержкой во время загрузки значений талантов системой.|r\n\n|cffff0000Левый клик – открыть/закрыть таланты|r\n|cff999999(Порядок выполнения: Бот)|r", ["tips.every.wipe"] = "Wipe|cffffffff\nПолностью сбрасывает бота, убивая его и воскрешая,\nполезно для очистки его состояния (позиции, здоровья, маны и т.д.).|r\n\n|cffff0000Левый клик: отправляет команду wipe выбранному боту|r\n|cff999999(Порядок выполнения: Bot)|r", ["tips.every.settalent"] = "Выбор талантов|cffffffff\nОтображает меню доступных специализаций (PvE/PvP) для выбранного бота.\nВторичная специализация разблокируется на уровне 40.|r\n\n|cffff0000Левый клик для переключения селектора шаблонов талантов бота|r\n|cff999999(Порядок выполнения: Бот)|r", + ["tips.every.combat"] = "Бой|cffffffff\nОткрывает команды боевой стратегии и таймингов для этого бота.|r\n|cffff0000ЛКМ для открытия или закрытия|r\n|cff999999(Порядок выполнения: Bot)|r", + ["tips.every.combatfocus"] = "Стратегия Focus|cffffffff\nВключает или отключает co +focus / co -focus для этого бота.|r\n|cffff0000ЛКМ для переключения|r\n|cff999999(Порядок выполнения: Bot)|r", + ["tips.every.combataoe"] = "Стратегия AoE|cffffffff\nВключает или отключает co +aoe / co -aoe для этого бота.|r\n|cffff0000ЛКМ для переключения|r\n|cff999999(Порядок выполнения: Bot)|r", + ["tips.every.combatdpsassist"] = "Стратегия DPS Assist|cffffffff\nВключает или отключает co +dps assist / co -dps assist для этого бота.|r\n|cffff0000ЛКМ для переключения|r\n|cff999999(Порядок выполнения: Bot)|r", + ["tips.every.combattankassist"] = "Стратегия Tank Assist|cffffffff\nВключает или отключает co +tank assist / co -tank assist для этого бота.|r\n|cffff0000ЛКМ для переключения|r\n|cff999999(Порядок выполнения: Bot)|r", + ["tips.every.combatwait0"] = "Wait for attack: 0 сек|cffffffff\nОтправляет wait for attack time 0 этому боту.|r\n|cffff0000ЛКМ для отправки|r\n|cff999999(Порядок выполнения: Bot)|r", + ["tips.every.combatwait3"] = "Wait for attack: 3 сек|cffffffff\nОтправляет wait for attack time 3 этому боту.|r\n|cffff0000ЛКМ для отправки|r\n|cff999999(Порядок выполнения: Bot)|r", + ["tips.every.combatwait5"] = "Wait for attack: 5 сек|cffffffff\nОтправляет wait for attack time 5 этому боту.|r\n|cffff0000ЛКМ для отправки|r\n|cff999999(Порядок выполнения: Bot)|r", + ["tips.every.combatwait10"] = "Wait for attack: 10 сек|cffffffff\nОтправляет wait for attack time 10 этому боту.|r\n|cffff0000ЛКМ для отправки|r\n|cff999999(Порядок выполнения: Bot)|r", + ["tips.main.pullcontrol"] = "Контроль пула|cffffffff\nОткрывает управление пулом и боем через bridge.|r", + ["tips.main.pullscopebot"] = "Область: выбранный бот|cffffffff\nКоманды отправляются только выбранному боту.|r", + ["tips.main.pullscopegroup"] = "Область: группа|cffffffff\nКоманды отправляются сгруппированным ботам.|r", + ["tips.main.pullscopeall"] = "Область: рейд/все|cffffffff\nКоманды отправляются всем доступным ботам.|r", + ["tips.main.pullwait"] = "Стратегия Wait|cffffffff\nВключает или отключает co +wait for attack / co -wait for attack и применяет выбранную задержку.|r", + ["tips.main.pullfocus"] = "Стратегия Focus|cffffffff\nВключает или отключает co +focus / co -focus.|r", + ["tips.main.pulldpsassist"] = "DPS Assist|cffffffff\nВключает или отключает co +dps assist / co -dps assist.|r", + ["tips.main.pullaoe"] = "AoE|cffffffff\nВключает или отключает co +aoe / co -aoe.|r", + ["tips.main.pullpresetsingle"] = "Пресет: одиночная цель|cffffffff\nОтключает AoE и включает DPS assist.|r", + ["tips.main.pullpresetaoe"] = "Пресет: AoE пак|cffffffff\nВключает AoE и DPS assist.|r", + ["tips.main.pullpresetsafe"] = "Пресет: безопасный пул|cffffffff\nВключает focus, DPS assist и wait for attack.|r", + ["tips.main.pullpresetreset"] = "Сброс боя|cffffffff\nОтключает focus, DPS assist, AoE, tank assist и wait for attack.|r", + ["tips.main.pullrti"] = "Пул по RTI‑цели|cffffffff\nОтправляет pull rti target через bridge.|r", + ["tips.main.attackrti"] = "Атака RTI‑цели|cffffffff\nОтправляет attack rti target через bridge.|r", + ["tips.main.pullwaittime"] = "Применить задержку|cffffffff\nОтправляет wait for attack time со значением слайдера.|r", + ["info.pullcontrol.no_selected_bot"] = "Сначала выберите бота для области Selected.", + ["info.pullcontrol.bridge"] = "Боевой bridge не подключён.", + ["tips.every.combatbridge"] = "Bridge недоступен: боевая команда не была отправлена.", ["tips.spec.dkbloodpve"] = "Кровь – PvE|cffffffff\nСпециализация с акцентом на самоисцеление и выживаемость в PvE.\nВторостепенная специализация доступна с 40 уровня.|r\n\n|cffff0000ЛКМ: основная специализация|r\n|cffff0000ПКМ: второстепенная специализация|r\n|cff999999(Очередность действий: бот)|r", ["tips.spec.dkbloodpvp"] = "Кровь – PvP|cffffffff\nОтлично подходит для захвата флага и выживания в PvP.\nВторостепенная специализация доступна с 40 уровня.|r\n\n|cffff0000ЛКМ: основная специализация|r\n|cffff0000ПКМ: второстепенная специализация|r\n|cff999999(Очередность действий: бот)|r", ["tips.spec.dkbfrostpve"] = "Лед – PvE|cffffffff\nОптимизирована для бурст-урона и замедлений в PvE.\nВторостепенная специализация доступна с 40 уровня.|r\n\n|cffff0000ЛКМ: основная специализация|r\n|cffff0000ПКМ: второстепенная специализация|r\n|cff999999(Очередность действий: бот)|r", diff --git a/Locales/MultiBotAceLocale-zhCN.lua b/Locales/MultiBotAceLocale-zhCN.lua index 255ca0f..ea9866d 100644 --- a/Locales/MultiBotAceLocale-zhCN.lua +++ b/Locales/MultiBotAceLocale-zhCN.lua @@ -635,6 +635,33 @@ local zhCNValues = { ["tips.every.talent"] = "天赋|cffffffff\n打开或关闭此机器人的天赋。\n在系统加载天赋值时会有时间延迟地打开。|r\n\n|cffff0000鼠标左键单击打开或关闭天赋|r\n|cff999999(执行命令: 机器人)|r", ["tips.every.wipe"] = "Wipe|cffffffff\n通过击杀并复活来完全重置机器人,\n有助于清除其状态(位置、生命值、法力值等)。|r\n\n|cffff0000左键单击:向所选机器人发送wipe命令|r\n|cff999999(执行顺序:Bot)|r", ["tips.every.settalent"] = "天赋选择|cffffffff\n显示所选机器人可用的专业(PvE/PvP)菜单。\n次要专业在40级解锁。|r\n\n|cffff0000左键单击以显示/隐藏机器人天赋模板选择器|r\n|cff999999(执行顺序:机器人)|r", + ["tips.every.combat"] = "战斗|cffffffff\n打开此机器人 的战斗策略与计时指令。|r\n|cffff0000左键点击以打开或关闭|r\n|cff999999(执行顺序:Bot)|r", + ["tips.every.combatfocus"] = "专注策略|cffffffff\n为此机器人启用或禁用 co +focus / co -focus。|r\n|cffff0000左键点击以切换|r\n|cff999999(执行顺序:Bot)|r", + ["tips.every.combataoe"] = "AoE 策略|cffffffff\n为此机器人启用或禁用 co +aoe / co -aoe。|r\n|cffff0000左键点击以切换|r\n|cff999999(执行顺序:Bot)|r", + ["tips.every.combatdpsassist"] = "DPS 协助策略|cffffffff\n为此机器人启用或禁用 co +dps assist / co -dps assist。|r\n|cffff0000左键点击以切换|r\n|cff999999(执行顺序:Bot)|r", + ["tips.every.combattankassist"] = "坦克协助策略|cffffffff\n为此机器人启用或禁用 co +tank assist / co -tank assist。|r\n|cffff0000左键点击以切换|r\n|cff999999(执行顺序:Bot)|r", + ["tips.every.combatwait0"] = "Wait for attack:0 秒|cffffffff\n向此机器人发送 wait for attack time 0。|r\n|cffff0000左键点击以发送|r\n|cff999999(执行顺序:Bot)|r", + ["tips.every.combatwait3"] = "Wait for attack:3 秒|cffffffff\n向此机器人发送 wait for attack time 3。|r\n|cffff0000左键点击以发送|r\n|cff999999(执行顺序:Bot)|r", + ["tips.every.combatwait5"] = "Wait for attack:5 秒|cffffffff\n向此机器人发送 wait for attack time 5。|r\n|cffff0000左键点击以发送|r\n|cff999999(执行顺序:Bot)|r", + ["tips.every.combatwait10"] = "Wait for attack:10 秒|cffffffff\n向此机器人发送 wait for attack time 10。|r\n|cffff0000左键点击以发送|r\n|cff999999(执行顺序:Bot)|r", + ["tips.main.pullcontrol"] = "拉怪控制|cffffffff\n通过 bridge 打开拉怪与战斗控制。|r", + ["tips.main.pullscopebot"] = "范围:选中机器人|cffffffff\n指令仅发送给当前选中的机器人。|r", + ["tips.main.pullscopegroup"] = "范围:小队|cffffffff\n指令发送给已分组的机器人。|r", + ["tips.main.pullscopeall"] = "范围:团队/全部|cffffffff\n指令发送给所有可用机器人。|r", + ["tips.main.pullwait"] = "Wait 策略|cffffffff\n启用或禁用 co +wait for attack / co -wait for attack,并应用所选延迟。|r", + ["tips.main.pullfocus"] = "专注策略|cffffffff\n启用或禁用 co +focus / co -focus。|r", + ["tips.main.pulldpsassist"] = "DPS 协助|cffffffff\n启用或禁用 co +dps assist / co -dps assist。|r", + ["tips.main.pullaoe"] = "AoE|cffffffff\n启用或禁用 co +aoe / co -aoe。|r", + ["tips.main.pullpresetsingle"] = "预设:单体|cffffffff\n禁用 AoE 并启用 DPS assist。|r", + ["tips.main.pullpresetaoe"] = "预设:AoE 群拉|cffffffff\n启用 AoE 与 DPS assist。|r", + ["tips.main.pullpresetsafe"] = "预设:安全拉怪|cffffffff\n启用 focus、DPS assist 与 wait for attack。|r", + ["tips.main.pullpresetreset"] = "重置战斗|cffffffff\n禁用 focus、DPS assist、AoE、tank assist 与 wait for attack。|r", + ["tips.main.pullrti"] = "拉 RTI 目标|cffffffff\n通过 bridge 发送 pull rti target。|r", + ["tips.main.attackrti"] = "攻击 RTI 目标|cffffffff\n通过 bridge 发送 attack rti target。|r", + ["tips.main.pullwaittime"] = "应用延迟|cffffffff\n根据滑块数值发送 wait for attack time。|r", + ["info.pullcontrol.no_selected_bot"] = "请先选择一个机器人以使用范围“Selected”。", + ["info.pullcontrol.bridge"] = "战斗 bridge 未连接。", + ["tips.every.combatbridge"] = "Bridge 不可用:战斗指令未发送。", ["tips.spec.dkbloodpve"] = "鲜血 – PvE|cffffffff\n专注于自我治疗和在PvE环境中生存的专精。\n副专精将在40级解锁。|r\n\n|cffff0000左键点击:设置为主专精|r\n|cffff0000右键点击:设置为副专精|r\n|cff999999(执行顺序:机器人)|r", ["tips.spec.dkbloodpvp"] = "鲜血 – PvP|cffffffff\n适合控旗和PvP耐久的专精。\n副专精将在40级解锁。|r\n\n|cffff0000左键点击:设置为主专精|r\n|cffff0000右键点击:设置为副专精|r\n|cff999999(执行顺序:机器人)|r", ["tips.spec.dkbfrostpve"] = "冰霜 – PvE|cffffffff\n在PvE中优化爆发和减速能力。\n副专精将在40级解锁。|r\n\n|cffff0000左键点击:设置为主专精|r\n|cffff0000右键点击:设置为副专精|r\n|cff999999(执行顺序:机器人)|r", From 8df7cfedbfd1a2c7de8ceac7602e9a22098940be Mon Sep 17 00:00:00 2001 From: Wishmaster117 <140754794+Wishmaster117@users.noreply.github.com> Date: Tue, 28 Apr 2026 14:12:00 +0200 Subject: [PATCH 4/4] Update multibot_missing_commands_roadmap.md --- docs/multibot_missing_commands_roadmap.md | 211 +++++++++++++--------- 1 file changed, 130 insertions(+), 81 deletions(-) diff --git a/docs/multibot_missing_commands_roadmap.md b/docs/multibot_missing_commands_roadmap.md index a8315ee..68c6570 100644 --- a/docs/multibot_missing_commands_roadmap.md +++ b/docs/multibot_missing_commands_roadmap.md @@ -9,7 +9,7 @@ Ce document suit les commandes `mod-playerbots` encore intéressantes à intégr - les commandes serveur/admin à ne pas intégrer dans l'addon ; - les priorités d'intégration bridge-first/chatless. -Le principe reste le même que pour Inventory, Spellbook, Glyphs, Talents, Stats, Quests, Outfits et RTI : +Le principe reste le même que pour Inventory, Spellbook, Glyphs, Talents, Stats, Quests, Outfits, RTI et Pull Control : **éviter le spam chat automatique**, utiliser le bridge quand c'est possible, et conserver les commandes manuelles utiles comme `who`, `co ?`, `nc ?`, `ss ?`. --- @@ -30,48 +30,52 @@ Le principe reste le même que pour Inventory, Spellbook, Glyphs, Talents, Stats | Quests | Présent | UI quêtes existante, pas à mélanger avec les commandes manuelles de diagnostic. | | Outfits | Fait | Endpoint bridge + commandes outfits intégrées. | | RTI / Target Icons | Fait | UI complète + bridge `RUN~RTI`, scopes `ALL`, `GROUP`, `BOT`. | +| Pull Control | Fait / à fignoler | Mini-frame MainBar + bridge `RUN~COMBAT`, séquences de commandes, scopes et presets. | -### Dernier lot terminé : RTI / Target Icons +--- + +## Dernier lot terminé : Pull Control -Le système RTI a été intégré en mode bridge-first/chatless pour les usages UI. Les commandes manuelles playerbots restent utilisables séparément dans le chat. +Le panneau `Pull Control` a été ajouté comme mini-frame ouverte depuis la MainBar. Il utilise le bridge et ne repose pas sur le parsing chat automatique. Fonctionnalités terminées : -- endpoint addon -> bridge `RUN~RTI~~~~` ; -- validation serveur des commandes RTI autorisées ; +- bouton `Pull Control` ajouté dans l'ordre de la MainBar ; +- mini-frame dédiée au contrôle de pull ; - scopes supportés : - - `ALL` pour tous les bots ; - - `GROUP` avec groupe de raid ciblé ; - - `BOT` pour un bot précis ; -- commandes autorisées côté bridge : - - `rti ` ; - - `rti cc ` ; - - `attack rti target` ; + - `BOT` / Selected pour un bot ciblé ; + - `GROUP` / Party pour le groupe ; + - `ALL` / Raid pour tous les bots ; +- slider `wait for attack time` avec affichage de la valeur en secondes ; +- toggle `Wait` envoyant `wait for attack time X` ou `wait for attack time 0` ; +- toggle `Focus` envoyant `co +focus` / `co -focus` ; +- toggle `DPS Assist` envoyant `co +dps assist` / `co -dps assist` ; +- toggle `DPS AoE` envoyant `co +dps aoe` / `co -dps aoe` ; +- preset `Single Target` ; +- preset `AoE Pack` ; +- preset `Safe Pull` ; +- preset `Reset` ; +- actions RTI depuis la frame : - `pull rti target` ; -- panneau RTI global dans la barre Units ; -- bouton `All` à gauche du bouton RTI ; -- boutons groupes numérotés à droite du bouton RTI ; -- menu vertical vers le haut pour choisir l'icône RTI d'un scope ; -- remplacement visuel du bouton All/Groupe par l'icône RTI sélectionnée ; -- bouton/reset par défaut dans les menus RTI pour retirer l'icône mémorisée ; -- boutons `Attack` et `Pull` pour les RTI de groupe/global ; -- collapse/refermeture des everybars quand on ouvre un menu RTI ; -- bouton RTI dans chaque everybar de bot ; -- menu vertical vers le haut dans chaque everybar pour choisir l'icône RTI du bot ; -- remplacement visuel du bouton RTI du bot par l'icône choisie ; -- reset visuel correct vers l'icône par défaut ; -- mémoire d'affichage des RTI bot quand on ferme/réouvre la barre Units ; -- bouton d'action RTI personnel dans la main bar, placé à gauche de `Attaque Tank` ; -- menu vertical `Attaquer` / `Pull` pour envoyer en batch tous les bots ayant une RTI personnelle mémorisée ; -- tooltips RTI passés en variables AceLocale ; -- traductions RTI ajoutables dans les fichiers locale. + - `attack rti target` ; +- endpoint bridge `RUN~COMBAT~~~~` ; +- validation serveur des commandes de combat autorisées ; +- routage serveur vers les bots selon le scope ; +- correction compilation liée à la résolution du scope combat ; +- commandes testées en jeu avec réception bridge visible côté serveur. + +À fignoler plus tard : + +- ajustement visuel définitif de la mini-frame si nécessaire ; +- harmonisation finale de tous les textes hardcodés restants vers AceLocale ; +- vérification de chaque preset en conditions réelles donjon/raid ; +- éventuelle sauvegarde persistante du dernier scope et de la dernière valeur de wait. Notes fonctionnelles importantes : -- `rti ` ou `rti cc ` ne doit servir qu'à mémoriser l'icône RTI que le bot ou le groupe doit focus. -- `attack rti target` et `pull rti target` consomment ensuite cette configuration pour déclencher l'action. -- Pour éviter les attaques involontaires, l'UI ne doit pas poser de marque sur un mob : elle configure seulement l'icône préférée côté bots. -- Si `skull` déclenche un comportement automatique côté playerbots selon configuration/stratégie, éviter d'utiliser le crâne comme icône par défaut visuelle dans l'UI. +- Les commandes `co ?`, `nc ?`, `ss ?` restent manuelles et ne doivent pas devenir une source de parsing automatique. +- Le fait qu'une stratégie apparaisse ou non dans `co ?` dépend du nom exact réellement reconnu côté playerbots. Pour le Pull Control, on garde les noms qui ont été validés via bridge/serveur. +- `wait for attack time X` n'est pas une stratégie `co`, donc il ne faut pas attendre qu'elle apparaisse forcément dans `co ?`. --- @@ -105,8 +109,8 @@ Le système RTI est très utile pour contrôler les bots en donjon/raid : | `rti diamond` | Fait | Haute | Sélecteur RTI All/Groupe/Bot | | `rti moon` | Fait | Haute | Sélecteur RTI All/Groupe/Bot | | `rti cc ` | Fait côté bridge | Haute | Commande autorisée, UI CC à réévaluer si besoin dédié | -| `attack rti target` | Fait | Haute | Bouton Attack global/groupe + bouton batch bots personnels | -| `pull rti target` | Fait | Haute | Bouton Pull global/groupe + bouton batch bots personnels | +| `attack rti target` | Fait | Haute | Bouton Attack global/groupe + bouton batch bots personnels + Pull Control | +| `pull rti target` | Fait | Haute | Bouton Pull global/groupe + bouton batch bots personnels + Pull Control | ### Flux bridge final @@ -149,13 +153,14 @@ RUN~RTI~BOT~Dollu~~attack rti target #### Main bar ```text -[Bot RTI Action] [Attaque Tank] - └─ Attaquer - └─ Pull +[Bot RTI Action] [Pull Control] [Attaque Tank] + └─ Bot RTI Action : Attaquer / Pull pour les bots ayant une RTI personnelle + └─ Pull Control : mini-frame de pull, wait, focus, assist, AoE et actions RTI ``` - `Attaquer` envoie `attack rti target` à tous les bots ayant une RTI personnelle mémorisée. - `Pull` envoie `pull rti target` à tous les bots ayant une RTI personnelle mémorisée. +- `Pull Control` permet d'envoyer les mêmes actions RTI avec un scope choisi. --- @@ -163,70 +168,99 @@ RUN~RTI~BOT~Dollu~~attack rti target ### Statut -**Partiellement fait grâce à RTI.** -Les actions `attack rti target` et `pull rti target` sont intégrées. Le vrai panneau `Pull Control` reste à faire pour les stratégies et temporisations. - -### Pourquoi +**Terminé côté MultiBot + bridge, à fignoler côté UX uniquement.** -Les pulls propres demandent plusieurs commandes combinées. Une UI dédiée éviterait les macros manuelles. +Le panneau dédié existe et couvre les commandes principales de pull propre. Les actions RTI restent aussi disponibles via les boutons RTI existants. -### Commandes à couvrir +### Commandes couvertes -| Commande playerbots | Statut MultiBot | Priorité | Proposition UI | +| Commande playerbots | Statut MultiBot | Priorité | UI actuelle | |---|---:|---:|---| -| `pull rti target` | Fait | Haute | Bouton Pull RTI global/groupe/bot personnel | -| `attack rti target` | Fait | Haute | Bouton Attack RTI global/groupe/bot personnel | -| `wait for attack time ` | Manquant | Haute | Champ numérique 0-10 sec | -| `co +focus` / `co -focus` | Manquant ou non exposé clairement | Haute | Toggle Focus | -| `co -aoe` / `co +aoe` | Partiel | Haute | Toggle AoE during pull | -| `co +assist` | Partiel | Haute | Toggle Assist | -| `co +tank assist` | Partiel | Moyenne | Toggle Tank Assist | +| `pull rti target` | Fait | Haute | Bouton Pull RTI global/groupe/bot personnel + Pull Control | +| `attack rti target` | Fait | Haute | Bouton Attack RTI global/groupe/bot personnel + Pull Control | +| `wait for attack time ` | Fait | Haute | Slider 0-10 sec + toggle Wait | +| `co +focus` / `co -focus` | Fait | Haute | Toggle Focus + presets | +| `co +dps aoe` / `co -dps aoe` | Fait | Haute | Toggle DPS AoE + presets | +| `co +dps assist` / `co -dps assist` | Fait | Haute | Toggle DPS Assist + presets | +| `co +tank assist` | Non exposé dans Pull Control | Moyenne | Déjà couvert ailleurs par les contrôles tank/assist existants, à réévaluer si doublon utile | -### Proposition UI restante +### UX actuelle -Créer une section `Pull Control` : +```text +MainBar +└─ Pull Control + ├─ Scope: Selected / Party / Raid + ├─ Wait slider 0-10s avec valeur affichée + ├─ Toggles: Wait, Focus, DPS Assist, DPS AoE + ├─ Presets: Single Target, AoE Pack, Safe Pull, Reset + └─ Actions: Pull RTI Target, Attack RTI Target +``` -| Option UI | Commande | -|---|---| -| Wait before attack | `wait for attack time X` | -| Single target pull | `co +focus,-aoe,+assist` | -| Enable AoE again | `co +aoe,-focus` | -| Attack RTI target | Déjà fait via RTI | -| Pull RTI target | Déjà fait via RTI | -| Tank assist | `co +tank assist` | +### Flux bridge final + +```text +RUN~COMBAT~BOT~Sahkaal~~co +focus +RUN~COMBAT~GROUP~~~co +dps assist +RUN~COMBAT~ALL~~~co +dps aoe +RUN~COMBAT~GROUP~~~wait for attack time 3 +``` ### Notes -Cette section peut envoyer plusieurs commandes en séquence. -Il faudra éviter les retours chat automatiques inutiles. +- Le panneau peut envoyer plusieurs commandes en séquence pour les presets. +- Les retours chat automatiques restent évités. +- Le test fonctionnel principal est le comportement des bots en combat/pull, pas uniquement l'affichage dans `co ?`. --- ## Priorité 3 - Stratégies combat avancées +### Statut + +**Prochaine étape logique.** + +Pull Control a posé la base technique : l'addon sait maintenant envoyer des commandes combat simples via `RUN~COMBAT`. La suite naturelle est donc d'exposer les stratégies combat utiles qui ne sont pas strictement liées au pull. + ### Pourquoi -Ces stratégies existent côté playerbots mais ne sont pas toutes exposées clairement dans MultiBot. Elles ont une vraie utilité en raid/donjon. +Ces stratégies existent côté playerbots mais ne sont pas toutes exposées clairement dans MultiBot. Elles ont une vraie utilité en raid/donjon, mais ne doivent pas encombrer la MainBar. ### Commandes à couvrir | Stratégie | Commande | Statut MultiBot | Priorité | Intérêt | |---|---|---:|---:|---| -| Focus | `co +focus` / `co -focus` | Manquant | Haute | Focus mono-cible | -| Avoid AoE | `co +avoid aoe` / `co -avoid aoe` | À vérifier | Haute | Évite les AoE dangereuses | -| Save Mana | `co +save mana` / `co -save mana` | Manquant | Haute | Gestion mana healers | -| Threat | `co +threat` / `co -threat` | Manquant | Haute | Réduit la prise d'aggro | -| Tank Face | `co +tank face` / `co -tank face` | Manquant | Moyenne | Gestion cleave/breath | -| Behind | `co +behind` / `co -behind` | Manquant | Moyenne | Placement melee | -| Healer DPS | `co +healer dps` / `co -healer dps` | À vérifier | Moyenne | DPS des healers hors danger | +| Avoid AoE | `co +avoid aoe` / `co -avoid aoe` | À vérifier / probablement partiel | Haute | Évite les AoE dangereuses | +| Save Mana | `co +save mana` / `co -save mana` | Manquant | Haute | Gestion mana healers/casters | +| Threat | `co +threat` / `co -threat` | Manquant | Haute | Limite la prise d'aggro selon comportement playerbots | +| Tank Face | `co +tank face` / `co -tank face` | Manquant | Moyenne | Gestion orientation tank, cleaves, breaths | +| Behind | `co +behind` / `co -behind` | Manquant ou déjà visible selon states | Moyenne | Placement melee derrière la cible | +| Healer DPS | `co +healer dps` / `co -healer dps` | À vérifier | Moyenne | Autorise/interdit le DPS des healers | | Boost | `co +boost` / `co -boost` | Probablement partiel | Moyenne | Burst cooldowns | -| Wait for attack | `wait for attack time X` | Manquant | Haute | Pull contrôlé | +| Focus | `co +focus` / `co -focus` | Fait via Pull Control | Référence | Focus mono-cible | +| DPS Assist | `co +dps assist` / `co -dps assist` | Fait via Pull Control | Référence | Assist DPS | +| DPS AoE | `co +dps aoe` / `co -dps aoe` | Fait via Pull Control | Référence | Autorise AoE DPS | +| Wait for attack | `wait for attack time X` | Fait via Pull Control | Référence | Pull contrôlé | ### Proposition UI -Créer une page `Advanced Combat` ou ajouter un panneau repliable dans les stratégies. +Créer une page ou mini-frame `Advanced Combat`, séparée de Pull Control : + +```text +Combat Strategies +├─ Scope: Selected / Party / Raid +├─ Survivability: Avoid AoE, Threat +├─ Positioning: Behind, Tank Face +├─ Resource: Save Mana +├─ Damage policy: Healer DPS, Boost +└─ Apply toggles via RUN~COMBAT +``` + +Recommandation UX : -Ne pas afficher tous les boutons dans la barre principale pour éviter de surcharger l'interface. +- ne pas ajouter ces toggles directement sur la MainBar ; +- créer un panneau repliable ou une sous-page accessible depuis un bouton existant de stratégies/combat ; +- réutiliser les scopes `BOT`, `GROUP`, `ALL` déjà validés par Pull Control ; +- garder `co ?` comme vérification manuelle, sans parser automatiquement son retour. --- @@ -252,13 +286,17 @@ Disperse distance: [ 8 ] yards [Apply] [Disable] ``` +### Note + +À faire après `Advanced Combat`, sauf si un besoin immédiat de mécaniques AoE impose de le passer avant. + --- ## Priorité 5 - Loot Rules / Loot List ### Pourquoi -Le contrôle du loot est utile, mais moins prioritaire que RTI/pull. +Le contrôle du loot est utile, mais moins prioritaire que RTI/pull/combat. ### Commandes à couvrir @@ -406,9 +444,9 @@ Ces commandes sont plutôt serveur/admin/debug ou trop dangereuses pour une UI u | Ordre | Sujet | Type | Priorité | Statut | |---:|---|---|---:|---:| | 1 | RTI bridge-first | UI + bridge command | Haute | Fait | -| 2 | Pull Control avancé | Nouvelle UI + séquences commandes | Haute | À faire | -| 3 | Advanced Combat Strategies | UI toggles | Haute/Moyenne | À faire | -| 4 | Disperse | Petite UI | Moyenne | À faire | +| 2 | Pull Control avancé | Nouvelle UI + séquences commandes | Haute | Fait / à fignoler | +| 3 | Advanced Combat Strategies | UI toggles réutilisant `RUN~COMBAT` | Haute/Moyenne | Prochaine étape | +| 4 | Disperse | Petite UI + commande combat/mouvement | Moyenne | À faire | | 5 | Loot Rules | Petite UI profils | Moyenne | À faire | | 6 | Trainer / Maintenance extras | UI maintenance | Moyenne/Basse | À faire | | 7 | Items avancés | Extensions inventaire | Basse/Moyenne | À faire | @@ -420,8 +458,19 @@ Ces commandes sont plutôt serveur/admin/debug ou trop dangereuses pour une UI u - Toute nouvelle commande utilisée automatiquement par l'addon devrait passer par le bridge quand possible. - Les commandes manuelles informatives doivent rester fonctionnelles en whisper/party/raid. - Ne pas réintroduire de parsing chat automatique pour peupler l'UI. -- Pour les commandes qui ne nécessitent aucun retour structuré, un endpoint générique de type `RUN~COMMAND` ou un endpoint spécialisé comme `RUN~RTI` peut suffire. +- Pour les commandes qui ne nécessitent aucun retour structuré, un endpoint générique de type `RUN~COMMAND` ou un endpoint spécialisé comme `RUN~RTI` / `RUN~COMBAT` peut suffire. - Pour les commandes qui doivent alimenter une frame, préférer un endpoint structuré dédié. - Les commandes serveur/admin ne doivent pas être exposées dans l'addon utilisateur. - Les boutons ajoutés dans les barres doivent conserver une position cohérente avec `MultiBotLeftCoreUI.lua` et la position par défaut de `MultiBar` dans `MultiBotInit.lua` / reset dans `MultiBotMainUI.lua`. -- Les tooltips nouvellement ajoutés doivent passer par AceLocale, comme les tooltips RTI. +- Les tooltips nouvellement ajoutés doivent passer par AceLocale, comme les tooltips RTI et Pull Control. +- `RUN~COMBAT` doit rester whitelisté côté bridge : ne pas en faire un exécuteur libre de n'importe quelle commande chat. + +--- + +## Point logique suivant + +Le prochain bloc logique est **Advanced Combat Strategies**. + +Raison : `RUN~COMBAT` existe maintenant, les scopes sont validés, et Pull Control a déjà prouvé que l'addon peut envoyer proprement des toggles de stratégie sans spam chat. Le plus rentable est donc d'ajouter une UI dédiée aux stratégies combat permanentes ou semi-permanentes : `avoid aoe`, `save mana`, `threat`, `behind`, `tank face`, `healer dps`, `boost`. + +Ce bloc doit rester séparé de Pull Control : Pull Control sert aux séquences de pull, tandis qu'Advanced Combat sert aux comportements généraux des bots pendant les combats.