Skip to content

Commit cd5bbdd

Browse files
Merge pull request #15 from Wishmaster117/Add-bridge-based-profession-recipe-crafting-UI
Add bridge-based profession recipe crafting UI
2 parents 87f8fcc + 0f42497 commit cd5bbdd

12 files changed

Lines changed: 459 additions & 33 deletions

Core/MultiBotComm.lua

Lines changed: 78 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -121,6 +121,8 @@ local function ensureBridgeState()
121121
state.professionRecipes = state.professionRecipes or {}
122122
state.professionRecipeSeq = state.professionRecipeSeq or 0
123123
state.professionRecipeActive = state.professionRecipeActive or nil
124+
state.professionRecipeCraftSeq = state.professionRecipeCraftSeq or 0
125+
state.professionRecipeCrafts = state.professionRecipeCrafts or {}
124126
state.outfitSeq = state.outfitSeq or 0
125127
state.outfitActive = state.outfitActive or nil
126128
state.outfitCommands = state.outfitCommands or {}
@@ -622,6 +624,35 @@ function Comm.RequestProfessionRecipes(name, skillId)
622624
return true
623625
end
624626

627+
function Comm.RunProfessionRecipeCraft(name, skillId, spellId, itemId)
628+
local state = ensureBridgeState()
629+
name = trim(name)
630+
skillId = tonumber(skillId or 0) or 0
631+
spellId = tonumber(spellId or 0) or 0
632+
itemId = tonumber(itemId or 0) or 0
633+
if name == "" or skillId <= 0 or spellId <= 0 or itemId < 0 or not state.connected then
634+
return false
635+
end
636+
637+
state.professionRecipeCraftSeq = (tonumber(state.professionRecipeCraftSeq) or 0) + 1
638+
local token = tostring(math.floor(safeNow() * 1000)) .. "-craft-" .. tostring(state.professionRecipeCraftSeq)
639+
state.professionRecipeCrafts[token] = {
640+
botName = name,
641+
botNameKey = string.lower(name),
642+
skillId = skillId,
643+
spellId = spellId,
644+
itemId = itemId,
645+
startedAt = safeNow(),
646+
}
647+
648+
if not Comm.Send("RUN", "CRAFT_RECIPE~" .. name .. "~" .. token .. "~" .. skillId .. "~" .. spellId .. "~" .. itemId) then
649+
state.professionRecipeCrafts[token] = nil
650+
return false
651+
end
652+
653+
return token
654+
end
655+
625656
function Comm.MarkDisconnected(reason)
626657
local state = ensureBridgeState()
627658
state.connected = false
@@ -632,6 +663,7 @@ function Comm.MarkDisconnected(reason)
632663
state.spellbookActive = nil
633664
state.botSkillActive = nil
634665
state.professionRecipeActive = nil
666+
state.professionRecipeCrafts = {}
635667
state.outfitActive = nil
636668
state.outfitCommands = {}
637669
end
@@ -1411,6 +1443,45 @@ function Comm.ApplyOutfitCommandPayload(payload)
14111443
return true
14121444
end
14131445

1446+
function Comm.ApplyProfessionRecipeCraftPayload(payload)
1447+
local botName, rest = splitOnce(payload or "", "~")
1448+
local token, rest2 = splitOnce(rest or "", "~")
1449+
local skillId, rest3 = splitOnce(rest2 or "", "~")
1450+
local spellId, rest4 = splitOnce(rest3 or "", "~")
1451+
local itemId, rest5 = splitOnce(rest4 or "", "~")
1452+
local result, reason = splitOnce(rest5 or "", "~")
1453+
1454+
botName = trim(urlDecodeField(botName))
1455+
token = trim(token)
1456+
skillId = tonumber(skillId or "0") or 0
1457+
spellId = tonumber(spellId or "0") or 0
1458+
itemId = tonumber(itemId or "0") or 0
1459+
result = trim(result)
1460+
reason = trim(urlDecodeField(reason))
1461+
1462+
local state = ensureBridgeState()
1463+
local command = state.professionRecipeCrafts and state.professionRecipeCrafts[token] or nil
1464+
if not command then
1465+
return false
1466+
end
1467+
1468+
command.botName = botName ~= "" and botName or command.botName
1469+
command.botNameKey = string.lower(command.botName or "")
1470+
command.skillId = skillId > 0 and skillId or command.skillId
1471+
command.spellId = spellId > 0 and spellId or command.spellId
1472+
command.itemId = itemId >= 0 and itemId or command.itemId
1473+
command.result = result
1474+
command.reason = reason
1475+
1476+
if MultiBot.OnBridgeProfessionRecipeCraftResult then
1477+
MultiBot.OnBridgeProfessionRecipeCraftResult(command.botName, command.skillId, command.spellId, command.itemId, result, reason, command)
1478+
end
1479+
1480+
state.professionRecipeCrafts[token] = nil
1481+
debugPrint("ADDON:RX", "PROFESSION_RECIPE_CRAFT", command.botName, command.skillId, command.spellId, result, reason)
1482+
return true
1483+
end
1484+
14141485
function Comm.ApplyGlyphsBeginPayload(payload)
14151486
local botName, token = splitOnce(payload or "", "~")
14161487
botName = trim(urlDecodeField(botName))
@@ -2160,6 +2231,12 @@ function Comm.HandleAddonMessage(prefix, message, distribution, sender)
21602231
return true
21612232
end
21622233

2234+
if opcode == "PROFESSION_RECIPE_CRAFT" then
2235+
state.connected = true
2236+
state.lastError = nil
2237+
return Comm.ApplyProfessionRecipeCraftPayload(payload)
2238+
end
2239+
21632240
if opcode == "RTI_ACK" then
21642241
state.connected = true
21652242
state.lastError = nil
@@ -2289,6 +2366,7 @@ function Comm.OnPlayerEnteringWorld()
22892366
state.botSkillActive = nil
22902367
state.professionRecipes = {}
22912368
state.professionRecipeActive = nil
2369+
state.professionRecipeCrafts = {}
22922370
state.outfitActive = nil
22932371
state.outfitCommands = {}
22942372
Comm.MarkDisconnected(nil)

Locales/MultiBotAceLocale-deDE.lua

Lines changed: 28 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -46,6 +46,33 @@ local deDEValues = {
4646
["character.info"] = "Charakterinformationen",
4747
["character.skills"] = "Fertigkeiten",
4848
["profession.recipes.loading"] = "Wird geladen...",
49+
["profession.recipes.craft"] = "Herstellen",
50+
["profession.recipes.craft.tooltip"] = "Fordert den Bot auf, dieses Rezept einmal herzustellen.",
51+
["profession.recipes.craft.pending"] = "Herstellung angefordert...",
52+
["profession.recipes.craft.ok"] = "Herstellung gestartet.",
53+
["profession.recipes.craft.failed"] = "Herstellungsanfrage fehlgeschlagen.",
54+
["profession.recipes.craft.err"] = "Herstellung fehlgeschlagen: %s",
55+
["profession.recipes.craft.reason.NO_BOT"] = "Bot nicht gefunden.",
56+
["profession.recipes.craft.reason.NO_AI"] = "Bot-KI nicht verfügbar.",
57+
["profession.recipes.craft.reason.BAD_REQUEST"] = "Ungültige Rezeptanfrage.",
58+
["profession.recipes.craft.reason.UNKNOWN_RECIPE"] = "Rezept ist diesem Bot nicht bekannt.",
59+
["profession.recipes.craft.reason.SKILL_MISMATCH"] = "Rezept passt nicht zu diesem Beruf.",
60+
["profession.recipes.craft.reason.BAD_RECIPE"] = "Ungültiges Rezept.",
61+
["profession.recipes.craft.reason.ITEM_MISMATCH"] = "Rezeptergebnis stimmt nicht überein.",
62+
["profession.recipes.craft.reason.NO_MATERIALS"] = "Materialien fehlen.",
63+
["profession.recipes.craft.reason.REQUIRES_SPELL_FOCUS"] = "Benötigte Handwerksstation nicht in der Nähe.",
64+
["profession.recipes.craft.reason.REQUIRES_SPELL_FOCUS.cooking"] = "Du musst in der Nähe eines Kochfeuers sein.",
65+
["profession.recipes.craft.reason.REQUIRES_AREA"] = "Das kann hier nicht hergestellt werden.",
66+
["profession.recipes.craft.reason.MISSING_TOOLS"] = "Benötigtes Werkzeug fehlt oder ist nicht angelegt.",
67+
["profession.recipes.craft.reason.MOVING"] = "Der Bot muss stehen bleiben.",
68+
["profession.recipes.craft.reason.NOT_STANDING"] = "Der Bot musste aufstehen. Erneut versuchen.",
69+
["profession.recipes.craft.reason.NOT_READY"] = "Das Rezept ist noch nicht bereit.",
70+
["profession.recipes.craft.reason.OUT_OF_RANGE"] = "Der Bot ist außer Reichweite.",
71+
["profession.recipes.craft.reason.TRY_AGAIN"] = "Gleich erneut versuchen.",
72+
["profession.recipes.craft.reason.IN_FLIGHT"] = "Der Bot kann im Flug nicht herstellen.",
73+
["profession.recipes.craft.reason.LOST_CONTROL"] = "Der Bot kann gerade nicht handeln.",
74+
["profession.recipes.craft.reason.CHANNELING"] = "Der Bot kanalisiert bereits einen Zauber.",
75+
["profession.recipes.craft.reason.cast_code"] = "Der Server hat den Zauber abgelehnt (Code %s).",
4976
["character.skills.count"] = "Fertigkeit(en)",
5077
["character.skills.loading"] = "Wird geladen...",
5178
["character.skills.category.class"] = "Klassenfertigkeiten",
@@ -396,7 +423,7 @@ local deDEValues = {
396423
["tips.main.creator"] = "Creator-Switch\n|cffffffffDieser Schalter aktiviert oder deaktiviert die Creator-Control.|r\n\n|cffff0000Linksklicken um die Creator-Control ein- oder auszuschalten|r\n|cff999999(Ausführreihenfolge: System)|r",
397424
["tips.main.beast"] = "Beastmaster-Switch\n|cffffffffDieser Schalter aktiviert oder deaktiviert die Beastmaster-Control.\nDie Beastmaster-Control ist für Mod-NPC-Beastmaster des Azerothcore.\nMod-NPC-Beastmaster erlaubt es jedem Character eine Bestie wie Jäger zu haben.\nDein Character kann die notwendigen Zauber bei 'White Fang' erlernen.\nDer GameMaster muss 'White Fang' in der Spielwelt platzieren.\n|cffff0000Linksklicken um die Beastmaster-Control ein- oder auszuschalten|r\n|cff999999(Ausführreihenfolge: System)|r",
398425
["tips.main.disperse"] = "Disperse-Switch\n|cffffffffDieser Schalter zeigt oder versteckt die Disperse-Control.|r\n\n|cffff0000Linksklicken um die Disperse-Control ein- oder auszuschalten|r\n|cff999999(Ausführreihenfolge: System)|r",
399-
["tips.main.loot"] = "Beuteregeln-Switch\n|cffffffffDieser Schalter zeigt oder versteckt die Beuteregeln-Control.|r\n\n|cffff0000Linksklicken um die Beuteregeln-Control ein- oder auszuschalten|r\n|cff999999(Ausführreihenfolge: System)|r",
426+
["tips.main.loot"] = "Beuteregeln-Switch\n|cffffffffDieser Schalter zeigt oder versteckt die Beuteregeln-Control.|r\n\n|cffff0000Linksklicken um die Beuteregeln-Control ein- oder auszuschalten|r\n|cff999999(Ausführreihenfolge: System)|r",
400427
["tips.main.expand"] = "Expand-Switch\n|cffffffffDiese Schaltfläche expandiert oder reduziert die Stay-Follow-Control.\n|cffff0000Linksklicken um die Stay-Follow-Control zu expandieren oder reduzieren|r\n|cff999999(Ausführreihenfolge: System)|r",
401428
["tips.main.release"] = "Auto-Release\n|cffffffffDiese Erweiterung erkennt wenn ein Bot stirbt.\nTote Bots werden automatisch freigelassen und herbeigerufen.\nDadurch werden die Bots innerhalb von Sekunden wiederbelebt.|r\n\n|cffff0000Linksklicken um Auto-Release ein- oder auszuschalten|r\n|cff999999(Ausführreihenfolge: System)|r",
402429
["tips.main.stats"] = "Auto-Stats\n|cffffffffDiese Erweiterung visualisiert die Werte vom Stats-Kommando.\nDie Stats-Werte aktualisieren sich alle 45 Sekunden.|r\n\n|cffff0000Linksklicken um Auto-Stats ein- oder auszuschalten|r\n|cff999999(Ausführreihenfolge: System)|r",

Locales/MultiBotAceLocale-enGB.lua

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -46,6 +46,33 @@ local enGBValues = {
4646
["character.info"] = "Character Info",
4747
["character.skills"] = "Skills",
4848
["profession.recipes.loading"] = "Loading...",
49+
["profession.recipes.craft"] = "Craft",
50+
["profession.recipes.craft.tooltip"] = "Ask the bot to craft this recipe once.",
51+
["profession.recipes.craft.pending"] = "Craft requested...",
52+
["profession.recipes.craft.ok"] = "Craft started.",
53+
["profession.recipes.craft.failed"] = "Craft request failed.",
54+
["profession.recipes.craft.err"] = "Craft failed: %s",
55+
["profession.recipes.craft.reason.NO_BOT"] = "Bot not found.",
56+
["profession.recipes.craft.reason.NO_AI"] = "Bot AI unavailable.",
57+
["profession.recipes.craft.reason.BAD_REQUEST"] = "Invalid recipe request.",
58+
["profession.recipes.craft.reason.UNKNOWN_RECIPE"] = "Recipe not known by this bot.",
59+
["profession.recipes.craft.reason.SKILL_MISMATCH"] = "Recipe does not match this profession.",
60+
["profession.recipes.craft.reason.BAD_RECIPE"] = "Invalid recipe.",
61+
["profession.recipes.craft.reason.ITEM_MISMATCH"] = "Recipe result mismatch.",
62+
["profession.recipes.craft.reason.NO_MATERIALS"] = "Missing materials.",
63+
["profession.recipes.craft.reason.REQUIRES_SPELL_FOCUS"] = "Required crafting station not found nearby.",
64+
["profession.recipes.craft.reason.REQUIRES_SPELL_FOCUS.cooking"] = "You must be near a cooking fire.",
65+
["profession.recipes.craft.reason.REQUIRES_AREA"] = "You cannot craft that here.",
66+
["profession.recipes.craft.reason.MISSING_TOOLS"] = "Required tool missing or not equipped.",
67+
["profession.recipes.craft.reason.MOVING"] = "The bot must stop moving.",
68+
["profession.recipes.craft.reason.NOT_STANDING"] = "The bot had to stand up. Try again.",
69+
["profession.recipes.craft.reason.NOT_READY"] = "The recipe is not ready yet.",
70+
["profession.recipes.craft.reason.OUT_OF_RANGE"] = "The bot is out of range.",
71+
["profession.recipes.craft.reason.TRY_AGAIN"] = "Try again in a moment.",
72+
["profession.recipes.craft.reason.IN_FLIGHT"] = "The bot cannot craft while flying.",
73+
["profession.recipes.craft.reason.LOST_CONTROL"] = "The bot cannot act right now.",
74+
["profession.recipes.craft.reason.CHANNELING"] = "The bot is already channeling a spell.",
75+
["profession.recipes.craft.reason.cast_code"] = "The server refused the cast (code %s).",
4976
["character.skills.count"] = "skill(s)",
5077
["character.skills.loading"] = "Loading...",
5178
["character.skills.category.class"] = "Class Skills",

Locales/MultiBotAceLocale-enUS.lua

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -46,6 +46,34 @@ local enUSValues = {
4646
["character.info"] = "Character Info",
4747
["character.skills"] = "Skills",
4848
["profession.recipes.loading"] = "Loading...",
49+
["profession.recipes.craft"] = "Craft",
50+
["profession.recipes.craft"] = "Craft",
51+
["profession.recipes.craft.tooltip"] = "Ask the bot to craft this recipe once.",
52+
["profession.recipes.craft.pending"] = "Craft requested...",
53+
["profession.recipes.craft.ok"] = "Craft started.",
54+
["profession.recipes.craft.failed"] = "Craft request failed.",
55+
["profession.recipes.craft.err"] = "Craft failed: %s",
56+
["profession.recipes.craft.reason.NO_BOT"] = "Bot not found.",
57+
["profession.recipes.craft.reason.NO_AI"] = "Bot AI unavailable.",
58+
["profession.recipes.craft.reason.BAD_REQUEST"] = "Invalid recipe request.",
59+
["profession.recipes.craft.reason.UNKNOWN_RECIPE"] = "Recipe not known by this bot.",
60+
["profession.recipes.craft.reason.SKILL_MISMATCH"] = "Recipe does not match this profession.",
61+
["profession.recipes.craft.reason.BAD_RECIPE"] = "Invalid recipe.",
62+
["profession.recipes.craft.reason.ITEM_MISMATCH"] = "Recipe result mismatch.",
63+
["profession.recipes.craft.reason.NO_MATERIALS"] = "Missing materials.",
64+
["profession.recipes.craft.reason.REQUIRES_SPELL_FOCUS"] = "Required crafting station not found nearby.",
65+
["profession.recipes.craft.reason.REQUIRES_SPELL_FOCUS.cooking"] = "You must be near a cooking fire.",
66+
["profession.recipes.craft.reason.REQUIRES_AREA"] = "You cannot craft that here.",
67+
["profession.recipes.craft.reason.MISSING_TOOLS"] = "Required tool missing or not equipped.",
68+
["profession.recipes.craft.reason.MOVING"] = "The bot must stop moving.",
69+
["profession.recipes.craft.reason.NOT_STANDING"] = "The bot had to stand up. Try again.",
70+
["profession.recipes.craft.reason.NOT_READY"] = "The recipe is not ready yet.",
71+
["profession.recipes.craft.reason.OUT_OF_RANGE"] = "The bot is out of range.",
72+
["profession.recipes.craft.reason.TRY_AGAIN"] = "Try again in a moment.",
73+
["profession.recipes.craft.reason.IN_FLIGHT"] = "The bot cannot craft while flying.",
74+
["profession.recipes.craft.reason.LOST_CONTROL"] = "The bot cannot act right now.",
75+
["profession.recipes.craft.reason.CHANNELING"] = "The bot is already channeling a spell.",
76+
["profession.recipes.craft.reason.cast_code"] = "The server refused the cast (code %s).",
4977
["character.skills.count"] = "skill(s)",
5078
["character.skills.loading"] = "Loading...",
5179
["character.skills.category.class"] = "Class Skills",

Locales/MultiBotAceLocale-esES.lua

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -46,6 +46,33 @@ local esESValues = {
4646
["character.info"] = "Información del personaje",
4747
["character.skills"] = "Habilidades",
4848
["profession.recipes.loading"] = "Cargando...",
49+
["profession.recipes.craft"] = "Crear",
50+
["profession.recipes.craft.tooltip"] = "Pide al bot que cree esta receta una vez.",
51+
["profession.recipes.craft.pending"] = "Creación solicitada...",
52+
["profession.recipes.craft.ok"] = "Creación iniciada.",
53+
["profession.recipes.craft.failed"] = "La solicitud de creación falló.",
54+
["profession.recipes.craft.err"] = "Creación fallida: %s",
55+
["profession.recipes.craft.reason.NO_BOT"] = "Bot no encontrado.",
56+
["profession.recipes.craft.reason.NO_AI"] = "IA del bot no disponible.",
57+
["profession.recipes.craft.reason.BAD_REQUEST"] = "Solicitud de receta no válida.",
58+
["profession.recipes.craft.reason.UNKNOWN_RECIPE"] = "El bot no conoce esta receta.",
59+
["profession.recipes.craft.reason.SKILL_MISMATCH"] = "La receta no coincide con esta profesión.",
60+
["profession.recipes.craft.reason.BAD_RECIPE"] = "Receta no válida.",
61+
["profession.recipes.craft.reason.ITEM_MISMATCH"] = "El resultado de la receta no coincide.",
62+
["profession.recipes.craft.reason.NO_MATERIALS"] = "Faltan materiales.",
63+
["profession.recipes.craft.reason.REQUIRES_SPELL_FOCUS"] = "No hay una estación de creación requerida cerca.",
64+
["profession.recipes.craft.reason.REQUIRES_SPELL_FOCUS.cooking"] = "Debes estar cerca de un fuego de cocina.",
65+
["profession.recipes.craft.reason.REQUIRES_AREA"] = "No puedes crear eso aquí.",
66+
["profession.recipes.craft.reason.MISSING_TOOLS"] = "Falta una herramienta requerida o no está equipada.",
67+
["profession.recipes.craft.reason.MOVING"] = "El bot debe dejar de moverse.",
68+
["profession.recipes.craft.reason.NOT_STANDING"] = "El bot tuvo que levantarse. Inténtalo de nuevo.",
69+
["profession.recipes.craft.reason.NOT_READY"] = "La receta aún no está lista.",
70+
["profession.recipes.craft.reason.OUT_OF_RANGE"] = "El bot está fuera de alcance.",
71+
["profession.recipes.craft.reason.TRY_AGAIN"] = "Inténtalo de nuevo en un momento.",
72+
["profession.recipes.craft.reason.IN_FLIGHT"] = "El bot no puede crear mientras vuela.",
73+
["profession.recipes.craft.reason.LOST_CONTROL"] = "El bot no puede actuar ahora.",
74+
["profession.recipes.craft.reason.CHANNELING"] = "El bot ya está canalizando un hechizo.",
75+
["profession.recipes.craft.reason.cast_code"] = "El servidor rechazó el lanzamiento (código %s).",
4976
["character.skills.count"] = "habilidad(es)",
5077
["character.skills.loading"] = "Cargando...",
5178
["character.skills.category.class"] = "Habilidades de clase",

Locales/MultiBotAceLocale-frFR.lua

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -46,6 +46,33 @@ local frFRValues = {
4646
["character.info"] = "Infos personnage",
4747
["character.skills"] = "Compétences",
4848
["profession.recipes.loading"] = "Chargement...",
49+
["profession.recipes.craft"] = "Créer",
50+
["profession.recipes.craft.tooltip"] = "Demande au bot de créer cette recette une fois.",
51+
["profession.recipes.craft.pending"] = "Création demandée...",
52+
["profession.recipes.craft.ok"] = "Création lancée.",
53+
["profession.recipes.craft.failed"] = "La demande de création a échoué.",
54+
["profession.recipes.craft.err"] = "Création échouée : %s",
55+
["profession.recipes.craft.reason.NO_BOT"] = "Bot introuvable.",
56+
["profession.recipes.craft.reason.NO_AI"] = "IA du bot indisponible.",
57+
["profession.recipes.craft.reason.BAD_REQUEST"] = "Demande de recette invalide.",
58+
["profession.recipes.craft.reason.UNKNOWN_RECIPE"] = "Recette inconnue de ce bot.",
59+
["profession.recipes.craft.reason.SKILL_MISMATCH"] = "La recette ne correspond pas à ce métier.",
60+
["profession.recipes.craft.reason.BAD_RECIPE"] = "Recette invalide.",
61+
["profession.recipes.craft.reason.ITEM_MISMATCH"] = "Résultat de recette incohérent.",
62+
["profession.recipes.craft.reason.NO_MATERIALS"] = "Composants manquants.",
63+
["profession.recipes.craft.reason.REQUIRES_SPELL_FOCUS"] = "Poste de fabrication requis introuvable à proximité.",
64+
["profession.recipes.craft.reason.REQUIRES_SPELL_FOCUS.cooking"] = "Il faut être près d'un feu de cuisine.",
65+
["profession.recipes.craft.reason.REQUIRES_AREA"] = "Impossible de créer cette recette ici.",
66+
["profession.recipes.craft.reason.MISSING_TOOLS"] = "Outil requis manquant ou non équipé.",
67+
["profession.recipes.craft.reason.MOVING"] = "Le bot doit arrêter de bouger.",
68+
["profession.recipes.craft.reason.NOT_STANDING"] = "Le bot devait se lever. Réessaie.",
69+
["profession.recipes.craft.reason.NOT_READY"] = "La recette n'est pas encore prête.",
70+
["profession.recipes.craft.reason.OUT_OF_RANGE"] = "Le bot est hors de portée.",
71+
["profession.recipes.craft.reason.TRY_AGAIN"] = "Réessaie dans un instant.",
72+
["profession.recipes.craft.reason.IN_FLIGHT"] = "Le bot ne peut pas créer en vol.",
73+
["profession.recipes.craft.reason.LOST_CONTROL"] = "Le bot ne peut pas agir maintenant.",
74+
["profession.recipes.craft.reason.CHANNELING"] = "Le bot canalise déjà un sort.",
75+
["profession.recipes.craft.reason.cast_code"] = "Le serveur a refusé le cast (code %s).",
4976
["character.skills.count"] = "compétence(s)",
5077
["character.skills.loading"] = "Chargement...",
5178
["character.skills.category.class"] = "Compétences de classe",

0 commit comments

Comments
 (0)