mirror of
https://github.com/liyunfan1223/mod-playerbots.git
synced 2026-06-20 15:39:25 +02:00
Replace hardcoded bot texts (#2408)
<!-- Thank you for contributing to mod-playerbots, please make sure that you... 1. Submit your PR to the test-staging branch, not master. 2. Read the guidelines below before submitting. 3. Don't delete parts of this template. DESIGN PHILOSOPHY: We prioritize STABILITY, PERFORMANCE, AND PREDICTABILITY over behavioral realism. Every action and decision executes PER BOT AND PER TRIGGER. Small increases in logic complexity scale poorly across thousands of bots and negatively affect all. We prioritize a stable system over a smarter one. Bots don't need to behave perfectly; believable behavior is the goal, not human simulation. Default behavior must be cheap in processing; expensive behavior must be opt-in. Before submitting, make sure your changes aligns with these principles. --> ## Pull Request Description <!-- Describe what this change does and why it is needed --> Replaced hardcoded bot text with translationable. Related with: #1295 ## How to Test the Changes <!-- - Step-by-step instructions to test the change. - Any required setup (e.g. multiple players, number of bots, specific configuration). - Expected behavior and how to verify it. --> 1. Invite bots 2. Check that text after "follow" and "stay" return texts "Following" and "Staying" ## Impact Assessment <!-- As a generic test, before and after measure of pmon (playerbot pmon tick) can help you here. --> - Does this change increase per-bot/per-tick processing or risk scaling poorly with thousands of bots? - - [x] No, not at all - - [ ] Minimal impact (**explain below**) - - [ ] Moderate impact (**explain below**) - Does this change modify default bot behavior? - - [x] No - - [ ] Yes (**explain why**) - Does this change add new decision branches or increase maintenance complexity? - - [x] No - - [ ] Yes (**explain below**) ## AI Assistance <!-- AI assistance is allowed, but all submitted code must be fully understood, reviewed, and owned by the contributor. We expect contributors to be honest about what they do and do not understand. --> Was AI assistance used while working on this change? - - [ ] No - - [x] Yes (**explain below**) <!-- If yes, please specify: - Purpose of usage (e.g. brainstorming, refactoring, documentation, code generation). - Which parts of the change were influenced or generated, and whether it was thoroughly reviewed. --> Summary hardcoded text and checking that they already exists to reuse. <!-- TRANSLATIONS: Anything new that the bots say in chat must be in a translatable format. This is done using GetBotTextOrDefault, which you can search for in the codebase to find examples. Your code needs to have English as the default fallback, while the full translations need to be in an SQL update file. The languages in the file are the nine language options supported by AzerothCore: English, Korean, French, German, Chinese, Taiwanese, Spanish, Spanish Mexico, and Russian. See data/sql/playerbots/updates/2025_12_27_ai_playerbot_fishing_text.sql as an example of a translation SQL update, whose content are called within the codebase at src/strategy/actions/FishingAction.cpp --> ## Final Checklist - - [x] Stability is not compromised. - - [x] Performance impact is understood, tested, and acceptable. - - [x] Added logic complexity is justified and explained. - - [x] Any new bot dialogue lines are translated. - - [x] Documentation updated if needed (Conf comments, WiKi commands). ## Notes for Reviewers <!-- Anything else that's helpful to review or test your pull request. -->
This commit is contained in:
parent
3a7e3e2719
commit
55c5d29e2d
@ -0,0 +1,489 @@
|
||||
DELETE FROM ai_playerbot_texts WHERE name IN (
|
||||
'quest_accept_debug',
|
||||
'quest_already_have_error',
|
||||
'quest_cant_take_error',
|
||||
'arena_team_already_in_team',
|
||||
'arena_team_thanks_for_invite',
|
||||
'area_trigger_follow_too_far_error',
|
||||
'area_trigger_wait_for_me',
|
||||
'attack_no_target_error',
|
||||
'attack_target_not_in_world_error',
|
||||
'attack_in_flight_error',
|
||||
'attack_pvp_prohibited_error',
|
||||
'attack_target_friendly_error',
|
||||
'attack_target_dead_error',
|
||||
'attack_target_not_in_sight_error',
|
||||
'attack_already_attacking_error',
|
||||
'attack_invalid_target_error',
|
||||
'bank_no_banker_nearby_error',
|
||||
'move_from_group',
|
||||
'running_away',
|
||||
'clean_quest_log_started',
|
||||
'quest_trivial_will_remove',
|
||||
'quest_has_been_removed',
|
||||
'quest_not_trivial_kept',
|
||||
'quest_removed_debug',
|
||||
'quest_removed_with_name',
|
||||
'guild_accept_inviter_not_in_guild',
|
||||
'guild_accept_already_in_guild',
|
||||
'guild_accept_declined',
|
||||
'outfit_usage_add',
|
||||
'outfit_usage_remove',
|
||||
'outfit_usage_equip',
|
||||
'outfit_set_as',
|
||||
'outfit_equipping',
|
||||
'outfit_replace_current',
|
||||
'outfit_resetting',
|
||||
'outfit_updating_current',
|
||||
'outfit_item_removed_from',
|
||||
'outfit_item_added_to',
|
||||
'release_spirit_not_dead_wait',
|
||||
'release_spirit_already_spirit',
|
||||
'release_spirit_releasing',
|
||||
'release_spirit_meet_graveyard',
|
||||
'send_mail_no_mailbox_nearby',
|
||||
'send_mail_one_item_only',
|
||||
'send_mail_cannot_send_money',
|
||||
'send_mail_not_enough_money',
|
||||
'send_mail_sending_to',
|
||||
'send_mail_cannot_send_item',
|
||||
'send_mail_item_not_for_sale',
|
||||
'send_mail_sent_to',
|
||||
'craft_reset',
|
||||
'craft_usage',
|
||||
'craft_cannot_craft',
|
||||
'craft_summary',
|
||||
'set_home_success',
|
||||
'set_home_no_innkeeper_error',
|
||||
'quest_shared',
|
||||
'tame_invalid_id_error',
|
||||
'tame_usage_error',
|
||||
'tame_pet_changed',
|
||||
'tame_pet_changed_initialized',
|
||||
'tame_exotic_requires_beast_mastery',
|
||||
'tame_no_pet_by_name',
|
||||
'tame_no_pet_by_id',
|
||||
'tame_no_pet_by_family',
|
||||
'tame_no_pet_to_rename',
|
||||
'tame_pet_name_length_error',
|
||||
'tame_pet_name_alpha_error',
|
||||
'tame_pet_name_forbidden_error',
|
||||
'tame_pet_renamed',
|
||||
'tame_pet_rename_refresh_hint',
|
||||
'tame_only_hunters_level_10',
|
||||
'tame_creature_template_not_found',
|
||||
'tame_create_pet_failed',
|
||||
'tame_pet_abandoned',
|
||||
'tame_no_hunter_pet_to_abandon',
|
||||
'taxi_ready_next_flight',
|
||||
'taxi_cant_fly_with_you',
|
||||
'taxi_no_flightmaster_nearby',
|
||||
'trade_busy_now',
|
||||
'trade_disabled',
|
||||
'trade_thank_you_player',
|
||||
'trade_selling_disabled',
|
||||
'trade_buying_disabled',
|
||||
'trade_item_not_for_sale',
|
||||
'trade_item_not_needed',
|
||||
'trade_no_items_error',
|
||||
'trade_discount_buy_only',
|
||||
'trade_success_pleasure',
|
||||
'trade_success_fair_trade',
|
||||
'trade_success_thanks',
|
||||
'trade_success_off_with_you',
|
||||
'trade_want_money_for_this',
|
||||
'use_item_none_available',
|
||||
'use_gameobject',
|
||||
'socket_does_not_fit',
|
||||
'use_item_on_target',
|
||||
'use_item',
|
||||
'socketing_item_with_gem',
|
||||
'meeting_stone_in_combat',
|
||||
'meeting_stone_welcome',
|
||||
'meeting_stone_none_nearby',
|
||||
'meeting_stone_none_near_you',
|
||||
'meeting_stone_no_hearthstone_self',
|
||||
'meeting_stone_no_hearthstone_you',
|
||||
'meeting_stone_hearthstone_not_ready_self',
|
||||
'meeting_stone_hearthstone_not_ready_you',
|
||||
'meeting_stone_no_innkeepers_nearby',
|
||||
'meeting_stone_no_innkeepers_near_you',
|
||||
'meeting_stone_cannot_summon_vehicle',
|
||||
'meeting_stone_cannot_summon_master_in_combat',
|
||||
'meeting_stone_cannot_summon_master_dead',
|
||||
'meeting_stone_cannot_summon_bot_dead',
|
||||
'meeting_stone_revived',
|
||||
'meeting_stone_not_enough_space',
|
||||
'new_rpg_quest_accepted',
|
||||
'new_rpg_quest_rewarded',
|
||||
'new_rpg_quest_dropped',
|
||||
'rpg_item_better_for_player',
|
||||
'rpg_start_trade_with_player'
|
||||
);
|
||||
|
||||
DELETE FROM ai_playerbot_texts_chance WHERE name IN (
|
||||
'quest_accept_debug',
|
||||
'quest_already_have_error',
|
||||
'quest_cant_take_error',
|
||||
'arena_team_already_in_team',
|
||||
'arena_team_thanks_for_invite',
|
||||
'area_trigger_follow_too_far_error',
|
||||
'area_trigger_wait_for_me',
|
||||
'attack_no_target_error',
|
||||
'attack_target_not_in_world_error',
|
||||
'attack_in_flight_error',
|
||||
'attack_pvp_prohibited_error',
|
||||
'attack_target_friendly_error',
|
||||
'attack_target_dead_error',
|
||||
'attack_target_not_in_sight_error',
|
||||
'attack_already_attacking_error',
|
||||
'attack_invalid_target_error',
|
||||
'bank_no_banker_nearby_error',
|
||||
'move_from_group',
|
||||
'running_away',
|
||||
'clean_quest_log_started',
|
||||
'quest_trivial_will_remove',
|
||||
'quest_has_been_removed',
|
||||
'quest_not_trivial_kept',
|
||||
'quest_removed_debug',
|
||||
'quest_removed_with_name',
|
||||
'guild_accept_inviter_not_in_guild',
|
||||
'guild_accept_already_in_guild',
|
||||
'guild_accept_declined',
|
||||
'outfit_usage_add',
|
||||
'outfit_usage_remove',
|
||||
'outfit_usage_equip',
|
||||
'outfit_set_as',
|
||||
'outfit_equipping',
|
||||
'outfit_replace_current',
|
||||
'outfit_resetting',
|
||||
'outfit_updating_current',
|
||||
'outfit_item_removed_from',
|
||||
'outfit_item_added_to',
|
||||
'release_spirit_not_dead_wait',
|
||||
'release_spirit_already_spirit',
|
||||
'release_spirit_releasing',
|
||||
'release_spirit_meet_graveyard',
|
||||
'send_mail_no_mailbox_nearby',
|
||||
'send_mail_one_item_only',
|
||||
'send_mail_cannot_send_money',
|
||||
'send_mail_not_enough_money',
|
||||
'send_mail_sending_to',
|
||||
'send_mail_cannot_send_item',
|
||||
'send_mail_item_not_for_sale',
|
||||
'send_mail_sent_to',
|
||||
'craft_reset',
|
||||
'craft_usage',
|
||||
'craft_cannot_craft',
|
||||
'craft_summary',
|
||||
'set_home_success',
|
||||
'set_home_no_innkeeper_error',
|
||||
'quest_shared',
|
||||
'tame_invalid_id_error',
|
||||
'tame_usage_error',
|
||||
'tame_pet_changed',
|
||||
'tame_pet_changed_initialized',
|
||||
'tame_exotic_requires_beast_mastery',
|
||||
'tame_no_pet_by_name',
|
||||
'tame_no_pet_by_id',
|
||||
'tame_no_pet_by_family',
|
||||
'tame_no_pet_to_rename',
|
||||
'tame_pet_name_length_error',
|
||||
'tame_pet_name_alpha_error',
|
||||
'tame_pet_name_forbidden_error',
|
||||
'tame_pet_renamed',
|
||||
'tame_pet_rename_refresh_hint',
|
||||
'tame_only_hunters_level_10',
|
||||
'tame_creature_template_not_found',
|
||||
'tame_create_pet_failed',
|
||||
'tame_pet_abandoned',
|
||||
'tame_no_hunter_pet_to_abandon',
|
||||
'taxi_ready_next_flight',
|
||||
'taxi_cant_fly_with_you',
|
||||
'taxi_no_flightmaster_nearby',
|
||||
'trade_busy_now',
|
||||
'trade_disabled',
|
||||
'trade_thank_you_player',
|
||||
'trade_selling_disabled',
|
||||
'trade_buying_disabled',
|
||||
'trade_item_not_for_sale',
|
||||
'trade_item_not_needed',
|
||||
'trade_no_items_error',
|
||||
'trade_discount_buy_only',
|
||||
'trade_success_pleasure',
|
||||
'trade_success_fair_trade',
|
||||
'trade_success_thanks',
|
||||
'trade_success_off_with_you',
|
||||
'trade_want_money_for_this',
|
||||
'use_item_none_available',
|
||||
'use_gameobject',
|
||||
'socket_does_not_fit',
|
||||
'use_item_on_target',
|
||||
'use_item',
|
||||
'socketing_item_with_gem',
|
||||
'meeting_stone_in_combat',
|
||||
'meeting_stone_welcome',
|
||||
'meeting_stone_none_nearby',
|
||||
'meeting_stone_none_near_you',
|
||||
'meeting_stone_no_hearthstone_self',
|
||||
'meeting_stone_no_hearthstone_you',
|
||||
'meeting_stone_hearthstone_not_ready_self',
|
||||
'meeting_stone_hearthstone_not_ready_you',
|
||||
'meeting_stone_no_innkeepers_nearby',
|
||||
'meeting_stone_no_innkeepers_near_you',
|
||||
'meeting_stone_cannot_summon_vehicle',
|
||||
'meeting_stone_cannot_summon_master_in_combat',
|
||||
'meeting_stone_cannot_summon_master_dead',
|
||||
'meeting_stone_cannot_summon_bot_dead',
|
||||
'meeting_stone_revived',
|
||||
'meeting_stone_not_enough_space',
|
||||
'new_rpg_quest_accepted',
|
||||
'new_rpg_quest_rewarded',
|
||||
'new_rpg_quest_dropped',
|
||||
'rpg_item_better_for_player',
|
||||
'rpg_start_trade_with_player'
|
||||
);
|
||||
|
||||
INSERT INTO ai_playerbot_texts (id, name, text, say_type, reply_type, text_loc1, text_loc2, text_loc3, text_loc4, text_loc5, text_loc6, text_loc7, text_loc8) VALUES
|
||||
(1779, 'quest_accept_debug', 'Quest [%quest] accepted', 0, 0, '퀘스트 [%quest] 수락', 'Quête [%quest] acceptée', 'Quest [%quest] angenommen', '任务 [%quest] 已接受', '任務 [%quest] 已接受', 'Misión [%quest] aceptada', 'Misión [%quest] aceptada', 'Задание [%quest] принято'),
|
||||
(1780, 'quest_already_have_error', 'I have this quest', 0, 0, '이미 이 퀘스트를 가지고 있습니다', 'J''ai déjà cette quête', 'Ich habe diese Quest bereits', '我已经有这个任务了', '我已經有這個任務了', 'Ya tengo esta misión', 'Ya tengo esta misión', 'У меня уже есть это задание'),
|
||||
(1781, 'quest_cant_take_error', 'I can''t take this quest', 0, 0, '이 퀘스트를 받을 수 없습니다', 'Je ne peux pas prendre cette quête', 'Ich kann diese Quest nicht annehmen', '我无法接受这个任务', '我無法接受這個任務', 'No puedo aceptar esta misión', 'No puedo aceptar esta misión', 'Я не могу взять это задание'),
|
||||
(1782, 'arena_team_already_in_team', 'Sorry, I am already in such team', 0, 0, '죄송하지만 이미 그런 팀에 속해 있습니다', 'Désolé, je suis déjà dans une telle équipe', 'Entschuldigung, ich bin bereits in so einem Team', '抱歉,我已经在这样的队伍里了', '抱歉,我已經在這樣的隊伍裡了', 'Lo siento, ya estoy en un equipo así', 'Lo siento, ya estoy en un equipo así', 'Извините, я уже состою в такой команде'),
|
||||
(1783, 'arena_team_thanks_for_invite', 'Thanks for the invite!', 0, 0, '초대해 주셔서 감사합니다!', 'Merci pour l''invitation !', 'Danke für die Einladung!', '谢谢你的邀请!', '謝謝你的邀請!', 'Gracias por la invitación!', 'Gracias por la invitación!', 'Спасибо за приглашение!'),
|
||||
(1784, 'area_trigger_follow_too_far_error', 'I won''t follow: too far away', 0, 0, '너무 멀어서 따라가지 않겠습니다', 'Je ne suivrai pas : c''est trop loin', 'Ich werde nicht folgen: zu weit entfernt', '我不会跟随:距离太远了', '我不會跟隨:距離太遠了', 'No te seguiré: estás demasiado lejos', 'No te seguiré: estás demasiado lejos', 'Я не пойду следом: слишком далеко'),
|
||||
(1785, 'area_trigger_wait_for_me', 'Wait for me', 0, 0, '잠깐만 기다려 주세요', 'Attendez-moi', 'Warte auf mich', '等等我', '等等我', 'Espérame', 'Espérame', 'Подожди меня'),
|
||||
(1786, 'attack_no_target_error', 'I have no target', 0, 0, '대상이 없습니다', 'Je n''ai pas de cible', 'Ich habe kein Ziel', '我没有目标', '我沒有目標', 'No tengo objetivo', 'No tengo objetivo', 'У меня нет цели'),
|
||||
(1787, 'attack_target_not_in_world_error', '%target is no longer in the world.', 0, 0, '%target은(는) 더 이상 월드에 없습니다.', '%target n''est plus dans le monde.', '%target ist nicht mehr in der Welt.', '%target 已不在世界中。', '%target 已不在世界中。', '%target ya no está en el mundo.', '%target ya no está en el mundo.', '%target больше не находится в мире.'),
|
||||
(1788, 'attack_in_flight_error', 'I cannot attack in flight', 0, 0, '비행 중에는 공격할 수 없습니다', 'Je ne peux pas attaquer en vol', 'Ich kann im Flug nicht angreifen', '飞行中无法攻击', '飛行中無法攻擊', 'No puedo atacar en vuelo', 'No puedo atacar en vuelo', 'Я не могу атаковать в полёте'),
|
||||
(1789, 'attack_pvp_prohibited_error', 'I cannot attack other players in PvP prohibited areas.', 0, 0, 'PvP 금지 지역에서는 다른 플레이어를 공격할 수 없습니다.', 'Je ne peux pas attaquer d''autres joueurs dans les zones où le PvP est interdit.', 'Ich kann andere Spieler in PvP-verbotenen Gebieten nicht angreifen.', '我不能在禁止 PvP 的区域攻击其他玩家。', '我不能在禁止 PvP 的區域攻擊其他玩家。', 'No puedo atacar a otros jugadores en zonas donde el JcJ está prohibido.', 'No puedo atacar a otros jugadores en zonas donde el JcJ está prohibido.', 'Я не могу атаковать других игроков в зонах, где PvP запрещено.'),
|
||||
(1790, 'attack_target_friendly_error', '%target is friendly to me.', 0, 0, '%target은(는) 우호적인 대상입니다.', '%target m''est amical.', '%target ist mir gegenüber freundlich.', '%target 对我是友方目标。', '%target 對我是友方目標。', '%target es amistoso conmigo.', '%target es amistoso conmigo.', '%target дружелюбен ко мне.'),
|
||||
(1791, 'attack_target_dead_error', '%target is dead.', 0, 0, '%target은(는) 죽었습니다.', '%target est mort.', '%target ist tot.', '%target 已经死了。', '%target 已經死了。', '%target está muerto.', '%target está muerto.', '%target мёртв.'),
|
||||
(1792, 'attack_target_not_in_sight_error', '%target is not in my sight.', 0, 0, '%target이(가) 시야에 없습니다.', '%target n''est pas dans mon champ de vision.', '%target ist nicht in Sichtweite.', '%target 不在我的视野中。', '%target 不在我的視野中。', '%target no está a mi vista.', '%target no está a mi vista.', '%target вне поля моего зрения.'),
|
||||
(1793, 'attack_already_attacking_error', 'I am already attacking %target.', 0, 0, '이미 %target을(를) 공격하고 있습니다.', 'J''attaque déjà %target.', 'Ich greife %target bereits an.', '我已经在攻击 %target。', '我已經在攻擊 %target。', 'Ya estoy atacando a %target.', 'Ya estoy atacando a %target.', 'Я уже атакую %target.'),
|
||||
(1794, 'attack_invalid_target_error', 'I cannot attack an invalid target.', 0, 0, '유효하지 않은 대상은 공격할 수 없습니다.', 'Je ne peux pas attaquer une cible invalide.', 'Ich kann kein ungültiges Ziel angreifen.', '我不能攻击无效目标。', '我不能攻擊無效目標。', 'No puedo atacar un objetivo no válido.', 'No puedo atacar un objetivo no válido.', 'Я не могу атаковать недопустимую цель.'),
|
||||
(1795, 'bank_no_banker_nearby_error', 'Cannot find banker nearby', 0, 0, '근처에 은행원이 없습니다', 'Impossible de trouver un banquier à proximité', 'Kein Bankier in der Nähe gefunden', '附近找不到银行职员', '附近找不到銀行職員', 'No encuentro un banquero cerca', 'No encuentro un banquero cerca', 'Поблизости нет банкира'),
|
||||
(1796, 'move_from_group', 'Moving away from group', 0, 0, '파티에서 멀어지는 중입니다', 'Je m''éloigne du groupe', 'Ich entferne mich von der Gruppe', '正在远离队伍', '正在遠離隊伍', 'Me estoy alejando del grupo', 'Me estoy alejando del grupo', 'Отхожу от группы'),
|
||||
(1797, 'running_away', 'Running away', 0, 0, '도망치는 중입니다', 'Je m''enfuis', 'Ich laufe weg', '正在逃跑', '正在逃跑', 'Estoy huyendo', 'Estoy huyendo', 'Убегаю'),
|
||||
(1798, 'clean_quest_log_started', 'Clean Quest Log command received, removing grey/trivial quests...', 0, 0, '퀘스트 로그 정리 명령을 받았습니다. 회색/사소한 퀘스트를 제거하는 중입니다...', 'Commande de nettoyage du journal des quêtes reçue, suppression des quêtes grises/triviales...', 'Befehl zum Bereinigen des Questlogs erhalten, graue/triviale Quests werden entfernt...', '已收到清理任务日志命令,正在移除灰色/琐碎任务...', '已收到清理任務日誌命令,正在移除灰色/瑣碎任務...', 'Comando para limpiar el registro de misiones recibido, eliminando misiones grises/triviales...', 'Comando para limpiar el registro de misiones recibido, eliminando misiones grises/triviales...', 'Получена команда очистки журнала заданий, удаляю серые/простые задания...'),
|
||||
(1799, 'quest_trivial_will_remove', 'Quest [%title] will be removed because it is trivial (grey).', 0, 0, '퀘스트 [%title]은(는) 사소한(회색) 퀘스트이므로 제거됩니다.', 'La quête [%title] sera supprimée car elle est triviale (grise).', 'Quest [%title] wird entfernt, weil sie trivial (grau) ist.', '任务 [%title] 将被移除,因为它是琐碎的(灰色)任务。', '任務 [%title] 將被移除,因為它是瑣碎的(灰色)任務。', 'La misión [%title] se eliminará porque es trivial (gris).', 'La misión [%title] se eliminará porque es trivial (gris).', 'Задание [%title] будет удалено, так как оно простое (серое).'),
|
||||
(1800, 'quest_has_been_removed', 'Quest [%title] has been removed.', 0, 0, '퀘스트 [%title]이(가) 제거되었습니다.', 'La quête [%title] a été supprimée.', 'Quest [%title] wurde entfernt.', '任务 [%title] 已被移除。', '任務 [%title] 已被移除。', 'La misión [%title] ha sido eliminada.', 'La misión [%title] ha sido eliminada.', 'Задание [%title] было удалено.'),
|
||||
(1801, 'quest_not_trivial_kept', 'Quest [%title] is not trivial and will be kept.', 0, 0, '퀘스트 [%title]은(는) 사소하지 않으므로 유지됩니다.', 'La quête [%title] n''est pas triviale et sera conservée.', 'Quest [%title] ist nicht trivial und wird behalten.', '任务 [%title] 并不琐碎,将被保留。', '任務 [%title] 並不瑣碎,將被保留。', 'La misión [%title] no es trivial y se conservará.', 'La misión [%title] no es trivial y se conservará.', 'Задание [%title] не является простым и будет сохранено.'),
|
||||
(1802, 'quest_removed_debug', 'Quest [%quest] removed', 0, 0, '퀘스트 [%quest] 제거됨', 'Quête [%quest] supprimée', 'Quest [%quest] entfernt', '任务 [%quest] 已移除', '任務 [%quest] 已移除', 'Misión [%quest] eliminada', 'Misión [%quest] eliminada', 'Задание [%quest] удалено'),
|
||||
(1803, 'quest_removed_with_name', 'Quest removed %quest', 0, 0, '퀘스트 제거됨 %quest', 'Quête supprimée %quest', 'Quest entfernt %quest', '任务已移除 %quest', '任務已移除 %quest', 'Misión eliminada %quest', 'Misión eliminada %quest', 'Задание удалено %quest'),
|
||||
(1804, 'guild_accept_inviter_not_in_guild', 'You are not in a guild!', 0, 0, '당신은 길드에 속해 있지 않습니다!', 'Vous n''êtes pas dans une guilde !', 'Du bist in keiner Gilde!', '你不在公会中!', '你不在公會中!', 'No estás en un gremio!', 'No estás en un gremio!', 'Вы не состоите в гильдии!'),
|
||||
(1805, 'guild_accept_already_in_guild', 'Sorry, I am in a guild already', 0, 0, '죄송하지만 이미 길드에 속해 있습니다', 'Désolé, je suis déjà dans une guilde', 'Entschuldigung, ich bin bereits in einer Gilde', '抱歉,我已经在公会里了', '抱歉,我已經在公會裡了', 'Lo siento, ya estoy en un gremio', 'Lo siento, ya estoy en un gremio', 'Извините, я уже в гильдии'),
|
||||
(1806, 'guild_accept_declined', 'Sorry, I don''t want to join your guild :(', 0, 0, '죄송하지만 당신의 길드에 가입하고 싶지 않습니다 :(', 'Désolé, je ne veux pas rejoindre votre guilde :(', 'Entschuldigung, ich möchte deiner Gilde nicht beitreten :(', '抱歉,我不想加入你的公会 :(', '抱歉,我不想加入你的公會 :(', 'Lo siento, no quiero unirme a tu gremio :(', 'Lo siento, no quiero unirme a tu gremio :(', 'Извините, я не хочу вступать в вашу гильдию :('),
|
||||
(1807, 'outfit_usage_add', 'outfit <name> +[item] to add items', 0, 0, '아이템을 추가하려면 outfit <name> +[item]', 'outfit <name> +[item] pour ajouter des objets', 'outfit <name> +[item], um Gegenstände hinzuzufügen', '使用 outfit <name> +[item] 添加物品', '使用 outfit <name> +[item] 添加物品', 'outfit <name> +[item] para agregar objetos', 'outfit <name> +[item] para agregar objetos', 'outfit <name> +[item], чтобы добавить предметы'),
|
||||
(1808, 'outfit_usage_remove', 'outfit <name> -[item] to remove items', 0, 0, '아이템을 제거하려면 outfit <name> -[item]', 'outfit <name> -[item] pour retirer des objets', 'outfit <name> -[item], um Gegenstände zu entfernen', '使用 outfit <name> -[item] 移除物品', '使用 outfit <name> -[item] 移除物品', 'outfit <name> -[item] para eliminar objetos', 'outfit <name> -[item] para eliminar objetos', 'outfit <name> -[item], чтобы убрать предметы'),
|
||||
(1809, 'outfit_usage_equip', 'outfit <name> equip/replace to equip items', 0, 0, '아이템을 장착하려면 outfit <name> equip/replace', 'outfit <name> equip/replace pour équiper des objets', 'outfit <name> equip/replace, um Gegenstände anzulegen', '使用 outfit <name> equip/replace 装备物品', '使用 outfit <name> equip/replace 裝備物品', 'outfit <name> equip/replace para equipar objetos', 'outfit <name> equip/replace para equipar objetos', 'outfit <name> equip/replace, чтобы экипировать предметы'),
|
||||
(1810, 'outfit_set_as', 'Setting outfit %name as %param', 0, 0, '복장 %name을(를) %param(으)로 설정하는 중입니다', 'Définition de la tenue %name comme %param', 'Setze Outfit %name als %param', '正在将装备方案 %name 设置为 %param', '正在將裝備方案 %name 設定為 %param', 'Estableciendo el atuendo %name como %param', 'Estableciendo el atuendo %name como %param', 'Устанавливаю комплект %name как %param'),
|
||||
(1811, 'outfit_equipping', 'Equipping outfit %name', 0, 0, '복장 %name을(를) 장착하는 중입니다', 'Équipement de la tenue %name', 'Outfit %name wird angelegt', '正在装备方案 %name', '正在裝備方案 %name', 'Equipando el atuendo %name', 'Equipando el atuendo %name', 'Экипирую комплект %name'),
|
||||
(1812, 'outfit_replace_current', 'Replacing current equip with outfit %name', 0, 0, '현재 장비를 복장 %name으로 교체하는 중입니다', 'Remplacement de l''équipement actuel par la tenue %name', 'Aktuelle Ausrüstung wird durch Outfit %name ersetzt', '正在用装备方案 %name 替换当前装备', '正在用裝備方案 %name 替換目前裝備', 'Reemplazando el equipo actual con el atuendo %name', 'Reemplazando el equipo actual con el atuendo %name', 'Заменяю текущую экипировку комплектом %name'),
|
||||
(1813, 'outfit_resetting', 'Resetting outfit %name', 0, 0, '복장 %name을(를) 초기화하는 중입니다', 'Réinitialisation de la tenue %name', 'Outfit %name wird zurückgesetzt', '正在重置装备方案 %name', '正在重置裝備方案 %name', 'Restableciendo el atuendo %name', 'Restableciendo el atuendo %name', 'Сбрасываю комплект %name'),
|
||||
(1814, 'outfit_updating_current', 'Updating with current items outfit %name', 0, 0, '현재 아이템으로 복장 %name을(를) 업데이트하는 중입니다', 'Mise à jour de la tenue %name avec les objets actuels', 'Outfit %name wird mit der aktuellen Ausrüstung aktualisiert', '正在用当前物品更新装备方案 %name', '正在用目前物品更新裝備方案 %name', 'Actualizando el atuendo %name con los objetos actuales', 'Actualizando el atuendo %name con los objetos actuales', 'Обновляю комплект %name текущими предметами'),
|
||||
(1815, 'outfit_item_removed_from', '%item removed from %name', 0, 0, '%name에서 %item이(가) 제거되었습니다', '%item retiré de %name', '%item aus %name entfernt', '已从 %name 中移除 %item', '已從 %name 中移除 %item', '%item eliminado de %name', '%item eliminado de %name', '%item удалён из %name'),
|
||||
(1816, 'outfit_item_added_to', '%item added to %name', 0, 0, '%item이(가) %name에 추가되었습니다', '%item ajouté à %name', '%item zu %name hinzugefügt', '已将 %item 添加到 %name', '已將 %item 添加到 %name', '%item agregado a %name', '%item agregado a %name', '%item добавлен в %name'),
|
||||
(1817, 'release_spirit_not_dead_wait', 'I am not dead, will wait here', 0, 0, '저는 죽지 않았습니다. 여기서 기다리겠습니다', 'Je ne suis pas mort, j''attendrai ici', 'Ich bin nicht tot und werde hier warten', '我还没死,会在这里等', '我還沒死,會在這裡等', 'No estoy muerto, esperaré aquí', 'No estoy muerto, esperaré aquí', 'Я не мёртв, буду ждать здесь'),
|
||||
(1818, 'release_spirit_already_spirit', 'I am already a spirit', 0, 0, '저는 이미 유령입니다', 'Je suis déjà un esprit', 'Ich bin bereits ein Geist', '我已经是灵魂状态了', '我已經是靈魂狀態了', 'Ya soy un espíritu', 'Ya soy un espíritu', 'Я уже дух'),
|
||||
(1819, 'release_spirit_releasing', 'Releasing...', 0, 0, '해방 중...', 'Je libère mon esprit...', 'Geist wird freigesetzt...', '正在释放灵魂...', '正在釋放靈魂...', 'Liberando espíritu...', 'Liberando espíritu...', 'Освобождаю дух...'),
|
||||
(1820, 'release_spirit_meet_graveyard', 'Meet me at the graveyard', 0, 0, '묘지에서 만나요', 'Retrouvez-moi au cimetière', 'Triff mich auf dem Friedhof', '墓地见', '墓地見', 'Encuéntrame en el cementerio', 'Encuéntrame en el cementerio', 'Встречаемся на кладбище'),
|
||||
(1821, 'send_mail_no_mailbox_nearby', 'There is no mailbox nearby', 0, 0, '근처에 우체통이 없습니다', 'Il n''y a pas de boîte aux lettres à proximité', 'Kein Briefkasten in der Nähe', '附近没有邮箱', '附近沒有郵箱', 'No hay un buzón cerca', 'No hay un buzón cerca', 'Поблизости нет почтового ящика'),
|
||||
(1822, 'send_mail_one_item_only', 'You can not request more than one item', 0, 0, '둘 이상의 아이템은 요청할 수 없습니다', 'Vous ne pouvez pas demander plus d''un objet', 'Du kannst nicht mehr als einen Gegenstand anfordern', '你不能请求多于一件物品', '你不能要求超過一件物品', 'No puedes solicitar más de un objeto', 'No puedes solicitar más de un objeto', 'Нельзя запрашивать больше одного предмета'),
|
||||
(1823, 'send_mail_cannot_send_money', 'I cannot send money', 0, 0, '돈은 보낼 수 없습니다', 'Je ne peux pas envoyer d''argent', 'Ich kann kein Geld senden', '我不能寄送钱', '我不能寄送金錢', 'No puedo enviar dinero', 'No puedo enviar dinero', 'Я не могу отправить деньги'),
|
||||
(1824, 'send_mail_not_enough_money', 'I don''t have enough money', 0, 0, '돈이 충분하지 않습니다', 'Je n''ai pas assez d''argent', 'Ich habe nicht genug Geld', '我没有足够的钱', '我沒有足夠的錢', 'No tengo suficiente dinero', 'No tengo suficiente dinero', 'У меня недостаточно денег'),
|
||||
(1825, 'send_mail_sending_to', 'Sending mail to %receiver', 0, 0, '%receiver에게 우편을 보내는 중입니다', 'Envoi du courrier à %receiver', 'Sende Post an %receiver', '正在向 %receiver 发送邮件', '正在向 %receiver 發送郵件', 'Enviando correo a %receiver', 'Enviando correo a %receiver', 'Отправляю почту %receiver'),
|
||||
(1826, 'send_mail_cannot_send_item', 'Cannot send %item', 0, 0, '%item을(를) 보낼 수 없습니다', 'Impossible d''envoyer %item', '%item kann nicht gesendet werden', '无法发送 %item', '無法發送 %item', 'No se puede enviar %item', 'No se puede enviar %item', 'Невозможно отправить %item'),
|
||||
(1827, 'send_mail_item_not_for_sale', '%item: it is not for sale', 0, 0, '%item: 판매 대상이 아닙니다', '%item : ce n''est pas à vendre', '%item: Das steht nicht zum Verkauf', '%item:这不是出售物品', '%item:這不是出售物品', '%item: esto no está en venta', '%item: esto no está en venta', '%item: это не продаётся'),
|
||||
(1828, 'send_mail_sent_to', 'Sent mail to %receiver', 0, 0, '%receiver에게 우편을 보냈습니다', 'Courrier envoyé à %receiver', 'Post an %receiver gesendet', '已向 %receiver 发送邮件', '已向 %receiver 發送郵件', 'Correo enviado a %receiver', 'Correo enviado a %receiver', 'Почта отправлена %receiver'),
|
||||
(1829, 'craft_reset', 'I will not craft anything', 0, 0, '아무것도 제작하지 않겠습니다', 'Je ne fabriquerai rien', 'Ich werde nichts herstellen', '我不会制作任何东西', '我不會製作任何東西', 'No fabricaré nada', 'No fabricaré nada', 'Я ничего не буду создавать'),
|
||||
(1830, 'craft_usage', 'Usage: ''craft [itemId]'' or ''craft reset''', 0, 0, '사용법: ''craft [itemId]'' 또는 ''craft reset''', 'Utilisation : ''craft [itemId]'' ou ''craft reset''', 'Verwendung: ''craft [itemId]'' oder ''craft reset''', '用法:''craft [itemId]'' 或 ''craft reset''', '用法:''craft [itemId]'' 或 ''craft reset''', 'Uso: ''craft [itemId]'' o ''craft reset''', 'Uso: ''craft [itemId]'' o ''craft reset''', 'Использование: ''craft [itemId]'' или ''craft reset'''),
|
||||
(1831, 'craft_cannot_craft', 'I cannot craft this', 0, 0, '이것은 제작할 수 없습니다', 'Je ne peux pas fabriquer ceci', 'Ich kann das nicht herstellen', '我无法制作这个', '我無法製作這個', 'No puedo fabricar esto', 'No puedo fabricar esto', 'Я не могу это создать'),
|
||||
(1832, 'craft_summary', 'I will craft %item using reagents: %reagents (craft fee: %money)', 0, 0, '재료 %reagents을(를) 사용해 %item을(를) 제작하겠습니다 (제작 수수료: %money)', 'Je fabriquerai %item en utilisant les composants : %reagents (frais de fabrication : %money)', 'Ich werde %item mit folgenden Reagenzien herstellen: %reagents (Herstellungsgebühr: %money)', '我将使用材料 %reagents 制作 %item(制作费用:%money)', '我將使用材料 %reagents 製作 %item(製作費用:%money)', 'Fabricaré %item usando los materiales: %reagents (tarifa de fabricación: %money)', 'Fabricaré %item usando los materiales: %reagents (tarifa de fabricación: %money)', 'Я изготовлю %item, используя реагенты: %reagents (плата за изготовление: %money)'),
|
||||
(1833, 'set_home_success', 'This inn is my new home', 0, 0, '이 여관을 새로운 집으로 설정했습니다', 'Cette auberge est ma nouvelle maison', 'Dieses Gasthaus ist mein neues Zuhause', '这家旅店是我的新家', '這間旅店是我的新家', 'Esta posada es mi nuevo hogar', 'Esta posada es mi nuevo hogar', 'Этот трактир теперь мой новый дом'),
|
||||
(1834, 'set_home_no_innkeeper_error', 'Can''t find any innkeeper around', 0, 0, '주변에서 여관주인을 찾을 수 없습니다', 'Impossible de trouver un aubergiste aux alentours', 'Kein Gastwirt in der Nähe gefunden', '附近找不到旅店老板', '附近找不到旅店老闆', 'No encuentro ningún posadero cerca', 'No encuentro ningún posadero cerca', 'Не удалось найти поблизости трактирщика'),
|
||||
(1835, 'quest_shared', 'Quest shared', 0, 0, '퀘스트 공유됨', 'Quête partagée', 'Quest geteilt', '任务已共享', '任務已共享', 'Misión compartida', 'Misión compartida', 'Задание поделено'),
|
||||
(1836, 'tame_invalid_id_error', 'Invalid tame id.', 0, 0, '잘못된 길들이기 ID입니다.', 'Identifiant de dressage invalide.', 'Ungültige Zähm-ID.', '无效的驯服 ID。', '無效的馴服 ID。', 'ID de domesticación no válido.', 'ID de domesticación no válido.', 'Недопустимый ID приручения.'),
|
||||
(1837, 'tame_usage_error', 'Usage: tame name <name> | tame id <id> | tame family <family> | tame rename <new name> | tame abandon', 0, 0, '사용법: tame name <name> | tame id <id> | tame family <family> | tame rename <new name> | tame abandon', 'Utilisation : tame name <name> | tame id <id> | tame family <family> | tame rename <new name> | tame abandon', 'Verwendung: tame name <name> | tame id <id> | tame family <family> | tame rename <new name> | tame abandon', '用法:tame name <name> | tame id <id> | tame family <family> | tame rename <new name> | tame abandon', '用法:tame name <name> | tame id <id> | tame family <family> | tame rename <new name> | tame abandon', 'Uso: tame name <name> | tame id <id> | tame family <family> | tame rename <new name> | tame abandon', 'Uso: tame name <name> | tame id <id> | tame family <family> | tame rename <new name> | tame abandon', 'Использование: tame name <name> | tame id <id> | tame family <family> | tame rename <new name> | tame abandon'),
|
||||
(1838, 'tame_pet_changed', 'Pet changed to %name, ID: %id.', 0, 0, '소환수가 %name, ID: %id(으)로 변경되었습니다.', 'Familier changé en %name, ID : %id.', 'Begleiter geändert zu %name, ID: %id.', '宠物已更改为 %name,ID:%id。', '寵物已更改為 %name,ID:%id。', 'Mascota cambiada a %name, ID: %id.', 'Mascota cambiada a %name, ID: %id.', 'Питомец изменён на %name, ID: %id.'),
|
||||
(1839, 'tame_pet_changed_initialized', 'Pet changed and initialized!', 0, 0, '소환수가 변경되고 초기화되었습니다!', 'Familier changé et initialisé !', 'Begleiter geändert und initialisiert!', '宠物已更改并初始化!', '寵物已更改並初始化!', 'La mascota ha sido cambiada e inicializada!', 'La mascota ha sido cambiada e inicializada!', 'Питомец изменён и инициализирован!'),
|
||||
(1840, 'tame_exotic_requires_beast_mastery', 'I cannot use exotic pets unless I have the Beast Mastery talent.', 0, 0, '야수 지배 특성이 없으면 특수 야수 소환수를 사용할 수 없습니다.', 'Je ne peux pas utiliser de familiers exotiques sans le talent Maîtrise des bêtes.', 'Ich kann ohne das Talent Tierherrschaft keine exotischen Begleiter benutzen.', '如果没有野兽掌握天赋,我无法使用异种宠物。', '如果沒有野獸控制天賦,我無法使用異種寵物。', 'No puedo usar mascotas exóticas a menos que tenga el talento Dominio de bestias.', 'No puedo usar mascotas exóticas a menos que tenga el talento Dominio de bestias.', 'Я не могу использовать экзотических питомцев без таланта Повелитель зверей.'),
|
||||
(1841, 'tame_no_pet_by_name', 'No tameable pet found with name: %name', 0, 0, '이름이 %name인 길들일 수 있는 소환수를 찾을 수 없습니다', 'Aucun familier apprivoisable trouvé avec le nom : %name', 'Kein zähmbares Tier mit dem Namen %name gefunden', '未找到名为 %name 的可驯服宠物', '未找到名為 %name 的可馴服寵物', 'No se encontró ninguna mascota domesticable con el nombre: %name', 'No se encontró ninguna mascota domesticable con el nombre: %name', 'Не найден приручаемый питомец с именем: %name'),
|
||||
(1842, 'tame_no_pet_by_id', 'No tameable pet found with id: %id', 0, 0, 'ID가 %id인 길들일 수 있는 소환수를 찾을 수 없습니다', 'Aucun familier apprivoisable trouvé avec l''id : %id', 'Kein zähmbares Tier mit der ID %id gefunden', '未找到 ID 为 %id 的可驯服宠物', '未找到 ID 為 %id 的可馴服寵物', 'No se encontró ninguna mascota domesticable con el id: %id', 'No se encontró ninguna mascota domesticable con el id: %id', 'Не найден приручаемый питомец с id: %id'),
|
||||
(1843, 'tame_no_pet_by_family', 'No tameable pet found with family: %family', 0, 0, '계열이 %family인 길들일 수 있는 소환수를 찾을 수 없습니다', 'Aucun familier apprivoisable trouvé avec la famille : %family', 'Kein zähmbares Tier mit der Familie %family gefunden', '未找到家族为 %family 的可驯服宠物', '未找到家族為 %family 的可馴服寵物', 'No se encontró ninguna mascota domesticable con la familia: %family', 'No se encontró ninguna mascota domesticable con la familia: %family', 'Не найден приручаемый питомец семейства: %family'),
|
||||
(1844, 'tame_no_pet_to_rename', 'You have no pet to rename.', 0, 0, '이름을 바꿀 소환수가 없습니다.', 'Vous n''avez pas de familier à renommer.', 'Du hast kein Tier zum Umbenennen.', '你没有可重命名的宠物。', '你沒有可重新命名的寵物。', 'No tienes ninguna mascota para renombrar.', 'No tienes ninguna mascota para renombrar.', 'У вас нет питомца для переименования.'),
|
||||
(1845, 'tame_pet_name_length_error', 'Pet name must be between 1 and 12 alphabetic characters.', 0, 0, '소환수 이름은 1자에서 12자의 알파벳 문자여야 합니다.', 'Le nom du familier doit contenir entre 1 et 12 caractères alphabétiques.', 'Der Name des Begleiters muss zwischen 1 und 12 alphabetischen Zeichen lang sein.', '宠物名字必须为 1 到 12 个字母字符。', '寵物名字必須為 1 到 12 個字母字元。', 'El nombre de la mascota debe tener entre 1 y 12 caracteres alfabéticos.', 'El nombre de la mascota debe tener entre 1 y 12 caracteres alfabéticos.', 'Имя питомца должно содержать от 1 до 12 буквенных символов.'),
|
||||
(1846, 'tame_pet_name_alpha_error', 'Pet name must only contain alphabetic characters (A-Z, a-z).', 0, 0, '소환수 이름에는 알파벳 문자(A-Z, a-z)만 포함될 수 있습니다.', 'Le nom du familier ne doit contenir que des caractères alphabétiques (A-Z, a-z).', 'Der Name des Begleiters darf nur alphabetische Zeichen (A-Z, a-z) enthalten.', '宠物名字只能包含字母字符(A-Z, a-z)。', '寵物名字只能包含字母字元(A-Z, a-z)。', 'El nombre de la mascota solo puede contener caracteres alfabéticos (A-Z, a-z).', 'El nombre de la mascota solo puede contener caracteres alfabéticos (A-Z, a-z).', 'Имя питомца должно содержать только буквенные символы (A-Z, a-z).'),
|
||||
(1847, 'tame_pet_name_forbidden_error', 'That pet name is forbidden. Please choose another name.', 0, 0, '그 소환수 이름은 사용할 수 없습니다. 다른 이름을 선택해 주세요.', 'Ce nom de familier est interdit. Veuillez en choisir un autre.', 'Dieser Name für den Begleiter ist verboten. Bitte wähle einen anderen Namen.', '该宠物名称被禁止使用。请选择其他名字。', '該寵物名稱被禁止使用。請選擇其他名字。', 'Ese nombre de mascota está prohibido. Por favor, elige otro nombre.', 'Ese nombre de mascota está prohibido. Por favor, elige otro nombre.', 'Это имя для питомца запрещено. Пожалуйста, выберите другое имя.'),
|
||||
(1848, 'tame_pet_renamed', 'Your pet has been renamed to %name!', 0, 0, '당신의 소환수 이름이 %name(으)로 변경되었습니다!', 'Votre familier a été renommé en %name !', 'Dein Begleiter wurde in %name umbenannt!', '你的宠物已重命名为 %name!', '你的寵物已重新命名為 %name!', 'Tu mascota ha sido renombrada a %name!', 'Tu mascota ha sido renombrada a %name!', 'Ваш питомец был переименован в %name!'),
|
||||
(1849, 'tame_pet_rename_refresh_hint', 'If you do not see the new name, please dismiss and recall your pet.', 0, 0, '새 이름이 보이지 않으면 소환수를 해제했다가 다시 소환해 주세요.', 'Si vous ne voyez pas le nouveau nom, veuillez renvoyer puis rappeler votre familier.', 'Wenn du den neuen Namen nicht siehst, schicke deinen Begleiter weg und rufe ihn erneut.', '如果你看不到新名字,请先解散再召回你的宠物。', '如果你看不到新名字,請先解散再召回你的寵物。', 'Si no ves el nuevo nombre, por favor retira y vuelve a invocar a tu mascota.', 'Si no ves el nuevo nombre, por favor retira y vuelve a invocar a tu mascota.', 'Если вы не видите новое имя, отпустите и снова призовите питомца.'),
|
||||
(1850, 'tame_only_hunters_level_10', 'Only level 10+ hunters can have pets.', 0, 0, '10레벨 이상의 사냥꾼만 소환수를 가질 수 있습니다.', 'Seuls les chasseurs de niveau 10+ peuvent avoir des familiers.', 'Nur Jäger ab Stufe 10 können Begleiter haben.', '只有 10 级以上的猎人才能拥有宠物。', '只有 10 級以上的獵人才能擁有寵物。', 'Solo los cazadores de nivel 10 o superior pueden tener mascotas.', 'Solo los cazadores de nivel 10 o superior pueden tener mascotas.', 'Только охотники 10 уровня и выше могут иметь питомцев.'),
|
||||
(1851, 'tame_creature_template_not_found', 'Creature template not found.', 0, 0, '생물 템플릿을 찾을 수 없습니다.', 'Modèle de créature introuvable.', 'Kreaturvorlage nicht gefunden.', '未找到生物模板。', '未找到生物範本。', 'No se encontró la plantilla de criatura.', 'No se encontró la plantilla de criatura.', 'Шаблон существа не найден.'),
|
||||
(1852, 'tame_create_pet_failed', 'Failed to create pet.', 0, 0, '소환수 생성에 실패했습니다.', 'Échec de la création du familier.', 'Erstellen des Begleiters fehlgeschlagen.', '创建宠物失败。', '建立寵物失敗。', 'No se pudo crear la mascota.', 'No se pudo crear la mascota.', 'Не удалось создать питомца.'),
|
||||
(1853, 'tame_pet_abandoned', 'Your pet has been abandoned.', 0, 0, '당신의 소환수를 버렸습니다.', 'Votre familier a été abandonné.', 'Dein Begleiter wurde freigelassen.', '你的宠物已被放弃。', '你的寵物已被放棄。', 'Tu mascota ha sido abandonada.', 'Tu mascota ha sido abandonada.', 'Ваш питомец был брошен.'),
|
||||
(1854, 'tame_no_hunter_pet_to_abandon', 'You have no hunter pet to abandon.', 0, 0, '버릴 사냥꾼 소환수가 없습니다.', 'Vous n''avez pas de familier de chasseur à abandonner.', 'Du hast kein Jägertier zum Freilassen.', '你没有可放弃的猎人宠物。', '你沒有可放棄的獵人寵物。', 'No tienes ninguna mascota de cazador que abandonar.', 'No tienes ninguna mascota de cazador que abandonar.', 'У вас нет питомца охотника, которого можно бросить.'),
|
||||
(1855, 'taxi_ready_next_flight', 'I am ready for the next flight', 0, 0, '다음 비행을 탈 준비가 되었습니다', 'Je suis prêt pour le prochain vol', 'Ich bin bereit für den nächsten Flug', '我已准备好进行下一次飞行', '我已準備好進行下一次飛行', 'Estoy listo para el siguiente vuelo', 'Estoy listo para el siguiente vuelo', 'Я готов к следующему перелёту'),
|
||||
(1856, 'taxi_cant_fly_with_you', 'I can''t fly with you', 0, 0, '당신과 함께 날 수 없습니다', 'Je ne peux pas voler avec vous', 'Ich kann nicht mit dir fliegen', '我不能和你一起飞', '我不能和你一起飛', 'No puedo volar contigo', 'No puedo volar contigo', 'Я не могу лететь с вами'),
|
||||
(1857, 'taxi_no_flightmaster_nearby', 'Cannot find any flightmaster to talk', 0, 0, '대화할 비행 조련사를 찾을 수 없습니다', 'Impossible de trouver un maître de vol à qui parler', 'Keinen Flugmeister zum Ansprechen gefunden', '找不到可以交谈的飞行管理员', '找不到可以交談的飛行管理員', 'No encuentro ningún maestro de vuelo con quien hablar', 'No encuentro ningún maestro de vuelo con quien hablar', 'Не могу найти распорядителя полётов, с которым можно поговорить'),
|
||||
(1858, 'trade_busy_now', 'I''m kind of busy now', 0, 0, '지금은 좀 바쁩니다', 'Je suis un peu occupé en ce moment', 'Ich bin gerade etwas beschäftigt', '我现在有点忙', '我現在有點忙', 'Ahora estoy un poco ocupado', 'Ahora estoy un poco ocupado', 'Сейчас я немного занят'),
|
||||
(1859, 'trade_disabled', 'Trading is disabled', 0, 0, '거래가 비활성화되어 있습니다', 'L''échange est désactivé', 'Handel ist deaktiviert', '交易已禁用', '交易已停用', 'El comercio está deshabilitado', 'El comercio está deshabilitado', 'Торговля отключена'),
|
||||
(1860, 'trade_thank_you_player', 'Thank you %player', 0, 0, '고마워요 %player', 'Merci %player', 'Danke %player', '谢谢你 %player', '謝謝你 %player', 'Gracias %player', 'Gracias %player', 'Спасибо, %player'),
|
||||
(1861, 'trade_selling_disabled', 'Selling is disabled.', 0, 0, '판매가 비활성화되어 있습니다.', 'La vente est désactivée.', 'Verkaufen ist deaktiviert.', '出售已禁用。', '出售已停用。', 'La venta está deshabilitada.', 'La venta está deshabilitada.', 'Продажа отключена.'),
|
||||
(1862, 'trade_buying_disabled', 'Buying is disabled.', 0, 0, '구매가 비활성화되어 있습니다.', 'L''achat est désactivé.', 'Kaufen ist deaktiviert.', '购买已禁用。', '購買已停用。', 'La compra está deshabilitada.', 'La compra está deshabilitada.', 'Покупка отключена.'),
|
||||
(1863, 'trade_item_not_for_sale', '%item - This is not for sale', 0, 0, '%item - 이것은 판매용이 아닙니다', '%item - Ceci n''est pas à vendre', '%item - Das steht nicht zum Verkauf', '%item - 这不是出售物品', '%item - 這不是出售物品', '%item - Esto no está en venta', '%item - Esto no está en venta', '%item - это не продаётся'),
|
||||
(1864, 'trade_item_not_needed', '%item - I don''t need this', 0, 0, '%item - 저는 이것이 필요 없습니다', '%item - Je n''en ai pas besoin', '%item - Das brauche ich nicht', '%item - 我不需要这个', '%item - 我不需要這個', '%item - No necesito esto', '%item - No necesito esto', '%item - мне это не нужно'),
|
||||
(1865, 'trade_no_items_error', 'There are no items to trade', 0, 0, '거래할 아이템이 없습니다', 'Il n''y a aucun objet à échanger', 'Es gibt keine Gegenstände zum Handeln', '没有可交易的物品', '沒有可交易的物品', 'No hay objetos para comerciar', 'No hay objetos para comerciar', 'Нет предметов для обмена'),
|
||||
(1866, 'trade_discount_buy_only', 'You can use discount to buy items only', 0, 0, '할인은 아이템 구매에만 사용할 수 있습니다', 'Vous ne pouvez utiliser la réduction que pour acheter des objets', 'Rabatte können nur zum Kauf von Gegenständen verwendet werden', '折扣只能用于购买物品', '折扣只能用於購買物品', 'Solo puedes usar el descuento para comprar objetos', 'Solo puedes usar el descuento para comprar objetos', 'Скидку можно использовать только для покупки предметов'),
|
||||
(1867, 'trade_success_pleasure', 'A pleasure doing business with you', 0, 0, '당신과 거래해서 즐거웠습니다', 'Un plaisir de faire affaire avec vous', 'Es war mir ein Vergnügen, mit dir Geschäfte zu machen', '很高兴和你做生意', '很高興和你做生意', 'Un placer hacer negocios contigo', 'Un placer hacer negocios contigo', 'Приятно было иметь с вами дело'),
|
||||
(1868, 'trade_success_fair_trade', 'Fair trade', 0, 0, '공정한 거래입니다', 'Échange équitable', 'Fairer Handel', '公平交易', '公平交易', 'Intercambio justo', 'Intercambio justo', 'Честная сделка'),
|
||||
(1869, 'trade_success_thanks', 'Thanks', 0, 0, '감사합니다', 'Merci', 'Danke', '谢谢', '謝謝', 'Gracias', 'Gracias', 'Спасибо'),
|
||||
(1870, 'trade_success_off_with_you', 'Off with you', 0, 0, '이제 가보세요', 'Allez-vous-en maintenant', 'Nun geh deiner Wege', '走吧你', '走吧你', 'Ahora vete', 'Ahora vete', 'Иди уже'),
|
||||
(1871, 'trade_want_money_for_this', 'I want %money for this', 0, 0, '이것에 대해 %money을(를) 원합니다', 'Je veux %money pour ceci', 'Ich möchte %money dafür', '这个我想要 %money', '這個我想要 %money', 'Quiero %money por esto', 'Quiero %money por esto', 'Я хочу %money за это'),
|
||||
(1872, 'use_item_none_available', 'No items (or game objects) available', 0, 0, '사용할 수 있는 아이템(또는 게임 오브젝트)이 없습니다', 'Aucun objet (ou objet interactif) disponible', 'Keine Gegenstände (oder Spielobjekte) verfügbar', '没有可用的物品(或游戏物体)', '沒有可用的物品(或遊戲物件)', 'No hay objetos (ni objetos del juego) disponibles', 'No hay objetos (ni objetos del juego) disponibles', 'Нет доступных предметов (или игровых объектов)'),
|
||||
(1873, 'use_gameobject', 'Using %gameobject', 0, 0, '%gameobject 사용 중', 'Utilisation de %gameobject', 'Benutze %gameobject', '正在使用 %gameobject', '正在使用 %gameobject', 'Usando %gameobject', 'Usando %gameobject', 'Использую %gameobject'),
|
||||
(1874, 'socket_does_not_fit', 'Socket does not fit', 0, 0, '소켓이 맞지 않습니다', 'La châsse ne correspond pas', 'Sockel passt nicht', '插槽不匹配', '插槽不匹配', 'La ranura no encaja', 'La ranura no encaja', 'Гнездо не подходит'),
|
||||
(1875, 'use_item_on_target', 'Using %item on %target', 0, 0, '%target에게 %item을(를) 사용하는 중', 'Utilisation de %item sur %target', 'Benutze %item auf %target', '正在对 %target 使用 %item', '正在對 %target 使用 %item', 'Usando %item en %target', 'Usando %item en %target', 'Использую %item на %target'),
|
||||
(1876, 'use_item', 'Using %item', 0, 0, '%item 사용 중', 'Utilisation de %item', 'Benutze %item', '正在使用 %item', '正在使用 %item', 'Usando %item', 'Usando %item', 'Использую %item'),
|
||||
(1877, 'socketing_item_with_gem', 'Socketing %item with %gem', 0, 0, '%item에 %gem 보석을 장착하는 중', 'Sertissage de %item avec %gem', 'Sockele %item mit %gem', '正在将 %gem 镶嵌到 %item 上', '正在將 %gem 鑲嵌到 %item 上', 'Engarzando %item con %gem', 'Engarzando %item con %gem', 'Вставляю %gem в %item'),
|
||||
(1878, 'meeting_stone_in_combat', 'I am in combat', 0, 0, '전투 중입니다', 'Je suis en combat', 'Ich bin im Kampf', '我在战斗中', '我在戰鬥中', 'Estoy en combate', 'Estoy en combate', 'Я в бою'),
|
||||
(1879, 'meeting_stone_welcome', 'Welcome!', 0, 0, '환영합니다!', 'Bienvenue !', 'Willkommen!', '欢迎!', '歡迎!', 'Bienvenido!', 'Bienvenido!', 'Добро пожаловать!'),
|
||||
(1880, 'meeting_stone_none_nearby', 'There is no meeting stone nearby', 0, 0, '근처에 집결의 돌이 없습니다', 'Il n''y a pas de pierre de rencontre à proximité', 'Es gibt keinen Beschwörungsstein in der Nähe', '附近没有集合石', '附近沒有集合石', 'No hay ninguna piedra de encuentro cerca', 'No hay ninguna piedra de encuentro cerca', 'Поблизости нет камня встреч'),
|
||||
(1881, 'meeting_stone_none_near_you', 'There is no meeting stone near you', 0, 0, '당신 근처에 집결의 돌이 없습니다', 'Il n''y a pas de pierre de rencontre près de vous', 'Es gibt keinen Beschwörungsstein in deiner Nähe', '你附近没有集合石', '你附近沒有集合石', 'No hay ninguna piedra de encuentro cerca de ti', 'No hay ninguna piedra de encuentro cerca de ti', 'Рядом с вами нет камня встреч'),
|
||||
(1882, 'meeting_stone_no_hearthstone_self', 'I have no hearthstone', 0, 0, '귀환석이 없습니다', 'Je n''ai pas de pierre de foyer', 'Ich habe keinen Ruhestein', '我没有炉石', '我沒有爐石', 'No tengo piedra de hogar', 'No tengo piedra de hogar', 'У меня нет камня возвращения'),
|
||||
(1883, 'meeting_stone_no_hearthstone_you', 'You have no hearthstone', 0, 0, '당신에게 귀환석이 없습니다', 'Vous n''avez pas de pierre de foyer', 'Du hast keinen Ruhestein', '你没有炉石', '你沒有爐石', 'No tienes piedra de hogar', 'No tienes piedra de hogar', 'У вас нет камня возвращения'),
|
||||
(1884, 'meeting_stone_hearthstone_not_ready_self', 'My hearthstone is not ready', 0, 0, '제 귀환석은 아직 준비되지 않았습니다', 'Ma pierre de foyer n''est pas prête', 'Mein Ruhestein ist nicht bereit', '我的炉石还没准备好', '我的爐石還沒準備好', 'Mi piedra de hogar no está lista', 'Mi piedra de hogar no está lista', 'Мой камень возвращения ещё не готов'),
|
||||
(1885, 'meeting_stone_hearthstone_not_ready_you', 'Your hearthstone is not ready', 0, 0, '당신의 귀환석은 아직 준비되지 않았습니다', 'Votre pierre de foyer n''est pas prête', 'Dein Ruhestein ist nicht bereit', '你的炉石还没准备好', '你的爐石還沒準備好', 'Tu piedra de hogar no está lista', 'Tu piedra de hogar no está lista', 'Ваш камень возвращения ещё не готов'),
|
||||
(1886, 'meeting_stone_no_innkeepers_nearby', 'There are no innkeepers nearby', 0, 0, '근처에 여관주인이 없습니다', 'Il n''y a pas d''aubergistes à proximité', 'Es gibt keine Gastwirte in der Nähe', '附近没有旅店老板', '附近沒有旅店老闆', 'No hay posaderos cerca', 'No hay posaderos cerca', 'Поблизости нет трактирщиков'),
|
||||
(1887, 'meeting_stone_no_innkeepers_near_you', 'There are no innkeepers near you', 0, 0, '당신 근처에 여관주인이 없습니다', 'Il n''y a pas d''aubergistes près de vous', 'Es gibt keine Gastwirte in deiner Nähe', '你附近没有旅店老板', '你附近沒有旅店老闆', 'No hay posaderos cerca de ti', 'No hay posaderos cerca de ti', 'Рядом с вами нет трактирщиков'),
|
||||
(1888, 'meeting_stone_cannot_summon_vehicle', 'You cannot summon me while I''m on a vehicle', 0, 0, '제가 탈것/차량에 타고 있는 동안에는 소환할 수 없습니다', 'Vous ne pouvez pas m''invoquer tant que je suis sur un véhicule', 'Du kannst mich nicht beschwören, solange ich auf einem Fahrzeug bin', '当我在载具上时,你不能召唤我', '當我在載具上時,你不能召喚我', 'No puedes invocarme mientras esté en un vehículo', 'No puedes invocarme mientras esté en un vehículo', 'Вы не можете призвать меня, пока я на транспорте'),
|
||||
(1889, 'meeting_stone_cannot_summon_master_in_combat', 'You cannot summon me while you''re in combat', 0, 0, '당신이 전투 중일 때는 저를 소환할 수 없습니다', 'Vous ne pouvez pas m''invoquer pendant que vous êtes en combat', 'Du kannst mich nicht beschwören, solange du im Kampf bist', '当你在战斗中时,不能召唤我', '當你在戰鬥中時,不能召喚我', 'No puedes invocarme mientras estés en combate', 'No puedes invocarme mientras estés en combate', 'Вы не можете призвать меня, пока вы в бою'),
|
||||
(1890, 'meeting_stone_cannot_summon_master_dead', 'You cannot summon me while you''re dead', 0, 0, '당신이 죽어 있는 동안에는 저를 소환할 수 없습니다', 'Vous ne pouvez pas m''invoquer pendant que vous êtes mort', 'Du kannst mich nicht beschwören, solange du tot bist', '当你死亡时,不能召唤我', '當你死亡時,不能召喚我', 'No puedes invocarme mientras estés muerto', 'No puedes invocarme mientras estés muerto', 'Вы не можете призвать меня, пока вы мертвы'),
|
||||
(1891, 'meeting_stone_cannot_summon_bot_dead', 'You cannot summon me while I''m dead, you need to release my spirit first', 0, 0, '제가 죽어 있는 동안에는 저를 소환할 수 없습니다. 먼저 제 영혼을 해방해야 합니다', 'Vous ne pouvez pas m''invoquer tant que je suis mort, vous devez d''abord libérer mon esprit', 'Du kannst mich nicht beschwören, solange ich tot bin; du musst zuerst meinen Geist freisetzen', '当我死亡时,你不能召唤我,你需要先释放我的灵魂', '當我死亡時,你不能召喚我,你需要先釋放我的靈魂', 'No puedes invocarme mientras esté muerto, primero debes liberar mi espíritu', 'No puedes invocarme mientras esté muerto, primero debes liberar mi espíritu', 'Вы не можете призвать меня, пока я мёртв, сначала нужно освободить мой дух'),
|
||||
(1892, 'meeting_stone_revived', 'I live, again!', 0, 0, '다시 살아났습니다!', 'Je vis à nouveau !', 'Ich lebe wieder!', '我又活了!', '我又活了!', 'Vivo de nuevo!', 'Vivo de nuevo!', 'Я снова жив!'),
|
||||
(1893, 'meeting_stone_not_enough_space', 'Not enough place to summon', 0, 0, '소환할 공간이 부족합니다', 'Pas assez de place pour invoquer', 'Nicht genug Platz zum Beschwören', '没有足够的空间进行召唤', '沒有足夠的空間進行召喚', 'No hay suficiente espacio para invocar', 'No hay suficiente espacio para invocar', 'Недостаточно места для призыва'),
|
||||
(1894, 'new_rpg_quest_accepted', 'Quest accepted %quest', 0, 0, '퀘스트 수락 %quest', 'Quête acceptée %quest', 'Quest angenommen %quest', '任务已接受 %quest', '任務已接受 %quest', 'Misión aceptada %quest', 'Misión aceptada %quest', 'Задание принято %quest'),
|
||||
(1895, 'new_rpg_quest_rewarded', 'Quest rewarded %quest', 0, 0, '퀘스트 보상 받음 %quest', 'Quête récompensée %quest', 'Quest abgeschlossen %quest', '任务已奖励 %quest', '任務已獎勵 %quest', 'Misión completada %quest', 'Misión completada %quest', 'Награда за задание получена %quest'),
|
||||
(1896, 'new_rpg_quest_dropped', 'Quest dropped %quest', 0, 0, '퀘스트 포기 %quest', 'Quête abandonnée %quest', 'Quest abgebrochen %quest', '任务已放弃 %quest', '任務已放棄 %quest', 'Misión abandonada %quest', 'Misión abandonada %quest', 'Задание отменено %quest'),
|
||||
(1897, 'rpg_item_better_for_player', 'You can use this %item better than me, %player.', 0, 0, '%player님, 이 %item은(는) 저보다 당신에게 더 잘 맞습니다.', 'Vous pouvez mieux utiliser cet objet %item que moi, %player.', 'Du kannst diesen %item besser gebrauchen als ich, %player.', '%player,这个 %item 比我更适合你使用。', '%player,這個 %item 比我更適合你使用。', 'Tú puedes usar este %item mejor que yo, %player.', 'Tú puedes usar este %item mejor que yo, %player.', '%player, ты можешь использовать %item лучше, чем я.'),
|
||||
(1898, 'rpg_start_trade_with_player', 'Start trade with %player', 0, 0, '%player와(과) 거래를 시작합니다', 'Début de l''échange avec %player', 'Beginne Handel mit %player', '开始与 %player 交易', '開始與 %player 交易', 'Iniciando intercambio con %player', 'Iniciando intercambio con %player', 'Начинаю обмен с %player');
|
||||
|
||||
INSERT INTO ai_playerbot_texts_chance (name, probability) VALUES
|
||||
('quest_accept_debug', 100),
|
||||
('quest_already_have_error', 100),
|
||||
('quest_cant_take_error', 100),
|
||||
('arena_team_already_in_team', 100),
|
||||
('arena_team_thanks_for_invite', 100),
|
||||
('area_trigger_follow_too_far_error', 100),
|
||||
('area_trigger_wait_for_me', 100),
|
||||
('attack_no_target_error', 100),
|
||||
('attack_target_not_in_world_error', 100),
|
||||
('attack_in_flight_error', 100),
|
||||
('attack_pvp_prohibited_error', 100),
|
||||
('attack_target_friendly_error', 100),
|
||||
('attack_target_dead_error', 100),
|
||||
('attack_target_not_in_sight_error', 100),
|
||||
('attack_already_attacking_error', 100),
|
||||
('attack_invalid_target_error', 100),
|
||||
('bank_no_banker_nearby_error', 100),
|
||||
('move_from_group', 100),
|
||||
('running_away', 100),
|
||||
('clean_quest_log_started', 100),
|
||||
('quest_trivial_will_remove', 100),
|
||||
('quest_has_been_removed', 100),
|
||||
('quest_not_trivial_kept', 100),
|
||||
('quest_removed_debug', 100),
|
||||
('quest_removed_with_name', 100),
|
||||
('guild_accept_inviter_not_in_guild', 100),
|
||||
('guild_accept_already_in_guild', 100),
|
||||
('guild_accept_declined', 100),
|
||||
('outfit_usage_add', 100),
|
||||
('outfit_usage_remove', 100),
|
||||
('outfit_usage_equip', 100),
|
||||
('outfit_set_as', 100),
|
||||
('outfit_equipping', 100),
|
||||
('outfit_replace_current', 100),
|
||||
('outfit_resetting', 100),
|
||||
('outfit_updating_current', 100),
|
||||
('outfit_item_removed_from', 100),
|
||||
('outfit_item_added_to', 100),
|
||||
('release_spirit_not_dead_wait', 100),
|
||||
('release_spirit_already_spirit', 100),
|
||||
('release_spirit_releasing', 100),
|
||||
('release_spirit_meet_graveyard', 100),
|
||||
('send_mail_no_mailbox_nearby', 100),
|
||||
('send_mail_one_item_only', 100),
|
||||
('send_mail_cannot_send_money', 100),
|
||||
('send_mail_not_enough_money', 100),
|
||||
('send_mail_sending_to', 100),
|
||||
('send_mail_cannot_send_item', 100),
|
||||
('send_mail_item_not_for_sale', 100),
|
||||
('send_mail_sent_to', 100),
|
||||
('craft_reset', 100),
|
||||
('craft_usage', 100),
|
||||
('craft_cannot_craft', 100),
|
||||
('craft_summary', 100),
|
||||
('set_home_success', 100),
|
||||
('set_home_no_innkeeper_error', 100),
|
||||
('quest_shared', 100),
|
||||
('tame_invalid_id_error', 100),
|
||||
('tame_usage_error', 100),
|
||||
('tame_pet_changed', 100),
|
||||
('tame_pet_changed_initialized', 100),
|
||||
('tame_exotic_requires_beast_mastery', 100),
|
||||
('tame_no_pet_by_name', 100),
|
||||
('tame_no_pet_by_id', 100),
|
||||
('tame_no_pet_by_family', 100),
|
||||
('tame_no_pet_to_rename', 100),
|
||||
('tame_pet_name_length_error', 100),
|
||||
('tame_pet_name_alpha_error', 100),
|
||||
('tame_pet_name_forbidden_error', 100),
|
||||
('tame_pet_renamed', 100),
|
||||
('tame_pet_rename_refresh_hint', 100),
|
||||
('tame_only_hunters_level_10', 100),
|
||||
('tame_creature_template_not_found', 100),
|
||||
('tame_create_pet_failed', 100),
|
||||
('tame_pet_abandoned', 100),
|
||||
('tame_no_hunter_pet_to_abandon', 100),
|
||||
('taxi_ready_next_flight', 100),
|
||||
('taxi_cant_fly_with_you', 100),
|
||||
('taxi_no_flightmaster_nearby', 100),
|
||||
('trade_busy_now', 100),
|
||||
('trade_disabled', 100),
|
||||
('trade_thank_you_player', 100),
|
||||
('trade_selling_disabled', 100),
|
||||
('trade_buying_disabled', 100),
|
||||
('trade_item_not_for_sale', 100),
|
||||
('trade_item_not_needed', 100),
|
||||
('trade_no_items_error', 100),
|
||||
('trade_discount_buy_only', 100),
|
||||
('trade_success_pleasure', 100),
|
||||
('trade_success_fair_trade', 100),
|
||||
('trade_success_thanks', 100),
|
||||
('trade_success_off_with_you', 100),
|
||||
('trade_want_money_for_this', 100),
|
||||
('use_item_none_available', 100),
|
||||
('use_gameobject', 100),
|
||||
('socket_does_not_fit', 100),
|
||||
('use_item_on_target', 100),
|
||||
('use_item', 100),
|
||||
('socketing_item_with_gem', 100),
|
||||
('meeting_stone_in_combat', 100),
|
||||
('meeting_stone_welcome', 100),
|
||||
('meeting_stone_none_nearby', 100),
|
||||
('meeting_stone_none_near_you', 100),
|
||||
('meeting_stone_no_hearthstone_self', 100),
|
||||
('meeting_stone_no_hearthstone_you', 100),
|
||||
('meeting_stone_hearthstone_not_ready_self', 100),
|
||||
('meeting_stone_hearthstone_not_ready_you', 100),
|
||||
('meeting_stone_no_innkeepers_nearby', 100),
|
||||
('meeting_stone_no_innkeepers_near_you', 100),
|
||||
('meeting_stone_cannot_summon_vehicle', 100),
|
||||
('meeting_stone_cannot_summon_master_in_combat', 100),
|
||||
('meeting_stone_cannot_summon_master_dead', 100),
|
||||
('meeting_stone_cannot_summon_bot_dead', 100),
|
||||
('meeting_stone_revived', 100),
|
||||
('meeting_stone_not_enough_space', 100),
|
||||
('new_rpg_quest_accepted', 100),
|
||||
('new_rpg_quest_rewarded', 100),
|
||||
('new_rpg_quest_dropped', 100),
|
||||
('rpg_item_better_for_player', 100),
|
||||
('rpg_start_trade_with_player', 100);
|
||||
@ -9,6 +9,7 @@
|
||||
#include "ObjectAccessor.h"
|
||||
#include "PlayerbotAIConfig.h"
|
||||
#include "PlayerbotSecurity.h"
|
||||
#include "PlayerbotTextMgr.h"
|
||||
#include "Playerbots.h"
|
||||
#include "WorldPacket.h"
|
||||
|
||||
@ -55,7 +56,7 @@ bool AcceptInvitationAction::Execute(Event event)
|
||||
botAI->ChangeStrategy("+follow,-lfg,-bg", BOT_STATE_NON_COMBAT);
|
||||
botAI->Reset();
|
||||
|
||||
botAI->TellMaster("Hello");
|
||||
botAI->TellMaster(PlayerbotTextMgr::instance().GetBotTextOrDefault("hello", "Hello", {}));
|
||||
|
||||
if (sPlayerbotAIConfig.summonWhenGroup && bot->GetDistance(inviter) > sPlayerbotAIConfig.sightDistance)
|
||||
{
|
||||
|
||||
@ -6,6 +6,7 @@
|
||||
#include "AcceptQuestAction.h"
|
||||
|
||||
#include "Event.h"
|
||||
#include "PlayerbotTextMgr.h"
|
||||
#include "Playerbots.h"
|
||||
|
||||
bool AcceptAllQuestsAction::ProcessQuest(Quest const* quest, Object* questGiver)
|
||||
@ -18,7 +19,11 @@ bool AcceptAllQuestsAction::ProcessQuest(Quest const* quest, Object* questGiver)
|
||||
if (botAI->HasStrategy("debug quest", BotState::BOT_STATE_NON_COMBAT) || botAI->HasStrategy("debug rpg", BotState::BOT_STATE_COMBAT))
|
||||
{
|
||||
LOG_INFO("playerbots", "{} => Quest [{}] accepted", bot->GetName(), quest->GetTitle());
|
||||
bot->Say("Quest [" + text_quest + "] accepted", LANG_UNIVERSAL);
|
||||
std::string text = PlayerbotTextMgr::instance().GetBotTextOrDefault(
|
||||
"quest_accept_debug",
|
||||
"Quest [%quest] accepted",
|
||||
{{"%quest", text_quest}});
|
||||
bot->Say(text, LANG_UNIVERSAL);
|
||||
}
|
||||
|
||||
return true;
|
||||
@ -113,7 +118,8 @@ bool AcceptQuestShareAction::Execute(Event event)
|
||||
if (bot->HasQuest(quest))
|
||||
{
|
||||
bot->SetDivider(ObjectGuid::Empty);
|
||||
botAI->TellError("I have this quest");
|
||||
botAI->TellError(PlayerbotTextMgr::instance().GetBotTextOrDefault(
|
||||
"quest_already_have_error", "I have this quest", {}));
|
||||
return false;
|
||||
}
|
||||
|
||||
@ -121,7 +127,8 @@ bool AcceptQuestShareAction::Execute(Event event)
|
||||
{
|
||||
// can't take quest
|
||||
bot->SetDivider(ObjectGuid::Empty);
|
||||
botAI->TellError("I can't take this quest");
|
||||
botAI->TellError(PlayerbotTextMgr::instance().GetBotTextOrDefault(
|
||||
"quest_cant_take_error", "I can't take this quest", {}));
|
||||
|
||||
return false;
|
||||
}
|
||||
@ -149,7 +156,8 @@ bool AcceptQuestShareAction::Execute(Event event)
|
||||
bot->CastSpell(bot, qInfo->GetSrcSpell(), true);
|
||||
}
|
||||
|
||||
botAI->TellMaster("Quest accepted");
|
||||
botAI->TellMaster(PlayerbotTextMgr::instance().GetBotTextOrDefault(
|
||||
"quest_accept", "Quest accepted", {}));
|
||||
return true;
|
||||
}
|
||||
|
||||
|
||||
@ -7,6 +7,7 @@
|
||||
|
||||
#include "Event.h"
|
||||
#include "LastMovementValue.h"
|
||||
#include "PlayerbotTextMgr.h"
|
||||
#include "Playerbots.h"
|
||||
#include "Transport.h"
|
||||
|
||||
@ -36,7 +37,8 @@ bool ReachAreaTriggerAction::Execute(Event event)
|
||||
|
||||
if (bot->GetMapId() != at->map)
|
||||
{
|
||||
botAI->TellError("I won't follow: too far away");
|
||||
botAI->TellError(PlayerbotTextMgr::instance().GetBotTextOrDefault(
|
||||
"area_trigger_follow_too_far_error", "I won't follow: too far away", {}));
|
||||
return true;
|
||||
}
|
||||
|
||||
@ -51,7 +53,8 @@ bool ReachAreaTriggerAction::Execute(Event event)
|
||||
|
||||
float distance = bot->GetDistance(at->x, at->y, at->z);
|
||||
float delay = 1000.0f * distance / bot->GetSpeed(MOVE_RUN) + sPlayerbotAIConfig.reactDelay;
|
||||
botAI->TellError("Wait for me");
|
||||
botAI->TellError(PlayerbotTextMgr::instance().GetBotTextOrDefault(
|
||||
"area_trigger_wait_for_me", "Wait for me", {}));
|
||||
botAI->SetNextCheckDelay(delay);
|
||||
context->GetValue<LastMovement&>("last area trigger")->Get().lastAreaTrigger = triggerId;
|
||||
|
||||
@ -76,6 +79,6 @@ bool AreaTriggerAction::Execute(Event /*event*/)
|
||||
p.rpos(0);
|
||||
bot->GetSession()->HandleAreaTriggerOpcode(p);
|
||||
|
||||
botAI->TellMaster("Hello");
|
||||
botAI->TellMaster(PlayerbotTextMgr::instance().GetBotTextOrDefault("hello", "Hello", {}));
|
||||
return true;
|
||||
}
|
||||
|
||||
@ -6,6 +6,7 @@
|
||||
#include "ArenaTeamActions.h"
|
||||
|
||||
#include "ArenaTeamMgr.h"
|
||||
#include "PlayerbotTextMgr.h"
|
||||
#include "Playerbots.h"
|
||||
|
||||
bool ArenaTeamAcceptAction::Execute(Event event)
|
||||
@ -31,7 +32,9 @@ bool ArenaTeamAcceptAction::Execute(Event event)
|
||||
if (bot->GetArenaTeamId(at->GetSlot()))
|
||||
{
|
||||
// bot is already in an arena team
|
||||
bot->Say("Sorry, I am already in such team", LANG_UNIVERSAL);
|
||||
std::string text = PlayerbotTextMgr::instance().GetBotTextOrDefault(
|
||||
"arena_team_already_in_team", "Sorry, I am already in such team", {});
|
||||
bot->Say(text, LANG_UNIVERSAL);
|
||||
accept = false;
|
||||
}
|
||||
|
||||
@ -39,7 +42,9 @@ bool ArenaTeamAcceptAction::Execute(Event event)
|
||||
{
|
||||
WorldPacket data(CMSG_ARENA_TEAM_ACCEPT);
|
||||
bot->GetSession()->HandleArenaTeamAcceptOpcode(data);
|
||||
bot->Say("Thanks for the invite!", LANG_UNIVERSAL);
|
||||
std::string text = PlayerbotTextMgr::instance().GetBotTextOrDefault(
|
||||
"arena_team_thanks_for_invite", "Thanks for the invite!", {});
|
||||
bot->Say(text, LANG_UNIVERSAL);
|
||||
LOG_INFO("playerbots", "Bot {} <{}> accepts Arena Team invite", bot->GetGUID().ToString().c_str(),
|
||||
bot->GetName().c_str());
|
||||
return true;
|
||||
|
||||
@ -10,6 +10,7 @@
|
||||
#include "LastMovementValue.h"
|
||||
#include "LootObjectStack.h"
|
||||
#include "PlayerbotAI.h"
|
||||
#include "PlayerbotTextMgr.h"
|
||||
#include "Playerbots.h"
|
||||
#include "ServerFacade.h"
|
||||
#include "SharedDefines.h"
|
||||
@ -38,7 +39,8 @@ bool AttackMyTargetAction::Execute(Event /*event*/)
|
||||
if (!guid)
|
||||
{
|
||||
if (verbose)
|
||||
botAI->TellError("You have no target");
|
||||
botAI->TellError(PlayerbotTextMgr::instance().GetBotTextOrDefault(
|
||||
"pull_no_target_error", "You have no target", {}));
|
||||
|
||||
return false;
|
||||
}
|
||||
@ -56,7 +58,8 @@ bool AttackAction::Attack(Unit* target, bool /*with_pet*/ /*true*/)
|
||||
if (!target)
|
||||
{
|
||||
if (verbose)
|
||||
botAI->TellError("I have no target");
|
||||
botAI->TellError(PlayerbotTextMgr::instance().GetBotTextOrDefault(
|
||||
"attack_no_target_error", "I have no target", {}));
|
||||
|
||||
return false;
|
||||
}
|
||||
@ -64,7 +67,10 @@ bool AttackAction::Attack(Unit* target, bool /*with_pet*/ /*true*/)
|
||||
if (!target->IsInWorld())
|
||||
{
|
||||
if (verbose)
|
||||
botAI->TellError(std::string(target->GetName()) + " is no longer in the world.");
|
||||
botAI->TellError(PlayerbotTextMgr::instance().GetBotTextOrDefault(
|
||||
"attack_target_not_in_world_error",
|
||||
"%target is no longer in the world.",
|
||||
{{"%target", target->GetName()}}));
|
||||
|
||||
return false;
|
||||
}
|
||||
@ -73,7 +79,8 @@ bool AttackAction::Attack(Unit* target, bool /*with_pet*/ /*true*/)
|
||||
bot->HasUnitState(UNIT_STATE_IN_FLIGHT))
|
||||
{
|
||||
if (verbose)
|
||||
botAI->TellError("I cannot attack in flight");
|
||||
botAI->TellError(PlayerbotTextMgr::instance().GetBotTextOrDefault(
|
||||
"attack_in_flight_error", "I cannot attack in flight", {}));
|
||||
|
||||
return false;
|
||||
}
|
||||
@ -85,7 +92,10 @@ bool AttackAction::Attack(Unit* target, bool /*with_pet*/ /*true*/)
|
||||
sPlayerbotAIConfig.IsPvpProhibited(target->GetZoneId(), target->GetAreaId())))
|
||||
{
|
||||
if (verbose)
|
||||
botAI->TellError("I cannot attack other players in PvP prohibited areas.");
|
||||
botAI->TellError(PlayerbotTextMgr::instance().GetBotTextOrDefault(
|
||||
"attack_pvp_prohibited_error",
|
||||
"I cannot attack other players in PvP prohibited areas.",
|
||||
{}));
|
||||
|
||||
return false;
|
||||
}
|
||||
@ -93,7 +103,10 @@ bool AttackAction::Attack(Unit* target, bool /*with_pet*/ /*true*/)
|
||||
if (bot->IsFriendlyTo(target))
|
||||
{
|
||||
if (verbose)
|
||||
botAI->TellError(std::string(target->GetName()) + " is friendly to me.");
|
||||
botAI->TellError(PlayerbotTextMgr::instance().GetBotTextOrDefault(
|
||||
"attack_target_friendly_error",
|
||||
"%target is friendly to me.",
|
||||
{{"%target", target->GetName()}}));
|
||||
|
||||
return false;
|
||||
}
|
||||
@ -101,7 +114,10 @@ bool AttackAction::Attack(Unit* target, bool /*with_pet*/ /*true*/)
|
||||
if (target->isDead())
|
||||
{
|
||||
if (verbose)
|
||||
botAI->TellError(std::string(target->GetName()) + " is dead.");
|
||||
botAI->TellError(PlayerbotTextMgr::instance().GetBotTextOrDefault(
|
||||
"attack_target_dead_error",
|
||||
"%target is dead.",
|
||||
{{"%target", target->GetName()}}));
|
||||
|
||||
return false;
|
||||
}
|
||||
@ -109,7 +125,10 @@ bool AttackAction::Attack(Unit* target, bool /*with_pet*/ /*true*/)
|
||||
if (!bot->IsWithinLOSInMap(target))
|
||||
{
|
||||
if (verbose)
|
||||
botAI->TellError(std::string(target->GetName()) + " is not in my sight.");
|
||||
botAI->TellError(PlayerbotTextMgr::instance().GetBotTextOrDefault(
|
||||
"attack_target_not_in_sight_error",
|
||||
"%target is not in my sight.",
|
||||
{{"%target", target->GetName()}}));
|
||||
|
||||
return false;
|
||||
}
|
||||
@ -129,7 +148,10 @@ bool AttackAction::Attack(Unit* target, bool /*with_pet*/ /*true*/)
|
||||
if (sameTarget && inCombat && sameAttackMode)
|
||||
{
|
||||
if (verbose)
|
||||
botAI->TellError("I am already attacking " + std::string(target->GetName()) + ".");
|
||||
botAI->TellError(PlayerbotTextMgr::instance().GetBotTextOrDefault(
|
||||
"attack_already_attacking_error",
|
||||
"I am already attacking %target.",
|
||||
{{"%target", target->GetName()}}));
|
||||
|
||||
return false;
|
||||
}
|
||||
@ -137,7 +159,8 @@ bool AttackAction::Attack(Unit* target, bool /*with_pet*/ /*true*/)
|
||||
if (!bot->IsValidAttackTarget(target))
|
||||
{
|
||||
if (verbose)
|
||||
botAI->TellError("I cannot attack an invalid target.");
|
||||
botAI->TellError(PlayerbotTextMgr::instance().GetBotTextOrDefault(
|
||||
"attack_invalid_target_error", "I cannot attack an invalid target.", {}));
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
@ -7,6 +7,7 @@
|
||||
|
||||
#include "Event.h"
|
||||
#include "ItemCountValue.h"
|
||||
#include "PlayerbotTextMgr.h"
|
||||
#include "Playerbots.h"
|
||||
|
||||
bool BankAction::Execute(Event event)
|
||||
@ -23,7 +24,8 @@ bool BankAction::Execute(Event event)
|
||||
return ExecuteBank(text, npc);
|
||||
}
|
||||
|
||||
botAI->TellError("Cannot find banker nearby");
|
||||
botAI->TellError(PlayerbotTextMgr::instance().GetBotTextOrDefault(
|
||||
"bank_no_banker_nearby_error", "Cannot find banker nearby", {}));
|
||||
return false;
|
||||
}
|
||||
|
||||
|
||||
@ -7,6 +7,7 @@
|
||||
|
||||
#include "Event.h"
|
||||
#include "Formations.h"
|
||||
#include "PlayerbotTextMgr.h"
|
||||
#include "Playerbots.h"
|
||||
#include "PositionValue.h"
|
||||
|
||||
@ -85,7 +86,8 @@ bool FollowChatShortcutAction::Execute(Event /*event*/)
|
||||
|
||||
if (moved)
|
||||
{
|
||||
botAI->TellMaster("Following");
|
||||
botAI->TellMaster(PlayerbotTextMgr::instance().GetBotTextOrDefault(
|
||||
"following", "Following", {}));
|
||||
return true;
|
||||
}
|
||||
}
|
||||
@ -108,7 +110,8 @@ bool FollowChatShortcutAction::Execute(Event /*event*/)
|
||||
}
|
||||
*/
|
||||
|
||||
botAI->TellMaster("Following");
|
||||
botAI->TellMaster(PlayerbotTextMgr::instance().GetBotTextOrDefault(
|
||||
"following", "Following", {}));
|
||||
return true;
|
||||
}
|
||||
|
||||
@ -125,7 +128,8 @@ bool StayChatShortcutAction::Execute(Event /*event*/)
|
||||
SetReturnPosition(bot->GetPositionX(), bot->GetPositionY(), bot->GetPositionZ());
|
||||
SetStayPosition(bot->GetPositionX(), bot->GetPositionY(), bot->GetPositionZ());
|
||||
|
||||
botAI->TellMaster("Staying");
|
||||
botAI->TellMaster(PlayerbotTextMgr::instance().GetBotTextOrDefault(
|
||||
"staying", "Staying", {}));
|
||||
return true;
|
||||
}
|
||||
|
||||
@ -140,7 +144,8 @@ bool MoveFromGroupChatShortcutAction::Execute(Event /*event*/)
|
||||
botAI->ChangeStrategy("+move from group", BOT_STATE_NON_COMBAT);
|
||||
botAI->ChangeStrategy("+move from group", BOT_STATE_COMBAT);
|
||||
|
||||
botAI->TellMaster("Moving away from group");
|
||||
botAI->TellMaster(PlayerbotTextMgr::instance().GetBotTextOrDefault(
|
||||
"move_from_group", "Moving away from group", {}));
|
||||
return true;
|
||||
}
|
||||
|
||||
@ -159,11 +164,13 @@ bool FleeChatShortcutAction::Execute(Event /*event*/)
|
||||
|
||||
if (bot->GetMapId() != master->GetMapId() || bot->GetDistance(master) > sPlayerbotAIConfig.sightDistance)
|
||||
{
|
||||
botAI->TellError("I will not flee with you - too far away");
|
||||
botAI->TellError(PlayerbotTextMgr::instance().GetBotTextOrDefault(
|
||||
"fleeing_far", "I will not flee with you - too far away", {}));
|
||||
return true;
|
||||
}
|
||||
|
||||
botAI->TellMaster("Fleeing");
|
||||
botAI->TellMaster(PlayerbotTextMgr::instance().GetBotTextOrDefault(
|
||||
"fleeing", "Fleeing", {}));
|
||||
return true;
|
||||
}
|
||||
|
||||
@ -180,7 +187,8 @@ bool GoawayChatShortcutAction::Execute(Event /*event*/)
|
||||
ResetReturnPosition();
|
||||
ResetStayPosition();
|
||||
|
||||
botAI->TellMaster("Running away");
|
||||
botAI->TellMaster(PlayerbotTextMgr::instance().GetBotTextOrDefault(
|
||||
"running_away", "Running away", {}));
|
||||
return true;
|
||||
}
|
||||
|
||||
@ -196,7 +204,8 @@ bool GrindChatShortcutAction::Execute(Event /*event*/)
|
||||
ResetReturnPosition();
|
||||
ResetStayPosition();
|
||||
|
||||
botAI->TellMaster("Grinding");
|
||||
botAI->TellMaster(PlayerbotTextMgr::instance().GetBotTextOrDefault(
|
||||
"grinding", "Grinding", {}));
|
||||
return true;
|
||||
}
|
||||
|
||||
@ -216,7 +225,8 @@ bool TankAttackChatShortcutAction::Execute(Event /*event*/)
|
||||
ResetReturnPosition();
|
||||
ResetStayPosition();
|
||||
|
||||
botAI->TellMaster("Attacking");
|
||||
botAI->TellMaster(PlayerbotTextMgr::instance().GetBotTextOrDefault(
|
||||
"attacking", "Attacking", {}));
|
||||
return true;
|
||||
}
|
||||
|
||||
|
||||
@ -7,6 +7,7 @@
|
||||
|
||||
#include "ChatHelper.h"
|
||||
#include "Event.h"
|
||||
#include "PlayerbotTextMgr.h"
|
||||
#include "Playerbots.h"
|
||||
|
||||
bool DropQuestAction::Execute(Event event)
|
||||
@ -51,10 +52,15 @@ bool DropQuestAction::Execute(Event event)
|
||||
const Quest* pQuest = sObjectMgr->GetQuestTemplate(entry);
|
||||
const std::string text_quest = ChatHelper::FormatQuest(pQuest);
|
||||
LOG_INFO("playerbots", "{} => Quest [ {} ] removed", bot->GetName(), pQuest->GetTitle());
|
||||
bot->Say("Quest [ " + text_quest + " ] removed", LANG_UNIVERSAL);
|
||||
std::string text = PlayerbotTextMgr::instance().GetBotTextOrDefault(
|
||||
"quest_removed_debug",
|
||||
"Quest [%quest] removed",
|
||||
{{"%quest", text_quest}});
|
||||
bot->Say(text, LANG_UNIVERSAL);
|
||||
}
|
||||
|
||||
botAI->TellMaster("Quest removed");
|
||||
botAI->TellMaster(PlayerbotTextMgr::instance().GetBotTextOrDefault(
|
||||
"quest_remove", "Quest removed", {}));
|
||||
return true;
|
||||
}
|
||||
|
||||
@ -69,7 +75,10 @@ bool CleanQuestLogAction::Execute(Event event)
|
||||
|
||||
// Only output this message if "debug rpg" strategy is enabled
|
||||
if (botAI->HasStrategy("debug rpg", BotState::BOT_STATE_COMBAT))
|
||||
botAI->TellMaster("Clean Quest Log command received, removing grey/trivial quests...");
|
||||
botAI->TellMaster(PlayerbotTextMgr::instance().GetBotTextOrDefault(
|
||||
"clean_quest_log_started",
|
||||
"Clean Quest Log command received, removing grey/trivial quests...",
|
||||
{}));
|
||||
|
||||
uint8 botLevel = bot->GetLevel(); // Get bot's level
|
||||
|
||||
@ -103,7 +112,10 @@ bool CleanQuestLogAction::Execute(Event event)
|
||||
{
|
||||
// Output only if "debug rpg" strategy is enabled
|
||||
if (botAI->HasStrategy("debug rpg", BotState::BOT_STATE_COMBAT))
|
||||
botAI->TellMaster("Quest [ " + quest->GetTitle() + " ] will be removed because it is trivial (grey).");
|
||||
botAI->TellMaster(PlayerbotTextMgr::instance().GetBotTextOrDefault(
|
||||
"quest_trivial_will_remove",
|
||||
"Quest [%title] will be removed because it is trivial (grey).",
|
||||
{{"%title", quest->GetTitle()}}));
|
||||
|
||||
// Remove quest
|
||||
botAI->rpgStatistic.questDropped++;
|
||||
@ -116,17 +128,27 @@ bool CleanQuestLogAction::Execute(Event event)
|
||||
{
|
||||
const std::string text_quest = ChatHelper::FormatQuest(quest);
|
||||
LOG_INFO("playerbots", "{} => Quest [ {} ] removed", bot->GetName(), quest->GetTitle());
|
||||
bot->Say("Quest [ " + text_quest + " ] removed", LANG_UNIVERSAL);
|
||||
std::string text = PlayerbotTextMgr::instance().GetBotTextOrDefault(
|
||||
"quest_removed_debug",
|
||||
"Quest [%quest] removed",
|
||||
{{"%quest", text_quest}});
|
||||
bot->Say(text, LANG_UNIVERSAL);
|
||||
}
|
||||
|
||||
if (botAI->HasStrategy("debug rpg", BotState::BOT_STATE_COMBAT))
|
||||
botAI->TellMaster("Quest [ " + quest->GetTitle() + " ] has been removed.");
|
||||
botAI->TellMaster(PlayerbotTextMgr::instance().GetBotTextOrDefault(
|
||||
"quest_has_been_removed",
|
||||
"Quest [%title] has been removed.",
|
||||
{{"%title", quest->GetTitle()}}));
|
||||
}
|
||||
else
|
||||
{
|
||||
// Only output if "debug rpg" strategy is enabled
|
||||
if (botAI->HasStrategy("debug rpg", BotState::BOT_STATE_COMBAT))
|
||||
botAI->TellMaster("Quest [ " + quest->GetTitle() + " ] is not trivial and will be kept.");
|
||||
botAI->TellMaster(PlayerbotTextMgr::instance().GetBotTextOrDefault(
|
||||
"quest_not_trivial_kept",
|
||||
"Quest [%title] is not trivial and will be kept.",
|
||||
{{"%title", quest->GetTitle()}}));
|
||||
}
|
||||
}
|
||||
|
||||
@ -204,9 +226,16 @@ void CleanQuestLogAction::DropQuestType(uint8& numQuest, uint8 wantNum, bool isG
|
||||
{
|
||||
const std::string text_quest = ChatHelper::FormatQuest(quest);
|
||||
LOG_INFO("playerbots", "{} => Quest [ {} ] removed", bot->GetName(), quest->GetTitle());
|
||||
bot->Say("Quest [ " + text_quest + " ] removed", LANG_UNIVERSAL);
|
||||
std::string text = PlayerbotTextMgr::instance().GetBotTextOrDefault(
|
||||
"quest_removed_debug",
|
||||
"Quest [%quest] removed",
|
||||
{{"%quest", text_quest}});
|
||||
bot->Say(text, LANG_UNIVERSAL);
|
||||
}
|
||||
botAI->TellMaster("Quest removed" + chat->FormatQuest(quest));
|
||||
botAI->TellMaster(PlayerbotTextMgr::instance().GetBotTextOrDefault(
|
||||
"quest_removed_with_name",
|
||||
"Quest removed %quest",
|
||||
{{"%quest", chat->FormatQuest(quest)}}));
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@ -8,6 +8,7 @@
|
||||
#include "Player.h"
|
||||
#include "Pet.h"
|
||||
#include "PlayerbotAIConfig.h"
|
||||
#include "PlayerbotTextMgr.h"
|
||||
#include "CreatureAI.h"
|
||||
#include "Playerbots.h"
|
||||
#include "CharmInfo.h"
|
||||
@ -178,7 +179,8 @@ bool SetPetStanceAction::Execute(Event /*event*/)
|
||||
// If there are no controlled pets or guardians, notify the player and exit
|
||||
if (targets.empty())
|
||||
{
|
||||
botAI->TellError("You have no pet or guardian pet.");
|
||||
botAI->TellError(PlayerbotTextMgr::instance().GetBotTextOrDefault(
|
||||
"pet_no_pet_error", "You have no pet or guardian pet.", {}));
|
||||
return false;
|
||||
}
|
||||
|
||||
|
||||
@ -8,6 +8,7 @@
|
||||
#include "Event.h"
|
||||
#include "GuildPackets.h"
|
||||
#include "PlayerbotSecurity.h"
|
||||
#include "PlayerbotTextMgr.h"
|
||||
#include "Playerbots.h"
|
||||
|
||||
bool GuildAcceptAction::Execute(Event event)
|
||||
@ -28,17 +29,20 @@ bool GuildAcceptAction::Execute(Event event)
|
||||
uint32 guildId = inviter->GetGuildId();
|
||||
if (!guildId)
|
||||
{
|
||||
botAI->TellError("You are not in a guild!");
|
||||
botAI->TellError(PlayerbotTextMgr::instance().GetBotTextOrDefault(
|
||||
"guild_accept_inviter_not_in_guild", "You are not in a guild!", {}));
|
||||
accept = false;
|
||||
}
|
||||
else if (bot->GetGuildId())
|
||||
{
|
||||
botAI->TellError("Sorry, I am in a guild already");
|
||||
botAI->TellError(PlayerbotTextMgr::instance().GetBotTextOrDefault(
|
||||
"guild_accept_already_in_guild", "Sorry, I am in a guild already", {}));
|
||||
accept = false;
|
||||
}
|
||||
else if (!botAI->GetSecurity()->CheckLevelFor(PLAYERBOT_SECURITY_INVITE, false, inviter, true))
|
||||
{
|
||||
botAI->TellError("Sorry, I don't want to join your guild :(");
|
||||
botAI->TellError(PlayerbotTextMgr::instance().GetBotTextOrDefault(
|
||||
"guild_accept_declined", "Sorry, I don't want to join your guild :(", {}));
|
||||
accept = false;
|
||||
}
|
||||
|
||||
|
||||
@ -7,6 +7,7 @@
|
||||
|
||||
#include "Event.h"
|
||||
#include "PlayerbotAIConfig.h"
|
||||
#include "PlayerbotTextMgr.h"
|
||||
#include "Playerbots.h"
|
||||
|
||||
bool LeaveGroupAction::Execute(Event event)
|
||||
@ -86,7 +87,9 @@ bool LeaveGroupAction::Leave()
|
||||
|
||||
Player* master = botAI -> GetMaster();
|
||||
if (master)
|
||||
botAI->TellMaster("Goodbye!", PLAYERBOT_SECURITY_TALK);
|
||||
botAI->TellMaster(
|
||||
PlayerbotTextMgr::instance().GetBotTextOrDefault("goodbye", "Goodbye!", {}),
|
||||
PLAYERBOT_SECURITY_TALK);
|
||||
|
||||
botAI->LeaveOrDisbandGroup();
|
||||
return true;
|
||||
|
||||
@ -7,6 +7,7 @@
|
||||
|
||||
#include "Event.h"
|
||||
#include "ItemVisitors.h"
|
||||
#include "PlayerbotTextMgr.h"
|
||||
#include "PlayerbotRepository.h"
|
||||
#include "Playerbots.h"
|
||||
#include "ItemPackets.h"
|
||||
@ -18,9 +19,12 @@ bool OutfitAction::Execute(Event event)
|
||||
if (param == "?")
|
||||
{
|
||||
List();
|
||||
botAI->TellMaster("outfit <name> +[item] to add items");
|
||||
botAI->TellMaster("outfit <name> -[item] to remove items");
|
||||
botAI->TellMaster("outfit <name> equip/replace to equip items");
|
||||
botAI->TellMaster(PlayerbotTextMgr::instance().GetBotTextOrDefault(
|
||||
"outfit_usage_add", "outfit <name> +[item] to add items", {}));
|
||||
botAI->TellMaster(PlayerbotTextMgr::instance().GetBotTextOrDefault(
|
||||
"outfit_usage_remove", "outfit <name> -[item] to remove items", {}));
|
||||
botAI->TellMaster(PlayerbotTextMgr::instance().GetBotTextOrDefault(
|
||||
"outfit_usage_equip", "outfit <name> equip/replace to equip items", {}));
|
||||
}
|
||||
else
|
||||
{
|
||||
@ -32,8 +36,10 @@ bool OutfitAction::Execute(Event event)
|
||||
PlayerbotRepository::instance().Save(botAI);
|
||||
|
||||
std::ostringstream out;
|
||||
out << "Setting outfit " << name << " as " << param;
|
||||
botAI->TellMaster(out);
|
||||
botAI->TellMaster(PlayerbotTextMgr::instance().GetBotTextOrDefault(
|
||||
"outfit_set_as",
|
||||
"Setting outfit %name as %param",
|
||||
{{"%name", name}, {"%param", param}}));
|
||||
return true;
|
||||
}
|
||||
|
||||
@ -49,18 +55,20 @@ bool OutfitAction::Execute(Event event)
|
||||
std::string const command = param.substr(space + 1);
|
||||
if (command == "equip")
|
||||
{
|
||||
std::ostringstream out;
|
||||
out << "Equipping outfit " << name;
|
||||
botAI->TellMaster(out);
|
||||
botAI->TellMaster(PlayerbotTextMgr::instance().GetBotTextOrDefault(
|
||||
"outfit_equipping",
|
||||
"Equipping outfit %name",
|
||||
{{"%name", name}}));
|
||||
|
||||
EquipItems(outfit);
|
||||
return true;
|
||||
}
|
||||
else if (command == "replace")
|
||||
{
|
||||
std::ostringstream out;
|
||||
out << "Replacing current equip with outfit " << name;
|
||||
botAI->TellMaster(out);
|
||||
botAI->TellMaster(PlayerbotTextMgr::instance().GetBotTextOrDefault(
|
||||
"outfit_replace_current",
|
||||
"Replacing current equip with outfit %name",
|
||||
{{"%name", name}}));
|
||||
|
||||
for (uint8 slot = EQUIPMENT_SLOT_START; slot < EQUIPMENT_SLOT_END; slot++)
|
||||
{
|
||||
@ -83,9 +91,10 @@ bool OutfitAction::Execute(Event event)
|
||||
}
|
||||
else if (command == "reset")
|
||||
{
|
||||
std::ostringstream out;
|
||||
out << "Resetting outfit " << name;
|
||||
botAI->TellMaster(out);
|
||||
botAI->TellMaster(PlayerbotTextMgr::instance().GetBotTextOrDefault(
|
||||
"outfit_resetting",
|
||||
"Resetting outfit %name",
|
||||
{{"%name", name}}));
|
||||
|
||||
Save(name, ItemIds());
|
||||
PlayerbotRepository::instance().Save(botAI);
|
||||
@ -93,9 +102,10 @@ bool OutfitAction::Execute(Event event)
|
||||
}
|
||||
else if (command == "update")
|
||||
{
|
||||
std::ostringstream out;
|
||||
out << "Updating with current items outfit " << name;
|
||||
botAI->TellMaster(out);
|
||||
botAI->TellMaster(PlayerbotTextMgr::instance().GetBotTextOrDefault(
|
||||
"outfit_updating_current",
|
||||
"Updating with current items outfit %name",
|
||||
{{"%name", name}}));
|
||||
|
||||
Update(name);
|
||||
PlayerbotRepository::instance().Save(botAI);
|
||||
@ -107,24 +117,25 @@ bool OutfitAction::Execute(Event event)
|
||||
{
|
||||
ItemTemplate const* proto = sObjectMgr->GetItemTemplate(itemid);
|
||||
|
||||
std::ostringstream out;
|
||||
out << chat->FormatItem(proto);
|
||||
if (remove)
|
||||
{
|
||||
std::set<uint32>::iterator j = outfit.find(itemid);
|
||||
if (j != outfit.end())
|
||||
outfit.erase(j);
|
||||
|
||||
out << " removed from ";
|
||||
botAI->TellMaster(PlayerbotTextMgr::instance().GetBotTextOrDefault(
|
||||
"outfit_item_removed_from",
|
||||
"%item removed from %name",
|
||||
{{"%item", chat->FormatItem(proto)}, {"%name", name}}));
|
||||
}
|
||||
else
|
||||
{
|
||||
outfit.insert(itemid);
|
||||
out << " added to ";
|
||||
botAI->TellMaster(PlayerbotTextMgr::instance().GetBotTextOrDefault(
|
||||
"outfit_item_added_to",
|
||||
"%item added to %name",
|
||||
{{"%item", chat->FormatItem(proto)}, {"%name", name}}));
|
||||
}
|
||||
|
||||
out << name;
|
||||
botAI->TellMaster(out.str());
|
||||
}
|
||||
|
||||
Save(name, outfit);
|
||||
|
||||
@ -10,6 +10,7 @@
|
||||
#include "NearestNpcsValue.h"
|
||||
#include "ObjectDefines.h"
|
||||
#include "ObjectGuid.h"
|
||||
#include "PlayerbotTextMgr.h"
|
||||
#include "Playerbots.h"
|
||||
#include "ServerFacade.h"
|
||||
#include "Corpse.h"
|
||||
@ -22,7 +23,8 @@ bool ReleaseSpiritAction::Execute(Event event)
|
||||
{
|
||||
if (!bot->InBattleground())
|
||||
{
|
||||
botAI->TellMasterNoFacing("I am not dead, will wait here");
|
||||
botAI->TellMasterNoFacing(PlayerbotTextMgr::instance().GetBotTextOrDefault(
|
||||
"release_spirit_not_dead_wait", "I am not dead, will wait here", {}));
|
||||
// -follow in bg is overwriten each tick with +follow
|
||||
// +stay in bg causes stuttering effect as bot is cycled between +stay and +follow each tick
|
||||
botAI->ChangeStrategy("-follow,+stay", BOT_STATE_NON_COMBAT);
|
||||
@ -33,14 +35,15 @@ bool ReleaseSpiritAction::Execute(Event event)
|
||||
|
||||
if (bot->GetCorpse() && bot->HasPlayerFlag(PLAYER_FLAGS_GHOST))
|
||||
{
|
||||
botAI->TellMasterNoFacing("I am already a spirit");
|
||||
botAI->TellMasterNoFacing(PlayerbotTextMgr::instance().GetBotTextOrDefault(
|
||||
"release_spirit_already_spirit", "I am already a spirit", {}));
|
||||
return false;
|
||||
}
|
||||
|
||||
const WorldPacket& packet = event.getPacket();
|
||||
const std::string message = !packet.empty() && packet.GetOpcode() == CMSG_REPOP_REQUEST
|
||||
? "Releasing..."
|
||||
: "Meet me at the graveyard";
|
||||
? PlayerbotTextMgr::instance().GetBotTextOrDefault("release_spirit_releasing", "Releasing...", {})
|
||||
: PlayerbotTextMgr::instance().GetBotTextOrDefault("release_spirit_meet_graveyard", "Meet me at the graveyard", {});
|
||||
botAI->TellMasterNoFacing(message);
|
||||
|
||||
IncrementDeathCount();
|
||||
|
||||
@ -9,6 +9,7 @@
|
||||
#include "FleeManager.h"
|
||||
#include "GameGraveyard.h"
|
||||
#include "MapMgr.h"
|
||||
#include "PlayerbotTextMgr.h"
|
||||
#include "Playerbots.h"
|
||||
#include "RandomPlayerbotMgr.h"
|
||||
#include "ServerFacade.h"
|
||||
@ -322,7 +323,7 @@ bool SpiritHealerAction::Execute(Event /*event*/)
|
||||
bot->SpawnCorpseBones();
|
||||
context->GetValue<Unit*>("current target")->Set(nullptr);
|
||||
bot->SetTarget();
|
||||
botAI->TellMaster("Hello");
|
||||
botAI->TellMaster(PlayerbotTextMgr::instance().GetBotTextOrDefault("hello", "Hello", {}));
|
||||
|
||||
if (dCount > 20)
|
||||
context->GetValue<uint32>("death count")->Set(0);
|
||||
|
||||
@ -9,6 +9,7 @@
|
||||
#include "Event.h"
|
||||
#include "ItemVisitors.h"
|
||||
#include "Mail.h"
|
||||
#include "PlayerbotTextMgr.h"
|
||||
#include "Playerbots.h"
|
||||
|
||||
bool SendMailAction::Execute(Event event)
|
||||
@ -53,14 +54,18 @@ bool SendMailAction::Execute(Event event)
|
||||
|
||||
if (!mailboxFound && !randomBot)
|
||||
{
|
||||
bot->Whisper("There is no mailbox nearby", LANG_UNIVERSAL, tellTo);
|
||||
bot->Whisper(PlayerbotTextMgr::instance().GetBotTextOrDefault(
|
||||
"send_mail_no_mailbox_nearby", "There is no mailbox nearby", {}),
|
||||
LANG_UNIVERSAL, tellTo);
|
||||
return false;
|
||||
}
|
||||
|
||||
ItemIds ids = chat->parseItems(text);
|
||||
if (ids.size() > 1)
|
||||
{
|
||||
bot->Whisper("You can not request more than one item", LANG_UNIVERSAL, tellTo);
|
||||
bot->Whisper(PlayerbotTextMgr::instance().GetBotTextOrDefault(
|
||||
"send_mail_one_item_only", "You can not request more than one item", {}),
|
||||
LANG_UNIVERSAL, tellTo);
|
||||
return false;
|
||||
}
|
||||
|
||||
@ -72,13 +77,16 @@ bool SendMailAction::Execute(Event event)
|
||||
|
||||
if (randomBot)
|
||||
{
|
||||
bot->Whisper("I cannot send money", LANG_UNIVERSAL, tellTo);
|
||||
bot->Whisper(PlayerbotTextMgr::instance().GetBotTextOrDefault(
|
||||
"send_mail_cannot_send_money", "I cannot send money", {}),
|
||||
LANG_UNIVERSAL, tellTo);
|
||||
return false;
|
||||
}
|
||||
|
||||
if (bot->GetMoney() < money)
|
||||
{
|
||||
botAI->TellError("I don't have enough money");
|
||||
botAI->TellError(PlayerbotTextMgr::instance().GetBotTextOrDefault(
|
||||
"send_mail_not_enough_money", "I don't have enough money", {}));
|
||||
return false;
|
||||
}
|
||||
|
||||
@ -100,8 +108,10 @@ bool SendMailAction::Execute(Event event)
|
||||
CharacterDatabase.CommitTransaction(trans);
|
||||
|
||||
std::ostringstream out;
|
||||
out << "Sending mail to " << receiver->GetName();
|
||||
botAI->TellMaster(out.str());
|
||||
botAI->TellMaster(PlayerbotTextMgr::instance().GetBotTextOrDefault(
|
||||
"send_mail_sending_to",
|
||||
"Sending mail to %receiver",
|
||||
{{"%receiver", receiver->GetName()}}));
|
||||
return true;
|
||||
}
|
||||
|
||||
@ -125,7 +135,10 @@ bool SendMailAction::Execute(Event event)
|
||||
if (item->IsSoulBound() || item->IsConjuredConsumable())
|
||||
{
|
||||
std::ostringstream out;
|
||||
out << "Cannot send " << ChatHelper::FormatItem(item->GetTemplate());
|
||||
out << PlayerbotTextMgr::instance().GetBotTextOrDefault(
|
||||
"send_mail_cannot_send_item",
|
||||
"Cannot send %item",
|
||||
{{"%item", ChatHelper::FormatItem(item->GetTemplate())}});
|
||||
bot->Whisper(out.str(), LANG_UNIVERSAL, tellTo);
|
||||
continue;
|
||||
}
|
||||
@ -140,7 +153,10 @@ bool SendMailAction::Execute(Event event)
|
||||
if (!price)
|
||||
{
|
||||
std::ostringstream out;
|
||||
out << ChatHelper::FormatItem(item->GetTemplate()) << ": it is not for sale";
|
||||
out << PlayerbotTextMgr::instance().GetBotTextOrDefault(
|
||||
"send_mail_item_not_for_sale",
|
||||
"%item: it is not for sale",
|
||||
{{"%item", ChatHelper::FormatItem(item->GetTemplate())}});
|
||||
bot->Whisper(out.str(), LANG_UNIVERSAL, tellTo);
|
||||
return false;
|
||||
}
|
||||
@ -160,7 +176,10 @@ bool SendMailAction::Execute(Event event)
|
||||
CharacterDatabase.CommitTransaction(trans);
|
||||
|
||||
std::ostringstream out;
|
||||
out << "Sent mail to " << receiver->GetName();
|
||||
out << PlayerbotTextMgr::instance().GetBotTextOrDefault(
|
||||
"send_mail_sent_to",
|
||||
"Sent mail to %receiver",
|
||||
{{"%receiver", receiver->GetName()}});
|
||||
bot->Whisper(out.str(), LANG_UNIVERSAL, tellTo);
|
||||
return true;
|
||||
}
|
||||
|
||||
@ -8,6 +8,7 @@
|
||||
#include "ChatHelper.h"
|
||||
#include "CraftValue.h"
|
||||
#include "Event.h"
|
||||
#include "PlayerbotTextMgr.h"
|
||||
#include "Playerbots.h"
|
||||
|
||||
std::map<uint32, SkillLineAbilityEntry const*> SetCraftAction::skillSpells;
|
||||
@ -24,7 +25,8 @@ bool SetCraftAction::Execute(Event event)
|
||||
if (link == "reset")
|
||||
{
|
||||
data.Reset();
|
||||
botAI->TellMaster("I will not craft anything");
|
||||
botAI->TellMaster(PlayerbotTextMgr::instance().GetBotTextOrDefault(
|
||||
"craft_reset", "I will not craft anything", {}));
|
||||
return true;
|
||||
}
|
||||
|
||||
@ -37,7 +39,8 @@ bool SetCraftAction::Execute(Event event)
|
||||
ItemIds itemIds = chat->parseItems(link);
|
||||
if (itemIds.empty())
|
||||
{
|
||||
botAI->TellMaster("Usage: 'craft [itemId]' or 'craft reset'");
|
||||
botAI->TellMaster(PlayerbotTextMgr::instance().GetBotTextOrDefault(
|
||||
"craft_usage", "Usage: 'craft [itemId]' or 'craft reset'", {}));
|
||||
return false;
|
||||
}
|
||||
|
||||
@ -94,7 +97,8 @@ bool SetCraftAction::Execute(Event event)
|
||||
|
||||
if (data.required.empty())
|
||||
{
|
||||
botAI->TellMaster("I cannot craft this");
|
||||
botAI->TellMaster(PlayerbotTextMgr::instance().GetBotTextOrDefault(
|
||||
"craft_cannot_craft", "I cannot craft this", {}));
|
||||
return false;
|
||||
}
|
||||
|
||||
@ -109,7 +113,8 @@ void SetCraftAction::TellCraft()
|
||||
CraftData& data = AI_VALUE(CraftData&, "craft");
|
||||
if (data.IsEmpty())
|
||||
{
|
||||
botAI->TellMaster("I will not craft anything");
|
||||
botAI->TellMaster(PlayerbotTextMgr::instance().GetBotTextOrDefault(
|
||||
"craft_reset", "I will not craft anything", {}));
|
||||
return;
|
||||
}
|
||||
|
||||
@ -117,8 +122,7 @@ void SetCraftAction::TellCraft()
|
||||
if (!proto)
|
||||
return;
|
||||
|
||||
std::ostringstream out;
|
||||
out << "I will craft " << chat->FormatItem(proto) << " using reagents: ";
|
||||
std::ostringstream reagentsOut;
|
||||
|
||||
bool first = true;
|
||||
for (std::map<uint32, uint32>::iterator i = data.required.begin(); i != data.required.end(); ++i)
|
||||
@ -130,20 +134,23 @@ void SetCraftAction::TellCraft()
|
||||
{
|
||||
if (first)
|
||||
first = false;
|
||||
|
||||
else
|
||||
out << ", ";
|
||||
reagentsOut << ", ";
|
||||
|
||||
out << chat->FormatItem(reagent, required);
|
||||
reagentsOut << chat->FormatItem(reagent, required);
|
||||
|
||||
uint32 given = data.obtained[item];
|
||||
if (given)
|
||||
out << "|cffffff00(x" << given << " given)|r ";
|
||||
reagentsOut << "|cffffff00(x" << given << " given)|r ";
|
||||
}
|
||||
}
|
||||
|
||||
out << " (craft fee: " << chat->formatMoney(GetCraftFee(data)) << ")";
|
||||
botAI->TellMaster(out.str());
|
||||
botAI->TellMaster(PlayerbotTextMgr::instance().GetBotTextOrDefault(
|
||||
"craft_summary",
|
||||
"I will craft %item using reagents: %reagents (craft fee: %money)",
|
||||
{{"%item", chat->FormatItem(proto)},
|
||||
{"%reagents", reagentsOut.str()},
|
||||
{"%money", chat->formatMoney(GetCraftFee(data))}}));
|
||||
}
|
||||
|
||||
uint32 SetCraftAction::GetCraftFee(CraftData& data)
|
||||
|
||||
@ -6,6 +6,7 @@
|
||||
#include "SetHomeAction.h"
|
||||
|
||||
#include "Event.h"
|
||||
#include "PlayerbotTextMgr.h"
|
||||
#include "Playerbots.h"
|
||||
|
||||
bool SetHomeAction::Execute(Event /*event*/)
|
||||
@ -28,7 +29,8 @@ bool SetHomeAction::Execute(Event /*event*/)
|
||||
{
|
||||
Creature* creature = botAI->GetCreature(selection);
|
||||
bot->GetSession()->SendBindPoint(creature);
|
||||
botAI->TellMaster("This inn is my new home");
|
||||
botAI->TellMaster(PlayerbotTextMgr::instance().GetBotTextOrDefault(
|
||||
"set_home_success", "This inn is my new home", {}));
|
||||
return true;
|
||||
}
|
||||
|
||||
@ -40,10 +42,12 @@ bool SetHomeAction::Execute(Event /*event*/)
|
||||
continue;
|
||||
|
||||
bot->GetSession()->SendBindPoint(unit);
|
||||
botAI->TellMaster("This inn is my new home");
|
||||
botAI->TellMaster(PlayerbotTextMgr::instance().GetBotTextOrDefault(
|
||||
"set_home_success", "This inn is my new home", {}));
|
||||
return true;
|
||||
}
|
||||
|
||||
botAI->TellError("Can't find any innkeeper around");
|
||||
botAI->TellError(PlayerbotTextMgr::instance().GetBotTextOrDefault(
|
||||
"set_home_no_innkeeper_error", "Can't find any innkeeper around", {}));
|
||||
return false;
|
||||
}
|
||||
|
||||
@ -6,6 +6,7 @@
|
||||
#include "ShareQuestAction.h"
|
||||
|
||||
#include "Event.h"
|
||||
#include "PlayerbotTextMgr.h"
|
||||
#include "Playerbots.h"
|
||||
|
||||
bool ShareQuestAction::Execute(Event event)
|
||||
@ -32,7 +33,8 @@ bool ShareQuestAction::Execute(Event event)
|
||||
WorldPacket p;
|
||||
p << entry;
|
||||
bot->GetSession()->HandlePushQuestToParty(p);
|
||||
botAI->TellMaster("Quest shared");
|
||||
botAI->TellMaster(PlayerbotTextMgr::instance().GetBotTextOrDefault(
|
||||
"quest_shared", "Quest shared", {}));
|
||||
return true;
|
||||
}
|
||||
}
|
||||
@ -98,7 +100,8 @@ bool AutoShareQuestAction::Execute(Event /*event*/)
|
||||
WorldPacket p;
|
||||
p << logQuest;
|
||||
bot->GetSession()->HandlePushQuestToParty(p);
|
||||
botAI->TellMaster("Quest shared");
|
||||
botAI->TellMaster(PlayerbotTextMgr::instance().GetBotTextOrDefault(
|
||||
"quest_shared", "Quest shared", {}));
|
||||
shared = true;
|
||||
}
|
||||
|
||||
|
||||
@ -15,6 +15,7 @@
|
||||
#include "Player.h"
|
||||
#include "PlayerbotAI.h"
|
||||
#include "PlayerbotFactory.h"
|
||||
#include "PlayerbotTextMgr.h"
|
||||
#include "SpellMgr.h"
|
||||
#include "WorldSession.h"
|
||||
|
||||
@ -123,7 +124,8 @@ bool TameAction::Execute(Event event)
|
||||
}
|
||||
catch (...)
|
||||
{
|
||||
botAI->TellError("Invalid tame id.");
|
||||
botAI->TellError(PlayerbotTextMgr::instance().GetBotTextOrDefault(
|
||||
"tame_invalid_id_error", "Invalid tame id.", {}));
|
||||
}
|
||||
}
|
||||
else if (mode == "family" && !value.empty())
|
||||
@ -137,8 +139,10 @@ bool TameAction::Execute(Event event)
|
||||
else
|
||||
{
|
||||
// Unrecognized command or missing argument; show usage
|
||||
botAI->TellError(
|
||||
"Usage: tame name <name> | tame id <id> | tame family <family> | tame rename <new name> | tame abandon");
|
||||
botAI->TellError(PlayerbotTextMgr::instance().GetBotTextOrDefault(
|
||||
"tame_usage_error",
|
||||
"Usage: tame name <name> | tame id <id> | tame family <family> | tame rename <new name> | tame abandon",
|
||||
{}));
|
||||
return false;
|
||||
}
|
||||
|
||||
@ -157,12 +161,15 @@ bool TameAction::Execute(Event event)
|
||||
if (!lastPetName.empty() && lastPetId != 0)
|
||||
{
|
||||
std::ostringstream oss;
|
||||
oss << "Pet changed to " << lastPetName << ", ID: " << lastPetId << ".";
|
||||
botAI->TellMaster(oss.str());
|
||||
botAI->TellMaster(PlayerbotTextMgr::instance().GetBotTextOrDefault(
|
||||
"tame_pet_changed",
|
||||
"Pet changed to %name, ID: %id.",
|
||||
{{"%name", lastPetName}, {"%id", std::to_string(lastPetId)}}));
|
||||
}
|
||||
else
|
||||
{
|
||||
botAI->TellMaster("Pet changed and initialized!");
|
||||
botAI->TellMaster(PlayerbotTextMgr::instance().GetBotTextOrDefault(
|
||||
"tame_pet_changed_initialized", "Pet changed and initialized!", {}));
|
||||
}
|
||||
}
|
||||
|
||||
@ -197,7 +204,10 @@ bool TameAction::SetPetByName(const std::string& name)
|
||||
// If the creature is exotic and the bot doesn't have Beast Mastery, show error and fail
|
||||
if (IsExoticPet(&creature) && !HasBeastMastery(bot))
|
||||
{
|
||||
botAI->TellError("I cannot use exotic pets unless I have the Beast Mastery talent.");
|
||||
botAI->TellError(PlayerbotTextMgr::instance().GetBotTextOrDefault(
|
||||
"tame_exotic_requires_beast_mastery",
|
||||
"I cannot use exotic pets unless I have the Beast Mastery talent.",
|
||||
{}));
|
||||
return false;
|
||||
}
|
||||
|
||||
@ -214,7 +224,8 @@ bool TameAction::SetPetByName(const std::string& name)
|
||||
}
|
||||
|
||||
// If no suitable pet found, show an error and return failure
|
||||
botAI->TellError("No tameable pet found with name: " + name);
|
||||
botAI->TellError(PlayerbotTextMgr::instance().GetBotTextOrDefault(
|
||||
"tame_no_pet_by_name", "No tameable pet found with name: %name", {{"%name", name}}));
|
||||
return false;
|
||||
}
|
||||
|
||||
@ -231,21 +242,26 @@ bool TameAction::SetPetById(uint32 id)
|
||||
if (!creature->IsTameable(true))
|
||||
{
|
||||
// If not tameable at all, show an error and fail
|
||||
botAI->TellError("No tameable pet found with id: " + std::to_string(id));
|
||||
botAI->TellError(PlayerbotTextMgr::instance().GetBotTextOrDefault(
|
||||
"tame_no_pet_by_id", "No tameable pet found with id: %id", {{"%id", std::to_string(id)}}));
|
||||
return false;
|
||||
}
|
||||
|
||||
// If it's an exotic pet, make sure the bot has the Beast Mastery talent
|
||||
if (IsExoticPet(creature) && !HasBeastMastery(bot))
|
||||
{
|
||||
botAI->TellError("I cannot use exotic pets unless I have the Beast Mastery talent.");
|
||||
botAI->TellError(PlayerbotTextMgr::instance().GetBotTextOrDefault(
|
||||
"tame_exotic_requires_beast_mastery",
|
||||
"I cannot use exotic pets unless I have the Beast Mastery talent.",
|
||||
{}));
|
||||
return false;
|
||||
}
|
||||
|
||||
// Check if the bot is actually allowed to tame this pet (honoring exotic pet rules)
|
||||
if (!creature->IsTameable(bot->CanTameExoticPets()))
|
||||
{
|
||||
botAI->TellError("No tameable pet found with id: " + std::to_string(id));
|
||||
botAI->TellError(PlayerbotTextMgr::instance().GetBotTextOrDefault(
|
||||
"tame_no_pet_by_id", "No tameable pet found with id: %id", {{"%id", std::to_string(id)}}));
|
||||
return false;
|
||||
}
|
||||
|
||||
@ -257,7 +273,8 @@ bool TameAction::SetPetById(uint32 id)
|
||||
}
|
||||
|
||||
// If no valid creature was found by id, show an error
|
||||
botAI->TellError("No tameable pet found with id: " + std::to_string(id));
|
||||
botAI->TellError(PlayerbotTextMgr::instance().GetBotTextOrDefault(
|
||||
"tame_no_pet_by_id", "No tameable pet found with id: %id", {{"%id", std::to_string(id)}}));
|
||||
return false;
|
||||
}
|
||||
|
||||
@ -315,9 +332,13 @@ bool TameAction::SetPetByFamily(const std::string& family)
|
||||
if (candidates.empty())
|
||||
{
|
||||
if (foundExotic && !HasBeastMastery(bot))
|
||||
botAI->TellError("I cannot use exotic pets unless I have the Beast Mastery talent.");
|
||||
botAI->TellError(PlayerbotTextMgr::instance().GetBotTextOrDefault(
|
||||
"tame_exotic_requires_beast_mastery",
|
||||
"I cannot use exotic pets unless I have the Beast Mastery talent.",
|
||||
{}));
|
||||
else
|
||||
botAI->TellError("No tameable pet found with family: " + family);
|
||||
botAI->TellError(PlayerbotTextMgr::instance().GetBotTextOrDefault(
|
||||
"tame_no_pet_by_family", "No tameable pet found with family: %family", {{"%family", family}}));
|
||||
return false;
|
||||
}
|
||||
|
||||
@ -342,14 +363,18 @@ bool TameAction::RenamePet(const std::string& newName)
|
||||
// Check if the bot currently has a pet
|
||||
if (!pet)
|
||||
{
|
||||
botAI->TellError("You have no pet to rename.");
|
||||
botAI->TellError(PlayerbotTextMgr::instance().GetBotTextOrDefault(
|
||||
"tame_no_pet_to_rename", "You have no pet to rename.", {}));
|
||||
return false;
|
||||
}
|
||||
|
||||
// Validate the new name: must not be empty and max 12 characters
|
||||
if (newName.empty() || newName.length() > 12)
|
||||
{
|
||||
botAI->TellError("Pet name must be between 1 and 12 alphabetic characters.");
|
||||
botAI->TellError(PlayerbotTextMgr::instance().GetBotTextOrDefault(
|
||||
"tame_pet_name_length_error",
|
||||
"Pet name must be between 1 and 12 alphabetic characters.",
|
||||
{}));
|
||||
return false;
|
||||
}
|
||||
|
||||
@ -358,7 +383,10 @@ bool TameAction::RenamePet(const std::string& newName)
|
||||
{
|
||||
if (!std::isalpha(static_cast<unsigned char>(c)))
|
||||
{
|
||||
botAI->TellError("Pet name must only contain alphabetic characters (A-Z, a-z).");
|
||||
botAI->TellError(PlayerbotTextMgr::instance().GetBotTextOrDefault(
|
||||
"tame_pet_name_alpha_error",
|
||||
"Pet name must only contain alphabetic characters (A-Z, a-z).",
|
||||
{}));
|
||||
return false;
|
||||
}
|
||||
}
|
||||
@ -372,7 +400,10 @@ bool TameAction::RenamePet(const std::string& newName)
|
||||
// Check if the new name is reserved or forbidden
|
||||
if (sObjectMgr->IsReservedName(normalized))
|
||||
{
|
||||
botAI->TellError("That pet name is forbidden. Please choose another name.");
|
||||
botAI->TellError(PlayerbotTextMgr::instance().GetBotTextOrDefault(
|
||||
"tame_pet_name_forbidden_error",
|
||||
"That pet name is forbidden. Please choose another name.",
|
||||
{}));
|
||||
return false;
|
||||
}
|
||||
|
||||
@ -382,8 +413,12 @@ bool TameAction::RenamePet(const std::string& newName)
|
||||
bot->GetSession()->SendPetNameQuery(pet->GetGUID(), pet->GetEntry());
|
||||
|
||||
// Notify the master about the rename and give a tip to update the client name display
|
||||
botAI->TellMaster("Your pet has been renamed to " + normalized + "!");
|
||||
botAI->TellMaster("If you do not see the new name, please dismiss and recall your pet.");
|
||||
botAI->TellMaster(PlayerbotTextMgr::instance().GetBotTextOrDefault(
|
||||
"tame_pet_renamed", "Your pet has been renamed to %name!", {{"%name", normalized}}));
|
||||
botAI->TellMaster(PlayerbotTextMgr::instance().GetBotTextOrDefault(
|
||||
"tame_pet_rename_refresh_hint",
|
||||
"If you do not see the new name, please dismiss and recall your pet.",
|
||||
{}));
|
||||
|
||||
// Remove the current pet and (re-)cast Call Pet spell if the bot is a hunter
|
||||
bot->RemovePet(nullptr, PET_SAVE_AS_CURRENT, true);
|
||||
@ -401,7 +436,8 @@ bool TameAction::CreateAndSetPet(uint32 creatureEntry)
|
||||
// Ensure the player is a hunter and at least level 10 (required for pets)
|
||||
if (bot->getClass() != CLASS_HUNTER || bot->GetLevel() < 10)
|
||||
{
|
||||
botAI->TellError("Only level 10+ hunters can have pets.");
|
||||
botAI->TellError(PlayerbotTextMgr::instance().GetBotTextOrDefault(
|
||||
"tame_only_hunters_level_10", "Only level 10+ hunters can have pets.", {}));
|
||||
return false;
|
||||
}
|
||||
|
||||
@ -409,7 +445,8 @@ bool TameAction::CreateAndSetPet(uint32 creatureEntry)
|
||||
CreatureTemplate const* creature = sObjectMgr->GetCreatureTemplate(creatureEntry);
|
||||
if (!creature)
|
||||
{
|
||||
botAI->TellError("Creature template not found.");
|
||||
botAI->TellError(PlayerbotTextMgr::instance().GetBotTextOrDefault(
|
||||
"tame_creature_template_not_found", "Creature template not found.", {}));
|
||||
return false;
|
||||
}
|
||||
|
||||
@ -430,7 +467,8 @@ bool TameAction::CreateAndSetPet(uint32 creatureEntry)
|
||||
Pet* pet = bot->CreateTamedPetFrom(creatureEntry, 0);
|
||||
if (!pet)
|
||||
{
|
||||
botAI->TellError("Failed to create pet.");
|
||||
botAI->TellError(PlayerbotTextMgr::instance().GetBotTextOrDefault(
|
||||
"tame_create_pet_failed", "Failed to create pet.", {}));
|
||||
return false;
|
||||
}
|
||||
|
||||
@ -485,13 +523,15 @@ bool TameAction::AbandonPet()
|
||||
// Remove the pet from the bot and mark it as deleted in the database
|
||||
bot->RemovePet(pet, PET_SAVE_AS_DELETED);
|
||||
// Inform the bot's master/player that the pet was abandoned
|
||||
botAI->TellMaster("Your pet has been abandoned.");
|
||||
botAI->TellMaster(PlayerbotTextMgr::instance().GetBotTextOrDefault(
|
||||
"tame_pet_abandoned", "Your pet has been abandoned.", {}));
|
||||
return true;
|
||||
}
|
||||
else
|
||||
{
|
||||
// If there is no hunter pet, show an error message
|
||||
botAI->TellError("You have no hunter pet to abandon.");
|
||||
botAI->TellError(PlayerbotTextMgr::instance().GetBotTextOrDefault(
|
||||
"tame_no_hunter_pet_to_abandon", "You have no hunter pet to abandon.", {}));
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
@ -7,6 +7,7 @@
|
||||
|
||||
#include "Event.h"
|
||||
#include "LastMovementValue.h"
|
||||
#include "PlayerbotTextMgr.h"
|
||||
#include "Playerbots.h"
|
||||
#include "PlayerbotAIConfig.h"
|
||||
#include "Config.h"
|
||||
@ -24,7 +25,8 @@ bool TaxiAction::Execute(Event event)
|
||||
{
|
||||
movement.taxiNodes.clear();
|
||||
movement.Set(nullptr);
|
||||
botAI->TellMaster("I am ready for the next flight");
|
||||
botAI->TellMaster(PlayerbotTextMgr::instance().GetBotTextOrDefault(
|
||||
"taxi_ready_next_flight", "I am ready for the next flight", {}));
|
||||
return true;
|
||||
}
|
||||
|
||||
@ -120,13 +122,15 @@ bool TaxiAction::Execute(Event event)
|
||||
{
|
||||
movement.taxiNodes.clear();
|
||||
movement.Set(nullptr);
|
||||
botAI->TellError("I can't fly with you");
|
||||
botAI->TellError(PlayerbotTextMgr::instance().GetBotTextOrDefault(
|
||||
"taxi_cant_fly_with_you", "I can't fly with you", {}));
|
||||
return false;
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
botAI->TellError("Cannot find any flightmaster to talk");
|
||||
botAI->TellError(PlayerbotTextMgr::instance().GetBotTextOrDefault(
|
||||
"taxi_no_flightmaster_nearby", "Cannot find any flightmaster to talk", {}));
|
||||
return false;
|
||||
}
|
||||
|
||||
@ -12,6 +12,7 @@
|
||||
#include "ItemVisitors.h"
|
||||
#include "PlayerbotMgr.h"
|
||||
#include "PlayerbotSecurity.h"
|
||||
#include "PlayerbotTextMgr.h"
|
||||
#include "Playerbots.h"
|
||||
#include "RandomPlayerbotMgr.h"
|
||||
#include "SetCraftAction.h"
|
||||
@ -28,13 +29,17 @@ bool TradeStatusAction::Execute(Event event)
|
||||
// Allow the master and group members to trade
|
||||
if (trader != master && !traderBotAI && (!bot->GetGroup() || !bot->GetGroup()->IsMember(trader->GetGUID())))
|
||||
{
|
||||
bot->Whisper("I'm kind of busy now", LANG_UNIVERSAL, trader);
|
||||
bot->Whisper(PlayerbotTextMgr::instance().GetBotTextOrDefault(
|
||||
"trade_busy_now", "I'm kind of busy now", {}),
|
||||
LANG_UNIVERSAL, trader);
|
||||
return false;
|
||||
}
|
||||
|
||||
if (sPlayerbotAIConfig.enableRandomBotTrading == 0 && (sRandomPlayerbotMgr.IsRandomBot(bot)|| sRandomPlayerbotMgr.IsAddclassBot(bot)))
|
||||
{
|
||||
bot->Whisper("Trading is disabled", LANG_UNIVERSAL, trader);
|
||||
bot->Whisper(PlayerbotTextMgr::instance().GetBotTextOrDefault(
|
||||
"trade_disabled", "Trading is disabled", {}),
|
||||
LANG_UNIVERSAL, trader);
|
||||
return false;
|
||||
}
|
||||
|
||||
@ -180,9 +185,15 @@ bool TradeStatusAction::CheckTrade()
|
||||
{
|
||||
if (bot->GetGroup() && bot->GetGroup()->IsMember(bot->GetTrader()->GetGUID()) &&
|
||||
botAI->HasRealPlayerMaster())
|
||||
botAI->TellMasterNoFacing("Thank you " + chat->FormatWorldobject(bot->GetTrader()));
|
||||
botAI->TellMasterNoFacing(PlayerbotTextMgr::instance().GetBotTextOrDefault(
|
||||
"trade_thank_you_player",
|
||||
"Thank you %player",
|
||||
{{"%player", chat->FormatWorldobject(bot->GetTrader())}}));
|
||||
else
|
||||
bot->Say("Thank you " + chat->FormatWorldobject(bot->GetTrader()),
|
||||
bot->Say(PlayerbotTextMgr::instance().GetBotTextOrDefault(
|
||||
"trade_thank_you_player",
|
||||
"Thank you %player",
|
||||
{{"%player", chat->FormatWorldobject(bot->GetTrader())}}),
|
||||
(bot->GetTeamId() == TEAM_ALLIANCE ? LANG_COMMON : LANG_ORCISH));
|
||||
}
|
||||
return isGettingItem;
|
||||
@ -210,12 +221,16 @@ bool TradeStatusAction::CheckTrade()
|
||||
int32 playerMoney = trader->GetTradeData()->GetMoney() + playerItemsMoney;
|
||||
if (botItemsMoney > 0 && sPlayerbotAIConfig.enableRandomBotTrading == 2 && (sRandomPlayerbotMgr.IsRandomBot(bot)|| sRandomPlayerbotMgr.IsAddclassBot(bot)))
|
||||
{
|
||||
bot->Whisper("Selling is disabled.", LANG_UNIVERSAL, trader);
|
||||
bot->Whisper(PlayerbotTextMgr::instance().GetBotTextOrDefault(
|
||||
"trade_selling_disabled", "Selling is disabled.", {}),
|
||||
LANG_UNIVERSAL, trader);
|
||||
return false;
|
||||
}
|
||||
if (playerItemsMoney && sPlayerbotAIConfig.enableRandomBotTrading == 3 && (sRandomPlayerbotMgr.IsRandomBot(bot)|| sRandomPlayerbotMgr.IsAddclassBot(bot)))
|
||||
{
|
||||
bot->Whisper("Buying is disabled.", LANG_UNIVERSAL, trader);
|
||||
bot->Whisper(PlayerbotTextMgr::instance().GetBotTextOrDefault(
|
||||
"trade_buying_disabled", "Buying is disabled.", {}),
|
||||
LANG_UNIVERSAL, trader);
|
||||
return false;
|
||||
}
|
||||
for (uint32 slot = 0; slot < TRADE_SLOT_TRADED_COUNT; ++slot)
|
||||
@ -224,8 +239,10 @@ bool TradeStatusAction::CheckTrade()
|
||||
if (item && !item->GetTemplate()->SellPrice && !item->GetTemplate()->IsConjuredConsumable())
|
||||
{
|
||||
std::ostringstream out;
|
||||
out << chat->FormatItem(item->GetTemplate()) << " - This is not for sale";
|
||||
botAI->TellMaster(out);
|
||||
botAI->TellMaster(PlayerbotTextMgr::instance().GetBotTextOrDefault(
|
||||
"trade_item_not_for_sale",
|
||||
"%item - This is not for sale",
|
||||
{{"%item", chat->FormatItem(item->GetTemplate())}}));
|
||||
botAI->PlaySound(TEXT_EMOTE_NO);
|
||||
return false;
|
||||
}
|
||||
@ -239,8 +256,10 @@ bool TradeStatusAction::CheckTrade()
|
||||
if ((botMoney && !item->GetTemplate()->BuyPrice) || usage == ITEM_USAGE_NONE)
|
||||
{
|
||||
std::ostringstream out;
|
||||
out << chat->FormatItem(item->GetTemplate()) << " - I don't need this";
|
||||
botAI->TellMaster(out);
|
||||
botAI->TellMaster(PlayerbotTextMgr::instance().GetBotTextOrDefault(
|
||||
"trade_item_not_needed",
|
||||
"%item - I don't need this",
|
||||
{{"%item", chat->FormatItem(item->GetTemplate())}}));
|
||||
botAI->PlaySound(TEXT_EMOTE_NO);
|
||||
return false;
|
||||
}
|
||||
@ -252,7 +271,8 @@ bool TradeStatusAction::CheckTrade()
|
||||
|
||||
if (!botItemsMoney && !playerItemsMoney)
|
||||
{
|
||||
botAI->TellError("There are no items to trade");
|
||||
botAI->TellError(PlayerbotTextMgr::instance().GetBotTextOrDefault(
|
||||
"trade_no_items_error", "There are no items to trade", {}));
|
||||
return false;
|
||||
}
|
||||
|
||||
@ -266,7 +286,8 @@ bool TradeStatusAction::CheckTrade()
|
||||
{
|
||||
if (moneyDelta < 0)
|
||||
{
|
||||
botAI->TellError("You can use discount to buy items only");
|
||||
botAI->TellError(PlayerbotTextMgr::instance().GetBotTextOrDefault(
|
||||
"trade_discount_buy_only", "You can use discount to buy items only", {}));
|
||||
botAI->PlaySound(TEXT_EMOTE_NO);
|
||||
return false;
|
||||
}
|
||||
@ -282,16 +303,20 @@ bool TradeStatusAction::CheckTrade()
|
||||
switch (urand(0, 4))
|
||||
{
|
||||
case 0:
|
||||
botAI->TellMaster("A pleasure doing business with you");
|
||||
botAI->TellMaster(PlayerbotTextMgr::instance().GetBotTextOrDefault(
|
||||
"trade_success_pleasure", "A pleasure doing business with you", {}));
|
||||
break;
|
||||
case 1:
|
||||
botAI->TellMaster("Fair trade");
|
||||
botAI->TellMaster(PlayerbotTextMgr::instance().GetBotTextOrDefault(
|
||||
"trade_success_fair_trade", "Fair trade", {}));
|
||||
break;
|
||||
case 2:
|
||||
botAI->TellMaster("Thanks");
|
||||
botAI->TellMaster(PlayerbotTextMgr::instance().GetBotTextOrDefault(
|
||||
"trade_success_thanks", "Thanks", {}));
|
||||
break;
|
||||
case 3:
|
||||
botAI->TellMaster("Off with you");
|
||||
botAI->TellMaster(PlayerbotTextMgr::instance().GetBotTextOrDefault(
|
||||
"trade_success_off_with_you", "Off with you", {}));
|
||||
break;
|
||||
}
|
||||
|
||||
@ -300,8 +325,10 @@ bool TradeStatusAction::CheckTrade()
|
||||
}
|
||||
|
||||
std::ostringstream out;
|
||||
out << "I want " << chat->formatMoney(-(delta + discount)) << " for this";
|
||||
botAI->TellMaster(out);
|
||||
botAI->TellMaster(PlayerbotTextMgr::instance().GetBotTextOrDefault(
|
||||
"trade_want_money_for_this",
|
||||
"I want %money for this",
|
||||
{{"%money", chat->formatMoney(-(delta + discount))}}));
|
||||
botAI->PlaySound(TEXT_EMOTE_NO);
|
||||
return false;
|
||||
}
|
||||
|
||||
@ -9,6 +9,7 @@
|
||||
#include "Event.h"
|
||||
#include "ItemPackets.h"
|
||||
#include "ItemUsageValue.h"
|
||||
#include "PlayerbotTextMgr.h"
|
||||
#include "Playerbots.h"
|
||||
|
||||
bool UseItemAction::Execute(Event event)
|
||||
@ -35,7 +36,8 @@ bool UseItemAction::Execute(Event event)
|
||||
return UseItemOnGameObject(*items.begin(), *gos.begin());
|
||||
}
|
||||
|
||||
botAI->TellError("No items (or game objects) available");
|
||||
botAI->TellError(PlayerbotTextMgr::instance().GetBotTextOrDefault(
|
||||
"use_item_none_available", "No items (or game objects) available", {}));
|
||||
return false;
|
||||
}
|
||||
|
||||
@ -48,8 +50,10 @@ bool UseItemAction::UseGameObject(ObjectGuid guid)
|
||||
go->Use(bot);
|
||||
|
||||
std::ostringstream out;
|
||||
out << "Using " << chat->FormatGameobject(go);
|
||||
botAI->TellMasterNoFacing(out.str());
|
||||
botAI->TellMasterNoFacing(PlayerbotTextMgr::instance().GetBotTextOrDefault(
|
||||
"use_gameobject",
|
||||
"Using %gameobject",
|
||||
{{"%gameobject", chat->FormatGameobject(go)}}));
|
||||
return true;
|
||||
}
|
||||
|
||||
@ -92,16 +96,16 @@ bool UseItemAction::UseItem(Item* item, ObjectGuid goGuid, Item* itemTarget, Uni
|
||||
|
||||
bool targetSelected = false;
|
||||
|
||||
std::ostringstream out;
|
||||
out << "Using " << chat->FormatItem(item->GetTemplate());
|
||||
std::string itemText = chat->FormatItem(item->GetTemplate());
|
||||
std::string targetText;
|
||||
|
||||
if (item->GetTemplate()->Stackable > 1)
|
||||
{
|
||||
uint32 count = item->GetCount();
|
||||
if (count > 1)
|
||||
out << " (" << count << " available) ";
|
||||
itemText += " (" + std::to_string(count) + " available)";
|
||||
else
|
||||
out << " (the last one!)";
|
||||
itemText += " (the last one!)";
|
||||
}
|
||||
|
||||
if (goGuid)
|
||||
@ -114,7 +118,7 @@ bool UseItemAction::UseItem(Item* item, ObjectGuid goGuid, Item* itemTarget, Uni
|
||||
|
||||
packet << targetFlag;
|
||||
packet << goGuid.WriteAsPacked();
|
||||
out << " on " << chat->FormatGameobject(go);
|
||||
targetText = chat->FormatGameobject(go);
|
||||
targetSelected = true;
|
||||
}
|
||||
|
||||
@ -124,7 +128,8 @@ bool UseItemAction::UseItem(Item* item, ObjectGuid goGuid, Item* itemTarget, Uni
|
||||
{
|
||||
bool fit = SocketItem(itemTarget, item) || SocketItem(itemTarget, item, true);
|
||||
if (!fit)
|
||||
botAI->TellMaster("Socket does not fit");
|
||||
botAI->TellMaster(PlayerbotTextMgr::instance().GetBotTextOrDefault(
|
||||
"socket_does_not_fit", "Socket does not fit", {}));
|
||||
|
||||
return fit;
|
||||
}
|
||||
@ -133,7 +138,7 @@ bool UseItemAction::UseItem(Item* item, ObjectGuid goGuid, Item* itemTarget, Uni
|
||||
targetFlag = TARGET_FLAG_ITEM;
|
||||
packet << targetFlag;
|
||||
packet << itemTarget->GetGUID().WriteAsPacked();
|
||||
out << " on " << chat->FormatItem(itemTarget->GetTemplate());
|
||||
targetText = chat->FormatItem(itemTarget->GetTemplate());
|
||||
targetSelected = true;
|
||||
}
|
||||
}
|
||||
@ -149,7 +154,7 @@ bool UseItemAction::UseItem(Item* item, ObjectGuid goGuid, Item* itemTarget, Uni
|
||||
{
|
||||
targetFlag = TARGET_FLAG_UNIT;
|
||||
packet << targetFlag << masterSelection.WriteAsPacked();
|
||||
out << " on " << unit->GetName();
|
||||
targetText = unit->GetName();
|
||||
targetSelected = true;
|
||||
}
|
||||
}
|
||||
@ -159,7 +164,7 @@ bool UseItemAction::UseItem(Item* item, ObjectGuid goGuid, Item* itemTarget, Uni
|
||||
{
|
||||
targetFlag = TARGET_FLAG_UNIT;
|
||||
packet << targetFlag << unitTarget->GetGUID().WriteAsPacked();
|
||||
out << " on " << unitTarget->GetName();
|
||||
targetText = unitTarget->GetName();
|
||||
targetSelected = true;
|
||||
}
|
||||
|
||||
@ -173,9 +178,7 @@ bool UseItemAction::UseItem(Item* item, ObjectGuid goGuid, Item* itemTarget, Uni
|
||||
packet << uint32(0);
|
||||
bot->GetSession()->HandleQuestgiverAcceptQuestOpcode(packet);
|
||||
|
||||
std::ostringstream out;
|
||||
out << "Got quest " << chat->FormatQuest(qInfo);
|
||||
botAI->TellMasterNoFacing(out.str());
|
||||
botAI->TellMasterNoFacing("Got quest " + chat->FormatQuest(qInfo));
|
||||
return true;
|
||||
}
|
||||
}
|
||||
@ -217,7 +220,7 @@ bool UseItemAction::UseItem(Item* item, ObjectGuid goGuid, Item* itemTarget, Uni
|
||||
targetFlag = TARGET_FLAG_TRADE_ITEM;
|
||||
packet << targetFlag << (uint8)1 << ObjectGuid((uint64)TRADE_SLOT_NONTRADED).WriteAsPacked();
|
||||
targetSelected = true;
|
||||
out << " on traded item";
|
||||
targetText = "traded item";
|
||||
}
|
||||
else
|
||||
{
|
||||
@ -225,7 +228,7 @@ bool UseItemAction::UseItem(Item* item, ObjectGuid goGuid, Item* itemTarget, Uni
|
||||
packet << targetFlag;
|
||||
packet << itemForSpell->GetGUID().WriteAsPacked();
|
||||
targetSelected = true;
|
||||
out << " on " << chat->FormatItem(itemForSpell->GetTemplate());
|
||||
targetText = chat->FormatItem(itemForSpell->GetTemplate());
|
||||
}
|
||||
uint32 castTime = spellInfo->CalcCastTime();
|
||||
botAI->SetNextCheckDelay(castTime + sPlayerbotAIConfig.reactDelay);
|
||||
@ -246,17 +249,17 @@ bool UseItemAction::UseItem(Item* item, ObjectGuid goGuid, Item* itemTarget, Uni
|
||||
targetSelected = true;
|
||||
|
||||
if (unitTarget == bot || !unitTarget->IsInWorld() || unitTarget->IsDuringRemoveFromWorld())
|
||||
out << " on self";
|
||||
targetText = "self";
|
||||
else if (unitTarget->IsHostileTo(bot))
|
||||
out << " on self";
|
||||
targetText = "self";
|
||||
else
|
||||
out << " on " << unitTarget->GetName();
|
||||
targetText = unitTarget->GetName();
|
||||
}
|
||||
else
|
||||
{
|
||||
packet << bot->GetPackGUID();
|
||||
targetSelected = true;
|
||||
out << " on self";
|
||||
targetText = "self";
|
||||
}
|
||||
}
|
||||
|
||||
@ -307,7 +310,12 @@ bool UseItemAction::UseItem(Item* item, ObjectGuid goGuid, Item* itemTarget, Uni
|
||||
return false;
|
||||
|
||||
// botAI->SetNextCheckDelay(sPlayerbotAIConfig.globalCoolDown);
|
||||
botAI->TellMasterNoFacing(out.str());
|
||||
std::string useText = targetSelected
|
||||
? PlayerbotTextMgr::instance().GetBotTextOrDefault(
|
||||
"use_item_on_target", "Using %item on %target", {{"%item", itemText}, {"%target", targetText}})
|
||||
: PlayerbotTextMgr::instance().GetBotTextOrDefault(
|
||||
"use_item", "Using %item", {{"%item", itemText}});
|
||||
botAI->TellMasterNoFacing(useText);
|
||||
bot->GetSession()->HandleUseItemOpcode(packet);
|
||||
return true;
|
||||
}
|
||||
@ -372,10 +380,10 @@ bool UseItemAction::SocketItem(Item* item, Item* gem, bool replace)
|
||||
|
||||
if (fits)
|
||||
{
|
||||
std::ostringstream out;
|
||||
out << "Socketing " << chat->FormatItem(item->GetTemplate());
|
||||
out << " with " << chat->FormatItem(gem->GetTemplate());
|
||||
botAI->TellMaster(out);
|
||||
botAI->TellMaster(PlayerbotTextMgr::instance().GetBotTextOrDefault(
|
||||
"socketing_item_with_gem",
|
||||
"Socketing %item with %gem",
|
||||
{{"%item", chat->FormatItem(item->GetTemplate())}, {"%gem", chat->FormatItem(gem->GetTemplate())}}));
|
||||
|
||||
WorldPackets::Item::SocketGems nicePacket(std::move(packet));
|
||||
nicePacket.Read();
|
||||
|
||||
@ -11,6 +11,7 @@
|
||||
#include "GridNotifiersImpl.h"
|
||||
#include "NearestGameObjects.h"
|
||||
#include "PlayerbotAIConfig.h"
|
||||
#include "PlayerbotTextMgr.h"
|
||||
#include "Playerbots.h"
|
||||
#include "PositionValue.h"
|
||||
|
||||
@ -36,7 +37,8 @@ bool UseMeetingStoneAction::Execute(Event event)
|
||||
|
||||
if (bot->IsInCombat())
|
||||
{
|
||||
botAI->TellError("I am in combat");
|
||||
botAI->TellError(PlayerbotTextMgr::instance().GetBotTextOrDefault(
|
||||
"meeting_stone_in_combat", "I am in combat", {}));
|
||||
return false;
|
||||
}
|
||||
|
||||
@ -73,13 +75,15 @@ bool SummonAction::Execute(Event /*event*/)
|
||||
|
||||
if (SummonUsingGos(master, bot, true) || SummonUsingNpcs(master, bot, true))
|
||||
{
|
||||
botAI->TellMasterNoFacing("Hello!");
|
||||
botAI->TellMasterNoFacing(PlayerbotTextMgr::instance().GetBotTextOrDefault(
|
||||
"hello", "Hello!", {}));
|
||||
return true;
|
||||
}
|
||||
|
||||
if (SummonUsingGos(bot, master, true) || SummonUsingNpcs(bot, master, true))
|
||||
{
|
||||
botAI->TellMasterNoFacing("Welcome!");
|
||||
botAI->TellMasterNoFacing(PlayerbotTextMgr::instance().GetBotTextOrDefault(
|
||||
"meeting_stone_welcome", "Welcome!", {}));
|
||||
return true;
|
||||
}
|
||||
|
||||
@ -99,7 +103,10 @@ bool SummonAction::SummonUsingGos(Player* summoner, Player* player, bool preserv
|
||||
return Teleport(summoner, player, preserveAuras);
|
||||
}
|
||||
|
||||
botAI->TellError(summoner == bot ? "There is no meeting stone nearby" : "There is no meeting stone near you");
|
||||
botAI->TellError(PlayerbotTextMgr::instance().GetBotTextOrDefault(
|
||||
summoner == bot ? "meeting_stone_none_nearby" : "meeting_stone_none_near_you",
|
||||
summoner == bot ? "There is no meeting stone nearby" : "There is no meeting stone near you",
|
||||
{}));
|
||||
return false;
|
||||
}
|
||||
|
||||
@ -119,13 +126,19 @@ bool SummonAction::SummonUsingNpcs(Player* summoner, Player* player, bool preser
|
||||
{
|
||||
if (!player->HasItemCount(6948, 1, false))
|
||||
{
|
||||
botAI->TellError(player == bot ? "I have no hearthstone" : "You have no hearthstone");
|
||||
botAI->TellError(PlayerbotTextMgr::instance().GetBotTextOrDefault(
|
||||
player == bot ? "meeting_stone_no_hearthstone_self" : "meeting_stone_no_hearthstone_you",
|
||||
player == bot ? "I have no hearthstone" : "You have no hearthstone",
|
||||
{}));
|
||||
return false;
|
||||
}
|
||||
|
||||
if (player->HasSpellCooldown(8690))
|
||||
{
|
||||
botAI->TellError(player == bot ? "My hearthstone is not ready" : "Your hearthstone is not ready");
|
||||
botAI->TellError(PlayerbotTextMgr::instance().GetBotTextOrDefault(
|
||||
player == bot ? "meeting_stone_hearthstone_not_ready_self" : "meeting_stone_hearthstone_not_ready_you",
|
||||
player == bot ? "My hearthstone is not ready" : "Your hearthstone is not ready",
|
||||
{}));
|
||||
return false;
|
||||
}
|
||||
|
||||
@ -141,7 +154,10 @@ bool SummonAction::SummonUsingNpcs(Player* summoner, Player* player, bool preser
|
||||
}
|
||||
}
|
||||
|
||||
botAI->TellError(summoner == bot ? "There are no innkeepers nearby" : "There are no innkeepers near you");
|
||||
botAI->TellError(PlayerbotTextMgr::instance().GetBotTextOrDefault(
|
||||
summoner == bot ? "meeting_stone_no_innkeepers_nearby" : "meeting_stone_no_innkeepers_near_you",
|
||||
summoner == bot ? "There are no innkeepers nearby" : "There are no innkeepers near you",
|
||||
{}));
|
||||
return false;
|
||||
}
|
||||
|
||||
@ -153,7 +169,8 @@ bool SummonAction::Teleport(Player* summoner, Player* player, bool preserveAuras
|
||||
|
||||
if (player->GetVehicle())
|
||||
{
|
||||
botAI->TellError("You cannot summon me while I'm on a vehicle");
|
||||
botAI->TellError(PlayerbotTextMgr::instance().GetBotTextOrDefault(
|
||||
"meeting_stone_cannot_summon_vehicle", "You cannot summon me while I'm on a vehicle", {}));
|
||||
return false;
|
||||
}
|
||||
|
||||
@ -174,20 +191,29 @@ bool SummonAction::Teleport(Player* summoner, Player* player, bool preserveAuras
|
||||
|
||||
if (summoner->IsInCombat() && !sPlayerbotAIConfig.allowSummonInCombat)
|
||||
{
|
||||
botAI->TellError("You cannot summon me while you're in combat");
|
||||
botAI->TellError(PlayerbotTextMgr::instance().GetBotTextOrDefault(
|
||||
"meeting_stone_cannot_summon_master_in_combat",
|
||||
"You cannot summon me while you're in combat",
|
||||
{}));
|
||||
return false;
|
||||
}
|
||||
|
||||
if (!summoner->IsAlive() && !sPlayerbotAIConfig.allowSummonWhenMasterIsDead)
|
||||
{
|
||||
botAI->TellError("You cannot summon me while you're dead");
|
||||
botAI->TellError(PlayerbotTextMgr::instance().GetBotTextOrDefault(
|
||||
"meeting_stone_cannot_summon_master_dead",
|
||||
"You cannot summon me while you're dead",
|
||||
{}));
|
||||
return false;
|
||||
}
|
||||
|
||||
if (bot->isDead() && !bot->HasPlayerFlag(PLAYER_FLAGS_GHOST) &&
|
||||
!sPlayerbotAIConfig.allowSummonWhenBotIsDead)
|
||||
{
|
||||
botAI->TellError("You cannot summon me while I'm dead, you need to release my spirit first");
|
||||
botAI->TellError(PlayerbotTextMgr::instance().GetBotTextOrDefault(
|
||||
"meeting_stone_cannot_summon_bot_dead",
|
||||
"You cannot summon me while I'm dead, you need to release my spirit first",
|
||||
{}));
|
||||
return false;
|
||||
}
|
||||
|
||||
@ -199,7 +225,8 @@ bool SummonAction::Teleport(Player* summoner, Player* player, bool preserveAuras
|
||||
{
|
||||
bot->ResurrectPlayer(1.0f, false);
|
||||
bot->SpawnCorpseBones();
|
||||
botAI->TellMasterNoFacing("I live, again!");
|
||||
botAI->TellMasterNoFacing(PlayerbotTextMgr::instance().GetBotTextOrDefault(
|
||||
"meeting_stone_revived", "I live, again!", {}));
|
||||
botAI->GetAiObjectContext()->GetValue<GuidVector>("prioritized targets")->Reset();
|
||||
}
|
||||
|
||||
@ -229,6 +256,7 @@ bool SummonAction::Teleport(Player* summoner, Player* player, bool preserveAuras
|
||||
}
|
||||
|
||||
if (summoner != player)
|
||||
botAI->TellError("Not enough place to summon");
|
||||
botAI->TellError(PlayerbotTextMgr::instance().GetBotTextOrDefault(
|
||||
"meeting_stone_not_enough_space", "Not enough place to summon", {}));
|
||||
return false;
|
||||
}
|
||||
|
||||
@ -20,6 +20,7 @@
|
||||
#include "Player.h"
|
||||
#include "PlayerbotAI.h"
|
||||
#include "PlayerbotAIConfig.h"
|
||||
#include "PlayerbotTextMgr.h"
|
||||
#include "Playerbots.h"
|
||||
#include "Position.h"
|
||||
#include "QuestDef.h"
|
||||
@ -310,7 +311,10 @@ bool NewRpgBaseAction::InteractWithNpcOrGameObjectForQuest(ObjectGuid guid)
|
||||
{
|
||||
AcceptQuest(quest, guid);
|
||||
if (botAI->GetMaster())
|
||||
botAI->TellMasterNoFacing("Quest accepted " + ChatHelper::FormatQuest(quest));
|
||||
botAI->TellMasterNoFacing(PlayerbotTextMgr::instance().GetBotTextOrDefault(
|
||||
"new_rpg_quest_accepted",
|
||||
"Quest accepted %quest",
|
||||
{{"%quest", ChatHelper::FormatQuest(quest)}}));
|
||||
BroadcastHelper::BroadcastQuestAccepted(botAI, bot, quest);
|
||||
botAI->rpgStatistic.questAccepted++;
|
||||
LOG_DEBUG("playerbots", "[New RPG] {} accept quest {}", bot->GetName(), quest->GetQuestId());
|
||||
@ -319,7 +323,10 @@ bool NewRpgBaseAction::InteractWithNpcOrGameObjectForQuest(ObjectGuid guid)
|
||||
{
|
||||
TurnInQuest(quest, guid);
|
||||
if (botAI->GetMaster())
|
||||
botAI->TellMasterNoFacing("Quest rewarded " + ChatHelper::FormatQuest(quest));
|
||||
botAI->TellMasterNoFacing(PlayerbotTextMgr::instance().GetBotTextOrDefault(
|
||||
"new_rpg_quest_rewarded",
|
||||
"Quest rewarded %quest",
|
||||
{{"%quest", ChatHelper::FormatQuest(quest)}}));
|
||||
BroadcastHelper::BroadcastQuestTurnedIn(botAI, bot, quest);
|
||||
botAI->rpgStatistic.questRewarded++;
|
||||
LOG_DEBUG("playerbots", "[New RPG] {} turned in quest {}", bot->GetName(), quest->GetQuestId());
|
||||
@ -599,7 +606,10 @@ bool NewRpgBaseAction::OrganizeQuestLog()
|
||||
packet << (uint8)i;
|
||||
bot->GetSession()->HandleQuestLogRemoveQuest(packet);
|
||||
if (botAI->GetMaster())
|
||||
botAI->TellMasterNoFacing("Quest dropped " + ChatHelper::FormatQuest(quest));
|
||||
botAI->TellMasterNoFacing(PlayerbotTextMgr::instance().GetBotTextOrDefault(
|
||||
"new_rpg_quest_dropped",
|
||||
"Quest dropped %quest",
|
||||
{{"%quest", ChatHelper::FormatQuest(quest)}}));
|
||||
botAI->rpgStatistic.questDropped++;
|
||||
dropped++;
|
||||
}
|
||||
@ -626,7 +636,10 @@ bool NewRpgBaseAction::OrganizeQuestLog()
|
||||
packet << (uint8)i;
|
||||
bot->GetSession()->HandleQuestLogRemoveQuest(packet);
|
||||
if (botAI->GetMaster())
|
||||
botAI->TellMasterNoFacing("Quest dropped " + ChatHelper::FormatQuest(quest));
|
||||
botAI->TellMasterNoFacing(PlayerbotTextMgr::instance().GetBotTextOrDefault(
|
||||
"new_rpg_quest_dropped",
|
||||
"Quest dropped %quest",
|
||||
{{"%quest", ChatHelper::FormatQuest(quest)}}));
|
||||
botAI->rpgStatistic.questDropped++;
|
||||
dropped++;
|
||||
}
|
||||
@ -648,7 +661,10 @@ bool NewRpgBaseAction::OrganizeQuestLog()
|
||||
packet << (uint8)i;
|
||||
bot->GetSession()->HandleQuestLogRemoveQuest(packet);
|
||||
if (botAI->GetMaster())
|
||||
botAI->TellMasterNoFacing("Quest dropped " + ChatHelper::FormatQuest(quest));
|
||||
botAI->TellMasterNoFacing(PlayerbotTextMgr::instance().GetBotTextOrDefault(
|
||||
"new_rpg_quest_dropped",
|
||||
"Quest dropped %quest",
|
||||
{{"%quest", ChatHelper::FormatQuest(quest)}}));
|
||||
botAI->rpgStatistic.questDropped++;
|
||||
}
|
||||
|
||||
|
||||
@ -13,6 +13,7 @@
|
||||
#include "GuildCreateActions.h"
|
||||
#include "LastMovementValue.h"
|
||||
#include "MovementActions.h"
|
||||
#include "PlayerbotTextMgr.h"
|
||||
#include "Playerbots.h"
|
||||
#include "PossibleRpgTargetsValue.h"
|
||||
#include "SocialMgr.h"
|
||||
@ -430,12 +431,15 @@ bool RpgTradeUsefulAction::Execute(Event /*event*/)
|
||||
if (bot->GetTradeData() && bot->GetTradeData()->HasItem(item->GetGUID()))
|
||||
{
|
||||
if (bot->GetGroup() && bot->GetGroup()->IsMember(guidP) && botAI->HasRealPlayerMaster())
|
||||
botAI->TellMasterNoFacing(
|
||||
"You can use this " + chat->FormatItem(item->GetTemplate()) + " better than me, " +
|
||||
guidP.GetPlayer()->GetName() /*chat->FormatWorldobject(guidP.GetPlayer())*/ + ".");
|
||||
botAI->TellMasterNoFacing(PlayerbotTextMgr::instance().GetBotTextOrDefault(
|
||||
"rpg_item_better_for_player",
|
||||
"You can use this %item better than me, %player.",
|
||||
{{"%item", chat->FormatItem(item->GetTemplate())}, {"%player", guidP.GetPlayer()->GetName()}}));
|
||||
else
|
||||
bot->Say("You can use this " + chat->FormatItem(item->GetTemplate()) + " better than me, " +
|
||||
player->GetName() /*chat->FormatWorldobject(player)*/ + ".",
|
||||
bot->Say(PlayerbotTextMgr::instance().GetBotTextOrDefault(
|
||||
"rpg_item_better_for_player",
|
||||
"You can use this %item better than me, %player.",
|
||||
{{"%item", chat->FormatItem(item->GetTemplate())}, {"%player", player->GetName()}}),
|
||||
(bot->GetTeamId() == TEAM_ALLIANCE ? LANG_COMMON : LANG_ORCISH));
|
||||
|
||||
if (!urand(0, 4) || items.size() < 2)
|
||||
@ -449,7 +453,10 @@ bool RpgTradeUsefulAction::Execute(Event /*event*/)
|
||||
}
|
||||
}
|
||||
else
|
||||
bot->Say("Start trade with" + chat->FormatWorldobject(player),
|
||||
bot->Say(PlayerbotTextMgr::instance().GetBotTextOrDefault(
|
||||
"rpg_start_trade_with_player",
|
||||
"Start trade with %player",
|
||||
{{"%player", chat->FormatWorldobject(player)}}),
|
||||
(bot->GetTeamId() == TEAM_ALLIANCE ? LANG_COMMON : LANG_ORCISH));
|
||||
|
||||
botAI->SetNextCheckDelay(sPlayerbotAIConfig.rpgDelay);
|
||||
|
||||
@ -38,6 +38,7 @@
|
||||
#include "ObjectMgr.h"
|
||||
#include "PerfMonitor.h"
|
||||
#include "Player.h"
|
||||
#include "PlayerbotTextMgr.h"
|
||||
#include "PlayerbotAIConfig.h"
|
||||
#include "PlayerbotMgr.h"
|
||||
#include "PlayerbotGuildMgr.h"
|
||||
@ -451,9 +452,11 @@ void PlayerbotAI::UpdateAIGroupMaster()
|
||||
botAI->ChangeStrategy("+follow", BOT_STATE_NON_COMBAT);
|
||||
|
||||
if (botAI->GetMaster() == botAI->GetGroupLeader())
|
||||
botAI->TellMaster("Hello, I follow you!");
|
||||
botAI->TellMaster(PlayerbotTextMgr::instance().GetBotTextOrDefault(
|
||||
"hello_follow", "Hello, I follow you!", {}));
|
||||
else
|
||||
botAI->TellMaster(!urand(0, 2) ? "Hello!" : "Hi!");
|
||||
botAI->TellMaster(PlayerbotTextMgr::instance().GetBotTextOrDefault(
|
||||
"hello", "Hello!", {}));
|
||||
}
|
||||
else
|
||||
{
|
||||
@ -857,7 +860,8 @@ void PlayerbotAI::Reset(bool full)
|
||||
{
|
||||
WorldPackets::Character::LogoutCancel data = WorldPacket(CMSG_LOGOUT_CANCEL);
|
||||
bot->GetSession()->HandleLogoutCancelOpcode(data);
|
||||
TellMaster("Logout cancelled!");
|
||||
TellMaster(PlayerbotTextMgr::instance().GetBotTextOrDefault(
|
||||
"logout_cancel", "Logout cancelled!", {}));
|
||||
}
|
||||
|
||||
currentEngine = engines[BOT_STATE_NON_COMBAT];
|
||||
|
||||
@ -27,6 +27,7 @@
|
||||
#include "PlayerbotFactory.h"
|
||||
#include "PlayerbotOperations.h"
|
||||
#include "PlayerbotSecurity.h"
|
||||
#include "PlayerbotTextMgr.h"
|
||||
#include "PlayerbotWorldThreadProcessor.h"
|
||||
#include "Playerbots.h"
|
||||
#include "PlayerbotGuildMgr.h"
|
||||
@ -320,7 +321,8 @@ void PlayerbotMgr::CancelLogout()
|
||||
{
|
||||
WorldPackets::Character::LogoutCancel data = WorldPacket(CMSG_LOGOUT_CANCEL);
|
||||
bot->GetSession()->HandleLogoutCancelOpcode(data);
|
||||
botAI->TellMaster("Logout cancelled!");
|
||||
botAI->TellMaster(PlayerbotTextMgr::instance().GetBotTextOrDefault(
|
||||
"logout_cancel", "Logout cancelled!", {}));
|
||||
}
|
||||
}
|
||||
|
||||
@ -411,7 +413,8 @@ void PlayerbotHolder::DisablePlayerBot(ObjectGuid guid)
|
||||
{
|
||||
return;
|
||||
}
|
||||
botAI->TellMaster("Goodbye!");
|
||||
botAI->TellMaster(PlayerbotTextMgr::instance().GetBotTextOrDefault(
|
||||
"goodbye", "Goodbye!", {}));
|
||||
bot->StopMoving();
|
||||
bot->GetMotionMaster()->Clear();
|
||||
|
||||
@ -544,7 +547,8 @@ void PlayerbotHolder::OnBotLogin(Player* const bot)
|
||||
// set delay on login
|
||||
botAI->SetNextCheckDelay(urand(2000, 4000));
|
||||
|
||||
botAI->TellMaster("Hello!", PLAYERBOT_SECURITY_TALK);
|
||||
botAI->TellMaster(PlayerbotTextMgr::instance().GetBotTextOrDefault(
|
||||
"hello", "Hello!", {}), PLAYERBOT_SECURITY_TALK);
|
||||
|
||||
// Queue group operations for world thread
|
||||
if (master && master->GetGroup() && !group)
|
||||
|
||||
@ -34,6 +34,7 @@
|
||||
#include "PlayerbotAI.h"
|
||||
#include "PlayerbotAIConfig.h"
|
||||
#include "PlayerbotFactory.h"
|
||||
#include "PlayerbotTextMgr.h"
|
||||
#include "Playerbots.h"
|
||||
#include "Position.h"
|
||||
#include "RaceMgr.h"
|
||||
@ -2589,7 +2590,8 @@ void RandomPlayerbotMgr::OnPlayerLogin(Player* player)
|
||||
{
|
||||
botAI->SetMaster(player);
|
||||
botAI->ResetStrategies();
|
||||
botAI->TellMaster("Hello");
|
||||
botAI->TellMaster(PlayerbotTextMgr::instance().GetBotTextOrDefault(
|
||||
"hello", "Hello", {}));
|
||||
}
|
||||
|
||||
break;
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user