Skip to content
This repository was archived by the owner on May 13, 2026. It is now read-only.
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
25 changes: 15 additions & 10 deletions Core/MultiBotEngine.lua
Original file line number Diff line number Diff line change
Expand Up @@ -267,13 +267,18 @@ MultiBot.toTip = function(pClass, pLevel, pName)
end

MultiBot.toPoint = function(pFrame)
-- Mesurer par rapport au parent global stable et arrondir à l’unité.
local uiRight = (UIParent and UIParent:GetRight()) or GetScreenWidth()
local xRight = pFrame:GetRight() or 0
local yBottom = pFrame:GetBottom() or 0
-- Offset vers BOTTOMRIGHT (négatif ou nul)
local offX = xRight - uiRight
local offY = yBottom
if not pFrame then
return 0, 0
end
-- Mesurer par rapport au parent global stable et arrondir à l’unité.
local uiRight = (UIParent and UIParent:GetRight()) or GetScreenWidth()
local getRight = pFrame.GetRight or pFrame.getRight
local getBottom = pFrame.GetBottom or pFrame.getBottom
local xRight = (type(getRight) == "function" and getRight(pFrame)) or 0
local yBottom = (type(getBottom) == "function" and getBottom(pFrame)) or 0
-- Offset vers BOTTOMRIGHT (négatif ou nul)
local offX = xRight - uiRight
local offY = yBottom
-- Arrondi au plus proche pour éviter la dérive cumulée
return math.floor(offX + 0.5), math.floor(offY + 0.5)
end
Expand Down Expand Up @@ -1472,15 +1477,15 @@ function MultiBot.BindShiftRightSwapButtons(host, contextKey, entries)
state.previewTarget = nil
applySelectionVisuals()
if(UIErrorsFrame) then
UIErrorsFrame:AddMessage("Swap source: " .. (entryRec.id or entryRec.name), 1, 0.82, 0, 1)
UIErrorsFrame:AddMessage(MultiBot.L("ui.swap.source_prefix") .. (entryRec.id or entryRec.name), 1, 0.82, 0, 1)
end
return
end

if(state.selected == entryRec) then
clearSelectionState()
if(UIErrorsFrame) then
UIErrorsFrame:AddMessage("Swap annulé.", 1, 0.25, 0.25, 1)
UIErrorsFrame:AddMessage(MultiBot.L("ui.swap.cancelled"), 1, 0.25, 0.25, 1)
end
return
end
Expand All @@ -1506,7 +1511,7 @@ function MultiBot.BindShiftRightSwapButtons(host, contextKey, entries)
applySelectionVisuals()
if(UIErrorsFrame and state.previewTarget ~= entryRec) then
state.previewTarget = entryRec
UIErrorsFrame:AddMessage("Aperçu swap: " .. (state.selected.id or state.selected.name) .. " <-> " .. (entryRec.id or entryRec.name), 1, 1, 0.4, 1)
UIErrorsFrame:AddMessage(MultiBot.L("ui.swap.preview_prefix") .. (state.selected.id or state.selected.name) .. " <-> " .. (entryRec.id or entryRec.name), 1, 1, 0.4, 1)
end
end
end)
Expand Down
2 changes: 1 addition & 1 deletion Core/MultiBotHandler.lua
Original file line number Diff line number Diff line change
Expand Up @@ -1531,7 +1531,7 @@ function MultiBot.HandleMultiBotEvent(event, ...)

-- On ne traite que les réponses commençant par "Glyphs:" ou "No glyphs"
if not rawMsg:match("^[Gg]lyphs:") and not rawMsg:match("^[Nn]o glyphs") then
DEFAULT_CHAT_FRAME:AddMessage("|cff66ccff[ERROR]|r Ignored non-glyphs msg")
DEFAULT_CHAT_FRAME:AddMessage("|cff66ccff[ERROR]|r " .. MultiBot.L("talent.glyphs.error_ignored_non_glyph"))
return
end

Expand Down
44 changes: 44 additions & 0 deletions Locales/MultiBotAceLocale-deDE.lua
Original file line number Diff line number Diff line change
Expand Up @@ -192,6 +192,50 @@ local deDEValues = {
["tips.units.inviteRaid25"] = "25er Raid\n|cffffffffMit dieser Schaltfläche füllt man sein Raid auf.\nDiese Funktion nimmt Einheiten vom aktuellen Roster und ignoriert dabei den Klassen-Filter.\nSie hält am Ende des Rosters oder sobald die Gruppe 25 Mitglieder hat.|r\n\n|cffff0000Linksklicken um Raid-Mitglieder einzuladen|r\n|cff999999(Ausführreihenfolge: System)|r",
["tips.units.inviteRaid40"] = "40er Raid\n|cffffffffMit dieser Schaltfläche füllt man sein Raid auf.\nDiese Funktion nimmt Einheiten vom aktuellen Roster und ignoriert dabei den Klassen-Filter.\nSie hält am Ende des Rosters oder sobald die Gruppe 40 Mitglieder hat.|r\n\n|cffff0000Linksklicken um Raid-Mitglieder einzuladen|r\n|cff999999(Ausführreihenfolge: System)|r",
["tips.units.alliance"] = "Alle PlayerBots ein-/ausloggen\n|cffffffffLoggt alle PlayerBots ein oder aus, auf die du Zugriff hast.\nDiese Funktion kann je nach Gesamtanzahl der PlayerBots einige Zeit benötigen,\num die Buttonleisten für jeden PlayerBot zu laden.\n\n|cffff0000Linksklick, um alle PlayerBots einzuloggen|r\n|cff999999(Ausgeführt von: System)|r\n\n|cffff0000Rechtsklick, um alle PlayerBots auszuloggen|r\n|cff999999(Ausgeführt von: System)|r",
["options.minimap.explainer"] = "Blendet den MultiBot-Minimap-Button ein oder aus.",
["options.layout.lock_mainbar"] = "Bewegung der Hauptleiste sperren",
["options.layout.lock_mainbar_desc"] = "Aktiviert: Strg + Rechtsklick zum Verschieben der Leiste. Deaktiviert: Rechtsklick genügt.",
["options.layout.owner_import"] = "Spieler-Layout zum Importieren",
["options.layout.export"] = "Layout exportieren",
["options.layout.import"] = "Layout importieren",
["options.layout.delete"] = "Layout löschen",
["options.layout.refresh"] = "Liste aktualisieren",
["options.layout.reset"] = "Layout zurücksetzen",
["options.layout.none"] = "Kein Layout",
["options.layout.error_no_layout_to_import"] = "Kein gespeichertes Layout zum Importieren.",
["options.layout.error_no_layout_to_delete"] = "Kein Layout zum Löschen ausgewählt.",
["options.layout.error_delete_unavailable"] = "Löschen nicht verfügbar.",
["options.layout.list_refreshed"] = "Layoutliste aktualisiert.",
["options.layout.error_reset_unavailable"] = "Zurücksetzen des Layouts nicht verfügbar.",
["options.layout.error_reset_failed"] = "Zurücksetzen des Layouts fehlgeschlagen.",
["options.layout.saved"] = "Layout gespeichert: %s",
["options.layout.error_export_failed"] = "Export fehlgeschlagen: %s",
["options.layout.imported"] = "Layout importiert: %s (%s Einträge)",
["options.layout.error_import_failed"] = "Import fehlgeschlagen: %s",
["options.layout.deleted"] = "Layout gelöscht: %s",
["options.layout.error_delete_failed"] = "Löschen fehlgeschlagen: %s",
["options.layout.reset_done"] = "Layout zurückgesetzt (%s Schlüssel).",
["options.tabs.minimap"] = "Minikarte",
["options.tabs.layout"] = "Layout",
["options.tabs.strata"] = "Strata",
["options.tabs.intervals"] = "Intervalle",
["mainbar.swap.locked"] = "Leiste gesperrt: Halte Strg + Rechtsklick zum Verschieben.",
["mainbar.swap.source_prefix"] = "Hauptleiste: Quelle = ",
["mainbar.swap.cancelled"] = "Hauptleiste: Tausch abgebrochen.",
["mainbar.swap.preview_prefix"] = "Hauptleiste: ",
["pvp.stats.error_select_bot"] = "Wähle zuerst ein Bot‑Ziel aus.",
["pvp.stats.error_not_in_group"] = "Du bist nicht in einer Gruppe.",
["pvp.stats.error_not_in_raid"] = "Du bist nicht in einem Schlachtzug.",
["ui.swap.source_prefix"] = "Tauschquelle: ",
["ui.swap.cancelled"] = "Tausch abgebrochen.",
["ui.swap.preview_prefix"] = "Tauschvorschau: ",
["talent.glyphs.waiting"] = "Warte auf Glyphen…",
["talent.glyphs.debug_prefix"] = "Glyphen‑Payload => ",
["talent.glyphs.error_ignored_non_glyph"] = "Nicht‑Glyphen‑Nachricht ignoriert",
["inventory.mode.sell"] = "Verkaufen",
["spellbook.rank"] = "Rang",
["spellbook.title"] = "Titel",
["quests.none"] = "Keine Quests",
["tips.sliders.throttleinstalled"] = "MultiBot-Drossel installiert",
["tips.sliders.frametitle"] = "MultiBot — Optionen",
["tips.sliders.actionsinter"] = "Intervalle für automatische Aktionen",
Expand Down
44 changes: 44 additions & 0 deletions Locales/MultiBotAceLocale-enGB.lua
Original file line number Diff line number Diff line change
Expand Up @@ -194,6 +194,50 @@ local enGBValues = {
["tips.units.inviteRaid25"] = "25-Man Raid Group\n|cffffffffFills your Raid Group with up to 25 PlayerBots.\nPlayerBots are added from the selected Roster, ignoring any Class filters.|r\n\n|cffff0000Left-click to activate.|r\n|cff999999(Executed by: System)|r",
["tips.units.inviteRaid40"] = "40-Man Raid Group\n|cffffffffFills your Raid Group with up to 40 PlayerBots.\nPlayerBots are added from the selected Roster, ignoring any Class filters.|r\n\n|cffff0000Left-click to activate.|r\n|cff999999(Executed by: System)|r",
["tips.units.alliance"] = "Log In/Out All PlayerBots\n|cffffffffLog in/Out all PlayerBots you have access to.\nThis function will take time to populate the ButtonBars for each PlayerBot, depending on the number of PlayerBots total.\n\n|cffff0000Left-click to log in all PlayerBots|r\n|cff999999(Executed by: System)|r\n\n|cffff0000Right-click to log out all PlayerBots|r\n|cff999999(Executed by: System)|r",
["options.minimap.explainer"] = "Hide or show the MultiBot minimap button.",
["options.layout.lock_mainbar"] = "Lock main bar movement",
["options.layout.lock_mainbar_desc"] = "Checked: Ctrl + right-click to move the bar. Unchecked: right-click is enough.",
["options.layout.owner_import"] = "Player layout to import",
["options.layout.export"] = "Export layout",
["options.layout.import"] = "Import layout",
["options.layout.delete"] = "Delete layout",
["options.layout.refresh"] = "Refresh list",
["options.layout.reset"] = "Reset layout",
["options.layout.none"] = "No layout",
["options.layout.error_no_layout_to_import"] = "No saved layout to import.",
["options.layout.error_no_layout_to_delete"] = "No layout selected to delete.",
["options.layout.error_delete_unavailable"] = "Delete unavailable.",
["options.layout.list_refreshed"] = "Layout list refreshed.",
["options.layout.error_reset_unavailable"] = "Layout reset unavailable.",
["options.layout.error_reset_failed"] = "Layout reset failed.",
["options.layout.saved"] = "Layout saved: %s",
["options.layout.error_export_failed"] = "Export failed: %s",
["options.layout.imported"] = "Layout imported: %s (%s entries)",
["options.layout.error_import_failed"] = "Import failed: %s",
["options.layout.deleted"] = "Layout deleted: %s",
["options.layout.error_delete_failed"] = "Delete failed: %s",
["options.layout.reset_done"] = "Layout reset (%s keys).",
["options.tabs.minimap"] = "Minimap",
["options.tabs.layout"] = "Layout",
["options.tabs.strata"] = "Strata",
["options.tabs.intervals"] = "Intervals",
["mainbar.swap.locked"] = "Bar locked: hold Ctrl + right-click to move.",
["mainbar.swap.source_prefix"] = "MainBar: source = ",
["mainbar.swap.cancelled"] = "MainBar: swap cancelled.",
["mainbar.swap.preview_prefix"] = "MainBar: ",
["pvp.stats.error_select_bot"] = "Select a bot target first.",
["pvp.stats.error_not_in_group"] = "You are not in a group.",
["pvp.stats.error_not_in_raid"] = "You are not in a raid.",
["ui.swap.source_prefix"] = "Swap source: ",
["ui.swap.cancelled"] = "Swap cancelled.",
["ui.swap.preview_prefix"] = "Swap preview: ",
["talent.glyphs.waiting"] = "Waiting for glyphs…",
["talent.glyphs.debug_prefix"] = "Glyph payload => ",
["talent.glyphs.error_ignored_non_glyph"] = "Ignored non-glyphs message",
["inventory.mode.sell"] = "Sell",
["spellbook.rank"] = "Rank",
["spellbook.title"] = "Title",
["quests.none"] = "No quests",
["tips.sliders.throttleinstalled"] = "MultiBot throttle installed",
["tips.sliders.frametitle"] = "MultiBot — Options",
["tips.sliders.actionsinter"] = "Automatic action intervals",
Expand Down
44 changes: 44 additions & 0 deletions Locales/MultiBotAceLocale-enUS.lua
Original file line number Diff line number Diff line change
Expand Up @@ -194,6 +194,50 @@ local enUSValues = {
["tips.units.inviteRaid25"] = "25-Man Raid Group\n|cffffffffFills your Raid Group with up to 25 PlayerBots.\nPlayerBots are added from the selected Roster, ignoring any Class filters.|r\n\n|cffff0000Left-click to activate.|r\n|cff999999(Executed by: System)|r",
["tips.units.inviteRaid40"] = "40-Man Raid Group\n|cffffffffFills your Raid Group with up to 40 PlayerBots.\nPlayerBots are added from the selected Roster, ignoring any Class filters.|r\n\n|cffff0000Left-click to activate.|r\n|cff999999(Executed by: System)|r",
["tips.units.alliance"] = "Log In/Out All PlayerBots\n|cffffffffLog in/Out all PlayerBots you have access to.\nThis function will take time to populate the ButtonBars for each PlayerBot, depending on the number of PlayerBots total.\n\n|cffff0000Left-click to log in all PlayerBots|r\n|cff999999(Executed by: System)|r\n\n|cffff0000Right-click to log out all PlayerBots|r\n|cff999999(Executed by: System)|r",
["options.minimap.explainer"] = "Hide or show the MultiBot minimap button.",
["options.layout.lock_mainbar"] = "Lock main bar movement",
["options.layout.lock_mainbar_desc"] = "Checked: Ctrl + right-click to move the bar. Unchecked: right-click is enough.",
["options.layout.owner_import"] = "Player layout to import",
["options.layout.export"] = "Export layout",
["options.layout.import"] = "Import layout",
["options.layout.delete"] = "Delete layout",
["options.layout.refresh"] = "Refresh list",
["options.layout.reset"] = "Reset layout",
["options.layout.none"] = "No layout",
["options.layout.error_no_layout_to_import"] = "No saved layout to import.",
["options.layout.error_no_layout_to_delete"] = "No layout selected to delete.",
["options.layout.error_delete_unavailable"] = "Delete unavailable.",
["options.layout.list_refreshed"] = "Layout list refreshed.",
["options.layout.error_reset_unavailable"] = "Layout reset unavailable.",
["options.layout.error_reset_failed"] = "Layout reset failed.",
["options.layout.saved"] = "Layout saved: %s",
["options.layout.error_export_failed"] = "Export failed: %s",
["options.layout.imported"] = "Layout imported: %s (%s entries)",
["options.layout.error_import_failed"] = "Import failed: %s",
["options.layout.deleted"] = "Layout deleted: %s",
["options.layout.error_delete_failed"] = "Delete failed: %s",
["options.layout.reset_done"] = "Layout reset (%s keys).",
["options.tabs.minimap"] = "Minimap",
["options.tabs.layout"] = "Layout",
["options.tabs.strata"] = "Strata",
["options.tabs.intervals"] = "Intervals",
["mainbar.swap.locked"] = "Bar locked: hold Ctrl + right-click to move.",
["mainbar.swap.source_prefix"] = "MainBar: source = ",
["mainbar.swap.cancelled"] = "MainBar: swap cancelled.",
["mainbar.swap.preview_prefix"] = "MainBar: ",
["pvp.stats.error_select_bot"] = "Select a bot target first.",
["pvp.stats.error_not_in_group"] = "You are not in a group.",
["pvp.stats.error_not_in_raid"] = "You are not in a raid.",
["ui.swap.source_prefix"] = "Swap source: ",
["ui.swap.cancelled"] = "Swap cancelled.",
["ui.swap.preview_prefix"] = "Swap preview: ",
["talent.glyphs.waiting"] = "Waiting for glyphs…",
["talent.glyphs.debug_prefix"] = "Glyph payload => ",
["talent.glyphs.error_ignored_non_glyph"] = "Ignored non-glyphs message",
["inventory.mode.sell"] = "Sell",
["spellbook.rank"] = "Rank",
["spellbook.title"] = "Title",
["quests.none"] = "No quests",
["tips.sliders.throttleinstalled"] = "MultiBot throttle installed",
["tips.sliders.frametitle"] = "MultiBot — Options",
["tips.sliders.actionsinter"] = "Automatic action intervals",
Expand Down
44 changes: 44 additions & 0 deletions Locales/MultiBotAceLocale-esES.lua
Original file line number Diff line number Diff line change
Expand Up @@ -192,6 +192,50 @@ local esESValues = {
["tips.units.inviteRaid25"] = "Raid of Twenty-Five\n|cffffffffCon este botón puedes llenar tu banda de hasta 25 integrantes.\nEsta función toma unidades de la lista seleccionada, ignorando el filtro de clase.\nSe detiene al final de la lista o cuando la banda llega a 25 miembros.|r\n\n|cffff0000Clic izquierdo para invitar miembros de la banda|r\n|cff999999(Orden de ejecución: Sistema)|r",
["tips.units.inviteRaid40"] = "Raid of Forty\n|cffffffffCon este botón puedes llenar tu banda de hasta 40 integrantes.\nEsta función toma unidades de la lista seleccionada, ignorando el filtro de clase.\nSe detiene al final de la lista o cuando la banda llega a 40 miembros.|r\n\n|cffff0000Clic izquierdo para invitar miembros de la banda|r\n|cff999999(Orden de ejecución: Sistema)|r",
["tips.units.alliance"] = "Iniciar/Cerrar sesión de todos los PlayerBots\n|cffffffffInicia o cierra la sesión de todos los PlayerBots a los que tengas acceso.\nEsta función puede tardar en llenar las barras de botones de cada PlayerBot,\ndependiendo del número total de PlayerBots.\n\n|cffff0000Clic izquierdo para iniciar sesión en todos los PlayerBots|r\n|cff999999(Ejecutado por: Sistema)|r\n\n|cffff0000Clic derecho para cerrar sesión en todos los PlayerBots|r\n|cff999999(Ejecutado por: Sistema)|r",
["options.minimap.explainer"] = "Muestra u oculta el botón del minimapa de MultiBot.",
["options.layout.lock_mainbar"] = "Bloquear movimiento de la barra principal",
["options.layout.lock_mainbar_desc"] = "Marcado: Ctrl + clic derecho para mover la barra. Desmarcado: clic derecho suficiente.",
["options.layout.owner_import"] = "Layout de jugador para importar",
["options.layout.export"] = "Exportar diseño",
["options.layout.import"] = "Importar diseño",
["options.layout.delete"] = "Eliminar diseño",
["options.layout.refresh"] = "Actualizar lista",
["options.layout.reset"] = "Restablecer diseño",
["options.layout.none"] = "Sin diseño",
["options.layout.error_no_layout_to_import"] = "No hay ningún diseño guardado para importar.",
["options.layout.error_no_layout_to_delete"] = "No se ha seleccionado ningún diseño para eliminar.",
["options.layout.error_delete_unavailable"] = "Eliminación no disponible.",
["options.layout.list_refreshed"] = "Lista de diseños actualizada.",
["options.layout.error_reset_unavailable"] = "Restablecimiento del diseño no disponible.",
["options.layout.error_reset_failed"] = "Error al restablecer el diseño.",
["options.layout.saved"] = "Diseño guardado: %s",
["options.layout.error_export_failed"] = "Error al exportar: %s",
["options.layout.imported"] = "Diseño importado: %s (%s entradas)",
["options.layout.error_import_failed"] = "Error al importar: %s",
["options.layout.deleted"] = "Diseño eliminado: %s",
["options.layout.error_delete_failed"] = "Error al eliminar: %s",
["options.layout.reset_done"] = "Diseño restablecido (%s claves).",
["options.tabs.minimap"] = "Minimapa",
["options.tabs.layout"] = "Diseño",
["options.tabs.strata"] = "Estratos",
["options.tabs.intervals"] = "Intervalos",
["mainbar.swap.locked"] = "Barra bloqueada: mantén Ctrl + clic derecho para mover.",
["mainbar.swap.source_prefix"] = "Barra principal: origen = ",
["mainbar.swap.cancelled"] = "Barra principal: intercambio cancelado.",
["mainbar.swap.preview_prefix"] = "Barra principal: ",
["pvp.stats.error_select_bot"] = "Selecciona primero un bot como objetivo.",
["pvp.stats.error_not_in_group"] = "No estás en un grupo.",
["pvp.stats.error_not_in_raid"] = "No estás en una banda.",
["ui.swap.source_prefix"] = "Origen del intercambio: ",
["ui.swap.cancelled"] = "Intercambio cancelado.",
["ui.swap.preview_prefix"] = "Vista previa del intercambio: ",
["talent.glyphs.waiting"] = "Esperando glifos…",
["talent.glyphs.debug_prefix"] = "Carga de glifos => ",
["talent.glyphs.error_ignored_non_glyph"] = "Mensaje no relacionado con glifos ignorado",
["inventory.mode.sell"] = "Vender",
["spellbook.rank"] = "Rango",
["spellbook.title"] = "Título",
["quests.none"] = "Sin misiones",
["tips.sliders.throttleinstalled"] = "Limitador de MultiBot instalado",
["tips.sliders.frametitle"] = "MultiBot — Opciones",
["tips.sliders.actionsinter"] = "Intervalos de acciones automáticas",
Expand Down
Loading
Loading