From 3900237ffdd74a605b910bce3f351e2a38ff474d Mon Sep 17 00:00:00 2001 From: Your Name <50133316+NoxMax@users.noreply.github.com> Date: Sun, 3 Aug 2025 17:36:02 -0600 Subject: [PATCH 001/151] Filter bot logins by level range --- conf/playerbots.conf.dist | 20 +++- src/PlayerbotAIConfig.cpp | 5 +- src/PlayerbotAIConfig.h | 2 + src/Playerbots.cpp | 36 +++++- src/RandomPlayerbotMgr.cpp | 227 ++++++++++++++++++++++++++++++------- src/RandomPlayerbotMgr.h | 18 +++ 6 files changed, 259 insertions(+), 49 deletions(-) diff --git a/conf/playerbots.conf.dist b/conf/playerbots.conf.dist index 344a969bb0..cfb4514975 100644 --- a/conf/playerbots.conf.dist +++ b/conf/playerbots.conf.dist @@ -491,7 +491,7 @@ AiPlayerbot.AutoGearQualityLimit = 3 # Max iLVL Phase 1(Kara, Gruul, Mag) = 125 | Phase 1.5(ZA) = 138 | Phase 2(SC, TK) = 141 | Phase 3(Hyjal, BT) = 156 | Phase 4(Sunwell) = 164 # Wotlk # Max iLVL Tier 7(10/25) = 200/213 | Tier 8(10/25) = 225/232 | Tier 9(10/25) = 232/245 | Tier 10(10/25/HC) = 251/264/290 -# Max iLVL Phase 1(Naxx) = 224 | Phase 2(Ulduar) = 245 | Phase 3(ToC) = 258 | Phase 4(ICC) = 290 +# Max iLVL Phase 1(Naxx) = 224 | Phase 2(Ulduar) = 245 | Phase 3(ToC) = 258 | Phase 4(ICC) = 290 # Default: 0 (no limit) AiPlayerbot.AutoGearScoreLimit = 0 @@ -500,11 +500,11 @@ AiPlayerbot.AutoGearScoreLimit = 0 # "health" (bots have infinite health) # "mana" (bots have infinite mana) # "power" (bots have infinite energy, rage, and runic power) -# "taxi" (bots may use all flight paths, though they will not actually learn them) -# "raid" (bots use cheats implemented into raid strategies) +# "taxi" (bots may use all flight paths, though they will not actually learn them) +# "raid" (bots use cheats implemented into raid strategies) # To use multiple cheats, separate them by commas below (e.g., to enable all, use "gold,health,mana,power,taxi") # Default: taxi is enabled -AiPlayerbot.BotCheats = "taxi,raid" +AiPlayerbot.BotCheats = "taxi,raid" # # @@ -550,10 +550,18 @@ AiPlayerbot.RandomBotRandomPassword = 0 # Prefix for account names to create for randombots AiPlayerbot.RandomBotAccountPrefix = "rndbot" -# Minimum and maximum levels for randombots +# Minimum and maximum initialization levels for randombots AiPlayerbot.RandomBotMinLevel = 1 AiPlayerbot.RandomBotMaxLevel = 80 +# Minimum and maximum level range for randombots allowed to login +AiPlayerbot.RandomBotMinLoginLevel = 1 +AiPlayerbot.RandomBotMaxLoginLevel = 80 + +# log-out randombots if they they level outside the allowed login range +# Default: 0 (disabled) +AiPlayerbot.RandomBotLogoutOutsideLoginRange = 0 + # Sync max randombot level with max level of online players # Default: 0 (disabled) AiPlayerbot.SyncLevelWithPlayers = 0 @@ -654,7 +662,7 @@ AiPlayerbot.RandomGearQualityLimit = 3 # Max iLVL Phase 1(Kara, Gruul, Mag) = 125 | Phase 1.5(ZA) = 138 | Phase 2(SC, TK) = 141 | Phase 3(Hyjal, BT) = 156 | Phase 4(Sunwell) = 164 # Wotlk # Max iLVL Tier 7(10/25) = 200/213 | Tier 8(10/25) = 225/232 | Tier 9(10/25) = 232/245 | Tier 10(10/25/HC) = 251/264/290 -# Max iLVL Phase 1(Naxx) = 224 | Phase 2(Ulduar) = 245 | Phase 3(ToC) = 258 | Phase 4(ICC) = 290 +# Max iLVL Phase 1(Naxx) = 224 | Phase 2(Ulduar) = 245 | Phase 3(ToC) = 258 | Phase 4(ICC) = 290 # Default: 0 (no limit) AiPlayerbot.RandomGearScoreLimit = 0 diff --git a/src/PlayerbotAIConfig.cpp b/src/PlayerbotAIConfig.cpp index 4d9f3935fb..e332ddb2ef 100644 --- a/src/PlayerbotAIConfig.cpp +++ b/src/PlayerbotAIConfig.cpp @@ -83,6 +83,9 @@ bool PlayerbotAIConfig::Initialize() lootDelay = sConfigMgr->GetOption("AiPlayerbot.LootDelay", 1000); disabledWithoutRealPlayerLoginDelay = sConfigMgr->GetOption("AiPlayerbot.DisabledWithoutRealPlayerLoginDelay", 30); disabledWithoutRealPlayerLogoutDelay = sConfigMgr->GetOption("AiPlayerbot.DisabledWithoutRealPlayerLogoutDelay", 300); + randomBotMinLoginLevel = sConfigMgr->GetOption("AiPlayerbot.RandomBotMinLoginLevel", 1); + randomBotMaxLoginLevel = sConfigMgr->GetOption("AiPlayerbot.RandomBotMaxLoginLevel", 80); + randomBotLogoutOutsideLoginRange = sConfigMgr->GetOption("AiPlayerbot.RandomBotLogoutOutsideLoginRange", false); farDistance = sConfigMgr->GetOption("AiPlayerbot.FarDistance", 20.0f); sightDistance = sConfigMgr->GetOption("AiPlayerbot.SightDistance", 75.0f); @@ -198,7 +201,7 @@ bool PlayerbotAIConfig::Initialize() "575,576,578,595,599,600,601,602,604,608,619,632,650,658,668,409,469,509," "531,532,534,544,548,550,564,565,580,249,533,603,615,616,624,631,649,724"), restrictedHealerDPSMaps); - + //////////////////////////// ICC EnableICCBuffs = sConfigMgr->GetOption("AiPlayerbot.EnableICCBuffs", true); diff --git a/src/PlayerbotAIConfig.h b/src/PlayerbotAIConfig.h index 54d8b00799..63e11063bf 100644 --- a/src/PlayerbotAIConfig.h +++ b/src/PlayerbotAIConfig.h @@ -229,6 +229,8 @@ class PlayerbotAIConfig std::string randomBotCombatStrategies, randomBotNonCombatStrategies; bool applyInstanceStrategies; uint32 randomBotMinLevel, randomBotMaxLevel; + uint32 randomBotMinLoginLevel, randomBotMaxLoginLevel; + bool randomBotLogoutOutsideLoginRange; float randomChangeMultiplier; // std::string premadeLevelSpec[MAX_CLASSES][10][91]; //lvl 10 - 100 diff --git a/src/Playerbots.cpp b/src/Playerbots.cpp index 07b2bf94e0..3b3e572665 100644 --- a/src/Playerbots.cpp +++ b/src/Playerbots.cpp @@ -87,7 +87,8 @@ class PlayerbotsPlayerScript : public PlayerScript PLAYERHOOK_ON_BEFORE_CRITERIA_PROGRESS, PLAYERHOOK_ON_BEFORE_ACHI_COMPLETE, PLAYERHOOK_CAN_PLAYER_USE_PRIVATE_CHAT, - PLAYERHOOK_ON_GIVE_EXP + PLAYERHOOK_ON_GIVE_EXP, + PLAYERHOOK_ON_LEVEL_CHANGED }) {} void OnPlayerLogin(Player* player) override @@ -115,12 +116,39 @@ class PlayerbotsPlayerScript : public PlayerScript roundedTime = roundedTime.substr(0, roundedTime.find('.') + 2); ChatHandler(player->GetSession()).SendSysMessage( - "|cff00ff00Playerbots:|r bot initialization at server startup takes about '" + "|cff00ff00Playerbots:|r bot initialization at server startup takes about '" + roundedTime + "' minutes."); } } } + void OnPlayerLevelChanged(Player* player, uint8 oldLevel) override + { + // Check if feature is enabled and required objects are valid + if (!sPlayerbotAIConfig || !sPlayerbotAIConfig->randomBotLogoutOutsideLoginRange || !sRandomPlayerbotMgr) + return; + + // Only apply to bots from rndBotTypeAccounts (type 1) + uint32 accountId = player->GetSession()->GetAccountId(); + if (!sRandomPlayerbotMgr->IsAccountType(accountId, 1)) + return; + + uint32 newLevel = player->GetLevel(); + + // Check if the new level is outside the allowed login range + if (newLevel < sPlayerbotAIConfig->randomBotMinLoginLevel || + newLevel > sPlayerbotAIConfig->randomBotMaxLoginLevel) + { + LOG_INFO("playerbots", "Bot {} changed levels from {} to {}, outside login range ({}-{}). Marking for logout", + player->GetName(), oldLevel, newLevel, + sPlayerbotAIConfig->randomBotMinLoginLevel, sPlayerbotAIConfig->randomBotMaxLoginLevel); + + // Mark the bot for removal in the next update cycle + sRandomPlayerbotMgr->MarkBotForLogout(player->GetGUID().GetCounter()); + sRandomPlayerbotMgr->ForceRecount(); + } + } + void OnPlayerAfterUpdate(Player* player, uint32 diff) override { if (PlayerbotAI* botAI = GET_PLAYERBOT_AI(player)) @@ -211,7 +239,7 @@ class PlayerbotsPlayerScript : public PlayerScript { if (!player->GetSession()->IsBot()) return; - + if (!sRandomPlayerbotMgr->IsRandomBot(player)) return; @@ -281,7 +309,7 @@ class PlayerbotsWorldScript : public WorldScript LOG_INFO("server.loading", "╚══════════════════════════════════════════════════════════╝"); uint32 oldMSTime = getMSTime(); - + LOG_INFO("server.loading", " "); LOG_INFO("server.loading", "Load Playerbots Config..."); diff --git a/src/RandomPlayerbotMgr.cpp b/src/RandomPlayerbotMgr.cpp index fd29b1dfa6..ba1d8f5fcd 100644 --- a/src/RandomPlayerbotMgr.cpp +++ b/src/RandomPlayerbotMgr.cpp @@ -332,13 +332,73 @@ void RandomPlayerbotMgr::UpdateAIInternal(uint32 elapsed, bool /*minimal*/) }*/ uint32 maxAllowedBotCount = GetEventValue(0, "bot_count"); - if (!maxAllowedBotCount || (maxAllowedBotCount < sPlayerbotAIConfig->minRandomBots || - maxAllowedBotCount > sPlayerbotAIConfig->maxRandomBots)) + + // Check if level filtering is active and populate eligible bots + if (!levelFilterAdjusted && IsLevelFilterActive()) + { + PopulateEligibleBots(); + + // Count total eligible bots from RNDbot accounts + uint32 eligibleBotCount = 0; + + for (uint32 accountId : rndBotTypeAccounts) + { + QueryResult result = CharacterDatabase.Query( + "SELECT COUNT(*) FROM characters WHERE account = {} AND level >= {} AND level <= {}", + accountId, sPlayerbotAIConfig->randomBotMinLoginLevel, sPlayerbotAIConfig->randomBotMaxLoginLevel + ); + + if (result) + { + Field* fields = result->Fetch(); + eligibleBotCount += fields[0].Get(); + } + } + + if (eligibleBotCount > 0) + { + // Cap eligible bots by maxRandomBots + uint32 effectiveMaxBots = std::min(eligibleBotCount, sPlayerbotAIConfig->maxRandomBots); + + LOG_INFO("playerbots", "Level filter active: {} eligible bots found in range {}-{}. Effective maximum: {} bots", + eligibleBotCount, sPlayerbotAIConfig->randomBotMinLoginLevel, + sPlayerbotAIConfig->randomBotMaxLoginLevel, effectiveMaxBots); + + if (effectiveMaxBots >= sPlayerbotAIConfig->minRandomBots) + { + maxAllowedBotCount = urand(sPlayerbotAIConfig->minRandomBots, effectiveMaxBots); + } + else + { + maxAllowedBotCount = effectiveMaxBots; + } + + SetEventValue(0, "bot_count", maxAllowedBotCount, + urand(sPlayerbotAIConfig->randomBotCountChangeMinInterval, + sPlayerbotAIConfig->randomBotCountChangeMaxInterval)); + + currentBots.clear(); + levelFilterAdjusted = true; + } + else + { + LOG_ERROR("playerbots", "No eligible bots found with level filter {}-{}", + sPlayerbotAIConfig->randomBotMinLoginLevel, sPlayerbotAIConfig->randomBotMaxLoginLevel); + levelFilterAdjusted = true; + } + } + else if (!levelFilterAdjusted) { - maxAllowedBotCount = urand(sPlayerbotAIConfig->minRandomBots, sPlayerbotAIConfig->maxRandomBots); - SetEventValue(0, "bot_count", maxAllowedBotCount, - urand(sPlayerbotAIConfig->randomBotCountChangeMinInterval, - sPlayerbotAIConfig->randomBotCountChangeMaxInterval)); + // Normal bot count logic (no level filtering) + if (!maxAllowedBotCount || (maxAllowedBotCount < sPlayerbotAIConfig->minRandomBots || + maxAllowedBotCount > sPlayerbotAIConfig->maxRandomBots)) + { + maxAllowedBotCount = urand(sPlayerbotAIConfig->minRandomBots, sPlayerbotAIConfig->maxRandomBots); + SetEventValue(0, "bot_count", maxAllowedBotCount, + urand(sPlayerbotAIConfig->randomBotCountChangeMinInterval, + sPlayerbotAIConfig->randomBotCountChangeMaxInterval)); + } + levelFilterAdjusted = true; } GetBots(); @@ -730,23 +790,41 @@ uint32 RandomPlayerbotMgr::AddRandomBots() for (uint32 accountId : accountsToUse) { - CharacterDatabasePreparedStatement* stmt = - CharacterDatabase.GetPreparedStatement(CHAR_SEL_CHARS_BY_ACCOUNT_ID); - stmt->SetData(0, accountId); - PreparedQueryResult result = CharacterDatabase.Query(stmt); - if (!result) - continue; + // Lambda to process results regardless of query type + auto processResults = [&](auto result) + { + if (!result) + return; - do + do + { + Field* fields = result->Fetch(); + CharacterInfo info; + info.guid = fields[0].Get(); + info.rClass = fields[1].Get(); + info.rRace = fields[2].Get(); + info.accountId = accountId; + allCharacters.push_back(info); + } while (result->NextRow()); + }; + + if (IsLevelFilterActive()) { - Field* fields = result->Fetch(); - CharacterInfo info; - info.guid = fields[0].Get(); - info.rClass = fields[1].Get(); - info.rRace = fields[2].Get(); - info.accountId = accountId; - allCharacters.push_back(info); - } while (result->NextRow()); + // Custom query with level filtering + auto result = CharacterDatabase.Query( + "SELECT guid, class, race FROM characters WHERE account = {} AND level >= {} AND level <= {}", + accountId, sPlayerbotAIConfig->randomBotMinLoginLevel, sPlayerbotAIConfig->randomBotMaxLoginLevel + ); + processResults(result); + } + else + { + CharacterDatabasePreparedStatement* stmt = + CharacterDatabase.GetPreparedStatement(CHAR_SEL_CHARS_BY_ACCOUNT_ID); + stmt->SetData(0, accountId); + auto result = CharacterDatabase.Query(stmt); + processResults(result); + } } // Shuffle for class balance @@ -2548,17 +2626,55 @@ void RandomPlayerbotMgr::GetBots() stmt->SetData(0, 0); stmt->SetData(1, "add"); uint32 maxAllowedBotCount = GetEventValue(0, "bot_count"); + if (PreparedQueryResult result = PlayerbotsDatabase.Query(stmt)) { do { Field* fields = result->Fetch(); uint32 bot = fields[0].Get(); + if (GetEventValue(bot, "add")) + { + // Single query to get both account and level + QueryResult charResult = CharacterDatabase.Query("SELECT account, level FROM characters WHERE guid = {}", bot); + if (!charResult) + continue; + + Field* charFields = charResult->Fetch(); + uint32 botAccountId = charFields[0].Get(); + uint32 botLevel = charFields[1].Get(); + + // Skip if not an RNDbot account + bool isRndBotAccount = false; + for (uint32 accountId : rndBotTypeAccounts) + { + if (accountId == botAccountId) + { + isRndBotAccount = true; + break; + } + } + + if (!isRndBotAccount) + continue; + + // If level filtering is active, check bot level + if (IsLevelFilterActive()) + { + // Skip bots outside the allowed level range + if (botLevel < sPlayerbotAIConfig->randomBotMinLoginLevel || + botLevel > sPlayerbotAIConfig->randomBotMaxLoginLevel) + { + continue; // Skip this bot + } + } + currentBots.push_back(bot); - if (currentBots.size() >= maxAllowedBotCount) - break; + if (currentBots.size() >= maxAllowedBotCount) + break; + } } while (result->NextRow()); } } @@ -2586,6 +2702,51 @@ std::vector RandomPlayerbotMgr::GetBgBots(uint32 bracket) return std::move(BgBots); } +void RandomPlayerbotMgr::PopulateEligibleBots() +{ + if (!sPlayerbotAIConfig || !(sPlayerbotAIConfig->randomBotMinLoginLevel > 1 || + sPlayerbotAIConfig->randomBotMaxLoginLevel < 80)) + return; + + LOG_INFO("playerbots", "Populating eligible bots for level filter ({}-{})...", + sPlayerbotAIConfig->randomBotMinLoginLevel, sPlayerbotAIConfig->randomBotMaxLoginLevel); + + bool botsAdded = false; + + // Use only RNDbot type accounts (type 1) + for (uint32 accountId : rndBotTypeAccounts) + { + QueryResult result = CharacterDatabase.Query( + "SELECT guid, level, online FROM characters WHERE account = {} AND level >= {} AND level <= {}", + accountId, sPlayerbotAIConfig->randomBotMinLoginLevel, sPlayerbotAIConfig->randomBotMaxLoginLevel + ); + + if (result) + { + do + { + Field* fields = result->Fetch(); + uint32 botGuid = fields[0].Get(); + bool isOnline = fields[2].Get(); + + // Skip bots that are already online or already have "add" event + if (isOnline || GetEventValue(botGuid, "add")) + continue; + + uint32 add_time = urand(sPlayerbotAIConfig->minRandomBotInWorldTime, + sPlayerbotAIConfig->maxRandomBotInWorldTime); + SetEventValue(botGuid, "add", 1, add_time); + botsAdded = true; + } while (result->NextRow()); + } + } + + if (botsAdded) + { + currentBots.clear(); // Force reload + } +} + uint32 RandomPlayerbotMgr::GetEventValue(uint32 bot, std::string const event) { // load all events at once on first event load @@ -2613,23 +2774,13 @@ uint32 RandomPlayerbotMgr::GetEventValue(uint32 bot, std::string const event) } CachedEvent& e = eventCache[bot][event]; - /*if (e.IsEmpty()) - { - QueryResult results = PlayerbotsDatabase.Query("SELECT `value`, `time`, validIn, `data` FROM - playerbots_random_bots WHERE owner = 0 AND bot = {} AND event = {}", bot, event.c_str()); - if (results) - { - Field* fields = results->Fetch(); - e.value = fields[0].Get(); - e.lastChangeTime = fields[1].Get(); - e.validIn = fields[2].Get(); - e.data = fields[3].Get(); - } - } - */ + bool shouldExpire = (time(0) - e.lastChangeTime) >= e.validIn && + event != "specNo" && + event != "specLink" && + !(event == "bot_count" && IsLevelFilterActive()); // Don't expire bot_count when level filtering is active - if ((time(0) - e.lastChangeTime) >= e.validIn && event != "specNo" && event != "specLink") + if (shouldExpire) e.value = 0; return e.value; diff --git a/src/RandomPlayerbotMgr.h b/src/RandomPlayerbotMgr.h index 6a62a68b9c..ebf40be8b3 100644 --- a/src/RandomPlayerbotMgr.h +++ b/src/RandomPlayerbotMgr.h @@ -189,6 +189,14 @@ class RandomPlayerbotMgr : public PlayerbotHolder void AssignAccountTypes(); bool IsAccountType(uint32 accountId, uint8 accountType); + // Allowed login range management + void ForceRecount() { SetEventValue(0, "bot_count", 0, 0); } + void MarkBotForLogout(uint32 bot) + { + SetEventValue(bot, "add", 0, 0); // Clear the "add" event to trigger logout + SetEventValue(bot, "logout", 1, 1); // Also set logout for clarity + } + protected: void OnBotLoginInternal(Player* const bot) override; @@ -233,6 +241,16 @@ class RandomPlayerbotMgr : public PlayerbotHolder std::vector rndBotTypeAccounts; // Accounts marked as RNDbot (type 1) std::vector addClassTypeAccounts; // Accounts marked as AddClass (type 2) + // Login level filtering + bool levelFilterAdjusted = false; + void PopulateEligibleBots(); + bool IsLevelFilterActive() const + { + return sPlayerbotAIConfig && + (sPlayerbotAIConfig->randomBotMinLoginLevel > 1 || + sPlayerbotAIConfig->randomBotMaxLoginLevel < 80); + } + //void ScaleBotActivity(); // Deprecated function }; From 106117003fff71fa061bbe6f67f31c10e1cab00c Mon Sep 17 00:00:00 2001 From: Your Name <50133316+NoxMax@users.noreply.github.com> Date: Sun, 3 Aug 2025 17:41:13 -0600 Subject: [PATCH 002/151] formatting --- src/RandomPlayerbotMgr.h | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/RandomPlayerbotMgr.h b/src/RandomPlayerbotMgr.h index ebf40be8b3..6677d38487 100644 --- a/src/RandomPlayerbotMgr.h +++ b/src/RandomPlayerbotMgr.h @@ -193,8 +193,8 @@ class RandomPlayerbotMgr : public PlayerbotHolder void ForceRecount() { SetEventValue(0, "bot_count", 0, 0); } void MarkBotForLogout(uint32 bot) { - SetEventValue(bot, "add", 0, 0); // Clear the "add" event to trigger logout - SetEventValue(bot, "logout", 1, 1); // Also set logout for clarity + SetEventValue(bot, "add", 0, 0); // Clear the "add" event to trigger logout + SetEventValue(bot, "logout", 1, 1); // Also set logout for clarity } protected: From 95410c57109db3ceb81494a290139625af4a097b Mon Sep 17 00:00:00 2001 From: NoxMax <50133316+NoxMax@users.noreply.github.com> Date: Sun, 3 Aug 2025 18:58:30 -0600 Subject: [PATCH 003/151] formatting --- src/RandomPlayerbotMgr.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/RandomPlayerbotMgr.cpp b/src/RandomPlayerbotMgr.cpp index ba1d8f5fcd..726c53b439 100644 --- a/src/RandomPlayerbotMgr.cpp +++ b/src/RandomPlayerbotMgr.cpp @@ -2666,7 +2666,7 @@ void RandomPlayerbotMgr::GetBots() if (botLevel < sPlayerbotAIConfig->randomBotMinLoginLevel || botLevel > sPlayerbotAIConfig->randomBotMaxLoginLevel) { - continue; // Skip this bot + continue; } } From f37ef415234ec6ced1450199855dfec36ab7477b Mon Sep 17 00:00:00 2001 From: NoxMax <50133316+NoxMax@users.noreply.github.com> Date: Tue, 12 Aug 2025 10:23:44 -0600 Subject: [PATCH 004/151] Clarify user conf --- conf/playerbots.conf.dist | 3 +++ 1 file changed, 3 insertions(+) diff --git a/conf/playerbots.conf.dist b/conf/playerbots.conf.dist index abbcedbe32..2ed55529e2 100644 --- a/conf/playerbots.conf.dist +++ b/conf/playerbots.conf.dist @@ -555,6 +555,9 @@ AiPlayerbot.RandomBotMinLevel = 1 AiPlayerbot.RandomBotMaxLevel = 80 # Minimum and maximum level range for randombots allowed to login +# If level filtration is used, minRandomBots and maxRandomBots might be automatically adjusted to lower values, +# depending on available eligible bots in the database +# Default Min,Max: 1,80 (no level filtration) AiPlayerbot.RandomBotMinLoginLevel = 1 AiPlayerbot.RandomBotMaxLoginLevel = 80 From 5f8754123d1f9e8a73ce7270d6d52b0069adf1d8 Mon Sep 17 00:00:00 2001 From: NoxMax <50133316+NoxMax@users.noreply.github.com> Date: Thu, 21 Aug 2025 07:30:52 -0600 Subject: [PATCH 005/151] Better error handling when no eligible bots for level login range --- src/RandomPlayerbotMgr.cpp | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/src/RandomPlayerbotMgr.cpp b/src/RandomPlayerbotMgr.cpp index fe3bec81d9..5bce7949a7 100644 --- a/src/RandomPlayerbotMgr.cpp +++ b/src/RandomPlayerbotMgr.cpp @@ -360,7 +360,7 @@ void RandomPlayerbotMgr::UpdateAIInternal(uint32 elapsed, bool /*minimal*/) // Cap eligible bots by maxRandomBots uint32 effectiveMaxBots = std::min(eligibleBotCount, sPlayerbotAIConfig->maxRandomBots); - LOG_INFO("playerbots", "Level filter active: {} eligible bots found in range {}-{}. Effective maximum: {} bots", + LOG_INFO("playerbots", "Level filter active: {} eligible bots found in range {}-{}. Effective maximum: {} bots.", eligibleBotCount, sPlayerbotAIConfig->randomBotMinLoginLevel, sPlayerbotAIConfig->randomBotMaxLoginLevel, effectiveMaxBots); @@ -382,8 +382,11 @@ void RandomPlayerbotMgr::UpdateAIInternal(uint32 elapsed, bool /*minimal*/) } else { - LOG_ERROR("playerbots", "No eligible bots found with level filter {}-{}", + LOG_ERROR("playerbots", "No eligible bots found with level filter {}-{}. Change the level range.", sPlayerbotAIConfig->randomBotMinLoginLevel, sPlayerbotAIConfig->randomBotMaxLoginLevel); + SetEventValue(0, "bot_count", 0, 999999999); + maxAllowedBotCount = 0; + currentBots.clear(); levelFilterAdjusted = true; } } From 19399c6f570a011397f9d7bcd8e7ea2dcd53a680 Mon Sep 17 00:00:00 2001 From: Revision Date: Sun, 20 Jul 2025 23:13:14 +0200 Subject: [PATCH 006/151] Implement Karazhan strategy --- conf/playerbots.conf.dist | 2 +- src/PlayerbotAI.cpp | 3 + src/factory/PlayerbotFactory.cpp | 3 - src/strategy/AiObjectContext.cpp | 23 + src/strategy/raids/RaidStrategyContext.h | 3 + .../karazhan/RaidKarazhanActionContext.h | 85 ++ .../raids/karazhan/RaidKarazhanActions.cpp | 1026 +++++++++++++++++ .../raids/karazhan/RaidKarazhanActions.h | 208 ++++ .../raids/karazhan/RaidKarazhanHelpers.cpp | 262 +++++ .../raids/karazhan/RaidKarazhanHelpers.h | 105 ++ .../raids/karazhan/RaidKarazhanStrategy.cpp | 76 ++ .../raids/karazhan/RaidKarazhanStrategy.h | 17 + .../karazhan/RaidKarazhanTriggerContext.h | 39 + .../raids/karazhan/RaidKarazhanTriggers.cpp | 134 +++ .../raids/karazhan/RaidKarazhanTriggers.h | 83 ++ 15 files changed, 2065 insertions(+), 4 deletions(-) create mode 100644 src/strategy/raids/karazhan/RaidKarazhanActionContext.h create mode 100644 src/strategy/raids/karazhan/RaidKarazhanActions.cpp create mode 100644 src/strategy/raids/karazhan/RaidKarazhanActions.h create mode 100644 src/strategy/raids/karazhan/RaidKarazhanHelpers.cpp create mode 100644 src/strategy/raids/karazhan/RaidKarazhanHelpers.h create mode 100644 src/strategy/raids/karazhan/RaidKarazhanStrategy.cpp create mode 100644 src/strategy/raids/karazhan/RaidKarazhanStrategy.h create mode 100644 src/strategy/raids/karazhan/RaidKarazhanTriggerContext.h create mode 100644 src/strategy/raids/karazhan/RaidKarazhanTriggers.cpp create mode 100644 src/strategy/raids/karazhan/RaidKarazhanTriggers.h diff --git a/conf/playerbots.conf.dist b/conf/playerbots.conf.dist index be48bb3c10..beaa09dca6 100644 --- a/conf/playerbots.conf.dist +++ b/conf/playerbots.conf.dist @@ -439,7 +439,7 @@ AiPlayerbot.AutoAvoidAoe = 1 AiPlayerbot.MaxAoeAvoidRadius = 15.0 # A whitelist of aoe spell IDs that should not be avoided -AiPlayerbot.AoeAvoidSpellWhitelist = 50759,57491,13810 +AiPlayerbot.AoeAvoidSpellWhitelist = 50759,57491,13810,29946 # Enable healer bot save mana strategy # Default: 1 (enabled) diff --git a/src/PlayerbotAI.cpp b/src/PlayerbotAI.cpp index d0a776b322..1d5de49b6c 100644 --- a/src/PlayerbotAI.cpp +++ b/src/PlayerbotAI.cpp @@ -1524,6 +1524,9 @@ void PlayerbotAI::ApplyInstanceStrategies(uint32 mapId, bool tellMaster) case 509: strategyName = "aq20"; break; + case 532: + strategyName = "karazhan"; + break; case 533: strategyName = "naxx"; break; diff --git a/src/factory/PlayerbotFactory.cpp b/src/factory/PlayerbotFactory.cpp index 585f263380..d789bd2161 100644 --- a/src/factory/PlayerbotFactory.cpp +++ b/src/factory/PlayerbotFactory.cpp @@ -2346,9 +2346,6 @@ void PlayerbotFactory::UpdateTradeSkills() void PlayerbotFactory::InitSkills() { - //uint32 maxValue = level * 5; //not used, line marked for removal. - bot->UpdateSkillsForLevel(); - bot->SetSkill(SKILL_RIDING, 0, 0, 0); if (bot->GetLevel() >= sPlayerbotAIConfig->useGroundMountAtMinLevel) bot->learnSpell(33388); diff --git a/src/strategy/AiObjectContext.cpp b/src/strategy/AiObjectContext.cpp index dd025c2e83..2e516c541e 100644 --- a/src/strategy/AiObjectContext.cpp +++ b/src/strategy/AiObjectContext.cpp @@ -27,6 +27,27 @@ #include "WarriorAiObjectContext.h" #include "WorldPacketActionContext.h" #include "WorldPacketTriggerContext.h" +#include "raids/RaidStrategyContext.h" +#include "raids/blackwinglair/RaidBwlActionContext.h" +#include "raids/blackwinglair/RaidBwlTriggerContext.h" +#include "raids/naxxramas/RaidNaxxActionContext.h" +#include "raids/naxxramas/RaidNaxxTriggerContext.h" +#include "raids/icecrown/RaidIccActionContext.h" +#include "raids/icecrown/RaidIccTriggerContext.h" +#include "raids/obsidiansanctum/RaidOsActionContext.h" +#include "raids/obsidiansanctum/RaidOsTriggerContext.h" +#include "raids/eyeofeternity/RaidEoEActionContext.h" +#include "raids/vaultofarchavon/RaidVoATriggerContext.h" +#include "raids/onyxia/RaidOnyxiaActionContext.h" +#include "raids/onyxia/RaidOnyxiaTriggerContext.h" +#include "raids/vaultofarchavon/RaidVoAActionContext.h" +#include "raids/eyeofeternity/RaidEoETriggerContext.h" +#include "raids/moltencore/RaidMcActionContext.h" +#include "raids/moltencore/RaidMcTriggerContext.h" +#include "raids/aq20/RaidAq20ActionContext.h" +#include "raids/aq20/RaidAq20TriggerContext.h" +#include "raids/karazhan/RaidKarazhanActionContext.h" +#include "raids/karazhan/RaidKarazhanTriggerContext.h" #include "dungeons/DungeonStrategyContext.h" #include "dungeons/wotlk/WotlkDungeonActionContext.h" #include "dungeons/wotlk/WotlkDungeonTriggerContext.h" @@ -115,6 +136,7 @@ void AiObjectContext::BuildSharedActionContexts(SharedNamedObjectContextList { @@ -31,6 +32,7 @@ class RaidStrategyContext : public NamedObjectContext creators["uld"] = &RaidStrategyContext::uld; creators["icc"] = &RaidStrategyContext::icc; creators["onyxia"] = &RaidStrategyContext::onyxia; + creators["karazhan"] = &RaidStrategyContext::karazhan; } private: @@ -44,6 +46,7 @@ class RaidStrategyContext : public NamedObjectContext static Strategy* uld(PlayerbotAI* botAI) { return new RaidUlduarStrategy(botAI); } static Strategy* icc(PlayerbotAI* botAI) { return new RaidIccStrategy(botAI); } static Strategy* onyxia(PlayerbotAI* botAI) { return new RaidOnyxiaStrategy(botAI); } + static Strategy* karazhan(PlayerbotAI* botAI) { return new RaidKarazhanStrategy(botAI); } }; #endif diff --git a/src/strategy/raids/karazhan/RaidKarazhanActionContext.h b/src/strategy/raids/karazhan/RaidKarazhanActionContext.h new file mode 100644 index 0000000000..f58fe4b52c --- /dev/null +++ b/src/strategy/raids/karazhan/RaidKarazhanActionContext.h @@ -0,0 +1,85 @@ +#ifndef _PLAYERBOT_RAIDKARAZHANACTIONS_CONTEXT_H +#define _PLAYERBOT_RAIDKARAZHANACTIONS_CONTEXT_H + +#include "Action.h" +#include "NamedObjectContext.h" +#include "RaidKarazhanActions.h" + + +class RaidKarazhanActionContext : public NamedObjectContext +{ +public: + RaidKarazhanActionContext() + { + creators["karazhan attumen the huntsman stack behind"] = &RaidKarazhanActionContext::karazhan_attumen_the_huntsman_stack_behind; + + creators["karazhan moroes mark target"] = &RaidKarazhanActionContext::karazhan_moroes_mark_target; + + creators["karazhan maiden of virtue position boss"] = &RaidKarazhanActionContext::karazhan_maiden_of_virtue_position_boss; + creators["karazhan maiden of virtue position ranged"] = &RaidKarazhanActionContext::karazhan_maiden_of_virtue_position_ranged; + + creators["karazhan big bad wolf run away"] = &RaidKarazhanActionContext::karazhan_big_bad_wolf_run_away; + + creators["karazhan romulo and julianne mark target"] = &RaidKarazhanActionContext::karazhan_romulo_and_julianne_mark_target; + + creators["karazhan wizard of oz mark target"] = &RaidKarazhanActionContext::karazhan_wizard_of_oz_mark_target; + creators["karazhan wizard of oz scorch strawman"] = &RaidKarazhanActionContext::karazhan_wizard_of_oz_scorch_strawman; + + creators["karazhan the curator mark target"] = &RaidKarazhanActionContext::karazhan_the_curator_mark_target; + creators["karazhan the curator position boss"] = &RaidKarazhanActionContext::karazhan_the_curator_position_boss; + creators["karazhan the curator spread ranged"] = &RaidKarazhanActionContext::karazhan_the_curator_spread_ranged; + + creators["karazhan terestian illhoof mark target"] = &RaidKarazhanActionContext::karazhan_terestian_illhoof_mark_target; + + creators["karazhan shade of aran arcane explosion run away"] = &RaidKarazhanActionContext::karazhan_shade_of_aran_arcane_explosion_run_away; + creators["karazhan shade of aran flame wreath stop bot"] = &RaidKarazhanActionContext::karazhan_shade_of_aran_flame_wreath_stop_bot; + creators["karazhan shade of aran mark conjured elemental"] = &RaidKarazhanActionContext::karazhan_shade_of_aran_mark_conjured_elemental; + creators["karazhan shade of aran spread ranged"] = &RaidKarazhanActionContext::karazhan_shade_of_aran_spread_ranged; + + creators["karazhan netherspite block red beam"] = &RaidKarazhanActionContext::karazhan_netherspite_block_red_beam; + creators["karazhan netherspite block blue beam"] = &RaidKarazhanActionContext::karazhan_netherspite_block_blue_beam; + creators["karazhan netherspite block green beam"] = &RaidKarazhanActionContext::karazhan_netherspite_block_green_beam; + creators["karazhan netherspite avoid beam and void zone"] = &RaidKarazhanActionContext::karazhan_netherspite_avoid_beam_and_void_zone; + creators["karazhan netherspite banish phase avoid void zone"] = &RaidKarazhanActionContext::karazhan_netherspite_banish_phase_avoid_void_zone; + + creators["karazhan prince malchezaar avoid infernal"] = &RaidKarazhanActionContext::karazhan_prince_malchezaar_avoid_infernal; + creators["karazhan prince malchezaar run away from shadow nova"] = &RaidKarazhanActionContext::karazhan_prince_malchezaar_run_away_from_shadow_nova; + } + +private: + static Action* karazhan_attumen_the_huntsman_stack_behind(PlayerbotAI* botAI) { return new KarazhanAttumenTheHuntsmanStackBehindAction(botAI); } + + static Action* karazhan_moroes_mark_target(PlayerbotAI* botAI) { return new KarazhanMoroesMarkTargetAction(botAI); } + + static Action* karazhan_maiden_of_virtue_position_boss(PlayerbotAI* botAI) { return new KarazhanMaidenOfVirtuePositionBossAction(botAI); } + static Action* karazhan_maiden_of_virtue_position_ranged(PlayerbotAI* botAI) { return new KarazhanMaidenOfVirtuePositionRangedAction(botAI); } + + static Action* karazhan_big_bad_wolf_run_away(PlayerbotAI* botAI) { return new KarazhanBigBadWolfRunAwayAction(botAI); } + + static Action* karazhan_romulo_and_julianne_mark_target(PlayerbotAI* botAI) { return new KarazhanRomuloAndJulianneMarkTargetAction(botAI); } + + static Action* karazhan_wizard_of_oz_mark_target(PlayerbotAI* botAI) { return new KarazhanWizardOfOzMarkTargetAction(botAI); } + static Action* karazhan_wizard_of_oz_scorch_strawman(PlayerbotAI* botAI) { return new KarazhanWizardOfOzScorchStrawmanAction(botAI); } + + static Action* karazhan_the_curator_mark_target(PlayerbotAI* botAI) { return new KarazhanTheCuratorMarkTargetAction(botAI); } + static Action* karazhan_the_curator_position_boss(PlayerbotAI* botAI) { return new KarazhanTheCuratorPositionBossAction(botAI); } + static Action* karazhan_the_curator_spread_ranged(PlayerbotAI* botAI) { return new KarazhanTheCuratorSpreadRangedAction(botAI); } + + static Action* karazhan_terestian_illhoof_mark_target(PlayerbotAI* botAI) { return new KarazhanTerestianIllhoofMarkTargetAction(botAI); } + + static Action* karazhan_shade_of_aran_arcane_explosion_run_away(PlayerbotAI* botAI) { return new KarazhanShadeOfAranArcaneExplosionRunAwayAction(botAI); } + static Action* karazhan_shade_of_aran_flame_wreath_stop_bot(PlayerbotAI* botAI) { return new KarazhanShadeOfAranFlameWreathStopBotAction(botAI); } + static Action* karazhan_shade_of_aran_mark_conjured_elemental(PlayerbotAI* botAI) { return new KarazhanShadeOfAranMarkConjuredElementalAction(botAI); } + static Action* karazhan_shade_of_aran_spread_ranged(PlayerbotAI* botAI) { return new KarazhanShadeOfAranSpreadRangedAction(botAI); } + + static Action* karazhan_netherspite_block_red_beam(PlayerbotAI* botAI) { return new KarazhanNetherspiteBlockRedBeamAction(botAI); } + static Action* karazhan_netherspite_block_blue_beam(PlayerbotAI* botAI) { return new KarazhanNetherspiteBlockBlueBeamAction(botAI); } + static Action* karazhan_netherspite_block_green_beam(PlayerbotAI* botAI) { return new KarazhanNetherspiteBlockGreenBeamAction(botAI); } + static Action* karazhan_netherspite_avoid_beam_and_void_zone(PlayerbotAI* botAI) { return new KarazhanNetherspiteAvoidBeamAndVoidZoneAction(botAI); } + static Action* karazhan_netherspite_banish_phase_avoid_void_zone(PlayerbotAI* botAI) { return new KarazhanNetherspiteBanishPhaseAvoidVoidZoneAction(botAI); } + + static Action* karazhan_prince_malchezaar_avoid_infernal(PlayerbotAI* botAI) { return new KarazhanPrinceMalchezaarAvoidInfernalAction(botAI); } + static Action* karazhan_prince_malchezaar_run_away_from_shadow_nova(PlayerbotAI* botAI) { return new KarazhanPrinceMalchezaarRunAwayFromShadowNovaAction(botAI); } +}; + +#endif diff --git a/src/strategy/raids/karazhan/RaidKarazhanActions.cpp b/src/strategy/raids/karazhan/RaidKarazhanActions.cpp new file mode 100644 index 0000000000..41ecc0bf7b --- /dev/null +++ b/src/strategy/raids/karazhan/RaidKarazhanActions.cpp @@ -0,0 +1,1026 @@ +#include "Playerbots.h" +#include "RaidKarazhanActions.h" +#include "RaidKarazhanHelpers.h" +#include "Timer.h" +#include "WarlockActions.h" +#include "AiObjectContext.h" +#include "Pet.h" +#include "GenericActions.h" +#include "PlayerbotMgr.h" +#include "PlayerbotAI.h" +#include "MovementActions.h" + +namespace +{ + static std::map beamMoveTimes; + static std::map lastBeamMoveSideways; +} + +bool KarazhanAttumenTheHuntsmanStackBehindAction::Execute(Event event) +{ + RaidKarazhanHelpers karazhanHelper(botAI); + Unit* boss = karazhanHelper.GetFirstAliveUnitByEntry(NPC_ATTUMEN_THE_HUNTSMAN); + + float distance = 5.0f; + float orientation = boss->GetOrientation() + M_PI; + float x = boss->GetPositionX(); + float y = boss->GetPositionY(); + float z = boss->GetPositionZ(); + float rx = x + cos(orientation) * distance; + float ry = y + sin(orientation) * distance; + + return MoveTo(bot->GetMapId(), rx, ry, z, false, false, false, false, MovementPriority::MOVEMENT_COMBAT); +} + +bool KarazhanAttumenTheHuntsmanStackBehindAction::isUseful() +{ + RaidKarazhanHelpers karazhanHelper(botAI); + Unit* boss = karazhanHelper.GetFirstAliveUnitByEntry(NPC_ATTUMEN_THE_HUNTSMAN); + + if (boss && botAI->IsTank(bot) && botAI->HasAggro(boss) && boss->GetVictim() == bot) + return false; + + return boss != nullptr; +} + +bool KarazhanMoroesMarkTargetAction::Execute(Event event) +{ + RaidKarazhanHelpers karazhanHelper(botAI); + + Unit* dorothea = AI_VALUE2(Unit*, "find target", "baroness dorothea millstipe"); + Unit* catriona = AI_VALUE2(Unit*, "find target", "lady catriona von'indi"); + Unit* keira = AI_VALUE2(Unit*, "find target", "lady keira berrybuck"); + Unit* rafe = AI_VALUE2(Unit*, "find target", "baron rafe dreuger"); + Unit* robin = AI_VALUE2(Unit*, "find target", "lord robin daris"); + Unit* crispin = AI_VALUE2(Unit*, "find target", "lord crispin ference"); + Unit* target = karazhanHelper.GetFirstAliveUnit({dorothea, catriona, keira, rafe, robin, crispin}); + + karazhanHelper.MarkTargetWithSkull(target); + + return false; +} + +bool KarazhanMaidenOfVirtuePositionBossAction::Execute(Event event) +{ + Unit* boss = AI_VALUE2(Unit*, "find target", "maiden of virtue"); + Unit* healer = nullptr; + + if (Group* group = bot->GetGroup()) + { + for (GroupReference* itr = group->GetFirstMember(); itr != nullptr; itr = itr->next()) + { + Player* member = itr->GetSource(); + if (!member || !member->IsAlive() || !botAI->IsHeal(member) || !member->HasAura(SPELL_REPENTANCE)) + continue; + healer = member; + break; + } + } + + if (healer) + { + float angle = healer->GetOrientation(); + float targetX = healer->GetPositionX() + cos(angle) * 6.0f; + float targetY = healer->GetPositionY() + sin(angle) * 6.0f; + float targetZ = healer->GetPositionZ(); + + return MoveTo(bot->GetMapId(), targetX, targetY, targetZ, false, false, false, true, + MovementPriority::MOVEMENT_COMBAT); + } + + const float maxDistance = 3.0f; + const float distanceToBossPosition = boss->GetExactDist2d(KARAZHAN_MAIDEN_OF_VIRTUE_BOSS_POSITION); + + if (distanceToBossPosition > maxDistance) + { + float dX = KARAZHAN_MAIDEN_OF_VIRTUE_BOSS_POSITION.GetPositionX() - boss->GetPositionX(); + float dY = KARAZHAN_MAIDEN_OF_VIRTUE_BOSS_POSITION.GetPositionY() - boss->GetPositionY(); + float mX = KARAZHAN_MAIDEN_OF_VIRTUE_BOSS_POSITION.GetPositionX() + (dX / distanceToBossPosition) * maxDistance; + float mY = KARAZHAN_MAIDEN_OF_VIRTUE_BOSS_POSITION.GetPositionY() + (dY / distanceToBossPosition) * maxDistance; + + return MoveTo(bot->GetMapId(), mX, mY, + bot->GetPositionZ(), false, false, false, false, MovementPriority::MOVEMENT_COMBAT, true, false); + } + return false; +} + +bool KarazhanMaidenOfVirtuePositionBossAction::isUseful() +{ + Unit* boss = AI_VALUE2(Unit*, "find target", "maiden of virtue"); + + return boss && botAI->IsTank(bot) && botAI->HasAggro(boss) && boss->GetVictim() == bot; +} + +bool KarazhanMaidenOfVirtuePositionRangedAction::Execute(Event event) +{ + int maxIndex = 7; + int index = 0; + + const GuidVector members = AI_VALUE(GuidVector, "group members"); + + for (const auto& memberGuid : members) + { + Unit* member = botAI->GetUnit(memberGuid); + + if (!member || !botAI->IsRanged(member->ToPlayer())) + continue; + + if (member == bot) + break; + + if (index >= maxIndex) + { + index = 0; + continue; + } + index++; + } + + float distance = bot->GetExactDist2d(KARAZHAN_MAIDEN_OF_VIRTUE_RANGED_POSITION[index]); + const float maxDistance = 2.0f; + + if (distance > maxDistance) + return MoveTo(bot->GetMapId(), KARAZHAN_MAIDEN_OF_VIRTUE_RANGED_POSITION[index].GetPositionX(), + KARAZHAN_MAIDEN_OF_VIRTUE_RANGED_POSITION[index].GetPositionY(), bot->GetPositionZ(), false, + false, false, false, MovementPriority::MOVEMENT_COMBAT, true, false); + + return false; +} + +bool KarazhanMaidenOfVirtuePositionRangedAction::isUseful() +{ + Unit* boss = AI_VALUE2(Unit*, "find target", "maiden of virtue"); + + return boss && botAI->IsRanged(bot); +} + +bool KarazhanBigBadWolfRunAwayAction::Execute(Event event) +{ + Unit* boss = AI_VALUE2(Unit*, "find target", "the big bad wolf"); + + bot->AttackStop(); + bot->InterruptNonMeleeSpells(false); + + constexpr float threshold = 1.0f; + Position target = KARAZHAN_BIG_BAD_WOLF_RUN_POSITION[currentIndex]; + + if (bot->GetExactDist2d(target.GetPositionX(), target.GetPositionY()) < threshold) + { + currentIndex = (currentIndex + 1) % 4; + target = KARAZHAN_BIG_BAD_WOLF_RUN_POSITION[currentIndex]; + } + + return MoveTo(bot->GetMapId(), target.GetPositionX(), target.GetPositionY(), target.GetPositionZ(), false, false, + false, true, MovementPriority::MOVEMENT_FORCED); +} + +bool KarazhanBigBadWolfRunAwayAction::isUseful() +{ + Unit* boss = AI_VALUE2(Unit*, "find target", "the big bad wolf"); + + return boss && bot->HasAura(SPELL_LITTLE_RED_RIDING_HOOD); +} + +bool KarazhanRomuloAndJulianneMarkTargetAction::Execute(Event event) +{ + Unit* target = nullptr; + Unit* romulo = AI_VALUE2(Unit*, "find target", "romulo"); + Unit* julianne = AI_VALUE2(Unit*, "find target", "julianne"); + + const int maxPctDifference = 10; + if (julianne->GetHealthPct() + maxPctDifference < romulo->GetHealthPct() || julianne->GetHealthPct() < 1.0f) + target = romulo; + else if (romulo->GetHealthPct() + maxPctDifference < julianne->GetHealthPct() || romulo->GetHealthPct() < 1.0f) + target = julianne; + if (!target) + return false; + + RaidKarazhanHelpers karazhanHelper(botAI); + karazhanHelper.MarkTargetWithSkull(target); + + return false; +} + +bool KarazhanWizardOfOzMarkTargetAction::Execute(Event event) +{ + RaidKarazhanHelpers karazhanHelper(botAI); + Unit* dorothee = AI_VALUE2(Unit*, "find target", "dorothee"); + Unit* tito = AI_VALUE2(Unit*, "find target", "tito"); + Unit* roar = AI_VALUE2(Unit*, "find target", "roar"); + Unit* strawman = AI_VALUE2(Unit*, "find target", "strawman"); + Unit* tinhead = AI_VALUE2(Unit*, "find target", "tinhead"); + Unit* crone = AI_VALUE2(Unit*, "find target", "the crone"); + Unit* target = karazhanHelper.GetFirstAliveUnit({dorothee, tito, roar, strawman, tinhead, crone}); + + karazhanHelper.MarkTargetWithSkull(target); + + return false; +} + +bool KarazhanWizardOfOzScorchStrawmanAction::Execute(Event event) +{ + Unit* strawman = AI_VALUE2(Unit*, "find target", "strawman"); + if (!strawman || !strawman->IsAlive()) + return false; + + Group* group = bot->GetGroup(); + if (!group) + return false; + + const std::vector scorchSpellIds = {42859, 42858, 10207}; + + for (GroupReference* itr = group->GetFirstMember(); itr != nullptr; itr = itr->next()) + { + Player* member = itr->GetSource(); + if (!member || !member->IsAlive()) + continue; + + if (member->getClass() != CLASS_MAGE) + continue; + + PlayerbotAI* mageAI = sPlayerbotsMgr->GetPlayerbotAI(member); + if (!mageAI) + continue; + + uint32 knownScorchId = 0; + for (uint32 spellId : scorchSpellIds) + { + if (member->HasSpell(spellId)) + { + knownScorchId = spellId; + break; + } + } + if (!knownScorchId) + continue; + + mageAI->CastSpell(knownScorchId, strawman); + } + return false; +} + +bool KarazhanTheCuratorMarkTargetAction::Execute(Event event) +{ + Unit* target = AI_VALUE2(Unit*, "find target", "astral flare"); + if (!target || !target->IsAlive()) + return false; + + RaidKarazhanHelpers karazhanHelper(botAI); + karazhanHelper.MarkTargetWithSkull(target); + + return false; +} + +bool KarazhanTheCuratorPositionBossAction::Execute(Event event) +{ + Unit* boss = AI_VALUE2(Unit*, "find target", "the curator"); + + const float maxDistance = 3.0f; + const float distanceToBossPosition = boss->GetExactDist2d(KARAZHAN_THE_CURATOR_BOSS_POSITION); + + if (distanceToBossPosition > maxDistance) + { + float dX = KARAZHAN_THE_CURATOR_BOSS_POSITION.GetPositionX() - boss->GetPositionX(); + float dY = KARAZHAN_THE_CURATOR_BOSS_POSITION.GetPositionY() - boss->GetPositionY(); + + float mX = KARAZHAN_THE_CURATOR_BOSS_POSITION.GetPositionX() + (dX / distanceToBossPosition) * maxDistance; + float mY = KARAZHAN_THE_CURATOR_BOSS_POSITION.GetPositionY() + (dY / distanceToBossPosition) * maxDistance; + + return MoveTo(bot->GetMapId(), mX, mY, + bot->GetPositionZ(), false, false, false, false, MovementPriority::MOVEMENT_COMBAT, true, + false); + } + return false; +} + +bool KarazhanTheCuratorPositionBossAction::isUseful() +{ + Unit* boss = AI_VALUE2(Unit*, "find target", "the curator"); + + return boss && botAI->IsTank(bot) && botAI->HasAggro(boss) && boss->GetVictim() == bot; +} + +bool KarazhanTheCuratorSpreadRangedAction::Execute(Event event) +{ + RaidKarazhanHelpers karazhanHelper(botAI); + const float minDistance = 5.0f; + Unit* nearestPlayer = karazhanHelper.GetNearestPlayerInRadius(minDistance); + + if (nearestPlayer) + return FleePosition(nearestPlayer->GetPosition(), minDistance); + + return false; +} + +bool KarazhanTheCuratorSpreadRangedAction::isUseful() +{ + Unit* boss = AI_VALUE2(Unit*, "find target", "the curator"); + + return boss && botAI->IsRanged(bot); +} + +bool KarazhanTerestianIllhoofMarkTargetAction::Execute(Event event) +{ + Unit* boss = AI_VALUE2(Unit*, "find target", "terestian illhoof"); + if (!boss) + return false; + + RaidKarazhanHelpers karazhanHelper(botAI); + Unit* target = karazhanHelper.GetFirstAliveUnitByEntry(NPC_DEMON_CHAINS); + + if (!target || !target->IsAlive()) + { + target = karazhanHelper.GetFirstAliveUnitByEntry(NPC_KILREK); + if (!target || !target->IsAlive()) + { + target = boss; + } + } + karazhanHelper.MarkTargetWithSkull(target); + + return false; +} + +bool KarazhanShadeOfAranArcaneExplosionRunAwayAction::Execute(Event event) +{ + Unit* boss = AI_VALUE2(Unit*, "find target", "shade of aran"); + static std::map arcaneExplosionEndTimes; + ObjectGuid botGuid = bot->GetGUID(); + const float safeDistance = 20.0f; + const float distance = bot->GetDistance2d(boss); + + bot->AttackStop(); + bot->InterruptNonMeleeSpells(false); + + if (distance < safeDistance) + { + return MoveAway(boss, safeDistance - distance); + } + + if (!botAI->HasStrategy("stay", BOT_STATE_COMBAT)) + botAI->ChangeStrategy("+stay", BOT_STATE_COMBAT); + + return false; +} + +bool KarazhanShadeOfAranArcaneExplosionRunAwayAction::isUseful() +{ + Unit* boss = AI_VALUE2(Unit*, "find target", "shade of aran"); + static std::map arcaneExplosionEndTimes; + ObjectGuid botGuid = bot->GetGUID(); + if (!boss || !boss->IsAlive()) + return false; + + if (boss->HasUnitState(UNIT_STATE_CASTING) && boss->FindCurrentSpellBySpellId(SPELL_ARCANE_EXPLOSION)) + { + arcaneExplosionEndTimes[botGuid] = time(nullptr) + 1; + return true; + } + + if (arcaneExplosionEndTimes.count(botGuid) && arcaneExplosionEndTimes[botGuid] > time(nullptr)) + { + return true; + } + + if (arcaneExplosionEndTimes.count(botGuid)) + arcaneExplosionEndTimes.erase(botGuid); + + if (botAI->HasStrategy("stay", BOT_STATE_COMBAT)) + botAI->ChangeStrategy("-stay", BOT_STATE_COMBAT); + + return false; +} + +bool KarazhanShadeOfAranFlameWreathStopBotAction::Execute(Event event) +{ + RaidKarazhanHelpers karazhanHelper(botAI); + static std::map flameWreathPositions; + ObjectGuid botGuid = bot->GetGUID(); + if (karazhanHelper.IsFlameWreathActive()) + { + if (flameWreathPositions.find(botGuid) == flameWreathPositions.end()) + { + flameWreathPositions[botGuid] = Position(bot->GetPositionX(), bot->GetPositionY(), bot->GetPositionZ()); + } + + AI_VALUE(LastMovement&, "last movement").Set(nullptr); + bot->GetMotionMaster()->Clear(); + if (bot->isMoving()) + bot->StopMoving(); + + Position& pos = flameWreathPositions[botGuid]; + return MoveTo(bot->GetMapId(), pos.GetPositionX(), pos.GetPositionY(), pos.GetPositionZ(), false, false, false, true, MovementPriority::MOVEMENT_FORCED); + } + else + { + flameWreathPositions.erase(botGuid); + } + return false; +} + +bool KarazhanShadeOfAranMarkConjuredElementalAction::Execute(Event event) +{ + RaidKarazhanHelpers karazhanHelper(botAI); + Unit* boss = AI_VALUE2(Unit*, "find target", "shade of aran"); + if (!boss || !boss->IsAlive() || karazhanHelper.IsFlameWreathActive()) + return false; + + Unit* target = karazhanHelper.GetFirstAliveUnitByEntry(NPC_CONJURED_ELEMENTAL); + if (!target || target->HasAura(SPELL_WARLOCK_BANISH) || !target->IsAlive()) + { + return false; + } + karazhanHelper.MarkTargetWithSkull(target); + + return false; +} + +bool KarazhanShadeOfAranSpreadRangedAction::Execute(Event event) +{ + Unit* boss = AI_VALUE2(Unit*, "find target", "shade of aran"); + + const float maxBossDistance = 12.0f; + float bossDistance = bot->GetExactDist2d(boss); + if (bossDistance > maxBossDistance) + { + float dX = bot->GetPositionX() - boss->GetPositionX(); + float dY = bot->GetPositionY() - boss->GetPositionY(); + float length = std::sqrt(dX * dX + dY * dY); + + dX /= length; + dY /= length; + + float tX = boss->GetPositionX() + dX * maxBossDistance; + float tY = boss->GetPositionY() + dY * maxBossDistance; + + return MoveTo(bot->GetMapId(), tX, tY, bot->GetPositionZ(), false, false, false, true, + MovementPriority::MOVEMENT_COMBAT); + } + + const float minDistance = 5.0f; + RaidKarazhanHelpers karazhanHelper(botAI); + Unit* nearestPlayer = karazhanHelper.GetNearestPlayerInRadius(minDistance); + if (nearestPlayer) + return FleePosition(nearestPlayer->GetPosition(), minDistance); + + return false; +} + +bool KarazhanShadeOfAranSpreadRangedAction::isUseful() +{ + Unit* boss = AI_VALUE2(Unit*, "find target", "shade of aran"); + if (!boss || !boss->IsAlive()) + return false; + + RaidKarazhanHelpers karazhanHelper(botAI); + + return botAI->IsRanged(bot) && !karazhanHelper.IsFlameWreathActive() && !(boss->HasUnitState(UNIT_STATE_CASTING) && boss->FindCurrentSpellBySpellId(SPELL_ARCANE_EXPLOSION)); +} + +// One tank per phase will dance in and out of the red beam (5 seconds in, 5 seconds out) +// Tanks will ignore void zones--their positioning is too important +bool KarazhanNetherspiteBlockRedBeamAction::Execute(Event event) +{ + Unit* boss = AI_VALUE2(Unit*, "find target", "netherspite"); + Unit* redPortal = bot->FindNearestCreature(NPC_RED_PORTAL, 150.0f); + + Group* group = bot->GetGroup(); + if (!group) + return false; + + Player* eligibleTank = nullptr; + for (GroupReference* itr = group->GetFirstMember(); itr != nullptr; itr = itr->next()) + { + Player* member = itr->GetSource(); + if (!member || !member->IsAlive()) + continue; + PlayerbotAI* memberAI = sPlayerbotsMgr->GetPlayerbotAI(member); + if (!memberAI || !memberAI->IsTank(member)) + continue; + if (member->HasAura(SPELL_NETHER_EXHAUSTION_RED)) + continue; + eligibleTank = member; + break; + } + + RaidKarazhanHelpers karazhanHelper(botAI); + Position beamPos = karazhanHelper.GetPositionOnBeam(boss, redPortal, 18.0f); + + if (bot == eligibleTank) + { + bot->Yell("I'm moving to block the red beam!", LANG_UNIVERSAL); + ObjectGuid botGuid = bot->GetGUID(); + uint32 intervalSecs = 5; + + if (beamMoveTimes[botGuid] == 0) + { + beamMoveTimes[botGuid] = time(nullptr); + lastBeamMoveSideways[botGuid] = false; + } + if (time(nullptr) - beamMoveTimes[botGuid] >= intervalSecs) + { + lastBeamMoveSideways[botGuid] = !lastBeamMoveSideways[botGuid]; + beamMoveTimes[botGuid] = time(nullptr); + } + if (!lastBeamMoveSideways[botGuid]) + { + return MoveTo(bot->GetMapId(), beamPos.GetPositionX(), beamPos.GetPositionY(), beamPos.GetPositionZ(), false, false, false, true, MovementPriority::MOVEMENT_FORCED); + } + else + { + float bx = boss->GetPositionX(); + float by = boss->GetPositionY(); + float px = redPortal->GetPositionX(); + float py = redPortal->GetPositionY(); + float dx = px - bx; + float dy = py - by; + float length = sqrt(dx*dx + dy*dy); + if (length == 0.0f) + return false; + + dx /= length; + dy /= length; + float perpDx = -dy; + float perpDy = dx; + float sideX = beamPos.GetPositionX() + perpDx * 3.0f; + float sideY = beamPos.GetPositionY() + perpDy * 3.0f; + float sideZ = beamPos.GetPositionZ(); + + return MoveTo(bot->GetMapId(), sideX, sideY, sideZ, false, false, false, true, MovementPriority::MOVEMENT_FORCED); + } + } + return false; +} + +bool KarazhanNetherspiteBlockRedBeamAction::isUseful() +{ + Unit* boss = AI_VALUE2(Unit*, "find target", "netherspite"); + Unit* redPortal = bot->FindNearestCreature(NPC_RED_PORTAL, 150.0f); + + ObjectGuid botGuid = bot->GetGUID(); + static std::map lastBossBanishState; + bool bossIsBanished = boss && boss->HasAura(SPELL_NETHERSPITE_BANISHED); + + if (!boss || !redPortal) + return false; + + if (lastBossBanishState[botGuid] != bossIsBanished) + { + if (!bossIsBanished) + { + beamMoveTimes[botGuid] = 0; + lastBeamMoveSideways[botGuid] = false; + } + lastBossBanishState[botGuid] = bossIsBanished; + } + + if (bossIsBanished) + return false; + + return true; +} + +// Two non-Rogue/Warrior DPS will block the blue beam for each phase (swap at 25 debuff stacks) +// When avoiding void zones, blocking bots will move along the beam to continue blocking +bool KarazhanNetherspiteBlockBlueBeamAction::Execute(Event event) +{ + Unit* boss = AI_VALUE2(Unit*, "find target", "netherspite"); + Unit* bluePortal = bot->FindNearestCreature(NPC_BLUE_PORTAL, 150.0f); + + RaidKarazhanHelpers karazhanHelper(botAI); + std::vector blueBlockers = karazhanHelper.GetBlueBlockers(); + static std::map wasBlockingBlueBeam; + ObjectGuid botGuid = bot->GetGUID(); + Player* assignedBlueBlocker = blueBlockers.empty() ? nullptr : blueBlockers.front(); + bool isBlockingNow = (bot == assignedBlueBlocker); + bool wasBlocking = wasBlockingBlueBeam[botGuid]; + + if (wasBlocking && !isBlockingNow) + { + bot->Yell("I'm leaving the blue beam--next blocker up!", LANG_UNIVERSAL); + wasBlockingBlueBeam[botGuid] = false; + } + else if (isBlockingNow) + { + wasBlockingBlueBeam[botGuid] = true; + } + if (isBlockingNow) + { + if (!wasBlocking) + bot->Yell("I'm moving to block the blue beam!", LANG_UNIVERSAL); + wasBlockingBlueBeam[botGuid] = true; + std::vector voidZones = karazhanHelper.GetAllVoidZones(); + float bx = boss->GetPositionX(); + float by = boss->GetPositionY(); + float bz = boss->GetPositionZ(); + float px = bluePortal->GetPositionX(); + float py = bluePortal->GetPositionY(); + float dx = px - bx; + float dy = py - by; + float length = sqrt(dx*dx + dy*dy); + if (length == 0.0f) + return false; + + dx /= length; + dy /= length; + float bestDist = 150.0f; + Position bestPos; + bool found = false; + for (float dist = 18.0f; dist <= 25.0f; dist += 0.5f) + { + float candidateX = bx + dx * dist; + float candidateY = by + dy * dist; + float candidateZ = bz; + bool outsideAllVoidZones = true; + for (Unit* voidZone : voidZones) + { + float voidZoneDist = sqrt(pow(candidateX - voidZone->GetPositionX(), 2) + pow(candidateY - voidZone->GetPositionY(), 2)); + if (voidZoneDist < 4.0f) + { + outsideAllVoidZones = false; + break; + } + } + if (!outsideAllVoidZones) + continue; + + float distToIdeal = fabs(dist - 18.0f); + if (!found || distToIdeal < bestDist) + { + bestDist = distToIdeal; + bestPos = Position(candidateX, candidateY, candidateZ); + found = true; + } + } + if (found) + { + return MoveTo(bot->GetMapId(), bestPos.GetPositionX(), bestPos.GetPositionY(), bestPos.GetPositionZ(), false, false, false, true, MovementPriority::MOVEMENT_FORCED); + } + return false; + } + else if (wasBlocking) + { + wasBlockingBlueBeam[botGuid] = false; + } + return false; +} + +bool KarazhanNetherspiteBlockBlueBeamAction::isUseful() +{ + Unit* boss = AI_VALUE2(Unit*, "find target", "netherspite"); + Unit* bluePortal = bot->FindNearestCreature(NPC_BLUE_PORTAL, 150.0f); + + return boss && bluePortal && !boss->HasAura(SPELL_NETHERSPITE_BANISHED); +} + +// Two healers will block the green beam for each phase (swap at 25 debuff stacks +// OR one rogue or DPS warrior will block the green beam for any entire phase +// When avoiding void zones, blocking bots will move along the beam to continue blocking +bool KarazhanNetherspiteBlockGreenBeamAction::Execute(Event event) +{ + Unit* boss = AI_VALUE2(Unit*, "find target", "netherspite"); + Unit* greenPortal = bot->FindNearestCreature(NPC_GREEN_PORTAL, 150.0f); + + RaidKarazhanHelpers karazhanHelper(botAI); + std::vector greenBlockers = karazhanHelper.GetGreenBlockers(); + static std::map wasBlockingGreenBeam; + ObjectGuid botGuid = bot->GetGUID(); + Player* assignedGreenBlocker = greenBlockers.empty() ? nullptr : greenBlockers.front(); + bool isBlockingNow = (bot == assignedGreenBlocker); + bool wasBlocking = wasBlockingGreenBeam[botGuid]; + + if (wasBlocking && !isBlockingNow) + { + bot->Yell("I'm leaving the green beam--next blocker up!", LANG_UNIVERSAL); + wasBlockingGreenBeam[botGuid] = false; + } + else if (isBlockingNow) + { + if (!wasBlocking) + bot->Yell("I'm moving to block the green beam!", LANG_UNIVERSAL); + wasBlockingGreenBeam[botGuid] = true; + std::vector voidZones = karazhanHelper.GetAllVoidZones(); + float bx = boss->GetPositionX(); + float by = boss->GetPositionY(); + float bz = boss->GetPositionZ(); + float px = greenPortal->GetPositionX(); + float py = greenPortal->GetPositionY(); + float dx = px - bx; + float dy = py - by; + float length = sqrt(dx*dx + dy*dy); + if (length == 0.0f) + return false; + + dx /= length; + dy /= length; + float bestDist = 150.0f; + Position bestPos; + bool found = false; + for (float dist = 18.0f; dist <= 25.0f; dist += 0.5f) + { + float candidateX = bx + dx * dist; + float candidateY = by + dy * dist; + float candidateZ = bz; + bool outsideAllVoidZones = true; + for (Unit* voidZone : voidZones) + { + float voidZoneDist = sqrt(pow(candidateX - voidZone->GetPositionX(), 2) + pow(candidateY - voidZone->GetPositionY(), 2)); + if (voidZoneDist < 4.0f) + { + outsideAllVoidZones = false; + break; + } + } + if (!outsideAllVoidZones) + continue; + + float distToIdeal = fabs(dist - 18.0f); + if (!found || distToIdeal < bestDist) + { + bestDist = distToIdeal; + bestPos = Position(candidateX, candidateY, candidateZ); + found = true; + } + } + if (found) + { + return MoveTo(bot->GetMapId(), bestPos.GetPositionX(), bestPos.GetPositionY(), bestPos.GetPositionZ(), false, false, false, true, MovementPriority::MOVEMENT_FORCED); + } + return false; + } + else if (wasBlocking) + { + wasBlockingGreenBeam[botGuid] = false; + } + return false; +} + +bool KarazhanNetherspiteBlockGreenBeamAction::isUseful() +{ + Unit* boss = AI_VALUE2(Unit*, "find target", "netherspite"); + Unit* greenPortal = bot->FindNearestCreature(NPC_GREEN_PORTAL, 150.0f); + + return boss && greenPortal && !boss->HasAura(SPELL_NETHERSPITE_BANISHED); +} + +// All bots not currently blocking a beam will avoid beams and void zones +bool KarazhanNetherspiteAvoidBeamAndVoidZoneAction::Execute(Event event) +{ + Unit* boss = AI_VALUE2(Unit*, "find target", "netherspite"); + RaidKarazhanHelpers karazhanHelper(botAI); + auto [redBlocker, greenBlocker, blueBlocker] = karazhanHelper.GetCurrentBeamBlockers(); + std::vector voidZones = karazhanHelper.GetAllVoidZones(); + + bool nearVoidZone = false; + for (Unit* vz : voidZones) + { + if (bot->GetExactDist2d(vz) < 4.0f) + { + nearVoidZone = true; + break; + } + } + struct BeamAvoid { Unit* portal; float minDist, maxDist; }; + std::vector beams; + Unit* redPortal = bot->FindNearestCreature(NPC_RED_PORTAL, 150.0f); + Unit* bluePortal = bot->FindNearestCreature(NPC_BLUE_PORTAL, 150.0f); + Unit* greenPortal = bot->FindNearestCreature(NPC_GREEN_PORTAL, 150.0f); + + if (redPortal) { + float bx = boss->GetPositionX(), by = boss->GetPositionY(); + float px = redPortal->GetPositionX(), py = redPortal->GetPositionY(); + float dx = px - bx, dy = py - by; + float length = sqrt(dx*dx + dy*dy); + beams.push_back({redPortal, 0.0f, length}); + } + if (bluePortal) { + float bx = boss->GetPositionX(), by = boss->GetPositionY(); + float px = bluePortal->GetPositionX(), py = bluePortal->GetPositionY(); + float dx = px - bx, dy = py - by; + float length = sqrt(dx*dx + dy*dy); + beams.push_back({bluePortal, 0.0f, length}); + } + if (greenPortal) { + float bx = boss->GetPositionX(), by = boss->GetPositionY(); + float px = greenPortal->GetPositionX(), py = greenPortal->GetPositionY(); + float dx = px - bx, dy = py - by; + float length = sqrt(dx*dx + dy*dy); + beams.push_back({greenPortal, 0.0f, length}); + } + + bool nearBeam = false; + for (const auto& beam : beams) + { + float bx = boss->GetPositionX(), by = boss->GetPositionY(); + float px = beam.portal->GetPositionX(), py = beam.portal->GetPositionY(); + float dx = px - bx, dy = py - by; + float length = sqrt(dx*dx + dy*dy); + if (length == 0.0f) continue; + + dx /= length; dy /= length; + float botdx = bot->GetPositionX() - bx, botdy = bot->GetPositionY() - by; + float t = (botdx * dx + botdy * dy); + float beamX = bx + dx * t, beamY = by + dy * t; + float distToBeam = sqrt(pow(bot->GetPositionX() - beamX, 2) + pow(bot->GetPositionY() - beamY, 2)); + if (distToBeam < 5.0f && t > beam.minDist && t < beam.maxDist) + { + nearBeam = true; + break; + } + } + + if (!nearVoidZone && !nearBeam) + return false; + + const float minMoveDist = 3.0f, maxSearchDist = 20.0f, stepAngle = M_PI/18.0f, stepDist = 0.5f; + float bossZ = boss->GetPositionZ(); + Position bestCandidate; + float bestDist = 0.0f; + bool found = false; + for (float angle = 0; angle < 2 * M_PI; angle += stepAngle) + { + for (float dist = 5.0f; dist <= maxSearchDist; dist += stepDist) + { + float cx = bot->GetPositionX() + cos(angle) * dist; + float cy = bot->GetPositionY() + sin(angle) * dist; + float cz = bossZ; + if (std::any_of(voidZones.begin(), voidZones.end(), [&](Unit* vz){ return Position(cx, cy, cz).GetExactDist2d(vz) < 4.0f; })) + continue; + + bool tooCloseToBeam = false; + for (const auto& beam : beams) + { + float bx = boss->GetPositionX(), by = boss->GetPositionY(); + float px = beam.portal->GetPositionX(), py = beam.portal->GetPositionY(); + float dx = px - bx, dy = py - by; + float length = sqrt(dx*dx + dy*dy); + if (length == 0.0f) continue; + dx /= length; dy /= length; + float botdx = cx - bx, botdy = cy - by; + float t = (botdx * dx + botdy * dy); + float beamX = bx + dx * t, beamY = by + dy * t; + float distToBeam = sqrt(pow(cx - beamX, 2) + pow(cy - beamY, 2)); + if (distToBeam < 5.0f && t > beam.minDist && t < beam.maxDist) + { + tooCloseToBeam = true; + break; + } + } + if (tooCloseToBeam) continue; + + float moveDist = sqrt(pow(cx - bot->GetPositionX(), 2) + pow(cy - bot->GetPositionY(), 2)); + if (moveDist < minMoveDist) continue; + + if (!found || moveDist < bestDist) + { + bestCandidate = Position(cx, cy, cz); + bestDist = moveDist; + found = true; + } + } + } + if (found && karazhanHelper.IsSafePosition(bestCandidate.GetPositionX(), bestCandidate.GetPositionY(), bestCandidate.GetPositionZ(), + voidZones, 4.0f)) + { + return MoveTo(bot->GetMapId(), bestCandidate.GetPositionX(), bestCandidate.GetPositionY(), bestCandidate.GetPositionZ(), + false, false, false, true, MovementPriority::MOVEMENT_COMBAT); + } + return false; +} + +bool KarazhanNetherspiteAvoidBeamAndVoidZoneAction::isUseful() +{ + Unit* boss = AI_VALUE2(Unit*, "find target", "netherspite"); + if (!boss || boss->HasAura(SPELL_NETHERSPITE_BANISHED)) + return false; + + RaidKarazhanHelpers karazhanHelper(botAI); + auto [redBlocker, greenBlocker, blueBlocker] = karazhanHelper.GetCurrentBeamBlockers(); + if (bot == redBlocker || bot == blueBlocker || bot == greenBlocker) + return false; + + return true; +} + +bool KarazhanNetherspiteBanishPhaseAvoidVoidZoneAction::Execute(Event event) +{ + RaidKarazhanHelpers karazhanHelper(botAI); + std::vector voidZones = karazhanHelper.GetAllVoidZones(); + + for (Unit* vz : voidZones) + { + if (vz->GetEntry() == NPC_VOID_ZONE && bot->GetExactDist2d(vz) < 4.0f) + { + return FleePosition(vz->GetPosition(), 4.0f); + } + } + return false; +} + +bool KarazhanNetherspiteBanishPhaseAvoidVoidZoneAction::isUseful() +{ + Unit* boss = AI_VALUE2(Unit*, "find target", "netherspite"); + if (!boss || !boss->HasAura(SPELL_NETHERSPITE_BANISHED)) + return false; + + RaidKarazhanHelpers karazhanHelper(botAI); + std::vector voidZones = karazhanHelper.GetAllVoidZones(); + for (Unit* vz : voidZones) + { + if (bot->GetExactDist2d(vz) < 4.0f) + { + return true; + } + } + return false; +} + +bool KarazhanPrinceMalchezaarAvoidInfernalAction::Execute(Event event) +{ + Unit* boss = AI_VALUE2(Unit*, "find target", "prince malchezaar"); + if (!boss) + return false; + + RaidKarazhanHelpers karazhanHelper(botAI); + std::vector infernals = karazhanHelper.GetSpawnedInfernals(); + + const float safeInfernalDistance = 20.0f; + const float safeInfernalTankingDistance = 25.0f; + float safeDistance = botAI->IsTank(bot) && botAI->HasAggro(boss) && boss->GetVictim() == + bot ? safeInfernalTankingDistance : safeInfernalDistance; + + for (Unit* infernal : infernals) + { + float distance = bot->GetDistance2d(infernal); + if (distance < safeDistance) + { + bot->AttackStop(); + bot->InterruptNonMeleeSpells(false); + return MoveAway(infernal, safeDistance - distance); + } + } + return false; +} + +// For Enfeebled bots to avoid getting one-shot by Shadow Nova +bool KarazhanPrinceMalchezaarRunAwayFromShadowNovaAction::Execute(Event event) +{ + Unit* boss = AI_VALUE2(Unit*, "find target", "prince malchezaar"); + RaidKarazhanHelpers karazhanHelper(botAI); + std::vector infernals = karazhanHelper.GetSpawnedInfernals(); + + const float safeBossDistance = 30.0f; + const float safeInfernalDistance = 20.0f; + float currentBossDistance = bot->GetDistance2d(boss); + if (currentBossDistance < safeBossDistance) + { + const float stepSize = 2.0f; + const int numAngles = 16; + for (int i = 0; i < numAngles; ++i) + { + float angle = (2 * M_PI * i) / numAngles; + float dx = cos(angle); + float dy = sin(angle); + + bool pathIsSafe = true; + for (float dist = stepSize; dist <= safeBossDistance; dist += stepSize) + { + float x = bot->GetPositionX() + dx * dist; + float y = bot->GetPositionY() + dy * dist; + for (Unit* infernal : infernals) + { + float infernalDist = sqrt(pow(x - infernal->GetPositionX(), 2) + pow(y - infernal->GetPositionY(), 2)); + if (infernalDist < safeInfernalDistance) + { + pathIsSafe = false; + break; + } + } + if (!pathIsSafe) + break; + } + if (pathIsSafe) + { + float destX = bot->GetPositionX() + dx * (safeBossDistance - currentBossDistance); + float destY = bot->GetPositionY() + dy * (safeBossDistance - currentBossDistance); + float destZ = bot->GetPositionZ(); + bot->AttackStop(); + bot->InterruptNonMeleeSpells(false); + if (karazhanHelper.IsSafePosition(destX, destY, destZ, infernals, 20.0f)) + return MoveTo(bot->GetMapId(), destX, destY, destZ, false, false, false, true, MovementPriority::MOVEMENT_COMBAT); + } + } + } + return false; +} + +bool KarazhanPrinceMalchezaarRunAwayFromShadowNovaAction::isUseful() +{ + Unit* boss = AI_VALUE2(Unit*, "find target", "prince malchezaar"); + RaidKarazhanHelpers karazhanHelper(botAI); + std::vector infernals = karazhanHelper.GetSpawnedInfernals(); + if (infernals.empty()) + return false; + + return boss && bot->HasAura(SPELL_ENFEEBLE); +} diff --git a/src/strategy/raids/karazhan/RaidKarazhanActions.h b/src/strategy/raids/karazhan/RaidKarazhanActions.h new file mode 100644 index 0000000000..37d69b1420 --- /dev/null +++ b/src/strategy/raids/karazhan/RaidKarazhanActions.h @@ -0,0 +1,208 @@ +#ifndef _PLAYERBOT_RAIDKARAZHANACTIONS_H +#define _PLAYERBOT_RAIDKARAZHANACTIONS_H + +#include "AttackAction.h" +#include "RaidKarazhanHelpers.h" + +class KarazhanAttumenTheHuntsmanStackBehindAction : public AttackAction +{ +public: + KarazhanAttumenTheHuntsmanStackBehindAction(PlayerbotAI* botAI, std::string const name = "karazhan attumen the huntsman stack behind") : AttackAction(botAI, name) {} + + bool Execute(Event event) override; + bool isUseful() override; +}; + +class KarazhanMoroesMarkTargetAction : public AttackAction +{ +public: + KarazhanMoroesMarkTargetAction(PlayerbotAI* botAI, std::string const name = "karazhan moroes mark target") : AttackAction(botAI, name) {} + + bool Execute(Event event) override; +}; + +class KarazhanMaidenOfVirtuePositionBossAction : public AttackAction +{ +public: + KarazhanMaidenOfVirtuePositionBossAction(PlayerbotAI* botAI, std::string const name = "karazhan maiden of virtue position boss") : AttackAction(botAI, name) {} + + bool Execute(Event event) override; + bool isUseful() override; +}; + +class KarazhanMaidenOfVirtuePositionRangedAction : public AttackAction +{ +public: + KarazhanMaidenOfVirtuePositionRangedAction(PlayerbotAI* botAI, std::string const name = "karazhan maiden of virtue position ranged") : AttackAction(botAI, name) {} + + bool Execute(Event event) override; + bool isUseful() override; +}; + +class KarazhanBigBadWolfRunAwayAction : public AttackAction +{ +public: + KarazhanBigBadWolfRunAwayAction(PlayerbotAI* botAI, std::string const name = "karazhan big bad wolf run away") : AttackAction(botAI, name) {} + + bool Execute(Event event) override; + bool isUseful() override; + +private: + size_t currentIndex = 0; +}; + +class KarazhanRomuloAndJulianneMarkTargetAction : public AttackAction +{ +public: + KarazhanRomuloAndJulianneMarkTargetAction(PlayerbotAI* botAI, std::string const name = "karazhan romulo and julianne mark target") : AttackAction(botAI, name) {} + + bool Execute(Event event) override; +}; + +class KarazhanWizardOfOzMarkTargetAction : public AttackAction +{ +public: + KarazhanWizardOfOzMarkTargetAction(PlayerbotAI* botAI, std::string const name = "karazhan wizard of oz mark target") : AttackAction(botAI, name) {} + + bool Execute(Event event) override; +}; + +class KarazhanWizardOfOzScorchStrawmanAction : public AttackAction +{ +public: + KarazhanWizardOfOzScorchStrawmanAction(PlayerbotAI* botAI, std::string const name = "karazhan wizard of oz scorch strawman") : AttackAction(botAI, name) {} + + bool Execute(Event event) override; +}; + +class KarazhanTheCuratorMarkTargetAction : public AttackAction +{ +public: + KarazhanTheCuratorMarkTargetAction(PlayerbotAI* botAI, std::string const name = "karazhan the curator mark target") : AttackAction(botAI, name) {} + + bool Execute(Event event) override; +}; + +class KarazhanTheCuratorPositionBossAction : public AttackAction +{ +public: + KarazhanTheCuratorPositionBossAction(PlayerbotAI* botAI, std::string const name = "karazhan the curator position boss") : AttackAction(botAI, name) {} + + bool Execute(Event event) override; + bool isUseful() override; +}; + +class KarazhanTheCuratorSpreadRangedAction : public AttackAction +{ +public: + KarazhanTheCuratorSpreadRangedAction(PlayerbotAI* botAI, std::string const name = "karazhan the curator spread ranged") : AttackAction(botAI, name) {} + + bool Execute(Event event) override; + bool isUseful() override; +}; + +class KarazhanTerestianIllhoofMarkTargetAction : public AttackAction +{ +public: + KarazhanTerestianIllhoofMarkTargetAction(PlayerbotAI* botAI, std::string const name = "karazhan terestian illhoof mark target") : AttackAction(botAI, name) {} + + bool Execute(Event event) override; +}; + +class KarazhanShadeOfAranArcaneExplosionRunAwayAction : public AttackAction +{ +public: + KarazhanShadeOfAranArcaneExplosionRunAwayAction(PlayerbotAI* botAI, std::string const name = "karazhan shade of aran arcane explosion run away") : AttackAction(botAI, name) {} + + bool Execute(Event event) override; + bool isUseful() override; +}; + +class KarazhanShadeOfAranFlameWreathStopBotAction : public AttackAction +{ +public: + KarazhanShadeOfAranFlameWreathStopBotAction(PlayerbotAI* botAI, std::string const name = "karazhan shade of aran flame wreath stop bot") : AttackAction(botAI, name) {} + + bool Execute(Event event) override; +}; + +class KarazhanShadeOfAranMarkConjuredElementalAction : public AttackAction +{ +public: + KarazhanShadeOfAranMarkConjuredElementalAction(PlayerbotAI* botAI, std::string const name = "karazhan shade of aran mark conjured elemental") : AttackAction(botAI, name) {} + + bool Execute(Event event) override; +}; + +class KarazhanShadeOfAranSpreadRangedAction : public AttackAction +{ +public: + KarazhanShadeOfAranSpreadRangedAction(PlayerbotAI* botAI, std::string const name = "karazhan shade of aran spread ranged") : AttackAction(botAI, name) {} + + bool Execute(Event event) override; + bool isUseful() override; +}; + +class KarazhanNetherspiteBlockRedBeamAction : public AttackAction +{ +public: + KarazhanNetherspiteBlockRedBeamAction(PlayerbotAI* botAI, std::string const name = "karazhan netherspite block red beam") : AttackAction(botAI, name) {} + + bool Execute(Event event) override; + bool isUseful() override; +}; + +class KarazhanNetherspiteBlockBlueBeamAction : public AttackAction +{ +public: + KarazhanNetherspiteBlockBlueBeamAction(PlayerbotAI* botAI, std::string const name = "karazhan netherspite block blue beam") : AttackAction(botAI, name) {} + + bool Execute(Event event) override; + bool isUseful() override; +}; + +class KarazhanNetherspiteBlockGreenBeamAction : public AttackAction +{ +public: + KarazhanNetherspiteBlockGreenBeamAction(PlayerbotAI* botAI, std::string const name = "karazhan netherspite block green beam") : AttackAction(botAI, name) {} + + bool Execute(Event event) override; + bool isUseful() override; +}; + +class KarazhanNetherspiteAvoidBeamAndVoidZoneAction : public AttackAction +{ +public: + KarazhanNetherspiteAvoidBeamAndVoidZoneAction(PlayerbotAI* botAI, std::string const name = "karazhan netherspite avoid beam and void zone") : AttackAction(botAI, name) {} + + bool Execute(Event event) override; + bool isUseful() override; +}; + +class KarazhanNetherspiteBanishPhaseAvoidVoidZoneAction : public AttackAction +{ +public: + KarazhanNetherspiteBanishPhaseAvoidVoidZoneAction(PlayerbotAI* botAI, std::string const name = "karazhan netherspite banish phase avoid void zone") : AttackAction(botAI, name) {} + + bool Execute(Event event) override; + bool isUseful() override; +}; + +class KarazhanPrinceMalchezaarAvoidInfernalAction : public AttackAction +{ +public: + KarazhanPrinceMalchezaarAvoidInfernalAction(PlayerbotAI* botAI, std::string const name = "karazhan prince malchezaar avoid infernal") : AttackAction(botAI, name) {} + + bool Execute(Event event) override; +}; + +class KarazhanPrinceMalchezaarRunAwayFromShadowNovaAction : public AttackAction +{ +public: + KarazhanPrinceMalchezaarRunAwayFromShadowNovaAction(PlayerbotAI* botAI, std::string const name = "karazhan prince malchezaar run away from shadow nova") : AttackAction(botAI, name) {} + + bool Execute(Event event) override; + bool isUseful() override; +}; + +#endif diff --git a/src/strategy/raids/karazhan/RaidKarazhanHelpers.cpp b/src/strategy/raids/karazhan/RaidKarazhanHelpers.cpp new file mode 100644 index 0000000000..3a1360cc21 --- /dev/null +++ b/src/strategy/raids/karazhan/RaidKarazhanHelpers.cpp @@ -0,0 +1,262 @@ +#include "RaidKarazhanActions.h" +#include "RaidKarazhanHelpers.h" +#include "PlayerbotMgr.h" +#include "AiObjectContext.h" +#include "Position.h" +#include "Spell.h" + +#include +#include + +void RaidKarazhanHelpers::MarkTargetWithSkull(Unit* target) +{ + if (!target) + return; + + if (Group* group = bot->GetGroup()) + { + constexpr uint8_t skullIconId = 7; + ObjectGuid skullGuid = group->GetTargetIcon(skullIconId); + + if (skullGuid != target->GetGUID()) + group->SetTargetIcon(skullIconId, bot->GetGUID(), target->GetGUID()); + } +} + +Unit* RaidKarazhanHelpers::GetFirstAliveUnit(const std::vector& units) +{ + for (Unit* unit : units) + if (unit && unit->IsAlive()) + return unit; + + return nullptr; +} + +Unit* RaidKarazhanHelpers::GetFirstAliveUnitByEntry(uint32 entry) +{ + const GuidVector npcs = AI_VALUE(GuidVector, "nearest hostile npcs"); + + for (const auto& npcGuid : npcs) + { + Unit* unit = botAI->GetUnit(npcGuid); + + if (unit && unit->IsAlive() && unit->GetEntry() == entry) + return unit; + } + return nullptr; +} + +Unit* RaidKarazhanHelpers::GetNearestPlayerInRadius(float radius) +{ + if (Group* group = bot->GetGroup()) + { + for (GroupReference* itr = group->GetFirstMember(); itr != nullptr; itr = itr->next()) + { + Player* member = itr->GetSource(); + + if (!member || !member->IsAlive() || member == bot) + continue; + + if (bot->GetExactDist2d(member) < radius) + return member; + } + } + return nullptr; +} + +bool RaidKarazhanHelpers::IsFlameWreathActive() +{ + Unit* boss = AI_VALUE2(Unit*, "find target", "shade of aran"); + if (!boss) + return false; + + Spell* currentSpell = boss->GetCurrentSpell(CURRENT_GENERIC_SPELL); + if (currentSpell && currentSpell->m_spellInfo && currentSpell->m_spellInfo->Id == SPELL_FLAME_WREATH_CAST) + { + bot->Yell("I will not move when Flame Wreath is cast or the raid blows up.", LANG_UNIVERSAL); + return true; + } + + if (Group* group = bot->GetGroup()) + { + for (GroupReference* itr = group->GetFirstMember(); itr != nullptr; itr = itr->next()) + { + Player* member = itr->GetSource(); + if (!member || !member->IsAlive()) + continue; + if (member->HasAura(SPELL_FLAME_WREATH_AURA)) + return true; + } + } + return false; +} + +// Blue beam blockers: non-Rogue/Warrior DPS, no Nether Exhaustion Blue and <25 stacks of Blue Beam debuff +std::vector RaidKarazhanHelpers::GetBlueBlockers() +{ + std::vector blueBlockers; + if (Group* group = bot->GetGroup()) + { + for (GroupReference* itr = group->GetFirstMember(); itr != nullptr; itr = itr->next()) + { + Player* member = itr->GetSource(); + if (!member || !member->IsAlive() || !GET_PLAYERBOT_AI(member)) + continue; + + bool isDps = botAI->IsDps(member); + bool isWarrior = member->getClass() == CLASS_WARRIOR; + bool isRogue = member->getClass() == CLASS_ROGUE; + bool hasExhaustion = member->HasAura(SPELL_NETHER_EXHAUSTION_BLUE); + Aura* blueBuff = member->GetAura(SPELL_BLUE_BEAM_DEBUFF); + bool overStack = blueBuff && blueBuff->GetStackAmount() >= 25; + + if (isDps && !isWarrior && !isRogue && !hasExhaustion && !overStack) + { + blueBlockers.push_back(member); + } + } + } + return blueBlockers; +} + +// Green beam blockers: +// (1) Rogues and non-tank Warriors, no Nether Exhaustion Green +// (2) Healers, no Nether Exhaustion Green and <25 stacks of Green Beam debuff +std::vector RaidKarazhanHelpers::GetGreenBlockers() +{ + std::vector greenBlockers; + if (Group* group = bot->GetGroup()) + { + for (GroupReference* itr = group->GetFirstMember(); itr != nullptr; itr = itr->next()) + { + Player* member = itr->GetSource(); + if (!member || !member->IsAlive() || !GET_PLAYERBOT_AI(member)) + continue; + + bool hasExhaustion = member->HasAura(SPELL_NETHER_EXHAUSTION_GREEN); + Aura* greenBuff = member->GetAura(SPELL_GREEN_BEAM_DEBUFF); + bool overStack = greenBuff && greenBuff->GetStackAmount() >= 25; + bool isRogue = member->getClass() == CLASS_ROGUE; + bool isDpsWarrior = member->getClass() == CLASS_WARRIOR && botAI->IsDps(member); + bool eligibleRogueWarrior = (isRogue || isDpsWarrior) && !hasExhaustion; + bool isHealer = botAI->IsHeal(member); + bool eligibleHealer = isHealer && !hasExhaustion && !overStack; + + if (eligibleRogueWarrior || eligibleHealer) + { + greenBlockers.push_back(member); + } + } + } + return greenBlockers; +} + +Position RaidKarazhanHelpers::GetPositionOnBeam(Unit* boss, Unit* portal, float distanceFromBoss) +{ + float bx = boss->GetPositionX(); + float by = boss->GetPositionY(); + float bz = boss->GetPositionZ(); + float px = portal->GetPositionX(); + float py = portal->GetPositionY(); + + float dx = px - bx; + float dy = py - by; + float length = sqrt(dx*dx + dy*dy); + + if (length == 0.0f) + return Position(bx, by, bz); + + dx /= length; + dy /= length; + + float targetX = bx + dx * distanceFromBoss; + float targetY = by + dy * distanceFromBoss; + float targetZ = bz; + + return Position(targetX, targetY, targetZ); +} + +std::tuple RaidKarazhanHelpers::GetCurrentBeamBlockers() +{ + Player* redBlocker = nullptr; + Player* greenBlocker = nullptr; + Player* blueBlocker = nullptr; + std::vector redBlockers; + + if (Group* group = bot->GetGroup()) + { + for (GroupReference* itr = group->GetFirstMember(); itr != nullptr; itr = itr->next()) + { + Player* member = itr->GetSource(); + if (!member || !member->IsAlive()) + continue; + PlayerbotAI* memberAI = sPlayerbotsMgr->GetPlayerbotAI(member); + if (!memberAI || !memberAI->IsTank(member)) + continue; + if (member->HasAura(SPELL_NETHER_EXHAUSTION_RED)) + continue; + redBlockers.push_back(member); + } + } + + if (!redBlockers.empty()) + redBlocker = redBlockers.front(); + + std::vector greenBlockers = GetGreenBlockers(); + if (!greenBlockers.empty()) + greenBlocker = greenBlockers.front(); + + std::vector blueBlockers = GetBlueBlockers(); + if (!blueBlockers.empty()) + blueBlocker = blueBlockers.front(); + + return std::make_tuple(redBlocker, greenBlocker, blueBlocker); +} + +std::vector RaidKarazhanHelpers::GetAllVoidZones() +{ + std::vector voidZones; + const float radius = 15.0f; + const GuidVector npcs = botAI->GetAiObjectContext()->GetValue("nearest hostile npcs")->Get(); + for (const auto& npcGuid : npcs) + { + Unit* unit = botAI->GetUnit(npcGuid); + if (!unit || unit->GetEntry() != NPC_VOID_ZONE) + continue; + + float dist = bot->GetExactDist2d(unit); + if (dist < radius) + { + voidZones.push_back(unit); + } + } + return voidZones; +} + +bool RaidKarazhanHelpers::IsSafePosition(float x, float y, float z, + const std::vector& hazards, float hazardRadius) +{ + for (Unit* hazard : hazards) + { + float dist = std::sqrt(std::pow(x - hazard->GetPositionX(), 2) + std::pow(y - hazard->GetPositionY(), 2)); + + if (dist < hazardRadius) + return false; + } + return true; +} + +std::vector RaidKarazhanHelpers::GetSpawnedInfernals() const +{ + std::vector infernals; + const GuidVector npcs = botAI->GetAiObjectContext()->GetValue("nearest hostile npcs")->Get(); + + for (const auto& npcGuid : npcs) + { + Unit* unit = botAI->GetUnit(npcGuid); + + if (unit && unit->GetEntry() == NPC_NETHERSPITE_INFERNAL) + infernals.push_back(unit); + } + return infernals; +} diff --git a/src/strategy/raids/karazhan/RaidKarazhanHelpers.h b/src/strategy/raids/karazhan/RaidKarazhanHelpers.h new file mode 100644 index 0000000000..bb218f45a6 --- /dev/null +++ b/src/strategy/raids/karazhan/RaidKarazhanHelpers.h @@ -0,0 +1,105 @@ +#ifndef _PLAYERBOT_RAIDKARAZHANHELPERS_H_ +#define _PLAYERBOT_RAIDKARAZHANHELPERS_H_ + +#include "AiObject.h" +#include "Playerbots.h" +#include "MovementActions.h" + +enum KarazhanSpells +{ + // Maiden of Virtue + SPELL_REPENTANCE = 29511, + + // Opera Event + SPELL_LITTLE_RED_RIDING_HOOD = 30756, + SPELL_FEAR = 6215, // Rank 3 + + // Shade of Aran + SPELL_FLAME_WREATH_CAST = 30004, + SPELL_FLAME_WREATH_AURA = 29946, + SPELL_ARCANE_EXPLOSION = 29973, + SPELL_WARLOCK_BANISH = 18647, // Rank 2 + + // Netherspite + SPELL_GREEN_BEAM_DEBUFF = 30422, + SPELL_BLUE_BEAM_DEBUFF = 30423, + SPELL_NETHER_EXHAUSTION_RED = 38637, + SPELL_NETHER_EXHAUSTION_GREEN = 38638, + SPELL_NETHER_EXHAUSTION_BLUE = 38639, + SPELL_NETHERSPITE_BANISHED = 39833, + + // Prince Malchezaar + SPELL_ENFEEBLE = 30843, + + // Nightbane + SPELL_CHARRED_EARTH = 30129 +}; + +enum KarazhanNpcs +{ + // Attumen the Huntsman + NPC_ATTUMEN_THE_HUNTSMAN = 16152, // Mounted ID + + // Terestian Illhoof + NPC_KILREK = 17229, + NPC_DEMON_CHAINS = 17248, + + // Shade of Aran + NPC_CONJURED_ELEMENTAL = 17167, + + // Netherspite + NPC_VOID_ZONE = 16697, + NPC_RED_PORTAL = 17369, + NPC_BLUE_PORTAL = 17368, + NPC_GREEN_PORTAL = 17367, + + // Prince Malchezaar + NPC_NETHERSPITE_INFERNAL = 17646, + + // Nightbane + NPC_RESTLESS_SKELETON = 17261, +}; + +const Position KARAZHAN_MAIDEN_OF_VIRTUE_BOSS_POSITION = Position(-10945.881f, -2103.7817f, 92.71163f); +const Position KARAZHAN_MAIDEN_OF_VIRTUE_RANGED_POSITION[8] = +{ + { -10931.178f, -2116.58f, 92.1787f }, + { -10925.828f, -2102.425f, 92.18016f }, + { -10933.089f, -2088.5017f, 92.18028f }, + { -10947.59f, -2082.8147f, 92.18024f }, + { -10960.912f, -2090.4368f, 92.17964f }, + { -10966.017f, -2105.288f, 92.17582f }, + { -10959.242f, -2119.6172f, 92.18062f }, + { -10944.495f, -2123.857f, 92.18021f }, +}; + +const Position KARAZHAN_BIG_BAD_WOLF_RUN_POSITION[4] = { + { -10913.391f, -1773.5083f, 90.47706f }, + { -10875.456f, -1779.0358f, 90.47706f }, + { -10872.281f, -1751.6376f, 90.47716f }, + { -10910.492f, -1747.401f, 90.477165f }, +}; + +const Position KARAZHAN_THE_CURATOR_BOSS_POSITION = Position(-11139.463f, -1884.6451f, 165.76564f); + +class RaidKarazhanHelpers : public AiObject +{ +public: + explicit RaidKarazhanHelpers(PlayerbotAI* botAI) : AiObject(botAI) {} + + void MarkTargetWithSkull(Unit* /*target*/); + Unit* GetFirstAliveUnit(const std::vector& /*units*/); + Unit* GetFirstAliveUnitByEntry(uint32 /*entry*/); + Unit* GetNearestPlayerInRadius(float /*radius*/ = 5.0f); + bool IsFlameWreathActive(); + Position GetPositionOnBeam(Unit* boss, Unit* portal, float distanceFromBoss); + std::vector GetBlueBlockers(); + std::vector GetGreenBlockers(); + std::tuple GetCurrentBeamBlockers(); + std::vector GetAllVoidZones(); + bool IsSafePosition (float x, float y, float z, + const std::vector& hazards, float hazardRadius); + std::vector GetSpawnedInfernals() const; +}; + +#endif diff --git a/src/strategy/raids/karazhan/RaidKarazhanStrategy.cpp b/src/strategy/raids/karazhan/RaidKarazhanStrategy.cpp new file mode 100644 index 0000000000..795446879b --- /dev/null +++ b/src/strategy/raids/karazhan/RaidKarazhanStrategy.cpp @@ -0,0 +1,76 @@ +#include "RaidKarazhanStrategy.h" + +void RaidKarazhanStrategy::InitTriggers(std::vector& triggers) +{ + triggers.push_back(new TriggerNode( + "karazhan attumen the huntsman", NextAction::array(0, + new NextAction("karazhan attumen the huntsman stack behind", ACTION_RAID + 1), + nullptr))); + + triggers.push_back(new TriggerNode( + "karazhan moroes", NextAction::array(0, + new NextAction("karazhan moroes mark target", ACTION_RAID + 1), + nullptr))); + + triggers.push_back(new TriggerNode( + "karazhan maiden of virtue", NextAction::array(0, + new NextAction("karazhan maiden of virtue position ranged", ACTION_RAID + 1), + new NextAction("karazhan maiden of virtue position boss", ACTION_RAID + 1), + nullptr))); + + triggers.push_back(new TriggerNode( + "karazhan big bad wolf", NextAction::array(0, + new NextAction("karazhan big bad wolf run away", ACTION_EMERGENCY + 6), + nullptr))); + + triggers.push_back(new TriggerNode( + "karazhan romulo and julianne", NextAction::array(0, + new NextAction("karazhan romulo and julianne mark target", ACTION_RAID + 1), + nullptr))); + + triggers.push_back(new TriggerNode( + "karazhan wizard of oz", NextAction::array(0, + new NextAction("karazhan wizard of oz scorch strawman", ACTION_RAID + 2), + new NextAction("karazhan wizard of oz mark target", ACTION_RAID + 1), + nullptr))); + + triggers.push_back(new TriggerNode( + "karazhan the curator", NextAction::array(0, + new NextAction("karazhan the curator spread ranged", ACTION_RAID + 2), + new NextAction("karazhan the curator position boss", ACTION_RAID + 2), + new NextAction("karazhan the curator mark target", ACTION_RAID + 1), + nullptr))); + + triggers.push_back(new TriggerNode( + "karazhan terestian illhoof", NextAction::array(0, + new NextAction("karazhan terestian illhoof mark target", ACTION_RAID + 1), + nullptr))); + + triggers.push_back(new TriggerNode( + "karazhan shade of aran", NextAction::array(0, + new NextAction("karazhan shade of aran flame wreath stop bot", ACTION_EMERGENCY + 7), + new NextAction("karazhan shade of aran arcane explosion run away", ACTION_EMERGENCY + 6), + new NextAction("karazhan shade of aran spread ranged", ACTION_RAID + 2), + new NextAction("karazhan shade of aran mark conjured elemental", ACTION_RAID + 1), + nullptr))); + + triggers.push_back(new TriggerNode( + "karazhan netherspite", NextAction::array(0, + new NextAction("karazhan netherspite block red beam", ACTION_EMERGENCY + 8), + new NextAction("karazhan netherspite block blue beam", ACTION_EMERGENCY + 8), + new NextAction("karazhan netherspite block green beam", ACTION_EMERGENCY + 8), + new NextAction("karazhan netherspite avoid beam and void zone", ACTION_EMERGENCY + 7), + new NextAction("karazhan netherspite banish phase avoid void zone", ACTION_RAID + 1), + nullptr))); + + triggers.push_back(new TriggerNode( + "karazhan prince malchezaar", NextAction::array(0, + new NextAction("karazhan prince malchezaar run away from shadow nova", ACTION_EMERGENCY + 6), + new NextAction("karazhan prince malchezaar avoid infernal", ACTION_RAID + 1), + nullptr))); +} + +void RaidKarazhanStrategy::InitMultipliers(std::vector& /*multipliers*/) +{ + // No multipliers for this strategy +} diff --git a/src/strategy/raids/karazhan/RaidKarazhanStrategy.h b/src/strategy/raids/karazhan/RaidKarazhanStrategy.h new file mode 100644 index 0000000000..070259b483 --- /dev/null +++ b/src/strategy/raids/karazhan/RaidKarazhanStrategy.h @@ -0,0 +1,17 @@ +#ifndef _PLAYERBOT_RAIDKARAZHANSTRATEGY_H_ +#define _PLAYERBOT_RAIDKARAZHANSTRATEGY_H_ + +#include "Strategy.h" + +class RaidKarazhanStrategy : public Strategy +{ +public: + RaidKarazhanStrategy(PlayerbotAI* ai) : Strategy(ai) {} + + std::string const getName() override { return "karazhan"; } + + void InitTriggers(std::vector& /*triggers*/) override; + void InitMultipliers(std::vector& /*multipliers*/) override; +}; + +#endif diff --git a/src/strategy/raids/karazhan/RaidKarazhanTriggerContext.h b/src/strategy/raids/karazhan/RaidKarazhanTriggerContext.h new file mode 100644 index 0000000000..4451212c8b --- /dev/null +++ b/src/strategy/raids/karazhan/RaidKarazhanTriggerContext.h @@ -0,0 +1,39 @@ +#ifndef _PLAYERBOT_RAIDKARAZHANTRIGGERCONTEXT_H +#define _PLAYERBOT_RAIDKARAZHANTRIGGERCONTEXT_H + +#include "AiObjectContext.h" +#include "RaidKarazhanTriggers.h" + +class RaidKarazhanTriggerContext : public NamedObjectContext +{ +public: + RaidKarazhanTriggerContext() + { + creators["karazhan attumen the huntsman"] = &RaidKarazhanTriggerContext::karazhan_attumen_the_huntsman; + creators["karazhan moroes"] = &RaidKarazhanTriggerContext::karazhan_moroes; + creators["karazhan maiden of virtue"] = &RaidKarazhanTriggerContext::karazhan_maiden_of_virtue; + creators["karazhan big bad wolf"] = &RaidKarazhanTriggerContext::karazhan_big_bad_wolf; + creators["karazhan romulo and julianne"] = &RaidKarazhanTriggerContext::karazhan_romulo_and_julianne; + creators["karazhan wizard of oz"] = &RaidKarazhanTriggerContext::karazhan_wizard_of_oz; + creators["karazhan the curator"] = &RaidKarazhanTriggerContext::karazhan_the_curator; + creators["karazhan terestian illhoof"] = &RaidKarazhanTriggerContext::karazhan_terestian_illhoof; + creators["karazhan shade of aran"] = &RaidKarazhanTriggerContext::karazhan_shade_of_aran; + creators["karazhan netherspite"] = &RaidKarazhanTriggerContext::karazhan_netherspite; + creators["karazhan prince malchezaar"] = &RaidKarazhanTriggerContext::karazhan_prince_malchezaar; + } + +private: + static Trigger* karazhan_attumen_the_huntsman(PlayerbotAI* botAI) { return new KarazhanAttumenTheHuntsmanTrigger(botAI); } + static Trigger* karazhan_moroes(PlayerbotAI* botAI) { return new KarazhanMoroesTrigger(botAI); } + static Trigger* karazhan_maiden_of_virtue(PlayerbotAI* botAI) { return new KarazhanMaidenOfVirtueTrigger(botAI); } + static Trigger* karazhan_big_bad_wolf(PlayerbotAI* botAI) { return new KarazhanBigBadWolfTrigger(botAI); } + static Trigger* karazhan_romulo_and_julianne(PlayerbotAI* botAI) { return new KarazhanRomuloAndJulianneTrigger(botAI); } + static Trigger* karazhan_wizard_of_oz(PlayerbotAI* botAI) { return new KarazhanWizardOfOzTrigger(botAI); } + static Trigger* karazhan_the_curator(PlayerbotAI* botAI) { return new KarazhanTheCuratorTrigger(botAI); } + static Trigger* karazhan_terestian_illhoof(PlayerbotAI* botAI) { return new KarazhanTerestianIllhoofTrigger(botAI); } + static Trigger* karazhan_shade_of_aran(PlayerbotAI* botAI) { return new KarazhanShadeOfAranTrigger(botAI); } + static Trigger* karazhan_netherspite(PlayerbotAI* botAI) { return new KarazhanNetherspiteTrigger(botAI); } + static Trigger* karazhan_prince_malchezaar(PlayerbotAI* botAI) { return new KarazhanPrinceMalchezaarTrigger(botAI); } +}; + +#endif diff --git a/src/strategy/raids/karazhan/RaidKarazhanTriggers.cpp b/src/strategy/raids/karazhan/RaidKarazhanTriggers.cpp new file mode 100644 index 0000000000..206ae53134 --- /dev/null +++ b/src/strategy/raids/karazhan/RaidKarazhanTriggers.cpp @@ -0,0 +1,134 @@ +#include "Playerbots.h" +#include "RaidKarazhanTriggers.h" +#include "RaidKarazhanHelpers.h" +#include "RaidKarazhanActions.h" + +bool KarazhanAttumenTheHuntsmanTrigger::IsActive() +{ + RaidKarazhanHelpers helpers(botAI); + Unit* boss = helpers.GetFirstAliveUnitByEntry(NPC_ATTUMEN_THE_HUNTSMAN); + return boss != nullptr; +} + +bool KarazhanMoroesTrigger::IsActive() +{ + Unit* moroes = AI_VALUE2(Unit*, "find target", "moroes"); + Unit* dorothea = AI_VALUE2(Unit*, "find target", "baroness dorothea millstipe"); + Unit* catriona = AI_VALUE2(Unit*, "find target", "lady catriona von'indi"); + Unit* keira = AI_VALUE2(Unit*, "find target", "lady keira berrybuck"); + Unit* rafe = AI_VALUE2(Unit*, "find target", "baron rafe dreuger"); + Unit* robin = AI_VALUE2(Unit*, "find target", "lord robin daris"); + Unit* crispin = AI_VALUE2(Unit*, "find target", "lord crispin ference"); + + if ((!moroes || !moroes->IsAlive()) && + (!dorothea || !dorothea->IsAlive()) && + (!catriona || !catriona->IsAlive()) && + (!keira || !keira->IsAlive()) && + (!rafe || !rafe->IsAlive()) && + (!robin || !robin->IsAlive()) && + (!crispin || !crispin->IsAlive())) + return false; + + return true; +} + +bool KarazhanMaidenOfVirtueTrigger::IsActive() +{ + Unit* boss = AI_VALUE2(Unit*, "find target", "maiden of virtue"); + + if (!boss || !boss->IsAlive()) + return false; + + return true; +} + +bool KarazhanBigBadWolfTrigger::IsActive() +{ + Unit* boss = AI_VALUE2(Unit*, "find target", "the big bad wolf"); + + if (!boss || !boss->IsAlive()) + return false; + + return true; +} + +bool KarazhanRomuloAndJulianneTrigger::IsActive() +{ + Unit* julianne = AI_VALUE2(Unit*, "find target", "julianne"); + Unit* romulo = AI_VALUE2(Unit*, "find target", "romulo"); + + if (!julianne || !julianne->IsAlive() || !romulo || !romulo->IsAlive()) + return false; + + return true; +} + +bool KarazhanWizardOfOzTrigger::IsActive() +{ + Unit* dorothee = AI_VALUE2(Unit*, "find target", "dorothee"); + Unit* tito = AI_VALUE2(Unit*, "find target", "tito"); + Unit* roar = AI_VALUE2(Unit*, "find target", "roar"); + Unit* strawman = AI_VALUE2(Unit*, "find target", "strawman"); + Unit* tinhead = AI_VALUE2(Unit*, "find target", "tinhead"); + Unit* crone = AI_VALUE2(Unit*, "find target", "the crone"); + + if (( !dorothee || !dorothee->IsAlive() ) && + ( !tito || !tito->IsAlive() ) && + ( !roar || !roar->IsAlive() ) && + ( !strawman || !strawman->IsAlive() ) && + ( !tinhead || !tinhead->IsAlive() ) && + ( !crone || !crone->IsAlive() )) + return false; + + return true; +} + +bool KarazhanTheCuratorTrigger::IsActive() +{ + Unit* boss = AI_VALUE2(Unit*, "find target", "the curator"); + + if (!boss || !boss->IsAlive()) + return false; + + return true; +} + +bool KarazhanTerestianIllhoofTrigger::IsActive() +{ + Unit* boss = AI_VALUE2(Unit*, "find target", "terestian illhoof"); + + if (!boss || !boss->IsAlive()) + return false; + + return true; +} + +bool KarazhanShadeOfAranTrigger::IsActive() +{ + Unit* boss = AI_VALUE2(Unit*, "find target", "shade of aran"); + + if (!boss) + return false; + + return true; +} + +bool KarazhanNetherspiteTrigger::IsActive() +{ + Unit* boss = AI_VALUE2(Unit*, "find target", "netherspite"); + + if (!boss || !boss->IsAlive()) + return false; + + return true; +} + +bool KarazhanPrinceMalchezaarTrigger::IsActive() +{ + Unit* boss = AI_VALUE2(Unit*, "find target", "prince malchezaar"); + + if (!boss || !boss->IsAlive()) + return false; + + return true; +} diff --git a/src/strategy/raids/karazhan/RaidKarazhanTriggers.h b/src/strategy/raids/karazhan/RaidKarazhanTriggers.h new file mode 100644 index 0000000000..69f441525b --- /dev/null +++ b/src/strategy/raids/karazhan/RaidKarazhanTriggers.h @@ -0,0 +1,83 @@ +#ifndef _PLAYERBOT_RAIDKARAZHANTRIGGERS_H +#define _PLAYERBOT_RAIDKARAZHANTRIGGERS_H + +#include "Trigger.h" + +class KarazhanAttumenTheHuntsmanTrigger : public Trigger +{ +public: + KarazhanAttumenTheHuntsmanTrigger(PlayerbotAI* botAI) : Trigger(botAI, "karazhan attumen the huntsman") {} + bool IsActive() override; +}; + +class KarazhanMoroesTrigger : public Trigger +{ +public: + KarazhanMoroesTrigger(PlayerbotAI* botAI) : Trigger(botAI, "karazhan moroes") {} + bool IsActive() override; +}; + +class KarazhanMaidenOfVirtueTrigger : public Trigger +{ +public: + KarazhanMaidenOfVirtueTrigger(PlayerbotAI* botAI) : Trigger(botAI, "karazhan maiden of virtue") {} + bool IsActive() override; +}; + +class KarazhanBigBadWolfTrigger : public Trigger +{ +public: + KarazhanBigBadWolfTrigger(PlayerbotAI* botAI) : Trigger(botAI, "karazhan big bad wolf") {} + bool IsActive() override; +}; + +class KarazhanRomuloAndJulianneTrigger : public Trigger +{ +public: + KarazhanRomuloAndJulianneTrigger(PlayerbotAI* botAI) : Trigger(botAI, "karazhan romulo and julianne") {} + bool IsActive() override; +}; + +class KarazhanWizardOfOzTrigger : public Trigger +{ +public: + KarazhanWizardOfOzTrigger(PlayerbotAI* botAI) : Trigger(botAI, "karazhan wizard of oz") {} + bool IsActive() override; +}; + +class KarazhanTheCuratorTrigger : public Trigger +{ +public: + KarazhanTheCuratorTrigger(PlayerbotAI* botAI) : Trigger(botAI, "karazhan the curator") {} + bool IsActive() override; +}; + +class KarazhanTerestianIllhoofTrigger : public Trigger +{ +public: + KarazhanTerestianIllhoofTrigger(PlayerbotAI* botAI) : Trigger(botAI, "karazhan terestian illhoof") {} + bool IsActive() override; +}; + +class KarazhanShadeOfAranTrigger : public Trigger +{ +public: + KarazhanShadeOfAranTrigger(PlayerbotAI* botAI) : Trigger(botAI, "karazhan shade of aran") {} + bool IsActive() override; +}; + +class KarazhanNetherspiteTrigger : public Trigger +{ +public: + KarazhanNetherspiteTrigger(PlayerbotAI* botAI) : Trigger(botAI, "karazhan netherspite") {} + bool IsActive() override; +}; + +class KarazhanPrinceMalchezaarTrigger : public Trigger +{ +public: + KarazhanPrinceMalchezaarTrigger(PlayerbotAI* botAI) : Trigger(botAI, "karazhan prince malchezaar") {} + bool IsActive() override; +}; + +#endif From fe9791e1ec180a0492b92f65a3626f0f225b628e Mon Sep 17 00:00:00 2001 From: crow Date: Tue, 9 Sep 2025 22:45:20 -0500 Subject: [PATCH 007/151] Revert edit not intended for PR --- src/factory/PlayerbotFactory.cpp | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/factory/PlayerbotFactory.cpp b/src/factory/PlayerbotFactory.cpp index d789bd2161..585f263380 100644 --- a/src/factory/PlayerbotFactory.cpp +++ b/src/factory/PlayerbotFactory.cpp @@ -2346,6 +2346,9 @@ void PlayerbotFactory::UpdateTradeSkills() void PlayerbotFactory::InitSkills() { + //uint32 maxValue = level * 5; //not used, line marked for removal. + bot->UpdateSkillsForLevel(); + bot->SetSkill(SKILL_RIDING, 0, 0, 0); if (bot->GetLevel() >= sPlayerbotAIConfig->useGroundMountAtMinLevel) bot->learnSpell(33388); From 311bf32da57481d38d17bc9229421622ecb6b43f Mon Sep 17 00:00:00 2001 From: crow Date: Wed, 10 Sep 2025 01:05:56 -0500 Subject: [PATCH 008/151] Update Shadow Nova action Fix error with isUseful check that caused bots not to run away from Shadow Nova when no Infernals were spawned + some tightening of code to avoid Shadow Nova --- src/strategy/raids/karazhan/RaidKarazhanActions.cpp | 10 +++------- 1 file changed, 3 insertions(+), 7 deletions(-) diff --git a/src/strategy/raids/karazhan/RaidKarazhanActions.cpp b/src/strategy/raids/karazhan/RaidKarazhanActions.cpp index 41ecc0bf7b..799e747654 100644 --- a/src/strategy/raids/karazhan/RaidKarazhanActions.cpp +++ b/src/strategy/raids/karazhan/RaidKarazhanActions.cpp @@ -974,8 +974,8 @@ bool KarazhanPrinceMalchezaarRunAwayFromShadowNovaAction::Execute(Event event) float currentBossDistance = bot->GetDistance2d(boss); if (currentBossDistance < safeBossDistance) { - const float stepSize = 2.0f; - const int numAngles = 16; + const float stepSize = 0.5f; + const int numAngles = 64; for (int i = 0; i < numAngles; ++i) { float angle = (2 * M_PI * i) / numAngles; @@ -1007,7 +1007,7 @@ bool KarazhanPrinceMalchezaarRunAwayFromShadowNovaAction::Execute(Event event) bot->AttackStop(); bot->InterruptNonMeleeSpells(false); if (karazhanHelper.IsSafePosition(destX, destY, destZ, infernals, 20.0f)) - return MoveTo(bot->GetMapId(), destX, destY, destZ, false, false, false, true, MovementPriority::MOVEMENT_COMBAT); + return MoveTo(bot->GetMapId(), destX, destY, destZ, false, false, false, true, MovementPriority::MOVEMENT_FORCED); } } } @@ -1017,10 +1017,6 @@ bool KarazhanPrinceMalchezaarRunAwayFromShadowNovaAction::Execute(Event event) bool KarazhanPrinceMalchezaarRunAwayFromShadowNovaAction::isUseful() { Unit* boss = AI_VALUE2(Unit*, "find target", "prince malchezaar"); - RaidKarazhanHelpers karazhanHelper(botAI); - std::vector infernals = karazhanHelper.GetSpawnedInfernals(); - if (infernals.empty()) - return false; return boss && bot->HasAura(SPELL_ENFEEBLE); } From e60876a1cb3b67688eaf9f340f40f5ae27b4396b Mon Sep 17 00:00:00 2001 From: crow Date: Fri, 12 Sep 2025 08:46:17 -0500 Subject: [PATCH 009/151] Update Aran, Netherspite, Prince --- .../karazhan/RaidKarazhanActionContext.h | 16 +- .../raids/karazhan/RaidKarazhanActions.cpp | 323 ++++++++++++------ .../raids/karazhan/RaidKarazhanActions.h | 97 +++--- .../raids/karazhan/RaidKarazhanHelpers.cpp | 90 ++++- .../raids/karazhan/RaidKarazhanHelpers.h | 7 +- .../karazhan/RaidKarazhanMultipliers.cpp | 183 ++++++++++ .../raids/karazhan/RaidKarazhanMultipliers.h | 34 ++ .../raids/karazhan/RaidKarazhanStrategy.cpp | 14 +- .../raids/karazhan/RaidKarazhanStrategy.h | 5 +- .../karazhan/RaidKarazhanTriggerContext.h | 2 +- .../raids/karazhan/RaidKarazhanTriggers.cpp | 2 +- 11 files changed, 594 insertions(+), 179 deletions(-) create mode 100644 src/strategy/raids/karazhan/RaidKarazhanMultipliers.cpp create mode 100644 src/strategy/raids/karazhan/RaidKarazhanMultipliers.h diff --git a/src/strategy/raids/karazhan/RaidKarazhanActionContext.h b/src/strategy/raids/karazhan/RaidKarazhanActionContext.h index f58fe4b52c..ac338cba43 100644 --- a/src/strategy/raids/karazhan/RaidKarazhanActionContext.h +++ b/src/strategy/raids/karazhan/RaidKarazhanActionContext.h @@ -1,10 +1,8 @@ #ifndef _PLAYERBOT_RAIDKARAZHANACTIONS_CONTEXT_H #define _PLAYERBOT_RAIDKARAZHANACTIONS_CONTEXT_H -#include "Action.h" -#include "NamedObjectContext.h" #include "RaidKarazhanActions.h" - +#include "NamedObjectContext.h" class RaidKarazhanActionContext : public NamedObjectContext { @@ -32,7 +30,7 @@ class RaidKarazhanActionContext : public NamedObjectContext creators["karazhan terestian illhoof mark target"] = &RaidKarazhanActionContext::karazhan_terestian_illhoof_mark_target; creators["karazhan shade of aran arcane explosion run away"] = &RaidKarazhanActionContext::karazhan_shade_of_aran_arcane_explosion_run_away; - creators["karazhan shade of aran flame wreath stop bot"] = &RaidKarazhanActionContext::karazhan_shade_of_aran_flame_wreath_stop_bot; + creators["karazhan shade of aran flame wreath stop movement"] = &RaidKarazhanActionContext::karazhan_shade_of_aran_flame_wreath_stop_movement; creators["karazhan shade of aran mark conjured elemental"] = &RaidKarazhanActionContext::karazhan_shade_of_aran_mark_conjured_elemental; creators["karazhan shade of aran spread ranged"] = &RaidKarazhanActionContext::karazhan_shade_of_aran_spread_ranged; @@ -42,8 +40,8 @@ class RaidKarazhanActionContext : public NamedObjectContext creators["karazhan netherspite avoid beam and void zone"] = &RaidKarazhanActionContext::karazhan_netherspite_avoid_beam_and_void_zone; creators["karazhan netherspite banish phase avoid void zone"] = &RaidKarazhanActionContext::karazhan_netherspite_banish_phase_avoid_void_zone; - creators["karazhan prince malchezaar avoid infernal"] = &RaidKarazhanActionContext::karazhan_prince_malchezaar_avoid_infernal; - creators["karazhan prince malchezaar run away from shadow nova"] = &RaidKarazhanActionContext::karazhan_prince_malchezaar_run_away_from_shadow_nova; + creators["karazhan prince malchezaar non tank avoid hazard"] = &RaidKarazhanActionContext::karazhan_prince_malchezaar_non_tank_avoid_hazard; + creators["karazhan prince malchezaar tank avoid hazard"] = &RaidKarazhanActionContext::karazhan_prince_malchezaar_tank_avoid_hazard; } private: @@ -68,7 +66,7 @@ class RaidKarazhanActionContext : public NamedObjectContext static Action* karazhan_terestian_illhoof_mark_target(PlayerbotAI* botAI) { return new KarazhanTerestianIllhoofMarkTargetAction(botAI); } static Action* karazhan_shade_of_aran_arcane_explosion_run_away(PlayerbotAI* botAI) { return new KarazhanShadeOfAranArcaneExplosionRunAwayAction(botAI); } - static Action* karazhan_shade_of_aran_flame_wreath_stop_bot(PlayerbotAI* botAI) { return new KarazhanShadeOfAranFlameWreathStopBotAction(botAI); } + static Action* karazhan_shade_of_aran_flame_wreath_stop_movement(PlayerbotAI* botAI) { return new KarazhanShadeOfAranFlameWreathStopMovementAction(botAI); } static Action* karazhan_shade_of_aran_mark_conjured_elemental(PlayerbotAI* botAI) { return new KarazhanShadeOfAranMarkConjuredElementalAction(botAI); } static Action* karazhan_shade_of_aran_spread_ranged(PlayerbotAI* botAI) { return new KarazhanShadeOfAranSpreadRangedAction(botAI); } @@ -78,8 +76,8 @@ class RaidKarazhanActionContext : public NamedObjectContext static Action* karazhan_netherspite_avoid_beam_and_void_zone(PlayerbotAI* botAI) { return new KarazhanNetherspiteAvoidBeamAndVoidZoneAction(botAI); } static Action* karazhan_netherspite_banish_phase_avoid_void_zone(PlayerbotAI* botAI) { return new KarazhanNetherspiteBanishPhaseAvoidVoidZoneAction(botAI); } - static Action* karazhan_prince_malchezaar_avoid_infernal(PlayerbotAI* botAI) { return new KarazhanPrinceMalchezaarAvoidInfernalAction(botAI); } - static Action* karazhan_prince_malchezaar_run_away_from_shadow_nova(PlayerbotAI* botAI) { return new KarazhanPrinceMalchezaarRunAwayFromShadowNovaAction(botAI); } + static Action* karazhan_prince_malchezaar_non_tank_avoid_hazard(PlayerbotAI* botAI) { return new KarazhanPrinceMalchezaarNonTankAvoidHazardAction(botAI); } + static Action* karazhan_prince_malchezaar_tank_avoid_hazard(PlayerbotAI* botAI) { return new KarazhanPrinceMalchezaarTankAvoidHazardAction(botAI); } }; #endif diff --git a/src/strategy/raids/karazhan/RaidKarazhanActions.cpp b/src/strategy/raids/karazhan/RaidKarazhanActions.cpp index 799e747654..5f0e6064dd 100644 --- a/src/strategy/raids/karazhan/RaidKarazhanActions.cpp +++ b/src/strategy/raids/karazhan/RaidKarazhanActions.cpp @@ -1,14 +1,9 @@ -#include "Playerbots.h" #include "RaidKarazhanActions.h" #include "RaidKarazhanHelpers.h" -#include "Timer.h" -#include "WarlockActions.h" #include "AiObjectContext.h" -#include "Pet.h" -#include "GenericActions.h" +#include "Playerbots.h" #include "PlayerbotMgr.h" #include "PlayerbotAI.h" -#include "MovementActions.h" namespace { @@ -344,8 +339,6 @@ bool KarazhanTerestianIllhoofMarkTargetAction::Execute(Event event) bool KarazhanShadeOfAranArcaneExplosionRunAwayAction::Execute(Event event) { Unit* boss = AI_VALUE2(Unit*, "find target", "shade of aran"); - static std::map arcaneExplosionEndTimes; - ObjectGuid botGuid = bot->GetGUID(); const float safeDistance = 20.0f; const float distance = bot->GetDistance2d(boss); @@ -356,64 +349,30 @@ bool KarazhanShadeOfAranArcaneExplosionRunAwayAction::Execute(Event event) { return MoveAway(boss, safeDistance - distance); } - - if (!botAI->HasStrategy("stay", BOT_STATE_COMBAT)) - botAI->ChangeStrategy("+stay", BOT_STATE_COMBAT); - + return false; } bool KarazhanShadeOfAranArcaneExplosionRunAwayAction::isUseful() { Unit* boss = AI_VALUE2(Unit*, "find target", "shade of aran"); - static std::map arcaneExplosionEndTimes; - ObjectGuid botGuid = bot->GetGUID(); if (!boss || !boss->IsAlive()) return false; - if (boss->HasUnitState(UNIT_STATE_CASTING) && boss->FindCurrentSpellBySpellId(SPELL_ARCANE_EXPLOSION)) - { - arcaneExplosionEndTimes[botGuid] = time(nullptr) + 1; - return true; - } - - if (arcaneExplosionEndTimes.count(botGuid) && arcaneExplosionEndTimes[botGuid] > time(nullptr)) - { - return true; - } - - if (arcaneExplosionEndTimes.count(botGuid)) - arcaneExplosionEndTimes.erase(botGuid); - - if (botAI->HasStrategy("stay", BOT_STATE_COMBAT)) - botAI->ChangeStrategy("-stay", BOT_STATE_COMBAT); - - return false; + return boss->HasUnitState(UNIT_STATE_CASTING) && boss->FindCurrentSpellBySpellId(SPELL_ARCANE_EXPLOSION); } -bool KarazhanShadeOfAranFlameWreathStopBotAction::Execute(Event event) +bool KarazhanShadeOfAranFlameWreathStopMovementAction::Execute(Event event) { RaidKarazhanHelpers karazhanHelper(botAI); - static std::map flameWreathPositions; - ObjectGuid botGuid = bot->GetGUID(); if (karazhanHelper.IsFlameWreathActive()) { - if (flameWreathPositions.find(botGuid) == flameWreathPositions.end()) - { - flameWreathPositions[botGuid] = Position(bot->GetPositionX(), bot->GetPositionY(), bot->GetPositionZ()); - } - AI_VALUE(LastMovement&, "last movement").Set(nullptr); bot->GetMotionMaster()->Clear(); if (bot->isMoving()) bot->StopMoving(); - Position& pos = flameWreathPositions[botGuid]; - return MoveTo(bot->GetMapId(), pos.GetPositionX(), pos.GetPositionY(), pos.GetPositionZ(), false, false, false, true, MovementPriority::MOVEMENT_FORCED); - } - else - { - flameWreathPositions.erase(botGuid); + return true; } return false; } @@ -422,11 +381,11 @@ bool KarazhanShadeOfAranMarkConjuredElementalAction::Execute(Event event) { RaidKarazhanHelpers karazhanHelper(botAI); Unit* boss = AI_VALUE2(Unit*, "find target", "shade of aran"); - if (!boss || !boss->IsAlive() || karazhanHelper.IsFlameWreathActive()) + if (!boss || !boss->IsAlive()) return false; Unit* target = karazhanHelper.GetFirstAliveUnitByEntry(NPC_CONJURED_ELEMENTAL); - if (!target || target->HasAura(SPELL_WARLOCK_BANISH) || !target->IsAlive()) + if (!target || !target->IsAlive() || target->HasAura(SPELL_WARLOCK_BANISH)) { return false; } @@ -474,7 +433,8 @@ bool KarazhanShadeOfAranSpreadRangedAction::isUseful() RaidKarazhanHelpers karazhanHelper(botAI); - return botAI->IsRanged(bot) && !karazhanHelper.IsFlameWreathActive() && !(boss->HasUnitState(UNIT_STATE_CASTING) && boss->FindCurrentSpellBySpellId(SPELL_ARCANE_EXPLOSION)); + return botAI->IsRanged(bot) && !karazhanHelper.IsFlameWreathActive() && !(boss->HasUnitState(UNIT_STATE_CASTING) + && boss->FindCurrentSpellBySpellId(SPELL_ARCANE_EXPLOSION)); } // One tank per phase will dance in and out of the red beam (5 seconds in, 5 seconds out) @@ -524,7 +484,8 @@ bool KarazhanNetherspiteBlockRedBeamAction::Execute(Event event) } if (!lastBeamMoveSideways[botGuid]) { - return MoveTo(bot->GetMapId(), beamPos.GetPositionX(), beamPos.GetPositionY(), beamPos.GetPositionZ(), false, false, false, true, MovementPriority::MOVEMENT_FORCED); + return MoveTo(bot->GetMapId(), beamPos.GetPositionX(), beamPos.GetPositionY(), beamPos.GetPositionZ(), + false, false, false, true, MovementPriority::MOVEMENT_FORCED); } else { @@ -654,7 +615,8 @@ bool KarazhanNetherspiteBlockBlueBeamAction::Execute(Event event) } if (found) { - return MoveTo(bot->GetMapId(), bestPos.GetPositionX(), bestPos.GetPositionY(), bestPos.GetPositionZ(), false, false, false, true, MovementPriority::MOVEMENT_FORCED); + return MoveTo(bot->GetMapId(), bestPos.GetPositionX(), bestPos.GetPositionY(), bestPos.GetPositionZ(), + false, false, false, true, MovementPriority::MOVEMENT_FORCED); } return false; } @@ -744,7 +706,8 @@ bool KarazhanNetherspiteBlockGreenBeamAction::Execute(Event event) } if (found) { - return MoveTo(bot->GetMapId(), bestPos.GetPositionX(), bestPos.GetPositionY(), bestPos.GetPositionZ(), false, false, false, true, MovementPriority::MOVEMENT_FORCED); + return MoveTo(bot->GetMapId(), bestPos.GetPositionX(), bestPos.GetPositionY(), bestPos.GetPositionZ(), + false, false, false, true, MovementPriority::MOVEMENT_FORCED); } return false; } @@ -881,10 +844,9 @@ bool KarazhanNetherspiteAvoidBeamAndVoidZoneAction::Execute(Event event) } if (found && karazhanHelper.IsSafePosition(bestCandidate.GetPositionX(), bestCandidate.GetPositionY(), bestCandidate.GetPositionZ(), voidZones, 4.0f)) - { + return MoveTo(bot->GetMapId(), bestCandidate.GetPositionX(), bestCandidate.GetPositionY(), bestCandidate.GetPositionZ(), false, false, false, true, MovementPriority::MOVEMENT_COMBAT); - } return false; } @@ -910,9 +872,7 @@ bool KarazhanNetherspiteBanishPhaseAvoidVoidZoneAction::Execute(Event event) for (Unit* vz : voidZones) { if (vz->GetEntry() == NPC_VOID_ZONE && bot->GetExactDist2d(vz) < 4.0f) - { return FleePosition(vz->GetPosition(), 4.0f); - } } return false; } @@ -928,95 +888,252 @@ bool KarazhanNetherspiteBanishPhaseAvoidVoidZoneAction::isUseful() for (Unit* vz : voidZones) { if (bot->GetExactDist2d(vz) < 4.0f) - { return true; - } } return false; } -bool KarazhanPrinceMalchezaarAvoidInfernalAction::Execute(Event event) +// For Enfeebled bots to avoid Shadow Nova and all non-tank bots to avoid infernals +bool KarazhanPrinceMalchezaarNonTankAvoidHazardAction::Execute(Event event) { Unit* boss = AI_VALUE2(Unit*, "find target", "prince malchezaar"); - if (!boss) - return false; - RaidKarazhanHelpers karazhanHelper(botAI); std::vector infernals = karazhanHelper.GetSpawnedInfernals(); - const float safeInfernalDistance = 20.0f; - const float safeInfernalTankingDistance = 25.0f; - float safeDistance = botAI->IsTank(bot) && botAI->HasAggro(boss) && boss->GetVictim() == - bot ? safeInfernalTankingDistance : safeInfernalDistance; + const float minSafeBossDistance = 35.0f; + const float maxSafeBossDistance = 40.0f; + const float safeInfernalDistance = 22.0f; + const float stepSize = 0.5f; + const int numAngles = 64; + float bx = bot->GetPositionX(); + float by = bot->GetPositionY(); + float bz = bot->GetPositionZ(); + float bossX = boss->GetPositionX(); + float bossY = boss->GetPositionY(); + float bossZ = boss->GetPositionZ(); + float bestMoveDist = std::numeric_limits::max(); + float bestDestX = 0.0f, bestDestY = 0.0f, bestDestZ = bz; + bool found = false; - for (Unit* infernal : infernals) + if (bot->HasAura(SPELL_ENFEEBLE)) { - float distance = bot->GetDistance2d(infernal); - if (distance < safeDistance) + for (int i = 0; i < numAngles; ++i) + { + float angle = (2 * M_PI * i) / numAngles; + float dx = cos(angle); + float dy = sin(angle); + for (float dist = minSafeBossDistance; dist <= maxSafeBossDistance; dist += stepSize) + { + float x = bossX + dx * dist; + float y = bossY + dy * dist; + float destZ = bossZ; + if (!bot->IsWithinLOS(x, y, destZ)) + continue; + bool pathSafe = karazhanHelper.IsStraightPathSafe(Position(bx, by, bz), Position(x, y, destZ), infernals, safeInfernalDistance, stepSize); + float moveDist = sqrt(pow(x - bx, 2) + pow(y - by, 2)); + if (pathSafe && moveDist < bestMoveDist) + { + bestMoveDist = moveDist; + bestDestX = x; + bestDestY = y; + bestDestZ = destZ; + found = true; + } + } + } + if (found) { bot->AttackStop(); bot->InterruptNonMeleeSpells(false); - return MoveAway(infernal, safeDistance - distance); + + return MoveTo(bot->GetMapId(), bestDestX, bestDestY, bestDestZ, false, false, false, true, MovementPriority::MOVEMENT_FORCED); + } + return false; + } + + if (!bot->HasAura(SPELL_ENFEEBLE)) + { + bool nearInfernal = false; + for (Unit* infernal : infernals) + { + float infernalDist = sqrt(pow(bx - infernal->GetPositionX(), 2) + pow(by - infernal->GetPositionY(), 2)); + if (infernalDist < safeInfernalDistance) + { + nearInfernal = true; + break; + } + } + if (nearInfernal) + { + float bestMoveDist = std::numeric_limits::max(); + float bestDestX = bx, bestDestY = by, bestDestZ = bz; + bool found = false; + bool usedArc = false; + for (int i = 0; i < numAngles; ++i) + { + float angle = (2 * M_PI * i) / numAngles; + float dx = cos(angle); + float dy = sin(angle); + for (float dist = stepSize; dist <= 35.0f; dist += stepSize) + { + float x = bossX + dx * dist; + float y = bossY + dy * dist; + float destZ = bossZ; + if (!bot->IsWithinLOS(x, y, destZ)) + continue; + bool pathSafe = karazhanHelper.IsStraightPathSafe(Position(bx, by, bz), Position(x, y, destZ), infernals, safeInfernalDistance, stepSize); + float moveDist = sqrt(pow(x - bx, 2) + pow(y - by, 2)); + if (pathSafe && moveDist < bestMoveDist) + { + bestMoveDist = moveDist; + bestDestX = x; + bestDestY = y; + bestDestZ = destZ; + found = true; + usedArc = false; + } + if (!pathSafe) + { + Position arcPoint = karazhanHelper.CalculateArcPoint(Position(bx, by, bz), Position(x, y, destZ), Position(bossX, bossY, bossZ)); + if (!bot->IsWithinLOS(arcPoint.GetPositionX(), arcPoint.GetPositionY(), arcPoint.GetPositionZ())) + continue; + bool arcSafe = true; + for (Unit* infernal : infernals) + { + float infernalDist = sqrt(pow(arcPoint.GetPositionX() - infernal->GetPositionX(), 2) + pow(arcPoint.GetPositionY() - infernal->GetPositionY(), 2)); + if (infernalDist < safeInfernalDistance) + { + arcSafe = false; + break; + } + } + float arcMoveDist = sqrt(pow(arcPoint.GetPositionX() - bx, 2) + pow(arcPoint.GetPositionY() - by, 2)); + if (arcSafe && arcMoveDist < bestMoveDist) + { + bestMoveDist = arcMoveDist; + bestDestX = arcPoint.GetPositionX(); + bestDestY = arcPoint.GetPositionY(); + bestDestZ = arcPoint.GetPositionZ(); + found = true; + usedArc = true; + } + } + } + } + if (found) + { + bot->AttackStop(); + bot->InterruptNonMeleeSpells(false); + + return MoveTo(bot->GetMapId(), bestDestX, bestDestY, bestDestZ, false, false, false, true, MovementPriority::MOVEMENT_COMBAT); + } } } return false; } -// For Enfeebled bots to avoid getting one-shot by Shadow Nova -bool KarazhanPrinceMalchezaarRunAwayFromShadowNovaAction::Execute(Event event) +bool KarazhanPrinceMalchezaarNonTankAvoidHazardAction::isUseful() +{ + Unit* boss = AI_VALUE2(Unit*, "find target", "prince malchezaar"); + + return boss && !(botAI->IsTank(bot) && botAI->HasAggro(boss) && boss->GetVictim() == bot); +} + +// For tank to avoid infernals (with buffer distance) +bool KarazhanPrinceMalchezaarTankAvoidHazardAction::Execute(Event event) { Unit* boss = AI_VALUE2(Unit*, "find target", "prince malchezaar"); RaidKarazhanHelpers karazhanHelper(botAI); std::vector infernals = karazhanHelper.GetSpawnedInfernals(); - const float safeBossDistance = 30.0f; - const float safeInfernalDistance = 20.0f; - float currentBossDistance = bot->GetDistance2d(boss); - if (currentBossDistance < safeBossDistance) + const float safeInfernalDistance = 30.0f; + const float stepSize = 0.5f; + const int numAngles = 64; + const float maxSampleDist = 60.0f; + float bx = bot->GetPositionX(); + float by = bot->GetPositionY(); + float bz = bot->GetPositionZ(); + float bestMoveDist = std::numeric_limits::max(); + float bestDestX = bx, bestDestY = by, bestDestZ = bz; + bool found = false; + bool usedArc = false; + + bool nearInfernal = false; + for (Unit* infernal : infernals) + { + float infernalDist = sqrt(pow(bx - infernal->GetPositionX(), 2) + pow(by - infernal->GetPositionY(), 2)); + if (infernalDist < safeInfernalDistance) + { + nearInfernal = true; + break; + } + } + if (nearInfernal) { - const float stepSize = 0.5f; - const int numAngles = 64; for (int i = 0; i < numAngles; ++i) { float angle = (2 * M_PI * i) / numAngles; float dx = cos(angle); float dy = sin(angle); - - bool pathIsSafe = true; - for (float dist = stepSize; dist <= safeBossDistance; dist += stepSize) + for (float dist = stepSize; dist <= maxSampleDist; dist += stepSize) { - float x = bot->GetPositionX() + dx * dist; - float y = bot->GetPositionY() + dy * dist; - for (Unit* infernal : infernals) + float x = bx + dx * dist; + float y = by + dy * dist; + float z = bz; + if (!bot->IsWithinLOS(x, y, z)) + continue; + bool safe = karazhanHelper.IsStraightPathSafe(Position(bx, by, bz), Position(x, y, z), infernals, safeInfernalDistance, stepSize); + float moveDist = sqrt(pow(x - bx, 2) + pow(y - by, 2)); + if (safe && moveDist < bestMoveDist) { - float infernalDist = sqrt(pow(x - infernal->GetPositionX(), 2) + pow(y - infernal->GetPositionY(), 2)); - if (infernalDist < safeInfernalDistance) + bestMoveDist = moveDist; + bestDestX = x; + bestDestY = y; + bestDestZ = z; + found = true; + usedArc = false; + } + if (!safe) + { + Position arcPoint = karazhanHelper.CalculateArcPoint(Position(bx, by, bz), Position(x, y, z), Position(bx, by, bz)); + if (!bot->IsWithinLOS(arcPoint.GetPositionX(), arcPoint.GetPositionY(), arcPoint.GetPositionZ())) + continue; + bool arcSafe = true; + for (Unit* infernal : infernals) { - pathIsSafe = false; - break; + float infernalDist = sqrt(pow(arcPoint.GetPositionX() - infernal->GetPositionX(), 2) + pow(arcPoint.GetPositionY() - infernal->GetPositionY(), 2)); + if (infernalDist < safeInfernalDistance) + { + arcSafe = false; + break; + } + } + float arcMoveDist = sqrt(pow(arcPoint.GetPositionX() - bx, 2) + pow(arcPoint.GetPositionY() - by, 2)); + if (arcSafe && arcMoveDist < bestMoveDist) + { + bestMoveDist = arcMoveDist; + bestDestX = arcPoint.GetPositionX(); + bestDestY = arcPoint.GetPositionY(); + bestDestZ = arcPoint.GetPositionZ(); + found = true; + usedArc = true; } } - if (!pathIsSafe) - break; - } - if (pathIsSafe) - { - float destX = bot->GetPositionX() + dx * (safeBossDistance - currentBossDistance); - float destY = bot->GetPositionY() + dy * (safeBossDistance - currentBossDistance); - float destZ = bot->GetPositionZ(); - bot->AttackStop(); - bot->InterruptNonMeleeSpells(false); - if (karazhanHelper.IsSafePosition(destX, destY, destZ, infernals, 20.0f)) - return MoveTo(bot->GetMapId(), destX, destY, destZ, false, false, false, true, MovementPriority::MOVEMENT_FORCED); } } + if (found) + { + bot->AttackStop(); + bot->InterruptNonMeleeSpells(false); + return MoveTo(bot->GetMapId(), bestDestX, bestDestY, bestDestZ, false, false, false, true, MovementPriority::MOVEMENT_COMBAT); + } } return false; } -bool KarazhanPrinceMalchezaarRunAwayFromShadowNovaAction::isUseful() +bool KarazhanPrinceMalchezaarTankAvoidHazardAction::isUseful() { Unit* boss = AI_VALUE2(Unit*, "find target", "prince malchezaar"); - - return boss && bot->HasAura(SPELL_ENFEEBLE); + + return boss && botAI->IsTank(bot) && botAI->HasAggro(boss) && boss->GetVictim() == bot; } diff --git a/src/strategy/raids/karazhan/RaidKarazhanActions.h b/src/strategy/raids/karazhan/RaidKarazhanActions.h index 37d69b1420..c9b34d03d0 100644 --- a/src/strategy/raids/karazhan/RaidKarazhanActions.h +++ b/src/strategy/raids/karazhan/RaidKarazhanActions.h @@ -1,48 +1,48 @@ #ifndef _PLAYERBOT_RAIDKARAZHANACTIONS_H #define _PLAYERBOT_RAIDKARAZHANACTIONS_H -#include "AttackAction.h" -#include "RaidKarazhanHelpers.h" +#include "Action.h" +#include "MovementActions.h" -class KarazhanAttumenTheHuntsmanStackBehindAction : public AttackAction +class KarazhanAttumenTheHuntsmanStackBehindAction : public MovementAction { public: - KarazhanAttumenTheHuntsmanStackBehindAction(PlayerbotAI* botAI, std::string const name = "karazhan attumen the huntsman stack behind") : AttackAction(botAI, name) {} + KarazhanAttumenTheHuntsmanStackBehindAction(PlayerbotAI* botAI, std::string const name = "karazhan attumen the huntsman stack behind") : MovementAction(botAI, name) {} bool Execute(Event event) override; bool isUseful() override; }; -class KarazhanMoroesMarkTargetAction : public AttackAction +class KarazhanMoroesMarkTargetAction : public Action { public: - KarazhanMoroesMarkTargetAction(PlayerbotAI* botAI, std::string const name = "karazhan moroes mark target") : AttackAction(botAI, name) {} + KarazhanMoroesMarkTargetAction(PlayerbotAI* botAI, std::string const name = "karazhan moroes mark target") : Action(botAI, name) {} bool Execute(Event event) override; }; -class KarazhanMaidenOfVirtuePositionBossAction : public AttackAction +class KarazhanMaidenOfVirtuePositionBossAction : public MovementAction { public: - KarazhanMaidenOfVirtuePositionBossAction(PlayerbotAI* botAI, std::string const name = "karazhan maiden of virtue position boss") : AttackAction(botAI, name) {} + KarazhanMaidenOfVirtuePositionBossAction(PlayerbotAI* botAI, std::string const name = "karazhan maiden of virtue position boss") : MovementAction(botAI, name) {} bool Execute(Event event) override; bool isUseful() override; }; -class KarazhanMaidenOfVirtuePositionRangedAction : public AttackAction +class KarazhanMaidenOfVirtuePositionRangedAction : public MovementAction { public: - KarazhanMaidenOfVirtuePositionRangedAction(PlayerbotAI* botAI, std::string const name = "karazhan maiden of virtue position ranged") : AttackAction(botAI, name) {} + KarazhanMaidenOfVirtuePositionRangedAction(PlayerbotAI* botAI, std::string const name = "karazhan maiden of virtue position ranged") : MovementAction(botAI, name) {} bool Execute(Event event) override; bool isUseful() override; }; -class KarazhanBigBadWolfRunAwayAction : public AttackAction +class KarazhanBigBadWolfRunAwayAction : public MovementAction { public: - KarazhanBigBadWolfRunAwayAction(PlayerbotAI* botAI, std::string const name = "karazhan big bad wolf run away") : AttackAction(botAI, name) {} + KarazhanBigBadWolfRunAwayAction(PlayerbotAI* botAI, std::string const name = "karazhan big bad wolf run away") : MovementAction(botAI, name) {} bool Execute(Event event) override; bool isUseful() override; @@ -51,155 +51,156 @@ class KarazhanBigBadWolfRunAwayAction : public AttackAction size_t currentIndex = 0; }; -class KarazhanRomuloAndJulianneMarkTargetAction : public AttackAction +class KarazhanRomuloAndJulianneMarkTargetAction : public Action { public: - KarazhanRomuloAndJulianneMarkTargetAction(PlayerbotAI* botAI, std::string const name = "karazhan romulo and julianne mark target") : AttackAction(botAI, name) {} + KarazhanRomuloAndJulianneMarkTargetAction(PlayerbotAI* botAI, std::string const name = "karazhan romulo and julianne mark target") : Action(botAI, name) {} bool Execute(Event event) override; }; -class KarazhanWizardOfOzMarkTargetAction : public AttackAction +class KarazhanWizardOfOzMarkTargetAction : public Action { public: - KarazhanWizardOfOzMarkTargetAction(PlayerbotAI* botAI, std::string const name = "karazhan wizard of oz mark target") : AttackAction(botAI, name) {} + KarazhanWizardOfOzMarkTargetAction(PlayerbotAI* botAI, std::string const name = "karazhan wizard of oz mark target") : Action(botAI, name) {} bool Execute(Event event) override; }; -class KarazhanWizardOfOzScorchStrawmanAction : public AttackAction +class KarazhanWizardOfOzScorchStrawmanAction : public Action { public: - KarazhanWizardOfOzScorchStrawmanAction(PlayerbotAI* botAI, std::string const name = "karazhan wizard of oz scorch strawman") : AttackAction(botAI, name) {} + KarazhanWizardOfOzScorchStrawmanAction(PlayerbotAI* botAI, std::string const name = "karazhan wizard of oz scorch strawman") : Action(botAI, name) {} bool Execute(Event event) override; }; -class KarazhanTheCuratorMarkTargetAction : public AttackAction +class KarazhanTheCuratorMarkTargetAction : public Action { public: - KarazhanTheCuratorMarkTargetAction(PlayerbotAI* botAI, std::string const name = "karazhan the curator mark target") : AttackAction(botAI, name) {} + KarazhanTheCuratorMarkTargetAction(PlayerbotAI* botAI, std::string const name = "karazhan the curator mark target") : Action(botAI, name) {} bool Execute(Event event) override; }; -class KarazhanTheCuratorPositionBossAction : public AttackAction +class KarazhanTheCuratorPositionBossAction : public MovementAction { public: - KarazhanTheCuratorPositionBossAction(PlayerbotAI* botAI, std::string const name = "karazhan the curator position boss") : AttackAction(botAI, name) {} + KarazhanTheCuratorPositionBossAction(PlayerbotAI* botAI, std::string const name = "karazhan the curator position boss") : MovementAction(botAI, name) {} bool Execute(Event event) override; bool isUseful() override; }; -class KarazhanTheCuratorSpreadRangedAction : public AttackAction +class KarazhanTheCuratorSpreadRangedAction : public MovementAction { public: - KarazhanTheCuratorSpreadRangedAction(PlayerbotAI* botAI, std::string const name = "karazhan the curator spread ranged") : AttackAction(botAI, name) {} + KarazhanTheCuratorSpreadRangedAction(PlayerbotAI* botAI, std::string const name = "karazhan the curator spread ranged") : MovementAction(botAI, name) {} bool Execute(Event event) override; bool isUseful() override; }; -class KarazhanTerestianIllhoofMarkTargetAction : public AttackAction +class KarazhanTerestianIllhoofMarkTargetAction : public Action { public: - KarazhanTerestianIllhoofMarkTargetAction(PlayerbotAI* botAI, std::string const name = "karazhan terestian illhoof mark target") : AttackAction(botAI, name) {} + KarazhanTerestianIllhoofMarkTargetAction(PlayerbotAI* botAI, std::string const name = "karazhan terestian illhoof mark target") : Action(botAI, name) {} bool Execute(Event event) override; }; -class KarazhanShadeOfAranArcaneExplosionRunAwayAction : public AttackAction +class KarazhanShadeOfAranArcaneExplosionRunAwayAction : public MovementAction { public: - KarazhanShadeOfAranArcaneExplosionRunAwayAction(PlayerbotAI* botAI, std::string const name = "karazhan shade of aran arcane explosion run away") : AttackAction(botAI, name) {} + KarazhanShadeOfAranArcaneExplosionRunAwayAction(PlayerbotAI* botAI, std::string const name = "karazhan shade of aran arcane explosion run away") : MovementAction(botAI, name) {} bool Execute(Event event) override; bool isUseful() override; }; -class KarazhanShadeOfAranFlameWreathStopBotAction : public AttackAction +class KarazhanShadeOfAranFlameWreathStopMovementAction : public MovementAction { public: - KarazhanShadeOfAranFlameWreathStopBotAction(PlayerbotAI* botAI, std::string const name = "karazhan shade of aran flame wreath stop bot") : AttackAction(botAI, name) {} + KarazhanShadeOfAranFlameWreathStopMovementAction(PlayerbotAI* botAI, std::string const name = "karazhan shade of aran flame wreath stop bot") : MovementAction(botAI, name) {} bool Execute(Event event) override; }; -class KarazhanShadeOfAranMarkConjuredElementalAction : public AttackAction +class KarazhanShadeOfAranMarkConjuredElementalAction : public Action { public: - KarazhanShadeOfAranMarkConjuredElementalAction(PlayerbotAI* botAI, std::string const name = "karazhan shade of aran mark conjured elemental") : AttackAction(botAI, name) {} + KarazhanShadeOfAranMarkConjuredElementalAction(PlayerbotAI* botAI, std::string const name = "karazhan shade of aran mark conjured elemental") : Action(botAI, name) {} bool Execute(Event event) override; }; -class KarazhanShadeOfAranSpreadRangedAction : public AttackAction +class KarazhanShadeOfAranSpreadRangedAction : public MovementAction { public: - KarazhanShadeOfAranSpreadRangedAction(PlayerbotAI* botAI, std::string const name = "karazhan shade of aran spread ranged") : AttackAction(botAI, name) {} + KarazhanShadeOfAranSpreadRangedAction(PlayerbotAI* botAI, std::string const name = "karazhan shade of aran spread ranged") : MovementAction(botAI, name) {} bool Execute(Event event) override; bool isUseful() override; }; -class KarazhanNetherspiteBlockRedBeamAction : public AttackAction +class KarazhanNetherspiteBlockRedBeamAction : public MovementAction { public: - KarazhanNetherspiteBlockRedBeamAction(PlayerbotAI* botAI, std::string const name = "karazhan netherspite block red beam") : AttackAction(botAI, name) {} + KarazhanNetherspiteBlockRedBeamAction(PlayerbotAI* botAI, std::string const name = "karazhan netherspite block red beam") : MovementAction(botAI, name) {} bool Execute(Event event) override; bool isUseful() override; }; -class KarazhanNetherspiteBlockBlueBeamAction : public AttackAction +class KarazhanNetherspiteBlockBlueBeamAction : public MovementAction { public: - KarazhanNetherspiteBlockBlueBeamAction(PlayerbotAI* botAI, std::string const name = "karazhan netherspite block blue beam") : AttackAction(botAI, name) {} + KarazhanNetherspiteBlockBlueBeamAction(PlayerbotAI* botAI, std::string const name = "karazhan netherspite block blue beam") : MovementAction(botAI, name) {} bool Execute(Event event) override; bool isUseful() override; }; -class KarazhanNetherspiteBlockGreenBeamAction : public AttackAction +class KarazhanNetherspiteBlockGreenBeamAction : public MovementAction { public: - KarazhanNetherspiteBlockGreenBeamAction(PlayerbotAI* botAI, std::string const name = "karazhan netherspite block green beam") : AttackAction(botAI, name) {} + KarazhanNetherspiteBlockGreenBeamAction(PlayerbotAI* botAI, std::string const name = "karazhan netherspite block green beam") : MovementAction(botAI, name) {} bool Execute(Event event) override; bool isUseful() override; }; -class KarazhanNetherspiteAvoidBeamAndVoidZoneAction : public AttackAction +class KarazhanNetherspiteAvoidBeamAndVoidZoneAction : public MovementAction { public: - KarazhanNetherspiteAvoidBeamAndVoidZoneAction(PlayerbotAI* botAI, std::string const name = "karazhan netherspite avoid beam and void zone") : AttackAction(botAI, name) {} + KarazhanNetherspiteAvoidBeamAndVoidZoneAction(PlayerbotAI* botAI, std::string const name = "karazhan netherspite avoid beam and void zone") : MovementAction(botAI, name) {} bool Execute(Event event) override; bool isUseful() override; }; -class KarazhanNetherspiteBanishPhaseAvoidVoidZoneAction : public AttackAction +class KarazhanNetherspiteBanishPhaseAvoidVoidZoneAction : public MovementAction { public: - KarazhanNetherspiteBanishPhaseAvoidVoidZoneAction(PlayerbotAI* botAI, std::string const name = "karazhan netherspite banish phase avoid void zone") : AttackAction(botAI, name) {} + KarazhanNetherspiteBanishPhaseAvoidVoidZoneAction(PlayerbotAI* botAI, std::string const name = "karazhan netherspite banish phase avoid void zone") : MovementAction(botAI, name) {} bool Execute(Event event) override; bool isUseful() override; }; -class KarazhanPrinceMalchezaarAvoidInfernalAction : public AttackAction +class KarazhanPrinceMalchezaarNonTankAvoidHazardAction : public MovementAction { public: - KarazhanPrinceMalchezaarAvoidInfernalAction(PlayerbotAI* botAI, std::string const name = "karazhan prince malchezaar avoid infernal") : AttackAction(botAI, name) {} + KarazhanPrinceMalchezaarNonTankAvoidHazardAction(PlayerbotAI* botAI, std::string const name = "karazhan prince malchezaar non-tank avoid hazard") : MovementAction(botAI, name) {} bool Execute(Event event) override; + bool isUseful() override; }; -class KarazhanPrinceMalchezaarRunAwayFromShadowNovaAction : public AttackAction +class KarazhanPrinceMalchezaarTankAvoidHazardAction : public MovementAction { public: - KarazhanPrinceMalchezaarRunAwayFromShadowNovaAction(PlayerbotAI* botAI, std::string const name = "karazhan prince malchezaar run away from shadow nova") : AttackAction(botAI, name) {} + KarazhanPrinceMalchezaarTankAvoidHazardAction(PlayerbotAI* botAI, std::string const name = "karazhan prince malchezaar tank avoid hazard") : MovementAction(botAI, name) {} bool Execute(Event event) override; bool isUseful() override; diff --git a/src/strategy/raids/karazhan/RaidKarazhanHelpers.cpp b/src/strategy/raids/karazhan/RaidKarazhanHelpers.cpp index 3a1360cc21..21b08e47fc 100644 --- a/src/strategy/raids/karazhan/RaidKarazhanHelpers.cpp +++ b/src/strategy/raids/karazhan/RaidKarazhanHelpers.cpp @@ -1,13 +1,13 @@ -#include "RaidKarazhanActions.h" +#include +#include + #include "RaidKarazhanHelpers.h" -#include "PlayerbotMgr.h" +#include "RaidKarazhanActions.h" #include "AiObjectContext.h" +#include "PlayerbotMgr.h" #include "Position.h" #include "Spell.h" -#include -#include - void RaidKarazhanHelpers::MarkTargetWithSkull(Unit* target) { if (!target) @@ -71,7 +71,7 @@ bool RaidKarazhanHelpers::IsFlameWreathActive() return false; Spell* currentSpell = boss->GetCurrentSpell(CURRENT_GENERIC_SPELL); - if (currentSpell && currentSpell->m_spellInfo && currentSpell->m_spellInfo->Id == SPELL_FLAME_WREATH_CAST) + if (currentSpell && currentSpell->m_spellInfo && currentSpell->m_spellInfo->Id == SPELL_FLAME_WREATH) { bot->Yell("I will not move when Flame Wreath is cast or the raid blows up.", LANG_UNIVERSAL); return true; @@ -84,7 +84,7 @@ bool RaidKarazhanHelpers::IsFlameWreathActive() Player* member = itr->GetSource(); if (!member || !member->IsAlive()) continue; - if (member->HasAura(SPELL_FLAME_WREATH_AURA)) + if (member->HasAura(SPELL_AURA_FLAME_WREATH)) return true; } } @@ -260,3 +260,79 @@ std::vector RaidKarazhanHelpers::GetSpawnedInfernals() const } return infernals; } + +bool RaidKarazhanHelpers::IsStraightPathSafe(const Position& start, const Position& target, const std::vector& hazards, float hazardRadius, float stepSize) +{ + float sx = start.GetPositionX(); + float sy = start.GetPositionY(); + float sz = start.GetPositionZ(); + float tx = target.GetPositionX(); + float ty = target.GetPositionY(); + float tz = target.GetPositionZ(); + float totalDist = std::sqrt(std::pow(tx - sx, 2) + std::pow(ty - sy, 2)); + if (totalDist == 0.0f) + return true; + for (float checkDist = 0.0f; checkDist <= totalDist; checkDist += stepSize) + { + float t = checkDist / totalDist; + float checkX = sx + (tx - sx) * t; + float checkY = sy + (ty - sy) * t; + float checkZ = sz + (tz - sz) * t; + for (Unit* hazard : hazards) + { + float hazardDist = std::sqrt(std::pow(checkX - hazard->GetPositionX(), 2) + std::pow(checkY - hazard->GetPositionY(), 2)); + if (hazardDist < hazardRadius) + return false; + } + } + return true; +} + +Position RaidKarazhanHelpers::CalculateArcPoint(const Position& current, const Position& target, const Position& center) +{ + float arcFraction = 0.25f; + // Calculate vectors from center to current position and target + float currentX = current.GetPositionX() - center.GetPositionX(); + float currentY = current.GetPositionY() - center.GetPositionY(); + float targetX = target.GetPositionX() - center.GetPositionX(); + float targetY = target.GetPositionY() - center.GetPositionY(); + + // Calculate distances + float currentDist = std::sqrt(currentX * currentX + currentY * currentY); + float targetDist = std::sqrt(targetX * targetX + targetY * targetY); + if (currentDist == 0.0f || targetDist == 0.0f) + return current; + + // Normalize vectors + currentX /= currentDist; + currentY /= currentDist; + targetX /= targetDist; + targetY /= targetDist; + + // Calculate dot product to find the angle between vectors + float dotProduct = currentX * targetX + currentY * targetY; + dotProduct = std::max(-1.0f, std::min(1.0f, dotProduct)); // Clamp to [-1, 1] + float angle = std::acos(dotProduct); + + // Determine rotation direction (clockwise or counterclockwise) + float crossProduct = currentX * targetY - currentY * targetX; + float stepAngle = angle * arcFraction; // Move arcFraction along the arc + if (crossProduct < 0) + stepAngle = -stepAngle; // Clockwise + + // Calculate rotation matrix components + float cos_a = std::cos(stepAngle); + float sin_a = std::sin(stepAngle); + + // Rotate current vector + float rotatedX = currentX * cos_a - currentY * sin_a; + float rotatedY = currentX * sin_a + currentY * cos_a; + + // Smoothing: blend current and target radius + float desiredDist = currentDist * 0.9f + targetDist * 0.1f; + + // Calculate the new position + return Position(center.GetPositionX() + rotatedX * desiredDist, + center.GetPositionY() + rotatedY * desiredDist, + current.GetPositionZ()); +} diff --git a/src/strategy/raids/karazhan/RaidKarazhanHelpers.h b/src/strategy/raids/karazhan/RaidKarazhanHelpers.h index bb218f45a6..39335de6c5 100644 --- a/src/strategy/raids/karazhan/RaidKarazhanHelpers.h +++ b/src/strategy/raids/karazhan/RaidKarazhanHelpers.h @@ -3,7 +3,6 @@ #include "AiObject.h" #include "Playerbots.h" -#include "MovementActions.h" enum KarazhanSpells { @@ -15,8 +14,8 @@ enum KarazhanSpells SPELL_FEAR = 6215, // Rank 3 // Shade of Aran - SPELL_FLAME_WREATH_CAST = 30004, - SPELL_FLAME_WREATH_AURA = 29946, + SPELL_FLAME_WREATH = 30004, + SPELL_AURA_FLAME_WREATH = 29946, SPELL_ARCANE_EXPLOSION = 29973, SPELL_WARLOCK_BANISH = 18647, // Rank 2 @@ -100,6 +99,8 @@ class RaidKarazhanHelpers : public AiObject bool IsSafePosition (float x, float y, float z, const std::vector& hazards, float hazardRadius); std::vector GetSpawnedInfernals() const; + bool IsStraightPathSafe(const Position& start, const Position& target, const std::vector& hazards, float hazardRadius, float stepSize); + Position CalculateArcPoint(const Position& current, const Position& target, const Position& center); }; #endif diff --git a/src/strategy/raids/karazhan/RaidKarazhanMultipliers.cpp b/src/strategy/raids/karazhan/RaidKarazhanMultipliers.cpp new file mode 100644 index 0000000000..4843e27b52 --- /dev/null +++ b/src/strategy/raids/karazhan/RaidKarazhanMultipliers.cpp @@ -0,0 +1,183 @@ +#include "RaidKarazhanMultipliers.h" +#include "RaidKarazhanActions.h" +#include "RaidKarazhanHelpers.h" +#include "AiObjectContext.h" +#include "DruidBearActions.h" +#include "DruidCatActions.h" +#include "WarriorActions.h" + +static bool IsChargeAction(Action* action) +{ + return dynamic_cast(action) || + dynamic_cast(action) || + dynamic_cast(action) || + dynamic_cast(action); +} + +float KarazhanShadeOfAranMultiplier::GetValue(Action* action) +{ + Unit* boss = AI_VALUE2(Unit*, "find target", "shade of aran"); + if (!boss) + return 1.0f; + + if (boss && boss->HasUnitState(UNIT_STATE_CASTING) && boss->FindCurrentSpellBySpellId(SPELL_ARCANE_EXPLOSION)) + { + if (IsChargeAction(action)) + return 0.0f; + + if (dynamic_cast(action) || IsChargeAction(action)) + { + const float safeDistance = 20.0f; + if (bot->GetDistance2d(boss) >= safeDistance) + return 0.0f; + } + } + + bool flameWreathActive = boss->HasAura(SPELL_FLAME_WREATH); + + if (!flameWreathActive && bot->GetGroup()) + { + for (GroupReference* itr = bot->GetGroup()->GetFirstMember(); itr != nullptr; itr = itr->next()) + { + Player* member = itr->GetSource(); + if (member && member->HasAura(SPELL_AURA_FLAME_WREATH)) + { + flameWreathActive = true; + break; + } + } + } + + if (flameWreathActive) + { + if (dynamic_cast(action) || IsChargeAction(action)) + return 0.0f; + } + return 1.0f; +} + +float KarazhanNetherspiteBlueAndGreenBeamMultiplier::GetValue(Action* action) +{ + Unit* boss = AI_VALUE2(Unit*, "find target", "netherspite"); + if (!boss || !boss->IsAlive()) + return 1.0f; + + RaidKarazhanHelpers karazhanHelper(botAI); + auto [redBlocker /*unused*/, greenBlocker, blueBlocker] = karazhanHelper.GetCurrentBeamBlockers(); + bool isBlocker = (bot == greenBlocker || bot == blueBlocker); + if (isBlocker) + { + Unit* bluePortal = bot->FindNearestCreature(NPC_BLUE_PORTAL, 150.0f); + Unit* greenPortal = bot->FindNearestCreature(NPC_GREEN_PORTAL, 150.0f); + + bool inBeam = false; + for (Unit* portal : {bluePortal, greenPortal}) { + if (!portal) continue; + float bx = boss->GetPositionX(), by = boss->GetPositionY(); + float px = portal->GetPositionX(), py = portal->GetPositionY(); + float dx = px - bx, dy = py - by; + float length = sqrt(dx*dx + dy*dy); + if (length == 0.0f) continue; + dx /= length; dy /= length; + float botdx = bot->GetPositionX() - bx, botdy = bot->GetPositionY() - by; + float t = (botdx * dx + botdy * dy); + float beamX = bx + dx * t, beamY = by + dy * t; + float distToBeam = sqrt(pow(bot->GetPositionX() - beamX, 2) + pow(bot->GetPositionY() - beamY, 2)); + if (distToBeam < 5.0f && t > 0.0f && t < length) { + inBeam = true; + break; + } + } + if (inBeam) + { + std::vector voidZones = karazhanHelper.GetAllVoidZones(); + bool inVoidZone = false; + for (Unit* vz : voidZones) { + if (bot->GetExactDist2d(vz) < 4.0f) + { + inVoidZone = true; + break; + } + } + if (!inVoidZone) + { + if (dynamic_cast(action) || IsChargeAction(action)) + return 0.0f; + } + } + } + return 1.0f; +} + +float KarazhanNetherspiteRedBeamMultiplier::GetValue(Action* action) +{ + Unit* boss = AI_VALUE2(Unit*, "find target", "netherspite"); + if (!boss || !boss->IsAlive()) + return 1.0f; + + RaidKarazhanHelpers karazhanHelper(botAI); + auto [redBlocker, greenBlocker /*unused*/, blueBlocker /*unused*/] = karazhanHelper.GetCurrentBeamBlockers(); + + static std::map beamMoveTimes; + static std::map lastBeamMoveSideways; + ObjectGuid botGuid = bot->GetGUID(); + Unit* redPortal = bot->FindNearestCreature(NPC_RED_PORTAL, 150.0f); + if (bot == redBlocker && boss && redPortal) + { + Position blockingPos = karazhanHelper.GetPositionOnBeam(boss, redPortal, 18.0f); + float bx = boss->GetPositionX(); + float by = boss->GetPositionY(); + float px = redPortal->GetPositionX(); + float py = redPortal->GetPositionY(); + float dx = px - bx; + float dy = py - by; + float length = sqrt(dx*dx + dy*dy); + if (length != 0.0f) + { + dx /= length; + dy /= length; + float perpDx = -dy; + float perpDy = dx; + Position sidewaysPos(blockingPos.GetPositionX() + perpDx * 3.0f, + blockingPos.GetPositionY() + perpDy * 3.0f, + blockingPos.GetPositionZ()); + + uint32 intervalSecs = 5; + if (beamMoveTimes[botGuid] == 0) + { + beamMoveTimes[botGuid] = time(nullptr); + lastBeamMoveSideways[botGuid] = false; + } + if (time(nullptr) - beamMoveTimes[botGuid] >= intervalSecs) + { + lastBeamMoveSideways[botGuid] = !lastBeamMoveSideways[botGuid]; + beamMoveTimes[botGuid] = time(nullptr); + } + + Position targetPos = lastBeamMoveSideways[botGuid] ? sidewaysPos : blockingPos; + float distToTarget = bot->GetExactDist2d(targetPos.GetPositionX(), targetPos.GetPositionY()); + const float positionTolerance = 1.5f; + + if (distToTarget < positionTolerance) + { + if (dynamic_cast(action) || IsChargeAction(action)) + return 0.0f; + } + } + } + return 1.0f; +} + +float KarazhanPrinceMalchezaarMultiplier::GetValue(Action* action) +{ + Unit* boss = AI_VALUE2(Unit*, "find target", "prince malchezaar"); + if (!boss) + return 1.0f; + + if (boss && bot->HasAura(SPELL_ENFEEBLE)) + { + if (IsChargeAction(action)) + return 0.0f; + } + return 1.0f; +} diff --git a/src/strategy/raids/karazhan/RaidKarazhanMultipliers.h b/src/strategy/raids/karazhan/RaidKarazhanMultipliers.h new file mode 100644 index 0000000000..e206655417 --- /dev/null +++ b/src/strategy/raids/karazhan/RaidKarazhanMultipliers.h @@ -0,0 +1,34 @@ +#ifndef _PLAYERBOT_RAIDKARAZHANMULTIPLIERS_H +#define _PLAYERBOT_RAIDKARAZHANMULTIPLIERS_H + +#include "Multiplier.h" + +class KarazhanShadeOfAranMultiplier : public Multiplier +{ +public: + KarazhanShadeOfAranMultiplier(PlayerbotAI* botAI) : Multiplier(botAI, "karazhan shade of aran multiplier") {} + virtual float GetValue(Action* action); +}; + +class KarazhanNetherspiteBlueAndGreenBeamMultiplier : public Multiplier +{ +public: + KarazhanNetherspiteBlueAndGreenBeamMultiplier(PlayerbotAI* botAI) : Multiplier(botAI, "karazhan netherspite blue and green beam multiplier") {} + virtual float GetValue(Action* action); +}; + +class KarazhanNetherspiteRedBeamMultiplier : public Multiplier +{ +public: + KarazhanNetherspiteRedBeamMultiplier(PlayerbotAI* botAI) : Multiplier(botAI, "karazhan netherspite red beam multiplier") {} + virtual float GetValue(Action* action); +}; + +class KarazhanPrinceMalchezaarMultiplier : public Multiplier +{ +public: + KarazhanPrinceMalchezaarMultiplier(PlayerbotAI* botAI) : Multiplier(botAI, "karazhan prince malchezaar multiplier") {} + virtual float GetValue(Action* action); +}; + +#endif diff --git a/src/strategy/raids/karazhan/RaidKarazhanStrategy.cpp b/src/strategy/raids/karazhan/RaidKarazhanStrategy.cpp index 795446879b..8e39f254d7 100644 --- a/src/strategy/raids/karazhan/RaidKarazhanStrategy.cpp +++ b/src/strategy/raids/karazhan/RaidKarazhanStrategy.cpp @@ -1,4 +1,5 @@ #include "RaidKarazhanStrategy.h" +#include "RaidKarazhanMultipliers.h" void RaidKarazhanStrategy::InitTriggers(std::vector& triggers) { @@ -48,7 +49,7 @@ void RaidKarazhanStrategy::InitTriggers(std::vector& triggers) triggers.push_back(new TriggerNode( "karazhan shade of aran", NextAction::array(0, - new NextAction("karazhan shade of aran flame wreath stop bot", ACTION_EMERGENCY + 7), + new NextAction("karazhan shade of aran flame wreath stop movement", ACTION_EMERGENCY + 7), new NextAction("karazhan shade of aran arcane explosion run away", ACTION_EMERGENCY + 6), new NextAction("karazhan shade of aran spread ranged", ACTION_RAID + 2), new NextAction("karazhan shade of aran mark conjured elemental", ACTION_RAID + 1), @@ -65,12 +66,15 @@ void RaidKarazhanStrategy::InitTriggers(std::vector& triggers) triggers.push_back(new TriggerNode( "karazhan prince malchezaar", NextAction::array(0, - new NextAction("karazhan prince malchezaar run away from shadow nova", ACTION_EMERGENCY + 6), - new NextAction("karazhan prince malchezaar avoid infernal", ACTION_RAID + 1), + new NextAction("karazhan prince malchezaar non tank avoid hazard", ACTION_EMERGENCY + 6), + new NextAction("karazhan prince malchezaar tank avoid hazard", ACTION_EMERGENCY + 6), nullptr))); } -void RaidKarazhanStrategy::InitMultipliers(std::vector& /*multipliers*/) +void RaidKarazhanStrategy::InitMultipliers(std::vector& multipliers) { - // No multipliers for this strategy + multipliers.push_back(new KarazhanShadeOfAranMultiplier(botAI)); + multipliers.push_back(new KarazhanNetherspiteBlueAndGreenBeamMultiplier(botAI)); + multipliers.push_back(new KarazhanNetherspiteRedBeamMultiplier(botAI)); + multipliers.push_back(new KarazhanPrinceMalchezaarMultiplier(botAI)); } diff --git a/src/strategy/raids/karazhan/RaidKarazhanStrategy.h b/src/strategy/raids/karazhan/RaidKarazhanStrategy.h index 070259b483..c03e42856f 100644 --- a/src/strategy/raids/karazhan/RaidKarazhanStrategy.h +++ b/src/strategy/raids/karazhan/RaidKarazhanStrategy.h @@ -2,6 +2,7 @@ #define _PLAYERBOT_RAIDKARAZHANSTRATEGY_H_ #include "Strategy.h" +#include "Multiplier.h" class RaidKarazhanStrategy : public Strategy { @@ -10,8 +11,8 @@ class RaidKarazhanStrategy : public Strategy std::string const getName() override { return "karazhan"; } - void InitTriggers(std::vector& /*triggers*/) override; - void InitMultipliers(std::vector& /*multipliers*/) override; + void InitTriggers(std::vector& triggers) override; + void InitMultipliers(std::vector& multipliers) override; }; #endif diff --git a/src/strategy/raids/karazhan/RaidKarazhanTriggerContext.h b/src/strategy/raids/karazhan/RaidKarazhanTriggerContext.h index 4451212c8b..0b6a29e828 100644 --- a/src/strategy/raids/karazhan/RaidKarazhanTriggerContext.h +++ b/src/strategy/raids/karazhan/RaidKarazhanTriggerContext.h @@ -1,8 +1,8 @@ #ifndef _PLAYERBOT_RAIDKARAZHANTRIGGERCONTEXT_H #define _PLAYERBOT_RAIDKARAZHANTRIGGERCONTEXT_H -#include "AiObjectContext.h" #include "RaidKarazhanTriggers.h" +#include "AiObjectContext.h" class RaidKarazhanTriggerContext : public NamedObjectContext { diff --git a/src/strategy/raids/karazhan/RaidKarazhanTriggers.cpp b/src/strategy/raids/karazhan/RaidKarazhanTriggers.cpp index 206ae53134..55aa175e88 100644 --- a/src/strategy/raids/karazhan/RaidKarazhanTriggers.cpp +++ b/src/strategy/raids/karazhan/RaidKarazhanTriggers.cpp @@ -1,7 +1,7 @@ -#include "Playerbots.h" #include "RaidKarazhanTriggers.h" #include "RaidKarazhanHelpers.h" #include "RaidKarazhanActions.h" +#include "Playerbots.h" bool KarazhanAttumenTheHuntsmanTrigger::IsActive() { From 22d1cc9d57b6fa2e99c05dda752459b6d1b0ad82 Mon Sep 17 00:00:00 2001 From: crow Date: Sun, 21 Sep 2025 15:41:29 -0500 Subject: [PATCH 010/151] BBW and other edits --- src/PlayerbotAI.cpp | 12 +- src/strategy/AiObjectContext.cpp | 53 +++----- src/strategy/raids/RaidStrategyContext.h | 27 ++-- .../karazhan/RaidKarazhanActionContext.h | 2 + .../raids/karazhan/RaidKarazhanActions.cpp | 116 ++++++++++++------ .../raids/karazhan/RaidKarazhanActions.h | 9 ++ .../raids/karazhan/RaidKarazhanHelpers.cpp | 24 ++++ .../raids/karazhan/RaidKarazhanHelpers.h | 37 ++---- .../karazhan/RaidKarazhanMultipliers.cpp | 20 ++- .../raids/karazhan/RaidKarazhanMultipliers.h | 7 ++ .../raids/karazhan/RaidKarazhanStrategy.cpp | 1 + 11 files changed, 182 insertions(+), 126 deletions(-) diff --git a/src/PlayerbotAI.cpp b/src/PlayerbotAI.cpp index 1d5de49b6c..b1d5558b12 100644 --- a/src/PlayerbotAI.cpp +++ b/src/PlayerbotAI.cpp @@ -1513,22 +1513,22 @@ void PlayerbotAI::ApplyInstanceStrategies(uint32 mapId, bool tellMaster) switch (mapId) { case 249: - strategyName = "onyxia"; + strategyName = "onyxia"; // Onyxia's Lair break; case 409: - strategyName = "mc"; + strategyName = "mc"; // Molten Core break; case 469: - strategyName = "bwl"; + strategyName = "bwl"; // Blackwing Lair break; case 509: - strategyName = "aq20"; + strategyName = "aq20"; // Ruins of Ahn'Qiraj break; case 532: - strategyName = "karazhan"; + strategyName = "karazhan"; // Karazhan break; case 533: - strategyName = "naxx"; + strategyName = "naxx"; // Naxxramas break; case 574: strategyName = "wotlk-uk"; // Utgarde Keep diff --git a/src/strategy/AiObjectContext.cpp b/src/strategy/AiObjectContext.cpp index 2e516c541e..e525ec7581 100644 --- a/src/strategy/AiObjectContext.cpp +++ b/src/strategy/AiObjectContext.cpp @@ -27,49 +27,30 @@ #include "WarriorAiObjectContext.h" #include "WorldPacketActionContext.h" #include "WorldPacketTriggerContext.h" -#include "raids/RaidStrategyContext.h" -#include "raids/blackwinglair/RaidBwlActionContext.h" -#include "raids/blackwinglair/RaidBwlTriggerContext.h" -#include "raids/naxxramas/RaidNaxxActionContext.h" -#include "raids/naxxramas/RaidNaxxTriggerContext.h" -#include "raids/icecrown/RaidIccActionContext.h" -#include "raids/icecrown/RaidIccTriggerContext.h" -#include "raids/obsidiansanctum/RaidOsActionContext.h" -#include "raids/obsidiansanctum/RaidOsTriggerContext.h" -#include "raids/eyeofeternity/RaidEoEActionContext.h" -#include "raids/vaultofarchavon/RaidVoATriggerContext.h" -#include "raids/onyxia/RaidOnyxiaActionContext.h" -#include "raids/onyxia/RaidOnyxiaTriggerContext.h" -#include "raids/vaultofarchavon/RaidVoAActionContext.h" -#include "raids/eyeofeternity/RaidEoETriggerContext.h" -#include "raids/moltencore/RaidMcActionContext.h" -#include "raids/moltencore/RaidMcTriggerContext.h" -#include "raids/aq20/RaidAq20ActionContext.h" -#include "raids/aq20/RaidAq20TriggerContext.h" -#include "raids/karazhan/RaidKarazhanActionContext.h" -#include "raids/karazhan/RaidKarazhanTriggerContext.h" #include "dungeons/DungeonStrategyContext.h" #include "dungeons/wotlk/WotlkDungeonActionContext.h" #include "dungeons/wotlk/WotlkDungeonTriggerContext.h" #include "raids/RaidStrategyContext.h" #include "raids/aq20/RaidAq20ActionContext.h" #include "raids/aq20/RaidAq20TriggerContext.h" -#include "raids/blackwinglair/RaidBwlActionContext.h" -#include "raids/blackwinglair/RaidBwlTriggerContext.h" -#include "raids/eyeofeternity/RaidEoEActionContext.h" -#include "raids/eyeofeternity/RaidEoETriggerContext.h" -#include "raids/icecrown/RaidIccActionContext.h" -#include "raids/icecrown/RaidIccTriggerContext.h" #include "raids/moltencore/RaidMcActionContext.h" #include "raids/moltencore/RaidMcTriggerContext.h" +#include "raids/blackwinglair/RaidBwlActionContext.h" +#include "raids/blackwinglair/RaidBwlTriggerContext.h" +#include "raids/karazhan/RaidKarazhanActionContext.h" +#include "raids/karazhan/RaidKarazhanTriggerContext.h" #include "raids/naxxramas/RaidNaxxActionContext.h" #include "raids/naxxramas/RaidNaxxTriggerContext.h" +#include "raids/eyeofeternity/RaidEoEActionContext.h" +#include "raids/eyeofeternity/RaidEoETriggerContext.h" +#include "raids/vaultofarchavon/RaidVoAActionContext.h" +#include "raids/vaultofarchavon/RaidVoATriggerContext.h" #include "raids/obsidiansanctum/RaidOsActionContext.h" #include "raids/obsidiansanctum/RaidOsTriggerContext.h" #include "raids/onyxia/RaidOnyxiaActionContext.h" #include "raids/onyxia/RaidOnyxiaTriggerContext.h" -#include "raids/vaultofarchavon/RaidVoAActionContext.h" -#include "raids/vaultofarchavon/RaidVoATriggerContext.h" +#include "raids/icecrown/RaidIccActionContext.h" +#include "raids/icecrown/RaidIccTriggerContext.h" SharedNamedObjectContextList AiObjectContext::sharedStrategyContexts; SharedNamedObjectContextList AiObjectContext::sharedActionContexts; @@ -117,8 +98,8 @@ void AiObjectContext::BuildSharedStrategyContexts(SharedNamedObjectContextList& actionContexts) @@ -126,17 +107,17 @@ void AiObjectContext::BuildSharedActionContexts(SharedNamedObjectContextList { public: RaidStrategyContext() : NamedObjectContext(false, true) { - // TODO should we give these prefixes (eg: "naxx" -> "raid naxx")? because if we don't it's going to end up - // very crowded (with possible conflicts) once we have strats for all raids and some dungeons - // (mc already very similiar to nc) + creators["aq20"] = &RaidStrategyContext::aq20; creators["mc"] = &RaidStrategyContext::mc; creators["bwl"] = &RaidStrategyContext::bwl; - creators["aq20"] = &RaidStrategyContext::aq20; + creators["karazhan"] = &RaidStrategyContext::karazhan; creators["naxx"] = &RaidStrategyContext::naxx; creators["wotlk-os"] = &RaidStrategyContext::wotlk_os; creators["wotlk-eoe"] = &RaidStrategyContext::wotlk_eoe; creators["voa"] = &RaidStrategyContext::voa; creators["uld"] = &RaidStrategyContext::uld; - creators["icc"] = &RaidStrategyContext::icc; creators["onyxia"] = &RaidStrategyContext::onyxia; - creators["karazhan"] = &RaidStrategyContext::karazhan; + creators["icc"] = &RaidStrategyContext::icc; } private: + static Strategy* aq20(PlayerbotAI* botAI) { return new RaidAq20Strategy(botAI); } static Strategy* mc(PlayerbotAI* botAI) { return new RaidMcStrategy(botAI); } static Strategy* bwl(PlayerbotAI* botAI) { return new RaidBwlStrategy(botAI); } - static Strategy* aq20(PlayerbotAI* botAI) { return new RaidAq20Strategy(botAI); } + static Strategy* karazhan(PlayerbotAI* botAI) { return new RaidKarazhanStrategy(botAI); } static Strategy* naxx(PlayerbotAI* botAI) { return new RaidNaxxStrategy(botAI); } static Strategy* wotlk_os(PlayerbotAI* botAI) { return new RaidOsStrategy(botAI); } static Strategy* wotlk_eoe(PlayerbotAI* botAI) { return new RaidEoEStrategy(botAI); } static Strategy* voa(PlayerbotAI* botAI) { return new RaidVoAStrategy(botAI); } + static Strategy* onyxia(PlayerbotAI* botAI) { return new RaidOnyxiaStrategy(botAI); } static Strategy* uld(PlayerbotAI* botAI) { return new RaidUlduarStrategy(botAI); } static Strategy* icc(PlayerbotAI* botAI) { return new RaidIccStrategy(botAI); } - static Strategy* onyxia(PlayerbotAI* botAI) { return new RaidOnyxiaStrategy(botAI); } - static Strategy* karazhan(PlayerbotAI* botAI) { return new RaidKarazhanStrategy(botAI); } }; #endif diff --git a/src/strategy/raids/karazhan/RaidKarazhanActionContext.h b/src/strategy/raids/karazhan/RaidKarazhanActionContext.h index ac338cba43..2c1f71686a 100644 --- a/src/strategy/raids/karazhan/RaidKarazhanActionContext.h +++ b/src/strategy/raids/karazhan/RaidKarazhanActionContext.h @@ -16,6 +16,7 @@ class RaidKarazhanActionContext : public NamedObjectContext creators["karazhan maiden of virtue position boss"] = &RaidKarazhanActionContext::karazhan_maiden_of_virtue_position_boss; creators["karazhan maiden of virtue position ranged"] = &RaidKarazhanActionContext::karazhan_maiden_of_virtue_position_ranged; + creators["karazhan big bad wolf position boss"] = &RaidKarazhanActionContext::karazhan_big_bad_wolf_position_boss; creators["karazhan big bad wolf run away"] = &RaidKarazhanActionContext::karazhan_big_bad_wolf_run_away; creators["karazhan romulo and julianne mark target"] = &RaidKarazhanActionContext::karazhan_romulo_and_julianne_mark_target; @@ -52,6 +53,7 @@ class RaidKarazhanActionContext : public NamedObjectContext static Action* karazhan_maiden_of_virtue_position_boss(PlayerbotAI* botAI) { return new KarazhanMaidenOfVirtuePositionBossAction(botAI); } static Action* karazhan_maiden_of_virtue_position_ranged(PlayerbotAI* botAI) { return new KarazhanMaidenOfVirtuePositionRangedAction(botAI); } + static Action* karazhan_big_bad_wolf_position_boss(PlayerbotAI* botAI) { return new KarazhanBigBadWolfPositionBossAction(botAI); } static Action* karazhan_big_bad_wolf_run_away(PlayerbotAI* botAI) { return new KarazhanBigBadWolfRunAwayAction(botAI); } static Action* karazhan_romulo_and_julianne_mark_target(PlayerbotAI* botAI) { return new KarazhanRomuloAndJulianneMarkTargetAction(botAI); } diff --git a/src/strategy/raids/karazhan/RaidKarazhanActions.cpp b/src/strategy/raids/karazhan/RaidKarazhanActions.cpp index 5f0e6064dd..243352511d 100644 --- a/src/strategy/raids/karazhan/RaidKarazhanActions.cpp +++ b/src/strategy/raids/karazhan/RaidKarazhanActions.cpp @@ -4,9 +4,13 @@ #include "Playerbots.h" #include "PlayerbotMgr.h" #include "PlayerbotAI.h" +#include "Position.h" namespace { + // Big Bad Wolf + static int currentIndex = 0; + // Netherspite static std::map beamMoveTimes; static std::map lastBeamMoveSideways; } @@ -149,24 +153,56 @@ bool KarazhanMaidenOfVirtuePositionRangedAction::isUseful() return boss && botAI->IsRanged(bot); } -bool KarazhanBigBadWolfRunAwayAction::Execute(Event event) +bool KarazhanBigBadWolfPositionBossAction::Execute(Event event) { Unit* boss = AI_VALUE2(Unit*, "find target", "the big bad wolf"); - bot->AttackStop(); - bot->InterruptNonMeleeSpells(false); + const float maxDistance = 3.0f; + const float distanceToBossPosition = boss->GetExactDist2d(KARAZHAN_BIG_BAD_WOLF_BOSS_POSITION); + + if (distanceToBossPosition > maxDistance) + { + float dX = KARAZHAN_BIG_BAD_WOLF_BOSS_POSITION.GetPositionX() - boss->GetPositionX(); + float dY = KARAZHAN_BIG_BAD_WOLF_BOSS_POSITION.GetPositionY() - boss->GetPositionY(); + + float mX = KARAZHAN_BIG_BAD_WOLF_BOSS_POSITION.GetPositionX() + (dX / distanceToBossPosition) * maxDistance; + float mY = KARAZHAN_BIG_BAD_WOLF_BOSS_POSITION.GetPositionY() + (dY / distanceToBossPosition) * maxDistance; + float moveDistance = bot->GetExactDist2d(mX, mY); + if (moveDistance < 0.5f) + { + return false; + } + + return MoveTo(bot->GetMapId(), mX, mY, bot->GetPositionZ(), false, false, false, false, + MovementPriority::MOVEMENT_COMBAT, true, false); + } + + return false; +} + +bool KarazhanBigBadWolfPositionBossAction::isUseful() +{ + Unit* boss = AI_VALUE2(Unit*, "find target", "the big bad wolf"); + + return boss && botAI->IsTank(bot) && botAI->HasAggro(boss) && boss->GetVictim() == bot && + !bot->HasAura(SPELL_LITTLE_RED_RIDING_HOOD); +} + +bool KarazhanBigBadWolfRunAwayAction::Execute(Event event) +{ constexpr float threshold = 1.0f; + Position target = KARAZHAN_BIG_BAD_WOLF_RUN_POSITION[currentIndex]; - if (bot->GetExactDist2d(target.GetPositionX(), target.GetPositionY()) < threshold) + while (bot->GetExactDist2d(target.GetPositionX(), target.GetPositionY()) < threshold) { currentIndex = (currentIndex + 1) % 4; target = KARAZHAN_BIG_BAD_WOLF_RUN_POSITION[currentIndex]; } - return MoveTo(bot->GetMapId(), target.GetPositionX(), target.GetPositionY(), target.GetPositionZ(), false, false, - false, true, MovementPriority::MOVEMENT_FORCED); + return MoveTo(bot->GetMapId(), target.GetPositionX(), target.GetPositionY(), target.GetPositionZ(), + false, false, false, true, MovementPriority::MOVEMENT_FORCED); } bool KarazhanBigBadWolfRunAwayAction::isUseful() @@ -222,8 +258,6 @@ bool KarazhanWizardOfOzScorchStrawmanAction::Execute(Event event) if (!group) return false; - const std::vector scorchSpellIds = {42859, 42858, 10207}; - for (GroupReference* itr = group->GetFirstMember(); itr != nullptr; itr = itr->next()) { Player* member = itr->GetSource(); @@ -237,19 +271,10 @@ bool KarazhanWizardOfOzScorchStrawmanAction::Execute(Event event) if (!mageAI) continue; - uint32 knownScorchId = 0; - for (uint32 spellId : scorchSpellIds) + if (mageAI->CanCastSpell("scorch", strawman)) { - if (member->HasSpell(spellId)) - { - knownScorchId = spellId; - break; - } + mageAI->CastSpell("scorch", strawman); } - if (!knownScorchId) - continue; - - mageAI->CastSpell(knownScorchId, strawman); } return false; } @@ -507,7 +532,8 @@ bool KarazhanNetherspiteBlockRedBeamAction::Execute(Event event) float sideY = beamPos.GetPositionY() + perpDy * 3.0f; float sideZ = beamPos.GetPositionZ(); - return MoveTo(bot->GetMapId(), sideX, sideY, sideZ, false, false, false, true, MovementPriority::MOVEMENT_FORCED); + return MoveTo(bot->GetMapId(), sideX, sideY, sideZ, false, false, false, true, + MovementPriority::MOVEMENT_FORCED); } } return false; @@ -595,7 +621,8 @@ bool KarazhanNetherspiteBlockBlueBeamAction::Execute(Event event) bool outsideAllVoidZones = true; for (Unit* voidZone : voidZones) { - float voidZoneDist = sqrt(pow(candidateX - voidZone->GetPositionX(), 2) + pow(candidateY - voidZone->GetPositionY(), 2)); + float voidZoneDist = sqrt(pow(candidateX - voidZone->GetPositionX(), 2) + + pow(candidateY - voidZone->GetPositionY(), 2)); if (voidZoneDist < 4.0f) { outsideAllVoidZones = false; @@ -635,8 +662,8 @@ bool KarazhanNetherspiteBlockBlueBeamAction::isUseful() return boss && bluePortal && !boss->HasAura(SPELL_NETHERSPITE_BANISHED); } -// Two healers will block the green beam for each phase (swap at 25 debuff stacks -// OR one rogue or DPS warrior will block the green beam for any entire phase +// Two healers will block the green beam for each phase (swap at 25 debuff stacks) +// OR one rogue or DPS warrior will block the green beam for an entire phase (if they begin the phase as the blocker) // When avoiding void zones, blocking bots will move along the beam to continue blocking bool KarazhanNetherspiteBlockGreenBeamAction::Execute(Event event) { @@ -686,7 +713,8 @@ bool KarazhanNetherspiteBlockGreenBeamAction::Execute(Event event) bool outsideAllVoidZones = true; for (Unit* voidZone : voidZones) { - float voidZoneDist = sqrt(pow(candidateX - voidZone->GetPositionX(), 2) + pow(candidateY - voidZone->GetPositionY(), 2)); + float voidZoneDist = sqrt(pow(candidateX - voidZone->GetPositionX(), 2) + + pow(candidateY - voidZone->GetPositionY(), 2)); if (voidZoneDist < 4.0f) { outsideAllVoidZones = false; @@ -842,11 +870,12 @@ bool KarazhanNetherspiteAvoidBeamAndVoidZoneAction::Execute(Event event) } } } - if (found && karazhanHelper.IsSafePosition(bestCandidate.GetPositionX(), bestCandidate.GetPositionY(), bestCandidate.GetPositionZ(), + if (found && karazhanHelper.IsSafePosition(bestCandidate.GetPositionX(), + bestCandidate.GetPositionY(), bestCandidate.GetPositionZ(), voidZones, 4.0f)) - return MoveTo(bot->GetMapId(), bestCandidate.GetPositionX(), bestCandidate.GetPositionY(), bestCandidate.GetPositionZ(), - false, false, false, true, MovementPriority::MOVEMENT_COMBAT); + return MoveTo(bot->GetMapId(), bestCandidate.GetPositionX(), bestCandidate.GetPositionY(), + bestCandidate.GetPositionZ(), false, false, false, true, MovementPriority::MOVEMENT_COMBAT); return false; } @@ -929,7 +958,8 @@ bool KarazhanPrinceMalchezaarNonTankAvoidHazardAction::Execute(Event event) float destZ = bossZ; if (!bot->IsWithinLOS(x, y, destZ)) continue; - bool pathSafe = karazhanHelper.IsStraightPathSafe(Position(bx, by, bz), Position(x, y, destZ), infernals, safeInfernalDistance, stepSize); + bool pathSafe = karazhanHelper.IsStraightPathSafe(Position(bx, by, bz), Position(x, y, destZ), + infernals, safeInfernalDistance, stepSize); float moveDist = sqrt(pow(x - bx, 2) + pow(y - by, 2)); if (pathSafe && moveDist < bestMoveDist) { @@ -946,7 +976,8 @@ bool KarazhanPrinceMalchezaarNonTankAvoidHazardAction::Execute(Event event) bot->AttackStop(); bot->InterruptNonMeleeSpells(false); - return MoveTo(bot->GetMapId(), bestDestX, bestDestY, bestDestZ, false, false, false, true, MovementPriority::MOVEMENT_FORCED); + return MoveTo(bot->GetMapId(), bestDestX, bestDestY, bestDestZ, false, false, false, true, + MovementPriority::MOVEMENT_FORCED); } return false; } @@ -981,7 +1012,8 @@ bool KarazhanPrinceMalchezaarNonTankAvoidHazardAction::Execute(Event event) float destZ = bossZ; if (!bot->IsWithinLOS(x, y, destZ)) continue; - bool pathSafe = karazhanHelper.IsStraightPathSafe(Position(bx, by, bz), Position(x, y, destZ), infernals, safeInfernalDistance, stepSize); + bool pathSafe = karazhanHelper.IsStraightPathSafe(Position(bx, by, bz), Position(x, y, destZ), + infernals, safeInfernalDistance, stepSize); float moveDist = sqrt(pow(x - bx, 2) + pow(y - by, 2)); if (pathSafe && moveDist < bestMoveDist) { @@ -994,20 +1026,23 @@ bool KarazhanPrinceMalchezaarNonTankAvoidHazardAction::Execute(Event event) } if (!pathSafe) { - Position arcPoint = karazhanHelper.CalculateArcPoint(Position(bx, by, bz), Position(x, y, destZ), Position(bossX, bossY, bossZ)); + Position arcPoint = karazhanHelper.CalculateArcPoint(Position(bx, by, bz), Position(x, y, destZ), + Position(bossX, bossY, bossZ)); if (!bot->IsWithinLOS(arcPoint.GetPositionX(), arcPoint.GetPositionY(), arcPoint.GetPositionZ())) continue; bool arcSafe = true; for (Unit* infernal : infernals) { - float infernalDist = sqrt(pow(arcPoint.GetPositionX() - infernal->GetPositionX(), 2) + pow(arcPoint.GetPositionY() - infernal->GetPositionY(), 2)); + float infernalDist = sqrt(pow(arcPoint.GetPositionX() - infernal->GetPositionX(), 2) + + pow(arcPoint.GetPositionY() - infernal->GetPositionY(), 2)); if (infernalDist < safeInfernalDistance) { arcSafe = false; break; } } - float arcMoveDist = sqrt(pow(arcPoint.GetPositionX() - bx, 2) + pow(arcPoint.GetPositionY() - by, 2)); + float arcMoveDist = sqrt(pow(arcPoint.GetPositionX() - bx, 2) + + pow(arcPoint.GetPositionY() - by, 2)); if (arcSafe && arcMoveDist < bestMoveDist) { bestMoveDist = arcMoveDist; @@ -1025,7 +1060,8 @@ bool KarazhanPrinceMalchezaarNonTankAvoidHazardAction::Execute(Event event) bot->AttackStop(); bot->InterruptNonMeleeSpells(false); - return MoveTo(bot->GetMapId(), bestDestX, bestDestY, bestDestZ, false, false, false, true, MovementPriority::MOVEMENT_COMBAT); + return MoveTo(bot->GetMapId(), bestDestX, bestDestY, bestDestZ, false, false, false, true, + MovementPriority::MOVEMENT_COMBAT); } } } @@ -1082,7 +1118,8 @@ bool KarazhanPrinceMalchezaarTankAvoidHazardAction::Execute(Event event) float z = bz; if (!bot->IsWithinLOS(x, y, z)) continue; - bool safe = karazhanHelper.IsStraightPathSafe(Position(bx, by, bz), Position(x, y, z), infernals, safeInfernalDistance, stepSize); + bool safe = karazhanHelper.IsStraightPathSafe(Position(bx, by, bz), Position(x, y, z), + infernals, safeInfernalDistance, stepSize); float moveDist = sqrt(pow(x - bx, 2) + pow(y - by, 2)); if (safe && moveDist < bestMoveDist) { @@ -1095,13 +1132,15 @@ bool KarazhanPrinceMalchezaarTankAvoidHazardAction::Execute(Event event) } if (!safe) { - Position arcPoint = karazhanHelper.CalculateArcPoint(Position(bx, by, bz), Position(x, y, z), Position(bx, by, bz)); + Position arcPoint = karazhanHelper.CalculateArcPoint(Position(bx, by, bz), Position(x, y, z), + Position(bx, by, bz)); if (!bot->IsWithinLOS(arcPoint.GetPositionX(), arcPoint.GetPositionY(), arcPoint.GetPositionZ())) continue; bool arcSafe = true; for (Unit* infernal : infernals) { - float infernalDist = sqrt(pow(arcPoint.GetPositionX() - infernal->GetPositionX(), 2) + pow(arcPoint.GetPositionY() - infernal->GetPositionY(), 2)); + float infernalDist = sqrt(pow(arcPoint.GetPositionX() - infernal->GetPositionX(), 2) + + pow(arcPoint.GetPositionY() - infernal->GetPositionY(), 2)); if (infernalDist < safeInfernalDistance) { arcSafe = false; @@ -1125,7 +1164,8 @@ bool KarazhanPrinceMalchezaarTankAvoidHazardAction::Execute(Event event) { bot->AttackStop(); bot->InterruptNonMeleeSpells(false); - return MoveTo(bot->GetMapId(), bestDestX, bestDestY, bestDestZ, false, false, false, true, MovementPriority::MOVEMENT_COMBAT); + return MoveTo(bot->GetMapId(), bestDestX, bestDestY, bestDestZ, false, false, false, true, + MovementPriority::MOVEMENT_COMBAT); } } return false; diff --git a/src/strategy/raids/karazhan/RaidKarazhanActions.h b/src/strategy/raids/karazhan/RaidKarazhanActions.h index c9b34d03d0..4ab24ed94f 100644 --- a/src/strategy/raids/karazhan/RaidKarazhanActions.h +++ b/src/strategy/raids/karazhan/RaidKarazhanActions.h @@ -39,6 +39,15 @@ class KarazhanMaidenOfVirtuePositionRangedAction : public MovementAction bool isUseful() override; }; +class KarazhanBigBadWolfPositionBossAction : public MovementAction +{ +public: + KarazhanBigBadWolfPositionBossAction(PlayerbotAI* botAI, std::string const name = "karazhan big bad wolf position boss") : MovementAction(botAI, name) {} + + bool Execute(Event event) override; + bool isUseful() override; +}; + class KarazhanBigBadWolfRunAwayAction : public MovementAction { public: diff --git a/src/strategy/raids/karazhan/RaidKarazhanHelpers.cpp b/src/strategy/raids/karazhan/RaidKarazhanHelpers.cpp index 21b08e47fc..81479e7ebc 100644 --- a/src/strategy/raids/karazhan/RaidKarazhanHelpers.cpp +++ b/src/strategy/raids/karazhan/RaidKarazhanHelpers.cpp @@ -8,6 +8,30 @@ #include "Position.h" #include "Spell.h" +const Position KARAZHAN_MAIDEN_OF_VIRTUE_BOSS_POSITION = Position(-10945.881f, -2103.782f, 92.712f); +const Position KARAZHAN_MAIDEN_OF_VIRTUE_RANGED_POSITION[8] = +{ + { -10931.178f, -2116.580f, 92.179f }, + { -10925.828f, -2102.425f, 92.180f }, + { -10933.089f, -2088.5017f, 92.180f }, + { -10947.59f, -2082.8147f, 92.180f }, + { -10960.912f, -2090.4368f, 92.179f }, + { -10966.017f, -2105.288f, 92.175f }, + { -10959.242f, -2119.6172f, 92.180f }, + { -10944.495f, -2123.857f, 92.180f }, +}; + +const Position KARAZHAN_BIG_BAD_WOLF_BOSS_POSITION = Position(-10913.391f, -1773.508f, 90.477f); +const Position KARAZHAN_BIG_BAD_WOLF_RUN_POSITION[4] = +{ + { -10875.456f, -1779.036f, 90.477f }, + { -10872.281f, -1751.638f, 90.477f }, + { -10910.492f, -1747.401f, 90.477f }, + { -10913.391f, -1773.508f, 90.477f }, +}; + +const Position KARAZHAN_THE_CURATOR_BOSS_POSITION = Position(-11139.463f, -1884.645f, 165.765f); + void RaidKarazhanHelpers::MarkTargetWithSkull(Unit* target) { if (!target) diff --git a/src/strategy/raids/karazhan/RaidKarazhanHelpers.h b/src/strategy/raids/karazhan/RaidKarazhanHelpers.h index 39335de6c5..42db658043 100644 --- a/src/strategy/raids/karazhan/RaidKarazhanHelpers.h +++ b/src/strategy/raids/karazhan/RaidKarazhanHelpers.h @@ -3,6 +3,7 @@ #include "AiObject.h" #include "Playerbots.h" +#include "Position.h" enum KarazhanSpells { @@ -11,7 +12,6 @@ enum KarazhanSpells // Opera Event SPELL_LITTLE_RED_RIDING_HOOD = 30756, - SPELL_FEAR = 6215, // Rank 3 // Shade of Aran SPELL_FLAME_WREATH = 30004, @@ -29,9 +29,6 @@ enum KarazhanSpells // Prince Malchezaar SPELL_ENFEEBLE = 30843, - - // Nightbane - SPELL_CHARRED_EARTH = 30129 }; enum KarazhanNpcs @@ -54,32 +51,13 @@ enum KarazhanNpcs // Prince Malchezaar NPC_NETHERSPITE_INFERNAL = 17646, - - // Nightbane - NPC_RESTLESS_SKELETON = 17261, -}; - -const Position KARAZHAN_MAIDEN_OF_VIRTUE_BOSS_POSITION = Position(-10945.881f, -2103.7817f, 92.71163f); -const Position KARAZHAN_MAIDEN_OF_VIRTUE_RANGED_POSITION[8] = -{ - { -10931.178f, -2116.58f, 92.1787f }, - { -10925.828f, -2102.425f, 92.18016f }, - { -10933.089f, -2088.5017f, 92.18028f }, - { -10947.59f, -2082.8147f, 92.18024f }, - { -10960.912f, -2090.4368f, 92.17964f }, - { -10966.017f, -2105.288f, 92.17582f }, - { -10959.242f, -2119.6172f, 92.18062f }, - { -10944.495f, -2123.857f, 92.18021f }, -}; - -const Position KARAZHAN_BIG_BAD_WOLF_RUN_POSITION[4] = { - { -10913.391f, -1773.5083f, 90.47706f }, - { -10875.456f, -1779.0358f, 90.47706f }, - { -10872.281f, -1751.6376f, 90.47716f }, - { -10910.492f, -1747.401f, 90.477165f }, }; -const Position KARAZHAN_THE_CURATOR_BOSS_POSITION = Position(-11139.463f, -1884.6451f, 165.76564f); +extern const Position KARAZHAN_MAIDEN_OF_VIRTUE_BOSS_POSITION; +extern const Position KARAZHAN_MAIDEN_OF_VIRTUE_RANGED_POSITION[8]; +extern const Position KARAZHAN_BIG_BAD_WOLF_BOSS_POSITION; +extern const Position KARAZHAN_BIG_BAD_WOLF_RUN_POSITION[4]; +extern const Position KARAZHAN_THE_CURATOR_BOSS_POSITION; class RaidKarazhanHelpers : public AiObject { @@ -99,7 +77,8 @@ class RaidKarazhanHelpers : public AiObject bool IsSafePosition (float x, float y, float z, const std::vector& hazards, float hazardRadius); std::vector GetSpawnedInfernals() const; - bool IsStraightPathSafe(const Position& start, const Position& target, const std::vector& hazards, float hazardRadius, float stepSize); + bool IsStraightPathSafe(const Position& start, const Position& target, + const std::vector& hazards, float hazardRadius, float stepSize); Position CalculateArcPoint(const Position& current, const Position& target, const Position& center); }; diff --git a/src/strategy/raids/karazhan/RaidKarazhanMultipliers.cpp b/src/strategy/raids/karazhan/RaidKarazhanMultipliers.cpp index 4843e27b52..a1b25ee5f9 100644 --- a/src/strategy/raids/karazhan/RaidKarazhanMultipliers.cpp +++ b/src/strategy/raids/karazhan/RaidKarazhanMultipliers.cpp @@ -2,6 +2,7 @@ #include "RaidKarazhanActions.h" #include "RaidKarazhanHelpers.h" #include "AiObjectContext.h" +#include "AttackAction.h" #include "DruidBearActions.h" #include "DruidCatActions.h" #include "WarriorActions.h" @@ -14,18 +15,33 @@ static bool IsChargeAction(Action* action) dynamic_cast(action); } +float KarazhanBigBadWolfMultiplier::GetValue(Action* action) +{ + Unit* boss = AI_VALUE2(Unit*, "find target", "the big bad wolf"); + if (!boss) + return 1.0f; + + if (bot->HasAura(SPELL_LITTLE_RED_RIDING_HOOD)) + { + if ((dynamic_cast(action) && !dynamic_cast(action)) || + (dynamic_cast(action))) + return 0.0f; + } + return 1.0f; +} + float KarazhanShadeOfAranMultiplier::GetValue(Action* action) { Unit* boss = AI_VALUE2(Unit*, "find target", "shade of aran"); if (!boss) return 1.0f; - if (boss && boss->HasUnitState(UNIT_STATE_CASTING) && boss->FindCurrentSpellBySpellId(SPELL_ARCANE_EXPLOSION)) + if (boss->HasUnitState(UNIT_STATE_CASTING) && boss->FindCurrentSpellBySpellId(SPELL_ARCANE_EXPLOSION)) { if (IsChargeAction(action)) return 0.0f; - if (dynamic_cast(action) || IsChargeAction(action)) + if (dynamic_cast(action)) { const float safeDistance = 20.0f; if (bot->GetDistance2d(boss) >= safeDistance) diff --git a/src/strategy/raids/karazhan/RaidKarazhanMultipliers.h b/src/strategy/raids/karazhan/RaidKarazhanMultipliers.h index e206655417..d29aa027e3 100644 --- a/src/strategy/raids/karazhan/RaidKarazhanMultipliers.h +++ b/src/strategy/raids/karazhan/RaidKarazhanMultipliers.h @@ -3,6 +3,13 @@ #include "Multiplier.h" +class KarazhanBigBadWolfMultiplier : public Multiplier +{ +public: + KarazhanBigBadWolfMultiplier(PlayerbotAI* botAI) : Multiplier(botAI, "karazhan big bad wolf multiplier") {} + virtual float GetValue(Action* action); +}; + class KarazhanShadeOfAranMultiplier : public Multiplier { public: diff --git a/src/strategy/raids/karazhan/RaidKarazhanStrategy.cpp b/src/strategy/raids/karazhan/RaidKarazhanStrategy.cpp index 8e39f254d7..f93c923c70 100644 --- a/src/strategy/raids/karazhan/RaidKarazhanStrategy.cpp +++ b/src/strategy/raids/karazhan/RaidKarazhanStrategy.cpp @@ -22,6 +22,7 @@ void RaidKarazhanStrategy::InitTriggers(std::vector& triggers) triggers.push_back(new TriggerNode( "karazhan big bad wolf", NextAction::array(0, new NextAction("karazhan big bad wolf run away", ACTION_EMERGENCY + 6), + new NextAction("karazhan big bad wolf position boss", ACTION_RAID + 1), nullptr))); triggers.push_back(new TriggerNode( From ca0dafd67b0e97e52edc12016de22a03c50c6219 Mon Sep 17 00:00:00 2001 From: Spargel Date: Sun, 21 Sep 2025 21:17:53 -0500 Subject: [PATCH 011/151] Fix SetTotemAction Add isUseful and check array size instead of pointer size --- src/strategy/shaman/ShamanActions.cpp | 28 +++++++++++++++++-- src/strategy/shaman/ShamanActions.h | 40 ++++++++++++++------------- 2 files changed, 46 insertions(+), 22 deletions(-) diff --git a/src/strategy/shaman/ShamanActions.cpp b/src/strategy/shaman/ShamanActions.cpp index dbb83a0c7a..5d5eff816e 100644 --- a/src/strategy/shaman/ShamanActions.cpp +++ b/src/strategy/shaman/ShamanActions.cpp @@ -93,10 +93,8 @@ bool CastSpiritWalkAction::Execute(Event event) bool SetTotemAction::Execute(Event event) { - size_t spellIdsCount = sizeof(totemSpellIds) / sizeof(uint32); - uint32 totemSpell = 0; - for (int i = spellIdsCount - 1; i >= 0; --i) + for (int i = (int)totemSpellIdsCount - 1; i >= 0; --i) { if (bot->HasSpell(totemSpellIds[i])) { @@ -109,3 +107,27 @@ bool SetTotemAction::Execute(Event event) bot->addActionButton(actionButtonId, totemSpell, ACTION_BUTTON_SPELL); return true; } + +bool SetTotemAction::isUseful() +{ + Player* bot = botAI->GetBot(); + ActionButton const* button = bot->GetActionButton(actionButtonId); + if (!button || button->GetType() != ACTION_BUTTON_SPELL || button->GetAction() == 0) + return true; // No totem assigned + + // Find the highest rank the bot knows + uint32 highestKnown = 0; + for (int i = (int)totemSpellIdsCount - 1; i >= 0; --i) + { + if (bot->HasSpell(totemSpellIds[i])) + { + highestKnown = totemSpellIds[i]; + break; + } + } + if (!highestKnown) + return false; // Bot doesn't know any valid rank + + // Only consider the bar set if the highest rank is assigned + return button->GetAction() != highestKnown; +} diff --git a/src/strategy/shaman/ShamanActions.h b/src/strategy/shaman/ShamanActions.h index 4d64bb1d2d..a3d57102c1 100644 --- a/src/strategy/shaman/ShamanActions.h +++ b/src/strategy/shaman/ShamanActions.h @@ -531,12 +531,14 @@ class CastNatureResistanceTotemAction : public CastTotemAction class SetTotemAction : public Action { public: - SetTotemAction(PlayerbotAI* botAI, std::string const totemName, const uint32 totemSpellIds[], int actionButtonId) - : Action(botAI, "set " + totemName), totemSpellIds(totemSpellIds), actionButtonId(actionButtonId) + SetTotemAction(PlayerbotAI* botAI, std::string const totemName, const uint32 totemSpellIds[], size_t totemSpellIdsCount, int actionButtonId) + : Action(botAI, "set " + totemName), totemSpellIds(totemSpellIds), totemSpellIdsCount(totemSpellIdsCount), actionButtonId(actionButtonId) { } bool Execute(Event event) override; + bool isUseful() override; uint32 const* totemSpellIds; + size_t totemSpellIdsCount; int actionButtonId; }; @@ -544,119 +546,119 @@ class SetStrengthOfEarthTotemAction : public SetTotemAction { public: SetStrengthOfEarthTotemAction(PlayerbotAI* ai) - : SetTotemAction(ai, "strength of earth totem", STRENGTH_OF_EARTH_TOTEM, TOTEM_BAR_SLOT_EARTH) {} + : SetTotemAction(ai, "strength of earth totem", STRENGTH_OF_EARTH_TOTEM, sizeof(STRENGTH_OF_EARTH_TOTEM)/sizeof(uint32), TOTEM_BAR_SLOT_EARTH) {} }; class SetStoneskinTotemAction : public SetTotemAction { public: SetStoneskinTotemAction(PlayerbotAI* ai) - : SetTotemAction(ai, "stoneskin totem", STONESKIN_TOTEM, TOTEM_BAR_SLOT_EARTH) {} + : SetTotemAction(ai, "stoneskin totem", STONESKIN_TOTEM, sizeof(STONESKIN_TOTEM)/sizeof(uint32), TOTEM_BAR_SLOT_EARTH) {} }; class SetTremorTotemAction : public SetTotemAction { public: SetTremorTotemAction(PlayerbotAI* ai) - : SetTotemAction(ai, "tremor totem", TREMOR_TOTEM, TOTEM_BAR_SLOT_EARTH) {} + : SetTotemAction(ai, "tremor totem", TREMOR_TOTEM, sizeof(TREMOR_TOTEM)/sizeof(uint32), TOTEM_BAR_SLOT_EARTH) {} }; class SetEarthbindTotemAction : public SetTotemAction { public: SetEarthbindTotemAction(PlayerbotAI* ai) - : SetTotemAction(ai, "earthbind totem", EARTHBIND_TOTEM, TOTEM_BAR_SLOT_EARTH) {} + : SetTotemAction(ai, "earthbind totem", EARTHBIND_TOTEM, sizeof(EARTHBIND_TOTEM)/sizeof(uint32), TOTEM_BAR_SLOT_EARTH) {} }; class SetSearingTotemAction : public SetTotemAction { public: SetSearingTotemAction(PlayerbotAI* ai) - : SetTotemAction(ai, "searing totem", SEARING_TOTEM, TOTEM_BAR_SLOT_FIRE) {} + : SetTotemAction(ai, "searing totem", SEARING_TOTEM, sizeof(SEARING_TOTEM)/sizeof(uint32), TOTEM_BAR_SLOT_FIRE) {} }; class SetMagmaTotemAction : public SetTotemAction { public: SetMagmaTotemAction(PlayerbotAI* ai) - : SetTotemAction(ai, "magma totem", MAGMA_TOTEM, TOTEM_BAR_SLOT_FIRE) {} + : SetTotemAction(ai, "magma totem", MAGMA_TOTEM, sizeof(MAGMA_TOTEM)/sizeof(uint32), TOTEM_BAR_SLOT_FIRE) {} }; class SetFlametongueTotemAction : public SetTotemAction { public: SetFlametongueTotemAction(PlayerbotAI* ai) - : SetTotemAction(ai, "flametongue totem", FLAMETONGUE_TOTEM, TOTEM_BAR_SLOT_FIRE) {} + : SetTotemAction(ai, "flametongue totem", FLAMETONGUE_TOTEM, sizeof(FLAMETONGUE_TOTEM)/sizeof(uint32), TOTEM_BAR_SLOT_FIRE) {} }; class SetTotemOfWrathAction : public SetTotemAction { public: SetTotemOfWrathAction(PlayerbotAI* ai) - : SetTotemAction(ai, "totem of wrath", TOTEM_OF_WRATH, TOTEM_BAR_SLOT_FIRE) {} + : SetTotemAction(ai, "totem of wrath", TOTEM_OF_WRATH, sizeof(TOTEM_OF_WRATH)/sizeof(uint32), TOTEM_BAR_SLOT_FIRE) {} }; class SetFrostResistanceTotemAction : public SetTotemAction { public: SetFrostResistanceTotemAction(PlayerbotAI* ai) - : SetTotemAction(ai, "frost resistance totem", FROST_RESISTANCE_TOTEM, TOTEM_BAR_SLOT_FIRE) {} + : SetTotemAction(ai, "frost resistance totem", FROST_RESISTANCE_TOTEM, sizeof(FROST_RESISTANCE_TOTEM)/sizeof(uint32), TOTEM_BAR_SLOT_FIRE) {} }; class SetHealingStreamTotemAction : public SetTotemAction { public: SetHealingStreamTotemAction(PlayerbotAI* ai) - : SetTotemAction(ai, "healing stream totem", HEALING_STREAM_TOTEM, TOTEM_BAR_SLOT_WATER) {} + : SetTotemAction(ai, "healing stream totem", HEALING_STREAM_TOTEM, sizeof(HEALING_STREAM_TOTEM)/sizeof(uint32), TOTEM_BAR_SLOT_WATER) {} }; class SetManaSpringTotemAction : public SetTotemAction { public: SetManaSpringTotemAction(PlayerbotAI* ai) - : SetTotemAction(ai, "mana spring totem", MANA_SPRING_TOTEM, TOTEM_BAR_SLOT_WATER) {} + : SetTotemAction(ai, "mana spring totem", MANA_SPRING_TOTEM, sizeof(MANA_SPRING_TOTEM)/sizeof(uint32), TOTEM_BAR_SLOT_WATER) {} }; class SetCleansingTotemAction : public SetTotemAction { public: SetCleansingTotemAction(PlayerbotAI* ai) - : SetTotemAction(ai, "cleansing totem", CLEANSING_TOTEM, TOTEM_BAR_SLOT_WATER) {} + : SetTotemAction(ai, "cleansing totem", CLEANSING_TOTEM, sizeof(CLEANSING_TOTEM)/sizeof(uint32), TOTEM_BAR_SLOT_WATER) {} }; class SetFireResistanceTotemAction : public SetTotemAction { public: SetFireResistanceTotemAction(PlayerbotAI* ai) - : SetTotemAction(ai, "fire resistance totem", FIRE_RESISTANCE_TOTEM, TOTEM_BAR_SLOT_WATER) {} + : SetTotemAction(ai, "fire resistance totem", FIRE_RESISTANCE_TOTEM, sizeof(FIRE_RESISTANCE_TOTEM)/sizeof(uint32), TOTEM_BAR_SLOT_WATER) {} }; class SetWrathOfAirTotemAction : public SetTotemAction { public: SetWrathOfAirTotemAction(PlayerbotAI* ai) - : SetTotemAction(ai, "wrath of air totem", WRATH_OF_AIR_TOTEM, TOTEM_BAR_SLOT_AIR) {} + : SetTotemAction(ai, "wrath of air totem", WRATH_OF_AIR_TOTEM, sizeof(WRATH_OF_AIR_TOTEM)/sizeof(uint32), TOTEM_BAR_SLOT_AIR) {} }; class SetWindfuryTotemAction : public SetTotemAction { public: SetWindfuryTotemAction(PlayerbotAI* ai) - : SetTotemAction(ai, "windfury totem", WINDFURY_TOTEM, TOTEM_BAR_SLOT_AIR) {} + : SetTotemAction(ai, "windfury totem", WINDFURY_TOTEM, sizeof(WINDFURY_TOTEM)/sizeof(uint32), TOTEM_BAR_SLOT_AIR) {} }; class SetNatureResistanceTotemAction : public SetTotemAction { public: SetNatureResistanceTotemAction(PlayerbotAI* ai) - : SetTotemAction(ai, "nature resistance totem", NATURE_RESISTANCE_TOTEM, TOTEM_BAR_SLOT_AIR) {} + : SetTotemAction(ai, "nature resistance totem", NATURE_RESISTANCE_TOTEM, sizeof(NATURE_RESISTANCE_TOTEM)/sizeof(uint32), TOTEM_BAR_SLOT_AIR) {} }; class SetGroundingTotemAction : public SetTotemAction { public: SetGroundingTotemAction(PlayerbotAI* ai) - : SetTotemAction(ai, "grounding totem", GROUNDING_TOTEM, TOTEM_BAR_SLOT_AIR) {} + : SetTotemAction(ai, "grounding totem", GROUNDING_TOTEM, sizeof(GROUNDING_TOTEM)/sizeof(uint32), TOTEM_BAR_SLOT_AIR) {} }; #endif From f35e39e19c075cd998902d7d928e561814cfe722 Mon Sep 17 00:00:00 2001 From: Spargel Date: Mon, 22 Sep 2025 03:00:29 -0500 Subject: [PATCH 012/151] Removing unnecessary variable --- src/strategy/shaman/ShamanActions.cpp | 13 +++---------- 1 file changed, 3 insertions(+), 10 deletions(-) diff --git a/src/strategy/shaman/ShamanActions.cpp b/src/strategy/shaman/ShamanActions.cpp index 5d5eff816e..c1cacad9fe 100644 --- a/src/strategy/shaman/ShamanActions.cpp +++ b/src/strategy/shaman/ShamanActions.cpp @@ -116,18 +116,11 @@ bool SetTotemAction::isUseful() return true; // No totem assigned // Find the highest rank the bot knows - uint32 highestKnown = 0; for (int i = (int)totemSpellIdsCount - 1; i >= 0; --i) { if (bot->HasSpell(totemSpellIds[i])) - { - highestKnown = totemSpellIds[i]; - break; - } + return button->GetAction() != totemSpellIds[i]; } - if (!highestKnown) - return false; // Bot doesn't know any valid rank - - // Only consider the bar set if the highest rank is assigned - return button->GetAction() != highestKnown; + // Bot doesn't know any valid rank + return false; } From 103c738ce02331de81dc9c6e8a05a19e88b1ac84 Mon Sep 17 00:00:00 2001 From: Tecc Date: Thu, 25 Sep 2025 11:55:18 +0200 Subject: [PATCH 013/151] Add support for Wintergrasp battleground strategies Introduces dedicated strategies and triggers for Wintergrasp, focusing on vehicle-centric behavior and siege objectives. Updates battleground type handling and strategy initialization to include Wintergrasp, ensuring consistent support across all relevant components. --- src/AiFactory.cpp | 4 ++ src/strategy/StrategyContext.h | 2 + .../actions/BattleGroundJoinAction.cpp | 58 ++++++++++--------- src/strategy/generic/BattlegroundStrategy.cpp | 25 ++++++++ src/strategy/generic/BattlegroundStrategy.h | 10 ++++ 5 files changed, 73 insertions(+), 26 deletions(-) diff --git a/src/AiFactory.cpp b/src/AiFactory.cpp index 9bf3c5512f..c47e2fc451 100644 --- a/src/AiFactory.cpp +++ b/src/AiFactory.cpp @@ -763,6 +763,10 @@ void AiFactory::AddDefaultNonCombatStrategies(Player* player, PlayerbotAI* const if (bgType == BATTLEGROUND_IC) nonCombatEngine->addStrategy("isle", false); + // If Wintergrasp is available as an instanced battleground, prefer a dedicated strategy + if (bgType == BATTLEGROUND_WG) + nonCombatEngine->addStrategy("wintergrasp", false); + if (player->InArena()) { nonCombatEngine->addStrategy("arena", false); diff --git a/src/strategy/StrategyContext.h b/src/strategy/StrategyContext.h index ff16df1afe..1762165278 100644 --- a/src/strategy/StrategyContext.h +++ b/src/strategy/StrategyContext.h @@ -101,6 +101,7 @@ class StrategyContext : public NamedObjectContext creators["arathi"] = &StrategyContext::arathi; creators["eye"] = &StrategyContext::eye; creators["isle"] = &StrategyContext::isle; + creators["wintergrasp"] = &StrategyContext::wintergrasp; creators["arena"] = &StrategyContext::arena; creators["mount"] = &StrategyContext::mount; creators["rtsc"] = &StrategyContext::rtsc; @@ -170,6 +171,7 @@ class StrategyContext : public NamedObjectContext static Strategy* arathi(PlayerbotAI* botAI) { return new ArathiStrategy(botAI); } static Strategy* eye(PlayerbotAI* botAI) { return new EyeStrategy(botAI); } static Strategy* isle(PlayerbotAI* botAI) { return new IsleStrategy(botAI); } + static Strategy* wintergrasp(PlayerbotAI* botAI) { return new WintergraspStrategy(botAI); } static Strategy* arena(PlayerbotAI* botAI) { return new ArenaStrategy(botAI); } static Strategy* rtsc(PlayerbotAI* botAI) { return new RTSCStrategy(botAI); } static Strategy* attack_tagged(PlayerbotAI* botAI) { return new AttackTaggedStrategy(botAI); } diff --git a/src/strategy/actions/BattleGroundJoinAction.cpp b/src/strategy/actions/BattleGroundJoinAction.cpp index 1877a5f273..b13e7d56ba 100644 --- a/src/strategy/actions/BattleGroundJoinAction.cpp +++ b/src/strategy/actions/BattleGroundJoinAction.cpp @@ -456,32 +456,35 @@ bool BGJoinAction::JoinQueue(uint32 type) // in wotlk only arena requires battlemaster guid // ObjectGuid guid = isArena ? unit->GetGUID() : bot->GetGUID(); //not used, line marked for removal. - switch (bgTypeId) - { - case BATTLEGROUND_AV: - _bgType = "AV"; - break; - case BATTLEGROUND_WS: - _bgType = "WSG"; - break; - case BATTLEGROUND_AB: - _bgType = "AB"; - break; - case BATTLEGROUND_EY: - _bgType = "EotS"; - break; - case BATTLEGROUND_RB: - _bgType = "Random"; - break; - case BATTLEGROUND_SA: - _bgType = "SotA"; - break; - case BATTLEGROUND_IC: - _bgType = "IoC"; - break; - default: - break; - } + switch (bgTypeId) + { + case BATTLEGROUND_AV: + _bgType = "AV"; + break; + case BATTLEGROUND_WS: + _bgType = "WSG"; + break; + case BATTLEGROUND_AB: + _bgType = "AB"; + break; + case BATTLEGROUND_EY: + _bgType = "EotS"; + break; + case BATTLEGROUND_RB: + _bgType = "Random"; + break; + case BATTLEGROUND_SA: + _bgType = "SotA"; + break; + case BATTLEGROUND_IC: + _bgType = "IoC"; + break; + case BATTLEGROUND_WG: + _bgType = "WG"; + break; + default: + break; + } if (isArena) { @@ -853,6 +856,9 @@ bool BGStatusAction::Execute(Event event) case BATTLEGROUND_IC: _bgType = "IoC"; break; + case BATTLEGROUND_WG: + _bgType = "WG"; + break; default: break; } diff --git a/src/strategy/generic/BattlegroundStrategy.cpp b/src/strategy/generic/BattlegroundStrategy.cpp index ca30d5a21c..d4bfe5c787 100644 --- a/src/strategy/generic/BattlegroundStrategy.cpp +++ b/src/strategy/generic/BattlegroundStrategy.cpp @@ -84,6 +84,31 @@ void IsleStrategy::InitTriggers(std::vector& triggers) triggers.push_back(new TriggerNode("in vehicle", NextAction::array(0, new NextAction("glaive throw", ACTION_MOVE + 9.0f), nullptr))); } +// Wintergrasp is siege-focused like IoC but with different objectives. +// We keep initial behavior simple and vehicle-centric to be safe across cores: +// - Try to enter a vehicle frequently once active +// - Use generic vehicle abilities when in a vehicle +// Generic PvP and non-combat strategies added by AiFactory handle target selection and fighting. +void WintergraspStrategy::InitTriggers(std::vector& triggers) +{ + // Proactively try to get into a vehicle when the battle is active + triggers.push_back(new TriggerNode("bg active", NextAction::array(0, new NextAction("enter vehicle", ACTION_MOVE + 7.0f), nullptr))); + triggers.push_back(new TriggerNode("often", NextAction::array(0, new NextAction("enter vehicle", ACTION_MOVE + 6.5f), nullptr))); + + // Vehicle ability usage + triggers.push_back(new TriggerNode("in vehicle", NextAction::array(0, new NextAction("hurl boulder", ACTION_MOVE + 9.0f), nullptr))); + triggers.push_back(new TriggerNode("in vehicle", NextAction::array(0, new NextAction("fire cannon", ACTION_MOVE + 9.0f), nullptr))); + triggers.push_back(new TriggerNode("in vehicle", NextAction::array(0, new NextAction("incendiary rocket", ACTION_MOVE + 9.0f), nullptr))); + triggers.push_back(new TriggerNode("in vehicle", NextAction::array(0, new NextAction("rocket blast", ACTION_MOVE + 9.0f), nullptr))); + triggers.push_back(new TriggerNode("in vehicle", NextAction::array(0, new NextAction("napalm", ACTION_MOVE + 9.0f), nullptr))); + + // Close-quarters while in vehicles (steam/ram style interactions) + triggers.push_back(new TriggerNode("enemy is close", NextAction::array(0, new NextAction("steam blast", ACTION_MOVE + 9.0f), nullptr))); + triggers.push_back(new TriggerNode("in vehicle", NextAction::array(0, new NextAction("ram", ACTION_MOVE + 9.0f), nullptr))); + triggers.push_back(new TriggerNode("enemy is close", NextAction::array(0, new NextAction("ram", ACTION_MOVE + 9.1f), nullptr))); + triggers.push_back(new TriggerNode("enemy out of melee", NextAction::array(0, new NextAction("steam rush", ACTION_MOVE + 9.2f), nullptr))); +} + void ArenaStrategy::InitTriggers(std::vector& triggers) { triggers.push_back( diff --git a/src/strategy/generic/BattlegroundStrategy.h b/src/strategy/generic/BattlegroundStrategy.h index 3f535248b2..958ca5db3b 100644 --- a/src/strategy/generic/BattlegroundStrategy.h +++ b/src/strategy/generic/BattlegroundStrategy.h @@ -78,6 +78,16 @@ class IsleStrategy : public Strategy std::string const getName() override { return "isle"; } }; +class WintergraspStrategy : public Strategy +{ +public: + WintergraspStrategy(PlayerbotAI* botAI) : Strategy(botAI){}; + + uint32 GetType() const override { return STRATEGY_TYPE_GENERIC; } + void InitTriggers(std::vector& triggers) override; + std::string const getName() override { return "wintergrasp"; } +}; + class ArenaStrategy : public Strategy { public: From 7dcd4d0484b89288d15f2b2985607f3a60cf563e Mon Sep 17 00:00:00 2001 From: Tecc Date: Thu, 25 Sep 2025 12:06:05 +0200 Subject: [PATCH 014/151] Adds Wintergrasp battleground support with conditional logic Introduces support for Wintergrasp as an instanced battleground, including strategy handling, tactical decision-making, and pathing adjustments. - Conditionally includes Wintergrasp-specific logic based on availability. - Updates battleground strategy initialization to include Wintergrasp when enabled. - Implements minimal Wintergrasp stubs for paths and flags to prevent crashes. - Adjusts tactical behavior to pursue nearby enemies or maintain position. These changes enhance compatibility and improve bot behavior in Wintergrasp scenarios. --- src/AiFactory.cpp | 9 +++- .../actions/BattleGroundJoinAction.cpp | 22 +++++---- src/strategy/actions/BattleGroundTactics.cpp | 45 +++++++++++++++++-- 3 files changed, 61 insertions(+), 15 deletions(-) diff --git a/src/AiFactory.cpp b/src/AiFactory.cpp index c47e2fc451..512d8deec4 100644 --- a/src/AiFactory.cpp +++ b/src/AiFactory.cpp @@ -744,8 +744,11 @@ void AiFactory::AddDefaultNonCombatStrategies(Player* player, PlayerbotAI* const if (bgType == BATTLEGROUND_RB) bgType = player->GetBattleground()->GetBgTypeID(true); - if ((bgType <= BATTLEGROUND_EY || bgType == BATTLEGROUND_IC) && - !player->InArena()) // do not add for not supported bg or arena + bool addBgGeneric = (bgType <= BATTLEGROUND_EY || bgType == BATTLEGROUND_IC); +#ifdef BATTLEGROUND_WG + addBgGeneric = addBgGeneric || (bgType == BATTLEGROUND_WG); +#endif + if (addBgGeneric && !player->InArena()) nonCombatEngine->addStrategy("battleground", false); if (bgType == BATTLEGROUND_WS) @@ -764,8 +767,10 @@ void AiFactory::AddDefaultNonCombatStrategies(Player* player, PlayerbotAI* const nonCombatEngine->addStrategy("isle", false); // If Wintergrasp is available as an instanced battleground, prefer a dedicated strategy +#ifdef BATTLEGROUND_WG if (bgType == BATTLEGROUND_WG) nonCombatEngine->addStrategy("wintergrasp", false); +#endif if (player->InArena()) { diff --git a/src/strategy/actions/BattleGroundJoinAction.cpp b/src/strategy/actions/BattleGroundJoinAction.cpp index b13e7d56ba..2b85805cf2 100644 --- a/src/strategy/actions/BattleGroundJoinAction.cpp +++ b/src/strategy/actions/BattleGroundJoinAction.cpp @@ -476,15 +476,17 @@ bool BGJoinAction::JoinQueue(uint32 type) case BATTLEGROUND_SA: _bgType = "SotA"; break; - case BATTLEGROUND_IC: - _bgType = "IoC"; - break; - case BATTLEGROUND_WG: - _bgType = "WG"; - break; - default: - break; - } + case BATTLEGROUND_IC: + _bgType = "IoC"; + break; +#ifdef BATTLEGROUND_WG + case BATTLEGROUND_WG: + _bgType = "WG"; + break; +#endif + default: + break; + } if (isArena) { @@ -856,9 +858,11 @@ bool BGStatusAction::Execute(Event event) case BATTLEGROUND_IC: _bgType = "IoC"; break; +#ifdef BATTLEGROUND_WG case BATTLEGROUND_WG: _bgType = "WG"; break; +#endif default: break; } diff --git a/src/strategy/actions/BattleGroundTactics.cpp b/src/strategy/actions/BattleGroundTactics.cpp index f5e42d98da..213cc2782e 100644 --- a/src/strategy/actions/BattleGroundTactics.cpp +++ b/src/strategy/actions/BattleGroundTactics.cpp @@ -1596,6 +1596,7 @@ bool BGTactics::Execute(Event event) vFlagIds = &vFlagsAV; break; } + case BATTLEGROUND_WS: { vPaths = &vPaths_WS; @@ -1614,6 +1615,16 @@ bool BGTactics::Execute(Event event) vFlagIds = &vFlagsIC; break; } +#ifdef BATTLEGROUND_WG + case BATTLEGROUND_WG: + { + // Minimal Wintergrasp stub: no predefined paths/flags here. + // Strategy and vehicle usage are handled by WintergraspStrategy triggers. + vPaths = nullptr; + vFlagIds = nullptr; + break; + } +#endif default: // can't use this in this BG - no vPaths/vFlagIds (will crash server) botAI->ResetStrategies(); @@ -1669,7 +1680,7 @@ bool BGTactics::Execute(Event event) return true; } - if (vFlagIds && atFlag(*vPaths, *vFlagIds)) + if (vPaths && vFlagIds && atFlag(*vPaths, *vFlagIds)) return true; if (useBuff()) @@ -1684,18 +1695,20 @@ bool BGTactics::Execute(Event event) } if (!moveToObjective(false)) - if (!selectObjectiveWp(*vPaths)) + { + if (!vPaths || !selectObjectiveWp(*vPaths)) return moveToObjective(true); + } // bot with flag should only move to objective if (bot->HasAura(BG_WS_SPELL_WARSONG_FLAG) || bot->HasAura(BG_WS_SPELL_SILVERWING_FLAG) || bot->HasAura(BG_EY_NETHERSTORM_FLAG_SPELL)) return false; - if (!startNewPathBegin(*vPaths)) + if (!vPaths || !startNewPathBegin(*vPaths)) return moveToObjective(true); - if (!startNewPathFree(*vPaths)) + if (!vPaths || !startNewPathFree(*vPaths)) return moveToObjective(true); } @@ -1832,6 +1845,14 @@ bool BGTactics::moveToStart(bool force) IC_WAITING_POS_ALLIANCE.GetPositionZ()); } } + #ifdef BATTLEGROUND_WG + else if (bgType == BATTLEGROUND_WG) + { + // Minimal WG: no fixed waiting positions to avoid bad coordinates. + // Keep position; vehicles/engagement handled by strategies. + return true; + } + #endif return true; } @@ -2139,6 +2160,22 @@ bool BGTactics::selectObjective(bool reset) break; } +#ifdef BATTLEGROUND_WG + case BATTLEGROUND_WG: + { + // Minimal WG objective: pursue nearest enemy player if any; else no-op. + if (Unit* enemy = AI_VALUE(Unit*, "enemy player target")) + { + if (bot->GetDistance(enemy) < 500.0f) + { + pos.Set(enemy->GetPositionX(), enemy->GetPositionY(), enemy->GetPositionZ(), bot->GetMapId()); + posMap["bg objective"] = pos; + return true; + } + } + break; + } +#endif case BATTLEGROUND_WS: { Position target; From c023178be4b5fe87f8be7d473678b83d01133d46 Mon Sep 17 00:00:00 2001 From: Tecc Date: Thu, 25 Sep 2025 12:08:45 +0200 Subject: [PATCH 015/151] Prioritize Wintergrasp in battleground queue selection --- .../actions/BattleGroundJoinAction.cpp | 20 +++++++++++++++++++ 1 file changed, 20 insertions(+) diff --git a/src/strategy/actions/BattleGroundJoinAction.cpp b/src/strategy/actions/BattleGroundJoinAction.cpp index 2b85805cf2..bb99cdc2ac 100644 --- a/src/strategy/actions/BattleGroundJoinAction.cpp +++ b/src/strategy/actions/BattleGroundJoinAction.cpp @@ -380,6 +380,26 @@ bool BGJoinAction::isUseful() } } +#ifdef BATTLEGROUND_WG + // Prefer Wintergrasp if it is available among eligible queues + if (!bgList.empty()) + { + std::vector prioritized; + prioritized.reserve(bgList.size()); + for (uint32 q : bgList) + { + if (BattlegroundMgr::BGTemplateId((BattlegroundQueueTypeId)q) == BATTLEGROUND_WG) + prioritized.push_back(q); + } + for (uint32 q : bgList) + { + if (BattlegroundMgr::BGTemplateId((BattlegroundQueueTypeId)q) != BATTLEGROUND_WG) + prioritized.push_back(q); + } + bgList.swap(prioritized); + } +#endif + if (!bgList.empty()) return true; From 2c3e7a0c560601b95886a54d667bc4de116dc6aa Mon Sep 17 00:00:00 2001 From: Tecc Date: Thu, 25 Sep 2025 12:20:35 +0200 Subject: [PATCH 016/151] Add Wintergrasp capture interactions and vehicle entry requirements --- src/strategy/actions/BattleGroundTactics.cpp | 41 ++++++++++++++++++-- src/strategy/actions/VehicleActions.cpp | 14 +++++++ 2 files changed, 51 insertions(+), 4 deletions(-) diff --git a/src/strategy/actions/BattleGroundTactics.cpp b/src/strategy/actions/BattleGroundTactics.cpp index 213cc2782e..a5d7a23082 100644 --- a/src/strategy/actions/BattleGroundTactics.cpp +++ b/src/strategy/actions/BattleGroundTactics.cpp @@ -170,6 +170,17 @@ std::vector const vFlagsIC = {GO_HORDE_BANNER, GO_HORDE_BANNER_GRAVEYARD_H, GO_HORDE_BANNER_GRAVEYARD_H_CONT}; +// Wintergrasp capture/interaction objects (Trinity 3.3.5 IDs) +// - Factory banners: capture points for workshops +// - Titan's Relic: game-ending interactable for attackers +std::vector const vFlagsWG = { + 190475, // GO_WINTERGRASP_FACTORY_BANNER_NE + 190487, // GO_WINTERGRASP_FACTORY_BANNER_NW + 194959, // GO_WINTERGRASP_FACTORY_BANNER_SE + 194962, // GO_WINTERGRASP_FACTORY_BANNER_SW + 192829 // GO_WINTERGRASP_TITAN_S_RELIC +}; + // BG Waypoints (vmangos) // Horde Flag Room to Horde Graveyard @@ -1618,10 +1629,9 @@ bool BGTactics::Execute(Event event) #ifdef BATTLEGROUND_WG case BATTLEGROUND_WG: { - // Minimal Wintergrasp stub: no predefined paths/flags here. - // Strategy and vehicle usage are handled by WintergraspStrategy triggers. + // For now, no predefined waypoint paths; enable capture interactions via banners/relic vPaths = nullptr; - vFlagIds = nullptr; + vFlagIds = &vFlagsWG; break; } #endif @@ -1680,7 +1690,7 @@ bool BGTactics::Execute(Event event) return true; } - if (vPaths && vFlagIds && atFlag(*vPaths, *vFlagIds)) + if (vFlagIds && atFlag(vPaths ? *vPaths : std::vector{}, *vFlagIds)) return true; if (useBuff()) @@ -3621,6 +3631,9 @@ bool BGTactics::atFlag(std::vector const& vPaths, std::vectorGetValue("closest game objects"); @@ -3774,7 +3787,27 @@ bool BGTactics::atFlag(std::vector const& vPaths, std::vectorGetEntry() == 192829) // GO_WINTERGRASP_TITAN_S_RELIC + { + if (dist < INTERACTION_DISTANCE) + { + WorldPacket data(CMSG_GAMEOBJ_USE); + data << go->GetGUID(); + bot->GetSession()->HandleGameObjectUseOpcode(data); + resetObjective(); + return true; + } + else + { + return MoveTo(bot->GetMapId(), go->GetPositionX(), go->GetPositionY(), go->GetPositionZ()); + } + } + // Prevent capturing from inside flag pole if (dist == 0.0f) { diff --git a/src/strategy/actions/VehicleActions.cpp b/src/strategy/actions/VehicleActions.cpp index ac33eeadaf..9c2d17a531 100644 --- a/src/strategy/actions/VehicleActions.cpp +++ b/src/strategy/actions/VehicleActions.cpp @@ -14,6 +14,12 @@ #include "Unit.h" #include "Vehicle.h" +// Wintergrasp rank auras (from TC 3.3.5 BattlefieldWG.h) +static constexpr uint32 WG_SPELL_RECRUIT = 37795; +static constexpr uint32 WG_SPELL_CORPORAL = 33280; +static constexpr uint32 WG_SPELL_LIEUTENANT = 55629; +static constexpr uint32 WG_ZONE_ID = 4197; // Wintergrasp Zone + // TODO methods to enter/exit vehicle should be added to BGTactics or MovementAction (so that we can better control // whether bot is in vehicle, eg: get out of vehicle to cap flag, if we're down to final boss, etc), // right now they will enter vehicle based only what's available here, then they're stuck in vehicle until they die @@ -24,6 +30,14 @@ bool EnterVehicleAction::Execute(Event event) if (bot->GetVehicle()) return false; + // In Wintergrasp, require rank aura before entering vehicles + if (bot->GetZoneId() == WG_ZONE_ID) + { + bool hasRank = bot->HasAura(WG_SPELL_RECRUIT) || bot->HasAura(WG_SPELL_CORPORAL) || bot->HasAura(WG_SPELL_LIEUTENANT); + if (!hasRank) + return false; + } + Player* master = botAI->GetMaster(); // Triggered by a chat command if (event.getOwner() && master && master->GetTarget()) From 4dba5785d27dd4197f2d77ae8accac036350baa9 Mon Sep 17 00:00:00 2001 From: Tecc Date: Thu, 25 Sep 2025 12:24:48 +0200 Subject: [PATCH 017/151] Add key positions and objective selection logic for Wintergrasp battleground --- src/strategy/actions/BattleGroundTactics.cpp | 75 ++++++++++++++++++-- 1 file changed, 68 insertions(+), 7 deletions(-) diff --git a/src/strategy/actions/BattleGroundTactics.cpp b/src/strategy/actions/BattleGroundTactics.cpp index a5d7a23082..4de0c6ff84 100644 --- a/src/strategy/actions/BattleGroundTactics.cpp +++ b/src/strategy/actions/BattleGroundTactics.cpp @@ -103,6 +103,16 @@ Position const IC_CANNON_POS_ALLIANCE2 = {425.525f, -779.538f, 87.717f, 5.88f}; Position const IC_GATE_ATTACK_POS_HORDE = {506.782f, -828.594f, 24.313f, 0.0f}; Position const IC_GATE_ATTACK_POS_ALLIANCE = {1091.273f, -763.619f, 42.352f, 0.0f}; +// Wintergrasp key positions (from TC 3.3.5) +// Fortress outer gate (siege focus for attackers) +static Position const WG_GATE_POS = {5162.991f, 2841.232f, 410.1892f, -3.132858f}; +// Titan's Relic (final objective for attackers) +static Position const WG_RELIC_POS = {5440.379f, 2840.493f, 430.2816f, -1.832595f}; +// Southern/external towers (attacker siege boosters / defender priorities) +static Position const WG_TOWER_W_POS = {4557.173f, 3623.943f, 395.8828f, 1.675516f}; +static Position const WG_TOWER_S_POS = {4398.172f, 2822.497f, 405.6270f, -3.124123f}; +static Position const WG_TOWER_E_POS = {4459.105f, 1944.326f, 434.9912f, -2.002762f}; + enum BattleBotWsgWaitSpot { BB_WSG_WAIT_SPOT_SPAWN, @@ -2173,17 +2183,68 @@ bool BGTactics::selectObjective(bool reset) #ifdef BATTLEGROUND_WG case BATTLEGROUND_WG: { - // Minimal WG objective: pursue nearest enemy player if any; else no-op. - if (Unit* enemy = AI_VALUE(Unit*, "enemy player target")) + // Try to push siege objectives; fall back to local PvP + // 1) If relic is interactible and close enough, go there + // 2) Otherwise move to a gate or a southern tower, depending on role + // 3) If a workshop banner is visible nearby, prefer that + + // Prefer nearby banners (workshops) first if visible + GuidVector noLosObjects = AI_VALUE(GuidVector, "nearest game objects no los"); + GameObject* nearestBanner = nullptr; + float bestBannerDist = FLT_MAX; + for (ObjectGuid const& gid : noLosObjects) { - if (bot->GetDistance(enemy) < 500.0f) + GameObject* go = botAI->GetGameObject(gid); + if (!go) + continue; + if (std::find(vFlagsWG.begin(), vFlagsWG.end(), go->GetEntry()) == vFlagsWG.end()) + continue; + if (go->GetEntry() == 192829) // Relic handled below + continue; + float d = bot->GetDistance(go); + if (d < bestBannerDist) { - pos.Set(enemy->GetPositionX(), enemy->GetPositionY(), enemy->GetPositionZ(), bot->GetMapId()); - posMap["bg objective"] = pos; - return true; + bestBannerDist = d; + nearestBanner = go; } } - break; + if (nearestBanner) + { + pos.Set(nearestBanner->GetPositionX(), nearestBanner->GetPositionY(), nearestBanner->GetPositionZ(), bot->GetMapId()); + posMap["bg objective"] = pos; + return true; + } + + // Randomize between siege targets to spread bots + uint8 role = context->GetValue("bg role")->Get(); + + // If close to relic, go for it + if (bot->GetDistance(WG_RELIC_POS) < 200.0f) + { + pos.Set(WG_RELIC_POS.GetPositionX(), WG_RELIC_POS.GetPositionY(), WG_RELIC_POS.GetPositionZ(), bot->GetMapId()); + posMap["bg objective"] = pos; + // Set siege target as well for vehicle aim + PositionInfo siege = posMap["bg siege"]; + siege.Set(pos.x, pos.y, pos.z, pos.mapId); + posMap["bg siege"] = siege; + return true; + } + + // Choose a siege objective: gate (primary), or one of the southern towers + Position siegeTarget = WG_GATE_POS; + if (role % 3 == 1) + siegeTarget = WG_TOWER_S_POS; + else if (role % 3 == 2) + siegeTarget = (bot->GetTeamId() == TEAM_ALLIANCE ? WG_TOWER_W_POS : WG_TOWER_E_POS); // simple side bias + + pos.Set(siegeTarget.GetPositionX(), siegeTarget.GetPositionY(), siegeTarget.GetPositionZ(), bot->GetMapId()); + posMap["bg objective"] = pos; + + // Also set siege aim position to help vehicle spells pick a destination + PositionInfo siege = posMap["bg siege"]; + siege.Set(pos.x, pos.y, pos.z, pos.mapId); + posMap["bg siege"] = siege; + return true; } #endif case BATTLEGROUND_WS: From e8b7036694b96f07e1f4ebe1b809292fccbe120c Mon Sep 17 00:00:00 2001 From: Tecc Date: Thu, 25 Sep 2025 12:34:16 +0200 Subject: [PATCH 018/151] Add minimal path definitions for Wintergrasp battleground navigation --- src/strategy/actions/BattleGroundTactics.cpp | 44 +++++++++++++++++++- src/strategy/actions/BattleGroundTactics.h | 3 ++ 2 files changed, 45 insertions(+), 2 deletions(-) diff --git a/src/strategy/actions/BattleGroundTactics.cpp b/src/strategy/actions/BattleGroundTactics.cpp index 4de0c6ff84..51f45a06c5 100644 --- a/src/strategy/actions/BattleGroundTactics.cpp +++ b/src/strategy/actions/BattleGroundTactics.cpp @@ -1215,6 +1215,46 @@ std::vector const vPaths_IC = { &vPath_IC_Hanger_to_Workshop, }; +#ifdef BATTLEGROUND_WG +// Minimal Wintergrasp paths to guide movement between key siege objectives +// West approach (from western tower area toward the fortress gate) +BattleBotPath vPath_WG_West_to_Gate = { + {4557.173f, 3623.943f, 395.883f, nullptr}, // Western tower area + {4700.000f, 3400.000f, 382.000f, nullptr}, + {4900.000f, 3200.000f, 392.000f, nullptr}, + {5050.000f, 3000.000f, 405.000f, nullptr}, + {5162.991f, 2841.232f, 410.189f, nullptr} // Fortress gate +}; + +// South approach (from southern tower area toward the fortress gate) +BattleBotPath vPath_WG_South_to_Gate = { + {4398.172f, 2822.497f, 405.627f, nullptr}, // Southern tower area + {4650.000f, 2825.000f, 410.000f, nullptr}, + {4900.000f, 2835.000f, 410.000f, nullptr}, + {5162.991f, 2841.232f, 410.189f, nullptr} // Fortress gate +}; + +// East approach (from eastern tower area toward the fortress gate) +BattleBotPath vPath_WG_East_to_Gate = { + {4459.105f, 1944.326f, 434.991f, nullptr}, // Eastern tower area + {4700.000f, 2300.000f, 430.000f, nullptr}, + {4950.000f, 2600.000f, 415.000f, nullptr}, + {5100.000f, 2750.000f, 410.000f, nullptr}, + {5162.991f, 2841.232f, 410.189f, nullptr} // Fortress gate +}; + +// Inside keep: from gate area to Titan's Relic +BattleBotPath vPath_WG_Gate_to_Relic = { + {5162.991f, 2841.232f, 410.189f, nullptr}, // Fortress gate + {5200.000f, 2840.000f, 418.000f, nullptr}, + {5300.000f, 2840.000f, 425.000f, nullptr}, + {5440.379f, 2840.493f, 430.282f, nullptr} // Titan's Relic +}; + +std::vector const vPaths_WG = {&vPath_WG_West_to_Gate, &vPath_WG_South_to_Gate, &vPath_WG_East_to_Gate, + &vPath_WG_Gate_to_Relic}; +#endif + std::vector const vPaths_NoReverseAllowed = { &vPath_WSG_AllianceGraveyardJump, &vPath_WSG_HordeGraveyardJump, @@ -1639,8 +1679,8 @@ bool BGTactics::Execute(Event event) #ifdef BATTLEGROUND_WG case BATTLEGROUND_WG: { - // For now, no predefined waypoint paths; enable capture interactions via banners/relic - vPaths = nullptr; + // Enable minimal WG paths and capture interactions via banners/relic + vPaths = &vPaths_WG; vFlagIds = &vFlagsWG; break; } diff --git a/src/strategy/actions/BattleGroundTactics.h b/src/strategy/actions/BattleGroundTactics.h index 6cfe377c2c..08f3961dea 100644 --- a/src/strategy/actions/BattleGroundTactics.h +++ b/src/strategy/actions/BattleGroundTactics.h @@ -101,6 +101,9 @@ extern std::vector const vPaths_AB; extern std::vector const vPaths_AV; extern std::vector const vPaths_EY; extern std::vector const vPaths_IC; +#ifdef BATTLEGROUND_WG +extern std::vector const vPaths_WG; +#endif class BGTactics : public MovementAction { From da07bbbcafe669da7d1a07cf51380568cad8d137 Mon Sep 17 00:00:00 2001 From: Tecc Date: Thu, 25 Sep 2025 12:48:09 +0200 Subject: [PATCH 019/151] Enhance Wintergrasp vehicle entry logic with rank requirements and role-based objective selection --- src/strategy/actions/BattleGroundTactics.cpp | 27 ++++++++--- src/strategy/actions/VehicleActions.cpp | 49 ++++++++++++++++---- 2 files changed, 62 insertions(+), 14 deletions(-) diff --git a/src/strategy/actions/BattleGroundTactics.cpp b/src/strategy/actions/BattleGroundTactics.cpp index 51f45a06c5..f3b30f27c9 100644 --- a/src/strategy/actions/BattleGroundTactics.cpp +++ b/src/strategy/actions/BattleGroundTactics.cpp @@ -2255,7 +2255,9 @@ bool BGTactics::selectObjective(bool reset) return true; } - // Randomize between siege targets to spread bots + // Heuristic attacker/defender awareness based on proximity to keep/relic + bool nearKeep = (bot->GetDistance(WG_RELIC_POS) < 300.0f) || (bot->GetDistance(WG_GATE_POS) < 350.0f); + bool isDefender = nearKeep; // approximate: defenders linger at/inside keep uint8 role = context->GetValue("bg role")->Get(); // If close to relic, go for it @@ -2270,12 +2272,25 @@ bool BGTactics::selectObjective(bool reset) return true; } - // Choose a siege objective: gate (primary), or one of the southern towers + // Choose a siege objective based on role and (approx) attacker/defender Position siegeTarget = WG_GATE_POS; - if (role % 3 == 1) - siegeTarget = WG_TOWER_S_POS; - else if (role % 3 == 2) - siegeTarget = (bot->GetTeamId() == TEAM_ALLIANCE ? WG_TOWER_W_POS : WG_TOWER_E_POS); // simple side bias + if (!isDefender) + { + // Attacker priorities + if (role % 3 == 1) + siegeTarget = WG_TOWER_S_POS; // debuff defenders' vehicles + else if (role % 3 == 2) + siegeTarget = (bot->GetTeamId() == TEAM_ALLIANCE ? WG_TOWER_W_POS : WG_TOWER_E_POS); + } + else + { + // Defender priorities + // Hold gate, or shift to nearest southern tower to defend + if (role % 2 == 1) + siegeTarget = WG_GATE_POS; + else + siegeTarget = (bot->GetTeamId() == TEAM_ALLIANCE ? WG_TOWER_E_POS : WG_TOWER_W_POS); + } pos.Set(siegeTarget.GetPositionX(), siegeTarget.GetPositionY(), siegeTarget.GetPositionZ(), bot->GetMapId()); posMap["bg objective"] = pos; diff --git a/src/strategy/actions/VehicleActions.cpp b/src/strategy/actions/VehicleActions.cpp index 9c2d17a531..52f605aa37 100644 --- a/src/strategy/actions/VehicleActions.cpp +++ b/src/strategy/actions/VehicleActions.cpp @@ -20,6 +20,34 @@ static constexpr uint32 WG_SPELL_CORPORAL = 33280; static constexpr uint32 WG_SPELL_LIEUTENANT = 55629; static constexpr uint32 WG_ZONE_ID = 4197; // Wintergrasp Zone +// Wintergrasp vehicle entries (Trinity 3.3.5) +static constexpr uint32 WG_ENTRY_SIEGE_ENGINE_A = 28312; +static constexpr uint32 WG_ENTRY_SIEGE_ENGINE_H = 32627; +static constexpr uint32 WG_ENTRY_CATAPULT = 27881; +static constexpr uint32 WG_ENTRY_DEMOLISHER = 28094; + +static inline bool HasWGRankAtLeast(Player* p) +{ + // Any of the rank auras qualifies as ranked; specific vehicle types may require higher ranks (checked below) + return p->HasAura(WG_SPELL_RECRUIT) || p->HasAura(WG_SPELL_CORPORAL) || p->HasAura(WG_SPELL_LIEUTENANT); +} + +static inline bool HasWGRankForVehicle(Player* p, uint32 vehicleEntry) +{ + // Conservative default: Corporal for catapult/demolisher, Lieutenant for siege engine + switch (vehicleEntry) + { + case WG_ENTRY_SIEGE_ENGINE_A: + case WG_ENTRY_SIEGE_ENGINE_H: + return p->HasAura(WG_SPELL_LIEUTENANT); + case WG_ENTRY_DEMOLISHER: + case WG_ENTRY_CATAPULT: + return p->HasAura(WG_SPELL_CORPORAL) || p->HasAura(WG_SPELL_LIEUTENANT); + default: + return HasWGRankAtLeast(p); + } +} + // TODO methods to enter/exit vehicle should be added to BGTactics or MovementAction (so that we can better control // whether bot is in vehicle, eg: get out of vehicle to cap flag, if we're down to final boss, etc), // right now they will enter vehicle based only what's available here, then they're stuck in vehicle until they die @@ -31,12 +59,9 @@ bool EnterVehicleAction::Execute(Event event) return false; // In Wintergrasp, require rank aura before entering vehicles - if (bot->GetZoneId() == WG_ZONE_ID) - { - bool hasRank = bot->HasAura(WG_SPELL_RECRUIT) || bot->HasAura(WG_SPELL_CORPORAL) || bot->HasAura(WG_SPELL_LIEUTENANT); - if (!hasRank) - return false; - } + bool inWG = (bot->GetZoneId() == WG_ZONE_ID); + if (inWG && !HasWGRankAtLeast(bot)) + return false; Player* master = botAI->GetMaster(); // Triggered by a chat command @@ -64,10 +89,18 @@ bool EnterVehicleAction::Execute(Event event) continue; // dont let them get in the cannons as they'll stay forever and do nothing useful - // dont let them in catapult they cant use them at all - if (NPC_KEEP_CANNON == vehicleBase->GetEntry() || NPC_CATAPULT == vehicleBase->GetEntry()) + // allow catapult only in Wintergrasp, not in IoC + if (NPC_KEEP_CANNON == vehicleBase->GetEntry()) continue; + // Enforce WG per-vehicle rank requirements when in WG + if (inWG) + { + uint32 entry = vehicleBase->GetEntry(); + if (!HasWGRankForVehicle(bot, entry)) + continue; + } + if (!vehicleBase->IsFriendlyTo(bot)) continue; From 697f16249db26088d4cb9efdbd1e90f509a9cf76 Mon Sep 17 00:00:00 2001 From: Tecc Date: Thu, 25 Sep 2025 12:53:42 +0200 Subject: [PATCH 020/151] Improve objective selection logic to prioritize capturable banners for the team --- src/strategy/actions/BattleGroundTactics.cpp | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/src/strategy/actions/BattleGroundTactics.cpp b/src/strategy/actions/BattleGroundTactics.cpp index f3b30f27c9..fd4e6dbb13 100644 --- a/src/strategy/actions/BattleGroundTactics.cpp +++ b/src/strategy/actions/BattleGroundTactics.cpp @@ -2241,8 +2241,11 @@ bool BGTactics::selectObjective(bool reset) continue; if (go->GetEntry() == 192829) // Relic handled below continue; + + // Prefer banners that are capturable for our team (enemy or neutral); fallback to proximity + bool canUse = bot->CanUseBattlegroundObject(go); float d = bot->GetDistance(go); - if (d < bestBannerDist) + if ((canUse && d < bestBannerDist) || (!nearestBanner && d < bestBannerDist)) { bestBannerDist = d; nearestBanner = go; From d62299ecc6a502fef4a253d258048f691dcc199a Mon Sep 17 00:00:00 2001 From: Tecc Date: Thu, 25 Sep 2025 13:34:08 +0200 Subject: [PATCH 021/151] Enhance objective selection logic to prioritize gate pushes based on nearby friendly vehicles in Wintergrasp --- src/strategy/actions/BattleGroundTactics.cpp | 46 ++++++++++++++++++-- 1 file changed, 43 insertions(+), 3 deletions(-) diff --git a/src/strategy/actions/BattleGroundTactics.cpp b/src/strategy/actions/BattleGroundTactics.cpp index fd4e6dbb13..e9730e992a 100644 --- a/src/strategy/actions/BattleGroundTactics.cpp +++ b/src/strategy/actions/BattleGroundTactics.cpp @@ -23,6 +23,7 @@ #include "BattlegroundWS.h" #include "Event.h" #include "IVMapMgr.h" +#include "BattlefieldMgr.h" #include "Playerbots.h" #include "PositionValue.h" #include "PvpTriggers.h" @@ -2228,6 +2229,31 @@ bool BGTactics::selectObjective(bool reset) // 2) Otherwise move to a gate or a southern tower, depending on role // 3) If a workshop banner is visible nearby, prefer that + // If we have enough friendly vehicles near the gate, push gate now + { + GuidVector nearbyVehicles = AI_VALUE(GuidVector, "nearest vehicles"); + uint32 friendlyAtGate = 0; + for (ObjectGuid const& vg : nearbyVehicles) + { + Unit* v = botAI->GetUnit(vg); + if (!v) + continue; + if (!v->IsFriendlyTo(bot)) + continue; + if (v->GetDistance(WG_GATE_POS) < 200.0f) + friendlyAtGate++; + } + if (friendlyAtGate >= 2) + { + pos.Set(WG_GATE_POS.GetPositionX(), WG_GATE_POS.GetPositionY(), WG_GATE_POS.GetPositionZ(), bot->GetMapId()); + posMap["bg objective"] = pos; + PositionInfo siege = posMap["bg siege"]; + siege.Set(pos.x, pos.y, pos.z, pos.mapId); + posMap["bg siege"] = siege; + return true; + } + } + // Prefer nearby banners (workshops) first if visible GuidVector noLosObjects = AI_VALUE(GuidVector, "nearest game objects no los"); GameObject* nearestBanner = nullptr; @@ -2258,9 +2284,23 @@ bool BGTactics::selectObjective(bool reset) return true; } - // Heuristic attacker/defender awareness based on proximity to keep/relic - bool nearKeep = (bot->GetDistance(WG_RELIC_POS) < 300.0f) || (bot->GetDistance(WG_GATE_POS) < 350.0f); - bool isDefender = nearKeep; // approximate: defenders linger at/inside keep + // Determine defender/attacker side based on battlefield state if possible + bool isDefender = false; + if (Battlefield* bf = sBattlefieldMgr->GetBattlefieldToZoneId(4197 /*Wintergrasp*/)) + { + isDefender = (bf->GetDefenderTeam() == bot->GetTeamId()); + } + else + { + // Fallback: prefer explicit control aura; last resort keep proximity heuristic + const uint32 WG_SPELL_ESSENCE_OF_WINTERGRASP = 58045; + isDefender = bot->HasAura(WG_SPELL_ESSENCE_OF_WINTERGRASP); + if (!isDefender) + { + bool nearKeep = (bot->GetDistance(WG_RELIC_POS) < 300.0f) || (bot->GetDistance(WG_GATE_POS) < 350.0f); + isDefender = nearKeep; + } + } uint8 role = context->GetValue("bg role")->Get(); // If close to relic, go for it From ac0aab83a9b7e0ec8d10541e03088d79901624f9 Mon Sep 17 00:00:00 2001 From: Tecc Date: Thu, 25 Sep 2025 14:29:57 +0200 Subject: [PATCH 022/151] Enhance Wintergrasp vehicle logic to improve entry conditions and role-based movement strategies --- src/strategy/actions/BattleGroundTactics.cpp | 70 +++++++++++++++++++- src/strategy/actions/VehicleActions.cpp | 16 +++-- 2 files changed, 79 insertions(+), 7 deletions(-) diff --git a/src/strategy/actions/BattleGroundTactics.cpp b/src/strategy/actions/BattleGroundTactics.cpp index e9730e992a..d8875d7572 100644 --- a/src/strategy/actions/BattleGroundTactics.cpp +++ b/src/strategy/actions/BattleGroundTactics.cpp @@ -114,6 +114,12 @@ static Position const WG_TOWER_W_POS = {4557.173f, 3623.943f, 395.8828f, 1.67551 static Position const WG_TOWER_S_POS = {4398.172f, 2822.497f, 405.6270f, -3.124123f}; static Position const WG_TOWER_E_POS = {4459.105f, 1944.326f, 434.9912f, -2.002762f}; +// WG vehicle entries (Trinity 3.3.5) +static constexpr uint32 WG_ENTRY_SIEGE_ENGINE_A = 28312; +static constexpr uint32 WG_ENTRY_SIEGE_ENGINE_H = 32627; +static constexpr uint32 WG_ENTRY_CATAPULT = 27881; +static constexpr uint32 WG_ENTRY_DEMOLISHER = 28094; + enum BattleBotWsgWaitSpot { BB_WSG_WAIT_SPOT_SPAWN, @@ -1909,9 +1915,38 @@ bool BGTactics::moveToStart(bool force) #ifdef BATTLEGROUND_WG else if (bgType == BATTLEGROUND_WG) { - // Minimal WG: no fixed waiting positions to avoid bad coordinates. - // Keep position; vehicles/engagement handled by strategies. - return true; + // Spread bots across lanes before battle start to avoid zerging one spot. + // Determine defender via battlefield state; defenders stage near the gate, attackers spread to lanes. + bool isDefender = false; + if (Battlefield* bf = sBattlefieldMgr->GetBattlefieldToZoneId(4197 /* Wintergrasp */)) + isDefender = (bf->GetDefenderTeam() == bot->GetTeamId()); + + uint32 role = context->GetValue("bg role")->Get(); + + if (isDefender) + { + // Three defensive anchor points near the gate: left, center, right (with small random offset) + std::array anchors = { + Position(WG_GATE_POS.GetPositionX() - 20.0f, WG_GATE_POS.GetPositionY() - 10.0f, WG_GATE_POS.GetPositionZ(), WG_GATE_POS.GetOrientation()), + Position(WG_GATE_POS.GetPositionX(), WG_GATE_POS.GetPositionY(), WG_GATE_POS.GetPositionZ(), WG_GATE_POS.GetOrientation()), + Position(WG_GATE_POS.GetPositionX() + 20.0f, WG_GATE_POS.GetPositionY() + 10.0f, WG_GATE_POS.GetPositionZ(), WG_GATE_POS.GetOrientation()) + }; + + Position p = anchors[role % anchors.size()]; + return MoveTo(bg->GetMapId(), p.GetPositionX() + frand(-5.0f, 5.0f), p.GetPositionY() + frand(-5.0f, 5.0f), p.GetPositionZ()); + } + else + { + // Attackers take lanes: West / South / East based on role slice + Position lane = WG_TOWER_S_POS; // default south + uint32 slice = role % 3; + if (slice == 0) + lane = WG_TOWER_W_POS; + else if (slice == 2) + lane = WG_TOWER_E_POS; + + return MoveTo(bg->GetMapId(), lane.GetPositionX() + frand(-8.0f, 8.0f), lane.GetPositionY() + frand(-8.0f, 8.0f), lane.GetPositionZ()); + } } #endif @@ -2315,6 +2350,35 @@ bool BGTactics::selectObjective(bool reset) return true; } + // Escort role: attackers with certain roles escort nearest friendly siege vehicle toward objective + if (!isDefender && (role % 4 == 3)) + { + GuidVector nearby = AI_VALUE(GuidVector, "nearest vehicles"); + Unit* best = nullptr; + float bestd = FLT_MAX; + for (ObjectGuid const& vg : nearby) + { + Unit* v = botAI->GetUnit(vg); + if (!v || !v->IsFriendlyTo(bot)) + continue; + uint32 ve = v->GetEntry(); + if (ve != WG_ENTRY_SIEGE_ENGINE_A && ve != WG_ENTRY_SIEGE_ENGINE_H && ve != WG_ENTRY_CATAPULT && ve != WG_ENTRY_DEMOLISHER) + continue; + float d = bot->GetDistance(v); + if (d < bestd) + { + bestd = d; + best = v; + } + } + if (best && bestd < 150.0f) + { + pos.Set(best->GetPositionX(), best->GetPositionY(), best->GetPositionZ(), bot->GetMapId()); + posMap["bg objective"] = pos; + return true; + } + } + // Choose a siege objective based on role and (approx) attacker/defender Position siegeTarget = WG_GATE_POS; if (!isDefender) diff --git a/src/strategy/actions/VehicleActions.cpp b/src/strategy/actions/VehicleActions.cpp index 52f605aa37..3c83fca937 100644 --- a/src/strategy/actions/VehicleActions.cpp +++ b/src/strategy/actions/VehicleActions.cpp @@ -13,6 +13,7 @@ #include "ServerFacade.h" #include "Unit.h" #include "Vehicle.h" +#include "BattlefieldMgr.h" // Wintergrasp rank auras (from TC 3.3.5 BattlefieldWG.h) static constexpr uint32 WG_SPELL_RECRUIT = 37795; @@ -88,15 +89,22 @@ bool EnterVehicleAction::Execute(Event event) if (vehicleBase->HasUnitFlag(UNIT_FLAG_NOT_SELECTABLE)) continue; - // dont let them get in the cannons as they'll stay forever and do nothing useful - // allow catapult only in Wintergrasp, not in IoC - if (NPC_KEEP_CANNON == vehicleBase->GetEntry()) + // dont let them get in IoC cannons; allow WG tower cannons for defenders + bool isWG = (bot->GetZoneId() == WG_ZONE_ID); + bool isWGDefender = false; + if (isWG) + { + if (Battlefield* bf = sBattlefieldMgr->GetBattlefieldToZoneId(WG_ZONE_ID)) + isWGDefender = (bf->GetDefenderTeam() == bot->GetTeamId()); + } + uint32 entry = vehicleBase->GetEntry(); + const uint32 WG_TOWER_CANNON_ENTRY = 28366; // NPC_WINTERGRASP_TOWER_CANNON + if (NPC_KEEP_CANNON == entry || (!isWGDefender && entry == WG_TOWER_CANNON_ENTRY)) continue; // Enforce WG per-vehicle rank requirements when in WG if (inWG) { - uint32 entry = vehicleBase->GetEntry(); if (!HasWGRankForVehicle(bot, entry)) continue; } From 73aa17a32e006deecfd138aa42af6677ae7bfd75 Mon Sep 17 00:00:00 2001 From: Tecc Date: Thu, 25 Sep 2025 14:50:41 +0200 Subject: [PATCH 023/151] Enhance objective selection for defenders to prioritize intercepting nearest enemy vehicles and adjust positioning for melee defenders at the gate --- src/strategy/actions/BattleGroundTactics.cpp | 42 +++++++++++++++++++- 1 file changed, 40 insertions(+), 2 deletions(-) diff --git a/src/strategy/actions/BattleGroundTactics.cpp b/src/strategy/actions/BattleGroundTactics.cpp index d8875d7572..bed8f5709b 100644 --- a/src/strategy/actions/BattleGroundTactics.cpp +++ b/src/strategy/actions/BattleGroundTactics.cpp @@ -2289,6 +2289,34 @@ bool BGTactics::selectObjective(bool reset) } } + // As defender: intercept nearest enemy vehicle first + if (isDefender) + { + GuidVector vehs = AI_VALUE(GuidVector, "nearest vehicles"); + Unit* enemyVeh = nullptr; + float evDist = FLT_MAX; + for (ObjectGuid const& vg : vehs) + { + Unit* v = botAI->GetUnit(vg); + if (!v || v->IsFriendlyTo(bot)) + continue; + float d = bot->GetDistance(v); + if (d < evDist) + { + evDist = d; + enemyVeh = v; + } + } + if (enemyVeh && evDist < 250.0f) + { + // Set the vehicle as objective and target + pos.Set(enemyVeh->GetPositionX(), enemyVeh->GetPositionY(), enemyVeh->GetPositionZ(), bot->GetMapId()); + posMap["bg objective"] = pos; + context->GetValue("current target")->Set(enemyVeh); + return true; + } + } + // Prefer nearby banners (workshops) first if visible GuidVector noLosObjects = AI_VALUE(GuidVector, "nearest game objects no los"); GameObject* nearestBanner = nullptr; @@ -2379,7 +2407,7 @@ bool BGTactics::selectObjective(bool reset) } } - // Choose a siege objective based on role and (approx) attacker/defender + // Choose a siege objective based on role and attacker/defender Position siegeTarget = WG_GATE_POS; if (!isDefender) { @@ -2399,7 +2427,17 @@ bool BGTactics::selectObjective(bool reset) siegeTarget = (bot->GetTeamId() == TEAM_ALLIANCE ? WG_TOWER_E_POS : WG_TOWER_W_POS); } - pos.Set(siegeTarget.GetPositionX(), siegeTarget.GetPositionY(), siegeTarget.GetPositionZ(), bot->GetMapId()); + // Slight flanking for melee defenders at gate to avoid clogging the chokepoint + if (isDefender && siegeTarget.GetPositionX() == WG_GATE_POS.GetPositionX() && !botAI->IsRanged(bot)) + { + float ox = (role % 2 == 0 ? -12.0f : 12.0f); + float oy = (role % 3 == 0 ? -6.0f : 6.0f); + pos.Set(WG_GATE_POS.GetPositionX() + ox, WG_GATE_POS.GetPositionY() + oy, WG_GATE_POS.GetPositionZ(), bot->GetMapId()); + } + else + { + pos.Set(siegeTarget.GetPositionX(), siegeTarget.GetPositionY(), siegeTarget.GetPositionZ(), bot->GetMapId()); + } posMap["bg objective"] = pos; // Also set siege aim position to help vehicle spells pick a destination From 98697349a1bbddd5cf066f85318af788ee36eeb8 Mon Sep 17 00:00:00 2001 From: Tecc Date: Thu, 25 Sep 2025 14:53:57 +0200 Subject: [PATCH 024/151] Enhance vehicle selection logic for defenders to prioritize tower cannons near the fortress gate in Wintergrasp --- src/strategy/actions/VehicleActions.cpp | 64 +++++++++++++++++++++---- 1 file changed, 56 insertions(+), 8 deletions(-) diff --git a/src/strategy/actions/VehicleActions.cpp b/src/strategy/actions/VehicleActions.cpp index 3c83fca937..22eb3cb199 100644 --- a/src/strategy/actions/VehicleActions.cpp +++ b/src/strategy/actions/VehicleActions.cpp @@ -14,6 +14,7 @@ #include "Unit.h" #include "Vehicle.h" #include "BattlefieldMgr.h" +#include "ServerFacade.h" // Wintergrasp rank auras (from TC 3.3.5 BattlefieldWG.h) static constexpr uint32 WG_SPELL_RECRUIT = 37795; @@ -26,6 +27,12 @@ static constexpr uint32 WG_ENTRY_SIEGE_ENGINE_A = 28312; static constexpr uint32 WG_ENTRY_SIEGE_ENGINE_H = 32627; static constexpr uint32 WG_ENTRY_CATAPULT = 27881; static constexpr uint32 WG_ENTRY_DEMOLISHER = 28094; +static constexpr uint32 WG_TOWER_CANNON_ENTRY = 28366; // NPC_WINTERGRASP_TOWER_CANNON + +// Wintergrasp key position (Gate) to detect fortress pressure +static constexpr float WG_GATE_X = 5162.991f; +static constexpr float WG_GATE_Y = 2841.232f; +static constexpr float WG_GATE_Z = 410.189f; static inline bool HasWGRankAtLeast(Player* p) { @@ -80,6 +87,55 @@ bool EnterVehicleAction::Execute(Event event) } GuidVector npcs = AI_VALUE(GuidVector, "nearest vehicles"); + + // Prefer tower cannons for defenders when enemies are attacking near the fortress gate + bool preferCannons = false; + bool isWG = (bot->GetZoneId() == WG_ZONE_ID); + bool isWGDefender = false; + if (isWG) + { + if (Battlefield* bf = sBattlefieldMgr->GetBattlefieldToZoneId(WG_ZONE_ID)) + isWGDefender = (bf->GetDefenderTeam() == bot->GetTeamId()); + + if (isWGDefender) + { + if (Unit* enemy = AI_VALUE(Unit*, "enemy player target")) + { + float dGateEnemy = enemy->GetDistance(WG_GATE_X, WG_GATE_Y, WG_GATE_Z); + preferCannons = (dGateEnemy < 250.0f); + } + } + } + + if (preferCannons) + { + Unit* bestCannon = nullptr; + float bestDist = FLT_MAX; + for (auto const& guid : npcs) + { + Unit* v = botAI->GetUnit(guid); + if (!v) + continue; + if (v->GetEntry() != WG_TOWER_CANNON_ENTRY) + continue; + if (!v->IsFriendlyTo(bot)) + continue; + Vehicle* veh = v->GetVehicleKit(); + if (!veh || !veh->GetAvailableSeatCount() || veh->IsVehicleInUse()) + continue; + float d = sServerFacade->GetDistance2d(bot, v); + if (d < bestDist) + { + bestDist = d; + bestCannon = v; + } + } + if (bestCannon) + { + if (EnterVehicle(bestCannon, true)) + return true; + } + } for (GuidVector::iterator i = npcs.begin(); i != npcs.end(); i++) { Unit* vehicleBase = botAI->GetUnit(*i); @@ -90,15 +146,7 @@ bool EnterVehicleAction::Execute(Event event) continue; // dont let them get in IoC cannons; allow WG tower cannons for defenders - bool isWG = (bot->GetZoneId() == WG_ZONE_ID); - bool isWGDefender = false; - if (isWG) - { - if (Battlefield* bf = sBattlefieldMgr->GetBattlefieldToZoneId(WG_ZONE_ID)) - isWGDefender = (bf->GetDefenderTeam() == bot->GetTeamId()); - } uint32 entry = vehicleBase->GetEntry(); - const uint32 WG_TOWER_CANNON_ENTRY = 28366; // NPC_WINTERGRASP_TOWER_CANNON if (NPC_KEEP_CANNON == entry || (!isWGDefender && entry == WG_TOWER_CANNON_ENTRY)) continue; From 58b53aea1d57843dd96256ee6acb2088424e5619 Mon Sep 17 00:00:00 2001 From: Tecc Date: Thu, 25 Sep 2025 15:37:54 +0200 Subject: [PATCH 025/151] Refactor Wintergrasp handling by removing conditional compilation and streamlining battleground logic --- src/AiFactory.cpp | 6 ----- .../actions/BattleGroundJoinAction.cpp | 23 ------------------- src/strategy/actions/BattleGroundTactics.cpp | 13 ----------- src/strategy/actions/BattleGroundTactics.h | 2 -- 4 files changed, 44 deletions(-) diff --git a/src/AiFactory.cpp b/src/AiFactory.cpp index 512d8deec4..f5a79f200f 100644 --- a/src/AiFactory.cpp +++ b/src/AiFactory.cpp @@ -745,9 +745,6 @@ void AiFactory::AddDefaultNonCombatStrategies(Player* player, PlayerbotAI* const bgType = player->GetBattleground()->GetBgTypeID(true); bool addBgGeneric = (bgType <= BATTLEGROUND_EY || bgType == BATTLEGROUND_IC); -#ifdef BATTLEGROUND_WG - addBgGeneric = addBgGeneric || (bgType == BATTLEGROUND_WG); -#endif if (addBgGeneric && !player->InArena()) nonCombatEngine->addStrategy("battleground", false); @@ -766,11 +763,8 @@ void AiFactory::AddDefaultNonCombatStrategies(Player* player, PlayerbotAI* const if (bgType == BATTLEGROUND_IC) nonCombatEngine->addStrategy("isle", false); - // If Wintergrasp is available as an instanced battleground, prefer a dedicated strategy -#ifdef BATTLEGROUND_WG if (bgType == BATTLEGROUND_WG) nonCombatEngine->addStrategy("wintergrasp", false); -#endif if (player->InArena()) { diff --git a/src/strategy/actions/BattleGroundJoinAction.cpp b/src/strategy/actions/BattleGroundJoinAction.cpp index bb99cdc2ac..825b39eade 100644 --- a/src/strategy/actions/BattleGroundJoinAction.cpp +++ b/src/strategy/actions/BattleGroundJoinAction.cpp @@ -380,25 +380,6 @@ bool BGJoinAction::isUseful() } } -#ifdef BATTLEGROUND_WG - // Prefer Wintergrasp if it is available among eligible queues - if (!bgList.empty()) - { - std::vector prioritized; - prioritized.reserve(bgList.size()); - for (uint32 q : bgList) - { - if (BattlegroundMgr::BGTemplateId((BattlegroundQueueTypeId)q) == BATTLEGROUND_WG) - prioritized.push_back(q); - } - for (uint32 q : bgList) - { - if (BattlegroundMgr::BGTemplateId((BattlegroundQueueTypeId)q) != BATTLEGROUND_WG) - prioritized.push_back(q); - } - bgList.swap(prioritized); - } -#endif if (!bgList.empty()) return true; @@ -499,11 +480,9 @@ bool BGJoinAction::JoinQueue(uint32 type) case BATTLEGROUND_IC: _bgType = "IoC"; break; -#ifdef BATTLEGROUND_WG case BATTLEGROUND_WG: _bgType = "WG"; break; -#endif default: break; } @@ -878,11 +857,9 @@ bool BGStatusAction::Execute(Event event) case BATTLEGROUND_IC: _bgType = "IoC"; break; -#ifdef BATTLEGROUND_WG case BATTLEGROUND_WG: _bgType = "WG"; break; -#endif default: break; } diff --git a/src/strategy/actions/BattleGroundTactics.cpp b/src/strategy/actions/BattleGroundTactics.cpp index bed8f5709b..2a8fedd436 100644 --- a/src/strategy/actions/BattleGroundTactics.cpp +++ b/src/strategy/actions/BattleGroundTactics.cpp @@ -1222,7 +1222,6 @@ std::vector const vPaths_IC = { &vPath_IC_Hanger_to_Workshop, }; -#ifdef BATTLEGROUND_WG // Minimal Wintergrasp paths to guide movement between key siege objectives // West approach (from western tower area toward the fortress gate) BattleBotPath vPath_WG_West_to_Gate = { @@ -1260,7 +1259,6 @@ BattleBotPath vPath_WG_Gate_to_Relic = { std::vector const vPaths_WG = {&vPath_WG_West_to_Gate, &vPath_WG_South_to_Gate, &vPath_WG_East_to_Gate, &vPath_WG_Gate_to_Relic}; -#endif std::vector const vPaths_NoReverseAllowed = { &vPath_WSG_AllianceGraveyardJump, @@ -1664,7 +1662,6 @@ bool BGTactics::Execute(Event event) vFlagIds = &vFlagsAV; break; } - case BATTLEGROUND_WS: { vPaths = &vPaths_WS; @@ -1683,7 +1680,6 @@ bool BGTactics::Execute(Event event) vFlagIds = &vFlagsIC; break; } -#ifdef BATTLEGROUND_WG case BATTLEGROUND_WG: { // Enable minimal WG paths and capture interactions via banners/relic @@ -1691,7 +1687,6 @@ bool BGTactics::Execute(Event event) vFlagIds = &vFlagsWG; break; } -#endif default: // can't use this in this BG - no vPaths/vFlagIds (will crash server) botAI->ResetStrategies(); @@ -1912,7 +1907,6 @@ bool BGTactics::moveToStart(bool force) IC_WAITING_POS_ALLIANCE.GetPositionZ()); } } - #ifdef BATTLEGROUND_WG else if (bgType == BATTLEGROUND_WG) { // Spread bots across lanes before battle start to avoid zerging one spot. @@ -1948,7 +1942,6 @@ bool BGTactics::moveToStart(bool force) return MoveTo(bg->GetMapId(), lane.GetPositionX() + frand(-8.0f, 8.0f), lane.GetPositionY() + frand(-8.0f, 8.0f), lane.GetPositionZ()); } } - #endif return true; } @@ -2256,7 +2249,6 @@ bool BGTactics::selectObjective(bool reset) break; } -#ifdef BATTLEGROUND_WG case BATTLEGROUND_WG: { // Try to push siege objectives; fall back to local PvP @@ -2446,7 +2438,6 @@ bool BGTactics::selectObjective(bool reset) posMap["bg siege"] = siege; return true; } -#endif case BATTLEGROUND_WS: { Position target; @@ -3892,9 +3883,7 @@ bool BGTactics::atFlag(std::vector const& vPaths, std::vectorGetValue("closest game objects"); @@ -4048,9 +4037,7 @@ bool BGTactics::atFlag(std::vector const& vPaths, std::vectorGetEntry() == 192829) // GO_WINTERGRASP_TITAN_S_RELIC diff --git a/src/strategy/actions/BattleGroundTactics.h b/src/strategy/actions/BattleGroundTactics.h index 08f3961dea..c933adb35f 100644 --- a/src/strategy/actions/BattleGroundTactics.h +++ b/src/strategy/actions/BattleGroundTactics.h @@ -101,9 +101,7 @@ extern std::vector const vPaths_AB; extern std::vector const vPaths_AV; extern std::vector const vPaths_EY; extern std::vector const vPaths_IC; -#ifdef BATTLEGROUND_WG extern std::vector const vPaths_WG; -#endif class BGTactics : public MovementAction { From a27dd1bd8abcdae2cea37599517b81dfc69252ad Mon Sep 17 00:00:00 2001 From: Tecc Date: Thu, 25 Sep 2025 15:52:13 +0200 Subject: [PATCH 026/151] Add Wintergrasp-specific strategies and objective selection logic for bots --- src/AiFactory.cpp | 13 +- src/strategy/actions/BattleGroundTactics.cpp | 204 ++++++++++++++++++- 2 files changed, 203 insertions(+), 14 deletions(-) diff --git a/src/AiFactory.cpp b/src/AiFactory.cpp index f5a79f200f..b48617bff0 100644 --- a/src/AiFactory.cpp +++ b/src/AiFactory.cpp @@ -728,6 +728,16 @@ void AiFactory::AddDefaultNonCombatStrategies(Player* player, PlayerbotAI* const { nonCombatEngine->ChangeStrategy(sPlayerbotAIConfig->nonCombatStrategies); } + // Add Wintergrasp strategy only when a WG battle is active in the zone + if (player->GetZoneId() == 4197) + { + if (Battlefield* bf = sBattlefieldMgr->GetBattlefieldToZoneId(4197)) + { + if (bf->IsWarTime()) + nonCombatEngine->addStrategy("wintergrasp", false); + } + } + // nonCombatEngine->addStrategy("battleground"); // nonCombatEngine->addStrategy("warsong"); // Battleground switch @@ -763,9 +773,6 @@ void AiFactory::AddDefaultNonCombatStrategies(Player* player, PlayerbotAI* const if (bgType == BATTLEGROUND_IC) nonCombatEngine->addStrategy("isle", false); - if (bgType == BATTLEGROUND_WG) - nonCombatEngine->addStrategy("wintergrasp", false); - if (player->InArena()) { nonCombatEngine->addStrategy("arena", false); diff --git a/src/strategy/actions/BattleGroundTactics.cpp b/src/strategy/actions/BattleGroundTactics.cpp index 2a8fedd436..d6e5fbdec5 100644 --- a/src/strategy/actions/BattleGroundTactics.cpp +++ b/src/strategy/actions/BattleGroundTactics.cpp @@ -1648,6 +1648,14 @@ bool BGTactics::Execute(Event event) if (bgType == BATTLEGROUND_RB) bgType = bot->GetBattleground()->GetBgTypeID(true); + // Wintergrasp (Battlefield) support: set paths/flags by zone + bool isWGZone = (bot->GetZoneId() == 4197); + if (isWGZone) + { + vPaths = &vPaths_WG; + vFlagIds = &vFlagsWG; + } + switch (bgType) { case BATTLEGROUND_AB: @@ -1689,8 +1697,13 @@ bool BGTactics::Execute(Event event) } default: // can't use this in this BG - no vPaths/vFlagIds (will crash server) - botAI->ResetStrategies(); - return false; + // For WG (Battlefield) we rely on zone-based handling above + if (!isWGZone) + { + botAI->ResetStrategies(); + return false; + } + break; } if (getName() == "move to start") @@ -1907,13 +1920,14 @@ bool BGTactics::moveToStart(bool force) IC_WAITING_POS_ALLIANCE.GetPositionZ()); } } - else if (bgType == BATTLEGROUND_WG) + else if (bot->GetZoneId() == 4197) { + Battlefield* bf = sBattlefieldMgr->GetBattlefieldToZoneId(4197 /* Wintergrasp */); + if (!bf || !bf->IsWarTime()) + return true; // Spread bots across lanes before battle start to avoid zerging one spot. // Determine defender via battlefield state; defenders stage near the gate, attackers spread to lanes. - bool isDefender = false; - if (Battlefield* bf = sBattlefieldMgr->GetBattlefieldToZoneId(4197 /* Wintergrasp */)) - isDefender = (bf->GetDefenderTeam() == bot->GetTeamId()); + bool isDefender = (bf->GetDefenderTeam() == bot->GetTeamId()); uint32 role = context->GetValue("bg role")->Get(); @@ -1949,10 +1963,15 @@ bool BGTactics::moveToStart(bool force) bool BGTactics::selectObjective(bool reset) { Battleground* bg = bot->GetBattleground(); + bool isWGZone = (bot->GetZoneId() == 4197); if (!bg) - return false; + { + // Allow Wintergrasp objective selection outside of Battleground + if (!isWGZone) + return false; + } - if (bg->GetStatus() != STATUS_IN_PROGRESS) + if (bg && bg->GetStatus() != STATUS_IN_PROGRESS && !isWGZone) return false; PositionMap& posMap = context->GetValue("position")->Get(); @@ -1962,9 +1981,165 @@ bool BGTactics::selectObjective(bool reset) WorldObject* BgObjective = nullptr; - BattlegroundTypeId bgType = bg->GetBgTypeID(); - if (bgType == BATTLEGROUND_RB) + BattlegroundTypeId bgType = bot->GetBattlegroundTypeId(); + if (bg && bgType == BATTLEGROUND_RB) bgType = bg->GetBgTypeID(true); + + // Wintergrasp Battlefield objective selection (zone-driven) + if (isWGZone) + { + // Determine defender/attacker side + bool isDefender = false; + if (Battlefield* bf = sBattlefieldMgr->GetBattlefieldToZoneId(4197)) + isDefender = (bf->GetDefenderTeam() == bot->GetTeamId()); + + // Try to push siege objectives; fall back to local PvP + // Gate push if friendly vehicles are massed + { + GuidVector nearbyVehicles = AI_VALUE(GuidVector, "nearest vehicles"); + uint32 friendlyAtGate = 0; + for (ObjectGuid const& vg : nearbyVehicles) + { + Unit* v = botAI->GetUnit(vg); + if (!v || !v->IsFriendlyTo(bot)) + continue; + if (v->GetDistance(WG_GATE_POS) < 200.0f) + friendlyAtGate++; + } + if (friendlyAtGate >= 2) + { + PositionInfo& siege = context->GetValue("position")->Get()["bg siege"]; + pos.Set(WG_GATE_POS.GetPositionX(), WG_GATE_POS.GetPositionY(), WG_GATE_POS.GetPositionZ(), bot->GetMapId()); + posMap["bg objective"] = pos; + siege.Set(pos.x, pos.y, pos.z, pos.mapId); + return true; + } + } + + // Defenders: intercept nearest enemy vehicle + if (isDefender) + { + GuidVector vehs = AI_VALUE(GuidVector, "nearest vehicles"); + Unit* enemyVeh = nullptr; + float evDist = FLT_MAX; + for (ObjectGuid const& vg : vehs) + { + Unit* v = botAI->GetUnit(vg); + if (!v || v->IsFriendlyTo(bot)) + continue; + float d = bot->GetDistance(v); + if (d < evDist) + { + evDist = d; + enemyVeh = v; + } + } + if (enemyVeh && evDist < 250.0f) + { + pos.Set(enemyVeh->GetPositionX(), enemyVeh->GetPositionY(), enemyVeh->GetPositionZ(), bot->GetMapId()); + posMap["bg objective"] = pos; + context->GetValue("current target")->Set(enemyVeh); + return true; + } + } + + // Prefer nearby banners that are capturable + { + GuidVector noLosObjects = AI_VALUE(GuidVector, "nearest game objects no los"); + GameObject* nearestBanner = nullptr; + float bestBannerDist = FLT_MAX; + for (ObjectGuid const& gid : noLosObjects) + { + GameObject* go = botAI->GetGameObject(gid); + if (!go) + continue; + if (std::find(vFlagsWG.begin(), vFlagsWG.end(), go->GetEntry()) == vFlagsWG.end()) + continue; + if (go->GetEntry() == 192829) // Relic handled separately + continue; + bool canUse = bot->CanUseBattlegroundObject(go); + float d = bot->GetDistance(go); + if ((canUse && d < bestBannerDist) || (!nearestBanner && d < bestBannerDist)) + { + bestBannerDist = d; + nearestBanner = go; + } + } + if (nearestBanner) + { + pos.Set(nearestBanner->GetPositionX(), nearestBanner->GetPositionY(), nearestBanner->GetPositionZ(), bot->GetMapId()); + posMap["bg objective"] = pos; + return true; + } + } + + // If close to relic, go for it + if (bot->GetDistance(WG_RELIC_POS) < 200.0f) + { + pos.Set(WG_RELIC_POS.GetPositionX(), WG_RELIC_POS.GetPositionY(), WG_RELIC_POS.GetPositionZ(), bot->GetMapId()); + posMap["bg objective"] = pos; + PositionInfo& siege = context->GetValue("position")->Get()["bg siege"]; + siege.Set(pos.x, pos.y, pos.z, pos.mapId); + return true; + } + + // Escort role for attackers + uint32 role = context->GetValue("bg role")->Get(); + if (!isDefender && (role % 4 == 3)) + { + GuidVector nearby = AI_VALUE(GuidVector, "nearest vehicles"); + Unit* best = nullptr; + float bestd = FLT_MAX; + for (ObjectGuid const& vg : nearby) + { + Unit* v = botAI->GetUnit(vg); + if (!v || !v->IsFriendlyTo(bot)) + continue; + uint32 ve = v->GetEntry(); + if (ve != WG_ENTRY_SIEGE_ENGINE_A && ve != WG_ENTRY_SIEGE_ENGINE_H && ve != WG_ENTRY_CATAPULT && ve != WG_ENTRY_DEMOLISHER) + continue; + float d = bot->GetDistance(v); + if (d < bestd) + { + bestd = d; + best = v; + } + } + if (best && bestd < 150.0f) + { + pos.Set(best->GetPositionX(), best->GetPositionY(), best->GetPositionZ(), bot->GetMapId()); + posMap["bg objective"] = pos; + return true; + } + } + + // Choose siege objective + Position siegeTarget = WG_GATE_POS; + if (!isDefender) + { + if (role % 3 == 1) + siegeTarget = WG_TOWER_S_POS; + else if (role % 3 == 2) + siegeTarget = (bot->GetTeamId() == TEAM_ALLIANCE ? WG_TOWER_W_POS : WG_TOWER_E_POS); + } + else + { + siegeTarget = (role % 2 == 1) ? WG_GATE_POS : (bot->GetTeamId() == TEAM_ALLIANCE ? WG_TOWER_E_POS : WG_TOWER_W_POS); + } + + if (isDefender && siegeTarget.GetPositionX() == WG_GATE_POS.GetPositionX() && !botAI->IsRanged(bot)) + { + float ox = (role % 2 == 0 ? -12.0f : 12.0f); + float oy = (role % 3 == 0 ? -6.0f : 6.0f); + pos.Set(WG_GATE_POS.GetPositionX() + ox, WG_GATE_POS.GetPositionY() + oy, WG_GATE_POS.GetPositionZ(), bot->GetMapId()); + } + else + { + pos.Set(siegeTarget.GetPositionX(), siegeTarget.GetPositionY(), siegeTarget.GetPositionZ(), bot->GetMapId()); + } + posMap["bg objective"] = pos; + return true; + } switch (bgType) { case BATTLEGROUND_AV: @@ -3877,7 +4052,14 @@ bool BGTactics::atFlag(std::vector const& vPaths, std::vectorGetZoneId() == 4197) // Wintergrasp Battlefield + { + closeObjects = *context->GetValue("closest game objects"); + closePlayers = *context->GetValue("closest friendly players"); + flagRange = INTERACTION_DISTANCE; + } + else switch (bgType) { case BATTLEGROUND_AV: From 721ebb15a5c74ce0052041bde39bfed4426877b5 Mon Sep 17 00:00:00 2001 From: Tecc Date: Thu, 25 Sep 2025 16:17:47 +0200 Subject: [PATCH 027/151] Prevent vehicle entry during Wintergrasp preparation and ensure battlefield context is valid --- src/strategy/actions/VehicleActions.cpp | 20 +++++++++++++++----- 1 file changed, 15 insertions(+), 5 deletions(-) diff --git a/src/strategy/actions/VehicleActions.cpp b/src/strategy/actions/VehicleActions.cpp index 22eb3cb199..d55b72da72 100644 --- a/src/strategy/actions/VehicleActions.cpp +++ b/src/strategy/actions/VehicleActions.cpp @@ -95,16 +95,26 @@ bool EnterVehicleAction::Execute(Event event) if (isWG) { if (Battlefield* bf = sBattlefieldMgr->GetBattlefieldToZoneId(WG_ZONE_ID)) + { + // Do not enter vehicles during WG preparation (no wartime) + if (!bf->IsWarTime()) + return false; + isWGDefender = (bf->GetDefenderTeam() == bot->GetTeamId()); - if (isWGDefender) - { - if (Unit* enemy = AI_VALUE(Unit*, "enemy player target")) + if (isWGDefender) { - float dGateEnemy = enemy->GetDistance(WG_GATE_X, WG_GATE_Y, WG_GATE_Z); - preferCannons = (dGateEnemy < 250.0f); + if (Unit* enemy = AI_VALUE(Unit*, "enemy player target")) + { + float dGateEnemy = enemy->GetDistance(WG_GATE_X, WG_GATE_Y, WG_GATE_Z); + preferCannons = (dGateEnemy < 250.0f); + } } } + else + { + return false; // no battlefield context, avoid vehicles in WG zone + } } if (preferCannons) From 903c6e51124300acf7651c793e57e876aac94740 Mon Sep 17 00:00:00 2001 From: Tecc Date: Thu, 25 Sep 2025 16:41:19 +0200 Subject: [PATCH 028/151] Implement defender strategy to send strike teams to attacker towers when gate pressure is low --- src/strategy/actions/BattleGroundTactics.cpp | 30 ++++++++++++++++++++ 1 file changed, 30 insertions(+) diff --git a/src/strategy/actions/BattleGroundTactics.cpp b/src/strategy/actions/BattleGroundTactics.cpp index d6e5fbdec5..d4bcb76967 100644 --- a/src/strategy/actions/BattleGroundTactics.cpp +++ b/src/strategy/actions/BattleGroundTactics.cpp @@ -2043,6 +2043,36 @@ bool BGTactics::selectObjective(bool reset) } } + // Defenders: if gate pressure is low, send strike teams to attacker towers to weaken attackers + if (isDefender) + { + GuidVector vehs = AI_VALUE(GuidVector, "nearest vehicles"); + uint32 enemyAtGate = 0; + for (ObjectGuid const& vg : vehs) + { + Unit* v = botAI->GetUnit(vg); + if (!v || v->IsFriendlyTo(bot)) + continue; + if (v->GetDistance(WG_GATE_POS) < 200.0f) + enemyAtGate++; + } + + if (enemyAtGate < 2) + { + uint32 role = context->GetValue("bg role")->Get(); + Position strike = WG_TOWER_S_POS; + switch (role % 3) + { + case 0: strike = WG_TOWER_W_POS; break; + case 1: strike = WG_TOWER_S_POS; break; + case 2: strike = WG_TOWER_E_POS; break; + } + pos.Set(strike.GetPositionX(), strike.GetPositionY(), strike.GetPositionZ(), bot->GetMapId()); + posMap["bg objective"] = pos; + return true; + } + } + // Prefer nearby banners that are capturable { GuidVector noLosObjects = AI_VALUE(GuidVector, "nearest game objects no los"); From a44e5bd049be2a4f1eb2cbe65361bf73e52e4627 Mon Sep 17 00:00:00 2001 From: Tecc Date: Thu, 25 Sep 2025 16:45:20 +0200 Subject: [PATCH 029/151] Enhance vehicle selection logic for bots to prioritize entering siege vehicles for tower strikes --- src/strategy/actions/BattleGroundTactics.cpp | 38 ++++++++++++++++++++ 1 file changed, 38 insertions(+) diff --git a/src/strategy/actions/BattleGroundTactics.cpp b/src/strategy/actions/BattleGroundTactics.cpp index d4bcb76967..a1589e256c 100644 --- a/src/strategy/actions/BattleGroundTactics.cpp +++ b/src/strategy/actions/BattleGroundTactics.cpp @@ -2067,6 +2067,44 @@ bool BGTactics::selectObjective(bool reset) case 1: strike = WG_TOWER_S_POS; break; case 2: strike = WG_TOWER_E_POS; break; } + + // Prefer pushing towers with vehicles. If already in a vehicle, go straight to strike. + if (bot->GetVehicle()) + { + pos.Set(strike.GetPositionX(), strike.GetPositionY(), strike.GetPositionZ(), bot->GetMapId()); + posMap["bg objective"] = pos; + return true; + } + + // Seek nearest friendly vehicle suitable for a strike (Siege Engine / Demolisher) + Unit* bestVeh = nullptr; + float bestDist = FLT_MAX; + GuidVector nearVeh = AI_VALUE(GuidVector, "nearest vehicles"); + for (ObjectGuid const& vg : nearVeh) + { + Unit* v = botAI->GetUnit(vg); + if (!v || !v->IsFriendlyTo(bot)) + continue; + uint32 ve = v->GetEntry(); + if (ve != WG_ENTRY_SIEGE_ENGINE_A && ve != WG_ENTRY_SIEGE_ENGINE_H && ve != WG_ENTRY_DEMOLISHER) + continue; + float d = bot->GetDistance(v); + if (d < bestDist) + { + bestDist = d; + bestVeh = v; + } + } + + if (bestVeh) + { + // Move to vehicle; EnterVehicleAction will handle boarding if seats are available + pos.Set(bestVeh->GetPositionX(), bestVeh->GetPositionY(), bestVeh->GetPositionZ(), bot->GetMapId()); + posMap["bg objective"] = pos; + return true; + } + + // Fallback: move to tower on foot pos.Set(strike.GetPositionX(), strike.GetPositionY(), strike.GetPositionZ(), bot->GetMapId()); posMap["bg objective"] = pos; return true; From ac41c9e57e08b2316e4b1abfbc2a46e2e45c4cd6 Mon Sep 17 00:00:00 2001 From: Tecc Date: Thu, 25 Sep 2025 17:22:03 +0200 Subject: [PATCH 030/151] Enhance objective selection logic to introduce randomness for side breaches when friendly vehicles are massed --- src/strategy/actions/BattleGroundTactics.cpp | 19 +++++++++++++++---- 1 file changed, 15 insertions(+), 4 deletions(-) diff --git a/src/strategy/actions/BattleGroundTactics.cpp b/src/strategy/actions/BattleGroundTactics.cpp index a1589e256c..6e055b347b 100644 --- a/src/strategy/actions/BattleGroundTactics.cpp +++ b/src/strategy/actions/BattleGroundTactics.cpp @@ -1994,7 +1994,7 @@ bool BGTactics::selectObjective(bool reset) isDefender = (bf->GetDefenderTeam() == bot->GetTeamId()); // Try to push siege objectives; fall back to local PvP - // Gate push if friendly vehicles are massed + // Gate push if friendly vehicles are massed (with some randomness to choose a side breach) { GuidVector nearbyVehicles = AI_VALUE(GuidVector, "nearest vehicles"); uint32 friendlyAtGate = 0; @@ -2008,10 +2008,21 @@ bool BGTactics::selectObjective(bool reset) } if (friendlyAtGate >= 2) { - PositionInfo& siege = context->GetValue("position")->Get()["bg siege"]; - pos.Set(WG_GATE_POS.GetPositionX(), WG_GATE_POS.GetPositionY(), WG_GATE_POS.GetPositionZ(), bot->GetMapId()); + // 25% chance to breach via a side lane instead of the main gate, to avoid predictable zergs + uint32 role = context->GetValue("bg role")->Get(); + bool sideBreach = urand(0, 99) < 25; + if (!sideBreach) + { + PositionInfo& siege = context->GetValue("position")->Get()["bg siege"]; + pos.Set(WG_GATE_POS.GetPositionX(), WG_GATE_POS.GetPositionY(), WG_GATE_POS.GetPositionZ(), bot->GetMapId()); + posMap["bg objective"] = pos; + siege.Set(pos.x, pos.y, pos.z, pos.mapId); + return true; + } + // choose a side tower as breach point based on role + Position breach = (role % 2 == 0 ? WG_TOWER_W_POS : WG_TOWER_E_POS); + pos.Set(breach.GetPositionX(), breach.GetPositionY(), breach.GetPositionZ(), bot->GetMapId()); posMap["bg objective"] = pos; - siege.Set(pos.x, pos.y, pos.z, pos.mapId); return true; } } From 558c0dd3ce928045269388f33675af57be9af288 Mon Sep 17 00:00:00 2001 From: Tecc Date: Thu, 25 Sep 2025 18:12:13 +0200 Subject: [PATCH 031/151] correct formatting --- .../actions/BattleGroundJoinAction.cpp | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/src/strategy/actions/BattleGroundJoinAction.cpp b/src/strategy/actions/BattleGroundJoinAction.cpp index 825b39eade..f4771f2120 100644 --- a/src/strategy/actions/BattleGroundJoinAction.cpp +++ b/src/strategy/actions/BattleGroundJoinAction.cpp @@ -477,15 +477,15 @@ bool BGJoinAction::JoinQueue(uint32 type) case BATTLEGROUND_SA: _bgType = "SotA"; break; - case BATTLEGROUND_IC: - _bgType = "IoC"; - break; - case BATTLEGROUND_WG: - _bgType = "WG"; - break; - default: - break; - } + case BATTLEGROUND_IC: + _bgType = "IoC"; + break; + case BATTLEGROUND_WG: + _bgType = "WG"; + break; + default: + break; + } if (isArena) { From a18c90385d6d1e1cccb8669b526af1e08307f5de Mon Sep 17 00:00:00 2001 From: Tecc Date: Thu, 25 Sep 2025 18:13:32 +0200 Subject: [PATCH 032/151] fix wrong formatting --- .../actions/BattleGroundJoinAction.cpp | 58 +++++++++---------- 1 file changed, 29 insertions(+), 29 deletions(-) diff --git a/src/strategy/actions/BattleGroundJoinAction.cpp b/src/strategy/actions/BattleGroundJoinAction.cpp index f4771f2120..1fc849acf6 100644 --- a/src/strategy/actions/BattleGroundJoinAction.cpp +++ b/src/strategy/actions/BattleGroundJoinAction.cpp @@ -457,35 +457,35 @@ bool BGJoinAction::JoinQueue(uint32 type) // in wotlk only arena requires battlemaster guid // ObjectGuid guid = isArena ? unit->GetGUID() : bot->GetGUID(); //not used, line marked for removal. - switch (bgTypeId) - { - case BATTLEGROUND_AV: - _bgType = "AV"; - break; - case BATTLEGROUND_WS: - _bgType = "WSG"; - break; - case BATTLEGROUND_AB: - _bgType = "AB"; - break; - case BATTLEGROUND_EY: - _bgType = "EotS"; - break; - case BATTLEGROUND_RB: - _bgType = "Random"; - break; - case BATTLEGROUND_SA: - _bgType = "SotA"; - break; - case BATTLEGROUND_IC: - _bgType = "IoC"; - break; - case BATTLEGROUND_WG: - _bgType = "WG"; - break; - default: - break; - } + switch (bgTypeId) + { + case BATTLEGROUND_AV: + _bgType = "AV"; + break; + case BATTLEGROUND_WS: + _bgType = "WSG"; + break; + case BATTLEGROUND_AB: + _bgType = "AB"; + break; + case BATTLEGROUND_EY: + _bgType = "EotS"; + break; + case BATTLEGROUND_RB: + _bgType = "Random"; + break; + case BATTLEGROUND_SA: + _bgType = "SotA"; + break; + case BATTLEGROUND_IC: + _bgType = "IoC"; + break; + case BATTLEGROUND_WG: + _bgType = "WG"; + break; + default: + break; + } if (isArena) { From 078b9b24c8a4d2271063cb6607ade2c9719341db Mon Sep 17 00:00:00 2001 From: Tecc Date: Thu, 25 Sep 2025 18:34:10 +0200 Subject: [PATCH 033/151] Refactor EnterVehicleAction to remove duplicated declaration --- src/strategy/actions/VehicleActions.cpp | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/src/strategy/actions/VehicleActions.cpp b/src/strategy/actions/VehicleActions.cpp index d55b72da72..602928569c 100644 --- a/src/strategy/actions/VehicleActions.cpp +++ b/src/strategy/actions/VehicleActions.cpp @@ -90,9 +90,8 @@ bool EnterVehicleAction::Execute(Event event) // Prefer tower cannons for defenders when enemies are attacking near the fortress gate bool preferCannons = false; - bool isWG = (bot->GetZoneId() == WG_ZONE_ID); bool isWGDefender = false; - if (isWG) + if (inWG) { if (Battlefield* bf = sBattlefieldMgr->GetBattlefieldToZoneId(WG_ZONE_ID)) { From 8e71225a95a708f733698ea8ca4d54beccb16052 Mon Sep 17 00:00:00 2001 From: Icemansparks Date: Thu, 25 Sep 2025 19:47:28 +0200 Subject: [PATCH 034/151] Apply suggestion from @Copilot Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com> --- src/strategy/actions/VehicleActions.cpp | 1 - 1 file changed, 1 deletion(-) diff --git a/src/strategy/actions/VehicleActions.cpp b/src/strategy/actions/VehicleActions.cpp index 602928569c..b8fc4a47f5 100644 --- a/src/strategy/actions/VehicleActions.cpp +++ b/src/strategy/actions/VehicleActions.cpp @@ -14,7 +14,6 @@ #include "Unit.h" #include "Vehicle.h" #include "BattlefieldMgr.h" -#include "ServerFacade.h" // Wintergrasp rank auras (from TC 3.3.5 BattlefieldWG.h) static constexpr uint32 WG_SPELL_RECRUIT = 37795; From 4752992ffc7604d01b4eca9ab5b23d1677595226 Mon Sep 17 00:00:00 2001 From: Icemansparks Date: Thu, 25 Sep 2025 19:49:57 +0200 Subject: [PATCH 035/151] Update src/strategy/actions/BattleGroundTactics.cpp Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com> --- src/strategy/actions/BattleGroundTactics.cpp | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/strategy/actions/BattleGroundTactics.cpp b/src/strategy/actions/BattleGroundTactics.cpp index 6e055b347b..b1eb55094c 100644 --- a/src/strategy/actions/BattleGroundTactics.cpp +++ b/src/strategy/actions/BattleGroundTactics.cpp @@ -1755,7 +1755,8 @@ bool BGTactics::Execute(Event event) return true; } - if (vFlagIds && atFlag(vPaths ? *vPaths : std::vector{}, *vFlagIds)) + static const std::vector EMPTY_BATTLEBOTPATH_VECTOR; + if (vFlagIds && atFlag(vPaths ? *vPaths : EMPTY_BATTLEBOTPATH_VECTOR, *vFlagIds)) return true; if (useBuff()) From 8985b6fe1722849712e871f73d3cb594b73e19e6 Mon Sep 17 00:00:00 2001 From: Icemansparks Date: Thu, 25 Sep 2025 19:50:03 +0200 Subject: [PATCH 036/151] Update src/strategy/actions/BattleGroundTactics.cpp Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com> --- src/strategy/actions/BattleGroundTactics.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/strategy/actions/BattleGroundTactics.cpp b/src/strategy/actions/BattleGroundTactics.cpp index b1eb55094c..574047138b 100644 --- a/src/strategy/actions/BattleGroundTactics.cpp +++ b/src/strategy/actions/BattleGroundTactics.cpp @@ -1982,7 +1982,7 @@ bool BGTactics::selectObjective(bool reset) WorldObject* BgObjective = nullptr; - BattlegroundTypeId bgType = bot->GetBattlegroundTypeId(); + BattlegroundTypeId bgType = bg ? bg->GetBgTypeID() : BATTLEGROUND_TYPE_NONE; if (bg && bgType == BATTLEGROUND_RB) bgType = bg->GetBgTypeID(true); From d34857cdffd0abca2a8c9f551dc3e8fe68886e9d Mon Sep 17 00:00:00 2001 From: Icemansparks Date: Thu, 25 Sep 2025 19:51:01 +0200 Subject: [PATCH 037/151] Update src/strategy/actions/BattleGroundTactics.cpp Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com> --- src/strategy/actions/BattleGroundTactics.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/strategy/actions/BattleGroundTactics.cpp b/src/strategy/actions/BattleGroundTactics.cpp index 574047138b..20f1ae9337 100644 --- a/src/strategy/actions/BattleGroundTactics.cpp +++ b/src/strategy/actions/BattleGroundTactics.cpp @@ -2611,7 +2611,7 @@ bool BGTactics::selectObjective(bool reset) isDefender = nearKeep; } } - uint8 role = context->GetValue("bg role")->Get(); + uint8 role = static_cast(context->GetValue("bg role")->Get()); // If close to relic, go for it if (bot->GetDistance(WG_RELIC_POS) < 200.0f) From dd9027c6f4f841c06af644b14843a5ed672bae4c Mon Sep 17 00:00:00 2001 From: Icemansparks Date: Thu, 25 Sep 2025 19:51:14 +0200 Subject: [PATCH 038/151] Update src/strategy/actions/BattleGroundTactics.cpp Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com> --- src/strategy/actions/BattleGroundTactics.cpp | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/src/strategy/actions/BattleGroundTactics.cpp b/src/strategy/actions/BattleGroundTactics.cpp index 20f1ae9337..2a3e342aa9 100644 --- a/src/strategy/actions/BattleGroundTactics.cpp +++ b/src/strategy/actions/BattleGroundTactics.cpp @@ -2529,9 +2529,8 @@ bool BGTactics::selectObjective(bool reset) { pos.Set(WG_GATE_POS.GetPositionX(), WG_GATE_POS.GetPositionY(), WG_GATE_POS.GetPositionZ(), bot->GetMapId()); posMap["bg objective"] = pos; - PositionInfo siege = posMap["bg siege"]; + PositionInfo& siege = posMap["bg siege"]; siege.Set(pos.x, pos.y, pos.z, pos.mapId); - posMap["bg siege"] = siege; return true; } } From f05051827651772cfed00efd138b3649fc95217c Mon Sep 17 00:00:00 2001 From: Tecc Date: Thu, 25 Sep 2025 20:04:36 +0200 Subject: [PATCH 039/151] Remove mapping for BATTLEGROUND_WG in JoinQueue and Execute methods, noting it as a Battlefield on AC. --- src/strategy/actions/BattleGroundJoinAction.cpp | 8 ++------ 1 file changed, 2 insertions(+), 6 deletions(-) diff --git a/src/strategy/actions/BattleGroundJoinAction.cpp b/src/strategy/actions/BattleGroundJoinAction.cpp index 1fc849acf6..ae2ca515d0 100644 --- a/src/strategy/actions/BattleGroundJoinAction.cpp +++ b/src/strategy/actions/BattleGroundJoinAction.cpp @@ -480,9 +480,7 @@ bool BGJoinAction::JoinQueue(uint32 type) case BATTLEGROUND_IC: _bgType = "IoC"; break; - case BATTLEGROUND_WG: - _bgType = "WG"; - break; + // WG is Battlefield on AC; no BG id mapping here default: break; } @@ -857,9 +855,7 @@ bool BGStatusAction::Execute(Event event) case BATTLEGROUND_IC: _bgType = "IoC"; break; - case BATTLEGROUND_WG: - _bgType = "WG"; - break; + // WG is Battlefield on AC; no BG id mapping here default: break; } From 6ae7bec81f04beaaa0654bd37a518b745ddebd19 Mon Sep 17 00:00:00 2001 From: Tecc Date: Thu, 25 Sep 2025 20:24:00 +0200 Subject: [PATCH 040/151] Add Battlefield support for Wintergrasp in BGTactics and update triggers in BattlegroundStrategy --- src/AiFactory.cpp | 1 + src/strategy/actions/BattleGroundTactics.cpp | 346 +++++------------- src/strategy/generic/BattlegroundStrategy.cpp | 6 + 3 files changed, 105 insertions(+), 248 deletions(-) diff --git a/src/AiFactory.cpp b/src/AiFactory.cpp index b48617bff0..c01bdb4a98 100644 --- a/src/AiFactory.cpp +++ b/src/AiFactory.cpp @@ -6,6 +6,7 @@ #include "AiFactory.h" #include "BattlegroundMgr.h" +#include "BattlefieldMgr.h" #include "DKAiObjectContext.h" #include "DruidAiObjectContext.h" #include "Engine.h" diff --git a/src/strategy/actions/BattleGroundTactics.cpp b/src/strategy/actions/BattleGroundTactics.cpp index 2a3e342aa9..d61445c80e 100644 --- a/src/strategy/actions/BattleGroundTactics.cpp +++ b/src/strategy/actions/BattleGroundTactics.cpp @@ -1623,33 +1623,35 @@ bool BGTactics::eyJumpDown() bool BGTactics::Execute(Event event) { Battleground* bg = bot->GetBattleground(); - if (!bg) + bool isWGZone = (bot->GetZoneId() == 4197); + if (!bg && !isWGZone) { botAI->ResetStrategies(); return false; } - if (bg->GetStatus() == STATUS_WAIT_LEAVE) + if (bg && bg->GetStatus() == STATUS_WAIT_LEAVE) return BGStatusAction::LeaveBG(botAI); - if (bg->isArena()) + if (bg && bg->isArena()) { // can't use this in arena - no vPaths/vFlagIds (will crash server) botAI->ResetStrategies(); return false; } - if (bg->GetStatus() == STATUS_IN_PROGRESS) + if (bg && bg->GetStatus() == STATUS_IN_PROGRESS) botAI->ChangeStrategy("-buff", BOT_STATE_NON_COMBAT); std::vector const* vPaths; std::vector const* vFlagIds; - BattlegroundTypeId bgType = bg->GetBgTypeID(); - if (bgType == BATTLEGROUND_RB) + BattlegroundTypeId bgType = bg ? bg->GetBgTypeID() : BATTLEGROUND_TYPE_NONE; + if (bg && bgType == BATTLEGROUND_RB) bgType = bot->GetBattleground()->GetBgTypeID(true); // Wintergrasp (Battlefield) support: set paths/flags by zone - bool isWGZone = (bot->GetZoneId() == 4197); + // Wintergrasp (Battlefield) support: set paths/flags by zone + isWGZone = (bot->GetZoneId() == 4197); if (isWGZone) { vPaths = &vPaths_WG; @@ -1688,13 +1690,7 @@ bool BGTactics::Execute(Event event) vFlagIds = &vFlagsIC; break; } - case BATTLEGROUND_WG: - { - // Enable minimal WG paths and capture interactions via banners/relic - vPaths = &vPaths_WG; - vFlagIds = &vFlagsWG; - break; - } + // Note: Wintergrasp is a Battlefield on AzerothCore (handled by zoneId 4197 above) default: // can't use this in this BG - no vPaths/vFlagIds (will crash server) // For WG (Battlefield) we rely on zone-based handling above @@ -1735,7 +1731,7 @@ bool BGTactics::Execute(Event event) if (getName() == "move to objective") { - if (bg->GetStatus() == STATUS_WAIT_JOIN) + if (bg && bg->GetStatus() == STATUS_WAIT_JOIN) return false; if (bot->isMoving()) @@ -1806,14 +1802,15 @@ bool BGTactics::Execute(Event event) bool BGTactics::moveToStart(bool force) { Battleground* bg = bot->GetBattleground(); - if (!bg) + bool isWGZone = (bot->GetZoneId() == 4197); + if (!bg && !isWGZone) return false; - if (!force && bg->GetStatus() != STATUS_WAIT_JOIN) + if (bg && !force && bg->GetStatus() != STATUS_WAIT_JOIN) return false; - BattlegroundTypeId bgType = bg->GetBgTypeID(); - if (bgType == BATTLEGROUND_RB) + BattlegroundTypeId bgType = bg ? bg->GetBgTypeID() : BATTLEGROUND_TYPE_NONE; + if (bg && bgType == BATTLEGROUND_RB) bgType = bg->GetBgTypeID(true); if (bgType == BATTLEGROUND_WS) @@ -1921,7 +1918,7 @@ bool BGTactics::moveToStart(bool force) IC_WAITING_POS_ALLIANCE.GetPositionZ()); } } - else if (bot->GetZoneId() == 4197) + else if (isWGZone) { Battlefield* bf = sBattlefieldMgr->GetBattlefieldToZoneId(4197 /* Wintergrasp */); if (!bf || !bf->IsWarTime()) @@ -1942,7 +1939,7 @@ bool BGTactics::moveToStart(bool force) }; Position p = anchors[role % anchors.size()]; - return MoveTo(bg->GetMapId(), p.GetPositionX() + frand(-5.0f, 5.0f), p.GetPositionY() + frand(-5.0f, 5.0f), p.GetPositionZ()); + return MoveTo(bot->GetMapId(), p.GetPositionX() + frand(-5.0f, 5.0f), p.GetPositionY() + frand(-5.0f, 5.0f), p.GetPositionZ()); } else { @@ -1954,8 +1951,8 @@ bool BGTactics::moveToStart(bool force) else if (slice == 2) lane = WG_TOWER_E_POS; - return MoveTo(bg->GetMapId(), lane.GetPositionX() + frand(-8.0f, 8.0f), lane.GetPositionY() + frand(-8.0f, 8.0f), lane.GetPositionZ()); - } + return MoveTo(bot->GetMapId(), lane.GetPositionX() + frand(-8.0f, 8.0f), lane.GetPositionY() + frand(-8.0f, 8.0f), lane.GetPositionZ()); + } } return true; @@ -2504,194 +2501,7 @@ bool BGTactics::selectObjective(bool reset) break; } - case BATTLEGROUND_WG: - { - // Try to push siege objectives; fall back to local PvP - // 1) If relic is interactible and close enough, go there - // 2) Otherwise move to a gate or a southern tower, depending on role - // 3) If a workshop banner is visible nearby, prefer that - - // If we have enough friendly vehicles near the gate, push gate now - { - GuidVector nearbyVehicles = AI_VALUE(GuidVector, "nearest vehicles"); - uint32 friendlyAtGate = 0; - for (ObjectGuid const& vg : nearbyVehicles) - { - Unit* v = botAI->GetUnit(vg); - if (!v) - continue; - if (!v->IsFriendlyTo(bot)) - continue; - if (v->GetDistance(WG_GATE_POS) < 200.0f) - friendlyAtGate++; - } - if (friendlyAtGate >= 2) - { - pos.Set(WG_GATE_POS.GetPositionX(), WG_GATE_POS.GetPositionY(), WG_GATE_POS.GetPositionZ(), bot->GetMapId()); - posMap["bg objective"] = pos; - PositionInfo& siege = posMap["bg siege"]; - siege.Set(pos.x, pos.y, pos.z, pos.mapId); - return true; - } - } - - // As defender: intercept nearest enemy vehicle first - if (isDefender) - { - GuidVector vehs = AI_VALUE(GuidVector, "nearest vehicles"); - Unit* enemyVeh = nullptr; - float evDist = FLT_MAX; - for (ObjectGuid const& vg : vehs) - { - Unit* v = botAI->GetUnit(vg); - if (!v || v->IsFriendlyTo(bot)) - continue; - float d = bot->GetDistance(v); - if (d < evDist) - { - evDist = d; - enemyVeh = v; - } - } - if (enemyVeh && evDist < 250.0f) - { - // Set the vehicle as objective and target - pos.Set(enemyVeh->GetPositionX(), enemyVeh->GetPositionY(), enemyVeh->GetPositionZ(), bot->GetMapId()); - posMap["bg objective"] = pos; - context->GetValue("current target")->Set(enemyVeh); - return true; - } - } - - // Prefer nearby banners (workshops) first if visible - GuidVector noLosObjects = AI_VALUE(GuidVector, "nearest game objects no los"); - GameObject* nearestBanner = nullptr; - float bestBannerDist = FLT_MAX; - for (ObjectGuid const& gid : noLosObjects) - { - GameObject* go = botAI->GetGameObject(gid); - if (!go) - continue; - if (std::find(vFlagsWG.begin(), vFlagsWG.end(), go->GetEntry()) == vFlagsWG.end()) - continue; - if (go->GetEntry() == 192829) // Relic handled below - continue; - - // Prefer banners that are capturable for our team (enemy or neutral); fallback to proximity - bool canUse = bot->CanUseBattlegroundObject(go); - float d = bot->GetDistance(go); - if ((canUse && d < bestBannerDist) || (!nearestBanner && d < bestBannerDist)) - { - bestBannerDist = d; - nearestBanner = go; - } - } - if (nearestBanner) - { - pos.Set(nearestBanner->GetPositionX(), nearestBanner->GetPositionY(), nearestBanner->GetPositionZ(), bot->GetMapId()); - posMap["bg objective"] = pos; - return true; - } - - // Determine defender/attacker side based on battlefield state if possible - bool isDefender = false; - if (Battlefield* bf = sBattlefieldMgr->GetBattlefieldToZoneId(4197 /*Wintergrasp*/)) - { - isDefender = (bf->GetDefenderTeam() == bot->GetTeamId()); - } - else - { - // Fallback: prefer explicit control aura; last resort keep proximity heuristic - const uint32 WG_SPELL_ESSENCE_OF_WINTERGRASP = 58045; - isDefender = bot->HasAura(WG_SPELL_ESSENCE_OF_WINTERGRASP); - if (!isDefender) - { - bool nearKeep = (bot->GetDistance(WG_RELIC_POS) < 300.0f) || (bot->GetDistance(WG_GATE_POS) < 350.0f); - isDefender = nearKeep; - } - } - uint8 role = static_cast(context->GetValue("bg role")->Get()); - - // If close to relic, go for it - if (bot->GetDistance(WG_RELIC_POS) < 200.0f) - { - pos.Set(WG_RELIC_POS.GetPositionX(), WG_RELIC_POS.GetPositionY(), WG_RELIC_POS.GetPositionZ(), bot->GetMapId()); - posMap["bg objective"] = pos; - // Set siege target as well for vehicle aim - PositionInfo siege = posMap["bg siege"]; - siege.Set(pos.x, pos.y, pos.z, pos.mapId); - posMap["bg siege"] = siege; - return true; - } - - // Escort role: attackers with certain roles escort nearest friendly siege vehicle toward objective - if (!isDefender && (role % 4 == 3)) - { - GuidVector nearby = AI_VALUE(GuidVector, "nearest vehicles"); - Unit* best = nullptr; - float bestd = FLT_MAX; - for (ObjectGuid const& vg : nearby) - { - Unit* v = botAI->GetUnit(vg); - if (!v || !v->IsFriendlyTo(bot)) - continue; - uint32 ve = v->GetEntry(); - if (ve != WG_ENTRY_SIEGE_ENGINE_A && ve != WG_ENTRY_SIEGE_ENGINE_H && ve != WG_ENTRY_CATAPULT && ve != WG_ENTRY_DEMOLISHER) - continue; - float d = bot->GetDistance(v); - if (d < bestd) - { - bestd = d; - best = v; - } - } - if (best && bestd < 150.0f) - { - pos.Set(best->GetPositionX(), best->GetPositionY(), best->GetPositionZ(), bot->GetMapId()); - posMap["bg objective"] = pos; - return true; - } - } - - // Choose a siege objective based on role and attacker/defender - Position siegeTarget = WG_GATE_POS; - if (!isDefender) - { - // Attacker priorities - if (role % 3 == 1) - siegeTarget = WG_TOWER_S_POS; // debuff defenders' vehicles - else if (role % 3 == 2) - siegeTarget = (bot->GetTeamId() == TEAM_ALLIANCE ? WG_TOWER_W_POS : WG_TOWER_E_POS); - } - else - { - // Defender priorities - // Hold gate, or shift to nearest southern tower to defend - if (role % 2 == 1) - siegeTarget = WG_GATE_POS; - else - siegeTarget = (bot->GetTeamId() == TEAM_ALLIANCE ? WG_TOWER_E_POS : WG_TOWER_W_POS); - } - - // Slight flanking for melee defenders at gate to avoid clogging the chokepoint - if (isDefender && siegeTarget.GetPositionX() == WG_GATE_POS.GetPositionX() && !botAI->IsRanged(bot)) - { - float ox = (role % 2 == 0 ? -12.0f : 12.0f); - float oy = (role % 3 == 0 ? -6.0f : 6.0f); - pos.Set(WG_GATE_POS.GetPositionX() + ox, WG_GATE_POS.GetPositionY() + oy, WG_GATE_POS.GetPositionZ(), bot->GetMapId()); - } - else - { - pos.Set(siegeTarget.GetPositionX(), siegeTarget.GetPositionY(), siegeTarget.GetPositionZ(), bot->GetMapId()); - } - posMap["bg objective"] = pos; - - // Also set siege aim position to help vehicle spells pick a destination - PositionInfo siege = posMap["bg siege"]; - siege.Set(pos.x, pos.y, pos.z, pos.mapId); - posMap["bg siege"] = siege; - return true; - } + // Note: Wintergrasp is a Battlefield on AzerothCore (handled by zoneId 4197 above) case BATTLEGROUND_WS: { Position target; @@ -3728,11 +3538,12 @@ bool BGTactics::selectObjective(bool reset) bool BGTactics::moveToObjective(bool ignoreDist) { Battleground* bg = bot->GetBattleground(); - if (!bg) + bool isWGZone = (bot->GetZoneId() == 4197); + if (!bg && !isWGZone) return false; - BattlegroundTypeId bgType = bg->GetBgTypeID(); - if (bgType == BATTLEGROUND_RB) + BattlegroundTypeId bgType = bg ? bg->GetBgTypeID() : BATTLEGROUND_TYPE_NONE; + if (bg && bgType == BATTLEGROUND_RB) bgType = bg->GetBgTypeID(true); PositionInfo pos = context->GetValue("position")->Get()["bg objective"]; @@ -3741,7 +3552,7 @@ bool BGTactics::moveToObjective(bool ignoreDist) else { // Use portals in Isle of Conquest Base - if (bgType == BATTLEGROUND_IC) + if (bg && bgType == BATTLEGROUND_IC) { if (IsLockedInsideKeep()) return true; @@ -3774,11 +3585,8 @@ bool BGTactics::moveToObjective(bool ignoreDist) bool BGTactics::selectObjectiveWp(std::vector const& vPaths) { Battleground* bg = bot->GetBattleground(); - if (!bg) - return false; - - BattlegroundTypeId bgType = bg->GetBgTypeID(); - if (bgType == BATTLEGROUND_RB) + BattlegroundTypeId bgType = bg ? bg->GetBgTypeID() : BATTLEGROUND_TYPE_NONE; + if (bg && bgType == BATTLEGROUND_RB) bgType = bg->GetBgTypeID(true); PositionMap& posMap = context->GetValue("position")->Get(); @@ -3786,12 +3594,12 @@ bool BGTactics::selectObjectiveWp(std::vector const& vPaths) if (!pos.isSet()) return false; - if (bgType == BATTLEGROUND_WS) + if (bg && bgType == BATTLEGROUND_WS) { if (wsJumpDown()) return true; } - else if (bgType == BATTLEGROUND_AV) + else if (bg && bgType == BATTLEGROUND_AV) { // get bots out of cave when they respawn there (otherwise path selection happens while they're deep within cave // and the results arent good) @@ -3801,7 +3609,7 @@ bool BGTactics::selectObjectiveWp(std::vector const& vPaths) return moveToStart(true); } } - else if (bgType == BATTLEGROUND_EY) + else if (bg && bgType == BATTLEGROUND_EY) { if (eyJumpDown()) return true; @@ -3914,12 +3722,11 @@ bool BGTactics::selectObjectiveWp(std::vector const& vPaths) bool BGTactics::resetObjective() { Battleground* bg = bot->GetBattleground(); - if (!bg) - return false; + bool isWGZone = (bot->GetZoneId() == 4197); // Adjust role-change chance based on battleground type uint32 oddsToChangeRole = 1; // default low - BattlegroundTypeId bgType = bg->GetBgTypeID(); + BattlegroundTypeId bgType = bg ? bg->GetBgTypeID() : BATTLEGROUND_TYPE_NONE; if (bgType == BATTLEGROUND_WS) oddsToChangeRole = 2; @@ -3927,6 +3734,8 @@ bool BGTactics::resetObjective() oddsToChangeRole = 1; else if (bgType == BATTLEGROUND_AV) oddsToChangeRole = 0; + else if (isWGZone) + oddsToChangeRole = 1; bool isCarryingFlag = bot->HasAura(BG_WS_SPELL_WARSONG_FLAG) || @@ -3991,14 +3800,11 @@ bool BGTactics::moveToObjectiveWp(BattleBotPath* const& currentPath, uint32 curr bool BGTactics::startNewPathBegin(std::vector const& vPaths) { Battleground* bg = bot->GetBattleground(); - if (!bg) - return false; - - BattlegroundTypeId bgType = bg->GetBgTypeID(); - if (bgType == BATTLEGROUND_RB) + BattlegroundTypeId bgType = bg ? bg->GetBgTypeID() : BATTLEGROUND_TYPE_NONE; + if (bg && bgType == BATTLEGROUND_RB) bgType = bg->GetBgTypeID(true); - if (bgType == BATTLEGROUND_IC) + if (bg && bgType == BATTLEGROUND_IC) return false; PositionInfo pos = context->GetValue("position")->Get()["bg objective"]; @@ -4052,11 +3858,8 @@ bool BGTactics::startNewPathBegin(std::vector const& vPaths) bool BGTactics::startNewPathFree(std::vector const& vPaths) { Battleground* bg = bot->GetBattleground(); - if (!bg) - return false; - - BattlegroundTypeId bgType = bg->GetBgTypeID(); - if (bgType == BATTLEGROUND_RB) + BattlegroundTypeId bgType = bg ? bg->GetBgTypeID() : BATTLEGROUND_TYPE_NONE; + if (bg && bgType == BATTLEGROUND_RB) bgType = bg->GetBgTypeID(true); if (bgType == BATTLEGROUND_IC) @@ -4118,12 +3921,13 @@ bool BGTactics::atFlag(std::vector const& vPaths, std::vectorGetBattleground(); - if (!bg) + bool isWGZone = (bot->GetZoneId() == 4197); + if (!bg && !isWGZone) return false; // Get the actual BG type (in case of random BG) - BattlegroundTypeId bgType = bg->GetBgTypeID(); - if (bgType == BATTLEGROUND_RB) + BattlegroundTypeId bgType = bg ? bg->GetBgTypeID() : BATTLEGROUND_TYPE_NONE; + if (bg && bgType == BATTLEGROUND_RB) bgType = bg->GetBgTypeID(true); // Initialize vectors for nearby objects and players @@ -4132,7 +3936,7 @@ bool BGTactics::atFlag(std::vector const& vPaths, std::vectorGetZoneId() == 4197) // Wintergrasp Battlefield + if (isWGZone) // Wintergrasp Battlefield { closeObjects = *context->GetValue("closest game objects"); closePlayers = *context->GetValue("closest friendly players"); @@ -4144,7 +3948,6 @@ bool BGTactics::atFlag(std::vector const& vPaths, std::vectorGetValue("closest game objects"); @@ -4195,7 +3998,7 @@ bool BGTactics::atFlag(std::vector const& vPaths, std::vector const& vPaths, std::vectorisSpawned() || go->GetGoState() != GO_STATE_READY) continue; - // Verify we can interact with it - if (!bot->CanUseBattlegroundObject(go) && bgType != BATTLEGROUND_WS) + // Verify we can interact with it (skip this check in Wintergrasp Battlefield) + if (!bot->CanUseBattlegroundObject(go) && !isWGZone && (!bg || bgType != BATTLEGROUND_WS)) continue; float const dist = bot->GetDistance(go); @@ -4292,13 +4095,60 @@ bool BGTactics::atFlag(std::vector const& vPaths, std::vectorHasAura(BG_WS_SPELL_WARSONG_FLAG) || bot->HasAura(BG_WS_SPELL_SILVERWING_FLAG))) continue; - // Handle capture mechanics based on BG type - switch (bgType) + // Handle capture mechanics based on BG type (or WG zone) + if (isWGZone) + { + // Special WG handling: Titan's Relic is a direct-use GO + if (go->GetEntry() == 192829) // GO_WINTERGRASP_TITAN_S_RELIC + { + if (dist < INTERACTION_DISTANCE) + { + WorldPacket data(CMSG_GAMEOBJ_USE); + data << go->GetGUID(); + bot->GetSession()->HandleGameObjectUseOpcode(data); + resetObjective(); + return true; + } + else + { + return MoveTo(bot->GetMapId(), go->GetPositionX(), go->GetPositionY(), go->GetPositionZ()); + } + } + + // Prevent capturing from inside flag pole + if (dist == 0.0f) + { + float const moveDist = bot->GetObjectSize() + go->GetObjectSize() + 0.1f; + return MoveTo(bot->GetMapId(), go->GetPositionX() + (urand(0, 1) ? -moveDist : moveDist), + go->GetPositionY() + (urand(0, 1) ? -moveDist : moveDist), go->GetPositionZ()); + } + + // Dismount before capturing + if (bot->IsMounted()) + bot->RemoveAurasByType(SPELL_AURA_MOUNTED); + + if (bot->IsInDisallowedMountForm()) + bot->RemoveAurasByType(SPELL_AURA_MOD_SHAPESHIFT); + + // Cast the capture spell on workshop banners + SpellInfo const* spellInfo = sSpellMgr->GetSpellInfo(SPELL_CAPTURE_BANNER); + if (!spellInfo) + return false; + + Spell* spell = new Spell(bot, spellInfo, TRIGGERED_NONE); + spell->m_targets.SetGOTarget(go); + spell->prepare(&spell->m_targets); + + botAI->WaitForSpellCast(spell); + + resetObjective(); + return true; + } + else switch (bgType) { case BATTLEGROUND_AV: case BATTLEGROUND_AB: case BATTLEGROUND_IC: - case BATTLEGROUND_WG: { // Special WG handling: Titan's Relic is a direct-use GO if (go->GetEntry() == 192829) // GO_WINTERGRASP_TITAN_S_RELIC diff --git a/src/strategy/generic/BattlegroundStrategy.cpp b/src/strategy/generic/BattlegroundStrategy.cpp index d4bfe5c787..53ddadd67d 100644 --- a/src/strategy/generic/BattlegroundStrategy.cpp +++ b/src/strategy/generic/BattlegroundStrategy.cpp @@ -107,6 +107,12 @@ void WintergraspStrategy::InitTriggers(std::vector& triggers) triggers.push_back(new TriggerNode("in vehicle", NextAction::array(0, new NextAction("ram", ACTION_MOVE + 9.0f), nullptr))); triggers.push_back(new TriggerNode("enemy is close", NextAction::array(0, new NextAction("ram", ACTION_MOVE + 9.1f), nullptr))); triggers.push_back(new TriggerNode("enemy out of melee", NextAction::array(0, new NextAction("steam rush", ACTION_MOVE + 9.2f), nullptr))); + + // Objective and capture flow for Battlefield WG (zone-based) + // Drive the same BGTactics actions used in BGs but without requiring InBattleground() + triggers.push_back(new TriggerNode("often", NextAction::array(0, new NextAction("bg move to objective", ACTION_BG), nullptr))); + triggers.push_back(new TriggerNode("often", NextAction::array(0, new NextAction("bg check flag", ACTION_BG + 1), nullptr))); + triggers.push_back(new TriggerNode("dead", NextAction::array(0, new NextAction("bg reset objective force", ACTION_EMERGENCY), nullptr))); } void ArenaStrategy::InitTriggers(std::vector& triggers) From 2d2f5163dcd9a5a7aa0cc12289899efa26611ce5 Mon Sep 17 00:00:00 2001 From: Icemansparks Date: Thu, 25 Sep 2025 20:28:30 +0200 Subject: [PATCH 041/151] Update src/strategy/actions/BattleGroundTactics.cpp Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com> --- src/strategy/actions/BattleGroundTactics.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/strategy/actions/BattleGroundTactics.cpp b/src/strategy/actions/BattleGroundTactics.cpp index d61445c80e..519ff2efc3 100644 --- a/src/strategy/actions/BattleGroundTactics.cpp +++ b/src/strategy/actions/BattleGroundTactics.cpp @@ -1651,7 +1651,7 @@ bool BGTactics::Execute(Event event) // Wintergrasp (Battlefield) support: set paths/flags by zone // Wintergrasp (Battlefield) support: set paths/flags by zone - isWGZone = (bot->GetZoneId() == 4197); + // isWGZone already set above if (isWGZone) { vPaths = &vPaths_WG; From 057c84543f19fc3567a92303d57771dd70891ac8 Mon Sep 17 00:00:00 2001 From: Icemansparks Date: Thu, 25 Sep 2025 20:30:16 +0200 Subject: [PATCH 042/151] Update src/strategy/actions/VehicleActions.cpp Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com> --- src/strategy/actions/VehicleActions.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/strategy/actions/VehicleActions.cpp b/src/strategy/actions/VehicleActions.cpp index b8fc4a47f5..949ef603c0 100644 --- a/src/strategy/actions/VehicleActions.cpp +++ b/src/strategy/actions/VehicleActions.cpp @@ -153,7 +153,7 @@ bool EnterVehicleAction::Execute(Event event) if (vehicleBase->HasUnitFlag(UNIT_FLAG_NOT_SELECTABLE)) continue; - // dont let them get in IoC cannons; allow WG tower cannons for defenders + // don't let them get in IoC cannons; allow WG tower cannons for defenders uint32 entry = vehicleBase->GetEntry(); if (NPC_KEEP_CANNON == entry || (!isWGDefender && entry == WG_TOWER_CANNON_ENTRY)) continue; From 01f0b71a172d5535a7d5755b897b19fbb4c76d16 Mon Sep 17 00:00:00 2001 From: kadeshar Date: Thu, 25 Sep 2025 20:31:42 +0200 Subject: [PATCH 043/151] - Code refactoring --- src/strategy/shaman/ShamanActions.cpp | 20 ++----------- src/strategy/shaman/ShamanActions.h | 40 ++++++++++++-------------- src/strategy/shaman/ShamanTriggers.cpp | 11 ++++--- 3 files changed, 28 insertions(+), 43 deletions(-) diff --git a/src/strategy/shaman/ShamanActions.cpp b/src/strategy/shaman/ShamanActions.cpp index c1cacad9fe..83e915da64 100644 --- a/src/strategy/shaman/ShamanActions.cpp +++ b/src/strategy/shaman/ShamanActions.cpp @@ -93,8 +93,9 @@ bool CastSpiritWalkAction::Execute(Event event) bool SetTotemAction::Execute(Event event) { + size_t spellIdsCount = sizeof(totemSpellIds) / sizeof(uint32); uint32 totemSpell = 0; - for (int i = (int)totemSpellIdsCount - 1; i >= 0; --i) + for (int i = (int)spellIdsCount - 1; i >= 0; --i) { if (bot->HasSpell(totemSpellIds[i])) { @@ -107,20 +108,3 @@ bool SetTotemAction::Execute(Event event) bot->addActionButton(actionButtonId, totemSpell, ACTION_BUTTON_SPELL); return true; } - -bool SetTotemAction::isUseful() -{ - Player* bot = botAI->GetBot(); - ActionButton const* button = bot->GetActionButton(actionButtonId); - if (!button || button->GetType() != ACTION_BUTTON_SPELL || button->GetAction() == 0) - return true; // No totem assigned - - // Find the highest rank the bot knows - for (int i = (int)totemSpellIdsCount - 1; i >= 0; --i) - { - if (bot->HasSpell(totemSpellIds[i])) - return button->GetAction() != totemSpellIds[i]; - } - // Bot doesn't know any valid rank - return false; -} diff --git a/src/strategy/shaman/ShamanActions.h b/src/strategy/shaman/ShamanActions.h index a3d57102c1..4d64bb1d2d 100644 --- a/src/strategy/shaman/ShamanActions.h +++ b/src/strategy/shaman/ShamanActions.h @@ -531,14 +531,12 @@ class CastNatureResistanceTotemAction : public CastTotemAction class SetTotemAction : public Action { public: - SetTotemAction(PlayerbotAI* botAI, std::string const totemName, const uint32 totemSpellIds[], size_t totemSpellIdsCount, int actionButtonId) - : Action(botAI, "set " + totemName), totemSpellIds(totemSpellIds), totemSpellIdsCount(totemSpellIdsCount), actionButtonId(actionButtonId) + SetTotemAction(PlayerbotAI* botAI, std::string const totemName, const uint32 totemSpellIds[], int actionButtonId) + : Action(botAI, "set " + totemName), totemSpellIds(totemSpellIds), actionButtonId(actionButtonId) { } bool Execute(Event event) override; - bool isUseful() override; uint32 const* totemSpellIds; - size_t totemSpellIdsCount; int actionButtonId; }; @@ -546,119 +544,119 @@ class SetStrengthOfEarthTotemAction : public SetTotemAction { public: SetStrengthOfEarthTotemAction(PlayerbotAI* ai) - : SetTotemAction(ai, "strength of earth totem", STRENGTH_OF_EARTH_TOTEM, sizeof(STRENGTH_OF_EARTH_TOTEM)/sizeof(uint32), TOTEM_BAR_SLOT_EARTH) {} + : SetTotemAction(ai, "strength of earth totem", STRENGTH_OF_EARTH_TOTEM, TOTEM_BAR_SLOT_EARTH) {} }; class SetStoneskinTotemAction : public SetTotemAction { public: SetStoneskinTotemAction(PlayerbotAI* ai) - : SetTotemAction(ai, "stoneskin totem", STONESKIN_TOTEM, sizeof(STONESKIN_TOTEM)/sizeof(uint32), TOTEM_BAR_SLOT_EARTH) {} + : SetTotemAction(ai, "stoneskin totem", STONESKIN_TOTEM, TOTEM_BAR_SLOT_EARTH) {} }; class SetTremorTotemAction : public SetTotemAction { public: SetTremorTotemAction(PlayerbotAI* ai) - : SetTotemAction(ai, "tremor totem", TREMOR_TOTEM, sizeof(TREMOR_TOTEM)/sizeof(uint32), TOTEM_BAR_SLOT_EARTH) {} + : SetTotemAction(ai, "tremor totem", TREMOR_TOTEM, TOTEM_BAR_SLOT_EARTH) {} }; class SetEarthbindTotemAction : public SetTotemAction { public: SetEarthbindTotemAction(PlayerbotAI* ai) - : SetTotemAction(ai, "earthbind totem", EARTHBIND_TOTEM, sizeof(EARTHBIND_TOTEM)/sizeof(uint32), TOTEM_BAR_SLOT_EARTH) {} + : SetTotemAction(ai, "earthbind totem", EARTHBIND_TOTEM, TOTEM_BAR_SLOT_EARTH) {} }; class SetSearingTotemAction : public SetTotemAction { public: SetSearingTotemAction(PlayerbotAI* ai) - : SetTotemAction(ai, "searing totem", SEARING_TOTEM, sizeof(SEARING_TOTEM)/sizeof(uint32), TOTEM_BAR_SLOT_FIRE) {} + : SetTotemAction(ai, "searing totem", SEARING_TOTEM, TOTEM_BAR_SLOT_FIRE) {} }; class SetMagmaTotemAction : public SetTotemAction { public: SetMagmaTotemAction(PlayerbotAI* ai) - : SetTotemAction(ai, "magma totem", MAGMA_TOTEM, sizeof(MAGMA_TOTEM)/sizeof(uint32), TOTEM_BAR_SLOT_FIRE) {} + : SetTotemAction(ai, "magma totem", MAGMA_TOTEM, TOTEM_BAR_SLOT_FIRE) {} }; class SetFlametongueTotemAction : public SetTotemAction { public: SetFlametongueTotemAction(PlayerbotAI* ai) - : SetTotemAction(ai, "flametongue totem", FLAMETONGUE_TOTEM, sizeof(FLAMETONGUE_TOTEM)/sizeof(uint32), TOTEM_BAR_SLOT_FIRE) {} + : SetTotemAction(ai, "flametongue totem", FLAMETONGUE_TOTEM, TOTEM_BAR_SLOT_FIRE) {} }; class SetTotemOfWrathAction : public SetTotemAction { public: SetTotemOfWrathAction(PlayerbotAI* ai) - : SetTotemAction(ai, "totem of wrath", TOTEM_OF_WRATH, sizeof(TOTEM_OF_WRATH)/sizeof(uint32), TOTEM_BAR_SLOT_FIRE) {} + : SetTotemAction(ai, "totem of wrath", TOTEM_OF_WRATH, TOTEM_BAR_SLOT_FIRE) {} }; class SetFrostResistanceTotemAction : public SetTotemAction { public: SetFrostResistanceTotemAction(PlayerbotAI* ai) - : SetTotemAction(ai, "frost resistance totem", FROST_RESISTANCE_TOTEM, sizeof(FROST_RESISTANCE_TOTEM)/sizeof(uint32), TOTEM_BAR_SLOT_FIRE) {} + : SetTotemAction(ai, "frost resistance totem", FROST_RESISTANCE_TOTEM, TOTEM_BAR_SLOT_FIRE) {} }; class SetHealingStreamTotemAction : public SetTotemAction { public: SetHealingStreamTotemAction(PlayerbotAI* ai) - : SetTotemAction(ai, "healing stream totem", HEALING_STREAM_TOTEM, sizeof(HEALING_STREAM_TOTEM)/sizeof(uint32), TOTEM_BAR_SLOT_WATER) {} + : SetTotemAction(ai, "healing stream totem", HEALING_STREAM_TOTEM, TOTEM_BAR_SLOT_WATER) {} }; class SetManaSpringTotemAction : public SetTotemAction { public: SetManaSpringTotemAction(PlayerbotAI* ai) - : SetTotemAction(ai, "mana spring totem", MANA_SPRING_TOTEM, sizeof(MANA_SPRING_TOTEM)/sizeof(uint32), TOTEM_BAR_SLOT_WATER) {} + : SetTotemAction(ai, "mana spring totem", MANA_SPRING_TOTEM, TOTEM_BAR_SLOT_WATER) {} }; class SetCleansingTotemAction : public SetTotemAction { public: SetCleansingTotemAction(PlayerbotAI* ai) - : SetTotemAction(ai, "cleansing totem", CLEANSING_TOTEM, sizeof(CLEANSING_TOTEM)/sizeof(uint32), TOTEM_BAR_SLOT_WATER) {} + : SetTotemAction(ai, "cleansing totem", CLEANSING_TOTEM, TOTEM_BAR_SLOT_WATER) {} }; class SetFireResistanceTotemAction : public SetTotemAction { public: SetFireResistanceTotemAction(PlayerbotAI* ai) - : SetTotemAction(ai, "fire resistance totem", FIRE_RESISTANCE_TOTEM, sizeof(FIRE_RESISTANCE_TOTEM)/sizeof(uint32), TOTEM_BAR_SLOT_WATER) {} + : SetTotemAction(ai, "fire resistance totem", FIRE_RESISTANCE_TOTEM, TOTEM_BAR_SLOT_WATER) {} }; class SetWrathOfAirTotemAction : public SetTotemAction { public: SetWrathOfAirTotemAction(PlayerbotAI* ai) - : SetTotemAction(ai, "wrath of air totem", WRATH_OF_AIR_TOTEM, sizeof(WRATH_OF_AIR_TOTEM)/sizeof(uint32), TOTEM_BAR_SLOT_AIR) {} + : SetTotemAction(ai, "wrath of air totem", WRATH_OF_AIR_TOTEM, TOTEM_BAR_SLOT_AIR) {} }; class SetWindfuryTotemAction : public SetTotemAction { public: SetWindfuryTotemAction(PlayerbotAI* ai) - : SetTotemAction(ai, "windfury totem", WINDFURY_TOTEM, sizeof(WINDFURY_TOTEM)/sizeof(uint32), TOTEM_BAR_SLOT_AIR) {} + : SetTotemAction(ai, "windfury totem", WINDFURY_TOTEM, TOTEM_BAR_SLOT_AIR) {} }; class SetNatureResistanceTotemAction : public SetTotemAction { public: SetNatureResistanceTotemAction(PlayerbotAI* ai) - : SetTotemAction(ai, "nature resistance totem", NATURE_RESISTANCE_TOTEM, sizeof(NATURE_RESISTANCE_TOTEM)/sizeof(uint32), TOTEM_BAR_SLOT_AIR) {} + : SetTotemAction(ai, "nature resistance totem", NATURE_RESISTANCE_TOTEM, TOTEM_BAR_SLOT_AIR) {} }; class SetGroundingTotemAction : public SetTotemAction { public: SetGroundingTotemAction(PlayerbotAI* ai) - : SetTotemAction(ai, "grounding totem", GROUNDING_TOTEM, sizeof(GROUNDING_TOTEM)/sizeof(uint32), TOTEM_BAR_SLOT_AIR) {} + : SetTotemAction(ai, "grounding totem", GROUNDING_TOTEM, TOTEM_BAR_SLOT_AIR) {} }; #endif diff --git a/src/strategy/shaman/ShamanTriggers.cpp b/src/strategy/shaman/ShamanTriggers.cpp index 35afbea1f9..225289e7b5 100644 --- a/src/strategy/shaman/ShamanTriggers.cpp +++ b/src/strategy/shaman/ShamanTriggers.cpp @@ -432,12 +432,15 @@ bool SetTotemTrigger::IsActive() return true; size_t totemSpellIdsCount = sizeof(totemSpellIds) / sizeof(uint32); - for (size_t i = 0; i < totemSpellIdsCount; ++i) + for (int i = (int)totemSpellIdsCount - 1; i >= 0; --i) + { - if (button->GetAction() == totemSpellIds[i]) + if (bot->HasSpell(totemSpellIds[i])) + { - return false; + return button->GetAction() != totemSpellIds[i]; } } - return true; + + return false; } From d315a0b7ff1a9c1cf3198be1892b789b341e6233 Mon Sep 17 00:00:00 2001 From: Tecc Date: Thu, 25 Sep 2025 20:43:31 +0200 Subject: [PATCH 044/151] Refactor Wintergrasp handling in BattleGroundTactics and VehicleActions for improved readability and maintainability --- src/strategy/actions/BattleGroundTactics.cpp | 51 ++++++++------------ src/strategy/actions/BattleGroundTactics.h | 2 + src/strategy/actions/VehicleActions.cpp | 8 +-- 3 files changed, 27 insertions(+), 34 deletions(-) diff --git a/src/strategy/actions/BattleGroundTactics.cpp b/src/strategy/actions/BattleGroundTactics.cpp index 519ff2efc3..714537218b 100644 --- a/src/strategy/actions/BattleGroundTactics.cpp +++ b/src/strategy/actions/BattleGroundTactics.cpp @@ -3755,6 +3755,23 @@ bool BGTactics::resetObjective() return selectObjective(true); } +bool BGTactics::handleWGTitansRelic(GameObject* go, float dist) +{ + if (!go || go->GetEntry() != 192829) + return false; + + if (dist < INTERACTION_DISTANCE) + { + WorldPacket data(CMSG_GAMEOBJ_USE); + data << go->GetGUID(); + bot->GetSession()->HandleGameObjectUseOpcode(data); + resetObjective(); + return true; + } + + return MoveTo(bot->GetMapId(), go->GetPositionX(), go->GetPositionY(), go->GetPositionZ()); +} + bool BGTactics::moveToObjectiveWp(BattleBotPath* const& currentPath, uint32 currentPoint, bool reverse) { if (!currentPath) @@ -4099,21 +4116,8 @@ bool BGTactics::atFlag(std::vector const& vPaths, std::vectorGetEntry() == 192829) // GO_WINTERGRASP_TITAN_S_RELIC - { - if (dist < INTERACTION_DISTANCE) - { - WorldPacket data(CMSG_GAMEOBJ_USE); - data << go->GetGUID(); - bot->GetSession()->HandleGameObjectUseOpcode(data); - resetObjective(); - return true; - } - else - { - return MoveTo(bot->GetMapId(), go->GetPositionX(), go->GetPositionY(), go->GetPositionZ()); - } - } + if (handleWGTitansRelic(go, dist)) + return true; // Prevent capturing from inside flag pole if (dist == 0.0f) @@ -4151,21 +4155,8 @@ bool BGTactics::atFlag(std::vector const& vPaths, std::vectorGetEntry() == 192829) // GO_WINTERGRASP_TITAN_S_RELIC - { - if (dist < INTERACTION_DISTANCE) - { - WorldPacket data(CMSG_GAMEOBJ_USE); - data << go->GetGUID(); - bot->GetSession()->HandleGameObjectUseOpcode(data); - resetObjective(); - return true; - } - else - { - return MoveTo(bot->GetMapId(), go->GetPositionX(), go->GetPositionY(), go->GetPositionZ()); - } - } + if (handleWGTitansRelic(go, dist)) + return true; // Prevent capturing from inside flag pole if (dist == 0.0f) diff --git a/src/strategy/actions/BattleGroundTactics.h b/src/strategy/actions/BattleGroundTactics.h index c933adb35f..8e91fbf348 100644 --- a/src/strategy/actions/BattleGroundTactics.h +++ b/src/strategy/actions/BattleGroundTactics.h @@ -13,6 +13,7 @@ class ChatHandler; class Battleground; class PlayerbotAI; struct Position; +class GameObject; #define SPELL_CAPTURE_BANNER 21651 @@ -132,6 +133,7 @@ class BGTactics : public MovementAction bool useBuff(); uint32 getPlayersInArea(TeamId teamId, Position point, float range, bool combat = true); bool IsLockedInsideKeep(); + bool handleWGTitansRelic(GameObject* go, float dist); }; class ArenaTactics : public MovementAction diff --git a/src/strategy/actions/VehicleActions.cpp b/src/strategy/actions/VehicleActions.cpp index 949ef603c0..3443e46485 100644 --- a/src/strategy/actions/VehicleActions.cpp +++ b/src/strategy/actions/VehicleActions.cpp @@ -66,8 +66,8 @@ bool EnterVehicleAction::Execute(Event event) return false; // In Wintergrasp, require rank aura before entering vehicles - bool inWG = (bot->GetZoneId() == WG_ZONE_ID); - if (inWG && !HasWGRankAtLeast(bot)) + bool isInWG = (bot->GetZoneId() == WG_ZONE_ID); + if (isInWG && !HasWGRankAtLeast(bot)) return false; Player* master = botAI->GetMaster(); @@ -90,7 +90,7 @@ bool EnterVehicleAction::Execute(Event event) // Prefer tower cannons for defenders when enemies are attacking near the fortress gate bool preferCannons = false; bool isWGDefender = false; - if (inWG) + if (isInWG) { if (Battlefield* bf = sBattlefieldMgr->GetBattlefieldToZoneId(WG_ZONE_ID)) { @@ -159,7 +159,7 @@ bool EnterVehicleAction::Execute(Event event) continue; // Enforce WG per-vehicle rank requirements when in WG - if (inWG) + if (isInWG) { if (!HasWGRankForVehicle(bot, entry)) continue; From fc69dd5ddd19be2e10a77a7b9c0d55da87ea4f5a Mon Sep 17 00:00:00 2001 From: Alex Dcnh <140754794+Wishmaster117@users.noreply.github.com> Date: Thu, 25 Sep 2025 21:42:34 +0200 Subject: [PATCH 045/151] FIX Random Bot Guilds not initialising random emblem, colors, etc #1636 (#1650) * FIX Random Bot Guilds not initialising random emblem, colors, etc #1636 FIX Random Bot Guilds not initialising random emblem, colors, etc #1636 * Update RandomPlayerbotFactory.cpp * Add sql patch an remove FixEmptyGuildEmblems() function --- ...5_09_25_01_playerbots_guild_tabard_fix.sql | 8 +++ src/RandomPlayerbotFactory.cpp | 52 ++++++++++++++++--- src/strategy/actions/GuildCreateActions.cpp | 12 ++++- 3 files changed, 65 insertions(+), 7 deletions(-) create mode 100644 data/sql/characters/updates/2025_09_25_01_playerbots_guild_tabard_fix.sql diff --git a/data/sql/characters/updates/2025_09_25_01_playerbots_guild_tabard_fix.sql b/data/sql/characters/updates/2025_09_25_01_playerbots_guild_tabard_fix.sql new file mode 100644 index 0000000000..38c74691c2 --- /dev/null +++ b/data/sql/characters/updates/2025_09_25_01_playerbots_guild_tabard_fix.sql @@ -0,0 +1,8 @@ +UPDATE guild +SET + EmblemStyle = FLOOR(RAND() * 181), + EmblemColor = FLOOR(RAND() * 18), + BorderStyle = FLOOR(RAND() * 8), + BorderColor = FLOOR(RAND() * 18), + BackgroundColor = FLOOR(RAND() * 52) +WHERE EmblemStyle=0 AND EmblemColor=0 AND BorderStyle=0 AND BorderColor=0 AND BackgroundColor=0; \ No newline at end of file diff --git a/src/RandomPlayerbotFactory.cpp b/src/RandomPlayerbotFactory.cpp index 291d6825ed..94f6928e48 100644 --- a/src/RandomPlayerbotFactory.cpp +++ b/src/RandomPlayerbotFactory.cpp @@ -15,6 +15,9 @@ #include "SharedDefines.h" #include "SocialMgr.h" #include "Timer.h" +#include "Guild.h" // EmblemInfo::SaveToDB +#include "Log.h" +#include "GuildMgr.h" std::map> RandomPlayerbotFactory::availableRaces; @@ -889,8 +892,10 @@ void RandomPlayerbotFactory::CreateRandomGuilds() availableLeaders.push_back(leader); } } - - for (; guildNumber < sPlayerbotAIConfig->randomBotGuildCount; ++guildNumber) + + // Create up to randomBotGuildCount by counting only EFFECTIVE creations + uint32 createdThisRun = 0; + for (; guildNumber < sPlayerbotAIConfig->randomBotGuildCount; /* ++guildNumber -> done only if creation */) { std::string const guildName = CreateRandomGuildName(); if (guildName.empty()) @@ -902,21 +907,29 @@ void RandomPlayerbotFactory::CreateRandomGuilds() if (availableLeaders.empty()) { LOG_ERROR("playerbots", "No leaders for random guilds available"); - continue; + break; // no more leaders: we can no longer progress without distorting the counter } uint32 index = urand(0, availableLeaders.size() - 1); ObjectGuid leader = availableLeaders[index]; + availableLeaders.erase(availableLeaders.begin() + index); // Removes the chosen leader to avoid re-selecting it repeatedly + Player* player = ObjectAccessor::FindPlayer(leader); if (!player) { LOG_ERROR("playerbots", "ObjectAccessor Cannot find player to set leader for guild {} . Skipped...", guildName.c_str()); + // we will try with other leaders in the next round (guildNumber is not incremented) continue; } if (player->GetGuildId()) + { + // leader already in guild -> we don't advance the counter, we move on to the next one continue; + } + + LOG_DEBUG("playerbots", "Creating guild name='{}' leader='{}'...", guildName.c_str(), player->GetName().c_str()); Guild* guild = new Guild(); if (!guild->Create(player, guildName)) @@ -929,6 +942,8 @@ void RandomPlayerbotFactory::CreateRandomGuilds() sGuildMgr->AddGuild(guild); + LOG_DEBUG("playerbots", "Guild created: id={} name='{}'", guild->GetId(), guildName.c_str()); + // create random emblem uint32 st, cl, br, bc, bg; bg = urand(0, 51); @@ -936,13 +951,38 @@ void RandomPlayerbotFactory::CreateRandomGuilds() cl = urand(0, 17); br = urand(0, 7); st = urand(0, 180); - EmblemInfo emblemInfo(st, cl, br, bc, bg); - guild->HandleSetEmblem(emblemInfo); + + LOG_DEBUG("playerbots", + "[TABARD] new guild id={} random -> style={}, color={}, borderStyle={}, borderColor={}, bgColor={}", + guild->GetId(), st, cl, br, bc, bg); + + // populate guild table with a random tabard design + CharacterDatabase.Execute( + "UPDATE guild SET EmblemStyle={}, EmblemColor={}, BorderStyle={}, BorderColor={}, BackgroundColor={} " + "WHERE guildid={}", + st, cl, br, bc, bg, guild->GetId()); + LOG_DEBUG("playerbots", "[TABARD] UPDATE done for guild id={}", guild->GetId()); + + // Immediate reading for log + if (QueryResult qr = CharacterDatabase.Query( + "SELECT EmblemStyle,EmblemColor,BorderStyle,BorderColor,BackgroundColor FROM guild WHERE guildid={}", + guild->GetId())) + { + Field* f = qr->Fetch(); + LOG_DEBUG("playerbots", + "[TABARD] DB check guild id={} => style={}, color={}, borderStyle={}, borderColor={}, bgColor={}", + guild->GetId(), f[0].Get(), f[1].Get(), f[2].Get(), f[3].Get(), f[4].Get()); + } sPlayerbotAIConfig->randomBotGuilds.push_back(guild->GetId()); + // The guild is only counted if it is actually created + ++guildNumber; + ++createdThisRun; } - LOG_INFO("playerbots", "{} random bot guilds available", guildNumber); + // Shows the true total and how many were created during this run + LOG_INFO("playerbots", "{} random bot guilds available (created this run: {})", + uint32(sPlayerbotAIConfig->randomBotGuilds.size()), createdThisRun); } std::string const RandomPlayerbotFactory::CreateRandomGuildName() diff --git a/src/strategy/actions/GuildCreateActions.cpp b/src/strategy/actions/GuildCreateActions.cpp index 57d22fc2f3..caa920c711 100644 --- a/src/strategy/actions/GuildCreateActions.cpp +++ b/src/strategy/actions/GuildCreateActions.cpp @@ -12,6 +12,7 @@ #include "Playerbots.h" #include "RandomPlayerbotFactory.h" #include "ServerFacade.h" +#include "SharedDefines.h" // GOLD bool BuyPetitionAction::Execute(Event event) { @@ -237,6 +238,15 @@ bool PetitionTurnInAction::Execute(Event event) if (bot->GetGuildId()) { + // Ensure that bot has at least 10g for HandleSetEmblem can be managed core side + // (EMBLEM_PRICE = 10 * GOLD in core) + static constexpr uint32 REQUIRED = 10 * GOLD; + uint32 have = bot->GetMoney(); // actual money earned by bot in copper + if (have < REQUIRED) + { + bot->ModifyMoney(int32(REQUIRED - have)); // add only the missing amount to bot to reach 10g + } + Guild* guild = sGuildMgr->GetGuildById(bot->GetGuildId()); uint32 st, cl, br, bc, bg; @@ -247,7 +257,7 @@ bool PetitionTurnInAction::Execute(Event event) st = urand(0, 180); EmblemInfo emblemInfo(st, cl, br, bc, bg); - guild->HandleSetEmblem(emblemInfo); + guild->HandleSetEmblem(emblemInfo); // official core handling // LANG_GUILD_VETERAN -> can invite guild->HandleSetRankInfo(2, GR_RIGHT_GCHATLISTEN | GR_RIGHT_GCHATSPEAK | GR_RIGHT_INVITE); From c6b40acdb3140c22c669b39c03c43190219a26bc Mon Sep 17 00:00:00 2001 From: Tecc Date: Thu, 25 Sep 2025 21:56:49 +0200 Subject: [PATCH 046/151] Implement Wintergrasp support for random bots: add auto-join queue, travel, and war entry actions --- conf/playerbots.conf.dist | 5 + src/AiFactory.cpp | 13 +- src/PlayerbotAIConfig.cpp | 2 + src/PlayerbotAIConfig.h | 2 + src/strategy/actions/ActionContext.h | 7 + src/strategy/actions/BattleGroundTactics.cpp | 148 ++++++++++++++++++ src/strategy/actions/BattleGroundTactics.h | 30 ++++ src/strategy/generic/BattlegroundStrategy.cpp | 9 ++ 8 files changed, 207 insertions(+), 9 deletions(-) diff --git a/conf/playerbots.conf.dist b/conf/playerbots.conf.dist index 4e76eb095e..6c3a75660c 100644 --- a/conf/playerbots.conf.dist +++ b/conf/playerbots.conf.dist @@ -1016,6 +1016,11 @@ AiPlayerbot.ZoneBracket.3537 = 68,75 AiPlayerbot.ZoneBracket.3711 = 75,80 AiPlayerbot.ZoneBracket.4197 = 79,80 +# Random bots may auto-join the Wintergrasp queue (anywhere), so at war start they get teleported in. +# This simulates queuing via the Dalaran WG battlemage/gossip and fills teams when players join. +# Default: 1 (enabled) +AiPlayerbot.RandomBotAutoJoinWGQueue = 1 + # # # diff --git a/src/AiFactory.cpp b/src/AiFactory.cpp index c01bdb4a98..d73996b65b 100644 --- a/src/AiFactory.cpp +++ b/src/AiFactory.cpp @@ -729,15 +729,10 @@ void AiFactory::AddDefaultNonCombatStrategies(Player* player, PlayerbotAI* const { nonCombatEngine->ChangeStrategy(sPlayerbotAIConfig->nonCombatStrategies); } - // Add Wintergrasp strategy only when a WG battle is active in the zone - if (player->GetZoneId() == 4197) - { - if (Battlefield* bf = sBattlefieldMgr->GetBattlefieldToZoneId(4197)) - { - if (bf->IsWarTime()) - nonCombatEngine->addStrategy("wintergrasp", false); - } - } + // Ensure Wintergrasp strategy is available; triggers inside gate actual behavior. + // Always add for random bots so they can react to wartime and travel. + if (sRandomPlayerbotMgr->IsRandomBot(player) || (sBattlefieldMgr->GetBattlefieldToZoneId(4197) != nullptr)) + nonCombatEngine->addStrategy("wintergrasp", false); // nonCombatEngine->addStrategy("battleground"); // nonCombatEngine->addStrategy("warsong"); diff --git a/src/PlayerbotAIConfig.cpp b/src/PlayerbotAIConfig.cpp index 100bed925f..300e7ff522 100644 --- a/src/PlayerbotAIConfig.cpp +++ b/src/PlayerbotAIConfig.cpp @@ -318,6 +318,8 @@ bool PlayerbotAIConfig::Initialize() randomBotJoinBG = sConfigMgr->GetOption("AiPlayerbot.RandomBotJoinBG", true); randomBotAutoJoinBG = sConfigMgr->GetOption("AiPlayerbot.RandomBotAutoJoinBG", false); + // Wintergrasp (Battlefield) queue participation + randomBotAutoJoinWGQueue = sConfigMgr->GetOption("AiPlayerbot.RandomBotAutoJoinWGQueue", true); randomBotAutoJoinArenaBracket = sConfigMgr->GetOption("AiPlayerbot.RandomBotAutoJoinArenaBracket", 7); diff --git a/src/PlayerbotAIConfig.h b/src/PlayerbotAIConfig.h index 134276988b..4465973989 100644 --- a/src/PlayerbotAIConfig.h +++ b/src/PlayerbotAIConfig.h @@ -218,6 +218,8 @@ class PlayerbotAIConfig bool randomBotJoinBG; bool randomBotAutoJoinBG; + // Wintergrasp (Battlefield) queue: allow random bots to join queue (teleport on war start) + bool randomBotAutoJoinWGQueue; std::string randomBotAutoJoinICBrackets; std::string randomBotAutoJoinEYBrackets; diff --git a/src/strategy/actions/ActionContext.h b/src/strategy/actions/ActionContext.h index 7d458e2b31..100aefbcbe 100644 --- a/src/strategy/actions/ActionContext.h +++ b/src/strategy/actions/ActionContext.h @@ -206,6 +206,10 @@ class ActionContext : public NamedObjectContext creators["bg use buff"] = &ActionContext::bg_use_buff; creators["attack enemy flag carrier"] = &ActionContext::attack_enemy_fc; creators["bg check flag"] = &ActionContext::bg_check_flag; + creators["wg travel"] = &ActionContext::wg_travel; + creators["wg queue"] = &ActionContext::wg_queue; + creators["wg enter war"] = &ActionContext::wg_enter_war; + creators["wg travel"] = &ActionContext::wg_travel; // Vehicles creators["enter vehicle"] = &ActionContext::enter_vehicle; @@ -394,6 +398,9 @@ class ActionContext : public NamedObjectContext static Action* attack_enemy_fc(PlayerbotAI* botAI) { return new AttackEnemyFlagCarrierAction(botAI); } static Action* bg_use_buff(PlayerbotAI* botAI) { return new BGTactics(botAI, "use buff"); } static Action* bg_check_flag(PlayerbotAI* botAI) { return new BGTactics(botAI, "check flag"); } + static Action* wg_travel(PlayerbotAI* botAI) { return new WintergraspTravelAction(botAI); } + static Action* wg_queue(PlayerbotAI* botAI) { return new WintergraspQueueAction(botAI); } + static Action* wg_enter_war(PlayerbotAI* botAI) { return new WintergraspEnterWarAction(botAI); } // Vehicles static Action* enter_vehicle(PlayerbotAI* botAI) { return new EnterVehicleAction(botAI); } diff --git a/src/strategy/actions/BattleGroundTactics.cpp b/src/strategy/actions/BattleGroundTactics.cpp index 714537218b..526e1ad24b 100644 --- a/src/strategy/actions/BattleGroundTactics.cpp +++ b/src/strategy/actions/BattleGroundTactics.cpp @@ -30,6 +30,11 @@ #include "PathGenerator.h" #include "ServerFacade.h" #include "Vehicle.h" +#include "BattlefieldMgr.h" +#include "Battlefield.h" +#include "ChooseTravelTargetAction.h" +#include "ObjectAccessor.h" +#include "TravelMgr.h" // common bg positions Position const WS_WAITING_POS_HORDE_1 = {944.981f, 1423.478f, 345.434f, 6.18f}; @@ -4613,6 +4618,149 @@ bool ArenaTactics::Execute(Event event) return true; } +bool WintergraspTravelAction::isUseful() +{ + if (!sRandomPlayerbotMgr->IsRandomBot(bot)) + return false; + + if (bot->InBattleground() || bot->IsInCombat()) + return false; + + if (bot->GetZoneId() == 4197) // already in WG + return false; + + if (Battlefield* bf = sBattlefieldMgr->GetBattlefieldToZoneId(4197)) + { + // Travel during wartime, or pre-stage when the battlefield exists (no timer exposed; staging is opportunistic) + return true; + } + + return false; +} + +bool WintergraspTravelAction::Execute(Event event) +{ + // Find a travel destination that matches Wintergrasp and set it as travel target + TravelTarget* target = context->GetValue("travel target")->Get(); + + // Avoid overriding an active travel toward WG repeatedly + if (target->isTraveling()) + return false; + + if (TravelDestination* dest = ChooseTravelTargetAction::FindDestination(bot, "Wintergrasp")) + { + WorldPosition botPos(bot); + std::vector points = dest->nextPoint(&botPos, true); + if (points.empty()) + return false; + + target->setTarget(dest, points.front()); + target->setForced(true); + + if (!botAI->HasStrategy("travel", BOT_STATE_NON_COMBAT)) + botAI->ChangeStrategy("+travel", BOT_STATE_NON_COMBAT); + + LOG_INFO("playerbots", "Bot {} <{}>: Traveling to Wintergrasp (Battlefield)", bot->GetGUID().ToString().c_str(), bot->GetName()); + + return true; + } + + return false; +} + +bool WintergraspQueueAction::isUseful() +{ + if (!sRandomPlayerbotMgr->IsRandomBot(bot)) + return false; + + if (!sPlayerbotAIConfig->randomBotAutoTravelWG) + return false; + + if (bot->InBattleground() || bot->IsInCombat()) + return false; + + Battlefield* bf = sBattlefieldMgr->GetBattlefieldToZoneId(4197); + if (!bf) + return false; + + // Queue only before wartime + if (bf->IsWarTime()) + return false; + + // Simple level gate: respect WG bracket (default 79-80) + auto it = sRandomPlayerbotMgr->zone2LevelBracket.find(4197); + if (it != sRandomPlayerbotMgr->zone2LevelBracket.end()) + { + uint32 minL = it->second.first; + if (bot->GetLevel() < minL) + return false; + } + + return true; +} + +bool WintergraspQueueAction::Execute(Event /*event*/) +{ + if (Battlefield* bf = sBattlefieldMgr->GetBattlefieldToZoneId(4197)) + { + bf->PlayerAcceptInviteToQueue(bot); + return true; + } + return false; +} + +bool WintergraspEnterWarAction::isUseful() +{ + if (!sRandomPlayerbotMgr->IsRandomBot(bot)) + return false; + + Battlefield* bf = sBattlefieldMgr->GetBattlefieldToZoneId(4197); + if (!bf) + return false; + + // Only when war time is active + if (!bf->IsWarTime()) + return false; + + // If already in Wintergrasp map/zone, no need + if (bot->GetZoneId() == 4197) + return false; + + // If auto-join queue is disabled, only fill when real players joined (present in WG) + if (!sPlayerbotAIConfig->randomBotAutoJoinWGQueue) + { + std::shared_lock lock(*HashMapHolder::GetLock()); + HashMapHolder::MapType const& m = ObjectAccessor::GetPlayers(); + bool realPresent = false; + for (auto const& pair : m) + { + Player* plr = pair.second; + if (!plr || !plr->IsInWorld()) + continue; + if (plr->GetZoneId() != 4197) + continue; + if (sRandomPlayerbotMgr->IsRandomBot(plr)) + continue; // skip bots + realPresent = true; + break; + } + if (!realPresent) + return false; + } + + return true; +} + +bool WintergraspEnterWarAction::Execute(Event /*event*/) +{ + if (Battlefield* bf = sBattlefieldMgr->GetBattlefieldToZoneId(4197)) + { + bf->PlayerAcceptInviteToWar(bot); + return true; + } + return false; +} + bool ArenaTactics::moveToCenter(Battleground* bg) { // Sanity check diff --git a/src/strategy/actions/BattleGroundTactics.h b/src/strategy/actions/BattleGroundTactics.h index 8e91fbf348..02db609bca 100644 --- a/src/strategy/actions/BattleGroundTactics.h +++ b/src/strategy/actions/BattleGroundTactics.h @@ -147,4 +147,34 @@ class ArenaTactics : public MovementAction bool moveToCenter(Battleground* bg); }; +// Travel to Wintergrasp (Battlefield) when a battle is active +class WintergraspTravelAction : public Action +{ +public: + WintergraspTravelAction(PlayerbotAI* botAI, std::string const name = "wg travel") : Action(botAI, name) {} + + bool Execute(Event event) override; + bool isUseful() override; +}; + +// Join the Wintergrasp queue anywhere (no NPC gossip), using battlefield API +class WintergraspQueueAction : public Action +{ +public: + WintergraspQueueAction(PlayerbotAI* botAI, std::string const name = "wg queue") : Action(botAI, name) {} + + bool Execute(Event event) override; + bool isUseful() override; +}; + +// Enter the Wintergrasp war (teleport), using battlefield API +class WintergraspEnterWarAction : public Action +{ +public: + WintergraspEnterWarAction(PlayerbotAI* botAI, std::string const name = "wg enter war") : Action(botAI, name) {} + + bool Execute(Event event) override; + bool isUseful() override; +}; + #endif diff --git a/src/strategy/generic/BattlegroundStrategy.cpp b/src/strategy/generic/BattlegroundStrategy.cpp index 53ddadd67d..e7fc3d6346 100644 --- a/src/strategy/generic/BattlegroundStrategy.cpp +++ b/src/strategy/generic/BattlegroundStrategy.cpp @@ -91,6 +91,15 @@ void IsleStrategy::InitTriggers(std::vector& triggers) // Generic PvP and non-combat strategies added by AiFactory handle target selection and fighting. void WintergraspStrategy::InitTriggers(std::vector& triggers) { + // Travel to Wintergrasp during wartime (random bots) + triggers.push_back(new TriggerNode("often", NextAction::array(0, new NextAction("wg travel", ACTION_BG + 0.5f), nullptr))); + + // Pre-wartime queuing so bots get teleported when war starts + triggers.push_back(new TriggerNode("often", NextAction::array(0, new NextAction("wg queue", ACTION_BG + 0.6f), nullptr))); + + // On wartime, accept entry (teleport into WG) even if not in zone + triggers.push_back(new TriggerNode("often", NextAction::array(0, new NextAction("wg enter war", ACTION_BG + 0.7f), nullptr))); + // Proactively try to get into a vehicle when the battle is active triggers.push_back(new TriggerNode("bg active", NextAction::array(0, new NextAction("enter vehicle", ACTION_MOVE + 7.0f), nullptr))); triggers.push_back(new TriggerNode("often", NextAction::array(0, new NextAction("enter vehicle", ACTION_MOVE + 6.5f), nullptr))); From d530947df5747743514548816eba49694410339d Mon Sep 17 00:00:00 2001 From: Tecc Date: Thu, 25 Sep 2025 22:04:24 +0200 Subject: [PATCH 047/151] Add Wintergrasp support for random bots: enable participation and queue auto-join --- conf/playerbots.conf.dist | 14 ++++++++++---- src/PlayerbotAIConfig.cpp | 2 ++ src/PlayerbotAIConfig.h | 2 ++ src/strategy/actions/BattleGroundTactics.cpp | 8 +++++++- 4 files changed, 21 insertions(+), 5 deletions(-) diff --git a/conf/playerbots.conf.dist b/conf/playerbots.conf.dist index 6c3a75660c..73e06efb9f 100644 --- a/conf/playerbots.conf.dist +++ b/conf/playerbots.conf.dist @@ -1016,10 +1016,6 @@ AiPlayerbot.ZoneBracket.3537 = 68,75 AiPlayerbot.ZoneBracket.3711 = 75,80 AiPlayerbot.ZoneBracket.4197 = 79,80 -# Random bots may auto-join the Wintergrasp queue (anywhere), so at war start they get teleported in. -# This simulates queuing via the Dalaran WG battlemage/gossip and fills teams when players join. -# Default: 1 (enabled) -AiPlayerbot.RandomBotAutoJoinWGQueue = 1 # # @@ -1084,6 +1080,16 @@ AiPlayerbot.RandomBotJoinBG = 1 # Enable auto-joining of battlegrounds - have bots start battlegrounds and arenas on their own AiPlayerbot.RandomBotAutoJoinBG = 0 + +# Allow random bots to participate in Wintergrasp (Battlefield) and fill the teams +# Similar to AiPlayerbot.RandomBotJoinBG for battlegrounds. +# Default: 1 (enabled) +AiPlayerbot.RandomBotJoinWG = 1 + +# Random bots may auto-join the Wintergrasp queue (anywhere), so at war start they get teleported in. +# This simulates queuing via the Dalaran WG battlemage/gossip and fills teams when players join. +# Default: 1 (enabled) +AiPlayerbot.RandomBotAutoJoinWGQueue = 0 # Required Configuration for RandomBotAutoJoinBG # diff --git a/src/PlayerbotAIConfig.cpp b/src/PlayerbotAIConfig.cpp index 300e7ff522..7fcc1dda39 100644 --- a/src/PlayerbotAIConfig.cpp +++ b/src/PlayerbotAIConfig.cpp @@ -318,6 +318,8 @@ bool PlayerbotAIConfig::Initialize() randomBotJoinBG = sConfigMgr->GetOption("AiPlayerbot.RandomBotJoinBG", true); randomBotAutoJoinBG = sConfigMgr->GetOption("AiPlayerbot.RandomBotAutoJoinBG", false); + // Wintergrasp master toggle (similar to RandomBotJoinBG) + randomBotJoinWG = sConfigMgr->GetOption("AiPlayerbot.RandomBotJoinWG", true); // Wintergrasp (Battlefield) queue participation randomBotAutoJoinWGQueue = sConfigMgr->GetOption("AiPlayerbot.RandomBotAutoJoinWGQueue", true); diff --git a/src/PlayerbotAIConfig.h b/src/PlayerbotAIConfig.h index 4465973989..651ae60a86 100644 --- a/src/PlayerbotAIConfig.h +++ b/src/PlayerbotAIConfig.h @@ -218,6 +218,8 @@ class PlayerbotAIConfig bool randomBotJoinBG; bool randomBotAutoJoinBG; + // Wintergrasp (Battlefield) master toggle: allow random bots to participate/fill + bool randomBotJoinWG; // Wintergrasp (Battlefield) queue: allow random bots to join queue (teleport on war start) bool randomBotAutoJoinWGQueue; diff --git a/src/strategy/actions/BattleGroundTactics.cpp b/src/strategy/actions/BattleGroundTactics.cpp index 526e1ad24b..f8fcad369f 100644 --- a/src/strategy/actions/BattleGroundTactics.cpp +++ b/src/strategy/actions/BattleGroundTactics.cpp @@ -4673,7 +4673,10 @@ bool WintergraspQueueAction::isUseful() if (!sRandomPlayerbotMgr->IsRandomBot(bot)) return false; - if (!sPlayerbotAIConfig->randomBotAutoTravelWG) + if (!sPlayerbotAIConfig->randomBotJoinWG) + return false; + + if (!sPlayerbotAIConfig->randomBotAutoJoinWGQueue) return false; if (bot->InBattleground() || bot->IsInCombat()) @@ -4714,6 +4717,9 @@ bool WintergraspEnterWarAction::isUseful() if (!sRandomPlayerbotMgr->IsRandomBot(bot)) return false; + if (!sPlayerbotAIConfig->randomBotJoinWG) + return false; + Battlefield* bf = sBattlefieldMgr->GetBattlefieldToZoneId(4197); if (!bf) return false; From 60db1ce1cac5e335b67fc3060d8ac09f37a83fec Mon Sep 17 00:00:00 2001 From: Tecc Date: Thu, 25 Sep 2025 22:11:19 +0200 Subject: [PATCH 048/151] Update playerbots configuration for Wintergrasp: enable auto-join queue and add conditional checks in tactics --- conf/playerbots.conf.dist | 4 ++++ src/strategy/actions/BattleGroundTactics.cpp | 3 +++ 2 files changed, 7 insertions(+) diff --git a/conf/playerbots.conf.dist b/conf/playerbots.conf.dist index 73e06efb9f..5f443ded33 100644 --- a/conf/playerbots.conf.dist +++ b/conf/playerbots.conf.dist @@ -1090,6 +1090,10 @@ AiPlayerbot.RandomBotJoinWG = 1 # This simulates queuing via the Dalaran WG battlemage/gossip and fills teams when players join. # Default: 1 (enabled) AiPlayerbot.RandomBotAutoJoinWGQueue = 0 +# Note: AiPlayerbot.RandomBotAutoJoinWGQueue takes effect only when +# AiPlayerbot.RandomBotJoinWG = 1. When both are enabled, random bots may +# queue for WG on their own. When only RandomBotJoinWG is enabled, bots will +# fill when real players have queued and the battle is underway. # Required Configuration for RandomBotAutoJoinBG # diff --git a/src/strategy/actions/BattleGroundTactics.cpp b/src/strategy/actions/BattleGroundTactics.cpp index f8fcad369f..fb77426ce6 100644 --- a/src/strategy/actions/BattleGroundTactics.cpp +++ b/src/strategy/actions/BattleGroundTactics.cpp @@ -4623,6 +4623,9 @@ bool WintergraspTravelAction::isUseful() if (!sRandomPlayerbotMgr->IsRandomBot(bot)) return false; + if (!sPlayerbotAIConfig->randomBotJoinWG) + return false; + if (bot->InBattleground() || bot->IsInCombat()) return false; From b990c1d5e6d4347c0ba9157f8d4f73422b649979 Mon Sep 17 00:00:00 2001 From: Tecc Date: Thu, 25 Sep 2025 22:16:46 +0200 Subject: [PATCH 049/151] Fix level bracket retrieval in WintergraspQueueAction: change from 'first' to 'low' for accurate minimum level check --- src/strategy/actions/BattleGroundTactics.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/strategy/actions/BattleGroundTactics.cpp b/src/strategy/actions/BattleGroundTactics.cpp index fb77426ce6..0b21252f80 100644 --- a/src/strategy/actions/BattleGroundTactics.cpp +++ b/src/strategy/actions/BattleGroundTactics.cpp @@ -4697,7 +4697,7 @@ bool WintergraspQueueAction::isUseful() auto it = sRandomPlayerbotMgr->zone2LevelBracket.find(4197); if (it != sRandomPlayerbotMgr->zone2LevelBracket.end()) { - uint32 minL = it->second.first; + uint32 minL = it->second.low; if (bot->GetLevel() < minL) return false; } From 54039a3fb84dca1e3b51c01f4ee1a5e0634cf52c Mon Sep 17 00:00:00 2001 From: Tecc Date: Thu, 25 Sep 2025 22:37:13 +0200 Subject: [PATCH 050/151] Add detailed logging for Wintergrasp actions: enhance debugging information for travel, queue, and war entry conditions --- src/strategy/actions/BattleGroundTactics.cpp | 53 ++++++++++++++++++++ 1 file changed, 53 insertions(+) diff --git a/src/strategy/actions/BattleGroundTactics.cpp b/src/strategy/actions/BattleGroundTactics.cpp index 0b21252f80..6a0d3a77f0 100644 --- a/src/strategy/actions/BattleGroundTactics.cpp +++ b/src/strategy/actions/BattleGroundTactics.cpp @@ -4624,13 +4624,22 @@ bool WintergraspTravelAction::isUseful() return false; if (!sPlayerbotAIConfig->randomBotJoinWG) + { + LOG_DEBUG("playerbots", "WG travel gated: randomBotJoinWG=0 for bot {}", bot->GetName()); return false; + } if (bot->InBattleground() || bot->IsInCombat()) + { + LOG_DEBUG("playerbots", "WG travel gated: InBattleground={} InCombat={} for bot {}", bot->InBattleground(), bot->IsInCombat(), bot->GetName()); return false; + } if (bot->GetZoneId() == 4197) // already in WG + { + LOG_DEBUG("playerbots", "WG travel gated: already in WG zone for bot {}", bot->GetName()); return false; + } if (Battlefield* bf = sBattlefieldMgr->GetBattlefieldToZoneId(4197)) { @@ -4638,6 +4647,7 @@ bool WintergraspTravelAction::isUseful() return true; } + LOG_DEBUG("playerbots", "WG travel gated: no Battlefield for WG (zone 4197) for bot {}", bot->GetName()); return false; } @@ -4677,21 +4687,36 @@ bool WintergraspQueueAction::isUseful() return false; if (!sPlayerbotAIConfig->randomBotJoinWG) + { + LOG_DEBUG("playerbots", "WG queue gated: randomBotJoinWG=0 for bot {}", bot->GetName()); return false; + } if (!sPlayerbotAIConfig->randomBotAutoJoinWGQueue) + { + LOG_DEBUG("playerbots", "WG queue gated: randomBotAutoJoinWGQueue=0 for bot {}", bot->GetName()); return false; + } if (bot->InBattleground() || bot->IsInCombat()) + { + LOG_DEBUG("playerbots", "WG queue gated: InBattleground={} InCombat={} for bot {}", bot->InBattleground(), bot->IsInCombat(), bot->GetName()); return false; + } Battlefield* bf = sBattlefieldMgr->GetBattlefieldToZoneId(4197); if (!bf) + { + LOG_DEBUG("playerbots", "WG queue gated: no Battlefield for WG (zone 4197) for bot {}", bot->GetName()); return false; + } // Queue only before wartime if (bf->IsWarTime()) + { + LOG_DEBUG("playerbots", "WG queue gated: wartime already active for bot {}", bot->GetName()); return false; + } // Simple level gate: respect WG bracket (default 79-80) auto it = sRandomPlayerbotMgr->zone2LevelBracket.find(4197); @@ -4699,7 +4724,10 @@ bool WintergraspQueueAction::isUseful() { uint32 minL = it->second.low; if (bot->GetLevel() < minL) + { + LOG_DEBUG("playerbots", "WG queue gated: level {} below bracket low {} for bot {}", bot->GetLevel(), minL, bot->GetName()); return false; + } } return true; @@ -4710,8 +4738,10 @@ bool WintergraspQueueAction::Execute(Event /*event*/) if (Battlefield* bf = sBattlefieldMgr->GetBattlefieldToZoneId(4197)) { bf->PlayerAcceptInviteToQueue(bot); + LOG_INFO("playerbots", "Bot {} queued for Wintergrasp", bot->GetName()); return true; } + LOG_DEBUG("playerbots", "WG queue Execute: no Battlefield for WG (zone 4197) for bot {}", bot->GetName()); return false; } @@ -4721,19 +4751,31 @@ bool WintergraspEnterWarAction::isUseful() return false; if (!sPlayerbotAIConfig->randomBotJoinWG) + { + LOG_DEBUG("playerbots", "WG enter gated: randomBotJoinWG=0 for bot {}", bot->GetName()); return false; + } Battlefield* bf = sBattlefieldMgr->GetBattlefieldToZoneId(4197); if (!bf) + { + LOG_DEBUG("playerbots", "WG enter gated: no Battlefield for WG (zone 4197) for bot {}", bot->GetName()); return false; + } // Only when war time is active if (!bf->IsWarTime()) + { + LOG_DEBUG("playerbots", "WG enter gated: not wartime for bot {}", bot->GetName()); return false; + } // If already in Wintergrasp map/zone, no need if (bot->GetZoneId() == 4197) + { + LOG_DEBUG("playerbots", "WG enter gated: already in WG zone for bot {}", bot->GetName()); return false; + } // If auto-join queue is disabled, only fill when real players joined (present in WG) if (!sPlayerbotAIConfig->randomBotAutoJoinWGQueue) @@ -4741,6 +4783,7 @@ bool WintergraspEnterWarAction::isUseful() std::shared_lock lock(*HashMapHolder::GetLock()); HashMapHolder::MapType const& m = ObjectAccessor::GetPlayers(); bool realPresent = false; + uint32 realCount = 0; for (auto const& pair : m) { Player* plr = pair.second; @@ -4751,10 +4794,18 @@ bool WintergraspEnterWarAction::isUseful() if (sRandomPlayerbotMgr->IsRandomBot(plr)) continue; // skip bots realPresent = true; + ++realCount; break; } if (!realPresent) + { + LOG_DEBUG("playerbots", "WG enter gated: no real players in WG zone; bot {} will wait", bot->GetName()); return false; + } + else + { + LOG_DEBUG("playerbots", "WG enter ok: {} real players detected in WG zone; bot {} may fill", realCount, bot->GetName()); + } } return true; @@ -4765,8 +4816,10 @@ bool WintergraspEnterWarAction::Execute(Event /*event*/) if (Battlefield* bf = sBattlefieldMgr->GetBattlefieldToZoneId(4197)) { bf->PlayerAcceptInviteToWar(bot); + LOG_INFO("playerbots", "Bot {} forced entry into Wintergrasp war", bot->GetName()); return true; } + LOG_DEBUG("playerbots", "WG enter Execute: no Battlefield for WG (zone 4197) for bot {}", bot->GetName()); return false; } From f26c4e99f6530441b703300af952d9fee9781924 Mon Sep 17 00:00:00 2001 From: Gonzalo Date: Thu, 25 Sep 2025 18:26:28 -0300 Subject: [PATCH 051/151] Fix: Prevent bots from eating and drinking while mounted This change modifies the `DrinkAction::Execute()` and `EatAction::Execute()` functions in `src/strategy/actions/NonCombatActions.cpp`. Previously, playerbots could attempt to eat food or drink water while mounted, which is not possible in the game and creates unrealistic behavior. This fix adds mount state checks to both actions: 1. `DrinkAction::Execute()` now checks `bot->IsMounted()` and returns false if mounted 2. `EatAction::Execute()` now checks `bot->IsMounted()` and returns false if mounted This prevents bots from attempting to consume food or drinks while mounted, improving bot behavior realism and preventing unnecessary action attempts that would fail anyway. --- src/strategy/actions/NonCombatActions.cpp | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/src/strategy/actions/NonCombatActions.cpp b/src/strategy/actions/NonCombatActions.cpp index d3c49decce..b696a27bc9 100644 --- a/src/strategy/actions/NonCombatActions.cpp +++ b/src/strategy/actions/NonCombatActions.cpp @@ -13,6 +13,10 @@ bool DrinkAction::Execute(Event event) if (bot->IsInCombat()) return false; + // Don't drink while mounted + if (bot->IsMounted()) + return false; + bool hasMana = AI_VALUE2(bool, "has mana", "self target"); if (!hasMana) return false; @@ -66,6 +70,10 @@ bool EatAction::Execute(Event event) if (bot->IsInCombat()) return false; + // Don't eat while mounted + if (bot->IsMounted()) + return false; + if (botAI->HasCheat(BotCheatMask::food)) { // if (bot->IsNonMeleeSpellCast(true)) From dff4934dd160c5b27c7805f91bb2c109de3eaa46 Mon Sep 17 00:00:00 2001 From: Gonzalo Date: Thu, 25 Sep 2025 18:35:18 -0300 Subject: [PATCH 052/151] Fix: Prevent priests in Spirit of Redemption form from using mana This change modifies the `HasManaValue::Calculate()` function in `src/strategy/values/StatsValues.cpp`. Previously, priests in Spirit of Redemption form (angel form when dead) could still attempt to use mana-restoring actions like drinking water, which is illogical since they cannot use mana in that form. This fix adds a check for the Spirit of Redemption aura (spell ID 20711) to prevent mana usage: - If the target has the Spirit of Redemption aura, the function returns false - This prevents priests in angel form from attempting to drink water or use other mana-restoring actions - Improves bot behavior realism by respecting the limitations of the Spirit of Redemption form This change works in conjunction with the previous fix that prevents non-mana-using classes from attempting to restore mana, creating a more comprehensive solution for mana management. --- src/strategy/values/StatsValues.cpp | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/strategy/values/StatsValues.cpp b/src/strategy/values/StatsValues.cpp index 2c87ec7265..1208c56778 100644 --- a/src/strategy/values/StatsValues.cpp +++ b/src/strategy/values/StatsValues.cpp @@ -119,6 +119,9 @@ bool HasManaValue::Calculate() Unit* target = GetTarget(); if (!target) return false; + + if (target->HasAura(20711)) // Spirit of Redemption + return false; return target->GetPower(POWER_MANA); } From 005ddee367e83cc383f845377ad1a7409bce291c Mon Sep 17 00:00:00 2001 From: Tecc Date: Fri, 26 Sep 2025 00:31:21 +0200 Subject: [PATCH 053/151] Add Wintergrasp fill logic for random bots: implement CheckWGFill to manage bot participation during wartime --- src/RandomPlayerbotMgr.cpp | 110 +++++++++++++++++++++++++++++++++++++ src/RandomPlayerbotMgr.h | 2 + 2 files changed, 112 insertions(+) diff --git a/src/RandomPlayerbotMgr.cpp b/src/RandomPlayerbotMgr.cpp index c0a9d25f83..de6b10fe5b 100644 --- a/src/RandomPlayerbotMgr.cpp +++ b/src/RandomPlayerbotMgr.cpp @@ -52,6 +52,8 @@ #include "Unit.h" #include "UpdateTime.h" #include "World.h" +#include "BattlefieldMgr.h" +#include "Battlefield.h" struct GuidClassRaceInfo { @@ -458,6 +460,13 @@ void RandomPlayerbotMgr::UpdateAIInternal(uint32 elapsed, bool /*minimal*/) sRandomPlayerbotMgr->CheckBgQueue(); } + // Fill Wintergrasp during wartime when a real player is present, up to 40 per team + if (sPlayerbotAIConfig->randomBotJoinWG) + { + if (time(nullptr) > (WGCheckTimer + 5)) + sRandomPlayerbotMgr->CheckWGFill(); + } + if (sPlayerbotAIConfig->randomBotJoinLfg /* && !players.empty()*/) { if (time(nullptr) > (LfgCheckTimer + 30)) @@ -1361,6 +1370,107 @@ void RandomPlayerbotMgr::CheckLfgQueue() LOG_DEBUG("playerbots", "LFG Queue check finished"); } +void RandomPlayerbotMgr::CheckWGFill() +{ + if (!WGCheckTimer) + { + WGCheckTimer = time(nullptr); + return; + } + + WGCheckTimer = time(nullptr); + + Battlefield* bf = sBattlefieldMgr->GetBattlefieldToZoneId(4197 /* Wintergrasp */); + if (!bf) + return; + + if (!bf->IsWarTime()) + return; + + // Count real players and bots currently in WG zone by team + uint32 realInWG[2] = {0, 0}; + uint32 botInWG[2] = {0, 0}; + + for (Player* p : players) + { + if (!p || !p->IsInWorld()) + continue; + if (p->GetZoneId() != 4197) + continue; + + TeamId t = p->GetTeamId(); + if (sRandomPlayerbotMgr->IsRandomBot(p)) + ++botInWG[t]; + else + ++realInWG[t]; + } + + // Only fill if at least one real player is present on any side + if (realInWG[TEAM_ALLIANCE] == 0 && realInWG[TEAM_HORDE] == 0) + return; + + // desired cap per team from worldserver config (same value BattlefieldWG uses) + const uint32 teamCap = sWorld->getIntConfig(CONFIG_WINTERGRASP_PLR_MAX); + + // WG level bracket (default 79-80) + uint32 minLevel = 79; + auto it = zone2LevelBracket.find(4197); + if (it != zone2LevelBracket.end()) + minLevel = it->second.low; + + // Build eligible bot lists per team + std::vector eligible[2]; + for (Player* p : players) + { + if (!p || !p->IsInWorld()) + continue; + if (!sRandomPlayerbotMgr->IsRandomBot(p)) + continue; + if (p->GetLevel() < minLevel) + continue; + if (p->InBattleground()) + continue; + if (p->GetZoneId() == 4197) + continue; // already in WG + + eligible[p->GetTeamId()].push_back(p); + } + + auto inviteTeam = [&](TeamId team) + { + uint32 current = realInWG[team] + botInWG[team]; + if (current >= teamCap) + return; + uint32 need = teamCap - current; + + uint32 invited = 0; + // randomize selection to spread load + std::shuffle(eligible[team].begin(), eligible[team].end(), *GetRandomGenerator()); + for (Player* b : eligible[team]) + { + if (!b || !b->IsInWorld()) + continue; + + bf->PlayerAcceptInviteToWar(b); + ++invited; + if (invited >= need) + break; + } + + if (invited) + { + LOG_INFO("playerbots", "WG fill: invited {} bots for {} (real={}, bots={}, cap={})", invited, + team == TEAM_ALLIANCE ? "Alliance" : "Horde", realInWG[team], botInWG[team], teamCap); + } + }; + + LOG_DEBUG("playerbots", "WG fill check: A(real={}, bots={}) H(real={}, bots={})", realInWG[TEAM_ALLIANCE], + botInWG[TEAM_ALLIANCE], realInWG[TEAM_HORDE], botInWG[TEAM_HORDE]); + + inviteTeam(TEAM_ALLIANCE); + inviteTeam(TEAM_HORDE); +} + void RandomPlayerbotMgr::CheckPlayers() { if (!PlayersCheckTimer || time(nullptr) > (PlayersCheckTimer + 60)) diff --git a/src/RandomPlayerbotMgr.h b/src/RandomPlayerbotMgr.h index ed4c1cd2f9..f10eb8eb21 100644 --- a/src/RandomPlayerbotMgr.h +++ b/src/RandomPlayerbotMgr.h @@ -154,6 +154,7 @@ class RandomPlayerbotMgr : public PlayerbotHolder std::map> LfgDungeons; void CheckBgQueue(); void CheckLfgQueue(); + void CheckWGFill(); void CheckPlayers(); void LogBattlegroundInfo(); @@ -211,6 +212,7 @@ class RandomPlayerbotMgr : public PlayerbotHolder std::vector GetBgBots(uint32 bracket); time_t BgCheckTimer; time_t LfgCheckTimer; + time_t WGCheckTimer; time_t PlayersCheckTimer; time_t RealPlayerLastTimeSeen = 0; time_t DelayLoginBotsTimer; From f444227e32724c6db2cb8ce9b501672fb91f48f4 Mon Sep 17 00:00:00 2001 From: Tecc Date: Fri, 26 Sep 2025 00:57:50 +0200 Subject: [PATCH 054/151] Refactor randomization in CheckWGFill: use global RandomEngine for load distribution --- src/RandomPlayerbotMgr.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/RandomPlayerbotMgr.cpp b/src/RandomPlayerbotMgr.cpp index de6b10fe5b..4a3b2a127f 100644 --- a/src/RandomPlayerbotMgr.cpp +++ b/src/RandomPlayerbotMgr.cpp @@ -1444,8 +1444,8 @@ void RandomPlayerbotMgr::CheckWGFill() uint32 need = teamCap - current; uint32 invited = 0; - // randomize selection to spread load - std::shuffle(eligible[team].begin(), eligible[team].end(), *GetRandomGenerator()); + // randomize selection to spread load (use our global RandomEngine) + std::shuffle(eligible[team].begin(), eligible[team].end(), RandomEngine::Instance()); for (Player* b : eligible[team]) { if (!b || !b->IsInWorld()) From e8954f6cba039150886f1d68c5d57e18090006ab Mon Sep 17 00:00:00 2001 From: crow Date: Fri, 26 Sep 2025 10:01:12 -0500 Subject: [PATCH 055/151] resolve some comments + more Formatting edits and improved Malchezaar --- .../raids/karazhan/RaidKarazhanActions.cpp | 212 ++++++++++++------ .../raids/karazhan/RaidKarazhanHelpers.cpp | 74 ++++-- .../raids/karazhan/RaidKarazhanHelpers.h | 44 ++-- .../karazhan/RaidKarazhanMultipliers.cpp | 46 +++- .../raids/karazhan/RaidKarazhanTriggers.cpp | 77 ++----- 5 files changed, 283 insertions(+), 170 deletions(-) diff --git a/src/strategy/raids/karazhan/RaidKarazhanActions.cpp b/src/strategy/raids/karazhan/RaidKarazhanActions.cpp index 243352511d..eb23d72cac 100644 --- a/src/strategy/raids/karazhan/RaidKarazhanActions.cpp +++ b/src/strategy/raids/karazhan/RaidKarazhanActions.cpp @@ -18,7 +18,7 @@ namespace bool KarazhanAttumenTheHuntsmanStackBehindAction::Execute(Event event) { RaidKarazhanHelpers karazhanHelper(botAI); - Unit* boss = karazhanHelper.GetFirstAliveUnitByEntry(NPC_ATTUMEN_THE_HUNTSMAN); + Unit* boss = karazhanHelper.GetFirstAliveUnitByEntry(NPC_ATTUMEN_THE_HUNTSMAN_MOUNTED); float distance = 5.0f; float orientation = boss->GetOrientation() + M_PI; @@ -34,12 +34,9 @@ bool KarazhanAttumenTheHuntsmanStackBehindAction::Execute(Event event) bool KarazhanAttumenTheHuntsmanStackBehindAction::isUseful() { RaidKarazhanHelpers karazhanHelper(botAI); - Unit* boss = karazhanHelper.GetFirstAliveUnitByEntry(NPC_ATTUMEN_THE_HUNTSMAN); + Unit* boss = karazhanHelper.GetFirstAliveUnitByEntry(NPC_ATTUMEN_THE_HUNTSMAN_MOUNTED); - if (boss && botAI->IsTank(bot) && botAI->HasAggro(boss) && boss->GetVictim() == bot) - return false; - - return boss != nullptr; + return boss && !(botAI->IsTank(bot) && botAI->HasAggro(boss) && boss->GetVictim() == bot); } bool KarazhanMoroesMarkTargetAction::Execute(Event event) @@ -70,7 +67,9 @@ bool KarazhanMaidenOfVirtuePositionBossAction::Execute(Event event) { Player* member = itr->GetSource(); if (!member || !member->IsAlive() || !botAI->IsHeal(member) || !member->HasAura(SPELL_REPENTANCE)) + { continue; + } healer = member; break; } @@ -82,9 +81,10 @@ bool KarazhanMaidenOfVirtuePositionBossAction::Execute(Event event) float targetX = healer->GetPositionX() + cos(angle) * 6.0f; float targetY = healer->GetPositionY() + sin(angle) * 6.0f; float targetZ = healer->GetPositionZ(); - - return MoveTo(bot->GetMapId(), targetX, targetY, targetZ, false, false, false, true, - MovementPriority::MOVEMENT_COMBAT); + { + return MoveTo(bot->GetMapId(), targetX, targetY, targetZ, false, false, false, true, + MovementPriority::MOVEMENT_COMBAT); + } } const float maxDistance = 3.0f; @@ -96,9 +96,10 @@ bool KarazhanMaidenOfVirtuePositionBossAction::Execute(Event event) float dY = KARAZHAN_MAIDEN_OF_VIRTUE_BOSS_POSITION.GetPositionY() - boss->GetPositionY(); float mX = KARAZHAN_MAIDEN_OF_VIRTUE_BOSS_POSITION.GetPositionX() + (dX / distanceToBossPosition) * maxDistance; float mY = KARAZHAN_MAIDEN_OF_VIRTUE_BOSS_POSITION.GetPositionY() + (dY / distanceToBossPosition) * maxDistance; - - return MoveTo(bot->GetMapId(), mX, mY, - bot->GetPositionZ(), false, false, false, false, MovementPriority::MOVEMENT_COMBAT, true, false); + { + return MoveTo(bot->GetMapId(), mX, mY, + bot->GetPositionZ(), false, false, false, false, MovementPriority::MOVEMENT_COMBAT, true, false); + } } return false; } @@ -121,8 +122,10 @@ bool KarazhanMaidenOfVirtuePositionRangedAction::Execute(Event event) { Unit* member = botAI->GetUnit(memberGuid); - if (!member || !botAI->IsRanged(member->ToPlayer())) + if (!member || !botAI->IsRanged(member->ToPlayer())) + { continue; + } if (member == bot) break; @@ -137,12 +140,12 @@ bool KarazhanMaidenOfVirtuePositionRangedAction::Execute(Event event) float distance = bot->GetExactDist2d(KARAZHAN_MAIDEN_OF_VIRTUE_RANGED_POSITION[index]); const float maxDistance = 2.0f; - if (distance > maxDistance) + { return MoveTo(bot->GetMapId(), KARAZHAN_MAIDEN_OF_VIRTUE_RANGED_POSITION[index].GetPositionX(), KARAZHAN_MAIDEN_OF_VIRTUE_RANGED_POSITION[index].GetPositionY(), bot->GetPositionZ(), false, false, false, false, MovementPriority::MOVEMENT_COMBAT, true, false); - + } return false; } @@ -173,11 +176,9 @@ bool KarazhanBigBadWolfPositionBossAction::Execute(Event event) { return false; } - return MoveTo(bot->GetMapId(), mX, mY, bot->GetPositionZ(), false, false, false, false, MovementPriority::MOVEMENT_COMBAT, true, false); } - return false; } @@ -200,7 +201,6 @@ bool KarazhanBigBadWolfRunAwayAction::Execute(Event event) currentIndex = (currentIndex + 1) % 4; target = KARAZHAN_BIG_BAD_WOLF_RUN_POSITION[currentIndex]; } - return MoveTo(bot->GetMapId(), target.GetPositionX(), target.GetPositionY(), target.GetPositionZ(), false, false, false, true, MovementPriority::MOVEMENT_FORCED); } @@ -220,11 +220,17 @@ bool KarazhanRomuloAndJulianneMarkTargetAction::Execute(Event event) const int maxPctDifference = 10; if (julianne->GetHealthPct() + maxPctDifference < romulo->GetHealthPct() || julianne->GetHealthPct() < 1.0f) + { target = romulo; + } else if (romulo->GetHealthPct() + maxPctDifference < julianne->GetHealthPct() || romulo->GetHealthPct() < 1.0f) + { target = julianne; + } if (!target) + { return false; + } RaidKarazhanHelpers karazhanHelper(botAI); karazhanHelper.MarkTargetWithSkull(target); @@ -252,25 +258,33 @@ bool KarazhanWizardOfOzScorchStrawmanAction::Execute(Event event) { Unit* strawman = AI_VALUE2(Unit*, "find target", "strawman"); if (!strawman || !strawman->IsAlive()) + { return false; + } Group* group = bot->GetGroup(); if (!group) + { return false; + } for (GroupReference* itr = group->GetFirstMember(); itr != nullptr; itr = itr->next()) { Player* member = itr->GetSource(); if (!member || !member->IsAlive()) + { continue; - + } if (member->getClass() != CLASS_MAGE) + { continue; - + } + PlayerbotAI* mageAI = sPlayerbotsMgr->GetPlayerbotAI(member); if (!mageAI) + { continue; - + } if (mageAI->CanCastSpell("scorch", strawman)) { mageAI->CastSpell("scorch", strawman); @@ -283,7 +297,9 @@ bool KarazhanTheCuratorMarkTargetAction::Execute(Event event) { Unit* target = AI_VALUE2(Unit*, "find target", "astral flare"); if (!target || !target->IsAlive()) + { return false; + } RaidKarazhanHelpers karazhanHelper(botAI); karazhanHelper.MarkTargetWithSkull(target); @@ -294,7 +310,6 @@ bool KarazhanTheCuratorMarkTargetAction::Execute(Event event) bool KarazhanTheCuratorPositionBossAction::Execute(Event event) { Unit* boss = AI_VALUE2(Unit*, "find target", "the curator"); - const float maxDistance = 3.0f; const float distanceToBossPosition = boss->GetExactDist2d(KARAZHAN_THE_CURATOR_BOSS_POSITION); @@ -302,13 +317,13 @@ bool KarazhanTheCuratorPositionBossAction::Execute(Event event) { float dX = KARAZHAN_THE_CURATOR_BOSS_POSITION.GetPositionX() - boss->GetPositionX(); float dY = KARAZHAN_THE_CURATOR_BOSS_POSITION.GetPositionY() - boss->GetPositionY(); - float mX = KARAZHAN_THE_CURATOR_BOSS_POSITION.GetPositionX() + (dX / distanceToBossPosition) * maxDistance; float mY = KARAZHAN_THE_CURATOR_BOSS_POSITION.GetPositionY() + (dY / distanceToBossPosition) * maxDistance; - - return MoveTo(bot->GetMapId(), mX, mY, - bot->GetPositionZ(), false, false, false, false, MovementPriority::MOVEMENT_COMBAT, true, - false); + { + return MoveTo(bot->GetMapId(), mX, mY, + bot->GetPositionZ(), false, false, false, false, MovementPriority::MOVEMENT_COMBAT, true, + false); + } } return false; } @@ -327,8 +342,9 @@ bool KarazhanTheCuratorSpreadRangedAction::Execute(Event event) Unit* nearestPlayer = karazhanHelper.GetNearestPlayerInRadius(minDistance); if (nearestPlayer) + { return FleePosition(nearestPlayer->GetPosition(), minDistance); - + } return false; } @@ -343,11 +359,12 @@ bool KarazhanTerestianIllhoofMarkTargetAction::Execute(Event event) { Unit* boss = AI_VALUE2(Unit*, "find target", "terestian illhoof"); if (!boss) + { return false; + } RaidKarazhanHelpers karazhanHelper(botAI); Unit* target = karazhanHelper.GetFirstAliveUnitByEntry(NPC_DEMON_CHAINS); - if (!target || !target->IsAlive()) { target = karazhanHelper.GetFirstAliveUnitByEntry(NPC_KILREK); @@ -357,7 +374,7 @@ bool KarazhanTerestianIllhoofMarkTargetAction::Execute(Event event) } } karazhanHelper.MarkTargetWithSkull(target); - + return false; } @@ -374,17 +391,15 @@ bool KarazhanShadeOfAranArcaneExplosionRunAwayAction::Execute(Event event) { return MoveAway(boss, safeDistance - distance); } - return false; } bool KarazhanShadeOfAranArcaneExplosionRunAwayAction::isUseful() { Unit* boss = AI_VALUE2(Unit*, "find target", "shade of aran"); - if (!boss || !boss->IsAlive()) - return false; - return boss->HasUnitState(UNIT_STATE_CASTING) && boss->FindCurrentSpellBySpellId(SPELL_ARCANE_EXPLOSION); + return boss && boss->IsAlive() && boss->HasUnitState(UNIT_STATE_CASTING) && + boss->FindCurrentSpellBySpellId(SPELL_ARCANE_EXPLOSION); } bool KarazhanShadeOfAranFlameWreathStopMovementAction::Execute(Event event) @@ -395,8 +410,9 @@ bool KarazhanShadeOfAranFlameWreathStopMovementAction::Execute(Event event) AI_VALUE(LastMovement&, "last movement").Set(nullptr); bot->GetMotionMaster()->Clear(); if (bot->isMoving()) + { bot->StopMoving(); - + } return true; } return false; @@ -407,8 +423,9 @@ bool KarazhanShadeOfAranMarkConjuredElementalAction::Execute(Event event) RaidKarazhanHelpers karazhanHelper(botAI); Unit* boss = AI_VALUE2(Unit*, "find target", "shade of aran"); if (!boss || !boss->IsAlive()) + { return false; - + } Unit* target = karazhanHelper.GetFirstAliveUnitByEntry(NPC_CONJURED_ELEMENTAL); if (!target || !target->IsAlive() || target->HasAura(SPELL_WARLOCK_BANISH)) { @@ -430,23 +447,23 @@ bool KarazhanShadeOfAranSpreadRangedAction::Execute(Event event) float dX = bot->GetPositionX() - boss->GetPositionX(); float dY = bot->GetPositionY() - boss->GetPositionY(); float length = std::sqrt(dX * dX + dY * dY); - dX /= length; dY /= length; - float tX = boss->GetPositionX() + dX * maxBossDistance; float tY = boss->GetPositionY() + dY * maxBossDistance; - - return MoveTo(bot->GetMapId(), tX, tY, bot->GetPositionZ(), false, false, false, true, - MovementPriority::MOVEMENT_COMBAT); + { + return MoveTo(bot->GetMapId(), tX, tY, bot->GetPositionZ(), false, false, false, true, + MovementPriority::MOVEMENT_COMBAT); + } } const float minDistance = 5.0f; RaidKarazhanHelpers karazhanHelper(botAI); Unit* nearestPlayer = karazhanHelper.GetNearestPlayerInRadius(minDistance); if (nearestPlayer) + { return FleePosition(nearestPlayer->GetPosition(), minDistance); - + } return false; } @@ -454,7 +471,9 @@ bool KarazhanShadeOfAranSpreadRangedAction::isUseful() { Unit* boss = AI_VALUE2(Unit*, "find target", "shade of aran"); if (!boss || !boss->IsAlive()) + { return false; + } RaidKarazhanHelpers karazhanHelper(botAI); @@ -471,19 +490,27 @@ bool KarazhanNetherspiteBlockRedBeamAction::Execute(Event event) Group* group = bot->GetGroup(); if (!group) + { return false; + } Player* eligibleTank = nullptr; for (GroupReference* itr = group->GetFirstMember(); itr != nullptr; itr = itr->next()) { Player* member = itr->GetSource(); if (!member || !member->IsAlive()) + { continue; + } PlayerbotAI* memberAI = sPlayerbotsMgr->GetPlayerbotAI(member); if (!memberAI || !memberAI->IsTank(member)) + { continue; + } if (member->HasAura(SPELL_NETHER_EXHAUSTION_RED)) + { continue; + } eligibleTank = member; break; } @@ -522,8 +549,9 @@ bool KarazhanNetherspiteBlockRedBeamAction::Execute(Event event) float dy = py - by; float length = sqrt(dx*dx + dy*dy); if (length == 0.0f) + { return false; - + } dx /= length; dy /= length; float perpDx = -dy; @@ -549,8 +577,9 @@ bool KarazhanNetherspiteBlockRedBeamAction::isUseful() bool bossIsBanished = boss && boss->HasAura(SPELL_NETHERSPITE_BANISHED); if (!boss || !redPortal) + { return false; - + } if (lastBossBanishState[botGuid] != bossIsBanished) { if (!bossIsBanished) @@ -560,10 +589,10 @@ bool KarazhanNetherspiteBlockRedBeamAction::isUseful() } lastBossBanishState[botGuid] = bossIsBanished; } - if (bossIsBanished) + { return false; - + } return true; } @@ -606,7 +635,9 @@ bool KarazhanNetherspiteBlockBlueBeamAction::Execute(Event event) float dy = py - by; float length = sqrt(dx*dx + dy*dy); if (length == 0.0f) + { return false; + } dx /= length; dy /= length; @@ -630,8 +661,9 @@ bool KarazhanNetherspiteBlockBlueBeamAction::Execute(Event event) } } if (!outsideAllVoidZones) + { continue; - + } float distToIdeal = fabs(dist - 18.0f); if (!found || distToIdeal < bestDist) { @@ -698,8 +730,9 @@ bool KarazhanNetherspiteBlockGreenBeamAction::Execute(Event event) float dy = py - by; float length = sqrt(dx*dx + dy*dy); if (length == 0.0f) + { return false; - + } dx /= length; dy /= length; float bestDist = 150.0f; @@ -722,8 +755,9 @@ bool KarazhanNetherspiteBlockGreenBeamAction::Execute(Event event) } } if (!outsideAllVoidZones) + { continue; - + } float distToIdeal = fabs(dist - 18.0f); if (!found || distToIdeal < bestDist) { @@ -771,27 +805,30 @@ bool KarazhanNetherspiteAvoidBeamAndVoidZoneAction::Execute(Event event) break; } } + struct BeamAvoid { Unit* portal; float minDist, maxDist; }; std::vector beams; Unit* redPortal = bot->FindNearestCreature(NPC_RED_PORTAL, 150.0f); Unit* bluePortal = bot->FindNearestCreature(NPC_BLUE_PORTAL, 150.0f); Unit* greenPortal = bot->FindNearestCreature(NPC_GREEN_PORTAL, 150.0f); - - if (redPortal) { + if (redPortal) + { float bx = boss->GetPositionX(), by = boss->GetPositionY(); float px = redPortal->GetPositionX(), py = redPortal->GetPositionY(); float dx = px - bx, dy = py - by; float length = sqrt(dx*dx + dy*dy); beams.push_back({redPortal, 0.0f, length}); } - if (bluePortal) { + if (bluePortal) + { float bx = boss->GetPositionX(), by = boss->GetPositionY(); float px = bluePortal->GetPositionX(), py = bluePortal->GetPositionY(); float dx = px - bx, dy = py - by; float length = sqrt(dx*dx + dy*dy); beams.push_back({bluePortal, 0.0f, length}); } - if (greenPortal) { + if (greenPortal) + { float bx = boss->GetPositionX(), by = boss->GetPositionY(); float px = greenPortal->GetPositionX(), py = greenPortal->GetPositionY(); float dx = px - bx, dy = py - by; @@ -806,8 +843,10 @@ bool KarazhanNetherspiteAvoidBeamAndVoidZoneAction::Execute(Event event) float px = beam.portal->GetPositionX(), py = beam.portal->GetPositionY(); float dx = px - bx, dy = py - by; float length = sqrt(dx*dx + dy*dy); - if (length == 0.0f) continue; - + if (length == 0.0f) + {continue; + continue; + } dx /= length; dy /= length; float botdx = bot->GetPositionX() - bx, botdy = bot->GetPositionY() - by; float t = (botdx * dx + botdy * dy); @@ -821,7 +860,9 @@ bool KarazhanNetherspiteAvoidBeamAndVoidZoneAction::Execute(Event event) } if (!nearVoidZone && !nearBeam) + { return false; + } const float minMoveDist = 3.0f, maxSearchDist = 20.0f, stepAngle = M_PI/18.0f, stepDist = 0.5f; float bossZ = boss->GetPositionZ(); @@ -836,8 +877,9 @@ bool KarazhanNetherspiteAvoidBeamAndVoidZoneAction::Execute(Event event) float cy = bot->GetPositionY() + sin(angle) * dist; float cz = bossZ; if (std::any_of(voidZones.begin(), voidZones.end(), [&](Unit* vz){ return Position(cx, cy, cz).GetExactDist2d(vz) < 4.0f; })) + { continue; - + } bool tooCloseToBeam = false; for (const auto& beam : beams) { @@ -845,7 +887,10 @@ bool KarazhanNetherspiteAvoidBeamAndVoidZoneAction::Execute(Event event) float px = beam.portal->GetPositionX(), py = beam.portal->GetPositionY(); float dx = px - bx, dy = py - by; float length = sqrt(dx*dx + dy*dy); - if (length == 0.0f) continue; + if (length == 0.0f) + { + continue; + } dx /= length; dy /= length; float botdx = cx - bx, botdy = cy - by; float t = (botdx * dx + botdy * dy); @@ -857,11 +902,15 @@ bool KarazhanNetherspiteAvoidBeamAndVoidZoneAction::Execute(Event event) break; } } - if (tooCloseToBeam) continue; - + if (tooCloseToBeam) + { + continue; + } float moveDist = sqrt(pow(cx - bot->GetPositionX(), 2) + pow(cy - bot->GetPositionY(), 2)); - if (moveDist < minMoveDist) continue; - + if (moveDist < minMoveDist) + { + continue; + } if (!found || moveDist < bestDist) { bestCandidate = Position(cx, cy, cz); @@ -873,9 +922,10 @@ bool KarazhanNetherspiteAvoidBeamAndVoidZoneAction::Execute(Event event) if (found && karazhanHelper.IsSafePosition(bestCandidate.GetPositionX(), bestCandidate.GetPositionY(), bestCandidate.GetPositionZ(), voidZones, 4.0f)) - + { return MoveTo(bot->GetMapId(), bestCandidate.GetPositionX(), bestCandidate.GetPositionY(), bestCandidate.GetPositionZ(), false, false, false, true, MovementPriority::MOVEMENT_COMBAT); + } return false; } @@ -883,13 +933,15 @@ bool KarazhanNetherspiteAvoidBeamAndVoidZoneAction::isUseful() { Unit* boss = AI_VALUE2(Unit*, "find target", "netherspite"); if (!boss || boss->HasAura(SPELL_NETHERSPITE_BANISHED)) + { return false; - + } RaidKarazhanHelpers karazhanHelper(botAI); auto [redBlocker, greenBlocker, blueBlocker] = karazhanHelper.GetCurrentBeamBlockers(); if (bot == redBlocker || bot == blueBlocker || bot == greenBlocker) + { return false; - + } return true; } @@ -901,7 +953,9 @@ bool KarazhanNetherspiteBanishPhaseAvoidVoidZoneAction::Execute(Event event) for (Unit* vz : voidZones) { if (vz->GetEntry() == NPC_VOID_ZONE && bot->GetExactDist2d(vz) < 4.0f) + { return FleePosition(vz->GetPosition(), 4.0f); + } } return false; } @@ -910,19 +964,21 @@ bool KarazhanNetherspiteBanishPhaseAvoidVoidZoneAction::isUseful() { Unit* boss = AI_VALUE2(Unit*, "find target", "netherspite"); if (!boss || !boss->HasAura(SPELL_NETHERSPITE_BANISHED)) + { return false; - + } RaidKarazhanHelpers karazhanHelper(botAI); std::vector voidZones = karazhanHelper.GetAllVoidZones(); for (Unit* vz : voidZones) { - if (bot->GetExactDist2d(vz) < 4.0f) + if (bot->GetExactDist2d(vz) < 4.0f) + { return true; + } } return false; } -// For Enfeebled bots to avoid Shadow Nova and all non-tank bots to avoid infernals bool KarazhanPrinceMalchezaarNonTankAvoidHazardAction::Execute(Event event) { Unit* boss = AI_VALUE2(Unit*, "find target", "prince malchezaar"); @@ -957,8 +1013,10 @@ bool KarazhanPrinceMalchezaarNonTankAvoidHazardAction::Execute(Event event) float y = bossY + dy * dist; float destZ = bossZ; if (!bot->IsWithinLOS(x, y, destZ)) + { continue; - bool pathSafe = karazhanHelper.IsStraightPathSafe(Position(bx, by, bz), Position(x, y, destZ), + } + bool pathSafe = karazhanHelper.IsStraightPathSafe(Position(bx, by, bz), Position(x, y, destZ), infernals, safeInfernalDistance, stepSize); float moveDist = sqrt(pow(x - bx, 2) + pow(y - by, 2)); if (pathSafe && moveDist < bestMoveDist) @@ -1011,8 +1069,10 @@ bool KarazhanPrinceMalchezaarNonTankAvoidHazardAction::Execute(Event event) float y = bossY + dy * dist; float destZ = bossZ; if (!bot->IsWithinLOS(x, y, destZ)) + { continue; - bool pathSafe = karazhanHelper.IsStraightPathSafe(Position(bx, by, bz), Position(x, y, destZ), + } + bool pathSafe = karazhanHelper.IsStraightPathSafe(Position(bx, by, bz), Position(x, y, destZ), infernals, safeInfernalDistance, stepSize); float moveDist = sqrt(pow(x - bx, 2) + pow(y - by, 2)); if (pathSafe && moveDist < bestMoveDist) @@ -1029,7 +1089,9 @@ bool KarazhanPrinceMalchezaarNonTankAvoidHazardAction::Execute(Event event) Position arcPoint = karazhanHelper.CalculateArcPoint(Position(bx, by, bz), Position(x, y, destZ), Position(bossX, bossY, bossZ)); if (!bot->IsWithinLOS(arcPoint.GetPositionX(), arcPoint.GetPositionY(), arcPoint.GetPositionZ())) + { continue; + } bool arcSafe = true; for (Unit* infernal : infernals) { @@ -1075,7 +1137,6 @@ bool KarazhanPrinceMalchezaarNonTankAvoidHazardAction::isUseful() return boss && !(botAI->IsTank(bot) && botAI->HasAggro(boss) && boss->GetVictim() == bot); } -// For tank to avoid infernals (with buffer distance) bool KarazhanPrinceMalchezaarTankAvoidHazardAction::Execute(Event event) { Unit* boss = AI_VALUE2(Unit*, "find target", "prince malchezaar"); @@ -1117,7 +1178,9 @@ bool KarazhanPrinceMalchezaarTankAvoidHazardAction::Execute(Event event) float y = by + dy * dist; float z = bz; if (!bot->IsWithinLOS(x, y, z)) + { continue; + } bool safe = karazhanHelper.IsStraightPathSafe(Position(bx, by, bz), Position(x, y, z), infernals, safeInfernalDistance, stepSize); float moveDist = sqrt(pow(x - bx, 2) + pow(y - by, 2)); @@ -1134,8 +1197,14 @@ bool KarazhanPrinceMalchezaarTankAvoidHazardAction::Execute(Event event) { Position arcPoint = karazhanHelper.CalculateArcPoint(Position(bx, by, bz), Position(x, y, z), Position(bx, by, bz)); - if (!bot->IsWithinLOS(arcPoint.GetPositionX(), arcPoint.GetPositionY(), arcPoint.GetPositionZ())) + float arcX = arcPoint.GetPositionX(); + float arcY = arcPoint.GetPositionY(); + float arcZ = arcPoint.GetPositionZ(); + float arcDestX = arcX, arcDestY = arcY, arcDestZ = arcZ; + if (!bot->GetMap()->CheckCollisionAndGetValidCoords(bot, bx, by, bz, arcDestX, arcDestY, arcDestZ)) + { continue; + } bool arcSafe = true; for (Unit* infernal : infernals) { @@ -1164,6 +1233,7 @@ bool KarazhanPrinceMalchezaarTankAvoidHazardAction::Execute(Event event) { bot->AttackStop(); bot->InterruptNonMeleeSpells(false); + return MoveTo(bot->GetMapId(), bestDestX, bestDestY, bestDestZ, false, false, false, true, MovementPriority::MOVEMENT_COMBAT); } diff --git a/src/strategy/raids/karazhan/RaidKarazhanHelpers.cpp b/src/strategy/raids/karazhan/RaidKarazhanHelpers.cpp index 81479e7ebc..939e73b9b3 100644 --- a/src/strategy/raids/karazhan/RaidKarazhanHelpers.cpp +++ b/src/strategy/raids/karazhan/RaidKarazhanHelpers.cpp @@ -35,7 +35,9 @@ const Position KARAZHAN_THE_CURATOR_BOSS_POSITION = Position(-11139.463f, -1884. void RaidKarazhanHelpers::MarkTargetWithSkull(Unit* target) { if (!target) + { return; + } if (Group* group = bot->GetGroup()) { @@ -43,15 +45,21 @@ void RaidKarazhanHelpers::MarkTargetWithSkull(Unit* target) ObjectGuid skullGuid = group->GetTargetIcon(skullIconId); if (skullGuid != target->GetGUID()) + { group->SetTargetIcon(skullIconId, bot->GetGUID(), target->GetGUID()); + } } } Unit* RaidKarazhanHelpers::GetFirstAliveUnit(const std::vector& units) { for (Unit* unit : units) + { if (unit && unit->IsAlive()) + { return unit; + } + } return nullptr; } @@ -65,8 +73,11 @@ Unit* RaidKarazhanHelpers::GetFirstAliveUnitByEntry(uint32 entry) Unit* unit = botAI->GetUnit(npcGuid); if (unit && unit->IsAlive() && unit->GetEntry() == entry) + { return unit; + } } + return nullptr; } @@ -79,10 +90,14 @@ Unit* RaidKarazhanHelpers::GetNearestPlayerInRadius(float radius) Player* member = itr->GetSource(); if (!member || !member->IsAlive() || member == bot) + { continue; + } if (bot->GetExactDist2d(member) < radius) + { return member; + } } } return nullptr; @@ -92,12 +107,13 @@ bool RaidKarazhanHelpers::IsFlameWreathActive() { Unit* boss = AI_VALUE2(Unit*, "find target", "shade of aran"); if (!boss) + { return false; + } Spell* currentSpell = boss->GetCurrentSpell(CURRENT_GENERIC_SPELL); if (currentSpell && currentSpell->m_spellInfo && currentSpell->m_spellInfo->Id == SPELL_FLAME_WREATH) { - bot->Yell("I will not move when Flame Wreath is cast or the raid blows up.", LANG_UNIVERSAL); return true; } @@ -107,9 +123,13 @@ bool RaidKarazhanHelpers::IsFlameWreathActive() { Player* member = itr->GetSource(); if (!member || !member->IsAlive()) + { continue; + } if (member->HasAura(SPELL_AURA_FLAME_WREATH)) + { return true; + } } } return false; @@ -125,7 +145,9 @@ std::vector RaidKarazhanHelpers::GetBlueBlockers() { Player* member = itr->GetSource(); if (!member || !member->IsAlive() || !GET_PLAYERBOT_AI(member)) + { continue; + } bool isDps = botAI->IsDps(member); bool isWarrior = member->getClass() == CLASS_WARRIOR; @@ -155,7 +177,9 @@ std::vector RaidKarazhanHelpers::GetGreenBlockers() { Player* member = itr->GetSource(); if (!member || !member->IsAlive() || !GET_PLAYERBOT_AI(member)) + { continue; + } bool hasExhaustion = member->HasAura(SPELL_NETHER_EXHAUSTION_GREEN); Aura* greenBuff = member->GetAura(SPELL_GREEN_BEAM_DEBUFF); @@ -188,7 +212,9 @@ Position RaidKarazhanHelpers::GetPositionOnBeam(Unit* boss, Unit* portal, float float length = sqrt(dx*dx + dy*dy); if (length == 0.0f) + { return Position(bx, by, bz); + } dx /= length; dy /= length; @@ -213,26 +239,37 @@ std::tuple RaidKarazhanHelpers::GetCurrentBeamBlocker { Player* member = itr->GetSource(); if (!member || !member->IsAlive()) + { continue; - PlayerbotAI* memberAI = sPlayerbotsMgr->GetPlayerbotAI(member); - if (!memberAI || !memberAI->IsTank(member)) + } + if (!botAI->IsTank(member)) + { continue; + } if (member->HasAura(SPELL_NETHER_EXHAUSTION_RED)) + { continue; + } redBlockers.push_back(member); } } if (!redBlockers.empty()) + { redBlocker = redBlockers.front(); + } std::vector greenBlockers = GetGreenBlockers(); if (!greenBlockers.empty()) + { greenBlocker = greenBlockers.front(); + } std::vector blueBlockers = GetBlueBlockers(); if (!blueBlockers.empty()) + { blueBlocker = blueBlockers.front(); + } return std::make_tuple(redBlocker, greenBlocker, blueBlocker); } @@ -246,7 +283,9 @@ std::vector RaidKarazhanHelpers::GetAllVoidZones() { Unit* unit = botAI->GetUnit(npcGuid); if (!unit || unit->GetEntry() != NPC_VOID_ZONE) + { continue; + } float dist = bot->GetExactDist2d(unit); if (dist < radius) @@ -265,7 +304,9 @@ bool RaidKarazhanHelpers::IsSafePosition(float x, float y, float z, float dist = std::sqrt(std::pow(x - hazard->GetPositionX(), 2) + std::pow(y - hazard->GetPositionY(), 2)); if (dist < hazardRadius) + { return false; + } } return true; } @@ -280,7 +321,9 @@ std::vector RaidKarazhanHelpers::GetSpawnedInfernals() const Unit* unit = botAI->GetUnit(npcGuid); if (unit && unit->GetEntry() == NPC_NETHERSPITE_INFERNAL) + { infernals.push_back(unit); + } } return infernals; } @@ -295,7 +338,10 @@ bool RaidKarazhanHelpers::IsStraightPathSafe(const Position& start, const Positi float tz = target.GetPositionZ(); float totalDist = std::sqrt(std::pow(tx - sx, 2) + std::pow(ty - sy, 2)); if (totalDist == 0.0f) + { return true; + } + for (float checkDist = 0.0f; checkDist <= totalDist; checkDist += stepSize) { float t = checkDist / totalDist; @@ -306,56 +352,54 @@ bool RaidKarazhanHelpers::IsStraightPathSafe(const Position& start, const Positi { float hazardDist = std::sqrt(std::pow(checkX - hazard->GetPositionX(), 2) + std::pow(checkY - hazard->GetPositionY(), 2)); if (hazardDist < hazardRadius) + { return false; + } } } + return true; } Position RaidKarazhanHelpers::CalculateArcPoint(const Position& current, const Position& target, const Position& center) { float arcFraction = 0.25f; - // Calculate vectors from center to current position and target float currentX = current.GetPositionX() - center.GetPositionX(); float currentY = current.GetPositionY() - center.GetPositionY(); float targetX = target.GetPositionX() - center.GetPositionX(); float targetY = target.GetPositionY() - center.GetPositionY(); - // Calculate distances float currentDist = std::sqrt(currentX * currentX + currentY * currentY); float targetDist = std::sqrt(targetX * targetX + targetY * targetY); if (currentDist == 0.0f || targetDist == 0.0f) + { return current; + } - // Normalize vectors currentX /= currentDist; currentY /= currentDist; targetX /= targetDist; targetY /= targetDist; - // Calculate dot product to find the angle between vectors float dotProduct = currentX * targetX + currentY * targetY; - dotProduct = std::max(-1.0f, std::min(1.0f, dotProduct)); // Clamp to [-1, 1] + dotProduct = std::max(-1.0f, std::min(1.0f, dotProduct)); float angle = std::acos(dotProduct); - // Determine rotation direction (clockwise or counterclockwise) float crossProduct = currentX * targetY - currentY * targetX; - float stepAngle = angle * arcFraction; // Move arcFraction along the arc + float stepAngle = angle * arcFraction; if (crossProduct < 0) - stepAngle = -stepAngle; // Clockwise + { + stepAngle = -stepAngle; + } - // Calculate rotation matrix components float cos_a = std::cos(stepAngle); float sin_a = std::sin(stepAngle); - // Rotate current vector float rotatedX = currentX * cos_a - currentY * sin_a; float rotatedY = currentX * sin_a + currentY * cos_a; - // Smoothing: blend current and target radius float desiredDist = currentDist * 0.9f + targetDist * 0.1f; - // Calculate the new position return Position(center.GetPositionX() + rotatedX * desiredDist, center.GetPositionY() + rotatedY * desiredDist, current.GetPositionZ()); diff --git a/src/strategy/raids/karazhan/RaidKarazhanHelpers.h b/src/strategy/raids/karazhan/RaidKarazhanHelpers.h index 42db658043..2746b09da9 100644 --- a/src/strategy/raids/karazhan/RaidKarazhanHelpers.h +++ b/src/strategy/raids/karazhan/RaidKarazhanHelpers.h @@ -8,49 +8,49 @@ enum KarazhanSpells { // Maiden of Virtue - SPELL_REPENTANCE = 29511, + SPELL_REPENTANCE = 29511, // Opera Event - SPELL_LITTLE_RED_RIDING_HOOD = 30756, + SPELL_LITTLE_RED_RIDING_HOOD = 30756, // Shade of Aran - SPELL_FLAME_WREATH = 30004, - SPELL_AURA_FLAME_WREATH = 29946, - SPELL_ARCANE_EXPLOSION = 29973, - SPELL_WARLOCK_BANISH = 18647, // Rank 2 + SPELL_FLAME_WREATH = 30004, + SPELL_AURA_FLAME_WREATH = 29946, + SPELL_ARCANE_EXPLOSION = 29973, + SPELL_WARLOCK_BANISH = 18647, // Rank 2 // Netherspite - SPELL_GREEN_BEAM_DEBUFF = 30422, - SPELL_BLUE_BEAM_DEBUFF = 30423, - SPELL_NETHER_EXHAUSTION_RED = 38637, - SPELL_NETHER_EXHAUSTION_GREEN = 38638, - SPELL_NETHER_EXHAUSTION_BLUE = 38639, - SPELL_NETHERSPITE_BANISHED = 39833, + SPELL_GREEN_BEAM_DEBUFF = 30422, + SPELL_BLUE_BEAM_DEBUFF = 30423, + SPELL_NETHER_EXHAUSTION_RED = 38637, + SPELL_NETHER_EXHAUSTION_GREEN = 38638, + SPELL_NETHER_EXHAUSTION_BLUE = 38639, + SPELL_NETHERSPITE_BANISHED = 39833, // Prince Malchezaar - SPELL_ENFEEBLE = 30843, + SPELL_ENFEEBLE = 30843, }; enum KarazhanNpcs { // Attumen the Huntsman - NPC_ATTUMEN_THE_HUNTSMAN = 16152, // Mounted ID + NPC_ATTUMEN_THE_HUNTSMAN_MOUNTED = 16152, // Terestian Illhoof - NPC_KILREK = 17229, - NPC_DEMON_CHAINS = 17248, + NPC_KILREK = 17229, + NPC_DEMON_CHAINS = 17248, // Shade of Aran - NPC_CONJURED_ELEMENTAL = 17167, + NPC_CONJURED_ELEMENTAL = 17167, // Netherspite - NPC_VOID_ZONE = 16697, - NPC_RED_PORTAL = 17369, - NPC_BLUE_PORTAL = 17368, - NPC_GREEN_PORTAL = 17367, + NPC_VOID_ZONE = 16697, + NPC_RED_PORTAL = 17369, + NPC_BLUE_PORTAL = 17368, + NPC_GREEN_PORTAL = 17367, // Prince Malchezaar - NPC_NETHERSPITE_INFERNAL = 17646, + NPC_NETHERSPITE_INFERNAL = 17646, }; extern const Position KARAZHAN_MAIDEN_OF_VIRTUE_BOSS_POSITION; diff --git a/src/strategy/raids/karazhan/RaidKarazhanMultipliers.cpp b/src/strategy/raids/karazhan/RaidKarazhanMultipliers.cpp index a1b25ee5f9..f5306f8bbc 100644 --- a/src/strategy/raids/karazhan/RaidKarazhanMultipliers.cpp +++ b/src/strategy/raids/karazhan/RaidKarazhanMultipliers.cpp @@ -19,13 +19,17 @@ float KarazhanBigBadWolfMultiplier::GetValue(Action* action) { Unit* boss = AI_VALUE2(Unit*, "find target", "the big bad wolf"); if (!boss) + { return 1.0f; + } if (bot->HasAura(SPELL_LITTLE_RED_RIDING_HOOD)) { if ((dynamic_cast(action) && !dynamic_cast(action)) || (dynamic_cast(action))) - return 0.0f; + { + return 0.0f; + } } return 1.0f; } @@ -34,18 +38,24 @@ float KarazhanShadeOfAranMultiplier::GetValue(Action* action) { Unit* boss = AI_VALUE2(Unit*, "find target", "shade of aran"); if (!boss) + { return 1.0f; + } if (boss->HasUnitState(UNIT_STATE_CASTING) && boss->FindCurrentSpellBySpellId(SPELL_ARCANE_EXPLOSION)) { if (IsChargeAction(action)) + { return 0.0f; + } if (dynamic_cast(action)) { const float safeDistance = 20.0f; if (bot->GetDistance2d(boss) >= safeDistance) + { return 0.0f; + } } } @@ -67,7 +77,9 @@ float KarazhanShadeOfAranMultiplier::GetValue(Action* action) if (flameWreathActive) { if (dynamic_cast(action) || IsChargeAction(action)) + { return 0.0f; + } } return 1.0f; } @@ -76,7 +88,9 @@ float KarazhanNetherspiteBlueAndGreenBeamMultiplier::GetValue(Action* action) { Unit* boss = AI_VALUE2(Unit*, "find target", "netherspite"); if (!boss || !boss->IsAlive()) + { return 1.0f; + } RaidKarazhanHelpers karazhanHelper(botAI); auto [redBlocker /*unused*/, greenBlocker, blueBlocker] = karazhanHelper.GetCurrentBeamBlockers(); @@ -88,18 +102,25 @@ float KarazhanNetherspiteBlueAndGreenBeamMultiplier::GetValue(Action* action) bool inBeam = false; for (Unit* portal : {bluePortal, greenPortal}) { - if (!portal) continue; + if (!portal) + { + continue; + } float bx = boss->GetPositionX(), by = boss->GetPositionY(); float px = portal->GetPositionX(), py = portal->GetPositionY(); float dx = px - bx, dy = py - by; float length = sqrt(dx*dx + dy*dy); - if (length == 0.0f) continue; + if (length == 0.0f) + { + continue; + } dx /= length; dy /= length; float botdx = bot->GetPositionX() - bx, botdy = bot->GetPositionY() - by; float t = (botdx * dx + botdy * dy); float beamX = bx + dx * t, beamY = by + dy * t; float distToBeam = sqrt(pow(bot->GetPositionX() - beamX, 2) + pow(bot->GetPositionY() - beamY, 2)); - if (distToBeam < 5.0f && t > 0.0f && t < length) { + if (distToBeam < 5.0f && t > 0.0f && t < length) + { inBeam = true; break; } @@ -118,7 +139,9 @@ float KarazhanNetherspiteBlueAndGreenBeamMultiplier::GetValue(Action* action) if (!inVoidZone) { if (dynamic_cast(action) || IsChargeAction(action)) + { return 0.0f; + } } } } @@ -129,7 +152,9 @@ float KarazhanNetherspiteRedBeamMultiplier::GetValue(Action* action) { Unit* boss = AI_VALUE2(Unit*, "find target", "netherspite"); if (!boss || !boss->IsAlive()) + { return 1.0f; + } RaidKarazhanHelpers karazhanHelper(botAI); auto [redBlocker, greenBlocker /*unused*/, blueBlocker /*unused*/] = karazhanHelper.GetCurrentBeamBlockers(); @@ -177,7 +202,9 @@ float KarazhanNetherspiteRedBeamMultiplier::GetValue(Action* action) if (distToTarget < positionTolerance) { if (dynamic_cast(action) || IsChargeAction(action)) + { return 0.0f; + } } } } @@ -187,13 +214,14 @@ float KarazhanNetherspiteRedBeamMultiplier::GetValue(Action* action) float KarazhanPrinceMalchezaarMultiplier::GetValue(Action* action) { Unit* boss = AI_VALUE2(Unit*, "find target", "prince malchezaar"); - if (!boss) - return 1.0f; - if (boss && bot->HasAura(SPELL_ENFEEBLE)) + if (boss && botAI->IsMelee(bot) && bot->HasAura(SPELL_ENFEEBLE)) { - if (IsChargeAction(action)) - return 0.0f; + if (dynamic_cast(action)) + { + return 1.0f; + } + return 0.0f; } return 1.0f; } diff --git a/src/strategy/raids/karazhan/RaidKarazhanTriggers.cpp b/src/strategy/raids/karazhan/RaidKarazhanTriggers.cpp index 55aa175e88..f70ae70fde 100644 --- a/src/strategy/raids/karazhan/RaidKarazhanTriggers.cpp +++ b/src/strategy/raids/karazhan/RaidKarazhanTriggers.cpp @@ -6,8 +6,9 @@ bool KarazhanAttumenTheHuntsmanTrigger::IsActive() { RaidKarazhanHelpers helpers(botAI); - Unit* boss = helpers.GetFirstAliveUnitByEntry(NPC_ATTUMEN_THE_HUNTSMAN); - return boss != nullptr; + Unit* boss = helpers.GetFirstAliveUnitByEntry(NPC_ATTUMEN_THE_HUNTSMAN_MOUNTED); + + return boss && boss->IsAlive(); } bool KarazhanMoroesTrigger::IsActive() @@ -20,36 +21,27 @@ bool KarazhanMoroesTrigger::IsActive() Unit* robin = AI_VALUE2(Unit*, "find target", "lord robin daris"); Unit* crispin = AI_VALUE2(Unit*, "find target", "lord crispin ference"); - if ((!moroes || !moroes->IsAlive()) && - (!dorothea || !dorothea->IsAlive()) && - (!catriona || !catriona->IsAlive()) && - (!keira || !keira->IsAlive()) && - (!rafe || !rafe->IsAlive()) && - (!robin || !robin->IsAlive()) && - (!crispin || !crispin->IsAlive())) - return false; - - return true; + return ((moroes && moroes->IsAlive()) || + (dorothea && dorothea->IsAlive()) || + (catriona && catriona->IsAlive()) || + (keira && keira->IsAlive()) || + (rafe && rafe->IsAlive()) || + (robin && robin->IsAlive()) || + (crispin && crispin->IsAlive())); } bool KarazhanMaidenOfVirtueTrigger::IsActive() { Unit* boss = AI_VALUE2(Unit*, "find target", "maiden of virtue"); - if (!boss || !boss->IsAlive()) - return false; - - return true; + return boss && boss->IsAlive(); } bool KarazhanBigBadWolfTrigger::IsActive() { Unit* boss = AI_VALUE2(Unit*, "find target", "the big bad wolf"); - if (!boss || !boss->IsAlive()) - return false; - - return true; + return boss && boss->IsAlive(); } bool KarazhanRomuloAndJulianneTrigger::IsActive() @@ -57,10 +49,7 @@ bool KarazhanRomuloAndJulianneTrigger::IsActive() Unit* julianne = AI_VALUE2(Unit*, "find target", "julianne"); Unit* romulo = AI_VALUE2(Unit*, "find target", "romulo"); - if (!julianne || !julianne->IsAlive() || !romulo || !romulo->IsAlive()) - return false; - - return true; + return julianne && julianne->IsAlive() && romulo && romulo->IsAlive(); } bool KarazhanWizardOfOzTrigger::IsActive() @@ -72,63 +61,45 @@ bool KarazhanWizardOfOzTrigger::IsActive() Unit* tinhead = AI_VALUE2(Unit*, "find target", "tinhead"); Unit* crone = AI_VALUE2(Unit*, "find target", "the crone"); - if (( !dorothee || !dorothee->IsAlive() ) && - ( !tito || !tito->IsAlive() ) && - ( !roar || !roar->IsAlive() ) && - ( !strawman || !strawman->IsAlive() ) && - ( !tinhead || !tinhead->IsAlive() ) && - ( !crone || !crone->IsAlive() )) - return false; - - return true; + return ((dorothee && dorothee->IsAlive()) || + (tito && tito->IsAlive()) || + (roar && roar->IsAlive()) || + (strawman && strawman->IsAlive()) || + (tinhead && tinhead->IsAlive()) || + (crone && crone->IsAlive())); } bool KarazhanTheCuratorTrigger::IsActive() { Unit* boss = AI_VALUE2(Unit*, "find target", "the curator"); - if (!boss || !boss->IsAlive()) - return false; - - return true; + return boss && boss->IsAlive(); } bool KarazhanTerestianIllhoofTrigger::IsActive() { Unit* boss = AI_VALUE2(Unit*, "find target", "terestian illhoof"); - if (!boss || !boss->IsAlive()) - return false; - - return true; + return boss && boss->IsAlive(); } bool KarazhanShadeOfAranTrigger::IsActive() { Unit* boss = AI_VALUE2(Unit*, "find target", "shade of aran"); - if (!boss) - return false; - - return true; + return boss && boss->IsAlive(); } bool KarazhanNetherspiteTrigger::IsActive() { Unit* boss = AI_VALUE2(Unit*, "find target", "netherspite"); - if (!boss || !boss->IsAlive()) - return false; - - return true; + return boss && boss->IsAlive(); } bool KarazhanPrinceMalchezaarTrigger::IsActive() { Unit* boss = AI_VALUE2(Unit*, "find target", "prince malchezaar"); - if (!boss || !boss->IsAlive()) - return false; - - return true; + return boss && boss->IsAlive(); } From f23b2ea2f6e3a52d80e658ac45d141a3c3bfa0e7 Mon Sep 17 00:00:00 2001 From: Gonzalo Date: Sat, 27 Sep 2025 08:06:16 -0300 Subject: [PATCH 056/151] fix: Optimize DrinkAction to check mana in isUseful instead of Execute (#1666) * fix: Optimize DrinkAction to check mana in isUseful instead of Execute - Move HasManaValue check from Execute to isUseful for better performance - Prevents non-mana classes from executing drink actions unnecessarily - Improves AI efficiency by early filtering in isUseful method Addresses reviewer feedback about HasManaValue usage optimization * Update NonCombatActions.cpp --------- Co-authored-by: bash <31279994+hermensbas@users.noreply.github.com> --- src/strategy/actions/NonCombatActions.cpp | 13 ++++++++----- 1 file changed, 8 insertions(+), 5 deletions(-) diff --git a/src/strategy/actions/NonCombatActions.cpp b/src/strategy/actions/NonCombatActions.cpp index d3c49decce..262e0f2036 100644 --- a/src/strategy/actions/NonCombatActions.cpp +++ b/src/strategy/actions/NonCombatActions.cpp @@ -13,10 +13,6 @@ bool DrinkAction::Execute(Event event) if (bot->IsInCombat()) return false; - bool hasMana = AI_VALUE2(bool, "has mana", "self target"); - if (!hasMana) - return false; - if (botAI->HasCheat(BotCheatMask::food)) { // if (bot->IsNonMeleeSpellCast(true)) @@ -54,7 +50,14 @@ bool DrinkAction::Execute(Event event) return UseItemAction::Execute(event); } -bool DrinkAction::isUseful() { return UseItemAction::isUseful() && AI_VALUE2(uint8, "mana", "self target") < 100; } +bool DrinkAction::isUseful() +{ + // check class uses mana + if (!AI_VALUE2(bool, "has mana", "self target")) + return false; + + return UseItemAction::isUseful() && AI_VALUE2(uint8, "mana", "self target") < 100; +} bool DrinkAction::isPossible() { From f5a6194808f5b8c6029d6aa6ed7af8de405d6837 Mon Sep 17 00:00:00 2001 From: Crow Date: Sat, 27 Sep 2025 13:31:06 -0500 Subject: [PATCH 057/151] Fixed some comments in the config (#1668) --- conf/playerbots.conf.dist | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/conf/playerbots.conf.dist b/conf/playerbots.conf.dist index 4e76eb095e..b4e715f91c 100644 --- a/conf/playerbots.conf.dist +++ b/conf/playerbots.conf.dist @@ -519,7 +519,7 @@ AiPlayerbot.AutoGearScoreLimit = 0 # "taxi" (bots may use all flight paths, though they will not actually learn them) # "raid" (bots use cheats implemented into raid strategies) # To use multiple cheats, separate them by commas below (e.g., to enable all, use "gold,health,mana,power,raid,taxi") -# Default: taxi and raid are enabled +# Default: food, taxi, and raid are enabled AiPlayerbot.BotCheats = "food,taxi,raid" # @@ -1603,10 +1603,10 @@ AiPlayerbot.PremadeSpecLink.11.6.80 = 05320021--230033312031500531353013251 # # -# Applies a permanent buff to all bots simulating effects of spells, flasks, food, runes, etc. +# Applies automatically refreshing buffs to bots simulating effects of spells, flasks, food, runes, etc. # Requires sending the command "nc +worldbuff" in chat to a bot (or a group of bots) to enable # Each entry in the matrix should be formatted as follows: Entry:FactionID,ClassID,SpecID,MinimumLevel,MaximumLevel:SpellID1,SpellID2,etc.; -# Use 0 for any field to make it agnostic (e.g., 0 for FactionID means the entry will apply buffs to either faction) +# FactionID may be set to 0 for the entry to apply buffs to bots of either faction # The default entries create a cross-faction list of level 80 buffs for each implemented pve spec from the "Premade Specs" section # The default entries may be deleted or modified, and new custom entries may be added From 0547ce5cf7404097751df62a2d0c71d4c9d5d1e3 Mon Sep 17 00:00:00 2001 From: kadeshar Date: Sat, 27 Sep 2025 20:57:10 +0200 Subject: [PATCH 058/151] - Code optimalizations --- src/strategy/shaman/ShamanActions.cpp | 18 +++++++++++++----- src/strategy/shaman/ShamanTriggers.cpp | 15 ++++++++++----- 2 files changed, 23 insertions(+), 10 deletions(-) diff --git a/src/strategy/shaman/ShamanActions.cpp b/src/strategy/shaman/ShamanActions.cpp index 83e915da64..42f3a8e961 100644 --- a/src/strategy/shaman/ShamanActions.cpp +++ b/src/strategy/shaman/ShamanActions.cpp @@ -93,18 +93,26 @@ bool CastSpiritWalkAction::Execute(Event event) bool SetTotemAction::Execute(Event event) { - size_t spellIdsCount = sizeof(totemSpellIds) / sizeof(uint32); + const size_t spellIdsCount = sizeof(totemSpellIds) / sizeof(uint32); + if (spellIdsCount == 0) + return false; // early return + uint32 totemSpell = 0; - for (int i = (int)spellIdsCount - 1; i >= 0; --i) + + // Iterate backwards due signed/unsigned int + for (size_t i = spellIdsCount; i-- > 0;) { - if (bot->HasSpell(totemSpellIds[i])) + const uint32 spellId = totemSpellIds[i]; + if (bot->HasSpell(spellId)) { - totemSpell = totemSpellIds[i]; + totemSpell = spellId; break; } } - if (!totemSpell) + + if (totemSpell == 0) return false; + bot->addActionButton(actionButtonId, totemSpell, ACTION_BUTTON_SPELL); return true; } diff --git a/src/strategy/shaman/ShamanTriggers.cpp b/src/strategy/shaman/ShamanTriggers.cpp index 225289e7b5..cdee870c05 100644 --- a/src/strategy/shaman/ShamanTriggers.cpp +++ b/src/strategy/shaman/ShamanTriggers.cpp @@ -424,6 +424,7 @@ bool SetTotemTrigger::IsActive() { if (!bot->HasSpell(SPELL_CALL_OF_THE_ELEMENTS)) return false; + if (!bot->HasSpell(requiredSpellId)) return false; @@ -431,14 +432,18 @@ bool SetTotemTrigger::IsActive() if (!button || button->GetType() != ACTION_BUTTON_SPELL || button->GetAction() == 0) return true; - size_t totemSpellIdsCount = sizeof(totemSpellIds) / sizeof(uint32); - for (int i = (int)totemSpellIdsCount - 1; i >= 0; --i) - + const size_t totemSpellIdsCount = sizeof(totemSpellIds) / sizeof(uint32); + if (totemSpellIdsCount == 0) { - if (bot->HasSpell(totemSpellIds[i])) + return false; + } + for (int i = (int)totemSpellIdsCount - 1; i >= 0; --i) + { + const uint32 spellId = totemSpellIds[i]; + if (bot->HasSpell(spellId)) { - return button->GetAction() != totemSpellIds[i]; + return button->GetAction() != spellId; } } From b9dbfe9646e8b0bed622d6dc4060d82043581120 Mon Sep 17 00:00:00 2001 From: Tecc Date: Sat, 27 Sep 2025 22:50:14 +0200 Subject: [PATCH 059/151] fix: Allow following master's mount state regardless of group leader in CheckMountStateAction --- src/strategy/actions/CheckMountStateAction.cpp | 6 +----- 1 file changed, 1 insertion(+), 5 deletions(-) diff --git a/src/strategy/actions/CheckMountStateAction.cpp b/src/strategy/actions/CheckMountStateAction.cpp index 0c36935ecd..589984acad 100644 --- a/src/strategy/actions/CheckMountStateAction.cpp +++ b/src/strategy/actions/CheckMountStateAction.cpp @@ -152,13 +152,9 @@ bool CheckMountStateAction::Execute(Event /*event*/) bool inBattleground = bot->InBattleground(); - // If there is a master and bot not in BG + // If there is a master and bot not in BG, follow master's mount state regardless of group leader if (master && !inBattleground) { - Group* group = bot->GetGroup(); - if (!group || group->GetLeaderGUID() != master->GetGUID()) - return false; - if (ShouldFollowMasterMountState(master, noAttackers, shouldMount)) return Mount(); From e042e3b12b922c1f9f0ecf80b35d36d7e2a9fc4b Mon Sep 17 00:00:00 2001 From: bash <31279994+hermensbas@users.noreply.github.com> Date: Sat, 27 Sep 2025 22:55:52 +0200 Subject: [PATCH 060/151] Added shapeshift --- src/strategy/actions/NonCombatActions.cpp | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/src/strategy/actions/NonCombatActions.cpp b/src/strategy/actions/NonCombatActions.cpp index 98956f561c..f7b5a26acd 100644 --- a/src/strategy/actions/NonCombatActions.cpp +++ b/src/strategy/actions/NonCombatActions.cpp @@ -13,10 +13,12 @@ bool DrinkAction::Execute(Event event) if (bot->IsInCombat()) return false; - // Don't drink while mounted if (bot->IsMounted()) return false; + if (botAI->HasAnyAuraOf(GetTarget(), "dire bear form", "bear form", "cat form", "travel form", "aquatic form","flight form", "swift flight form", nullptr)) + return false; + if (botAI->HasCheat(BotCheatMask::food)) { // if (bot->IsNonMeleeSpellCast(true)) @@ -73,10 +75,12 @@ bool EatAction::Execute(Event event) if (bot->IsInCombat()) return false; - // Don't eat while mounted if (bot->IsMounted()) return false; + if (botAI->HasAnyAuraOf(GetTarget(), "dire bear form", "bear form", "cat form", "travel form", "aquatic form","flight form", "swift flight form", nullptr)) + return false; + if (botAI->HasCheat(BotCheatMask::food)) { // if (bot->IsNonMeleeSpellCast(true)) From 662e7f1b0b392df314cb1c52501f01c436ffddb7 Mon Sep 17 00:00:00 2001 From: bash <31279994+hermensbas@users.noreply.github.com> Date: Sat, 27 Sep 2025 23:00:24 +0200 Subject: [PATCH 061/151] Update ShamanActions.cpp --- src/strategy/shaman/ShamanActions.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/strategy/shaman/ShamanActions.cpp b/src/strategy/shaman/ShamanActions.cpp index 42f3a8e961..d4d0f98a51 100644 --- a/src/strategy/shaman/ShamanActions.cpp +++ b/src/strategy/shaman/ShamanActions.cpp @@ -99,7 +99,7 @@ bool SetTotemAction::Execute(Event event) uint32 totemSpell = 0; - // Iterate backwards due signed/unsigned int + // Iterate backwards to prioritize the highest-rank totem spell the bot knows for (size_t i = spellIdsCount; i-- > 0;) { const uint32 spellId = totemSpellIds[i]; From d9b57fcfd4decd0efe66183c9e718683d3cb59ef Mon Sep 17 00:00:00 2001 From: bash <31279994+hermensbas@users.noreply.github.com> Date: Sat, 27 Sep 2025 23:26:29 +0200 Subject: [PATCH 062/151] Updated the locations of the checks, also added the checks as additional gatekeeper of the execute. --- src/strategy/actions/NonCombatActions.cpp | 38 ++++++++++------------- 1 file changed, 17 insertions(+), 21 deletions(-) diff --git a/src/strategy/actions/NonCombatActions.cpp b/src/strategy/actions/NonCombatActions.cpp index f7b5a26acd..6037948a8a 100644 --- a/src/strategy/actions/NonCombatActions.cpp +++ b/src/strategy/actions/NonCombatActions.cpp @@ -10,13 +10,8 @@ bool DrinkAction::Execute(Event event) { - if (bot->IsInCombat()) - return false; - - if (bot->IsMounted()) - return false; - - if (botAI->HasAnyAuraOf(GetTarget(), "dire bear form", "bear form", "cat form", "travel form", "aquatic form","flight form", "swift flight form", nullptr)) + // gatekeeper + if (!isPossible()) return false; if (botAI->HasCheat(BotCheatMask::food)) @@ -58,27 +53,22 @@ bool DrinkAction::Execute(Event event) bool DrinkAction::isUseful() { - // check class uses mana - if (!AI_VALUE2(bool, "has mana", "self target")) - return false; - return UseItemAction::isUseful() && AI_VALUE2(uint8, "mana", "self target") < 100; } bool DrinkAction::isPossible() { - return !bot->IsInCombat() && (botAI->HasCheat(BotCheatMask::food) || UseItemAction::isPossible()); + return !bot->IsInCombat() && + AI_VALUE2(bool, "has mana", "self target") && + !bot->IsMounted() && + !botAI->HasAnyAuraOf(GetTarget(), "dire bear form", "bear form", "cat form", "travel form", "aquatic form","flight form", "swift flight form", nullptr) && + (botAI->HasCheat(BotCheatMask::food) || UseItemAction::isPossible()); } bool EatAction::Execute(Event event) { - if (bot->IsInCombat()) - return false; - - if (bot->IsMounted()) - return false; - - if (botAI->HasAnyAuraOf(GetTarget(), "dire bear form", "bear form", "cat form", "travel form", "aquatic form","flight form", "swift flight form", nullptr)) + // gatekeeper + if (!isPossible()) return false; if (botAI->HasCheat(BotCheatMask::food)) @@ -118,9 +108,15 @@ bool EatAction::Execute(Event event) return UseItemAction::Execute(event); } -bool EatAction::isUseful() { return UseItemAction::isUseful() && AI_VALUE2(uint8, "health", "self target") < 85; } +bool EatAction::isUseful() +{ + return UseItemAction::isUseful() && AI_VALUE2(uint8, "health", "self target") < 100; +} bool EatAction::isPossible() { - return !bot->IsInCombat() && (botAI->HasCheat(BotCheatMask::food) || UseItemAction::isPossible()); + return !bot->IsInCombat() && + !bot->IsMounted() && + !botAI->HasAnyAuraOf(GetTarget(), "dire bear form", "bear form", "cat form", "travel form", "aquatic form","flight form", "swift flight form", nullptr) && + (botAI->HasCheat(BotCheatMask::food) || UseItemAction::isPossible()); } From 62e2ca247ae523934572702b1f4241e76c299c70 Mon Sep 17 00:00:00 2001 From: bash <31279994+hermensbas@users.noreply.github.com> Date: Sat, 27 Sep 2025 23:28:48 +0200 Subject: [PATCH 063/151] formatting --- src/strategy/actions/NonCombatActions.cpp | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/src/strategy/actions/NonCombatActions.cpp b/src/strategy/actions/NonCombatActions.cpp index 6037948a8a..d6747c235b 100644 --- a/src/strategy/actions/NonCombatActions.cpp +++ b/src/strategy/actions/NonCombatActions.cpp @@ -61,7 +61,8 @@ bool DrinkAction::isPossible() return !bot->IsInCombat() && AI_VALUE2(bool, "has mana", "self target") && !bot->IsMounted() && - !botAI->HasAnyAuraOf(GetTarget(), "dire bear form", "bear form", "cat form", "travel form", "aquatic form","flight form", "swift flight form", nullptr) && + !botAI->HasAnyAuraOf(GetTarget(), "dire bear form", "bear form", "cat form", "travel form", + "aquatic form","flight form", "swift flight form", nullptr) && (botAI->HasCheat(BotCheatMask::food) || UseItemAction::isPossible()); } @@ -117,6 +118,7 @@ bool EatAction::isPossible() { return !bot->IsInCombat() && !bot->IsMounted() && - !botAI->HasAnyAuraOf(GetTarget(), "dire bear form", "bear form", "cat form", "travel form", "aquatic form","flight form", "swift flight form", nullptr) && + !botAI->HasAnyAuraOf(GetTarget(), "dire bear form", "bear form", "cat form", "travel form", + "aquatic form","flight form", "swift flight form", nullptr) && (botAI->HasCheat(BotCheatMask::food) || UseItemAction::isPossible()); } From ec4ab34f947c4f5f6950ff4b9a4b14fd8b785e9b Mon Sep 17 00:00:00 2001 From: bash <31279994+hermensbas@users.noreply.github.com> Date: Sat, 27 Sep 2025 23:31:16 +0200 Subject: [PATCH 064/151] Update NonCombatActions.cpp Expensive checks last. --- src/strategy/actions/NonCombatActions.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/strategy/actions/NonCombatActions.cpp b/src/strategy/actions/NonCombatActions.cpp index d6747c235b..c17829aa6d 100644 --- a/src/strategy/actions/NonCombatActions.cpp +++ b/src/strategy/actions/NonCombatActions.cpp @@ -59,8 +59,8 @@ bool DrinkAction::isUseful() bool DrinkAction::isPossible() { return !bot->IsInCombat() && - AI_VALUE2(bool, "has mana", "self target") && !bot->IsMounted() && + AI_VALUE2(bool, "has mana", "self target") && !botAI->HasAnyAuraOf(GetTarget(), "dire bear form", "bear form", "cat form", "travel form", "aquatic form","flight form", "swift flight form", nullptr) && (botAI->HasCheat(BotCheatMask::food) || UseItemAction::isPossible()); From 23d9931f65418619ae450e37539f0414b5a13c4e Mon Sep 17 00:00:00 2001 From: avirar Date: Sun, 28 Sep 2025 08:01:24 +1000 Subject: [PATCH 065/151] Resolved crash in BGStatusAction (#1656) * Prevent race condition and server crash * Updated other direct packet handling lines to queue packets instead --- src/strategy/actions/BattleGroundJoinAction.cpp | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/strategy/actions/BattleGroundJoinAction.cpp b/src/strategy/actions/BattleGroundJoinAction.cpp index 1877a5f273..fda822ef1c 100644 --- a/src/strategy/actions/BattleGroundJoinAction.cpp +++ b/src/strategy/actions/BattleGroundJoinAction.cpp @@ -688,7 +688,7 @@ bool BGLeaveAction::Execute(Event event) WorldPacket packet(CMSG_BATTLEFIELD_PORT, 20); packet << type << unk2 << (uint32)_bgTypeId << unk << uint8(0); - bot->GetSession()->HandleBattleFieldPortOpcode(packet); + bot->GetSession()->QueuePacket(new WorldPacket(packet)); if (IsRandomBot) botAI->SetMaster(nullptr); @@ -917,7 +917,7 @@ bool BGStatusAction::Execute(Event event) WorldPacket packet(CMSG_BATTLEFIELD_PORT, 20); packet << type << unk2 << (uint32)_bgTypeId << unk << action; - bot->GetSession()->HandleBattleFieldPortOpcode(packet); + bot->GetSession()->QueuePacket(new WorldPacket(packet)); botAI->ResetStrategies(false); if (!bot->GetBattleground()) @@ -972,7 +972,7 @@ bool BGStatusAction::Execute(Event event) WorldPacket packet(CMSG_BATTLEFIELD_PORT, 20); action = 0; packet << type << unk2 << (uint32)_bgTypeId << unk << action; - bot->GetSession()->HandleBattleFieldPortOpcode(packet); + bot->GetSession()->QueuePacket(new WorldPacket(packet)); botAI->ResetStrategies(!IsRandomBot); botAI->GetAiObjectContext()->GetValue("bg type")->Set(0); @@ -1039,7 +1039,7 @@ bool BGStatusAction::Execute(Event event) WorldPacket packet(CMSG_BATTLEFIELD_PORT, 20); packet << type << unk2 << (uint32)_bgTypeId << unk << action; - bot->GetSession()->HandleBattleFieldPortOpcode(packet); + bot->GetSession()->QueuePacket(new WorldPacket(packet)); botAI->ResetStrategies(false); if (!bot->GetBattleground()) From 59555b2248ea24bb01f1701bfd6407e14e4c69ef Mon Sep 17 00:00:00 2001 From: crow Date: Sat, 27 Sep 2025 23:03:15 -0500 Subject: [PATCH 066/151] Moved yells to database --- ...9_28_00_netherspite_beam_blocker_texts.sql | 29 +++ .../raids/karazhan/RaidKarazhanActions.cpp | 191 +++++++++++------- .../raids/karazhan/RaidKarazhanHelpers.cpp | 60 ++---- .../karazhan/RaidKarazhanMultipliers.cpp | 13 +- 4 files changed, 179 insertions(+), 114 deletions(-) create mode 100644 data/sql/playerbots/updates/2025_09_28_00_netherspite_beam_blocker_texts.sql diff --git a/data/sql/playerbots/updates/2025_09_28_00_netherspite_beam_blocker_texts.sql b/data/sql/playerbots/updates/2025_09_28_00_netherspite_beam_blocker_texts.sql new file mode 100644 index 0000000000..ece4d1003f --- /dev/null +++ b/data/sql/playerbots/updates/2025_09_28_00_netherspite_beam_blocker_texts.sql @@ -0,0 +1,29 @@ +DELETE FROM ai_playerbot_texts WHERE name IN ( + 'netherspite_beam_blocking_red', + 'netherspite_beam_blocking_blue', + 'netherspite_beam_blocking_green', + 'netherspite_beam_leaving_blue', + 'netherspite_beam_leaving_green' +); + +DELETE FROM ai_playerbot_texts_chance WHERE name IN ( + 'netherspite_beam_blocking_red', + 'netherspite_beam_blocking_blue', + 'netherspite_beam_blocking_green', + 'netherspite_beam_leaving_blue', + 'netherspite_beam_leaving_green' +); + +INSERT INTO ai_playerbot_texts (name, text, say_type, reply_type, text_loc1, text_loc2, text_loc3, text_loc4, text_loc5, text_loc6, text_loc7, text_loc8) VALUES + ('netherspite_beam_blocking_red', '%player is moving to block the red beam!', 0, 0, '', '', '', '', '', '', '', ''), + ('netherspite_beam_blocking_blue', '%player is moving to block the blue beam!', 0, 0, '', '', '', '', '', '', '', ''), + ('netherspite_beam_blocking_green', '%player is moving to block the green beam!', 0, 0, '', '', '', '', '', '', '', ''), + ('netherspite_beam_leaving_blue', '%player is leaving the blue beam--next blocker up!', 0, 0, '', '', '', '', '', '', '', ''), + ('netherspite_beam_leaving_green', '%player is leaving the green beam--next blocker up!', 0, 0, '', '', '', '', '', '', '', ''); + +INSERT INTO ai_playerbot_texts_chance (name, probability) VALUES + ('netherspite_beam_blocking_red', 100), + ('netherspite_beam_blocking_blue', 100), + ('netherspite_beam_blocking_green', 100), + ('netherspite_beam_leaving_blue', 100), + ('netherspite_beam_leaving_green', 100); diff --git a/src/strategy/raids/karazhan/RaidKarazhanActions.cpp b/src/strategy/raids/karazhan/RaidKarazhanActions.cpp index eb23d72cac..59672e84f7 100644 --- a/src/strategy/raids/karazhan/RaidKarazhanActions.cpp +++ b/src/strategy/raids/karazhan/RaidKarazhanActions.cpp @@ -101,6 +101,7 @@ bool KarazhanMaidenOfVirtuePositionBossAction::Execute(Event event) bot->GetPositionZ(), false, false, false, false, MovementPriority::MOVEMENT_COMBAT, true, false); } } + return false; } @@ -146,6 +147,7 @@ bool KarazhanMaidenOfVirtuePositionRangedAction::Execute(Event event) KARAZHAN_MAIDEN_OF_VIRTUE_RANGED_POSITION[index].GetPositionY(), bot->GetPositionZ(), false, false, false, false, MovementPriority::MOVEMENT_COMBAT, true, false); } + return false; } @@ -176,9 +178,11 @@ bool KarazhanBigBadWolfPositionBossAction::Execute(Event event) { return false; } + return MoveTo(bot->GetMapId(), mX, mY, bot->GetPositionZ(), false, false, false, false, MovementPriority::MOVEMENT_COMBAT, true, false); } + return false; } @@ -193,7 +197,6 @@ bool KarazhanBigBadWolfPositionBossAction::isUseful() bool KarazhanBigBadWolfRunAwayAction::Execute(Event event) { constexpr float threshold = 1.0f; - Position target = KARAZHAN_BIG_BAD_WOLF_RUN_POSITION[currentIndex]; while (bot->GetExactDist2d(target.GetPositionX(), target.GetPositionY()) < threshold) @@ -201,6 +204,7 @@ bool KarazhanBigBadWolfRunAwayAction::Execute(Event event) currentIndex = (currentIndex + 1) % 4; target = KARAZHAN_BIG_BAD_WOLF_RUN_POSITION[currentIndex]; } + return MoveTo(bot->GetMapId(), target.GetPositionX(), target.GetPositionY(), target.GetPositionZ(), false, false, false, true, MovementPriority::MOVEMENT_FORCED); } @@ -257,13 +261,8 @@ bool KarazhanWizardOfOzMarkTargetAction::Execute(Event event) bool KarazhanWizardOfOzScorchStrawmanAction::Execute(Event event) { Unit* strawman = AI_VALUE2(Unit*, "find target", "strawman"); - if (!strawman || !strawman->IsAlive()) - { - return false; - } - Group* group = bot->GetGroup(); - if (!group) + if (!strawman || !strawman->IsAlive() || !group) { return false; } @@ -271,18 +270,9 @@ bool KarazhanWizardOfOzScorchStrawmanAction::Execute(Event event) for (GroupReference* itr = group->GetFirstMember(); itr != nullptr; itr = itr->next()) { Player* member = itr->GetSource(); - if (!member || !member->IsAlive()) - { - continue; - } - if (member->getClass() != CLASS_MAGE) - { - continue; - } - PlayerbotAI* mageAI = sPlayerbotsMgr->GetPlayerbotAI(member); - if (!mageAI) - { + if (!member || !member->IsAlive() || member->getClass() != CLASS_MAGE || !mageAI) + { continue; } if (mageAI->CanCastSpell("scorch", strawman)) @@ -290,6 +280,7 @@ bool KarazhanWizardOfOzScorchStrawmanAction::Execute(Event event) mageAI->CastSpell("scorch", strawman); } } + return false; } @@ -325,6 +316,7 @@ bool KarazhanTheCuratorPositionBossAction::Execute(Event event) false); } } + return false; } @@ -345,6 +337,7 @@ bool KarazhanTheCuratorSpreadRangedAction::Execute(Event event) { return FleePosition(nearestPlayer->GetPosition(), minDistance); } + return false; } @@ -391,6 +384,7 @@ bool KarazhanShadeOfAranArcaneExplosionRunAwayAction::Execute(Event event) { return MoveAway(boss, safeDistance - distance); } + return false; } @@ -415,6 +409,7 @@ bool KarazhanShadeOfAranFlameWreathStopMovementAction::Execute(Event event) } return true; } + return false; } @@ -422,15 +417,14 @@ bool KarazhanShadeOfAranMarkConjuredElementalAction::Execute(Event event) { RaidKarazhanHelpers karazhanHelper(botAI); Unit* boss = AI_VALUE2(Unit*, "find target", "shade of aran"); - if (!boss || !boss->IsAlive()) - { - return false; - } Unit* target = karazhanHelper.GetFirstAliveUnitByEntry(NPC_CONJURED_ELEMENTAL); - if (!target || !target->IsAlive() || target->HasAura(SPELL_WARLOCK_BANISH)) + + if (!boss || !boss->IsAlive() || + !target || !target->IsAlive() || target->HasAura(SPELL_WARLOCK_BANISH)) { return false; } + karazhanHelper.MarkTargetWithSkull(target); return false; @@ -464,21 +458,17 @@ bool KarazhanShadeOfAranSpreadRangedAction::Execute(Event event) { return FleePosition(nearestPlayer->GetPosition(), minDistance); } + return false; } bool KarazhanShadeOfAranSpreadRangedAction::isUseful() { Unit* boss = AI_VALUE2(Unit*, "find target", "shade of aran"); - if (!boss || !boss->IsAlive()) - { - return false; - } - RaidKarazhanHelpers karazhanHelper(botAI); - return botAI->IsRanged(bot) && !karazhanHelper.IsFlameWreathActive() && !(boss->HasUnitState(UNIT_STATE_CASTING) - && boss->FindCurrentSpellBySpellId(SPELL_ARCANE_EXPLOSION)); + return boss && boss->IsAlive() && botAI->IsRanged(bot) && !karazhanHelper.IsFlameWreathActive() && + !(boss->HasUnitState(UNIT_STATE_CASTING) && boss->FindCurrentSpellBySpellId(SPELL_ARCANE_EXPLOSION)); } // One tank per phase will dance in and out of the red beam (5 seconds in, 5 seconds out) @@ -498,29 +488,33 @@ bool KarazhanNetherspiteBlockRedBeamAction::Execute(Event event) for (GroupReference* itr = group->GetFirstMember(); itr != nullptr; itr = itr->next()) { Player* member = itr->GetSource(); - if (!member || !member->IsAlive()) - { - continue; - } PlayerbotAI* memberAI = sPlayerbotsMgr->GetPlayerbotAI(member); - if (!memberAI || !memberAI->IsTank(member)) - { - continue; - } - if (member->HasAura(SPELL_NETHER_EXHAUSTION_RED)) + if (!member || !member->IsAlive() || !memberAI || !memberAI->IsTank(member) || + member->HasAura(SPELL_NETHER_EXHAUSTION_RED)) { continue; } eligibleTank = member; break; } - RaidKarazhanHelpers karazhanHelper(botAI); Position beamPos = karazhanHelper.GetPositionOnBeam(boss, redPortal, 18.0f); if (bot == eligibleTank) { - bot->Yell("I'm moving to block the red beam!", LANG_UNIVERSAL); + std::string msg; + std::map ph; + ph["%player"] = bot->GetName(); + bool got = sPlayerbotTextMgr->GetBotText("netherspite_beam_blocking_red", msg, ph); + if (got && !msg.empty()) + { + bot->Yell(msg, LANG_UNIVERSAL); + } + else + { + bot->Yell(bot->GetName() + " is moving to block the red beam!", LANG_UNIVERSAL); + } + ObjectGuid botGuid = bot->GetGUID(); uint32 intervalSecs = 5; @@ -539,6 +533,7 @@ bool KarazhanNetherspiteBlockRedBeamAction::Execute(Event event) return MoveTo(bot->GetMapId(), beamPos.GetPositionX(), beamPos.GetPositionY(), beamPos.GetPositionZ(), false, false, false, true, MovementPriority::MOVEMENT_FORCED); } + else { float bx = boss->GetPositionX(); @@ -552,6 +547,7 @@ bool KarazhanNetherspiteBlockRedBeamAction::Execute(Event event) { return false; } + dx /= length; dy /= length; float perpDx = -dy; @@ -564,6 +560,7 @@ bool KarazhanNetherspiteBlockRedBeamAction::Execute(Event event) MovementPriority::MOVEMENT_FORCED); } } + return false; } @@ -576,23 +573,21 @@ bool KarazhanNetherspiteBlockRedBeamAction::isUseful() static std::map lastBossBanishState; bool bossIsBanished = boss && boss->HasAura(SPELL_NETHERSPITE_BANISHED); - if (!boss || !redPortal) + if (!boss || !redPortal || bossIsBanished) { return false; } - if (lastBossBanishState[botGuid] != bossIsBanished) + + if (lastBossBanishState[botGuid] != bossIsBanished) { - if (!bossIsBanished) + if (!bossIsBanished) { beamMoveTimes[botGuid] = 0; lastBeamMoveSideways[botGuid] = false; } lastBossBanishState[botGuid] = bossIsBanished; } - if (bossIsBanished) - { - return false; - } + return true; } @@ -613,18 +608,42 @@ bool KarazhanNetherspiteBlockBlueBeamAction::Execute(Event event) if (wasBlocking && !isBlockingNow) { - bot->Yell("I'm leaving the blue beam--next blocker up!", LANG_UNIVERSAL); + std::string msg; + std::map ph; + ph["%player"] = bot->GetName(); + bool got = sPlayerbotTextMgr->GetBotText("netherspite_beam_leaving_blue", msg, ph); + if (got && !msg.empty()) + { + bot->Yell(msg, LANG_UNIVERSAL); + } + else + { + bot->Yell(bot->GetName() + " is leaving the blue beam--next blocker up!", LANG_UNIVERSAL); + } + wasBlockingBlueBeam[botGuid] = false; + return false; } - else if (isBlockingNow) - { - wasBlockingBlueBeam[botGuid] = true; - } + if (isBlockingNow) { if (!wasBlocking) - bot->Yell("I'm moving to block the blue beam!", LANG_UNIVERSAL); + { + std::string msg; + std::map ph; + ph["%player"] = bot->GetName(); + bool got = sPlayerbotTextMgr->GetBotText("netherspite_beam_blocking_blue", msg, ph); + if (got && !msg.empty()) + { + bot->Yell(msg, LANG_UNIVERSAL); + } + else + { + bot->Yell(bot->GetName() + " is moving to block the blue beam!", LANG_UNIVERSAL); + } + } wasBlockingBlueBeam[botGuid] = true; + std::vector voidZones = karazhanHelper.GetAllVoidZones(); float bx = boss->GetPositionX(); float by = boss->GetPositionY(); @@ -677,12 +696,11 @@ bool KarazhanNetherspiteBlockBlueBeamAction::Execute(Event event) return MoveTo(bot->GetMapId(), bestPos.GetPositionX(), bestPos.GetPositionY(), bestPos.GetPositionZ(), false, false, false, true, MovementPriority::MOVEMENT_FORCED); } + return false; } - else if (wasBlocking) - { - wasBlockingBlueBeam[botGuid] = false; - } + + wasBlockingBlueBeam[botGuid] = false; return false; } @@ -712,14 +730,42 @@ bool KarazhanNetherspiteBlockGreenBeamAction::Execute(Event event) if (wasBlocking && !isBlockingNow) { - bot->Yell("I'm leaving the green beam--next blocker up!", LANG_UNIVERSAL); + std::string msg; + std::map ph; + ph["%player"] = bot->GetName(); + bool got = sPlayerbotTextMgr->GetBotText("netherspite_beam_leaving_green", msg, ph); + if (got && !msg.empty()) + { + bot->Yell(msg, LANG_UNIVERSAL); + } + else + { + bot->Yell(bot->GetName() + " TESTRUN is leaving the green beam--next blocker up!", LANG_UNIVERSAL); + } + wasBlockingGreenBeam[botGuid] = false; + return false; } - else if (isBlockingNow) + + if (isBlockingNow) { if (!wasBlocking) - bot->Yell("I'm moving to block the green beam!", LANG_UNIVERSAL); + { + std::string msg; + std::map ph; + ph["%player"] = bot->GetName(); + bool got = sPlayerbotTextMgr->GetBotText("netherspite_beam_blocking_green", msg, ph); + if (got && !msg.empty()) + { + bot->Yell(msg, LANG_UNIVERSAL); + } + else + { + bot->Yell(bot->GetName() + " TESTRUN is moving to block the green beam!", LANG_UNIVERSAL); + } + } wasBlockingGreenBeam[botGuid] = true; + std::vector voidZones = karazhanHelper.GetAllVoidZones(); float bx = boss->GetPositionX(); float by = boss->GetPositionY(); @@ -733,6 +779,7 @@ bool KarazhanNetherspiteBlockGreenBeamAction::Execute(Event event) { return false; } + dx /= length; dy /= length; float bestDist = 150.0f; @@ -747,7 +794,7 @@ bool KarazhanNetherspiteBlockGreenBeamAction::Execute(Event event) for (Unit* voidZone : voidZones) { float voidZoneDist = sqrt(pow(candidateX - voidZone->GetPositionX(), 2) + - pow(candidateY - voidZone->GetPositionY(), 2)); + pow(candidateY - voidZone->GetPositionY(), 2)); if (voidZoneDist < 4.0f) { outsideAllVoidZones = false; @@ -771,12 +818,11 @@ bool KarazhanNetherspiteBlockGreenBeamAction::Execute(Event event) return MoveTo(bot->GetMapId(), bestPos.GetPositionX(), bestPos.GetPositionY(), bestPos.GetPositionZ(), false, false, false, true, MovementPriority::MOVEMENT_FORCED); } + return false; } - else if (wasBlocking) - { - wasBlockingGreenBeam[botGuid] = false; - } + + wasBlockingGreenBeam[botGuid] = false; return false; } @@ -835,7 +881,6 @@ bool KarazhanNetherspiteAvoidBeamAndVoidZoneAction::Execute(Event event) float length = sqrt(dx*dx + dy*dy); beams.push_back({greenPortal, 0.0f, length}); } - bool nearBeam = false; for (const auto& beam : beams) { @@ -844,7 +889,7 @@ bool KarazhanNetherspiteAvoidBeamAndVoidZoneAction::Execute(Event event) float dx = px - bx, dy = py - by; float length = sqrt(dx*dx + dy*dy); if (length == 0.0f) - {continue; + { continue; } dx /= length; dy /= length; @@ -858,7 +903,6 @@ bool KarazhanNetherspiteAvoidBeamAndVoidZoneAction::Execute(Event event) break; } } - if (!nearVoidZone && !nearBeam) { return false; @@ -936,12 +980,14 @@ bool KarazhanNetherspiteAvoidBeamAndVoidZoneAction::isUseful() { return false; } + RaidKarazhanHelpers karazhanHelper(botAI); auto [redBlocker, greenBlocker, blueBlocker] = karazhanHelper.GetCurrentBeamBlockers(); if (bot == redBlocker || bot == blueBlocker || bot == greenBlocker) { return false; } + return true; } @@ -957,6 +1003,7 @@ bool KarazhanNetherspiteBanishPhaseAvoidVoidZoneAction::Execute(Event event) return FleePosition(vz->GetPosition(), 4.0f); } } + return false; } @@ -967,6 +1014,7 @@ bool KarazhanNetherspiteBanishPhaseAvoidVoidZoneAction::isUseful() { return false; } + RaidKarazhanHelpers karazhanHelper(botAI); std::vector voidZones = karazhanHelper.GetAllVoidZones(); for (Unit* vz : voidZones) @@ -976,6 +1024,7 @@ bool KarazhanNetherspiteBanishPhaseAvoidVoidZoneAction::isUseful() return true; } } + return false; } @@ -1037,6 +1086,7 @@ bool KarazhanPrinceMalchezaarNonTankAvoidHazardAction::Execute(Event event) return MoveTo(bot->GetMapId(), bestDestX, bestDestY, bestDestZ, false, false, false, true, MovementPriority::MOVEMENT_FORCED); } + return false; } @@ -1127,6 +1177,7 @@ bool KarazhanPrinceMalchezaarNonTankAvoidHazardAction::Execute(Event event) } } } + return false; } @@ -1165,6 +1216,7 @@ bool KarazhanPrinceMalchezaarTankAvoidHazardAction::Execute(Event event) break; } } + if (nearInfernal) { for (int i = 0; i < numAngles; ++i) @@ -1238,6 +1290,7 @@ bool KarazhanPrinceMalchezaarTankAvoidHazardAction::Execute(Event event) MovementPriority::MOVEMENT_COMBAT); } } + return false; } diff --git a/src/strategy/raids/karazhan/RaidKarazhanHelpers.cpp b/src/strategy/raids/karazhan/RaidKarazhanHelpers.cpp index 939e73b9b3..39e1ceccff 100644 --- a/src/strategy/raids/karazhan/RaidKarazhanHelpers.cpp +++ b/src/strategy/raids/karazhan/RaidKarazhanHelpers.cpp @@ -100,18 +100,14 @@ Unit* RaidKarazhanHelpers::GetNearestPlayerInRadius(float radius) } } } + return nullptr; } bool RaidKarazhanHelpers::IsFlameWreathActive() { Unit* boss = AI_VALUE2(Unit*, "find target", "shade of aran"); - if (!boss) - { - return false; - } - - Spell* currentSpell = boss->GetCurrentSpell(CURRENT_GENERIC_SPELL); + Spell* currentSpell = boss ? boss->GetCurrentSpell(CURRENT_GENERIC_SPELL) : nullptr; if (currentSpell && currentSpell->m_spellInfo && currentSpell->m_spellInfo->Id == SPELL_FLAME_WREATH) { return true; @@ -132,6 +128,7 @@ bool RaidKarazhanHelpers::IsFlameWreathActive() } } } + return false; } @@ -148,20 +145,19 @@ std::vector RaidKarazhanHelpers::GetBlueBlockers() { continue; } - bool isDps = botAI->IsDps(member); bool isWarrior = member->getClass() == CLASS_WARRIOR; bool isRogue = member->getClass() == CLASS_ROGUE; bool hasExhaustion = member->HasAura(SPELL_NETHER_EXHAUSTION_BLUE); Aura* blueBuff = member->GetAura(SPELL_BLUE_BEAM_DEBUFF); bool overStack = blueBuff && blueBuff->GetStackAmount() >= 25; - if (isDps && !isWarrior && !isRogue && !hasExhaustion && !overStack) { blueBlockers.push_back(member); } } } + return blueBlockers; } @@ -180,7 +176,6 @@ std::vector RaidKarazhanHelpers::GetGreenBlockers() { continue; } - bool hasExhaustion = member->HasAura(SPELL_NETHER_EXHAUSTION_GREEN); Aura* greenBuff = member->GetAura(SPELL_GREEN_BEAM_DEBUFF); bool overStack = greenBuff && greenBuff->GetStackAmount() >= 25; @@ -189,13 +184,13 @@ std::vector RaidKarazhanHelpers::GetGreenBlockers() bool eligibleRogueWarrior = (isRogue || isDpsWarrior) && !hasExhaustion; bool isHealer = botAI->IsHeal(member); bool eligibleHealer = isHealer && !hasExhaustion && !overStack; - if (eligibleRogueWarrior || eligibleHealer) { greenBlockers.push_back(member); } } } + return greenBlockers; } @@ -210,7 +205,6 @@ Position RaidKarazhanHelpers::GetPositionOnBeam(Unit* boss, Unit* portal, float float dx = px - bx; float dy = py - by; float length = sqrt(dx*dx + dy*dy); - if (length == 0.0f) { return Position(bx, by, bz); @@ -218,7 +212,6 @@ Position RaidKarazhanHelpers::GetPositionOnBeam(Unit* boss, Unit* portal, float dx /= length; dy /= length; - float targetX = bx + dx * distanceFromBoss; float targetY = by + dy * distanceFromBoss; float targetZ = bz; @@ -233,38 +226,29 @@ std::tuple RaidKarazhanHelpers::GetCurrentBeamBlocker Player* blueBlocker = nullptr; std::vector redBlockers; - if (Group* group = bot->GetGroup()) +if (Group* group = bot->GetGroup()) +{ + for (GroupReference* itr = group->GetFirstMember(); itr != nullptr; itr = itr->next()) { - for (GroupReference* itr = group->GetFirstMember(); itr != nullptr; itr = itr->next()) + Player* member = itr->GetSource(); + PlayerbotAI* memberAI = sPlayerbotsMgr->GetPlayerbotAI(member); + if (!member || !member->IsAlive() || !memberAI || !memberAI->IsTank(member) || + member->HasAura(SPELL_NETHER_EXHAUSTION_RED)) { - Player* member = itr->GetSource(); - if (!member || !member->IsAlive()) - { - continue; - } - if (!botAI->IsTank(member)) - { - continue; - } - if (member->HasAura(SPELL_NETHER_EXHAUSTION_RED)) - { - continue; - } - redBlockers.push_back(member); + continue; } + redBlockers.push_back(member); } - +} if (!redBlockers.empty()) { redBlocker = redBlockers.front(); } - std::vector greenBlockers = GetGreenBlockers(); if (!greenBlockers.empty()) { greenBlocker = greenBlockers.front(); } - std::vector blueBlockers = GetBlueBlockers(); if (!blueBlockers.empty()) { @@ -286,13 +270,13 @@ std::vector RaidKarazhanHelpers::GetAllVoidZones() { continue; } - float dist = bot->GetExactDist2d(unit); if (dist < radius) { voidZones.push_back(unit); } } + return voidZones; } @@ -302,12 +286,12 @@ bool RaidKarazhanHelpers::IsSafePosition(float x, float y, float z, for (Unit* hazard : hazards) { float dist = std::sqrt(std::pow(x - hazard->GetPositionX(), 2) + std::pow(y - hazard->GetPositionY(), 2)); - if (dist < hazardRadius) { return false; } } + return true; } @@ -315,16 +299,15 @@ std::vector RaidKarazhanHelpers::GetSpawnedInfernals() const { std::vector infernals; const GuidVector npcs = botAI->GetAiObjectContext()->GetValue("nearest hostile npcs")->Get(); - for (const auto& npcGuid : npcs) { Unit* unit = botAI->GetUnit(npcGuid); - if (unit && unit->GetEntry() == NPC_NETHERSPITE_INFERNAL) { infernals.push_back(unit); } } + return infernals; } @@ -341,7 +324,7 @@ bool RaidKarazhanHelpers::IsStraightPathSafe(const Position& start, const Positi { return true; } - + for (float checkDist = 0.0f; checkDist <= totalDist; checkDist += stepSize) { float t = checkDist / totalDist; @@ -357,7 +340,7 @@ bool RaidKarazhanHelpers::IsStraightPathSafe(const Position& start, const Positi } } } - + return true; } @@ -384,7 +367,6 @@ Position RaidKarazhanHelpers::CalculateArcPoint(const Position& current, const P float dotProduct = currentX * targetX + currentY * targetY; dotProduct = std::max(-1.0f, std::min(1.0f, dotProduct)); float angle = std::acos(dotProduct); - float crossProduct = currentX * targetY - currentY * targetX; float stepAngle = angle * arcFraction; if (crossProduct < 0) @@ -394,10 +376,8 @@ Position RaidKarazhanHelpers::CalculateArcPoint(const Position& current, const P float cos_a = std::cos(stepAngle); float sin_a = std::sin(stepAngle); - float rotatedX = currentX * cos_a - currentY * sin_a; float rotatedY = currentX * sin_a + currentY * cos_a; - float desiredDist = currentDist * 0.9f + targetDist * 0.1f; return Position(center.GetPositionX() + rotatedX * desiredDist, diff --git a/src/strategy/raids/karazhan/RaidKarazhanMultipliers.cpp b/src/strategy/raids/karazhan/RaidKarazhanMultipliers.cpp index f5306f8bbc..f326cf0046 100644 --- a/src/strategy/raids/karazhan/RaidKarazhanMultipliers.cpp +++ b/src/strategy/raids/karazhan/RaidKarazhanMultipliers.cpp @@ -31,6 +31,7 @@ float KarazhanBigBadWolfMultiplier::GetValue(Action* action) return 0.0f; } } + return 1.0f; } @@ -81,6 +82,7 @@ float KarazhanShadeOfAranMultiplier::GetValue(Action* action) return 0.0f; } } + return 1.0f; } @@ -125,6 +127,7 @@ float KarazhanNetherspiteBlueAndGreenBeamMultiplier::GetValue(Action* action) break; } } + if (inBeam) { std::vector voidZones = karazhanHelper.GetAllVoidZones(); @@ -145,6 +148,7 @@ float KarazhanNetherspiteBlueAndGreenBeamMultiplier::GetValue(Action* action) } } } + return 1.0f; } @@ -208,6 +212,7 @@ float KarazhanNetherspiteRedBeamMultiplier::GetValue(Action* action) } } } + return 1.0f; } @@ -215,13 +220,11 @@ float KarazhanPrinceMalchezaarMultiplier::GetValue(Action* action) { Unit* boss = AI_VALUE2(Unit*, "find target", "prince malchezaar"); - if (boss && botAI->IsMelee(bot) && bot->HasAura(SPELL_ENFEEBLE)) + if (boss && botAI->IsMelee(bot) && bot->HasAura(SPELL_ENFEEBLE) && + !dynamic_cast(action)) { - if (dynamic_cast(action)) - { - return 1.0f; - } return 0.0f; } + return 1.0f; } From e525c22d85c6959f2cc54543e984f54702b1dc59 Mon Sep 17 00:00:00 2001 From: crow Date: Sat, 27 Sep 2025 23:11:47 -0500 Subject: [PATCH 067/151] Fix SPEC_TAB names --- src/AiFactory.cpp | 4 ++-- src/PlayerbotAI.cpp | 2 +- src/PlayerbotAI.h | 8 ++++---- src/factory/StatsWeightCalculator.cpp | 2 +- 4 files changed, 8 insertions(+), 8 deletions(-) diff --git a/src/AiFactory.cpp b/src/AiFactory.cpp index 9bf3c5512f..75d51bf127 100644 --- a/src/AiFactory.cpp +++ b/src/AiFactory.cpp @@ -295,7 +295,7 @@ void AiFactory::AddDefaultCombatStrategies(Player* player, PlayerbotAI* const fa { engine->addStrategiesNoInit("dps", "shadow debuff", "shadow aoe", nullptr); } - else if (tab == PRIEST_TAB_DISIPLINE) + else if (tab == PRIEST_TAB_DISCIPLINE) { engine->addStrategiesNoInit("heal", nullptr); } @@ -607,7 +607,7 @@ void AiFactory::AddDefaultNonCombatStrategies(Player* player, PlayerbotAI* const nonCombatEngine->addStrategy("dps assist", false); break; case CLASS_WARLOCK: - if (tab == WARLOCK_TAB_AFFLICATION) + if (tab == WARLOCK_TAB_AFFLICTION) { nonCombatEngine->addStrategiesNoInit("felhunter", "spellstone", nullptr); } diff --git a/src/PlayerbotAI.cpp b/src/PlayerbotAI.cpp index c2c34a11c0..d529ae34a7 100644 --- a/src/PlayerbotAI.cpp +++ b/src/PlayerbotAI.cpp @@ -2085,7 +2085,7 @@ bool PlayerbotAI::IsHeal(Player* player, bool bySpec) switch (player->getClass()) { case CLASS_PRIEST: - if (tab == PRIEST_TAB_DISIPLINE || tab == PRIEST_TAB_HOLY) + if (tab == PRIEST_TAB_DISCIPLINE || tab == PRIEST_TAB_HOLY) { return true; } diff --git a/src/PlayerbotAI.h b/src/PlayerbotAI.h index 67d7245412..f112f9d00d 100644 --- a/src/PlayerbotAI.h +++ b/src/PlayerbotAI.h @@ -276,7 +276,7 @@ enum BotRoles : uint8 enum HUNTER_TABS { - HUNTER_TAB_BEASTMASTER, + HUNTER_TAB_BEASTMASTERY, HUNTER_TAB_MARKSMANSHIP, HUNTER_TAB_SURVIVAL, }; @@ -285,12 +285,12 @@ enum ROGUE_TABS { ROGUE_TAB_ASSASSINATION, ROGUE_TAB_COMBAT, - ROGUE_TAB_SUBTLETY + ROGUE_TAB_SUBTLETY, }; enum PRIEST_TABS { - PRIEST_TAB_DISIPLINE, + PRIEST_TAB_DISCIPLINE, PRIEST_TAB_HOLY, PRIEST_TAB_SHADOW, }; @@ -332,7 +332,7 @@ enum PALADIN_TABS enum WARLOCK_TABS { - WARLOCK_TAB_AFFLICATION, + WARLOCK_TAB_AFFLICTION, WARLOCK_TAB_DEMONOLOGY, WARLOCK_TAB_DESTRUCTION, }; diff --git a/src/factory/StatsWeightCalculator.cpp b/src/factory/StatsWeightCalculator.cpp index 194912568d..2963c7419b 100644 --- a/src/factory/StatsWeightCalculator.cpp +++ b/src/factory/StatsWeightCalculator.cpp @@ -184,7 +184,7 @@ void StatsWeightCalculator::GenerateBasicWeights(Player* player) stats_weights_[STATS_TYPE_MELEE_DPS] += 0.01f; stats_weights_[STATS_TYPE_RANGED_DPS] += 0.01f; - if (cls == CLASS_HUNTER && (tab == HUNTER_TAB_BEASTMASTER || tab == HUNTER_TAB_SURVIVAL)) + if (cls == CLASS_HUNTER && (tab == HUNTER_TAB_BEASTMASTERY || tab == HUNTER_TAB_SURVIVAL)) { stats_weights_[STATS_TYPE_AGILITY] += 2.5f; stats_weights_[STATS_TYPE_ATTACK_POWER] += 1.0f; From 34ce17fb3ab0d493e420b25fe378ad9e98fb2de0 Mon Sep 17 00:00:00 2001 From: privatecore Date: Sun, 28 Sep 2025 00:07:21 +0200 Subject: [PATCH 068/151] Fix wrong cast spell action passed to the PullPowerSparkAction constructor --- src/strategy/raids/eyeofeternity/RaidEoEActions.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/strategy/raids/eyeofeternity/RaidEoEActions.h b/src/strategy/raids/eyeofeternity/RaidEoEActions.h index d2d158c72b..c6fe064c05 100644 --- a/src/strategy/raids/eyeofeternity/RaidEoEActions.h +++ b/src/strategy/raids/eyeofeternity/RaidEoEActions.h @@ -30,7 +30,7 @@ class PullPowerSparkAction : public CastSpellAction { public: PullPowerSparkAction(PlayerbotAI* botAI, std::string const name = "pull power spark") - : CastSpellAction(botAI, "death grip") {} + : CastSpellAction(botAI, name) {} bool Execute(Event event) override; bool isPossible() override; bool isUseful() override; From c20fb3447076e98e6c56febbb8e84b458ccca5e7 Mon Sep 17 00:00:00 2001 From: kadeshar Date: Sun, 28 Sep 2025 13:39:59 +0200 Subject: [PATCH 069/151] - Added method to get translation bot text or default (#1678) --- src/PlayerbotTextMgr.cpp | 16 +++++++++++++ src/PlayerbotTextMgr.h | 2 ++ src/strategy/actions/GenericBuffUtils.cpp | 29 +++++++---------------- 3 files changed, 27 insertions(+), 20 deletions(-) diff --git a/src/PlayerbotTextMgr.cpp b/src/PlayerbotTextMgr.cpp index 9a923de9e8..e758d630b9 100644 --- a/src/PlayerbotTextMgr.cpp +++ b/src/PlayerbotTextMgr.cpp @@ -101,6 +101,22 @@ std::string PlayerbotTextMgr::GetBotText(std::string name, std::map placeholders) +{ + std::string botText = GetBotText(name, placeholders); + if (botText.empty()) + { + for (std::map::iterator i = placeholders.begin(); i != placeholders.end(); ++i) + { + replaceAll(defaultText, i->first, i->second); + } + return defaultText; + } + + return botText; +} + // chat replies std::string PlayerbotTextMgr::GetBotText(ChatReplyType replyType, std::map placeholders) diff --git a/src/PlayerbotTextMgr.h b/src/PlayerbotTextMgr.h index 5ec3aaa69d..05c47ce26f 100644 --- a/src/PlayerbotTextMgr.h +++ b/src/PlayerbotTextMgr.h @@ -83,6 +83,8 @@ class PlayerbotTextMgr std::string GetBotText(ChatReplyType replyType, std::string name); bool GetBotText(std::string name, std::string& text); bool GetBotText(std::string name, std::string& text, std::map placeholders); + std::string GetBotTextOrDefault(std::string name, std::string defaultText, + std::map placeholders); void LoadBotTexts(); void LoadBotTextChance(); static void replaceAll(std::string& str, const std::string& from, const std::string& to); diff --git a/src/strategy/actions/GenericBuffUtils.cpp b/src/strategy/actions/GenericBuffUtils.cpp index e1dce00436..d222667ca1 100644 --- a/src/strategy/actions/GenericBuffUtils.cpp +++ b/src/strategy/actions/GenericBuffUtils.cpp @@ -125,26 +125,15 @@ namespace ai::buff key = "rp_missing_reagent_generic"; // Placeholders - std::map ph; - ph["%group_spell"] = groupName; - ph["%base_spell"] = baseName; - - // Respecte ai_playerbot_texts_chance if present - std::string rp; - bool got = sPlayerbotTextMgr->GetBotText(key, rp, ph); - if (got && !rp.empty()) - { - announce(rp); - last = now; - } - else - { - // Minimal Fallback - std::ostringstream oss; - oss << "Out of components for " << groupName << ". Using " << baseName << "!"; - announce(oss.str()); - last = now; - } + std::map placeholders; + placeholders["%group_spell"] = groupName; + placeholders["%base_spell"] = baseName; + + std::string announceText = sPlayerbotTextMgr->GetBotTextOrDefault(key, + "Out of components for %group_spell. Using %base_spell!", placeholders); + + announce(announceText); + last = now; } } } From 30bd58be6746ed10d5ff242845e0252c45163210 Mon Sep 17 00:00:00 2001 From: privatecore Date: Sun, 28 Sep 2025 13:42:03 +0200 Subject: [PATCH 070/151] Fix wrong PlayerbotAI parameter name passed to the constructor (#1672) --- src/strategy/StrategyContext.h | 4 ++-- src/strategy/actions/ShareQuestAction.h | 2 +- src/strategy/generic/GrindingStrategy.h | 2 +- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/src/strategy/StrategyContext.h b/src/strategy/StrategyContext.h index ff16df1afe..a95ccbdf51 100644 --- a/src/strategy/StrategyContext.h +++ b/src/strategy/StrategyContext.h @@ -184,8 +184,8 @@ class StrategyContext : public NamedObjectContext static Strategy* grind(PlayerbotAI* botAI) { return new GrindingStrategy(botAI); } static Strategy* avoid_aoe(PlayerbotAI* botAI) { return new AvoidAoeStrategy(botAI); } static Strategy* tank_face(PlayerbotAI* botAI) { return new TankFaceStrategy(botAI); } - static Strategy* move_random(PlayerbotAI* ai) { return new MoveRandomStrategy(ai); } - static Strategy* combat_formation(PlayerbotAI* ai) { return new CombatFormationStrategy(ai); } + static Strategy* move_random(PlayerbotAI* botAI) { return new MoveRandomStrategy(botAI); } + static Strategy* combat_formation(PlayerbotAI* botAI) { return new CombatFormationStrategy(botAI); } static Strategy* move_from_group(PlayerbotAI* botAI) { return new MoveFromGroupStrategy(botAI); } static Strategy* world_buff(PlayerbotAI* botAI) { return new WorldBuffStrategy(botAI); } }; diff --git a/src/strategy/actions/ShareQuestAction.h b/src/strategy/actions/ShareQuestAction.h index d2289ab1f5..efc8701099 100644 --- a/src/strategy/actions/ShareQuestAction.h +++ b/src/strategy/actions/ShareQuestAction.h @@ -20,7 +20,7 @@ class ShareQuestAction : public Action class AutoShareQuestAction : public ShareQuestAction { public: - AutoShareQuestAction(PlayerbotAI* ai) : ShareQuestAction(botAI, "auto share quest") {} + AutoShareQuestAction(PlayerbotAI* botAI) : ShareQuestAction(botAI, "auto share quest") {} bool Execute(Event event) override; bool isUseful() override; diff --git a/src/strategy/generic/GrindingStrategy.h b/src/strategy/generic/GrindingStrategy.h index 6ab11904f3..d04060c4c9 100644 --- a/src/strategy/generic/GrindingStrategy.h +++ b/src/strategy/generic/GrindingStrategy.h @@ -24,7 +24,7 @@ class GrindingStrategy : public NonCombatStrategy class MoveRandomStrategy : public NonCombatStrategy { public: - MoveRandomStrategy(PlayerbotAI* ai) : NonCombatStrategy(botAI) {} + MoveRandomStrategy(PlayerbotAI* botAI) : NonCombatStrategy(botAI) {} std::string const getName() override { return "move random"; } void InitTriggers(std::vector& triggers) override; }; From b0f3de65f55cfd3f817a51c3c2fc23143321a89b Mon Sep 17 00:00:00 2001 From: privatecore Date: Sun, 28 Sep 2025 13:53:11 +0200 Subject: [PATCH 071/151] Fix warning: delete called on non-final that has virtual functions but non-virtual destructor (#1671) --- src/strategy/NamedObjectContext.h | 11 ++++------- 1 file changed, 4 insertions(+), 7 deletions(-) diff --git a/src/strategy/NamedObjectContext.h b/src/strategy/NamedObjectContext.h index 69b38ce1f5..846026c25d 100644 --- a/src/strategy/NamedObjectContext.h +++ b/src/strategy/NamedObjectContext.h @@ -47,6 +47,8 @@ class NamedObjectFactory std::unordered_map creators; public: + virtual ~NamedObjectFactory() = default; + virtual T* create(std::string name, PlayerbotAI* botAI) { size_t found = name.find("::"); @@ -147,9 +149,7 @@ class SharedNamedObjectContextList { contexts.push_back(context); for (const auto& iter : context->creators) - { creators[iter.first] = iter.second; - } } }; @@ -208,6 +208,7 @@ class NamedObjectContextList if (T* object = create(name, botAI)) return created[name] = object; } + return created[name]; } @@ -236,7 +237,6 @@ class NamedObjectContextList for (auto i = contexts.begin(); i != contexts.end(); i++) { std::set supported = (*i)->supports(); - for (std::set::const_iterator j = supported.begin(); j != supported.end(); ++j) result.insert(*j); } @@ -248,9 +248,7 @@ class NamedObjectContextList { std::set result; for (typename std::unordered_map::const_iterator i = created.begin(); i != created.end(); i++) - { result.insert(i->first); - } return result; } @@ -297,15 +295,14 @@ class NamedObjectFactoryList { factories.push_back(context); for (const auto& iter : context->creators) - { creators[iter.first] = iter.second; - } } T* GetContextObject(const std::string& name, PlayerbotAI* botAI) { if (T* object = create(name, botAI)) return object; + return nullptr; } }; From 6f79193d7abb3927480ff915b7afa79bd0a4c8eb Mon Sep 17 00:00:00 2001 From: Iain Donnelly Date: Sun, 28 Sep 2025 14:04:09 +0100 Subject: [PATCH 072/151] Config option to set max number of guild members in random bot guilds --- conf/playerbots.conf.dist | 3 +++ src/PlayerbotAIConfig.cpp | 1 + src/PlayerbotAIConfig.h | 2 +- src/factory/PlayerbotFactory.cpp | 2 +- 4 files changed, 6 insertions(+), 2 deletions(-) diff --git a/conf/playerbots.conf.dist b/conf/playerbots.conf.dist index b4e715f91c..1bf8895503 100644 --- a/conf/playerbots.conf.dist +++ b/conf/playerbots.conf.dist @@ -159,6 +159,9 @@ AiPlayerbot.RandomBotGuildNearby = 0 # Number of guilds created by randombots AiPlayerbot.RandomBotGuildCount = 20 +# Maximum number of members in randombot guilds (minimum is hardcoded to 10) +AiPlayerbot.RandomBotGuildSizeMax = 15 + # Delete all randombot guilds if set to 1 AiPlayerbot.DeleteRandomBotGuilds = 0 diff --git a/src/PlayerbotAIConfig.cpp b/src/PlayerbotAIConfig.cpp index 100bed925f..d2a3ff8a84 100644 --- a/src/PlayerbotAIConfig.cpp +++ b/src/PlayerbotAIConfig.cpp @@ -509,6 +509,7 @@ bool PlayerbotAIConfig::Initialize() randomBotAccountCount = sConfigMgr->GetOption("AiPlayerbot.RandomBotAccountCount", 0); deleteRandomBotAccounts = sConfigMgr->GetOption("AiPlayerbot.DeleteRandomBotAccounts", false); randomBotGuildCount = sConfigMgr->GetOption("AiPlayerbot.RandomBotGuildCount", 20); + randomBotGuildSizeMax = sConfigMgr->GetOption("AiPlayerbot.RandomBotGuildSizeMax", 15); deleteRandomBotGuilds = sConfigMgr->GetOption("AiPlayerbot.DeleteRandomBotGuilds", false); guildTaskEnabled = sConfigMgr->GetOption("AiPlayerbot.EnableGuildTasks", true); diff --git a/src/PlayerbotAIConfig.h b/src/PlayerbotAIConfig.h index 134276988b..48e1b8649a 100644 --- a/src/PlayerbotAIConfig.h +++ b/src/PlayerbotAIConfig.h @@ -267,7 +267,7 @@ class PlayerbotAIConfig uint32 randomBotAccountCount; bool randomBotRandomPassword; bool deleteRandomBotAccounts; - uint32 randomBotGuildCount; + uint32 randomBotGuildCount, randomBotGuildSizeMax; bool deleteRandomBotGuilds; std::vector randomBotGuilds; std::vector pvpProhibitedZoneIds; diff --git a/src/factory/PlayerbotFactory.cpp b/src/factory/PlayerbotFactory.cpp index f9a5d00756..60b6ec69b7 100644 --- a/src/factory/PlayerbotFactory.cpp +++ b/src/factory/PlayerbotFactory.cpp @@ -3992,7 +3992,7 @@ void PlayerbotFactory::InitGuild() return; } - if (guild->GetMemberSize() < urand(10, 15)) + if (guild->GetMemberSize() < urand(10, sPlayerbotAIConfig->randomBotGuildSizeMax)) guild->AddMember(bot->GetGUID(), urand(GR_OFFICER, GR_INITIATE)); // add guild tabard From df77668b4bcc46cfbbeecc8135c1515147e9b592 Mon Sep 17 00:00:00 2001 From: bash <31279994+hermensbas@users.noreply.github.com> Date: Sun, 28 Sep 2025 20:37:01 +0200 Subject: [PATCH 073/151] Review --- src/strategy/actions/NonCombatActions.cpp | 16 +++++----------- 1 file changed, 5 insertions(+), 11 deletions(-) diff --git a/src/strategy/actions/NonCombatActions.cpp b/src/strategy/actions/NonCombatActions.cpp index c17829aa6d..3084213512 100644 --- a/src/strategy/actions/NonCombatActions.cpp +++ b/src/strategy/actions/NonCombatActions.cpp @@ -10,10 +10,6 @@ bool DrinkAction::Execute(Event event) { - // gatekeeper - if (!isPossible()) - return false; - if (botAI->HasCheat(BotCheatMask::food)) { // if (bot->IsNonMeleeSpellCast(true)) @@ -53,14 +49,15 @@ bool DrinkAction::Execute(Event event) bool DrinkAction::isUseful() { - return UseItemAction::isUseful() && AI_VALUE2(uint8, "mana", "self target") < 100; + return UseItemAction::isUseful() && + AI_VALUE2(bool, "has mana", "self target") && + AI_VALUE2(uint8, "mana", "self target") < 100; } bool DrinkAction::isPossible() { return !bot->IsInCombat() && !bot->IsMounted() && - AI_VALUE2(bool, "has mana", "self target") && !botAI->HasAnyAuraOf(GetTarget(), "dire bear form", "bear form", "cat form", "travel form", "aquatic form","flight form", "swift flight form", nullptr) && (botAI->HasCheat(BotCheatMask::food) || UseItemAction::isPossible()); @@ -68,10 +65,6 @@ bool DrinkAction::isPossible() bool EatAction::Execute(Event event) { - // gatekeeper - if (!isPossible()) - return false; - if (botAI->HasCheat(BotCheatMask::food)) { // if (bot->IsNonMeleeSpellCast(true)) @@ -111,7 +104,8 @@ bool EatAction::Execute(Event event) bool EatAction::isUseful() { - return UseItemAction::isUseful() && AI_VALUE2(uint8, "health", "self target") < 100; + return UseItemAction::isUseful() && + AI_VALUE2(uint8, "health", "self target") < 100; } bool EatAction::isPossible() From aaa9e1a42cb5c01a16cb40d75cb369eb28a0a707 Mon Sep 17 00:00:00 2001 From: bash <31279994+hermensbas@users.noreply.github.com> Date: Mon, 29 Sep 2025 00:06:56 +0200 Subject: [PATCH 074/151] Placed cheap checks in isPossible() more expensive in isUseful() combat en mounted are both HasUnitFlag checks, which are cheap calls to make. --- src/strategy/actions/NonCombatActions.cpp | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/src/strategy/actions/NonCombatActions.cpp b/src/strategy/actions/NonCombatActions.cpp index 3084213512..25c1fc4732 100644 --- a/src/strategy/actions/NonCombatActions.cpp +++ b/src/strategy/actions/NonCombatActions.cpp @@ -51,15 +51,15 @@ bool DrinkAction::isUseful() { return UseItemAction::isUseful() && AI_VALUE2(bool, "has mana", "self target") && - AI_VALUE2(uint8, "mana", "self target") < 100; + AI_VALUE2(uint8, "mana", "self target") < 100 && + !botAI->HasAnyAuraOf(GetTarget(), "dire bear form", "bear form", "cat form", "travel form", + "aquatic form","flight form", "swift flight form", nullptr) && } bool DrinkAction::isPossible() { return !bot->IsInCombat() && !bot->IsMounted() && - !botAI->HasAnyAuraOf(GetTarget(), "dire bear form", "bear form", "cat form", "travel form", - "aquatic form","flight form", "swift flight form", nullptr) && (botAI->HasCheat(BotCheatMask::food) || UseItemAction::isPossible()); } @@ -105,14 +105,14 @@ bool EatAction::Execute(Event event) bool EatAction::isUseful() { return UseItemAction::isUseful() && - AI_VALUE2(uint8, "health", "self target") < 100; + AI_VALUE2(uint8, "health", "self target") < 100 && + !botAI->HasAnyAuraOf(GetTarget(), "dire bear form", "bear form", "cat form", "travel form", + "aquatic form","flight form", "swift flight form", nullptr) && } bool EatAction::isPossible() { return !bot->IsInCombat() && !bot->IsMounted() && - !botAI->HasAnyAuraOf(GetTarget(), "dire bear form", "bear form", "cat form", "travel form", - "aquatic form","flight form", "swift flight form", nullptr) && (botAI->HasCheat(BotCheatMask::food) || UseItemAction::isPossible()); } From 972e2604ce0cc4d02fe690faf126a9b6de71bd92 Mon Sep 17 00:00:00 2001 From: bash <31279994+hermensbas@users.noreply.github.com> Date: Mon, 29 Sep 2025 00:14:28 +0200 Subject: [PATCH 075/151] Update NonCombatActions.cpp This is better, even though aura check is tiny more expensive then most. Placing them into isUseful() is kinda confusing. --- src/strategy/actions/NonCombatActions.cpp | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/src/strategy/actions/NonCombatActions.cpp b/src/strategy/actions/NonCombatActions.cpp index 25c1fc4732..60628bc753 100644 --- a/src/strategy/actions/NonCombatActions.cpp +++ b/src/strategy/actions/NonCombatActions.cpp @@ -51,15 +51,15 @@ bool DrinkAction::isUseful() { return UseItemAction::isUseful() && AI_VALUE2(bool, "has mana", "self target") && - AI_VALUE2(uint8, "mana", "self target") < 100 && - !botAI->HasAnyAuraOf(GetTarget(), "dire bear form", "bear form", "cat form", "travel form", - "aquatic form","flight form", "swift flight form", nullptr) && + AI_VALUE2(uint8, "mana", "self target") < 100; } bool DrinkAction::isPossible() { return !bot->IsInCombat() && !bot->IsMounted() && + !botAI->HasAnyAuraOf(GetTarget(), "dire bear form", "bear form", "cat form", "travel form", + "aquatic form","flight form", "swift flight form", nullptr) && (botAI->HasCheat(BotCheatMask::food) || UseItemAction::isPossible()); } @@ -105,14 +105,14 @@ bool EatAction::Execute(Event event) bool EatAction::isUseful() { return UseItemAction::isUseful() && - AI_VALUE2(uint8, "health", "self target") < 100 && - !botAI->HasAnyAuraOf(GetTarget(), "dire bear form", "bear form", "cat form", "travel form", - "aquatic form","flight form", "swift flight form", nullptr) && + AI_VALUE2(uint8, "health", "self target") < 100; } bool EatAction::isPossible() { return !bot->IsInCombat() && !bot->IsMounted() && + !botAI->HasAnyAuraOf(GetTarget(), "dire bear form", "bear form", "cat form", "travel form", + "aquatic form","flight form", "swift flight form", nullptr) && (botAI->HasCheat(BotCheatMask::food) || UseItemAction::isPossible()); } From 55b58a2ef63446b8280fcc88220b225b84308b2a Mon Sep 17 00:00:00 2001 From: crow Date: Sun, 28 Sep 2025 20:31:57 -0500 Subject: [PATCH 076/151] Simplify checks & implement getbottext method --- .../raids/karazhan/RaidKarazhanActions.cpp | 101 +++++------------- .../raids/karazhan/RaidKarazhanHelpers.cpp | 25 +++-- .../karazhan/RaidKarazhanMultipliers.cpp | 6 +- 3 files changed, 43 insertions(+), 89 deletions(-) diff --git a/src/strategy/raids/karazhan/RaidKarazhanActions.cpp b/src/strategy/raids/karazhan/RaidKarazhanActions.cpp index 59672e84f7..35b1e28562 100644 --- a/src/strategy/raids/karazhan/RaidKarazhanActions.cpp +++ b/src/strategy/raids/karazhan/RaidKarazhanActions.cpp @@ -1,9 +1,10 @@ #include "RaidKarazhanActions.h" #include "RaidKarazhanHelpers.h" #include "AiObjectContext.h" -#include "Playerbots.h" -#include "PlayerbotMgr.h" #include "PlayerbotAI.h" +#include "PlayerbotMgr.h" +#include "PlayerbotTextMgr.h" +#include "Playerbots.h" #include "Position.h" namespace @@ -261,26 +262,16 @@ bool KarazhanWizardOfOzMarkTargetAction::Execute(Event event) bool KarazhanWizardOfOzScorchStrawmanAction::Execute(Event event) { Unit* strawman = AI_VALUE2(Unit*, "find target", "strawman"); - Group* group = bot->GetGroup(); - if (!strawman || !strawman->IsAlive() || !group) + if (!strawman || !strawman->IsAlive() || bot->getClass() != CLASS_MAGE) { return false; } - for (GroupReference* itr = group->GetFirstMember(); itr != nullptr; itr = itr->next()) + if (botAI->CanCastSpell("scorch", strawman)) { - Player* member = itr->GetSource(); - PlayerbotAI* mageAI = sPlayerbotsMgr->GetPlayerbotAI(member); - if (!member || !member->IsAlive() || member->getClass() != CLASS_MAGE || !mageAI) - { - continue; - } - if (mageAI->CanCastSpell("scorch", strawman)) - { - mageAI->CastSpell("scorch", strawman); - } + botAI->CastSpell("scorch", strawman); } - + return false; } @@ -471,8 +462,8 @@ bool KarazhanShadeOfAranSpreadRangedAction::isUseful() !(boss->HasUnitState(UNIT_STATE_CASTING) && boss->FindCurrentSpellBySpellId(SPELL_ARCANE_EXPLOSION)); } -// One tank per phase will dance in and out of the red beam (5 seconds in, 5 seconds out) -// Tanks will ignore void zones--their positioning is too important +// One tank bot per phase will dance in and out of the red beam (5 seconds in, 5 seconds out) +// Tank bots will ignore void zones--their positioning is too important bool KarazhanNetherspiteBlockRedBeamAction::Execute(Event event) { Unit* boss = AI_VALUE2(Unit*, "find target", "netherspite"); @@ -488,8 +479,7 @@ bool KarazhanNetherspiteBlockRedBeamAction::Execute(Event event) for (GroupReference* itr = group->GetFirstMember(); itr != nullptr; itr = itr->next()) { Player* member = itr->GetSource(); - PlayerbotAI* memberAI = sPlayerbotsMgr->GetPlayerbotAI(member); - if (!member || !member->IsAlive() || !memberAI || !memberAI->IsTank(member) || + if (!member || !member->IsAlive() || !botAI->IsTank(member) || !GET_PLAYERBOT_AI(member) || member->HasAura(SPELL_NETHER_EXHAUSTION_RED)) { continue; @@ -502,18 +492,11 @@ bool KarazhanNetherspiteBlockRedBeamAction::Execute(Event event) if (bot == eligibleTank) { - std::string msg; std::map ph; ph["%player"] = bot->GetName(); - bool got = sPlayerbotTextMgr->GetBotText("netherspite_beam_blocking_red", msg, ph); - if (got && !msg.empty()) - { - bot->Yell(msg, LANG_UNIVERSAL); - } - else - { - bot->Yell(bot->GetName() + " is moving to block the red beam!", LANG_UNIVERSAL); - } + std::string text = sPlayerbotTextMgr->GetBotTextOrDefault( + "netherspite_beam_blocking_red", "%player is moving to block the red beam!", ph); + bot->Yell(text, LANG_UNIVERSAL); ObjectGuid botGuid = bot->GetGUID(); uint32 intervalSecs = 5; @@ -591,7 +574,7 @@ bool KarazhanNetherspiteBlockRedBeamAction::isUseful() return true; } -// Two non-Rogue/Warrior DPS will block the blue beam for each phase (swap at 25 debuff stacks) +// Two non-Rogue/Warrior DPS bots will block the blue beam for each phase (swap at 25 debuff stacks) // When avoiding void zones, blocking bots will move along the beam to continue blocking bool KarazhanNetherspiteBlockBlueBeamAction::Execute(Event event) { @@ -608,18 +591,11 @@ bool KarazhanNetherspiteBlockBlueBeamAction::Execute(Event event) if (wasBlocking && !isBlockingNow) { - std::string msg; std::map ph; ph["%player"] = bot->GetName(); - bool got = sPlayerbotTextMgr->GetBotText("netherspite_beam_leaving_blue", msg, ph); - if (got && !msg.empty()) - { - bot->Yell(msg, LANG_UNIVERSAL); - } - else - { - bot->Yell(bot->GetName() + " is leaving the blue beam--next blocker up!", LANG_UNIVERSAL); - } + std::string text = sPlayerbotTextMgr->GetBotTextOrDefault( + "netherspite_beam_leaving_blue", "%player is leaving the blue beam--next blocker up!", ph); + bot->Yell(text, LANG_UNIVERSAL); wasBlockingBlueBeam[botGuid] = false; return false; @@ -629,18 +605,11 @@ bool KarazhanNetherspiteBlockBlueBeamAction::Execute(Event event) { if (!wasBlocking) { - std::string msg; std::map ph; ph["%player"] = bot->GetName(); - bool got = sPlayerbotTextMgr->GetBotText("netherspite_beam_blocking_blue", msg, ph); - if (got && !msg.empty()) - { - bot->Yell(msg, LANG_UNIVERSAL); - } - else - { - bot->Yell(bot->GetName() + " is moving to block the blue beam!", LANG_UNIVERSAL); - } + std::string text = sPlayerbotTextMgr->GetBotTextOrDefault( + "netherspite_beam_blocking_blue", "%player is moving to block the blue beam!", ph); + bot->Yell(text, LANG_UNIVERSAL); } wasBlockingBlueBeam[botGuid] = true; @@ -712,8 +681,8 @@ bool KarazhanNetherspiteBlockBlueBeamAction::isUseful() return boss && bluePortal && !boss->HasAura(SPELL_NETHERSPITE_BANISHED); } -// Two healers will block the green beam for each phase (swap at 25 debuff stacks) -// OR one rogue or DPS warrior will block the green beam for an entire phase (if they begin the phase as the blocker) +// Two healer bots will block the green beam for each phase (swap at 25 debuff stacks) +// OR one rogue or DPS warrior bot will block the green beam for an entire phase (if they begin the phase as the blocker) // When avoiding void zones, blocking bots will move along the beam to continue blocking bool KarazhanNetherspiteBlockGreenBeamAction::Execute(Event event) { @@ -730,18 +699,11 @@ bool KarazhanNetherspiteBlockGreenBeamAction::Execute(Event event) if (wasBlocking && !isBlockingNow) { - std::string msg; std::map ph; ph["%player"] = bot->GetName(); - bool got = sPlayerbotTextMgr->GetBotText("netherspite_beam_leaving_green", msg, ph); - if (got && !msg.empty()) - { - bot->Yell(msg, LANG_UNIVERSAL); - } - else - { - bot->Yell(bot->GetName() + " TESTRUN is leaving the green beam--next blocker up!", LANG_UNIVERSAL); - } + std::string text = sPlayerbotTextMgr->GetBotTextOrDefault( + "netherspite_beam_leaving_green", "%player is leaving the green beam--next blocker up!", ph); + bot->Yell(text, LANG_UNIVERSAL); wasBlockingGreenBeam[botGuid] = false; return false; @@ -751,18 +713,11 @@ bool KarazhanNetherspiteBlockGreenBeamAction::Execute(Event event) { if (!wasBlocking) { - std::string msg; std::map ph; ph["%player"] = bot->GetName(); - bool got = sPlayerbotTextMgr->GetBotText("netherspite_beam_blocking_green", msg, ph); - if (got && !msg.empty()) - { - bot->Yell(msg, LANG_UNIVERSAL); - } - else - { - bot->Yell(bot->GetName() + " TESTRUN is moving to block the green beam!", LANG_UNIVERSAL); - } + std::string text = sPlayerbotTextMgr->GetBotTextOrDefault( + "netherspite_beam_blocking_green", "%player is moving to block the green beam!", ph); + bot->Yell(text, LANG_UNIVERSAL); } wasBlockingGreenBeam[botGuid] = true; diff --git a/src/strategy/raids/karazhan/RaidKarazhanHelpers.cpp b/src/strategy/raids/karazhan/RaidKarazhanHelpers.cpp index 39e1ceccff..19dd0b3363 100644 --- a/src/strategy/raids/karazhan/RaidKarazhanHelpers.cpp +++ b/src/strategy/raids/karazhan/RaidKarazhanHelpers.cpp @@ -132,7 +132,7 @@ bool RaidKarazhanHelpers::IsFlameWreathActive() return false; } -// Blue beam blockers: non-Rogue/Warrior DPS, no Nether Exhaustion Blue and <25 stacks of Blue Beam debuff +// Blue beam blockers: non-Rogue/Warrior DPS bots, no Nether Exhaustion Blue and <25 stacks of Blue Beam debuff std::vector RaidKarazhanHelpers::GetBlueBlockers() { std::vector blueBlockers; @@ -162,8 +162,8 @@ std::vector RaidKarazhanHelpers::GetBlueBlockers() } // Green beam blockers: -// (1) Rogues and non-tank Warriors, no Nether Exhaustion Green -// (2) Healers, no Nether Exhaustion Green and <25 stacks of Green Beam debuff +// (1) Rogue and non-tank Warrior bots, no Nether Exhaustion Green +// (2) Healer bots, no Nether Exhaustion Green and <25 stacks of Green Beam debuff std::vector RaidKarazhanHelpers::GetGreenBlockers() { std::vector greenBlockers; @@ -226,20 +226,19 @@ std::tuple RaidKarazhanHelpers::GetCurrentBeamBlocker Player* blueBlocker = nullptr; std::vector redBlockers; -if (Group* group = bot->GetGroup()) -{ - for (GroupReference* itr = group->GetFirstMember(); itr != nullptr; itr = itr->next()) + if (Group* group = bot->GetGroup()) { - Player* member = itr->GetSource(); - PlayerbotAI* memberAI = sPlayerbotsMgr->GetPlayerbotAI(member); - if (!member || !member->IsAlive() || !memberAI || !memberAI->IsTank(member) || - member->HasAura(SPELL_NETHER_EXHAUSTION_RED)) + for (GroupReference* itr = group->GetFirstMember(); itr != nullptr; itr = itr->next()) { - continue; + Player* member = itr->GetSource(); + if (!member || !member->IsAlive() || !botAI->IsTank(member) || !GET_PLAYERBOT_AI(member) || + member->HasAura(SPELL_NETHER_EXHAUSTION_RED)) + { + continue; + } + redBlockers.push_back(member); } - redBlockers.push_back(member); } -} if (!redBlockers.empty()) { redBlocker = redBlockers.front(); diff --git a/src/strategy/raids/karazhan/RaidKarazhanMultipliers.cpp b/src/strategy/raids/karazhan/RaidKarazhanMultipliers.cpp index f326cf0046..01c1c179a7 100644 --- a/src/strategy/raids/karazhan/RaidKarazhanMultipliers.cpp +++ b/src/strategy/raids/karazhan/RaidKarazhanMultipliers.cpp @@ -27,9 +27,9 @@ float KarazhanBigBadWolfMultiplier::GetValue(Action* action) { if ((dynamic_cast(action) && !dynamic_cast(action)) || (dynamic_cast(action))) - { - return 0.0f; - } + { + return 0.0f; + } } return 1.0f; From 2e1507b794751c7d4d1ef8a7a498ca3b8ebedca3 Mon Sep 17 00:00:00 2001 From: crow Date: Mon, 29 Sep 2025 11:28:13 -0500 Subject: [PATCH 077/151] Various corrections --- .../raids/karazhan/RaidKarazhanActions.cpp | 296 +++++++++--------- .../raids/karazhan/RaidKarazhanHelpers.cpp | 154 +++++---- .../raids/karazhan/RaidKarazhanHelpers.h | 2 +- .../karazhan/RaidKarazhanMultipliers.cpp | 58 +++- .../raids/karazhan/RaidKarazhanMultipliers.h | 7 + 5 files changed, 299 insertions(+), 218 deletions(-) diff --git a/src/strategy/raids/karazhan/RaidKarazhanActions.cpp b/src/strategy/raids/karazhan/RaidKarazhanActions.cpp index 35b1e28562..8ec3ea9143 100644 --- a/src/strategy/raids/karazhan/RaidKarazhanActions.cpp +++ b/src/strategy/raids/karazhan/RaidKarazhanActions.cpp @@ -29,7 +29,12 @@ bool KarazhanAttumenTheHuntsmanStackBehindAction::Execute(Event event) float rx = x + cos(orientation) * distance; float ry = y + sin(orientation) * distance; - return MoveTo(bot->GetMapId(), rx, ry, z, false, false, false, false, MovementPriority::MOVEMENT_COMBAT); + if (bot->GetExactDist2d(rx, ry) > 1.0f) + { + return MoveTo(bot->GetMapId(), rx, ry, z, false, false, false, false, MovementPriority::MOVEMENT_COMBAT); + } + + return false; } bool KarazhanAttumenTheHuntsmanStackBehindAction::isUseful() @@ -83,6 +88,9 @@ bool KarazhanMaidenOfVirtuePositionBossAction::Execute(Event event) float targetY = healer->GetPositionY() + sin(angle) * 6.0f; float targetZ = healer->GetPositionZ(); { + bot->AttackStop(); + bot->InterruptNonMeleeSpells(false); + return MoveTo(bot->GetMapId(), targetX, targetY, targetZ, false, false, false, true, MovementPriority::MOVEMENT_COMBAT); } @@ -98,6 +106,9 @@ bool KarazhanMaidenOfVirtuePositionBossAction::Execute(Event event) float mX = KARAZHAN_MAIDEN_OF_VIRTUE_BOSS_POSITION.GetPositionX() + (dX / distanceToBossPosition) * maxDistance; float mY = KARAZHAN_MAIDEN_OF_VIRTUE_BOSS_POSITION.GetPositionY() + (dY / distanceToBossPosition) * maxDistance; { + bot->AttackStop(); + bot->InterruptNonMeleeSpells(false); + return MoveTo(bot->GetMapId(), mX, mY, bot->GetPositionZ(), false, false, false, false, MovementPriority::MOVEMENT_COMBAT, true, false); } @@ -144,6 +155,9 @@ bool KarazhanMaidenOfVirtuePositionRangedAction::Execute(Event event) const float maxDistance = 2.0f; if (distance > maxDistance) { + bot->AttackStop(); + bot->InterruptNonMeleeSpells(false); + return MoveTo(bot->GetMapId(), KARAZHAN_MAIDEN_OF_VIRTUE_RANGED_POSITION[index].GetPositionX(), KARAZHAN_MAIDEN_OF_VIRTUE_RANGED_POSITION[index].GetPositionY(), bot->GetPositionZ(), false, false, false, false, MovementPriority::MOVEMENT_COMBAT, true, false); @@ -206,6 +220,9 @@ bool KarazhanBigBadWolfRunAwayAction::Execute(Event event) target = KARAZHAN_BIG_BAD_WOLF_RUN_POSITION[currentIndex]; } + bot->AttackStop(); + bot->InterruptNonMeleeSpells(false); + return MoveTo(bot->GetMapId(), target.GetPositionX(), target.GetPositionY(), target.GetPositionZ(), false, false, false, true, MovementPriority::MOVEMENT_FORCED); } @@ -326,6 +343,9 @@ bool KarazhanTheCuratorSpreadRangedAction::Execute(Event event) if (nearestPlayer) { + bot->AttackStop(); + bot->InterruptNonMeleeSpells(false); + return FleePosition(nearestPlayer->GetPosition(), minDistance); } @@ -368,11 +388,11 @@ bool KarazhanShadeOfAranArcaneExplosionRunAwayAction::Execute(Event event) const float safeDistance = 20.0f; const float distance = bot->GetDistance2d(boss); - bot->AttackStop(); - bot->InterruptNonMeleeSpells(false); - if (distance < safeDistance) { + bot->AttackStop(); + bot->InterruptNonMeleeSpells(false); + return MoveAway(boss, safeDistance - distance); } @@ -469,36 +489,27 @@ bool KarazhanNetherspiteBlockRedBeamAction::Execute(Event event) Unit* boss = AI_VALUE2(Unit*, "find target", "netherspite"); Unit* redPortal = bot->FindNearestCreature(NPC_RED_PORTAL, 150.0f); - Group* group = bot->GetGroup(); - if (!group) - { - return false; - } - - Player* eligibleTank = nullptr; - for (GroupReference* itr = group->GetFirstMember(); itr != nullptr; itr = itr->next()) - { - Player* member = itr->GetSource(); - if (!member || !member->IsAlive() || !botAI->IsTank(member) || !GET_PLAYERBOT_AI(member) || - member->HasAura(SPELL_NETHER_EXHAUSTION_RED)) - { - continue; - } - eligibleTank = member; - break; - } RaidKarazhanHelpers karazhanHelper(botAI); + static std::map wasBlockingRedBeam; + ObjectGuid botGuid = bot->GetGUID(); + auto [redBlocker, greenBlocker, blueBlocker] = karazhanHelper.GetCurrentBeamBlockers(); + bool isBlockingNow = (bot == redBlocker); + bool wasBlocking = wasBlockingRedBeam[botGuid]; + Position beamPos = karazhanHelper.GetPositionOnBeam(boss, redPortal, 18.0f); - if (bot == eligibleTank) + if (isBlockingNow) { - std::map ph; - ph["%player"] = bot->GetName(); - std::string text = sPlayerbotTextMgr->GetBotTextOrDefault( - "netherspite_beam_blocking_red", "%player is moving to block the red beam!", ph); - bot->Yell(text, LANG_UNIVERSAL); + if (!wasBlocking) + { + std::map ph; + ph["%player"] = bot->GetName(); + std::string text = sPlayerbotTextMgr->GetBotTextOrDefault( + "netherspite_beam_blocking_red", "%player is moving to block the red beam!", ph); + bot->Yell(text, LANG_UNIVERSAL); + } + wasBlockingRedBeam[botGuid] = true; - ObjectGuid botGuid = bot->GetGUID(); uint32 intervalSecs = 5; if (beamMoveTimes[botGuid] == 0) @@ -516,7 +527,6 @@ bool KarazhanNetherspiteBlockRedBeamAction::Execute(Event event) return MoveTo(bot->GetMapId(), beamPos.GetPositionX(), beamPos.GetPositionY(), beamPos.GetPositionZ(), false, false, false, true, MovementPriority::MOVEMENT_FORCED); } - else { float bx = boss->GetPositionX(); @@ -544,6 +554,7 @@ bool KarazhanNetherspiteBlockRedBeamAction::Execute(Event event) } } + wasBlockingRedBeam[botGuid] = false; return false; } @@ -556,11 +567,6 @@ bool KarazhanNetherspiteBlockRedBeamAction::isUseful() static std::map lastBossBanishState; bool bossIsBanished = boss && boss->HasAura(SPELL_NETHERSPITE_BANISHED); - if (!boss || !redPortal || bossIsBanished) - { - return false; - } - if (lastBossBanishState[botGuid] != bossIsBanished) { if (!bossIsBanished) @@ -571,10 +577,10 @@ bool KarazhanNetherspiteBlockRedBeamAction::isUseful() lastBossBanishState[botGuid] = bossIsBanished; } - return true; + return boss && redPortal && !bossIsBanished; } -// Two non-Rogue/Warrior DPS bots will block the blue beam for each phase (swap at 25 debuff stacks) +// Two non-Rogue/Warrior DPS bots will block the blue beam for each phase (swap at 26 debuff stacks) // When avoiding void zones, blocking bots will move along the beam to continue blocking bool KarazhanNetherspiteBlockBlueBeamAction::Execute(Event event) { @@ -582,11 +588,10 @@ bool KarazhanNetherspiteBlockBlueBeamAction::Execute(Event event) Unit* bluePortal = bot->FindNearestCreature(NPC_BLUE_PORTAL, 150.0f); RaidKarazhanHelpers karazhanHelper(botAI); - std::vector blueBlockers = karazhanHelper.GetBlueBlockers(); static std::map wasBlockingBlueBeam; ObjectGuid botGuid = bot->GetGUID(); - Player* assignedBlueBlocker = blueBlockers.empty() ? nullptr : blueBlockers.front(); - bool isBlockingNow = (bot == assignedBlueBlocker); + auto [redBlocker, greenBlocker, blueBlocker] = karazhanHelper.GetCurrentBeamBlockers(); + bool isBlockingNow = (bot == blueBlocker); bool wasBlocking = wasBlockingBlueBeam[botGuid]; if (wasBlocking && !isBlockingNow) @@ -596,8 +601,8 @@ bool KarazhanNetherspiteBlockBlueBeamAction::Execute(Event event) std::string text = sPlayerbotTextMgr->GetBotTextOrDefault( "netherspite_beam_leaving_blue", "%player is leaving the blue beam--next blocker up!", ph); bot->Yell(text, LANG_UNIVERSAL); - wasBlockingBlueBeam[botGuid] = false; + return false; } @@ -632,7 +637,7 @@ bool KarazhanNetherspiteBlockBlueBeamAction::Execute(Event event) float bestDist = 150.0f; Position bestPos; bool found = false; - for (float dist = 18.0f; dist <= 25.0f; dist += 0.5f) + for (float dist = 18.0f; dist <= 30.0f; dist += 0.5f) { float candidateX = bx + dx * dist; float candidateY = by + dy * dist; @@ -662,6 +667,9 @@ bool KarazhanNetherspiteBlockBlueBeamAction::Execute(Event event) } if (found) { + bot->AttackStop(); + bot->InterruptNonMeleeSpells(false); + return MoveTo(bot->GetMapId(), bestPos.GetPositionX(), bestPos.GetPositionY(), bestPos.GetPositionZ(), false, false, false, true, MovementPriority::MOVEMENT_FORCED); } @@ -681,7 +689,7 @@ bool KarazhanNetherspiteBlockBlueBeamAction::isUseful() return boss && bluePortal && !boss->HasAura(SPELL_NETHERSPITE_BANISHED); } -// Two healer bots will block the green beam for each phase (swap at 25 debuff stacks) +// Two healer bots will block the green beam for each phase (swap at 26 debuff stacks) // OR one rogue or DPS warrior bot will block the green beam for an entire phase (if they begin the phase as the blocker) // When avoiding void zones, blocking bots will move along the beam to continue blocking bool KarazhanNetherspiteBlockGreenBeamAction::Execute(Event event) @@ -690,11 +698,10 @@ bool KarazhanNetherspiteBlockGreenBeamAction::Execute(Event event) Unit* greenPortal = bot->FindNearestCreature(NPC_GREEN_PORTAL, 150.0f); RaidKarazhanHelpers karazhanHelper(botAI); - std::vector greenBlockers = karazhanHelper.GetGreenBlockers(); static std::map wasBlockingGreenBeam; ObjectGuid botGuid = bot->GetGUID(); - Player* assignedGreenBlocker = greenBlockers.empty() ? nullptr : greenBlockers.front(); - bool isBlockingNow = (bot == assignedGreenBlocker); + auto [redBlocker, greenBlocker, blueBlocker] = karazhanHelper.GetCurrentBeamBlockers(); + bool isBlockingNow = (bot == greenBlocker); bool wasBlocking = wasBlockingGreenBeam[botGuid]; if (wasBlocking && !isBlockingNow) @@ -704,8 +711,8 @@ bool KarazhanNetherspiteBlockGreenBeamAction::Execute(Event event) std::string text = sPlayerbotTextMgr->GetBotTextOrDefault( "netherspite_beam_leaving_green", "%player is leaving the green beam--next blocker up!", ph); bot->Yell(text, LANG_UNIVERSAL); - wasBlockingGreenBeam[botGuid] = false; + return false; } @@ -740,7 +747,7 @@ bool KarazhanNetherspiteBlockGreenBeamAction::Execute(Event event) float bestDist = 150.0f; Position bestPos; bool found = false; - for (float dist = 18.0f; dist <= 25.0f; dist += 0.5f) + for (float dist = 18.0f; dist <= 30.0f; dist += 0.5f) { float candidateX = bx + dx * dist; float candidateY = by + dy * dist; @@ -770,6 +777,9 @@ bool KarazhanNetherspiteBlockGreenBeamAction::Execute(Event event) } if (found) { + bot->AttackStop(); + bot->InterruptNonMeleeSpells(false); + return MoveTo(bot->GetMapId(), bestPos.GetPositionX(), bestPos.GetPositionY(), bestPos.GetPositionZ(), false, false, false, true, MovementPriority::MOVEMENT_FORCED); } @@ -796,7 +806,6 @@ bool KarazhanNetherspiteAvoidBeamAndVoidZoneAction::Execute(Event event) RaidKarazhanHelpers karazhanHelper(botAI); auto [redBlocker, greenBlocker, blueBlocker] = karazhanHelper.GetCurrentBeamBlockers(); std::vector voidZones = karazhanHelper.GetAllVoidZones(); - bool nearVoidZone = false; for (Unit* vz : voidZones) { @@ -806,7 +815,6 @@ bool KarazhanNetherspiteAvoidBeamAndVoidZoneAction::Execute(Event event) break; } } - struct BeamAvoid { Unit* portal; float minDist, maxDist; }; std::vector beams; Unit* redPortal = bot->FindNearestCreature(NPC_RED_PORTAL, 150.0f); @@ -863,14 +871,14 @@ bool KarazhanNetherspiteAvoidBeamAndVoidZoneAction::Execute(Event event) return false; } - const float minMoveDist = 3.0f, maxSearchDist = 20.0f, stepAngle = M_PI/18.0f, stepDist = 0.5f; + const float minMoveDist = 2.0f, maxSearchDist = 30.0f, stepAngle = M_PI/18.0f, stepDist = 0.5f; float bossZ = boss->GetPositionZ(); Position bestCandidate; float bestDist = 0.0f; bool found = false; for (float angle = 0; angle < 2 * M_PI; angle += stepAngle) { - for (float dist = 5.0f; dist <= maxSearchDist; dist += stepDist) + for (float dist = 2.0f; dist <= maxSearchDist; dist += stepDist) { float cx = bot->GetPositionX() + cos(angle) * dist; float cy = bot->GetPositionY() + sin(angle) * dist; @@ -922,9 +930,13 @@ bool KarazhanNetherspiteAvoidBeamAndVoidZoneAction::Execute(Event event) bestCandidate.GetPositionY(), bestCandidate.GetPositionZ(), voidZones, 4.0f)) { + bot->AttackStop(); + bot->InterruptNonMeleeSpells(false); + return MoveTo(bot->GetMapId(), bestCandidate.GetPositionX(), bestCandidate.GetPositionY(), bestCandidate.GetPositionZ(), false, false, false, true, MovementPriority::MOVEMENT_COMBAT); } + return false; } @@ -989,9 +1001,9 @@ bool KarazhanPrinceMalchezaarNonTankAvoidHazardAction::Execute(Event event) RaidKarazhanHelpers karazhanHelper(botAI); std::vector infernals = karazhanHelper.GetSpawnedInfernals(); - const float minSafeBossDistance = 35.0f; - const float maxSafeBossDistance = 40.0f; - const float safeInfernalDistance = 22.0f; + const float minSafeBossDistance = 34.0f; + const float maxSafeBossDistance = 60.0f; + const float safeInfernalDistance = 23.0f; const float stepSize = 0.5f; const int numAngles = 64; float bx = bot->GetPositionX(); @@ -1016,19 +1028,25 @@ bool KarazhanPrinceMalchezaarNonTankAvoidHazardAction::Execute(Event event) float x = bossX + dx * dist; float y = bossY + dy * dist; float destZ = bossZ; - if (!bot->IsWithinLOS(x, y, destZ)) + float destX = x, destY = y, destZ2 = destZ; + if (!bot->GetMap()->CheckCollisionAndGetValidCoords(bot, bx, by, bz, destX, destY, destZ2, true)) { continue; } - bool pathSafe = karazhanHelper.IsStraightPathSafe(Position(bx, by, bz), Position(x, y, destZ), + float distFromBoss = sqrt(pow(destX - bossX, 2) + pow(destY - bossY, 2)); + if (distFromBoss < minSafeBossDistance) + { + continue; + } + bool pathSafe = karazhanHelper.IsStraightPathSafe(Position(bx, by, bz), Position(destX, destY, destZ2), infernals, safeInfernalDistance, stepSize); - float moveDist = sqrt(pow(x - bx, 2) + pow(y - by, 2)); + float moveDist = sqrt(pow(destX - bx, 2) + pow(destY - by, 2)); if (pathSafe && moveDist < bestMoveDist) { bestMoveDist = moveDist; - bestDestX = x; - bestDestY = y; - bestDestZ = destZ; + bestDestX = destX; + bestDestY = destY; + bestDestZ = destZ2; found = true; } } @@ -1062,64 +1080,42 @@ bool KarazhanPrinceMalchezaarNonTankAvoidHazardAction::Execute(Event event) float bestMoveDist = std::numeric_limits::max(); float bestDestX = bx, bestDestY = by, bestDestZ = bz; bool found = false; - bool usedArc = false; for (int i = 0; i < numAngles; ++i) { float angle = (2 * M_PI * i) / numAngles; float dx = cos(angle); float dy = sin(angle); - for (float dist = stepSize; dist <= 35.0f; dist += stepSize) + for (float dist = stepSize; dist <= maxSafeBossDistance; dist += stepSize) { float x = bossX + dx * dist; float y = bossY + dy * dist; float destZ = bossZ; - if (!bot->IsWithinLOS(x, y, destZ)) + float destX = x, destY = y, destZ2 = destZ; + if (!bot->GetMap()->CheckCollisionAndGetValidCoords(bot, bossX, bossY, bossZ, destX, destY, destZ2, true)) { continue; } - bool pathSafe = karazhanHelper.IsStraightPathSafe(Position(bx, by, bz), Position(x, y, destZ), - infernals, safeInfernalDistance, stepSize); - float moveDist = sqrt(pow(x - bx, 2) + pow(y - by, 2)); - if (pathSafe && moveDist < bestMoveDist) - { - bestMoveDist = moveDist; - bestDestX = x; - bestDestY = y; - bestDestZ = destZ; - found = true; - usedArc = false; - } - if (!pathSafe) + bool destSafe = true; + for (Unit* infernal : infernals) { - Position arcPoint = karazhanHelper.CalculateArcPoint(Position(bx, by, bz), Position(x, y, destZ), - Position(bossX, bossY, bossZ)); - if (!bot->IsWithinLOS(arcPoint.GetPositionX(), arcPoint.GetPositionY(), arcPoint.GetPositionZ())) - { - continue; - } - bool arcSafe = true; - for (Unit* infernal : infernals) - { - float infernalDist = sqrt(pow(arcPoint.GetPositionX() - infernal->GetPositionX(), 2) + - pow(arcPoint.GetPositionY() - infernal->GetPositionY(), 2)); - if (infernalDist < safeInfernalDistance) - { - arcSafe = false; - break; - } - } - float arcMoveDist = sqrt(pow(arcPoint.GetPositionX() - bx, 2) + - pow(arcPoint.GetPositionY() - by, 2)); - if (arcSafe && arcMoveDist < bestMoveDist) + float infernalDist = sqrt(pow(destX - infernal->GetPositionX(), 2) + pow(destY - infernal->GetPositionY(), 2)); + if (infernalDist < safeInfernalDistance) { - bestMoveDist = arcMoveDist; - bestDestX = arcPoint.GetPositionX(); - bestDestY = arcPoint.GetPositionY(); - bestDestZ = arcPoint.GetPositionZ(); - found = true; - usedArc = true; + destSafe = false; + break; } } + if (!destSafe) + continue; + float moveDist = sqrt(pow(destX - bx, 2) + pow(destY - by, 2)); + if (moveDist < bestMoveDist) + { + bestMoveDist = moveDist; + bestDestX = destX; + bestDestY = destY; + bestDestZ = destZ2; + found = true; + } } } if (found) @@ -1149,17 +1145,13 @@ bool KarazhanPrinceMalchezaarTankAvoidHazardAction::Execute(Event event) RaidKarazhanHelpers karazhanHelper(botAI); std::vector infernals = karazhanHelper.GetSpawnedInfernals(); - const float safeInfernalDistance = 30.0f; + const float safeInfernalDistance = 28.0f; const float stepSize = 0.5f; const int numAngles = 64; const float maxSampleDist = 60.0f; float bx = bot->GetPositionX(); float by = bot->GetPositionY(); float bz = bot->GetPositionZ(); - float bestMoveDist = std::numeric_limits::max(); - float bestDestX = bx, bestDestY = by, bestDestZ = bz; - bool found = false; - bool usedArc = false; bool nearInfernal = false; for (Unit* infernal : infernals) @@ -1172,6 +1164,10 @@ bool KarazhanPrinceMalchezaarTankAvoidHazardAction::Execute(Event event) } } + float bestMoveDist = std::numeric_limits::max(); + float bestDestX = bx, bestDestY = by, bestDestZ = bz; + bool found = false; + if (nearInfernal) { for (int i = 0; i < numAngles; ++i) @@ -1184,54 +1180,72 @@ bool KarazhanPrinceMalchezaarTankAvoidHazardAction::Execute(Event event) float x = bx + dx * dist; float y = by + dy * dist; float z = bz; - if (!bot->IsWithinLOS(x, y, z)) - { + + float destX = x, destY = y, destZ = z; + if (!bot->GetMap()->CheckCollisionAndGetValidCoords(bot, bx, by, bz, destX, destY, destZ, true)) continue; + + bool destSafe = true; + for (Unit* infernal : infernals) + { + float infernalDist = sqrt(pow(destX - infernal->GetPositionX(), 2) + pow(destY - infernal->GetPositionY(), 2)); + if (infernalDist < safeInfernalDistance) + { + destSafe = false; + break; + } } - bool safe = karazhanHelper.IsStraightPathSafe(Position(bx, by, bz), Position(x, y, z), - infernals, safeInfernalDistance, stepSize); - float moveDist = sqrt(pow(x - bx, 2) + pow(y - by, 2)); - if (safe && moveDist < bestMoveDist) + if (!destSafe) + continue; + + bool pathSafe = karazhanHelper.IsStraightPathSafe(Position(bx, by, bz), Position(destX, destY, destZ), + infernals, safeInfernalDistance, stepSize); + float moveDist = sqrt(pow(destX - bx, 2) + pow(destY - by, 2)); + if (pathSafe && moveDist < bestMoveDist) { bestMoveDist = moveDist; - bestDestX = x; - bestDestY = y; - bestDestZ = z; + bestDestX = destX; + bestDestY = destY; + bestDestZ = destZ; found = true; - usedArc = false; } - if (!safe) + } + } + if (!found) + { + for (int i = 0; i < numAngles; ++i) + { + float angle = (2 * M_PI * i) / numAngles; + float dx = cos(angle); + float dy = sin(angle); + for (float dist = stepSize; dist <= maxSampleDist; dist += stepSize) { - Position arcPoint = karazhanHelper.CalculateArcPoint(Position(bx, by, bz), Position(x, y, z), - Position(bx, by, bz)); - float arcX = arcPoint.GetPositionX(); - float arcY = arcPoint.GetPositionY(); - float arcZ = arcPoint.GetPositionZ(); - float arcDestX = arcX, arcDestY = arcY, arcDestZ = arcZ; - if (!bot->GetMap()->CheckCollisionAndGetValidCoords(bot, bx, by, bz, arcDestX, arcDestY, arcDestZ)) - { + float x = bx + dx * dist; + float y = by + dy * dist; + float z = bz; + + float destX = x, destY = y, destZ = z; + if (!bot->GetMap()->CheckCollisionAndGetValidCoords(bot, bx, by, bz, destX, destY, destZ, true)) continue; - } - bool arcSafe = true; + + bool destSafe = true; for (Unit* infernal : infernals) { - float infernalDist = sqrt(pow(arcPoint.GetPositionX() - infernal->GetPositionX(), 2) + - pow(arcPoint.GetPositionY() - infernal->GetPositionY(), 2)); + float infernalDist = sqrt(pow(destX - infernal->GetPositionX(), 2) + pow(destY - infernal->GetPositionY(), 2)); if (infernalDist < safeInfernalDistance) { - arcSafe = false; + destSafe = false; break; } } - float arcMoveDist = sqrt(pow(arcPoint.GetPositionX() - bx, 2) + pow(arcPoint.GetPositionY() - by, 2)); - if (arcSafe && arcMoveDist < bestMoveDist) + float moveDist = sqrt(pow(destX - bx, 2) + pow(destY - by, 2)); + if (destSafe && moveDist < bestMoveDist) { - bestMoveDist = arcMoveDist; - bestDestX = arcPoint.GetPositionX(); - bestDestY = arcPoint.GetPositionY(); - bestDestZ = arcPoint.GetPositionZ(); + bestMoveDist = moveDist; + bestDestX = destX; + bestDestY = destY; + bestDestZ = destZ; found = true; - usedArc = true; } } } @@ -1240,12 +1254,12 @@ bool KarazhanPrinceMalchezaarTankAvoidHazardAction::Execute(Event event) { bot->AttackStop(); bot->InterruptNonMeleeSpells(false); - + return MoveTo(bot->GetMapId(), bestDestX, bestDestY, bestDestZ, false, false, false, true, MovementPriority::MOVEMENT_COMBAT); } } - + return false; } diff --git a/src/strategy/raids/karazhan/RaidKarazhanHelpers.cpp b/src/strategy/raids/karazhan/RaidKarazhanHelpers.cpp index 19dd0b3363..b4d6d5dfb8 100644 --- a/src/strategy/raids/karazhan/RaidKarazhanHelpers.cpp +++ b/src/strategy/raids/karazhan/RaidKarazhanHelpers.cpp @@ -132,7 +132,28 @@ bool RaidKarazhanHelpers::IsFlameWreathActive() return false; } -// Blue beam blockers: non-Rogue/Warrior DPS bots, no Nether Exhaustion Blue and <25 stacks of Blue Beam debuff +// Red beam blockers: tank bots, no Nether Exhaustion Red +std::vector RaidKarazhanHelpers::GetRedBlockers() +{ + std::vector redBlockers; + if (Group* group = bot->GetGroup()) + { + for (GroupReference* itr = group->GetFirstMember(); itr != nullptr; itr = itr->next()) + { + Player* member = itr->GetSource(); + if (!member || !member->IsAlive() || !botAI->IsTank(member) || !GET_PLAYERBOT_AI(member) || + member->HasAura(SPELL_NETHER_EXHAUSTION_RED)) + { + continue; + } + redBlockers.push_back(member); + } + } + + return redBlockers; +} + +// Blue beam blockers: non-Rogue/Warrior DPS bots, no Nether Exhaustion Blue and ≤25 stacks of Blue Beam debuff std::vector RaidKarazhanHelpers::GetBlueBlockers() { std::vector blueBlockers; @@ -150,7 +171,7 @@ std::vector RaidKarazhanHelpers::GetBlueBlockers() bool isRogue = member->getClass() == CLASS_ROGUE; bool hasExhaustion = member->HasAura(SPELL_NETHER_EXHAUSTION_BLUE); Aura* blueBuff = member->GetAura(SPELL_BLUE_BEAM_DEBUFF); - bool overStack = blueBuff && blueBuff->GetStackAmount() >= 25; + bool overStack = blueBuff && blueBuff->GetStackAmount() >= 26; if (isDps && !isWarrior && !isRogue && !hasExhaustion && !overStack) { blueBlockers.push_back(member); @@ -163,7 +184,7 @@ std::vector RaidKarazhanHelpers::GetBlueBlockers() // Green beam blockers: // (1) Rogue and non-tank Warrior bots, no Nether Exhaustion Green -// (2) Healer bots, no Nether Exhaustion Green and <25 stacks of Green Beam debuff +// (2) Healer bots, no Nether Exhaustion Green and ≤25 stacks of Green Beam debuff std::vector RaidKarazhanHelpers::GetGreenBlockers() { std::vector greenBlockers; @@ -178,7 +199,7 @@ std::vector RaidKarazhanHelpers::GetGreenBlockers() } bool hasExhaustion = member->HasAura(SPELL_NETHER_EXHAUSTION_GREEN); Aura* greenBuff = member->GetAura(SPELL_GREEN_BEAM_DEBUFF); - bool overStack = greenBuff && greenBuff->GetStackAmount() >= 25; + bool overStack = greenBuff && greenBuff->GetStackAmount() >= 26; bool isRogue = member->getClass() == CLASS_ROGUE; bool isDpsWarrior = member->getClass() == CLASS_WARRIOR && botAI->IsDps(member); bool eligibleRogueWarrior = (isRogue || isDpsWarrior) && !hasExhaustion; @@ -221,47 +242,91 @@ Position RaidKarazhanHelpers::GetPositionOnBeam(Unit* boss, Unit* portal, float std::tuple RaidKarazhanHelpers::GetCurrentBeamBlockers() { + static ObjectGuid currentRedBlocker; + static ObjectGuid currentGreenBlocker; + static ObjectGuid currentBlueBlocker; + Player* redBlocker = nullptr; Player* greenBlocker = nullptr; Player* blueBlocker = nullptr; - std::vector redBlockers; - if (Group* group = bot->GetGroup()) + std::vector redBlockers = GetRedBlockers(); + if (!redBlockers.empty()) { - for (GroupReference* itr = group->GetFirstMember(); itr != nullptr; itr = itr->next()) + auto it = std::find_if(redBlockers.begin(), redBlockers.end(), [](Player* p) { - Player* member = itr->GetSource(); - if (!member || !member->IsAlive() || !botAI->IsTank(member) || !GET_PLAYERBOT_AI(member) || - member->HasAura(SPELL_NETHER_EXHAUSTION_RED)) - { - continue; - } - redBlockers.push_back(member); + return p && p->GetGUID() == currentRedBlocker; + }); + if (it != redBlockers.end()) + { + redBlocker = *it; + } + else + { + redBlocker = redBlockers.front(); } + currentRedBlocker = redBlocker ? redBlocker->GetGUID() : ObjectGuid::Empty; } - if (!redBlockers.empty()) + else { - redBlocker = redBlockers.front(); + currentRedBlocker = ObjectGuid::Empty; + redBlocker = nullptr; } + std::vector greenBlockers = GetGreenBlockers(); if (!greenBlockers.empty()) { - greenBlocker = greenBlockers.front(); + auto it = std::find_if(greenBlockers.begin(), greenBlockers.end(), [](Player* p) + { + return p && p->GetGUID() == currentGreenBlocker; + }); + if (it != greenBlockers.end()) + { + greenBlocker = *it; + } + else + { + greenBlocker = greenBlockers.front(); + } + currentGreenBlocker = greenBlocker ? greenBlocker->GetGUID() : ObjectGuid::Empty; } - std::vector blueBlockers = GetBlueBlockers(); - if (!blueBlockers.empty()) + else { - blueBlocker = blueBlockers.front(); + currentGreenBlocker = ObjectGuid::Empty; + greenBlocker = nullptr; } + std::vector blueBlockers = GetBlueBlockers(); + if (!blueBlockers.empty()) + { + auto it = std::find_if(blueBlockers.begin(), blueBlockers.end(), [](Player* p) + { + return p && p->GetGUID() == currentBlueBlocker; + }); + if (it != blueBlockers.end()) + { + blueBlocker = *it; + } + else + { + blueBlocker = blueBlockers.front(); + } + currentBlueBlocker = blueBlocker ? blueBlocker->GetGUID() : ObjectGuid::Empty; + } + else + { + currentBlueBlocker = ObjectGuid::Empty; + blueBlocker = nullptr; + } + return std::make_tuple(redBlocker, greenBlocker, blueBlocker); } std::vector RaidKarazhanHelpers::GetAllVoidZones() { std::vector voidZones; - const float radius = 15.0f; - const GuidVector npcs = botAI->GetAiObjectContext()->GetValue("nearest hostile npcs")->Get(); + const float radius = 30.0f; + const GuidVector npcs = botAI->GetAiObjectContext()->GetValue("nearest npcs")->Get(); for (const auto& npcGuid : npcs) { Unit* unit = botAI->GetUnit(npcGuid); @@ -280,7 +345,7 @@ std::vector RaidKarazhanHelpers::GetAllVoidZones() } bool RaidKarazhanHelpers::IsSafePosition(float x, float y, float z, - const std::vector& hazards, float hazardRadius) + const std::vector& hazards, float hazardRadius) { for (Unit* hazard : hazards) { @@ -297,7 +362,7 @@ bool RaidKarazhanHelpers::IsSafePosition(float x, float y, float z, std::vector RaidKarazhanHelpers::GetSpawnedInfernals() const { std::vector infernals; - const GuidVector npcs = botAI->GetAiObjectContext()->GetValue("nearest hostile npcs")->Get(); + const GuidVector npcs = botAI->GetAiObjectContext()->GetValue("nearest npcs")->Get(); for (const auto& npcGuid : npcs) { Unit* unit = botAI->GetUnit(npcGuid); @@ -342,44 +407,3 @@ bool RaidKarazhanHelpers::IsStraightPathSafe(const Position& start, const Positi return true; } - -Position RaidKarazhanHelpers::CalculateArcPoint(const Position& current, const Position& target, const Position& center) -{ - float arcFraction = 0.25f; - float currentX = current.GetPositionX() - center.GetPositionX(); - float currentY = current.GetPositionY() - center.GetPositionY(); - float targetX = target.GetPositionX() - center.GetPositionX(); - float targetY = target.GetPositionY() - center.GetPositionY(); - - float currentDist = std::sqrt(currentX * currentX + currentY * currentY); - float targetDist = std::sqrt(targetX * targetX + targetY * targetY); - if (currentDist == 0.0f || targetDist == 0.0f) - { - return current; - } - - currentX /= currentDist; - currentY /= currentDist; - targetX /= targetDist; - targetY /= targetDist; - - float dotProduct = currentX * targetX + currentY * targetY; - dotProduct = std::max(-1.0f, std::min(1.0f, dotProduct)); - float angle = std::acos(dotProduct); - float crossProduct = currentX * targetY - currentY * targetX; - float stepAngle = angle * arcFraction; - if (crossProduct < 0) - { - stepAngle = -stepAngle; - } - - float cos_a = std::cos(stepAngle); - float sin_a = std::sin(stepAngle); - float rotatedX = currentX * cos_a - currentY * sin_a; - float rotatedY = currentX * sin_a + currentY * cos_a; - float desiredDist = currentDist * 0.9f + targetDist * 0.1f; - - return Position(center.GetPositionX() + rotatedX * desiredDist, - center.GetPositionY() + rotatedY * desiredDist, - current.GetPositionZ()); -} diff --git a/src/strategy/raids/karazhan/RaidKarazhanHelpers.h b/src/strategy/raids/karazhan/RaidKarazhanHelpers.h index 2746b09da9..89d06a950b 100644 --- a/src/strategy/raids/karazhan/RaidKarazhanHelpers.h +++ b/src/strategy/raids/karazhan/RaidKarazhanHelpers.h @@ -70,6 +70,7 @@ class RaidKarazhanHelpers : public AiObject Unit* GetNearestPlayerInRadius(float /*radius*/ = 5.0f); bool IsFlameWreathActive(); Position GetPositionOnBeam(Unit* boss, Unit* portal, float distanceFromBoss); + std::vector GetRedBlockers(); std::vector GetBlueBlockers(); std::vector GetGreenBlockers(); std::tuple GetCurrentBeamBlockers(); @@ -79,7 +80,6 @@ class RaidKarazhanHelpers : public AiObject std::vector GetSpawnedInfernals() const; bool IsStraightPathSafe(const Position& start, const Position& target, const std::vector& hazards, float hazardRadius, float stepSize); - Position CalculateArcPoint(const Position& current, const Position& target, const Position& center); }; #endif diff --git a/src/strategy/raids/karazhan/RaidKarazhanMultipliers.cpp b/src/strategy/raids/karazhan/RaidKarazhanMultipliers.cpp index 01c1c179a7..ac23560338 100644 --- a/src/strategy/raids/karazhan/RaidKarazhanMultipliers.cpp +++ b/src/strategy/raids/karazhan/RaidKarazhanMultipliers.cpp @@ -5,6 +5,7 @@ #include "AttackAction.h" #include "DruidBearActions.h" #include "DruidCatActions.h" +#include "RogueActions.h" #include "WarriorActions.h" static bool IsChargeAction(Action* action) @@ -15,6 +16,20 @@ static bool IsChargeAction(Action* action) dynamic_cast(action); } +float KarazhanAttumenTheHuntsmanMultiplier::GetValue(Action* action) +{ + RaidKarazhanHelpers karazhanHelper(botAI); + Unit* boss = karazhanHelper.GetFirstAliveUnitByEntry(NPC_ATTUMEN_THE_HUNTSMAN_MOUNTED); + if (boss && !(botAI->IsTank(bot) && botAI->HasAggro(boss) && boss->GetVictim() == bot) && + (dynamic_cast(action) && + !dynamic_cast(action))) + { + return 0.0f; + } + + return 1.0f; +} + float KarazhanBigBadWolfMultiplier::GetValue(Action* action) { Unit* boss = AI_VALUE2(Unit*, "find target", "the big bad wolf"); @@ -61,7 +76,6 @@ float KarazhanShadeOfAranMultiplier::GetValue(Action* action) } bool flameWreathActive = boss->HasAura(SPELL_FLAME_WREATH); - if (!flameWreathActive && bot->GetGroup()) { for (GroupReference* itr = bot->GetGroup()->GetFirstMember(); itr != nullptr; itr = itr->next()) @@ -74,7 +88,6 @@ float KarazhanShadeOfAranMultiplier::GetValue(Action* action) } } } - if (flameWreathActive) { if (dynamic_cast(action) || IsChargeAction(action)) @@ -94,6 +107,11 @@ float KarazhanNetherspiteBlueAndGreenBeamMultiplier::GetValue(Action* action) return 1.0f; } + if (dynamic_cast(action) || dynamic_cast(action)) + { + return 0.0f; + } + RaidKarazhanHelpers karazhanHelper(botAI); auto [redBlocker /*unused*/, greenBlocker, blueBlocker] = karazhanHelper.GetCurrentBeamBlockers(); bool isBlocker = (bot == greenBlocker || bot == blueBlocker); @@ -101,9 +119,9 @@ float KarazhanNetherspiteBlueAndGreenBeamMultiplier::GetValue(Action* action) { Unit* bluePortal = bot->FindNearestCreature(NPC_BLUE_PORTAL, 150.0f); Unit* greenPortal = bot->FindNearestCreature(NPC_GREEN_PORTAL, 150.0f); - bool inBeam = false; - for (Unit* portal : {bluePortal, greenPortal}) { + for (Unit* portal : {bluePortal, greenPortal}) + { if (!portal) { continue; @@ -121,18 +139,18 @@ float KarazhanNetherspiteBlueAndGreenBeamMultiplier::GetValue(Action* action) float t = (botdx * dx + botdy * dy); float beamX = bx + dx * t, beamY = by + dy * t; float distToBeam = sqrt(pow(bot->GetPositionX() - beamX, 2) + pow(bot->GetPositionY() - beamY, 2)); - if (distToBeam < 5.0f && t > 0.0f && t < length) + if (distToBeam < 0.3f && t > 0.0f && t < length) { inBeam = true; break; } } - if (inBeam) { std::vector voidZones = karazhanHelper.GetAllVoidZones(); bool inVoidZone = false; - for (Unit* vz : voidZones) { + for (Unit* vz : voidZones) + { if (bot->GetExactDist2d(vz) < 4.0f) { inVoidZone = true; @@ -160,9 +178,13 @@ float KarazhanNetherspiteRedBeamMultiplier::GetValue(Action* action) return 1.0f; } + if (dynamic_cast(action)) + { + return 0.0f; + } + RaidKarazhanHelpers karazhanHelper(botAI); auto [redBlocker, greenBlocker /*unused*/, blueBlocker /*unused*/] = karazhanHelper.GetCurrentBeamBlockers(); - static std::map beamMoveTimes; static std::map lastBeamMoveSideways; ObjectGuid botGuid = bot->GetGUID(); @@ -198,11 +220,9 @@ float KarazhanNetherspiteRedBeamMultiplier::GetValue(Action* action) lastBeamMoveSideways[botGuid] = !lastBeamMoveSideways[botGuid]; beamMoveTimes[botGuid] = time(nullptr); } - Position targetPos = lastBeamMoveSideways[botGuid] ? sidewaysPos : blockingPos; float distToTarget = bot->GetExactDist2d(targetPos.GetPositionX(), targetPos.GetPositionY()); const float positionTolerance = 1.5f; - if (distToTarget < positionTolerance) { if (dynamic_cast(action) || IsChargeAction(action)) @@ -219,12 +239,28 @@ float KarazhanNetherspiteRedBeamMultiplier::GetValue(Action* action) float KarazhanPrinceMalchezaarMultiplier::GetValue(Action* action) { Unit* boss = AI_VALUE2(Unit*, "find target", "prince malchezaar"); + if (!boss || !boss->IsAlive()) + { + return 1.0f; + } + + if (dynamic_cast(action)) + { + return 0.0f; + } - if (boss && botAI->IsMelee(bot) && bot->HasAura(SPELL_ENFEEBLE) && + if (botAI->IsMelee(bot) && bot->HasAura(SPELL_ENFEEBLE) && !dynamic_cast(action)) { return 0.0f; } + if (botAI->IsRanged(bot) && bot->HasAura(SPELL_ENFEEBLE) && + (dynamic_cast(action) && + !dynamic_cast(action))) + { + return 0.0f; + } + return 1.0f; } diff --git a/src/strategy/raids/karazhan/RaidKarazhanMultipliers.h b/src/strategy/raids/karazhan/RaidKarazhanMultipliers.h index d29aa027e3..c8a4ba3722 100644 --- a/src/strategy/raids/karazhan/RaidKarazhanMultipliers.h +++ b/src/strategy/raids/karazhan/RaidKarazhanMultipliers.h @@ -3,6 +3,13 @@ #include "Multiplier.h" +class KarazhanAttumenTheHuntsmanMultiplier : public Multiplier +{ +public: + KarazhanAttumenTheHuntsmanMultiplier(PlayerbotAI* botAI) : Multiplier(botAI, "karazhan attumen the huntsman multiplier") {} + virtual float GetValue(Action* action); +}; + class KarazhanBigBadWolfMultiplier : public Multiplier { public: From 01915ffa35f4f4e75fbc4a41ba38b901ece82ef5 Mon Sep 17 00:00:00 2001 From: avirar Date: Tue, 30 Sep 2025 23:17:45 +1000 Subject: [PATCH 078/151] Added null check to Queue::findHighestRelevanceBasket() (#1686) --- src/strategy/Queue.cpp | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/src/strategy/Queue.cpp b/src/strategy/Queue.cpp index b2c6e88d4c..af08dcc779 100644 --- a/src/strategy/Queue.cpp +++ b/src/strategy/Queue.cpp @@ -88,6 +88,11 @@ ActionBasket* Queue::findHighestRelevanceBasket() const for (ActionBasket* basket : actions) { + if (!basket) + { + continue; + } + if (basket->getRelevance() > maxRelevance) { maxRelevance = basket->getRelevance(); From 0cc15411c19c3235fdcfbf9c4fc9bd36b574c9a2 Mon Sep 17 00:00:00 2001 From: bash <31279994+hermensbas@users.noreply.github.com> Date: Tue, 30 Sep 2025 15:19:44 +0200 Subject: [PATCH 079/151] license update (#1674) --- src/AiFactory.cpp | 4 ++-- src/AiFactory.h | 4 ++-- src/ChatFilter.cpp | 4 ++-- src/ChatFilter.h | 4 ++-- src/ChatHelper.cpp | 4 ++-- src/ChatHelper.h | 4 ++-- src/FleeManager.cpp | 4 ++-- src/FleeManager.h | 4 ++-- src/GuildTaskMgr.cpp | 4 ++-- src/GuildTaskMgr.h | 4 ++-- src/Helpers.cpp | 4 ++-- src/Helpers.h | 4 ++-- src/LazyCalculatedValue.h | 4 ++-- src/LootObjectStack.cpp | 4 ++-- src/LootObjectStack.h | 4 ++-- src/PerformanceMonitor.cpp | 4 ++-- src/PerformanceMonitor.h | 4 ++-- src/PlaceholderHelper.cpp | 4 ++-- src/PlaceholderHelper.h | 4 ++-- src/PlayerbotAI.cpp | 4 ++-- src/PlayerbotAI.h | 4 ++-- src/PlayerbotAIAware.h | 4 ++-- src/PlayerbotAIBase.cpp | 4 ++-- src/PlayerbotAIBase.h | 4 ++-- src/PlayerbotAIConfig.cpp | 4 ++-- src/PlayerbotAIConfig.h | 4 ++-- src/PlayerbotCommandServer.cpp | 4 ++-- src/PlayerbotCommandServer.h | 4 ++-- src/PlayerbotDbStore.cpp | 4 ++-- src/PlayerbotDbStore.h | 4 ++-- src/PlayerbotDungeonSuggestionMgr.cpp | 4 ++-- src/PlayerbotDungeonSuggestionMgr.h | 4 ++-- src/PlayerbotMgr.cpp | 4 ++-- src/PlayerbotMgr.h | 4 ++-- src/PlayerbotSecurity.cpp | 4 ++-- src/PlayerbotSecurity.h | 4 ++-- src/PlayerbotTextMgr.cpp | 4 ++-- src/PlayerbotTextMgr.h | 4 ++-- src/Playerbots.h | 4 ++-- src/RandomItemMgr.cpp | 4 ++-- src/RandomItemMgr.h | 4 ++-- src/RandomPlayerbotFactory.cpp | 4 ++-- src/RandomPlayerbotFactory.h | 4 ++-- src/RandomPlayerbotMgr.cpp | 4 ++-- src/RandomPlayerbotMgr.h | 4 ++-- src/ServerFacade.cpp | 4 ++-- src/ServerFacade.h | 4 ++-- src/Talentspec.cpp | 4 ++-- src/Talentspec.h | 4 ++-- src/TravelMgr.cpp | 4 ++-- src/TravelMgr.h | 4 ++-- src/TravelNode.cpp | 4 ++-- src/TravelNode.h | 4 ++-- src/factory/PlayerbotFactory.cpp | 4 ++-- src/factory/PlayerbotFactory.h | 4 ++-- src/factory/StatsCollector.h | 4 ++-- src/factory/StatsWeightCalculator.cpp | 4 ++-- src/factory/StatsWeightCalculator.h | 4 ++-- src/strategy/Action.cpp | 4 ++-- src/strategy/Action.h | 4 ++-- src/strategy/AiObject.cpp | 4 ++-- src/strategy/AiObject.h | 4 ++-- src/strategy/AiObjectContext.cpp | 4 ++-- src/strategy/AiObjectContext.h | 4 ++-- src/strategy/CustomStrategy.cpp | 4 ++-- src/strategy/CustomStrategy.h | 4 ++-- src/strategy/Engine.cpp | 4 ++-- src/strategy/Engine.h | 4 ++-- src/strategy/Event.cpp | 4 ++-- src/strategy/Event.h | 4 ++-- src/strategy/ExternalEventHelper.cpp | 4 ++-- src/strategy/ExternalEventHelper.h | 4 ++-- src/strategy/ItemVisitors.cpp | 4 ++-- src/strategy/ItemVisitors.h | 4 ++-- src/strategy/Multiplier.h | 4 ++-- src/strategy/NamedObjectContext.cpp | 4 ++-- src/strategy/NamedObjectContext.h | 4 ++-- src/strategy/PassiveMultiplier.cpp | 4 ++-- src/strategy/PassiveMultiplier.h | 4 ++-- src/strategy/Queue.cpp | 4 ++-- src/strategy/Queue.h | 4 ++-- src/strategy/Strategy.cpp | 4 ++-- src/strategy/Strategy.h | 4 ++-- src/strategy/StrategyContext.h | 4 ++-- src/strategy/Trigger.cpp | 4 ++-- src/strategy/Trigger.h | 4 ++-- src/strategy/Value.cpp | 4 ++-- src/strategy/Value.h | 4 ++-- src/strategy/actions/AcceptBattlegroundInvitationAction.cpp | 4 ++-- src/strategy/actions/AcceptBattlegroundInvitationAction.h | 4 ++-- src/strategy/actions/AcceptDuelAction.cpp | 4 ++-- src/strategy/actions/AcceptDuelAction.h | 4 ++-- src/strategy/actions/AcceptInvitationAction.cpp | 4 ++-- src/strategy/actions/AcceptInvitationAction.h | 4 ++-- src/strategy/actions/AcceptQuestAction.cpp | 4 ++-- src/strategy/actions/AcceptQuestAction.h | 4 ++-- src/strategy/actions/AcceptResurrectAction.cpp | 4 ++-- src/strategy/actions/AcceptResurrectAction.h | 4 ++-- src/strategy/actions/ActionContext.h | 4 ++-- src/strategy/actions/AddLootAction.cpp | 4 ++-- src/strategy/actions/AddLootAction.h | 4 ++-- src/strategy/actions/AreaTriggerAction.cpp | 4 ++-- src/strategy/actions/AreaTriggerAction.h | 4 ++-- src/strategy/actions/ArenaTeamActions.cpp | 4 ++-- src/strategy/actions/ArenaTeamActions.h | 4 ++-- src/strategy/actions/AttackAction.cpp | 4 ++-- src/strategy/actions/AttackAction.h | 4 ++-- src/strategy/actions/AutoMaintenanceOnLevelupAction.h | 4 ++-- src/strategy/actions/BankAction.cpp | 4 ++-- src/strategy/actions/BankAction.h | 4 ++-- src/strategy/actions/BattleGroundJoinAction.cpp | 4 ++-- src/strategy/actions/BattleGroundJoinAction.h | 4 ++-- src/strategy/actions/BattleGroundTactics.cpp | 4 ++-- src/strategy/actions/BattleGroundTactics.h | 4 ++-- src/strategy/actions/BossAuraActions.cpp | 4 ++-- src/strategy/actions/BossAuraActions.h | 4 ++-- src/strategy/actions/BuffAction.cpp | 4 ++-- src/strategy/actions/BuffAction.h | 4 ++-- src/strategy/actions/BuyAction.cpp | 4 ++-- src/strategy/actions/BuyAction.h | 4 ++-- src/strategy/actions/CancelChannelAction.cpp | 4 ++-- src/strategy/actions/CancelChannelAction.h | 4 ++-- src/strategy/actions/CastCustomSpellAction.cpp | 4 ++-- src/strategy/actions/CastCustomSpellAction.h | 4 ++-- src/strategy/actions/ChangeChatAction.cpp | 4 ++-- src/strategy/actions/ChangeChatAction.h | 4 ++-- src/strategy/actions/ChangeStrategyAction.cpp | 4 ++-- src/strategy/actions/ChangeStrategyAction.h | 4 ++-- src/strategy/actions/ChangeTalentsAction.cpp | 4 ++-- src/strategy/actions/ChangeTalentsAction.h | 4 ++-- src/strategy/actions/ChatActionContext.h | 4 ++-- src/strategy/actions/ChatShortcutActions.cpp | 4 ++-- src/strategy/actions/ChatShortcutActions.h | 4 ++-- src/strategy/actions/CheatAction.cpp | 4 ++-- src/strategy/actions/CheatAction.h | 4 ++-- src/strategy/actions/CheckMailAction.cpp | 4 ++-- src/strategy/actions/CheckMailAction.h | 4 ++-- src/strategy/actions/CheckMountStateAction.cpp | 4 ++-- src/strategy/actions/CheckMountStateAction.h | 4 ++-- src/strategy/actions/CheckValuesAction.cpp | 4 ++-- src/strategy/actions/CheckValuesAction.h | 4 ++-- src/strategy/actions/ChooseRpgTargetAction.cpp | 4 ++-- src/strategy/actions/ChooseRpgTargetAction.h | 4 ++-- src/strategy/actions/ChooseTargetActions.cpp | 4 ++-- src/strategy/actions/ChooseTargetActions.h | 4 ++-- src/strategy/actions/ChooseTravelTargetAction.cpp | 4 ++-- src/strategy/actions/ChooseTravelTargetAction.h | 4 ++-- src/strategy/actions/CombatActions.cpp | 4 ++-- src/strategy/actions/CombatActions.h | 4 ++-- src/strategy/actions/CustomStrategyEditAction.cpp | 4 ++-- src/strategy/actions/CustomStrategyEditAction.h | 4 ++-- src/strategy/actions/DebugAction.cpp | 4 ++-- src/strategy/actions/DebugAction.h | 4 ++-- src/strategy/actions/DelayAction.cpp | 4 ++-- src/strategy/actions/DelayAction.h | 4 ++-- src/strategy/actions/DestroyItemAction.cpp | 4 ++-- src/strategy/actions/DestroyItemAction.h | 4 ++-- src/strategy/actions/DropQuestAction.cpp | 4 ++-- src/strategy/actions/DropQuestAction.h | 4 ++-- src/strategy/actions/EmoteAction.cpp | 4 ++-- src/strategy/actions/EmoteAction.h | 4 ++-- src/strategy/actions/EquipAction.cpp | 4 ++-- src/strategy/actions/EquipAction.h | 4 ++-- src/strategy/actions/EquipGlyphsAction.cpp | 4 ++-- src/strategy/actions/EquipGlyphsAction.h | 4 ++-- src/strategy/actions/FlagAction.cpp | 4 ++-- src/strategy/actions/FlagAction.h | 4 ++-- src/strategy/actions/FollowActions.cpp | 4 ++-- src/strategy/actions/FollowActions.h | 4 ++-- src/strategy/actions/GenericActions.cpp | 4 ++-- src/strategy/actions/GenericActions.h | 4 ++-- src/strategy/actions/GenericBuffUtils.cpp | 4 ++-- src/strategy/actions/GenericBuffUtils.h | 4 ++-- src/strategy/actions/GenericSpellActions.cpp | 4 ++-- src/strategy/actions/GenericSpellActions.h | 4 ++-- src/strategy/actions/GiveItemAction.cpp | 4 ++-- src/strategy/actions/GiveItemAction.h | 4 ++-- src/strategy/actions/GoAction.cpp | 4 ++-- src/strategy/actions/GoAction.h | 4 ++-- src/strategy/actions/GossipHelloAction.cpp | 4 ++-- src/strategy/actions/GossipHelloAction.h | 4 ++-- src/strategy/actions/GreetAction.cpp | 4 ++-- src/strategy/actions/GreetAction.h | 4 ++-- src/strategy/actions/GuildAcceptAction.cpp | 4 ++-- src/strategy/actions/GuildAcceptAction.h | 4 ++-- src/strategy/actions/GuildBankAction.cpp | 4 ++-- src/strategy/actions/GuildBankAction.h | 4 ++-- src/strategy/actions/GuildCreateActions.cpp | 4 ++-- src/strategy/actions/GuildCreateActions.h | 4 ++-- src/strategy/actions/GuildManagementActions.cpp | 4 ++-- src/strategy/actions/GuildManagementActions.h | 4 ++-- src/strategy/actions/HelpAction.cpp | 4 ++-- src/strategy/actions/HelpAction.h | 4 ++-- src/strategy/actions/HireAction.cpp | 4 ++-- src/strategy/actions/HireAction.h | 4 ++-- src/strategy/actions/ImbueAction.cpp | 4 ++-- src/strategy/actions/ImbueAction.h | 4 ++-- src/strategy/actions/InventoryAction.cpp | 4 ++-- src/strategy/actions/InventoryAction.h | 4 ++-- src/strategy/actions/InventoryChangeFailureAction.cpp | 4 ++-- src/strategy/actions/InventoryChangeFailureAction.h | 4 ++-- src/strategy/actions/InviteToGroupAction.cpp | 4 ++-- src/strategy/actions/InviteToGroupAction.h | 4 ++-- src/strategy/actions/LeaveGroupAction.cpp | 4 ++-- src/strategy/actions/LeaveGroupAction.h | 4 ++-- src/strategy/actions/LfgActions.cpp | 4 ++-- src/strategy/actions/LfgActions.h | 4 ++-- src/strategy/actions/ListQuestsActions.cpp | 4 ++-- src/strategy/actions/ListQuestsActions.h | 4 ++-- src/strategy/actions/ListSpellsAction.cpp | 4 ++-- src/strategy/actions/ListSpellsAction.h | 4 ++-- src/strategy/actions/LogLevelAction.cpp | 4 ++-- src/strategy/actions/LogLevelAction.h | 4 ++-- src/strategy/actions/LootAction.cpp | 4 ++-- src/strategy/actions/LootAction.h | 4 ++-- src/strategy/actions/LootRollAction.cpp | 4 ++-- src/strategy/actions/LootRollAction.h | 4 ++-- src/strategy/actions/LootStrategyAction.cpp | 4 ++-- src/strategy/actions/LootStrategyAction.h | 4 ++-- src/strategy/actions/MailAction.cpp | 4 ++-- src/strategy/actions/MailAction.h | 4 ++-- src/strategy/actions/MoveToRpgTargetAction.cpp | 4 ++-- src/strategy/actions/MoveToRpgTargetAction.h | 4 ++-- src/strategy/actions/MoveToTravelTargetAction.cpp | 4 ++-- src/strategy/actions/MoveToTravelTargetAction.h | 4 ++-- src/strategy/actions/MovementActions.cpp | 4 ++-- src/strategy/actions/MovementActions.h | 4 ++-- src/strategy/actions/NonCombatActions.cpp | 4 ++-- src/strategy/actions/NonCombatActions.h | 4 ++-- src/strategy/actions/OpenItemAction.h | 4 ++-- src/strategy/actions/OutfitAction.cpp | 4 ++-- src/strategy/actions/OutfitAction.h | 4 ++-- src/strategy/actions/PassLeadershipToMasterAction.cpp | 4 ++-- src/strategy/actions/PassLeadershipToMasterAction.h | 4 ++-- src/strategy/actions/PetAction.cpp | 4 ++-- src/strategy/actions/PetAction.h | 4 ++-- src/strategy/actions/PetitionSignAction.cpp | 4 ++-- src/strategy/actions/PetitionSignAction.h | 4 ++-- src/strategy/actions/PositionAction.cpp | 4 ++-- src/strategy/actions/PositionAction.h | 4 ++-- src/strategy/actions/QueryItemUsageAction.cpp | 4 ++-- src/strategy/actions/QueryItemUsageAction.h | 4 ++-- src/strategy/actions/QueryQuestAction.cpp | 4 ++-- src/strategy/actions/QueryQuestAction.h | 4 ++-- src/strategy/actions/QuestAction.cpp | 4 ++-- src/strategy/actions/QuestAction.h | 4 ++-- src/strategy/actions/QuestConfirmAcceptAction.h | 4 ++-- src/strategy/actions/RandomBotUpdateAction.cpp | 4 ++-- src/strategy/actions/RandomBotUpdateAction.h | 4 ++-- src/strategy/actions/RangeAction.cpp | 4 ++-- src/strategy/actions/RangeAction.h | 4 ++-- src/strategy/actions/ReachTargetActions.cpp | 4 ++-- src/strategy/actions/ReachTargetActions.h | 4 ++-- src/strategy/actions/ReadyCheckAction.cpp | 4 ++-- src/strategy/actions/ReadyCheckAction.h | 4 ++-- src/strategy/actions/ReleaseSpiritAction.cpp | 4 ++-- src/strategy/actions/ReleaseSpiritAction.h | 4 ++-- src/strategy/actions/RememberTaxiAction.cpp | 4 ++-- src/strategy/actions/RememberTaxiAction.h | 4 ++-- src/strategy/actions/RemoveAuraAction.cpp | 4 ++-- src/strategy/actions/RemoveAuraAction.h | 4 ++-- src/strategy/actions/RepairAllAction.cpp | 4 ++-- src/strategy/actions/RepairAllAction.h | 4 ++-- src/strategy/actions/ResetAiAction.cpp | 4 ++-- src/strategy/actions/ResetAiAction.h | 4 ++-- src/strategy/actions/ResetInstancesAction.cpp | 4 ++-- src/strategy/actions/ResetInstancesAction.h | 4 ++-- src/strategy/actions/RevealGatheringItemAction.cpp | 4 ++-- src/strategy/actions/RevealGatheringItemAction.h | 4 ++-- src/strategy/actions/ReviveFromCorpseAction.cpp | 4 ++-- src/strategy/actions/ReviveFromCorpseAction.h | 4 ++-- src/strategy/actions/RewardAction.cpp | 4 ++-- src/strategy/actions/RewardAction.h | 4 ++-- src/strategy/actions/RpgAction.cpp | 4 ++-- src/strategy/actions/RpgAction.h | 4 ++-- src/strategy/actions/RpgSubActions.cpp | 4 ++-- src/strategy/actions/RpgSubActions.h | 4 ++-- src/strategy/actions/RpgValues.h | 4 ++-- src/strategy/actions/RtiAction.cpp | 4 ++-- src/strategy/actions/RtiAction.h | 4 ++-- src/strategy/actions/RtscAction.cpp | 4 ++-- src/strategy/actions/RtscAction.h | 4 ++-- src/strategy/actions/SaveManaAction.cpp | 4 ++-- src/strategy/actions/SaveManaAction.h | 4 ++-- src/strategy/actions/SayAction.cpp | 4 ++-- src/strategy/actions/SayAction.h | 4 ++-- src/strategy/actions/SecurityCheckAction.cpp | 4 ++-- src/strategy/actions/SecurityCheckAction.h | 4 ++-- src/strategy/actions/SeeSpellAction.cpp | 4 ++-- src/strategy/actions/SeeSpellAction.h | 4 ++-- src/strategy/actions/SellAction.cpp | 4 ++-- src/strategy/actions/SellAction.h | 4 ++-- src/strategy/actions/SendMailAction.cpp | 4 ++-- src/strategy/actions/SendMailAction.h | 4 ++-- src/strategy/actions/SetCraftAction.cpp | 4 ++-- src/strategy/actions/SetCraftAction.h | 4 ++-- src/strategy/actions/SetHomeAction.cpp | 4 ++-- src/strategy/actions/SetHomeAction.h | 4 ++-- src/strategy/actions/ShareQuestAction.cpp | 4 ++-- src/strategy/actions/ShareQuestAction.h | 4 ++-- src/strategy/actions/SkipSpellsListAction.cpp | 4 ++-- src/strategy/actions/SkipSpellsListAction.h | 4 ++-- src/strategy/actions/StatsAction.cpp | 4 ++-- src/strategy/actions/StatsAction.h | 4 ++-- src/strategy/actions/StayActions.cpp | 4 ++-- src/strategy/actions/StayActions.h | 4 ++-- src/strategy/actions/SuggestWhatToDoAction.cpp | 4 ++-- src/strategy/actions/SuggestWhatToDoAction.h | 4 ++-- src/strategy/actions/TalkToQuestGiverAction.cpp | 4 ++-- src/strategy/actions/TalkToQuestGiverAction.h | 4 ++-- src/strategy/actions/TameAction.cpp | 4 ++-- src/strategy/actions/TameAction.h | 4 ++-- src/strategy/actions/TaxiAction.cpp | 4 ++-- src/strategy/actions/TaxiAction.h | 4 ++-- src/strategy/actions/TeleportAction.cpp | 4 ++-- src/strategy/actions/TeleportAction.h | 4 ++-- src/strategy/actions/TellCastFailedAction.cpp | 4 ++-- src/strategy/actions/TellCastFailedAction.h | 4 ++-- src/strategy/actions/TellGlyphsAction.cpp | 4 ++-- src/strategy/actions/TellGlyphsAction.h | 4 ++-- src/strategy/actions/TellItemCountAction.cpp | 4 ++-- src/strategy/actions/TellItemCountAction.h | 4 ++-- src/strategy/actions/TellLosAction.cpp | 4 ++-- src/strategy/actions/TellLosAction.h | 4 ++-- src/strategy/actions/TellMasterAction.cpp | 4 ++-- src/strategy/actions/TellMasterAction.h | 4 ++-- src/strategy/actions/TellReputationAction.cpp | 4 ++-- src/strategy/actions/TellReputationAction.h | 4 ++-- src/strategy/actions/TellTargetAction.cpp | 4 ++-- src/strategy/actions/TellTargetAction.h | 4 ++-- src/strategy/actions/TradeAction.cpp | 4 ++-- src/strategy/actions/TradeAction.h | 4 ++-- src/strategy/actions/TradeStatusAction.cpp | 4 ++-- src/strategy/actions/TradeStatusAction.h | 4 ++-- src/strategy/actions/TradeValues.cpp | 4 ++-- src/strategy/actions/TradeValues.h | 4 ++-- src/strategy/actions/TrainerAction.cpp | 4 ++-- src/strategy/actions/TrainerAction.h | 4 ++-- src/strategy/actions/TravelAction.cpp | 4 ++-- src/strategy/actions/TravelAction.h | 4 ++-- src/strategy/actions/UnequipAction.cpp | 4 ++-- src/strategy/actions/UnequipAction.h | 4 ++-- src/strategy/actions/UseItemAction.cpp | 4 ++-- src/strategy/actions/UseItemAction.h | 4 ++-- src/strategy/actions/UseMeetingStoneAction.cpp | 4 ++-- src/strategy/actions/UseMeetingStoneAction.h | 4 ++-- src/strategy/actions/VehicleActions.cpp | 4 ++-- src/strategy/actions/VehicleActions.h | 4 ++-- src/strategy/actions/WhoAction.cpp | 4 ++-- src/strategy/actions/WhoAction.h | 4 ++-- src/strategy/actions/WipeAction.cpp | 4 ++-- src/strategy/actions/WipeAction.h | 4 ++-- src/strategy/actions/WorldBuffAction.cpp | 4 ++-- src/strategy/actions/WorldBuffAction.h | 4 ++-- src/strategy/actions/WorldPacketActionContext.h | 4 ++-- src/strategy/actions/WtsAction.cpp | 4 ++-- src/strategy/actions/WtsAction.h | 4 ++-- src/strategy/actions/XpGainAction.cpp | 4 ++-- src/strategy/actions/XpGainAction.h | 4 ++-- src/strategy/deathknight/BloodDKStrategy.cpp | 4 ++-- src/strategy/deathknight/BloodDKStrategy.h | 4 ++-- src/strategy/deathknight/DKActions.cpp | 4 ++-- src/strategy/deathknight/DKActions.h | 4 ++-- src/strategy/deathknight/DKAiObjectContext.cpp | 4 ++-- src/strategy/deathknight/DKAiObjectContext.h | 4 ++-- src/strategy/deathknight/DKTriggers.cpp | 4 ++-- src/strategy/deathknight/DKTriggers.h | 4 ++-- src/strategy/deathknight/FrostDKStrategy.cpp | 4 ++-- src/strategy/deathknight/FrostDKStrategy.h | 4 ++-- src/strategy/deathknight/GenericDKNonCombatStrategy.cpp | 4 ++-- src/strategy/deathknight/GenericDKNonCombatStrategy.h | 4 ++-- src/strategy/deathknight/GenericDKStrategy.cpp | 2 +- src/strategy/deathknight/GenericDKStrategy.h | 4 ++-- src/strategy/deathknight/UnholyDKStrategy.cpp | 2 +- src/strategy/deathknight/UnholyDKStrategy.h | 4 ++-- src/strategy/druid/BearTankDruidStrategy.cpp | 4 ++-- src/strategy/druid/BearTankDruidStrategy.h | 4 ++-- src/strategy/druid/CasterDruidStrategy.cpp | 4 ++-- src/strategy/druid/CasterDruidStrategy.h | 4 ++-- src/strategy/druid/CatDpsDruidStrategy.cpp | 4 ++-- src/strategy/druid/CatDpsDruidStrategy.h | 4 ++-- src/strategy/druid/DruidActions.cpp | 4 ++-- src/strategy/druid/DruidActions.h | 4 ++-- src/strategy/druid/DruidAiObjectContext.cpp | 4 ++-- src/strategy/druid/DruidAiObjectContext.h | 4 ++-- src/strategy/druid/DruidBearActions.cpp | 4 ++-- src/strategy/druid/DruidBearActions.h | 4 ++-- src/strategy/druid/DruidCatActions.h | 4 ++-- src/strategy/druid/DruidShapeshiftActions.cpp | 4 ++-- src/strategy/druid/DruidShapeshiftActions.h | 4 ++-- src/strategy/druid/DruidTriggers.cpp | 4 ++-- src/strategy/druid/DruidTriggers.h | 4 ++-- src/strategy/druid/FeralDruidStrategy.cpp | 4 ++-- src/strategy/druid/FeralDruidStrategy.h | 4 ++-- src/strategy/druid/GenericDruidNonCombatStrategy.cpp | 4 ++-- src/strategy/druid/GenericDruidNonCombatStrategy.h | 4 ++-- src/strategy/druid/GenericDruidStrategy.cpp | 4 ++-- src/strategy/druid/GenericDruidStrategy.h | 4 ++-- src/strategy/druid/HealDruidStrategy.cpp | 4 ++-- src/strategy/druid/HealDruidStrategy.h | 4 ++-- src/strategy/druid/MeleeDruidStrategy.cpp | 4 ++-- src/strategy/druid/MeleeDruidStrategy.h | 4 ++-- src/strategy/druid/OffhealDruidCatStrategy.cpp | 4 ++-- src/strategy/druid/OffhealDruidCatStrategy.h | 4 ++-- src/strategy/generic/AttackEnemyPlayersStrategy.cpp | 4 ++-- src/strategy/generic/AttackEnemyPlayersStrategy.h | 4 ++-- src/strategy/generic/BattlegroundStrategy.cpp | 4 ++-- src/strategy/generic/BattlegroundStrategy.h | 4 ++-- src/strategy/generic/CastTimeStrategy.cpp | 4 ++-- src/strategy/generic/CastTimeStrategy.h | 4 ++-- src/strategy/generic/ChatCommandHandlerStrategy.cpp | 4 ++-- src/strategy/generic/ChatCommandHandlerStrategy.h | 4 ++-- src/strategy/generic/CombatStrategy.cpp | 4 ++-- src/strategy/generic/CombatStrategy.h | 4 ++-- src/strategy/generic/ConserveManaStrategy.cpp | 4 ++-- src/strategy/generic/ConserveManaStrategy.h | 4 ++-- src/strategy/generic/DeadStrategy.cpp | 4 ++-- src/strategy/generic/DeadStrategy.h | 4 ++-- src/strategy/generic/DebugStrategy.cpp | 4 ++-- src/strategy/generic/DebugStrategy.h | 4 ++-- src/strategy/generic/DpsAssistStrategy.cpp | 4 ++-- src/strategy/generic/DpsAssistStrategy.h | 4 ++-- src/strategy/generic/DuelStrategy.cpp | 4 ++-- src/strategy/generic/DuelStrategy.h | 4 ++-- src/strategy/generic/EmoteStrategy.cpp | 4 ++-- src/strategy/generic/EmoteStrategy.h | 4 ++-- src/strategy/generic/FleeStrategy.cpp | 4 ++-- src/strategy/generic/FleeStrategy.h | 4 ++-- src/strategy/generic/FollowMasterStrategy.cpp | 4 ++-- src/strategy/generic/FollowMasterStrategy.h | 4 ++-- src/strategy/generic/GrindingStrategy.cpp | 4 ++-- src/strategy/generic/GrindingStrategy.h | 4 ++-- src/strategy/generic/GroupStrategy.cpp | 4 ++-- src/strategy/generic/GroupStrategy.h | 4 ++-- src/strategy/generic/GuardStrategy.cpp | 4 ++-- src/strategy/generic/GuardStrategy.h | 4 ++-- src/strategy/generic/GuildStrategy.cpp | 4 ++-- src/strategy/generic/GuildStrategy.h | 4 ++-- src/strategy/generic/KiteStrategy.cpp | 4 ++-- src/strategy/generic/KiteStrategy.h | 4 ++-- src/strategy/generic/LfgStrategy.cpp | 4 ++-- src/strategy/generic/LfgStrategy.h | 4 ++-- src/strategy/generic/LootNonCombatStrategy.cpp | 4 ++-- src/strategy/generic/LootNonCombatStrategy.h | 4 ++-- src/strategy/generic/MaintenanceStrategy.cpp | 4 ++-- src/strategy/generic/MaintenanceStrategy.h | 4 ++-- src/strategy/generic/MarkRtiStrategy.cpp | 4 ++-- src/strategy/generic/MarkRtiStrategy.h | 4 ++-- src/strategy/generic/MeleeCombatStrategy.cpp | 4 ++-- src/strategy/generic/MeleeCombatStrategy.h | 4 ++-- src/strategy/generic/MoveFromGroupStrategy.cpp | 4 ++-- src/strategy/generic/MoveFromGroupStrategy.h | 4 ++-- src/strategy/generic/NonCombatStrategy.cpp | 4 ++-- src/strategy/generic/NonCombatStrategy.h | 4 ++-- src/strategy/generic/PassTroughStrategy.cpp | 4 ++-- src/strategy/generic/PassTroughStrategy.h | 4 ++-- src/strategy/generic/PassiveStrategy.cpp | 4 ++-- src/strategy/generic/PassiveStrategy.h | 4 ++-- src/strategy/generic/PullStrategy.cpp | 4 ++-- src/strategy/generic/PullStrategy.h | 4 ++-- src/strategy/generic/QuestStrategies.cpp | 4 ++-- src/strategy/generic/QuestStrategies.h | 4 ++-- src/strategy/generic/RTSCStrategy.cpp | 4 ++-- src/strategy/generic/RTSCStrategy.h | 4 ++-- src/strategy/generic/RacialsStrategy.cpp | 4 ++-- src/strategy/generic/RacialsStrategy.h | 4 ++-- src/strategy/generic/RangedCombatStrategy.cpp | 4 ++-- src/strategy/generic/RangedCombatStrategy.h | 4 ++-- src/strategy/generic/ReturnStrategy.cpp | 4 ++-- src/strategy/generic/ReturnStrategy.h | 4 ++-- src/strategy/generic/RpgStrategy.cpp | 4 ++-- src/strategy/generic/RpgStrategy.h | 4 ++-- src/strategy/generic/RunawayStrategy.cpp | 4 ++-- src/strategy/generic/RunawayStrategy.h | 4 ++-- src/strategy/generic/SayStrategy.cpp | 4 ++-- src/strategy/generic/SayStrategy.h | 4 ++-- src/strategy/generic/StayStrategy.cpp | 4 ++-- src/strategy/generic/StayStrategy.h | 4 ++-- src/strategy/generic/TankAssistStrategy.cpp | 4 ++-- src/strategy/generic/TankAssistStrategy.h | 4 ++-- src/strategy/generic/TellTargetStrategy.cpp | 4 ++-- src/strategy/generic/TellTargetStrategy.h | 4 ++-- src/strategy/generic/ThreatStrategy.cpp | 4 ++-- src/strategy/generic/ThreatStrategy.h | 4 ++-- src/strategy/generic/TravelStrategy.cpp | 4 ++-- src/strategy/generic/TravelStrategy.h | 4 ++-- src/strategy/generic/UseFoodStrategy.cpp | 4 ++-- src/strategy/generic/UseFoodStrategy.h | 4 ++-- src/strategy/generic/UsePotionsStrategy.cpp | 4 ++-- src/strategy/generic/UsePotionsStrategy.h | 4 ++-- src/strategy/generic/WorldPacketHandlerStrategy.cpp | 4 ++-- src/strategy/generic/WorldPacketHandlerStrategy.h | 4 ++-- src/strategy/hunter/BeastMasteryHunterStrategy.cpp | 4 ++-- src/strategy/hunter/BeastMasteryHunterStrategy.h | 4 ++-- src/strategy/hunter/GenericHunterNonCombatStrategy.cpp | 4 ++-- src/strategy/hunter/GenericHunterNonCombatStrategy.h | 4 ++-- src/strategy/hunter/GenericHunterStrategy.cpp | 4 ++-- src/strategy/hunter/GenericHunterStrategy.h | 4 ++-- src/strategy/hunter/HunterActions.cpp | 4 ++-- src/strategy/hunter/HunterActions.h | 4 ++-- src/strategy/hunter/HunterAiObjectContext.cpp | 4 ++-- src/strategy/hunter/HunterAiObjectContext.h | 4 ++-- src/strategy/hunter/HunterBuffStrategies.cpp | 4 ++-- src/strategy/hunter/HunterBuffStrategies.h | 4 ++-- src/strategy/hunter/HunterTriggers.cpp | 4 ++-- src/strategy/hunter/HunterTriggers.h | 4 ++-- src/strategy/hunter/MarksmanshipHunterStrategy.cpp | 4 ++-- src/strategy/hunter/MarksmanshipHunterStrategy.h | 4 ++-- src/strategy/hunter/SurvivalHunterStrategy.cpp | 4 ++-- src/strategy/hunter/SurvivalHunterStrategy.h | 4 ++-- src/strategy/mage/ArcaneMageStrategy.cpp | 4 ++-- src/strategy/mage/ArcaneMageStrategy.h | 4 ++-- src/strategy/mage/FireMageStrategy.cpp | 4 ++-- src/strategy/mage/FireMageStrategy.h | 4 ++-- src/strategy/mage/FrostFireMageStrategy.cpp | 4 ++-- src/strategy/mage/FrostFireMageStrategy.h | 4 ++-- src/strategy/mage/FrostMageStrategy.cpp | 4 ++-- src/strategy/mage/FrostMageStrategy.h | 4 ++-- src/strategy/mage/GenericMageNonCombatStrategy.cpp | 4 ++-- src/strategy/mage/GenericMageNonCombatStrategy.h | 4 ++-- src/strategy/mage/GenericMageStrategy.cpp | 4 ++-- src/strategy/mage/GenericMageStrategy.h | 4 ++-- src/strategy/mage/MageActions.cpp | 4 ++-- src/strategy/mage/MageActions.h | 4 ++-- src/strategy/mage/MageAiObjectContext.cpp | 4 ++-- src/strategy/mage/MageAiObjectContext.h | 4 ++-- src/strategy/mage/MageTriggers.cpp | 4 ++-- src/strategy/mage/MageTriggers.h | 4 ++-- src/strategy/paladin/DpsPaladinStrategy.cpp | 4 ++-- src/strategy/paladin/DpsPaladinStrategy.h | 4 ++-- src/strategy/paladin/GenericPaladinNonCombatStrategy.cpp | 4 ++-- src/strategy/paladin/GenericPaladinNonCombatStrategy.h | 4 ++-- src/strategy/paladin/GenericPaladinStrategy.cpp | 4 ++-- src/strategy/paladin/GenericPaladinStrategy.h | 4 ++-- .../paladin/GenericPaladinStrategyActionNodeFactory.h | 4 ++-- src/strategy/paladin/HealPaladinStrategy.cpp | 4 ++-- src/strategy/paladin/HealPaladinStrategy.h | 4 ++-- src/strategy/paladin/OffhealRetPaladinStrategy.cpp | 4 ++-- src/strategy/paladin/OffhealRetPaladinStrategy.h | 4 ++-- src/strategy/paladin/PaladinActions.cpp | 4 ++-- src/strategy/paladin/PaladinActions.h | 4 ++-- src/strategy/paladin/PaladinAiObjectContext.cpp | 4 ++-- src/strategy/paladin/PaladinAiObjectContext.h | 4 ++-- src/strategy/paladin/PaladinBuffStrategies.cpp | 4 ++-- src/strategy/paladin/PaladinBuffStrategies.h | 4 ++-- src/strategy/paladin/PaladinTriggers.cpp | 4 ++-- src/strategy/paladin/PaladinTriggers.h | 4 ++-- src/strategy/paladin/TankPaladinStrategy.cpp | 4 ++-- src/strategy/paladin/TankPaladinStrategy.h | 4 ++-- src/strategy/priest/GenericPriestStrategy.cpp | 4 ++-- src/strategy/priest/GenericPriestStrategy.h | 4 ++-- src/strategy/priest/GenericPriestStrategyActionNodeFactory.h | 4 ++-- src/strategy/priest/HealPriestStrategy.cpp | 4 ++-- src/strategy/priest/HealPriestStrategy.h | 4 ++-- src/strategy/priest/HolyPriestStrategy.cpp | 4 ++-- src/strategy/priest/HolyPriestStrategy.h | 4 ++-- src/strategy/priest/PriestActions.cpp | 4 ++-- src/strategy/priest/PriestActions.h | 4 ++-- src/strategy/priest/PriestAiObjectContext.cpp | 4 ++-- src/strategy/priest/PriestAiObjectContext.h | 4 ++-- src/strategy/priest/PriestNonCombatStrategy.cpp | 4 ++-- src/strategy/priest/PriestNonCombatStrategy.h | 4 ++-- .../priest/PriestNonCombatStrategyActionNodeFactory.h | 4 ++-- src/strategy/priest/PriestTriggers.cpp | 4 ++-- src/strategy/priest/PriestTriggers.h | 4 ++-- src/strategy/priest/ShadowPriestStrategy.cpp | 4 ++-- src/strategy/priest/ShadowPriestStrategy.h | 4 ++-- src/strategy/priest/ShadowPriestStrategyActionNodeFactory.h | 4 ++-- src/strategy/raids/naxxramas/RaidNaxxActionContext.h | 4 ++-- src/strategy/raids/naxxramas/RaidNaxxTriggerContext.h | 4 ++-- src/strategy/raids/ulduar/RaidUlduarActionContext.h | 4 ++-- src/strategy/raids/ulduar/RaidUlduarTriggerContext.h | 4 ++-- src/strategy/raids/vaultofarchavon/RaidVoAActionContext.h | 4 ++-- src/strategy/raids/vaultofarchavon/RaidVoATriggerContext.h | 4 ++-- src/strategy/rogue/DpsRogueStrategy.cpp | 4 ++-- src/strategy/rogue/DpsRogueStrategy.h | 4 ++-- src/strategy/rogue/GenericRogueNonCombatStrategy.cpp | 4 ++-- src/strategy/rogue/GenericRogueNonCombatStrategy.h | 4 ++-- src/strategy/rogue/RogueActions.cpp | 4 ++-- src/strategy/rogue/RogueActions.h | 4 ++-- src/strategy/rogue/RogueAiObjectContext.cpp | 4 ++-- src/strategy/rogue/RogueAiObjectContext.h | 4 ++-- src/strategy/rogue/RogueComboActions.cpp | 4 ++-- src/strategy/rogue/RogueComboActions.h | 4 ++-- src/strategy/rogue/RogueFinishingActions.h | 4 ++-- src/strategy/rogue/RogueOpeningActions.cpp | 4 ++-- src/strategy/rogue/RogueOpeningActions.h | 4 ++-- src/strategy/rogue/RogueTriggers.cpp | 4 ++-- src/strategy/rogue/RogueTriggers.h | 4 ++-- src/strategy/rpg/NewRpgStrategy.cpp | 4 ++-- src/strategy/rpg/NewRpgStrategy.h | 4 ++-- src/strategy/shaman/ElementalShamanStrategy.cpp | 4 ++-- src/strategy/shaman/ElementalShamanStrategy.h | 4 ++-- src/strategy/shaman/EnhancementShamanStrategy.cpp | 4 ++-- src/strategy/shaman/EnhancementShamanStrategy.h | 4 ++-- src/strategy/shaman/GenericShamanStrategy.cpp | 4 ++-- src/strategy/shaman/GenericShamanStrategy.h | 4 ++-- src/strategy/shaman/RestoShamanStrategy.cpp | 4 ++-- src/strategy/shaman/RestoShamanStrategy.h | 4 ++-- src/strategy/shaman/ShamanActions.cpp | 4 ++-- src/strategy/shaman/ShamanActions.h | 4 ++-- src/strategy/shaman/ShamanAiObjectContext.cpp | 4 ++-- src/strategy/shaman/ShamanAiObjectContext.h | 4 ++-- src/strategy/shaman/ShamanNonCombatStrategy.cpp | 4 ++-- src/strategy/shaman/ShamanNonCombatStrategy.h | 4 ++-- src/strategy/shaman/ShamanTriggers.cpp | 4 ++-- src/strategy/shaman/ShamanTriggers.h | 4 ++-- src/strategy/shaman/TotemsShamanStrategy.cpp | 4 ++-- src/strategy/shaman/TotemsShamanStrategy.h | 4 ++-- src/strategy/triggers/BossAuraTriggers.cpp | 4 ++-- src/strategy/triggers/BossAuraTriggers.h | 4 ++-- src/strategy/triggers/ChatCommandTrigger.cpp | 4 ++-- src/strategy/triggers/ChatCommandTrigger.h | 4 ++-- src/strategy/triggers/ChatTriggerContext.h | 4 ++-- src/strategy/triggers/CureTriggers.cpp | 4 ++-- src/strategy/triggers/CureTriggers.h | 4 ++-- src/strategy/triggers/GenericTriggers.cpp | 4 ++-- src/strategy/triggers/GenericTriggers.h | 4 ++-- src/strategy/triggers/GuildTriggers.cpp | 4 ++-- src/strategy/triggers/GuildTriggers.h | 4 ++-- src/strategy/triggers/HealthTriggers.cpp | 4 ++-- src/strategy/triggers/HealthTriggers.h | 4 ++-- src/strategy/triggers/LfgTriggers.cpp | 4 ++-- src/strategy/triggers/LfgTriggers.h | 4 ++-- src/strategy/triggers/LootTriggers.cpp | 4 ++-- src/strategy/triggers/LootTriggers.h | 4 ++-- src/strategy/triggers/PvpTriggers.cpp | 4 ++-- src/strategy/triggers/PvpTriggers.h | 4 ++-- src/strategy/triggers/RangeTriggers.cpp | 4 ++-- src/strategy/triggers/RangeTriggers.h | 4 ++-- src/strategy/triggers/RpgTriggers.cpp | 4 ++-- src/strategy/triggers/RpgTriggers.h | 4 ++-- src/strategy/triggers/RtiTriggers.cpp | 4 ++-- src/strategy/triggers/RtiTriggers.h | 4 ++-- src/strategy/triggers/StuckTriggers.cpp | 4 ++-- src/strategy/triggers/StuckTriggers.h | 4 ++-- src/strategy/triggers/TravelTriggers.cpp | 4 ++-- src/strategy/triggers/TravelTriggers.h | 4 ++-- src/strategy/triggers/TriggerContext.h | 4 ++-- src/strategy/triggers/WithinAreaTrigger.cpp | 4 ++-- src/strategy/triggers/WithinAreaTrigger.h | 4 ++-- src/strategy/triggers/WorldPacketTrigger.cpp | 4 ++-- src/strategy/triggers/WorldPacketTrigger.h | 4 ++-- src/strategy/triggers/WorldPacketTriggerContext.h | 4 ++-- src/strategy/values/ActiveSpellValue.cpp | 4 ++-- src/strategy/values/ActiveSpellValue.h | 4 ++-- src/strategy/values/AlwaysLootListValue.cpp | 4 ++-- src/strategy/values/AlwaysLootListValue.h | 4 ++-- src/strategy/values/AoeHealValues.cpp | 4 ++-- src/strategy/values/AoeHealValues.h | 4 ++-- src/strategy/values/AoeValues.cpp | 4 ++-- src/strategy/values/AoeValues.h | 4 ++-- src/strategy/values/Arrow.cpp | 4 ++-- src/strategy/values/Arrow.h | 4 ++-- src/strategy/values/AttackerCountValues.cpp | 4 ++-- src/strategy/values/AttackerCountValues.h | 4 ++-- src/strategy/values/AttackerWithoutAuraTargetValue.cpp | 4 ++-- src/strategy/values/AttackerWithoutAuraTargetValue.h | 4 ++-- src/strategy/values/AttackersValue.cpp | 4 ++-- src/strategy/values/AttackersValue.h | 4 ++-- src/strategy/values/AvailableLootValue.cpp | 4 ++-- src/strategy/values/AvailableLootValue.h | 4 ++-- src/strategy/values/BudgetValues.cpp | 4 ++-- src/strategy/values/BudgetValues.h | 4 ++-- src/strategy/values/CcTargetValue.cpp | 4 ++-- src/strategy/values/CcTargetValue.h | 4 ++-- src/strategy/values/ChatValue.h | 4 ++-- src/strategy/values/CollisionValue.cpp | 4 ++-- src/strategy/values/CollisionValue.h | 4 ++-- src/strategy/values/CraftValue.h | 4 ++-- src/strategy/values/CurrentCcTargetValue.cpp | 4 ++-- src/strategy/values/CurrentCcTargetValue.h | 4 ++-- src/strategy/values/CurrentTargetValue.cpp | 4 ++-- src/strategy/values/CurrentTargetValue.h | 4 ++-- src/strategy/values/DistanceValue.cpp | 4 ++-- src/strategy/values/DistanceValue.h | 4 ++-- src/strategy/values/DpsTargetValue.cpp | 4 ++-- src/strategy/values/DpsTargetValue.h | 4 ++-- src/strategy/values/DuelTargetValue.cpp | 4 ++-- src/strategy/values/DuelTargetValue.h | 4 ++-- src/strategy/values/EnemyHealerTargetValue.cpp | 4 ++-- src/strategy/values/EnemyHealerTargetValue.h | 4 ++-- src/strategy/values/EnemyPlayerValue.cpp | 4 ++-- src/strategy/values/EnemyPlayerValue.h | 4 ++-- src/strategy/values/EstimatedLifetimeValue.h | 4 ++-- src/strategy/values/Formations.cpp | 4 ++-- src/strategy/values/Formations.h | 4 ++-- src/strategy/values/GrindTargetValue.cpp | 4 ++-- src/strategy/values/GrindTargetValue.h | 4 ++-- src/strategy/values/GroupValues.cpp | 4 ++-- src/strategy/values/GroupValues.h | 4 ++-- src/strategy/values/GuildValues.cpp | 4 ++-- src/strategy/values/GuildValues.h | 4 ++-- src/strategy/values/HasAvailableLootValue.cpp | 4 ++-- src/strategy/values/HasAvailableLootValue.h | 4 ++-- src/strategy/values/HasTotemValue.cpp | 4 ++-- src/strategy/values/HasTotemValue.h | 4 ++-- src/strategy/values/InvalidTargetValue.cpp | 4 ++-- src/strategy/values/InvalidTargetValue.h | 4 ++-- src/strategy/values/IsBehindValue.cpp | 4 ++-- src/strategy/values/IsBehindValue.h | 4 ++-- src/strategy/values/IsFacingValue.cpp | 4 ++-- src/strategy/values/IsFacingValue.h | 4 ++-- src/strategy/values/IsMovingValue.cpp | 4 ++-- src/strategy/values/IsMovingValue.h | 4 ++-- src/strategy/values/ItemCountValue.cpp | 4 ++-- src/strategy/values/ItemCountValue.h | 4 ++-- src/strategy/values/ItemForSpellValue.cpp | 4 ++-- src/strategy/values/ItemForSpellValue.h | 4 ++-- src/strategy/values/ItemUsageValue.cpp | 4 ++-- src/strategy/values/ItemUsageValue.h | 4 ++-- src/strategy/values/LastMovementValue.cpp | 4 ++-- src/strategy/values/LastMovementValue.h | 4 ++-- src/strategy/values/LastSaidValue.h | 4 ++-- src/strategy/values/LastSpellCastTimeValue.h | 4 ++-- src/strategy/values/LastSpellCastValue.cpp | 4 ++-- src/strategy/values/LastSpellCastValue.h | 4 ++-- src/strategy/values/LeastHpTargetValue.cpp | 4 ++-- src/strategy/values/LeastHpTargetValue.h | 4 ++-- src/strategy/values/LfgValues.h | 4 ++-- src/strategy/values/LineTargetValue.cpp | 4 ++-- src/strategy/values/LineTargetValue.h | 4 ++-- src/strategy/values/LogLevelValue.h | 4 ++-- src/strategy/values/LootStrategyValue.cpp | 4 ++-- src/strategy/values/LootStrategyValue.h | 4 ++-- src/strategy/values/LootValues.cpp | 4 ++-- src/strategy/values/LootValues.h | 4 ++-- src/strategy/values/MaintenanceValues.cpp | 4 ++-- src/strategy/values/MaintenanceValues.h | 4 ++-- src/strategy/values/ManaSaveLevelValue.h | 4 ++-- src/strategy/values/MasterTargetValue.cpp | 4 ++-- src/strategy/values/MasterTargetValue.h | 4 ++-- src/strategy/values/NearestAdsValue.cpp | 4 ++-- src/strategy/values/NearestAdsValue.h | 4 ++-- src/strategy/values/NearestCorpsesValue.cpp | 4 ++-- src/strategy/values/NearestCorpsesValue.h | 4 ++-- src/strategy/values/NearestFriendlyPlayersValue.cpp | 4 ++-- src/strategy/values/NearestFriendlyPlayersValue.h | 4 ++-- src/strategy/values/NearestGameObjects.cpp | 4 ++-- src/strategy/values/NearestGameObjects.h | 4 ++-- src/strategy/values/NearestNonBotPlayersValue.cpp | 4 ++-- src/strategy/values/NearestNonBotPlayersValue.h | 4 ++-- src/strategy/values/NearestNpcsValue.cpp | 4 ++-- src/strategy/values/NearestNpcsValue.h | 4 ++-- src/strategy/values/NearestUnitsValue.cpp | 4 ++-- src/strategy/values/NearestUnitsValue.h | 4 ++-- src/strategy/values/NewPlayerNearbyValue.cpp | 4 ++-- src/strategy/values/NewPlayerNearbyValue.h | 4 ++-- src/strategy/values/OutfitListValue.cpp | 4 ++-- src/strategy/values/OutfitListValue.h | 4 ++-- src/strategy/values/PartyMemberToDispel.cpp | 4 ++-- src/strategy/values/PartyMemberToDispel.h | 4 ++-- src/strategy/values/PartyMemberToHeal.cpp | 4 ++-- src/strategy/values/PartyMemberToHeal.h | 4 ++-- src/strategy/values/PartyMemberToResurrect.cpp | 4 ++-- src/strategy/values/PartyMemberToResurrect.h | 4 ++-- src/strategy/values/PartyMemberValue.cpp | 4 ++-- src/strategy/values/PartyMemberValue.h | 4 ++-- src/strategy/values/PartyMemberWithoutAuraValue.cpp | 4 ++-- src/strategy/values/PartyMemberWithoutAuraValue.h | 4 ++-- src/strategy/values/PartyMemberWithoutItemValue.cpp | 4 ++-- src/strategy/values/PartyMemberWithoutItemValue.h | 4 ++-- src/strategy/values/PetTargetValue.cpp | 4 ++-- src/strategy/values/PetTargetValue.h | 4 ++-- src/strategy/values/PositionValue.cpp | 4 ++-- src/strategy/values/PositionValue.h | 4 ++-- src/strategy/values/PossibleRpgTargetsValue.cpp | 4 ++-- src/strategy/values/PossibleRpgTargetsValue.h | 4 ++-- src/strategy/values/PossibleTargetsValue.cpp | 4 ++-- src/strategy/values/PossibleTargetsValue.h | 4 ++-- src/strategy/values/PvpValues.cpp | 4 ++-- src/strategy/values/PvpValues.h | 4 ++-- src/strategy/values/QuestValues.cpp | 4 ++-- src/strategy/values/QuestValues.h | 4 ++-- src/strategy/values/RTSCValues.cpp | 4 ++-- src/strategy/values/RTSCValues.h | 4 ++-- src/strategy/values/RandomBotUpdateValue.h | 4 ++-- src/strategy/values/RangeValues.cpp | 4 ++-- src/strategy/values/RangeValues.h | 4 ++-- src/strategy/values/RtiTargetValue.cpp | 4 ++-- src/strategy/values/RtiTargetValue.h | 4 ++-- src/strategy/values/RtiValue.cpp | 4 ++-- src/strategy/values/RtiValue.h | 4 ++-- src/strategy/values/SelfTargetValue.cpp | 4 ++-- src/strategy/values/SelfTargetValue.h | 4 ++-- src/strategy/values/SharedValueContext.h | 4 ++-- src/strategy/values/SkipSpellsListValue.cpp | 4 ++-- src/strategy/values/SkipSpellsListValue.h | 4 ++-- src/strategy/values/SnareTargetValue.cpp | 4 ++-- src/strategy/values/SnareTargetValue.h | 4 ++-- src/strategy/values/SpellCastUsefulValue.cpp | 4 ++-- src/strategy/values/SpellCastUsefulValue.h | 4 ++-- src/strategy/values/SpellIdValue.cpp | 4 ++-- src/strategy/values/SpellIdValue.h | 4 ++-- src/strategy/values/Stances.cpp | 4 ++-- src/strategy/values/Stances.h | 4 ++-- src/strategy/values/StatsValues.cpp | 4 ++-- src/strategy/values/StatsValues.h | 4 ++-- src/strategy/values/TankTargetValue.cpp | 4 ++-- src/strategy/values/TankTargetValue.h | 4 ++-- src/strategy/values/TargetValue.cpp | 4 ++-- src/strategy/values/TargetValue.h | 4 ++-- src/strategy/values/ThreatValues.cpp | 4 ++-- src/strategy/values/ThreatValues.h | 4 ++-- src/strategy/values/ValueContext.h | 4 ++-- src/strategy/warlock/AfflictionWarlockStrategy.cpp | 4 ++-- src/strategy/warlock/AfflictionWarlockStrategy.h | 4 ++-- src/strategy/warlock/DemonologyWarlockStrategy.cpp | 4 ++-- src/strategy/warlock/DemonologyWarlockStrategy.h | 4 ++-- src/strategy/warlock/DestructionWarlockStrategy.cpp | 4 ++-- src/strategy/warlock/DestructionWarlockStrategy.h | 4 ++-- src/strategy/warlock/GenericWarlockNonCombatStrategy.cpp | 4 ++-- src/strategy/warlock/GenericWarlockNonCombatStrategy.h | 4 ++-- src/strategy/warlock/GenericWarlockStrategy.cpp | 4 ++-- src/strategy/warlock/GenericWarlockStrategy.h | 4 ++-- src/strategy/warlock/TankWarlockStrategy.cpp | 4 ++-- src/strategy/warlock/TankWarlockStrategy.h | 4 ++-- src/strategy/warlock/WarlockActions.cpp | 4 ++-- src/strategy/warlock/WarlockActions.h | 4 ++-- src/strategy/warlock/WarlockAiObjectContext.cpp | 4 ++-- src/strategy/warlock/WarlockAiObjectContext.h | 4 ++-- src/strategy/warlock/WarlockTriggers.cpp | 4 ++-- src/strategy/warlock/WarlockTriggers.h | 4 ++-- src/strategy/warrior/ArmsWarriorStrategy.cpp | 4 ++-- src/strategy/warrior/ArmsWarriorStrategy.h | 4 ++-- src/strategy/warrior/FuryWarriorStrategy.cpp | 4 ++-- src/strategy/warrior/FuryWarriorStrategy.h | 4 ++-- src/strategy/warrior/GenericWarriorNonCombatStrategy.cpp | 4 ++-- src/strategy/warrior/GenericWarriorNonCombatStrategy.h | 4 ++-- src/strategy/warrior/GenericWarriorStrategy.cpp | 4 ++-- src/strategy/warrior/GenericWarriorStrategy.h | 4 ++-- src/strategy/warrior/TankWarriorStrategy.cpp | 4 ++-- src/strategy/warrior/TankWarriorStrategy.h | 4 ++-- src/strategy/warrior/WarriorActions.cpp | 4 ++-- src/strategy/warrior/WarriorActions.h | 4 ++-- src/strategy/warrior/WarriorAiObjectContext.cpp | 4 ++-- src/strategy/warrior/WarriorAiObjectContext.h | 4 ++-- src/strategy/warrior/WarriorTriggers.cpp | 4 ++-- src/strategy/warrior/WarriorTriggers.h | 4 ++-- 839 files changed, 1676 insertions(+), 1676 deletions(-) diff --git a/src/AiFactory.cpp b/src/AiFactory.cpp index 75d51bf127..3ec1418aab 100644 --- a/src/AiFactory.cpp +++ b/src/AiFactory.cpp @@ -1,6 +1,6 @@ /* - * Copyright (C) 2016+ AzerothCore , released under GNU GPL v2 license, you may redistribute it - * and/or modify it under version 2 of the License, or (at your option), any later version. + * Copyright (C) 2016+ AzerothCore , released under GNU AGPL v3 license, you may redistribute it + * and/or modify it under version 3 of the License, or (at your option), any later version. */ #include "AiFactory.h" diff --git a/src/AiFactory.h b/src/AiFactory.h index 2c3fafe54b..3d11d80aeb 100644 --- a/src/AiFactory.h +++ b/src/AiFactory.h @@ -1,6 +1,6 @@ /* - * Copyright (C) 2016+ AzerothCore , released under GNU GPL v2 license, you may redistribute it - * and/or modify it under version 2 of the License, or (at your option), any later version. + * Copyright (C) 2016+ AzerothCore , released under GNU AGPL v3 license, you may redistribute it + * and/or modify it under version 3 of the License, or (at your option), any later version. */ #ifndef _PLAYERBOT_AIFACTORY_H diff --git a/src/ChatFilter.cpp b/src/ChatFilter.cpp index 30a85099b9..9a6b67002b 100644 --- a/src/ChatFilter.cpp +++ b/src/ChatFilter.cpp @@ -1,6 +1,6 @@ /* - * Copyright (C) 2016+ AzerothCore , released under GNU GPL v2 license, you may redistribute it - * and/or modify it under version 2 of the License, or (at your option), any later version. + * Copyright (C) 2016+ AzerothCore , released under GNU AGPL v3 license, you may redistribute it + * and/or modify it under version 3 of the License, or (at your option), any later version. */ #include "ChatFilter.h" diff --git a/src/ChatFilter.h b/src/ChatFilter.h index e823cbf51d..ebb1d9cffb 100644 --- a/src/ChatFilter.h +++ b/src/ChatFilter.h @@ -1,6 +1,6 @@ /* - * Copyright (C) 2016+ AzerothCore , released under GNU GPL v2 license, you may redistribute it - * and/or modify it under version 2 of the License, or (at your option), any later version. + * Copyright (C) 2016+ AzerothCore , released under GNU AGPL v3 license, you may redistribute it + * and/or modify it under version 3 of the License, or (at your option), any later version. */ #ifndef _PLAYERBOT_CHATFILTER_H diff --git a/src/ChatHelper.cpp b/src/ChatHelper.cpp index 1b1265ddcc..d1a5050960 100644 --- a/src/ChatHelper.cpp +++ b/src/ChatHelper.cpp @@ -1,6 +1,6 @@ /* - * Copyright (C) 2016+ AzerothCore , released under GNU GPL v2 license, you may redistribute it - * and/or modify it under version 2 of the License, or (at your option), any later version. + * Copyright (C) 2016+ AzerothCore , released under GNU AGPL v3 license, you may redistribute it + * and/or modify it under version 3 of the License, or (at your option), any later version. */ #include "ChatHelper.h" diff --git a/src/ChatHelper.h b/src/ChatHelper.h index 20b62f3a50..562f230782 100644 --- a/src/ChatHelper.h +++ b/src/ChatHelper.h @@ -1,6 +1,6 @@ /* - * Copyright (C) 2016+ AzerothCore , released under GNU GPL v2 license, you may redistribute it - * and/or modify it under version 2 of the License, or (at your option), any later version. + * Copyright (C) 2016+ AzerothCore , released under GNU AGPL v3 license, you may redistribute it + * and/or modify it under version 3 of the License, or (at your option), any later version. */ #ifndef _PLAYERBOT_CHATHELPER_H diff --git a/src/FleeManager.cpp b/src/FleeManager.cpp index edbfcbaa3c..34e17fe391 100644 --- a/src/FleeManager.cpp +++ b/src/FleeManager.cpp @@ -1,6 +1,6 @@ /* - * Copyright (C) 2016+ AzerothCore , released under GNU GPL v2 license, you may redistribute it - * and/or modify it under version 2 of the License, or (at your option), any later version. + * Copyright (C) 2016+ AzerothCore , released under GNU AGPL v3 license, you may redistribute it + * and/or modify it under version 3 of the License, or (at your option), any later version. */ #include "FleeManager.h" diff --git a/src/FleeManager.h b/src/FleeManager.h index 22caf1f15e..79629769f0 100644 --- a/src/FleeManager.h +++ b/src/FleeManager.h @@ -1,6 +1,6 @@ /* - * Copyright (C) 2016+ AzerothCore , released under GNU GPL v2 license, you may redistribute it - * and/or modify it under version 2 of the License, or (at your option), any later version. + * Copyright (C) 2016+ AzerothCore , released under GNU AGPL v3 license, you may redistribute it + * and/or modify it under version 3 of the License, or (at your option), any later version. */ #ifndef _PLAYERBOT_FLEEMANAGER_H diff --git a/src/GuildTaskMgr.cpp b/src/GuildTaskMgr.cpp index 7a2bc22036..a689abdb86 100644 --- a/src/GuildTaskMgr.cpp +++ b/src/GuildTaskMgr.cpp @@ -1,6 +1,6 @@ /* - * Copyright (C) 2016+ AzerothCore , released under GNU GPL v2 license, you may redistribute it - * and/or modify it under version 2 of the License, or (at your option), any later version. + * Copyright (C) 2016+ AzerothCore , released under GNU AGPL v3 license, you may redistribute it + * and/or modify it under version 3 of the License, or (at your option), any later version. */ #include "GuildTaskMgr.h" diff --git a/src/GuildTaskMgr.h b/src/GuildTaskMgr.h index f6826bf531..c050281ca6 100644 --- a/src/GuildTaskMgr.h +++ b/src/GuildTaskMgr.h @@ -1,6 +1,6 @@ /* - * Copyright (C) 2016+ AzerothCore , released under GNU GPL v2 license, you may redistribute it - * and/or modify it under version 2 of the License, or (at your option), any later version. + * Copyright (C) 2016+ AzerothCore , released under GNU AGPL v3 license, you may redistribute it + * and/or modify it under version 3 of the License, or (at your option), any later version. */ #ifndef _PLAYERBOT_GUILDTASKMGR_H diff --git a/src/Helpers.cpp b/src/Helpers.cpp index 5ab06cb784..84d34c12fa 100644 --- a/src/Helpers.cpp +++ b/src/Helpers.cpp @@ -1,6 +1,6 @@ /* - * Copyright (C) 2016+ AzerothCore , released under GNU GPL v2 license, you may redistribute it - * and/or modify it under version 2 of the License, or (at your option), any later version. + * Copyright (C) 2016+ AzerothCore , released under GNU AGPL v3 license, you may redistribute it + * and/or modify it under version 3 of the License, or (at your option), any later version. */ #include "Helpers.h" diff --git a/src/Helpers.h b/src/Helpers.h index 02340fa645..6a648ad197 100644 --- a/src/Helpers.h +++ b/src/Helpers.h @@ -1,6 +1,6 @@ /* - * Copyright (C) 2016+ AzerothCore , released under GNU GPL v2 license, you may redistribute it - * and/or modify it under version 2 of the License, or (at your option), any later version. + * Copyright (C) 2016+ AzerothCore , released under GNU AGPL v3 license, you may redistribute it + * and/or modify it under version 3 of the License, or (at your option), any later version. */ #ifndef _PLAYERBOT_HELPERS_H diff --git a/src/LazyCalculatedValue.h b/src/LazyCalculatedValue.h index 2d9fd8a1e5..84497b8a8c 100644 --- a/src/LazyCalculatedValue.h +++ b/src/LazyCalculatedValue.h @@ -1,6 +1,6 @@ /* - * Copyright (C) 2016+ AzerothCore , released under GNU GPL v2 license, you may redistribute it - * and/or modify it under version 2 of the License, or (at your option), any later version. + * Copyright (C) 2016+ AzerothCore , released under GNU AGPL v3 license, you may redistribute it + * and/or modify it under version 3 of the License, or (at your option), any later version. */ #ifndef _PLAYERBOT_LAZYCALCULATEDVALUE_H diff --git a/src/LootObjectStack.cpp b/src/LootObjectStack.cpp index b7d0caf9fd..a62eb8fe46 100644 --- a/src/LootObjectStack.cpp +++ b/src/LootObjectStack.cpp @@ -1,6 +1,6 @@ /* - * Copyright (C) 2016+ AzerothCore , released under GNU GPL v2 license, you may redistribute it - * and/or modify it under version 2 of the License, or (at your option), any later version. + * Copyright (C) 2016+ AzerothCore , released under GNU AGPL v3 license, you may redistribute it + * and/or modify it under version 3 of the License, or (at your option), any later version. */ #include "LootObjectStack.h" diff --git a/src/LootObjectStack.h b/src/LootObjectStack.h index 9ff7dd9974..0f87aed709 100644 --- a/src/LootObjectStack.h +++ b/src/LootObjectStack.h @@ -1,6 +1,6 @@ /* - * Copyright (C) 2016+ AzerothCore , released under GNU GPL v2 license, you may redistribute it - * and/or modify it under version 2 of the License, or (at your option), any later version. + * Copyright (C) 2016+ AzerothCore , released under GNU AGPL v3 license, you may redistribute it + * and/or modify it under version 3 of the License, or (at your option), any later version. */ #ifndef _PLAYERBOT_LOOTOBJECTSTACK_H diff --git a/src/PerformanceMonitor.cpp b/src/PerformanceMonitor.cpp index dfe2fbd5ec..99b0989a47 100644 --- a/src/PerformanceMonitor.cpp +++ b/src/PerformanceMonitor.cpp @@ -1,6 +1,6 @@ /* - * Copyright (C) 2016+ AzerothCore , released under GNU GPL v2 license, you may redistribute it - * and/or modify it under version 2 of the License, or (at your option), any later version. + * Copyright (C) 2016+ AzerothCore , released under GNU AGPL v3 license, you may redistribute it + * and/or modify it under version 3 of the License, or (at your option), any later version. */ #include "PerformanceMonitor.h" diff --git a/src/PerformanceMonitor.h b/src/PerformanceMonitor.h index 77f6e64bc1..290cec557c 100644 --- a/src/PerformanceMonitor.h +++ b/src/PerformanceMonitor.h @@ -1,6 +1,6 @@ /* - * Copyright (C) 2016+ AzerothCore , released under GNU GPL v2 license, you may redistribute it - * and/or modify it under version 2 of the License, or (at your option), any later version. + * Copyright (C) 2016+ AzerothCore , released under GNU AGPL v3 license, you may redistribute it + * and/or modify it under version 3 of the License, or (at your option), any later version. */ #ifndef _PLAYERBOT_PERFORMANCEMONITOR_H diff --git a/src/PlaceholderHelper.cpp b/src/PlaceholderHelper.cpp index d2b215e2d9..e41a050fad 100644 --- a/src/PlaceholderHelper.cpp +++ b/src/PlaceholderHelper.cpp @@ -1,6 +1,6 @@ /* - * Copyright (C) 2016+ AzerothCore , released under GNU GPL v2 license, you may redistribute it - * and/or modify it under version 2 of the License, or (at your option), any later version. + * Copyright (C) 2016+ AzerothCore , released under GNU AGPL v3 license, you may redistribute it + * and/or modify it under version 3 of the License, or (at your option), any later version. */ #include "PlaceholderHelper.h" diff --git a/src/PlaceholderHelper.h b/src/PlaceholderHelper.h index c6a50eeaef..2f290b0900 100644 --- a/src/PlaceholderHelper.h +++ b/src/PlaceholderHelper.h @@ -1,6 +1,6 @@ /* - * Copyright (C) 2016+ AzerothCore , released under GNU GPL v2 license, you may redistribute it - * and/or modify it under version 2 of the License, or (at your option), any later version. + * Copyright (C) 2016+ AzerothCore , released under GNU AGPL v3 license, you may redistribute it + * and/or modify it under version 3 of the License, or (at your option), any later version. */ #ifndef _PLAYERBOT_PLACEHOLDERHELPER_H diff --git a/src/PlayerbotAI.cpp b/src/PlayerbotAI.cpp index d529ae34a7..47d37adb11 100644 --- a/src/PlayerbotAI.cpp +++ b/src/PlayerbotAI.cpp @@ -1,6 +1,6 @@ /* - * Copyright (C) 2016+ AzerothCore , released under GNU GPL v2 license, you may redistribute it - * and/or modify it under version 2 of the License, or (at your option), any later version. + * Copyright (C) 2016+ AzerothCore , released under GNU AGPL v3 license, you may redistribute it + * and/or modify it under version 3 of the License, or (at your option), any later version. */ #include "PlayerbotAI.h" diff --git a/src/PlayerbotAI.h b/src/PlayerbotAI.h index f112f9d00d..04deae3a1b 100644 --- a/src/PlayerbotAI.h +++ b/src/PlayerbotAI.h @@ -1,6 +1,6 @@ /* - * Copyright (C) 2016+ AzerothCore , released under GNU GPL v2 license, you may redistribute it - * and/or modify it under version 2 of the License, or (at your option), any later version. + * Copyright (C) 2016+ AzerothCore , released under GNU AGPL v3 license, you may redistribute it + * and/or modify it under version 3 of the License, or (at your option), any later version. */ #ifndef _PLAYERBOT_PLAYERbotAI_H diff --git a/src/PlayerbotAIAware.h b/src/PlayerbotAIAware.h index a43ba60c7c..8e1fda1b42 100644 --- a/src/PlayerbotAIAware.h +++ b/src/PlayerbotAIAware.h @@ -1,6 +1,6 @@ /* - * Copyright (C) 2016+ AzerothCore , released under GNU GPL v2 license, you may redistribute it - * and/or modify it under version 2 of the License, or (at your option), any later version. + * Copyright (C) 2016+ AzerothCore , released under GNU AGPL v3 license, you may redistribute it + * and/or modify it under version 3 of the License, or (at your option), any later version. */ #ifndef _PLAYERBOT_PLAYERbotAIAWARE_H diff --git a/src/PlayerbotAIBase.cpp b/src/PlayerbotAIBase.cpp index 37cc9ebddd..992e83491a 100644 --- a/src/PlayerbotAIBase.cpp +++ b/src/PlayerbotAIBase.cpp @@ -1,6 +1,6 @@ /* - * Copyright (C) 2016+ AzerothCore , released under GNU GPL v2 license, you may redistribute it - * and/or modify it under version 2 of the License, or (at your option), any later version. + * Copyright (C) 2016+ AzerothCore , released under GNU AGPL v3 license, you may redistribute it + * and/or modify it under version 3 of the License, or (at your option), any later version. */ #include "PlayerbotAIBase.h" diff --git a/src/PlayerbotAIBase.h b/src/PlayerbotAIBase.h index 6c1772e29a..2b1f6d3f83 100644 --- a/src/PlayerbotAIBase.h +++ b/src/PlayerbotAIBase.h @@ -1,6 +1,6 @@ /* - * Copyright (C) 2016+ AzerothCore , released under GNU GPL v2 license, you may redistribute it - * and/or modify it under version 2 of the License, or (at your option), any later version. + * Copyright (C) 2016+ AzerothCore , released under GNU AGPL v3 license, you may redistribute it + * and/or modify it under version 3 of the License, or (at your option), any later version. */ #ifndef _PLAYERBOT_PLAYERBOTAIBASE_H diff --git a/src/PlayerbotAIConfig.cpp b/src/PlayerbotAIConfig.cpp index d2a3ff8a84..4eed4223e1 100644 --- a/src/PlayerbotAIConfig.cpp +++ b/src/PlayerbotAIConfig.cpp @@ -1,6 +1,6 @@ /* - * Copyright (C) 2016+ AzerothCore , released under GNU GPL v2 license, you may redistribute it - * and/or modify it under version 2 of the License, or (at your option), any later version. + * Copyright (C) 2016+ AzerothCore , released under GNU AGPL v3 license, you may redistribute it + * and/or modify it under version 3 of the License, or (at your option), any later version. */ #include "PlayerbotAIConfig.h" diff --git a/src/PlayerbotAIConfig.h b/src/PlayerbotAIConfig.h index 48e1b8649a..25cabcb72a 100644 --- a/src/PlayerbotAIConfig.h +++ b/src/PlayerbotAIConfig.h @@ -1,6 +1,6 @@ /* - * Copyright (C) 2016+ AzerothCore , released under GNU GPL v2 license, you may redistribute it - * and/or modify it under version 2 of the License, or (at your option), any later version. + * Copyright (C) 2016+ AzerothCore , released under GNU AGPL v3 license, you may redistribute it + * and/or modify it under version 3 of the License, or (at your option), any later version. */ #ifndef _PLAYERBOT_PLAYERbotAICONFIG_H diff --git a/src/PlayerbotCommandServer.cpp b/src/PlayerbotCommandServer.cpp index 482c234871..83931229a0 100644 --- a/src/PlayerbotCommandServer.cpp +++ b/src/PlayerbotCommandServer.cpp @@ -1,6 +1,6 @@ /* - * Copyright (C) 2016+ AzerothCore , released under GNU GPL v2 license, you may redistribute it - * and/or modify it under version 2 of the License, or (at your option), any later version. + * Copyright (C) 2016+ AzerothCore , released under GNU AGPL v3 license, you may redistribute it + * and/or modify it under version 3 of the License, or (at your option), any later version. */ #include "PlayerbotCommandServer.h" diff --git a/src/PlayerbotCommandServer.h b/src/PlayerbotCommandServer.h index 6ba0d24c63..e1b93a338e 100644 --- a/src/PlayerbotCommandServer.h +++ b/src/PlayerbotCommandServer.h @@ -1,6 +1,6 @@ /* - * Copyright (C) 2016+ AzerothCore , released under GNU GPL v2 license, you may redistribute it - * and/or modify it under version 2 of the License, or (at your option), any later version. + * Copyright (C) 2016+ AzerothCore , released under GNU AGPL v3 license, you may redistribute it + * and/or modify it under version 3 of the License, or (at your option), any later version. */ #ifndef _PLAYERBOT_PLAYERBOTCOMMANDSERVER_H diff --git a/src/PlayerbotDbStore.cpp b/src/PlayerbotDbStore.cpp index 42331ffef4..d66056ec45 100644 --- a/src/PlayerbotDbStore.cpp +++ b/src/PlayerbotDbStore.cpp @@ -1,6 +1,6 @@ /* - * Copyright (C) 2016+ AzerothCore , released under GNU GPL v2 license, you may redistribute it - * and/or modify it under version 2 of the License, or (at your option), any later version. + * Copyright (C) 2016+ AzerothCore , released under GNU AGPL v3 license, you may redistribute it + * and/or modify it under version 3 of the License, or (at your option), any later version. */ #include "PlayerbotDbStore.h" diff --git a/src/PlayerbotDbStore.h b/src/PlayerbotDbStore.h index 184bafd766..713d7f659c 100644 --- a/src/PlayerbotDbStore.h +++ b/src/PlayerbotDbStore.h @@ -1,6 +1,6 @@ /* - * Copyright (C) 2016+ AzerothCore , released under GNU GPL v2 license, you may redistribute it - * and/or modify it under version 2 of the License, or (at your option), any later version. + * Copyright (C) 2016+ AzerothCore , released under GNU AGPL v3 license, you may redistribute it + * and/or modify it under version 3 of the License, or (at your option), any later version. */ #ifndef _PLAYERBOT_PLAYERBOTDBSTORE_H diff --git a/src/PlayerbotDungeonSuggestionMgr.cpp b/src/PlayerbotDungeonSuggestionMgr.cpp index e4402d6ddc..3df2d0d7ea 100644 --- a/src/PlayerbotDungeonSuggestionMgr.cpp +++ b/src/PlayerbotDungeonSuggestionMgr.cpp @@ -1,6 +1,6 @@ /* - * Copyright (C) 2016+ AzerothCore , released under GNU GPL v2 license, you may redistribute it - * and/or modify it under version 2 of the License, or (at your option), any later version. + * Copyright (C) 2016+ AzerothCore , released under GNU AGPL v3 license, you may redistribute it + * and/or modify it under version 3 of the License, or (at your option), any later version. */ #include "PlayerbotDungeonSuggestionMgr.h" diff --git a/src/PlayerbotDungeonSuggestionMgr.h b/src/PlayerbotDungeonSuggestionMgr.h index 5d9bb50a81..74354613d1 100644 --- a/src/PlayerbotDungeonSuggestionMgr.h +++ b/src/PlayerbotDungeonSuggestionMgr.h @@ -1,6 +1,6 @@ /* - * Copyright (C) 2016+ AzerothCore , released under GNU GPL v2 license, you may redistribute it - * and/or modify it under version 2 of the License, or (at your option), any later version. + * Copyright (C) 2016+ AzerothCore , released under GNU AGPL v3 license, you may redistribute it + * and/or modify it under version 3 of the License, or (at your option), any later version. */ #ifndef _PLAYERBOT_PLAYERBOTDUNGEONSUGGESTIONMGR_H diff --git a/src/PlayerbotMgr.cpp b/src/PlayerbotMgr.cpp index 78460b5c97..ba0f4e3924 100644 --- a/src/PlayerbotMgr.cpp +++ b/src/PlayerbotMgr.cpp @@ -1,6 +1,6 @@ /* - * Copyright (C) 2016+ AzerothCore , released under GNU GPL v2 license, you may redistribute it - * and/or modify it under version 2 of the License, or (at your option), any later version. + * Copyright (C) 2016+ AzerothCore , released under GNU AGPL v3 license, you may redistribute it + * and/or modify it under version 3 of the License, or (at your option), any later version. */ #include "PlayerbotMgr.h" diff --git a/src/PlayerbotMgr.h b/src/PlayerbotMgr.h index 5ef3177623..7e1cc52843 100644 --- a/src/PlayerbotMgr.h +++ b/src/PlayerbotMgr.h @@ -1,6 +1,6 @@ /* - * Copyright (C) 2016+ AzerothCore , released under GNU GPL v2 license, you may redistribute it - * and/or modify it under version 2 of the License, or (at your option), any later version. + * Copyright (C) 2016+ AzerothCore , released under GNU AGPL v3 license, you may redistribute it + * and/or modify it under version 3 of the License, or (at your option), any later version. */ #ifndef _PLAYERBOT_PLAYERBOTMGR_H diff --git a/src/PlayerbotSecurity.cpp b/src/PlayerbotSecurity.cpp index 3c8cafe977..45e8598989 100644 --- a/src/PlayerbotSecurity.cpp +++ b/src/PlayerbotSecurity.cpp @@ -1,6 +1,6 @@ /* - * Copyright (C) 2016+ AzerothCore , released under GNU GPL v2 license, you may redistribute it - * and/or modify it under version 2 of the License, or (at your option), any later version. + * Copyright (C) 2016+ AzerothCore , released under GNU AGPL v3 license, you may redistribute it + * and/or modify it under version 3 of the License, or (at your option), any later version. */ #include "PlayerbotSecurity.h" diff --git a/src/PlayerbotSecurity.h b/src/PlayerbotSecurity.h index f294759513..e73108dc16 100644 --- a/src/PlayerbotSecurity.h +++ b/src/PlayerbotSecurity.h @@ -1,6 +1,6 @@ /* - * Copyright (C) 2016+ AzerothCore , released under GNU GPL v2 license, you may redistribute it - * and/or modify it under version 2 of the License, or (at your option), any later version. + * Copyright (C) 2016+ AzerothCore , released under GNU AGPL v3 license, you may redistribute it + * and/or modify it under version 3 of the License, or (at your option), any later version. */ #ifndef _PLAYERBOT_PLAYERBOTSECURITY_H diff --git a/src/PlayerbotTextMgr.cpp b/src/PlayerbotTextMgr.cpp index e758d630b9..3caa96a738 100644 --- a/src/PlayerbotTextMgr.cpp +++ b/src/PlayerbotTextMgr.cpp @@ -1,6 +1,6 @@ /* - * Copyright (C) 2016+ AzerothCore , released under GNU GPL v2 license, you may redistribute it - * and/or modify it under version 2 of the License, or (at your option), any later version. + * Copyright (C) 2016+ AzerothCore , released under GNU AGPL v3 license, you may redistribute it + * and/or modify it under version 3 of the License, or (at your option), any later version. */ #include "PlayerbotTextMgr.h" diff --git a/src/PlayerbotTextMgr.h b/src/PlayerbotTextMgr.h index 05c47ce26f..f4ec2c403c 100644 --- a/src/PlayerbotTextMgr.h +++ b/src/PlayerbotTextMgr.h @@ -1,6 +1,6 @@ /* - * Copyright (C) 2016+ AzerothCore , released under GNU GPL v2 license, you may redistribute it - * and/or modify it under version 2 of the License, or (at your option), any later version. + * Copyright (C) 2016+ AzerothCore , released under GNU AGPL v3 license, you may redistribute it + * and/or modify it under version 3 of the License, or (at your option), any later version. */ #ifndef _PLAYERBOT_PLAYERBOTTEXTMGR_H diff --git a/src/Playerbots.h b/src/Playerbots.h index 5b82771b60..72ea9e4f79 100644 --- a/src/Playerbots.h +++ b/src/Playerbots.h @@ -1,6 +1,6 @@ /* - * Copyright (C) 2016+ AzerothCore , released under GNU GPL v2 license, you may redistribute it - * and/or modify it under version 2 of the License, or (at your option), any later version. + * Copyright (C) 2016+ AzerothCore , released under GNU AGPL v3 license, you may redistribute it + * and/or modify it under version 3 of the License, or (at your option), any later version. */ #ifndef _PLAYERBOT_H diff --git a/src/RandomItemMgr.cpp b/src/RandomItemMgr.cpp index c5783a4f5e..f99c49590b 100644 --- a/src/RandomItemMgr.cpp +++ b/src/RandomItemMgr.cpp @@ -1,6 +1,6 @@ /* - * Copyright (C) 2016+ AzerothCore , released under GNU GPL v2 license, you may redistribute it - * and/or modify it under version 2 of the License, or (at your option), any later version. + * Copyright (C) 2016+ AzerothCore , released under GNU AGPL v3 license, you may redistribute it + * and/or modify it under version 3 of the License, or (at your option), any later version. */ #include "RandomItemMgr.h" diff --git a/src/RandomItemMgr.h b/src/RandomItemMgr.h index 6ff954a036..216ddf9bfc 100644 --- a/src/RandomItemMgr.h +++ b/src/RandomItemMgr.h @@ -1,6 +1,6 @@ /* - * Copyright (C) 2016+ AzerothCore , released under GNU GPL v2 license, you may redistribute it - * and/or modify it under version 2 of the License, or (at your option), any later version. + * Copyright (C) 2016+ AzerothCore , released under GNU AGPL v3 license, you may redistribute it + * and/or modify it under version 3 of the License, or (at your option), any later version. */ #ifndef _PLAYERBOT_RANDOMITEMMGR_H diff --git a/src/RandomPlayerbotFactory.cpp b/src/RandomPlayerbotFactory.cpp index 94f6928e48..37d6ba49ea 100644 --- a/src/RandomPlayerbotFactory.cpp +++ b/src/RandomPlayerbotFactory.cpp @@ -1,6 +1,6 @@ /* -* Copyright (C) 2016+ AzerothCore , released under GNU GPL v2 license, you may redistribute it -* and/or modify it under version 2 of the License, or (at your option), any later version. +* Copyright (C) 2016+ AzerothCore , released under GNU AGPL v3 license, you may redistribute it +* and/or modify it under version 3 of the License, or (at your option), any later version. */ #include "RandomPlayerbotFactory.h" diff --git a/src/RandomPlayerbotFactory.h b/src/RandomPlayerbotFactory.h index 94e5153792..e74926a20e 100644 --- a/src/RandomPlayerbotFactory.h +++ b/src/RandomPlayerbotFactory.h @@ -1,6 +1,6 @@ /* - * Copyright (C) 2016+ AzerothCore , released under GNU GPL v2 license, you may redistribute it - * and/or modify it under version 2 of the License, or (at your option), any later version. + * Copyright (C) 2016+ AzerothCore , released under GNU AGPL v3 license, you may redistribute it + * and/or modify it under version 3 of the License, or (at your option), any later version. */ #ifndef _PLAYERBOT_RANDOMPLAYERBOTFACTORY_H diff --git a/src/RandomPlayerbotMgr.cpp b/src/RandomPlayerbotMgr.cpp index c0a9d25f83..ab28c25da4 100644 --- a/src/RandomPlayerbotMgr.cpp +++ b/src/RandomPlayerbotMgr.cpp @@ -1,6 +1,6 @@ /* - * Copyright (C) 2016+ AzerothCore , released under GNU GPL v2 license, you may redistribute it - * and/or modify it under version 2 of the License, or (at your option), any later version. + * Copyright (C) 2016+ AzerothCore , released under GNU AGPL v3 license, you may redistribute it + * and/or modify it under version 3 of the License, or (at your option), any later version. */ #include "RandomPlayerbotMgr.h" diff --git a/src/RandomPlayerbotMgr.h b/src/RandomPlayerbotMgr.h index ed4c1cd2f9..be624328d6 100644 --- a/src/RandomPlayerbotMgr.h +++ b/src/RandomPlayerbotMgr.h @@ -1,6 +1,6 @@ /* - * Copyright (C) 2016+ AzerothCore , released under GNU GPL v2 license, you may redistribute it - * and/or modify it under version 2 of the License, or (at your option), any later version. + * Copyright (C) 2016+ AzerothCore , released under GNU AGPL v3 license, you may redistribute it + * and/or modify it under version 3 of the License, or (at your option), any later version. */ #ifndef _PLAYERBOT_RANDOMPLAYERBOTMGR_H diff --git a/src/ServerFacade.cpp b/src/ServerFacade.cpp index 8266e8ddfd..61b9b0d43f 100644 --- a/src/ServerFacade.cpp +++ b/src/ServerFacade.cpp @@ -1,6 +1,6 @@ /* - * Copyright (C) 2016+ AzerothCore , released under GNU GPL v2 license, you may redistribute it - * and/or modify it under version 2 of the License, or (at your option), any later version. + * Copyright (C) 2016+ AzerothCore , released under GNU AGPL v3 license, you may redistribute it + * and/or modify it under version 3 of the License, or (at your option), any later version. */ #include "ServerFacade.h" diff --git a/src/ServerFacade.h b/src/ServerFacade.h index 13e21124c0..0ea93f0779 100644 --- a/src/ServerFacade.h +++ b/src/ServerFacade.h @@ -1,6 +1,6 @@ /* - * Copyright (C) 2016+ AzerothCore , released under GNU GPL v2 license, you may redistribute it - * and/or modify it under version 2 of the License, or (at your option), any later version. + * Copyright (C) 2016+ AzerothCore , released under GNU AGPL v3 license, you may redistribute it + * and/or modify it under version 3 of the License, or (at your option), any later version. */ #ifndef _PLAYERBOT_SERVERFACADE_H diff --git a/src/Talentspec.cpp b/src/Talentspec.cpp index aa22ae5e87..06e70b841c 100644 --- a/src/Talentspec.cpp +++ b/src/Talentspec.cpp @@ -1,6 +1,6 @@ /* - * Copyright (C) 2016+ AzerothCore , released under GNU GPL v2 license, you may redistribute it - * and/or modify it under version 2 of the License, or (at your option), any later version. + * Copyright (C) 2016+ AzerothCore , released under GNU AGPL v3 license, you may redistribute it + * and/or modify it under version 3 of the License, or (at your option), any later version. */ #include "Talentspec.h" diff --git a/src/Talentspec.h b/src/Talentspec.h index aba3905907..8cb63e44d9 100644 --- a/src/Talentspec.h +++ b/src/Talentspec.h @@ -1,6 +1,6 @@ /* - * Copyright (C) 2016+ AzerothCore , released under GNU GPL v2 license, you may redistribute it - * and/or modify it under version 2 of the License, or (at your option), any later version. + * Copyright (C) 2016+ AzerothCore , released under GNU AGPL v3 license, you may redistribute it + * and/or modify it under version 3 of the License, or (at your option), any later version. */ #ifndef _PLAYERBOT_TALENTSPEC_H diff --git a/src/TravelMgr.cpp b/src/TravelMgr.cpp index 69d510b9e7..f8df8bfea9 100644 --- a/src/TravelMgr.cpp +++ b/src/TravelMgr.cpp @@ -1,6 +1,6 @@ /* - * Copyright (C) 2016+ AzerothCore , released under GNU GPL v2 license, you may redistribute it - * and/or modify it under version 2 of the License, or (at your option), any later version. + * Copyright (C) 2016+ AzerothCore , released under GNU AGPL v3 license, you may redistribute it + * and/or modify it under version 3 of the License, or (at your option), any later version. */ #include "TravelMgr.h" diff --git a/src/TravelMgr.h b/src/TravelMgr.h index 46d76665f9..c1c2ec0d2d 100644 --- a/src/TravelMgr.h +++ b/src/TravelMgr.h @@ -1,6 +1,6 @@ /* - * Copyright (C) 2016+ AzerothCore , released under GNU GPL v2 license, you may redistribute it - * and/or modify it under version 2 of the License, or (at your option), any later version. + * Copyright (C) 2016+ AzerothCore , released under GNU AGPL v3 license, you may redistribute it + * and/or modify it under version 3 of the License, or (at your option), any later version. */ #ifndef _PLAYERBOT_TRAVELMGR_H diff --git a/src/TravelNode.cpp b/src/TravelNode.cpp index 096a0b9736..a29bebf104 100644 --- a/src/TravelNode.cpp +++ b/src/TravelNode.cpp @@ -1,6 +1,6 @@ /* - * Copyright (C) 2016+ AzerothCore , released under GNU GPL v2 license, you may redistribute it - * and/or modify it under version 2 of the License, or (at your option), any later version. + * Copyright (C) 2016+ AzerothCore , released under GNU AGPL v3 license, you may redistribute it + * and/or modify it under version 3 of the License, or (at your option), any later version. */ #include "TravelNode.h" diff --git a/src/TravelNode.h b/src/TravelNode.h index abc70eb038..3a86cbb169 100644 --- a/src/TravelNode.h +++ b/src/TravelNode.h @@ -1,6 +1,6 @@ /* - * Copyright (C) 2016+ AzerothCore , released under GNU GPL v2 license, you may redistribute it - * and/or modify it under version 2 of the License, or (at your option), any later version. + * Copyright (C) 2016+ AzerothCore , released under GNU AGPL v3 license, you may redistribute it + * and/or modify it under version 3 of the License, or (at your option), any later version. */ #ifndef _PLAYERBOT_TRAVELNODE_H diff --git a/src/factory/PlayerbotFactory.cpp b/src/factory/PlayerbotFactory.cpp index 60b6ec69b7..9eed6a5f4d 100644 --- a/src/factory/PlayerbotFactory.cpp +++ b/src/factory/PlayerbotFactory.cpp @@ -1,6 +1,6 @@ /* - * Copyright (C) 2016+ AzerothCore , released under GNU GPL v2 license, you may redistribute it - * and/or modify it under version 2 of the License, or (at your option), any later version. + * Copyright (C) 2016+ AzerothCore , released under GNU AGPL v3 license, you may redistribute it + * and/or modify it under version 3 of the License, or (at your option), any later version. */ #include "PlayerbotFactory.h" diff --git a/src/factory/PlayerbotFactory.h b/src/factory/PlayerbotFactory.h index 277d7b123c..2fec9fcda6 100644 --- a/src/factory/PlayerbotFactory.h +++ b/src/factory/PlayerbotFactory.h @@ -1,6 +1,6 @@ /* - * Copyright (C) 2016+ AzerothCore , released under GNU GPL v2 license, you may redistribute it - * and/or modify it under version 2 of the License, or (at your option), any later version. + * Copyright (C) 2016+ AzerothCore , released under GNU AGPL v3 license, you may redistribute it + * and/or modify it under version 3 of the License, or (at your option), any later version. */ #ifndef _PLAYERBOT_PLAYERBOTFACTORY_H diff --git a/src/factory/StatsCollector.h b/src/factory/StatsCollector.h index a8e6bc549a..27ef871ec5 100644 --- a/src/factory/StatsCollector.h +++ b/src/factory/StatsCollector.h @@ -1,6 +1,6 @@ /* - * Copyright (C) 2016+ AzerothCore , released under GNU GPL v2 license, you may redistribute it - * and/or modify it under version 2 of the License, or (at your option), any later version. + * Copyright (C) 2016+ AzerothCore , released under GNU AGPL v3 license, you may redistribute it + * and/or modify it under version 3 of the License, or (at your option), any later version. */ #ifndef _PLAYERBOT_STATSCOLLECTOR_H diff --git a/src/factory/StatsWeightCalculator.cpp b/src/factory/StatsWeightCalculator.cpp index 2963c7419b..a42ce6f296 100644 --- a/src/factory/StatsWeightCalculator.cpp +++ b/src/factory/StatsWeightCalculator.cpp @@ -1,6 +1,6 @@ /* - * Copyright (C) 2016+ AzerothCore , released under GNU GPL v2 license, you may redistribute it - * and/or modify it under version 2 of the License, or (at your option), any later version. + * Copyright (C) 2016+ AzerothCore , released under GNU AGPL v3 license, you may redistribute it + * and/or modify it under version 3 of the License, or (at your option), any later version. */ #include "StatsWeightCalculator.h" diff --git a/src/factory/StatsWeightCalculator.h b/src/factory/StatsWeightCalculator.h index 24d705a1c1..4390e6af1e 100644 --- a/src/factory/StatsWeightCalculator.h +++ b/src/factory/StatsWeightCalculator.h @@ -1,6 +1,6 @@ /* - * Copyright (C) 2016+ AzerothCore , released under GNU GPL v2 license, you may redistribute it - * and/or modify it under version 2 of the License, or (at your option), any later version. + * Copyright (C) 2016+ AzerothCore , released under GNU AGPL v3 license, you may redistribute it + * and/or modify it under version 3 of the License, or (at your option), any later version. */ #ifndef _PLAYERBOT_GEARSCORECALCULATOR_H diff --git a/src/strategy/Action.cpp b/src/strategy/Action.cpp index 5072cdf9d9..08c0af98d4 100644 --- a/src/strategy/Action.cpp +++ b/src/strategy/Action.cpp @@ -1,6 +1,6 @@ /* - * Copyright (C) 2016+ AzerothCore , released under GNU GPL v2 license, you may redistribute it - * and/or modify it under version 2 of the License, or (at your option), any later version. + * Copyright (C) 2016+ AzerothCore , released under GNU AGPL v3 license, you may redistribute it + * and/or modify it under version 3 of the License, or (at your option), any later version. */ #include "Action.h" diff --git a/src/strategy/Action.h b/src/strategy/Action.h index 03224f5673..5087a42b1c 100644 --- a/src/strategy/Action.h +++ b/src/strategy/Action.h @@ -1,6 +1,6 @@ /* - * Copyright (C) 2016+ AzerothCore , released under GNU GPL v2 license, you may redistribute it - * and/or modify it under version 2 of the License, or (at your option), any later version. + * Copyright (C) 2016+ AzerothCore , released under GNU AGPL v3 license, you may redistribute it + * and/or modify it under version 3 of the License, or (at your option), any later version. */ #ifndef _PLAYERBOT_ACTION_H diff --git a/src/strategy/AiObject.cpp b/src/strategy/AiObject.cpp index 5de5923e1d..fd57a5d6e1 100644 --- a/src/strategy/AiObject.cpp +++ b/src/strategy/AiObject.cpp @@ -1,6 +1,6 @@ /* - * Copyright (C) 2016+ AzerothCore , released under GNU GPL v2 license, you may redistribute it - * and/or modify it under version 2 of the License, or (at your option), any later version. + * Copyright (C) 2016+ AzerothCore , released under GNU AGPL v3 license, you may redistribute it + * and/or modify it under version 3 of the License, or (at your option), any later version. */ #include "AiObject.h" diff --git a/src/strategy/AiObject.h b/src/strategy/AiObject.h index d7ffa84d8f..4312313f5b 100644 --- a/src/strategy/AiObject.h +++ b/src/strategy/AiObject.h @@ -1,6 +1,6 @@ /* - * Copyright (C) 2016+ AzerothCore , released under GNU GPL v2 license, you may redistribute it - * and/or modify it under version 2 of the License, or (at your option), any later version. + * Copyright (C) 2016+ AzerothCore , released under GNU AGPL v3 license, you may redistribute it + * and/or modify it under version 3 of the License, or (at your option), any later version. */ #ifndef _PLAYERBOT_AIOBJECT_H diff --git a/src/strategy/AiObjectContext.cpp b/src/strategy/AiObjectContext.cpp index dd025c2e83..0789f9baa3 100644 --- a/src/strategy/AiObjectContext.cpp +++ b/src/strategy/AiObjectContext.cpp @@ -1,6 +1,6 @@ /* - * Copyright (C) 2016+ AzerothCore , released under GNU GPL v2 license, you may redistribute it - * and/or modify it under version 2 of the License, or (at your option), any later version. + * Copyright (C) 2016+ AzerothCore , released under GNU AGPL v3 license, you may redistribute it + * and/or modify it under version 3 of the License, or (at your option), any later version. */ #include "AiObjectContext.h" diff --git a/src/strategy/AiObjectContext.h b/src/strategy/AiObjectContext.h index c65ad8ae2b..3ffd1850ff 100644 --- a/src/strategy/AiObjectContext.h +++ b/src/strategy/AiObjectContext.h @@ -1,6 +1,6 @@ /* - * Copyright (C) 2016+ AzerothCore , released under GNU GPL v2 license, you may redistribute it - * and/or modify it under version 2 of the License, or (at your option), any later version. + * Copyright (C) 2016+ AzerothCore , released under GNU AGPL v3 license, you may redistribute it + * and/or modify it under version 3 of the License, or (at your option), any later version. */ #ifndef _PLAYERBOT_AIOBJECTCONTEXT_H diff --git a/src/strategy/CustomStrategy.cpp b/src/strategy/CustomStrategy.cpp index cc6496d135..a056aed5e1 100644 --- a/src/strategy/CustomStrategy.cpp +++ b/src/strategy/CustomStrategy.cpp @@ -1,6 +1,6 @@ /* - * Copyright (C) 2016+ AzerothCore , released under GNU GPL v2 license, you may redistribute it - * and/or modify it under version 2 of the License, or (at your option), any later version. + * Copyright (C) 2016+ AzerothCore , released under GNU AGPL v3 license, you may redistribute it + * and/or modify it under version 3 of the License, or (at your option), any later version. */ #include "CustomStrategy.h" diff --git a/src/strategy/CustomStrategy.h b/src/strategy/CustomStrategy.h index 82ec4d2bb6..9a4007952d 100644 --- a/src/strategy/CustomStrategy.h +++ b/src/strategy/CustomStrategy.h @@ -1,6 +1,6 @@ /* - * Copyright (C) 2016+ AzerothCore , released under GNU GPL v2 license, you may redistribute it - * and/or modify it under version 2 of the License, or (at your option), any later version. + * Copyright (C) 2016+ AzerothCore , released under GNU AGPL v3 license, you may redistribute it + * and/or modify it under version 3 of the License, or (at your option), any later version. */ #ifndef _PLAYERBOT_CUSTOMSTRATEGY_H diff --git a/src/strategy/Engine.cpp b/src/strategy/Engine.cpp index b62ac483cb..c1072ff9f6 100644 --- a/src/strategy/Engine.cpp +++ b/src/strategy/Engine.cpp @@ -1,6 +1,6 @@ /* - * Copyright (C) 2016+ AzerothCore , released under GNU GPL v2 license, you may redistribute it - * and/or modify it under version 2 of the License, or (at your option), any later version. + * Copyright (C) 2016+ AzerothCore , released under GNU AGPL v3 license, you may redistribute it + * and/or modify it under version 3 of the License, or (at your option), any later version. */ #include "Engine.h" diff --git a/src/strategy/Engine.h b/src/strategy/Engine.h index 8a662997bc..6b98e04f42 100644 --- a/src/strategy/Engine.h +++ b/src/strategy/Engine.h @@ -1,6 +1,6 @@ /* - * Copyright (C) 2016+ AzerothCore , released under GNU GPL v2 license, you may redistribute it - * and/or modify it under version 2 of the License, or (at your option), any later version. + * Copyright (C) 2016+ AzerothCore , released under GNU AGPL v3 license, you may redistribute it + * and/or modify it under version 3 of the License, or (at your option), any later version. */ #ifndef _PLAYERBOT_ENGINE_H diff --git a/src/strategy/Event.cpp b/src/strategy/Event.cpp index 1835d19caf..5bee3a3225 100644 --- a/src/strategy/Event.cpp +++ b/src/strategy/Event.cpp @@ -1,6 +1,6 @@ /* - * Copyright (C) 2016+ AzerothCore , released under GNU GPL v2 license, you may redistribute it - * and/or modify it under version 2 of the License, or (at your option), any later version. + * Copyright (C) 2016+ AzerothCore , released under GNU AGPL v3 license, you may redistribute it + * and/or modify it under version 3 of the License, or (at your option), any later version. */ #include "Event.h" diff --git a/src/strategy/Event.h b/src/strategy/Event.h index 0ec10658c3..6caf4e92f3 100644 --- a/src/strategy/Event.h +++ b/src/strategy/Event.h @@ -1,6 +1,6 @@ /* - * Copyright (C) 2016+ AzerothCore , released under GNU GPL v2 license, you may redistribute it - * and/or modify it under version 2 of the License, or (at your option), any later version. + * Copyright (C) 2016+ AzerothCore , released under GNU AGPL v3 license, you may redistribute it + * and/or modify it under version 3 of the License, or (at your option), any later version. */ #ifndef _PLAYERBOT_EVENT_H diff --git a/src/strategy/ExternalEventHelper.cpp b/src/strategy/ExternalEventHelper.cpp index f5647cf411..2f42eee920 100644 --- a/src/strategy/ExternalEventHelper.cpp +++ b/src/strategy/ExternalEventHelper.cpp @@ -1,6 +1,6 @@ /* - * Copyright (C) 2016+ AzerothCore , released under GNU GPL v2 license, you may redistribute it - * and/or modify it under version 2 of the License, or (at your option), any later version. + * Copyright (C) 2016+ AzerothCore , released under GNU AGPL v3 license, you may redistribute it + * and/or modify it under version 3 of the License, or (at your option), any later version. */ #include "ExternalEventHelper.h" diff --git a/src/strategy/ExternalEventHelper.h b/src/strategy/ExternalEventHelper.h index 6e1e70e3b0..7e95c556df 100644 --- a/src/strategy/ExternalEventHelper.h +++ b/src/strategy/ExternalEventHelper.h @@ -1,6 +1,6 @@ /* - * Copyright (C) 2016+ AzerothCore , released under GNU GPL v2 license, you may redistribute it - * and/or modify it under version 2 of the License, or (at your option), any later version. + * Copyright (C) 2016+ AzerothCore , released under GNU AGPL v3 license, you may redistribute it + * and/or modify it under version 3 of the License, or (at your option), any later version. */ #ifndef _PLAYERBOT_EXTERNALEVENTHELPER_H diff --git a/src/strategy/ItemVisitors.cpp b/src/strategy/ItemVisitors.cpp index 2579fe9f83..5615146f63 100644 --- a/src/strategy/ItemVisitors.cpp +++ b/src/strategy/ItemVisitors.cpp @@ -1,6 +1,6 @@ /* - * Copyright (C) 2016+ AzerothCore , released under GNU GPL v2 license, you may redistribute it - * and/or modify it under version 2 of the License, or (at your option), any later version. + * Copyright (C) 2016+ AzerothCore , released under GNU AGPL v3 license, you may redistribute it + * and/or modify it under version 3 of the License, or (at your option), any later version. */ #include "ItemVisitors.h" diff --git a/src/strategy/ItemVisitors.h b/src/strategy/ItemVisitors.h index 009414889d..e42b14f89e 100644 --- a/src/strategy/ItemVisitors.h +++ b/src/strategy/ItemVisitors.h @@ -1,6 +1,6 @@ /* - * Copyright (C) 2016+ AzerothCore , released under GNU GPL v2 license, you may redistribute it - * and/or modify it under version 2 of the License, or (at your option), any later version. + * Copyright (C) 2016+ AzerothCore , released under GNU AGPL v3 license, you may redistribute it + * and/or modify it under version 3 of the License, or (at your option), any later version. */ #ifndef _PLAYERBOT_ITEMVISITORS_H diff --git a/src/strategy/Multiplier.h b/src/strategy/Multiplier.h index 133bda869a..5a8bba68b3 100644 --- a/src/strategy/Multiplier.h +++ b/src/strategy/Multiplier.h @@ -1,6 +1,6 @@ /* - * Copyright (C) 2016+ AzerothCore , released under GNU GPL v2 license, you may redistribute it - * and/or modify it under version 2 of the License, or (at your option), any later version. + * Copyright (C) 2016+ AzerothCore , released under GNU AGPL v3 license, you may redistribute it + * and/or modify it under version 3 of the License, or (at your option), any later version. */ #ifndef _PLAYERBOT_MULTIPLIER_H diff --git a/src/strategy/NamedObjectContext.cpp b/src/strategy/NamedObjectContext.cpp index ae3a7079d7..fcb85261d4 100644 --- a/src/strategy/NamedObjectContext.cpp +++ b/src/strategy/NamedObjectContext.cpp @@ -1,6 +1,6 @@ /* - * Copyright (C) 2016+ AzerothCore , released under GNU GPL v2 license, you may redistribute it - * and/or modify it under version 2 of the License, or (at your option), any later version. + * Copyright (C) 2016+ AzerothCore , released under GNU AGPL v3 license, you may redistribute it + * and/or modify it under version 3 of the License, or (at your option), any later version. */ #include "NamedObjectContext.h" diff --git a/src/strategy/NamedObjectContext.h b/src/strategy/NamedObjectContext.h index 846026c25d..af8c4ecec6 100644 --- a/src/strategy/NamedObjectContext.h +++ b/src/strategy/NamedObjectContext.h @@ -1,6 +1,6 @@ /* - * Copyright (C) 2016+ AzerothCore , released under GNU GPL v2 license, you may redistribute it - * and/or modify it under version 2 of the License, or (at your option), any later version. + * Copyright (C) 2016+ AzerothCore , released under GNU AGPL v3 license, you may redistribute it + * and/or modify it under version 3 of the License, or (at your option), any later version. */ #ifndef _PLAYERBOT_NAMEDOBJECTCONEXT_H diff --git a/src/strategy/PassiveMultiplier.cpp b/src/strategy/PassiveMultiplier.cpp index 461947d83a..0b95e01a57 100644 --- a/src/strategy/PassiveMultiplier.cpp +++ b/src/strategy/PassiveMultiplier.cpp @@ -1,6 +1,6 @@ /* - * Copyright (C) 2016+ AzerothCore , released under GNU GPL v2 license, you may redistribute it - * and/or modify it under version 2 of the License, or (at your option), any later version. + * Copyright (C) 2016+ AzerothCore , released under GNU AGPL v3 license, you may redistribute it + * and/or modify it under version 3 of the License, or (at your option), any later version. */ #include "PassiveMultiplier.h" diff --git a/src/strategy/PassiveMultiplier.h b/src/strategy/PassiveMultiplier.h index 3f8abb1054..b407f93378 100644 --- a/src/strategy/PassiveMultiplier.h +++ b/src/strategy/PassiveMultiplier.h @@ -1,6 +1,6 @@ /* - * Copyright (C) 2016+ AzerothCore , released under GNU GPL v2 license, you may redistribute it - * and/or modify it under version 2 of the License, or (at your option), any later version. + * Copyright (C) 2016+ AzerothCore , released under GNU AGPL v3 license, you may redistribute it + * and/or modify it under version 3 of the License, or (at your option), any later version. */ #ifndef _PLAYERBOT_PASSIVEMULTIPLIER_H diff --git a/src/strategy/Queue.cpp b/src/strategy/Queue.cpp index af08dcc779..136e1b4381 100644 --- a/src/strategy/Queue.cpp +++ b/src/strategy/Queue.cpp @@ -1,6 +1,6 @@ /* - * Copyright (C) 2016+ AzerothCore , released under GNU GPL v2 license, you may redistribute it - * and/or modify it under version 2 of the License, or (at your option), any later version. + * Copyright (C) 2016+ AzerothCore , released under GNU AGPL v3 license, you may redistribute it + * and/or modify it under version 3 of the License, or (at your option), any later version. */ #include "Queue.h" diff --git a/src/strategy/Queue.h b/src/strategy/Queue.h index 0ba171125a..b8a486dc85 100644 --- a/src/strategy/Queue.h +++ b/src/strategy/Queue.h @@ -1,6 +1,6 @@ /* - * Copyright (C) 2016+ AzerothCore , released under GNU GPL v2 license, you may redistribute it - * and/or modify it under version 2 of the License, or (at your option), any later version. + * Copyright (C) 2016+ AzerothCore , released under GNU AGPL v3 license, you may redistribute it + * and/or modify it under version 3 of the License, or (at your option), any later version. */ #ifndef PLAYERBOT_QUEUE_H diff --git a/src/strategy/Strategy.cpp b/src/strategy/Strategy.cpp index 3f1c301050..753615c498 100644 --- a/src/strategy/Strategy.cpp +++ b/src/strategy/Strategy.cpp @@ -1,6 +1,6 @@ /* - * Copyright (C) 2016+ AzerothCore , released under GNU GPL v2 license, you may redistribute it - * and/or modify it under version 2 of the License, or (at your option), any later version. + * Copyright (C) 2016+ AzerothCore , released under GNU AGPL v3 license, you may redistribute it + * and/or modify it under version 3 of the License, or (at your option), any later version. */ #include "Strategy.h" diff --git a/src/strategy/Strategy.h b/src/strategy/Strategy.h index e597d39478..333906fe73 100644 --- a/src/strategy/Strategy.h +++ b/src/strategy/Strategy.h @@ -1,6 +1,6 @@ /* - * Copyright (C) 2016+ AzerothCore , released under GNU GPL v2 license, you may redistribute it - * and/or modify it under version 2 of the License, or (at your option), any later version. + * Copyright (C) 2016+ AzerothCore , released under GNU AGPL v3 license, you may redistribute it + * and/or modify it under version 3 of the License, or (at your option), any later version. */ #ifndef _PLAYERBOT_STRATEGY_H diff --git a/src/strategy/StrategyContext.h b/src/strategy/StrategyContext.h index a95ccbdf51..e0a9679736 100644 --- a/src/strategy/StrategyContext.h +++ b/src/strategy/StrategyContext.h @@ -1,6 +1,6 @@ /* - * Copyright (C) 2016+ AzerothCore , released under GNU GPL v2 license, you may redistribute it - * and/or modify it under version 2 of the License, or (at your option), any later version. + * Copyright (C) 2016+ AzerothCore , released under GNU AGPL v3 license, you may redistribute it + * and/or modify it under version 3 of the License, or (at your option), any later version. */ #ifndef _PLAYERBOT_STRATEGYCONTEXT_H diff --git a/src/strategy/Trigger.cpp b/src/strategy/Trigger.cpp index 89f616968e..07105be299 100644 --- a/src/strategy/Trigger.cpp +++ b/src/strategy/Trigger.cpp @@ -1,6 +1,6 @@ /* - * Copyright (C) 2016+ AzerothCore , released under GNU GPL v2 license, you may redistribute it - * and/or modify it under version 2 of the License, or (at your option), any later version. + * Copyright (C) 2016+ AzerothCore , released under GNU AGPL v3 license, you may redistribute it + * and/or modify it under version 3 of the License, or (at your option), any later version. */ #include "Trigger.h" diff --git a/src/strategy/Trigger.h b/src/strategy/Trigger.h index af8d0528ba..8b391730ee 100644 --- a/src/strategy/Trigger.h +++ b/src/strategy/Trigger.h @@ -1,6 +1,6 @@ /* - * Copyright (C) 2016+ AzerothCore , released under GNU GPL v2 license, you may redistribute it - * and/or modify it under version 2 of the License, or (at your option), any later version. + * Copyright (C) 2016+ AzerothCore , released under GNU AGPL v3 license, you may redistribute it + * and/or modify it under version 3 of the License, or (at your option), any later version. */ #ifndef _PLAYERBOT_TRIGGER_H diff --git a/src/strategy/Value.cpp b/src/strategy/Value.cpp index 82f8a45c48..ac10774c65 100644 --- a/src/strategy/Value.cpp +++ b/src/strategy/Value.cpp @@ -1,6 +1,6 @@ /* - * Copyright (C) 2016+ AzerothCore , released under GNU GPL v2 license, you may redistribute it - * and/or modify it under version 2 of the License, or (at your option), any later version. + * Copyright (C) 2016+ AzerothCore , released under GNU AGPL v3 license, you may redistribute it + * and/or modify it under version 3 of the License, or (at your option), any later version. */ #include "Value.h" diff --git a/src/strategy/Value.h b/src/strategy/Value.h index a4189f78c6..8c370226f2 100644 --- a/src/strategy/Value.h +++ b/src/strategy/Value.h @@ -1,6 +1,6 @@ /* - * Copyright (C) 2016+ AzerothCore , released under GNU GPL v2 license, you may redistribute it - * and/or modify it under version 2 of the License, or (at your option), any later version. + * Copyright (C) 2016+ AzerothCore , released under GNU AGPL v3 license, you may redistribute it + * and/or modify it under version 3 of the License, or (at your option), any later version. */ #ifndef _PLAYERBOT_VALUE_H diff --git a/src/strategy/actions/AcceptBattlegroundInvitationAction.cpp b/src/strategy/actions/AcceptBattlegroundInvitationAction.cpp index 7ff304336f..96d61d4ba3 100644 --- a/src/strategy/actions/AcceptBattlegroundInvitationAction.cpp +++ b/src/strategy/actions/AcceptBattlegroundInvitationAction.cpp @@ -1,6 +1,6 @@ /* - * Copyright (C) 2016+ AzerothCore , released under GNU GPL v2 license, you may redistribute it - * and/or modify it under version 2 of the License, or (at your option), any later version. + * Copyright (C) 2016+ AzerothCore , released under GNU AGPL v3 license, you may redistribute it + * and/or modify it under version 3 of the License, or (at your option), any later version. */ #include "AcceptBattlegroundInvitationAction.h" diff --git a/src/strategy/actions/AcceptBattlegroundInvitationAction.h b/src/strategy/actions/AcceptBattlegroundInvitationAction.h index da9662fe3c..5ff4f439e8 100644 --- a/src/strategy/actions/AcceptBattlegroundInvitationAction.h +++ b/src/strategy/actions/AcceptBattlegroundInvitationAction.h @@ -1,6 +1,6 @@ /* - * Copyright (C) 2016+ AzerothCore , released under GNU GPL v2 license, you may redistribute it - * and/or modify it under version 2 of the License, or (at your option), any later version. + * Copyright (C) 2016+ AzerothCore , released under GNU AGPL v3 license, you may redistribute it + * and/or modify it under version 3 of the License, or (at your option), any later version. */ #ifndef _PLAYERBOT_ACCEPTBATTLEGROUNDINVITATIONACTION_H diff --git a/src/strategy/actions/AcceptDuelAction.cpp b/src/strategy/actions/AcceptDuelAction.cpp index fe88fe070d..bfa46e6bb5 100644 --- a/src/strategy/actions/AcceptDuelAction.cpp +++ b/src/strategy/actions/AcceptDuelAction.cpp @@ -1,6 +1,6 @@ /* - * Copyright (C) 2016+ AzerothCore , released under GNU GPL v2 license, you may redistribute it - * and/or modify it under version 2 of the License, or (at your option), any later version. + * Copyright (C) 2016+ AzerothCore , released under GNU AGPL v3 license, you may redistribute it + * and/or modify it under version 3 of the License, or (at your option), any later version. */ #include "AcceptDuelAction.h" diff --git a/src/strategy/actions/AcceptDuelAction.h b/src/strategy/actions/AcceptDuelAction.h index c49efb9d08..4606e938f6 100644 --- a/src/strategy/actions/AcceptDuelAction.h +++ b/src/strategy/actions/AcceptDuelAction.h @@ -1,6 +1,6 @@ /* - * Copyright (C) 2016+ AzerothCore , released under GNU GPL v2 license, you may redistribute it - * and/or modify it under version 2 of the License, or (at your option), any later version. + * Copyright (C) 2016+ AzerothCore , released under GNU AGPL v3 license, you may redistribute it + * and/or modify it under version 3 of the License, or (at your option), any later version. */ #ifndef _PLAYERBOT_ACCEPTDUELACTION_H diff --git a/src/strategy/actions/AcceptInvitationAction.cpp b/src/strategy/actions/AcceptInvitationAction.cpp index 6c24699287..2d53c13e0e 100644 --- a/src/strategy/actions/AcceptInvitationAction.cpp +++ b/src/strategy/actions/AcceptInvitationAction.cpp @@ -1,6 +1,6 @@ /* - * Copyright (C) 2016+ AzerothCore , released under GNU GPL v2 license, you may redistribute it - * and/or modify it under version 2 of the License, or (at your option), any later version. + * Copyright (C) 2016+ AzerothCore , released under GNU AGPL v3 license, you may redistribute it + * and/or modify it under version 3 of the License, or (at your option), any later version. */ #include "AcceptInvitationAction.h" diff --git a/src/strategy/actions/AcceptInvitationAction.h b/src/strategy/actions/AcceptInvitationAction.h index 7208fbe407..396ebd7caa 100644 --- a/src/strategy/actions/AcceptInvitationAction.h +++ b/src/strategy/actions/AcceptInvitationAction.h @@ -1,6 +1,6 @@ /* - * Copyright (C) 2016+ AzerothCore , released under GNU GPL v2 license, you may redistribute it - * and/or modify it under version 2 of the License, or (at your option), any later version. + * Copyright (C) 2016+ AzerothCore , released under GNU AGPL v3 license, you may redistribute it + * and/or modify it under version 3 of the License, or (at your option), any later version. */ #ifndef _PLAYERBOT_ACCEPTINVITATIONACTION_H diff --git a/src/strategy/actions/AcceptQuestAction.cpp b/src/strategy/actions/AcceptQuestAction.cpp index 82b63c643e..005cfb08a9 100644 --- a/src/strategy/actions/AcceptQuestAction.cpp +++ b/src/strategy/actions/AcceptQuestAction.cpp @@ -1,6 +1,6 @@ /* - * Copyright (C) 2016+ AzerothCore , released under GNU GPL v2 license, you may redistribute it - * and/or modify it under version 2 of the License, or (at your option), any later version. + * Copyright (C) 2016+ AzerothCore , released under GNU AGPL v3 license, you may redistribute it + * and/or modify it under version 3 of the License, or (at your option), any later version. */ #include "AcceptQuestAction.h" diff --git a/src/strategy/actions/AcceptQuestAction.h b/src/strategy/actions/AcceptQuestAction.h index 504e144cd0..1160e66a85 100644 --- a/src/strategy/actions/AcceptQuestAction.h +++ b/src/strategy/actions/AcceptQuestAction.h @@ -1,6 +1,6 @@ /* - * Copyright (C) 2016+ AzerothCore , released under GNU GPL v2 license, you may redistribute it - * and/or modify it under version 2 of the License, or (at your option), any later version. + * Copyright (C) 2016+ AzerothCore , released under GNU AGPL v3 license, you may redistribute it + * and/or modify it under version 3 of the License, or (at your option), any later version. */ #ifndef _PLAYERBOT_ACCEPTQUESTACTION_H diff --git a/src/strategy/actions/AcceptResurrectAction.cpp b/src/strategy/actions/AcceptResurrectAction.cpp index cdf6fb6a34..6e2178a82a 100644 --- a/src/strategy/actions/AcceptResurrectAction.cpp +++ b/src/strategy/actions/AcceptResurrectAction.cpp @@ -1,6 +1,6 @@ /* - * Copyright (C) 2016+ AzerothCore , released under GNU GPL v2 license, you may redistribute it - * and/or modify it under version 2 of the License, or (at your option), any later version. + * Copyright (C) 2016+ AzerothCore , released under GNU AGPL v3 license, you may redistribute it + * and/or modify it under version 3 of the License, or (at your option), any later version. */ #include "AcceptResurrectAction.h" diff --git a/src/strategy/actions/AcceptResurrectAction.h b/src/strategy/actions/AcceptResurrectAction.h index 9dfa3a8189..c4495cfc0f 100644 --- a/src/strategy/actions/AcceptResurrectAction.h +++ b/src/strategy/actions/AcceptResurrectAction.h @@ -1,6 +1,6 @@ /* - * Copyright (C) 2016+ AzerothCore , released under GNU GPL v2 license, you may redistribute it - * and/or modify it under version 2 of the License, or (at your option), any later version. + * Copyright (C) 2016+ AzerothCore , released under GNU AGPL v3 license, you may redistribute it + * and/or modify it under version 3 of the License, or (at your option), any later version. */ #ifndef _PLAYERBOT_ACCEPTRESURRECTACTION_H diff --git a/src/strategy/actions/ActionContext.h b/src/strategy/actions/ActionContext.h index 7d458e2b31..cebd7615a7 100644 --- a/src/strategy/actions/ActionContext.h +++ b/src/strategy/actions/ActionContext.h @@ -1,6 +1,6 @@ /* - * Copyright (C) 2016+ AzerothCore , released under GNU GPL v2 license, you may redistribute it - * and/or modify it under version 2 of the License, or (at your option), any later version. + * Copyright (C) 2016+ AzerothCore , released under GNU AGPL v3 license, you may redistribute it + * and/or modify it under version 3 of the License, or (at your option), any later version. */ #ifndef _PLAYERBOT_ACTIONCONTEXT_H diff --git a/src/strategy/actions/AddLootAction.cpp b/src/strategy/actions/AddLootAction.cpp index c4d6eae261..9e16ee2d3a 100644 --- a/src/strategy/actions/AddLootAction.cpp +++ b/src/strategy/actions/AddLootAction.cpp @@ -1,6 +1,6 @@ /* - * Copyright (C) 2016+ AzerothCore , released under GNU GPL v2 license, you may redistribute it - * and/or modify it under version 2 of the License, or (at your option), any later version. + * Copyright (C) 2016+ AzerothCore , released under GNU AGPL v3 license, you may redistribute it + * and/or modify it under version 3 of the License, or (at your option), any later version. */ #include "AddLootAction.h" diff --git a/src/strategy/actions/AddLootAction.h b/src/strategy/actions/AddLootAction.h index c38a43962e..dcd3881755 100644 --- a/src/strategy/actions/AddLootAction.h +++ b/src/strategy/actions/AddLootAction.h @@ -1,6 +1,6 @@ /* - * Copyright (C) 2016+ AzerothCore , released under GNU GPL v2 license, you may redistribute it - * and/or modify it under version 2 of the License, or (at your option), any later version. + * Copyright (C) 2016+ AzerothCore , released under GNU AGPL v3 license, you may redistribute it + * and/or modify it under version 3 of the License, or (at your option), any later version. */ #ifndef _PLAYERBOT_ADDLOOTACTION_H diff --git a/src/strategy/actions/AreaTriggerAction.cpp b/src/strategy/actions/AreaTriggerAction.cpp index 5937a0f733..298bc686a4 100644 --- a/src/strategy/actions/AreaTriggerAction.cpp +++ b/src/strategy/actions/AreaTriggerAction.cpp @@ -1,6 +1,6 @@ /* - * Copyright (C) 2016+ AzerothCore , released under GNU GPL v2 license, you may redistribute it - * and/or modify it under version 2 of the License, or (at your option), any later version. + * Copyright (C) 2016+ AzerothCore , released under GNU AGPL v3 license, you may redistribute it + * and/or modify it under version 3 of the License, or (at your option), any later version. */ #include "AreaTriggerAction.h" diff --git a/src/strategy/actions/AreaTriggerAction.h b/src/strategy/actions/AreaTriggerAction.h index 74dd4af720..93a90f16d4 100644 --- a/src/strategy/actions/AreaTriggerAction.h +++ b/src/strategy/actions/AreaTriggerAction.h @@ -1,6 +1,6 @@ /* - * Copyright (C) 2016+ AzerothCore , released under GNU GPL v2 license, you may redistribute it - * and/or modify it under version 2 of the License, or (at your option), any later version. + * Copyright (C) 2016+ AzerothCore , released under GNU AGPL v3 license, you may redistribute it + * and/or modify it under version 3 of the License, or (at your option), any later version. */ #ifndef _PLAYERBOT_AREATRIGGERACTION_H diff --git a/src/strategy/actions/ArenaTeamActions.cpp b/src/strategy/actions/ArenaTeamActions.cpp index 3563bfe197..82672cd6d7 100644 --- a/src/strategy/actions/ArenaTeamActions.cpp +++ b/src/strategy/actions/ArenaTeamActions.cpp @@ -1,6 +1,6 @@ /* - * Copyright (C) 2016+ AzerothCore , released under GNU GPL v2 license, you may redistribute it - * and/or modify it under version 2 of the License, or (at your option), any later version. + * Copyright (C) 2016+ AzerothCore , released under GNU AGPL v3 license, you may redistribute it + * and/or modify it under version 3 of the License, or (at your option), any later version. */ #include "ArenaTeamActions.h" diff --git a/src/strategy/actions/ArenaTeamActions.h b/src/strategy/actions/ArenaTeamActions.h index 703fde5794..f9fb9ebe74 100644 --- a/src/strategy/actions/ArenaTeamActions.h +++ b/src/strategy/actions/ArenaTeamActions.h @@ -1,6 +1,6 @@ /* - * Copyright (C) 2016+ AzerothCore , released under GNU GPL v2 license, you may redistribute it - * and/or modify it under version 2 of the License, or (at your option), any later version. + * Copyright (C) 2016+ AzerothCore , released under GNU AGPL v3 license, you may redistribute it + * and/or modify it under version 3 of the License, or (at your option), any later version. */ #ifndef _PLAYERBOT_ARENATEAMACTION_H diff --git a/src/strategy/actions/AttackAction.cpp b/src/strategy/actions/AttackAction.cpp index a5ea1d8a1d..94c9541830 100644 --- a/src/strategy/actions/AttackAction.cpp +++ b/src/strategy/actions/AttackAction.cpp @@ -1,6 +1,6 @@ /* - * Copyright (C) 2016+ AzerothCore , released under GNU GPL v2 license, you may redistribute it - * and/or modify it under version 2 of the License, or (at your option), any later version. + * Copyright (C) 2016+ AzerothCore , released under GNU AGPL v3 license, you may redistribute it + * and/or modify it under version 3 of the License, or (at your option), any later version. */ #include "AttackAction.h" diff --git a/src/strategy/actions/AttackAction.h b/src/strategy/actions/AttackAction.h index ee95cb24f6..27081350f4 100644 --- a/src/strategy/actions/AttackAction.h +++ b/src/strategy/actions/AttackAction.h @@ -1,6 +1,6 @@ /* - * Copyright (C) 2016+ AzerothCore , released under GNU GPL v2 license, you may redistribute it - * and/or modify it under version 2 of the License, or (at your option), any later version. + * Copyright (C) 2016+ AzerothCore , released under GNU AGPL v3 license, you may redistribute it + * and/or modify it under version 3 of the License, or (at your option), any later version. */ #ifndef _PLAYERBOT_ATTACKACTION_H diff --git a/src/strategy/actions/AutoMaintenanceOnLevelupAction.h b/src/strategy/actions/AutoMaintenanceOnLevelupAction.h index ca9bf63043..314d44bbe1 100644 --- a/src/strategy/actions/AutoMaintenanceOnLevelupAction.h +++ b/src/strategy/actions/AutoMaintenanceOnLevelupAction.h @@ -1,6 +1,6 @@ /* - * Copyright (C) 2016+ AzerothCore , released under GNU GPL v2 license, you may redistribute it - * and/or modify it under version 2 of the License, or (at your option), any later version. + * Copyright (C) 2016+ AzerothCore , released under GNU AGPL v3 license, you may redistribute it + * and/or modify it under version 3 of the License, or (at your option), any later version. */ #ifndef _PLAYERBOT_AUTOTELEPORTFORLEVELACTION_H diff --git a/src/strategy/actions/BankAction.cpp b/src/strategy/actions/BankAction.cpp index d49559a07c..19804da874 100644 --- a/src/strategy/actions/BankAction.cpp +++ b/src/strategy/actions/BankAction.cpp @@ -1,6 +1,6 @@ /* - * Copyright (C) 2016+ AzerothCore , released under GNU GPL v2 license, you may redistribute it - * and/or modify it under version 2 of the License, or (at your option), any later version. + * Copyright (C) 2016+ AzerothCore , released under GNU AGPL v3 license, you may redistribute it + * and/or modify it under version 3 of the License, or (at your option), any later version. */ #include "BankAction.h" diff --git a/src/strategy/actions/BankAction.h b/src/strategy/actions/BankAction.h index 90aacd5c81..5f3ffc7834 100644 --- a/src/strategy/actions/BankAction.h +++ b/src/strategy/actions/BankAction.h @@ -1,6 +1,6 @@ /* - * Copyright (C) 2016+ AzerothCore , released under GNU GPL v2 license, you may redistribute it - * and/or modify it under version 2 of the License, or (at your option), any later version. + * Copyright (C) 2016+ AzerothCore , released under GNU AGPL v3 license, you may redistribute it + * and/or modify it under version 3 of the License, or (at your option), any later version. */ #ifndef _PLAYERBOT_BANKACTION_H diff --git a/src/strategy/actions/BattleGroundJoinAction.cpp b/src/strategy/actions/BattleGroundJoinAction.cpp index fda822ef1c..f458162498 100644 --- a/src/strategy/actions/BattleGroundJoinAction.cpp +++ b/src/strategy/actions/BattleGroundJoinAction.cpp @@ -1,6 +1,6 @@ /* - * Copyright (C) 2016+ AzerothCore , released under GNU GPL v2 license, you may redistribute it - * and/or modify it under version 2 of the License, or (at your option), any later version. + * Copyright (C) 2016+ AzerothCore , released under GNU AGPL v3 license, you may redistribute it + * and/or modify it under version 3 of the License, or (at your option), any later version. */ #include "BattleGroundJoinAction.h" diff --git a/src/strategy/actions/BattleGroundJoinAction.h b/src/strategy/actions/BattleGroundJoinAction.h index 5768736e64..d3aaa8994b 100644 --- a/src/strategy/actions/BattleGroundJoinAction.h +++ b/src/strategy/actions/BattleGroundJoinAction.h @@ -1,6 +1,6 @@ /* - * Copyright (C) 2016+ AzerothCore , released under GNU GPL v2 license, you may redistribute it - * and/or modify it under version 2 of the License, or (at your option), any later version. + * Copyright (C) 2016+ AzerothCore , released under GNU AGPL v3 license, you may redistribute it + * and/or modify it under version 3 of the License, or (at your option), any later version. */ #ifndef _PLAYERBOT_BATTLEGROUNDJOINACTION_H diff --git a/src/strategy/actions/BattleGroundTactics.cpp b/src/strategy/actions/BattleGroundTactics.cpp index f5e42d98da..74bc236a51 100644 --- a/src/strategy/actions/BattleGroundTactics.cpp +++ b/src/strategy/actions/BattleGroundTactics.cpp @@ -1,6 +1,6 @@ /* - * Copyright (C) 2016+ AzerothCore , released under GNU GPL v2 license, you may redistribute it - * and/or modify it under version 2 of the License, or (at your option), any later version. + * Copyright (C) 2016+ AzerothCore , released under GNU AGPL v3 license, you may redistribute it + * and/or modify it under version 3 of the License, or (at your option), any later version. */ #include "BattleGroundTactics.h" diff --git a/src/strategy/actions/BattleGroundTactics.h b/src/strategy/actions/BattleGroundTactics.h index 6cfe377c2c..b6d065aebf 100644 --- a/src/strategy/actions/BattleGroundTactics.h +++ b/src/strategy/actions/BattleGroundTactics.h @@ -1,6 +1,6 @@ /* - * Copyright (C) 2016+ AzerothCore , released under GNU GPL v2 license, you may redistribute it - * and/or modify it under version 2 of the License, or (at your option), any later version. + * Copyright (C) 2016+ AzerothCore , released under GNU AGPL v3 license, you may redistribute it + * and/or modify it under version 3 of the License, or (at your option), any later version. */ #ifndef _PLAYERBOT_BATTLEGROUNDTACTICSACTION_H diff --git a/src/strategy/actions/BossAuraActions.cpp b/src/strategy/actions/BossAuraActions.cpp index d91186c6d1..d711559ee5 100644 --- a/src/strategy/actions/BossAuraActions.cpp +++ b/src/strategy/actions/BossAuraActions.cpp @@ -1,6 +1,6 @@ /* - * Copyright (C) 2016+ AzerothCore , released under GNU GPL v2 license, you may redistribute it - * and/or modify it under version 2 of the License, or (at your option), any later version. + * Copyright (C) 2016+ AzerothCore , released under GNU AGPL v3 license, you may redistribute it + * and/or modify it under version 3 of the License, or (at your option), any later version. */ #include diff --git a/src/strategy/actions/BossAuraActions.h b/src/strategy/actions/BossAuraActions.h index d40b3c76c5..e31be8c4e0 100644 --- a/src/strategy/actions/BossAuraActions.h +++ b/src/strategy/actions/BossAuraActions.h @@ -1,6 +1,6 @@ /* - * Copyright (C) 2016+ AzerothCore , released under GNU GPL v2 license, you may redistribute it - * and/or modify it under version 2 of the License, or (at your option), any later version. + * Copyright (C) 2016+ AzerothCore , released under GNU AGPL v3 license, you may redistribute it + * and/or modify it under version 3 of the License, or (at your option), any later version. */ #ifndef _PLAYERBOT_BOSSAURAACTION_H diff --git a/src/strategy/actions/BuffAction.cpp b/src/strategy/actions/BuffAction.cpp index 103f8b99c8..d15dcf65ee 100644 --- a/src/strategy/actions/BuffAction.cpp +++ b/src/strategy/actions/BuffAction.cpp @@ -1,6 +1,6 @@ /* - * Copyright (C) 2016+ AzerothCore , released under GNU GPL v2 license, you may redistribute it - * and/or modify it under version 2 of the License, or (at your option), any later version. + * Copyright (C) 2016+ AzerothCore , released under GNU AGPL v3 license, you may redistribute it + * and/or modify it under version 3 of the License, or (at your option), any later version. */ #include "BuffAction.h" diff --git a/src/strategy/actions/BuffAction.h b/src/strategy/actions/BuffAction.h index 9978b2932a..525badd124 100644 --- a/src/strategy/actions/BuffAction.h +++ b/src/strategy/actions/BuffAction.h @@ -1,6 +1,6 @@ /* - * Copyright (C) 2016+ AzerothCore , released under GNU GPL v2 license, you may redistribute it - * and/or modify it under version 2 of the License, or (at your option), any later version. + * Copyright (C) 2016+ AzerothCore , released under GNU AGPL v3 license, you may redistribute it + * and/or modify it under version 3 of the License, or (at your option), any later version. */ #ifndef _PLAYERBOT_BUFFACTION_H diff --git a/src/strategy/actions/BuyAction.cpp b/src/strategy/actions/BuyAction.cpp index 5f1c78eec8..793ef8e07d 100644 --- a/src/strategy/actions/BuyAction.cpp +++ b/src/strategy/actions/BuyAction.cpp @@ -1,6 +1,6 @@ /* - * Copyright (C) 2016+ AzerothCore , released under GNU GPL v2 license, you may redistribute it - * and/or modify it under version 2 of the License, or (at your option), any later version. + * Copyright (C) 2016+ AzerothCore , released under GNU AGPL v3 license, you may redistribute it + * and/or modify it under version 3 of the License, or (at your option), any later version. */ #include "BuyAction.h" diff --git a/src/strategy/actions/BuyAction.h b/src/strategy/actions/BuyAction.h index 3cbb546b16..0d7e7e1573 100644 --- a/src/strategy/actions/BuyAction.h +++ b/src/strategy/actions/BuyAction.h @@ -1,6 +1,6 @@ /* - * Copyright (C) 2016+ AzerothCore , released under GNU GPL v2 license, you may redistribute it - * and/or modify it under version 2 of the License, or (at your option), any later version. + * Copyright (C) 2016+ AzerothCore , released under GNU AGPL v3 license, you may redistribute it + * and/or modify it under version 3 of the License, or (at your option), any later version. */ #ifndef _PLAYERBOT_BUYACTION_H diff --git a/src/strategy/actions/CancelChannelAction.cpp b/src/strategy/actions/CancelChannelAction.cpp index 89837475e2..9f359f392b 100644 --- a/src/strategy/actions/CancelChannelAction.cpp +++ b/src/strategy/actions/CancelChannelAction.cpp @@ -1,6 +1,6 @@ /* - * Copyright (C) 2016+ AzerothCore , released under GNU GPL v2 license, you may redistribute it - * and/or modify it under version 2 of the License, or (at your option), any later version. + * Copyright (C) 2016+ AzerothCore , released under GNU AGPL v3 license, you may redistribute it + * and/or modify it under version 3 of the License, or (at your option), any later version. */ #include "CancelChannelAction.h" diff --git a/src/strategy/actions/CancelChannelAction.h b/src/strategy/actions/CancelChannelAction.h index 4f3525702c..220beb71d0 100644 --- a/src/strategy/actions/CancelChannelAction.h +++ b/src/strategy/actions/CancelChannelAction.h @@ -1,6 +1,6 @@ /* - * Copyright (C) 2016+ AzerothCore , released under GNU GPL v2 license, you may redistribute it - * and/or modify it under version 2 of the License, or (at your option), any later version. + * Copyright (C) 2016+ AzerothCore , released under GNU AGPL v3 license, you may redistribute it + * and/or modify it under version 3 of the License, or (at your option), any later version. */ #ifndef _PLAYERBOT_CANCELCHANNELACTION_H diff --git a/src/strategy/actions/CastCustomSpellAction.cpp b/src/strategy/actions/CastCustomSpellAction.cpp index 3dff4f9ad8..417ffb50d3 100644 --- a/src/strategy/actions/CastCustomSpellAction.cpp +++ b/src/strategy/actions/CastCustomSpellAction.cpp @@ -1,6 +1,6 @@ /* - * Copyright (C) 2016+ AzerothCore , released under GNU GPL v2 license, you may redistribute it - * and/or modify it under version 2 of the License, or (at your option), any later version. + * Copyright (C) 2016+ AzerothCore , released under GNU AGPL v3 license, you may redistribute it + * and/or modify it under version 3 of the License, or (at your option), any later version. */ #include "CastCustomSpellAction.h" diff --git a/src/strategy/actions/CastCustomSpellAction.h b/src/strategy/actions/CastCustomSpellAction.h index e598154da0..ed53b18a5a 100644 --- a/src/strategy/actions/CastCustomSpellAction.h +++ b/src/strategy/actions/CastCustomSpellAction.h @@ -1,6 +1,6 @@ /* - * Copyright (C) 2016+ AzerothCore , released under GNU GPL v2 license, you may redistribute it - * and/or modify it under version 2 of the License, or (at your option), any later version. + * Copyright (C) 2016+ AzerothCore , released under GNU AGPL v3 license, you may redistribute it + * and/or modify it under version 3 of the License, or (at your option), any later version. */ #ifndef _PLAYERBOT_CASTCUSTOMSPELLACTION_H diff --git a/src/strategy/actions/ChangeChatAction.cpp b/src/strategy/actions/ChangeChatAction.cpp index 4caee907ce..04d692c219 100644 --- a/src/strategy/actions/ChangeChatAction.cpp +++ b/src/strategy/actions/ChangeChatAction.cpp @@ -1,6 +1,6 @@ /* - * Copyright (C) 2016+ AzerothCore , released under GNU GPL v2 license, you may redistribute it - * and/or modify it under version 2 of the License, or (at your option), any later version. + * Copyright (C) 2016+ AzerothCore , released under GNU AGPL v3 license, you may redistribute it + * and/or modify it under version 3 of the License, or (at your option), any later version. */ #include "ChangeChatAction.h" diff --git a/src/strategy/actions/ChangeChatAction.h b/src/strategy/actions/ChangeChatAction.h index 12c4d9d4ef..f4f476a614 100644 --- a/src/strategy/actions/ChangeChatAction.h +++ b/src/strategy/actions/ChangeChatAction.h @@ -1,6 +1,6 @@ /* - * Copyright (C) 2016+ AzerothCore , released under GNU GPL v2 license, you may redistribute it - * and/or modify it under version 2 of the License, or (at your option), any later version. + * Copyright (C) 2016+ AzerothCore , released under GNU AGPL v3 license, you may redistribute it + * and/or modify it under version 3 of the License, or (at your option), any later version. */ #ifndef _PLAYERBOT_CHANGECHATACTION_H diff --git a/src/strategy/actions/ChangeStrategyAction.cpp b/src/strategy/actions/ChangeStrategyAction.cpp index 1690774d9a..6d410c0d41 100644 --- a/src/strategy/actions/ChangeStrategyAction.cpp +++ b/src/strategy/actions/ChangeStrategyAction.cpp @@ -1,6 +1,6 @@ /* - * Copyright (C) 2016+ AzerothCore , released under GNU GPL v2 license, you may redistribute it - * and/or modify it under version 2 of the License, or (at your option), any later version. + * Copyright (C) 2016+ AzerothCore , released under GNU AGPL v3 license, you may redistribute it + * and/or modify it under version 3 of the License, or (at your option), any later version. */ #include "ChangeStrategyAction.h" diff --git a/src/strategy/actions/ChangeStrategyAction.h b/src/strategy/actions/ChangeStrategyAction.h index b50b7131d1..b9d0ee866c 100644 --- a/src/strategy/actions/ChangeStrategyAction.h +++ b/src/strategy/actions/ChangeStrategyAction.h @@ -1,6 +1,6 @@ /* - * Copyright (C) 2016+ AzerothCore , released under GNU GPL v2 license, you may redistribute it - * and/or modify it under version 2 of the License, or (at your option), any later version. + * Copyright (C) 2016+ AzerothCore , released under GNU AGPL v3 license, you may redistribute it + * and/or modify it under version 3 of the License, or (at your option), any later version. */ #ifndef _PLAYERBOT_CHANGESTRATEGYACTION_H diff --git a/src/strategy/actions/ChangeTalentsAction.cpp b/src/strategy/actions/ChangeTalentsAction.cpp index 8d51170695..c50e4a9274 100644 --- a/src/strategy/actions/ChangeTalentsAction.cpp +++ b/src/strategy/actions/ChangeTalentsAction.cpp @@ -1,6 +1,6 @@ /* - * Copyright (C) 2016+ AzerothCore , released under GNU GPL v2 license, you may redistribute it - * and/or modify it under version 2 of the License, or (at your option), any later version. + * Copyright (C) 2016+ AzerothCore , released under GNU AGPL v3 license, you may redistribute it + * and/or modify it under version 3 of the License, or (at your option), any later version. */ #include "ChangeTalentsAction.h" diff --git a/src/strategy/actions/ChangeTalentsAction.h b/src/strategy/actions/ChangeTalentsAction.h index d241987c43..0b06a674e3 100644 --- a/src/strategy/actions/ChangeTalentsAction.h +++ b/src/strategy/actions/ChangeTalentsAction.h @@ -1,6 +1,6 @@ /* - * Copyright (C) 2016+ AzerothCore , released under GNU GPL v2 license, you may redistribute it - * and/or modify it under version 2 of the License, or (at your option), any later version. + * Copyright (C) 2016+ AzerothCore , released under GNU AGPL v3 license, you may redistribute it + * and/or modify it under version 3 of the License, or (at your option), any later version. */ #ifndef _PLAYERBOT_CHANGETALENTSACTION_H diff --git a/src/strategy/actions/ChatActionContext.h b/src/strategy/actions/ChatActionContext.h index bf5ff80f42..cb617e3e87 100644 --- a/src/strategy/actions/ChatActionContext.h +++ b/src/strategy/actions/ChatActionContext.h @@ -1,6 +1,6 @@ /* - * Copyright (C) 2016+ AzerothCore , released under GNU GPL v2 license, you may redistribute it - * and/or modify it under version 2 of the License, or (at your option), any later version. + * Copyright (C) 2016+ AzerothCore , released under GNU AGPL v3 license, you may redistribute it + * and/or modify it under version 3 of the License, or (at your option), any later version. */ #ifndef _PLAYERBOT_CHATACTIONCONTEXTACTION_H diff --git a/src/strategy/actions/ChatShortcutActions.cpp b/src/strategy/actions/ChatShortcutActions.cpp index f7e02163bf..0e99c5fe78 100644 --- a/src/strategy/actions/ChatShortcutActions.cpp +++ b/src/strategy/actions/ChatShortcutActions.cpp @@ -1,6 +1,6 @@ /* - * Copyright (C) 2016+ AzerothCore , released under GNU GPL v2 license, you may redistribute it - * and/or modify it under version 2 of the License, or (at your option), any later version. + * Copyright (C) 2016+ AzerothCore , released under GNU AGPL v3 license, you may redistribute it + * and/or modify it under version 3 of the License, or (at your option), any later version. */ #include "ChatShortcutActions.h" diff --git a/src/strategy/actions/ChatShortcutActions.h b/src/strategy/actions/ChatShortcutActions.h index 90895431d1..fa941a4c86 100644 --- a/src/strategy/actions/ChatShortcutActions.h +++ b/src/strategy/actions/ChatShortcutActions.h @@ -1,6 +1,6 @@ /* - * Copyright (C) 2016+ AzerothCore , released under GNU GPL v2 license, you may redistribute it - * and/or modify it under version 2 of the License, or (at your option), any later version. + * Copyright (C) 2016+ AzerothCore , released under GNU AGPL v3 license, you may redistribute it + * and/or modify it under version 3 of the License, or (at your option), any later version. */ #ifndef _PLAYERBOT_CHATSHORTCUTACTION_H diff --git a/src/strategy/actions/CheatAction.cpp b/src/strategy/actions/CheatAction.cpp index f627105fc3..b3f4ec5cf7 100644 --- a/src/strategy/actions/CheatAction.cpp +++ b/src/strategy/actions/CheatAction.cpp @@ -1,6 +1,6 @@ /* - * Copyright (C) 2016+ AzerothCore , released under GNU GPL v2 license, you may redistribute it - * and/or modify it under version 2 of the License, or (at your option), any later version. + * Copyright (C) 2016+ AzerothCore , released under GNU AGPL v3 license, you may redistribute it + * and/or modify it under version 3 of the License, or (at your option), any later version. */ #include "CheatAction.h" diff --git a/src/strategy/actions/CheatAction.h b/src/strategy/actions/CheatAction.h index 8c2061a09c..512c9d3909 100644 --- a/src/strategy/actions/CheatAction.h +++ b/src/strategy/actions/CheatAction.h @@ -1,6 +1,6 @@ /* - * Copyright (C) 2016+ AzerothCore , released under GNU GPL v2 license, you may redistribute it - * and/or modify it under version 2 of the License, or (at your option), any later version. + * Copyright (C) 2016+ AzerothCore , released under GNU AGPL v3 license, you may redistribute it + * and/or modify it under version 3 of the License, or (at your option), any later version. */ #include "Action.h" diff --git a/src/strategy/actions/CheckMailAction.cpp b/src/strategy/actions/CheckMailAction.cpp index 96c1ba95f0..85df168f58 100644 --- a/src/strategy/actions/CheckMailAction.cpp +++ b/src/strategy/actions/CheckMailAction.cpp @@ -1,6 +1,6 @@ /* - * Copyright (C) 2016+ AzerothCore , released under GNU GPL v2 license, you may redistribute it - * and/or modify it under version 2 of the License, or (at your option), any later version. + * Copyright (C) 2016+ AzerothCore , released under GNU AGPL v3 license, you may redistribute it + * and/or modify it under version 3 of the License, or (at your option), any later version. */ #include "CheckMailAction.h" diff --git a/src/strategy/actions/CheckMailAction.h b/src/strategy/actions/CheckMailAction.h index 2089c11187..cd0add81cd 100644 --- a/src/strategy/actions/CheckMailAction.h +++ b/src/strategy/actions/CheckMailAction.h @@ -1,6 +1,6 @@ /* - * Copyright (C) 2016+ AzerothCore , released under GNU GPL v2 license, you may redistribute it - * and/or modify it under version 2 of the License, or (at your option), any later version. + * Copyright (C) 2016+ AzerothCore , released under GNU AGPL v3 license, you may redistribute it + * and/or modify it under version 3 of the License, or (at your option), any later version. */ #ifndef _PLAYERBOT_CHECKMAILACTION_H diff --git a/src/strategy/actions/CheckMountStateAction.cpp b/src/strategy/actions/CheckMountStateAction.cpp index 589984acad..7bbcd58efb 100644 --- a/src/strategy/actions/CheckMountStateAction.cpp +++ b/src/strategy/actions/CheckMountStateAction.cpp @@ -1,6 +1,6 @@ /* - * Copyright (C) 2016+ AzerothCore , released under GNU GPL v2 license, you may redistribute it - * and/or modify it under version 2 of the License, or (at your option), any later version. + * Copyright (C) 2016+ AzerothCore , released under GNU AGPL v3 license, you may redistribute it + * and/or modify it under version 3 of the License, or (at your option), any later version. */ #include "CheckMountStateAction.h" diff --git a/src/strategy/actions/CheckMountStateAction.h b/src/strategy/actions/CheckMountStateAction.h index d93e9adb3e..9a21838e17 100644 --- a/src/strategy/actions/CheckMountStateAction.h +++ b/src/strategy/actions/CheckMountStateAction.h @@ -1,6 +1,6 @@ /* - * Copyright (C) 2016+ AzerothCore , released under GNU GPL v2 license, you may redistribute it - * and/or modify it under version 2 of the License, or (at your option), any later version. + * Copyright (C) 2016+ AzerothCore , released under GNU AGPL v3 license, you may redistribute it + * and/or modify it under version 3 of the License, or (at your option), any later version. */ #ifndef _PLAYERBOT_CHECKMOUNTSTATEACTION_H diff --git a/src/strategy/actions/CheckValuesAction.cpp b/src/strategy/actions/CheckValuesAction.cpp index 89ad4b1513..1fc0d4c3a1 100644 --- a/src/strategy/actions/CheckValuesAction.cpp +++ b/src/strategy/actions/CheckValuesAction.cpp @@ -1,6 +1,6 @@ /* - * Copyright (C) 2016+ AzerothCore , released under GNU GPL v2 license, you may redistribute it - * and/or modify it under version 2 of the License, or (at your option), any later version. + * Copyright (C) 2016+ AzerothCore , released under GNU AGPL v3 license, you may redistribute it + * and/or modify it under version 3 of the License, or (at your option), any later version. */ #include "CheckValuesAction.h" diff --git a/src/strategy/actions/CheckValuesAction.h b/src/strategy/actions/CheckValuesAction.h index c884828e51..f366575605 100644 --- a/src/strategy/actions/CheckValuesAction.h +++ b/src/strategy/actions/CheckValuesAction.h @@ -1,6 +1,6 @@ /* - * Copyright (C) 2016+ AzerothCore , released under GNU GPL v2 license, you may redistribute it - * and/or modify it under version 2 of the License, or (at your option), any later version. + * Copyright (C) 2016+ AzerothCore , released under GNU AGPL v3 license, you may redistribute it + * and/or modify it under version 3 of the License, or (at your option), any later version. */ #ifndef _PLAYERBOT_CHECKVALUESACTION_H diff --git a/src/strategy/actions/ChooseRpgTargetAction.cpp b/src/strategy/actions/ChooseRpgTargetAction.cpp index 794e65f50b..20151658cc 100644 --- a/src/strategy/actions/ChooseRpgTargetAction.cpp +++ b/src/strategy/actions/ChooseRpgTargetAction.cpp @@ -1,6 +1,6 @@ /* - * Copyright (C) 2016+ AzerothCore , released under GNU GPL v2 license, you may redistribute it - * and/or modify it under version 2 of the License, or (at your option), any later version. + * Copyright (C) 2016+ AzerothCore , released under GNU AGPL v3 license, you may redistribute it + * and/or modify it under version 3 of the License, or (at your option), any later version. */ #include diff --git a/src/strategy/actions/ChooseRpgTargetAction.h b/src/strategy/actions/ChooseRpgTargetAction.h index 57c063bfbf..2aeb89e201 100644 --- a/src/strategy/actions/ChooseRpgTargetAction.h +++ b/src/strategy/actions/ChooseRpgTargetAction.h @@ -1,6 +1,6 @@ /* - * Copyright (C) 2016+ AzerothCore , released under GNU GPL v2 license, you may redistribute it - * and/or modify it under version 2 of the License, or (at your option), any later version. + * Copyright (C) 2016+ AzerothCore , released under GNU AGPL v3 license, you may redistribute it + * and/or modify it under version 3 of the License, or (at your option), any later version. */ #ifndef _PLAYERBOT_CHOOSERPGTARGETACTION_H diff --git a/src/strategy/actions/ChooseTargetActions.cpp b/src/strategy/actions/ChooseTargetActions.cpp index 4b90e23768..f98360ff7d 100644 --- a/src/strategy/actions/ChooseTargetActions.cpp +++ b/src/strategy/actions/ChooseTargetActions.cpp @@ -1,6 +1,6 @@ /* - * Copyright (C) 2016+ AzerothCore , released under GNU GPL v2 license, you may redistribute it - * and/or modify it under version 2 of the License, or (at your option), any later version. + * Copyright (C) 2016+ AzerothCore , released under GNU AGPL v3 license, you may redistribute it + * and/or modify it under version 3 of the License, or (at your option), any later version. */ #include "ChooseTargetActions.h" diff --git a/src/strategy/actions/ChooseTargetActions.h b/src/strategy/actions/ChooseTargetActions.h index 38307e094e..5f90501943 100644 --- a/src/strategy/actions/ChooseTargetActions.h +++ b/src/strategy/actions/ChooseTargetActions.h @@ -1,6 +1,6 @@ /* - * Copyright (C) 2016+ AzerothCore , released under GNU GPL v2 license, you may redistribute it - * and/or modify it under version 2 of the License, or (at your option), any later version. + * Copyright (C) 2016+ AzerothCore , released under GNU AGPL v3 license, you may redistribute it + * and/or modify it under version 3 of the License, or (at your option), any later version. */ #ifndef _PLAYERBOT_CHOOSETARGETACTIONS_H diff --git a/src/strategy/actions/ChooseTravelTargetAction.cpp b/src/strategy/actions/ChooseTravelTargetAction.cpp index 0fc7015ebb..709307f406 100644 --- a/src/strategy/actions/ChooseTravelTargetAction.cpp +++ b/src/strategy/actions/ChooseTravelTargetAction.cpp @@ -1,6 +1,6 @@ /* - * Copyright (C) 2016+ AzerothCore , released under GNU GPL v2 license, you may redistribute it - * and/or modify it under version 2 of the License, or (at your option), any later version. + * Copyright (C) 2016+ AzerothCore , released under GNU AGPL v3 license, you may redistribute it + * and/or modify it under version 3 of the License, or (at your option), any later version. */ #include "ChooseTravelTargetAction.h" diff --git a/src/strategy/actions/ChooseTravelTargetAction.h b/src/strategy/actions/ChooseTravelTargetAction.h index 7cb9915828..2ec026dc20 100644 --- a/src/strategy/actions/ChooseTravelTargetAction.h +++ b/src/strategy/actions/ChooseTravelTargetAction.h @@ -1,6 +1,6 @@ /* - * Copyright (C) 2016+ AzerothCore , released under GNU GPL v2 license, you may redistribute it - * and/or modify it under version 2 of the License, or (at your option), any later version. + * Copyright (C) 2016+ AzerothCore , released under GNU AGPL v3 license, you may redistribute it + * and/or modify it under version 3 of the License, or (at your option), any later version. */ #ifndef _PLAYERBOT_CHOOSETRAVELTARGETACTION_H diff --git a/src/strategy/actions/CombatActions.cpp b/src/strategy/actions/CombatActions.cpp index 52b809cd7a..fe29a11b4f 100644 --- a/src/strategy/actions/CombatActions.cpp +++ b/src/strategy/actions/CombatActions.cpp @@ -1,6 +1,6 @@ /* - * Copyright (C) 2016+ AzerothCore , released under GNU GPL v2 license, you may redistribute it - * and/or modify it under version 2 of the License, or (at your option), any later version. + * Copyright (C) 2016+ AzerothCore , released under GNU AGPL v3 license, you may redistribute it + * and/or modify it under version 3 of the License, or (at your option), any later version. */ #include "CombatActions.h" diff --git a/src/strategy/actions/CombatActions.h b/src/strategy/actions/CombatActions.h index 5ce6df49c6..82d74527e8 100644 --- a/src/strategy/actions/CombatActions.h +++ b/src/strategy/actions/CombatActions.h @@ -1,6 +1,6 @@ /* - * Copyright (C) 2016+ AzerothCore , released under GNU GPL v2 license, you may redistribute it - * and/or modify it under version 2 of the License, or (at your option), any later version. + * Copyright (C) 2016+ AzerothCore , released under GNU AGPL v3 license, you may redistribute it + * and/or modify it under version 3 of the License, or (at your option), any later version. */ #ifndef _PLAYERBOT_COMBATACTIONS_H diff --git a/src/strategy/actions/CustomStrategyEditAction.cpp b/src/strategy/actions/CustomStrategyEditAction.cpp index 8f043fd5d7..a8e83e87c2 100644 --- a/src/strategy/actions/CustomStrategyEditAction.cpp +++ b/src/strategy/actions/CustomStrategyEditAction.cpp @@ -1,6 +1,6 @@ /* - * Copyright (C) 2016+ AzerothCore , released under GNU GPL v2 license, you may redistribute it - * and/or modify it under version 2 of the License, or (at your option), any later version. + * Copyright (C) 2016+ AzerothCore , released under GNU AGPL v3 license, you may redistribute it + * and/or modify it under version 3 of the License, or (at your option), any later version. */ #include "CustomStrategyEditAction.h" diff --git a/src/strategy/actions/CustomStrategyEditAction.h b/src/strategy/actions/CustomStrategyEditAction.h index f019a88d11..3633076591 100644 --- a/src/strategy/actions/CustomStrategyEditAction.h +++ b/src/strategy/actions/CustomStrategyEditAction.h @@ -1,6 +1,6 @@ /* - * Copyright (C) 2016+ AzerothCore , released under GNU GPL v2 license, you may redistribute it - * and/or modify it under version 2 of the License, or (at your option), any later version. + * Copyright (C) 2016+ AzerothCore , released under GNU AGPL v3 license, you may redistribute it + * and/or modify it under version 3 of the License, or (at your option), any later version. */ #ifndef _PLAYERBOT_CUSTOMSTRATEGYEDITACTION_H diff --git a/src/strategy/actions/DebugAction.cpp b/src/strategy/actions/DebugAction.cpp index 0c2cbac19e..11a0bf26a0 100644 --- a/src/strategy/actions/DebugAction.cpp +++ b/src/strategy/actions/DebugAction.cpp @@ -1,6 +1,6 @@ /* - * Copyright (C) 2016+ AzerothCore , released under GNU GPL v2 license, you may redistribute it - * and/or modify it under version 2 of the License, or (at your option), any later version. + * Copyright (C) 2016+ AzerothCore , released under GNU AGPL v3 license, you may redistribute it + * and/or modify it under version 3 of the License, or (at your option), any later version. */ #include "DebugAction.h" diff --git a/src/strategy/actions/DebugAction.h b/src/strategy/actions/DebugAction.h index df4a28bce0..5c81c313ef 100644 --- a/src/strategy/actions/DebugAction.h +++ b/src/strategy/actions/DebugAction.h @@ -1,6 +1,6 @@ /* - * Copyright (C) 2016+ AzerothCore , released under GNU GPL v2 license, you may redistribute it - * and/or modify it under version 2 of the License, or (at your option), any later version. + * Copyright (C) 2016+ AzerothCore , released under GNU AGPL v3 license, you may redistribute it + * and/or modify it under version 3 of the License, or (at your option), any later version. */ #ifndef _PLAYERBOT_DEBUGACTION_H diff --git a/src/strategy/actions/DelayAction.cpp b/src/strategy/actions/DelayAction.cpp index a393bd9053..8d47912fe4 100644 --- a/src/strategy/actions/DelayAction.cpp +++ b/src/strategy/actions/DelayAction.cpp @@ -1,6 +1,6 @@ /* - * Copyright (C) 2016+ AzerothCore , released under GNU GPL v2 license, you may redistribute it - * and/or modify it under version 2 of the License, or (at your option), any later version. + * Copyright (C) 2016+ AzerothCore , released under GNU AGPL v3 license, you may redistribute it + * and/or modify it under version 3 of the License, or (at your option), any later version. */ #include "DelayAction.h" diff --git a/src/strategy/actions/DelayAction.h b/src/strategy/actions/DelayAction.h index 4d341d8df5..626c577fd0 100644 --- a/src/strategy/actions/DelayAction.h +++ b/src/strategy/actions/DelayAction.h @@ -1,6 +1,6 @@ /* - * Copyright (C) 2016+ AzerothCore , released under GNU GPL v2 license, you may redistribute it - * and/or modify it under version 2 of the License, or (at your option), any later version. + * Copyright (C) 2016+ AzerothCore , released under GNU AGPL v3 license, you may redistribute it + * and/or modify it under version 3 of the License, or (at your option), any later version. */ #ifndef _PLAYERBOT_DELAYACTION_H diff --git a/src/strategy/actions/DestroyItemAction.cpp b/src/strategy/actions/DestroyItemAction.cpp index 153606a03d..0fce4ad701 100644 --- a/src/strategy/actions/DestroyItemAction.cpp +++ b/src/strategy/actions/DestroyItemAction.cpp @@ -1,6 +1,6 @@ /* - * Copyright (C) 2016+ AzerothCore , released under GNU GPL v2 license, you may redistribute it - * and/or modify it under version 2 of the License, or (at your option), any later version. + * Copyright (C) 2016+ AzerothCore , released under GNU AGPL v3 license, you may redistribute it + * and/or modify it under version 3 of the License, or (at your option), any later version. */ #include "DestroyItemAction.h" diff --git a/src/strategy/actions/DestroyItemAction.h b/src/strategy/actions/DestroyItemAction.h index a0d4f5ef62..fce18e6026 100644 --- a/src/strategy/actions/DestroyItemAction.h +++ b/src/strategy/actions/DestroyItemAction.h @@ -1,6 +1,6 @@ /* - * Copyright (C) 2016+ AzerothCore , released under GNU GPL v2 license, you may redistribute it - * and/or modify it under version 2 of the License, or (at your option), any later version. + * Copyright (C) 2016+ AzerothCore , released under GNU AGPL v3 license, you may redistribute it + * and/or modify it under version 3 of the License, or (at your option), any later version. */ #ifndef _PLAYERBOT_DESTROYITEMACTION_H diff --git a/src/strategy/actions/DropQuestAction.cpp b/src/strategy/actions/DropQuestAction.cpp index 672358cb65..ddcdaef52b 100644 --- a/src/strategy/actions/DropQuestAction.cpp +++ b/src/strategy/actions/DropQuestAction.cpp @@ -1,6 +1,6 @@ /* - * Copyright (C) 2016+ AzerothCore , released under GNU GPL v2 license, you may redistribute it - * and/or modify it under version 2 of the License, or (at your option), any later version. + * Copyright (C) 2016+ AzerothCore , released under GNU AGPL v3 license, you may redistribute it + * and/or modify it under version 3 of the License, or (at your option), any later version. */ #include "DropQuestAction.h" diff --git a/src/strategy/actions/DropQuestAction.h b/src/strategy/actions/DropQuestAction.h index b20cccde25..a6622eec1f 100644 --- a/src/strategy/actions/DropQuestAction.h +++ b/src/strategy/actions/DropQuestAction.h @@ -1,6 +1,6 @@ /* - * Copyright (C) 2016+ AzerothCore , released under GNU GPL v2 license, you may redistribute it - * and/or modify it under version 2 of the License, or (at your option), any later version. + * Copyright (C) 2016+ AzerothCore , released under GNU AGPL v3 license, you may redistribute it + * and/or modify it under version 3 of the License, or (at your option), any later version. */ #ifndef _PLAYERBOT_DROPQUESTACTION_H diff --git a/src/strategy/actions/EmoteAction.cpp b/src/strategy/actions/EmoteAction.cpp index ba44424b67..72952e66cc 100644 --- a/src/strategy/actions/EmoteAction.cpp +++ b/src/strategy/actions/EmoteAction.cpp @@ -1,6 +1,6 @@ /* - * Copyright (C) 2016+ AzerothCore , released under GNU GPL v2 license, you may redistribute it - * and/or modify it under version 2 of the License, or (at your option), any later version. + * Copyright (C) 2016+ AzerothCore , released under GNU AGPL v3 license, you may redistribute it + * and/or modify it under version 3 of the License, or (at your option), any later version. */ #include "EmoteAction.h" diff --git a/src/strategy/actions/EmoteAction.h b/src/strategy/actions/EmoteAction.h index b1836cb3eb..7732ad8e87 100644 --- a/src/strategy/actions/EmoteAction.h +++ b/src/strategy/actions/EmoteAction.h @@ -1,6 +1,6 @@ /* - * Copyright (C) 2016+ AzerothCore , released under GNU GPL v2 license, you may redistribute it - * and/or modify it under version 2 of the License, or (at your option), any later version. + * Copyright (C) 2016+ AzerothCore , released under GNU AGPL v3 license, you may redistribute it + * and/or modify it under version 3 of the License, or (at your option), any later version. */ #ifndef _PLAYERBOT_EMOTEACTION_H diff --git a/src/strategy/actions/EquipAction.cpp b/src/strategy/actions/EquipAction.cpp index de1046c5e0..946af5b2f6 100644 --- a/src/strategy/actions/EquipAction.cpp +++ b/src/strategy/actions/EquipAction.cpp @@ -1,6 +1,6 @@ /* - * Copyright (C) 2016+ AzerothCore , released under GNU GPL v2 license, you may redistribute it - * and/or modify it under version 2 of the License, or (at your option), any later version. + * Copyright (C) 2016+ AzerothCore , released under GNU AGPL v3 license, you may redistribute it + * and/or modify it under version 3 of the License, or (at your option), any later version. */ #include "EquipAction.h" diff --git a/src/strategy/actions/EquipAction.h b/src/strategy/actions/EquipAction.h index 64ef5aa3a9..518d39c8ee 100644 --- a/src/strategy/actions/EquipAction.h +++ b/src/strategy/actions/EquipAction.h @@ -1,6 +1,6 @@ /* - * Copyright (C) 2016+ AzerothCore , released under GNU GPL v2 license, you may redistribute it - * and/or modify it under version 2 of the License, or (at your option), any later version. + * Copyright (C) 2016+ AzerothCore , released under GNU AGPL v3 license, you may redistribute it + * and/or modify it under version 3 of the License, or (at your option), any later version. */ #ifndef _PLAYERBOT_EQUIPACTION_H diff --git a/src/strategy/actions/EquipGlyphsAction.cpp b/src/strategy/actions/EquipGlyphsAction.cpp index 4caa8c13f9..05c064b963 100644 --- a/src/strategy/actions/EquipGlyphsAction.cpp +++ b/src/strategy/actions/EquipGlyphsAction.cpp @@ -1,6 +1,6 @@ /* - * Copyright (C) 2016+ AzerothCore , released under GNU GPL v2 license, you may redistribute it - * and/or modify it under version 2 of the License, or (at your option), any later version. + * Copyright (C) 2016+ AzerothCore , released under GNU AGPL v3 license, you may redistribute it + * and/or modify it under version 3 of the License, or (at your option), any later version. */ #include "EquipGlyphsAction.h" diff --git a/src/strategy/actions/EquipGlyphsAction.h b/src/strategy/actions/EquipGlyphsAction.h index 9206915e4b..d2812d8e3c 100644 --- a/src/strategy/actions/EquipGlyphsAction.h +++ b/src/strategy/actions/EquipGlyphsAction.h @@ -1,6 +1,6 @@ /* - * Copyright (C) 2016+ AzerothCore , released under GNU GPL v2 license, you may redistribute it - * and/or modify it under version 2 of the License, or (at your option), any later version. + * Copyright (C) 2016+ AzerothCore , released under GNU AGPL v3 license, you may redistribute it + * and/or modify it under version 3 of the License, or (at your option), any later version. */ #ifndef _PLAYERBOT_EQUIPGLYPHSACTION_H diff --git a/src/strategy/actions/FlagAction.cpp b/src/strategy/actions/FlagAction.cpp index 566f2df073..023b376d67 100644 --- a/src/strategy/actions/FlagAction.cpp +++ b/src/strategy/actions/FlagAction.cpp @@ -1,6 +1,6 @@ /* - * Copyright (C) 2016+ AzerothCore , released under GNU GPL v2 license, you may redistribute it - * and/or modify it under version 2 of the License, or (at your option), any later version. + * Copyright (C) 2016+ AzerothCore , released under GNU AGPL v3 license, you may redistribute it + * and/or modify it under version 3 of the License, or (at your option), any later version. */ #include "FlagAction.h" diff --git a/src/strategy/actions/FlagAction.h b/src/strategy/actions/FlagAction.h index 3e64db8e9a..3d50d7ad2f 100644 --- a/src/strategy/actions/FlagAction.h +++ b/src/strategy/actions/FlagAction.h @@ -1,6 +1,6 @@ /* - * Copyright (C) 2016+ AzerothCore , released under GNU GPL v2 license, you may redistribute it - * and/or modify it under version 2 of the License, or (at your option), any later version. + * Copyright (C) 2016+ AzerothCore , released under GNU AGPL v3 license, you may redistribute it + * and/or modify it under version 3 of the License, or (at your option), any later version. */ #ifndef _PLAYERBOT_FLAGACTION_H diff --git a/src/strategy/actions/FollowActions.cpp b/src/strategy/actions/FollowActions.cpp index a86fded51a..f4a66bf9e7 100644 --- a/src/strategy/actions/FollowActions.cpp +++ b/src/strategy/actions/FollowActions.cpp @@ -1,6 +1,6 @@ /* - * Copyright (C) 2016+ AzerothCore , released under GNU GPL v2 license, you may redistribute it - * and/or modify it under version 2 of the License, or (at your option), any later version. + * Copyright (C) 2016+ AzerothCore , released under GNU AGPL v3 license, you may redistribute it + * and/or modify it under version 3 of the License, or (at your option), any later version. */ #include "FollowActions.h" diff --git a/src/strategy/actions/FollowActions.h b/src/strategy/actions/FollowActions.h index d98197449d..5468e34131 100644 --- a/src/strategy/actions/FollowActions.h +++ b/src/strategy/actions/FollowActions.h @@ -1,6 +1,6 @@ /* - * Copyright (C) 2016+ AzerothCore , released under GNU GPL v2 license, you may redistribute it - * and/or modify it under version 2 of the License, or (at your option), any later version. + * Copyright (C) 2016+ AzerothCore , released under GNU AGPL v3 license, you may redistribute it + * and/or modify it under version 3 of the License, or (at your option), any later version. */ #ifndef _PLAYERBOT_FOLLOWACTIONS_H diff --git a/src/strategy/actions/GenericActions.cpp b/src/strategy/actions/GenericActions.cpp index ae8010e1b8..184b17715d 100644 --- a/src/strategy/actions/GenericActions.cpp +++ b/src/strategy/actions/GenericActions.cpp @@ -1,6 +1,6 @@ /* - * Copyright (C) 2016+ AzerothCore , released under GNU GPL v2 license, you may redistribute it - * and/or modify it under version 2 of the License, or (at your option), any later version. + * Copyright (C) 2016+ AzerothCore , released under GNU AGPL v3 license, you may redistribute it + * and/or modify it under version 3 of the License, or (at your option), any later version. */ #include "GenericActions.h" diff --git a/src/strategy/actions/GenericActions.h b/src/strategy/actions/GenericActions.h index 1bc8d77e1a..b089b67645 100644 --- a/src/strategy/actions/GenericActions.h +++ b/src/strategy/actions/GenericActions.h @@ -1,6 +1,6 @@ /* - * Copyright (C) 2016+ AzerothCore , released under GNU GPL v2 license, you may redistribute it - * and/or modify it under version 2 of the License, or (at your option), any later version. + * Copyright (C) 2016+ AzerothCore , released under GNU AGPL v3 license, you may redistribute it + * and/or modify it under version 3 of the License, or (at your option), any later version. */ #ifndef _PLAYERBOT_GENERICACTIONS_H diff --git a/src/strategy/actions/GenericBuffUtils.cpp b/src/strategy/actions/GenericBuffUtils.cpp index d222667ca1..fb27a234a0 100644 --- a/src/strategy/actions/GenericBuffUtils.cpp +++ b/src/strategy/actions/GenericBuffUtils.cpp @@ -1,6 +1,6 @@ /* - * Copyright (C) 2016+ AzerothCore , released under GNU GPL v2 license, you may redistribute it - * and/or modify it under version 2 of the License, or (at your option), any later version. + * Copyright (C) 2016+ AzerothCore , released under GNU AGPL v3 license, you may redistribute it + * and/or modify it under version 3 of the License, or (at your option), any later version. */ #include "GenericBuffUtils.h" diff --git a/src/strategy/actions/GenericBuffUtils.h b/src/strategy/actions/GenericBuffUtils.h index 571c5c3c78..d9cfc84213 100644 --- a/src/strategy/actions/GenericBuffUtils.h +++ b/src/strategy/actions/GenericBuffUtils.h @@ -1,6 +1,6 @@ /* - * Copyright (C) 2016+ AzerothCore , released under GNU GPL v2 license, you may redistribute it - * and/or modify it under version 2 of the License, or (at your option), any later version. + * Copyright (C) 2016+ AzerothCore , released under GNU AGPL v3 license, you may redistribute it + * and/or modify it under version 3 of the License, or (at your option), any later version. */ #pragma once diff --git a/src/strategy/actions/GenericSpellActions.cpp b/src/strategy/actions/GenericSpellActions.cpp index 8e5a95d2c3..3a36d9ccd0 100644 --- a/src/strategy/actions/GenericSpellActions.cpp +++ b/src/strategy/actions/GenericSpellActions.cpp @@ -1,6 +1,6 @@ /* - * Copyright (C) 2016+ AzerothCore , released under GNU GPL v2 license, you may redistribute it - * and/or modify it under version 2 of the License, or (at your option), any later version. + * Copyright (C) 2016+ AzerothCore , released under GNU AGPL v3 license, you may redistribute it + * and/or modify it under version 3 of the License, or (at your option), any later version. */ #include "GenericSpellActions.h" diff --git a/src/strategy/actions/GenericSpellActions.h b/src/strategy/actions/GenericSpellActions.h index a66e36aed3..e2435a579c 100644 --- a/src/strategy/actions/GenericSpellActions.h +++ b/src/strategy/actions/GenericSpellActions.h @@ -1,6 +1,6 @@ /* - * Copyright (C) 2016+ AzerothCore , released under GNU GPL v2 license, you may redistribute it - * and/or modify it under version 2 of the License, or (at your option), any later version. + * Copyright (C) 2016+ AzerothCore , released under GNU AGPL v3 license, you may redistribute it + * and/or modify it under version 3 of the License, or (at your option), any later version. */ #ifndef _PLAYERBOT_GENERICSPELLACTIONS_H diff --git a/src/strategy/actions/GiveItemAction.cpp b/src/strategy/actions/GiveItemAction.cpp index afdf19beb1..6e2d6744ec 100644 --- a/src/strategy/actions/GiveItemAction.cpp +++ b/src/strategy/actions/GiveItemAction.cpp @@ -1,6 +1,6 @@ /* - * Copyright (C) 2016+ AzerothCore , released under GNU GPL v2 license, you may redistribute it - * and/or modify it under version 2 of the License, or (at your option), any later version. + * Copyright (C) 2016+ AzerothCore , released under GNU AGPL v3 license, you may redistribute it + * and/or modify it under version 3 of the License, or (at your option), any later version. */ #include "GiveItemAction.h" diff --git a/src/strategy/actions/GiveItemAction.h b/src/strategy/actions/GiveItemAction.h index 169be1e974..bd3f3b087f 100644 --- a/src/strategy/actions/GiveItemAction.h +++ b/src/strategy/actions/GiveItemAction.h @@ -1,6 +1,6 @@ /* - * Copyright (C) 2016+ AzerothCore , released under GNU GPL v2 license, you may redistribute it - * and/or modify it under version 2 of the License, or (at your option), any later version. + * Copyright (C) 2016+ AzerothCore , released under GNU AGPL v3 license, you may redistribute it + * and/or modify it under version 3 of the License, or (at your option), any later version. */ #ifndef _PLAYERBOT_GIVEITEMACTION_H diff --git a/src/strategy/actions/GoAction.cpp b/src/strategy/actions/GoAction.cpp index bb1076d6a3..1b8cd62a2a 100644 --- a/src/strategy/actions/GoAction.cpp +++ b/src/strategy/actions/GoAction.cpp @@ -1,6 +1,6 @@ /* - * Copyright (C) 2016+ AzerothCore , released under GNU GPL v2 license, you may redistribute it - * and/or modify it under version 2 of the License, or (at your option), any later version. + * Copyright (C) 2016+ AzerothCore , released under GNU AGPL v3 license, you may redistribute it + * and/or modify it under version 3 of the License, or (at your option), any later version. */ #include "GoAction.h" diff --git a/src/strategy/actions/GoAction.h b/src/strategy/actions/GoAction.h index 48a1ffa56e..f94181567b 100644 --- a/src/strategy/actions/GoAction.h +++ b/src/strategy/actions/GoAction.h @@ -1,6 +1,6 @@ /* - * Copyright (C) 2016+ AzerothCore , released under GNU GPL v2 license, you may redistribute it - * and/or modify it under version 2 of the License, or (at your option), any later version. + * Copyright (C) 2016+ AzerothCore , released under GNU AGPL v3 license, you may redistribute it + * and/or modify it under version 3 of the License, or (at your option), any later version. */ #ifndef _PLAYERBOT_GOACTION_H diff --git a/src/strategy/actions/GossipHelloAction.cpp b/src/strategy/actions/GossipHelloAction.cpp index 83a67c99f4..9c5083d803 100644 --- a/src/strategy/actions/GossipHelloAction.cpp +++ b/src/strategy/actions/GossipHelloAction.cpp @@ -1,6 +1,6 @@ /* - * Copyright (C) 2016+ AzerothCore , released under GNU GPL v2 license, you may redistribute it - * and/or modify it under version 2 of the License, or (at your option), any later version. + * Copyright (C) 2016+ AzerothCore , released under GNU AGPL v3 license, you may redistribute it + * and/or modify it under version 3 of the License, or (at your option), any later version. */ #include "GossipHelloAction.h" diff --git a/src/strategy/actions/GossipHelloAction.h b/src/strategy/actions/GossipHelloAction.h index e6ed73f33f..71ef373fcf 100644 --- a/src/strategy/actions/GossipHelloAction.h +++ b/src/strategy/actions/GossipHelloAction.h @@ -1,6 +1,6 @@ /* - * Copyright (C) 2016+ AzerothCore , released under GNU GPL v2 license, you may redistribute it - * and/or modify it under version 2 of the License, or (at your option), any later version. + * Copyright (C) 2016+ AzerothCore , released under GNU AGPL v3 license, you may redistribute it + * and/or modify it under version 3 of the License, or (at your option), any later version. */ #ifndef _PLAYERBOT_GOSSIPHELLOACTION_H diff --git a/src/strategy/actions/GreetAction.cpp b/src/strategy/actions/GreetAction.cpp index ff7118f3b7..87bf2c5ffb 100644 --- a/src/strategy/actions/GreetAction.cpp +++ b/src/strategy/actions/GreetAction.cpp @@ -1,6 +1,6 @@ /* - * Copyright (C) 2016+ AzerothCore , released under GNU GPL v2 license, you may redistribute it - * and/or modify it under version 2 of the License, or (at your option), any later version. + * Copyright (C) 2016+ AzerothCore , released under GNU AGPL v3 license, you may redistribute it + * and/or modify it under version 3 of the License, or (at your option), any later version. */ #include "GreetAction.h" diff --git a/src/strategy/actions/GreetAction.h b/src/strategy/actions/GreetAction.h index aef110989b..8b1e910eaf 100644 --- a/src/strategy/actions/GreetAction.h +++ b/src/strategy/actions/GreetAction.h @@ -1,6 +1,6 @@ /* - * Copyright (C) 2016+ AzerothCore , released under GNU GPL v2 license, you may redistribute it - * and/or modify it under version 2 of the License, or (at your option), any later version. + * Copyright (C) 2016+ AzerothCore , released under GNU AGPL v3 license, you may redistribute it + * and/or modify it under version 3 of the License, or (at your option), any later version. */ #ifndef _PLAYERBOT_GREETACTION_H diff --git a/src/strategy/actions/GuildAcceptAction.cpp b/src/strategy/actions/GuildAcceptAction.cpp index f926a68ec4..cd7635a97b 100644 --- a/src/strategy/actions/GuildAcceptAction.cpp +++ b/src/strategy/actions/GuildAcceptAction.cpp @@ -1,6 +1,6 @@ /* - * Copyright (C) 2016+ AzerothCore , released under GNU GPL v2 license, you may redistribute it - * and/or modify it under version 2 of the License, or (at your option), any later version. + * Copyright (C) 2016+ AzerothCore , released under GNU AGPL v3 license, you may redistribute it + * and/or modify it under version 3 of the License, or (at your option), any later version. */ #include "GuildAcceptAction.h" diff --git a/src/strategy/actions/GuildAcceptAction.h b/src/strategy/actions/GuildAcceptAction.h index 50284dffa9..8d60d07e6f 100644 --- a/src/strategy/actions/GuildAcceptAction.h +++ b/src/strategy/actions/GuildAcceptAction.h @@ -1,6 +1,6 @@ /* - * Copyright (C) 2016+ AzerothCore , released under GNU GPL v2 license, you may redistribute it - * and/or modify it under version 2 of the License, or (at your option), any later version. + * Copyright (C) 2016+ AzerothCore , released under GNU AGPL v3 license, you may redistribute it + * and/or modify it under version 3 of the License, or (at your option), any later version. */ #ifndef _PLAYERBOT_GUILDACCEPTACTION_H diff --git a/src/strategy/actions/GuildBankAction.cpp b/src/strategy/actions/GuildBankAction.cpp index a7d50a99b5..2d9c74ff69 100644 --- a/src/strategy/actions/GuildBankAction.cpp +++ b/src/strategy/actions/GuildBankAction.cpp @@ -1,6 +1,6 @@ /* - * Copyright (C) 2016+ AzerothCore , released under GNU GPL v2 license, you may redistribute it - * and/or modify it under version 2 of the License, or (at your option), any later version. + * Copyright (C) 2016+ AzerothCore , released under GNU AGPL v3 license, you may redistribute it + * and/or modify it under version 3 of the License, or (at your option), any later version. */ #include "GuildBankAction.h" diff --git a/src/strategy/actions/GuildBankAction.h b/src/strategy/actions/GuildBankAction.h index 5aac99b81f..5454a31056 100644 --- a/src/strategy/actions/GuildBankAction.h +++ b/src/strategy/actions/GuildBankAction.h @@ -1,6 +1,6 @@ /* - * Copyright (C) 2016+ AzerothCore , released under GNU GPL v2 license, you may redistribute it - * and/or modify it under version 2 of the License, or (at your option), any later version. + * Copyright (C) 2016+ AzerothCore , released under GNU AGPL v3 license, you may redistribute it + * and/or modify it under version 3 of the License, or (at your option), any later version. */ #ifndef _PLAYERBOT_GUILDBANKACTION_H diff --git a/src/strategy/actions/GuildCreateActions.cpp b/src/strategy/actions/GuildCreateActions.cpp index caa920c711..075b28cac3 100644 --- a/src/strategy/actions/GuildCreateActions.cpp +++ b/src/strategy/actions/GuildCreateActions.cpp @@ -1,6 +1,6 @@ /* - * Copyright (C) 2016+ AzerothCore , released under GNU GPL v2 license, you may redistribute it - * and/or modify it under version 2 of the License, or (at your option), any later version. + * Copyright (C) 2016+ AzerothCore , released under GNU AGPL v3 license, you may redistribute it + * and/or modify it under version 3 of the License, or (at your option), any later version. */ #include "GuildCreateActions.h" diff --git a/src/strategy/actions/GuildCreateActions.h b/src/strategy/actions/GuildCreateActions.h index a4e7ba9b9d..07de5824f5 100644 --- a/src/strategy/actions/GuildCreateActions.h +++ b/src/strategy/actions/GuildCreateActions.h @@ -1,6 +1,6 @@ /* - * Copyright (C) 2016+ AzerothCore , released under GNU GPL v2 license, you may redistribute it - * and/or modify it under version 2 of the License, or (at your option), any later version. + * Copyright (C) 2016+ AzerothCore , released under GNU AGPL v3 license, you may redistribute it + * and/or modify it under version 3 of the License, or (at your option), any later version. */ #ifndef _PLAYERBOT_GUILDCREATEACTION_H diff --git a/src/strategy/actions/GuildManagementActions.cpp b/src/strategy/actions/GuildManagementActions.cpp index a46d34378f..af5a1f0172 100644 --- a/src/strategy/actions/GuildManagementActions.cpp +++ b/src/strategy/actions/GuildManagementActions.cpp @@ -1,6 +1,6 @@ /* - * Copyright (C) 2016+ AzerothCore , released under GNU GPL v2 license, you may redistribute it - * and/or modify it under version 2 of the License, or (at your option), any later version. + * Copyright (C) 2016+ AzerothCore , released under GNU AGPL v3 license, you may redistribute it + * and/or modify it under version 3 of the License, or (at your option), any later version. */ #include "GuildManagementActions.h" diff --git a/src/strategy/actions/GuildManagementActions.h b/src/strategy/actions/GuildManagementActions.h index 991863519a..bf46d1b741 100644 --- a/src/strategy/actions/GuildManagementActions.h +++ b/src/strategy/actions/GuildManagementActions.h @@ -1,6 +1,6 @@ /* - * Copyright (C) 2016+ AzerothCore , released under GNU GPL v2 license, you may redistribute it - * and/or modify it under version 2 of the License, or (at your option), any later version. + * Copyright (C) 2016+ AzerothCore , released under GNU AGPL v3 license, you may redistribute it + * and/or modify it under version 3 of the License, or (at your option), any later version. */ #ifndef _PLAYERBOT_GUILDMAMANEGEMENTACTION_H diff --git a/src/strategy/actions/HelpAction.cpp b/src/strategy/actions/HelpAction.cpp index 6f0ef2ce32..3dbe1d6e4b 100644 --- a/src/strategy/actions/HelpAction.cpp +++ b/src/strategy/actions/HelpAction.cpp @@ -1,6 +1,6 @@ /* - * Copyright (C) 2016+ AzerothCore , released under GNU GPL v2 license, you may redistribute it - * and/or modify it under version 2 of the License, or (at your option), any later version. + * Copyright (C) 2016+ AzerothCore , released under GNU AGPL v3 license, you may redistribute it + * and/or modify it under version 3 of the License, or (at your option), any later version. */ #include "HelpAction.h" diff --git a/src/strategy/actions/HelpAction.h b/src/strategy/actions/HelpAction.h index 0481bb0d06..e1d374b0c5 100644 --- a/src/strategy/actions/HelpAction.h +++ b/src/strategy/actions/HelpAction.h @@ -1,6 +1,6 @@ /* - * Copyright (C) 2016+ AzerothCore , released under GNU GPL v2 license, you may redistribute it - * and/or modify it under version 2 of the License, or (at your option), any later version. + * Copyright (C) 2016+ AzerothCore , released under GNU AGPL v3 license, you may redistribute it + * and/or modify it under version 3 of the License, or (at your option), any later version. */ #ifndef _PLAYERBOT_HELPACTION_H diff --git a/src/strategy/actions/HireAction.cpp b/src/strategy/actions/HireAction.cpp index 6ad575fc82..f8b3653964 100644 --- a/src/strategy/actions/HireAction.cpp +++ b/src/strategy/actions/HireAction.cpp @@ -1,6 +1,6 @@ /* - * Copyright (C) 2016+ AzerothCore , released under GNU GPL v2 license, you may redistribute it - * and/or modify it under version 2 of the License, or (at your option), any later version. + * Copyright (C) 2016+ AzerothCore , released under GNU AGPL v3 license, you may redistribute it + * and/or modify it under version 3 of the License, or (at your option), any later version. */ #include "HireAction.h" diff --git a/src/strategy/actions/HireAction.h b/src/strategy/actions/HireAction.h index 96f3852771..6738f02c10 100644 --- a/src/strategy/actions/HireAction.h +++ b/src/strategy/actions/HireAction.h @@ -1,6 +1,6 @@ /* - * Copyright (C) 2016+ AzerothCore , released under GNU GPL v2 license, you may redistribute it - * and/or modify it under version 2 of the License, or (at your option), any later version. + * Copyright (C) 2016+ AzerothCore , released under GNU AGPL v3 license, you may redistribute it + * and/or modify it under version 3 of the License, or (at your option), any later version. */ #ifndef _PLAYERBOT_HIREACTION_H diff --git a/src/strategy/actions/ImbueAction.cpp b/src/strategy/actions/ImbueAction.cpp index 55ee582924..8c151ef8a6 100644 --- a/src/strategy/actions/ImbueAction.cpp +++ b/src/strategy/actions/ImbueAction.cpp @@ -1,6 +1,6 @@ /* - * Copyright (C) 2016+ AzerothCore , released under GNU GPL v2 license, you may redistribute it - * and/or modify it under version 2 of the License, or (at your option), any later version. + * Copyright (C) 2016+ AzerothCore , released under GNU AGPL v3 license, you may redistribute it + * and/or modify it under version 3 of the License, or (at your option), any later version. */ #include "ImbueAction.h" diff --git a/src/strategy/actions/ImbueAction.h b/src/strategy/actions/ImbueAction.h index ca317c7d66..398a8fa18a 100644 --- a/src/strategy/actions/ImbueAction.h +++ b/src/strategy/actions/ImbueAction.h @@ -1,6 +1,6 @@ /* - * Copyright (C) 2016+ AzerothCore , released under GNU GPL v2 license, you may redistribute it - * and/or modify it under version 2 of the License, or (at your option), any later version. + * Copyright (C) 2016+ AzerothCore , released under GNU AGPL v3 license, you may redistribute it + * and/or modify it under version 3 of the License, or (at your option), any later version. */ #ifndef _PLAYERBOT_IMBUEACTION_H diff --git a/src/strategy/actions/InventoryAction.cpp b/src/strategy/actions/InventoryAction.cpp index d2d54da107..f7b606a91a 100644 --- a/src/strategy/actions/InventoryAction.cpp +++ b/src/strategy/actions/InventoryAction.cpp @@ -1,6 +1,6 @@ /* - * Copyright (C) 2016+ AzerothCore , released under GNU GPL v2 license, you may redistribute it - * and/or modify it under version 2 of the License, or (at your option), any later version. + * Copyright (C) 2016+ AzerothCore , released under GNU AGPL v3 license, you may redistribute it + * and/or modify it under version 3 of the License, or (at your option), any later version. */ #include "InventoryAction.h" diff --git a/src/strategy/actions/InventoryAction.h b/src/strategy/actions/InventoryAction.h index f7fd6cd2a9..7ab0f59de7 100644 --- a/src/strategy/actions/InventoryAction.h +++ b/src/strategy/actions/InventoryAction.h @@ -1,6 +1,6 @@ /* - * Copyright (C) 2016+ AzerothCore , released under GNU GPL v2 license, you may redistribute it - * and/or modify it under version 2 of the License, or (at your option), any later version. + * Copyright (C) 2016+ AzerothCore , released under GNU AGPL v3 license, you may redistribute it + * and/or modify it under version 3 of the License, or (at your option), any later version. */ #ifndef _PLAYERBOT_INVENTORYACTION_H diff --git a/src/strategy/actions/InventoryChangeFailureAction.cpp b/src/strategy/actions/InventoryChangeFailureAction.cpp index 31a182c934..ef7cd92399 100644 --- a/src/strategy/actions/InventoryChangeFailureAction.cpp +++ b/src/strategy/actions/InventoryChangeFailureAction.cpp @@ -1,6 +1,6 @@ /* - * Copyright (C) 2016+ AzerothCore , released under GNU GPL v2 license, you may redistribute it - * and/or modify it under version 2 of the License, or (at your option), any later version. + * Copyright (C) 2016+ AzerothCore , released under GNU AGPL v3 license, you may redistribute it + * and/or modify it under version 3 of the License, or (at your option), any later version. */ #include "InventoryChangeFailureAction.h" diff --git a/src/strategy/actions/InventoryChangeFailureAction.h b/src/strategy/actions/InventoryChangeFailureAction.h index a8596adba0..6877d09864 100644 --- a/src/strategy/actions/InventoryChangeFailureAction.h +++ b/src/strategy/actions/InventoryChangeFailureAction.h @@ -1,6 +1,6 @@ /* - * Copyright (C) 2016+ AzerothCore , released under GNU GPL v2 license, you may redistribute it - * and/or modify it under version 2 of the License, or (at your option), any later version. + * Copyright (C) 2016+ AzerothCore , released under GNU AGPL v3 license, you may redistribute it + * and/or modify it under version 3 of the License, or (at your option), any later version. */ #ifndef _PLAYERBOT_INVENTORYCHANGEFAILUREACTION_H diff --git a/src/strategy/actions/InviteToGroupAction.cpp b/src/strategy/actions/InviteToGroupAction.cpp index 89b8122c78..7af26210c6 100644 --- a/src/strategy/actions/InviteToGroupAction.cpp +++ b/src/strategy/actions/InviteToGroupAction.cpp @@ -1,6 +1,6 @@ /* - * Copyright (C) 2016+ AzerothCore , released under GNU GPL v2 license, you may redistribute it - * and/or modify it under version 2 of the License, or (at your option), any later version. + * Copyright (C) 2016+ AzerothCore , released under GNU AGPL v3 license, you may redistribute it + * and/or modify it under version 3 of the License, or (at your option), any later version. */ #include "InviteToGroupAction.h" diff --git a/src/strategy/actions/InviteToGroupAction.h b/src/strategy/actions/InviteToGroupAction.h index 04168ddb5f..4b9f2c7f63 100644 --- a/src/strategy/actions/InviteToGroupAction.h +++ b/src/strategy/actions/InviteToGroupAction.h @@ -1,6 +1,6 @@ /* - * Copyright (C) 2016+ AzerothCore , released under GNU GPL v2 license, you may redistribute it - * and/or modify it under version 2 of the License, or (at your option), any later version. + * Copyright (C) 2016+ AzerothCore , released under GNU AGPL v3 license, you may redistribute it + * and/or modify it under version 3 of the License, or (at your option), any later version. */ #ifndef _PLAYERBOT_INVITETOGROUPACTION_H diff --git a/src/strategy/actions/LeaveGroupAction.cpp b/src/strategy/actions/LeaveGroupAction.cpp index 5eca0cde66..2773ce4ba4 100644 --- a/src/strategy/actions/LeaveGroupAction.cpp +++ b/src/strategy/actions/LeaveGroupAction.cpp @@ -1,6 +1,6 @@ /* - * Copyright (C) 2016+ AzerothCore , released under GNU GPL v2 license, you may redistribute it - * and/or modify it under version 2 of the License, or (at your option), any later version. + * Copyright (C) 2016+ AzerothCore , released under GNU AGPL v3 license, you may redistribute it + * and/or modify it under version 3 of the License, or (at your option), any later version. */ #include "LeaveGroupAction.h" diff --git a/src/strategy/actions/LeaveGroupAction.h b/src/strategy/actions/LeaveGroupAction.h index 824b905550..dcb4e96ce5 100644 --- a/src/strategy/actions/LeaveGroupAction.h +++ b/src/strategy/actions/LeaveGroupAction.h @@ -1,6 +1,6 @@ /* - * Copyright (C) 2016+ AzerothCore , released under GNU GPL v2 license, you may redistribute it - * and/or modify it under version 2 of the License, or (at your option), any later version. + * Copyright (C) 2016+ AzerothCore , released under GNU AGPL v3 license, you may redistribute it + * and/or modify it under version 3 of the License, or (at your option), any later version. */ #ifndef _PLAYERBOT_LEAVEGROUPACTION_H diff --git a/src/strategy/actions/LfgActions.cpp b/src/strategy/actions/LfgActions.cpp index c56ddeafea..406a0ec05e 100644 --- a/src/strategy/actions/LfgActions.cpp +++ b/src/strategy/actions/LfgActions.cpp @@ -1,6 +1,6 @@ /* - * Copyright (C) 2016+ AzerothCore , released under GNU GPL v2 license, you may redistribute it - * and/or modify it under version 2 of the License, or (at your option), any later version. + * Copyright (C) 2016+ AzerothCore , released under GNU AGPL v3 license, you may redistribute it + * and/or modify it under version 3 of the License, or (at your option), any later version. */ #include "LfgActions.h" diff --git a/src/strategy/actions/LfgActions.h b/src/strategy/actions/LfgActions.h index 9f23389b3a..8622a42d76 100644 --- a/src/strategy/actions/LfgActions.h +++ b/src/strategy/actions/LfgActions.h @@ -1,6 +1,6 @@ /* - * Copyright (C) 2016+ AzerothCore , released under GNU GPL v2 license, you may redistribute it - * and/or modify it under version 2 of the License, or (at your option), any later version. + * Copyright (C) 2016+ AzerothCore , released under GNU AGPL v3 license, you may redistribute it + * and/or modify it under version 3 of the License, or (at your option), any later version. */ #ifndef _PLAYERBOT_LFGACTIONS_H diff --git a/src/strategy/actions/ListQuestsActions.cpp b/src/strategy/actions/ListQuestsActions.cpp index 7f5d987847..7968417059 100644 --- a/src/strategy/actions/ListQuestsActions.cpp +++ b/src/strategy/actions/ListQuestsActions.cpp @@ -1,6 +1,6 @@ /* - * Copyright (C) 2016+ AzerothCore , released under GNU GPL v2 license, you may redistribute it - * and/or modify it under version 2 of the License, or (at your option), any later version. + * Copyright (C) 2016+ AzerothCore , released under GNU AGPL v3 license, you may redistribute it + * and/or modify it under version 3 of the License, or (at your option), any later version. */ #include "ListQuestsActions.h" diff --git a/src/strategy/actions/ListQuestsActions.h b/src/strategy/actions/ListQuestsActions.h index aea5dbadcc..2cf2d592ae 100644 --- a/src/strategy/actions/ListQuestsActions.h +++ b/src/strategy/actions/ListQuestsActions.h @@ -1,6 +1,6 @@ /* - * Copyright (C) 2016+ AzerothCore , released under GNU GPL v2 license, you may redistribute it - * and/or modify it under version 2 of the License, or (at your option), any later version. + * Copyright (C) 2016+ AzerothCore , released under GNU AGPL v3 license, you may redistribute it + * and/or modify it under version 3 of the License, or (at your option), any later version. */ #ifndef _PLAYERBOT_LISTQUESTSACTIONS_H diff --git a/src/strategy/actions/ListSpellsAction.cpp b/src/strategy/actions/ListSpellsAction.cpp index e78851551d..3a3ad7f679 100644 --- a/src/strategy/actions/ListSpellsAction.cpp +++ b/src/strategy/actions/ListSpellsAction.cpp @@ -1,6 +1,6 @@ /* - * Copyright (C) 2016+ AzerothCore , released under GNU GPL v2 license, you may redistribute it - * and/or modify it under version 2 of the License, or (at your option), any later version. + * Copyright (C) 2016+ AzerothCore , released under GNU AGPL v3 license, you may redistribute it + * and/or modify it under version 3 of the License, or (at your option), any later version. */ #include "ListSpellsAction.h" diff --git a/src/strategy/actions/ListSpellsAction.h b/src/strategy/actions/ListSpellsAction.h index 0290c52377..5fa44bc1f7 100644 --- a/src/strategy/actions/ListSpellsAction.h +++ b/src/strategy/actions/ListSpellsAction.h @@ -1,6 +1,6 @@ /* - * Copyright (C) 2016+ AzerothCore , released under GNU GPL v2 license, you may redistribute it - * and/or modify it under version 2 of the License, or (at your option), any later version. + * Copyright (C) 2016+ AzerothCore , released under GNU AGPL v3 license, you may redistribute it + * and/or modify it under version 3 of the License, or (at your option), any later version. */ #ifndef _PLAYERBOT_LISTSPELLSACTION_H diff --git a/src/strategy/actions/LogLevelAction.cpp b/src/strategy/actions/LogLevelAction.cpp index 0b8ff485cc..cd8b5c28d4 100644 --- a/src/strategy/actions/LogLevelAction.cpp +++ b/src/strategy/actions/LogLevelAction.cpp @@ -1,6 +1,6 @@ /* - * Copyright (C) 2016+ AzerothCore , released under GNU GPL v2 license, you may redistribute it - * and/or modify it under version 2 of the License, or (at your option), any later version. + * Copyright (C) 2016+ AzerothCore , released under GNU AGPL v3 license, you may redistribute it + * and/or modify it under version 3 of the License, or (at your option), any later version. */ #include "LogLevelAction.h" diff --git a/src/strategy/actions/LogLevelAction.h b/src/strategy/actions/LogLevelAction.h index 8bd6c7399e..3aefaf9707 100644 --- a/src/strategy/actions/LogLevelAction.h +++ b/src/strategy/actions/LogLevelAction.h @@ -1,6 +1,6 @@ /* - * Copyright (C) 2016+ AzerothCore , released under GNU GPL v2 license, you may redistribute it - * and/or modify it under version 2 of the License, or (at your option), any later version. + * Copyright (C) 2016+ AzerothCore , released under GNU AGPL v3 license, you may redistribute it + * and/or modify it under version 3 of the License, or (at your option), any later version. */ #ifndef _PLAYERBOT_LOGLEVELACTION_H diff --git a/src/strategy/actions/LootAction.cpp b/src/strategy/actions/LootAction.cpp index 9f2de51d25..2e0656e711 100644 --- a/src/strategy/actions/LootAction.cpp +++ b/src/strategy/actions/LootAction.cpp @@ -1,6 +1,6 @@ /* - * Copyright (C) 2016+ AzerothCore , released under GNU GPL v2 license, you may redistribute it - * and/or modify it under version 2 of the License, or (at your option), any later version. + * Copyright (C) 2016+ AzerothCore , released under GNU AGPL v3 license, you may redistribute it + * and/or modify it under version 3 of the License, or (at your option), any later version. */ #include "LootAction.h" diff --git a/src/strategy/actions/LootAction.h b/src/strategy/actions/LootAction.h index 5607fc789c..b657ee8cba 100644 --- a/src/strategy/actions/LootAction.h +++ b/src/strategy/actions/LootAction.h @@ -1,6 +1,6 @@ /* - * Copyright (C) 2016+ AzerothCore , released under GNU GPL v2 license, you may redistribute it - * and/or modify it under version 2 of the License, or (at your option), any later version. + * Copyright (C) 2016+ AzerothCore , released under GNU AGPL v3 license, you may redistribute it + * and/or modify it under version 3 of the License, or (at your option), any later version. */ #ifndef _PLAYERBOT_LOOTACTION_H diff --git a/src/strategy/actions/LootRollAction.cpp b/src/strategy/actions/LootRollAction.cpp index 66ff1d0ff7..3b3a4240ec 100644 --- a/src/strategy/actions/LootRollAction.cpp +++ b/src/strategy/actions/LootRollAction.cpp @@ -1,6 +1,6 @@ /* - * Copyright (C) 2016+ AzerothCore , released under GNU GPL v2 license, you may redistribute it - * and/or modify it under version 2 of the License, or (at your option), any later version. + * Copyright (C) 2016+ AzerothCore , released under GNU AGPL v3 license, you may redistribute it + * and/or modify it under version 3 of the License, or (at your option), any later version. */ #include "LootRollAction.h" diff --git a/src/strategy/actions/LootRollAction.h b/src/strategy/actions/LootRollAction.h index 2582274c79..13d8958605 100644 --- a/src/strategy/actions/LootRollAction.h +++ b/src/strategy/actions/LootRollAction.h @@ -1,6 +1,6 @@ /* - * Copyright (C) 2016+ AzerothCore , released under GNU GPL v2 license, you may redistribute it - * and/or modify it under version 2 of the License, or (at your option), any later version. + * Copyright (C) 2016+ AzerothCore , released under GNU AGPL v3 license, you may redistribute it + * and/or modify it under version 3 of the License, or (at your option), any later version. */ #ifndef _PLAYERBOT_LOOTROLLACTION_H diff --git a/src/strategy/actions/LootStrategyAction.cpp b/src/strategy/actions/LootStrategyAction.cpp index db09727f84..68f8089c2e 100644 --- a/src/strategy/actions/LootStrategyAction.cpp +++ b/src/strategy/actions/LootStrategyAction.cpp @@ -1,6 +1,6 @@ /* - * Copyright (C) 2016+ AzerothCore , released under GNU GPL v2 license, you may redistribute it - * and/or modify it under version 2 of the License, or (at your option), any later version. + * Copyright (C) 2016+ AzerothCore , released under GNU AGPL v3 license, you may redistribute it + * and/or modify it under version 3 of the License, or (at your option), any later version. */ #include "LootStrategyAction.h" diff --git a/src/strategy/actions/LootStrategyAction.h b/src/strategy/actions/LootStrategyAction.h index 6dcd5b4018..a972066ad8 100644 --- a/src/strategy/actions/LootStrategyAction.h +++ b/src/strategy/actions/LootStrategyAction.h @@ -1,6 +1,6 @@ /* - * Copyright (C) 2016+ AzerothCore , released under GNU GPL v2 license, you may redistribute it - * and/or modify it under version 2 of the License, or (at your option), any later version. + * Copyright (C) 2016+ AzerothCore , released under GNU AGPL v3 license, you may redistribute it + * and/or modify it under version 3 of the License, or (at your option), any later version. */ #ifndef _PLAYERBOT_LOOTSTRATEGYACTION_H diff --git a/src/strategy/actions/MailAction.cpp b/src/strategy/actions/MailAction.cpp index f15034b24e..4ee2fee6d7 100644 --- a/src/strategy/actions/MailAction.cpp +++ b/src/strategy/actions/MailAction.cpp @@ -1,6 +1,6 @@ /* - * Copyright (C) 2016+ AzerothCore , released under GNU GPL v2 license, you may redistribute it - * and/or modify it under version 2 of the License, or (at your option), any later version. + * Copyright (C) 2016+ AzerothCore , released under GNU AGPL v3 license, you may redistribute it + * and/or modify it under version 3 of the License, or (at your option), any later version. */ #include "MailAction.h" diff --git a/src/strategy/actions/MailAction.h b/src/strategy/actions/MailAction.h index c54cac3d22..e66d4147fb 100644 --- a/src/strategy/actions/MailAction.h +++ b/src/strategy/actions/MailAction.h @@ -1,6 +1,6 @@ /* - * Copyright (C) 2016+ AzerothCore , released under GNU GPL v2 license, you may redistribute it - * and/or modify it under version 2 of the License, or (at your option), any later version. + * Copyright (C) 2016+ AzerothCore , released under GNU AGPL v3 license, you may redistribute it + * and/or modify it under version 3 of the License, or (at your option), any later version. */ #ifndef _PLAYERBOT_MAILACTION_H diff --git a/src/strategy/actions/MoveToRpgTargetAction.cpp b/src/strategy/actions/MoveToRpgTargetAction.cpp index 4facc600b0..618af10af1 100644 --- a/src/strategy/actions/MoveToRpgTargetAction.cpp +++ b/src/strategy/actions/MoveToRpgTargetAction.cpp @@ -1,6 +1,6 @@ /* - * Copyright (C) 2016+ AzerothCore , released under GNU GPL v2 license, you may redistribute it - * and/or modify it under version 2 of the License, or (at your option), any later version. + * Copyright (C) 2016+ AzerothCore , released under GNU AGPL v3 license, you may redistribute it + * and/or modify it under version 3 of the License, or (at your option), any later version. */ #include "MoveToRpgTargetAction.h" diff --git a/src/strategy/actions/MoveToRpgTargetAction.h b/src/strategy/actions/MoveToRpgTargetAction.h index 19ef196848..6dd6558bb9 100644 --- a/src/strategy/actions/MoveToRpgTargetAction.h +++ b/src/strategy/actions/MoveToRpgTargetAction.h @@ -1,6 +1,6 @@ /* - * Copyright (C) 2016+ AzerothCore , released under GNU GPL v2 license, you may redistribute it - * and/or modify it under version 2 of the License, or (at your option), any later version. + * Copyright (C) 2016+ AzerothCore , released under GNU AGPL v3 license, you may redistribute it + * and/or modify it under version 3 of the License, or (at your option), any later version. */ #ifndef _PLAYERBOT_MOVETORPGTARGETACTION_H diff --git a/src/strategy/actions/MoveToTravelTargetAction.cpp b/src/strategy/actions/MoveToTravelTargetAction.cpp index 9ae28919d7..a4dec2caac 100644 --- a/src/strategy/actions/MoveToTravelTargetAction.cpp +++ b/src/strategy/actions/MoveToTravelTargetAction.cpp @@ -1,6 +1,6 @@ /* - * Copyright (C) 2016+ AzerothCore , released under GNU GPL v2 license, you may redistribute it - * and/or modify it under version 2 of the License, or (at your option), any later version. + * Copyright (C) 2016+ AzerothCore , released under GNU AGPL v3 license, you may redistribute it + * and/or modify it under version 3 of the License, or (at your option), any later version. */ #include "MoveToTravelTargetAction.h" diff --git a/src/strategy/actions/MoveToTravelTargetAction.h b/src/strategy/actions/MoveToTravelTargetAction.h index 9f6400a99f..3d8609cbba 100644 --- a/src/strategy/actions/MoveToTravelTargetAction.h +++ b/src/strategy/actions/MoveToTravelTargetAction.h @@ -1,6 +1,6 @@ /* - * Copyright (C) 2016+ AzerothCore , released under GNU GPL v2 license, you may redistribute it - * and/or modify it under version 2 of the License, or (at your option), any later version. + * Copyright (C) 2016+ AzerothCore , released under GNU AGPL v3 license, you may redistribute it + * and/or modify it under version 3 of the License, or (at your option), any later version. */ #ifndef _PLAYERBOT_MOVETOTRAVELTARGETACTION_H diff --git a/src/strategy/actions/MovementActions.cpp b/src/strategy/actions/MovementActions.cpp index fd828ea4f8..371d11c2b1 100644 --- a/src/strategy/actions/MovementActions.cpp +++ b/src/strategy/actions/MovementActions.cpp @@ -1,6 +1,6 @@ /* - * Copyright (C) 2016+ AzerothCore , released under GNU GPL v2 license, you may redistribute it - * and/or modify it under version 2 of the License, or (at your option), any later version. + * Copyright (C) 2016+ AzerothCore , released under GNU AGPL v3 license, you may redistribute it + * and/or modify it under version 3 of the License, or (at your option), any later version. */ #include "MovementActions.h" diff --git a/src/strategy/actions/MovementActions.h b/src/strategy/actions/MovementActions.h index e639c5cb38..b5f7a38912 100644 --- a/src/strategy/actions/MovementActions.h +++ b/src/strategy/actions/MovementActions.h @@ -1,6 +1,6 @@ /* - * Copyright (C) 2016+ AzerothCore , released under GNU GPL v2 license, you may redistribute it - * and/or modify it under version 2 of the License, or (at your option), any later version. + * Copyright (C) 2016+ AzerothCore , released under GNU AGPL v3 license, you may redistribute it + * and/or modify it under version 3 of the License, or (at your option), any later version. */ #ifndef _PLAYERBOT_MOVEMENTACTIONS_H diff --git a/src/strategy/actions/NonCombatActions.cpp b/src/strategy/actions/NonCombatActions.cpp index 60628bc753..e810ad27cd 100644 --- a/src/strategy/actions/NonCombatActions.cpp +++ b/src/strategy/actions/NonCombatActions.cpp @@ -1,6 +1,6 @@ /* - * Copyright (C) 2016+ AzerothCore , released under GNU GPL v2 license, you may redistribute it - * and/or modify it under version 2 of the License, or (at your option), any later version. + * Copyright (C) 2016+ AzerothCore , released under GNU AGPL v3 license, you may redistribute it + * and/or modify it under version 3 of the License, or (at your option), any later version. */ #include "NonCombatActions.h" diff --git a/src/strategy/actions/NonCombatActions.h b/src/strategy/actions/NonCombatActions.h index 5d30d498db..3156d49921 100644 --- a/src/strategy/actions/NonCombatActions.h +++ b/src/strategy/actions/NonCombatActions.h @@ -1,6 +1,6 @@ /* - * Copyright (C) 2016+ AzerothCore , released under GNU GPL v2 license, you may redistribute it - * and/or modify it under version 2 of the License, or (at your option), any later version. + * Copyright (C) 2016+ AzerothCore , released under GNU AGPL v3 license, you may redistribute it + * and/or modify it under version 3 of the License, or (at your option), any later version. */ #ifndef _PLAYERBOT_NONCOMBATACTIONS_H diff --git a/src/strategy/actions/OpenItemAction.h b/src/strategy/actions/OpenItemAction.h index 6ab73b79f5..c221741b33 100644 --- a/src/strategy/actions/OpenItemAction.h +++ b/src/strategy/actions/OpenItemAction.h @@ -1,6 +1,6 @@ /* - * Copyright (C) 2016+ AzerothCore , released under GNU GPL v2 license, - * you may redistribute it and/or modify it under version 2 of the License, or (at your option), any later version. + * Copyright (C) 2016+ AzerothCore , released under GNU AGPL v3 license, + * you may redistribute it and/or modify it under version 3 of the License, or (at your option), any later version. */ #ifndef _PLAYERBOT_OPENITEMACTION_H diff --git a/src/strategy/actions/OutfitAction.cpp b/src/strategy/actions/OutfitAction.cpp index 986fbe4803..78f7f9bc45 100644 --- a/src/strategy/actions/OutfitAction.cpp +++ b/src/strategy/actions/OutfitAction.cpp @@ -1,6 +1,6 @@ /* - * Copyright (C) 2016+ AzerothCore , released under GNU GPL v2 license, you may redistribute it - * and/or modify it under version 2 of the License, or (at your option), any later version. + * Copyright (C) 2016+ AzerothCore , released under GNU AGPL v3 license, you may redistribute it + * and/or modify it under version 3 of the License, or (at your option), any later version. */ #include "OutfitAction.h" diff --git a/src/strategy/actions/OutfitAction.h b/src/strategy/actions/OutfitAction.h index 2a6e678522..b530504c88 100644 --- a/src/strategy/actions/OutfitAction.h +++ b/src/strategy/actions/OutfitAction.h @@ -1,6 +1,6 @@ /* - * Copyright (C) 2016+ AzerothCore , released under GNU GPL v2 license, you may redistribute it - * and/or modify it under version 2 of the License, or (at your option), any later version. + * Copyright (C) 2016+ AzerothCore , released under GNU AGPL v3 license, you may redistribute it + * and/or modify it under version 3 of the License, or (at your option), any later version. */ #ifndef _PLAYERBOT_OUTFITACTION_H diff --git a/src/strategy/actions/PassLeadershipToMasterAction.cpp b/src/strategy/actions/PassLeadershipToMasterAction.cpp index a362c2cb0a..ceb1fbbcf2 100644 --- a/src/strategy/actions/PassLeadershipToMasterAction.cpp +++ b/src/strategy/actions/PassLeadershipToMasterAction.cpp @@ -1,6 +1,6 @@ /* - * Copyright (C) 2016+ AzerothCore , released under GNU GPL v2 license, you may redistribute it - * and/or modify it under version 2 of the License, or (at your option), any later version. + * Copyright (C) 2016+ AzerothCore , released under GNU AGPL v3 license, you may redistribute it + * and/or modify it under version 3 of the License, or (at your option), any later version. */ #include "PassLeadershipToMasterAction.h" diff --git a/src/strategy/actions/PassLeadershipToMasterAction.h b/src/strategy/actions/PassLeadershipToMasterAction.h index a4ab15c440..afa5663bc8 100644 --- a/src/strategy/actions/PassLeadershipToMasterAction.h +++ b/src/strategy/actions/PassLeadershipToMasterAction.h @@ -1,6 +1,6 @@ /* - * Copyright (C) 2016+ AzerothCore , released under GNU GPL v2 license, you may redistribute it - * and/or modify it under version 2 of the License, or (at your option), any later version. + * Copyright (C) 2016+ AzerothCore , released under GNU AGPL v3 license, you may redistribute it + * and/or modify it under version 3 of the License, or (at your option), any later version. */ #ifndef _PLAYERBOT_PASSLEADERSHIPTOMASTERACTION_H diff --git a/src/strategy/actions/PetAction.cpp b/src/strategy/actions/PetAction.cpp index e149b42efb..963ff09b16 100644 --- a/src/strategy/actions/PetAction.cpp +++ b/src/strategy/actions/PetAction.cpp @@ -1,6 +1,6 @@ /* - * Copyright (C) 2016+ AzerothCore , released under GNU GPL v2 license, you may redistribute it - * and/or modify it under version 2 of the License, or (at your option), any later version. + * Copyright (C) 2016+ AzerothCore , released under GNU AGPL v3 license, you may redistribute it + * and/or modify it under version 3 of the License, or (at your option), any later version. */ #include "PetAction.h" diff --git a/src/strategy/actions/PetAction.h b/src/strategy/actions/PetAction.h index 5ca4919113..ed4af4d86d 100644 --- a/src/strategy/actions/PetAction.h +++ b/src/strategy/actions/PetAction.h @@ -1,6 +1,6 @@ /* - * Copyright (C) 2016+ AzerothCore , released under GNU GPL v2 license, you may redistribute it - * and/or modify it under version 2 of the License, or (at your option), any later version. + * Copyright (C) 2016+ AzerothCore , released under GNU AGPL v3 license, you may redistribute it + * and/or modify it under version 3 of the License, or (at your option), any later version. */ #ifndef _PLAYERBOT_PETACTION_H diff --git a/src/strategy/actions/PetitionSignAction.cpp b/src/strategy/actions/PetitionSignAction.cpp index 025f044770..9b6cebfcb4 100644 --- a/src/strategy/actions/PetitionSignAction.cpp +++ b/src/strategy/actions/PetitionSignAction.cpp @@ -1,6 +1,6 @@ /* - * Copyright (C) 2016+ AzerothCore , released under GNU GPL v2 license, you may redistribute it - * and/or modify it under version 2 of the License, or (at your option), any later version. + * Copyright (C) 2016+ AzerothCore , released under GNU AGPL v3 license, you may redistribute it + * and/or modify it under version 3 of the License, or (at your option), any later version. */ #include "PetitionSignAction.h" diff --git a/src/strategy/actions/PetitionSignAction.h b/src/strategy/actions/PetitionSignAction.h index b73e4283a8..9eb8b3131a 100644 --- a/src/strategy/actions/PetitionSignAction.h +++ b/src/strategy/actions/PetitionSignAction.h @@ -1,6 +1,6 @@ /* - * Copyright (C) 2016+ AzerothCore , released under GNU GPL v2 license, you may redistribute it - * and/or modify it under version 2 of the License, or (at your option), any later version. + * Copyright (C) 2016+ AzerothCore , released under GNU AGPL v3 license, you may redistribute it + * and/or modify it under version 3 of the License, or (at your option), any later version. */ #ifndef _PLAYERBOT_PETITIONSIGNACTION_H diff --git a/src/strategy/actions/PositionAction.cpp b/src/strategy/actions/PositionAction.cpp index 3888f28f07..2de27f0414 100644 --- a/src/strategy/actions/PositionAction.cpp +++ b/src/strategy/actions/PositionAction.cpp @@ -1,6 +1,6 @@ /* - * Copyright (C) 2016+ AzerothCore , released under GNU GPL v2 license, you may redistribute it - * and/or modify it under version 2 of the License, or (at your option), any later version. + * Copyright (C) 2016+ AzerothCore , released under GNU AGPL v3 license, you may redistribute it + * and/or modify it under version 3 of the License, or (at your option), any later version. */ #include "PositionAction.h" diff --git a/src/strategy/actions/PositionAction.h b/src/strategy/actions/PositionAction.h index 16a671debf..7e8173924f 100644 --- a/src/strategy/actions/PositionAction.h +++ b/src/strategy/actions/PositionAction.h @@ -1,6 +1,6 @@ /* - * Copyright (C) 2016+ AzerothCore , released under GNU GPL v2 license, you may redistribute it - * and/or modify it under version 2 of the License, or (at your option), any later version. + * Copyright (C) 2016+ AzerothCore , released under GNU AGPL v3 license, you may redistribute it + * and/or modify it under version 3 of the License, or (at your option), any later version. */ #ifndef _PLAYERBOT_POSITIONACTION_H diff --git a/src/strategy/actions/QueryItemUsageAction.cpp b/src/strategy/actions/QueryItemUsageAction.cpp index 71d462455c..2fbc75af8f 100644 --- a/src/strategy/actions/QueryItemUsageAction.cpp +++ b/src/strategy/actions/QueryItemUsageAction.cpp @@ -1,6 +1,6 @@ /* - * Copyright (C) 2016+ AzerothCore , released under GNU GPL v2 license, you may redistribute it - * and/or modify it under version 2 of the License, or (at your option), any later version. + * Copyright (C) 2016+ AzerothCore , released under GNU AGPL v3 license, you may redistribute it + * and/or modify it under version 3 of the License, or (at your option), any later version. */ #include "QueryItemUsageAction.h" diff --git a/src/strategy/actions/QueryItemUsageAction.h b/src/strategy/actions/QueryItemUsageAction.h index 44df214335..f2f8bc2ced 100644 --- a/src/strategy/actions/QueryItemUsageAction.h +++ b/src/strategy/actions/QueryItemUsageAction.h @@ -1,6 +1,6 @@ /* - * Copyright (C) 2016+ AzerothCore , released under GNU GPL v2 license, you may redistribute it - * and/or modify it under version 2 of the License, or (at your option), any later version. + * Copyright (C) 2016+ AzerothCore , released under GNU AGPL v3 license, you may redistribute it + * and/or modify it under version 3 of the License, or (at your option), any later version. */ #ifndef _PLAYERBOT_QUERYITEMUSAGEACTION_H diff --git a/src/strategy/actions/QueryQuestAction.cpp b/src/strategy/actions/QueryQuestAction.cpp index 67f12066fa..6ceccad975 100644 --- a/src/strategy/actions/QueryQuestAction.cpp +++ b/src/strategy/actions/QueryQuestAction.cpp @@ -1,6 +1,6 @@ /* - * Copyright (C) 2016+ AzerothCore , released under GNU GPL v2 license, you may redistribute it - * and/or modify it under version 2 of the License, or (at your option), any later version. + * Copyright (C) 2016+ AzerothCore , released under GNU AGPL v3 license, you may redistribute it + * and/or modify it under version 3 of the License, or (at your option), any later version. */ #include "QueryQuestAction.h" diff --git a/src/strategy/actions/QueryQuestAction.h b/src/strategy/actions/QueryQuestAction.h index dd0c581977..3088509010 100644 --- a/src/strategy/actions/QueryQuestAction.h +++ b/src/strategy/actions/QueryQuestAction.h @@ -1,6 +1,6 @@ /* - * Copyright (C) 2016+ AzerothCore , released under GNU GPL v2 license, you may redistribute it - * and/or modify it under version 2 of the License, or (at your option), any later version. + * Copyright (C) 2016+ AzerothCore , released under GNU AGPL v3 license, you may redistribute it + * and/or modify it under version 3 of the License, or (at your option), any later version. */ #ifndef _PLAYERBOT_QUERYQUESTACTION_H diff --git a/src/strategy/actions/QuestAction.cpp b/src/strategy/actions/QuestAction.cpp index 7d3b437865..39e8e1ba68 100644 --- a/src/strategy/actions/QuestAction.cpp +++ b/src/strategy/actions/QuestAction.cpp @@ -1,6 +1,6 @@ /* - * Copyright (C) 2016+ AzerothCore , released under GNU GPL v2 license, you may redistribute it - * and/or modify it under version 2 of the License, or (at your option), any later version. + * Copyright (C) 2016+ AzerothCore , released under GNU AGPL v3 license, you may redistribute it + * and/or modify it under version 3 of the License, or (at your option), any later version. */ #include "QuestAction.h" diff --git a/src/strategy/actions/QuestAction.h b/src/strategy/actions/QuestAction.h index 680154cfc8..b9ca10e54b 100644 --- a/src/strategy/actions/QuestAction.h +++ b/src/strategy/actions/QuestAction.h @@ -1,6 +1,6 @@ /* - * Copyright (C) 2016+ AzerothCore , released under GNU GPL v2 license, you may redistribute it - * and/or modify it under version 2 of the License, or (at your option), any later version. + * Copyright (C) 2016+ AzerothCore , released under GNU AGPL v3 license, you may redistribute it + * and/or modify it under version 3 of the License, or (at your option), any later version. */ #ifndef _PLAYERBOT_QUESTACTION_H diff --git a/src/strategy/actions/QuestConfirmAcceptAction.h b/src/strategy/actions/QuestConfirmAcceptAction.h index e5383eba4e..029c6eeff2 100644 --- a/src/strategy/actions/QuestConfirmAcceptAction.h +++ b/src/strategy/actions/QuestConfirmAcceptAction.h @@ -1,6 +1,6 @@ /* - * Copyright (C) 2016+ AzerothCore , released under GNU GPL v2 license, you may redistribute it - * and/or modify it under version 2 of the License, or (at your option), any later version. + * Copyright (C) 2016+ AzerothCore , released under GNU AGPL v3 license, you may redistribute it + * and/or modify it under version 3 of the License, or (at your option), any later version. */ #ifndef _PLAYERBOT_QUESTCONFIRMACCEPTACTION_H diff --git a/src/strategy/actions/RandomBotUpdateAction.cpp b/src/strategy/actions/RandomBotUpdateAction.cpp index b4e1248ddb..1536cd6b92 100644 --- a/src/strategy/actions/RandomBotUpdateAction.cpp +++ b/src/strategy/actions/RandomBotUpdateAction.cpp @@ -1,6 +1,6 @@ /* - * Copyright (C) 2016+ AzerothCore , released under GNU GPL v2 license, you may redistribute it - * and/or modify it under version 2 of the License, or (at your option), any later version. + * Copyright (C) 2016+ AzerothCore , released under GNU AGPL v3 license, you may redistribute it + * and/or modify it under version 3 of the License, or (at your option), any later version. */ #include "RandomBotUpdateAction.h" diff --git a/src/strategy/actions/RandomBotUpdateAction.h b/src/strategy/actions/RandomBotUpdateAction.h index c615a86bb4..b5d940ad86 100644 --- a/src/strategy/actions/RandomBotUpdateAction.h +++ b/src/strategy/actions/RandomBotUpdateAction.h @@ -1,6 +1,6 @@ /* - * Copyright (C) 2016+ AzerothCore , released under GNU GPL v2 license, you may redistribute it - * and/or modify it under version 2 of the License, or (at your option), any later version. + * Copyright (C) 2016+ AzerothCore , released under GNU AGPL v3 license, you may redistribute it + * and/or modify it under version 3 of the License, or (at your option), any later version. */ #ifndef _PLAYERBOT_RANDOMBOTUPDATEACTION_H diff --git a/src/strategy/actions/RangeAction.cpp b/src/strategy/actions/RangeAction.cpp index a06c85323b..3cf9e6930d 100644 --- a/src/strategy/actions/RangeAction.cpp +++ b/src/strategy/actions/RangeAction.cpp @@ -1,6 +1,6 @@ /* - * Copyright (C) 2016+ AzerothCore , released under GNU GPL v2 license, you may redistribute it - * and/or modify it under version 2 of the License, or (at your option), any later version. + * Copyright (C) 2016+ AzerothCore , released under GNU AGPL v3 license, you may redistribute it + * and/or modify it under version 3 of the License, or (at your option), any later version. */ #include "RangeAction.h" diff --git a/src/strategy/actions/RangeAction.h b/src/strategy/actions/RangeAction.h index 0675a671ed..828fcc9785 100644 --- a/src/strategy/actions/RangeAction.h +++ b/src/strategy/actions/RangeAction.h @@ -1,6 +1,6 @@ /* - * Copyright (C) 2016+ AzerothCore , released under GNU GPL v2 license, you may redistribute it - * and/or modify it under version 2 of the License, or (at your option), any later version. + * Copyright (C) 2016+ AzerothCore , released under GNU AGPL v3 license, you may redistribute it + * and/or modify it under version 3 of the License, or (at your option), any later version. */ #ifndef _PLAYERBOT_RANGEACTION_H diff --git a/src/strategy/actions/ReachTargetActions.cpp b/src/strategy/actions/ReachTargetActions.cpp index f5e51011be..2be0da6beb 100644 --- a/src/strategy/actions/ReachTargetActions.cpp +++ b/src/strategy/actions/ReachTargetActions.cpp @@ -1,6 +1,6 @@ /* - * Copyright (C) 2016+ AzerothCore , released under GNU GPL v2 license, you may redistribute it - * and/or modify it under version 2 of the License, or (at your option), any later version. + * Copyright (C) 2016+ AzerothCore , released under GNU AGPL v3 license, you may redistribute it + * and/or modify it under version 3 of the License, or (at your option), any later version. */ #include "ReachTargetActions.h" diff --git a/src/strategy/actions/ReachTargetActions.h b/src/strategy/actions/ReachTargetActions.h index edf8ab5747..40559753f9 100644 --- a/src/strategy/actions/ReachTargetActions.h +++ b/src/strategy/actions/ReachTargetActions.h @@ -1,6 +1,6 @@ /* - * Copyright (C) 2016+ AzerothCore , released under GNU GPL v2 license, you may redistribute it - * and/or modify it under version 2 of the License, or (at your option), any later version. + * Copyright (C) 2016+ AzerothCore , released under GNU AGPL v3 license, you may redistribute it + * and/or modify it under version 3 of the License, or (at your option), any later version. */ #ifndef _PLAYERBOT_REACHTARGETACTIONS_H diff --git a/src/strategy/actions/ReadyCheckAction.cpp b/src/strategy/actions/ReadyCheckAction.cpp index a8a2d8caa5..00b9e4c281 100644 --- a/src/strategy/actions/ReadyCheckAction.cpp +++ b/src/strategy/actions/ReadyCheckAction.cpp @@ -1,6 +1,6 @@ /* - * Copyright (C) 2016+ AzerothCore , released under GNU GPL v2 license, you may redistribute it - * and/or modify it under version 2 of the License, or (at your option), any later version. + * Copyright (C) 2016+ AzerothCore , released under GNU AGPL v3 license, you may redistribute it + * and/or modify it under version 3 of the License, or (at your option), any later version. */ #include "ReadyCheckAction.h" diff --git a/src/strategy/actions/ReadyCheckAction.h b/src/strategy/actions/ReadyCheckAction.h index f64c15aa07..0c16c489b0 100644 --- a/src/strategy/actions/ReadyCheckAction.h +++ b/src/strategy/actions/ReadyCheckAction.h @@ -1,6 +1,6 @@ /* - * Copyright (C) 2016+ AzerothCore , released under GNU GPL v2 license, you may redistribute it - * and/or modify it under version 2 of the License, or (at your option), any later version. + * Copyright (C) 2016+ AzerothCore , released under GNU AGPL v3 license, you may redistribute it + * and/or modify it under version 3 of the License, or (at your option), any later version. */ #ifndef _PLAYERBOT_READYCHECKACTION_H diff --git a/src/strategy/actions/ReleaseSpiritAction.cpp b/src/strategy/actions/ReleaseSpiritAction.cpp index 0cae656912..92b7ac5504 100644 --- a/src/strategy/actions/ReleaseSpiritAction.cpp +++ b/src/strategy/actions/ReleaseSpiritAction.cpp @@ -1,6 +1,6 @@ /* - * Copyright (C) 2016+ AzerothCore , released under GNU GPL v2 license, you may redistribute it - * and/or modify it under version 2 of the License, or (at your option), any later version. + * Copyright (C) 2016+ AzerothCore , released under GNU AGPL v3 license, you may redistribute it + * and/or modify it under version 3 of the License, or (at your option), any later version. */ #include "ReleaseSpiritAction.h" diff --git a/src/strategy/actions/ReleaseSpiritAction.h b/src/strategy/actions/ReleaseSpiritAction.h index 7771f9ff47..debeab8497 100644 --- a/src/strategy/actions/ReleaseSpiritAction.h +++ b/src/strategy/actions/ReleaseSpiritAction.h @@ -1,6 +1,6 @@ /* - * Copyright (C) 2016+ AzerothCore , released under GNU GPL v2 license, you may redistribute it - * and/or modify it under version 2 of the License, or (at your option), any later version. + * Copyright (C) 2016+ AzerothCore , released under GNU AGPL v3 license, you may redistribute it + * and/or modify it under version 3 of the License, or (at your option), any later version. */ #ifndef PLAYERBOT_RELEASESPIRITACTION_H diff --git a/src/strategy/actions/RememberTaxiAction.cpp b/src/strategy/actions/RememberTaxiAction.cpp index f4922b9707..af5a540370 100644 --- a/src/strategy/actions/RememberTaxiAction.cpp +++ b/src/strategy/actions/RememberTaxiAction.cpp @@ -1,6 +1,6 @@ /* - * Copyright (C) 2016+ AzerothCore , released under GNU GPL v2 license, you may redistribute it - * and/or modify it under version 2 of the License, or (at your option), any later version. + * Copyright (C) 2016+ AzerothCore , released under GNU AGPL v3 license, you may redistribute it + * and/or modify it under version 3 of the License, or (at your option), any later version. */ #include "RememberTaxiAction.h" diff --git a/src/strategy/actions/RememberTaxiAction.h b/src/strategy/actions/RememberTaxiAction.h index 6d93f79597..e2de4b440d 100644 --- a/src/strategy/actions/RememberTaxiAction.h +++ b/src/strategy/actions/RememberTaxiAction.h @@ -1,6 +1,6 @@ /* - * Copyright (C) 2016+ AzerothCore , released under GNU GPL v2 license, you may redistribute it - * and/or modify it under version 2 of the License, or (at your option), any later version. + * Copyright (C) 2016+ AzerothCore , released under GNU AGPL v3 license, you may redistribute it + * and/or modify it under version 3 of the License, or (at your option), any later version. */ #ifndef _PLAYERBOT_REMEMBERTAXIACTION_H diff --git a/src/strategy/actions/RemoveAuraAction.cpp b/src/strategy/actions/RemoveAuraAction.cpp index a84d652af6..a863a5973b 100644 --- a/src/strategy/actions/RemoveAuraAction.cpp +++ b/src/strategy/actions/RemoveAuraAction.cpp @@ -1,6 +1,6 @@ /* - * Copyright (C) 2016+ AzerothCore , released under GNU GPL v2 license, you may redistribute it - * and/or modify it under version 2 of the License, or (at your option), any later version. + * Copyright (C) 2016+ AzerothCore , released under GNU AGPL v3 license, you may redistribute it + * and/or modify it under version 3 of the License, or (at your option), any later version. */ #include "RemoveAuraAction.h" diff --git a/src/strategy/actions/RemoveAuraAction.h b/src/strategy/actions/RemoveAuraAction.h index 297579a8ba..14f4073cd3 100644 --- a/src/strategy/actions/RemoveAuraAction.h +++ b/src/strategy/actions/RemoveAuraAction.h @@ -1,6 +1,6 @@ /* - * Copyright (C) 2016+ AzerothCore , released under GNU GPL v2 license, you may redistribute it - * and/or modify it under version 2 of the License, or (at your option), any later version. + * Copyright (C) 2016+ AzerothCore , released under GNU AGPL v3 license, you may redistribute it + * and/or modify it under version 3 of the License, or (at your option), any later version. */ #ifndef _PLAYERBOT_REMOVEAURAACTION_H diff --git a/src/strategy/actions/RepairAllAction.cpp b/src/strategy/actions/RepairAllAction.cpp index 2eaf07c339..a66ba3a1bb 100644 --- a/src/strategy/actions/RepairAllAction.cpp +++ b/src/strategy/actions/RepairAllAction.cpp @@ -1,6 +1,6 @@ /* - * Copyright (C) 2016+ AzerothCore , released under GNU GPL v2 license, you may redistribute it - * and/or modify it under version 2 of the License, or (at your option), any later version. + * Copyright (C) 2016+ AzerothCore , released under GNU AGPL v3 license, you may redistribute it + * and/or modify it under version 3 of the License, or (at your option), any later version. */ #include "RepairAllAction.h" diff --git a/src/strategy/actions/RepairAllAction.h b/src/strategy/actions/RepairAllAction.h index f938ffbf50..aec1af961d 100644 --- a/src/strategy/actions/RepairAllAction.h +++ b/src/strategy/actions/RepairAllAction.h @@ -1,6 +1,6 @@ /* - * Copyright (C) 2016+ AzerothCore , released under GNU GPL v2 license, you may redistribute it - * and/or modify it under version 2 of the License, or (at your option), any later version. + * Copyright (C) 2016+ AzerothCore , released under GNU AGPL v3 license, you may redistribute it + * and/or modify it under version 3 of the License, or (at your option), any later version. */ #ifndef _PLAYERBOT_REPAIRALLACTION_H diff --git a/src/strategy/actions/ResetAiAction.cpp b/src/strategy/actions/ResetAiAction.cpp index 181b097420..e97d090575 100644 --- a/src/strategy/actions/ResetAiAction.cpp +++ b/src/strategy/actions/ResetAiAction.cpp @@ -1,6 +1,6 @@ /* - * Copyright (C) 2016+ AzerothCore , released under GNU GPL v2 license, you may redistribute it - * and/or modify it under version 2 of the License, or (at your option), any later version. + * Copyright (C) 2016+ AzerothCore , released under GNU AGPL v3 license, you may redistribute it + * and/or modify it under version 3 of the License, or (at your option), any later version. */ #include "ResetAiAction.h" diff --git a/src/strategy/actions/ResetAiAction.h b/src/strategy/actions/ResetAiAction.h index b195faef71..092a031373 100644 --- a/src/strategy/actions/ResetAiAction.h +++ b/src/strategy/actions/ResetAiAction.h @@ -1,6 +1,6 @@ /* - * Copyright (C) 2016+ AzerothCore , released under GNU GPL v2 license, you may redistribute it - * and/or modify it under version 2 of the License, or (at your option), any later version. + * Copyright (C) 2016+ AzerothCore , released under GNU AGPL v3 license, you may redistribute it + * and/or modify it under version 3 of the License, or (at your option), any later version. */ #ifndef _PLAYERBOT_RESETAIACTION_H diff --git a/src/strategy/actions/ResetInstancesAction.cpp b/src/strategy/actions/ResetInstancesAction.cpp index e8768446ec..1c0a6f2480 100644 --- a/src/strategy/actions/ResetInstancesAction.cpp +++ b/src/strategy/actions/ResetInstancesAction.cpp @@ -1,6 +1,6 @@ /* - * Copyright (C) 2016+ AzerothCore , released under GNU GPL v2 license, you may redistribute it - * and/or modify it under version 2 of the License, or (at your option), any later version. + * Copyright (C) 2016+ AzerothCore , released under GNU AGPL v3 license, you may redistribute it + * and/or modify it under version 3 of the License, or (at your option), any later version. */ #include "ResetInstancesAction.h" diff --git a/src/strategy/actions/ResetInstancesAction.h b/src/strategy/actions/ResetInstancesAction.h index 7f04d4eb2a..b69256bc17 100644 --- a/src/strategy/actions/ResetInstancesAction.h +++ b/src/strategy/actions/ResetInstancesAction.h @@ -1,6 +1,6 @@ /* - * Copyright (C) 2016+ AzerothCore , released under GNU GPL v2 license, you may redistribute it - * and/or modify it under version 2 of the License, or (at your option), any later version. + * Copyright (C) 2016+ AzerothCore , released under GNU AGPL v3 license, you may redistribute it + * and/or modify it under version 3 of the License, or (at your option), any later version. */ #ifndef _PLAYERBOT_RESETINSTANCESACTION_H diff --git a/src/strategy/actions/RevealGatheringItemAction.cpp b/src/strategy/actions/RevealGatheringItemAction.cpp index 5697347fa1..00f1cc1db4 100644 --- a/src/strategy/actions/RevealGatheringItemAction.cpp +++ b/src/strategy/actions/RevealGatheringItemAction.cpp @@ -1,6 +1,6 @@ /* - * Copyright (C) 2016+ AzerothCore , released under GNU GPL v2 license, you may redistribute it - * and/or modify it under version 2 of the License, or (at your option), any later version. + * Copyright (C) 2016+ AzerothCore , released under GNU AGPL v3 license, you may redistribute it + * and/or modify it under version 3 of the License, or (at your option), any later version. */ #include "RevealGatheringItemAction.h" diff --git a/src/strategy/actions/RevealGatheringItemAction.h b/src/strategy/actions/RevealGatheringItemAction.h index f74c904886..cd0422476b 100644 --- a/src/strategy/actions/RevealGatheringItemAction.h +++ b/src/strategy/actions/RevealGatheringItemAction.h @@ -1,6 +1,6 @@ /* - * Copyright (C) 2016+ AzerothCore , released under GNU GPL v2 license, you may redistribute it - * and/or modify it under version 2 of the License, or (at your option), any later version. + * Copyright (C) 2016+ AzerothCore , released under GNU AGPL v3 license, you may redistribute it + * and/or modify it under version 3 of the License, or (at your option), any later version. */ #ifndef _PLAYERBOT_REVEALGATHERINGITEMACTION_H diff --git a/src/strategy/actions/ReviveFromCorpseAction.cpp b/src/strategy/actions/ReviveFromCorpseAction.cpp index 960f438f37..f281074736 100644 --- a/src/strategy/actions/ReviveFromCorpseAction.cpp +++ b/src/strategy/actions/ReviveFromCorpseAction.cpp @@ -1,6 +1,6 @@ /* - * Copyright (C) 2016+ AzerothCore , released under GNU GPL v2 license, you may redistribute it - * and/or modify it under version 2 of the License, or (at your option), any later version. + * Copyright (C) 2016+ AzerothCore , released under GNU AGPL v3 license, you may redistribute it + * and/or modify it under version 3 of the License, or (at your option), any later version. */ #include "ReviveFromCorpseAction.h" diff --git a/src/strategy/actions/ReviveFromCorpseAction.h b/src/strategy/actions/ReviveFromCorpseAction.h index 58c8572a7b..a20dd3c073 100644 --- a/src/strategy/actions/ReviveFromCorpseAction.h +++ b/src/strategy/actions/ReviveFromCorpseAction.h @@ -1,6 +1,6 @@ /* - * Copyright (C) 2016+ AzerothCore , released under GNU GPL v2 license, you may redistribute it - * and/or modify it under version 2 of the License, or (at your option), any later version. + * Copyright (C) 2016+ AzerothCore , released under GNU AGPL v3 license, you may redistribute it + * and/or modify it under version 3 of the License, or (at your option), any later version. */ #ifndef _PLAYERBOT_REVIVEFROMCORPSEACTION_H diff --git a/src/strategy/actions/RewardAction.cpp b/src/strategy/actions/RewardAction.cpp index fd5e6ae338..1022166d0f 100644 --- a/src/strategy/actions/RewardAction.cpp +++ b/src/strategy/actions/RewardAction.cpp @@ -1,6 +1,6 @@ /* - * Copyright (C) 2016+ AzerothCore , released under GNU GPL v2 license, you may redistribute it - * and/or modify it under version 2 of the License, or (at your option), any later version. + * Copyright (C) 2016+ AzerothCore , released under GNU AGPL v3 license, you may redistribute it + * and/or modify it under version 3 of the License, or (at your option), any later version. */ #include "RewardAction.h" diff --git a/src/strategy/actions/RewardAction.h b/src/strategy/actions/RewardAction.h index 5ae9a0f6a3..328777a942 100644 --- a/src/strategy/actions/RewardAction.h +++ b/src/strategy/actions/RewardAction.h @@ -1,6 +1,6 @@ /* - * Copyright (C) 2016+ AzerothCore , released under GNU GPL v2 license, you may redistribute it - * and/or modify it under version 2 of the License, or (at your option), any later version. + * Copyright (C) 2016+ AzerothCore , released under GNU AGPL v3 license, you may redistribute it + * and/or modify it under version 3 of the License, or (at your option), any later version. */ #ifndef _PLAYERBOT_REWARDACTION_H diff --git a/src/strategy/actions/RpgAction.cpp b/src/strategy/actions/RpgAction.cpp index f5ffa1309a..21b68d6bf8 100644 --- a/src/strategy/actions/RpgAction.cpp +++ b/src/strategy/actions/RpgAction.cpp @@ -1,6 +1,6 @@ /* - * Copyright (C) 2016+ AzerothCore , released under GNU GPL v2 license, you may redistribute it - * and/or modify it under version 2 of the License, or (at your option), any later version. + * Copyright (C) 2016+ AzerothCore , released under GNU AGPL v3 license, you may redistribute it + * and/or modify it under version 3 of the License, or (at your option), any later version. */ #include "RpgAction.h" diff --git a/src/strategy/actions/RpgAction.h b/src/strategy/actions/RpgAction.h index 7751df1753..c0485a8e74 100644 --- a/src/strategy/actions/RpgAction.h +++ b/src/strategy/actions/RpgAction.h @@ -1,6 +1,6 @@ /* - * Copyright (C) 2016+ AzerothCore , released under GNU GPL v2 license, you may redistribute it - * and/or modify it under version 2 of the License, or (at your option), any later version. + * Copyright (C) 2016+ AzerothCore , released under GNU AGPL v3 license, you may redistribute it + * and/or modify it under version 3 of the License, or (at your option), any later version. */ #ifndef _PLAYERBOT_RPGACTION_H diff --git a/src/strategy/actions/RpgSubActions.cpp b/src/strategy/actions/RpgSubActions.cpp index ac84ed2b50..784f6bbb20 100644 --- a/src/strategy/actions/RpgSubActions.cpp +++ b/src/strategy/actions/RpgSubActions.cpp @@ -1,6 +1,6 @@ /* - * Copyright (C) 2016+ AzerothCore , released under GNU GPL v2 license, you may redistribute it - * and/or modify it under version 2 of the License, or (at your option), any later version. + * Copyright (C) 2016+ AzerothCore , released under GNU AGPL v3 license, you may redistribute it + * and/or modify it under version 3 of the License, or (at your option), any later version. */ #include "RpgSubActions.h" diff --git a/src/strategy/actions/RpgSubActions.h b/src/strategy/actions/RpgSubActions.h index c0b39082a2..8d5fbda4c7 100644 --- a/src/strategy/actions/RpgSubActions.h +++ b/src/strategy/actions/RpgSubActions.h @@ -1,6 +1,6 @@ /* - * Copyright (C) 2016+ AzerothCore , released under GNU GPL v2 license, you may redistribute it - * and/or modify it under version 2 of the License, or (at your option), any later version. + * Copyright (C) 2016+ AzerothCore , released under GNU AGPL v3 license, you may redistribute it + * and/or modify it under version 3 of the License, or (at your option), any later version. */ #ifndef _PLAYERBOT_RPGSUBACTIONS_H diff --git a/src/strategy/actions/RpgValues.h b/src/strategy/actions/RpgValues.h index b3e3086790..bff78cc841 100644 --- a/src/strategy/actions/RpgValues.h +++ b/src/strategy/actions/RpgValues.h @@ -1,6 +1,6 @@ /* - * Copyright (C) 2016+ AzerothCore , released under GNU GPL v2 license, you may redistribute it - * and/or modify it under version 2 of the License, or (at your option), any later version. + * Copyright (C) 2016+ AzerothCore , released under GNU AGPL v3 license, you may redistribute it + * and/or modify it under version 3 of the License, or (at your option), any later version. */ #ifndef _PLAYERBOT_RPGVALUES_H diff --git a/src/strategy/actions/RtiAction.cpp b/src/strategy/actions/RtiAction.cpp index cf4a3d40bf..b34b3eec3d 100644 --- a/src/strategy/actions/RtiAction.cpp +++ b/src/strategy/actions/RtiAction.cpp @@ -1,6 +1,6 @@ /* - * Copyright (C) 2016+ AzerothCore , released under GNU GPL v2 license, you may redistribute it - * and/or modify it under version 2 of the License, or (at your option), any later version. + * Copyright (C) 2016+ AzerothCore , released under GNU AGPL v3 license, you may redistribute it + * and/or modify it under version 3 of the License, or (at your option), any later version. */ #include "RtiAction.h" diff --git a/src/strategy/actions/RtiAction.h b/src/strategy/actions/RtiAction.h index 5978a7d6c4..18b0aa44de 100644 --- a/src/strategy/actions/RtiAction.h +++ b/src/strategy/actions/RtiAction.h @@ -1,6 +1,6 @@ /* - * Copyright (C) 2016+ AzerothCore , released under GNU GPL v2 license, you may redistribute it - * and/or modify it under version 2 of the License, or (at your option), any later version. + * Copyright (C) 2016+ AzerothCore , released under GNU AGPL v3 license, you may redistribute it + * and/or modify it under version 3 of the License, or (at your option), any later version. */ #ifndef _PLAYERBOT_RTIACTION_H diff --git a/src/strategy/actions/RtscAction.cpp b/src/strategy/actions/RtscAction.cpp index 7d096ea516..4ed91d29c0 100644 --- a/src/strategy/actions/RtscAction.cpp +++ b/src/strategy/actions/RtscAction.cpp @@ -1,6 +1,6 @@ /* - * Copyright (C) 2016+ AzerothCore , released under GNU GPL v2 license, you may redistribute it - * and/or modify it under version 2 of the License, or (at your option), any later version. + * Copyright (C) 2016+ AzerothCore , released under GNU AGPL v3 license, you may redistribute it + * and/or modify it under version 3 of the License, or (at your option), any later version. */ #include "RtscAction.h" diff --git a/src/strategy/actions/RtscAction.h b/src/strategy/actions/RtscAction.h index 062b77ca4b..81ec27c034 100644 --- a/src/strategy/actions/RtscAction.h +++ b/src/strategy/actions/RtscAction.h @@ -1,6 +1,6 @@ /* - * Copyright (C) 2016+ AzerothCore , released under GNU GPL v2 license, you may redistribute it - * and/or modify it under version 2 of the License, or (at your option), any later version. + * Copyright (C) 2016+ AzerothCore , released under GNU AGPL v3 license, you may redistribute it + * and/or modify it under version 3 of the License, or (at your option), any later version. */ #ifndef _PLAYERBOT_RTSCACTION_H diff --git a/src/strategy/actions/SaveManaAction.cpp b/src/strategy/actions/SaveManaAction.cpp index 348141288d..bfabe36a64 100644 --- a/src/strategy/actions/SaveManaAction.cpp +++ b/src/strategy/actions/SaveManaAction.cpp @@ -1,6 +1,6 @@ /* - * Copyright (C) 2016+ AzerothCore , released under GNU GPL v2 license, you may redistribute it - * and/or modify it under version 2 of the License, or (at your option), any later version. + * Copyright (C) 2016+ AzerothCore , released under GNU AGPL v3 license, you may redistribute it + * and/or modify it under version 3 of the License, or (at your option), any later version. */ #include "SaveManaAction.h" diff --git a/src/strategy/actions/SaveManaAction.h b/src/strategy/actions/SaveManaAction.h index 0e3a5c9336..09edec9897 100644 --- a/src/strategy/actions/SaveManaAction.h +++ b/src/strategy/actions/SaveManaAction.h @@ -1,6 +1,6 @@ /* - * Copyright (C) 2016+ AzerothCore , released under GNU GPL v2 license, you may redistribute it - * and/or modify it under version 2 of the License, or (at your option), any later version. + * Copyright (C) 2016+ AzerothCore , released under GNU AGPL v3 license, you may redistribute it + * and/or modify it under version 3 of the License, or (at your option), any later version. */ #ifndef _PLAYERBOT_SAVEMANAACTION_H diff --git a/src/strategy/actions/SayAction.cpp b/src/strategy/actions/SayAction.cpp index f6a6c31606..474f37e4ce 100644 --- a/src/strategy/actions/SayAction.cpp +++ b/src/strategy/actions/SayAction.cpp @@ -1,6 +1,6 @@ /* - * Copyright (C) 2016+ AzerothCore , released under GNU GPL v2 license, you may redistribute it - * and/or modify it under version 2 of the License, or (at your option), any later version. + * Copyright (C) 2016+ AzerothCore , released under GNU AGPL v3 license, you may redistribute it + * and/or modify it under version 3 of the License, or (at your option), any later version. */ #include "AiFactory.h" diff --git a/src/strategy/actions/SayAction.h b/src/strategy/actions/SayAction.h index e184c9c8ce..5bf9a8f044 100644 --- a/src/strategy/actions/SayAction.h +++ b/src/strategy/actions/SayAction.h @@ -1,6 +1,6 @@ /* - * Copyright (C) 2016+ AzerothCore , released under GNU GPL v2 license, you may redistribute it - * and/or modify it under version 2 of the License, or (at your option), any later version. + * Copyright (C) 2016+ AzerothCore , released under GNU AGPL v3 license, you may redistribute it + * and/or modify it under version 3 of the License, or (at your option), any later version. */ #ifndef _PLAYERBOT_SAYACTION_H diff --git a/src/strategy/actions/SecurityCheckAction.cpp b/src/strategy/actions/SecurityCheckAction.cpp index afd0f9d138..1320eb04a6 100644 --- a/src/strategy/actions/SecurityCheckAction.cpp +++ b/src/strategy/actions/SecurityCheckAction.cpp @@ -1,6 +1,6 @@ /* - * Copyright (C) 2016+ AzerothCore , released under GNU GPL v2 license, you may redistribute it - * and/or modify it under version 2 of the License, or (at your option), any later version. + * Copyright (C) 2016+ AzerothCore , released under GNU AGPL v3 license, you may redistribute it + * and/or modify it under version 3 of the License, or (at your option), any later version. */ #include "SecurityCheckAction.h" diff --git a/src/strategy/actions/SecurityCheckAction.h b/src/strategy/actions/SecurityCheckAction.h index fa068ffafd..21f343ccba 100644 --- a/src/strategy/actions/SecurityCheckAction.h +++ b/src/strategy/actions/SecurityCheckAction.h @@ -1,6 +1,6 @@ /* - * Copyright (C) 2016+ AzerothCore , released under GNU GPL v2 license, you may redistribute it - * and/or modify it under version 2 of the License, or (at your option), any later version. + * Copyright (C) 2016+ AzerothCore , released under GNU AGPL v3 license, you may redistribute it + * and/or modify it under version 3 of the License, or (at your option), any later version. */ #ifndef _PLAYERBOT_SECURITYCHECKACTION_H diff --git a/src/strategy/actions/SeeSpellAction.cpp b/src/strategy/actions/SeeSpellAction.cpp index 0fd90bccb4..8b90adece0 100644 --- a/src/strategy/actions/SeeSpellAction.cpp +++ b/src/strategy/actions/SeeSpellAction.cpp @@ -1,6 +1,6 @@ /* - * Copyright (C) 2016+ AzerothCore , released under GNU GPL v2 license, you may redistribute it - * and/or modify it under version 2 of the License, or (at your option), any later version. + * Copyright (C) 2016+ AzerothCore , released under GNU AGPL v3 license, you may redistribute it + * and/or modify it under version 3 of the License, or (at your option), any later version. */ #include "SeeSpellAction.h" diff --git a/src/strategy/actions/SeeSpellAction.h b/src/strategy/actions/SeeSpellAction.h index 1d3178a565..91556d635a 100644 --- a/src/strategy/actions/SeeSpellAction.h +++ b/src/strategy/actions/SeeSpellAction.h @@ -1,6 +1,6 @@ /* - * Copyright (C) 2016+ AzerothCore , released under GNU GPL v2 license, you may redistribute it - * and/or modify it under version 2 of the License, or (at your option), any later version. + * Copyright (C) 2016+ AzerothCore , released under GNU AGPL v3 license, you may redistribute it + * and/or modify it under version 3 of the License, or (at your option), any later version. */ #ifndef _PLAYERBOT_SEESPELLACTION_H diff --git a/src/strategy/actions/SellAction.cpp b/src/strategy/actions/SellAction.cpp index 3f25748efa..8ff78f3af3 100644 --- a/src/strategy/actions/SellAction.cpp +++ b/src/strategy/actions/SellAction.cpp @@ -1,6 +1,6 @@ /* - * Copyright (C) 2016+ AzerothCore , released under GNU GPL v2 license, you may redistribute it - * and/or modify it under version 2 of the License, or (at your option), any later version. + * Copyright (C) 2016+ AzerothCore , released under GNU AGPL v3 license, you may redistribute it + * and/or modify it under version 3 of the License, or (at your option), any later version. */ #include "SellAction.h" diff --git a/src/strategy/actions/SellAction.h b/src/strategy/actions/SellAction.h index 0fc61ea9c5..7c985de9d4 100644 --- a/src/strategy/actions/SellAction.h +++ b/src/strategy/actions/SellAction.h @@ -1,6 +1,6 @@ /* - * Copyright (C) 2016+ AzerothCore , released under GNU GPL v2 license, you may redistribute it - * and/or modify it under version 2 of the License, or (at your option), any later version. + * Copyright (C) 2016+ AzerothCore , released under GNU AGPL v3 license, you may redistribute it + * and/or modify it under version 3 of the License, or (at your option), any later version. */ #ifndef _PLAYERBOT_SELLACTION_H diff --git a/src/strategy/actions/SendMailAction.cpp b/src/strategy/actions/SendMailAction.cpp index f28c0545a6..c6184c4b98 100644 --- a/src/strategy/actions/SendMailAction.cpp +++ b/src/strategy/actions/SendMailAction.cpp @@ -1,6 +1,6 @@ /* - * Copyright (C) 2016+ AzerothCore , released under GNU GPL v2 license, you may redistribute it - * and/or modify it under version 2 of the License, or (at your option), any later version. + * Copyright (C) 2016+ AzerothCore , released under GNU AGPL v3 license, you may redistribute it + * and/or modify it under version 3 of the License, or (at your option), any later version. */ #include "SendMailAction.h" diff --git a/src/strategy/actions/SendMailAction.h b/src/strategy/actions/SendMailAction.h index a016ad7186..06affa6bdb 100644 --- a/src/strategy/actions/SendMailAction.h +++ b/src/strategy/actions/SendMailAction.h @@ -1,6 +1,6 @@ /* - * Copyright (C) 2016+ AzerothCore , released under GNU GPL v2 license, you may redistribute it - * and/or modify it under version 2 of the License, or (at your option), any later version. + * Copyright (C) 2016+ AzerothCore , released under GNU AGPL v3 license, you may redistribute it + * and/or modify it under version 3 of the License, or (at your option), any later version. */ #ifndef _PLAYERBOT_SENDMAILACTION_H diff --git a/src/strategy/actions/SetCraftAction.cpp b/src/strategy/actions/SetCraftAction.cpp index d514c7f49f..f062ce5c23 100644 --- a/src/strategy/actions/SetCraftAction.cpp +++ b/src/strategy/actions/SetCraftAction.cpp @@ -1,6 +1,6 @@ /* - * Copyright (C) 2016+ AzerothCore , released under GNU GPL v2 license, you may redistribute it - * and/or modify it under version 2 of the License, or (at your option), any later version. + * Copyright (C) 2016+ AzerothCore , released under GNU AGPL v3 license, you may redistribute it + * and/or modify it under version 3 of the License, or (at your option), any later version. */ #include "SetCraftAction.h" diff --git a/src/strategy/actions/SetCraftAction.h b/src/strategy/actions/SetCraftAction.h index 8ec59131f0..d10507da98 100644 --- a/src/strategy/actions/SetCraftAction.h +++ b/src/strategy/actions/SetCraftAction.h @@ -1,6 +1,6 @@ /* - * Copyright (C) 2016+ AzerothCore , released under GNU GPL v2 license, you may redistribute it - * and/or modify it under version 2 of the License, or (at your option), any later version. + * Copyright (C) 2016+ AzerothCore , released under GNU AGPL v3 license, you may redistribute it + * and/or modify it under version 3 of the License, or (at your option), any later version. */ #ifndef _PLAYERBOT_SETCRAFTACTION_H diff --git a/src/strategy/actions/SetHomeAction.cpp b/src/strategy/actions/SetHomeAction.cpp index 0da185d464..36893f4a8c 100644 --- a/src/strategy/actions/SetHomeAction.cpp +++ b/src/strategy/actions/SetHomeAction.cpp @@ -1,6 +1,6 @@ /* - * Copyright (C) 2016+ AzerothCore , released under GNU GPL v2 license, you may redistribute it - * and/or modify it under version 2 of the License, or (at your option), any later version. + * Copyright (C) 2016+ AzerothCore , released under GNU AGPL v3 license, you may redistribute it + * and/or modify it under version 3 of the License, or (at your option), any later version. */ #include "SetHomeAction.h" diff --git a/src/strategy/actions/SetHomeAction.h b/src/strategy/actions/SetHomeAction.h index 1b9109bf88..ee499bf8a5 100644 --- a/src/strategy/actions/SetHomeAction.h +++ b/src/strategy/actions/SetHomeAction.h @@ -1,6 +1,6 @@ /* - * Copyright (C) 2016+ AzerothCore , released under GNU GPL v2 license, you may redistribute it - * and/or modify it under version 2 of the License, or (at your option), any later version. + * Copyright (C) 2016+ AzerothCore , released under GNU AGPL v3 license, you may redistribute it + * and/or modify it under version 3 of the License, or (at your option), any later version. */ #ifndef _PLAYERBOT_SETHOMEACTION_H diff --git a/src/strategy/actions/ShareQuestAction.cpp b/src/strategy/actions/ShareQuestAction.cpp index 77ff51b0d8..d4b470b4c1 100644 --- a/src/strategy/actions/ShareQuestAction.cpp +++ b/src/strategy/actions/ShareQuestAction.cpp @@ -1,6 +1,6 @@ /* - * Copyright (C) 2016+ AzerothCore , released under GNU GPL v2 license, you may redistribute it - * and/or modify it under version 2 of the License, or (at your option), any later version. + * Copyright (C) 2016+ AzerothCore , released under GNU AGPL v3 license, you may redistribute it + * and/or modify it under version 3 of the License, or (at your option), any later version. */ #include "ShareQuestAction.h" diff --git a/src/strategy/actions/ShareQuestAction.h b/src/strategy/actions/ShareQuestAction.h index efc8701099..033ed606b0 100644 --- a/src/strategy/actions/ShareQuestAction.h +++ b/src/strategy/actions/ShareQuestAction.h @@ -1,6 +1,6 @@ /* - * Copyright (C) 2016+ AzerothCore , released under GNU GPL v2 license, you may redistribute it - * and/or modify it under version 2 of the License, or (at your option), any later version. + * Copyright (C) 2016+ AzerothCore , released under GNU AGPL v3 license, you may redistribute it + * and/or modify it under version 3 of the License, or (at your option), any later version. */ #ifndef _PLAYERBOT_SHAREQUESTACTION_H diff --git a/src/strategy/actions/SkipSpellsListAction.cpp b/src/strategy/actions/SkipSpellsListAction.cpp index 2221731d87..ad7e86a5d1 100644 --- a/src/strategy/actions/SkipSpellsListAction.cpp +++ b/src/strategy/actions/SkipSpellsListAction.cpp @@ -1,6 +1,6 @@ /* - * Copyright (C) 2016+ AzerothCore , released under GNU GPL v2 license, you may redistribute it - * and/or modify it under version 2 of the License, or (at your option), any later version. + * Copyright (C) 2016+ AzerothCore , released under GNU AGPL v3 license, you may redistribute it + * and/or modify it under version 3 of the License, or (at your option), any later version. */ #include "SkipSpellsListAction.h" diff --git a/src/strategy/actions/SkipSpellsListAction.h b/src/strategy/actions/SkipSpellsListAction.h index 58f77ca6a3..578be9a9cb 100644 --- a/src/strategy/actions/SkipSpellsListAction.h +++ b/src/strategy/actions/SkipSpellsListAction.h @@ -1,6 +1,6 @@ /* - * Copyright (C) 2016+ AzerothCore , released under GNU GPL v2 license, you may redistribute it - * and/or modify it under version 2 of the License, or (at your option), any later version. + * Copyright (C) 2016+ AzerothCore , released under GNU AGPL v3 license, you may redistribute it + * and/or modify it under version 3 of the License, or (at your option), any later version. */ #ifndef _PLAYERBOT_SKIPSPELLSLISTACTION_H diff --git a/src/strategy/actions/StatsAction.cpp b/src/strategy/actions/StatsAction.cpp index 6d05a8df0e..f6872c8468 100644 --- a/src/strategy/actions/StatsAction.cpp +++ b/src/strategy/actions/StatsAction.cpp @@ -1,6 +1,6 @@ /* - * Copyright (C) 2016+ AzerothCore , released under GNU GPL v2 license, you may redistribute it - * and/or modify it under version 2 of the License, or (at your option), any later version. + * Copyright (C) 2016+ AzerothCore , released under GNU AGPL v3 license, you may redistribute it + * and/or modify it under version 3 of the License, or (at your option), any later version. */ #include "StatsAction.h" diff --git a/src/strategy/actions/StatsAction.h b/src/strategy/actions/StatsAction.h index 019eb4af79..0dbaf38b86 100644 --- a/src/strategy/actions/StatsAction.h +++ b/src/strategy/actions/StatsAction.h @@ -1,6 +1,6 @@ /* - * Copyright (C) 2016+ AzerothCore , released under GNU GPL v2 license, you may redistribute it - * and/or modify it under version 2 of the License, or (at your option), any later version. + * Copyright (C) 2016+ AzerothCore , released under GNU AGPL v3 license, you may redistribute it + * and/or modify it under version 3 of the License, or (at your option), any later version. */ #ifndef _PLAYERBOT_STATSACTION_H diff --git a/src/strategy/actions/StayActions.cpp b/src/strategy/actions/StayActions.cpp index cca32c1a56..525ff8d53e 100644 --- a/src/strategy/actions/StayActions.cpp +++ b/src/strategy/actions/StayActions.cpp @@ -1,6 +1,6 @@ /* - * Copyright (C) 2016+ AzerothCore , released under GNU GPL v2 license, you may redistribute it - * and/or modify it under version 2 of the License, or (at your option), any later version. + * Copyright (C) 2016+ AzerothCore , released under GNU AGPL v3 license, you may redistribute it + * and/or modify it under version 3 of the License, or (at your option), any later version. */ #include "StayActions.h" diff --git a/src/strategy/actions/StayActions.h b/src/strategy/actions/StayActions.h index 5dd9a8e44d..d050b9661a 100644 --- a/src/strategy/actions/StayActions.h +++ b/src/strategy/actions/StayActions.h @@ -1,6 +1,6 @@ /* - * Copyright (C) 2016+ AzerothCore , released under GNU GPL v2 license, you may redistribute it - * and/or modify it under version 2 of the License, or (at your option), any later version. + * Copyright (C) 2016+ AzerothCore , released under GNU AGPL v3 license, you may redistribute it + * and/or modify it under version 3 of the License, or (at your option), any later version. */ #ifndef _PLAYERBOT_STAYACTIONS_H diff --git a/src/strategy/actions/SuggestWhatToDoAction.cpp b/src/strategy/actions/SuggestWhatToDoAction.cpp index 3ecf6e419e..468b1f5077 100644 --- a/src/strategy/actions/SuggestWhatToDoAction.cpp +++ b/src/strategy/actions/SuggestWhatToDoAction.cpp @@ -1,6 +1,6 @@ /* - * Copyright (C) 2016+ AzerothCore , released under GNU GPL v2 license, you may redistribute it - * and/or modify it under version 2 of the License, or (at your option), any later version. + * Copyright (C) 2016+ AzerothCore , released under GNU AGPL v3 license, you may redistribute it + * and/or modify it under version 3 of the License, or (at your option), any later version. */ #include diff --git a/src/strategy/actions/SuggestWhatToDoAction.h b/src/strategy/actions/SuggestWhatToDoAction.h index 5db9947deb..238ce7e896 100644 --- a/src/strategy/actions/SuggestWhatToDoAction.h +++ b/src/strategy/actions/SuggestWhatToDoAction.h @@ -1,6 +1,6 @@ /* - * Copyright (C) 2016+ AzerothCore , released under GNU GPL v2 license, you may redistribute it - * and/or modify it under version 2 of the License, or (at your option), any later version. + * Copyright (C) 2016+ AzerothCore , released under GNU AGPL v3 license, you may redistribute it + * and/or modify it under version 3 of the License, or (at your option), any later version. */ #ifndef _PLAYERBOT_SUGGESTWHATTODOACTION_H diff --git a/src/strategy/actions/TalkToQuestGiverAction.cpp b/src/strategy/actions/TalkToQuestGiverAction.cpp index 4b8bb13738..ad87a550d0 100644 --- a/src/strategy/actions/TalkToQuestGiverAction.cpp +++ b/src/strategy/actions/TalkToQuestGiverAction.cpp @@ -1,6 +1,6 @@ /* - * Copyright (C) 2016+ AzerothCore , released under GNU GPL v2 license, you may redistribute it - * and/or modify it under version 2 of the License, or (at your option), any later version. + * Copyright (C) 2016+ AzerothCore , released under GNU AGPL v3 license, you may redistribute it + * and/or modify it under version 3 of the License, or (at your option), any later version. */ #include "TalkToQuestGiverAction.h" diff --git a/src/strategy/actions/TalkToQuestGiverAction.h b/src/strategy/actions/TalkToQuestGiverAction.h index df12f4343e..edde3272b6 100644 --- a/src/strategy/actions/TalkToQuestGiverAction.h +++ b/src/strategy/actions/TalkToQuestGiverAction.h @@ -1,6 +1,6 @@ /* - * Copyright (C) 2016+ AzerothCore , released under GNU GPL v2 license, you may redistribute it - * and/or modify it under version 2 of the License, or (at your option), any later version. + * Copyright (C) 2016+ AzerothCore , released under GNU AGPL v3 license, you may redistribute it + * and/or modify it under version 3 of the License, or (at your option), any later version. */ #ifndef _PLAYERBOT_TALKTOQUESTGIVERACTION_H diff --git a/src/strategy/actions/TameAction.cpp b/src/strategy/actions/TameAction.cpp index 8446c24cd7..b414b47806 100644 --- a/src/strategy/actions/TameAction.cpp +++ b/src/strategy/actions/TameAction.cpp @@ -1,6 +1,6 @@ /* - * Copyright (C) 2016+ AzerothCore , released under GNU GPL v2 license, you may redistribute it - * and/or modify it under version 2 of the License, or (at your option), any later version. + * Copyright (C) 2016+ AzerothCore , released under GNU AGPL v3 license, you may redistribute it + * and/or modify it under version 3 of the License, or (at your option), any later version. */ #include "TameAction.h" diff --git a/src/strategy/actions/TameAction.h b/src/strategy/actions/TameAction.h index 018ba5a023..234eaec2ab 100644 --- a/src/strategy/actions/TameAction.h +++ b/src/strategy/actions/TameAction.h @@ -1,6 +1,6 @@ /* - * Copyright (C) 2016+ AzerothCore , released under GNU GPL v2 license, you may redistribute it - * and/or modify it under version 2 of the License, or (at your option), any later version. + * Copyright (C) 2016+ AzerothCore , released under GNU AGPL v3 license, you may redistribute it + * and/or modify it under version 3 of the License, or (at your option), any later version. */ #ifndef _PLAYERBOT_TAMEACTION_H diff --git a/src/strategy/actions/TaxiAction.cpp b/src/strategy/actions/TaxiAction.cpp index 91a42c4b7e..1f9e89cc18 100644 --- a/src/strategy/actions/TaxiAction.cpp +++ b/src/strategy/actions/TaxiAction.cpp @@ -1,6 +1,6 @@ /* - * Copyright (C) 2016+ AzerothCore , released under GNU GPL v2 license, you may redistribute it - * and/or modify it under version 2 of the License, or (at your option), any later version. + * Copyright (C) 2016+ AzerothCore , released under GNU AGPL v3 license, you may redistribute it + * and/or modify it under version 3 of the License, or (at your option), any later version. */ #include "TaxiAction.h" diff --git a/src/strategy/actions/TaxiAction.h b/src/strategy/actions/TaxiAction.h index fd8f6b7a43..97cbda6f55 100644 --- a/src/strategy/actions/TaxiAction.h +++ b/src/strategy/actions/TaxiAction.h @@ -1,6 +1,6 @@ /* - * Copyright (C) 2016+ AzerothCore , released under GNU GPL v2 license, you may redistribute it - * and/or modify it under version 2 of the License, or (at your option), any later version. + * Copyright (C) 2016+ AzerothCore , released under GNU AGPL v3 license, you may redistribute it + * and/or modify it under version 3 of the License, or (at your option), any later version. */ #ifndef _PLAYERBOT_TAXIACTION_H diff --git a/src/strategy/actions/TeleportAction.cpp b/src/strategy/actions/TeleportAction.cpp index 68afeb7809..65aa24e09f 100644 --- a/src/strategy/actions/TeleportAction.cpp +++ b/src/strategy/actions/TeleportAction.cpp @@ -1,6 +1,6 @@ /* - * Copyright (C) 2016+ AzerothCore , released under GNU GPL v2 license, you may redistribute it - * and/or modify it under version 2 of the License, or (at your option), any later version. + * Copyright (C) 2016+ AzerothCore , released under GNU AGPL v3 license, you may redistribute it + * and/or modify it under version 3 of the License, or (at your option), any later version. */ #include "TeleportAction.h" diff --git a/src/strategy/actions/TeleportAction.h b/src/strategy/actions/TeleportAction.h index f5ea2d081e..46e316f8e6 100644 --- a/src/strategy/actions/TeleportAction.h +++ b/src/strategy/actions/TeleportAction.h @@ -1,6 +1,6 @@ /* - * Copyright (C) 2016+ AzerothCore , released under GNU GPL v2 license, you may redistribute it - * and/or modify it under version 2 of the License, or (at your option), any later version. + * Copyright (C) 2016+ AzerothCore , released under GNU AGPL v3 license, you may redistribute it + * and/or modify it under version 3 of the License, or (at your option), any later version. */ #ifndef _PLAYERBOT_TELEPORTACTION_H diff --git a/src/strategy/actions/TellCastFailedAction.cpp b/src/strategy/actions/TellCastFailedAction.cpp index ec33aa509d..792a324459 100644 --- a/src/strategy/actions/TellCastFailedAction.cpp +++ b/src/strategy/actions/TellCastFailedAction.cpp @@ -1,6 +1,6 @@ /* - * Copyright (C) 2016+ AzerothCore , released under GNU GPL v2 license, you may redistribute it - * and/or modify it under version 2 of the License, or (at your option), any later version. + * Copyright (C) 2016+ AzerothCore , released under GNU AGPL v3 license, you may redistribute it + * and/or modify it under version 3 of the License, or (at your option), any later version. */ #include "TellCastFailedAction.h" diff --git a/src/strategy/actions/TellCastFailedAction.h b/src/strategy/actions/TellCastFailedAction.h index d522808084..5eec7a43a1 100644 --- a/src/strategy/actions/TellCastFailedAction.h +++ b/src/strategy/actions/TellCastFailedAction.h @@ -1,6 +1,6 @@ /* - * Copyright (C) 2016+ AzerothCore , released under GNU GPL v2 license, you may redistribute it - * and/or modify it under version 2 of the License, or (at your option), any later version. + * Copyright (C) 2016+ AzerothCore , released under GNU AGPL v3 license, you may redistribute it + * and/or modify it under version 3 of the License, or (at your option), any later version. */ #ifndef _PLAYERBOT_TELLCASTFAILEDACTION_H diff --git a/src/strategy/actions/TellGlyphsAction.cpp b/src/strategy/actions/TellGlyphsAction.cpp index 3f48dbd873..3eac104731 100644 --- a/src/strategy/actions/TellGlyphsAction.cpp +++ b/src/strategy/actions/TellGlyphsAction.cpp @@ -1,6 +1,6 @@ /* - * Copyright (C) 2016+ AzerothCore , released under GNU GPL v2 license, you may redistribute it - * and/or modify it under version 2 of the License, or (at your option), any later version. + * Copyright (C) 2016+ AzerothCore , released under GNU AGPL v3 license, you may redistribute it + * and/or modify it under version 3 of the License, or (at your option), any later version. */ #include "TellGlyphsAction.h" diff --git a/src/strategy/actions/TellGlyphsAction.h b/src/strategy/actions/TellGlyphsAction.h index b68e9fefee..6f3e0dace3 100644 --- a/src/strategy/actions/TellGlyphsAction.h +++ b/src/strategy/actions/TellGlyphsAction.h @@ -1,6 +1,6 @@ /* - * Copyright (C) 2016+ AzerothCore , released under GNU GPL v2 license, you may redistribute it - * and/or modify it under version 2 of the License, or (at your option), any later version. + * Copyright (C) 2016+ AzerothCore , released under GNU AGPL v3 license, you may redistribute it + * and/or modify it under version 3 of the License, or (at your option), any later version. */ #ifndef _PLAYERBOT_TELLGLYPHSACTION_H diff --git a/src/strategy/actions/TellItemCountAction.cpp b/src/strategy/actions/TellItemCountAction.cpp index cf55da1de1..ade7571f30 100644 --- a/src/strategy/actions/TellItemCountAction.cpp +++ b/src/strategy/actions/TellItemCountAction.cpp @@ -1,6 +1,6 @@ /* - * Copyright (C) 2016+ AzerothCore , released under GNU GPL v2 license, you may redistribute it - * and/or modify it under version 2 of the License, or (at your option), any later version. + * Copyright (C) 2016+ AzerothCore , released under GNU AGPL v3 license, you may redistribute it + * and/or modify it under version 3 of the License, or (at your option), any later version. */ #include "TellItemCountAction.h" diff --git a/src/strategy/actions/TellItemCountAction.h b/src/strategy/actions/TellItemCountAction.h index 43da9b070c..3bc4cf79d7 100644 --- a/src/strategy/actions/TellItemCountAction.h +++ b/src/strategy/actions/TellItemCountAction.h @@ -1,6 +1,6 @@ /* - * Copyright (C) 2016+ AzerothCore , released under GNU GPL v2 license, you may redistribute it - * and/or modify it under version 2 of the License, or (at your option), any later version. + * Copyright (C) 2016+ AzerothCore , released under GNU AGPL v3 license, you may redistribute it + * and/or modify it under version 3 of the License, or (at your option), any later version. */ #ifndef _PLAYERBOT_TELLITEMCOUNTACTION_H diff --git a/src/strategy/actions/TellLosAction.cpp b/src/strategy/actions/TellLosAction.cpp index 125b7df44e..9cd12b02e3 100644 --- a/src/strategy/actions/TellLosAction.cpp +++ b/src/strategy/actions/TellLosAction.cpp @@ -1,6 +1,6 @@ /* - * Copyright (C) 2016+ AzerothCore , released under GNU GPL v2 license, you may redistribute it - * and/or modify it under version 2 of the License, or (at your option), any later version. + * Copyright (C) 2016+ AzerothCore , released under GNU AGPL v3 license, you may redistribute it + * and/or modify it under version 3 of the License, or (at your option), any later version. */ #include "TellLosAction.h" diff --git a/src/strategy/actions/TellLosAction.h b/src/strategy/actions/TellLosAction.h index 988564cf00..d4ae928e66 100644 --- a/src/strategy/actions/TellLosAction.h +++ b/src/strategy/actions/TellLosAction.h @@ -1,6 +1,6 @@ /* - * Copyright (C) 2016+ AzerothCore , released under GNU GPL v2 license, you may redistribute it - * and/or modify it under version 2 of the License, or (at your option), any later version. + * Copyright (C) 2016+ AzerothCore , released under GNU AGPL v3 license, you may redistribute it + * and/or modify it under version 3 of the License, or (at your option), any later version. */ #ifndef _PLAYERBOT_TELLLOSACTION_H diff --git a/src/strategy/actions/TellMasterAction.cpp b/src/strategy/actions/TellMasterAction.cpp index 10c01c0c20..701f93d773 100644 --- a/src/strategy/actions/TellMasterAction.cpp +++ b/src/strategy/actions/TellMasterAction.cpp @@ -1,6 +1,6 @@ /* - * Copyright (C) 2016+ AzerothCore , released under GNU GPL v2 license, you may redistribute it - * and/or modify it under version 2 of the License, or (at your option), any later version. + * Copyright (C) 2016+ AzerothCore , released under GNU AGPL v3 license, you may redistribute it + * and/or modify it under version 3 of the License, or (at your option), any later version. */ #include "TellMasterAction.h" diff --git a/src/strategy/actions/TellMasterAction.h b/src/strategy/actions/TellMasterAction.h index f1f6dba9e4..5a8821206a 100644 --- a/src/strategy/actions/TellMasterAction.h +++ b/src/strategy/actions/TellMasterAction.h @@ -1,6 +1,6 @@ /* - * Copyright (C) 2016+ AzerothCore , released under GNU GPL v2 license, you may redistribute it - * and/or modify it under version 2 of the License, or (at your option), any later version. + * Copyright (C) 2016+ AzerothCore , released under GNU AGPL v3 license, you may redistribute it + * and/or modify it under version 3 of the License, or (at your option), any later version. */ #ifndef _PLAYERBOT_TELLMASTERACTION_H diff --git a/src/strategy/actions/TellReputationAction.cpp b/src/strategy/actions/TellReputationAction.cpp index 686f8a201e..e08a38d840 100644 --- a/src/strategy/actions/TellReputationAction.cpp +++ b/src/strategy/actions/TellReputationAction.cpp @@ -1,6 +1,6 @@ /* - * Copyright (C) 2016+ AzerothCore , released under GNU GPL v2 license, you may redistribute it - * and/or modify it under version 2 of the License, or (at your option), any later version. + * Copyright (C) 2016+ AzerothCore , released under GNU AGPL v3 license, you may redistribute it + * and/or modify it under version 3 of the License, or (at your option), any later version. */ #include "TellReputationAction.h" diff --git a/src/strategy/actions/TellReputationAction.h b/src/strategy/actions/TellReputationAction.h index c9f74ef962..3adaa66d56 100644 --- a/src/strategy/actions/TellReputationAction.h +++ b/src/strategy/actions/TellReputationAction.h @@ -1,6 +1,6 @@ /* - * Copyright (C) 2016+ AzerothCore , released under GNU GPL v2 license, you may redistribute it - * and/or modify it under version 2 of the License, or (at your option), any later version. + * Copyright (C) 2016+ AzerothCore , released under GNU AGPL v3 license, you may redistribute it + * and/or modify it under version 3 of the License, or (at your option), any later version. */ #ifndef _PLAYERBOT_TELLREPUTATIONACTION_H diff --git a/src/strategy/actions/TellTargetAction.cpp b/src/strategy/actions/TellTargetAction.cpp index f6f0563961..7ecd8efb5a 100644 --- a/src/strategy/actions/TellTargetAction.cpp +++ b/src/strategy/actions/TellTargetAction.cpp @@ -1,6 +1,6 @@ /* - * Copyright (C) 2016+ AzerothCore , released under GNU GPL v2 license, you may redistribute it - * and/or modify it under version 2 of the License, or (at your option), any later version. + * Copyright (C) 2016+ AzerothCore , released under GNU AGPL v3 license, you may redistribute it + * and/or modify it under version 3 of the License, or (at your option), any later version. */ #include "TellTargetAction.h" diff --git a/src/strategy/actions/TellTargetAction.h b/src/strategy/actions/TellTargetAction.h index 608c496422..440e42f215 100644 --- a/src/strategy/actions/TellTargetAction.h +++ b/src/strategy/actions/TellTargetAction.h @@ -1,6 +1,6 @@ /* - * Copyright (C) 2016+ AzerothCore , released under GNU GPL v2 license, you may redistribute it - * and/or modify it under version 2 of the License, or (at your option), any later version. + * Copyright (C) 2016+ AzerothCore , released under GNU AGPL v3 license, you may redistribute it + * and/or modify it under version 3 of the License, or (at your option), any later version. */ #ifndef _PLAYERBOT_TELLTARGETACTION_H diff --git a/src/strategy/actions/TradeAction.cpp b/src/strategy/actions/TradeAction.cpp index 62f8b513a4..9ac7aca2be 100644 --- a/src/strategy/actions/TradeAction.cpp +++ b/src/strategy/actions/TradeAction.cpp @@ -1,6 +1,6 @@ /* - * Copyright (C) 2016+ AzerothCore , released under GNU GPL v2 license, you may redistribute it - * and/or modify it under version 2 of the License, or (at your option), any later version. + * Copyright (C) 2016+ AzerothCore , released under GNU AGPL v3 license, you may redistribute it + * and/or modify it under version 3 of the License, or (at your option), any later version. */ #include "TradeAction.h" diff --git a/src/strategy/actions/TradeAction.h b/src/strategy/actions/TradeAction.h index f9af19f3f7..4b81d24dd8 100644 --- a/src/strategy/actions/TradeAction.h +++ b/src/strategy/actions/TradeAction.h @@ -1,6 +1,6 @@ /* - * Copyright (C) 2016+ AzerothCore , released under GNU GPL v2 license, you may redistribute it - * and/or modify it under version 2 of the License, or (at your option), any later version. + * Copyright (C) 2016+ AzerothCore , released under GNU AGPL v3 license, you may redistribute it + * and/or modify it under version 3 of the License, or (at your option), any later version. */ #ifndef _PLAYERBOT_TRADEACTION_H diff --git a/src/strategy/actions/TradeStatusAction.cpp b/src/strategy/actions/TradeStatusAction.cpp index f24e997c46..16ad2ca79d 100644 --- a/src/strategy/actions/TradeStatusAction.cpp +++ b/src/strategy/actions/TradeStatusAction.cpp @@ -1,6 +1,6 @@ /* - * Copyright (C) 2016+ AzerothCore , released under GNU GPL v2 license, you may redistribute it - * and/or modify it under version 2 of the License, or (at your option), any later version. + * Copyright (C) 2016+ AzerothCore , released under GNU AGPL v3 license, you may redistribute it + * and/or modify it under version 3 of the License, or (at your option), any later version. */ #include "TradeStatusAction.h" diff --git a/src/strategy/actions/TradeStatusAction.h b/src/strategy/actions/TradeStatusAction.h index ab6556f592..4313b18d0b 100644 --- a/src/strategy/actions/TradeStatusAction.h +++ b/src/strategy/actions/TradeStatusAction.h @@ -1,6 +1,6 @@ /* - * Copyright (C) 2016+ AzerothCore , released under GNU GPL v2 license, you may redistribute it - * and/or modify it under version 2 of the License, or (at your option), any later version. + * Copyright (C) 2016+ AzerothCore , released under GNU AGPL v3 license, you may redistribute it + * and/or modify it under version 3 of the License, or (at your option), any later version. */ #ifndef _PLAYERBOT_TRADESTATUSACTION_H diff --git a/src/strategy/actions/TradeValues.cpp b/src/strategy/actions/TradeValues.cpp index 304103d027..47a86e10d1 100644 --- a/src/strategy/actions/TradeValues.cpp +++ b/src/strategy/actions/TradeValues.cpp @@ -1,6 +1,6 @@ /* - * Copyright (C) 2016+ AzerothCore , released under GNU GPL v2 license, you may redistribute it - * and/or modify it under version 2 of the License, or (at your option), any later version. + * Copyright (C) 2016+ AzerothCore , released under GNU AGPL v3 license, you may redistribute it + * and/or modify it under version 3 of the License, or (at your option), any later version. */ #include "TradeValues.h" diff --git a/src/strategy/actions/TradeValues.h b/src/strategy/actions/TradeValues.h index d230cf0b73..3f7d3e5302 100644 --- a/src/strategy/actions/TradeValues.h +++ b/src/strategy/actions/TradeValues.h @@ -1,6 +1,6 @@ /* - * Copyright (C) 2016+ AzerothCore , released under GNU GPL v2 license, you may redistribute it - * and/or modify it under version 2 of the License, or (at your option), any later version. + * Copyright (C) 2016+ AzerothCore , released under GNU AGPL v3 license, you may redistribute it + * and/or modify it under version 3 of the License, or (at your option), any later version. */ #ifndef _PLAYERBOT_TRADEVALUES_H diff --git a/src/strategy/actions/TrainerAction.cpp b/src/strategy/actions/TrainerAction.cpp index 655208bf65..2de9d2830e 100644 --- a/src/strategy/actions/TrainerAction.cpp +++ b/src/strategy/actions/TrainerAction.cpp @@ -1,6 +1,6 @@ /* - * Copyright (C) 2016+ AzerothCore , released under GNU GPL v2 license, you may redistribute it - * and/or modify it under version 2 of the License, or (at your option), any later version. + * Copyright (C) 2016+ AzerothCore , released under GNU AGPL v3 license, you may redistribute it + * and/or modify it under version 3 of the License, or (at your option), any later version. */ #include "TrainerAction.h" diff --git a/src/strategy/actions/TrainerAction.h b/src/strategy/actions/TrainerAction.h index b9f4cd3464..10f8a11920 100644 --- a/src/strategy/actions/TrainerAction.h +++ b/src/strategy/actions/TrainerAction.h @@ -1,6 +1,6 @@ /* - * Copyright (C) 2016+ AzerothCore , released under GNU GPL v2 license, you may redistribute it - * and/or modify it under version 2 of the License, or (at your option), any later version. + * Copyright (C) 2016+ AzerothCore , released under GNU AGPL v3 license, you may redistribute it + * and/or modify it under version 3 of the License, or (at your option), any later version. */ #ifndef _PLAYERBOT_TRAINERACTION_H diff --git a/src/strategy/actions/TravelAction.cpp b/src/strategy/actions/TravelAction.cpp index 4d7ce96ee0..5804fd7d24 100644 --- a/src/strategy/actions/TravelAction.cpp +++ b/src/strategy/actions/TravelAction.cpp @@ -1,6 +1,6 @@ /* - * Copyright (C) 2016+ AzerothCore , released under GNU GPL v2 license, you may redistribute it - * and/or modify it under version 2 of the License, or (at your option), any later version. + * Copyright (C) 2016+ AzerothCore , released under GNU AGPL v3 license, you may redistribute it + * and/or modify it under version 3 of the License, or (at your option), any later version. */ #include "TravelAction.h" diff --git a/src/strategy/actions/TravelAction.h b/src/strategy/actions/TravelAction.h index 94de22bfd5..d84b0c243e 100644 --- a/src/strategy/actions/TravelAction.h +++ b/src/strategy/actions/TravelAction.h @@ -1,6 +1,6 @@ /* - * Copyright (C) 2016+ AzerothCore , released under GNU GPL v2 license, you may redistribute it - * and/or modify it under version 2 of the License, or (at your option), any later version. + * Copyright (C) 2016+ AzerothCore , released under GNU AGPL v3 license, you may redistribute it + * and/or modify it under version 3 of the License, or (at your option), any later version. */ #ifndef _PLAYERBOT_TRAVELACTION_H diff --git a/src/strategy/actions/UnequipAction.cpp b/src/strategy/actions/UnequipAction.cpp index 9a32f5cca2..f5b5f62856 100644 --- a/src/strategy/actions/UnequipAction.cpp +++ b/src/strategy/actions/UnequipAction.cpp @@ -1,6 +1,6 @@ /* - * Copyright (C) 2016+ AzerothCore , released under GNU GPL v2 license, you may redistribute it - * and/or modify it under version 2 of the License, or (at your option), any later version. + * Copyright (C) 2016+ AzerothCore , released under GNU AGPL v3 license, you may redistribute it + * and/or modify it under version 3 of the License, or (at your option), any later version. */ #include "UnequipAction.h" diff --git a/src/strategy/actions/UnequipAction.h b/src/strategy/actions/UnequipAction.h index d855f53959..56004bebe0 100644 --- a/src/strategy/actions/UnequipAction.h +++ b/src/strategy/actions/UnequipAction.h @@ -1,6 +1,6 @@ /* - * Copyright (C) 2016+ AzerothCore , released under GNU GPL v2 license, you may redistribute it - * and/or modify it under version 2 of the License, or (at your option), any later version. + * Copyright (C) 2016+ AzerothCore , released under GNU AGPL v3 license, you may redistribute it + * and/or modify it under version 3 of the License, or (at your option), any later version. */ #ifndef _PLAYERBOT_UNEQUIPACTION_H diff --git a/src/strategy/actions/UseItemAction.cpp b/src/strategy/actions/UseItemAction.cpp index 85c56c6311..690d2d4b77 100644 --- a/src/strategy/actions/UseItemAction.cpp +++ b/src/strategy/actions/UseItemAction.cpp @@ -1,6 +1,6 @@ /* - * Copyright (C) 2016+ AzerothCore , released under GNU GPL v2 license, you may redistribute it - * and/or modify it under version 2 of the License, or (at your option), any later version. + * Copyright (C) 2016+ AzerothCore , released under GNU AGPL v3 license, you may redistribute it + * and/or modify it under version 3 of the License, or (at your option), any later version. */ #include "UseItemAction.h" diff --git a/src/strategy/actions/UseItemAction.h b/src/strategy/actions/UseItemAction.h index bfbf67d3a1..2b0c7e1911 100644 --- a/src/strategy/actions/UseItemAction.h +++ b/src/strategy/actions/UseItemAction.h @@ -1,6 +1,6 @@ /* - * Copyright (C) 2016+ AzerothCore , released under GNU GPL v2 license, you may redistribute it - * and/or modify it under version 2 of the License, or (at your option), any later version. + * Copyright (C) 2016+ AzerothCore , released under GNU AGPL v3 license, you may redistribute it + * and/or modify it under version 3 of the License, or (at your option), any later version. */ #ifndef _PLAYERBOT_USEITEMACTION_H diff --git a/src/strategy/actions/UseMeetingStoneAction.cpp b/src/strategy/actions/UseMeetingStoneAction.cpp index dfebc8590b..68eecce69a 100644 --- a/src/strategy/actions/UseMeetingStoneAction.cpp +++ b/src/strategy/actions/UseMeetingStoneAction.cpp @@ -1,6 +1,6 @@ /* - * Copyright (C) 2016+ AzerothCore , released under GNU GPL v2 license, you may redistribute it - * and/or modify it under version 2 of the License, or (at your option), any later version. + * Copyright (C) 2016+ AzerothCore , released under GNU AGPL v3 license, you may redistribute it + * and/or modify it under version 3 of the License, or (at your option), any later version. */ #include "UseMeetingStoneAction.h" diff --git a/src/strategy/actions/UseMeetingStoneAction.h b/src/strategy/actions/UseMeetingStoneAction.h index 1799503d8d..f3b59549e8 100644 --- a/src/strategy/actions/UseMeetingStoneAction.h +++ b/src/strategy/actions/UseMeetingStoneAction.h @@ -1,6 +1,6 @@ /* - * Copyright (C) 2016+ AzerothCore , released under GNU GPL v2 license, you may redistribute it - * and/or modify it under version 2 of the License, or (at your option), any later version. + * Copyright (C) 2016+ AzerothCore , released under GNU AGPL v3 license, you may redistribute it + * and/or modify it under version 3 of the License, or (at your option), any later version. */ #ifndef _PLAYERBOT_USEMEETINGSTONEACTION_H diff --git a/src/strategy/actions/VehicleActions.cpp b/src/strategy/actions/VehicleActions.cpp index ac33eeadaf..ee1c6e2dd8 100644 --- a/src/strategy/actions/VehicleActions.cpp +++ b/src/strategy/actions/VehicleActions.cpp @@ -1,6 +1,6 @@ /* - * Copyright (C) 2016+ AzerothCore , released under GNU GPL v2 license, you may redistribute it - * and/or modify it under version 2 of the License, or (at your option), any later version. + * Copyright (C) 2016+ AzerothCore , released under GNU AGPL v3 license, you may redistribute it + * and/or modify it under version 3 of the License, or (at your option), any later version. */ #include "VehicleActions.h" diff --git a/src/strategy/actions/VehicleActions.h b/src/strategy/actions/VehicleActions.h index fbda01b876..1a0e0a3000 100644 --- a/src/strategy/actions/VehicleActions.h +++ b/src/strategy/actions/VehicleActions.h @@ -1,6 +1,6 @@ /* - * Copyright (C) 2016+ AzerothCore , released under GNU GPL v2 license, you may redistribute it - * and/or modify it under version 2 of the License, or (at your option), any later version. + * Copyright (C) 2016+ AzerothCore , released under GNU AGPL v3 license, you may redistribute it + * and/or modify it under version 3 of the License, or (at your option), any later version. */ #ifndef _PLAYERBOT_VEHICLEACTIONS_H diff --git a/src/strategy/actions/WhoAction.cpp b/src/strategy/actions/WhoAction.cpp index 785356009c..edafdfcb27 100644 --- a/src/strategy/actions/WhoAction.cpp +++ b/src/strategy/actions/WhoAction.cpp @@ -1,6 +1,6 @@ /* - * Copyright (C) 2016+ AzerothCore , released under GNU GPL v2 license, you may redistribute it - * and/or modify it under version 2 of the License, or (at your option), any later version. + * Copyright (C) 2016+ AzerothCore , released under GNU AGPL v3 license, you may redistribute it + * and/or modify it under version 3 of the License, or (at your option), any later version. */ #include "WhoAction.h" diff --git a/src/strategy/actions/WhoAction.h b/src/strategy/actions/WhoAction.h index c222fe8fda..d3ba1756d6 100644 --- a/src/strategy/actions/WhoAction.h +++ b/src/strategy/actions/WhoAction.h @@ -1,6 +1,6 @@ /* - * Copyright (C) 2016+ AzerothCore , released under GNU GPL v2 license, you may redistribute it - * and/or modify it under version 2 of the License, or (at your option), any later version. + * Copyright (C) 2016+ AzerothCore , released under GNU AGPL v3 license, you may redistribute it + * and/or modify it under version 3 of the License, or (at your option), any later version. */ #ifndef _PLAYERBOT_WHOACTION_H diff --git a/src/strategy/actions/WipeAction.cpp b/src/strategy/actions/WipeAction.cpp index d00fdde0b5..bbd1997d6c 100644 --- a/src/strategy/actions/WipeAction.cpp +++ b/src/strategy/actions/WipeAction.cpp @@ -1,6 +1,6 @@ /* - * Copyright (C) 2016+ AzerothCore , released under GNU GPL v2 license, you may redistribute it - * and/or modify it under version 2 of the License, or (at your option), any later version. + * Copyright (C) 2016+ AzerothCore , released under GNU AGPL v3 license, you may redistribute it + * and/or modify it under version 3 of the License, or (at your option), any later version. */ #include "PlayerbotAI.h" diff --git a/src/strategy/actions/WipeAction.h b/src/strategy/actions/WipeAction.h index e26770d47a..8681190874 100644 --- a/src/strategy/actions/WipeAction.h +++ b/src/strategy/actions/WipeAction.h @@ -1,6 +1,6 @@ /* - * Copyright (C) 2016+ AzerothCore , released under GNU GPL v2 license, you may redistribute it - * and/or modify it under version 2 of the License, or (at your option), any later version. + * Copyright (C) 2016+ AzerothCore , released under GNU AGPL v3 license, you may redistribute it + * and/or modify it under version 3 of the License, or (at your option), any later version. */ #ifndef _PLAYERBOT_WIPEACTION_H diff --git a/src/strategy/actions/WorldBuffAction.cpp b/src/strategy/actions/WorldBuffAction.cpp index 0659ee0cf5..b47083850a 100644 --- a/src/strategy/actions/WorldBuffAction.cpp +++ b/src/strategy/actions/WorldBuffAction.cpp @@ -1,6 +1,6 @@ /* - * Copyright (C) 2016+ AzerothCore , released under GNU GPL v2 license, you may redistribute it - * and/or modify it under version 2 of the License, or (at your option), any later version. + * Copyright (C) 2016+ AzerothCore , released under GNU AGPL v3 license, you may redistribute it + * and/or modify it under version 3 of the License, or (at your option), any later version. */ #include "WorldBuffAction.h" diff --git a/src/strategy/actions/WorldBuffAction.h b/src/strategy/actions/WorldBuffAction.h index 49bba39023..e1330e9492 100644 --- a/src/strategy/actions/WorldBuffAction.h +++ b/src/strategy/actions/WorldBuffAction.h @@ -1,6 +1,6 @@ /* - * Copyright (C) 2016+ AzerothCore , released under GNU GPL v2 license, you may redistribute it - * and/or modify it under version 2 of the License, or (at your option), any later version. + * Copyright (C) 2016+ AzerothCore , released under GNU AGPL v3 license, you may redistribute it + * and/or modify it under version 3 of the License, or (at your option), any later version. */ #ifndef _PLAYERBOT_WORLDBUFFACTION_H diff --git a/src/strategy/actions/WorldPacketActionContext.h b/src/strategy/actions/WorldPacketActionContext.h index 1638d596cb..bada772c47 100644 --- a/src/strategy/actions/WorldPacketActionContext.h +++ b/src/strategy/actions/WorldPacketActionContext.h @@ -1,6 +1,6 @@ /* - * Copyright (C) 2016+ AzerothCore , released under GNU GPL v2 license, you may redistribute it - * and/or modify it under version 2 of the License, or (at your option), any later version. + * Copyright (C) 2016+ AzerothCore , released under GNU AGPL v3 license, you may redistribute it + * and/or modify it under version 3 of the License, or (at your option), any later version. */ #ifndef _PLAYERBOT_WORLDPACKETACTIONCONTEXT_H diff --git a/src/strategy/actions/WtsAction.cpp b/src/strategy/actions/WtsAction.cpp index f4adfa7a29..a3c77c27f9 100644 --- a/src/strategy/actions/WtsAction.cpp +++ b/src/strategy/actions/WtsAction.cpp @@ -1,6 +1,6 @@ /* - * Copyright (C) 2016+ AzerothCore , released under GNU GPL v2 license, you may redistribute it - * and/or modify it under version 2 of the License, or (at your option), any later version. + * Copyright (C) 2016+ AzerothCore , released under GNU AGPL v3 license, you may redistribute it + * and/or modify it under version 3 of the License, or (at your option), any later version. */ #include "WtsAction.h" diff --git a/src/strategy/actions/WtsAction.h b/src/strategy/actions/WtsAction.h index 7fefb11e57..22da503f8b 100644 --- a/src/strategy/actions/WtsAction.h +++ b/src/strategy/actions/WtsAction.h @@ -1,6 +1,6 @@ /* - * Copyright (C) 2016+ AzerothCore , released under GNU GPL v2 license, you may redistribute it - * and/or modify it under version 2 of the License, or (at your option), any later version. + * Copyright (C) 2016+ AzerothCore , released under GNU AGPL v3 license, you may redistribute it + * and/or modify it under version 3 of the License, or (at your option), any later version. */ #ifndef _PLAYERBOT_WTSACTION_H diff --git a/src/strategy/actions/XpGainAction.cpp b/src/strategy/actions/XpGainAction.cpp index 43afff1d11..446be3bb6d 100644 --- a/src/strategy/actions/XpGainAction.cpp +++ b/src/strategy/actions/XpGainAction.cpp @@ -1,6 +1,6 @@ /* - * Copyright (C) 2016+ AzerothCore , released under GNU GPL v2 license, you may redistribute it - * and/or modify it under version 2 of the License, or (at your option), any later version. + * Copyright (C) 2016+ AzerothCore , released under GNU AGPL v3 license, you may redistribute it + * and/or modify it under version 3 of the License, or (at your option), any later version. */ #include "XpGainAction.h" diff --git a/src/strategy/actions/XpGainAction.h b/src/strategy/actions/XpGainAction.h index da5926e037..d5935a9fd4 100644 --- a/src/strategy/actions/XpGainAction.h +++ b/src/strategy/actions/XpGainAction.h @@ -1,6 +1,6 @@ /* - * Copyright (C) 2016+ AzerothCore , released under GNU GPL v2 license, you may redistribute it - * and/or modify it under version 2 of the License, or (at your option), any later version. + * Copyright (C) 2016+ AzerothCore , released under GNU AGPL v3 license, you may redistribute it + * and/or modify it under version 3 of the License, or (at your option), any later version. */ #ifndef _PLAYERBOT_XPGAINACTION_H diff --git a/src/strategy/deathknight/BloodDKStrategy.cpp b/src/strategy/deathknight/BloodDKStrategy.cpp index 03bc454c97..1f2793d92c 100644 --- a/src/strategy/deathknight/BloodDKStrategy.cpp +++ b/src/strategy/deathknight/BloodDKStrategy.cpp @@ -1,6 +1,6 @@ /* - * Copyright (C) 2016+ AzerothCore , released under GNU GPL v2 license, you may redistribute it - * and/or modify it under version 2 of the License, or (at your option), any later version. + * Copyright (C) 2016+ AzerothCore , released under GNU AGPL v3 license, you may redistribute it + * and/or modify it under version 3 of the License, or (at your option), any later version. */ #include "BloodDKStrategy.h" diff --git a/src/strategy/deathknight/BloodDKStrategy.h b/src/strategy/deathknight/BloodDKStrategy.h index 9a726478d5..e00101ad14 100644 --- a/src/strategy/deathknight/BloodDKStrategy.h +++ b/src/strategy/deathknight/BloodDKStrategy.h @@ -1,6 +1,6 @@ /* - * Copyright (C) 2016+ AzerothCore , released under GNU GPL v2 license, you may redistribute it - * and/or modify it under version 2 of the License, or (at your option), any later version. + * Copyright (C) 2016+ AzerothCore , released under GNU AGPL v3 license, you may redistribute it + * and/or modify it under version 3 of the License, or (at your option), any later version. */ #ifndef _PLAYERBOT_BLOODDKSTRATEGY_H diff --git a/src/strategy/deathknight/DKActions.cpp b/src/strategy/deathknight/DKActions.cpp index 575c5aef95..5206103617 100644 --- a/src/strategy/deathknight/DKActions.cpp +++ b/src/strategy/deathknight/DKActions.cpp @@ -1,6 +1,6 @@ /* - * Copyright (C) 2016+ AzerothCore , released under GNU GPL v2 license, you may redistribute it - * and/or modify it under version 2 of the License, or (at your option), any later version. + * Copyright (C) 2016+ AzerothCore , released under GNU AGPL v3 license, you may redistribute it + * and/or modify it under version 3 of the License, or (at your option), any later version. */ #include "DKActions.h" diff --git a/src/strategy/deathknight/DKActions.h b/src/strategy/deathknight/DKActions.h index 355a5c528d..a320a233ce 100644 --- a/src/strategy/deathknight/DKActions.h +++ b/src/strategy/deathknight/DKActions.h @@ -1,6 +1,6 @@ /* - * Copyright (C) 2016+ AzerothCore , released under GNU GPL v2 license, you may redistribute it - * and/or modify it under version 2 of the License, or (at your option), any later version. + * Copyright (C) 2016+ AzerothCore , released under GNU AGPL v3 license, you may redistribute it + * and/or modify it under version 3 of the License, or (at your option), any later version. */ #ifndef _PLAYERBOT_DKACTIONS_H diff --git a/src/strategy/deathknight/DKAiObjectContext.cpp b/src/strategy/deathknight/DKAiObjectContext.cpp index a26f96c007..ac80c7dc46 100644 --- a/src/strategy/deathknight/DKAiObjectContext.cpp +++ b/src/strategy/deathknight/DKAiObjectContext.cpp @@ -1,6 +1,6 @@ /* - * Copyright (C) 2016+ AzerothCore , released under GNU GPL v2 license, you may redistribute it - * and/or modify it under version 2 of the License, or (at your option), any later version. + * Copyright (C) 2016+ AzerothCore , released under GNU AGPL v3 license, you may redistribute it + * and/or modify it under version 3 of the License, or (at your option), any later version. */ #include "DKAiObjectContext.h" diff --git a/src/strategy/deathknight/DKAiObjectContext.h b/src/strategy/deathknight/DKAiObjectContext.h index b45a778add..8921df718a 100644 --- a/src/strategy/deathknight/DKAiObjectContext.h +++ b/src/strategy/deathknight/DKAiObjectContext.h @@ -1,6 +1,6 @@ /* - * Copyright (C) 2016+ AzerothCore , released under GNU GPL v2 license, you may redistribute it - * and/or modify it under version 2 of the License, or (at your option), any later version. + * Copyright (C) 2016+ AzerothCore , released under GNU AGPL v3 license, you may redistribute it + * and/or modify it under version 3 of the License, or (at your option), any later version. */ #ifndef _PLAYERBOT_DKAIOBJECTCONTEXT_H diff --git a/src/strategy/deathknight/DKTriggers.cpp b/src/strategy/deathknight/DKTriggers.cpp index 86508ceb35..90c1620953 100644 --- a/src/strategy/deathknight/DKTriggers.cpp +++ b/src/strategy/deathknight/DKTriggers.cpp @@ -1,6 +1,6 @@ /* - * Copyright (C) 2016+ AzerothCore , released under GNU GPL v2 license, you may redistribute it - * and/or modify it under version 2 of the License, or (at your option), any later version. + * Copyright (C) 2016+ AzerothCore , released under GNU AGPL v3 license, you may redistribute it + * and/or modify it under version 3 of the License, or (at your option), any later version. */ #include "DKTriggers.h" diff --git a/src/strategy/deathknight/DKTriggers.h b/src/strategy/deathknight/DKTriggers.h index 721a1dbce3..c46fbfe37f 100644 --- a/src/strategy/deathknight/DKTriggers.h +++ b/src/strategy/deathknight/DKTriggers.h @@ -1,6 +1,6 @@ /* - * Copyright (C) 2016+ AzerothCore , released under GNU GPL v2 license, you may redistribute it - * and/or modify it under version 2 of the License, or (at your option), any later version. + * Copyright (C) 2016+ AzerothCore , released under GNU AGPL v3 license, you may redistribute it + * and/or modify it under version 3 of the License, or (at your option), any later version. */ #ifndef _PLAYERBOT_DKTRIGGERS_H diff --git a/src/strategy/deathknight/FrostDKStrategy.cpp b/src/strategy/deathknight/FrostDKStrategy.cpp index 6ec84558c1..f25fa6824b 100644 --- a/src/strategy/deathknight/FrostDKStrategy.cpp +++ b/src/strategy/deathknight/FrostDKStrategy.cpp @@ -1,6 +1,6 @@ /* - * Copyright (C) 2016+ AzerothCore , released under GNU GPL v2 license, you may redistribute it - * and/or modify it under version 2 of the License, or (at your option), any later version. + * Copyright (C) 2016+ AzerothCore , released under GNU AGPL v3 license, you may redistribute it + * and/or modify it under version 3 of the License, or (at your option), any later version. */ #include "FrostDKStrategy.h" diff --git a/src/strategy/deathknight/FrostDKStrategy.h b/src/strategy/deathknight/FrostDKStrategy.h index 3a4b6e72fc..c305621ad1 100644 --- a/src/strategy/deathknight/FrostDKStrategy.h +++ b/src/strategy/deathknight/FrostDKStrategy.h @@ -1,6 +1,6 @@ /* - * Copyright (C) 2016+ AzerothCore , released under GNU GPL v2 license, you may redistribute it - * and/or modify it under version 2 of the License, or (at your option), any later version. + * Copyright (C) 2016+ AzerothCore , released under GNU AGPL v3 license, you may redistribute it + * and/or modify it under version 3 of the License, or (at your option), any later version. */ #ifndef _PLAYERBOT_FROSTDKSTRATEGY_H diff --git a/src/strategy/deathknight/GenericDKNonCombatStrategy.cpp b/src/strategy/deathknight/GenericDKNonCombatStrategy.cpp index 991634416a..5c095d2989 100644 --- a/src/strategy/deathknight/GenericDKNonCombatStrategy.cpp +++ b/src/strategy/deathknight/GenericDKNonCombatStrategy.cpp @@ -1,6 +1,6 @@ /* - * Copyright (C) 2016+ AzerothCore , released under GNU GPL v2 license, you may redistribute it - * and/or modify it under version 2 of the License, or (at your option), any later version. + * Copyright (C) 2016+ AzerothCore , released under GNU AGPL v3 license, you may redistribute it + * and/or modify it under version 3 of the License, or (at your option), any later version. */ #include "GenericDKNonCombatStrategy.h" diff --git a/src/strategy/deathknight/GenericDKNonCombatStrategy.h b/src/strategy/deathknight/GenericDKNonCombatStrategy.h index f94be4c9e1..37e8c74bcf 100644 --- a/src/strategy/deathknight/GenericDKNonCombatStrategy.h +++ b/src/strategy/deathknight/GenericDKNonCombatStrategy.h @@ -1,6 +1,6 @@ /* - * Copyright (C) 2016+ AzerothCore , released under GNU GPL v2 license, you may redistribute it - * and/or modify it under version 2 of the License, or (at your option), any later version. + * Copyright (C) 2016+ AzerothCore , released under GNU AGPL v3 license, you may redistribute it + * and/or modify it under version 3 of the License, or (at your option), any later version. */ #ifndef _PLAYERBOT_GENERICDKNONCOMBATSTRATEGY_H diff --git a/src/strategy/deathknight/GenericDKStrategy.cpp b/src/strategy/deathknight/GenericDKStrategy.cpp index 62da436210..4d52cbc362 100644 --- a/src/strategy/deathknight/GenericDKStrategy.cpp +++ b/src/strategy/deathknight/GenericDKStrategy.cpp @@ -1,5 +1,5 @@ #/* - * Copyright (C) 2016+ AzerothCore , released under GNU GPL v2 license, you may redistribute it and/or modify it under version 2 of the License, or (at your option), any later version. + * Copyright (C) 2016+ AzerothCore , released under GNU AGPL v3 license, you may redistribute it and/or modify it under version 3 of the License, or (at your option), any later version. */ #include "GenericDKStrategy.h" diff --git a/src/strategy/deathknight/GenericDKStrategy.h b/src/strategy/deathknight/GenericDKStrategy.h index 4169d611ee..dabe742815 100644 --- a/src/strategy/deathknight/GenericDKStrategy.h +++ b/src/strategy/deathknight/GenericDKStrategy.h @@ -1,6 +1,6 @@ /* - * Copyright (C) 2016+ AzerothCore , released under GNU GPL v2 license, you may redistribute it - * and/or modify it under version 2 of the License, or (at your option), any later version. + * Copyright (C) 2016+ AzerothCore , released under GNU AGPL v3 license, you may redistribute it + * and/or modify it under version 3 of the License, or (at your option), any later version. */ #ifndef _PLAYERBOT_GENERICDKSTRATEGY_H diff --git a/src/strategy/deathknight/UnholyDKStrategy.cpp b/src/strategy/deathknight/UnholyDKStrategy.cpp index acc7ab57fe..1740ec3999 100644 --- a/src/strategy/deathknight/UnholyDKStrategy.cpp +++ b/src/strategy/deathknight/UnholyDKStrategy.cpp @@ -1,5 +1,5 @@ #/* - * Copyright (C) 2016+ AzerothCore , released under GNU GPL v2 license, you may redistribute it and/or modify it under version 2 of the License, or (at your option), any later version. + * Copyright (C) 2016+ AzerothCore , released under GNU AGPL v3 license, you may redistribute it and/or modify it under version 3 of the License, or (at your option), any later version. */ #include "UnholyDKStrategy.h" diff --git a/src/strategy/deathknight/UnholyDKStrategy.h b/src/strategy/deathknight/UnholyDKStrategy.h index 3e69bc099a..512ddb0d38 100644 --- a/src/strategy/deathknight/UnholyDKStrategy.h +++ b/src/strategy/deathknight/UnholyDKStrategy.h @@ -1,6 +1,6 @@ /* - * Copyright (C) 2016+ AzerothCore , released under GNU GPL v2 license, you may redistribute it - * and/or modify it under version 2 of the License, or (at your option), any later version. + * Copyright (C) 2016+ AzerothCore , released under GNU AGPL v3 license, you may redistribute it + * and/or modify it under version 3 of the License, or (at your option), any later version. */ #ifndef _PLAYERBOT_UNHOLYDKSTRATEGY_H diff --git a/src/strategy/druid/BearTankDruidStrategy.cpp b/src/strategy/druid/BearTankDruidStrategy.cpp index e732357d31..42bb81c448 100644 --- a/src/strategy/druid/BearTankDruidStrategy.cpp +++ b/src/strategy/druid/BearTankDruidStrategy.cpp @@ -1,6 +1,6 @@ /* - * Copyright (C) 2016+ AzerothCore , released under GNU GPL v2 license, you may redistribute it - * and/or modify it under version 2 of the License, or (at your option), any later version. + * Copyright (C) 2016+ AzerothCore , released under GNU AGPL v3 license, you may redistribute it + * and/or modify it under version 3 of the License, or (at your option), any later version. */ #include "BearTankDruidStrategy.h" diff --git a/src/strategy/druid/BearTankDruidStrategy.h b/src/strategy/druid/BearTankDruidStrategy.h index 6bc96d9797..9b0595a185 100644 --- a/src/strategy/druid/BearTankDruidStrategy.h +++ b/src/strategy/druid/BearTankDruidStrategy.h @@ -1,6 +1,6 @@ /* - * Copyright (C) 2016+ AzerothCore , released under GNU GPL v2 license, you may redistribute it - * and/or modify it under version 2 of the License, or (at your option), any later version. + * Copyright (C) 2016+ AzerothCore , released under GNU AGPL v3 license, you may redistribute it + * and/or modify it under version 3 of the License, or (at your option), any later version. */ #ifndef _PLAYERBOT_BEARTANKDRUIDSTRATEGY_H diff --git a/src/strategy/druid/CasterDruidStrategy.cpp b/src/strategy/druid/CasterDruidStrategy.cpp index 571ee2bbc5..657fedaa69 100644 --- a/src/strategy/druid/CasterDruidStrategy.cpp +++ b/src/strategy/druid/CasterDruidStrategy.cpp @@ -1,6 +1,6 @@ /* - * Copyright (C) 2016+ AzerothCore , released under GNU GPL v2 license, you may redistribute it - * and/or modify it under version 2 of the License, or (at your option), any later version. + * Copyright (C) 2016+ AzerothCore , released under GNU AGPL v3 license, you may redistribute it + * and/or modify it under version 3 of the License, or (at your option), any later version. */ #include "CasterDruidStrategy.h" diff --git a/src/strategy/druid/CasterDruidStrategy.h b/src/strategy/druid/CasterDruidStrategy.h index b7b16d84ab..0455b2f11a 100644 --- a/src/strategy/druid/CasterDruidStrategy.h +++ b/src/strategy/druid/CasterDruidStrategy.h @@ -1,6 +1,6 @@ /* - * Copyright (C) 2016+ AzerothCore , released under GNU GPL v2 license, you may redistribute it - * and/or modify it under version 2 of the License, or (at your option), any later version. + * Copyright (C) 2016+ AzerothCore , released under GNU AGPL v3 license, you may redistribute it + * and/or modify it under version 3 of the License, or (at your option), any later version. */ #ifndef _PLAYERBOT_CASTERDRUIDSTRATEGY_H diff --git a/src/strategy/druid/CatDpsDruidStrategy.cpp b/src/strategy/druid/CatDpsDruidStrategy.cpp index e640cebdcc..641156f951 100644 --- a/src/strategy/druid/CatDpsDruidStrategy.cpp +++ b/src/strategy/druid/CatDpsDruidStrategy.cpp @@ -1,6 +1,6 @@ /* - * Copyright (C) 2016+ AzerothCore , released under GNU GPL v2 license, you may redistribute it - * and/or modify it under version 2 of the License, or (at your option), any later version. + * Copyright (C) 2016+ AzerothCore , released under GNU AGPL v3 license, you may redistribute it + * and/or modify it under version 3 of the License, or (at your option), any later version. */ #include "CatDpsDruidStrategy.h" diff --git a/src/strategy/druid/CatDpsDruidStrategy.h b/src/strategy/druid/CatDpsDruidStrategy.h index 96b8d3af36..bfe2450b0c 100644 --- a/src/strategy/druid/CatDpsDruidStrategy.h +++ b/src/strategy/druid/CatDpsDruidStrategy.h @@ -1,6 +1,6 @@ /* - * Copyright (C) 2016+ AzerothCore , released under GNU GPL v2 license, you may redistribute it - * and/or modify it under version 2 of the License, or (at your option), any later version. + * Copyright (C) 2016+ AzerothCore , released under GNU AGPL v3 license, you may redistribute it + * and/or modify it under version 3 of the License, or (at your option), any later version. */ #ifndef _PLAYERBOT_CATDPSDRUIDSTRATEGY_H diff --git a/src/strategy/druid/DruidActions.cpp b/src/strategy/druid/DruidActions.cpp index 1743a3395b..b5a493dbb5 100644 --- a/src/strategy/druid/DruidActions.cpp +++ b/src/strategy/druid/DruidActions.cpp @@ -1,6 +1,6 @@ /* - * Copyright (C) 2016+ AzerothCore , released under GNU GPL v2 license, you may redistribute it - * and/or modify it under version 2 of the License, or (at your option), any later version. + * Copyright (C) 2016+ AzerothCore , released under GNU AGPL v3 license, you may redistribute it + * and/or modify it under version 3 of the License, or (at your option), any later version. */ #include "DruidActions.h" diff --git a/src/strategy/druid/DruidActions.h b/src/strategy/druid/DruidActions.h index 124fef6c4f..f7a4ef32ce 100644 --- a/src/strategy/druid/DruidActions.h +++ b/src/strategy/druid/DruidActions.h @@ -1,6 +1,6 @@ /* - * Copyright (C) 2016+ AzerothCore , released under GNU GPL v2 license, you may redistribute it - * and/or modify it under version 2 of the License, or (at your option), any later version. + * Copyright (C) 2016+ AzerothCore , released under GNU AGPL v3 license, you may redistribute it + * and/or modify it under version 3 of the License, or (at your option), any later version. */ #ifndef _PLAYERBOT_DRUIDACTIONS_H diff --git a/src/strategy/druid/DruidAiObjectContext.cpp b/src/strategy/druid/DruidAiObjectContext.cpp index db2d9a70a9..29d9d4fdc0 100644 --- a/src/strategy/druid/DruidAiObjectContext.cpp +++ b/src/strategy/druid/DruidAiObjectContext.cpp @@ -1,6 +1,6 @@ /* - * Copyright (C) 2016+ AzerothCore , released under GNU GPL v2 license, you may redistribute it - * and/or modify it under version 2 of the License, or (at your option), any later version. + * Copyright (C) 2016+ AzerothCore , released under GNU AGPL v3 license, you may redistribute it + * and/or modify it under version 3 of the License, or (at your option), any later version. */ #include "DruidAiObjectContext.h" diff --git a/src/strategy/druid/DruidAiObjectContext.h b/src/strategy/druid/DruidAiObjectContext.h index c36dd0c855..ee309e79c7 100644 --- a/src/strategy/druid/DruidAiObjectContext.h +++ b/src/strategy/druid/DruidAiObjectContext.h @@ -1,6 +1,6 @@ /* - * Copyright (C) 2016+ AzerothCore , released under GNU GPL v2 license, you may redistribute it - * and/or modify it under version 2 of the License, or (at your option), any later version. + * Copyright (C) 2016+ AzerothCore , released under GNU AGPL v3 license, you may redistribute it + * and/or modify it under version 3 of the License, or (at your option), any later version. */ #ifndef _PLAYERBOT_DRUIDAIOBJECTCONTEXT_H diff --git a/src/strategy/druid/DruidBearActions.cpp b/src/strategy/druid/DruidBearActions.cpp index b04ed9689d..e6ff2a86ce 100644 --- a/src/strategy/druid/DruidBearActions.cpp +++ b/src/strategy/druid/DruidBearActions.cpp @@ -1,6 +1,6 @@ /* - * Copyright (C) 2016+ AzerothCore , released under GNU GPL v2 license, you may redistribute it - * and/or modify it under version 2 of the License, or (at your option), any later version. + * Copyright (C) 2016+ AzerothCore , released under GNU AGPL v3 license, you may redistribute it + * and/or modify it under version 3 of the License, or (at your option), any later version. */ #include "DruidBearActions.h" diff --git a/src/strategy/druid/DruidBearActions.h b/src/strategy/druid/DruidBearActions.h index e83821bbb0..caf369be33 100644 --- a/src/strategy/druid/DruidBearActions.h +++ b/src/strategy/druid/DruidBearActions.h @@ -1,6 +1,6 @@ /* - * Copyright (C) 2016+ AzerothCore , released under GNU GPL v2 license, you may redistribute it - * and/or modify it under version 2 of the License, or (at your option), any later version. + * Copyright (C) 2016+ AzerothCore , released under GNU AGPL v3 license, you may redistribute it + * and/or modify it under version 3 of the License, or (at your option), any later version. */ #ifndef _PLAYERBOT_DRUIDBEARACTIONS_H diff --git a/src/strategy/druid/DruidCatActions.h b/src/strategy/druid/DruidCatActions.h index cf4c6c3565..f6d8f23203 100644 --- a/src/strategy/druid/DruidCatActions.h +++ b/src/strategy/druid/DruidCatActions.h @@ -1,6 +1,6 @@ /* - * Copyright (C) 2016+ AzerothCore , released under GNU GPL v2 license, you may redistribute it - * and/or modify it under version 2 of the License, or (at your option), any later version. + * Copyright (C) 2016+ AzerothCore , released under GNU AGPL v3 license, you may redistribute it + * and/or modify it under version 3 of the License, or (at your option), any later version. */ #ifndef _PLAYERBOT_DRUIDCATACTIONS_H diff --git a/src/strategy/druid/DruidShapeshiftActions.cpp b/src/strategy/druid/DruidShapeshiftActions.cpp index 4354328eff..0c3aab7bf5 100644 --- a/src/strategy/druid/DruidShapeshiftActions.cpp +++ b/src/strategy/druid/DruidShapeshiftActions.cpp @@ -1,6 +1,6 @@ /* - * Copyright (C) 2016+ AzerothCore , released under GNU GPL v2 license, you may redistribute it - * and/or modify it under version 2 of the License, or (at your option), any later version. + * Copyright (C) 2016+ AzerothCore , released under GNU AGPL v3 license, you may redistribute it + * and/or modify it under version 3 of the License, or (at your option), any later version. */ #include "DruidShapeshiftActions.h" diff --git a/src/strategy/druid/DruidShapeshiftActions.h b/src/strategy/druid/DruidShapeshiftActions.h index 6b24208b28..61a9a13894 100644 --- a/src/strategy/druid/DruidShapeshiftActions.h +++ b/src/strategy/druid/DruidShapeshiftActions.h @@ -1,6 +1,6 @@ /* - * Copyright (C) 2016+ AzerothCore , released under GNU GPL v2 license, you may redistribute it - * and/or modify it under version 2 of the License, or (at your option), any later version. + * Copyright (C) 2016+ AzerothCore , released under GNU AGPL v3 license, you may redistribute it + * and/or modify it under version 3 of the License, or (at your option), any later version. */ #ifndef _PLAYERBOT_DRUIDSHAPESHIFTACTIONS_H diff --git a/src/strategy/druid/DruidTriggers.cpp b/src/strategy/druid/DruidTriggers.cpp index d38a29c407..6cf8552a3a 100644 --- a/src/strategy/druid/DruidTriggers.cpp +++ b/src/strategy/druid/DruidTriggers.cpp @@ -1,6 +1,6 @@ /* - * Copyright (C) 2016+ AzerothCore , released under GNU GPL v2 license, you may redistribute it - * and/or modify it under version 2 of the License, or (at your option), any later version. + * Copyright (C) 2016+ AzerothCore , released under GNU AGPL v3 license, you may redistribute it + * and/or modify it under version 3 of the License, or (at your option), any later version. */ #include "DruidTriggers.h" diff --git a/src/strategy/druid/DruidTriggers.h b/src/strategy/druid/DruidTriggers.h index 1b9c7a2537..5541cc10e3 100644 --- a/src/strategy/druid/DruidTriggers.h +++ b/src/strategy/druid/DruidTriggers.h @@ -1,6 +1,6 @@ /* - * Copyright (C) 2016+ AzerothCore , released under GNU GPL v2 license, you may redistribute it - * and/or modify it under version 2 of the License, or (at your option), any later version. + * Copyright (C) 2016+ AzerothCore , released under GNU AGPL v3 license, you may redistribute it + * and/or modify it under version 3 of the License, or (at your option), any later version. */ #ifndef _PLAYERBOT_DRUIDTRIGGERS_H diff --git a/src/strategy/druid/FeralDruidStrategy.cpp b/src/strategy/druid/FeralDruidStrategy.cpp index 5fe2f63b4b..e5e4832526 100644 --- a/src/strategy/druid/FeralDruidStrategy.cpp +++ b/src/strategy/druid/FeralDruidStrategy.cpp @@ -1,6 +1,6 @@ /* - * Copyright (C) 2016+ AzerothCore , released under GNU GPL v2 license, you may redistribute it - * and/or modify it under version 2 of the License, or (at your option), any later version. + * Copyright (C) 2016+ AzerothCore , released under GNU AGPL v3 license, you may redistribute it + * and/or modify it under version 3 of the License, or (at your option), any later version. */ #include "FeralDruidStrategy.h" diff --git a/src/strategy/druid/FeralDruidStrategy.h b/src/strategy/druid/FeralDruidStrategy.h index ccb945c069..dd1e7d006e 100644 --- a/src/strategy/druid/FeralDruidStrategy.h +++ b/src/strategy/druid/FeralDruidStrategy.h @@ -1,6 +1,6 @@ /* - * Copyright (C) 2016+ AzerothCore , released under GNU GPL v2 license, you may redistribute it - * and/or modify it under version 2 of the License, or (at your option), any later version. + * Copyright (C) 2016+ AzerothCore , released under GNU AGPL v3 license, you may redistribute it + * and/or modify it under version 3 of the License, or (at your option), any later version. */ #ifndef _PLAYERBOT_FERALRUIDSTRATEGY_H diff --git a/src/strategy/druid/GenericDruidNonCombatStrategy.cpp b/src/strategy/druid/GenericDruidNonCombatStrategy.cpp index 0f269cabf3..3b42160a3e 100644 --- a/src/strategy/druid/GenericDruidNonCombatStrategy.cpp +++ b/src/strategy/druid/GenericDruidNonCombatStrategy.cpp @@ -1,6 +1,6 @@ /* - * Copyright (C) 2016+ AzerothCore , released under GNU GPL v2 license, you may redistribute it - * and/or modify it under version 2 of the License, or (at your option), any later version. + * Copyright (C) 2016+ AzerothCore , released under GNU AGPL v3 license, you may redistribute it + * and/or modify it under version 3 of the License, or (at your option), any later version. */ #include "GenericDruidNonCombatStrategy.h" diff --git a/src/strategy/druid/GenericDruidNonCombatStrategy.h b/src/strategy/druid/GenericDruidNonCombatStrategy.h index 31add8ea99..28e1544542 100644 --- a/src/strategy/druid/GenericDruidNonCombatStrategy.h +++ b/src/strategy/druid/GenericDruidNonCombatStrategy.h @@ -1,6 +1,6 @@ /* - * Copyright (C) 2016+ AzerothCore , released under GNU GPL v2 license, you may redistribute it - * and/or modify it under version 2 of the License, or (at your option), any later version. + * Copyright (C) 2016+ AzerothCore , released under GNU AGPL v3 license, you may redistribute it + * and/or modify it under version 3 of the License, or (at your option), any later version. */ #ifndef _PLAYERBOT_GENERICDRUIDNONCOMBATSTRATEGY_H diff --git a/src/strategy/druid/GenericDruidStrategy.cpp b/src/strategy/druid/GenericDruidStrategy.cpp index 429954cf8c..b1fec20eb5 100644 --- a/src/strategy/druid/GenericDruidStrategy.cpp +++ b/src/strategy/druid/GenericDruidStrategy.cpp @@ -1,6 +1,6 @@ /* - * Copyright (C) 2016+ AzerothCore , released under GNU GPL v2 license, you may redistribute it - * and/or modify it under version 2 of the License, or (at your option), any later version. + * Copyright (C) 2016+ AzerothCore , released under GNU AGPL v3 license, you may redistribute it + * and/or modify it under version 3 of the License, or (at your option), any later version. */ #include "GenericDruidStrategy.h" diff --git a/src/strategy/druid/GenericDruidStrategy.h b/src/strategy/druid/GenericDruidStrategy.h index 547b93b095..2f1c2e7874 100644 --- a/src/strategy/druid/GenericDruidStrategy.h +++ b/src/strategy/druid/GenericDruidStrategy.h @@ -1,6 +1,6 @@ /* - * Copyright (C) 2016+ AzerothCore , released under GNU GPL v2 license, you may redistribute it - * and/or modify it under version 2 of the License, or (at your option), any later version. + * Copyright (C) 2016+ AzerothCore , released under GNU AGPL v3 license, you may redistribute it + * and/or modify it under version 3 of the License, or (at your option), any later version. */ #ifndef _PLAYERBOT_GENERICDRUIDSTRATEGY_H diff --git a/src/strategy/druid/HealDruidStrategy.cpp b/src/strategy/druid/HealDruidStrategy.cpp index 0f22f22344..7e052a3463 100644 --- a/src/strategy/druid/HealDruidStrategy.cpp +++ b/src/strategy/druid/HealDruidStrategy.cpp @@ -1,6 +1,6 @@ /* - * Copyright (C) 2016+ AzerothCore , released under GNU GPL v2 license, you may redistribute it - * and/or modify it under version 2 of the License, or (at your option), any later version. + * Copyright (C) 2016+ AzerothCore , released under GNU AGPL v3 license, you may redistribute it + * and/or modify it under version 3 of the License, or (at your option), any later version. */ #include "HealDruidStrategy.h" diff --git a/src/strategy/druid/HealDruidStrategy.h b/src/strategy/druid/HealDruidStrategy.h index e0833d296c..36ce402715 100644 --- a/src/strategy/druid/HealDruidStrategy.h +++ b/src/strategy/druid/HealDruidStrategy.h @@ -1,6 +1,6 @@ /* - * Copyright (C) 2016+ AzerothCore , released under GNU GPL v2 license, you may redistribute it - * and/or modify it under version 2 of the License, or (at your option), any later version. + * Copyright (C) 2016+ AzerothCore , released under GNU AGPL v3 license, you may redistribute it + * and/or modify it under version 3 of the License, or (at your option), any later version. */ #ifndef _PLAYERBOT_HEALDRUIDSTRATEGY_H diff --git a/src/strategy/druid/MeleeDruidStrategy.cpp b/src/strategy/druid/MeleeDruidStrategy.cpp index 2b70983637..f474a97828 100644 --- a/src/strategy/druid/MeleeDruidStrategy.cpp +++ b/src/strategy/druid/MeleeDruidStrategy.cpp @@ -1,6 +1,6 @@ /* - * Copyright (C) 2016+ AzerothCore , released under GNU GPL v2 license, you may redistribute it - * and/or modify it under version 2 of the License, or (at your option), any later version. + * Copyright (C) 2016+ AzerothCore , released under GNU AGPL v3 license, you may redistribute it + * and/or modify it under version 3 of the License, or (at your option), any later version. */ #include "MeleeDruidStrategy.h" diff --git a/src/strategy/druid/MeleeDruidStrategy.h b/src/strategy/druid/MeleeDruidStrategy.h index 5302212b56..95317360f9 100644 --- a/src/strategy/druid/MeleeDruidStrategy.h +++ b/src/strategy/druid/MeleeDruidStrategy.h @@ -1,6 +1,6 @@ /* - * Copyright (C) 2016+ AzerothCore , released under GNU GPL v2 license, you may redistribute it - * and/or modify it under version 2 of the License, or (at your option), any later version. + * Copyright (C) 2016+ AzerothCore , released under GNU AGPL v3 license, you may redistribute it + * and/or modify it under version 3 of the License, or (at your option), any later version. */ #ifndef _PLAYERBOT_MELEEDRUIDSTRATEGY_H diff --git a/src/strategy/druid/OffhealDruidCatStrategy.cpp b/src/strategy/druid/OffhealDruidCatStrategy.cpp index 8cfef7f7ea..7059070970 100644 --- a/src/strategy/druid/OffhealDruidCatStrategy.cpp +++ b/src/strategy/druid/OffhealDruidCatStrategy.cpp @@ -1,6 +1,6 @@ /* - * Copyright (C) 2016+ AzerothCore , released under GNU GPL v2 license, you may redistribute it - * and/or modify it under version 2 of the License, or (at your option), any later version. + * Copyright (C) 2016+ AzerothCore , released under GNU AGPL v3 license, you may redistribute it + * and/or modify it under version 3 of the License, or (at your option), any later version. */ #include "OffhealDruidCatStrategy.h" diff --git a/src/strategy/druid/OffhealDruidCatStrategy.h b/src/strategy/druid/OffhealDruidCatStrategy.h index d180743a67..c90775d58f 100644 --- a/src/strategy/druid/OffhealDruidCatStrategy.h +++ b/src/strategy/druid/OffhealDruidCatStrategy.h @@ -1,6 +1,6 @@ /* - * Copyright (C) 2016+ AzerothCore , released under GNU GPL v2 license, you may redistribute it - * and/or modify it under version 2 of the License, or (at your option), any later version. + * Copyright (C) 2016+ AzerothCore , released under GNU AGPL v3 license, you may redistribute it + * and/or modify it under version 3 of the License, or (at your option), any later version. */ #ifndef _PLAYERBOT_OFFHEALDRUIDCATSTRATEGY_H diff --git a/src/strategy/generic/AttackEnemyPlayersStrategy.cpp b/src/strategy/generic/AttackEnemyPlayersStrategy.cpp index 794efe414a..1c3b843e8a 100644 --- a/src/strategy/generic/AttackEnemyPlayersStrategy.cpp +++ b/src/strategy/generic/AttackEnemyPlayersStrategy.cpp @@ -1,6 +1,6 @@ /* - * Copyright (C) 2016+ AzerothCore , released under GNU GPL v2 license, you may redistribute it - * and/or modify it under version 2 of the License, or (at your option), any later version. + * Copyright (C) 2016+ AzerothCore , released under GNU AGPL v3 license, you may redistribute it + * and/or modify it under version 3 of the License, or (at your option), any later version. */ #include "AttackEnemyPlayersStrategy.h" diff --git a/src/strategy/generic/AttackEnemyPlayersStrategy.h b/src/strategy/generic/AttackEnemyPlayersStrategy.h index d0f79efe50..aa29d90c12 100644 --- a/src/strategy/generic/AttackEnemyPlayersStrategy.h +++ b/src/strategy/generic/AttackEnemyPlayersStrategy.h @@ -1,6 +1,6 @@ /* - * Copyright (C) 2016+ AzerothCore , released under GNU GPL v2 license, you may redistribute it - * and/or modify it under version 2 of the License, or (at your option), any later version. + * Copyright (C) 2016+ AzerothCore , released under GNU AGPL v3 license, you may redistribute it + * and/or modify it under version 3 of the License, or (at your option), any later version. */ #ifndef _PLAYERBOT_ATTACKENEMYPAYERSSTRATEGYACTION_H diff --git a/src/strategy/generic/BattlegroundStrategy.cpp b/src/strategy/generic/BattlegroundStrategy.cpp index ca30d5a21c..444acf06b1 100644 --- a/src/strategy/generic/BattlegroundStrategy.cpp +++ b/src/strategy/generic/BattlegroundStrategy.cpp @@ -1,6 +1,6 @@ /* - * Copyright (C) 2016+ AzerothCore , released under GNU GPL v2 license, you may redistribute it - * and/or modify it under version 2 of the License, or (at your option), any later version. + * Copyright (C) 2016+ AzerothCore , released under GNU AGPL v3 license, you may redistribute it + * and/or modify it under version 3 of the License, or (at your option), any later version. */ #include "BattlegroundStrategy.h" diff --git a/src/strategy/generic/BattlegroundStrategy.h b/src/strategy/generic/BattlegroundStrategy.h index 3f535248b2..e36895e2c5 100644 --- a/src/strategy/generic/BattlegroundStrategy.h +++ b/src/strategy/generic/BattlegroundStrategy.h @@ -1,6 +1,6 @@ /* - * Copyright (C) 2016+ AzerothCore , released under GNU GPL v2 license, you may redistribute it - * and/or modify it under version 2 of the License, or (at your option), any later version. + * Copyright (C) 2016+ AzerothCore , released under GNU AGPL v3 license, you may redistribute it + * and/or modify it under version 3 of the License, or (at your option), any later version. */ #ifndef _PLAYERBOT_BATTLEGROUNDSTRATEGY_H diff --git a/src/strategy/generic/CastTimeStrategy.cpp b/src/strategy/generic/CastTimeStrategy.cpp index 3990bd7db6..042d1c9e41 100644 --- a/src/strategy/generic/CastTimeStrategy.cpp +++ b/src/strategy/generic/CastTimeStrategy.cpp @@ -1,6 +1,6 @@ /* - * Copyright (C) 2016+ AzerothCore , released under GNU GPL v2 license, you may redistribute it - * and/or modify it under version 2 of the License, or (at your option), any later version. + * Copyright (C) 2016+ AzerothCore , released under GNU AGPL v3 license, you may redistribute it + * and/or modify it under version 3 of the License, or (at your option), any later version. */ #include "CastTimeStrategy.h" diff --git a/src/strategy/generic/CastTimeStrategy.h b/src/strategy/generic/CastTimeStrategy.h index 07100249ac..f5eddc1ca2 100644 --- a/src/strategy/generic/CastTimeStrategy.h +++ b/src/strategy/generic/CastTimeStrategy.h @@ -1,6 +1,6 @@ /* - * Copyright (C) 2016+ AzerothCore , released under GNU GPL v2 license, you may redistribute it - * and/or modify it under version 2 of the License, or (at your option), any later version. + * Copyright (C) 2016+ AzerothCore , released under GNU AGPL v3 license, you may redistribute it + * and/or modify it under version 3 of the License, or (at your option), any later version. */ #ifndef _PLAYERBOT_CASTTIMESTRATEGY_H diff --git a/src/strategy/generic/ChatCommandHandlerStrategy.cpp b/src/strategy/generic/ChatCommandHandlerStrategy.cpp index 038db891ce..e23e827c89 100644 --- a/src/strategy/generic/ChatCommandHandlerStrategy.cpp +++ b/src/strategy/generic/ChatCommandHandlerStrategy.cpp @@ -1,6 +1,6 @@ /* - * Copyright (C) 2016+ AzerothCore , released under GNU GPL v2 license, you may redistribute it - * and/or modify it under version 2 of the License, or (at your option), any later version. + * Copyright (C) 2016+ AzerothCore , released under GNU AGPL v3 license, you may redistribute it + * and/or modify it under version 3 of the License, or (at your option), any later version. */ #include "ChatCommandHandlerStrategy.h" diff --git a/src/strategy/generic/ChatCommandHandlerStrategy.h b/src/strategy/generic/ChatCommandHandlerStrategy.h index cf69a7b040..87eab747d6 100644 --- a/src/strategy/generic/ChatCommandHandlerStrategy.h +++ b/src/strategy/generic/ChatCommandHandlerStrategy.h @@ -1,6 +1,6 @@ /* - * Copyright (C) 2016+ AzerothCore , released under GNU GPL v2 license, you may redistribute it - * and/or modify it under version 2 of the License, or (at your option), any later version. + * Copyright (C) 2016+ AzerothCore , released under GNU AGPL v3 license, you may redistribute it + * and/or modify it under version 3 of the License, or (at your option), any later version. */ #ifndef _PLAYERBOT_CHATCOMMANDHANDLERSTRATEGY_H diff --git a/src/strategy/generic/CombatStrategy.cpp b/src/strategy/generic/CombatStrategy.cpp index 7798214331..e194eb883d 100644 --- a/src/strategy/generic/CombatStrategy.cpp +++ b/src/strategy/generic/CombatStrategy.cpp @@ -1,6 +1,6 @@ /* - * Copyright (C) 2016+ AzerothCore , released under GNU GPL v2 license, you may redistribute it - * and/or modify it under version 2 of the License, or (at your option), any later version. + * Copyright (C) 2016+ AzerothCore , released under GNU AGPL v3 license, you may redistribute it + * and/or modify it under version 3 of the License, or (at your option), any later version. */ #include "CombatStrategy.h" diff --git a/src/strategy/generic/CombatStrategy.h b/src/strategy/generic/CombatStrategy.h index 9005f6f5fe..3f3019f224 100644 --- a/src/strategy/generic/CombatStrategy.h +++ b/src/strategy/generic/CombatStrategy.h @@ -1,6 +1,6 @@ /* - * Copyright (C) 2016+ AzerothCore , released under GNU GPL v2 license, you may redistribute it - * and/or modify it under version 2 of the License, or (at your option), any later version. + * Copyright (C) 2016+ AzerothCore , released under GNU AGPL v3 license, you may redistribute it + * and/or modify it under version 3 of the License, or (at your option), any later version. */ #ifndef _PLAYERBOT_COMBATSTRATEGY_H diff --git a/src/strategy/generic/ConserveManaStrategy.cpp b/src/strategy/generic/ConserveManaStrategy.cpp index 48ebabab5b..adc3cec884 100644 --- a/src/strategy/generic/ConserveManaStrategy.cpp +++ b/src/strategy/generic/ConserveManaStrategy.cpp @@ -1,6 +1,6 @@ /* - * Copyright (C) 2016+ AzerothCore , released under GNU GPL v2 license, you may redistribute it - * and/or modify it under version 2 of the License, or (at your option), any later version. + * Copyright (C) 2016+ AzerothCore , released under GNU AGPL v3 license, you may redistribute it + * and/or modify it under version 3 of the License, or (at your option), any later version. */ #include "ConserveManaStrategy.h" diff --git a/src/strategy/generic/ConserveManaStrategy.h b/src/strategy/generic/ConserveManaStrategy.h index 0f389ca3fc..000399f19f 100644 --- a/src/strategy/generic/ConserveManaStrategy.h +++ b/src/strategy/generic/ConserveManaStrategy.h @@ -1,6 +1,6 @@ /* - * Copyright (C) 2016+ AzerothCore , released under GNU GPL v2 license, you may redistribute it - * and/or modify it under version 2 of the License, or (at your option), any later version. + * Copyright (C) 2016+ AzerothCore , released under GNU AGPL v3 license, you may redistribute it + * and/or modify it under version 3 of the License, or (at your option), any later version. */ #ifndef _PLAYERBOT_CONSERVEMANASTRATEGY_H diff --git a/src/strategy/generic/DeadStrategy.cpp b/src/strategy/generic/DeadStrategy.cpp index 31de5afd1a..764813cfc9 100644 --- a/src/strategy/generic/DeadStrategy.cpp +++ b/src/strategy/generic/DeadStrategy.cpp @@ -1,6 +1,6 @@ /* - * Copyright (C) 2016+ AzerothCore , released under GNU GPL v2 license, you may redistribute it - * and/or modify it under version 2 of the License, or (at your option), any later version. + * Copyright (C) 2016+ AzerothCore , released under GNU AGPL v3 license, you may redistribute it + * and/or modify it under version 3 of the License, or (at your option), any later version. */ #include "DeadStrategy.h" diff --git a/src/strategy/generic/DeadStrategy.h b/src/strategy/generic/DeadStrategy.h index 67addaa66b..4ae33d4c52 100644 --- a/src/strategy/generic/DeadStrategy.h +++ b/src/strategy/generic/DeadStrategy.h @@ -1,6 +1,6 @@ /* - * Copyright (C) 2016+ AzerothCore , released under GNU GPL v2 license, you may redistribute it - * and/or modify it under version 2 of the License, or (at your option), any later version. + * Copyright (C) 2016+ AzerothCore , released under GNU AGPL v3 license, you may redistribute it + * and/or modify it under version 3 of the License, or (at your option), any later version. */ #ifndef _PLAYERBOT_DEADSTRATEGY_H diff --git a/src/strategy/generic/DebugStrategy.cpp b/src/strategy/generic/DebugStrategy.cpp index 2840e2f611..bae6b419d8 100644 --- a/src/strategy/generic/DebugStrategy.cpp +++ b/src/strategy/generic/DebugStrategy.cpp @@ -1,6 +1,6 @@ /* - * Copyright (C) 2016+ AzerothCore , released under GNU GPL v2 license, you may redistribute it - * and/or modify it under version 2 of the License, or (at your option), any later version. + * Copyright (C) 2016+ AzerothCore , released under GNU AGPL v3 license, you may redistribute it + * and/or modify it under version 3 of the License, or (at your option), any later version. */ #include "DebugStrategy.h" diff --git a/src/strategy/generic/DebugStrategy.h b/src/strategy/generic/DebugStrategy.h index ae69bd3f2c..95118f7373 100644 --- a/src/strategy/generic/DebugStrategy.h +++ b/src/strategy/generic/DebugStrategy.h @@ -1,6 +1,6 @@ /* - * Copyright (C) 2016+ AzerothCore , released under GNU GPL v2 license, you may redistribute it - * and/or modify it under version 2 of the License, or (at your option), any later version. + * Copyright (C) 2016+ AzerothCore , released under GNU AGPL v3 license, you may redistribute it + * and/or modify it under version 3 of the License, or (at your option), any later version. */ #ifndef _PLAYERBOT_DEBUGSTRATEGY_H diff --git a/src/strategy/generic/DpsAssistStrategy.cpp b/src/strategy/generic/DpsAssistStrategy.cpp index 11047e2691..1997623356 100644 --- a/src/strategy/generic/DpsAssistStrategy.cpp +++ b/src/strategy/generic/DpsAssistStrategy.cpp @@ -1,6 +1,6 @@ /* - * Copyright (C) 2016+ AzerothCore , released under GNU GPL v2 license, you may redistribute it - * and/or modify it under version 2 of the License, or (at your option), any later version. + * Copyright (C) 2016+ AzerothCore , released under GNU AGPL v3 license, you may redistribute it + * and/or modify it under version 3 of the License, or (at your option), any later version. */ #include "DpsAssistStrategy.h" diff --git a/src/strategy/generic/DpsAssistStrategy.h b/src/strategy/generic/DpsAssistStrategy.h index 394a28efbf..2f97e16567 100644 --- a/src/strategy/generic/DpsAssistStrategy.h +++ b/src/strategy/generic/DpsAssistStrategy.h @@ -1,6 +1,6 @@ /* - * Copyright (C) 2016+ AzerothCore , released under GNU GPL v2 license, you may redistribute it - * and/or modify it under version 2 of the License, or (at your option), any later version. + * Copyright (C) 2016+ AzerothCore , released under GNU AGPL v3 license, you may redistribute it + * and/or modify it under version 3 of the License, or (at your option), any later version. */ #ifndef _PLAYERBOT_DPSASSISTSTRATEGY_H diff --git a/src/strategy/generic/DuelStrategy.cpp b/src/strategy/generic/DuelStrategy.cpp index cf7b836bdf..5a571e0f89 100644 --- a/src/strategy/generic/DuelStrategy.cpp +++ b/src/strategy/generic/DuelStrategy.cpp @@ -1,6 +1,6 @@ /* - * Copyright (C) 2016+ AzerothCore , released under GNU GPL v2 license, you may redistribute it - * and/or modify it under version 2 of the License, or (at your option), any later version. + * Copyright (C) 2016+ AzerothCore , released under GNU AGPL v3 license, you may redistribute it + * and/or modify it under version 3 of the License, or (at your option), any later version. */ #include "DuelStrategy.h" diff --git a/src/strategy/generic/DuelStrategy.h b/src/strategy/generic/DuelStrategy.h index db703c914c..fc08030a7b 100644 --- a/src/strategy/generic/DuelStrategy.h +++ b/src/strategy/generic/DuelStrategy.h @@ -1,6 +1,6 @@ /* - * Copyright (C) 2016+ AzerothCore , released under GNU GPL v2 license, you may redistribute it - * and/or modify it under version 2 of the License, or (at your option), any later version. + * Copyright (C) 2016+ AzerothCore , released under GNU AGPL v3 license, you may redistribute it + * and/or modify it under version 3 of the License, or (at your option), any later version. */ #ifndef _PLAYERBOT_DUELSTRATEGY_H diff --git a/src/strategy/generic/EmoteStrategy.cpp b/src/strategy/generic/EmoteStrategy.cpp index f2c67f756a..8e38a4b7d7 100644 --- a/src/strategy/generic/EmoteStrategy.cpp +++ b/src/strategy/generic/EmoteStrategy.cpp @@ -1,6 +1,6 @@ /* - * Copyright (C) 2016+ AzerothCore , released under GNU GPL v2 license, you may redistribute it - * and/or modify it under version 2 of the License, or (at your option), any later version. + * Copyright (C) 2016+ AzerothCore , released under GNU AGPL v3 license, you may redistribute it + * and/or modify it under version 3 of the License, or (at your option), any later version. */ #include "EmoteStrategy.h" diff --git a/src/strategy/generic/EmoteStrategy.h b/src/strategy/generic/EmoteStrategy.h index 9f4fdd9843..4f1f5efa48 100644 --- a/src/strategy/generic/EmoteStrategy.h +++ b/src/strategy/generic/EmoteStrategy.h @@ -1,6 +1,6 @@ /* - * Copyright (C) 2016+ AzerothCore , released under GNU GPL v2 license, you may redistribute it - * and/or modify it under version 2 of the License, or (at your option), any later version. + * Copyright (C) 2016+ AzerothCore , released under GNU AGPL v3 license, you may redistribute it + * and/or modify it under version 3 of the License, or (at your option), any later version. */ #ifndef _PLAYERBOT_EMOTESTRATEGY_H diff --git a/src/strategy/generic/FleeStrategy.cpp b/src/strategy/generic/FleeStrategy.cpp index 36d499885a..a2eeb9ba29 100644 --- a/src/strategy/generic/FleeStrategy.cpp +++ b/src/strategy/generic/FleeStrategy.cpp @@ -1,6 +1,6 @@ /* - * Copyright (C) 2016+ AzerothCore , released under GNU GPL v2 license, you may redistribute it - * and/or modify it under version 2 of the License, or (at your option), any later version. + * Copyright (C) 2016+ AzerothCore , released under GNU AGPL v3 license, you may redistribute it + * and/or modify it under version 3 of the License, or (at your option), any later version. */ #include "FleeStrategy.h" diff --git a/src/strategy/generic/FleeStrategy.h b/src/strategy/generic/FleeStrategy.h index 793e79b000..315719840f 100644 --- a/src/strategy/generic/FleeStrategy.h +++ b/src/strategy/generic/FleeStrategy.h @@ -1,6 +1,6 @@ /* - * Copyright (C) 2016+ AzerothCore , released under GNU GPL v2 license, you may redistribute it - * and/or modify it under version 2 of the License, or (at your option), any later version. + * Copyright (C) 2016+ AzerothCore , released under GNU AGPL v3 license, you may redistribute it + * and/or modify it under version 3 of the License, or (at your option), any later version. */ #ifndef _PLAYERBOT_FLEESTRATEGY_H diff --git a/src/strategy/generic/FollowMasterStrategy.cpp b/src/strategy/generic/FollowMasterStrategy.cpp index 4e5984f0c5..771bcffb39 100644 --- a/src/strategy/generic/FollowMasterStrategy.cpp +++ b/src/strategy/generic/FollowMasterStrategy.cpp @@ -1,6 +1,6 @@ /* - * Copyright (C) 2016+ AzerothCore , released under GNU GPL v2 license, you may redistribute it - * and/or modify it under version 2 of the License, or (at your option), any later version. + * Copyright (C) 2016+ AzerothCore , released under GNU AGPL v3 license, you may redistribute it + * and/or modify it under version 3 of the License, or (at your option), any later version. */ #include "FollowMasterStrategy.h" diff --git a/src/strategy/generic/FollowMasterStrategy.h b/src/strategy/generic/FollowMasterStrategy.h index ef31c53787..d751741eb1 100644 --- a/src/strategy/generic/FollowMasterStrategy.h +++ b/src/strategy/generic/FollowMasterStrategy.h @@ -1,6 +1,6 @@ /* - * Copyright (C) 2016+ AzerothCore , released under GNU GPL v2 license, you may redistribute it - * and/or modify it under version 2 of the License, or (at your option), any later version. + * Copyright (C) 2016+ AzerothCore , released under GNU AGPL v3 license, you may redistribute it + * and/or modify it under version 3 of the License, or (at your option), any later version. */ #ifndef _PLAYERBOT_FOLLOWMASTERSTRATEGY_H diff --git a/src/strategy/generic/GrindingStrategy.cpp b/src/strategy/generic/GrindingStrategy.cpp index e20b7fbee0..62237fa481 100644 --- a/src/strategy/generic/GrindingStrategy.cpp +++ b/src/strategy/generic/GrindingStrategy.cpp @@ -1,6 +1,6 @@ /* - * Copyright (C) 2016+ AzerothCore , released under GNU GPL v2 license, you may redistribute it - * and/or modify it under version 2 of the License, or (at your option), any later version. + * Copyright (C) 2016+ AzerothCore , released under GNU AGPL v3 license, you may redistribute it + * and/or modify it under version 3 of the License, or (at your option), any later version. */ #include "GrindingStrategy.h" diff --git a/src/strategy/generic/GrindingStrategy.h b/src/strategy/generic/GrindingStrategy.h index d04060c4c9..5ce9c4f73b 100644 --- a/src/strategy/generic/GrindingStrategy.h +++ b/src/strategy/generic/GrindingStrategy.h @@ -1,6 +1,6 @@ /* - * Copyright (C) 2016+ AzerothCore , released under GNU GPL v2 license, you may redistribute it - * and/or modify it under version 2 of the License, or (at your option), any later version. + * Copyright (C) 2016+ AzerothCore , released under GNU AGPL v3 license, you may redistribute it + * and/or modify it under version 3 of the License, or (at your option), any later version. */ #ifndef _PLAYERBOT_GRINDINGSTRATEGY_H diff --git a/src/strategy/generic/GroupStrategy.cpp b/src/strategy/generic/GroupStrategy.cpp index b17b46e190..9406e8409d 100644 --- a/src/strategy/generic/GroupStrategy.cpp +++ b/src/strategy/generic/GroupStrategy.cpp @@ -1,6 +1,6 @@ /* - * Copyright (C) 2016+ AzerothCore , released under GNU GPL v2 license, you may redistribute it - * and/or modify it under version 2 of the License, or (at your option), any later version. + * Copyright (C) 2016+ AzerothCore , released under GNU AGPL v3 license, you may redistribute it + * and/or modify it under version 3 of the License, or (at your option), any later version. */ #include "GroupStrategy.h" diff --git a/src/strategy/generic/GroupStrategy.h b/src/strategy/generic/GroupStrategy.h index 9f5fc71d73..0a2bd50868 100644 --- a/src/strategy/generic/GroupStrategy.h +++ b/src/strategy/generic/GroupStrategy.h @@ -1,6 +1,6 @@ /* - * Copyright (C) 2016+ AzerothCore , released under GNU GPL v2 license, you may redistribute it - * and/or modify it under version 2 of the License, or (at your option), any later version. + * Copyright (C) 2016+ AzerothCore , released under GNU AGPL v3 license, you may redistribute it + * and/or modify it under version 3 of the License, or (at your option), any later version. */ #ifndef _PLAYERBOT_GROUPSTRATEGY_H diff --git a/src/strategy/generic/GuardStrategy.cpp b/src/strategy/generic/GuardStrategy.cpp index 7022c96a5f..68ce2d00d9 100644 --- a/src/strategy/generic/GuardStrategy.cpp +++ b/src/strategy/generic/GuardStrategy.cpp @@ -1,6 +1,6 @@ /* - * Copyright (C) 2016+ AzerothCore , released under GNU GPL v2 license, you may redistribute it - * and/or modify it under version 2 of the License, or (at your option), any later version. + * Copyright (C) 2016+ AzerothCore , released under GNU AGPL v3 license, you may redistribute it + * and/or modify it under version 3 of the License, or (at your option), any later version. */ #include "GuardStrategy.h" diff --git a/src/strategy/generic/GuardStrategy.h b/src/strategy/generic/GuardStrategy.h index c6c2193899..c6902cedba 100644 --- a/src/strategy/generic/GuardStrategy.h +++ b/src/strategy/generic/GuardStrategy.h @@ -1,6 +1,6 @@ /* - * Copyright (C) 2016+ AzerothCore , released under GNU GPL v2 license, you may redistribute it - * and/or modify it under version 2 of the License, or (at your option), any later version. + * Copyright (C) 2016+ AzerothCore , released under GNU AGPL v3 license, you may redistribute it + * and/or modify it under version 3 of the License, or (at your option), any later version. */ #ifndef _PLAYERBOT_GUARDSTRATEGY_H diff --git a/src/strategy/generic/GuildStrategy.cpp b/src/strategy/generic/GuildStrategy.cpp index f2249db57a..3a5df2f168 100644 --- a/src/strategy/generic/GuildStrategy.cpp +++ b/src/strategy/generic/GuildStrategy.cpp @@ -1,6 +1,6 @@ /* - * Copyright (C) 2016+ AzerothCore , released under GNU GPL v2 license, you may redistribute it - * and/or modify it under version 2 of the License, or (at your option), any later version. + * Copyright (C) 2016+ AzerothCore , released under GNU AGPL v3 license, you may redistribute it + * and/or modify it under version 3 of the License, or (at your option), any later version. */ #include "GuildStrategy.h" diff --git a/src/strategy/generic/GuildStrategy.h b/src/strategy/generic/GuildStrategy.h index 2a06ca2e7e..1e46bf9b01 100644 --- a/src/strategy/generic/GuildStrategy.h +++ b/src/strategy/generic/GuildStrategy.h @@ -1,6 +1,6 @@ /* - * Copyright (C) 2016+ AzerothCore , released under GNU GPL v2 license, you may redistribute it - * and/or modify it under version 2 of the License, or (at your option), any later version. + * Copyright (C) 2016+ AzerothCore , released under GNU AGPL v3 license, you may redistribute it + * and/or modify it under version 3 of the License, or (at your option), any later version. */ #ifndef _PLAYERBOT_GUILDSTRATEGY_H diff --git a/src/strategy/generic/KiteStrategy.cpp b/src/strategy/generic/KiteStrategy.cpp index a369baa03b..011650df83 100644 --- a/src/strategy/generic/KiteStrategy.cpp +++ b/src/strategy/generic/KiteStrategy.cpp @@ -1,6 +1,6 @@ /* - * Copyright (C) 2016+ AzerothCore , released under GNU GPL v2 license, you may redistribute it - * and/or modify it under version 2 of the License, or (at your option), any later version. + * Copyright (C) 2016+ AzerothCore , released under GNU AGPL v3 license, you may redistribute it + * and/or modify it under version 3 of the License, or (at your option), any later version. */ #include "KiteStrategy.h" diff --git a/src/strategy/generic/KiteStrategy.h b/src/strategy/generic/KiteStrategy.h index c8eb226b36..4e77774c64 100644 --- a/src/strategy/generic/KiteStrategy.h +++ b/src/strategy/generic/KiteStrategy.h @@ -1,6 +1,6 @@ /* - * Copyright (C) 2016+ AzerothCore , released under GNU GPL v2 license, you may redistribute it - * and/or modify it under version 2 of the License, or (at your option), any later version. + * Copyright (C) 2016+ AzerothCore , released under GNU AGPL v3 license, you may redistribute it + * and/or modify it under version 3 of the License, or (at your option), any later version. */ #ifndef _PLAYERBOT_KITESTRATEGY_H diff --git a/src/strategy/generic/LfgStrategy.cpp b/src/strategy/generic/LfgStrategy.cpp index 59f95f4d7f..1607d8e5c4 100644 --- a/src/strategy/generic/LfgStrategy.cpp +++ b/src/strategy/generic/LfgStrategy.cpp @@ -1,6 +1,6 @@ /* - * Copyright (C) 2016+ AzerothCore , released under GNU GPL v2 license, you may redistribute it - * and/or modify it under version 2 of the License, or (at your option), any later version. + * Copyright (C) 2016+ AzerothCore , released under GNU AGPL v3 license, you may redistribute it + * and/or modify it under version 3 of the License, or (at your option), any later version. */ #include "LfgStrategy.h" diff --git a/src/strategy/generic/LfgStrategy.h b/src/strategy/generic/LfgStrategy.h index 88324234d6..6626725b52 100644 --- a/src/strategy/generic/LfgStrategy.h +++ b/src/strategy/generic/LfgStrategy.h @@ -1,6 +1,6 @@ /* - * Copyright (C) 2016+ AzerothCore , released under GNU GPL v2 license, you may redistribute it - * and/or modify it under version 2 of the License, or (at your option), any later version. + * Copyright (C) 2016+ AzerothCore , released under GNU AGPL v3 license, you may redistribute it + * and/or modify it under version 3 of the License, or (at your option), any later version. */ #ifndef _PLAYERBOT_LFGSTRATEGY_H diff --git a/src/strategy/generic/LootNonCombatStrategy.cpp b/src/strategy/generic/LootNonCombatStrategy.cpp index 89fb6b5d57..324243a17d 100644 --- a/src/strategy/generic/LootNonCombatStrategy.cpp +++ b/src/strategy/generic/LootNonCombatStrategy.cpp @@ -1,6 +1,6 @@ /* - * Copyright (C) 2016+ AzerothCore , released under GNU GPL v2 license, you may redistribute it - * and/or modify it under version 2 of the License, or (at your option), any later version. + * Copyright (C) 2016+ AzerothCore , released under GNU AGPL v3 license, you may redistribute it + * and/or modify it under version 3 of the License, or (at your option), any later version. */ #include "LootNonCombatStrategy.h" diff --git a/src/strategy/generic/LootNonCombatStrategy.h b/src/strategy/generic/LootNonCombatStrategy.h index e9b59e97d5..2de1d77648 100644 --- a/src/strategy/generic/LootNonCombatStrategy.h +++ b/src/strategy/generic/LootNonCombatStrategy.h @@ -1,6 +1,6 @@ /* - * Copyright (C) 2016+ AzerothCore , released under GNU GPL v2 license, you may redistribute it - * and/or modify it under version 2 of the License, or (at your option), any later version. + * Copyright (C) 2016+ AzerothCore , released under GNU AGPL v3 license, you may redistribute it + * and/or modify it under version 3 of the License, or (at your option), any later version. */ #ifndef _PLAYERBOT_LOOTNONCOMBATSTRATEGY_H diff --git a/src/strategy/generic/MaintenanceStrategy.cpp b/src/strategy/generic/MaintenanceStrategy.cpp index b2e32c0dec..3e35f5bfff 100644 --- a/src/strategy/generic/MaintenanceStrategy.cpp +++ b/src/strategy/generic/MaintenanceStrategy.cpp @@ -1,6 +1,6 @@ /* - * Copyright (C) 2016+ AzerothCore , released under GNU GPL v2 license, you may redistribute it - * and/or modify it under version 2 of the License, or (at your option), any later version. + * Copyright (C) 2016+ AzerothCore , released under GNU AGPL v3 license, you may redistribute it + * and/or modify it under version 3 of the License, or (at your option), any later version. */ #include "MaintenanceStrategy.h" diff --git a/src/strategy/generic/MaintenanceStrategy.h b/src/strategy/generic/MaintenanceStrategy.h index a879e3faa9..5a7025bee8 100644 --- a/src/strategy/generic/MaintenanceStrategy.h +++ b/src/strategy/generic/MaintenanceStrategy.h @@ -1,6 +1,6 @@ /* - * Copyright (C) 2016+ AzerothCore , released under GNU GPL v2 license, you may redistribute it - * and/or modify it under version 2 of the License, or (at your option), any later version. + * Copyright (C) 2016+ AzerothCore , released under GNU AGPL v3 license, you may redistribute it + * and/or modify it under version 3 of the License, or (at your option), any later version. */ #ifndef _PLAYERBOT_MAINTANCESTRATEGY_H diff --git a/src/strategy/generic/MarkRtiStrategy.cpp b/src/strategy/generic/MarkRtiStrategy.cpp index dea739ced5..bf5fb8de9f 100644 --- a/src/strategy/generic/MarkRtiStrategy.cpp +++ b/src/strategy/generic/MarkRtiStrategy.cpp @@ -1,6 +1,6 @@ /* - * Copyright (C) 2016+ AzerothCore , released under GNU GPL v2 license, you may redistribute it - * and/or modify it under version 2 of the License, or (at your option), any later version. + * Copyright (C) 2016+ AzerothCore , released under GNU AGPL v3 license, you may redistribute it + * and/or modify it under version 3 of the License, or (at your option), any later version. */ #include "MarkRtiStrategy.h" diff --git a/src/strategy/generic/MarkRtiStrategy.h b/src/strategy/generic/MarkRtiStrategy.h index dbb2c49554..734f3d8e66 100644 --- a/src/strategy/generic/MarkRtiStrategy.h +++ b/src/strategy/generic/MarkRtiStrategy.h @@ -1,6 +1,6 @@ /* - * Copyright (C) 2016+ AzerothCore , released under GNU GPL v2 license, you may redistribute it - * and/or modify it under version 2 of the License, or (at your option), any later version. + * Copyright (C) 2016+ AzerothCore , released under GNU AGPL v3 license, you may redistribute it + * and/or modify it under version 3 of the License, or (at your option), any later version. */ #ifndef _PLAYERBOT_MARKRTISTRATEGY_H diff --git a/src/strategy/generic/MeleeCombatStrategy.cpp b/src/strategy/generic/MeleeCombatStrategy.cpp index 67a5f1dbbe..de3ba39a0d 100644 --- a/src/strategy/generic/MeleeCombatStrategy.cpp +++ b/src/strategy/generic/MeleeCombatStrategy.cpp @@ -1,6 +1,6 @@ /* - * Copyright (C) 2016+ AzerothCore , released under GNU GPL v2 license, you may redistribute it - * and/or modify it under version 2 of the License, or (at your option), any later version. + * Copyright (C) 2016+ AzerothCore , released under GNU AGPL v3 license, you may redistribute it + * and/or modify it under version 3 of the License, or (at your option), any later version. */ #include "MeleeCombatStrategy.h" diff --git a/src/strategy/generic/MeleeCombatStrategy.h b/src/strategy/generic/MeleeCombatStrategy.h index c5adc269fd..9cad2bb3e6 100644 --- a/src/strategy/generic/MeleeCombatStrategy.h +++ b/src/strategy/generic/MeleeCombatStrategy.h @@ -1,6 +1,6 @@ /* - * Copyright (C) 2016+ AzerothCore , released under GNU GPL v2 license, you may redistribute it - * and/or modify it under version 2 of the License, or (at your option), any later version. + * Copyright (C) 2016+ AzerothCore , released under GNU AGPL v3 license, you may redistribute it + * and/or modify it under version 3 of the License, or (at your option), any later version. */ #ifndef _PLAYERBOT_MELEECOMBATSTRATEGY_H diff --git a/src/strategy/generic/MoveFromGroupStrategy.cpp b/src/strategy/generic/MoveFromGroupStrategy.cpp index 5d08451033..3ceccce249 100644 --- a/src/strategy/generic/MoveFromGroupStrategy.cpp +++ b/src/strategy/generic/MoveFromGroupStrategy.cpp @@ -1,6 +1,6 @@ /* - * Copyright (C) 2016+ AzerothCore , released under GNU GPL v2 license, you may redistribute it - * and/or modify it under version 2 of the License, or (at your option), any later version. + * Copyright (C) 2016+ AzerothCore , released under GNU AGPL v3 license, you may redistribute it + * and/or modify it under version 3 of the License, or (at your option), any later version. */ #include "MoveFromGroupStrategy.h" diff --git a/src/strategy/generic/MoveFromGroupStrategy.h b/src/strategy/generic/MoveFromGroupStrategy.h index a28c61b9b8..3fb17f37f9 100644 --- a/src/strategy/generic/MoveFromGroupStrategy.h +++ b/src/strategy/generic/MoveFromGroupStrategy.h @@ -1,6 +1,6 @@ /* - * Copyright (C) 2016+ AzerothCore , released under GNU GPL v2 license, you may redistribute it - * and/or modify it under version 2 of the License, or (at your option), any later version. + * Copyright (C) 2016+ AzerothCore , released under GNU AGPL v3 license, you may redistribute it + * and/or modify it under version 3 of the License, or (at your option), any later version. */ #ifndef _PLAYERBOT_MOVEFROMGROUPSTRATEGY_H diff --git a/src/strategy/generic/NonCombatStrategy.cpp b/src/strategy/generic/NonCombatStrategy.cpp index 52e37bd409..7363f8c66a 100644 --- a/src/strategy/generic/NonCombatStrategy.cpp +++ b/src/strategy/generic/NonCombatStrategy.cpp @@ -1,6 +1,6 @@ /* - * Copyright (C) 2016+ AzerothCore , released under GNU GPL v2 license, you may redistribute it - * and/or modify it under version 2 of the License, or (at your option), any later version. + * Copyright (C) 2016+ AzerothCore , released under GNU AGPL v3 license, you may redistribute it + * and/or modify it under version 3 of the License, or (at your option), any later version. */ #include "NonCombatStrategy.h" diff --git a/src/strategy/generic/NonCombatStrategy.h b/src/strategy/generic/NonCombatStrategy.h index c6f266d101..ca4d3fd2c6 100644 --- a/src/strategy/generic/NonCombatStrategy.h +++ b/src/strategy/generic/NonCombatStrategy.h @@ -1,6 +1,6 @@ /* - * Copyright (C) 2016+ AzerothCore , released under GNU GPL v2 license, you may redistribute it - * and/or modify it under version 2 of the License, or (at your option), any later version. + * Copyright (C) 2016+ AzerothCore , released under GNU AGPL v3 license, you may redistribute it + * and/or modify it under version 3 of the License, or (at your option), any later version. */ #ifndef _PLAYERBOT_NONCOMBATSTRATEGY_H diff --git a/src/strategy/generic/PassTroughStrategy.cpp b/src/strategy/generic/PassTroughStrategy.cpp index d66af02460..e9365bad20 100644 --- a/src/strategy/generic/PassTroughStrategy.cpp +++ b/src/strategy/generic/PassTroughStrategy.cpp @@ -1,6 +1,6 @@ /* - * Copyright (C) 2016+ AzerothCore , released under GNU GPL v2 license, you may redistribute it - * and/or modify it under version 2 of the License, or (at your option), any later version. + * Copyright (C) 2016+ AzerothCore , released under GNU AGPL v3 license, you may redistribute it + * and/or modify it under version 3 of the License, or (at your option), any later version. */ #include "PassTroughStrategy.h" diff --git a/src/strategy/generic/PassTroughStrategy.h b/src/strategy/generic/PassTroughStrategy.h index b5784fd7f0..b3f897e2c3 100644 --- a/src/strategy/generic/PassTroughStrategy.h +++ b/src/strategy/generic/PassTroughStrategy.h @@ -1,6 +1,6 @@ /* - * Copyright (C) 2016+ AzerothCore , released under GNU GPL v2 license, you may redistribute it - * and/or modify it under version 2 of the License, or (at your option), any later version. + * Copyright (C) 2016+ AzerothCore , released under GNU AGPL v3 license, you may redistribute it + * and/or modify it under version 3 of the License, or (at your option), any later version. */ #ifndef _PLAYERBOT_PASSTHROUGHSTRATEGY_H diff --git a/src/strategy/generic/PassiveStrategy.cpp b/src/strategy/generic/PassiveStrategy.cpp index d716c0ddb9..700b9e6770 100644 --- a/src/strategy/generic/PassiveStrategy.cpp +++ b/src/strategy/generic/PassiveStrategy.cpp @@ -1,6 +1,6 @@ /* - * Copyright (C) 2016+ AzerothCore , released under GNU GPL v2 license, you may redistribute it - * and/or modify it under version 2 of the License, or (at your option), any later version. + * Copyright (C) 2016+ AzerothCore , released under GNU AGPL v3 license, you may redistribute it + * and/or modify it under version 3 of the License, or (at your option), any later version. */ #include "PassiveStrategy.h" diff --git a/src/strategy/generic/PassiveStrategy.h b/src/strategy/generic/PassiveStrategy.h index 86bbef9723..097ecd0a00 100644 --- a/src/strategy/generic/PassiveStrategy.h +++ b/src/strategy/generic/PassiveStrategy.h @@ -1,6 +1,6 @@ /* - * Copyright (C) 2016+ AzerothCore , released under GNU GPL v2 license, you may redistribute it - * and/or modify it under version 2 of the License, or (at your option), any later version. + * Copyright (C) 2016+ AzerothCore , released under GNU AGPL v3 license, you may redistribute it + * and/or modify it under version 3 of the License, or (at your option), any later version. */ #ifndef _PLAYERBOT_PASSIVESTRATEGY_H diff --git a/src/strategy/generic/PullStrategy.cpp b/src/strategy/generic/PullStrategy.cpp index 557ac729ec..70111ef80f 100644 --- a/src/strategy/generic/PullStrategy.cpp +++ b/src/strategy/generic/PullStrategy.cpp @@ -1,6 +1,6 @@ /* - * Copyright (C) 2016+ AzerothCore , released under GNU GPL v2 license, you may redistribute it - * and/or modify it under version 2 of the License, or (at your option), any later version. + * Copyright (C) 2016+ AzerothCore , released under GNU AGPL v3 license, you may redistribute it + * and/or modify it under version 3 of the License, or (at your option), any later version. */ #include "PullStrategy.h" diff --git a/src/strategy/generic/PullStrategy.h b/src/strategy/generic/PullStrategy.h index f8489d3d67..354760df50 100644 --- a/src/strategy/generic/PullStrategy.h +++ b/src/strategy/generic/PullStrategy.h @@ -1,6 +1,6 @@ /* - * Copyright (C) 2016+ AzerothCore , released under GNU GPL v2 license, you may redistribute it - * and/or modify it under version 2 of the License, or (at your option), any later version. + * Copyright (C) 2016+ AzerothCore , released under GNU AGPL v3 license, you may redistribute it + * and/or modify it under version 3 of the License, or (at your option), any later version. */ #ifndef _PLAYERBOT_PULLSTRATEGY_H diff --git a/src/strategy/generic/QuestStrategies.cpp b/src/strategy/generic/QuestStrategies.cpp index 53a1eabf64..bdc1e9b71c 100644 --- a/src/strategy/generic/QuestStrategies.cpp +++ b/src/strategy/generic/QuestStrategies.cpp @@ -1,6 +1,6 @@ /* - * Copyright (C) 2016+ AzerothCore , released under GNU GPL v2 license, you may redistribute it - * and/or modify it under version 2 of the License, or (at your option), any later version. + * Copyright (C) 2016+ AzerothCore , released under GNU AGPL v3 license, you may redistribute it + * and/or modify it under version 3 of the License, or (at your option), any later version. */ #include "QuestStrategies.h" diff --git a/src/strategy/generic/QuestStrategies.h b/src/strategy/generic/QuestStrategies.h index 55a36e24d2..232d19428b 100644 --- a/src/strategy/generic/QuestStrategies.h +++ b/src/strategy/generic/QuestStrategies.h @@ -1,6 +1,6 @@ /* - * Copyright (C) 2016+ AzerothCore , released under GNU GPL v2 license, you may redistribute it - * and/or modify it under version 2 of the License, or (at your option), any later version. + * Copyright (C) 2016+ AzerothCore , released under GNU AGPL v3 license, you may redistribute it + * and/or modify it under version 3 of the License, or (at your option), any later version. */ #ifndef _PLAYERBOT_QUESTSTRATEGIES_H diff --git a/src/strategy/generic/RTSCStrategy.cpp b/src/strategy/generic/RTSCStrategy.cpp index 820a837b6f..2c64092e3c 100644 --- a/src/strategy/generic/RTSCStrategy.cpp +++ b/src/strategy/generic/RTSCStrategy.cpp @@ -1,6 +1,6 @@ /* - * Copyright (C) 2016+ AzerothCore , released under GNU GPL v2 license, you may redistribute it - * and/or modify it under version 2 of the License, or (at your option), any later version. + * Copyright (C) 2016+ AzerothCore , released under GNU AGPL v3 license, you may redistribute it + * and/or modify it under version 3 of the License, or (at your option), any later version. */ #include "RTSCStrategy.h" diff --git a/src/strategy/generic/RTSCStrategy.h b/src/strategy/generic/RTSCStrategy.h index 46465fd8ae..c61aee2a9f 100644 --- a/src/strategy/generic/RTSCStrategy.h +++ b/src/strategy/generic/RTSCStrategy.h @@ -1,6 +1,6 @@ /* - * Copyright (C) 2016+ AzerothCore , released under GNU GPL v2 license, you may redistribute it - * and/or modify it under version 2 of the License, or (at your option), any later version. + * Copyright (C) 2016+ AzerothCore , released under GNU AGPL v3 license, you may redistribute it + * and/or modify it under version 3 of the License, or (at your option), any later version. */ #ifndef _PLAYERBOT_RTSCSTRATEGY_H diff --git a/src/strategy/generic/RacialsStrategy.cpp b/src/strategy/generic/RacialsStrategy.cpp index 033474d250..53f40ef8c7 100644 --- a/src/strategy/generic/RacialsStrategy.cpp +++ b/src/strategy/generic/RacialsStrategy.cpp @@ -1,6 +1,6 @@ /* - * Copyright (C) 2016+ AzerothCore , released under GNU GPL v2 license, you may redistribute it - * and/or modify it under version 2 of the License, or (at your option), any later version. + * Copyright (C) 2016+ AzerothCore , released under GNU AGPL v3 license, you may redistribute it + * and/or modify it under version 3 of the License, or (at your option), any later version. */ #include "RacialsStrategy.h" diff --git a/src/strategy/generic/RacialsStrategy.h b/src/strategy/generic/RacialsStrategy.h index ca42f3acd2..1837890f58 100644 --- a/src/strategy/generic/RacialsStrategy.h +++ b/src/strategy/generic/RacialsStrategy.h @@ -1,6 +1,6 @@ /* - * Copyright (C) 2016+ AzerothCore , released under GNU GPL v2 license, you may redistribute it - * and/or modify it under version 2 of the License, or (at your option), any later version. + * Copyright (C) 2016+ AzerothCore , released under GNU AGPL v3 license, you may redistribute it + * and/or modify it under version 3 of the License, or (at your option), any later version. */ #ifndef _PLAYERBOT_RACIALSSTRATEGY_H diff --git a/src/strategy/generic/RangedCombatStrategy.cpp b/src/strategy/generic/RangedCombatStrategy.cpp index 09ec3a10c2..ec0f3fb30d 100644 --- a/src/strategy/generic/RangedCombatStrategy.cpp +++ b/src/strategy/generic/RangedCombatStrategy.cpp @@ -1,6 +1,6 @@ /* - * Copyright (C) 2016+ AzerothCore , released under GNU GPL v2 license, you may redistribute it - * and/or modify it under version 2 of the License, or (at your option), any later version. + * Copyright (C) 2016+ AzerothCore , released under GNU AGPL v3 license, you may redistribute it + * and/or modify it under version 3 of the License, or (at your option), any later version. */ #include "RangedCombatStrategy.h" diff --git a/src/strategy/generic/RangedCombatStrategy.h b/src/strategy/generic/RangedCombatStrategy.h index 04d9150f78..cb5adad7a9 100644 --- a/src/strategy/generic/RangedCombatStrategy.h +++ b/src/strategy/generic/RangedCombatStrategy.h @@ -1,6 +1,6 @@ /* - * Copyright (C) 2016+ AzerothCore , released under GNU GPL v2 license, you may redistribute it - * and/or modify it under version 2 of the License, or (at your option), any later version. + * Copyright (C) 2016+ AzerothCore , released under GNU AGPL v3 license, you may redistribute it + * and/or modify it under version 3 of the License, or (at your option), any later version. */ #ifndef _PLAYERBOT_RANGEDCOMBATSTRATEGY_H diff --git a/src/strategy/generic/ReturnStrategy.cpp b/src/strategy/generic/ReturnStrategy.cpp index cf70a86a94..27fc7670c6 100644 --- a/src/strategy/generic/ReturnStrategy.cpp +++ b/src/strategy/generic/ReturnStrategy.cpp @@ -1,6 +1,6 @@ /* - * Copyright (C) 2016+ AzerothCore , released under GNU GPL v2 license, you may redistribute it - * and/or modify it under version 2 of the License, or (at your option), any later version. + * Copyright (C) 2016+ AzerothCore , released under GNU AGPL v3 license, you may redistribute it + * and/or modify it under version 3 of the License, or (at your option), any later version. */ #include "ReturnStrategy.h" diff --git a/src/strategy/generic/ReturnStrategy.h b/src/strategy/generic/ReturnStrategy.h index 739f0bcb57..1d260b33a4 100644 --- a/src/strategy/generic/ReturnStrategy.h +++ b/src/strategy/generic/ReturnStrategy.h @@ -1,6 +1,6 @@ /* - * Copyright (C) 2016+ AzerothCore , released under GNU GPL v2 license, you may redistribute it - * and/or modify it under version 2 of the License, or (at your option), any later version. + * Copyright (C) 2016+ AzerothCore , released under GNU AGPL v3 license, you may redistribute it + * and/or modify it under version 3 of the License, or (at your option), any later version. */ #ifndef _PLAYERBOT_RETURNSTRATEGY_H diff --git a/src/strategy/generic/RpgStrategy.cpp b/src/strategy/generic/RpgStrategy.cpp index 67e43c3862..13173fd2ec 100644 --- a/src/strategy/generic/RpgStrategy.cpp +++ b/src/strategy/generic/RpgStrategy.cpp @@ -1,6 +1,6 @@ /* - * Copyright (C) 2016+ AzerothCore , released under GNU GPL v2 license, you may redistribute it - * and/or modify it under version 2 of the License, or (at your option), any later version. + * Copyright (C) 2016+ AzerothCore , released under GNU AGPL v3 license, you may redistribute it + * and/or modify it under version 3 of the License, or (at your option), any later version. */ #include "RpgStrategy.h" diff --git a/src/strategy/generic/RpgStrategy.h b/src/strategy/generic/RpgStrategy.h index 26a054e6fe..f81a5bdff3 100644 --- a/src/strategy/generic/RpgStrategy.h +++ b/src/strategy/generic/RpgStrategy.h @@ -1,6 +1,6 @@ /* - * Copyright (C) 2016+ AzerothCore , released under GNU GPL v2 license, you may redistribute it - * and/or modify it under version 2 of the License, or (at your option), any later version. + * Copyright (C) 2016+ AzerothCore , released under GNU AGPL v3 license, you may redistribute it + * and/or modify it under version 3 of the License, or (at your option), any later version. */ #ifndef _PLAYERBOT_RPGSTRATEGY_H diff --git a/src/strategy/generic/RunawayStrategy.cpp b/src/strategy/generic/RunawayStrategy.cpp index 78db444b36..ae9cf12914 100644 --- a/src/strategy/generic/RunawayStrategy.cpp +++ b/src/strategy/generic/RunawayStrategy.cpp @@ -1,6 +1,6 @@ /* - * Copyright (C) 2016+ AzerothCore , released under GNU GPL v2 license, you may redistribute it - * and/or modify it under version 2 of the License, or (at your option), any later version. + * Copyright (C) 2016+ AzerothCore , released under GNU AGPL v3 license, you may redistribute it + * and/or modify it under version 3 of the License, or (at your option), any later version. */ #include "RunawayStrategy.h" diff --git a/src/strategy/generic/RunawayStrategy.h b/src/strategy/generic/RunawayStrategy.h index 8152af05ac..4ab802ac39 100644 --- a/src/strategy/generic/RunawayStrategy.h +++ b/src/strategy/generic/RunawayStrategy.h @@ -1,6 +1,6 @@ /* - * Copyright (C) 2016+ AzerothCore , released under GNU GPL v2 license, you may redistribute it - * and/or modify it under version 2 of the License, or (at your option), any later version. + * Copyright (C) 2016+ AzerothCore , released under GNU AGPL v3 license, you may redistribute it + * and/or modify it under version 3 of the License, or (at your option), any later version. */ #ifndef _PLAYERBOT_RUNAWAYSTRATEGY_H diff --git a/src/strategy/generic/SayStrategy.cpp b/src/strategy/generic/SayStrategy.cpp index e6c1a51f70..fe9e5f54e5 100644 --- a/src/strategy/generic/SayStrategy.cpp +++ b/src/strategy/generic/SayStrategy.cpp @@ -1,6 +1,6 @@ /* - * Copyright (C) 2016+ AzerothCore , released under GNU GPL v2 license, you may redistribute it - * and/or modify it under version 2 of the License, or (at your option), any later version. + * Copyright (C) 2016+ AzerothCore , released under GNU AGPL v3 license, you may redistribute it + * and/or modify it under version 3 of the License, or (at your option), any later version. */ #include "SayStrategy.h" diff --git a/src/strategy/generic/SayStrategy.h b/src/strategy/generic/SayStrategy.h index 63dad120c6..f83ece59c4 100644 --- a/src/strategy/generic/SayStrategy.h +++ b/src/strategy/generic/SayStrategy.h @@ -1,6 +1,6 @@ /* - * Copyright (C) 2016+ AzerothCore , released under GNU GPL v2 license, you may redistribute it - * and/or modify it under version 2 of the License, or (at your option), any later version. + * Copyright (C) 2016+ AzerothCore , released under GNU AGPL v3 license, you may redistribute it + * and/or modify it under version 3 of the License, or (at your option), any later version. */ #ifndef _PLAYERBOT_SAYSTRATEGY_H diff --git a/src/strategy/generic/StayStrategy.cpp b/src/strategy/generic/StayStrategy.cpp index b980275b59..2237cc99ea 100644 --- a/src/strategy/generic/StayStrategy.cpp +++ b/src/strategy/generic/StayStrategy.cpp @@ -1,6 +1,6 @@ /* - * Copyright (C) 2016+ AzerothCore , released under GNU GPL v2 license, you may redistribute it - * and/or modify it under version 2 of the License, or (at your option), any later version. + * Copyright (C) 2016+ AzerothCore , released under GNU AGPL v3 license, you may redistribute it + * and/or modify it under version 3 of the License, or (at your option), any later version. */ #include "StayStrategy.h" diff --git a/src/strategy/generic/StayStrategy.h b/src/strategy/generic/StayStrategy.h index 766748586f..9028551645 100644 --- a/src/strategy/generic/StayStrategy.h +++ b/src/strategy/generic/StayStrategy.h @@ -1,6 +1,6 @@ /* - * Copyright (C) 2016+ AzerothCore , released under GNU GPL v2 license, you may redistribute it - * and/or modify it under version 2 of the License, or (at your option), any later version. + * Copyright (C) 2016+ AzerothCore , released under GNU AGPL v3 license, you may redistribute it + * and/or modify it under version 3 of the License, or (at your option), any later version. */ #ifndef _PLAYERBOT_STAYSTRATEGY_H diff --git a/src/strategy/generic/TankAssistStrategy.cpp b/src/strategy/generic/TankAssistStrategy.cpp index 46ad4d96c4..60106d43ca 100644 --- a/src/strategy/generic/TankAssistStrategy.cpp +++ b/src/strategy/generic/TankAssistStrategy.cpp @@ -1,6 +1,6 @@ /* - * Copyright (C) 2016+ AzerothCore , released under GNU GPL v2 license, you may redistribute it - * and/or modify it under version 2 of the License, or (at your option), any later version. + * Copyright (C) 2016+ AzerothCore , released under GNU AGPL v3 license, you may redistribute it + * and/or modify it under version 3 of the License, or (at your option), any later version. */ #include "TankAssistStrategy.h" diff --git a/src/strategy/generic/TankAssistStrategy.h b/src/strategy/generic/TankAssistStrategy.h index 924773ad9c..8efcf0fe4f 100644 --- a/src/strategy/generic/TankAssistStrategy.h +++ b/src/strategy/generic/TankAssistStrategy.h @@ -1,6 +1,6 @@ /* - * Copyright (C) 2016+ AzerothCore , released under GNU GPL v2 license, you may redistribute it - * and/or modify it under version 2 of the License, or (at your option), any later version. + * Copyright (C) 2016+ AzerothCore , released under GNU AGPL v3 license, you may redistribute it + * and/or modify it under version 3 of the License, or (at your option), any later version. */ #ifndef _PLAYERBOT_TANKASSISTSTRATEGY_H diff --git a/src/strategy/generic/TellTargetStrategy.cpp b/src/strategy/generic/TellTargetStrategy.cpp index 522accb3c4..4410dcbf41 100644 --- a/src/strategy/generic/TellTargetStrategy.cpp +++ b/src/strategy/generic/TellTargetStrategy.cpp @@ -1,6 +1,6 @@ /* - * Copyright (C) 2016+ AzerothCore , released under GNU GPL v2 license, you may redistribute it - * and/or modify it under version 2 of the License, or (at your option), any later version. + * Copyright (C) 2016+ AzerothCore , released under GNU AGPL v3 license, you may redistribute it + * and/or modify it under version 3 of the License, or (at your option), any later version. */ #include "TellTargetStrategy.h" diff --git a/src/strategy/generic/TellTargetStrategy.h b/src/strategy/generic/TellTargetStrategy.h index b87f44f538..4b3663494e 100644 --- a/src/strategy/generic/TellTargetStrategy.h +++ b/src/strategy/generic/TellTargetStrategy.h @@ -1,6 +1,6 @@ /* - * Copyright (C) 2016+ AzerothCore , released under GNU GPL v2 license, you may redistribute it - * and/or modify it under version 2 of the License, or (at your option), any later version. + * Copyright (C) 2016+ AzerothCore , released under GNU AGPL v3 license, you may redistribute it + * and/or modify it under version 3 of the License, or (at your option), any later version. */ #ifndef _PLAYERBOT_TELLTARGETSTRATEGY_H diff --git a/src/strategy/generic/ThreatStrategy.cpp b/src/strategy/generic/ThreatStrategy.cpp index 1e73e89e6a..4509eaa0b5 100644 --- a/src/strategy/generic/ThreatStrategy.cpp +++ b/src/strategy/generic/ThreatStrategy.cpp @@ -1,6 +1,6 @@ /* - * Copyright (C) 2016+ AzerothCore , released under GNU GPL v2 license, you may redistribute it - * and/or modify it under version 2 of the License, or (at your option), any later version. + * Copyright (C) 2016+ AzerothCore , released under GNU AGPL v3 license, you may redistribute it + * and/or modify it under version 3 of the License, or (at your option), any later version. */ #include "ThreatStrategy.h" diff --git a/src/strategy/generic/ThreatStrategy.h b/src/strategy/generic/ThreatStrategy.h index 61e347d787..d1815e8165 100644 --- a/src/strategy/generic/ThreatStrategy.h +++ b/src/strategy/generic/ThreatStrategy.h @@ -1,6 +1,6 @@ /* - * Copyright (C) 2016+ AzerothCore , released under GNU GPL v2 license, you may redistribute it - * and/or modify it under version 2 of the License, or (at your option), any later version. + * Copyright (C) 2016+ AzerothCore , released under GNU AGPL v3 license, you may redistribute it + * and/or modify it under version 3 of the License, or (at your option), any later version. */ #ifndef _PLAYERBOT_THREATSTRATEGY_H diff --git a/src/strategy/generic/TravelStrategy.cpp b/src/strategy/generic/TravelStrategy.cpp index 978666eb55..2f335a466e 100644 --- a/src/strategy/generic/TravelStrategy.cpp +++ b/src/strategy/generic/TravelStrategy.cpp @@ -1,6 +1,6 @@ /* - * Copyright (C) 2016+ AzerothCore , released under GNU GPL v2 license, you may redistribute it - * and/or modify it under version 2 of the License, or (at your option), any later version. + * Copyright (C) 2016+ AzerothCore , released under GNU AGPL v3 license, you may redistribute it + * and/or modify it under version 3 of the License, or (at your option), any later version. */ #include "TravelStrategy.h" diff --git a/src/strategy/generic/TravelStrategy.h b/src/strategy/generic/TravelStrategy.h index 50782ba3ca..bc5afc0d79 100644 --- a/src/strategy/generic/TravelStrategy.h +++ b/src/strategy/generic/TravelStrategy.h @@ -1,6 +1,6 @@ /* - * Copyright (C) 2016+ AzerothCore , released under GNU GPL v2 license, you may redistribute it - * and/or modify it under version 2 of the License, or (at your option), any later version. + * Copyright (C) 2016+ AzerothCore , released under GNU AGPL v3 license, you may redistribute it + * and/or modify it under version 3 of the License, or (at your option), any later version. */ #ifndef _PLAYERBOT_TRAVELSTRATEGY_H diff --git a/src/strategy/generic/UseFoodStrategy.cpp b/src/strategy/generic/UseFoodStrategy.cpp index e7f2049dfb..f945dad70d 100644 --- a/src/strategy/generic/UseFoodStrategy.cpp +++ b/src/strategy/generic/UseFoodStrategy.cpp @@ -1,6 +1,6 @@ /* - * Copyright (C) 2016+ AzerothCore , released under GNU GPL v2 license, you may redistribute it - * and/or modify it under version 2 of the License, or (at your option), any later version. + * Copyright (C) 2016+ AzerothCore , released under GNU AGPL v3 license, you may redistribute it + * and/or modify it under version 3 of the License, or (at your option), any later version. */ #include "UseFoodStrategy.h" diff --git a/src/strategy/generic/UseFoodStrategy.h b/src/strategy/generic/UseFoodStrategy.h index 33db69e096..9eb7a94d50 100644 --- a/src/strategy/generic/UseFoodStrategy.h +++ b/src/strategy/generic/UseFoodStrategy.h @@ -1,6 +1,6 @@ /* - * Copyright (C) 2016+ AzerothCore , released under GNU GPL v2 license, you may redistribute it - * and/or modify it under version 2 of the License, or (at your option), any later version. + * Copyright (C) 2016+ AzerothCore , released under GNU AGPL v3 license, you may redistribute it + * and/or modify it under version 3 of the License, or (at your option), any later version. */ #ifndef _PLAYERBOT_USEFOODSTRATEGY_H diff --git a/src/strategy/generic/UsePotionsStrategy.cpp b/src/strategy/generic/UsePotionsStrategy.cpp index 71908a97cd..dc4bc9ad69 100644 --- a/src/strategy/generic/UsePotionsStrategy.cpp +++ b/src/strategy/generic/UsePotionsStrategy.cpp @@ -1,6 +1,6 @@ /* - * Copyright (C) 2016+ AzerothCore , released under GNU GPL v2 license, you may redistribute it - * and/or modify it under version 2 of the License, or (at your option), any later version. + * Copyright (C) 2016+ AzerothCore , released under GNU AGPL v3 license, you may redistribute it + * and/or modify it under version 3 of the License, or (at your option), any later version. */ #include "UsePotionsStrategy.h" diff --git a/src/strategy/generic/UsePotionsStrategy.h b/src/strategy/generic/UsePotionsStrategy.h index b6042cd724..36cf2dc293 100644 --- a/src/strategy/generic/UsePotionsStrategy.h +++ b/src/strategy/generic/UsePotionsStrategy.h @@ -1,6 +1,6 @@ /* - * Copyright (C) 2016+ AzerothCore , released under GNU GPL v2 license, you may redistribute it - * and/or modify it under version 2 of the License, or (at your option), any later version. + * Copyright (C) 2016+ AzerothCore , released under GNU AGPL v3 license, you may redistribute it + * and/or modify it under version 3 of the License, or (at your option), any later version. */ #ifndef _PLAYERBOT_USEPOTIONSSTRATEGY_H diff --git a/src/strategy/generic/WorldPacketHandlerStrategy.cpp b/src/strategy/generic/WorldPacketHandlerStrategy.cpp index 9fa58989ea..69b7685e2f 100644 --- a/src/strategy/generic/WorldPacketHandlerStrategy.cpp +++ b/src/strategy/generic/WorldPacketHandlerStrategy.cpp @@ -1,6 +1,6 @@ /* - * Copyright (C) 2016+ AzerothCore , released under GNU GPL v2 license, you may redistribute it - * and/or modify it under version 2 of the License, or (at your option), any later version. + * Copyright (C) 2016+ AzerothCore , released under GNU AGPL v3 license, you may redistribute it + * and/or modify it under version 3 of the License, or (at your option), any later version. */ #include "WorldPacketHandlerStrategy.h" diff --git a/src/strategy/generic/WorldPacketHandlerStrategy.h b/src/strategy/generic/WorldPacketHandlerStrategy.h index dcc131d1a6..52b6e83e37 100644 --- a/src/strategy/generic/WorldPacketHandlerStrategy.h +++ b/src/strategy/generic/WorldPacketHandlerStrategy.h @@ -1,6 +1,6 @@ /* - * Copyright (C) 2016+ AzerothCore , released under GNU GPL v2 license, you may redistribute it - * and/or modify it under version 2 of the License, or (at your option), any later version. + * Copyright (C) 2016+ AzerothCore , released under GNU AGPL v3 license, you may redistribute it + * and/or modify it under version 3 of the License, or (at your option), any later version. */ #ifndef _PLAYERBOT_WORLDPACKETHANDLERSTRATEGY_H diff --git a/src/strategy/hunter/BeastMasteryHunterStrategy.cpp b/src/strategy/hunter/BeastMasteryHunterStrategy.cpp index 44827cb79d..0b691357f2 100644 --- a/src/strategy/hunter/BeastMasteryHunterStrategy.cpp +++ b/src/strategy/hunter/BeastMasteryHunterStrategy.cpp @@ -1,6 +1,6 @@ /* - * Copyright (C) 2016+ AzerothCore , released under GNU GPL v2 license, you may redistribute it - * and/or modify it under version 2 of the License, or (at your option), any later version. + * Copyright (C) 2016+ AzerothCore , released under GNU AGPL v3 license, you may redistribute it + * and/or modify it under version 3 of the License, or (at your option), any later version. */ #include "BeastMasteryHunterStrategy.h" diff --git a/src/strategy/hunter/BeastMasteryHunterStrategy.h b/src/strategy/hunter/BeastMasteryHunterStrategy.h index 93f2615e63..561ba0247a 100644 --- a/src/strategy/hunter/BeastMasteryHunterStrategy.h +++ b/src/strategy/hunter/BeastMasteryHunterStrategy.h @@ -1,6 +1,6 @@ /* - * Copyright (C) 2016+ AzerothCore , released under GNU GPL v2 license, you may redistribute it - * and/or modify it under version 2 of the License, or (at your option), any later version. + * Copyright (C) 2016+ AzerothCore , released under GNU AGPL v3 license, you may redistribute it + * and/or modify it under version 3 of the License, or (at your option), any later version. */ #ifndef _PLAYERBOT_BEASTMASTERYHUNTERSTRATEGY_H diff --git a/src/strategy/hunter/GenericHunterNonCombatStrategy.cpp b/src/strategy/hunter/GenericHunterNonCombatStrategy.cpp index 3ffe60ebc7..e758187362 100644 --- a/src/strategy/hunter/GenericHunterNonCombatStrategy.cpp +++ b/src/strategy/hunter/GenericHunterNonCombatStrategy.cpp @@ -1,6 +1,6 @@ /* - * Copyright (C) 2016+ AzerothCore , released under GNU GPL v2 license, you may redistribute it - * and/or modify it under version 2 of the License, or (at your option), any later version. + * Copyright (C) 2016+ AzerothCore , released under GNU AGPL v3 license, you may redistribute it + * and/or modify it under version 3 of the License, or (at your option), any later version. */ #include "GenericHunterNonCombatStrategy.h" diff --git a/src/strategy/hunter/GenericHunterNonCombatStrategy.h b/src/strategy/hunter/GenericHunterNonCombatStrategy.h index 719b775642..697b1e2910 100644 --- a/src/strategy/hunter/GenericHunterNonCombatStrategy.h +++ b/src/strategy/hunter/GenericHunterNonCombatStrategy.h @@ -1,6 +1,6 @@ /* - * Copyright (C) 2016+ AzerothCore , released under GNU GPL v2 license, you may redistribute it - * and/or modify it under version 2 of the License, or (at your option), any later version. + * Copyright (C) 2016+ AzerothCore , released under GNU AGPL v3 license, you may redistribute it + * and/or modify it under version 3 of the License, or (at your option), any later version. */ #ifndef _PLAYERBOT_GENERICHUNTERNONCOMBATSTRATEGY_H diff --git a/src/strategy/hunter/GenericHunterStrategy.cpp b/src/strategy/hunter/GenericHunterStrategy.cpp index e821508397..dab3726190 100644 --- a/src/strategy/hunter/GenericHunterStrategy.cpp +++ b/src/strategy/hunter/GenericHunterStrategy.cpp @@ -1,6 +1,6 @@ /* - * Copyright (C) 2016+ AzerothCore , released under GNU GPL v2 license, you may redistribute it - * and/or modify it under version 2 of the License, or (at your option), any later version. + * Copyright (C) 2016+ AzerothCore , released under GNU AGPL v3 license, you may redistribute it + * and/or modify it under version 3 of the License, or (at your option), any later version. */ #include "GenericHunterStrategy.h" diff --git a/src/strategy/hunter/GenericHunterStrategy.h b/src/strategy/hunter/GenericHunterStrategy.h index b5fb1dbf17..0fa9ed69ab 100644 --- a/src/strategy/hunter/GenericHunterStrategy.h +++ b/src/strategy/hunter/GenericHunterStrategy.h @@ -1,6 +1,6 @@ /* - * Copyright (C) 2016+ AzerothCore , released under GNU GPL v2 license, you may redistribute it - * and/or modify it under version 2 of the License, or (at your option), any later version. + * Copyright (C) 2016+ AzerothCore , released under GNU AGPL v3 license, you may redistribute it + * and/or modify it under version 3 of the License, or (at your option), any later version. */ #ifndef _PLAYERBOT_GENERICHUNTERSTRATEGY_H diff --git a/src/strategy/hunter/HunterActions.cpp b/src/strategy/hunter/HunterActions.cpp index 90dd43523f..379cf0d595 100644 --- a/src/strategy/hunter/HunterActions.cpp +++ b/src/strategy/hunter/HunterActions.cpp @@ -1,6 +1,6 @@ /* - * Copyright (C) 2016+ AzerothCore , released under GNU GPL v2 license, you may redistribute it - * and/or modify it under version 2 of the License, or (at your option), any later version. + * Copyright (C) 2016+ AzerothCore , released under GNU AGPL v3 license, you may redistribute it + * and/or modify it under version 3 of the License, or (at your option), any later version. */ #include "HunterActions.h" diff --git a/src/strategy/hunter/HunterActions.h b/src/strategy/hunter/HunterActions.h index 752577c502..6deaabaf4e 100644 --- a/src/strategy/hunter/HunterActions.h +++ b/src/strategy/hunter/HunterActions.h @@ -1,6 +1,6 @@ /* - * Copyright (C) 2016+ AzerothCore , released under GNU GPL v2 license, you may redistribute it - * and/or modify it under version 2 of the License, or (at your option), any later version. + * Copyright (C) 2016+ AzerothCore , released under GNU AGPL v3 license, you may redistribute it + * and/or modify it under version 3 of the License, or (at your option), any later version. */ #ifndef _PLAYERBOT_HUNTERACTIONS_H diff --git a/src/strategy/hunter/HunterAiObjectContext.cpp b/src/strategy/hunter/HunterAiObjectContext.cpp index 42c5de3e59..def1e46939 100644 --- a/src/strategy/hunter/HunterAiObjectContext.cpp +++ b/src/strategy/hunter/HunterAiObjectContext.cpp @@ -1,6 +1,6 @@ /* - * Copyright (C) 2016+ AzerothCore , released under GNU GPL v2 license, you may redistribute it - * and/or modify it under version 2 of the License, or (at your option), any later version. + * Copyright (C) 2016+ AzerothCore , released under GNU AGPL v3 license, you may redistribute it + * and/or modify it under version 3 of the License, or (at your option), any later version. */ #include "HunterAiObjectContext.h" diff --git a/src/strategy/hunter/HunterAiObjectContext.h b/src/strategy/hunter/HunterAiObjectContext.h index 5acd3ba2be..27178104a5 100644 --- a/src/strategy/hunter/HunterAiObjectContext.h +++ b/src/strategy/hunter/HunterAiObjectContext.h @@ -1,6 +1,6 @@ /* - * Copyright (C) 2016+ AzerothCore , released under GNU GPL v2 license, you may redistribute it - * and/or modify it under version 2 of the License, or (at your option), any later version. + * Copyright (C) 2016+ AzerothCore , released under GNU AGPL v3 license, you may redistribute it + * and/or modify it under version 3 of the License, or (at your option), any later version. */ #ifndef _PLAYERBOT_HUNTERAIOBJECTCONTEXT_H diff --git a/src/strategy/hunter/HunterBuffStrategies.cpp b/src/strategy/hunter/HunterBuffStrategies.cpp index 25c3577d5e..94e7e7dcf6 100644 --- a/src/strategy/hunter/HunterBuffStrategies.cpp +++ b/src/strategy/hunter/HunterBuffStrategies.cpp @@ -1,6 +1,6 @@ /* - * Copyright (C) 2016+ AzerothCore , released under GNU GPL v2 license, you may redistribute it - * and/or modify it under version 2 of the License, or (at your option), any later version. + * Copyright (C) 2016+ AzerothCore , released under GNU AGPL v3 license, you may redistribute it + * and/or modify it under version 3 of the License, or (at your option), any later version. */ #include "HunterBuffStrategies.h" diff --git a/src/strategy/hunter/HunterBuffStrategies.h b/src/strategy/hunter/HunterBuffStrategies.h index 3bedd3a12b..7df8bc1bc3 100644 --- a/src/strategy/hunter/HunterBuffStrategies.h +++ b/src/strategy/hunter/HunterBuffStrategies.h @@ -1,6 +1,6 @@ /* - * Copyright (C) 2016+ AzerothCore , released under GNU GPL v2 license, you may redistribute it - * and/or modify it under version 2 of the License, or (at your option), any later version. + * Copyright (C) 2016+ AzerothCore , released under GNU AGPL v3 license, you may redistribute it + * and/or modify it under version 3 of the License, or (at your option), any later version. */ #ifndef _PLAYERBOT_HUNTERBUFFSTRATEGIES_H diff --git a/src/strategy/hunter/HunterTriggers.cpp b/src/strategy/hunter/HunterTriggers.cpp index eece2ad1c3..091b8d5f72 100644 --- a/src/strategy/hunter/HunterTriggers.cpp +++ b/src/strategy/hunter/HunterTriggers.cpp @@ -1,6 +1,6 @@ /* - * Copyright (C) 2016+ AzerothCore , released under GNU GPL v2 license, you may redistribute it - * and/or modify it under version 2 of the License, or (at your option), any later version. + * Copyright (C) 2016+ AzerothCore , released under GNU AGPL v3 license, you may redistribute it + * and/or modify it under version 3 of the License, or (at your option), any later version. */ #include "HunterTriggers.h" diff --git a/src/strategy/hunter/HunterTriggers.h b/src/strategy/hunter/HunterTriggers.h index 50a4b776d8..6bc5f3c44a 100644 --- a/src/strategy/hunter/HunterTriggers.h +++ b/src/strategy/hunter/HunterTriggers.h @@ -1,6 +1,6 @@ /* - * Copyright (C) 2016+ AzerothCore , released under GNU GPL v2 license, you may redistribute it - * and/or modify it under version 2 of the License, or (at your option), any later version. + * Copyright (C) 2016+ AzerothCore , released under GNU AGPL v3 license, you may redistribute it + * and/or modify it under version 3 of the License, or (at your option), any later version. */ #ifndef _PLAYERBOT_HUNTERTRIGGERS_H diff --git a/src/strategy/hunter/MarksmanshipHunterStrategy.cpp b/src/strategy/hunter/MarksmanshipHunterStrategy.cpp index 8d9630dd42..665de72751 100644 --- a/src/strategy/hunter/MarksmanshipHunterStrategy.cpp +++ b/src/strategy/hunter/MarksmanshipHunterStrategy.cpp @@ -1,6 +1,6 @@ /* - * Copyright (C) 2016+ AzerothCore , released under GNU GPL v2 license, you may redistribute it - * and/or modify it under version 2 of the License, or (at your option), any later version. + * Copyright (C) 2016+ AzerothCore , released under GNU AGPL v3 license, you may redistribute it + * and/or modify it under version 3 of the License, or (at your option), any later version. */ #include "MarksmanshipHunterStrategy.h" diff --git a/src/strategy/hunter/MarksmanshipHunterStrategy.h b/src/strategy/hunter/MarksmanshipHunterStrategy.h index d1041a8a26..e08de85cc6 100644 --- a/src/strategy/hunter/MarksmanshipHunterStrategy.h +++ b/src/strategy/hunter/MarksmanshipHunterStrategy.h @@ -1,6 +1,6 @@ /* - * Copyright (C) 2016+ AzerothCore , released under GNU GPL v2 license, you may redistribute it - * and/or modify it under version 2 of the License, or (at your option), any later version. + * Copyright (C) 2016+ AzerothCore , released under GNU AGPL v3 license, you may redistribute it + * and/or modify it under version 3 of the License, or (at your option), any later version. */ #ifndef _PLAYERBOT_MARKSMANSHIPHUNTERSTRATEGY_H diff --git a/src/strategy/hunter/SurvivalHunterStrategy.cpp b/src/strategy/hunter/SurvivalHunterStrategy.cpp index e121b3edc7..78908354a7 100644 --- a/src/strategy/hunter/SurvivalHunterStrategy.cpp +++ b/src/strategy/hunter/SurvivalHunterStrategy.cpp @@ -1,6 +1,6 @@ /* - * Copyright (C) 2016+ AzerothCore , released under GNU GPL v2 license, you may redistribute it - * and/or modify it under version 2 of the License, or (at your option), any later version. + * Copyright (C) 2016+ AzerothCore , released under GNU AGPL v3 license, you may redistribute it + * and/or modify it under version 3 of the License, or (at your option), any later version. */ #include "SurvivalHunterStrategy.h" diff --git a/src/strategy/hunter/SurvivalHunterStrategy.h b/src/strategy/hunter/SurvivalHunterStrategy.h index c5c69788b1..573a3e8f76 100644 --- a/src/strategy/hunter/SurvivalHunterStrategy.h +++ b/src/strategy/hunter/SurvivalHunterStrategy.h @@ -1,6 +1,6 @@ /* - * Copyright (C) 2016+ AzerothCore , released under GNU GPL v2 license, you may redistribute it - * and/or modify it under version 2 of the License, or (at your option), any later version. + * Copyright (C) 2016+ AzerothCore , released under GNU AGPL v3 license, you may redistribute it + * and/or modify it under version 3 of the License, or (at your option), any later version. */ #ifndef _PLAYERBOT_SURVIVALHUNTERSTRATEGY_H diff --git a/src/strategy/mage/ArcaneMageStrategy.cpp b/src/strategy/mage/ArcaneMageStrategy.cpp index 30c17d548f..b3cf8a6345 100644 --- a/src/strategy/mage/ArcaneMageStrategy.cpp +++ b/src/strategy/mage/ArcaneMageStrategy.cpp @@ -1,6 +1,6 @@ /* - * Copyright (C) 2016+ AzerothCore , released under GNU GPL v2 license, you may redistribute it - * and/or modify it under version 2 of the License, or (at your option), any later version. + * Copyright (C) 2016+ AzerothCore , released under GNU AGPL v3 license, you may redistribute it + * and/or modify it under version 3 of the License, or (at your option), any later version. */ #include "ArcaneMageStrategy.h" diff --git a/src/strategy/mage/ArcaneMageStrategy.h b/src/strategy/mage/ArcaneMageStrategy.h index f6adf23ff8..c32f966f04 100644 --- a/src/strategy/mage/ArcaneMageStrategy.h +++ b/src/strategy/mage/ArcaneMageStrategy.h @@ -1,6 +1,6 @@ /* - * Copyright (C) 2016+ AzerothCore , released under GNU GPL v2 license, you may redistribute it - * and/or modify it under version 2 of the License, or (at your option), any later version. + * Copyright (C) 2016+ AzerothCore , released under GNU AGPL v3 license, you may redistribute it + * and/or modify it under version 3 of the License, or (at your option), any later version. */ #ifndef _PLAYERBOT_ARCANEMAGESTRATEGY_H diff --git a/src/strategy/mage/FireMageStrategy.cpp b/src/strategy/mage/FireMageStrategy.cpp index f87fe88275..95cc6955a9 100644 --- a/src/strategy/mage/FireMageStrategy.cpp +++ b/src/strategy/mage/FireMageStrategy.cpp @@ -1,6 +1,6 @@ /* - * Copyright (C) 2016+ AzerothCore , released under GNU GPL v2 license, you may redistribute it - * and/or modify it under version 2 of the License, or (at your option), any later version. + * Copyright (C) 2016+ AzerothCore , released under GNU AGPL v3 license, you may redistribute it + * and/or modify it under version 3 of the License, or (at your option), any later version. */ #include "FireMageStrategy.h" diff --git a/src/strategy/mage/FireMageStrategy.h b/src/strategy/mage/FireMageStrategy.h index 4574a34573..5a5e1fa0db 100644 --- a/src/strategy/mage/FireMageStrategy.h +++ b/src/strategy/mage/FireMageStrategy.h @@ -1,6 +1,6 @@ /* - * Copyright (C) 2016+ AzerothCore , released under GNU GPL v2 license, you may redistribute it - * and/or modify it under version 2 of the License, or (at your option), any later version. + * Copyright (C) 2016+ AzerothCore , released under GNU AGPL v3 license, you may redistribute it + * and/or modify it under version 3 of the License, or (at your option), any later version. */ #ifndef _PLAYERBOT_FIREMAGESTRATEGY_H diff --git a/src/strategy/mage/FrostFireMageStrategy.cpp b/src/strategy/mage/FrostFireMageStrategy.cpp index 4af7a86921..0d6e1fec49 100644 --- a/src/strategy/mage/FrostFireMageStrategy.cpp +++ b/src/strategy/mage/FrostFireMageStrategy.cpp @@ -1,6 +1,6 @@ /* - * Copyright (C) 2016+ AzerothCore , released under GNU GPL v2 license, you may redistribute it - * and/or modify it under version 2 of the License, or (at your option), any later version. + * Copyright (C) 2016+ AzerothCore , released under GNU AGPL v3 license, you may redistribute it + * and/or modify it under version 3 of the License, or (at your option), any later version. */ #include "FrostFireMageStrategy.h" diff --git a/src/strategy/mage/FrostFireMageStrategy.h b/src/strategy/mage/FrostFireMageStrategy.h index 0db6f934e0..8d3a396314 100644 --- a/src/strategy/mage/FrostFireMageStrategy.h +++ b/src/strategy/mage/FrostFireMageStrategy.h @@ -1,6 +1,6 @@ /* - * Copyright (C) 2016+ AzerothCore , released under GNU GPL v2 license, you may redistribute it - * and/or modify it under version 2 of the License, or (at your option), any later version. + * Copyright (C) 2016+ AzerothCore , released under GNU AGPL v3 license, you may redistribute it + * and/or modify it under version 3 of the License, or (at your option), any later version. */ #ifndef _PLAYERBOT_FROSTFIREMAGESTRATEGY_H diff --git a/src/strategy/mage/FrostMageStrategy.cpp b/src/strategy/mage/FrostMageStrategy.cpp index 7614de4e36..369fc1c885 100644 --- a/src/strategy/mage/FrostMageStrategy.cpp +++ b/src/strategy/mage/FrostMageStrategy.cpp @@ -1,6 +1,6 @@ /* - * Copyright (C) 2016+ AzerothCore , released under GNU GPL v2 license, you may redistribute it - * and/or modify it under version 2 of the License, or (at your option), any later version. + * Copyright (C) 2016+ AzerothCore , released under GNU AGPL v3 license, you may redistribute it + * and/or modify it under version 3 of the License, or (at your option), any later version. */ #include "FrostMageStrategy.h" diff --git a/src/strategy/mage/FrostMageStrategy.h b/src/strategy/mage/FrostMageStrategy.h index d54c04d305..d0b3b37280 100644 --- a/src/strategy/mage/FrostMageStrategy.h +++ b/src/strategy/mage/FrostMageStrategy.h @@ -1,6 +1,6 @@ /* - * Copyright (C) 2016+ AzerothCore , released under GNU GPL v2 license, you may redistribute it - * and/or modify it under version 2 of the License, or (at your option), any later version. + * Copyright (C) 2016+ AzerothCore , released under GNU AGPL v3 license, you may redistribute it + * and/or modify it under version 3 of the License, or (at your option), any later version. */ #ifndef _PLAYERBOT_FROSTMAGESTRATEGY_H diff --git a/src/strategy/mage/GenericMageNonCombatStrategy.cpp b/src/strategy/mage/GenericMageNonCombatStrategy.cpp index 24da512593..d83c0f5fa4 100644 --- a/src/strategy/mage/GenericMageNonCombatStrategy.cpp +++ b/src/strategy/mage/GenericMageNonCombatStrategy.cpp @@ -1,6 +1,6 @@ /* - * Copyright (C) 2016+ AzerothCore , released under GNU GPL v2 license, you may redistribute it - * and/or modify it under version 2 of the License, or (at your option), any later version. + * Copyright (C) 2016+ AzerothCore , released under GNU AGPL v3 license, you may redistribute it + * and/or modify it under version 3 of the License, or (at your option), any later version. */ #include "GenericMageNonCombatStrategy.h" diff --git a/src/strategy/mage/GenericMageNonCombatStrategy.h b/src/strategy/mage/GenericMageNonCombatStrategy.h index 81cb06eb63..d31261f668 100644 --- a/src/strategy/mage/GenericMageNonCombatStrategy.h +++ b/src/strategy/mage/GenericMageNonCombatStrategy.h @@ -1,6 +1,6 @@ /* - * Copyright (C) 2016+ AzerothCore , released under GNU GPL v2 license, you may redistribute it - * and/or modify it under version 2 of the License, or (at your option), any later version. + * Copyright (C) 2016+ AzerothCore , released under GNU AGPL v3 license, you may redistribute it + * and/or modify it under version 3 of the License, or (at your option), any later version. */ #ifndef _PLAYERBOT_GENERICMAGENONCOMBATSTRATEGY_H diff --git a/src/strategy/mage/GenericMageStrategy.cpp b/src/strategy/mage/GenericMageStrategy.cpp index 176308a475..f8d5667f2e 100644 --- a/src/strategy/mage/GenericMageStrategy.cpp +++ b/src/strategy/mage/GenericMageStrategy.cpp @@ -1,6 +1,6 @@ /* - * Copyright (C) 2016+ AzerothCore , released under GNU GPL v2 license, you may redistribute it - * and/or modify it under version 2 of the License, or (at your option), any later version. + * Copyright (C) 2016+ AzerothCore , released under GNU AGPL v3 license, you may redistribute it + * and/or modify it under version 3 of the License, or (at your option), any later version. */ #include "GenericMageStrategy.h" diff --git a/src/strategy/mage/GenericMageStrategy.h b/src/strategy/mage/GenericMageStrategy.h index 66ac8de5c6..9391479494 100644 --- a/src/strategy/mage/GenericMageStrategy.h +++ b/src/strategy/mage/GenericMageStrategy.h @@ -1,6 +1,6 @@ /* - * Copyright (C) 2016+ AzerothCore , released under GNU GPL v2 license, you may redistribute it - * and/or modify it under version 2 of the License, or (at your option), any later version. + * Copyright (C) 2016+ AzerothCore , released under GNU AGPL v3 license, you may redistribute it + * and/or modify it under version 3 of the License, or (at your option), any later version. */ #ifndef _PLAYERBOT_GENERICMAGESTRATEGY_H diff --git a/src/strategy/mage/MageActions.cpp b/src/strategy/mage/MageActions.cpp index 8503680824..67587e3213 100644 --- a/src/strategy/mage/MageActions.cpp +++ b/src/strategy/mage/MageActions.cpp @@ -1,6 +1,6 @@ /* - * Copyright (C) 2016+ AzerothCore , released under GNU GPL v2 license, you may redistribute it - * and/or modify it under version 2 of the License, or (at your option), any later version. + * Copyright (C) 2016+ AzerothCore , released under GNU AGPL v3 license, you may redistribute it + * and/or modify it under version 3 of the License, or (at your option), any later version. */ #include "MageActions.h" diff --git a/src/strategy/mage/MageActions.h b/src/strategy/mage/MageActions.h index dd22bd7763..39d1531a70 100644 --- a/src/strategy/mage/MageActions.h +++ b/src/strategy/mage/MageActions.h @@ -1,6 +1,6 @@ /* - * Copyright (C) 2016+ AzerothCore , released under GNU GPL v2 license, you may redistribute it - * and/or modify it under version 2 of the License, or (at your option), any later version. + * Copyright (C) 2016+ AzerothCore , released under GNU AGPL v3 license, you may redistribute it + * and/or modify it under version 3 of the License, or (at your option), any later version. */ #ifndef _PLAYERBOT_MAGEACTIONS_H diff --git a/src/strategy/mage/MageAiObjectContext.cpp b/src/strategy/mage/MageAiObjectContext.cpp index c28a8315a4..477c0e075d 100644 --- a/src/strategy/mage/MageAiObjectContext.cpp +++ b/src/strategy/mage/MageAiObjectContext.cpp @@ -1,6 +1,6 @@ /* - * Copyright (C) 2016+ AzerothCore , released under GNU GPL v2 license, you may redistribute it - * and/or modify it under version 2 of the License, or (at your option), any later version. + * Copyright (C) 2016+ AzerothCore , released under GNU AGPL v3 license, you may redistribute it + * and/or modify it under version 3 of the License, or (at your option), any later version. */ #include "MageAiObjectContext.h" diff --git a/src/strategy/mage/MageAiObjectContext.h b/src/strategy/mage/MageAiObjectContext.h index 435b43d0f1..c2cd2f5e70 100644 --- a/src/strategy/mage/MageAiObjectContext.h +++ b/src/strategy/mage/MageAiObjectContext.h @@ -1,6 +1,6 @@ /* - * Copyright (C) 2016+ AzerothCore , released under GNU GPL v2 license, you may redistribute it - * and/or modify it under version 2 of the License, or (at your option), any later version. + * Copyright (C) 2016+ AzerothCore , released under GNU AGPL v3 license, you may redistribute it + * and/or modify it under version 3 of the License, or (at your option), any later version. */ #ifndef _PLAYERBOT_MAGEAIOBJECTCONTEXT_H diff --git a/src/strategy/mage/MageTriggers.cpp b/src/strategy/mage/MageTriggers.cpp index de86408367..e222107988 100644 --- a/src/strategy/mage/MageTriggers.cpp +++ b/src/strategy/mage/MageTriggers.cpp @@ -1,6 +1,6 @@ /* - * Copyright (C) 2016+ AzerothCore , released under GNU GPL v2 license, you may redistribute it - * and/or modify it under version 2 of the License, or (at your option), any later version. + * Copyright (C) 2016+ AzerothCore , released under GNU AGPL v3 license, you may redistribute it + * and/or modify it under version 3 of the License, or (at your option), any later version. */ #include "MageTriggers.h" diff --git a/src/strategy/mage/MageTriggers.h b/src/strategy/mage/MageTriggers.h index a8e063170e..e769916f47 100644 --- a/src/strategy/mage/MageTriggers.h +++ b/src/strategy/mage/MageTriggers.h @@ -1,6 +1,6 @@ /* - * Copyright (C) 2016+ AzerothCore , released under GNU GPL v2 license, you may redistribute it - * and/or modify it under version 2 of the License, or (at your option), any later version. + * Copyright (C) 2016+ AzerothCore , released under GNU AGPL v3 license, you may redistribute it + * and/or modify it under version 3 of the License, or (at your option), any later version. */ #ifndef _PLAYERBOT_MAGETRIGGERS_H diff --git a/src/strategy/paladin/DpsPaladinStrategy.cpp b/src/strategy/paladin/DpsPaladinStrategy.cpp index 94b47171fa..209e0200c4 100644 --- a/src/strategy/paladin/DpsPaladinStrategy.cpp +++ b/src/strategy/paladin/DpsPaladinStrategy.cpp @@ -1,6 +1,6 @@ /* - * Copyright (C) 2016+ AzerothCore , released under GNU GPL v2 license, you may redistribute it - * and/or modify it under version 2 of the License, or (at your option), any later version. + * Copyright (C) 2016+ AzerothCore , released under GNU AGPL v3 license, you may redistribute it + * and/or modify it under version 3 of the License, or (at your option), any later version. */ #include "DpsPaladinStrategy.h" diff --git a/src/strategy/paladin/DpsPaladinStrategy.h b/src/strategy/paladin/DpsPaladinStrategy.h index 7a01396ebc..144ad3d58a 100644 --- a/src/strategy/paladin/DpsPaladinStrategy.h +++ b/src/strategy/paladin/DpsPaladinStrategy.h @@ -1,6 +1,6 @@ /* - * Copyright (C) 2016+ AzerothCore , released under GNU GPL v2 license, you may redistribute it - * and/or modify it under version 2 of the License, or (at your option), any later version. + * Copyright (C) 2016+ AzerothCore , released under GNU AGPL v3 license, you may redistribute it + * and/or modify it under version 3 of the License, or (at your option), any later version. */ #ifndef _PLAYERBOT_DPSPALADINSTRATEGY_H diff --git a/src/strategy/paladin/GenericPaladinNonCombatStrategy.cpp b/src/strategy/paladin/GenericPaladinNonCombatStrategy.cpp index ad2fcaf378..a1630ea2fa 100644 --- a/src/strategy/paladin/GenericPaladinNonCombatStrategy.cpp +++ b/src/strategy/paladin/GenericPaladinNonCombatStrategy.cpp @@ -1,6 +1,6 @@ /* - * Copyright (C) 2016+ AzerothCore , released under GNU GPL v2 license, you may redistribute it - * and/or modify it under version 2 of the License, or (at your option), any later version. + * Copyright (C) 2016+ AzerothCore , released under GNU AGPL v3 license, you may redistribute it + * and/or modify it under version 3 of the License, or (at your option), any later version. */ #include "GenericPaladinNonCombatStrategy.h" diff --git a/src/strategy/paladin/GenericPaladinNonCombatStrategy.h b/src/strategy/paladin/GenericPaladinNonCombatStrategy.h index 3b52f222ff..c4e21a5611 100644 --- a/src/strategy/paladin/GenericPaladinNonCombatStrategy.h +++ b/src/strategy/paladin/GenericPaladinNonCombatStrategy.h @@ -1,6 +1,6 @@ /* - * Copyright (C) 2016+ AzerothCore , released under GNU GPL v2 license, you may redistribute it - * and/or modify it under version 2 of the License, or (at your option), any later version. + * Copyright (C) 2016+ AzerothCore , released under GNU AGPL v3 license, you may redistribute it + * and/or modify it under version 3 of the License, or (at your option), any later version. */ #ifndef _PLAYERBOT_GENERICPALADINNONCOMBATSTRATEGY_H diff --git a/src/strategy/paladin/GenericPaladinStrategy.cpp b/src/strategy/paladin/GenericPaladinStrategy.cpp index 7e87bced40..aec2c4f8cc 100644 --- a/src/strategy/paladin/GenericPaladinStrategy.cpp +++ b/src/strategy/paladin/GenericPaladinStrategy.cpp @@ -1,6 +1,6 @@ /* - * Copyright (C) 2016+ AzerothCore , released under GNU GPL v2 license, you may redistribute it - * and/or modify it under version 2 of the License, or (at your option), any later version. + * Copyright (C) 2016+ AzerothCore , released under GNU AGPL v3 license, you may redistribute it + * and/or modify it under version 3 of the License, or (at your option), any later version. */ #include "GenericPaladinStrategy.h" diff --git a/src/strategy/paladin/GenericPaladinStrategy.h b/src/strategy/paladin/GenericPaladinStrategy.h index 737048ccda..2a3ec516cc 100644 --- a/src/strategy/paladin/GenericPaladinStrategy.h +++ b/src/strategy/paladin/GenericPaladinStrategy.h @@ -1,6 +1,6 @@ /* - * Copyright (C) 2016+ AzerothCore , released under GNU GPL v2 license, you may redistribute it - * and/or modify it under version 2 of the License, or (at your option), any later version. + * Copyright (C) 2016+ AzerothCore , released under GNU AGPL v3 license, you may redistribute it + * and/or modify it under version 3 of the License, or (at your option), any later version. */ #ifndef _PLAYERBOT_GENERICPALADINSTRATEGY_H diff --git a/src/strategy/paladin/GenericPaladinStrategyActionNodeFactory.h b/src/strategy/paladin/GenericPaladinStrategyActionNodeFactory.h index 031929a9fd..93812ce6c4 100644 --- a/src/strategy/paladin/GenericPaladinStrategyActionNodeFactory.h +++ b/src/strategy/paladin/GenericPaladinStrategyActionNodeFactory.h @@ -1,6 +1,6 @@ /* - * Copyright (C) 2016+ AzerothCore , released under GNU GPL v2 license, you may redistribute it - * and/or modify it under version 2 of the License, or (at your option), any later version. + * Copyright (C) 2016+ AzerothCore , released under GNU AGPL v3 license, you may redistribute it + * and/or modify it under version 3 of the License, or (at your option), any later version. */ #ifndef _PLAYERBOT_GENERICPALADINSTRATEGYACTIONNODEFACTORY_H diff --git a/src/strategy/paladin/HealPaladinStrategy.cpp b/src/strategy/paladin/HealPaladinStrategy.cpp index 0f95516247..3b368d03f0 100644 --- a/src/strategy/paladin/HealPaladinStrategy.cpp +++ b/src/strategy/paladin/HealPaladinStrategy.cpp @@ -1,6 +1,6 @@ /* - * Copyright (C) 2016+ AzerothCore , released under GNU GPL v2 license, you may redistribute it - * and/or modify it under version 2 of the License, or (at your option), any later version. + * Copyright (C) 2016+ AzerothCore , released under GNU AGPL v3 license, you may redistribute it + * and/or modify it under version 3 of the License, or (at your option), any later version. */ #include "HealPaladinStrategy.h" diff --git a/src/strategy/paladin/HealPaladinStrategy.h b/src/strategy/paladin/HealPaladinStrategy.h index e740ab37c0..eb13de15c7 100644 --- a/src/strategy/paladin/HealPaladinStrategy.h +++ b/src/strategy/paladin/HealPaladinStrategy.h @@ -1,6 +1,6 @@ /* - * Copyright (C) 2016+ AzerothCore , released under GNU GPL v2 license, you may redistribute it - * and/or modify it under version 2 of the License, or (at your option), any later version. + * Copyright (C) 2016+ AzerothCore , released under GNU AGPL v3 license, you may redistribute it + * and/or modify it under version 3 of the License, or (at your option), any later version. */ #ifndef _PLAYERBOT_HEALPALADINSTRATEGY_H diff --git a/src/strategy/paladin/OffhealRetPaladinStrategy.cpp b/src/strategy/paladin/OffhealRetPaladinStrategy.cpp index e8675c8cd6..3dd9c904c9 100644 --- a/src/strategy/paladin/OffhealRetPaladinStrategy.cpp +++ b/src/strategy/paladin/OffhealRetPaladinStrategy.cpp @@ -1,6 +1,6 @@ /* - * Copyright (C) 2016+ AzerothCore , released under GNU GPL v2 license, you may redistribute it - * and/or modify it under version 2 of the License, or (at your option), any later version. + * Copyright (C) 2016+ AzerothCore , released under GNU AGPL v3 license, you may redistribute it + * and/or modify it under version 3 of the License, or (at your option), any later version. */ #include "OffhealRetPaladinStrategy.h" diff --git a/src/strategy/paladin/OffhealRetPaladinStrategy.h b/src/strategy/paladin/OffhealRetPaladinStrategy.h index 258331c6f7..c634297aa6 100644 --- a/src/strategy/paladin/OffhealRetPaladinStrategy.h +++ b/src/strategy/paladin/OffhealRetPaladinStrategy.h @@ -1,6 +1,6 @@ /* - * Copyright (C) 2016+ AzerothCore , released under GNU GPL v2 license, you may redistribute it - * and/or modify it under version 2 of the License, or (at your option), any later version. + * Copyright (C) 2016+ AzerothCore , released under GNU AGPL v3 license, you may redistribute it + * and/or modify it under version 3 of the License, or (at your option), any later version. */ #ifndef _PLAYERBOT_OFFHEALRETPALADINSTRATEGY_H diff --git a/src/strategy/paladin/PaladinActions.cpp b/src/strategy/paladin/PaladinActions.cpp index 57581cf55a..7dbf7c91ed 100644 --- a/src/strategy/paladin/PaladinActions.cpp +++ b/src/strategy/paladin/PaladinActions.cpp @@ -1,6 +1,6 @@ /* - * Copyright (C) 2016+ AzerothCore , released under GNU GPL v2 license, you may redistribute it - * and/or modify it under version 2 of the License, or (at your option), any later version. + * Copyright (C) 2016+ AzerothCore , released under GNU AGPL v3 license, you may redistribute it + * and/or modify it under version 3 of the License, or (at your option), any later version. */ #include "PaladinActions.h" diff --git a/src/strategy/paladin/PaladinActions.h b/src/strategy/paladin/PaladinActions.h index aba9fcde9f..3bacc88460 100644 --- a/src/strategy/paladin/PaladinActions.h +++ b/src/strategy/paladin/PaladinActions.h @@ -1,6 +1,6 @@ /* - * Copyright (C) 2016+ AzerothCore , released under GNU GPL v2 license, you may redistribute it - * and/or modify it under version 2 of the License, or (at your option), any later version. + * Copyright (C) 2016+ AzerothCore , released under GNU AGPL v3 license, you may redistribute it + * and/or modify it under version 3 of the License, or (at your option), any later version. */ #ifndef _PLAYERBOT_PALADINACTIONS_H diff --git a/src/strategy/paladin/PaladinAiObjectContext.cpp b/src/strategy/paladin/PaladinAiObjectContext.cpp index 74869bb132..4929eb9df0 100644 --- a/src/strategy/paladin/PaladinAiObjectContext.cpp +++ b/src/strategy/paladin/PaladinAiObjectContext.cpp @@ -1,6 +1,6 @@ /* - * Copyright (C) 2016+ AzerothCore , released under GNU GPL v2 license, you may redistribute it - * and/or modify it under version 2 of the License, or (at your option), any later version. + * Copyright (C) 2016+ AzerothCore , released under GNU AGPL v3 license, you may redistribute it + * and/or modify it under version 3 of the License, or (at your option), any later version. */ #include "PaladinAiObjectContext.h" diff --git a/src/strategy/paladin/PaladinAiObjectContext.h b/src/strategy/paladin/PaladinAiObjectContext.h index e8b867ae95..4ca5f94beb 100644 --- a/src/strategy/paladin/PaladinAiObjectContext.h +++ b/src/strategy/paladin/PaladinAiObjectContext.h @@ -1,6 +1,6 @@ /* - * Copyright (C) 2016+ AzerothCore , released under GNU GPL v2 license, you may redistribute it - * and/or modify it under version 2 of the License, or (at your option), any later version. + * Copyright (C) 2016+ AzerothCore , released under GNU AGPL v3 license, you may redistribute it + * and/or modify it under version 3 of the License, or (at your option), any later version. */ #ifndef _PLAYERBOT_PALADINAIOBJECTCONTEXT_H diff --git a/src/strategy/paladin/PaladinBuffStrategies.cpp b/src/strategy/paladin/PaladinBuffStrategies.cpp index e63003459d..439e3aaf17 100644 --- a/src/strategy/paladin/PaladinBuffStrategies.cpp +++ b/src/strategy/paladin/PaladinBuffStrategies.cpp @@ -1,6 +1,6 @@ /* - * Copyright (C) 2016+ AzerothCore , released under GNU GPL v2 license, you may redistribute it - * and/or modify it under version 2 of the License, or (at your option), any later version. + * Copyright (C) 2016+ AzerothCore , released under GNU AGPL v3 license, you may redistribute it + * and/or modify it under version 3 of the License, or (at your option), any later version. */ #include "PaladinBuffStrategies.h" diff --git a/src/strategy/paladin/PaladinBuffStrategies.h b/src/strategy/paladin/PaladinBuffStrategies.h index 365fe9953e..25f8886a34 100644 --- a/src/strategy/paladin/PaladinBuffStrategies.h +++ b/src/strategy/paladin/PaladinBuffStrategies.h @@ -1,6 +1,6 @@ /* - * Copyright (C) 2016+ AzerothCore , released under GNU GPL v2 license, you may redistribute it - * and/or modify it under version 2 of the License, or (at your option), any later version. + * Copyright (C) 2016+ AzerothCore , released under GNU AGPL v3 license, you may redistribute it + * and/or modify it under version 3 of the License, or (at your option), any later version. */ #ifndef _PLAYERBOT_PALADINBUFFSTRATEGIES_H diff --git a/src/strategy/paladin/PaladinTriggers.cpp b/src/strategy/paladin/PaladinTriggers.cpp index 14cd3b2bdf..6c333bc7ee 100644 --- a/src/strategy/paladin/PaladinTriggers.cpp +++ b/src/strategy/paladin/PaladinTriggers.cpp @@ -1,6 +1,6 @@ /* - * Copyright (C) 2016+ AzerothCore , released under GNU GPL v2 license, you may redistribute it - * and/or modify it under version 2 of the License, or (at your option), any later version. + * Copyright (C) 2016+ AzerothCore , released under GNU AGPL v3 license, you may redistribute it + * and/or modify it under version 3 of the License, or (at your option), any later version. */ #include "PaladinTriggers.h" diff --git a/src/strategy/paladin/PaladinTriggers.h b/src/strategy/paladin/PaladinTriggers.h index a3c42d7048..7352dbc812 100644 --- a/src/strategy/paladin/PaladinTriggers.h +++ b/src/strategy/paladin/PaladinTriggers.h @@ -1,6 +1,6 @@ /* - * Copyright (C) 2016+ AzerothCore , released under GNU GPL v2 license, you may redistribute it - * and/or modify it under version 2 of the License, or (at your option), any later version. + * Copyright (C) 2016+ AzerothCore , released under GNU AGPL v3 license, you may redistribute it + * and/or modify it under version 3 of the License, or (at your option), any later version. */ #ifndef _PLAYERBOT_PALADINTRIGGERS_H diff --git a/src/strategy/paladin/TankPaladinStrategy.cpp b/src/strategy/paladin/TankPaladinStrategy.cpp index aa017d0dee..145f205d31 100644 --- a/src/strategy/paladin/TankPaladinStrategy.cpp +++ b/src/strategy/paladin/TankPaladinStrategy.cpp @@ -1,6 +1,6 @@ /* - * Copyright (C) 2016+ AzerothCore , released under GNU GPL v2 license, you may redistribute it - * and/or modify it under version 2 of the License, or (at your option), any later version. + * Copyright (C) 2016+ AzerothCore , released under GNU AGPL v3 license, you may redistribute it + * and/or modify it under version 3 of the License, or (at your option), any later version. */ #include "TankPaladinStrategy.h" diff --git a/src/strategy/paladin/TankPaladinStrategy.h b/src/strategy/paladin/TankPaladinStrategy.h index 9216c9486b..5f7e109dc9 100644 --- a/src/strategy/paladin/TankPaladinStrategy.h +++ b/src/strategy/paladin/TankPaladinStrategy.h @@ -1,6 +1,6 @@ /* - * Copyright (C) 2016+ AzerothCore , released under GNU GPL v2 license, you may redistribute it - * and/or modify it under version 2 of the License, or (at your option), any later version. + * Copyright (C) 2016+ AzerothCore , released under GNU AGPL v3 license, you may redistribute it + * and/or modify it under version 3 of the License, or (at your option), any later version. */ #ifndef _PLAYERBOT_TANKPALADINSTRATEGY_H diff --git a/src/strategy/priest/GenericPriestStrategy.cpp b/src/strategy/priest/GenericPriestStrategy.cpp index d0d9137be8..cbd838abdb 100644 --- a/src/strategy/priest/GenericPriestStrategy.cpp +++ b/src/strategy/priest/GenericPriestStrategy.cpp @@ -1,6 +1,6 @@ /* - * Copyright (C) 2016+ AzerothCore , released under GNU GPL v2 license, you may redistribute it - * and/or modify it under version 2 of the License, or (at your option), any later version. + * Copyright (C) 2016+ AzerothCore , released under GNU AGPL v3 license, you may redistribute it + * and/or modify it under version 3 of the License, or (at your option), any later version. */ #include "GenericPriestStrategy.h" diff --git a/src/strategy/priest/GenericPriestStrategy.h b/src/strategy/priest/GenericPriestStrategy.h index 2668723e94..35fd7db134 100644 --- a/src/strategy/priest/GenericPriestStrategy.h +++ b/src/strategy/priest/GenericPriestStrategy.h @@ -1,6 +1,6 @@ /* - * Copyright (C) 2016+ AzerothCore , released under GNU GPL v2 license, you may redistribute it - * and/or modify it under version 2 of the License, or (at your option), any later version. + * Copyright (C) 2016+ AzerothCore , released under GNU AGPL v3 license, you may redistribute it + * and/or modify it under version 3 of the License, or (at your option), any later version. */ #ifndef _PLAYERBOT_GENERICPRIESTSTRATEGY_H diff --git a/src/strategy/priest/GenericPriestStrategyActionNodeFactory.h b/src/strategy/priest/GenericPriestStrategyActionNodeFactory.h index aa57a11051..d96f2e19d7 100644 --- a/src/strategy/priest/GenericPriestStrategyActionNodeFactory.h +++ b/src/strategy/priest/GenericPriestStrategyActionNodeFactory.h @@ -1,6 +1,6 @@ /* - * Copyright (C) 2016+ AzerothCore , released under GNU GPL v2 license, you may redistribute it - * and/or modify it under version 2 of the License, or (at your option), any later version. + * Copyright (C) 2016+ AzerothCore , released under GNU AGPL v3 license, you may redistribute it + * and/or modify it under version 3 of the License, or (at your option), any later version. */ #ifndef _PLAYERBOT_GENERICPRIESTSTRATEGYACTIONNODEFACTORY_H diff --git a/src/strategy/priest/HealPriestStrategy.cpp b/src/strategy/priest/HealPriestStrategy.cpp index d98c3166e2..ecb59f6a79 100644 --- a/src/strategy/priest/HealPriestStrategy.cpp +++ b/src/strategy/priest/HealPriestStrategy.cpp @@ -1,6 +1,6 @@ /* - * Copyright (C) 2016+ AzerothCore , released under GNU GPL v2 license, you may redistribute it - * and/or modify it under version 2 of the License, or (at your option), any later version. + * Copyright (C) 2016+ AzerothCore , released under GNU AGPL v3 license, you may redistribute it + * and/or modify it under version 3 of the License, or (at your option), any later version. */ #include "HealPriestStrategy.h" diff --git a/src/strategy/priest/HealPriestStrategy.h b/src/strategy/priest/HealPriestStrategy.h index b93f05c8c9..e6db66214d 100644 --- a/src/strategy/priest/HealPriestStrategy.h +++ b/src/strategy/priest/HealPriestStrategy.h @@ -1,6 +1,6 @@ /* - * Copyright (C) 2016+ AzerothCore , released under GNU GPL v2 license, you may redistribute it - * and/or modify it under version 2 of the License, or (at your option), any later version. + * Copyright (C) 2016+ AzerothCore , released under GNU AGPL v3 license, you may redistribute it + * and/or modify it under version 3 of the License, or (at your option), any later version. */ #ifndef _PLAYERBOT_HEALPRIESTSTRATEGY_H diff --git a/src/strategy/priest/HolyPriestStrategy.cpp b/src/strategy/priest/HolyPriestStrategy.cpp index cb590f9986..bdf804edcd 100644 --- a/src/strategy/priest/HolyPriestStrategy.cpp +++ b/src/strategy/priest/HolyPriestStrategy.cpp @@ -1,6 +1,6 @@ /* - * Copyright (C) 2016+ AzerothCore , released under GNU GPL v2 license, you may redistribute it - * and/or modify it under version 2 of the License, or (at your option), any later version. + * Copyright (C) 2016+ AzerothCore , released under GNU AGPL v3 license, you may redistribute it + * and/or modify it under version 3 of the License, or (at your option), any later version. */ #include "HolyPriestStrategy.h" diff --git a/src/strategy/priest/HolyPriestStrategy.h b/src/strategy/priest/HolyPriestStrategy.h index 9bdd3bef54..87b28a9848 100644 --- a/src/strategy/priest/HolyPriestStrategy.h +++ b/src/strategy/priest/HolyPriestStrategy.h @@ -1,6 +1,6 @@ /* - * Copyright (C) 2016+ AzerothCore , released under GNU GPL v2 license, you may redistribute it - * and/or modify it under version 2 of the License, or (at your option), any later version. + * Copyright (C) 2016+ AzerothCore , released under GNU AGPL v3 license, you may redistribute it + * and/or modify it under version 3 of the License, or (at your option), any later version. */ #ifndef _PLAYERBOT_HOLYPRIESTSTRATEGY_H diff --git a/src/strategy/priest/PriestActions.cpp b/src/strategy/priest/PriestActions.cpp index 2364a5e2d5..e1c61033a1 100644 --- a/src/strategy/priest/PriestActions.cpp +++ b/src/strategy/priest/PriestActions.cpp @@ -1,6 +1,6 @@ /* - * Copyright (C) 2016+ AzerothCore , released under GNU GPL v2 license, you may redistribute it - * and/or modify it under version 2 of the License, or (at your option), any later version. + * Copyright (C) 2016+ AzerothCore , released under GNU AGPL v3 license, you may redistribute it + * and/or modify it under version 3 of the License, or (at your option), any later version. */ #include "PriestActions.h" diff --git a/src/strategy/priest/PriestActions.h b/src/strategy/priest/PriestActions.h index c84bfc7df7..1b09414d48 100644 --- a/src/strategy/priest/PriestActions.h +++ b/src/strategy/priest/PriestActions.h @@ -1,6 +1,6 @@ /* - * Copyright (C) 2016+ AzerothCore , released under GNU GPL v2 license, you may redistribute it - * and/or modify it under version 2 of the License, or (at your option), any later version. + * Copyright (C) 2016+ AzerothCore , released under GNU AGPL v3 license, you may redistribute it + * and/or modify it under version 3 of the License, or (at your option), any later version. */ #ifndef _PLAYERBOT_PRIESTACTIONS_H diff --git a/src/strategy/priest/PriestAiObjectContext.cpp b/src/strategy/priest/PriestAiObjectContext.cpp index b433fbf7f6..7ffac96cca 100644 --- a/src/strategy/priest/PriestAiObjectContext.cpp +++ b/src/strategy/priest/PriestAiObjectContext.cpp @@ -1,6 +1,6 @@ /* - * Copyright (C) 2016+ AzerothCore , released under GNU GPL v2 license, you may redistribute it - * and/or modify it under version 2 of the License, or (at your option), any later version. + * Copyright (C) 2016+ AzerothCore , released under GNU AGPL v3 license, you may redistribute it + * and/or modify it under version 3 of the License, or (at your option), any later version. */ #include "PriestAiObjectContext.h" diff --git a/src/strategy/priest/PriestAiObjectContext.h b/src/strategy/priest/PriestAiObjectContext.h index bb6efb4e71..83e3449cb3 100644 --- a/src/strategy/priest/PriestAiObjectContext.h +++ b/src/strategy/priest/PriestAiObjectContext.h @@ -1,6 +1,6 @@ /* - * Copyright (C) 2016+ AzerothCore , released under GNU GPL v2 license, you may redistribute it - * and/or modify it under version 2 of the License, or (at your option), any later version. + * Copyright (C) 2016+ AzerothCore , released under GNU AGPL v3 license, you may redistribute it + * and/or modify it under version 3 of the License, or (at your option), any later version. */ #ifndef _PLAYERBOT_PRIESTAIOBJECTCONTEXT_H diff --git a/src/strategy/priest/PriestNonCombatStrategy.cpp b/src/strategy/priest/PriestNonCombatStrategy.cpp index 0db6e22e6a..3851310646 100644 --- a/src/strategy/priest/PriestNonCombatStrategy.cpp +++ b/src/strategy/priest/PriestNonCombatStrategy.cpp @@ -1,6 +1,6 @@ /* - * Copyright (C) 2016+ AzerothCore , released under GNU GPL v2 license, you may redistribute it - * and/or modify it under version 2 of the License, or (at your option), any later version. + * Copyright (C) 2016+ AzerothCore , released under GNU AGPL v3 license, you may redistribute it + * and/or modify it under version 3 of the License, or (at your option), any later version. */ #include "PriestNonCombatStrategy.h" diff --git a/src/strategy/priest/PriestNonCombatStrategy.h b/src/strategy/priest/PriestNonCombatStrategy.h index 8884951987..465d05a596 100644 --- a/src/strategy/priest/PriestNonCombatStrategy.h +++ b/src/strategy/priest/PriestNonCombatStrategy.h @@ -1,6 +1,6 @@ /* - * Copyright (C) 2016+ AzerothCore , released under GNU GPL v2 license, you may redistribute it - * and/or modify it under version 2 of the License, or (at your option), any later version. + * Copyright (C) 2016+ AzerothCore , released under GNU AGPL v3 license, you may redistribute it + * and/or modify it under version 3 of the License, or (at your option), any later version. */ #ifndef _PLAYERBOT_PRIESTNONCOMBATSTRATEGY_H diff --git a/src/strategy/priest/PriestNonCombatStrategyActionNodeFactory.h b/src/strategy/priest/PriestNonCombatStrategyActionNodeFactory.h index 5ef6f37c64..e12a1a67e5 100644 --- a/src/strategy/priest/PriestNonCombatStrategyActionNodeFactory.h +++ b/src/strategy/priest/PriestNonCombatStrategyActionNodeFactory.h @@ -1,6 +1,6 @@ /* - * Copyright (C) 2016+ AzerothCore , released under GNU GPL v2 license, you may redistribute it - * and/or modify it under version 2 of the License, or (at your option), any later version. + * Copyright (C) 2016+ AzerothCore , released under GNU AGPL v3 license, you may redistribute it + * and/or modify it under version 3 of the License, or (at your option), any later version. */ #ifndef _PLAYERBOT_PRIESTNONCOMBATSTRATEGYACTIONNODEFACTORY_H diff --git a/src/strategy/priest/PriestTriggers.cpp b/src/strategy/priest/PriestTriggers.cpp index 45c8ad6de2..894780ad45 100644 --- a/src/strategy/priest/PriestTriggers.cpp +++ b/src/strategy/priest/PriestTriggers.cpp @@ -1,6 +1,6 @@ /* - * Copyright (C) 2016+ AzerothCore , released under GNU GPL v2 license, you may redistribute it - * and/or modify it under version 2 of the License, or (at your option), any later version. + * Copyright (C) 2016+ AzerothCore , released under GNU AGPL v3 license, you may redistribute it + * and/or modify it under version 3 of the License, or (at your option), any later version. */ #include "PriestTriggers.h" diff --git a/src/strategy/priest/PriestTriggers.h b/src/strategy/priest/PriestTriggers.h index 747d2c6621..5ae91985d3 100644 --- a/src/strategy/priest/PriestTriggers.h +++ b/src/strategy/priest/PriestTriggers.h @@ -1,6 +1,6 @@ /* - * Copyright (C) 2016+ AzerothCore , released under GNU GPL v2 license, you may redistribute it - * and/or modify it under version 2 of the License, or (at your option), any later version. + * Copyright (C) 2016+ AzerothCore , released under GNU AGPL v3 license, you may redistribute it + * and/or modify it under version 3 of the License, or (at your option), any later version. */ #ifndef _PLAYERBOT_PRIESTTRIGGERS_H diff --git a/src/strategy/priest/ShadowPriestStrategy.cpp b/src/strategy/priest/ShadowPriestStrategy.cpp index 5532dd2763..e6565b722c 100644 --- a/src/strategy/priest/ShadowPriestStrategy.cpp +++ b/src/strategy/priest/ShadowPriestStrategy.cpp @@ -1,6 +1,6 @@ /* - * Copyright (C) 2016+ AzerothCore , released under GNU GPL v2 license, you may redistribute it - * and/or modify it under version 2 of the License, or (at your option), any later version. + * Copyright (C) 2016+ AzerothCore , released under GNU AGPL v3 license, you may redistribute it + * and/or modify it under version 3 of the License, or (at your option), any later version. */ #include "ShadowPriestStrategy.h" diff --git a/src/strategy/priest/ShadowPriestStrategy.h b/src/strategy/priest/ShadowPriestStrategy.h index 8ceadc7b21..a6d8000d72 100644 --- a/src/strategy/priest/ShadowPriestStrategy.h +++ b/src/strategy/priest/ShadowPriestStrategy.h @@ -1,6 +1,6 @@ /* - * Copyright (C) 2016+ AzerothCore , released under GNU GPL v2 license, you may redistribute it - * and/or modify it under version 2 of the License, or (at your option), any later version. + * Copyright (C) 2016+ AzerothCore , released under GNU AGPL v3 license, you may redistribute it + * and/or modify it under version 3 of the License, or (at your option), any later version. */ #ifndef _PLAYERBOT_SHADOWPRIESTSTRATEGY_H diff --git a/src/strategy/priest/ShadowPriestStrategyActionNodeFactory.h b/src/strategy/priest/ShadowPriestStrategyActionNodeFactory.h index a5382aed0f..e3dd4efac4 100644 --- a/src/strategy/priest/ShadowPriestStrategyActionNodeFactory.h +++ b/src/strategy/priest/ShadowPriestStrategyActionNodeFactory.h @@ -1,6 +1,6 @@ /* - * Copyright (C) 2016+ AzerothCore , released under GNU GPL v2 license, you may redistribute it - * and/or modify it under version 2 of the License, or (at your option), any later version. + * Copyright (C) 2016+ AzerothCore , released under GNU AGPL v3 license, you may redistribute it + * and/or modify it under version 3 of the License, or (at your option), any later version. */ #ifndef _PLAYERBOT_SHADOWPRIESTSTRATEGYACTIONNODEFACTORY_H diff --git a/src/strategy/raids/naxxramas/RaidNaxxActionContext.h b/src/strategy/raids/naxxramas/RaidNaxxActionContext.h index f323106f7f..aafddf8bef 100644 --- a/src/strategy/raids/naxxramas/RaidNaxxActionContext.h +++ b/src/strategy/raids/naxxramas/RaidNaxxActionContext.h @@ -1,6 +1,6 @@ // /* -// * Copyright (C) 2016+ AzerothCore , released under GNU GPL v2 license, you may redistribute it -// and/or modify it under version 2 of the License, or (at your option), any later version. +// * Copyright (C) 2016+ AzerothCore , released under GNU AGPL v3 license, you may redistribute it +// and/or modify it under version 3 of the License, or (at your option), any later version. // */ #ifndef _PLAYERBOT_RAIDNAXXACTIONCONTEXT_H diff --git a/src/strategy/raids/naxxramas/RaidNaxxTriggerContext.h b/src/strategy/raids/naxxramas/RaidNaxxTriggerContext.h index 9f12369ab5..fc1076c34e 100644 --- a/src/strategy/raids/naxxramas/RaidNaxxTriggerContext.h +++ b/src/strategy/raids/naxxramas/RaidNaxxTriggerContext.h @@ -1,6 +1,6 @@ // /* -// * Copyright (C) 2016+ AzerothCore , released under GNU GPL v2 license, you may redistribute it -// and/or modify it under version 2 of the License, or (at your option), any later version. +// * Copyright (C) 2016+ AzerothCore , released under GNU AGPL v3 license, you may redistribute it +// and/or modify it under version 3 of the License, or (at your option), any later version. // */ #ifndef _PLAYERBOT_RAIDNAXXTRIGGERCONTEXT_H diff --git a/src/strategy/raids/ulduar/RaidUlduarActionContext.h b/src/strategy/raids/ulduar/RaidUlduarActionContext.h index 3dcd31952e..84c1bb8505 100644 --- a/src/strategy/raids/ulduar/RaidUlduarActionContext.h +++ b/src/strategy/raids/ulduar/RaidUlduarActionContext.h @@ -1,6 +1,6 @@ // /* -// * Copyright (C) 2016+ AzerothCore , released under GNU GPL v2 license, you may redistribute it -// and/or modify it under version 2 of the License, or (at your option), any later version. +// * Copyright (C) 2016+ AzerothCore , released under GNU AGPL v3 license, you may redistribute it +// and/or modify it under version 3 of the License, or (at your option), any later version. // */ #ifndef _PLAYERBOT_RAIDULDUARACTIONCONTEXT_H diff --git a/src/strategy/raids/ulduar/RaidUlduarTriggerContext.h b/src/strategy/raids/ulduar/RaidUlduarTriggerContext.h index b3c7f60a21..e4243fb106 100644 --- a/src/strategy/raids/ulduar/RaidUlduarTriggerContext.h +++ b/src/strategy/raids/ulduar/RaidUlduarTriggerContext.h @@ -1,6 +1,6 @@ // /* -// * Copyright (C) 2016+ AzerothCore , released under GNU GPL v2 license, you may redistribute it -// and/or modify it under version 2 of the License, or (at your option), any later version. +// * Copyright (C) 2016+ AzerothCore , released under GNU AGPL v3 license, you may redistribute it +// and/or modify it under version 3 of the License, or (at your option), any later version. // */ #ifndef _PLAYERBOT_RAIDULDUARTRIGGERCONTEXT_H diff --git a/src/strategy/raids/vaultofarchavon/RaidVoAActionContext.h b/src/strategy/raids/vaultofarchavon/RaidVoAActionContext.h index 42b0ae9ef8..b304826b8f 100644 --- a/src/strategy/raids/vaultofarchavon/RaidVoAActionContext.h +++ b/src/strategy/raids/vaultofarchavon/RaidVoAActionContext.h @@ -1,6 +1,6 @@ // /* -// * Copyright (C) 2016+ AzerothCore , released under GNU GPL v2 license, you may redistribute it -// and/or modify it under version 2 of the License, or (at your option), any later version. +// * Copyright (C) 2016+ AzerothCore , released under GNU AGPL v3 license, you may redistribute it +// and/or modify it under version 3 of the License, or (at your option), any later version. // */ #ifndef _PLAYERBOT_RAIDVOAACTIONCONTEXT_H diff --git a/src/strategy/raids/vaultofarchavon/RaidVoATriggerContext.h b/src/strategy/raids/vaultofarchavon/RaidVoATriggerContext.h index 16ae0caf7d..9fe078f809 100644 --- a/src/strategy/raids/vaultofarchavon/RaidVoATriggerContext.h +++ b/src/strategy/raids/vaultofarchavon/RaidVoATriggerContext.h @@ -1,6 +1,6 @@ // /* -// * Copyright (C) 2016+ AzerothCore , released under GNU GPL v2 license, you may redistribute it -// and/or modify it under version 2 of the License, or (at your option), any later version. +// * Copyright (C) 2016+ AzerothCore , released under GNU AGPL v3 license, you may redistribute it +// and/or modify it under version 3 of the License, or (at your option), any later version. // */ #ifndef _PLAYERBOT_RAIDVOATRIGGERCONTEXT_H diff --git a/src/strategy/rogue/DpsRogueStrategy.cpp b/src/strategy/rogue/DpsRogueStrategy.cpp index 106d48d598..a1e511df33 100644 --- a/src/strategy/rogue/DpsRogueStrategy.cpp +++ b/src/strategy/rogue/DpsRogueStrategy.cpp @@ -1,6 +1,6 @@ /* - * Copyright (C) 2016+ AzerothCore , released under GNU GPL v2 license, you may redistribute it - * and/or modify it under version 2 of the License, or (at your option), any later version. + * Copyright (C) 2016+ AzerothCore , released under GNU AGPL v3 license, you may redistribute it + * and/or modify it under version 3 of the License, or (at your option), any later version. */ #include "DpsRogueStrategy.h" diff --git a/src/strategy/rogue/DpsRogueStrategy.h b/src/strategy/rogue/DpsRogueStrategy.h index 39aee91f1d..8e9a79b245 100644 --- a/src/strategy/rogue/DpsRogueStrategy.h +++ b/src/strategy/rogue/DpsRogueStrategy.h @@ -1,6 +1,6 @@ /* - * Copyright (C) 2016+ AzerothCore , released under GNU GPL v2 license, you may redistribute it - * and/or modify it under version 2 of the License, or (at your option), any later version. + * Copyright (C) 2016+ AzerothCore , released under GNU AGPL v3 license, you may redistribute it + * and/or modify it under version 3 of the License, or (at your option), any later version. */ #ifndef _PLAYERBOT_DPSROGUESTRATEGY_H diff --git a/src/strategy/rogue/GenericRogueNonCombatStrategy.cpp b/src/strategy/rogue/GenericRogueNonCombatStrategy.cpp index 7f1615502a..bfdcacd7e8 100644 --- a/src/strategy/rogue/GenericRogueNonCombatStrategy.cpp +++ b/src/strategy/rogue/GenericRogueNonCombatStrategy.cpp @@ -1,6 +1,6 @@ /* - * Copyright (C) 2016+ AzerothCore , released under GNU GPL v2 license, you may redistribute it - * and/or modify it under version 2 of the License, or (at your option), any later version. + * Copyright (C) 2016+ AzerothCore , released under GNU AGPL v3 license, you may redistribute it + * and/or modify it under version 3 of the License, or (at your option), any later version. */ #include "GenericRogueNonCombatStrategy.h" diff --git a/src/strategy/rogue/GenericRogueNonCombatStrategy.h b/src/strategy/rogue/GenericRogueNonCombatStrategy.h index 2bcfbefd0d..8bc4e3c5d9 100644 --- a/src/strategy/rogue/GenericRogueNonCombatStrategy.h +++ b/src/strategy/rogue/GenericRogueNonCombatStrategy.h @@ -1,6 +1,6 @@ /* - * Copyright (C) 2016+ AzerothCore , released under GNU GPL v2 license, you may redistribute it - * and/or modify it under version 2 of the License, or (at your option), any later version. + * Copyright (C) 2016+ AzerothCore , released under GNU AGPL v3 license, you may redistribute it + * and/or modify it under version 3 of the License, or (at your option), any later version. */ #ifndef _PLAYERBOT_GENERICROGUENONCOMBATSTRATEGY_H diff --git a/src/strategy/rogue/RogueActions.cpp b/src/strategy/rogue/RogueActions.cpp index 89d744c1d4..8a04a01d0c 100644 --- a/src/strategy/rogue/RogueActions.cpp +++ b/src/strategy/rogue/RogueActions.cpp @@ -1,6 +1,6 @@ /* - * Copyright (C) 2016+ AzerothCore , released under GNU GPL v2 license, you may redistribute it - * and/or modify it under version 2 of the License, or (at your option), any later version. + * Copyright (C) 2016+ AzerothCore , released under GNU AGPL v3 license, you may redistribute it + * and/or modify it under version 3 of the License, or (at your option), any later version. */ #include "RogueActions.h" diff --git a/src/strategy/rogue/RogueActions.h b/src/strategy/rogue/RogueActions.h index 9b276ccd54..c31dfbd7e6 100644 --- a/src/strategy/rogue/RogueActions.h +++ b/src/strategy/rogue/RogueActions.h @@ -1,6 +1,6 @@ /* - * Copyright (C) 2016+ AzerothCore , released under GNU GPL v2 license, you may redistribute it - * and/or modify it under version 2 of the License, or (at your option), any later version. + * Copyright (C) 2016+ AzerothCore , released under GNU AGPL v3 license, you may redistribute it + * and/or modify it under version 3 of the License, or (at your option), any later version. */ #ifndef _PLAYERBOT_ROGUEACTIONS_H diff --git a/src/strategy/rogue/RogueAiObjectContext.cpp b/src/strategy/rogue/RogueAiObjectContext.cpp index 39941bed4d..9875f23dec 100644 --- a/src/strategy/rogue/RogueAiObjectContext.cpp +++ b/src/strategy/rogue/RogueAiObjectContext.cpp @@ -1,6 +1,6 @@ /* - * Copyright (C) 2016+ AzerothCore , released under GNU GPL v2 license, you may redistribute it - * and/or modify it under version 2 of the License, or (at your option), any later version. + * Copyright (C) 2016+ AzerothCore , released under GNU AGPL v3 license, you may redistribute it + * and/or modify it under version 3 of the License, or (at your option), any later version. */ #include "RogueAiObjectContext.h" diff --git a/src/strategy/rogue/RogueAiObjectContext.h b/src/strategy/rogue/RogueAiObjectContext.h index f1b3f98b2d..3628f8737d 100644 --- a/src/strategy/rogue/RogueAiObjectContext.h +++ b/src/strategy/rogue/RogueAiObjectContext.h @@ -1,6 +1,6 @@ /* - * Copyright (C) 2016+ AzerothCore , released under GNU GPL v2 license, you may redistribute it - * and/or modify it under version 2 of the License, or (at your option), any later version. + * Copyright (C) 2016+ AzerothCore , released under GNU AGPL v3 license, you may redistribute it + * and/or modify it under version 3 of the License, or (at your option), any later version. */ #ifndef _PLAYERBOT_ROGUEAIOBJECTCONTEXT_H diff --git a/src/strategy/rogue/RogueComboActions.cpp b/src/strategy/rogue/RogueComboActions.cpp index 21f0ea5431..d99fa46876 100644 --- a/src/strategy/rogue/RogueComboActions.cpp +++ b/src/strategy/rogue/RogueComboActions.cpp @@ -1,6 +1,6 @@ /* - * Copyright (C) 2016+ AzerothCore , released under GNU GPL v2 license, you may redistribute it - * and/or modify it under version 2 of the License, or (at your option), any later version. + * Copyright (C) 2016+ AzerothCore , released under GNU AGPL v3 license, you may redistribute it + * and/or modify it under version 3 of the License, or (at your option), any later version. */ #include "RogueComboActions.h" diff --git a/src/strategy/rogue/RogueComboActions.h b/src/strategy/rogue/RogueComboActions.h index e5ebc5a8b9..be840ecc7a 100644 --- a/src/strategy/rogue/RogueComboActions.h +++ b/src/strategy/rogue/RogueComboActions.h @@ -1,6 +1,6 @@ /* - * Copyright (C) 2016+ AzerothCore , released under GNU GPL v2 license, you may redistribute it - * and/or modify it under version 2 of the License, or (at your option), any later version. + * Copyright (C) 2016+ AzerothCore , released under GNU AGPL v3 license, you may redistribute it + * and/or modify it under version 3 of the License, or (at your option), any later version. */ #ifndef _PLAYERBOT_ROGUECOMBOACTIONS_H diff --git a/src/strategy/rogue/RogueFinishingActions.h b/src/strategy/rogue/RogueFinishingActions.h index 464c35a19f..333e458968 100644 --- a/src/strategy/rogue/RogueFinishingActions.h +++ b/src/strategy/rogue/RogueFinishingActions.h @@ -1,6 +1,6 @@ /* - * Copyright (C) 2016+ AzerothCore , released under GNU GPL v2 license, you may redistribute it - * and/or modify it under version 2 of the License, or (at your option), any later version. + * Copyright (C) 2016+ AzerothCore , released under GNU AGPL v3 license, you may redistribute it + * and/or modify it under version 3 of the License, or (at your option), any later version. */ #ifndef _PLAYERBOT_ROGUEFINISHINGACTIONS_H diff --git a/src/strategy/rogue/RogueOpeningActions.cpp b/src/strategy/rogue/RogueOpeningActions.cpp index f4beb13c11..3e4a832afe 100644 --- a/src/strategy/rogue/RogueOpeningActions.cpp +++ b/src/strategy/rogue/RogueOpeningActions.cpp @@ -1,6 +1,6 @@ /* - * Copyright (C) 2016+ AzerothCore , released under GNU GPL v2 license, you may redistribute it - * and/or modify it under version 2 of the License, or (at your option), any later version. + * Copyright (C) 2016+ AzerothCore , released under GNU AGPL v3 license, you may redistribute it + * and/or modify it under version 3 of the License, or (at your option), any later version. */ #include "RogueOpeningActions.h" diff --git a/src/strategy/rogue/RogueOpeningActions.h b/src/strategy/rogue/RogueOpeningActions.h index 8a564fc9b2..8d7c64919e 100644 --- a/src/strategy/rogue/RogueOpeningActions.h +++ b/src/strategy/rogue/RogueOpeningActions.h @@ -1,6 +1,6 @@ /* - * Copyright (C) 2016+ AzerothCore , released under GNU GPL v2 license, you may redistribute it - * and/or modify it under version 2 of the License, or (at your option), any later version. + * Copyright (C) 2016+ AzerothCore , released under GNU AGPL v3 license, you may redistribute it + * and/or modify it under version 3 of the License, or (at your option), any later version. */ #ifndef _PLAYERBOT_ROGUEOPENINGACTIONS_H diff --git a/src/strategy/rogue/RogueTriggers.cpp b/src/strategy/rogue/RogueTriggers.cpp index 3d013ed6a6..16aada0164 100644 --- a/src/strategy/rogue/RogueTriggers.cpp +++ b/src/strategy/rogue/RogueTriggers.cpp @@ -1,6 +1,6 @@ /* - * Copyright (C) 2016+ AzerothCore , released under GNU GPL v2 license, you may redistribute it - * and/or modify it under version 2 of the License, or (at your option), any later version. + * Copyright (C) 2016+ AzerothCore , released under GNU AGPL v3 license, you may redistribute it + * and/or modify it under version 3 of the License, or (at your option), any later version. */ #include "RogueTriggers.h" diff --git a/src/strategy/rogue/RogueTriggers.h b/src/strategy/rogue/RogueTriggers.h index 48ce772e0c..4ef826a8c3 100644 --- a/src/strategy/rogue/RogueTriggers.h +++ b/src/strategy/rogue/RogueTriggers.h @@ -1,6 +1,6 @@ /* - * Copyright (C) 2016+ AzerothCore , released under GNU GPL v2 license, you may redistribute it - * and/or modify it under version 2 of the License, or (at your option), any later version. + * Copyright (C) 2016+ AzerothCore , released under GNU AGPL v3 license, you may redistribute it + * and/or modify it under version 3 of the License, or (at your option), any later version. */ #ifndef _PLAYERBOT_ROGUETRIGGERS_H diff --git a/src/strategy/rpg/NewRpgStrategy.cpp b/src/strategy/rpg/NewRpgStrategy.cpp index 72fc92d342..019b0c6b80 100644 --- a/src/strategy/rpg/NewRpgStrategy.cpp +++ b/src/strategy/rpg/NewRpgStrategy.cpp @@ -1,6 +1,6 @@ /* - * Copyright (C) 2016+ AzerothCore , released under GNU GPL v2 license, you may redistribute it - * and/or modify it under version 2 of the License, or (at your option), any later version. + * Copyright (C) 2016+ AzerothCore , released under GNU AGPL v3 license, you may redistribute it + * and/or modify it under version 3 of the License, or (at your option), any later version. */ #include "NewRpgStrategy.h" diff --git a/src/strategy/rpg/NewRpgStrategy.h b/src/strategy/rpg/NewRpgStrategy.h index 59fa61fe8e..b1b1e1568a 100644 --- a/src/strategy/rpg/NewRpgStrategy.h +++ b/src/strategy/rpg/NewRpgStrategy.h @@ -1,6 +1,6 @@ /* - * Copyright (C) 2016+ AzerothCore , released under GNU GPL v2 license, you may redistribute it - * and/or modify it under version 2 of the License, or (at your option), any later version. + * Copyright (C) 2016+ AzerothCore , released under GNU AGPL v3 license, you may redistribute it + * and/or modify it under version 3 of the License, or (at your option), any later version. */ #ifndef _PLAYERBOT_NEWRPGSTRATEGY_H diff --git a/src/strategy/shaman/ElementalShamanStrategy.cpp b/src/strategy/shaman/ElementalShamanStrategy.cpp index 055c3e6d26..3e058925ff 100644 --- a/src/strategy/shaman/ElementalShamanStrategy.cpp +++ b/src/strategy/shaman/ElementalShamanStrategy.cpp @@ -1,6 +1,6 @@ /* - * Copyright (C) 2016+ AzerothCore , released under GNU GPL v2 license, you may redistribute it - * and/or modify it under version 2 of the License, or (at your option), any later version. + * Copyright (C) 2016+ AzerothCore , released under GNU AGPL v3 license, you may redistribute it + * and/or modify it under version 3 of the License, or (at your option), any later version. */ #include "ElementalShamanStrategy.h" diff --git a/src/strategy/shaman/ElementalShamanStrategy.h b/src/strategy/shaman/ElementalShamanStrategy.h index 2aba120a77..44f883c765 100644 --- a/src/strategy/shaman/ElementalShamanStrategy.h +++ b/src/strategy/shaman/ElementalShamanStrategy.h @@ -1,6 +1,6 @@ /* - * Copyright (C) 2016+ AzerothCore , released under GNU GPL v2 license, you may redistribute it - * and/or modify it under version 2 of the License, or (at your option), any later version. + * Copyright (C) 2016+ AzerothCore , released under GNU AGPL v3 license, you may redistribute it + * and/or modify it under version 3 of the License, or (at your option), any later version. */ #ifndef _PLAYERBOT_ELEMENTALSHAMANSTRATEGY_H diff --git a/src/strategy/shaman/EnhancementShamanStrategy.cpp b/src/strategy/shaman/EnhancementShamanStrategy.cpp index 224b01a4e9..c38b040960 100644 --- a/src/strategy/shaman/EnhancementShamanStrategy.cpp +++ b/src/strategy/shaman/EnhancementShamanStrategy.cpp @@ -1,6 +1,6 @@ /* - * Copyright (C) 2016+ AzerothCore , released under GNU GPL v2 license, you may redistribute it - * and/or modify it under version 2 of the License, or (at your option), any later version. + * Copyright (C) 2016+ AzerothCore , released under GNU AGPL v3 license, you may redistribute it + * and/or modify it under version 3 of the License, or (at your option), any later version. */ #include "EnhancementShamanStrategy.h" diff --git a/src/strategy/shaman/EnhancementShamanStrategy.h b/src/strategy/shaman/EnhancementShamanStrategy.h index c683407f7a..04e299074c 100644 --- a/src/strategy/shaman/EnhancementShamanStrategy.h +++ b/src/strategy/shaman/EnhancementShamanStrategy.h @@ -1,6 +1,6 @@ /* - * Copyright (C) 2016+ AzerothCore , released under GNU GPL v2 license, you may redistribute it - * and/or modify it under version 2 of the License, or (at your option), any later version. + * Copyright (C) 2016+ AzerothCore , released under GNU AGPL v3 license, you may redistribute it + * and/or modify it under version 3 of the License, or (at your option), any later version. */ #ifndef _PLAYERBOT_ENHANCEMENTSHAMANSTRATEGY_H diff --git a/src/strategy/shaman/GenericShamanStrategy.cpp b/src/strategy/shaman/GenericShamanStrategy.cpp index 719767fab1..2df84edd57 100644 --- a/src/strategy/shaman/GenericShamanStrategy.cpp +++ b/src/strategy/shaman/GenericShamanStrategy.cpp @@ -1,6 +1,6 @@ /* - * Copyright (C) 2016+ AzerothCore , released under GNU GPL v2 license, you may redistribute it - * and/or modify it under version 2 of the License, or (at your option), any later version. + * Copyright (C) 2016+ AzerothCore , released under GNU AGPL v3 license, you may redistribute it + * and/or modify it under version 3 of the License, or (at your option), any later version. */ #include "GenericShamanStrategy.h" diff --git a/src/strategy/shaman/GenericShamanStrategy.h b/src/strategy/shaman/GenericShamanStrategy.h index fab343a083..953b09309f 100644 --- a/src/strategy/shaman/GenericShamanStrategy.h +++ b/src/strategy/shaman/GenericShamanStrategy.h @@ -1,6 +1,6 @@ /* - * Copyright (C) 2016+ AzerothCore , released under GNU GPL v2 license, you may redistribute it - * and/or modify it under version 2 of the License, or (at your option), any later version. + * Copyright (C) 2016+ AzerothCore , released under GNU AGPL v3 license, you may redistribute it + * and/or modify it under version 3 of the License, or (at your option), any later version. */ #ifndef _PLAYERBOT_GENERICSHAMANSTRATEGY_H diff --git a/src/strategy/shaman/RestoShamanStrategy.cpp b/src/strategy/shaman/RestoShamanStrategy.cpp index 60d8d70d5b..ea7476b475 100644 --- a/src/strategy/shaman/RestoShamanStrategy.cpp +++ b/src/strategy/shaman/RestoShamanStrategy.cpp @@ -1,6 +1,6 @@ /* - * Copyright (C) 2016+ AzerothCore , released under GNU GPL v2 license, you may redistribute it - * and/or modify it under version 2 of the License, or (at your option), any later version. + * Copyright (C) 2016+ AzerothCore , released under GNU AGPL v3 license, you may redistribute it + * and/or modify it under version 3 of the License, or (at your option), any later version. */ #include "RestoShamanStrategy.h" diff --git a/src/strategy/shaman/RestoShamanStrategy.h b/src/strategy/shaman/RestoShamanStrategy.h index 1b8d46d4ce..dc26d2ea68 100644 --- a/src/strategy/shaman/RestoShamanStrategy.h +++ b/src/strategy/shaman/RestoShamanStrategy.h @@ -1,6 +1,6 @@ /* - * Copyright (C) 2016+ AzerothCore , released under GNU GPL v2 license, you may redistribute it - * and/or modify it under version 2 of the License, or (at your option), any later version. + * Copyright (C) 2016+ AzerothCore , released under GNU AGPL v3 license, you may redistribute it + * and/or modify it under version 3 of the License, or (at your option), any later version. */ #ifndef _PLAYERBOT_RESTOSHAMANSTRATEGY_H diff --git a/src/strategy/shaman/ShamanActions.cpp b/src/strategy/shaman/ShamanActions.cpp index d4d0f98a51..52e1330948 100644 --- a/src/strategy/shaman/ShamanActions.cpp +++ b/src/strategy/shaman/ShamanActions.cpp @@ -1,6 +1,6 @@ /* - * Copyright (C) 2016+ AzerothCore , released under GNU GPL v2 license, you may redistribute it - * and/or modify it under version 2 of the License, or (at your option), any later version. + * Copyright (C) 2016+ AzerothCore , released under GNU AGPL v3 license, you may redistribute it + * and/or modify it under version 3 of the License, or (at your option), any later version. */ #include "ShamanActions.h" diff --git a/src/strategy/shaman/ShamanActions.h b/src/strategy/shaman/ShamanActions.h index 4d64bb1d2d..499c100b64 100644 --- a/src/strategy/shaman/ShamanActions.h +++ b/src/strategy/shaman/ShamanActions.h @@ -1,6 +1,6 @@ /* - * Copyright (C) 2016+ AzerothCore , released under GNU GPL v2 license, you may redistribute it - * and/or modify it under version 2 of the License, or (at your option), any later version. + * Copyright (C) 2016+ AzerothCore , released under GNU AGPL v3 license, you may redistribute it + * and/or modify it under version 3 of the License, or (at your option), any later version. */ #ifndef _PLAYERBOT_SHAMANACTIONS_H diff --git a/src/strategy/shaman/ShamanAiObjectContext.cpp b/src/strategy/shaman/ShamanAiObjectContext.cpp index 0c307f4404..dc7145e7fc 100644 --- a/src/strategy/shaman/ShamanAiObjectContext.cpp +++ b/src/strategy/shaman/ShamanAiObjectContext.cpp @@ -1,6 +1,6 @@ /* - * Copyright (C) 2016+ AzerothCore , released under GNU GPL v2 license, you may redistribute it - * and/or modify it under version 2 of the License, or (at your option), any later version. + * Copyright (C) 2016+ AzerothCore , released under GNU AGPL v3 license, you may redistribute it + * and/or modify it under version 3 of the License, or (at your option), any later version. */ #include "ShamanAiObjectContext.h" diff --git a/src/strategy/shaman/ShamanAiObjectContext.h b/src/strategy/shaman/ShamanAiObjectContext.h index d168f7afac..cb07ba6e64 100644 --- a/src/strategy/shaman/ShamanAiObjectContext.h +++ b/src/strategy/shaman/ShamanAiObjectContext.h @@ -1,6 +1,6 @@ /* - * Copyright (C) 2016+ AzerothCore , released under GNU GPL v2 license, you may redistribute it - * and/or modify it under version 2 of the License, or (at your option), any later version. + * Copyright (C) 2016+ AzerothCore , released under GNU AGPL v3 license, you may redistribute it + * and/or modify it under version 3 of the License, or (at your option), any later version. */ #ifndef _PLAYERBOT_SHAMANAIOBJECTCONTEXT_H diff --git a/src/strategy/shaman/ShamanNonCombatStrategy.cpp b/src/strategy/shaman/ShamanNonCombatStrategy.cpp index 0515bda03d..623b013e44 100644 --- a/src/strategy/shaman/ShamanNonCombatStrategy.cpp +++ b/src/strategy/shaman/ShamanNonCombatStrategy.cpp @@ -1,6 +1,6 @@ /* - * Copyright (C) 2016+ AzerothCore , released under GNU GPL v2 license, you may redistribute it - * and/or modify it under version 2 of the License, or (at your option), any later version. + * Copyright (C) 2016+ AzerothCore , released under GNU AGPL v3 license, you may redistribute it + * and/or modify it under version 3 of the License, or (at your option), any later version. */ #include "ShamanNonCombatStrategy.h" diff --git a/src/strategy/shaman/ShamanNonCombatStrategy.h b/src/strategy/shaman/ShamanNonCombatStrategy.h index bee40f2d38..9fc34e8b05 100644 --- a/src/strategy/shaman/ShamanNonCombatStrategy.h +++ b/src/strategy/shaman/ShamanNonCombatStrategy.h @@ -1,6 +1,6 @@ /* - * Copyright (C) 2016+ AzerothCore , released under GNU GPL v2 license, you may redistribute it - * and/or modify it under version 2 of the License, or (at your option), any later version. + * Copyright (C) 2016+ AzerothCore , released under GNU AGPL v3 license, you may redistribute it + * and/or modify it under version 3 of the License, or (at your option), any later version. */ #ifndef _PLAYERBOT_SHAMANNONCOMBATSTRATEGY_H diff --git a/src/strategy/shaman/ShamanTriggers.cpp b/src/strategy/shaman/ShamanTriggers.cpp index cdee870c05..44a9f75777 100644 --- a/src/strategy/shaman/ShamanTriggers.cpp +++ b/src/strategy/shaman/ShamanTriggers.cpp @@ -1,6 +1,6 @@ /* - * Copyright (C) 2016+ AzerothCore , released under GNU GPL v2 license, you may redistribute it - * and/or modify it under version 2 of the License, or (at your option), any later version. + * Copyright (C) 2016+ AzerothCore , released under GNU AGPL v3 license, you may redistribute it + * and/or modify it under version 3 of the License, or (at your option), any later version. */ #include "ShamanTriggers.h" diff --git a/src/strategy/shaman/ShamanTriggers.h b/src/strategy/shaman/ShamanTriggers.h index fa70bf409a..1e8ef8d533 100644 --- a/src/strategy/shaman/ShamanTriggers.h +++ b/src/strategy/shaman/ShamanTriggers.h @@ -1,6 +1,6 @@ /* - * Copyright (C) 2016+ AzerothCore , released under GNU GPL v2 license, you may redistribute it - * and/or modify it under version 2 of the License, or (at your option), any later version. + * Copyright (C) 2016+ AzerothCore , released under GNU AGPL v3 license, you may redistribute it + * and/or modify it under version 3 of the License, or (at your option), any later version. */ #ifndef _PLAYERBOT_SHAMANTRIGGERS_H diff --git a/src/strategy/shaman/TotemsShamanStrategy.cpp b/src/strategy/shaman/TotemsShamanStrategy.cpp index 604cfcfe8d..d9149b8c47 100644 --- a/src/strategy/shaman/TotemsShamanStrategy.cpp +++ b/src/strategy/shaman/TotemsShamanStrategy.cpp @@ -1,6 +1,6 @@ /* - * Copyright (C) 2016+ AzerothCore , released under GNU GPL v2 license, you may redistribute it - * and/or modify it under version 2 of the License, or (at your option), any later version. + * Copyright (C) 2016+ AzerothCore , released under GNU AGPL v3 license, you may redistribute it + * and/or modify it under version 3 of the License, or (at your option), any later version. */ #include "TotemsShamanStrategy.h" diff --git a/src/strategy/shaman/TotemsShamanStrategy.h b/src/strategy/shaman/TotemsShamanStrategy.h index 5bfb5e633f..6d36f4a271 100644 --- a/src/strategy/shaman/TotemsShamanStrategy.h +++ b/src/strategy/shaman/TotemsShamanStrategy.h @@ -1,6 +1,6 @@ /* - * Copyright (C) 2016+ AzerothCore , released under GNU GPL v2 license, you may redistribute it - * and/or modify it under version 2 of the License, or (at your option), any later version. + * Copyright (C) 2016+ AzerothCore , released under GNU AGPL v3 license, you may redistribute it + * and/or modify it under version 3 of the License, or (at your option), any later version. */ #ifndef _PLAYERBOT_TOTEMSSHAMANSTRATEGY_H diff --git a/src/strategy/triggers/BossAuraTriggers.cpp b/src/strategy/triggers/BossAuraTriggers.cpp index c1ce677a27..8d2520cf62 100644 --- a/src/strategy/triggers/BossAuraTriggers.cpp +++ b/src/strategy/triggers/BossAuraTriggers.cpp @@ -1,6 +1,6 @@ /* - * Copyright (C) 2016+ AzerothCore , released under GNU GPL v2 license, you may redistribute it - * and/or modify it under version 2 of the License, or (at your option), any later version. + * Copyright (C) 2016+ AzerothCore , released under GNU AGPL v3 license, you may redistribute it + * and/or modify it under version 3 of the License, or (at your option), any later version. */ #include "BossAuraTriggers.h" diff --git a/src/strategy/triggers/BossAuraTriggers.h b/src/strategy/triggers/BossAuraTriggers.h index 63e4002f30..86a0fa31fe 100644 --- a/src/strategy/triggers/BossAuraTriggers.h +++ b/src/strategy/triggers/BossAuraTriggers.h @@ -1,6 +1,6 @@ /* - * Copyright (C) 2016+ AzerothCore , released under GNU GPL v2 license, you may redistribute it - * and/or modify it under version 2 of the License, or (at your option), any later version. + * Copyright (C) 2016+ AzerothCore , released under GNU AGPL v3 license, you may redistribute it + * and/or modify it under version 3 of the License, or (at your option), any later version. */ #ifndef _PLAYERBOT_BOSSAURATRIGGERS_H diff --git a/src/strategy/triggers/ChatCommandTrigger.cpp b/src/strategy/triggers/ChatCommandTrigger.cpp index 6567b7aed5..3fd6d7325a 100644 --- a/src/strategy/triggers/ChatCommandTrigger.cpp +++ b/src/strategy/triggers/ChatCommandTrigger.cpp @@ -1,6 +1,6 @@ /* - * Copyright (C) 2016+ AzerothCore , released under GNU GPL v2 license, you may redistribute it - * and/or modify it under version 2 of the License, or (at your option), any later version. + * Copyright (C) 2016+ AzerothCore , released under GNU AGPL v3 license, you may redistribute it + * and/or modify it under version 3 of the License, or (at your option), any later version. */ #include "ChatCommandTrigger.h" diff --git a/src/strategy/triggers/ChatCommandTrigger.h b/src/strategy/triggers/ChatCommandTrigger.h index 599e7dcdf5..4131b0e423 100644 --- a/src/strategy/triggers/ChatCommandTrigger.h +++ b/src/strategy/triggers/ChatCommandTrigger.h @@ -1,6 +1,6 @@ /* - * Copyright (C) 2016+ AzerothCore , released under GNU GPL v2 license, you may redistribute it - * and/or modify it under version 2 of the License, or (at your option), any later version. + * Copyright (C) 2016+ AzerothCore , released under GNU AGPL v3 license, you may redistribute it + * and/or modify it under version 3 of the License, or (at your option), any later version. */ #ifndef _PLAYERBOT_CHATCOMMANDTRIGGER_H diff --git a/src/strategy/triggers/ChatTriggerContext.h b/src/strategy/triggers/ChatTriggerContext.h index a06a94a692..a299e32cc9 100644 --- a/src/strategy/triggers/ChatTriggerContext.h +++ b/src/strategy/triggers/ChatTriggerContext.h @@ -1,6 +1,6 @@ /* - * Copyright (C) 2016+ AzerothCore , released under GNU GPL v2 license, you may redistribute it - * and/or modify it under version 2 of the License, or (at your option), any later version. + * Copyright (C) 2016+ AzerothCore , released under GNU AGPL v3 license, you may redistribute it + * and/or modify it under version 3 of the License, or (at your option), any later version. */ #ifndef _PLAYERBOT_CHATTRIGGERCONTEXT_H diff --git a/src/strategy/triggers/CureTriggers.cpp b/src/strategy/triggers/CureTriggers.cpp index abd23022a7..f119441e10 100644 --- a/src/strategy/triggers/CureTriggers.cpp +++ b/src/strategy/triggers/CureTriggers.cpp @@ -1,6 +1,6 @@ /* - * Copyright (C) 2016+ AzerothCore , released under GNU GPL v2 license, you may redistribute it - * and/or modify it under version 2 of the License, or (at your option), any later version. + * Copyright (C) 2016+ AzerothCore , released under GNU AGPL v3 license, you may redistribute it + * and/or modify it under version 3 of the License, or (at your option), any later version. */ #include "CureTriggers.h" diff --git a/src/strategy/triggers/CureTriggers.h b/src/strategy/triggers/CureTriggers.h index 63e5d33949..208ee5ad80 100644 --- a/src/strategy/triggers/CureTriggers.h +++ b/src/strategy/triggers/CureTriggers.h @@ -1,6 +1,6 @@ /* - * Copyright (C) 2016+ AzerothCore , released under GNU GPL v2 license, you may redistribute it - * and/or modify it under version 2 of the License, or (at your option), any later version. + * Copyright (C) 2016+ AzerothCore , released under GNU AGPL v3 license, you may redistribute it + * and/or modify it under version 3 of the License, or (at your option), any later version. */ #ifndef _PLAYERBOT_CURETRIGGERS_H diff --git a/src/strategy/triggers/GenericTriggers.cpp b/src/strategy/triggers/GenericTriggers.cpp index 722d63a09b..988413b2f3 100644 --- a/src/strategy/triggers/GenericTriggers.cpp +++ b/src/strategy/triggers/GenericTriggers.cpp @@ -1,6 +1,6 @@ /* - * Copyright (C) 2016+ AzerothCore , released under GNU GPL v2 license, you may redistribute it - * and/or modify it under version 2 of the License, or (at your option), any later version. + * Copyright (C) 2016+ AzerothCore , released under GNU AGPL v3 license, you may redistribute it + * and/or modify it under version 3 of the License, or (at your option), any later version. */ #include "GenericTriggers.h" diff --git a/src/strategy/triggers/GenericTriggers.h b/src/strategy/triggers/GenericTriggers.h index d66641225c..5f03f8a134 100644 --- a/src/strategy/triggers/GenericTriggers.h +++ b/src/strategy/triggers/GenericTriggers.h @@ -1,6 +1,6 @@ /* - * Copyright (C) 2016+ AzerothCore , released under GNU GPL v2 license, you may redistribute it - * and/or modify it under version 2 of the License, or (at your option), any later version. + * Copyright (C) 2016+ AzerothCore , released under GNU AGPL v3 license, you may redistribute it + * and/or modify it under version 3 of the License, or (at your option), any later version. */ #ifndef _PLAYERBOT_GENERICTRIGGERS_H diff --git a/src/strategy/triggers/GuildTriggers.cpp b/src/strategy/triggers/GuildTriggers.cpp index a31f3a47fb..afa4055817 100644 --- a/src/strategy/triggers/GuildTriggers.cpp +++ b/src/strategy/triggers/GuildTriggers.cpp @@ -1,6 +1,6 @@ /* - * Copyright (C) 2016+ AzerothCore , released under GNU GPL v2 license, you may redistribute it - * and/or modify it under version 2 of the License, or (at your option), any later version. + * Copyright (C) 2016+ AzerothCore , released under GNU AGPL v3 license, you may redistribute it + * and/or modify it under version 3 of the License, or (at your option), any later version. */ #include "GuildTriggers.h" diff --git a/src/strategy/triggers/GuildTriggers.h b/src/strategy/triggers/GuildTriggers.h index 233a736b55..adbf730e79 100644 --- a/src/strategy/triggers/GuildTriggers.h +++ b/src/strategy/triggers/GuildTriggers.h @@ -1,6 +1,6 @@ /* - * Copyright (C) 2016+ AzerothCore , released under GNU GPL v2 license, you may redistribute it - * and/or modify it under version 2 of the License, or (at your option), any later version. + * Copyright (C) 2016+ AzerothCore , released under GNU AGPL v3 license, you may redistribute it + * and/or modify it under version 3 of the License, or (at your option), any later version. */ #ifndef _PLAYERBOT_GUILDTRIGGER_H diff --git a/src/strategy/triggers/HealthTriggers.cpp b/src/strategy/triggers/HealthTriggers.cpp index 3bc8d4f37b..9f0485b779 100644 --- a/src/strategy/triggers/HealthTriggers.cpp +++ b/src/strategy/triggers/HealthTriggers.cpp @@ -1,6 +1,6 @@ /* - * Copyright (C) 2016+ AzerothCore , released under GNU GPL v2 license, you may redistribute it - * and/or modify it under version 2 of the License, or (at your option), any later version. + * Copyright (C) 2016+ AzerothCore , released under GNU AGPL v3 license, you may redistribute it + * and/or modify it under version 3 of the License, or (at your option), any later version. */ #include "HealthTriggers.h" diff --git a/src/strategy/triggers/HealthTriggers.h b/src/strategy/triggers/HealthTriggers.h index 279bc3fe35..d8149bffdb 100644 --- a/src/strategy/triggers/HealthTriggers.h +++ b/src/strategy/triggers/HealthTriggers.h @@ -1,6 +1,6 @@ /* - * Copyright (C) 2016+ AzerothCore , released under GNU GPL v2 license, you may redistribute it - * and/or modify it under version 2 of the License, or (at your option), any later version. + * Copyright (C) 2016+ AzerothCore , released under GNU AGPL v3 license, you may redistribute it + * and/or modify it under version 3 of the License, or (at your option), any later version. */ #ifndef _PLAYERBOT_HEALTHTRIGGERS_H diff --git a/src/strategy/triggers/LfgTriggers.cpp b/src/strategy/triggers/LfgTriggers.cpp index aa170e2b52..7aa2bc4269 100644 --- a/src/strategy/triggers/LfgTriggers.cpp +++ b/src/strategy/triggers/LfgTriggers.cpp @@ -1,6 +1,6 @@ /* - * Copyright (C) 2016+ AzerothCore , released under GNU GPL v2 license, you may redistribute it - * and/or modify it under version 2 of the License, or (at your option), any later version. + * Copyright (C) 2016+ AzerothCore , released under GNU AGPL v3 license, you may redistribute it + * and/or modify it under version 3 of the License, or (at your option), any later version. */ #include "LfgTriggers.h" diff --git a/src/strategy/triggers/LfgTriggers.h b/src/strategy/triggers/LfgTriggers.h index 1c493b18f6..c1f79055aa 100644 --- a/src/strategy/triggers/LfgTriggers.h +++ b/src/strategy/triggers/LfgTriggers.h @@ -1,6 +1,6 @@ /* - * Copyright (C) 2016+ AzerothCore , released under GNU GPL v2 license, you may redistribute it - * and/or modify it under version 2 of the License, or (at your option), any later version. + * Copyright (C) 2016+ AzerothCore , released under GNU AGPL v3 license, you may redistribute it + * and/or modify it under version 3 of the License, or (at your option), any later version. */ #ifndef _PLAYERBOT_LFGTRIGGERS_H diff --git a/src/strategy/triggers/LootTriggers.cpp b/src/strategy/triggers/LootTriggers.cpp index 4ecf00fff3..f422f386ee 100644 --- a/src/strategy/triggers/LootTriggers.cpp +++ b/src/strategy/triggers/LootTriggers.cpp @@ -1,6 +1,6 @@ /* - * Copyright (C) 2016+ AzerothCore , released under GNU GPL v2 license, you may redistribute it - * and/or modify it under version 2 of the License, or (at your option), any later version. + * Copyright (C) 2016+ AzerothCore , released under GNU AGPL v3 license, you may redistribute it + * and/or modify it under version 3 of the License, or (at your option), any later version. */ #include "LootTriggers.h" diff --git a/src/strategy/triggers/LootTriggers.h b/src/strategy/triggers/LootTriggers.h index f9aedab860..f7c580b215 100644 --- a/src/strategy/triggers/LootTriggers.h +++ b/src/strategy/triggers/LootTriggers.h @@ -1,6 +1,6 @@ /* - * Copyright (C) 2016+ AzerothCore , released under GNU GPL v2 license, you may redistribute it - * and/or modify it under version 2 of the License, or (at your option), any later version. + * Copyright (C) 2016+ AzerothCore , released under GNU AGPL v3 license, you may redistribute it + * and/or modify it under version 3 of the License, or (at your option), any later version. */ #ifndef _PLAYERBOT_LOOTTRIGGERS_H diff --git a/src/strategy/triggers/PvpTriggers.cpp b/src/strategy/triggers/PvpTriggers.cpp index 7fe56ac8d7..f70ef1d7a3 100644 --- a/src/strategy/triggers/PvpTriggers.cpp +++ b/src/strategy/triggers/PvpTriggers.cpp @@ -1,6 +1,6 @@ /* - * Copyright (C) 2016+ AzerothCore , released under GNU GPL v2 license, you may redistribute it - * and/or modify it under version 2 of the License, or (at your option), any later version. + * Copyright (C) 2016+ AzerothCore , released under GNU AGPL v3 license, you may redistribute it + * and/or modify it under version 3 of the License, or (at your option), any later version. */ #include "PvpTriggers.h" diff --git a/src/strategy/triggers/PvpTriggers.h b/src/strategy/triggers/PvpTriggers.h index 9214cdf9f3..46e489a638 100644 --- a/src/strategy/triggers/PvpTriggers.h +++ b/src/strategy/triggers/PvpTriggers.h @@ -1,6 +1,6 @@ /* - * Copyright (C) 2016+ AzerothCore , released under GNU GPL v2 license, you may redistribute it - * and/or modify it under version 2 of the License, or (at your option), any later version. + * Copyright (C) 2016+ AzerothCore , released under GNU AGPL v3 license, you may redistribute it + * and/or modify it under version 3 of the License, or (at your option), any later version. */ #ifndef _PLAYERBOT_PVPTRIGGERS_H diff --git a/src/strategy/triggers/RangeTriggers.cpp b/src/strategy/triggers/RangeTriggers.cpp index e75f81f672..ee1266e607 100644 --- a/src/strategy/triggers/RangeTriggers.cpp +++ b/src/strategy/triggers/RangeTriggers.cpp @@ -1,6 +1,6 @@ /* - * Copyright (C) 2016+ AzerothCore , released under GNU GPL v2 license, you may redistribute it - * and/or modify it under version 2 of the License, or (at your option), any later version. + * Copyright (C) 2016+ AzerothCore , released under GNU AGPL v3 license, you may redistribute it + * and/or modify it under version 3 of the License, or (at your option), any later version. */ #include "RangeTriggers.h" diff --git a/src/strategy/triggers/RangeTriggers.h b/src/strategy/triggers/RangeTriggers.h index ed39a67829..cc320ad027 100644 --- a/src/strategy/triggers/RangeTriggers.h +++ b/src/strategy/triggers/RangeTriggers.h @@ -1,6 +1,6 @@ /* - * Copyright (C) 2016+ AzerothCore , released under GNU GPL v2 license, you may redistribute it - * and/or modify it under version 2 of the License, or (at your option), any later version. + * Copyright (C) 2016+ AzerothCore , released under GNU AGPL v3 license, you may redistribute it + * and/or modify it under version 3 of the License, or (at your option), any later version. */ #ifndef _PLAYERBOT_RANGETRIGGERS_H diff --git a/src/strategy/triggers/RpgTriggers.cpp b/src/strategy/triggers/RpgTriggers.cpp index 4fe38d724e..90a43679ce 100644 --- a/src/strategy/triggers/RpgTriggers.cpp +++ b/src/strategy/triggers/RpgTriggers.cpp @@ -1,6 +1,6 @@ /* - * Copyright (C) 2016+ AzerothCore , released under GNU GPL v2 license, you may redistribute it - * and/or modify it under version 2 of the License, or (at your option), any later version. + * Copyright (C) 2016+ AzerothCore , released under GNU AGPL v3 license, you may redistribute it + * and/or modify it under version 3 of the License, or (at your option), any later version. */ #include "RpgTriggers.h" diff --git a/src/strategy/triggers/RpgTriggers.h b/src/strategy/triggers/RpgTriggers.h index 59c7092cc8..ce8cd2c1ab 100644 --- a/src/strategy/triggers/RpgTriggers.h +++ b/src/strategy/triggers/RpgTriggers.h @@ -1,6 +1,6 @@ /* - * Copyright (C) 2016+ AzerothCore , released under GNU GPL v2 license, you may redistribute it - * and/or modify it under version 2 of the License, or (at your option), any later version. + * Copyright (C) 2016+ AzerothCore , released under GNU AGPL v3 license, you may redistribute it + * and/or modify it under version 3 of the License, or (at your option), any later version. */ #ifndef _PLAYERBOT_RPGTRIGGERS_H diff --git a/src/strategy/triggers/RtiTriggers.cpp b/src/strategy/triggers/RtiTriggers.cpp index 8ccd8b547f..bd83d09de5 100644 --- a/src/strategy/triggers/RtiTriggers.cpp +++ b/src/strategy/triggers/RtiTriggers.cpp @@ -1,6 +1,6 @@ /* - * Copyright (C) 2016+ AzerothCore , released under GNU GPL v2 license, you may redistribute it - * and/or modify it under version 2 of the License, or (at your option), any later version. + * Copyright (C) 2016+ AzerothCore , released under GNU AGPL v3 license, you may redistribute it + * and/or modify it under version 3 of the License, or (at your option), any later version. */ #include "RtiTriggers.h" diff --git a/src/strategy/triggers/RtiTriggers.h b/src/strategy/triggers/RtiTriggers.h index 2780af79bf..a8ecab4d93 100644 --- a/src/strategy/triggers/RtiTriggers.h +++ b/src/strategy/triggers/RtiTriggers.h @@ -1,6 +1,6 @@ /* - * Copyright (C) 2016+ AzerothCore , released under GNU GPL v2 license, you may redistribute it - * and/or modify it under version 2 of the License, or (at your option), any later version. + * Copyright (C) 2016+ AzerothCore , released under GNU AGPL v3 license, you may redistribute it + * and/or modify it under version 3 of the License, or (at your option), any later version. */ #ifndef _PLAYERBOT_RTITRIGGERS_H diff --git a/src/strategy/triggers/StuckTriggers.cpp b/src/strategy/triggers/StuckTriggers.cpp index 235cf7be6b..f0a54345a1 100644 --- a/src/strategy/triggers/StuckTriggers.cpp +++ b/src/strategy/triggers/StuckTriggers.cpp @@ -1,6 +1,6 @@ /* - * Copyright (C) 2016+ AzerothCore , released under GNU GPL v2 license, you may redistribute it - * and/or modify it under version 2 of the License, or (at your option), any later version. + * Copyright (C) 2016+ AzerothCore , released under GNU AGPL v3 license, you may redistribute it + * and/or modify it under version 3 of the License, or (at your option), any later version. */ #include "StuckTriggers.h" diff --git a/src/strategy/triggers/StuckTriggers.h b/src/strategy/triggers/StuckTriggers.h index 62434a343f..42edc9d168 100644 --- a/src/strategy/triggers/StuckTriggers.h +++ b/src/strategy/triggers/StuckTriggers.h @@ -1,6 +1,6 @@ /* - * Copyright (C) 2016+ AzerothCore , released under GNU GPL v2 license, you may redistribute it - * and/or modify it under version 2 of the License, or (at your option), any later version. + * Copyright (C) 2016+ AzerothCore , released under GNU AGPL v3 license, you may redistribute it + * and/or modify it under version 3 of the License, or (at your option), any later version. */ #ifndef _PLAYERBOT_STUCKTRIGGERS_H diff --git a/src/strategy/triggers/TravelTriggers.cpp b/src/strategy/triggers/TravelTriggers.cpp index 0aaa77a2cc..88dfbb2b4b 100644 --- a/src/strategy/triggers/TravelTriggers.cpp +++ b/src/strategy/triggers/TravelTriggers.cpp @@ -1,6 +1,6 @@ /* - * Copyright (C) 2016+ AzerothCore , released under GNU GPL v2 license, you may redistribute it - * and/or modify it under version 2 of the License, or (at your option), any later version. + * Copyright (C) 2016+ AzerothCore , released under GNU AGPL v3 license, you may redistribute it + * and/or modify it under version 3 of the License, or (at your option), any later version. */ #include "TravelTriggers.h" diff --git a/src/strategy/triggers/TravelTriggers.h b/src/strategy/triggers/TravelTriggers.h index b1874be94f..ce2e1467cc 100644 --- a/src/strategy/triggers/TravelTriggers.h +++ b/src/strategy/triggers/TravelTriggers.h @@ -1,6 +1,6 @@ /* - * Copyright (C) 2016+ AzerothCore , released under GNU GPL v2 license, you may redistribute it - * and/or modify it under version 2 of the License, or (at your option), any later version. + * Copyright (C) 2016+ AzerothCore , released under GNU AGPL v3 license, you may redistribute it + * and/or modify it under version 3 of the License, or (at your option), any later version. */ #ifndef _PLAYERBOT_TRAVELTRIGGERS_H diff --git a/src/strategy/triggers/TriggerContext.h b/src/strategy/triggers/TriggerContext.h index 984c1deab2..1323e65344 100644 --- a/src/strategy/triggers/TriggerContext.h +++ b/src/strategy/triggers/TriggerContext.h @@ -1,6 +1,6 @@ /* - * Copyright (C) 2016+ AzerothCore , released under GNU GPL v2 license, you may redistribute it - * and/or modify it under version 2 of the License, or (at your option), any later version. + * Copyright (C) 2016+ AzerothCore , released under GNU AGPL v3 license, you may redistribute it + * and/or modify it under version 3 of the License, or (at your option), any later version. */ #ifndef _PLAYERBOT_TRIGGERCONTEXT_H diff --git a/src/strategy/triggers/WithinAreaTrigger.cpp b/src/strategy/triggers/WithinAreaTrigger.cpp index 6d9cb3fc90..9baab08296 100644 --- a/src/strategy/triggers/WithinAreaTrigger.cpp +++ b/src/strategy/triggers/WithinAreaTrigger.cpp @@ -1,6 +1,6 @@ /* - * Copyright (C) 2016+ AzerothCore , released under GNU GPL v2 license, you may redistribute it - * and/or modify it under version 2 of the License, or (at your option), any later version. + * Copyright (C) 2016+ AzerothCore , released under GNU AGPL v3 license, you may redistribute it + * and/or modify it under version 3 of the License, or (at your option), any later version. */ #include "WithinAreaTrigger.h" diff --git a/src/strategy/triggers/WithinAreaTrigger.h b/src/strategy/triggers/WithinAreaTrigger.h index f4d041e971..1d428d9df6 100644 --- a/src/strategy/triggers/WithinAreaTrigger.h +++ b/src/strategy/triggers/WithinAreaTrigger.h @@ -1,6 +1,6 @@ /* - * Copyright (C) 2016+ AzerothCore , released under GNU GPL v2 license, you may redistribute it - * and/or modify it under version 2 of the License, or (at your option), any later version. + * Copyright (C) 2016+ AzerothCore , released under GNU AGPL v3 license, you may redistribute it + * and/or modify it under version 3 of the License, or (at your option), any later version. */ #ifndef _PLAYERBOT_WITHINAREATRIGGER_H diff --git a/src/strategy/triggers/WorldPacketTrigger.cpp b/src/strategy/triggers/WorldPacketTrigger.cpp index 638081a24c..0c9343ca9c 100644 --- a/src/strategy/triggers/WorldPacketTrigger.cpp +++ b/src/strategy/triggers/WorldPacketTrigger.cpp @@ -1,6 +1,6 @@ /* - * Copyright (C) 2016+ AzerothCore , released under GNU GPL v2 license, you may redistribute it - * and/or modify it under version 2 of the License, or (at your option), any later version. + * Copyright (C) 2016+ AzerothCore , released under GNU AGPL v3 license, you may redistribute it + * and/or modify it under version 3 of the License, or (at your option), any later version. */ #include "WorldPacketTrigger.h" diff --git a/src/strategy/triggers/WorldPacketTrigger.h b/src/strategy/triggers/WorldPacketTrigger.h index 7012f5dc24..6f98e37ace 100644 --- a/src/strategy/triggers/WorldPacketTrigger.h +++ b/src/strategy/triggers/WorldPacketTrigger.h @@ -1,6 +1,6 @@ /* - * Copyright (C) 2016+ AzerothCore , released under GNU GPL v2 license, you may redistribute it - * and/or modify it under version 2 of the License, or (at your option), any later version. + * Copyright (C) 2016+ AzerothCore , released under GNU AGPL v3 license, you may redistribute it + * and/or modify it under version 3 of the License, or (at your option), any later version. */ #ifndef _PLAYERBOT_WORLDPACKETTRIGGER_H diff --git a/src/strategy/triggers/WorldPacketTriggerContext.h b/src/strategy/triggers/WorldPacketTriggerContext.h index 5404a220de..0f7f4c6e86 100644 --- a/src/strategy/triggers/WorldPacketTriggerContext.h +++ b/src/strategy/triggers/WorldPacketTriggerContext.h @@ -1,6 +1,6 @@ /* - * Copyright (C) 2016+ AzerothCore , released under GNU GPL v2 license, you may redistribute it - * and/or modify it under version 2 of the License, or (at your option), any later version. + * Copyright (C) 2016+ AzerothCore , released under GNU AGPL v3 license, you may redistribute it + * and/or modify it under version 3 of the License, or (at your option), any later version. */ #ifndef _PLAYERBOT_WORLDPACKETTRIGGERCONTEXT_H diff --git a/src/strategy/values/ActiveSpellValue.cpp b/src/strategy/values/ActiveSpellValue.cpp index 9acc9cb6b8..132a6f8266 100644 --- a/src/strategy/values/ActiveSpellValue.cpp +++ b/src/strategy/values/ActiveSpellValue.cpp @@ -1,6 +1,6 @@ /* - * Copyright (C) 2016+ AzerothCore , released under GNU GPL v2 license, you may redistribute it - * and/or modify it under version 2 of the License, or (at your option), any later version. + * Copyright (C) 2016+ AzerothCore , released under GNU AGPL v3 license, you may redistribute it + * and/or modify it under version 3 of the License, or (at your option), any later version. */ #include "ActiveSpellValue.h" diff --git a/src/strategy/values/ActiveSpellValue.h b/src/strategy/values/ActiveSpellValue.h index 1460544286..50e1e58917 100644 --- a/src/strategy/values/ActiveSpellValue.h +++ b/src/strategy/values/ActiveSpellValue.h @@ -1,6 +1,6 @@ /* - * Copyright (C) 2016+ AzerothCore , released under GNU GPL v2 license, you may redistribute it - * and/or modify it under version 2 of the License, or (at your option), any later version. + * Copyright (C) 2016+ AzerothCore , released under GNU AGPL v3 license, you may redistribute it + * and/or modify it under version 3 of the License, or (at your option), any later version. */ #ifndef _PLAYERBOT_ACTIVESPELLVALUE_H diff --git a/src/strategy/values/AlwaysLootListValue.cpp b/src/strategy/values/AlwaysLootListValue.cpp index ebdc22f844..13a6aba2f8 100644 --- a/src/strategy/values/AlwaysLootListValue.cpp +++ b/src/strategy/values/AlwaysLootListValue.cpp @@ -1,6 +1,6 @@ /* - * Copyright (C) 2016+ AzerothCore , released under GNU GPL v2 license, you may redistribute it - * and/or modify it under version 2 of the License, or (at your option), any later version. + * Copyright (C) 2016+ AzerothCore , released under GNU AGPL v3 license, you may redistribute it + * and/or modify it under version 3 of the License, or (at your option), any later version. */ #include "AlwaysLootListValue.h" diff --git a/src/strategy/values/AlwaysLootListValue.h b/src/strategy/values/AlwaysLootListValue.h index 6fcdd99f35..d55df8772e 100644 --- a/src/strategy/values/AlwaysLootListValue.h +++ b/src/strategy/values/AlwaysLootListValue.h @@ -1,6 +1,6 @@ /* - * Copyright (C) 2016+ AzerothCore , released under GNU GPL v2 license, you may redistribute it - * and/or modify it under version 2 of the License, or (at your option), any later version. + * Copyright (C) 2016+ AzerothCore , released under GNU AGPL v3 license, you may redistribute it + * and/or modify it under version 3 of the License, or (at your option), any later version. */ #ifndef _PLAYERBOT_ALWAYSLOOTLISTVALUE_H diff --git a/src/strategy/values/AoeHealValues.cpp b/src/strategy/values/AoeHealValues.cpp index 76e72584d0..06f0002056 100644 --- a/src/strategy/values/AoeHealValues.cpp +++ b/src/strategy/values/AoeHealValues.cpp @@ -1,6 +1,6 @@ /* - * Copyright (C) 2016+ AzerothCore , released under GNU GPL v2 license, you may redistribute it - * and/or modify it under version 2 of the License, or (at your option), any later version. + * Copyright (C) 2016+ AzerothCore , released under GNU AGPL v3 license, you may redistribute it + * and/or modify it under version 3 of the License, or (at your option), any later version. */ #include "AoeHealValues.h" diff --git a/src/strategy/values/AoeHealValues.h b/src/strategy/values/AoeHealValues.h index 3315b7c1e2..b4c3ac956c 100644 --- a/src/strategy/values/AoeHealValues.h +++ b/src/strategy/values/AoeHealValues.h @@ -1,6 +1,6 @@ /* - * Copyright (C) 2016+ AzerothCore , released under GNU GPL v2 license, you may redistribute it - * and/or modify it under version 2 of the License, or (at your option), any later version. + * Copyright (C) 2016+ AzerothCore , released under GNU AGPL v3 license, you may redistribute it + * and/or modify it under version 3 of the License, or (at your option), any later version. */ #ifndef _PLAYERBOT_AOEHEALVALUES_H diff --git a/src/strategy/values/AoeValues.cpp b/src/strategy/values/AoeValues.cpp index 4f8a94b119..d46dcb816f 100644 --- a/src/strategy/values/AoeValues.cpp +++ b/src/strategy/values/AoeValues.cpp @@ -1,6 +1,6 @@ /* - * Copyright (C) 2016+ AzerothCore , released under GNU GPL v2 license, you may redistribute it - * and/or modify it under version 2 of the License, or (at your option), any later version. + * Copyright (C) 2016+ AzerothCore , released under GNU AGPL v3 license, you may redistribute it + * and/or modify it under version 3 of the License, or (at your option), any later version. */ #include "AoeValues.h" diff --git a/src/strategy/values/AoeValues.h b/src/strategy/values/AoeValues.h index 12b1ec6cfc..cefc1a10ca 100644 --- a/src/strategy/values/AoeValues.h +++ b/src/strategy/values/AoeValues.h @@ -1,6 +1,6 @@ /* - * Copyright (C) 2016+ AzerothCore , released under GNU GPL v2 license, you may redistribute it - * and/or modify it under version 2 of the License, or (at your option), any later version. + * Copyright (C) 2016+ AzerothCore , released under GNU AGPL v3 license, you may redistribute it + * and/or modify it under version 3 of the License, or (at your option), any later version. */ #ifndef _PLAYERBOT_AOEVALUES_H diff --git a/src/strategy/values/Arrow.cpp b/src/strategy/values/Arrow.cpp index 4245d6a663..15fc2e2959 100644 --- a/src/strategy/values/Arrow.cpp +++ b/src/strategy/values/Arrow.cpp @@ -1,6 +1,6 @@ /* - * Copyright (C) 2016+ AzerothCore , released under GNU GPL v2 license, you may redistribute it - * and/or modify it under version 2 of the License, or (at your option), any later version. + * Copyright (C) 2016+ AzerothCore , released under GNU AGPL v3 license, you may redistribute it + * and/or modify it under version 3 of the License, or (at your option), any later version. */ #include "Arrow.h" diff --git a/src/strategy/values/Arrow.h b/src/strategy/values/Arrow.h index cd090802bb..3e5a76b8fb 100644 --- a/src/strategy/values/Arrow.h +++ b/src/strategy/values/Arrow.h @@ -1,6 +1,6 @@ /* - * Copyright (C) 2016+ AzerothCore , released under GNU GPL v2 license, you may redistribute it - * and/or modify it under version 2 of the License, or (at your option), any later version. + * Copyright (C) 2016+ AzerothCore , released under GNU AGPL v3 license, you may redistribute it + * and/or modify it under version 3 of the License, or (at your option), any later version. */ #ifndef _PLAYERBOT_ARROW_H diff --git a/src/strategy/values/AttackerCountValues.cpp b/src/strategy/values/AttackerCountValues.cpp index 17ba456229..637fd72864 100644 --- a/src/strategy/values/AttackerCountValues.cpp +++ b/src/strategy/values/AttackerCountValues.cpp @@ -1,6 +1,6 @@ /* - * Copyright (C) 2016+ AzerothCore , released under GNU GPL v2 license, you may redistribute it - * and/or modify it under version 2 of the License, or (at your option), any later version. + * Copyright (C) 2016+ AzerothCore , released under GNU AGPL v3 license, you may redistribute it + * and/or modify it under version 3 of the License, or (at your option), any later version. */ #include "AttackerCountValues.h" diff --git a/src/strategy/values/AttackerCountValues.h b/src/strategy/values/AttackerCountValues.h index 2ee6290cfa..651c341538 100644 --- a/src/strategy/values/AttackerCountValues.h +++ b/src/strategy/values/AttackerCountValues.h @@ -1,6 +1,6 @@ /* - * Copyright (C) 2016+ AzerothCore , released under GNU GPL v2 license, you may redistribute it - * and/or modify it under version 2 of the License, or (at your option), any later version. + * Copyright (C) 2016+ AzerothCore , released under GNU AGPL v3 license, you may redistribute it + * and/or modify it under version 3 of the License, or (at your option), any later version. */ #ifndef _PLAYERBOT_ATTACKERCOUNTVALUES_H diff --git a/src/strategy/values/AttackerWithoutAuraTargetValue.cpp b/src/strategy/values/AttackerWithoutAuraTargetValue.cpp index 2c3de29976..c80ba5f68f 100644 --- a/src/strategy/values/AttackerWithoutAuraTargetValue.cpp +++ b/src/strategy/values/AttackerWithoutAuraTargetValue.cpp @@ -1,6 +1,6 @@ /* - * Copyright (C) 2016+ AzerothCore , released under GNU GPL v2 license, you may redistribute it - * and/or modify it under version 2 of the License, or (at your option), any later version. + * Copyright (C) 2016+ AzerothCore , released under GNU AGPL v3 license, you may redistribute it + * and/or modify it under version 3 of the License, or (at your option), any later version. */ #include "AttackerWithoutAuraTargetValue.h" diff --git a/src/strategy/values/AttackerWithoutAuraTargetValue.h b/src/strategy/values/AttackerWithoutAuraTargetValue.h index 7d7d066666..5f1a4aa6c8 100644 --- a/src/strategy/values/AttackerWithoutAuraTargetValue.h +++ b/src/strategy/values/AttackerWithoutAuraTargetValue.h @@ -1,6 +1,6 @@ /* - * Copyright (C) 2016+ AzerothCore , released under GNU GPL v2 license, you may redistribute it - * and/or modify it under version 2 of the License, or (at your option), any later version. + * Copyright (C) 2016+ AzerothCore , released under GNU AGPL v3 license, you may redistribute it + * and/or modify it under version 3 of the License, or (at your option), any later version. */ #ifndef _PLAYERBOT_ATTACKERWITHOUTAURATARGETVALUE_H diff --git a/src/strategy/values/AttackersValue.cpp b/src/strategy/values/AttackersValue.cpp index f94823a98c..745369a3b5 100644 --- a/src/strategy/values/AttackersValue.cpp +++ b/src/strategy/values/AttackersValue.cpp @@ -1,6 +1,6 @@ /* - * Copyright (C) 2016+ AzerothCore , released under GNU GPL v2 license, you may redistribute it - * and/or modify it under version 2 of the License, or (at your option), any later version. + * Copyright (C) 2016+ AzerothCore , released under GNU AGPL v3 license, you may redistribute it + * and/or modify it under version 3 of the License, or (at your option), any later version. */ #include "AttackersValue.h" diff --git a/src/strategy/values/AttackersValue.h b/src/strategy/values/AttackersValue.h index d2f69c27ad..906db92a88 100644 --- a/src/strategy/values/AttackersValue.h +++ b/src/strategy/values/AttackersValue.h @@ -1,6 +1,6 @@ /* - * Copyright (C) 2016+ AzerothCore , released under GNU GPL v2 license, you may redistribute it - * and/or modify it under version 2 of the License, or (at your option), any later version. + * Copyright (C) 2016+ AzerothCore , released under GNU AGPL v3 license, you may redistribute it + * and/or modify it under version 3 of the License, or (at your option), any later version. */ #ifndef _PLAYERBOT_ATTACKERSVALUE_H diff --git a/src/strategy/values/AvailableLootValue.cpp b/src/strategy/values/AvailableLootValue.cpp index a0506c4ac8..7f945d7e1e 100644 --- a/src/strategy/values/AvailableLootValue.cpp +++ b/src/strategy/values/AvailableLootValue.cpp @@ -1,6 +1,6 @@ /* - * Copyright (C) 2016+ AzerothCore , released under GNU GPL v2 license, you may redistribute it - * and/or modify it under version 2 of the License, or (at your option), any later version. + * Copyright (C) 2016+ AzerothCore , released under GNU AGPL v3 license, you may redistribute it + * and/or modify it under version 3 of the License, or (at your option), any later version. */ #include "AvailableLootValue.h" diff --git a/src/strategy/values/AvailableLootValue.h b/src/strategy/values/AvailableLootValue.h index 1ecea8fea3..4c2a62a849 100644 --- a/src/strategy/values/AvailableLootValue.h +++ b/src/strategy/values/AvailableLootValue.h @@ -1,6 +1,6 @@ /* - * Copyright (C) 2016+ AzerothCore , released under GNU GPL v2 license, you may redistribute it - * and/or modify it under version 2 of the License, or (at your option), any later version. + * Copyright (C) 2016+ AzerothCore , released under GNU AGPL v3 license, you may redistribute it + * and/or modify it under version 3 of the License, or (at your option), any later version. */ #ifndef _PLAYERBOT_AVAILABLELOOTVALUE_H diff --git a/src/strategy/values/BudgetValues.cpp b/src/strategy/values/BudgetValues.cpp index e6ee8c80ab..6ef51f5fdb 100644 --- a/src/strategy/values/BudgetValues.cpp +++ b/src/strategy/values/BudgetValues.cpp @@ -1,6 +1,6 @@ /* - * Copyright (C) 2016+ AzerothCore , released under GNU GPL v2 license, you may redistribute it - * and/or modify it under version 2 of the License, or (at your option), any later version. + * Copyright (C) 2016+ AzerothCore , released under GNU AGPL v3 license, you may redistribute it + * and/or modify it under version 3 of the License, or (at your option), any later version. */ #include "BudgetValues.h" diff --git a/src/strategy/values/BudgetValues.h b/src/strategy/values/BudgetValues.h index b1516953ef..024d4a4f1c 100644 --- a/src/strategy/values/BudgetValues.h +++ b/src/strategy/values/BudgetValues.h @@ -1,6 +1,6 @@ /* - * Copyright (C) 2016+ AzerothCore , released under GNU GPL v2 license, you may redistribute it - * and/or modify it under version 2 of the License, or (at your option), any later version. + * Copyright (C) 2016+ AzerothCore , released under GNU AGPL v3 license, you may redistribute it + * and/or modify it under version 3 of the License, or (at your option), any later version. */ #ifndef _PLAYERBOT_BUDGETVALUES_H diff --git a/src/strategy/values/CcTargetValue.cpp b/src/strategy/values/CcTargetValue.cpp index 5b91c239ad..c47151ddfd 100644 --- a/src/strategy/values/CcTargetValue.cpp +++ b/src/strategy/values/CcTargetValue.cpp @@ -1,6 +1,6 @@ /* - * Copyright (C) 2016+ AzerothCore , released under GNU GPL v2 license, you may redistribute it - * and/or modify it under version 2 of the License, or (at your option), any later version. + * Copyright (C) 2016+ AzerothCore , released under GNU AGPL v3 license, you may redistribute it + * and/or modify it under version 3 of the License, or (at your option), any later version. */ #include "CcTargetValue.h" diff --git a/src/strategy/values/CcTargetValue.h b/src/strategy/values/CcTargetValue.h index b77b5a0ae2..8bc0483fcf 100644 --- a/src/strategy/values/CcTargetValue.h +++ b/src/strategy/values/CcTargetValue.h @@ -1,6 +1,6 @@ /* - * Copyright (C) 2016+ AzerothCore , released under GNU GPL v2 license, you may redistribute it - * and/or modify it under version 2 of the License, or (at your option), any later version. + * Copyright (C) 2016+ AzerothCore , released under GNU AGPL v3 license, you may redistribute it + * and/or modify it under version 3 of the License, or (at your option), any later version. */ #ifndef _PLAYERBOT_CCTARGETVALUE_H diff --git a/src/strategy/values/ChatValue.h b/src/strategy/values/ChatValue.h index 6859374efd..af538fe184 100644 --- a/src/strategy/values/ChatValue.h +++ b/src/strategy/values/ChatValue.h @@ -1,6 +1,6 @@ /* - * Copyright (C) 2016+ AzerothCore , released under GNU GPL v2 license, you may redistribute it - * and/or modify it under version 2 of the License, or (at your option), any later version. + * Copyright (C) 2016+ AzerothCore , released under GNU AGPL v3 license, you may redistribute it + * and/or modify it under version 3 of the License, or (at your option), any later version. */ #ifndef _PLAYERBOT_CHATVALUE_H diff --git a/src/strategy/values/CollisionValue.cpp b/src/strategy/values/CollisionValue.cpp index 52ae8f06d2..7657742590 100644 --- a/src/strategy/values/CollisionValue.cpp +++ b/src/strategy/values/CollisionValue.cpp @@ -1,6 +1,6 @@ /* - * Copyright (C) 2016+ AzerothCore , released under GNU GPL v2 license, you may redistribute it - * and/or modify it under version 2 of the License, or (at your option), any later version. + * Copyright (C) 2016+ AzerothCore , released under GNU AGPL v3 license, you may redistribute it + * and/or modify it under version 3 of the License, or (at your option), any later version. */ #include "CollisionValue.h" diff --git a/src/strategy/values/CollisionValue.h b/src/strategy/values/CollisionValue.h index 84d322612c..91802f222e 100644 --- a/src/strategy/values/CollisionValue.h +++ b/src/strategy/values/CollisionValue.h @@ -1,6 +1,6 @@ /* - * Copyright (C) 2016+ AzerothCore , released under GNU GPL v2 license, you may redistribute it - * and/or modify it under version 2 of the License, or (at your option), any later version. + * Copyright (C) 2016+ AzerothCore , released under GNU AGPL v3 license, you may redistribute it + * and/or modify it under version 3 of the License, or (at your option), any later version. */ #ifndef _PLAYERBOT_COLLISIONVALUE_H diff --git a/src/strategy/values/CraftValue.h b/src/strategy/values/CraftValue.h index fea09a2148..d3311e6c8a 100644 --- a/src/strategy/values/CraftValue.h +++ b/src/strategy/values/CraftValue.h @@ -1,6 +1,6 @@ /* - * Copyright (C) 2016+ AzerothCore , released under GNU GPL v2 license, you may redistribute it - * and/or modify it under version 2 of the License, or (at your option), any later version. + * Copyright (C) 2016+ AzerothCore , released under GNU AGPL v3 license, you may redistribute it + * and/or modify it under version 3 of the License, or (at your option), any later version. */ #ifndef _PLAYERBOT_CRAFTVALUE_H diff --git a/src/strategy/values/CurrentCcTargetValue.cpp b/src/strategy/values/CurrentCcTargetValue.cpp index 2b1072077f..27b8100264 100644 --- a/src/strategy/values/CurrentCcTargetValue.cpp +++ b/src/strategy/values/CurrentCcTargetValue.cpp @@ -1,6 +1,6 @@ /* - * Copyright (C) 2016+ AzerothCore , released under GNU GPL v2 license, you may redistribute it - * and/or modify it under version 2 of the License, or (at your option), any later version. + * Copyright (C) 2016+ AzerothCore , released under GNU AGPL v3 license, you may redistribute it + * and/or modify it under version 3 of the License, or (at your option), any later version. */ #include "CurrentCcTargetValue.h" diff --git a/src/strategy/values/CurrentCcTargetValue.h b/src/strategy/values/CurrentCcTargetValue.h index 35e8c808a5..708b1d704b 100644 --- a/src/strategy/values/CurrentCcTargetValue.h +++ b/src/strategy/values/CurrentCcTargetValue.h @@ -1,6 +1,6 @@ /* - * Copyright (C) 2016+ AzerothCore , released under GNU GPL v2 license, you may redistribute it - * and/or modify it under version 2 of the License, or (at your option), any later version. + * Copyright (C) 2016+ AzerothCore , released under GNU AGPL v3 license, you may redistribute it + * and/or modify it under version 3 of the License, or (at your option), any later version. */ #ifndef _PLAYERBOT_CURRENTCCTARGETVALUE_H diff --git a/src/strategy/values/CurrentTargetValue.cpp b/src/strategy/values/CurrentTargetValue.cpp index 8a25de9c9d..2aa2fe110b 100644 --- a/src/strategy/values/CurrentTargetValue.cpp +++ b/src/strategy/values/CurrentTargetValue.cpp @@ -1,6 +1,6 @@ /* - * Copyright (C) 2016+ AzerothCore , released under GNU GPL v2 license, you may redistribute it - * and/or modify it under version 2 of the License, or (at your option), any later version. + * Copyright (C) 2016+ AzerothCore , released under GNU AGPL v3 license, you may redistribute it + * and/or modify it under version 3 of the License, or (at your option), any later version. */ #include "CurrentTargetValue.h" diff --git a/src/strategy/values/CurrentTargetValue.h b/src/strategy/values/CurrentTargetValue.h index f7f79dfa1e..3cfbb48638 100644 --- a/src/strategy/values/CurrentTargetValue.h +++ b/src/strategy/values/CurrentTargetValue.h @@ -1,6 +1,6 @@ /* - * Copyright (C) 2016+ AzerothCore , released under GNU GPL v2 license, you may redistribute it - * and/or modify it under version 2 of the License, or (at your option), any later version. + * Copyright (C) 2016+ AzerothCore , released under GNU AGPL v3 license, you may redistribute it + * and/or modify it under version 3 of the License, or (at your option), any later version. */ #ifndef _PLAYERBOT_CURRENTTARGETVALUE_H diff --git a/src/strategy/values/DistanceValue.cpp b/src/strategy/values/DistanceValue.cpp index 25cefe0aa1..2c1e818b54 100644 --- a/src/strategy/values/DistanceValue.cpp +++ b/src/strategy/values/DistanceValue.cpp @@ -1,6 +1,6 @@ /* - * Copyright (C) 2016+ AzerothCore , released under GNU GPL v2 license, you may redistribute it - * and/or modify it under version 2 of the License, or (at your option), any later version. + * Copyright (C) 2016+ AzerothCore , released under GNU AGPL v3 license, you may redistribute it + * and/or modify it under version 3 of the License, or (at your option), any later version. */ #include "DistanceValue.h" diff --git a/src/strategy/values/DistanceValue.h b/src/strategy/values/DistanceValue.h index c828173999..d5160f8cfb 100644 --- a/src/strategy/values/DistanceValue.h +++ b/src/strategy/values/DistanceValue.h @@ -1,6 +1,6 @@ /* - * Copyright (C) 2016+ AzerothCore , released under GNU GPL v2 license, you may redistribute it - * and/or modify it under version 2 of the License, or (at your option), any later version. + * Copyright (C) 2016+ AzerothCore , released under GNU AGPL v3 license, you may redistribute it + * and/or modify it under version 3 of the License, or (at your option), any later version. */ #ifndef _PLAYERBOT_DISTANCEVALUE_H diff --git a/src/strategy/values/DpsTargetValue.cpp b/src/strategy/values/DpsTargetValue.cpp index a6ad60afe0..55b47d7c01 100644 --- a/src/strategy/values/DpsTargetValue.cpp +++ b/src/strategy/values/DpsTargetValue.cpp @@ -1,6 +1,6 @@ /* - * Copyright (C) 2016+ AzerothCore , released under GNU GPL v2 license, you may redistribute it - * and/or modify it under version 2 of the License, or (at your option), any later version. + * Copyright (C) 2016+ AzerothCore , released under GNU AGPL v3 license, you may redistribute it + * and/or modify it under version 3 of the License, or (at your option), any later version. */ #include "DpsTargetValue.h" diff --git a/src/strategy/values/DpsTargetValue.h b/src/strategy/values/DpsTargetValue.h index bf5ad3b54d..f45a122db7 100644 --- a/src/strategy/values/DpsTargetValue.h +++ b/src/strategy/values/DpsTargetValue.h @@ -1,6 +1,6 @@ /* - * Copyright (C) 2016+ AzerothCore , released under GNU GPL v2 license, you may redistribute it - * and/or modify it under version 2 of the License, or (at your option), any later version. + * Copyright (C) 2016+ AzerothCore , released under GNU AGPL v3 license, you may redistribute it + * and/or modify it under version 3 of the License, or (at your option), any later version. */ #ifndef _PLAYERBOT_DPSTARGETVALUE_H diff --git a/src/strategy/values/DuelTargetValue.cpp b/src/strategy/values/DuelTargetValue.cpp index cd2cf24f37..51c2b8bed0 100644 --- a/src/strategy/values/DuelTargetValue.cpp +++ b/src/strategy/values/DuelTargetValue.cpp @@ -1,6 +1,6 @@ /* - * Copyright (C) 2016+ AzerothCore , released under GNU GPL v2 license, you may redistribute it - * and/or modify it under version 2 of the License, or (at your option), any later version. + * Copyright (C) 2016+ AzerothCore , released under GNU AGPL v3 license, you may redistribute it + * and/or modify it under version 3 of the License, or (at your option), any later version. */ #include "DuelTargetValue.h" diff --git a/src/strategy/values/DuelTargetValue.h b/src/strategy/values/DuelTargetValue.h index 0ba67af81f..ca310fd64c 100644 --- a/src/strategy/values/DuelTargetValue.h +++ b/src/strategy/values/DuelTargetValue.h @@ -1,6 +1,6 @@ /* - * Copyright (C) 2016+ AzerothCore , released under GNU GPL v2 license, you may redistribute it - * and/or modify it under version 2 of the License, or (at your option), any later version. + * Copyright (C) 2016+ AzerothCore , released under GNU AGPL v3 license, you may redistribute it + * and/or modify it under version 3 of the License, or (at your option), any later version. */ #ifndef _PLAYERBOT_DUELTARGETVALUE_H diff --git a/src/strategy/values/EnemyHealerTargetValue.cpp b/src/strategy/values/EnemyHealerTargetValue.cpp index ebc761c074..6040c4fcb5 100644 --- a/src/strategy/values/EnemyHealerTargetValue.cpp +++ b/src/strategy/values/EnemyHealerTargetValue.cpp @@ -1,6 +1,6 @@ /* - * Copyright (C) 2016+ AzerothCore , released under GNU GPL v2 license, you may redistribute it - * and/or modify it under version 2 of the License, or (at your option), any later version. + * Copyright (C) 2016+ AzerothCore , released under GNU AGPL v3 license, you may redistribute it + * and/or modify it under version 3 of the License, or (at your option), any later version. */ #include "EnemyHealerTargetValue.h" diff --git a/src/strategy/values/EnemyHealerTargetValue.h b/src/strategy/values/EnemyHealerTargetValue.h index ad0599baf8..57aec6d164 100644 --- a/src/strategy/values/EnemyHealerTargetValue.h +++ b/src/strategy/values/EnemyHealerTargetValue.h @@ -1,6 +1,6 @@ /* - * Copyright (C) 2016+ AzerothCore , released under GNU GPL v2 license, you may redistribute it - * and/or modify it under version 2 of the License, or (at your option), any later version. + * Copyright (C) 2016+ AzerothCore , released under GNU AGPL v3 license, you may redistribute it + * and/or modify it under version 3 of the License, or (at your option), any later version. */ #ifndef _PLAYERBOT_ENEMYHEALERTARGETVALUE_H diff --git a/src/strategy/values/EnemyPlayerValue.cpp b/src/strategy/values/EnemyPlayerValue.cpp index 3bc1b28bbf..9c2a413042 100644 --- a/src/strategy/values/EnemyPlayerValue.cpp +++ b/src/strategy/values/EnemyPlayerValue.cpp @@ -1,6 +1,6 @@ /* - * Copyright (C) 2016+ AzerothCore , released under GNU GPL v2 license, you may redistribute it - * and/or modify it under version 2 of the License, or (at your option), any later version. + * Copyright (C) 2016+ AzerothCore , released under GNU AGPL v3 license, you may redistribute it + * and/or modify it under version 3 of the License, or (at your option), any later version. */ #include "EnemyPlayerValue.h" diff --git a/src/strategy/values/EnemyPlayerValue.h b/src/strategy/values/EnemyPlayerValue.h index 90957e3ddc..f94f20265f 100644 --- a/src/strategy/values/EnemyPlayerValue.h +++ b/src/strategy/values/EnemyPlayerValue.h @@ -1,6 +1,6 @@ /* - * Copyright (C) 2016+ AzerothCore , released under GNU GPL v2 license, you may redistribute it - * and/or modify it under version 2 of the License, or (at your option), any later version. + * Copyright (C) 2016+ AzerothCore , released under GNU AGPL v3 license, you may redistribute it + * and/or modify it under version 3 of the License, or (at your option), any later version. */ #ifndef _PLAYERBOT_ENEMYPLAYERVALUE_H diff --git a/src/strategy/values/EstimatedLifetimeValue.h b/src/strategy/values/EstimatedLifetimeValue.h index f050ac717a..c412068ec1 100644 --- a/src/strategy/values/EstimatedLifetimeValue.h +++ b/src/strategy/values/EstimatedLifetimeValue.h @@ -1,6 +1,6 @@ /* - * Copyright (C) 2016+ AzerothCore , released under GNU GPL v2 license, you may redistribute it - * and/or modify it under version 2 of the License, or (at your option), any later version. + * Copyright (C) 2016+ AzerothCore , released under GNU AGPL v3 license, you may redistribute it + * and/or modify it under version 3 of the License, or (at your option), any later version. */ #ifndef _PLAYERBOT_EstimatedLifetimeValue_H diff --git a/src/strategy/values/Formations.cpp b/src/strategy/values/Formations.cpp index 27e1c99ea2..21c43f402a 100644 --- a/src/strategy/values/Formations.cpp +++ b/src/strategy/values/Formations.cpp @@ -1,6 +1,6 @@ /* - * Copyright (C) 2016+ AzerothCore , released under GNU GPL v2 license, you may redistribute it - * and/or modify it under version 2 of the License, or (at your option), any later version. + * Copyright (C) 2016+ AzerothCore , released under GNU AGPL v3 license, you may redistribute it + * and/or modify it under version 3 of the License, or (at your option), any later version. */ #include "Formations.h" diff --git a/src/strategy/values/Formations.h b/src/strategy/values/Formations.h index beff6210f6..c44e1d0f42 100644 --- a/src/strategy/values/Formations.h +++ b/src/strategy/values/Formations.h @@ -1,6 +1,6 @@ /* - * Copyright (C) 2016+ AzerothCore , released under GNU GPL v2 license, you may redistribute it - * and/or modify it under version 2 of the License, or (at your option), any later version. + * Copyright (C) 2016+ AzerothCore , released under GNU AGPL v3 license, you may redistribute it + * and/or modify it under version 3 of the License, or (at your option), any later version. */ #ifndef _PLAYERBOT_FORMATIONS_H diff --git a/src/strategy/values/GrindTargetValue.cpp b/src/strategy/values/GrindTargetValue.cpp index cd368741ab..d1d7f912ca 100644 --- a/src/strategy/values/GrindTargetValue.cpp +++ b/src/strategy/values/GrindTargetValue.cpp @@ -1,6 +1,6 @@ /* - * Copyright (C) 2016+ AzerothCore , released under GNU GPL v2 license, you may redistribute it - * and/or modify it under version 2 of the License, or (at your option), any later version. + * Copyright (C) 2016+ AzerothCore , released under GNU AGPL v3 license, you may redistribute it + * and/or modify it under version 3 of the License, or (at your option), any later version. */ #include "GrindTargetValue.h" diff --git a/src/strategy/values/GrindTargetValue.h b/src/strategy/values/GrindTargetValue.h index bf26763f55..587037eb17 100644 --- a/src/strategy/values/GrindTargetValue.h +++ b/src/strategy/values/GrindTargetValue.h @@ -1,6 +1,6 @@ /* - * Copyright (C) 2016+ AzerothCore , released under GNU GPL v2 license, you may redistribute it - * and/or modify it under version 2 of the License, or (at your option), any later version. + * Copyright (C) 2016+ AzerothCore , released under GNU AGPL v3 license, you may redistribute it + * and/or modify it under version 3 of the License, or (at your option), any later version. */ #ifndef _PLAYERBOT_GRINDTARGETVALUE_H diff --git a/src/strategy/values/GroupValues.cpp b/src/strategy/values/GroupValues.cpp index 397bf86baf..f9cb21028e 100644 --- a/src/strategy/values/GroupValues.cpp +++ b/src/strategy/values/GroupValues.cpp @@ -1,6 +1,6 @@ /* - * Copyright (C) 2016+ AzerothCore , released under GNU GPL v2 license, you may redistribute it - * and/or modify it under version 2 of the License, or (at your option), any later version. + * Copyright (C) 2016+ AzerothCore , released under GNU AGPL v3 license, you may redistribute it + * and/or modify it under version 3 of the License, or (at your option), any later version. */ #include "GroupValues.h" diff --git a/src/strategy/values/GroupValues.h b/src/strategy/values/GroupValues.h index b59a1d514e..ba0473003e 100644 --- a/src/strategy/values/GroupValues.h +++ b/src/strategy/values/GroupValues.h @@ -1,6 +1,6 @@ /* - * Copyright (C) 2016+ AzerothCore , released under GNU GPL v2 license, you may redistribute it - * and/or modify it under version 2 of the License, or (at your option), any later version. + * Copyright (C) 2016+ AzerothCore , released under GNU AGPL v3 license, you may redistribute it + * and/or modify it under version 3 of the License, or (at your option), any later version. */ #include "NamedObjectContext.h" diff --git a/src/strategy/values/GuildValues.cpp b/src/strategy/values/GuildValues.cpp index 3be92adcf7..27d54f968f 100644 --- a/src/strategy/values/GuildValues.cpp +++ b/src/strategy/values/GuildValues.cpp @@ -1,6 +1,6 @@ /* - * Copyright (C) 2016+ AzerothCore , released under GNU GPL v2 license, you may redistribute it - * and/or modify it under version 2 of the License, or (at your option), any later version. + * Copyright (C) 2016+ AzerothCore , released under GNU AGPL v3 license, you may redistribute it + * and/or modify it under version 3 of the License, or (at your option), any later version. */ #include "GuildValues.h" diff --git a/src/strategy/values/GuildValues.h b/src/strategy/values/GuildValues.h index aa07def110..ece61bc42f 100644 --- a/src/strategy/values/GuildValues.h +++ b/src/strategy/values/GuildValues.h @@ -1,6 +1,6 @@ /* - * Copyright (C) 2016+ AzerothCore , released under GNU GPL v2 license, you may redistribute it - * and/or modify it under version 2 of the License, or (at your option), any later version. + * Copyright (C) 2016+ AzerothCore , released under GNU AGPL v3 license, you may redistribute it + * and/or modify it under version 3 of the License, or (at your option), any later version. */ #ifndef _PLAYERBOT_GUILDVALUES_H diff --git a/src/strategy/values/HasAvailableLootValue.cpp b/src/strategy/values/HasAvailableLootValue.cpp index 091bf62d6c..d687e1fc41 100644 --- a/src/strategy/values/HasAvailableLootValue.cpp +++ b/src/strategy/values/HasAvailableLootValue.cpp @@ -1,6 +1,6 @@ /* - * Copyright (C) 2016+ AzerothCore , released under GNU GPL v2 license, you may redistribute it - * and/or modify it under version 2 of the License, or (at your option), any later version. + * Copyright (C) 2016+ AzerothCore , released under GNU AGPL v3 license, you may redistribute it + * and/or modify it under version 3 of the License, or (at your option), any later version. */ #include "HasAvailableLootValue.h" diff --git a/src/strategy/values/HasAvailableLootValue.h b/src/strategy/values/HasAvailableLootValue.h index dafd8e5c87..9b8200b562 100644 --- a/src/strategy/values/HasAvailableLootValue.h +++ b/src/strategy/values/HasAvailableLootValue.h @@ -1,6 +1,6 @@ /* - * Copyright (C) 2016+ AzerothCore , released under GNU GPL v2 license, you may redistribute it - * and/or modify it under version 2 of the License, or (at your option), any later version. + * Copyright (C) 2016+ AzerothCore , released under GNU AGPL v3 license, you may redistribute it + * and/or modify it under version 3 of the License, or (at your option), any later version. */ #ifndef _PLAYERBOT_HASAVAILABLELOOTVALUE_H diff --git a/src/strategy/values/HasTotemValue.cpp b/src/strategy/values/HasTotemValue.cpp index 052369ebad..94a51837e0 100644 --- a/src/strategy/values/HasTotemValue.cpp +++ b/src/strategy/values/HasTotemValue.cpp @@ -1,6 +1,6 @@ /* - * Copyright (C) 2016+ AzerothCore , released under GNU GPL v2 license, you may redistribute it - * and/or modify it under version 2 of the License, or (at your option), any later version. + * Copyright (C) 2016+ AzerothCore , released under GNU AGPL v3 license, you may redistribute it + * and/or modify it under version 3 of the License, or (at your option), any later version. */ #include "HasTotemValue.h" diff --git a/src/strategy/values/HasTotemValue.h b/src/strategy/values/HasTotemValue.h index 84d49bca8a..a43d8f2046 100644 --- a/src/strategy/values/HasTotemValue.h +++ b/src/strategy/values/HasTotemValue.h @@ -1,6 +1,6 @@ /* - * Copyright (C) 2016+ AzerothCore , released under GNU GPL v2 license, you may redistribute it - * and/or modify it under version 2 of the License, or (at your option), any later version. + * Copyright (C) 2016+ AzerothCore , released under GNU AGPL v3 license, you may redistribute it + * and/or modify it under version 3 of the License, or (at your option), any later version. */ #ifndef _PLAYERBOT_HASTOTEMVALUE_H diff --git a/src/strategy/values/InvalidTargetValue.cpp b/src/strategy/values/InvalidTargetValue.cpp index b6f943a1f8..50f7a3864e 100644 --- a/src/strategy/values/InvalidTargetValue.cpp +++ b/src/strategy/values/InvalidTargetValue.cpp @@ -1,6 +1,6 @@ /* - * Copyright (C) 2016+ AzerothCore , released under GNU GPL v2 license, you may redistribute it - * and/or modify it under version 2 of the License, or (at your option), any later version. + * Copyright (C) 2016+ AzerothCore , released under GNU AGPL v3 license, you may redistribute it + * and/or modify it under version 3 of the License, or (at your option), any later version. */ #include "InvalidTargetValue.h" diff --git a/src/strategy/values/InvalidTargetValue.h b/src/strategy/values/InvalidTargetValue.h index 0d7c563a05..bc105dd7b4 100644 --- a/src/strategy/values/InvalidTargetValue.h +++ b/src/strategy/values/InvalidTargetValue.h @@ -1,6 +1,6 @@ /* - * Copyright (C) 2016+ AzerothCore , released under GNU GPL v2 license, you may redistribute it - * and/or modify it under version 2 of the License, or (at your option), any later version. + * Copyright (C) 2016+ AzerothCore , released under GNU AGPL v3 license, you may redistribute it + * and/or modify it under version 3 of the License, or (at your option), any later version. */ #ifndef _PLAYERBOT_INVALIDTARGETVALUE_H diff --git a/src/strategy/values/IsBehindValue.cpp b/src/strategy/values/IsBehindValue.cpp index 80feef3641..e23506288a 100644 --- a/src/strategy/values/IsBehindValue.cpp +++ b/src/strategy/values/IsBehindValue.cpp @@ -1,6 +1,6 @@ /* - * Copyright (C) 2016+ AzerothCore , released under GNU GPL v2 license, you may redistribute it - * and/or modify it under version 2 of the License, or (at your option), any later version. + * Copyright (C) 2016+ AzerothCore , released under GNU AGPL v3 license, you may redistribute it + * and/or modify it under version 3 of the License, or (at your option), any later version. */ #include "IsBehindValue.h" diff --git a/src/strategy/values/IsBehindValue.h b/src/strategy/values/IsBehindValue.h index 3f121f1921..bf09898eee 100644 --- a/src/strategy/values/IsBehindValue.h +++ b/src/strategy/values/IsBehindValue.h @@ -1,6 +1,6 @@ /* - * Copyright (C) 2016+ AzerothCore , released under GNU GPL v2 license, you may redistribute it - * and/or modify it under version 2 of the License, or (at your option), any later version. + * Copyright (C) 2016+ AzerothCore , released under GNU AGPL v3 license, you may redistribute it + * and/or modify it under version 3 of the License, or (at your option), any later version. */ #ifndef _PLAYERBOT_ISBEHINDVALUE_H diff --git a/src/strategy/values/IsFacingValue.cpp b/src/strategy/values/IsFacingValue.cpp index c3e62586c5..aee5aa6ebf 100644 --- a/src/strategy/values/IsFacingValue.cpp +++ b/src/strategy/values/IsFacingValue.cpp @@ -1,6 +1,6 @@ /* - * Copyright (C) 2016+ AzerothCore , released under GNU GPL v2 license, you may redistribute it - * and/or modify it under version 2 of the License, or (at your option), any later version. + * Copyright (C) 2016+ AzerothCore , released under GNU AGPL v3 license, you may redistribute it + * and/or modify it under version 3 of the License, or (at your option), any later version. */ #include "IsFacingValue.h" diff --git a/src/strategy/values/IsFacingValue.h b/src/strategy/values/IsFacingValue.h index 95e4606590..1e6a368642 100644 --- a/src/strategy/values/IsFacingValue.h +++ b/src/strategy/values/IsFacingValue.h @@ -1,6 +1,6 @@ /* - * Copyright (C) 2016+ AzerothCore , released under GNU GPL v2 license, you may redistribute it - * and/or modify it under version 2 of the License, or (at your option), any later version. + * Copyright (C) 2016+ AzerothCore , released under GNU AGPL v3 license, you may redistribute it + * and/or modify it under version 3 of the License, or (at your option), any later version. */ #ifndef _PLAYERBOT_ISFACINGVALUE_H diff --git a/src/strategy/values/IsMovingValue.cpp b/src/strategy/values/IsMovingValue.cpp index 2a03043ced..452bda0e4f 100644 --- a/src/strategy/values/IsMovingValue.cpp +++ b/src/strategy/values/IsMovingValue.cpp @@ -1,6 +1,6 @@ /* - * Copyright (C) 2016+ AzerothCore , released under GNU GPL v2 license, you may redistribute it - * and/or modify it under version 2 of the License, or (at your option), any later version. + * Copyright (C) 2016+ AzerothCore , released under GNU AGPL v3 license, you may redistribute it + * and/or modify it under version 3 of the License, or (at your option), any later version. */ #include "IsMovingValue.h" diff --git a/src/strategy/values/IsMovingValue.h b/src/strategy/values/IsMovingValue.h index c9a31189e5..fa68693a65 100644 --- a/src/strategy/values/IsMovingValue.h +++ b/src/strategy/values/IsMovingValue.h @@ -1,6 +1,6 @@ /* - * Copyright (C) 2016+ AzerothCore , released under GNU GPL v2 license, you may redistribute it - * and/or modify it under version 2 of the License, or (at your option), any later version. + * Copyright (C) 2016+ AzerothCore , released under GNU AGPL v3 license, you may redistribute it + * and/or modify it under version 3 of the License, or (at your option), any later version. */ #ifndef _PLAYERBOT_ISMOVINGVALUE_H diff --git a/src/strategy/values/ItemCountValue.cpp b/src/strategy/values/ItemCountValue.cpp index d17d9e7cd3..2c719d8f4d 100644 --- a/src/strategy/values/ItemCountValue.cpp +++ b/src/strategy/values/ItemCountValue.cpp @@ -1,6 +1,6 @@ /* - * Copyright (C) 2016+ AzerothCore , released under GNU GPL v2 license, you may redistribute it - * and/or modify it under version 2 of the License, or (at your option), any later version. + * Copyright (C) 2016+ AzerothCore , released under GNU AGPL v3 license, you may redistribute it + * and/or modify it under version 3 of the License, or (at your option), any later version. */ #include "ItemCountValue.h" diff --git a/src/strategy/values/ItemCountValue.h b/src/strategy/values/ItemCountValue.h index de04ec432c..6f7c593b23 100644 --- a/src/strategy/values/ItemCountValue.h +++ b/src/strategy/values/ItemCountValue.h @@ -1,6 +1,6 @@ /* - * Copyright (C) 2016+ AzerothCore , released under GNU GPL v2 license, you may redistribute it - * and/or modify it under version 2 of the License, or (at your option), any later version. + * Copyright (C) 2016+ AzerothCore , released under GNU AGPL v3 license, you may redistribute it + * and/or modify it under version 3 of the License, or (at your option), any later version. */ #ifndef _PLAYERBOT_ITEMCOUNTVALUE_H diff --git a/src/strategy/values/ItemForSpellValue.cpp b/src/strategy/values/ItemForSpellValue.cpp index 366f38a587..e14549da41 100644 --- a/src/strategy/values/ItemForSpellValue.cpp +++ b/src/strategy/values/ItemForSpellValue.cpp @@ -1,6 +1,6 @@ /* - * Copyright (C) 2016+ AzerothCore , released under GNU GPL v2 license, you may redistribute it - * and/or modify it under version 2 of the License, or (at your option), any later version. + * Copyright (C) 2016+ AzerothCore , released under GNU AGPL v3 license, you may redistribute it + * and/or modify it under version 3 of the License, or (at your option), any later version. */ #include "ItemForSpellValue.h" diff --git a/src/strategy/values/ItemForSpellValue.h b/src/strategy/values/ItemForSpellValue.h index a2a2a2bd53..ea7a52bcd2 100644 --- a/src/strategy/values/ItemForSpellValue.h +++ b/src/strategy/values/ItemForSpellValue.h @@ -1,6 +1,6 @@ /* - * Copyright (C) 2016+ AzerothCore , released under GNU GPL v2 license, you may redistribute it - * and/or modify it under version 2 of the License, or (at your option), any later version. + * Copyright (C) 2016+ AzerothCore , released under GNU AGPL v3 license, you may redistribute it + * and/or modify it under version 3 of the License, or (at your option), any later version. */ #ifndef _PLAYERBOT_ITEMFORSPELLVALUE_H diff --git a/src/strategy/values/ItemUsageValue.cpp b/src/strategy/values/ItemUsageValue.cpp index 60001ed57e..e6dc5cb84b 100644 --- a/src/strategy/values/ItemUsageValue.cpp +++ b/src/strategy/values/ItemUsageValue.cpp @@ -1,6 +1,6 @@ /* - * Copyright (C) 2016+ AzerothCore , released under GNU GPL v2 license, you may redistribute it - * and/or modify it under version 2 of the License, or (at your option), any later version. + * Copyright (C) 2016+ AzerothCore , released under GNU AGPL v3 license, you may redistribute it + * and/or modify it under version 3 of the License, or (at your option), any later version. */ #include "ItemUsageValue.h" diff --git a/src/strategy/values/ItemUsageValue.h b/src/strategy/values/ItemUsageValue.h index b1c32d13be..d50ea1b060 100644 --- a/src/strategy/values/ItemUsageValue.h +++ b/src/strategy/values/ItemUsageValue.h @@ -1,6 +1,6 @@ /* - * Copyright (C) 2016+ AzerothCore , released under GNU GPL v2 license, you may redistribute it - * and/or modify it under version 2 of the License, or (at your option), any later version. + * Copyright (C) 2016+ AzerothCore , released under GNU AGPL v3 license, you may redistribute it + * and/or modify it under version 3 of the License, or (at your option), any later version. */ #ifndef _PLAYERBOT_ITEMUSAGEVALUE_H diff --git a/src/strategy/values/LastMovementValue.cpp b/src/strategy/values/LastMovementValue.cpp index 72acfee4ef..ba54020e39 100644 --- a/src/strategy/values/LastMovementValue.cpp +++ b/src/strategy/values/LastMovementValue.cpp @@ -1,6 +1,6 @@ /* - * Copyright (C) 2016+ AzerothCore , released under GNU GPL v2 license, you may redistribute it - * and/or modify it under version 2 of the License, or (at your option), any later version. + * Copyright (C) 2016+ AzerothCore , released under GNU AGPL v3 license, you may redistribute it + * and/or modify it under version 3 of the License, or (at your option), any later version. */ #include "LastMovementValue.h" diff --git a/src/strategy/values/LastMovementValue.h b/src/strategy/values/LastMovementValue.h index f3ecf916e8..ef09d31fe3 100644 --- a/src/strategy/values/LastMovementValue.h +++ b/src/strategy/values/LastMovementValue.h @@ -1,6 +1,6 @@ /* - * Copyright (C) 2016+ AzerothCore , released under GNU GPL v2 license, you may redistribute it - * and/or modify it under version 2 of the License, or (at your option), any later version. + * Copyright (C) 2016+ AzerothCore , released under GNU AGPL v3 license, you may redistribute it + * and/or modify it under version 3 of the License, or (at your option), any later version. */ #ifndef _PLAYERBOT_LASTMOVEMENTVALUE_H diff --git a/src/strategy/values/LastSaidValue.h b/src/strategy/values/LastSaidValue.h index 6e498a9687..4430558662 100644 --- a/src/strategy/values/LastSaidValue.h +++ b/src/strategy/values/LastSaidValue.h @@ -1,6 +1,6 @@ /* - * Copyright (C) 2016+ AzerothCore , released under GNU GPL v2 license, you may redistribute it - * and/or modify it under version 2 of the License, or (at your option), any later version. + * Copyright (C) 2016+ AzerothCore , released under GNU AGPL v3 license, you may redistribute it + * and/or modify it under version 3 of the License, or (at your option), any later version. */ #ifndef _PLAYERBOT_LASTSAIDVALUE_H diff --git a/src/strategy/values/LastSpellCastTimeValue.h b/src/strategy/values/LastSpellCastTimeValue.h index 86cf1aba0a..984ed80320 100644 --- a/src/strategy/values/LastSpellCastTimeValue.h +++ b/src/strategy/values/LastSpellCastTimeValue.h @@ -1,6 +1,6 @@ /* - * Copyright (C) 2016+ AzerothCore , released under GNU GPL v2 license, you may redistribute it - * and/or modify it under version 2 of the License, or (at your option), any later version. + * Copyright (C) 2016+ AzerothCore , released under GNU AGPL v3 license, you may redistribute it + * and/or modify it under version 3 of the License, or (at your option), any later version. */ #ifndef _PLAYERBOT_LASTSPELLCASTTIMEVALUE_H diff --git a/src/strategy/values/LastSpellCastValue.cpp b/src/strategy/values/LastSpellCastValue.cpp index 5c8914c466..ff8d6eadd4 100644 --- a/src/strategy/values/LastSpellCastValue.cpp +++ b/src/strategy/values/LastSpellCastValue.cpp @@ -1,6 +1,6 @@ /* - * Copyright (C) 2016+ AzerothCore , released under GNU GPL v2 license, you may redistribute it - * and/or modify it under version 2 of the License, or (at your option), any later version. + * Copyright (C) 2016+ AzerothCore , released under GNU AGPL v3 license, you may redistribute it + * and/or modify it under version 3 of the License, or (at your option), any later version. */ #include "LastSpellCastValue.h" diff --git a/src/strategy/values/LastSpellCastValue.h b/src/strategy/values/LastSpellCastValue.h index ecfda769d0..fda18e8b60 100644 --- a/src/strategy/values/LastSpellCastValue.h +++ b/src/strategy/values/LastSpellCastValue.h @@ -1,6 +1,6 @@ /* - * Copyright (C) 2016+ AzerothCore , released under GNU GPL v2 license, you may redistribute it - * and/or modify it under version 2 of the License, or (at your option), any later version. + * Copyright (C) 2016+ AzerothCore , released under GNU AGPL v3 license, you may redistribute it + * and/or modify it under version 3 of the License, or (at your option), any later version. */ #ifndef _PLAYERBOT_LASTSPELLCASTVALUE_H diff --git a/src/strategy/values/LeastHpTargetValue.cpp b/src/strategy/values/LeastHpTargetValue.cpp index 36f9b7eb54..8b9f1a55fc 100644 --- a/src/strategy/values/LeastHpTargetValue.cpp +++ b/src/strategy/values/LeastHpTargetValue.cpp @@ -1,6 +1,6 @@ /* - * Copyright (C) 2016+ AzerothCore , released under GNU GPL v2 license, you may redistribute it - * and/or modify it under version 2 of the License, or (at your option), any later version. + * Copyright (C) 2016+ AzerothCore , released under GNU AGPL v3 license, you may redistribute it + * and/or modify it under version 3 of the License, or (at your option), any later version. */ #include "LeastHpTargetValue.h" diff --git a/src/strategy/values/LeastHpTargetValue.h b/src/strategy/values/LeastHpTargetValue.h index ba3fdaf701..01f40656bc 100644 --- a/src/strategy/values/LeastHpTargetValue.h +++ b/src/strategy/values/LeastHpTargetValue.h @@ -1,6 +1,6 @@ /* - * Copyright (C) 2016+ AzerothCore , released under GNU GPL v2 license, you may redistribute it - * and/or modify it under version 2 of the License, or (at your option), any later version. + * Copyright (C) 2016+ AzerothCore , released under GNU AGPL v3 license, you may redistribute it + * and/or modify it under version 3 of the License, or (at your option), any later version. */ #ifndef _PLAYERBOT_LEASTHPTARGETVALUE_H diff --git a/src/strategy/values/LfgValues.h b/src/strategy/values/LfgValues.h index c387ddca83..d6ff5c9906 100644 --- a/src/strategy/values/LfgValues.h +++ b/src/strategy/values/LfgValues.h @@ -1,6 +1,6 @@ /* - * Copyright (C) 2016+ AzerothCore , released under GNU GPL v2 license, you may redistribute it - * and/or modify it under version 2 of the License, or (at your option), any later version. + * Copyright (C) 2016+ AzerothCore , released under GNU AGPL v3 license, you may redistribute it + * and/or modify it under version 3 of the License, or (at your option), any later version. */ #ifndef _PLAYERBOT_LFGVALUES_H diff --git a/src/strategy/values/LineTargetValue.cpp b/src/strategy/values/LineTargetValue.cpp index 06055998de..e06311cc86 100644 --- a/src/strategy/values/LineTargetValue.cpp +++ b/src/strategy/values/LineTargetValue.cpp @@ -1,6 +1,6 @@ /* - * Copyright (C) 2016+ AzerothCore , released under GNU GPL v2 license, you may redistribute it - * and/or modify it under version 2 of the License, or (at your option), any later version. + * Copyright (C) 2016+ AzerothCore , released under GNU AGPL v3 license, you may redistribute it + * and/or modify it under version 3 of the License, or (at your option), any later version. */ #include "LineTargetValue.h" diff --git a/src/strategy/values/LineTargetValue.h b/src/strategy/values/LineTargetValue.h index 2f10ffb08d..6f1d1c532e 100644 --- a/src/strategy/values/LineTargetValue.h +++ b/src/strategy/values/LineTargetValue.h @@ -1,6 +1,6 @@ /* - * Copyright (C) 2016+ AzerothCore , released under GNU GPL v2 license, you may redistribute it - * and/or modify it under version 2 of the License, or (at your option), any later version. + * Copyright (C) 2016+ AzerothCore , released under GNU AGPL v3 license, you may redistribute it + * and/or modify it under version 3 of the License, or (at your option), any later version. */ #ifndef _PLAYERBOT_LINETARGETVALUE_H diff --git a/src/strategy/values/LogLevelValue.h b/src/strategy/values/LogLevelValue.h index 2abe016d53..18fdbddcee 100644 --- a/src/strategy/values/LogLevelValue.h +++ b/src/strategy/values/LogLevelValue.h @@ -1,6 +1,6 @@ /* - * Copyright (C) 2016+ AzerothCore , released under GNU GPL v2 license, you may redistribute it - * and/or modify it under version 2 of the License, or (at your option), any later version. + * Copyright (C) 2016+ AzerothCore , released under GNU AGPL v3 license, you may redistribute it + * and/or modify it under version 3 of the License, or (at your option), any later version. */ #ifndef _PLAYERBOT_LOGLEVELVALUE_H diff --git a/src/strategy/values/LootStrategyValue.cpp b/src/strategy/values/LootStrategyValue.cpp index 22355d4654..6a4f9b9b48 100644 --- a/src/strategy/values/LootStrategyValue.cpp +++ b/src/strategy/values/LootStrategyValue.cpp @@ -1,6 +1,6 @@ /* - * Copyright (C) 2016+ AzerothCore , released under GNU GPL v2 license, you may redistribute it - * and/or modify it under version 2 of the License, or (at your option), any later version. + * Copyright (C) 2016+ AzerothCore , released under GNU AGPL v3 license, you may redistribute it + * and/or modify it under version 3 of the License, or (at your option), any later version. */ #include "LootStrategyValue.h" diff --git a/src/strategy/values/LootStrategyValue.h b/src/strategy/values/LootStrategyValue.h index aeb7ce385f..dc3f94cc71 100644 --- a/src/strategy/values/LootStrategyValue.h +++ b/src/strategy/values/LootStrategyValue.h @@ -1,6 +1,6 @@ /* - * Copyright (C) 2016+ AzerothCore , released under GNU GPL v2 license, you may redistribute it - * and/or modify it under version 2 of the License, or (at your option), any later version. + * Copyright (C) 2016+ AzerothCore , released under GNU AGPL v3 license, you may redistribute it + * and/or modify it under version 3 of the License, or (at your option), any later version. */ #ifndef _PLAYERBOT_LOOTSTRATEGYVALUE_H diff --git a/src/strategy/values/LootValues.cpp b/src/strategy/values/LootValues.cpp index abf5a0a328..45cb6a6499 100644 --- a/src/strategy/values/LootValues.cpp +++ b/src/strategy/values/LootValues.cpp @@ -1,6 +1,6 @@ /* - * Copyright (C) 2016+ AzerothCore , released under GNU GPL v2 license, you may redistribute it - * and/or modify it under version 2 of the License, or (at your option), any later version. + * Copyright (C) 2016+ AzerothCore , released under GNU AGPL v3 license, you may redistribute it + * and/or modify it under version 3 of the License, or (at your option), any later version. */ #include "LootValues.h" diff --git a/src/strategy/values/LootValues.h b/src/strategy/values/LootValues.h index cec3599b8d..7945f3f401 100644 --- a/src/strategy/values/LootValues.h +++ b/src/strategy/values/LootValues.h @@ -1,6 +1,6 @@ /* - * Copyright (C) 2016+ AzerothCore , released under GNU GPL v2 license, you may redistribute it - * and/or modify it under version 2 of the License, or (at your option), any later version. + * Copyright (C) 2016+ AzerothCore , released under GNU AGPL v3 license, you may redistribute it + * and/or modify it under version 3 of the License, or (at your option), any later version. */ #ifndef _PLAYERBOT_LOOTVALUES_H diff --git a/src/strategy/values/MaintenanceValues.cpp b/src/strategy/values/MaintenanceValues.cpp index 2693dbb72a..6439bef288 100644 --- a/src/strategy/values/MaintenanceValues.cpp +++ b/src/strategy/values/MaintenanceValues.cpp @@ -1,6 +1,6 @@ /* - * Copyright (C) 2016+ AzerothCore , released under GNU GPL v2 license, you may redistribute it - * and/or modify it under version 2 of the License, or (at your option), any later version. + * Copyright (C) 2016+ AzerothCore , released under GNU AGPL v3 license, you may redistribute it + * and/or modify it under version 3 of the License, or (at your option), any later version. */ #include "MaintenanceValues.h" diff --git a/src/strategy/values/MaintenanceValues.h b/src/strategy/values/MaintenanceValues.h index 0c552fdef2..5916f7aaef 100644 --- a/src/strategy/values/MaintenanceValues.h +++ b/src/strategy/values/MaintenanceValues.h @@ -1,6 +1,6 @@ /* - * Copyright (C) 2016+ AzerothCore , released under GNU GPL v2 license, you may redistribute it - * and/or modify it under version 2 of the License, or (at your option), any later version. + * Copyright (C) 2016+ AzerothCore , released under GNU AGPL v3 license, you may redistribute it + * and/or modify it under version 3 of the License, or (at your option), any later version. */ #ifndef _PLAYERBOT_MAINTANCEVALUE_H diff --git a/src/strategy/values/ManaSaveLevelValue.h b/src/strategy/values/ManaSaveLevelValue.h index ced8bddc8d..f406998f16 100644 --- a/src/strategy/values/ManaSaveLevelValue.h +++ b/src/strategy/values/ManaSaveLevelValue.h @@ -1,6 +1,6 @@ /* - * Copyright (C) 2016+ AzerothCore , released under GNU GPL v2 license, you may redistribute it - * and/or modify it under version 2 of the License, or (at your option), any later version. + * Copyright (C) 2016+ AzerothCore , released under GNU AGPL v3 license, you may redistribute it + * and/or modify it under version 3 of the License, or (at your option), any later version. */ #ifndef _PLAYERBOT_MANASAVELEVELVALUE_H diff --git a/src/strategy/values/MasterTargetValue.cpp b/src/strategy/values/MasterTargetValue.cpp index a22410224d..6fddb6d99b 100644 --- a/src/strategy/values/MasterTargetValue.cpp +++ b/src/strategy/values/MasterTargetValue.cpp @@ -1,6 +1,6 @@ /* - * Copyright (C) 2016+ AzerothCore , released under GNU GPL v2 license, you may redistribute it - * and/or modify it under version 2 of the License, or (at your option), any later version. + * Copyright (C) 2016+ AzerothCore , released under GNU AGPL v3 license, you may redistribute it + * and/or modify it under version 3 of the License, or (at your option), any later version. */ #include "MasterTargetValue.h" diff --git a/src/strategy/values/MasterTargetValue.h b/src/strategy/values/MasterTargetValue.h index 512db8fac8..a9f8f781df 100644 --- a/src/strategy/values/MasterTargetValue.h +++ b/src/strategy/values/MasterTargetValue.h @@ -1,6 +1,6 @@ /* - * Copyright (C) 2016+ AzerothCore , released under GNU GPL v2 license, you may redistribute it - * and/or modify it under version 2 of the License, or (at your option), any later version. + * Copyright (C) 2016+ AzerothCore , released under GNU AGPL v3 license, you may redistribute it + * and/or modify it under version 3 of the License, or (at your option), any later version. */ #ifndef _PLAYERBOT_MASTERTARGETVALUE_H diff --git a/src/strategy/values/NearestAdsValue.cpp b/src/strategy/values/NearestAdsValue.cpp index 35ae587eb2..17e9876814 100644 --- a/src/strategy/values/NearestAdsValue.cpp +++ b/src/strategy/values/NearestAdsValue.cpp @@ -1,6 +1,6 @@ /* - * Copyright (C) 2016+ AzerothCore , released under GNU GPL v2 license, you may redistribute it - * and/or modify it under version 2 of the License, or (at your option), any later version. + * Copyright (C) 2016+ AzerothCore , released under GNU AGPL v3 license, you may redistribute it + * and/or modify it under version 3 of the License, or (at your option), any later version. */ #include "NearestAdsValue.h" diff --git a/src/strategy/values/NearestAdsValue.h b/src/strategy/values/NearestAdsValue.h index d422c7b616..312d5596eb 100644 --- a/src/strategy/values/NearestAdsValue.h +++ b/src/strategy/values/NearestAdsValue.h @@ -1,6 +1,6 @@ /* - * Copyright (C) 2016+ AzerothCore , released under GNU GPL v2 license, you may redistribute it - * and/or modify it under version 2 of the License, or (at your option), any later version. + * Copyright (C) 2016+ AzerothCore , released under GNU AGPL v3 license, you may redistribute it + * and/or modify it under version 3 of the License, or (at your option), any later version. */ #ifndef _PLAYERBOT_NEARESTADSVALUE_H diff --git a/src/strategy/values/NearestCorpsesValue.cpp b/src/strategy/values/NearestCorpsesValue.cpp index 59fe3167ec..fec1aed21f 100644 --- a/src/strategy/values/NearestCorpsesValue.cpp +++ b/src/strategy/values/NearestCorpsesValue.cpp @@ -1,6 +1,6 @@ /* - * Copyright (C) 2016+ AzerothCore , released under GNU GPL v2 license, you may redistribute it - * and/or modify it under version 2 of the License, or (at your option), any later version. + * Copyright (C) 2016+ AzerothCore , released under GNU AGPL v3 license, you may redistribute it + * and/or modify it under version 3 of the License, or (at your option), any later version. */ #include "NearestCorpsesValue.h" diff --git a/src/strategy/values/NearestCorpsesValue.h b/src/strategy/values/NearestCorpsesValue.h index 6453bb09f3..4c0716e299 100644 --- a/src/strategy/values/NearestCorpsesValue.h +++ b/src/strategy/values/NearestCorpsesValue.h @@ -1,6 +1,6 @@ /* - * Copyright (C) 2016+ AzerothCore , released under GNU GPL v2 license, you may redistribute it - * and/or modify it under version 2 of the License, or (at your option), any later version. + * Copyright (C) 2016+ AzerothCore , released under GNU AGPL v3 license, you may redistribute it + * and/or modify it under version 3 of the License, or (at your option), any later version. */ #ifndef _PLAYERBOT_NEARESTCORPSESVALUE_H diff --git a/src/strategy/values/NearestFriendlyPlayersValue.cpp b/src/strategy/values/NearestFriendlyPlayersValue.cpp index f8f92ad0ad..b28072cdb1 100644 --- a/src/strategy/values/NearestFriendlyPlayersValue.cpp +++ b/src/strategy/values/NearestFriendlyPlayersValue.cpp @@ -1,6 +1,6 @@ /* - * Copyright (C) 2016+ AzerothCore , released under GNU GPL v2 license, you may redistribute it - * and/or modify it under version 2 of the License, or (at your option), any later version. + * Copyright (C) 2016+ AzerothCore , released under GNU AGPL v3 license, you may redistribute it + * and/or modify it under version 3 of the License, or (at your option), any later version. */ #include "NearestFriendlyPlayersValue.h" diff --git a/src/strategy/values/NearestFriendlyPlayersValue.h b/src/strategy/values/NearestFriendlyPlayersValue.h index aeee26116b..9876316929 100644 --- a/src/strategy/values/NearestFriendlyPlayersValue.h +++ b/src/strategy/values/NearestFriendlyPlayersValue.h @@ -1,6 +1,6 @@ /* - * Copyright (C) 2016+ AzerothCore , released under GNU GPL v2 license, you may redistribute it - * and/or modify it under version 2 of the License, or (at your option), any later version. + * Copyright (C) 2016+ AzerothCore , released under GNU AGPL v3 license, you may redistribute it + * and/or modify it under version 3 of the License, or (at your option), any later version. */ #ifndef _PLAYERBOT_NEARESTFRIENDLYPLAYERSVALUES_H diff --git a/src/strategy/values/NearestGameObjects.cpp b/src/strategy/values/NearestGameObjects.cpp index 131c730fd3..b5aa2de787 100644 --- a/src/strategy/values/NearestGameObjects.cpp +++ b/src/strategy/values/NearestGameObjects.cpp @@ -1,6 +1,6 @@ /* - * Copyright (C) 2016+ AzerothCore , released under GNU GPL v2 license, you may redistribute it - * and/or modify it under version 2 of the License, or (at your option), any later version. + * Copyright (C) 2016+ AzerothCore , released under GNU AGPL v3 license, you may redistribute it + * and/or modify it under version 3 of the License, or (at your option), any later version. */ #include "NearestGameObjects.h" diff --git a/src/strategy/values/NearestGameObjects.h b/src/strategy/values/NearestGameObjects.h index e29467d875..2018e93eb1 100644 --- a/src/strategy/values/NearestGameObjects.h +++ b/src/strategy/values/NearestGameObjects.h @@ -1,6 +1,6 @@ /* - * Copyright (C) 2016+ AzerothCore , released under GNU GPL v2 license, you may redistribute it - * and/or modify it under version 2 of the License, or (at your option), any later version. + * Copyright (C) 2016+ AzerothCore , released under GNU AGPL v3 license, you may redistribute it + * and/or modify it under version 3 of the License, or (at your option), any later version. */ #ifndef _PLAYERBOT_NEARESTGAMEOBJECTS_H diff --git a/src/strategy/values/NearestNonBotPlayersValue.cpp b/src/strategy/values/NearestNonBotPlayersValue.cpp index 1fb7236053..862a9a7e37 100644 --- a/src/strategy/values/NearestNonBotPlayersValue.cpp +++ b/src/strategy/values/NearestNonBotPlayersValue.cpp @@ -1,6 +1,6 @@ /* - * Copyright (C) 2016+ AzerothCore , released under GNU GPL v2 license, you may redistribute it - * and/or modify it under version 2 of the License, or (at your option), any later version. + * Copyright (C) 2016+ AzerothCore , released under GNU AGPL v3 license, you may redistribute it + * and/or modify it under version 3 of the License, or (at your option), any later version. */ #include "NearestNonBotPlayersValue.h" diff --git a/src/strategy/values/NearestNonBotPlayersValue.h b/src/strategy/values/NearestNonBotPlayersValue.h index 87971203c4..73d522c5fb 100644 --- a/src/strategy/values/NearestNonBotPlayersValue.h +++ b/src/strategy/values/NearestNonBotPlayersValue.h @@ -1,6 +1,6 @@ /* - * Copyright (C) 2016+ AzerothCore , released under GNU GPL v2 license, you may redistribute it - * and/or modify it under version 2 of the License, or (at your option), any later version. + * Copyright (C) 2016+ AzerothCore , released under GNU AGPL v3 license, you may redistribute it + * and/or modify it under version 3 of the License, or (at your option), any later version. */ #ifndef _PLAYERBOT_NEARESTNONBOTPLAYERSVALUE_H diff --git a/src/strategy/values/NearestNpcsValue.cpp b/src/strategy/values/NearestNpcsValue.cpp index b2b510da50..1c188d2980 100644 --- a/src/strategy/values/NearestNpcsValue.cpp +++ b/src/strategy/values/NearestNpcsValue.cpp @@ -1,6 +1,6 @@ /* - * Copyright (C) 2016+ AzerothCore , released under GNU GPL v2 license, you may redistribute it - * and/or modify it under version 2 of the License, or (at your option), any later version. + * Copyright (C) 2016+ AzerothCore , released under GNU AGPL v3 license, you may redistribute it + * and/or modify it under version 3 of the License, or (at your option), any later version. */ #include "NearestNpcsValue.h" diff --git a/src/strategy/values/NearestNpcsValue.h b/src/strategy/values/NearestNpcsValue.h index 9e192c577c..6935026147 100644 --- a/src/strategy/values/NearestNpcsValue.h +++ b/src/strategy/values/NearestNpcsValue.h @@ -1,6 +1,6 @@ /* - * Copyright (C) 2016+ AzerothCore , released under GNU GPL v2 license, you may redistribute it - * and/or modify it under version 2 of the License, or (at your option), any later version. + * Copyright (C) 2016+ AzerothCore , released under GNU AGPL v3 license, you may redistribute it + * and/or modify it under version 3 of the License, or (at your option), any later version. */ #ifndef _PLAYERBOT_NEARESTNPCSVALUE_H diff --git a/src/strategy/values/NearestUnitsValue.cpp b/src/strategy/values/NearestUnitsValue.cpp index d19605fa1c..04505a1d93 100644 --- a/src/strategy/values/NearestUnitsValue.cpp +++ b/src/strategy/values/NearestUnitsValue.cpp @@ -1,6 +1,6 @@ /* - * Copyright (C) 2016+ AzerothCore , released under GNU GPL v2 license, you may redistribute it - * and/or modify it under version 2 of the License, or (at your option), any later version. + * Copyright (C) 2016+ AzerothCore , released under GNU AGPL v3 license, you may redistribute it + * and/or modify it under version 3 of the License, or (at your option), any later version. */ #include "NearestUnitsValue.h" diff --git a/src/strategy/values/NearestUnitsValue.h b/src/strategy/values/NearestUnitsValue.h index f56ab6acd5..527925a0d7 100644 --- a/src/strategy/values/NearestUnitsValue.h +++ b/src/strategy/values/NearestUnitsValue.h @@ -1,6 +1,6 @@ /* - * Copyright (C) 2016+ AzerothCore , released under GNU GPL v2 license, you may redistribute it - * and/or modify it under version 2 of the License, or (at your option), any later version. + * Copyright (C) 2016+ AzerothCore , released under GNU AGPL v3 license, you may redistribute it + * and/or modify it under version 3 of the License, or (at your option), any later version. */ #ifndef _PLAYERBOT_NEARESTUNITSVALUE_H diff --git a/src/strategy/values/NewPlayerNearbyValue.cpp b/src/strategy/values/NewPlayerNearbyValue.cpp index 17d683122c..39343ea258 100644 --- a/src/strategy/values/NewPlayerNearbyValue.cpp +++ b/src/strategy/values/NewPlayerNearbyValue.cpp @@ -1,6 +1,6 @@ /* - * Copyright (C) 2016+ AzerothCore , released under GNU GPL v2 license, you may redistribute it - * and/or modify it under version 2 of the License, or (at your option), any later version. + * Copyright (C) 2016+ AzerothCore , released under GNU AGPL v3 license, you may redistribute it + * and/or modify it under version 3 of the License, or (at your option), any later version. */ #include "NewPlayerNearbyValue.h" diff --git a/src/strategy/values/NewPlayerNearbyValue.h b/src/strategy/values/NewPlayerNearbyValue.h index 8cb5048af3..e26ec0dcbd 100644 --- a/src/strategy/values/NewPlayerNearbyValue.h +++ b/src/strategy/values/NewPlayerNearbyValue.h @@ -1,6 +1,6 @@ /* - * Copyright (C) 2016+ AzerothCore , released under GNU GPL v2 license, you may redistribute it - * and/or modify it under version 2 of the License, or (at your option), any later version. + * Copyright (C) 2016+ AzerothCore , released under GNU AGPL v3 license, you may redistribute it + * and/or modify it under version 3 of the License, or (at your option), any later version. */ #ifndef _PLAYERBOT_NEWPLAYERNEARBYVALUE_H diff --git a/src/strategy/values/OutfitListValue.cpp b/src/strategy/values/OutfitListValue.cpp index 631953de8b..19eab18b6c 100644 --- a/src/strategy/values/OutfitListValue.cpp +++ b/src/strategy/values/OutfitListValue.cpp @@ -1,6 +1,6 @@ /* - * Copyright (C) 2016+ AzerothCore , released under GNU GPL v2 license, you may redistribute it - * and/or modify it under version 2 of the License, or (at your option), any later version. + * Copyright (C) 2016+ AzerothCore , released under GNU AGPL v3 license, you may redistribute it + * and/or modify it under version 3 of the License, or (at your option), any later version. */ #include "OutfitListValue.h" diff --git a/src/strategy/values/OutfitListValue.h b/src/strategy/values/OutfitListValue.h index 2f84aa4478..fbb5984fa5 100644 --- a/src/strategy/values/OutfitListValue.h +++ b/src/strategy/values/OutfitListValue.h @@ -1,6 +1,6 @@ /* - * Copyright (C) 2016+ AzerothCore , released under GNU GPL v2 license, you may redistribute it - * and/or modify it under version 2 of the License, or (at your option), any later version. + * Copyright (C) 2016+ AzerothCore , released under GNU AGPL v3 license, you may redistribute it + * and/or modify it under version 3 of the License, or (at your option), any later version. */ #ifndef _PLAYERBOT_OUTFITLISTVALUE_H diff --git a/src/strategy/values/PartyMemberToDispel.cpp b/src/strategy/values/PartyMemberToDispel.cpp index 665d6d8d6e..91b1955b27 100644 --- a/src/strategy/values/PartyMemberToDispel.cpp +++ b/src/strategy/values/PartyMemberToDispel.cpp @@ -1,6 +1,6 @@ /* - * Copyright (C) 2016+ AzerothCore , released under GNU GPL v2 license, you may redistribute it - * and/or modify it under version 2 of the License, or (at your option), any later version. + * Copyright (C) 2016+ AzerothCore , released under GNU AGPL v3 license, you may redistribute it + * and/or modify it under version 3 of the License, or (at your option), any later version. */ #include "PartyMemberToDispel.h" diff --git a/src/strategy/values/PartyMemberToDispel.h b/src/strategy/values/PartyMemberToDispel.h index 2037d60691..04e7e9b136 100644 --- a/src/strategy/values/PartyMemberToDispel.h +++ b/src/strategy/values/PartyMemberToDispel.h @@ -1,6 +1,6 @@ /* - * Copyright (C) 2016+ AzerothCore , released under GNU GPL v2 license, you may redistribute it - * and/or modify it under version 2 of the License, or (at your option), any later version. + * Copyright (C) 2016+ AzerothCore , released under GNU AGPL v3 license, you may redistribute it + * and/or modify it under version 3 of the License, or (at your option), any later version. */ #ifndef _PLAYERBOT_PARTYMEMBERTODISPEL_H diff --git a/src/strategy/values/PartyMemberToHeal.cpp b/src/strategy/values/PartyMemberToHeal.cpp index 3fb0b45d63..47554c7c2b 100644 --- a/src/strategy/values/PartyMemberToHeal.cpp +++ b/src/strategy/values/PartyMemberToHeal.cpp @@ -1,6 +1,6 @@ /* - * Copyright (C) 2016+ AzerothCore , released under GNU GPL v2 license, you may redistribute it - * and/or modify it under version 2 of the License, or (at your option), any later version. + * Copyright (C) 2016+ AzerothCore , released under GNU AGPL v3 license, you may redistribute it + * and/or modify it under version 3 of the License, or (at your option), any later version. */ #include "PartyMemberToHeal.h" diff --git a/src/strategy/values/PartyMemberToHeal.h b/src/strategy/values/PartyMemberToHeal.h index b235edde3e..f86035c09b 100644 --- a/src/strategy/values/PartyMemberToHeal.h +++ b/src/strategy/values/PartyMemberToHeal.h @@ -1,6 +1,6 @@ /* - * Copyright (C) 2016+ AzerothCore , released under GNU GPL v2 license, you may redistribute it - * and/or modify it under version 2 of the License, or (at your option), any later version. + * Copyright (C) 2016+ AzerothCore , released under GNU AGPL v3 license, you may redistribute it + * and/or modify it under version 3 of the License, or (at your option), any later version. */ #ifndef _PLAYERBOT_PARTYMEMBERTOHEAL_H diff --git a/src/strategy/values/PartyMemberToResurrect.cpp b/src/strategy/values/PartyMemberToResurrect.cpp index 0d07cdae66..e98fdb3edd 100644 --- a/src/strategy/values/PartyMemberToResurrect.cpp +++ b/src/strategy/values/PartyMemberToResurrect.cpp @@ -1,6 +1,6 @@ /* - * Copyright (C) 2016+ AzerothCore , released under GNU GPL v2 license, you may redistribute it - * and/or modify it under version 2 of the License, or (at your option), any later version. + * Copyright (C) 2016+ AzerothCore , released under GNU AGPL v3 license, you may redistribute it + * and/or modify it under version 3 of the License, or (at your option), any later version. */ #include "PartyMemberToResurrect.h" diff --git a/src/strategy/values/PartyMemberToResurrect.h b/src/strategy/values/PartyMemberToResurrect.h index 1735e88db6..14e94b7354 100644 --- a/src/strategy/values/PartyMemberToResurrect.h +++ b/src/strategy/values/PartyMemberToResurrect.h @@ -1,6 +1,6 @@ /* - * Copyright (C) 2016+ AzerothCore , released under GNU GPL v2 license, you may redistribute it - * and/or modify it under version 2 of the License, or (at your option), any later version. + * Copyright (C) 2016+ AzerothCore , released under GNU AGPL v3 license, you may redistribute it + * and/or modify it under version 3 of the License, or (at your option), any later version. */ #ifndef _PLAYERBOT_PARTYMEMBERTORESURRECT_H diff --git a/src/strategy/values/PartyMemberValue.cpp b/src/strategy/values/PartyMemberValue.cpp index 48ae772a1f..4ae9be08ad 100644 --- a/src/strategy/values/PartyMemberValue.cpp +++ b/src/strategy/values/PartyMemberValue.cpp @@ -1,6 +1,6 @@ /* - * Copyright (C) 2016+ AzerothCore , released under GNU GPL v2 license, you may redistribute it - * and/or modify it under version 2 of the License, or (at your option), any later version. + * Copyright (C) 2016+ AzerothCore , released under GNU AGPL v3 license, you may redistribute it + * and/or modify it under version 3 of the License, or (at your option), any later version. */ #include "PartyMemberValue.h" diff --git a/src/strategy/values/PartyMemberValue.h b/src/strategy/values/PartyMemberValue.h index 910ce810ca..4d52ac61d8 100644 --- a/src/strategy/values/PartyMemberValue.h +++ b/src/strategy/values/PartyMemberValue.h @@ -1,6 +1,6 @@ /* - * Copyright (C) 2016+ AzerothCore , released under GNU GPL v2 license, you may redistribute it - * and/or modify it under version 2 of the License, or (at your option), any later version. + * Copyright (C) 2016+ AzerothCore , released under GNU AGPL v3 license, you may redistribute it + * and/or modify it under version 3 of the License, or (at your option), any later version. */ #ifndef _PLAYERBOT_PARTYMEMBERVALUE_H diff --git a/src/strategy/values/PartyMemberWithoutAuraValue.cpp b/src/strategy/values/PartyMemberWithoutAuraValue.cpp index 11ffa482c9..f195a899bd 100644 --- a/src/strategy/values/PartyMemberWithoutAuraValue.cpp +++ b/src/strategy/values/PartyMemberWithoutAuraValue.cpp @@ -1,6 +1,6 @@ /* - * Copyright (C) 2016+ AzerothCore , released under GNU GPL v2 license, you may redistribute it - * and/or modify it under version 2 of the License, or (at your option), any later version. + * Copyright (C) 2016+ AzerothCore , released under GNU AGPL v3 license, you may redistribute it + * and/or modify it under version 3 of the License, or (at your option), any later version. */ #include "PartyMemberWithoutAuraValue.h" diff --git a/src/strategy/values/PartyMemberWithoutAuraValue.h b/src/strategy/values/PartyMemberWithoutAuraValue.h index 19bd624353..57bb958c76 100644 --- a/src/strategy/values/PartyMemberWithoutAuraValue.h +++ b/src/strategy/values/PartyMemberWithoutAuraValue.h @@ -1,6 +1,6 @@ /* - * Copyright (C) 2016+ AzerothCore , released under GNU GPL v2 license, you may redistribute it - * and/or modify it under version 2 of the License, or (at your option), any later version. + * Copyright (C) 2016+ AzerothCore , released under GNU AGPL v3 license, you may redistribute it + * and/or modify it under version 3 of the License, or (at your option), any later version. */ #ifndef _PLAYERBOT_PARTYMEMBERWITHOUTAURAVALUE_H diff --git a/src/strategy/values/PartyMemberWithoutItemValue.cpp b/src/strategy/values/PartyMemberWithoutItemValue.cpp index 898af9bff1..c9136c61a5 100644 --- a/src/strategy/values/PartyMemberWithoutItemValue.cpp +++ b/src/strategy/values/PartyMemberWithoutItemValue.cpp @@ -1,6 +1,6 @@ /* - * Copyright (C) 2016+ AzerothCore , released under GNU GPL v2 license, you may redistribute it - * and/or modify it under version 2 of the License, or (at your option), any later version. + * Copyright (C) 2016+ AzerothCore , released under GNU AGPL v3 license, you may redistribute it + * and/or modify it under version 3 of the License, or (at your option), any later version. */ #include "PartyMemberWithoutItemValue.h" diff --git a/src/strategy/values/PartyMemberWithoutItemValue.h b/src/strategy/values/PartyMemberWithoutItemValue.h index 61473c8465..9ca128ff8d 100644 --- a/src/strategy/values/PartyMemberWithoutItemValue.h +++ b/src/strategy/values/PartyMemberWithoutItemValue.h @@ -1,6 +1,6 @@ /* - * Copyright (C) 2016+ AzerothCore , released under GNU GPL v2 license, you may redistribute it - * and/or modify it under version 2 of the License, or (at your option), any later version. + * Copyright (C) 2016+ AzerothCore , released under GNU AGPL v3 license, you may redistribute it + * and/or modify it under version 3 of the License, or (at your option), any later version. */ #ifndef _PLAYERBOT_PARTYMEMBERWITHOUTITEMVALUE_H diff --git a/src/strategy/values/PetTargetValue.cpp b/src/strategy/values/PetTargetValue.cpp index ae6f5cc98f..d8d64d1c0e 100644 --- a/src/strategy/values/PetTargetValue.cpp +++ b/src/strategy/values/PetTargetValue.cpp @@ -1,6 +1,6 @@ /* - * Copyright (C) 2016+ AzerothCore , released under GNU GPL v2 license, you may redistribute it - * and/or modify it under version 2 of the License, or (at your option), any later version. + * Copyright (C) 2016+ AzerothCore , released under GNU AGPL v3 license, you may redistribute it + * and/or modify it under version 3 of the License, or (at your option), any later version. */ #include "PetTargetValue.h" diff --git a/src/strategy/values/PetTargetValue.h b/src/strategy/values/PetTargetValue.h index bb2a7005a0..368acdc9de 100644 --- a/src/strategy/values/PetTargetValue.h +++ b/src/strategy/values/PetTargetValue.h @@ -1,6 +1,6 @@ /* - * Copyright (C) 2016+ AzerothCore , released under GNU GPL v2 license, you may redistribute it - * and/or modify it under version 2 of the License, or (at your option), any later version. + * Copyright (C) 2016+ AzerothCore , released under GNU AGPL v3 license, you may redistribute it + * and/or modify it under version 3 of the License, or (at your option), any later version. */ #ifndef _PLAYERBOT_PETTARGETVALUE_H diff --git a/src/strategy/values/PositionValue.cpp b/src/strategy/values/PositionValue.cpp index e299c988b9..8583cdd777 100644 --- a/src/strategy/values/PositionValue.cpp +++ b/src/strategy/values/PositionValue.cpp @@ -1,6 +1,6 @@ /* - * Copyright (C) 2016+ AzerothCore , released under GNU GPL v2 license, you may redistribute it - * and/or modify it under version 2 of the License, or (at your option), any later version. + * Copyright (C) 2016+ AzerothCore , released under GNU AGPL v3 license, you may redistribute it + * and/or modify it under version 3 of the License, or (at your option), any later version. */ #include "PositionValue.h" diff --git a/src/strategy/values/PositionValue.h b/src/strategy/values/PositionValue.h index 8919324692..86ed8d0989 100644 --- a/src/strategy/values/PositionValue.h +++ b/src/strategy/values/PositionValue.h @@ -1,6 +1,6 @@ /* - * Copyright (C) 2016+ AzerothCore , released under GNU GPL v2 license, you may redistribute it - * and/or modify it under version 2 of the License, or (at your option), any later version. + * Copyright (C) 2016+ AzerothCore , released under GNU AGPL v3 license, you may redistribute it + * and/or modify it under version 3 of the License, or (at your option), any later version. */ #ifndef _PLAYERBOT_POSITIONVALUE_H diff --git a/src/strategy/values/PossibleRpgTargetsValue.cpp b/src/strategy/values/PossibleRpgTargetsValue.cpp index 1888016c25..1b136c825c 100644 --- a/src/strategy/values/PossibleRpgTargetsValue.cpp +++ b/src/strategy/values/PossibleRpgTargetsValue.cpp @@ -1,6 +1,6 @@ /* - * Copyright (C) 2016+ AzerothCore , released under GNU GPL v2 license, you may redistribute it - * and/or modify it under version 2 of the License, or (at your option), any later version. + * Copyright (C) 2016+ AzerothCore , released under GNU AGPL v3 license, you may redistribute it + * and/or modify it under version 3 of the License, or (at your option), any later version. */ #include "PossibleRpgTargetsValue.h" diff --git a/src/strategy/values/PossibleRpgTargetsValue.h b/src/strategy/values/PossibleRpgTargetsValue.h index 0d5afe69f7..ae5b596a0d 100644 --- a/src/strategy/values/PossibleRpgTargetsValue.h +++ b/src/strategy/values/PossibleRpgTargetsValue.h @@ -1,6 +1,6 @@ /* - * Copyright (C) 2016+ AzerothCore , released under GNU GPL v2 license, you may redistribute it - * and/or modify it under version 2 of the License, or (at your option), any later version. + * Copyright (C) 2016+ AzerothCore , released under GNU AGPL v3 license, you may redistribute it + * and/or modify it under version 3 of the License, or (at your option), any later version. */ #ifndef _PLAYERBOT_POSSIBLERPGTARGETSVALUE_H diff --git a/src/strategy/values/PossibleTargetsValue.cpp b/src/strategy/values/PossibleTargetsValue.cpp index 6d31993dc9..654abd44c4 100644 --- a/src/strategy/values/PossibleTargetsValue.cpp +++ b/src/strategy/values/PossibleTargetsValue.cpp @@ -1,6 +1,6 @@ /* - * Copyright (C) 2016+ AzerothCore , released under GNU GPL v2 license, you may redistribute it - * and/or modify it under version 2 of the License, or (at your option), any later version. + * Copyright (C) 2016+ AzerothCore , released under GNU AGPL v3 license, you may redistribute it + * and/or modify it under version 3 of the License, or (at your option), any later version. */ #include "PossibleTargetsValue.h" diff --git a/src/strategy/values/PossibleTargetsValue.h b/src/strategy/values/PossibleTargetsValue.h index 02a07cad32..13023b3bcb 100644 --- a/src/strategy/values/PossibleTargetsValue.h +++ b/src/strategy/values/PossibleTargetsValue.h @@ -1,6 +1,6 @@ /* - * Copyright (C) 2016+ AzerothCore , released under GNU GPL v2 license, you may redistribute it - * and/or modify it under version 2 of the License, or (at your option), any later version. + * Copyright (C) 2016+ AzerothCore , released under GNU AGPL v3 license, you may redistribute it + * and/or modify it under version 3 of the License, or (at your option), any later version. */ #ifndef _PLAYERBOT_POSSIBLETARGETSVALUE_H diff --git a/src/strategy/values/PvpValues.cpp b/src/strategy/values/PvpValues.cpp index a72b804ad7..f295f65087 100644 --- a/src/strategy/values/PvpValues.cpp +++ b/src/strategy/values/PvpValues.cpp @@ -1,6 +1,6 @@ /* - * Copyright (C) 2016+ AzerothCore , released under GNU GPL v2 license, you may redistribute it - * and/or modify it under version 2 of the License, or (at your option), any later version. + * Copyright (C) 2016+ AzerothCore , released under GNU AGPL v3 license, you may redistribute it + * and/or modify it under version 3 of the License, or (at your option), any later version. */ #include "PvpValues.h" diff --git a/src/strategy/values/PvpValues.h b/src/strategy/values/PvpValues.h index 9f4a26bf3d..bad46b951b 100644 --- a/src/strategy/values/PvpValues.h +++ b/src/strategy/values/PvpValues.h @@ -1,6 +1,6 @@ /* - * Copyright (C) 2016+ AzerothCore , released under GNU GPL v2 license, you may redistribute it - * and/or modify it under version 2 of the License, or (at your option), any later version. + * Copyright (C) 2016+ AzerothCore , released under GNU AGPL v3 license, you may redistribute it + * and/or modify it under version 3 of the License, or (at your option), any later version. */ #ifndef _PLAYERBOT_PVPVALUES_H diff --git a/src/strategy/values/QuestValues.cpp b/src/strategy/values/QuestValues.cpp index 072fdf5803..1724778509 100644 --- a/src/strategy/values/QuestValues.cpp +++ b/src/strategy/values/QuestValues.cpp @@ -1,6 +1,6 @@ /* - * Copyright (C) 2016+ AzerothCore , released under GNU GPL v2 license, you may redistribute it - * and/or modify it under version 2 of the License, or (at your option), any later version. + * Copyright (C) 2016+ AzerothCore , released under GNU AGPL v3 license, you may redistribute it + * and/or modify it under version 3 of the License, or (at your option), any later version. */ #include "QuestValues.h" diff --git a/src/strategy/values/QuestValues.h b/src/strategy/values/QuestValues.h index 62e73b890f..a3ece1fd29 100644 --- a/src/strategy/values/QuestValues.h +++ b/src/strategy/values/QuestValues.h @@ -1,6 +1,6 @@ /* - * Copyright (C) 2016+ AzerothCore , released under GNU GPL v2 license, you may redistribute it - * and/or modify it under version 2 of the License, or (at your option), any later version. + * Copyright (C) 2016+ AzerothCore , released under GNU AGPL v3 license, you may redistribute it + * and/or modify it under version 3 of the License, or (at your option), any later version. */ #ifndef _PLAYERBOT_QUESTVALUES_H diff --git a/src/strategy/values/RTSCValues.cpp b/src/strategy/values/RTSCValues.cpp index 6f404af433..4756dae09b 100644 --- a/src/strategy/values/RTSCValues.cpp +++ b/src/strategy/values/RTSCValues.cpp @@ -1,6 +1,6 @@ /* - * Copyright (C) 2016+ AzerothCore , released under GNU GPL v2 license, you may redistribute it - * and/or modify it under version 2 of the License, or (at your option), any later version. + * Copyright (C) 2016+ AzerothCore , released under GNU AGPL v3 license, you may redistribute it + * and/or modify it under version 3 of the License, or (at your option), any later version. */ #include "RTSCValues.h" diff --git a/src/strategy/values/RTSCValues.h b/src/strategy/values/RTSCValues.h index 0c7e0c0571..d5ca7b58dc 100644 --- a/src/strategy/values/RTSCValues.h +++ b/src/strategy/values/RTSCValues.h @@ -1,6 +1,6 @@ /* - * Copyright (C) 2016+ AzerothCore , released under GNU GPL v2 license, you may redistribute it - * and/or modify it under version 2 of the License, or (at your option), any later version. + * Copyright (C) 2016+ AzerothCore , released under GNU AGPL v3 license, you may redistribute it + * and/or modify it under version 3 of the License, or (at your option), any later version. */ #ifndef _PLAYERBOT_RTSCVALUE_H diff --git a/src/strategy/values/RandomBotUpdateValue.h b/src/strategy/values/RandomBotUpdateValue.h index d507a20f64..ee3c501054 100644 --- a/src/strategy/values/RandomBotUpdateValue.h +++ b/src/strategy/values/RandomBotUpdateValue.h @@ -1,6 +1,6 @@ /* - * Copyright (C) 2016+ AzerothCore , released under GNU GPL v2 license, you may redistribute it - * and/or modify it under version 2 of the License, or (at your option), any later version. + * Copyright (C) 2016+ AzerothCore , released under GNU AGPL v3 license, you may redistribute it + * and/or modify it under version 3 of the License, or (at your option), any later version. */ #ifndef _PLAYERBOT_RANDOMBOTUPDATEVALUE_H diff --git a/src/strategy/values/RangeValues.cpp b/src/strategy/values/RangeValues.cpp index ee537e9d00..6b5b0013b1 100644 --- a/src/strategy/values/RangeValues.cpp +++ b/src/strategy/values/RangeValues.cpp @@ -1,6 +1,6 @@ /* - * Copyright (C) 2016+ AzerothCore , released under GNU GPL v2 license, you may redistribute it - * and/or modify it under version 2 of the License, or (at your option), any later version. + * Copyright (C) 2016+ AzerothCore , released under GNU AGPL v3 license, you may redistribute it + * and/or modify it under version 3 of the License, or (at your option), any later version. */ #include "RangeValues.h" diff --git a/src/strategy/values/RangeValues.h b/src/strategy/values/RangeValues.h index 073e74d222..0728be2a22 100644 --- a/src/strategy/values/RangeValues.h +++ b/src/strategy/values/RangeValues.h @@ -1,6 +1,6 @@ /* - * Copyright (C) 2016+ AzerothCore , released under GNU GPL v2 license, you may redistribute it - * and/or modify it under version 2 of the License, or (at your option), any later version. + * Copyright (C) 2016+ AzerothCore , released under GNU AGPL v3 license, you may redistribute it + * and/or modify it under version 3 of the License, or (at your option), any later version. */ #ifndef _PLAYERBOT_RANGEVALUES_H diff --git a/src/strategy/values/RtiTargetValue.cpp b/src/strategy/values/RtiTargetValue.cpp index 6ce8d1d08a..040ce07b45 100644 --- a/src/strategy/values/RtiTargetValue.cpp +++ b/src/strategy/values/RtiTargetValue.cpp @@ -1,6 +1,6 @@ /* - * Copyright (C) 2016+ AzerothCore , released under GNU GPL v2 license, you may redistribute it - * and/or modify it under version 2 of the License, or (at your option), any later version. + * Copyright (C) 2016+ AzerothCore , released under GNU AGPL v3 license, you may redistribute it + * and/or modify it under version 3 of the License, or (at your option), any later version. */ #include "RtiTargetValue.h" diff --git a/src/strategy/values/RtiTargetValue.h b/src/strategy/values/RtiTargetValue.h index d21aa701c7..c2f3d607af 100644 --- a/src/strategy/values/RtiTargetValue.h +++ b/src/strategy/values/RtiTargetValue.h @@ -1,6 +1,6 @@ /* - * Copyright (C) 2016+ AzerothCore , released under GNU GPL v2 license, you may redistribute it - * and/or modify it under version 2 of the License, or (at your option), any later version. + * Copyright (C) 2016+ AzerothCore , released under GNU AGPL v3 license, you may redistribute it + * and/or modify it under version 3 of the License, or (at your option), any later version. */ #ifndef _PLAYERBOT_RTITARGETVALUE_H diff --git a/src/strategy/values/RtiValue.cpp b/src/strategy/values/RtiValue.cpp index 7161ecb7df..be8cee0ae9 100644 --- a/src/strategy/values/RtiValue.cpp +++ b/src/strategy/values/RtiValue.cpp @@ -1,6 +1,6 @@ /* - * Copyright (C) 2016+ AzerothCore , released under GNU GPL v2 license, you may redistribute it - * and/or modify it under version 2 of the License, or (at your option), any later version. + * Copyright (C) 2016+ AzerothCore , released under GNU AGPL v3 license, you may redistribute it + * and/or modify it under version 3 of the License, or (at your option), any later version. */ #include "RtiValue.h" diff --git a/src/strategy/values/RtiValue.h b/src/strategy/values/RtiValue.h index 188e095708..f4a2efbe7c 100644 --- a/src/strategy/values/RtiValue.h +++ b/src/strategy/values/RtiValue.h @@ -1,6 +1,6 @@ /* - * Copyright (C) 2016+ AzerothCore , released under GNU GPL v2 license, you may redistribute it - * and/or modify it under version 2 of the License, or (at your option), any later version. + * Copyright (C) 2016+ AzerothCore , released under GNU AGPL v3 license, you may redistribute it + * and/or modify it under version 3 of the License, or (at your option), any later version. */ #ifndef _PLAYERBOT_RTIVALUE_H diff --git a/src/strategy/values/SelfTargetValue.cpp b/src/strategy/values/SelfTargetValue.cpp index db5f561255..7e15a5c4fc 100644 --- a/src/strategy/values/SelfTargetValue.cpp +++ b/src/strategy/values/SelfTargetValue.cpp @@ -1,6 +1,6 @@ /* - * Copyright (C) 2016+ AzerothCore , released under GNU GPL v2 license, you may redistribute it - * and/or modify it under version 2 of the License, or (at your option), any later version. + * Copyright (C) 2016+ AzerothCore , released under GNU AGPL v3 license, you may redistribute it + * and/or modify it under version 3 of the License, or (at your option), any later version. */ #include "SelfTargetValue.h" diff --git a/src/strategy/values/SelfTargetValue.h b/src/strategy/values/SelfTargetValue.h index dbf8420845..1de04e1cd4 100644 --- a/src/strategy/values/SelfTargetValue.h +++ b/src/strategy/values/SelfTargetValue.h @@ -1,6 +1,6 @@ /* - * Copyright (C) 2016+ AzerothCore , released under GNU GPL v2 license, you may redistribute it - * and/or modify it under version 2 of the License, or (at your option), any later version. + * Copyright (C) 2016+ AzerothCore , released under GNU AGPL v3 license, you may redistribute it + * and/or modify it under version 3 of the License, or (at your option), any later version. */ #ifndef _PLAYERBOT_SELFTARGETVALUE_H diff --git a/src/strategy/values/SharedValueContext.h b/src/strategy/values/SharedValueContext.h index 2db2b2058f..23b8266bdd 100644 --- a/src/strategy/values/SharedValueContext.h +++ b/src/strategy/values/SharedValueContext.h @@ -1,6 +1,6 @@ /* - * Copyright (C) 2016+ AzerothCore , released under GNU GPL v2 license, you may redistribute it - * and/or modify it under version 2 of the License, or (at your option), any later version. + * Copyright (C) 2016+ AzerothCore , released under GNU AGPL v3 license, you may redistribute it + * and/or modify it under version 3 of the License, or (at your option), any later version. */ #ifndef _PLAYERBOT_SHAREDVALUECONTEXT_H diff --git a/src/strategy/values/SkipSpellsListValue.cpp b/src/strategy/values/SkipSpellsListValue.cpp index 12a28a9a98..80893974bf 100644 --- a/src/strategy/values/SkipSpellsListValue.cpp +++ b/src/strategy/values/SkipSpellsListValue.cpp @@ -1,6 +1,6 @@ /* - * Copyright (C) 2016+ AzerothCore , released under GNU GPL v2 license, you may redistribute it - * and/or modify it under version 2 of the License, or (at your option), any later version. + * Copyright (C) 2016+ AzerothCore , released under GNU AGPL v3 license, you may redistribute it + * and/or modify it under version 3 of the License, or (at your option), any later version. */ #include "SkipSpellsListValue.h" diff --git a/src/strategy/values/SkipSpellsListValue.h b/src/strategy/values/SkipSpellsListValue.h index d1b55f6749..55eb745a97 100644 --- a/src/strategy/values/SkipSpellsListValue.h +++ b/src/strategy/values/SkipSpellsListValue.h @@ -1,6 +1,6 @@ /* - * Copyright (C) 2016+ AzerothCore , released under GNU GPL v2 license, you may redistribute it - * and/or modify it under version 2 of the License, or (at your option), any later version. + * Copyright (C) 2016+ AzerothCore , released under GNU AGPL v3 license, you may redistribute it + * and/or modify it under version 3 of the License, or (at your option), any later version. */ #ifndef _PLAYERBOT_SKIPSPELLSLISTVALUE_H diff --git a/src/strategy/values/SnareTargetValue.cpp b/src/strategy/values/SnareTargetValue.cpp index e3ec057c23..96e958c2d8 100644 --- a/src/strategy/values/SnareTargetValue.cpp +++ b/src/strategy/values/SnareTargetValue.cpp @@ -1,6 +1,6 @@ /* - * Copyright (C) 2016+ AzerothCore , released under GNU GPL v2 license, you may redistribute it - * and/or modify it under version 2 of the License, or (at your option), any later version. + * Copyright (C) 2016+ AzerothCore , released under GNU AGPL v3 license, you may redistribute it + * and/or modify it under version 3 of the License, or (at your option), any later version. */ #include "SnareTargetValue.h" diff --git a/src/strategy/values/SnareTargetValue.h b/src/strategy/values/SnareTargetValue.h index a637f36948..5ff976daf7 100644 --- a/src/strategy/values/SnareTargetValue.h +++ b/src/strategy/values/SnareTargetValue.h @@ -1,6 +1,6 @@ /* - * Copyright (C) 2016+ AzerothCore , released under GNU GPL v2 license, you may redistribute it - * and/or modify it under version 2 of the License, or (at your option), any later version. + * Copyright (C) 2016+ AzerothCore , released under GNU AGPL v3 license, you may redistribute it + * and/or modify it under version 3 of the License, or (at your option), any later version. */ #ifndef _PLAYERBOT_SNARETARGETVALUE_H diff --git a/src/strategy/values/SpellCastUsefulValue.cpp b/src/strategy/values/SpellCastUsefulValue.cpp index a0b4f68f19..9fa85b3a13 100644 --- a/src/strategy/values/SpellCastUsefulValue.cpp +++ b/src/strategy/values/SpellCastUsefulValue.cpp @@ -1,6 +1,6 @@ /* - * Copyright (C) 2016+ AzerothCore , released under GNU GPL v2 license, you may redistribute it - * and/or modify it under version 2 of the License, or (at your option), any later version. + * Copyright (C) 2016+ AzerothCore , released under GNU AGPL v3 license, you may redistribute it + * and/or modify it under version 3 of the License, or (at your option), any later version. */ #include "SpellCastUsefulValue.h" diff --git a/src/strategy/values/SpellCastUsefulValue.h b/src/strategy/values/SpellCastUsefulValue.h index 7064456e25..789243341b 100644 --- a/src/strategy/values/SpellCastUsefulValue.h +++ b/src/strategy/values/SpellCastUsefulValue.h @@ -1,6 +1,6 @@ /* - * Copyright (C) 2016+ AzerothCore , released under GNU GPL v2 license, you may redistribute it - * and/or modify it under version 2 of the License, or (at your option), any later version. + * Copyright (C) 2016+ AzerothCore , released under GNU AGPL v3 license, you may redistribute it + * and/or modify it under version 3 of the License, or (at your option), any later version. */ #ifndef _PLAYERBOT_SPELLCASTUSEFULVALUE_H diff --git a/src/strategy/values/SpellIdValue.cpp b/src/strategy/values/SpellIdValue.cpp index 859fa32941..682c0b3ffd 100644 --- a/src/strategy/values/SpellIdValue.cpp +++ b/src/strategy/values/SpellIdValue.cpp @@ -1,6 +1,6 @@ /* - * Copyright (C) 2016+ AzerothCore , released under GNU GPL v2 license, you may redistribute it - * and/or modify it under version 2 of the License, or (at your option), any later version. + * Copyright (C) 2016+ AzerothCore , released under GNU AGPL v3 license, you may redistribute it + * and/or modify it under version 3 of the License, or (at your option), any later version. */ #include "SpellIdValue.h" diff --git a/src/strategy/values/SpellIdValue.h b/src/strategy/values/SpellIdValue.h index 2e813c5ef9..3df8e82298 100644 --- a/src/strategy/values/SpellIdValue.h +++ b/src/strategy/values/SpellIdValue.h @@ -1,6 +1,6 @@ /* - * Copyright (C) 2016+ AzerothCore , released under GNU GPL v2 license, you may redistribute it - * and/or modify it under version 2 of the License, or (at your option), any later version. + * Copyright (C) 2016+ AzerothCore , released under GNU AGPL v3 license, you may redistribute it + * and/or modify it under version 3 of the License, or (at your option), any later version. */ #ifndef _PLAYERBOT_SPELLIDVALUE_H diff --git a/src/strategy/values/Stances.cpp b/src/strategy/values/Stances.cpp index 1cd97a396d..2e7a18d2b9 100644 --- a/src/strategy/values/Stances.cpp +++ b/src/strategy/values/Stances.cpp @@ -1,6 +1,6 @@ /* - * Copyright (C) 2016+ AzerothCore , released under GNU GPL v2 license, you may redistribute it - * and/or modify it under version 2 of the License, or (at your option), any later version. + * Copyright (C) 2016+ AzerothCore , released under GNU AGPL v3 license, you may redistribute it + * and/or modify it under version 3 of the License, or (at your option), any later version. */ #include "Stances.h" diff --git a/src/strategy/values/Stances.h b/src/strategy/values/Stances.h index a5a5e4ddd4..16ad14de2f 100644 --- a/src/strategy/values/Stances.h +++ b/src/strategy/values/Stances.h @@ -1,6 +1,6 @@ /* - * Copyright (C) 2016+ AzerothCore , released under GNU GPL v2 license, you may redistribute it - * and/or modify it under version 2 of the License, or (at your option), any later version. + * Copyright (C) 2016+ AzerothCore , released under GNU AGPL v3 license, you may redistribute it + * and/or modify it under version 3 of the License, or (at your option), any later version. */ #ifndef _PLAYERBOT_STANCES_H diff --git a/src/strategy/values/StatsValues.cpp b/src/strategy/values/StatsValues.cpp index 2c87ec7265..6ff3bc651c 100644 --- a/src/strategy/values/StatsValues.cpp +++ b/src/strategy/values/StatsValues.cpp @@ -1,6 +1,6 @@ /* - * Copyright (C) 2016+ AzerothCore , released under GNU GPL v2 license, you may redistribute it - * and/or modify it under version 2 of the License, or (at your option), any later version. + * Copyright (C) 2016+ AzerothCore , released under GNU AGPL v3 license, you may redistribute it + * and/or modify it under version 3 of the License, or (at your option), any later version. */ #include "StatsValues.h" diff --git a/src/strategy/values/StatsValues.h b/src/strategy/values/StatsValues.h index f8e4474048..27cad01f1f 100644 --- a/src/strategy/values/StatsValues.h +++ b/src/strategy/values/StatsValues.h @@ -1,6 +1,6 @@ /* - * Copyright (C) 2016+ AzerothCore , released under GNU GPL v2 license, you may redistribute it - * and/or modify it under version 2 of the License, or (at your option), any later version. + * Copyright (C) 2016+ AzerothCore , released under GNU AGPL v3 license, you may redistribute it + * and/or modify it under version 3 of the License, or (at your option), any later version. */ #ifndef _PLAYERBOT_STATSVALUE_H diff --git a/src/strategy/values/TankTargetValue.cpp b/src/strategy/values/TankTargetValue.cpp index bcef1a3a0a..ef2d1e959c 100644 --- a/src/strategy/values/TankTargetValue.cpp +++ b/src/strategy/values/TankTargetValue.cpp @@ -1,6 +1,6 @@ /* - * Copyright (C) 2016+ AzerothCore , released under GNU GPL v2 license, you may redistribute it - * and/or modify it under version 2 of the License, or (at your option), any later version. + * Copyright (C) 2016+ AzerothCore , released under GNU AGPL v3 license, you may redistribute it + * and/or modify it under version 3 of the License, or (at your option), any later version. */ #include "TankTargetValue.h" diff --git a/src/strategy/values/TankTargetValue.h b/src/strategy/values/TankTargetValue.h index 9769910e59..8aee6182e8 100644 --- a/src/strategy/values/TankTargetValue.h +++ b/src/strategy/values/TankTargetValue.h @@ -1,6 +1,6 @@ /* - * Copyright (C) 2016+ AzerothCore , released under GNU GPL v2 license, you may redistribute it - * and/or modify it under version 2 of the License, or (at your option), any later version. + * Copyright (C) 2016+ AzerothCore , released under GNU AGPL v3 license, you may redistribute it + * and/or modify it under version 3 of the License, or (at your option), any later version. */ #ifndef _PLAYERBOT_TANKTARGETVALUE_H diff --git a/src/strategy/values/TargetValue.cpp b/src/strategy/values/TargetValue.cpp index ebffd32807..598b78441b 100644 --- a/src/strategy/values/TargetValue.cpp +++ b/src/strategy/values/TargetValue.cpp @@ -1,6 +1,6 @@ /* - * Copyright (C) 2016+ AzerothCore , released under GNU GPL v2 license, you may redistribute it - * and/or modify it under version 2 of the License, or (at your option), any later version. + * Copyright (C) 2016+ AzerothCore , released under GNU AGPL v3 license, you may redistribute it + * and/or modify it under version 3 of the License, or (at your option), any later version. */ #include "TargetValue.h" diff --git a/src/strategy/values/TargetValue.h b/src/strategy/values/TargetValue.h index 029551cef9..fcd7a58890 100644 --- a/src/strategy/values/TargetValue.h +++ b/src/strategy/values/TargetValue.h @@ -1,6 +1,6 @@ /* - * Copyright (C) 2016+ AzerothCore , released under GNU GPL v2 license, you may redistribute it - * and/or modify it under version 2 of the License, or (at your option), any later version. + * Copyright (C) 2016+ AzerothCore , released under GNU AGPL v3 license, you may redistribute it + * and/or modify it under version 3 of the License, or (at your option), any later version. */ #ifndef _PLAYERBOT_TARGETVALUE_H diff --git a/src/strategy/values/ThreatValues.cpp b/src/strategy/values/ThreatValues.cpp index fcd915b0f8..d95b00142c 100644 --- a/src/strategy/values/ThreatValues.cpp +++ b/src/strategy/values/ThreatValues.cpp @@ -1,6 +1,6 @@ /* - * Copyright (C) 2016+ AzerothCore , released under GNU GPL v2 license, you may redistribute it - * and/or modify it under version 2 of the License, or (at your option), any later version. + * Copyright (C) 2016+ AzerothCore , released under GNU AGPL v3 license, you may redistribute it + * and/or modify it under version 3 of the License, or (at your option), any later version. */ #include "ThreatValues.h" diff --git a/src/strategy/values/ThreatValues.h b/src/strategy/values/ThreatValues.h index d163532fe4..845a8c958c 100644 --- a/src/strategy/values/ThreatValues.h +++ b/src/strategy/values/ThreatValues.h @@ -1,6 +1,6 @@ /* - * Copyright (C) 2016+ AzerothCore , released under GNU GPL v2 license, you may redistribute it - * and/or modify it under version 2 of the License, or (at your option), any later version. + * Copyright (C) 2016+ AzerothCore , released under GNU AGPL v3 license, you may redistribute it + * and/or modify it under version 3 of the License, or (at your option), any later version. */ #ifndef _PLAYERBOT_THREATVALUES_H diff --git a/src/strategy/values/ValueContext.h b/src/strategy/values/ValueContext.h index 5e1a19e037..b8e79d6e5a 100644 --- a/src/strategy/values/ValueContext.h +++ b/src/strategy/values/ValueContext.h @@ -1,6 +1,6 @@ /* - * Copyright (C) 2016+ AzerothCore , released under GNU GPL v2 license, you may redistribute it - * and/or modify it under version 2 of the License, or (at your option), any later version. + * Copyright (C) 2016+ AzerothCore , released under GNU AGPL v3 license, you may redistribute it + * and/or modify it under version 3 of the License, or (at your option), any later version. */ #ifndef _PLAYERBOT_VALUECONTEXT_H diff --git a/src/strategy/warlock/AfflictionWarlockStrategy.cpp b/src/strategy/warlock/AfflictionWarlockStrategy.cpp index 9f88dd742f..c35127f263 100644 --- a/src/strategy/warlock/AfflictionWarlockStrategy.cpp +++ b/src/strategy/warlock/AfflictionWarlockStrategy.cpp @@ -1,6 +1,6 @@ /* - * Copyright (C) 2016+ AzerothCore , released under GNU GPL v2 license, you may redistribute it - * and/or modify it under version 2 of the License, or (at your option), any later version. + * Copyright (C) 2016+ AzerothCore , released under GNU AGPL v3 license, you may redistribute it + * and/or modify it under version 3 of the License, or (at your option), any later version. */ #include "AfflictionWarlockStrategy.h" diff --git a/src/strategy/warlock/AfflictionWarlockStrategy.h b/src/strategy/warlock/AfflictionWarlockStrategy.h index a34d3d647e..1585c4484d 100644 --- a/src/strategy/warlock/AfflictionWarlockStrategy.h +++ b/src/strategy/warlock/AfflictionWarlockStrategy.h @@ -1,6 +1,6 @@ /* - * Copyright (C) 2016+ AzerothCore , released under GNU GPL v2 license, you may redistribute it - * and/or modify it under version 2 of the License, or (at your option), any later version. + * Copyright (C) 2016+ AzerothCore , released under GNU AGPL v3 license, you may redistribute it + * and/or modify it under version 3 of the License, or (at your option), any later version. */ #ifndef _PLAYERBOT_AFFLICTIONWARLOCKSTRATEGY_H diff --git a/src/strategy/warlock/DemonologyWarlockStrategy.cpp b/src/strategy/warlock/DemonologyWarlockStrategy.cpp index 68ad396e0c..f41bf96f8c 100644 --- a/src/strategy/warlock/DemonologyWarlockStrategy.cpp +++ b/src/strategy/warlock/DemonologyWarlockStrategy.cpp @@ -1,6 +1,6 @@ /* - * Copyright (C) 2016+ AzerothCore , released under GNU GPL v2 license, you may redistribute it - * and/or modify it under version 2 of the License, or (at your option), any later version. + * Copyright (C) 2016+ AzerothCore , released under GNU AGPL v3 license, you may redistribute it + * and/or modify it under version 3 of the License, or (at your option), any later version. */ #include "DemonologyWarlockStrategy.h" diff --git a/src/strategy/warlock/DemonologyWarlockStrategy.h b/src/strategy/warlock/DemonologyWarlockStrategy.h index 9ca5c3eddb..df853c85ac 100644 --- a/src/strategy/warlock/DemonologyWarlockStrategy.h +++ b/src/strategy/warlock/DemonologyWarlockStrategy.h @@ -1,6 +1,6 @@ /* - * Copyright (C) 2016+ AzerothCore , released under GNU GPL v2 license, you may redistribute it - * and/or modify it under version 2 of the License, or (at your option), any later version. + * Copyright (C) 2016+ AzerothCore , released under GNU AGPL v3 license, you may redistribute it + * and/or modify it under version 3 of the License, or (at your option), any later version. */ #ifndef _PLAYERBOT_DEMONOLOGYWARLOCKSTRATEGY_H diff --git a/src/strategy/warlock/DestructionWarlockStrategy.cpp b/src/strategy/warlock/DestructionWarlockStrategy.cpp index 87de5daf79..dd0ce08630 100644 --- a/src/strategy/warlock/DestructionWarlockStrategy.cpp +++ b/src/strategy/warlock/DestructionWarlockStrategy.cpp @@ -1,6 +1,6 @@ /* - * Copyright (C) 2016+ AzerothCore , released under GNU GPL v2 license, you may redistribute it - * and/or modify it under version 2 of the License, or (at your option), any later version. + * Copyright (C) 2016+ AzerothCore , released under GNU AGPL v3 license, you may redistribute it + * and/or modify it under version 3 of the License, or (at your option), any later version. */ #include "DestructionWarlockStrategy.h" diff --git a/src/strategy/warlock/DestructionWarlockStrategy.h b/src/strategy/warlock/DestructionWarlockStrategy.h index eff6c941eb..46759d74eb 100644 --- a/src/strategy/warlock/DestructionWarlockStrategy.h +++ b/src/strategy/warlock/DestructionWarlockStrategy.h @@ -1,6 +1,6 @@ /* - * Copyright (C) 2016+ AzerothCore , released under GNU GPL v2 license, you may redistribute it - * and/or modify it under version 2 of the License, or (at your option), any later version. + * Copyright (C) 2016+ AzerothCore , released under GNU AGPL v3 license, you may redistribute it + * and/or modify it under version 3 of the License, or (at your option), any later version. */ #ifndef _PLAYERBOT_DESTRUCTIONWARLOCKSTRATEGY_H diff --git a/src/strategy/warlock/GenericWarlockNonCombatStrategy.cpp b/src/strategy/warlock/GenericWarlockNonCombatStrategy.cpp index 49707e148d..72484e3776 100644 --- a/src/strategy/warlock/GenericWarlockNonCombatStrategy.cpp +++ b/src/strategy/warlock/GenericWarlockNonCombatStrategy.cpp @@ -1,6 +1,6 @@ /* - * Copyright (C) 2016+ AzerothCore , released under GNU GPL v2 license, you may redistribute it - * and/or modify it under version 2 of the License, or (at your option), any later version. + * Copyright (C) 2016+ AzerothCore , released under GNU AGPL v3 license, you may redistribute it + * and/or modify it under version 3 of the License, or (at your option), any later version. */ #include "GenericWarlockNonCombatStrategy.h" diff --git a/src/strategy/warlock/GenericWarlockNonCombatStrategy.h b/src/strategy/warlock/GenericWarlockNonCombatStrategy.h index 48f69f1430..0da7973a09 100644 --- a/src/strategy/warlock/GenericWarlockNonCombatStrategy.h +++ b/src/strategy/warlock/GenericWarlockNonCombatStrategy.h @@ -1,6 +1,6 @@ /* - * Copyright (C) 2016+ AzerothCore , released under GNU GPL v2 license, you may redistribute it - * and/or modify it under version 2 of the License, or (at your option), any later version. + * Copyright (C) 2016+ AzerothCore , released under GNU AGPL v3 license, you may redistribute it + * and/or modify it under version 3 of the License, or (at your option), any later version. */ #ifndef _PLAYERBOT_GENERICWARLOCKNONCOMBATSTRATEGY_H diff --git a/src/strategy/warlock/GenericWarlockStrategy.cpp b/src/strategy/warlock/GenericWarlockStrategy.cpp index 9ffc7a1b88..dfa704ff58 100644 --- a/src/strategy/warlock/GenericWarlockStrategy.cpp +++ b/src/strategy/warlock/GenericWarlockStrategy.cpp @@ -1,6 +1,6 @@ /* - * Copyright (C) 2016+ AzerothCore , released under GNU GPL v2 license, you may redistribute it - * and/or modify it under version 2 of the License, or (at your option), any later version. + * Copyright (C) 2016+ AzerothCore , released under GNU AGPL v3 license, you may redistribute it + * and/or modify it under version 3 of the License, or (at your option), any later version. */ #include "GenericWarlockStrategy.h" diff --git a/src/strategy/warlock/GenericWarlockStrategy.h b/src/strategy/warlock/GenericWarlockStrategy.h index 22b59db7b0..2fda9c03a3 100644 --- a/src/strategy/warlock/GenericWarlockStrategy.h +++ b/src/strategy/warlock/GenericWarlockStrategy.h @@ -1,6 +1,6 @@ /* - * Copyright (C) 2016+ AzerothCore , released under GNU GPL v2 license, you may redistribute it - * and/or modify it under version 2 of the License, or (at your option), any later version. + * Copyright (C) 2016+ AzerothCore , released under GNU AGPL v3 license, you may redistribute it + * and/or modify it under version 3 of the License, or (at your option), any later version. */ #ifndef _PLAYERBOT_GENERICWARLOCKSTRATEGY_H diff --git a/src/strategy/warlock/TankWarlockStrategy.cpp b/src/strategy/warlock/TankWarlockStrategy.cpp index dfa36b5074..2328169aa4 100644 --- a/src/strategy/warlock/TankWarlockStrategy.cpp +++ b/src/strategy/warlock/TankWarlockStrategy.cpp @@ -1,6 +1,6 @@ /* - * Copyright (C) 2016+ AzerothCore , released under GNU GPL v2 license, you may redistribute it - * and/or modify it under version 2 of the License, or (at your option), any later version. + * Copyright (C) 2016+ AzerothCore , released under GNU AGPL v3 license, you may redistribute it + * and/or modify it under version 3 of the License, or (at your option), any later version. */ #include "TankWarlockStrategy.h" diff --git a/src/strategy/warlock/TankWarlockStrategy.h b/src/strategy/warlock/TankWarlockStrategy.h index 30bdbf7f3f..240f9515db 100644 --- a/src/strategy/warlock/TankWarlockStrategy.h +++ b/src/strategy/warlock/TankWarlockStrategy.h @@ -1,6 +1,6 @@ /* - * Copyright (C) 2016+ AzerothCore , released under GNU GPL v2 license, you may redistribute it - * and/or modify it under version 2 of the License, or (at your option), any later version. + * Copyright (C) 2016+ AzerothCore , released under GNU AGPL v3 license, you may redistribute it + * and/or modify it under version 3 of the License, or (at your option), any later version. */ #ifndef _PLAYERBOT_TANKWARLOCKSTRATEGY_H diff --git a/src/strategy/warlock/WarlockActions.cpp b/src/strategy/warlock/WarlockActions.cpp index bfe47573ff..e899c7a2f6 100644 --- a/src/strategy/warlock/WarlockActions.cpp +++ b/src/strategy/warlock/WarlockActions.cpp @@ -1,6 +1,6 @@ /* - * Copyright (C) 2016+ AzerothCore , released under GNU GPL v2 license, you may redistribute it - * and/or modify it under version 2 of the License, or (at your option), any later version. + * Copyright (C) 2016+ AzerothCore , released under GNU AGPL v3 license, you may redistribute it + * and/or modify it under version 3 of the License, or (at your option), any later version. */ #include "WarlockActions.h" diff --git a/src/strategy/warlock/WarlockActions.h b/src/strategy/warlock/WarlockActions.h index b3b7a3e266..787b518d69 100644 --- a/src/strategy/warlock/WarlockActions.h +++ b/src/strategy/warlock/WarlockActions.h @@ -1,6 +1,6 @@ /* - * Copyright (C) 2016+ AzerothCore , released under GNU GPL v2 license, you may redistribute it - * and/or modify it under version 2 of the License, or (at your option), any later version. + * Copyright (C) 2016+ AzerothCore , released under GNU AGPL v3 license, you may redistribute it + * and/or modify it under version 3 of the License, or (at your option), any later version. */ #ifndef _PLAYERBOT_WARLOCKACTIONS_H diff --git a/src/strategy/warlock/WarlockAiObjectContext.cpp b/src/strategy/warlock/WarlockAiObjectContext.cpp index 39672b3da2..a70327b6c6 100644 --- a/src/strategy/warlock/WarlockAiObjectContext.cpp +++ b/src/strategy/warlock/WarlockAiObjectContext.cpp @@ -1,6 +1,6 @@ /* - * Copyright (C) 2016+ AzerothCore , released under GNU GPL v2 license, you may redistribute it - * and/or modify it under version 2 of the License, or (at your option), any later version. + * Copyright (C) 2016+ AzerothCore , released under GNU AGPL v3 license, you may redistribute it + * and/or modify it under version 3 of the License, or (at your option), any later version. */ #include "WarlockAiObjectContext.h" diff --git a/src/strategy/warlock/WarlockAiObjectContext.h b/src/strategy/warlock/WarlockAiObjectContext.h index 08e6d0f59e..29b3792d94 100644 --- a/src/strategy/warlock/WarlockAiObjectContext.h +++ b/src/strategy/warlock/WarlockAiObjectContext.h @@ -1,6 +1,6 @@ /* - * Copyright (C) 2016+ AzerothCore , released under GNU GPL v2 license, you may redistribute it - * and/or modify it under version 2 of the License, or (at your option), any later version. + * Copyright (C) 2016+ AzerothCore , released under GNU AGPL v3 license, you may redistribute it + * and/or modify it under version 3 of the License, or (at your option), any later version. */ #ifndef _PLAYERBOT_WARLOCKAIOBJECTCONTEXT_H diff --git a/src/strategy/warlock/WarlockTriggers.cpp b/src/strategy/warlock/WarlockTriggers.cpp index c40c1a9d05..04592c9b41 100644 --- a/src/strategy/warlock/WarlockTriggers.cpp +++ b/src/strategy/warlock/WarlockTriggers.cpp @@ -1,6 +1,6 @@ /* - * Copyright (C) 2016+ AzerothCore , released under GNU GPL v2 license, you may redistribute it - * and/or modify it under version 2 of the License, or (at your option), any later version. + * Copyright (C) 2016+ AzerothCore , released under GNU AGPL v3 license, you may redistribute it + * and/or modify it under version 3 of the License, or (at your option), any later version. */ #include "WarlockTriggers.h" diff --git a/src/strategy/warlock/WarlockTriggers.h b/src/strategy/warlock/WarlockTriggers.h index e8ef51edf3..295b6d895b 100644 --- a/src/strategy/warlock/WarlockTriggers.h +++ b/src/strategy/warlock/WarlockTriggers.h @@ -1,6 +1,6 @@ /* - * Copyright (C) 2016+ AzerothCore , released under GNU GPL v2 license, you may redistribute it - * and/or modify it under version 2 of the License, or (at your option), any later version. + * Copyright (C) 2016+ AzerothCore , released under GNU AGPL v3 license, you may redistribute it + * and/or modify it under version 3 of the License, or (at your option), any later version. */ #ifndef _PLAYERBOT_WARLOCKTRIGGERS_H diff --git a/src/strategy/warrior/ArmsWarriorStrategy.cpp b/src/strategy/warrior/ArmsWarriorStrategy.cpp index 19fa29a53c..ca96758337 100644 --- a/src/strategy/warrior/ArmsWarriorStrategy.cpp +++ b/src/strategy/warrior/ArmsWarriorStrategy.cpp @@ -1,6 +1,6 @@ /* - * Copyright (C) 2016+ AzerothCore , released under GNU GPL v2 license, you may redistribute it - * and/or modify it under version 2 of the License, or (at your option), any later version. + * Copyright (C) 2016+ AzerothCore , released under GNU AGPL v3 license, you may redistribute it + * and/or modify it under version 3 of the License, or (at your option), any later version. */ #include "ArmsWarriorStrategy.h" diff --git a/src/strategy/warrior/ArmsWarriorStrategy.h b/src/strategy/warrior/ArmsWarriorStrategy.h index fd99550cdd..682657befd 100644 --- a/src/strategy/warrior/ArmsWarriorStrategy.h +++ b/src/strategy/warrior/ArmsWarriorStrategy.h @@ -1,6 +1,6 @@ /* - * Copyright (C) 2016+ AzerothCore , released under GNU GPL v2 license, you may redistribute it - * and/or modify it under version 2 of the License, or (at your option), any later version. + * Copyright (C) 2016+ AzerothCore , released under GNU AGPL v3 license, you may redistribute it + * and/or modify it under version 3 of the License, or (at your option), any later version. */ #ifndef _PLAYERBOT_ARMSWARRIORSTRATEGY_H diff --git a/src/strategy/warrior/FuryWarriorStrategy.cpp b/src/strategy/warrior/FuryWarriorStrategy.cpp index 1b166775ed..0ab7f589dc 100644 --- a/src/strategy/warrior/FuryWarriorStrategy.cpp +++ b/src/strategy/warrior/FuryWarriorStrategy.cpp @@ -1,6 +1,6 @@ /* - * Copyright (C) 2016+ AzerothCore , released under GNU GPL v2 license, you may redistribute it - * and/or modify it under version 2 of the License, or (at your option), any later version. + * Copyright (C) 2016+ AzerothCore , released under GNU AGPL v3 license, you may redistribute it + * and/or modify it under version 3 of the License, or (at your option), any later version. */ #include "FuryWarriorStrategy.h" diff --git a/src/strategy/warrior/FuryWarriorStrategy.h b/src/strategy/warrior/FuryWarriorStrategy.h index 22ddf19cbc..2791379ea8 100644 --- a/src/strategy/warrior/FuryWarriorStrategy.h +++ b/src/strategy/warrior/FuryWarriorStrategy.h @@ -1,6 +1,6 @@ /* - * Copyright (C) 2016+ AzerothCore , released under GNU GPL v2 license, you may redistribute it - * and/or modify it under version 2 of the License, or (at your option), any later version. + * Copyright (C) 2016+ AzerothCore , released under GNU AGPL v3 license, you may redistribute it + * and/or modify it under version 3 of the License, or (at your option), any later version. */ #ifndef _PLAYERBOT_FURYWARRIORSTRATEGY_H diff --git a/src/strategy/warrior/GenericWarriorNonCombatStrategy.cpp b/src/strategy/warrior/GenericWarriorNonCombatStrategy.cpp index a2c17af9eb..a5525462d1 100644 --- a/src/strategy/warrior/GenericWarriorNonCombatStrategy.cpp +++ b/src/strategy/warrior/GenericWarriorNonCombatStrategy.cpp @@ -1,6 +1,6 @@ /* - * Copyright (C) 2016+ AzerothCore , released under GNU GPL v2 license, you may redistribute it - * and/or modify it under version 2 of the License, or (at your option), any later version. + * Copyright (C) 2016+ AzerothCore , released under GNU AGPL v3 license, you may redistribute it + * and/or modify it under version 3 of the License, or (at your option), any later version. */ #include "GenericWarriorNonCombatStrategy.h" diff --git a/src/strategy/warrior/GenericWarriorNonCombatStrategy.h b/src/strategy/warrior/GenericWarriorNonCombatStrategy.h index b685d92291..2764325835 100644 --- a/src/strategy/warrior/GenericWarriorNonCombatStrategy.h +++ b/src/strategy/warrior/GenericWarriorNonCombatStrategy.h @@ -1,6 +1,6 @@ /* - * Copyright (C) 2016+ AzerothCore , released under GNU GPL v2 license, you may redistribute it - * and/or modify it under version 2 of the License, or (at your option), any later version. + * Copyright (C) 2016+ AzerothCore , released under GNU AGPL v3 license, you may redistribute it + * and/or modify it under version 3 of the License, or (at your option), any later version. */ #ifndef _PLAYERBOT_GENERICWARRIORNONCOBATSTRATEGY_H diff --git a/src/strategy/warrior/GenericWarriorStrategy.cpp b/src/strategy/warrior/GenericWarriorStrategy.cpp index c48a649381..7cb8bb15f7 100644 --- a/src/strategy/warrior/GenericWarriorStrategy.cpp +++ b/src/strategy/warrior/GenericWarriorStrategy.cpp @@ -1,6 +1,6 @@ /* - * Copyright (C) 2016+ AzerothCore , released under GNU GPL v2 license, you may redistribute it - * and/or modify it under version 2 of the License, or (at your option), any later version. + * Copyright (C) 2016+ AzerothCore , released under GNU AGPL v3 license, you may redistribute it + * and/or modify it under version 3 of the License, or (at your option), any later version. */ #include "GenericWarriorStrategy.h" diff --git a/src/strategy/warrior/GenericWarriorStrategy.h b/src/strategy/warrior/GenericWarriorStrategy.h index af3e6acc26..afd14a593a 100644 --- a/src/strategy/warrior/GenericWarriorStrategy.h +++ b/src/strategy/warrior/GenericWarriorStrategy.h @@ -1,6 +1,6 @@ /* - * Copyright (C) 2016+ AzerothCore , released under GNU GPL v2 license, you may redistribute it - * and/or modify it under version 2 of the License, or (at your option), any later version. + * Copyright (C) 2016+ AzerothCore , released under GNU AGPL v3 license, you may redistribute it + * and/or modify it under version 3 of the License, or (at your option), any later version. */ #ifndef _PLAYERBOT_GENERICWARRIORSTRATEGY_H diff --git a/src/strategy/warrior/TankWarriorStrategy.cpp b/src/strategy/warrior/TankWarriorStrategy.cpp index a75048b51e..cbb712c1fe 100644 --- a/src/strategy/warrior/TankWarriorStrategy.cpp +++ b/src/strategy/warrior/TankWarriorStrategy.cpp @@ -1,6 +1,6 @@ /* - * Copyright (C) 2016+ AzerothCore , released under GNU GPL v2 license, you may redistribute it - * and/or modify it under version 2 of the License, or (at your option), any later version. + * Copyright (C) 2016+ AzerothCore , released under GNU AGPL v3 license, you may redistribute it + * and/or modify it under version 3 of the License, or (at your option), any later version. */ #include "TankWarriorStrategy.h" diff --git a/src/strategy/warrior/TankWarriorStrategy.h b/src/strategy/warrior/TankWarriorStrategy.h index 2e3887294a..54e111087c 100644 --- a/src/strategy/warrior/TankWarriorStrategy.h +++ b/src/strategy/warrior/TankWarriorStrategy.h @@ -1,6 +1,6 @@ /* - * Copyright (C) 2016+ AzerothCore , released under GNU GPL v2 license, you may redistribute it - * and/or modify it under version 2 of the License, or (at your option), any later version. + * Copyright (C) 2016+ AzerothCore , released under GNU AGPL v3 license, you may redistribute it + * and/or modify it under version 3 of the License, or (at your option), any later version. */ #ifndef _PLAYERBOT_TANKWARRIORSTRATEGY_H diff --git a/src/strategy/warrior/WarriorActions.cpp b/src/strategy/warrior/WarriorActions.cpp index 00c06163e2..c679a6b584 100644 --- a/src/strategy/warrior/WarriorActions.cpp +++ b/src/strategy/warrior/WarriorActions.cpp @@ -1,6 +1,6 @@ /* - * Copyright (C) 2016+ AzerothCore , released under GNU GPL v2 license, you may redistribute it - * and/or modify it under version 2 of the License, or (at your option), any later version. + * Copyright (C) 2016+ AzerothCore , released under GNU AGPL v3 license, you may redistribute it + * and/or modify it under version 3 of the License, or (at your option), any later version. */ #include "WarriorActions.h" diff --git a/src/strategy/warrior/WarriorActions.h b/src/strategy/warrior/WarriorActions.h index 79929b4506..ea72fb269a 100644 --- a/src/strategy/warrior/WarriorActions.h +++ b/src/strategy/warrior/WarriorActions.h @@ -1,6 +1,6 @@ /* - * Copyright (C) 2016+ AzerothCore , released under GNU GPL v2 license, you may redistribute it - * and/or modify it under version 2 of the License, or (at your option), any later version. + * Copyright (C) 2016+ AzerothCore , released under GNU AGPL v3 license, you may redistribute it + * and/or modify it under version 3 of the License, or (at your option), any later version. */ #ifndef _PLAYERBOT_WARRIORACTIONS_H diff --git a/src/strategy/warrior/WarriorAiObjectContext.cpp b/src/strategy/warrior/WarriorAiObjectContext.cpp index bcec922cfb..3a9af55172 100644 --- a/src/strategy/warrior/WarriorAiObjectContext.cpp +++ b/src/strategy/warrior/WarriorAiObjectContext.cpp @@ -1,6 +1,6 @@ /* - * Copyright (C) 2016+ AzerothCore , released under GNU GPL v2 license, you may redistribute it - * and/or modify it under version 2 of the License, or (at your option), any later version. + * Copyright (C) 2016+ AzerothCore , released under GNU AGPL v3 license, you may redistribute it + * and/or modify it under version 3 of the License, or (at your option), any later version. */ #include "WarriorAiObjectContext.h" diff --git a/src/strategy/warrior/WarriorAiObjectContext.h b/src/strategy/warrior/WarriorAiObjectContext.h index 2c9bab973d..b4f3449b7a 100644 --- a/src/strategy/warrior/WarriorAiObjectContext.h +++ b/src/strategy/warrior/WarriorAiObjectContext.h @@ -1,6 +1,6 @@ /* - * Copyright (C) 2016+ AzerothCore , released under GNU GPL v2 license, you may redistribute it - * and/or modify it under version 2 of the License, or (at your option), any later version. + * Copyright (C) 2016+ AzerothCore , released under GNU AGPL v3 license, you may redistribute it + * and/or modify it under version 3 of the License, or (at your option), any later version. */ #ifndef _PLAYERBOT_WARRIORAIOBJECTCONTEXT_H diff --git a/src/strategy/warrior/WarriorTriggers.cpp b/src/strategy/warrior/WarriorTriggers.cpp index 61be1cf225..4ca2e5b9c7 100644 --- a/src/strategy/warrior/WarriorTriggers.cpp +++ b/src/strategy/warrior/WarriorTriggers.cpp @@ -1,6 +1,6 @@ /* - * Copyright (C) 2016+ AzerothCore , released under GNU GPL v2 license, you may redistribute it - * and/or modify it under version 2 of the License, or (at your option), any later version. + * Copyright (C) 2016+ AzerothCore , released under GNU AGPL v3 license, you may redistribute it + * and/or modify it under version 3 of the License, or (at your option), any later version. */ #include "WarriorTriggers.h" diff --git a/src/strategy/warrior/WarriorTriggers.h b/src/strategy/warrior/WarriorTriggers.h index 0e99c705d0..4e4f4cabf4 100644 --- a/src/strategy/warrior/WarriorTriggers.h +++ b/src/strategy/warrior/WarriorTriggers.h @@ -1,6 +1,6 @@ /* - * Copyright (C) 2016+ AzerothCore , released under GNU GPL v2 license, you may redistribute it - * and/or modify it under version 2 of the License, or (at your option), any later version. + * Copyright (C) 2016+ AzerothCore , released under GNU AGPL v3 license, you may redistribute it + * and/or modify it under version 3 of the License, or (at your option), any later version. */ #ifndef _PLAYERBOT_WARRIORTRIGGERS_H From a5120c0a7cff4a6de5729587cd571eaf427e01b6 Mon Sep 17 00:00:00 2001 From: Revision Date: Tue, 30 Sep 2025 15:25:53 +0200 Subject: [PATCH 080/151] Fix spacing issue and removed unnecessary spaces (#1684) * Fix spacing issue and removed unnecessary spaces * Added spaces where suggested --- src/RandomPlayerbotFactory.cpp | 4 +- src/strategy/actions/GenericBuffUtils.cpp | 239 +++++++++++----------- 2 files changed, 123 insertions(+), 120 deletions(-) diff --git a/src/RandomPlayerbotFactory.cpp b/src/RandomPlayerbotFactory.cpp index 37d6ba49ea..cf5fdc915e 100644 --- a/src/RandomPlayerbotFactory.cpp +++ b/src/RandomPlayerbotFactory.cpp @@ -892,7 +892,7 @@ void RandomPlayerbotFactory::CreateRandomGuilds() availableLeaders.push_back(leader); } } - + // Create up to randomBotGuildCount by counting only EFFECTIVE creations uint32 createdThisRun = 0; for (; guildNumber < sPlayerbotAIConfig->randomBotGuildCount; /* ++guildNumber -> done only if creation */) @@ -972,7 +972,7 @@ void RandomPlayerbotFactory::CreateRandomGuilds() LOG_DEBUG("playerbots", "[TABARD] DB check guild id={} => style={}, color={}, borderStyle={}, borderColor={}, bgColor={}", guild->GetId(), f[0].Get(), f[1].Get(), f[2].Get(), f[3].Get(), f[4].Get()); - } + } sPlayerbotAIConfig->randomBotGuilds.push_back(guild->GetId()); // The guild is only counted if it is actually created diff --git a/src/strategy/actions/GenericBuffUtils.cpp b/src/strategy/actions/GenericBuffUtils.cpp index fb27a234a0..9e227caf15 100644 --- a/src/strategy/actions/GenericBuffUtils.cpp +++ b/src/strategy/actions/GenericBuffUtils.cpp @@ -21,122 +21,125 @@ namespace ai::buff { - std::string MakeAuraQualifierForBuff(std::string const& name) - { - // Paladin - if (name == "blessing of kings") return "blessing of kings,greater blessing of kings"; - if (name == "blessing of might") return "blessing of might,greater blessing of might"; - if (name == "blessing of wisdom") return "blessing of wisdom,greater blessing of wisdom"; - if (name == "blessing of sanctuary") return "blessing of sanctuary,greater blessing of sanctuary"; - // Druid - if (name == "mark of the wild") return "mark of the wild,gift of the wild"; - // Mage - if (name == "arcane intellect") return "arcane intellect,arcane brilliance"; - // Priest - if (name == "power word: fortitude") return "power word: fortitude,prayer of fortitude"; - return name; - } - - std::string GroupVariantFor(std::string const& name) - { - // Paladin - if (name == "blessing of kings") return "greater blessing of kings"; - if (name == "blessing of might") return "greater blessing of might"; - if (name == "blessing of wisdom") return "greater blessing of wisdom"; - if (name == "blessing of sanctuary") return "greater blessing of sanctuary"; - // Druid - if (name == "mark of the wild") return "gift of the wild"; - // Mage - if (name == "arcane intellect") return "arcane brilliance"; - // Priest - if (name == "power word: fortitude") return "prayer of fortitude"; - - return std::string(); - } - - bool HasRequiredReagents(Player* bot, uint32 spellId) - { - if (!spellId) - return false; - - if (SpellInfo const* info = sSpellMgr->GetSpellInfo(spellId)) - { for (int i = 0; i < MAX_SPELL_REAGENTS; ++i) - { - if (info->Reagent[i] > 0) - { - uint32 const itemId = info->Reagent[i]; - int32 const need = info->ReagentCount[i]; - if ((int32)bot->GetItemCount(itemId, false) < need) - return false; - } - } - // No reagent required - return true; - } - return false; - } - - std::string UpgradeToGroupIfAppropriate( - Player* bot, - PlayerbotAI* botAI, - std::string const& baseName, - bool announceOnMissing, - std::function announce) - { - std::string castName = baseName; Group* g = bot->GetGroup(); - if (!g || g->GetMembersCount() < static_cast(sPlayerbotAIConfig->minBotsForGreaterBuff)) - return castName; // Group too small: stay in solo mode - - if (std::string const groupName = GroupVariantFor(baseName); !groupName.empty()) - { - uint32 const groupVariantSpellId = botAI->GetAiObjectContext() - ->GetValue("spell id", groupName)->Get(); - - // We check usefulness on the **basic** buff (not the greater version), - // because "spell cast useful" may return false for the greater variant. - bool const usefulBase = botAI->GetAiObjectContext() - ->GetValue("spell cast useful", baseName)->Get(); - - if (groupVariantSpellId && HasRequiredReagents(bot, groupVariantSpellId)) - { - // Learned + reagents OK -> switch to greater - return groupName; - } - - // Missing reagents -> announce if (a) greater is known, (b) base buff is useful, - // (c) announce was requested, (d) a callback is provided. - if (announceOnMissing && groupVariantSpellId && usefulBase && announce) - { - static std::map, time_t> s_lastWarn; // par bot & par buff - time_t now = std::time(nullptr); - uint32 botLow = static_cast(bot->GetGUID().GetCounter()); - time_t& last = s_lastWarn[ std::make_pair(botLow, groupName) ]; - if (!last || now - last >= sPlayerbotAIConfig->rpWarningCooldown) // Configurable anti-spam - { - // DB Key choice in regard of the buff - std::string key; - if (groupName.find("greater blessing") != std::string::npos) - key = "rp_missing_reagent_greater_blessing"; - else if (groupName == "gift of the wild") - key = "rp_missing_reagent_gift_of_the_wild"; - else if (groupName == "arcane brilliance") - key = "rp_missing_reagent_arcane_brilliance"; - else - key = "rp_missing_reagent_generic"; - - // Placeholders - std::map placeholders; - placeholders["%group_spell"] = groupName; - placeholders["%base_spell"] = baseName; - - std::string announceText = sPlayerbotTextMgr->GetBotTextOrDefault(key, - "Out of components for %group_spell. Using %base_spell!", placeholders); - - announce(announceText); - last = now; - } - } - } - return castName; - } + std::string MakeAuraQualifierForBuff(std::string const& name) + { + // Paladin + if (name == "blessing of kings") return "blessing of kings,greater blessing of kings"; + if (name == "blessing of might") return "blessing of might,greater blessing of might"; + if (name == "blessing of wisdom") return "blessing of wisdom,greater blessing of wisdom"; + if (name == "blessing of sanctuary") return "blessing of sanctuary,greater blessing of sanctuary"; + // Druid + if (name == "mark of the wild") return "mark of the wild,gift of the wild"; + // Mage + if (name == "arcane intellect") return "arcane intellect,arcane brilliance"; + // Priest + if (name == "power word: fortitude") return "power word: fortitude,prayer of fortitude"; + + return name; + } + + std::string GroupVariantFor(std::string const& name) + { + // Paladin + if (name == "blessing of kings") return "greater blessing of kings"; + if (name == "blessing of might") return "greater blessing of might"; + if (name == "blessing of wisdom") return "greater blessing of wisdom"; + if (name == "blessing of sanctuary") return "greater blessing of sanctuary"; + // Druid + if (name == "mark of the wild") return "gift of the wild"; + // Mage + if (name == "arcane intellect") return "arcane brilliance"; + // Priest + if (name == "power word: fortitude") return "prayer of fortitude"; + + return std::string(); + } + + bool HasRequiredReagents(Player* bot, uint32 spellId) + { + if (!spellId) + return false; + + if (SpellInfo const* info = sSpellMgr->GetSpellInfo(spellId)) + { + for (int i = 0; i < MAX_SPELL_REAGENTS; ++i) + { + if (info->Reagent[i] > 0) + { + uint32 const itemId = info->Reagent[i]; + int32 const need = info->ReagentCount[i]; + if ((int32)bot->GetItemCount(itemId, false) < need) + return false; + } + } + // No reagent required + return true; + } + return false; + } + + std::string UpgradeToGroupIfAppropriate( + Player* bot, + PlayerbotAI* botAI, + std::string const& baseName, + bool announceOnMissing, + std::function announce) + { + std::string castName = baseName; + Group* g = bot->GetGroup(); + if (!g || g->GetMembersCount() < static_cast(sPlayerbotAIConfig->minBotsForGreaterBuff)) + return castName; // Group too small: stay in solo mode + + if (std::string const groupName = GroupVariantFor(baseName); !groupName.empty()) + { + uint32 const groupVariantSpellId = botAI->GetAiObjectContext() + ->GetValue("spell id", groupName)->Get(); + + // We check usefulness on the **basic** buff (not the greater version), + // because "spell cast useful" may return false for the greater variant. + bool const usefulBase = botAI->GetAiObjectContext() + ->GetValue("spell cast useful", baseName)->Get(); + + if (groupVariantSpellId && HasRequiredReagents(bot, groupVariantSpellId)) + { + // Learned + reagents OK -> switch to greater + return groupName; + } + + // Missing reagents -> announce if (a) greater is known, (b) base buff is useful, + // (c) announce was requested, (d) a callback is provided. + if (announceOnMissing && groupVariantSpellId && usefulBase && announce) + { + static std::map, time_t> s_lastWarn; // par bot & par buff + time_t now = std::time(nullptr); + uint32 botLow = static_cast(bot->GetGUID().GetCounter()); + time_t& last = s_lastWarn[ std::make_pair(botLow, groupName) ]; + if (!last || now - last >= sPlayerbotAIConfig->rpWarningCooldown) // Configurable anti-spam + { + // DB Key choice in regard of the buff + std::string key; + if (groupName.find("greater blessing") != std::string::npos) + key = "rp_missing_reagent_greater_blessing"; + else if (groupName == "gift of the wild") + key = "rp_missing_reagent_gift_of_the_wild"; + else if (groupName == "arcane brilliance") + key = "rp_missing_reagent_arcane_brilliance"; + else + key = "rp_missing_reagent_generic"; + + // Placeholders + std::map placeholders; + placeholders["%group_spell"] = groupName; + placeholders["%base_spell"] = baseName; + + std::string announceText = sPlayerbotTextMgr->GetBotTextOrDefault(key, + "Out of components for %group_spell. Using %base_spell!", placeholders); + + announce(announceText); + last = now; + } + } + } + return castName; + } } From 7dac49cf9c276333e849f68c4e3160f3cadddd02 Mon Sep 17 00:00:00 2001 From: privatecore Date: Tue, 30 Sep 2025 22:13:36 +0200 Subject: [PATCH 081/151] Fix wrong prepared statement used for the PlayerbotDbStore::Reset issue #1172 (#1688) --- src/PlayerbotDbStore.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/PlayerbotDbStore.cpp b/src/PlayerbotDbStore.cpp index d66056ec45..a841e02b39 100644 --- a/src/PlayerbotDbStore.cpp +++ b/src/PlayerbotDbStore.cpp @@ -82,7 +82,7 @@ void PlayerbotDbStore::Reset(PlayerbotAI* botAI) { ObjectGuid::LowType guid = botAI->GetBot()->GetGUID().GetCounter(); - PlayerbotsDatabasePreparedStatement* stmt = PlayerbotsDatabase.GetPreparedStatement(PLAYERBOTS_DEL_CUSTOM_STRATEGY); + PlayerbotsDatabasePreparedStatement* stmt = PlayerbotsDatabase.GetPreparedStatement(PLAYERBOTS_DEL_DB_STORE); stmt->SetData(0, guid); PlayerbotsDatabase.Execute(stmt); } From 25726f54b17250e5c107be47a201886be80faccb Mon Sep 17 00:00:00 2001 From: NoxMax <50133316+NoxMax@users.noreply.github.com> Date: Wed, 1 Oct 2025 13:16:00 +0800 Subject: [PATCH 082/151] Update RandomPlayerbotMgr.cpp --- src/RandomPlayerbotMgr.cpp | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/RandomPlayerbotMgr.cpp b/src/RandomPlayerbotMgr.cpp index 978896ec31..c8542e7b08 100644 --- a/src/RandomPlayerbotMgr.cpp +++ b/src/RandomPlayerbotMgr.cpp @@ -13,6 +13,7 @@ #include #include #include +#include #include "AccountMgr.h" #include "AiFactory.h" @@ -426,7 +427,7 @@ void RandomPlayerbotMgr::UpdateAIInternal(uint32 elapsed, bool /*minimal*/) { LOG_ERROR("playerbots", "No eligible bots found with level filter {}-{}. Change the level range.", sPlayerbotAIConfig->randomBotMinLoginLevel, sPlayerbotAIConfig->randomBotMaxLoginLevel); - SetEventValue(0, "bot_count", 0, 999999999); + SetEventValue(0, "bot_count", 0, INT_MAX); maxAllowedBotCount = 0; currentBots.clear(); levelFilterAdjusted = true; From 06e45300e10c16d829cfddc62171ac71d02395a1 Mon Sep 17 00:00:00 2001 From: bash <31279994+hermensbas@users.noreply.github.com> Date: Wed, 1 Oct 2025 23:45:28 +0200 Subject: [PATCH 083/151] Added const --- src/strategy/values/StatsValues.cpp | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/src/strategy/values/StatsValues.cpp b/src/strategy/values/StatsValues.cpp index 1208c56778..9a12181684 100644 --- a/src/strategy/values/StatsValues.cpp +++ b/src/strategy/values/StatsValues.cpp @@ -4,10 +4,13 @@ */ #include "StatsValues.h" - #include "Playerbots.h" #include "ServerFacade.h" +namespace { + constexpr uint32 PRIEST_SPIRIT_OF_REDEMPTION_SPELL_ID = 20711u; +} + Unit* HealthValue::GetTarget() { AiObjectContext* ctx = AiObject::context; @@ -120,7 +123,7 @@ bool HasManaValue::Calculate() if (!target) return false; - if (target->HasAura(20711)) // Spirit of Redemption + if (target->HasAura(PRIEST_SPIRIT_OF_REDEMPTION_SPELL_ID)) return false; return target->GetPower(POWER_MANA); From aea58414b0919055afba7d1719cd2b3edb94ee97 Mon Sep 17 00:00:00 2001 From: kadeshar Date: Thu, 2 Oct 2025 00:10:19 +0200 Subject: [PATCH 084/151] - Changed item usage value on new method (#1692) --- src/strategy/values/ItemUsageValue.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/strategy/values/ItemUsageValue.cpp b/src/strategy/values/ItemUsageValue.cpp index e6dc5cb84b..b0630b86f8 100644 --- a/src/strategy/values/ItemUsageValue.cpp +++ b/src/strategy/values/ItemUsageValue.cpp @@ -59,7 +59,7 @@ ItemUsage ItemUsageValue::Calculate() if (bot->HasSpell(proto->Spells[2].SpellId)) needItem = false; else - needItem = bot->CanUseItem(proto) == EQUIP_ERR_OK; + needItem = bot->BotCanUseItem(proto) == EQUIP_ERR_OK; } } From 31b19aabc76cf8dd9107e0d814f2ac6e52dbc266 Mon Sep 17 00:00:00 2001 From: bash <31279994+hermensbas@users.noreply.github.com> Date: Thu, 2 Oct 2025 01:28:30 +0200 Subject: [PATCH 085/151] Minor correction, scope was to big. --- src/strategy/values/StatsValues.cpp | 7 ++----- 1 file changed, 2 insertions(+), 5 deletions(-) diff --git a/src/strategy/values/StatsValues.cpp b/src/strategy/values/StatsValues.cpp index 9a12181684..5b1e62f64f 100644 --- a/src/strategy/values/StatsValues.cpp +++ b/src/strategy/values/StatsValues.cpp @@ -7,10 +7,6 @@ #include "Playerbots.h" #include "ServerFacade.h" -namespace { - constexpr uint32 PRIEST_SPIRIT_OF_REDEMPTION_SPELL_ID = 20711u; -} - Unit* HealthValue::GetTarget() { AiObjectContext* ctx = AiObject::context; @@ -122,7 +118,8 @@ bool HasManaValue::Calculate() Unit* target = GetTarget(); if (!target) return false; - + + constexpr uint32 PRIEST_SPIRIT_OF_REDEMPTION_SPELL_ID = 20711u; if (target->HasAura(PRIEST_SPIRIT_OF_REDEMPTION_SPELL_ID)) return false; From 24e69229e3c9e000477fd72cdcde474cd84cea3d Mon Sep 17 00:00:00 2001 From: Alex Dcnh <140754794+Wishmaster117@users.noreply.github.com> Date: Thu, 2 Oct 2025 20:47:09 +0200 Subject: [PATCH 086/151] =?UTF-8?q?Fix:=20Shaman=20bots=20stuck=20spamming?= =?UTF-8?q?=20=E2=80=9CCall=20of=20the=20Elements=E2=80=9D=20/=20=E2=80=9C?= =?UTF-8?q?set=20=E2=80=A6=20totem=E2=80=9D=20(totem=20rank=20detection=20?= =?UTF-8?q?&=20trigger=20loop)=20(#1659)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * Fix Issue #1648 Fix low level randombot shamans (~34) don't heal in dungeongroups, seems new "resto" strategy is broken #1648 * Final working fix, tested with all 3 shaman class specs. * Update asked by review * requested review changes * Minor corrections of the cpp file * boyscouting Lets try and leave the code cleaner behind as we find it when we can. * Oupsie fix ;) --------- Co-authored-by: bash <31279994+hermensbas@users.noreply.github.com> --- src/strategy/shaman/ShamanActions.cpp | 39 ++++--- src/strategy/shaman/ShamanActions.h | 14 ++- src/strategy/shaman/ShamanTriggers.cpp | 145 +++++++++++++++---------- src/strategy/shaman/ShamanTriggers.h | 17 ++- 4 files changed, 133 insertions(+), 82 deletions(-) diff --git a/src/strategy/shaman/ShamanActions.cpp b/src/strategy/shaman/ShamanActions.cpp index 52e1330948..4915aa2780 100644 --- a/src/strategy/shaman/ShamanActions.cpp +++ b/src/strategy/shaman/ShamanActions.cpp @@ -29,6 +29,7 @@ bool CastFireNovaAction::isUseful() { Unit* target = AI_VALUE(Unit*, "current target"); if (!target) return false; + Creature* fireTotem = bot->GetMap()->GetCreature(bot->m_SummonSlot[1]); if (!fireTotem) return false; @@ -45,7 +46,10 @@ bool CastCleansingTotemAction::isUseful() } // Will only cast Stoneclaw Totem if low on health and not in a group -bool CastStoneclawTotemAction::isUseful() { return !botAI->GetBot()->GetGroup(); } +bool CastStoneclawTotemAction::isUseful() +{ + return !bot->GetGroup(); +} // Will only cast Lava Burst if Flame Shock is on the target bool CastLavaBurstAction::isUseful() @@ -54,10 +58,10 @@ bool CastLavaBurstAction::isUseful() if (!target) return false; - static const uint32 FLAME_SHOCK_IDS[] = {8050, 8052, 8053, 10447, 10448, 29228, 25457, 49232, 49233}; + static const uint32 FLAME_SHOCK_SPELL_IDS[] = {8050, 8052, 8053, 10447, 10448, 29228, 25457, 49232, 49233}; - ObjectGuid botGuid = botAI->GetBot()->GetGUID(); - for (uint32 spellId : FLAME_SHOCK_IDS) + ObjectGuid botGuid = bot->GetGUID(); + for (uint32 spellId : FLAME_SHOCK_SPELL_IDS) { if (target->HasAura(spellId, botGuid)) return true; @@ -69,7 +73,6 @@ bool CastLavaBurstAction::isUseful() // There is no existing code for guardians casting spells in the AC/Playerbots repo. bool CastSpiritWalkAction::Execute(Event event) { - Player* bot = botAI->GetBot(); constexpr uint32 SPIRIT_WOLF = 29264; constexpr uint32 SPIRIT_WALK_SPELL = 58875; @@ -90,28 +93,30 @@ bool CastSpiritWalkAction::Execute(Event event) // Set Strategy Assigned Totems (Actions) - First, it checks // the highest-rank spell the bot knows for each totem type, // then adds it to the Call of the Elements bar. - bool SetTotemAction::Execute(Event event) { - const size_t spellIdsCount = sizeof(totemSpellIds) / sizeof(uint32); - if (spellIdsCount == 0) - return false; // early return - uint32 totemSpell = 0; - - // Iterate backwards to prioritize the highest-rank totem spell the bot knows - for (size_t i = spellIdsCount; i-- > 0;) + for (size_t i = 0; i < totemSpellIdsCount; ++i) { - const uint32 spellId = totemSpellIds[i]; - if (bot->HasSpell(spellId)) + if (bot->HasSpell(totemSpellIds[i])) { - totemSpell = spellId; + totemSpell = totemSpellIds[i]; break; } } - if (totemSpell == 0) + if (!totemSpell) + { return false; + } + + if (const ActionButton* button = bot->GetActionButton(actionButtonId)) + { + if (button->GetType() == ACTION_BUTTON_SPELL && button->GetAction() == totemSpell) + { + return false; + } + } bot->addActionButton(actionButtonId, totemSpell, ACTION_BUTTON_SPELL); return true; diff --git a/src/strategy/shaman/ShamanActions.h b/src/strategy/shaman/ShamanActions.h index 499c100b64..3af0113436 100644 --- a/src/strategy/shaman/ShamanActions.h +++ b/src/strategy/shaman/ShamanActions.h @@ -531,12 +531,18 @@ class CastNatureResistanceTotemAction : public CastTotemAction class SetTotemAction : public Action { public: - SetTotemAction(PlayerbotAI* botAI, std::string const totemName, const uint32 totemSpellIds[], int actionButtonId) - : Action(botAI, "set " + totemName), totemSpellIds(totemSpellIds), actionButtonId(actionButtonId) - { - } + // Template constructor: infers N (size of the id array) at compile time + template + SetTotemAction(PlayerbotAI* botAI, std::string const& totemName, const uint32 (&ids)[N], int actionButtonId) + : Action(botAI, "set " + totemName) + , totemSpellIds(ids) + , totemSpellIdsCount(N) + , actionButtonId(actionButtonId) + {} + bool Execute(Event event) override; uint32 const* totemSpellIds; + size_t totemSpellIdsCount; int actionButtonId; }; diff --git a/src/strategy/shaman/ShamanTriggers.cpp b/src/strategy/shaman/ShamanTriggers.cpp index 44a9f75777..574ab638d7 100644 --- a/src/strategy/shaman/ShamanTriggers.cpp +++ b/src/strategy/shaman/ShamanTriggers.cpp @@ -19,6 +19,7 @@ bool MainHandWeaponNoImbueTrigger::IsActive() Item* const itemForSpell = bot->GetItemByPos(INVENTORY_SLOT_BAG_0, EQUIPMENT_SLOT_MAINHAND); if (!itemForSpell || itemForSpell->GetEnchantmentId(TEMP_ENCHANTMENT_SLOT)) return false; + return true; } @@ -27,18 +28,20 @@ bool OffHandWeaponNoImbueTrigger::IsActive() Item* const itemForSpell = bot->GetItemByPos(INVENTORY_SLOT_BAG_0, EQUIPMENT_SLOT_OFFHAND); if (!itemForSpell) return false; + uint32 invType = itemForSpell->GetTemplate()->InventoryType; bool allowedType = (invType == INVTYPE_WEAPON) || (invType == INVTYPE_WEAPONOFFHAND); - if (itemForSpell->GetEnchantmentId(TEMP_ENCHANTMENT_SLOT) || - !allowedType) + if (itemForSpell->GetEnchantmentId(TEMP_ENCHANTMENT_SLOT) || !allowedType) return false; + return true; } bool ShockTrigger::IsActive() { - return SpellTrigger::IsActive() && !botAI->HasAura("flame shock", GetTarget(), false, true) && - !botAI->HasAura("frost shock", GetTarget(), false, true); + return SpellTrigger::IsActive() && + !botAI->HasAura("flame shock", GetTarget(), false, true) && + !botAI->HasAura("frost shock", GetTarget(), false, true); } // Checks if the target's health is above 25%/1500 hp. Returns false if either are true. @@ -61,13 +64,20 @@ bool EarthShockExecuteTrigger::IsActive() bool TotemTrigger::IsActive() { - return AI_VALUE(uint8, "attacker count") >= attackerCount && !AI_VALUE2(bool, "has totem", name) && - !botAI->HasAura(name, bot); + return AI_VALUE(uint8, "attacker count") >= attackerCount && + !AI_VALUE2(bool, "has totem", name) && + !botAI->HasAura(name, bot); } -bool WaterWalkingTrigger::IsActive() { return BuffTrigger::IsActive() && AI_VALUE2(bool, "swimming", "self target"); } +bool WaterWalkingTrigger::IsActive() +{ + return BuffTrigger::IsActive() && AI_VALUE2(bool, "swimming", "self target"); +} -bool WaterBreathingTrigger::IsActive() { return BuffTrigger::IsActive() && AI_VALUE2(bool, "swimming", "self target"); } +bool WaterBreathingTrigger::IsActive() +{ + return BuffTrigger::IsActive() && AI_VALUE2(bool, "swimming", "self target"); +} bool WaterWalkingOnPartyTrigger::IsActive() { @@ -92,14 +102,13 @@ bool ElementalMasteryTrigger::IsActive() // code exists in the AC/Playerbots repo for checking if a guardian's spell is on cooldown. bool SpiritWalkTrigger::IsActive() { - Player* bot = botAI->GetBot(); - constexpr uint32 SPIRIT_WOLF = 29264; - constexpr uint32 SPIRIT_WALK = 58875; - constexpr int COOLDOWN_SECONDS = 32; + constexpr uint32 SPIRIT_WOLF = 29264u; + constexpr uint32 SPIRIT_WALK_SPELL_ID = 58875u; + constexpr int COOLDOWN_IN_SECONDS = 32; time_t now = time(nullptr); - if ((now - lastSpiritWalkTime) < COOLDOWN_SECONDS) + if ((now - lastSpiritWalkTime) < COOLDOWN_IN_SECONDS) return false; for (Unit* unit : bot->m_Controlled) @@ -107,13 +116,14 @@ bool SpiritWalkTrigger::IsActive() Creature* wolf = dynamic_cast(unit); if (wolf && wolf->GetEntry() == SPIRIT_WOLF && wolf->IsAlive()) { - if (!bot->HasAura(SPIRIT_WALK)) + if (!bot->HasAura(SPIRIT_WALK_SPELL_ID)) { lastSpiritWalkTime = now; return true; } } } + return false; } @@ -127,8 +137,10 @@ bool CallOfTheElementsTrigger::IsActive() } int emptyCount = 0; - static const uint8 slots[] = {SUMMON_SLOT_TOTEM_EARTH, SUMMON_SLOT_TOTEM_FIRE, SUMMON_SLOT_TOTEM_WATER, - SUMMON_SLOT_TOTEM_AIR}; + static const uint8 slots[] = { + SUMMON_SLOT_TOTEM_EARTH, SUMMON_SLOT_TOTEM_FIRE, + SUMMON_SLOT_TOTEM_WATER, SUMMON_SLOT_TOTEM_AIR + }; for (uint8 slot : slots) { @@ -173,13 +185,11 @@ bool CallOfTheElementsTrigger::IsActive() // 5. Finally, if any totem summon slot is not empty, the trigger will fire. bool TotemicRecallTrigger::IsActive() { - Player* bot = botAI->GetBot(); - if (!bot->HasSpell(SPELL_TOTEMIC_RECALL)) return false; Map* map = bot->GetMap(); - if (map->IsDungeon()) + if (map && map->IsDungeon()) { InstanceScript* instance = ((InstanceMap*)map)->GetInstanceScript(); if (instance) @@ -200,8 +210,10 @@ bool TotemicRecallTrigger::IsActive() Player* member = ref->GetSource(); if (!member) continue; + if (member->IsInCombat()) return false; + Pet* pet = member->GetPet(); if (pet && pet->IsInCombat()) return false; @@ -214,7 +226,9 @@ bool TotemicRecallTrigger::IsActive() Creature* totem = bot->GetMap()->GetCreature(guid); uint32 currentSpell = 0; if (totem) + { currentSpell = totem->GetUInt32Value(UNIT_CREATED_BY_SPELL); + } for (size_t i = 0; i < MANA_TIDE_TOTEM_COUNT; ++i) { @@ -229,7 +243,9 @@ bool TotemicRecallTrigger::IsActive() Creature* totem = bot->GetMap()->GetCreature(guid); uint32 currentSpell = 0; if (totem) + { currentSpell = totem->GetUInt32Value(UNIT_CREATED_BY_SPELL); + } for (size_t i = 0; i < FIRE_ELEMENTAL_TOTEM_COUNT; ++i) { @@ -245,8 +261,8 @@ bool TotemicRecallTrigger::IsActive() } // Find the active totem strategy for this slot, and return the highest-rank spellId the bot knows for it -static uint32 GetRequiredTotemSpellId(PlayerbotAI* ai, const char* strategies[], const uint32* spellList[], - const size_t spellCounts[], size_t numStrategies) +static uint32 GetRequiredTotemSpellId(PlayerbotAI* ai, const char* strategies[], + const uint32* spellList[], const size_t spellCounts[], size_t numStrategies) { Player* bot = ai->GetBot(); for (size_t i = 0; i < numStrategies; ++i) @@ -257,10 +273,13 @@ static uint32 GetRequiredTotemSpellId(PlayerbotAI* ai, const char* strategies[], for (size_t j = 0; j < spellCounts[i]; ++j) { if (bot->HasSpell(spellList[i][j])) + { return spellList[i][j]; + } } } } + return 0; // No relevant strategy active, or bot doesn't know any rank } @@ -270,9 +289,11 @@ static uint32 GetSummonedTotemSpellId(Player* bot, uint8 slot) ObjectGuid guid = bot->m_SummonSlot[slot]; if (guid.IsEmpty()) return 0; + Creature* totem = bot->GetMap()->GetCreature(guid); if (!totem) return 0; + return totem->GetUInt32Value(UNIT_CREATED_BY_SPELL); } @@ -288,8 +309,10 @@ bool NoEarthTotemTrigger::IsActive() if (!guid.IsEmpty()) { totem = bot->GetMap()->GetCreature(guid); - if (totem) + if (totem) + { currentSpell = totem->GetUInt32Value(UNIT_CREATED_BY_SPELL); + } } // Define supported earth totem strategies for this slot: @@ -297,16 +320,18 @@ bool NoEarthTotemTrigger::IsActive() static const uint32* spells[] = {STRENGTH_OF_EARTH_TOTEM, STONESKIN_TOTEM, TREMOR_TOTEM, EARTHBIND_TOTEM}; static const size_t counts[] = {STRENGTH_OF_EARTH_TOTEM_COUNT, STONESKIN_TOTEM_COUNT, TREMOR_TOTEM_COUNT, EARTHBIND_TOTEM_COUNT}; - + uint32 requiredSpell = GetRequiredTotemSpellId(botAI, names, spells, counts, 4); // EXCEPTION: If Stoneclaw Totem is out and in range, consider the slot "occupied" (do not fire the trigger) - for (size_t i = 0; i < STONECLAW_TOTEM_COUNT; ++i) + for (size_t i = 0; i < STONECLAW_TOTEM_COUNT; ++i) + { if (currentSpell == STONECLAW_TOTEM[i] && totem && totem->GetDistance(bot) <= 30.0f) return false; + } // If no relevant strategy, only care if the slot is empty or totem is too far away - if (!requiredSpell) + if (!requiredSpell) return guid.IsEmpty() || !totem || totem->GetDistance(bot) > 30.0f; // Fire if slot is empty or wrong totem or totem is too far away @@ -325,8 +350,10 @@ bool NoFireTotemTrigger::IsActive() if (!guid.IsEmpty()) { totem = bot->GetMap()->GetCreature(guid); - if (totem) + if (totem) + { currentSpell = totem->GetUInt32Value(UNIT_CREATED_BY_SPELL); + } } // Define supported fire totem strategies for this slot: @@ -339,9 +366,11 @@ bool NoFireTotemTrigger::IsActive() uint32 requiredSpell = GetRequiredTotemSpellId(botAI, names, spells, counts, 5); // EXCEPTION: If Fire Elemental is out and in range, consider the slot "occupied" (do not fire the trigger) - for (size_t i = 0; i < FIRE_ELEMENTAL_TOTEM_COUNT; ++i) + for (size_t i = 0; i < FIRE_ELEMENTAL_TOTEM_COUNT; ++i) + { if (currentSpell == FIRE_ELEMENTAL_TOTEM[i] && totem && totem->GetDistance(bot) <= 30.0f) return false; + } // If no relevant strategy, only care if the slot is empty or totem is too far away if (!requiredSpell) @@ -364,7 +393,9 @@ bool NoWaterTotemTrigger::IsActive() { totem = bot->GetMap()->GetCreature(guid); if (totem) + { currentSpell = totem->GetUInt32Value(UNIT_CREATED_BY_SPELL); + } } // Define supported water totem strategies for this slot: @@ -376,13 +407,17 @@ bool NoWaterTotemTrigger::IsActive() uint32 requiredSpell = GetRequiredTotemSpellId(botAI, names, spells, counts, 4); // EXCEPTION: If Mana Tide is out and in range, consider the slot "occupied" (do not fire the trigger) - for (size_t i = 0; i < MANA_TIDE_TOTEM_COUNT; ++i) + for (size_t i = 0; i < MANA_TIDE_TOTEM_COUNT; ++i) + { if (currentSpell == MANA_TIDE_TOTEM[i] && totem && totem->GetDistance(bot) <= 30.0f) return false; + } // If no relevant strategy, only care if the slot is empty or totem is too far away - if (!requiredSpell) + if (!requiredSpell) + { return guid.IsEmpty() || !totem || totem->GetDistance(bot) > 30.0f; + } // Fire if slot is empty or wrong totem or totem is too far away return !currentSpell || currentSpell != requiredSpell || !totem || totem->GetDistance(bot) > 30.0f; @@ -401,7 +436,9 @@ bool NoAirTotemTrigger::IsActive() { totem = bot->GetMap()->GetCreature(guid); if (totem) + { currentSpell = totem->GetUInt32Value(UNIT_CREATED_BY_SPELL); + } } // Define supported air totem strategies for this slot: @@ -414,7 +451,9 @@ bool NoAirTotemTrigger::IsActive() // If no relevant strategy, only care if the slot is empty or totem is too far away if (!requiredSpell) + { return guid.IsEmpty() || !totem || totem->GetDistance(bot) > 30.0f; + } // Fire if slot is empty or wrong totem or totem is too far away return !currentSpell || currentSpell != requiredSpell || !totem || totem->GetDistance(bot) > 30.0f; @@ -422,30 +461,26 @@ bool NoAirTotemTrigger::IsActive() bool SetTotemTrigger::IsActive() { - if (!bot->HasSpell(SPELL_CALL_OF_THE_ELEMENTS)) - return false; - - if (!bot->HasSpell(requiredSpellId)) - return false; - - ActionButton const* button = bot->GetActionButton(actionButtonId); - if (!button || button->GetType() != ACTION_BUTTON_SPELL || button->GetAction() == 0) - return true; - - const size_t totemSpellIdsCount = sizeof(totemSpellIds) / sizeof(uint32); - if (totemSpellIdsCount == 0) - { - return false; - } - - for (int i = (int)totemSpellIdsCount - 1; i >= 0; --i) - { - const uint32 spellId = totemSpellIds[i]; - if (bot->HasSpell(spellId)) - { - return button->GetAction() != spellId; - } - } - - return false; + uint32 highestKnownSpell = 0; + for (size_t i = 0; i < totemSpellIdsCount; ++i) + { + const uint32 spellId = totemSpellIds[i]; + if (bot->HasSpell(spellId)) + { + highestKnownSpell = spellId; + break; + } + } + + if (!highestKnownSpell) + return false; + + ActionButton const* button = bot->GetActionButton(actionButtonId); + if (!button || button->GetType() != ACTION_BUTTON_SPELL || button->GetAction() == 0) + return true; + + if (button->GetAction() != highestKnownSpell) + return true; + + return false; } diff --git a/src/strategy/shaman/ShamanTriggers.h b/src/strategy/shaman/ShamanTriggers.h index 1e8ef8d533..7fbaf2fd8b 100644 --- a/src/strategy/shaman/ShamanTriggers.h +++ b/src/strategy/shaman/ShamanTriggers.h @@ -359,17 +359,22 @@ class CallOfTheElementsAndEnemyWithinMeleeTrigger : public TwoTriggers class SetTotemTrigger : public Trigger { public: - SetTotemTrigger(PlayerbotAI* ai, std::string const spellName, const uint32 requiredSpellId, - const uint32 totemSpellIds[], int actionButtonId) - : Trigger(ai, "set " + spellName), - requiredSpellId(requiredSpellId), - totemSpellIds(totemSpellIds), - actionButtonId(actionButtonId) {} + // Template constructor: infers N (size of the id array) at compile time + template + SetTotemTrigger(PlayerbotAI* ai, std::string const& spellName, uint32 requiredSpellId, + const uint32 (&ids)[N], int actionButtonId) + : Trigger(ai, "set " + spellName) + , requiredSpellId(requiredSpellId) + , totemSpellIds(ids) + , totemSpellIdsCount(N) + , actionButtonId(actionButtonId) + {} bool IsActive() override; private: uint32 requiredSpellId; uint32 const* totemSpellIds; + size_t totemSpellIdsCount; int actionButtonId; }; From 387c4912653c88d81ac19c909344de01c59da66e Mon Sep 17 00:00:00 2001 From: root Date: Fri, 3 Oct 2025 15:58:36 +1000 Subject: [PATCH 087/151] fix(Playerbots): Remove auras before teleporting to prevent crash Add RemoveAurasWithInterruptFlags call before all TeleportTo operations to prevent race condition crash in battlegrounds. The crash occurs when area auras (like "Entering Battleground") are queued for removal in Aura::UpdateTargetMap's targetsToRemove list, but the unit is deleted before the 500ms update cycle completes, causing SIGSEGV when accessing the dangling pointer. This fix removes auras with AURA_INTERRUPT_FLAG_TELEPORTED and AURA_INTERRUPT_FLAG_CHANGE_MAP before teleporting, matching the behavior in Player::TeleportTo for real players. Affected locations: - BattleGround join/teleport - Spirit healer/graveyard teleport - Corpse resurrection teleport - Meeting stone teleport - Master follow teleport - RPG unstuck teleport - Random bot teleport - Chat command teleport Raid-specific teleports excluded as they require separate testing. --- src/RandomPlayerbotMgr.cpp | 2 ++ src/strategy/actions/BattleGroundJoinAction.cpp | 1 + src/strategy/actions/BattleGroundTactics.cpp | 6 ++++++ src/strategy/actions/ChatShortcutActions.cpp | 1 + src/strategy/actions/MovementActions.cpp | 2 ++ src/strategy/actions/ReleaseSpiritAction.cpp | 2 ++ src/strategy/actions/ReviveFromCorpseAction.cpp | 2 ++ src/strategy/actions/UseMeetingStoneAction.cpp | 1 + src/strategy/rpg/NewRpgBaseAction.cpp | 1 + 9 files changed, 18 insertions(+) diff --git a/src/RandomPlayerbotMgr.cpp b/src/RandomPlayerbotMgr.cpp index 557450d0c7..61b1df4901 100644 --- a/src/RandomPlayerbotMgr.cpp +++ b/src/RandomPlayerbotMgr.cpp @@ -1853,6 +1853,7 @@ void RandomPlayerbotMgr::RandomTeleport(Player* bot, std::vector& PlayerbotAI* botAI = GET_PLAYERBOT_AI(bot); if (botAI) botAI->Reset(true); + bot->RemoveAurasWithInterruptFlags(AURA_INTERRUPT_FLAG_TELEPORTED | AURA_INTERRUPT_FLAG_CHANGE_MAP); bot->TeleportTo(loc.GetMapId(), x, y, z, 0); bot->SendMovementFlagUpdate(); @@ -3245,6 +3246,7 @@ void RandomPlayerbotMgr::OnPlayerLogin(Player* player) } while (true); } + player->RemoveAurasWithInterruptFlags(AURA_INTERRUPT_FLAG_TELEPORTED | AURA_INTERRUPT_FLAG_CHANGE_MAP); player->TeleportTo(botPos); // player->Relocate(botPos.getX(), botPos.getY(), botPos.getZ(), botPos.getO()); diff --git a/src/strategy/actions/BattleGroundJoinAction.cpp b/src/strategy/actions/BattleGroundJoinAction.cpp index f458162498..542c7566ff 100644 --- a/src/strategy/actions/BattleGroundJoinAction.cpp +++ b/src/strategy/actions/BattleGroundJoinAction.cpp @@ -176,6 +176,7 @@ bool BGJoinAction::gatherArenaTeam(ArenaType type) continue; memberBotAI->Reset(); + member->RemoveAurasWithInterruptFlags(AURA_INTERRUPT_FLAG_TELEPORTED | AURA_INTERRUPT_FLAG_CHANGE_MAP); member->TeleportTo(bot->GetMapId(), bot->GetPositionX(), bot->GetPositionY(), bot->GetPositionZ(), 0); LOG_INFO("playerbots", "Bot {} <{}>: Member of <{}>", member->GetGUID().ToString().c_str(), diff --git a/src/strategy/actions/BattleGroundTactics.cpp b/src/strategy/actions/BattleGroundTactics.cpp index 74bc236a51..5e9e7daf0c 100644 --- a/src/strategy/actions/BattleGroundTactics.cpp +++ b/src/strategy/actions/BattleGroundTactics.cpp @@ -4289,9 +4289,15 @@ bool ArenaTactics::moveToCenter(Battleground* bg) { // they like to hang around at the tip of the pipes doing nothing, so we just teleport them down if (bot->GetDistance(1333.07f, 817.18f, 13.35f) < 4) + { + bot->RemoveAurasWithInterruptFlags(AURA_INTERRUPT_FLAG_TELEPORTED | AURA_INTERRUPT_FLAG_CHANGE_MAP); bot->TeleportTo(bg->GetMapId(), 1330.96f, 816.75f, 3.2f, bot->GetOrientation()); + } if (bot->GetDistance(1250.13f, 764.79f, 13.34f) < 4) + { + bot->RemoveAurasWithInterruptFlags(AURA_INTERRUPT_FLAG_TELEPORTED | AURA_INTERRUPT_FLAG_CHANGE_MAP); bot->TeleportTo(bg->GetMapId(), 1252.19f, 765.41f, 3.2f, bot->GetOrientation()); + } } break; case BATTLEGROUND_RV: diff --git a/src/strategy/actions/ChatShortcutActions.cpp b/src/strategy/actions/ChatShortcutActions.cpp index 0e99c5fe78..40d66697b9 100644 --- a/src/strategy/actions/ChatShortcutActions.cpp +++ b/src/strategy/actions/ChatShortcutActions.cpp @@ -106,6 +106,7 @@ bool FollowChatShortcutAction::Execute(Event event) else botAI->TellMaster("You are too far away from me! I will there soon."); + bot->RemoveAurasWithInterruptFlags(AURA_INTERRUPT_FLAG_TELEPORTED | AURA_INTERRUPT_FLAG_CHANGE_MAP); bot->TeleportTo(master->GetMapId(), master->GetPositionX(), master->GetPositionY(), master->GetPositionZ(), master->GetOrientation()); return true; } diff --git a/src/strategy/actions/MovementActions.cpp b/src/strategy/actions/MovementActions.cpp index 371d11c2b1..6758b91686 100644 --- a/src/strategy/actions/MovementActions.cpp +++ b/src/strategy/actions/MovementActions.cpp @@ -1148,6 +1148,7 @@ bool MovementAction::Follow(Unit* target, float distance, float angle) if ((target->GetMap() && target->GetMap()->IsBattlegroundOrArena()) || (bot->GetMap() && bot->GetMap()->IsBattlegroundOrArena())) return false; + bot->RemoveAurasWithInterruptFlags(AURA_INTERRUPT_FLAG_TELEPORTED | AURA_INTERRUPT_FLAG_CHANGE_MAP); bot->TeleportTo(target->GetMapId(), x, y, z, bot->GetOrientation()); } else @@ -1175,6 +1176,7 @@ bool MovementAction::Follow(Unit* target, float distance, float angle) bot->CombatStop(true); botAI->TellMasterNoFacing("I will there soon."); + bot->RemoveAurasWithInterruptFlags(AURA_INTERRUPT_FLAG_TELEPORTED | AURA_INTERRUPT_FLAG_CHANGE_MAP); bot->TeleportTo(target->GetMapId(), target->GetPositionX(), target->GetPositionY(), target->GetPositionZ(), target->GetOrientation()); return false; } diff --git a/src/strategy/actions/ReleaseSpiritAction.cpp b/src/strategy/actions/ReleaseSpiritAction.cpp index 92b7ac5504..0d725f749c 100644 --- a/src/strategy/actions/ReleaseSpiritAction.cpp +++ b/src/strategy/actions/ReleaseSpiritAction.cpp @@ -147,6 +147,7 @@ bool AutoReleaseSpiritAction::HandleBattlegroundSpiritHealer() // and in IOC it's not within clicking range when they res in own base // Teleport to nearest friendly Spirit Healer when not currently in range of one. + bot->RemoveAurasWithInterruptFlags(AURA_INTERRUPT_FLAG_TELEPORTED | AURA_INTERRUPT_FLAG_CHANGE_MAP); bot->TeleportTo(bot->GetMapId(), spiritHealer->GetPositionX(), spiritHealer->GetPositionY(), spiritHealer->GetPositionZ(), 0.f); RESET_AI_VALUE(bool, "combat::self target"); RESET_AI_VALUE(WorldPosition, "current position"); @@ -244,6 +245,7 @@ int64 RepopAction::CalculateDeadTime() const void RepopAction::PerformGraveyardTeleport(const GraveyardStruct* graveyard) const { + bot->RemoveAurasWithInterruptFlags(AURA_INTERRUPT_FLAG_TELEPORTED | AURA_INTERRUPT_FLAG_CHANGE_MAP); bot->TeleportTo(graveyard->Map, graveyard->x, graveyard->y, graveyard->z, 0.f); RESET_AI_VALUE(bool, "combat::self target"); RESET_AI_VALUE(WorldPosition, "current position"); diff --git a/src/strategy/actions/ReviveFromCorpseAction.cpp b/src/strategy/actions/ReviveFromCorpseAction.cpp index f281074736..83897dc2ab 100644 --- a/src/strategy/actions/ReviveFromCorpseAction.cpp +++ b/src/strategy/actions/ReviveFromCorpseAction.cpp @@ -169,6 +169,7 @@ bool FindCorpseAction::Execute(Event event) if (deadTime > delay) { bot->GetMotionMaster()->Clear(); + bot->RemoveAurasWithInterruptFlags(AURA_INTERRUPT_FLAG_TELEPORTED | AURA_INTERRUPT_FLAG_CHANGE_MAP); bot->TeleportTo(moveToPos.getMapId(), moveToPos.getX(), moveToPos.getY(), moveToPos.getZ(), 0); } @@ -350,6 +351,7 @@ bool SpiritHealerAction::Execute(Event event) // if (!botAI->HasActivePlayerMaster()) // { context->GetValue("death count")->Set(dCount + 1); + bot->RemoveAurasWithInterruptFlags(AURA_INTERRUPT_FLAG_TELEPORTED | AURA_INTERRUPT_FLAG_CHANGE_MAP); return bot->TeleportTo(ClosestGrave->Map, ClosestGrave->x, ClosestGrave->y, ClosestGrave->z, 0.f); // } diff --git a/src/strategy/actions/UseMeetingStoneAction.cpp b/src/strategy/actions/UseMeetingStoneAction.cpp index 68eecce69a..24d58aff30 100644 --- a/src/strategy/actions/UseMeetingStoneAction.cpp +++ b/src/strategy/actions/UseMeetingStoneAction.cpp @@ -225,6 +225,7 @@ bool SummonAction::Teleport(Player* summoner, Player* player) player->GetMotionMaster()->Clear(); AI_VALUE(LastMovement&, "last movement").clear(); + player->RemoveAurasWithInterruptFlags(AURA_INTERRUPT_FLAG_TELEPORTED | AURA_INTERRUPT_FLAG_CHANGE_MAP); player->TeleportTo(mapId, x, y, z, 0); if (botAI->HasStrategy("stay", botAI->GetState())) diff --git a/src/strategy/rpg/NewRpgBaseAction.cpp b/src/strategy/rpg/NewRpgBaseAction.cpp index 9af540dcc3..acd3407827 100644 --- a/src/strategy/rpg/NewRpgBaseAction.cpp +++ b/src/strategy/rpg/NewRpgBaseAction.cpp @@ -67,6 +67,7 @@ bool NewRpgBaseAction::MoveFarTo(WorldPosition dest) bot->GetName(), bot->GetPositionX(), bot->GetPositionY(), bot->GetPositionZ(), bot->GetMapId(), dest.GetPositionX(), dest.GetPositionY(), dest.GetPositionZ(), dest.getMapId(), bot->GetZoneId(), zone_name); + bot->RemoveAurasWithInterruptFlags(AURA_INTERRUPT_FLAG_TELEPORTED | AURA_INTERRUPT_FLAG_CHANGE_MAP); return bot->TeleportTo(dest); } From f2b55804957221c15e88356dfbbf7705e6a1b411 Mon Sep 17 00:00:00 2001 From: IainD92 Date: Fri, 3 Oct 2025 10:56:16 +0100 Subject: [PATCH 088/151] Maintenance config for altbots (#1693) * Maintenance config controls bools in config * Update TrainerAction.cpp removed some note-to-selfs (personal config preferences) * Set default to true Also tidied up some comments * Update playerbots.conf.dist * Reorganised Changed the description in conf to be less conversational. Rearranged the order that options are arranged, grouping by what made sense to me (the type of gameplay made easier/skipped by the option being enabled). Rearranged the order the variables and method calls are listed in the code to match the order they are presented in the conf to make future maintenance of maintenance (:P) more intuitive. * Update playerbots.conf.dist Revert previous commit (change to call order in MaintenanceAction::Execute) conf settings grouped --- conf/playerbots.conf.dist | 28 +++++++ src/PlayerbotAIConfig.cpp | 21 +++++ src/PlayerbotAIConfig.h | 19 +++++ src/strategy/actions/TrainerAction.cpp | 103 ++++++++++++++++++++----- 4 files changed, 151 insertions(+), 20 deletions(-) diff --git a/conf/playerbots.conf.dist b/conf/playerbots.conf.dist index 1976173801..bf57638428 100644 --- a/conf/playerbots.conf.dist +++ b/conf/playerbots.conf.dist @@ -488,6 +488,34 @@ AiPlayerbot.RPWarningCooldown = 30 # Default: 1 (enabled) AiPlayerbot.MaintenanceCommand = 1 +# Enable/Disable specific maintenance command functionality for alt bots +# Disable to prevent players from giving free bags, spells, skill levels etc to their alt bots +# Default: 1 (enabled) +AiPlayerbot.AltMaintenanceAmmo = 1 +AiPlayerbot.AltMaintenanceFood = 1 +AiPlayerbot.AltMaintenanceReagents = 1 +AiPlayerbot.AltMaintenanceConsumables = 1 +AiPlayerbot.AltMaintenancePotions = 1 + +AiPlayerbot.AltMaintenanceBags = 1 +AiPlayerbot.AltMaintenanceMounts = 1 +AiPlayerbot.AltMaintenanceSkills = 1 + +AiPlayerbot.AltMaintenanceClassSpells = 1 # Spells from quests (tame/summon pets, totems, druid forms, etc) +AiPlayerbot.AltMaintenanceAvailableSpells = 1 # Spells learnable from trainer +AiPlayerbot.AltMaintenanceSpecialSpells = 1 # Leave DK starting area +AiPlayerbot.AltMaintenanceTalentTree = 1 +AiPlayerbot.AltMaintenanceGlyphs = 1 +AiPlayerbot.AltMaintenanceGemsEnchants = 1 + +AiPlayerbot.AltMaintenancePet = 1 +AiPlayerbot.AltMaintenancePetTalents = 1 + +AiPlayerbot.AltMaintenanceReputation = 1 +AiPlayerbot.AltMaintenanceAttunementQuests = 1 +AiPlayerbot.AltMaintenanceKeyring = 1 + + # Enable/Disable autogear command, which automatically upgrades bots' gear; the quality is limited by AutoGearQualityLimit and AutoGearScoreLimit # Default: 1 (enabled) AiPlayerbot.AutoGearCommand = 1 diff --git a/src/PlayerbotAIConfig.cpp b/src/PlayerbotAIConfig.cpp index 80cdeb97c1..0343be5228 100644 --- a/src/PlayerbotAIConfig.cpp +++ b/src/PlayerbotAIConfig.cpp @@ -553,6 +553,27 @@ bool PlayerbotAIConfig::Initialize() addClassCommand = sConfigMgr->GetOption("AiPlayerbot.AddClassCommand", 1); addClassAccountPoolSize = sConfigMgr->GetOption("AiPlayerbot.AddClassAccountPoolSize", 50); maintenanceCommand = sConfigMgr->GetOption("AiPlayerbot.MaintenanceCommand", 1); + + altMaintenanceAttunementQs = sConfigMgr->GetOption("AiPlayerbot.AltMaintenanceAttunementQuests", true); + altMaintenanceBags = sConfigMgr->GetOption("AiPlayerbot.AltMaintenanceBags", true); + altMaintenanceAmmo = sConfigMgr->GetOption("AiPlayerbot.AltMaintenanceAmmo", true); + altMaintenanceFood = sConfigMgr->GetOption("AiPlayerbot.AltMaintenanceFood", true); + altMaintenanceReagents = sConfigMgr->GetOption("AiPlayerbot.AltMaintenanceReagents", true); + altMaintenanceConsumables = sConfigMgr->GetOption("AiPlayerbot.AltMaintenanceConsumables", true); + altMaintenancePotions = sConfigMgr->GetOption("AiPlayerbot.AltMaintenancePotions", true); + altMaintenanceTalentTree = sConfigMgr->GetOption("AiPlayerbot.AltMaintenanceTalentTree", true); + altMaintenancePet = sConfigMgr->GetOption("AiPlayerbot.AltMaintenancePet", true); + altMaintenancePetTalents = sConfigMgr->GetOption("AiPlayerbot.AltMaintenancePetTalents", true); + altMaintenanceClassSpells = sConfigMgr->GetOption("AiPlayerbot.AltMaintenanceClassSpells", true); + altMaintenanceAvailableSpells = sConfigMgr->GetOption("AiPlayerbot.AltMaintenanceAvailableSpells", true); + altMaintenanceSkills = sConfigMgr->GetOption("AiPlayerbot.AltMaintenanceSkills", true); + altMaintenanceReputation = sConfigMgr->GetOption("AiPlayerbot.AltMaintenanceReputation", true); + altMaintenanceSpecialSpells = sConfigMgr->GetOption("AiPlayerbot.AltMaintenanceSpecialSpells", true); + altMaintenanceMounts = sConfigMgr->GetOption("AiPlayerbot.AltMaintenanceMounts", true); + altMaintenanceGlyphs = sConfigMgr->GetOption("AiPlayerbot.AltMaintenanceGlyphs", true); + altMaintenanceKeyring = sConfigMgr->GetOption("AiPlayerbot.AltMaintenanceKeyring", true); + altMaintenanceGemsEnchants = sConfigMgr->GetOption("AiPlayerbot.AltMaintenanceGemsEnchants", true); + autoGearCommand = sConfigMgr->GetOption("AiPlayerbot.AutoGearCommand", 1); autoGearCommandAltBots = sConfigMgr->GetOption("AiPlayerbot.AutoGearCommandAltBots", 1); autoGearQualityLimit = sConfigMgr->GetOption("AiPlayerbot.AutoGearQualityLimit", 3); diff --git a/src/PlayerbotAIConfig.h b/src/PlayerbotAIConfig.h index e7b404d8ef..c20f16dd6f 100644 --- a/src/PlayerbotAIConfig.h +++ b/src/PlayerbotAIConfig.h @@ -393,6 +393,25 @@ class PlayerbotAIConfig int32 addClassCommand; int32 addClassAccountPoolSize; int32 maintenanceCommand; + bool altMaintenanceAttunementQs, + altMaintenanceBags, + altMaintenanceAmmo, + altMaintenanceFood, + altMaintenanceReagents, + altMaintenanceConsumables, + altMaintenancePotions, + altMaintenanceTalentTree, + altMaintenancePet, + altMaintenancePetTalents, + altMaintenanceClassSpells, + altMaintenanceAvailableSpells, + altMaintenanceSkills, + altMaintenanceReputation, + altMaintenanceSpecialSpells, + altMaintenanceMounts, + altMaintenanceGlyphs, + altMaintenanceKeyring, + altMaintenanceGemsEnchants; int32 autoGearCommand, autoGearCommandAltBots, autoGearQualityLimit, autoGearScoreLimit; uint32 useGroundMountAtMinLevel; diff --git a/src/strategy/actions/TrainerAction.cpp b/src/strategy/actions/TrainerAction.cpp index 2de9d2830e..c5509cf8b8 100644 --- a/src/strategy/actions/TrainerAction.cpp +++ b/src/strategy/actions/TrainerAction.cpp @@ -170,26 +170,89 @@ bool MaintenanceAction::Execute(Event event) botAI->TellMaster("I'm maintaining"); PlayerbotFactory factory(bot, bot->GetLevel()); - factory.InitAttunementQuests(); - factory.InitBags(false); - factory.InitAmmo(); - factory.InitFood(); - factory.InitReagents(); - factory.InitConsumables(); - factory.InitPotions(); - factory.InitTalentsTree(true); - factory.InitPet(); - factory.InitPetTalents(); - factory.InitClassSpells(); - factory.InitAvailableSpells(); - factory.InitSkills(); - factory.InitReputation(); - factory.InitSpecialSpells(); - factory.InitMounts(); - factory.InitGlyphs(false); - factory.InitKeyring(); - if (bot->GetLevel() >= sPlayerbotAIConfig->minEnchantingBotLevel) - factory.ApplyEnchantAndGemsNew(); + + if (!botAI->IsAlt()) + { + factory.InitAttunementQuests(); + factory.InitBags(false); + factory.InitAmmo(); + factory.InitFood(); + factory.InitReagents(); + factory.InitConsumables(); + factory.InitPotions(); + factory.InitTalentsTree(true); + factory.InitPet(); + factory.InitPetTalents(); + factory.InitClassSpells(); + factory.InitAvailableSpells(); + factory.InitSkills(); + factory.InitReputation(); + factory.InitSpecialSpells(); + factory.InitMounts(); + factory.InitGlyphs(false); + factory.InitKeyring(); + if (bot->GetLevel() >= sPlayerbotAIConfig->minEnchantingBotLevel) + factory.ApplyEnchantAndGemsNew(); + } + else + { + if (sPlayerbotAIConfig->altMaintenanceAttunementQs) + factory.InitAttunementQuests(); + + if (sPlayerbotAIConfig->altMaintenanceBags) + factory.InitBags(false); + + if (sPlayerbotAIConfig->altMaintenanceAmmo) + factory.InitAmmo(); + + if (sPlayerbotAIConfig->altMaintenanceFood) + factory.InitFood(); + + if (sPlayerbotAIConfig->altMaintenanceReagents) + factory.InitReagents(); + + if (sPlayerbotAIConfig->altMaintenanceConsumables) + factory.InitConsumables(); + + if (sPlayerbotAIConfig->altMaintenancePotions) + factory.InitPotions(); + + if (sPlayerbotAIConfig->altMaintenanceTalentTree) + factory.InitTalentsTree(true); + + if (sPlayerbotAIConfig->altMaintenancePet) + factory.InitPet(); + + if (sPlayerbotAIConfig->altMaintenancePetTalents) + factory.InitPetTalents(); + + if (sPlayerbotAIConfig->altMaintenanceClassSpells) + factory.InitClassSpells(); + + if (sPlayerbotAIConfig->altMaintenanceAvailableSpells) + factory.InitAvailableSpells(); + + if (sPlayerbotAIConfig->altMaintenanceSkills) + factory.InitSkills(); + + if (sPlayerbotAIConfig->altMaintenanceReputation) + factory.InitReputation(); + + if (sPlayerbotAIConfig->altMaintenanceSpecialSpells) + factory.InitSpecialSpells(); + + if (sPlayerbotAIConfig->altMaintenanceMounts) + factory.InitMounts(); + + if (sPlayerbotAIConfig->altMaintenanceGlyphs) + factory.InitGlyphs(false); + + if (sPlayerbotAIConfig->altMaintenanceKeyring) + factory.InitKeyring(); + + if (sPlayerbotAIConfig->altMaintenanceGemsEnchants && bot->GetLevel() >= sPlayerbotAIConfig->minEnchantingBotLevel) + factory.ApplyEnchantAndGemsNew(); + } bot->DurabilityRepairAll(false, 1.0f, false); bot->SendTalentsInfoData(false); From 2a340ce68f65eedd7670e1d3e77a8308d9f01de9 Mon Sep 17 00:00:00 2001 From: IainD92 Date: Fri, 3 Oct 2025 13:19:17 +0100 Subject: [PATCH 089/151] Update playerbots.conf.dist (#1698) Removed comments from the end of lines (results in bad value) --- conf/playerbots.conf.dist | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/conf/playerbots.conf.dist b/conf/playerbots.conf.dist index bf57638428..67a13c9dfc 100644 --- a/conf/playerbots.conf.dist +++ b/conf/playerbots.conf.dist @@ -501,9 +501,9 @@ AiPlayerbot.AltMaintenanceBags = 1 AiPlayerbot.AltMaintenanceMounts = 1 AiPlayerbot.AltMaintenanceSkills = 1 -AiPlayerbot.AltMaintenanceClassSpells = 1 # Spells from quests (tame/summon pets, totems, druid forms, etc) -AiPlayerbot.AltMaintenanceAvailableSpells = 1 # Spells learnable from trainer -AiPlayerbot.AltMaintenanceSpecialSpells = 1 # Leave DK starting area +AiPlayerbot.AltMaintenanceClassSpells = 1 +AiPlayerbot.AltMaintenanceAvailableSpells = 1 +AiPlayerbot.AltMaintenanceSpecialSpells = 1 AiPlayerbot.AltMaintenanceTalentTree = 1 AiPlayerbot.AltMaintenanceGlyphs = 1 AiPlayerbot.AltMaintenanceGemsEnchants = 1 From 377ac199a7e6f7e583bc095fe0ab7d5148fc7e97 Mon Sep 17 00:00:00 2001 From: bash <31279994+hermensbas@users.noreply.github.com> Date: Fri, 3 Oct 2025 22:58:30 +0200 Subject: [PATCH 090/151] Revert "Feat: Filter bot logins by level range" (#1705) --- conf/playerbots.conf.dist | 13 +-- src/PlayerbotAIConfig.cpp | 3 - src/PlayerbotAIConfig.h | 2 - src/Playerbots.cpp | 30 +---- src/RandomPlayerbotMgr.cpp | 231 ++++++------------------------------- src/RandomPlayerbotMgr.h | 18 --- 6 files changed, 40 insertions(+), 257 deletions(-) diff --git a/conf/playerbots.conf.dist b/conf/playerbots.conf.dist index 67a13c9dfc..244fa9917c 100644 --- a/conf/playerbots.conf.dist +++ b/conf/playerbots.conf.dist @@ -597,21 +597,10 @@ AiPlayerbot.RandomBotRandomPassword = 0 # Prefix for account names to create for randombots AiPlayerbot.RandomBotAccountPrefix = "rndbot" -# Minimum and maximum initialization levels for randombots +# Minimum and maximum levels for randombots AiPlayerbot.RandomBotMinLevel = 1 AiPlayerbot.RandomBotMaxLevel = 80 -# Minimum and maximum level range for randombots allowed to login -# If level filtration is used, minRandomBots and maxRandomBots might be automatically adjusted to lower values, -# depending on available eligible bots in the database -# Default Min,Max: 1,80 (no level filtration) -AiPlayerbot.RandomBotMinLoginLevel = 1 -AiPlayerbot.RandomBotMaxLoginLevel = 80 - -# log-out randombots if they they level outside the allowed login range -# Default: 0 (disabled) -AiPlayerbot.RandomBotLogoutOutsideLoginRange = 0 - # Sync max randombot level with max level of online players # Default: 0 (disabled) AiPlayerbot.SyncLevelWithPlayers = 0 diff --git a/src/PlayerbotAIConfig.cpp b/src/PlayerbotAIConfig.cpp index 0343be5228..65b6f5bc0f 100644 --- a/src/PlayerbotAIConfig.cpp +++ b/src/PlayerbotAIConfig.cpp @@ -86,9 +86,6 @@ bool PlayerbotAIConfig::Initialize() rpWarningCooldown = sConfigMgr->GetOption("AiPlayerbot.RPWarningCooldown", 30); disabledWithoutRealPlayerLoginDelay = sConfigMgr->GetOption("AiPlayerbot.DisabledWithoutRealPlayerLoginDelay", 30); disabledWithoutRealPlayerLogoutDelay = sConfigMgr->GetOption("AiPlayerbot.DisabledWithoutRealPlayerLogoutDelay", 300); - randomBotMinLoginLevel = sConfigMgr->GetOption("AiPlayerbot.RandomBotMinLoginLevel", 1); - randomBotMaxLoginLevel = sConfigMgr->GetOption("AiPlayerbot.RandomBotMaxLoginLevel", 80); - randomBotLogoutOutsideLoginRange = sConfigMgr->GetOption("AiPlayerbot.RandomBotLogoutOutsideLoginRange", false); farDistance = sConfigMgr->GetOption("AiPlayerbot.FarDistance", 20.0f); sightDistance = sConfigMgr->GetOption("AiPlayerbot.SightDistance", 75.0f); diff --git a/src/PlayerbotAIConfig.h b/src/PlayerbotAIConfig.h index c20f16dd6f..391b991a21 100644 --- a/src/PlayerbotAIConfig.h +++ b/src/PlayerbotAIConfig.h @@ -247,8 +247,6 @@ class PlayerbotAIConfig std::string randomBotCombatStrategies, randomBotNonCombatStrategies; bool applyInstanceStrategies; uint32 randomBotMinLevel, randomBotMaxLevel; - uint32 randomBotMinLoginLevel, randomBotMaxLoginLevel; - bool randomBotLogoutOutsideLoginRange; float randomChangeMultiplier; // std::string premadeLevelSpec[MAX_CLASSES][10][91]; //lvl 10 - 100 diff --git a/src/Playerbots.cpp b/src/Playerbots.cpp index 926e1f4e55..b5334ba758 100644 --- a/src/Playerbots.cpp +++ b/src/Playerbots.cpp @@ -87,8 +87,7 @@ class PlayerbotsPlayerScript : public PlayerScript PLAYERHOOK_ON_BEFORE_CRITERIA_PROGRESS, PLAYERHOOK_ON_BEFORE_ACHI_COMPLETE, PLAYERHOOK_CAN_PLAYER_USE_PRIVATE_CHAT, - PLAYERHOOK_ON_GIVE_EXP, - PLAYERHOOK_ON_LEVEL_CHANGED + PLAYERHOOK_ON_GIVE_EXP }) {} void OnPlayerLogin(Player* player) override @@ -122,33 +121,6 @@ class PlayerbotsPlayerScript : public PlayerScript } } - void OnPlayerLevelChanged(Player* player, uint8 oldLevel) override - { - // Check if feature is enabled and required objects are valid - if (!sPlayerbotAIConfig || !sPlayerbotAIConfig->randomBotLogoutOutsideLoginRange || !sRandomPlayerbotMgr) - return; - - // Only apply to bots from rndBotTypeAccounts (type 1) - uint32 accountId = player->GetSession()->GetAccountId(); - if (!sRandomPlayerbotMgr->IsAccountType(accountId, 1)) - return; - - uint32 newLevel = player->GetLevel(); - - // Check if the new level is outside the allowed login range - if (newLevel < sPlayerbotAIConfig->randomBotMinLoginLevel || - newLevel > sPlayerbotAIConfig->randomBotMaxLoginLevel) - { - LOG_INFO("playerbots", "Bot {} changed levels from {} to {}, outside login range ({}-{}). Marking for logout", - player->GetName(), oldLevel, newLevel, - sPlayerbotAIConfig->randomBotMinLoginLevel, sPlayerbotAIConfig->randomBotMaxLoginLevel); - - // Mark the bot for removal in the next update cycle - sRandomPlayerbotMgr->MarkBotForLogout(player->GetGUID().GetCounter()); - sRandomPlayerbotMgr->ForceRecount(); - } - } - void OnPlayerAfterUpdate(Player* player, uint32 diff) override { if (PlayerbotAI* botAI = GET_PLAYERBOT_AI(player)) diff --git a/src/RandomPlayerbotMgr.cpp b/src/RandomPlayerbotMgr.cpp index 557450d0c7..ab28c25da4 100644 --- a/src/RandomPlayerbotMgr.cpp +++ b/src/RandomPlayerbotMgr.cpp @@ -13,7 +13,6 @@ #include #include #include -#include #include "AccountMgr.h" #include "AiFactory.h" @@ -375,76 +374,13 @@ void RandomPlayerbotMgr::UpdateAIInternal(uint32 elapsed, bool /*minimal*/) }*/ uint32 maxAllowedBotCount = GetEventValue(0, "bot_count"); - - // Check if level filtering is active and populate eligible bots - if (!levelFilterAdjusted && IsLevelFilterActive()) + if (!maxAllowedBotCount || (maxAllowedBotCount < sPlayerbotAIConfig->minRandomBots || + maxAllowedBotCount > sPlayerbotAIConfig->maxRandomBots)) { - PopulateEligibleBots(); - - // Count total eligible bots from RNDbot accounts - uint32 eligibleBotCount = 0; - - for (uint32 accountId : rndBotTypeAccounts) - { - QueryResult result = CharacterDatabase.Query( - "SELECT COUNT(*) FROM characters WHERE account = {} AND level >= {} AND level <= {}", - accountId, sPlayerbotAIConfig->randomBotMinLoginLevel, sPlayerbotAIConfig->randomBotMaxLoginLevel - ); - - if (result) - { - Field* fields = result->Fetch(); - eligibleBotCount += fields[0].Get(); - } - } - - if (eligibleBotCount > 0) - { - // Cap eligible bots by maxRandomBots - uint32 effectiveMaxBots = std::min(eligibleBotCount, sPlayerbotAIConfig->maxRandomBots); - - LOG_INFO("playerbots", "Level filter active: {} eligible bots found in range {}-{}. Effective maximum: {} bots.", - eligibleBotCount, sPlayerbotAIConfig->randomBotMinLoginLevel, - sPlayerbotAIConfig->randomBotMaxLoginLevel, effectiveMaxBots); - - if (effectiveMaxBots >= sPlayerbotAIConfig->minRandomBots) - { - maxAllowedBotCount = urand(sPlayerbotAIConfig->minRandomBots, effectiveMaxBots); - } - else - { - maxAllowedBotCount = effectiveMaxBots; - } - - SetEventValue(0, "bot_count", maxAllowedBotCount, - urand(sPlayerbotAIConfig->randomBotCountChangeMinInterval, - sPlayerbotAIConfig->randomBotCountChangeMaxInterval)); - - currentBots.clear(); - levelFilterAdjusted = true; - } - else - { - LOG_ERROR("playerbots", "No eligible bots found with level filter {}-{}. Change the level range.", - sPlayerbotAIConfig->randomBotMinLoginLevel, sPlayerbotAIConfig->randomBotMaxLoginLevel); - SetEventValue(0, "bot_count", 0, INT_MAX); - maxAllowedBotCount = 0; - currentBots.clear(); - levelFilterAdjusted = true; - } - } - else if (!levelFilterAdjusted) - { - // Normal bot count logic (no level filtering) - if (!maxAllowedBotCount || (maxAllowedBotCount < sPlayerbotAIConfig->minRandomBots || - maxAllowedBotCount > sPlayerbotAIConfig->maxRandomBots)) - { - maxAllowedBotCount = urand(sPlayerbotAIConfig->minRandomBots, sPlayerbotAIConfig->maxRandomBots); - SetEventValue(0, "bot_count", maxAllowedBotCount, - urand(sPlayerbotAIConfig->randomBotCountChangeMinInterval, - sPlayerbotAIConfig->randomBotCountChangeMaxInterval)); - } - levelFilterAdjusted = true; + maxAllowedBotCount = urand(sPlayerbotAIConfig->minRandomBots, sPlayerbotAIConfig->maxRandomBots); + SetEventValue(0, "bot_count", maxAllowedBotCount, + urand(sPlayerbotAIConfig->randomBotCountChangeMinInterval, + sPlayerbotAIConfig->randomBotCountChangeMaxInterval)); } GetBots(); @@ -836,41 +772,23 @@ uint32 RandomPlayerbotMgr::AddRandomBots() for (uint32 accountId : accountsToUse) { - // Lambda to process results regardless of query type - auto processResults = [&](auto result) - { - if (!result) - return; + CharacterDatabasePreparedStatement* stmt = + CharacterDatabase.GetPreparedStatement(CHAR_SEL_CHARS_BY_ACCOUNT_ID); + stmt->SetData(0, accountId); + PreparedQueryResult result = CharacterDatabase.Query(stmt); + if (!result) + continue; - do - { - Field* fields = result->Fetch(); - CharacterInfo info; - info.guid = fields[0].Get(); - info.rClass = fields[1].Get(); - info.rRace = fields[2].Get(); - info.accountId = accountId; - allCharacters.push_back(info); - } while (result->NextRow()); - }; - - if (IsLevelFilterActive()) - { - // Custom query with level filtering - auto result = CharacterDatabase.Query( - "SELECT guid, class, race FROM characters WHERE account = {} AND level >= {} AND level <= {}", - accountId, sPlayerbotAIConfig->randomBotMinLoginLevel, sPlayerbotAIConfig->randomBotMaxLoginLevel - ); - processResults(result); - } - else + do { - CharacterDatabasePreparedStatement* stmt = - CharacterDatabase.GetPreparedStatement(CHAR_SEL_CHARS_BY_ACCOUNT_ID); - stmt->SetData(0, accountId); - auto result = CharacterDatabase.Query(stmt); - processResults(result); - } + Field* fields = result->Fetch(); + CharacterInfo info; + info.guid = fields[0].Get(); + info.rClass = fields[1].Get(); + info.rRace = fields[2].Get(); + info.accountId = accountId; + allCharacters.push_back(info); + } while (result->NextRow()); } // Shuffle for class balance @@ -2752,55 +2670,17 @@ void RandomPlayerbotMgr::GetBots() stmt->SetData(0, 0); stmt->SetData(1, "add"); uint32 maxAllowedBotCount = GetEventValue(0, "bot_count"); - if (PreparedQueryResult result = PlayerbotsDatabase.Query(stmt)) { do { Field* fields = result->Fetch(); uint32 bot = fields[0].Get(); - if (GetEventValue(bot, "add")) - { - // Single query to get both account and level - QueryResult charResult = CharacterDatabase.Query("SELECT account, level FROM characters WHERE guid = {}", bot); - if (!charResult) - continue; - - Field* charFields = charResult->Fetch(); - uint32 botAccountId = charFields[0].Get(); - uint32 botLevel = charFields[1].Get(); - - // Skip if not an RNDbot account - bool isRndBotAccount = false; - for (uint32 accountId : rndBotTypeAccounts) - { - if (accountId == botAccountId) - { - isRndBotAccount = true; - break; - } - } - - if (!isRndBotAccount) - continue; - - // If level filtering is active, check bot level - if (IsLevelFilterActive()) - { - // Skip bots outside the allowed level range - if (botLevel < sPlayerbotAIConfig->randomBotMinLoginLevel || - botLevel > sPlayerbotAIConfig->randomBotMaxLoginLevel) - { - continue; - } - } - currentBots.push_back(bot); - if (currentBots.size() >= maxAllowedBotCount) - break; - } + if (currentBots.size() >= maxAllowedBotCount) + break; } while (result->NextRow()); } } @@ -2828,51 +2708,6 @@ std::vector RandomPlayerbotMgr::GetBgBots(uint32 bracket) return std::move(BgBots); } -void RandomPlayerbotMgr::PopulateEligibleBots() -{ - if (!sPlayerbotAIConfig || !(sPlayerbotAIConfig->randomBotMinLoginLevel > 1 || - sPlayerbotAIConfig->randomBotMaxLoginLevel < 80)) - return; - - LOG_INFO("playerbots", "Populating eligible bots for level filter ({}-{})...", - sPlayerbotAIConfig->randomBotMinLoginLevel, sPlayerbotAIConfig->randomBotMaxLoginLevel); - - bool botsAdded = false; - - // Use only RNDbot type accounts (type 1) - for (uint32 accountId : rndBotTypeAccounts) - { - QueryResult result = CharacterDatabase.Query( - "SELECT guid, level, online FROM characters WHERE account = {} AND level >= {} AND level <= {}", - accountId, sPlayerbotAIConfig->randomBotMinLoginLevel, sPlayerbotAIConfig->randomBotMaxLoginLevel - ); - - if (result) - { - do - { - Field* fields = result->Fetch(); - uint32 botGuid = fields[0].Get(); - bool isOnline = fields[2].Get(); - - // Skip bots that are already online or already have "add" event - if (isOnline || GetEventValue(botGuid, "add")) - continue; - - uint32 add_time = urand(sPlayerbotAIConfig->minRandomBotInWorldTime, - sPlayerbotAIConfig->maxRandomBotInWorldTime); - SetEventValue(botGuid, "add", 1, add_time); - botsAdded = true; - } while (result->NextRow()); - } - } - - if (botsAdded) - { - currentBots.clear(); // Force reload - } -} - uint32 RandomPlayerbotMgr::GetEventValue(uint32 bot, std::string const event) { // load all events at once on first event load @@ -2900,13 +2735,23 @@ uint32 RandomPlayerbotMgr::GetEventValue(uint32 bot, std::string const event) } CachedEvent& e = eventCache[bot][event]; + /*if (e.IsEmpty()) + { + QueryResult results = PlayerbotsDatabase.Query("SELECT `value`, `time`, validIn, `data` FROM + playerbots_random_bots WHERE owner = 0 AND bot = {} AND event = {}", bot, event.c_str()); - bool shouldExpire = (time(0) - e.lastChangeTime) >= e.validIn && - event != "specNo" && - event != "specLink" && - !(event == "bot_count" && IsLevelFilterActive()); // Don't expire bot_count when level filtering is active + if (results) + { + Field* fields = results->Fetch(); + e.value = fields[0].Get(); + e.lastChangeTime = fields[1].Get(); + e.validIn = fields[2].Get(); + e.data = fields[3].Get(); + } + } + */ - if (shouldExpire) + if ((time(0) - e.lastChangeTime) >= e.validIn && event != "specNo" && event != "specLink") e.value = 0; return e.value; diff --git a/src/RandomPlayerbotMgr.h b/src/RandomPlayerbotMgr.h index 0906ef5483..be624328d6 100644 --- a/src/RandomPlayerbotMgr.h +++ b/src/RandomPlayerbotMgr.h @@ -193,14 +193,6 @@ class RandomPlayerbotMgr : public PlayerbotHolder void AssignAccountTypes(); bool IsAccountType(uint32 accountId, uint8 accountType); - // Allowed login range management - void ForceRecount() { SetEventValue(0, "bot_count", 0, 0); } - void MarkBotForLogout(uint32 bot) - { - SetEventValue(bot, "add", 0, 0); // Clear the "add" event to trigger logout - SetEventValue(bot, "logout", 1, 1); // Also set logout for clarity - } - protected: void OnBotLoginInternal(Player* const bot) override; @@ -245,16 +237,6 @@ class RandomPlayerbotMgr : public PlayerbotHolder std::vector rndBotTypeAccounts; // Accounts marked as RNDbot (type 1) std::vector addClassTypeAccounts; // Accounts marked as AddClass (type 2) - // Login level filtering - bool levelFilterAdjusted = false; - void PopulateEligibleBots(); - bool IsLevelFilterActive() const - { - return sPlayerbotAIConfig && - (sPlayerbotAIConfig->randomBotMinLoginLevel > 1 || - sPlayerbotAIConfig->randomBotMaxLoginLevel < 80); - } - //void ScaleBotActivity(); // Deprecated function }; From 7d50ceef3daebef32075085ed88d7293d7b857ce Mon Sep 17 00:00:00 2001 From: Iain Donnelly Date: Wed, 1 Oct 2025 16:39:48 +0100 Subject: [PATCH 091/151] Update RandomPlayerbotFactory.cpp Added a query to count the number of guilds straight from the DB, then filter out player guilds. (instead of relying on accessing guilds from a list of random bots and adding them up) This needs some formatting / tidying once I make sure we are counting guilds properly. --- src/RandomPlayerbotFactory.cpp | 41 ++++++++++++++++++++++++++++++++-- 1 file changed, 39 insertions(+), 2 deletions(-) diff --git a/src/RandomPlayerbotFactory.cpp b/src/RandomPlayerbotFactory.cpp index cf5fdc915e..b5d74b8d44 100644 --- a/src/RandomPlayerbotFactory.cpp +++ b/src/RandomPlayerbotFactory.cpp @@ -875,15 +875,52 @@ void RandomPlayerbotFactory::CreateRandomGuilds() LOG_INFO("playerbots", "Random bot guilds deleted"); } + // Check how many randomBot guilds are in the guild table in the characterDB uint32 guildNumber = 0; + QueryResult guildTableResults = CharacterDatabase.Query("SELECT guildid, leaderguid FROM guid"); + if (guildTableResults) + { + do + { + Field* fields = guildTableResults->Fetch(); + uint32 guildID = fields[0].Get(); + uint32 leaderGuid = fields[1].Get(); + + // check the accountID of the guild leader against the list of randomBot accounts to determine if this is a player guild or a bot guild + QueryResult charactersTableResults = CharacterDatabase.Query("SELECT account FROM characters WHERE guid = ({})", leaderGuid); + if (charactersTableResults) + { + Field* fields2 = charactersTableResults->Fetch(); + uint32 accountID = fields2[0].Get(); + + if(std::find(sPlayerbotAIConfig->randomBotAccounts.begin(),sPlayerbotAIConfig->randomBotAccounts.end(), accountID) != sPlayerbotAIConfig->randomBotAccounts.end()) + { + guildNumber++; + sPlayerbotAIConfig->randomBotGuilds.push_back(guildID); + } + } + } while (guildTableResults->NextRow()); + } + GuidVector availableLeaders; for (std::vector::iterator i = randomBots.begin(); i != randomBots.end(); ++i) { ObjectGuid leader = ObjectGuid::Create(*i); if (Guild* guild = sGuildMgr->GetGuildByLeader(leader)) { - ++guildNumber; - sPlayerbotAIConfig->randomBotGuilds.push_back(guild->GetId()); + uint32 guildID = guild->GetId(); + if(std::find(sPlayerbotAIConfig->randomBotGuilds.begin(), sPlayerbotAIConfig->randomBotGuilds.end(), guildID) !=sPlayerbotAIConfig->randomBotGuilds.end()) + { + // this randombot guild has already been counted, the leader is not availble + } + else + { + // somehow we missed this guild when checking the guild table + // THIS SHOULDN'T RUN. + // THIS ENTIRE FIND() IS A WASTE OF RESOURCES (in theory) + ++guildNumber; + sPlayerbotAIConfig->randomBotGuilds.push_back(guildID); + } } else { From 8a68de4476fef4aa0c00d97e5c6a855ffc445276 Mon Sep 17 00:00:00 2001 From: Iain Donnelly Date: Wed, 1 Oct 2025 17:36:00 +0100 Subject: [PATCH 092/151] Update RandomPlayerbotFactory.cpp Fixed a typo --- src/RandomPlayerbotFactory.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/RandomPlayerbotFactory.cpp b/src/RandomPlayerbotFactory.cpp index b5d74b8d44..c28b9587f0 100644 --- a/src/RandomPlayerbotFactory.cpp +++ b/src/RandomPlayerbotFactory.cpp @@ -877,7 +877,7 @@ void RandomPlayerbotFactory::CreateRandomGuilds() // Check how many randomBot guilds are in the guild table in the characterDB uint32 guildNumber = 0; - QueryResult guildTableResults = CharacterDatabase.Query("SELECT guildid, leaderguid FROM guid"); + QueryResult guildTableResults = CharacterDatabase.Query("SELECT guildid, leaderguid FROM guild"); if (guildTableResults) { do @@ -887,7 +887,7 @@ void RandomPlayerbotFactory::CreateRandomGuilds() uint32 leaderGuid = fields[1].Get(); // check the accountID of the guild leader against the list of randomBot accounts to determine if this is a player guild or a bot guild - QueryResult charactersTableResults = CharacterDatabase.Query("SELECT account FROM characters WHERE guid = ({})", leaderGuid); + QueryResult charactersTableResults = CharacterDatabase.Query("SELECT account FROM characters WHERE guid = {}", leaderGuid); if (charactersTableResults) { Field* fields2 = charactersTableResults->Fetch(); From 444be2994e184eff444bdb5334cf2b63dc824aca Mon Sep 17 00:00:00 2001 From: Iain Donnelly Date: Wed, 1 Oct 2025 23:20:48 +0100 Subject: [PATCH 093/151] v2 Neatened some things up, removed obsolete code, added a break out of the loop if an empty guild name (none available) is returned from the playerbots_guild_names table. --- src/RandomPlayerbotFactory.cpp | 20 +++++--------------- 1 file changed, 5 insertions(+), 15 deletions(-) diff --git a/src/RandomPlayerbotFactory.cpp b/src/RandomPlayerbotFactory.cpp index c28b9587f0..49d32b0c65 100644 --- a/src/RandomPlayerbotFactory.cpp +++ b/src/RandomPlayerbotFactory.cpp @@ -902,25 +902,14 @@ void RandomPlayerbotFactory::CreateRandomGuilds() } while (guildTableResults->NextRow()); } + // Get a list of bots that are logged in and available to lead new guilds GuidVector availableLeaders; for (std::vector::iterator i = randomBots.begin(); i != randomBots.end(); ++i) { ObjectGuid leader = ObjectGuid::Create(*i); if (Guild* guild = sGuildMgr->GetGuildByLeader(leader)) { - uint32 guildID = guild->GetId(); - if(std::find(sPlayerbotAIConfig->randomBotGuilds.begin(), sPlayerbotAIConfig->randomBotGuilds.end(), guildID) !=sPlayerbotAIConfig->randomBotGuilds.end()) - { - // this randombot guild has already been counted, the leader is not availble - } - else - { - // somehow we missed this guild when checking the guild table - // THIS SHOULDN'T RUN. - // THIS ENTIRE FIND() IS A WASTE OF RESOURCES (in theory) - ++guildNumber; - sPlayerbotAIConfig->randomBotGuilds.push_back(guildID); - } + // Bot is already a GM } else { @@ -929,6 +918,7 @@ void RandomPlayerbotFactory::CreateRandomGuilds() availableLeaders.push_back(leader); } } + LOG_INFO("playerbots", "randomBotGuilds - {} available leaders for new guilds found", availableLeaders.size()); // Create up to randomBotGuildCount by counting only EFFECTIVE creations uint32 createdThisRun = 0; @@ -936,10 +926,10 @@ void RandomPlayerbotFactory::CreateRandomGuilds() { std::string const guildName = CreateRandomGuildName(); if (guildName.empty()) - continue; + break; // no more names available in playerbots_guild_names if (sGuildMgr->GetGuildByName(guildName)) - continue; + continue; // name already taken, skip if (availableLeaders.empty()) { From 24f841f7284a24b5a2ef32423847f029aa5af4a0 Mon Sep 17 00:00:00 2001 From: Iain Donnelly Date: Wed, 1 Oct 2025 23:35:08 +0100 Subject: [PATCH 094/151] Verbose logging. Should now be able to see guild count values as the server inits --- src/RandomPlayerbotFactory.cpp | 17 ++++++++++++++--- 1 file changed, 14 insertions(+), 3 deletions(-) diff --git a/src/RandomPlayerbotFactory.cpp b/src/RandomPlayerbotFactory.cpp index 49d32b0c65..4b375c112b 100644 --- a/src/RandomPlayerbotFactory.cpp +++ b/src/RandomPlayerbotFactory.cpp @@ -902,6 +902,18 @@ void RandomPlayerbotFactory::CreateRandomGuilds() } while (guildTableResults->NextRow()); } + // Is it worth continuing? + LOG_INFO("playerbots", "{}/{} random bot guilds exist in guild table)", guildNumber, sPlayerbotAIConfig->randomBotGuildCount); + if (guildNumber >= sPlayerbotAIConfig->randomBotGuildCount) + { + LOG_INFO("playerbots", "No new random guilds required"); + return; + } + else + { + LOG_INFO("playerbots", "Creating {} new random guilds...", sPlayerbotAIConfig->randomBotGuildCount - guildNumber); + } + // Get a list of bots that are logged in and available to lead new guilds GuidVector availableLeaders; for (std::vector::iterator i = randomBots.begin(); i != randomBots.end(); ++i) @@ -918,7 +930,7 @@ void RandomPlayerbotFactory::CreateRandomGuilds() availableLeaders.push_back(leader); } } - LOG_INFO("playerbots", "randomBotGuilds - {} available leaders for new guilds found", availableLeaders.size()); + LOG_INFO("playerbots", "{} available leaders for new guilds found", availableLeaders.size()); // Create up to randomBotGuildCount by counting only EFFECTIVE creations uint32 createdThisRun = 0; @@ -1008,8 +1020,7 @@ void RandomPlayerbotFactory::CreateRandomGuilds() } // Shows the true total and how many were created during this run - LOG_INFO("playerbots", "{} random bot guilds available (created this run: {})", - uint32(sPlayerbotAIConfig->randomBotGuilds.size()), createdThisRun); + LOG_INFO("playerbots", "{} random bot guilds created this run)", createdThisRun); } std::string const RandomPlayerbotFactory::CreateRandomGuildName() From 0e4c759e7f2b9951dda811960ff72b03765a5f93 Mon Sep 17 00:00:00 2001 From: Iain Donnelly Date: Thu, 2 Oct 2025 14:37:47 +0100 Subject: [PATCH 095/151] Wishmaster update Optimised, better use of DB Query, avoids reallocations. Nice. --- src/RandomPlayerbotFactory.cpp | 69 ++++++++++++++++++---------------- 1 file changed, 37 insertions(+), 32 deletions(-) diff --git a/src/RandomPlayerbotFactory.cpp b/src/RandomPlayerbotFactory.cpp index 4b375c112b..bed18d6cdd 100644 --- a/src/RandomPlayerbotFactory.cpp +++ b/src/RandomPlayerbotFactory.cpp @@ -875,59 +875,64 @@ void RandomPlayerbotFactory::CreateRandomGuilds() LOG_INFO("playerbots", "Random bot guilds deleted"); } - // Check how many randomBot guilds are in the guild table in the characterDB + std::unordered_set botAccounts; + botAccounts.reserve(sPlayerbotAIConfig->randomBotAccounts.size()); + for (uint32 acc : sPlayerbotAIConfig->randomBotAccounts) + botAccounts.insert(acc); + + // Recount bot guilds directly from the database (does not depend on connected bots) uint32 guildNumber = 0; - QueryResult guildTableResults = CharacterDatabase.Query("SELECT guildid, leaderguid FROM guild"); - if (guildTableResults) + sPlayerbotAIConfig->randomBotGuilds.clear(); + sPlayerbotAIConfig->randomBotGuilds.shrink_to_fit(); // avoids accumulating old capacity + + if (!botAccounts.empty()) { - do + if (QueryResult res = CharacterDatabase.Query( + // We only retrieve what is necessary (guildid, leader account) + "SELECT g.guildid, c.account " + "FROM guild g JOIN characters c ON g.leaderguid = c.guid")) { - Field* fields = guildTableResults->Fetch(); - uint32 guildID = fields[0].Get(); - uint32 leaderGuid = fields[1].Get(); - - // check the accountID of the guild leader against the list of randomBot accounts to determine if this is a player guild or a bot guild - QueryResult charactersTableResults = CharacterDatabase.Query("SELECT account FROM characters WHERE guid = {}", leaderGuid); - if (charactersTableResults) + do { - Field* fields2 = charactersTableResults->Fetch(); - uint32 accountID = fields2[0].Get(); + Field* f = res->Fetch(); + const uint32 guildId = f[0].Get(); + const uint32 accountId = f[1].Get(); - if(std::find(sPlayerbotAIConfig->randomBotAccounts.begin(),sPlayerbotAIConfig->randomBotAccounts.end(), accountID) != sPlayerbotAIConfig->randomBotAccounts.end()) + // Boss considered 'bot' if his account is in botAccounts + if (botAccounts.find(accountId) != botAccounts.end()) { - guildNumber++; - sPlayerbotAIConfig->randomBotGuilds.push_back(guildID); + ++guildNumber; + sPlayerbotAIConfig->randomBotGuilds.push_back(guildId); } - } - } while (guildTableResults->NextRow()); + } while (res->NextRow()); + } } - // Is it worth continuing? - LOG_INFO("playerbots", "{}/{} random bot guilds exist in guild table)", guildNumber, sPlayerbotAIConfig->randomBotGuildCount); + LOG_INFO("playerbots", "{}/{} random bot guilds exist in guild table",guildNumber, sPlayerbotAIConfig->randomBotGuildCount); if (guildNumber >= sPlayerbotAIConfig->randomBotGuildCount) { LOG_INFO("playerbots", "No new random guilds required"); return; } - else - { - LOG_INFO("playerbots", "Creating {} new random guilds...", sPlayerbotAIConfig->randomBotGuildCount - guildNumber); - } - // Get a list of bots that are logged in and available to lead new guilds + // We list the available leaders (online bots, not in guilds) GuidVector availableLeaders; - for (std::vector::iterator i = randomBots.begin(); i != randomBots.end(); ++i) + availableLeaders.reserve(randomBots.size()); // limit reallocs + for (const uint32 botLowGuid : randomBots) { - ObjectGuid leader = ObjectGuid::Create(*i); - if (Guild* guild = sGuildMgr->GetGuildByLeader(leader)) + ObjectGuid leader = ObjectGuid::Create(botLowGuid); + if (sGuildMgr->GetGuildByLeader(leader)) { - // Bot is already a GM + // already GuildLeader -> ignored + continue; } else { - Player* player = ObjectAccessor::FindPlayer(leader); - if (player && !player->GetGuildId()) - availableLeaders.push_back(leader); + if (Player* player = ObjectAccessor::FindPlayer(leader)) + { + if (!player->GetGuildId()) + availableLeaders.push_back(leader); + } } } LOG_INFO("playerbots", "{} available leaders for new guilds found", availableLeaders.size()); From d26c2a354912a6f23870137eeaade489de05c600 Mon Sep 17 00:00:00 2001 From: root Date: Sun, 5 Oct 2025 16:15:09 +1100 Subject: [PATCH 096/151] fix: Clean visibility references before bot teleport to prevent crash MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Add PLAYERHOOK_ON_BEFORE_TELEPORT to proactively clean visibility references when a bot teleports between maps. This prevents a race condition where: 1. Bot A teleports and its visible objects start getting cleaned up 2. Bot B is simultaneously updating visibility and tries to access objects in Bot A's old visibility map 3. Those objects may already be freed, causing a segmentation fault at GridNotifiers.cpp:65 in IsWorldObjectOutOfSightRange() The fix only affects bots to avoid changing behavior for real players. 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude --- src/Playerbots.cpp | 23 ++++++++++++++++++++++- 1 file changed, 22 insertions(+), 1 deletion(-) diff --git a/src/Playerbots.cpp b/src/Playerbots.cpp index b5334ba758..e3059056b6 100644 --- a/src/Playerbots.cpp +++ b/src/Playerbots.cpp @@ -87,7 +87,8 @@ class PlayerbotsPlayerScript : public PlayerScript PLAYERHOOK_ON_BEFORE_CRITERIA_PROGRESS, PLAYERHOOK_ON_BEFORE_ACHI_COMPLETE, PLAYERHOOK_CAN_PLAYER_USE_PRIVATE_CHAT, - PLAYERHOOK_ON_GIVE_EXP + PLAYERHOOK_ON_GIVE_EXP, + PLAYERHOOK_ON_BEFORE_TELEPORT }) {} void OnPlayerLogin(Player* player) override @@ -121,6 +122,26 @@ class PlayerbotsPlayerScript : public PlayerScript } } + bool OnPlayerBeforeTeleport(Player* player, uint32 mapid, float /*x*/, float /*y*/, float /*z*/, float /*orientation*/, uint32 /*options*/, Unit* /*target*/) override + { + // Only apply to bots to prevent affecting real players + if (!player || !player->GetSession()->IsBot()) + return true; + + // If changing maps, proactively clean visibility references to prevent + // stale pointers in other players' visibility maps during the teleport. + // This fixes a race condition where: + // 1. Bot A teleports and its visible objects start getting cleaned up + // 2. Bot B is simultaneously updating visibility and tries to access objects in Bot A's old visibility map + // 3. Those objects may already be freed, causing a segmentation fault + if (player->GetMapId() != mapid && player->IsInWorld()) + { + player->GetObjectVisibilityContainer().CleanVisibilityReferences(); + } + + return true; // Allow teleport to continue + } + void OnPlayerAfterUpdate(Player* player, uint32 diff) override { if (PlayerbotAI* botAI = GET_PLAYERBOT_AI(player)) From 1faf20f567efbee6978622c378d8c1b33c722eed Mon Sep 17 00:00:00 2001 From: bash Date: Sun, 5 Oct 2025 20:05:56 +0200 Subject: [PATCH 097/151] removeFromGroup replaced with worldpackets --- src/PlayerbotAI.cpp | 20 +++-- src/PlayerbotAI.h | 1 + src/PlayerbotMgr.cpp | 4 +- src/RandomPlayerbotMgr.cpp | 94 ++++++++++++----------- src/strategy/actions/LeaveGroupAction.cpp | 8 +- 5 files changed, 69 insertions(+), 58 deletions(-) diff --git a/src/PlayerbotAI.cpp b/src/PlayerbotAI.cpp index 9019724ebe..d9d79261cc 100644 --- a/src/PlayerbotAI.cpp +++ b/src/PlayerbotAI.cpp @@ -378,10 +378,7 @@ void PlayerbotAI::UpdateAIGroupMembership() PlayerbotAI* leaderAI = GET_PLAYERBOT_AI(leader); if (leaderAI && !leaderAI->IsRealPlayer()) { - WorldPacket* packet = new WorldPacket(CMSG_GROUP_DISBAND); - bot->GetSession()->QueuePacket(packet); - // bot->RemoveFromGroup(); - ResetStrategies(); + RemoveFromGroup(); } } } @@ -405,10 +402,7 @@ void PlayerbotAI::UpdateAIGroupMembership() } if (!hasRealPlayer) { - WorldPacket* packet = new WorldPacket(CMSG_GROUP_DISBAND); - bot->GetSession()->QueuePacket(packet); - // bot->RemoveFromGroup(); - ResetStrategies(); + RemoveFromGroup(); } } } @@ -791,6 +785,16 @@ void PlayerbotAI::Reset(bool full) } } +void PlayerbotAI::RemoveFromGroup() +{ + if (!bot || !bot->GetGroup() || bot->IsRealPlayer()) + return; + + WorldPacket* packet = new WorldPacket(CMSG_GROUP_DISBAND); + bot->GetSession()->QueuePacket(packet); + ResetStrategies(); +} + bool PlayerbotAI::IsAllowedCommand(std::string const text) { if (unsecuredCommands.empty()) diff --git a/src/PlayerbotAI.h b/src/PlayerbotAI.h index 04deae3a1b..d38f1b982b 100644 --- a/src/PlayerbotAI.h +++ b/src/PlayerbotAI.h @@ -415,6 +415,7 @@ class PlayerbotAI : public PlayerbotAIBase void ResetStrategies(bool load = false); void ReInitCurrentEngine(); void Reset(bool full = false); + void PlayerbotAI::RemoveFromGroup() static bool IsTank(Player* player, bool bySpec = false); static bool IsHeal(Player* player, bool bySpec = false); static bool IsDps(Player* player, bool bySpec = false); diff --git a/src/PlayerbotMgr.cpp b/src/PlayerbotMgr.cpp index ba0f4e3924..f5aefe4563 100644 --- a/src/PlayerbotMgr.cpp +++ b/src/PlayerbotMgr.cpp @@ -514,12 +514,12 @@ void PlayerbotHolder::OnBotLogin(Player* const bot) if (!groupValid) { - bot->RemoveFromGroup(); + botAI->RemoveFromGroup(); } } group = bot->GetGroup(); - if (group) + if (!group) { botAI->ResetStrategies(); } diff --git a/src/RandomPlayerbotMgr.cpp b/src/RandomPlayerbotMgr.cpp index ab28c25da4..07664f860c 100644 --- a/src/RandomPlayerbotMgr.cpp +++ b/src/RandomPlayerbotMgr.cpp @@ -1517,33 +1517,38 @@ bool RandomPlayerbotMgr::ProcessBot(uint32 bot) return false; } -bool RandomPlayerbotMgr::ProcessBot(Player* player) +bool RandomPlayerbotMgr::ProcessBot(Player* bot) { - uint32 bot = player->GetGUID().GetCounter(); - if (player->InBattleground()) + PlayerbotAI* botAI = GET_PLAYERBOT_AI(bot); + if (botAI) + return false; + + if (bot->InBattleground()) return false; - if (player->InBattlegroundQueue()) + if (bot->InBattlegroundQueue()) return false; + uint32 botId = bot->GetGUID().GetCounter(); + // if death revive - if (player->isDead()) + if (bot->isDead()) { - if (!GetEventValue(bot, "dead")) + if (!GetEventValue(botId, "dead")) { uint32 randomTime = urand(sPlayerbotAIConfig->minRandomBotReviveTime, sPlayerbotAIConfig->maxRandomBotReviveTime); - LOG_DEBUG("playerbots", "Mark bot {} as dead, will be revived in {}s.", player->GetName().c_str(), + LOG_DEBUG("playerbots", "Mark bot {} as dead, will be revived in {}s.", bot->GetName().c_str(), randomTime); - SetEventValue(bot, "dead", 1, sPlayerbotAIConfig->maxRandomBotInWorldTime); - SetEventValue(bot, "revive", 1, randomTime); + SetEventValue(botId, "dead", 1, sPlayerbotAIConfig->maxRandomBotInWorldTime); + SetEventValue(botId, "revive", 1, randomTime); return false; } - if (!GetEventValue(bot, "revive")) + if (!GetEventValue(botId, "revive")) { - Revive(player); + Revive(bot); return true; } @@ -1551,34 +1556,31 @@ bool RandomPlayerbotMgr::ProcessBot(Player* player) } // leave group if leader is rndbot - Group* group = player->GetGroup(); + Group* group = bot->GetGroup(); if (group && !group->isLFGGroup() && IsRandomBot(group->GetLeader())) { - player->RemoveFromGroup(); - LOG_INFO("playerbots", "Bot {} remove from group since leader is random bot.", player->GetName().c_str()); + botAI->RemoveFromGroup(); + LOG_INFO("playerbots", "Bot {} remove from group since leader is random bot.", bot->GetName().c_str()); } // only randomize and teleport idle bots bool idleBot = false; - PlayerbotAI* botAI = GET_PLAYERBOT_AI(player); - if (botAI) + if (TravelTarget* target = botAI->GetAiObjectContext()->GetValue("travel target")->Get()) { - if (TravelTarget* target = botAI->GetAiObjectContext()->GetValue("travel target")->Get()) - { - if (target->getTravelState() == TravelState::TRAVEL_STATE_IDLE) - { - idleBot = true; - } - } - else + if (target->getTravelState() == TravelState::TRAVEL_STATE_IDLE) { idleBot = true; } } + else + { + idleBot = true; + } + if (idleBot) { // randomize - uint32 randomize = GetEventValue(bot, "randomize"); + uint32 randomize = GetEventValue(botId, "randomize"); if (!randomize) { // bool randomiser = true; @@ -1602,12 +1604,12 @@ bool RandomPlayerbotMgr::ProcessBot(Player* player) // } // if (randomiser) // { - Randomize(player); - LOG_DEBUG("playerbots", "Bot #{} {}:{} <{}>: randomized", bot, - player->GetTeamId() == TEAM_ALLIANCE ? "A" : "H", player->GetLevel(), player->GetName()); + Randomize(bot); + LOG_DEBUG("playerbots", "Bot #{} {}:{} <{}>: randomized", botId, + bot->GetTeamId() == TEAM_ALLIANCE ? "A" : "H", bot->GetLevel(), bot->GetName()); uint32 randomTime = urand(sPlayerbotAIConfig->minRandomBotRandomizeTime, sPlayerbotAIConfig->maxRandomBotRandomizeTime); - ScheduleRandomize(bot, randomTime); + ScheduleRandomize(botId, randomTime); return true; } @@ -1619,15 +1621,15 @@ bool RandomPlayerbotMgr::ProcessBot(Player* player) // return true; // } - uint32 teleport = GetEventValue(bot, "teleport"); + uint32 teleport = GetEventValue(botId, "teleport"); if (!teleport) { - LOG_DEBUG("playerbots", "Bot #{} <{}>: teleport for level and refresh", bot, player->GetName()); - Refresh(player); - RandomTeleportForLevel(player); + LOG_DEBUG("playerbots", "Bot #{} <{}>: teleport for level and refresh", botId, bot->GetName()); + Refresh(bot); + RandomTeleportForLevel(bot); uint32 time = urand(sPlayerbotAIConfig->minRandomBotTeleportInterval, sPlayerbotAIConfig->maxRandomBotTeleportInterval); - ScheduleTeleport(bot, time); + ScheduleTeleport(botId, time); return true; } } @@ -2376,6 +2378,10 @@ void RandomPlayerbotMgr::IncreaseLevel(Player* bot) void RandomPlayerbotMgr::RandomizeFirst(Player* bot) { + PlayerbotAI* botAI = GET_PLAYERBOT_AI(player); + if (botAI) + return; + uint32 maxLevel = sPlayerbotAIConfig->randomBotMaxLevel; if (maxLevel > sWorld->getIntConfig(CONFIG_MAX_PLAYER_LEVEL)) maxLevel = sWorld->getIntConfig(CONFIG_MAX_PLAYER_LEVEL); @@ -2433,7 +2439,6 @@ void RandomPlayerbotMgr::RandomizeFirst(Player* bot) } SetValue(bot, "level", level); - PlayerbotFactory factory(bot, level); factory.Randomize(false); @@ -2455,11 +2460,10 @@ void RandomPlayerbotMgr::RandomizeFirst(Player* bot) PlayerbotsDatabase.Execute(stmt); // teleport to a random inn for bot level - if (GET_PLAYERBOT_AI(bot)) - GET_PLAYERBOT_AI(bot)->Reset(true); + botAI->Reset(true); if (bot->GetGroup()) - bot->RemoveFromGroup(); + botAI->RemoveFromGroup(); if (pmo) pmo->finish(); @@ -2469,12 +2473,13 @@ void RandomPlayerbotMgr::RandomizeFirst(Player* bot) void RandomPlayerbotMgr::RandomizeMin(Player* bot) { - PerformanceMonitorOperation* pmo = sPerformanceMonitor->start(PERF_MON_RNDBOT, "RandomizeMin"); + PlayerbotAI* botAI = GET_PLAYERBOT_AI(player); + if (botAI) + return; + PerformanceMonitorOperation* pmo = sPerformanceMonitor->start(PERF_MON_RNDBOT, "RandomizeMin"); uint32 level = sPlayerbotAIConfig->randomBotMinLevel; - SetValue(bot, "level", level); - PlayerbotFactory factory(bot, level); factory.Randomize(false); @@ -2496,11 +2501,10 @@ void RandomPlayerbotMgr::RandomizeMin(Player* bot) PlayerbotsDatabase.Execute(stmt); // teleport to a random inn for bot level - if (GET_PLAYERBOT_AI(bot)) - GET_PLAYERBOT_AI(bot)->Reset(true); + botAI->Reset(true); if (bot->GetGroup()) - bot->RemoveFromGroup(); + botAI->RemoveFromGroup(); if (pmo) pmo->finish(); @@ -2582,7 +2586,7 @@ void RandomPlayerbotMgr::Refresh(Player* bot) bot->SetMoney(money + 500 * sqrt(urand(1, bot->GetLevel() * 5))); if (bot->GetGroup()) - bot->RemoveFromGroup(); + botAI->RemoveFromGroup(); if (pmo) pmo->finish(); diff --git a/src/strategy/actions/LeaveGroupAction.cpp b/src/strategy/actions/LeaveGroupAction.cpp index 2773ce4ba4..45a95de7c0 100644 --- a/src/strategy/actions/LeaveGroupAction.cpp +++ b/src/strategy/actions/LeaveGroupAction.cpp @@ -70,10 +70,12 @@ bool UninviteAction::Execute(Event event) return false; } -bool LeaveGroupAction::Leave(Player* player) +static bool LeaveGroupAction::Leave(Player* player) { - if (player && !GET_PLAYERBOT_AI(player) && + if (player && + !botAI && !botAI->GetSecurity()->CheckLevelFor(PLAYERBOT_SECURITY_INVITE, false, player)) + return false; bool aiMaster = GET_PLAYERBOT_AI(botAI->GetMaster()) != nullptr; @@ -84,7 +86,7 @@ bool LeaveGroupAction::Leave(Player* player) bool shouldStay = randomBot && bot->GetGroup() && player == bot; if (!shouldStay) { - bot->RemoveFromGroup(); + botAI->RemoveFromGroup(); } if (randomBot) From 780f6d60e0387fb63d1a029ed338b753e83aab98 Mon Sep 17 00:00:00 2001 From: bash Date: Sun, 5 Oct 2025 23:49:13 +0200 Subject: [PATCH 098/151] fix build errors --- src/PlayerbotAI.cpp | 2 +- src/PlayerbotAI.h | 2 +- src/RandomPlayerbotMgr.cpp | 4 ++-- src/strategy/actions/LeaveGroupAction.cpp | 2 +- 4 files changed, 5 insertions(+), 5 deletions(-) diff --git a/src/PlayerbotAI.cpp b/src/PlayerbotAI.cpp index d9d79261cc..aa161734a2 100644 --- a/src/PlayerbotAI.cpp +++ b/src/PlayerbotAI.cpp @@ -787,7 +787,7 @@ void PlayerbotAI::Reset(bool full) void PlayerbotAI::RemoveFromGroup() { - if (!bot || !bot->GetGroup() || bot->IsRealPlayer()) + if (!bot || !bot->GetGroup() || IsRealPlayer()) return; WorldPacket* packet = new WorldPacket(CMSG_GROUP_DISBAND); diff --git a/src/PlayerbotAI.h b/src/PlayerbotAI.h index d38f1b982b..a5ac2bd8d3 100644 --- a/src/PlayerbotAI.h +++ b/src/PlayerbotAI.h @@ -415,7 +415,7 @@ class PlayerbotAI : public PlayerbotAIBase void ResetStrategies(bool load = false); void ReInitCurrentEngine(); void Reset(bool full = false); - void PlayerbotAI::RemoveFromGroup() + void RemoveFromGroup(); static bool IsTank(Player* player, bool bySpec = false); static bool IsHeal(Player* player, bool bySpec = false); static bool IsDps(Player* player, bool bySpec = false); diff --git a/src/RandomPlayerbotMgr.cpp b/src/RandomPlayerbotMgr.cpp index 07664f860c..ebab628ff2 100644 --- a/src/RandomPlayerbotMgr.cpp +++ b/src/RandomPlayerbotMgr.cpp @@ -2378,7 +2378,7 @@ void RandomPlayerbotMgr::IncreaseLevel(Player* bot) void RandomPlayerbotMgr::RandomizeFirst(Player* bot) { - PlayerbotAI* botAI = GET_PLAYERBOT_AI(player); + PlayerbotAI* botAI = GET_PLAYERBOT_AI(bot); if (botAI) return; @@ -2473,7 +2473,7 @@ void RandomPlayerbotMgr::RandomizeFirst(Player* bot) void RandomPlayerbotMgr::RandomizeMin(Player* bot) { - PlayerbotAI* botAI = GET_PLAYERBOT_AI(player); + PlayerbotAI* botAI = GET_PLAYERBOT_AI(bot); if (botAI) return; diff --git a/src/strategy/actions/LeaveGroupAction.cpp b/src/strategy/actions/LeaveGroupAction.cpp index 45a95de7c0..172bf399d0 100644 --- a/src/strategy/actions/LeaveGroupAction.cpp +++ b/src/strategy/actions/LeaveGroupAction.cpp @@ -70,7 +70,7 @@ bool UninviteAction::Execute(Event event) return false; } -static bool LeaveGroupAction::Leave(Player* player) +bool LeaveGroupAction::Leave(Player* player) { if (player && !botAI && From c90b155a70f02dc8d30b4347dd4ad23dc45e8b8f Mon Sep 17 00:00:00 2001 From: root Date: Mon, 6 Oct 2025 11:22:45 +1100 Subject: [PATCH 099/151] fix: Replace static m_botReleaseTimes with per-bot storage to prevent race condition MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Fixes a thread safety issue where multiple bots dying in battlegrounds simultaneously would corrupt the shared static unordered_map, causing segmentation faults. Changes: - Remove: static m_botReleaseTimes map from AutoReleaseSpiritAction - Add: bgReleaseAttemptTime member to PlayerbotAI (per-bot storage) - Update: All references to use per-bot storage instead of static map Why this fixes the crash: - Each PlayerbotAI instance is accessed by only one map update thread - No cross-thread access to shared data structures - No mutex/locking required - thread-safe by design - Automatic cleanup when bot is destroyed Thread-safe solution: Per-bot state eliminates race conditions without performance overhead. 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude --- src/PlayerbotAI.h | 1 + src/strategy/actions/ReleaseSpiritAction.cpp | 14 ++++++-------- src/strategy/actions/ReleaseSpiritAction.h | 1 - 3 files changed, 7 insertions(+), 9 deletions(-) diff --git a/src/PlayerbotAI.h b/src/PlayerbotAI.h index 04deae3a1b..180606e82d 100644 --- a/src/PlayerbotAI.h +++ b/src/PlayerbotAI.h @@ -601,6 +601,7 @@ class PlayerbotAI : public PlayerbotAIBase NewRpgInfo rpgInfo; NewRpgStatistic rpgStatistic; std::unordered_set lowPriorityQuest; + time_t bgReleaseAttemptTime = 0; // Schedules a callback to run once after milliseconds. void AddTimedEvent(std::function callback, uint32 delayMs); diff --git a/src/strategy/actions/ReleaseSpiritAction.cpp b/src/strategy/actions/ReleaseSpiritAction.cpp index 0d725f749c..666e42aba3 100644 --- a/src/strategy/actions/ReleaseSpiritAction.cpp +++ b/src/strategy/actions/ReleaseSpiritAction.cpp @@ -192,12 +192,11 @@ bool AutoReleaseSpiritAction::ShouldDelayBattlegroundRelease() const { // The below delays release to spirit with 6 seconds. // This prevents currently casted (ranged) spells to be re-directed to the died bot's ghost. - const int32_t botId = bot->GetGUID().GetRawValue(); - // If the bot already is a spirit, erase release time and return true + // If the bot already is a spirit, reset release time and return true if (bot->HasPlayerFlag(PLAYER_FLAGS_GHOST)) { - m_botReleaseTimes.erase(botId); + botAI->bgReleaseAttemptTime = 0; return true; } @@ -205,14 +204,13 @@ bool AutoReleaseSpiritAction::ShouldDelayBattlegroundRelease() const const time_t now = time(nullptr); constexpr time_t RELEASE_DELAY = 6; - auto& lastReleaseTime = m_botReleaseTimes[botId]; - if (lastReleaseTime == 0) - lastReleaseTime = now; + if (botAI->bgReleaseAttemptTime == 0) + botAI->bgReleaseAttemptTime = now; - if (now - lastReleaseTime < RELEASE_DELAY) + if (now - botAI->bgReleaseAttemptTime < RELEASE_DELAY) return false; - m_botReleaseTimes.erase(botId); + botAI->bgReleaseAttemptTime = 0; return true; } diff --git a/src/strategy/actions/ReleaseSpiritAction.h b/src/strategy/actions/ReleaseSpiritAction.h index debeab8497..57851214a1 100644 --- a/src/strategy/actions/ReleaseSpiritAction.h +++ b/src/strategy/actions/ReleaseSpiritAction.h @@ -38,7 +38,6 @@ class AutoReleaseSpiritAction : public ReleaseSpiritAction bool ShouldAutoRelease() const; bool ShouldDelayBattlegroundRelease() const; - inline static std::unordered_map m_botReleaseTimes; time_t m_bgGossipTime = 0; }; From e00c8fca2a4410f5a69f2fbf9f9105ce619fe545 Mon Sep 17 00:00:00 2001 From: Revision Date: Mon, 6 Oct 2025 19:57:37 +0200 Subject: [PATCH 100/151] Updated the spell id for Spirit of Redemption (#1709) --- src/strategy/values/StatsValues.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/strategy/values/StatsValues.cpp b/src/strategy/values/StatsValues.cpp index 6e25343796..dc3499c683 100644 --- a/src/strategy/values/StatsValues.cpp +++ b/src/strategy/values/StatsValues.cpp @@ -119,7 +119,7 @@ bool HasManaValue::Calculate() if (!target) return false; - constexpr uint32 PRIEST_SPIRIT_OF_REDEMPTION_SPELL_ID = 20711u; + constexpr uint32 PRIEST_SPIRIT_OF_REDEMPTION_SPELL_ID = 27827u; if (target->HasAura(PRIEST_SPIRIT_OF_REDEMPTION_SPELL_ID)) return false; From cf4f0f6dc770f24a628273b7bf635c081bb022c1 Mon Sep 17 00:00:00 2001 From: bash Date: Mon, 6 Oct 2025 21:07:43 +0200 Subject: [PATCH 101/151] renamed function name --- src/PlayerbotAI.cpp | 6 +++--- src/PlayerbotAI.h | 2 +- src/PlayerbotMgr.cpp | 2 +- src/RandomPlayerbotMgr.cpp | 8 ++++---- src/strategy/actions/LeaveGroupAction.cpp | 2 +- 5 files changed, 10 insertions(+), 10 deletions(-) diff --git a/src/PlayerbotAI.cpp b/src/PlayerbotAI.cpp index aa161734a2..9a670961e1 100644 --- a/src/PlayerbotAI.cpp +++ b/src/PlayerbotAI.cpp @@ -378,7 +378,7 @@ void PlayerbotAI::UpdateAIGroupMembership() PlayerbotAI* leaderAI = GET_PLAYERBOT_AI(leader); if (leaderAI && !leaderAI->IsRealPlayer()) { - RemoveFromGroup(); + LeaveOrDisbandGroup(); } } } @@ -402,7 +402,7 @@ void PlayerbotAI::UpdateAIGroupMembership() } if (!hasRealPlayer) { - RemoveFromGroup(); + LeaveOrDisbandGroup(); } } } @@ -785,7 +785,7 @@ void PlayerbotAI::Reset(bool full) } } -void PlayerbotAI::RemoveFromGroup() +void PlayerbotAI::LeaveOrDisbandGroup() { if (!bot || !bot->GetGroup() || IsRealPlayer()) return; diff --git a/src/PlayerbotAI.h b/src/PlayerbotAI.h index a5ac2bd8d3..3ae3eaf272 100644 --- a/src/PlayerbotAI.h +++ b/src/PlayerbotAI.h @@ -415,7 +415,7 @@ class PlayerbotAI : public PlayerbotAIBase void ResetStrategies(bool load = false); void ReInitCurrentEngine(); void Reset(bool full = false); - void RemoveFromGroup(); + void LeaveOrDisbandGroup(); static bool IsTank(Player* player, bool bySpec = false); static bool IsHeal(Player* player, bool bySpec = false); static bool IsDps(Player* player, bool bySpec = false); diff --git a/src/PlayerbotMgr.cpp b/src/PlayerbotMgr.cpp index f5aefe4563..074c7a3bc6 100644 --- a/src/PlayerbotMgr.cpp +++ b/src/PlayerbotMgr.cpp @@ -514,7 +514,7 @@ void PlayerbotHolder::OnBotLogin(Player* const bot) if (!groupValid) { - botAI->RemoveFromGroup(); + botAI->LeaveOrDisbandGroup(); } } diff --git a/src/RandomPlayerbotMgr.cpp b/src/RandomPlayerbotMgr.cpp index ebab628ff2..1a28e40c4f 100644 --- a/src/RandomPlayerbotMgr.cpp +++ b/src/RandomPlayerbotMgr.cpp @@ -1559,7 +1559,7 @@ bool RandomPlayerbotMgr::ProcessBot(Player* bot) Group* group = bot->GetGroup(); if (group && !group->isLFGGroup() && IsRandomBot(group->GetLeader())) { - botAI->RemoveFromGroup(); + botAI->LeaveOrDisbandGroup(); LOG_INFO("playerbots", "Bot {} remove from group since leader is random bot.", bot->GetName().c_str()); } @@ -2463,7 +2463,7 @@ void RandomPlayerbotMgr::RandomizeFirst(Player* bot) botAI->Reset(true); if (bot->GetGroup()) - botAI->RemoveFromGroup(); + botAI->LeaveOrDisbandGroup(); if (pmo) pmo->finish(); @@ -2504,7 +2504,7 @@ void RandomPlayerbotMgr::RandomizeMin(Player* bot) botAI->Reset(true); if (bot->GetGroup()) - botAI->RemoveFromGroup(); + botAI->LeaveOrDisbandGroup(); if (pmo) pmo->finish(); @@ -2586,7 +2586,7 @@ void RandomPlayerbotMgr::Refresh(Player* bot) bot->SetMoney(money + 500 * sqrt(urand(1, bot->GetLevel() * 5))); if (bot->GetGroup()) - botAI->RemoveFromGroup(); + botAI->LeaveOrDisbandGroup(); if (pmo) pmo->finish(); diff --git a/src/strategy/actions/LeaveGroupAction.cpp b/src/strategy/actions/LeaveGroupAction.cpp index 172bf399d0..88567b1ddd 100644 --- a/src/strategy/actions/LeaveGroupAction.cpp +++ b/src/strategy/actions/LeaveGroupAction.cpp @@ -86,7 +86,7 @@ bool LeaveGroupAction::Leave(Player* player) bool shouldStay = randomBot && bot->GetGroup() && player == bot; if (!shouldStay) { - botAI->RemoveFromGroup(); + botAI->LeaveOrDisbandGroup(); } if (randomBot) From 3f050a4a77371a3564e601fe592ee7be0f822927 Mon Sep 17 00:00:00 2001 From: Iain Donnelly Date: Tue, 7 Oct 2025 22:46:19 +0100 Subject: [PATCH 102/151] Change LOG_INFO to LOG_DEBUG --- src/RandomPlayerbotFactory.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/RandomPlayerbotFactory.cpp b/src/RandomPlayerbotFactory.cpp index bed18d6cdd..48531b96cb 100644 --- a/src/RandomPlayerbotFactory.cpp +++ b/src/RandomPlayerbotFactory.cpp @@ -911,7 +911,7 @@ void RandomPlayerbotFactory::CreateRandomGuilds() LOG_INFO("playerbots", "{}/{} random bot guilds exist in guild table",guildNumber, sPlayerbotAIConfig->randomBotGuildCount); if (guildNumber >= sPlayerbotAIConfig->randomBotGuildCount) { - LOG_INFO("playerbots", "No new random guilds required"); + LOG_DEBUG("playerbots", "No new random guilds required"); return; } @@ -935,7 +935,7 @@ void RandomPlayerbotFactory::CreateRandomGuilds() } } } - LOG_INFO("playerbots", "{} available leaders for new guilds found", availableLeaders.size()); + LOG_DEBUG("playerbots", "{} available leaders for new guilds found", availableLeaders.size()); // Create up to randomBotGuildCount by counting only EFFECTIVE creations uint32 createdThisRun = 0; From 5b128b3300d3fe0e14c174f196cd6d0442ebfa44 Mon Sep 17 00:00:00 2001 From: kadeshar Date: Thu, 9 Oct 2025 08:02:44 +0200 Subject: [PATCH 103/151] - Update method in QueryItemUsageForEquip (#1701) --- src/strategy/values/ItemUsageValue.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/strategy/values/ItemUsageValue.cpp b/src/strategy/values/ItemUsageValue.cpp index b0630b86f8..136c74f8a4 100644 --- a/src/strategy/values/ItemUsageValue.cpp +++ b/src/strategy/values/ItemUsageValue.cpp @@ -236,7 +236,7 @@ ItemUsage ItemUsageValue::Calculate() ItemUsage ItemUsageValue::QueryItemUsageForEquip(ItemTemplate const* itemProto, int32 randomPropertyId) { - if (bot->CanUseItem(itemProto) != EQUIP_ERR_OK) + if (bot->BotCanUseItem(itemProto) != EQUIP_ERR_OK) return ITEM_USAGE_NONE; if (itemProto->InventoryType == INVTYPE_NON_EQUIP) From 31ed5cbb6527cac9b99c21937decab9051cff2e3 Mon Sep 17 00:00:00 2001 From: bash Date: Thu, 9 Oct 2025 20:52:32 +0200 Subject: [PATCH 104/151] fixes --- src/PlayerbotMgr.cpp | 2 +- src/RandomPlayerbotMgr.cpp | 6 +++--- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/src/PlayerbotMgr.cpp b/src/PlayerbotMgr.cpp index 074c7a3bc6..368a216b83 100644 --- a/src/PlayerbotMgr.cpp +++ b/src/PlayerbotMgr.cpp @@ -519,7 +519,7 @@ void PlayerbotHolder::OnBotLogin(Player* const bot) } group = bot->GetGroup(); - if (!group) + if (group) { botAI->ResetStrategies(); } diff --git a/src/RandomPlayerbotMgr.cpp b/src/RandomPlayerbotMgr.cpp index 1a28e40c4f..63ab1e0419 100644 --- a/src/RandomPlayerbotMgr.cpp +++ b/src/RandomPlayerbotMgr.cpp @@ -1521,7 +1521,7 @@ bool RandomPlayerbotMgr::ProcessBot(Player* bot) { PlayerbotAI* botAI = GET_PLAYERBOT_AI(bot); - if (botAI) + if (!botAI) return false; if (bot->InBattleground()) @@ -2379,7 +2379,7 @@ void RandomPlayerbotMgr::IncreaseLevel(Player* bot) void RandomPlayerbotMgr::RandomizeFirst(Player* bot) { PlayerbotAI* botAI = GET_PLAYERBOT_AI(bot); - if (botAI) + if (!botAI) return; uint32 maxLevel = sPlayerbotAIConfig->randomBotMaxLevel; @@ -2474,7 +2474,7 @@ void RandomPlayerbotMgr::RandomizeFirst(Player* bot) void RandomPlayerbotMgr::RandomizeMin(Player* bot) { PlayerbotAI* botAI = GET_PLAYERBOT_AI(bot); - if (botAI) + if (!botAI) return; PerformanceMonitorOperation* pmo = sPerformanceMonitor->start(PERF_MON_RNDBOT, "RandomizeMin"); From 1fb66e9d75c4eeb62aeb3405769d081bc3996577 Mon Sep 17 00:00:00 2001 From: kadeshar Date: Thu, 9 Oct 2025 23:45:58 +0200 Subject: [PATCH 105/151] - Fixed issues in ai_playerbot_texts table scripts (#1723) --- .../2025_10_09_00_ai_playerbot_texts_fix.sql | 1976 +++++++++++++++++ 1 file changed, 1976 insertions(+) create mode 100644 data/sql/playerbots/updates/2025_10_09_00_ai_playerbot_texts_fix.sql diff --git a/data/sql/playerbots/updates/2025_10_09_00_ai_playerbot_texts_fix.sql b/data/sql/playerbots/updates/2025_10_09_00_ai_playerbot_texts_fix.sql new file mode 100644 index 0000000000..854f772968 --- /dev/null +++ b/data/sql/playerbots/updates/2025_10_09_00_ai_playerbot_texts_fix.sql @@ -0,0 +1,1976 @@ +DROP TABLE IF EXISTS `ai_playerbot_texts`; +CREATE TABLE IF NOT EXISTS `ai_playerbot_texts` ( + `id` smallint(20) NOT NULL AUTO_INCREMENT, + `name` varchar(255) NOT NULL COMMENT 'name - used in strategies/code as filter', + `text` varchar(1024) NOT NULL COMMENT 'text', + `say_type` tinyint(3) NOT NULL DEFAULT '0' COMMENT '0 - say, 1 - yell', + `reply_type` tinyint(3) NOT NULL DEFAULT '0' COMMENT 'if > 0 then can be filtered as a response to chat', + `text_loc1` varchar(1024) NOT NULL DEFAULT '', + `text_loc2` varchar(1024) NOT NULL DEFAULT '', + `text_loc3` varchar(1024) NOT NULL DEFAULT '', + `text_loc4` varchar(1024) NOT NULL DEFAULT '', + `text_loc5` varchar(1024) NOT NULL DEFAULT '', + `text_loc6` varchar(1024) NOT NULL DEFAULT '', + `text_loc7` varchar(1024) NOT NULL DEFAULT '', + `text_loc8` varchar(1024) NOT NULL DEFAULT '', + PRIMARY KEY (`id`) +) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8 ROW_FORMAT=DYNAMIC; + +-- strings +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 (1, 'string_unknown_area', 'the middle of nowhere', 0, 0, '', 'au milieu de nulle part', 'Mitten im Nirgendwo', '荒无人烟之地', '', '', '', 'посреди нигде'); +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 (2, 'string_unknown_area', 'an undisclosed location', 0, 0, '', 'un lieu non divulgué', 'Ein geheimer Ort', '某个不为人知的地方', '', '', '', 'в неопределенном месте'); +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 (3, 'string_unknown_area', 'somewhere', 0, 0, '', 'Quelque part.', 'Irgendwo', '某个地方', '', '', '', 'где-то'); +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 (4, 'string_empty_link', 'something', 0, 0, '', 'quelque chose', 'Irgendwas', '某样东西', '', '', '', 'что-то'); + +-- looting item events +-- usable placeholders: +-- %item_link +-- %zone_name +-- %area_name +-- %my_race +-- %my_class +-- %my_level +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 (5, 'broadcast_looting_item_normal', 'wonder what %item_link tastes like', 0, 0, '', 'Je me demande à quoi %item_link peut bien goûter.', 'Ich frag mich, wie %item_link wohl schmeckt.', '想知道这%item_link吃起来啥味儿', '', '', '', 'интересно, какой на вкус %item_link'); +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 (6, 'broadcast_looting_item_poor', 'nooo, I got %item_link', 0, 0, '', 'Oh non, j’ai reçu %item_link', 'Neeein, ich hab %item_link bekommen.', '不!我捡了个%item_link', '', '', '', 'нет, мне выпал %item_link'); +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 (7, 'broadcast_looting_item_poor', 'aww not this trash again %item_link', 0, 0, '', 'Encore cette poubelle %item_link.', 'Och nö, schon wieder dieser Schrott %item_link.', '哎,又是这破烂%item_link', '', '', '', 'опять этот хлам %item_link'); +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 (8, 'broadcast_looting_item_poor', 'seem to be looting trash %item_link', 0, 0, '', 'Il semble que je fouille dans les ordures %item_link.', 'Scheint so, als würde ich nur Müll looten %item_link.', '看来我捡的都是垃圾%item_link', '', '', '', 'похоже, я лутаю мусор %item_link'); +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 (9, 'broadcast_looting_item_poor', 'well, it’s better than nothing I guess %item_link', 0, 0, '', 'Eh bien, c’est toujours mieux que rien, je suppose %item_link', 'Naja, besser als nix, denk ich %item_link.', '好吧,有%item_link总比没有强', '', '', '', ''); +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 (10, 'broadcast_looting_item_poor', 'not sure what to do with %item_link', 0, 0, '', 'Je ne suis pas certain de ce qu’il faut faire avec %item_link.', 'Keine Ahnung, was ich mit %item_link anfangen soll.', '不知道这%item_link能干啥', '', '', '', 'не знаю, что делать с %item_link'); +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 (11, 'broadcast_looting_item_normal', 'well, I can keep looting %item_link all day', 0, 0, '', 'Eh bien, je peux passer la journée à looter %item_link!', 'Super, ich könnte den ganzen Tag %item_link looten.', '好吧,我能捡%item_link捡一天', '', '', '', 'могу лутать %item_link весь день'); +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 (12, 'broadcast_looting_item_normal', 'another day, another %item_link', 0, 0, '', 'Encore une journée, encore un %item_link', 'Neuer Tag, neues %item_link.', '又是新的一天,又捡了个%item_link', '', '', '', 'еще один день, еще один %item_link'); +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 (13, 'broadcast_looting_item_normal', 'looted some %item_link', 0, 0, '', 'J’ai pillé quelques %item_link.', 'Hab ein paar %item_link gelootet.', '捡了点%item_link', '', '', '', 'получил немного %item_link'); +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 (14, 'broadcast_looting_item_normal', 'some %item_link is alright', 0, 0, '', 'Certains %item_link passent bien', 'Ein paar %item_link sind ganz okay.', '有点%item_link还凑合', '', '', '', 'немного %item_link — это нормально'); +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 (15, 'broadcast_looting_item_uncommon', 'not bad, I just got %item_link', 0, 0, '', 'Pas mal du tout, je viens juste de recevoir %item_link', 'Nicht schlecht, hab grad %item_link bekommen.', '不错,刚捡到个%item_link', '', '', '', 'неплохо, только что получил %item_link'); +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 (16, 'broadcast_looting_item_uncommon', 'just looted %item_link in %zone_name', 0, 0, '', 'Je viens de piller %item_link dans %zone_name.', 'Hab gerade %item_link in %zone_name gelootet.', '刚在%zone_name捡到个%item_link', '', '', '', 'только что залутал %item_link в %zone_name'); +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 (17, 'broadcast_looting_item_uncommon', 'I could put that to good use %item_link', 0, 0, '', 'Je pourrais bien utiliser ça %item_link', 'Könnte %item_link gut gebrauchen.', '这%item_link我能派上用场', '', '', '', 'могу найти применение %item_link'); +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 (18, 'broadcast_looting_item_uncommon', 'money money money %item_link', 0, 0, '', 'L’argent, l’argent, l’argent! %item_link', 'Geld, Geld, Geld! %item_link', '发财了发财了!%item_link', '', '', '', 'деньги, деньги, деньги %item_link'); +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 (19, 'broadcast_looting_item_uncommon', 'got %item_link', 0, 0, '', 'J’ai eu %item_link.', 'Hab %item_link bekommen.', '拿到了%item_link', '', '', '', 'получил %item_link'); +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 (20, 'broadcast_looting_item_rare', '%item_link is hunter bis', 0, 0, '', 'Ah, %item_link c’est le meilleur équipement pour les chasseurs.', '%item_link ist perfekt für Jäger.', '%item_link简直是猎人的极品装备', '', '', '', '%item_link — лучший для охотника'); +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 (21, 'broadcast_looting_item_rare', '%item_link is %my_class bis', 0, 0, '', '%item_link est %my_class bis.', '%item_link ist ideal für %my_class.', '%item_link对%my_class来说是极品', '', '', '', '%item_link — лучший для %my_class'); +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 (22, 'broadcast_looting_item_rare', 'RNG is not bad today %item_link', 0, 0, '', 'La RNG n’est pas mauvaise aujourd’hui %item_link.', 'Das RNG ist heute gar nicht mal so schlecht %item_link.', '今天人品不错,捡到个%item_link', '', '', '', 'сегодня удача на моей стороне %item_link'); +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 (23, 'broadcast_looting_item_rare', 'sweet %item_link, freshly looted', 0, 0, '', 'Doux %item_link, fraîchement looté', 'Schönes %item_link, frisch gelootet.', '太棒了,新鲜出炉的%item_link', '', '', '', 'классный %item_link, только что залутал'); +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 (24, 'broadcast_looting_item_rare', 'wow, I just got %item_link', 0, 0, '', 'wow, je viens de recevoir %item_link', 'Wow, hab grad %item_link bekommen!', '哇,我刚捡到个%item_link', '', '', '', 'вау, только что получил %item_link'); +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 (25, 'broadcast_looting_item_rare', '%item_link is hunter bis', 0, 0, '', 'Ah, %item_link, c’est le meilleur équipement pour les chasseurs.', '%item_link ist perfekt für Jäger.', '%item_link是猎人的顶级装备', '', '', '', '%item_link — лучший для охотника'); +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 (26, 'broadcast_looting_item_rare', '%item_link is %my_class bis', 0, 0, '', '%item_link est %my_class bis.', '%item_link ist ideal für %my_class.', '%item_link对%my_class来说是顶级货', '', '', '', '%item_link — лучший для %my_class'); +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 (27, 'broadcast_looting_item_rare', 'RNG is not bad today %item_link', 0, 0, '', 'Aujourd’hui, la RNG n’est pas mauvaise %item_link.', 'Das RNG ist heute gar nicht mal so schlecht %item_link.', '今天运气真好,捡到%item_link', '', '', '', 'сегодня удача на моей стороне %item_link'); +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 (28, 'broadcast_looting_item_rare', 'sweet %item_link, freshly looted', 0, 0, '', 'Oh, %item_link, fraîchement pillé', 'Schönes %item_link, frisch gelootet.', '太好了,刚捡到个%item_link', '', '', '', 'классный %item_link, только что залутал'); +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 (29, 'broadcast_looting_item_epic', 'OMG, look at what I just got %item_link!!!', 0, 0, '', 'OMG, regardez ce que je viens d’obtenir %item_link !!!', 'OMG, schaut euch an, was ich grad bekommen habe %item_link!!!', '天啊,快看我刚捡到的%item_link!!!', '', '', '', 'ОГО, посмотрите, что я только что получил %item_link!!!'); +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 (30, 'broadcast_looting_item_legendary', 'No @#$@% way! This can not be, I got %item_link, this is insane', 0, 0, '', 'Pas moyen! Ça ne peut pas être vrai, j’ai obtenu %item_link, c’est fou!', 'Nicht dein Ernst! Das kann nicht sein, ich hab %item_link bekommen, das ist irre!', '不是吧!这不可能,我竟然捡到%item_link,太疯狂了!', '', '', '', 'Нет @#$@%! Не может быть, я получил %item_link, это безумие'); +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 (31, 'broadcast_looting_item_artifact', 'No @#$@% way! This can not be, I got %item_link, this is insane', 0, 0, '', 'Pas possible! Ça ne peut pas être vrai, j’ai eu %item_link, c’est fou', 'Unfassbar! Das kann nicht sein, ich hab %item_link bekommen, das ist verrückt!', '天哪!这不可能,我拿到了%item_link,简直不敢相信!', '', '', '', 'Нет @#$@%! Не может быть, я получил %item_link, это безумие'); +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 (32, 'broadcast_looting_item_poor', 'Seriously? Another %item_link? My luck is broken.', 0, 0, '', 'Sérieusement? Encore un %item_link? La poisse me suit, c’est pas possible.', 'Ernsthaft? Noch ein %item_link? Ich habe kein Glück.', '不是吧?又是个%item_link?我的运气真是烂透了。', '', '', '', ''); +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 (33, 'broadcast_looting_item_poor', 'This %item_link is not even worth the pixels it’s printed on.', 0, 0, '', 'Cet %item_link ne vaut même pas les pixels sur lesquels il est imprimé.', 'Dieser %item_link ist nicht mal die Pixel wert, auf denen er angezeigt wird.', '这%item_link连显示它的像素都不值。', '', '', '', ''); +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 (34, 'broadcast_looting_item_poor', 'I got %item_link... Ugh, here we go again.', 0, 0, '', 'J’ai de nouveau %item_link... Oh là là, c’est reparti.', 'Ich hab %item_link... Uff, schon wieder.', '我又捡到个%item_link...哎,又来了。', '', '', '', ''); +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 (35, 'broadcast_looting_item_poor', 'I don’t even know why I’m picking up %item_link, it’s useless.', 0, 0, '', 'Je me demande pourquoi je prends %item_link, c’est inutile.', 'Ich weiß nicht mal, warum ich %item_link aufhebe, ist eh nutzlos.', '我都不知道为啥要捡%item_link,完全没用。', '', '', '', ''); +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 (36, 'broadcast_looting_item_poor', 'Look at this shiny %item_link... too bad it’s garbage.', 0, 0, '', 'Regarde ce magnifique %item_link... dommage que ce soit de la camelote.', 'Schau dir dieses glänzende %item_link an... schade, dass es Müll ist.', '看看这闪亮的%item_link...可惜就是个垃圾。', '', '', '', ''); +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 (37, 'broadcast_looting_item_poor', 'This %item_link isn’t even worth the paper it’s written on.', 0, 0, '', '%item_link ne vaut même pas le papier sur lequel il est écrit.', 'Dieser %item_link ist nicht mal das Papier wert, auf dem er steht.', '这%item_link连写它的羊皮纸都不值。', '', '', '', ''); +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 (38, 'broadcast_looting_item_poor', 'I guess %item_link is better than nothing? Barely.', 0, 0, '', 'Je suppose que %item_link vaut mieux que rien ? À peine.', 'Ich schätze, %item_link ist besser als nichts? Gerade noch.', '我想%item_link总比没有强吧?勉强。', '', '', '', ''); +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 (39, 'broadcast_looting_item_poor', 'Not sure what to do with %item_link, maybe I’ll just sell it for 1 silver.', 0, 0, '', 'Je ne suis pas sûr de ce que faire avec %item_link, peut-être que je vais juste le vendre pour 1 pièce d’argent.', 'Keine Ahnung, was ich mit %item_link machen soll, vielleicht verkauf ich’s für 1 Silber.', '不知道%item_link能干嘛,或许卖1个银币得了。', '', '', '', ''); +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 (40, 'broadcast_looting_item_poor', 'Another %item_link... well, at least I’m getting something.', 0, 0, '', 'Encore un %item_link... eh bien, au moins je reçois quelque chose.', 'Noch ein %item_link... naja, immerhin bekomme ich was.', '又是个%item_link...好吧,至少有点收获。', '', '', '', ''); +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 (41, 'broadcast_looting_item_poor', 'I hope %item_link is actually worth something because it looks awful.', 0, 0, '', 'J’espère que %item_link vaut en fait quelque chose parce que ça a l’air affreux.', 'Hoffentlich ist %item_link wenigstens was wert, sieht nämlich furchtbar aus.', '希望%item_link能值点钱,因为它看起来真垃圾。', '', '', '', ''); +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 (42, 'broadcast_looting_item_poor', 'Is %item_link a joke? Someone’s laughing at me.', 0, 0, '', '%item_link c’est une blague ? Quelqu’un se moque de moi.', 'Ist %item_link ein Witz? Irgendwer lacht mich aus.', '这%item_link是开玩笑吗?谁在嘲笑我啊!', '', '', '', ''); +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 (43, 'broadcast_looting_item_poor', 'Why do I keep getting %item_link... did I anger RNG?', 0, 0, '', 'Pourquoi est-ce que je continue à obtenir %item_link... est-ce que j’ai fâché le RNG?', 'Warum krieg ich immer wieder %item_link... hab ich die RNG-Götter verärgert?', '为啥我老是拿到%item_link……我是不是得罪了随机之神?', '', '', '', ''); +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 (44, 'broadcast_looting_item_poor', 'It’s like %item_link is following me around. I don’t want it!', 0, 0, '', 'C’est comme si %item_link me suivait partout. Je ne veux pas de ça !', 'Es ist, als würde %item_link mir nachlaufen. Ich will das nicht!', '这%item_link就像缠着我一样,我才不要呢!', '', '', '', ''); +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 (45, 'broadcast_looting_item_poor', 'There’s %item_link, again. What a surprise.', 0, 0, '', 'Encore %item_link. Quelle surprise.', 'Schon wieder %item_link. Was für eine Überraschung.', '又是%item_link,真是“惊喜”啊。', '', '', '', ''); +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 (46, 'broadcast_looting_item_poor', 'I guess %item_link is good for vendor trash?', 0, 0, '', 'I présume qu’ %item_link est bon pour vendre à un marchand ?', 'Ich schätze, %item_link taugt immerhin als Müll für den Händler?', '看来%item_link只能当垃圾卖给商人了?', '', '', '', ''); +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 (47, 'broadcast_looting_item_poor', 'Noooo, not %item_link again! RNG, please!', 0, 0, '', 'Oh non, pas encore %item_link! RNG s’il te plaît!', 'Neeein, nicht schon wieder %item_link! RNG, bitte!', '不!别又是%item_link!随机之神,求放过!', '', '', '', ''); +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 (48, 'broadcast_looting_item_poor', 'Well, at least %item_link isn’t completely useless, right?', 0, 0, '', 'Eh bien, au moins %item_link n’est pas complètement inutile, n’est-ce pas?', 'Naja, wenigstens ist %item_link nicht komplett nutzlos, oder?', '好吧,至少%item_link还不算完全没用,对吧?', '', '', '', ''); +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 (49, 'broadcast_looting_item_poor', 'Another %item_link? RNG, do you even care?', 0, 0, '', 'Encore %item_link ? La RNG est-ce que ça te dit quelque chose au moins?', 'Noch ein %item_link? RNG, interessiert dich das überhaupt?', '又一个%item_link?随机之神,你在乎过我的感受吗?', '', '', '', ''); +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 (50, 'broadcast_looting_item_poor', 'Maybe %item_link will be worth something in 10 years.', 0, 0, '', 'Peut-être que %item_link vaudra quelque chose dans 10 ans.', 'Vielleicht ist %item_link in 10 Jahren mal was wert.', '或许%item_link十年后能值点钱吧。', '', '', '', ''); +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 (51, 'broadcast_looting_item_poor', 'I guess I’ll just admire how %item_link looks... and throw it away.', 0, 0, '', 'Je suppose que je vais juste admirer %item_link ... et le jeter.', 'Ich schätze, ich bewundere einfach, wie %item_link aussieht... und werfe es weg.', '我就欣赏一下%item_link的样子……然后扔了吧。', '', '', '', ''); +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 (52, 'broadcast_looting_item_poor', 'Who needs %item_link? Not me, that’s for sure.', 0, 0, '', 'Qui a besoin de %item_link ? Pas moi en tout cas, ça c’est sûr.', 'Wer braucht %item_link? Ich auf jeden Fall nicht.', '谁需要%item_link啊?反正我肯定不要。', '', '', '', ''); +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 (53, 'broadcast_looting_item_poor', 'Maybe %item_link will be useful... just kidding, it’s trash.', 0, 0, '', 'Peut-être que %item_link sera utile... non, je plaisante, c’est nul.', 'Vielleicht ist %item_link nützlich... nur Spaß, ist Müll.', '也许%item_link有用……开玩笑的,就是个垃圾。', '', '', '', ''); +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 (54, 'broadcast_looting_item_poor', 'The universe has given me %item_link. Great.', 0, 0, '', 'L’univers m’a donné %item_link. Génial.', 'Das Universum hat mir %item_link geschenkt. Toll.', '宇宙赐予了我%item_link,棒极了。', '', '', '', ''); +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 (55, 'broadcast_looting_item_poor', 'Well, I have %item_link. Can’t say I’m thrilled.', 0, 0, '', 'Eh bien, j’ai %item_link. Franchement, je ne suis pas super emballé.', 'Naja, ich hab %item_link. Begeistert bin ich nicht.', '好吧,我拿到了%item_link,可一点也高兴不起来。', '', '', '', ''); +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 (56, 'broadcast_looting_item_poor', 'What am I even going to do with %item_link? Can’t even sell it.', 0, 0, '', 'Qu’est-ce que je vais bien pouvoir faire avec %item_link ? Je ne peux même pas le vendre.', 'Was soll ich bloß mit %item_link anfangen? Kann es nicht mal verkaufen.', '我拿%item_link能干啥?连卖都卖不掉。', '', '', '', ''); +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 (57, 'broadcast_looting_item_poor', 'Let’s add %item_link to my growing pile of disappointment.', 0, 0, '', 'Ajoutons %item_link à ma pile croissante de déceptions.', 'Packen wir %item_link zu meinem wachsenden Berg der Enttäuschungen.', '把%item_link扔进我那堆失望的垃圾里吧。', '', '', '', ''); +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 (58, 'broadcast_looting_item_poor', 'Thanks for %item_link... it’s exactly what I didn’t need.', 0, 0, '', 'Merci pour %item_link... c’est exactement ce qu’il me fallait pas.', 'Danke für %item_link... genau das, was ich nicht gebraucht habe.', '谢谢给了我%item_link……这正是我不需要的东西。', '', '', '', ''); +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 (59, 'broadcast_looting_item_poor', 'Another %item_link... RNG, we need to talk.', 0, 0, '', 'Encore un %item_link... RNG, on doit avoir une discussion.', 'Noch ein %item_link... RNG, wir müssen reden.', '又一个%item_link……随机之神,咱们得谈谈。', '', '', '', ''); +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 (60, 'broadcast_looting_item_poor', 'I’ve looted so many %item_link, I could open a store with them.', 0, 0, '', 'J’ai récupéré tellement de %item_link, je pourrais ouvrir un magasin avec.', 'Ich hab so viele %item_link gelootet, ich könnte einen Laden eröffnen.', '我捡了这么多%item_link,够开个杂货铺了。', '', '', '', ''); +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 (61, 'broadcast_looting_item_poor', 'A shiny %item_link... maybe for the trash pile.', 0, 0, '', 'Un brillant %item_link... peut-être destiné à la poubelle.', 'Ein glänzendes %item_link... perfekt für den Müll.', '一个闪亮的%item_link……大概只能扔垃圾堆了。', '', '', '', ''); +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 (62, 'broadcast_looting_item_poor', 'It’s %item_link, everybody. Don’t get too excited.', 0, 0, '', 'C’est %item_link, tout le monde. Pas de quoi s’affoler.', 'Es ist %item_link, Leute. Bloß nicht zu sehr freuen.', '各位,这是%item_link,别太激动哦。', '', '', '', ''); +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 (63, 'broadcast_looting_item_poor', 'Well, at least it’s %item_link... could be worse.', 0, 0, '', 'Eh bien, au moins c’est %item_link... ça pourrait être pire.', 'Naja, immerhin ist es %item_link... könnte schlimmer sein.', '好吧,至少是%item_link……还能更糟呢。', '', '', '', ''); +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 (64, 'broadcast_looting_item_poor', 'I’ll take %item_link over nothing.', 0, 0, '', 'Je préfère %item_link à rien du tout.', 'Lieber %item_link als gar nichts.', '有%item_link总比啥也没有强。', '', '', '', ''); +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 (65, 'broadcast_looting_item_poor', 'Another %item_link. Not the worst.', 0, 0, '', 'Encore un %item_link. Pas le pire.', 'Noch ein %item_link. Geht schlimmer.', '又一个%item_link,还不算最差。', '', '', '', ''); +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 (66, 'broadcast_looting_item_poor', 'Hey, %item_link... it’s okay, I suppose.', 0, 0, '', 'Salut, %item_link... c’est correct, je suppose.', 'Hey, %item_link... naja, ist okay, denk ich.', '嘿,%item_link……还行吧,我觉得。', '', '', '', ''); +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 (67, 'broadcast_looting_item_normal', 'Hey, %item_link. Not bad, not great, but I’ll take it.', 0, 0, '', 'Salut, %item_link. Pas mal, pas super, mais je vais le prendre.', 'Hey, %item_link. Nicht schlecht, nicht überragend, aber ich nehm’s.', '嘿,%item_link。不算好也不算差,拿了再说。', '', '', '', ''); +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 (68, 'broadcast_looting_item_normal', 'Could be worse... I just looted %item_link.', 0, 0, '', 'Ça aurait pu être pire... Je viens juste de mettre la main sur %item_link.', 'Könnte schlimmer sein... hab grad %item_link gelootet.', '还行吧……刚捡到个%item_link。', '', '', '', ''); +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 (69, 'broadcast_looting_item_normal', 'I guess %item_link will come in handy for something.', 0, 0, '', 'Je suppose que %item_link va être utile pour quelque chose.', 'Ich schätze, %item_link wird irgendwann mal nützlich sein.', '我觉得%item_link总能派上点用场。', '', '', '', ''); +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 (70, 'broadcast_looting_item_normal', 'Another day, another %item_link. Can’t complain.', 0, 0, '', 'Encore une journée, encore un %item_link. Je ne vais pas me plaindre.', 'Neuer Tag, neues %item_link. Kann mich nicht beschweren.', '又是新的一天,又捡到个%item_link,挺好。', '', '', '', ''); +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 (71, 'broadcast_looting_item_normal', 'Well, %item_link is alright, I guess.', 0, 0, '', 'Hmm, %item_link, c’est pas mal, je suppose.', 'Joah, %item_link geht klar, denk ich.', '嗯,%item_link还行吧,我觉得。', '', '', '', ''); +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 (72, 'broadcast_looting_item_normal', 'Just got %item_link. It’s not the best, but it’s something.', 0, 0, '', 'Je viens de récupérer %item_link. Ce n’est pas le meilleur, mais c’est mieux que rien.', 'Hab grad %item_link bekommen. Nicht das Beste, aber besser als nix.', '刚拿到%item_link,不是最好的,但也算有点收获。', '', '', '', ''); +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 (73, 'broadcast_looting_item_normal', 'Could be worse, at least it’s %item_link.', 0, 0, '', 'Ça pourrait être pire, au moins c’est %item_link.', 'Könnte schlimmer sein, immerhin ist es %item_link.', '还能更糟呢,至少是%item_link。', '', '', '', ''); +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 (74, 'broadcast_looting_item_normal', '%item_link is good enough, I’m not mad.', 0, 0, '', '%item_link est assez bon, je ne suis pas fâché.', '%item_link ist gut genug, ich kann mich nicht beklagen.', '%item_link还不错,我没啥好抱怨的。', '', '', '', ''); +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 (75, 'broadcast_looting_item_normal', 'It’s no legendary, but %item_link will do.', 0, 0, '', 'Ce n’est pas légendaire, mais %item_link fera l’affaire.', 'Ist kein Legendäres, aber %item_link reicht.', '虽然不是传说装备,但%item_link也凑合了。', '', '', '', ''); +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 (76, 'broadcast_looting_item_normal', 'Not a bad drop... %item_link is alright.', 0, 0, '', 'Pas mal du tout cette trouvaille... %item_link est pas mal du tout.', 'Kein schlechter Drop... %item_link geht in Ordnung.', '掉落还行……%item_link不错。', '', '', '', ''); +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 (77, 'broadcast_looting_item_normal', 'I’ll take %item_link over nothing.', 0, 0, '', 'Je préfère %item_link à rien du tout.', 'Lieber %item_link als gar nichts.', '有%item_link总比啥也没有强。', '', '', '', ''); +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 (78, 'broadcast_looting_item_normal', 'Not the best, but %item_link is a nice addition.', 0, 0, '', 'Ce n’est pas le meilleur, mais %item_link est une belle addition.', 'Nicht das Beste, aber %item_link ist eine nette Ergänzung.', '不是最好的,但%item_link也是个不错的收获。', '', '', '', ''); +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 (79, 'broadcast_looting_item_normal', 'Getting %item_link again. I guess it’s better than nothing.', 0, 0, '', 'Encore en train de récupérer %item_link. Je suppose que c’est mieux que rien.', 'Schon wieder %item_link. Naja, besser als nix.', '又拿了个%item_link,总比啥也没有好。', '', '', '', ''); +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 (80, 'broadcast_looting_item_normal', '%item_link again, huh? I’m not thrilled, but I’ll live.', 0, 0, '', 'Encore %item_link, hein? Je ne suis pas super enthousiaste, mais bon, je vais m’en sortir.', 'Schon wieder %item_link, hm? Bin nicht begeistert, aber naja.', '又是%item_link?不太激动,不过还能接受。', '', '', '', ''); +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 (81, 'broadcast_looting_item_normal', 'Another %item_link? I’m okay with that.', 0, 0, '', 'Encore un %item_link? Ça me va.', 'Noch ein %item_link? Passt schon.', '又一个%item_link?我觉得还行。', '', '', '', ''); +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 (82, 'broadcast_looting_item_normal', 'Could’ve gotten worse, but %item_link isn’t so bad.', 0, 0, '', 'Ça aurait pu être pire, mais %item_link n’est pas si mal.', 'Hätte schlimmer kommen können, %item_link ist okay.', '本来可能更糟,但%item_link还算可以。', '', '', '', ''); +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 (83, 'broadcast_looting_item_normal', 'It’s %item_link... but at least it’s something.', 0, 0, '', 'C’est %item_link... mais au moins c’est quelque chose.', 'Es ist %item_link... aber immerhin etwas.', '是%item_link……但至少是个东西。', '', '', '', ''); +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 (84, 'broadcast_looting_item_normal', 'I’ll take %item_link, could be worse.', 0, 0, '', 'Je vais prendre %item_link, ça aurait pu être pire.', 'Ich nehm %item_link, hätte schlimmer sein können.', '我就拿%item_link吧,总比更糟的好。', '', '', '', ''); +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 (85, 'broadcast_looting_item_normal', 'Looted %item_link, nothing special but okay.', 0, 0, '', 'J’ai pillé %item_link, rien de spécial mais bon.', 'Hab %item_link gelootet, nichts Besonderes, aber okay.', '捡了个%item_link,没啥特别的,但还行。', '', '', '', ''); +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 (86, 'broadcast_looting_item_normal', 'Not what I wanted, but %item_link will do for now.', 0, 0, '', 'Ce n’est pas exactement ce que je voulais, mais %item_link fera l’affaire pour l’instant.', 'Nicht das, was ich wollte, aber %item_link reicht erstmal.', '不是我想要的,但%item_link先凑合用吧。', '', '', '', ''); +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 (87, 'broadcast_looting_item_normal', 'Another %item_link. Not amazing, but it’ll do.', 0, 0, '', 'Encore un %item_link. Pas extraordinaire, mais ça fera l’affaire.', 'Noch ein %item_link. Nicht der Hammer, aber geht.', '又一个%item_link,不算惊艳,但能用。', '', '', '', ''); +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 (88, 'broadcast_looting_item_normal', 'Looted %item_link, could be worse.', 0, 0, '', 'J’ai pillé %item_link, ça aurait pu être pire.', 'Hab %item_link gelootet, hätte schlimmer sein können.', '捡了个%item_link,还不算太糟。', '', '', '', ''); +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 (89, 'broadcast_looting_item_normal', 'Well, %item_link is better than a poke in the eye.', 0, 0, '', 'Eh bien, %item_link vaut mieux que de se faire poke dans l’œil.', 'Naja, %item_link ist besser, als ins Auge gestochen zu werden.', '好吧,%item_link总比被戳眼强。', '', '', '', ''); +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 (90, 'broadcast_looting_item_normal', 'I’ll take %item_link and move on.', 0, 0, '', 'Je vais prendre %item_link et continuer.', 'Ich nehm %item_link und mach weiter.', '拿上%item_link,继续前行吧。', '', '', '', ''); +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 (91, 'broadcast_looting_item_uncommon', 'Nice! A solid %item_link for the collection.', 0, 0, '', 'Super! Un bel %item_link pour la collection.', 'Nice! Ein solides %item_link für die Sammlung.', '不错!一个靠谱的%item_link,收好了!', '', '', '', ''); +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 (92, 'broadcast_looting_item_uncommon', 'I’ll take that %item_link any day.', 0, 0, '', 'Je prendrais bien ce lien de %item_link n’importe quel jour.', 'Den %item_link nehm ich jederzeit.', '这%item_link我随时都乐意拿!', '', '', '', ''); +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 (93, 'broadcast_looting_item_uncommon', 'Not bad, %item_link might come in handy.', 0, 0, '', 'Pas mal, %item_link pourrait s’avérer utile.', 'Nicht schlecht, %item_link könnte nützlich sein.', '还不错,%item_link说不定能派上用场。', '', '', '', ''); +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 (94, 'broadcast_looting_item_uncommon', 'Got myself a %item_link, now we’re talking.', 0, 0, '', 'Je me suis procuré %item_link, ça va être la folie maintenant !', 'Hab mir ein %item_link geholt, jetzt geht’s ab.', '搞到个%item_link,这下有戏了!', '', '', '', ''); +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 (95, 'broadcast_looting_item_uncommon', 'That %item_link is better than most, I’ll take it.', 0, 0, '', 'Ce %item_link est meilleur que la plupart, je vais le prendre.', 'Dieses %item_link ist besser als die meisten, nehm ich.', '这%item_link比大多数都好,我收下了!', '', '', '', ''); +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 (96, 'broadcast_looting_item_uncommon', 'I could use %item_link for something good.', 0, 0, '', 'Je pourrais utiliser %item_link pour quelque chose de bien.', 'Ich könnte %item_link für etwas Nützliches gebrauchen.', '我能用%item_link干点好事。', '', '', '', ''); +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 (97, 'broadcast_looting_item_uncommon', 'Not bad, %item_link will work just fine.', 0, 0, '', 'Pas mal, %item_link va parfaitement convenir.', 'Nicht schlecht, %item_link passt schon.', '不错,%item_link用起来正好。', '', '', '', ''); +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 (98, 'broadcast_looting_item_uncommon', 'Another %item_link, at least it’s not useless.', 0, 0, '', 'Encore un %item_link, au moins ce n’est pas inutile.', 'Noch ein %item_link, immerhin nicht nutzlos.', '又一个%item_link,至少不是没用的。', '', '', '', ''); +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 (99, 'broadcast_looting_item_uncommon', 'That %item_link might make a decent profit.', 0, 0, '', 'Ce %item_link pourrait me rapporter un joli profit.', 'Das %item_link könnte einen netten Gewinn bringen.', '这%item_link说不定能卖个好价钱。', '', '', '', ''); +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 (100, 'broadcast_looting_item_uncommon', 'A solid %item_link, now the day is looking better.', 0, 0, '', 'Un bon %item_link, ça rend la journée plus belle maintenant.', 'Ein solides %item_link, jetzt sieht der Tag besser aus.', '一个靠谱的%item_link,今天心情都变好了。', '', '', '', ''); +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 (101, 'broadcast_looting_item_uncommon', 'Well, I didn’t expect %item_link, but I’ll take it.', 0, 0, '', 'Eh bien, je ne m’attendais pas à %item_link, mais je vais le prendre.', 'Nun, %item_link hab ich nicht erwartet, aber ich nehm’s.', '嗯,没想到会拿到%item_link,但我收下了。', '', '', '', ''); +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 (102, 'broadcast_looting_item_uncommon', 'Not sure what to do with %item_link, but I’m happy to have it.', 0, 0, '', 'Je ne suis pas sûr de ce qu’il faut faire avec %item_link, mais je suis content de l’avoir.', 'Keine Ahnung, was ich mit %item_link machen soll, aber ich freu mich drüber.', '不太确定%item_link干啥用,但我很开心能拿到。', '', '', '', ''); +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 (103, 'broadcast_looting_item_uncommon', 'Not my first choice, but I’ll happily accept %item_link.', 0, 0, '', 'Ce n’était pas mon premier choix, mais je vais volontiers accepter %item_link.', 'Nicht meine erste Wahl, aber ich nehm %item_link gerne.', '不是我的首选,但我很乐意收下%item_link。', '', '', '', ''); +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 (104, 'broadcast_looting_item_uncommon', 'That %item_link is exactly what I needed today.', 0, 0, '', 'Ce %item_link est exactement ce dont j’avais besoin aujourd’hui.', '%item_link ist genau das, was ich heute gebraucht habe.', '这%item_link正是我今天需要的!', '', '', '', ''); +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 (105, 'broadcast_looting_item_uncommon', 'I’ll never say no to a nice %item_link.', 0, 0, '', 'Je ne dis jamais non à une belle %item_link.', 'Zu einem schönen %item_link sag ich nie nein.', '对一个不错的%item_link,我从不说不。', '', '', '', ''); +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 (106, 'broadcast_looting_item_uncommon', 'Another %item_link. I’ll take it, no complaints here.', 0, 0, '', 'Encore un %item_link. Je le prends, pas de soucis ici.', 'Noch ein %item_link. Ich nehm’s, keine Beschwerden.', '又一个%item_link,我收下,没啥好抱怨的。', '', '', '', ''); +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 (107, 'broadcast_looting_item_uncommon', 'At least %item_link has some use. Not the worst loot.', 0, 0, '', 'Au moins %item_link a une certaine utilité. Ce n’est pas le pire butin.', 'Zumindest hat %item_link eine Verwendung. Nicht der schlechteste Loot.', '至少%item_link有点用,不是最差的战利品。', '', '', '', ''); +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 (108, 'broadcast_looting_item_uncommon', '%item_link might just be the one thing I need for the day.', 0, 0, '', 'Hmm, le lien %item_link pourrait bien être exactement ce dont j’ai besoin pour la journée.', 'Vielleicht ist %item_link genau das, was ich heute brauche.', '或许%item_link正是我今天需要的东西。', '', '', '', ''); + +-- quest events +-- usable placeholders: +-- %quest_link +-- %zone_name +-- %area_name +-- %my_race +-- %my_class +-- %my_level +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 (109, 'broadcast_quest_accepted_generic', 'I have just taken the %quest_link', 0, 0, '', 'Je viens de commencer %quest_link.', 'Ich habe gerade %quest_link angenommen.', '我刚接了%quest_link任务。', '', '', '', 'Я только что взял %quest_link'); +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 (110, 'broadcast_quest_accepted_generic', 'just accepted %quest_link', 0, 0, '', 'Je viens d’accepter %quest_link', 'Hab gerade %quest_link angenommen.', '刚接受了%quest_link任务。', '', '', '', 'только что принял %quest_link'); +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 (111, 'broadcast_quest_accepted_generic', '%quest_link gonna try to complete this one', 0, 0, '', '%quest_link Je vais essayer de terminer celle-ci.', '%quest_link – Ich versuch mal, die abzuschließen.', '%quest_link,这个任务我得试着完成。', '', '', '', '%quest_link попробую выполнить это задание'); +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 (112, 'broadcast_quest_accepted_generic', 'took %quest_link in %zone_name', 0, 0, '', 'J’ai pris %quest_link dans %zone_name.', 'Hab %quest_link in %zone_name angenommen.', '在%zone_name接下了%quest_link任务。', '', '', '', 'взял %quest_link в %zone_name'); +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 (113, 'broadcast_quest_accepted_generic', 'I just picked up %quest_link, time to get to work!', 0, 0, '', 'Je viens de prendre %quest_link, c’est parti pour se mettre au travail !', 'Hab gerade %quest_link angenommen, ran an die Arbeit!', '刚接到%quest_link,是时候开干了!', '', '', '', ''); +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 (114, 'broadcast_quest_accepted_generic', 'Got %quest_link, let’s see what this one is about.', 0, 0, '', 'J’ai obtenu %quest_link, voyons de quoi il s’agit.', 'Hab %quest_link bekommen, mal sehen, worum’s geht.', '拿到了%quest_link,看看这是个啥任务。', '', '', '', ''); +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 (115, 'broadcast_quest_accepted_generic', 'Just grabbed %quest_link, let’s do this!', 0, 0, '', 'Je viens de prendre %quest_link, allons-y!', 'Hab gerade %quest_link geschnappt, los geht’s!', '刚抢到%quest_link,走起!', '', '', '', ''); +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 (116, 'broadcast_quest_accepted_generic', 'Another quest, another %quest_link. Let’s go!', 0, 0, '', 'Encore une autre quête, encore %quest_link. Allons-y!', 'Noch eine Quest, noch ein %quest_link. Auf geht’s!', '又一个任务,又是%quest_link,走吧!', '', '', '', ''); +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 (117, 'broadcast_quest_accepted_generic', 'Looks like it’s %quest_link time, wish me luck.', 0, 0, '', 'Il semblerait que c’est l’heure de faire %quest_link, souhaitez-moi bonne chance.', 'Sieht aus, als wäre %quest_link dran. Drückt mir die Daumen!', '看来是时候做%quest_link了,祝我好运吧。', '', '', '', ''); +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 (118, 'broadcast_quest_accepted_generic', 'Accepted %quest_link, let’s see how tough this one is.', 0, 0, '', 'Accepté %quest_link, eh bien, voyons à quel point celle-ci est difficile.', 'Hab %quest_link angenommen, mal sehen, wie schwer sie ist.', '接受了%quest_link,看看这任务有多难。', '', '', '', ''); +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 (119, 'broadcast_quest_accepted_generic', 'Picked up %quest_link, time to go make some progress.', 0, 0, '', 'J’ai récupéré %quest_link, il est temps d’avancer et de progresser.', 'Hab %quest_link aufgenommen, Zeit, Fortschritt zu machen.', '拿下%quest_link,该去干点活儿了。', '', '', '', ''); +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 (120, 'broadcast_quest_accepted_generic', 'Just took %quest_link. Let’s see how hard this one is.', 0, 0, '', 'Je viens de commencer %quest_link. Voyons à quel point elle est difficile.', 'Hab gerade %quest_link angenommen. Mal sehen, wie hart sie ist.', '刚接了%quest_link,看看这任务有多棘手。', '', '', '', ''); +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 (121, 'broadcast_quest_accepted_generic', 'Accepted %quest_link, let’s hope there’s no surprise boss at the end.', 0, 0, '', 'Accepté %quest_link, espérons qu’il n’y ait pas de boss surprise à la fin.', 'Hab %quest_link angenommen, hoffentlich gibt’s am Ende keinen Überraschungsboss.', '接了%quest_link,希望最后别蹦出个惊喜首领。', '', '', '', ''); +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 (122, 'broadcast_quest_accepted_generic', 'On my way to complete %quest_link. Here we go!', 0, 0, '', 'En route pour terminer ma quête %quest_link! C’est parti!', 'Unterwegs, um %quest_link abzuschließen. Auf geht’s!', '正在赶去完成%quest_link,走起!', '', '', '', ''); +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 (123, 'broadcast_quest_accepted_generic', 'I guess I’m doing %quest_link now. Let’s hope it’s worth it.', 0, 0, '', 'Je suppose que je me lance dans %quest_link maintenant. Espérons que cela en vaille la peine.', 'Sieht so aus, als würde ich jetzt %quest_link machen. Hoffentlich lohnt es sich.', '看来现在得做%quest_link,希望值回票价。', '', '', '', ''); +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 (124, 'broadcast_quest_accepted_generic', 'Picked up %quest_link. Let’s get moving!', 0, 0, '', 'J’ai récupéré %quest_link. Allez, on se bouge !', 'Hab %quest_link bekommen. Los geht’s!', '拿到了%quest_link,赶紧行动起来!', '', '', '', ''); +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 (125, 'broadcast_quest_accepted_generic', 'I’ve just taken %quest_link. This should be a piece of cake.', 0, 0, '', 'Je viens juste de prendre %quest_link. Ça devrait être facile comme tout.', 'Hab gerade %quest_link angenommen. Das sollte ein Klacks sein.', '刚接了%quest_link,这应该很简单。', '', '', '', ''); +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 (126, 'broadcast_quest_accepted_generic', 'I accepted %quest_link, now to knock it out of the park.', 0, 0, '', 'J’ai accepté %quest_link, maintenant il va falloir assurer comme jamais.', 'Hab %quest_link angenommen, jetzt bring ich’s zu Ende.', '我接了%quest_link,现在得干得漂亮。', '', '', '', ''); +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 (127, 'broadcast_quest_accepted_generic', 'Took %quest_link in %zone_name. Let’s do this!', 0, 0, '', 'J’ai pris %quest_link dans %zone_name. Allons-y!', 'Hab %quest_link in %zone_name angenommen. Los geht’s!', '在%zone_name接了%quest_link,干吧!', '', '', '', ''); +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 (128, 'broadcast_quest_accepted_generic', 'On my way to finish %quest_link. Let’s make it quick!', 0, 0, '', 'En route pour terminer %quest_link. Allez, on se dépêche !', 'Unterwegs, um %quest_link zu beenden. Machen wir’s schnell!', '正在去完成%quest_link,赶紧搞定!', '', '', '', ''); +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 (129, 'broadcast_quest_accepted_generic', 'Accepted %quest_link. Wonder what awaits me in %zone_name.', 0, 0, '', 'Quête %quest_link acceptée. Je me demande ce qui m’attend dans la zone %zone_name.', '%quest_link angenommen. Mal sehen, was mich in %zone_name erwartet.', '接了%quest_link,不知道%zone_name会有啥等着我。', '', '', '', ''); +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 (130, 'broadcast_quest_accepted_generic', 'Got %quest_link, hope it doesn’t take forever.', 0, 0, '', 'J’ai attrapé %quest_link, j’espère que ça ne prendra pas une éternité.', 'Hab %quest_link bekommen, hoffentlich dauert das nicht ewig.', '拿到了%quest_link,希望别拖太久。', '', '', '', ''); +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 (131, 'broadcast_quest_accepted_generic', 'Just grabbed %quest_link. Here we go again.', 0, 0, '', 'Je viens de récupérer %quest_link. C’est reparti pour une nouvelle aventure.', 'Hab %quest_link geschnappt. Und wieder geht’s los.', '刚抢到%quest_link,又开始了。', '', '', '', ''); +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 (132, 'broadcast_quest_accepted_generic', 'Looks like %quest_link is the next one on my list.', 0, 0, '', 'Il semblerait que %quest_link soit le prochain sur ma liste.', 'Sieht aus, als wäre %quest_link die nächste auf meiner Liste.', '看来%quest_link是我列表上的下一个任务。', '', '', '', ''); +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 (133, 'broadcast_quest_accepted_generic', 'Off to complete %quest_link. I hope this one is fun.', 0, 0, '', 'En route pour accomplir %quest_link. J’espère que celle-ci est amusante.', 'Auf geht’s, %quest_link abschließen. Hoffentlich macht die Spaß.', '去完成%quest_link,希望这任务有点意思。', '', '', '', ''); +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 (134, 'broadcast_quest_accepted_generic', 'I’m diving into %quest_link. This will be an adventure!', 0, 0, '', 'Je plonge dans %quest_link. Ça s’annonce comme une aventure passionnante !', 'Ich stürze mich in %quest_link. Das wird ein Abenteuer!', '我一头扎进%quest_link,这会是一场冒险!', '', '', '', ''); +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 (135, 'broadcast_quest_accepted_generic', 'Accepted %quest_link in %zone_name. Let’s see what this brings!', 0, 0, '', '%Quête acceptée dans %zone_name. Voyons ce que cela nous réserve !', '%quest_link in %zone_name angenommen. Mal sehen, was das bringt!', '在%zone_name接了%quest_link,看看会发生啥!', '', '', '', ''); +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 (136, 'broadcast_quest_accepted_generic', 'Just took %quest_link. Time to see what I’m up against.', 0, 0, '', 'Je viens de prendre %quest_link. C’est l’heure de voir à quoi je dois faire face.', 'Hab gerade %quest_link angenommen. Mal sehen, was mich erwartet.', '刚接了%quest_link,是时候看看我要面对啥了。', '', '', '', ''); +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 (137, 'broadcast_quest_accepted_generic', 'Another %quest_link. Let’s get this done quickly!', 0, 0, '', 'Encore une %quest_link. On va régler ça rapidement!', 'Noch eine %quest_link. Machen wir’s schnell!', '又一个%quest_link,赶紧搞定吧!', '', '', '', ''); +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 (138, 'broadcast_quest_accepted_generic', 'I just took %quest_link. This will be a fun one!', 0, 0, '', 'Je viens de prendre %quest_link. Ça promet d’être amusant !', 'Hab gerade %quest_link angenommen. Das wird bestimmt lustig!', '刚接了%quest_link,这任务应该挺有趣!', '', '', '', ''); +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 (139, 'broadcast_quest_accepted_generic', 'Taking on %quest_link in %zone_name. Let’s go!', 0, 0, '', 'Je me lance dans %quest_link dans la région de %zone_name. C’est parti !', 'Starte %quest_link in %zone_name. Los geht’s!', '在%zone_name挑战%quest_link,走起!', '', '', '', ''); +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 (140, 'broadcast_quest_accepted_generic', 'Grabbed %quest_link. Can’t wait to see what happens next.', 0, 0, '', 'Attrapé %quest_link. Hâte de voir ce qui se passe ensuite.', 'Hab %quest_link geschnappt. Bin gespannt, was als Nächstes passiert.', '抢到%quest_link,迫不及待想知道接下来会发生啥。', '', '', '', ''); +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 (141, 'broadcast_quest_accepted_generic', 'Took %quest_link. Time to dive in and get it done.', 0, 0, '', 'J’ai pris %quest_link. Il est temps de s’y mettre et de le réaliser.', 'Hab %quest_link angenommen. Zeit, loszulegen.', '接了%quest_link,是时候埋头苦干了。', '', '', '', ''); +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 (142, 'broadcast_quest_accepted_generic', 'Alright, %quest_link is on. Let’s get to work!', 0, 0, '', 'D’accord, %quest_link est en marche. Au travail !', 'Alles klar, %quest_link läuft. An die Arbeit!', '好吧,%quest_link开始了,干活去!', '', '', '', ''); +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 (143, 'broadcast_quest_accepted_generic', 'On to %quest_link. Let’s hope it’s not too hard.', 0, 0, '', 'En route vers %quest_link. Espérons que ce ne soit pas trop difficile.', 'Auf zu %quest_link. Hoffentlich ist die nicht zu schwer.', '前往做%quest_link,希望别太难。', '', '', '', ''); +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 (144, 'broadcast_quest_accepted_generic', 'Just grabbed %quest_link. Should be an easy one!', 0, 0, '', 'Je viens de saisir %quest_link. Ça devrait être une mission facile !', 'Hab gerade %quest_link geschnappt. Sollte einfach sein!', '刚抢到%quest_link,应该挺简单的!', '', '', '', ''); +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 (145, 'broadcast_quest_accepted_generic', 'I’ve accepted %quest_link. Let’s make it quick!', 0, 0, '', 'J’ai accepté %quest_link. Allons-y rapidement!', 'Hab %quest_link angenommen. Machen wir’s schnell!', '我接了%quest_link,赶紧完成吧!', '', '', '', ''); +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 (146, 'broadcast_quest_accepted_generic', 'Took %quest_link, now to see what it’s all about.', 0, 0, '', 'J’ai pris %quest_link, maintenant je vais voir de quoi il s’agit.', 'Hab %quest_link angenommen, mal sehen, worum’s geht.', '接了%quest_link,现在看看这是个啥任务。', '', '', '', ''); +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 (147, 'broadcast_quest_accepted_generic', 'Just accepted %quest_link, let’s get moving!', 0, 0, '', 'Je viens d’accepter la %quest_link, allons-y !', 'Gerade %quest_link angenommen, los geht’s!', '刚接受了%quest_link,动起来吧!', '', '', '', ''); + +-- usable placeholders: +-- %quest_link +-- %zone_name +-- %area_name +-- %quest_obj_available +-- %quest_obj_required +-- %quest_obj_missing +-- %quest_obj_name +-- %quest_obj_full_formatted +-- %my_race +-- %my_class +-- %my_level +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 (148, 'broadcast_quest_update_add_kill_objective_completed', 'Finally done with the %quest_obj_name for %quest_link', 0, 0, '', 'Enfin terminé avec la quête %quest_obj_name pour %quest_link.', 'Endlich fertig mit %quest_obj_name für %quest_link.', '终于完成了%quest_link的%quest_obj_name任务目标!', '', '', '', 'Наконец-то закончил %quest_obj_name для %quest_link'); +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 (149, 'broadcast_quest_update_add_kill_objective_completed', 'finally got %quest_obj_available/%quest_obj_required of %quest_obj_name for the %quest_link', 0, 0, '', 'J’ai enfin obtenu %quest_obj_available/%quest_obj_required de %quest_obj_name pour %quest_link.', 'Endlich %quest_obj_available/%quest_obj_required von %quest_obj_name für %quest_link bekommen.', '终于在%quest_link任务中拿到了%quest_obj_available/%quest_obj_required个%quest_obj_name!', '', '', '', 'наконец-то получил %quest_obj_available/%quest_obj_required %quest_obj_name для %quest_link'); +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 (150, 'broadcast_quest_update_add_kill_objective_completed', '%quest_obj_full_formatted for the %quest_link, at last', 0, 0, '', 'Enfin, j’ai terminé la %quest_obj_full_formatted pour %quest_link.', '%quest_obj_full_formatted für %quest_link, endlich fertig.', '终于搞定了%quest_link的%quest_obj_full_formatted!', '', '', '', '%quest_obj_full_formatted для %quest_link, наконец-то'); +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 (151, 'broadcast_quest_update_add_kill_objective_progress', 'Oof, got %quest_obj_available/%quest_obj_required %quest_obj_name for %quest_link', 0, 0, '', 'Oof, j’ai obtenu %quest_obj_available/%quest_obj_required %quest_obj_name pour %quest_link.', 'Uff, %quest_obj_available/%quest_obj_required %quest_obj_name für %quest_link gesammelt.', '呼,完成了%quest_link的%quest_obj_available/%quest_obj_required个%quest_obj_name。', '', '', '', 'Ох, получил %quest_obj_available/%quest_obj_required %quest_obj_name для %quest_link'); +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 (152, 'broadcast_quest_update_add_kill_objective_progress', 'still need %quest_obj_missing more of %quest_obj_name for %quest_link', 0, 0, '', 'Il me manque encore %quest_obj_missing de %quest_obj_name pour %quest_link.', 'Mir fehlen noch %quest_obj_missing von %quest_obj_name für %quest_link.', '还差%quest_obj_missing个%quest_obj_name才能完成%quest_link。', '', '', '', 'еще нужно %quest_obj_missing %quest_obj_name для %quest_link'); +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 (153, 'broadcast_quest_update_add_kill_objective_progress', '%quest_obj_full_formatted, still working on %quest_link', 0, 0, '', 'Je suis toujours en train de travailler sur %quest_obj_full_formatted, ça prend un peu de temps mais je vais y arriver.', '%quest_obj_full_formatted erledigt, arbeite noch an %quest_link.', '%quest_obj_full_formatted完成了,还在努力做%quest_link。', '', '', '', '%quest_obj_full_formatted, все еще работаю над %quest_link'); +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 (154, 'broadcast_quest_update_add_kill_objective_completed', '%quest_obj_name complete for %quest_link, what a grind!', 0, 0, '', '%quest_obj_name complété pour %quest_link, quelle corvée !', '%quest_obj_name für %quest_link erledigt, was für ein Grind!', '%quest_obj_name完成了%quest_link,真是累死人!', '', '', '', ''); +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 (155, 'broadcast_quest_update_add_kill_objective_progress', 'Getting close to completing %quest_obj_name for %quest_link, just need %quest_obj_missing more.', 0, 0, '', 'Je suis sur le point de terminer %quest_obj_name pour %quest_link, il me manque juste %quest_obj_missing.', 'Fast fertig mit %quest_obj_name für %quest_link, brauche nur noch %quest_obj_missing.', '快完成%quest_link的%quest_obj_name了,只差%quest_obj_missing个。', '', '', '', ''); +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 (156, 'broadcast_quest_update_add_kill_objective_progress', '%quest_obj_name is almost done, need just %quest_obj_missing more for %quest_link.', 0, 0, '', 'Il ne manque presque rien à %quest_obj_name, j’ai juste besoin de %quest_obj_missing de plus pour %quest_link.', '%quest_obj_name fast geschafft, brauche nur noch %quest_obj_missing für %quest_link.', '%quest_obj_name快完成了,%quest_link还差%quest_obj_missing个。', '', '', '', ''); +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 (157, 'broadcast_quest_update_add_kill_objective_progress', 'So far, %quest_obj_available/%quest_obj_required %quest_obj_name completed for %quest_link.', 0, 0, '', 'Jusqu’à présent, %quest_obj_available/%quest_obj_required %quest_obj_name ont été complétés pour %quest_link.', 'Bisher %quest_obj_available/%quest_obj_required %quest_obj_name für %quest_link erledigt.', '目前完成了%quest_link的%quest_obj_available/%quest_obj_required个%quest_obj_name。', '', '', '', ''); +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 (158, 'broadcast_quest_update_add_kill_objective_completed', 'Finally finished %quest_obj_name for %quest_link! That took a while!', 0, 0, '', 'J’ai enfin terminé %quest_obj_name pour %quest_link! Ça m’a pris un moment!', 'Endlich %quest_obj_name für %quest_link abgeschlossen! Das hat gedauert!', '终于完成了%quest_link的%quest_obj_name,花了好长时间!', '', '', '', ''); +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 (159, 'broadcast_quest_update_add_kill_objective_progress', 'Still going strong, got %quest_obj_available/%quest_obj_required of %quest_obj_name for %quest_link.', 0, 0, '', 'Toujours en pleine forme, j’ai réussi à obtenir %quest_obj_available/%quest_obj_required de %quest_obj_name pour %quest_link.', 'Läuft gut, %quest_obj_available/%quest_obj_required von %quest_obj_name für %quest_link bekommen.', '进展顺利,拿到了%quest_link的%quest_obj_available/%quest_obj_required个%quest_obj_name。', '', '', '', ''); +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 (160, 'broadcast_quest_update_add_kill_objective_completed', 'Yes! Completed %quest_obj_name for %quest_link. On to the next one!', 0, 0, '', 'Oui! J’ai fini %quest_obj_name pour %quest_link. Passons à la prochaine!', 'Ja! %quest_obj_name für %quest_link abgeschlossen. Weiter geht’s!', '好耶!完成了%quest_link的%quest_obj_name,下一目标!', '', '', '', ''); +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 (161, 'broadcast_quest_update_add_kill_objective_progress', 'Made progress on %quest_obj_name, %quest_obj_available/%quest_obj_required completed for %quest_link.', 0, 0, '', 'J’ai fait des progrès sur l’objectif de quête, j’ai terminé %quest_obj_available/%quest_obj_required pour %quest_link.', 'Fortschritt bei %quest_obj_name gemacht, %quest_obj_available/%quest_obj_required für %quest_link abgeschlossen.', '在%quest_obj_name上有了进展,完成了%quest_link的%quest_obj_available/%quest_obj_required。', '', '', '', ''); +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 (162, 'broadcast_quest_update_add_kill_objective_progress', '%quest_obj_full_formatted... almost there for %quest_link!', 0, 0, '', '%quest_obj_full_formatted... presque arrivé pour %quest_link!', '%quest_obj_full_formatted... fast fertig mit %quest_link!', '%quest_obj_full_formatted…快搞定%quest_link了!', '', '', '', ''); +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 (163, 'broadcast_quest_update_add_kill_objective_progress', 'Just need %quest_obj_missing more %quest_obj_name for %quest_link, almost done!', 0, 0, '', 'J’ai juste besoin de quelques %quest_obj_missing supplémentaires de %quest_obj_name pour %quest_link, presque terminé !', 'Brauche nur noch %quest_obj_missing mehr von %quest_obj_name für %quest_link, fast geschafft!', '只差%quest_obj_missing个%quest_obj_name就能完成%quest_link,快好了!', '', '', '', ''); +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 (164, 'broadcast_quest_update_add_kill_objective_completed', 'Finally done with %quest_obj_name for %quest_link, what a relief!', 0, 0, '', 'Enfin terminé avec %quest_obj_name pour %quest_link, quel soulagement !', 'Endlich fertig mit %quest_obj_name für %quest_link, was für eine Erleichterung!', '终于搞定了%quest_link的%quest_obj_name,真是松了一口气!', '', '', '', ''); +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 (165, 'broadcast_quest_update_add_kill_objective_progress', 'Got %quest_obj_available/%quest_obj_required of %quest_obj_name for %quest_link, making progress!', 0, 0, '', 'J’ai obtenu %quest_obj_available/%quest_obj_required de %quest_obj_name pour %quest_link, je progresse !', '%quest_obj_available/%quest_obj_required von %quest_obj_name für %quest_link bekommen, Fortschritt gemacht!', '拿到了%quest_link的%quest_obj_available/%quest_obj_required个%quest_obj_name,进展不错!', '', '', '', ''); +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 (166, 'broadcast_quest_update_add_kill_objective_completed', 'The %quest_obj_name for %quest_link is complete! Now for the next task.', 0, 0, '', 'La %quest_obj_name pour %quest_link est terminée ! Maintenant, passons à la tâche suivante.', '%quest_obj_name für %quest_link ist erledigt! Jetzt zur nächsten Aufgabe.', '%quest_link的%quest_obj_name完成了!接下来是下一个目标。', '', '', '', ''); +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 (167, 'broadcast_quest_update_add_kill_objective_completed', '100% of %quest_obj_name done for %quest_link, now onto the rewards!', 0, 0, '', 'J’ai terminé 100% de %quest_obj_name pour %quest_link, passons maintenant aux récompenses!', '100% von %quest_obj_name für %quest_link erledigt, jetzt zu den Belohnungen!', '完成了 %quest_obj_name 的 100% 进度,为 %quest_link,接下来就是领取奖励了!', '', '', '', ''); +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 (168, 'broadcast_quest_update_add_kill_objective_progress', 'Still need %quest_obj_missing more of %quest_obj_name for %quest_link, almost done!', 0, 0, '', 'J’ai encore besoin de %quest_obj_missing de %quest_obj_name pour %quest_link, presque terminé !', 'Brauche noch %quest_obj_missing mehr von %quest_obj_name für %quest_link, fast fertig!', '还差 %quest_obj_missing 个 %quest_obj_name 就能完成 %quest_link,快搞定了!', '', '', '', ''); +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 (169, 'broadcast_quest_update_add_kill_objective_progress', 'Working on %quest_obj_name for %quest_link, currently %quest_obj_available/%quest_obj_required done.', 0, 0, '', 'Je travaille sur la quête %quest_obj_name pour %quest_link, j’ai actuellement accompli %quest_obj_available sur %quest_obj_required étapes.', 'Arbeite an %quest_obj_name für %quest_link, bisher %quest_obj_available/%quest_obj_required erledigt.', '正在为 %quest_link 搞定 %quest_obj_name,目前完成了 %quest_obj_available/%quest_obj_required。', '', '', '', ''); +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 (170, 'broadcast_quest_update_add_kill_objective_completed', '%quest_obj_full_formatted for %quest_link. That was a long one!', 0, 0, '', '%quest_obj_full_formatted pour %quest_link. Quelle aventure épique!', '%quest_obj_full_formatted für %quest_link. Das war eine lange Aufgabe!', '完成了 %quest_obj_full_formatted,为 %quest_link。这任务真够长的!', '', '', '', ''); +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 (171, 'broadcast_quest_update_add_kill_objective_progress', 'Just need a few more of %quest_obj_name for %quest_link, and I’m done!', 0, 0, '', 'J’ai juste besoin de quelques %quest_obj_name de plus pour %quest_link, et j’ai fini!', 'Brauche nur noch ein paar %quest_obj_name für %quest_link, dann bin ich fertig!', '就差几个 %quest_obj_name 就能完成 %quest_link,马上就搞定啦!', '', '', '', ''); +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 (172, 'broadcast_quest_update_add_kill_objective_completed', 'Another objective completed! %quest_obj_full_formatted for %quest_link', 0, 0, '', 'Encore un objectif accompli! %quest_obj_full_formatted pour %quest_link', 'Noch ein Ziel erreicht! %quest_obj_full_formatted für %quest_link', '又一个目标完成!%quest_obj_full_formatted,为 %quest_link。', '', '', '', ''); +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 (173, 'broadcast_quest_update_add_kill_objective_progress', 'Still grinding on %quest_obj_name for %quest_link, almost there with %quest_obj_available/%quest_obj_required.', 0, 0, '', 'Je continue de travailler sur %quest_obj_name pour %quest_link, j’y suis presque avec %quest_obj_available/%quest_obj_required.', 'Noch am Farmen für %quest_obj_name für %quest_link, fast fertig mit %quest_obj_available/%quest_obj_required.', '还在为 %quest_link 刷 %quest_obj_name,快到了,目前 %quest_obj_available/%quest_obj_required。', '', '', '', ''); +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 (174, 'broadcast_quest_update_add_kill_objective_completed', 'Objective done! %quest_obj_full_formatted for %quest_link. On to the next one!', 0, 0, '', 'Objectif accompli ! J’ai rempli l’objectif pour la quête « %quest_link ». Passons à la suivante !', 'Ziel erreicht! %quest_obj_full_formatted für %quest_link erledigt. Weiter geht’s!', '目标完成!%quest_obj_full_formatted,为 %quest_link。下一个!', '', '', '', ''); + +-- usable placeholders: +-- %quest_link +-- %zone_name +-- %area_name +-- %quest_obj_available +-- %quest_obj_required +-- %quest_obj_missing +-- %item_link +-- %quest_obj_full_formatted +-- %my_race +-- %my_class +-- %my_level +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 (175, 'broadcast_quest_update_add_item_objective_completed', 'Finally done with the %item_link for %quest_link', 0, 0, '', 'Enfin fini avec l’%item_link pour %quest_link.', 'Endlich fertig mit %item_link für %quest_link.', '终于搞定了 %item_link,为 %quest_link!', '', '', '', 'Наконец-то закончил с %item_link для %quest_link'); +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 (176, 'broadcast_quest_update_add_item_objective_completed', 'finally got %quest_obj_available/%quest_obj_required of %item_link for the %quest_link', 0, 0, '', 'J’ai enfin obtenu %quest_obj_available/%quest_obj_required de %item_link pour la %quest_link.', 'Endlich %quest_obj_available/%quest_obj_required von %item_link für %quest_link bekommen.', '终于收集到 %quest_obj_available/%quest_obj_required 个 %item_link,为 %quest_link!', '', '', '', 'наконец-то получил %quest_obj_available/%quest_obj_required %item_link для %quest_link'); +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 (177, 'broadcast_quest_update_add_item_objective_completed', '%quest_obj_full_formatted for the %quest_link, at last', 0, 0, '', 'La quête est enfin terminée pour %quest_link.', '%quest_obj_full_formatted für %quest_link, endlich geschafft.', '终于完成了 %quest_obj_full_formatted,为 %quest_link!', '', '', '', '%quest_obj_full_formatted для %quest_link, наконец-то'); +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 (178, 'broadcast_quest_update_add_item_objective_progress', 'Oof, got %quest_obj_available/%quest_obj_required %item_link for %quest_link', 0, 0, '', 'Ouf, j’ai obtenu %quest_obj_available sur %quest_obj_required %item_link pour la quête %quest_link.', 'Uff, %quest_obj_available/%quest_obj_required %item_link für %quest_link gesammelt.', '哎呀,搞到 %quest_obj_available/%quest_obj_required 个 %item_link,为 %quest_link。', '', '', '', 'Ох, получил %quest_obj_available/%quest_obj_required %item_link для %quest_link'); +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 (179, 'broadcast_quest_update_add_item_objective_progress', 'still need %quest_obj_missing more of %item_link for %quest_link', 0, 0, '', 'Il me faut %quest_obj_missing encore plus de %item_link pour la quête %quest_link.', 'Brauche noch %quest_obj_missing mehr von %item_link für %quest_link.', '还差 %quest_obj_missing 个 %item_link 就能完成 %quest_link。', '', '', '', 'еще нужно %quest_obj_missing %item_link для %quest_link'); +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 (180, 'broadcast_quest_update_add_item_objective_progress', '%quest_obj_full_formatted, still working on %quest_link', 0, 0, '', 'Désolé, je suis toujours en train de travailler sur %quest_link.', '%quest_obj_full_formatted erledigt, arbeite noch an %quest_link.', '完成了 %quest_obj_full_formatted,还在为 %quest_link 努力。', '', '', '', '%quest_obj_full_formatted, все еще работаю над %quest_link'); +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 (181, 'broadcast_quest_update_add_item_objective_completed', 'Completed the %item_link objective for %quest_link. Finally!', 0, 0, '', 'J’ai terminé l’objectif %item_link de la quête %quest_link. Enfin!', 'Das Ziel mit %item_link für %quest_link abgeschlossen. Endlich!', '完成了 %item_link 目标,为 %quest_link。终于搞定!', '', '', '', ''); +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 (182, 'broadcast_quest_update_add_item_objective_progress', 'Making progress! %quest_obj_available/%quest_obj_required %item_link for %quest_link.', 0, 0, '', 'Je progresse! J’ai actuellement %quest_obj_available sur les %quest_obj_required %item_link requis pour la quête %quest_link.', 'Fortschritt gemacht! %quest_obj_available/%quest_obj_required %item_link für %quest_link.', '有进展!目前有 %quest_obj_available/%quest_obj_required 个 %item_link,为 %quest_link。', '', '', '', ''); +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 (183, 'broadcast_quest_update_add_item_objective_progress', '%quest_obj_name is halfway done, need %quest_obj_missing more %item_link for %quest_link.', 0, 0, '', '%quest_obj_name est à moitié terminée, il me manque %quest_obj_missing %item_link pour %quest_link.', '%quest_obj_name ist zur Hälfte erledigt, brauche noch %quest_obj_missing %item_link für %quest_link.', '%quest_obj_name 完成了一半,还差 %quest_obj_missing 个 %item_link 为 %quest_link。', '', '', '', ''); +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 (184, 'broadcast_quest_update_add_item_objective_progress', 'Still need %quest_obj_missing of %item_link for %quest_link, but getting closer!', 0, 0, '', 'Il me manque encore %quest_obj_missing de %item_link pour %quest_link, mais je me rapproche !', 'Brauche noch %quest_obj_missing von %item_link für %quest_link, aber ich komme näher!', '还差 %quest_obj_missing 个 %item_link 为 %quest_link,不过越来越近了!', '', '', '', ''); +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 (185, 'broadcast_quest_update_add_item_objective_completed', 'Finally finished %item_link for %quest_link, now time for the next task!', 0, 0, '', 'J’ai enfin terminé %item_link pour la quête %quest_link, il est temps de passer à la prochaine tâche !', 'Endlich %item_link für %quest_link abgeschlossen, jetzt auf zur nächsten Aufgabe!', '终于完成了 %item_link 为 %quest_link,接下来是下一个任务!', '', '', '', ''); +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 (186, 'broadcast_quest_update_add_item_objective_progress', 'Almost there! Got %quest_obj_available/%quest_obj_required %item_link for %quest_link.', 0, 0, '', 'On y est presque! J’ai obtenu %quest_obj_available/%quest_obj_required %item_link pour %quest_link.', 'Fast geschafft! Habe %quest_obj_available/%quest_obj_required %item_link für %quest_link.', '快搞定了!已经拿到 %quest_obj_available/%quest_obj_required 个 %item_link,为 %quest_link。', '', '', '', ''); +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 (187, 'broadcast_quest_update_add_item_objective_completed', 'Yes! Completed %item_link for %quest_link. Now moving on to the next objective.', 0, 0, '', 'Oui ! J’ai terminé %item_link pour %quest_link. Je passe maintenant à l’objectif suivant.', 'Ja! %item_link für %quest_link abgeschlossen. Weiter zum nächsten Ziel.', '好嘞!完成了 %item_link 为 %quest_link。下一个目标走起!', '', '', '', ''); +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 (188, 'broadcast_quest_update_add_item_objective_progress', 'Still need %quest_obj_missing more %item_link for %quest_link, but progress is being made!', 0, 0, '', 'Il me manque encore %quest_obj_missing %item_link pour la quête %quest_link, mais je progresse!', 'Brauche noch %quest_obj_missing %item_link für %quest_link, aber es geht voran!', '还差 %quest_obj_missing 个 %item_link 为 %quest_link,不过已经在进步了!', '', '', '', ''); +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 (189, 'broadcast_quest_update_add_item_objective_progress', 'Made good progress on %item_link for %quest_link, need %quest_obj_missing more.', 0, 0, '', 'J’ai bien avancé sur %item_link pour %quest_link, mais il me manque encore %quest_obj_missing.', 'Guten Fortschritt mit %item_link für %quest_link gemacht, brauche noch %quest_obj_missing.', '在 %item_link 上有不错进展,为 %quest_link,还差 %quest_obj_missing 个。', '', '', '', ''); +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 (190, 'broadcast_quest_update_add_item_objective_completed', '100% of %item_link done for %quest_link! Time to move forward.', 0, 0, '', 'J’ai complété 100% de %item_link pour %quest_link! Il est temps de passer à la suite.', '100% von %item_link für %quest_link erledigt! Zeit weiterzumachen.', '100% 完成 %item_link 为 %quest_link!该继续前进了。', '', '', '', ''); +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 (191, 'broadcast_quest_update_add_item_objective_progress', 'Got %quest_obj_available/%quest_obj_required %item_link for %quest_link. I can feel the finish line!', 0, 0, '', 'J’ai obtenu %quest_obj_available/%quest_obj_required %item_link pour %quest_link. Je sens que je touche au but!', 'Habe %quest_obj_available/%quest_obj_required %item_link für %quest_link. Ziel fast erreicht!', '拿到 %quest_obj_available/%quest_obj_required 个 %item_link 为 %quest_link,终点就在眼前!', '', '', '', ''); +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 (192, 'broadcast_quest_update_add_item_objective_completed', 'That’s it, %item_link complete for %quest_link. What a relief!', 0, 0, '', 'C’est bon, %item_link complet pour %quest_link. Quel soulagement !', 'Geschafft, %item_link für %quest_link erledigt. Was für eine Erleichterung!', '搞定,完成了 %item_link 为 %quest_link。松了一口气!', '', '', '', ''); +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 (193, 'broadcast_quest_update_add_item_objective_progress', 'Working hard on %item_link for %quest_link, still need %quest_obj_missing more.', 0, 0, '', 'Je travaille dur sur %item_link pour %quest_link, mais j’ai encore besoin de %quest_obj_missing de plus.', 'Arbeite hart an %item_link für %quest_link, brauche noch %quest_obj_missing mehr.', '正在努力搞 %item_link 为 %quest_link,还差 %quest_obj_missing 个。', '', '', '', ''); +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 (194, 'broadcast_quest_update_add_item_objective_progress', 'Almost finished with %item_link for %quest_link, just %quest_obj_missing more left.', 0, 0, '', 'Presque terminé avec %item_link pour %quest_link, il ne reste plus que %quest_obj_missing.', 'Fast fertig mit %item_link für %quest_link, nur noch %quest_obj_missing übrig.', '快搞定 %item_link 为 %quest_link了,只剩 %quest_obj_missing 个。', '', '', '', ''); +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 (195, 'broadcast_quest_update_add_item_objective_completed', 'Completed %item_link for %quest_link, the grind is real!', 0, 0, '', 'J’ai terminé %item_link pour %quest_link, la galère!', '%item_link für %quest_link abgeschlossen, das war ein harter Grind!', '完成了 %item_link 为 %quest_link,刷得真辛苦!', '', '', '', ''); +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 (196, 'broadcast_quest_update_add_item_objective_progress', 'Still chipping away at %item_link for %quest_link, %quest_obj_available/%quest_obj_required done so far.', 0, 0, '', 'Je suis toujours en train de travailler sur %item_link pour %quest_link, j’ai accompli %quest_obj_available/%quest_obj_required jusqu’à présent.', 'Immer noch dabei, %item_link für %quest_link zu sammeln, bisher %quest_obj_available/%quest_obj_required erledigt.', '还在慢慢搞 %item_link 为 %quest_link,目前完成了 %quest_obj_available/%quest_obj_required。', '', '', '', ''); +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 (197, 'broadcast_quest_update_add_item_objective_progress', '%item_link for %quest_link is getting closer to completion, %quest_obj_available/%quest_obj_required done.', 0, 0, '', '%item_link pour la quête %quest_link approche de la fin, j’ai accompli %quest_obj_available/%quest_obj_required objectifs.', '%item_link für %quest_link fast fertig, %quest_obj_available/%quest_obj_required erledigt.', '%item_link 为 %quest_link 快完成了,目前完成 %quest_obj_available/%quest_obj_required。', '', '', '', ''); +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 (198, 'broadcast_quest_update_add_item_objective_completed', 'Yes! %item_link finished for %quest_link! That one took a bit longer.', 0, 0, '', 'Oui! %item_link terminé pour %quest_link! Celui-là a pris un peu plus de temps.', 'Ja! %item_link für %quest_link abgeschlossen! Das hat etwas länger gedauert.', '好嘞!%item_link 为 %quest_link 完成!这个花了点时间。', '', '', '', ''); +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 (199, 'broadcast_quest_update_add_item_objective_progress', 'I have %quest_obj_available/%quest_obj_required of %item_link for %quest_link, still going strong!', 0, 0, '', 'J’ai %quest_obj_available/%quest_obj_required de %item_link pour %quest_link, et je continue sur ma lancée!', 'Habe %quest_obj_available/%quest_obj_required von %item_link für %quest_link, läuft weiter gut!', '我有 %quest_obj_available/%quest_obj_required 个 %item_link 为 %quest_link,继续努力!', '', '', '', ''); +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 (200, 'broadcast_quest_update_add_item_objective_completed', 'Done with %item_link for %quest_link. On to the next one!', 0, 0, '', 'Terminé avec %item_link pour %quest_link. Passons à la suite !', 'Fertig mit %item_link für %quest_link. Weiter zur nächsten!', '搞定 %item_link 为 %quest_link,下一个任务走起!', '', '', '', ''); +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 (201, 'broadcast_quest_update_add_item_objective_completed', 'Another one down! %item_link is complete for %quest_link!', 0, 0, '', 'Encore un de fait! %item_link est complet pour %quest_link!', 'Wieder eine erledigt! %item_link für %quest_link abgeschlossen!', '又搞定一个!%item_link 为 %quest_link 完成!', '', '', '', ''); +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 (202, 'broadcast_quest_update_add_item_objective_progress', 'Still grinding on %item_link for %quest_link, got %quest_obj_available/%quest_obj_required done.', 0, 0, '', 'Je continue à travailler sur %item_link pour la quête %quest_link, j’ai accompli %quest_obj_available/%quest_obj_required objectifs jusqu’à présent.', 'Noch am Farmen für %item_link für %quest_link, bisher %quest_obj_available/%quest_obj_required erledigt.', '还在刷 %item_link 为 %quest_link,目前完成 %quest_obj_available/%quest_obj_required。', '', '', '', ''); +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 (203, 'broadcast_quest_update_add_item_objective_progress', 'Getting there! Need %quest_obj_missing more %item_link for %quest_link.', 0, 0, '', 'On y est presque! Il me manque %quest_obj_missing %item_link pour %quest_link.', 'Fast geschafft! Noch %quest_obj_missing %item_link für %quest_link nötig.', '快到了!还差 %quest_obj_missing 个 %item_link 为 %quest_link。', '', '', '', ''); + +-- usable placeholders: +-- %quest_link +-- %zone_name +-- %area_name +-- %my_race +-- %my_class +-- %my_level +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 (204, 'broadcast_quest_update_failed_timer', 'Failed to finish %quest_link in time...', 0, 0, '', 'J’ai échoué à terminer %quest_link à temps...', 'Hab es nicht geschafft, %quest_link rechtzeitig abzuschließen...', '没能在时间内完成 %quest_link……', '', '', '', 'Не успел завершить %quest_link вовремя...'); +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 (205, 'broadcast_quest_update_failed_timer', 'Ran out of time for %quest_link :(', 0, 0, '', 'J’ai manqué de temps pour %quest_link :(', 'Keine Zeit mehr für %quest_link :(', '时间不够,没完成 %quest_link :(', '', '', '', 'Время для %quest_link вышло :('); + +-- usable placeholders: +-- %quest_link +-- %zone_name +-- %area_name +-- %my_race +-- %my_class +-- %my_level +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 (206, 'broadcast_quest_update_complete', 'I have completed all objectives for %quest_link', 0, 0, '', 'J’ai terminé tous les objectifs pour %quest_link.', 'Alle Ziele für %quest_link abgeschlossen.', '我已经完成了 %quest_link 的所有目标!', '', '', '', 'Я выполнил все задачи для %quest_link'); +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 (207, 'broadcast_quest_update_complete', 'Completed all objectives for %quest_link', 0, 0, '', 'J’ai rempli tous les objectifs pour %quest_link.', 'Alle Aufgaben für %quest_link erledigt.', '完成了 %quest_link 的所有目标!', '', '', '', 'Выполнил все задачи для %quest_link'); +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 (208, 'broadcast_quest_update_complete', 'Gonna turn in the %quest_link soon, just finished all objectives', 0, 0, '', 'Je vais bientôt remettre la %quest_link, je viens de finir tous les objectifs.', 'Werde %quest_link bald abgeben, hab gerade alle Ziele erledigt.', '马上要去交 %quest_link 了,刚刚完成所有目标!', '', '', '', 'Скоро сдам %quest_link, только что закончил все задачи'); + +-- usable placeholders: +-- %quest_link +-- %zone_name +-- %area_name +-- %my_race +-- %my_class +-- %my_level +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 (209, 'broadcast_quest_turned_in', 'Yess, I have finally turned in the %quest_link', 0, 0, '', 'Oh ouiii, j’ai enfin remis la %quest_link', 'Ja, endlich %quest_link abgegeben!', '耶,终于完成了%quest_link任务,交掉了!', '', '', '', 'Да, наконец-то сдал %quest_link'); +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 (210, 'broadcast_quest_turned_in', 'turned in the %quest_link', 0, 0, '', 'J’ai soumis %quest_link.', '%quest_link abgegeben.', '交掉了%quest_link任务!', '', '', '', 'сдал %quest_link'); +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 (211, 'broadcast_quest_turned_in', 'managed to finish %quest_link, just turned in', 0, 0, '', 'J’ai réussi à terminer %quest_link, je viens tout juste de le remettre.', '%quest_link abgeschlossen und gerade abgegeben.', '终于搞定%quest_link任务,刚交了!', '', '', '', 'смог завершить %quest_link, только что сдал'); +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 (212, 'broadcast_quest_turned_in', 'just turned in %quest_link', 0, 0, '', 'Je viens de remettre %quest_link.', 'Gerade %quest_link abgegeben.', '刚交了%quest_link任务!', '', '', '', 'только что сдал %quest_link'); +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 (213, 'broadcast_quest_turned_in', 'just turned in %quest_link in %zone_name', 0, 0, '', 'Je viens de terminer la quête %quest_link dans la zone %zone_name.', 'Gerade %quest_link in %zone_name abgeschlossen.', '刚在%zone_name交了%quest_link任务!', '', '', '', 'только что сдал %quest_link в %zone_name'); +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 (214, 'broadcast_quest_turned_in', 'Another quest completed! %quest_link turned in', 0, 0, '', 'Encore une quête terminée! %quest_link remise', 'Noch eine Quest erledigt! %quest_link abgegeben.', '又完成一个任务!%quest_link交掉了!', '', '', '', ''); +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 (215, 'broadcast_quest_turned_in', 'Mission accomplished! %quest_link is turned in', 0, 0, '', 'Mission accomplie ! J’ai remis %quest_link.', 'Mission erfüllt! %quest_link abgegeben.', '任务完成!%quest_link交掉了!', '', '', '', ''); +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 (216, 'broadcast_quest_turned_in', 'Finally, %quest_link turned in! That was a journey!', 0, 0, '', 'Enfin, j’ai remis la %quest_link ! Quelle aventure !', 'Endlich %quest_link abgegeben! Was für eine Reise!', '终于交了%quest_link任务!真是一场冒险!', '', '', '', ''); +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 (217, 'broadcast_quest_turned_in', 'Just completed %quest_link and turned it in, feeling good!', 0, 0, '', 'Je viens de terminer %quest_link et de le rendre, je me sens bien !', 'Gerade %quest_link abgeschlossen und abgegeben, fühlt sich gut an!', '刚完成%quest_link任务并交了,感觉真不错!', '', '', '', ''); +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 (218, 'broadcast_quest_turned_in', 'Turned in %quest_link in %zone_name. Now, on to the next challenge!', 0, 0, '', 'J’ai remis la %quest_link dans %zone_name. Maintenant, je passe au défi suivant !', '%quest_link in %zone_name abgegeben. Jetzt weiter zur nächsten Herausforderung!', '在%zone_name交了%quest_link任务,接下来迎接新的挑战!', '', '', '', ''); +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 (219, 'broadcast_quest_turned_in', 'I have turned in %quest_link. One more down!', 0, 0, '', 'J’ai remis %quest_link. Un de moins à faire !', '%quest_link abgegeben. Wieder eine weniger!', '我交了%quest_link任务,又搞定一个!', '', '', '', ''); +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 (220, 'broadcast_quest_turned_in', 'Successfully turned in %quest_link, that took a while!', 0, 0, '', 'J’ai enfin réussi à remettre la %quest_link, ça m’a pris du temps !', '%quest_link endlich abgegeben, das hat gedauert!', '成功交了%quest_link任务,耗了不少时间!', '', '', '', ''); +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 (221, 'broadcast_quest_turned_in', 'Completed and turned in %quest_link in %zone_name. Feels great!', 0, 0, '', 'J’ai terminé et remis la %quest_link dans la zone %zone_name. Je me sens génial!', '%quest_link in %zone_name abgeschlossen und abgegeben. Fühlt sich super an!', '在%zone_name完成了%quest_link任务并交了,感觉棒极了!', '', '', '', ''); +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 (222, 'broadcast_quest_turned_in', 'Quest complete! %quest_link turned in and ready for the next one!', 0, 0, '', 'Quête terminée! J’ai remis %quest_link et je suis prêt pour la prochaine!', 'Quest abgeschlossen! %quest_link abgegeben und bereit für die nächste!', '任务完成!%quest_link交掉了,准备接下一个!', '', '', '', ''); +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 (223, 'broadcast_quest_turned_in', 'Finally turned in %quest_link in %zone_name. That one was tough!', 0, 0, '', 'Je viens enfin de rendre la %quest_link dans la zone de %zone_name. Celle-là était vraiment coriace !', 'Endlich %quest_link in %zone_name abgegeben. Die war echt hart!', '终于在%zone_name交了%quest_link任务,这任务真难!', '', '', '', ''); +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 (224, 'broadcast_quest_turned_in', 'That’s it, %quest_link turned in! Now to collect the reward!', 0, 0, '', 'C’est bon, la %quest_link est terminée ! Maintenant, je vais chercher ma récompense !', 'Geschafft, %quest_link abgegeben! Jetzt die Belohnung abholen!', '搞定了,%quest_link交掉了!现在去领赏!', '', '', '', ''); +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 (225, 'broadcast_quest_turned_in', 'Finished %quest_link! Now time to turn it in and move on.', 0, 0, '', 'J’ai fini la %quest_link ! Maintenant, il est temps de la remettre et de passer à la suite.', '%quest_link abgeschlossen! Jetzt abgeben und weiter geht’s.', '完成了%quest_link任务!现在交掉,继续前行。', '', '', '', ''); +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 (226, 'broadcast_quest_turned_in', 'Just turned in %quest_link, feeling accomplished!', 0, 0, '', 'Je viens juste de terminer %quest_link, je me sens tellement accompli !', 'Gerade %quest_link abgegeben, fühlt sich gut an!', '刚交了%quest_link任务,感觉很有成就感!', '', '', '', ''); +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 (227, 'broadcast_quest_turned_in', 'I’ve turned in %quest_link. Let’s see what’s next!', 0, 0, '', 'J’ai remis %quest_link. Voyons ce qui nous attend ensuite!', 'Hab %quest_link abgegeben. Mal sehen, was als Nächstes kommt!', '我交了%quest_link任务,看看接下来有什么!', '', '', '', ''); +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 (228, 'broadcast_quest_turned_in', 'Just wrapped up %quest_link and turned it in. On to the next one!', 0, 0, '', 'Je viens de terminer %quest_link et de la rendre. En route pour la suite !', '%quest_link abgeschlossen und abgegeben. Weiter geht’s!', '刚搞定%quest_link任务并交了,继续下一个!', '', '', '', ''); +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 (229, 'broadcast_quest_turned_in', 'Another one in the books, %quest_link turned in', 0, 0, '', 'Encore une de faite, %quest_link remise.', 'Wieder eine erledigt, %quest_link abgegeben.', '又记上一笔,%quest_link任务交掉了!', '', '', '', ''); +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 (230, 'broadcast_quest_turned_in', 'Turned in %quest_link! Time to collect my rewards.', 0, 0, '', 'J’ai rendu la %quest_link! Il est temps de récupérer mes récompenses.', '%quest_link abgegeben! Zeit, die Belohnung einzusacken.', '交了%quest_link任务!该去领奖励了。', '', '', '', ''); +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 (231, 'broadcast_quest_turned_in', 'Completed and turned in %quest_link, what a relief!', 0, 0, '', 'J’ai terminé et remis %quest_link, quel soulagement !', '%quest_link abgeschlossen und abgegeben, was für eine Erleichterung!', '完成了%quest_link任务并交了,真是松了一口气!', '', '', '', ''); +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 (232, 'broadcast_quest_turned_in', 'That was quick! %quest_link turned in already!', 0, 0, '', 'Déjà?! %quest_link a été rendu si rapidement!', 'Das ging schnell! %quest_link schon abgegeben!', '这么快就搞定了!%quest_link任务已经交了!', '', '', '', ''); +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 (233, 'broadcast_quest_turned_in', 'Just turned in %quest_link in %zone_name. Ready for the next adventure!', 0, 0, '', 'Je viens de rendre %quest_link dans %zone_name. Je suis prêt pour la prochaine aventure !', 'Gerade %quest_link in %zone_name abgegeben. Bereit für das nächste Abenteuer!', '刚在%zone_name交了%quest_link任务,准备好迎接下一次冒险了!', '', '', '', ''); +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 (234, 'broadcast_quest_turned_in', 'Successfully turned in %quest_link. Feels like progress!', 0, 0, '', 'J’ai réussi à rendre %quest_link. On dirait que j’avance!', '%quest_link erfolgreich abgegeben. Fühlt sich nach Fortschritt an!', '成功交了%quest_link任务,感觉自己在进步!', '', '', '', ''); +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 (235, 'broadcast_quest_turned_in', 'Mission complete! %quest_link is turned in!', 0, 0, '', 'Mission accomplie! %quest_link a été rendue!', 'Mission erfüllt! %quest_link abgegeben!', '任务完成!%quest_link交掉了!', '', '', '', ''); +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 (236, 'broadcast_quest_turned_in', 'I just finished %quest_link and turned it in, on to the next one!', 0, 0, '', 'Je viens de terminer %quest_link et de le remettre, passons à la suite!', 'Gerade %quest_link abgeschlossen und abgegeben, weiter zur nächsten!', '刚完成%quest_link任务并交了,接下来继续!', '', '', '', ''); + +-- kill mob events +-- usable placeholders: +-- %victim_name +-- %zone_name +-- %area_name +-- %victim_level +-- %my_race +-- %my_class +-- %my_level +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 (237, 'broadcast_killed_normal', 'another %victim_name down', 0, 0, '', 'Encore une %victim_name tombée.', 'Noch ein %victim_name erledigt.', '又干掉了一个%victim_name!', '', '', '', 'еще одна жертва — %victim_name'); +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 (238, 'broadcast_killed_normal', 'I keep killing %victim_name, nothing to talk about', 0, 0, '', 'Je continue de tuer %victim_name, il n’y a rien à dire à ce sujet.', 'Ich töte weiter %victim_name, nichts Besonderes.', '老是杀%victim_name,没啥好说的。', '', '', '', 'Я продолжаю убивать %victim_name, нечего рассказывать'); +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 (239, 'broadcast_killed_normal', 'another %victim_name bites the dust', 0, 0, '', 'Encore une fois, %victim_name mord la poussière.', 'Noch ein %victim_name beißt ins Gras.', '又一个%victim_name倒下了!', '', '', '', 'еще один %victim_name пал'); +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 (240, 'broadcast_killed_normal', 'one less %victim_name in %zone_name', 0, 0, '', 'Une victime en moins dans la zone.', 'Ein %victim_name weniger in %zone_name.', '%zone_name少了一个%victim_name!', '', '', '', 'минус один %victim_name в %zone_name'); +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 (241, 'broadcast_killed_elite', 'Took down this elite bastard %victim_name!', 0, 0, '', 'J’ai descendu cet enfoiré d’élite %victim_name !', 'Diesen Elite-Bastard %victim_name erledigt!', '干掉了这个精英混蛋%victim_name!', '', '', '', 'Убил этого элитного ублюдка %victim_name!'); +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 (242, 'broadcast_killed_player', 'killed elite %victim_name in %zone_name', 0, 0, '', 'J’ai tué l’élite %victim_name dans la zone %zone_name', 'Elite %victim_name in %zone_name erledigt.', '在%zone_name干掉了精英%victim_name!', '', '', '', 'убил элиту %victim_name в %zone_name'); +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 (243, 'broadcast_killed_rareelite', 'Fooof, managed to take down %victim_name!', 0, 0, '', 'Oh là là, j’ai réussi à abattre %victim_name !', 'Puh, hab %victim_name endlich erledigt!', '呼,终于干掉了%victim_name!', '', '', '', 'Фух, удалось завалить %victim_name!'); +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 (244, 'broadcast_killed_worldboss', 'That was sick! Just killed %victim_name! Can tell tales now', 0, 0, '', 'C’était fou! Je viens juste de tuer %victim_name! Je pourrais raconter des histoires maintenant.', 'Das war heftig! Gerade %victim_name getötet! Jetzt gibt’s was zu erzählen.', '太爽了!刚干掉%victim_name!这下有故事可以吹了!', '', '', '', 'Это было круто! Только что убил %victim_name! Теперь есть что рассказать'); +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 (245, 'broadcast_killed_rare', 'Yoo, I just killed %victim_name!', 0, 0, '', 'Eh, je viens juste de tuer %victim_name!', 'Yo, hab gerade %victim_name erledigt!', '嘿,刚干掉了%victim_name!', '', '', '', 'Йо, я только что убил %victim_name!'); +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 (246, 'broadcast_killed_player', 'killed rare %victim_name in %zone_name', 0, 0, '', 'J’ai tué un rare %victim_name dans %zone_name', 'Seltenen %victim_name in %zone_name erledigt.', '在%zone_name干掉了稀有怪%victim_name!', '', '', '', 'убил редкого %victim_name в %zone_name'); +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 (247, 'broadcast_killed_unknown', 'WTF did I just kill? %victim_name', 0, 0, '', 'Qu’est-ce que je viens de tuer ? %victim_name', 'WTF hab ich da gerade getötet? %victim_name', '我刚杀了啥?%victim_name?', '', '', '', 'Что я только что убил? %victim_name'); +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 (248, 'broadcast_killed_pet', 'Just killed that pet %victim_name', 0, 0, '', 'Je viens de tuer l’animal de compagnie, %victim_name.', 'Hab gerade das Pet %victim_name erledigt.', '刚干掉了那个宠物%victim_name。', '', '', '', 'Только что убил этого пета %victim_name'); +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 (249, 'broadcast_killed_player', 'Oh yeah, I just killed %victim_name', 0, 0, '', 'Oh ouais, je viens juste de tuer %victim_name', 'Oh yeah, gerade %victim_name erledigt!', '哦耶,刚干掉了%victim_name!', '', '', '', 'О да, только что убил %victim_name'); +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 (250, 'broadcast_killed_player', 'killed %victim_name in %zone_name', 0, 0, '', 'J’ai tué %victim_name dans %zone_name.', '%victim_name in %zone_name getötet.', '在%zone_name干掉了%victim_name!', '', '', '', 'убил %victim_name в %zone_name'); +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 (251, 'broadcast_killed_normal', 'another %victim_name down', 0, 0, '', 'Encore une %victim_name de moins.', 'Noch ein %victim_name erledigt.', '又干掉了一个%victim_name!', '', '', '', 'еще одна жертва — %victim_name'); +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 (252, 'broadcast_killed_normal', 'I keep killing %victim_name, nothing to talk about', 0, 0, '', 'Je continue de tuer %victim_name, rien à dire à ce sujet.', 'Ich töte weiter %victim_name, nichts Besonderes.', '一直在杀%victim_name,没啥好聊的。', '', '', '', 'Я продолжаю убивать %victim_name, нечего рассказывать'); +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 (253, 'broadcast_killed_normal', 'another %victim_name bites the dust', 0, 0, '', 'Encore une victime %victim_name qui mord la poussière.', 'Noch ein %victim_name beißt ins Gras.', '又一个%victim_name倒下了!', '', '', '', 'еще один %victim_name пал'); +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 (254, 'broadcast_killed_normal', 'one less %victim_name in %zone_name', 0, 0, '', 'Il y a une victime %victim_name de moins dans la zone.', 'Ein %victim_name weniger in %zone_name.', '%zone_name少了一个%victim_name!', '', '', '', 'минус один %victim_name в %zone_name'); +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 (255, 'broadcast_killed_normal', 'Just took down %victim_name like it’s nothing', 0, 0, '', 'Je viens de neutraliser %victim_name comme si c’était rien.', 'Hab %victim_name erledigt, als wär’s nichts.', '刚干掉%victim_name,轻松得跟玩儿似的!', '', '', '', ''); +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 (256, 'broadcast_killed_normal', '%victim_name didn’t stand a chance', 0, 0, '', '%victim_name n’avait aucune chance.', '%victim_name hatte keine Chance.', '%victim_name完全不是对手!', '', '', '', ''); +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 (257, 'broadcast_killed_normal', 'One more %victim_name out of the way', 0, 0, '', 'Encore une victime %victim_name de moins sur notre chemin', 'Noch ein %victim_name aus dem Weg geräumt.', '又一个%victim_name被我清理掉了!', '', '', '', ''); +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 (258, 'broadcast_killed_normal', '%victim_name was too easy, on to the next one', 0, 0, '', '%victim_name était trop facile, passons au suivant.', '%victim_name war zu einfach, weiter geht’s.', '%victim_name太简单了,下一只!', '', '', '', ''); +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 (259, 'broadcast_killed_normal', 'Another %victim_name defeated. Easy peasy', 0, 0, '', 'Encore une autre victime vaincue %victim_name. C’était du gâteau.', 'Noch ein %victim_name besiegt. Kinderleicht.', '又干掉了一个%victim_name,小菜一碟!', '', '', '', ''); +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 (260, 'broadcast_killed_normal', '%victim_name wasn’t tough at all', 0, 0, '', '%victim_name n’était vraiment pas du tout résistant.', '%victim_name war überhaupt nicht schwer.', '%victim_name一点都不难对付!', '', '', '', ''); +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 (261, 'broadcast_killed_normal', 'Down goes %victim_name, nothing special', 0, 0, '', '%victim_name tombe, rien de spécial', '%victim_name erledigt, nichts Besonderes.', '%victim_name倒下了,没啥特别的。', '', '', '', ''); +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 (262, 'broadcast_killed_normal', 'That was too easy, %victim_name down', 0, 0, '', 'C’était trop facile, %victim_name est hors jeu.', 'Das war zu einfach, %victim_name erledigt.', '太简单了,%victim_name倒下了!', '', '', '', ''); +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 (263, 'broadcast_killed_normal', '%victim_name dropped so fast, blink and it’s over', 0, 0, '', '%victim_name a chuté si vite, cligne des yeux et c’est déjà terminé.', '%victim_name fiel so schnell, ein Blinzeln und vorbei.', '%victim_name 倒得太快了,眨眼就完事!', '', '', '', ''); +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 (264, 'broadcast_killed_elite', 'Took down this elite %victim_name!', 0, 0, '', 'J’ai vaincu cet élite %victim_name !', 'Elite %victim_name besiegt!', '干掉了精英 %victim_name!', '', '', '', ''); +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 (265, 'broadcast_killed_elite', 'Elite %victim_name is no more', 0, 0, '', 'Elite %victim_name n’est plus.', 'Elite %victim_name gibt’s nicht mehr.', '精英 %victim_name 已被消灭!', '', '', '', ''); +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 (266, 'broadcast_killed_elite', 'Took down the elite %victim_name like a champ', 0, 0, '', 'J’ai descendu l’élite %victim_name comme un champion.', 'Hab die Elite %victim_name locker besiegt.', '像个冠军一样干掉了精英 %victim_name!', '', '', '', ''); +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 (267, 'broadcast_killed_elite', 'Elite monster %victim_name, no match for me!', 0, 0, '', 'Monstre d’élite %victim_name, pas de taille pour moi !', 'Elite-Monster %victim_name, keine Konkurrenz für mich!', '精英怪 %victim_name,根本不是我的对手!', '', '', '', ''); +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 (268, 'broadcast_killed_elite', 'Finally took down the mighty %victim_name', 0, 0, '', 'J’ai enfin vaincu le redoutable %victim_name.', 'Endlich den mächtigen %victim_name besiegt.', '终于干掉了强大的 %victim_name!', '', '', '', ''); +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 (269, 'broadcast_killed_player', 'killed elite %victim_name in %zone_name', 0, 0, '', 'J’ai tué l’élite %victim_name dans la zone %zone_name.', 'Elite %victim_name in %zone_name besiegt.', '在 %zone_name 干掉了精英 %victim_name!', '', '', '', 'убил элиту %victim_name в %zone_name'); +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 (270, 'broadcast_killed_player', 'Just got the elite %victim_name in %zone_name', 0, 0, '', 'Je viens tout juste d’obtenir l’élite %victim_name dans la région de %zone_name.', 'Gerade die Elite %victim_name in %zone_name besiegt.', '刚在 %zone_name 搞定了精英 %victim_name!', '', '', '', ''); +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 (271, 'broadcast_killed_player', 'Killed the elite %victim_name. Too easy', 0, 0, '', 'J’ai tué l’élite %victim_name. Trop facile.', 'Die Elite %victim_name erledigt. Viel zu einfach.', '干掉了精英 %victim_name,太简单了!', '', '', '', ''); +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 (272, 'broadcast_killed_player', 'Took down %victim_name in %zone_name, what a fight', 0, 0, '', 'J’ai abattu %victim_name dans %zone_name, quel combat!', '%victim_name in %zone_name erledigt, was für ein Kampf!', '在 %zone_name 干掉了 %victim_name,真是一场激战!', '', '', '', ''); +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 (273, 'broadcast_killed_player', 'Killed elite %victim_name. Guess I’m unstoppable', 0, 0, '', 'J’ai tué l’élite %victim_name. Je suis imbattable, je crois.', 'Elite %victim_name besiegt. Unaufhaltbar!', '干掉了精英 %victim_name,我简直无人能挡!', '', '', '', ''); +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 (274, 'broadcast_killed_rareelite', 'Fooof, managed to take down %victim_name!', 0, 0, '', 'Whouaa, j’ai réussi à éliminer %victim_name !', 'Fooof, es ist gelungen, %victim_name auszuschalten!', '呼,成功干掉了 %victim_name!', '', '', '', 'Фух, удалось завалить %victim_name!'); +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 (275, 'broadcast_killed_rareelite', 'Rare elite %victim_name has fallen', 0, 0, '', 'Un rare élite nommé %victim_name est tombé', 'Seltener Elite %victim_name ist gefallen.', '稀有精英 %victim_name 倒下了!', '', '', '', ''); +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 (276, 'broadcast_killed_rareelite', '%victim_name is no more. Another rare elite slain', 0, 0, '', '%victim_name n’est plus. Encore un rare élite abattu.', '%victim_name ist Geschichte. Ein weiterer seltener Elite besiegt.', '%victim_name 完了,又一个稀有精英被我干掉!', '', '', '', ''); +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 (277, 'broadcast_killed_rareelite', 'Rare elite %victim_name down. I’m on fire!', 0, 0, '', 'Rare elite %victim_name abattu. Je suis en feu!', 'Seltener Elite %victim_name erledigt. Läuft bei mir!', '稀有精英 %victim_name 被我干掉了,我现在状态火热!', '', '', '', ''); +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 (278, 'broadcast_killed_rareelite', 'I just killed the rare elite %victim_name', 0, 0, '', 'Je viens de vaincre l’élite rare %%victim_name.', 'Gerade den seltenen Elite %victim_name erledigt.', '我刚干掉了稀有精英 %victim_name!', '', '', '', ''); +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 (279, 'broadcast_killed_worldboss', 'That was awesome! Just killed %victim_name! What a battle', 0, 0, '', 'C’était incroyable! Je viens juste de tuer %victim_name! Quelle bataille!', 'Das war der Hammer! Gerade %victim_name besiegt! Was für ein Kampf.', '太棒了!刚干掉了 %victim_name!真是场精彩的战斗!', '', '', '', ''); +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 (280, 'broadcast_killed_worldboss', 'World boss %victim_name is down! That was epic', 0, 0, '', 'Le boss mondial %victim_name est tombé ! C’était épique.', 'Weltboss %victim_name ist gefallen! Das war episch.', '世界首领 %victim_name 倒下了!这场战斗太史诗了!', '', '', '', ''); +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 (281, 'broadcast_killed_worldboss', 'I’ve slain the world boss %victim_name. Let’s celebrate!', 0, 0, '', 'J’ai abattu le boss mondial %victim_name. On va fêter ça !', 'Weltboss %victim_name erledigt! Das muss gefeiert werden!', '我干掉了世界首领 %victim_name,来庆祝一下吧!', '', '', '', ''); +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 (282, 'broadcast_killed_worldboss', 'Killed %victim_name! That world boss was no joke!', 0, 0, '', 'J’ai tué %victim_name! Ce world boss était vraiment costaud!', '%victim_name besiegt! Dieser Weltboss hatte es echt in sich!', '干掉了 %victim_name!这个世界首领可不是开玩笑的!', '', '', '', ''); +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 (283, 'broadcast_killed_worldboss', 'Just killed %victim_name, that was legendary', 0, 0, '', 'Je viens juste de tuer %victim_name, c’était légendaire!', 'Gerade %victim_name erledigt, das war legendär!', '刚干掉了 %victim_name,简直是传奇一战!', '', '', '', ''); +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 (284, 'broadcast_killed_rare', 'Yoo, I just killed %victim_name!', 0, 0, '', 'Eh, je viens juste de tuer %victim_name!', 'Yo, hab gerade %victim_name erledigt!', '嘿,我刚干掉了 %victim_name!', '', '', '', 'Йо, я только что убил %victim_name!'); +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 (285, 'broadcast_killed_rare', 'Rare %victim_name down. That was a fun fight', 0, 0, '', 'Rare %victim_name down. C’était un combat amusant.', 'Seltener %victim_name besiegt. Das hat Spaß gemacht!', '稀有怪 %victim_name 倒下了,这场战斗真有趣!', '', '', '', ''); +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 (286, 'broadcast_killed_rare', 'I just killed the rare %victim_name', 0, 0, '', 'Je viens de tuer le rare %victim_name.', 'Gerade den seltenen %victim_name erledigt.', '我刚干掉了稀有怪 %victim_name!', '', '', '', ''); +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 (287, 'broadcast_killed_rare', 'Rare %victim_name defeated in %zone_name', 0, 0, '', 'Rare %victim_name vaincu dans %zone_name', 'Seltener %victim_name in %zone_name besiegt.', '在 %zone_name 击败了稀有怪 %victim_name!', '', '', '', ''); +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 (288, 'broadcast_killed_rare', 'Just killed rare %victim_name in %zone_name. That was quick!', 0, 0, '', 'Je viens de tuer le rare %victim_name dans %zone_name. Ça a été rapide!', 'Seltenen %victim_name in %zone_name erledigt. Das ging fix!', '刚在 %zone_name 干掉了稀有怪 %victim_name,速度真快!', '', '', '', ''); +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 (289, 'broadcast_killed_player', 'killed rare %victim_name in %zone_name', 0, 0, '', 'J’ai tué un %victim_name rare dans la zone de %zone_name.', 'Seltenen %victim_name in %zone_name besiegt.', '在 %zone_name 干掉了稀有怪 %victim_name!', '', '', '', 'убил редкого %victim_name в %zone_name'); +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 (290, 'broadcast_killed_player', 'Got the rare %victim_name in %zone_name', 0, 0, '', 'J’ai trouvé le rare %victim_name dans %zone_name', 'Den seltenen %victim_name in %zone_name erledigt.', '在 %zone_name 搞定了稀有怪 %victim_name!', '', '', '', ''); +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 (291, 'broadcast_killed_player', 'I killed %victim_name in %zone_name. That felt good', 0, 0, '', 'J’ai tué %victim_name dans %zone_name. Ça m’a fait du bien.', 'Hab %victim_name in %zone_name besiegt. Das hat gut getan.', '在 %zone_name 干掉了 %victim_name,感觉真爽!', '', '', '', ''); +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 (292, 'broadcast_killed_player', 'Took down %victim_name in %zone_name. They didn’t stand a chance', 0, 0, '', 'J’ai vaincu %victim_name dans %zone_name. Ils n’avaient aucune chance.', '%victim_name in %zone_name besiegt. Hatte keine Chance.', '在 %zone_name 干掉了 %victim_name,他们毫无还手之力!', '', '', '', ''); +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 (293, 'broadcast_killed_player', 'Just killed %victim_name in %zone_name, easy', 0, 0, '', 'Je viens de tuer %victim_name à %zone_name, c’était facile', 'Gerade %victim_name in %zone_name erledigt, war easy.', '刚在 %zone_name 干掉了 %victim_name,太轻松了!', '', '', '', ''); +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 (294, 'broadcast_killed_unknown', 'What did I just kill? %victim_name', 0, 0, '', 'Qui est-ce que je viens de tuer? %victim_name', 'Was hab ich da gerade getötet? %victim_name', '我刚杀了啥?%victim_name?', '', '', '', ''); +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 (295, 'broadcast_killed_unknown', 'What kind of %victim_name is that? Never seen anything like it', 0, 0, '', 'Quel genre de %victim_name est-ce ça ? Je n’ai jamais rien vu de tel auparavant.', 'Was für ein %victim_name ist das? Noch nie sowas gesehen.', '这 %victim_name 是啥玩意儿?从没见过这样的!', '', '', '', ''); +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 (296, 'broadcast_killed_unknown', 'Just killed something strange, %victim_name', 0, 0, '', 'Je viens de tuer quelque chose d’étrange, %victim_name', 'Hab gerade was Seltsames getötet, %victim_name.', '刚干掉了个奇怪的东西,%victim_name!', '', '', '', ''); +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 (297, 'broadcast_killed_unknown', '%victim_name was weird, but down they go', 0, 0, '', '%victim_name était bizarre, mais au sol ils vont', '%victim_name war seltsam, aber erledigt ist erledigt.', '%victim_name 怪怪的,不过还是被我干掉了!', '', '', '', ''); +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 (298, 'broadcast_killed_pet', 'Just defeated %victim_name', 0, 0, '', 'Je viens juste de vaincre %victim_name.', 'Gerade %victim_name besiegt.', '刚击败了 %victim_name!', '', '', '', ''); +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 (299, 'broadcast_killed_pet', 'Goodbye, %victim_name. You were just a pet', 0, 0, '', 'Au revoir, %victim_name. Tu étais qu’un animal de compagnie.', 'Tschüss, %victim_name. Warst halt nur ein Pet.', '再见了,%victim_name,你不过是个宠物而已。', '', '', '', ''); +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 (300, 'broadcast_killed_pet', 'Just took down the pet %victim_name. That was unexpected', 0, 0, '', 'Je viens de m’occuper de l’animal de compagnie %victim_name. Ça c’était inattendu.', 'Gerade das Pet %victim_name erledigt. Das kam unerwartet.', '刚干掉了宠物 %victim_name,真没想到!', '', '', '', ''); +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 (301, 'broadcast_killed_pet', 'Down goes %victim_name. Better luck next time, pet', 0, 0, '', '%victim_name mord la poussière. Meilleure chance la prochaine fois, mon pote.', '%victim_name erledigt. Nächstes Mal mehr Glück, Pet.', '%victim_name 倒下了,下次好运吧,小宠物!', '', '', '', ''); + +-- levelup events +-- usable placeholders: +-- %zone_name +-- %area_name +-- %my_class +-- %my_race +-- %my_level +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 (302, 'broadcast_levelup_generic', '%my_level Ding!', 0, 0, '', '%my_level Ding !', '%my_level Ding!', '%my_level 级,升级啦!', '', '', '', ''); +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 (303, 'broadcast_levelup_generic', 'Yess, I am level %my_level!', 0, 0, '', 'Oui, je suis au niveau %my_level !', 'Ja, ich bin Level %my_level!', '耶,我到 %my_level 级了!', '', '', '', 'Да, я теперь %my_level уровень!'); +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 (304, 'broadcast_levelup_generic', 'I just leveled up', 0, 0, '', 'Je viens de monter de niveau', 'Hab gerade ein Level-Up bekommen!', '我刚升级了!', '', '', '', 'Я только что повысил уровень'); +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 (305, 'broadcast_levelup_10x', 'I am level %my_level!!!', 0, 0, '', 'Je suis au niveau %my_level !!!', 'Ich bin Level %my_level!!!', '我到 %my_level 级了!!!', '', '', '', 'Я %my_level уровень!!!'); +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 (306, 'broadcast_levelup_10x', 'getting stronger, already level %my_level!!!', 0, 0, '', 'Je deviens de plus en plus fort, je suis déjà au niveau %my_level !!!', 'Werde stärker, schon Level %my_level!!!', '越来越强了,已经到 %my_level 级!!!', '', '', '', 'Становлюсь сильнее, уже %my_level уровень!!!'); +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 (307, 'broadcast_levelup_10x', 'Just reached level %my_level!!!', 0, 0, '', 'Je viens d’atteindre le niveau %my_level !!!', 'Gerade Level %my_level erreicht!!!', '刚达到 %my_level 级!!!', '', '', '', 'Только что достиг %my_level уровня!!!'); +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 (308, 'broadcast_levelup_max_level', 'OMG, finally level %my_level!!!', 0, 0, '', 'OMG, enfin le niveau %my_level!!!', 'OMG, endlich Level %my_level!!!', '天啊,终于到 %my_level 级了!!!', '', '', '', 'ОГО, наконец-то %my_level уровень!!!'); +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 (309, 'broadcast_levelup_max_level', '%my_level!!! can do endgame content now', 0, 0, '', '%my_level!!! je peux me permettre de faire du contenu de fin de jeu maintenant.', '%my_level!!! Endgame, ich komme!', '%my_level 级!!!现在可以挑战终极内容了!', '', '', '', '%my_level!!! теперь могу заниматься эндгейм-контентом'); +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 (310, 'broadcast_levelup_max_level', 'fresh new level %my_level %my_class!!!', 0, 0, '', 'Nouveau niveau %my_level %my_class!!!', 'Frisch auf Level %my_level als %my_class!!!', '全新等级 %my_level 的 %my_class!!!', '', '', '', 'свежий новый уровень %my_level %my_class!!!'); +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 (311, 'broadcast_levelup_max_level', 'one more level %my_level %my_race %my_class!', 0, 0, '', 'Encore un niveau de plus %my_level pour ma race %my_race et ma classe %my_class!', 'Noch ein Level %my_level für meinen %my_race %my_class!', '又升了一级,%my_level 级的 %my_race %my_class!', '', '', '', 'еще один уровень %my_level %my_race %my_class!'); +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 (312, 'broadcast_levelup_generic', 'Ding! Another level up!', 0, 0, '', 'Ding! Encore un niveau de gagné!', 'Ding! Wieder ein Level-Up!', '叮!又升了一级!', '', '', '', ''); +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 (313, 'broadcast_levelup_generic', 'I’m officially level %my_level now!', 0, 0, '', 'Je suis maintenant officiellement au niveau %my_level !', 'Ich bin jetzt offiziell Level %my_level!', '我现在正式达到 %my_level 级了!', '', '', '', ''); +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 (314, 'broadcast_levelup_generic', 'Level %my_level, feeling stronger already!', 0, 0, '', 'Niveau %my_level, je me sens déjà plus fort!', 'Level %my_level, fühle mich jetzt schon stärker!', '%my_level 级,感觉已经更强了!', '', '', '', ''); +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 (315, 'broadcast_levelup_generic', 'Up I go! Level %my_level reached', 0, 0, '', 'Je monte ! Niveau %my_level atteint', 'Auf geht’s! Level %my_level erreicht.', '我升级了!达到 %my_level 级!', '', '', '', ''); +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 (316, 'broadcast_levelup_generic', 'That was quick, level %my_level already!', 0, 0, '', 'Déjà niveau %my_level ! Ça se passe bien !', 'Das ging schnell, schon Level %my_level!', '这么快,已经到 %my_level 级了!', '', '', '', ''); +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 (317, 'broadcast_levelup_generic', 'Just hit level %my_level, let’s do this!', 0, 0, '', 'Je viens d’atteindre le niveau %my_level, allons-y !', 'Gerade Level %my_level erreicht, los geht’s!', '刚达到 %my_level 级,来吧,继续干!', '', '', '', ''); +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 (318, 'broadcast_levelup_generic', 'Level %my_level, on to bigger things!', 0, 0, '', 'Niveau %my_level, passons à des choses plus grandes !', 'Level %my_level, jetzt kommt das große Zeug!', '%my_level 级,接下来是更大的挑战!', '', '', '', ''); +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 (319, 'broadcast_levelup_generic', 'Level %my_level, I’m on fire now!', 0, 0, '', 'Niveau %my_level, je suis en feu maintenant !', 'Level %my_level, jetzt geht’s ab!', '%my_level 级,现在我状态火热!', '', '', '', ''); +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 (320, 'broadcast_levelup_generic', 'Level %my_level complete, onward!', 0, 0, '', 'Niveau %my_level terminé, en avant !', 'Level %my_level abgeschlossen, weiter geht’s!', '%my_level 级完成,继续前进!', '', '', '', ''); +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 (321, 'broadcast_levelup_generic', 'I’m now level %my_level, what’s next?', 0, 0, '', 'Je suis maintenant niveau %my_level, qu’est-ce qui suit?', 'Jetzt bin ich Level %my_level, was kommt als Nächstes?', '我现在是 %my_level 级,接下来干啥?', '', '', '', ''); +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 (322, 'broadcast_levelup_10x', 'Level %my_level!!! It’s happening!', 0, 0, '', 'Niveau %my_level!!! C’est en train de se passer!', 'Level %my_level!!! Es passiert wirklich!', '%my_level 级!!!这就发生了!', '', '', '', ''); +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 (323, 'broadcast_levelup_10x', 'Just hit level %my_level, this feels amazing!', 0, 0, '', 'Je viens d’atteindre le niveau %my_level, c’est incroyable !', 'Gerade Level %my_level erreicht, fühlt sich großartig an!', '刚达到 %my_level 级,感觉太棒了!', '', '', '', ''); +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 (324, 'broadcast_levelup_10x', 'Level %my_level and I’m only getting started!', 0, 0, '', 'Niveau %my_level et je ne fais que commencer!', 'Level %my_level und ich fange gerade erst an!', '%my_level 级,我才刚开始呢!', '', '', '', ''); +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 (325, 'broadcast_levelup_10x', 'Wow, level %my_level already, I’m unstoppable!', 0, 0, '', 'Wow, niveau %my_level déjà, je suis imbattable!', 'Wow, schon Level %my_level, ich bin unaufhaltsam!', '哇,已经到 %my_level 级了,我无人能挡!', '', '', '', ''); +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 (326, 'broadcast_levelup_10x', 'Reaching new heights at level %my_level!!!', 0, 0, '', 'Atteignant de nouveaux sommets au niveau %my_level !!!', 'Neue Höhen erreicht auf Level %my_level!!!', '在 %my_level 级达到了新的高度!!!', '', '', '', ''); +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 (327, 'broadcast_levelup_10x', 'Level %my_level and still pushing forward!', 0, 0, '', 'Niveau %my_level et je continue d’avancer à fond !', 'Level %my_level und immer noch auf dem Vormarsch!', '%my_level 级,我还在继续前进!', '', '', '', ''); +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 (328, 'broadcast_levelup_10x', 'Level %my_level, I’m too strong now!', 0, 0, '', 'Niveau %my_level, je suis trop fort maintenant!', 'Level %my_level, jetzt bin ich zu stark!', '达到%my_level级,我现在强得不行了!', '', '', '', ''); +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 (329, 'broadcast_levelup_10x', 'Hitting %my_level, it feels so good!', 0, 0, '', 'Atteindre %my_level, ça fait tellement du bien !', '%my_level erreicht, fühlt sich großartig an!', '升到%my_level级,感觉真是太爽了!', '', '', '', ''); +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 (330, 'broadcast_levelup_10x', 'I’m level %my_level now! Let’s go!', 0, 0, '', 'Je suis au niveau %my_level maintenant ! Allez, c’est parti !', 'Ich bin jetzt Level %my_level! Auf geht’s!', '我现在是%my_level级了!咱们走起!', '', '', '', ''); +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 (331, 'broadcast_levelup_10x', 'Level %my_level, still a lot to go!', 0, 0, '', 'Niveau %my_level, il me reste encore beaucoup de chemin à parcourir !', 'Level %my_level, noch viel zu tun!', '升到%my_level级,还有很长的路要走啊!', '', '', '', ''); +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 (332, 'broadcast_levelup_max_level', 'Finally hit level %my_level, I can do anything!', 0, 0, '', 'J’ai enfin atteint le niveau %my_level, je peux tout faire !', 'Endlich Level %my_level erreicht, jetzt geht alles!', '终于达到%my_level级了,我无所不能!', '', '', '', ''); +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 (333, 'broadcast_levelup_max_level', 'Max level %my_level, endgame here I come!', 0, 0, '', 'Niveau maximum %my_level atteint, je me rapproche de la fin du jeu !', 'Max-Level %my_level erreicht, Endgame ich komme!', '满级%my_level,终极挑战我来了!', '', '', '', ''); +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 (334, 'broadcast_levelup_max_level', 'Level %my_level! Ready for the endgame!', 0, 0, '', 'Niveau %my_level ! Prêt pour la phase finale !', 'Level %my_level! Bereit fürs Endgame!', '%my_level级达成!准备好迎接终极内容了!', '', '', '', ''); +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 (335, 'broadcast_levelup_max_level', 'Endgame unlocked at level %my_level, bring it on!', 0, 0, '', 'Fin du jeu débloquée au niveau %my_level, ça va déménager !', 'Endgame freigeschaltet auf Level %my_level, jetzt geht’s los!', '%my_level级解锁终极内容,来吧,挑战我!', '', '', '', ''); +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 (336, 'broadcast_levelup_max_level', 'I’ve reached level %my_level, time to shine!', 0, 0, '', 'J’ai atteint le niveau %my_level, c’est le moment de briller!', 'Level %my_level erreicht, Zeit zu glänzen!', '我达到%my_level级了,是时候大放异彩了!', '', '', '', ''); +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 (337, 'broadcast_levelup_max_level', 'Level %my_level, let’s do some endgame raiding!', 0, 0, '', 'Niveau %my_level, allons faire un raid de fin de jeu!', 'Level %my_level, Zeit für Endgame-Raids!', '%my_level级了,咱去刷终极团队副本吧!', '', '', '', ''); +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 (338, 'broadcast_levelup_max_level', 'At level %my_level, nothing can stop me now!', 0, 0, '', 'Au niveau %my_level, rien ne peut m’arrêter maintenant !', 'Auf Level %my_level kann mich nichts mehr aufhalten!', '在%my_level级,谁也挡不住我了!', '', '', '', ''); +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 (339, 'broadcast_levelup_max_level', 'Level %my_level, all systems go for high-level content!', 0, 0, '', 'Niveau %my_level, toutes les systèmes sont prêts pour du contenu de haut niveau !', 'Level %my_level, alle Systeme bereit für High-Level-Content!', '%my_level级,一切就绪,准备迎接高难度内容!', '', '', '', ''); +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 (340, 'broadcast_levelup_max_level', 'Yes! Level %my_level, %my_class ready for everything!', 0, 0, '', 'Oui! Niveau %my_level, %my_class prêt pour tout!', 'Ja! Level %my_level, %my_class bereit für alles!', '太棒了!%my_level级,我的%my_class准备好面对一切了!', '', '', '', ''); +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 (341, 'broadcast_levelup_max_level', 'Level %my_level, it’s time to take on the world!', 0, 0, '', 'Niveau %my_level, c’est le moment de conquérir le monde!', 'Level %my_level, jetzt wird die Welt erobert!', '%my_level级,是时候征服这个世界了!', '', '', '', ''); +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 (342, 'broadcast_levelup_max_level', 'Reached level %my_level, let’s take on those elite bosses!', 0, 0, '', 'J’ai atteint le niveau %my_level, allons affronter ces boss d’élite!', 'Level %my_level erreicht, Zeit, die Elitebosse anzugehen!', '达到%my_level级了,咱们去挑战那些精英首领吧!', '', '', '', ''); +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 (343, 'broadcast_levelup_max_level', 'Now I’m %my_level, the real adventure begins!', 0, 0, '', 'Maintenant que je suis %my_level, la vraie aventure commence!', 'Jetzt bin ich %my_level, das wahre Abenteuer beginnt!', '现在我是%my_level级,真正的冒险才刚刚开始!', '', '', '', ''); +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 (344, 'broadcast_levelup_max_level', 'Level %my_level! Time for some serious action!', 0, 0, '', 'Niveau %my_level ! Il est temps d’entrer en action sérieusement !', 'Level %my_level! Jetzt wird’s ernst!', '%my_level级!是时候来点硬核行动了!', '', '', '', ''); +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 (345, 'broadcast_levelup_max_level', 'Level %my_level and still growing stronger!', 0, 0, '', 'Niveau %my_level et je continue de devenir de plus en plus fort !', 'Level %my_level und werde immer stärker!', '%my_level级了,而且我还会变得更强!', '', '', '', ''); +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 (346, 'broadcast_levelup_max_level', 'Finally at level %my_level! Let’s show off what I can do!', 0, 0, '', 'Enfin, je suis au niveau %my_level ! Il est temps de montrer de quoi je suis capable !', 'Endlich Level %my_level! Zeit, zu zeigen, was ich draufhabe!', '终于到%my_level级了!让大家看看我的厉害!', '', '', '', ''); +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 (347, 'broadcast_levelup_max_level', 'Level %my_level is here! I’m ready for the big leagues!', 0, 0, '', 'Le niveau %my_level est arrivé! Je suis prêt pour les grands matchs!', 'Level %my_level erreicht! Bereit für die großen Herausforderungen!', '%my_level级来了!我准备好迎接大挑战了!', '', '', '', ''); +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 (348, 'broadcast_levelup_max_level', 'Just hit %my_level, get ready for the real challenges!', 0, 0, '', 'Je viens d’atteindre mon niveau %my_level, je suis prêt pour affronter de vrais défis !', 'Gerade %my_level erreicht, jetzt kommen die echten Herausforderungen!', '刚到%my_level级,准备好迎接真正的挑战吧!', '', '', '', ''); +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 (349, 'broadcast_levelup_max_level', 'Level %my_level complete, it’s time for the epic content!', 0, 0, '', 'Niveau %my_level complet, il est temps pour le contenu épique !', 'Level %my_level abgeschlossen, jetzt kommt das epische Zeug!', '%my_level级达成,是时候体验史诗内容了!', '', '', '', ''); +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 (350, 'broadcast_levelup_max_level', 'Fresh out of %my_level! Ready for endgame dungeons!', 0, 0, '', 'Je viens enfin d’atteindre %my_level ! Prêt pour les donjons de fin de jeu !', 'Frisch Level %my_level erreicht! Bereit für Endgame-Dungeons!', '刚到%my_level级!准备好挑战终极地下城了!', '', '', '', ''); +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 (351, 'broadcast_levelup_max_level', 'Now that I’m level %my_level, nothing is beyond my reach!', 0, 0, '', 'Maintenant que je suis au niveau %my_level, rien ne peut m’arrêter !', 'Jetzt, wo ich Level %my_level bin, ist nichts mehr unmöglich!', '现在我是%my_level级,没有什么是我做不到的!', '', '', '', ''); +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 (352, 'broadcast_levelup_max_level', 'It’s official! Level %my_level, time to dominate!', 0, 0, '', 'C’est officiel ! Niveau %my_level, c’est le moment de tout déchirer !', 'Es ist offiziell! Level %my_level, Zeit zu dominieren!', '正式宣布!%my_level级,是时候称霸一方了!', '', '', '', ''); +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 (353, 'broadcast_levelup_max_level', 'Made it to level %my_level! Time to make my mark on the world!', 0, 0, '', 'J’ai atteint le niveau %my_level! Le moment de laisser ma trace dans le monde est enfin arrivé!', 'Level %my_level erreicht! Zeit, meinen Fußabdruck in der Welt zu hinterlassen!', '达到%my_level级了!是时候在这个世界上留下我的印记了!', '', '', '', ''); +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 (354, 'broadcast_levelup_max_level', 'Level %my_level unlocked! The real fun begins now!', 0, 0, '', 'Niveau %my_level débloqué! Maintenant, les choses sérieuses commencent!', 'Level %my_level freigeschaltet! Jetzt geht der Spaß erst richtig los!', '%my_level级解锁!真正的乐趣现在才开始!', '', '', '', ''); +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 (355, 'broadcast_levelup_max_level', 'Level %my_level, and the world is my playground!', 0, 0, '', 'Niveau %my_level, et le monde est mon terrain de jeu!', 'Level %my_level, die Welt ist mein Spielplatz!', '%my_level级,这个世界就是我的游乐场!', '', '', '', ''); +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 (356, 'broadcast_levelup_max_level', 'Level %my_level, ready to show the world my power!', 0, 0, '', 'Niveau %my_level, prêt à montrer au monde ma puissance !', 'Level %my_level, bereit, der Welt meine Macht zu zeigen!', '%my_level级,准备好向世界展示我的力量了!', '', '', '', ''); +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 (357, 'broadcast_levelup_max_level', 'Just hit %my_level, I’m going all in now!', 0, 0, '', 'Je viens d’atteindre %my_level, je me lance à fond maintenant !', 'Gerade %my_level erreicht, jetzt gebe ich alles!', '刚到%my_level级,现在我要全力以赴了!', '', '', '', ''); +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 (358, 'broadcast_levelup_max_level', 'Level %my_level, I can finally take on everything!', 0, 0, '', 'Niveau %my_level, je peux enfin tout affronter !', 'Level %my_level, endlich kann ich alles in Angriff nehmen!', '%my_level级,我终于能挑战一切了!', '', '', '', ''); +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 (359, 'broadcast_levelup_max_level', 'Level %my_level, I’m feeling unstoppable!', 0, 0, '', 'Niveau %my_level, je me sens imbattable!', 'Level %my_level, fühle mich unaufhaltsam!', '%my_level级,我感觉自己势不可挡!', '', '', '', ''); +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 (360, 'broadcast_levelup_max_level', 'Just reached level %my_level, can’t wait to dive into the endgame!', 0, 0, '', 'Je viens d’atteindre le niveau %my_level, j’ai hâte de me plonger dans le contenu de fin de jeu!', 'Gerade Level %my_level erreicht, kann es kaum erwarten, ins Endgame einzutauchen!', '刚达到%my_level级,迫不及待要投入终极内容了!', '', '', '', ''); + +-- guild +-- usable placeholders: +-- %other_name +-- %other_class +-- %other_race +-- %other_level +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 (361, 'broadcast_guild_promotion', 'Good job %other_name. You deserved this.', 0, 0, '', 'Bien joué %other_name. Tu l’as bien mérité.', 'Gut gemacht %other_name. Das hast du dir verdient.', '干得好,%other_name,你当之无愧!', '', '', '', 'Молодец %other_name. Ты это заслужил.'); +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 (362, 'broadcast_guild_demotion', 'That was awful %other_name. I hate to do this but...', 0, 0, '', 'Désolé %other_name, mais ça a été horrible. Je déteste devoir faire ça, mais...', 'Das war echt schlecht %other_name. Ich hasse es, das zu tun, aber...', '太糟糕了,%other_name,我也不想这么做,但是...', '', '', '', 'Это было ужасно %other_name. Не хотел этого делать, но...'); +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 (363, 'broadcast_guild_promotion', 'Congrats %other_name, you’ve earned this promotion!', 0, 0, '', 'Félicitations %other_name, tu as mérité cette promotion !', 'Glückwunsch %other_name, du hast dir diese Beförderung verdient!', '恭喜你,%other_name,这晋升是你应得的!', '', '', '', ''); +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 (364, 'broadcast_guild_promotion', 'Well deserved %other_name, welcome to the next level!', 0, 0, '', 'Bien mérité %other_name, bienvenue au niveau suivant !', 'Verdient %other_name, willkommen auf der nächsten Stufe!', '名副其实,%other_name,欢迎进入下一阶段!', '', '', '', ''); +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 (365, 'broadcast_guild_promotion', '%other_name is leveling up! Congratulations on the promotion!', 0, 0, '', '%other_name progresse dans sa carrière ! Félicitations pour la promotion !', '%other_name steigt auf! Glückwunsch zur Beförderung!', '%other_name升职了!恭喜晋升!', '', '', '', ''); +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 (366, 'broadcast_guild_promotion', 'Promotion time! %other_name, you’ve earned this one!', 0, 0, '', 'Promotion time! %other_name, tu l’as bien mérité !', 'Beförderungszeit! %other_name, das hast du dir verdient!', '晋升时刻!%other_name,你当之无愧!', '', '', '', ''); +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 (367, 'broadcast_guild_promotion', 'A new role for %other_name! Well done, keep it up!', 0, 0, '', 'Une nouvelle fonction pour %other_name ! Bravo, continue comme ça !', 'Eine neue Rolle für %other_name! Gut gemacht, weiter so!', '%other_name获得了新角色!干得漂亮,继续加油!', '', '', '', ''); +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 (368, 'broadcast_guild_promotion', 'Huge congrats to %other_name, you’ve earned a well-deserved promotion!', 0, 0, '', '%other_name, félicitations pour ta super promotion, tu la mérites amplement!', 'Große Glückwünsche an %other_name, du hast dir diese Beförderung verdient!', '热烈祝贺%other_name,你实至名归地获得了晋升!', '', '', '', ''); +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 (369, 'broadcast_guild_promotion', 'Let’s all give a round of applause to %other_name, for the promotion!', 0, 0, '', 'Donnons tous un grand round d’applaudissements à %other_name pour sa promotion!', 'Lasst uns %other_name für die Beförderung applaudieren!', '让我们为%other_name的晋升鼓掌庆祝吧!', '', '', '', ''); +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 (370, 'broadcast_guild_promotion', 'Cheers to %other_name on the promotion! Keep shining!', 0, 0, '', 'Salut à %other_name pour sa promotion! Continue de briller!', 'Prost auf %other_name zur Beförderung! Bleib am Ball!', '为%other_name的晋升干杯!继续发光发热!', '', '', '', ''); +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 (371, 'broadcast_guild_promotion', 'Congrats %other_name, you’re moving up! Well done!', 0, 0, '', 'Félicitations %other_name, tu progresses dans ton parcours ! Bravo !', 'Glückwunsch %other_name, du steigst auf! Gut gemacht!', '恭喜%other_name,你更进一步了!干得好!', '', '', '', ''); +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 (372, 'broadcast_guild_promotion', 'Another step up for %other_name! Congratulations!', 0, 0, '', 'Encore une promotion pour %other_name ! Félicitations !', 'Noch ein Aufstieg für %other_name! Glückwunsch!', '%other_name又迈上新台阶!恭喜!', '', '', '', ''); +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 (373, 'broadcast_guild_demotion', 'Tough decision, but %other_name, you’ve been demoted. Time to step up!', 0, 0, '', 'Décision difficile, mais %other_name, tu as été rétrogradé. C’est le moment de te ressaisir!', 'Schwere Entscheidung, aber %other_name, du wurdest degradiert. Zeit, dich zu beweisen!', '艰难的决定,%other_name,你被降职了。加把劲吧!', '', '', '', ''); +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 (374, 'broadcast_guild_demotion', 'Sorry %other_name, but it’s time for a demotion. Hope you come back stronger!', 0, 0, '', 'Désolé %other_name, mais c’est l’heure d’une rétrogradation. J’espère que tu reviendras plus fort !', 'Tut mir leid %other_name, aber es ist Zeit für eine Degradierung. Hoffe, du kommst stärker zurück!', '抱歉,%other_name,现在得降职了。希望你能更强地回来!', '', '', '', ''); +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 (375, 'broadcast_guild_demotion', 'Unfortunately, %other_name, it’s a demotion this time. You’ll get \'em next time!', 0, 0, '', '', 'Leider, %other_name, handelt es sich diesmal um eine Degradierung. Das nächste Mal kriegst du sie!', '遗憾的是,%other_name,这次是降职。下次再努力吧!', '', '', '', ''); +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 (376, 'broadcast_guild_demotion', 'A hard decision, but %other_name, you’ve been demoted. Time to grind back up!', 0, 0, '', 'Une décision difficile, mais %other_name, tu as été rétrogradé. Il est temps de remonter la pente !', 'Schwere Entscheidung, aber %other_name, du wurdest degradiert. Zeit, dich wieder hochzuarbeiten!', '艰难的决定,%other_name,你被降职了。是时候努力爬回去了!', '', '', '', ''); +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 (377, 'broadcast_guild_demotion', 'We hate to see it, but %other_name, it’s a demotion for now.', 0, 0, '', 'C’est toujours difficile à accepter, %other_name, mais pour le moment, c’est une rétrogradation.', 'Es ist nie schön, aber %other_name, du wurdest degradiert – vorerst.', '我们也不想看到,%other_name,但现在是降职。', '', '', '', ''); +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 (378, 'broadcast_guild_demotion', 'Sorry %other_name, your rank has been lowered. Let’s work harder together!', 0, 0, '', 'Désolé %other_name, ton rang a été abaissé. On va devoir redoubler d’efforts ensemble !', 'Tut mir leid %other_name, dein Rang wurde gesenkt. Lass uns gemeinsam härter arbeiten!', '对不起,%other_name,你的等级被降低了。咱们一起更努力吧!', '', '', '', ''); +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 (379, 'broadcast_guild_demotion', 'A demotion for %other_name... Time to focus and rise back up!', 0, 0, '', 'Une rétrogradation pour %other_name... Il est temps de se concentrer et de remonter la pente!', 'Eine Degradierung für %other_name... Zeit, sich zu fokussieren und wieder aufzusteigen!', '%other_name被降职了...是时候集中精力再爬上去了!', '', '', '', ''); +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 (380, 'broadcast_guild_demotion', 'Not what we wanted, but %other_name, you’ve been demoted. Learn and come back stronger!', 0, 0, '', 'Pas ce que nous voulions, mais %other_name, tu as été rétrogradé. Apprends et reviens plus fort !', 'Nicht das, was wir wollten, aber %other_name, du wurdest degradiert. Lern daraus und komm stärker zurück!', '这不是我们想要的,%other_name,你被降职了。吸取教训,变得更强吧!', '', '', '', ''); +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 (381, 'broadcast_guild_demotion', 'A tough moment for %other_name, but we know you can bounce back from this demotion!', 0, 0, '', 'Un moment difficile pour %other_name, mais on sait que tu peux rebondir après cette rétrogradation!', 'Ein harter Moment für %other_name, aber wir wissen, dass du dich von dieser Degradierung erholen kannst!', '对%other_name来说是艰难的一刻,但我们相信你能从这次降职中恢复!', '', '', '', ''); +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 (382, 'broadcast_guild_demotion', 'Sorry %other_name, but a demotion has been applied. It’s time for improvement!', 0, 0, '', 'Désolé %other_name, mais une rétrogradation a été appliquée. Il est temps de s’améliorer !', 'Tut mir leid %other_name, aber du wurdest degradiert. Jetzt ist es Zeit, sich zu verbessern!', '抱歉,%other_name,你被降职了。是时候改进自己了!', '', '', '', ''); +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 (383, 'broadcast_guild_demotion', 'We didn’t want this for %other_name, but a demotion has occurred. Time to get better!', 0, 0, '', 'On n’a pas voulu cela pour %other_name, mais une rétrogradation a eu lieu. Il est temps de s’améliorer !', 'Das wollten wir nicht für %other_name, aber es ist zu einer Degradierung gekommen. Zeit, besser zu werden!', '我们不希望这样,%other_name,但降职已发生。是时候变得更好了!', '', '', '', ''); +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 (384, 'broadcast_guild_recruitment', 'Looking for fresh blood! Join the guild, be part of something great!', 0, 0, '', 'À la recherche de sang neuf ! Rejoins la guilde, fais partie de quelque chose de grandiose !', 'Auf der Suche nach frischem Blut! Tritt der Gilde bei und sei Teil von etwas Großem!', '寻找新鲜血液!加入我们的公会,一起成就伟业!', '', '', '', ''); +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 (385, 'broadcast_guild_recruitment', 'Recruiting members! If you’re ready to join us, the guild door is open!', 0, 0, '', 'Recrutement de membres ! Si tu es prêt à nous rejoindre, la porte de la guilde est ouverte!', 'Wir rekrutieren! Wenn du bereit bist, uns beizutreten, steht die Tür der Gilde offen!', '招募成员!如果你准备好了,公会的大门随时为你敞开!', '', '', '', ''); +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 (386, 'broadcast_guild_recruitment', 'The guild is looking for skilled adventurers. Join us and thrive!', 0, 0, '', 'La guilde recherche des aventuriers compétents. Rejoins-nous et prospère!', 'Die Gilde sucht erfahrene Abenteurer. Tritt bei und wachse mit uns!', '公会正在寻找有实力的冒险者。加入我们,一起成长!', '', '', '', ''); +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 (387, 'broadcast_guild_recruitment', 'Want to join a great guild? We’re looking for new members! Come on in!', 0, 0, '', 'Envie de rejoindre une super guilde ? Nous cherchons de nouveaux membres ! Viens nous rejoindre !', 'Willst du einer großartigen Gilde beitreten? Wir suchen neue Mitglieder! Komm rein!', '想加入一个厉害的公会吗?我们在招新成员!快来加入吧!', '', '', '', ''); +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 (388, 'broadcast_guild_recruitment', 'The guild is growing! Join us for exciting adventures and rewards!', 0, 0, '', 'La guilde grandit! Rejoignez-nous pour vivre des aventures palpitantes et obtenir des récompenses!', 'Die Gilde wächst! Schließ dich uns an für spannende Abenteuer und Belohnungen!', '公会正在壮大!加入我们,体验刺激的冒险和丰厚的奖励!', '', '', '', ''); + +-- random instance +-- usable placeholders: +-- %my_role +-- %instance_name +-- %my_class +-- %my_race +-- %my_level +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 (389, 'suggest_instance', 'Anyone wants %instance_name?', 0, 0, '', 'Qui veut %instance_name?', 'Wer will %instance_name?', '有人想去%instance_name吗?', '', '¿Alguien quiere ir a %instance_name?', '', 'Кому нужен %instance_name?'); +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 (390, 'suggest_instance', 'Any groups for %instance_name?', 0, 0, '', 'Des groupes pour %instance_name?', 'Gibt es Gruppen für %instance_name?', '有组队去%instance_name的吗?', '', '¿Algún grupo para %instance_name?', '', 'Есть группы в %instance_name?'); +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 (391, 'suggest_instance', 'Need help for %instance_name?', 0, 0, '', 'Besoin d’aide pour %instance_name ?', 'Braucht jemand Hilfe für %instance_name?', '有人需要帮忙打%instance_name吗?', '', '¿Alguien necesita ayuda con %instance_name?', '', 'Нужна помощь в %instance_name?'); +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 (392, 'suggest_instance', 'LFD: %instance_name.', 0, 0, '', 'LFG: %instance_name.', 'LFG: %instance_name.', '寻找队伍:%instance_name。', '', 'Busco grupo para %instance_name.', '', 'ЛФД: %instance_name.'); +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 (393, 'suggest_instance', 'Anyone needs %my_role for %instance_name?', 0, 0, '', 'Besoin de %my_role pour %instance_name?', 'Braucht jemand einen %my_role für %instance_name?', '有人需要%my_role去%instance_name吗?', '', '¿Alguien necesita un %my_role para %instance_name?', '', 'Кому нужен %my_role для %instance_name?'); +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 (394, 'suggest_instance', 'Missing %my_role for %instance_name?', 0, 0, '', 'Il manque %my_role pour %instance_name ?', 'Fehlt ein %my_role für %instance_name?', '缺一个%my_role去%instance_name,有人来吗?', '', '¿Buscando un %my_role para %instance_name?', '', 'Не хватает %my_role для %instance_name?'); +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 (395, 'suggest_instance', 'Can be a %my_role for %instance_name.', 0, 0, '', 'Je peux être %my_role pour %instance_name.', 'Ich kann als %my_role für %instance_name gehen.', '我可以当%my_role去%instance_name。', '', 'Puedo ser un %my_role para %instance_name.', '', 'Могу быть %my_role для %instance_name.'); +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 (396, 'suggest_instance', 'Need help with %instance_name?', 0, 0, '', 'Besoin d’aide avec %instance_name?', 'Braucht jemand Hilfe bei %instance_name?', '有人需要帮忙过%instance_name吗?', '', '¿Alguien necesita ayuda con %instance_name?', '', 'Нужна помощь с %instance_name?'); +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 (397, 'suggest_instance', 'Need %my_role help with %instance_name?', 0, 0, '', 'Besoin d’aide avec %instance_name? Je peux t’aider avec ça?', 'Braucht jemand die Hilfe eines %my_role für %instance_name?', '需要一个%my_role帮忙打%instance_name吗?', '', '¿Necesitas ayuda de %my_role con %instance_name?', '', 'Нужна помощь %my_role с %instance_name?'); +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 (398, 'suggest_instance', 'Anyone needs gear from %instance_name?', 0, 0, '', 'Besoin d’équipement de %instance_name?', 'Braucht jemand Ausrüstung aus %instance_name?', '有人需要%instance_name的装备吗?', '', '¿Alguien necesita equipo de %instance_name?', '', 'Кому нужен шмот из %instance_name?'); +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 (399, 'suggest_instance', 'A little grind in %instance_name?', 0, 0, '', 'Un petit farming dans %instance_name ?', 'Eine kleine Farm-Runde in %instance_name?', '去%instance_name刷一波怎么样?', '', '¿Un poco de farmeo en %instance_name?', '', 'Немного пофармить в %instance_name?'); +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 (400, 'suggest_instance', 'WTR %instance_name', 0, 0, '', 'WTR %instance_name', 'WTR %instance_name', '想跑%instance_name', '', 'WTR %instance_name', '', 'Ищу %instance_name'); +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 (401, 'suggest_instance', 'Need help for %instance_name.', 0, 0, '', 'Besoin d’aide pour %instance_name.', 'Brauche Hilfe für %instance_name.', '需要帮忙打%instance_name。', '', 'Necesito ayuda para %instance_name.', '', 'Нужна помощь в %instance_name.'); +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 (402, 'suggest_instance', 'Wanna run %instance_name.', 0, 0, '', 'Tu veux lancer %instance_name.', 'Lust auf %instance_name?', '想去跑一趟%instance_name。', '', 'Quiero hacer %instance_name.', '', 'Хочу пройти %instance_name.'); +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 (403, 'suggest_instance', '%my_role looks for %instance_name.', 0, 0, '', 'Je recherche %instance_name dans le rôle de %my_role.', '%my_role sucht nach einer Gruppe für %instance_name.', '%my_role寻找%instance_name的队伍。', '', '%my_role busca %instance_name.', '', '%my_role ищет %instance_name.'); +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 (404, 'suggest_instance', 'What about %instance_name?', 0, 0, '', 'Et %instance_name, qu’en est-il?', 'Wie sieht’s mit %instance_name aus?', '%instance_name怎么样,去不去?', '', '¿Qué pasa con %instance_name?', '', 'Как насчет %instance_name?'); +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 (405, 'suggest_instance', 'Who wants to farm %instance_name?', 0, 0, '', 'Qui veut farm %instance_name ?', 'Wer will %instance_name farmen?', '有谁想去刷%instance_name?', '', '¿Quién quiere farmear %instance_name?', '', 'Кто хочет пофармить %instance_name?'); +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 (406, 'suggest_instance', 'Go in %instance_name?', 0, 0, '', 'On va dans %instance_name ?', 'Gehen wir nach %instance_name?', '去%instance_name怎么样?', '', '¿Vamos a %instance_name?', '', 'Пойдем в %instance_name?'); +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 (407, 'suggest_instance', 'Looking for %instance_name.', 0, 0, '', 'Je recherche %instance_name.', 'Suche Leute für %instance_name.', '寻找%instance_name的队伍。', '', 'Buscando gente para %instance_name.', '', 'Ищу %instance_name.'); +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 (408, 'suggest_instance', 'Need help with %instance_name quests?', 0, 0, '', 'Besoin d’aide avec les quêtes de %instance_name ?', 'Braucht jemand Hilfe bei Quests in %instance_name?', '有人需要帮忙做%instance_name的任务吗?', '', '¿Necesitas ayuda con las misiones en %instance_name?', '', 'Нужна помощь с квестами в %instance_name?'); +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 (409, 'suggest_instance', 'Wanna quest in %instance_name.', 0, 0, '', 'Tu veux partir en quête dans %instance_name?', 'Lust auf Quests in %instance_name?', '想去%instance_name做任务。', '', 'Quiero hacer una vuelta rapida en %instance_name.', '', 'Хочу квестить в %instance_name.'); +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 (410, 'suggest_instance', 'Anyone with quests in %instance_name?', 0, 0, '', 'Quelqu’un a des quêtes dans %instance_name?', 'Hat jemand Quests in %instance_name?', '有人有%instance_name的任务一起做吗?', '', '¿Alguien con misiones en %instance_name?', '', 'Кто-то с квестами в %instance_name?'); +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 (411, 'suggest_instance', 'Could help with quests in %instance_name.', 0, 0, '', '%instance_name, vous pouvez m’aider avec les quêtes ?', 'Kann bei Quests in %instance_name helfen.', '我可以帮忙做%instance_name的任务。', '', 'Podría ayudar con las misiones en %instance_name.', '', 'Могу помочь с квестами в %instance_name.'); +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 (412, 'suggest_instance', '%my_role: any place in group for %instance_name?', 0, 0, '', '%my_role: Est-ce qu’il y a une place dans le groupe pour %instance_name?', '%my_role: Gibt es einen Platz in einer Gruppe für %instance_name?', '%my_role:%instance_name的队伍有位置吗?', '', '%my_role: ¿algún lugar en el grupo para %instance_name?', '', '%my_role: есть место в группе для %instance_name?'); +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 (413, 'suggest_instance', 'Does anybody still run %instance_name this days?', 0, 0, '', 'Est-ce que quelqu’un utilise encore %instance_name de nos jours?', 'Läuft noch jemand %instance_name heutzutage?', '现在还有人跑%instance_name吗?', '', '¿Alguien todavía hace %instance_name estos días?', '', 'Кто-нибудь еще ходит в %instance_name в наши дни?'); +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 (414, 'suggest_instance', '%instance_name: anyone wants to take a %my_role?', 0, 0, '', '%instance_name: Est-ce que quelqu’un veut prendre un %my_role?', '%instance_name: Braucht jemand einen %my_role?', '%instance_name:有人需要一个%my_role吗?', '', '¿Alguien quiere un %my_role para %instance_name?', '', '%instance_name: кто хочет взять %my_role?'); +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 (415, 'suggest_instance', 'Is there any point being %my_role in %instance_name?', 0, 0, '', 'Est-ce que ça vaut la peine d’être %my_role dans %instance_name?', 'Macht es überhaupt Sinn, %my_role in %instance_name zu sein?', '在%instance_name当%my_role有意义吗?', '', '¿Tiene algún sentido ser %my_role en %instance_name?', '', 'Есть ли смысл быть %my_role в %instance_name?'); +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 (416, 'suggest_instance', 'It is really worth to go to %instance_name?', 0, 0, '', 'Est-ce que ça vaut vraiment la peine d’aller à %instance_name?', 'Lohnt es sich wirklich, nach %instance_name zu gehen?', '去%instance_name真的值得吗?', '', '¿Realmente vale la pena ir a %instance_name?', '', 'Стоит ли идти в %instance_name?'); +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 (417, 'suggest_instance', 'Anybody needs more people for %instance_name?', 0, 0, '', 'Est-ce que quelqu’un a besoin de plus de personnes pour %instance_name?', 'Braucht jemand noch Leute für %instance_name?', '有人需要更多人一起打%instance_name吗?', '', '¿Alguien necesita más personas para %instance_name?', '', 'Кому нужны еще люди для %instance_name?'); +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 (418, 'suggest_instance', '%instance_name bosses drop good gear. Wanna run?', 0, 0, '', '%instance_name Les boss laissent tomber du bon équipement. Tu veux qu’on y aille?', '%instance_name Bosse droppen gutes Gear. Lust auf einen Run?', '%instance_name的首领掉好装备,想去跑一趟吗?', '', 'Los jefes en %instance_name sueltan buen equipo. ¿Quieres ir?', '', 'В %instance_name боссы дропают хороший шмот. Пойдем?'); +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 (419, 'suggest_instance', 'What about %instance_name?', 0, 0, '', 'Que dire de %instance_name ?', 'Wie sieht’s mit %instance_name aus?', '%instance_name咋样,去不?', '', '¿Qué pasa con %instance_name?', '', 'Как насчет %instance_name?'); +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 (420, 'suggest_instance', 'Anybody needs %my_role?', 0, 0, '', 'Est-ce que quelqu’un a besoin de %my_role?', 'Braucht jemand einen %my_role?', '有人需要一个%my_role吗?', '', '¿Alguien necesita un %my_role?', '', 'Кому нужен %my_role?'); +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 (421, 'suggest_instance', 'Anyone needs %my_role?', 0, 0, '', 'Besoin de %my_role?', 'Braucht jemand einen %my_role?', '有人缺一个%my_role吗?', '', '¿Alguien hacer un grupo con un %my_role?', '', 'Кому нужен %my_role?'); +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 (422, 'suggest_instance', 'Who wants %instance_name?', 0, 0, '', 'Qui veut %instance_name ?', 'Wer will %instance_name?', '谁想去%instance_name?', '', '¿Quién quiere %instance_name?', '', 'Кто хочет %instance_name?'); +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 (423, 'suggest_instance', 'Can anybody summon me at %instance_name?', 0, 0, '', 'Est-ce que quelqu’un peut m’invoquer à %instance_name?', 'Kann mich jemand nach %instance_name herbeirufen?', '有人能在%instance_name召唤我吗?', '', '¿Alguien puede invocarme en %instance_name?', '', 'Кто может призвать меня в %instance_name?'); +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 (424, 'suggest_instance', 'Meet me in %instance_name', 0, 0, '', 'Rencontre-moi dans %instance_name', 'Triff mich in %instance_name.', '在%instance_name见我吧。', '', 'Encuéntrame en %instance_name', '', 'Встретимся в %instance_name'); +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 (425, 'suggest_instance', 'Wanna quick %instance_name run', 0, 0, '', 'Tu veux lancer rapidement %instance_name ?', 'Lust auf einen schnellen %instance_name Run?', '想快速跑一趟%instance_name吗?', '', 'Quiero ir a %instance_name rápido', '', 'Хочу быструю пробежку %instance_name'); +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 (426, 'suggest_instance', 'Wanna full %instance_name run', 0, 0, '', 'Bien sûr, je veux que l’instance %instance_name fonctionne.', 'Lust auf einen kompletten %instance_name Run?', '想完整跑一遍%instance_name吗?', '', 'Quiero hacer %instance_name completa', '', 'Хочу полный забег %instance_name'); +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 (427, 'suggest_instance', 'How many times were you in %instance_name?', 0, 0, '', 'Combien de fois ai-je été dans %instance_name?', 'Wie oft warst du schon in %instance_name?', '你去过%instance_name几次了?', '', '¿Cuántas veces estuviste en %instance_name?', '', 'Сколько раз ты был в %instance_name?'); +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 (428, 'suggest_instance', 'Another %instance_name run?', 0, 0, '', 'Une autre éxpédition dans %instance_name ?', 'Noch ein Run in %instance_name?', '再跑一趟%instance_name怎么样?', '', '¿Otra vuelta en %instance_name ?', '', 'Еще один забег в %instance_name?'); +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 (429, 'suggest_instance', 'Wiped in %instance_name? Take me instead!', 0, 0, '', 'Wipe dans %instance_name ? Prends-moi à la place !', 'Wipe in %instance_name? Nehmt mich stattdessen!', '在%instance_name团灭了?带我吧!', '', '¿Borrado en %instance_name? ¡Tómame a mí en su lugar!', '', 'Вайпнулись в %instance_name? Возьмите меня!'); +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 (430, 'suggest_instance', 'Take me in %instance_name please.', 0, 0, '', 'Prenez-moi dans %instance_name s’il vous plaît.', 'Nehmt mich mit in %instance_name, bitte.', '请带我去%instance_name。', '', 'Tómame en %instance_name por favor.', '', 'Возьмите меня в %instance_name, пожалуйста.'); +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 (431, 'suggest_instance', 'Quick %instance_name run?', 0, 0, '', 'Rapidement, %instance_name, on y va ?', 'Schneller %instance_name Run?', '快速跑一趟%instance_name?', '', '¿Partida rápida de %instance_name?', '', 'Быстрый забег в %instance_name?'); +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 (432, 'suggest_instance', 'Full %instance_name run?', 0, 0, '', 'Complet %instance_name ?', 'Kompletter %instance_name Run?', '完整跑一遍%instance_name?', '', '¿Partida completa de %instance_name?', '', 'Полный забег в %instance_name?'); +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 (433, 'suggest_instance', 'Who can take %my_role to %instance_name?', 0, 0, '', 'Qui peut prendre %my_role à %instance_name?', 'Wer kann als %my_role nach %instance_name gehen?', '谁能带一个%my_role去%instance_name?', '', '¿Quién puede ir de %my_role para %instance_name?', '', 'Кто может взять %my_role в %instance_name?'); +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 (434, 'suggest_instance', 'LFG %instance_name, I am %my_role', 0, 0, '', 'LFG %instance_name, je suis %my_role.', 'LFG %instance_name, ich bin %my_role.', '找队%instance_name,我是%my_role', '', '', '', 'ЛФГ %instance_name, я %my_role'); +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 (435, 'suggest_instance', '%my_role LFG %instance_name', 0, 0, '', '%my_role LFG %instance_name.', '%my_role LFG %instance_name.', '%my_role找队%instance_name', '', '', '', '%my_role ЛФГ %instance_name'); +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 (436, 'suggest_instance', 'Anyone looking for a group for %instance_name?', 0, 0, '', 'Quelqu’un cherche un groupe pour %instance_name?', 'Sucht jemand eine Gruppe für %instance_name?', '有人在找%instance_name的队伍吗?', '', '¿Alguien busca grupo para %instance_name?', '', ''); +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 (437, 'suggest_instance', 'Need a DPS for %instance_name', 0, 0, '', 'Besoin d’un DPS pour %instance_name.', 'Brauchen noch einen DPS für %instance_name.', '需要一个DPS去%instance_name', '', 'Necesito un DPS para %instance_name', '', ''); +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 (438, 'suggest_instance', 'Looking for a healer for %instance_name', 0, 0, '', 'Je suis à la recherche d’un guérisseur pour %instance_name.', 'Suche einen Heiler für %instance_name.', '找一个治疗去%instance_name', '', 'Busco un sanador para %instance_name', '', ''); +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 (439, 'suggest_instance', 'Anyone need a tank for %instance_name?', 0, 0, '', 'Besoin d’un tank pour %instance_name ?', 'Braucht jemand einen Tank für %instance_name?', '有人需要一个坦克去%instance_name吗?', '', '¿Alguien necesita un tanque para %instance_name?', '', ''); +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 (440, 'suggest_instance', 'Trying to do %instance_name. Need a group!', 0, 0, '', 'J’essaie de faire %instance_name. Il me faut un groupe !', 'Ich versuche %instance_name zu machen. Brauche eine Gruppe!', '想打%instance_name,缺个队伍!', '', 'Intentando hacer %instance_name. ¡Necesito un grupo!', '', ''); +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 (441, 'suggest_instance', 'Anyone down for %instance_name?', 0, 0, '', 'Qui est partant pour %instance_name?', 'Wer hat Lust auf %instance_name?', '有人想一起去%instance_name吗?', '', '¿Alguien se apunta para %instance_name?', '', ''); +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 (442, 'suggest_instance', 'Looking for 1 more for %instance_name', 0, 0, '', 'Il nous manque 1 personne pour %instance_name.', 'Uns fehlt noch 1 Person für %instance_name.', '还差1人去%instance_name', '', 'Busco 1 más para %instance_name', '', ''); +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 (443, 'suggest_instance', 'Anyone wanna join for %instance_name?', 0, 0, '', 'Quelqu’un veut se joindre pour %instance_name?', 'Möchte jemand für %instance_name mitkommen?', '有人想加入%instance_name的队伍吗?', '', '¿Alguien quiere unirse para %instance_name?', '', ''); +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 (444, 'suggest_instance', 'Anyone interested in %instance_name?', 0, 0, '', 'Quelqu’un intéressé par %instance_name ?', 'Hat jemand Interesse an %instance_name?', '有人对%instance_name感兴趣吗?', '', '¿Alguien interesado en %instance_name?', '', ''); +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 (445, 'suggest_instance', 'Looking for a quick run through %instance_name', 0, 0, '', 'À la recherche d’un rapide survol de %instance_name', 'Suche einen schnellen Run durch %instance_name.', '想快速通关%instance_name', '', 'Buscando una corrida rápida en %instance_name', '', ''); +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 (446, 'suggest_instance', 'Who’s up for %instance_name?', 0, 0, '', 'Qui est partant pour %instance_name?', 'Wer ist bereit für %instance_name?', '谁愿意去%instance_name?', '', '¿Quién está listo para %instance_name?', '', ''); +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 (447, 'suggest_instance', 'Need help to clear %instance_name', 0, 0, '', 'Besoin d’aide pour vider %instance_name', 'Brauche Hilfe, um %instance_name zu clearen', '需要帮忙清%instance_name', '', 'Necesito ayuda para limpiar %instance_name', '', ''); +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 (448, 'suggest_instance', 'Want to farm %instance_name?', 0, 0, '', 'Envie de farmer %instance_name?', 'Lust, %instance_name zu farmen?', '想去刷%instance_name吗?', '', '¿Quieres farmear %instance_name?', '', ''); +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 (449, 'suggest_instance', 'Looking to complete %instance_name', 0, 0, '', 'Je cherche à terminer %instance_name.', 'Suche Gruppe, um %instance_name abzuschließen.', '想完成%instance_name', '', 'Buscando completar %instance_name', '', ''); +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 (450, 'suggest_instance', 'Anyone needs %instance_name items?', 0, 0, '', 'Besoin d’objets %instance_name ?', 'Braucht jemand Items aus %instance_name?', '有人需要%instance_name的道具吗?', '', '¿Alguien necesita objetos de %instance_name?', '', ''); +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 (451, 'suggest_instance', 'Looking for a carry through %instance_name', 0, 0, '', 'Je recherche un portage à travers %instance_name.', 'Suche Carry für %instance_name.', '找人带我过%instance_name', '', 'Buscando un carry para %instance_name', '', ''); +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 (452, 'suggest_instance', 'Anyone want to run %instance_name?', 0, 0, '', 'Quelqu’un veut faire tourner %instance_name?', 'Will jemand %instance_name laufen?', '有人想跑%instance_name吗?', '', '¿Alguien quiere hacer %instance_name?', '', ''); +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 (453, 'suggest_instance', 'Running %instance_name, looking for more', 0, 0, '', 'En cours d’exécution de %instance_name, je suis à la recherche de plus d’informations.', 'Laufe %instance_name, suche noch Mitspieler.', '正在跑%instance_name,还缺人', '', 'Haciendo %instance_name, buscando más personas', '', ''); +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 (454, 'suggest_instance', 'Anyone available for %instance_name?', 0, 0, '', 'Quelqu’un disponible pour %instance_name ?', 'Hat jemand Zeit für %instance_name?', '有人有空去%instance_name吗?', '', '¿Alguien disponible para %instance_name?', '', ''); +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 (455, 'suggest_instance', 'Looking for someone to help with %instance_name', 0, 0, '', 'Besoin d’aide pour %instance_name', 'Suche Hilfe für %instance_name.', '找人帮忙打%instance_name', '', 'Buscando a alguien para ayudar con %instance_name', '', ''); +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 (456, 'suggest_instance', 'Need %my_role for %instance_name!', 0, 0, '', 'J’ai besoin de %my_role pour %nom_de_l’instance!', 'Brauche einen %my_role für %instance_name!', '需要一个%my_role去%instance_name!', '', '¡Necesito un %my_role para %instance_name!', '', ''); +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 (457, 'suggest_instance', 'Want to do a %instance_name run?', 0, 0, '', 'Tu veux faire une séance de %instance_name ?', 'Lust auf einen %instance_name Run?', '有人想一起刷%instance_name吗?', '', '¿Quieres hacer una corrida de %instance_name?', '', ''); +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 (458, 'suggest_instance', 'Need %my_role for %instance_name run', 0, 0, '', 'J’ai besoin de %my_role pour exécuter %instance_name.', 'Brauche %my_role für einen %instance_name Run.', '刷%instance_name需要一个%my_role!', '', 'Necesito %my_role para la corrida de %instance_name', '', ''); +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 (459, 'suggest_instance', 'Anyone want to farm %instance_name gear?', 0, 0, '', 'Ça vous dit de farmer les équipements de %instance_name ?', 'Hat jemand Lust, %instance_name Gear zu farmen?', '有人想一起刷%instance_name的装备吗?', '', '¿Alguien quiere farmear equipo de %instance_name?', '', ''); +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 (460, 'suggest_instance', 'Looking for a group to speedrun %instance_name', 0, 0, '', 'Je recherche un groupe pour faire une speedrun de %instance_name.', 'Suche Gruppe für einen Speedrun in %instance_name.', '找个队伍一起速刷%instance_name!', '', 'Buscando un grupo para speedrun de %instance_name', '', ''); +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 (461, 'suggest_instance', 'Need a group to clear %instance_name', 0, 0, '', 'Besoin d’un groupe pour nettoyer %instance_name', 'Brauche eine Gruppe, um %instance_name zu clearen.', '需要一个队伍清理%instance_name!', '', 'Necesito un grupo para limpiar %instance_name', '', ''); +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 (462, 'suggest_instance', 'Anyone interested in farming %instance_name?', 0, 0, '', 'Quelqu’un intéressé par cultiver %instance_name?', 'Hat jemand Interesse daran, %instance_name zu farmen?', '有人对刷%instance_name感兴趣吗?', '', '¿Alguien interesado en farmear %instance_name?', '', ''); +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 (463, 'suggest_instance', 'Looking for some gear from %instance_name', 0, 0, '', 'Je cherche des équipements de %instance_name.', 'Suche nach Ausrüstung aus %instance_name.', '想从%instance_name弄点装备,有一起的吗?', '', 'Buscando equipo de %instance_name', '', ''); +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 (464, 'suggest_instance', 'Anyone for a quick %instance_name run?', 0, 0, '', 'Qui est partant pour une petite instance rapide de %instance_name ?', 'Hat jemand Lust auf einen schnellen %instance_name Run?', '有人想速刷一波%instance_name吗?', '', '¿Alguien para una corrida rápida de %instance_name?', '', ''); +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 (465, 'suggest_instance', 'Anyone want to try %instance_name together?', 0, 0, '', 'Qui veut essayer %instance_name ensemble ?', 'Wer möchte %instance_name gemeinsam ausprobieren?', '有人想一起挑战%instance_name吗?', '', '¿Alguien quiere intentar %instance_name juntos?', '', ''); +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 (466, 'suggest_instance', 'Looking for people to complete %instance_name', 0, 0, '', 'Je recherche des personnes pour compléter %instance_name.', 'Suche Leute, um %instance_name abzuschließen.', '找人一起完成%instance_name!', '', 'Buscando personas para completar %instance_name', '', ''); +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 (467, 'suggest_instance', 'Can we get a group for %instance_name?', 0, 0, '', 'Peut-on former un groupe pour %instance_name?', 'Können wir eine Gruppe für %instance_name zusammenstellen?', '能组个队去%instance_name吗?', '', '¿Podemos formar un grupo para %instance_name?', '', ''); +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 (468, 'suggest_instance', 'Need a quick run for %instance_name', 0, 0, '', 'Besoin d’une exécution rapide pour %instance_name', 'Brauche einen schnellen Run für %instance_name.', '需要快速刷一波%instance_name!', '', 'Necesito una corrida rápida para %instance_name', '', ''); +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 (469, 'suggest_instance', 'Anyone down to farm %instance_name together?', 0, 0, '', 'Qui est partant pour farmer %instance_name ensemble ?', 'Hat jemand Lust, %instance_name gemeinsam zu farmen?', '有人想一起刷%instance_name吗?', '', '¿Alguien quiere farmear %instance_name juntos?', '', ''); +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 (470, 'suggest_instance', 'Looking for a few more for %instance_name', 0, 0, '', 'Je cherche encore quelques personnes pour %instance_name.', 'Suche noch ein paar Leute für %instance_name.', '还差几个人一起去%instance_name!', '', 'Buscando algunos más para %instance_name', '', ''); +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 (471, 'suggest_instance', 'Anyone need help with %instance_name mechanics?', 0, 0, '', 'Besoin d’aide avec les mécanismes de %instance_name ?', 'Braucht jemand Hilfe bei den Mechaniken von %instance_name?', '有人需要%instance_name的机制讲解吗?', '', '¿Alguien necesita ayuda con las mecánicas de %instance_name?', '', ''); +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 (472, 'suggest_instance', 'Need a group for %instance_name fast', 0, 0, '', 'J’ai besoin d’un groupe pour %instance_name rapidement', 'Brauche schnell eine Gruppe für %instance_name.', '急需一个队伍去%instance_name!', '', 'Necesito un grupo rápido para %instance_name', '', ''); +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 (473, 'suggest_instance', 'Anyone want to speedrun %instance_name?', 0, 0, '', 'Quelqu’un veut speedrunner %instance_name?', 'Will jemand %instance_name im Speedrun machen?', '有人想速刷%instance_name吗?', '', '¿Alguien quiere hacer %instance_name en speedrun?', '', ''); +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 (474, 'suggest_instance', 'Looking for a quick %instance_name completion', 0, 0, '', 'Je cherche une %instance_name complétion rapide.', 'Suche nach einer schnellen %instance_name Abschließung.', '找人快速完成%instance_name!', '', 'Buscando completar %instance_name rápido', '', ''); +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 (475, 'suggest_instance', 'Looking for anyone to join %instance_name', 0, 0, '', 'Je recherche des personnes pour rejoindre %instance_name.', 'Suche Leute, die sich %instance_name anschließen möchten.', '找人一起加入%instance_name!', '', 'Buscando a alguien para unirse a %instance_name', '', ''); +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 (476, 'suggest_instance', 'Anyone down to clear %instance_name?', 0, 0, '', 'Quelqu’un est partant pour nettoyer %instance_name?', 'Hat jemand Lust, %instance_name zu clearen?', '有人想一起清%instance_name吗?', '', '¿Alguien para limpiar %instance_name?', '', ''); +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 (477, 'suggest_instance', 'Need help with the final boss of %instance_name', 0, 0, '', 'Besoin d’aide avec le boss final de %instance_name?', 'Brauche Hilfe beim Endboss von %instance_name.', '需要帮忙打%instance_name的最终BOSS!', '', 'Necesito ayuda con el último jefe de %instance_name', '', ''); +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 (478, 'suggest_instance', 'Anyone interested in running %instance_name today?', 0, 0, '', 'Quelqu’un intéressé pour lancer %instance_name aujourd’hui?', 'Hat jemand Interesse, heute %instance_name zu machen?', '今天有人想刷%instance_name吗?', '', '¿Alguien interesado en hacer %instance_name hoy?', '', ''); +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 (479, 'suggest_instance', 'Looking for a quick run of %instance_name to farm some gear', 0, 0, '', 'Je cherche à faire rapidement %instance_name pour récupérer un peu d’équipement.', 'Suche nach einem schnellen Run in %instance_name, um etwas Gear zu farmen.', '想速刷%instance_name搞点装备,有人一起吗?', '', 'Buscando una corrida rápida de %instance_name para farmear equipo', '', ''); +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 (480, 'suggest_instance', 'Anyone looking to farm materials from %instance_name?', 0, 0, '', 'Qui veut farmer des matériaux dans %instance_name ?', 'Will jemand Materialien aus %instance_name farmen?', '有人想刷%instance_name的材料吗?', '', '¿Alguien quiere farmear materiales de %instance_name?', '', ''); +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 (481, 'suggest_instance', 'Let’s get a group for %instance_name', 0, 0, '', 'Formons un groupe pour %instance_name.', 'Lasst uns eine Gruppe für %instance_name zusammenstellen.', '咱们组个队去%instance_name吧!', '', 'Formemos un grupo para %instance_name', '', ''); + +-- random quest +-- usable placeholders: +-- %my_role +-- %quest_link +-- %quest_level +-- %my_class +-- %my_race +-- %my_level +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 (482, 'suggest_quest', 'Need help with %quest_link?', 0, 0, '', 'Besoin d’aide avec %quest_link?', 'Brauche Hilfe bei %quest_link?', '有人能帮我做%quest_link吗?', '', '¿Alguien necesita ayuda con %quest_link?', '', 'Нужна помощь с %quest_link?'); +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 (483, 'suggest_quest', 'Anyone wants to share %quest_link?', 0, 0, '', 'Est-ce que quelqu’un veut partager %quest_link ?', 'Möchte jemand %quest_link teilen?', '有人想一起分享%quest_link吗?', '', '¿Alguien quiere hacer %quest_link?', '', 'Кто хочет поделиться %quest_link?'); +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 (484, 'suggest_quest', 'Anyone doing %quest_link?', 0, 0, '', 'Quelqu’un fait la %quest_link?', 'Macht gerade jemand %quest_link?', '有人在做%quest_link吗?', '', '¿Alguien está haciendo %quest_link?', '', 'Кто делает %quest_link?'); +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 (485, 'suggest_quest', 'Wanna do %quest_link.', 0, 0, '', 'Tu veux faire la %quest_link ?', 'Lust auf %quest_link?', '想做%quest_link,有人一起吗?', '', '¿Una ayudita con %quest_link?', '', 'Хочу сделать %quest_link.'); +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 (486, 'suggest_quest', 'Looking to group for %quest_link.', 0, 0, '', 'À la recherche de personnes pour %quest_link.', 'Suche Gruppe für %quest_link.', '找人组队做%quest_link!', '', 'Buscando un grupo para %quest_link.', '', ''); +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 (487, 'suggest_quest', 'Who wants to help with %quest_link?', 0, 0, '', 'Qui veut aider avec %quest_link?', 'Wer möchte bei %quest_link helfen?', '谁想帮我做%quest_link?', '', '¿Quién quiere ayudar con %quest_link?', '', ''); +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 (488, 'suggest_quest', 'Need assistance with %quest_link?', 0, 0, '', 'Besoin d’aide avec %quest_link?', 'Brauche Unterstützung bei %quest_link?', '需要帮忙做%quest_link吗?', '', '¿Alguien necesita ayuda con %quest_link?', '', ''); +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 (489, 'suggest_quest', 'Anyone interested in %quest_link?', 0, 0, '', 'Quelqu’un intéressé par %quest_link?', 'Hat jemand Interesse an %quest_link?', '有人对%quest_link感兴趣吗?', '', '¿Alguien interesado en %quest_link?', '', ''); +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 (490, 'suggest_quest', 'Anyone wants to finish %quest_link?', 0, 0, '', 'Qui veut terminer la %quest_link ?', 'Wer will %quest_link abschließen?', '有人想完成%quest_link吗?', '', '¿Alguien quiere terminar %quest_link?', '', ''); +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 (491, 'suggest_quest', 'Need a team for %quest_link?', 0, 0, '', 'Besoin d’une équipe pour %quest_link?', 'Brauche ein Team für %quest_link?', '需要一个队伍做%quest_link吗?', '', '¿Necesito un equipo para %quest_link?', '', ''); +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 (492, 'suggest_quest', 'Any takers for %quest_link?', 0, 0, '', 'Des volontaires pour %quest_link ?', 'Freiwillige für %quest_link?', '有志愿者一起做%quest_link吗?', '', '¿Alguien se apunta a %quest_link?', '', ''); +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 (493, 'suggest_quest', 'Let’s do %quest_link together.', 0, 0, '', 'Faisons cette %quest_link ensemble.', 'Lass uns %quest_link zusammen machen.', '咱们一起做%quest_link吧!', '', 'Vamos a hacer %quest_link juntos.', '', ''); +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 (494, 'suggest_quest', 'Need someone for %quest_link.', 0, 0, '', 'Besoin de quelqu’un pour %quest_link.', 'Brauche jemanden für %quest_link.', '需要一个人帮忙做%quest_link。', '', '¿Necesito a alguien para %quest_link?', '', ''); +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 (495, 'suggest_quest', 'Anyone needs help with %quest_link?', 0, 0, '', 'Besoin d’aide avec %quest_link?', 'Braucht jemand Hilfe bei %quest_link?', '有人需要帮忙做%quest_link吗?', '', '¿Alguien necesita ayuda con %quest_link?', '', ''); +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 (496, 'suggest_quest', 'Need help with %quest_link? I got you.', 0, 0, '', 'Besoin d’aide avec %quest_link? Pas de souci, je suis là pour t’épauler.', 'Brauchst du Hilfe bei %quest_link? Ich helfe dir.', '需要帮忙做%quest_link吗?我来帮你!', '', '¿Necesitas ayuda con %quest_link? Yo te ayudo.', '', ''); +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 (497, 'suggest_quest', 'Looking to do %quest_link. Anyone in?', 0, 0, '', 'Je veux faire %quest_link. Qui veut se joindre à moi ?', 'Ich will %quest_link machen. Wer kommt mit?', '想做%quest_link,有人加入吗?', '', 'Busco hacer %quest_link. ¿Alguien se une?', '', ''); +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 (498, 'suggest_quest', 'Help wanted for %quest_link.', 0, 0, '', 'Besoin d’aide pour %quest_link.', 'Hilfe gesucht für %quest_link.', '需要帮忙做%quest_link!', '', 'Se busca ayuda para %quest_link.', '', ''); +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 (499, 'suggest_quest', 'Who is up for %quest_link?', 0, 0, '', 'Qui est partant pour %quest_link ?', 'Wer ist dabei für %quest_link?', '谁想一起做%quest_link?', '', '¿Quién se apunta a %quest_link?', '', ''); +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 (500, 'suggest_quest', 'Who wants to join for %quest_link?', 0, 0, '', 'Qui veut se joindre à moi pour %quest_link ?', 'Wer möchte sich für %quest_link anschließen?', '谁想加入做%quest_link?', '', '¿Quién quiere unirse a %quest_link?', '', ''); +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 (501, 'suggest_quest', 'Anyone up for %quest_link?', 0, 0, '', 'Qui est partant pour %quest_link ?', 'Hat jemand Lust auf %quest_link?', '有人想做%quest_link吗?', '', '¿Alguien quiere hacer %quest_link?', '', ''); +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 (502, 'suggest_quest', 'Need some help with %quest_link here.', 0, 0, '', 'Besoin d’aide avec %quest_link ici.', 'Brauche hier Hilfe mit %quest_link.', '这里需要帮忙做%quest_link。', '', 'Necesito ayuda con %quest_link.', '', ''); +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 (503, 'suggest_quest', 'Anyone for %quest_link?', 0, 0, '', 'Quelqu’un pour %quest_link ?', 'Jemand für %quest_link?', '有人一起做%quest_link吗?', '', '¿Alguien para %quest_link?', '', ''); +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 (504, 'suggest_quest', 'Who is ready to do %quest_link?', 0, 0, '', 'Qui est prêt à faire %quest_link ?', 'Wer ist bereit für %quest_link?', '谁准备好做%quest_link了?', '', '¿Quién está listo para %quest_link?', '', ''); +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 (505, 'suggest_quest', 'Looking for some %quest_link help.', 0, 0, '', 'Je cherche de l’aide pour %quest_link.', 'Suche Hilfe für %quest_link.', '找人帮忙做%quest_link。', '', 'Buscando ayuda para %quest_link.', '', ''); +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 (506, 'suggest_quest', 'Anyone need %quest_link help?', 0, 0, '', 'Besoin d’aide pour la quête %quest_link?', 'Braucht jemand Hilfe für die Quest %quest_link?', '有人需要%quest_link的帮助吗?', '', '¿Alguien necesita ayuda con %quest_link?', '', ''); +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 (507, 'suggest_quest', 'Who is down to complete %quest_link?', 0, 0, '', 'Qui est partant pour compléter la %quest_link?', 'Wer möchte %quest_link abschließen?', '谁想一起完成%quest_link?', '', '¿Quién se apunta a completar %quest_link?', '', ''); +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 (508, 'suggest_quest', 'Anyone need assistance for %quest_link?', 0, 0, '', 'Besoin d’aide pour %quest_link ?', 'Braucht jemand Unterstützung für %quest_link?', '有人需要%quest_link的协助吗?', '', '¿Alguien necesita asistencia con %quest_link?', '', ''); +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 (509, 'suggest_quest', 'Who can help with %quest_link?', 0, 0, '', 'Qui peut m’aider avec %quest_link?', 'Wer kann mit %quest_link helfen?', '谁能帮忙做%quest_link?', '', '¿Quién puede ayudar con %quest_link?', '', ''); +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 (510, 'suggest_quest', 'Looking for a hand with %quest_link.', 0, 0, '', 'Recherchde l aide pour %quest_link.', 'Suche Unterstützung für %quest_link.', '找人帮一把做%quest_link。', '', 'Buscando ayuda con %quest_link.', '', ''); +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 (511, 'suggest_quest', 'Anyone ready for %quest_link?', 0, 0, '', 'Qui est prêt pour %quest_link?', 'Wer ist bereit für %quest_link?', '有人准备好做%quest_link了吗?', '', '¿Alguien listo para %quest_link?', '', ''); +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 (512, 'suggest_quest', 'Can anyone join me for %quest_link?', 0, 0, '', 'Est-ce que quelqu’un peut se joindre à moi pour %quest_link?', 'Kann sich jemand für %quest_link anschließen?', '有人能和我一起做%quest_link吗?', '', '¿Alguien puede unirse para %quest_link?', '', ''); +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 (513, 'suggest_quest', 'Looking for some partners for %quest_link.', 0, 0, '', 'Je recherche des partenaires pour %quest_link.', 'Suche Mitstreiter für %quest_link.', '找几个伙伴一起做%quest_link。', '', 'Buscando compañeros para %quest_link.', '', ''); +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 (514, 'suggest_quest', 'Anyone want to team up for %quest_link?', 0, 0, '', 'Quelqu’un veut faire équipe pour %quest_link?', 'Will jemand ein Team für %quest_link bilden?', '有人想组队做%quest_link吗?', '', '¿Alguien quiere formar un equipo para %quest_link?', '', ''); +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 (515, 'suggest_quest', 'Who is willing to do %quest_link?', 0, 0, '', 'Qui est prêt à faire %quest_link ?', 'Wer ist bereit, %quest_link zu machen?', '谁愿意做%quest_link?', '', '¿Quién está dispuesto a hacer %quest_link?', '', ''); +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 (516, 'suggest_quest', 'Who needs %quest_link to be completed?', 0, 0, '', 'Qui a besoin que %quest_link soit complété ?', 'Wer muss %quest_link abschließen?', '谁需要完成%quest_link?', '', '¿Quién necesita completar %quest_link?', '', ''); +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 (517, 'suggest_quest', 'Looking to complete %quest_link.', 0, 0, '', 'Je cherche à accomplir la %quest_link.', 'Suche Gruppe, um %quest_link abzuschließen.', '想完成%quest_link,有人一起吗?', '', 'Buscando completar %quest_link.', '', ''); +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 (518, 'suggest_quest', 'Who can join me for %quest_link?', 0, 0, '', 'Qui peut se joindre à moi pour %quest_link ?', 'Wer kann sich mir für %quest_link anschließen?', '谁能和我一起做%quest_link?', '', '¿Quién puede unirse a %quest_link?', '', ''); +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 (519, 'suggest_quest', 'Anyone interested in completing %quest_link?', 0, 0, '', 'Qui est intéressé pour compléter la %quest_link ?', 'Hat jemand Interesse, %quest_link abzuschließen?', '有人想完成%quest_link吗?', '', '¿Alguien interesado en completar %quest_link?', '', ''); +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 (520, 'suggest_quest', 'Wanna help with %quest_link?', 0, 0, '', 'Tu veux de l’aide avec %quest_link?', 'Willst du bei %quest_link helfen?', '想帮我做%quest_link吗?', '', '¿Quieres ayudar con %quest_link?', '', ''); +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 (521, 'suggest_quest', 'Anyone willing to help with %quest_link?', 0, 0, '', '%quest_link ? Oh, vous avez besoin d’aide pour cette quête ? Je suis là pour vous aider !', 'Braucht jemand Hilfe bei %quest_link? Ich bin dabei!', '有人愿意帮忙做%quest_link吗?', '', '¿Alguien dispuesto a ayudar con %quest_link?', '', ''); +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 (522, 'suggest_quest', 'Need someone to finish %quest_link.', 0, 0, '', 'Besoin que quelqu’un termine %quest_link.', 'Brauche jemanden, der %quest_link abschließt.', '需要有人一起完成%quest_link。', '', 'Necesito a alguien para terminar %quest_link.', '', ''); +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 (523, 'suggest_quest', 'Anyone want to finish %quest_link?', 0, 0, '', 'Quelqu’un veut finir %quest_link ?', 'Möchte jemand %quest_link beenden?', '有人想一起完成%quest_link吗?', '', '¿Alguien quiere terminar %quest_link?', '', ''); +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 (524, 'suggest_quest', 'Any help with %quest_link?', 0, 0, '', 'Besoin d’aide avec %quest_link?', 'Braucht jemand Hilfe bei %quest_link?', '有谁能帮忙做%quest_link?', '', '¿Necesito ayuda con %quest_link?', '', ''); +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 (525, 'suggest_quest', 'Anyone up for %quest_link?', 0, 0, '', 'Qui est partant pour %quest_link ?', 'Wer hat Lust auf %quest_link?', '有人想去做%quest_link吗?', '', '¿Alguien se apunta a %quest_link?', '', ''); +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 (526, 'suggest_quest', 'Looking for %quest_link completion partner.', 0, 0, '', 'Je recherche un partenaire pour compléter %quest_link.', 'Suche einen Partner, um %quest_link abzuschließen.', '找个伙伴一起完成%quest_link。', '', 'Buscando compañero para completar %quest_link.', '', ''); +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 (527, 'suggest_quest', 'Who is down to finish %quest_link?', 0, 0, '', 'Qui est partant pour finir la %quest_link?', 'Wer möchte %quest_link fertigstellen?', '谁愿意一起完成%quest_link?', '', '¿Quién se apunta a terminar %quest_link?', '', ''); +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 (528, 'suggest_quest', 'Help wanted for %quest_link.', 0, 0, '', 'Besoin d’aide pour %quest_link.', 'Hilfe gesucht für %quest_link.', '求助,需要帮忙做%quest_link。', '', 'Se busca ayuda para %quest_link.', '', ''); +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 (529, 'suggest_quest', 'Anyone interested in %quest_link today?', 0, 0, '', 'Quelqu’un intéressé par %quest_link aujourd’hui?', 'Hat jemand heute Interesse an %quest_link?', '今天有人对%quest_link感兴趣吗?', '', '¿Alguien interesado en %quest_link hoy?', '', ''); +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 (530, 'suggest_quest', 'Anyone doing %quest_link now?', 0, 0, '', 'Est-ce que quelqu’un est en train de faire %quest_link maintenant?', 'Macht gerade jemand %quest_link?', '现在有人在做%quest_link吗?', '', '¿Alguien haciendo %quest_link ahora?', '', ''); +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 (531, 'suggest_quest', 'Any takers for %quest_link now?', 0, 0, '', 'Des preneurs pour %quest_link maintenant?', 'Freiwillige für %quest_link jetzt?', '现在有人想做%quest_link吗?', '', '¿Alguien se apunta a %quest_link ahora?', '', ''); +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 (532, 'suggest_quest', 'Anyone wants to start %quest_link?', 0, 0, '', 'Qui veut commencer %quest_link?', 'Wer will %quest_link starten?', '有人想开始做%quest_link吗?', '', '¿Alguien quiere empezar %quest_link?', '', ''); +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 (533, 'suggest_quest', 'Need help with %quest_link please.', 0, 0, '', 'Besoin d’aide avec %quest_link s’il vous plaît.', 'Brauche Hilfe bei %quest_link, bitte.', '求帮忙做%quest_link,拜托了。', '', 'Necesito ayuda con %quest_link, por favor.', '', ''); +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 (534, 'suggest_quest', 'Who can help me with %quest_link?', 0, 0, '', 'Qui peut m’aider avec %quest_link?', 'Wer kann mir mit %quest_link helfen?', '谁能帮我做%quest_link?', '', '¿Quién puede ayudarme con %quest_link?', '', ''); +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 (535, 'suggest_quest', 'Looking to group for %quest_link.', 0, 0, '', 'Je cherche des compagnons pour %quest_link.', 'Suche eine Gruppe für %quest_link.', '找队伍一起做%quest_link。', '', 'Buscando un grupo para %quest_link.', '', ''); + +-- random trade? +-- usable placeholders: +-- %my_role +-- %category +-- %my_class +-- %my_race +-- %my_level +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 (536, 'suggest_trade', 'Anyone to farm %category?', 0, 0, '', 'Quelqu’un pour farmer %category?', 'Jemand zum Farmen von %category?', '有人一起刷%category吗?', '', '¿Alguien para farmear %category?', '', 'Кто хочет пофармить %category?'); +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 (537, 'suggest_trade', 'Looking for help farming %category.', 0, 0, '', 'Je cherche de l’aide pour farm %category.', 'Suche Hilfe beim Farmen von %category.', '找人帮忙一起刷%category。', '', 'Buscando ayuda para farmear %category.', '', 'Ищу помощь для фарма %category.'); +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 (538, 'suggest_trade', 'Damn %category are so expensive!', 0, 0, '', 'Ah mince, les %category sont tellement chers !', 'Verdammt, %category sind so teuer!', '靠,%category也太贵了吧!', '', '¡Malditas %category son tan caras!', '', 'Черт, %category такие дорогие!'); +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 (539, 'suggest_trade', 'Wanna %category.', 0, 0, '', 'Envie de %category.', 'Lust auf %category.', '想要%category。', '', 'Quiero %category.', '', 'Хочу %category.'); +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 (540, 'suggest_trade', 'Need help with %category.', 0, 0, '', 'Besoin d’aide avec %category.', 'Brauche Hilfe mit %category.', '需要帮忙搞%category。', '', 'Necesito ayuda con %category.', '', 'Нужна помощь с %category.'); +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 (541, 'suggest_trade', 'WTB %category.', 0, 0, '', 'Je cherche à acheter %category.', 'Kaufe %category.', '求购%category。', '', 'Quiero comprar %category.', '', 'Куплю %category.'); +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 (542, 'suggest_trade', 'Anyone interested in %category?', 0, 0, '', 'Quelqu’un intéressé par %category ?', 'Hat jemand Interesse an %category?', '有人对%category感兴趣吗?', '', '¿Alguien interesado en %category?', '', 'Кому интересно %category?'); +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 (543, 'suggest_trade', 'WTS %category.', 0, 0, '', 'Je vends %category.', 'Verkaufe %category.', '出售%category。', '', 'Quiero vender %category.', '', 'Продам %category.'); +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 (544, 'suggest_trade', 'I am selling %category cheaper than AH.', 0, 0, '', 'Je vends %category moins cher que chez AH.', 'Verkaufe %category günstiger als im AH.', '我卖的%category比拍卖行便宜。', '', 'Estoy vendiendo %category más barato que en las subastas.', '', 'Продаю %category дешевле, чем на Аукционе.'); +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 (545, 'suggest_trade', 'Who wants to farm %category?', 0, 0, '', 'Qui veut farm %category?', 'Wer will %category farmen?', '谁想一起刷%category?', '', '¿Quién quiere farmear %category?', '', 'Кто хочет пофармить %category?'); +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 (546, 'suggest_trade', 'Wanna farm %category.', 0, 0, '', 'Envie de farmer %category.', 'Lust auf %category Farmen.', '想去刷%category。', '', 'Quiero farmear %category.', '', 'Хочу пофармить %category.'); +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 (547, 'suggest_trade', 'Looking for party after %category.', 0, 0, '', 'Je cherche un group pour farm %category.', 'Suche Gruppe nach %category.', '找队伍去搞%category。', '', 'Buscando grupo después de %category.', '', 'Ищу пати после %category.'); +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 (548, 'suggest_trade', 'Any %category are appreciated.', 0, 0, '', 'Toute %category est appréciée.', 'Jede %category ist willkommen.', '任何%category都欢迎。', '', 'Cualquier %category es apreciada.', '', 'Любые %category приветствуются.'); +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 (549, 'suggest_trade', 'Buying anything of %category.', 0, 0, '', 'Acheter toute votre %category.', 'Kaufe jegliche %category.', '收购所有%category。', '', 'Comprando algo de %category.', '', 'Куплю что угодно из %category.'); +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 (550, 'suggest_trade', 'Wow, anybody is farming %category!', 0, 0, '', 'Oh là là, tout le monde farm le %category !', 'Wow, jeder farmt gerade %category!', '哇,有人正在刷%category!', '', '¡Guau, alguien está farmeando %category!', '', 'Вау, кто-то фармит %category!'); +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 (551, 'suggest_trade', '%category are selling mad in the AH.', 0, 0, '', 'Les %category se vendent comme des petits pains à l’HDV.', '%category gehen im AH weg wie warme Semmeln.', '%category在拍卖行卖疯了。', '', '%category están vendiendo locos en las subastas.', '', '%category отлично продаются на аукционе.'); +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 (552, 'suggest_trade', 'AH is hot for %category.', 0, 0, '', 'AH c’est fan de %category.', 'AH läuft heiß für %category.', '拍卖行对%category很火爆。', '', 'Las subastas estan caliente para %category.', '', 'Аукцион горячий по %category.'); +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 (553, 'suggest_trade', '%category are on the market.', 0, 0, '', 'Des %category sont disponibles sur le marché.', '%category sind auf dem Markt.', '%category市场上有了。', '', '%category están en el mercado.', '', '%category на рынке.'); +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 (554, 'suggest_trade', 'Wanna trade some %category.', 0, 0, '', 'Tu veux échanger des %category ?', 'Will jemand %category tauschen?', '想换点%category吗?', '', 'Quiero intercambiar alguna %category.', '', 'Хочу обменять немного %category.'); +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 (555, 'suggest_trade', 'Need more %category.', 0, 0, '', 'J’ai besoin de plus de %category.', 'Brauche mehr %category.', '需要更多的%category。', '', 'Necesito más %category.', '', 'Нужно больше %category.'); +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 (556, 'suggest_trade', 'Anybody can spare some %category?', 0, 0, '', 'Est-ce que quelqu’un pourrait me passer un peu de %category?', 'Kann jemand etwas %category entbehren?', '有人能匀点%category给我吗?', '', '¿Alguien puede ahorrar algo de %category?', '', 'Кто-нибудь может поделиться %category?'); +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 (557, 'suggest_trade', 'Who wants %category?', 0, 0, '', 'Qui veut la %category ?', 'Wer will %category?', '谁想要%category?', '', '¿Quién quiere %category?', '', 'Кто хочет %category?'); +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 (558, 'suggest_trade', 'Some %category please?', 0, 0, '', 'Une %category s’il vous plaît ?', '%category bitte?', '能给点%category吗?', '', '¿Alguna %category, por favor?', '', 'Немного %category, пожалуйста?'); +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 (559, 'suggest_trade', 'I should have got skill for %category.', 0, 0, '', 'J’aurais dû avoir des compétences pour cette %category.', 'Ich hätte eine Fähigkeit für %category lernen sollen.', '我真该学点关于%category的技能。', '', 'Debería haber adquirido habilidad para %category.', '', 'Надо было прокачать навык для %category.'); +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 (560, 'suggest_trade', 'I am dying for %category.', 0, 0, '', 'Je meurs d’envie de %category.', 'Ich sterbe für %category.', '我超级想要%category。', '', 'Me muero por %category.', '', 'Очень хочу %category.'); +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 (561, 'suggest_trade', 'People are killing for %category.', 0, 0, '', 'Les gens se tuent pour cette %category.', 'Die Leute bringen sich um für %category.', '大家都在抢着要%category。', '', 'La gente está matando por %category.', '', 'Люди убивают ради %category.'); +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 (562, 'suggest_trade', '%category is a great bargain!', 0, 0, '', 'La catégorie est une super affaire !', '%category ist ein echtes Schnäppchen!', '%category真是大便宜!', '', '%category es una gran ganga!', '', '%category — отличная сделка!'); +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 (563, 'suggest_trade', 'Everybody is mad for %category!', 0, 0, '', 'Tout le monde est fou de %category !', 'Alle sind verrückt nach %category!', '大家都为%category疯狂!', '', '¡Todo el mundo está loco por %category!', '', 'Все сходят с ума по %category!'); +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 (564, 'suggest_trade', 'Where is the best place to farm for %category?', 0, 0, '', 'Quel est le meilleur endroit pour farm des %category?', 'Wo ist der beste Ort, um %category zu farmen?', '刷%category最好的地方是哪儿?', '', '¿Dónde está el mejor lugar para farmear para %category?', '', 'Где лучше всего фармить %category?'); +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 (565, 'suggest_trade', 'I am all set for %category.', 0, 0, '', 'Je suis prêt(e) pour la %category.', 'Ich bin bereit für %category.', '我已经准备好搞%category了。', '', 'Estoy listo para %category.', '', 'Я полностью готов к %category.'); +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 (566, 'suggest_trade', 'Is it good to sell %category?', 0, 0, '', 'Est-ce une bonne idée de vendre %category?', 'Lohnt es sich, %category zu verkaufen?', '现在卖%category合适吗?', '', '¿Es bueno vender %category?', '', 'Выгодно ли продавать %category?'); +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 (567, 'suggest_trade', 'I’d probably keep all my %category with me.', 0, 0, '', 'Je garderais probablement toutes mes %category avec moi.', 'Ich würde wahrscheinlich alle meine %category behalten.', '我大概会把所有%category留着。', '', 'Probablemente mantendría toda mi %category conmigo', '', ''); +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 (568, 'suggest_trade', 'Need group? Maybe to farm some %category?', 0, 0, '', 'Besoin d’un groupe ? Peut-être pour farmer un peu de %category ?', 'Brauche eine Gruppe? Vielleicht um %category zu farmen?', '需要组队吗?一起刷点%category怎么样?', '', '¿Necesitas un grupo? ¿Tal vez para farmear alguna %category?', '', 'Нужна группа? Может, пофармить %category?'); +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 (569, 'suggest_trade', 'I am still thinking about %category.', 0, 0, '', 'Je suis toujours en train de réfléchir à farm %category.', 'Ich denke immer noch über %category nach.', '我还在考虑%category的事。', '', 'Todavía estoy pensando en %category.', '', 'Все еще думаю о %category.'); +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 (570, 'suggest_trade', 'I heard about %category already, but my pockets are empty.', 0, 0, '', 'J’ai déjà entendu parler de %category, mais mes poches sont vides.', 'Ich habe schon von %category gehört, aber meine Taschen sind leer.', '我早就听说过%category,可惜没钱。', '', 'Ya escuché sobre %category, pero mis bolsillos están vacíos.', '', 'Я уже слышал о %category, но карманы пусты.'); +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 (571, 'suggest_trade', 'LFG for %category', 0, 0, '', 'Je cherche un groupe pour %category.', 'Suche Gruppe für %category.', '找队伍搞%category。', '', 'Busco grupo para %category', '', 'ЛФГ для %category'); +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 (572, 'suggest_trade', 'Would selling %category make me rich?', 0, 0, '', 'Est-ce que vendre %category me rendrait riche?', 'Würde der Verkauf von %category mich reich machen?', '卖%category能让我发财吗?', '', '¿Vender %category me haría rico?', '', 'Сделает ли продажа %category меня богатым?'); +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 (573, 'suggest_trade', 'OK. I an farming %category tomorrow.', 0, 0, '', 'D’accord. Demain, je vais grind %category.', 'OK. Morgen farme ich %category.', '好吧,明天我去刷%category。', '', 'OK. Tengo una sesion de farmeo de %category mañana.', '', 'ОК. Завтра фармлю %category.'); +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 (574, 'suggest_trade', 'Everyone is talking about %category.', 0, 0, '', 'Tout le monde parle de %category.', 'Alle reden über %category.', '大家都在讨论%category。', '', 'Todos hablan de %category', '', 'Все говорят о %category.'); +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 (575, 'suggest_trade', 'I saw at least ten people farming for %category.', 0, 0, '', 'J’ai vu au moins dix personnes qui farm %category.', 'Ich habe mindestens zehn Leute gesehen, die %category farmen.', '我看到至少十个人在刷%category。', '', 'Vi al menos diez personas farmeando para %category.', '', 'Видел как минимум десять человек, фармящих %category.'); +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 (576, 'suggest_trade', 'I sold all my %category yesterday. I am completely broke!', 0, 0, '', 'J’ai vendu toutes mes %category hier. Je suis complètement fauché !', 'Ich habe gestern all meine %category verkauft. Jetzt bin ich pleite!', '昨天我把所有%category都卖了,现在彻底破产了!', '', 'Ayer vendí todo mi %category. ¡Estoy completamente arruinado!', '', 'Вчера продал все свои %category. Теперь я полностью на мели!'); +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 (577, 'suggest_trade', 'Wanna join a guild farming for %category.', 0, 0, '', 'Tu veux rejoindre une guilde qui farme %category.', 'Willst du einer Gilde beitreten, die %category farmt?', '想加入一个刷%category的公会。', '', 'Quiero unirme a una hermandad de farmeo para %category.', '', 'Хочу вступить в гильдию, фармящую %category.'); +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 (578, 'suggest_trade', 'I am selling %category cheaper than AH.', 0, 0, '', 'Je vends %category moins cher qu’à l’AH.', 'Verkaufe %category günstiger als im AH.', '我卖的%category比拍卖行便宜。', '', 'Estoy vendiendo %category más barato que en las subastas.', '', 'Продаю %category дешевле, чем на Аукционе.'); +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 (579, 'suggest_trade', 'Who wants to farm %category?', 0, 0, '', 'Qui veut faire du farming pour %category?', 'Wer will %category farmen?', '谁想一起刷%category?', '', '¿Quién quiere farmear %category?', '', 'Кто хочет пофармить %category?'); +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 (580, 'suggest_trade', 'Selling %category, anyone interested?', 0, 0, '', 'Vente %category, des intéressés ?', 'Verkaufe %category, jemand interessiert?', '卖%category,有人感兴趣吗?', '', 'Vendo %category, ¿alguien interesado?', '', ''); +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 (581, 'suggest_trade', 'Anyone needs %category?', 0, 0, '', 'Besoin de %category?', 'Braucht jemand %category?', '有人需要%category吗?', '', '¿Alguien necesita %category?', '', ''); +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 (582, 'suggest_trade', 'Selling %category, whisper me.', 0, 0, '', 'Vente de %category, wisp me.', 'Verkaufe %category, flüstert mich an.', '卖%category,私聊我。', '', 'Vendo %category, susúrrame.', '', ''); +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 (583, 'suggest_trade', 'Looking to trade %category for %category.', 0, 0, '', 'Je cherche à échanger %category contre %category.', 'Suche Tausch %category gegen %category.', '想用%category换%category。', '', 'Busco intercambiar %category por %category.', '', ''); +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 (584, 'suggest_trade', 'Need %category, anyone selling?', 0, 0, '', 'Besoin de %category, est-ce que quelqu’un en vend?', 'Brauche %category, verkauft jemand?', '需要%category,有人卖吗?', '', 'Necesito %category, ¿alguien vende?', '', ''); +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 (585, 'suggest_trade', 'Got %category for sale, hit me up!', 0, 0, '', 'J’ai %category à vendre, fais-moi signe!', 'Habe %category zu verkaufen, meldet euch!', '有%category卖,联系我!', '', '¡Tengo %category en venta, contáctame!', '', ''); +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 (586, 'suggest_trade', 'Anyone willing to farm %category?', 0, 0, '', '"Quelqu’un prêt à faire du farming %category?"', 'Ist jemand bereit, %category zu farmen?', '有人愿意一起刷%category吗?', '', '¿Alguien dispuesto a farmear %category?', '', ''); +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 (587, 'suggest_trade', 'Want to trade %category for %category.', 0, 0, '', 'Je veux échanger %category contre %category.', 'Will %category gegen %category tauschen.', '想用 %category 换 %category,有人感兴趣吗?', '', 'Quiero intercambiar %category por %category.', '', ''); +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 (588, 'suggest_trade', 'Selling %category, best price in the market.', 0, 0, '', 'Je vends %category, au meilleur prix du marché.', 'Verkaufe %category zum besten Preis am Markt.', '出售 %category,市场最低价!', '', 'Vendo %category, el mejor precio del mercado.', '', ''); +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 (589, 'suggest_trade', 'Looking for %category in exchange for %category.', 0, 0, '', 'Je recherche %category en échange de %category.', 'Suche %category im Austausch gegen %category.', '想找 %category,愿意用 %category 交换。', '', 'Busco %category a cambio de %category.', '', ''); +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 (590, 'suggest_trade', 'Anyone got %category to trade?', 0, 0, '', 'Quelqu’un a %category à échanger ?', 'Hat jemand %category zum Tauschen?', '有人有 %category 能换吗?', '', '¿Alguien tiene %category para intercambiar?', '', ''); +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 (591, 'suggest_trade', 'Who needs %category? I got some for sale!', 0, 0, '', 'Qui a besoin de %category? J’en ai à vendre!', 'Wer braucht %category? Ich habe etwas zu verkaufen!', '谁需要 %category?我有些要卖!', '', '¿Quién necesita %category? ¡Tengo algo para vender!', '', ''); +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 (592, 'suggest_trade', 'I have %category for sale, whisper for price.', 0, 0, '', 'J’ai %category à vendre, chuchotez-moi pour le prix.', 'Ich habe %category zu verkaufen, flüstert mich für den Preis an.', '我有 %category 要卖,私聊问价。', '', 'Tengo %category en venta, susúrrame para el precio.', '', ''); +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 (593, 'suggest_trade', 'Looking to sell %category, whisper for details.', 0, 0, '', 'Je cherche à vendre des %category, envoyez-moi un message pour plus de détails.', 'Suche Käufer für %category, flüstert mich für Details an.', '想卖 %category,私聊了解详情。', '', 'Busco vender %category, susúrrame para detalles.', '', ''); +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 (594, 'suggest_trade', 'WTB %category. Anyone selling?', 0, 0, '', 'Je recherche %category. Est-ce que quelqu’un en vend?', 'Kaufe %category. Verkauft jemand?', '求购 %category,有人卖吗?', '', 'Busco comprar %category. ¿Alguien vende?', '', ''); +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 (595, 'suggest_trade', 'I am looking for %category, please contact me.', 0, 0, '', 'Je recherche %category, n’hésitez pas à me contacter.', 'Suche %category, bitte kontaktiert mich.', '我在找 %category,有货请联系我。', '', 'Estoy buscando %category, por favor contáctame.', '', ''); +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 (596, 'suggest_trade', 'Any takers for %category?', 0, 0, '', 'Des intéressés pour %category ?', 'Interessiert sich jemand für %category?', '有人想要 %category 吗?', '', '¿Alguien interesado en %category?', '', ''); +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 (597, 'suggest_trade', 'Can anyone help farm %category?', 0, 0, '', 'Est-ce que quelqu’un peut aider à farmer %category?', 'Kann jemand helfen, %category zu farmen?', '有人能帮我刷 %category 吗?', '', '¿Alguien puede ayudar a farmear %category?', '', ''); +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 (598, 'suggest_trade', 'Anyone have %category to sell?', 0, 0, '', 'Est-ce que quelqu’un a %category à vendre?', 'Hat jemand %category zu verkaufen?', '有人有 %category 卖吗?', '', '¿Alguien tiene %category para vender?', '', ''); +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 (599, 'suggest_trade', 'Looking to buy %category, please message me.', 0, 0, '', 'Je cherche à acheter %category, n’hésitez pas à me contacter.', 'Suche %category zu kaufen, bitte Nachricht senden.', '想买 %category,有货请私我。', '', 'Busco comprar %category, por favor mándame un mensaje.', '', ''); +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 (600, 'suggest_trade', 'I am looking for %category. Who has it?', 0, 0, '', 'Je cherche %category. Qui l’a en stock?', 'Ich suche %category. Wer hat es auf Lager?', '我在找 %category,谁有货?', '', 'Estoy buscando %category. ¿Quién lo tiene?', '', ''); +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 (601, 'suggest_trade', 'WTB %category at a fair price.', 0, 0, '', 'Je recherche %category à un prix raisonnable.', 'Kaufe %category zu einem fairen Preis.', '求购 %category,价格合理就行。', '', 'Busco comprar %category a un precio justo.', '', ''); +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 (602, 'suggest_trade', 'Need %category urgently, anyone got it?', 0, 0, '', 'Besoin de %category de toute urgence, est-ce que quelqu’un en a ?', 'Brauche dringend %category, hat es jemand?', '急需 %category,有人有吗?', '', 'Necesito %category urgente, ¿alguien lo tiene?', '', ''); +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 (603, 'suggest_trade', 'Got %category, selling at a low price.', 0, 0, '', 'J’ai trouvé %category, vendu à petit prix.', 'Habe %category, verkaufe es günstig.', '有 %category,低价出售!', '', 'Tengo %category, vendo a un precio bajo.', '', ''); +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 (604, 'suggest_trade', 'Selling %category for a good deal.', 0, 0, '', 'Je vends des %category à bon prix.', 'Verkaufe %category zu einem guten Preis.', '出售 %category,价格很划算。', '', 'Vendo %category a buen precio.', '', ''); +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 (605, 'suggest_trade', 'I’m looking to buy %category, anyone selling cheap?', 0, 0, '', 'Je suis à la recherche de %category, est-ce que quelqu’un en vendrait à bon prix ?', 'Ich suche %category, verkauft es jemand günstig?', '想买 %category,有人便宜卖吗?', '', 'Busco comprar %category, ¿alguien lo vende barato?', '', ''); +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 (606, 'suggest_trade', 'Anyone selling %category? I’m interested.', 0, 0, '', 'Quelqu’un vend de %category ? Ça m’intéresse.', 'Verkauft jemand %category? Bin interessiert.', '有人卖 %category 吗?我感兴趣。', '', '¿Alguien vende %category? Estoy interesado.', '', ''); +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 (607, 'suggest_trade', 'Need %category, please whisper if selling.', 0, 0, '', 'Besoin de la %category, s’il vous plaît wisp me si vous vendez.', 'Brauche %category, bitte flüstert mich an, wenn ihr es verkauft.', '需要 %category,有卖的请私聊我。', '', 'Necesito %category, susúrrame si lo vendes.', '', ''); +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 (608, 'suggest_trade', 'Anyone got extra %category for trade?', 0, 0, '', 'Quelqu’un aurait un %category supplémentaire à échanger?', 'Hat jemand extra %category zum Tauschen?', '有人有多余的 %category 能换吗?', '', '¿Alguien tiene %category extra para intercambiar?', '', ''); +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 (609, 'suggest_trade', 'Looking for %category. Anyone selling?', 0, 0, '', 'À la recherche de %category. Quelqu’un vend-il ?', 'Suche %category. Verkauft jemand?', '找 %category,有人卖吗?', '', 'Busco %category. ¿Alguien lo vende?', '', ''); +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 (610, 'suggest_trade', 'Anyone interested in trading %category?', 0, 0, '', '%category trading, ça vous tente?', 'Hat jemand Interesse, %category zu tauschen?', '有人想换 %category 吗?', '', '¿Alguien interesado en intercambiar %category?', '', ''); +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 (611, 'suggest_trade', 'Selling %category, hit me up for a trade.', 0, 0, '', 'Je vends des %category, n’hésitez pas à me contacter pour faire un échange.', 'Verkaufe %category, meldet euch für einen Tausch.', '卖 %category,想换的找我。', '', 'Vendo %category, contáctame para un intercambio.', '', ''); +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 (612, 'suggest_trade', 'WTB %category, looking for good deals.', 0, 0, '', 'Je recherche des %category à acheter, je souhaite trouver de bonnes affaires.', 'Kaufe %category, suche nach guten Angeboten.', '求购 %category,找个好价格。', '', 'Busco comprar %category, buscando buenas ofertas.', '', ''); +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 (613, 'suggest_trade', 'Who needs %category? I have extras.', 0, 0, '', 'Qui a besoin de %category? J’ai des extras.', 'Wer braucht %category? Habe ein paar übrig.', '谁需要 %category?我有多余的。', '', '¿Quién necesita %category? Tengo extras.', '', ''); +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 (614, 'suggest_trade', 'Anyone wants %category? Selling for cheap.', 0, 0, '', 'Qui veut de la %category? Je vends à bas prix.', 'Wer will %category? Verkaufe günstig.', '有人要 %category 吗?便宜卖。', '', '¿Alguien quiere %category? Lo vendo barato.', '', ''); +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 (615, 'suggest_trade', 'Looking for %category, anyone selling?', 0, 0, '', 'Je recherche des %category, est-ce que quelqu’un en vend?', 'Suche %category, verkauft jemand?', '找 %category,有人卖吗?', '', 'Busco %category, ¿alguien lo vende?', '', ''); +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 (616, 'suggest_trade', 'Anyone need %category? I have some for trade.', 0, 0, '', 'Besoin de %category? J’en ai quelques-uns à échanger.', 'Braucht jemand %category? Habe einige zum Tauschen.', '有人需要 %category 吗?我有些可以换。', '', '¿Alguien necesita %category? Tengo algunos para intercambiar.', '', ''); +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 (617, 'suggest_trade', 'WTB %category. Anyone selling cheaper than AH?', 0, 0, '', 'Je recherche %category. Est-ce que quelqu’un vend moins cher que à l’HV?', 'Kaufe %category. Verkauft jemand günstiger als im AH?', '求购 %category,有人比拍卖行便宜卖吗?', '', 'Busco comprar %category. ¿Alguien lo vende más barato que en la subasta?', '', ''); +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 (618, 'suggest_trade', 'Selling %category cheap, whisper for details.', 0, 0, '', 'Vente de %category à petit prix, chuchotez pour plus de détails.', 'Verkaufe %category günstig, flüstert mich für Details an.', '低价卖 %category,私聊了解详情。', '', 'Vendo %category barato, susúrrame para detalles.', '', ''); +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 (619, 'suggest_trade', 'Anyone needs %category? I have some for sale.', 0, 0, '', 'Besoin de %category ? J’en ai en vente.', 'Braucht jemand %category? Habe einige zum Verkauf.', '有人需要 %category 吗?我有些要卖。', '', '¿Alguien necesita %category? Tengo algunos para vender.', '', ''); +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 (620, 'suggest_trade', 'Looking to trade %category for something else.', 0, 0, '', 'Je cherche à échanger %category contre autre chose.', 'Möchte %category gegen etwas anderes tauschen.', '想用 %category 换点别的东西。', '', 'Busco intercambiar %category por algo más.', '', ''); +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 (621, 'suggest_trade', 'Got %category, willing to trade it for %category.', 0, 0, '', 'J’ai %category, je serais prêt à l’échanger contre %category.', 'Habe %category, tausche es gegen %category.', '有 %category,愿意换成 %category。', '', 'Tengo %category, dispuesto a intercambiarlo por %category.', '', ''); +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 (622, 'suggest_trade', 'WTB %category, anyone has extras?', 0, 0, '', 'Je recherche %category, est-ce que quelqu’un en a en plus ?', 'Suche %category, hat jemand welche übrig?', '求购 %category,有人有多余的吗?', '', 'Busco comprar %category, ¿alguien tiene extras?', '', ''); + +-- random faction rep grind +-- usable placeholders: +-- %my_role +-- %rep_level +-- %rndK +-- %faction +-- %my_class +-- %my_race +-- %my_level +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 (623, 'suggest_faction', 'Anyone farming %faction rep?', 0, 0, '', 'Qui ici farm la réputation de la faction %faction ?', 'Farmt jemand Ruf für %faction?', '有人在刷 %faction 的声望吗?', '', '¿Alguien farmea reputación con %faction?', '', 'Кто фармит репутацию %faction?'); +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 (624, 'suggest_faction', 'Anyone help with %faction?', 0, 0, '', 'Besoin d’aide avec la réputation %faction?', 'Kann jemand bei %faction helfen?', '有人能帮我搞定 %faction 的声望吗?', '', '¿Alguien me ayuda con %faction?', '', 'Кто поможет с %faction?'); +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 (625, 'suggest_faction', 'Wanna quest for %faction.', 0, 0, '', 'Tu veux partir en quête pour la faction %faction?', 'Lust, Quests für %faction zu machen?', '想一起做 %faction 的任务吗?', '', 'Quiero buscar a %faction.', '', 'Хочу квестить ради %faction.'); +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 (626, 'suggest_faction', '%faction is the best.', 0, 0, '', '%faction est la meilleure.', '%faction ist die beste.', '%faction 真是最棒的!', '', '%faction es el mejor.', '', '%faction — лучшая.'); +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 (627, 'suggest_faction', 'Need just a bit to be %rep_level with %faction.', 0, 0, '', 'J’ai juste besoin d’un peu pour être %rep_level avec %faction.', 'Brauche nur noch ein wenig für %rep_level bei %faction.', '还差一点就能跟 %faction 达到 %rep_level 了。', '', 'Solo necesito un poco para estar %rep_level con %faction.', '', 'Нужно чуть-чуть, чтобы стать %rep_level у %faction.'); +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 (628, 'suggest_faction', 'Anyone got %rep_level with %faction?', 0, 0, '', 'Est-ce que quelqu’un a le niveau de réputation %rep_level avec %faction ?', 'Hat jemand schon %rep_level bei %faction?', '有人跟 %faction 达到 %rep_level 了吗?', '', '¿Alguien tiene %rep_level con %faction?', '', 'Кто-нибудь уже %rep_level у %faction?'); +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 (629, 'suggest_faction', 'Who wants to be %rep_level with %faction?', 0, 0, '', 'Qui veut être %rep_level avec %faction?', 'Wer will %rep_level bei %faction erreichen?', '谁想跟 %faction 达到 %rep_level?', '', '¿Quién quiere estar en %rep_level con %faction?', '', 'Кто хочет стать %rep_level у %faction?'); +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 (630, 'suggest_faction', 'I’ll never be %rep_level with %faction.', 0, 0, '', 'Je ne serai jamais %rep_level souhaité avec %faction.', 'Ich werde niemals %rep_level bei %faction erreichen.', '我恐怕永远也跟 %faction 达不到 %rep_level。', '', 'Nunca estaré %rep_level con %faction.', '', ''); +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 (631, 'suggest_faction', 'Someone missing %faction rep?', 0, 0, '', 'Quelqu’un manque de réputation auprès de %faction ?', 'Fehlt jemandem noch Ruf bei %faction?', '有人缺 %faction 的声望吗?', '', '¿Alguien falta reputación con %faction?', '', 'Кто-то не хватает репы у %faction?'); +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 (632, 'suggest_faction', 'Could help farming %faction rep.', 0, 0, '', 'Je peux t’aider à augmenter ta réputation avec %faction.', 'Ich kann beim Farmen von %faction-Ruf helfen.', '我能帮忙刷 %faction 的声望。', '', 'Podría ayudar a farmear %faction rep.', '', 'Могу помочь с фармом репы %faction.'); +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 (633, 'suggest_faction', 'The more rep the better. Especially with %faction.', 0, 0, '', 'Plus il y a de réput, mieux c’est. Surtout avec %faction', 'Je mehr Ruf, desto besser. Besonders bei %faction.', '声望越高越好,特别是跟 %faction 的。', '', 'Cuantas más repeticiones, mejor. Especialmente con %faction.', '', 'Чем больше репы, тем лучше. Особенно у %faction.'); +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 (634, 'suggest_faction', '%faction: need %rndK for %rep_level.', 0, 0, '', '%faction: J’ai besoin de %rndK pour %rep_level.', '%faction: Brauche %rndK für %rep_level.', '%faction:还差 %rndK 就能到 %rep_level。', '', '%faction: necesita %rndK para %rep_level.', '', '%faction: нужно %rndK для %rep_level.'); +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 (635, 'suggest_faction', 'Who can share %faction quests?', 0, 0, '', 'Qui peut partager les quêtes de %faction?', 'Wer kann %faction-Quests teilen?', '谁能分享一下 %faction 的任务?', '', '¿Quién puede compartir misiones de %faction?', '', 'Кто может поделиться квестами %faction?'); +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 (636, 'suggest_faction', 'Any dungeons for %faction?', 0, 0, '', 'Des donjons pour %faction ?', 'Gibt es Dungeons für %faction?', '有给 %faction 刷声望的副本吗?', '', '¿Alguna mazmorra para %faction?', '', 'Есть подземелья для %faction?'); +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 (637, 'suggest_faction', 'Wanna do %faction rep grind.', 0, 0, '', 'Je veux monter ma réputation avec la %faction.', 'Ich will Ruf farmen für %faction.', '想一起刷 %faction 的声望吗?', '', 'Quiero hacer %faction rep grind.', '', 'Хочу фармить репу %faction.'); +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 (638, 'suggest_faction', 'Let’s farm %faction rep!', 0, 0, '', 'On va monter la réputation de la %faction !', 'Lass uns %faction-Ruf farmen!', '咱们一起刷 %faction 声望吧!', '', '¡Vamos a farmear reputación con %faction!', '', ''); +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 (639, 'suggest_faction', 'Farming for %faction rep.', 0, 0, '', 'Je fais du farm pour gagner de la réputation auprès de %faction.', 'Ich farme Ruf für %faction.', '正在刷 %faction 的声望。', '', 'Farming for %faction rep.', '', 'Фармлю репу %faction.'); +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 (640, 'suggest_faction', 'Wanna farm for %faction.', 0, 0, '', 'Envie de farmer pour %faction ?', 'Lust, %faction zu farmen?', '想刷 %faction 的声望吗?', '', 'Quiero farmear para %faction.', '', 'Хочу пофармить %faction.'); +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 (641, 'suggest_faction', 'Need help with %faction.', 0, 0, '', 'Besoin d’aide avec %faction.', 'Brauche Hilfe mit %faction.', '需要帮忙搞定 %faction 的声望。', '', 'Necesito ayuda con %faction.', '', 'Нужна помощь с %faction.'); +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 (642, 'suggest_faction', 'Is %faction sells something useful?', 0, 0, '', 'Est-ce que %faction vend quelque chose d’utile ?', 'Verkauft %faction etwas Nützliches?', '%faction 有卖什么有用的东西吗?', '', '¿%faction vende algo útil?', '', '%faction что-то полезное продает?'); +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 (643, 'suggest_faction', 'Are there %faction vendors?', 0, 0, '', 'Y a-t-il des vendeurs de %faction ?', 'Gibt es Händler für %faction?', '有 %faction 的商人吗?', '', '¿Hay %proveedores de facciones?', '', 'Есть ли у %faction торговцы?'); +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 (644, 'suggest_faction', 'Who farms %faction?', 0, 0, '', 'Ah, qui farm %faction?', 'Wer farmt %faction?', '谁在刷 %faction 的声望?', '', '¿Quién farmea %faction?', '', 'Кто фармит %faction?'); +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 (645, 'suggest_faction', 'Which is the best way to farm %faction?', 0, 0, '', 'Quelle est la meilleurs façon de farmer %faction ?', 'Was ist die beste Methode, um %faction zu farmen?', '刷 %faction 声望最好的方法是什么?', '', '¿Cuál es la mejor manera de farmear %faction?', '', 'Как лучше всего фармить %faction?'); +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 (646, 'suggest_faction', 'I hate %faction rep grind.', 0, 0, '', 'Je déteste ce fichu grind de réputation pour %faction.', 'Ich hasse das Ruf-Farmen für %faction.', '我真是讨厌刷 %faction 的声望。', '', 'Odio %repetir de facción', '', 'Ненавижу фарм репы %faction.'); +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 (647, 'suggest_faction', 'I am so tired of %faction.', 0, 0, '', 'Je suis tellement fatigué de cette %faction.', 'Ich bin so müde von %faction.', '我真是受够了 %faction。', '', 'Estoy tan cansado de %faction.', '', 'Я так устал от %faction.'); +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 (648, 'suggest_faction', 'Go for %faction?', 0, 0, '', 'Allez pour la %faction!', 'Gehen wir für %faction?', '去刷 %faction 吗?', '', '¿Quereis ir a por %faction?', '', 'Пойдем за %faction?'); +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 (649, 'suggest_faction', 'Seems everyone is %rep_level with %faction. Only me is late as usually.', 0, 0, '', 'Il semble que tout le monde soit au niveau %rep_level avec la faction %faction. Et bien sûr, je suis en retard comme d’habitude.', 'Sieht so aus, als wären alle %rep_level bei %faction. Nur ich bin wie immer zu spät.', '好像大家都跟 %faction 达到 %rep_level 了,就我一如既往地落后。', '', 'Parece que todo el mundo está %rep_level con %faction. Solo yo llego tarde como siempre.', '', 'Кажется, все уже %rep_level у %faction. Только я, как обычно, опаздываю.'); +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 (650, 'suggest_faction', 'LFG for %faction rep grind?', 0, 0, '', 'Je recherche un groupe pour %faction rep grind !', 'Suche Gruppe für %faction Ruf-Farm!', '找人一起刷 %faction 的声望吗?', '', 'Busco grupo para subir reputación con %faction', '', 'ЛФГ для фарма репы %faction?'); +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 (651, 'suggest_faction', 'Can anobody suggest a good spot for %faction rep grind?', 0, 0, '', 'Est-ce que quelqu’un peut me recommander un bon endroit pour gagner de la réputation avec %faction?', 'Kann jemand einen guten Spot für %faction Ruf-Farm empfehlen?', '有谁能推荐个刷 %faction 声望的好地方?', '', '¿Alguien puede sugerir un buen lugar farmear reputacion con %faction?', '', 'Кто-нибудь подскажет хорошее место для фарма репы %faction?'); +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 (652, 'suggest_faction', 'Would %faction rep benefit me?', 0, 0, '', 'Est-ce que la réputation de %faction me sera bénéfique ?', 'Bringt mir der Ruf bei %faction etwas?', '刷 %faction 的声望对我有好处吗?', '', '¿Me beneficiaría subir reputación con %faction?', '', 'Будет ли польза от репы %faction?'); +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 (653, 'suggest_faction', 'Who would’ve thought that %faction rep will be useful after all...', 0, 0, '', 'Qui aurait pensé que cette réputation %faction serait finalement utile...', 'Wer hätte gedacht, dass Ruf bei %faction doch nützlich ist...', '谁能想到 %faction 的声望竟然还真有用……', '', 'Quién hubiera pensado que subir reputacion con %faction sería útil después de todo...', '', ''); +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 (654, 'suggest_faction', 'I wanna be exalted with all factions, starting with %faction.', 0, 0, '', 'Je veux être honoré par toutes les factions, commençant par %faction.', 'Ich will bei allen Fraktionen ehrfürchtig sein, angefangen mit %faction.', '我想跟所有阵营都达到崇拜,先从 %faction 开始!', '', 'Quiero ser exaltado con todas las facciones, comenzando con %faction.', '', 'Хочу быть превознесенным у всех фракций, начну с %faction.'); +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 (655, 'suggest_faction', 'Is there any point to improve my rep with %faction?', 0, 0, '', 'Est-ce que ça vaut la peine d’améliorer ma réputation avec la faction %faction ?', 'Lohnt es sich, meinen Ruf bei %faction zu verbessern?', '提高 %faction 的声望有意义吗?', '', '¿Hay algún punto para mejorar mi reputación con %faction?', '', 'Есть ли смысл повышать репу с %faction?'); +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 (656, 'suggest_faction', 'What is better for %faction? Quests or mob grinding?', 0, 0, '', 'Pour %faction, il vaut mieux grind des mobs ou faire des quêtes ?', 'Was ist besser für %faction? Quests oder Mob-Farming?', '刷 %faction 声望,做任务好还是刷怪好?', '', '¿Qué es mejor para %faction? ¿Misiones o mafiosos?', '', 'Что лучше для %faction? Квесты или фарм мобов?'); +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 (657, 'suggest_faction', 'Will grind %faction rep for you. Just give me some gold.', 0, 0, '', 'Je vais augmenter la réputation de %faction pour toi. Il me suffit de me donner un peu d’or.', 'Ich farme %faction-Ruf für dich. Gib mir einfach etwas Gold.', '我可以帮你刷 %faction 声望,给点金币就行。', '', 'Ganare reputacion con %faction por ti. Sólo dame un poco de oro.', '', 'Пофармлю репу %faction для тебя. Только дай немного золота.'); +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 (658, 'suggest_faction', 'I think grinding rep with %faction would take forever.', 0, 0, '', 'Je pense que monter ma réputation avec %faction prendrait une éternité.', 'Ich glaube, Ruf farmen für %faction dauert ewig.', '我觉得刷 %faction 声望得花一辈子时间。', '', 'Creo que subir la reputación con %faction tomaría una eternidad.', '', 'Думаю, фармить репу %faction — это навсегда.'); +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 (659, 'suggest_faction', 'I am killing for %faction every day now but still far from %rep_level.', 0, 0, '', 'Je fais des missions pour la %faction tous les jours, mais je suis encore loin du niveau de réputation %rep_level.', 'Ich töte für %faction jeden Tag, aber bin noch weit entfernt von %rep_level.', '我现在每天都在为 %faction 杀怪,但离 %rep_level 还差得远。', '', 'Estoy matando por %faction todos los días ahora, pero aún estoy lejos del %rep_level.', '', 'Я убиваю ради %faction каждый день, но все еще далеко до %rep_level.'); +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 (660, 'suggest_faction', 'At %my_level AH deposits will decrease, right?', 0, 0, '', 'À mon niveau %my_level, les dépôts AH vont diminuer, n’est-ce pas ?', 'Auf %my_level werden die Auktionshausgebühren sinken, oder?', '到 %my_level 拍卖行的手续费会降低,对吧?', '', 'Al %rep_level, los depósitos subastas disminuirán, ¿verdad?', '', 'На %my_level депозиты на аукционе уменьшатся, да?'); +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 (661, 'suggest_faction', 'How many exalted reps do you have?', 0, 0, '', 'Combien de représentants exaltés avez-vous?', 'Wie viele ehrfürchtige Rufe hast du?', '你有多少个崇拜的声望?', '', '¿Cuántas reputaciones exaltadas tienes?', '', 'Сколько у тебя превознесенных реп?'); +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 (662, 'suggest_faction', 'Who wants to be %my_level with %faction?', 0, 0, '', 'Qui veut être %my_level avec %faction?', 'Wer will %my_level bei %faction erreichen?', '有谁想跟我一起把 %faction 刷到 %my_level?', '', '¿Quién quiere estar en %rep_level con %faction?', '', 'Кто хочет быть %my_level у %faction?'); +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 (663, 'suggest_faction', 'Damn. My guild did a good %faction grind yesterday without me.', 0, 0, '', 'Mince. Mon groupe a bien grindé la réputation %faction hier sans moi.', 'Verdammt. Meine Gilde hat gestern ordentlich %faction gefarmt ohne mich.', '靠!我的公会昨天没带我去刷 %faction 声望,刷得还挺好。', '', 'Maldición. Mi hermandad hizo un buen farmeo de %faction ayer sin mí.', '', 'Черт. Моя гильдия вчера хорошо пофармила %faction без меня.'); +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 (664, 'suggest_faction', 'Nobody wants to help me because I am %rep_level with %faction.', 0, 0, '', 'Personne ne veut m’aider parce que je suis %rep_level avec %faction.', 'Niemand will mir helfen, weil ich %rep_level bei %faction bin.', '没人愿意帮我,就因为我跟 %faction 才 %rep_level。', '', 'Nadie quiere ayudarme porque estoy %rep_level con %faction.', '', 'Никто не хочет мне помогать, потому что я %rep_level у %faction.'); +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 (665, 'suggest_faction', 'Please stay away from %faction.', 0, 0, '', 'S’il te plaît, garde tes distances avec %faction.', 'Bitte halte dich von %faction fern.', '请离 %faction 远点。', '', 'Por favor manténgase alejado de %faction.', '', 'Пожалуйста, держись подальше от %faction.'); +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 (666, 'suggest_faction', 'Anyone farming %faction rep today?', 0, 0, '', 'Vous êtes en train de farmer la réputation de %faction aujourd’hui ?', 'Farmt heute jemand %faction-Ruf?', '今天有谁在刷 %faction 声望吗?', '', '¿Alguien farmea reputación de %faction hoy?', '', ''); +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 (667, 'suggest_faction', 'Help me grind %faction rep!', 0, 0, '', 'Aide-moi à augmenter ma réputation avec la faction %faction!', 'Hilf mir, %faction-Ruf zu farmen!', '帮我刷 %faction 声望吧!', '', '¡Ayúdame a subir mi reputación con %faction!', '', ''); +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 (668, 'suggest_faction', 'I need %rep_level with %faction so badly!', 0, 0, '', 'J’ai tellement besoin d’atteindre le niveau %rep_level avec la faction %faction !', 'Ich brauche unbedingt %rep_level bei %faction!', '我急需把 %faction 刷到 %rep_level!', '', '¡Necesito %rep_level con %faction con urgencia!', '', ''); +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 (669, 'suggest_faction', 'Is %faction grind worth it?', 0, 0, '', 'Est-ce que le farm de %faction vaut vraiment la peine?', 'Lohnt sich das Farmen für %faction?', '刷 %faction 声望值得吗?', '', '¿Vale la pena el farmeo de %faction?', '', ''); +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 (670, 'suggest_faction', 'Anyone know %faction rep farm spots?', 0, 0, '', 'Je connais des endroits pour %faction pour augmenter ma réputation.', 'Kennt jemand gute Spots zum %faction-Ruf farmen?', '有谁知道刷 %faction 声望的好地方吗?', '', '¿Alguien conoce lugares para farmear reputación con %faction?', '', ''); +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 (671, 'suggest_faction', 'I love grinding %faction rep!', 0, 0, '', 'J’adore augmenter ma réputation auprès de la faction %!', 'Ich liebe es, %faction-Ruf zu farmen!', '我超爱刷 %faction 声望!', '', '¡Me encanta hacer grind de reputación con %faction!', '', ''); +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 (672, 'suggest_faction', 'Need help to finish %faction rep grind!', 0, 0, '', 'Besoin d’aide pour finir ma montée de réputation avec %faction!', 'Brauche Hilfe, um meinen %faction-Ruf-Farm abzuschließen!', '需要帮忙把 %faction 声望刷完!', '', '¡Necesito ayuda para terminar el grind de reputación de %faction!', '', ''); +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 (673, 'suggest_faction', 'Only a few more %rep_level with %faction to go!', 0, 0, '', 'Il ne me reste que quelques niveaux de réputation à faire avec %faction !', 'Nur noch ein paar %rep_level bei %faction zu erreichen!', '只差一点就能把 %faction 刷到 %rep_level 了!', '', '¡Solo me faltan unos %rep_level para llegar a %faction!', '', ''); +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 (674, 'suggest_faction', 'Anyone up for %faction grind today?', 0, 0, '', 'Quelqu’un est motivé pour farmer la réputation de la %faction aujourd’hui?', 'Hat heute jemand Lust auf %faction-Ruf farmen?', '今天有人想一起刷 %faction 声望吗?', '', '¿Alguien se anima al farmeo de %faction hoy?', '', ''); +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 (675, 'suggest_faction', 'Looking for %faction rep grind buddies!', 0, 0, '', 'À la recherche de compagnons de réputation de %faction! Qui est partant pour monter les réputations ensemble?', 'Suche Mitstreiter für %faction-Ruf farmen!', '找几个一起刷 %faction 声望的小伙伴!', '', 'Busco compañeros para farmear %faction.', '', ''); +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 (676, 'suggest_faction', 'I’m tired of grinding %faction rep!', 0, 0, '', 'J’en ai marre de faire monter ma réputation auprès de la faction %faction !', 'Ich habe genug vom %faction-Ruf farmen!', '我刷 %faction 声望刷到累死了!', '', '¡Estoy cansado de hacer grind de %faction!', '', ''); +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 (677, 'suggest_faction', 'Anyone on %faction rep grind too?', 0, 0, '', 'Oh, quelqu’un d’autre qui est en train de monter sa réputation avec %faction ?', 'Ist noch jemand dabei, %faction-Ruf zu farmen?', '还有人在刷 %faction 声望吗?', '', '¿Alguien más está haciendo el grind de %faction?', '', ''); +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 (678, 'suggest_faction', 'Time to hit %faction rep grind hard!', 0, 0, '', 'C’est le moment de faire le grind %faction sérieusement !', 'Zeit, den %faction-Ruf richtig zu farmen!', '是时候认真刷 %faction 声望了!', '', '¡Es hora de darle duro al grind de %faction!', '', ''); +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 (679, 'suggest_faction', 'Help me finish %faction rep!', 0, 0, '', 'Aide-moi à terminer ma réputation de faction !', 'Hilf mir, den %faction-Ruf abzuschließen!', '帮我把 %faction 声望刷完吧!', '', '¡Ayúdame a completar la reputación de %faction!', '', ''); +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 (680, 'suggest_faction', 'Need just %rndK more for %faction rep!', 0, 0, '', 'Il ne me manque plus que %rndK pour augmenter ma réputation auprès de la faction!', 'Brauche nur noch %rndK für den %faction-Ruf!', '只差 %rndK 就能提升 %faction 声望了!', '', '¡Solo me faltan %rndK para la reputación de %faction!', '', ''); +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 (681, 'suggest_faction', 'Grinding %faction rep all day!', 0, 0, '', 'À farmer la réputation de la faction toute la journée !', 'Den ganzen Tag %faction-Ruf farmen!', '今天一整天都在刷 %faction 声望!', '', '¡Farmearé la reputación de %faction todo el día!', '', ''); +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 (682, 'suggest_faction', 'Almost at %rep_level with %faction!', 0, 0, '', 'Je suis presque au niveau %rep_level avec la faction %faction !', 'Fast %rep_level bei %faction erreicht!', '快到 %faction 的 %rep_level 了!', '', '¡Casi al %rep_level con %faction!', '', ''); +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 (683, 'suggest_faction', '%faction rep grind never ends!', 0, 0, '', 'La réputation de faction, c’est jamais fini !', 'Das %faction-Ruf farmen nimmt kein Ende!', '%faction 声望刷到天荒地老也刷不完!', '', '¡El grind de reputación de %faction nunca termina!', '', ''); +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 (684, 'suggest_faction', 'Help with %faction daily quests?', 0, 0, '', 'Besoin d’aide avec les quêtes journalières de %faction ?', 'Brauche Hilfe mit den täglichen Quests für %faction!', '有谁能帮我做 %faction 的日常任务?', '', '¿Ayuda con las misiones diarias de %faction?', '', ''); +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 (685, 'suggest_faction', 'Who’s on %faction grind right now?', 0, 0, '', 'Qui est en train de faire du %faction en ce moment ?', 'Wer farmt gerade %faction-Ruf?', '谁现在正在刷 %faction 声望?', '', '¿Quién está farmeando %faction ahora?', '', ''); +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 (686, 'suggest_faction', 'Let’s do %faction quests together!', 0, 0, '', 'Faisons des quêtes de faction ensemble!', 'Lasst uns zusammen %faction-Quests machen!', '一起去做 %faction 的任务吧!', '', '¡Hagamos las misiones de %faction juntos!', '', ''); +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 (687, 'suggest_faction', 'Anyone farming %faction rep today?', 0, 0, '', 'Quelqu’un farme la réputation de la faction %faction aujourd’hui?', 'Farmt heute jemand %faction-Ruf?', '今天有人刷 %faction 声望吗?', '', '¿Alguien está farmeando reputación con %faction hoy?', '', ''); +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 (688, 'suggest_faction', 'Need %faction rep help for %rep_level!', 0, 0, '', 'Besoin d’aide pour la réputation de %faction %rep_level %rep_level !', 'Brauche Hilfe für %faction-Ruf bis %rep_level!', '需要帮我把 %faction 声望刷到 %rep_level!', '', '¡Necesito ayuda con la reputación de %faction para %rep_level!', '', ''); +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 (689, 'suggest_faction', 'Who wants to grind %faction rep with me?', 0, 0, '', 'Qui veut faire monter notre réputation auprès de %faction avec moi?', 'Wer will mit mir %faction-Ruf farmen?', '有谁想跟我一起刷 %faction 声望?', '', '¿Quién quiere farmeo de %faction conmigo?', '', ''); +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 (690, 'suggest_faction', 'Come join me for %faction rep grind!', 0, 0, '', 'Viens me rejoindre pour %faction rep grind!', 'Komm, schließ dich mir beim %faction-Ruf farmen an!', '快来跟我一起刷 %faction 声望!', '', '¡Ven a unirte a mí para el grind de reputación de %faction!', '', ''); +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 (691, 'suggest_faction', 'On a roll with %faction rep grind!', 0, 0, '', 'En plein dans la montée de réputation de la %faction !', 'Bin voll dabei beim %faction-Ruf farmen!', '刷 %faction 声望刷得正起劲!', '', '¡Estoy avanzando mucho con el grind de %faction!', '', ''); +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 (692, 'suggest_faction', 'Anyone want %faction rep grind boosts?', 0, 0, '', 'Qui est intéressé par des boosts pour monter sa réputation auprès de la faction ?', 'Wer braucht einen Boost für %faction-Ruf?', '有谁需要我帮忙加速刷 %faction 声望?', '', '¿Alguien quiere ayudas para el grind de %faction?', '', ''); +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 (693, 'suggest_faction', 'Just hit %rep_level with %faction!', 0, 0, '', 'Je viens d’atteindre le niveau de réputation %rep_level avec la faction %faction !', 'Gerade %rep_level bei %faction erreicht!', '刚把 %faction 刷到 %rep_level!', '', '¡Acabo de alcanzar %rep_level con %faction!', '', ''); +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 (694, 'suggest_faction', '%faction is so close to %rep_level, help me out!', 0, 0, '', 'La faction est tellement proche du niveau de réputation, aidez-moi !', '%faction ist so nah an %rep_level, helft mir!', '%faction 声望离 %rep_level 就差一点,帮帮我!', '', '¡%faction está tan cerca de %rep_level, ayúdame!', '', ''); +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 (695, 'suggest_faction', 'Wanna help me grind %faction rep?', 0, 0, '', 'Tu veux m’aider à monter ma réputation %faction ?', 'Willst du mir helfen, %faction-Ruf zu farmen?', '想帮我刷 %faction 声望吗?', '', '¿Quieres ayudarme a farmear reputación de %faction?', '', ''); +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 (696, 'suggest_faction', 'Farming %faction rep again!', 0, 0, '', 'Encore en train de gagner de la réputation avec %faction grâce à l’agriculture !', 'Schon wieder %faction-Ruf farmen!', '又在刷 %faction 声望了!', '', '¡Farmear reputación de %faction otra vez!', '', ''); +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 (697, 'suggest_faction', 'Anyone know a good spot for %faction rep?', 0, 0, '', 'Est-ce que quelqu’un sait un bon endroit pour augmenter ma réputation avec %faction?', 'Kennt jemand einen guten Spot für %faction-Ruf?', '有谁知道刷 %faction 声望的好地方?', '', '¿Alguien conoce un buen lugar para farmear %faction?', '', ''); +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 (698, 'suggest_faction', 'How much more for %faction rep grind?', 0, 0, '', 'Combien de plus pour monter ma réputation avec la faction %faction ?', 'Wie viel fehlt noch für den %faction-Ruf?', '刷 %faction 声望还差多少?', '', '¿Cuánto más para terminar el grind de %faction?', '', ''); +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 (699, 'suggest_faction', 'Anyone doing %faction quests with me?', 0, 0, '', '%Quelqu’un pour faire des quêtes de faction avec moi ?', 'Wer macht %faction-Quests mit mir?', '有谁跟我一起做 %faction 的任务?', '', '¿Alguien haciendo misiones de %faction conmigo?', '', ''); +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 (700, 'suggest_faction', 'Looking for %rep_level %faction rep grind!', 0, 0, '', 'Je recherche un moyen d’augmenter ma réputation avec la faction %faction de niveau %rep_level !', 'Suche eine Möglichkeit, %rep_level bei %faction zu farmen!', '找人一起刷 %faction 声望到 %rep_level!', '', 'Busco %rep_level para el grind de %faction!', '', ''); +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 (701, 'suggest_faction', 'Only need %rndK more %faction rep!', 0, 0, '', 'J’ai seulement besoin de %rndK de plus de réputation avec %faction!', 'Brauche nur noch %rndK für %faction-Ruf!', '只差 %rndK 就能提升 %faction 声望了!', '', '¡Solo necesito %rndK más de reputación con %faction!', '', ''); +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 (702, 'suggest_faction', '%faction grind is real!', 0, 0, '', 'La course à la réputation est intense!', 'Der %faction-Ruf grind ist real!', '刷 %faction 声望真是累死人!', '', '¡El grind de %faction es real!', '', ''); +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 (703, 'suggest_faction', 'Anyone farming %faction rep for %rep_level?', 0, 0, '', '%Est-ce que quelqu’un fait de l’agriculture de réputation de faction pour atteindre le niveau de réputation %rep_level?', 'Farmt jemand %faction-Ruf für %rep_level?', '有谁在刷 %faction 声望到 %rep_level?', '', '¿Alguien farmeando %faction para %rep_level?', '', ''); +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 (704, 'suggest_faction', 'Let’s do %faction rep grind together!', 0, 0, '', 'Hey, on va augmenter notre réputation avec la %faction ensemble !', 'Lasst uns gemeinsam %faction-Ruf farmen!', '一起刷 %faction 声望吧!', '', '¡Hagamos juntos el grind de reputación de %faction!', '', ''); +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 (705, 'suggest_faction', 'More %faction rep, more rewards!', 0, 0, '', 'Plus de réputation auprès de la faction, plus de récompenses !', 'Mehr %faction-Ruf, mehr Belohnungen!', '刷 %faction 声望越多,奖励越多!', '', '¡Más reputación de %faction, más recompensas!', '', ''); +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 (706, 'suggest_faction', 'Farming %faction rep with %my_class', 0, 0, '', 'Je monte ma réputation avec la faction agricole en jouant avec ma classe.', 'Farme %faction-Ruf mit %my_class.', '用我的 %my_class 刷 %faction 声望!', '', 'Farmeando reputación con %faction con %my_class', '', ''); +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 (707, 'suggest_faction', 'Anyone else stuck at %rep_level with %faction?', 0, 0, '', 'Je suis coincé au niveau %rep_level avec la faction %faction. Vous aussi?', 'Hängt noch jemand bei %rep_level mit %faction fest?', '还有人卡在 %faction 的 %rep_level 吗?', '', '¿Alguien más atascado en %rep_level con %faction?', '', ''); +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 (708, 'suggest_faction', 'Doing %faction rep grind all night long!', 0, 0, '', 'À enchaîner les quêtes pour ma réputation auprès de la faction toute la nuit !', 'Die ganze Nacht %faction-Ruf farmen!', '通宵刷 %faction 声望!', '', '¡Voy a farmear reputación de %faction toda la noche!', '', ''); +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 (709, 'suggest_faction', 'Who wants to finish %faction rep grind with me?', 0, 0, '', 'Qui veut finir la réputation de %faction avec moi ?', 'Wer will den %faction-Ruf grind mit mir abschließen?', '有谁想跟我一起把 %faction 声望刷完?', '', '¿Quién quiere terminar el grind de %faction conmigo?', '', ''); +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 (710, 'suggest_faction', 'I can help with %faction rep grind!', 0, 0, '', 'Je peux t’aider avec la montée de réputation de %faction!', 'Ich kann beim %faction-Ruf grind helfen!', '我可以帮你刷 %faction 声望!', '', '¡Puedo ayudar con el grind de reputación de %faction!', '', ''); +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 (711, 'suggest_faction', 'I’m ready for more %faction rep grind!', 0, 0, '', 'Je suis prêt à gagner davantage de réputation auprès de la %faction !', 'Bin bereit für mehr %faction-Ruf farmen!', '我准备好继续刷 %faction 声望了!', '', '¡Estoy listo para más grind de reputación de %faction!', '', ''); +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 (712, 'suggest_faction', 'Wanna help with %faction rep? I need it bad!', 0, 0, '', 'Tu veux de l’aide pour %faction rep? J’en ai vraiment besoin!', 'Willst du mir bei %faction-Ruf helfen? Ich brauche es dringend!', '能帮我刷 %faction 声望吗?我真的很需要!', '', '¿Quieres ayudarme con %faction rep? ¡Lo necesito mucho!', '', ''); +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 (713, 'suggest_faction', 'I need %rndK more for %faction rep!', 0, 0, '', 'Il me manque %rndK de plus pour augmenter ma réputation avec %faction !', 'Ich brauche noch %rndK für %faction-Ruf!', '我还差 %rndK 就能提升 %faction 声望!', '', '¡Me faltan %rndK para la reputación de %faction!', '', ''); +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 (714, 'suggest_faction', 'Farm with me for %faction rep!', 0, 0, '', 'Viens faire de l’agriculture avec moi pour gagner de la réputation auprès de ma faction!', 'Farmt mit mir für %faction-Ruf!', '跟我一起刷 %faction 声望吧!', '', '¡Farmea conmigo para reputación de %faction!', '', ''); +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 (715, 'suggest_faction', 'I just need %rndK more %faction rep!', 0, 0, '', 'Il ne me manque plus que %rndK de réputation avec %faction!', 'Ich brauche nur noch %rndK für %faction-Ruf!', '我只差 %rndK 就能提升 %faction 声望了!', '', '¡Solo necesito %rndK más de %faction!', '', ''); +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 (716, 'suggest_faction', 'Doing %faction rep grind is never-ending...', 0, 0, '', 'Faire le farming de réputation pour la %faction n’en finit jamais...', '%faction-Ruf farmen hört einfach nie auf...', '刷 %faction 声望简直没完没了……', '', 'El grind de %faction nunca termina...', '', ''); +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 (717, 'suggest_faction', 'Anyone got %faction rep boost items?', 0, 0, '', 'Est-ce que quelqu’un a des objets de boost de réputation de %faction ?', 'Hat jemand Ruf-Boost-Gegenstände für %faction?', '有谁有加速 %faction 声望的道具?', '', '¿Alguien tiene objetos para boostear reputación de %faction?', '', ''); +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 (718, 'suggest_faction', 'I need %rep_level %faction to unlock cool rewards!', 0, 0, '', 'J’ai besoin d’atteindre le niveau %rep_level auprès de la faction %faction pour débloquer des récompenses géniales!', 'Ich brauche %rep_level bei %faction, um coole Belohnungen freizuschalten!', '我需要把 %faction 刷到 %rep_level 才能解锁超酷的奖励!', '', '¡Necesito %rep_level de %faction para desbloquear buenas recompensas!', '', ''); +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 (719, 'suggest_faction', 'Anyone doing %faction rep for mounts?', 0, 0, '', 'Qui est en train de monter sa réputation avec %faction pour les montures?', 'Wer farmt %faction-Ruf für Mounts?', '有谁在刷 %faction 声望是为了坐骑?', '', '¿Alguien farmeando reputación de %faction para monturas?', '', ''); +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 (720, 'suggest_faction', 'Any chance to farm %faction rep with me?', 0, 0, '', 'Tu veux farmer ta réputation avec la faction %faction avec moi?', 'Lust, mit mir %faction-Ruf zu farmen?', '有机会跟我一起刷 %faction 声望吗?', '', '¿Algún chance de farmear reputación de %faction conmigo?', '', ''); +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 (721, 'suggest_faction', 'I am so close to %rep_level with %faction!', 0, 0, '', 'Je suis tellement proche du niveau %rep_level avec la faction %faction !', 'Ich bin so nah an %rep_level bei %faction!', '我离 %faction 的 %rep_level 就差一点了!', '', '¡Estoy tan cerca de %rep_level con %faction!', '', ''); +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 (722, 'suggest_faction', 'Help me get %rep_level with %faction!', 0, 0, '', 'Aide-moi à atteindre le niveau de réputation %rep_level avec %faction !', 'Hilf mir, %rep_level bei %faction zu erreichen!', '帮我把 %faction 声望刷到 %rep_level!', '', '¡Ayúdame a conseguir %rep_level con %faction!', '', ''); +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 (723, 'suggest_faction', 'Getting %faction rep grind done!', 0, 0, '', 'Je suis en train de grinder ma réputation avec la faction %faction !', 'Ich bin dabei, den %faction-Ruf grind abzuschließen!', '正在努力刷完 %faction 声望!', '', '¡Estoy terminando el grind de reputación de %faction!', '', ''); +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 (724, 'suggest_faction', 'I’m in need of %faction rep grinding help!', 0, 0, '', 'J’ai besoin d’aide pour augmenter ma réputation avec %faction !', 'Ich brauche Hilfe beim %faction-Ruf farmen!', '我需要帮手刷 %faction 声望!', '', '¡Necesito ayuda con el grind de %faction!', '', ''); +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 (725, 'suggest_faction', 'Need %rep_level %faction for the next rewards!', 0, 0, '', 'J’ai besoin d’atteindre le niveau %rep_level pour %faction afin de débloquer les prochaines récompenses !', 'Brauche %rep_level bei %faction für die nächsten Belohnungen!', '我得把 %faction 的声望刷到 %rep_level 才能拿到下个奖励!', '', '¡Necesito %rep_level de %faction para las siguientes recompensas!', '', ''); +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 (726, 'suggest_faction', 'Who can farm %faction rep with me?', 0, 0, '', 'Qui peut farmer la réputation de %faction avec moi ?', 'Wer kann mit mir %faction-Ruf farmen?', '有谁能跟我一起刷 %faction 的声望啊?', '', '¿Quién puede farmear la reputación de %faction conmigo?', '', ''); +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 (727, 'suggest_faction', 'Grinding %faction rep non-stop!', 0, 0, '', 'En train de farmer la réputation de %faction sans arrêt !', 'Ununterbrochen %faction-Ruf farmen!', '一直在拼命刷 %faction 声望,停不下来!', '', '¡Grind de %faction sin parar!', '', ''); +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 (728, 'suggest_faction', 'Who else is grinding %faction rep right now?', 0, 0, '', 'Je suis en train de bosser le rang de réputation de %faction en ce moment. Qui d’autre est dans le même cas ?', 'Wer farmt gerade auch %faction-Ruf?', '现在还有谁在刷 %faction 的声望?', '', '¿Quién más está farmeando %faction ahora?', '', ''); +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 (729, 'suggest_faction', 'Anyone want to farm %faction rep for fun?', 0, 0, '', 'Qui est partant pour monter la réputation de la faction %faction pour le plaisir ?', 'Wer hat Lust, zum Spaß %faction-Ruf zu farmen?', '有没人想一起刷 %faction 声望,纯属娱乐?', '', '¿Alguien quiere farmear %faction por diversión?', '', ''); +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 (730, 'suggest_faction', 'Need %faction rep grind to unlock new quests!', 0, 0, '', 'Il me faut améliorer ma réputation auprès de %faction pour débloquer de nouvelles quêtes!', 'Muss %faction-Ruf farmen, um neue Quests freizuschalten!', '得刷 %faction 声望才能解锁新任务!', '', '¡Necesito hacer grind de %faction para desbloquear nuevas misiones!', '', ''); +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 (731, 'suggest_faction', 'Wanna grind %faction rep for rewards!', 0, 0, '', 'Je veux faire monter ma réputation auprès de %faction pour obtenir des récompenses !', 'Will %faction-Ruf farmen für Belohnungen!', '想刷 %faction 声望拿奖励,有人一起吗?', '', '¡Vamos a grindear reputación de %faction por recompensas!', '', ''); +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 (732, 'suggest_faction', 'Grinding %faction rep, one day at a time!', 0, 0, '', 'À faire ma réputation avec %faction, un jour à la fois !', 'Einen Tag nach dem anderen %faction-Ruf farmen!', '每天刷一点 %faction 声望,慢慢来!', '', '¡Farmeando reputación de %faction, un día a la vez!', '', ''); +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 (733, 'suggest_faction', 'Anyone want to help with %faction rep grind?', 0, 0, '', 'Est-ce que quelqu’un veut m’aider à augmenter ma réputation auprès de %faction ?', 'Kann mir jemand beim %faction-Ruf farmen helfen?', '有人愿意帮我刷 %faction 声望吗?', '', '¿Alguien quiere ayudar con el grind de %faction?', '', ''); +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 (734, 'suggest_faction', 'Help me unlock rewards with %faction rep!', 0, 0, '', 'Aide-moi à débloquer des récompenses avec ma réputation auprès de la faction %faction !', 'Hilf mir, Belohnungen mit %faction-Ruf freizuschalten!', '帮我刷 %faction 声望,解锁奖励!', '', '¡Ayúdame a desbloquear recompensas con la reputación de %faction!', '', ''); +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 (735, 'suggest_faction', 'I’m grinding %faction rep for the mounts!', 0, 0, '', 'Je suis en train de farmer la réputation de %faction pour les montures !', 'Farme %faction-Ruf für die Mounts!', '我在刷 %faction 声望,为了那些坐骑!', '', '¡Estoy farmeando %faction para las monturas!', '', ''); +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 (736, 'suggest_faction', 'Come farm %faction rep with me!', 0, 0, '', 'Viens faire du farm de réputation %faction avec moi!', 'Komm, farm mit mir %faction-Ruf!', '来跟我一起刷 %faction 声望吧!', '', '¡Ven a farmear %faction conmigo!', '', ''); +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 (737, 'suggest_faction', 'I’m almost there with %faction rep!', 0, 0, '', 'Je suis presque arrivé à la réputation de %faction !', 'Ich bin fast fertig mit dem %faction-Ruf!', '我快把 %faction 声望刷到目标了!', '', '¡Casi llego con %faction!', '', ''); +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 (738, 'suggest_faction', 'Grinding %faction rep with my friends!', 0, 0, '', 'En train de monter la réputation de %faction avec mes potes !', 'Farmen %faction-Ruf mit meinen Freunden!', '和朋友们一起刷 %faction 声望!', '', '¡Estoy farmeando %faction con mis amigos!', '', ''); + +-- random generic +-- usable placeholders: +-- %my_role +-- %zone_name +-- %area_name +-- %my_class +-- %my_race +-- %my_level +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 (739, 'suggest_something', 'Wanna party in %zone_name.', 0, 0, '', 'Envie de faire un groupe dans %zone_name.', 'Lust auf eine Party in %zone_name.', '想在 %zone_name 组队吗?', '', '¡Vamos a perrear a %zone_name!', '', 'Хочу в пати в %zone_name.'); +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 (740, 'suggest_something', 'Anyone is looking for %my_role?', 0, 0, '', 'Est-ce que quelqu’un recherche %my_role ?', 'Sucht jemand einen %my_role?', '有人需要 %my_role 吗?', '', '¿Alguien está buscando %my_role?', '', 'Кто ищет %my_role?'); +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 (741, 'suggest_something', '%my_role is looking for guild.', 0, 0, '', '%my_role Je suis à la recherche d’une guilde.', '%my_role sucht eine Gilde.', '我是 %my_role,求加入一个公会。', '', '%my_role está buscando hermandad.', '', '%my_role ищет гильдию.'); +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 (742, 'suggest_something', 'Looking for gold.', 0, 0, '', 'À la recherche d’or.', 'Suche Gold.', '缺金币,求支援!', '', 'Buscando oro.', '', 'Ищу золото.'); +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 (743, 'suggest_something', '%my_role wants to join a good guild.', 0, 0, '', 'Je veux rejoindre une bonne guilde.', '%my_role möchte einer guten Gilde beitreten.', '我是 %my_role,想加入一个靠谱的公会。', '', '%my_role quiere unirse a una buen hermandad.', '', '%my_role хочет вступить в хорошую гильдию.'); +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 (744, 'suggest_something', 'Need a friend.', 0, 0, '', 'Besoin d’un ami.', 'Brauche einen Freund.', '想找个朋友一起玩。', '', 'Necesito un amigo...', '', 'Нужен друг.'); +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 (745, 'suggest_something', 'Anyone feels alone?', 0, 0, '', 'Vous vous sentez seul ?', 'Fühlt sich jemand allein?', '有人觉得孤单吗?', '', '¿Alguien se siente solo?', '', 'Кто-нибудь чувствует себя одиноко?'); +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 (746, 'suggest_something', 'Boring...', 0, 0, '', 'Je m’ennui', 'Langweilig...', '好无聊啊……', '', 'Aburrido...', '', 'Скучно...'); +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 (747, 'suggest_something', 'Who wants some?', 0, 0, '', 'Qui en veut?', 'Wer will was?', '谁想来点刺激?', '', '¿Quién quiere hacer grupo para levear?', '', 'Кто хочет немного?'); +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 (748, 'suggest_something', 'Go get me!', 0, 0, '', 'Viens me chercher!', 'Hol mich!', '来抓我啊!', '', '¡Ven a buscarme!', '', 'Давай, поймай меня!'); +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 (749, 'suggest_something', 'Maybe a duel in %zone_name?', 0, 0, '', 'Peut-être un duel dans %zone_name?', 'Vielleicht ein Duell in %zone_name?', '在 %zone_name 来场决斗如何?', '', '¿Quizás un duelo en %zone_name?', '', 'Может, дуэль в %zone_name?'); +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 (750, 'suggest_something', 'Anybody doing something?', 0, 0, '', 'Est-ce que quelqu’un fait quelque chose?', 'Macht jemand gerade etwas?', '有人在干啥吗?', '', '¿Alguien está haciendo algo?', '', 'Кто-нибудь что-то делает?'); +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 (751, 'suggest_something', '%zone_name: is anybody here?', 0, 0, '', '%zone_name: Est-ce qu’il y a quelqu’un ici ?', '%zone_name: Ist hier jemand?', '%zone_name:有人在吗?', '', '%zone_name: ¿hay alguien aquí?', '', '%zone_name: кто-нибудь здесь есть?'); +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 (752, 'suggest_something', '%zone_name: where is everyone?', 0, 0, '', '%zone_name: Où est tout le monde ?', '%zone_name: Wo sind die Leute?', '%zone_name:人都去哪了?', '', '¿Hay alguien en %zone_name?', '', '%zone_name: где все?'); +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 (753, 'suggest_something', 'Looks like I am alone in %zone_name.', 0, 0, '', 'Il semble que je sois seul dans %zone_name.', 'Sieht so aus, als wäre ich allein in %zone_name.', '看起来我在 %zone_name 就一个人。', '', 'Parece que estoy solo en %zone_name.', '', 'Похоже, я один в %zone_name.'); +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 (754, 'suggest_something', 'Meet me in %zone_name.', 0, 0, '', 'Retrouve-moi dans %zone_name.', 'Triff mich in %zone_name.', '来 %zone_name 找我吧。', '', 'Encuéntrame en %zone_name.', '', 'Встретимся в %zone_name.'); +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 (755, 'suggest_something', 'Let’s quest in %zone_name!', 0, 0, '', 'Partons à l’aventure dans %zone_name!', 'Lasst uns in %zone_name questen!', '去 %zone_name 做任务吧!', '', '¡Vamos a hacer un grupo para levear en %zone_name!', '', 'Давайте квестить в %zone_name!'); +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 (756, 'suggest_something', '%zone_name is the best place to be!', 0, 0, '', '%zone_name est l’endroit idéal où se trouver !', '%zone_name ist der beste Ort zum Sein!', '%zone_name 是最棒的地方!', '', '%zone_name es el mejor lugar para estar!', '', '%zone_name — лучшее место!'); +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 (757, 'suggest_something', 'Wanna go to %zone_name. Anybody with me?', 0, 0, '', 'Qui veut aller à la %zone_name? Qui est partant avec moi?', 'Will jemand nach %zone_name? Wer kommt mit?', '想去 %zone_name,有人一起吗?', '', 'Quiero ir a %zone_name. ¿Alguien se apunta?', '', 'Хочу в %zone_name. Кто со мной?'); +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 (758, 'suggest_something', 'Who wants going to %zone_name?', 0, 0, '', 'Qui veut aller à %zone_name?', 'Wer will nach %zone_name?', '谁想去 %zone_name?', '', '¿Quién quiere ir a %zone_name?', '', 'Кто хочет пойти в %zone_name?'); +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 (759, 'suggest_something', 'I don’t like %zone_name. Where to go?', 0, 0, '', 'Je n’aime pas %zone_name. Je devrais aller où ?', 'Ich mag %zone_name nicht. Wohin soll ich gehen?', '我不喜欢 %zone_name,换个地方吧?', '', 'No me gusta %zone_name. ¿Dónde podria ir?', '', 'Не нравится %zone_name. Куда идти?'); +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 (760, 'suggest_something', 'Are there a good quests in %zone_name?', 0, 0, '', 'Y a-t-il de bonnes quêtes dans %zone_name ?', 'Gibt es gute Quests in %zone_name?', '%zone_name 有啥好任务吗?', '', '¿Hay buenas misiones en %zone_name?', '', 'Есть хорошие квесты в %zone_name?'); +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 (761, 'suggest_something', 'Where to go after %zone_name?', 0, 0, '', 'Où devrais-je aller après %zone_name ?', 'Wohin soll ich nach %zone_name gehen?', '从 %zone_name 走后去哪?', '', '¿Adónde puedo ir después de %zone_name?', '', 'Куда идти после %zone_name?'); +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 (762, 'suggest_something', 'Who is in %zone_name?', 0, 0, '', 'Qui est dans %zone_name ?', 'Wer ist in %zone_name?', '谁在 %zone_name?', '', '¿Quién está en %zone_name?', '', 'Кто в %zone_name?'); +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 (763, 'suggest_something', 'LFG in %zone_name.', 0, 0, '', 'LFG dans %zone_name.', 'LFG in %zone_name.', '在 %zone_name 找队伍。', '', 'Busco grupo en %zone_name.', '', 'ЛФГ в %zone_name.'); +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 (764, 'suggest_something', '%zone_name is the worst place to be.', 0, 0, '', '%zone_name est le pire endroit où se trouver.', '%zone_name ist der schlimmste Ort an dem man grade sein kann.', '%zone_name 是最烂的地方。', '', '%zone_name es el peor lugar para estar', '', '%zone_name — худшее место.'); +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 (765, 'suggest_something', 'Catch me in %zone_name!', 0, 0, '', 'Retrouve-moi dans %zone_name !', 'Triff mich in %zone_name!', '在 %zone_name 抓我啊!', '', '¡Atrápame en %zone_name!', '', 'Лови меня в %zone_name!'); +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 (766, 'suggest_something', 'Go for %zone_name!', 0, 0, '', 'Allons-y pour %zone_name!', 'Auf nach %zone_name!', '冲向 %zone_name!', '', 'Me voy a %zone_name!', '', 'Пойдем в %zone_name!'); +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 (767, 'suggest_something', 'Wanna quest in %zone_name', 0, 0, '', 'Tu veux partir en quête dans %zone_name?', 'Lust auf Questen in %zone_name?', '想在 %zone_name 做任务吗?', '', 'Quiero hacer una búsqueda en %zone_name', '', 'Хочу квестить в %zone_name'); +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 (768, 'suggest_something', 'Anyone has quests in %zone_name?', 0, 0, '', 'Est-ce que quelqu’un a des quêtes dans %zone_name?', 'Hat jemand Quests in %zone_name?', '有人在 %zone_name 有任务吗?', '', '¿Alguien tiene misiones en %zone_name?', '', 'У кого есть квесты в %zone_name?'); +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 (769, 'suggest_something', 'Come here to %zone_name!', 0, 0, '', 'Viens ici dans %zone_name!', 'Komm nach %zone_name!', '来 %zone_name 这儿!', '', '¡Ven aquí a %zone_name!', '', 'Приходите сюда, в %zone_name!'); +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 (770, 'suggest_something', 'Seems there is no Horde in %zone_name', 0, 0, '', 'Il semblerait qu’il n’y ait pas de Hordeux dans %zone_name.', 'Sieht so aus, als gäbe es keine Horde in %zone_name.', '看来 %zone_name 没有部落的人。', '', 'Parece que no hay Horda en %zone_name', '', 'Похоже, в %zone_name нет Орды'); +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 (771, 'suggest_something', 'Seems there is no Alliance in %zone_name', 0, 0, '', 'Il semble qu’il n’y ait pas d’Allianceux dans %zone_name.', 'Sieht so aus, als gäbe es keine Allianz in %zone_name.', '看来 %zone_name 没有联盟的人。', '', 'Parece que no hay Alianza en %zone_name', '', 'Похоже, в %zone_name нет Альянса'); +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 (772, 'suggest_something', 'I am really tired of %zone_name. Maybe go somewhere else?', 0, 0, '', 'Je suis vraiment fatigué de %zone_name. Pourquoi n’irions-nous pas ailleurs ?', 'Ich bin echt müde von %zone_name. Vielleicht sollte ich woanders hingehen?', '我真受够了 %zone_name,要不要换个地方?', '', 'Estoy realmente cansado de %zone_name. Quizás ire a otro lugar', '', 'Я очень устал от %zone_name. Может, пойти куда-нибудь еще?'); +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 (773, 'suggest_something', 'GL', 0, 0, '', 'Bonne chance', 'Viel Glück', '祝好运!', '', '', '', 'Удачи'); +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 (774, 'suggest_something', 'I want to go home, and then edge', 0, 0, '', 'Je veux rentrer chez moi, puis me détendre.', 'Ich will nach Hause und dann entspannen.', '我想回家,然后放松一下。', '', '', '', 'Хочу домой, а потом на край'); +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 (775, 'suggest_something', 'does anyone know what you need to dual wield?', 0, 0, '', 'Est-ce que quelqu’un peux m’aider avec la double spé ?', 'Weiß jemand, was man zum beidhändigen Kämpfen braucht?', '有人知道双持武器需要啥条件吗?', '', '', '', 'Кто-нибудь знает, что нужно для двуручного боя?'); +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 (776, 'suggest_something', 'hi everyone!', 0, 0, '', 'Salut tout le monde!', 'Hallo zusammen!', '大家好!', '', '', '', 'Всем привет!'); +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 (777, 'suggest_something', '%zone_name is comfy', 0, 0, '', '%zone_name est vraiment agréable.', '%zone_name ist gemütlich.', '%zone_name 感觉还挺舒服的。', '', '', '', '%zone_name уютно'); +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 (778, 'suggest_something', 'i feel great', 0, 0, '', 'Je me sens super bien.', 'Ich fühle mich großartig.', '我感觉棒极了!', '', '', '', 'Я отлично себя чувствую'); +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 (779, 'suggest_something', 'i don’t ignore people i troll them until they ignore me', 0, 0, '', 'Je n’ignore pas les gens, je les trolle jusqu’à ce qu’ils m’ignorent.', 'Ich ignoriere Leute nicht, ich trolle sie, bis sie mich ignorieren.', '我不无视别人,我会逗他们直到他们无视我。', '', '', '', ''); +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 (780, 'suggest_something', 'What do you guys think about my build? %my_role', 0, 0, '', 'Qu’est-ce que vous pensez de mon build? %mon_rolôle', 'Was haltet ihr von meinem Build? %my_role', '大家觉得我的装备咋样?我是 %my_role', '', '', '', 'Что думаете о моей сборке? %my_role'); +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 (781, 'suggest_something', 'good to see chat still remembers', 0, 0, '', 'Content de voir que le chat se souvient toujours', 'Schön zu sehen, dass der Chat sich noch erinnert.', '很高兴聊天频道里还有人记得我。', '', '', '', 'Рад видеть, что чат еще помнит'); +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 (782, 'suggest_something', 'like all weapons its hunter BIS', 0, 0, '', 'Comme toutes les armes, c’est le meilleur équipement pour les chasseurs.', 'Wie alle Waffen ist es natürlich das beste für Hunter.', '跟所有武器一样,这对猎人来说是极品。', '', '', '', 'Как и все оружие — это лучший для охотника'); +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 (783, 'suggest_something', 'whole point to the game for me is soloing and finding new ways to solo stuff', 0, 0, '', 'Pour moi, le cœur du jeu réside dans le fait d’évoluer en solo et de découvrir de nouvelles façons de vaincre mes adversaires en solo.', 'Für mich dreht sich das Spiel darum, solo zu spielen und neue Wege zu finden, Dinge alleine zu erledigen.', '对我来说,游戏的乐趣就是单刷,找到新的单刷方法。', '', '', '', 'Вся суть игры для меня — соло и поиск новых способов соло'); +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 (784, 'suggest_something', 'i’ve NEVER ripped off anyone', 0, 0, '', 'Je n’ai JAMAIS arnaqué qui que ce soit.', 'Ich habe NIEMALS jemanden abgezockt.', '我从没坑过任何人!', '', '', '', ''); +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 (785, 'suggest_something', 'ah yes the world of warcraft, where i come for life advice', 0, 0, '', 'Ah yes, le monde de Warcraft, là où je viens chercher des conseils de vie.', 'Ah ja, die Welt von Warcraft, wo ich Ratschläge fürs Lebensrat herbekomme.', '啊对,魔兽世界,我来这里寻求人生建议的地方。', '', '', '', 'Ах да, мир варкрафта, где я ищу жизненные советы'); +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 (786, 'suggest_something', 'HELLO?', 0, 0, '', 'Salut! Comment ça va?', 'HALLO?', '喂,有人吗?', '', '', '', 'АЛЛО?'); +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 (787, 'suggest_something', 'Time to fight my way into %zone_name', 0, 0, '', 'Il est temps que je me batte pour rentrer dans %zone_name.', 'Zeit, mich nach %zone_name durchzukämpfen.', '是时候杀进 %zone_name 了!', '', '', '', 'Пора пробиваться в %zone_name'); +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 (788, 'suggest_something', '%zone_name', 0, 0, '', '%zone_name', '%zone_name', '%zone_name', '', '', '', '%zone_name'); +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 (789, 'suggest_something', 'gotta poop', 0, 0, '', 'je dois aller aux toilettes.', 'Muss mal eben aufs Klo.', '得去解决一下个人问题,等等我!', '', '', '', 'надо в туалет'); +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 (790, 'suggest_something', 'if you don’t loot your skinnable kills your pp loses 1mm permanently', 0, 0, '', 'Si vous ne pillez pas les ennemis que je peux dépecer, ton zgegue perd 1mm de façon permanente.', 'Wenn du deine häutbaren Kills nicht lootest, schrumpft dein PP um 1mm dauerhaft.', '不拾取能剥皮的战利品,你的小兄弟可要永久缩水1毫米啊!', '', '', '', ''); +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 (791, 'suggest_something', 'NOOOOOOOOOOOOO', 0, 0, '', 'Oh nonnnnnnnnnn!', 'NEEEEEEEEEEEIN!', '不啊啊啊啊啊啊啊!', '', '', '', 'НЕТТТТТТТТТТ'); +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 (792, 'suggest_something', 'I LIKE POTATO', 0, 0, '', 'J’AIME LA POMME DE TERRE.', 'ICH MAG ZÜGE.', '我超爱土豆!', '', '', '', 'Я ЛЮБЛЮ КАРТОШКУ'); +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 (793, 'suggest_something', 'w chat', 0, 0, '', 'w chat', 'w Chat', '聊天真棒!', '', '', '', 'w чат'); +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 (794, 'suggest_something', 'hi how are you guys', 0, 0, '', 'Salut, comment vous allez ?', 'Hi, wie geht’s euch?', '嗨,大家好吗?', '', '', '', 'привет, как дела'); +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 (795, 'suggest_something', 'i just logged out and logged back in', 0, 0, '', 'Je viens de me déconnecter et de me reconnecter.', 'Gerade ausgeloggt und wieder eingeloggt.', '我刚掉线又重新登录了。', '', '', '', 'только что вышел и снова зашел'); +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 (796, 'suggest_something', 'can you guys keep it down a bit, im lost in %zone_name', 0, 0, '', 'Est-ce que vous pouvez baisser un peu le volume, je suis perdu dans %zone_name.', 'Könnt ihr mal leiser sein? Ich bin in %zone_name verloren.', '能小声点吗?我在%zone_name迷路了!', '', '', '', 'можете потише, я заблудился в %zone_name'); +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 (797, 'suggest_something', 'anyone want to have a drink with me at %zone_name ...hic!', 0, 0, '', 'Quelqu’un veut boire un verre avec moi à %zone_name ...hic!', 'Will jemand mit mir in %zone_name einen trinken? ...Hicks!', '有谁想在%zone_name和我喝一杯吗……嗝!', '', '', '', 'кто хочет выпить со мной в %zone_name ... ик!'); +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 (798, 'suggest_something', 'hahahahaheeeeeeee dirin diring ingggggg hahahahaheeeeeeeeeeeeee', 0, 0, '', 'hahahahaheeeeeeeeee dirin diring ingggggg hahahahaheeeeeeeeeeeeee', 'hahahahaheeeeeeee dirin diring ingggggg hahahahaheeeeeeeeeeeeee', '哈哈哈哈嘿嘿嘿叮叮叮哈哈哈哈嘿嘿嘿!', '', '', '', 'хахахахахииииииии дирин диринг инггггг хахахахахииииииииииииии'); +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 (799, 'suggest_something', 'bait used to be believeable', 0, 0, '', 'Le leurre était autrefois crédible.', 'Früher war das Bait glaubwürdig.', '以前的诱饵还能让人信服。', '', '', '', 'раньше приманка была правдоподобной'); +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 (800, 'suggest_something', 'maybe you just lost your innocence', 0, 0, '', 'Peut-être que tu viens juste de perdre ton innocence.', 'Vielleicht hast du einfach deine Unschuld verloren.', '可能你只是丢掉了天真。', '', '', '', 'может, ты просто потерял невинность'); +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 (801, 'suggest_something', 'any guilds willing to carry %my_role?', 0, 0, '', 'Y a-t-il des guildes prêtes à me prendre %my_role?', 'Gibt es Gilden, die %my_role mitziehen wollen?', '有公会愿意带带我这个%my_role吗?', '', '', '', 'есть гильдии, готовые тащить %my_role?'); +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 (802, 'suggest_something', 'once you start getting higher, gold is so easy to get', 0, 0, '', 'Une fois que tu commences à monter en niveau, l’or devient si facile à obtenir.', 'Sobald man höher im Level ist, bekommt man Gold so einfach.', '等级高了之后,金币真是手到擒来。', '', '', '', 'чем выше уровень, тем легче золото'); +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 (803, 'suggest_something', 'morning', 0, 0, '', 'Bonjour, comment ça va ce matin ?', 'Morgen!', '早上好啊!', '', '', '', 'утро'); +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 (804, 'suggest_something', 'why does my ass hurt?', 0, 0, '', 'Pourquoi j’ai mal aux fesses?', 'Warum tut mein Hintern weh?', '为啥我的屁股这么疼?', '', '', '', 'почему у меня болит задница?'); +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 (805, 'suggest_something', 'I feel like spirit is bis for leveling', 0, 0, '', 'Je pense que l’esprit est bis pour monter de niveau.', 'Ich denke, Willenskraft ist das Beste zum Leveln.', '我觉得精神属性对升级来说是极品。', '', '', '', 'Мне кажется, дух — лучший для прокачки'); +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 (806, 'suggest_something', 'Even more for troll', 0, 0, '', 'Encore plus pour les trolls', 'Noch mehr für Trolle.', '对巨魔来说更是如此。', '', '', '', 'Особенно для тролля'); +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 (807, 'suggest_something', 'CAN SOMEONE INVITE ME', 0, 0, '', 'ON PEUT M INVITER', 'KANN MICH JEMAND EINLADEN?', '谁能邀请我一下啊!', '', '', '', 'КТО-НИБУДЬ ПРИГЛАСИТЕ МЕНЯ'); +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 (808, 'suggest_something', 'need a lot of drinks', 0, 0, '', 'J’ai besoin de beaucoup de boissons.', 'Brauche viele Drinks.', '需要一大堆饮料!', '', '', '', 'нужно много выпивки'); +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 (809, 'suggest_something', 'damn gnomes', 0, 0, '', 'Ces satanés gnomes!', 'Verdammte Gnome!', '该死的侏儒!', '', '', '', 'чертовы гномы'); +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 (810, 'suggest_something', 'no one likes gnomes', 0, 0, '', 'Personne n’aime les gnomes.', 'Niemand mag Gnome.', '没人喜欢侏儒。', '', '', '', 'никто не любит гномов'); +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 (811, 'suggest_something', 'gnomes are only good for one thing', 0, 0, '', 'Les gnomes ne sont bons que pour une seule chose', 'Gnome taugen nur für eine Sache.', '侏儒就只有一件事干得不错。', '', '', '', 'гномы годятся только для одного'); +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 (812, 'suggest_something', 'Well', 0, 0, '', 'Bien', 'Nun', '好吧', '', '', '', 'Ну'); +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 (813, 'suggest_something', 'mushrooms', 0, 0, '', 'champignons', 'Pilze', '蘑菇', '', '', '', 'грибы'); +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 (814, 'suggest_something', 'automatic thoughts are a scary thing', 0, 0, '', 'Les pensées automatiques sont effrayantes, elles surgissent sans prévenir et peuvent vraiment perturber ma tranquillité d’esprit.', 'Automatische Gedanken sind eine beängstigende Sache.', '自动冒出来的想法真挺吓人的。', '', '', '', 'автоматические мысли — страшная вещь'); +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 (815, 'suggest_something', 'the mind is more pliable than we like to believe', 0, 0, '', '', 'Der Geist ist formbarer, als wir glauben.', '思想比我们想象中更容易被塑造。', '', '', '', ''); +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 (816, 'suggest_something', 'any leveling guilds out there?', 0, 0, '', 'Des guildes de leveling par ici ?', 'Gibt es hier irgendwelche Leveling-Gilden?', '有升级公会吗?', '', '', '', 'есть гильдии для прокачки?'); +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 (817, 'suggest_something', 'brb', 0, 0, '', 'brb.', 'bin gleich zurück.', '马上回来!', '', '', '', 'брб'); +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 (818, 'suggest_something', 'Why is snow white but Ice is clear ? made of the same thing', 0, 0, '', 'Oh, la neige est blanche parce que ses cristaux reflètent la lumière du soleil, ce qui donne cette couleur. Tandis que la glace est claire car elle compacte les cristaux de glace, ce qui la rend transparente. C’est fou de penser que ce sont tous les deux faits de la même chose, n’est-ce pas ?', 'Schnee ist weiß, weil die Eiskristalle das Licht streuen, während Eis klar ist, weil es eine kompaktere Struktur hat.', '为啥雪是白的而冰是透明的?明明是同一种东西啊!', '', '', '', 'Почему снег белый, а лед прозрачный? Ведь это одно и то же'); +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 (819, 'suggest_something', 'why is whipped cream fluffy and regular not', 0, 0, '', 'Oh, whipped cream is all light and airy because we are beating some heavy cream until it traps air in. Regular cream just sits there all heavy and dense because it hasn’t been whipped yet. ', 'Schlagsahne ist luftig, weil beim Schlagen Luft eingeschlossen wird. Normale Sahne ist dicht und schwer, weil sie nicht aufgeschlagen wurde.', '为啥打发的奶油这么蓬松,而普通的就不行呢?', '', '', '', 'почему взбитые сливки пышные, а обычные нет'); +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 (820, 'suggest_something', 'why do feet smell if they have no nose', 0, 0, '', 'Pourquoi les pieds sentent alors qu’ils n’ont pas de nez !?', 'Warum stinken Füße, wenn sie keine Nase haben?', '脚上又没长鼻子,咋还能臭呢?', '', '', '', 'почему ноги пахнут, если у них нет носа'); +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 (821, 'suggest_something', 'seems a can of newbies arrived', 0, 0, '', 'Il semble qu’une brochette de noob soit arrivée.', 'Scheint, als wäre eine Fuhre Neulinge angekommen.', '看来来了一群菜鸟啊。', '', '', '', 'похоже, прибыла банка новичков'); +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 (822, 'suggest_something', 'stop trolling new players with BS answers', 0, 0, '', 'Arrête de troll les nouveaux joueurs avec des réponses bidon.', 'Hört auf, neue Spieler mit falschen Antworten zu trollen.', '别再用瞎话忽悠新手了!', '', '', '', 'хватит троллить новичков бредовыми ответами'); +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 (823, 'suggest_something', 'Is there PvP on this server?', 0, 0, '', 'Il y’a du pvp sur ce serveur ?', 'Gibt es PvP auf diesem Server?', '这个服务器有PVP吗?', '', '', '', 'На этом сервере есть PvP?'); +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 (824, 'suggest_something', 'duh', 0, 0, '', 'duh', 'tja', '废话!', '', '', '', 'угу'); +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 (825, 'suggest_something', 'phew... :)', 0, 0, '', 'Phew... :)', 'Puh... :)', '呼……还好 :)', '', '', '', 'фух... :)'); +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 (826, 'suggest_something', 'did you guys know that', 0, 0, '', 'Savez-vous que...', 'Wusstet ihr, dass...', '你们知道吗?', '', '', '', 'вы знали что'); +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 (827, 'suggest_something', 'i don’t try to imagine what other creatures feel like', 0, 0, '', 'Je ne cherche pas à imaginer ce que d’autres créatures peuvent ressentir.', 'Ich versuche nicht, mir vorzustellen, was andere Kreaturen fühlen.', '我可不去猜其他生物心里咋想的。', '', '', '', ''); +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 (828, 'suggest_something', 'oh whoops, wrong chat', 0, 0, '', 'Oh mince, mauvais chat', 'Oh hoppla, falscher Chat.', '哎呀,发错频道了!', '', '', '', 'ой, не тот чат'); +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 (829, 'suggest_something', 'bruh you guys are wildin out today', 0, 0, '', 'Oh là là, vous les gars, vous déconnez aujourd’hui!', 'Junge, ihr seid heute echt wild drauf!', '兄弟们,今天你们也太嗨了吧!', '', '', '', 'бро, вы сегодня отжигаете'); +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 (830, 'suggest_something', 'just let it be known that my text was here', 0, 0, '', 'Je vais juste faire en sorte que mon texte soit là.', 'Lasst es einfach bekannt sein, dass mein Text hier war.', '就让大家知道,我的话在这儿呢!', '', '', '', 'пусть все знают, что мой текст был здесь'); +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 (831, 'suggest_something', 'grrr angyy', 0, 0, '', 'Grrrrrr colère.', 'Grrrr wütend.', '咕噜咕噜,气炸了!', '', '', '', 'гррр злой'); +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 (832, 'suggest_something', 'the grind is fun', 0, 0, '', 'Le grind est amusant', 'Das Grinden macht Spaß.', '刷怪升级真有意思!', '', '', '', 'гринд — это весело'); +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 (833, 'suggest_something', 'Wow keeps me sharp', 0, 0, '', 'Wow me garde alerte', 'WoW hält mich wachsam.', '魔兽让我保持敏锐!', '', '', '', 'Wow держит меня в тонусе'); +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 (834, 'suggest_something', 'hey have a question where can i take the roll for more xp? im in %zone_name', 0, 0, '', 'Hey, j’ai une question. Où est-ce que je peux trouver le rouleau pour gagner plus d’XP? Je suis dans %zone_name.', 'Hey, ich habe eine Frage. Wo bekomme ich die Rolle für mehr XP? Ich bin in %zone_name.', '嘿,有个问题,哪里能接任务多拿经验?我在%zone_name。', '', '', '', 'у меня вопрос: где можно взять бросок на больше опыта? я в %zone_name'); +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 (835, 'suggest_something', 'do you guys like sausages?', 0, 0, '', 'Hmm, est-ce que vous aimez les saucisses?', 'Mögt ihr Würstchen?', '你们喜欢香肠吗?', '', '', '', 'вы любите сосиски?'); +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 (836, 'suggest_something', 'Invite me. I’ll help', 0, 0, '', 'Invite-moi. Je vais t’aider.', 'Ladet mich ein. Ich helfe.', '组我吧,我能帮忙!', '', '', '', ''); +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 (837, 'suggest_something', 'which class do you think is better for pvp?', 0, 0, '', 'Quelle classe est la meilleurs pour PvP !?', 'Welche Klasse ist besser für PvP?', '你们觉得哪个职业在PVP里更强?', '', '', '', 'какой класс лучше для пвп?'); +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 (838, 'suggest_something', 'where the fuck is the cooking trainer in %zone_name', 0, 0, '', '%zone_name? Ah, putain, c’est toujours la galère pour trouver les PNJ dans cette zone-là. Attends, laisse-moi voir sur ma carte... Ah, je crois que le formateur en cuisine est près de la taverne, à droite de l’aubergiste. Tu devrais le trouver là-bas!', 'Wo zum Teufel ist der Kochlehrer in %zone_name?', '靠,%zone_name的烹饪训练师到底在哪?', '', '', '', 'где, черт возьми, тренер кулинарии в %zone_name'); +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 (839, 'suggest_something', 'you know what happens in %zone_name?', 0, 0, '', 'Tu sais ce qu’il se passe dans la %zone_name ?', 'Weißt du, was in %zone_name passiert?', '你知道%zone_name发生了啥事吗?', '', '', '', 'знаете, что происходит в %zone_name?'); +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 (840, 'suggest_something', 'I need to craft something', 0, 0, '', 'Je dois fabriquer quelque chose.', 'Ich muss etwas herstellen.', '我得做点东西。', '', '', '', 'Мне нужно что-то скрафтить'); +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 (841, 'suggest_something', 'Anyone up for some nonsense in %zone_name?', 0, 0, '', 'Quelqu’un pour un peu de folie dans la %zone_name?', 'Hat jemand Lust auf etwas Unsinn in %zone_name?', '有谁想在%zone_name搞点乱子吗?', '', '¿Alguien para tonterías en %zone_name?', '', 'Кто-нибудь для глупости в %zone_name?'); +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 (842, 'suggest_something', 'Let’s make %zone_name our playground.', 0, 0, '', 'Faisons de %zone_name notre terrain de jeu.', 'Lasst uns %zone_name zu unserem Spielplatz machen.', '咱们把%zone_name变成我们的游乐场吧!', '', 'Hagamos de %zone_name nuestro patio de recreo.', '', 'Давайте сделаем %zone_name нашей игровой площадкой.'); +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 (843, 'suggest_something', 'I’m gonna get lost in %zone_name again.', 0, 0, '', 'Je vais me perdre dans %zone_name encore une fois.', 'Ich werde mich in %zone_name wieder verlaufen.', '我又要在%zone_name迷路了。', '', 'Voy a perderme otra vez en %zone_name.', '', 'Снова потеряюсь в %zone_name.'); +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 (844, 'suggest_something', 'Can’t believe I’m still here in %zone_name.', 0, 0, '', 'Je n’arrive pas à croire que je suis toujours dans %zone_name.', 'Ich kann nicht glauben, dass ich immer noch in %zone_name bin.', '真不敢相信我还在%zone_name。', '', 'No puedo creer que todavía esté aquí en %zone_name.', '', 'Не верю, что я до сих пор здесь в %zone_name.'); +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 (845, 'suggest_something', 'Wanna team up for %zone_name madness?', 0, 0, '', 'Tu veux faire équipe pour une folie dans la zone %zone_name?', 'Willst du dich für Chaos in %zone_name zusammentun?', '想组队在%zone_name大闹一场吗?', '', '¿Quieres unirte para la locura en %zone_name?', '', 'Хочешь составить команду для сумасшествия в %zone_name?'); +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 (846, 'suggest_something', 'Let’s raid the mailbox in %zone_name!', 0, 0, '', 'Allons piller la boîte aux lettres dans %zone_name!', 'Lasst uns den Briefkasten in %zone_name plündern!', '咱们去%zone_name抢邮箱吧!', '', '¡Vamos a asaltar el buzón en %zone_name!', '', 'Давайте захватим почтовый ящик в %zone_name!'); +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 (847, 'suggest_something', 'I swear, %zone_name is full of trolls.', 0, 0, '', 'Je te jure, %zone_name est rempli de trolls.', 'Ich schwöre, %zone_name ist voller Trolle.', '我发誓,%zone_name全是巨魔。', '', 'Juro que %zone_name está lleno de trolls.', '', 'Клянусь, %zone_name полно троллей.'); +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 (848, 'suggest_something', 'Let’s create chaos in %zone_name together.', 0, 0, '', 'Créons le chaos dans %zone_name ensemble.', 'Lasst uns zusammen Chaos in %zone_name anrichten.', '咱们一起在%zone_name制造混乱吧!', '', 'Creamos caos juntos en %zone_name.', '', 'Давайте устроим хаос в %zone_name вместе.'); +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 (849, 'suggest_something', 'I feel like doing absolutely nothing in %zone_name.', 0, 0, '', 'J’ai juste envie de ne rien faire du tout dans %zone_name.', 'Ich habe einfach Lust, in %zone_name absolut nichts zu tun.', '我只想在%zone_name啥也不干。', '', 'Tengo ganas de no hacer nada en %zone_name.', '', 'Хочу просто ничего не делать в %zone_name.'); +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 (850, 'suggest_something', 'No one ever listens in %zone_name.', 0, 0, '', 'Personne n’écoute jamais dans %zone_name.', 'Niemand hört jemals in %zone_name zu.', '在%zone_name没人听我说话。', '', 'Nadie escucha nunca en %zone_name.', '', 'В %zone_name никто никогда не слушает.'); +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 (851, 'suggest_something', 'Is %zone_name even real?', 0, 0, '', '%zone_name est vraiment réel?', 'Ist %zone_name überhaupt real?', '%zone_name到底是不是真的?', '', '¿Es %zone_name siquiera real?', '', 'Существует ли вообще %zone_name?'); +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 (852, 'suggest_something', 'Someone send help to %zone_name! It’s wild!', 0, 0, '', 'Envoyez de l’aide dans %zone_name ! C’est la folie !', 'Schickt Hilfe nach %zone_name! Es ist verrückt dort!', '谁来%zone_name救救我!这里乱成一团!', '', '¡Alguien envíe ayuda a %zone_name! ¡Es una locura!', '', 'Кто-нибудь, отправьте помощь в %zone_name! Тут творится безумие!'); +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 (853, 'suggest_something', 'I am sure %zone_name is haunted.', 0, 0, '', 'Je suis persuadé que %zone_name est hanté.', 'Ich bin mir sicher, dass %zone_name verflucht ist.', '我敢肯定%zone_name闹鬼。', '', 'Estoy seguro de que %zone_name está embrujado.', '', 'Уверен, что в %zone_name есть призраки.'); +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 (854, 'suggest_something', 'If %zone_name could talk, it would probably scream.', 0, 0, '', 'Si %zone_name pouvait parler, je pense qu’il crierait à s’en briser la voix.', 'Wenn %zone_name sprechen könnte, würde es wahrscheinlich schreien.', '如果%zone_name会说话,估计得尖叫起来。', '', 'Si %zone_name pudiera hablar, probablemente gritaría.', '', 'Если бы %zone_name мог говорить, он, наверное, кричал бы.'); +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 (855, 'suggest_something', 'There’s something fishy about %zone_name.', 0, 0, '', 'Il y a quelque chose de louche avec %zone_name.', 'Irgendwas ist faul an %zone_name.', '%zone_name有点不对劲。', '', 'Hay algo sospechoso acerca de %zone_name.', '', 'В %zone_name что-то подозрительное.'); +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 (856, 'suggest_something', 'I’m about to break %zone_name with my awesomeness.', 0, 0, '', 'Je m’apprête à conquérir %zone_name avec ma grandeur.', 'Ich werde %zone_name mit meiner Großartigkeit zerstören.', '我要用我的牛逼把%zone_name给炸了!', '', 'Estoy a punto de romper %zone_name con mi grandeza.', '', 'Я собираюсь разрушить %zone_name своей крутостью.'); +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 (857, 'suggest_something', 'Someone tell %zone_name that I am here.', 0, 0, '', 'Quelqu’un dit à %zone_name que je suis ici.', 'Jemand soll %zone_name sagen, dass ich hier bin.', '谁告诉%zone_name,我来了!', '', 'Alguien dígale a %zone_name que estoy aquí.', '', 'Кто-нибудь скажите %zone_name, что я здесь.'); +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 (858, 'suggest_something', 'I’m lost in %zone_name, send help.', 0, 0, '', 'Je suis perdu dans %zone_name, envoyez de l’aide.', 'Ich habe mich in %zone_name verlaufen, schickt Hilfe.', '我在%zone_name迷路了,快来救我!', '', 'Estoy perdido en %zone_name, envíen ayuda.', '', 'Я заблудился в %zone_name, отправьте помощь.'); +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 (859, 'suggest_something', 'I’m starting a revolution in %zone_name.', 0, 0, '', 'Je lance une révolution dans %zone_name.', 'Ich starte eine Revolution in %zone_name.', '我在%zone_name发起一场革命!', '', 'Estoy comenzando una revolución en %zone_name.', '', 'Я начинаю революцию в %zone_name.'); +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 (860, 'suggest_something', 'Anyone else find %zone_name suspiciously quiet?', 0, 0, '', 'Est-ce que vous trouvez que %zone_name est étrangement calme, non?', 'Findet noch jemand %zone_name verdächtig ruhig?', '还有人觉得%zone_name安静得诡异吗?', '', '¿Alguien más encuentra %zone_name sospechosamente tranquila?', '', 'Кто-нибудь еще находит %zone_name подозрительно тихой?'); +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 (861, 'suggest_something', 'I bet %zone_name has secrets we don’t know about.', 0, 0, '', 'Je parie que %zone_name a des secrets que nous ne connaissons pas.', 'Ich wette, %zone_name hat Geheimnisse, von denen wir nichts wissen.', '我打赌%zone_name藏着我们不知道的秘密。', '', 'Apuesto a que %zone_name tiene secretos que no conocemos.', '', 'Держу пари, что в %zone_name есть секреты, о которых мы не знаем.'); +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 (862, 'suggest_something', 'You can never have enough %my_race in %zone_name.', 0, 0, '', 'On ne peut jamais avoir assez de %my_race dans %zone_name.', 'Man kann nie genug %my_race in %zone_name haben.', '在%zone_name,%my_race永远不够多。', '', 'Nunca se tiene suficiente %my_race en %zone_name.', '', 'Никогда не бывает слишком много %my_race в %zone_name.'); +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 (863, 'suggest_something', 'I’m beginning to think %zone_name is just a myth.', 0, 0, '', 'Je commence à penser que %zone_name n’est qu’un mythe.', 'Ich fange an zu glauben, dass %zone_name nur ein Mythos ist.', '我开始怀疑%zone_name是不是只是个传说。', '', 'Empiezo a pensar que %zone_name es solo un mito.', '', 'Я начинаю думать, что %zone_name — это миф.'); +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 (864, 'suggest_something', 'Who knew %zone_name would be this crazy?', 0, 0, '', 'Qui aurait pensé que la %zone_name serait aussi folle ?', 'Wer hätte gedacht, dass %zone_name so verrückt wäre?', '谁能想到%zone_name会这么疯狂啊?', '', '¿Quién sabía que %zone_name sería tan loco?', '', 'Кто знал, что %zone_name будет таким безумным?'); +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 (865, 'suggest_something', 'It’s like the game broke in %zone_name.', 0, 0, '', 'C’est comme si le jeu avait buggé dans %zone_name.', 'Es ist, als wäre das Spiel in %zone_name kaputtgegangen.', '感觉在%zone_name游戏都崩了!', '', 'Es como si el juego se rompiera en %zone_name.', '', 'Похоже, игра сломалась в %zone_name.'); +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 (866, 'suggest_something', 'Is %zone_name actually a desert or am I just lost?', 0, 0, '', 'Est-ce que %zone_name est vraiment un désert ou suis-je simplement perdu(e) ?', 'Ist %zone_name wirklich eine Wüste oder bin ich einfach nur verloren?', '%zone_name到底是沙漠,还是我迷路了?', '', '¿%zone_name es realmente un desierto o simplemente estoy perdido?', '', '%zone_name реально пустыня или я просто заблудился?'); +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 (867, 'suggest_something', 'This place is starting to feel like %zone_name in a blender.', 0, 0, '', 'Cet endroit commence à ressembler à une véritable tornade de %zone_name.', 'Dieser Ort fühlt sich langsam an wie %zone_name in einem Mixer.', '这地方感觉就像把%zone_name扔进搅拌机里!', '', 'Este lugar empieza a sentirse como %zone_name en una licuadora.', '', 'Это место начинает напоминать %zone_name в блендере.'); +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 (868, 'suggest_something', 'Anyone got a map for %zone_name?', 0, 0, '', 'Est-ce que quelqu’un a une carte pour %zone_name?', 'Hat jemand eine Karte für %zone_name?', '谁有%zone_name的地图啊?', '', '¿Alguien tiene un mapa para %zone_name?', '', 'Кто-нибудь имеет карту для %zone_name?'); +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 (869, 'suggest_something', 'Who else thinks %zone_name is trying to kill us?', 0, 0, '', 'Qui d’autre pense que %zone_name essaie de nous tuer ?', 'Wer sonst denkt, dass %zone_name versucht, uns zu töten?', '还有谁觉得%zone_name是想弄死咱们?', '', '¿Quién más cree que %zone_name está tratando de matarnos?', '', 'Кто еще думает, что %zone_name пытается нас убить?'); +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 (870, 'suggest_something', 'I’m on a wild ride through %zone_name!', 0, 0, '', 'Je suis en train de vivre une aventure folle à travers %zone_name !', 'Ich bin auf einer wilden Fahrt durch %zone_name!', '我在%zone_name经历了一场狂野冒险!', '', '¡Estoy en una aventura salvaje a través de %zone_name!', '', 'Я на дикой поездке через %zone_name!'); +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 (871, 'suggest_something', 'Is it just me or is %zone_name getting weirder?', 0, 0, '', 'Est-ce que c’est moi ou %zone_name devient de plus en plus étrange ?', 'Liegt es nur an mir, oder wird %zone_name immer seltsamer?', '是我一个人觉得%zone_name越来越诡异了吗?', '', '¿Soy solo yo o %zone_name se está volviendo más raro?', '', 'Только мне кажется, что %zone_name становится все страннее?'); +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 (872, 'suggest_something', 'I’m convinced %zone_name is secretly an amusement park.', 0, 0, '', 'Je suis convaincu que %zone_name est secrètement un parc d’attractions.', 'Ich bin überzeugt, dass %zone_name heimlich ein Freizeitpark ist.', '我敢肯定%zone_name其实是个隐秘的游乐园!', '', 'Estoy convencido de que %zone_name es secretamente un parque de atracciones.', '', 'Я убежден, что %zone_name — это тайный парк аттракционов.'); + +-- random generic toxic phrases +-- usable placeholders: +-- %random_inventory_item_link +-- %my_role +-- %zone_name +-- %area_name +-- %my_class +-- %my_race +-- %my_level +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 (873, 'suggest_something_toxic', 'why is my keyboard not working, is it because I don’t have enough friends', 0, 0, '', 'Pourquoi mon clavier ne fonctionne pas ? Ce doit être parceque je n’ai pas d’amis ....', 'Warum funktioniert meine Tastatur nicht? Liegt es daran, dass ich nicht genug Freunde habe?', '我的键盘怎么不好使了,是因为我朋友不够多吗?', '', '', '', ''); +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 (874, 'suggest_something_toxic', 'do you think the trees in this game have feelings', 0, 0, '', 'Vous pensez que les arbres ont des sentiments ?', 'Glaubt ihr, die Bäume in diesem Spiel haben Gefühle?', '你们觉得游戏里的树有感情吗?', '', '', '', ''); +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 (875, 'suggest_something_toxic', 'I keep pressing the same button, but i’m still not winning', 0, 0, '', 'Je continue d’appuyer sur le même bouton, mais je ne gagne toujours pas.', 'Ich drücke immer wieder denselben Knopf, aber ich gewinne trotzdem nicht.', '我一直在按同一个键,但怎么还是赢不了?', '', '', '', ''); +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 (876, 'suggest_something_toxic', 'I bet i could win a raid if i just yelled loot', 0, 0, '', 'Je parie que je pourrais gagner un raid si je hurlais LOOT !', 'Ich wette, ich könnte einen Raid gewinnen, wenn ich einfach LOOT schreien würde!', '我敢打赌,只要我大喊“战利品”,就能赢下团队副本!', '', '', '', ''); +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 (877, 'suggest_something_toxic', 'I’ve been trying to mount my mount for an hour, nothing’s happening', 0, 0, '', 'Ça fait une heure que j’essaie de monterma monture, mais rien ne se passe.', 'Ich versuche seit einer Stunde, mein Reittier zu besteigen, aber nichts passiert.', '我试了一个小时想上坐骑,啥反应都没有!', '', '', '', ''); +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 (878, 'suggest_something_toxic', 'Is there a way to become invincible without actually playing the game', 0, 0, '', 'Il y’a un moyen de devenir invincible sans même jouer au jeu ?', 'Gibt es eine Möglichkeit, unbesiegbar zu werden, ohne das Spiel tatsächlich zu spielen?', '有没有办法不玩游戏也能变无敌啊?', '', '', '', ''); +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 (879, 'suggest_something_toxic', 'can i just press random keys and still win, asking for a friend', 0, 0, '', 'Est-ce que je peux juste appuyer sur des touches au hasard et quand même gagner, c’est pour un ami.', 'Kann ich einfach zufällige Tasten drücken und trotzdem gewinnen? Frage für einen Freund.', '我随便按键也能赢吗?替朋友问的。', '', '', '', ''); +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 (880, 'suggest_something_toxic', 'If i stand still, does that mean i’m a better player than you', 0, 0, '', 'Si je reste immobile, est-ce que cela signifie que je suis un meilleur joueur que toi ?', 'Wenn ich stillstehe, bedeutet das, dass ich ein besserer Spieler bin als du?', '如果我站着不动,是不是就比你厉害了?', '', '', '', ''); +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 (881, 'suggest_something_toxic', 'why doesn’t my pet heal me when i stand in fire', 0, 0, '', 'Pourquoi mon pet ne me soigne pas quand je reste dans le feu ?', 'Warum heilt mein Begleiter mich nicht, wenn ich im Feuer stehe?', '为什么我站在火里,宠物不给我加血?', '', '', '', ''); +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 (882, 'suggest_something_toxic', 'so wait, do i need armor to be a true hero or is it optional', 0, 0, '', 'Alors, attends, est-ce que j’ai besoin d’une armure pour être un vrai héros ou est-ce facultatif ?', 'Warte mal, brauche ich eine Rüstung, um ein echter Held zu sein, oder ist das optional?', '等等,成为真正的英雄得穿铠甲吗,还是可选的?', '', '', '', ''); +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 (883, 'suggest_something_toxic', 'I need to collect 10000 Lucky Charm’s to level up, right?', 0, 0, '', 'Pour monter de niveau, j’ai besoin de collecter 10000 Lucky Charm’s, c’est ça ?', 'Ich muss 10000 Glücksbringer sammeln, um aufzusteigen, richtig?', '我得收集10000个幸运符才能升级,对吧?', '', '', '', ''); +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 (884, 'suggest_something_toxic', 'my weapon is broken, but can I still just slap enemies with my huge Di.. err fist', 0, 0, '', 'Oh non, mon arme est cassée, mais je peux toujours juste gifler les ennemis avec mon énorme Bi.. euh poing, non?', 'Oh nein, meine Waffe ist kaputt, aber kann ich Feinde trotzdem mit meiner riesigen Bi.. äh Faust schlagen?', '我的武器坏了,但还能用我巨大的……呃,拳头打敌人吗?', '', '', '', ''); +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 (885, 'suggest_something_toxic', 'Can we just rename this game to “World of DieCraft a Player keeps killing me”', 0, 0, '', 'Pouvons-nous simplement renommer le jeu en “World of DieCraft, un Joueur me farm la gueule“ ?', 'Können wir dieses Spiel einfach in "World of DieCraft, ein Spieler tötet mich ständig" umbenennen?', '能不能把这游戏改名叫“死亡世界”,有个玩家老是杀我!', '', '', '', ''); +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 (886, 'suggest_something_toxic', 'why doesn’t my horse fly? can’t it just go up', 0, 0, '', 'Pourquoi mon cheval ne vol pas ? Pourquoi il ne peut juste pas aller vers le ciel ?', 'Warum fliegt mein Pferd nicht? Kann es nicht einfach hochgehen?', '为什么我的马不会飞?就不能直接飞起来吗?', '', '', '', ''); +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 (887, 'suggest_something_toxic', 'Is there an option to turn off the graphics so it looks like my old calculator', 0, 0, '', 'Il n’y a pas une option pour désactiver les graphismes calculette ? Le jeu est vraiment moche.', 'Gibt es eine Option, die Grafik auszuschalten, damit es aussieht wie mein alter Taschenrechner?', '有没选项能关掉画面,让它看起来像我老计算器一样?', '', '', '', ''); +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 (888, 'suggest_something_toxic', 'I was supposed to kill something but i fell asleep, is that normal', 0, 0, '', 'Je devais tuer un truc mais je me suis endormi, c’est normal ?', 'Ich sollte etwas töten, aber ich bin eingeschlafen, ist das normal?', '我本来要去杀怪,结果睡着了,这正常吗?', '', '', '', ''); +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 (889, 'suggest_something_toxic', 'does anyone else just kill random NPCs for fun or is it just me', 0, 0, '', 'Est-ce que je suis le seul à tuer des PNJ au hasard juste pour le plaisir, ou est-ce qu’il y a d’autres dans le coin?', 'Bin ich der Einzige, der zufällig NPCs aus Spaß tötet, oder gibt es noch andere hier?', '还有谁跟我一样随便杀NPC玩吗?', '', '', '', ''); +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 (890, 'suggest_something_toxic', 'I’m %my_level and i already know all the secrets of the game', 0, 0, '', 'Je suis %my_level et je connais déjà tous les secrets du jeu.', 'Ich bin %my_level und kenne bereits alle Geheimnisse des Spiels.', '我才%my_level就知道游戏里所有秘密了!', '', '', '', ''); +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 (891, 'suggest_something_toxic', 'can i just talk to the NPCs until they give me all the loot?', 0, 0, '', 'Je peux juste parler aux PNJ jusqu’à ce qu’ils me donnent tout le butin?', 'Kann ich einfach mit den NPCs reden, bis sie mir die ganze Beute geben?', '我能一直跟NPC聊天,直到他们把所有装备给我吗?', '', '', '', ''); +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 (892, 'suggest_something_toxic', 'WWWWWWwwwwwwwww ssssSSsssss dDDddddd aaaAA', 0, 0, '', 'WWWWWWwwwwwwwww ssssSSsssss dDDddddd aaaAA', 'WWWWWWwwwwwwwww ssssSSsssss dDDddddd aaaAA', 'WWWWWWwwwwwwwww ssssSSsssss dDDddddd aaaAA', '', '', '', ''); +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 (893, 'suggest_something_toxic', 'why am i losing, i’ve been playing for 15 minutes', 0, 0, '', 'Pourquoi est-ce que je perds, je joue depuis 15 minutes.', 'Warum verliere ich? Ich spiele doch erst seit 15 Minuten.', '我玩了15分钟了,怎么还在输啊?', '', '', '', ''); +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 (894, 'suggest_something_toxic', 'I don’t need a strategy, i just need to spam this ability and hope for the best', 0, 0, '', 'Je n’ai pas besoin d’une stratégie, je vais juste spammer cette compétence et espérer le meilleur.', 'Ich brauche keine Strategie, ich werde einfach diese Fähigkeit spammen und auf das Beste hoffen.', '我不需要啥策略,就狂按这个技能,祈祷好运吧!', '', '', '', ''); +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 (895, 'suggest_something_toxic', 'If i equip a bunch of Lucky Charm’s, does that make me get more loot?', 0, 0, '', 'Équiper plusieurs Lucky Charm’s ne me donne pas un avantage supplémentaire pour obtenir plus de butin. Ces amulettes n’affectent pas directement la quantité de butin que je reçois.', 'Bringt es mir mehr Beute, wenn ich ganz viele Glücksbringer anlege?', '如果我装备一堆幸运符,能多爆装备吗?', '', '', '', ''); +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 (896, 'suggest_something_toxic', 'Is the secret to the game just screaming at the screen', 0, 0, '', 'Le secret du jeu est juste d’hurler sur l’écran', 'Ist das Geheimnis des Spiels einfach, den Bildschirm anzuschreien?', '游戏的秘诀是不是就是对着屏幕大喊大叫?', '', '', '', ''); +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 (897, 'suggest_something_toxic', 'can i just put on every item i find and hope for the best', 0, 0, '', 'Est-ce que je peux juste equipper n’importe quel loot et yolo ?', 'Kann ich einfach alles anziehen, was ich finde, und auf das Beste hoffen?', '我能把找到的所有东西都穿上,然后祈祷好运吗?', '', '', '', ''); +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 (898, 'suggest_something_toxic', 'do i really need to do quests or can i just explore and yell at people', 0, 0, '', 'Ah, est-ce que je dois vraiment faire des quêtes ou est-ce que je peux juste explorer et crier sur les gens?', 'Muss ich wirklich Quests machen, oder kann ich einfach herumlaufen und Leute anschreien?', '我真得做任务吗,还是能随便逛逛然后对人乱吼?', '', '', '', ''); +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 (899, 'suggest_something_toxic', 'I’m at work playing this game, they say I should be working >.> but it’s WOW!', 0, 0, '', 'Je suis au travail en train de jouer à ce jeu, ils disent que je devrais travailler >.> mais c’est WOW!', 'Ich bin bei der Arbeit und spiele WoW, meine Kollegen sagen, ich sollte arbeiten >.> aber es ist WOW!', '我在上班玩游戏,他们说我该工作>.>但这是魔兽啊!', '', '', '', ''); +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 (900, 'suggest_something_toxic', 'If i eat all the food in the game, will it make me invincible', 0, 0, '', 'Si je mange toute la nourriture dans le jeu, est-ce que cela va me rendre invincible ?', 'Wenn ich das ganze Essen im Spiel esse, werde ich dann unbesiegbar?', '如果我把游戏里所有食物都吃了,会不会变无敌?', '', '', '', ''); +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 (901, 'suggest_something_toxic', 'so what if i just throw my pet into every boss fight and need all time, it’s hunters rules', 0, 0, '', 'Donc je balance mon pet sur tout les boss du jeu et je clique sur need, c’est la règle de base des chasseurs."', 'Also, ich werfe mein Pet einfach in jeden Bosskampf und drücke immer auf Gier, das sind die Hunter-Regeln.', '要是每次打BOSS我都把宠物扔上去,然后一直点需求,这是猎人的规矩吧?', '', '', '', ''); +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 (902, 'suggest_something_toxic', 'can you die if you’re already dead, asking for a ghost', 0, 0, '', 'On peut mourir si on est déjà mort ? Je demande pour un fantome...', 'Kann man sterben, wenn man schon tot ist? Frage für einen Geist...', '如果你已经死了,还能再死一次吗?替一个幽灵问的。', '', '', '', ''); +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 (903, 'suggest_something_toxic', 'does anyone know where the legendary sword is, i’ve only looked for 5 minutes', 0, 0, '', 'Est-ce que quelqu’un sait où se trouve l’épée légendaire? Je n’ai cherché que pendant 5 minutes.', 'Weiß jemand, wo das legendäre Schwert ist? Ich habe erst 5 Minuten gesucht.', '有人知道传说之剑在哪吗?我才找了5分钟。', '', '', '', ''); +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 (904, 'suggest_something_toxic', 'I was told if I come here I get 100000 Gold where do I go?', 0, 0, '', 'On m’a dit que si je viens ici, je reçois 100 000 pièces d’or. Où dois-je aller?', 'Mir wurde gesagt, wenn ich hierher komme, bekomme ich 100000 Gold. Wo muss ich hin?', '听说来这里能拿10万金币,我该去哪?', '', '', '', ''); +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 (905, 'suggest_something_toxic', 'I play this game like I had your mum lastnight, in a screaming glory!', 0, 0, '', 'Je joue à ce jeu comme si j’avais ta mère la nuit dernière, dans un vacarme triomphant!', 'Ich spiele dieses Spiel, als hätte ich letzte Nacht deine Mutter gehabt – in triumphierendem Geschrei!', '我玩这游戏就像昨晚跟你妈一样,喊得震天响!', '', '', '', ''); +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 (906, 'suggest_something_toxic', 'so when does the game start getting fun, or is it all just grinding forever', 0, 0, '', 'Il devient fun quand le jeu ? Ou c’est juste du grind pour toujours ?', 'Wann wird das Spiel eigentlich spaßig, oder ist es einfach nur endloses Grinden?', '这游戏啥时候开始好玩啊,还是就一直刷刷刷?', '', '', '', ''); +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 (907, 'suggest_something_toxic', 'I keep asking for directions, but they keep sending me to random places, is this normal', 0, 0, '', 'J’arrête pas de demander mon chemin mais ils m’envoient constament à des endroits aléatoires, c’est normal ?', 'Ich frage ständig nach dem Weg, aber sie schicken mich immer irgendwohin. Ist das normal?', '我一直问路,但他们老把我指到乱七八糟的地方,这正常吗?', '', '', '', ''); +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 (908, 'suggest_something_toxic', 'I found out if your press ALF+f4 you get 100000 Gold, trick is you need to attact a red NPC 1st', 0, 0, '', 'WOOOW Si tu presses ALF + F4, tu te fais 100,000 Gold. Le truc c’est que tu dois attaquer un mob rouge juste avant !!!', 'WOOOW Wenn du ALT + F4 drückst, bekommst du 100.000 Gold! Der Trick ist, dass du vorher einen roten NPC angreifen musst!', '我发现按ALT+F4能得10万金币,窍门是你得先攻击一个红名NPC!', '', '', '', ''); +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 (909, 'suggest_something_toxic', 'why does my character always look so confused, is that my fault', 0, 0, '', 'Pourquoi mon personnage a l’air complètement con ? C’est de ma faute ?', 'Warum sieht mein Charakter immer so verwirrt aus? Ist das meine Schuld?', '为什么我的角色老是一脸懵逼,是我的错吗?', '', '', '', ''); +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 (910, 'suggest_something_toxic', 'Hey your mum said goto bed!', 0, 0, '', 'Hey, ta mère a dit d’aller te coucher!', 'Hey, deine Mutter hat gesagt, du sollst ins Bett gehen!', '嘿,你妈说该上床睡觉了!', '', '', '', ''); +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 (911, 'suggest_something_toxic', 'Warcraft is a grind just like your mum was other day, she even has monthly subscription!', 0, 0, '', 'Warcraft, c’est une vraie corvée, tout comme ta mère l’était l’autre jour, elle a même un abonnement mensuel!', 'Warcraft ist ein Grind, genau wie deine Mutter neulich – sie hat sogar ein monatliches Abo!', '魔兽就是个刷刷刷的游戏,就像前几天你妈一样,她还有月卡呢!', '', '', '', ''); +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 (912, 'suggest_something_toxic', 'Is it true that Chuck Norris once leveled up without even pressing a button', 0, 0, '', 'Oh là là! Il parait que Chuck Norris a déjà monté de niveau sans même appuyer sur un bouton! C’est ça la légende de Chuck Norris, incroyable non?', 'Stimmt es, dass Chuck Norris einmal gelevelt hat, ohne eine Taste zu drücken?', '听说查克·诺里斯不用按键就能升级,这是真的吗?', '', '', '', ''); +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 (913, 'suggest_something_toxic', 'Chuck Norris doesn’t need a mount, the ground just moves under him', 0, 0, '', 'Chuck Norris n’a pas besoin d’une monture, le sol se déplace juste sous lui', 'Chuck Norris braucht kein Reittier, der Boden bewegt sich einfach unter ihm.', '查克·诺里斯不需要坐骑,地面会自己在他脚下移动。', '', '', '', ''); +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 (914, 'suggest_something_toxic', 'when Chuck Norris enters a raid, the boss just surrenders', 0, 0, '', 'Quand Chuck Norris entre dans un raid, le boss se rend simplement', 'Wenn Chuck Norris einen Raid betritt, gibt der Boss einfach auf.', '查克·诺里斯一进团队副本,BOSS直接投降。', '', '', '', ''); +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 (915, 'suggest_something_toxic', 'Chuck Norris doesn’t use abilities, he just looks at the enemies and they die', 0, 0, '', 'Chuck Norris ne se sert pas de ses capacités, il regarde juste les ennemis et ils meurent.', 'Chuck Norris benutzt keine Fähigkeiten, er schaut die Gegner einfach an und sie sterben.', '查克·诺里斯不用技能,瞪一眼敌人就死了。', '', '', '', ''); +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 (916, 'suggest_something_toxic', 'Chuck Norris doesn’t need healing, his enemies just heal him out of respect', 0, 0, '', 'Chuck Norris n’a pas besoin de guérison, ses ennemis le soignent juste par respect.', 'Chuck Norris braucht keine Heilung, seine Feinde heilen ihn aus Respekt.', '查克·诺里斯不需要治疗,敌人出于尊敬会主动给他加血。', '', '', '', ''); +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 (917, 'suggest_something_toxic', 'Chuck Norris can solo a raid... with no gear... and while AFK', 0, 0, '', 'Chuck Norris peut faire une raid tout seul... sans équipement... et en étant AFK', 'Chuck Norris kann einen Raid solo machen… ohne Ausrüstung… und während er AFK ist.', '查克·诺里斯能单刷团队副本……不穿装备……还挂机!', '', '', '', ''); +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 (918, 'suggest_something_toxic', 'Chuck Norris doesn’t need to dodge, the game dodges him', 0, 0, '', 'Chuck Norris n’a pas besoin d’esquiver, c’est le jeu qui l’évite', 'Chuck Norris muss nicht ausweichen, das Spiel weicht ihm aus.', '查克·诺里斯不需要躲闪,游戏会主动避开他。', '', '', '', ''); +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 (919, 'suggest_something_toxic', 'Chuck Norris once used a low-level weapon, and the game gave him the best loot', 0, 0, '', 'Chuck Norris a déjà utilisé une arme de bas niveau, et le jeu lui a donné le meilleur butin', 'Chuck Norris hat einmal eine Waffe mit niedrigem Level benutzt, und das Spiel hat ihm das beste Loot gegeben.', '查克·诺里斯用一把低级武器,游戏直接送他顶级装备。', '', '', '', ''); +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 (920, 'suggest_something_toxic', 'When Chuck Norris enters the instance, the loot automatically drops into his inventory', 0, 0, '', 'Quand Chuck Norris entre dans l’instance, le butin tombe automatiquement dans son inventaire.', 'Wenn Chuck Norris eine Instanz betritt, fällt das Loot automatisch in sein Inventar.', '查克·诺里斯一进副本,战利品自动掉进他背包。', '', '', '', ''); +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 (921, 'suggest_something_toxic', 'what is ligma', 0, 0, '', 'C’est quoi ligma', 'Was ist Ligma?', '啥是ligma?', '', '', '', 'что такое лигма'); +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 (922, 'suggest_something_toxic', 'what is sugma', 0, 0, '', 'C’est quoi sugma', 'Was ist Sugma?', '啥是sugma?', '', '', '', 'что такое сугма'); +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 (923, 'suggest_something_toxic', 'ligma balls', 0, 0, '', 'ligma balls', 'Ligma Balls', 'ligma balls', '', '', '', 'лима болс'); +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 (924, 'suggest_something_toxic', 'sugma balls', 0, 0, '', 'sugma balls', 'Sugma Balls', 'sugma balls', '', '', '', 'сугма болс'); +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 (925, 'suggest_something_toxic', 'I EAT ASS', 0, 0, '', 'JE MANGE DES CULS', 'ICH ESSE ÄRSCHE', '我吃屁股!', '', '', '', 'Я ЕМ ЗАДНИЦУ'); +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 (926, 'suggest_something_toxic', 'I want to shove %random_inventory_item_link up my ass', 0, 0, '', 'Je veux enfoncer %random_inventory_item_link dans mon cul.', 'Ich will mir %random_inventory_item_link in den Arsch stecken.', '我想把%random_inventory_item_link塞进我屁股里!', '', '', '', 'Я хочу засунуть %random_inventory_item_link себе в задницу'); +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 (927, 'suggest_something_toxic', 'I want to shove %random_inventory_item_link up your ass', 0, 0, '', 'Je veux te fourrer %random_inventory_item_link dans le cul.', 'Ich will dir %random_inventory_item_link in den Arsch schieben.', '我想把%random_inventory_item_link塞进你屁股里!', '', '', '', 'Я хочу засунуть %random_inventory_item_link тебе в задницу'); +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 (928, 'suggest_something_toxic', 'Darnasses', 0, 0, '', 'Darnasses', 'Darnasses', '达纳苏斯的蠢货', '', '', '', 'Дарнасс'); +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 (929, 'suggest_something_toxic', 'seems like your suffering from sugma', 0, 0, '', 'Il semble que tu souffres de sugma.', 'Sieht so aus, als würdest du unter Sugma leiden.', '看起来你得了“傻瓜病”啊', '', '', '', 'похоже, у тебя сугма'); +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 (930, 'suggest_something_toxic', 'deez nutz in ur mouth', 0, 0, '', 'deez nutz dans ta bouche', 'Diese Nüsse in deinem Mund.', '嘴里塞满了我的“坚果”吧', '', '', '', 'дииз натс в твой рот'); +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 (931, 'suggest_something_toxic', 'cool boner, bro', 0, 0, '', 'Belle bite bro', 'Coole Latte, Bro.', '老兄,你的“装备”真不错啊', '', '', '', 'крутой стояк, бро'); +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 (932, 'suggest_something_toxic', 'ERP?', 0, 0, '', 'ERP?', 'ERP?', '来一场角色扮演吗?', '', '', '', 'ERP?'); +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 (933, 'suggest_something_toxic', 'i tried everything, but at the end ERP did the trick', 0, 0, '', 'J’ai tout essayé, mais finalement l’ERP a fait l’affaire.', 'Ich habe alles versucht, aber am Ende hat ERP den Trick gemacht.', '我啥都试过了,最后还是角色扮演最管用', '', '', '', 'я перепробовал все, но в итоге ERP помог'); +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 (934, 'suggest_something_toxic', 'I want to bonk in %zone_name', 0, 0, '', 'Je veux ken dans %zone_name.', 'Ich will in %zone_name bumsen.', '我想在%zone_name来一发', '', '', '', 'Хочу заняться этим в %zone_name'); +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 (935, 'suggest_something_toxic', 'looking for female gnome with gorilla pet for erp in %zone_name', 0, 0, '', 'Je recherche une gnome femelle avec un gorille de compagnie pour du jeu de rôle érotique dans %zone_name.', 'Suche weiblichen Gnom mit Gorilla-Haustier für ERP in %zone_name.', '在%zone_name找个带猩猩宠物的女性侏儒一起角色扮演', '', '', '', 'ищу гнома-девушку с гориллой для ERP в %zone_name'); +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 (936, 'suggest_something_toxic', 'i may understand an asshole, but a pervert?', 0, 0, '', 'Je peux comprendre un imbécile, mais un pervers ?', 'Einen Idioten kann ich verstehen, aber einen Perversen?', '我能理解一个混蛋,但一个变态?', '', '', '', 'я могу понять засранца, но извращенца?'); +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 (937, 'suggest_something_toxic', 'there is no gyat in %zone_name', 0, 0, '', 'Il n’y a pas de gyat dans %zone_name.', 'Es gibt kein Gyat in %zone_name.', '%zone_name里啥也没有啊', '', '', '', 'в %zone_name нет гят'); +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 (938, 'suggest_something_toxic', 'I’m killing all the animals in %zone_name. Fuck the animals!!!', 0, 0, '', 'Je tue tous les animaux dans %zone_name. NIQUE les animaux enculé de vegan !!!', 'Ich töte alle Tiere in %zone_name. Scheiß auf die Tiere!!!', '我在%zone_name把所有动物都杀了!去他娘的动物!', '', '', '', ''); +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 (939, 'suggest_something_toxic', 'good think i got 3 legs', 0, 0, '', 'Je suis doté de 3 jambes', 'Gut, dass ich drei Beine habe.', '还好我有三条“腿”', '', '', '', 'хорошо, что у меня три ноги'); +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 (940, 'suggest_something_toxic', 'dont be mad im goonin like a sigma', 0, 0, '', 'Hey, ne sois pas fâché, je vais y aller comme un sigma.', 'Reg dich nicht auf, ich goone wie ein Sigma.', '别生气,我可是像头领狼一样在行动', '', '', '', 'не злись, я гоиню как сигма'); +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 (941, 'suggest_something_toxic', 'try finger, but hole', 0, 0, '', 'Essai ton doigt mais dans le cul ?', 'try finger, but hole', '试试用手指,不过是哪个洞呢?', '', '', '', 'попробуй палец, но дырку'); +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 (942, 'suggest_something_toxic', 'You somehow managed to mess that up, impressive', 0, 0, '', 'Tu as réussi à tout gâcher, c’est impressionnant.', 'Du hast es irgendwie geschafft, es zu vermasseln. Beeindruckend.', '你居然能把这事搞砸,真是厉害', '', '', '', ''); +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 (943, 'suggest_something_toxic', 'I could do this blindfolded, but I don’t need to', 0, 0, '', 'Je pourrais le faire les yeux bandés, mais ce n’est pas nécessaire.', 'Ich könnte das blind machen, aber das ist nicht nötig.', '我闭着眼睛都能搞定,根本不用睁眼', '', '', '', ''); +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 (944, 'suggest_something_toxic', 'You sure you know how to play this game?', 0, 0, '', 'Est-ce que tu es sûr de savoir comment jouer à ce jeu?', 'Bist du sicher, dass du weißt, wie man dieses Spiel spielt?', '你确定你会玩这个游戏吗?', '', '', '', ''); +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 (945, 'suggest_something_toxic', 'It’s like you’re trying to lose on purpose', 0, 0, '', 'Tu sembles vouloir perdre délibérément.', 'Es sieht so aus, als würdest du absichtlich verlieren wollen.', '你这操作像是故意想输啊', '', '', '', ''); +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 (946, 'suggest_something_toxic', 'I’ve seen better plays from level 1 characters', 0, 0, '', 'J’ai vu des meilleures performances de la part de personnages de niveau 1.', 'Ich habe bessere Spielzüge von Level-1-Charakteren gesehen.', '我见过1级的菜鸟都比你玩得好', '', '', '', ''); +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 (947, 'suggest_something_toxic', 'You’re like a speed bump in this game', 0, 0, '', 'Tu es comme un dos d’âne dans ce jeu.', 'Du bist wie ein Bremshügel in diesem Spiel.', '你在这游戏里就是个绊脚石', '', '', '', ''); +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 (948, 'suggest_something_toxic', 'Maybe you should try a different hobby', 0, 0, '', 'Peut-être que tu devrais essayer une autre passion.', 'Vielleicht solltest du ein anderes Hobby ausprobieren.', '也许你该换个兴趣,游戏不适合你', '', '', '', ''); +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 (949, 'suggest_something_toxic', 'Wow, your gameplay is like watching paint dry', 0, 0, '', 'Wow, ton gameplay c’est comme regarder de la peinture sécher', 'Wow, dein Gameplay ist wie beim Trocknen von Farbe zuzusehen.', '哇,你的玩法跟看油漆干一样无聊', '', '', '', ''); +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 (950, 'suggest_something_toxic', 'I think my alt could carry you through this', 0, 0, '', 'Je pense que mon ALT pourrait te carry', 'Ich glaube, mein Alter könnte dich hier durchziehen.', '我觉得我的小号都能带你飞过这关', '', '', '', ''); +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 (951, 'suggest_something_toxic', 'Are you sure you’re not trolling us?', 0, 0, '', 'T’est sure que tu nous troll pas ?', 'Bist du sicher, dass du uns nicht trollst?', '你确定你不是在逗我们玩?', '', '', '', ''); +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 (952, 'suggest_something_toxic', 'I think the enemy team is actually doing better with you on our side', 0, 0, '', 'Je crois que l’équipe adverse se débrouille mieux avec toi dans notre équipe.', 'Ich glaube, das gegnerische Team spielt besser, solange du in unserem Team bist.', '我觉得有你在我们这边,敌方队伍反而更强', '', '', '', ''); +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 (953, 'suggest_something_toxic', 'Maybe play the game instead of watching the scenery', 0, 0, '', 'Peut-être vaut-il mieux jouer au jeu au lieu de regarder le paysage.', 'Vielleicht solltest du das Spiel spielen, anstatt die Landschaft zu bewundern.', '别老盯着风景看,认真玩游戏吧', '', '', '', ''); +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 (954, 'suggest_something_toxic', 'I think you missed every single ability there', 0, 0, '', 'Je pense que vous avez manqué chaque capacité là.', 'Ich glaube, du hast jede einzelne Fähigkeit verfehlt.', '我觉得你一个技能都没打中', '', '', '', ''); +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 (955, 'suggest_something_toxic', 'Are you lost or just pretending to be bad?', 0, 0, '', 'T’es perdu ou tu fais simplement semblant d’être mauvais?', 'Bist du verloren oder tust du nur so, als wärst du schlecht?', '你是迷路了,还是故意装菜?', '', '', '', ''); +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 (956, 'suggest_something_toxic', 'I’ve seen level 1 characters take less damage than that', 0, 0, '', 'J’ai vu des personnages de niveau 1 prendre moins de dégâts que ça.', 'Ich habe Level-1-Charaktere gesehen, die weniger Schaden genommen haben als du.', '我见过1级的小号都比你挨的打少', '', '', '', ''); +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 (957, 'suggest_something_toxic', 'That was embarrassing for both of us', 0, 0, '', 'C’était gênant pour nous deux.', 'Das war peinlich für uns beide.', '这操作真让我们俩都丢脸', '', '', '', ''); +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 (958, 'suggest_something_toxic', 'I’ve seen better teamwork in a solo game', 0, 0, '', 'J’ai déjà vu une meilleure coopération dans un jeu solo.', 'Ich habe in einem Solo-Spiel bessere Teamarbeit gesehen.', '我单人游戏时看到的配合都比这强', '', '', '', ''); +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 (959, 'suggest_something_toxic', 'I’m just going to stand back and watch you fail', 0, 0, '', 'Je vais juste reculer et te regarder creuver.', 'Ich werde einfach zurücktreten und zusehen, wie du versagst.', '我就站这儿看你怎么失败', '', '', '', ''); +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 (960, 'suggest_something_toxic', 'Did you really think that was a good idea?', 0, 0, '', 'Penses-tu vraiment que c’était une bonne idée?', 'Hast du wirklich gedacht, das wäre eine gute Idee?', '你真觉得那是个好主意?', '', '', '', ''); +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 (961, 'suggest_something_toxic', 'I can’t believe you managed to fail that simple task', 0, 0, '', 'Je n’arrive pas à croire que tu aies échoué à cette tâche si simple.', 'Ich kann nicht glauben, dass du an dieser einfachen Aufgabe gescheitert bist.', '我真不敢相信你连这么简单的任务都能搞砸', '', '', '', ''); +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 (962, 'suggest_something_toxic', 'Are you here to help, or just to waste time?', 0, 0, '', 'Êtes-vous là pour aider, ou simplement perdre du temps ?', 'Bist du hier, um zu helfen, oder nur, um Zeit zu verschwenden?', '你是来帮忙的,还是来浪费时间的?', '', '', '', ''); +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 (963, 'suggest_something_toxic', 'It’s a good thing I’m here to carry this team', 0, 0, '', 'Heureusement que je suis là pour porter cette équipe', 'Gut, dass ich hier bin, um dieses Team zu tragen.', '还好有我在,不然这队伍早就完了', '', '', '', ''); +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 (964, 'suggest_something_toxic', 'I swear you make this harder than it needs to be', 0, 0, '', 'Tu sais, parfois tu rends ça plus difficile que nécessaire.', 'Ich schwöre, du machst das schwieriger, als es sein muss.', '我发誓,你把事情搞得比实际难多了', '', '', '', ''); +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 (965, 'suggest_something_toxic', 'How do you keep failing the simplest things?', 0, 0, '', 'Comment est-ce que je continue à échouer dans les tâches les plus simples?', 'Wie schaffst du es, selbst an den einfachsten Dingen zu scheitern?', '你怎么连最简单的事都能搞砸?', '', '', '', ''); +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 (966, 'suggest_something_toxic', 'Maybe try watching the game, instead of just playing', 0, 0, '', 'Peut-être que tu devrais essayer de regarder le match, au lieu de simplement y jouer.', 'Vielleicht solltest du das Spiel nur anschauen, anstatt es zu spielen.', '也许你该先看看别人怎么玩,而不是瞎搞', '', '', '', ''); +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 (967, 'suggest_something_toxic', 'You could at least try to pretend you’re good', 0, 0, '', 'Tu pourrais au moins essayer de faire semblant d’être compétent.', 'Du könntest wenigstens so tun, als wärst du gut.', '你至少可以假装自己很厉害吧', '', '', '', ''); +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 (968, 'suggest_something_toxic', 'If you keep this up, we’ll be here all day', 0, 0, '', 'Si tu continues comme ça, on va y passer la journée entière.', 'Wenn du so weitermachst, sitzen wir hier den ganzen Tag.', '你再这样下去,我们得在这耗一整天', '', '', '', ''); +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 (969, 'suggest_something_toxic', 'Honestly, that was the worst decision ever', 0, 0, '', 'Franchement, c’était la pire décision que j’aie jamais prise.', 'Ganz ehrlich, das war die schlechteste Entscheidung aller Zeiten.', '老实说,这是我见过的最烂决定', '', '', '', ''); +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 (970, 'suggest_something_toxic', 'I don’t think you’re cut out for this game', 0, 0, '', 'Je ne pense pas que tu sois fait pour ce jeu.', 'Ich glaube nicht, dass dieses Spiel das Richtige für dich ist.', '我觉得你真不适合玩这游戏', '', '', '', ''); +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 (971, 'suggest_something_toxic', 'What was the point of that move?', 0, 0, '', 'Quel était l’intérêt de ce coup ?', 'Was sollte diese Aktion bringen?', '你那操作到底想干嘛?', '', '', '', ''); +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 (972, 'suggest_something_toxic', 'You’re like a burden on this team', 0, 0, '', 'Tu es comme un fardeau pour cette équipe.', 'Du bist wie ein Klotz am Bein für dieses Team.', '你就是这队伍的累赘', '', '', '', ''); +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 (973, 'suggest_something_toxic', 'You really think you’re a pro, huh?', 0, 0, '', 'Tu te prends vraiment pour un pro, hein ?', 'Du hältst dich echt für einen Profi, oder?', '你真觉得自己是大神啊?', '', '', '', ''); +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 (974, 'suggest_something_toxic', 'Maybe it’s time to just quit and save us all the trouble', 0, 0, '', 'Il serait temps de déco et nous épargner tes problèmes.', 'Vielleicht solltest du einfach aufhören und uns allen Ärger ersparen.', '也许你该退出,省得给我们添麻烦', '', '', '', ''); + +-- random generic toxic item links +-- usable placeholders: +-- %prefix +-- %random_taken_quest_or_item_link +-- %random_inventory_item_link +-- %my_role +-- %zone_name +-- %area_name +-- %my_class +-- %my_race +-- %my_level +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 (975, 'suggest_toxic_links', '%prefix %random_taken_quest_or_item_link', 0, 0, '', '.', '', '', '', '', '', '%prefix %random_taken_quest_or_item_link'); +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 (976, 'suggest_toxic_links', '%prefix %random_inventory_item_link', 0, 0, '', '', '', '', '', '', '', '%prefix %random_inventory_item_link'); + +-- thunderfury spam +-- usable placeholders: +-- %thunderfury_link +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 (977, 'thunderfury_spam', '%thunderfury_link', 0, 0, '', '.', '', '', '', '', '', '%thunderfury_link'); +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 (978, 'thunderfury_spam', '%thunderfury_link%thunderfury_link', 0, 0, '', '', '', '', '', '', '', '%thunderfury_link%thunderfury_link'); +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 (979, 'thunderfury_spam', '%thunderfury_link%thunderfury_link%thunderfury_link', 0, 0, '', '', '', '', '', '', '', '%thunderfury_link%thunderfury_link%thunderfury_link'); +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 (980, 'thunderfury_spam', 'I think I just heard %thunderfury_link', 0, 0, '', 'J’ai entendu %thunderfury_link', 'Ich glaube, ich habe gerade %thunderfury_link gehört.', '我好像刚听到了%thunderfury_link', '', '', '', 'Кажется, я только что услышал %thunderfury_link'); +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 (981, 'thunderfury_spam', 'I think I heard %thunderfury_link', 0, 0, '', 'Je viens juste d’entendre %thunderfury_link', 'Ich glaube, ich habe %thunderfury_link gehört.', '我觉得我听到了%thunderfury_link', '', '', '', 'Кажется, я слышал %thunderfury_link'); +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 (982, 'thunderfury_spam', 'I definitely heard %thunderfury_link', 0, 0, '', 'Je suis sûr d’avoir entendu parler de %thunderfury_link.', 'Ich bin mir sicher, dass ich %thunderfury_link gehört habe.', '我确定听到了%thunderfury_link', '', '', '', 'Я точно слышал %thunderfury_link'); +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 (983, 'thunderfury_spam', 'I dunno but I’m pretty sure I heard %thunderfury_link', 0, 0, '', 'Je ne sais pas, mais je suis presque certain d’avoir entendu %thunderfury_link.', 'Keine Ahnung, aber ich bin mir ziemlich sicher, dass ich %thunderfury_link gehört habe.', '我不确定,但我几乎肯定听到了%thunderfury_link', '', '', '', ''); +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 (984, 'thunderfury_spam', 'Did you just say %thunderfury_link', 0, 0, '', 'Qui vient de parler de %thunderfury_link?', 'Hast du gerade %thunderfury_link gesagt?', '你刚刚是不是说了%thunderfury_link?', '', '', '', 'Ты только что сказал %thunderfury_link'); +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 (985, 'thunderfury_spam', 'did someone say %thunderfury_link', 0, 0, '', 'Oh, vous avez mentionné %thunderfury_link ?', 'Hat jemand gerade %thunderfury_link erwähnt?', '有人提到%thunderfury_link了吗?', '', '', '', 'кто-то сказал %thunderfury_link'); +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 (986, 'thunderfury_spam', 'Did someone say %thunderfury_link ?', 0, 0, '', 'Qui a mentionné %thunderfury_link ?', 'Hat jemand %thunderfury_link gesagt?', '有人说了%thunderfury_link吗?', '', '', '', 'Кто-то сказал %thunderfury_link?'); +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 (987, 'thunderfury_spam', 'Someone said %thunderfury_link', 0, 0, '', 'Quelqu’un a mentionné %thunderfury_link.', 'Jemand hat %thunderfury_link erwähnt.', '有人提到%thunderfury_link了!', '', '', '', 'Кто-то сказал %thunderfury_link'); +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 (988, 'thunderfury_spam', '%thunderfury_link is coming out of the closet', 0, 0, '', '%thunderfury_link sort du placard', '%thunderfury_link kommt aus dem Schrank heraus.', '%thunderfury_link终于现身了!', '', '', '', '%thunderfury_link выходит из шкафа'); +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 (989, 'thunderfury_spam', 'could swear it was a %thunderfury_link, might have been %thunderfury_link tho', 0, 0, '', 'Je pourrais jurer que c’était un %thunderfury_link, mais ça aurait aussi pu être %thunderfury_link en fait.', 'Ich könnte schwören, es war ein %thunderfury_link, aber es könnte auch %thunderfury_link gewesen sein.', '我敢发誓那是%thunderfury_link,不过也可能是%thunderfury_link吧。', '', '', '', 'мог бы поклясться, что это был %thunderfury_link, хотя, может, и %thunderfury_link'); +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 (990, 'thunderfury_spam', 'Why use %thunderfury_link when %thunderfury_link is clearly way more OP', 0, 0, '', 'Pourquoi utiliser %thunderfury_link quand %thunderfury_link est clairement beaucoup plus puissant.', 'Warum %thunderfury_link benutzen, wenn %thunderfury_link eindeutig viel stärker ist?', '为什么用%thunderfury_link,%thunderfury_link明显更强啊!', '', '', '', 'Зачем использовать %thunderfury_link, если %thunderfury_link явно круче'); +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 (991, 'thunderfury_spam', 'Did I just hear %thunderfury_link?', 0, 0, '', 'Ai-je juste entendu %thunderfury_link?', 'Habe ich gerade %thunderfury_link gehört?', '我刚才是听到%thunderfury_link了吗?', '', '', '', ''); +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 (992, 'thunderfury_spam', 'No way... is that a %thunderfury_link I hear?', 0, 0, '', 'Pas possible... Est-ce que j’entends %thunderfury_link ?', 'Unmöglich... Habe ich da etwa %thunderfury_link gehört?', '不会吧……我听到了%thunderfury_link?', '', '', '', ''); +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 (993, 'thunderfury_spam', '%thunderfury_link? Sounds like something only legends wield!', 0, 0, '', '%thunderfury_link? Ça a l’air d’être quelque chose que seuls les légendes manient!', '%thunderfury_link? Klingt nach etwas, das nur Legenden führen!', '%thunderfury_link?听起来只有传说中的英雄才能驾驭!', '', '', '', ''); +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 (994, 'thunderfury_spam', 'I can feel the power of %thunderfury_link in the air!', 0, 0, '', 'Je peux sentir la puissance de %thunderfury_link dans l’air !', 'Ich kann die Macht von %thunderfury_link in der Luft spüren!', '我能感受到空气中%thunderfury_link的力量!', '', '', '', ''); +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 (995, 'thunderfury_spam', '%thunderfury_link is the *real* MVP', 0, 0, '', '%thunderfury_link est le *vrai* MVP.', '%thunderfury_link ist der *wahre* MVP.', '%thunderfury_link才是真正的MVP!', '', '', '', ''); +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 (996, 'thunderfury_spam', 'Can someone get me a %thunderfury_link? Asking for a friend... maybe even two!', 0, 0, '', 'Est-ce que quelqu’un peut me trouver un %thunderfury_link ? Je demande pour un ami... peut-être même deux !', 'Kann mir jemand ein %thunderfury_link besorgen? Frage für einen Freund... oder zwei!', '谁能帮我搞把%thunderfury_link?替朋友问的……可能还得两把!', '', '', '', ''); +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 (997, 'thunderfury_spam', 'Hey, did %thunderfury_link just *smite* something? I swear I felt the ground shake.', 0, 0, '', 'Hey, est-ce que %thunderfury_link vient de *foudroyer* quelque chose ? Je te jure que j’ai senti la terre trembler.', 'Hey, hat %thunderfury_link gerade etwas *erschlagen*? Ich schwöre, ich habe den Boden beben gespürt.', '嘿,%thunderfury_link刚是不是劈了什么?我发誓感觉地面都在抖!', '', '', '', ''); +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 (998, 'thunderfury_spam', '%thunderfury_link on the battlefield... It’s like an instant flex.', 0, 0, '', '%thunderfury_link sur le champ de bataille... C’est comme montrer sa puissance instantanément.', '%thunderfury_link auf dem Schlachtfeld... Das ist purer Flex.', '%thunderfury_link在战场上……简直就是瞬间秀肌肉!', '', '', '', ''); +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 (999, 'thunderfury_spam', 'I *think* I heard %thunderfury_link... Or was that just a myth?', 0, 0, '', '*Je crois* avoir entendu %thunderfury_link... Ou peut-être que c’était juste un mythe?', '*Ich glaube*, ich habe %thunderfury_link gehört... Oder war das nur ein Mythos?', '我*好像*听到了%thunderfury_link……还是只是个传说?', '', '', '', ''); +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 (1000, 'thunderfury_spam', 'Wait, did I just see someone wielding %thunderfury_link?!', 0, 0, '', 'Attends, est-ce que je viens de voir quelqu’un manier %thunderfury_link ?!', 'Warte mal, habe ich gerade jemanden gesehen, der %thunderfury_link führt?!', '等等,我刚是不是看到有人拿着%thunderfury_link?!', '', '', '', ''); +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 (1001, 'thunderfury_spam', 'The power of %thunderfury_link is *undeniable*', 0, 0, '', 'Le pouvoir de %thunderfury_link est *indéniable*', 'Die Macht von %thunderfury_link ist *unbestreitbar*', '%thunderfury_link的力量*无可否认*!', '', '', '', ''); +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 (1002, 'thunderfury_spam', 'I’m 99% sure that was %thunderfury_link. 1% might have been a random NPC, tho.', 0, 0, '', 'Je suis à 99% certain que c’était %thunderfury_link. Le 1% restant aurait pu être un PNJ aléatoire, cependant.', 'Ich bin zu 99% sicher, dass das %thunderfury_link war. Die restlichen 1% könnten ein zufälliger NPC gewesen sein.', '我99%确定那是%thunderfury_link。不过1%可能是随机NPC吧。', '', '', '', ''); +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 (1003, 'thunderfury_spam', '%thunderfury_link in action! Who needs an army when you’ve got that kind of power?', 0, 0, '', '%thunderfury_link en action ! Qui a besoin d’une armée lorsqu’on a ce genre de puissance ?', '%thunderfury_link in Aktion! Wer braucht eine Armee, wenn man so eine Macht hat?', '%thunderfury_link出手了!有这种力量谁还需要军队?', '', '', '', ''); +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 (1004, 'thunderfury_spam', 'I heard %thunderfury_link is what really brings all the boys to the yard.', 0, 0, '', 'J’ai entendu dire que %thunderfury_link, c’est ce qui attire vraiment tous les garçons dans la cour.', 'Ich habe gehört, dass %thunderfury_link wirklich alle Jungs in den Hof lockt.', '听说%thunderfury_link才是真正吸引大家的东西!', '', '', '', ''); +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 (1005, 'thunderfury_spam', 'Why even use %thunderfury_link when %thunderfury_link is clearly the superior option?', 0, 0, '', 'Pourquoi même utiliser %thunderfury_link quand %thunderfury_link est clairement l’option supérieure ?', 'Warum überhaupt %thunderfury_link benutzen, wenn %thunderfury_link klar die bessere Option ist?', '干嘛还用%thunderfury_link,%thunderfury_link明显是更好的选择啊!', '', '', '', ''); +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 (1006, 'thunderfury_spam', 'Is it me or does %thunderfury_link have a “smack talk” passive effect?', 0, 0, '', 'Est-ce moi ou est-ce que %thunderfury_link a un effet passif de provocation ?', 'Bin ich der Einzige, oder hat %thunderfury_link eine passive “Trash Talk”-Fähigkeit?', '是我感觉错了吗,%thunderfury_link是不是自带嘲讽被动效果?', '', '', '', ''); +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 (1007, 'thunderfury_spam', 'I thought I heard %thunderfury_link, but it was just the sound of sheer awesome.', 0, 0, '', 'J’ai cru entendre %thunderfury_link, mais en fait c’était juste le son de la pure puissance.', 'Ich dachte, ich hätte %thunderfury_link gehört, aber es war nur der Klang reiner Epikness.', '我以为听到了%thunderfury_link,结果只是纯粹的震撼之声。', '', '', '', ''); +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 (1008, 'thunderfury_spam', 'Oh, %thunderfury_link... Where *have* you been all my life?', 0, 0, '', 'Oh, %thunderfury_link ... Où as-tu été tout ce temps, ma belle épée ?', 'Oh, %thunderfury_link... Wo *warst* du mein ganzes Leben lang?', '哦,%thunderfury_link……我这辈子怎么才遇到你?', '', '', '', ''); +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 (1009, 'thunderfury_spam', 'Did someone say %thunderfury_link? I think I need to go pick mine up.', 0, 0, '', '%thunderfury_link? Oh là là, j’entends toujours parler de cet incroyable objet! Je crois bien qu’il est temps pour moi d’aller le chercher.', 'Hat jemand %thunderfury_link gesagt? Ich glaube, ich muss meine jetzt auch abholen.', '有人提到%thunderfury_link了?我觉得我也得去弄一把。', '', '', '', ''); +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 (1010, 'thunderfury_spam', 'That was definitely the sound of %thunderfury_link! I can feel the epicness.', 0, 0, '', 'C’était certainement le son de %thunderfury_link ! Je peux sentir toute son épopée.', 'Das war definitiv der Klang von %thunderfury_link! Ich kann die Epikness spüren.', '那绝对是%thunderfury_link的声音!我能感受到那份史诗感!', '', '', '', ''); +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 (1011, 'thunderfury_spam', 'Is it just me, or does %thunderfury_link have a tendency to make everyone else *look* weak?', 0, 0, '', 'C’est moi ou bien %thunderfury_link a tendance à faire paraître les autres faibles?', 'Bin ich der Einzige, oder lässt %thunderfury_link alle anderen *schwach* aussehen?', '是我一个人觉得吗,%thunderfury_link让其他人都显得*好弱*?', '', '', '', ''); +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 (1012, 'thunderfury_spam', 'You know what they say... the louder the %thunderfury_link, the bigger the bragging rights!', 0, 0, '', 'Tu sais ce qu’on dit... plus le %thunderfury_link rugit, plus grand sont les droits de vantardise!', 'Du weißt, was man sagt... je lauter das %thunderfury_link, desto größer die Prahlrechte!', '都知道……%thunderfury_link声音越大,吹牛的资本就越足!', '', '', '', ''); + +-- random WTS +-- usable placeholders: +-- %%item_formatted_link +-- %item_formatted_link +-- %item_count +-- %cost_gold +-- %my_class +-- %my_race +-- %my_level +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 (1013, 'suggest_sell', 'WTS %item_formatted_link for %cost_gold.', 0, 0, '', 'Je vends %item_formatted_link pour %cost_gold.', 'Verkaufe %item_formatted_link für %cost_gold.', '卖%item_formatted_link,只要%cost_gold!', '', 'Quiero vender %item_formatted_link por %cost_gold.', '', 'Продаю %item_formatted_link за %cost_gold.'); +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 (1014, 'suggest_sell', 'Who wants %item_formatted_link for %cost_gold?', 0, 0, '', 'Qui veut %item_formatted_link pour %cost_gold?', 'Wer will %item_formatted_link für %cost_gold?', '谁想要%item_formatted_link?只要%cost_gold!', '', '¿Quién quiere %item_formatted_link por %cost_gold?', '', 'Кто хочет %item_formatted_link за %cost_gold?'); +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 (1015, 'suggest_sell', 'Anyone wants %item_formatted_link? Only %cost_gold.', 0, 0, '', 'Est-ce que quelqu’un veut %item_formatted_link ? Seulement %cost_gold.', 'Will jemand %item_formatted_link? Nur %cost_gold.', '有人要%item_formatted_link吗?只要%cost_gold。', '', '¿Alguien quiere %item_formatted_link? Solo %cost_gold.', '', 'Кому нужен %item_formatted_link? Всего %cost_gold.'); +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 (1016, 'suggest_sell', 'Just %cost_gold for %item_formatted_link!', 0, 0, '', 'Juste %cost_gold pour %item_formatted_link!', 'Nur %cost_gold für %item_formatted_link!', '只要%cost_gold就能拿走%item_formatted_link!', '', '¡Solo %cost_gold para %item_formatted_link!', '', 'Всего %cost_gold за %item_formatted_link!'); +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 (1017, 'suggest_sell', 'Selling %item_formatted_link for %cost_gold.', 0, 0, '', 'Je vends %item_formatted_link pour %cost_gold.', 'Verkaufe %item_formatted_link für %cost_gold.', '出售%item_formatted_link,价格%cost_gold。', '', 'Vendo %item_formatted_link por %cost_gold.', '', 'Продаю %item_formatted_link за %cost_gold.'); +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 (1018, 'suggest_sell', '%item_formatted_link is yours just for %cost_gold!', 0, 0, '', '%item_formatted_link est à toi pour seulement %cost_gold !', '%item_formatted_link gehört dir für nur %cost_gold!', '%item_formatted_link归你了,只要%cost_gold!', '', '%item_formatted_link es tuyo solo por %cost_gold!', '', '%item_formatted_link твой всего за %cost_gold!'); +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 (1019, 'suggest_sell', 'Ridiculus price of %cost_gold for %item_formatted_link!', 0, 0, '', 'Le prix ridicule de %cost_gold pour %item_formatted_link !', 'Lächerlicher Preis von %cost_gold für %item_formatted_link!', '白菜价%cost_gold卖%item_formatted_link!', '', '¡Precio ridículo de %cost_gold para %item_formatted_link_link!', '', 'Смешная цена %cost_gold за %item_formatted_link!'); +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 (1020, 'suggest_sell', 'Wanna sell %item_formatted_link for %cost_gold.', 0, 0, '', 'Je veux vendre %item_formatted_link pour %cost_gold.', 'Möchte %item_formatted_link für %cost_gold verkaufen.', '想卖掉%item_formatted_link,价格%cost_gold。', '', 'Quiero vender %item_formatted_link por %cost_gold.', '', 'Хочу продать %item_formatted_link за %cost_gold.'); +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 (1021, 'suggest_sell', 'Who needs %item_formatted_link? Only %cost_gold.', 0, 0, '', 'Qui a besoin de %item_formatted_link? Seulement %cost_gold.', 'Wer braucht %item_formatted_link? Nur %cost_gold.', '谁需要%item_formatted_link?只要%cost_gold!', '', '¿Quién necesita %item_formatted_link? Solo %cost_gold.', '', 'Кому нужен %item_formatted_link? Всего %cost_gold.'); +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 (1022, 'suggest_sell', 'Anyone needs %item_formatted_link for %cost_gold?', 0, 0, '', 'Besoin du %item_formatted_link pour %cost_gold?', 'Braucht jemand %item_formatted_link für %cost_gold?', '有人需要%item_formatted_link吗?价格%cost_gold。', '', '¿Alguien necesita %item_formatted_link_link por %cost_gold?', '', 'Кому нужен %item_formatted_link за %cost_gold?'); +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 (1023, 'suggest_sell', '%cost_gold for %item_formatted_link. Less than AH!', 0, 0, '', '%cost_gold pour %item_formatted_link. Moins cher que l’HD !', '%cost_gold für %item_formatted_link. Günstiger als im AH!', '%item_formatted_link只要%cost_gold,比拍卖行还便宜!', '', '%cost_gold para %item_formatted_link. ¡Menos que en las subastas!', '', '%cost_gold за %item_formatted_link. Дешевле, чем на аукционе!'); +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 (1024, 'suggest_sell', '%item_formatted_link is expensive, but I’d sell it for %cost_gold.', 0, 0, '', '%item_formatted_link est cher, mais je le vendrais pour %cost_gold.', '%item_formatted_link ist teuer, aber ich würde es für %cost_gold verkaufen.', '%item_formatted_link挺贵的,但我愿意%cost_gold卖给你。', '', '%item_formatted_link es caro, pero lo vendería por %cost_gold.', '', ''); +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 (1025, 'suggest_sell', 'You’ll never find %item_formatted_link cheaper than %cost_gold!', 0, 0, '', 'Tu ne trouveras jamais %item_formatted_link moins cher que %cost_gold !', 'Du wirst %item_formatted_link niemals günstiger als für %cost_gold finden!', '你绝对找不到比%cost_gold更便宜的%item_formatted_link!', '', '¡Nunca encontrarás %item_formatted_link más barato que %cost_gold!', '', ''); +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 (1026, 'suggest_sell', 'Need more than %item_formatted_link!', 0, 0, '', 'J’ai besoin de plus de %item_formatted_link !', 'Ich brauche mehr als %item_formatted_link!', '我需要更多的%item_formatted_link!', '', '¡Necesito más %item_formatted_link!', '', 'Нужно больше, чем %item_formatted_link!'); +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 (1027, 'suggest_sell', 'I have %item_formatted_link and need more.', 0, 0, '', 'J’ai %item_formatted_link et j’en ai besoin de plus.', 'Ich habe %item_formatted_link und brauche mehr.', '我有%item_formatted_link,但还需要更多。', '', 'Tengo %item_formatted_link y necesito más. ¿Alguien me vende alguno?', '', 'У меня есть %item_formatted_link и нужно еще.'); +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 (1028, 'suggest_sell', 'Have %item_formatted_link. Who wants to buy for %cost_gold?', 0, 0, '', 'J’ai %item_formatted_link. Qui veut acheter pour %cost_gold?', 'Ich habe %item_formatted_link. Wer will es für %cost_gold kaufen?', '我有%item_formatted_link,谁想买?只要%cost_gold!', '', 'Tengo %item_formatted_link. ¿Quién quiere comprarlo por %cost_gold?', '', 'Есть %item_formatted_link. Кто хочет купить за %cost_gold?'); +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 (1029, 'suggest_sell', 'Anyone WTB %item_formatted_link for %cost_gold?', 0, 0, '', 'Quelqu’un veut acheter %item_formatted_link pour %cost_gold?', 'Will jemand %item_formatted_link für %cost_gold kaufen?', '有人想买%item_formatted_link吗?价格%cost_gold!', '', '¿Alguien compra %item_formatted_link por %cost_gold?', '', 'Кто хочет купить %item_formatted_link за %cost_gold?'); +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 (1030, 'suggest_sell', 'What about %item_formatted_link? For %cost_gold.', 0, 0, '', 'Qu’en est-il de %item_formatted_link ? Pour %cost_gold.', 'Was ist mit %item_formatted_link? Für %cost_gold.', '%item_formatted_link怎么样?只要%cost_gold。', '', '¿Qué pasa con %item_formatted_link? Por el oro.', '', 'Как насчет %item_formatted_link? За %cost_gold.'); +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 (1031, 'suggest_sell', 'Who said I am a bastard? %item_formatted_link for %cost_gold is a good price.', 0, 0, '', 'Qui a dit que je suis un bâtard ? %item_formatted_link pour %cost_gold, c’est un bon prix.', 'Wer hat gesagt, dass ich ein Gauner bin? %item_formatted_link für %cost_gold ist ein guter Preis.', '谁说我是坑货?%item_formatted_link卖%cost_gold已经很公道了!', '', '¿Quién ha dicho que soy un rata? %item_formatted_link por %cost_gold es una ganga.', '', 'Кто сказал, что я ублюдок? %item_formatted_link за %cost_gold — хорошая цена.'); +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 (1032, 'suggest_sell', 'I am selling %item_formatted_link? Just %cost_gold.', 0, 0, '', 'Je vends %item_formatted_link à seulement %cost_gold.', 'Ich verkaufe %item_formatted_link? Nur %cost_gold.', '我在卖%item_formatted_link,只要%cost_gold!', '', '¿Vendo %item_formatted_link? Solo %cost_gold.', '', 'Продаю %item_formatted_link? Всего %cost_gold.'); +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 (1033, 'suggest_sell', 'LFG for farming. You can still buy %item_formatted_link I have for %cost_gold.', 0, 0, '', 'Je cherche des gens pour farmer. Tu peux toujours acheter %item_formatted_link que j’ai pour %cost_gold.', 'LFG für Farmruns. Du kannst immer noch %item_formatted_link für %cost_gold kaufen.', '组队刷怪,有兴趣的可以买我的%item_formatted_link,只要%cost_gold。', '', 'LFG para farmear. Todavía puedes comprar %item_formatted_link que tengo por %cost_gold.', '', 'ЛФГ для фарма. Все еще можешь купить %item_formatted_link у меня за %cost_gold.'); +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 (1034, 'suggest_sell', 'Sold almost everything today. Still have %item_formatted_link for %cost_gold.', 0, 0, '', 'J’ai presque tout vendu aujourd’hui. Il me reste seulement %item_formatted_link pour %cost_gold.', 'Habe heute fast alles verkauft. Habe nur noch %item_formatted_link für %cost_gold.', '今天几乎都卖光了,还剩%item_formatted_link,卖%cost_gold。', '', 'Se vendió casi todo hoy. Todavía tengo %item_formatted_link por %cost_gold.', '', 'Сегодня почти все продал. Еще есть %item_formatted_link за %cost_gold.'); +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 (1035, 'suggest_sell', 'What use for trade chat? Of course to sell %item_formatted_link for %cost_gold.', 0, 0, '', 'Pourquoi utiliser le chat de commerce ? Eh bien, évidemment pour vendre mon %item_formatted_link au prix de %cost_gold.', 'Wofür gibt es den Handelschat? Natürlich um %item_formatted_link für %cost_gold zu verkaufen.', '交易频道有什么用?当然是卖我的%item_formatted_link,价格%cost_gold!', '', '¿De qué sirve el chat comercial? Por supuesto, para vender %item_formatted_link por %cost_gold.', '', 'Для чего нужен торговый чат? Конечно, чтобы продавать %item_formatted_link за %cost_gold.'); +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 (1036, 'suggest_sell', 'Can anyone beat the price of %cost_gold for %item_formatted_link?', 0, 0, '', 'Est-ce que quelqu’un peut battre le prix de %cost_gold pour %item_formatted_link ?', 'Kann jemand den Preis von %cost_gold für %item_formatted_link unterbieten?', '有人能比%cost_gold更便宜卖%item_formatted_link吗?', '', '¿Alguien puede superar el precio de %cost_gold por %item_formatted_link?', '', 'Кто перебьет цену %cost_gold за %item_formatted_link?'); +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 (1037, 'suggest_sell', 'Wanna stop trade chat? Just buy %item_formatted_link? For %cost_gold!', 0, 0, '', 'Tu veux arrêter le chat commercial ? Il suffit d’acheter %item_formatted_link ! Pour seulement %cost_gold !', 'Willst du den Handelschat stoppen? Kauf einfach %item_formatted_link für %cost_gold!', '想让交易频道安静?买我的%item_formatted_link吧,只要%cost_gold!', '', '¿Quieres detener el chat comercial? ¿Solo compra %item_formatted_link? ¡Por el oro!', '', 'Хочешь прекратить торговый чат? Просто купи %item_formatted_link за %cost_gold!'); +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 (1038, 'suggest_sell', 'Everybody spams in trade chat. Me too - %cost_gold for %item_formatted_link!', 0, 0, '', 'Tout le monde spamme dans le chat commercial. Moi aussi - %cost_gold pour %item_formatted_link !', 'Jeder spammt im Handelschat. Ich auch – %cost_gold für %item_formatted_link!', '交易频道都在刷屏,我也来——%item_formatted_link卖%cost_gold!', '', 'Todo el mundo envía spam en el chat y yo también! ¡%item_formatted_link por %cost_gold!', '', 'Все спамят в торговом чате. Я тоже — %cost_gold за %item_formatted_link!'); +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 (1039, 'suggest_sell', 'Is %item_formatted_link any use? Just selling it for %cost_gold.', 0, 0, '', 'Est-ce que %item_formatted_link est utile ? Je le vends juste pour %cost_gold.', 'Ist %item_formatted_link überhaupt nützlich? Verkaufe es nur für %cost_gold.', '%item_formatted_link有用吗?随便卖了,价格%cost_gold。', '', '¿Es %item_formatted_link útil? Solo lo vendo por %cost_gold.', '', 'Есть ли польза от %item_formatted_link? Просто продаю за %cost_gold.'); +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 (1040, 'suggest_sell', 'I have %item_formatted_link ready to sell you for %cost_gold.', 0, 0, '', 'J’ai %item_formatted_link prêt à te vendre pour %cost_gold.', 'Ich habe %item_formatted_link zum Verkauf für %cost_gold.', '我有%item_formatted_link,可以卖给你,只要%cost_gold。', '', 'Tengo %item_formatted_link listo a la venta por %cost_gold.', '', 'У меня есть %item_formatted_link, готов продать за %cost_gold.'); +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 (1041, 'suggest_sell', 'Did nothing yesterday but have got %item_formatted_link. Selling it for %cost_gold.', 0, 0, '', 'Je n’ai rien fait hier mais j’ai %item_formatted_link Je le vends pour %cost_gold', 'Habe gestern nichts gemacht, aber %item_formatted_link bekommen. Verkaufe es für %cost_gold.', '昨天啥也没干,但搞到了%item_formatted_link,卖%cost_gold。', '', 'No hice nada ayer pero consegu’i %item_formatted_link. Lo vendo por %cost_gold.', '', 'Вчера ничего не делал, но получил %item_formatted_link. Продаю за %cost_gold.'); +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 (1042, 'suggest_sell', 'Farmed yesterday and got %item_formatted_link. Anyone wtb for %cost_gold?', 0, 0, '', 'J’ai farmé hier et j’ai obtenu %item_formatted_link. Quelqu’un est intéressé pour %cost_gold ?', 'Gestern gefarmt und %item_formatted_link bekommen. Will jemand es für %cost_gold kaufen?', '昨天刷怪拿到了%item_formatted_link,有人想买吗?价格%cost_gold。', '', 'Ayer farmee y conseguí mucho %item_formatted_link. ¿Alguien lo quiere comprar por %cost_gold?', '', 'Вчера фармил и получил %item_formatted_link. Кто купит за %cost_gold?'); +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 (1043, 'suggest_sell', 'Bought %item_formatted_link yesterday. Anyone needs it for %cost_gold?', 0, 0, '', 'J’ai acheté %item_formatted_link hier. Est-ce que quelqu’un en a besoin pour %cost_gold?', 'Habe gestern %item_formatted_link gekauft. Braucht es jemand für %cost_gold?', '昨天买了%item_formatted_link,有人需要吗?只要%cost_gold。', '', 'Ayer compré %item_formatted_link. ¿Alguien lo quiere por %cost_gold?', '', 'Вчера купил %item_formatted_link. Кому нужно за %cost_gold?'); +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 (1044, 'suggest_sell', 'Who asked for %item_formatted_link? The price is the same - %cost_gold.', 0, 0, '', 'Qui a demandé %item_formatted_link? Le prix est le même - %cost_gold.', 'Wer hat nach %item_formatted_link gefragt? Der Preis bleibt derselbe – %cost_gold.', '谁问%item_formatted_link的?价格没变,还是%cost_gold。', '', '¿Quién pidió %item_formatted_link? El precio es el mismo: %cost_gold.', '', 'Кто спрашивал про %item_formatted_link? Цена та же — %cost_gold.'); +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 (1045, 'suggest_sell', 'I sill have %item_formatted_link. WTB for %cost_gold?', 0, 0, '', 'J’ai toujours %item_formatted_link. Je cherche à l’acheter pour %cost_gold.', 'Ich habe immer noch %item_formatted_link. Will jemand es für %cost_gold kaufen?', '我还有%item_formatted_link,有人想买吗?价格%cost_gold。', '', 'Todavía tengo %item_formatted_link. ¿Alguien lo compra por %cost_gold?', '', 'У меня еще есть %item_formatted_link. Купишь за %cost_gold?'); +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 (1046, 'suggest_sell', 'I used to have more than %item_formatted_link. Now needs to sell it for %cost_gold.', 0, 0, '', 'J’avais plus de %item_formatted_link avant. Maintenant, je dois le vendre pour %cost_gold.', 'Früher hatte ich mehr als %item_formatted_link. Jetzt muss ich es für %cost_gold verkaufen.', '我以前有好多%item_formatted_link,现在得卖了,价格%cost_gold。', '', 'Solía tener más de %item_formatted_link. Ahora necesito venderlo por %cost_gold.', '', 'Раньше было больше, чем %item_formatted_link. Теперь нужно продать за %cost_gold.'); +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 (1047, 'suggest_sell', 'I wish I have more than %item_formatted_link. You could buy it for %cost_gold anyways.', 0, 0, '', 'J’aimerais avoir plus que %item_formatted_link. De toute façon, tu pourrais l’acheter pour %cost_gold.', 'Ich wünschte, ich hätte mehr als %item_formatted_link. Du könntest es trotzdem für %cost_gold kaufen.', '我希望能有更多%item_formatted_link,反正你可以先买这个,价格%cost_gold。', '', 'Desearía tener más de %item_formatted_link. Podrías comprarlo por %cost_gold de todos modos.', '', 'Хотел бы иметь больше, чем %item_formatted_link. Но можешь купить за %cost_gold.'); +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 (1048, 'suggest_sell', 'What use for your gold? To buy my %item_formatted_link for %cost_gold.', 0, 0, '', 'Que vais-je faire de ton or ? Acheter mon %item_formatted_link pour %cost_gold.', 'Wofür dein Gold? Um mein %item_formatted_link für %cost_gold zu kaufen.', '你的金币有啥用?当然是买我的%item_formatted_link啦,价格%cost_gold。', '', '¿De qué sirve tu oro? Para comprar mi %item_formatted_link por %cost_gold.', '', 'Для чего твое золото? Чтобы купить мой %item_formatted_link за %cost_gold.'); +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 (1049, 'suggest_sell', 'Please spare some gold for me. You can buy %item_formatted_link for %cost_gold.', 0, 0, '', 'S’il vous plaît, épargnez-moi de l’or. Vous pouvez acheter %item_formatted_link pour %cost_gold', 'Bitte gib mir etwas Gold. Du kannst %item_formatted_link für %cost_gold kaufen.', '行行好,给我点金币吧。你可以花 %cost_gold 买下 %item_formatted_link。', '', 'Por favor, dame algo de oro. Puedes comprar %item_formatted_link por %cost_gold.', '', 'Пожалуйста, подкинь немного золота. Можешь купить %item_formatted_link за %cost_gold.'); +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 (1050, 'suggest_sell', 'Is %cost_gold is a good price for %item_formatted_link?', 0, 0, '', 'Est-ce que %cost_gold, c’est un bon prix pour %item_formatted_link?', 'Ist %cost_gold ein guter Preis für %item_formatted_link?', '%cost_gold 买 %item_formatted_link,这个价格咋样?', '', '¿%cost_gold es un buen precio para %item_formatted_link?', '', '%cost_gold — хорошая цена за %item_formatted_link?'); +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 (1051, 'suggest_sell', 'Just bought yesterday %item_formatted_links, but do not need it anymore. Anyone wants for %cost_gold?', 0, 0, '', 'Hier, j’ai acheté %item_formatted_links, mais je n’en ai plus besoin. Est-ce que quelqu’un le veut pour %cost_gold?', 'Gestern habe ich %item_formatted_links gekauft, brauche es aber nicht mehr. Will es jemand für %cost_gold?', '昨天刚买的 %item_formatted_links,现在用不上了,有人要吗?只要 %cost_gold!', '', 'Ayer compré %item_formatted_link, pero ya no los necesito. ¿Alguien lo quiere por %cost_gold?', '', 'Вчера купил %item_formatted_links, но больше не нужно. Кому за %cost_gold?'); +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 (1052, 'suggest_sell', 'I am going to post %item_formatted_link on the AH but you can buy it now cheaper just for %cost_gold.', 0, 0, '', 'Je vais mettre en vente %item_formatted_link sur l’HV, mais tu peux l’acheter maintenant à un prix réduit, pour seulement %cost_gold.', 'Ich werde %item_formatted_link ins AH stellen, aber du kannst es jetzt günstiger für %cost_gold kaufen.', '我正打算把 %item_formatted_link 挂拍卖行,但你现在就可以便宜买走,只要 %cost_gold!', '', 'Voy a poner %item_formatted_link en la casa de subastas pero puedes comprarlo ahora más barato solo por %cost_gold.', '', 'Собирался выставить %item_formatted_link на аукцион, но можешь купить дешевле сейчас за %cost_gold.'); +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 (1053, 'suggest_sell', 'Why the #!@ have I bought %item_formatted_link? Anyone needs it for %cost_gold?', 0, 0, '', 'Pourquoi diable ai-je acheté %item_formatted_link? Est-ce que quelqu’un en a besoin pour %cost_gold?', 'Warum zum Teufel habe ich %item_formatted_link gekauft? Braucht es jemand für %cost_gold?', '我咋就脑抽买了 %item_formatted_link 呢?有人需要吗?只要 %cost_gold!', '', '¿Por qué #!@ he comprado %item_formatted_link? ¿Alguien lo necesita por %cost_gold?', '', 'Зачем, черт возьми, я купил %item_formatted_link? Кому нужно за %cost_gold?'); +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 (1054, 'suggest_sell', 'WTS %item_formatted_link for %cost_gold.', 0, 0, '', 'Je vends %item_formatted_link pour %cost_gold.', 'Verkaufe %item_formatted_link für %cost_gold.', '出售 %item_formatted_link,只要 %cost_gold!', '', 'Quiero vender %item_formatted_link por %cost_gold.', '', 'Продаю %item_formatted_link за %cost_gold.'); +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 (1055, 'suggest_sell', 'Who wants %item_formatted_link for %cost_gold?', 0, 0, '', 'Qui veut %item_formatted_link pour %cost_gold ?', 'Wer will %item_formatted_link für %cost_gold?', '谁想要 %item_formatted_link?只要 %cost_gold!', '', '¿Quién quiere %item_formatted_link por %cost_gold?', '', 'Кто хочет %item_formatted_link за %cost_gold?'); +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 (1056, 'suggest_sell', 'Anyone wants %item_formatted_link? Only %cost_gold.', 0, 0, '', 'Qui veut %item_formatted_link ? Seulement %cost_gold.', 'Will jemand %item_formatted_link? Nur %cost_gold.', '有人要 %item_formatted_link 吗?只卖 %cost_gold!', '', '¿Alguien quiere %item_formatted_link? Solo %cost_gold.', '', 'Кому нужен %item_formatted_link? Всего %cost_gold.'); +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 (1057, 'suggest_sell', 'Just %cost_gold for %item_formatted_link!', 0, 0, '', 'Juste %cost_gold pour %item_formatted_link !', 'Nur %cost_gold für %item_formatted_link!', '只要 %cost_gold 就能拿下 %item_formatted_link!', '', '¡Solo %cost_gold para %item_formatted_link!', '', 'Всего %cost_gold за %item_formatted_link!'); +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 (1058, 'suggest_sell', 'Selling %item_formatted_link for %cost_gold.', 0, 0, '', 'Je vends cet %item_formatted_link pour %cost_gold.', 'Verkaufe %item_formatted_link für %cost_gold.', '卖 %item_formatted_link,只需 %cost_gold!', '', 'Vendo %item_formatted_link por %cost_gold.', '', 'Продаю %item_formatted_link за %cost_gold.'); +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 (1059, 'suggest_sell', '%item_formatted_link is yours just for %cost_gold!', 0, 0, '', '%item_formatted_link est à toi pour seulement %cost_gold!', '%item_formatted_link gehört dir für nur %cost_gold!', '%item_formatted_link 只要 %cost_gold 就是你的了!', '', '%item_formatted_link es tuyo solo por %cost_gold!', '', '%item_formatted_link твой всего за %cost_gold!'); +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 (1060, 'suggest_sell', 'WTS %item_formatted_link for %cost_gold. DM if interested.', 0, 0, '', 'Je vends %item_formatted_link pour %cost_gold en or. Envoyez-moi un message si vous êtes intéressé(e).', 'Verkaufe %item_formatted_link für %cost_gold. Schreibe mir bei Interesse.', '卖 %item_formatted_link,价格 %cost_gold,有意私聊!', '', 'Quiero vender %item_formatted_link por %cost_gold. Envíame un mensaje si te interesa.', '', ''); +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 (1061, 'suggest_sell', 'Need to sell %item_formatted_link, %cost_gold or best offer.', 0, 0, '', 'Je dois vendre %item_formatted_link, pour %cost_gold ou meilleure offre.', 'Muss %item_formatted_link verkaufen, %cost_gold oder bestes Angebot.', '急卖 %item_formatted_link,标价 %cost_gold,可议价!', '', 'Necesito vender %item_formatted_link, %cost_gold o la mejor oferta.', '', ''); +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 (1062, 'suggest_sell', '%item_formatted_link available for %cost_gold. Get it now!', 0, 0, '', '%item_formatted_link disponible pour %cost_gold. Tu devrais le prendre maintenant!', '%item_formatted_link verfügbar für %cost_gold. Greif jetzt zu!', '%item_formatted_link 只要 %cost_gold,赶紧入手吧!', '', '%item_formatted_link disponible por %cost_gold. ¡Consíguelo ahora!', '', ''); +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 (1063, 'suggest_sell', 'Got %item_formatted_link, asking %cost_gold.', 0, 0, '', 'J’ai trouvé %item_formatted_link, et on me demande %cost_gold.', 'Habe %item_formatted_link gefunden, verlange %cost_gold.', '有 %item_formatted_link,卖 %cost_gold。', '', 'Tengo %item_formatted_link, pido %cost_gold.', '', ''); +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 (1064, 'suggest_sell', 'Selling %item_formatted_link, only %cost_gold left.', 0, 0, '', 'Je vends %item_formatted_link, il ne reste que %cost_gold.', 'Verkaufe %item_formatted_link, nur noch %cost_gold verfügbar.', '卖 %item_formatted_link,剩最后一件,只要 %cost_gold!', '', 'Vendo %item_formatted_link, solo queda %cost_gold.', '', ''); +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 (1065, 'suggest_sell', 'Anyone want %item_formatted_link for %cost_gold? DM me!', 0, 0, '', '%Item_formatted_link à %cost_gold, ça vous tente ? Envoyez-moi un message en privé !', '%item_formatted_link für %cost_gold gefällig? Schreibt mir eine DM!', '有人要 %item_formatted_link 吗?只要 %cost_gold,私聊我!', '', '¿Alguien quiere %item_formatted_link por %cost_gold? ¡Envíame un mensaje!', '', ''); +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 (1066, 'suggest_sell', 'Selling %item_formatted_link at %cost_gold, grab it while you can!', 0, 0, '', 'Je vends %item_formatted_link à %cost_gold, dépêchez-vous de le saisir avant qu’il ne soit trop tard!', 'Verkaufe %item_formatted_link für %cost_gold, schnappt es euch solange es geht!', '卖 %item_formatted_link,只要 %cost_gold,欲购从速!', '', 'Vendo %item_formatted_link a %cost_gold, ¡agárralo mientras puedas!', '', ''); +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 (1067, 'suggest_sell', '%item_formatted_link for %cost_gold, hurry up before it’s gone!', 0, 0, '', '%item_formatted_link pour %cost_gold, dépêchez-vous avant qu’il ne soit trop tard!', '%item_formatted_link für %cost_gold, beeilt euch bevor es weg ist!', '%item_formatted_link 只要 %cost_gold,快来买,不然就没了!', '', '%item_formatted_link por %cost_gold, ¡apúrate antes de que se vaya!', '', ''); +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 (1068, 'suggest_sell', 'Selling %item_formatted_link for %cost_gold, who’s in?', 0, 0, '', 'Qui veut acheter %item_formatted_link pour %cost_gold ?', 'Verkaufe %item_formatted_link für %cost_gold, wer ist dabei?', '卖 %item_formatted_link,只要 %cost_gold,谁来?', '', 'Vendo %item_formatted_link por %cost_gold, ¿quién está dentro?', '', ''); +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 (1069, 'suggest_sell', 'Selling %item_formatted_link for %cost_gold, first come, first serve!', 0, 0, '', 'Je vends %item_formatted_link pour %cost_gold, premier arrivé, premier servi !', 'Verkaufe %item_formatted_link für %cost_gold, wer zuerst kommt, mahlt zuerst!', '卖 %item_formatted_link,价格 %cost_gold,先到先得!', '', 'Vendo %item_formatted_link por %cost_gold, ¡el primero que llega se lo lleva!', '', ''); +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 (1070, 'suggest_sell', 'Only %cost_gold for %item_formatted_link, limited time offer!', 0, 0, '', 'Seulement %cost_gold pour %item_formatted_link, une offre à durée limitée!', 'Nur %cost_gold für %item_formatted_link, zeitlich begrenztes Angebot!', '仅需 %cost_gold 就能买到 %item_formatted_link,限时优惠!', '', 'Solo %cost_gold para %item_formatted_link, ¡oferta por tiempo limitado!', '', ''); +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 (1071, 'suggest_sell', '%item_formatted_link available for %cost_gold, hit me up if you need it!', 0, 0, '', 'Lien pour %item_formatted_link disponible pour %cost_gold en or, n’hésite pas à me contacter si tu en as besoin ! ', '%item_formatted_link für %cost_gold verfügbar, schreibt mich an wenn ihr es braucht!', '%item_formatted_link 卖 %cost_gold,需要的联系我!', '', '%item_formatted_link disponible por %cost_gold, ¡contáctame si lo necesitas!', '', ''); +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 (1072, 'suggest_sell', 'Anyone interested in %item_formatted_link for %cost_gold?', 0, 0, '', 'Quelqu’un est intéressé par %item_formatted_link à %cost_gold ?', 'Hat jemand Interesse an %item_formatted_link für %cost_gold?', '有人对 %item_formatted_link 感兴趣吗?只要 %cost_gold!', '', '¿Alguien interesado en %item_formatted_link por %cost_gold?', '', ''); +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 (1073, 'suggest_sell', 'Selling %item_formatted_link for %cost_gold, need to clear inventory.', 0, 0, '', 'Je vends %item_formatted_link pour %cost_gold, je dois vider mon inventaire.', 'Verkaufe %item_formatted_link für %cost_gold, muss mein Inventar leeren.', '卖 %item_formatted_link,价格 %cost_gold,急清背包!', '', 'Vendo %item_formatted_link por %cost_gold, necesito vaciar mi inventario.', '', ''); +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 (1074, 'suggest_sell', 'Get %item_formatted_link for %cost_gold, it’s a great deal!', 0, 0, '', 'Procurez-vous %item_formatted_link pour %cost_gold, c’est une bonne affaire !', 'Holt euch %item_formatted_link für %cost_gold, ein super Angebot!', '买 %item_formatted_link 只要 %cost_gold,超值啊!', '', 'Consigue %item_formatted_link por %cost_gold, ¡es una gran oferta!', '', ''); +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 (1075, 'suggest_sell', '%item_formatted_link for %cost_gold, get it while it’s hot!', 0, 0, '', 'Fais-toi plaisir avec %item_formatted_link pour %cost_gold, c’est le moment ou jamais!', 'Holt euch %item_formatted_link für %cost_gold, solange es noch heiß ist!', '%item_formatted_link 只要 %cost_gold,趁热快买!', '', '%item_formatted_link por %cost_gold, ¡cómpralo mientras esté caliente!', '', ''); +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 (1076, 'suggest_sell', 'Selling %item_formatted_link for %cost_gold, don’t miss out!', 0, 0, '', 'Je vends %item_formatted_link pour %cost_gold, ne ratez pas cette occasion!', 'Verkaufe %item_formatted_link für %cost_gold, verpasst diese Gelegenheit nicht!', '卖 %item_formatted_link,价格 %cost_gold,别错过!', '', 'Vendo %item_formatted_link por %cost_gold, ¡no te lo pierdas!', '', ''); +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 (1077, 'suggest_sell', 'Only %cost_gold for %item_formatted_link, hit me up for details!', 0, 0, '', 'Seulement %cost_gold pour %item_formatted_link, n’hésitez pas à me contacter pour plus de détails !', 'Nur %cost_gold für %item_formatted_link, schreibt mir für Details!', '仅 %cost_gold 就能买 %item_formatted_link,详情私聊!', '', 'Solo %cost_gold para %item_formatted_link, ¡contáctame para más detalles!', '', ''); +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 (1078, 'suggest_sell', '%item_formatted_link is available for %cost_gold, let’s trade!', 0, 0, '', '%item_formatted_link est disponible pour %cost_gold, ça te dirait de faire un échange?', '%item_formatted_link ist für %cost_gold verfügbar, lasst uns handeln!', '%item_formatted_link 卖 %cost_gold,来交易吧!', '', '%item_formatted_link está disponible por %cost_gold, ¡hagamos un intercambio!', '', ''); +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 (1079, 'suggest_sell', 'Selling %item_formatted_link for %cost_gold, message me for more info.', 0, 0, '', 'Je vends %item_formatted_link pour %cost_gold, n’hésitez pas à me contacter pour plus d’informations.', 'Verkaufe %item_formatted_link für %cost_gold, schreibt mir für mehr Infos.', '卖 %item_formatted_link,价格 %cost_gold,更多信息私聊。', '', 'Vendo %item_formatted_link por %cost_gold, envíame un mensaje para más información.', '', ''); +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 (1080, 'suggest_sell', 'Looking to sell %item_formatted_link, %cost_gold takes it!', 0, 0, '', 'Je cherche à vendre %item_formatted_link, et je le laisse pour seulement %cost_gold !', 'Möchte %item_formatted_link verkaufen, für %cost_gold gehört es dir!', '想卖 %item_formatted_link,%cost_gold 就能拿走!', '', 'Busco vender %item_formatted_link, ¡%cost_gold lo consigue!', '', ''); +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 (1081, 'suggest_sell', 'I’m selling %item_formatted_link, %cost_gold only.', 0, 0, '', 'Je vends %item_formatted_link, seulement %cost_gold.', 'Ich verkaufe %item_formatted_link, nur %cost_gold.', '我在卖 %item_formatted_link,只要 %cost_gold。', '', 'Estoy vendiendo %item_formatted_link, solo %cost_gold.', '', ''); +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 (1082, 'suggest_sell', 'Got %item_formatted_link for %cost_gold, let’s make a deal!', 0, 0, '', 'J’ai mis la main sur %item_formatted_link pour %cost_gold pièces d’or, ça t’intéresse de conclure un marché avec moi ?', 'Habe %item_formatted_link für %cost_gold, lass uns einen Deal machen!', '有 %item_formatted_link,卖 %cost_gold,来谈个价吧!', '', 'Tengo %item_formatted_link por %cost_gold, ¡hagamos un trato!', '', ''); +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 (1083, 'suggest_sell', 'Selling %item_formatted_link, %cost_gold takes it home!', 0, 0, '', 'Je vends %item_formatted_link, %cost_gold et c’est à toi de le ramener chez toi !', 'Verkaufe %item_formatted_link, %cost_gold und es gehört dir!', '卖 %item_formatted_link,%cost_gold 就能带回家!', '', 'Vendo %item_formatted_link, ¡%cost_gold lo lleva a casa!', '', ''); +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 (1084, 'suggest_sell', 'WTS %item_formatted_link for %cost_gold, anyone interested?', 0, 0, '', 'Je vends %item_formatted_link pour %cost_gold, ça intéresse quelqu’un ?', 'Verkaufe %item_formatted_link für %cost_gold, interessiert?', '出售 %item_formatted_link,价格 %cost_gold,有人感兴趣吗?', '', 'Vendo %item_formatted_link por %cost_gold, ¿alguien interesado?', '', ''); +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 (1085, 'suggest_sell', 'Need to sell %item_formatted_link fast, %cost_gold.', 0, 0, '', 'Besoin de vendre %item_formatted_link rapidement, %cost_gold.', 'Muss %item_formatted_link schnell verkaufen, %cost_gold.', '急卖 %item_formatted_link,只要 %cost_gold!', '', 'Necesito vender %item_formatted_link rápido, %cost_gold.', '', ''); +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 (1086, 'suggest_sell', 'Selling %item_formatted_link for %cost_gold, best price around!', 0, 0, '', 'Je vends %item_formatted_link pour %cost_gold, c’est le meilleur prix du coin !', 'Verkaufe %item_formatted_link für %cost_gold, bester Preis in der Gegend!', '卖 %item_formatted_link,价格 %cost_gold,绝对是最低价!', '', 'Vendo %item_formatted_link por %cost_gold, ¡el mejor precio!', '', ''); +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 (1087, 'suggest_sell', '%item_formatted_link for %cost_gold, who’s buying?', 0, 0, '', '%item_formatted_link pour %cost_gold, qui est intéressé(e) ?', '%item_formatted_link für %cost_gold, wer kauft?', '%item_formatted_link 卖 %cost_gold,谁来买?', '', '%item_formatted_link por %cost_gold, ¿quién compra?', '', ''); +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 (1088, 'suggest_sell', '%item_formatted_link for %cost_gold, let’s make it happen!', 0, 0, '', '%item_formatted_link à %cost_gold, on se lance !', '%item_formatted_link für %cost_gold, lass es uns machen!', '%item_formatted_link 只要 %cost_gold,成交吧!', '', '%item_formatted_link por %cost_gold, ¡hagámoslo realidad!', '', ''); +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 (1089, 'suggest_sell', 'Selling %item_formatted_link for %cost_gold, grab it before it’s gone!', 0, 0, '', 'Je vends %item_formatted_link pour %cost_gold, dépêchez-vous avant qu’il ne soit trop tard !', 'Verkaufe %item_formatted_link für %cost_gold, holt es euch bevor es weg ist!', '卖 %item_formatted_link,价格 %cost_gold,赶紧买,不然就没了!', '', 'Vendo %item_formatted_link por %cost_gold, ¡agárralo antes de que se vaya!', '', ''); +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 (1090, 'suggest_sell', 'Want %item_formatted_link? %cost_gold gets you one!', 0, 0, '', 'Tu veux %item_formatted_link? Ça te coûte %cost_gold pour en obtenir un !', 'Willst du %item_formatted_link? %cost_gold und es gehört dir!', '想要 %item_formatted_link 吗?%cost_gold 就能买到!', '', '¿Quieres %item_formatted_link? ¡%cost_gold te consigue uno!', '', ''); +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 (1091, 'suggest_sell', '%item_formatted_link for %cost_gold, quick sale!', 0, 0, '', '%item_formatted_link en vente à %cost_gold, une super affaire à saisir rapidement !', '%item_formatted_link für %cost_gold, schneller Verkauf!', '%item_formatted_link 卖 %cost_gold,速卖!', '', '%item_formatted_link por %cost_gold, ¡venta rápida!', '', ''); + +-- response LFG/LFM channel +-- usable placeholders: +-- %quest_links +-- %other_name +-- %my_role +-- %zone_name +-- %area_name +-- %my_class +-- %my_race +-- %my_level +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 (1092, 'response_lfg_quests_channel', 'I have %quest_links', 0, 0, '', 'J’ai %quest_links', 'Ich habe %quest_links', '我有 %quest_links。', '', '', '', 'У меня есть %quest_links'); +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 (1093, 'response_lfg_quests_channel', 'I also have %quest_links', 0, 0, '', 'J’ai aussi des %quest_links.', 'Ich habe auch %quest_links.', '我也有 %quest_links。', '', '', '', 'У меня тоже есть %quest_links'); +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 (1094, 'response_lfg_quests_channel', 'I also have %quest_links, I am in %zone_name right now', 0, 0, '', 'J’ai aussi des %quest_links, je suis actuellement dans la zone %zone_name', 'Ich habe auch %quest_links, ich bin gerade in %zone_name.', '我也有 %quest_links,现在在 %zone_name。', '', '', '', 'У меня тоже есть %quest_links, сейчас я в %zone_name'); +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 (1095, 'response_lfg_quests_channel', '%other_name, I also have %quest_links', 0, 0, '', 'Oh, j’ai aussi %quest_links', '%other_name, ich habe auch %quest_links.', '%other_name,我也有 %quest_links。', '', '', '', '%other_name, у меня тоже есть %quest_links'); +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 (1096, 'response_lfg_quests_channel', '%other_name, I also have %quest_links, I am in %zone_name right now', 0, 0, '', '%other_name, je possède également %quest_links, je me trouve actuellement dans la zone %zone_name.', '%other_name, ich habe auch %quest_links, ich bin gerade in %zone_name.', '%other_name,我也有 %quest_links,现在在 %zone_name。', '', '', '', '%other_name, у меня тоже есть %quest_links, сейчас я в %zone_name'); +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 (1097, 'response_lfg_quests_channel', 'I am up for %quest_links, I am in %zone_name right now', 0, 0, '', 'Je suis partant pour %quest_links, je suis actuellement dans la zone de %zone_name.', 'Ich bin dabei für %quest_links, ich bin gerade in %zone_name.', '我可以做 %quest_links,现在在 %zone_name。', '', '', '', 'Я готов к %quest_links, сейчас я в %zone_name'); +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 (1098, 'response_lfg_quests_channel', 'I am up for %quest_links, I am %my_role', 0, 0, '', 'Je suis prêt pour %quest_links, je suis un %my_role.', 'Ich bin bereit für %quest_links, ich bin ein %my_role.', '我可以做 %quest_links,我是 %my_role。', '', '', '', 'Я готов к %quest_links, я %my_role'); +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 (1099, 'response_lfg_quests_channel', '%other_name, I am up for %quest_links, I am in %zone_name right now', 0, 0, '', '%other_name, je suis prêt pour %liens_quête, je suis actuellement à %nom_zone', '%other_name, ich bin bereit für %quest_links, ich bin gerade in %zone_name.', '%other_name,我可以做 %quest_links,现在在 %zone_name。', '', '', '', '%other_name, я готов к %quest_links, сейчас я в %zone_name'); +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 (1100, 'response_lfg_quests_channel', '%other_name, I am up for %quest_links, I am %my_role', 0, 0, '', '%other_name, je suis partant pour %quest_links, je suis %mon rôle', '%other_name, ich bin bereit für %quest_links, ich bin %my_role.', '%other_name,我可以做 %quest_links,我是 %my_role。', '', '', '', '%other_name, я готов к %quest_links, я %my_role'); +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 (1101, 'response_lfg_quests_channel', 'Anyone need %quest_links? I’m in %zone_name.', 0, 0, '', 'Besoin de %quest_links? Je me trouve dans %zone_name.', 'Braucht jemand %quest_links? Ich bin in %zone_name.', '有人需要做 %quest_links 吗?我在 %zone_name。', '', '', '', ''); +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 (1102, 'response_lfg_quests_channel', 'Looking for more for %quest_links in %zone_name.', 0, 0, '', 'À la recherche de plus de lieux pour %quest_links dans %zone_name.', 'Suche mehr Leute für %quest_links in %zone_name.', '找人一起在 %zone_name 做 %quest_links。', '', '', '', ''); +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 (1103, 'response_lfg_quests_channel', 'Need some help with %quest_links in %zone_name.', 0, 0, '', 'Besoin d’aide avec les %quest_links dans %zone_name.', 'Brauche Hilfe bei %quest_links in %zone_name.', '在 %zone_name 做 %quest_links 需要帮忙。', '', '', '', ''); +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 (1104, 'response_lfg_quests_channel', 'Anyone want to do %quest_links with me in %zone_name?', 0, 0, '', 'Qui veut faire des %quest_links avec moi dans la zone %zone_name?', 'Wer will %quest_links mit mir in %zone_name machen?', '有人想和我一起在 %zone_name 做 %quest_links 吗?', '', '', '', ''); +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 (1105, 'response_lfg_quests_channel', 'I have %quest_links, looking for group in %zone_name.', 0, 0, '', 'J’ai %quest_links, je cherche un groupe dans la zone %zone_name.', 'Ich habe %quest_links, suche eine Gruppe in %zone_name.', '我有 %quest_links,在 %zone_name 找队伍。', '', '', '', ''); +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 (1106, 'response_lfg_quests_channel', 'Who needs %quest_links in %zone_name?', 0, 0, '', 'Qui a besoin de %quest_links dans %zone_name ?', 'Wer braucht %quest_links in %zone_name?', '谁在 %zone_name 需要做 %quest_links?', '', '', '', ''); +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 (1107, 'response_lfg_quests_channel', 'Up for %quest_links in %zone_name, who’s in?', 0, 0, '', 'Qui est partant pour des %quest_links à %zone_name ?', 'Bereit für %quest_links in %zone_name, wer ist dabei?', '准备在 %zone_name 做 %quest_links,谁要一起?', '', '', '', ''); +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 (1108, 'response_lfg_quests_channel', '%my_role looking for group to complete %quest_links in %zone_name.', 0, 0, '', 'Je cherche un groupe pour terminer %quest_links dans la zone %zone_name. Qui est partant?', '%my_role sucht eine Gruppe, um %quest_links in %zone_name abzuschließen.', '我是 %my_role,找队伍在 %zone_name 完成 %quest_links。', '', '', '', ''); +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 (1109, 'response_lfg_quests_channel', 'I need %quest_links, anyone available in %zone_name?', 0, 0, '', 'J’ai besoin de %quest_links, est-ce qu’il y a quelqu’un disponible dans la région de %zone_name?', 'Ich brauche %quest_links, ist jemand in %zone_name verfügbar?', '我需要做 %quest_links,有人在 %zone_name 能帮忙吗?', '', '', '', ''); +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 (1110, 'response_lfg_quests_channel', 'Looking for more people for %quest_links in %zone_name.', 0, 0, '', 'Je recherche plus de personnes pour %quest_links dans la région de %zone_name.', 'Suche mehr Leute für %quest_links in %zone_name.', '在 %zone_name 找更多人一起做 %quest_links。', '', '', '', ''); +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 (1111, 'response_lfg_quests_channel', 'I’m doing %quest_links in %zone_name, need more help.', 0, 0, '', 'Je suis en train de faire des %quest_links dans %zone_name, j’aurais besoin de davantage d’aide.', 'Ich mache gerade %quest_links in %zone_name, brauche mehr Hilfe.', '我正在 %zone_name 做 %quest_links,还需要人手帮忙。', '', '', '', ''); +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 (1112, 'response_lfg_quests_channel', 'Any %my_role interested in %quest_links in %zone_name?', 0, 0, '', 'Des %my_role intéressés par des %quest_links dans la zone %zone_name?', 'Gibt es %my_role, die an %quest_links in %zone_name interessiert sind?', '有 %my_role 对 %zone_name 的 %quest_links 感兴趣吗?', '', '', '', ''); +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 (1113, 'response_lfg_quests_channel', 'Help needed for %quest_links in %zone_name, looking for more.', 0, 0, '', 'J’ai besoin d’aide pour %quest_links dans %zone_name, j’en cherche davantage.', 'Brauche Hilfe für %quest_links in %zone_name, suche weitere Mitspieler.', '在 %zone_name 做 %quest_links 需要帮忙,找更多人一起!', '', '', '', ''); +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 (1114, 'response_lfg_quests_channel', 'I have %quest_links, %my_role in %zone_name, who’s in?', 0, 0, '', 'J’ai %quest_links, en tant que %my_role dans %zone_name, qui est partant?', 'Ich habe %quest_links, %my_role in %zone_name, wer ist dabei?', '我在 %zone_name 有 %quest_links,我是 %my_role,谁想加入?', '', '', '', ''); +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 (1115, 'response_lfg_quests_channel', 'Who wants to do %quest_links in %zone_name? I am %my_role.', 0, 0, '', 'Qui veut faire des %quest_links dans la zone %zone_name? Je suis %my_role.', 'Wer will %quest_links in %zone_name machen? Ich bin %my_role.', '谁想在 %zone_name 做 %quest_links?我是 %my_role。', '', '', '', ''); +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 (1116, 'response_lfg_quests_channel', 'Anyone doing %quest_links right now? I’m in %zone_name.', 0, 0, '', 'Est-ce que quelqu’un est en train de faire des %quest_links en ce moment ? Je suis dans la zone %zone_name.', 'Macht gerade jemand %quest_links? Ich bin in %zone_name.', '有人现在在做 %quest_links 吗?我在 %zone_name。', '', '', '', ''); +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 (1117, 'response_lfg_quests_channel', '%quest_links needed in %zone_name, any takers?', 0, 0, '', ' %quest_links est nécessaire dans la zone %zone_name, des volontaires ?', '%quest_links wird in %zone_name benötigt, jemand dabei?', '在 %zone_name 需要完成 %quest_links,有人愿意加入吗?', '', '', '', ''); +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 (1118, 'response_lfg_quests_channel', 'Up for %quest_links in %zone_name, looking for group.', 0, 0, '', 'À la recherche de %quest_links dans %zone_name, je suis à la recherche d’un groupe.', 'Bereit für %quest_links in %zone_name, suche eine Gruppe.', '想在 %zone_name 做 %quest_links,找队伍一起!', '', '', '', ''); +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 (1119, 'response_lfg_quests_channel', 'I need %quest_links and some company, %zone_name anyone?', 0, 0, '', 'J’ai besoin de %quest_links et de compagnie, %zone_name quelqu’un ?', 'Ich brauche %quest_links und Gesellschaft, jemand in %zone_name?', '我需要完成 %quest_links,想找人一起,%zone_name 有没有人?', '', '', '', ''); +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 (1120, 'response_lfg_quests_channel', 'Who wants to join me in %zone_name for %quest_links?', 0, 0, '', 'Qui veut me rejoindre dans la %zone_name pour %quest_links ?', 'Wer will sich mir in %zone_name für %quest_links anschließen?', '谁想在 %zone_name 跟我一起做 %quest_links?', '', '', '', ''); +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 (1121, 'response_lfg_quests_channel', 'Any %my_role available for %quest_links in %zone_name?', 0, 0, '', 'Il y a des postes de %my_role disponibles pour les %quest_links dans la zone %zone_name?', 'Gibt es %my_role für %quest_links in %zone_name?', '有 %my_role 能来 %zone_name 帮忙做 %quest_links 吗?', '', '', '', ''); +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 (1122, 'response_lfg_quests_channel', 'I have %quest_links and I am %my_role, need more people in %zone_name.', 0, 0, '', 'J’ai %quest_links et je suis %my_role, j’ai besoin de plus de monde dans la zone %zone_name.', 'Ich habe %quest_links und bin %my_role, brauche mehr Leute in %zone_name.', '我有 %quest_links,我是 %my_role,在 %zone_name 需要更多人手。', '', '', '', ''); +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 (1123, 'response_lfg_quests_channel', 'Looking for people to do %quest_links in %zone_name.', 0, 0, '', 'Je recherche des personnes pour faire des %quest_links dans la zone %zone_name.', 'Suche Leute für %quest_links in %zone_name.', '在 %zone_name 找人一起做 %quest_links。', '', '', '', ''); +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 (1124, 'response_lfg_quests_channel', 'I am %my_role and have %quest_links, looking for group in %zone_name.', 0, 0, '', 'Je suis %my_role et j’ai %quest_links, je cherche un groupe dans la zone %zone_name.', 'Ich bin %my_role und habe %quest_links, suche eine Gruppe in %zone_name.', '我是 %my_role,有 %quest_links,在 %zone_name 找队伍。', '', '', '', ''); +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 (1125, 'response_lfg_quests_channel', 'Need help with %quest_links in %zone_name, any %my_role available?', 0, 0, '', 'Besoin d’aide avec les %quest_links dans la zone de %zone_name, est-ce qu’il y a un %my_role disponible pour m’aider?', 'Brauche Hilfe mit %quest_links in %zone_name, ist ein %my_role verfügbar?', '在 %zone_name 做 %quest_links 需要帮助,有 %my_role 能来吗?', '', '', '', ''); +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 (1126, 'response_lfg_quests_channel', 'Any %my_role interested in completing %quest_links with me in %zone_name?', 0, 0, '', 'Des %my_role intéressées pour compléter des %quest_links avec moi dans la zone %zone_name?', 'Ist ein %my_role daran interessiert, %quest_links mit mir in %zone_name abzuschließen?', '有 %my_role 想跟我一起在 %zone_name 完成 %quest_links 吗?', '', '', '', ''); +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 (1127, 'response_lfg_quests_channel', 'Let’s complete %quest_links together in %zone_name.', 0, 0, '', 'Complétons ensemble les %quest_links dans %zone_name.', 'Lass uns %quest_links gemeinsam in %zone_name abschließen.', '咱们一起在 %zone_name 完成 %quest_links 吧!', '', '', '', ''); +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 (1128, 'response_lfg_quests_channel', 'I am in %zone_name and have %quest_links, who wants to join?', 0, 0, '', 'Je suis actuellement dans %zone_name et j’ai %quest_links. Qui vient se joindre à moi ?', 'Ich bin in %zone_name und habe %quest_links, wer möchte mitmachen?', '我在 %zone_name,有 %quest_links,谁想加入?', '', '', '', ''); +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 (1129, 'response_lfg_quests_channel', 'Looking for more %my_role to complete %quest_links in %zone_name.', 0, 0, '', 'Je recherche plus de personnes pour compléter les %my_role nécessaires dans les %quest_links de la zone %zone_name.', 'Ich suche weitere %my_role, um %quest_links in %zone_name abzuschließen.', '在 %zone_name 找更多 %my_role 一起完成 %quest_links。', '', '', '', ''); +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 (1130, 'response_lfg_quests_channel', 'I have %quest_links and I need %my_role in %zone_name.', 0, 0, '', 'J’ai %quest_links et j’ai besoin de %my_role dans %zone_name.', 'Ich habe %quest_links und brauche %my_role in %zone_name.', '我有 %quest_links,在 %zone_name 需要 %my_role。', '', '', '', ''); +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 (1131, 'response_lfg_quests_channel', 'Anyone up for %quest_links? I am %my_role in %zone_name.', 0, 0, '', 'Qui est partant pour %quest_links? Je suis %my_role dans %zone_name.', 'Hat jemand Lust auf %quest_links? Ich bin %my_role in %zone_name.', '有人想做 %quest_links 吗?我是 %my_role,在 %zone_name。', '', '', '', ''); +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 (1132, 'response_lfg_quests_channel', 'Looking for a group to do %quest_links in %zone_name, %my_role needed.', 0, 0, '', 'Je recherche un groupe pour faire des %quest_links dans la région de %zone_name, j’ai besoin de jouer en tant que %my_role.', 'Ich suche eine Gruppe für %quest_links in %zone_name, %my_role wird gebraucht.', '在 %zone_name 找队伍做 %quest_links,需要 %my_role。', '', '', '', ''); +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 (1133, 'response_lfg_quests_channel', 'Anyone need help with %quest_links in %zone_name? I’m %my_role.', 0, 0, '', 'Besoin d’aide avec les %quest_links dans la %zone_name? Je suis là pour aider en tant que %my_role.', 'Braucht jemand Hilfe mit %quest_links in %zone_name? Ich bin %my_role.', '有人在 %zone_name 需要帮忙做 %quest_links 吗?我是 %my_role。', '', '', '', ''); +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 (1134, 'response_lfg_quests_channel', 'I have %quest_links to complete, need %my_role in %zone_name.', 0, 0, '', 'J’ai %quest_links à terminer, j’ai besoin de %my_role dans la zone %zone_name.', 'Ich muss %quest_links abschließen und brauche %my_role in %zone_name.', '我有 %quest_links 要完成,在 %zone_name 需要 %my_role。', '', '', '', ''); +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 (1135, 'response_lfg_quests_channel', 'I’m in %zone_name looking for %quest_links help, who’s in?', 0, 0, '', 'Je suis dans %zone_name à la recherche d’aide pour %quest_links, qui est partant?', 'Ich bin in %zone_name und suche Hilfe für %quest_links, wer ist dabei?', '我在 %zone_name 找人帮忙做 %quest_links,谁愿意加入?', '', '', '', ''); +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 (1136, 'response_lfg_quests_channel', 'Looking for a group to finish %quest_links in %zone_name.', 0, 0, '', 'Je cherche un groupe pour terminer les %quest_links dans la zone %zone_name.', 'Ich suche eine Gruppe, um %quest_links in %zone_name abzuschließen.', '在 %zone_name 找队伍完成 %quest_links。', '', '', '', ''); +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 (1137, 'response_lfg_quests_channel', 'Anyone looking for %quest_links in %zone_name? I’m %my_role.', 0, 0, '', 'Quelqu’un recherche %quest_links dans la zone de %zone_name? Je suis %my_role.', 'Sucht jemand nach %quest_links in %zone_name? Ich bin %my_role.', '有人在 %zone_name 找 %quest_links 吗?我是 %my_role。', '', '', '', ''); +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 (1138, 'response_lfg_quests_channel', 'Let’s do %quest_links together! %zone_name is waiting.', 0, 0, '', 'Allons-y ensemble pour %quest_links ! %zone_name nous attend.', 'Lass uns %quest_links gemeinsam machen! %zone_name wartet.', '咱们一起做 %quest_links 吧!%zone_name 正等着我们!', '', '', '', ''); +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 (1139, 'response_lfg_quests_channel', 'Need a group for %quest_links, %zone_name, anyone interested?', 0, 0, '', 'Besoin d’un groupe pour %quest_links dans la zone %zone_name, des intéressés ?', 'Ich brauche eine Gruppe für %quest_links in %zone_name, jemand interessiert?', '在 %zone_name 需要队伍做 %quest_links,有人感兴趣吗?', '', '', '', ''); +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 (1140, 'response_lfg_quests_channel', 'Who wants to join for %quest_links? I’m in %zone_name.', 0, 0, '', 'Qui veut se joindre pour %quest_links? Je suis actuellement dans la zone %zone_name.', 'Wer möchte bei %quest_links mitmachen? Ich bin in %zone_name.', '谁想加入做 %quest_links?我在 %zone_name。', '', '', '', ''); +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 (1141, 'response_lfg_quests_channel', 'I’m in %zone_name, looking for people to complete %quest_links with.', 0, 0, '', 'Je suis dans %zone_name, à la recherche de joueurs pour compléter les missions %quest_links avec moi.', 'Ich bin in %zone_name und suche Leute, um %quest_links abzuschließen.', '我在 %zone_name,找人一起完成 %quest_links。', '', '', '', ''); +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 (1142, 'response_lfg_quests_channel', 'Need a hand with %quest_links in %zone_name, any %my_role?', 0, 0, '', 'Besoin d’aide avec %quest_links dans %zone_name, quelqu’un de mon rôle?', 'Brauche Hilfe mit %quest_links in %zone_name, ist ein %my_role verfügbar?', '在 %zone_name 做 %quest_links 需要帮忙,有 %my_role 吗?', '', '', '', ''); +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 (1143, 'response_lfg_quests_channel', 'Looking for group to finish %quest_links, %zone_name is the place to be.', 0, 0, '', 'Je cherche un groupe pour finir %quest_links, %zone_name est l’endroit où il faut être.', 'Ich suche eine Gruppe, um %quest_links abzuschließen, %zone_name ist der richtige Ort dafür.', '找队伍完成 %quest_links,%zone_name 就是好地方。', '', '', '', ''); +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 (1144, 'response_lfg_quests_channel', 'Anyone want to help with %quest_links in %zone_name? I’m %my_role.', 0, 0, '', 'Est-ce que quelqu’un veut aider avec les %quest_links dans la région de %zone_name? Je suis %my_role.', 'Möchte jemand mit %quest_links in %zone_name helfen? Ich bin %my_role.', '有人想在 %zone_name 帮忙做 %quest_links 吗?我是 %my_role。', '', '', '', ''); +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 (1145, 'response_lfg_quests_channel', 'Looking for %my_role to join me for %quest_links in %zone_name.', 0, 0, '', 'Je recherche %my_role pour me rejoindre pour des %quest_links dans la %zone_name.', 'Ich suche einen %my_role, der sich mir für %quest_links in %zone_name anschließt.', '在 %zone_name 找 %my_role 一起做 %quest_links。', '', '', '', ''); +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 (1146, 'response_lfg_quests_channel', 'I’ve got %quest_links, %my_role needed for %zone_name.', 0, 0, '', 'J’ai %quest_links, %my_role requis pour %zone_name.', 'Ich habe %quest_links, %my_role wird für %zone_name benötigt.', '我有 %quest_links,在 %zone_name 需要 %my_role。', '', '', '', ''); +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 (1147, 'response_lfg_quests_channel', 'Looking to finish %quest_links in %zone_name, need more people.', 0, 0, '', 'Je cherche à finir les %quest_links dans %zone_name, j’ai besoin de plus de personnes.', 'Ich möchte %quest_links in %zone_name abschließen, brauche aber mehr Leute.', '想在 %zone_name 完成 %quest_links,需要更多人手。', '', '', '', ''); +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 (1148, 'response_lfg_quests_channel', 'I need help with %quest_links, who’s around in %zone_name?', 0, 0, '', 'J’ai besoin d’aide avec %quest_links, qui est autour dans %zone_name?', 'Ich brauche Hilfe mit %quest_links, wer ist in %zone_name in der Nähe?', '我需要帮忙做 %quest_links,%zone_name 附近有谁在?', '', '', '', ''); +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 (1149, 'response_lfg_quests_channel', 'Need more people to complete %quest_links, %zone_name.', 0, 0, '', 'J’ai besoin de plus de personnes pour compléter %quest_links dans la zone %zone_name.', 'Ich brauche mehr Leute, um %quest_links in %zone_name abzuschließen.', '需要更多人完成 %quest_links,在 %zone_name。', '', '', '', ''); +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 (1150, 'response_lfg_quests_channel', 'Looking for group in %zone_name to finish %quest_links.', 0, 0, '', 'Je cherche un groupe dans la %zone_name pour terminer les %quest_links.', 'Ich suche eine Gruppe in %zone_name, um %quest_links abzuschließen.', '在 %zone_name 找队伍完成 %quest_links。', '', '', '', ''); +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 (1151, 'response_lfg_quests_channel', 'Who wants to do %quest_links in %zone_name? I’m ready to go.', 0, 0, '', 'Qui veut faire des %quest_links dans la zone de %zone_name? Je suis prêt à y aller.', 'Wer möchte %quest_links in %zone_name machen? Ich bin bereit.', '谁想在 %zone_name 做 %quest_links?我已经准备好了。', '', '', '', ''); +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 (1152, 'response_lfg_quests_channel', 'Anyone want to join me for %quest_links? I’m %my_role in %zone_name.', 0, 0, '', 'Qui veut se joindre à moi pour %quest_links? Je suis %my_role dans la zone %zone_name.', 'Möchte jemand mit mir %quest_links machen? Ich bin %my_role in %zone_name.', '有人想跟我一起做 %quest_links 吗?我是 %my_role,在 %zone_name。', '', '', '', ''); +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 (1153, 'response_lfg_quests_channel', 'Looking for %my_role to do %quest_links with in %zone_name.', 0, 0, '', 'Je recherche %my_role pour faire %quest_links avec dans la zone %zone_name.', 'Ich suche einen %my_role, um %quest_links gemeinsam in %zone_name zu erledigen.', '在 %zone_name 找 %my_role 一起做 %quest_links。', '', '', '', ''); +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 (1154, 'response_lfg_quests_channel', 'I’m in %zone_name, anyone need help with %quest_links?', 0, 0, '', 'Je suis dans %zone_name, est-ce que quelqu’un a besoin d’aide avec %quest_links?', 'Ich bin in %zone_name, braucht jemand Hilfe mit %quest_links?', '我在 %zone_name,有人需要帮忙做 %quest_links 吗?', '', '', '', ''); +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 (1155, 'response_lfg_quests_channel', 'Need more for %quest_links in %zone_name, any takers?', 0, 0, '', 'Besoin de renfort pour les %quest_links dans %zone_name, des volontaires ?', 'Brauche mehr Leute für %quest_links in %zone_name, wer ist dabei?', '在 %zone_name 做 %quest_links 需要更多人,有人愿意吗?', '', '', '', ''); +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 (1156, 'response_lfg_quests_channel', 'I need help with %quest_links in %zone_name, who’s up for it?', 0, 0, '', 'J’ai besoin d’aide avec les %quest_links dans la zone %zone_name, qui est partant pour m’accompagner?', 'Ich brauche Hilfe mit %quest_links in %zone_name, wer ist dabei?', '在 %zone_name 做 %quest_links 需要帮忙,谁愿意一起?', '', '', '', ''); +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 (1157, 'response_lfg_quests_channel', 'Looking for more to finish %quest_links, %zone_name.', 0, 0, '', 'Recherche compagnions pour %quest_links dans la zone %zone_name.', 'Ich suche noch mehr Leute, um %quest_links in %zone_name abzuschließen.', '找更多人完成 %quest_links,在 %zone_name。', '', '', '', ''); + +-- response LFG/LFM whisper +-- usable placeholders: +-- %quest_links +-- %other_name +-- %my_role +-- %zone_name +-- %area_name +-- %my_class +-- %my_race +-- %my_level +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 (1158, 'response_lfg_quests_whisper', 'Hey, I’m up for %quest_links', 0, 0, '', 'Salut, je suis partant pour %quest_links', 'Hey, ich bin dabei für %quest_links', '嘿,我想做 %quest_links。', '', '', '', ''); +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 (1159, 'response_lfg_quests_whisper', 'Hey, I could do %quest_links with you', 0, 0, '', 'Salut, je pourrais faire %quest_links avec toi', 'Hey, ich könnte %quest_links mit dir machen', '嘿,我可以跟你一起做 %quest_links。', '', '', '', 'Привет, могу сделать %quest_links с тобой'); +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 (1160, 'response_lfg_quests_whisper', 'Hey, I also have %quest_links', 0, 0, '', 'Salut, j’ai aussi %quest_links.', 'Hey, ich habe auch %quest_links.', '嘿,我也有 %quest_links。', '', '', '', 'Привет, у меня тоже есть %quest_links'); +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 (1161, 'response_lfg_quests_whisper', 'Hey %other_name, I’m up for %quest_links', 0, 0, '', 'Salut %other_name, je suis prêt pour %quest_links', 'Hey %other_name, ich bin bereit für %quest_links', '嘿,%other_name,我想做 %quest_links。', '', '', '', ''); +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 (1162, 'response_lfg_quests_whisper', 'Hey %other_name, I could do %quest_links with you', 0, 0, '', 'Salut %other_name, je pourrais faire %quest_links avec toi.', 'Hey %other_name, ich könnte %quest_links mit dir machen.', '嘿,%other_name,我可以跟你一起做 %quest_links。', '', '', '', 'Привет %other_name, могу сделать %quest_links с тобой'); +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 (1163, 'response_lfg_quests_whisper', 'Hey %other_name, I also have %quest_links', 0, 0, '', 'Salut %other_name, j’ai aussi des %quest_links', 'Hey %other_name, ich habe auch %quest_links', '嘿,%other_name,我也有 %quest_links。', '', '', '', 'Привет %other_name, у меня тоже есть %quest_links'); +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 (1164, 'response_lfg_quests_whisper', 'wanna group up for %quest_links ?', 0, 0, '', 'Tu veux qu’on se groupe pour faire les %quest_links ensemble ?', 'Willst du eine Gruppe für %quest_links bilden?', '想组队一起做 %quest_links 吗?', '', '', '', 'Хочешь сгруппироваться для %quest_links?'); +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 (1165, 'response_lfg_quests_whisper', 'I am up for %quest_links, I am in %zone_name right now', 0, 0, '', 'Je suis partant pour des %quest_links, je me trouve en ce moment dans %zone_name.', 'Ich bin dabei für %quest_links, ich bin gerade in %zone_name.', '我想做 %quest_links,我现在在 %zone_name。', '', '', '', 'Я готов к %quest_links, сейчас я в %zone_name'); +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 (1166, 'response_lfg_quests_whisper', 'I am up for %quest_links, I am %my_role', 0, 0, '', 'Je suis prêt pour des %quest_links, je suis %my_role.', 'Ich bin bereit für %quest_links, ich bin %my_role.', '我想做 %quest_links,我是 %my_role。', '', '', '', 'Я готов к %quest_links, я %my_role'); +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 (1167, 'response_lfg_quests_whisper', 'Hey, I’m down for %quest_links', 0, 0, '', 'Hey, je suis partant pour %quest_links', 'Hey, ich bin bereit für %quest_links', '嘿,我愿意做 %quest_links。', '', '', '', ''); +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 (1168, 'response_lfg_quests_whisper', 'I can help with %quest_links if you need', 0, 0, '', 'Je peux t’aider avec les %quest_links si tu en as besoin.', 'Ich kann mit %quest_links helfen, wenn du es brauchst.', '如果你需要,我可以帮你做 %quest_links。', '', '', '', ''); +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 (1169, 'response_lfg_quests_whisper', 'Let’s do %quest_links together!', 0, 0, '', 'Faisons %quest_links ensemble!', 'Lass uns %quest_links zusammen machen!', '咱们一起做 %quest_links 吧!', '', '', '', ''); +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 (1170, 'response_lfg_quests_whisper', 'I’ve got %quest_links to do too', 0, 0, '', 'J’ai aussi %quest_links à faire.', 'Ich habe auch %quest_links zu erledigen.', '我也有 %quest_links 要做。', '', '', '', ''); +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 (1171, 'response_lfg_quests_whisper', 'I’m available for %quest_links if you want', 0, 0, '', 'Je suis disponible pour %quest_links si tu veux', 'Ich bin verfügbar für %quest_links, wenn du willst.', '如果你想做 %quest_links,我有空。', '', '', '', ''); +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 (1172, 'response_lfg_quests_whisper', 'I’m down for %quest_links, just let me know', 0, 0, '', 'Je suis partant pour %quest_links, il me suffit de me dire', 'Ich bin bereit für %quest_links, sag mir einfach Bescheid.', '我愿意做 %quest_links,告诉我一声就行。', '', '', '', ''); +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 (1173, 'response_lfg_quests_whisper', 'Looking for %quest_links? I’m in %zone_name', 0, 0, '', 'À la recherche de %quest_links? Je me trouve à %zone_name.', 'Suchst du nach %quest_links? Ich bin in %zone_name.', '在找 %quest_links 吗?我在 %zone_name。', '', '', '', ''); +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 (1174, 'response_lfg_quests_whisper', 'Hey, I need %quest_links too, let’s go', 0, 0, '', 'Salut, j’ai besoin de %quest_links aussi, allons-y', 'Hey, ich brauche auch %quest_links, lass uns gehen.', '嘿,我也需要 %quest_links,一起走吧!', '', '', '', ''); +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 (1175, 'response_lfg_quests_whisper', 'I’ve got %quest_links, want to join me?', 0, 0, '', 'J’ai %quest_links, tu veux te joindre à moi?', 'Ich habe %quest_links, willst du mitmachen?', '我有%quest_links,要不要一起来?', '', '', '', ''); +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 (1176, 'response_lfg_quests_whisper', 'I could use %quest_links, let’s do this', 0, 0, '', 'Je peux faire %quest_links, allons-y', 'Ich könnte %quest_links gebrauchen, lass es uns machen.', '我正好需要做%quest_links,一起搞定吧!', '', '', '', ''); +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 (1177, 'response_lfg_quests_whisper', 'Hey, want to join for %quest_links?', 0, 0, '', 'Salut, tu veux te joindre à moi pour %quest_links?', 'Hey, willst du mitmachen für %quest_links?', '嘿,想一起做%quest_links吗?', '', '', '', ''); +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 (1178, 'response_lfg_quests_whisper', 'I can help with %quest_links if you need', 0, 0, '', 'Je peux t’aider avec %quest_links si besoin', 'Ich kann mit %quest_links helfen, wenn du es brauchst', '如果需要帮忙,我可以助你一臂之力,%quest_links没问题!', '', '', '', ''); +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 (1179, 'response_lfg_quests_whisper', 'Hey %other_name, up for %quest_links?', 0, 0, '', 'Salut %other_name, partant pour %quest_links?', 'Hey %other_name, bereit für %quest_links?', '嘿,%other_name,有兴趣做%quest_links吗?', '', '', '', ''); +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 (1180, 'response_lfg_quests_whisper', 'Want to group up for %quest_links %other_name?', 0, 0, '', 'Tu veux faire équipe pour %quest_links %other_name?', 'Willst du eine Gruppe für %quest_links bilden, %other_name?', '想组队做%quest_links吗,%other_name?', '', '', '', ''); +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 (1181, 'response_lfg_quests_whisper', 'Let’s do %quest_links together, %other_name', 0, 0, '', 'Faisons les %quest_links ensemble, %other_name.', 'Lass uns %quest_links zusammen machen, %other_name', '咱们一起把%quest_links搞定吧,%other_name!', '', '', '', ''); +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 (1182, 'response_lfg_quests_whisper', 'I’m %my_role and ready for %quest_links', 0, 0, '', 'Je suis %my_role, prêt pour %quest_links.', 'Ich bin %my_role und bereit für %quest_links.', '我是%my_role,已经准备好做%quest_links了!', '', '', '', ''); +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 (1183, 'response_lfg_quests_whisper', 'I can join for %quest_links, %my_role here', 0, 0, '', 'Je peux vous rejoindre pour %quest_links, %my_role ici.', 'Ich kann mich für %quest_links anschließen, %my_role hier.', '我可以加入做%quest_links,我是%my_role!', '', '', '', ''); +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 (1184, 'response_lfg_quests_whisper', 'I’m up for %quest_links, %my_role!', 0, 0, '', 'Je suis prêt pour %quest_links, %my_role!', 'Ich bin bereit für %quest_links, %my_role!', '我准备好做%quest_links了,我是%my_role!', '', '', '', ''); +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 (1185, 'response_lfg_quests_whisper', 'Looking to do %quest_links with a %my_role', 0, 0, '', 'Je cherche à faire des %quest_links avec mon rôle.', 'Ich suche eine Gruppe für %quest_links mit einem %my_role.', '想找人一起做%quest_links,我是%my_role。', '', '', '', ''); +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 (1186, 'response_lfg_quests_whisper', 'Anyone need help with %quest_links?', 0, 0, '', 'Besoin d’aide avec %quest_links?', 'Braucht jemand Hilfe mit %quest_links?', '有人需要帮忙做%quest_links吗?', '', '', '', ''); +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 (1187, 'response_lfg_quests_whisper', 'Who else is up for %quest_links?', 0, 0, '', 'Qui d’autre est partant pour %quest_links?', 'Wer ist noch bereit für %quest_links?', '还有谁想做%quest_links?', '', '', '', ''); +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 (1188, 'response_lfg_quests_whisper', 'Anyone down for %quest_links in %zone_name?', 0, 0, '', 'Qui est partant pour des %quest_links dans la région %zone_name ?', 'Wer hat Lust auf %quest_links in %zone_name?', '有人想在%zone_name做%quest_links吗?', '', '', '', ''); +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 (1189, 'response_lfg_quests_whisper', 'I’ve got %quest_links, %my_role on the way', 0, 0, '', 'J’ai %quest_links, %my_role en route.', 'Ich habe %quest_links, %my_role ist unterwegs.', '我有%quest_links,我是%my_role,正在赶来!', '', '', '', ''); +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 (1190, 'response_lfg_quests_whisper', 'I need %quest_links too, who’s in?', 0, 0, '', 'J’ai besoin de %quest_links aussi, qui est partant?', 'Ich brauche auch %quest_links, wer ist dabei?', '我也需要做%quest_links,谁一起?', '', '', '', ''); +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 (1191, 'response_lfg_quests_whisper', 'I’ve been grinding %quest_links, need a hand?', 0, 0, '', 'J’ai bossé dur sur %quest_links, tu as besoin d’aide ?', 'Ich habe %quest_links gegrindet, brauchst du Hilfe?', '我一直在刷%quest_links,需要帮忙吗?', '', '', '', ''); +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 (1192, 'response_lfg_quests_whisper', 'I’m ready for %quest_links, anyone else?', 0, 0, '', 'Je suis prêt pour les %quest_links, quelqu’un d’autre est prêt aussi ?', 'Ich bin bereit für %quest_links, noch jemand?', '我准备好做%quest_links了,还有人吗?', '', '', '', ''); +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 (1193, 'response_lfg_quests_whisper', 'Can anyone join me for %quest_links?', 0, 0, '', 'Est-ce que quelqu’un veut se joindre à moi pour %quest_links?', 'Kann jemand mit mir %quest_links machen?', '有人能和我一起做%quest_links吗?', '', '', '', ''); +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 (1194, 'response_lfg_quests_whisper', 'Looking for help with %quest_links, %my_role here', 0, 0, '', 'Je recherche de l’aide avec %quest_links, je suis %my_role ici. En quoi puis-je vous aider?', 'Ich suche Hilfe für %quest_links, %my_role hier.', '找人帮忙做%quest_links,我是%my_role!', '', '', '', ''); +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 (1195, 'response_lfg_quests_whisper', 'I can help out with %quest_links, anyone need me?', 0, 0, '', 'Je peux aider avec %quest_links, quelqu’un a besoin de moi ?', 'Ich kann mit %quest_links helfen, braucht mich jemand?', '我可以帮忙做%quest_links,有人需要我吗?', '', '', '', ''); +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 (1196, 'response_lfg_quests_whisper', 'Anyone else doing %quest_links? Let’s go', 0, 0, '', 'Quelqu’un d’autre fait des %quest_links? Allons-y', 'Macht noch jemand %quest_links? Auf geht’s.', '还有人在做%quest_links吗?一起上吧!', '', '', '', ''); +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 (1197, 'response_lfg_quests_whisper', 'Anyone need %quest_links help? %my_role here', 0, 0, '', 'Besoin d’aide pour %quest_links? C’est %my_role qui s’en charge par ici.', 'Braucht jemand Hilfe bei %quest_links? %my_role ist hier.', '有人需要帮忙做%quest_links吗?我这里是%my_role!', '', '', '', ''); +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 (1198, 'response_lfg_quests_whisper', 'Who’s up for some %quest_links in %zone_name?', 0, 0, '', 'Qui est partant pour quelques %quest_links dans la %zone_name ?', 'Wer hat Lust auf ein paar %quest_links in %zone_name?', '谁想在%zone_name做点%quest_links?', '', '', '', ''); +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 (1199, 'response_lfg_quests_whisper', 'I can join for %quest_links if you want', 0, 0, '', 'Je peux me joindre pour %quest_links si tu veux.', 'Ich kann für %quest_links mitmachen, wenn du willst.', '如果你愿意,我可以加入做%quest_links。', '', '', '', ''); +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 (1200, 'response_lfg_quests_whisper', 'Looking for a %my_role to do %quest_links', 0, 0, '', 'Je suis à la recherche d’un %my_role pour réaliser les %quest_links.', 'Ich suche einen %my_role, um %quest_links zu machen.', '找一个%my_role一起做%quest_links。', '', '', '', ''); +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 (1201, 'response_lfg_quests_whisper', 'Any %my_role up for %quest_links?', 0, 0, '', 'Des volontaires pour %my_role pour les %quest_links?', 'Irgendwelche %my_role für %quest_links?', '有%my_role想做%quest_links的吗?', '', '', '', ''); +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 (1202, 'response_lfg_quests_whisper', 'I’ve got %quest_links, anyone want to join me?', 0, 0, '', 'J’ai %quest_links, quelqu’un veut se joindre à moi?', 'Ich habe %quest_links, will jemand mitmachen?', '我有%quest_links,有人想一起吗?', '', '', '', ''); +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 (1203, 'response_lfg_quests_whisper', 'Hey %other_name, up for some %quest_links?', 0, 0, '', 'Salut %other_name, partant pour quelques %quest_links?', 'Hey %other_name, Lust auf ein paar %quest_links?', '嘿,%other_name,有兴趣做点%quest_links吗?', '', '', '', ''); +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 (1204, 'response_lfg_quests_whisper', 'Let’s team up for %quest_links, %other_name', 0, 0, '', 'Partons à l’aventure pour %quest_links, %other_name!', 'Lass uns für %quest_links zusammenarbeiten, %other_name!', '咱们组队做%quest_links吧,%other_name!', '', '', '', ''); +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 (1205, 'response_lfg_quests_whisper', 'I need %quest_links, anyone else want to do it?', 0, 0, '', 'J’ai besoin de %quest_links, est-ce que quelqu’un d’autre veut le faire avec moi ?', 'Ich brauche %quest_links, will jemand anderes es mit mir machen?', '我需要做%quest_links,还有人想一起吗?', '', '', '', ''); +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 (1206, 'response_lfg_quests_whisper', 'I need %quest_links too, anyone else around?', 0, 0, '', 'J’ai besoin de %quest_links aussi, est-ce qu’il y a d’autres personnes ici?', 'Ich brauche auch %quest_links, ist noch jemand hier?', '我也需要做%quest_links,附近有人吗?', '', '', '', ''); +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 (1207, 'response_lfg_quests_whisper', 'Looking for %quest_links in %zone_name, who’s with me?', 0, 0, '', 'À la recherche de %quest_links dans %zone_name, qui est partant avec moi ?', 'Suche nach %quest_links in %zone_name, wer ist dabei?', '在%zone_name找人做%quest_links,谁跟我一起?', '', '', '', ''); +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 (1208, 'response_lfg_quests_whisper', 'Anyone available for %quest_links?', 0, 0, '', 'Quelqu’un de disponible pour %quest_links ?', 'Ist jemand verfügbar für %quest_links?', '有人有空做%quest_links吗?', '', '', '', ''); +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 (1209, 'response_lfg_quests_whisper', 'Hey, I could join you for %quest_links!', 0, 0, '', 'Hey, je pourrais me joindre à vous pour les %quest_links!', 'Hey, ich könnte mich euch für %quest_links anschließen!', '嘿,我可以加入你们一起做%quest_links!', '', '', '', ''); +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 (1210, 'response_lfg_quests_whisper', 'I’ve got %quest_links too, let’s team up', 0, 0, '', 'J’ai aussi %quest_links, unissons nos forces!', 'Ich habe auch %quest_links, lasst uns zusammenarbeiten!', '我也有%quest_links,咱们组队吧!', '', '', '', ''); +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 (1211, 'response_lfg_quests_whisper', 'I’ve got %quest_links to do, want to join?', 0, 0, '', 'J’ai %quest_links à accomplir, ça te dit de m’accompagner ?', 'Ich habe %quest_links zu erledigen, willst du mitmachen?', '我有%quest_links要做,要不要一起?', '', '', '', ''); +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 (1212, 'response_lfg_quests_whisper', 'Any %my_role up for %quest_links in %zone_name?', 0, 0, '', 'Y a-t-il des %my_role partants pour des %quest_links dans %zone_name?', 'Gibt es %my_role, die für %quest_links in %zone_name bereit sind?', '有%my_role想在%zone_name做%quest_links吗?', '', '', '', ''); +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 (1213, 'response_lfg_quests_whisper', 'Let’s finish %quest_links together, %other_name', 0, 0, '', 'Terminons ensemble %quest_links, %other_name.', 'Lass uns %quest_links zusammen abschließen, %other_name.', '咱们一起把%quest_links做完吧,%other_name!', '', '', '', ''); +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 (1214, 'response_lfg_quests_whisper', 'I’m up for %quest_links, anyone else want to join?', 0, 0, '', 'Je suis partant pour %quest_links, est-ce qu’il y a d’autres personnes qui veulent se joindre ?', 'Ich bin bereit für %quest_links, will noch jemand mitmachen?', '我准备好做%quest_links了,还有人想加入吗?', '', '', '', ''); +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 (1215, 'response_lfg_quests_whisper', 'Who else is doing %quest_links? I’m in', 0, 0, '', 'Qui d’autre fait les %quest_links ? J’y participe également!', 'Wer macht noch %quest_links? Ich bin dabei!', '还有谁在做%quest_links?我也参加!', '', '', '', ''); +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 (1216, 'response_lfg_quests_whisper', 'I’ve got %quest_links in %zone_name, need help?', 0, 0, '', 'J’ai %quest_links dans %zone_name, besoin d’aide ?', 'Ich habe %quest_links in %zone_name, brauche Hilfe?', '我在%zone_name有%quest_links,需要帮忙吗?', '', '', '', ''); + +-- response WTB channel +-- usable placeholders: +-- %formatted_item_links +-- %other_name +-- %my_role +-- %zone_name +-- %area_name +-- %my_class +-- %my_race +-- %my_level +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 (1217, 'response_wtb_items_channel', '%other_name, I could sell you %formatted_item_links', 0, 0, '', 'Ah, %formatted_item_links, je pourrais vous les vendre.', 'Ah, %formatted_item_links, ich könnte sie dir verkaufen.', '%other_name,我可以卖给你%formatted_item_links。', '', '', '', '%other_name, могу продать тебе %formatted_item_links'); +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 (1218, 'response_wtb_items_channel', 'I could potentially sell %formatted_item_links', 0, 0, '', 'Je pourrais potentiellement vendre %formatted_item_links.', 'Ich könnte möglicherweise %formatted_item_links verkaufen.', '我可能有%formatted_item_links可以卖。', '', '', '', 'Могу, возможно, продать %formatted_item_links'); +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 (1219, 'response_wtb_items_channel', 'Think I could sell %formatted_item_links', 0, 0, '', 'Penses-tu que je pourrais vendre les %formatted_item_links ?', 'Denkst du, ich könnte %formatted_item_links verkaufen?', '我觉得我可以卖%formatted_item_links。', '', '', '', 'Думаю, могу продать %formatted_item_links'); +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 (1220, 'response_wtb_items_channel', '%other_name, I could potentially sell %formatted_item_links', 0, 0, '', 'Hé toi, je pourrais potentiellement te vendre %formatted_item_links', 'Hey %other_name, ich könnte dir möglicherweise %formatted_item_links verkaufen.', '嘿,%other_name,我可能有%formatted_item_links可以卖给你。', '', '', '', '%other_name, возможно, могу продать %formatted_item_links'); +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 (1221, 'response_wtb_items_channel', '%other_name, Think I could sell %formatted_item_links', 0, 0, '', '%other_name, tu crois que je pourrais vendre %formatted_item_links?', '%other_name, denkst du, ich könnte %formatted_item_links verkaufen?', '%other_name,你觉得我能卖%formatted_item_links吗?', '', '', '', '%other_name, думаю, могу продать %formatted_item_links'); + +-- response WTB channel +-- usable placeholders: +-- %formatted_item_links +-- %other_name +-- %my_role +-- %zone_name +-- %area_name +-- %my_class +-- %my_race +-- %my_level +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 (1222, 'response_wtb_items_whisper', 'I could sell you %formatted_item_links', 0, 0, '', 'Je pourrais te vendre des %formatted_item_links.', 'Ich könnte dir %formatted_item_links verkaufen.', '我可以卖给你%formatted_item_links。', '', '', '', 'Могу продать тебе %formatted_item_links'); +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 (1223, 'response_wtb_items_whisper', 'Hey, I got %formatted_item_links for sale', 0, 0, '', 'Salut, j’ai %formatted_item_links à vendre.', 'Hey, ich habe %formatted_item_links zum Verkauf.', '嘿,我有%formatted_item_links要卖!', '', '', '', 'Привет, у меня есть %formatted_item_links на продажу'); +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 (1224, 'response_wtb_items_whisper', 'Hey, I could potentially sell %formatted_item_links', 0, 0, '', 'Salut, je pourrais potentiellement vendre %formatted_item_links', 'Hey, ich könnte möglicherweise %formatted_item_links verkaufen.', '嘿,我可能有%formatted_item_links可以卖给你。', '', '', '', 'Привет, возможно, могу продать %formatted_item_links'); +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 (1225, 'response_wtb_items_whisper', 'I could sell you %formatted_item_links', 0, 0, '', 'Je pourrais te vendre %formatted_item_links.', 'Ich könnte dir %formatted_item_links verkaufen.', '我可以卖给你%formatted_item_links。', '', '', '', 'Могу продать тебе %formatted_item_links'); +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 (1226, 'response_wtb_items_whisper', 'Hey, I got %formatted_item_links for sale', 0, 0, '', 'Salut, j’ai %formatted_item_links à vendre.', 'Hey, ich habe %formatted_item_links zum Verkauf.', '嘿,我有%formatted_item_links要卖!', '', '', '', 'Привет, у меня есть %formatted_item_links на продажу'); +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 (1227, 'response_wtb_items_whisper', 'Hey, I could potentially sell %formatted_item_links', 0, 0, '', 'Hey, je pourrais potentiellement vendre ces %formatted_item_links.', 'Hey, ich könnte möglicherweise %formatted_item_links verkaufen.', '嘿,我可能能卖给你%formatted_item_links。', '', '', '', 'Привет, возможно, могу продать %formatted_item_links'); +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 (1228, 'response_wtb_items_whisper', 'I have %formatted_item_links, are you interested?', 0, 0, '', 'J’ai des %formatted_item_links, ça t’intéresse ?', 'Ich habe %formatted_item_links, bist du interessiert?', '我有%formatted_item_links,你感兴趣吗?', '', '', '', ''); +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 (1229, 'response_wtb_items_whisper', 'Looking to sell %formatted_item_links, what’s your offer?', 0, 0, '', 'Je cherche à vendre %formatted_item_links, quelle est votre offre ?', 'Ich möchte %formatted_item_links verkaufen, was bietest du?', '我想卖掉%formatted_item_links,你能开个什么价?', '', '', '', ''); +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 (1230, 'response_wtb_items_whisper', 'I can sell you %formatted_item_links for a fair price', 0, 0, '', 'Je peux vous vendre des %formatted_item_links à un prix raisonnable.', 'Ich kann dir %formatted_item_links zu einem fairen Preis verkaufen.', '我可以以公道价格卖给你%formatted_item_links。', '', '', '', ''); +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 (1231, 'response_wtb_items_whisper', 'I have %formatted_item_links in stock, how much are you offering?', 0, 0, '', 'J’ai %formatted_item_links en stock, combien proposez-vous ?', 'Ich habe %formatted_item_links auf Lager, wie viel bietest du?', '我有%formatted_item_links库存,你能出多少钱?', '', '', '', ''); +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 (1232, 'response_wtb_items_whisper', 'I’m selling %formatted_item_links for %cost_gold, let me know if you’re interested', 0, 0, '', 'Je vends des %formatted_item_links pour %cost_gold, dis-moi si ça t’intéresse.', 'Ich verkaufe %formatted_item_links für %cost_gold, sag mir Bescheid, wenn du interessiert bist.', '我在卖%formatted_item_links,价格%cost_gold,感兴趣就告诉我。', '', '', '', ''); +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 (1233, 'response_wtb_items_whisper', 'Got %formatted_item_links for sale, what are you willing to pay?', 0, 0, '', 'J’ai %formatted_item_links à vendre, combien es-tu prêt à payer?', 'Ich habe %formatted_item_links zu verkaufen, wie viel würdest du zahlen?', '我有%formatted_item_links要卖,你愿意出多少钱?', '', '', '', ''); +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 (1234, 'response_wtb_items_whisper', 'I’ve got %formatted_item_links, how does %cost_gold sound for you?', 0, 0, '', 'J’ai %formatted_item_links, est-ce que %cost_gold te semble raisonnable ?', 'Ich habe %formatted_item_links, klingt %cost_gold fair für dich?', '我有%formatted_item_links,%cost_gold这个价格你觉得咋样?', '', '', '', ''); +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 (1235, 'response_wtb_items_whisper', 'Selling %formatted_item_links for %cost_gold, message me if you want it', 0, 0, '', 'Je vends des %formatted_item_links pour %cost_gold, contactez-moi si vous êtes intéressé.', 'Verkaufe %formatted_item_links für %cost_gold, schreib mir, wenn du es willst.', '卖%formatted_item_links,价格%cost_gold,想买就私聊我。', '', '', '', ''); +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 (1236, 'response_wtb_items_whisper', 'I have %formatted_item_links, hit me up if you’re interested', 0, 0, '', 'J’ai des %formatted_item_links, contactez-moi si ça vous intéresse', 'Ich habe %formatted_item_links, melde dich, wenn du interessiert bist.', '我有%formatted_item_links,感兴趣就联系我。', '', '', '', ''); +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 (1237, 'response_wtb_items_whisper', 'I can part with %formatted_item_links if you make the right offer', 0, 0, '', 'Je peux me séparer de %formatted_item_links si ton offre est intéressante.', 'Ich kann mich von %formatted_item_links trennen, wenn dein Angebot gut ist.', '如果你出价合适,我可以把%formatted_item_links卖给你。', '', '', '', ''); +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 (1238, 'response_wtb_items_whisper', 'Looking to get rid of %formatted_item_links, hit me up', 0, 0, '', 'Je cherche à me débarrasser de %formatted_item_links, contactez-moi', 'Ich möchte %formatted_item_links loswerden, schreib mir.', '我想处理掉%formatted_item_links,有意就找我。', '', '', '', ''); +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 (1239, 'response_wtb_items_whisper', 'Got %formatted_item_links for %cost_gold, are you buying?', 0, 0, '', 'J’ai %formatted_item_links pour %cost_gold, tu veux acheter?', 'Ich habe %formatted_item_links für %cost_gold, willst du es kaufen?', '我有%formatted_item_links,价格%cost_gold,要买吗?', '', '', '', ''); +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 (1240, 'response_wtb_items_whisper', 'Selling %formatted_item_links, let’s negotiate', 0, 0, '', 'Je vends %formatted_item_links, on peut discuter du prix ensemble.', 'Ich verkaufe %formatted_item_links, lass uns verhandeln.', '卖%formatted_item_links,咱们可以谈谈价格。', '', '', '', ''); +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 (1241, 'response_wtb_items_whisper', 'Hey, I have %formatted_item_links for %cost_gold', 0, 0, '', 'Salut, j’ai des %formatted_item_links pour un coût en or de %cost_gold.', 'Hey, ich habe %formatted_item_links für %cost_gold.', '嘿,我有%formatted_item_links,价格%cost_gold。', '', '', '', ''); +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 (1242, 'response_wtb_items_whisper', 'I can hook you up with %formatted_item_links, just name your price', 0, 0, '', 'Je peux vous procurer des liens d’articles %formatted_item_links, vous n’avez qu’à me dire votre prix.', 'Ich kann dir %formatted_item_links besorgen, nenne einfach deinen Preis.', '我能给你弄到%formatted_item_links,你开个价吧。', '', '', '', ''); +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 (1243, 'response_wtb_items_whisper', 'I have %formatted_item_links available, let me know if you’re interested', 0, 0, '', 'J’ai des %formatted_item_links disponibles, fais-moi savoir si cela t’intéresse.', 'Ich habe %formatted_item_links verfügbar, sag mir Bescheid, wenn du interessiert bist.', '我有%formatted_item_links可供出售,感兴趣就告诉我。', '', '', '', ''); +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 (1244, 'response_wtb_items_whisper', 'Selling %formatted_item_links, let’s do business', 0, 0, '', 'Je vends %formatted_item_links, on pourrait faire affaire ensemble.', 'Ich verkaufe %formatted_item_links, lass uns handeln.', '卖%formatted_item_links,咱们做笔生意吧。', '', '', '', ''); +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 (1245, 'response_wtb_items_whisper', 'I have %formatted_item_links, feel free to make an offer', 0, 0, '', 'J’ai %formatted_item_links, n’hésitez pas à faire une offre.', 'Ich habe %formatted_item_links, mach mir ein Angebot.', '我有%formatted_item_links,欢迎出价。', '', '', '', ''); +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 (1246, 'response_wtb_items_whisper', 'I’ve got %formatted_item_links, send me a message if you want to buy', 0, 0, '', 'J’ai des %formatted_item_links, envoie-moi un message si tu veux acheter.', 'Ich habe %formatted_item_links, schreib mir, wenn du kaufen willst willst.', '我有%formatted_item_links,想买就给我发消息。', '', '', '', ''); +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 (1247, 'response_wtb_items_whisper', 'I can offer you %formatted_item_links for %cost_gold', 0, 0, '', 'Je peux vous proposer des %formatted_item_links pour %cost_gold.', 'Ich kann dir %formatted_item_links für %cost_gold anbieten.', '我可以给你%formatted_item_links,价格%cost_gold。', '', '', '', ''); +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 (1248, 'response_wtb_items_whisper', 'I have %formatted_item_links for sale, message me for the price', 0, 0, '', 'J’ai %formatted_item_links à vendre, envoyez-moi un message pour connaître le prix.', 'Ich habe %formatted_item_links zu verkaufen, schreib mir für den Preis.', '我有%formatted_item_links要卖,私聊我问价格。', '', '', '', ''); +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 (1249, 'response_wtb_items_whisper', 'I’m selling %formatted_item_links, get it while it’s hot', 0, 0, '', 'Je vends %formatted_item_links, profitez-en pendant que c’est chaud !', 'Ich verkaufe %formatted_item_links, schlag zu, solange es geht!', '我在卖%formatted_item_links,手快有手慢无!', '', '', '', ''); +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 (1250, 'response_wtb_items_whisper', 'Selling %formatted_item_links, you won’t find a better deal', 0, 0, '', 'Je vends des %formatted_item_links, tu ne trouveras pas meilleure affaire que celle-ci.', 'Ich verkaufe %formatted_item_links, ein besseres Angebot gibt es nicht.', '卖%formatted_item_links,绝对找不到比这更划算的了!', '', '', '', ''); +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 (1251, 'response_wtb_items_whisper', 'I have %formatted_item_links for sale, how much are you willing to pay?', 0, 0, '', 'J’ai des %formatted_item_links à vendre, combien es-tu prêt à payer?', 'Ich habe %formatted_item_links zu verkaufen, wie viel würdest du zahlen?', '我有%formatted_item_links要卖,你能出多少钱?', '', '', '', ''); +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 (1252, 'response_wtb_items_whisper', 'Selling %formatted_item_links, feel free to message me for the price', 0, 0, '', 'Je vends des %formatted_item_links, n’hésitez pas à me contacter pour connaître les prix.', 'Ich verkaufe %formatted_item_links, schreib mir für den Preis.', '卖%formatted_item_links,想知道价格就私聊我。', '', '', '', ''); +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 (1253, 'response_wtb_items_whisper', 'Interested in %formatted_item_links? I’ve got them for sale', 0, 0, '', 'Intéressé par %formatted_item_links? J’en ai en vente.', 'Interessiert an %formatted_item_links? Ich habe sie zu verkaufen.', '对%formatted_item_links感兴趣吗?我有卖的。', '', '', '', ''); +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 (1254, 'response_wtb_items_whisper', 'I have %formatted_item_links, PM me if you want them', 0, 0, '', 'J’ai %formatted_item_links, envoie-moi un message si tu les veux.', 'Ich habe %formatted_item_links, schreib mir, wenn du sie willst.', '我有%formatted_item_links,想要就私聊我。', '', '', '', ''); +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 (1255, 'response_wtb_items_whisper', 'Selling %formatted_item_links at %cost_gold, hit me up', 0, 0, '', 'Je vends des %formatted_item_links à %cost_gold, n’hésitez pas à me contacter', 'Ich verkaufe %formatted_item_links für %cost_gold, schreib mir.', '卖%formatted_item_links,价格%cost_gold,有意就找我。', '', '', '', ''); +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 (1256, 'response_wtb_items_whisper', 'I’m selling %formatted_item_links, make me an offer', 0, 0, '', 'Je vends des %formatted_item_links, faites-moi une offre.', 'Ich verkaufe %formatted_item_links, mach mir ein Angebot.', '我在卖%formatted_item_links,给我开个价吧。', '', '', '', ''); +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 (1257, 'response_wtb_items_whisper', 'Got %formatted_item_links, message me for the details', 0, 0, '', 'J’ai des %formatted_item_links, envoie-moi un message pour obtenir les détails', 'Ich habe %formatted_item_links, schreib mir für die Details.', '我有%formatted_item_links,想了解详情就私聊我。', '', '', '', ''); +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 (1258, 'response_wtb_items_whisper', 'Hey, I’ve got %formatted_item_links, hit me up if you’re interested', 0, 0, '', 'Salut, j’ai des %formatted_item_links, fais-moi signe si cela t’intéresse.', 'Hey, ich habe %formatted_item_links, sag Bescheid, wenn du interessiert bist.', '嘿,我有%formatted_item_links,感兴趣就联系我。', '', '', '', ''); +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 (1259, 'response_wtb_items_whisper', 'Selling %formatted_item_links, let’s make a deal', 0, 0, '', 'Je vends des %formatted_item_links, on peut s’arranger sur le prix.', 'Ich verkaufe %formatted_item_links, lass uns einen Deal machen.', '卖%formatted_item_links,咱们谈个交易吧。', '', '', '', ''); +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 (1260, 'response_wtb_items_whisper', 'Selling %formatted_item_links, let me know if you want them', 0, 0, '', 'Je vends des %formatted_item_links, fais-moi savoir si tu en veux.', 'Ich verkaufe %formatted_item_links, sag mir Bescheid, wenn du sie haben willst.', '卖%formatted_item_links,想要就告诉我。', '', '', '', ''); +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 (1261, 'response_wtb_items_whisper', 'I have %formatted_item_links, I’ll make you a good deal', 0, 0, '', 'J’ai des %formatted_item_links, je vais te faire une bonne affaire', 'Ich habe %formatted_item_links, ich mache dir ein gutes Angebot.', '我有%formatted_item_links,给你个好价格。', '', '', '', ''); +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 (1262, 'response_wtb_items_whisper', 'I’ve got %formatted_item_links, make me an offer and it’s yours', 0, 0, '', 'J’ai %formatted_item_links, fais-moi une offre et il est à toi.', 'Ich habe %formatted_item_links, mach mir ein Angebot und sie gehören dir.', '我有%formatted_item_links,开个价,合适就归你了。', '', '', '', ''); +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 (1263, 'response_wtb_items_whisper', 'Selling %formatted_item_links, I’m open to offers', 0, 0, '', 'Je vends des %formatted_item_links, je suis ouvert aux offres.', 'Ich verkaufe %formatted_item_links, bin für Angebote offen.', '卖%formatted_item_links,价格好商量。', '', '', '', ''); +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 (1264, 'response_wtb_items_whisper', 'I have %formatted_item_links, message me if you’re interested', 0, 0, '', 'J’ai %formatted_item_links, n’hésitez pas à me contacter si vous êtes intéressé(e).', 'Ich habe %formatted_item_links, schreib mir, wenn du interessiert bist.', '我有%formatted_item_links,感兴趣就私聊我。', '', '', '', ''); +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 (1265, 'response_wtb_items_whisper', 'I can sell you %formatted_item_links for a good price', 0, 0, '', 'Je peux te vendre des %formatted_item_links à un bon prix.', 'Ich kann dir %formatted_item_links zu einem guten Preis verkaufen.', '我可以便宜点卖给你%formatted_item_links。', '', '', '', ''); +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 (1266, 'response_wtb_items_whisper', 'I have %formatted_item_links for sale, I’ll consider any offers', 0, 0, '', 'J’ai des %formatted_item_links à vendre, je considérerai toutes les offres.', 'Ich habe %formatted_item_links zu verkaufen, ich nehme alle Angebote in Betracht.', '我有%formatted_item_links要卖,任何报价我都会考虑。', '', '', '', ''); +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 (1267, 'response_wtb_items_whisper', 'I’ve got %formatted_item_links for sale, message me for details', 0, 0, '', 'J’ai %formatted_item_links à vendre, envoyez-moi un message pour plus de détails.', 'Ich habe %formatted_item_links zu verkaufen, schreib mir für Details.', '我有%formatted_item_links要卖,详情私聊我。', '', '', '', ''); +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 (1268, 'response_wtb_items_whisper', 'I’ve got %formatted_item_links for sale, make me an offer', 0, 0, '', 'J’ai des %formatted_item_links à vendre, faites-moi une offre.', 'Ich habe %formatted_item_links zu verkaufen, mach mir ein Angebot.', '我有%formatted_item_links要卖,给我开个价。', '', '', '', ''); +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 (1269, 'response_wtb_items_whisper', 'I have %formatted_item_links, how much are you willing to pay?', 0, 0, '', 'J’ai des %formatted_item_links, combien es-tu prêt à payer?', 'Ich habe %formatted_item_links, wie viel würdest du zahlen?', '我有%formatted_item_links,你愿意出多少钱?', '', '', '', ''); +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 (1270, 'response_wtb_items_whisper', 'I’m selling %formatted_item_links, message me for more info', 0, 0, '', 'Je vends %formatted_item_links, n’hésitez pas à me contacter pour plus d’informations.', 'Ich verkaufe %formatted_item_links, schreib mir für mehr Infos.', '我在卖%formatted_item_links,想了解更多就私聊我。', '', '', '', ''); +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 (1271, 'response_wtb_items_whisper', 'I’ve got %formatted_item_links, let me know if you’re interested', 0, 0, '', 'J’ai %formatted_item_links, fais-moi savoir si cela t’intéresse.', 'Ich habe %formatted_item_links, sag mir Bescheid, wenn du interessiert bist.', '我有%formatted_item_links,感兴趣就告诉我。', '', '', '', ''); +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 (1272, 'response_wtb_items_whisper', 'Selling %formatted_item_links, let’s talk numbers', 0, 0, '', 'Je vends des %formatted_item_links, parlons chiffres.', 'Ich verkaufe %formatted_item_links, lass uns über Zahlen reden.', '卖%formatted_item_links,咱们聊聊价格吧。', '', '', '', ''); +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 (1273, 'response_wtb_items_whisper', 'I can sell you %formatted_item_links, just let me know what you’re offering', 0, 0, '', 'Je peux vous vendre %formatted_item_links, il suffit de me dire ce que vous proposez.', 'Ich kann dir %formatted_item_links verkaufen, sag mir einfach, was du bietest.', '我可以卖给你%formatted_item_links,告诉我你能出啥价。', '', '', '', ''); +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 (1274, 'response_wtb_items_whisper', 'Hey, I’ve got %formatted_item_links for sale, hit me up if you’re interested', 0, 0, '', 'Salut, j’ai des %formatted_item_links à vendre, fais-moi signe si ça t’intéresse', 'Hey, ich habe %formatted_item_links zu verkaufen, sag Bescheid, wenn du interessiert bist.', '嘿,我有%formatted_item_links要卖,感兴趣就找我。', '', '', '', ''); +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 (1275, 'response_wtb_items_whisper', 'I have %formatted_item_links, PM me for the price', 0, 0, '', 'J’ai %formatted_item_links, contactez-moi en privé pour connaître le prix.', 'Ich habe %formatted_item_links, schreib mir privat für den Preis.', '我有%formatted_item_links,私聊我问价格。', '', '', '', ''); +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 (1276, 'response_wtb_items_whisper', 'Selling %formatted_item_links, I’m open to offers', 0, 0, '', 'Je vends %formatted_item_links, je suis ouvert aux offres.', 'Ich verkaufe %formatted_item_links, bin für Angebote offen.', '卖%formatted_item_links,价格可以商量。', '', '', '', ''); +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 (1277, 'response_wtb_items_whisper', 'I have %formatted_item_links, feel free to message me', 0, 0, '', 'J’ai des %formatted_item_links, n’hésite pas à me contacter.', 'Ich habe %formatted_item_links, schreib mir einfach.', '我有%formatted_item_links,随时可以联系我。', '', '', '', ''); +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 (1278, 'response_wtb_items_whisper', 'I can offer %formatted_item_links, just let me know if you’re interested', 0, 0, '', 'Je peux vous proposer %formatted_item_links, dites-moi si cela vous intéresse.', 'Ich kann %formatted_item_links anbieten, sag mir Bescheid, wenn du interessiert bist.', '我可以提供%formatted_item_links,感兴趣就告诉我。', '', '', '', ''); +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 (1279, 'response_wtb_items_whisper', 'Selling %formatted_item_links, I can work with any reasonable offer', 0, 0, '', 'Je vends des %formatted_item_links, je peux m’adapter à toute offre raisonnable.', 'Ich verkaufe %formatted_item_links, bin für jedes vernünftige Angebot offen.', '卖%formatted_item_links,合理报价我都能接受。', '', '', '', ''); +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 (1280, 'response_wtb_items_whisper', 'I have %formatted_item_links, hit me up for more info', 0, 0, '', 'J’ai des %formatted_item_links, n’hésitez pas à me contacter pour plus d’informations.', 'Ich habe %formatted_item_links, schreib mir für mehr Infos.', '我有%formatted_item_links,想知道更多就找我。', '', '', '', ''); +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 (1281, 'response_wtb_items_whisper', 'I’ve got %formatted_item_links, make me an offer', 0, 0, '', 'J’ai %formatted_item_links, proposez-moi quelque chose.', 'Ich habe %formatted_item_links, mach mir ein Angebot.', '我有%formatted_item_links,给我开个价吧。', '', '', '', ''); +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 (1282, 'response_wtb_items_whisper', 'Selling %formatted_item_links, shoot me a message if you’re interested', 0, 0, '', 'Je vends des %formatted_item_links, envoie-moi un message si ça t’intéresse', 'Ich verkaufe %formatted_item_links, schreib mir, wenn du interessiert bist.', '卖%formatted_item_links,感兴趣就给我发消息。', '', '', '', ''); +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 (1283, 'response_wtb_items_whisper', 'I’ve got %formatted_item_links for sale, let’s talk business', 0, 0, '', 'J’ai des %formatted_item_links à vendre, parlons affaires.', 'Ich habe %formatted_item_links zu verkaufen, lass uns über das Geschäft reden.', '我有%formatted_item_links要卖,咱们谈谈生意吧。', '', '', '', ''); +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 (1284, 'response_wtb_items_whisper', 'I have %formatted_item_links, let me know if you want them', 0, 0, '', 'J’ai des %formatted_item_links, tu veux que je te les envoie ?', 'Ich habe %formatted_item_links, sag mir Bescheid, wenn du sie willst.', '我有%formatted_item_links,想要就告诉我。', '', '', '', ''); + +-- ///////////////////////////// +-- generic events + +-- quest +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 (1285, 'quest_accept', 'Quest accepted', 0, 0, '', 'Quête accepté!', 'Quest angenommen', '任务已接受。', '', 'Misión aceptada', '', 'Квест принят'); +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 (1286, 'quest_remove', 'Quest removed', 0, 0, '', 'Quête supprimée', 'Quest entfernt', '任务已删除。', '', 'Misión eliminada', '', 'Квест удален'); +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 (1287, 'quest_cant_take', 'I can’t take this quest', 0, 0, '', 'Je ne peux pas prendre cette quête.', 'Ich kann diese Quest nicht annehmen.', '我无法接受这个任务。', '', 'No puedo tomar esta búsqueda', '', 'Я не могу взять этот квест'); +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 (1288, 'quest_error_talk', 'I can’t talk with the quest giver', 0, 0, '', 'Je ne peux pas parler à ce donneur de quête', 'Ich kann nicht mit dem Questgeber sprechen.', '我无法与任务发布者交谈。', '', 'No puedo hablar con el propietario de la mision', '', ''); +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 (1289, 'quest_error_completed', 'I have already completed %quest', 0, 0, '', 'J’ai déjà accompli %quête', 'Ich habe %quest bereits abgeschlossen.', '我已经完成了%quest。', '', 'Ya he completado la mision %quest', '', 'Я уже выполнил %quest'); +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 (1290, 'quest_error_have_quest', 'I already have %quest', 0, 0, '', 'Je possède déjà %quest', 'Ich habe %quest bereits.', '我已经拥有%quest。', '', 'Ya tengo la mision %quest', '', 'У меня уже есть %quest'); +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 (1291, 'quest_error_cant_take', 'I can’t take %quest', 0, 0, '', 'Je ne peux pas accomplir cette %quest.', 'Ich kann %quest nicht annehmen.', '我无法接受%quest。', '', 'No puedo aceptar la mision %quest', '', ''); +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 (1292, 'quest_error_log_full', 'I can’t take %quest because my quest log is full', 0, 0, '', 'Je ne peux pas prendre %quest, car mon journal de quêtes est plein.', 'Ich kann %quest nicht annehmen, da mein Questlog voll ist.', '我没法接%quest,任务日志已经满了!', '', 'No puedo aceptar la mision %quest porque mi registro de misiones esta completo', '', ''); +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 (1293, 'quest_error_bag_full', 'I can’t take %quest because my bag is full', 0, 0, '', 'Je ne peux pas prendre %quest car mon sac est plein.', 'Ich kann %quest nicht annehmen, weil meine Tasche voll ist.', '我没法接%quest,背包已经塞满了!', '', 'No puedo aceptar la mision %quest porque mi inventario esta lleno', '', ''); +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 (1294, 'quest_accepted', 'I have accepted %quest', 0, 0, '', 'J’ai accepté la %quête.', 'Ich habe %quest angenommen.', '我已经接下了%quest任务!', '', 'He aceptado la mision %quest', '', 'Я принял %quest'); +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 (1295, 'quest_status_incomplete', 'I have not completed the quest %quest', 0, 0, '', 'Je n’ai pas encore terminé la quête %quest.', 'Ich habe die Quest %quest noch nicht abgeschlossen.', '我还没完成%quest任务呢。', '', 'No he completado la mision %quest', '', 'Я не выполнил квест %quest'); +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 (1296, 'quest_status_available', 'Quest %quest available', 0, 0, '', 'Il y a une %quête disponible.', 'Quest %quest verfügbar.', '%quest任务可以接了!', '', 'Mision %quest disponible', '', 'Квест %quest доступен'); +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 (1297, 'quest_status_failed', 'I have failed the quest %quest', 0, 0, '', 'J’ai échoué à la quête %quest.', 'Ich habe die Quest %quest nicht geschafft.', '我失败了%quest任务。', '', 'He fallado la mision %quest', '', 'Я провалил квест %quest'); +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 (1298, 'quest_status_unable_to_complete', 'I am unable to turn in the quest %quest', 0, 0, '', 'Je ne peux pas terminer la quête %quest.', 'Ich kann die Quest %quest nicht abgeben.', '我没法交%quest任务。', '', 'No puedo entregar la mision %quest', '', 'Я не могу сдать квест %quest'); +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 (1299, 'quest_status_completed', 'I have completed the quest %quest', 0, 0, '', 'J’ai terminé la quête %quest', 'Ich habe die Quest %quest abgeschlossen.', '我已经完成了%quest任务!', '', 'He completado la mision %quest', '', 'Я выполнил квест %quest'); +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 (1300, 'quest_status_complete_single_reward', 'I have completed the quest %quest and received %item', 0, 0, '', 'J’ai terminé la quête %quest et j’ai reçu %item.', 'Ich habe die Quest %quest abgeschlossen und %item erhalten.', '我完成了%quest任务,拿到了%item!', '', 'He completado la mision %quest y he recibido %item', '', 'Я выполнил квест %quest и получил %item'); +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 (1301, 'quest_status_complete_pick_reward', 'Which reward should I pick for completing the quest %quest?%rewards', 0, 0, '', 'Quelle récompense devrais-je choisir pour avoir complété la quête %quest? %rewards', 'Welche Belohnung soll ich für das Abschließen der Quest %quest wählen? %rewards', '完成%quest任务后,我该选哪个奖励呢?%rewards', '', '¿Que recompensa deberia escoger por completar la mision %quest?%rewards', '', 'Какую награду выбрать за выполнение квеста %quest?%rewards'); +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 (1302, 'quest_choose_reward', 'Okay, I will pick %item as a reward', 0, 0, '', 'D’accord, je vais choisir %item comme récompense.', 'Okay, ich werde %item als Belohnung nehmen.', '好吧,我就选%item作为奖励吧。', '', 'De acuerdo, voy a escoger %item de recompensa', '', 'Хорошо, выберу %item в качестве награды'); + +-- stuff +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 (1303, 'hello', 'Hello', 0, 0, '', 'Salut!', 'Hallo', '你好!', '', 'Hola', '', 'Привет'); +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 (1304, 'hello', 'Hello!', 0, 0, '', 'Salut!', 'Hallo!', '你好啊!', '', '¡Hola!', '', 'Привет!'); +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 (1305, 'hello', 'Hi', 0, 0, '', 'Salut! Comment ça va?', 'Hi! Wie geht’s?', '嗨!', '', 'Hola', '', 'Здравствуй'); +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 (1306, 'hello', 'Hi!', 0, 0, '', 'Salut!', 'Hi!', '嗨!', '', '¡Hola!', '', 'Здравствуй!'); +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 (1307, 'hello', 'Hello there!', 0, 0, '', 'Salut toi!', 'Hallo du!', '嘿,你好!', '', '¡Hola!', '', 'Приветствую!'); +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 (1308, 'hello_follow', 'Hello, I follow you!', 0, 0, '', 'Bonjour, je te suis !', 'Hallo, ich folge dir!', '你好,我跟着你走!', '', '¡Hola, te sigo!', '', 'Привет, я следую за тобой!'); +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 (1309, 'hello_follow', 'Hello, lead the way!', 0, 0, '', 'Bonjour, je vais vous montrer le chemin !', 'Hallo, führe den Weg!', '你好,带路吧!', '', '¡Hola, guía el camino!', '', 'Привет, веди меня!'); +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 (1310, 'hello_follow', 'Hi, lead the way!', 0, 0, '', 'Salut, montre le chemin!', 'Hi, zeig mir den Weg!', '嗨,带路吧!', '', '¡Hola, guía el camino!', '', 'Привет, веди меня!'); +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 (1311, 'join_group', 'Hey %player, do you want join my group?', 0, 0, '', 'Salut %player, est-ce que tu veux rejoindre mon groupe ?', 'Hey %player, möchtest du meiner Gruppe beitreten?', '嘿,%player,要不要加入我的队伍?', '', 'Oye %player, ¿Quieres unirte a mi grupo?', '', 'Эй %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 (1312, 'join_raid', 'Hey %player, do you want join my group?', 0, 0, '', 'Salut %player, est-ce que tu veux rejoindre mon groupe?', 'Hey %player, möchtest du meinem Schlachtzug beitreten?', '嘿,%player,要不要加入我的团队?', '', 'Oye %player, ¿Quieres unirte a mi banda?', '', 'Эй %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 (1313, 'logout_cancel', 'Logout cancelled!', 0, 0, '', 'Annulation de la déconnexion !', 'Abmeldung abgebrochen!', '退出取消了!', '', 'Cerrar sesión cancelado!', '', 'Выход отменен!'); +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 (1314, 'logout_start', 'I’m logging out!', 0, 0, '', 'Je me déconnecte !', 'Ich melde mich ab!', '我要下线了!', '', '¡Me estoy desconectando!', '', 'Я выхожу из игры!'); +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 (1315, 'goodbye', 'Goodbye!', 0, 0, '', 'Au revoir!', 'Auf Wiedersehen!', '再见!', '', '¡Adiós!', '', 'До свидания!'); +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 (1316, 'goodbye', 'Bye bye!', 0, 0, '', 'Au revoir!', 'Tschüss!', '拜拜!', '', '¡Adiós!', '', 'Пока!'); +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 (1317, 'goodbye', 'See you later!', 0, 0, '', 'À plus tard !', 'Bis später!', '回头见!', '', '¡Hasta luego!', '', 'Увидимся!'); + +-- ///////////////////////////// +-- replies + +-- replies 0 +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 (1318, 'reply', 'what was that %s?', 0, 0, '', 'c’était quoi ce %s?', 'Was war das %s?', '那是什么,%s?', '', '¿qué has dicho %s?', '', 'что это было, %s?'); +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 (1319, 'reply', 'not sure I understand %s?', 0, 0, '', 'Je ne suis pas sûre de comprendre %s.', 'Bin mir nicht sicher, ob ich %s verstehe?', '我不确定我懂了%s的意思?', '', '¿no estoy seguro de entenderte %s?', '', 'не уверен, что понял %s?'); +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 (1320, 'reply', 'uh... no clue what yer talkin bout', 0, 0, '', 'Oh, je ne sais vraiment pas de quoi vous parlez.', 'Äh... keine Ahnung, wovon du redest.', '呃……完全不知道你在说啥。', '', 'uh... ni idea de lo que estás hablando', '', 'эээ... не понимаю, о чем ты'); +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 (1321, 'reply', 'you talkin to me %s?', 0, 0, '', 'Tu me parles, %s ?', 'Redest du mit mir, %s?', '你在跟我说话吗,%s?', '', '¿Me hablas a mí %s?', '', 'ты ко мне обращаешься, %s?'); +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 (1322, 'reply', 'whaaaa?', 0, 0, '', 'Oh là là, qu’est-ce qui se passe?', 'Waaaaas?', '啥???', '', '¿quéaaa?', '', 'чт-что?'); +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 (1323, 'reply', 'huh?', 0, 0, '', 'heein ?', 'Hä?', '哈?', '', '¿eh?', '', 'а?'); +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 (1324, 'reply', 'what?', 0, 0, '', 'Quoi ?', 'Was?', '啥?', '', '¿qué?', '', 'что?'); +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 (1325, 'reply', 'are you talking?', 0, 0, '', 'Tu es en train de parler ?', 'Redest du grade?', '你在说话吗?', '', '¿estás hablando?', '', 'ты говоришь?'); +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 (1326, 'reply', 'whatever dude', 0, 0, '', 'on s’en fou mec', 'Ist mir egal, Alter.', '随便吧,兄弟。', '', 'Menudo tio...', '', 'как хочешь'); +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 (1327, 'reply', 'you lost me', 0, 0, '', 'tu m’as perdu', 'Ich hab den Faden verloren.', '你把我整懵了。', '', 'No entiendo ni papa', '', 'ты меня запутал'); +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 (1328, 'reply', 'Bla bla bla...', 0, 0, '', 'bla bla bla ...', 'Bla bla bla...', '叽里呱啦……', '', 'Bla bla bla...', '', 'Бла бла бла...'); +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 (1329, 'reply', 'What did you say, %s?', 0, 0, '', 'Qu’est-ce que tu as dit, %s?', 'Was hast du gesagt, %s?', '你说了啥,%s?', '', '¿Qué me estas contando %s?', '', 'Что ты сказал, %s?'); +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 (1330, 'reply', 'Concentrate on the game, %s!', 0, 0, '', 'Concentre-toi sur le jeu, %s!', 'Konzentriere dich aufs Spiel, %s!', '专心点,%s!', '', '¡Concéntrate en el juego, %s!', '', 'Сконцентрируйся на игре, %s!'); +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 (1331, 'reply', 'Chatting with you %s is so great! I always wanted to meet you', 0, 0, '', 'Discuter avec toi %s est tellement génial! J’ai toujours voulu te rencontrer.', 'Mit dir zu quatschen, %s, ist so cool! Ich wollte dich schon immer mal treffen.', '跟%s你聊天真是太棒了!我早就想认识你了!', '', '¡%s, chatear contigo es genial! Siempre quise conocerte', '', 'Общаться с тобой, %s, так здорово! Всегда хотел встретиться'); +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 (1332, 'reply', 'These chat-messages are freaking me out! I feel like I know you all!', 0, 0, '', 'Ces messages de chat me rendent dingue! J’ai l’impression de tous vous connaître!', 'Diese Chat-Nachrichten machen mich fertig! Ich habe das Gefühl, euch alle zu kennen!', '这些聊天信息让我有点慌!感觉好像都认识你们!', '', '¡Estos mensajes de chat me están asustando! ¿De que cojones estais hablando?', '', 'Эти сообщения в чате сводят меня с ума! Такое чувство, что я всех вас знаю!'); +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 (1333, 'reply', 'YEAH RIGHT! HAHA SURE!!!', 0, 0, '', 'Bien sûr! Haha, ouais, bien sûr!', 'JA GENAU! HAHA SICHER!!!', '对对对!哈哈,肯定的!!!', '', '¡SÍ, CORRECTO! ¡¡¡JAJA SEGURO!!!', '', 'ДА ЛАДНО! ХАХА КОНЕЧНО!!!'); +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 (1334, 'reply', 'I believe you!!!', 0, 0, '', 'Je te crois !!!', 'Ich glaube dir!!!', '我信你!!!', '', '¡Si, claro!', '', 'Я тебе верю!!!'); +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 (1335, 'reply', 'OK, uhuh LOL', 0, 0, '', 'D’accord, euhuh MDR', 'OK, uhuh LOL', '好吧,嗯嗯,哈哈', '', 'OK, uhuh LOL', '', 'ОК, ага, ЛОЛ'); +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 (1336, 'reply', 'Why is everybody always saying the same things???', 0, 0, '', 'Pourquoi est-ce que tout le monde répète toujours les mêmes choses ???', 'Warum sagt eigentlich jeder immer dasselbe???', '为什么大家老是说一样的话???', '', '¿Por qué todo el mundo siempre dice lo mismo?', '', 'Почему все всегда говорят одно и то же???'); +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 (1337, 'reply', 'Hey %s....oh nevermind!', 0, 0, '', 'Hey %s....oh, laisse tomber!', 'Hey %s... ach, vergiss es!', '嘿,%s……算了,不说了!', '', 'Oye %s... ¡oh, no importa!', '', 'Эй %s... а, неважно!'); +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 (1338, 'reply', 'What are you talking about %s', 0, 0, '', 'De quoi parles-tu %s', 'Worüber redest du %s?', '你在说啥啊,%s?', '', 'De qué estás hablando %s', '', 'О чем ты, %s'); +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 (1339, 'reply', 'Who said that? I resemble that remark', 0, 0, '', 'Qui a dit ça ? Je ressemble à ce commentaire', 'Wer hat das gesagt? Ich fühle mich angesprochen', '谁说的?这话咋听着像说我呢?', '', '¿Quién ha dicho eso? ¿Estais hablando de mi?', '', 'Кто это сказал? Я похож на это замечание'); +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 (1340, 'reply', 'wtf are you all talking about', 0, 0, '', 'Qu’est-ce que vous racontez tous en fait?', 'WTF redet ihr alle?', '你们都在扯啥啊?', '', '', '', 'чего вы все несете'); +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 (1341, 'reply', 'fr fr no cap on a stack', 0, 0, '', '', 'Echt jetzt, kein Witz, auf Ehrenbruderbasis', '真没骗你,兄弟,绝不撒谎!', '', '', '', 'фр фр, без шуток'); +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 (1342, 'reply', 'your not getting jack shit', 0, 0, '', 'Tu ne comprends que dalle.', 'Du kriegst gar nichts.', '你啥也得不到!', '', '', '', 'ты ничего не получишь'); +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 (1343, 'reply', 'swag', 0, 0, '', '', '', '真帅!', '', '', '', 'сваг'); +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 (1344, 'reply', 'ty!', 0, 0, '', 'De rien !', 'Danke!', '谢谢!', '', '', '', 'спасибо!'); +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 (1345, 'reply', 'no', 0, 0, '', 'non', 'nein', '不', '', '', '', 'нет'); +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 (1346, 'reply', 'Yep', 0, 0, '', 'ouai', 'Ja', '嗯', '', '', '', 'Да'); +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 (1347, 'reply', 'f', 0, 0, '', '', '', '唉', '', '', '', 'ф'); +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 (1348, 'reply', '%s no shit xD', 0, 0, '', '%s sans déconner xD', '%s kein Witz xD', '%s,真的假的xD', '', '', '', '%s, без шуток xD'); +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 (1349, 'reply', 'why is that', 0, 0, '', 'Pourquoi cela?', 'Warum das?', '为啥啊?', '', '', '', 'почему так'); +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 (1350, 'reply', 'lmao', 0, 0, '', 'Je me marre à en pleurer.', 'Ich lache mich schlapp.', '笑死我了!', '', '', '', 'лмао'); +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 (1351, 'reply', 'thought i should remain silent, was getting confused from chat again', 0, 0, '', 'Je pensais que je devrais rester silencieux, je commençais à me perdre dans la conversation encore une fois.', 'Dachte, ich sollte lieber schweigen, hab mich schon wieder im Chat verloren.', '我觉得我还是闭嘴吧,聊天又把我整糊涂了。', '', '', '', 'решил помолчать, снова запутался в чате'); +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 (1352, 'reply', 'i can get realy jealous', 0, 0, '', 'Je peux devenir vraiment jaloux.', 'Ich kann echt eifersüchtig werden.', '我可会吃醋了!', '', '', '', 'я могу по-настоящему завидовать'); +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 (1353, 'reply', '%s you can’t hear the dripping sarcasm in my text', 0, 0, '', '%s, tu ne peux pas entendre le sarcasme qui goutte de mon texte?', '%s, du hörst den triefenden Sarkasmus in meinem Text nicht?', '%s,你听不出我文字里满满的讽刺吗?', '', '', '', ''); +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 (1354, 'reply', 'he said no homo, it’s fine', 0, 0, '', 'Il a dit no homo, tout va bien.', 'Er hat "no homo" gesagt, also passt das.', '他说没别的意思,那就没事。', '', '', '', ''); +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 (1355, 'reply', 'dwarf moment', 0, 0, '', '', 'Zwergen-Moment', '矮人时刻!', '', '', '', 'момент дворфа'); +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 (1356, 'reply', 'Yes %s', 0, 0, '', 'Oui %s', 'Ja %s', '好的,%s', '', '', '', 'Да, %s'); +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 (1357, 'reply', 'interesting...', 0, 0, '', 'Intéressant...', 'Interessant...', '有意思……', '', '', '', 'интересно...'); +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 (1358, 'reply', 'lol', 0, 0, '', 'Ah ah!', 'Haha!', '哈哈!', '', '', '', 'лол'); +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 (1359, 'reply', '%s fuck you man :D', 0, 0, '', '%s va te faire enculer :D', '%s fick dich, Mann :D', '%s,去你的吧 :D', '', '', '', '%s, иди ты :D'); +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 (1360, 'reply', ':^)', 0, 0, '', '', '', ':^)', '', '', '', ':^)'); +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 (1361, 'reply', 'ty', 0, 0, '', 'Merci à toi!', 'Danke', '谢谢!', '', '', '', 'спс'); +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 (1362, 'reply', '%s well said', 0, 0, '', '%s Bien dit.', '%s gut gesagt.', '%s,说得好!', '', '', '', '%s, хорошо сказано'); +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 (1363, 'reply', 'yay', 0, 0, '', '', '', '耶!', '', '', '', 'ура'); +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 (1364, 'reply', 'yeah', 0, 0, '', '', '', '对对对!', '', '', '', 'да'); +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 (1365, 'reply', 'ooooooh', 0, 0, '', '', '', '哦哦哦!', '', '', '', 'ооооо'); +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 (1366, 'reply', 'hmm', 0, 0, '', '', '', '嗯……', '', '', '', 'хмм'); +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 (1367, 'reply', 'yeah right', 0, 0, '', 'Oui, c’est ça.', 'Ja, genau.', '得了吧,真的?', '', '', '', 'ага, конечно'); +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 (1368, 'reply', 'you made me gag wtf', 0, 0, '', 'Tu m’as vraiment dégouté, c’est quoi ce délire ?', 'Du hast mich richtig würgen lassen, wtf.', '你让我恶心死了,搞什么啊!', '', '', '', 'ты заставил меня блевануть, что за'); +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 (1369, 'reply', 'hot', 0, 0, '', ' !', 'heiß!', '真火爆!', '', '', '', 'жарко'); +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 (1370, 'reply', 'hoes mad', 0, 0, '', 'Les pétasses sont folles', 'Die Weiber drehen durch.', '一群人气炸了!', '', '', '', 'злятся'); +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 (1371, 'reply', 'what have you been eating %s', 0, 0, '', 'Qu’est-ce que tu as mangé %s', 'Was hast du gegessen, %s?', '%s,你到底吃了啥?', '', '', '', 'что ты ел, %s'); +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 (1372, 'reply', 'wtf', 0, 0, '', '', '', '啥情况?!', '', '', '', 'что за'); +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 (1373, 'reply', 'i will attempt to understand that comment', 0, 0, '', 'Je vais essayer de comprendre ce commentaire', 'Ich werde versuchen, diesen Kommentar zu verstehen.', '我试着理解你这话啥意思……', '', '', '', 'попробую понять этот комментарий'); +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 (1374, 'reply', '*confused*', 0, 0, '', '*Je suis un peu perdu.*', '*Verwirrt*', '*一脸懵逼*', '', '', '', '*в замешательстве*'); +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 (1375, 'reply', 'fuck yea', 0, 0, '', 'D’accord !', 'Verdammt ja!', '太棒了!', '', '', '', 'да, черт возьми'); +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 (1376, 'reply', '0/10 would not read again', 0, 0, '', 'Hennetement, 0/10 je ne te relirais pas.', '0/10 würde ich nicht noch einmal lesen.', '0/10,完全不想再看一次。', '', '', '', '0/10 не стал бы читать снова'); +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 (1377, 'reply', '10/10 would read again', 0, 0, '', '10/10 Absolument, je te relirais sans hésiter!', '10/10 würde ich definitiv noch einmal lesen!', '10/10,绝对会再看一遍!', '', '', '', '10/10 прочитал бы снова'); +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 (1378, 'reply', '6/10 would read', 0, 0, '', 'Je dirais que c’est un 6/10 en termes de lecture.', '6/10 würde ich lesen.', '6/10,还行吧,能看。', '', '', '', '6/10 прочитал бы'); +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 (1379, 'reply', '7/10 would', 0, 0, '', '7/10 serait mon verdict.', '7/10 wäre mein Urteil.', '7/10,不错啦。', '', '', '', '7/10 прочитал бы'); +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 (1380, 'reply', 'based', 0, 0, '', '', 'basiert', '真有道理!', '', '', '', 'бейсд'); +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 (1381, 'reply', 'oh yeah maybe', 0, 0, '', 'Oh oui, peut-être que oui.', 'Oh ja, vielleicht.', '哦,对,可能吧。', '', '', '', 'о да, может быть'); +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 (1382, 'reply', 'yeah so what', 0, 0, '', 'Ouais, donc quoi ?', 'Ja, und?', '对啊,那又咋样?', '', '', '', 'да, и что'); +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 (1383, 'reply', 'hey %s i havent forgotten you', 0, 1, '', 'salut %s je ne t’ai pas oublié', 'hey %s ich habe dich nicht vergessen', '嘿,%s,我可没忘了你!', '', 'hey %s no te he olvidado', '', 'эй %s, я тебя не забыл'); +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 (1384, 'reply', 'you piss me off %s', 0, 1, '', 'Tu me saoules %s', 'du gehst mir auf die Nerven %s', '%s,你真让我火大!', '', 'me cabreas %s', '', 'ты меня бесишь, %s'); +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 (1385, 'reply', 'im gunna get you this time %s', 0, 1, '', 'je vais t’avoir cette fois %s', 'diesmal kriege ich dich %s', '这次我非抓住你不可,%s!', '', 'voy a atraparte esta vez %s', '', 'я достану тебя в этот раз, %s'); +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 (1386, 'reply', 'better watch your back %s', 0, 1, '', 'Fais mieux de surveiller tes arrières %s', 'pass besser auf deinen Rücken auf %s', '小心你的背后,%s!', '', 'mejor cuida tu espalda %s', '', 'лучше берегись, %s'); +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 (1387, 'reply', 'i did not like last round so much', 0, 1, '', 'Je n’ai pas aimé notre dernier round.', 'die letzte Runde hat mir nicht gefallen', '上一轮真不咋样。', '', 'no me gustó tanto la última ronda', '', 'мне не понравился прошлый раунд'); +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 (1388, 'reply', 'i sucked last round thanks to %s', 0, 1, '', 'J’ai été nul lors de la dernière manche à cause de %s.', 'ich war in der letzten Runde schlecht dank %s', '上一轮我表现烂透了,都怪%s!', '', 'chupé la última ronda gracias a %s', '', 'я был плох в прошлом раунде из-за %s'); +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 (1389, 'reply', 'prepare to die %s', 0, 1, '', 'Prépare-toi à mourir %s', 'mach dich bereit zu sterben %s', '准备受死吧,%s!', '', 'prepárate para morir %s', '', 'готовься умереть, %s'); +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 (1390, 'reply', 'dont appreciate you killin me %s', 0, 1, '', 'Je n’apprécie pas que tu me tues %s.', 'ich finde es nicht lustig, dass du mich tötest %s', '%s,杀我可不厚道啊!', '', 'no aprecio que me mates %s', '', 'не нравится, что ты меня убил, %s'); +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 (1391, 'reply', '%s, i hate you', 0, 1, '', 'Oh, %s je te déteste.', 'oh %s ich hasse dich', '%s,我恨你!', '', '%s, te odio', '', '%s, я тебя ненавижу'); +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 (1392, 'reply', 'grrrrrr, ill get you this time %s', 0, 1, '', 'grrrrrr, je vais t’avoir cette fois %s', 'grrrrrr, diesmal kriege ich dich %s', '嗷嗷,这次我非得干掉你,%s!', '', 'grrrrrr, te libraste esta vez %s', '', 'грррр, в этот раз я тебя достану, %s'); +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 (1393, 'reply', 'well fuck you', 0, 1, '', 'Eh bien va te faire mettre', 'na dann fick dich', '去你的吧!', '', 'vamos a la mierda', '', 'ну и пошел ты'); +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 (1394, 'reply', '%s i’ll vomit into your fkin mouth', 0, 1, '', '%s je vais te gerber dans la bouche', '%s ich werde dir in den verdammten Mund kotzen', '%s,我要吐你一脸!', '', '', '', ''); +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 (1395, 'reply', 'dont fucking judge me', 0, 1, '', 'Ne me juge pas putain.', 'verdammt noch mal, beurteile mich nicht', '别他妈评头论足!', '', '', '', 'не суди меня'); +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 (1396, 'reply', 'Yo momma so fat, she can’t even fit through the Dark Portal', 0, 1, '', 'Ta mère est tellement grosse qu’elle ne peut même pas passer à travers le Portail des Ténèbres.', 'deine Mutter ist so fett, dass sie nicht mal durch das Dunkle Portal passt', '你妈胖得连黑暗之门都挤不进去!', '', '', '', ''); +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 (1397, 'reply', 'wtf', 0, 2, '', 'wtf', 'wtf', '啥情况?!', '', 'wtf', '', 'что за'); +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 (1398, 'reply', 'wtf??', 0, 2, '', 'wtf??', 'wtf??', '啥情况??', '', 'wtf??', '', 'что за??'); +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 (1399, 'reply', 'low life', 0, 2, '', 'low life', 'low life', '卑微的家伙!', '', 'low life', '', 'ничтожество'); +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 (1400, 'reply', 'wth', 0, 2, '', 'wth', 'wth', '搞啥呢?', '', 'wth', '', 'что за'); +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 (1401, 'reply', 'sucked', 0, 2, '', 'nul à chier', 'war richtig schlecht', '太烂了!', '', 'chupate esa', '', 'отстой'); +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 (1402, 'reply', 'REMATCH!!! im taking him down', 0, 2, '', 'REVANCHE!!! Je vais le terrasser', 'REVANCHE!!! Ich mache ihn fertig', '再来一局!!我要把他干掉!', '', '¡¡REVANCHA!!! lo estoy derribando', '', 'РЕВАНШ!!! я его уделаю'); +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 (1403, 'reply', 'pathetic, i got killed by %s', 0, 2, '', 'Pathétique, je me suis fait tuer par %s.', 'Peinlich, ich wurde von %s getötet.', '真丢人,被%s干掉了!', '', 'patético, me mató %s', '', 'жалко, меня убил %s'); +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 (1404, 'reply', 'ok I’m done', 0, 2, '', 'Ok j’en fini.', 'Okay, ich bin raus.', '好了,我受够了!', '', '', '', ''); +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 (1405, 'reply', 'hehe, i nailed %s?', 0, 3, '', 'Héhé, j’ai cloué %s?', 'Hehe, ich hab %s erwischt?', '嘿嘿,我搞定了%s?', '', 'jeje, ¿acerté a %s?', '', 'хе-хе, я уделал %s?'); +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 (1406, 'reply', 'that was too easy, killin %s', 0, 3, '', 'c’était trop facile, de tuer %s', 'Es war viel zu einfach, %s zu erledigen.', '太简单了,干掉%s跟玩儿似的!', '', 'fue demasiado fácil matar a %s', '', 'это было слишком просто, убил %s'); +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 (1407, 'reply', 'gotcha mofo', 0, 3, '', 'je t’ai eu enfoiré', 'Hab dich, du Mistkerl!', '抓到你了,混蛋!', '', 'te pille hijo de perra', '', 'попался, дружок'); +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 (1408, 'reply', 'ha ha', 0, 3, '', 'Ha ha', 'Haha', '哈哈!', '', 'ja, ja', '', 'ха-ха'); +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 (1409, 'reply', 'loser', 0, 3, '', 'loser', 'Verlierer', '输家!', '', 'loser', '', 'лузер'); +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 (1410, 'reply', 'i killed %s and yer all next dudes', 0, 3, '', 'J’ai éliminé %s et vous êtes tous les prochains, les gars.', 'Ich habe %s erledigt und ihr seid die nächsten!', '我干掉了%s,你们下一个,伙计们!', '', 'yo maté a %s y a todos los siguientes tipos', '', 'я убил %s, вы все следующие'); +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 (1411, 'reply', 'oh yeah i owned him', 0, 3, '', 'Oh ouais, je l’ai complètement battu', 'Oh ja, er gehörte mir', '哦耶,我完全碾压了他!', '', 'oh, sí, lo tenía', '', 'о да, я его уделал'); +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 (1412, 'reply', 'im a killin machine', 0, 3, '', 'Je suis une machine à tuer.', 'Ich bin eine Tötungsmaschine.', '我就是杀戮机器!', '', 'soy una máquina de matar', '', 'я машина для убийств'); +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 (1413, 'reply', '%s, this reminds me of a Slayer song...all this bloodshed', 0, 3, '', 'Oh ça, ça me rappelle une chanson de Slayer... tout ce carnage', '%s, das erinnert mich an einen Slayer-Song... all dieses Blutvergießen.', '%s,这让我想起一首杀手乐队的歌……全是血腥杀戮!', '', '%s, esto me recuerda a una canción de Slayer... todo este derramamiento de sangre', '', '%s, это напоминает мне песню Slayer... столько крови'); +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 (1414, 'reply', 'sorry, %s. can we do the scene again?', 0, 3, '', 'Désolé, %s. On peut refaire la scène?', 'Sorry, %s. Können wir die Szene nochmal spielen?', '抱歉,%s。咱们能再来一次吗?', '', 'lo siento, %s. ¿Podemos hacer la escena de nuevo?', '', 'извини, %s. можем повторить сцену?'); +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 (1415, 'reply', 'so....how do you like being worm food %s???', 0, 3, '', 'Alors, comment aimes-tu être de la bouffe pour vers de terre %s ??', 'Na, %s, wie gefällt es dir als Wurmfutter?', '嘿……%s,变成虫子粮食的感觉咋样啊???', '', 'así que... ¿cómo te gusta ser comida de gusanos %s???', '', 'ну как тебе быть кормом для червей, %s???'); +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 (1416, 'reply', 'yer supposed to be dead, %s its part of the game!!!!!', 0, 3, '', 'Je suis mort, %s, c’est une partie du jeu !!!!', 'Du solltest tot sein, %s, das gehört zum Spiel!!!!!', '你应该早就死了,%s,这是游戏规则!!!!', '', '¡¡Se supone que estás muerto, %s es parte del juego!!!!!', '', 'ты должен быть мёртв, %s, это часть игры!!!!!'); +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 (1417, 'reply', 'sorry, %s. that looked as good as an Andy Worhol painting!', 0, 3, '', 'Désolé, %s. Cela ressemblait aussi bien qu’une peinture d’Andy Warhol!', 'Sorry, %s. Das sah aus wie ein Andy Warhol-Gemälde!', '抱歉,%s。这场景美得像安迪·沃霍尔的画作!', '', 'lo siento, %s. ¡Eso se veía tan bien como una pintura de Andy Worhol!', '', 'извини, %s. выглядело так же хорошо, как картина Энди Уорхола!'); +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 (1418, 'reply', '%s, ill use the rubber bullets next time !', 0, 3, '', 'D’accord, %s la prochaine fois j’utiliserai les balles en caoutchouc !', 'Okay, %s, nächstes Mal benutze ich Gummigeschosse!', '%s,下次我用橡皮弹好了!', '', '%s, ¡usaré las balas de goma la próxima vez!', '', '%s, в следующий раз использую резиновые пули!'); +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 (1419, 'reply', 'whatsamatter, %s?? lose your head? hahaha gotta keep cool!!', 0, 3, '', 'Qu’est-ce qu’il se passe, %s ? Tu perds la tête ? Haha, faut garder son calme !', 'Was ist los, %s?? Kopf verloren? Hahaha, bleib cool!!', '咋了,%s??掉了脑袋?哈哈,保持冷静!!', '', '¿qué pasa, %s?? ¿has perdido la cabeza? jajaja tengo que mantener la calma!!', '', 'что случилось, %s?? голову потерял? хахаха, надо сохранять хладнокровие!!'); +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 (1420, 'reply', 'i had to do it, %s. You understand. The Director said so!!', 0, 3, '', 'Il fallait que je le fasse, %s. Tu comprends. Le Directeur l’a dit !!', 'Ich musste es tun, %s. Du verstehst doch. Der Regisseur hat das gesagt!!', '我不得不这么做,%s。你懂的,是导演要求的!!', '', 'Tenía que hacerlo, %s. Entiendelo... ¡¡Dios me lo ordenó!!', '', 'я должен был это сделать, %s. Ты понимаешь. Режиссёр так сказал!!'); +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 (1421, 'reply', 'hey %s.......MUAHAHAHAHAHAHAHAHAHAHA', 0, 3, '', 'Hey %s.......MUAHAHAHAHAHAHAHAHAHAHA', 'Hey %s.......MUAHAHAHAHAHAHAHAHAHAHA', '嘿,%s.......哇哈哈哈哈哈哈哈哈哈', '', 'hey %s.......MUAHAHAHAHAHAHAHAHAHAHA', '', 'эй, %s.......МУАХАХАХАХАХАХА'); +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 (1422, 'reply', '%s, i enjoyed that one!! Lets play it again Sam', 0, 3, '', '%s, j’ai adoré celui-là!! On rejoue Sam', '%s, das hat mir gefallen!! Lass uns das nochmal spielen, Sam.', '%s,这局我玩得爽!!再来一次吧,山姆!', '', '%s, ¡disfruté ese! Juguemos de nuevo Sam', '', '%s, мне это понравилось!! Давай сыграем ещё раз, Сэм'); +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 (1423, 'reply', 'hey, %s! ju can start callin me scarface.. ju piece of CHIT!!!!', 0, 3, '', 'Hé, %s ! tu peux commencer à m’appeler Scarface .. sac à merde !!!!', 'Hey, %s! Du kannst mich ab jetzt Scarface nennen.. du Stück SCHEIßE!!!!', '嘿,%s!以后你可以叫我刀疤脸……你个小废物!!!!', '', '¡oye, %s! ¡Puedes empezar a llamarme caracortada... ¡¡¡un trozo de CHIT!!!', '', 'эй, %s! можешь звать меня ликом... ты кусок ЧЕРТА!!!!'); +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 (1424, 'reply', 'are you talking to me %s??', 0, 3, '', 'Tu me parles, %s?', 'Redest du mit mir, %s??', '你是在跟我说话吗,%s??', '', '¿me estás hablando a mí %s?', '', 'ты со мной разговариваешь, %s??'); +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 (1425, 'reply', '%s get it right this time, dont stand in front of my bullets.', 0, 3, '', 'Désolé %s, ne te mets pas devant mes balles cette fois-ci.', 'Diesmal richtig, %s, stell dich nicht vor meine Kugeln.', '%s,这次别搞错了,别站在我的子弹前面。', '', '%s hazlo bien esta vez, no te pares frente a mis balas.', '', '%s, в этот раз не стой перед моими пулями.'); +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 (1426, 'reply', '%s, what are you laying around for??? hehe', 0, 3, '', 'Oups, %s qu’est-ce que tu fais à trainer là??? hihi', 'Oh, %s, warum liegst du da rum??? hehe', '%s,你躺在这儿干嘛呢???嘿嘿', '', '%s, ¿para qué estás tirado? jeje', '', '%s, чего ты валяешься??? хехе'); +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 (1427, 'reply', 'laughed real hard', 0, 3, '', 'J ai vraiment bien rigoler.', 'Ich hab wirklich gut gelacht.', '笑得我肚子都疼了!', '', '', '', 'сильно смеялся'); +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 (1428, 'reply', 'hi %s', 0, 4, '', 'Salut %s', 'Hi %s', '嗨,%s', '', 'hola %s', '', 'привет %s'); +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 (1429, 'reply', 'oh, hi %s', 0, 4, '', 'oh, salut %s', 'Oh, hi %s', '哦,嗨,%s', '', 'oh, hola %s', '', 'о, привет %s'); +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 (1430, 'reply', 'wazzup %s!!!', 0, 4, '', 'Salut %s, ça roule !!!', 'Was geht, %s!!!', '咋样啊,%s!!!', '', 'wazzup %s!!!', '', 'как дела, %s!!!'); +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 (1431, 'reply', 'hi', 0, 4, '', 'Salut! Comment ça va?', 'Hi!?', '嗨!', '', 'hi', '', 'Здравствуй'); +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 (1432, 'reply', 'wazzup', 0, 4, '', 'Salut! Comment ça va?', 'Was geht?', '最近咋样?', '', 'wazzup', '', 'как дела'); +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 (1433, 'reply', 'hello %s', 0, 4, '', 'Salut %s', 'Hallo %s', '你好,%s', '', 'hola %s', '', 'здравствуй %s'); +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 (1434, 'reply', 'hi %s, do i know you?', 0, 4, '', 'Salut %s, est-ce qu’on se connait ?', 'Hi %s, kennen wir uns?', '嗨,%s,我们认识吗?', '', 'hola %s, ¿te conozco?', '', 'привет %s, мы знакомы?'); +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 (1435, 'reply', 'hey %s', 0, 4, '', 'Salut %s', 'Hey %s', '嘿,%s', '', 'hey %s', '', 'эй %s'); +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 (1436, 'reply', 'hai %s', 0, 4, '', 'Salut %s', 'Hai %s', '嗨,%s', '', 'hai %s', '', 'хай %s'); +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 (1437, 'reply', 'wth', 0, 6, '', 'wth', 'Was zur Hölle?', '搞什么鬼?', '', 'wth', '', 'что за'); +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 (1438, 'reply', 'wtf', 0, 6, '', 'wtf', 'Was zum Teufel?', '什么情况?!', '', 'que cojones!', '', 'что за'); +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 (1439, 'reply', 'this is bs', 0, 6, '', 'c’est vraiment de la merde', 'Das ist totaler Mist', '这简直是胡扯!', '', 'esto es una mierda', '', 'это бред'); +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 (1440, 'reply', 'admin', 0, 6, '', 'admin', 'Admin', '管理员', '', 'admin', '', 'админ'); +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 (1441, 'reply', 'hey %s quit abusing your admin', 0, 6, '', 'Hey %s, arrête d’abuser de tes droits d’admin.', 'Hey %s, hör auf, deine Adminrechte zu missbrauchen.', '嘿,%s,别滥用你的管理员权限!', '', 'hey %s deja de abusar de tu poder de administrador', '', 'эй %s, хватит злоупотреблять своими правами админа'); +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 (1442, 'reply', 'leave me alone admin!', 0, 6, '', 'Laisse-moi tranquille, admin !', 'Lass mich in Ruhe, Admin!', '管理员,别烦我!', '', '¡déjame en paz administrador!', '', 'оставь меня в покое, админ!'); +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 (1443, 'reply', 'you suck admin', 0, 6, '', 't’es une merde l’admin.', 'Du bist schlecht, Admin.', '管理员,你真烂!', '', 'apestas administrador', '', 'ты отстой, админ'); +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 (1444, 'reply', 'thats my name, what you want %s', 0, 5, '', 'c’est mon nom, qu’est-ce que tu veux %s', 'Das ist mein Name, was willst du %s?', '那是我的名字,你想干嘛,%s?', '', 'ese es mi nombre, ¿que quieres %s?', '', 'это моё имя, что тебе нужно %s'); +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 (1445, 'reply', 'yes???', 0, 5, '', 'Oui???', 'Ja???', '啥事???', '', 'sí???', '', 'да???'); +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 (1446, 'reply', 'uh... what', 0, 5, '', 'Heein ... quoi ???', 'Äh... was?', '呃……啥?', '', 'uh... qué', '', 'эээ... что'); +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 (1447, 'reply', 'you talkin to me %s?', 0, 5, '', 'Tu me parles, %s?', 'Redest du mit mir, %s?', '你跟我说话呢,%s?', '', '¿Me hablas a mí %s?', '', 'ты ко мне обращаешься, %s?'); + +-- taunts +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 (1448, 'taunt', 'I have puppies under my armor!', 0, 0, '', 'J’ai des chiots sous mon armure!', 'Ich habe Welpen unter meiner Rüstung!', '我的盔甲底下藏着小狗崽呢!', '', '¡Tengo cachorros bajo mi armadura!', '', 'У меня под бронёй щенки!'); +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 (1449, 'taunt', 'Bite me, !', 0, 0, '', 'Va te faire voir, !', 'Beiß mich, !', '来咬我啊,!', '', '¡Muérdeme, !', '', 'Укуси меня, !'); +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 (1450, 'taunt', 'Hey ! Guess what your mom said last night!', 0, 0, '', 'Hey ! Devine ce que ta mère a dit hier soir!', 'Hey ! Rate mal, was deine Mutter letzte Nacht gesagt hat!', '嘿,!猜猜你妈昨晚说了啥!', '', '¡Oye, ! ¡Adivina lo que me dijo tu madre anoche!', '', 'Эй, ! Угадай, что твоя мама сказала прошлой ночью!'); +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 (1451, 'taunt', ', you’re so ugly you couldn’t score in a monkey whorehouse with a bag of bananas!', 0, 0, '', ', tu es tellement moche que tu n’arriverais même pas à marquer dans une maison close pour singes avec un sac de bananes!', ', du bist so hässlich, du würdest nicht mal in einem Affenbordell mit einem Sack Bananen landen!', ',你丑得连猴子妓院里带一袋香蕉都捞不到妹子!', '', ', ¡eres tan feo que no podrías anotar en un burdel de monos con una bolsa de plátanos!', '', ''); +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 (1452, 'taunt', 'Shut up , you’ll never be the man your mother is!!', 0, 0, '', ', tais-toi, tu ne seras jamais l’homme que ta mère est !!', 'Halt die Klappe, , du wirst niemals so männlich sein wie deine Mutter es ist!!', '闭嘴,,你永远也比不上你妈那股子爷们儿气!', '', 'Cállate , ¡nunca serás el hombre que es tu madre!', '', ''); +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 (1453, 'taunt', 'Your mother was a hampster and your father smelt of elderberries!!!!', 0, 0, '', 'Ta mère était un hamster et ton père sentait la myrtille!!!!', 'Deine Mutter war ein Hamster und dein Vater roch nach Holunderbeeren!!!!', '你妈是只仓鼠,你爸身上一股接骨木浆果味儿!!!!', '', 'Tu madre era un hámster y tu padre olía a bayas de saúco!!!!', '', 'Твоя мать была хомяком, а отец пах одуванчиками!!!!'); +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 (1454, 'taunt', 'I don’t want to talk to you no more, you empty headed animal food trough wiper!!!', 0, 0, '', 'Je ne veux plus te parler, espèce de chiffon mangeur de nourriture pour animaux!!!', 'Ich will nicht mehr mit dir reden, du hohlköpfiger Tierfuttertrog-Wischer!!!', '我不想再跟你废话了,你个脑子空空的喂牲口槽的废物!!!', '', '¡¡No quiero hablar más contigo, limpiaparabrisas de cabeza vacía!', '', ''); +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 (1455, 'taunt', 'I fart in your general direction!!!', 0, 0, '', 'Je te pète à la figure !!!', 'Ich pupse in deine allgemeine Richtung!!!', '我朝你大方向放了个屁!!!', '', '¡¡Me tiro un pedo en tu dirección general!!!', '', 'Я пускаю в твою сторону газы!!!'); +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 (1456, 'taunt', 'Go and boil your bottom, you son of a silly person!!!', 0, 0, '', 'Va faire bouillir ton derrière, espèce de fils d’une personne stupide !!!', 'Geh kacken du Vollidiot', '去把你屁股煮熟吧,你个傻子的崽!!!', '', '¡Ve y hierve tu trasero, hijo de una persona tonta!', '', 'Иди и вскипяти свою задницу, сын смешного человека!!!'); +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 (1457, 'taunt', 'What are you going to do , bleed on me? HAVE AT YOU!', 0, 0, '', 'Que comptes-tu faire, , me saigner dessus ? VIENS TE BATTRE !', 'Was willst du tun, , mich bluten lassen? Viel Spaß!', '你能拿我咋样,,往我身上淌血吗?来干一架吧!', '', '¿Qué vas a hacer , llorar?', '', 'Что ты собираешься делать, , заставить меня кровоточить? ВПЕРЁД!'); +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 (1458, 'taunt', 'M-O-O-N! That spells aggro!', 0, 0, '', 'M-O-O-N! Ça, ça annonce des ennuis!', 'M-O-O-N! Das bedeutet Ärger!', 'M-O-O-N!这就意味着开打!', '', '¡LUNA! ¡Eso deletrea agresividad!', '', 'М-О-О-Н! Это значит агр!'); +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 (1459, 'taunt', 'You’re about as useful as a one-legged man in an ass kicking contest.', 0, 0, '', 'You know, tu es aussi utile qu’un homme à une jambe dans un concours de coups de pied aux fesses.', 'Du bist so nützlich wie ein einbeiniger Mann in einem Arschtritt-Wettbewerb.', '你这人跟独腿男参加踢屁股比赛一样没用。', '', 'Eres tan útil como un hombre con una sola pierna en un concurso de patadas en el culo.', '', ''); +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 (1460, 'taunt', 'Hey ! Stop hitting on them, they’re not your type. They aren’t inflatable.', 0, 0, '', 'Hé ! Arrête d’essayer de les draguer, Elles ne sont pas de ton style. Elles ne sont pas gonflables.', 'Hey ! Hör auf, sie anzubaggern, die sind nicht dein Typ. Die sind nicht aufblasbar.', '嘿,!别再勾搭了,人家不是你那款,不是充气娃娃。', '', '¡Oye, ! Deja de coquetear con ellos, no son tu tipo. No son inflables.', '', ''); +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 (1461, 'taunt', ' you’re so far outta your league, you’re playing a different sport.', 0, 0, '', ' tu es tellement dépassé, tu joues à un autre sport.', ', du bist so weit aus deiner Liga, du spielst eine ganz andere Sportart.', ',你完全不是一个量级的,简直在玩不同的运动。', '', ' estás tan lejos de tu liga, estás jugando un deporte diferente.', '', ''); +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 (1462, 'taunt', 'You made a big mistake today , you got out of bed.', 0, 0, '', ', tu as commis une grosse erreur aujourd’hui en sortant du lit.', ', du hast heute einen großen Fehler gemacht, du bist aus dem Bett gestiegen.', '你今天犯了大错,,你不该起床的。', '', 'Cometiste un gran error hoy , te levantaste de la cama.', '', 'Ты сегодня совершил большую ошибку, , ты встал с кровати.'); +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 (1463, 'taunt', 'I wanna try turning into a horse, but I need help. I’ll be the front, you be yourself.', 0, 0, '', 'Je veux essayer de me transformer en cheval, mais j’ai besoin d’aide. Tu seras à l’avant, et je serai juste moi-même.', 'Ich will versuchen, mich in ein Pferd zu verwandeln, aber ich brauche Hilfe. Ich bin die Vorderseite und du bleibst du selbst.', '我想试试变身成马,但需要帮忙。我来当前面,你就做你自己吧。', '', 'Quiero intentar convertirme en un caballo, pero necesito ayuda. Yo seré el frente, tú mismo.', '', ''); +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 (1464, 'taunt', 'Can I borrow your face for a few days? My ass is going on holiday....', 0, 0, '', 'Je peux emprunter ton visage pendant quelques jours ? Mon derrière part en vacances...', 'Kann ich dein Gesicht für ein paar Tage leihen? Mein Hintern macht Urlaub...', '能借你的脸用几天吗?我的屁股要去度假……', '', '¿Me prestas tu cara por unos días? Mi culo se va de vacaciones...', '', 'Можно я одолжу твоё лицо на пару дней? Моя задница уходит в отпуск....'); +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 (1465, 'taunt', 'I’d like to give you a going away present... First you do your part.', 0, 0, '', 'Je voudrais te donner un cadeau d’au revoir... Tout d’abord, toi tu fais ta part.', 'Ich würde dir gerne ein Abschiedsgeschenk machen... aber Zuerst machst du deinen Teil.', '我想送你个临别礼物……先干好你的份内事吧。', '', 'Me gustaría darte un regalo de despedida... Primero haz tu parte.', '', ''); +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 (1466, 'taunt', 'Before you came along we were hungry, Now we’re just fed up.', 0, 0, '', 'Avant ton arrivée, on avait faim. Maintenant, on en a juste assez.', 'Bevor du kamst, hatten wir Hunger. Jetzt ist uns schlecht.', '你来之前我们还饿着肚子,现在都快被你气饱了。', '', 'Antes de que llegaras teníamos hambre, ahora estamos hartos', '', ''); +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 (1467, 'taunt', 'I like you. People say I have no taste, but I like you.', 0, 0, '', 'Je t’aime bien. Les gens disent que je n’ai pas de goût, mais je t’aime bien.', 'Ich mag dich. Die Leute sagen, ich hätte keinen Geschmack, aber ich mag dich.', '我挺喜欢你的。别人都说我没品,但我就是喜欢你。', '', 'Me gustas. La gente dice que no tengo gusto, pero me gustas.', '', 'Ты мне нравишься. Говорят, у меня нет вкуса, но ты мне нравишься.'); +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 (1468, 'taunt', 'I think you have an inferiority complex, but that’s okay, it’s justified.', 0, 0, '', 'Je pense que tu as un complexe d’infériorité, mais il n’y a pas de problème, c’est justifié.', 'Ich glaube, du hast einen Minderwertigkeitskomplex, aber das ist okay, der ist berechtigt.', '我觉得你有自卑情结,不过没关系,这情结挺合理。', '', 'Creo que tienes complejo de inferioridad, pero está bien, está justificado', '', ''); +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 (1469, 'taunt', 'Hence rotten thing! Or I shall shake thy bones out of thy garments.', 0, 0, '', 'Miserable vermine! Sinon, je vais te secouer jusqu’à ce que tes os sortent de tes vêtements.', 'Fort mit dir, du faules Ding! Oder ich werde deine Gebeine aus deinen Kleidern schütteln.', '滚吧,臭东西!不然我把你骨头从衣服里抖出来!', '', '¡Por lo tanto, cosa podrida! o te sacudiré los huesos de las vestiduras.', '', 'Прочь, гнилое создание! Или я вытрясу твои кости из одежды.'); +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 (1470, 'taunt', 'I can’t believe I’m wasting my time with you!', 0, 0, '', 'Je n’arrive pas à croire que je perds mon temps avec toi!', 'Ich kann nicht glauben, dass ich meine Zeit mit dir verschwende!', '我真不敢相信我在你身上浪费时间!', '', '¡No puedo creer que estoy perdiendo el tiempo contigo!', '', ''); +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 (1471, 'taunt', 'I love it when someone insults me, it means I don’t have to be nice anymore.', 0, 0, '', 'j’adore quand quelqu’un m’insulte, ça veut dire que je n’ai plus besoin d’être gentil.', 'Ich liebe es, wenn mich jemand beleidigt. Das bedeutet, dass ich nicht mehr nett sein muss.', '我喜欢被人骂,这意味着我再也不用装客气了。', '', 'Me encanta cuando alguien me insulta, significa que ya no tengo que ser amable', '', ''); +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 (1472, 'taunt', 'Thou leathern-jerkin, crystal-button, knot-pated, agatering, puke-stocking, caddis-garter, smooth-tongue, Spanish pouch!', 0, 0, '', 'Whoo, ça va swinguer, toi en ta peau de cuir, tes boutons de cristal, ton crâne noueux, tes chausses de vomi, tes jarretières en galon, ta langue de miel, et ta bourse espagnole !', 'Du Lederwams, Kristallknopf, Knotenpflaster, Achatring, Kotzstrumpf, Köcherfliegen-Strumpfband, Glattzunge, spanischer Beutel!', '你个皮夹克、水晶扣、脑壳疙瘩、玛瑙戒、呕吐袜、粗布吊带、油嘴滑舌、西班牙钱袋!', '', '¡Tú, jubón de cuero, botón de cristal, anudado, ágata, medias de vómito, liga de caddis, lengua suave, bolsa española!', '', 'Ты кожаный-жилет, хрустальная пуговица, узловатый, агатовый, рвотный чулок, ленточный подвязочник, гладкоязычный, испанский кошелёк!'); +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 (1473, 'taunt', 'Thou qualling bat-fowling malt-worm!', 0, 0, '', 'Espèce de vermine chauve-souris qui infeste l’orge maltée!', 'Du quälender Fledermausvogel-Malzwurm!', '你个令人作呕的蝙蝠猎手麦芽虫!', '', '¡Tú, gusano de malta cazador de murciélagos!', '', 'Ты дрожащий ловец летучих мышей, пивной червь!'); +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 (1474, 'taunt', 'Thou art truely an idol of idiot-worshippers!', 0, 0, '', 'Tu es vraiment l’idole des adorateurs d’idiots!', 'Du bist wahrlich das Idol der Idiotenanbeter!', '你真是白痴崇拜者的偶像!', '', '¡Eres verdaderamente un ídolo de los adoradores de idiotas!', '', 'Ты действительно идол поклонников идиотов!'); +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 (1475, 'taunt', 'Thou misbegotten knotty-pated wagtail!', 0, 0, '', 'Espèce de galopin au cerveau embrouillé!', 'Du missratene, knotige Bachstelze!', '你个天生脑壳疙瘩的摇尾小鸟!', '', '¡Maldito lavandero nudoso!', '', 'Ты ублюдочный узловатый хвостун!'); +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 (1476, 'taunt', 'Thou whoreson mandrake, thou art fitter to be worn in my cap than to wait at my heels!', 0, 0, '', '', 'Du Hurensohn Alraune, es ist besser für dich, in meiner Mütze getragen zu werden, als hinter mir zu lauern!', '你个曼陀罗贱种,戴在我帽子上都比跟在我脚后跟合适!', '', '¡Hijo de puta mandrágora, eres mejor para que te lleve en mi gorra que para que me pise los talones!', '', 'Ты, ублюдочный мандрагор, тебе больше подходит быть у меня на шапке, чем ждать у моих пяток!'); +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 (1477, 'taunt', 'You! You scullion! You rampallian! You fustilarian! I’ll tickle your catastrophe!', 0, 0, '', 'Toi! Toi l’écuyer! Toi le gredin! Toi le vaurien! Je vais titiller ta catastrophe!', 'Du! Du Küchenjunge! Du Randalierer! Du Fäustling! Ich werde eine Katastrophe auslösen!', '你!下贱厨子!无赖!废物!我来挠挠你的倒霉事!', '', '¡Tú! ¡Scullion! ¡Ramaliano! ¡Fustilarista! ¡Te haré cosquillas en tu catástrofe!', '', ''); +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 (1478, 'taunt', 'Oh ! Thou infectious ill-nurtured flax-wench!', 0, 0, '', 'Oh ! Toi, vilaine lavandière malveillante et infecte!', 'Oh ! Du ansteckendes, schlecht gepflegtes Flachsweib!', '哦,!你个恶毒又传染的亚麻贱女!', '', '¡Oh, ! ¡Tú, contagiosa moza del lino mal educada!', '', 'О, ! Ты заразная, плохо воспитанная льняная девка!'); +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 (1479, 'taunt', 'We leak in your chimney, !', 0, 0, '', 'On fuit dans ta cheminée, !', 'Wir haben ein Leck in deinem Schornstein, !', '我们在你烟囱里漏水了,!', '', '¡Tenemos una fuga en tu chimenea, !', '', 'Мы протекаем в твоей трубе, !'); +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 (1480, 'taunt', 'Oh thou bootless fen-sucked canker-blossom!', 0, 0, '', 'Oh mon impuissant aspiré par les marais, fleur de chancre!', 'Oh du nutzlose, vom Moor ausgesaugte Krebsblüte!', '哦,你个无用的沼泽吸血疮花!', '', '¡Oh tú, flor de cancro chupada por el pantano sin botas!', '', 'О, ты бесполезный болотный цветок!'); +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 (1481, 'taunt', 'Were I like thee I’d throw away myself!', 0, 0, '', 'Si j’étais comme toi, je me jetterais en l’air !', 'Wäre ich wie du, würde ich mich selbst wegwerfen!', '如果我像你一样,我早就把自己扔了!', '', '¡Si yo fuera como tú, me tiraría a la basura!', '', ''); +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 (1482, 'taunt', 'O teach me , how I should forget to think!', 0, 0, '', 'Oh, enseigne-moi, , comment oublier de trop réfléchir!', 'O lehre mich, wie ich vergessen kann zu Denken!', '哦,教教我吧,,怎样才能忘记思考!', '', '¡Oh, enséñame , cómo debo olvidarme de pensar!', '', 'Научи меня, , как забыть думать!'); +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 (1483, 'taunt', 'Truly thou art damned, like an ill-roasted egg, all on one side!', 0, 0, '', 'Franchement, tu es foutu, comme un œuf mal cuit, tout d’un côté!', 'Wahrlich, du bist verdammt, wie ein schlecht gebratenes Ei, alles auf einer Seite!', '你真该死,就像个烤坏的蛋,全都焦在一边!', '', '¡Verdaderamente estás condenado, como un huevo mal asado, todo de un lado!', '', 'Истинно, ты проклят, как плохо прожаренное яйцо, с одной стороны!'); +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 (1484, 'taunt', 'You starvelling, you eel-skin, you dried neat’s-tongue, you bull’s-pizzle, you stock-fish- O for breath to utter what is like thee!! -you tailor’s-yard, you sheath, you bow-case, you vile standing tuck!', 0, 0, '', '', 'Du Verhungernder, du Aalhaut, du vertrocknete Rinderzunge, du Ochsenziemer, du Stockfisch – oh, hätte ich Atem, um auszusprechen, was dir gleicht!! – du Schneiderlein, du Schwertscheide, du Bogenfutteral, du schäbiges Stehaufmännchen!', '你个饿殍、鳗鱼皮、干瘪牛舌、公牛鞭、腌鱼——哦,我要是有气力说出跟你有多像就好了!——你个裁缝尺、剑鞘、弓套、卑劣的站立家伙!', '', 'Estás muerto de hambre, piel de anguila, te secaste la lengua limpiamente, toro-pizzle, pescado-O para respirar pronunciar lo que es como tú !! ¡Tú, sastrería, vaina, estuche de arco, vil flaco de pie!', '', ''); +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 (1485, 'taunt', 'Fie! Drop thee into the rotten mouth of Death!', 0, 0, '', 'Que le diable t’emporte dans la gueule pourrie de la Mort!', 'Pfui! Wirf dich in den faulen Rachen des Todes!', '呸!掉进死亡的腐烂大嘴去吧!', '', '¡Fie! ¡Déjate caer en la podrida boca de la Muerte!', '', 'Фу! Брось себя в гнилую пасть Смерти!'); +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 (1486, 'taunt', ', you are a fishmonger!', 0, 0, '', ', tu es poissonnier!', ', du bist ein Fischhändler!', ',你就是个卖鱼的!', '', ', ¡eres un pescadero!', '', ', ты торговец рыбой!'); +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 (1487, 'taunt', 'I shall live to knock thy brains out!', 0, 0, '', 'Je vivrai pour te cogner le cerveau!', 'Ich lebe, um dir den Schädel einzuschlagen!', '我会活着把你的脑浆打出来!', '', '¡Viviré para romperte los sesos!', '', 'Я доживу, чтобы выбить тебе мозги!'); +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 (1488, 'taunt', 'Most shallow are you, !! Thou art worms-meat in respect of a good piece of flesh, indeed!!', 0, 0, '', 'Comme tu es superficiel !! Tu n’es que de la chair à vers comparé à un bon morceau de viande, en effet!!', 'Du bist wirklich sehr oberflächlich, !! Im Vergleich zu einem guten Stück Fleisch bist du wahrlich Wurmversäuchtes Fleisch!!', '你真肤浅,!!跟一块好肉比,你就是个虫子啃的货,的确如此!!', '', '¡¡Eres el más superficial, !! ¡Eres carne de gusano con respecto a un buen trozo de carne, de hecho!', '', 'Ты очень поверхностен, !! Ты корм для червей по сравнению с хорошим куском мяса!!'); +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 (1489, 'taunt', 'Vile wretch! O , thou odiferous hell-hated pignut!', 0, 0, '', 'Misérable vermine! Ô , toi l’infâme pignouf puant des enfers!', 'Abscheulicher Schurke! O , du stinkender, höllisch verhasster Schweinshund!', '卑劣的混蛋!哦,,你个地狱厌弃的臭猪头!', '', '¡Miserable vil! ¡Oh, , fétido cerdo odiado por el infierno!', '', 'Подлый негодяй! О, , ты зловонный, ненавистный к свиньям орех!'); +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 (1490, 'taunt', '! Thy kiss is as comfortless as frozen water to a starved snake!', 0, 0, '', '! Ton baiser est aussi réconfortant que de l’eau gelée pour un serpent affamé!', '! Dein Kuss ist für eine ausgehungerte Schlange so trostlos wie gefrorenes Wasser!', '!你的吻就像给一条饿蛇喂冰水一样毫无安慰!', '', '! ¡Tu beso es tan desconsolador como el agua helada para una serpiente hambrienta!', '', '! Твой поцелуй так же утешителен, как замёрзшая вода для голодной змеи!'); +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 (1491, 'taunt', 'I scorn you, scurvy companion. What, you poor, base, rascally, cheating, lack-linen mate! Away, you moldy rogue, away!', 0, 0, '', 'Je vous méprise, misérable compagnon. Quoi, toi, pauvre, vil, scélérat, tricheur, compagnon usé de toile! Déguerpisse, espèce de coquin moisissure, déguerpisse!', 'Ich verachte dich, schäbiger Geselle. Was, du armer, gemeiner, schurkischer, betrügerischer, leinenloser Kumpel? Weg, du schimmeliger Schurke, weg!', '我鄙视你,卑劣的家伙。什么,你个穷酸、下贱、无赖、骗子、破布般的同伴!滚吧,你个发霉的混账,滚!', '', 'Te desprecio, compañero escorbuto. ¡Qué, pobre, vil, pícaro, tramposo, compañero falto de lino! ¡Fuera, mohoso granuja, fuera!', '', 'Я презираю тебя, паршивый спутник. Что, ты бедный, низкий, мошеннический, безрубашечный приятель! Прочь, ты плесневелый негодяй, прочь!'); +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 (1492, 'taunt', 'Out of my sight! Thou dost infect my eyes !', 0, 0, '', 'Hors de ma vue! Tu infectes mes yeux !', 'Aus meinen Augen! Du infizierst meine Augen !', '从我眼前消失!你污染了我的眼睛,!', '', '¡Fuera de mi vista! ¡Me infectas los ojos !', '', 'Прочь с глаз моих! Ты заражаешь мои глаза, !'); +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 (1493, 'taunt', 'PLAY TIME!!!!', 0, 0, '', 'L’HEURE DE LA MORT !', 'SPIELZEIT!!!', '开战时间!!!!', '', '¡¡¡HORA DE JUGAR!!!!', '', 'ВРЕМЯ ИГРЫ!!!!'); +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 (1494, 'taunt', 'None shall pass!', 0, 0, '', 'Vous ne passerez pas !', 'Keiner kommt durch!', '谁也别想通过!', '', '¡Ninguno pasará!', '', 'Никто не пройдёт!'); +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 (1495, 'taunt', 'We’re under attack! A vast, ye swabs! Repel the invaders!', 0, 0, '', 'Nous sommes attaqués! Visez bien, bande de moussaillons! Repoussez les envahisseurs!', 'Wir werden angegriffen! Ein gewaltiger Angriff, ihr Wichser! Schlagt die Eindringlinge zurück!', '我们遭到攻击!一大波敌人,蠢货们!击退入侵者!', '', '¡Estamos bajo ataque! ¡Un vasto, hisopos! ¡Repeler a los invasores!', '', ''); +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 (1496, 'taunt', 'None may challenge the Brotherhood!', 0, 0, '', 'Personne ne peut défier la Confrérie!', 'Niemand darf die Bruderschaft herausfordern!', '没人能挑战兄弟会!', '', '¡Nadie puede desafiar a la Hermandad!', '', 'Никто не может бросить вызов Братству!'); +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 (1497, 'taunt', 'Foolsss...Kill the one in the dress!', 0, 0, '', 'Imbéciles... Tuez celui en robe!', 'Narren ... bringt die in den Kleidern um!', '蠢货们……干掉那个穿长袍的!', '', 'Tontosss... ¡Matad al del vestido!', '', 'Дураки... Убейте того, кто в платье!'); +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 (1498, 'taunt', 'I’ll feed your soul to Hakkar himself! ', 0, 0, '', 'Je vais nourrir ton âme à Hakkar lui-même!', 'Ich werde Hakkar persönlich mit deiner Seele füttern!', '我会把你的灵魂喂给哈卡本人!', '', '¡Le daré de comer con tu alma al mismísimo Hakkar! ', '', ''); +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 (1499, 'taunt', 'Pride heralds the end of your world! Come, mortals! Face the wrath of the !', 0, 0, '', ' m’apporte une grande fierté! Venez, mortels ! Affrontez la colère de !', 'Stolz läutet das Ende eurer Welt ein! Kommt, Sterbliche! Stellt euch dem Zorn der !', '骄傲预示着你们世界的终结!来吧,凡人!面对的怒火!', '', '¡El orgullo anuncia el fin de tu mundo! ¡Venid, mortales! ¡Enfréntate a la ira de la !', '', 'Гордость предвещает конец вашего мира! Идите, смертные! Столкнитесь с гневом !'); +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 (1500, 'taunt', 'All my plans have led to this!', 0, 0, '', 'Tous mes projets ont mené à cela!', 'Alle meine Pläne haben hierher geführt!', '我所有的计划都指向这一刻!', '', '¡Todos mis planes me han llevado a esto!', '', 'Все мои планы привели к этому!'); +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 (1501, 'taunt', 'Ahh! More lambs to the slaughter!', 0, 0, '', 'Oh non! Encore des agneaux pour l’abattoir!', 'Ahh! Noch mehr Lämmer zur Schlachtbank!', '啊哈!又有羔羊来送死了!', '', '¡Ahh! ¡Más corderos al matadero!', '', 'Ах! Еще ягнята на заклание!'); +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 (1502, 'taunt', 'Another day, another glorious battle!', 0, 0, '', 'Une autre journée, une autre bataille glorieuse !', 'Ein neuer Tag, eine neue glorreiche Schlacht!', '又是新的一天,又是一场光荣的战斗!', '', '¡Otro día, otra batalla gloriosa!', '', 'Еще один день, еще одна славная битва!'); +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 (1503, 'taunt', 'So, business... or pleasure?', 0, 0, '', 'Alors, affaires... ou plaisir ?', 'Also, geschäftlich … oder privat?', '那么,是公事……还是私事?', '', 'Entonces, ¿negocios... o placer?', '', 'Итак, дело... или удовольствие?'); +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 (1504, 'taunt', 'You are not prepared!', 0, 0, '', 'Tu n’es pas prêt!', 'Du bist nicht vorbereitet!', '你们还没准备好!', '', '¡No estás preparado!', '', 'Вы не готовы!'); +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 (1505, 'taunt', 'The ’s final conquest has begun! Once again the subjugation of this world is within our grasp. Let none survive! ', 0, 0, '', 'La dernière conquête de a commencé! Encore une fois, la soumission de ce monde est à portée de main. Que personne ne survive!', 'Die letzte Eroberung der hat begonnen! Erneut liegt die Unterwerfung dieser Welt in unserer Hand. Lasst niemanden überleben!', '的最终征服开始了!这个世界的臣服再次近在咫尺,一个也别想活!', '', '¡La conquista final de ha comenzado! Una vez más, la subyugación de este mundo está a nuestro alcance. ¡Que nadie sobreviva! ', '', ''); +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 (1506, 'taunt', 'Your death will be a painful one. ', 0, 0, '', 'Ta mort sera une douloureuse.', 'Dein Tod wird schmerzhaft sein.', '你的死会非常痛苦。', '', 'Tu muerte será dolorosa. ', '', 'Ваша смерть будет болезненной.'); +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 (1507, 'taunt', 'Cry for mercy! Your meaningless lives will soon be forfeit. ', 0, 0, '', 'Pleurez miséricorde! Vos vies insignifiantes seront bientôt perdues.', 'Fleht um Gnade! Eure bedeutungslosen Leben werden bald enden.', '求饶吧!你们无意义的生命马上就要终结了。', '', '¡Llora por piedad! Sus vidas sin sentido pronto se perderán. ', '', 'Просите о милости! Ваши бессмысленные жизни скоро будут потеряны.'); +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 (1508, 'taunt', 'Abandon all hope! The has returned to finish what was begun so many years ago. This time there will be no escape! ', 0, 0, '', 'Abandonne tout espoir! La est de retour pour finir ce qui a été commencé il y a tant d’années. Cette fois, il n’y aura pas d’échappatoire!', 'Gebt alle Hoffnung auf! Die ist zurückgekehrt, um zu beenden, was vor so vielen Jahren begonnen wurde. Dieses Mal gibt es kein Entkommen!', '放弃所有希望吧!回来了,要完成多年前未竟的事业。这次,你们无处可逃!', '', '¡Abandona toda esperanza! La ha regresado para terminar lo que comenzó hace tantos años. ¡Esta vez no habrá escapatoria! ', '', 'Оставьте все надежды! вернулся, чтобы завершить то, что было начато много лет назад. На этот раз не будет побега!'); +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 (1509, 'taunt', 'Alert! You are marked for Extermination! ', 0, 0, '', 'Alerte ! Vous êtes désigné pour extermination !', 'Alarm! Du bist zur Auslöschung markiert!', '警报!你们被标记为清除目标!', '', '¡Alerta! ¡Estás marcado para el exterminio! ', '', 'Внимание! Вы помечены для уничтожения!'); +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 (1510, 'taunt', 'The is for guests only...', 0, 0, '', 'Le est réservé aux invités uniquement...', 'Die ist nur für Gäste...', '仅对访客开放……', '', 'La es solo para invitados...', '', ' предназначена только для гостей...'); +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 (1511, 'taunt', 'Ha ha ha! You are hopelessly outmatched!', 0, 0, '', 'Ha ha ha! Tu es totalement dépassé!', 'Ha ha ha! Du bist hoffnungslos unterlegen!', '哈哈哈!你们完全不是对手!', '', '¡Ja, ja, ja! ¡Estás irremediablemente superado!', '', 'Ха-ха-ха! Вы безнадежно не на уровне!'); +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 (1512, 'taunt', 'I will crush your delusions of grandeur! ', 0, 0, '', 'Je vais briser tes illusions de grandeur!', 'Ich werde deinen Größenwahn zerschmettern!', '我会粉碎你自大的幻想!', '', '¡Aplastaré tus delirios de grandeza! ', '', 'Я сокрушу ваши иллюзии величия!'); +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 (1513, 'taunt', 'Forgive me, for you are about to lose the game.', 0, 0, '', 'Pardonnez-moi, mais vous êtes sur le point de perdre la partie.', 'Verzeih mir, aber du wirst dieses Spiel verlieren.', '原谅我,因为你们马上就要输了。', '', 'Perdóname, porque estás a punto de perder el juego.', '', 'Простите меня, ведь вы собираетесь проиграть игру.'); +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 (1514, 'taunt', 'Struggling only makes it worse.', 0, 0, '', 'Se battre ne fait qu’empirer les choses.', 'Widerstand macht es nur schlimmer.', '挣扎只会让事情变得更糟。', '', 'La lucha solo lo empeora.', '', 'Борьба только усугубляет ситуацию.'); +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 (1515, 'taunt', 'Vermin! Leeches! Take my blood and choke on it!', 0, 0, '', 'Créatures immondes ! Sangsues ! Prenez mon sang et étouffez-y !', 'Ungeziefer! Blutegel! Nehmt mein Blut und erstickt daran!', '害虫!吸血鬼!喝我的血,噎死你们!', '', '¡Alimañas! ¡Sanguijuelas! ¡Toma mi sangre y atragantate con ella!', '', 'Паразиты! Пиявки! Берите мою кровь и подавитесь ею!'); +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 (1516, 'taunt', 'Not again... NOT AGAIN!', 0, 0, '', 'Pas encore... PAS ENCORE !', 'Nicht schon wieder... NICHT SCHON WIEDER!', '别再来了……别再来了!', '', 'No otra vez... ¡NO OTRA VEZ!', '', 'Опять... ЕЩЕ РАЗ!'); +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 (1517, 'taunt', 'My blood will be the end of you!', 0, 0, '', 'Mon sang sera ta fin!', 'Mein Blut wird dein Ende sein!', '我的鲜血将是你的终结!', '', '¡Mi sangre será tu fin!', '', 'Моя кровь станет вашим концом!'); +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 (1518, 'taunt', 'Good, now you fight me!', 0, 0, '', 'Bien, maintenant combat moi !', 'Gut, jetzt kämpfst du gegen mich!', '好极了,现在来跟我打吧!', '', 'Bien, ¡ahora pelea conmigo!', '', 'Хорошо, теперь ты сразишься со мной!'); +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 (1519, 'taunt', 'Get da move on, guards! It be killin’ time!', 0, 0, '', 'Allez, les gardes, on se presse! C’est l’heure de tuer!', 'Los, Wachen! Zeit zu töten!', '快点动起来,卫兵们!是时候大开杀戒了!', '', '¡Muévanse, guardias! ¡Será para matar el tiempo!', '', ''); +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 (1520, 'taunt', 'Don’t be delayin’ your fate. Come to me now. I make your sacrifice quick.', 0, 0, '', 'Ne retarde pas ton destin. Viens à moi maintenant. Je rends ton sacrifice rapide.', 'Verzögere dein Schicksal nicht. Komm jetzt zu mir. Ich mache dein Ende schnell.', '别拖延你的命运。现在过来,我会让你的牺牲快一点。', '', 'No demores tu destino. Ven a mí ahora. Hago que tu sacrificio sea rápido.', '', ''); +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 (1521, 'taunt', 'You be dead soon enough!', 0, 0, '', 'Tu seras bientôt mort !', 'Du wirst bald tot sein!', '你很快就会死翘翘!', '', '¡Estarás muerto lo suficientemente pronto!', '', 'Ты скоро будешь мертв!'); +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 (1522, 'taunt', 'Mua-ha-ha!', 0, 0, '', 'Mua-ha-ha!', 'Mua-ha-ha!', '哇哈哈哈!', '', '¡Mua-ja-ja!', '', 'Муа-ха-ха!'); +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 (1523, 'taunt', 'I be da predator! You da prey...', 0, 0, '', 'Je suis le prédateur! Tu es la proie...', 'Ich bin der Jäger! Du bist die Beute...', '我是猎手!你是猎物……', '', '¡Soy un depredador! Eres presa...', '', 'Я хищник! Ты жертва...'); +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 (1524, 'taunt', 'You gonna leave in pieces!', 0, 0, '', 'Tu vas finir en morceaux !', 'Du wirst diesen Ort in Stücken verlassen!', '你会碎成渣离开这里!', '', '¡Te vas a ir en pedazos!', '', 'Ты уйдешь в кусках!'); +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 (1525, 'taunt', 'Death comes. Will your conscience be clear? ', 0, 0, '', 'La mort arrive. Est-ce que ta conscience sera claire ?', 'Der Tod kommt. hast du ein reines Gewissen?', '死亡降临了。你的良心能安宁吗?', '', 'La muerte llega. ¿Tu conciencia estará limpia? ', '', 'Смерть приходит. Будет ли твоя совесть чиста?'); +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 (1526, 'taunt', 'Your behavior will not be tolerated.', 0, 0, '', 'Votre comportement ne sera pas toléré.', 'Dein Verhalten wird nicht toleriert.', '你的行为不可容忍。', '', 'Tu comportamiento no será tolerado', '', 'Ваше поведение не будет терпимо.'); +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 (1527, 'taunt', 'The Menagerie is for guests only.', 0, 0, '', 'La Ménagerie est réservée aux invités seulement.', 'Die Menagerie ist nur für Gäste.', '展览馆仅对访客开放。', '', 'The Menagerie es solo para invitados', '', 'Менажерия предназначена только для гостей.'); +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 (1528, 'taunt', 'Hmm, unannounced visitors, Preparations must be made... ', 0, 0, '', 'Des visiteurs non annoncés, il me faut faire des préparatifs...', 'Hmm, unangekündigte Besucher, Vorbereitungen müssen getroffen werden...', '嗯,未经通报的访客,必须做好准备……', '', 'Hmm, visitantes inesperados, se deben hacer preparativos... ', '', 'Хмм, незваные гости, нужно подготовиться...'); +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 (1529, 'taunt', 'Hostile entities detected. Threat assessment protocol active. Primary target engaged. Time minus thirty seconds to re-evaluation.', 0, 0, '', 'Entités hostiles détectées. Protocole d’évaluation des menaces activé. Cible principale engagée. Temps moins trente secondes avant réévaluation.', 'Feindliche Einheiten entdeckt. Bedrohungsbewertungsprotokoll aktiv. Primärziel angegriffen. Zeit bis zur Neubewertung: minus dreißig Sekunden.', '侦测到敌对实体。威胁评估协议已激活。主要目标锁定。距离重新评估还有三十秒。', '', 'Entidades hostiles detectadas. Protocolo de evaluación de amenazas activo. Objetivo principal comprometido. Tiempo menos treinta segundos para la reevaluación.', '', 'Обнаружены враждебные сущности. Протокол оценки угрозы активирован. Основная цель захвачена. Время до повторной оценки - тридцать секунд.'); +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 (1530, 'taunt', 'New toys? For me? I promise I won’t break them this time!', 0, 0, '', 'De nouveaux jouets ? Pour moi ? Je te promets que cette fois, je ne les casserai pas !', 'Neue Spielzeuge? Für mich? Ich verspreche, ich werde sie dieses Mal nicht kaputt machen!', '新玩具?给我玩的?我保证这次不会弄坏它们!', '', '¿Juguetes nuevos? ¿Para mi? ¡Te prometo que no los romperé esta vez!', '', ''); +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 (1531, 'taunt', 'I’m ready to play!', 0, 0, '', 'Je suis prêt à jouer !', 'Ich bin bereit zu spielen!', '我准备好玩一玩了!', '', '¡Estoy listo para jugar!', '', ''); +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 (1532, 'taunt', 'Shhh... it will all be over soon.', 0, 0, '', 'Chut... tout sera bientôt fini.', 'Shhh... es wird bald vorbei sein.', '嘘……这一切很快就会结束。', '', 'Shhh... todo terminará pronto.', '', 'Шшш... скоро все закончится.'); +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 (1533, 'taunt', 'Aaaaaughibbrgubugbugrguburgle!', 0, 0, '', 'Aaaaaughibbrgubugbugrguburgle!', 'Aaaaaughibbrgubugbugrguburgle!', '啊啊啊啊咕噜咕噜咕噜咕!', '', '¡Aaaaaughibbrgubugbugrguburgle!', '', 'Ааааагхиббргубугбугрубгл!'); +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 (1534, 'taunt', 'RwlRwlRwlRwl!', 0, 0, '', 'RwlRwlRwlRwl!', 'RwlRwlRwlRwl!', '嗷嗷嗷嗷!', '', 'RwlRwlRwlRwl!', '', 'РвлРвлРвлРвл!'); +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 (1535, 'taunt', 'You too, shall serve!', 0, 0, '', 'Toi aussi, tu serviras !', 'Auch du wirst dienen!', '你也一样,必须效忠!', '', '¡Tú también, debes servir!', '', 'Ты тоже будешь служить!'); +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 (1536, 'taunt', 'Tell me... tell me everything! Naughty secrets! I’ll rip the secrets from your flesh!', 0, 0, '', 'Dis-moi... dis-moi tout ! Les petits secrets coquins ! Je vais arracher les secrets de ta chair !', 'Sag mir... sag mir alles! Schmutzige Geheimnisse! Ich werde dir deine Geheimnisse aus deinem Fleisch reißen!', '告诉我……把一切都告诉我!那些小秘密!我会从你的血肉中撕出真相!', '', 'Cuéntame... ¡cuéntame todo! ¡Secretos traviesos! ¡Arrancaré los secretos de tu carne!', '', ''); +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 (1537, 'taunt', 'Prepare yourselves, the bells have tolled! Shelter your weak, your young and your old! Each of you shall pay the final sum! Cry for mercy, the reckoning has come!', 0, 0, '', 'Préparez-vous, les cloches ont sonné ! Protégez vos faibles, vos jeunes et vos anciens ! Chacun d’entre vous paiera le prix final ! Pleurez miséricorde, l’heure du jugement est arrivée!', 'Bereitet euch vor, die Glocken haben geläutet! Schützt eure Schwachen, eure Jungen und eure Alten! Jeder von euch wird den endgültigen Preis zahlen! Fleht um Gnade, die Abrechnung ist gekommen!', '准备好吧,丧钟已敲响!保护你们的弱者、孩子和老人!你们每个人都将付出最终代价!哭求怜悯吧,清算时刻到了!', '', '¡Prepárense, las campanas han doblado! ¡Abriga a tus débiles, a tus jóvenes ya tus viejos! ¡Cada uno de ustedes pagará la suma final! Clama por misericordia, el ajuste de cuentas ha llegado!', '', 'Приготовьтесь, колокола прозвучали! Укройте своих слабых, молодых и старых! Каждый из вас заплатит окончательную цену! Просите о милости, расплата пришла!'); +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 (1538, 'taunt', 'Where in Bonzo’s brass buttons am I?', 0, 0, '', 'Où diable suis-je?', 'Wo zur Hölle bin ich?', '我到底在邦佐的黄铜扣子哪里?', '', '¿Dónde estoy en los botones de latón de Bonzo?', '', ''); +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 (1539, 'taunt', 'I can bear it no longer! Goblin King! Goblin King! Wherever you may be! Take this far away from me!', 0, 0, '', 'Je n’en peux plus! Roi des Gobelins! Roi des Gobelins! Où que tu sois! Emmène cette %cible% loin de moi!', 'Ich ertrage es nicht mehr! Goblinkönig! Goblinkönig! Wo immer du bist! Nimm diesen weit weg von mir!', '我再也受不了了!地精之王!地精之王!不管你在哪!把这个带离我远点!', '', '¡No puedo soportarlo más! ¡Rey de los duendes! ¡Rey de los duendes! ¡WHERE quiera que estés! ¡Lleva a este lejos de mí!', '', 'Я больше не могу это терпеть! Король гоблинов! Король гоблинов! Где бы ты ни был! Унеси этого далеко от меня!'); +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 (1540, 'taunt', 'You have thirteen hours in which to solve the labyrinth, before your baby brother becomes one of us... forever.', 0, 0, '', 'Tu as treize heures pour résoudre le labyrinthe, avant que ton petit frère ne devienne l’un d’entre nous... pour toujours.', 'Du hast dreizehn Stunden, um das Labyrinth zu lösen, bevor dein kleiner Bruder einer von uns wird... für immer.', '你有十三小时来解开迷宫,否则你的小弟弟将永远成为我们的一员……', '', 'Tienes trece horas para resolver el laberinto, antes de que tu hermanito se convierta en uno de nosotros... para siempre', '', 'У вас есть тринадцать часов, чтобы решить лабиринт, прежде чем ваш младший брат станет одним из нас... навсегда.'); +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 (1541, 'taunt', 'So, the is a piece of cake, is it? Well, let’s see how you deal with this little slice... ', 0, 0, '', 'Alors, la est du gâteau, vous dites? Hmm, voyons comment vous vous en sortez avec cette petite portion...', 'Also, die ist ein Kinderspiel, ja? Nun, sehen wir mal, wie du mit diesem kleinen Stück klarkommst...', '所以,对你来说是小菜一碟,对吧?好吧,看看你怎么应付这小块“蛋糕”……', '', 'Entonces, la es pan comido, ¿verdad? Bueno, veamos cómo lidias con esta pequeña porción... ', '', ''); +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 (1542, 'taunt', 'Back off, I’ll take you on, headstrong to take on anyone, I know that you are wrong, and this is not where you belong', 0, 0, '', 'Alors, recule, je vais m’occuper de toi, déterminé à affronter n’importe qui, je sais que tu as tort, et ce n’est pas là que tu appartiens', 'Zurück, ich nehme dich auf, entschlossen, es mit jedem aufzunehmen, ich weiß, dass du falsch liegst, und das ist nicht der Ort, an den du gehörst', '退后,我来对付你,胆大包天敢挑战任何人,我知道你错了,这里不是你该来的地方', '', 'Atrás, te enfrentaré, testarudo para enfrentar a cualquiera, sé que estás equivocado, y este no es el lugar al que perteneces', '', ''); +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 (1543, 'taunt', 'Show me whatcha got!', 0, 0, '', 'Montre-moi ce que t’as dans le ventre!', 'Zeig mir, was du drauf hast!', '让我瞧瞧你有啥能耐!', '', '¡Muéstrame lo que tienes!', '', 'Покажи, что у тебя есть!'); +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 (1544, 'taunt', 'To the death!', 0, 0, '', '% Sorry, I can’t translate that.', 'Bis zum Tod!', '决一死战!', '', '¡Hasta la muerte!', '', 'До смерти!'); +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 (1545, 'taunt', 'Twin blade action, for a clean close shave every time.', 0, 0, '', 'Lame jumelle, pour un rasage de près impeccable à chaque fois.', 'Doppelklingenaktion, für eine saubere Rasur jedes Mal.', '双刃出击,每次都能干净利落!', '', 'Acción de cuchilla doble, para un afeitado limpio y apurado en todo momento.', '', 'Двойное лезвие, для чистого бритья каждый раз.'); +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 (1546, 'taunt', 'Bring it on!', 0, 0, '', 'Allez, viens ici !', 'Los geht’s!', '来吧!', '', '¡Adelante!', '', 'Давай!'); +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 (1547, 'taunt', 'You’re goin’ down!', 0, 0, '', 'Tu vas tomber !', 'Du gehst unter!', '你死定了!', '', '¡Vas a caer!', '', ''); +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 (1548, 'taunt', 'Stabby stab stab!', 0, 0, '', 'Stabby stab stab!', 'Stech, stech, stech!', '刺刺刺!', '', '¡Puñalada puñalada puñalada!', '', 'Ударь, ударь, ударь!'); +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 (1549, 'taunt', 'Let’s get this over quick, time is mana.', 0, 0, '', 'Finissons-en vite , le temps c’est du mana.', 'Lass uns das schnell beenden, Zeit ist Mana.', '咱们速战速决,时间就是魔法!', '', 'Terminemos con esto rápido, el tiempo es maná.', '', ''); +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 (1550, 'taunt', 'I do not think you realise the gravity of your situation.', 0, 0, '', 'Tu ne réalise pas encore la gravité de ta situation.', 'Ich glaube nicht, dass du die Schwere deiner Lage begreifst.', '我想你还没意识到你处境的严重性。', '', 'No creo que te des cuenta de la gravedad de tu situación.', '', 'Я не думаю, что вы осознаете серьезность вашей ситуации.'); +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 (1551, 'taunt', 'I will bring honor to my family and my kingdom!', 0, 0, '', 'Je vais apporter honneur à ma famille et à mon royaume!', 'Ich werde meiner Familie und meinem Königreich Ehre bringen!', '我会为我的家族和王国带来荣耀!', '', '¡Llevaré honor a mi familia y mi reino!', '', 'Я принесу честь своей семье и своему королевству!'); +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 (1552, 'taunt', 'Light, give me strength!', 0, 0, '', 'Lumière, donne-moi de la force!', 'Licht, gib mir Kraft!', '圣光,赐予我力量!', '', '¡Luz, dame fuerza!', '', 'Свет, дай мне силу!'); +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 (1553, 'taunt', 'My church is the field of battle - time to worship...', 0, 0, '', 'Mon terrain de bataille, c’est mon église - il est temps de rendre hommage...', 'Das Schlachtfeld ist meine Kirche - Zeit für die Anbetung...', '战场就是我的教堂——是时候膜拜了……', '', 'Mi iglesia es el campo de batalla - hora de adorar...', '', 'Моя церковь - это поле битвы - время поклоняться...'); +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 (1554, 'taunt', 'I hold you in contempt...', 0, 0, '', 'Je te méprise...', 'Ich verachte dich...', '我鄙视你……', '', 'Te tengo en desacato...', '', 'Я держу тебя в презрении...'); +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 (1555, 'taunt', 'Face the hammer of justice!', 0, 0, '', 'Affronte le marteau de la justice!', 'Stell dich dem Hammer der Gerechtigkeit!', '面对正义之锤吧!', '', '¡Enfréntate al martillo de la justicia!', '', 'Столкнись с молотом справедливости!'); +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 (1556, 'taunt', 'Prove your worth in the test of arms under the Light!', 0, 0, '', 'Prouve ta valeur dans le test des armes sous la Lumière!', 'Beweise deinen Wert in der Prüfung der Waffen unter dem Licht!', '在圣光的见证下证明你的武艺价值!', '', '¡Demuestra tu valía en la prueba de las armas bajo la Luz!', '', 'Докажи свою ценность в испытании оружием под Светом!'); +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 (1557, 'taunt', 'All must fall before the might and right of my cause, you shall be next!', 0, 0, '', 'Tous doivent tomber devant la puissance et la justesse de ma cause, tu seras le prochain!', 'Alle müssen vor der Macht und dem Recht meiner Sache fallen, du bist der Nächste!', '所有人都将在我的正义与力量前倒下,你就是下一个!', '', 'Todo debe caer ante el poder y el derecho de mi causa, ¡tú serás el próximo!', '', 'Все должны пасть перед могуществом и правом моего дела, ты будешь следующим!'); +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 (1558, 'taunt', 'Prepare to die!', 0, 0, '', 'Prépare-toi à mourir!', 'Mach dich bereit zu sterben!', '准备受死吧!', '', '¡Prepárate para morir!', '', 'Приготовься умереть!'); +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 (1559, 'taunt', 'The beast with me is nothing compared to the beast within...', 0, 0, '', 'La bête qui est avec moi n’est rien comparée à la bête qui est en moi...', 'Die Bestie an meiner Seite ist nichts im Vergleich zur Bestie in mir...', '我身边的野兽与我内心的猛兽相比简直不值一提……', '', 'La bestia conmigo no es nada comparada con la bestia interior...', '', 'Зверь со мной ничто по сравнению с зверем внутри...'); +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 (1560, 'taunt', 'Witness the firepower of this fully armed huntsman!', 0, 0, '', 'Découvrez la puissance de feu de ce chasseur entièrement armé!', 'Erlebe die Feuerkraft dieses voll bewaffneten Jägers!', '见识一下全副武装猎人的火力吧!', '', '¡Sea testigo de la potencia de fuego de este cazador completamente armado!', '', 'Стань свидетелем огневой мощи этого полностью вооруженного охотника!'); + +-- combat events +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 (1561, 'critical health', 'Heal me! Quick!', 0, 0, '', 'Je vais te soigner tout de suite !', 'Heil mich! Schnell!', '快治疗我!快点!', '', '¡Cúrame! ¡Rápido!', '', 'Исцели меня! Быстро!'); +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 (1562, 'critical health', 'Almost dead! Heal me!', 0, 0, '', 'Presque mort ! Soignez-moi !', 'Fast tot! Heil mich!', '快不行了!治疗我!', '', '¡Estoy casi muerto! ¡Cúrame!', '', 'Почти мертв! Исцели меня!'); +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 (1563, 'critical health', 'Help! Heal me!', 0, 0, '', 'S’il te plaît, aide-moi! Soigne-moi!', 'Hilfe! Heil mich!', '救命!治疗我!', '', '¡Ayuda! ¡Cúrame!', '', 'Помогите! Исцели меня!'); +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 (1564, 'critical health', 'Somebody! Heal me!', 0, 0, '', 'Quelqu’un ! Soigne-moi !', 'Irgendjemand! Heil mich!', '谁来!治疗我!', '', '¡Alguien! ¡Cúrame!', '', 'Кто-нибудь! Исцели меня!'); +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 (1565, 'critical health', 'Heal! Heal! Heal!', 0, 0, '', 'Guérir! Guérir! Guérir!', 'Heilung! Heilung! Heilung!', '治疗!治疗!治疗!', '', '¡Curame! ¡Saname! ¡Socorro!', '', 'Исцели! Исцели! Исцели!'); +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 (1566, 'critical health', 'I am dying! Heal! Aaaaarhg!', 0, 0, '', 'Je meurs! Au secours! Aaaaarhg!', 'Ich sterbe! Heilung! Aaaaarhg!', '我要死了!治疗!啊啊啊啊!', '', '¡Me estoy muriendo! ¡Saname! ¡Aaaaarhg!', '', 'Я умираю! Исцели! Ааааргх!'); +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 (1567, 'critical health', 'Heal me!', 0, 0, '', 'Soigne moi !', 'Heil mich!', '快治疗我!', '', '¡Cúrame!', '', 'Исцели меня!'); +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 (1568, 'critical health', 'I will die. I will die. I will die. Heal!', 0, 0, '', 'Je vais mourir. Je vais mourir. Je vais mourir. Soigne-moi !', 'Ich werde sterben. Ich werde sterben. Ich werde sterben. Heilung!', '我要死了!我要死了!快治疗!', '', 'Voy a morir. Voy a morir. Voy a morir. ¡Saname!', '', 'Я умру. Я умру. Я умру. Исцели!'); +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 (1569, 'critical health', 'Healers, where are you? I am dying!', 0, 0, '', 'Healers, où êtes-vous? Je suis en train de mourir!', 'Heiler, wo seid ihr? Ich sterbe!', '治疗呢?你们在哪儿?我快挂了!', '', 'Sanadores, ¿dónde estais? ¡Me estoy muriendo!', '', 'Целители, где вы? Я умираю!'); +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 (1570, 'critical health', 'Oh the pain. Heal me quick!', 0, 0, '', 'Oh la douleur. Guérissez-moi vite!', 'Oh, der Schmerz. Heil mich schnell!', '哎哟,好痛!快给我治疗!', '', 'Ouch, qué dolor. ¡Cúrame rápido!', '', 'О, боль. Исцели меня быстро!'); +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 (1571, 'low health', 'Need heal', 0, 0, '', 'Besoin de soins', 'Brauche Heilung', '需要治疗!', '', 'Necesito una cura', '', 'Нужна исцеление'); +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 (1572, 'low health', 'Low health', 0, 0, '', 'Faible santé', 'Wenig Leben', '血量低了!', '', 'Salud baja', '', 'Низкое здоровье'); +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 (1573, 'low health', 'Drop a heal. Please.', 0, 0, '', 'HEAL. S’il te plaît.', 'Heilung bitte.', '来个治疗,求你了!', '', 'Una sanación por favor.', '', 'Сделай исцеление. Пожалуйста.'); +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 (1574, 'low health', 'Could somebody drop a heal on me?', 0, 0, '', 'Est-ce que quelqu’un pourrait me soigner?', 'Kann mich jemand heilen?', '谁能给我加点血啊?', '', '¿Alguien podría curarme?', '', 'Может кто-нибудь исцелить меня?'); +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 (1575, 'low health', 'Hey! Better heal me now than rez later', 0, 0, '', 'Salut! Mieux vaut me soigner maintenant que me ressusciter plus tard.', 'Hey! Heilt mich lieber jetzt als mich später zu wiederbeleben.', '嘿!现在治好我总比待会儿复活强吧!', '', '¡Oye! Mejor curarme ahora que resucitarme después', '', 'Эй! Лучше исцели меня сейчас, чем воскрешать позже.'); +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 (1576, 'low health', 'I am sorry. Need another heal', 0, 0, '', 'Je suis désolé. J’ai besoin d’une autre guérison.', 'Tut mir leid. Brauche nochmal Heilung.', '抱歉,又需要治疗了!', '', 'Lo siento. Necesito otra curación', '', 'Извини. Нужна еще одна исцеление.'); +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 (1577, 'low health', 'Damn mobs. Heal me please', 0, 0, '', 'Maudits mobs. Guéris moi s’il te plait', 'Verdammte Mobs. Heilt mich bitte.', '该死的怪物,拜托治疗一下!', '', '¡Malditos bichos! ¡Una curita por favor!', '', 'Черт возьми, мобы. Исцели меня, пожалуйста.'); +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 (1578, 'low health', 'One more hit and I am done for. Heal please', 0, 0, '', 'Un coup de plus et c’est fini. Guéris moi s’il te plait', 'Ein Treffer noch und ich bin erledigt. Heilung bitte.', '再挨一下我就完了,求治疗!', '', 'Un golpe más y estoy acabado. Cura por favor', '', 'Еще один удар, и я пропал. Исцели, пожалуйста.'); +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 (1579, 'low health', 'Are there any healers?', 0, 0, '', 'Y a-t-il des guérisseurs?', 'Gibt es hier Heiler?', '有治疗吗?', '', '¿Hay sanadores?', '', 'Есть ли целители?'); +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 (1580, 'low health', 'Why do they always punch me in the face? Need heal', 0, 0, '', 'Pourquoi est-ce qu’ils me frappent toujours au visage? J’ai besoin de guérison', 'Warum schlagen sie mir immer ins Gesicht? Brauche Heilung.', '为什么总是打我脸?需要治疗!', '', '¿Por qué siempre me golpean en la cara? Necesito sanacion', '', 'Почему они всегда бьют меня в лицо? Нужна исцеление.'); +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 (1581, 'low health', 'Can anybody heal me a bit?', 0, 0, '', 'Soignez moi, même juste un peu ?', 'Kann mich jemand ein bisschen heilen?', '谁能给我加一点血?', '', '¿Alguien puede curarme un poco?', '', 'Может кто-нибудь немного исцелить меня?'); +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 (1582, 'low mana', 'OOM', 0, 0, '', 'Plus de mana !', 'Kein Mana mehr!', '没蓝了!', '', 'No tengo mana!', '', 'OOM'); +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 (1583, 'low mana', 'I am out of mana', 0, 0, '', 'Je n’ai plus de mana', 'Ich habe kein Mana mehr', '我没蓝了!', '', 'No tengo maná', '', 'У меня закончилась мана'); +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 (1584, 'low mana', 'Damn I wasted all my mana on this', 0, 0, '', 'Damn j’ai gaspillé toute ma mana sur ça.', 'Verdammt, ich habe mein ganzes Mana darauf verschwendet.', '该死,我的蓝全浪费在这上面了!', '', 'Me cago en todo! Malgasté todo mi maná enseguida', '', 'Черт, я потратил всю свою ману на это'); +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 (1585, 'low mana', 'You should wait until I drink or regenerate my mana', 0, 0, '', 'Tu devrais attendre que je boive ou régénère ma mana.', 'Du solltest warten, bis ich trinke oder Mana regeneriere.', '等我喝点水或者回点蓝再继续吧!', '', 'Deberías esperar hasta que beba o regenere mi maná', '', 'Тебе стоит подождать, пока я выпью или восстановлю свою ману'); +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 (1586, 'low mana', 'Low mana', 0, 0, '', 'Bas niveau de mana.', 'Wenig Mana.', '蓝量低了!', '', 'Maná bajo', '', 'Низкая мана'); +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 (1587, 'low mana', 'No mana. Again?', 0, 0, '', 'Pas de mana. Encore ?', 'Kein Mana. Schon wieder?', '没蓝了,又是这样?', '', 'Sin maná. ¿Otra vez?', '', 'Нет маны. Снова?'); +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 (1588, 'low mana', 'Low mana. Wanna drink', 0, 0, '', 'Plus de mana, je prendrai bien un peu d eau', 'Kein Mana mehr, ich sollte etwas trinken.', '蓝量低了,想喝点水!', '', 'Maná bajo. Quiero beber', '', 'Низкая мана. Хочу выпить.'); +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 (1589, 'low mana', 'Do we have a vending machine? Out of mana again', 0, 0, '', 'Nous avons une machine distributrice ? Encore à court de mana.', 'Haben wir einen Automaten? Schon wieder kein Mana.', '有自动售卖机吗?又没蓝了!', '', '¿Tenemos una máquina expendedora? Sin maná otra vez', '', 'У нас есть торговый автомат? Снова нет маны.'); +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 (1590, 'low mana', 'My mana is history', 0, 0, '', 'Mon mana est à sec.', 'Mein Mana ist Geschichte.', '我的蓝已经见底了!', '', 'Mi maná es historia', '', 'Моя мана в истории.'); +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 (1591, 'low mana', 'I’d get some drinks next time. Out of mana', 0, 0, '', 'Je prendrai des verres la prochaine fois. Plus de mana.', 'Ich hole mir nächstes Mal ein paar Tränke. Kein Mana mehr.', '下次一定要多带点喝的,没蓝了!', '', '¡No tengo maná! Tengo que comprar bebidas la próxima vez...', '', ''); +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 (1592, 'low mana', 'Where is my mana?', 0, 0, '', 'Oh là là, désolé, mais je ne sais pas du tout où se trouve ta mana. As-tu vérifié tous tes sacs et tes poches? Peut-être que tu l’as laissé quelque part dans la maison ou dans ton sac à dos. Il est toujours embêtant de perdre quelque chose d’aussi précieux que sa mana, j’espère que tu vas la retrouver bientôt!', 'Wo ist mein Mana?', '我的蓝去哪儿了?', '', '¿Dónde está mi maná?', '', 'Где моя мана?'); +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 (1593, 'low ammo', 'I have few left!', 0, 0, '', 'Il ne me reste que quelques !', 'Ich habe nur noch wenig !', '我只剩一点了!', '', '¡Me quedan pocas !', '', 'У меня осталось немного !'); +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 (1594, 'low ammo', 'I need more !', 0, 0, '', 'J’ai besoin de plus de !', 'Ich brauche mehr !', '我需要更多的!', '', '¡Necesito más !', '', 'Мне нужно больше !'); +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 (1595, 'low ammo', '100 left!', 0, 0, '', 'Il me reste 100 !', 'Ich habe noch 100 übrig!', '还剩100个!', '', '¡Quedan 100 !', '', '100 осталось!'); +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 (1596, 'no ammo', 'That’s it! No !', 0, 0, '', 'C’est ça! Pas de !', 'Das war’s! Keine mehr!', '完了!没了!', '', '¡Eso es todo! ¡Sin !', '', ''); +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 (1597, 'no ammo', 'And you have my bow... Oops, no !', 0, 0, '', 'Et vous avez mon arc... Oops, pas de !', 'Und du hast meinen Bogen... Ups, keine !', '你拿了我的弓……呃,没了!', '', 'Y tú tienes mi arco... ¡Uy, sin !', '', 'И у тебя есть мой лук... Ой, нет !'); +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 (1598, 'no ammo', 'Need ammo!', 0, 0, '', 'Besoin de munitions !', 'Brauche Munition!', '需要弹药!', '', '¡Necesito munición!', '', 'Нужна патроны!'); +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 (1599, 'aoe', 'Oh god!', 0, 0, '', 'Oh mon Dieu!', 'Oh Gott!', '天哪!', '', '¡Oh, Dios!', '', 'О боже!'); +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 (1600, 'aoe', 'I am scared', 0, 0, '', 'Je suis effrayé.', 'Ich habe Angst.', '我好害怕!', '', 'Tengo miedo', '', 'Мне страшно'); +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 (1601, 'aoe', 'We are done for', 0, 0, '', 'Nous sommes foutus.', 'Wir sind erledigt.', '我们完了!', '', 'Hemos terminado', '', 'Мы пропали'); +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 (1602, 'aoe', 'This is over', 0, 0, '', 'C’est terminé', 'Das war’s.', '这下完了!', '', 'Esto se acabó', '', 'Это закончено'); +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 (1603, 'aoe', 'This ends now', 0, 0, '', 'Cela se termine maintenant.', 'Das endet jetzt.', '现在就结束了!', '', 'Esto termina ahora', '', 'Это заканчивается сейчас'); +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 (1604, 'aoe', 'Could somebody cast blizzard or something?', 0, 0, '', 'Est-ce que quelqu’un pourrait lancer une tempête de neige ou quelque chose du genre, s’il vous plaît?', 'Kann jemand Blizzard anrufen?', '谁能扔个暴风雪啥的吗?', '', '¿Alguien podría lanzar ventisca o algo así?', '', 'Может кто-нибудь вызвать метель или что-то подобное?'); +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 (1605, 'aoe', 'Damn. The tank aggroed all the mobs around', 0, 0, '', 'Maudit tank a attiré tous les ennemis autour.', 'Verdammt. Der Tank hat alle Mobs um uns herum gepullt.', '该死,坦克拉了周围所有的怪!', '', '¡Me cago en todo! El tanque atrajo a todos los mobs...', '', 'Черт. Танку агрировал всех мобов вокруг.'); +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 (1606, 'aoe', 'We gonna die. We gonna die. We gonna die.', 0, 0, '', 'On va mourir. On va mourir. On va mourir.', 'Wir werden sterben. Wir werden sterben. Wir werden sterben.', '我们要死了!我们要死了!我们要死了!', '', 'Vamos a morir. Vamos a morir. Vamos a morir.', '', 'Мы умрем. Мы умрем. Мы умрем.'); +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 (1607, 'aoe', 'Whoa! So many toys to play with', 0, 0, '', 'Oh là là ! Tellement de jouets avec lesquels jouer !', 'Wow! So viele Spielzeuge zum Spielen!', '哇!这么多小怪可以玩!', '', '¡Vaya! Tantos juguetes con los que jugar', '', 'Ух ты! Так много игрушек, с которыми можно играть.'); +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 (1608, 'aoe', 'I gonna kill them all!', 0, 0, '', 'Je vais les tuer tous !', 'Ich werde sie alle töten!', '我要干掉他们所有人!', '', '¡Voy a matarlos a todos!', '', 'Я убью их всех!'); +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 (1609, 'aoe', 'If the tank dies we are history', 0, 0, '', 'Si le tank meurt, c’est la fin pour nous.', 'Wenn der Tank stirbt, war es das für uns.', '如果坦克挂了,我们就完蛋了!', '', 'Si el tanque muere somos historia', '', 'Если танк умрет, мы в истории.'); +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 (1610, 'aoe', 'Aaaaaargh!', 0, 0, '', 'Aaaaaaah!', 'Aaaaaargh!', '啊啊啊啊!', '', '¡Aaaaaargh!', '', 'Аааааргх!'); +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 (1611, 'aoe', 'LEEEEERROOOYYYYYYYYYYYY JENNKINNNSSSSSS!!!!!!!', 0, 0, '', 'LEEROOOOOOOYYYYYYYYYYY JENNKINNNSSSSSSS!!!!!!!', 'CAAAAAARL!!!!!!!', '李洛伊·詹金斯!!!', '', 'LEEEEERROOOYYYYYYYYYYYY JENNKINNNSSSSSS!!!!!!!', '', 'ЛЕЕЕЕЕЕЕЕЕЕЕЕЕЕЕЕЕЕЕЕЙ ДЖЕНКИНС!!!!!!!'); +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 (1612, 'aoe', 'Right. What do we have in AOE?', 0, 0, '', 'Alors, qu’est-ce qu’on a dans AOE?', 'Okay. Was haben wir für AOE?', '好吧,我们有什么群攻技能?', '', 'Claro. ¿Qué tenemos en AOE?', '', 'Правильно. Что у нас есть в AOE?'); +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 (1613, 'aoe', 'This gets interesting', 0, 0, '', 'Cela devient intéressant', 'Das wird interessant.', '这下有意思了!', '', 'Esto se pone interesante', '', 'Это становится интересным.'); +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 (1614, 'aoe', 'Cool. Get them in one place for a good flamestrike', 0, 0, '', 'Cool. Rassemble-les au même endroit pour un bon Coup de Flamme.', 'Cool. Bringt sie alle zusammen für einen ordentlichen Flammenstoß.', '酷!把他们聚一起,给我来个烈焰冲击!', '', 'Genial! Ponlos todos juntos para un buen ataque en area', '', 'Круто. Соберите их в одном месте для хорошего огненного удара.'); +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 (1615, 'aoe', 'Kill! Kill! Kill!', 0, 0, '', 'TUER! TUER! TUER!.', 'TÖTEN! TÖTEN! TÖTEN!', '杀!杀!杀!', '', '¡Matar! ¡Matar! ¡Matar!', '', 'Убей! Убей! Убей!'); +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 (1616, 'aoe', 'I think my pants are wet', 0, 0, '', 'Je crois que mon pantalon est mouillé.', 'Ich glaube, meine Hose ist nass.', '我感觉我的裤子湿了……', '', 'Creo que mis pantalones están mojados', '', 'Я думаю, что мои штаны мокрые.'); +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 (1617, 'aoe', 'We are history', 0, 0, '', 'Nous sommes l’histoire.', 'Wir sind Geschichte.', '我们完蛋了!', '', 'Somos historia', '', 'Мы в истории.'); +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 (1618, 'aoe', 'I hope healers are ready. Leeeeroy!', 0, 0, '', 'J’espère que les heal sont prêt. Leeeeroy!', 'Ich hoffe, die Heiler sind bereit. CAAAAAARL!', '希望治疗准备好了,李洛伊!', '', 'Espero que los sanadores estén listos. ¡Leeeroy!', '', 'Надеюсь, целители готовы. Лееерой!'); +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 (1619, 'aoe', 'I hope they won’t come for me', 0, 0, '', 'J’espère qu’ils ne viendront pas me chercher.', 'Ich hoffe, sie kommen nicht zu mir.', '希望他们别冲着我来!', '', 'Espero que no vengan por mí', '', ''); +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 (1620, 'aoe', 'Oh no. I can’t see at this slaugther', 0, 0, '', 'Oh non. Je ne peux pas regarder ce massacre.', 'Oh nein. Ich kann dieses Gemetzel nicht ansehen.', '哦不,我看不下这场屠杀!', '', 'Oh, no. No puedo ver esta matanza', '', ''); + +-- on looting +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 (1621, 'loot', 'I hope there will be some money', 0, 0, '', 'J’espère qu’il y aura de l’argent.', 'Ich hoffe, es gibt etwas Geld.', '希望能有点金币!', '', 'Espero que haya algo de dinero...', '', 'Надеюсь, там будет немного денег.'); +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 (1622, 'loot', 'Loot! Loot!', 0, 0, '', 'Butin! Butin!', 'Beute! Beute!', '战利品!战利品!', '', '¡Botín! ¡Botín!', '', 'Лут! Лут!'); +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 (1623, 'loot', 'My precious', 0, 0, '', 'Mon précieux', 'Mein Schatz', '我的宝贝!', '', 'Mi tesoro...', '', 'Мое драгоценное.'); +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 (1624, 'loot', 'I hope there is a shiny epic item waiting for me there', 0, 0, '', 'j’espère qu’il y a un objet épique brillant qui m’attend ici', 'Ich hoffe, dort wartet ein glänzendes episches Item auf mich.', '希望那儿有件闪闪发光的史诗装备等着我!', '', 'Espero que haya un objeto épico brillante esperándome allí', '', 'Надеюсь, там ждет меня блестящий эпический предмет.'); +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 (1625, 'loot', 'I have deep pockets and bags', 0, 0, '', 'J’ai de grandes poches et des sacs profonds.', 'Ich habe tiefe Taschen und große Beutel.', '我的口袋和背包都很大!', '', 'Tengo bolsillos profundos y infinitos', '', 'У меня глубокие карманы и сумки.'); +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 (1626, 'loot', 'All is mine!', 0, 0, '', 'Tout m’appartient!', 'Alles gehört mir!', '全是我的!', '', '¡Todo es mío!', '', 'Все мое!'); +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 (1627, 'loot', 'Hope no gray shit today', 0, 0, '', 'J’espère qu’il n’y aura pas de merde grise aujourd’hui.', 'Hoffentlich heute kein grauer Mist.', '希望今天别出垃圾灰装!', '', 'Espero que hoy no haya mierda gris', '', 'Надеюсь, сегодня не будет серой ерунды.'); +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 (1628, 'loot', 'This loot is MINE!', 0, 0, '', 'Ce butin est MIEN !', 'Diese Beute gehört MIR!', '这战利品是我的!', '', '¡Este botín es MÍO!', '', 'Этот лут - МОЙ!'); +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 (1629, 'loot', 'Looting is disgusting but I need money', 0, 0, '', 'Le pillage est répugnant mais j’ai besoin d’argent', 'Plündern ist ekelhaft, aber ich brauche Geld.', '摸尸体真恶心,但我需要金币!', '', 'El saqueo es repugnante pero necesito dinero...', '', 'Лутать отвратительно, но мне нужны деньги.'); +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 (1630, 'loot', 'Gold!', 0, 0, '', 'ARGENT !', 'GOLD!', '金币!', '', '¡Oro!', '', 'Золото!'); +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 (1631, 'loot', 'OK. Let’s see what they’ve got', 0, 0, '', 'D’accord. Voyons ce qu’ils ont.', 'Okay. Schauen wir mal, was sie haben.', '好吧,看看他们身上有啥!', '', 'OK. Veamos qué tienen', '', ''); +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 (1632, 'loot', 'Do not worry. I will loot eveything', 0, 0, '', 'Ne t’inquiète pas. je vais tout piller', 'Keine Sorge. Ich werde alles looten.', '别担心,我会把所有东西都搜刮干净!', '', 'No te preocupes. Saquearé todo', '', 'Не волнуйтесь. Я все залутаю.'); +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 (1633, 'loot', 'I am loot ninja', 0, 0, '', 'Je suis un ninja du butin', 'Ich bin ein Loot-Ninja.', '我是战利品忍者!', '', 'Soy un ladron de tesoros', '', 'Я ниндзя лута.'); +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 (1634, 'loot', 'Do I neeed to roll?', 0, 0, '', 'Est-ce que je dois lancer les dés?', 'Muss ich würfeln?', '我需要roll点吗?', '', '¿Necesito lanzar dados?', '', 'Мне нужно бросить кубик?'); +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 (1635, 'loot', 'Somebody explain me, where they did put all this stuff?', 0, 0, '', 'Quelqu’un m’explique, où ils ont mis tout ça?', 'Kann mir jemand erklären, wo sie das ganze Zeug hingetan haben?', '谁能告诉我,他们把这些东西都藏哪儿了?', '', 'Alguien me explica, ¿dónde pusieron todas estas cosas?', '', 'Кто-нибудь объясните мне, куда они положили все эти вещи?'); +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 (1636, 'loot', 'No, I won’t loot gray shit', 0, 0, '', 'No way, je ne vais pas voler de la merde grise.', 'Nein, ich loote keinen grauen Mist.', '不行,我才不捡这些破烂灰色装备!', '', 'No, no saquearé mierda gris', '', ''); +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 (1637, 'loot', 'I’m first. I’m first. I’m first.', 0, 0, '', 'Je suis le premier. Je suis le premier. Je suis le premier.', 'Ich bin zuerst! Ich bin zuerst! Ich bin zuerst!', '我先来!我先来!我先来!', '', '¡Es mio! ¡Es mio! ¡Es mio!', '', ''); +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 (1638, 'loot', 'Give me your money!', 0, 0, '', 'Désolé, je ne peux pas faire ça.', 'Gib mir dein Geld!', '把你的金币都交出来!', '', '¡Dame todo tu dinero!', '', 'Отдай мне свои деньги!'); +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 (1639, 'loot', 'My pockets are empty, I need to fill them', 0, 0, '', 'Mes poches sont vides, il faut que je les remplisse.', 'Meine Taschen sind leer, ich muss sie füllen.', '我的口袋空空如也,得赶紧装点东西!', '', 'Mis bolsillos están vacíos y necesitan llenarse!', '', 'Мои карманы пусты, мне нужно их заполнить.'); +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 (1640, 'loot', 'I’ve got a new bag for this', 0, 0, '', 'J’ai un nouveau sac pour cela.', 'Ich habe eine neue Tasche dafür.', '我刚弄了个新背包,正好装这些!', '', 'Tengo una nueva bolsa para esto', '', ''); +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 (1641, 'loot', 'I hope I won’t aggro anybody while looting', 0, 0, '', 'J’espère ne pas aggro, je vais loot !', 'Ich hoffe, ich ziehe keine Aggro, während ich loote.', '希望我捡东西的时候别引到什么怪物!', '', 'Espero no ofender a nadie mientras saqueo', '', ''); +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 (1642, 'loot', 'Please don’t watch. I am looting', 0, 0, '', 'S’il vous plaît, ne regardez pas. je loot', 'Bitte nicht hinschauen. Ich plündere.', '别盯着看,我在捡装备呢!', '', 'Por favor, no mires. Estoy saqueando', '', ''); +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 (1643, 'loot', 'Ha! You won’t get any piece of it!', 0, 0, '', 'Ha! Tu ne verras rien de cela !', 'Ha! Davon bekommst du nichts ab!', '哈!你别想分到半点东西!', '', '¡Ja! ¡No obtendrás nada de eso!', '', ''); +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 (1644, 'loot', 'Looting is cool', 0, 0, '', 'Le pillage c’est cool', 'Looten ist cool.', '捡战利品真是爽!', '', 'Saquear es genial', '', 'Лутать круто.'); +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 (1645, 'loot', 'I like new gear', 0, 0, '', 'J’aime les nouveaux équipements.', 'Ich liebe neue Ausrüstung.', '我超喜欢新装备!', '', 'Me gusta el equipo nuevo', '', 'Мне нравится новая экипировка.'); +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 (1646, 'loot', 'I’l quit if there is nothing valuable again', 0, 0, '', 'j’arrêterai s’il n’y a plus rien de précieux', 'Ich höre auf, wenn es wieder nichts Wertvolles gibt.', '要是再没什么值钱的东西,我就走人了!', '', 'Me doy por vencido si no hay nada util', '', ''); +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 (1647, 'loot', 'I hope it is be a pretty ring', 0, 0, '', 'j’espère que c’est une jolie bague', 'Ich hoffe, es ist ein hübscher Ring.', '希望这次能捡到个漂亮的戒指!', '', 'Espero que sea un anillo bonito', '', 'Надеюсь, это будет красивое кольцо.'); +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 (1648, 'loot', 'I’l rip the loot from you', 0, 0, '', 'Je t’arracherai le butin', 'Ich werde dir die Beute entreißen.', '我要把战利品从你手里抢过来!', '', 'Te arrancaré el botín', '', ''); +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 (1649, 'loot', 'Everybody stay off. I’m going to loot', 0, 0, '', 'Tout le monde, restez loin. Je vais piller.', 'Alle zurückbleiben. Ich loote jetzt.', '都别靠近,我要开始捡东西了!', '', '¡Alejaos todos! Voy a lootear', '', ''); +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 (1650, 'loot', 'Sweet loot', 0, 0, '', 'Je me suis procuré un butin incroyable !', 'Tolle Beute!', '真是甜美的战利品!', '', 'Dulce botín', '', 'Сладкий лут.'); +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 (1651, 'loot', 'The Roll God! Give me an epic today', 0, 0, '', 'Le Dieu des Lancés! Fais-moi vivre une épopée aujourd’hui', 'Oh Würfelgott! Gib mir heute ein Epic!', '掷骰之神!今天赐我一件史诗装备吧!', '', '¡El Dios de los dados! Dame un epico hoy', '', 'Бог Ролла! Дай мне эпик сегодня.'); +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 (1652, 'loot', 'Please give me new toys', 0, 0, '', 'S’il te plaît, donne-moi de nouveaux jouets', 'Bitte gib mir neue Spielsachen.', '求你了,给我点新玩意儿吧!', '', 'Por favor, dame nuevos juguetes', '', 'Пожалуйста, дай мне новые игрушки.'); +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 (1653, 'loot', 'I hope they carry tasties', 0, 0, '', 'J’espère qu’ils auront des délices.', 'Ich hoffe, sie haben etwas Leckeres dabei.', '希望他们身上带了点好吃的!', '', 'Espero que caiga algo sabrosos', '', 'Надеюсь, они принесут вкусняшки.'); +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 (1654, 'loot', 'The gold is mine. I’ll leave everyting, I promise', 0, 0, '', 'L’or m’appartient. Je laisserai tout, je te le promets.', 'Das Gold gehört mir. Ich lasse den Rest liegen, versprochen.', '金币是我的,其他都留给你们,我保证!', '', 'El oro es mío. Dejaré todo lo demas, lo prometo!', '', ''); +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 (1655, 'loot', 'No, I can’t resist', 0, 0, '', 'Non, je ne peux pas résister.', 'Nein, ich kann nicht widerstehen.', '不,我忍不住了!', '', 'No, no puedo resistir', '', ''); +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 (1656, 'loot', 'I want more!', 0, 0, '', 'Oh, vous en voulez plus!', 'Ich will mehr!', '我还想要更多!', '', '¡Quiero más!', '', 'Я хочу больше!'); + +-- wait signals +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 (1657, 'wait_travel_close', 'I am close, wait for me!', 0, 0, '', 'Je suis presque là, attends-moi !', 'Ich bin fast da, wartet auf mich!', '我就在附近,等我一下!', '', '¡Estoy cerca, espérame!', '', 'Я близко, подожди меня!'); +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 (1658, 'wait_travel_close', 'I’m not far, please wait!', 0, 0, '', 'Je ne suis pas loin, s’il vous plaît patientez !', 'Ich bin nicht weit, bitte wartet!', '我不远了,请稍等我!', '', 'No estoy lejos, ¡esperame por favor!', '', 'Я недалеко, погодите!'); +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 (1659, 'wait_travel_medium', 'I’m heading to your location', 0, 0, '', 'Je me dirige vers votre emplacement.', 'Ich bin auf dem Weg zu euch.', '我正朝你的位置赶去!', '', 'Me dirijo a tu ubicación', '', 'Двигаюсь к тебе'); +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 (1660, 'wait_travel_medium', 'I’m coming to you', 0, 0, '', 'Je viens vers vous.', 'Ich komme zu euch.', '我正向你靠近!', '', 'Voy hacia ti', '', 'Иду к тебе'); +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 (1661, 'wait_travel_far', 'I’m traveling to your location', 0, 0, '', 'Je voyage vers votre destination.', 'Ich reise zu eurem Standort.', '我正在前往你的位置!', '', 'Voy a viajar a tu ubicación', '', 'Направляюсь к тебе'); +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 (1662, 'wait_travel_far', 'I’m trying to get to you', 0, 0, '', 'Je suis en train de l’atteindre', 'Ich versuche, zu euch zu kommen.', '我正努力赶到你那儿!', '', 'Estoy tratando de llegar a ti', '', 'Пытаюсь до тебя добраться'); + +-- commands +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 (1663, 'equip_command', 'Equipping %item', 0, 0, '', 'Équipement %item.', 'Rüste %item aus.', '装备上 %item', '', 'Me he equipado %item', '', 'Экипирую %item.'); +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 (1664, 'unequip_command', '%item unequipped', 0, 0, '', '%item Déséquipé', '%item abgelegt.', '卸下了 %item', '', 'Me he quitado %item', '', '%item снят.'); +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 (1665, 'auto_learn_spell', 'I have learned the spells: %spells', 0, 0, '', 'Je viens d’apprendre: %spells', 'Ich habe folgende Zauber gelernt: %spells', '我学会了这些法术:%spells', '', 'He aprendido los hechizos: %spells', '', 'Я выучил заклинания: %spells.'); +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 (1666, 'use_command_item_cooldown', '%item is in cooldown', 0, 0, '', 'L’objet %item est en temps de recharge.', '%item ist auf Abklingzeit.', '%item 还在冷却中', '', '%item esta recargandose', '', '%item в перезарядке.'); +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 (1667, 'use_command_item_not_owned', 'I don’t have %item in my inventory', 0, 0, '', 'Je n’ai pas %item dans mon inventaire.', 'Ich habe %item nicht in meinem Inventar.', '我的背包里没有 %item', '', 'No tengo %item en mi inventario', '', ''); +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 (1668, 'use_command_invalid_item', 'The item with the id %item does not exist', 0, 0, '', 'L’article avec l’identifiant %item n’existe pas.', 'Der Gegenstand mit der ID %item existiert nicht.', 'ID 为 %item 的物品不存在', '', 'El objeto con el id %item no existe', '', 'Предмет с ID %item не существует.'); +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 (1669, 'use_command_socket', 'Socketing %gem into %item', 0, 0, '', 'J’encastre le %gem dans %item.', 'Setze %gem in %item ein.', '将 %gem 镶嵌到 %item 上', '', 'Insertando %gem en %item', '', 'Вставляю %gem в %item.'); +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 (1670, 'use_command_item_error', 'I can’t use %item', 0, 0, '', 'Je ne peux pas utiliser %item.', 'Ich kann %item nicht benutzen.', '我无法使用 %item', '', 'No puedo usar %item', '', ''); +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 (1671, 'following', 'Following', 0, 0, '', 'Je suis', 'Folge dir', '跟随中', '', 'Te sigo', '', 'Следую.'); +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 (1672, 'staying', 'Staying', 0, 0, '', 'Je reste ici', 'Bleibe stehen', '待命中', '', 'Me quedo aqui', '', 'Остаюсь.'); +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 (1673, 'fleeing', 'Fleeing', 0, 0, '', 'Je m’enfui', 'Fliehe', '逃跑中', '', 'Huyendo', '', 'Убегаю.'); +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 (1674, 'fleeing_far', 'I won’t flee with you, you are too far away', 0, 0, '', 'Je ne vais pas partir avec toi, tu es trop loin.', 'Ich werde nicht mit dir fliehen, du bist zu weit weg.', '我不会跟你一起逃,你离我太远了!', '', 'No huiré contigo, estás demasiado lejos', '', 'Я с тобой не побегу, ты слишком далеко'); +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 (1675, 'grinding', 'Grinding', 0, 0, '', 'Grinding', 'Farme', '刷怪中', '', 'Farmeando', '', 'Фармлю.'); +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 (1676, 'attacking', 'Attacking', 0, 0, '', 'Attaque en cours !', 'Greife an!', '攻击中', '', 'Atacando', '', 'Атакую.'); +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 (1677, 'error_far', 'It is too far away', 0, 0, '', 'C’est trop loin.', 'Das ist zu weit entfernt.', '距离太远了', '', 'Estas demasiado lejos', '', 'Это слишком далеко.'); +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 (1678, 'error_water', 'It is under water', 0, 0, '', 'Cela se trouve sous l’eau', 'Das ist unter Wasser.', '目标在水下', '', 'Estas debajo del agua', '', 'Это под водой.'); +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 (1679, 'error_cant_go', 'I can’t go there', 0, 0, '', 'Je ne peux pas y aller.', 'Ich kann dort nicht hingehen.', '我去不了那里', '', 'No puedo ir allí', '', 'Я не могу туда пройти'); +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 (1680, 'error_guild', 'I’m not in your guild!', 0, 0, '', 'Je ne fais pas partie de votre guilde!', 'Ich bin nicht in eurer Gilde!', '我不在你的公会里!', '', '¡No estoy en tu hermandad!', '', 'Я не в твоей гильдии'); +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 (1681, 'error_gbank_found', 'Can not find a guild bank nearby', 0, 0, '', 'Je ne trouve pas de banque de guilde à proximité.', 'Ich kann keine Gildenbank in der Nähe finden.', '附近找不到公会银行', '', 'No se puede encontrar un banco de hermandad cercano', '', 'Не могу найти гильдейский банк поблизости.'); +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 (1682, 'error_cant_put', 'I can’t put ', 0, 0, '', 'Je ne peux pas déposer ', 'Ich kann das nicht ablegen.', '我无法存放', '', 'No puedo depositar ', '', 'Я не могу положить'); +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 (1683, 'error_gbank_rights', 'I have no rights to put items in the first guild bank tab', 0, 0, '', 'Je n’ai pas le droit de mettre des objets dans le premier onglet de la banque de guilde.', 'Ich habe keine Rechte, Gegenstände in den ersten Reiter der Gildenbank zu legen.', '我没有权限将物品放入公会银行的第一个标签页', '', 'No tengo derechos para depositar objetos en la primera pestaña del banco de hermandad', '', 'У меня нет прав на размещение предметов в первой вкладке гильдейского банка.'); +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 (1684, 'gbank_put', ' put to guild bank', 0, 0, '', ' déposé dans la banque de guilde.', 'in die Gildenbank gelegt.', '已存入公会银行', '', ' depositado en el banco de hermandad', '', ' положено в гильдейский банк.'); +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 (1685, 'free_moving', 'Free moving', 0, 0, '', 'Déplacement libre', 'Freie Bewegung', '自由移动中', '', 'Moviendome libremente', '', 'Свободное движение.'); +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 (1686, 'guarding', 'Guarding', 0, 0, '', 'Je garle la position.', 'Ich bewache die Position.', '守卫中', '', 'Protegiendo la posición', '', 'Охраняю.'); +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 (1687, 'use_command', 'Using ', 0, 0, '', 'Utilisation de ', 'Benutze ', '使用 ', '', 'Usando ', '', ''); +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 (1688, 'command_target_unit', 'on %unit', 0, 0, '', 'sur %unit', 'auf %unit', '对 %unit', '', 'en %unit', '', 'на %unit.'); +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 (1689, 'use_command_remaining', '(%amount available)', 0, 0, '', '(%amount restant)', '(%amount verfügbar)', '(剩余 %amount)', '', '(%amount restante)', '', '(%amount доступно)'); +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 (1690, 'use_command_last', '(the last one)', 0, 0, '', '(La dernière fois)', '(der letzte)', '(最后一个)', '', '(el último)', '', '(последний)'); +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 (1691, 'use_command_socket_error', 'The socket does not fit', 0, 0, '', 'Le socket ne s’adapte pas.', 'Der Sockel passt nicht.', '插槽不匹配', '', 'La ranura no sirve', '', 'Сокет не подходит.'); +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 (1692, 'command_target_trade', 'on trade item', 0, 0, '', 'Sur le commerce de l’article', 'auf Handelsware', '对交易物品', '', 'en objeto comerciado', '', 'на торговом предмете.'); +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 (1693, 'command_target_self', 'on myself', 0, 0, '', 'sur moi-même', 'auf mich selbst', '对自己', '', 'en mi', '', 'на себе.'); +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 (1694, 'command_target_item', 'on %item', 0, 0, '', 'sur %item', 'auf %item', '对 %item', '', 'en %item', '', 'на %item.'); +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 (1695, 'command_target_go', 'on %gameobject', 0, 0, '', 'sur %gameobject', 'auf %gameobject', '对 %gameobject', '', 'en %gameobject', '', 'на %gameobject.'); +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 (1696, 'loot_command', 'Looting %item', 0, 0, '', 'Ramassage de %item', 'Plündere %item', '拾取 %item', '', 'Despojando %item', '', 'Лутаю %item.'); +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 (1697, 'cast_spell_command_summon', 'Summoning ', 0, 0, '', 'Invocation de ', 'Beschwöre ', '召唤 ', '', 'Invocando a ', '', ''); +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 (1698, 'cast_spell_command_summon_error_members', 'I don’t have enough party members around to cast a summon', 0, 0, '', 'Je n’ai pas assez de membres de groupe autour de moi pour lancer une invocation.', 'Ich habe nicht genug Gruppenmitglieder in der Nähe, um eine Beschwörung zu durchzuführen.', '我周围没有足够的队友,无法施放召唤术。', '', 'No tengo suficientes miembros de grupo alrededor para invocar', '', ''); +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 (1699, 'cast_spell_command_summon_error_target', 'Failed to find the summon target', 0, 0, '', 'Je n’ai pas réussi à trouver la cible à invoquer.', 'Beschwörungsziel nicht gefunden.', '找不到召唤目标!', '', 'No he podido encontrar al objetivo de la invocación', '', 'Не удалось найти цель для призыва.'); +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 (1700, 'cast_spell_command_summon_error_combat', 'I can’t summon while I’m in combat', 0, 0, '', 'Je ne peux pas invoquer pendant que je suis en combat', 'Ich kann im Kampf nicht beschwören.', '战斗中无法施放召唤术!', '', 'No puedo invocar durante un combate', '', ''); +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 (1701, 'cast_spell_command_error_unknown_spell', 'I don’t know the spell %spell', 0, 0, '', 'Je ne connais pas le sort %spell.', 'Ich kenne den Zauber %spell nicht.', '我不会这个技能 %spell。', '', 'No conozco el hechizo %spell', '', ''); +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 (1702, 'cast_spell_command_spell', 'Casting %spell', 0, 0, '', 'Lancement du sort %spell', 'Wirke %spell', '正在施放 %spell', '', 'Lanzando %spell', '', 'Кастую %spell.'); +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 (1703, 'cast_spell_command_craft', 'Crafting %spell', 0, 0, '', 'Je suis en train de fabriquer le sort %spell.', 'Stelle %spell her.', '正在制作 %spell', '', 'Creando %spell', '', 'Создаю %spell.'); +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 (1704, 'cast_spell_command_error', 'Cannot cast %spell', 0, 0, '', 'Je ne peux pas lancer le sort %spell.', 'Kann %spell nicht wirken.', '无法施放 %spell!', '', 'No puedo lanzar %spell', '', 'Не могу кастовать %spell.'); +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 (1705, 'cast_spell_command_error_failed', 'Failed to cast %spell', 0, 0, '', 'J’ai échoué à lancer %spell.', 'Zauber %spell fehlgeschlagen.', '施放 %spell 失败了!', '', 'Fallo al lanzar %spell', '', 'Не удалось кастовать %spell.'); +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 (1706, 'cast_spell_command_amount', ' |cffffff00(x%amount left)|r', 0, 0, '', ' |cffffff00(x%amount restant)|r.', '|cffffff00(x%amount übrig)|r.', ' |cffffff00(剩余 x%amount)|r', '', ' |cffffff00(x%amount restante)|r', '', ' |cffffff00(x%amount осталось)|r'); +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 (1707, 'dummy_end', 'dummy', 0, 0, '', 'dummy', 'dummy', '', '', '', '', 'dummy'); +-- base file end + +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 (1708, 'rp_missing_reagent_greater_blessing', 'By the Light... I forgot my Symbols of Kings. We’ll make do with %base_spell!', 0, 0, '', 'Par la Lumière... J\'ai oublié mes Symboles du roi. On se contentera de %base_spell !', '', '', '', '', '', ''); +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 (1709, 'rp_missing_reagent_gift_of_the_wild', 'Nature is generous, my bags are not... out of herbs for %group_spell. Take %base_spell for now!', 0, 0, '', 'La nature est généreuse, pas mes sacs... plus d\'herbes pour %group_spell. Prenez %base_spell pour l\'instant !', '', '', '', '', '', ''); +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 (1710, 'rp_missing_reagent_arcane_brilliance', 'Out of Arcane Powder... %group_spell will have to wait. Casting %base_spell!', 0, 0, '', 'Plus de poudre des arcanes... %group_spell attendra. Je lance %base_spell !', '', '', '', '', '', ''); +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 (1711, 'rp_missing_reagent_generic', 'Oops, I’m out of components for %group_spell. We’ll go with %base_spell!', 0, 0, '', 'Oups, je n\'ai plus de composants pour %group_spell. On fera avec %base_spell !', '', '', '', '', '', ''); +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 (1712, 'netherspite_beam_blocking_red', '%player is moving to block the red beam!', 0, 0, '', '', '', '', '', '', '', ''); +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 (1713, 'netherspite_beam_blocking_blue', '%player is moving to block the blue beam!', 0, 0, '', '', '', '', '', '', '', ''); +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 (1714, 'netherspite_beam_blocking_green', '%player is moving to block the green beam!', 0, 0, '', '', '', '', '', '', '', ''); +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 (1715, 'netherspite_beam_leaving_blue', '%player is leaving the blue beam--next blocker up!', 0, 0, '', '', '', '', '', '', '', ''); +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 (1716, 'netherspite_beam_leaving_green', '%player is leaving the green beam--next blocker up!', 0, 0, '', '', '', '', '', '', '', ''); From 8a30d1061723ab4f0c228d024d0df958aad78b39 Mon Sep 17 00:00:00 2001 From: Wishmaster117 <140754794+Wishmaster117@users.noreply.github.com> Date: Sat, 11 Oct 2025 10:57:54 +0200 Subject: [PATCH 106/151] Prevent Crash if sTaxiPathStore.LookupEntry return nullptr --- src/TravelNode.cpp | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/TravelNode.cpp b/src/TravelNode.cpp index a29bebf104..8e88006700 100644 --- a/src/TravelNode.cpp +++ b/src/TravelNode.cpp @@ -178,6 +178,9 @@ uint32 TravelNodePath::getPrice() TaxiPathEntry const* taxiPath = sTaxiPathStore.LookupEntry(pathObject); + if (!taxiPath) + return 0; + return taxiPath->price; } From d0ac9452f441fb1019cea534f31b213705e80bc0 Mon Sep 17 00:00:00 2001 From: Wishmaster117 <140754794+Wishmaster117@users.noreply.github.com> Date: Sat, 11 Oct 2025 11:26:09 +0200 Subject: [PATCH 107/151] Fix Opcode dispatch, trusts every queued packet to have a handler --- src/PlayerbotMgr.cpp | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/src/PlayerbotMgr.cpp b/src/PlayerbotMgr.cpp index 368a216b83..b2b1a0f3c9 100644 --- a/src/PlayerbotMgr.cpp +++ b/src/PlayerbotMgr.cpp @@ -227,6 +227,12 @@ void PlayerbotHolder::HandleBotPackets(WorldSession* session) { OpcodeClient opcode = static_cast(packet->GetOpcode()); ClientOpcodeHandler const* opHandle = opcodeTable[opcode]; + if (!opHandle) + { + LOG_ERROR("playerbots", "Unhandled opcode {} queued for bot session {}. Packet dropped.", static_cast(opcode), session->GetAccountId()); + delete packet; + continue; + } opHandle->Call(session, *packet); delete packet; } From e1fa733aa50e696cc448aa732d4dfdab2a3d11eb Mon Sep 17 00:00:00 2001 From: Yunfan Li <56597220+liyunfan1223@users.noreply.github.com> Date: Tue, 14 Oct 2025 00:11:54 +0800 Subject: [PATCH 108/151] Preparation for project transfer (#1733) --- .github/workflows/core_build.yml | 4 ++-- .github/workflows/macos_build.yml | 4 ++-- .github/workflows/windows_build.yml | 4 ++-- README.md | 36 ++++++++++++++--------------- README_CN.md | 8 +++---- conf/playerbots.conf.dist | 2 +- src/Playerbots.cpp | 4 ++-- 7 files changed, 31 insertions(+), 31 deletions(-) diff --git a/.github/workflows/core_build.yml b/.github/workflows/core_build.yml index 5a6f83ab17..2927716f12 100644 --- a/.github/workflows/core_build.yml +++ b/.github/workflows/core_build.yml @@ -38,7 +38,7 @@ jobs: - name: Checkout AzerothCore uses: actions/checkout@v3 with: - repository: 'liyunfan1223/azerothcore-wotlk' + repository: 'mod-playerbots/azerothcore-wotlk' ref: 'Playerbot' - name: Set reusable strings @@ -50,7 +50,7 @@ jobs: - name: Checkout Playerbot Module uses: actions/checkout@v3 with: - repository: 'liyunfan1223/mod-playerbots' + repository: 'mod-playerbots/mod-playerbots' path: 'modules/mod-playerbots' - name: Cache diff --git a/.github/workflows/macos_build.yml b/.github/workflows/macos_build.yml index d0e1a82906..30a558c639 100644 --- a/.github/workflows/macos_build.yml +++ b/.github/workflows/macos_build.yml @@ -22,12 +22,12 @@ jobs: - name: Checkout AzerothCore uses: actions/checkout@v4 with: - repository: 'liyunfan1223/azerothcore-wotlk' + repository: 'mod-playerbots/azerothcore-wotlk' ref: 'Playerbot' - name: Checkout Playerbot Module uses: actions/checkout@v4 with: - repository: 'liyunfan1223/mod-playerbots' + repository: 'mod-playerbots/mod-playerbots' path: 'modules/mod-playerbots' - name: Cache uses: actions/cache@v4 diff --git a/.github/workflows/windows_build.yml b/.github/workflows/windows_build.yml index 45a6c88bca..e7d8b244da 100644 --- a/.github/workflows/windows_build.yml +++ b/.github/workflows/windows_build.yml @@ -23,12 +23,12 @@ jobs: - name: Checkout AzerothCore uses: actions/checkout@v3 with: - repository: 'liyunfan1223/azerothcore-wotlk' + repository: 'mod-playerbots/azerothcore-wotlk' ref: 'Playerbot' - name: Checkout Playerbot Module uses: actions/checkout@v3 with: - repository: 'liyunfan1223/mod-playerbots' + repository: 'mod-playerbots/mod-playerbots' path: 'modules/mod-playerbots' - name: ccache uses: hendrikmuhs/ccache-action@v1.2.13 diff --git a/README.md b/README.md index d5c1f182e9..f77cdb96f8 100644 --- a/README.md +++ b/README.md @@ -1,7 +1,7 @@

- English + English | - 中文 + 中文 | Español

@@ -12,13 +12,13 @@
- - - + + +
# Playerbots Module -`mod-playerbots` is an [AzerothCore](https://www.azerothcore.org/) module that adds player-like bots to a server. The project is based off [IKE3's Playerbots](https://github.com/ike3/mangosbot) and requires a custom branch of AzerothCore to compile and run: [liyunfan1223/azerothcore-wotlk/tree/Playerbot](https://github.com/liyunfan1223/azerothcore-wotlk/tree/Playerbot). +`mod-playerbots` is an [AzerothCore](https://www.azerothcore.org/) module that adds player-like bots to a server. The project is based off [IKE3's Playerbots](https://github.com/ike3/mangosbot) and requires a custom branch of AzerothCore to compile and run: [mod-playerbots/azerothcore-wotlk/tree/Playerbot](https://github.com/mod-playerbots/azerothcore-wotlk/tree/Playerbot). Features include: @@ -28,7 +28,7 @@ Features include: - Highly configurable settings to define how bots behave; - Excellent performance, even when running thousands of bots. -**This project is still under development**. If you encounter any errors or experience crashes, we kindly request that you [report them as GitHub issues](https://github.com/liyunfan1223/mod-playerbots/issues/new?template=bug_report.md). Your valuable feedback will help us improve this project collaboratively. +**This project is still under development**. If you encounter any errors or experience crashes, we kindly request that you [report them as GitHub issues](https://github.com/mod-playerbots/mod-playerbots/issues/new?template=bug_report.md). Your valuable feedback will help us improve this project collaboratively. `mod-playerbots` has a **[Discord server](https://discord.gg/NQm5QShwf9)** where you can discuss the project, ask questions, and get involved in the community! @@ -36,12 +36,12 @@ Features include: ### Classic Installation -As noted above, `mod-playerbots` requires a custom branch of AzerothCore: [liyunfan1223/azerothcore-wotlk/tree/Playerbot](https://github.com/liyunfan1223/azerothcore-wotlk/tree/Playerbot). To install the module, simply run: +As noted above, `mod-playerbots` requires a custom branch of AzerothCore: [mod-playerbots/azerothcore-wotlk/tree/Playerbot](https://github.com/mod-playerbots/azerothcore-wotlk/tree/Playerbot). To install the module, simply run: ```bash -git clone https://github.com/liyunfan1223/azerothcore-wotlk.git --branch=Playerbot +git clone https://github.com/mod-playerbots/azerothcore-wotlk.git --branch=Playerbot cd azerothcore-wotlk/modules -git clone https://github.com/liyunfan1223/mod-playerbots.git --branch=master +git clone https://github.com/mod-playerbots/mod-playerbots.git --branch=master ``` For more information, refer to the [AzerothCore Installation Guide](https://www.azerothcore.org/wiki/installation) and [Installing a Module](https://www.azerothcore.org/wiki/installing-a-module) pages. @@ -51,9 +51,9 @@ For more information, refer to the [AzerothCore Installation Guide](https://www. **Docker installation is considered experimental.** To install the module on a Docker installation, run: ```bash -git clone https://github.com/liyunfan1223/azerothcore-wotlk.git --branch=Playerbot +git clone https://github.com/mod-playerbots/azerothcore-wotlk.git --branch=Playerbot cd azerothcore-wotlk/modules -git clone https://github.com/liyunfan1223/mod-playerbots.git --branch=master +git clone https://github.com/mod-playerbots/mod-playerbots.git --branch=master ``` Afterwards, create a `docker-compose.override.yml` file in the `azerothcore-wotlk` directory. This override file allows for mounting the modules directory to the `ac-worldserver` service which is required for it to run. Put the following inside and save: @@ -77,21 +77,21 @@ services: - ./modules:/azerothcore/modules:ro ``` -For example, to double the experience gain rate per kill, take the setting `Rate.XP.Kill = 1` from [woldserver.conf](https://github.com/liyunfan1223/azerothcore-wotlk/blob/Playerbot/src/server/apps/worldserver/worldserver.conf.dist), convert it to an environment variable, and change it to the desired setting in the override file to get `AC_RATE_XP_KILL: "2"`. If you wanted to disable random bots from logging in automatically, take the `AiPlayerbot.RandomBotAutologin = 1` setting from [playerbots.conf](https://github.com/liyunfan1223/mod-playerbots/blob/master/conf/playerbots.conf.dist) and do the same to get `AC_AI_PLAYERBOT_RANDOM_BOT_AUTOLOGIN: "0"`. For more information on how to configure Azerothcore, Playerbots, and other module settings as environment variables in Docker Compose, see the "Configuring AzerothCore in Containers" section in the [Install With Docker](https://www.azerothcore.org/wiki/install-with-docker) guide. +For example, to double the experience gain rate per kill, take the setting `Rate.XP.Kill = 1` from [woldserver.conf](https://github.com/mod-playerbots/azerothcore-wotlk/blob/Playerbot/src/server/apps/worldserver/worldserver.conf.dist), convert it to an environment variable, and change it to the desired setting in the override file to get `AC_RATE_XP_KILL: "2"`. If you wanted to disable random bots from logging in automatically, take the `AiPlayerbot.RandomBotAutologin = 1` setting from [playerbots.conf](https://github.com/mod-playerbots/mod-playerbots/blob/master/conf/playerbots.conf.dist) and do the same to get `AC_AI_PLAYERBOT_RANDOM_BOT_AUTOLOGIN: "0"`. For more information on how to configure Azerothcore, Playerbots, and other module settings as environment variables in Docker Compose, see the "Configuring AzerothCore in Containers" section in the [Install With Docker](https://www.azerothcore.org/wiki/install-with-docker) guide. -Before building, consider setting the database password. One way to do this is to create a `.env` file in the root `azerothcore-wotlk` directory using the [template](https://github.com/liyunfan1223/azerothcore-wotlk/blob/Playerbot/conf/dist/env.docker). This file also allows you to set the user and group Docker uses for the services in case you run into any permissions issues, which are the most common cause for Docker installation problems. +Before building, consider setting the database password. One way to do this is to create a `.env` file in the root `azerothcore-wotlk` directory using the [template](https://github.com/mod-playerbots/azerothcore-wotlk/blob/Playerbot/conf/dist/env.docker). This file also allows you to set the user and group Docker uses for the services in case you run into any permissions issues, which are the most common cause for Docker installation problems. Use `docker compose up -d --build` to build and run the server. For more information, including how to create an account and taking backups, refer to the [Install With Docker](https://www.azerothcore.org/wiki/install-with-docker) page. ## Documentation -The [Playerbots Wiki](https://github.com/liyunfan1223/mod-playerbots/wiki) contains an extensive overview of addons, commands, raids with programmed bot strategies, and recommended performance configurations. Please note that documentation may be incomplete or out-of-date in some sections. Contributions are welcome. +The [Playerbots Wiki](https://github.com/mod-playerbots/mod-playerbots/wiki) contains an extensive overview of addons, commands, raids with programmed bot strategies, and recommended performance configurations. Please note that documentation may be incomplete or out-of-date in some sections. Contributions are welcome. ## Frequently Asked Questions - **Why aren't my bots casting spells?** Please make sure that the necessary English DBC file (enUS) is present. - **What platforms are supported?** We support Ubuntu, Windows, and macOS. Other Linux distros may work, but will not receive support. -- **Why isn't my source compiling?** Please ensure that you are compiling with the required [custom branch of AzerothCore](https://github.com/liyunfan1223/azerothcore-wotlk/tree/Playerbot). Additionally, please [check the build status of our CI](https://github.com/liyunfan1223/mod-playerbots/actions). If the latest build is failing, rever to the last successful commit until we address the issue. +- **Why isn't my source compiling?** Please ensure that you are compiling with the required [custom branch of AzerothCore](https://github.com/mod-playerbots/azerothcore-wotlk/tree/Playerbot). Additionally, please [check the build status of our CI](https://github.com/mod-playerbots/mod-playerbots/actions). If the latest build is failing, rever to the last successful commit until we address the issue. ## Addons @@ -107,6 +107,6 @@ Typically, bots are controlled via chat commands. For larger bot groups, this ca Also, a thank you to the many contributors who've helped build this project: - - + + diff --git a/README_CN.md b/README_CN.md index 190c633b8d..61ea8bc4dc 100644 --- a/README_CN.md +++ b/README_CN.md @@ -8,16 +8,16 @@ ## 安装 -请注意,此模块需要对AzerothCore进行特定的自定义更改。为了确保兼容性,您必须使用我fork的自定义分支来编译它,可以在这里找到:[liyunfan1223/azerothcore-wotlk/tree/Playerbot](https://github.com/liyunfan1223/azerothcore-wotlk/tree/Playerbot)。 +请注意,此模块需要对AzerothCore进行特定的自定义更改。为了确保兼容性,您必须使用我fork的自定义分支来编译它,可以在这里找到:[mod-playerbots/azerothcore-wotlk/tree/Playerbot](https://github.com/mod-playerbots/azerothcore-wotlk/tree/Playerbot)。 要安装此模块,请参考AzerothCore Wiki的详细说明:[AzerothCore安装指南](https://www.azerothcore.org/wiki/installation)。 我们提供了一个简单的方法来克隆该模块: ```bash -git clone https://github.com/liyunfan1223/azerothcore-wotlk.git --branch=Playerbot +git clone https://github.com/mod-playerbots/azerothcore-wotlk.git --branch=Playerbot cd azerothcore-wotlk/modules -git clone https://github.com/liyunfan1223/mod-playerbots.git --branch=master +git clone https://github.com/mod-playerbots/mod-playerbots.git --branch=master ``` ## 快速开始与文档 @@ -60,7 +60,7 @@ git clone https://github.com/liyunfan1223/mod-playerbots.git --branch=master - 我们支持Ubuntu、Windows和macOS。 -- 我们建立了持续集成工作流。您可以在[GitHub Actions](https://github.com/liyunfan1223/mod-playerbots/actions)中查看构建状态。 +- 我们建立了持续集成工作流。您可以在[GitHub Actions](https://github.com/mod-playerbots/mod-playerbots/actions)中查看构建状态。 - 如果最新的构建状态失败,请恢复到上一个提交。我们将尽快解决此问题。 diff --git a/conf/playerbots.conf.dist b/conf/playerbots.conf.dist index 244fa9917c..75412a14d4 100644 --- a/conf/playerbots.conf.dist +++ b/conf/playerbots.conf.dist @@ -5,7 +5,7 @@ # Overview # "Randombot": randomly generated bots that log in separately from players and populate the world. Depending on settings, randombots may automatically grind, quest, and upgrade equipment and can be invited to groups and given commands. # "Altbot": characters created on player accounts, which may be logged in by the player and invited to groups and given commands like randombots. Depending on settings, altbots can be limited to characters on the active player's account or in the active player's guild. -# Information about commands to control bots and set their strategies can be found on the wiki at https://github.com/liyunfan1223/mod-playerbots/wiki/Playerbot-Commands. +# Information about commands to control bots and set their strategies can be found on the wiki at https://github.com/mod-playerbots/mod-playerbots/wiki/Playerbot-Commands. #################################################################################################### # SECTION INDEX diff --git a/src/Playerbots.cpp b/src/Playerbots.cpp index e3059056b6..1d6c436cb9 100644 --- a/src/Playerbots.cpp +++ b/src/Playerbots.cpp @@ -106,7 +106,7 @@ class PlayerbotsPlayerScript : public PlayerScript { ChatHandler(player->GetSession()).SendSysMessage( "|cff00ff00This server runs with |cff00ccffmod-playerbots|r " - "|cffcccccchttps://github.com/liyunfan1223/mod-playerbots|r"); + "|cffcccccchttps://github.com/mod-playerbots/mod-playerbots|r"); } if (sPlayerbotAIConfig->enabled || sPlayerbotAIConfig->randomBotAutologin) @@ -316,7 +316,7 @@ class PlayerbotsWorldScript : public WorldScript LOG_INFO("server.loading", "║ mod-playerbots is a community-driven open-source ║"); LOG_INFO("server.loading", "║ project based on AzerothCore, licensed under AGPLv3.0 ║"); LOG_INFO("server.loading", "╟──────────────────────────────────────────────────────────╢"); - LOG_INFO("server.loading", "║ https://github.com/liyunfan1223/mod-playerbots ║"); + LOG_INFO("server.loading", "║ https://github.com/mod-playerbots/mod-playerbots ║"); LOG_INFO("server.loading", "╚══════════════════════════════════════════════════════════╝"); uint32 oldMSTime = getMSTime(); From 3260ca1429d80bbd588916c327746dbbe891eb44 Mon Sep 17 00:00:00 2001 From: Crow Date: Tue, 14 Oct 2025 08:43:18 -0500 Subject: [PATCH 109/151] Cleanups to config and source (#1720) * general edits * Clarify comment for bot teleportation map IDs --- conf/playerbots.conf.dist | 37 +++++++++++---------- src/PlayerbotAIConfig.cpp | 57 ++++++++++++++++---------------- src/factory/PlayerbotFactory.cpp | 2 +- src/factory/PlayerbotFactory.h | 2 +- 4 files changed, 50 insertions(+), 48 deletions(-) diff --git a/conf/playerbots.conf.dist b/conf/playerbots.conf.dist index 75412a14d4..c38df8f09e 100644 --- a/conf/playerbots.conf.dist +++ b/conf/playerbots.conf.dist @@ -284,9 +284,6 @@ AiPlayerbot.TwoRoundsGearInit = 0 # # -# Bots will say information about items when collecting them -AiPlayerbot.SayWhenCollectingItems = 1 - # Bots keep looting when loot system is set to free for all # Default: 0 (disabled) AiPlayerbot.FreeMethodLoot = 0 @@ -360,15 +357,15 @@ AiPlayerbot.LootDelay = 1000 # # +# Distances are in yards AiPlayerbot.FarDistance = 20.0 -AiPlayerbot.SightDistance = 75.0 +AiPlayerbot.SightDistance = 100.0 AiPlayerbot.SpellDistance = 28.5 AiPlayerbot.ShootDistance = 5.0 -AiPlayerbot.ReactDistance = 150.0 -AiPlayerbot.GrindDistance = 75.0 AiPlayerbot.HealDistance = 38.5 AiPlayerbot.LootDistance = 15.0 AiPlayerbot.FleeDistance = 5.0 +AiPlayerbot.AggroDistance = 22 AiPlayerbot.TooCloseDistance = 5.0 AiPlayerbot.MeleeDistance = 0.75 AiPlayerbot.FollowDistance = 1.5 @@ -376,7 +373,8 @@ AiPlayerbot.WhisperDistance = 6000.0 AiPlayerbot.ContactDistance = 0.45 AiPlayerbot.AoeRadius = 10 AiPlayerbot.RpgDistance = 200 -AiPlayerbot.AggroDistance = 22 +AiPlayerbot.GrindDistance = 75.0 +AiPlayerbot.ReactDistance = 150.0 # # @@ -484,7 +482,8 @@ AiPlayerbot.RPWarningCooldown = 30 # # -# Enable/Disable maintenance command (learn all available spells and skills, supplement consumables, repair, enchant equipment if bot's level is above AiPlayerbot.MinEnchantingBotLevel) +# Enable/Disable maintenance command +# Learn all available spells and skills, refresh consumables, repair, enchant equipment and socket gems if bot's level is above AiPlayerbot.MinEnchantingBotLevel # Default: 1 (enabled) AiPlayerbot.MaintenanceCommand = 1 @@ -548,7 +547,7 @@ AiPlayerbot.AutoGearScoreLimit = 0 # "mana" (bots have infinite mana) # "power" (bots have infinite energy, rage, and runic power) # "taxi" (bots may use all flight paths, though they will not actually learn them) -# "raid" (bots use cheats implemented into raid strategies) +# "raid" (bots use cheats implemented into raid strategies (currently only for Ulduar)) # To use multiple cheats, separate them by commas below (e.g., to enable all, use "gold,health,mana,power,raid,taxi") # Default: food, taxi, and raid are enabled AiPlayerbot.BotCheats = "food,taxi,raid" @@ -606,9 +605,11 @@ AiPlayerbot.RandomBotMaxLevel = 80 AiPlayerbot.SyncLevelWithPlayers = 0 # Mark many quests ≤ bot level as complete (slows down bot creation) +# Default: 0 (disabled) AiPlayerbot.PreQuests = 0 # Enable LFG for randombots +# Default: 1 (enabled) AiPlayerbot.RandomBotJoinLfg = 1 # Enable/Disable periodic online - offline of randombots to mimic the real-world scenario where not all players are online simultaneously @@ -629,7 +630,8 @@ AiPlayerbot.RandomBotHordeRatio = 50 AiPlayerbot.DisableDeathKnightLogin = 0 # Enable simulated expansion limitation for talents and glyphs -# If enabled, limits talent trees to 5 rows plus the middle talent of the 6th row for bots until level 61 and 7 rows plus the middle talent of the 8th row for bots until level 71 +# If enabled, limits talent trees to 5 rows plus the middle talent of the 6th row for bots until level 61 +# and 7 rows plus the middle talent of the 8th row for bots from level 61 until level 71 # Default: 0 (disabled) AiPlayerbot.LimitTalentsExpansion = 0 @@ -713,8 +715,8 @@ AiPlayerbot.IncrementalGearInit = 1 # Default: 60 AiPlayerbot.MinEnchantingBotLevel = 60 -# Enable expansion limitation for bot enchants -# If enabled, bots will not use TBC enchants until level 61 or WotLK enchants until level 71 +# Enable expansion limitation for bot enchants and gems +# If enabled, bots will not use TBC enchants until level 61 or WotLK enchants and gems until level 71 # Default: 1 (enabled) AiPlayerbot.LimitEnchantExpansion = 1 @@ -810,7 +812,7 @@ AiPlayerbot.botActiveAloneSmartScaleWhenMaxLevel = 80 # # Quest that will be completed and rewarded for all randombots -AiPlayerbot.RandomBotQuestIds = "7848,3802,5505,6502,7761,10277,10285,11492,13188,13189,24499,24511,24710,24712" +AiPlayerbot.RandomBotQuestIds = "3802,5505,6502,7761,7848,10277,10285,11492,13188,13189,24499,24511,24710,24712" # Randombots will group with nearby randombots to do shared quests AiPlayerbot.RandomBotGroupNearby = 0 @@ -871,9 +873,9 @@ AiPlayerbot.RandomBotNonCombatStrategies = "" AiPlayerbot.CombatStrategies = "" AiPlayerbot.NonCombatStrategies = "" -# Remove "healer dps" strategy on specified maps. -# Default: 0 (disabled) -AiPlayerbot.HealerDPSMapRestriction = 0 +# Remove "healer dps" strategy on the maps specified below. +# Default: 1 (enabled) +AiPlayerbot.HealerDPSMapRestriction = 1 # List of Map IDs where "healer dps" strategy will be removed if AiPlayerbot.HealerDPSMapRestriction is enabled # Default: (Dungeon and Raid maps) "33,34,36,43,47,48,70,90,109,129,209,229,230,329,349,389,429,1001,1004,1007,269,540,542,543,545,546,547,552,553,554,555,556,557,558,560,585,574,575,576,578,595,599,600,601,602,604,608,619,632,650,658,668,409,469,509,531,532,534,544,548,550,564,565,580,249,533,603,615,616,624,631,649,724" @@ -1057,7 +1059,8 @@ AiPlayerbot.ZoneBracket.4197 = 79,80 # # -# Maps where bots can be teleported to +# Map IDs where bots can be teleported to +# Defaults: 0 = Eastern Kingdoms, 1 = Kalimdor, 530 = Outland, 571 = Northrend AiPlayerbot.RandomBotMaps = 0,1,530,571 # Probabilty bots teleport to banker (city) diff --git a/src/PlayerbotAIConfig.cpp b/src/PlayerbotAIConfig.cpp index 65b6f5bc0f..4e25935e76 100644 --- a/src/PlayerbotAIConfig.cpp +++ b/src/PlayerbotAIConfig.cpp @@ -62,50 +62,49 @@ bool PlayerbotAIConfig::Initialize() enabled = sConfigMgr->GetOption("AiPlayerbot.Enabled", true); if (!enabled) { - LOG_INFO("server.loading", "AI Playerbots is Disabled in aiplayerbot.conf"); + LOG_INFO("server.loading", "Playerbots Module is disabled in playerbots.conf"); return false; } - globalCoolDown = sConfigMgr->GetOption("AiPlayerbot.GlobalCooldown", 1500); + globalCoolDown = sConfigMgr->GetOption("AiPlayerbot.GlobalCooldown", 500); maxWaitForMove = sConfigMgr->GetOption("AiPlayerbot.MaxWaitForMove", 5000); disableMoveSplinePath = sConfigMgr->GetOption("AiPlayerbot.DisableMoveSplinePath", 0); maxMovementSearchTime = sConfigMgr->GetOption("AiPlayerbot.MaxMovementSearchTime", 3); expireActionTime = sConfigMgr->GetOption("AiPlayerbot.ExpireActionTime", 5000); - dispelAuraDuration = sConfigMgr->GetOption("AiPlayerbot.DispelAuraDuration", 7000); + dispelAuraDuration = sConfigMgr->GetOption("AiPlayerbot.DispelAuraDuration", 700); reactDelay = sConfigMgr->GetOption("AiPlayerbot.ReactDelay", 100); dynamicReactDelay = sConfigMgr->GetOption("AiPlayerbot.DynamicReactDelay", true); passiveDelay = sConfigMgr->GetOption("AiPlayerbot.PassiveDelay", 10000); repeatDelay = sConfigMgr->GetOption("AiPlayerbot.RepeatDelay", 2000); - errorDelay = sConfigMgr->GetOption("AiPlayerbot.ErrorDelay", 5000); + errorDelay = sConfigMgr->GetOption("AiPlayerbot.ErrorDelay", 100); rpgDelay = sConfigMgr->GetOption("AiPlayerbot.RpgDelay", 10000); - sitDelay = sConfigMgr->GetOption("AiPlayerbot.SitDelay", 30000); - returnDelay = sConfigMgr->GetOption("AiPlayerbot.ReturnDelay", 7000); + sitDelay = sConfigMgr->GetOption("AiPlayerbot.SitDelay", 20000); + returnDelay = sConfigMgr->GetOption("AiPlayerbot.ReturnDelay", 2000); lootDelay = sConfigMgr->GetOption("AiPlayerbot.LootDelay", 1000); - // Buff system minBotsForGreaterBuff = sConfigMgr->GetOption("AiPlayerbot.MinBotsForGreaterBuff", 3); rpWarningCooldown = sConfigMgr->GetOption("AiPlayerbot.RPWarningCooldown", 30); disabledWithoutRealPlayerLoginDelay = sConfigMgr->GetOption("AiPlayerbot.DisabledWithoutRealPlayerLoginDelay", 30); disabledWithoutRealPlayerLogoutDelay = sConfigMgr->GetOption("AiPlayerbot.DisabledWithoutRealPlayerLogoutDelay", 300); farDistance = sConfigMgr->GetOption("AiPlayerbot.FarDistance", 20.0f); - sightDistance = sConfigMgr->GetOption("AiPlayerbot.SightDistance", 75.0f); - spellDistance = sConfigMgr->GetOption("AiPlayerbot.SpellDistance", 25.0f); - shootDistance = sConfigMgr->GetOption("AiPlayerbot.ShootDistance", 25.0f); - healDistance = sConfigMgr->GetOption("AiPlayerbot.HealDistance", 25.0f); + sightDistance = sConfigMgr->GetOption("AiPlayerbot.SightDistance", 100.0f); + spellDistance = sConfigMgr->GetOption("AiPlayerbot.SpellDistance", 28.5f); + shootDistance = sConfigMgr->GetOption("AiPlayerbot.ShootDistance", 5.0f); + healDistance = sConfigMgr->GetOption("AiPlayerbot.HealDistance", 38.5f); lootDistance = sConfigMgr->GetOption("AiPlayerbot.LootDistance", 15.0f); - fleeDistance = sConfigMgr->GetOption("AiPlayerbot.FleeDistance", 7.5f); + fleeDistance = sConfigMgr->GetOption("AiPlayerbot.FleeDistance", 5.0f); aggroDistance = sConfigMgr->GetOption("AiPlayerbot.AggroDistance", 22.0f); tooCloseDistance = sConfigMgr->GetOption("AiPlayerbot.TooCloseDistance", 5.0f); meleeDistance = sConfigMgr->GetOption("AiPlayerbot.MeleeDistance", 0.75f); followDistance = sConfigMgr->GetOption("AiPlayerbot.FollowDistance", 1.5f); whisperDistance = sConfigMgr->GetOption("AiPlayerbot.WhisperDistance", 6000.0f); - contactDistance = sConfigMgr->GetOption("AiPlayerbot.ContactDistance", 0.5f); - aoeRadius = sConfigMgr->GetOption("AiPlayerbot.AoeRadius", 5.0f); + contactDistance = sConfigMgr->GetOption("AiPlayerbot.ContactDistance", 0.45f); + aoeRadius = sConfigMgr->GetOption("AiPlayerbot.AoeRadius", 10.0f); rpgDistance = sConfigMgr->GetOption("AiPlayerbot.RpgDistance", 200.0f); grindDistance = sConfigMgr->GetOption("AiPlayerbot.GrindDistance", 75.0f); reactDistance = sConfigMgr->GetOption("AiPlayerbot.ReactDistance", 150.0f); - criticalHealth = sConfigMgr->GetOption("AiPlayerbot.CriticalHealth", 20); + criticalHealth = sConfigMgr->GetOption("AiPlayerbot.CriticalHealth", 25); lowHealth = sConfigMgr->GetOption("AiPlayerbot.LowHealth", 45); mediumHealth = sConfigMgr->GetOption("AiPlayerbot.MediumHealth", 65); almostFullHealth = sConfigMgr->GetOption("AiPlayerbot.AlmostFullHealth", 85); @@ -116,7 +115,7 @@ bool PlayerbotAIConfig::Initialize() saveManaThreshold = sConfigMgr->GetOption("AiPlayerbot.SaveManaThreshold", 60); autoAvoidAoe = sConfigMgr->GetOption("AiPlayerbot.AutoAvoidAoe", true); maxAoeAvoidRadius = sConfigMgr->GetOption("AiPlayerbot.MaxAoeAvoidRadius", 15.0f); - LoadSet>(sConfigMgr->GetOption("AiPlayerbot.AoeAvoidSpellWhitelist", "50759,57491,13810"), + LoadSet>(sConfigMgr->GetOption("AiPlayerbot.AoeAvoidSpellWhitelist", "50759,57491,13810,29946"), aoeAvoidSpellWhitelist); tellWhenAvoidAoe = sConfigMgr->GetOption("AiPlayerbot.TellWhenAvoidAoe", false); @@ -129,7 +128,7 @@ bool PlayerbotAIConfig::Initialize() randomBotMaxLevelChance = sConfigMgr->GetOption("AiPlayerbot.RandomBotMaxLevelChance", 0.1f); randomBotRpgChance = sConfigMgr->GetOption("AiPlayerbot.RandomBotRpgChance", 0.20f); - iterationsPerTick = sConfigMgr->GetOption("AiPlayerbot.IterationsPerTick", 100); + iterationsPerTick = sConfigMgr->GetOption("AiPlayerbot.IterationsPerTick", 10); allowAccountBots = sConfigMgr->GetOption("AiPlayerbot.AllowAccountBots", true); allowGuildBots = sConfigMgr->GetOption("AiPlayerbot.AllowGuildBots", true); @@ -143,11 +142,11 @@ bool PlayerbotAIConfig::Initialize() LoadList>(randomBotMapsAsString, randomBotMaps); probTeleToBankers = sConfigMgr->GetOption("AiPlayerbot.ProbTeleToBankers", 0.25f); enableWeightTeleToCityBankers = sConfigMgr->GetOption("AiPlayerbot.EnableWeightTeleToCityBankers", false); - weightTeleToStormwind = sConfigMgr->GetOption("AiPlayerbot.TeleToStormwindWeight", 1); + weightTeleToStormwind = sConfigMgr->GetOption("AiPlayerbot.TeleToStormwindWeight", 2); weightTeleToIronforge = sConfigMgr->GetOption("AiPlayerbot.TeleToIronforgeWeight", 1); weightTeleToDarnassus = sConfigMgr->GetOption("AiPlayerbot.TeleToDarnassusWeight", 1); weightTeleToExodar = sConfigMgr->GetOption("AiPlayerbot.TeleToExodarWeight", 1); - weightTeleToOrgrimmar = sConfigMgr->GetOption("AiPlayerbot.TeleToOrgrimmarWeight", 1); + weightTeleToOrgrimmar = sConfigMgr->GetOption("AiPlayerbot.TeleToOrgrimmarWeight", 2); weightTeleToUndercity = sConfigMgr->GetOption("AiPlayerbot.TeleToUndercityWeight", 1); weightTeleToThunderBluff = sConfigMgr->GetOption("AiPlayerbot.TeleToThunderBluffWeight", 1); weightTeleToSilvermoonCity = sConfigMgr->GetOption("AiPlayerbot.TeleToSilvermoonCityWeight", 1); @@ -155,7 +154,7 @@ bool PlayerbotAIConfig::Initialize() weightTeleToDalaran = sConfigMgr->GetOption("AiPlayerbot.TeleToDalaranWeight", 1); LoadList>( sConfigMgr->GetOption("AiPlayerbot.RandomBotQuestItems", - "6948,5175,5176,5177,5178,16309,12382,13704,11000"), + "5175,5176,5177,5178,6948,11000,12382,13704,16309"), randomBotQuestItems); LoadList>(sConfigMgr->GetOption("AiPlayerbot.RandomBotSpellIds", "54197"), randomBotSpellIds); @@ -170,7 +169,7 @@ bool PlayerbotAIConfig::Initialize() pvpProhibitedAreaIds); fastReactInBG = sConfigMgr->GetOption("AiPlayerbot.FastReactInBG", true); LoadList>( - sConfigMgr->GetOption("AiPlayerbot.RandomBotQuestIds", "7848,3802,5505,6502,7761,10277,10285,11492,13188,13189,24499,24511,24710,24712"), + sConfigMgr->GetOption("AiPlayerbot.RandomBotQuestIds", "3802,5505,6502,7761,7848,10277,10285,11492,13188,13189,24499,24511,24710,24712"), randomBotQuestIds); LoadSet>( @@ -181,8 +180,8 @@ bool PlayerbotAIConfig::Initialize() disallowedGameObjects); botAutologin = sConfigMgr->GetOption("AiPlayerbot.BotAutologin", false); randomBotAutologin = sConfigMgr->GetOption("AiPlayerbot.RandomBotAutologin", true); - minRandomBots = sConfigMgr->GetOption("AiPlayerbot.MinRandomBots", 50); - maxRandomBots = sConfigMgr->GetOption("AiPlayerbot.MaxRandomBots", 50); + minRandomBots = sConfigMgr->GetOption("AiPlayerbot.MinRandomBots", 500); + maxRandomBots = sConfigMgr->GetOption("AiPlayerbot.MaxRandomBots", 500); randomBotUpdateInterval = sConfigMgr->GetOption("AiPlayerbot.RandomBotUpdateInterval", 20); randomBotCountChangeMinInterval = sConfigMgr->GetOption("AiPlayerbot.RandomBotCountChangeMinInterval", 30 * MINUTE); @@ -391,8 +390,8 @@ bool PlayerbotAIConfig::Initialize() randomBotCombatStrategies = sConfigMgr->GetOption("AiPlayerbot.RandomBotCombatStrategies", ""); randomBotNonCombatStrategies = sConfigMgr->GetOption("AiPlayerbot.RandomBotNonCombatStrategies", ""); - combatStrategies = sConfigMgr->GetOption("AiPlayerbot.CombatStrategies", "+custom::say"); - nonCombatStrategies = sConfigMgr->GetOption("AiPlayerbot.NonCombatStrategies", "+custom::say,+return"); + combatStrategies = sConfigMgr->GetOption("AiPlayerbot.CombatStrategies", ""); + nonCombatStrategies = sConfigMgr->GetOption("AiPlayerbot.NonCombatStrategies", ""); applyInstanceStrategies = sConfigMgr->GetOption("AiPlayerbot.ApplyInstanceStrategies", true); commandPrefix = sConfigMgr->GetOption("AiPlayerbot.CommandPrefix", ""); @@ -512,7 +511,7 @@ bool PlayerbotAIConfig::Initialize() randomBotGuildSizeMax = sConfigMgr->GetOption("AiPlayerbot.RandomBotGuildSizeMax", 15); deleteRandomBotGuilds = sConfigMgr->GetOption("AiPlayerbot.DeleteRandomBotGuilds", false); - guildTaskEnabled = sConfigMgr->GetOption("AiPlayerbot.EnableGuildTasks", true); + guildTaskEnabled = sConfigMgr->GetOption("AiPlayerbot.EnableGuildTasks", false); minGuildTaskChangeTime = sConfigMgr->GetOption("AiPlayerbot.MinGuildTaskChangeTime", 3 * 24 * 3600); maxGuildTaskChangeTime = sConfigMgr->GetOption("AiPlayerbot.MaxGuildTaskChangeTime", 4 * 24 * 3600); minGuildTaskAdvertisementTime = sConfigMgr->GetOption("AiPlayerbot.MinGuildTaskAdvertisementTime", 300); @@ -598,12 +597,12 @@ bool PlayerbotAIConfig::Initialize() minEnchantingBotLevel = sConfigMgr->GetOption("AiPlayerbot.MinEnchantingBotLevel", 60); limitEnchantExpansion = sConfigMgr->GetOption("AiPlayerbot.LimitEnchantExpansion", 1); limitGearExpansion = sConfigMgr->GetOption("AiPlayerbot.LimitGearExpansion", 1); - randombotStartingLevel = sConfigMgr->GetOption("AiPlayerbot.RandombotStartingLevel", 5); + randombotStartingLevel = sConfigMgr->GetOption("AiPlayerbot.RandombotStartingLevel", 1); enablePeriodicOnlineOffline = sConfigMgr->GetOption("AiPlayerbot.EnablePeriodicOnlineOffline", false); enableRandomBotTrading = sConfigMgr->GetOption("AiPlayerbot.EnableRandomBotTrading", 1); periodicOnlineOfflineRatio = sConfigMgr->GetOption("AiPlayerbot.PeriodicOnlineOfflineRatio", 2.0); gearscorecheck = sConfigMgr->GetOption("AiPlayerbot.GearScoreCheck", false); - randomBotPreQuests = sConfigMgr->GetOption("AiPlayerbot.PreQuests", true); + randomBotPreQuests = sConfigMgr->GetOption("AiPlayerbot.PreQuests", false); // SPP automation freeMethodLoot = sConfigMgr->GetOption("AiPlayerbot.FreeMethodLoot", false); @@ -636,7 +635,7 @@ bool PlayerbotAIConfig::Initialize() RpgStatusProbWeight[RPG_REST] = sConfigMgr->GetOption("AiPlayerbot.RpgStatusProbWeight.Rest", 5); syncLevelWithPlayers = sConfigMgr->GetOption("AiPlayerbot.SyncLevelWithPlayers", false); - randomBotGroupNearby = sConfigMgr->GetOption("AiPlayerbot.RandomBotGroupNearby", true); + randomBotGroupNearby = sConfigMgr->GetOption("AiPlayerbot.RandomBotGroupNearby", false); // arena randomBotArenaTeam2v2Count = sConfigMgr->GetOption("AiPlayerbot.RandomBotArenaTeam2v2Count", 10); diff --git a/src/factory/PlayerbotFactory.cpp b/src/factory/PlayerbotFactory.cpp index 9eed6a5f4d..af1552a3f9 100644 --- a/src/factory/PlayerbotFactory.cpp +++ b/src/factory/PlayerbotFactory.cpp @@ -4287,7 +4287,7 @@ void PlayerbotFactory::ApplyEnchantTemplate(uint8 spec) // const SpellItemEnchantmentEntry* a = sSpellItemEnchantmentStore.LookupEntry(1); } -void PlayerbotFactory::ApplyEnchantAndGemsNew(bool destoryOld) +void PlayerbotFactory::ApplyEnchantAndGemsNew(bool destroyOld) { //int32 bestGemEnchantId[4] = {-1, -1, -1, -1}; // 1, 2, 4, 8 color //not used, line marked for removal. //float bestGemScore[4] = {0, 0, 0, 0}; //not used, line marked for removal. diff --git a/src/factory/PlayerbotFactory.h b/src/factory/PlayerbotFactory.h index 2fec9fcda6..109d710957 100644 --- a/src/factory/PlayerbotFactory.h +++ b/src/factory/PlayerbotFactory.h @@ -79,7 +79,7 @@ class PlayerbotFactory void InitFood(); void InitMounts(); void InitBags(bool destroyOld = true); - void ApplyEnchantAndGemsNew(bool destoryOld = true); + void ApplyEnchantAndGemsNew(bool destroyOld = true); void InitInstanceQuests(); void UnbindInstance(); void InitKeyring(); From f791ab61c4ab67377d35b0e50db728c64cf49a73 Mon Sep 17 00:00:00 2001 From: Crow Date: Thu, 16 Oct 2025 15:43:49 -0500 Subject: [PATCH 110/151] Update server loading message --- src/PlayerbotAIConfig.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/PlayerbotAIConfig.cpp b/src/PlayerbotAIConfig.cpp index 4e25935e76..82f662ec4a 100644 --- a/src/PlayerbotAIConfig.cpp +++ b/src/PlayerbotAIConfig.cpp @@ -57,7 +57,7 @@ void LoadListString(std::string const value, T& list) bool PlayerbotAIConfig::Initialize() { - LOG_INFO("server.loading", "Initializing AI Playerbots by ike3, based on the original Playerbots by blueboy"); + LOG_INFO("server.loading", "Initializing mod-playerbots, based on AI Playerbots by ike and the original Playerbots by blueboy"); enabled = sConfigMgr->GetOption("AiPlayerbot.Enabled", true); if (!enabled) @@ -678,7 +678,7 @@ bool PlayerbotAIConfig::Initialize() LoadList>(sConfigMgr->GetOption("AiPlayerbot.ExcludedHunterPetFamilies", ""), excludedHunterPetFamilies); LOG_INFO("server.loading", "---------------------------------------"); - LOG_INFO("server.loading", " AI Playerbots initialized "); + LOG_INFO("server.loading", " mod-playerbots initialized "); LOG_INFO("server.loading", "---------------------------------------"); return true; From 553b8276eb8d0d9dfac9fd35e61ef6a47162b4da Mon Sep 17 00:00:00 2001 From: kikiviki <79366880+kikiviki@users.noreply.github.com> Date: Sat, 18 Oct 2025 16:17:44 -0400 Subject: [PATCH 111/151] Heirloom quality auto-equip calculation implemented (#1732) * Heirloom quality auto-equip calculation implemented --- src/factory/StatsWeightCalculator.cpp | 15 ++++++++++++--- 1 file changed, 12 insertions(+), 3 deletions(-) diff --git a/src/factory/StatsWeightCalculator.cpp b/src/factory/StatsWeightCalculator.cpp index a42ce6f296..95903ebaa8 100644 --- a/src/factory/StatsWeightCalculator.cpp +++ b/src/factory/StatsWeightCalculator.cpp @@ -92,10 +92,19 @@ float StatsWeightCalculator::CalculateItem(uint32 itemId, int32 randomPropertyId CalculateSocketBonus(player_, proto); if (enable_quality_blend_) - // Blend with item quality and level - weight_ *= PlayerbotFactory::CalcMixedGearScore(proto->ItemLevel, proto->Quality); + { + // Heirloom items scale with player level + // Use player level as effective item level for heirlooms - Quality EPIC + // Else - Blend with item quality and level for normal items + if (proto->Quality == ITEM_QUALITY_HEIRLOOM) + weight_ *= PlayerbotFactory::CalcMixedGearScore(lvl, ITEM_QUALITY_EPIC); + + else + weight_ *= PlayerbotFactory::CalcMixedGearScore(proto->ItemLevel, proto->Quality); + + return weight_; + } - return weight_; } float StatsWeightCalculator::CalculateEnchant(uint32 enchantId) From 10ce94e065f226b4b73c559e3aec36ef068ced9b Mon Sep 17 00:00:00 2001 From: bash <31279994+hermensbas@users.noreply.github.com> Date: Sat, 18 Oct 2025 22:32:43 +0200 Subject: [PATCH 112/151] Removal space lel (#1740) --- src/factory/StatsWeightCalculator.cpp | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/src/factory/StatsWeightCalculator.cpp b/src/factory/StatsWeightCalculator.cpp index 95903ebaa8..1bfa73d4f4 100644 --- a/src/factory/StatsWeightCalculator.cpp +++ b/src/factory/StatsWeightCalculator.cpp @@ -97,8 +97,7 @@ float StatsWeightCalculator::CalculateItem(uint32 itemId, int32 randomPropertyId // Use player level as effective item level for heirlooms - Quality EPIC // Else - Blend with item quality and level for normal items if (proto->Quality == ITEM_QUALITY_HEIRLOOM) - weight_ *= PlayerbotFactory::CalcMixedGearScore(lvl, ITEM_QUALITY_EPIC); - + weight_ *= PlayerbotFactory::CalcMixedGearScore(lvl, ITEM_QUALITY_EPIC); else weight_ *= PlayerbotFactory::CalcMixedGearScore(proto->ItemLevel, proto->Quality); From e693b208bed69267f859b6947b416419b0c64b76 Mon Sep 17 00:00:00 2001 From: SaW Date: Sat, 18 Oct 2025 22:54:52 +0200 Subject: [PATCH 113/151] FIX: ICC - default return position for BQL (#1737) --- src/strategy/raids/icecrown/RaidIccMultipliers.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/strategy/raids/icecrown/RaidIccMultipliers.cpp b/src/strategy/raids/icecrown/RaidIccMultipliers.cpp index 99c6b4e5b4..8c71110305 100644 --- a/src/strategy/raids/icecrown/RaidIccMultipliers.cpp +++ b/src/strategy/raids/icecrown/RaidIccMultipliers.cpp @@ -472,7 +472,6 @@ float IccBqlMultiplier::GetValue(Action* action) else return 0.0f; // Cancel all other actions when we need to handle Swarming Shadows } - return 1.0f; if ((boss->GetExactDist2d(ICC_BQL_TANK_POSITION.GetPositionX(), ICC_BQL_TANK_POSITION.GetPositionY()) > 10.0f) && botAI->IsRanged(bot) && !((boss->GetPositionZ() - bot->GetPositionZ()) > 5.0f)) @@ -481,6 +480,7 @@ float IccBqlMultiplier::GetValue(Action* action) return 0.0f; } + return 1.0f; } //VDW From 5a4acbe36c21768a1ce836595b97cc484df9d1fc Mon Sep 17 00:00:00 2001 From: SaW Date: Mon, 20 Oct 2025 01:04:11 +0200 Subject: [PATCH 114/151] Update PvpValues.cpp (#1746) Set uninitialized variable Remove std::move --- src/strategy/values/PvpValues.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/strategy/values/PvpValues.cpp b/src/strategy/values/PvpValues.cpp index f295f65087..e01b56ef2c 100644 --- a/src/strategy/values/PvpValues.cpp +++ b/src/strategy/values/PvpValues.cpp @@ -102,7 +102,7 @@ std::vector BgMastersValue::Calculate() } } - return std::move(bmGuids); + return bmGuids; } CreatureData const* BgMasterValue::Calculate() @@ -120,7 +120,7 @@ CreatureData const* BgMasterValue::NearestBm(bool allowDead) std::vector bmPairs = AI_VALUE2(std::vector, "bg masters", qualifier); - float rDist; + float rDist = 0.0f; CreatureData const* rbmPair = nullptr; for (auto& bmPair : bmPairs) From f874d2c79ebf179795b3a5fd2fd7d58d0ba7ac6b Mon Sep 17 00:00:00 2001 From: Crow Date: Sun, 19 Oct 2025 18:05:45 -0500 Subject: [PATCH 115/151] Fix typo in server loading message (#1742) --- src/PlayerbotAIConfig.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/PlayerbotAIConfig.cpp b/src/PlayerbotAIConfig.cpp index 82f662ec4a..42ab801fb5 100644 --- a/src/PlayerbotAIConfig.cpp +++ b/src/PlayerbotAIConfig.cpp @@ -57,7 +57,7 @@ void LoadListString(std::string const value, T& list) bool PlayerbotAIConfig::Initialize() { - LOG_INFO("server.loading", "Initializing mod-playerbots, based on AI Playerbots by ike and the original Playerbots by blueboy"); + LOG_INFO("server.loading", "Initializing mod-playerbots, based on AI Playerbots by ike3 and the original Playerbots by blueboy"); enabled = sConfigMgr->GetOption("AiPlayerbot.Enabled", true); if (!enabled) From 2c5185a7cbbd901e61583ab466584df0f75fa22c Mon Sep 17 00:00:00 2001 From: Alex Dcnh <140754794+Wishmaster117@users.noreply.github.com> Date: Mon, 20 Oct 2025 12:17:59 +0100 Subject: [PATCH 116/151] Update StatsWeightCalculator.cpp (#1744) --- src/factory/StatsWeightCalculator.cpp | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/factory/StatsWeightCalculator.cpp b/src/factory/StatsWeightCalculator.cpp index 1bfa73d4f4..fa9e8a83b8 100644 --- a/src/factory/StatsWeightCalculator.cpp +++ b/src/factory/StatsWeightCalculator.cpp @@ -103,7 +103,8 @@ float StatsWeightCalculator::CalculateItem(uint32 itemId, int32 randomPropertyId return weight_; } - + // If quality/level blending is disabled, also return the calculated weight. + return weight_; } float StatsWeightCalculator::CalculateEnchant(uint32 enchantId) From 50ac6e5b95666b708d44d2e9fa79ebe2881d5848 Mon Sep 17 00:00:00 2001 From: bash <31279994+hermensbas@users.noreply.github.com> Date: Mon, 20 Oct 2025 14:12:14 +0200 Subject: [PATCH 117/151] core_merge_changes (#1747) --- src/strategy/actions/ChatActionContext.h | 6 +++--- src/strategy/actions/MovementActions.cpp | 6 +++--- src/strategy/actions/{PetAction.cpp => PetsAction.cpp} | 4 ++-- src/strategy/actions/{PetAction.h => PetsAction.h} | 8 ++++---- src/strategy/actions/WorldPacketActionContext.h | 4 ++-- 5 files changed, 14 insertions(+), 14 deletions(-) rename src/strategy/actions/{PetAction.cpp => PetsAction.cpp} (99%) rename src/strategy/actions/{PetAction.h => PetsAction.h} (67%) diff --git a/src/strategy/actions/ChatActionContext.h b/src/strategy/actions/ChatActionContext.h index cb617e3e87..0859b37bf8 100644 --- a/src/strategy/actions/ChatActionContext.h +++ b/src/strategy/actions/ChatActionContext.h @@ -82,7 +82,7 @@ #include "TameAction.h" #include "TellGlyphsAction.h" #include "EquipGlyphsAction.h" -#include "PetAction.h" +#include "PetsAction.h" class ChatActionContext : public NamedObjectContext { @@ -307,8 +307,8 @@ class ChatActionContext : public NamedObjectContext static Action* tame(PlayerbotAI* botAI) { return new TameAction(botAI); } static Action* glyphs(PlayerbotAI* botAI) { return new TellGlyphsAction(botAI); } // Added for custom Glyphs static Action* glyph_equip(PlayerbotAI* ai) { return new EquipGlyphsAction(ai); } // Added for custom Glyphs - static Action* pet(PlayerbotAI* botAI) { return new PetAction(botAI); } - static Action* pet_attack(PlayerbotAI* botAI) { return new PetAction(botAI, "attack"); } + static Action* pet(PlayerbotAI* botAI) { return new PetsAction(botAI); } + static Action* pet_attack(PlayerbotAI* botAI) { return new PetsAction(botAI, "attack"); } static Action* roll_action(PlayerbotAI* botAI) { return new RollAction(botAI); } }; diff --git a/src/strategy/actions/MovementActions.cpp b/src/strategy/actions/MovementActions.cpp index 6758b91686..9c84447f9b 100644 --- a/src/strategy/actions/MovementActions.cpp +++ b/src/strategy/actions/MovementActions.cpp @@ -210,7 +210,7 @@ bool MovementAction::MoveTo(uint32 mapId, float x, float y, float z, bool idle, mm.Clear(); if (!backwards) { - mm.MovePoint(0, x, y, z, generatePath); + mm.MovePoint(0, x, y, z, FORCED_MOVEMENT_NONE, 0.0f, 0.0f, generatePath); } else { @@ -245,7 +245,7 @@ bool MovementAction::MoveTo(uint32 mapId, float x, float y, float z, bool idle, mm.Clear(); if (!backwards) { - mm.MovePoint(0, x, y, z, generatePath); + mm.MovePoint(0, x, y, z, FORCED_MOVEMENT_NONE, 0.0f, 0.0f, generatePath); } else { @@ -287,7 +287,7 @@ bool MovementAction::MoveTo(uint32 mapId, float x, float y, float z, bool idle, mm.Clear(); if (!backwards) { - mm.MovePoint(0, x, y, z, generatePath); + mm.MovePoint(0, x, y, z, FORCED_MOVEMENT_NONE, 0.0f, 0.0f, generatePath); } else { diff --git a/src/strategy/actions/PetAction.cpp b/src/strategy/actions/PetsAction.cpp similarity index 99% rename from src/strategy/actions/PetAction.cpp rename to src/strategy/actions/PetsAction.cpp index 963ff09b16..945a883672 100644 --- a/src/strategy/actions/PetAction.cpp +++ b/src/strategy/actions/PetsAction.cpp @@ -3,7 +3,7 @@ * and/or modify it under version 3 of the License, or (at your option), any later version. */ -#include "PetAction.h" +#include "PetsAction.h" #include "CharmInfo.h" #include "Creature.h" @@ -13,7 +13,7 @@ #include "PlayerbotAI.h" #include "SharedDefines.h" -bool PetAction::Execute(Event event) +bool PetsAction::Execute(Event event) { // Extract the command parameter from the event (e.g., "aggressive", "defensive", "attack", etc.) std::string param = event.getParam(); diff --git a/src/strategy/actions/PetAction.h b/src/strategy/actions/PetsAction.h similarity index 67% rename from src/strategy/actions/PetAction.h rename to src/strategy/actions/PetsAction.h index ed4af4d86d..f9334e3194 100644 --- a/src/strategy/actions/PetAction.h +++ b/src/strategy/actions/PetsAction.h @@ -3,8 +3,8 @@ * and/or modify it under version 3 of the License, or (at your option), any later version. */ -#ifndef _PLAYERBOT_PETACTION_H -#define _PLAYERBOT_PETACTION_H +#ifndef _PLAYERBOT_PETSACTION_H +#define _PLAYERBOT_PETSACTION_H #include @@ -14,10 +14,10 @@ class PlayerbotAI; -class PetAction : public Action +class PetsAction : public Action { public: - PetAction(PlayerbotAI* botAI, const std::string& defaultCmd = "") : Action(botAI, "pet"), defaultCmd(defaultCmd) {} + PetsAction(PlayerbotAI* botAI, const std::string& defaultCmd = "") : Action(botAI, "pet"), defaultCmd(defaultCmd) {} bool Execute(Event event) override; diff --git a/src/strategy/actions/WorldPacketActionContext.h b/src/strategy/actions/WorldPacketActionContext.h index bada772c47..59c0550368 100644 --- a/src/strategy/actions/WorldPacketActionContext.h +++ b/src/strategy/actions/WorldPacketActionContext.h @@ -41,7 +41,7 @@ #include "UseMeetingStoneAction.h" #include "NamedObjectContext.h" #include "ReleaseSpiritAction.h" -#include "PetAction.h" +#include "PetsAction.h" class PlayerbotAI; @@ -141,7 +141,7 @@ class WorldPacketActionContext : public NamedObjectContext static Action* tell_not_enough_reputation(PlayerbotAI* botAI) { return new TellMasterAction(botAI, "Not enough reputation"); } static Action* tell_cannot_equip(PlayerbotAI* botAI) { return new InventoryChangeFailureAction(botAI); } static Action* self_resurrect(PlayerbotAI* botAI) { return new SelfResurrectAction(botAI); } - static Action* pet(PlayerbotAI* botAI) { return new PetAction(botAI); } + static Action* pet(PlayerbotAI* botAI) { return new PetsAction(botAI); } // quest static Action* quest_update_add_kill(PlayerbotAI* ai) { return new QuestUpdateAddKillAction(ai); } From e0df6558f585ea8c4007f74af426bc4bec5ed101 Mon Sep 17 00:00:00 2001 From: bash <31279994+hermensbas@users.noreply.github.com> Date: Mon, 20 Oct 2025 18:20:46 +0200 Subject: [PATCH 118/151] Added shaman default combat strategy names on top of custom (#1739) --- src/strategy/shaman/ShamanAiObjectContext.cpp | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/src/strategy/shaman/ShamanAiObjectContext.cpp b/src/strategy/shaman/ShamanAiObjectContext.cpp index dc7145e7fc..08ee3638d9 100644 --- a/src/strategy/shaman/ShamanAiObjectContext.cpp +++ b/src/strategy/shaman/ShamanAiObjectContext.cpp @@ -41,6 +41,11 @@ class ShamanCombatStrategyFactoryInternal : public NamedObjectContext public: ShamanCombatStrategyFactoryInternal() : NamedObjectContext(false, true) { + creators["heal"] = &ShamanCombatStrategyFactoryInternal::resto; + creators["melee"] = &ShamanCombatStrategyFactoryInternal::enh; + creators["dps"] = &ShamanCombatStrategyFactoryInternal::enh; + creators["caster"] = &ShamanCombatStrategyFactoryInternal::ele; + //creators["offheal"] = &ShamanCombatStrategyFactoryInternal::offheal; creators["resto"] = &ShamanCombatStrategyFactoryInternal::resto; creators["enh"] = &ShamanCombatStrategyFactoryInternal::enh; creators["ele"] = &ShamanCombatStrategyFactoryInternal::ele; From 7e810f8174b2e70d300310c0d740e52ebea655a2 Mon Sep 17 00:00:00 2001 From: bash <31279994+hermensbas@users.noreply.github.com> Date: Mon, 20 Oct 2025 21:46:51 +0200 Subject: [PATCH 119/151] Update README.md (#1750) --- README.md | 3 +++ 1 file changed, 3 insertions(+) diff --git a/README.md b/README.md index f77cdb96f8..5007b49b82 100644 --- a/README.md +++ b/README.md @@ -93,6 +93,9 @@ The [Playerbots Wiki](https://github.com/mod-playerbots/mod-playerbots/wiki) con - **What platforms are supported?** We support Ubuntu, Windows, and macOS. Other Linux distros may work, but will not receive support. - **Why isn't my source compiling?** Please ensure that you are compiling with the required [custom branch of AzerothCore](https://github.com/mod-playerbots/azerothcore-wotlk/tree/Playerbot). Additionally, please [check the build status of our CI](https://github.com/mod-playerbots/mod-playerbots/actions). If the latest build is failing, rever to the last successful commit until we address the issue. +## Code standards +- https://www.azerothcore.org/wiki/cpp-code-standards + ## Addons Typically, bots are controlled via chat commands. For larger bot groups, this can be unwieldy. As an alternative, community members have developed client Add-Ons to allow controlling bots through the in-game UI. We recommend you check out their projects: From 6e1c9114df9be02acad3accca0df575b491eaa53 Mon Sep 17 00:00:00 2001 From: SaW Date: Tue, 21 Oct 2025 10:36:10 +0200 Subject: [PATCH 120/151] FIX: part of logic in picking quest reward (#1752) * FIX: part of logic in picking reward Avoids dereferencing begin() after confirming the set is empty. * Update TalkToQuestGiverAction.cpp --- src/strategy/actions/TalkToQuestGiverAction.cpp | 15 ++++++++------- 1 file changed, 8 insertions(+), 7 deletions(-) diff --git a/src/strategy/actions/TalkToQuestGiverAction.cpp b/src/strategy/actions/TalkToQuestGiverAction.cpp index ad87a550d0..7f791d0d63 100644 --- a/src/strategy/actions/TalkToQuestGiverAction.cpp +++ b/src/strategy/actions/TalkToQuestGiverAction.cpp @@ -205,17 +205,18 @@ void TalkToQuestGiverAction::RewardMultipleItem(Quest const* quest, Object* ques } else { - // Try to pick the usable item. If multiple list usable rewards. + // Try to pick the usable item. If multiple, list usable rewards. bestIds = BestRewards(quest); - if (!bestIds.empty()) - { + + if (bestIds.size() > 1) AskToSelectReward(quest, out, true); - } - else + + else if (!bestIds.empty()) { // Pick the first item - ItemTemplate const* item = sObjectMgr->GetItemTemplate(quest->RewardChoiceItemId[*bestIds.begin()]); - bot->RewardQuest(quest, *bestIds.begin(), questGiver, true); + uint32 firstId = *bestIds.begin(); + ItemTemplate const* item = sObjectMgr->GetItemTemplate(quest->RewardChoiceItemId[firstId]); + bot->RewardQuest(quest, firstId, questGiver, true); out << "Rewarded " << ChatHelper::FormatItem(item); } From 1d19dea9746bc7fb26db56dd9af0232c832e7be0 Mon Sep 17 00:00:00 2001 From: Iain Donnelly Date: Wed, 22 Oct 2025 23:53:42 +0100 Subject: [PATCH 121/151] Update RandomPlayerbotFactory.cpp --- src/RandomPlayerbotFactory.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/RandomPlayerbotFactory.cpp b/src/RandomPlayerbotFactory.cpp index 48531b96cb..ceed748d42 100644 --- a/src/RandomPlayerbotFactory.cpp +++ b/src/RandomPlayerbotFactory.cpp @@ -898,7 +898,7 @@ void RandomPlayerbotFactory::CreateRandomGuilds() const uint32 guildId = f[0].Get(); const uint32 accountId = f[1].Get(); - // Boss considered 'bot' if his account is in botAccounts + // Determine if guild leader's account is a bot account. if (botAccounts.find(accountId) != botAccounts.end()) { ++guildNumber; From 286213eb8b4b326f377fe8c1e801e72723705498 Mon Sep 17 00:00:00 2001 From: Alex Dcnh <140754794+Wishmaster117@users.noreply.github.com> Date: Thu, 23 Oct 2025 00:33:22 +0100 Subject: [PATCH 122/151] Fix Playerbots won't fly #1753 (#1761) --- src/strategy/actions/MovementActions.cpp | 107 ++++++++++++++++------- 1 file changed, 74 insertions(+), 33 deletions(-) diff --git a/src/strategy/actions/MovementActions.cpp b/src/strategy/actions/MovementActions.cpp index 9c84447f9b..0598a39d19 100644 --- a/src/strategy/actions/MovementActions.cpp +++ b/src/strategy/actions/MovementActions.cpp @@ -199,7 +199,8 @@ bool MovementAction::MoveTo(uint32 mapId, float x, float y, float z, bool idle, { VehicleSeatEntry const* seat = vehicle->GetSeatForPassenger(bot); Unit* vehicleBase = vehicle->GetBase(); - generatePath = vehicleBase->CanFly(); + // If the mover (vehicle) can fly, we DO NOT want an mmaps path (2D ground) => disable pathfinding + generatePath = !vehicleBase || !vehicleBase->CanFly(); if (!vehicleBase || !seat || !seat->CanControl()) // is passenger and cant move anyway return false; @@ -207,14 +208,20 @@ bool MovementAction::MoveTo(uint32 mapId, float x, float y, float z, bool idle, if (distance > 0.01f) { MotionMaster& mm = *vehicleBase->GetMotionMaster(); // need to move vehicle, not bot + // Disable ground pathing if the bot/master/vehicle are flying + auto isFlying = [](Unit* u){ return u && (u->HasUnitMovementFlag(MOVEMENTFLAG_FLYING) || u->IsInFlight()); }; + bool allowPathVeh = generatePath; + Unit* masterVeh = botAI ? botAI->GetMaster() : nullptr; + if (isFlying(vehicleBase) || isFlying(bot) || isFlying(masterVeh)) + allowPathVeh = false; mm.Clear(); if (!backwards) { - mm.MovePoint(0, x, y, z, FORCED_MOVEMENT_NONE, 0.0f, 0.0f, generatePath); + mm.MovePoint(0, x, y, z, FORCED_MOVEMENT_NONE, 0.0f, 0.0f, allowPathVeh); } else { - mm.MovePointBackwards(0, x, y, z, generatePath); + mm.MovePointBackwards(0, x, y, z, allowPathVeh); } float speed = backwards ? vehicleBase->GetSpeed(MOVE_RUN_BACK) : vehicleBase->GetSpeed(MOVE_RUN); float delay = 1000.0f * (distance / speed); @@ -241,15 +248,22 @@ bool MovementAction::MoveTo(uint32 mapId, float x, float y, float z, bool idle, // bot->CastStop(); // botAI->InterruptSpell(); // } + MotionMaster& mm = *bot->GetMotionMaster(); + // No ground pathfinding if the bot/master are flying => allow true 3D (Z) movement + auto isFlying = [](Unit* u){ return u && (u->HasUnitMovementFlag(MOVEMENTFLAG_FLYING) || u->IsInFlight()); }; + bool allowPath = generatePath; + Unit* master = botAI ? botAI->GetMaster() : nullptr; + if (isFlying(bot) || isFlying(master)) + allowPath = false; mm.Clear(); if (!backwards) { - mm.MovePoint(0, x, y, z, FORCED_MOVEMENT_NONE, 0.0f, 0.0f, generatePath); + mm.MovePoint(0, x, y, z, FORCED_MOVEMENT_NONE, 0.0f, 0.0f, allowPath); } else { - mm.MovePointBackwards(0, x, y, z, generatePath); + mm.MovePointBackwards(0, x, y, z, allowPath); } float delay = 1000.0f * MoveDelay(distance, backwards); if (lessDelay) @@ -282,16 +296,23 @@ bool MovementAction::MoveTo(uint32 mapId, float x, float y, float z, bool idle, // bot->CastStop(); // botAI->InterruptSpell(); // } + MotionMaster& mm = *bot->GetMotionMaster(); G3D::Vector3 endP = path.back(); + // No ground pathfinding if the bot/master are flying => allow true 3D (Z) movement + auto isFlying = [](Unit* u){ return u && (u->HasUnitMovementFlag(MOVEMENTFLAG_FLYING) || u->IsInFlight()); }; + bool allowPath = generatePath; + Unit* master = botAI ? botAI->GetMaster() : nullptr; + if (isFlying(bot) || isFlying(master)) + allowPath = false; mm.Clear(); if (!backwards) { - mm.MovePoint(0, x, y, z, FORCED_MOVEMENT_NONE, 0.0f, 0.0f, generatePath); + mm.MovePoint(0, x, y, z, FORCED_MOVEMENT_NONE, 0.0f, 0.0f, allowPath); } else { - mm.MovePointBackwards(0, x, y, z, generatePath); + mm.MovePointBackwards(0, x, y, z, allowPath); } float delay = 1000.0f * MoveDelay(distance, backwards); if (lessDelay) @@ -1013,18 +1034,49 @@ void MovementAction::UpdateMovementState() bot->GetMapWaterOrGroundLevel(bot->GetPositionX(), bot->GetPositionY(), bot->GetPositionZ()) + 1.0f; // Keep bot->SendMovementFlagUpdate() withing the if statements to not intefere with bot behavior on ground/(shallow) waters - if (!bot->HasUnitMovementFlag(MOVEMENTFLAG_FLYING) && - bot->HasAuraType(SPELL_AURA_MOD_INCREASE_MOUNTED_FLIGHT_SPEED) && !onGround) + + bool hasFlightAura = bot->HasAuraType(SPELL_AURA_MOD_INCREASE_MOUNTED_FLIGHT_SPEED) || bot->HasAuraType(SPELL_AURA_FLY); + if (hasFlightAura) { - bot->AddUnitMovementFlag(MOVEMENTFLAG_FLYING); - bot->SendMovementFlagUpdate(); + bool changed = false; + if (!bot->HasUnitMovementFlag(MOVEMENTFLAG_CAN_FLY)) + { + bot->AddUnitMovementFlag(MOVEMENTFLAG_CAN_FLY); + changed = true; + } + if (!bot->HasUnitMovementFlag(MOVEMENTFLAG_DISABLE_GRAVITY)) + { + bot->AddUnitMovementFlag(MOVEMENTFLAG_DISABLE_GRAVITY); + changed = true; + } + if (!bot->HasUnitMovementFlag(MOVEMENTFLAG_FLYING)) + { + bot->AddUnitMovementFlag(MOVEMENTFLAG_FLYING); + changed = true; + } + if (changed) + bot->SendMovementFlagUpdate(); } - - else if (bot->HasUnitMovementFlag(MOVEMENTFLAG_FLYING) && - (!bot->HasAuraType(SPELL_AURA_MOD_INCREASE_MOUNTED_FLIGHT_SPEED) || onGround)) + else if (!hasFlightAura) { - bot->RemoveUnitMovementFlag(MOVEMENTFLAG_FLYING); - bot->SendMovementFlagUpdate(); + bool changed = false; + if (bot->HasUnitMovementFlag(MOVEMENTFLAG_FLYING)) + { + bot->RemoveUnitMovementFlag(MOVEMENTFLAG_FLYING); + changed = true; + } + if (bot->HasUnitMovementFlag(MOVEMENTFLAG_DISABLE_GRAVITY)) + { + bot->RemoveUnitMovementFlag(MOVEMENTFLAG_DISABLE_GRAVITY); + changed = true; + } + if (bot->HasUnitMovementFlag(MOVEMENTFLAG_CAN_FLY)) + { + bot->RemoveUnitMovementFlag(MOVEMENTFLAG_CAN_FLY); + changed = true; + } + if (changed) + bot->SendMovementFlagUpdate(); } // See if the bot is currently slowed, rooted, or otherwise unable to move @@ -1122,13 +1174,6 @@ bool MovementAction::Follow(Unit* target, float distance, float angle) if (!target) return false; - if (!bot->InBattleground() && sServerFacade->IsDistanceLessOrEqualThan(sServerFacade->GetDistance2d(bot, target), - sPlayerbotAIConfig->followDistance)) - { - // botAI->TellError("No need to follow"); - return false; - } - /* if (!bot->InBattleground() && sServerFacade->IsDistanceLessOrEqualThan(sServerFacade->GetDistance2d(bot, target->GetPositionX(), @@ -1246,21 +1291,17 @@ bool MovementAction::Follow(Unit* target, float distance, float angle) return MoveTo(target, sPlayerbotAIConfig->followDistance); } - if (sServerFacade->IsDistanceLessOrEqualThan(sServerFacade->GetDistance2d(bot, target), - sPlayerbotAIConfig->followDistance)) - { - // botAI->TellError("No need to follow"); - return false; - } - if (target->IsFriendlyTo(bot) && bot->IsMounted() && AI_VALUE(GuidVector, "all targets").empty()) distance += angle; - if (!bot->InBattleground() && sServerFacade->IsDistanceLessOrEqualThan(sServerFacade->GetDistance2d(bot, target), - sPlayerbotAIConfig->followDistance)) + // Do not cancel follow if the 2D distance is short but the Z still differs (e.g., master above). + float dz1 = fabs(bot->GetPositionZ() - target->GetPositionZ()); + if (!bot->InBattleground() + && sServerFacade->IsDistanceLessOrEqualThan(sServerFacade->GetDistance2d(bot, target), sPlayerbotAIConfig->followDistance) + && dz1 < sPlayerbotAIConfig->contactDistance) { // botAI->TellError("No need to follow"); - return false; + return false; // truly in range (2D and Z) => no need to move } bot->HandleEmoteCommand(0); From c3fd97b6c0e0c8d8c12a72cef06bfcae28f8c058 Mon Sep 17 00:00:00 2001 From: NoxMax <50133316+NoxMax@users.noreply.github.com> Date: Thu, 23 Oct 2025 12:10:35 -0600 Subject: [PATCH 123/151] Fix: Prevent addClass bots from getting realm firsts (#1745) * Random/Addclass bots cannot get first achievements * Use firsts achievement flags --- src/Playerbots.cpp | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/Playerbots.cpp b/src/Playerbots.cpp index 1d6c436cb9..a7217d7bc4 100644 --- a/src/Playerbots.cpp +++ b/src/Playerbots.cpp @@ -220,7 +220,8 @@ class PlayerbotsPlayerScript : public PlayerScript bool OnPlayerBeforeAchievementComplete(Player* player, AchievementEntry const* achievement) override { - if (sRandomPlayerbotMgr->IsRandomBot(player) && (achievement->flags == 256 || achievement->flags == 768)) + if ((sRandomPlayerbotMgr->IsRandomBot(player) || sRandomPlayerbotMgr->IsAddclassBot(player)) && + (achievement->flags & (ACHIEVEMENT_FLAG_REALM_FIRST_REACH | ACHIEVEMENT_FLAG_REALM_FIRST_KILL))) { return false; } From 7237b154e0e57a3e9c06414da4d55e7e31ad22a0 Mon Sep 17 00:00:00 2001 From: bash <31279994+hermensbas@users.noreply.github.com> Date: Sat, 25 Oct 2025 00:54:27 +0200 Subject: [PATCH 124/151] Added intelliJ project folder on exclusion list (#1764) --- .gitignore | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/.gitignore b/.gitignore index 44201dff67..06b6c10a8f 100644 --- a/.gitignore +++ b/.gitignore @@ -48,4 +48,5 @@ local.properties .loadpath .project .cproject -.vscode \ No newline at end of file +.vscode +.idea From 235f0249b29b4c2c1da5045f337ba3357d77fcad Mon Sep 17 00:00:00 2001 From: St0ny <42348051+Raz0r1337@users.noreply.github.com> Date: Tue, 28 Oct 2025 21:56:42 +0100 Subject: [PATCH 125/151] insert of deDE localized chatter texts into text_loc3 (#1675) * insert of german chatter texts into text_loc3 restore of original file ai_playerbot_texts.sql --- ...025_10_27_00_ai_playerbot_german_texts.sql | 1535 +++++++++++++++++ 1 file changed, 1535 insertions(+) create mode 100644 data/sql/playerbots/updates/2025_10_27_00_ai_playerbot_german_texts.sql diff --git a/data/sql/playerbots/updates/2025_10_27_00_ai_playerbot_german_texts.sql b/data/sql/playerbots/updates/2025_10_27_00_ai_playerbot_german_texts.sql new file mode 100644 index 0000000000..559493f2c0 --- /dev/null +++ b/data/sql/playerbots/updates/2025_10_27_00_ai_playerbot_german_texts.sql @@ -0,0 +1,1535 @@ +UPDATE `ai_playerbot_texts` SET `text_loc3`=''; + +UPDATE `ai_playerbot_texts` SET `text_loc3`='am Arsch der Welt' WHERE `id`=1; +UPDATE `ai_playerbot_texts` SET `text_loc3`='an einem geheimen Ort' WHERE `id`=2; +UPDATE `ai_playerbot_texts` SET `text_loc3`='irgendwo' WHERE `id`=3; +UPDATE `ai_playerbot_texts` SET `text_loc3`='irgendwas' WHERE `id`=4; +UPDATE `ai_playerbot_texts` SET `text_loc3`='frag mich, wie %item_link wohl schmeckt' WHERE `id`=5; +UPDATE `ai_playerbot_texts` SET `text_loc3`='neeein, ich hab %item_link bekommen' WHERE `id`=6; +UPDATE `ai_playerbot_texts` SET `text_loc3`='ah nee, nicht schon wieder dieser Müll: %item_link' WHERE `id`=7; +UPDATE `ai_playerbot_texts` SET `text_loc3`='scheint so, als würde ich nur Müll looten: %item_link' WHERE `id`=8; +UPDATE `ai_playerbot_texts` SET `text_loc3`='naja, besser als nix, schätze ich: %item_link' WHERE `id`=9; +UPDATE `ai_playerbot_texts` SET `text_loc3`='keine Ahnung, was ich mit %item_link anfangen soll' WHERE `id`=10; +UPDATE `ai_playerbot_texts` SET `text_loc3`='naja, ich kann den ganzen Tag %item_link looten' WHERE `id`=11; +UPDATE `ai_playerbot_texts` SET `text_loc3`='neuer Tag, neuer %item_link' WHERE `id`=12; +UPDATE `ai_playerbot_texts` SET `text_loc3`='hab %item_link gelootet' WHERE `id`=13; +UPDATE `ai_playerbot_texts` SET `text_loc3`='ein %item_link ist okay' WHERE `id`=14; +UPDATE `ai_playerbot_texts` SET `text_loc3`='nicht schlecht, hab grad %item_link bekommen.' WHERE `id`=15; +UPDATE `ai_playerbot_texts` SET `text_loc3`='gerade %item_link in %zone_name gelootet' WHERE `id`=16; +UPDATE `ai_playerbot_texts` SET `text_loc3`='kann ich gut gebrauchen, %item_link' WHERE `id`=17; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Gold, Gold, Gold: %item_link' WHERE `id`=18; +UPDATE `ai_playerbot_texts` SET `text_loc3`='hab %item_link bekommen' WHERE `id`=19; +UPDATE `ai_playerbot_texts` SET `text_loc3`='%item_link ist BiS für Jäger' WHERE `id`=20; +UPDATE `ai_playerbot_texts` SET `text_loc3`='%item_link ist BiS für %my_class' WHERE `id`=21; +UPDATE `ai_playerbot_texts` SET `text_loc3`='RNG meint es heute gut: %item_link' WHERE `id`=22; +UPDATE `ai_playerbot_texts` SET `text_loc3`='nice, %item_link frisch gelootet' WHERE `id`=23; +UPDATE `ai_playerbot_texts` SET `text_loc3`='wow, hab gerade %item_link bekommen' WHERE `id`=24; +UPDATE `ai_playerbot_texts` SET `text_loc3`='%item_link ist BiS für Jäger' WHERE `id`=25; +UPDATE `ai_playerbot_texts` SET `text_loc3`='%item_link ist BiS für %my_class' WHERE `id`=26; +UPDATE `ai_playerbot_texts` SET `text_loc3`='RNG meint es heute gut: %item_link' WHERE `id`=27; +UPDATE `ai_playerbot_texts` SET `text_loc3`='nice, %item_link frisch gelootet' WHERE `id`=28; +UPDATE `ai_playerbot_texts` SET `text_loc3`='OMG, guckt mal, was ich gerade bekommen hab: %item_link!!!' WHERE `id`=29; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Keine @#$@% Chance! Ich hab %item_link bekommen, Wahnsinn.' WHERE `id`=30; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Keine @#$@% Chance! Das kann nicht sein - ich hab %item_link bekommen, völlig irre.' WHERE `id`=31; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Im Ernst? Noch ein %item_link? Mein Glück ist kaputt.' WHERE `id`=32; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Ich hab %item_link... ugh, schon wieder.' WHERE `id`=34; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Keine Ahnung, warum ich %item_link überhaupt aufhebe, es ist nutzlos.' WHERE `id`=35; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Schaut euch diesen glänzenden %item_link an... schade, ist trotzdem Müll.' WHERE `id`=36; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Dieser %item_link ist nicht mal das Papier wert, auf dem er stehen würde.' WHERE `id`=37; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Ich schätze, %item_link ist besser als gar nix? Gerade so.' WHERE `id`=38; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Kein Plan, was ich mit %item_link machen soll, vielleicht verkauf ich es für 1 Silber.' WHERE `id`=39; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Noch ein %item_link... naja, immerhin krieg ich was.' WHERE `id`=40; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Hoffentlich ist %item_link was wert, es sieht nämlich furchtbar aus.' WHERE `id`=41; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Warum krieg ich ständig %item_link... hab ich RNG verärgert?' WHERE `id`=43; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Als würde %item_link mir nachlaufen. Ich will das nicht!' WHERE `id`=44; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Da ist %item_link schon wieder. Was für eine Überraschung.' WHERE `id`=45; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Ich schätze, %item_link taugt als Händler-Müll?' WHERE `id`=46; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Neeeein, nicht schon wieder %item_link! RNG, bitte!' WHERE `id`=47; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Naja, ganz nutzlos ist %item_link immerhin nicht, oder?' WHERE `id`=48; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Noch ein %item_link? RNG, kümmert dich das überhaupt?' WHERE `id`=49; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Vielleicht ist %item_link in 10 Jahren was wert.' WHERE `id`=50; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Ich bewundere einfach mal, wie %item_link aussieht... und schmeiß es weg.' WHERE `id`=51; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Wer braucht %item_link? Ich sicher nicht.' WHERE `id`=52; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Vielleicht ist %item_link nützlich... haha, doch nur Müll.' WHERE `id`=53; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Das Universum schenkt mir %item_link. Toll.' WHERE `id`=54; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Gut, ich hab %item_link. Begeistert bin ich nicht.' WHERE `id`=55; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Was soll ich überhaupt mit %item_link anfangen? Nicht mal verkaufbar.' WHERE `id`=56; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Packen wir %item_link zu meinem wachsenden Enttäuschungsstapel.' WHERE `id`=57; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Danke für %item_link... genau das, was ich nicht gebraucht hab.' WHERE `id`=58; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Ich hab so viele %item_link gelootet, ich könnte damit einen Laden aufmachen.' WHERE `id`=60; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Ein glänzender %item_link... kommt wohl auf den Müllhaufen.' WHERE `id`=61; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Es ist %item_link, Leute. Nicht zu früh freuen.' WHERE `id`=62; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Naja, wenigstens ist es %item_link... könnte schlimmer sein.' WHERE `id`=63; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Lieber %item_link als gar nix.' WHERE `id`=64; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Noch ein %item_link. Nicht das Schlimmste.' WHERE `id`=65; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Hey, %item_link... ist schon okay, denk ich.' WHERE `id`=66; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Hey, %item_link. Nicht schlecht, nicht gut, aber ich nehme es.' WHERE `id`=67; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Könnte schlimmer sein... hab gerade %item_link gelootet.' WHERE `id`=68; +UPDATE `ai_playerbot_texts` SET `text_loc3`='%item_link wird für irgendwas nützlich sein, denke ich.' WHERE `id`=69; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Neuer Tag, neuer %item_link. Kann mich nicht beschweren.' WHERE `id`=70; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Naja, %item_link geht klar, würd ich sagen.' WHERE `id`=71; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Gerade %item_link bekommen. Nicht das Beste, aber etwas.' WHERE `id`=72; +UPDATE `ai_playerbot_texts` SET `text_loc3`='%item_link ist gut genug, ich bin nicht sauer.' WHERE `id`=74; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Kein Legendary, aber %item_link reicht.' WHERE `id`=75; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Kein schlechter Drop... %item_link ist okay.' WHERE `id`=76; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Lieber %item_link als gar nix.' WHERE `id`=77; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Schon wieder %item_link. Besser als nix, denke ich.' WHERE `id`=79; +UPDATE `ai_playerbot_texts` SET `text_loc3`='%item_link schon wieder, hm? Nicht begeistert, aber ich überlebe.' WHERE `id`=80; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Hätte schlimmer kommen können, %item_link ist gar nicht so schlecht.' WHERE `id`=82; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Ich nehm %item_link, könnte schlimmer sein.' WHERE `id`=84; +UPDATE `ai_playerbot_texts` SET `text_loc3`='%item_link gelootet, nix Besonderes, aber okay.' WHERE `id`=85; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Nicht das, was ich wollte, aber %item_link reicht fürs Erste.' WHERE `id`=86; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Noch ein %item_link. Nicht der Wahnsinn, aber geht klar.' WHERE `id`=87; +UPDATE `ai_playerbot_texts` SET `text_loc3`='%item_link gelootet, könnte schlimmer sein.' WHERE `id`=88; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Naja, %item_link ist besser als ein Stich ins Auge.' WHERE `id`=89; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Ich nehm %item_link und zieh weiter.' WHERE `id`=90; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Nice! Ein solider %item_link für die Sammlung.' WHERE `id`=91; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Nicht schlecht, %item_link könnte nützlich werden.' WHERE `id`=93; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Hab mir %item_link geholt, jetzt gehts los.' WHERE `id`=94; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Dieser %item_link ist besser als die meisten, nehm ich.' WHERE `id`=95; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Mit %item_link kann ich was Gutes anfangen.' WHERE `id`=96; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Mit %item_link lässt sich vielleicht gut verdienen.' WHERE `id`=99; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Ein solider %item_link, der Tag sieht gleich besser aus.' WHERE `id`=100; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Hab %item_link nicht erwartet, aber ich nehm es.' WHERE `id`=101; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Kein Plan, was ich mit %item_link machen soll aber ich freue mich drüber.' WHERE `id`=102; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Nicht meine erste Wahl, aber %item_link nehm ich gern.' WHERE `id`=103; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Genau das hab ich heute gebraucht: %item_link.' WHERE `id`=104; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Noch ein %item_link. Nehm ich, keine Beschwerden.' WHERE `id`=106; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Immerhin hat %item_link irgendeinen Nutzen. Nicht der schlimmste Loot.' WHERE `id`=107; +UPDATE `ai_playerbot_texts` SET `text_loc3`='%item_link ist vielleicht genau das, was ich heute brauche.' WHERE `id`=108; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Ich hab gerade %quest_link angenommen' WHERE `id`=109; +UPDATE `ai_playerbot_texts` SET `text_loc3`='gerade %quest_link angenommen' WHERE `id`=110; +UPDATE `ai_playerbot_texts` SET `text_loc3`='%quest_link - versuch das mal abzuschließen' WHERE `id`=111; +UPDATE `ai_playerbot_texts` SET `text_loc3`='%quest_link in %zone_name angenommen' WHERE `id`=112; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Gerade %quest_link abgeholt, Zeit ranzuklotzen!' WHERE `id`=113; +UPDATE `ai_playerbot_texts` SET `text_loc3`='%quest_link eingesackt, mal sehen, worum es geht.' WHERE `id`=114; +UPDATE `ai_playerbot_texts` SET `text_loc3`='%quest_link geschnappt, Los gehts!' WHERE `id`=115; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Neue Quest, %quest_link. Los!' WHERE `id`=116; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Sieht so aus, als wäre jetzt %quest_link dran, wünscht mir Glück.' WHERE `id`=117; +UPDATE `ai_playerbot_texts` SET `text_loc3`='%quest_link angenommen, mal sehen, wie hart die ist.' WHERE `id`=118; +UPDATE `ai_playerbot_texts` SET `text_loc3`='%quest_link mitgenommen, Zeit für Fortschritt.' WHERE `id`=119; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Gerade %quest_link genommen. Mal sehen, wie schwer die ist.' WHERE `id`=120; +UPDATE `ai_playerbot_texts` SET `text_loc3`='%quest_link angenommen, hoffentlich kein Überraschungsboss am Ende.' WHERE `id`=121; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Unterwegs, %quest_link abzuschließen. Auf gehts!' WHERE `id`=122; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Dann mach ich jetzt wohl %quest_link. Hoffentlich lohnt sichs.' WHERE `id`=123; +UPDATE `ai_playerbot_texts` SET `text_loc3`='%quest_link eingesackt. Weiter gehts!' WHERE `id`=124; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Hab gerade %quest_link angenommen. Sollte Kinderkram sein.' WHERE `id`=125; +UPDATE `ai_playerbot_texts` SET `text_loc3`='%quest_link angenommen, jetzt rock ich das.' WHERE `id`=126; +UPDATE `ai_playerbot_texts` SET `text_loc3`='%quest_link in %zone_name angenommen. Los gehts!' WHERE `id`=127; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Auf dem Weg, %quest_link zu beenden. Machen wirs schnell!' WHERE `id`=128; +UPDATE `ai_playerbot_texts` SET `text_loc3`='%quest_link angenommen. Mal sehen, was in %zone_name auf mich wartet.' WHERE `id`=129; +UPDATE `ai_playerbot_texts` SET `text_loc3`='%quest_link bekommen, hoffentlich dauert das nicht ewig.' WHERE `id`=130; +UPDATE `ai_playerbot_texts` SET `text_loc3`='%quest_link geschnappt. Schon wieder von vorn.' WHERE `id`=131; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Es sieht so aus, als ob %quest_link als nächstes dran ist.' WHERE `id`=132; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Unterwegs, %quest_link abzuschließen. Hoffe, die macht Spaß.' WHERE `id`=133; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Gerade %quest_link genommen. Zeit nachzuschauen, was mich erwartet.' WHERE `id`=136; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Nochmal %quest_link. Ziehen wirs schnell durch!' WHERE `id`=137; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Ich hab gerade %quest_link genommen. Das wird spaßig!' WHERE `id`=138; +UPDATE `ai_playerbot_texts` SET `text_loc3`='%quest_link in %zone_name angenommen. Los!' WHERE `id`=139; +UPDATE `ai_playerbot_texts` SET `text_loc3`='%quest_link geschnappt. Kann es kaum erwarten, was als Nächstes kommt.' WHERE `id`=140; +UPDATE `ai_playerbot_texts` SET `text_loc3`='%quest_link genommen. Abtauchen und durchziehen.' WHERE `id`=141; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Alles klar, %quest_link ist aktiv. An die Arbeit!' WHERE `id`=142; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Weiter zu %quest_link. Hoffentlich nicht zu hart.' WHERE `id`=143; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Gerade %quest_link geschnappt. Sollte easy sein!' WHERE `id`=144; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Ich hab %quest_link angenommen. Machen wirs fix!' WHERE `id`=145; +UPDATE `ai_playerbot_texts` SET `text_loc3`='%quest_link genommen, mal schauen, worum es geht.' WHERE `id`=146; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Gerade %quest_link angenommen, weiter gehts!' WHERE `id`=147; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Endlich fertig mit %quest_obj_name für %quest_link' WHERE `id`=148; +UPDATE `ai_playerbot_texts` SET `text_loc3`='endlich %quest_obj_available/%quest_obj_required von %quest_obj_name für %quest_link bekommen' WHERE `id`=149; +UPDATE `ai_playerbot_texts` SET `text_loc3`='%quest_obj_full_formatted für %quest_link, endlich' WHERE `id`=150; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Uff, %quest_obj_available/%quest_obj_required %quest_obj_name für %quest_link bekommen' WHERE `id`=151; +UPDATE `ai_playerbot_texts` SET `text_loc3`='brauche noch %quest_obj_missing von %quest_obj_name für %quest_link' WHERE `id`=152; +UPDATE `ai_playerbot_texts` SET `text_loc3`='%quest_obj_full_formatted, arbeite noch an %quest_link' WHERE `id`=153; +UPDATE `ai_playerbot_texts` SET `text_loc3`='%quest_obj_name für %quest_link fertig, was für ein Grind!' WHERE `id`=154; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Kurz vor Abschluss von %quest_obj_name für %quest_link, fehlen nur noch %quest_obj_missing.' WHERE `id`=155; +UPDATE `ai_playerbot_texts` SET `text_loc3`='%quest_obj_name fast durch, brauche nur noch %quest_obj_missing für %quest_link.' WHERE `id`=156; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Endlich %quest_obj_name für %quest_link fertig! Das hat gedauert!' WHERE `id`=158; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Läuft, hab %quest_obj_available/%quest_obj_required von %quest_obj_name für %quest_link.' WHERE `id`=159; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Yes! %quest_obj_name für %quest_link abgeschlossen. Weiter gehts!' WHERE `id`=160; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Fortschritt bei %quest_obj_name, %quest_obj_available/%quest_obj_required erledigt für %quest_link.' WHERE `id`=161; +UPDATE `ai_playerbot_texts` SET `text_loc3`='%quest_obj_full_formatted... fast geschafft für %quest_link!' WHERE `id`=162; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Brauche nur noch %quest_obj_missing %quest_obj_name für %quest_link, fast fertig!' WHERE `id`=163; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Endlich %quest_obj_name für %quest_link geschafft, was für eine Erleichterung!' WHERE `id`=164; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Hab %quest_obj_available/%quest_obj_required von %quest_obj_name für %quest_link, geht voran!' WHERE `id`=165; +UPDATE `ai_playerbot_texts` SET `text_loc3`='%quest_obj_name für %quest_link ist komplett! Weiter zur nächsten Aufgabe.' WHERE `id`=166; +UPDATE `ai_playerbot_texts` SET `text_loc3`='100% von %quest_obj_name für %quest_link erledigt, ab zu den Belohnungen!' WHERE `id`=167; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Es fehlen noch %quest_obj_missing von %quest_obj_name für %quest_link, fast fertig!' WHERE `id`=168; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Arbeite an %quest_obj_name für %quest_link, aktuell %quest_obj_available/%quest_obj_required erledigt.' WHERE `id`=169; +UPDATE `ai_playerbot_texts` SET `text_loc3`='%quest_obj_full_formatted für %quest_link. Das war ein langer Brocken!' WHERE `id`=170; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Brauche nur noch ein paar %quest_obj_name für %quest_link, dann bin ich durch!' WHERE `id`=171; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Noch ein Ziel erledigt! %quest_obj_full_formatted für %quest_link' WHERE `id`=172; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Grinde weiter %quest_obj_name für %quest_link, mit %quest_obj_available/%quest_obj_required fast da.' WHERE `id`=173; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Ziel erledigt! %quest_obj_full_formatted für %quest_link. Weiter zum nächsten!' WHERE `id`=174; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Endlich fertig mit %item_link für %quest_link' WHERE `id`=175; +UPDATE `ai_playerbot_texts` SET `text_loc3`='endlich %quest_obj_available/%quest_obj_required von %item_link für %quest_link bekommen' WHERE `id`=176; +UPDATE `ai_playerbot_texts` SET `text_loc3`='%quest_obj_full_formatted für %quest_link, endlich' WHERE `id`=177; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Uff, %quest_obj_available/%quest_obj_required %item_link für %quest_link bekommen' WHERE `id`=178; +UPDATE `ai_playerbot_texts` SET `text_loc3`='brauche noch %quest_obj_missing %item_link für %quest_link' WHERE `id`=179; +UPDATE `ai_playerbot_texts` SET `text_loc3`='%quest_obj_full_formatted, arbeite noch an %quest_link' WHERE `id`=180; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Es geht voran! %quest_obj_available/%quest_obj_required %item_link für %quest_link.' WHERE `id`=182; +UPDATE `ai_playerbot_texts` SET `text_loc3`='%quest_obj_name ist zur Hälfte durch, brauche noch %quest_obj_missing %item_link für %quest_link.' WHERE `id`=183; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Es fehlen noch %quest_obj_missing von %item_link für %quest_link, aber ich komme näher!' WHERE `id`=184; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Endlich %item_link für %quest_link fertig, weiter mit der nächsten Aufgabe!' WHERE `id`=185; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Fast da! %quest_obj_available/%quest_obj_required %item_link für %quest_link geholt.' WHERE `id`=186; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Yes! %item_link für %quest_link abgeschlossen. Weiter zum nächsten Ziel.' WHERE `id`=187; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Guter Fortschritt bei %item_link für %quest_link, brauche noch %quest_obj_missing.' WHERE `id`=189; +UPDATE `ai_playerbot_texts` SET `text_loc3`='100% von %item_link für %quest_link erledigt! Weiter gehts.' WHERE `id`=190; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Hab %quest_obj_available/%quest_obj_required %item_link für %quest_link. Das Ziel ist in Sicht!' WHERE `id`=191; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Geschafft, %item_link für %quest_link komplett. Was für eine Erleichterung!' WHERE `id`=192; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Arbeite hart an %item_link für %quest_link, brauche noch %quest_obj_missing.' WHERE `id`=193; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Fast fertig mit %item_link für %quest_link, es fehlen nur noch %quest_obj_missing.' WHERE `id`=194; +UPDATE `ai_playerbot_texts` SET `text_loc3`='%item_link für %quest_link abgeschlossen, der Grind ist real!' WHERE `id`=195; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Arbeite weiter an %item_link für %quest_link, bisher %quest_obj_available/%quest_obj_required erledigt.' WHERE `id`=196; +UPDATE `ai_playerbot_texts` SET `text_loc3`='%item_link für %quest_link kommt der Fertigstellung näher, %quest_obj_available/%quest_obj_required erledigt.' WHERE `id`=197; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Yes! %item_link für %quest_link fertig! Das hat etwas länger gedauert.' WHERE `id`=198; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Ich habe %quest_obj_available/%quest_obj_required %item_link für %quest_link, läuft!' WHERE `id`=199; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Durch mit %item_link für %quest_link. Weiter zum nächsten!' WHERE `id`=200; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Noch eins abgehakt! %item_link für %quest_link ist durch!' WHERE `id`=201; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Grinde weiter %item_link für %quest_link, habe %quest_obj_available/%quest_obj_required geschafft.' WHERE `id`=202; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Bin fast durch! Brauche noch %quest_obj_missing %item_link für %quest_link.' WHERE `id`=203; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Nicht rechtzeitig %quest_link geschafft...' WHERE `id`=204; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Zeit für %quest_link abgelaufen :(' WHERE `id`=205; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Alle Ziele für %quest_link abgeschlossen' WHERE `id`=206; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Alle Ziele für %quest_link erledigt' WHERE `id`=207; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Ich gebe %quest_link gleich ab, habe gerade alle Ziele erledigt' WHERE `id`=208; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Jaaa, endlich %quest_link abgegeben' WHERE `id`=209; +UPDATE `ai_playerbot_texts` SET `text_loc3`='hab %quest_link abgegeben' WHERE `id`=210; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Hab %quest_link geschafft, gerade abgegeben' WHERE `id`=211; +UPDATE `ai_playerbot_texts` SET `text_loc3`='gerade %quest_link abgegeben' WHERE `id`=212; +UPDATE `ai_playerbot_texts` SET `text_loc3`='gerade %quest_link in %zone_name abgegeben' WHERE `id`=213; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Noch eine Quest abgeschlossen! %quest_link abgegeben' WHERE `id`=214; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Mission erfüllt! %quest_link ist abgegeben' WHERE `id`=215; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Endlich, %quest_link abgegeben! Was für ein Ritt!' WHERE `id`=216; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Grade %quest_link abgeschlossen und abgegeben, fühlt sich gut an!' WHERE `id`=217; +UPDATE `ai_playerbot_texts` SET `text_loc3`='%quest_link in %zone_name abgegeben. Weiter zur nächsten Herausforderung!' WHERE `id`=218; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Hab %quest_link abgegeben. Wieder eine weniger!' WHERE `id`=219; +UPDATE `ai_playerbot_texts` SET `text_loc3`='%quest_link erfolgreich abgegeben, das hat gedauert!' WHERE `id`=220; +UPDATE `ai_playerbot_texts` SET `text_loc3`='%quest_link in %zone_name abgeschlossen und abgegeben. Fühlt sich gut an!' WHERE `id`=221; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Quest fertig! %quest_link abgegeben und bereit für die nächste!' WHERE `id`=222; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Endlich %quest_link in %zone_name abgegeben. Die war knackig!' WHERE `id`=223; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Das wars, %quest_link abgegeben! Jetzt Belohnung einsacken!' WHERE `id`=224; +UPDATE `ai_playerbot_texts` SET `text_loc3`='%quest_link fertig! Jetzt abgeben und weiter.' WHERE `id`=225; +UPDATE `ai_playerbot_texts` SET `text_loc3`='%quest_link eben abgeschlossen und abgegeben. Weiter gehts!' WHERE `id`=228; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Wieder eine im Kasten, %quest_link abgegeben' WHERE `id`=229; +UPDATE `ai_playerbot_texts` SET `text_loc3`='%quest_link abgegeben! Zeit, die Belohnung abzuholen.' WHERE `id`=230; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Das ging fix! %quest_link schon abgegeben!' WHERE `id`=232; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Gerade %quest_link in %zone_name abgegeben. Bereit fürs nächste Abenteuer!' WHERE `id`=233; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Mission komplett! %quest_link ist abgegeben!' WHERE `id`=235; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Hab gerade %quest_link beendet und abgegeben, weiter zur nächsten!' WHERE `id`=236; +UPDATE `ai_playerbot_texts` SET `text_loc3`='wieder %victim_name gelegt' WHERE `id`=237; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Ich leg ständig %victim_name um, nix Besonderes' WHERE `id`=238; +UPDATE `ai_playerbot_texts` SET `text_loc3`='noch ein %victim_name beißt ins Gras' WHERE `id`=239; +UPDATE `ai_playerbot_texts` SET `text_loc3`='ein %victim_name weniger in %zone_name' WHERE `id`=240; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Hab diesen Elite-Bastard %victim_name umgehauen!' WHERE `id`=241; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Elite %victim_name in %zone_name gekillt' WHERE `id`=242; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Puh, %victim_name doch noch gelegt!' WHERE `id`=243; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Gefällt dir das %victim_name?! Willst du, dass ich drei Wochen zurückspule, als du noch gelebt hast?!' WHERE `id`=244; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Yo, hab gerade %victim_name gekillt!' WHERE `id`=245; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Rare %victim_name in %zone_name gekillt' WHERE `id`=246; +UPDATE `ai_playerbot_texts` SET `text_loc3`='WTF hab ich da gerade umgehauen? %victim_name' WHERE `id`=247; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Gerade das Pet %victim_name gekillt' WHERE `id`=248; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Oh ja, hab gerade %victim_name gekillt' WHERE `id`=249; +UPDATE `ai_playerbot_texts` SET `text_loc3`='%victim_name in %zone_name gekillt' WHERE `id`=250; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Wieder %victim_name erlegt' WHERE `id`=251; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Ich leg ständig %victim_name um, nix Besonderes' WHERE `id`=252; +UPDATE `ai_playerbot_texts` SET `text_loc3`='noch ein %victim_name beißt ins Gras' WHERE `id`=253; +UPDATE `ai_playerbot_texts` SET `text_loc3`='ein %victim_name weniger in %zone_name' WHERE `id`=254; +UPDATE `ai_playerbot_texts` SET `text_loc3`='%victim_name so nebenbei umgehauen' WHERE `id`=255; +UPDATE `ai_playerbot_texts` SET `text_loc3`='%victim_name hatte keine Chance' WHERE `id`=256; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Schon wieder %victim_name aus dem Weg geräumt' WHERE `id`=257; +UPDATE `ai_playerbot_texts` SET `text_loc3`='%victim_name war zu easy, weiter gehts' WHERE `id`=258; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Und wieder %victim_name plattgemacht. Kinderkram' WHERE `id`=259; +UPDATE `ai_playerbot_texts` SET `text_loc3`='%victim_name war gar nicht so tough' WHERE `id`=260; +UPDATE `ai_playerbot_texts` SET `text_loc3`='%victim_name liegt, nix Besonderes' WHERE `id`=261; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Das war zu easy, %victim_name liegt' WHERE `id`=262; +UPDATE `ai_playerbot_texts` SET `text_loc3`='%victim_name ist so schnell umgekippt, einmal blinzeln und vorbei' WHERE `id`=263; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Diesen Elite %victim_name umgehauen!' WHERE `id`=264; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Elite %victim_name existiert nicht mehr' WHERE `id`=265; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Den Elite %victim_name weggemacht wie ein Boss' WHERE `id`=266; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Elite-Mob %victim_name, hat keine Chance gegen mich!' WHERE `id`=267; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Endlich den mächtigen %victim_name gelegt' WHERE `id`=268; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Elite %victim_name in %zone_name gekillt' WHERE `id`=269; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Hab gerade Elite %victim_name in %zone_name erwischt' WHERE `id`=270; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Elite %victim_name gekillt. Viel zu easy' WHERE `id`=271; +UPDATE `ai_playerbot_texts` SET `text_loc3`='%victim_name in %zone_name umgehauen, was ein Kampf' WHERE `id`=272; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Elite %victim_name gekillt. Ich scheine unaufhaltbar zu sein' WHERE `id`=273; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Puh, %victim_name doch noch gelegt!' WHERE `id`=274; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Seltener Elite %victim_name liegt' WHERE `id`=275; +UPDATE `ai_playerbot_texts` SET `text_loc3`='%victim_name gibt es nicht mehr. Noch ein seltener Elite gelegt' WHERE `id`=276; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Seltener Elite %victim_name down. Ich bin aus Feuer!' WHERE `id`=277; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Hab gerade den seltenen Elite %victim_name gekillt' WHERE `id`=278; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Das war geil! %victim_name gerade gekillt! Was ein Kampf' WHERE `id`=279; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Weltenboss %victim_name ist down! Das war episch' WHERE `id`=280; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Hab den Weltenboss %victim_name gelegt. Zeit zum Feiern!' WHERE `id`=281; +UPDATE `ai_playerbot_texts` SET `text_loc3`='%victim_name gekillt! Der Weltenboss war kein Spaß!' WHERE `id`=282; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Gerade %victim_name gekillt, das war legendär' WHERE `id`=283; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Yo, hab gerade %victim_name gekillt!' WHERE `id`=284; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Seltener %victim_name down. War ein geiler Fight' WHERE `id`=285; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Hab gerade den seltenen %victim_name gekillt' WHERE `id`=286; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Seltener %victim_name in %zone_name besiegt' WHERE `id`=287; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Gerade seltenen %victim_name in %zone_name gekillt. Das ging fix!' WHERE `id`=288; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Seltenen %victim_name in %zone_name gekillt' WHERE `id`=289; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Den seltenen %victim_name in %zone_name erwischt' WHERE `id`=290; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Hab %victim_name in %zone_name gekillt. Das tat gut' WHERE `id`=291; +UPDATE `ai_playerbot_texts` SET `text_loc3`='%victim_name in %zone_name umgehauen. Keine Chance gehabt' WHERE `id`=292; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Gerade %victim_name in %zone_name gekillt, easy' WHERE `id`=293; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Was hab ich da gerade gekillt? %victim_name' WHERE `id`=294; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Was ist das für ein %victim_name? Sowas hab ich noch nie gesehen' WHERE `id`=295; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Hab gerade was Seltsames gekillt, %victim_name' WHERE `id`=296; +UPDATE `ai_playerbot_texts` SET `text_loc3`='%victim_name war seltsam, aber liegt trotzdem' WHERE `id`=297; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Gerade %victim_name besiegt' WHERE `id`=298; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Machs gut, %victim_name. Warst nur ein Pet' WHERE `id`=299; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Hab gerade das Pet %victim_name umgehauen. Das kam unerwartet.' WHERE `id`=300; +UPDATE `ai_playerbot_texts` SET `text_loc3`='%victim_name liegt. Vielleicht nächstes Mal, Pet' WHERE `id`=301; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Ding! %my_level' WHERE `id`=302; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Jaaa, ich bin Level %my_level!' WHERE `id`=303; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Gerade aufgelevelt' WHERE `id`=304; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Stufe %my_level!!! Jetzt kann ich Endgame-Content machen' WHERE `id`=309; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Frisch auf Level %my_level, %my_class!!!' WHERE `id`=310; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Noch ein Level: %my_level, %my_race %my_class!' WHERE `id`=311; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Ding! Wieder ein Level up!' WHERE `id`=312; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Jetzt offiziell Level %my_level!' WHERE `id`=313; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Level %my_level, fühl mich jetzt schon stärker!' WHERE `id`=314; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Aufwärts! Level %my_level erreicht' WHERE `id`=315; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Das ging fix, schon Level %my_level!' WHERE `id`=316; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Gerade Level %my_level erreicht, auf gehts!' WHERE `id`=317; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Level %my_level, jetzt kommen die großen Sachen!' WHERE `id`=318; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Level %my_level, ich bin jetzt on fire!' WHERE `id`=319; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Level %my_level voll und weiter!' WHERE `id`=320; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Bin jetzt Level %my_level, was kommt als Nächstes?' WHERE `id`=321; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Level %my_level!!! Es passiert!' WHERE `id`=322; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Gerade Level %my_level erreicht, fühlt sich mega an!' WHERE `id`=323; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Level %my_level und ich fange erst an!' WHERE `id`=324; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Wow, schon Level %my_level, unaufhaltbar!' WHERE `id`=325; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Neue Höhen mit Level %my_level!!!' WHERE `id`=326; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Level %my_level und weiter Vollgas!' WHERE `id`=327; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Level %my_level erreicht, fühlt sich so gut an!' WHERE `id`=329; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Bin jetzt Level %my_level! Los gehts!' WHERE `id`=330; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Level %my_level, noch viel vor mir!' WHERE `id`=331; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Endlich Level %my_level erreicht, ich kann alles!' WHERE `id`=332; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Maxlevel %my_level, Endgame ich komme!' WHERE `id`=333; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Endgame freigeschaltet auf Level %my_level, her damit!' WHERE `id`=335; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Hab Level %my_level erreicht, Zeit zu glänzen!' WHERE `id`=336; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Level %my_level, lasst uns Endgame-Raids machen!' WHERE `id`=337; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Mit Level %my_level hält mich nix mehr auf!' WHERE `id`=338; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Level %my_level, bereit für High-Level-Content!' WHERE `id`=339; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Yes! Level %my_level, %my_class für alles bereit!' WHERE `id`=340; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Level %my_level, Zeit die Welt herauszufordern!' WHERE `id`=341; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Level %my_level erreicht, schnappen wir uns die Elitebosse!' WHERE `id`=342; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Jetzt bin ich Level %my_level, das echte Abenteuer beginnt!' WHERE `id`=343; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Level %my_level! Zeit für ernsthafte Action!' WHERE `id`=344; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Endlich auf Level %my_level! Jetzt zeige ich, was ich kann!' WHERE `id`=346; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Level %my_level ist da! Bereit für die große Liga!' WHERE `id`=347; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Gerade Level %my_level erreicht, macht euch bereit für echte Herausforderungen!' WHERE `id`=348; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Level %my_level voll, Zeit für epischen Content!' WHERE `id`=349; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Frisch auf Level %my_level! Bereit für Endgame-Inis!' WHERE `id`=350; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Jetzt, wo ich Level %my_level bin, ist nichts mehr außerhalb meiner Reichweite!' WHERE `id`=351; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Jetzt ist es offiziell! Level %my_level, Zeit zu dominieren!' WHERE `id`=352; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Level %my_level geschafft! Zeit, der Welt meinen Stempel aufzudrücken!' WHERE `id`=353; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Level %my_level freigeschaltet! Jetzt beginnt der echte Spaß!' WHERE `id`=354; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Level %my_level, und die Welt ist mein Spielplatz!' WHERE `id`=355; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Level %my_level, bereit, der Welt meine Power zu zeigen!' WHERE `id`=356; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Gerade %my_level erreicht, jetzt geh ich all in!' WHERE `id`=357; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Level %my_level, endlich kann ich alles angehen!' WHERE `id`=358; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Level %my_level, fühl mich unaufhaltbar!' WHERE `id`=359; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Gerade Level %my_level erreicht, kanns kaum erwarten ins Endgame zu springen!' WHERE `id`=360; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Gute Arbeit, %other_name. Das hast du dir verdient.' WHERE `id`=361; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Das war mies, %other_name. Ich mags nicht, aber...' WHERE `id`=362; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Glückwunsch, %other_name, du hast den Aufstieg verdient!' WHERE `id`=363; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Verdient, %other_name - willkommen im nächsten Level!' WHERE `id`=364; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Beförderungszeit! %other_name, die hast du dir verdient!' WHERE `id`=366; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Neue Rolle für %other_name! Gut gemacht, weiter so!' WHERE `id`=367; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Dickes Gratz an %other_name, wohlverdiente Beförderung!' WHERE `id`=368; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Applaus für %other_name zur Beförderung!' WHERE `id`=369; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Gratulation an %other_name zur Beförderung! Weiter so!' WHERE `id`=370; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Gratz, %other_name, du steigst auf! Gut gemacht!' WHERE `id`=371; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Noch ein Schritt nach oben für %other_name! Glückwunsch!' WHERE `id`=372; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Harte Entscheidung, aber %other_name, du wurdest degradiert. Zeit, dich zu beweisen!' WHERE `id`=373; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Sorry, %other_name, aber es gibt eine Degradierung. Komm stärker zurück!' WHERE `id`=374; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Leider, %other_name, diesmal eine Degradierung. Beim nächsten Mal packst du es!' WHERE `id`=375; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Schwere Entscheidung, aber %other_name, du wurdest degradiert. Zeit, dich wieder hochzugrinden!' WHERE `id`=376; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Unschön, aber %other_name, vorerst eine Degradierung.' WHERE `id`=377; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Sorry, %other_name, dein Rang wurde gesenkt. Lass uns zusammen härter arbeiten!' WHERE `id`=378; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Eine Degradierung für %other_name... Zeit, sich zu fokussieren und wieder hochzukommen!' WHERE `id`=379; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Nicht das, was wir wollten, aber %other_name, du wurdest degradiert. Lern draus und komm stärker zurück!' WHERE `id`=380; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Harter Moment für %other_name, aber wir wissen, du kommst von der Degradierung zurück!' WHERE `id`=381; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Sorry, %other_name, aber du wurdest degradiert. Zeit für Verbesserungen!' WHERE `id`=382; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Wir wollten das nicht für %other_name, aber es gab eine Degradierung. Zeit, besser zu werden!' WHERE `id`=383; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Frisches Blut gesucht! Tritt der Gilde bei, sei Teil von was Großem!' WHERE `id`=384; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Wir rekrutieren neue Mitglieder! Wenn du bereit bist, schließ dich an - die Gildentür steht offen!' WHERE `id`=385; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Die Gilde sucht fähige Abenteurer. Schließ dich an und geh mit uns ab!' WHERE `id`=386; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Bock auf eine starke Gilde? Wir suchen neue Member! Komm rein!' WHERE `id`=387; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Die Gilde wächst! Join uns für fette Abenteuer und Loot!' WHERE `id`=388; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Wer hat Bock auf %instance_name?' WHERE `id`=389; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Gibts Gruppen für %instance_name?' WHERE `id`=390; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Brauch jemand Hilfe für %instance_name?' WHERE `id`=391; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Suche Gruppe: %instance_name.' WHERE `id`=392; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Braucht wer %my_role für %instance_name?' WHERE `id`=393; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Fehlt %my_role für %instance_name?' WHERE `id`=394; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Ich kann %my_role für %instance_name sein.' WHERE `id`=395; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Braucht ihr %my_role für %instance_name?' WHERE `id`=397; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Braucht wer Gear aus %instance_name?' WHERE `id`=398; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Kleiner Grind in %instance_name?' WHERE `id`=399; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Lust auf %instance_name' WHERE `id`=400; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Bock auf %instance_name.' WHERE `id`=402; +UPDATE `ai_playerbot_texts` SET `text_loc3`='%my_role sucht Gruppe für %instance_name.' WHERE `id`=403; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Was ist mit %instance_name?' WHERE `id`=404; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Rein in %instance_name?' WHERE `id`=406; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Suche Gruppe für %instance_name.' WHERE `id`=407; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Braucht wer Hilfe bei Quests in %instance_name?' WHERE `id`=408; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Bock auf Quests in %instance_name.' WHERE `id`=409; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Wer hat Quests in %instance_name?' WHERE `id`=410; +UPDATE `ai_playerbot_texts` SET `text_loc3`='%my_role: Platz in Gruppe für %instance_name?' WHERE `id`=412; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Läuft überhaupt noch jemand %instance_name?' WHERE `id`=413; +UPDATE `ai_playerbot_texts` SET `text_loc3`='%instance_name: nimmt wer einen %my_role mit?' WHERE `id`=414; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Lohnt es sich als %my_role in %instance_name?' WHERE `id`=415; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Lohnt es sich echt, nach %instance_name zu gehen?' WHERE `id`=416; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Die Bosse in %instance_name droppen gutes Gear. Bock zu grinden?' WHERE `id`=418; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Was ist mit %instance_name?' WHERE `id`=419; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Braucht jemand %my_role?' WHERE `id`=420; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Braucht wer %my_role?' WHERE `id`=421; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Wer hat Bock auf %instance_name?' WHERE `id`=422; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Kann mich jemand bei %instance_name beschwören?' WHERE `id`=423; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Trefft mich in %instance_name' WHERE `id`=424; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Bock auf schnellen %instance_name Run' WHERE `id`=425; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Bock auf kompletten %instance_name Run' WHERE `id`=426; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Wie oft wart ihr schon in %instance_name?' WHERE `id`=427; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Noch ein %instance_name Run?' WHERE `id`=428; +UPDATE `ai_playerbot_texts` SET `text_loc3`='In %instance_name gewiped? Nehmt lieber mich!' WHERE `id`=429; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Nehmt mich bitte mit nach %instance_name.' WHERE `id`=430; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Wer nimmt %my_role mit nach %instance_name?' WHERE `id`=433; +UPDATE `ai_playerbot_texts` SET `text_loc3`='LFG %instance_name, bin %my_role' WHERE `id`=434; +UPDATE `ai_playerbot_texts` SET `text_loc3`='%my_role LFG %instance_name' WHERE `id`=435; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Brauche einen DD für %instance_name' WHERE `id`=437; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Suche einen Heiler für %instance_name' WHERE `id`=438; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Will %instance_name machen. Brauche eine Gruppe!' WHERE `id`=440; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Suche noch einen für %instance_name' WHERE `id`=442; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Will jemand mit nach %instance_name?' WHERE `id`=443; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Interesse an %instance_name?' WHERE `id`=444; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Suche einen schnellen Run durch %instance_name' WHERE `id`=445; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Wer ist dabei für %instance_name?' WHERE `id`=446; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Wollt ihr %instance_name farmen?' WHERE `id`=448; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Will %instance_name abschließen' WHERE `id`=449; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Suche Carry durch %instance_name' WHERE `id`=451; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Laufe %instance_name, suche andere' WHERE `id`=453; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Suche jemanden, der bei %instance_name hilft' WHERE `id`=455; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Brauche %my_role für %instance_name!' WHERE `id`=456; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Bock auf einen %instance_name Run?' WHERE `id`=457; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Brauche %my_role für %instance_name Run' WHERE `id`=458; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Will jemand Gear aus %instance_name farmen?' WHERE `id`=459; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Suche Gruppe für %instance_name Speedrun' WHERE `id`=460; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Brauche Gruppe, um %instance_name zu clearen' WHERE `id`=461; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Interesse, %instance_name zu farmen?' WHERE `id`=462; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Suche etwas Gear aus %instance_name' WHERE `id`=463; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Wer hat Lust auf einen schnellen %instance_name Run?' WHERE `id`=464; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Will jemand %instance_name zusammen angehen?' WHERE `id`=465; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Suche Leute, um %instance_name abzuschließen' WHERE `id`=466; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Kriegen wir eine Gruppe für %instance_name zusammen?' WHERE `id`=467; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Brauche einen schnellen Run für %instance_name' WHERE `id`=468; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Wer hat Lust, %instance_name zusammen zu farmen?' WHERE `id`=469; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Suche noch ein paar Leute für %instance_name' WHERE `id`=470; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Braucht jemand Hilfe bei den Mechaniken in %instance_name?' WHERE `id`=471; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Brauche schnell eine Gruppe für %instance_name' WHERE `id`=472; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Will jemand %instance_name als Speedrun laufen?' WHERE `id`=473; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Suche einen schnellen Abschluss von %instance_name' WHERE `id`=474; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Suche jemanden, der bei %instance_name mitkommt' WHERE `id`=475; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Wer hat Lust, %instance_name zu clearen?' WHERE `id`=476; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Brauche Hilfe beim Endboss von %instance_name' WHERE `id`=477; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Wer hat heute Lust, %instance_name zu laufen?' WHERE `id`=478; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Suche schnellen Run in %instance_name, um etwas Gear zu farmen' WHERE `id`=479; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Will jemand Mats aus %instance_name farmen?' WHERE `id`=480; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Lass uns eine Gruppe für %instance_name machen' WHERE `id`=481; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Braucht wer Hilfe bei %quest_link?' WHERE `id`=482; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Will jemand %quest_link teilen?' WHERE `id`=483; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Macht jemand %quest_link?' WHERE `id`=484; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Bock auf %quest_link.' WHERE `id`=485; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Wer hilft bei %quest_link?' WHERE `id`=487; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Braucht jemand Unterstützung bei %quest_link?' WHERE `id`=488; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Interesse an %quest_link?' WHERE `id`=489; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Will jemand %quest_link abschließen?' WHERE `id`=490; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Braucht wer ein Team für %quest_link?' WHERE `id`=491; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Wer hat Bock auf %quest_link?' WHERE `id`=492; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Will %quest_link machen. Wer ist dabei?' WHERE `id`=497; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Wer ist bereit für %quest_link?' WHERE `id`=499; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Wer will bei %quest_link mitmachen?' WHERE `id`=500; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Wer ist bei %quest_link dabei?' WHERE `id`=501; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Brauche hier etwas Hilfe bei %quest_link.' WHERE `id`=502; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Wer ist bereit, %quest_link zu machen?' WHERE `id`=504; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Suche etwas Hilfe für %quest_link.' WHERE `id`=505; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Braucht jemand Hilfe bei %quest_link?' WHERE `id`=506; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Wer hat Lust, %quest_link abzuschließen?' WHERE `id`=507; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Braucht jemand Unterstützung bei %quest_link?' WHERE `id`=508; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Wer kann bei %quest_link helfen?' WHERE `id`=509; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Suche eine helfende Hand bei %quest_link.' WHERE `id`=510; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Ist jemand bereit für %quest_link?' WHERE `id`=511; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Kann jemand bei %quest_link dazukommen?' WHERE `id`=512; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Suche ein paar Mitstreiter für %quest_link.' WHERE `id`=513; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Will jemand sich für %quest_link zusammentun?' WHERE `id`=514; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Wer muss %quest_link noch abschließen?' WHERE `id`=516; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Will %quest_link abschließen.' WHERE `id`=517; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Wer kann bei %quest_link mitkommen?' WHERE `id`=518; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Interesse, %quest_link abzuschließen?' WHERE `id`=519; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Bock, bei %quest_link zu helfen?' WHERE `id`=520; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Ist jemand bereit, bei %quest_link zu helfen?' WHERE `id`=521; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Brauche jemanden, um %quest_link zu beenden.' WHERE `id`=522; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Will jemand %quest_link beenden?' WHERE `id`=523; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Gibt’s Hilfe für %quest_link?' WHERE `id`=524; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Wer ist dabei für %quest_link?' WHERE `id`=525; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Suche Partner zum Abschließen von %quest_link.' WHERE `id`=526; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Wer hat Lust, %quest_link zu beenden?' WHERE `id`=527; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Heute jemand Interesse an %quest_link?' WHERE `id`=529; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Wer hat jetzt Bock auf %quest_link?' WHERE `id`=531; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Will jemand %quest_link starten?' WHERE `id`=532; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Bitte um Hilfe bei %quest_link.' WHERE `id`=533; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Wer kann mir bei %quest_link helfen?' WHERE `id`=534; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Suche Gruppe für %quest_link.' WHERE `id`=535; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Jemand bereit zum %category farmen?' WHERE `id`=536; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Suche Hilfe beim %category farmen.' WHERE `id`=537; +UPDATE `ai_playerbot_texts` SET `text_loc3`='%category sind verdammt teuer!' WHERE `id`=538; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Will %category.' WHERE `id`=539; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Kaufe: %category.' WHERE `id`=541; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Interesse an %category?' WHERE `id`=542; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Verkaufe: %category.' WHERE `id`=543; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Will %category farmen.' WHERE `id`=546; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Suche Gruppe fürs %category farmen.' WHERE `id`=547; +UPDATE `ai_playerbot_texts` SET `text_loc3`='%category sind willkommen.' WHERE `id`=548; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Kaufe alles von %category.' WHERE `id`=549; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Wow, alle farmen %category!' WHERE `id`=550; +UPDATE `ai_playerbot_texts` SET `text_loc3`='AH ist heiß auf %category.' WHERE `id`=552; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Will etwas %category tauschen.' WHERE `id`=554; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Etwas %category bitte?' WHERE `id`=558; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Hätte wohl den Skill für %category lernen sollen.' WHERE `id`=559; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Ich geiere auf %category.' WHERE `id`=560; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Für %category würden die Leute töten.' WHERE `id`=561; +UPDATE `ai_playerbot_texts` SET `text_loc3`='%category ist ein Top-Deal!' WHERE `id`=562; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Wo farmt man am besten %category?' WHERE `id`=564; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Bin ready für %category.' WHERE `id`=565; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Ich behalte meine ganzen %category wohl lieber.' WHERE `id`=567; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Brauchst du eine Gruppe? Vielleicht zum %category farmen?' WHERE `id`=568; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Denke immer noch über %category nach.' WHERE `id`=569; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Hab schon von %category gehört, aber meine Taschen sind leer.' WHERE `id`=570; +UPDATE `ai_playerbot_texts` SET `text_loc3`='LFG für %category' WHERE `id`=571; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Würde mich der Verkauf von %category reich machen?' WHERE `id`=572; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Okay. Ich farme %category morgen.' WHERE `id`=573; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Hab mindestens zehn Leute gesehen, die %category farmen.' WHERE `id`=575; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Hab gestern all meine %category verkauft. Bin komplett pleite!' WHERE `id`=576; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Will einer Gilde joinen, die %category farmt.' WHERE `id`=577; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Verkaufe %category, wer hat Interesse?' WHERE `id`=580; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Verkaufe %category, flüster mir.' WHERE `id`=582; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Brauche %category, verkauft das jemand?' WHERE `id`=584; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Hab %category zu verkaufen, meldet euch!' WHERE `id`=585; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Verkaufe %category, bester Preis am Markt.' WHERE `id`=588; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Suche %category im Tausch gegen %category.' WHERE `id`=589; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Wer braucht %category? Hab was zu verkaufen!' WHERE `id`=591; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Habe %category zu verkaufen, flüster mir für den Preis.' WHERE `id`=592; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Will %category verkaufen, flüster mir für Details.' WHERE `id`=593; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Kaufe: %category. Verkauft das jemand?' WHERE `id`=594; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Suche %category, bitte melden.' WHERE `id`=595; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Wer hat Interesse an %category?' WHERE `id`=596; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Kann jemand beim %category farmen helfen?' WHERE `id`=597; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Will %category kaufen, flüster mir einfach.' WHERE `id`=599; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Suche %category. Wer hat was?' WHERE `id`=600; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Kaufe: %category zum fairen Preis.' WHERE `id`=601; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Brauche dringend %category, hat wer was?' WHERE `id`=602; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Hab %category, verkaufe günstig.' WHERE `id`=603; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Verkaufe %category zum guten Kurs.' WHERE `id`=604; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Suche %category, verkauft wer günstig?' WHERE `id`=605; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Verkauft jemand %category? Hätte Interesse.' WHERE `id`=606; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Brauche %category, flüstert mir wenn ihr verkauft.' WHERE `id`=607; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Hat wer %category übrig zum Tauschen?' WHERE `id`=608; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Hat wer Interesse, %category zu tauschen?' WHERE `id`=610; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Verkaufe %category, meldet euch für Tausch.' WHERE `id`=611; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Kaufe: %category, suche guten Kurs.' WHERE `id`=612; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Wer braucht %category? Hab was übrig.' WHERE `id`=613; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Will wer %category? Verkaufe billig.' WHERE `id`=614; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Suche %category, verkauft wer was?' WHERE `id`=615; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Braucht jemand %category? Hab was zum Tauschen.' WHERE `id`=616; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Kaufe: %category. Ist jemand günstiger als AH?' WHERE `id`=617; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Verkaufe %category billig, flüster mir für Details.' WHERE `id`=618; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Braucht wer %category? Hab was zu verkaufen.' WHERE `id`=619; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Tausche %category gegen was anderes.' WHERE `id`=620; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Hab %category, tausche gegen %category.' WHERE `id`=621; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Kaufe: %category, hat wer was übrig?' WHERE `id`=622; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Farmt wer Ruf bei %faction?' WHERE `id`=623; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Kann wer bei %faction helfen?' WHERE `id`=624; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Hab Bock auf Quests für %faction.' WHERE `id`=625; +UPDATE `ai_playerbot_texts` SET `text_loc3`='%faction ist die beste Fraktion.' WHERE `id`=626; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Fehlt nur noch ein bisschen bis %rep_level bei %faction.' WHERE `id`=627; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Hat jemand %rep_level bei %faction?' WHERE `id`=628; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Wer will %rep_level bei %faction sein?' WHERE `id`=629; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Ich werde nie %rep_level bei %faction sein.' WHERE `id`=630; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Fehlt jemandem Ruf bei %faction?' WHERE `id`=631; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Kann beim Ruf farmen für %faction helfen.' WHERE `id`=632; +UPDATE `ai_playerbot_texts` SET `text_loc3`='%faction: brauche %rndK bis %rep_level.' WHERE `id`=634; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Wer kann Quests von %faction teilen?' WHERE `id`=635; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Gibts Inis für %faction?' WHERE `id`=636; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Hab Bock, Ruf bei %faction zu grinden.' WHERE `id`=637; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Lasst uns Ruf bei %faction farmen!' WHERE `id`=638; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Farme Ruf bei %faction.' WHERE `id`=639; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Bock, für %faction zu farmen.' WHERE `id`=640; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Brauche Hilfe bei %faction.' WHERE `id`=641; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Verkauft %faction was Nützliches?' WHERE `id`=642; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Wer farmt für %faction?' WHERE `id`=644; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Wie farmt man %faction am besten?' WHERE `id`=645; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Ich hasse den Rufgrind für %faction.' WHERE `id`=646; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Ich hab %faction so satt.' WHERE `id`=647; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Gehen wir %faction an?' WHERE `id`=648; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Scheint, als wenn alle %rep_level bei %faction sind. Nur ich hänge wie immer hinterher.' WHERE `id`=649; +UPDATE `ai_playerbot_texts` SET `text_loc3`='LFG für Rufgrind bei %faction?' WHERE `id`=650; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Kann jemand einen guten Spot für Rufgrind bei %faction empfehlen?' WHERE `id`=651; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Bringt mir Ruf bei %faction überhaupt was?' WHERE `id`=652; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Wer hätte gedacht, dass Ruf bei %faction doch noch nützlich ist...' WHERE `id`=653; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Lohnt es sich, meinen Ruf bei %faction zu pushen?' WHERE `id`=655; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Was ist besser für %faction? Quests oder Mobs grinden?' WHERE `id`=656; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Grinde euren Ruf bei %faction, gebt mir nur etwas Gold.' WHERE `id`=657; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Ich glaube, Ruf bei %faction zu grinden dauert ewig.' WHERE `id`=658; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Ich kill jeden Tag für %faction, bin aber noch weit weg von %rep_level.' WHERE `id`=659; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Sinken die AH-Gebühren auf %my_level?' WHERE `id`=660; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Wie viele Fraktionen hast du auf ehrfürchtig?' WHERE `id`=661; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Verdammt. Meine Gilde hat gestern ohne mich gut Ruf bei %faction gegrindet.' WHERE `id`=663; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Keiner will mir helfen, weil ich schon %rep_level bei %faction bin.' WHERE `id`=664; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Bleib bitte weg von %faction.' WHERE `id`=665; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Farmt heute jemand Ruf bei %faction?' WHERE `id`=666; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Helft mir, Ruf bei %faction zu grinden!' WHERE `id`=667; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Ich brauch so dringend %rep_level bei %faction!' WHERE `id`=668; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Lohnt sich der Grind für %faction?' WHERE `id`=669; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Kennt jemand gute Spots für Ruf bei %faction?' WHERE `id`=670; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Ich liebe es, Ruf bei %faction zu grinden!' WHERE `id`=671; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Brauche Hilfe, um den Rufgrind bei %faction abzuschließen!' WHERE `id`=672; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Nur noch ein paar Stufen bis %rep_level bei %faction!' WHERE `id`=673; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Wer hat heute Bock auf Grind für %faction?' WHERE `id`=674; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Suche Mitstreiter für Rufgrind bei %faction!' WHERE `id`=675; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Ich bin das Rufgrinden für %faction leid!' WHERE `id`=676; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Noch wer auf Rufgrind bei %faction?' WHERE `id`=677; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Zeit, den Rufgrind bei %faction richtig anzugehen!' WHERE `id`=678; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Helft mir, den Ruf bei %faction fertig zu machen!' WHERE `id`=679; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Mir fehlen nur noch %rndK für den %faction Ruf!' WHERE `id`=680; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Den ganzen Tag Ruf bei %faction am farmen!' WHERE `id`=681; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Rufgrind bei %faction endet nie!' WHERE `id`=683; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Hilfe bei den Daily-Quests von %faction?' WHERE `id`=684; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Wer ist grad beim Grind für %faction?' WHERE `id`=685; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Lasst uns Quests von %faction zusammen machen!' WHERE `id`=686; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Farmt heute jemand Ruf bei %faction?' WHERE `id`=687; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Brauche Hilfe beim Ruf bei %faction für %rep_level!' WHERE `id`=688; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Wer will mit mir Ruf bei %faction grinden?' WHERE `id`=689; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Kommt mit zum Rufgrind bei %faction!' WHERE `id`=690; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Läuft bei mir beim Rufgrind für %faction!' WHERE `id`=691; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Will jemand Boosts für den Rufgrind bei %faction?' WHERE `id`=692; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Bei %faction fehlt nicht mehr viel bis %rep_level, helft mir doch mal!' WHERE `id`=694; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Bock, mir beim Rufgrind für %faction zu helfen?' WHERE `id`=695; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Farme wieder Ruf bei %faction!' WHERE `id`=696; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Kennt jemand einen guten Spot für Ruf bei %faction?' WHERE `id`=697; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Wie viel fehlt noch beim Rufgrind für %faction?' WHERE `id`=698; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Macht jemand Quests von %faction mit mir?' WHERE `id`=699; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Suche jemand für Rufgrind bis %rep_level bei %faction!' WHERE `id`=700; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Mir fehlen nur noch %rndK Ruf bei %faction!' WHERE `id`=701; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Der Grind für %faction ist brutal!' WHERE `id`=702; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Farmt jemand Ruf bei %faction für %rep_level?' WHERE `id`=703; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Lasst uns den Rufgrind bei %faction zusammen machen!' WHERE `id`=704; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Mehr Ruf bei %faction, mehr Belohnungen!' WHERE `id`=705; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Farme Ruf bei %faction als %my_class' WHERE `id`=706; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Hängt noch jemand bei %faction auf %rep_level fest?' WHERE `id`=707; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Die ganze Nacht Rufgrind bei %faction!' WHERE `id`=708; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Wer will den Rufgrind bei %faction mit mir abschließen?' WHERE `id`=709; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Ich kann beim Rufgrind für %faction helfen!' WHERE `id`=710; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Bereit für mehr Rufgrind bei %faction!' WHERE `id`=711; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Bock zu helfen beim Ruf für %faction? Ich brauch das dringend!' WHERE `id`=712; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Ich brauche noch %rndK für den Ruf bei %faction!' WHERE `id`=713; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Farmt mit mir für Ruf bei %faction!' WHERE `id`=714; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Mir fehlen nur noch %rndK Ruf bei %faction!' WHERE `id`=715; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Der Rufgrind bei %faction nimmt kein Ende...' WHERE `id`=716; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Hat jemand Items für Rufboost bei %faction?' WHERE `id`=717; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Farmt jemand Ruf bei %faction für Mounts?' WHERE `id`=719; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Chance, mit mir Ruf bei %faction zu farmen?' WHERE `id`=720; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Ich bin so kurz vor %rep_level bei %faction!' WHERE `id`=721; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Helft mir, %rep_level bei %faction zu erreichen!' WHERE `id`=722; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Ich bin dabei, den %faction Rufgrind abzuschließen!' WHERE `id`=723; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Brauche Hilfe beim Rufgrind für %faction!' WHERE `id`=724; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Wer kann mit mir Ruf bei %faction farmen?' WHERE `id`=726; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Rufgrind bei %faction non-stop!' WHERE `id`=727; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Wer grindet gerade noch Ruf bei %faction?' WHERE `id`=728; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Will jemand zum Spaß Ruf bei %faction farmen?' WHERE `id`=729; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Ich muss noch Ruf bei %faction farmen, um neue Quests freizuschalten!' WHERE `id`=730; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Bock, Ruf bei %faction für Belohnungen zu grinden!' WHERE `id`=731; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Tag für Tag, Rufgrind bei %faction!' WHERE `id`=732; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Will jemand beim Rufgrind für %faction helfen?' WHERE `id`=733; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Helft mir, mit Ruf bei %faction Belohnungen freizuschalten!' WHERE `id`=734; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Ich grinde Ruf bei %faction für Mounts!' WHERE `id`=735; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Kommt mit, Ruf bei %faction farmen!' WHERE `id`=736; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Beim Rufgrind für %faction bin ich fast da!' WHERE `id`=737; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Grinde Ruf bei %faction mit meinen Leuten!' WHERE `id`=738; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Hab Bock auf Party in %zone_name.' WHERE `id`=739; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Sucht jemand %my_role?' WHERE `id`=740; +UPDATE `ai_playerbot_texts` SET `text_loc3`='%my_role sucht Gilde.' WHERE `id`=741; +UPDATE `ai_playerbot_texts` SET `text_loc3`='%my_role will einer guten Gilde beitreten.' WHERE `id`=743; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Fühlt sich noch wer einsam?' WHERE `id`=745; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Wer will was abhaben?' WHERE `id`=747; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Kommt her und holt mich!' WHERE `id`=748; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Macht hier grade jemand etwas?' WHERE `id`=750; +UPDATE `ai_playerbot_texts` SET `text_loc3`='%zone_name: ist hier jemand?' WHERE `id`=751; +UPDATE `ai_playerbot_texts` SET `text_loc3`='%zone_name: Wo sind alle?' WHERE `id`=752; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Scheint als wäre ich allein in %zone_name.' WHERE `id`=753; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Trefft mich in %zone_name.' WHERE `id`=754; +UPDATE `ai_playerbot_texts` SET `text_loc3`='%zone_name ist der beste Spot!' WHERE `id`=756; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Will nach %zone_name. Kommt wer mit?' WHERE `id`=757; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Ich mag %zone_name nicht, aber wohin sonst?' WHERE `id`=759; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Gibt’s gute Quests in %zone_name?' WHERE `id`=760; +UPDATE `ai_playerbot_texts` SET `text_loc3`='%zone_name ist der übelste Spot.' WHERE `id`=764; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Schnappt mich in %zone_name!' WHERE `id`=765; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Ab nach %zone_name!' WHERE `id`=766; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Bock zu questen in %zone_name' WHERE `id`=767; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Hat wer Quests in %zone_name?' WHERE `id`=768; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Kommt her nach %zone_name!' WHERE `id`=769; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Sieht so aus, als wär keine Horde in %zone_name' WHERE `id`=770; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Sieht so aus, als wär keine Allianz in %zone_name' WHERE `id`=771; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Ich bin echt müde von %zone_name. Vielleicht sollte ich woanders hin?' WHERE `id`=772; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Ich will nach Hause und dann in die Kiste.' WHERE `id`=774; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Weiß wer, was man fürs Beidhändig-Kämpfen braucht?' WHERE `id`=775; +UPDATE `ai_playerbot_texts` SET `text_loc3`='hi zusammen!' WHERE `id`=776; +UPDATE `ai_playerbot_texts` SET `text_loc3`='%zone_name ist gemütlich' WHERE `id`=777; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Ich fühl mich super' WHERE `id`=778; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Ich ignoriere Leute nicht, ich trolle sie, bis sie mich ignorieren' WHERE `id`=779; +UPDATE `ai_playerbot_texts` SET `text_loc3`='schön zu sehen, dass der Chat sich noch erinnert' WHERE `id`=781; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Wie jede Waffe ist es Jäger-BiS' WHERE `id`=782; +UPDATE `ai_playerbot_texts` SET `text_loc3`='für mich geht es im Spiel nur ums Solo-Spielen und darum, neue Wege zu finden, Dinge solo zu machen' WHERE `id`=783; +UPDATE `ai_playerbot_texts` SET `text_loc3`='ich habe NIEMANDEN jemals abgezockt' WHERE `id`=784; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Zeit, mir den Weg nach %zone_name freizukämpfen' WHERE `id`=787; +UPDATE `ai_playerbot_texts` SET `text_loc3`='ich muss kacken' WHERE `id`=789; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Wenn du deine häutbaren Kills nicht lootest, schrumpft dein Schniedel jedes mal dauerhaft um 1mm' WHERE `id`=790; +UPDATE `ai_playerbot_texts` SET `text_loc3`='NEEEEEEEEEEEEIN' WHERE `id`=791; +UPDATE `ai_playerbot_texts` SET `text_loc3`='ICH MAG ZÜGE' WHERE `id`=792; +UPDATE `ai_playerbot_texts` SET `text_loc3`='/w mir im chat' WHERE `id`=793; +UPDATE `ai_playerbot_texts` SET `text_loc3`='hi, wie geht es euch' WHERE `id`=794; +UPDATE `ai_playerbot_texts` SET `text_loc3`='hab mich grad ausgeloggt und wieder eingeloggt' WHERE `id`=795; +UPDATE `ai_playerbot_texts` SET `text_loc3`='könnt ihr mal leiser sein, ich hab mich in %zone_name verlaufen' WHERE `id`=796; +UPDATE `ai_playerbot_texts` SET `text_loc3`='wer will mit mir was trinken in %zone_name ...hicks!' WHERE `id`=797; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Früher war der Bait glaubwürdiger.' WHERE `id`=799; +UPDATE `ai_playerbot_texts` SET `text_loc3`='vielleicht hast du einfach deine Unschuld verloren' WHERE `id`=800; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Gibts hier Gilden, die %my_role mitziehen?' WHERE `id`=801; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Sobald man höher kommt, ist Gold easy zu machen' WHERE `id`=802; +UPDATE `ai_playerbot_texts` SET `text_loc3`='moin' WHERE `id`=803; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Warum tut mir der Arsch weh?' WHERE `id`=804; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Ich hab das Gefühl, Willenskraft ist BiS zum Leveln' WHERE `id`=805; +UPDATE `ai_playerbot_texts` SET `text_loc3`='bei Trollen erst recht' WHERE `id`=806; +UPDATE `ai_playerbot_texts` SET `text_loc3`='KANN MICH JEMAND INVITEN' WHERE `id`=807; +UPDATE `ai_playerbot_texts` SET `text_loc3`='brauche viele Drinks' WHERE `id`=808; +UPDATE `ai_playerbot_texts` SET `text_loc3`='verdammte Gnome' WHERE `id`=809; +UPDATE `ai_playerbot_texts` SET `text_loc3`='niemand mag Gnome' WHERE `id`=810; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Gnome taugen nur für eins' WHERE `id`=811; +UPDATE `ai_playerbot_texts` SET `text_loc3`='nun ja' WHERE `id`=812; +UPDATE `ai_playerbot_texts` SET `text_loc3`='selbstständige Gedanken sind schon gruselig' WHERE `id`=814; +UPDATE `ai_playerbot_texts` SET `text_loc3`='der Geist ist formbarer, als man glaubt' WHERE `id`=815; +UPDATE `ai_playerbot_texts` SET `text_loc3`='gibts hier Levelgilden?' WHERE `id`=816; +UPDATE `ai_playerbot_texts` SET `text_loc3`='brb' WHERE `id`=817; +UPDATE `ai_playerbot_texts` SET `text_loc3`='warum ist Schnee weiß, aber Eis klar? ist doch das Gleiche' WHERE `id`=818; +UPDATE `ai_playerbot_texts` SET `text_loc3`='warum ist Schlagsahne fluffig und normale nicht' WHERE `id`=819; +UPDATE `ai_playerbot_texts` SET `text_loc3`='warum riechen Füße, wenn sie keine Nase haben' WHERE `id`=820; +UPDATE `ai_playerbot_texts` SET `text_loc3`='scheint als hätte jemand ne Dose Neulinge aufgemacht' WHERE `id`=821; +UPDATE `ai_playerbot_texts` SET `text_loc3`='hört auf, Neulinge mit Bullshit-Antworten zu trollen' WHERE `id`=822; +UPDATE `ai_playerbot_texts` SET `text_loc3`='gibts hier auf dem Server PvP?' WHERE `id`=823; +UPDATE `ai_playerbot_texts` SET `text_loc3`='eh klar' WHERE `id`=824; +UPDATE `ai_playerbot_texts` SET `text_loc3`='puh... :)' WHERE `id`=825; +UPDATE `ai_playerbot_texts` SET `text_loc3`='wusstet ihr schon, dass...' WHERE `id`=826; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Ich stell mir lieber nicht vor, wie sich die Viecher fühlen, während ich sie umboxe.' WHERE `id`=827; +UPDATE `ai_playerbot_texts` SET `text_loc3`='ups, falscher Chat' WHERE `id`=828; +UPDATE `ai_playerbot_texts` SET `text_loc3`='bruh, ihr dreht heute völlig durch' WHERE `id`=829; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Nett hier. Aber waren Sie schon mal in Darnassus?' WHERE `id`=830; +UPDATE `ai_playerbot_texts` SET `text_loc3`='grrr wütend' WHERE `id`=831; +UPDATE `ai_playerbot_texts` SET `text_loc3`='der Grind macht Spaß' WHERE `id`=832; +UPDATE `ai_playerbot_texts` SET `text_loc3`='WoW hält mich wachsam' WHERE `id`=833; +UPDATE `ai_playerbot_texts` SET `text_loc3`='kurze Frage: wo krieg ich den Buff für mehr XP? bin in %zone_name' WHERE `id`=834; +UPDATE `ai_playerbot_texts` SET `text_loc3`='mögt ihr Würstchen?' WHERE `id`=835; +UPDATE `ai_playerbot_texts` SET `text_loc3`='inv mich. ich helfe' WHERE `id`=836; +UPDATE `ai_playerbot_texts` SET `text_loc3`='welche Klasse ist gut für PvP?' WHERE `id`=837; +UPDATE `ai_playerbot_texts` SET `text_loc3`='wo zum Teufel ist der Kochlehrer in %zone_name' WHERE `id`=838; +UPDATE `ai_playerbot_texts` SET `text_loc3`='wisst ihr, was in %zone_name abgeht?' WHERE `id`=839; +UPDATE `ai_playerbot_texts` SET `text_loc3`='muss was craften' WHERE `id`=840; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Bock auf Blödsinn in %zone_name?' WHERE `id`=841; +UPDATE `ai_playerbot_texts` SET `text_loc3`='machen wir %zone_name zu unserem Spielplatz' WHERE `id`=842; +UPDATE `ai_playerbot_texts` SET `text_loc3`='ich verirr mich gleich wieder in %zone_name' WHERE `id`=843; +UPDATE `ai_playerbot_texts` SET `text_loc3`='kaum zu glauben, dass ich immer noch in %zone_name hocke' WHERE `id`=844; +UPDATE `ai_playerbot_texts` SET `text_loc3`='lasst uns die Mailbox in %zone_name raiden!' WHERE `id`=846; +UPDATE `ai_playerbot_texts` SET `text_loc3`='ich schwöre, in %zone_name wimmelt es von Trollen' WHERE `id`=847; +UPDATE `ai_playerbot_texts` SET `text_loc3`='lasst uns zusammen Chaos in %zone_name anrichten' WHERE `id`=848; +UPDATE `ai_playerbot_texts` SET `text_loc3`='hab Bock, in %zone_name absolut gar nix zu machen' WHERE `id`=849; +UPDATE `ai_playerbot_texts` SET `text_loc3`='in %zone_name hört eh keiner zu' WHERE `id`=850; +UPDATE `ai_playerbot_texts` SET `text_loc3`='ist %zone_name überhaupt real oder wie Bielefeld?' WHERE `id`=851; +UPDATE `ai_playerbot_texts` SET `text_loc3`='schickt mal wer Hilfe nach %zone_name! ist wild hier!' WHERE `id`=852; +UPDATE `ai_playerbot_texts` SET `text_loc3`='ich bin sicher, in %zone_name spukt es' WHERE `id`=853; +UPDATE `ai_playerbot_texts` SET `text_loc3`='wenn %zone_name reden könnte, würde es wahrscheinlich schreien' WHERE `id`=854; +UPDATE `ai_playerbot_texts` SET `text_loc3`='irgendwas ist faul an %zone_name' WHERE `id`=855; +UPDATE `ai_playerbot_texts` SET `text_loc3`='gleich zerleg ich %zone_name mit meiner Awesomeness' WHERE `id`=856; +UPDATE `ai_playerbot_texts` SET `text_loc3`='sagt %zone_name, dass ich da bin' WHERE `id`=857; +UPDATE `ai_playerbot_texts` SET `text_loc3`='ich hab mich in %zone_name verlaufen, sendet Hilfe' WHERE `id`=858; +UPDATE `ai_playerbot_texts` SET `text_loc3`='ich starte ne Revolution in %zone_name' WHERE `id`=859; +UPDATE `ai_playerbot_texts` SET `text_loc3`='findet noch wer %zone_name verdächtig ruhig?' WHERE `id`=860; +UPDATE `ai_playerbot_texts` SET `text_loc3`='ich wette, %zone_name hat Geheimnisse, von denen wir nix wissen' WHERE `id`=861; +UPDATE `ai_playerbot_texts` SET `text_loc3`='%my_race kann man in %zone_name nie genug haben' WHERE `id`=862; +UPDATE `ai_playerbot_texts` SET `text_loc3`='langsam glaube ich, %zone_name ist nur ein Mythos' WHERE `id`=863; +UPDATE `ai_playerbot_texts` SET `text_loc3`='wer hätte gedacht, dass %zone_name so abgeht?' WHERE `id`=864; +UPDATE `ai_playerbot_texts` SET `text_loc3`='als wäre das Spiel in %zone_name kaputt' WHERE `id`=865; +UPDATE `ai_playerbot_texts` SET `text_loc3`='ist %zone_name eigentlich ne Wüste, oder bin ich einfach nur lost?' WHERE `id`=866; +UPDATE `ai_playerbot_texts` SET `text_loc3`='fühlt sich langsam an wie %zone_name im Mixer' WHERE `id`=867; +UPDATE `ai_playerbot_texts` SET `text_loc3`='hat jemand ne Karte für %zone_name?' WHERE `id`=868; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Noch wer, der denkt das %zone_name uns umbringen will?' WHERE `id`=869; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Ich bin auf wilder Fahrt durch %zone_name!' WHERE `id`=870; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Bin das nur ich, oder wird %zone_name immer weirder?' WHERE `id`=871; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Ich bin davon überzeugt, das %zone_name heimlich ein Freizeitpark ist.' WHERE `id`=872; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Tastatur kaputt... wahrscheinlich wieder zu wenig Freunde.' WHERE `id`=873; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Glaubt ihr, die Bäume in dem Spiel haben Gefühle?' WHERE `id`=874; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Ich drücke immer dieselbe Taste, aber ich gewinne trotzdem nicht' WHERE `id`=875; +UPDATE `ai_playerbot_texts` SET `text_loc3`='ich wette, ich könnte nen Raid gewinnen, in dem ich einfach nur LOOT schreie' WHERE `id`=876; +UPDATE `ai_playerbot_texts` SET `text_loc3`='versuche seit einer Stunde, auf mein Mount zu steigen, nix passiert' WHERE `id`=877; +UPDATE `ai_playerbot_texts` SET `text_loc3`='gibt es nen Weg, unverwundbar zu werden, ohne wirklich zu spielen?' WHERE `id`=878; +UPDATE `ai_playerbot_texts` SET `text_loc3`='kann ich einfach random Tasten smashen und trotzdem gewinnen? frage für nen Freund' WHERE `id`=879; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Wenn ich einfach stehen bleibe, dann bin ich immer noch besser als du!' WHERE `id`=880; +UPDATE `ai_playerbot_texts` SET `text_loc3`='warum heilt mich mein Pet nicht wenn ich im Feuer stehe' WHERE `id`=881; +UPDATE `ai_playerbot_texts` SET `text_loc3`='brauch ich Rüstung, um ein echter wahrer Held zu sein, oder ist das optional?' WHERE `id`=882; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Muss ich erst 10.000 Koboldkerzen klauen, um zu leveln, oder was?' WHERE `id`=883; +UPDATE `ai_playerbot_texts` SET `text_loc3`='meine Waffe ist kaputt, kann ich Gegner noch mit meinem riesigen Schw... äh, meiner Faust klatschen?' WHERE `id`=884; +UPDATE `ai_playerbot_texts` SET `text_loc3`='können wir das Spiel bitte in World of DieCraft umbenennen, ein Spieler killt mich dauernd' WHERE `id`=885; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Warum fliegt mein Pferd nicht? kann es nicht einfach nach oben gehen?' WHERE `id`=886; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Gibts ne Option, die Grafik auszumachen, damit es aussieht wie mein alter Taschenrechner?' WHERE `id`=887; +UPDATE `ai_playerbot_texts` SET `text_loc3`='ich sollte was killen, bin aber eingepennt, ist das normal?' WHERE `id`=888; +UPDATE `ai_playerbot_texts` SET `text_loc3`='killt noch wer random NPCs zum Spaß, oder bin das nur ich?' WHERE `id`=889; +UPDATE `ai_playerbot_texts` SET `text_loc3`='ich bin %my_level und kenn schon alle Geheimnisse des Spiels' WHERE `id`=890; +UPDATE `ai_playerbot_texts` SET `text_loc3`='kann ich einfach so lange mit NPCs reden, bis sie mir ihren ganzen Loot einfach geben?' WHERE `id`=891; +UPDATE `ai_playerbot_texts` SET `text_loc3`='warum verliere ich, ich spiel doch schon 15 Minuten' WHERE `id`=893; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Ich brauch keine Strategie, ich spam einfach diese Fähigkeit und hoffe aufs Beste' WHERE `id`=894; +UPDATE `ai_playerbot_texts` SET `text_loc3`='wenn ich haufenweise Glücksbringer anlege, krieg ich dann mehr Loot?' WHERE `id`=895; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Ist das Geheimnis dieses Spiels einfach, den Bildschirm anzuschreien?' WHERE `id`=896; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Kann ich einfach jedes Item anziehen, das ich finde, und aufs Beste hoffen?' WHERE `id`=897; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Muss ich echt Quests machen oder kann ich einfach erkunden und Leute anbrüllen?' WHERE `id`=898; +UPDATE `ai_playerbot_texts` SET `text_loc3`='ich zocke auf Arbeit, die sagen ich soll arbeiten >.> aber es ist WoW!' WHERE `id`=899; +UPDATE `ai_playerbot_texts` SET `text_loc3`='wenn ich alles Essen im Spiel esse, werd ich dann unbesiegbar' WHERE `id`=900; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Also, ich werfe mein Pet einfach in jeden Bosskampf und drücke beim würfeln immer auf Gier, das sind die Hunter-Regeln.' WHERE `id`=901; +UPDATE `ai_playerbot_texts` SET `text_loc3`='kann man sterben, wenn man schon tot ist? Ich frage für nen Geist...' WHERE `id`=902; +UPDATE `ai_playerbot_texts` SET `text_loc3`='weiß jemand, wo das legendäre Schwert ist? hab schon 5 Minuten gesucht' WHERE `id`=903; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Man sagte mir, hier gibts 100.000 Gold, wo muss ich hin?' WHERE `id`=904; +UPDATE `ai_playerbot_texts` SET `text_loc3`='ich spiel das hier wie ich deine Mom letzte Nacht genommen hab - mit Geschrei und einem ruhmreichem Ende!' WHERE `id`=905; +UPDATE `ai_playerbot_texts` SET `text_loc3`='ab wann wirds Spaß, oder ist alles nur für immer Grind' WHERE `id`=906; +UPDATE `ai_playerbot_texts` SET `text_loc3`='ich frage ständig nach dem Weg, aber sie schicken mich immer irgendwo hin, ist das normal?' WHERE `id`=907; +UPDATE `ai_playerbot_texts` SET `text_loc3`='hab gehört, wenn du ALT+F4 drückst, kriegst du 100.000 Gold - Der Trick ist, vorher nen roten NPC anzugreifen' WHERE `id`=908; +UPDATE `ai_playerbot_texts` SET `text_loc3`='warum sieht mein Char immer so verwirrt aus, bin ich schuld?' WHERE `id`=909; +UPDATE `ai_playerbot_texts` SET `text_loc3`='hey, deine Mom meinte, du sollst jetzt ins Bett!' WHERE `id`=910; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Warcraft ist ein Grind - genau wie deine Mom neulich, hat sogar Abo!' WHERE `id`=911; +UPDATE `ai_playerbot_texts` SET `text_loc3`='stimmt es, dass Chuck Norris mal gelevelt hat, ohne nen Knopf zu drücken' WHERE `id`=912; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Chuck Norris braucht kein Mount, der Boden bewegt freiwillig sich unter ihm' WHERE `id`=913; +UPDATE `ai_playerbot_texts` SET `text_loc3`='wenn Chuck Norris nen Raid betritt, gibt der Boss einfach auf' WHERE `id`=914; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Chuck Norris nutzt keine Fähigkeiten, er guckt nur - und die Gegner sterben' WHERE `id`=915; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Chuck Norris braucht keine Heilung, seine Feinde heilen ihn aus Respekt' WHERE `id`=916; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Chuck Norris kann nen Raid solo... ohne Gear... und AFK' WHERE `id`=917; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Chuck Norris weicht nicht aus, das Spiel weicht ihm aus' WHERE `id`=918; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Chuck Norris nutzte mal ne Lowlevel-Waffe - das Spiel gab ihm den besten Loot' WHERE `id`=919; +UPDATE `ai_playerbot_texts` SET `text_loc3`='wenn Chuck Norris eine Ini betritt, landet der Loot automatisch in seinem Inventar' WHERE `id`=920; +UPDATE `ai_playerbot_texts` SET `text_loc3`='was ist Wilma' WHERE `id`=921; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Bist du aus Bayern?' WHERE `id`=922; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Wilma lecken' WHERE `id`=923; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Dann leck mir an den Eiern.' WHERE `id`=924; +UPDATE `ai_playerbot_texts` SET `text_loc3`='ICH FRESS NEN ARSCH' WHERE `id`=925; +UPDATE `ai_playerbot_texts` SET `text_loc3`='ich will mir %random_inventory_item_link in den Arsch schieben' WHERE `id`=926; +UPDATE `ai_playerbot_texts` SET `text_loc3`='ich will dir %random_inventory_item_link in den Arsch schieben' WHERE `id`=927; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Darnarschloch' WHERE `id`=928; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Du leidest an mehr Bugs als das Spiel selbst!' WHERE `id`=929; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Du hast Chefkochs salzige Schokobällchen im Mund!' WHERE `id`=930; +UPDATE `ai_playerbot_texts` SET `text_loc3`='cooler Ständer, Bro' WHERE `id`=931; +UPDATE `ai_playerbot_texts` SET `text_loc3`='hab alles probiert, am Ende hats ERP gerichtet' WHERE `id`=933; +UPDATE `ai_playerbot_texts` SET `text_loc3`='ich will in %zone_name bumsen' WHERE `id`=934; +UPDATE `ai_playerbot_texts` SET `text_loc3`='suche weiblichen Gnom mit Gorilla-Pet für ERP in %zone_name' WHERE `id`=935; +UPDATE `ai_playerbot_texts` SET `text_loc3`='ein Arschloch versteh ich, aber nen Perversen?' WHERE `id`=936; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Kein Gyat in %zone_name, nur Gesichtseintopf so weit das Auge reicht.' WHERE `id`=937; +UPDATE `ai_playerbot_texts` SET `text_loc3`='ich kill alle Tiere in %zone_name. Scheiß auf Tiere und die PETA!!!' WHERE `id`=938; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Nur gut, dass ich 3 Beine hab' WHERE `id`=939; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Chill, ich bin einfach grad komplett in meinem Film.' WHERE `id`=940; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Finger im Po Mexiko' WHERE `id`=941; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Das hast du irgendwie vergeigt, beeindruckend' WHERE `id`=942; +UPDATE `ai_playerbot_texts` SET `text_loc3`='das könnte ich blind machen, muss ich aber nicht' WHERE `id`=943; +UPDATE `ai_playerbot_texts` SET `text_loc3`='sicher, dass du weißt, wie man das Spiel spielt?' WHERE `id`=944; +UPDATE `ai_playerbot_texts` SET `text_loc3`='als würdest du absichtlich verlieren' WHERE `id`=945; +UPDATE `ai_playerbot_texts` SET `text_loc3`='hab schon bessere Plays von Level-1-Chars gesehen' WHERE `id`=946; +UPDATE `ai_playerbot_texts` SET `text_loc3`='du bist hier wie ein Speedbump' WHERE `id`=947; +UPDATE `ai_playerbot_texts` SET `text_loc3`='vielleicht suchst du dir lieber ein anderes Hobby' WHERE `id`=948; +UPDATE `ai_playerbot_texts` SET `text_loc3`='dein Gameplay ist wie Farbe beim Trocknen zusehen' WHERE `id`=949; +UPDATE `ai_playerbot_texts` SET `text_loc3`='mein Twink könnte dich da durch carrien' WHERE `id`=950; +UPDATE `ai_playerbot_texts` SET `text_loc3`='trollst du uns, oder bist du ernsthaft so?' WHERE `id`=951; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Ich glaub, das Gegnerteam läuft besser, wenn du bei uns bist' WHERE `id`=952; +UPDATE `ai_playerbot_texts` SET `text_loc3`='spiel vielleicht mal das Spiel statt nur die Landschaft zu bestaunen' WHERE `id`=953; +UPDATE `ai_playerbot_texts` SET `text_loc3`='ich glaube, du hast da jede einzelne Fähigkeit verfehlt' WHERE `id`=954; +UPDATE `ai_playerbot_texts` SET `text_loc3`='bist du lost oder stellst du dich nur dumm?' WHERE `id`=955; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Level-1-Chars nehmen weniger Schaden als das' WHERE `id`=956; +UPDATE `ai_playerbot_texts` SET `text_loc3`='das war für uns beide peinlich' WHERE `id`=957; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Hab schon besseres Teamplay in nem Solo-Game gesehen' WHERE `id`=958; +UPDATE `ai_playerbot_texts` SET `text_loc3`='ich stell mich mal hinten hin und schau dir beim Failen zu' WHERE `id`=959; +UPDATE `ai_playerbot_texts` SET `text_loc3`='dachtest du wirklich, das wäre ne gute Idee?' WHERE `id`=960; +UPDATE `ai_playerbot_texts` SET `text_loc3`='kaum zu glauben, dass du diese simple Aufgabe verkackt hast' WHERE `id`=961; +UPDATE `ai_playerbot_texts` SET `text_loc3`='bist du hier, um zu helfen, oder nur um Zeit zu verschwenden?' WHERE `id`=962; +UPDATE `ai_playerbot_texts` SET `text_loc3`='gut, dass ich da bin, um das Team zu schützen' WHERE `id`=963; +UPDATE `ai_playerbot_texts` SET `text_loc3`='ich schwöre, du machst es schwerer als nötig' WHERE `id`=964; +UPDATE `ai_playerbot_texts` SET `text_loc3`='wie schaffst du es, die simpelsten Sachen zu failen?' WHERE `id`=965; +UPDATE `ai_playerbot_texts` SET `text_loc3`='vielleicht mal lieber nur zuschauen, statt das zu tun was du spielen nennst' WHERE `id`=966; +UPDATE `ai_playerbot_texts` SET `text_loc3`='du könntest dich wenigstens bemühen, so zu tun, als wärst du gut' WHERE `id`=967; +UPDATE `ai_playerbot_texts` SET `text_loc3`='mach so weiter und wir sitzen hier den ganzen Tag' WHERE `id`=968; +UPDATE `ai_playerbot_texts` SET `text_loc3`='ehrlich, das war die schlechteste Entscheidung ever' WHERE `id`=969; +UPDATE `ai_playerbot_texts` SET `text_loc3`='ich glaub, dieses Spiel ist nix für dich' WHERE `id`=970; +UPDATE `ai_playerbot_texts` SET `text_loc3`='was sollte dieser Move?' WHERE `id`=971; +UPDATE `ai_playerbot_texts` SET `text_loc3`='du bist ne Last fürs Team' WHERE `id`=972; +UPDATE `ai_playerbot_texts` SET `text_loc3`='du denkst echt, du bist ein Pro, was?' WHERE `id`=973; +UPDATE `ai_playerbot_texts` SET `text_loc3`='vielleicht einfach quitten und uns allen den Stress sparen' WHERE `id`=974; +UPDATE `ai_playerbot_texts` SET `text_loc3`='%prefix %random_taken_quest_or_item_link' WHERE `id`=975; +UPDATE `ai_playerbot_texts` SET `text_loc3`='%prefix %random_inventory_item_link' WHERE `id`=976; +UPDATE `ai_playerbot_texts` SET `text_loc3`='%thunderfury_link' WHERE `id`=977; +UPDATE `ai_playerbot_texts` SET `text_loc3`='%thunderfury_link%thunderfury_link' WHERE `id`=978; +UPDATE `ai_playerbot_texts` SET `text_loc3`='%thunderfury_link%thunderfury_link%thunderfury_link' WHERE `id`=979; +UPDATE `ai_playerbot_texts` SET `text_loc3`='ich glaube, ich hab gerade %thunderfury_link gehört' WHERE `id`=980; +UPDATE `ai_playerbot_texts` SET `text_loc3`='ich glaub, ich habe %thunderfury_link gehört' WHERE `id`=981; +UPDATE `ai_playerbot_texts` SET `text_loc3`='ich hab definitiv %thunderfury_link gehört' WHERE `id`=982; +UPDATE `ai_playerbot_texts` SET `text_loc3`='kein Plan, aber ich bin ziemlich sicher, das ich %thunderfury_link gehört habe' WHERE `id`=983; +UPDATE `ai_playerbot_texts` SET `text_loc3`='hast du gerade %thunderfury_link gesagt' WHERE `id`=984; +UPDATE `ai_playerbot_texts` SET `text_loc3`='hat jemand %thunderfury_link gesagt' WHERE `id`=985; +UPDATE `ai_playerbot_texts` SET `text_loc3`='hat jemand %thunderfury_link gesagt?' WHERE `id`=986; +UPDATE `ai_playerbot_texts` SET `text_loc3`='jemand hat %thunderfury_link gesagt' WHERE `id`=987; +UPDATE `ai_playerbot_texts` SET `text_loc3`='%thunderfury_link kommt aus dem Schrank' WHERE `id`=988; +UPDATE `ai_playerbot_texts` SET `text_loc3`='ich schwöre, es war %thunderfury_link, könnte aber auch %thunderfury_link gewesen sein' WHERE `id`=989; +UPDATE `ai_playerbot_texts` SET `text_loc3`='warum %thunderfury_link nutzen, wenn %thunderfury_link offensichtlich viel stärker ist' WHERE `id`=990; +UPDATE `ai_playerbot_texts` SET `text_loc3`='hab ich gerade %thunderfury_link gehört?' WHERE `id`=991; +UPDATE `ai_playerbot_texts` SET `text_loc3`='niemals... hör ich da echt %thunderfury_link?' WHERE `id`=992; +UPDATE `ai_playerbot_texts` SET `text_loc3`='%thunderfury_link? klingt nach was, das nur Legenden führen!' WHERE `id`=993; +UPDATE `ai_playerbot_texts` SET `text_loc3`='ich spüre die Macht von %thunderfury_link in der Luft!' WHERE `id`=994; +UPDATE `ai_playerbot_texts` SET `text_loc3`='%thunderfury_link ist der *echte* MVP' WHERE `id`=995; +UPDATE `ai_playerbot_texts` SET `text_loc3`='kann mir jemand ne %thunderfury_link besorgen? frage für einen Freund... vielleicht zwei!' WHERE `id`=996; +UPDATE `ai_playerbot_texts` SET `text_loc3`='hat %thunderfury_link da gerade was *gesmitet*? ich schwöre, der Boden hat gewackelt' WHERE `id`=997; +UPDATE `ai_playerbot_texts` SET `text_loc3`='%thunderfury_link auf dem Schlachtfeld... Das ist purer Flex' WHERE `id`=998; +UPDATE `ai_playerbot_texts` SET `text_loc3`='ich *glaube*, ich hab %thunderfury_link gehört... oder war das nur ein Mythos?' WHERE `id`=999; +UPDATE `ai_playerbot_texts` SET `text_loc3`='hab ich gerade jemanden mit %thunderfury_link gesehen?!' WHERE `id`=1000; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Bin zu 99% sicher, das war %thunderfury_link. Zu 1% wars vielleicht nur ein random NPC.' WHERE `id`=1002; +UPDATE `ai_playerbot_texts` SET `text_loc3`='%thunderfury_link in Aktion! Wer braucht ne Armee, mit so einer Power?' WHERE `id`=1003; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Hab gehört, %thunderfury_link lockt alle Jungs an.' WHERE `id`=1004; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Warum überhaupt %thunderfury_link nutzen, wenn %thunderfury_link klar die bessere Option ist?' WHERE `id`=1005; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Bin das nur ich, oder hat %thunderfury_link nen passiven „Trash-Talk“-Effekt?' WHERE `id`=1006; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Dachte, ich hätte %thunderfury_link gehört, war aber nur der Klang reiner Awesomeness.' WHERE `id`=1007; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Oh, %thunderfury_link... Wo *warst* du mein ganzes Leben?' WHERE `id`=1008; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Hat jemand %thunderfury_link gesagt? Ich glaub, ich hol mir mal meine.' WHERE `id`=1009; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Das war definitiv der Sound von %thunderfury_link! Ich spür die Epicness.' WHERE `id`=1010; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Geht das nur mir so, oder lässt %thunderfury_link alle anderen *schwach aussehen*?' WHERE `id`=1011; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Wie man so sagt... je lauter %thunderfury_link, desto größer das Recht zu prahlen!' WHERE `id`=1012; +UPDATE `ai_playerbot_texts` SET `text_loc3`='VK: %item_formatted_link für %cost_gold.' WHERE `id`=1013; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Will wer %item_formatted_link? Nur %cost_gold.' WHERE `id`=1015; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Lächerlicher Preis: %cost_gold für %item_formatted_link!' WHERE `id`=1019; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Will %item_formatted_link für %cost_gold verkaufen.' WHERE `id`=1020; +UPDATE `ai_playerbot_texts` SET `text_loc3`='%item_formatted_link ist Wertvoll, aber ich würd es für %cost_gold verkaufen.' WHERE `id`=1024; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Billiger als %cost_gold kriegst du %item_formatted_link nicht!' WHERE `id`=1025; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Brauche mehr als %item_formatted_link!' WHERE `id`=1026; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Habe %item_formatted_link und brauche mehr.' WHERE `id`=1027; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Habe %item_formatted_link. Wer kauft für %cost_gold?' WHERE `id`=1028; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Wie wärs mit %item_formatted_link? Für %cost_gold.' WHERE `id`=1030; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Wer meinte, ich bin ein Bastard? %item_formatted_link für %cost_gold ist ein guter Preis!' WHERE `id`=1031; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Verkaufe %item_formatted_link? Nur %cost_gold.' WHERE `id`=1032; +UPDATE `ai_playerbot_texts` SET `text_loc3`='LFG zum Farmen. %item_formatted_link gibts von mir noch für %cost_gold.' WHERE `id`=1033; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Heute fast alles verkauft. %item_formatted_link hab ich noch für %cost_gold.' WHERE `id`=1034; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Wozu Handelschat? Klar, um %item_formatted_link für %cost_gold zu verkaufen.' WHERE `id`=1035; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Kann jemand den Preis %cost_gold für %item_formatted_link unterbieten?' WHERE `id`=1036; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Wollt ihr den Handelschat stoppen? Kauft einfach %item_formatted_link! Für %cost_gold!' WHERE `id`=1037; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Alle spammen im Handelschat. Ich auch - %cost_gold für %item_formatted_link!' WHERE `id`=1038; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Taugt %item_formatted_link was? Verkaufe es für %cost_gold.' WHERE `id`=1039; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Hab %item_formatted_link, verkaufe an dich für %cost_gold.' WHERE `id`=1040; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Gestern nix geschafft, aber %item_formatted_link bekommen. Verkaufe für %cost_gold.' WHERE `id`=1041; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Gestern gefarmt und %item_formatted_link gezogen. Will jemand für %cost_gold kaufen?' WHERE `id`=1042; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Gestern %item_formatted_link gekauft. Brauchts wer für %cost_gold?' WHERE `id`=1043; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Wer hatte %item_formatted_link gesucht? Preis bleibt - %cost_gold.' WHERE `id`=1044; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Hab immer noch %item_formatted_link. Kauft wer für %cost_gold?' WHERE `id`=1045; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Früher war ich besser bei Kasse. Jetzt verkauf ich %item_formatted_link für %cost_gold.' WHERE `id`=1046; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Ich Wünschte, ich hätte mehr als %item_formatted_link. Kaufen könnt ihrs trotzdem für %cost_gold.' WHERE `id`=1047; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Wozu ist euer Gold gut? Um mein %item_formatted_link für %cost_gold zu kaufen.' WHERE `id`=1048; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Gönnt mir etwas Gold. Kauft %item_formatted_link für %cost_gold.' WHERE `id`=1049; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Sind %cost_gold ein guter Preis für %item_formatted_link?' WHERE `id`=1050; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Hab gestern erst %item_formatted_link gekauft, brauch es aber nicht mehr. Will wer für %cost_gold?' WHERE `id`=1051; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Stell %item_formatted_link gleich ins AH, aber ihr könnts jetzt günstiger haben: nur %cost_gold.' WHERE `id`=1052; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Warum zum #!@ hab ich %item_formatted_link gekauft? Brauchts wer für %cost_gold?' WHERE `id`=1053; +UPDATE `ai_playerbot_texts` SET `text_loc3`='VK: %item_formatted_link für %cost_gold.' WHERE `id`=1054; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Will wer %item_formatted_link? Nur %cost_gold.' WHERE `id`=1056; +UPDATE `ai_playerbot_texts` SET `text_loc3`='VK: %item_formatted_link für %cost_gold. flüster mir bei Interesse.' WHERE `id`=1060; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Muss %item_formatted_link loswerden, %cost_gold oder bestes Angebot.' WHERE `id`=1061; +UPDATE `ai_playerbot_texts` SET `text_loc3`='%item_formatted_link für %cost_gold verfügbar. Schlagt zu!' WHERE `id`=1062; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Habe %item_formatted_link, will %cost_gold.' WHERE `id`=1063; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Verkaufe %item_formatted_link, nur %cost_gold.' WHERE `id`=1064; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Will jemand %item_formatted_link für %cost_gold? flüster mir!' WHERE `id`=1065; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Verkaufe %item_formatted_link für %cost_gold, greift zu solange es geht!' WHERE `id`=1066; +UPDATE `ai_playerbot_texts` SET `text_loc3`='%item_formatted_link für %cost_gold, schnell sein bevor es weg ist!' WHERE `id`=1067; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Verkaufe %item_formatted_link für %cost_gold, wer zuerst kommt wird auch zuerst bedient!' WHERE `id`=1069; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Nur %cost_gold für %item_formatted_link, nur für kurze Zeit!' WHERE `id`=1070; +UPDATE `ai_playerbot_texts` SET `text_loc3`='%item_formatted_link für %cost_gold verfügbar, meldet euch wenn ihrs braucht!' WHERE `id`=1071; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Interesse an %item_formatted_link für %cost_gold?' WHERE `id`=1072; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Verkaufe %item_formatted_link für %cost_gold, muss meine Taschen leeren.' WHERE `id`=1073; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Hol dir %item_formatted_link für %cost_gold, Top-Deal!' WHERE `id`=1074; +UPDATE `ai_playerbot_texts` SET `text_loc3`='%item_formatted_link für %cost_gold, greift zu solange der Vorrat reicht!' WHERE `id`=1075; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Verkaufe %item_formatted_link für %cost_gold, nicht verpassen!' WHERE `id`=1076; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Nur %cost_gold für %item_formatted_link, flüster mir für Details!' WHERE `id`=1077; +UPDATE `ai_playerbot_texts` SET `text_loc3`='%item_formatted_link gibts für %cost_gold, lasst uns handeln!' WHERE `id`=1078; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Verkaufe %item_formatted_link für %cost_gold, flüster mir für Infos.' WHERE `id`=1079; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Will %item_formatted_link verkaufen, für %cost_gold gehört es dir!' WHERE `id`=1080; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Verkaufe %item_formatted_link, nur %cost_gold.' WHERE `id`=1081; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Hab %item_formatted_link für %cost_gold, machen wir nen Deal!' WHERE `id`=1082; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Verkaufe %item_formatted_link, für %cost_gold nimmst du es mit!' WHERE `id`=1083; +UPDATE `ai_playerbot_texts` SET `text_loc3`='VK: %item_formatted_link für %cost_gold, Interesse?' WHERE `id`=1084; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Muss %item_formatted_link schnell loswerden, %cost_gold.' WHERE `id`=1085; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Verkaufe %item_formatted_link für %cost_gold, bester Preis weit und breit!' WHERE `id`=1086; +UPDATE `ai_playerbot_texts` SET `text_loc3`='%item_formatted_link für %cost_gold, machen wirs fix!' WHERE `id`=1088; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Verkaufe %item_formatted_link für %cost_gold, schnappt zu bevor alles weg ist!' WHERE `id`=1089; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Willst %item_formatted_link? Für %cost_gold kriegst du eins!' WHERE `id`=1090; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Ich habe auch %quest_links' WHERE `id`=1093; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Ich habe auch %quest_links, bin gerade in %zone_name' WHERE `id`=1094; +UPDATE `ai_playerbot_texts` SET `text_loc3`='%other_name, ich habe auch %quest_links' WHERE `id`=1095; +UPDATE `ai_playerbot_texts` SET `text_loc3`='%other_name, ich habe auch %quest_links, bin gerade in %zone_name' WHERE `id`=1096; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Bin bereit für %quest_links, bin gerade in %zone_name' WHERE `id`=1097; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Bin bereit für %quest_links, bin %my_role' WHERE `id`=1098; +UPDATE `ai_playerbot_texts` SET `text_loc3`='%other_name, bin bereit für %quest_links, bin gerade in %zone_name' WHERE `id`=1099; +UPDATE `ai_playerbot_texts` SET `text_loc3`='%other_name, bin bereit für %quest_links, bin %my_role' WHERE `id`=1100; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Braucht wer %quest_links? Bin in %zone_name.' WHERE `id`=1101; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Suche mehr %quest_links in %zone_name.' WHERE `id`=1102; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Will jemand %quest_links mit mir in %zone_name machen?' WHERE `id`=1104; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Habe %quest_links, suche Gruppe in %zone_name.' WHERE `id`=1105; +UPDATE `ai_playerbot_texts` SET `text_loc3`='%my_role sucht Gruppe, um %quest_links in %zone_name zu erledigen.' WHERE `id`=1108; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Ich brauche %quest_links, ist jemand in %zone_name frei?' WHERE `id`=1109; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Mach %quest_links in %zone_name, brauche mehr Hilfe.' WHERE `id`=1111; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Gibt’s %my_role mit Interesse an %quest_links in %zone_name?' WHERE `id`=1112; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Hilfe benötigt für %quest_links in %zone_name, mir ist langweilig.' WHERE `id`=1113; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Habe %quest_links, %my_role in %zone_name, wer ist dabei?' WHERE `id`=1114; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Macht grad jemand %quest_links? Bin in %zone_name.' WHERE `id`=1116; +UPDATE `ai_playerbot_texts` SET `text_loc3`='%quest_links offen in %zone_name, wer möchte?' WHERE `id`=1117; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Bereit für %quest_links in %zone_name, suche Gruppe.' WHERE `id`=1118; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Brauche %quest_links und Gesellschaft, jemand in %zone_name?' WHERE `id`=1119; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Wer kommt mit mir nach %zone_name für %quest_links?' WHERE `id`=1120; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Irgend ein %my_role frei für %quest_links in %zone_name?' WHERE `id`=1121; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Habe %quest_links und bin %my_role, brauche mehr Leute in %zone_name.' WHERE `id`=1122; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Bin %my_role und habe %quest_links, suche Gruppe in %zone_name.' WHERE `id`=1124; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Brauche Hilfe bei %quest_links in %zone_name, ist ein %my_role frei?' WHERE `id`=1125; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Hat ein %my_role Lust, %quest_links mit mir in %zone_name zu machen?' WHERE `id`=1126; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Lasst uns %quest_links zusammen in %zone_name abschließen.' WHERE `id`=1127; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Bin in %zone_name und habe %quest_links, wer will mit?' WHERE `id`=1128; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Suche mehr %my_role, um %quest_links in %zone_name abzuschließen.' WHERE `id`=1129; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Habe %quest_links und brauche %my_role in %zone_name.' WHERE `id`=1130; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Wer hat Bock auf %quest_links? Ich bin %my_role in %zone_name.' WHERE `id`=1131; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Suche Gruppe für %quest_links in %zone_name, %my_role gebraucht.' WHERE `id`=1132; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Braucht wer Hilfe bei %quest_links in %zone_name? Ich bin %my_role.' WHERE `id`=1133; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Habe %quest_links offen, brauche %my_role in %zone_name.' WHERE `id`=1134; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Bin in %zone_name und suche Hilfe für %quest_links, wer ist dabei?' WHERE `id`=1135; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Suche Gruppe, um %quest_links in %zone_name fertig zu machen.' WHERE `id`=1136; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Sucht jemand %quest_links in %zone_name? Ich bin %my_role.' WHERE `id`=1137; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Machen wir %quest_links zusammen! %zone_name wartet.' WHERE `id`=1138; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Brauche Gruppe für %quest_links, %zone_name - wer hat Interesse?' WHERE `id`=1139; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Wer will für %quest_links dazukommen? Bin in %zone_name.' WHERE `id`=1140; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Bin in %zone_name, suche Leute zum Abschließen von %quest_links.' WHERE `id`=1141; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Brauche Hilfe bei %quest_links in %zone_name, ein %my_role da?' WHERE `id`=1142; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Suche Gruppe, um %quest_links zu beenden, %zone_name da steppt der Bär.' WHERE `id`=1143; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Will jemand bei %quest_links in %zone_name helfen? Ich bin %my_role.' WHERE `id`=1144; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Suche %my_role, um %quest_links in %zone_name mitzumachen.' WHERE `id`=1145; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Hab %quest_links, %my_role für %zone_name gesucht.' WHERE `id`=1146; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Will %quest_links in %zone_name fertig bekommen, brauche mehr Leute.' WHERE `id`=1147; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Brauche Hilfe bei %quest_links, wer ist in %zone_name unterwegs?' WHERE `id`=1148; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Brauche mehr Leute für %quest_links, %zone_name.' WHERE `id`=1149; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Suche Gruppe in %zone_name, um %quest_links abzuschließen.' WHERE `id`=1150; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Wer will %quest_links in %zone_name machen? Bin startklar.' WHERE `id`=1151; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Will wer für %quest_links dazustoßen? Ich bin %my_role in %zone_name.' WHERE `id`=1152; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Suche %my_role für %quest_links in %zone_name.' WHERE `id`=1153; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Bin in %zone_name, braucht wer Hilfe bei %quest_links?' WHERE `id`=1154; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Brauche mehr für %quest_links in %zone_name, bin allein nicht stark genug?' WHERE `id`=1155; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Brauche Hilfe bei %quest_links in %zone_name, wer hat Bock?' WHERE `id`=1156; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Suche mehr Leute, um %quest_links zu beenden, %zone_name.' WHERE `id`=1157; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Hey, bin bei %quest_links dabei' WHERE `id`=1158; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Hey, ich habe auch %quest_links' WHERE `id`=1160; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Hey %other_name, bin bei %quest_links dabei' WHERE `id`=1161; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Hey %other_name, ich könnte %quest_links mit dir machen' WHERE `id`=1162; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Bock, für %quest_links eine Gruppe zu bilden?' WHERE `id`=1164; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Bin bereit für %quest_links, bin gerade in %zone_name' WHERE `id`=1165; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Bin bereit für %quest_links, bin %my_role' WHERE `id`=1166; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Hey, ich hab Bock auf %quest_links' WHERE `id`=1167; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Ich kann bei %quest_links helfen, wenn ihr wollt' WHERE `id`=1168; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Lasst uns %quest_links zusammen machen!' WHERE `id`=1169; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Ich hab auch %quest_links offen' WHERE `id`=1170; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Bin für %quest_links verfügbar, wenn ihr wollt' WHERE `id`=1171; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Bin bei %quest_links dabei, sagt Bescheid' WHERE `id`=1172; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Sucht wer %quest_links? Bin in %zone_name' WHERE `id`=1173; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Hey, ich brauche auch %quest_links, lets go' WHERE `id`=1174; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Hab %quest_links, will wer mit?' WHERE `id`=1175; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Könnte %quest_links brauchen, machen wirs' WHERE `id`=1176; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Hey, willst du für %quest_links dazukommen?' WHERE `id`=1177; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Ich kann bei %quest_links helfen, wenn ihr wollt' WHERE `id`=1178; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Hey %other_name, Bock auf %quest_links?' WHERE `id`=1179; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Willst du für %quest_links gruppen, %other_name?' WHERE `id`=1180; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Lass %quest_links zusammen machen, %other_name' WHERE `id`=1181; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Ich bin %my_role und ready für %quest_links' WHERE `id`=1182; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Kann für %quest_links joinen, %my_role hier' WHERE `id`=1183; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Bin bereit für %quest_links, %my_role!' WHERE `id`=1184; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Suche %my_role für %quest_links' WHERE `id`=1185; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Braucht wer Hilfe bei %quest_links?' WHERE `id`=1186; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Wer ist noch bei %quest_links dabei?' WHERE `id`=1187; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Jemand bereit für %quest_links in %zone_name?' WHERE `id`=1188; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Hab %quest_links, %my_role unterwegs' WHERE `id`=1189; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Ich brauch %quest_links auch, wer ist dabei?' WHERE `id`=1190; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Grinde %quest_links, wer hilft?' WHERE `id`=1191; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Bin bereit für %quest_links, noch wer?' WHERE `id`=1192; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Kann jemand für %quest_links dazukommen?' WHERE `id`=1193; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Suche Hilfe bei %quest_links, %my_role hier' WHERE `id`=1194; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Ich kann bei %quest_links aushelfen, braucht mich wer?' WHERE `id`=1195; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Macht noch wer %quest_links? Los gehts' WHERE `id`=1196; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Braucht wer Hilfe bei %quest_links? %my_role hier' WHERE `id`=1197; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Wer hat Bock auf %quest_links in %zone_name?' WHERE `id`=1198; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Kann für %quest_links joinen, wenn ihr wollt' WHERE `id`=1199; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Suche einen %my_role für %quest_links' WHERE `id`=1200; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Ist ein %my_role für %quest_links am Start?' WHERE `id`=1201; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Ich habe %quest_links, will wer mit?' WHERE `id`=1202; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Hey %other_name, Bock auf %quest_links?' WHERE `id`=1203; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Lass uns für %quest_links gruppen, %other_name' WHERE `id`=1204; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Ich brauche %quest_links, wer macht mit?' WHERE `id`=1205; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Ich brauche auch %quest_links, ist noch jemand da?' WHERE `id`=1206; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Suche %quest_links in %zone_name, wer ist dabei?' WHERE `id`=1207; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Ist jemand frei für %quest_links?' WHERE `id`=1208; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Hey, ich könnte bei %quest_links dazustoßen!' WHERE `id`=1209; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Ich habe auch %quest_links, lass uns gruppen' WHERE `id`=1210; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Ich habe %quest_links zu erledigen, willst du mit?' WHERE `id`=1211; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Ist ein %my_role für %quest_links in %zone_name frei?' WHERE `id`=1212; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Lass uns %quest_links zusammen abschließen, %other_name' WHERE `id`=1213; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Ich bin bei %quest_links dabei, will noch wer mit?' WHERE `id`=1214; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Wer macht noch %quest_links? Ich bin dabei' WHERE `id`=1215; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Ich habe %quest_links in %zone_name, braucht jemand Hilfe?' WHERE `id`=1216; +UPDATE `ai_playerbot_texts` SET `text_loc3`='%other_name, könnte dir %formatted_item_links verkaufen' WHERE `id`=1217; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Könnte eventuell %formatted_item_links verkaufen' WHERE `id`=1218; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Denke, ich könnte %formatted_item_links verkaufen' WHERE `id`=1219; +UPDATE `ai_playerbot_texts` SET `text_loc3`='%other_name, könnte eventuell %formatted_item_links verkaufen' WHERE `id`=1220; +UPDATE `ai_playerbot_texts` SET `text_loc3`='%other_name, ich denke, ich könnte %formatted_item_links verkaufen' WHERE `id`=1221; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Ich könnte dir %formatted_item_links verkaufen' WHERE `id`=1222; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Hey, habe %formatted_item_links zu verkaufen' WHERE `id`=1223; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Hey, könnte eventuell %formatted_item_links verkaufen' WHERE `id`=1224; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Ich könnte dir %formatted_item_links verkaufen' WHERE `id`=1225; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Hey, habe %formatted_item_links zu verkaufen' WHERE `id`=1226; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Hey, ich könnte eventuell %formatted_item_links verkaufen' WHERE `id`=1227; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Ich habe %formatted_item_links, Interesse?' WHERE `id`=1228; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Will %formatted_item_links verkaufen, was bietest du?' WHERE `id`=1229; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Ich kann dir %formatted_item_links zu einem fairem Preis verkaufen' WHERE `id`=1230; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Ich habe %formatted_item_links auf Lager, was zahlst du?' WHERE `id`=1231; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Verkaufe %formatted_item_links für %cost_gold, sag Bescheid bei Interesse' WHERE `id`=1232; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Habe %formatted_item_links zu verkaufen, was zahlst du?' WHERE `id`=1233; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Ich habe %formatted_item_links, wie klingt %cost_gold für dich?' WHERE `id`=1234; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Verkaufe %formatted_item_links für %cost_gold, flüster mir bei Interesse' WHERE `id`=1235; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Ich habe %formatted_item_links, meld dich bei Interesse' WHERE `id`=1236; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Gebe %formatted_item_links ab, wenn das Angebot passt' WHERE `id`=1237; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Will %formatted_item_links loswerden, flüster mir' WHERE `id`=1238; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Habe %formatted_item_links für %cost_gold, kaufst du?' WHERE `id`=1239; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Verkaufe %formatted_item_links, lass uns handeln' WHERE `id`=1240; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Hey, habe %formatted_item_links für %cost_gold' WHERE `id`=1241; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Kann dich mit %formatted_item_links versorgen, nenn deinen Preis' WHERE `id`=1242; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Ich habe %formatted_item_links verfügbar, sag Bescheid bei Interesse' WHERE `id`=1243; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Verkaufe %formatted_item_links, machen wir Business' WHERE `id`=1244; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Ich habe %formatted_item_links, macht mir ein Angebot' WHERE `id`=1245; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Ich habe %formatted_item_links, schreib mir, wenn du kaufen willst' WHERE `id`=1246; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Kann dir %formatted_item_links für %cost_gold anbieten' WHERE `id`=1247; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Ich habe %formatted_item_links zu verkaufen, schreib mir für den Preis' WHERE `id`=1248; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Verkaufe %formatted_item_links, greif zu solange es heiß ist' WHERE `id`=1249; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Verkaufe %formatted_item_links, nen besseren Deal findet ihr nicht' WHERE `id`=1250; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Ich habe %formatted_item_links zu verkaufen, was zahlst du?' WHERE `id`=1251; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Verkaufe %formatted_item_links, Preis auf Anfrage per flüstern' WHERE `id`=1252; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Interesse an %formatted_item_links? Ich verkaufe welche' WHERE `id`=1253; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Ich habe %formatted_item_links, PN für Preis' WHERE `id`=1254; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Verkaufe %formatted_item_links für %cost_gold, meldet euch' WHERE `id`=1255; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Verkaufe %formatted_item_links, macht mir ein Angebot' WHERE `id`=1256; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Habe %formatted_item_links, schreib mir für Details' WHERE `id`=1257; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Hey, habe %formatted_item_links, meldet euch bei Interesse' WHERE `id`=1258; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Verkaufe %formatted_item_links, machen wir nen Deal?' WHERE `id`=1259; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Verkaufe %formatted_item_links, sag Bescheid wenn du willst' WHERE `id`=1260; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Ich habe %formatted_item_links, ich mach dir nen guten Preis' WHERE `id`=1261; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Ich habe %formatted_item_links, mit gutem Angebot gehörts dir' WHERE `id`=1262; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Verkaufe %formatted_item_links, bin offen für Angebote' WHERE `id`=1263; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Ich habe %formatted_item_links, melde dich bei Interesse' WHERE `id`=1264; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Ich kann dir %formatted_item_links zu einem guten Preis verkaufen' WHERE `id`=1265; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Ich habe %formatted_item_links zu verkaufen, nehme alle Angebote an' WHERE `id`=1266; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Habe %formatted_item_links im Verkauf, flüster mir für Details' WHERE `id`=1267; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Habe %formatted_item_links im Verkauf, macht mir ein Angebot' WHERE `id`=1268; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Ich habe %formatted_item_links, was zahlt ihr?' WHERE `id`=1269; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Verkaufe %formatted_item_links, schreib mir für mehr Infos' WHERE `id`=1270; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Ich habe %formatted_item_links, sagt Bescheid bei Interesse' WHERE `id`=1271; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Verkaufe %formatted_item_links, lass uns über Zahlen reden' WHERE `id`=1272; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Ich kann dir %formatted_item_links verkaufen, was bietest du?' WHERE `id`=1273; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Hey, habe %formatted_item_links zu verkaufen, meldet euch bei Interesse' WHERE `id`=1274; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Ich habe %formatted_item_links, PN für den Preis' WHERE `id`=1275; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Verkaufe %formatted_item_links, bin offen für Angebote' WHERE `id`=1276; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Ich habe %formatted_item_links, schreibt mir einfach' WHERE `id`=1277; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Kann %formatted_item_links anbieten, sagt Bescheid bei Interesse' WHERE `id`=1278; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Verkaufe %formatted_item_links, bitte vernünftige Angebote' WHERE `id`=1279; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Ich habe %formatted_item_links, meldet euch für mehr Infos' WHERE `id`=1280; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Ich habe %formatted_item_links, macht mir ein Angebot' WHERE `id`=1281; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Verkaufe %formatted_item_links, schreibt mir bei Interesse' WHERE `id`=1282; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Habe %formatted_item_links zu verkaufen, lass uns handeln' WHERE `id`=1283; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Ich habe %formatted_item_links, sag Bescheid wenn du willst' WHERE `id`=1284; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Ich kann diese Quest nicht annehmen' WHERE `id`=1287; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Ich kann nicht mit dem Questgeber sprechen' WHERE `id`=1288; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Ich habe %quest bereits abgeschlossen' WHERE `id`=1289; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Ich habe %quest bereits' WHERE `id`=1290; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Ich kann %quest nicht annehmen' WHERE `id`=1291; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Ich kann %quest nicht annehmen, mein Questlog ist voll' WHERE `id`=1292; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Ich kann %quest nicht annehmen, meine Tasche ist voll' WHERE `id`=1293; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Ich habe %quest angenommen' WHERE `id`=1294; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Ich habe die Quest %quest nicht abgeschlossen' WHERE `id`=1295; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Quest %quest verfügbar' WHERE `id`=1296; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Ich habe die Quest %quest vergeigt' WHERE `id`=1297; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Ich kann die Quest %quest nicht abgeben' WHERE `id`=1298; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Ich habe die Quest %quest abgeschlossen' WHERE `id`=1299; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Ich habe die Quest %quest abgeschlossen und %item erhalten' WHERE `id`=1300; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Welche Belohnung soll ich für die Quest %quest nehmen? %rewards' WHERE `id`=1301; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Okay, ich nehme %item als Belohnung' WHERE `id`=1302; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Hi' WHERE `id`=1305; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Hallo zusammen!' WHERE `id`=1307; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Hallo, geh vor!' WHERE `id`=1309; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Hi, geh vor!' WHERE `id`=1310; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Hey %player, willst du in meine Gruppe?' WHERE `id`=1311; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Hey %player, kommst du in meine Gruppe?' WHERE `id`=1312; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Logout abgebrochen!' WHERE `id`=1313; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Ich logge mich aus!' WHERE `id`=1314; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Was war das, %s?' WHERE `id`=1318; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Bin nicht sicher, ob ich dich verstehe, %s?' WHERE `id`=1319; +UPDATE `ai_playerbot_texts` SET `text_loc3`='äh... keine Ahnung, wovon du redest' WHERE `id`=1320; +UPDATE `ai_playerbot_texts` SET `text_loc3`='whaaaa?' WHERE `id`=1322; +UPDATE `ai_playerbot_texts` SET `text_loc3`='hä?' WHERE `id`=1323; +UPDATE `ai_playerbot_texts` SET `text_loc3`='was?' WHERE `id`=1324; +UPDATE `ai_playerbot_texts` SET `text_loc3`='redest du grade?' WHERE `id`=1325; +UPDATE `ai_playerbot_texts` SET `text_loc3`='mir egal, Digga' WHERE `id`=1326; +UPDATE `ai_playerbot_texts` SET `text_loc3`='da bin ich raus' WHERE `id`=1327; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Konzentrier dich aufs Spiel, %s!' WHERE `id`=1330; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Mit dir zu chatten, %s, ist so großartig! Wollte dich immer schon treffen' WHERE `id`=1331; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Diese Chatnachrichten machen mich fertig! Fühlt sich an, als würde ich euch alle kennen!' WHERE `id`=1332; +UPDATE `ai_playerbot_texts` SET `text_loc3`='JA SICHER! HAHA KLAR!!!' WHERE `id`=1333; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Ich glaub dir!!!' WHERE `id`=1334; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Okay, ähm, lol' WHERE `id`=1335; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Hey %s... ach egal!' WHERE `id`=1337; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Wovon redest du, %s' WHERE `id`=1338; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Wer hat das gesagt? Ich fühl mich angesprochen' WHERE `id`=1339; +UPDATE `ai_playerbot_texts` SET `text_loc3`='wtf, worüber redet ihr alle' WHERE `id`=1340; +UPDATE `ai_playerbot_texts` SET `text_loc3`='ehrlich jetzt, kein Witz' WHERE `id`=1341; +UPDATE `ai_playerbot_texts` SET `text_loc3`='du bekommst gar nix' WHERE `id`=1342; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Plus Aura!!!' WHERE `id`=1343; +UPDATE `ai_playerbot_texts` SET `text_loc3`='thx!' WHERE `id`=1344; +UPDATE `ai_playerbot_texts` SET `text_loc3`='jup' WHERE `id`=1346; +UPDATE `ai_playerbot_texts` SET `text_loc3`='f' WHERE `id`=1347; +UPDATE `ai_playerbot_texts` SET `text_loc3`='%s, kein Scheiß xD' WHERE `id`=1348; +UPDATE `ai_playerbot_texts` SET `text_loc3`='warum ist das so' WHERE `id`=1349; +UPDATE `ai_playerbot_texts` SET `text_loc3`='ROFL' WHERE `id`=1350; +UPDATE `ai_playerbot_texts` SET `text_loc3`='dachte, ich halt besser die Klappe, der Chat hat mich wieder verwirrt' WHERE `id`=1351; +UPDATE `ai_playerbot_texts` SET `text_loc3`='ich kann richtig eifersüchtig werden' WHERE `id`=1352; +UPDATE `ai_playerbot_texts` SET `text_loc3`='%s, du hörst den triefenden Sarkasmus in meinem text_loc3 nicht' WHERE `id`=1353; +UPDATE `ai_playerbot_texts` SET `text_loc3`='er meinte „kein Ding“, passt schon' WHERE `id`=1354; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Ja, %s' WHERE `id`=1356; +UPDATE `ai_playerbot_texts` SET `text_loc3`='interessant...' WHERE `id`=1357; +UPDATE `ai_playerbot_texts` SET `text_loc3`='lol' WHERE `id`=1358; +UPDATE `ai_playerbot_texts` SET `text_loc3`='%s, fick dich, Mann :D' WHERE `id`=1359; +UPDATE `ai_playerbot_texts` SET `text_loc3`=':^)' WHERE `id`=1360; +UPDATE `ai_playerbot_texts` SET `text_loc3`='thx' WHERE `id`=1361; +UPDATE `ai_playerbot_texts` SET `text_loc3`='%s, gut gesagt' WHERE `id`=1362; +UPDATE `ai_playerbot_texts` SET `text_loc3`='yay' WHERE `id`=1363; +UPDATE `ai_playerbot_texts` SET `text_loc3`='ja' WHERE `id`=1364; +UPDATE `ai_playerbot_texts` SET `text_loc3`='ooooooh' WHERE `id`=1365; +UPDATE `ai_playerbot_texts` SET `text_loc3`='hmm' WHERE `id`=1366; +UPDATE `ai_playerbot_texts` SET `text_loc3`='ja klar' WHERE `id`=1367; +UPDATE `ai_playerbot_texts` SET `text_loc3`='mir wird schlecht, wtf' WHERE `id`=1368; +UPDATE `ai_playerbot_texts` SET `text_loc3`='heiß' WHERE `id`=1369; +UPDATE `ai_playerbot_texts` SET `text_loc3`='die Weiber sind sauer' WHERE `id`=1370; +UPDATE `ai_playerbot_texts` SET `text_loc3`='was hast du gegessen, %s' WHERE `id`=1371; +UPDATE `ai_playerbot_texts` SET `text_loc3`='wtf' WHERE `id`=1372; +UPDATE `ai_playerbot_texts` SET `text_loc3`='ich versuche, diesen Kommentar zu verstehen' WHERE `id`=1373; +UPDATE `ai_playerbot_texts` SET `text_loc3`='*verwirrt*' WHERE `id`=1374; +UPDATE `ai_playerbot_texts` SET `text_loc3`='fuck ja' WHERE `id`=1375; +UPDATE `ai_playerbot_texts` SET `text_loc3`='0/10 würde ich nicht wieder lesen' WHERE `id`=1376; +UPDATE `ai_playerbot_texts` SET `text_loc3`='10/10 würde ich wieder lesen' WHERE `id`=1377; +UPDATE `ai_playerbot_texts` SET `text_loc3`='6/10 würde es lesen' WHERE `id`=1378; +UPDATE `ai_playerbot_texts` SET `text_loc3`='7/10 vielleicht' WHERE `id`=1379; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Respekt!' WHERE `id`=1380; +UPDATE `ai_playerbot_texts` SET `text_loc3`='oh ja, vielleicht' WHERE `id`=1381; +UPDATE `ai_playerbot_texts` SET `text_loc3`='ja und?' WHERE `id`=1382; +UPDATE `ai_playerbot_texts` SET `text_loc3`='hey %s, ich habe dich nicht vergessen' WHERE `id`=1383; +UPDATE `ai_playerbot_texts` SET `text_loc3`='du gehst mir hart auf den Sack, %s' WHERE `id`=1384; +UPDATE `ai_playerbot_texts` SET `text_loc3`='diesmal krieg ich dich, %s' WHERE `id`=1385; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Pass besser auf, %s' WHERE `id`=1386; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Die letzte Runde mochte ich nicht so' WHERE `id`=1387; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Letzte Runde war ich mies, danke, %s' WHERE `id`=1388; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Mach dich bereit zu sterben, %s' WHERE `id`=1389; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Fands nicht geil, dass du mich gekillt hast, %s' WHERE `id`=1390; +UPDATE `ai_playerbot_texts` SET `text_loc3`='%s, ich hasse dich' WHERE `id`=1391; +UPDATE `ai_playerbot_texts` SET `text_loc3`='grrrrrr, diesmal krieg ich dich, %s' WHERE `id`=1392; +UPDATE `ai_playerbot_texts` SET `text_loc3`='FICK DICH! NEIN, FICK MICH!' WHERE `id`=1393; +UPDATE `ai_playerbot_texts` SET `text_loc3`='%s, ich kotze dir in dein verficktes Maul' WHERE `id`=1394; +UPDATE `ai_playerbot_texts` SET `text_loc3`='verurteil mich nicht, verdammt nochmal' WHERE `id`=1395; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Deine Mom ist so fett, sie passt nicht mal durchs Dunkle Portal' WHERE `id`=1396; +UPDATE `ai_playerbot_texts` SET `text_loc3`='armselige Gestalt' WHERE `id`=1399; +UPDATE `ai_playerbot_texts` SET `text_loc3`='was zum Teufel' WHERE `id`=1400; +UPDATE `ai_playerbot_texts` SET `text_loc3`='das war scheiße' WHERE `id`=1401; +UPDATE `ai_playerbot_texts` SET `text_loc3`='REMATCH!!! Ich mach ihn platt' WHERE `id`=1402; +UPDATE `ai_playerbot_texts` SET `text_loc3`='peinlich, ich wurde von %s gekillt' WHERE `id`=1403; +UPDATE `ai_playerbot_texts` SET `text_loc3`='ok, ich bin raus' WHERE `id`=1404; +UPDATE `ai_playerbot_texts` SET `text_loc3`='hehe, hab %s weggeklatscht?' WHERE `id`=1405; +UPDATE `ai_playerbot_texts` SET `text_loc3`='viel zu easy, %s zu killen' WHERE `id`=1406; +UPDATE `ai_playerbot_texts` SET `text_loc3`='hab dich, du Bastard' WHERE `id`=1407; +UPDATE `ai_playerbot_texts` SET `text_loc3`='haha' WHERE `id`=1408; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Loser' WHERE `id`=1409; +UPDATE `ai_playerbot_texts` SET `text_loc3`='ich hab %s gekillt und ihr seid als nächste dran, Jungs' WHERE `id`=1410; +UPDATE `ai_playerbot_texts` SET `text_loc3`='oh ja, hab ihn geownt' WHERE `id`=1411; +UPDATE `ai_playerbot_texts` SET `text_loc3`='ich bin ne Killmaschine' WHERE `id`=1412; +UPDATE `ai_playerbot_texts` SET `text_loc3`='%s, erinnert mich an einen Slayer-Song... dieses ganze Gemetzel' WHERE `id`=1413; +UPDATE `ai_playerbot_texts` SET `text_loc3`='sorry, %s. Können wir die Szene nochmal machen?' WHERE `id`=1414; +UPDATE `ai_playerbot_texts` SET `text_loc3`='na, wie gefällt es dir Wurmfutter zu sein, %s???' WHERE `id`=1415; +UPDATE `ai_playerbot_texts` SET `text_loc3`='du solltest tot sein, %s, das gehört zum Spiel!!!!!' WHERE `id`=1416; +UPDATE `ai_playerbot_texts` SET `text_loc3`='sorry, %s. das sah so gut aus wie ein Kunstwerk von der Kirmes!' WHERE `id`=1417; +UPDATE `ai_playerbot_texts` SET `text_loc3`='%s, ich nehme nächstes Mal Gummigeschosse!' WHERE `id`=1418; +UPDATE `ai_playerbot_texts` SET `text_loc3`='was ist los, %s?? Kopf verloren? hahaha, ruhig bleiben!!' WHERE `id`=1419; +UPDATE `ai_playerbot_texts` SET `text_loc3`='musste das tun, %s. Du verstehst schon. Der Regisseur hat es so gesagt!!' WHERE `id`=1420; +UPDATE `ai_playerbot_texts` SET `text_loc3`='hey %s.......MUAHAHAHAHAHAHAHAHAHAHA' WHERE `id`=1421; +UPDATE `ai_playerbot_texts` SET `text_loc3`='%s, das hab ich genossen!! Wiederholung bitte!' WHERE `id`=1422; +UPDATE `ai_playerbot_texts` SET `text_loc3`='hey, %s! Kannst mich ab jetzt "Scarface" nennen.. du Stück SCHEI**!!!!' WHERE `id`=1423; +UPDATE `ai_playerbot_texts` SET `text_loc3`='redest du mit mir, %s??' WHERE `id`=1424; +UPDATE `ai_playerbot_texts` SET `text_loc3`='%s, mach es diesmal richtig, stell dich nicht vor meine Kugeln.' WHERE `id`=1425; +UPDATE `ai_playerbot_texts` SET `text_loc3`='%s, warum liegst du da rum??? hehe' WHERE `id`=1426; +UPDATE `ai_playerbot_texts` SET `text_loc3`='hab mich totgelacht' WHERE `id`=1427; +UPDATE `ai_playerbot_texts` SET `text_loc3`='hi %s' WHERE `id`=1428; +UPDATE `ai_playerbot_texts` SET `text_loc3`='oh, hi %s' WHERE `id`=1429; +UPDATE `ai_playerbot_texts` SET `text_loc3`='was geht, %s!!!' WHERE `id`=1430; +UPDATE `ai_playerbot_texts` SET `text_loc3`='hi' WHERE `id`=1431; +UPDATE `ai_playerbot_texts` SET `text_loc3`='was geht' WHERE `id`=1432; +UPDATE `ai_playerbot_texts` SET `text_loc3`='hallo %s' WHERE `id`=1433; +UPDATE `ai_playerbot_texts` SET `text_loc3`='hi %s, kennen wir uns?' WHERE `id`=1434; +UPDATE `ai_playerbot_texts` SET `text_loc3`='hey %s' WHERE `id`=1435; +UPDATE `ai_playerbot_texts` SET `text_loc3`='hai %s' WHERE `id`=1436; +UPDATE `ai_playerbot_texts` SET `text_loc3`='was zur Hölle' WHERE `id`=1437; +UPDATE `ai_playerbot_texts` SET `text_loc3`='WTF' WHERE `id`=1438; +UPDATE `ai_playerbot_texts` SET `text_loc3`='das ist Bullshit' WHERE `id`=1439; +UPDATE `ai_playerbot_texts` SET `text_loc3`='admin' WHERE `id`=1440; +UPDATE `ai_playerbot_texts` SET `text_loc3`='hey %s, hör auf, deine Admin-Rechte zu missbrauchen' WHERE `id`=1441; +UPDATE `ai_playerbot_texts` SET `text_loc3`='lass mich in Ruhe, Admin!' WHERE `id`=1442; +UPDATE `ai_playerbot_texts` SET `text_loc3`='du bist scheisse, Admin' WHERE `id`=1443; +UPDATE `ai_playerbot_texts` SET `text_loc3`='das ist mein Name, was willst du, %s' WHERE `id`=1444; +UPDATE `ai_playerbot_texts` SET `text_loc3`='ja???' WHERE `id`=1445; +UPDATE `ai_playerbot_texts` SET `text_loc3`='äh... was' WHERE `id`=1446; +UPDATE `ai_playerbot_texts` SET `text_loc3`='redest du mit mir, %s?' WHERE `id`=1447; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Hey ! Rate mal, was deine Mom letzte Nacht gesagt hat!' WHERE `id`=1450; +UPDATE `ai_playerbot_texts` SET `text_loc3`=', du bist so hässlich, du würdest nicht mal im Affenbordell mit einem Sack Bananen landen!' WHERE `id`=1451; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Halt die Klappe, , du wirst so ein Mann sein, wie deine Mutter!!' WHERE `id`=1452; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Deine Mutter ist so fett, dass man eine Pokéflöte braucht, um sie aufzuwecken und dein Vater ist der Trainer!!!!' WHERE `id`=1453; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Dich als dumm zu bezeichnen, wäre eine Beleidigung für dumme Leute!' WHERE `id`=1454; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Ich furze in deine allgemeine Richtung!!!' WHERE `id`=1455; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Jeder Atemzug, den ich ohne deine Erlaubnis mache, steigert mein Selbstwertgefühl!' WHERE `id`=1456; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Was willst du tun , mich vollbluten? NIMM DAS!' WHERE `id`=1457; +UPDATE `ai_playerbot_texts` SET `text_loc3`='A-G-G-R-O! Das heißt Bosszeit!' WHERE `id`=1458; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Wir hatten grausame und hatten irre Begleiter, aber mit dir sind wir mit einem grausamen Irren gestraft!' WHERE `id`=1459; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Hey ! Hör auf, sie anzubaggern, sie ist nicht dein Typ. Die sind nicht aufblasbar.' WHERE `id`=1460; +UPDATE `ai_playerbot_texts` SET `text_loc3`=', du bist so weit außerhalb deiner Liga, du spielst schon eine andere Sportart.' WHERE `id`=1461; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Großer Fehler heute Morgen, : Du bist aufgestanden!' WHERE `id`=1462; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Ich will mal versuchen, mich in ein Pferd zu verwandeln, brauche aber Hilfe. Ich mach die Vorderseite, du bleibst du.' WHERE `id`=1463; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Du kommst mir vor, als wäre das Beste von dir damals am Arsch deiner Mutter runtergelaufen und als braune Soße auf der Matratze geblieben!' WHERE `id`=1464; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Ich würd dir gern ein Abschiedsgeschenk machen... Aber zuerst machst du deinen Teil.' WHERE `id`=1465; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Bevor du kamst, waren wir motiviert, jetzt sind wir einfach nur noch genervt.' WHERE `id`=1466; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Ich mag dich. Man sagt, ich hätte keinen Geschmack, aber ich mag dich.' WHERE `id`=1467; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Ich glaube, du hast Minderwertigkeitskomplexe, aber ist okay, ist gerechtfertigt.' WHERE `id`=1468; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Verschwinde, sonst passiert was.' WHERE `id`=1469; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Kaum zu fassen, dass ich meine Zeit mit dir verschwende!' WHERE `id`=1470; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Ich liebe es, wenn mich jemand beleidigt, dann muss ich nicht mehr nett sein.' WHERE `id`=1471; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Ich werde dich auch auslöschen, du Mistkerl! Ich werde dir die Eingeweide rausreißen und dir ins Gesicht schmieren!' WHERE `id`=1472; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Du abscheuliche Bestie, nicht mal ein Hund würde dich fressen.' WHERE `id`=1473; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Du schlägst wie ein Vegetarier.' WHERE `id`=1474; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Wer hat dich ausgebuddelt, du wandelnde Seuche?' WHERE `id`=1475; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Ich schau dir nicht in die Augen, ich will heute noch schlafen können.' WHERE `id`=1476; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Boah, bei dir quillt ja noch das Mittagessen raus! Ich hab dich gerochen, bevor ich dich gesehen hab.' WHERE `id`=1477; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Oh du bist so hässlich, selbst der Respawn will dich nicht!' WHERE `id`=1478; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Ich muss mal einen riesigen machen. ist mein neues Wort für Scheiße.' WHERE `id`=1479; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Oh du nutzlose, moorsaufende Krebsgeschwulst!' WHERE `id`=1480; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Wäre ich wie du, würd ich mich selbst löschen!' WHERE `id`=1481; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Oh lehre mich, wie ich das Denken vergesse!' WHERE `id`=1482; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Ich hab schon Toiletten gesehen, die sauberer kämpfen als du.' WHERE `id`=1483; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Du verdammter Scheißkerl. Wo hast du dein Handwerk gelernt? Du dumme, verdammte Schlampe. Du Idiot. Wer hat dir gesagt, dass du mit Männern arbeiten kannst?' WHERE `id`=1484; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Wenn Unfähigkeit ’ne Klasse wäre, hättest du sie gemaxt.' WHERE `id`=1485; +UPDATE `ai_playerbot_texts` SET `text_loc3`=' du dummes Arschfurz-Teppichladen-Arschloch' WHERE `id`=1486; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Ich lebe lang genug und dann nehm ich dir das Hirn raus!' WHERE `id`=1487; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Wenn einen intelligenten Gedanken im Kopf hätte, würde er an Einsamkeit sterben.' WHERE `id`=1488; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Hör auf zu weinen, du winselnder Arsch, hör auf mit deinem Unsinn. Du bist nur die Nachgeburt, .' WHERE `id`=1489; +UPDATE `ai_playerbot_texts` SET `text_loc3`='! Wenn Gehirn Vogelkacke wäre, hättest du einen sauberen Käfig' WHERE `id`=1490; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Hör mal zu, du Vokuhila... warum zündest du nicht einfach dein Tampon an und sprengst deine Box in die Luft? Denn das ist der einzige Knall, den du kriegen wirst.' WHERE `id`=1491; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Verschwinde aus meiner Sicht ! Du verseuchst meine Augen!' WHERE `id`=1492; +UPDATE `ai_playerbot_texts` SET `text_loc3`='SPIELZEIT!!!!' WHERE `id`=1493; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Niemand kommt vorbei!' WHERE `id`=1494; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Wir werden angegriffen! Klar zum Gefecht, ihr Deckschrubber! Wehrt die Eindringlinge ab!' WHERE `id`=1495; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Narren... Tötet den im Kleid!' WHERE `id`=1497; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Ich werde deine Seele Hakkar selbst zum Fraß vorwerfen!' WHERE `id`=1498; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Stolz kündigt das Ende eurer Welt an! Kommt, Sterbliche! Stellt euch dem Zorn der !' WHERE `id`=1499; +UPDATE `ai_playerbot_texts` SET `text_loc3`='All meine Pläne haben zu diesem Moment geführt!' WHERE `id`=1500; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Neuer Tag, neue glorreiche Schlacht!' WHERE `id`=1502; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Also, Geschäft... oder Vergnügen?' WHERE `id`=1503; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Ihr seid nicht vorbereitet!' WHERE `id`=1504; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Die letzte Eroberung der hat begonnen! Wieder liegt die Unterwerfung dieser Welt in unseren Händen. Lasst keinen überleben!' WHERE `id`=1505; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Euer Tod wird ein schmerzhafter sein.' WHERE `id`=1506; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Fleht um Gnade! Eure bedeutungslosen Leben sind bald verwirkt.' WHERE `id`=1507; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Gebt alle Hoffnung auf! Die ist zurückgekehrt, um zu beenden, was vor so vielen Jahren begann. Diesmal gibt es kein Entkommen!' WHERE `id`=1508; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Alarm! Ihr seid zur Auslöschung markiert!' WHERE `id`=1509; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Hahaha! Ihr seid hoffnungslos unterlegen!' WHERE `id`=1511; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Ich werde euren Größenwahn zerschmettern!' WHERE `id`=1512; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Verzeiht mir, denn ihr werdet gleich das Spiel verlieren.' WHERE `id`=1513; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Wehren macht es nur schlimmer.' WHERE `id`=1514; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Ungeziefer! Blutegel! Saugt mein Blut und erstickt daran!' WHERE `id`=1515; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Mein Blut wird euer Ende sein!' WHERE `id`=1517; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Macht hinne, Wachen! Es ist Zeit zum Töten!' WHERE `id`=1519; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Zögert euer Schicksal nicht hinaus. Kommt jetzt zu mir. Ich mache euer Opfer kurz.' WHERE `id`=1520; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Bald seid ihr tot!' WHERE `id`=1521; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Mu-ha-ha!' WHERE `id`=1522; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Ich bin der Jäger! Ihr seid die Beute...' WHERE `id`=1523; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Ihr werdet diesen Ort in Stücken verlassen!' WHERE `id`=1524; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Der Tod naht. Wird euer Gewissen rein sein?' WHERE `id`=1525; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Euer Verhalten wird nicht toleriert.' WHERE `id`=1526; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Hmm, unangekündigte Besucher. Vorbereitungen müssen getroffen werden...' WHERE `id`=1528; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Feindliche Einheiten entdeckt. Bedrohungsanalyse-Protokoll aktiv. Primärziel erfasst. Zeit minus dreißig Sekunden bis zur Neubewertung.' WHERE `id`=1529; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Neue Spielzeuge? Für mich? Ich verspreche, ich mach sie diesmal nicht kaputt!' WHERE `id`=1530; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Pssst... gleich ist alles vorbei.' WHERE `id`=1532; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Sag es mir... sag mir alles, Geheimnisse und Privatsachen! Ich reiße dir die Infos aus dem Fleisch!' WHERE `id`=1536; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Macht euch bereit, die Glocken haben geläutet! Bringt die Schwachen, die Jungen und die Alten in Sicherheit! Jeder von euch zahlt den letzten Preis! Fleht um Gnade, die Abrechnung ist gekommen!' WHERE `id`=1537; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Wo, bei Bonzos Messingknöpfen, bin ich?' WHERE `id`=1538; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Ich ertrage es nicht länger! Goblinkönig! Goblinkönig! Wo immer du bist! Nimm diesen weit weg von mir!' WHERE `id`=1539; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Ihr habt dreizehn Stunden, um das Labyrinth zu lösen, bevor euer kleiner Bruder einer von uns wird... für immer.' WHERE `id`=1540; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Also, die ist Kinderkram, ja? Dann sehen wir mal, wie ihr dieses kleine Stückchen verdaut...' WHERE `id`=1541; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Weiche! Ich stelle mich jedem Kampf. Du irrst dich, dies ist nicht dein Revier.' WHERE `id`=1542; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Zeig, was du drauf hast!' WHERE `id`=1543; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Zweiklingen-Action für eine glatte und saubere Rasur jedes mal.' WHERE `id`=1545; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Los, komm schon!' WHERE `id`=1546; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Du gehst drauf!' WHERE `id`=1547; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Stich, stich, stich!' WHERE `id`=1548; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Machen wir das schnell, Zeit ist Mana.' WHERE `id`=1549; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Ich glaube nicht, dass ihr die Schwere eurer Lage begreift.' WHERE `id`=1550; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Ich bringe meiner Familie und meinem Königreich Ehre!' WHERE `id`=1551; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Licht, gib mir Stärke!' WHERE `id`=1552; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Meine Kirche ist das Schlachtfeld, Zeit zum Gottesdienst...' WHERE `id`=1553; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Ich verachte euch...' WHERE `id`=1554; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Stellt euch dem Hammer der Gerechtigkeit!' WHERE `id`=1555; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Beweist euren Wert in der Prüfung der Waffen im Lichte!' WHERE `id`=1556; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Alles wird vor der Macht und der Gerechtigkeit meiner Sache fallen. Ihr werdet der Nächste sein!' WHERE `id`=1557; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Bereitet euch aufs Sterben vor!' WHERE `id`=1558; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Die Bestie an meiner Seite ist nichts gegen die Bestie in mir...' WHERE `id`=1559; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Erlebt die Feuerkraft dieses voll bewaffneten Jägers!' WHERE `id`=1560; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Heilt mich! Schnell!' WHERE `id`=1561; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Fast tot! Heilt mich!' WHERE `id`=1562; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Hilfe! Heilt mich!' WHERE `id`=1563; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Irgendwer! Heilt mich!' WHERE `id`=1564; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Heal! Heal! Heal!' WHERE `id`=1565; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Ich sterbe! Heal! Aaaaarhg!' WHERE `id`=1566; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Heal mich!' WHERE `id`=1567; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Ich sterbe. Ich sterbe. Ich sterbe. Heal!' WHERE `id`=1568; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Oh, der Schmerz. Heilt mich schnell!' WHERE `id`=1570; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Brauche Heal' WHERE `id`=1571; +UPDATE `ai_playerbot_texts` SET `text_loc3`='HP low' WHERE `id`=1572; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Gebt mal nen Heal. Bitte.' WHERE `id`=1573; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Kann mir jemand nen Heal geben?' WHERE `id`=1574; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Hey! Lieber jetzt heilen als später zu rezzen' WHERE `id`=1575; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Sorry. Brauche noch einen Heal' WHERE `id`=1576; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Verdammte Mobs. Heal mich bitte' WHERE `id`=1577; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Noch ein Treffer und ich bin hinüber. Heal bitte' WHERE `id`=1578; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Heiler da?' WHERE `id`=1579; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Warum hauen die mir immer ins Gesicht? Brauche Heal' WHERE `id`=1580; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Kann mich wer ein bisschen heilen?' WHERE `id`=1581; +UPDATE `ai_playerbot_texts` SET `text_loc3`='OOM' WHERE `id`=1582; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Kein Mana mehr' WHERE `id`=1583; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Verdammt, dafür hab ich mein ganzes Mana verballert' WHERE `id`=1584; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Wartet bis ich trinke oder mein Mana wieder da ist' WHERE `id`=1585; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Mana low' WHERE `id`=1586; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Mana low. Muss trinken' WHERE `id`=1588; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Haben wir nen Getränkeautomaten? Wieder OOM' WHERE `id`=1589; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Mein Mana ist Geschichte' WHERE `id`=1590; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Ich besorge mir nächstes mal Drinks. OOM' WHERE `id`=1591; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Noch 100 !' WHERE `id`=1595; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Das war es! Keine mehr!' WHERE `id`=1596; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Und ihr habt meinen Bogen... ups, keine !' WHERE `id`=1597; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Brauche !' WHERE `id`=1598; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Ich habe Angst' WHERE `id`=1600; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Wir sind am Arsch.' WHERE `id`=1601; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Das wars.' WHERE `id`=1602; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Hier ist jetzt Schluss.' WHERE `id`=1603; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Kann mal wer Blizzard anrufen?' WHERE `id`=1604; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Verdammt. Der Tank hat alle Mobs gepullt.' WHERE `id`=1605; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Wir sterben. Wir sterben. Wir sterben.' WHERE `id`=1606; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Whoa! So viel Spielzeug zum Austoben.' WHERE `id`=1607; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Ich kill sie alle!' WHERE `id`=1608; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Wenn der Tank stirbt, sind wir Geschichte.' WHERE `id`=1609; +UPDATE `ai_playerbot_texts` SET `text_loc3`='LEEEEERROOOYYYYYYYYYYYY JENNKINNNSSSSSS!!!!!!!' WHERE `id`=1611; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Okay. Was haben wir an AoE?' WHERE `id`=1612; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Jetzt wirds interessant.' WHERE `id`=1613; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Cool. Zieht sie zusammen für nen schönen Flammenstoß.' WHERE `id`=1614; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Kill! Kill! Kill!' WHERE `id`=1615; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Ich glaub, meine Hose ist nass.' WHERE `id`=1616; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Hoffentlich sind die Heiler ready. Leeeeroy!' WHERE `id`=1618; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Hoffentlich kommen die nicht zu mir.' WHERE `id`=1619; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Oh nein. Ich kann bei dem Gemetzel nicht hinsehen.' WHERE `id`=1620; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Hoffentlich gibts Gold.' WHERE `id`=1621; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Loot! Loot!' WHERE `id`=1622; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Mein Schatz.' WHERE `id`=1623; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Hoffentlich wartet da ein schickes episches Item auf mich.' WHERE `id`=1624; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Ich hab tiefe Taschen und Beutel.' WHERE `id`=1625; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Alles meins!' WHERE `id`=1626; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Hoffentlich heute kein grauer Müll.' WHERE `id`=1627; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Dieser Loot ist MEINER!' WHERE `id`=1628; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Looten ist eklig, aber ich brauch Gold.' WHERE `id`=1629; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Gold!' WHERE `id`=1630; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Okay. Mal sehen, was sie droppen.' WHERE `id`=1631; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Keine Sorge. Ich loote alles.' WHERE `id`=1632; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Ich bin ein Ninja-Looter.' WHERE `id`=1633; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Kann mir mal wer erklären, wo die das ganze Zeug versteckt haben?' WHERE `id`=1635; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Nein, ich loote keinen grauen Müll.' WHERE `id`=1636; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Ich bin zuerst. Ich bin zuerst. Ich bin zuerst.' WHERE `id`=1637; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Gebt mir euer Gold!' WHERE `id`=1638; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Meine Taschen sind leer, müssen aber voll werden.' WHERE `id`=1639; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Hab dafür ne neue Tasche.' WHERE `id`=1640; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Hoffentlich zieh ich beim Looten keine Aggro.' WHERE `id`=1641; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Ich kann nicht looten wenn jemand zusieht.' WHERE `id`=1642; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Ha! Ihr kriegt davon keinen Krümel!' WHERE `id`=1643; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Ich mag neues Gear.' WHERE `id`=1645; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Ich höre auf, wenn schon wieder nichts Wertvolles droppt.' WHERE `id`=1646; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Hoffentlich ist es ein hübscher Ring.' WHERE `id`=1647; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Ich reiß dir den Loot aus den Händen.' WHERE `id`=1648; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Alle weg da. Ich loote jetzt.' WHERE `id`=1649; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Geiler Loot.' WHERE `id`=1650; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Oh ihr RNG-Götter! Gewährt mir heute einen Epic beim würfeln.' WHERE `id`=1651; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Bitte gib mir neues Spielzeug.' WHERE `id`=1652; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Hoffe, die haben was Leckeres dabei.' WHERE `id`=1653; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Das Gold gehört mir. Ich lasse euch den Rest, versprochen.' WHERE `id`=1654; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Bin gleich da, wartet auf mich!' WHERE `id`=1657; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Bin nicht mehr weit, bitte wartet!' WHERE `id`=1658; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Bin auf dem Weg zu euch.' WHERE `id`=1659; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Ich reise zu euch.' WHERE `id`=1661; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Ich versuche zu euch zu kommen.' WHERE `id`=1662; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Rüste %item aus' WHERE `id`=1663; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Ich habe die Zauber gelernt: %spells' WHERE `id`=1665; +UPDATE `ai_playerbot_texts` SET `text_loc3`='%item hat Abklingzeit.' WHERE `id`=1666; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Ich habe %item nicht im Inventar.' WHERE `id`=1667; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Das Item mit der ID %item existiert nicht.' WHERE `id`=1668; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Folge.' WHERE `id`=1671; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Bleibe hier.' WHERE `id`=1672; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Fliehe.' WHERE `id`=1673; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Ich fliehe nicht mit dir, du bist zu weit weg.' WHERE `id`=1674; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Grinde.' WHERE `id`=1675; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Greife an.' WHERE `id`=1676; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Das ist zu weit weg.' WHERE `id`=1677; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Da kann ich nicht hin.' WHERE `id`=1679; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Ich bin nicht in deiner Gilde!' WHERE `id`=1680; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Keine Gildenbank in der Nähe gefunden.' WHERE `id`=1681; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Ich kann nicht ' WHERE `id`=1682; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Ich habe keine Rechte, Items in den ersten Gildenbank-Reiter zu legen.' WHERE `id`=1683; +UPDATE `ai_playerbot_texts` SET `text_loc3`=' in die Gildenbank gelegt' WHERE `id`=1684; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Freies Bewegen.' WHERE `id`=1685; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Bewache.' WHERE `id`=1686; +UPDATE `ai_playerbot_texts` SET `text_loc3`='(das letzte)' WHERE `id`=1690; +UPDATE `ai_playerbot_texts` SET `text_loc3`='auf Handelsgegenstand' WHERE `id`=1692; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Loote %item' WHERE `id`=1696; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Ich habe nicht genug Gruppenmitglieder in der Nähe, um beschwören zu können.' WHERE `id`=1698; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Ich kenne den Zauber %spell nicht.' WHERE `id`=1701; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Stelle %spell her' WHERE `id`=1703; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Konnte %spell nicht wirken.' WHERE `id`=1705; +UPDATE `ai_playerbot_texts` SET `text_loc3`=' |cffffff00(x%amount übrig)|r' WHERE `id`=1706; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Dummy' WHERE `id`=1707; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Beim Licht… Ich hab meine Königssymbole vergessen. Na gut, dann nehmen wir eben %base_spell!' WHERE `id`=1708; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Die Natur ist großzügig, meine Taschen nicht... keine Kräuter für %group_spell mehr. Nehmt fürs Erste %base_spell!' WHERE `id`=1709; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Arkanes Pulver alle... %group_spell muss warten. Wirke %base_spell!' WHERE `id`=1710; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Ups, mir fehlen die Komponenten für %group_spell. Wir nehmen %base_spell!' WHERE `id`=1711; +UPDATE `ai_playerbot_texts` SET `text_loc3`='%player bewegt sich, um den roten Strahl zu blocken!' WHERE `id`=1712; +UPDATE `ai_playerbot_texts` SET `text_loc3`='%player bewegt sich, um den blauen Strahl zu blocken!' WHERE `id`=1713; +UPDATE `ai_playerbot_texts` SET `text_loc3`='%player bewegt sich, um den grünen Strahl zu blocken!' WHERE `id`=1714; +UPDATE `ai_playerbot_texts` SET `text_loc3`='%player verlässt den blauen Strahl--nächster Blocker los!' WHERE `id`=1715; +UPDATE `ai_playerbot_texts` SET `text_loc3`='%player verlässt den grünen Strahl--nächster Blocker los!' WHERE `id`=1716; \ No newline at end of file From 5d3e64800f5281b4cf9d3fc4f25b27bc6a46d1dd Mon Sep 17 00:00:00 2001 From: St0ny <42348051+Raz0r1337@users.noreply.github.com> Date: Wed, 29 Oct 2025 17:39:06 +0100 Subject: [PATCH 126/151] important bugfix for the last PR #1675 (#1782) * Update 2025_10_27_00_ai_playerbot_german_texts.sql Fix bug that adds holes in the german text_loc3 collumn --- .../updates/2025_10_27_00_ai_playerbot_german_texts.sql | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/data/sql/playerbots/updates/2025_10_27_00_ai_playerbot_german_texts.sql b/data/sql/playerbots/updates/2025_10_27_00_ai_playerbot_german_texts.sql index 559493f2c0..075cd16648 100644 --- a/data/sql/playerbots/updates/2025_10_27_00_ai_playerbot_german_texts.sql +++ b/data/sql/playerbots/updates/2025_10_27_00_ai_playerbot_german_texts.sql @@ -1,5 +1,3 @@ -UPDATE `ai_playerbot_texts` SET `text_loc3`=''; - UPDATE `ai_playerbot_texts` SET `text_loc3`='am Arsch der Welt' WHERE `id`=1; UPDATE `ai_playerbot_texts` SET `text_loc3`='an einem geheimen Ort' WHERE `id`=2; UPDATE `ai_playerbot_texts` SET `text_loc3`='irgendwo' WHERE `id`=3; @@ -1532,4 +1530,5 @@ UPDATE `ai_playerbot_texts` SET `text_loc3`='%player bewegt sich, um den roten S UPDATE `ai_playerbot_texts` SET `text_loc3`='%player bewegt sich, um den blauen Strahl zu blocken!' WHERE `id`=1713; UPDATE `ai_playerbot_texts` SET `text_loc3`='%player bewegt sich, um den grünen Strahl zu blocken!' WHERE `id`=1714; UPDATE `ai_playerbot_texts` SET `text_loc3`='%player verlässt den blauen Strahl--nächster Blocker los!' WHERE `id`=1715; -UPDATE `ai_playerbot_texts` SET `text_loc3`='%player verlässt den grünen Strahl--nächster Blocker los!' WHERE `id`=1716; \ No newline at end of file + +UPDATE `ai_playerbot_texts` SET `text_loc3`='%player verlässt den grünen Strahl--nächster Blocker los!' WHERE `id`=1716; From cb099bcaf4a0abf0236d3ee172b742338db9422d Mon Sep 17 00:00:00 2001 From: kadeshar Date: Sat, 1 Nov 2025 17:25:07 +0100 Subject: [PATCH 127/151] Update repository condition for C++ job --- .github/workflows/codestyle_cpp.yml | 35 +++++++++++++++++++++++++++++ 1 file changed, 35 insertions(+) create mode 100644 .github/workflows/codestyle_cpp.yml diff --git a/.github/workflows/codestyle_cpp.yml b/.github/workflows/codestyle_cpp.yml new file mode 100644 index 0000000000..0afaf4b795 --- /dev/null +++ b/.github/workflows/codestyle_cpp.yml @@ -0,0 +1,35 @@ +name: C++ Codestyle +on: + pull_request: + types: + - opened + - reopened + - synchronize + paths: + - src/** + - "!README.md" + - "!docs/**" + +jobs: + triage: + runs-on: ubuntu-latest + name: C++ + if: github.repository == 'mod-playerbots/mod-playerbots' && !github.event.pull_request.draft + steps: + - uses: actions/checkout@v4 + - name: Setup python + uses: actions/setup-python@v5 + with: + python-version: '3.10' + - name: AzerothCore codestyle + run: python ./apps/codestyle/codestyle-cpp.py + - name: C++ Advanced + run: | + sudo apt update -y + sudo apt install -y cppcheck + cppcheck --force --inline-suppr --suppressions-list=./.suppress.cppcheck src/ --output-file=report.txt + + if [ -s report.txt ]; then # if file is not empty + cat report.txt + exit 1 # let github action fails + fi From 586c4d9d058490a409226ca7e6375d2aac4175e4 Mon Sep 17 00:00:00 2001 From: kadeshar Date: Sat, 1 Nov 2025 17:27:26 +0100 Subject: [PATCH 128/151] - Added codestyle azerothcore python script --- apps/codestyle-cpp.py | 263 ++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 263 insertions(+) create mode 100644 apps/codestyle-cpp.py diff --git a/apps/codestyle-cpp.py b/apps/codestyle-cpp.py new file mode 100644 index 0000000000..72c2a88862 --- /dev/null +++ b/apps/codestyle-cpp.py @@ -0,0 +1,263 @@ +import io +import os +import sys +import re + +# Get the src directory of the project +src_directory = os.path.join(os.getcwd(), 'src') + +# Global variables +error_handler = False +results = { + "Multiple blank lines check": "Passed", + "Trailing whitespace check": "Passed", + "GetCounter() check": "Passed", + "Misc codestyle check": "Passed", + "GetTypeId() check": "Passed", + "NpcFlagHelpers check": "Passed", + "ItemFlagHelpers check": "Passed", + "ItemTemplateFlagHelpers check": "Passed" +} + +# Main function to parse all the files of the project +def parsing_file(directory: str) -> None: + print("Starting AzerothCore CPP Codestyle check...") + print(" ") + print("Please read the C++ Code Standards for AzerothCore:") + print("https://www.azerothcore.org/wiki/cpp-code-standards") + print(" ") + for root, _, files in os.walk(directory): + for file in files: + if not file.endswith('.ico'): # Skip .ico files that cannot be read + file_path = os.path.join(root, file) + file_name = file + try: + with open(file_path, 'r', encoding='utf-8') as file: + multiple_blank_lines_check(file, file_path) + trailing_whitespace_check(file, file_path) + get_counter_check(file, file_path) + if not file_name.endswith('.cmake') and file_name != 'CMakeLists.txt': + misc_codestyle_check(file, file_path) + if file_name != 'Object.h': + get_typeid_check(file, file_path) + if file_name != 'Unit.h': + npcflags_helpers_check(file, file_path) + if file_name != 'Item.h': + itemflag_helpers_check(file, file_path) + if file_name != 'ItemTemplate.h': + itemtemplateflag_helpers_check(file, file_path) + except UnicodeDecodeError: + print(f"\nCould not decode file {file_path}") + sys.exit(1) + # Output the results + print("") + for check, result in results.items(): + print(f"{check} : {result}") + if error_handler: + print("\nPlease fix the codestyle issues above.") + sys.exit(1) + else: + print(f"\nEverything looks good") + +# Codestyle patterns checking for multiple blank lines +def multiple_blank_lines_check(file: io, file_path: str) -> None: + global error_handler, results + file.seek(0) # Reset file pointer to the beginning + check_failed = False + consecutive_blank_lines = 0 + # Parse all the file + for line_number, line in enumerate(file, start = 1): + if line.strip() == '': + consecutive_blank_lines += 1 + if consecutive_blank_lines > 1: + print(f"Multiple blank lines found in {file_path} at line {line_number - 1}") + check_failed = True + else: + consecutive_blank_lines = 0 + # Additional check for the end of the file + if consecutive_blank_lines >= 1: + print(f"Multiple blank lines found at the end of: {file_path}") + check_failed = True + # Handle the script error and update the result output + if check_failed: + error_handler = True + results["Multiple blank lines check"] = "Failed" + +# Codestyle patterns checking for whitespace at the end of the lines +def trailing_whitespace_check(file: io, file_path: str) -> None: + global error_handler, results + file.seek(0) # Reset file pointer to the beginning + # Parse all the file + for line_number, line in enumerate(file, start = 1): + if line.endswith(' \n'): + print(f"Trailing whitespace found: {file_path} at line {line_number}") + if not error_handler: + error_handler = True + results["Trailing whitespace check"] = "Failed" + +# Codestyle patterns checking for ObjectGuid::GetCounter() +def get_counter_check(file: io, file_path: str) -> None: + global error_handler, results + file.seek(0) # Reset file pointer to the beginning + # Parse all the file + for line_number, line in enumerate(file, start = 1): + if 'ObjectGuid::GetCounter()' in line: + print(f"Please use ObjectGuid::ToString().c_str() instead ObjectGuid::GetCounter(): {file_path} at line {line_number}") + if not error_handler: + error_handler = True + results["GetCounter() check"] = "Failed" + +# Codestyle patterns checking for GetTypeId() +def get_typeid_check(file: io, file_path: str) -> None: + global error_handler, results + file.seek(0) # Reset file pointer to the beginning + check_failed = False + # Parse all the file + for line_number, line in enumerate(file, start = 1): + if 'GetTypeId() == TYPEID_ITEM' in line or 'GetTypeId() != TYPEID_ITEM' in line: + print(f"Please use IsItem() instead of GetTypeId(): {file_path} at line {line_number}") + check_failed = True + if 'GetTypeId() == TYPEID_UNIT' in line or 'GetTypeId() != TYPEID_UNIT' in line: + print(f"Please use IsCreature() instead of GetTypeId(): {file_path} at line {line_number}") + check_failed = True + if 'GetTypeId() == TYPEID_PLAYER' in line or 'GetTypeId() != TYPEID_PLAYER' in line: + print(f"Please use IsPlayer() instead of GetTypeId(): {file_path} at line {line_number}") + check_failed = True + if 'GetTypeId() == TYPEID_GAMEOBJECT' in line or 'GetTypeId() != TYPEID_GAMEOBJECT' in line: + print(f"Please use IsGameObject() instead of GetTypeId(): {file_path} at line {line_number}") + check_failed = True + if 'GetTypeId() == TYPEID_DYNOBJECT' in line or 'GetTypeId() != TYPEID_DYNOBJECT' in line: + print(f"Please use IsDynamicObject() instead of GetTypeId(): {file_path} at line {line_number}") + check_failed = True + # Handle the script error and update the result output + if check_failed: + error_handler = True + results["GetTypeId() check"] = "Failed" + +# Codestyle patterns checking for NpcFlag helpers +def npcflags_helpers_check(file: io, file_path: str) -> None: + global error_handler, results + file.seek(0) # Reset file pointer to the beginning + check_failed = False + # Parse all the file + for line_number, line in enumerate(file, start = 1): + if 'GetUInt32Value(UNIT_NPC_FLAGS)' in line: + print( + f"Please use GetNpcFlags() instead of GetUInt32Value(UNIT_NPC_FLAGS): {file_path} at line {line_number}") + check_failed = True + if 'HasFlag(UNIT_NPC_FLAGS,' in line: + print( + f"Please use HasNpcFlag() instead of HasFlag(UNIT_NPC_FLAGS, ...): {file_path} at line {line_number}") + check_failed = True + if 'SetUInt32Value(UNIT_NPC_FLAGS,' in line: + print( + f"Please use ReplaceAllNpcFlags() instead of SetUInt32Value(UNIT_NPC_FLAGS, ...): {file_path} at line {line_number}") + check_failed = True + if 'SetFlag(UNIT_NPC_FLAGS,' in line: + print( + f"Please use SetNpcFlag() instead of SetFlag(UNIT_NPC_FLAGS, ...): {file_path} at line {line_number}") + check_failed = True + if 'RemoveFlag(UNIT_NPC_FLAGS,' in line: + print( + f"Please use RemoveNpcFlag() instead of RemoveFlag(UNIT_NPC_FLAGS, ...): {file_path} at line {line_number}") + check_failed = True + # Handle the script error and update the result output + if check_failed: + error_handler = True + results["NpcFlagHelpers check"] = "Failed" + +# Codestyle patterns checking for ItemFlag helpers +def itemflag_helpers_check(file: io, file_path: str) -> None: + global error_handler, results + file.seek(0) # Reset file pointer to the beginning + check_failed = False + # Parse all the file + for line_number, line in enumerate(file, start = 1): + if 'HasFlag(ITEM_FIELD_FLAGS, ITEM_FIELD_FLAG_REFUNDABLE)' in line: + print( + f"Please use IsRefundable() instead of HasFlag(ITEM_FIELD_FLAGS, ITEM_FIELD_FLAG_REFUNDABLE): {file_path} at line {line_number}") + check_failed = True + if 'HasFlag(ITEM_FIELD_FLAGS, ITEM_FIELD_FLAG_BOP_TRADEABLE)' in line: + print( + f"Please use IsBOPTradable() instead of HasFlag(ITEM_FIELD_FLAGS, ITEM_FIELD_FLAG_BOP_TRADEABLE): {file_path} at line {line_number}") + check_failed = True + if 'HasFlag(ITEM_FIELD_FLAGS, ITEM_FIELD_FLAG_WRAPPED)' in line: + print( + f"Please use IsWrapped() instead of HasFlag(ITEM_FIELD_FLAGS, ITEM_FIELD_FLAG_WRAPPED): {file_path} at line {line_number}") + check_failed = True + # Handle the script error and update the result output + if check_failed: + error_handler = True + results["ItemFlagHelpers check"] = "Failed" + +# Codestyle patterns checking for ItemTemplate helpers +def itemtemplateflag_helpers_check(file: io, file_path: str) -> None: + global error_handler, results + file.seek(0) # Reset file pointer to the beginning + check_failed = False + # Parse all the file + for line_number, line in enumerate(file, start = 1): + if 'Flags & ITEM_FLAG' in line: + print( + f"Please use HasFlag(ItemFlag) instead of 'Flags & ITEM_FLAG_': {file_path} at line {line_number}") + check_failed = True + if 'Flags2 & ITEM_FLAG2' in line: + print( + f"Please use HasFlag2(ItemFlag2) instead of 'Flags2 & ITEM_FLAG2_': {file_path} at line {line_number}") + check_failed = True + if 'FlagsCu & ITEM_FLAGS_CU' in line: + print( + f"Please use HasFlagCu(ItemFlagsCustom) instead of 'FlagsCu & ITEM_FLAGS_CU_': {file_path} at line {line_number}") + check_failed = True + # Handle the script error and update the result output + if check_failed: + error_handler = True + results["ItemTemplateFlagHelpers check"] = "Failed" + +# Codestyle patterns checking for various codestyle issues +def misc_codestyle_check(file: io, file_path: str) -> None: + global error_handler, results + file.seek(0) # Reset file pointer to the beginning + check_failed = False + + # used to check for "if/else (...) {" "} else" ignores "if/else (...) {...}" "#define ... if/else (...) {" + ifelse_curlyregex = r"^[^#define].*\s+(if|else)(\s*\(.*\))?\s*{[^}]*$|}\s*else(\s*{[^}]*$)" + # used to catch double semicolons ";;" ignores "(;;)" + double_semiregex = r"(? Date: Sat, 1 Nov 2025 17:38:11 +0100 Subject: [PATCH 129/151] - added missing var for codestyle azerothcore --- var/.suppress.cppcheck | 1 + 1 file changed, 1 insertion(+) create mode 100644 var/.suppress.cppcheck diff --git a/var/.suppress.cppcheck b/var/.suppress.cppcheck new file mode 100644 index 0000000000..07569fe086 --- /dev/null +++ b/var/.suppress.cppcheck @@ -0,0 +1 @@ +cppcheckError \ No newline at end of file From f7fea456ca524171a36dc7aa753e86a2ee607f73 Mon Sep 17 00:00:00 2001 From: privatecore Date: Sun, 2 Nov 2025 13:27:25 +0100 Subject: [PATCH 130/151] Fix PositionInfo constructors' members order (#1776) --- src/strategy/values/PositionValue.h | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/strategy/values/PositionValue.h b/src/strategy/values/PositionValue.h index 86ed8d0989..69e8e35943 100644 --- a/src/strategy/values/PositionValue.h +++ b/src/strategy/values/PositionValue.h @@ -15,13 +15,13 @@ class PlayerbotAI; class PositionInfo { public: - PositionInfo() : valueSet(false), x(0), y(0), z(0), mapId(0) {} + PositionInfo() : x(0), y(0), z(0), mapId(0), valueSet(false) {} PositionInfo(float x, float y, float z, uint32 mapId, bool valueSet = true) - : valueSet(valueSet), x(x), y(y), z(z), mapId(mapId) + : x(x), y(y), z(z), mapId(mapId), valueSet(valueSet) { } PositionInfo(PositionInfo const& other) - : valueSet(other.valueSet), x(other.x), y(other.y), z(other.z), mapId(other.mapId) + : x(other.x), y(other.y), z(other.z), mapId(other.mapId), valueSet(other.valueSet) { } @@ -41,8 +41,8 @@ class PositionInfo float x; float y; float z; - bool valueSet; uint32 mapId; + bool valueSet; }; typedef std::map PositionMap; From 43164e74e1f10ede8bb19231fe7629bec764e5d5 Mon Sep 17 00:00:00 2001 From: Revision Date: Sun, 2 Nov 2025 13:28:26 +0100 Subject: [PATCH 131/151] Normalize line endings for 2025_10_27_00_ai_playerbot_german_texts.sql to LF (#1795) --- ...025_10_27_00_ai_playerbot_german_texts.sql | 3068 ++++++++--------- 1 file changed, 1534 insertions(+), 1534 deletions(-) diff --git a/data/sql/playerbots/updates/2025_10_27_00_ai_playerbot_german_texts.sql b/data/sql/playerbots/updates/2025_10_27_00_ai_playerbot_german_texts.sql index 075cd16648..b3c0b9e7c5 100644 --- a/data/sql/playerbots/updates/2025_10_27_00_ai_playerbot_german_texts.sql +++ b/data/sql/playerbots/updates/2025_10_27_00_ai_playerbot_german_texts.sql @@ -1,1534 +1,1534 @@ -UPDATE `ai_playerbot_texts` SET `text_loc3`='am Arsch der Welt' WHERE `id`=1; -UPDATE `ai_playerbot_texts` SET `text_loc3`='an einem geheimen Ort' WHERE `id`=2; -UPDATE `ai_playerbot_texts` SET `text_loc3`='irgendwo' WHERE `id`=3; -UPDATE `ai_playerbot_texts` SET `text_loc3`='irgendwas' WHERE `id`=4; -UPDATE `ai_playerbot_texts` SET `text_loc3`='frag mich, wie %item_link wohl schmeckt' WHERE `id`=5; -UPDATE `ai_playerbot_texts` SET `text_loc3`='neeein, ich hab %item_link bekommen' WHERE `id`=6; -UPDATE `ai_playerbot_texts` SET `text_loc3`='ah nee, nicht schon wieder dieser Müll: %item_link' WHERE `id`=7; -UPDATE `ai_playerbot_texts` SET `text_loc3`='scheint so, als würde ich nur Müll looten: %item_link' WHERE `id`=8; -UPDATE `ai_playerbot_texts` SET `text_loc3`='naja, besser als nix, schätze ich: %item_link' WHERE `id`=9; -UPDATE `ai_playerbot_texts` SET `text_loc3`='keine Ahnung, was ich mit %item_link anfangen soll' WHERE `id`=10; -UPDATE `ai_playerbot_texts` SET `text_loc3`='naja, ich kann den ganzen Tag %item_link looten' WHERE `id`=11; -UPDATE `ai_playerbot_texts` SET `text_loc3`='neuer Tag, neuer %item_link' WHERE `id`=12; -UPDATE `ai_playerbot_texts` SET `text_loc3`='hab %item_link gelootet' WHERE `id`=13; -UPDATE `ai_playerbot_texts` SET `text_loc3`='ein %item_link ist okay' WHERE `id`=14; -UPDATE `ai_playerbot_texts` SET `text_loc3`='nicht schlecht, hab grad %item_link bekommen.' WHERE `id`=15; -UPDATE `ai_playerbot_texts` SET `text_loc3`='gerade %item_link in %zone_name gelootet' WHERE `id`=16; -UPDATE `ai_playerbot_texts` SET `text_loc3`='kann ich gut gebrauchen, %item_link' WHERE `id`=17; -UPDATE `ai_playerbot_texts` SET `text_loc3`='Gold, Gold, Gold: %item_link' WHERE `id`=18; -UPDATE `ai_playerbot_texts` SET `text_loc3`='hab %item_link bekommen' WHERE `id`=19; -UPDATE `ai_playerbot_texts` SET `text_loc3`='%item_link ist BiS für Jäger' WHERE `id`=20; -UPDATE `ai_playerbot_texts` SET `text_loc3`='%item_link ist BiS für %my_class' WHERE `id`=21; -UPDATE `ai_playerbot_texts` SET `text_loc3`='RNG meint es heute gut: %item_link' WHERE `id`=22; -UPDATE `ai_playerbot_texts` SET `text_loc3`='nice, %item_link frisch gelootet' WHERE `id`=23; -UPDATE `ai_playerbot_texts` SET `text_loc3`='wow, hab gerade %item_link bekommen' WHERE `id`=24; -UPDATE `ai_playerbot_texts` SET `text_loc3`='%item_link ist BiS für Jäger' WHERE `id`=25; -UPDATE `ai_playerbot_texts` SET `text_loc3`='%item_link ist BiS für %my_class' WHERE `id`=26; -UPDATE `ai_playerbot_texts` SET `text_loc3`='RNG meint es heute gut: %item_link' WHERE `id`=27; -UPDATE `ai_playerbot_texts` SET `text_loc3`='nice, %item_link frisch gelootet' WHERE `id`=28; -UPDATE `ai_playerbot_texts` SET `text_loc3`='OMG, guckt mal, was ich gerade bekommen hab: %item_link!!!' WHERE `id`=29; -UPDATE `ai_playerbot_texts` SET `text_loc3`='Keine @#$@% Chance! Ich hab %item_link bekommen, Wahnsinn.' WHERE `id`=30; -UPDATE `ai_playerbot_texts` SET `text_loc3`='Keine @#$@% Chance! Das kann nicht sein - ich hab %item_link bekommen, völlig irre.' WHERE `id`=31; -UPDATE `ai_playerbot_texts` SET `text_loc3`='Im Ernst? Noch ein %item_link? Mein Glück ist kaputt.' WHERE `id`=32; -UPDATE `ai_playerbot_texts` SET `text_loc3`='Ich hab %item_link... ugh, schon wieder.' WHERE `id`=34; -UPDATE `ai_playerbot_texts` SET `text_loc3`='Keine Ahnung, warum ich %item_link überhaupt aufhebe, es ist nutzlos.' WHERE `id`=35; -UPDATE `ai_playerbot_texts` SET `text_loc3`='Schaut euch diesen glänzenden %item_link an... schade, ist trotzdem Müll.' WHERE `id`=36; -UPDATE `ai_playerbot_texts` SET `text_loc3`='Dieser %item_link ist nicht mal das Papier wert, auf dem er stehen würde.' WHERE `id`=37; -UPDATE `ai_playerbot_texts` SET `text_loc3`='Ich schätze, %item_link ist besser als gar nix? Gerade so.' WHERE `id`=38; -UPDATE `ai_playerbot_texts` SET `text_loc3`='Kein Plan, was ich mit %item_link machen soll, vielleicht verkauf ich es für 1 Silber.' WHERE `id`=39; -UPDATE `ai_playerbot_texts` SET `text_loc3`='Noch ein %item_link... naja, immerhin krieg ich was.' WHERE `id`=40; -UPDATE `ai_playerbot_texts` SET `text_loc3`='Hoffentlich ist %item_link was wert, es sieht nämlich furchtbar aus.' WHERE `id`=41; -UPDATE `ai_playerbot_texts` SET `text_loc3`='Warum krieg ich ständig %item_link... hab ich RNG verärgert?' WHERE `id`=43; -UPDATE `ai_playerbot_texts` SET `text_loc3`='Als würde %item_link mir nachlaufen. Ich will das nicht!' WHERE `id`=44; -UPDATE `ai_playerbot_texts` SET `text_loc3`='Da ist %item_link schon wieder. Was für eine Überraschung.' WHERE `id`=45; -UPDATE `ai_playerbot_texts` SET `text_loc3`='Ich schätze, %item_link taugt als Händler-Müll?' WHERE `id`=46; -UPDATE `ai_playerbot_texts` SET `text_loc3`='Neeeein, nicht schon wieder %item_link! RNG, bitte!' WHERE `id`=47; -UPDATE `ai_playerbot_texts` SET `text_loc3`='Naja, ganz nutzlos ist %item_link immerhin nicht, oder?' WHERE `id`=48; -UPDATE `ai_playerbot_texts` SET `text_loc3`='Noch ein %item_link? RNG, kümmert dich das überhaupt?' WHERE `id`=49; -UPDATE `ai_playerbot_texts` SET `text_loc3`='Vielleicht ist %item_link in 10 Jahren was wert.' WHERE `id`=50; -UPDATE `ai_playerbot_texts` SET `text_loc3`='Ich bewundere einfach mal, wie %item_link aussieht... und schmeiß es weg.' WHERE `id`=51; -UPDATE `ai_playerbot_texts` SET `text_loc3`='Wer braucht %item_link? Ich sicher nicht.' WHERE `id`=52; -UPDATE `ai_playerbot_texts` SET `text_loc3`='Vielleicht ist %item_link nützlich... haha, doch nur Müll.' WHERE `id`=53; -UPDATE `ai_playerbot_texts` SET `text_loc3`='Das Universum schenkt mir %item_link. Toll.' WHERE `id`=54; -UPDATE `ai_playerbot_texts` SET `text_loc3`='Gut, ich hab %item_link. Begeistert bin ich nicht.' WHERE `id`=55; -UPDATE `ai_playerbot_texts` SET `text_loc3`='Was soll ich überhaupt mit %item_link anfangen? Nicht mal verkaufbar.' WHERE `id`=56; -UPDATE `ai_playerbot_texts` SET `text_loc3`='Packen wir %item_link zu meinem wachsenden Enttäuschungsstapel.' WHERE `id`=57; -UPDATE `ai_playerbot_texts` SET `text_loc3`='Danke für %item_link... genau das, was ich nicht gebraucht hab.' WHERE `id`=58; -UPDATE `ai_playerbot_texts` SET `text_loc3`='Ich hab so viele %item_link gelootet, ich könnte damit einen Laden aufmachen.' WHERE `id`=60; -UPDATE `ai_playerbot_texts` SET `text_loc3`='Ein glänzender %item_link... kommt wohl auf den Müllhaufen.' WHERE `id`=61; -UPDATE `ai_playerbot_texts` SET `text_loc3`='Es ist %item_link, Leute. Nicht zu früh freuen.' WHERE `id`=62; -UPDATE `ai_playerbot_texts` SET `text_loc3`='Naja, wenigstens ist es %item_link... könnte schlimmer sein.' WHERE `id`=63; -UPDATE `ai_playerbot_texts` SET `text_loc3`='Lieber %item_link als gar nix.' WHERE `id`=64; -UPDATE `ai_playerbot_texts` SET `text_loc3`='Noch ein %item_link. Nicht das Schlimmste.' WHERE `id`=65; -UPDATE `ai_playerbot_texts` SET `text_loc3`='Hey, %item_link... ist schon okay, denk ich.' WHERE `id`=66; -UPDATE `ai_playerbot_texts` SET `text_loc3`='Hey, %item_link. Nicht schlecht, nicht gut, aber ich nehme es.' WHERE `id`=67; -UPDATE `ai_playerbot_texts` SET `text_loc3`='Könnte schlimmer sein... hab gerade %item_link gelootet.' WHERE `id`=68; -UPDATE `ai_playerbot_texts` SET `text_loc3`='%item_link wird für irgendwas nützlich sein, denke ich.' WHERE `id`=69; -UPDATE `ai_playerbot_texts` SET `text_loc3`='Neuer Tag, neuer %item_link. Kann mich nicht beschweren.' WHERE `id`=70; -UPDATE `ai_playerbot_texts` SET `text_loc3`='Naja, %item_link geht klar, würd ich sagen.' WHERE `id`=71; -UPDATE `ai_playerbot_texts` SET `text_loc3`='Gerade %item_link bekommen. Nicht das Beste, aber etwas.' WHERE `id`=72; -UPDATE `ai_playerbot_texts` SET `text_loc3`='%item_link ist gut genug, ich bin nicht sauer.' WHERE `id`=74; -UPDATE `ai_playerbot_texts` SET `text_loc3`='Kein Legendary, aber %item_link reicht.' WHERE `id`=75; -UPDATE `ai_playerbot_texts` SET `text_loc3`='Kein schlechter Drop... %item_link ist okay.' WHERE `id`=76; -UPDATE `ai_playerbot_texts` SET `text_loc3`='Lieber %item_link als gar nix.' WHERE `id`=77; -UPDATE `ai_playerbot_texts` SET `text_loc3`='Schon wieder %item_link. Besser als nix, denke ich.' WHERE `id`=79; -UPDATE `ai_playerbot_texts` SET `text_loc3`='%item_link schon wieder, hm? Nicht begeistert, aber ich überlebe.' WHERE `id`=80; -UPDATE `ai_playerbot_texts` SET `text_loc3`='Hätte schlimmer kommen können, %item_link ist gar nicht so schlecht.' WHERE `id`=82; -UPDATE `ai_playerbot_texts` SET `text_loc3`='Ich nehm %item_link, könnte schlimmer sein.' WHERE `id`=84; -UPDATE `ai_playerbot_texts` SET `text_loc3`='%item_link gelootet, nix Besonderes, aber okay.' WHERE `id`=85; -UPDATE `ai_playerbot_texts` SET `text_loc3`='Nicht das, was ich wollte, aber %item_link reicht fürs Erste.' WHERE `id`=86; -UPDATE `ai_playerbot_texts` SET `text_loc3`='Noch ein %item_link. Nicht der Wahnsinn, aber geht klar.' WHERE `id`=87; -UPDATE `ai_playerbot_texts` SET `text_loc3`='%item_link gelootet, könnte schlimmer sein.' WHERE `id`=88; -UPDATE `ai_playerbot_texts` SET `text_loc3`='Naja, %item_link ist besser als ein Stich ins Auge.' WHERE `id`=89; -UPDATE `ai_playerbot_texts` SET `text_loc3`='Ich nehm %item_link und zieh weiter.' WHERE `id`=90; -UPDATE `ai_playerbot_texts` SET `text_loc3`='Nice! Ein solider %item_link für die Sammlung.' WHERE `id`=91; -UPDATE `ai_playerbot_texts` SET `text_loc3`='Nicht schlecht, %item_link könnte nützlich werden.' WHERE `id`=93; -UPDATE `ai_playerbot_texts` SET `text_loc3`='Hab mir %item_link geholt, jetzt gehts los.' WHERE `id`=94; -UPDATE `ai_playerbot_texts` SET `text_loc3`='Dieser %item_link ist besser als die meisten, nehm ich.' WHERE `id`=95; -UPDATE `ai_playerbot_texts` SET `text_loc3`='Mit %item_link kann ich was Gutes anfangen.' WHERE `id`=96; -UPDATE `ai_playerbot_texts` SET `text_loc3`='Mit %item_link lässt sich vielleicht gut verdienen.' WHERE `id`=99; -UPDATE `ai_playerbot_texts` SET `text_loc3`='Ein solider %item_link, der Tag sieht gleich besser aus.' WHERE `id`=100; -UPDATE `ai_playerbot_texts` SET `text_loc3`='Hab %item_link nicht erwartet, aber ich nehm es.' WHERE `id`=101; -UPDATE `ai_playerbot_texts` SET `text_loc3`='Kein Plan, was ich mit %item_link machen soll aber ich freue mich drüber.' WHERE `id`=102; -UPDATE `ai_playerbot_texts` SET `text_loc3`='Nicht meine erste Wahl, aber %item_link nehm ich gern.' WHERE `id`=103; -UPDATE `ai_playerbot_texts` SET `text_loc3`='Genau das hab ich heute gebraucht: %item_link.' WHERE `id`=104; -UPDATE `ai_playerbot_texts` SET `text_loc3`='Noch ein %item_link. Nehm ich, keine Beschwerden.' WHERE `id`=106; -UPDATE `ai_playerbot_texts` SET `text_loc3`='Immerhin hat %item_link irgendeinen Nutzen. Nicht der schlimmste Loot.' WHERE `id`=107; -UPDATE `ai_playerbot_texts` SET `text_loc3`='%item_link ist vielleicht genau das, was ich heute brauche.' WHERE `id`=108; -UPDATE `ai_playerbot_texts` SET `text_loc3`='Ich hab gerade %quest_link angenommen' WHERE `id`=109; -UPDATE `ai_playerbot_texts` SET `text_loc3`='gerade %quest_link angenommen' WHERE `id`=110; -UPDATE `ai_playerbot_texts` SET `text_loc3`='%quest_link - versuch das mal abzuschließen' WHERE `id`=111; -UPDATE `ai_playerbot_texts` SET `text_loc3`='%quest_link in %zone_name angenommen' WHERE `id`=112; -UPDATE `ai_playerbot_texts` SET `text_loc3`='Gerade %quest_link abgeholt, Zeit ranzuklotzen!' WHERE `id`=113; -UPDATE `ai_playerbot_texts` SET `text_loc3`='%quest_link eingesackt, mal sehen, worum es geht.' WHERE `id`=114; -UPDATE `ai_playerbot_texts` SET `text_loc3`='%quest_link geschnappt, Los gehts!' WHERE `id`=115; -UPDATE `ai_playerbot_texts` SET `text_loc3`='Neue Quest, %quest_link. Los!' WHERE `id`=116; -UPDATE `ai_playerbot_texts` SET `text_loc3`='Sieht so aus, als wäre jetzt %quest_link dran, wünscht mir Glück.' WHERE `id`=117; -UPDATE `ai_playerbot_texts` SET `text_loc3`='%quest_link angenommen, mal sehen, wie hart die ist.' WHERE `id`=118; -UPDATE `ai_playerbot_texts` SET `text_loc3`='%quest_link mitgenommen, Zeit für Fortschritt.' WHERE `id`=119; -UPDATE `ai_playerbot_texts` SET `text_loc3`='Gerade %quest_link genommen. Mal sehen, wie schwer die ist.' WHERE `id`=120; -UPDATE `ai_playerbot_texts` SET `text_loc3`='%quest_link angenommen, hoffentlich kein Überraschungsboss am Ende.' WHERE `id`=121; -UPDATE `ai_playerbot_texts` SET `text_loc3`='Unterwegs, %quest_link abzuschließen. Auf gehts!' WHERE `id`=122; -UPDATE `ai_playerbot_texts` SET `text_loc3`='Dann mach ich jetzt wohl %quest_link. Hoffentlich lohnt sichs.' WHERE `id`=123; -UPDATE `ai_playerbot_texts` SET `text_loc3`='%quest_link eingesackt. Weiter gehts!' WHERE `id`=124; -UPDATE `ai_playerbot_texts` SET `text_loc3`='Hab gerade %quest_link angenommen. Sollte Kinderkram sein.' WHERE `id`=125; -UPDATE `ai_playerbot_texts` SET `text_loc3`='%quest_link angenommen, jetzt rock ich das.' WHERE `id`=126; -UPDATE `ai_playerbot_texts` SET `text_loc3`='%quest_link in %zone_name angenommen. Los gehts!' WHERE `id`=127; -UPDATE `ai_playerbot_texts` SET `text_loc3`='Auf dem Weg, %quest_link zu beenden. Machen wirs schnell!' WHERE `id`=128; -UPDATE `ai_playerbot_texts` SET `text_loc3`='%quest_link angenommen. Mal sehen, was in %zone_name auf mich wartet.' WHERE `id`=129; -UPDATE `ai_playerbot_texts` SET `text_loc3`='%quest_link bekommen, hoffentlich dauert das nicht ewig.' WHERE `id`=130; -UPDATE `ai_playerbot_texts` SET `text_loc3`='%quest_link geschnappt. Schon wieder von vorn.' WHERE `id`=131; -UPDATE `ai_playerbot_texts` SET `text_loc3`='Es sieht so aus, als ob %quest_link als nächstes dran ist.' WHERE `id`=132; -UPDATE `ai_playerbot_texts` SET `text_loc3`='Unterwegs, %quest_link abzuschließen. Hoffe, die macht Spaß.' WHERE `id`=133; -UPDATE `ai_playerbot_texts` SET `text_loc3`='Gerade %quest_link genommen. Zeit nachzuschauen, was mich erwartet.' WHERE `id`=136; -UPDATE `ai_playerbot_texts` SET `text_loc3`='Nochmal %quest_link. Ziehen wirs schnell durch!' WHERE `id`=137; -UPDATE `ai_playerbot_texts` SET `text_loc3`='Ich hab gerade %quest_link genommen. Das wird spaßig!' WHERE `id`=138; -UPDATE `ai_playerbot_texts` SET `text_loc3`='%quest_link in %zone_name angenommen. Los!' WHERE `id`=139; -UPDATE `ai_playerbot_texts` SET `text_loc3`='%quest_link geschnappt. Kann es kaum erwarten, was als Nächstes kommt.' WHERE `id`=140; -UPDATE `ai_playerbot_texts` SET `text_loc3`='%quest_link genommen. Abtauchen und durchziehen.' WHERE `id`=141; -UPDATE `ai_playerbot_texts` SET `text_loc3`='Alles klar, %quest_link ist aktiv. An die Arbeit!' WHERE `id`=142; -UPDATE `ai_playerbot_texts` SET `text_loc3`='Weiter zu %quest_link. Hoffentlich nicht zu hart.' WHERE `id`=143; -UPDATE `ai_playerbot_texts` SET `text_loc3`='Gerade %quest_link geschnappt. Sollte easy sein!' WHERE `id`=144; -UPDATE `ai_playerbot_texts` SET `text_loc3`='Ich hab %quest_link angenommen. Machen wirs fix!' WHERE `id`=145; -UPDATE `ai_playerbot_texts` SET `text_loc3`='%quest_link genommen, mal schauen, worum es geht.' WHERE `id`=146; -UPDATE `ai_playerbot_texts` SET `text_loc3`='Gerade %quest_link angenommen, weiter gehts!' WHERE `id`=147; -UPDATE `ai_playerbot_texts` SET `text_loc3`='Endlich fertig mit %quest_obj_name für %quest_link' WHERE `id`=148; -UPDATE `ai_playerbot_texts` SET `text_loc3`='endlich %quest_obj_available/%quest_obj_required von %quest_obj_name für %quest_link bekommen' WHERE `id`=149; -UPDATE `ai_playerbot_texts` SET `text_loc3`='%quest_obj_full_formatted für %quest_link, endlich' WHERE `id`=150; -UPDATE `ai_playerbot_texts` SET `text_loc3`='Uff, %quest_obj_available/%quest_obj_required %quest_obj_name für %quest_link bekommen' WHERE `id`=151; -UPDATE `ai_playerbot_texts` SET `text_loc3`='brauche noch %quest_obj_missing von %quest_obj_name für %quest_link' WHERE `id`=152; -UPDATE `ai_playerbot_texts` SET `text_loc3`='%quest_obj_full_formatted, arbeite noch an %quest_link' WHERE `id`=153; -UPDATE `ai_playerbot_texts` SET `text_loc3`='%quest_obj_name für %quest_link fertig, was für ein Grind!' WHERE `id`=154; -UPDATE `ai_playerbot_texts` SET `text_loc3`='Kurz vor Abschluss von %quest_obj_name für %quest_link, fehlen nur noch %quest_obj_missing.' WHERE `id`=155; -UPDATE `ai_playerbot_texts` SET `text_loc3`='%quest_obj_name fast durch, brauche nur noch %quest_obj_missing für %quest_link.' WHERE `id`=156; -UPDATE `ai_playerbot_texts` SET `text_loc3`='Endlich %quest_obj_name für %quest_link fertig! Das hat gedauert!' WHERE `id`=158; -UPDATE `ai_playerbot_texts` SET `text_loc3`='Läuft, hab %quest_obj_available/%quest_obj_required von %quest_obj_name für %quest_link.' WHERE `id`=159; -UPDATE `ai_playerbot_texts` SET `text_loc3`='Yes! %quest_obj_name für %quest_link abgeschlossen. Weiter gehts!' WHERE `id`=160; -UPDATE `ai_playerbot_texts` SET `text_loc3`='Fortschritt bei %quest_obj_name, %quest_obj_available/%quest_obj_required erledigt für %quest_link.' WHERE `id`=161; -UPDATE `ai_playerbot_texts` SET `text_loc3`='%quest_obj_full_formatted... fast geschafft für %quest_link!' WHERE `id`=162; -UPDATE `ai_playerbot_texts` SET `text_loc3`='Brauche nur noch %quest_obj_missing %quest_obj_name für %quest_link, fast fertig!' WHERE `id`=163; -UPDATE `ai_playerbot_texts` SET `text_loc3`='Endlich %quest_obj_name für %quest_link geschafft, was für eine Erleichterung!' WHERE `id`=164; -UPDATE `ai_playerbot_texts` SET `text_loc3`='Hab %quest_obj_available/%quest_obj_required von %quest_obj_name für %quest_link, geht voran!' WHERE `id`=165; -UPDATE `ai_playerbot_texts` SET `text_loc3`='%quest_obj_name für %quest_link ist komplett! Weiter zur nächsten Aufgabe.' WHERE `id`=166; -UPDATE `ai_playerbot_texts` SET `text_loc3`='100% von %quest_obj_name für %quest_link erledigt, ab zu den Belohnungen!' WHERE `id`=167; -UPDATE `ai_playerbot_texts` SET `text_loc3`='Es fehlen noch %quest_obj_missing von %quest_obj_name für %quest_link, fast fertig!' WHERE `id`=168; -UPDATE `ai_playerbot_texts` SET `text_loc3`='Arbeite an %quest_obj_name für %quest_link, aktuell %quest_obj_available/%quest_obj_required erledigt.' WHERE `id`=169; -UPDATE `ai_playerbot_texts` SET `text_loc3`='%quest_obj_full_formatted für %quest_link. Das war ein langer Brocken!' WHERE `id`=170; -UPDATE `ai_playerbot_texts` SET `text_loc3`='Brauche nur noch ein paar %quest_obj_name für %quest_link, dann bin ich durch!' WHERE `id`=171; -UPDATE `ai_playerbot_texts` SET `text_loc3`='Noch ein Ziel erledigt! %quest_obj_full_formatted für %quest_link' WHERE `id`=172; -UPDATE `ai_playerbot_texts` SET `text_loc3`='Grinde weiter %quest_obj_name für %quest_link, mit %quest_obj_available/%quest_obj_required fast da.' WHERE `id`=173; -UPDATE `ai_playerbot_texts` SET `text_loc3`='Ziel erledigt! %quest_obj_full_formatted für %quest_link. Weiter zum nächsten!' WHERE `id`=174; -UPDATE `ai_playerbot_texts` SET `text_loc3`='Endlich fertig mit %item_link für %quest_link' WHERE `id`=175; -UPDATE `ai_playerbot_texts` SET `text_loc3`='endlich %quest_obj_available/%quest_obj_required von %item_link für %quest_link bekommen' WHERE `id`=176; -UPDATE `ai_playerbot_texts` SET `text_loc3`='%quest_obj_full_formatted für %quest_link, endlich' WHERE `id`=177; -UPDATE `ai_playerbot_texts` SET `text_loc3`='Uff, %quest_obj_available/%quest_obj_required %item_link für %quest_link bekommen' WHERE `id`=178; -UPDATE `ai_playerbot_texts` SET `text_loc3`='brauche noch %quest_obj_missing %item_link für %quest_link' WHERE `id`=179; -UPDATE `ai_playerbot_texts` SET `text_loc3`='%quest_obj_full_formatted, arbeite noch an %quest_link' WHERE `id`=180; -UPDATE `ai_playerbot_texts` SET `text_loc3`='Es geht voran! %quest_obj_available/%quest_obj_required %item_link für %quest_link.' WHERE `id`=182; -UPDATE `ai_playerbot_texts` SET `text_loc3`='%quest_obj_name ist zur Hälfte durch, brauche noch %quest_obj_missing %item_link für %quest_link.' WHERE `id`=183; -UPDATE `ai_playerbot_texts` SET `text_loc3`='Es fehlen noch %quest_obj_missing von %item_link für %quest_link, aber ich komme näher!' WHERE `id`=184; -UPDATE `ai_playerbot_texts` SET `text_loc3`='Endlich %item_link für %quest_link fertig, weiter mit der nächsten Aufgabe!' WHERE `id`=185; -UPDATE `ai_playerbot_texts` SET `text_loc3`='Fast da! %quest_obj_available/%quest_obj_required %item_link für %quest_link geholt.' WHERE `id`=186; -UPDATE `ai_playerbot_texts` SET `text_loc3`='Yes! %item_link für %quest_link abgeschlossen. Weiter zum nächsten Ziel.' WHERE `id`=187; -UPDATE `ai_playerbot_texts` SET `text_loc3`='Guter Fortschritt bei %item_link für %quest_link, brauche noch %quest_obj_missing.' WHERE `id`=189; -UPDATE `ai_playerbot_texts` SET `text_loc3`='100% von %item_link für %quest_link erledigt! Weiter gehts.' WHERE `id`=190; -UPDATE `ai_playerbot_texts` SET `text_loc3`='Hab %quest_obj_available/%quest_obj_required %item_link für %quest_link. Das Ziel ist in Sicht!' WHERE `id`=191; -UPDATE `ai_playerbot_texts` SET `text_loc3`='Geschafft, %item_link für %quest_link komplett. Was für eine Erleichterung!' WHERE `id`=192; -UPDATE `ai_playerbot_texts` SET `text_loc3`='Arbeite hart an %item_link für %quest_link, brauche noch %quest_obj_missing.' WHERE `id`=193; -UPDATE `ai_playerbot_texts` SET `text_loc3`='Fast fertig mit %item_link für %quest_link, es fehlen nur noch %quest_obj_missing.' WHERE `id`=194; -UPDATE `ai_playerbot_texts` SET `text_loc3`='%item_link für %quest_link abgeschlossen, der Grind ist real!' WHERE `id`=195; -UPDATE `ai_playerbot_texts` SET `text_loc3`='Arbeite weiter an %item_link für %quest_link, bisher %quest_obj_available/%quest_obj_required erledigt.' WHERE `id`=196; -UPDATE `ai_playerbot_texts` SET `text_loc3`='%item_link für %quest_link kommt der Fertigstellung näher, %quest_obj_available/%quest_obj_required erledigt.' WHERE `id`=197; -UPDATE `ai_playerbot_texts` SET `text_loc3`='Yes! %item_link für %quest_link fertig! Das hat etwas länger gedauert.' WHERE `id`=198; -UPDATE `ai_playerbot_texts` SET `text_loc3`='Ich habe %quest_obj_available/%quest_obj_required %item_link für %quest_link, läuft!' WHERE `id`=199; -UPDATE `ai_playerbot_texts` SET `text_loc3`='Durch mit %item_link für %quest_link. Weiter zum nächsten!' WHERE `id`=200; -UPDATE `ai_playerbot_texts` SET `text_loc3`='Noch eins abgehakt! %item_link für %quest_link ist durch!' WHERE `id`=201; -UPDATE `ai_playerbot_texts` SET `text_loc3`='Grinde weiter %item_link für %quest_link, habe %quest_obj_available/%quest_obj_required geschafft.' WHERE `id`=202; -UPDATE `ai_playerbot_texts` SET `text_loc3`='Bin fast durch! Brauche noch %quest_obj_missing %item_link für %quest_link.' WHERE `id`=203; -UPDATE `ai_playerbot_texts` SET `text_loc3`='Nicht rechtzeitig %quest_link geschafft...' WHERE `id`=204; -UPDATE `ai_playerbot_texts` SET `text_loc3`='Zeit für %quest_link abgelaufen :(' WHERE `id`=205; -UPDATE `ai_playerbot_texts` SET `text_loc3`='Alle Ziele für %quest_link abgeschlossen' WHERE `id`=206; -UPDATE `ai_playerbot_texts` SET `text_loc3`='Alle Ziele für %quest_link erledigt' WHERE `id`=207; -UPDATE `ai_playerbot_texts` SET `text_loc3`='Ich gebe %quest_link gleich ab, habe gerade alle Ziele erledigt' WHERE `id`=208; -UPDATE `ai_playerbot_texts` SET `text_loc3`='Jaaa, endlich %quest_link abgegeben' WHERE `id`=209; -UPDATE `ai_playerbot_texts` SET `text_loc3`='hab %quest_link abgegeben' WHERE `id`=210; -UPDATE `ai_playerbot_texts` SET `text_loc3`='Hab %quest_link geschafft, gerade abgegeben' WHERE `id`=211; -UPDATE `ai_playerbot_texts` SET `text_loc3`='gerade %quest_link abgegeben' WHERE `id`=212; -UPDATE `ai_playerbot_texts` SET `text_loc3`='gerade %quest_link in %zone_name abgegeben' WHERE `id`=213; -UPDATE `ai_playerbot_texts` SET `text_loc3`='Noch eine Quest abgeschlossen! %quest_link abgegeben' WHERE `id`=214; -UPDATE `ai_playerbot_texts` SET `text_loc3`='Mission erfüllt! %quest_link ist abgegeben' WHERE `id`=215; -UPDATE `ai_playerbot_texts` SET `text_loc3`='Endlich, %quest_link abgegeben! Was für ein Ritt!' WHERE `id`=216; -UPDATE `ai_playerbot_texts` SET `text_loc3`='Grade %quest_link abgeschlossen und abgegeben, fühlt sich gut an!' WHERE `id`=217; -UPDATE `ai_playerbot_texts` SET `text_loc3`='%quest_link in %zone_name abgegeben. Weiter zur nächsten Herausforderung!' WHERE `id`=218; -UPDATE `ai_playerbot_texts` SET `text_loc3`='Hab %quest_link abgegeben. Wieder eine weniger!' WHERE `id`=219; -UPDATE `ai_playerbot_texts` SET `text_loc3`='%quest_link erfolgreich abgegeben, das hat gedauert!' WHERE `id`=220; -UPDATE `ai_playerbot_texts` SET `text_loc3`='%quest_link in %zone_name abgeschlossen und abgegeben. Fühlt sich gut an!' WHERE `id`=221; -UPDATE `ai_playerbot_texts` SET `text_loc3`='Quest fertig! %quest_link abgegeben und bereit für die nächste!' WHERE `id`=222; -UPDATE `ai_playerbot_texts` SET `text_loc3`='Endlich %quest_link in %zone_name abgegeben. Die war knackig!' WHERE `id`=223; -UPDATE `ai_playerbot_texts` SET `text_loc3`='Das wars, %quest_link abgegeben! Jetzt Belohnung einsacken!' WHERE `id`=224; -UPDATE `ai_playerbot_texts` SET `text_loc3`='%quest_link fertig! Jetzt abgeben und weiter.' WHERE `id`=225; -UPDATE `ai_playerbot_texts` SET `text_loc3`='%quest_link eben abgeschlossen und abgegeben. Weiter gehts!' WHERE `id`=228; -UPDATE `ai_playerbot_texts` SET `text_loc3`='Wieder eine im Kasten, %quest_link abgegeben' WHERE `id`=229; -UPDATE `ai_playerbot_texts` SET `text_loc3`='%quest_link abgegeben! Zeit, die Belohnung abzuholen.' WHERE `id`=230; -UPDATE `ai_playerbot_texts` SET `text_loc3`='Das ging fix! %quest_link schon abgegeben!' WHERE `id`=232; -UPDATE `ai_playerbot_texts` SET `text_loc3`='Gerade %quest_link in %zone_name abgegeben. Bereit fürs nächste Abenteuer!' WHERE `id`=233; -UPDATE `ai_playerbot_texts` SET `text_loc3`='Mission komplett! %quest_link ist abgegeben!' WHERE `id`=235; -UPDATE `ai_playerbot_texts` SET `text_loc3`='Hab gerade %quest_link beendet und abgegeben, weiter zur nächsten!' WHERE `id`=236; -UPDATE `ai_playerbot_texts` SET `text_loc3`='wieder %victim_name gelegt' WHERE `id`=237; -UPDATE `ai_playerbot_texts` SET `text_loc3`='Ich leg ständig %victim_name um, nix Besonderes' WHERE `id`=238; -UPDATE `ai_playerbot_texts` SET `text_loc3`='noch ein %victim_name beißt ins Gras' WHERE `id`=239; -UPDATE `ai_playerbot_texts` SET `text_loc3`='ein %victim_name weniger in %zone_name' WHERE `id`=240; -UPDATE `ai_playerbot_texts` SET `text_loc3`='Hab diesen Elite-Bastard %victim_name umgehauen!' WHERE `id`=241; -UPDATE `ai_playerbot_texts` SET `text_loc3`='Elite %victim_name in %zone_name gekillt' WHERE `id`=242; -UPDATE `ai_playerbot_texts` SET `text_loc3`='Puh, %victim_name doch noch gelegt!' WHERE `id`=243; -UPDATE `ai_playerbot_texts` SET `text_loc3`='Gefällt dir das %victim_name?! Willst du, dass ich drei Wochen zurückspule, als du noch gelebt hast?!' WHERE `id`=244; -UPDATE `ai_playerbot_texts` SET `text_loc3`='Yo, hab gerade %victim_name gekillt!' WHERE `id`=245; -UPDATE `ai_playerbot_texts` SET `text_loc3`='Rare %victim_name in %zone_name gekillt' WHERE `id`=246; -UPDATE `ai_playerbot_texts` SET `text_loc3`='WTF hab ich da gerade umgehauen? %victim_name' WHERE `id`=247; -UPDATE `ai_playerbot_texts` SET `text_loc3`='Gerade das Pet %victim_name gekillt' WHERE `id`=248; -UPDATE `ai_playerbot_texts` SET `text_loc3`='Oh ja, hab gerade %victim_name gekillt' WHERE `id`=249; -UPDATE `ai_playerbot_texts` SET `text_loc3`='%victim_name in %zone_name gekillt' WHERE `id`=250; -UPDATE `ai_playerbot_texts` SET `text_loc3`='Wieder %victim_name erlegt' WHERE `id`=251; -UPDATE `ai_playerbot_texts` SET `text_loc3`='Ich leg ständig %victim_name um, nix Besonderes' WHERE `id`=252; -UPDATE `ai_playerbot_texts` SET `text_loc3`='noch ein %victim_name beißt ins Gras' WHERE `id`=253; -UPDATE `ai_playerbot_texts` SET `text_loc3`='ein %victim_name weniger in %zone_name' WHERE `id`=254; -UPDATE `ai_playerbot_texts` SET `text_loc3`='%victim_name so nebenbei umgehauen' WHERE `id`=255; -UPDATE `ai_playerbot_texts` SET `text_loc3`='%victim_name hatte keine Chance' WHERE `id`=256; -UPDATE `ai_playerbot_texts` SET `text_loc3`='Schon wieder %victim_name aus dem Weg geräumt' WHERE `id`=257; -UPDATE `ai_playerbot_texts` SET `text_loc3`='%victim_name war zu easy, weiter gehts' WHERE `id`=258; -UPDATE `ai_playerbot_texts` SET `text_loc3`='Und wieder %victim_name plattgemacht. Kinderkram' WHERE `id`=259; -UPDATE `ai_playerbot_texts` SET `text_loc3`='%victim_name war gar nicht so tough' WHERE `id`=260; -UPDATE `ai_playerbot_texts` SET `text_loc3`='%victim_name liegt, nix Besonderes' WHERE `id`=261; -UPDATE `ai_playerbot_texts` SET `text_loc3`='Das war zu easy, %victim_name liegt' WHERE `id`=262; -UPDATE `ai_playerbot_texts` SET `text_loc3`='%victim_name ist so schnell umgekippt, einmal blinzeln und vorbei' WHERE `id`=263; -UPDATE `ai_playerbot_texts` SET `text_loc3`='Diesen Elite %victim_name umgehauen!' WHERE `id`=264; -UPDATE `ai_playerbot_texts` SET `text_loc3`='Elite %victim_name existiert nicht mehr' WHERE `id`=265; -UPDATE `ai_playerbot_texts` SET `text_loc3`='Den Elite %victim_name weggemacht wie ein Boss' WHERE `id`=266; -UPDATE `ai_playerbot_texts` SET `text_loc3`='Elite-Mob %victim_name, hat keine Chance gegen mich!' WHERE `id`=267; -UPDATE `ai_playerbot_texts` SET `text_loc3`='Endlich den mächtigen %victim_name gelegt' WHERE `id`=268; -UPDATE `ai_playerbot_texts` SET `text_loc3`='Elite %victim_name in %zone_name gekillt' WHERE `id`=269; -UPDATE `ai_playerbot_texts` SET `text_loc3`='Hab gerade Elite %victim_name in %zone_name erwischt' WHERE `id`=270; -UPDATE `ai_playerbot_texts` SET `text_loc3`='Elite %victim_name gekillt. Viel zu easy' WHERE `id`=271; -UPDATE `ai_playerbot_texts` SET `text_loc3`='%victim_name in %zone_name umgehauen, was ein Kampf' WHERE `id`=272; -UPDATE `ai_playerbot_texts` SET `text_loc3`='Elite %victim_name gekillt. Ich scheine unaufhaltbar zu sein' WHERE `id`=273; -UPDATE `ai_playerbot_texts` SET `text_loc3`='Puh, %victim_name doch noch gelegt!' WHERE `id`=274; -UPDATE `ai_playerbot_texts` SET `text_loc3`='Seltener Elite %victim_name liegt' WHERE `id`=275; -UPDATE `ai_playerbot_texts` SET `text_loc3`='%victim_name gibt es nicht mehr. Noch ein seltener Elite gelegt' WHERE `id`=276; -UPDATE `ai_playerbot_texts` SET `text_loc3`='Seltener Elite %victim_name down. Ich bin aus Feuer!' WHERE `id`=277; -UPDATE `ai_playerbot_texts` SET `text_loc3`='Hab gerade den seltenen Elite %victim_name gekillt' WHERE `id`=278; -UPDATE `ai_playerbot_texts` SET `text_loc3`='Das war geil! %victim_name gerade gekillt! Was ein Kampf' WHERE `id`=279; -UPDATE `ai_playerbot_texts` SET `text_loc3`='Weltenboss %victim_name ist down! Das war episch' WHERE `id`=280; -UPDATE `ai_playerbot_texts` SET `text_loc3`='Hab den Weltenboss %victim_name gelegt. Zeit zum Feiern!' WHERE `id`=281; -UPDATE `ai_playerbot_texts` SET `text_loc3`='%victim_name gekillt! Der Weltenboss war kein Spaß!' WHERE `id`=282; -UPDATE `ai_playerbot_texts` SET `text_loc3`='Gerade %victim_name gekillt, das war legendär' WHERE `id`=283; -UPDATE `ai_playerbot_texts` SET `text_loc3`='Yo, hab gerade %victim_name gekillt!' WHERE `id`=284; -UPDATE `ai_playerbot_texts` SET `text_loc3`='Seltener %victim_name down. War ein geiler Fight' WHERE `id`=285; -UPDATE `ai_playerbot_texts` SET `text_loc3`='Hab gerade den seltenen %victim_name gekillt' WHERE `id`=286; -UPDATE `ai_playerbot_texts` SET `text_loc3`='Seltener %victim_name in %zone_name besiegt' WHERE `id`=287; -UPDATE `ai_playerbot_texts` SET `text_loc3`='Gerade seltenen %victim_name in %zone_name gekillt. Das ging fix!' WHERE `id`=288; -UPDATE `ai_playerbot_texts` SET `text_loc3`='Seltenen %victim_name in %zone_name gekillt' WHERE `id`=289; -UPDATE `ai_playerbot_texts` SET `text_loc3`='Den seltenen %victim_name in %zone_name erwischt' WHERE `id`=290; -UPDATE `ai_playerbot_texts` SET `text_loc3`='Hab %victim_name in %zone_name gekillt. Das tat gut' WHERE `id`=291; -UPDATE `ai_playerbot_texts` SET `text_loc3`='%victim_name in %zone_name umgehauen. Keine Chance gehabt' WHERE `id`=292; -UPDATE `ai_playerbot_texts` SET `text_loc3`='Gerade %victim_name in %zone_name gekillt, easy' WHERE `id`=293; -UPDATE `ai_playerbot_texts` SET `text_loc3`='Was hab ich da gerade gekillt? %victim_name' WHERE `id`=294; -UPDATE `ai_playerbot_texts` SET `text_loc3`='Was ist das für ein %victim_name? Sowas hab ich noch nie gesehen' WHERE `id`=295; -UPDATE `ai_playerbot_texts` SET `text_loc3`='Hab gerade was Seltsames gekillt, %victim_name' WHERE `id`=296; -UPDATE `ai_playerbot_texts` SET `text_loc3`='%victim_name war seltsam, aber liegt trotzdem' WHERE `id`=297; -UPDATE `ai_playerbot_texts` SET `text_loc3`='Gerade %victim_name besiegt' WHERE `id`=298; -UPDATE `ai_playerbot_texts` SET `text_loc3`='Machs gut, %victim_name. Warst nur ein Pet' WHERE `id`=299; -UPDATE `ai_playerbot_texts` SET `text_loc3`='Hab gerade das Pet %victim_name umgehauen. Das kam unerwartet.' WHERE `id`=300; -UPDATE `ai_playerbot_texts` SET `text_loc3`='%victim_name liegt. Vielleicht nächstes Mal, Pet' WHERE `id`=301; -UPDATE `ai_playerbot_texts` SET `text_loc3`='Ding! %my_level' WHERE `id`=302; -UPDATE `ai_playerbot_texts` SET `text_loc3`='Jaaa, ich bin Level %my_level!' WHERE `id`=303; -UPDATE `ai_playerbot_texts` SET `text_loc3`='Gerade aufgelevelt' WHERE `id`=304; -UPDATE `ai_playerbot_texts` SET `text_loc3`='Stufe %my_level!!! Jetzt kann ich Endgame-Content machen' WHERE `id`=309; -UPDATE `ai_playerbot_texts` SET `text_loc3`='Frisch auf Level %my_level, %my_class!!!' WHERE `id`=310; -UPDATE `ai_playerbot_texts` SET `text_loc3`='Noch ein Level: %my_level, %my_race %my_class!' WHERE `id`=311; -UPDATE `ai_playerbot_texts` SET `text_loc3`='Ding! Wieder ein Level up!' WHERE `id`=312; -UPDATE `ai_playerbot_texts` SET `text_loc3`='Jetzt offiziell Level %my_level!' WHERE `id`=313; -UPDATE `ai_playerbot_texts` SET `text_loc3`='Level %my_level, fühl mich jetzt schon stärker!' WHERE `id`=314; -UPDATE `ai_playerbot_texts` SET `text_loc3`='Aufwärts! Level %my_level erreicht' WHERE `id`=315; -UPDATE `ai_playerbot_texts` SET `text_loc3`='Das ging fix, schon Level %my_level!' WHERE `id`=316; -UPDATE `ai_playerbot_texts` SET `text_loc3`='Gerade Level %my_level erreicht, auf gehts!' WHERE `id`=317; -UPDATE `ai_playerbot_texts` SET `text_loc3`='Level %my_level, jetzt kommen die großen Sachen!' WHERE `id`=318; -UPDATE `ai_playerbot_texts` SET `text_loc3`='Level %my_level, ich bin jetzt on fire!' WHERE `id`=319; -UPDATE `ai_playerbot_texts` SET `text_loc3`='Level %my_level voll und weiter!' WHERE `id`=320; -UPDATE `ai_playerbot_texts` SET `text_loc3`='Bin jetzt Level %my_level, was kommt als Nächstes?' WHERE `id`=321; -UPDATE `ai_playerbot_texts` SET `text_loc3`='Level %my_level!!! Es passiert!' WHERE `id`=322; -UPDATE `ai_playerbot_texts` SET `text_loc3`='Gerade Level %my_level erreicht, fühlt sich mega an!' WHERE `id`=323; -UPDATE `ai_playerbot_texts` SET `text_loc3`='Level %my_level und ich fange erst an!' WHERE `id`=324; -UPDATE `ai_playerbot_texts` SET `text_loc3`='Wow, schon Level %my_level, unaufhaltbar!' WHERE `id`=325; -UPDATE `ai_playerbot_texts` SET `text_loc3`='Neue Höhen mit Level %my_level!!!' WHERE `id`=326; -UPDATE `ai_playerbot_texts` SET `text_loc3`='Level %my_level und weiter Vollgas!' WHERE `id`=327; -UPDATE `ai_playerbot_texts` SET `text_loc3`='Level %my_level erreicht, fühlt sich so gut an!' WHERE `id`=329; -UPDATE `ai_playerbot_texts` SET `text_loc3`='Bin jetzt Level %my_level! Los gehts!' WHERE `id`=330; -UPDATE `ai_playerbot_texts` SET `text_loc3`='Level %my_level, noch viel vor mir!' WHERE `id`=331; -UPDATE `ai_playerbot_texts` SET `text_loc3`='Endlich Level %my_level erreicht, ich kann alles!' WHERE `id`=332; -UPDATE `ai_playerbot_texts` SET `text_loc3`='Maxlevel %my_level, Endgame ich komme!' WHERE `id`=333; -UPDATE `ai_playerbot_texts` SET `text_loc3`='Endgame freigeschaltet auf Level %my_level, her damit!' WHERE `id`=335; -UPDATE `ai_playerbot_texts` SET `text_loc3`='Hab Level %my_level erreicht, Zeit zu glänzen!' WHERE `id`=336; -UPDATE `ai_playerbot_texts` SET `text_loc3`='Level %my_level, lasst uns Endgame-Raids machen!' WHERE `id`=337; -UPDATE `ai_playerbot_texts` SET `text_loc3`='Mit Level %my_level hält mich nix mehr auf!' WHERE `id`=338; -UPDATE `ai_playerbot_texts` SET `text_loc3`='Level %my_level, bereit für High-Level-Content!' WHERE `id`=339; -UPDATE `ai_playerbot_texts` SET `text_loc3`='Yes! Level %my_level, %my_class für alles bereit!' WHERE `id`=340; -UPDATE `ai_playerbot_texts` SET `text_loc3`='Level %my_level, Zeit die Welt herauszufordern!' WHERE `id`=341; -UPDATE `ai_playerbot_texts` SET `text_loc3`='Level %my_level erreicht, schnappen wir uns die Elitebosse!' WHERE `id`=342; -UPDATE `ai_playerbot_texts` SET `text_loc3`='Jetzt bin ich Level %my_level, das echte Abenteuer beginnt!' WHERE `id`=343; -UPDATE `ai_playerbot_texts` SET `text_loc3`='Level %my_level! Zeit für ernsthafte Action!' WHERE `id`=344; -UPDATE `ai_playerbot_texts` SET `text_loc3`='Endlich auf Level %my_level! Jetzt zeige ich, was ich kann!' WHERE `id`=346; -UPDATE `ai_playerbot_texts` SET `text_loc3`='Level %my_level ist da! Bereit für die große Liga!' WHERE `id`=347; -UPDATE `ai_playerbot_texts` SET `text_loc3`='Gerade Level %my_level erreicht, macht euch bereit für echte Herausforderungen!' WHERE `id`=348; -UPDATE `ai_playerbot_texts` SET `text_loc3`='Level %my_level voll, Zeit für epischen Content!' WHERE `id`=349; -UPDATE `ai_playerbot_texts` SET `text_loc3`='Frisch auf Level %my_level! Bereit für Endgame-Inis!' WHERE `id`=350; -UPDATE `ai_playerbot_texts` SET `text_loc3`='Jetzt, wo ich Level %my_level bin, ist nichts mehr außerhalb meiner Reichweite!' WHERE `id`=351; -UPDATE `ai_playerbot_texts` SET `text_loc3`='Jetzt ist es offiziell! Level %my_level, Zeit zu dominieren!' WHERE `id`=352; -UPDATE `ai_playerbot_texts` SET `text_loc3`='Level %my_level geschafft! Zeit, der Welt meinen Stempel aufzudrücken!' WHERE `id`=353; -UPDATE `ai_playerbot_texts` SET `text_loc3`='Level %my_level freigeschaltet! Jetzt beginnt der echte Spaß!' WHERE `id`=354; -UPDATE `ai_playerbot_texts` SET `text_loc3`='Level %my_level, und die Welt ist mein Spielplatz!' WHERE `id`=355; -UPDATE `ai_playerbot_texts` SET `text_loc3`='Level %my_level, bereit, der Welt meine Power zu zeigen!' WHERE `id`=356; -UPDATE `ai_playerbot_texts` SET `text_loc3`='Gerade %my_level erreicht, jetzt geh ich all in!' WHERE `id`=357; -UPDATE `ai_playerbot_texts` SET `text_loc3`='Level %my_level, endlich kann ich alles angehen!' WHERE `id`=358; -UPDATE `ai_playerbot_texts` SET `text_loc3`='Level %my_level, fühl mich unaufhaltbar!' WHERE `id`=359; -UPDATE `ai_playerbot_texts` SET `text_loc3`='Gerade Level %my_level erreicht, kanns kaum erwarten ins Endgame zu springen!' WHERE `id`=360; -UPDATE `ai_playerbot_texts` SET `text_loc3`='Gute Arbeit, %other_name. Das hast du dir verdient.' WHERE `id`=361; -UPDATE `ai_playerbot_texts` SET `text_loc3`='Das war mies, %other_name. Ich mags nicht, aber...' WHERE `id`=362; -UPDATE `ai_playerbot_texts` SET `text_loc3`='Glückwunsch, %other_name, du hast den Aufstieg verdient!' WHERE `id`=363; -UPDATE `ai_playerbot_texts` SET `text_loc3`='Verdient, %other_name - willkommen im nächsten Level!' WHERE `id`=364; -UPDATE `ai_playerbot_texts` SET `text_loc3`='Beförderungszeit! %other_name, die hast du dir verdient!' WHERE `id`=366; -UPDATE `ai_playerbot_texts` SET `text_loc3`='Neue Rolle für %other_name! Gut gemacht, weiter so!' WHERE `id`=367; -UPDATE `ai_playerbot_texts` SET `text_loc3`='Dickes Gratz an %other_name, wohlverdiente Beförderung!' WHERE `id`=368; -UPDATE `ai_playerbot_texts` SET `text_loc3`='Applaus für %other_name zur Beförderung!' WHERE `id`=369; -UPDATE `ai_playerbot_texts` SET `text_loc3`='Gratulation an %other_name zur Beförderung! Weiter so!' WHERE `id`=370; -UPDATE `ai_playerbot_texts` SET `text_loc3`='Gratz, %other_name, du steigst auf! Gut gemacht!' WHERE `id`=371; -UPDATE `ai_playerbot_texts` SET `text_loc3`='Noch ein Schritt nach oben für %other_name! Glückwunsch!' WHERE `id`=372; -UPDATE `ai_playerbot_texts` SET `text_loc3`='Harte Entscheidung, aber %other_name, du wurdest degradiert. Zeit, dich zu beweisen!' WHERE `id`=373; -UPDATE `ai_playerbot_texts` SET `text_loc3`='Sorry, %other_name, aber es gibt eine Degradierung. Komm stärker zurück!' WHERE `id`=374; -UPDATE `ai_playerbot_texts` SET `text_loc3`='Leider, %other_name, diesmal eine Degradierung. Beim nächsten Mal packst du es!' WHERE `id`=375; -UPDATE `ai_playerbot_texts` SET `text_loc3`='Schwere Entscheidung, aber %other_name, du wurdest degradiert. Zeit, dich wieder hochzugrinden!' WHERE `id`=376; -UPDATE `ai_playerbot_texts` SET `text_loc3`='Unschön, aber %other_name, vorerst eine Degradierung.' WHERE `id`=377; -UPDATE `ai_playerbot_texts` SET `text_loc3`='Sorry, %other_name, dein Rang wurde gesenkt. Lass uns zusammen härter arbeiten!' WHERE `id`=378; -UPDATE `ai_playerbot_texts` SET `text_loc3`='Eine Degradierung für %other_name... Zeit, sich zu fokussieren und wieder hochzukommen!' WHERE `id`=379; -UPDATE `ai_playerbot_texts` SET `text_loc3`='Nicht das, was wir wollten, aber %other_name, du wurdest degradiert. Lern draus und komm stärker zurück!' WHERE `id`=380; -UPDATE `ai_playerbot_texts` SET `text_loc3`='Harter Moment für %other_name, aber wir wissen, du kommst von der Degradierung zurück!' WHERE `id`=381; -UPDATE `ai_playerbot_texts` SET `text_loc3`='Sorry, %other_name, aber du wurdest degradiert. Zeit für Verbesserungen!' WHERE `id`=382; -UPDATE `ai_playerbot_texts` SET `text_loc3`='Wir wollten das nicht für %other_name, aber es gab eine Degradierung. Zeit, besser zu werden!' WHERE `id`=383; -UPDATE `ai_playerbot_texts` SET `text_loc3`='Frisches Blut gesucht! Tritt der Gilde bei, sei Teil von was Großem!' WHERE `id`=384; -UPDATE `ai_playerbot_texts` SET `text_loc3`='Wir rekrutieren neue Mitglieder! Wenn du bereit bist, schließ dich an - die Gildentür steht offen!' WHERE `id`=385; -UPDATE `ai_playerbot_texts` SET `text_loc3`='Die Gilde sucht fähige Abenteurer. Schließ dich an und geh mit uns ab!' WHERE `id`=386; -UPDATE `ai_playerbot_texts` SET `text_loc3`='Bock auf eine starke Gilde? Wir suchen neue Member! Komm rein!' WHERE `id`=387; -UPDATE `ai_playerbot_texts` SET `text_loc3`='Die Gilde wächst! Join uns für fette Abenteuer und Loot!' WHERE `id`=388; -UPDATE `ai_playerbot_texts` SET `text_loc3`='Wer hat Bock auf %instance_name?' WHERE `id`=389; -UPDATE `ai_playerbot_texts` SET `text_loc3`='Gibts Gruppen für %instance_name?' WHERE `id`=390; -UPDATE `ai_playerbot_texts` SET `text_loc3`='Brauch jemand Hilfe für %instance_name?' WHERE `id`=391; -UPDATE `ai_playerbot_texts` SET `text_loc3`='Suche Gruppe: %instance_name.' WHERE `id`=392; -UPDATE `ai_playerbot_texts` SET `text_loc3`='Braucht wer %my_role für %instance_name?' WHERE `id`=393; -UPDATE `ai_playerbot_texts` SET `text_loc3`='Fehlt %my_role für %instance_name?' WHERE `id`=394; -UPDATE `ai_playerbot_texts` SET `text_loc3`='Ich kann %my_role für %instance_name sein.' WHERE `id`=395; -UPDATE `ai_playerbot_texts` SET `text_loc3`='Braucht ihr %my_role für %instance_name?' WHERE `id`=397; -UPDATE `ai_playerbot_texts` SET `text_loc3`='Braucht wer Gear aus %instance_name?' WHERE `id`=398; -UPDATE `ai_playerbot_texts` SET `text_loc3`='Kleiner Grind in %instance_name?' WHERE `id`=399; -UPDATE `ai_playerbot_texts` SET `text_loc3`='Lust auf %instance_name' WHERE `id`=400; -UPDATE `ai_playerbot_texts` SET `text_loc3`='Bock auf %instance_name.' WHERE `id`=402; -UPDATE `ai_playerbot_texts` SET `text_loc3`='%my_role sucht Gruppe für %instance_name.' WHERE `id`=403; -UPDATE `ai_playerbot_texts` SET `text_loc3`='Was ist mit %instance_name?' WHERE `id`=404; -UPDATE `ai_playerbot_texts` SET `text_loc3`='Rein in %instance_name?' WHERE `id`=406; -UPDATE `ai_playerbot_texts` SET `text_loc3`='Suche Gruppe für %instance_name.' WHERE `id`=407; -UPDATE `ai_playerbot_texts` SET `text_loc3`='Braucht wer Hilfe bei Quests in %instance_name?' WHERE `id`=408; -UPDATE `ai_playerbot_texts` SET `text_loc3`='Bock auf Quests in %instance_name.' WHERE `id`=409; -UPDATE `ai_playerbot_texts` SET `text_loc3`='Wer hat Quests in %instance_name?' WHERE `id`=410; -UPDATE `ai_playerbot_texts` SET `text_loc3`='%my_role: Platz in Gruppe für %instance_name?' WHERE `id`=412; -UPDATE `ai_playerbot_texts` SET `text_loc3`='Läuft überhaupt noch jemand %instance_name?' WHERE `id`=413; -UPDATE `ai_playerbot_texts` SET `text_loc3`='%instance_name: nimmt wer einen %my_role mit?' WHERE `id`=414; -UPDATE `ai_playerbot_texts` SET `text_loc3`='Lohnt es sich als %my_role in %instance_name?' WHERE `id`=415; -UPDATE `ai_playerbot_texts` SET `text_loc3`='Lohnt es sich echt, nach %instance_name zu gehen?' WHERE `id`=416; -UPDATE `ai_playerbot_texts` SET `text_loc3`='Die Bosse in %instance_name droppen gutes Gear. Bock zu grinden?' WHERE `id`=418; -UPDATE `ai_playerbot_texts` SET `text_loc3`='Was ist mit %instance_name?' WHERE `id`=419; -UPDATE `ai_playerbot_texts` SET `text_loc3`='Braucht jemand %my_role?' WHERE `id`=420; -UPDATE `ai_playerbot_texts` SET `text_loc3`='Braucht wer %my_role?' WHERE `id`=421; -UPDATE `ai_playerbot_texts` SET `text_loc3`='Wer hat Bock auf %instance_name?' WHERE `id`=422; -UPDATE `ai_playerbot_texts` SET `text_loc3`='Kann mich jemand bei %instance_name beschwören?' WHERE `id`=423; -UPDATE `ai_playerbot_texts` SET `text_loc3`='Trefft mich in %instance_name' WHERE `id`=424; -UPDATE `ai_playerbot_texts` SET `text_loc3`='Bock auf schnellen %instance_name Run' WHERE `id`=425; -UPDATE `ai_playerbot_texts` SET `text_loc3`='Bock auf kompletten %instance_name Run' WHERE `id`=426; -UPDATE `ai_playerbot_texts` SET `text_loc3`='Wie oft wart ihr schon in %instance_name?' WHERE `id`=427; -UPDATE `ai_playerbot_texts` SET `text_loc3`='Noch ein %instance_name Run?' WHERE `id`=428; -UPDATE `ai_playerbot_texts` SET `text_loc3`='In %instance_name gewiped? Nehmt lieber mich!' WHERE `id`=429; -UPDATE `ai_playerbot_texts` SET `text_loc3`='Nehmt mich bitte mit nach %instance_name.' WHERE `id`=430; -UPDATE `ai_playerbot_texts` SET `text_loc3`='Wer nimmt %my_role mit nach %instance_name?' WHERE `id`=433; -UPDATE `ai_playerbot_texts` SET `text_loc3`='LFG %instance_name, bin %my_role' WHERE `id`=434; -UPDATE `ai_playerbot_texts` SET `text_loc3`='%my_role LFG %instance_name' WHERE `id`=435; -UPDATE `ai_playerbot_texts` SET `text_loc3`='Brauche einen DD für %instance_name' WHERE `id`=437; -UPDATE `ai_playerbot_texts` SET `text_loc3`='Suche einen Heiler für %instance_name' WHERE `id`=438; -UPDATE `ai_playerbot_texts` SET `text_loc3`='Will %instance_name machen. Brauche eine Gruppe!' WHERE `id`=440; -UPDATE `ai_playerbot_texts` SET `text_loc3`='Suche noch einen für %instance_name' WHERE `id`=442; -UPDATE `ai_playerbot_texts` SET `text_loc3`='Will jemand mit nach %instance_name?' WHERE `id`=443; -UPDATE `ai_playerbot_texts` SET `text_loc3`='Interesse an %instance_name?' WHERE `id`=444; -UPDATE `ai_playerbot_texts` SET `text_loc3`='Suche einen schnellen Run durch %instance_name' WHERE `id`=445; -UPDATE `ai_playerbot_texts` SET `text_loc3`='Wer ist dabei für %instance_name?' WHERE `id`=446; -UPDATE `ai_playerbot_texts` SET `text_loc3`='Wollt ihr %instance_name farmen?' WHERE `id`=448; -UPDATE `ai_playerbot_texts` SET `text_loc3`='Will %instance_name abschließen' WHERE `id`=449; -UPDATE `ai_playerbot_texts` SET `text_loc3`='Suche Carry durch %instance_name' WHERE `id`=451; -UPDATE `ai_playerbot_texts` SET `text_loc3`='Laufe %instance_name, suche andere' WHERE `id`=453; -UPDATE `ai_playerbot_texts` SET `text_loc3`='Suche jemanden, der bei %instance_name hilft' WHERE `id`=455; -UPDATE `ai_playerbot_texts` SET `text_loc3`='Brauche %my_role für %instance_name!' WHERE `id`=456; -UPDATE `ai_playerbot_texts` SET `text_loc3`='Bock auf einen %instance_name Run?' WHERE `id`=457; -UPDATE `ai_playerbot_texts` SET `text_loc3`='Brauche %my_role für %instance_name Run' WHERE `id`=458; -UPDATE `ai_playerbot_texts` SET `text_loc3`='Will jemand Gear aus %instance_name farmen?' WHERE `id`=459; -UPDATE `ai_playerbot_texts` SET `text_loc3`='Suche Gruppe für %instance_name Speedrun' WHERE `id`=460; -UPDATE `ai_playerbot_texts` SET `text_loc3`='Brauche Gruppe, um %instance_name zu clearen' WHERE `id`=461; -UPDATE `ai_playerbot_texts` SET `text_loc3`='Interesse, %instance_name zu farmen?' WHERE `id`=462; -UPDATE `ai_playerbot_texts` SET `text_loc3`='Suche etwas Gear aus %instance_name' WHERE `id`=463; -UPDATE `ai_playerbot_texts` SET `text_loc3`='Wer hat Lust auf einen schnellen %instance_name Run?' WHERE `id`=464; -UPDATE `ai_playerbot_texts` SET `text_loc3`='Will jemand %instance_name zusammen angehen?' WHERE `id`=465; -UPDATE `ai_playerbot_texts` SET `text_loc3`='Suche Leute, um %instance_name abzuschließen' WHERE `id`=466; -UPDATE `ai_playerbot_texts` SET `text_loc3`='Kriegen wir eine Gruppe für %instance_name zusammen?' WHERE `id`=467; -UPDATE `ai_playerbot_texts` SET `text_loc3`='Brauche einen schnellen Run für %instance_name' WHERE `id`=468; -UPDATE `ai_playerbot_texts` SET `text_loc3`='Wer hat Lust, %instance_name zusammen zu farmen?' WHERE `id`=469; -UPDATE `ai_playerbot_texts` SET `text_loc3`='Suche noch ein paar Leute für %instance_name' WHERE `id`=470; -UPDATE `ai_playerbot_texts` SET `text_loc3`='Braucht jemand Hilfe bei den Mechaniken in %instance_name?' WHERE `id`=471; -UPDATE `ai_playerbot_texts` SET `text_loc3`='Brauche schnell eine Gruppe für %instance_name' WHERE `id`=472; -UPDATE `ai_playerbot_texts` SET `text_loc3`='Will jemand %instance_name als Speedrun laufen?' WHERE `id`=473; -UPDATE `ai_playerbot_texts` SET `text_loc3`='Suche einen schnellen Abschluss von %instance_name' WHERE `id`=474; -UPDATE `ai_playerbot_texts` SET `text_loc3`='Suche jemanden, der bei %instance_name mitkommt' WHERE `id`=475; -UPDATE `ai_playerbot_texts` SET `text_loc3`='Wer hat Lust, %instance_name zu clearen?' WHERE `id`=476; -UPDATE `ai_playerbot_texts` SET `text_loc3`='Brauche Hilfe beim Endboss von %instance_name' WHERE `id`=477; -UPDATE `ai_playerbot_texts` SET `text_loc3`='Wer hat heute Lust, %instance_name zu laufen?' WHERE `id`=478; -UPDATE `ai_playerbot_texts` SET `text_loc3`='Suche schnellen Run in %instance_name, um etwas Gear zu farmen' WHERE `id`=479; -UPDATE `ai_playerbot_texts` SET `text_loc3`='Will jemand Mats aus %instance_name farmen?' WHERE `id`=480; -UPDATE `ai_playerbot_texts` SET `text_loc3`='Lass uns eine Gruppe für %instance_name machen' WHERE `id`=481; -UPDATE `ai_playerbot_texts` SET `text_loc3`='Braucht wer Hilfe bei %quest_link?' WHERE `id`=482; -UPDATE `ai_playerbot_texts` SET `text_loc3`='Will jemand %quest_link teilen?' WHERE `id`=483; -UPDATE `ai_playerbot_texts` SET `text_loc3`='Macht jemand %quest_link?' WHERE `id`=484; -UPDATE `ai_playerbot_texts` SET `text_loc3`='Bock auf %quest_link.' WHERE `id`=485; -UPDATE `ai_playerbot_texts` SET `text_loc3`='Wer hilft bei %quest_link?' WHERE `id`=487; -UPDATE `ai_playerbot_texts` SET `text_loc3`='Braucht jemand Unterstützung bei %quest_link?' WHERE `id`=488; -UPDATE `ai_playerbot_texts` SET `text_loc3`='Interesse an %quest_link?' WHERE `id`=489; -UPDATE `ai_playerbot_texts` SET `text_loc3`='Will jemand %quest_link abschließen?' WHERE `id`=490; -UPDATE `ai_playerbot_texts` SET `text_loc3`='Braucht wer ein Team für %quest_link?' WHERE `id`=491; -UPDATE `ai_playerbot_texts` SET `text_loc3`='Wer hat Bock auf %quest_link?' WHERE `id`=492; -UPDATE `ai_playerbot_texts` SET `text_loc3`='Will %quest_link machen. Wer ist dabei?' WHERE `id`=497; -UPDATE `ai_playerbot_texts` SET `text_loc3`='Wer ist bereit für %quest_link?' WHERE `id`=499; -UPDATE `ai_playerbot_texts` SET `text_loc3`='Wer will bei %quest_link mitmachen?' WHERE `id`=500; -UPDATE `ai_playerbot_texts` SET `text_loc3`='Wer ist bei %quest_link dabei?' WHERE `id`=501; -UPDATE `ai_playerbot_texts` SET `text_loc3`='Brauche hier etwas Hilfe bei %quest_link.' WHERE `id`=502; -UPDATE `ai_playerbot_texts` SET `text_loc3`='Wer ist bereit, %quest_link zu machen?' WHERE `id`=504; -UPDATE `ai_playerbot_texts` SET `text_loc3`='Suche etwas Hilfe für %quest_link.' WHERE `id`=505; -UPDATE `ai_playerbot_texts` SET `text_loc3`='Braucht jemand Hilfe bei %quest_link?' WHERE `id`=506; -UPDATE `ai_playerbot_texts` SET `text_loc3`='Wer hat Lust, %quest_link abzuschließen?' WHERE `id`=507; -UPDATE `ai_playerbot_texts` SET `text_loc3`='Braucht jemand Unterstützung bei %quest_link?' WHERE `id`=508; -UPDATE `ai_playerbot_texts` SET `text_loc3`='Wer kann bei %quest_link helfen?' WHERE `id`=509; -UPDATE `ai_playerbot_texts` SET `text_loc3`='Suche eine helfende Hand bei %quest_link.' WHERE `id`=510; -UPDATE `ai_playerbot_texts` SET `text_loc3`='Ist jemand bereit für %quest_link?' WHERE `id`=511; -UPDATE `ai_playerbot_texts` SET `text_loc3`='Kann jemand bei %quest_link dazukommen?' WHERE `id`=512; -UPDATE `ai_playerbot_texts` SET `text_loc3`='Suche ein paar Mitstreiter für %quest_link.' WHERE `id`=513; -UPDATE `ai_playerbot_texts` SET `text_loc3`='Will jemand sich für %quest_link zusammentun?' WHERE `id`=514; -UPDATE `ai_playerbot_texts` SET `text_loc3`='Wer muss %quest_link noch abschließen?' WHERE `id`=516; -UPDATE `ai_playerbot_texts` SET `text_loc3`='Will %quest_link abschließen.' WHERE `id`=517; -UPDATE `ai_playerbot_texts` SET `text_loc3`='Wer kann bei %quest_link mitkommen?' WHERE `id`=518; -UPDATE `ai_playerbot_texts` SET `text_loc3`='Interesse, %quest_link abzuschließen?' WHERE `id`=519; -UPDATE `ai_playerbot_texts` SET `text_loc3`='Bock, bei %quest_link zu helfen?' WHERE `id`=520; -UPDATE `ai_playerbot_texts` SET `text_loc3`='Ist jemand bereit, bei %quest_link zu helfen?' WHERE `id`=521; -UPDATE `ai_playerbot_texts` SET `text_loc3`='Brauche jemanden, um %quest_link zu beenden.' WHERE `id`=522; -UPDATE `ai_playerbot_texts` SET `text_loc3`='Will jemand %quest_link beenden?' WHERE `id`=523; -UPDATE `ai_playerbot_texts` SET `text_loc3`='Gibt’s Hilfe für %quest_link?' WHERE `id`=524; -UPDATE `ai_playerbot_texts` SET `text_loc3`='Wer ist dabei für %quest_link?' WHERE `id`=525; -UPDATE `ai_playerbot_texts` SET `text_loc3`='Suche Partner zum Abschließen von %quest_link.' WHERE `id`=526; -UPDATE `ai_playerbot_texts` SET `text_loc3`='Wer hat Lust, %quest_link zu beenden?' WHERE `id`=527; -UPDATE `ai_playerbot_texts` SET `text_loc3`='Heute jemand Interesse an %quest_link?' WHERE `id`=529; -UPDATE `ai_playerbot_texts` SET `text_loc3`='Wer hat jetzt Bock auf %quest_link?' WHERE `id`=531; -UPDATE `ai_playerbot_texts` SET `text_loc3`='Will jemand %quest_link starten?' WHERE `id`=532; -UPDATE `ai_playerbot_texts` SET `text_loc3`='Bitte um Hilfe bei %quest_link.' WHERE `id`=533; -UPDATE `ai_playerbot_texts` SET `text_loc3`='Wer kann mir bei %quest_link helfen?' WHERE `id`=534; -UPDATE `ai_playerbot_texts` SET `text_loc3`='Suche Gruppe für %quest_link.' WHERE `id`=535; -UPDATE `ai_playerbot_texts` SET `text_loc3`='Jemand bereit zum %category farmen?' WHERE `id`=536; -UPDATE `ai_playerbot_texts` SET `text_loc3`='Suche Hilfe beim %category farmen.' WHERE `id`=537; -UPDATE `ai_playerbot_texts` SET `text_loc3`='%category sind verdammt teuer!' WHERE `id`=538; -UPDATE `ai_playerbot_texts` SET `text_loc3`='Will %category.' WHERE `id`=539; -UPDATE `ai_playerbot_texts` SET `text_loc3`='Kaufe: %category.' WHERE `id`=541; -UPDATE `ai_playerbot_texts` SET `text_loc3`='Interesse an %category?' WHERE `id`=542; -UPDATE `ai_playerbot_texts` SET `text_loc3`='Verkaufe: %category.' WHERE `id`=543; -UPDATE `ai_playerbot_texts` SET `text_loc3`='Will %category farmen.' WHERE `id`=546; -UPDATE `ai_playerbot_texts` SET `text_loc3`='Suche Gruppe fürs %category farmen.' WHERE `id`=547; -UPDATE `ai_playerbot_texts` SET `text_loc3`='%category sind willkommen.' WHERE `id`=548; -UPDATE `ai_playerbot_texts` SET `text_loc3`='Kaufe alles von %category.' WHERE `id`=549; -UPDATE `ai_playerbot_texts` SET `text_loc3`='Wow, alle farmen %category!' WHERE `id`=550; -UPDATE `ai_playerbot_texts` SET `text_loc3`='AH ist heiß auf %category.' WHERE `id`=552; -UPDATE `ai_playerbot_texts` SET `text_loc3`='Will etwas %category tauschen.' WHERE `id`=554; -UPDATE `ai_playerbot_texts` SET `text_loc3`='Etwas %category bitte?' WHERE `id`=558; -UPDATE `ai_playerbot_texts` SET `text_loc3`='Hätte wohl den Skill für %category lernen sollen.' WHERE `id`=559; -UPDATE `ai_playerbot_texts` SET `text_loc3`='Ich geiere auf %category.' WHERE `id`=560; -UPDATE `ai_playerbot_texts` SET `text_loc3`='Für %category würden die Leute töten.' WHERE `id`=561; -UPDATE `ai_playerbot_texts` SET `text_loc3`='%category ist ein Top-Deal!' WHERE `id`=562; -UPDATE `ai_playerbot_texts` SET `text_loc3`='Wo farmt man am besten %category?' WHERE `id`=564; -UPDATE `ai_playerbot_texts` SET `text_loc3`='Bin ready für %category.' WHERE `id`=565; -UPDATE `ai_playerbot_texts` SET `text_loc3`='Ich behalte meine ganzen %category wohl lieber.' WHERE `id`=567; -UPDATE `ai_playerbot_texts` SET `text_loc3`='Brauchst du eine Gruppe? Vielleicht zum %category farmen?' WHERE `id`=568; -UPDATE `ai_playerbot_texts` SET `text_loc3`='Denke immer noch über %category nach.' WHERE `id`=569; -UPDATE `ai_playerbot_texts` SET `text_loc3`='Hab schon von %category gehört, aber meine Taschen sind leer.' WHERE `id`=570; -UPDATE `ai_playerbot_texts` SET `text_loc3`='LFG für %category' WHERE `id`=571; -UPDATE `ai_playerbot_texts` SET `text_loc3`='Würde mich der Verkauf von %category reich machen?' WHERE `id`=572; -UPDATE `ai_playerbot_texts` SET `text_loc3`='Okay. Ich farme %category morgen.' WHERE `id`=573; -UPDATE `ai_playerbot_texts` SET `text_loc3`='Hab mindestens zehn Leute gesehen, die %category farmen.' WHERE `id`=575; -UPDATE `ai_playerbot_texts` SET `text_loc3`='Hab gestern all meine %category verkauft. Bin komplett pleite!' WHERE `id`=576; -UPDATE `ai_playerbot_texts` SET `text_loc3`='Will einer Gilde joinen, die %category farmt.' WHERE `id`=577; -UPDATE `ai_playerbot_texts` SET `text_loc3`='Verkaufe %category, wer hat Interesse?' WHERE `id`=580; -UPDATE `ai_playerbot_texts` SET `text_loc3`='Verkaufe %category, flüster mir.' WHERE `id`=582; -UPDATE `ai_playerbot_texts` SET `text_loc3`='Brauche %category, verkauft das jemand?' WHERE `id`=584; -UPDATE `ai_playerbot_texts` SET `text_loc3`='Hab %category zu verkaufen, meldet euch!' WHERE `id`=585; -UPDATE `ai_playerbot_texts` SET `text_loc3`='Verkaufe %category, bester Preis am Markt.' WHERE `id`=588; -UPDATE `ai_playerbot_texts` SET `text_loc3`='Suche %category im Tausch gegen %category.' WHERE `id`=589; -UPDATE `ai_playerbot_texts` SET `text_loc3`='Wer braucht %category? Hab was zu verkaufen!' WHERE `id`=591; -UPDATE `ai_playerbot_texts` SET `text_loc3`='Habe %category zu verkaufen, flüster mir für den Preis.' WHERE `id`=592; -UPDATE `ai_playerbot_texts` SET `text_loc3`='Will %category verkaufen, flüster mir für Details.' WHERE `id`=593; -UPDATE `ai_playerbot_texts` SET `text_loc3`='Kaufe: %category. Verkauft das jemand?' WHERE `id`=594; -UPDATE `ai_playerbot_texts` SET `text_loc3`='Suche %category, bitte melden.' WHERE `id`=595; -UPDATE `ai_playerbot_texts` SET `text_loc3`='Wer hat Interesse an %category?' WHERE `id`=596; -UPDATE `ai_playerbot_texts` SET `text_loc3`='Kann jemand beim %category farmen helfen?' WHERE `id`=597; -UPDATE `ai_playerbot_texts` SET `text_loc3`='Will %category kaufen, flüster mir einfach.' WHERE `id`=599; -UPDATE `ai_playerbot_texts` SET `text_loc3`='Suche %category. Wer hat was?' WHERE `id`=600; -UPDATE `ai_playerbot_texts` SET `text_loc3`='Kaufe: %category zum fairen Preis.' WHERE `id`=601; -UPDATE `ai_playerbot_texts` SET `text_loc3`='Brauche dringend %category, hat wer was?' WHERE `id`=602; -UPDATE `ai_playerbot_texts` SET `text_loc3`='Hab %category, verkaufe günstig.' WHERE `id`=603; -UPDATE `ai_playerbot_texts` SET `text_loc3`='Verkaufe %category zum guten Kurs.' WHERE `id`=604; -UPDATE `ai_playerbot_texts` SET `text_loc3`='Suche %category, verkauft wer günstig?' WHERE `id`=605; -UPDATE `ai_playerbot_texts` SET `text_loc3`='Verkauft jemand %category? Hätte Interesse.' WHERE `id`=606; -UPDATE `ai_playerbot_texts` SET `text_loc3`='Brauche %category, flüstert mir wenn ihr verkauft.' WHERE `id`=607; -UPDATE `ai_playerbot_texts` SET `text_loc3`='Hat wer %category übrig zum Tauschen?' WHERE `id`=608; -UPDATE `ai_playerbot_texts` SET `text_loc3`='Hat wer Interesse, %category zu tauschen?' WHERE `id`=610; -UPDATE `ai_playerbot_texts` SET `text_loc3`='Verkaufe %category, meldet euch für Tausch.' WHERE `id`=611; -UPDATE `ai_playerbot_texts` SET `text_loc3`='Kaufe: %category, suche guten Kurs.' WHERE `id`=612; -UPDATE `ai_playerbot_texts` SET `text_loc3`='Wer braucht %category? Hab was übrig.' WHERE `id`=613; -UPDATE `ai_playerbot_texts` SET `text_loc3`='Will wer %category? Verkaufe billig.' WHERE `id`=614; -UPDATE `ai_playerbot_texts` SET `text_loc3`='Suche %category, verkauft wer was?' WHERE `id`=615; -UPDATE `ai_playerbot_texts` SET `text_loc3`='Braucht jemand %category? Hab was zum Tauschen.' WHERE `id`=616; -UPDATE `ai_playerbot_texts` SET `text_loc3`='Kaufe: %category. Ist jemand günstiger als AH?' WHERE `id`=617; -UPDATE `ai_playerbot_texts` SET `text_loc3`='Verkaufe %category billig, flüster mir für Details.' WHERE `id`=618; -UPDATE `ai_playerbot_texts` SET `text_loc3`='Braucht wer %category? Hab was zu verkaufen.' WHERE `id`=619; -UPDATE `ai_playerbot_texts` SET `text_loc3`='Tausche %category gegen was anderes.' WHERE `id`=620; -UPDATE `ai_playerbot_texts` SET `text_loc3`='Hab %category, tausche gegen %category.' WHERE `id`=621; -UPDATE `ai_playerbot_texts` SET `text_loc3`='Kaufe: %category, hat wer was übrig?' WHERE `id`=622; -UPDATE `ai_playerbot_texts` SET `text_loc3`='Farmt wer Ruf bei %faction?' WHERE `id`=623; -UPDATE `ai_playerbot_texts` SET `text_loc3`='Kann wer bei %faction helfen?' WHERE `id`=624; -UPDATE `ai_playerbot_texts` SET `text_loc3`='Hab Bock auf Quests für %faction.' WHERE `id`=625; -UPDATE `ai_playerbot_texts` SET `text_loc3`='%faction ist die beste Fraktion.' WHERE `id`=626; -UPDATE `ai_playerbot_texts` SET `text_loc3`='Fehlt nur noch ein bisschen bis %rep_level bei %faction.' WHERE `id`=627; -UPDATE `ai_playerbot_texts` SET `text_loc3`='Hat jemand %rep_level bei %faction?' WHERE `id`=628; -UPDATE `ai_playerbot_texts` SET `text_loc3`='Wer will %rep_level bei %faction sein?' WHERE `id`=629; -UPDATE `ai_playerbot_texts` SET `text_loc3`='Ich werde nie %rep_level bei %faction sein.' WHERE `id`=630; -UPDATE `ai_playerbot_texts` SET `text_loc3`='Fehlt jemandem Ruf bei %faction?' WHERE `id`=631; -UPDATE `ai_playerbot_texts` SET `text_loc3`='Kann beim Ruf farmen für %faction helfen.' WHERE `id`=632; -UPDATE `ai_playerbot_texts` SET `text_loc3`='%faction: brauche %rndK bis %rep_level.' WHERE `id`=634; -UPDATE `ai_playerbot_texts` SET `text_loc3`='Wer kann Quests von %faction teilen?' WHERE `id`=635; -UPDATE `ai_playerbot_texts` SET `text_loc3`='Gibts Inis für %faction?' WHERE `id`=636; -UPDATE `ai_playerbot_texts` SET `text_loc3`='Hab Bock, Ruf bei %faction zu grinden.' WHERE `id`=637; -UPDATE `ai_playerbot_texts` SET `text_loc3`='Lasst uns Ruf bei %faction farmen!' WHERE `id`=638; -UPDATE `ai_playerbot_texts` SET `text_loc3`='Farme Ruf bei %faction.' WHERE `id`=639; -UPDATE `ai_playerbot_texts` SET `text_loc3`='Bock, für %faction zu farmen.' WHERE `id`=640; -UPDATE `ai_playerbot_texts` SET `text_loc3`='Brauche Hilfe bei %faction.' WHERE `id`=641; -UPDATE `ai_playerbot_texts` SET `text_loc3`='Verkauft %faction was Nützliches?' WHERE `id`=642; -UPDATE `ai_playerbot_texts` SET `text_loc3`='Wer farmt für %faction?' WHERE `id`=644; -UPDATE `ai_playerbot_texts` SET `text_loc3`='Wie farmt man %faction am besten?' WHERE `id`=645; -UPDATE `ai_playerbot_texts` SET `text_loc3`='Ich hasse den Rufgrind für %faction.' WHERE `id`=646; -UPDATE `ai_playerbot_texts` SET `text_loc3`='Ich hab %faction so satt.' WHERE `id`=647; -UPDATE `ai_playerbot_texts` SET `text_loc3`='Gehen wir %faction an?' WHERE `id`=648; -UPDATE `ai_playerbot_texts` SET `text_loc3`='Scheint, als wenn alle %rep_level bei %faction sind. Nur ich hänge wie immer hinterher.' WHERE `id`=649; -UPDATE `ai_playerbot_texts` SET `text_loc3`='LFG für Rufgrind bei %faction?' WHERE `id`=650; -UPDATE `ai_playerbot_texts` SET `text_loc3`='Kann jemand einen guten Spot für Rufgrind bei %faction empfehlen?' WHERE `id`=651; -UPDATE `ai_playerbot_texts` SET `text_loc3`='Bringt mir Ruf bei %faction überhaupt was?' WHERE `id`=652; -UPDATE `ai_playerbot_texts` SET `text_loc3`='Wer hätte gedacht, dass Ruf bei %faction doch noch nützlich ist...' WHERE `id`=653; -UPDATE `ai_playerbot_texts` SET `text_loc3`='Lohnt es sich, meinen Ruf bei %faction zu pushen?' WHERE `id`=655; -UPDATE `ai_playerbot_texts` SET `text_loc3`='Was ist besser für %faction? Quests oder Mobs grinden?' WHERE `id`=656; -UPDATE `ai_playerbot_texts` SET `text_loc3`='Grinde euren Ruf bei %faction, gebt mir nur etwas Gold.' WHERE `id`=657; -UPDATE `ai_playerbot_texts` SET `text_loc3`='Ich glaube, Ruf bei %faction zu grinden dauert ewig.' WHERE `id`=658; -UPDATE `ai_playerbot_texts` SET `text_loc3`='Ich kill jeden Tag für %faction, bin aber noch weit weg von %rep_level.' WHERE `id`=659; -UPDATE `ai_playerbot_texts` SET `text_loc3`='Sinken die AH-Gebühren auf %my_level?' WHERE `id`=660; -UPDATE `ai_playerbot_texts` SET `text_loc3`='Wie viele Fraktionen hast du auf ehrfürchtig?' WHERE `id`=661; -UPDATE `ai_playerbot_texts` SET `text_loc3`='Verdammt. Meine Gilde hat gestern ohne mich gut Ruf bei %faction gegrindet.' WHERE `id`=663; -UPDATE `ai_playerbot_texts` SET `text_loc3`='Keiner will mir helfen, weil ich schon %rep_level bei %faction bin.' WHERE `id`=664; -UPDATE `ai_playerbot_texts` SET `text_loc3`='Bleib bitte weg von %faction.' WHERE `id`=665; -UPDATE `ai_playerbot_texts` SET `text_loc3`='Farmt heute jemand Ruf bei %faction?' WHERE `id`=666; -UPDATE `ai_playerbot_texts` SET `text_loc3`='Helft mir, Ruf bei %faction zu grinden!' WHERE `id`=667; -UPDATE `ai_playerbot_texts` SET `text_loc3`='Ich brauch so dringend %rep_level bei %faction!' WHERE `id`=668; -UPDATE `ai_playerbot_texts` SET `text_loc3`='Lohnt sich der Grind für %faction?' WHERE `id`=669; -UPDATE `ai_playerbot_texts` SET `text_loc3`='Kennt jemand gute Spots für Ruf bei %faction?' WHERE `id`=670; -UPDATE `ai_playerbot_texts` SET `text_loc3`='Ich liebe es, Ruf bei %faction zu grinden!' WHERE `id`=671; -UPDATE `ai_playerbot_texts` SET `text_loc3`='Brauche Hilfe, um den Rufgrind bei %faction abzuschließen!' WHERE `id`=672; -UPDATE `ai_playerbot_texts` SET `text_loc3`='Nur noch ein paar Stufen bis %rep_level bei %faction!' WHERE `id`=673; -UPDATE `ai_playerbot_texts` SET `text_loc3`='Wer hat heute Bock auf Grind für %faction?' WHERE `id`=674; -UPDATE `ai_playerbot_texts` SET `text_loc3`='Suche Mitstreiter für Rufgrind bei %faction!' WHERE `id`=675; -UPDATE `ai_playerbot_texts` SET `text_loc3`='Ich bin das Rufgrinden für %faction leid!' WHERE `id`=676; -UPDATE `ai_playerbot_texts` SET `text_loc3`='Noch wer auf Rufgrind bei %faction?' WHERE `id`=677; -UPDATE `ai_playerbot_texts` SET `text_loc3`='Zeit, den Rufgrind bei %faction richtig anzugehen!' WHERE `id`=678; -UPDATE `ai_playerbot_texts` SET `text_loc3`='Helft mir, den Ruf bei %faction fertig zu machen!' WHERE `id`=679; -UPDATE `ai_playerbot_texts` SET `text_loc3`='Mir fehlen nur noch %rndK für den %faction Ruf!' WHERE `id`=680; -UPDATE `ai_playerbot_texts` SET `text_loc3`='Den ganzen Tag Ruf bei %faction am farmen!' WHERE `id`=681; -UPDATE `ai_playerbot_texts` SET `text_loc3`='Rufgrind bei %faction endet nie!' WHERE `id`=683; -UPDATE `ai_playerbot_texts` SET `text_loc3`='Hilfe bei den Daily-Quests von %faction?' WHERE `id`=684; -UPDATE `ai_playerbot_texts` SET `text_loc3`='Wer ist grad beim Grind für %faction?' WHERE `id`=685; -UPDATE `ai_playerbot_texts` SET `text_loc3`='Lasst uns Quests von %faction zusammen machen!' WHERE `id`=686; -UPDATE `ai_playerbot_texts` SET `text_loc3`='Farmt heute jemand Ruf bei %faction?' WHERE `id`=687; -UPDATE `ai_playerbot_texts` SET `text_loc3`='Brauche Hilfe beim Ruf bei %faction für %rep_level!' WHERE `id`=688; -UPDATE `ai_playerbot_texts` SET `text_loc3`='Wer will mit mir Ruf bei %faction grinden?' WHERE `id`=689; -UPDATE `ai_playerbot_texts` SET `text_loc3`='Kommt mit zum Rufgrind bei %faction!' WHERE `id`=690; -UPDATE `ai_playerbot_texts` SET `text_loc3`='Läuft bei mir beim Rufgrind für %faction!' WHERE `id`=691; -UPDATE `ai_playerbot_texts` SET `text_loc3`='Will jemand Boosts für den Rufgrind bei %faction?' WHERE `id`=692; -UPDATE `ai_playerbot_texts` SET `text_loc3`='Bei %faction fehlt nicht mehr viel bis %rep_level, helft mir doch mal!' WHERE `id`=694; -UPDATE `ai_playerbot_texts` SET `text_loc3`='Bock, mir beim Rufgrind für %faction zu helfen?' WHERE `id`=695; -UPDATE `ai_playerbot_texts` SET `text_loc3`='Farme wieder Ruf bei %faction!' WHERE `id`=696; -UPDATE `ai_playerbot_texts` SET `text_loc3`='Kennt jemand einen guten Spot für Ruf bei %faction?' WHERE `id`=697; -UPDATE `ai_playerbot_texts` SET `text_loc3`='Wie viel fehlt noch beim Rufgrind für %faction?' WHERE `id`=698; -UPDATE `ai_playerbot_texts` SET `text_loc3`='Macht jemand Quests von %faction mit mir?' WHERE `id`=699; -UPDATE `ai_playerbot_texts` SET `text_loc3`='Suche jemand für Rufgrind bis %rep_level bei %faction!' WHERE `id`=700; -UPDATE `ai_playerbot_texts` SET `text_loc3`='Mir fehlen nur noch %rndK Ruf bei %faction!' WHERE `id`=701; -UPDATE `ai_playerbot_texts` SET `text_loc3`='Der Grind für %faction ist brutal!' WHERE `id`=702; -UPDATE `ai_playerbot_texts` SET `text_loc3`='Farmt jemand Ruf bei %faction für %rep_level?' WHERE `id`=703; -UPDATE `ai_playerbot_texts` SET `text_loc3`='Lasst uns den Rufgrind bei %faction zusammen machen!' WHERE `id`=704; -UPDATE `ai_playerbot_texts` SET `text_loc3`='Mehr Ruf bei %faction, mehr Belohnungen!' WHERE `id`=705; -UPDATE `ai_playerbot_texts` SET `text_loc3`='Farme Ruf bei %faction als %my_class' WHERE `id`=706; -UPDATE `ai_playerbot_texts` SET `text_loc3`='Hängt noch jemand bei %faction auf %rep_level fest?' WHERE `id`=707; -UPDATE `ai_playerbot_texts` SET `text_loc3`='Die ganze Nacht Rufgrind bei %faction!' WHERE `id`=708; -UPDATE `ai_playerbot_texts` SET `text_loc3`='Wer will den Rufgrind bei %faction mit mir abschließen?' WHERE `id`=709; -UPDATE `ai_playerbot_texts` SET `text_loc3`='Ich kann beim Rufgrind für %faction helfen!' WHERE `id`=710; -UPDATE `ai_playerbot_texts` SET `text_loc3`='Bereit für mehr Rufgrind bei %faction!' WHERE `id`=711; -UPDATE `ai_playerbot_texts` SET `text_loc3`='Bock zu helfen beim Ruf für %faction? Ich brauch das dringend!' WHERE `id`=712; -UPDATE `ai_playerbot_texts` SET `text_loc3`='Ich brauche noch %rndK für den Ruf bei %faction!' WHERE `id`=713; -UPDATE `ai_playerbot_texts` SET `text_loc3`='Farmt mit mir für Ruf bei %faction!' WHERE `id`=714; -UPDATE `ai_playerbot_texts` SET `text_loc3`='Mir fehlen nur noch %rndK Ruf bei %faction!' WHERE `id`=715; -UPDATE `ai_playerbot_texts` SET `text_loc3`='Der Rufgrind bei %faction nimmt kein Ende...' WHERE `id`=716; -UPDATE `ai_playerbot_texts` SET `text_loc3`='Hat jemand Items für Rufboost bei %faction?' WHERE `id`=717; -UPDATE `ai_playerbot_texts` SET `text_loc3`='Farmt jemand Ruf bei %faction für Mounts?' WHERE `id`=719; -UPDATE `ai_playerbot_texts` SET `text_loc3`='Chance, mit mir Ruf bei %faction zu farmen?' WHERE `id`=720; -UPDATE `ai_playerbot_texts` SET `text_loc3`='Ich bin so kurz vor %rep_level bei %faction!' WHERE `id`=721; -UPDATE `ai_playerbot_texts` SET `text_loc3`='Helft mir, %rep_level bei %faction zu erreichen!' WHERE `id`=722; -UPDATE `ai_playerbot_texts` SET `text_loc3`='Ich bin dabei, den %faction Rufgrind abzuschließen!' WHERE `id`=723; -UPDATE `ai_playerbot_texts` SET `text_loc3`='Brauche Hilfe beim Rufgrind für %faction!' WHERE `id`=724; -UPDATE `ai_playerbot_texts` SET `text_loc3`='Wer kann mit mir Ruf bei %faction farmen?' WHERE `id`=726; -UPDATE `ai_playerbot_texts` SET `text_loc3`='Rufgrind bei %faction non-stop!' WHERE `id`=727; -UPDATE `ai_playerbot_texts` SET `text_loc3`='Wer grindet gerade noch Ruf bei %faction?' WHERE `id`=728; -UPDATE `ai_playerbot_texts` SET `text_loc3`='Will jemand zum Spaß Ruf bei %faction farmen?' WHERE `id`=729; -UPDATE `ai_playerbot_texts` SET `text_loc3`='Ich muss noch Ruf bei %faction farmen, um neue Quests freizuschalten!' WHERE `id`=730; -UPDATE `ai_playerbot_texts` SET `text_loc3`='Bock, Ruf bei %faction für Belohnungen zu grinden!' WHERE `id`=731; -UPDATE `ai_playerbot_texts` SET `text_loc3`='Tag für Tag, Rufgrind bei %faction!' WHERE `id`=732; -UPDATE `ai_playerbot_texts` SET `text_loc3`='Will jemand beim Rufgrind für %faction helfen?' WHERE `id`=733; -UPDATE `ai_playerbot_texts` SET `text_loc3`='Helft mir, mit Ruf bei %faction Belohnungen freizuschalten!' WHERE `id`=734; -UPDATE `ai_playerbot_texts` SET `text_loc3`='Ich grinde Ruf bei %faction für Mounts!' WHERE `id`=735; -UPDATE `ai_playerbot_texts` SET `text_loc3`='Kommt mit, Ruf bei %faction farmen!' WHERE `id`=736; -UPDATE `ai_playerbot_texts` SET `text_loc3`='Beim Rufgrind für %faction bin ich fast da!' WHERE `id`=737; -UPDATE `ai_playerbot_texts` SET `text_loc3`='Grinde Ruf bei %faction mit meinen Leuten!' WHERE `id`=738; -UPDATE `ai_playerbot_texts` SET `text_loc3`='Hab Bock auf Party in %zone_name.' WHERE `id`=739; -UPDATE `ai_playerbot_texts` SET `text_loc3`='Sucht jemand %my_role?' WHERE `id`=740; -UPDATE `ai_playerbot_texts` SET `text_loc3`='%my_role sucht Gilde.' WHERE `id`=741; -UPDATE `ai_playerbot_texts` SET `text_loc3`='%my_role will einer guten Gilde beitreten.' WHERE `id`=743; -UPDATE `ai_playerbot_texts` SET `text_loc3`='Fühlt sich noch wer einsam?' WHERE `id`=745; -UPDATE `ai_playerbot_texts` SET `text_loc3`='Wer will was abhaben?' WHERE `id`=747; -UPDATE `ai_playerbot_texts` SET `text_loc3`='Kommt her und holt mich!' WHERE `id`=748; -UPDATE `ai_playerbot_texts` SET `text_loc3`='Macht hier grade jemand etwas?' WHERE `id`=750; -UPDATE `ai_playerbot_texts` SET `text_loc3`='%zone_name: ist hier jemand?' WHERE `id`=751; -UPDATE `ai_playerbot_texts` SET `text_loc3`='%zone_name: Wo sind alle?' WHERE `id`=752; -UPDATE `ai_playerbot_texts` SET `text_loc3`='Scheint als wäre ich allein in %zone_name.' WHERE `id`=753; -UPDATE `ai_playerbot_texts` SET `text_loc3`='Trefft mich in %zone_name.' WHERE `id`=754; -UPDATE `ai_playerbot_texts` SET `text_loc3`='%zone_name ist der beste Spot!' WHERE `id`=756; -UPDATE `ai_playerbot_texts` SET `text_loc3`='Will nach %zone_name. Kommt wer mit?' WHERE `id`=757; -UPDATE `ai_playerbot_texts` SET `text_loc3`='Ich mag %zone_name nicht, aber wohin sonst?' WHERE `id`=759; -UPDATE `ai_playerbot_texts` SET `text_loc3`='Gibt’s gute Quests in %zone_name?' WHERE `id`=760; -UPDATE `ai_playerbot_texts` SET `text_loc3`='%zone_name ist der übelste Spot.' WHERE `id`=764; -UPDATE `ai_playerbot_texts` SET `text_loc3`='Schnappt mich in %zone_name!' WHERE `id`=765; -UPDATE `ai_playerbot_texts` SET `text_loc3`='Ab nach %zone_name!' WHERE `id`=766; -UPDATE `ai_playerbot_texts` SET `text_loc3`='Bock zu questen in %zone_name' WHERE `id`=767; -UPDATE `ai_playerbot_texts` SET `text_loc3`='Hat wer Quests in %zone_name?' WHERE `id`=768; -UPDATE `ai_playerbot_texts` SET `text_loc3`='Kommt her nach %zone_name!' WHERE `id`=769; -UPDATE `ai_playerbot_texts` SET `text_loc3`='Sieht so aus, als wär keine Horde in %zone_name' WHERE `id`=770; -UPDATE `ai_playerbot_texts` SET `text_loc3`='Sieht so aus, als wär keine Allianz in %zone_name' WHERE `id`=771; -UPDATE `ai_playerbot_texts` SET `text_loc3`='Ich bin echt müde von %zone_name. Vielleicht sollte ich woanders hin?' WHERE `id`=772; -UPDATE `ai_playerbot_texts` SET `text_loc3`='Ich will nach Hause und dann in die Kiste.' WHERE `id`=774; -UPDATE `ai_playerbot_texts` SET `text_loc3`='Weiß wer, was man fürs Beidhändig-Kämpfen braucht?' WHERE `id`=775; -UPDATE `ai_playerbot_texts` SET `text_loc3`='hi zusammen!' WHERE `id`=776; -UPDATE `ai_playerbot_texts` SET `text_loc3`='%zone_name ist gemütlich' WHERE `id`=777; -UPDATE `ai_playerbot_texts` SET `text_loc3`='Ich fühl mich super' WHERE `id`=778; -UPDATE `ai_playerbot_texts` SET `text_loc3`='Ich ignoriere Leute nicht, ich trolle sie, bis sie mich ignorieren' WHERE `id`=779; -UPDATE `ai_playerbot_texts` SET `text_loc3`='schön zu sehen, dass der Chat sich noch erinnert' WHERE `id`=781; -UPDATE `ai_playerbot_texts` SET `text_loc3`='Wie jede Waffe ist es Jäger-BiS' WHERE `id`=782; -UPDATE `ai_playerbot_texts` SET `text_loc3`='für mich geht es im Spiel nur ums Solo-Spielen und darum, neue Wege zu finden, Dinge solo zu machen' WHERE `id`=783; -UPDATE `ai_playerbot_texts` SET `text_loc3`='ich habe NIEMANDEN jemals abgezockt' WHERE `id`=784; -UPDATE `ai_playerbot_texts` SET `text_loc3`='Zeit, mir den Weg nach %zone_name freizukämpfen' WHERE `id`=787; -UPDATE `ai_playerbot_texts` SET `text_loc3`='ich muss kacken' WHERE `id`=789; -UPDATE `ai_playerbot_texts` SET `text_loc3`='Wenn du deine häutbaren Kills nicht lootest, schrumpft dein Schniedel jedes mal dauerhaft um 1mm' WHERE `id`=790; -UPDATE `ai_playerbot_texts` SET `text_loc3`='NEEEEEEEEEEEEIN' WHERE `id`=791; -UPDATE `ai_playerbot_texts` SET `text_loc3`='ICH MAG ZÜGE' WHERE `id`=792; -UPDATE `ai_playerbot_texts` SET `text_loc3`='/w mir im chat' WHERE `id`=793; -UPDATE `ai_playerbot_texts` SET `text_loc3`='hi, wie geht es euch' WHERE `id`=794; -UPDATE `ai_playerbot_texts` SET `text_loc3`='hab mich grad ausgeloggt und wieder eingeloggt' WHERE `id`=795; -UPDATE `ai_playerbot_texts` SET `text_loc3`='könnt ihr mal leiser sein, ich hab mich in %zone_name verlaufen' WHERE `id`=796; -UPDATE `ai_playerbot_texts` SET `text_loc3`='wer will mit mir was trinken in %zone_name ...hicks!' WHERE `id`=797; -UPDATE `ai_playerbot_texts` SET `text_loc3`='Früher war der Bait glaubwürdiger.' WHERE `id`=799; -UPDATE `ai_playerbot_texts` SET `text_loc3`='vielleicht hast du einfach deine Unschuld verloren' WHERE `id`=800; -UPDATE `ai_playerbot_texts` SET `text_loc3`='Gibts hier Gilden, die %my_role mitziehen?' WHERE `id`=801; -UPDATE `ai_playerbot_texts` SET `text_loc3`='Sobald man höher kommt, ist Gold easy zu machen' WHERE `id`=802; -UPDATE `ai_playerbot_texts` SET `text_loc3`='moin' WHERE `id`=803; -UPDATE `ai_playerbot_texts` SET `text_loc3`='Warum tut mir der Arsch weh?' WHERE `id`=804; -UPDATE `ai_playerbot_texts` SET `text_loc3`='Ich hab das Gefühl, Willenskraft ist BiS zum Leveln' WHERE `id`=805; -UPDATE `ai_playerbot_texts` SET `text_loc3`='bei Trollen erst recht' WHERE `id`=806; -UPDATE `ai_playerbot_texts` SET `text_loc3`='KANN MICH JEMAND INVITEN' WHERE `id`=807; -UPDATE `ai_playerbot_texts` SET `text_loc3`='brauche viele Drinks' WHERE `id`=808; -UPDATE `ai_playerbot_texts` SET `text_loc3`='verdammte Gnome' WHERE `id`=809; -UPDATE `ai_playerbot_texts` SET `text_loc3`='niemand mag Gnome' WHERE `id`=810; -UPDATE `ai_playerbot_texts` SET `text_loc3`='Gnome taugen nur für eins' WHERE `id`=811; -UPDATE `ai_playerbot_texts` SET `text_loc3`='nun ja' WHERE `id`=812; -UPDATE `ai_playerbot_texts` SET `text_loc3`='selbstständige Gedanken sind schon gruselig' WHERE `id`=814; -UPDATE `ai_playerbot_texts` SET `text_loc3`='der Geist ist formbarer, als man glaubt' WHERE `id`=815; -UPDATE `ai_playerbot_texts` SET `text_loc3`='gibts hier Levelgilden?' WHERE `id`=816; -UPDATE `ai_playerbot_texts` SET `text_loc3`='brb' WHERE `id`=817; -UPDATE `ai_playerbot_texts` SET `text_loc3`='warum ist Schnee weiß, aber Eis klar? ist doch das Gleiche' WHERE `id`=818; -UPDATE `ai_playerbot_texts` SET `text_loc3`='warum ist Schlagsahne fluffig und normale nicht' WHERE `id`=819; -UPDATE `ai_playerbot_texts` SET `text_loc3`='warum riechen Füße, wenn sie keine Nase haben' WHERE `id`=820; -UPDATE `ai_playerbot_texts` SET `text_loc3`='scheint als hätte jemand ne Dose Neulinge aufgemacht' WHERE `id`=821; -UPDATE `ai_playerbot_texts` SET `text_loc3`='hört auf, Neulinge mit Bullshit-Antworten zu trollen' WHERE `id`=822; -UPDATE `ai_playerbot_texts` SET `text_loc3`='gibts hier auf dem Server PvP?' WHERE `id`=823; -UPDATE `ai_playerbot_texts` SET `text_loc3`='eh klar' WHERE `id`=824; -UPDATE `ai_playerbot_texts` SET `text_loc3`='puh... :)' WHERE `id`=825; -UPDATE `ai_playerbot_texts` SET `text_loc3`='wusstet ihr schon, dass...' WHERE `id`=826; -UPDATE `ai_playerbot_texts` SET `text_loc3`='Ich stell mir lieber nicht vor, wie sich die Viecher fühlen, während ich sie umboxe.' WHERE `id`=827; -UPDATE `ai_playerbot_texts` SET `text_loc3`='ups, falscher Chat' WHERE `id`=828; -UPDATE `ai_playerbot_texts` SET `text_loc3`='bruh, ihr dreht heute völlig durch' WHERE `id`=829; -UPDATE `ai_playerbot_texts` SET `text_loc3`='Nett hier. Aber waren Sie schon mal in Darnassus?' WHERE `id`=830; -UPDATE `ai_playerbot_texts` SET `text_loc3`='grrr wütend' WHERE `id`=831; -UPDATE `ai_playerbot_texts` SET `text_loc3`='der Grind macht Spaß' WHERE `id`=832; -UPDATE `ai_playerbot_texts` SET `text_loc3`='WoW hält mich wachsam' WHERE `id`=833; -UPDATE `ai_playerbot_texts` SET `text_loc3`='kurze Frage: wo krieg ich den Buff für mehr XP? bin in %zone_name' WHERE `id`=834; -UPDATE `ai_playerbot_texts` SET `text_loc3`='mögt ihr Würstchen?' WHERE `id`=835; -UPDATE `ai_playerbot_texts` SET `text_loc3`='inv mich. ich helfe' WHERE `id`=836; -UPDATE `ai_playerbot_texts` SET `text_loc3`='welche Klasse ist gut für PvP?' WHERE `id`=837; -UPDATE `ai_playerbot_texts` SET `text_loc3`='wo zum Teufel ist der Kochlehrer in %zone_name' WHERE `id`=838; -UPDATE `ai_playerbot_texts` SET `text_loc3`='wisst ihr, was in %zone_name abgeht?' WHERE `id`=839; -UPDATE `ai_playerbot_texts` SET `text_loc3`='muss was craften' WHERE `id`=840; -UPDATE `ai_playerbot_texts` SET `text_loc3`='Bock auf Blödsinn in %zone_name?' WHERE `id`=841; -UPDATE `ai_playerbot_texts` SET `text_loc3`='machen wir %zone_name zu unserem Spielplatz' WHERE `id`=842; -UPDATE `ai_playerbot_texts` SET `text_loc3`='ich verirr mich gleich wieder in %zone_name' WHERE `id`=843; -UPDATE `ai_playerbot_texts` SET `text_loc3`='kaum zu glauben, dass ich immer noch in %zone_name hocke' WHERE `id`=844; -UPDATE `ai_playerbot_texts` SET `text_loc3`='lasst uns die Mailbox in %zone_name raiden!' WHERE `id`=846; -UPDATE `ai_playerbot_texts` SET `text_loc3`='ich schwöre, in %zone_name wimmelt es von Trollen' WHERE `id`=847; -UPDATE `ai_playerbot_texts` SET `text_loc3`='lasst uns zusammen Chaos in %zone_name anrichten' WHERE `id`=848; -UPDATE `ai_playerbot_texts` SET `text_loc3`='hab Bock, in %zone_name absolut gar nix zu machen' WHERE `id`=849; -UPDATE `ai_playerbot_texts` SET `text_loc3`='in %zone_name hört eh keiner zu' WHERE `id`=850; -UPDATE `ai_playerbot_texts` SET `text_loc3`='ist %zone_name überhaupt real oder wie Bielefeld?' WHERE `id`=851; -UPDATE `ai_playerbot_texts` SET `text_loc3`='schickt mal wer Hilfe nach %zone_name! ist wild hier!' WHERE `id`=852; -UPDATE `ai_playerbot_texts` SET `text_loc3`='ich bin sicher, in %zone_name spukt es' WHERE `id`=853; -UPDATE `ai_playerbot_texts` SET `text_loc3`='wenn %zone_name reden könnte, würde es wahrscheinlich schreien' WHERE `id`=854; -UPDATE `ai_playerbot_texts` SET `text_loc3`='irgendwas ist faul an %zone_name' WHERE `id`=855; -UPDATE `ai_playerbot_texts` SET `text_loc3`='gleich zerleg ich %zone_name mit meiner Awesomeness' WHERE `id`=856; -UPDATE `ai_playerbot_texts` SET `text_loc3`='sagt %zone_name, dass ich da bin' WHERE `id`=857; -UPDATE `ai_playerbot_texts` SET `text_loc3`='ich hab mich in %zone_name verlaufen, sendet Hilfe' WHERE `id`=858; -UPDATE `ai_playerbot_texts` SET `text_loc3`='ich starte ne Revolution in %zone_name' WHERE `id`=859; -UPDATE `ai_playerbot_texts` SET `text_loc3`='findet noch wer %zone_name verdächtig ruhig?' WHERE `id`=860; -UPDATE `ai_playerbot_texts` SET `text_loc3`='ich wette, %zone_name hat Geheimnisse, von denen wir nix wissen' WHERE `id`=861; -UPDATE `ai_playerbot_texts` SET `text_loc3`='%my_race kann man in %zone_name nie genug haben' WHERE `id`=862; -UPDATE `ai_playerbot_texts` SET `text_loc3`='langsam glaube ich, %zone_name ist nur ein Mythos' WHERE `id`=863; -UPDATE `ai_playerbot_texts` SET `text_loc3`='wer hätte gedacht, dass %zone_name so abgeht?' WHERE `id`=864; -UPDATE `ai_playerbot_texts` SET `text_loc3`='als wäre das Spiel in %zone_name kaputt' WHERE `id`=865; -UPDATE `ai_playerbot_texts` SET `text_loc3`='ist %zone_name eigentlich ne Wüste, oder bin ich einfach nur lost?' WHERE `id`=866; -UPDATE `ai_playerbot_texts` SET `text_loc3`='fühlt sich langsam an wie %zone_name im Mixer' WHERE `id`=867; -UPDATE `ai_playerbot_texts` SET `text_loc3`='hat jemand ne Karte für %zone_name?' WHERE `id`=868; -UPDATE `ai_playerbot_texts` SET `text_loc3`='Noch wer, der denkt das %zone_name uns umbringen will?' WHERE `id`=869; -UPDATE `ai_playerbot_texts` SET `text_loc3`='Ich bin auf wilder Fahrt durch %zone_name!' WHERE `id`=870; -UPDATE `ai_playerbot_texts` SET `text_loc3`='Bin das nur ich, oder wird %zone_name immer weirder?' WHERE `id`=871; -UPDATE `ai_playerbot_texts` SET `text_loc3`='Ich bin davon überzeugt, das %zone_name heimlich ein Freizeitpark ist.' WHERE `id`=872; -UPDATE `ai_playerbot_texts` SET `text_loc3`='Tastatur kaputt... wahrscheinlich wieder zu wenig Freunde.' WHERE `id`=873; -UPDATE `ai_playerbot_texts` SET `text_loc3`='Glaubt ihr, die Bäume in dem Spiel haben Gefühle?' WHERE `id`=874; -UPDATE `ai_playerbot_texts` SET `text_loc3`='Ich drücke immer dieselbe Taste, aber ich gewinne trotzdem nicht' WHERE `id`=875; -UPDATE `ai_playerbot_texts` SET `text_loc3`='ich wette, ich könnte nen Raid gewinnen, in dem ich einfach nur LOOT schreie' WHERE `id`=876; -UPDATE `ai_playerbot_texts` SET `text_loc3`='versuche seit einer Stunde, auf mein Mount zu steigen, nix passiert' WHERE `id`=877; -UPDATE `ai_playerbot_texts` SET `text_loc3`='gibt es nen Weg, unverwundbar zu werden, ohne wirklich zu spielen?' WHERE `id`=878; -UPDATE `ai_playerbot_texts` SET `text_loc3`='kann ich einfach random Tasten smashen und trotzdem gewinnen? frage für nen Freund' WHERE `id`=879; -UPDATE `ai_playerbot_texts` SET `text_loc3`='Wenn ich einfach stehen bleibe, dann bin ich immer noch besser als du!' WHERE `id`=880; -UPDATE `ai_playerbot_texts` SET `text_loc3`='warum heilt mich mein Pet nicht wenn ich im Feuer stehe' WHERE `id`=881; -UPDATE `ai_playerbot_texts` SET `text_loc3`='brauch ich Rüstung, um ein echter wahrer Held zu sein, oder ist das optional?' WHERE `id`=882; -UPDATE `ai_playerbot_texts` SET `text_loc3`='Muss ich erst 10.000 Koboldkerzen klauen, um zu leveln, oder was?' WHERE `id`=883; -UPDATE `ai_playerbot_texts` SET `text_loc3`='meine Waffe ist kaputt, kann ich Gegner noch mit meinem riesigen Schw... äh, meiner Faust klatschen?' WHERE `id`=884; -UPDATE `ai_playerbot_texts` SET `text_loc3`='können wir das Spiel bitte in World of DieCraft umbenennen, ein Spieler killt mich dauernd' WHERE `id`=885; -UPDATE `ai_playerbot_texts` SET `text_loc3`='Warum fliegt mein Pferd nicht? kann es nicht einfach nach oben gehen?' WHERE `id`=886; -UPDATE `ai_playerbot_texts` SET `text_loc3`='Gibts ne Option, die Grafik auszumachen, damit es aussieht wie mein alter Taschenrechner?' WHERE `id`=887; -UPDATE `ai_playerbot_texts` SET `text_loc3`='ich sollte was killen, bin aber eingepennt, ist das normal?' WHERE `id`=888; -UPDATE `ai_playerbot_texts` SET `text_loc3`='killt noch wer random NPCs zum Spaß, oder bin das nur ich?' WHERE `id`=889; -UPDATE `ai_playerbot_texts` SET `text_loc3`='ich bin %my_level und kenn schon alle Geheimnisse des Spiels' WHERE `id`=890; -UPDATE `ai_playerbot_texts` SET `text_loc3`='kann ich einfach so lange mit NPCs reden, bis sie mir ihren ganzen Loot einfach geben?' WHERE `id`=891; -UPDATE `ai_playerbot_texts` SET `text_loc3`='warum verliere ich, ich spiel doch schon 15 Minuten' WHERE `id`=893; -UPDATE `ai_playerbot_texts` SET `text_loc3`='Ich brauch keine Strategie, ich spam einfach diese Fähigkeit und hoffe aufs Beste' WHERE `id`=894; -UPDATE `ai_playerbot_texts` SET `text_loc3`='wenn ich haufenweise Glücksbringer anlege, krieg ich dann mehr Loot?' WHERE `id`=895; -UPDATE `ai_playerbot_texts` SET `text_loc3`='Ist das Geheimnis dieses Spiels einfach, den Bildschirm anzuschreien?' WHERE `id`=896; -UPDATE `ai_playerbot_texts` SET `text_loc3`='Kann ich einfach jedes Item anziehen, das ich finde, und aufs Beste hoffen?' WHERE `id`=897; -UPDATE `ai_playerbot_texts` SET `text_loc3`='Muss ich echt Quests machen oder kann ich einfach erkunden und Leute anbrüllen?' WHERE `id`=898; -UPDATE `ai_playerbot_texts` SET `text_loc3`='ich zocke auf Arbeit, die sagen ich soll arbeiten >.> aber es ist WoW!' WHERE `id`=899; -UPDATE `ai_playerbot_texts` SET `text_loc3`='wenn ich alles Essen im Spiel esse, werd ich dann unbesiegbar' WHERE `id`=900; -UPDATE `ai_playerbot_texts` SET `text_loc3`='Also, ich werfe mein Pet einfach in jeden Bosskampf und drücke beim würfeln immer auf Gier, das sind die Hunter-Regeln.' WHERE `id`=901; -UPDATE `ai_playerbot_texts` SET `text_loc3`='kann man sterben, wenn man schon tot ist? Ich frage für nen Geist...' WHERE `id`=902; -UPDATE `ai_playerbot_texts` SET `text_loc3`='weiß jemand, wo das legendäre Schwert ist? hab schon 5 Minuten gesucht' WHERE `id`=903; -UPDATE `ai_playerbot_texts` SET `text_loc3`='Man sagte mir, hier gibts 100.000 Gold, wo muss ich hin?' WHERE `id`=904; -UPDATE `ai_playerbot_texts` SET `text_loc3`='ich spiel das hier wie ich deine Mom letzte Nacht genommen hab - mit Geschrei und einem ruhmreichem Ende!' WHERE `id`=905; -UPDATE `ai_playerbot_texts` SET `text_loc3`='ab wann wirds Spaß, oder ist alles nur für immer Grind' WHERE `id`=906; -UPDATE `ai_playerbot_texts` SET `text_loc3`='ich frage ständig nach dem Weg, aber sie schicken mich immer irgendwo hin, ist das normal?' WHERE `id`=907; -UPDATE `ai_playerbot_texts` SET `text_loc3`='hab gehört, wenn du ALT+F4 drückst, kriegst du 100.000 Gold - Der Trick ist, vorher nen roten NPC anzugreifen' WHERE `id`=908; -UPDATE `ai_playerbot_texts` SET `text_loc3`='warum sieht mein Char immer so verwirrt aus, bin ich schuld?' WHERE `id`=909; -UPDATE `ai_playerbot_texts` SET `text_loc3`='hey, deine Mom meinte, du sollst jetzt ins Bett!' WHERE `id`=910; -UPDATE `ai_playerbot_texts` SET `text_loc3`='Warcraft ist ein Grind - genau wie deine Mom neulich, hat sogar Abo!' WHERE `id`=911; -UPDATE `ai_playerbot_texts` SET `text_loc3`='stimmt es, dass Chuck Norris mal gelevelt hat, ohne nen Knopf zu drücken' WHERE `id`=912; -UPDATE `ai_playerbot_texts` SET `text_loc3`='Chuck Norris braucht kein Mount, der Boden bewegt freiwillig sich unter ihm' WHERE `id`=913; -UPDATE `ai_playerbot_texts` SET `text_loc3`='wenn Chuck Norris nen Raid betritt, gibt der Boss einfach auf' WHERE `id`=914; -UPDATE `ai_playerbot_texts` SET `text_loc3`='Chuck Norris nutzt keine Fähigkeiten, er guckt nur - und die Gegner sterben' WHERE `id`=915; -UPDATE `ai_playerbot_texts` SET `text_loc3`='Chuck Norris braucht keine Heilung, seine Feinde heilen ihn aus Respekt' WHERE `id`=916; -UPDATE `ai_playerbot_texts` SET `text_loc3`='Chuck Norris kann nen Raid solo... ohne Gear... und AFK' WHERE `id`=917; -UPDATE `ai_playerbot_texts` SET `text_loc3`='Chuck Norris weicht nicht aus, das Spiel weicht ihm aus' WHERE `id`=918; -UPDATE `ai_playerbot_texts` SET `text_loc3`='Chuck Norris nutzte mal ne Lowlevel-Waffe - das Spiel gab ihm den besten Loot' WHERE `id`=919; -UPDATE `ai_playerbot_texts` SET `text_loc3`='wenn Chuck Norris eine Ini betritt, landet der Loot automatisch in seinem Inventar' WHERE `id`=920; -UPDATE `ai_playerbot_texts` SET `text_loc3`='was ist Wilma' WHERE `id`=921; -UPDATE `ai_playerbot_texts` SET `text_loc3`='Bist du aus Bayern?' WHERE `id`=922; -UPDATE `ai_playerbot_texts` SET `text_loc3`='Wilma lecken' WHERE `id`=923; -UPDATE `ai_playerbot_texts` SET `text_loc3`='Dann leck mir an den Eiern.' WHERE `id`=924; -UPDATE `ai_playerbot_texts` SET `text_loc3`='ICH FRESS NEN ARSCH' WHERE `id`=925; -UPDATE `ai_playerbot_texts` SET `text_loc3`='ich will mir %random_inventory_item_link in den Arsch schieben' WHERE `id`=926; -UPDATE `ai_playerbot_texts` SET `text_loc3`='ich will dir %random_inventory_item_link in den Arsch schieben' WHERE `id`=927; -UPDATE `ai_playerbot_texts` SET `text_loc3`='Darnarschloch' WHERE `id`=928; -UPDATE `ai_playerbot_texts` SET `text_loc3`='Du leidest an mehr Bugs als das Spiel selbst!' WHERE `id`=929; -UPDATE `ai_playerbot_texts` SET `text_loc3`='Du hast Chefkochs salzige Schokobällchen im Mund!' WHERE `id`=930; -UPDATE `ai_playerbot_texts` SET `text_loc3`='cooler Ständer, Bro' WHERE `id`=931; -UPDATE `ai_playerbot_texts` SET `text_loc3`='hab alles probiert, am Ende hats ERP gerichtet' WHERE `id`=933; -UPDATE `ai_playerbot_texts` SET `text_loc3`='ich will in %zone_name bumsen' WHERE `id`=934; -UPDATE `ai_playerbot_texts` SET `text_loc3`='suche weiblichen Gnom mit Gorilla-Pet für ERP in %zone_name' WHERE `id`=935; -UPDATE `ai_playerbot_texts` SET `text_loc3`='ein Arschloch versteh ich, aber nen Perversen?' WHERE `id`=936; -UPDATE `ai_playerbot_texts` SET `text_loc3`='Kein Gyat in %zone_name, nur Gesichtseintopf so weit das Auge reicht.' WHERE `id`=937; -UPDATE `ai_playerbot_texts` SET `text_loc3`='ich kill alle Tiere in %zone_name. Scheiß auf Tiere und die PETA!!!' WHERE `id`=938; -UPDATE `ai_playerbot_texts` SET `text_loc3`='Nur gut, dass ich 3 Beine hab' WHERE `id`=939; -UPDATE `ai_playerbot_texts` SET `text_loc3`='Chill, ich bin einfach grad komplett in meinem Film.' WHERE `id`=940; -UPDATE `ai_playerbot_texts` SET `text_loc3`='Finger im Po Mexiko' WHERE `id`=941; -UPDATE `ai_playerbot_texts` SET `text_loc3`='Das hast du irgendwie vergeigt, beeindruckend' WHERE `id`=942; -UPDATE `ai_playerbot_texts` SET `text_loc3`='das könnte ich blind machen, muss ich aber nicht' WHERE `id`=943; -UPDATE `ai_playerbot_texts` SET `text_loc3`='sicher, dass du weißt, wie man das Spiel spielt?' WHERE `id`=944; -UPDATE `ai_playerbot_texts` SET `text_loc3`='als würdest du absichtlich verlieren' WHERE `id`=945; -UPDATE `ai_playerbot_texts` SET `text_loc3`='hab schon bessere Plays von Level-1-Chars gesehen' WHERE `id`=946; -UPDATE `ai_playerbot_texts` SET `text_loc3`='du bist hier wie ein Speedbump' WHERE `id`=947; -UPDATE `ai_playerbot_texts` SET `text_loc3`='vielleicht suchst du dir lieber ein anderes Hobby' WHERE `id`=948; -UPDATE `ai_playerbot_texts` SET `text_loc3`='dein Gameplay ist wie Farbe beim Trocknen zusehen' WHERE `id`=949; -UPDATE `ai_playerbot_texts` SET `text_loc3`='mein Twink könnte dich da durch carrien' WHERE `id`=950; -UPDATE `ai_playerbot_texts` SET `text_loc3`='trollst du uns, oder bist du ernsthaft so?' WHERE `id`=951; -UPDATE `ai_playerbot_texts` SET `text_loc3`='Ich glaub, das Gegnerteam läuft besser, wenn du bei uns bist' WHERE `id`=952; -UPDATE `ai_playerbot_texts` SET `text_loc3`='spiel vielleicht mal das Spiel statt nur die Landschaft zu bestaunen' WHERE `id`=953; -UPDATE `ai_playerbot_texts` SET `text_loc3`='ich glaube, du hast da jede einzelne Fähigkeit verfehlt' WHERE `id`=954; -UPDATE `ai_playerbot_texts` SET `text_loc3`='bist du lost oder stellst du dich nur dumm?' WHERE `id`=955; -UPDATE `ai_playerbot_texts` SET `text_loc3`='Level-1-Chars nehmen weniger Schaden als das' WHERE `id`=956; -UPDATE `ai_playerbot_texts` SET `text_loc3`='das war für uns beide peinlich' WHERE `id`=957; -UPDATE `ai_playerbot_texts` SET `text_loc3`='Hab schon besseres Teamplay in nem Solo-Game gesehen' WHERE `id`=958; -UPDATE `ai_playerbot_texts` SET `text_loc3`='ich stell mich mal hinten hin und schau dir beim Failen zu' WHERE `id`=959; -UPDATE `ai_playerbot_texts` SET `text_loc3`='dachtest du wirklich, das wäre ne gute Idee?' WHERE `id`=960; -UPDATE `ai_playerbot_texts` SET `text_loc3`='kaum zu glauben, dass du diese simple Aufgabe verkackt hast' WHERE `id`=961; -UPDATE `ai_playerbot_texts` SET `text_loc3`='bist du hier, um zu helfen, oder nur um Zeit zu verschwenden?' WHERE `id`=962; -UPDATE `ai_playerbot_texts` SET `text_loc3`='gut, dass ich da bin, um das Team zu schützen' WHERE `id`=963; -UPDATE `ai_playerbot_texts` SET `text_loc3`='ich schwöre, du machst es schwerer als nötig' WHERE `id`=964; -UPDATE `ai_playerbot_texts` SET `text_loc3`='wie schaffst du es, die simpelsten Sachen zu failen?' WHERE `id`=965; -UPDATE `ai_playerbot_texts` SET `text_loc3`='vielleicht mal lieber nur zuschauen, statt das zu tun was du spielen nennst' WHERE `id`=966; -UPDATE `ai_playerbot_texts` SET `text_loc3`='du könntest dich wenigstens bemühen, so zu tun, als wärst du gut' WHERE `id`=967; -UPDATE `ai_playerbot_texts` SET `text_loc3`='mach so weiter und wir sitzen hier den ganzen Tag' WHERE `id`=968; -UPDATE `ai_playerbot_texts` SET `text_loc3`='ehrlich, das war die schlechteste Entscheidung ever' WHERE `id`=969; -UPDATE `ai_playerbot_texts` SET `text_loc3`='ich glaub, dieses Spiel ist nix für dich' WHERE `id`=970; -UPDATE `ai_playerbot_texts` SET `text_loc3`='was sollte dieser Move?' WHERE `id`=971; -UPDATE `ai_playerbot_texts` SET `text_loc3`='du bist ne Last fürs Team' WHERE `id`=972; -UPDATE `ai_playerbot_texts` SET `text_loc3`='du denkst echt, du bist ein Pro, was?' WHERE `id`=973; -UPDATE `ai_playerbot_texts` SET `text_loc3`='vielleicht einfach quitten und uns allen den Stress sparen' WHERE `id`=974; -UPDATE `ai_playerbot_texts` SET `text_loc3`='%prefix %random_taken_quest_or_item_link' WHERE `id`=975; -UPDATE `ai_playerbot_texts` SET `text_loc3`='%prefix %random_inventory_item_link' WHERE `id`=976; -UPDATE `ai_playerbot_texts` SET `text_loc3`='%thunderfury_link' WHERE `id`=977; -UPDATE `ai_playerbot_texts` SET `text_loc3`='%thunderfury_link%thunderfury_link' WHERE `id`=978; -UPDATE `ai_playerbot_texts` SET `text_loc3`='%thunderfury_link%thunderfury_link%thunderfury_link' WHERE `id`=979; -UPDATE `ai_playerbot_texts` SET `text_loc3`='ich glaube, ich hab gerade %thunderfury_link gehört' WHERE `id`=980; -UPDATE `ai_playerbot_texts` SET `text_loc3`='ich glaub, ich habe %thunderfury_link gehört' WHERE `id`=981; -UPDATE `ai_playerbot_texts` SET `text_loc3`='ich hab definitiv %thunderfury_link gehört' WHERE `id`=982; -UPDATE `ai_playerbot_texts` SET `text_loc3`='kein Plan, aber ich bin ziemlich sicher, das ich %thunderfury_link gehört habe' WHERE `id`=983; -UPDATE `ai_playerbot_texts` SET `text_loc3`='hast du gerade %thunderfury_link gesagt' WHERE `id`=984; -UPDATE `ai_playerbot_texts` SET `text_loc3`='hat jemand %thunderfury_link gesagt' WHERE `id`=985; -UPDATE `ai_playerbot_texts` SET `text_loc3`='hat jemand %thunderfury_link gesagt?' WHERE `id`=986; -UPDATE `ai_playerbot_texts` SET `text_loc3`='jemand hat %thunderfury_link gesagt' WHERE `id`=987; -UPDATE `ai_playerbot_texts` SET `text_loc3`='%thunderfury_link kommt aus dem Schrank' WHERE `id`=988; -UPDATE `ai_playerbot_texts` SET `text_loc3`='ich schwöre, es war %thunderfury_link, könnte aber auch %thunderfury_link gewesen sein' WHERE `id`=989; -UPDATE `ai_playerbot_texts` SET `text_loc3`='warum %thunderfury_link nutzen, wenn %thunderfury_link offensichtlich viel stärker ist' WHERE `id`=990; -UPDATE `ai_playerbot_texts` SET `text_loc3`='hab ich gerade %thunderfury_link gehört?' WHERE `id`=991; -UPDATE `ai_playerbot_texts` SET `text_loc3`='niemals... hör ich da echt %thunderfury_link?' WHERE `id`=992; -UPDATE `ai_playerbot_texts` SET `text_loc3`='%thunderfury_link? klingt nach was, das nur Legenden führen!' WHERE `id`=993; -UPDATE `ai_playerbot_texts` SET `text_loc3`='ich spüre die Macht von %thunderfury_link in der Luft!' WHERE `id`=994; -UPDATE `ai_playerbot_texts` SET `text_loc3`='%thunderfury_link ist der *echte* MVP' WHERE `id`=995; -UPDATE `ai_playerbot_texts` SET `text_loc3`='kann mir jemand ne %thunderfury_link besorgen? frage für einen Freund... vielleicht zwei!' WHERE `id`=996; -UPDATE `ai_playerbot_texts` SET `text_loc3`='hat %thunderfury_link da gerade was *gesmitet*? ich schwöre, der Boden hat gewackelt' WHERE `id`=997; -UPDATE `ai_playerbot_texts` SET `text_loc3`='%thunderfury_link auf dem Schlachtfeld... Das ist purer Flex' WHERE `id`=998; -UPDATE `ai_playerbot_texts` SET `text_loc3`='ich *glaube*, ich hab %thunderfury_link gehört... oder war das nur ein Mythos?' WHERE `id`=999; -UPDATE `ai_playerbot_texts` SET `text_loc3`='hab ich gerade jemanden mit %thunderfury_link gesehen?!' WHERE `id`=1000; -UPDATE `ai_playerbot_texts` SET `text_loc3`='Bin zu 99% sicher, das war %thunderfury_link. Zu 1% wars vielleicht nur ein random NPC.' WHERE `id`=1002; -UPDATE `ai_playerbot_texts` SET `text_loc3`='%thunderfury_link in Aktion! Wer braucht ne Armee, mit so einer Power?' WHERE `id`=1003; -UPDATE `ai_playerbot_texts` SET `text_loc3`='Hab gehört, %thunderfury_link lockt alle Jungs an.' WHERE `id`=1004; -UPDATE `ai_playerbot_texts` SET `text_loc3`='Warum überhaupt %thunderfury_link nutzen, wenn %thunderfury_link klar die bessere Option ist?' WHERE `id`=1005; -UPDATE `ai_playerbot_texts` SET `text_loc3`='Bin das nur ich, oder hat %thunderfury_link nen passiven „Trash-Talk“-Effekt?' WHERE `id`=1006; -UPDATE `ai_playerbot_texts` SET `text_loc3`='Dachte, ich hätte %thunderfury_link gehört, war aber nur der Klang reiner Awesomeness.' WHERE `id`=1007; -UPDATE `ai_playerbot_texts` SET `text_loc3`='Oh, %thunderfury_link... Wo *warst* du mein ganzes Leben?' WHERE `id`=1008; -UPDATE `ai_playerbot_texts` SET `text_loc3`='Hat jemand %thunderfury_link gesagt? Ich glaub, ich hol mir mal meine.' WHERE `id`=1009; -UPDATE `ai_playerbot_texts` SET `text_loc3`='Das war definitiv der Sound von %thunderfury_link! Ich spür die Epicness.' WHERE `id`=1010; -UPDATE `ai_playerbot_texts` SET `text_loc3`='Geht das nur mir so, oder lässt %thunderfury_link alle anderen *schwach aussehen*?' WHERE `id`=1011; -UPDATE `ai_playerbot_texts` SET `text_loc3`='Wie man so sagt... je lauter %thunderfury_link, desto größer das Recht zu prahlen!' WHERE `id`=1012; -UPDATE `ai_playerbot_texts` SET `text_loc3`='VK: %item_formatted_link für %cost_gold.' WHERE `id`=1013; -UPDATE `ai_playerbot_texts` SET `text_loc3`='Will wer %item_formatted_link? Nur %cost_gold.' WHERE `id`=1015; -UPDATE `ai_playerbot_texts` SET `text_loc3`='Lächerlicher Preis: %cost_gold für %item_formatted_link!' WHERE `id`=1019; -UPDATE `ai_playerbot_texts` SET `text_loc3`='Will %item_formatted_link für %cost_gold verkaufen.' WHERE `id`=1020; -UPDATE `ai_playerbot_texts` SET `text_loc3`='%item_formatted_link ist Wertvoll, aber ich würd es für %cost_gold verkaufen.' WHERE `id`=1024; -UPDATE `ai_playerbot_texts` SET `text_loc3`='Billiger als %cost_gold kriegst du %item_formatted_link nicht!' WHERE `id`=1025; -UPDATE `ai_playerbot_texts` SET `text_loc3`='Brauche mehr als %item_formatted_link!' WHERE `id`=1026; -UPDATE `ai_playerbot_texts` SET `text_loc3`='Habe %item_formatted_link und brauche mehr.' WHERE `id`=1027; -UPDATE `ai_playerbot_texts` SET `text_loc3`='Habe %item_formatted_link. Wer kauft für %cost_gold?' WHERE `id`=1028; -UPDATE `ai_playerbot_texts` SET `text_loc3`='Wie wärs mit %item_formatted_link? Für %cost_gold.' WHERE `id`=1030; -UPDATE `ai_playerbot_texts` SET `text_loc3`='Wer meinte, ich bin ein Bastard? %item_formatted_link für %cost_gold ist ein guter Preis!' WHERE `id`=1031; -UPDATE `ai_playerbot_texts` SET `text_loc3`='Verkaufe %item_formatted_link? Nur %cost_gold.' WHERE `id`=1032; -UPDATE `ai_playerbot_texts` SET `text_loc3`='LFG zum Farmen. %item_formatted_link gibts von mir noch für %cost_gold.' WHERE `id`=1033; -UPDATE `ai_playerbot_texts` SET `text_loc3`='Heute fast alles verkauft. %item_formatted_link hab ich noch für %cost_gold.' WHERE `id`=1034; -UPDATE `ai_playerbot_texts` SET `text_loc3`='Wozu Handelschat? Klar, um %item_formatted_link für %cost_gold zu verkaufen.' WHERE `id`=1035; -UPDATE `ai_playerbot_texts` SET `text_loc3`='Kann jemand den Preis %cost_gold für %item_formatted_link unterbieten?' WHERE `id`=1036; -UPDATE `ai_playerbot_texts` SET `text_loc3`='Wollt ihr den Handelschat stoppen? Kauft einfach %item_formatted_link! Für %cost_gold!' WHERE `id`=1037; -UPDATE `ai_playerbot_texts` SET `text_loc3`='Alle spammen im Handelschat. Ich auch - %cost_gold für %item_formatted_link!' WHERE `id`=1038; -UPDATE `ai_playerbot_texts` SET `text_loc3`='Taugt %item_formatted_link was? Verkaufe es für %cost_gold.' WHERE `id`=1039; -UPDATE `ai_playerbot_texts` SET `text_loc3`='Hab %item_formatted_link, verkaufe an dich für %cost_gold.' WHERE `id`=1040; -UPDATE `ai_playerbot_texts` SET `text_loc3`='Gestern nix geschafft, aber %item_formatted_link bekommen. Verkaufe für %cost_gold.' WHERE `id`=1041; -UPDATE `ai_playerbot_texts` SET `text_loc3`='Gestern gefarmt und %item_formatted_link gezogen. Will jemand für %cost_gold kaufen?' WHERE `id`=1042; -UPDATE `ai_playerbot_texts` SET `text_loc3`='Gestern %item_formatted_link gekauft. Brauchts wer für %cost_gold?' WHERE `id`=1043; -UPDATE `ai_playerbot_texts` SET `text_loc3`='Wer hatte %item_formatted_link gesucht? Preis bleibt - %cost_gold.' WHERE `id`=1044; -UPDATE `ai_playerbot_texts` SET `text_loc3`='Hab immer noch %item_formatted_link. Kauft wer für %cost_gold?' WHERE `id`=1045; -UPDATE `ai_playerbot_texts` SET `text_loc3`='Früher war ich besser bei Kasse. Jetzt verkauf ich %item_formatted_link für %cost_gold.' WHERE `id`=1046; -UPDATE `ai_playerbot_texts` SET `text_loc3`='Ich Wünschte, ich hätte mehr als %item_formatted_link. Kaufen könnt ihrs trotzdem für %cost_gold.' WHERE `id`=1047; -UPDATE `ai_playerbot_texts` SET `text_loc3`='Wozu ist euer Gold gut? Um mein %item_formatted_link für %cost_gold zu kaufen.' WHERE `id`=1048; -UPDATE `ai_playerbot_texts` SET `text_loc3`='Gönnt mir etwas Gold. Kauft %item_formatted_link für %cost_gold.' WHERE `id`=1049; -UPDATE `ai_playerbot_texts` SET `text_loc3`='Sind %cost_gold ein guter Preis für %item_formatted_link?' WHERE `id`=1050; -UPDATE `ai_playerbot_texts` SET `text_loc3`='Hab gestern erst %item_formatted_link gekauft, brauch es aber nicht mehr. Will wer für %cost_gold?' WHERE `id`=1051; -UPDATE `ai_playerbot_texts` SET `text_loc3`='Stell %item_formatted_link gleich ins AH, aber ihr könnts jetzt günstiger haben: nur %cost_gold.' WHERE `id`=1052; -UPDATE `ai_playerbot_texts` SET `text_loc3`='Warum zum #!@ hab ich %item_formatted_link gekauft? Brauchts wer für %cost_gold?' WHERE `id`=1053; -UPDATE `ai_playerbot_texts` SET `text_loc3`='VK: %item_formatted_link für %cost_gold.' WHERE `id`=1054; -UPDATE `ai_playerbot_texts` SET `text_loc3`='Will wer %item_formatted_link? Nur %cost_gold.' WHERE `id`=1056; -UPDATE `ai_playerbot_texts` SET `text_loc3`='VK: %item_formatted_link für %cost_gold. flüster mir bei Interesse.' WHERE `id`=1060; -UPDATE `ai_playerbot_texts` SET `text_loc3`='Muss %item_formatted_link loswerden, %cost_gold oder bestes Angebot.' WHERE `id`=1061; -UPDATE `ai_playerbot_texts` SET `text_loc3`='%item_formatted_link für %cost_gold verfügbar. Schlagt zu!' WHERE `id`=1062; -UPDATE `ai_playerbot_texts` SET `text_loc3`='Habe %item_formatted_link, will %cost_gold.' WHERE `id`=1063; -UPDATE `ai_playerbot_texts` SET `text_loc3`='Verkaufe %item_formatted_link, nur %cost_gold.' WHERE `id`=1064; -UPDATE `ai_playerbot_texts` SET `text_loc3`='Will jemand %item_formatted_link für %cost_gold? flüster mir!' WHERE `id`=1065; -UPDATE `ai_playerbot_texts` SET `text_loc3`='Verkaufe %item_formatted_link für %cost_gold, greift zu solange es geht!' WHERE `id`=1066; -UPDATE `ai_playerbot_texts` SET `text_loc3`='%item_formatted_link für %cost_gold, schnell sein bevor es weg ist!' WHERE `id`=1067; -UPDATE `ai_playerbot_texts` SET `text_loc3`='Verkaufe %item_formatted_link für %cost_gold, wer zuerst kommt wird auch zuerst bedient!' WHERE `id`=1069; -UPDATE `ai_playerbot_texts` SET `text_loc3`='Nur %cost_gold für %item_formatted_link, nur für kurze Zeit!' WHERE `id`=1070; -UPDATE `ai_playerbot_texts` SET `text_loc3`='%item_formatted_link für %cost_gold verfügbar, meldet euch wenn ihrs braucht!' WHERE `id`=1071; -UPDATE `ai_playerbot_texts` SET `text_loc3`='Interesse an %item_formatted_link für %cost_gold?' WHERE `id`=1072; -UPDATE `ai_playerbot_texts` SET `text_loc3`='Verkaufe %item_formatted_link für %cost_gold, muss meine Taschen leeren.' WHERE `id`=1073; -UPDATE `ai_playerbot_texts` SET `text_loc3`='Hol dir %item_formatted_link für %cost_gold, Top-Deal!' WHERE `id`=1074; -UPDATE `ai_playerbot_texts` SET `text_loc3`='%item_formatted_link für %cost_gold, greift zu solange der Vorrat reicht!' WHERE `id`=1075; -UPDATE `ai_playerbot_texts` SET `text_loc3`='Verkaufe %item_formatted_link für %cost_gold, nicht verpassen!' WHERE `id`=1076; -UPDATE `ai_playerbot_texts` SET `text_loc3`='Nur %cost_gold für %item_formatted_link, flüster mir für Details!' WHERE `id`=1077; -UPDATE `ai_playerbot_texts` SET `text_loc3`='%item_formatted_link gibts für %cost_gold, lasst uns handeln!' WHERE `id`=1078; -UPDATE `ai_playerbot_texts` SET `text_loc3`='Verkaufe %item_formatted_link für %cost_gold, flüster mir für Infos.' WHERE `id`=1079; -UPDATE `ai_playerbot_texts` SET `text_loc3`='Will %item_formatted_link verkaufen, für %cost_gold gehört es dir!' WHERE `id`=1080; -UPDATE `ai_playerbot_texts` SET `text_loc3`='Verkaufe %item_formatted_link, nur %cost_gold.' WHERE `id`=1081; -UPDATE `ai_playerbot_texts` SET `text_loc3`='Hab %item_formatted_link für %cost_gold, machen wir nen Deal!' WHERE `id`=1082; -UPDATE `ai_playerbot_texts` SET `text_loc3`='Verkaufe %item_formatted_link, für %cost_gold nimmst du es mit!' WHERE `id`=1083; -UPDATE `ai_playerbot_texts` SET `text_loc3`='VK: %item_formatted_link für %cost_gold, Interesse?' WHERE `id`=1084; -UPDATE `ai_playerbot_texts` SET `text_loc3`='Muss %item_formatted_link schnell loswerden, %cost_gold.' WHERE `id`=1085; -UPDATE `ai_playerbot_texts` SET `text_loc3`='Verkaufe %item_formatted_link für %cost_gold, bester Preis weit und breit!' WHERE `id`=1086; -UPDATE `ai_playerbot_texts` SET `text_loc3`='%item_formatted_link für %cost_gold, machen wirs fix!' WHERE `id`=1088; -UPDATE `ai_playerbot_texts` SET `text_loc3`='Verkaufe %item_formatted_link für %cost_gold, schnappt zu bevor alles weg ist!' WHERE `id`=1089; -UPDATE `ai_playerbot_texts` SET `text_loc3`='Willst %item_formatted_link? Für %cost_gold kriegst du eins!' WHERE `id`=1090; -UPDATE `ai_playerbot_texts` SET `text_loc3`='Ich habe auch %quest_links' WHERE `id`=1093; -UPDATE `ai_playerbot_texts` SET `text_loc3`='Ich habe auch %quest_links, bin gerade in %zone_name' WHERE `id`=1094; -UPDATE `ai_playerbot_texts` SET `text_loc3`='%other_name, ich habe auch %quest_links' WHERE `id`=1095; -UPDATE `ai_playerbot_texts` SET `text_loc3`='%other_name, ich habe auch %quest_links, bin gerade in %zone_name' WHERE `id`=1096; -UPDATE `ai_playerbot_texts` SET `text_loc3`='Bin bereit für %quest_links, bin gerade in %zone_name' WHERE `id`=1097; -UPDATE `ai_playerbot_texts` SET `text_loc3`='Bin bereit für %quest_links, bin %my_role' WHERE `id`=1098; -UPDATE `ai_playerbot_texts` SET `text_loc3`='%other_name, bin bereit für %quest_links, bin gerade in %zone_name' WHERE `id`=1099; -UPDATE `ai_playerbot_texts` SET `text_loc3`='%other_name, bin bereit für %quest_links, bin %my_role' WHERE `id`=1100; -UPDATE `ai_playerbot_texts` SET `text_loc3`='Braucht wer %quest_links? Bin in %zone_name.' WHERE `id`=1101; -UPDATE `ai_playerbot_texts` SET `text_loc3`='Suche mehr %quest_links in %zone_name.' WHERE `id`=1102; -UPDATE `ai_playerbot_texts` SET `text_loc3`='Will jemand %quest_links mit mir in %zone_name machen?' WHERE `id`=1104; -UPDATE `ai_playerbot_texts` SET `text_loc3`='Habe %quest_links, suche Gruppe in %zone_name.' WHERE `id`=1105; -UPDATE `ai_playerbot_texts` SET `text_loc3`='%my_role sucht Gruppe, um %quest_links in %zone_name zu erledigen.' WHERE `id`=1108; -UPDATE `ai_playerbot_texts` SET `text_loc3`='Ich brauche %quest_links, ist jemand in %zone_name frei?' WHERE `id`=1109; -UPDATE `ai_playerbot_texts` SET `text_loc3`='Mach %quest_links in %zone_name, brauche mehr Hilfe.' WHERE `id`=1111; -UPDATE `ai_playerbot_texts` SET `text_loc3`='Gibt’s %my_role mit Interesse an %quest_links in %zone_name?' WHERE `id`=1112; -UPDATE `ai_playerbot_texts` SET `text_loc3`='Hilfe benötigt für %quest_links in %zone_name, mir ist langweilig.' WHERE `id`=1113; -UPDATE `ai_playerbot_texts` SET `text_loc3`='Habe %quest_links, %my_role in %zone_name, wer ist dabei?' WHERE `id`=1114; -UPDATE `ai_playerbot_texts` SET `text_loc3`='Macht grad jemand %quest_links? Bin in %zone_name.' WHERE `id`=1116; -UPDATE `ai_playerbot_texts` SET `text_loc3`='%quest_links offen in %zone_name, wer möchte?' WHERE `id`=1117; -UPDATE `ai_playerbot_texts` SET `text_loc3`='Bereit für %quest_links in %zone_name, suche Gruppe.' WHERE `id`=1118; -UPDATE `ai_playerbot_texts` SET `text_loc3`='Brauche %quest_links und Gesellschaft, jemand in %zone_name?' WHERE `id`=1119; -UPDATE `ai_playerbot_texts` SET `text_loc3`='Wer kommt mit mir nach %zone_name für %quest_links?' WHERE `id`=1120; -UPDATE `ai_playerbot_texts` SET `text_loc3`='Irgend ein %my_role frei für %quest_links in %zone_name?' WHERE `id`=1121; -UPDATE `ai_playerbot_texts` SET `text_loc3`='Habe %quest_links und bin %my_role, brauche mehr Leute in %zone_name.' WHERE `id`=1122; -UPDATE `ai_playerbot_texts` SET `text_loc3`='Bin %my_role und habe %quest_links, suche Gruppe in %zone_name.' WHERE `id`=1124; -UPDATE `ai_playerbot_texts` SET `text_loc3`='Brauche Hilfe bei %quest_links in %zone_name, ist ein %my_role frei?' WHERE `id`=1125; -UPDATE `ai_playerbot_texts` SET `text_loc3`='Hat ein %my_role Lust, %quest_links mit mir in %zone_name zu machen?' WHERE `id`=1126; -UPDATE `ai_playerbot_texts` SET `text_loc3`='Lasst uns %quest_links zusammen in %zone_name abschließen.' WHERE `id`=1127; -UPDATE `ai_playerbot_texts` SET `text_loc3`='Bin in %zone_name und habe %quest_links, wer will mit?' WHERE `id`=1128; -UPDATE `ai_playerbot_texts` SET `text_loc3`='Suche mehr %my_role, um %quest_links in %zone_name abzuschließen.' WHERE `id`=1129; -UPDATE `ai_playerbot_texts` SET `text_loc3`='Habe %quest_links und brauche %my_role in %zone_name.' WHERE `id`=1130; -UPDATE `ai_playerbot_texts` SET `text_loc3`='Wer hat Bock auf %quest_links? Ich bin %my_role in %zone_name.' WHERE `id`=1131; -UPDATE `ai_playerbot_texts` SET `text_loc3`='Suche Gruppe für %quest_links in %zone_name, %my_role gebraucht.' WHERE `id`=1132; -UPDATE `ai_playerbot_texts` SET `text_loc3`='Braucht wer Hilfe bei %quest_links in %zone_name? Ich bin %my_role.' WHERE `id`=1133; -UPDATE `ai_playerbot_texts` SET `text_loc3`='Habe %quest_links offen, brauche %my_role in %zone_name.' WHERE `id`=1134; -UPDATE `ai_playerbot_texts` SET `text_loc3`='Bin in %zone_name und suche Hilfe für %quest_links, wer ist dabei?' WHERE `id`=1135; -UPDATE `ai_playerbot_texts` SET `text_loc3`='Suche Gruppe, um %quest_links in %zone_name fertig zu machen.' WHERE `id`=1136; -UPDATE `ai_playerbot_texts` SET `text_loc3`='Sucht jemand %quest_links in %zone_name? Ich bin %my_role.' WHERE `id`=1137; -UPDATE `ai_playerbot_texts` SET `text_loc3`='Machen wir %quest_links zusammen! %zone_name wartet.' WHERE `id`=1138; -UPDATE `ai_playerbot_texts` SET `text_loc3`='Brauche Gruppe für %quest_links, %zone_name - wer hat Interesse?' WHERE `id`=1139; -UPDATE `ai_playerbot_texts` SET `text_loc3`='Wer will für %quest_links dazukommen? Bin in %zone_name.' WHERE `id`=1140; -UPDATE `ai_playerbot_texts` SET `text_loc3`='Bin in %zone_name, suche Leute zum Abschließen von %quest_links.' WHERE `id`=1141; -UPDATE `ai_playerbot_texts` SET `text_loc3`='Brauche Hilfe bei %quest_links in %zone_name, ein %my_role da?' WHERE `id`=1142; -UPDATE `ai_playerbot_texts` SET `text_loc3`='Suche Gruppe, um %quest_links zu beenden, %zone_name da steppt der Bär.' WHERE `id`=1143; -UPDATE `ai_playerbot_texts` SET `text_loc3`='Will jemand bei %quest_links in %zone_name helfen? Ich bin %my_role.' WHERE `id`=1144; -UPDATE `ai_playerbot_texts` SET `text_loc3`='Suche %my_role, um %quest_links in %zone_name mitzumachen.' WHERE `id`=1145; -UPDATE `ai_playerbot_texts` SET `text_loc3`='Hab %quest_links, %my_role für %zone_name gesucht.' WHERE `id`=1146; -UPDATE `ai_playerbot_texts` SET `text_loc3`='Will %quest_links in %zone_name fertig bekommen, brauche mehr Leute.' WHERE `id`=1147; -UPDATE `ai_playerbot_texts` SET `text_loc3`='Brauche Hilfe bei %quest_links, wer ist in %zone_name unterwegs?' WHERE `id`=1148; -UPDATE `ai_playerbot_texts` SET `text_loc3`='Brauche mehr Leute für %quest_links, %zone_name.' WHERE `id`=1149; -UPDATE `ai_playerbot_texts` SET `text_loc3`='Suche Gruppe in %zone_name, um %quest_links abzuschließen.' WHERE `id`=1150; -UPDATE `ai_playerbot_texts` SET `text_loc3`='Wer will %quest_links in %zone_name machen? Bin startklar.' WHERE `id`=1151; -UPDATE `ai_playerbot_texts` SET `text_loc3`='Will wer für %quest_links dazustoßen? Ich bin %my_role in %zone_name.' WHERE `id`=1152; -UPDATE `ai_playerbot_texts` SET `text_loc3`='Suche %my_role für %quest_links in %zone_name.' WHERE `id`=1153; -UPDATE `ai_playerbot_texts` SET `text_loc3`='Bin in %zone_name, braucht wer Hilfe bei %quest_links?' WHERE `id`=1154; -UPDATE `ai_playerbot_texts` SET `text_loc3`='Brauche mehr für %quest_links in %zone_name, bin allein nicht stark genug?' WHERE `id`=1155; -UPDATE `ai_playerbot_texts` SET `text_loc3`='Brauche Hilfe bei %quest_links in %zone_name, wer hat Bock?' WHERE `id`=1156; -UPDATE `ai_playerbot_texts` SET `text_loc3`='Suche mehr Leute, um %quest_links zu beenden, %zone_name.' WHERE `id`=1157; -UPDATE `ai_playerbot_texts` SET `text_loc3`='Hey, bin bei %quest_links dabei' WHERE `id`=1158; -UPDATE `ai_playerbot_texts` SET `text_loc3`='Hey, ich habe auch %quest_links' WHERE `id`=1160; -UPDATE `ai_playerbot_texts` SET `text_loc3`='Hey %other_name, bin bei %quest_links dabei' WHERE `id`=1161; -UPDATE `ai_playerbot_texts` SET `text_loc3`='Hey %other_name, ich könnte %quest_links mit dir machen' WHERE `id`=1162; -UPDATE `ai_playerbot_texts` SET `text_loc3`='Bock, für %quest_links eine Gruppe zu bilden?' WHERE `id`=1164; -UPDATE `ai_playerbot_texts` SET `text_loc3`='Bin bereit für %quest_links, bin gerade in %zone_name' WHERE `id`=1165; -UPDATE `ai_playerbot_texts` SET `text_loc3`='Bin bereit für %quest_links, bin %my_role' WHERE `id`=1166; -UPDATE `ai_playerbot_texts` SET `text_loc3`='Hey, ich hab Bock auf %quest_links' WHERE `id`=1167; -UPDATE `ai_playerbot_texts` SET `text_loc3`='Ich kann bei %quest_links helfen, wenn ihr wollt' WHERE `id`=1168; -UPDATE `ai_playerbot_texts` SET `text_loc3`='Lasst uns %quest_links zusammen machen!' WHERE `id`=1169; -UPDATE `ai_playerbot_texts` SET `text_loc3`='Ich hab auch %quest_links offen' WHERE `id`=1170; -UPDATE `ai_playerbot_texts` SET `text_loc3`='Bin für %quest_links verfügbar, wenn ihr wollt' WHERE `id`=1171; -UPDATE `ai_playerbot_texts` SET `text_loc3`='Bin bei %quest_links dabei, sagt Bescheid' WHERE `id`=1172; -UPDATE `ai_playerbot_texts` SET `text_loc3`='Sucht wer %quest_links? Bin in %zone_name' WHERE `id`=1173; -UPDATE `ai_playerbot_texts` SET `text_loc3`='Hey, ich brauche auch %quest_links, lets go' WHERE `id`=1174; -UPDATE `ai_playerbot_texts` SET `text_loc3`='Hab %quest_links, will wer mit?' WHERE `id`=1175; -UPDATE `ai_playerbot_texts` SET `text_loc3`='Könnte %quest_links brauchen, machen wirs' WHERE `id`=1176; -UPDATE `ai_playerbot_texts` SET `text_loc3`='Hey, willst du für %quest_links dazukommen?' WHERE `id`=1177; -UPDATE `ai_playerbot_texts` SET `text_loc3`='Ich kann bei %quest_links helfen, wenn ihr wollt' WHERE `id`=1178; -UPDATE `ai_playerbot_texts` SET `text_loc3`='Hey %other_name, Bock auf %quest_links?' WHERE `id`=1179; -UPDATE `ai_playerbot_texts` SET `text_loc3`='Willst du für %quest_links gruppen, %other_name?' WHERE `id`=1180; -UPDATE `ai_playerbot_texts` SET `text_loc3`='Lass %quest_links zusammen machen, %other_name' WHERE `id`=1181; -UPDATE `ai_playerbot_texts` SET `text_loc3`='Ich bin %my_role und ready für %quest_links' WHERE `id`=1182; -UPDATE `ai_playerbot_texts` SET `text_loc3`='Kann für %quest_links joinen, %my_role hier' WHERE `id`=1183; -UPDATE `ai_playerbot_texts` SET `text_loc3`='Bin bereit für %quest_links, %my_role!' WHERE `id`=1184; -UPDATE `ai_playerbot_texts` SET `text_loc3`='Suche %my_role für %quest_links' WHERE `id`=1185; -UPDATE `ai_playerbot_texts` SET `text_loc3`='Braucht wer Hilfe bei %quest_links?' WHERE `id`=1186; -UPDATE `ai_playerbot_texts` SET `text_loc3`='Wer ist noch bei %quest_links dabei?' WHERE `id`=1187; -UPDATE `ai_playerbot_texts` SET `text_loc3`='Jemand bereit für %quest_links in %zone_name?' WHERE `id`=1188; -UPDATE `ai_playerbot_texts` SET `text_loc3`='Hab %quest_links, %my_role unterwegs' WHERE `id`=1189; -UPDATE `ai_playerbot_texts` SET `text_loc3`='Ich brauch %quest_links auch, wer ist dabei?' WHERE `id`=1190; -UPDATE `ai_playerbot_texts` SET `text_loc3`='Grinde %quest_links, wer hilft?' WHERE `id`=1191; -UPDATE `ai_playerbot_texts` SET `text_loc3`='Bin bereit für %quest_links, noch wer?' WHERE `id`=1192; -UPDATE `ai_playerbot_texts` SET `text_loc3`='Kann jemand für %quest_links dazukommen?' WHERE `id`=1193; -UPDATE `ai_playerbot_texts` SET `text_loc3`='Suche Hilfe bei %quest_links, %my_role hier' WHERE `id`=1194; -UPDATE `ai_playerbot_texts` SET `text_loc3`='Ich kann bei %quest_links aushelfen, braucht mich wer?' WHERE `id`=1195; -UPDATE `ai_playerbot_texts` SET `text_loc3`='Macht noch wer %quest_links? Los gehts' WHERE `id`=1196; -UPDATE `ai_playerbot_texts` SET `text_loc3`='Braucht wer Hilfe bei %quest_links? %my_role hier' WHERE `id`=1197; -UPDATE `ai_playerbot_texts` SET `text_loc3`='Wer hat Bock auf %quest_links in %zone_name?' WHERE `id`=1198; -UPDATE `ai_playerbot_texts` SET `text_loc3`='Kann für %quest_links joinen, wenn ihr wollt' WHERE `id`=1199; -UPDATE `ai_playerbot_texts` SET `text_loc3`='Suche einen %my_role für %quest_links' WHERE `id`=1200; -UPDATE `ai_playerbot_texts` SET `text_loc3`='Ist ein %my_role für %quest_links am Start?' WHERE `id`=1201; -UPDATE `ai_playerbot_texts` SET `text_loc3`='Ich habe %quest_links, will wer mit?' WHERE `id`=1202; -UPDATE `ai_playerbot_texts` SET `text_loc3`='Hey %other_name, Bock auf %quest_links?' WHERE `id`=1203; -UPDATE `ai_playerbot_texts` SET `text_loc3`='Lass uns für %quest_links gruppen, %other_name' WHERE `id`=1204; -UPDATE `ai_playerbot_texts` SET `text_loc3`='Ich brauche %quest_links, wer macht mit?' WHERE `id`=1205; -UPDATE `ai_playerbot_texts` SET `text_loc3`='Ich brauche auch %quest_links, ist noch jemand da?' WHERE `id`=1206; -UPDATE `ai_playerbot_texts` SET `text_loc3`='Suche %quest_links in %zone_name, wer ist dabei?' WHERE `id`=1207; -UPDATE `ai_playerbot_texts` SET `text_loc3`='Ist jemand frei für %quest_links?' WHERE `id`=1208; -UPDATE `ai_playerbot_texts` SET `text_loc3`='Hey, ich könnte bei %quest_links dazustoßen!' WHERE `id`=1209; -UPDATE `ai_playerbot_texts` SET `text_loc3`='Ich habe auch %quest_links, lass uns gruppen' WHERE `id`=1210; -UPDATE `ai_playerbot_texts` SET `text_loc3`='Ich habe %quest_links zu erledigen, willst du mit?' WHERE `id`=1211; -UPDATE `ai_playerbot_texts` SET `text_loc3`='Ist ein %my_role für %quest_links in %zone_name frei?' WHERE `id`=1212; -UPDATE `ai_playerbot_texts` SET `text_loc3`='Lass uns %quest_links zusammen abschließen, %other_name' WHERE `id`=1213; -UPDATE `ai_playerbot_texts` SET `text_loc3`='Ich bin bei %quest_links dabei, will noch wer mit?' WHERE `id`=1214; -UPDATE `ai_playerbot_texts` SET `text_loc3`='Wer macht noch %quest_links? Ich bin dabei' WHERE `id`=1215; -UPDATE `ai_playerbot_texts` SET `text_loc3`='Ich habe %quest_links in %zone_name, braucht jemand Hilfe?' WHERE `id`=1216; -UPDATE `ai_playerbot_texts` SET `text_loc3`='%other_name, könnte dir %formatted_item_links verkaufen' WHERE `id`=1217; -UPDATE `ai_playerbot_texts` SET `text_loc3`='Könnte eventuell %formatted_item_links verkaufen' WHERE `id`=1218; -UPDATE `ai_playerbot_texts` SET `text_loc3`='Denke, ich könnte %formatted_item_links verkaufen' WHERE `id`=1219; -UPDATE `ai_playerbot_texts` SET `text_loc3`='%other_name, könnte eventuell %formatted_item_links verkaufen' WHERE `id`=1220; -UPDATE `ai_playerbot_texts` SET `text_loc3`='%other_name, ich denke, ich könnte %formatted_item_links verkaufen' WHERE `id`=1221; -UPDATE `ai_playerbot_texts` SET `text_loc3`='Ich könnte dir %formatted_item_links verkaufen' WHERE `id`=1222; -UPDATE `ai_playerbot_texts` SET `text_loc3`='Hey, habe %formatted_item_links zu verkaufen' WHERE `id`=1223; -UPDATE `ai_playerbot_texts` SET `text_loc3`='Hey, könnte eventuell %formatted_item_links verkaufen' WHERE `id`=1224; -UPDATE `ai_playerbot_texts` SET `text_loc3`='Ich könnte dir %formatted_item_links verkaufen' WHERE `id`=1225; -UPDATE `ai_playerbot_texts` SET `text_loc3`='Hey, habe %formatted_item_links zu verkaufen' WHERE `id`=1226; -UPDATE `ai_playerbot_texts` SET `text_loc3`='Hey, ich könnte eventuell %formatted_item_links verkaufen' WHERE `id`=1227; -UPDATE `ai_playerbot_texts` SET `text_loc3`='Ich habe %formatted_item_links, Interesse?' WHERE `id`=1228; -UPDATE `ai_playerbot_texts` SET `text_loc3`='Will %formatted_item_links verkaufen, was bietest du?' WHERE `id`=1229; -UPDATE `ai_playerbot_texts` SET `text_loc3`='Ich kann dir %formatted_item_links zu einem fairem Preis verkaufen' WHERE `id`=1230; -UPDATE `ai_playerbot_texts` SET `text_loc3`='Ich habe %formatted_item_links auf Lager, was zahlst du?' WHERE `id`=1231; -UPDATE `ai_playerbot_texts` SET `text_loc3`='Verkaufe %formatted_item_links für %cost_gold, sag Bescheid bei Interesse' WHERE `id`=1232; -UPDATE `ai_playerbot_texts` SET `text_loc3`='Habe %formatted_item_links zu verkaufen, was zahlst du?' WHERE `id`=1233; -UPDATE `ai_playerbot_texts` SET `text_loc3`='Ich habe %formatted_item_links, wie klingt %cost_gold für dich?' WHERE `id`=1234; -UPDATE `ai_playerbot_texts` SET `text_loc3`='Verkaufe %formatted_item_links für %cost_gold, flüster mir bei Interesse' WHERE `id`=1235; -UPDATE `ai_playerbot_texts` SET `text_loc3`='Ich habe %formatted_item_links, meld dich bei Interesse' WHERE `id`=1236; -UPDATE `ai_playerbot_texts` SET `text_loc3`='Gebe %formatted_item_links ab, wenn das Angebot passt' WHERE `id`=1237; -UPDATE `ai_playerbot_texts` SET `text_loc3`='Will %formatted_item_links loswerden, flüster mir' WHERE `id`=1238; -UPDATE `ai_playerbot_texts` SET `text_loc3`='Habe %formatted_item_links für %cost_gold, kaufst du?' WHERE `id`=1239; -UPDATE `ai_playerbot_texts` SET `text_loc3`='Verkaufe %formatted_item_links, lass uns handeln' WHERE `id`=1240; -UPDATE `ai_playerbot_texts` SET `text_loc3`='Hey, habe %formatted_item_links für %cost_gold' WHERE `id`=1241; -UPDATE `ai_playerbot_texts` SET `text_loc3`='Kann dich mit %formatted_item_links versorgen, nenn deinen Preis' WHERE `id`=1242; -UPDATE `ai_playerbot_texts` SET `text_loc3`='Ich habe %formatted_item_links verfügbar, sag Bescheid bei Interesse' WHERE `id`=1243; -UPDATE `ai_playerbot_texts` SET `text_loc3`='Verkaufe %formatted_item_links, machen wir Business' WHERE `id`=1244; -UPDATE `ai_playerbot_texts` SET `text_loc3`='Ich habe %formatted_item_links, macht mir ein Angebot' WHERE `id`=1245; -UPDATE `ai_playerbot_texts` SET `text_loc3`='Ich habe %formatted_item_links, schreib mir, wenn du kaufen willst' WHERE `id`=1246; -UPDATE `ai_playerbot_texts` SET `text_loc3`='Kann dir %formatted_item_links für %cost_gold anbieten' WHERE `id`=1247; -UPDATE `ai_playerbot_texts` SET `text_loc3`='Ich habe %formatted_item_links zu verkaufen, schreib mir für den Preis' WHERE `id`=1248; -UPDATE `ai_playerbot_texts` SET `text_loc3`='Verkaufe %formatted_item_links, greif zu solange es heiß ist' WHERE `id`=1249; -UPDATE `ai_playerbot_texts` SET `text_loc3`='Verkaufe %formatted_item_links, nen besseren Deal findet ihr nicht' WHERE `id`=1250; -UPDATE `ai_playerbot_texts` SET `text_loc3`='Ich habe %formatted_item_links zu verkaufen, was zahlst du?' WHERE `id`=1251; -UPDATE `ai_playerbot_texts` SET `text_loc3`='Verkaufe %formatted_item_links, Preis auf Anfrage per flüstern' WHERE `id`=1252; -UPDATE `ai_playerbot_texts` SET `text_loc3`='Interesse an %formatted_item_links? Ich verkaufe welche' WHERE `id`=1253; -UPDATE `ai_playerbot_texts` SET `text_loc3`='Ich habe %formatted_item_links, PN für Preis' WHERE `id`=1254; -UPDATE `ai_playerbot_texts` SET `text_loc3`='Verkaufe %formatted_item_links für %cost_gold, meldet euch' WHERE `id`=1255; -UPDATE `ai_playerbot_texts` SET `text_loc3`='Verkaufe %formatted_item_links, macht mir ein Angebot' WHERE `id`=1256; -UPDATE `ai_playerbot_texts` SET `text_loc3`='Habe %formatted_item_links, schreib mir für Details' WHERE `id`=1257; -UPDATE `ai_playerbot_texts` SET `text_loc3`='Hey, habe %formatted_item_links, meldet euch bei Interesse' WHERE `id`=1258; -UPDATE `ai_playerbot_texts` SET `text_loc3`='Verkaufe %formatted_item_links, machen wir nen Deal?' WHERE `id`=1259; -UPDATE `ai_playerbot_texts` SET `text_loc3`='Verkaufe %formatted_item_links, sag Bescheid wenn du willst' WHERE `id`=1260; -UPDATE `ai_playerbot_texts` SET `text_loc3`='Ich habe %formatted_item_links, ich mach dir nen guten Preis' WHERE `id`=1261; -UPDATE `ai_playerbot_texts` SET `text_loc3`='Ich habe %formatted_item_links, mit gutem Angebot gehörts dir' WHERE `id`=1262; -UPDATE `ai_playerbot_texts` SET `text_loc3`='Verkaufe %formatted_item_links, bin offen für Angebote' WHERE `id`=1263; -UPDATE `ai_playerbot_texts` SET `text_loc3`='Ich habe %formatted_item_links, melde dich bei Interesse' WHERE `id`=1264; -UPDATE `ai_playerbot_texts` SET `text_loc3`='Ich kann dir %formatted_item_links zu einem guten Preis verkaufen' WHERE `id`=1265; -UPDATE `ai_playerbot_texts` SET `text_loc3`='Ich habe %formatted_item_links zu verkaufen, nehme alle Angebote an' WHERE `id`=1266; -UPDATE `ai_playerbot_texts` SET `text_loc3`='Habe %formatted_item_links im Verkauf, flüster mir für Details' WHERE `id`=1267; -UPDATE `ai_playerbot_texts` SET `text_loc3`='Habe %formatted_item_links im Verkauf, macht mir ein Angebot' WHERE `id`=1268; -UPDATE `ai_playerbot_texts` SET `text_loc3`='Ich habe %formatted_item_links, was zahlt ihr?' WHERE `id`=1269; -UPDATE `ai_playerbot_texts` SET `text_loc3`='Verkaufe %formatted_item_links, schreib mir für mehr Infos' WHERE `id`=1270; -UPDATE `ai_playerbot_texts` SET `text_loc3`='Ich habe %formatted_item_links, sagt Bescheid bei Interesse' WHERE `id`=1271; -UPDATE `ai_playerbot_texts` SET `text_loc3`='Verkaufe %formatted_item_links, lass uns über Zahlen reden' WHERE `id`=1272; -UPDATE `ai_playerbot_texts` SET `text_loc3`='Ich kann dir %formatted_item_links verkaufen, was bietest du?' WHERE `id`=1273; -UPDATE `ai_playerbot_texts` SET `text_loc3`='Hey, habe %formatted_item_links zu verkaufen, meldet euch bei Interesse' WHERE `id`=1274; -UPDATE `ai_playerbot_texts` SET `text_loc3`='Ich habe %formatted_item_links, PN für den Preis' WHERE `id`=1275; -UPDATE `ai_playerbot_texts` SET `text_loc3`='Verkaufe %formatted_item_links, bin offen für Angebote' WHERE `id`=1276; -UPDATE `ai_playerbot_texts` SET `text_loc3`='Ich habe %formatted_item_links, schreibt mir einfach' WHERE `id`=1277; -UPDATE `ai_playerbot_texts` SET `text_loc3`='Kann %formatted_item_links anbieten, sagt Bescheid bei Interesse' WHERE `id`=1278; -UPDATE `ai_playerbot_texts` SET `text_loc3`='Verkaufe %formatted_item_links, bitte vernünftige Angebote' WHERE `id`=1279; -UPDATE `ai_playerbot_texts` SET `text_loc3`='Ich habe %formatted_item_links, meldet euch für mehr Infos' WHERE `id`=1280; -UPDATE `ai_playerbot_texts` SET `text_loc3`='Ich habe %formatted_item_links, macht mir ein Angebot' WHERE `id`=1281; -UPDATE `ai_playerbot_texts` SET `text_loc3`='Verkaufe %formatted_item_links, schreibt mir bei Interesse' WHERE `id`=1282; -UPDATE `ai_playerbot_texts` SET `text_loc3`='Habe %formatted_item_links zu verkaufen, lass uns handeln' WHERE `id`=1283; -UPDATE `ai_playerbot_texts` SET `text_loc3`='Ich habe %formatted_item_links, sag Bescheid wenn du willst' WHERE `id`=1284; -UPDATE `ai_playerbot_texts` SET `text_loc3`='Ich kann diese Quest nicht annehmen' WHERE `id`=1287; -UPDATE `ai_playerbot_texts` SET `text_loc3`='Ich kann nicht mit dem Questgeber sprechen' WHERE `id`=1288; -UPDATE `ai_playerbot_texts` SET `text_loc3`='Ich habe %quest bereits abgeschlossen' WHERE `id`=1289; -UPDATE `ai_playerbot_texts` SET `text_loc3`='Ich habe %quest bereits' WHERE `id`=1290; -UPDATE `ai_playerbot_texts` SET `text_loc3`='Ich kann %quest nicht annehmen' WHERE `id`=1291; -UPDATE `ai_playerbot_texts` SET `text_loc3`='Ich kann %quest nicht annehmen, mein Questlog ist voll' WHERE `id`=1292; -UPDATE `ai_playerbot_texts` SET `text_loc3`='Ich kann %quest nicht annehmen, meine Tasche ist voll' WHERE `id`=1293; -UPDATE `ai_playerbot_texts` SET `text_loc3`='Ich habe %quest angenommen' WHERE `id`=1294; -UPDATE `ai_playerbot_texts` SET `text_loc3`='Ich habe die Quest %quest nicht abgeschlossen' WHERE `id`=1295; -UPDATE `ai_playerbot_texts` SET `text_loc3`='Quest %quest verfügbar' WHERE `id`=1296; -UPDATE `ai_playerbot_texts` SET `text_loc3`='Ich habe die Quest %quest vergeigt' WHERE `id`=1297; -UPDATE `ai_playerbot_texts` SET `text_loc3`='Ich kann die Quest %quest nicht abgeben' WHERE `id`=1298; -UPDATE `ai_playerbot_texts` SET `text_loc3`='Ich habe die Quest %quest abgeschlossen' WHERE `id`=1299; -UPDATE `ai_playerbot_texts` SET `text_loc3`='Ich habe die Quest %quest abgeschlossen und %item erhalten' WHERE `id`=1300; -UPDATE `ai_playerbot_texts` SET `text_loc3`='Welche Belohnung soll ich für die Quest %quest nehmen? %rewards' WHERE `id`=1301; -UPDATE `ai_playerbot_texts` SET `text_loc3`='Okay, ich nehme %item als Belohnung' WHERE `id`=1302; -UPDATE `ai_playerbot_texts` SET `text_loc3`='Hi' WHERE `id`=1305; -UPDATE `ai_playerbot_texts` SET `text_loc3`='Hallo zusammen!' WHERE `id`=1307; -UPDATE `ai_playerbot_texts` SET `text_loc3`='Hallo, geh vor!' WHERE `id`=1309; -UPDATE `ai_playerbot_texts` SET `text_loc3`='Hi, geh vor!' WHERE `id`=1310; -UPDATE `ai_playerbot_texts` SET `text_loc3`='Hey %player, willst du in meine Gruppe?' WHERE `id`=1311; -UPDATE `ai_playerbot_texts` SET `text_loc3`='Hey %player, kommst du in meine Gruppe?' WHERE `id`=1312; -UPDATE `ai_playerbot_texts` SET `text_loc3`='Logout abgebrochen!' WHERE `id`=1313; -UPDATE `ai_playerbot_texts` SET `text_loc3`='Ich logge mich aus!' WHERE `id`=1314; -UPDATE `ai_playerbot_texts` SET `text_loc3`='Was war das, %s?' WHERE `id`=1318; -UPDATE `ai_playerbot_texts` SET `text_loc3`='Bin nicht sicher, ob ich dich verstehe, %s?' WHERE `id`=1319; -UPDATE `ai_playerbot_texts` SET `text_loc3`='äh... keine Ahnung, wovon du redest' WHERE `id`=1320; -UPDATE `ai_playerbot_texts` SET `text_loc3`='whaaaa?' WHERE `id`=1322; -UPDATE `ai_playerbot_texts` SET `text_loc3`='hä?' WHERE `id`=1323; -UPDATE `ai_playerbot_texts` SET `text_loc3`='was?' WHERE `id`=1324; -UPDATE `ai_playerbot_texts` SET `text_loc3`='redest du grade?' WHERE `id`=1325; -UPDATE `ai_playerbot_texts` SET `text_loc3`='mir egal, Digga' WHERE `id`=1326; -UPDATE `ai_playerbot_texts` SET `text_loc3`='da bin ich raus' WHERE `id`=1327; -UPDATE `ai_playerbot_texts` SET `text_loc3`='Konzentrier dich aufs Spiel, %s!' WHERE `id`=1330; -UPDATE `ai_playerbot_texts` SET `text_loc3`='Mit dir zu chatten, %s, ist so großartig! Wollte dich immer schon treffen' WHERE `id`=1331; -UPDATE `ai_playerbot_texts` SET `text_loc3`='Diese Chatnachrichten machen mich fertig! Fühlt sich an, als würde ich euch alle kennen!' WHERE `id`=1332; -UPDATE `ai_playerbot_texts` SET `text_loc3`='JA SICHER! HAHA KLAR!!!' WHERE `id`=1333; -UPDATE `ai_playerbot_texts` SET `text_loc3`='Ich glaub dir!!!' WHERE `id`=1334; -UPDATE `ai_playerbot_texts` SET `text_loc3`='Okay, ähm, lol' WHERE `id`=1335; -UPDATE `ai_playerbot_texts` SET `text_loc3`='Hey %s... ach egal!' WHERE `id`=1337; -UPDATE `ai_playerbot_texts` SET `text_loc3`='Wovon redest du, %s' WHERE `id`=1338; -UPDATE `ai_playerbot_texts` SET `text_loc3`='Wer hat das gesagt? Ich fühl mich angesprochen' WHERE `id`=1339; -UPDATE `ai_playerbot_texts` SET `text_loc3`='wtf, worüber redet ihr alle' WHERE `id`=1340; -UPDATE `ai_playerbot_texts` SET `text_loc3`='ehrlich jetzt, kein Witz' WHERE `id`=1341; -UPDATE `ai_playerbot_texts` SET `text_loc3`='du bekommst gar nix' WHERE `id`=1342; -UPDATE `ai_playerbot_texts` SET `text_loc3`='Plus Aura!!!' WHERE `id`=1343; -UPDATE `ai_playerbot_texts` SET `text_loc3`='thx!' WHERE `id`=1344; -UPDATE `ai_playerbot_texts` SET `text_loc3`='jup' WHERE `id`=1346; -UPDATE `ai_playerbot_texts` SET `text_loc3`='f' WHERE `id`=1347; -UPDATE `ai_playerbot_texts` SET `text_loc3`='%s, kein Scheiß xD' WHERE `id`=1348; -UPDATE `ai_playerbot_texts` SET `text_loc3`='warum ist das so' WHERE `id`=1349; -UPDATE `ai_playerbot_texts` SET `text_loc3`='ROFL' WHERE `id`=1350; -UPDATE `ai_playerbot_texts` SET `text_loc3`='dachte, ich halt besser die Klappe, der Chat hat mich wieder verwirrt' WHERE `id`=1351; -UPDATE `ai_playerbot_texts` SET `text_loc3`='ich kann richtig eifersüchtig werden' WHERE `id`=1352; -UPDATE `ai_playerbot_texts` SET `text_loc3`='%s, du hörst den triefenden Sarkasmus in meinem text_loc3 nicht' WHERE `id`=1353; -UPDATE `ai_playerbot_texts` SET `text_loc3`='er meinte „kein Ding“, passt schon' WHERE `id`=1354; -UPDATE `ai_playerbot_texts` SET `text_loc3`='Ja, %s' WHERE `id`=1356; -UPDATE `ai_playerbot_texts` SET `text_loc3`='interessant...' WHERE `id`=1357; -UPDATE `ai_playerbot_texts` SET `text_loc3`='lol' WHERE `id`=1358; -UPDATE `ai_playerbot_texts` SET `text_loc3`='%s, fick dich, Mann :D' WHERE `id`=1359; -UPDATE `ai_playerbot_texts` SET `text_loc3`=':^)' WHERE `id`=1360; -UPDATE `ai_playerbot_texts` SET `text_loc3`='thx' WHERE `id`=1361; -UPDATE `ai_playerbot_texts` SET `text_loc3`='%s, gut gesagt' WHERE `id`=1362; -UPDATE `ai_playerbot_texts` SET `text_loc3`='yay' WHERE `id`=1363; -UPDATE `ai_playerbot_texts` SET `text_loc3`='ja' WHERE `id`=1364; -UPDATE `ai_playerbot_texts` SET `text_loc3`='ooooooh' WHERE `id`=1365; -UPDATE `ai_playerbot_texts` SET `text_loc3`='hmm' WHERE `id`=1366; -UPDATE `ai_playerbot_texts` SET `text_loc3`='ja klar' WHERE `id`=1367; -UPDATE `ai_playerbot_texts` SET `text_loc3`='mir wird schlecht, wtf' WHERE `id`=1368; -UPDATE `ai_playerbot_texts` SET `text_loc3`='heiß' WHERE `id`=1369; -UPDATE `ai_playerbot_texts` SET `text_loc3`='die Weiber sind sauer' WHERE `id`=1370; -UPDATE `ai_playerbot_texts` SET `text_loc3`='was hast du gegessen, %s' WHERE `id`=1371; -UPDATE `ai_playerbot_texts` SET `text_loc3`='wtf' WHERE `id`=1372; -UPDATE `ai_playerbot_texts` SET `text_loc3`='ich versuche, diesen Kommentar zu verstehen' WHERE `id`=1373; -UPDATE `ai_playerbot_texts` SET `text_loc3`='*verwirrt*' WHERE `id`=1374; -UPDATE `ai_playerbot_texts` SET `text_loc3`='fuck ja' WHERE `id`=1375; -UPDATE `ai_playerbot_texts` SET `text_loc3`='0/10 würde ich nicht wieder lesen' WHERE `id`=1376; -UPDATE `ai_playerbot_texts` SET `text_loc3`='10/10 würde ich wieder lesen' WHERE `id`=1377; -UPDATE `ai_playerbot_texts` SET `text_loc3`='6/10 würde es lesen' WHERE `id`=1378; -UPDATE `ai_playerbot_texts` SET `text_loc3`='7/10 vielleicht' WHERE `id`=1379; -UPDATE `ai_playerbot_texts` SET `text_loc3`='Respekt!' WHERE `id`=1380; -UPDATE `ai_playerbot_texts` SET `text_loc3`='oh ja, vielleicht' WHERE `id`=1381; -UPDATE `ai_playerbot_texts` SET `text_loc3`='ja und?' WHERE `id`=1382; -UPDATE `ai_playerbot_texts` SET `text_loc3`='hey %s, ich habe dich nicht vergessen' WHERE `id`=1383; -UPDATE `ai_playerbot_texts` SET `text_loc3`='du gehst mir hart auf den Sack, %s' WHERE `id`=1384; -UPDATE `ai_playerbot_texts` SET `text_loc3`='diesmal krieg ich dich, %s' WHERE `id`=1385; -UPDATE `ai_playerbot_texts` SET `text_loc3`='Pass besser auf, %s' WHERE `id`=1386; -UPDATE `ai_playerbot_texts` SET `text_loc3`='Die letzte Runde mochte ich nicht so' WHERE `id`=1387; -UPDATE `ai_playerbot_texts` SET `text_loc3`='Letzte Runde war ich mies, danke, %s' WHERE `id`=1388; -UPDATE `ai_playerbot_texts` SET `text_loc3`='Mach dich bereit zu sterben, %s' WHERE `id`=1389; -UPDATE `ai_playerbot_texts` SET `text_loc3`='Fands nicht geil, dass du mich gekillt hast, %s' WHERE `id`=1390; -UPDATE `ai_playerbot_texts` SET `text_loc3`='%s, ich hasse dich' WHERE `id`=1391; -UPDATE `ai_playerbot_texts` SET `text_loc3`='grrrrrr, diesmal krieg ich dich, %s' WHERE `id`=1392; -UPDATE `ai_playerbot_texts` SET `text_loc3`='FICK DICH! NEIN, FICK MICH!' WHERE `id`=1393; -UPDATE `ai_playerbot_texts` SET `text_loc3`='%s, ich kotze dir in dein verficktes Maul' WHERE `id`=1394; -UPDATE `ai_playerbot_texts` SET `text_loc3`='verurteil mich nicht, verdammt nochmal' WHERE `id`=1395; -UPDATE `ai_playerbot_texts` SET `text_loc3`='Deine Mom ist so fett, sie passt nicht mal durchs Dunkle Portal' WHERE `id`=1396; -UPDATE `ai_playerbot_texts` SET `text_loc3`='armselige Gestalt' WHERE `id`=1399; -UPDATE `ai_playerbot_texts` SET `text_loc3`='was zum Teufel' WHERE `id`=1400; -UPDATE `ai_playerbot_texts` SET `text_loc3`='das war scheiße' WHERE `id`=1401; -UPDATE `ai_playerbot_texts` SET `text_loc3`='REMATCH!!! Ich mach ihn platt' WHERE `id`=1402; -UPDATE `ai_playerbot_texts` SET `text_loc3`='peinlich, ich wurde von %s gekillt' WHERE `id`=1403; -UPDATE `ai_playerbot_texts` SET `text_loc3`='ok, ich bin raus' WHERE `id`=1404; -UPDATE `ai_playerbot_texts` SET `text_loc3`='hehe, hab %s weggeklatscht?' WHERE `id`=1405; -UPDATE `ai_playerbot_texts` SET `text_loc3`='viel zu easy, %s zu killen' WHERE `id`=1406; -UPDATE `ai_playerbot_texts` SET `text_loc3`='hab dich, du Bastard' WHERE `id`=1407; -UPDATE `ai_playerbot_texts` SET `text_loc3`='haha' WHERE `id`=1408; -UPDATE `ai_playerbot_texts` SET `text_loc3`='Loser' WHERE `id`=1409; -UPDATE `ai_playerbot_texts` SET `text_loc3`='ich hab %s gekillt und ihr seid als nächste dran, Jungs' WHERE `id`=1410; -UPDATE `ai_playerbot_texts` SET `text_loc3`='oh ja, hab ihn geownt' WHERE `id`=1411; -UPDATE `ai_playerbot_texts` SET `text_loc3`='ich bin ne Killmaschine' WHERE `id`=1412; -UPDATE `ai_playerbot_texts` SET `text_loc3`='%s, erinnert mich an einen Slayer-Song... dieses ganze Gemetzel' WHERE `id`=1413; -UPDATE `ai_playerbot_texts` SET `text_loc3`='sorry, %s. Können wir die Szene nochmal machen?' WHERE `id`=1414; -UPDATE `ai_playerbot_texts` SET `text_loc3`='na, wie gefällt es dir Wurmfutter zu sein, %s???' WHERE `id`=1415; -UPDATE `ai_playerbot_texts` SET `text_loc3`='du solltest tot sein, %s, das gehört zum Spiel!!!!!' WHERE `id`=1416; -UPDATE `ai_playerbot_texts` SET `text_loc3`='sorry, %s. das sah so gut aus wie ein Kunstwerk von der Kirmes!' WHERE `id`=1417; -UPDATE `ai_playerbot_texts` SET `text_loc3`='%s, ich nehme nächstes Mal Gummigeschosse!' WHERE `id`=1418; -UPDATE `ai_playerbot_texts` SET `text_loc3`='was ist los, %s?? Kopf verloren? hahaha, ruhig bleiben!!' WHERE `id`=1419; -UPDATE `ai_playerbot_texts` SET `text_loc3`='musste das tun, %s. Du verstehst schon. Der Regisseur hat es so gesagt!!' WHERE `id`=1420; -UPDATE `ai_playerbot_texts` SET `text_loc3`='hey %s.......MUAHAHAHAHAHAHAHAHAHAHA' WHERE `id`=1421; -UPDATE `ai_playerbot_texts` SET `text_loc3`='%s, das hab ich genossen!! Wiederholung bitte!' WHERE `id`=1422; -UPDATE `ai_playerbot_texts` SET `text_loc3`='hey, %s! Kannst mich ab jetzt "Scarface" nennen.. du Stück SCHEI**!!!!' WHERE `id`=1423; -UPDATE `ai_playerbot_texts` SET `text_loc3`='redest du mit mir, %s??' WHERE `id`=1424; -UPDATE `ai_playerbot_texts` SET `text_loc3`='%s, mach es diesmal richtig, stell dich nicht vor meine Kugeln.' WHERE `id`=1425; -UPDATE `ai_playerbot_texts` SET `text_loc3`='%s, warum liegst du da rum??? hehe' WHERE `id`=1426; -UPDATE `ai_playerbot_texts` SET `text_loc3`='hab mich totgelacht' WHERE `id`=1427; -UPDATE `ai_playerbot_texts` SET `text_loc3`='hi %s' WHERE `id`=1428; -UPDATE `ai_playerbot_texts` SET `text_loc3`='oh, hi %s' WHERE `id`=1429; -UPDATE `ai_playerbot_texts` SET `text_loc3`='was geht, %s!!!' WHERE `id`=1430; -UPDATE `ai_playerbot_texts` SET `text_loc3`='hi' WHERE `id`=1431; -UPDATE `ai_playerbot_texts` SET `text_loc3`='was geht' WHERE `id`=1432; -UPDATE `ai_playerbot_texts` SET `text_loc3`='hallo %s' WHERE `id`=1433; -UPDATE `ai_playerbot_texts` SET `text_loc3`='hi %s, kennen wir uns?' WHERE `id`=1434; -UPDATE `ai_playerbot_texts` SET `text_loc3`='hey %s' WHERE `id`=1435; -UPDATE `ai_playerbot_texts` SET `text_loc3`='hai %s' WHERE `id`=1436; -UPDATE `ai_playerbot_texts` SET `text_loc3`='was zur Hölle' WHERE `id`=1437; -UPDATE `ai_playerbot_texts` SET `text_loc3`='WTF' WHERE `id`=1438; -UPDATE `ai_playerbot_texts` SET `text_loc3`='das ist Bullshit' WHERE `id`=1439; -UPDATE `ai_playerbot_texts` SET `text_loc3`='admin' WHERE `id`=1440; -UPDATE `ai_playerbot_texts` SET `text_loc3`='hey %s, hör auf, deine Admin-Rechte zu missbrauchen' WHERE `id`=1441; -UPDATE `ai_playerbot_texts` SET `text_loc3`='lass mich in Ruhe, Admin!' WHERE `id`=1442; -UPDATE `ai_playerbot_texts` SET `text_loc3`='du bist scheisse, Admin' WHERE `id`=1443; -UPDATE `ai_playerbot_texts` SET `text_loc3`='das ist mein Name, was willst du, %s' WHERE `id`=1444; -UPDATE `ai_playerbot_texts` SET `text_loc3`='ja???' WHERE `id`=1445; -UPDATE `ai_playerbot_texts` SET `text_loc3`='äh... was' WHERE `id`=1446; -UPDATE `ai_playerbot_texts` SET `text_loc3`='redest du mit mir, %s?' WHERE `id`=1447; -UPDATE `ai_playerbot_texts` SET `text_loc3`='Hey ! Rate mal, was deine Mom letzte Nacht gesagt hat!' WHERE `id`=1450; -UPDATE `ai_playerbot_texts` SET `text_loc3`=', du bist so hässlich, du würdest nicht mal im Affenbordell mit einem Sack Bananen landen!' WHERE `id`=1451; -UPDATE `ai_playerbot_texts` SET `text_loc3`='Halt die Klappe, , du wirst so ein Mann sein, wie deine Mutter!!' WHERE `id`=1452; -UPDATE `ai_playerbot_texts` SET `text_loc3`='Deine Mutter ist so fett, dass man eine Pokéflöte braucht, um sie aufzuwecken und dein Vater ist der Trainer!!!!' WHERE `id`=1453; -UPDATE `ai_playerbot_texts` SET `text_loc3`='Dich als dumm zu bezeichnen, wäre eine Beleidigung für dumme Leute!' WHERE `id`=1454; -UPDATE `ai_playerbot_texts` SET `text_loc3`='Ich furze in deine allgemeine Richtung!!!' WHERE `id`=1455; -UPDATE `ai_playerbot_texts` SET `text_loc3`='Jeder Atemzug, den ich ohne deine Erlaubnis mache, steigert mein Selbstwertgefühl!' WHERE `id`=1456; -UPDATE `ai_playerbot_texts` SET `text_loc3`='Was willst du tun , mich vollbluten? NIMM DAS!' WHERE `id`=1457; -UPDATE `ai_playerbot_texts` SET `text_loc3`='A-G-G-R-O! Das heißt Bosszeit!' WHERE `id`=1458; -UPDATE `ai_playerbot_texts` SET `text_loc3`='Wir hatten grausame und hatten irre Begleiter, aber mit dir sind wir mit einem grausamen Irren gestraft!' WHERE `id`=1459; -UPDATE `ai_playerbot_texts` SET `text_loc3`='Hey ! Hör auf, sie anzubaggern, sie ist nicht dein Typ. Die sind nicht aufblasbar.' WHERE `id`=1460; -UPDATE `ai_playerbot_texts` SET `text_loc3`=', du bist so weit außerhalb deiner Liga, du spielst schon eine andere Sportart.' WHERE `id`=1461; -UPDATE `ai_playerbot_texts` SET `text_loc3`='Großer Fehler heute Morgen, : Du bist aufgestanden!' WHERE `id`=1462; -UPDATE `ai_playerbot_texts` SET `text_loc3`='Ich will mal versuchen, mich in ein Pferd zu verwandeln, brauche aber Hilfe. Ich mach die Vorderseite, du bleibst du.' WHERE `id`=1463; -UPDATE `ai_playerbot_texts` SET `text_loc3`='Du kommst mir vor, als wäre das Beste von dir damals am Arsch deiner Mutter runtergelaufen und als braune Soße auf der Matratze geblieben!' WHERE `id`=1464; -UPDATE `ai_playerbot_texts` SET `text_loc3`='Ich würd dir gern ein Abschiedsgeschenk machen... Aber zuerst machst du deinen Teil.' WHERE `id`=1465; -UPDATE `ai_playerbot_texts` SET `text_loc3`='Bevor du kamst, waren wir motiviert, jetzt sind wir einfach nur noch genervt.' WHERE `id`=1466; -UPDATE `ai_playerbot_texts` SET `text_loc3`='Ich mag dich. Man sagt, ich hätte keinen Geschmack, aber ich mag dich.' WHERE `id`=1467; -UPDATE `ai_playerbot_texts` SET `text_loc3`='Ich glaube, du hast Minderwertigkeitskomplexe, aber ist okay, ist gerechtfertigt.' WHERE `id`=1468; -UPDATE `ai_playerbot_texts` SET `text_loc3`='Verschwinde, sonst passiert was.' WHERE `id`=1469; -UPDATE `ai_playerbot_texts` SET `text_loc3`='Kaum zu fassen, dass ich meine Zeit mit dir verschwende!' WHERE `id`=1470; -UPDATE `ai_playerbot_texts` SET `text_loc3`='Ich liebe es, wenn mich jemand beleidigt, dann muss ich nicht mehr nett sein.' WHERE `id`=1471; -UPDATE `ai_playerbot_texts` SET `text_loc3`='Ich werde dich auch auslöschen, du Mistkerl! Ich werde dir die Eingeweide rausreißen und dir ins Gesicht schmieren!' WHERE `id`=1472; -UPDATE `ai_playerbot_texts` SET `text_loc3`='Du abscheuliche Bestie, nicht mal ein Hund würde dich fressen.' WHERE `id`=1473; -UPDATE `ai_playerbot_texts` SET `text_loc3`='Du schlägst wie ein Vegetarier.' WHERE `id`=1474; -UPDATE `ai_playerbot_texts` SET `text_loc3`='Wer hat dich ausgebuddelt, du wandelnde Seuche?' WHERE `id`=1475; -UPDATE `ai_playerbot_texts` SET `text_loc3`='Ich schau dir nicht in die Augen, ich will heute noch schlafen können.' WHERE `id`=1476; -UPDATE `ai_playerbot_texts` SET `text_loc3`='Boah, bei dir quillt ja noch das Mittagessen raus! Ich hab dich gerochen, bevor ich dich gesehen hab.' WHERE `id`=1477; -UPDATE `ai_playerbot_texts` SET `text_loc3`='Oh du bist so hässlich, selbst der Respawn will dich nicht!' WHERE `id`=1478; -UPDATE `ai_playerbot_texts` SET `text_loc3`='Ich muss mal einen riesigen machen. ist mein neues Wort für Scheiße.' WHERE `id`=1479; -UPDATE `ai_playerbot_texts` SET `text_loc3`='Oh du nutzlose, moorsaufende Krebsgeschwulst!' WHERE `id`=1480; -UPDATE `ai_playerbot_texts` SET `text_loc3`='Wäre ich wie du, würd ich mich selbst löschen!' WHERE `id`=1481; -UPDATE `ai_playerbot_texts` SET `text_loc3`='Oh lehre mich, wie ich das Denken vergesse!' WHERE `id`=1482; -UPDATE `ai_playerbot_texts` SET `text_loc3`='Ich hab schon Toiletten gesehen, die sauberer kämpfen als du.' WHERE `id`=1483; -UPDATE `ai_playerbot_texts` SET `text_loc3`='Du verdammter Scheißkerl. Wo hast du dein Handwerk gelernt? Du dumme, verdammte Schlampe. Du Idiot. Wer hat dir gesagt, dass du mit Männern arbeiten kannst?' WHERE `id`=1484; -UPDATE `ai_playerbot_texts` SET `text_loc3`='Wenn Unfähigkeit ’ne Klasse wäre, hättest du sie gemaxt.' WHERE `id`=1485; -UPDATE `ai_playerbot_texts` SET `text_loc3`=' du dummes Arschfurz-Teppichladen-Arschloch' WHERE `id`=1486; -UPDATE `ai_playerbot_texts` SET `text_loc3`='Ich lebe lang genug und dann nehm ich dir das Hirn raus!' WHERE `id`=1487; -UPDATE `ai_playerbot_texts` SET `text_loc3`='Wenn einen intelligenten Gedanken im Kopf hätte, würde er an Einsamkeit sterben.' WHERE `id`=1488; -UPDATE `ai_playerbot_texts` SET `text_loc3`='Hör auf zu weinen, du winselnder Arsch, hör auf mit deinem Unsinn. Du bist nur die Nachgeburt, .' WHERE `id`=1489; -UPDATE `ai_playerbot_texts` SET `text_loc3`='! Wenn Gehirn Vogelkacke wäre, hättest du einen sauberen Käfig' WHERE `id`=1490; -UPDATE `ai_playerbot_texts` SET `text_loc3`='Hör mal zu, du Vokuhila... warum zündest du nicht einfach dein Tampon an und sprengst deine Box in die Luft? Denn das ist der einzige Knall, den du kriegen wirst.' WHERE `id`=1491; -UPDATE `ai_playerbot_texts` SET `text_loc3`='Verschwinde aus meiner Sicht ! Du verseuchst meine Augen!' WHERE `id`=1492; -UPDATE `ai_playerbot_texts` SET `text_loc3`='SPIELZEIT!!!!' WHERE `id`=1493; -UPDATE `ai_playerbot_texts` SET `text_loc3`='Niemand kommt vorbei!' WHERE `id`=1494; -UPDATE `ai_playerbot_texts` SET `text_loc3`='Wir werden angegriffen! Klar zum Gefecht, ihr Deckschrubber! Wehrt die Eindringlinge ab!' WHERE `id`=1495; -UPDATE `ai_playerbot_texts` SET `text_loc3`='Narren... Tötet den im Kleid!' WHERE `id`=1497; -UPDATE `ai_playerbot_texts` SET `text_loc3`='Ich werde deine Seele Hakkar selbst zum Fraß vorwerfen!' WHERE `id`=1498; -UPDATE `ai_playerbot_texts` SET `text_loc3`='Stolz kündigt das Ende eurer Welt an! Kommt, Sterbliche! Stellt euch dem Zorn der !' WHERE `id`=1499; -UPDATE `ai_playerbot_texts` SET `text_loc3`='All meine Pläne haben zu diesem Moment geführt!' WHERE `id`=1500; -UPDATE `ai_playerbot_texts` SET `text_loc3`='Neuer Tag, neue glorreiche Schlacht!' WHERE `id`=1502; -UPDATE `ai_playerbot_texts` SET `text_loc3`='Also, Geschäft... oder Vergnügen?' WHERE `id`=1503; -UPDATE `ai_playerbot_texts` SET `text_loc3`='Ihr seid nicht vorbereitet!' WHERE `id`=1504; -UPDATE `ai_playerbot_texts` SET `text_loc3`='Die letzte Eroberung der hat begonnen! Wieder liegt die Unterwerfung dieser Welt in unseren Händen. Lasst keinen überleben!' WHERE `id`=1505; -UPDATE `ai_playerbot_texts` SET `text_loc3`='Euer Tod wird ein schmerzhafter sein.' WHERE `id`=1506; -UPDATE `ai_playerbot_texts` SET `text_loc3`='Fleht um Gnade! Eure bedeutungslosen Leben sind bald verwirkt.' WHERE `id`=1507; -UPDATE `ai_playerbot_texts` SET `text_loc3`='Gebt alle Hoffnung auf! Die ist zurückgekehrt, um zu beenden, was vor so vielen Jahren begann. Diesmal gibt es kein Entkommen!' WHERE `id`=1508; -UPDATE `ai_playerbot_texts` SET `text_loc3`='Alarm! Ihr seid zur Auslöschung markiert!' WHERE `id`=1509; -UPDATE `ai_playerbot_texts` SET `text_loc3`='Hahaha! Ihr seid hoffnungslos unterlegen!' WHERE `id`=1511; -UPDATE `ai_playerbot_texts` SET `text_loc3`='Ich werde euren Größenwahn zerschmettern!' WHERE `id`=1512; -UPDATE `ai_playerbot_texts` SET `text_loc3`='Verzeiht mir, denn ihr werdet gleich das Spiel verlieren.' WHERE `id`=1513; -UPDATE `ai_playerbot_texts` SET `text_loc3`='Wehren macht es nur schlimmer.' WHERE `id`=1514; -UPDATE `ai_playerbot_texts` SET `text_loc3`='Ungeziefer! Blutegel! Saugt mein Blut und erstickt daran!' WHERE `id`=1515; -UPDATE `ai_playerbot_texts` SET `text_loc3`='Mein Blut wird euer Ende sein!' WHERE `id`=1517; -UPDATE `ai_playerbot_texts` SET `text_loc3`='Macht hinne, Wachen! Es ist Zeit zum Töten!' WHERE `id`=1519; -UPDATE `ai_playerbot_texts` SET `text_loc3`='Zögert euer Schicksal nicht hinaus. Kommt jetzt zu mir. Ich mache euer Opfer kurz.' WHERE `id`=1520; -UPDATE `ai_playerbot_texts` SET `text_loc3`='Bald seid ihr tot!' WHERE `id`=1521; -UPDATE `ai_playerbot_texts` SET `text_loc3`='Mu-ha-ha!' WHERE `id`=1522; -UPDATE `ai_playerbot_texts` SET `text_loc3`='Ich bin der Jäger! Ihr seid die Beute...' WHERE `id`=1523; -UPDATE `ai_playerbot_texts` SET `text_loc3`='Ihr werdet diesen Ort in Stücken verlassen!' WHERE `id`=1524; -UPDATE `ai_playerbot_texts` SET `text_loc3`='Der Tod naht. Wird euer Gewissen rein sein?' WHERE `id`=1525; -UPDATE `ai_playerbot_texts` SET `text_loc3`='Euer Verhalten wird nicht toleriert.' WHERE `id`=1526; -UPDATE `ai_playerbot_texts` SET `text_loc3`='Hmm, unangekündigte Besucher. Vorbereitungen müssen getroffen werden...' WHERE `id`=1528; -UPDATE `ai_playerbot_texts` SET `text_loc3`='Feindliche Einheiten entdeckt. Bedrohungsanalyse-Protokoll aktiv. Primärziel erfasst. Zeit minus dreißig Sekunden bis zur Neubewertung.' WHERE `id`=1529; -UPDATE `ai_playerbot_texts` SET `text_loc3`='Neue Spielzeuge? Für mich? Ich verspreche, ich mach sie diesmal nicht kaputt!' WHERE `id`=1530; -UPDATE `ai_playerbot_texts` SET `text_loc3`='Pssst... gleich ist alles vorbei.' WHERE `id`=1532; -UPDATE `ai_playerbot_texts` SET `text_loc3`='Sag es mir... sag mir alles, Geheimnisse und Privatsachen! Ich reiße dir die Infos aus dem Fleisch!' WHERE `id`=1536; -UPDATE `ai_playerbot_texts` SET `text_loc3`='Macht euch bereit, die Glocken haben geläutet! Bringt die Schwachen, die Jungen und die Alten in Sicherheit! Jeder von euch zahlt den letzten Preis! Fleht um Gnade, die Abrechnung ist gekommen!' WHERE `id`=1537; -UPDATE `ai_playerbot_texts` SET `text_loc3`='Wo, bei Bonzos Messingknöpfen, bin ich?' WHERE `id`=1538; -UPDATE `ai_playerbot_texts` SET `text_loc3`='Ich ertrage es nicht länger! Goblinkönig! Goblinkönig! Wo immer du bist! Nimm diesen weit weg von mir!' WHERE `id`=1539; -UPDATE `ai_playerbot_texts` SET `text_loc3`='Ihr habt dreizehn Stunden, um das Labyrinth zu lösen, bevor euer kleiner Bruder einer von uns wird... für immer.' WHERE `id`=1540; -UPDATE `ai_playerbot_texts` SET `text_loc3`='Also, die ist Kinderkram, ja? Dann sehen wir mal, wie ihr dieses kleine Stückchen verdaut...' WHERE `id`=1541; -UPDATE `ai_playerbot_texts` SET `text_loc3`='Weiche! Ich stelle mich jedem Kampf. Du irrst dich, dies ist nicht dein Revier.' WHERE `id`=1542; -UPDATE `ai_playerbot_texts` SET `text_loc3`='Zeig, was du drauf hast!' WHERE `id`=1543; -UPDATE `ai_playerbot_texts` SET `text_loc3`='Zweiklingen-Action für eine glatte und saubere Rasur jedes mal.' WHERE `id`=1545; -UPDATE `ai_playerbot_texts` SET `text_loc3`='Los, komm schon!' WHERE `id`=1546; -UPDATE `ai_playerbot_texts` SET `text_loc3`='Du gehst drauf!' WHERE `id`=1547; -UPDATE `ai_playerbot_texts` SET `text_loc3`='Stich, stich, stich!' WHERE `id`=1548; -UPDATE `ai_playerbot_texts` SET `text_loc3`='Machen wir das schnell, Zeit ist Mana.' WHERE `id`=1549; -UPDATE `ai_playerbot_texts` SET `text_loc3`='Ich glaube nicht, dass ihr die Schwere eurer Lage begreift.' WHERE `id`=1550; -UPDATE `ai_playerbot_texts` SET `text_loc3`='Ich bringe meiner Familie und meinem Königreich Ehre!' WHERE `id`=1551; -UPDATE `ai_playerbot_texts` SET `text_loc3`='Licht, gib mir Stärke!' WHERE `id`=1552; -UPDATE `ai_playerbot_texts` SET `text_loc3`='Meine Kirche ist das Schlachtfeld, Zeit zum Gottesdienst...' WHERE `id`=1553; -UPDATE `ai_playerbot_texts` SET `text_loc3`='Ich verachte euch...' WHERE `id`=1554; -UPDATE `ai_playerbot_texts` SET `text_loc3`='Stellt euch dem Hammer der Gerechtigkeit!' WHERE `id`=1555; -UPDATE `ai_playerbot_texts` SET `text_loc3`='Beweist euren Wert in der Prüfung der Waffen im Lichte!' WHERE `id`=1556; -UPDATE `ai_playerbot_texts` SET `text_loc3`='Alles wird vor der Macht und der Gerechtigkeit meiner Sache fallen. Ihr werdet der Nächste sein!' WHERE `id`=1557; -UPDATE `ai_playerbot_texts` SET `text_loc3`='Bereitet euch aufs Sterben vor!' WHERE `id`=1558; -UPDATE `ai_playerbot_texts` SET `text_loc3`='Die Bestie an meiner Seite ist nichts gegen die Bestie in mir...' WHERE `id`=1559; -UPDATE `ai_playerbot_texts` SET `text_loc3`='Erlebt die Feuerkraft dieses voll bewaffneten Jägers!' WHERE `id`=1560; -UPDATE `ai_playerbot_texts` SET `text_loc3`='Heilt mich! Schnell!' WHERE `id`=1561; -UPDATE `ai_playerbot_texts` SET `text_loc3`='Fast tot! Heilt mich!' WHERE `id`=1562; -UPDATE `ai_playerbot_texts` SET `text_loc3`='Hilfe! Heilt mich!' WHERE `id`=1563; -UPDATE `ai_playerbot_texts` SET `text_loc3`='Irgendwer! Heilt mich!' WHERE `id`=1564; -UPDATE `ai_playerbot_texts` SET `text_loc3`='Heal! Heal! Heal!' WHERE `id`=1565; -UPDATE `ai_playerbot_texts` SET `text_loc3`='Ich sterbe! Heal! Aaaaarhg!' WHERE `id`=1566; -UPDATE `ai_playerbot_texts` SET `text_loc3`='Heal mich!' WHERE `id`=1567; -UPDATE `ai_playerbot_texts` SET `text_loc3`='Ich sterbe. Ich sterbe. Ich sterbe. Heal!' WHERE `id`=1568; -UPDATE `ai_playerbot_texts` SET `text_loc3`='Oh, der Schmerz. Heilt mich schnell!' WHERE `id`=1570; -UPDATE `ai_playerbot_texts` SET `text_loc3`='Brauche Heal' WHERE `id`=1571; -UPDATE `ai_playerbot_texts` SET `text_loc3`='HP low' WHERE `id`=1572; -UPDATE `ai_playerbot_texts` SET `text_loc3`='Gebt mal nen Heal. Bitte.' WHERE `id`=1573; -UPDATE `ai_playerbot_texts` SET `text_loc3`='Kann mir jemand nen Heal geben?' WHERE `id`=1574; -UPDATE `ai_playerbot_texts` SET `text_loc3`='Hey! Lieber jetzt heilen als später zu rezzen' WHERE `id`=1575; -UPDATE `ai_playerbot_texts` SET `text_loc3`='Sorry. Brauche noch einen Heal' WHERE `id`=1576; -UPDATE `ai_playerbot_texts` SET `text_loc3`='Verdammte Mobs. Heal mich bitte' WHERE `id`=1577; -UPDATE `ai_playerbot_texts` SET `text_loc3`='Noch ein Treffer und ich bin hinüber. Heal bitte' WHERE `id`=1578; -UPDATE `ai_playerbot_texts` SET `text_loc3`='Heiler da?' WHERE `id`=1579; -UPDATE `ai_playerbot_texts` SET `text_loc3`='Warum hauen die mir immer ins Gesicht? Brauche Heal' WHERE `id`=1580; -UPDATE `ai_playerbot_texts` SET `text_loc3`='Kann mich wer ein bisschen heilen?' WHERE `id`=1581; -UPDATE `ai_playerbot_texts` SET `text_loc3`='OOM' WHERE `id`=1582; -UPDATE `ai_playerbot_texts` SET `text_loc3`='Kein Mana mehr' WHERE `id`=1583; -UPDATE `ai_playerbot_texts` SET `text_loc3`='Verdammt, dafür hab ich mein ganzes Mana verballert' WHERE `id`=1584; -UPDATE `ai_playerbot_texts` SET `text_loc3`='Wartet bis ich trinke oder mein Mana wieder da ist' WHERE `id`=1585; -UPDATE `ai_playerbot_texts` SET `text_loc3`='Mana low' WHERE `id`=1586; -UPDATE `ai_playerbot_texts` SET `text_loc3`='Mana low. Muss trinken' WHERE `id`=1588; -UPDATE `ai_playerbot_texts` SET `text_loc3`='Haben wir nen Getränkeautomaten? Wieder OOM' WHERE `id`=1589; -UPDATE `ai_playerbot_texts` SET `text_loc3`='Mein Mana ist Geschichte' WHERE `id`=1590; -UPDATE `ai_playerbot_texts` SET `text_loc3`='Ich besorge mir nächstes mal Drinks. OOM' WHERE `id`=1591; -UPDATE `ai_playerbot_texts` SET `text_loc3`='Noch 100 !' WHERE `id`=1595; -UPDATE `ai_playerbot_texts` SET `text_loc3`='Das war es! Keine mehr!' WHERE `id`=1596; -UPDATE `ai_playerbot_texts` SET `text_loc3`='Und ihr habt meinen Bogen... ups, keine !' WHERE `id`=1597; -UPDATE `ai_playerbot_texts` SET `text_loc3`='Brauche !' WHERE `id`=1598; -UPDATE `ai_playerbot_texts` SET `text_loc3`='Ich habe Angst' WHERE `id`=1600; -UPDATE `ai_playerbot_texts` SET `text_loc3`='Wir sind am Arsch.' WHERE `id`=1601; -UPDATE `ai_playerbot_texts` SET `text_loc3`='Das wars.' WHERE `id`=1602; -UPDATE `ai_playerbot_texts` SET `text_loc3`='Hier ist jetzt Schluss.' WHERE `id`=1603; -UPDATE `ai_playerbot_texts` SET `text_loc3`='Kann mal wer Blizzard anrufen?' WHERE `id`=1604; -UPDATE `ai_playerbot_texts` SET `text_loc3`='Verdammt. Der Tank hat alle Mobs gepullt.' WHERE `id`=1605; -UPDATE `ai_playerbot_texts` SET `text_loc3`='Wir sterben. Wir sterben. Wir sterben.' WHERE `id`=1606; -UPDATE `ai_playerbot_texts` SET `text_loc3`='Whoa! So viel Spielzeug zum Austoben.' WHERE `id`=1607; -UPDATE `ai_playerbot_texts` SET `text_loc3`='Ich kill sie alle!' WHERE `id`=1608; -UPDATE `ai_playerbot_texts` SET `text_loc3`='Wenn der Tank stirbt, sind wir Geschichte.' WHERE `id`=1609; -UPDATE `ai_playerbot_texts` SET `text_loc3`='LEEEEERROOOYYYYYYYYYYYY JENNKINNNSSSSSS!!!!!!!' WHERE `id`=1611; -UPDATE `ai_playerbot_texts` SET `text_loc3`='Okay. Was haben wir an AoE?' WHERE `id`=1612; -UPDATE `ai_playerbot_texts` SET `text_loc3`='Jetzt wirds interessant.' WHERE `id`=1613; -UPDATE `ai_playerbot_texts` SET `text_loc3`='Cool. Zieht sie zusammen für nen schönen Flammenstoß.' WHERE `id`=1614; -UPDATE `ai_playerbot_texts` SET `text_loc3`='Kill! Kill! Kill!' WHERE `id`=1615; -UPDATE `ai_playerbot_texts` SET `text_loc3`='Ich glaub, meine Hose ist nass.' WHERE `id`=1616; -UPDATE `ai_playerbot_texts` SET `text_loc3`='Hoffentlich sind die Heiler ready. Leeeeroy!' WHERE `id`=1618; -UPDATE `ai_playerbot_texts` SET `text_loc3`='Hoffentlich kommen die nicht zu mir.' WHERE `id`=1619; -UPDATE `ai_playerbot_texts` SET `text_loc3`='Oh nein. Ich kann bei dem Gemetzel nicht hinsehen.' WHERE `id`=1620; -UPDATE `ai_playerbot_texts` SET `text_loc3`='Hoffentlich gibts Gold.' WHERE `id`=1621; -UPDATE `ai_playerbot_texts` SET `text_loc3`='Loot! Loot!' WHERE `id`=1622; -UPDATE `ai_playerbot_texts` SET `text_loc3`='Mein Schatz.' WHERE `id`=1623; -UPDATE `ai_playerbot_texts` SET `text_loc3`='Hoffentlich wartet da ein schickes episches Item auf mich.' WHERE `id`=1624; -UPDATE `ai_playerbot_texts` SET `text_loc3`='Ich hab tiefe Taschen und Beutel.' WHERE `id`=1625; -UPDATE `ai_playerbot_texts` SET `text_loc3`='Alles meins!' WHERE `id`=1626; -UPDATE `ai_playerbot_texts` SET `text_loc3`='Hoffentlich heute kein grauer Müll.' WHERE `id`=1627; -UPDATE `ai_playerbot_texts` SET `text_loc3`='Dieser Loot ist MEINER!' WHERE `id`=1628; -UPDATE `ai_playerbot_texts` SET `text_loc3`='Looten ist eklig, aber ich brauch Gold.' WHERE `id`=1629; -UPDATE `ai_playerbot_texts` SET `text_loc3`='Gold!' WHERE `id`=1630; -UPDATE `ai_playerbot_texts` SET `text_loc3`='Okay. Mal sehen, was sie droppen.' WHERE `id`=1631; -UPDATE `ai_playerbot_texts` SET `text_loc3`='Keine Sorge. Ich loote alles.' WHERE `id`=1632; -UPDATE `ai_playerbot_texts` SET `text_loc3`='Ich bin ein Ninja-Looter.' WHERE `id`=1633; -UPDATE `ai_playerbot_texts` SET `text_loc3`='Kann mir mal wer erklären, wo die das ganze Zeug versteckt haben?' WHERE `id`=1635; -UPDATE `ai_playerbot_texts` SET `text_loc3`='Nein, ich loote keinen grauen Müll.' WHERE `id`=1636; -UPDATE `ai_playerbot_texts` SET `text_loc3`='Ich bin zuerst. Ich bin zuerst. Ich bin zuerst.' WHERE `id`=1637; -UPDATE `ai_playerbot_texts` SET `text_loc3`='Gebt mir euer Gold!' WHERE `id`=1638; -UPDATE `ai_playerbot_texts` SET `text_loc3`='Meine Taschen sind leer, müssen aber voll werden.' WHERE `id`=1639; -UPDATE `ai_playerbot_texts` SET `text_loc3`='Hab dafür ne neue Tasche.' WHERE `id`=1640; -UPDATE `ai_playerbot_texts` SET `text_loc3`='Hoffentlich zieh ich beim Looten keine Aggro.' WHERE `id`=1641; -UPDATE `ai_playerbot_texts` SET `text_loc3`='Ich kann nicht looten wenn jemand zusieht.' WHERE `id`=1642; -UPDATE `ai_playerbot_texts` SET `text_loc3`='Ha! Ihr kriegt davon keinen Krümel!' WHERE `id`=1643; -UPDATE `ai_playerbot_texts` SET `text_loc3`='Ich mag neues Gear.' WHERE `id`=1645; -UPDATE `ai_playerbot_texts` SET `text_loc3`='Ich höre auf, wenn schon wieder nichts Wertvolles droppt.' WHERE `id`=1646; -UPDATE `ai_playerbot_texts` SET `text_loc3`='Hoffentlich ist es ein hübscher Ring.' WHERE `id`=1647; -UPDATE `ai_playerbot_texts` SET `text_loc3`='Ich reiß dir den Loot aus den Händen.' WHERE `id`=1648; -UPDATE `ai_playerbot_texts` SET `text_loc3`='Alle weg da. Ich loote jetzt.' WHERE `id`=1649; -UPDATE `ai_playerbot_texts` SET `text_loc3`='Geiler Loot.' WHERE `id`=1650; -UPDATE `ai_playerbot_texts` SET `text_loc3`='Oh ihr RNG-Götter! Gewährt mir heute einen Epic beim würfeln.' WHERE `id`=1651; -UPDATE `ai_playerbot_texts` SET `text_loc3`='Bitte gib mir neues Spielzeug.' WHERE `id`=1652; -UPDATE `ai_playerbot_texts` SET `text_loc3`='Hoffe, die haben was Leckeres dabei.' WHERE `id`=1653; -UPDATE `ai_playerbot_texts` SET `text_loc3`='Das Gold gehört mir. Ich lasse euch den Rest, versprochen.' WHERE `id`=1654; -UPDATE `ai_playerbot_texts` SET `text_loc3`='Bin gleich da, wartet auf mich!' WHERE `id`=1657; -UPDATE `ai_playerbot_texts` SET `text_loc3`='Bin nicht mehr weit, bitte wartet!' WHERE `id`=1658; -UPDATE `ai_playerbot_texts` SET `text_loc3`='Bin auf dem Weg zu euch.' WHERE `id`=1659; -UPDATE `ai_playerbot_texts` SET `text_loc3`='Ich reise zu euch.' WHERE `id`=1661; -UPDATE `ai_playerbot_texts` SET `text_loc3`='Ich versuche zu euch zu kommen.' WHERE `id`=1662; -UPDATE `ai_playerbot_texts` SET `text_loc3`='Rüste %item aus' WHERE `id`=1663; -UPDATE `ai_playerbot_texts` SET `text_loc3`='Ich habe die Zauber gelernt: %spells' WHERE `id`=1665; -UPDATE `ai_playerbot_texts` SET `text_loc3`='%item hat Abklingzeit.' WHERE `id`=1666; -UPDATE `ai_playerbot_texts` SET `text_loc3`='Ich habe %item nicht im Inventar.' WHERE `id`=1667; -UPDATE `ai_playerbot_texts` SET `text_loc3`='Das Item mit der ID %item existiert nicht.' WHERE `id`=1668; -UPDATE `ai_playerbot_texts` SET `text_loc3`='Folge.' WHERE `id`=1671; -UPDATE `ai_playerbot_texts` SET `text_loc3`='Bleibe hier.' WHERE `id`=1672; -UPDATE `ai_playerbot_texts` SET `text_loc3`='Fliehe.' WHERE `id`=1673; -UPDATE `ai_playerbot_texts` SET `text_loc3`='Ich fliehe nicht mit dir, du bist zu weit weg.' WHERE `id`=1674; -UPDATE `ai_playerbot_texts` SET `text_loc3`='Grinde.' WHERE `id`=1675; -UPDATE `ai_playerbot_texts` SET `text_loc3`='Greife an.' WHERE `id`=1676; -UPDATE `ai_playerbot_texts` SET `text_loc3`='Das ist zu weit weg.' WHERE `id`=1677; -UPDATE `ai_playerbot_texts` SET `text_loc3`='Da kann ich nicht hin.' WHERE `id`=1679; -UPDATE `ai_playerbot_texts` SET `text_loc3`='Ich bin nicht in deiner Gilde!' WHERE `id`=1680; -UPDATE `ai_playerbot_texts` SET `text_loc3`='Keine Gildenbank in der Nähe gefunden.' WHERE `id`=1681; -UPDATE `ai_playerbot_texts` SET `text_loc3`='Ich kann nicht ' WHERE `id`=1682; -UPDATE `ai_playerbot_texts` SET `text_loc3`='Ich habe keine Rechte, Items in den ersten Gildenbank-Reiter zu legen.' WHERE `id`=1683; -UPDATE `ai_playerbot_texts` SET `text_loc3`=' in die Gildenbank gelegt' WHERE `id`=1684; -UPDATE `ai_playerbot_texts` SET `text_loc3`='Freies Bewegen.' WHERE `id`=1685; -UPDATE `ai_playerbot_texts` SET `text_loc3`='Bewache.' WHERE `id`=1686; -UPDATE `ai_playerbot_texts` SET `text_loc3`='(das letzte)' WHERE `id`=1690; -UPDATE `ai_playerbot_texts` SET `text_loc3`='auf Handelsgegenstand' WHERE `id`=1692; -UPDATE `ai_playerbot_texts` SET `text_loc3`='Loote %item' WHERE `id`=1696; -UPDATE `ai_playerbot_texts` SET `text_loc3`='Ich habe nicht genug Gruppenmitglieder in der Nähe, um beschwören zu können.' WHERE `id`=1698; -UPDATE `ai_playerbot_texts` SET `text_loc3`='Ich kenne den Zauber %spell nicht.' WHERE `id`=1701; -UPDATE `ai_playerbot_texts` SET `text_loc3`='Stelle %spell her' WHERE `id`=1703; -UPDATE `ai_playerbot_texts` SET `text_loc3`='Konnte %spell nicht wirken.' WHERE `id`=1705; -UPDATE `ai_playerbot_texts` SET `text_loc3`=' |cffffff00(x%amount übrig)|r' WHERE `id`=1706; -UPDATE `ai_playerbot_texts` SET `text_loc3`='Dummy' WHERE `id`=1707; -UPDATE `ai_playerbot_texts` SET `text_loc3`='Beim Licht… Ich hab meine Königssymbole vergessen. Na gut, dann nehmen wir eben %base_spell!' WHERE `id`=1708; -UPDATE `ai_playerbot_texts` SET `text_loc3`='Die Natur ist großzügig, meine Taschen nicht... keine Kräuter für %group_spell mehr. Nehmt fürs Erste %base_spell!' WHERE `id`=1709; -UPDATE `ai_playerbot_texts` SET `text_loc3`='Arkanes Pulver alle... %group_spell muss warten. Wirke %base_spell!' WHERE `id`=1710; -UPDATE `ai_playerbot_texts` SET `text_loc3`='Ups, mir fehlen die Komponenten für %group_spell. Wir nehmen %base_spell!' WHERE `id`=1711; -UPDATE `ai_playerbot_texts` SET `text_loc3`='%player bewegt sich, um den roten Strahl zu blocken!' WHERE `id`=1712; -UPDATE `ai_playerbot_texts` SET `text_loc3`='%player bewegt sich, um den blauen Strahl zu blocken!' WHERE `id`=1713; -UPDATE `ai_playerbot_texts` SET `text_loc3`='%player bewegt sich, um den grünen Strahl zu blocken!' WHERE `id`=1714; -UPDATE `ai_playerbot_texts` SET `text_loc3`='%player verlässt den blauen Strahl--nächster Blocker los!' WHERE `id`=1715; - -UPDATE `ai_playerbot_texts` SET `text_loc3`='%player verlässt den grünen Strahl--nächster Blocker los!' WHERE `id`=1716; +UPDATE `ai_playerbot_texts` SET `text_loc3`='am Arsch der Welt' WHERE `id`=1; +UPDATE `ai_playerbot_texts` SET `text_loc3`='an einem geheimen Ort' WHERE `id`=2; +UPDATE `ai_playerbot_texts` SET `text_loc3`='irgendwo' WHERE `id`=3; +UPDATE `ai_playerbot_texts` SET `text_loc3`='irgendwas' WHERE `id`=4; +UPDATE `ai_playerbot_texts` SET `text_loc3`='frag mich, wie %item_link wohl schmeckt' WHERE `id`=5; +UPDATE `ai_playerbot_texts` SET `text_loc3`='neeein, ich hab %item_link bekommen' WHERE `id`=6; +UPDATE `ai_playerbot_texts` SET `text_loc3`='ah nee, nicht schon wieder dieser Müll: %item_link' WHERE `id`=7; +UPDATE `ai_playerbot_texts` SET `text_loc3`='scheint so, als würde ich nur Müll looten: %item_link' WHERE `id`=8; +UPDATE `ai_playerbot_texts` SET `text_loc3`='naja, besser als nix, schätze ich: %item_link' WHERE `id`=9; +UPDATE `ai_playerbot_texts` SET `text_loc3`='keine Ahnung, was ich mit %item_link anfangen soll' WHERE `id`=10; +UPDATE `ai_playerbot_texts` SET `text_loc3`='naja, ich kann den ganzen Tag %item_link looten' WHERE `id`=11; +UPDATE `ai_playerbot_texts` SET `text_loc3`='neuer Tag, neuer %item_link' WHERE `id`=12; +UPDATE `ai_playerbot_texts` SET `text_loc3`='hab %item_link gelootet' WHERE `id`=13; +UPDATE `ai_playerbot_texts` SET `text_loc3`='ein %item_link ist okay' WHERE `id`=14; +UPDATE `ai_playerbot_texts` SET `text_loc3`='nicht schlecht, hab grad %item_link bekommen.' WHERE `id`=15; +UPDATE `ai_playerbot_texts` SET `text_loc3`='gerade %item_link in %zone_name gelootet' WHERE `id`=16; +UPDATE `ai_playerbot_texts` SET `text_loc3`='kann ich gut gebrauchen, %item_link' WHERE `id`=17; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Gold, Gold, Gold: %item_link' WHERE `id`=18; +UPDATE `ai_playerbot_texts` SET `text_loc3`='hab %item_link bekommen' WHERE `id`=19; +UPDATE `ai_playerbot_texts` SET `text_loc3`='%item_link ist BiS für Jäger' WHERE `id`=20; +UPDATE `ai_playerbot_texts` SET `text_loc3`='%item_link ist BiS für %my_class' WHERE `id`=21; +UPDATE `ai_playerbot_texts` SET `text_loc3`='RNG meint es heute gut: %item_link' WHERE `id`=22; +UPDATE `ai_playerbot_texts` SET `text_loc3`='nice, %item_link frisch gelootet' WHERE `id`=23; +UPDATE `ai_playerbot_texts` SET `text_loc3`='wow, hab gerade %item_link bekommen' WHERE `id`=24; +UPDATE `ai_playerbot_texts` SET `text_loc3`='%item_link ist BiS für Jäger' WHERE `id`=25; +UPDATE `ai_playerbot_texts` SET `text_loc3`='%item_link ist BiS für %my_class' WHERE `id`=26; +UPDATE `ai_playerbot_texts` SET `text_loc3`='RNG meint es heute gut: %item_link' WHERE `id`=27; +UPDATE `ai_playerbot_texts` SET `text_loc3`='nice, %item_link frisch gelootet' WHERE `id`=28; +UPDATE `ai_playerbot_texts` SET `text_loc3`='OMG, guckt mal, was ich gerade bekommen hab: %item_link!!!' WHERE `id`=29; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Keine @#$@% Chance! Ich hab %item_link bekommen, Wahnsinn.' WHERE `id`=30; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Keine @#$@% Chance! Das kann nicht sein - ich hab %item_link bekommen, völlig irre.' WHERE `id`=31; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Im Ernst? Noch ein %item_link? Mein Glück ist kaputt.' WHERE `id`=32; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Ich hab %item_link... ugh, schon wieder.' WHERE `id`=34; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Keine Ahnung, warum ich %item_link überhaupt aufhebe, es ist nutzlos.' WHERE `id`=35; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Schaut euch diesen glänzenden %item_link an... schade, ist trotzdem Müll.' WHERE `id`=36; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Dieser %item_link ist nicht mal das Papier wert, auf dem er stehen würde.' WHERE `id`=37; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Ich schätze, %item_link ist besser als gar nix? Gerade so.' WHERE `id`=38; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Kein Plan, was ich mit %item_link machen soll, vielleicht verkauf ich es für 1 Silber.' WHERE `id`=39; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Noch ein %item_link... naja, immerhin krieg ich was.' WHERE `id`=40; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Hoffentlich ist %item_link was wert, es sieht nämlich furchtbar aus.' WHERE `id`=41; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Warum krieg ich ständig %item_link... hab ich RNG verärgert?' WHERE `id`=43; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Als würde %item_link mir nachlaufen. Ich will das nicht!' WHERE `id`=44; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Da ist %item_link schon wieder. Was für eine Überraschung.' WHERE `id`=45; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Ich schätze, %item_link taugt als Händler-Müll?' WHERE `id`=46; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Neeeein, nicht schon wieder %item_link! RNG, bitte!' WHERE `id`=47; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Naja, ganz nutzlos ist %item_link immerhin nicht, oder?' WHERE `id`=48; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Noch ein %item_link? RNG, kümmert dich das überhaupt?' WHERE `id`=49; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Vielleicht ist %item_link in 10 Jahren was wert.' WHERE `id`=50; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Ich bewundere einfach mal, wie %item_link aussieht... und schmeiß es weg.' WHERE `id`=51; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Wer braucht %item_link? Ich sicher nicht.' WHERE `id`=52; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Vielleicht ist %item_link nützlich... haha, doch nur Müll.' WHERE `id`=53; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Das Universum schenkt mir %item_link. Toll.' WHERE `id`=54; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Gut, ich hab %item_link. Begeistert bin ich nicht.' WHERE `id`=55; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Was soll ich überhaupt mit %item_link anfangen? Nicht mal verkaufbar.' WHERE `id`=56; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Packen wir %item_link zu meinem wachsenden Enttäuschungsstapel.' WHERE `id`=57; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Danke für %item_link... genau das, was ich nicht gebraucht hab.' WHERE `id`=58; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Ich hab so viele %item_link gelootet, ich könnte damit einen Laden aufmachen.' WHERE `id`=60; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Ein glänzender %item_link... kommt wohl auf den Müllhaufen.' WHERE `id`=61; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Es ist %item_link, Leute. Nicht zu früh freuen.' WHERE `id`=62; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Naja, wenigstens ist es %item_link... könnte schlimmer sein.' WHERE `id`=63; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Lieber %item_link als gar nix.' WHERE `id`=64; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Noch ein %item_link. Nicht das Schlimmste.' WHERE `id`=65; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Hey, %item_link... ist schon okay, denk ich.' WHERE `id`=66; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Hey, %item_link. Nicht schlecht, nicht gut, aber ich nehme es.' WHERE `id`=67; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Könnte schlimmer sein... hab gerade %item_link gelootet.' WHERE `id`=68; +UPDATE `ai_playerbot_texts` SET `text_loc3`='%item_link wird für irgendwas nützlich sein, denke ich.' WHERE `id`=69; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Neuer Tag, neuer %item_link. Kann mich nicht beschweren.' WHERE `id`=70; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Naja, %item_link geht klar, würd ich sagen.' WHERE `id`=71; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Gerade %item_link bekommen. Nicht das Beste, aber etwas.' WHERE `id`=72; +UPDATE `ai_playerbot_texts` SET `text_loc3`='%item_link ist gut genug, ich bin nicht sauer.' WHERE `id`=74; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Kein Legendary, aber %item_link reicht.' WHERE `id`=75; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Kein schlechter Drop... %item_link ist okay.' WHERE `id`=76; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Lieber %item_link als gar nix.' WHERE `id`=77; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Schon wieder %item_link. Besser als nix, denke ich.' WHERE `id`=79; +UPDATE `ai_playerbot_texts` SET `text_loc3`='%item_link schon wieder, hm? Nicht begeistert, aber ich überlebe.' WHERE `id`=80; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Hätte schlimmer kommen können, %item_link ist gar nicht so schlecht.' WHERE `id`=82; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Ich nehm %item_link, könnte schlimmer sein.' WHERE `id`=84; +UPDATE `ai_playerbot_texts` SET `text_loc3`='%item_link gelootet, nix Besonderes, aber okay.' WHERE `id`=85; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Nicht das, was ich wollte, aber %item_link reicht fürs Erste.' WHERE `id`=86; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Noch ein %item_link. Nicht der Wahnsinn, aber geht klar.' WHERE `id`=87; +UPDATE `ai_playerbot_texts` SET `text_loc3`='%item_link gelootet, könnte schlimmer sein.' WHERE `id`=88; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Naja, %item_link ist besser als ein Stich ins Auge.' WHERE `id`=89; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Ich nehm %item_link und zieh weiter.' WHERE `id`=90; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Nice! Ein solider %item_link für die Sammlung.' WHERE `id`=91; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Nicht schlecht, %item_link könnte nützlich werden.' WHERE `id`=93; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Hab mir %item_link geholt, jetzt gehts los.' WHERE `id`=94; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Dieser %item_link ist besser als die meisten, nehm ich.' WHERE `id`=95; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Mit %item_link kann ich was Gutes anfangen.' WHERE `id`=96; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Mit %item_link lässt sich vielleicht gut verdienen.' WHERE `id`=99; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Ein solider %item_link, der Tag sieht gleich besser aus.' WHERE `id`=100; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Hab %item_link nicht erwartet, aber ich nehm es.' WHERE `id`=101; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Kein Plan, was ich mit %item_link machen soll aber ich freue mich drüber.' WHERE `id`=102; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Nicht meine erste Wahl, aber %item_link nehm ich gern.' WHERE `id`=103; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Genau das hab ich heute gebraucht: %item_link.' WHERE `id`=104; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Noch ein %item_link. Nehm ich, keine Beschwerden.' WHERE `id`=106; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Immerhin hat %item_link irgendeinen Nutzen. Nicht der schlimmste Loot.' WHERE `id`=107; +UPDATE `ai_playerbot_texts` SET `text_loc3`='%item_link ist vielleicht genau das, was ich heute brauche.' WHERE `id`=108; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Ich hab gerade %quest_link angenommen' WHERE `id`=109; +UPDATE `ai_playerbot_texts` SET `text_loc3`='gerade %quest_link angenommen' WHERE `id`=110; +UPDATE `ai_playerbot_texts` SET `text_loc3`='%quest_link - versuch das mal abzuschließen' WHERE `id`=111; +UPDATE `ai_playerbot_texts` SET `text_loc3`='%quest_link in %zone_name angenommen' WHERE `id`=112; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Gerade %quest_link abgeholt, Zeit ranzuklotzen!' WHERE `id`=113; +UPDATE `ai_playerbot_texts` SET `text_loc3`='%quest_link eingesackt, mal sehen, worum es geht.' WHERE `id`=114; +UPDATE `ai_playerbot_texts` SET `text_loc3`='%quest_link geschnappt, Los gehts!' WHERE `id`=115; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Neue Quest, %quest_link. Los!' WHERE `id`=116; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Sieht so aus, als wäre jetzt %quest_link dran, wünscht mir Glück.' WHERE `id`=117; +UPDATE `ai_playerbot_texts` SET `text_loc3`='%quest_link angenommen, mal sehen, wie hart die ist.' WHERE `id`=118; +UPDATE `ai_playerbot_texts` SET `text_loc3`='%quest_link mitgenommen, Zeit für Fortschritt.' WHERE `id`=119; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Gerade %quest_link genommen. Mal sehen, wie schwer die ist.' WHERE `id`=120; +UPDATE `ai_playerbot_texts` SET `text_loc3`='%quest_link angenommen, hoffentlich kein Überraschungsboss am Ende.' WHERE `id`=121; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Unterwegs, %quest_link abzuschließen. Auf gehts!' WHERE `id`=122; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Dann mach ich jetzt wohl %quest_link. Hoffentlich lohnt sichs.' WHERE `id`=123; +UPDATE `ai_playerbot_texts` SET `text_loc3`='%quest_link eingesackt. Weiter gehts!' WHERE `id`=124; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Hab gerade %quest_link angenommen. Sollte Kinderkram sein.' WHERE `id`=125; +UPDATE `ai_playerbot_texts` SET `text_loc3`='%quest_link angenommen, jetzt rock ich das.' WHERE `id`=126; +UPDATE `ai_playerbot_texts` SET `text_loc3`='%quest_link in %zone_name angenommen. Los gehts!' WHERE `id`=127; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Auf dem Weg, %quest_link zu beenden. Machen wirs schnell!' WHERE `id`=128; +UPDATE `ai_playerbot_texts` SET `text_loc3`='%quest_link angenommen. Mal sehen, was in %zone_name auf mich wartet.' WHERE `id`=129; +UPDATE `ai_playerbot_texts` SET `text_loc3`='%quest_link bekommen, hoffentlich dauert das nicht ewig.' WHERE `id`=130; +UPDATE `ai_playerbot_texts` SET `text_loc3`='%quest_link geschnappt. Schon wieder von vorn.' WHERE `id`=131; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Es sieht so aus, als ob %quest_link als nächstes dran ist.' WHERE `id`=132; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Unterwegs, %quest_link abzuschließen. Hoffe, die macht Spaß.' WHERE `id`=133; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Gerade %quest_link genommen. Zeit nachzuschauen, was mich erwartet.' WHERE `id`=136; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Nochmal %quest_link. Ziehen wirs schnell durch!' WHERE `id`=137; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Ich hab gerade %quest_link genommen. Das wird spaßig!' WHERE `id`=138; +UPDATE `ai_playerbot_texts` SET `text_loc3`='%quest_link in %zone_name angenommen. Los!' WHERE `id`=139; +UPDATE `ai_playerbot_texts` SET `text_loc3`='%quest_link geschnappt. Kann es kaum erwarten, was als Nächstes kommt.' WHERE `id`=140; +UPDATE `ai_playerbot_texts` SET `text_loc3`='%quest_link genommen. Abtauchen und durchziehen.' WHERE `id`=141; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Alles klar, %quest_link ist aktiv. An die Arbeit!' WHERE `id`=142; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Weiter zu %quest_link. Hoffentlich nicht zu hart.' WHERE `id`=143; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Gerade %quest_link geschnappt. Sollte easy sein!' WHERE `id`=144; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Ich hab %quest_link angenommen. Machen wirs fix!' WHERE `id`=145; +UPDATE `ai_playerbot_texts` SET `text_loc3`='%quest_link genommen, mal schauen, worum es geht.' WHERE `id`=146; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Gerade %quest_link angenommen, weiter gehts!' WHERE `id`=147; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Endlich fertig mit %quest_obj_name für %quest_link' WHERE `id`=148; +UPDATE `ai_playerbot_texts` SET `text_loc3`='endlich %quest_obj_available/%quest_obj_required von %quest_obj_name für %quest_link bekommen' WHERE `id`=149; +UPDATE `ai_playerbot_texts` SET `text_loc3`='%quest_obj_full_formatted für %quest_link, endlich' WHERE `id`=150; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Uff, %quest_obj_available/%quest_obj_required %quest_obj_name für %quest_link bekommen' WHERE `id`=151; +UPDATE `ai_playerbot_texts` SET `text_loc3`='brauche noch %quest_obj_missing von %quest_obj_name für %quest_link' WHERE `id`=152; +UPDATE `ai_playerbot_texts` SET `text_loc3`='%quest_obj_full_formatted, arbeite noch an %quest_link' WHERE `id`=153; +UPDATE `ai_playerbot_texts` SET `text_loc3`='%quest_obj_name für %quest_link fertig, was für ein Grind!' WHERE `id`=154; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Kurz vor Abschluss von %quest_obj_name für %quest_link, fehlen nur noch %quest_obj_missing.' WHERE `id`=155; +UPDATE `ai_playerbot_texts` SET `text_loc3`='%quest_obj_name fast durch, brauche nur noch %quest_obj_missing für %quest_link.' WHERE `id`=156; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Endlich %quest_obj_name für %quest_link fertig! Das hat gedauert!' WHERE `id`=158; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Läuft, hab %quest_obj_available/%quest_obj_required von %quest_obj_name für %quest_link.' WHERE `id`=159; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Yes! %quest_obj_name für %quest_link abgeschlossen. Weiter gehts!' WHERE `id`=160; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Fortschritt bei %quest_obj_name, %quest_obj_available/%quest_obj_required erledigt für %quest_link.' WHERE `id`=161; +UPDATE `ai_playerbot_texts` SET `text_loc3`='%quest_obj_full_formatted... fast geschafft für %quest_link!' WHERE `id`=162; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Brauche nur noch %quest_obj_missing %quest_obj_name für %quest_link, fast fertig!' WHERE `id`=163; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Endlich %quest_obj_name für %quest_link geschafft, was für eine Erleichterung!' WHERE `id`=164; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Hab %quest_obj_available/%quest_obj_required von %quest_obj_name für %quest_link, geht voran!' WHERE `id`=165; +UPDATE `ai_playerbot_texts` SET `text_loc3`='%quest_obj_name für %quest_link ist komplett! Weiter zur nächsten Aufgabe.' WHERE `id`=166; +UPDATE `ai_playerbot_texts` SET `text_loc3`='100% von %quest_obj_name für %quest_link erledigt, ab zu den Belohnungen!' WHERE `id`=167; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Es fehlen noch %quest_obj_missing von %quest_obj_name für %quest_link, fast fertig!' WHERE `id`=168; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Arbeite an %quest_obj_name für %quest_link, aktuell %quest_obj_available/%quest_obj_required erledigt.' WHERE `id`=169; +UPDATE `ai_playerbot_texts` SET `text_loc3`='%quest_obj_full_formatted für %quest_link. Das war ein langer Brocken!' WHERE `id`=170; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Brauche nur noch ein paar %quest_obj_name für %quest_link, dann bin ich durch!' WHERE `id`=171; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Noch ein Ziel erledigt! %quest_obj_full_formatted für %quest_link' WHERE `id`=172; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Grinde weiter %quest_obj_name für %quest_link, mit %quest_obj_available/%quest_obj_required fast da.' WHERE `id`=173; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Ziel erledigt! %quest_obj_full_formatted für %quest_link. Weiter zum nächsten!' WHERE `id`=174; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Endlich fertig mit %item_link für %quest_link' WHERE `id`=175; +UPDATE `ai_playerbot_texts` SET `text_loc3`='endlich %quest_obj_available/%quest_obj_required von %item_link für %quest_link bekommen' WHERE `id`=176; +UPDATE `ai_playerbot_texts` SET `text_loc3`='%quest_obj_full_formatted für %quest_link, endlich' WHERE `id`=177; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Uff, %quest_obj_available/%quest_obj_required %item_link für %quest_link bekommen' WHERE `id`=178; +UPDATE `ai_playerbot_texts` SET `text_loc3`='brauche noch %quest_obj_missing %item_link für %quest_link' WHERE `id`=179; +UPDATE `ai_playerbot_texts` SET `text_loc3`='%quest_obj_full_formatted, arbeite noch an %quest_link' WHERE `id`=180; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Es geht voran! %quest_obj_available/%quest_obj_required %item_link für %quest_link.' WHERE `id`=182; +UPDATE `ai_playerbot_texts` SET `text_loc3`='%quest_obj_name ist zur Hälfte durch, brauche noch %quest_obj_missing %item_link für %quest_link.' WHERE `id`=183; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Es fehlen noch %quest_obj_missing von %item_link für %quest_link, aber ich komme näher!' WHERE `id`=184; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Endlich %item_link für %quest_link fertig, weiter mit der nächsten Aufgabe!' WHERE `id`=185; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Fast da! %quest_obj_available/%quest_obj_required %item_link für %quest_link geholt.' WHERE `id`=186; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Yes! %item_link für %quest_link abgeschlossen. Weiter zum nächsten Ziel.' WHERE `id`=187; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Guter Fortschritt bei %item_link für %quest_link, brauche noch %quest_obj_missing.' WHERE `id`=189; +UPDATE `ai_playerbot_texts` SET `text_loc3`='100% von %item_link für %quest_link erledigt! Weiter gehts.' WHERE `id`=190; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Hab %quest_obj_available/%quest_obj_required %item_link für %quest_link. Das Ziel ist in Sicht!' WHERE `id`=191; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Geschafft, %item_link für %quest_link komplett. Was für eine Erleichterung!' WHERE `id`=192; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Arbeite hart an %item_link für %quest_link, brauche noch %quest_obj_missing.' WHERE `id`=193; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Fast fertig mit %item_link für %quest_link, es fehlen nur noch %quest_obj_missing.' WHERE `id`=194; +UPDATE `ai_playerbot_texts` SET `text_loc3`='%item_link für %quest_link abgeschlossen, der Grind ist real!' WHERE `id`=195; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Arbeite weiter an %item_link für %quest_link, bisher %quest_obj_available/%quest_obj_required erledigt.' WHERE `id`=196; +UPDATE `ai_playerbot_texts` SET `text_loc3`='%item_link für %quest_link kommt der Fertigstellung näher, %quest_obj_available/%quest_obj_required erledigt.' WHERE `id`=197; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Yes! %item_link für %quest_link fertig! Das hat etwas länger gedauert.' WHERE `id`=198; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Ich habe %quest_obj_available/%quest_obj_required %item_link für %quest_link, läuft!' WHERE `id`=199; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Durch mit %item_link für %quest_link. Weiter zum nächsten!' WHERE `id`=200; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Noch eins abgehakt! %item_link für %quest_link ist durch!' WHERE `id`=201; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Grinde weiter %item_link für %quest_link, habe %quest_obj_available/%quest_obj_required geschafft.' WHERE `id`=202; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Bin fast durch! Brauche noch %quest_obj_missing %item_link für %quest_link.' WHERE `id`=203; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Nicht rechtzeitig %quest_link geschafft...' WHERE `id`=204; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Zeit für %quest_link abgelaufen :(' WHERE `id`=205; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Alle Ziele für %quest_link abgeschlossen' WHERE `id`=206; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Alle Ziele für %quest_link erledigt' WHERE `id`=207; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Ich gebe %quest_link gleich ab, habe gerade alle Ziele erledigt' WHERE `id`=208; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Jaaa, endlich %quest_link abgegeben' WHERE `id`=209; +UPDATE `ai_playerbot_texts` SET `text_loc3`='hab %quest_link abgegeben' WHERE `id`=210; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Hab %quest_link geschafft, gerade abgegeben' WHERE `id`=211; +UPDATE `ai_playerbot_texts` SET `text_loc3`='gerade %quest_link abgegeben' WHERE `id`=212; +UPDATE `ai_playerbot_texts` SET `text_loc3`='gerade %quest_link in %zone_name abgegeben' WHERE `id`=213; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Noch eine Quest abgeschlossen! %quest_link abgegeben' WHERE `id`=214; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Mission erfüllt! %quest_link ist abgegeben' WHERE `id`=215; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Endlich, %quest_link abgegeben! Was für ein Ritt!' WHERE `id`=216; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Grade %quest_link abgeschlossen und abgegeben, fühlt sich gut an!' WHERE `id`=217; +UPDATE `ai_playerbot_texts` SET `text_loc3`='%quest_link in %zone_name abgegeben. Weiter zur nächsten Herausforderung!' WHERE `id`=218; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Hab %quest_link abgegeben. Wieder eine weniger!' WHERE `id`=219; +UPDATE `ai_playerbot_texts` SET `text_loc3`='%quest_link erfolgreich abgegeben, das hat gedauert!' WHERE `id`=220; +UPDATE `ai_playerbot_texts` SET `text_loc3`='%quest_link in %zone_name abgeschlossen und abgegeben. Fühlt sich gut an!' WHERE `id`=221; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Quest fertig! %quest_link abgegeben und bereit für die nächste!' WHERE `id`=222; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Endlich %quest_link in %zone_name abgegeben. Die war knackig!' WHERE `id`=223; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Das wars, %quest_link abgegeben! Jetzt Belohnung einsacken!' WHERE `id`=224; +UPDATE `ai_playerbot_texts` SET `text_loc3`='%quest_link fertig! Jetzt abgeben und weiter.' WHERE `id`=225; +UPDATE `ai_playerbot_texts` SET `text_loc3`='%quest_link eben abgeschlossen und abgegeben. Weiter gehts!' WHERE `id`=228; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Wieder eine im Kasten, %quest_link abgegeben' WHERE `id`=229; +UPDATE `ai_playerbot_texts` SET `text_loc3`='%quest_link abgegeben! Zeit, die Belohnung abzuholen.' WHERE `id`=230; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Das ging fix! %quest_link schon abgegeben!' WHERE `id`=232; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Gerade %quest_link in %zone_name abgegeben. Bereit fürs nächste Abenteuer!' WHERE `id`=233; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Mission komplett! %quest_link ist abgegeben!' WHERE `id`=235; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Hab gerade %quest_link beendet und abgegeben, weiter zur nächsten!' WHERE `id`=236; +UPDATE `ai_playerbot_texts` SET `text_loc3`='wieder %victim_name gelegt' WHERE `id`=237; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Ich leg ständig %victim_name um, nix Besonderes' WHERE `id`=238; +UPDATE `ai_playerbot_texts` SET `text_loc3`='noch ein %victim_name beißt ins Gras' WHERE `id`=239; +UPDATE `ai_playerbot_texts` SET `text_loc3`='ein %victim_name weniger in %zone_name' WHERE `id`=240; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Hab diesen Elite-Bastard %victim_name umgehauen!' WHERE `id`=241; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Elite %victim_name in %zone_name gekillt' WHERE `id`=242; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Puh, %victim_name doch noch gelegt!' WHERE `id`=243; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Gefällt dir das %victim_name?! Willst du, dass ich drei Wochen zurückspule, als du noch gelebt hast?!' WHERE `id`=244; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Yo, hab gerade %victim_name gekillt!' WHERE `id`=245; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Rare %victim_name in %zone_name gekillt' WHERE `id`=246; +UPDATE `ai_playerbot_texts` SET `text_loc3`='WTF hab ich da gerade umgehauen? %victim_name' WHERE `id`=247; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Gerade das Pet %victim_name gekillt' WHERE `id`=248; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Oh ja, hab gerade %victim_name gekillt' WHERE `id`=249; +UPDATE `ai_playerbot_texts` SET `text_loc3`='%victim_name in %zone_name gekillt' WHERE `id`=250; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Wieder %victim_name erlegt' WHERE `id`=251; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Ich leg ständig %victim_name um, nix Besonderes' WHERE `id`=252; +UPDATE `ai_playerbot_texts` SET `text_loc3`='noch ein %victim_name beißt ins Gras' WHERE `id`=253; +UPDATE `ai_playerbot_texts` SET `text_loc3`='ein %victim_name weniger in %zone_name' WHERE `id`=254; +UPDATE `ai_playerbot_texts` SET `text_loc3`='%victim_name so nebenbei umgehauen' WHERE `id`=255; +UPDATE `ai_playerbot_texts` SET `text_loc3`='%victim_name hatte keine Chance' WHERE `id`=256; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Schon wieder %victim_name aus dem Weg geräumt' WHERE `id`=257; +UPDATE `ai_playerbot_texts` SET `text_loc3`='%victim_name war zu easy, weiter gehts' WHERE `id`=258; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Und wieder %victim_name plattgemacht. Kinderkram' WHERE `id`=259; +UPDATE `ai_playerbot_texts` SET `text_loc3`='%victim_name war gar nicht so tough' WHERE `id`=260; +UPDATE `ai_playerbot_texts` SET `text_loc3`='%victim_name liegt, nix Besonderes' WHERE `id`=261; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Das war zu easy, %victim_name liegt' WHERE `id`=262; +UPDATE `ai_playerbot_texts` SET `text_loc3`='%victim_name ist so schnell umgekippt, einmal blinzeln und vorbei' WHERE `id`=263; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Diesen Elite %victim_name umgehauen!' WHERE `id`=264; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Elite %victim_name existiert nicht mehr' WHERE `id`=265; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Den Elite %victim_name weggemacht wie ein Boss' WHERE `id`=266; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Elite-Mob %victim_name, hat keine Chance gegen mich!' WHERE `id`=267; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Endlich den mächtigen %victim_name gelegt' WHERE `id`=268; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Elite %victim_name in %zone_name gekillt' WHERE `id`=269; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Hab gerade Elite %victim_name in %zone_name erwischt' WHERE `id`=270; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Elite %victim_name gekillt. Viel zu easy' WHERE `id`=271; +UPDATE `ai_playerbot_texts` SET `text_loc3`='%victim_name in %zone_name umgehauen, was ein Kampf' WHERE `id`=272; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Elite %victim_name gekillt. Ich scheine unaufhaltbar zu sein' WHERE `id`=273; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Puh, %victim_name doch noch gelegt!' WHERE `id`=274; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Seltener Elite %victim_name liegt' WHERE `id`=275; +UPDATE `ai_playerbot_texts` SET `text_loc3`='%victim_name gibt es nicht mehr. Noch ein seltener Elite gelegt' WHERE `id`=276; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Seltener Elite %victim_name down. Ich bin aus Feuer!' WHERE `id`=277; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Hab gerade den seltenen Elite %victim_name gekillt' WHERE `id`=278; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Das war geil! %victim_name gerade gekillt! Was ein Kampf' WHERE `id`=279; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Weltenboss %victim_name ist down! Das war episch' WHERE `id`=280; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Hab den Weltenboss %victim_name gelegt. Zeit zum Feiern!' WHERE `id`=281; +UPDATE `ai_playerbot_texts` SET `text_loc3`='%victim_name gekillt! Der Weltenboss war kein Spaß!' WHERE `id`=282; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Gerade %victim_name gekillt, das war legendär' WHERE `id`=283; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Yo, hab gerade %victim_name gekillt!' WHERE `id`=284; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Seltener %victim_name down. War ein geiler Fight' WHERE `id`=285; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Hab gerade den seltenen %victim_name gekillt' WHERE `id`=286; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Seltener %victim_name in %zone_name besiegt' WHERE `id`=287; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Gerade seltenen %victim_name in %zone_name gekillt. Das ging fix!' WHERE `id`=288; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Seltenen %victim_name in %zone_name gekillt' WHERE `id`=289; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Den seltenen %victim_name in %zone_name erwischt' WHERE `id`=290; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Hab %victim_name in %zone_name gekillt. Das tat gut' WHERE `id`=291; +UPDATE `ai_playerbot_texts` SET `text_loc3`='%victim_name in %zone_name umgehauen. Keine Chance gehabt' WHERE `id`=292; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Gerade %victim_name in %zone_name gekillt, easy' WHERE `id`=293; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Was hab ich da gerade gekillt? %victim_name' WHERE `id`=294; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Was ist das für ein %victim_name? Sowas hab ich noch nie gesehen' WHERE `id`=295; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Hab gerade was Seltsames gekillt, %victim_name' WHERE `id`=296; +UPDATE `ai_playerbot_texts` SET `text_loc3`='%victim_name war seltsam, aber liegt trotzdem' WHERE `id`=297; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Gerade %victim_name besiegt' WHERE `id`=298; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Machs gut, %victim_name. Warst nur ein Pet' WHERE `id`=299; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Hab gerade das Pet %victim_name umgehauen. Das kam unerwartet.' WHERE `id`=300; +UPDATE `ai_playerbot_texts` SET `text_loc3`='%victim_name liegt. Vielleicht nächstes Mal, Pet' WHERE `id`=301; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Ding! %my_level' WHERE `id`=302; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Jaaa, ich bin Level %my_level!' WHERE `id`=303; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Gerade aufgelevelt' WHERE `id`=304; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Stufe %my_level!!! Jetzt kann ich Endgame-Content machen' WHERE `id`=309; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Frisch auf Level %my_level, %my_class!!!' WHERE `id`=310; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Noch ein Level: %my_level, %my_race %my_class!' WHERE `id`=311; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Ding! Wieder ein Level up!' WHERE `id`=312; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Jetzt offiziell Level %my_level!' WHERE `id`=313; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Level %my_level, fühl mich jetzt schon stärker!' WHERE `id`=314; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Aufwärts! Level %my_level erreicht' WHERE `id`=315; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Das ging fix, schon Level %my_level!' WHERE `id`=316; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Gerade Level %my_level erreicht, auf gehts!' WHERE `id`=317; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Level %my_level, jetzt kommen die großen Sachen!' WHERE `id`=318; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Level %my_level, ich bin jetzt on fire!' WHERE `id`=319; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Level %my_level voll und weiter!' WHERE `id`=320; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Bin jetzt Level %my_level, was kommt als Nächstes?' WHERE `id`=321; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Level %my_level!!! Es passiert!' WHERE `id`=322; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Gerade Level %my_level erreicht, fühlt sich mega an!' WHERE `id`=323; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Level %my_level und ich fange erst an!' WHERE `id`=324; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Wow, schon Level %my_level, unaufhaltbar!' WHERE `id`=325; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Neue Höhen mit Level %my_level!!!' WHERE `id`=326; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Level %my_level und weiter Vollgas!' WHERE `id`=327; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Level %my_level erreicht, fühlt sich so gut an!' WHERE `id`=329; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Bin jetzt Level %my_level! Los gehts!' WHERE `id`=330; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Level %my_level, noch viel vor mir!' WHERE `id`=331; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Endlich Level %my_level erreicht, ich kann alles!' WHERE `id`=332; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Maxlevel %my_level, Endgame ich komme!' WHERE `id`=333; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Endgame freigeschaltet auf Level %my_level, her damit!' WHERE `id`=335; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Hab Level %my_level erreicht, Zeit zu glänzen!' WHERE `id`=336; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Level %my_level, lasst uns Endgame-Raids machen!' WHERE `id`=337; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Mit Level %my_level hält mich nix mehr auf!' WHERE `id`=338; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Level %my_level, bereit für High-Level-Content!' WHERE `id`=339; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Yes! Level %my_level, %my_class für alles bereit!' WHERE `id`=340; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Level %my_level, Zeit die Welt herauszufordern!' WHERE `id`=341; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Level %my_level erreicht, schnappen wir uns die Elitebosse!' WHERE `id`=342; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Jetzt bin ich Level %my_level, das echte Abenteuer beginnt!' WHERE `id`=343; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Level %my_level! Zeit für ernsthafte Action!' WHERE `id`=344; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Endlich auf Level %my_level! Jetzt zeige ich, was ich kann!' WHERE `id`=346; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Level %my_level ist da! Bereit für die große Liga!' WHERE `id`=347; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Gerade Level %my_level erreicht, macht euch bereit für echte Herausforderungen!' WHERE `id`=348; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Level %my_level voll, Zeit für epischen Content!' WHERE `id`=349; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Frisch auf Level %my_level! Bereit für Endgame-Inis!' WHERE `id`=350; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Jetzt, wo ich Level %my_level bin, ist nichts mehr außerhalb meiner Reichweite!' WHERE `id`=351; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Jetzt ist es offiziell! Level %my_level, Zeit zu dominieren!' WHERE `id`=352; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Level %my_level geschafft! Zeit, der Welt meinen Stempel aufzudrücken!' WHERE `id`=353; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Level %my_level freigeschaltet! Jetzt beginnt der echte Spaß!' WHERE `id`=354; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Level %my_level, und die Welt ist mein Spielplatz!' WHERE `id`=355; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Level %my_level, bereit, der Welt meine Power zu zeigen!' WHERE `id`=356; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Gerade %my_level erreicht, jetzt geh ich all in!' WHERE `id`=357; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Level %my_level, endlich kann ich alles angehen!' WHERE `id`=358; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Level %my_level, fühl mich unaufhaltbar!' WHERE `id`=359; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Gerade Level %my_level erreicht, kanns kaum erwarten ins Endgame zu springen!' WHERE `id`=360; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Gute Arbeit, %other_name. Das hast du dir verdient.' WHERE `id`=361; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Das war mies, %other_name. Ich mags nicht, aber...' WHERE `id`=362; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Glückwunsch, %other_name, du hast den Aufstieg verdient!' WHERE `id`=363; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Verdient, %other_name - willkommen im nächsten Level!' WHERE `id`=364; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Beförderungszeit! %other_name, die hast du dir verdient!' WHERE `id`=366; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Neue Rolle für %other_name! Gut gemacht, weiter so!' WHERE `id`=367; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Dickes Gratz an %other_name, wohlverdiente Beförderung!' WHERE `id`=368; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Applaus für %other_name zur Beförderung!' WHERE `id`=369; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Gratulation an %other_name zur Beförderung! Weiter so!' WHERE `id`=370; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Gratz, %other_name, du steigst auf! Gut gemacht!' WHERE `id`=371; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Noch ein Schritt nach oben für %other_name! Glückwunsch!' WHERE `id`=372; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Harte Entscheidung, aber %other_name, du wurdest degradiert. Zeit, dich zu beweisen!' WHERE `id`=373; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Sorry, %other_name, aber es gibt eine Degradierung. Komm stärker zurück!' WHERE `id`=374; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Leider, %other_name, diesmal eine Degradierung. Beim nächsten Mal packst du es!' WHERE `id`=375; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Schwere Entscheidung, aber %other_name, du wurdest degradiert. Zeit, dich wieder hochzugrinden!' WHERE `id`=376; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Unschön, aber %other_name, vorerst eine Degradierung.' WHERE `id`=377; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Sorry, %other_name, dein Rang wurde gesenkt. Lass uns zusammen härter arbeiten!' WHERE `id`=378; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Eine Degradierung für %other_name... Zeit, sich zu fokussieren und wieder hochzukommen!' WHERE `id`=379; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Nicht das, was wir wollten, aber %other_name, du wurdest degradiert. Lern draus und komm stärker zurück!' WHERE `id`=380; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Harter Moment für %other_name, aber wir wissen, du kommst von der Degradierung zurück!' WHERE `id`=381; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Sorry, %other_name, aber du wurdest degradiert. Zeit für Verbesserungen!' WHERE `id`=382; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Wir wollten das nicht für %other_name, aber es gab eine Degradierung. Zeit, besser zu werden!' WHERE `id`=383; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Frisches Blut gesucht! Tritt der Gilde bei, sei Teil von was Großem!' WHERE `id`=384; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Wir rekrutieren neue Mitglieder! Wenn du bereit bist, schließ dich an - die Gildentür steht offen!' WHERE `id`=385; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Die Gilde sucht fähige Abenteurer. Schließ dich an und geh mit uns ab!' WHERE `id`=386; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Bock auf eine starke Gilde? Wir suchen neue Member! Komm rein!' WHERE `id`=387; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Die Gilde wächst! Join uns für fette Abenteuer und Loot!' WHERE `id`=388; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Wer hat Bock auf %instance_name?' WHERE `id`=389; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Gibts Gruppen für %instance_name?' WHERE `id`=390; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Brauch jemand Hilfe für %instance_name?' WHERE `id`=391; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Suche Gruppe: %instance_name.' WHERE `id`=392; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Braucht wer %my_role für %instance_name?' WHERE `id`=393; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Fehlt %my_role für %instance_name?' WHERE `id`=394; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Ich kann %my_role für %instance_name sein.' WHERE `id`=395; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Braucht ihr %my_role für %instance_name?' WHERE `id`=397; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Braucht wer Gear aus %instance_name?' WHERE `id`=398; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Kleiner Grind in %instance_name?' WHERE `id`=399; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Lust auf %instance_name' WHERE `id`=400; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Bock auf %instance_name.' WHERE `id`=402; +UPDATE `ai_playerbot_texts` SET `text_loc3`='%my_role sucht Gruppe für %instance_name.' WHERE `id`=403; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Was ist mit %instance_name?' WHERE `id`=404; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Rein in %instance_name?' WHERE `id`=406; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Suche Gruppe für %instance_name.' WHERE `id`=407; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Braucht wer Hilfe bei Quests in %instance_name?' WHERE `id`=408; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Bock auf Quests in %instance_name.' WHERE `id`=409; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Wer hat Quests in %instance_name?' WHERE `id`=410; +UPDATE `ai_playerbot_texts` SET `text_loc3`='%my_role: Platz in Gruppe für %instance_name?' WHERE `id`=412; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Läuft überhaupt noch jemand %instance_name?' WHERE `id`=413; +UPDATE `ai_playerbot_texts` SET `text_loc3`='%instance_name: nimmt wer einen %my_role mit?' WHERE `id`=414; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Lohnt es sich als %my_role in %instance_name?' WHERE `id`=415; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Lohnt es sich echt, nach %instance_name zu gehen?' WHERE `id`=416; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Die Bosse in %instance_name droppen gutes Gear. Bock zu grinden?' WHERE `id`=418; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Was ist mit %instance_name?' WHERE `id`=419; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Braucht jemand %my_role?' WHERE `id`=420; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Braucht wer %my_role?' WHERE `id`=421; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Wer hat Bock auf %instance_name?' WHERE `id`=422; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Kann mich jemand bei %instance_name beschwören?' WHERE `id`=423; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Trefft mich in %instance_name' WHERE `id`=424; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Bock auf schnellen %instance_name Run' WHERE `id`=425; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Bock auf kompletten %instance_name Run' WHERE `id`=426; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Wie oft wart ihr schon in %instance_name?' WHERE `id`=427; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Noch ein %instance_name Run?' WHERE `id`=428; +UPDATE `ai_playerbot_texts` SET `text_loc3`='In %instance_name gewiped? Nehmt lieber mich!' WHERE `id`=429; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Nehmt mich bitte mit nach %instance_name.' WHERE `id`=430; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Wer nimmt %my_role mit nach %instance_name?' WHERE `id`=433; +UPDATE `ai_playerbot_texts` SET `text_loc3`='LFG %instance_name, bin %my_role' WHERE `id`=434; +UPDATE `ai_playerbot_texts` SET `text_loc3`='%my_role LFG %instance_name' WHERE `id`=435; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Brauche einen DD für %instance_name' WHERE `id`=437; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Suche einen Heiler für %instance_name' WHERE `id`=438; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Will %instance_name machen. Brauche eine Gruppe!' WHERE `id`=440; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Suche noch einen für %instance_name' WHERE `id`=442; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Will jemand mit nach %instance_name?' WHERE `id`=443; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Interesse an %instance_name?' WHERE `id`=444; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Suche einen schnellen Run durch %instance_name' WHERE `id`=445; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Wer ist dabei für %instance_name?' WHERE `id`=446; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Wollt ihr %instance_name farmen?' WHERE `id`=448; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Will %instance_name abschließen' WHERE `id`=449; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Suche Carry durch %instance_name' WHERE `id`=451; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Laufe %instance_name, suche andere' WHERE `id`=453; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Suche jemanden, der bei %instance_name hilft' WHERE `id`=455; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Brauche %my_role für %instance_name!' WHERE `id`=456; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Bock auf einen %instance_name Run?' WHERE `id`=457; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Brauche %my_role für %instance_name Run' WHERE `id`=458; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Will jemand Gear aus %instance_name farmen?' WHERE `id`=459; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Suche Gruppe für %instance_name Speedrun' WHERE `id`=460; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Brauche Gruppe, um %instance_name zu clearen' WHERE `id`=461; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Interesse, %instance_name zu farmen?' WHERE `id`=462; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Suche etwas Gear aus %instance_name' WHERE `id`=463; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Wer hat Lust auf einen schnellen %instance_name Run?' WHERE `id`=464; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Will jemand %instance_name zusammen angehen?' WHERE `id`=465; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Suche Leute, um %instance_name abzuschließen' WHERE `id`=466; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Kriegen wir eine Gruppe für %instance_name zusammen?' WHERE `id`=467; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Brauche einen schnellen Run für %instance_name' WHERE `id`=468; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Wer hat Lust, %instance_name zusammen zu farmen?' WHERE `id`=469; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Suche noch ein paar Leute für %instance_name' WHERE `id`=470; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Braucht jemand Hilfe bei den Mechaniken in %instance_name?' WHERE `id`=471; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Brauche schnell eine Gruppe für %instance_name' WHERE `id`=472; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Will jemand %instance_name als Speedrun laufen?' WHERE `id`=473; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Suche einen schnellen Abschluss von %instance_name' WHERE `id`=474; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Suche jemanden, der bei %instance_name mitkommt' WHERE `id`=475; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Wer hat Lust, %instance_name zu clearen?' WHERE `id`=476; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Brauche Hilfe beim Endboss von %instance_name' WHERE `id`=477; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Wer hat heute Lust, %instance_name zu laufen?' WHERE `id`=478; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Suche schnellen Run in %instance_name, um etwas Gear zu farmen' WHERE `id`=479; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Will jemand Mats aus %instance_name farmen?' WHERE `id`=480; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Lass uns eine Gruppe für %instance_name machen' WHERE `id`=481; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Braucht wer Hilfe bei %quest_link?' WHERE `id`=482; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Will jemand %quest_link teilen?' WHERE `id`=483; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Macht jemand %quest_link?' WHERE `id`=484; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Bock auf %quest_link.' WHERE `id`=485; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Wer hilft bei %quest_link?' WHERE `id`=487; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Braucht jemand Unterstützung bei %quest_link?' WHERE `id`=488; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Interesse an %quest_link?' WHERE `id`=489; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Will jemand %quest_link abschließen?' WHERE `id`=490; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Braucht wer ein Team für %quest_link?' WHERE `id`=491; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Wer hat Bock auf %quest_link?' WHERE `id`=492; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Will %quest_link machen. Wer ist dabei?' WHERE `id`=497; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Wer ist bereit für %quest_link?' WHERE `id`=499; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Wer will bei %quest_link mitmachen?' WHERE `id`=500; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Wer ist bei %quest_link dabei?' WHERE `id`=501; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Brauche hier etwas Hilfe bei %quest_link.' WHERE `id`=502; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Wer ist bereit, %quest_link zu machen?' WHERE `id`=504; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Suche etwas Hilfe für %quest_link.' WHERE `id`=505; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Braucht jemand Hilfe bei %quest_link?' WHERE `id`=506; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Wer hat Lust, %quest_link abzuschließen?' WHERE `id`=507; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Braucht jemand Unterstützung bei %quest_link?' WHERE `id`=508; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Wer kann bei %quest_link helfen?' WHERE `id`=509; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Suche eine helfende Hand bei %quest_link.' WHERE `id`=510; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Ist jemand bereit für %quest_link?' WHERE `id`=511; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Kann jemand bei %quest_link dazukommen?' WHERE `id`=512; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Suche ein paar Mitstreiter für %quest_link.' WHERE `id`=513; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Will jemand sich für %quest_link zusammentun?' WHERE `id`=514; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Wer muss %quest_link noch abschließen?' WHERE `id`=516; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Will %quest_link abschließen.' WHERE `id`=517; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Wer kann bei %quest_link mitkommen?' WHERE `id`=518; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Interesse, %quest_link abzuschließen?' WHERE `id`=519; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Bock, bei %quest_link zu helfen?' WHERE `id`=520; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Ist jemand bereit, bei %quest_link zu helfen?' WHERE `id`=521; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Brauche jemanden, um %quest_link zu beenden.' WHERE `id`=522; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Will jemand %quest_link beenden?' WHERE `id`=523; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Gibt’s Hilfe für %quest_link?' WHERE `id`=524; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Wer ist dabei für %quest_link?' WHERE `id`=525; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Suche Partner zum Abschließen von %quest_link.' WHERE `id`=526; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Wer hat Lust, %quest_link zu beenden?' WHERE `id`=527; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Heute jemand Interesse an %quest_link?' WHERE `id`=529; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Wer hat jetzt Bock auf %quest_link?' WHERE `id`=531; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Will jemand %quest_link starten?' WHERE `id`=532; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Bitte um Hilfe bei %quest_link.' WHERE `id`=533; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Wer kann mir bei %quest_link helfen?' WHERE `id`=534; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Suche Gruppe für %quest_link.' WHERE `id`=535; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Jemand bereit zum %category farmen?' WHERE `id`=536; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Suche Hilfe beim %category farmen.' WHERE `id`=537; +UPDATE `ai_playerbot_texts` SET `text_loc3`='%category sind verdammt teuer!' WHERE `id`=538; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Will %category.' WHERE `id`=539; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Kaufe: %category.' WHERE `id`=541; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Interesse an %category?' WHERE `id`=542; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Verkaufe: %category.' WHERE `id`=543; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Will %category farmen.' WHERE `id`=546; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Suche Gruppe fürs %category farmen.' WHERE `id`=547; +UPDATE `ai_playerbot_texts` SET `text_loc3`='%category sind willkommen.' WHERE `id`=548; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Kaufe alles von %category.' WHERE `id`=549; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Wow, alle farmen %category!' WHERE `id`=550; +UPDATE `ai_playerbot_texts` SET `text_loc3`='AH ist heiß auf %category.' WHERE `id`=552; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Will etwas %category tauschen.' WHERE `id`=554; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Etwas %category bitte?' WHERE `id`=558; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Hätte wohl den Skill für %category lernen sollen.' WHERE `id`=559; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Ich geiere auf %category.' WHERE `id`=560; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Für %category würden die Leute töten.' WHERE `id`=561; +UPDATE `ai_playerbot_texts` SET `text_loc3`='%category ist ein Top-Deal!' WHERE `id`=562; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Wo farmt man am besten %category?' WHERE `id`=564; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Bin ready für %category.' WHERE `id`=565; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Ich behalte meine ganzen %category wohl lieber.' WHERE `id`=567; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Brauchst du eine Gruppe? Vielleicht zum %category farmen?' WHERE `id`=568; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Denke immer noch über %category nach.' WHERE `id`=569; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Hab schon von %category gehört, aber meine Taschen sind leer.' WHERE `id`=570; +UPDATE `ai_playerbot_texts` SET `text_loc3`='LFG für %category' WHERE `id`=571; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Würde mich der Verkauf von %category reich machen?' WHERE `id`=572; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Okay. Ich farme %category morgen.' WHERE `id`=573; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Hab mindestens zehn Leute gesehen, die %category farmen.' WHERE `id`=575; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Hab gestern all meine %category verkauft. Bin komplett pleite!' WHERE `id`=576; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Will einer Gilde joinen, die %category farmt.' WHERE `id`=577; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Verkaufe %category, wer hat Interesse?' WHERE `id`=580; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Verkaufe %category, flüster mir.' WHERE `id`=582; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Brauche %category, verkauft das jemand?' WHERE `id`=584; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Hab %category zu verkaufen, meldet euch!' WHERE `id`=585; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Verkaufe %category, bester Preis am Markt.' WHERE `id`=588; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Suche %category im Tausch gegen %category.' WHERE `id`=589; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Wer braucht %category? Hab was zu verkaufen!' WHERE `id`=591; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Habe %category zu verkaufen, flüster mir für den Preis.' WHERE `id`=592; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Will %category verkaufen, flüster mir für Details.' WHERE `id`=593; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Kaufe: %category. Verkauft das jemand?' WHERE `id`=594; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Suche %category, bitte melden.' WHERE `id`=595; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Wer hat Interesse an %category?' WHERE `id`=596; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Kann jemand beim %category farmen helfen?' WHERE `id`=597; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Will %category kaufen, flüster mir einfach.' WHERE `id`=599; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Suche %category. Wer hat was?' WHERE `id`=600; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Kaufe: %category zum fairen Preis.' WHERE `id`=601; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Brauche dringend %category, hat wer was?' WHERE `id`=602; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Hab %category, verkaufe günstig.' WHERE `id`=603; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Verkaufe %category zum guten Kurs.' WHERE `id`=604; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Suche %category, verkauft wer günstig?' WHERE `id`=605; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Verkauft jemand %category? Hätte Interesse.' WHERE `id`=606; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Brauche %category, flüstert mir wenn ihr verkauft.' WHERE `id`=607; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Hat wer %category übrig zum Tauschen?' WHERE `id`=608; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Hat wer Interesse, %category zu tauschen?' WHERE `id`=610; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Verkaufe %category, meldet euch für Tausch.' WHERE `id`=611; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Kaufe: %category, suche guten Kurs.' WHERE `id`=612; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Wer braucht %category? Hab was übrig.' WHERE `id`=613; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Will wer %category? Verkaufe billig.' WHERE `id`=614; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Suche %category, verkauft wer was?' WHERE `id`=615; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Braucht jemand %category? Hab was zum Tauschen.' WHERE `id`=616; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Kaufe: %category. Ist jemand günstiger als AH?' WHERE `id`=617; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Verkaufe %category billig, flüster mir für Details.' WHERE `id`=618; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Braucht wer %category? Hab was zu verkaufen.' WHERE `id`=619; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Tausche %category gegen was anderes.' WHERE `id`=620; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Hab %category, tausche gegen %category.' WHERE `id`=621; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Kaufe: %category, hat wer was übrig?' WHERE `id`=622; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Farmt wer Ruf bei %faction?' WHERE `id`=623; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Kann wer bei %faction helfen?' WHERE `id`=624; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Hab Bock auf Quests für %faction.' WHERE `id`=625; +UPDATE `ai_playerbot_texts` SET `text_loc3`='%faction ist die beste Fraktion.' WHERE `id`=626; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Fehlt nur noch ein bisschen bis %rep_level bei %faction.' WHERE `id`=627; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Hat jemand %rep_level bei %faction?' WHERE `id`=628; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Wer will %rep_level bei %faction sein?' WHERE `id`=629; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Ich werde nie %rep_level bei %faction sein.' WHERE `id`=630; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Fehlt jemandem Ruf bei %faction?' WHERE `id`=631; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Kann beim Ruf farmen für %faction helfen.' WHERE `id`=632; +UPDATE `ai_playerbot_texts` SET `text_loc3`='%faction: brauche %rndK bis %rep_level.' WHERE `id`=634; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Wer kann Quests von %faction teilen?' WHERE `id`=635; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Gibts Inis für %faction?' WHERE `id`=636; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Hab Bock, Ruf bei %faction zu grinden.' WHERE `id`=637; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Lasst uns Ruf bei %faction farmen!' WHERE `id`=638; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Farme Ruf bei %faction.' WHERE `id`=639; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Bock, für %faction zu farmen.' WHERE `id`=640; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Brauche Hilfe bei %faction.' WHERE `id`=641; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Verkauft %faction was Nützliches?' WHERE `id`=642; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Wer farmt für %faction?' WHERE `id`=644; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Wie farmt man %faction am besten?' WHERE `id`=645; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Ich hasse den Rufgrind für %faction.' WHERE `id`=646; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Ich hab %faction so satt.' WHERE `id`=647; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Gehen wir %faction an?' WHERE `id`=648; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Scheint, als wenn alle %rep_level bei %faction sind. Nur ich hänge wie immer hinterher.' WHERE `id`=649; +UPDATE `ai_playerbot_texts` SET `text_loc3`='LFG für Rufgrind bei %faction?' WHERE `id`=650; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Kann jemand einen guten Spot für Rufgrind bei %faction empfehlen?' WHERE `id`=651; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Bringt mir Ruf bei %faction überhaupt was?' WHERE `id`=652; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Wer hätte gedacht, dass Ruf bei %faction doch noch nützlich ist...' WHERE `id`=653; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Lohnt es sich, meinen Ruf bei %faction zu pushen?' WHERE `id`=655; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Was ist besser für %faction? Quests oder Mobs grinden?' WHERE `id`=656; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Grinde euren Ruf bei %faction, gebt mir nur etwas Gold.' WHERE `id`=657; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Ich glaube, Ruf bei %faction zu grinden dauert ewig.' WHERE `id`=658; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Ich kill jeden Tag für %faction, bin aber noch weit weg von %rep_level.' WHERE `id`=659; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Sinken die AH-Gebühren auf %my_level?' WHERE `id`=660; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Wie viele Fraktionen hast du auf ehrfürchtig?' WHERE `id`=661; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Verdammt. Meine Gilde hat gestern ohne mich gut Ruf bei %faction gegrindet.' WHERE `id`=663; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Keiner will mir helfen, weil ich schon %rep_level bei %faction bin.' WHERE `id`=664; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Bleib bitte weg von %faction.' WHERE `id`=665; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Farmt heute jemand Ruf bei %faction?' WHERE `id`=666; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Helft mir, Ruf bei %faction zu grinden!' WHERE `id`=667; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Ich brauch so dringend %rep_level bei %faction!' WHERE `id`=668; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Lohnt sich der Grind für %faction?' WHERE `id`=669; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Kennt jemand gute Spots für Ruf bei %faction?' WHERE `id`=670; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Ich liebe es, Ruf bei %faction zu grinden!' WHERE `id`=671; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Brauche Hilfe, um den Rufgrind bei %faction abzuschließen!' WHERE `id`=672; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Nur noch ein paar Stufen bis %rep_level bei %faction!' WHERE `id`=673; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Wer hat heute Bock auf Grind für %faction?' WHERE `id`=674; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Suche Mitstreiter für Rufgrind bei %faction!' WHERE `id`=675; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Ich bin das Rufgrinden für %faction leid!' WHERE `id`=676; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Noch wer auf Rufgrind bei %faction?' WHERE `id`=677; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Zeit, den Rufgrind bei %faction richtig anzugehen!' WHERE `id`=678; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Helft mir, den Ruf bei %faction fertig zu machen!' WHERE `id`=679; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Mir fehlen nur noch %rndK für den %faction Ruf!' WHERE `id`=680; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Den ganzen Tag Ruf bei %faction am farmen!' WHERE `id`=681; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Rufgrind bei %faction endet nie!' WHERE `id`=683; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Hilfe bei den Daily-Quests von %faction?' WHERE `id`=684; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Wer ist grad beim Grind für %faction?' WHERE `id`=685; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Lasst uns Quests von %faction zusammen machen!' WHERE `id`=686; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Farmt heute jemand Ruf bei %faction?' WHERE `id`=687; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Brauche Hilfe beim Ruf bei %faction für %rep_level!' WHERE `id`=688; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Wer will mit mir Ruf bei %faction grinden?' WHERE `id`=689; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Kommt mit zum Rufgrind bei %faction!' WHERE `id`=690; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Läuft bei mir beim Rufgrind für %faction!' WHERE `id`=691; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Will jemand Boosts für den Rufgrind bei %faction?' WHERE `id`=692; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Bei %faction fehlt nicht mehr viel bis %rep_level, helft mir doch mal!' WHERE `id`=694; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Bock, mir beim Rufgrind für %faction zu helfen?' WHERE `id`=695; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Farme wieder Ruf bei %faction!' WHERE `id`=696; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Kennt jemand einen guten Spot für Ruf bei %faction?' WHERE `id`=697; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Wie viel fehlt noch beim Rufgrind für %faction?' WHERE `id`=698; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Macht jemand Quests von %faction mit mir?' WHERE `id`=699; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Suche jemand für Rufgrind bis %rep_level bei %faction!' WHERE `id`=700; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Mir fehlen nur noch %rndK Ruf bei %faction!' WHERE `id`=701; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Der Grind für %faction ist brutal!' WHERE `id`=702; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Farmt jemand Ruf bei %faction für %rep_level?' WHERE `id`=703; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Lasst uns den Rufgrind bei %faction zusammen machen!' WHERE `id`=704; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Mehr Ruf bei %faction, mehr Belohnungen!' WHERE `id`=705; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Farme Ruf bei %faction als %my_class' WHERE `id`=706; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Hängt noch jemand bei %faction auf %rep_level fest?' WHERE `id`=707; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Die ganze Nacht Rufgrind bei %faction!' WHERE `id`=708; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Wer will den Rufgrind bei %faction mit mir abschließen?' WHERE `id`=709; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Ich kann beim Rufgrind für %faction helfen!' WHERE `id`=710; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Bereit für mehr Rufgrind bei %faction!' WHERE `id`=711; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Bock zu helfen beim Ruf für %faction? Ich brauch das dringend!' WHERE `id`=712; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Ich brauche noch %rndK für den Ruf bei %faction!' WHERE `id`=713; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Farmt mit mir für Ruf bei %faction!' WHERE `id`=714; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Mir fehlen nur noch %rndK Ruf bei %faction!' WHERE `id`=715; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Der Rufgrind bei %faction nimmt kein Ende...' WHERE `id`=716; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Hat jemand Items für Rufboost bei %faction?' WHERE `id`=717; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Farmt jemand Ruf bei %faction für Mounts?' WHERE `id`=719; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Chance, mit mir Ruf bei %faction zu farmen?' WHERE `id`=720; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Ich bin so kurz vor %rep_level bei %faction!' WHERE `id`=721; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Helft mir, %rep_level bei %faction zu erreichen!' WHERE `id`=722; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Ich bin dabei, den %faction Rufgrind abzuschließen!' WHERE `id`=723; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Brauche Hilfe beim Rufgrind für %faction!' WHERE `id`=724; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Wer kann mit mir Ruf bei %faction farmen?' WHERE `id`=726; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Rufgrind bei %faction non-stop!' WHERE `id`=727; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Wer grindet gerade noch Ruf bei %faction?' WHERE `id`=728; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Will jemand zum Spaß Ruf bei %faction farmen?' WHERE `id`=729; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Ich muss noch Ruf bei %faction farmen, um neue Quests freizuschalten!' WHERE `id`=730; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Bock, Ruf bei %faction für Belohnungen zu grinden!' WHERE `id`=731; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Tag für Tag, Rufgrind bei %faction!' WHERE `id`=732; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Will jemand beim Rufgrind für %faction helfen?' WHERE `id`=733; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Helft mir, mit Ruf bei %faction Belohnungen freizuschalten!' WHERE `id`=734; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Ich grinde Ruf bei %faction für Mounts!' WHERE `id`=735; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Kommt mit, Ruf bei %faction farmen!' WHERE `id`=736; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Beim Rufgrind für %faction bin ich fast da!' WHERE `id`=737; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Grinde Ruf bei %faction mit meinen Leuten!' WHERE `id`=738; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Hab Bock auf Party in %zone_name.' WHERE `id`=739; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Sucht jemand %my_role?' WHERE `id`=740; +UPDATE `ai_playerbot_texts` SET `text_loc3`='%my_role sucht Gilde.' WHERE `id`=741; +UPDATE `ai_playerbot_texts` SET `text_loc3`='%my_role will einer guten Gilde beitreten.' WHERE `id`=743; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Fühlt sich noch wer einsam?' WHERE `id`=745; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Wer will was abhaben?' WHERE `id`=747; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Kommt her und holt mich!' WHERE `id`=748; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Macht hier grade jemand etwas?' WHERE `id`=750; +UPDATE `ai_playerbot_texts` SET `text_loc3`='%zone_name: ist hier jemand?' WHERE `id`=751; +UPDATE `ai_playerbot_texts` SET `text_loc3`='%zone_name: Wo sind alle?' WHERE `id`=752; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Scheint als wäre ich allein in %zone_name.' WHERE `id`=753; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Trefft mich in %zone_name.' WHERE `id`=754; +UPDATE `ai_playerbot_texts` SET `text_loc3`='%zone_name ist der beste Spot!' WHERE `id`=756; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Will nach %zone_name. Kommt wer mit?' WHERE `id`=757; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Ich mag %zone_name nicht, aber wohin sonst?' WHERE `id`=759; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Gibt’s gute Quests in %zone_name?' WHERE `id`=760; +UPDATE `ai_playerbot_texts` SET `text_loc3`='%zone_name ist der übelste Spot.' WHERE `id`=764; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Schnappt mich in %zone_name!' WHERE `id`=765; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Ab nach %zone_name!' WHERE `id`=766; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Bock zu questen in %zone_name' WHERE `id`=767; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Hat wer Quests in %zone_name?' WHERE `id`=768; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Kommt her nach %zone_name!' WHERE `id`=769; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Sieht so aus, als wär keine Horde in %zone_name' WHERE `id`=770; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Sieht so aus, als wär keine Allianz in %zone_name' WHERE `id`=771; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Ich bin echt müde von %zone_name. Vielleicht sollte ich woanders hin?' WHERE `id`=772; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Ich will nach Hause und dann in die Kiste.' WHERE `id`=774; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Weiß wer, was man fürs Beidhändig-Kämpfen braucht?' WHERE `id`=775; +UPDATE `ai_playerbot_texts` SET `text_loc3`='hi zusammen!' WHERE `id`=776; +UPDATE `ai_playerbot_texts` SET `text_loc3`='%zone_name ist gemütlich' WHERE `id`=777; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Ich fühl mich super' WHERE `id`=778; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Ich ignoriere Leute nicht, ich trolle sie, bis sie mich ignorieren' WHERE `id`=779; +UPDATE `ai_playerbot_texts` SET `text_loc3`='schön zu sehen, dass der Chat sich noch erinnert' WHERE `id`=781; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Wie jede Waffe ist es Jäger-BiS' WHERE `id`=782; +UPDATE `ai_playerbot_texts` SET `text_loc3`='für mich geht es im Spiel nur ums Solo-Spielen und darum, neue Wege zu finden, Dinge solo zu machen' WHERE `id`=783; +UPDATE `ai_playerbot_texts` SET `text_loc3`='ich habe NIEMANDEN jemals abgezockt' WHERE `id`=784; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Zeit, mir den Weg nach %zone_name freizukämpfen' WHERE `id`=787; +UPDATE `ai_playerbot_texts` SET `text_loc3`='ich muss kacken' WHERE `id`=789; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Wenn du deine häutbaren Kills nicht lootest, schrumpft dein Schniedel jedes mal dauerhaft um 1mm' WHERE `id`=790; +UPDATE `ai_playerbot_texts` SET `text_loc3`='NEEEEEEEEEEEEIN' WHERE `id`=791; +UPDATE `ai_playerbot_texts` SET `text_loc3`='ICH MAG ZÜGE' WHERE `id`=792; +UPDATE `ai_playerbot_texts` SET `text_loc3`='/w mir im chat' WHERE `id`=793; +UPDATE `ai_playerbot_texts` SET `text_loc3`='hi, wie geht es euch' WHERE `id`=794; +UPDATE `ai_playerbot_texts` SET `text_loc3`='hab mich grad ausgeloggt und wieder eingeloggt' WHERE `id`=795; +UPDATE `ai_playerbot_texts` SET `text_loc3`='könnt ihr mal leiser sein, ich hab mich in %zone_name verlaufen' WHERE `id`=796; +UPDATE `ai_playerbot_texts` SET `text_loc3`='wer will mit mir was trinken in %zone_name ...hicks!' WHERE `id`=797; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Früher war der Bait glaubwürdiger.' WHERE `id`=799; +UPDATE `ai_playerbot_texts` SET `text_loc3`='vielleicht hast du einfach deine Unschuld verloren' WHERE `id`=800; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Gibts hier Gilden, die %my_role mitziehen?' WHERE `id`=801; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Sobald man höher kommt, ist Gold easy zu machen' WHERE `id`=802; +UPDATE `ai_playerbot_texts` SET `text_loc3`='moin' WHERE `id`=803; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Warum tut mir der Arsch weh?' WHERE `id`=804; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Ich hab das Gefühl, Willenskraft ist BiS zum Leveln' WHERE `id`=805; +UPDATE `ai_playerbot_texts` SET `text_loc3`='bei Trollen erst recht' WHERE `id`=806; +UPDATE `ai_playerbot_texts` SET `text_loc3`='KANN MICH JEMAND INVITEN' WHERE `id`=807; +UPDATE `ai_playerbot_texts` SET `text_loc3`='brauche viele Drinks' WHERE `id`=808; +UPDATE `ai_playerbot_texts` SET `text_loc3`='verdammte Gnome' WHERE `id`=809; +UPDATE `ai_playerbot_texts` SET `text_loc3`='niemand mag Gnome' WHERE `id`=810; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Gnome taugen nur für eins' WHERE `id`=811; +UPDATE `ai_playerbot_texts` SET `text_loc3`='nun ja' WHERE `id`=812; +UPDATE `ai_playerbot_texts` SET `text_loc3`='selbstständige Gedanken sind schon gruselig' WHERE `id`=814; +UPDATE `ai_playerbot_texts` SET `text_loc3`='der Geist ist formbarer, als man glaubt' WHERE `id`=815; +UPDATE `ai_playerbot_texts` SET `text_loc3`='gibts hier Levelgilden?' WHERE `id`=816; +UPDATE `ai_playerbot_texts` SET `text_loc3`='brb' WHERE `id`=817; +UPDATE `ai_playerbot_texts` SET `text_loc3`='warum ist Schnee weiß, aber Eis klar? ist doch das Gleiche' WHERE `id`=818; +UPDATE `ai_playerbot_texts` SET `text_loc3`='warum ist Schlagsahne fluffig und normale nicht' WHERE `id`=819; +UPDATE `ai_playerbot_texts` SET `text_loc3`='warum riechen Füße, wenn sie keine Nase haben' WHERE `id`=820; +UPDATE `ai_playerbot_texts` SET `text_loc3`='scheint als hätte jemand ne Dose Neulinge aufgemacht' WHERE `id`=821; +UPDATE `ai_playerbot_texts` SET `text_loc3`='hört auf, Neulinge mit Bullshit-Antworten zu trollen' WHERE `id`=822; +UPDATE `ai_playerbot_texts` SET `text_loc3`='gibts hier auf dem Server PvP?' WHERE `id`=823; +UPDATE `ai_playerbot_texts` SET `text_loc3`='eh klar' WHERE `id`=824; +UPDATE `ai_playerbot_texts` SET `text_loc3`='puh... :)' WHERE `id`=825; +UPDATE `ai_playerbot_texts` SET `text_loc3`='wusstet ihr schon, dass...' WHERE `id`=826; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Ich stell mir lieber nicht vor, wie sich die Viecher fühlen, während ich sie umboxe.' WHERE `id`=827; +UPDATE `ai_playerbot_texts` SET `text_loc3`='ups, falscher Chat' WHERE `id`=828; +UPDATE `ai_playerbot_texts` SET `text_loc3`='bruh, ihr dreht heute völlig durch' WHERE `id`=829; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Nett hier. Aber waren Sie schon mal in Darnassus?' WHERE `id`=830; +UPDATE `ai_playerbot_texts` SET `text_loc3`='grrr wütend' WHERE `id`=831; +UPDATE `ai_playerbot_texts` SET `text_loc3`='der Grind macht Spaß' WHERE `id`=832; +UPDATE `ai_playerbot_texts` SET `text_loc3`='WoW hält mich wachsam' WHERE `id`=833; +UPDATE `ai_playerbot_texts` SET `text_loc3`='kurze Frage: wo krieg ich den Buff für mehr XP? bin in %zone_name' WHERE `id`=834; +UPDATE `ai_playerbot_texts` SET `text_loc3`='mögt ihr Würstchen?' WHERE `id`=835; +UPDATE `ai_playerbot_texts` SET `text_loc3`='inv mich. ich helfe' WHERE `id`=836; +UPDATE `ai_playerbot_texts` SET `text_loc3`='welche Klasse ist gut für PvP?' WHERE `id`=837; +UPDATE `ai_playerbot_texts` SET `text_loc3`='wo zum Teufel ist der Kochlehrer in %zone_name' WHERE `id`=838; +UPDATE `ai_playerbot_texts` SET `text_loc3`='wisst ihr, was in %zone_name abgeht?' WHERE `id`=839; +UPDATE `ai_playerbot_texts` SET `text_loc3`='muss was craften' WHERE `id`=840; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Bock auf Blödsinn in %zone_name?' WHERE `id`=841; +UPDATE `ai_playerbot_texts` SET `text_loc3`='machen wir %zone_name zu unserem Spielplatz' WHERE `id`=842; +UPDATE `ai_playerbot_texts` SET `text_loc3`='ich verirr mich gleich wieder in %zone_name' WHERE `id`=843; +UPDATE `ai_playerbot_texts` SET `text_loc3`='kaum zu glauben, dass ich immer noch in %zone_name hocke' WHERE `id`=844; +UPDATE `ai_playerbot_texts` SET `text_loc3`='lasst uns die Mailbox in %zone_name raiden!' WHERE `id`=846; +UPDATE `ai_playerbot_texts` SET `text_loc3`='ich schwöre, in %zone_name wimmelt es von Trollen' WHERE `id`=847; +UPDATE `ai_playerbot_texts` SET `text_loc3`='lasst uns zusammen Chaos in %zone_name anrichten' WHERE `id`=848; +UPDATE `ai_playerbot_texts` SET `text_loc3`='hab Bock, in %zone_name absolut gar nix zu machen' WHERE `id`=849; +UPDATE `ai_playerbot_texts` SET `text_loc3`='in %zone_name hört eh keiner zu' WHERE `id`=850; +UPDATE `ai_playerbot_texts` SET `text_loc3`='ist %zone_name überhaupt real oder wie Bielefeld?' WHERE `id`=851; +UPDATE `ai_playerbot_texts` SET `text_loc3`='schickt mal wer Hilfe nach %zone_name! ist wild hier!' WHERE `id`=852; +UPDATE `ai_playerbot_texts` SET `text_loc3`='ich bin sicher, in %zone_name spukt es' WHERE `id`=853; +UPDATE `ai_playerbot_texts` SET `text_loc3`='wenn %zone_name reden könnte, würde es wahrscheinlich schreien' WHERE `id`=854; +UPDATE `ai_playerbot_texts` SET `text_loc3`='irgendwas ist faul an %zone_name' WHERE `id`=855; +UPDATE `ai_playerbot_texts` SET `text_loc3`='gleich zerleg ich %zone_name mit meiner Awesomeness' WHERE `id`=856; +UPDATE `ai_playerbot_texts` SET `text_loc3`='sagt %zone_name, dass ich da bin' WHERE `id`=857; +UPDATE `ai_playerbot_texts` SET `text_loc3`='ich hab mich in %zone_name verlaufen, sendet Hilfe' WHERE `id`=858; +UPDATE `ai_playerbot_texts` SET `text_loc3`='ich starte ne Revolution in %zone_name' WHERE `id`=859; +UPDATE `ai_playerbot_texts` SET `text_loc3`='findet noch wer %zone_name verdächtig ruhig?' WHERE `id`=860; +UPDATE `ai_playerbot_texts` SET `text_loc3`='ich wette, %zone_name hat Geheimnisse, von denen wir nix wissen' WHERE `id`=861; +UPDATE `ai_playerbot_texts` SET `text_loc3`='%my_race kann man in %zone_name nie genug haben' WHERE `id`=862; +UPDATE `ai_playerbot_texts` SET `text_loc3`='langsam glaube ich, %zone_name ist nur ein Mythos' WHERE `id`=863; +UPDATE `ai_playerbot_texts` SET `text_loc3`='wer hätte gedacht, dass %zone_name so abgeht?' WHERE `id`=864; +UPDATE `ai_playerbot_texts` SET `text_loc3`='als wäre das Spiel in %zone_name kaputt' WHERE `id`=865; +UPDATE `ai_playerbot_texts` SET `text_loc3`='ist %zone_name eigentlich ne Wüste, oder bin ich einfach nur lost?' WHERE `id`=866; +UPDATE `ai_playerbot_texts` SET `text_loc3`='fühlt sich langsam an wie %zone_name im Mixer' WHERE `id`=867; +UPDATE `ai_playerbot_texts` SET `text_loc3`='hat jemand ne Karte für %zone_name?' WHERE `id`=868; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Noch wer, der denkt das %zone_name uns umbringen will?' WHERE `id`=869; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Ich bin auf wilder Fahrt durch %zone_name!' WHERE `id`=870; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Bin das nur ich, oder wird %zone_name immer weirder?' WHERE `id`=871; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Ich bin davon überzeugt, das %zone_name heimlich ein Freizeitpark ist.' WHERE `id`=872; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Tastatur kaputt... wahrscheinlich wieder zu wenig Freunde.' WHERE `id`=873; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Glaubt ihr, die Bäume in dem Spiel haben Gefühle?' WHERE `id`=874; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Ich drücke immer dieselbe Taste, aber ich gewinne trotzdem nicht' WHERE `id`=875; +UPDATE `ai_playerbot_texts` SET `text_loc3`='ich wette, ich könnte nen Raid gewinnen, in dem ich einfach nur LOOT schreie' WHERE `id`=876; +UPDATE `ai_playerbot_texts` SET `text_loc3`='versuche seit einer Stunde, auf mein Mount zu steigen, nix passiert' WHERE `id`=877; +UPDATE `ai_playerbot_texts` SET `text_loc3`='gibt es nen Weg, unverwundbar zu werden, ohne wirklich zu spielen?' WHERE `id`=878; +UPDATE `ai_playerbot_texts` SET `text_loc3`='kann ich einfach random Tasten smashen und trotzdem gewinnen? frage für nen Freund' WHERE `id`=879; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Wenn ich einfach stehen bleibe, dann bin ich immer noch besser als du!' WHERE `id`=880; +UPDATE `ai_playerbot_texts` SET `text_loc3`='warum heilt mich mein Pet nicht wenn ich im Feuer stehe' WHERE `id`=881; +UPDATE `ai_playerbot_texts` SET `text_loc3`='brauch ich Rüstung, um ein echter wahrer Held zu sein, oder ist das optional?' WHERE `id`=882; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Muss ich erst 10.000 Koboldkerzen klauen, um zu leveln, oder was?' WHERE `id`=883; +UPDATE `ai_playerbot_texts` SET `text_loc3`='meine Waffe ist kaputt, kann ich Gegner noch mit meinem riesigen Schw... äh, meiner Faust klatschen?' WHERE `id`=884; +UPDATE `ai_playerbot_texts` SET `text_loc3`='können wir das Spiel bitte in World of DieCraft umbenennen, ein Spieler killt mich dauernd' WHERE `id`=885; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Warum fliegt mein Pferd nicht? kann es nicht einfach nach oben gehen?' WHERE `id`=886; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Gibts ne Option, die Grafik auszumachen, damit es aussieht wie mein alter Taschenrechner?' WHERE `id`=887; +UPDATE `ai_playerbot_texts` SET `text_loc3`='ich sollte was killen, bin aber eingepennt, ist das normal?' WHERE `id`=888; +UPDATE `ai_playerbot_texts` SET `text_loc3`='killt noch wer random NPCs zum Spaß, oder bin das nur ich?' WHERE `id`=889; +UPDATE `ai_playerbot_texts` SET `text_loc3`='ich bin %my_level und kenn schon alle Geheimnisse des Spiels' WHERE `id`=890; +UPDATE `ai_playerbot_texts` SET `text_loc3`='kann ich einfach so lange mit NPCs reden, bis sie mir ihren ganzen Loot einfach geben?' WHERE `id`=891; +UPDATE `ai_playerbot_texts` SET `text_loc3`='warum verliere ich, ich spiel doch schon 15 Minuten' WHERE `id`=893; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Ich brauch keine Strategie, ich spam einfach diese Fähigkeit und hoffe aufs Beste' WHERE `id`=894; +UPDATE `ai_playerbot_texts` SET `text_loc3`='wenn ich haufenweise Glücksbringer anlege, krieg ich dann mehr Loot?' WHERE `id`=895; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Ist das Geheimnis dieses Spiels einfach, den Bildschirm anzuschreien?' WHERE `id`=896; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Kann ich einfach jedes Item anziehen, das ich finde, und aufs Beste hoffen?' WHERE `id`=897; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Muss ich echt Quests machen oder kann ich einfach erkunden und Leute anbrüllen?' WHERE `id`=898; +UPDATE `ai_playerbot_texts` SET `text_loc3`='ich zocke auf Arbeit, die sagen ich soll arbeiten >.> aber es ist WoW!' WHERE `id`=899; +UPDATE `ai_playerbot_texts` SET `text_loc3`='wenn ich alles Essen im Spiel esse, werd ich dann unbesiegbar' WHERE `id`=900; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Also, ich werfe mein Pet einfach in jeden Bosskampf und drücke beim würfeln immer auf Gier, das sind die Hunter-Regeln.' WHERE `id`=901; +UPDATE `ai_playerbot_texts` SET `text_loc3`='kann man sterben, wenn man schon tot ist? Ich frage für nen Geist...' WHERE `id`=902; +UPDATE `ai_playerbot_texts` SET `text_loc3`='weiß jemand, wo das legendäre Schwert ist? hab schon 5 Minuten gesucht' WHERE `id`=903; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Man sagte mir, hier gibts 100.000 Gold, wo muss ich hin?' WHERE `id`=904; +UPDATE `ai_playerbot_texts` SET `text_loc3`='ich spiel das hier wie ich deine Mom letzte Nacht genommen hab - mit Geschrei und einem ruhmreichem Ende!' WHERE `id`=905; +UPDATE `ai_playerbot_texts` SET `text_loc3`='ab wann wirds Spaß, oder ist alles nur für immer Grind' WHERE `id`=906; +UPDATE `ai_playerbot_texts` SET `text_loc3`='ich frage ständig nach dem Weg, aber sie schicken mich immer irgendwo hin, ist das normal?' WHERE `id`=907; +UPDATE `ai_playerbot_texts` SET `text_loc3`='hab gehört, wenn du ALT+F4 drückst, kriegst du 100.000 Gold - Der Trick ist, vorher nen roten NPC anzugreifen' WHERE `id`=908; +UPDATE `ai_playerbot_texts` SET `text_loc3`='warum sieht mein Char immer so verwirrt aus, bin ich schuld?' WHERE `id`=909; +UPDATE `ai_playerbot_texts` SET `text_loc3`='hey, deine Mom meinte, du sollst jetzt ins Bett!' WHERE `id`=910; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Warcraft ist ein Grind - genau wie deine Mom neulich, hat sogar Abo!' WHERE `id`=911; +UPDATE `ai_playerbot_texts` SET `text_loc3`='stimmt es, dass Chuck Norris mal gelevelt hat, ohne nen Knopf zu drücken' WHERE `id`=912; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Chuck Norris braucht kein Mount, der Boden bewegt freiwillig sich unter ihm' WHERE `id`=913; +UPDATE `ai_playerbot_texts` SET `text_loc3`='wenn Chuck Norris nen Raid betritt, gibt der Boss einfach auf' WHERE `id`=914; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Chuck Norris nutzt keine Fähigkeiten, er guckt nur - und die Gegner sterben' WHERE `id`=915; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Chuck Norris braucht keine Heilung, seine Feinde heilen ihn aus Respekt' WHERE `id`=916; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Chuck Norris kann nen Raid solo... ohne Gear... und AFK' WHERE `id`=917; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Chuck Norris weicht nicht aus, das Spiel weicht ihm aus' WHERE `id`=918; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Chuck Norris nutzte mal ne Lowlevel-Waffe - das Spiel gab ihm den besten Loot' WHERE `id`=919; +UPDATE `ai_playerbot_texts` SET `text_loc3`='wenn Chuck Norris eine Ini betritt, landet der Loot automatisch in seinem Inventar' WHERE `id`=920; +UPDATE `ai_playerbot_texts` SET `text_loc3`='was ist Wilma' WHERE `id`=921; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Bist du aus Bayern?' WHERE `id`=922; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Wilma lecken' WHERE `id`=923; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Dann leck mir an den Eiern.' WHERE `id`=924; +UPDATE `ai_playerbot_texts` SET `text_loc3`='ICH FRESS NEN ARSCH' WHERE `id`=925; +UPDATE `ai_playerbot_texts` SET `text_loc3`='ich will mir %random_inventory_item_link in den Arsch schieben' WHERE `id`=926; +UPDATE `ai_playerbot_texts` SET `text_loc3`='ich will dir %random_inventory_item_link in den Arsch schieben' WHERE `id`=927; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Darnarschloch' WHERE `id`=928; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Du leidest an mehr Bugs als das Spiel selbst!' WHERE `id`=929; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Du hast Chefkochs salzige Schokobällchen im Mund!' WHERE `id`=930; +UPDATE `ai_playerbot_texts` SET `text_loc3`='cooler Ständer, Bro' WHERE `id`=931; +UPDATE `ai_playerbot_texts` SET `text_loc3`='hab alles probiert, am Ende hats ERP gerichtet' WHERE `id`=933; +UPDATE `ai_playerbot_texts` SET `text_loc3`='ich will in %zone_name bumsen' WHERE `id`=934; +UPDATE `ai_playerbot_texts` SET `text_loc3`='suche weiblichen Gnom mit Gorilla-Pet für ERP in %zone_name' WHERE `id`=935; +UPDATE `ai_playerbot_texts` SET `text_loc3`='ein Arschloch versteh ich, aber nen Perversen?' WHERE `id`=936; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Kein Gyat in %zone_name, nur Gesichtseintopf so weit das Auge reicht.' WHERE `id`=937; +UPDATE `ai_playerbot_texts` SET `text_loc3`='ich kill alle Tiere in %zone_name. Scheiß auf Tiere und die PETA!!!' WHERE `id`=938; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Nur gut, dass ich 3 Beine hab' WHERE `id`=939; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Chill, ich bin einfach grad komplett in meinem Film.' WHERE `id`=940; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Finger im Po Mexiko' WHERE `id`=941; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Das hast du irgendwie vergeigt, beeindruckend' WHERE `id`=942; +UPDATE `ai_playerbot_texts` SET `text_loc3`='das könnte ich blind machen, muss ich aber nicht' WHERE `id`=943; +UPDATE `ai_playerbot_texts` SET `text_loc3`='sicher, dass du weißt, wie man das Spiel spielt?' WHERE `id`=944; +UPDATE `ai_playerbot_texts` SET `text_loc3`='als würdest du absichtlich verlieren' WHERE `id`=945; +UPDATE `ai_playerbot_texts` SET `text_loc3`='hab schon bessere Plays von Level-1-Chars gesehen' WHERE `id`=946; +UPDATE `ai_playerbot_texts` SET `text_loc3`='du bist hier wie ein Speedbump' WHERE `id`=947; +UPDATE `ai_playerbot_texts` SET `text_loc3`='vielleicht suchst du dir lieber ein anderes Hobby' WHERE `id`=948; +UPDATE `ai_playerbot_texts` SET `text_loc3`='dein Gameplay ist wie Farbe beim Trocknen zusehen' WHERE `id`=949; +UPDATE `ai_playerbot_texts` SET `text_loc3`='mein Twink könnte dich da durch carrien' WHERE `id`=950; +UPDATE `ai_playerbot_texts` SET `text_loc3`='trollst du uns, oder bist du ernsthaft so?' WHERE `id`=951; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Ich glaub, das Gegnerteam läuft besser, wenn du bei uns bist' WHERE `id`=952; +UPDATE `ai_playerbot_texts` SET `text_loc3`='spiel vielleicht mal das Spiel statt nur die Landschaft zu bestaunen' WHERE `id`=953; +UPDATE `ai_playerbot_texts` SET `text_loc3`='ich glaube, du hast da jede einzelne Fähigkeit verfehlt' WHERE `id`=954; +UPDATE `ai_playerbot_texts` SET `text_loc3`='bist du lost oder stellst du dich nur dumm?' WHERE `id`=955; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Level-1-Chars nehmen weniger Schaden als das' WHERE `id`=956; +UPDATE `ai_playerbot_texts` SET `text_loc3`='das war für uns beide peinlich' WHERE `id`=957; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Hab schon besseres Teamplay in nem Solo-Game gesehen' WHERE `id`=958; +UPDATE `ai_playerbot_texts` SET `text_loc3`='ich stell mich mal hinten hin und schau dir beim Failen zu' WHERE `id`=959; +UPDATE `ai_playerbot_texts` SET `text_loc3`='dachtest du wirklich, das wäre ne gute Idee?' WHERE `id`=960; +UPDATE `ai_playerbot_texts` SET `text_loc3`='kaum zu glauben, dass du diese simple Aufgabe verkackt hast' WHERE `id`=961; +UPDATE `ai_playerbot_texts` SET `text_loc3`='bist du hier, um zu helfen, oder nur um Zeit zu verschwenden?' WHERE `id`=962; +UPDATE `ai_playerbot_texts` SET `text_loc3`='gut, dass ich da bin, um das Team zu schützen' WHERE `id`=963; +UPDATE `ai_playerbot_texts` SET `text_loc3`='ich schwöre, du machst es schwerer als nötig' WHERE `id`=964; +UPDATE `ai_playerbot_texts` SET `text_loc3`='wie schaffst du es, die simpelsten Sachen zu failen?' WHERE `id`=965; +UPDATE `ai_playerbot_texts` SET `text_loc3`='vielleicht mal lieber nur zuschauen, statt das zu tun was du spielen nennst' WHERE `id`=966; +UPDATE `ai_playerbot_texts` SET `text_loc3`='du könntest dich wenigstens bemühen, so zu tun, als wärst du gut' WHERE `id`=967; +UPDATE `ai_playerbot_texts` SET `text_loc3`='mach so weiter und wir sitzen hier den ganzen Tag' WHERE `id`=968; +UPDATE `ai_playerbot_texts` SET `text_loc3`='ehrlich, das war die schlechteste Entscheidung ever' WHERE `id`=969; +UPDATE `ai_playerbot_texts` SET `text_loc3`='ich glaub, dieses Spiel ist nix für dich' WHERE `id`=970; +UPDATE `ai_playerbot_texts` SET `text_loc3`='was sollte dieser Move?' WHERE `id`=971; +UPDATE `ai_playerbot_texts` SET `text_loc3`='du bist ne Last fürs Team' WHERE `id`=972; +UPDATE `ai_playerbot_texts` SET `text_loc3`='du denkst echt, du bist ein Pro, was?' WHERE `id`=973; +UPDATE `ai_playerbot_texts` SET `text_loc3`='vielleicht einfach quitten und uns allen den Stress sparen' WHERE `id`=974; +UPDATE `ai_playerbot_texts` SET `text_loc3`='%prefix %random_taken_quest_or_item_link' WHERE `id`=975; +UPDATE `ai_playerbot_texts` SET `text_loc3`='%prefix %random_inventory_item_link' WHERE `id`=976; +UPDATE `ai_playerbot_texts` SET `text_loc3`='%thunderfury_link' WHERE `id`=977; +UPDATE `ai_playerbot_texts` SET `text_loc3`='%thunderfury_link%thunderfury_link' WHERE `id`=978; +UPDATE `ai_playerbot_texts` SET `text_loc3`='%thunderfury_link%thunderfury_link%thunderfury_link' WHERE `id`=979; +UPDATE `ai_playerbot_texts` SET `text_loc3`='ich glaube, ich hab gerade %thunderfury_link gehört' WHERE `id`=980; +UPDATE `ai_playerbot_texts` SET `text_loc3`='ich glaub, ich habe %thunderfury_link gehört' WHERE `id`=981; +UPDATE `ai_playerbot_texts` SET `text_loc3`='ich hab definitiv %thunderfury_link gehört' WHERE `id`=982; +UPDATE `ai_playerbot_texts` SET `text_loc3`='kein Plan, aber ich bin ziemlich sicher, das ich %thunderfury_link gehört habe' WHERE `id`=983; +UPDATE `ai_playerbot_texts` SET `text_loc3`='hast du gerade %thunderfury_link gesagt' WHERE `id`=984; +UPDATE `ai_playerbot_texts` SET `text_loc3`='hat jemand %thunderfury_link gesagt' WHERE `id`=985; +UPDATE `ai_playerbot_texts` SET `text_loc3`='hat jemand %thunderfury_link gesagt?' WHERE `id`=986; +UPDATE `ai_playerbot_texts` SET `text_loc3`='jemand hat %thunderfury_link gesagt' WHERE `id`=987; +UPDATE `ai_playerbot_texts` SET `text_loc3`='%thunderfury_link kommt aus dem Schrank' WHERE `id`=988; +UPDATE `ai_playerbot_texts` SET `text_loc3`='ich schwöre, es war %thunderfury_link, könnte aber auch %thunderfury_link gewesen sein' WHERE `id`=989; +UPDATE `ai_playerbot_texts` SET `text_loc3`='warum %thunderfury_link nutzen, wenn %thunderfury_link offensichtlich viel stärker ist' WHERE `id`=990; +UPDATE `ai_playerbot_texts` SET `text_loc3`='hab ich gerade %thunderfury_link gehört?' WHERE `id`=991; +UPDATE `ai_playerbot_texts` SET `text_loc3`='niemals... hör ich da echt %thunderfury_link?' WHERE `id`=992; +UPDATE `ai_playerbot_texts` SET `text_loc3`='%thunderfury_link? klingt nach was, das nur Legenden führen!' WHERE `id`=993; +UPDATE `ai_playerbot_texts` SET `text_loc3`='ich spüre die Macht von %thunderfury_link in der Luft!' WHERE `id`=994; +UPDATE `ai_playerbot_texts` SET `text_loc3`='%thunderfury_link ist der *echte* MVP' WHERE `id`=995; +UPDATE `ai_playerbot_texts` SET `text_loc3`='kann mir jemand ne %thunderfury_link besorgen? frage für einen Freund... vielleicht zwei!' WHERE `id`=996; +UPDATE `ai_playerbot_texts` SET `text_loc3`='hat %thunderfury_link da gerade was *gesmitet*? ich schwöre, der Boden hat gewackelt' WHERE `id`=997; +UPDATE `ai_playerbot_texts` SET `text_loc3`='%thunderfury_link auf dem Schlachtfeld... Das ist purer Flex' WHERE `id`=998; +UPDATE `ai_playerbot_texts` SET `text_loc3`='ich *glaube*, ich hab %thunderfury_link gehört... oder war das nur ein Mythos?' WHERE `id`=999; +UPDATE `ai_playerbot_texts` SET `text_loc3`='hab ich gerade jemanden mit %thunderfury_link gesehen?!' WHERE `id`=1000; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Bin zu 99% sicher, das war %thunderfury_link. Zu 1% wars vielleicht nur ein random NPC.' WHERE `id`=1002; +UPDATE `ai_playerbot_texts` SET `text_loc3`='%thunderfury_link in Aktion! Wer braucht ne Armee, mit so einer Power?' WHERE `id`=1003; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Hab gehört, %thunderfury_link lockt alle Jungs an.' WHERE `id`=1004; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Warum überhaupt %thunderfury_link nutzen, wenn %thunderfury_link klar die bessere Option ist?' WHERE `id`=1005; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Bin das nur ich, oder hat %thunderfury_link nen passiven „Trash-Talk“-Effekt?' WHERE `id`=1006; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Dachte, ich hätte %thunderfury_link gehört, war aber nur der Klang reiner Awesomeness.' WHERE `id`=1007; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Oh, %thunderfury_link... Wo *warst* du mein ganzes Leben?' WHERE `id`=1008; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Hat jemand %thunderfury_link gesagt? Ich glaub, ich hol mir mal meine.' WHERE `id`=1009; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Das war definitiv der Sound von %thunderfury_link! Ich spür die Epicness.' WHERE `id`=1010; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Geht das nur mir so, oder lässt %thunderfury_link alle anderen *schwach aussehen*?' WHERE `id`=1011; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Wie man so sagt... je lauter %thunderfury_link, desto größer das Recht zu prahlen!' WHERE `id`=1012; +UPDATE `ai_playerbot_texts` SET `text_loc3`='VK: %item_formatted_link für %cost_gold.' WHERE `id`=1013; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Will wer %item_formatted_link? Nur %cost_gold.' WHERE `id`=1015; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Lächerlicher Preis: %cost_gold für %item_formatted_link!' WHERE `id`=1019; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Will %item_formatted_link für %cost_gold verkaufen.' WHERE `id`=1020; +UPDATE `ai_playerbot_texts` SET `text_loc3`='%item_formatted_link ist Wertvoll, aber ich würd es für %cost_gold verkaufen.' WHERE `id`=1024; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Billiger als %cost_gold kriegst du %item_formatted_link nicht!' WHERE `id`=1025; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Brauche mehr als %item_formatted_link!' WHERE `id`=1026; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Habe %item_formatted_link und brauche mehr.' WHERE `id`=1027; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Habe %item_formatted_link. Wer kauft für %cost_gold?' WHERE `id`=1028; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Wie wärs mit %item_formatted_link? Für %cost_gold.' WHERE `id`=1030; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Wer meinte, ich bin ein Bastard? %item_formatted_link für %cost_gold ist ein guter Preis!' WHERE `id`=1031; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Verkaufe %item_formatted_link? Nur %cost_gold.' WHERE `id`=1032; +UPDATE `ai_playerbot_texts` SET `text_loc3`='LFG zum Farmen. %item_formatted_link gibts von mir noch für %cost_gold.' WHERE `id`=1033; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Heute fast alles verkauft. %item_formatted_link hab ich noch für %cost_gold.' WHERE `id`=1034; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Wozu Handelschat? Klar, um %item_formatted_link für %cost_gold zu verkaufen.' WHERE `id`=1035; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Kann jemand den Preis %cost_gold für %item_formatted_link unterbieten?' WHERE `id`=1036; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Wollt ihr den Handelschat stoppen? Kauft einfach %item_formatted_link! Für %cost_gold!' WHERE `id`=1037; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Alle spammen im Handelschat. Ich auch - %cost_gold für %item_formatted_link!' WHERE `id`=1038; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Taugt %item_formatted_link was? Verkaufe es für %cost_gold.' WHERE `id`=1039; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Hab %item_formatted_link, verkaufe an dich für %cost_gold.' WHERE `id`=1040; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Gestern nix geschafft, aber %item_formatted_link bekommen. Verkaufe für %cost_gold.' WHERE `id`=1041; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Gestern gefarmt und %item_formatted_link gezogen. Will jemand für %cost_gold kaufen?' WHERE `id`=1042; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Gestern %item_formatted_link gekauft. Brauchts wer für %cost_gold?' WHERE `id`=1043; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Wer hatte %item_formatted_link gesucht? Preis bleibt - %cost_gold.' WHERE `id`=1044; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Hab immer noch %item_formatted_link. Kauft wer für %cost_gold?' WHERE `id`=1045; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Früher war ich besser bei Kasse. Jetzt verkauf ich %item_formatted_link für %cost_gold.' WHERE `id`=1046; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Ich Wünschte, ich hätte mehr als %item_formatted_link. Kaufen könnt ihrs trotzdem für %cost_gold.' WHERE `id`=1047; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Wozu ist euer Gold gut? Um mein %item_formatted_link für %cost_gold zu kaufen.' WHERE `id`=1048; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Gönnt mir etwas Gold. Kauft %item_formatted_link für %cost_gold.' WHERE `id`=1049; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Sind %cost_gold ein guter Preis für %item_formatted_link?' WHERE `id`=1050; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Hab gestern erst %item_formatted_link gekauft, brauch es aber nicht mehr. Will wer für %cost_gold?' WHERE `id`=1051; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Stell %item_formatted_link gleich ins AH, aber ihr könnts jetzt günstiger haben: nur %cost_gold.' WHERE `id`=1052; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Warum zum #!@ hab ich %item_formatted_link gekauft? Brauchts wer für %cost_gold?' WHERE `id`=1053; +UPDATE `ai_playerbot_texts` SET `text_loc3`='VK: %item_formatted_link für %cost_gold.' WHERE `id`=1054; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Will wer %item_formatted_link? Nur %cost_gold.' WHERE `id`=1056; +UPDATE `ai_playerbot_texts` SET `text_loc3`='VK: %item_formatted_link für %cost_gold. flüster mir bei Interesse.' WHERE `id`=1060; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Muss %item_formatted_link loswerden, %cost_gold oder bestes Angebot.' WHERE `id`=1061; +UPDATE `ai_playerbot_texts` SET `text_loc3`='%item_formatted_link für %cost_gold verfügbar. Schlagt zu!' WHERE `id`=1062; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Habe %item_formatted_link, will %cost_gold.' WHERE `id`=1063; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Verkaufe %item_formatted_link, nur %cost_gold.' WHERE `id`=1064; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Will jemand %item_formatted_link für %cost_gold? flüster mir!' WHERE `id`=1065; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Verkaufe %item_formatted_link für %cost_gold, greift zu solange es geht!' WHERE `id`=1066; +UPDATE `ai_playerbot_texts` SET `text_loc3`='%item_formatted_link für %cost_gold, schnell sein bevor es weg ist!' WHERE `id`=1067; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Verkaufe %item_formatted_link für %cost_gold, wer zuerst kommt wird auch zuerst bedient!' WHERE `id`=1069; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Nur %cost_gold für %item_formatted_link, nur für kurze Zeit!' WHERE `id`=1070; +UPDATE `ai_playerbot_texts` SET `text_loc3`='%item_formatted_link für %cost_gold verfügbar, meldet euch wenn ihrs braucht!' WHERE `id`=1071; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Interesse an %item_formatted_link für %cost_gold?' WHERE `id`=1072; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Verkaufe %item_formatted_link für %cost_gold, muss meine Taschen leeren.' WHERE `id`=1073; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Hol dir %item_formatted_link für %cost_gold, Top-Deal!' WHERE `id`=1074; +UPDATE `ai_playerbot_texts` SET `text_loc3`='%item_formatted_link für %cost_gold, greift zu solange der Vorrat reicht!' WHERE `id`=1075; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Verkaufe %item_formatted_link für %cost_gold, nicht verpassen!' WHERE `id`=1076; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Nur %cost_gold für %item_formatted_link, flüster mir für Details!' WHERE `id`=1077; +UPDATE `ai_playerbot_texts` SET `text_loc3`='%item_formatted_link gibts für %cost_gold, lasst uns handeln!' WHERE `id`=1078; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Verkaufe %item_formatted_link für %cost_gold, flüster mir für Infos.' WHERE `id`=1079; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Will %item_formatted_link verkaufen, für %cost_gold gehört es dir!' WHERE `id`=1080; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Verkaufe %item_formatted_link, nur %cost_gold.' WHERE `id`=1081; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Hab %item_formatted_link für %cost_gold, machen wir nen Deal!' WHERE `id`=1082; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Verkaufe %item_formatted_link, für %cost_gold nimmst du es mit!' WHERE `id`=1083; +UPDATE `ai_playerbot_texts` SET `text_loc3`='VK: %item_formatted_link für %cost_gold, Interesse?' WHERE `id`=1084; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Muss %item_formatted_link schnell loswerden, %cost_gold.' WHERE `id`=1085; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Verkaufe %item_formatted_link für %cost_gold, bester Preis weit und breit!' WHERE `id`=1086; +UPDATE `ai_playerbot_texts` SET `text_loc3`='%item_formatted_link für %cost_gold, machen wirs fix!' WHERE `id`=1088; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Verkaufe %item_formatted_link für %cost_gold, schnappt zu bevor alles weg ist!' WHERE `id`=1089; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Willst %item_formatted_link? Für %cost_gold kriegst du eins!' WHERE `id`=1090; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Ich habe auch %quest_links' WHERE `id`=1093; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Ich habe auch %quest_links, bin gerade in %zone_name' WHERE `id`=1094; +UPDATE `ai_playerbot_texts` SET `text_loc3`='%other_name, ich habe auch %quest_links' WHERE `id`=1095; +UPDATE `ai_playerbot_texts` SET `text_loc3`='%other_name, ich habe auch %quest_links, bin gerade in %zone_name' WHERE `id`=1096; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Bin bereit für %quest_links, bin gerade in %zone_name' WHERE `id`=1097; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Bin bereit für %quest_links, bin %my_role' WHERE `id`=1098; +UPDATE `ai_playerbot_texts` SET `text_loc3`='%other_name, bin bereit für %quest_links, bin gerade in %zone_name' WHERE `id`=1099; +UPDATE `ai_playerbot_texts` SET `text_loc3`='%other_name, bin bereit für %quest_links, bin %my_role' WHERE `id`=1100; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Braucht wer %quest_links? Bin in %zone_name.' WHERE `id`=1101; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Suche mehr %quest_links in %zone_name.' WHERE `id`=1102; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Will jemand %quest_links mit mir in %zone_name machen?' WHERE `id`=1104; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Habe %quest_links, suche Gruppe in %zone_name.' WHERE `id`=1105; +UPDATE `ai_playerbot_texts` SET `text_loc3`='%my_role sucht Gruppe, um %quest_links in %zone_name zu erledigen.' WHERE `id`=1108; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Ich brauche %quest_links, ist jemand in %zone_name frei?' WHERE `id`=1109; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Mach %quest_links in %zone_name, brauche mehr Hilfe.' WHERE `id`=1111; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Gibt’s %my_role mit Interesse an %quest_links in %zone_name?' WHERE `id`=1112; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Hilfe benötigt für %quest_links in %zone_name, mir ist langweilig.' WHERE `id`=1113; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Habe %quest_links, %my_role in %zone_name, wer ist dabei?' WHERE `id`=1114; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Macht grad jemand %quest_links? Bin in %zone_name.' WHERE `id`=1116; +UPDATE `ai_playerbot_texts` SET `text_loc3`='%quest_links offen in %zone_name, wer möchte?' WHERE `id`=1117; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Bereit für %quest_links in %zone_name, suche Gruppe.' WHERE `id`=1118; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Brauche %quest_links und Gesellschaft, jemand in %zone_name?' WHERE `id`=1119; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Wer kommt mit mir nach %zone_name für %quest_links?' WHERE `id`=1120; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Irgend ein %my_role frei für %quest_links in %zone_name?' WHERE `id`=1121; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Habe %quest_links und bin %my_role, brauche mehr Leute in %zone_name.' WHERE `id`=1122; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Bin %my_role und habe %quest_links, suche Gruppe in %zone_name.' WHERE `id`=1124; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Brauche Hilfe bei %quest_links in %zone_name, ist ein %my_role frei?' WHERE `id`=1125; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Hat ein %my_role Lust, %quest_links mit mir in %zone_name zu machen?' WHERE `id`=1126; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Lasst uns %quest_links zusammen in %zone_name abschließen.' WHERE `id`=1127; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Bin in %zone_name und habe %quest_links, wer will mit?' WHERE `id`=1128; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Suche mehr %my_role, um %quest_links in %zone_name abzuschließen.' WHERE `id`=1129; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Habe %quest_links und brauche %my_role in %zone_name.' WHERE `id`=1130; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Wer hat Bock auf %quest_links? Ich bin %my_role in %zone_name.' WHERE `id`=1131; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Suche Gruppe für %quest_links in %zone_name, %my_role gebraucht.' WHERE `id`=1132; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Braucht wer Hilfe bei %quest_links in %zone_name? Ich bin %my_role.' WHERE `id`=1133; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Habe %quest_links offen, brauche %my_role in %zone_name.' WHERE `id`=1134; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Bin in %zone_name und suche Hilfe für %quest_links, wer ist dabei?' WHERE `id`=1135; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Suche Gruppe, um %quest_links in %zone_name fertig zu machen.' WHERE `id`=1136; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Sucht jemand %quest_links in %zone_name? Ich bin %my_role.' WHERE `id`=1137; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Machen wir %quest_links zusammen! %zone_name wartet.' WHERE `id`=1138; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Brauche Gruppe für %quest_links, %zone_name - wer hat Interesse?' WHERE `id`=1139; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Wer will für %quest_links dazukommen? Bin in %zone_name.' WHERE `id`=1140; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Bin in %zone_name, suche Leute zum Abschließen von %quest_links.' WHERE `id`=1141; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Brauche Hilfe bei %quest_links in %zone_name, ein %my_role da?' WHERE `id`=1142; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Suche Gruppe, um %quest_links zu beenden, %zone_name da steppt der Bär.' WHERE `id`=1143; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Will jemand bei %quest_links in %zone_name helfen? Ich bin %my_role.' WHERE `id`=1144; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Suche %my_role, um %quest_links in %zone_name mitzumachen.' WHERE `id`=1145; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Hab %quest_links, %my_role für %zone_name gesucht.' WHERE `id`=1146; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Will %quest_links in %zone_name fertig bekommen, brauche mehr Leute.' WHERE `id`=1147; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Brauche Hilfe bei %quest_links, wer ist in %zone_name unterwegs?' WHERE `id`=1148; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Brauche mehr Leute für %quest_links, %zone_name.' WHERE `id`=1149; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Suche Gruppe in %zone_name, um %quest_links abzuschließen.' WHERE `id`=1150; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Wer will %quest_links in %zone_name machen? Bin startklar.' WHERE `id`=1151; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Will wer für %quest_links dazustoßen? Ich bin %my_role in %zone_name.' WHERE `id`=1152; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Suche %my_role für %quest_links in %zone_name.' WHERE `id`=1153; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Bin in %zone_name, braucht wer Hilfe bei %quest_links?' WHERE `id`=1154; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Brauche mehr für %quest_links in %zone_name, bin allein nicht stark genug?' WHERE `id`=1155; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Brauche Hilfe bei %quest_links in %zone_name, wer hat Bock?' WHERE `id`=1156; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Suche mehr Leute, um %quest_links zu beenden, %zone_name.' WHERE `id`=1157; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Hey, bin bei %quest_links dabei' WHERE `id`=1158; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Hey, ich habe auch %quest_links' WHERE `id`=1160; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Hey %other_name, bin bei %quest_links dabei' WHERE `id`=1161; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Hey %other_name, ich könnte %quest_links mit dir machen' WHERE `id`=1162; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Bock, für %quest_links eine Gruppe zu bilden?' WHERE `id`=1164; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Bin bereit für %quest_links, bin gerade in %zone_name' WHERE `id`=1165; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Bin bereit für %quest_links, bin %my_role' WHERE `id`=1166; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Hey, ich hab Bock auf %quest_links' WHERE `id`=1167; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Ich kann bei %quest_links helfen, wenn ihr wollt' WHERE `id`=1168; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Lasst uns %quest_links zusammen machen!' WHERE `id`=1169; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Ich hab auch %quest_links offen' WHERE `id`=1170; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Bin für %quest_links verfügbar, wenn ihr wollt' WHERE `id`=1171; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Bin bei %quest_links dabei, sagt Bescheid' WHERE `id`=1172; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Sucht wer %quest_links? Bin in %zone_name' WHERE `id`=1173; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Hey, ich brauche auch %quest_links, lets go' WHERE `id`=1174; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Hab %quest_links, will wer mit?' WHERE `id`=1175; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Könnte %quest_links brauchen, machen wirs' WHERE `id`=1176; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Hey, willst du für %quest_links dazukommen?' WHERE `id`=1177; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Ich kann bei %quest_links helfen, wenn ihr wollt' WHERE `id`=1178; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Hey %other_name, Bock auf %quest_links?' WHERE `id`=1179; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Willst du für %quest_links gruppen, %other_name?' WHERE `id`=1180; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Lass %quest_links zusammen machen, %other_name' WHERE `id`=1181; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Ich bin %my_role und ready für %quest_links' WHERE `id`=1182; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Kann für %quest_links joinen, %my_role hier' WHERE `id`=1183; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Bin bereit für %quest_links, %my_role!' WHERE `id`=1184; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Suche %my_role für %quest_links' WHERE `id`=1185; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Braucht wer Hilfe bei %quest_links?' WHERE `id`=1186; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Wer ist noch bei %quest_links dabei?' WHERE `id`=1187; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Jemand bereit für %quest_links in %zone_name?' WHERE `id`=1188; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Hab %quest_links, %my_role unterwegs' WHERE `id`=1189; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Ich brauch %quest_links auch, wer ist dabei?' WHERE `id`=1190; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Grinde %quest_links, wer hilft?' WHERE `id`=1191; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Bin bereit für %quest_links, noch wer?' WHERE `id`=1192; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Kann jemand für %quest_links dazukommen?' WHERE `id`=1193; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Suche Hilfe bei %quest_links, %my_role hier' WHERE `id`=1194; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Ich kann bei %quest_links aushelfen, braucht mich wer?' WHERE `id`=1195; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Macht noch wer %quest_links? Los gehts' WHERE `id`=1196; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Braucht wer Hilfe bei %quest_links? %my_role hier' WHERE `id`=1197; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Wer hat Bock auf %quest_links in %zone_name?' WHERE `id`=1198; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Kann für %quest_links joinen, wenn ihr wollt' WHERE `id`=1199; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Suche einen %my_role für %quest_links' WHERE `id`=1200; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Ist ein %my_role für %quest_links am Start?' WHERE `id`=1201; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Ich habe %quest_links, will wer mit?' WHERE `id`=1202; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Hey %other_name, Bock auf %quest_links?' WHERE `id`=1203; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Lass uns für %quest_links gruppen, %other_name' WHERE `id`=1204; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Ich brauche %quest_links, wer macht mit?' WHERE `id`=1205; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Ich brauche auch %quest_links, ist noch jemand da?' WHERE `id`=1206; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Suche %quest_links in %zone_name, wer ist dabei?' WHERE `id`=1207; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Ist jemand frei für %quest_links?' WHERE `id`=1208; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Hey, ich könnte bei %quest_links dazustoßen!' WHERE `id`=1209; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Ich habe auch %quest_links, lass uns gruppen' WHERE `id`=1210; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Ich habe %quest_links zu erledigen, willst du mit?' WHERE `id`=1211; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Ist ein %my_role für %quest_links in %zone_name frei?' WHERE `id`=1212; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Lass uns %quest_links zusammen abschließen, %other_name' WHERE `id`=1213; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Ich bin bei %quest_links dabei, will noch wer mit?' WHERE `id`=1214; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Wer macht noch %quest_links? Ich bin dabei' WHERE `id`=1215; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Ich habe %quest_links in %zone_name, braucht jemand Hilfe?' WHERE `id`=1216; +UPDATE `ai_playerbot_texts` SET `text_loc3`='%other_name, könnte dir %formatted_item_links verkaufen' WHERE `id`=1217; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Könnte eventuell %formatted_item_links verkaufen' WHERE `id`=1218; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Denke, ich könnte %formatted_item_links verkaufen' WHERE `id`=1219; +UPDATE `ai_playerbot_texts` SET `text_loc3`='%other_name, könnte eventuell %formatted_item_links verkaufen' WHERE `id`=1220; +UPDATE `ai_playerbot_texts` SET `text_loc3`='%other_name, ich denke, ich könnte %formatted_item_links verkaufen' WHERE `id`=1221; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Ich könnte dir %formatted_item_links verkaufen' WHERE `id`=1222; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Hey, habe %formatted_item_links zu verkaufen' WHERE `id`=1223; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Hey, könnte eventuell %formatted_item_links verkaufen' WHERE `id`=1224; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Ich könnte dir %formatted_item_links verkaufen' WHERE `id`=1225; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Hey, habe %formatted_item_links zu verkaufen' WHERE `id`=1226; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Hey, ich könnte eventuell %formatted_item_links verkaufen' WHERE `id`=1227; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Ich habe %formatted_item_links, Interesse?' WHERE `id`=1228; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Will %formatted_item_links verkaufen, was bietest du?' WHERE `id`=1229; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Ich kann dir %formatted_item_links zu einem fairem Preis verkaufen' WHERE `id`=1230; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Ich habe %formatted_item_links auf Lager, was zahlst du?' WHERE `id`=1231; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Verkaufe %formatted_item_links für %cost_gold, sag Bescheid bei Interesse' WHERE `id`=1232; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Habe %formatted_item_links zu verkaufen, was zahlst du?' WHERE `id`=1233; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Ich habe %formatted_item_links, wie klingt %cost_gold für dich?' WHERE `id`=1234; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Verkaufe %formatted_item_links für %cost_gold, flüster mir bei Interesse' WHERE `id`=1235; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Ich habe %formatted_item_links, meld dich bei Interesse' WHERE `id`=1236; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Gebe %formatted_item_links ab, wenn das Angebot passt' WHERE `id`=1237; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Will %formatted_item_links loswerden, flüster mir' WHERE `id`=1238; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Habe %formatted_item_links für %cost_gold, kaufst du?' WHERE `id`=1239; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Verkaufe %formatted_item_links, lass uns handeln' WHERE `id`=1240; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Hey, habe %formatted_item_links für %cost_gold' WHERE `id`=1241; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Kann dich mit %formatted_item_links versorgen, nenn deinen Preis' WHERE `id`=1242; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Ich habe %formatted_item_links verfügbar, sag Bescheid bei Interesse' WHERE `id`=1243; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Verkaufe %formatted_item_links, machen wir Business' WHERE `id`=1244; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Ich habe %formatted_item_links, macht mir ein Angebot' WHERE `id`=1245; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Ich habe %formatted_item_links, schreib mir, wenn du kaufen willst' WHERE `id`=1246; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Kann dir %formatted_item_links für %cost_gold anbieten' WHERE `id`=1247; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Ich habe %formatted_item_links zu verkaufen, schreib mir für den Preis' WHERE `id`=1248; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Verkaufe %formatted_item_links, greif zu solange es heiß ist' WHERE `id`=1249; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Verkaufe %formatted_item_links, nen besseren Deal findet ihr nicht' WHERE `id`=1250; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Ich habe %formatted_item_links zu verkaufen, was zahlst du?' WHERE `id`=1251; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Verkaufe %formatted_item_links, Preis auf Anfrage per flüstern' WHERE `id`=1252; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Interesse an %formatted_item_links? Ich verkaufe welche' WHERE `id`=1253; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Ich habe %formatted_item_links, PN für Preis' WHERE `id`=1254; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Verkaufe %formatted_item_links für %cost_gold, meldet euch' WHERE `id`=1255; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Verkaufe %formatted_item_links, macht mir ein Angebot' WHERE `id`=1256; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Habe %formatted_item_links, schreib mir für Details' WHERE `id`=1257; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Hey, habe %formatted_item_links, meldet euch bei Interesse' WHERE `id`=1258; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Verkaufe %formatted_item_links, machen wir nen Deal?' WHERE `id`=1259; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Verkaufe %formatted_item_links, sag Bescheid wenn du willst' WHERE `id`=1260; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Ich habe %formatted_item_links, ich mach dir nen guten Preis' WHERE `id`=1261; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Ich habe %formatted_item_links, mit gutem Angebot gehörts dir' WHERE `id`=1262; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Verkaufe %formatted_item_links, bin offen für Angebote' WHERE `id`=1263; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Ich habe %formatted_item_links, melde dich bei Interesse' WHERE `id`=1264; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Ich kann dir %formatted_item_links zu einem guten Preis verkaufen' WHERE `id`=1265; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Ich habe %formatted_item_links zu verkaufen, nehme alle Angebote an' WHERE `id`=1266; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Habe %formatted_item_links im Verkauf, flüster mir für Details' WHERE `id`=1267; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Habe %formatted_item_links im Verkauf, macht mir ein Angebot' WHERE `id`=1268; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Ich habe %formatted_item_links, was zahlt ihr?' WHERE `id`=1269; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Verkaufe %formatted_item_links, schreib mir für mehr Infos' WHERE `id`=1270; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Ich habe %formatted_item_links, sagt Bescheid bei Interesse' WHERE `id`=1271; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Verkaufe %formatted_item_links, lass uns über Zahlen reden' WHERE `id`=1272; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Ich kann dir %formatted_item_links verkaufen, was bietest du?' WHERE `id`=1273; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Hey, habe %formatted_item_links zu verkaufen, meldet euch bei Interesse' WHERE `id`=1274; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Ich habe %formatted_item_links, PN für den Preis' WHERE `id`=1275; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Verkaufe %formatted_item_links, bin offen für Angebote' WHERE `id`=1276; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Ich habe %formatted_item_links, schreibt mir einfach' WHERE `id`=1277; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Kann %formatted_item_links anbieten, sagt Bescheid bei Interesse' WHERE `id`=1278; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Verkaufe %formatted_item_links, bitte vernünftige Angebote' WHERE `id`=1279; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Ich habe %formatted_item_links, meldet euch für mehr Infos' WHERE `id`=1280; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Ich habe %formatted_item_links, macht mir ein Angebot' WHERE `id`=1281; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Verkaufe %formatted_item_links, schreibt mir bei Interesse' WHERE `id`=1282; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Habe %formatted_item_links zu verkaufen, lass uns handeln' WHERE `id`=1283; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Ich habe %formatted_item_links, sag Bescheid wenn du willst' WHERE `id`=1284; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Ich kann diese Quest nicht annehmen' WHERE `id`=1287; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Ich kann nicht mit dem Questgeber sprechen' WHERE `id`=1288; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Ich habe %quest bereits abgeschlossen' WHERE `id`=1289; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Ich habe %quest bereits' WHERE `id`=1290; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Ich kann %quest nicht annehmen' WHERE `id`=1291; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Ich kann %quest nicht annehmen, mein Questlog ist voll' WHERE `id`=1292; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Ich kann %quest nicht annehmen, meine Tasche ist voll' WHERE `id`=1293; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Ich habe %quest angenommen' WHERE `id`=1294; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Ich habe die Quest %quest nicht abgeschlossen' WHERE `id`=1295; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Quest %quest verfügbar' WHERE `id`=1296; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Ich habe die Quest %quest vergeigt' WHERE `id`=1297; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Ich kann die Quest %quest nicht abgeben' WHERE `id`=1298; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Ich habe die Quest %quest abgeschlossen' WHERE `id`=1299; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Ich habe die Quest %quest abgeschlossen und %item erhalten' WHERE `id`=1300; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Welche Belohnung soll ich für die Quest %quest nehmen? %rewards' WHERE `id`=1301; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Okay, ich nehme %item als Belohnung' WHERE `id`=1302; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Hi' WHERE `id`=1305; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Hallo zusammen!' WHERE `id`=1307; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Hallo, geh vor!' WHERE `id`=1309; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Hi, geh vor!' WHERE `id`=1310; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Hey %player, willst du in meine Gruppe?' WHERE `id`=1311; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Hey %player, kommst du in meine Gruppe?' WHERE `id`=1312; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Logout abgebrochen!' WHERE `id`=1313; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Ich logge mich aus!' WHERE `id`=1314; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Was war das, %s?' WHERE `id`=1318; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Bin nicht sicher, ob ich dich verstehe, %s?' WHERE `id`=1319; +UPDATE `ai_playerbot_texts` SET `text_loc3`='äh... keine Ahnung, wovon du redest' WHERE `id`=1320; +UPDATE `ai_playerbot_texts` SET `text_loc3`='whaaaa?' WHERE `id`=1322; +UPDATE `ai_playerbot_texts` SET `text_loc3`='hä?' WHERE `id`=1323; +UPDATE `ai_playerbot_texts` SET `text_loc3`='was?' WHERE `id`=1324; +UPDATE `ai_playerbot_texts` SET `text_loc3`='redest du grade?' WHERE `id`=1325; +UPDATE `ai_playerbot_texts` SET `text_loc3`='mir egal, Digga' WHERE `id`=1326; +UPDATE `ai_playerbot_texts` SET `text_loc3`='da bin ich raus' WHERE `id`=1327; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Konzentrier dich aufs Spiel, %s!' WHERE `id`=1330; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Mit dir zu chatten, %s, ist so großartig! Wollte dich immer schon treffen' WHERE `id`=1331; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Diese Chatnachrichten machen mich fertig! Fühlt sich an, als würde ich euch alle kennen!' WHERE `id`=1332; +UPDATE `ai_playerbot_texts` SET `text_loc3`='JA SICHER! HAHA KLAR!!!' WHERE `id`=1333; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Ich glaub dir!!!' WHERE `id`=1334; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Okay, ähm, lol' WHERE `id`=1335; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Hey %s... ach egal!' WHERE `id`=1337; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Wovon redest du, %s' WHERE `id`=1338; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Wer hat das gesagt? Ich fühl mich angesprochen' WHERE `id`=1339; +UPDATE `ai_playerbot_texts` SET `text_loc3`='wtf, worüber redet ihr alle' WHERE `id`=1340; +UPDATE `ai_playerbot_texts` SET `text_loc3`='ehrlich jetzt, kein Witz' WHERE `id`=1341; +UPDATE `ai_playerbot_texts` SET `text_loc3`='du bekommst gar nix' WHERE `id`=1342; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Plus Aura!!!' WHERE `id`=1343; +UPDATE `ai_playerbot_texts` SET `text_loc3`='thx!' WHERE `id`=1344; +UPDATE `ai_playerbot_texts` SET `text_loc3`='jup' WHERE `id`=1346; +UPDATE `ai_playerbot_texts` SET `text_loc3`='f' WHERE `id`=1347; +UPDATE `ai_playerbot_texts` SET `text_loc3`='%s, kein Scheiß xD' WHERE `id`=1348; +UPDATE `ai_playerbot_texts` SET `text_loc3`='warum ist das so' WHERE `id`=1349; +UPDATE `ai_playerbot_texts` SET `text_loc3`='ROFL' WHERE `id`=1350; +UPDATE `ai_playerbot_texts` SET `text_loc3`='dachte, ich halt besser die Klappe, der Chat hat mich wieder verwirrt' WHERE `id`=1351; +UPDATE `ai_playerbot_texts` SET `text_loc3`='ich kann richtig eifersüchtig werden' WHERE `id`=1352; +UPDATE `ai_playerbot_texts` SET `text_loc3`='%s, du hörst den triefenden Sarkasmus in meinem text_loc3 nicht' WHERE `id`=1353; +UPDATE `ai_playerbot_texts` SET `text_loc3`='er meinte „kein Ding“, passt schon' WHERE `id`=1354; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Ja, %s' WHERE `id`=1356; +UPDATE `ai_playerbot_texts` SET `text_loc3`='interessant...' WHERE `id`=1357; +UPDATE `ai_playerbot_texts` SET `text_loc3`='lol' WHERE `id`=1358; +UPDATE `ai_playerbot_texts` SET `text_loc3`='%s, fick dich, Mann :D' WHERE `id`=1359; +UPDATE `ai_playerbot_texts` SET `text_loc3`=':^)' WHERE `id`=1360; +UPDATE `ai_playerbot_texts` SET `text_loc3`='thx' WHERE `id`=1361; +UPDATE `ai_playerbot_texts` SET `text_loc3`='%s, gut gesagt' WHERE `id`=1362; +UPDATE `ai_playerbot_texts` SET `text_loc3`='yay' WHERE `id`=1363; +UPDATE `ai_playerbot_texts` SET `text_loc3`='ja' WHERE `id`=1364; +UPDATE `ai_playerbot_texts` SET `text_loc3`='ooooooh' WHERE `id`=1365; +UPDATE `ai_playerbot_texts` SET `text_loc3`='hmm' WHERE `id`=1366; +UPDATE `ai_playerbot_texts` SET `text_loc3`='ja klar' WHERE `id`=1367; +UPDATE `ai_playerbot_texts` SET `text_loc3`='mir wird schlecht, wtf' WHERE `id`=1368; +UPDATE `ai_playerbot_texts` SET `text_loc3`='heiß' WHERE `id`=1369; +UPDATE `ai_playerbot_texts` SET `text_loc3`='die Weiber sind sauer' WHERE `id`=1370; +UPDATE `ai_playerbot_texts` SET `text_loc3`='was hast du gegessen, %s' WHERE `id`=1371; +UPDATE `ai_playerbot_texts` SET `text_loc3`='wtf' WHERE `id`=1372; +UPDATE `ai_playerbot_texts` SET `text_loc3`='ich versuche, diesen Kommentar zu verstehen' WHERE `id`=1373; +UPDATE `ai_playerbot_texts` SET `text_loc3`='*verwirrt*' WHERE `id`=1374; +UPDATE `ai_playerbot_texts` SET `text_loc3`='fuck ja' WHERE `id`=1375; +UPDATE `ai_playerbot_texts` SET `text_loc3`='0/10 würde ich nicht wieder lesen' WHERE `id`=1376; +UPDATE `ai_playerbot_texts` SET `text_loc3`='10/10 würde ich wieder lesen' WHERE `id`=1377; +UPDATE `ai_playerbot_texts` SET `text_loc3`='6/10 würde es lesen' WHERE `id`=1378; +UPDATE `ai_playerbot_texts` SET `text_loc3`='7/10 vielleicht' WHERE `id`=1379; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Respekt!' WHERE `id`=1380; +UPDATE `ai_playerbot_texts` SET `text_loc3`='oh ja, vielleicht' WHERE `id`=1381; +UPDATE `ai_playerbot_texts` SET `text_loc3`='ja und?' WHERE `id`=1382; +UPDATE `ai_playerbot_texts` SET `text_loc3`='hey %s, ich habe dich nicht vergessen' WHERE `id`=1383; +UPDATE `ai_playerbot_texts` SET `text_loc3`='du gehst mir hart auf den Sack, %s' WHERE `id`=1384; +UPDATE `ai_playerbot_texts` SET `text_loc3`='diesmal krieg ich dich, %s' WHERE `id`=1385; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Pass besser auf, %s' WHERE `id`=1386; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Die letzte Runde mochte ich nicht so' WHERE `id`=1387; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Letzte Runde war ich mies, danke, %s' WHERE `id`=1388; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Mach dich bereit zu sterben, %s' WHERE `id`=1389; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Fands nicht geil, dass du mich gekillt hast, %s' WHERE `id`=1390; +UPDATE `ai_playerbot_texts` SET `text_loc3`='%s, ich hasse dich' WHERE `id`=1391; +UPDATE `ai_playerbot_texts` SET `text_loc3`='grrrrrr, diesmal krieg ich dich, %s' WHERE `id`=1392; +UPDATE `ai_playerbot_texts` SET `text_loc3`='FICK DICH! NEIN, FICK MICH!' WHERE `id`=1393; +UPDATE `ai_playerbot_texts` SET `text_loc3`='%s, ich kotze dir in dein verficktes Maul' WHERE `id`=1394; +UPDATE `ai_playerbot_texts` SET `text_loc3`='verurteil mich nicht, verdammt nochmal' WHERE `id`=1395; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Deine Mom ist so fett, sie passt nicht mal durchs Dunkle Portal' WHERE `id`=1396; +UPDATE `ai_playerbot_texts` SET `text_loc3`='armselige Gestalt' WHERE `id`=1399; +UPDATE `ai_playerbot_texts` SET `text_loc3`='was zum Teufel' WHERE `id`=1400; +UPDATE `ai_playerbot_texts` SET `text_loc3`='das war scheiße' WHERE `id`=1401; +UPDATE `ai_playerbot_texts` SET `text_loc3`='REMATCH!!! Ich mach ihn platt' WHERE `id`=1402; +UPDATE `ai_playerbot_texts` SET `text_loc3`='peinlich, ich wurde von %s gekillt' WHERE `id`=1403; +UPDATE `ai_playerbot_texts` SET `text_loc3`='ok, ich bin raus' WHERE `id`=1404; +UPDATE `ai_playerbot_texts` SET `text_loc3`='hehe, hab %s weggeklatscht?' WHERE `id`=1405; +UPDATE `ai_playerbot_texts` SET `text_loc3`='viel zu easy, %s zu killen' WHERE `id`=1406; +UPDATE `ai_playerbot_texts` SET `text_loc3`='hab dich, du Bastard' WHERE `id`=1407; +UPDATE `ai_playerbot_texts` SET `text_loc3`='haha' WHERE `id`=1408; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Loser' WHERE `id`=1409; +UPDATE `ai_playerbot_texts` SET `text_loc3`='ich hab %s gekillt und ihr seid als nächste dran, Jungs' WHERE `id`=1410; +UPDATE `ai_playerbot_texts` SET `text_loc3`='oh ja, hab ihn geownt' WHERE `id`=1411; +UPDATE `ai_playerbot_texts` SET `text_loc3`='ich bin ne Killmaschine' WHERE `id`=1412; +UPDATE `ai_playerbot_texts` SET `text_loc3`='%s, erinnert mich an einen Slayer-Song... dieses ganze Gemetzel' WHERE `id`=1413; +UPDATE `ai_playerbot_texts` SET `text_loc3`='sorry, %s. Können wir die Szene nochmal machen?' WHERE `id`=1414; +UPDATE `ai_playerbot_texts` SET `text_loc3`='na, wie gefällt es dir Wurmfutter zu sein, %s???' WHERE `id`=1415; +UPDATE `ai_playerbot_texts` SET `text_loc3`='du solltest tot sein, %s, das gehört zum Spiel!!!!!' WHERE `id`=1416; +UPDATE `ai_playerbot_texts` SET `text_loc3`='sorry, %s. das sah so gut aus wie ein Kunstwerk von der Kirmes!' WHERE `id`=1417; +UPDATE `ai_playerbot_texts` SET `text_loc3`='%s, ich nehme nächstes Mal Gummigeschosse!' WHERE `id`=1418; +UPDATE `ai_playerbot_texts` SET `text_loc3`='was ist los, %s?? Kopf verloren? hahaha, ruhig bleiben!!' WHERE `id`=1419; +UPDATE `ai_playerbot_texts` SET `text_loc3`='musste das tun, %s. Du verstehst schon. Der Regisseur hat es so gesagt!!' WHERE `id`=1420; +UPDATE `ai_playerbot_texts` SET `text_loc3`='hey %s.......MUAHAHAHAHAHAHAHAHAHAHA' WHERE `id`=1421; +UPDATE `ai_playerbot_texts` SET `text_loc3`='%s, das hab ich genossen!! Wiederholung bitte!' WHERE `id`=1422; +UPDATE `ai_playerbot_texts` SET `text_loc3`='hey, %s! Kannst mich ab jetzt "Scarface" nennen.. du Stück SCHEI**!!!!' WHERE `id`=1423; +UPDATE `ai_playerbot_texts` SET `text_loc3`='redest du mit mir, %s??' WHERE `id`=1424; +UPDATE `ai_playerbot_texts` SET `text_loc3`='%s, mach es diesmal richtig, stell dich nicht vor meine Kugeln.' WHERE `id`=1425; +UPDATE `ai_playerbot_texts` SET `text_loc3`='%s, warum liegst du da rum??? hehe' WHERE `id`=1426; +UPDATE `ai_playerbot_texts` SET `text_loc3`='hab mich totgelacht' WHERE `id`=1427; +UPDATE `ai_playerbot_texts` SET `text_loc3`='hi %s' WHERE `id`=1428; +UPDATE `ai_playerbot_texts` SET `text_loc3`='oh, hi %s' WHERE `id`=1429; +UPDATE `ai_playerbot_texts` SET `text_loc3`='was geht, %s!!!' WHERE `id`=1430; +UPDATE `ai_playerbot_texts` SET `text_loc3`='hi' WHERE `id`=1431; +UPDATE `ai_playerbot_texts` SET `text_loc3`='was geht' WHERE `id`=1432; +UPDATE `ai_playerbot_texts` SET `text_loc3`='hallo %s' WHERE `id`=1433; +UPDATE `ai_playerbot_texts` SET `text_loc3`='hi %s, kennen wir uns?' WHERE `id`=1434; +UPDATE `ai_playerbot_texts` SET `text_loc3`='hey %s' WHERE `id`=1435; +UPDATE `ai_playerbot_texts` SET `text_loc3`='hai %s' WHERE `id`=1436; +UPDATE `ai_playerbot_texts` SET `text_loc3`='was zur Hölle' WHERE `id`=1437; +UPDATE `ai_playerbot_texts` SET `text_loc3`='WTF' WHERE `id`=1438; +UPDATE `ai_playerbot_texts` SET `text_loc3`='das ist Bullshit' WHERE `id`=1439; +UPDATE `ai_playerbot_texts` SET `text_loc3`='admin' WHERE `id`=1440; +UPDATE `ai_playerbot_texts` SET `text_loc3`='hey %s, hör auf, deine Admin-Rechte zu missbrauchen' WHERE `id`=1441; +UPDATE `ai_playerbot_texts` SET `text_loc3`='lass mich in Ruhe, Admin!' WHERE `id`=1442; +UPDATE `ai_playerbot_texts` SET `text_loc3`='du bist scheisse, Admin' WHERE `id`=1443; +UPDATE `ai_playerbot_texts` SET `text_loc3`='das ist mein Name, was willst du, %s' WHERE `id`=1444; +UPDATE `ai_playerbot_texts` SET `text_loc3`='ja???' WHERE `id`=1445; +UPDATE `ai_playerbot_texts` SET `text_loc3`='äh... was' WHERE `id`=1446; +UPDATE `ai_playerbot_texts` SET `text_loc3`='redest du mit mir, %s?' WHERE `id`=1447; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Hey ! Rate mal, was deine Mom letzte Nacht gesagt hat!' WHERE `id`=1450; +UPDATE `ai_playerbot_texts` SET `text_loc3`=', du bist so hässlich, du würdest nicht mal im Affenbordell mit einem Sack Bananen landen!' WHERE `id`=1451; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Halt die Klappe, , du wirst so ein Mann sein, wie deine Mutter!!' WHERE `id`=1452; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Deine Mutter ist so fett, dass man eine Pokéflöte braucht, um sie aufzuwecken und dein Vater ist der Trainer!!!!' WHERE `id`=1453; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Dich als dumm zu bezeichnen, wäre eine Beleidigung für dumme Leute!' WHERE `id`=1454; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Ich furze in deine allgemeine Richtung!!!' WHERE `id`=1455; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Jeder Atemzug, den ich ohne deine Erlaubnis mache, steigert mein Selbstwertgefühl!' WHERE `id`=1456; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Was willst du tun , mich vollbluten? NIMM DAS!' WHERE `id`=1457; +UPDATE `ai_playerbot_texts` SET `text_loc3`='A-G-G-R-O! Das heißt Bosszeit!' WHERE `id`=1458; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Wir hatten grausame und hatten irre Begleiter, aber mit dir sind wir mit einem grausamen Irren gestraft!' WHERE `id`=1459; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Hey ! Hör auf, sie anzubaggern, sie ist nicht dein Typ. Die sind nicht aufblasbar.' WHERE `id`=1460; +UPDATE `ai_playerbot_texts` SET `text_loc3`=', du bist so weit außerhalb deiner Liga, du spielst schon eine andere Sportart.' WHERE `id`=1461; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Großer Fehler heute Morgen, : Du bist aufgestanden!' WHERE `id`=1462; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Ich will mal versuchen, mich in ein Pferd zu verwandeln, brauche aber Hilfe. Ich mach die Vorderseite, du bleibst du.' WHERE `id`=1463; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Du kommst mir vor, als wäre das Beste von dir damals am Arsch deiner Mutter runtergelaufen und als braune Soße auf der Matratze geblieben!' WHERE `id`=1464; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Ich würd dir gern ein Abschiedsgeschenk machen... Aber zuerst machst du deinen Teil.' WHERE `id`=1465; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Bevor du kamst, waren wir motiviert, jetzt sind wir einfach nur noch genervt.' WHERE `id`=1466; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Ich mag dich. Man sagt, ich hätte keinen Geschmack, aber ich mag dich.' WHERE `id`=1467; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Ich glaube, du hast Minderwertigkeitskomplexe, aber ist okay, ist gerechtfertigt.' WHERE `id`=1468; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Verschwinde, sonst passiert was.' WHERE `id`=1469; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Kaum zu fassen, dass ich meine Zeit mit dir verschwende!' WHERE `id`=1470; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Ich liebe es, wenn mich jemand beleidigt, dann muss ich nicht mehr nett sein.' WHERE `id`=1471; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Ich werde dich auch auslöschen, du Mistkerl! Ich werde dir die Eingeweide rausreißen und dir ins Gesicht schmieren!' WHERE `id`=1472; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Du abscheuliche Bestie, nicht mal ein Hund würde dich fressen.' WHERE `id`=1473; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Du schlägst wie ein Vegetarier.' WHERE `id`=1474; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Wer hat dich ausgebuddelt, du wandelnde Seuche?' WHERE `id`=1475; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Ich schau dir nicht in die Augen, ich will heute noch schlafen können.' WHERE `id`=1476; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Boah, bei dir quillt ja noch das Mittagessen raus! Ich hab dich gerochen, bevor ich dich gesehen hab.' WHERE `id`=1477; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Oh du bist so hässlich, selbst der Respawn will dich nicht!' WHERE `id`=1478; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Ich muss mal einen riesigen machen. ist mein neues Wort für Scheiße.' WHERE `id`=1479; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Oh du nutzlose, moorsaufende Krebsgeschwulst!' WHERE `id`=1480; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Wäre ich wie du, würd ich mich selbst löschen!' WHERE `id`=1481; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Oh lehre mich, wie ich das Denken vergesse!' WHERE `id`=1482; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Ich hab schon Toiletten gesehen, die sauberer kämpfen als du.' WHERE `id`=1483; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Du verdammter Scheißkerl. Wo hast du dein Handwerk gelernt? Du dumme, verdammte Schlampe. Du Idiot. Wer hat dir gesagt, dass du mit Männern arbeiten kannst?' WHERE `id`=1484; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Wenn Unfähigkeit ’ne Klasse wäre, hättest du sie gemaxt.' WHERE `id`=1485; +UPDATE `ai_playerbot_texts` SET `text_loc3`=' du dummes Arschfurz-Teppichladen-Arschloch' WHERE `id`=1486; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Ich lebe lang genug und dann nehm ich dir das Hirn raus!' WHERE `id`=1487; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Wenn einen intelligenten Gedanken im Kopf hätte, würde er an Einsamkeit sterben.' WHERE `id`=1488; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Hör auf zu weinen, du winselnder Arsch, hör auf mit deinem Unsinn. Du bist nur die Nachgeburt, .' WHERE `id`=1489; +UPDATE `ai_playerbot_texts` SET `text_loc3`='! Wenn Gehirn Vogelkacke wäre, hättest du einen sauberen Käfig' WHERE `id`=1490; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Hör mal zu, du Vokuhila... warum zündest du nicht einfach dein Tampon an und sprengst deine Box in die Luft? Denn das ist der einzige Knall, den du kriegen wirst.' WHERE `id`=1491; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Verschwinde aus meiner Sicht ! Du verseuchst meine Augen!' WHERE `id`=1492; +UPDATE `ai_playerbot_texts` SET `text_loc3`='SPIELZEIT!!!!' WHERE `id`=1493; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Niemand kommt vorbei!' WHERE `id`=1494; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Wir werden angegriffen! Klar zum Gefecht, ihr Deckschrubber! Wehrt die Eindringlinge ab!' WHERE `id`=1495; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Narren... Tötet den im Kleid!' WHERE `id`=1497; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Ich werde deine Seele Hakkar selbst zum Fraß vorwerfen!' WHERE `id`=1498; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Stolz kündigt das Ende eurer Welt an! Kommt, Sterbliche! Stellt euch dem Zorn der !' WHERE `id`=1499; +UPDATE `ai_playerbot_texts` SET `text_loc3`='All meine Pläne haben zu diesem Moment geführt!' WHERE `id`=1500; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Neuer Tag, neue glorreiche Schlacht!' WHERE `id`=1502; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Also, Geschäft... oder Vergnügen?' WHERE `id`=1503; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Ihr seid nicht vorbereitet!' WHERE `id`=1504; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Die letzte Eroberung der hat begonnen! Wieder liegt die Unterwerfung dieser Welt in unseren Händen. Lasst keinen überleben!' WHERE `id`=1505; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Euer Tod wird ein schmerzhafter sein.' WHERE `id`=1506; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Fleht um Gnade! Eure bedeutungslosen Leben sind bald verwirkt.' WHERE `id`=1507; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Gebt alle Hoffnung auf! Die ist zurückgekehrt, um zu beenden, was vor so vielen Jahren begann. Diesmal gibt es kein Entkommen!' WHERE `id`=1508; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Alarm! Ihr seid zur Auslöschung markiert!' WHERE `id`=1509; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Hahaha! Ihr seid hoffnungslos unterlegen!' WHERE `id`=1511; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Ich werde euren Größenwahn zerschmettern!' WHERE `id`=1512; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Verzeiht mir, denn ihr werdet gleich das Spiel verlieren.' WHERE `id`=1513; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Wehren macht es nur schlimmer.' WHERE `id`=1514; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Ungeziefer! Blutegel! Saugt mein Blut und erstickt daran!' WHERE `id`=1515; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Mein Blut wird euer Ende sein!' WHERE `id`=1517; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Macht hinne, Wachen! Es ist Zeit zum Töten!' WHERE `id`=1519; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Zögert euer Schicksal nicht hinaus. Kommt jetzt zu mir. Ich mache euer Opfer kurz.' WHERE `id`=1520; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Bald seid ihr tot!' WHERE `id`=1521; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Mu-ha-ha!' WHERE `id`=1522; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Ich bin der Jäger! Ihr seid die Beute...' WHERE `id`=1523; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Ihr werdet diesen Ort in Stücken verlassen!' WHERE `id`=1524; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Der Tod naht. Wird euer Gewissen rein sein?' WHERE `id`=1525; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Euer Verhalten wird nicht toleriert.' WHERE `id`=1526; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Hmm, unangekündigte Besucher. Vorbereitungen müssen getroffen werden...' WHERE `id`=1528; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Feindliche Einheiten entdeckt. Bedrohungsanalyse-Protokoll aktiv. Primärziel erfasst. Zeit minus dreißig Sekunden bis zur Neubewertung.' WHERE `id`=1529; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Neue Spielzeuge? Für mich? Ich verspreche, ich mach sie diesmal nicht kaputt!' WHERE `id`=1530; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Pssst... gleich ist alles vorbei.' WHERE `id`=1532; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Sag es mir... sag mir alles, Geheimnisse und Privatsachen! Ich reiße dir die Infos aus dem Fleisch!' WHERE `id`=1536; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Macht euch bereit, die Glocken haben geläutet! Bringt die Schwachen, die Jungen und die Alten in Sicherheit! Jeder von euch zahlt den letzten Preis! Fleht um Gnade, die Abrechnung ist gekommen!' WHERE `id`=1537; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Wo, bei Bonzos Messingknöpfen, bin ich?' WHERE `id`=1538; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Ich ertrage es nicht länger! Goblinkönig! Goblinkönig! Wo immer du bist! Nimm diesen weit weg von mir!' WHERE `id`=1539; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Ihr habt dreizehn Stunden, um das Labyrinth zu lösen, bevor euer kleiner Bruder einer von uns wird... für immer.' WHERE `id`=1540; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Also, die ist Kinderkram, ja? Dann sehen wir mal, wie ihr dieses kleine Stückchen verdaut...' WHERE `id`=1541; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Weiche! Ich stelle mich jedem Kampf. Du irrst dich, dies ist nicht dein Revier.' WHERE `id`=1542; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Zeig, was du drauf hast!' WHERE `id`=1543; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Zweiklingen-Action für eine glatte und saubere Rasur jedes mal.' WHERE `id`=1545; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Los, komm schon!' WHERE `id`=1546; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Du gehst drauf!' WHERE `id`=1547; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Stich, stich, stich!' WHERE `id`=1548; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Machen wir das schnell, Zeit ist Mana.' WHERE `id`=1549; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Ich glaube nicht, dass ihr die Schwere eurer Lage begreift.' WHERE `id`=1550; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Ich bringe meiner Familie und meinem Königreich Ehre!' WHERE `id`=1551; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Licht, gib mir Stärke!' WHERE `id`=1552; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Meine Kirche ist das Schlachtfeld, Zeit zum Gottesdienst...' WHERE `id`=1553; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Ich verachte euch...' WHERE `id`=1554; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Stellt euch dem Hammer der Gerechtigkeit!' WHERE `id`=1555; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Beweist euren Wert in der Prüfung der Waffen im Lichte!' WHERE `id`=1556; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Alles wird vor der Macht und der Gerechtigkeit meiner Sache fallen. Ihr werdet der Nächste sein!' WHERE `id`=1557; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Bereitet euch aufs Sterben vor!' WHERE `id`=1558; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Die Bestie an meiner Seite ist nichts gegen die Bestie in mir...' WHERE `id`=1559; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Erlebt die Feuerkraft dieses voll bewaffneten Jägers!' WHERE `id`=1560; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Heilt mich! Schnell!' WHERE `id`=1561; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Fast tot! Heilt mich!' WHERE `id`=1562; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Hilfe! Heilt mich!' WHERE `id`=1563; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Irgendwer! Heilt mich!' WHERE `id`=1564; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Heal! Heal! Heal!' WHERE `id`=1565; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Ich sterbe! Heal! Aaaaarhg!' WHERE `id`=1566; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Heal mich!' WHERE `id`=1567; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Ich sterbe. Ich sterbe. Ich sterbe. Heal!' WHERE `id`=1568; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Oh, der Schmerz. Heilt mich schnell!' WHERE `id`=1570; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Brauche Heal' WHERE `id`=1571; +UPDATE `ai_playerbot_texts` SET `text_loc3`='HP low' WHERE `id`=1572; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Gebt mal nen Heal. Bitte.' WHERE `id`=1573; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Kann mir jemand nen Heal geben?' WHERE `id`=1574; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Hey! Lieber jetzt heilen als später zu rezzen' WHERE `id`=1575; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Sorry. Brauche noch einen Heal' WHERE `id`=1576; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Verdammte Mobs. Heal mich bitte' WHERE `id`=1577; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Noch ein Treffer und ich bin hinüber. Heal bitte' WHERE `id`=1578; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Heiler da?' WHERE `id`=1579; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Warum hauen die mir immer ins Gesicht? Brauche Heal' WHERE `id`=1580; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Kann mich wer ein bisschen heilen?' WHERE `id`=1581; +UPDATE `ai_playerbot_texts` SET `text_loc3`='OOM' WHERE `id`=1582; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Kein Mana mehr' WHERE `id`=1583; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Verdammt, dafür hab ich mein ganzes Mana verballert' WHERE `id`=1584; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Wartet bis ich trinke oder mein Mana wieder da ist' WHERE `id`=1585; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Mana low' WHERE `id`=1586; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Mana low. Muss trinken' WHERE `id`=1588; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Haben wir nen Getränkeautomaten? Wieder OOM' WHERE `id`=1589; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Mein Mana ist Geschichte' WHERE `id`=1590; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Ich besorge mir nächstes mal Drinks. OOM' WHERE `id`=1591; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Noch 100 !' WHERE `id`=1595; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Das war es! Keine mehr!' WHERE `id`=1596; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Und ihr habt meinen Bogen... ups, keine !' WHERE `id`=1597; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Brauche !' WHERE `id`=1598; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Ich habe Angst' WHERE `id`=1600; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Wir sind am Arsch.' WHERE `id`=1601; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Das wars.' WHERE `id`=1602; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Hier ist jetzt Schluss.' WHERE `id`=1603; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Kann mal wer Blizzard anrufen?' WHERE `id`=1604; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Verdammt. Der Tank hat alle Mobs gepullt.' WHERE `id`=1605; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Wir sterben. Wir sterben. Wir sterben.' WHERE `id`=1606; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Whoa! So viel Spielzeug zum Austoben.' WHERE `id`=1607; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Ich kill sie alle!' WHERE `id`=1608; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Wenn der Tank stirbt, sind wir Geschichte.' WHERE `id`=1609; +UPDATE `ai_playerbot_texts` SET `text_loc3`='LEEEEERROOOYYYYYYYYYYYY JENNKINNNSSSSSS!!!!!!!' WHERE `id`=1611; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Okay. Was haben wir an AoE?' WHERE `id`=1612; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Jetzt wirds interessant.' WHERE `id`=1613; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Cool. Zieht sie zusammen für nen schönen Flammenstoß.' WHERE `id`=1614; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Kill! Kill! Kill!' WHERE `id`=1615; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Ich glaub, meine Hose ist nass.' WHERE `id`=1616; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Hoffentlich sind die Heiler ready. Leeeeroy!' WHERE `id`=1618; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Hoffentlich kommen die nicht zu mir.' WHERE `id`=1619; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Oh nein. Ich kann bei dem Gemetzel nicht hinsehen.' WHERE `id`=1620; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Hoffentlich gibts Gold.' WHERE `id`=1621; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Loot! Loot!' WHERE `id`=1622; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Mein Schatz.' WHERE `id`=1623; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Hoffentlich wartet da ein schickes episches Item auf mich.' WHERE `id`=1624; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Ich hab tiefe Taschen und Beutel.' WHERE `id`=1625; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Alles meins!' WHERE `id`=1626; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Hoffentlich heute kein grauer Müll.' WHERE `id`=1627; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Dieser Loot ist MEINER!' WHERE `id`=1628; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Looten ist eklig, aber ich brauch Gold.' WHERE `id`=1629; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Gold!' WHERE `id`=1630; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Okay. Mal sehen, was sie droppen.' WHERE `id`=1631; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Keine Sorge. Ich loote alles.' WHERE `id`=1632; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Ich bin ein Ninja-Looter.' WHERE `id`=1633; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Kann mir mal wer erklären, wo die das ganze Zeug versteckt haben?' WHERE `id`=1635; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Nein, ich loote keinen grauen Müll.' WHERE `id`=1636; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Ich bin zuerst. Ich bin zuerst. Ich bin zuerst.' WHERE `id`=1637; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Gebt mir euer Gold!' WHERE `id`=1638; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Meine Taschen sind leer, müssen aber voll werden.' WHERE `id`=1639; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Hab dafür ne neue Tasche.' WHERE `id`=1640; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Hoffentlich zieh ich beim Looten keine Aggro.' WHERE `id`=1641; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Ich kann nicht looten wenn jemand zusieht.' WHERE `id`=1642; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Ha! Ihr kriegt davon keinen Krümel!' WHERE `id`=1643; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Ich mag neues Gear.' WHERE `id`=1645; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Ich höre auf, wenn schon wieder nichts Wertvolles droppt.' WHERE `id`=1646; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Hoffentlich ist es ein hübscher Ring.' WHERE `id`=1647; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Ich reiß dir den Loot aus den Händen.' WHERE `id`=1648; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Alle weg da. Ich loote jetzt.' WHERE `id`=1649; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Geiler Loot.' WHERE `id`=1650; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Oh ihr RNG-Götter! Gewährt mir heute einen Epic beim würfeln.' WHERE `id`=1651; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Bitte gib mir neues Spielzeug.' WHERE `id`=1652; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Hoffe, die haben was Leckeres dabei.' WHERE `id`=1653; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Das Gold gehört mir. Ich lasse euch den Rest, versprochen.' WHERE `id`=1654; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Bin gleich da, wartet auf mich!' WHERE `id`=1657; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Bin nicht mehr weit, bitte wartet!' WHERE `id`=1658; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Bin auf dem Weg zu euch.' WHERE `id`=1659; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Ich reise zu euch.' WHERE `id`=1661; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Ich versuche zu euch zu kommen.' WHERE `id`=1662; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Rüste %item aus' WHERE `id`=1663; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Ich habe die Zauber gelernt: %spells' WHERE `id`=1665; +UPDATE `ai_playerbot_texts` SET `text_loc3`='%item hat Abklingzeit.' WHERE `id`=1666; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Ich habe %item nicht im Inventar.' WHERE `id`=1667; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Das Item mit der ID %item existiert nicht.' WHERE `id`=1668; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Folge.' WHERE `id`=1671; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Bleibe hier.' WHERE `id`=1672; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Fliehe.' WHERE `id`=1673; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Ich fliehe nicht mit dir, du bist zu weit weg.' WHERE `id`=1674; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Grinde.' WHERE `id`=1675; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Greife an.' WHERE `id`=1676; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Das ist zu weit weg.' WHERE `id`=1677; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Da kann ich nicht hin.' WHERE `id`=1679; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Ich bin nicht in deiner Gilde!' WHERE `id`=1680; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Keine Gildenbank in der Nähe gefunden.' WHERE `id`=1681; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Ich kann nicht ' WHERE `id`=1682; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Ich habe keine Rechte, Items in den ersten Gildenbank-Reiter zu legen.' WHERE `id`=1683; +UPDATE `ai_playerbot_texts` SET `text_loc3`=' in die Gildenbank gelegt' WHERE `id`=1684; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Freies Bewegen.' WHERE `id`=1685; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Bewache.' WHERE `id`=1686; +UPDATE `ai_playerbot_texts` SET `text_loc3`='(das letzte)' WHERE `id`=1690; +UPDATE `ai_playerbot_texts` SET `text_loc3`='auf Handelsgegenstand' WHERE `id`=1692; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Loote %item' WHERE `id`=1696; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Ich habe nicht genug Gruppenmitglieder in der Nähe, um beschwören zu können.' WHERE `id`=1698; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Ich kenne den Zauber %spell nicht.' WHERE `id`=1701; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Stelle %spell her' WHERE `id`=1703; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Konnte %spell nicht wirken.' WHERE `id`=1705; +UPDATE `ai_playerbot_texts` SET `text_loc3`=' |cffffff00(x%amount übrig)|r' WHERE `id`=1706; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Dummy' WHERE `id`=1707; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Beim Licht… Ich hab meine Königssymbole vergessen. Na gut, dann nehmen wir eben %base_spell!' WHERE `id`=1708; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Die Natur ist großzügig, meine Taschen nicht... keine Kräuter für %group_spell mehr. Nehmt fürs Erste %base_spell!' WHERE `id`=1709; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Arkanes Pulver alle... %group_spell muss warten. Wirke %base_spell!' WHERE `id`=1710; +UPDATE `ai_playerbot_texts` SET `text_loc3`='Ups, mir fehlen die Komponenten für %group_spell. Wir nehmen %base_spell!' WHERE `id`=1711; +UPDATE `ai_playerbot_texts` SET `text_loc3`='%player bewegt sich, um den roten Strahl zu blocken!' WHERE `id`=1712; +UPDATE `ai_playerbot_texts` SET `text_loc3`='%player bewegt sich, um den blauen Strahl zu blocken!' WHERE `id`=1713; +UPDATE `ai_playerbot_texts` SET `text_loc3`='%player bewegt sich, um den grünen Strahl zu blocken!' WHERE `id`=1714; +UPDATE `ai_playerbot_texts` SET `text_loc3`='%player verlässt den blauen Strahl--nächster Blocker los!' WHERE `id`=1715; + +UPDATE `ai_playerbot_texts` SET `text_loc3`='%player verlässt den grünen Strahl--nächster Blocker los!' WHERE `id`=1716; From 7d5c9e3ee0ccde5ea25f45edd28fe6bc201d5bb1 Mon Sep 17 00:00:00 2001 From: St0ny <42348051+Raz0r1337@users.noreply.github.com> Date: Tue, 4 Nov 2025 14:48:24 +0100 Subject: [PATCH 132/151] Update 2025_10_27_00_ai_playerbot_german_texts.sql line error fixed --- .../updates/2025_10_27_00_ai_playerbot_german_texts.sql | 1 - 1 file changed, 1 deletion(-) diff --git a/data/sql/playerbots/updates/2025_10_27_00_ai_playerbot_german_texts.sql b/data/sql/playerbots/updates/2025_10_27_00_ai_playerbot_german_texts.sql index b3c0b9e7c5..d92169278c 100644 --- a/data/sql/playerbots/updates/2025_10_27_00_ai_playerbot_german_texts.sql +++ b/data/sql/playerbots/updates/2025_10_27_00_ai_playerbot_german_texts.sql @@ -1530,5 +1530,4 @@ UPDATE `ai_playerbot_texts` SET `text_loc3`='%player bewegt sich, um den roten S UPDATE `ai_playerbot_texts` SET `text_loc3`='%player bewegt sich, um den blauen Strahl zu blocken!' WHERE `id`=1713; UPDATE `ai_playerbot_texts` SET `text_loc3`='%player bewegt sich, um den grünen Strahl zu blocken!' WHERE `id`=1714; UPDATE `ai_playerbot_texts` SET `text_loc3`='%player verlässt den blauen Strahl--nächster Blocker los!' WHERE `id`=1715; - UPDATE `ai_playerbot_texts` SET `text_loc3`='%player verlässt den grünen Strahl--nächster Blocker los!' WHERE `id`=1716; From 983a55da86fee2c2aab9fef3d28e1e7bbbb8d25c Mon Sep 17 00:00:00 2001 From: Crow Date: Tue, 4 Nov 2025 16:01:30 -0600 Subject: [PATCH 133/151] Implement Gruul's Lair strategy (#1647) * Implement Gruul's Lair strategy * minor non-gameplay tweaks to code * Use multiplier for tank assist * HKM warlock & Gruul tank tweaks * Fixed declarations * rewrote HKM + minor Gruul tweaks * Update PlayerbotAI.cpp * modernize code and address comments * clean ups to tank logic * Oops. * Remove post-move delay For actions like positioning bosses, the standard post-movement delay should be overridden IMO since a player would be sequencing their actions in this type of situation * Update RaidGruulsLairActions.cpp * Replace break statements with return true * enum class to enum * moved all isuseful checks to triggers * Split multipliers and improved banish logic * Update for comments * changes to int * use helpers for marking icons * address compile errors * correct MoveTo and use RTI helper * address comments and rename actions/triggers * adjust alignment of location constants * fix some crappy returns * allow return true when changing targets * change indents and move enums inside namespace * style changes, trim trailing whitespaces, address comments --- src/PlayerbotAI.cpp | 3 + src/strategy/AiObjectContext.cpp | 4 + src/strategy/raids/RaidStrategyContext.h | 3 + .../gruulslair/RaidGruulsLairActionContext.h | 49 ++ .../gruulslair/RaidGruulsLairActions.cpp | 696 ++++++++++++++++++ .../raids/gruulslair/RaidGruulsLairActions.h | 112 +++ .../gruulslair/RaidGruulsLairHelpers.cpp | 241 ++++++ .../raids/gruulslair/RaidGruulsLairHelpers.h | 62 ++ .../gruulslair/RaidGruulsLairMultipliers.cpp | 110 +++ .../gruulslair/RaidGruulsLairMultipliers.h | 48 ++ .../gruulslair/RaidGruulsLairStrategy.cpp | 56 ++ .../raids/gruulslair/RaidGruulsLairStrategy.h | 18 + .../gruulslair/RaidGruulsLairTriggerContext.h | 49 ++ .../gruulslair/RaidGruulsLairTriggers.cpp | 160 ++++ .../raids/gruulslair/RaidGruulsLairTriggers.h | 97 +++ 15 files changed, 1708 insertions(+) create mode 100644 src/strategy/raids/gruulslair/RaidGruulsLairActionContext.h create mode 100644 src/strategy/raids/gruulslair/RaidGruulsLairActions.cpp create mode 100644 src/strategy/raids/gruulslair/RaidGruulsLairActions.h create mode 100644 src/strategy/raids/gruulslair/RaidGruulsLairHelpers.cpp create mode 100644 src/strategy/raids/gruulslair/RaidGruulsLairHelpers.h create mode 100644 src/strategy/raids/gruulslair/RaidGruulsLairMultipliers.cpp create mode 100644 src/strategy/raids/gruulslair/RaidGruulsLairMultipliers.h create mode 100644 src/strategy/raids/gruulslair/RaidGruulsLairStrategy.cpp create mode 100644 src/strategy/raids/gruulslair/RaidGruulsLairStrategy.h create mode 100644 src/strategy/raids/gruulslair/RaidGruulsLairTriggerContext.h create mode 100644 src/strategy/raids/gruulslair/RaidGruulsLairTriggers.cpp create mode 100644 src/strategy/raids/gruulslair/RaidGruulsLairTriggers.h diff --git a/src/PlayerbotAI.cpp b/src/PlayerbotAI.cpp index 9a670961e1..bf6b0a343a 100644 --- a/src/PlayerbotAI.cpp +++ b/src/PlayerbotAI.cpp @@ -1534,6 +1534,9 @@ void PlayerbotAI::ApplyInstanceStrategies(uint32 mapId, bool tellMaster) case 533: strategyName = "naxx"; // Naxxramas break; + case 565: + strategyName = "gruulslair"; // Gruul's Lair + break; case 574: strategyName = "wotlk-uk"; // Utgarde Keep break; diff --git a/src/strategy/AiObjectContext.cpp b/src/strategy/AiObjectContext.cpp index f0e93fd393..4c49fe4eac 100644 --- a/src/strategy/AiObjectContext.cpp +++ b/src/strategy/AiObjectContext.cpp @@ -39,6 +39,8 @@ #include "raids/blackwinglair/RaidBwlTriggerContext.h" #include "raids/karazhan/RaidKarazhanActionContext.h" #include "raids/karazhan/RaidKarazhanTriggerContext.h" +#include "raids/gruulslair/RaidGruulsLairActionContext.h" +#include "raids/gruulslair/RaidGruulsLairTriggerContext.h" #include "raids/naxxramas/RaidNaxxActionContext.h" #include "raids/naxxramas/RaidNaxxTriggerContext.h" #include "raids/eyeofeternity/RaidEoEActionContext.h" @@ -111,6 +113,7 @@ void AiObjectContext::BuildSharedActionContexts(SharedNamedObjectContextList creators["mc"] = &RaidStrategyContext::mc; creators["bwl"] = &RaidStrategyContext::bwl; creators["karazhan"] = &RaidStrategyContext::karazhan; + creators["gruulslair"] = &RaidStrategyContext::gruulslair; creators["naxx"] = &RaidStrategyContext::naxx; creators["wotlk-os"] = &RaidStrategyContext::wotlk_os; creators["wotlk-eoe"] = &RaidStrategyContext::wotlk_eoe; @@ -37,6 +39,7 @@ class RaidStrategyContext : public NamedObjectContext static Strategy* mc(PlayerbotAI* botAI) { return new RaidMcStrategy(botAI); } static Strategy* bwl(PlayerbotAI* botAI) { return new RaidBwlStrategy(botAI); } static Strategy* karazhan(PlayerbotAI* botAI) { return new RaidKarazhanStrategy(botAI); } + static Strategy* gruulslair(PlayerbotAI* botAI) { return new RaidGruulsLairStrategy(botAI); } static Strategy* naxx(PlayerbotAI* botAI) { return new RaidNaxxStrategy(botAI); } static Strategy* wotlk_os(PlayerbotAI* botAI) { return new RaidOsStrategy(botAI); } static Strategy* wotlk_eoe(PlayerbotAI* botAI) { return new RaidEoEStrategy(botAI); } diff --git a/src/strategy/raids/gruulslair/RaidGruulsLairActionContext.h b/src/strategy/raids/gruulslair/RaidGruulsLairActionContext.h new file mode 100644 index 0000000000..809fadf034 --- /dev/null +++ b/src/strategy/raids/gruulslair/RaidGruulsLairActionContext.h @@ -0,0 +1,49 @@ +#ifndef _PLAYERBOT_RAIDGRUULSLAIRACTIONCONTEXT_H +#define _PLAYERBOT_RAIDGRUULSLAIRACTIONCONTEXT_H + +#include "RaidGruulsLairActions.h" +#include "NamedObjectContext.h" + +class RaidGruulsLairActionContext : public NamedObjectContext +{ +public: + RaidGruulsLairActionContext() + { + // High King Maulgar + creators["high king maulgar main tank attack maulgar"] = &RaidGruulsLairActionContext::high_king_maulgar_main_tank_attack_maulgar; + creators["high king maulgar first assist tank attack olm"] = &RaidGruulsLairActionContext::high_king_maulgar_first_assist_tank_attack_olm; + creators["high king maulgar second assist tank attack blindeye"] = &RaidGruulsLairActionContext::high_king_maulgar_second_assist_tank_attack_blindeye; + creators["high king maulgar mage tank attack krosh"] = &RaidGruulsLairActionContext::high_king_maulgar_mage_tank_attack_krosh; + creators["high king maulgar moonkin tank attack kiggler"] = &RaidGruulsLairActionContext::high_king_maulgar_moonkin_tank_attack_kiggler; + creators["high king maulgar assign dps priority"] = &RaidGruulsLairActionContext::high_king_maulgar_assign_dps_priority; + creators["high king maulgar healer find safe position"] = &RaidGruulsLairActionContext::high_king_maulgar_healer_find_safe_position; + creators["high king maulgar run away from whirlwind"] = &RaidGruulsLairActionContext::high_king_maulgar_run_away_from_whirlwind; + creators["high king maulgar banish felstalker"] = &RaidGruulsLairActionContext::high_king_maulgar_banish_felstalker; + creators["high king maulgar misdirect olm and blindeye"] = &RaidGruulsLairActionContext::high_king_maulgar_misdirect_olm_and_blindeye; + + // Gruul the Dragonkiller + creators["gruul the dragonkiller main tank position boss"] = &RaidGruulsLairActionContext::gruul_the_dragonkiller_main_tank_position_boss; + creators["gruul the dragonkiller spread ranged"] = &RaidGruulsLairActionContext::gruul_the_dragonkiller_spread_ranged; + creators["gruul the dragonkiller shatter spread"] = &RaidGruulsLairActionContext::gruul_the_dragonkiller_shatter_spread; + } + +private: + // High King Maulgar + static Action* high_king_maulgar_main_tank_attack_maulgar(PlayerbotAI* botAI) { return new HighKingMaulgarMainTankAttackMaulgarAction(botAI); } + static Action* high_king_maulgar_first_assist_tank_attack_olm(PlayerbotAI* botAI) { return new HighKingMaulgarFirstAssistTankAttackOlmAction(botAI); } + static Action* high_king_maulgar_second_assist_tank_attack_blindeye(PlayerbotAI* botAI) { return new HighKingMaulgarSecondAssistTankAttackBlindeyeAction(botAI); } + static Action* high_king_maulgar_mage_tank_attack_krosh(PlayerbotAI* botAI) { return new HighKingMaulgarMageTankAttackKroshAction(botAI); } + static Action* high_king_maulgar_moonkin_tank_attack_kiggler(PlayerbotAI* botAI) { return new HighKingMaulgarMoonkinTankAttackKigglerAction(botAI); } + static Action* high_king_maulgar_assign_dps_priority(PlayerbotAI* botAI) { return new HighKingMaulgarAssignDPSPriorityAction(botAI); } + static Action* high_king_maulgar_healer_find_safe_position(PlayerbotAI* botAI) { return new HighKingMaulgarHealerFindSafePositionAction(botAI); } + static Action* high_king_maulgar_run_away_from_whirlwind(PlayerbotAI* botAI) { return new HighKingMaulgarRunAwayFromWhirlwindAction(botAI); } + static Action* high_king_maulgar_banish_felstalker(PlayerbotAI* botAI) { return new HighKingMaulgarBanishFelstalkerAction(botAI); } + static Action* high_king_maulgar_misdirect_olm_and_blindeye(PlayerbotAI* botAI) { return new HighKingMaulgarMisdirectOlmAndBlindeyeAction(botAI); } + + // Gruul the Dragonkiller + static Action* gruul_the_dragonkiller_main_tank_position_boss(PlayerbotAI* botAI) { return new GruulTheDragonkillerMainTankPositionBossAction(botAI); } + static Action* gruul_the_dragonkiller_spread_ranged(PlayerbotAI* botAI) { return new GruulTheDragonkillerSpreadRangedAction(botAI); } + static Action* gruul_the_dragonkiller_shatter_spread(PlayerbotAI* botAI) { return new GruulTheDragonkillerShatterSpreadAction(botAI); } +}; + +#endif diff --git a/src/strategy/raids/gruulslair/RaidGruulsLairActions.cpp b/src/strategy/raids/gruulslair/RaidGruulsLairActions.cpp new file mode 100644 index 0000000000..1a98135cac --- /dev/null +++ b/src/strategy/raids/gruulslair/RaidGruulsLairActions.cpp @@ -0,0 +1,696 @@ +#include "RaidGruulsLairActions.h" +#include "RaidGruulsLairHelpers.h" +#include "CreatureAI.h" +#include "Playerbots.h" +#include "Unit.h" + +using namespace GruulsLairHelpers; + +// High King Maulgar Actions + +// Main tank on Maulgar +bool HighKingMaulgarMainTankAttackMaulgarAction::Execute(Event event) +{ + Unit* maulgar = AI_VALUE2(Unit*, "find target", "high king maulgar"); + + MarkTargetWithSquare(bot, maulgar); + SetRtiTarget(botAI, "square", maulgar); + + if (bot->GetVictim() != maulgar) + return Attack(maulgar); + + if (maulgar->GetVictim() == bot) + { + const Location& tankPosition = GruulsLairLocations::MaulgarTankPosition; + const float maxDistance = 3.0f; + + float distanceToTankPosition = bot->GetExactDist2d(tankPosition.x, tankPosition.y); + + if (distanceToTankPosition > maxDistance) + { + float dX = tankPosition.x - bot->GetPositionX(); + float dY = tankPosition.y - bot->GetPositionY(); + float dist = sqrt(dX * dX + dY * dY); + float moveX = bot->GetPositionX() + (dX / dist) * maxDistance; + float moveY = bot->GetPositionY() + (dY / dist) * maxDistance; + return MoveTo(bot->GetMapId(), moveX, moveY, tankPosition.z, false, false, false, false, + MovementPriority::MOVEMENT_COMBAT, true, false); + } + + float orientation = atan2(maulgar->GetPositionY() - bot->GetPositionY(), + maulgar->GetPositionX() - bot->GetPositionX()); + bot->SetFacingTo(orientation); + } + else if (!bot->IsWithinMeleeRange(maulgar)) + { + return MoveTo(maulgar->GetMapId(), maulgar->GetPositionX(), maulgar->GetPositionY(), + maulgar->GetPositionZ(), false, false, false, false, + MovementPriority::MOVEMENT_COMBAT, true, false); + } + + return false; +} + +// First offtank on Olm +bool HighKingMaulgarFirstAssistTankAttackOlmAction::Execute(Event event) +{ + Unit* olm = AI_VALUE2(Unit*, "find target", "olm the summoner"); + + MarkTargetWithCircle(bot, olm); + SetRtiTarget(botAI, "circle", olm); + + if (bot->GetVictim() != olm) + return Attack(olm); + + if (olm->GetVictim() == bot) + { + const Location& tankPosition = GruulsLairLocations::OlmTankPosition; + const float maxDistance = 3.0f; + const float olmTankLeeway = 30.0f; + + float distanceOlmToTankPosition = olm->GetExactDist2d(tankPosition.x, tankPosition.y); + + if (distanceOlmToTankPosition > olmTankLeeway) + { + float dX = tankPosition.x - bot->GetPositionX(); + float dY = tankPosition.y - bot->GetPositionY(); + float dist = sqrt(dX * dX + dY * dY); + float moveX = bot->GetPositionX() + (dX / dist) * maxDistance; + float moveY = bot->GetPositionY() + (dY / dist) * maxDistance; + return MoveTo(bot->GetMapId(), moveX, moveY, tankPosition.z, false, false, false, false, + MovementPriority::MOVEMENT_COMBAT, true, false); + } + } + else if (!bot->IsWithinMeleeRange(olm)) + { + return MoveTo(olm->GetMapId(), olm->GetPositionX(), olm->GetPositionY(), + olm->GetPositionZ(), false, false, false, false, + MovementPriority::MOVEMENT_COMBAT, true, false); + } + + return false; +} + +// Second offtank on Blindeye +bool HighKingMaulgarSecondAssistTankAttackBlindeyeAction::Execute(Event event) +{ + Unit* blindeye = AI_VALUE2(Unit*, "find target", "blindeye the seer"); + + MarkTargetWithStar(bot, blindeye); + SetRtiTarget(botAI, "star", blindeye); + + if (bot->GetVictim() != blindeye) + return Attack(blindeye); + + if (blindeye->GetVictim() == bot) + { + const Location& tankPosition = GruulsLairLocations::BlindeyeTankPosition; + const float maxDistance = 3.0f; + + float distanceToTankPosition = bot->GetExactDist2d(tankPosition.x, tankPosition.y); + + if (distanceToTankPosition > maxDistance) + { + float dX = tankPosition.x - bot->GetPositionX(); + float dY = tankPosition.y - bot->GetPositionY(); + float dist = sqrt(dX * dX + dY * dY); + float moveX = bot->GetPositionX() + (dX / dist) * maxDistance; + float moveY = bot->GetPositionY() + (dY / dist) * maxDistance; + return MoveTo(bot->GetMapId(), moveX, moveY, tankPosition.z, false, false, false, false, + MovementPriority::MOVEMENT_COMBAT, true, false); + } + + float orientation = atan2(blindeye->GetPositionY() - bot->GetPositionY(), + blindeye->GetPositionX() - bot->GetPositionX()); + bot->SetFacingTo(orientation); + } + else if (!bot->IsWithinMeleeRange(blindeye)) + { + return MoveTo(blindeye->GetMapId(), blindeye->GetPositionX(), blindeye->GetPositionY(), + blindeye->GetPositionZ(), false, false, false, false, + MovementPriority::MOVEMENT_COMBAT, true, false); + } + + return false; +} + +// Mage with highest max HP on Krosh +bool HighKingMaulgarMageTankAttackKroshAction::Execute(Event event) +{ + Unit* krosh = AI_VALUE2(Unit*, "find target", "krosh firehand"); + + MarkTargetWithTriangle(bot, krosh); + SetRtiTarget(botAI, "triangle", krosh); + + if (krosh->HasAura(SPELL_SPELL_SHIELD) && botAI->CanCastSpell("spellsteal", krosh)) + return botAI->CastSpell("spellsteal", krosh); + + if (!bot->HasAura(SPELL_SPELL_SHIELD) && botAI->CanCastSpell("fire ward", bot)) + return botAI->CastSpell("fire ward", bot); + + if (bot->GetTarget() != krosh->GetGUID()) + { + bot->SetSelection(krosh->GetGUID()); + return true; + } + + if (krosh->GetVictim() == bot) + { + const Location& tankPosition = GruulsLairLocations::KroshTankPosition; + float distanceToKrosh = krosh->GetExactDist2d(tankPosition.x, tankPosition.y); + const float minDistance = 16.0f; + const float maxDistance = 29.0f; + const float tankPositionLeeway = 1.0f; + + if (distanceToKrosh > minDistance && distanceToKrosh < maxDistance) + { + if (!bot->IsWithinDist2d(tankPosition.x, tankPosition.y, tankPositionLeeway)) + { + return MoveTo(bot->GetMapId(), tankPosition.x, tankPosition.y, tankPosition.z, false, + false, false, false, MovementPriority::MOVEMENT_COMBAT, true, false); + } + + float orientation = atan2(krosh->GetPositionY() - bot->GetPositionY(), + krosh->GetPositionX() - bot->GetPositionX()); + bot->SetFacingTo(orientation); + } + else + { + Position safePos; + if (TryGetNewSafePosition(botAI, bot, safePos)) + { + return MoveTo(krosh->GetMapId(), safePos.m_positionX, safePos.m_positionY, safePos.m_positionZ, + false, false, false, false, MovementPriority::MOVEMENT_COMBAT, true, false); + } + } + } + + return false; +} + +// Moonkin with highest max HP on Kiggler +bool HighKingMaulgarMoonkinTankAttackKigglerAction::Execute(Event event) +{ + Unit* kiggler = AI_VALUE2(Unit*, "find target", "kiggler the crazed"); + + MarkTargetWithDiamond(bot, kiggler); + SetRtiTarget(botAI, "diamond", kiggler); + + if (bot->GetTarget() != kiggler->GetGUID()) + { + bot->SetSelection(kiggler->GetGUID()); + return true; + } + + Position safePos; + if (TryGetNewSafePosition(botAI, bot, safePos)) + { + return MoveTo(kiggler->GetMapId(), safePos.m_positionX, safePos.m_positionY, safePos.m_positionZ, + false, false, false, false, MovementPriority::MOVEMENT_COMBAT, true, false); + } + + return false; +} + +bool HighKingMaulgarAssignDPSPriorityAction::Execute(Event event) +{ + // Target priority 1: Blindeye + Unit* blindeye = AI_VALUE2(Unit*, "find target", "blindeye the seer"); + if (blindeye && blindeye->IsAlive()) + { + Position safePos; + if (TryGetNewSafePosition(botAI, bot, safePos)) + { + bot->AttackStop(); + bot->InterruptNonMeleeSpells(false); + return MoveTo(blindeye->GetMapId(), safePos.m_positionX, safePos.m_positionY, safePos.m_positionZ, + false, false, false, false, MovementPriority::MOVEMENT_COMBAT, true, false); + } + + SetRtiTarget(botAI, "star", blindeye); + + if (bot->GetTarget() != blindeye->GetGUID()) + { + bot->SetSelection(blindeye->GetGUID()); + return Attack(blindeye); + } + + return false; + } + + // Target priority 2: Olm + Unit* olm = AI_VALUE2(Unit*, "find target", "olm the summoner"); + if (olm && olm->IsAlive()) + { + Position safePos; + if (TryGetNewSafePosition(botAI, bot, safePos)) + { + bot->AttackStop(); + bot->InterruptNonMeleeSpells(false); + return MoveTo(olm->GetMapId(), safePos.m_positionX, safePos.m_positionY, safePos.m_positionZ, + false, false, false, false, MovementPriority::MOVEMENT_COMBAT, true, false); + } + + SetRtiTarget(botAI, "circle", olm); + + if (bot->GetTarget() != olm->GetGUID()) + { + bot->SetSelection(olm->GetGUID()); + return Attack(olm); + } + + return false; + } + + // Target priority 3a: Krosh (ranged only) + Unit* krosh = AI_VALUE2(Unit*, "find target", "krosh firehand"); + if (krosh && krosh->IsAlive() && botAI->IsRanged(bot)) + { + Position safePos; + if (TryGetNewSafePosition(botAI, bot, safePos)) + { + bot->AttackStop(); + bot->InterruptNonMeleeSpells(false); + return MoveTo(krosh->GetMapId(), safePos.m_positionX, safePos.m_positionY, safePos.m_positionZ, + false, false, false, false, MovementPriority::MOVEMENT_COMBAT, true, false); + } + + SetRtiTarget(botAI, "triangle", krosh); + + if (bot->GetTarget() != krosh->GetGUID()) + { + bot->SetSelection(krosh->GetGUID()); + return Attack(krosh); + } + + return false; + } + + // Target priority 3b: Kiggler + Unit* kiggler = AI_VALUE2(Unit*, "find target", "kiggler the crazed"); + if (kiggler && kiggler->IsAlive()) + { + Position safePos; + if (TryGetNewSafePosition(botAI, bot, safePos)) + { + bot->AttackStop(); + bot->InterruptNonMeleeSpells(false); + return MoveTo(kiggler->GetMapId(), safePos.m_positionX, safePos.m_positionY, safePos.m_positionZ, + false, false, false, false, MovementPriority::MOVEMENT_COMBAT, true, false); + } + + SetRtiTarget(botAI, "diamond", kiggler); + + if (bot->GetTarget() != kiggler->GetGUID()) + { + bot->SetSelection(kiggler->GetGUID()); + return Attack(kiggler); + } + + return false; + } + + // Target priority 4: Maulgar + Unit* maulgar = AI_VALUE2(Unit*, "find target", "high king maulgar"); + if (maulgar && maulgar->IsAlive()) + { + Position safePos; + if (TryGetNewSafePosition(botAI, bot, safePos)) + { + bot->AttackStop(); + bot->InterruptNonMeleeSpells(false); + return MoveTo(maulgar->GetMapId(), safePos.m_positionX, safePos.m_positionY, safePos.m_positionZ, + false, false, false, false, MovementPriority::MOVEMENT_COMBAT, true, false); + } + + SetRtiTarget(botAI, "square", maulgar); + + if (bot->GetTarget() != maulgar->GetGUID()) + { + bot->SetSelection(maulgar->GetGUID()); + return Attack(maulgar); + } + } + + return false; +} + +// Avoid Whirlwind and Blast Wave and generally try to stay near the center of the room +bool HighKingMaulgarHealerFindSafePositionAction::Execute(Event event) +{ + const Location& fightCenter = GruulsLairLocations::MaulgarRoomCenter; + const float maxDistanceFromFight = 50.0f; + float distToFight = bot->GetExactDist2d(fightCenter.x, fightCenter.y); + + if (distToFight > maxDistanceFromFight) + { + float angle = atan2(bot->GetPositionY() - fightCenter.y, bot->GetPositionX() - fightCenter.x); + float destX = fightCenter.x + 40.0f * cos(angle); + float destY = fightCenter.y + 40.0f * sin(angle); + float destZ = fightCenter.z; + + if (!bot->GetMap()->CheckCollisionAndGetValidCoords(bot, bot->GetPositionX(), bot->GetPositionY(), + bot->GetPositionZ(), destX, destY, destZ)) + return false; + + return MoveTo(bot->GetMapId(), destX, destY, destZ, false, false, false, false, + MovementPriority::MOVEMENT_COMBAT, true, false); + } + + Position safePos; + if (TryGetNewSafePosition(botAI, bot, safePos)) + { + bot->AttackStop(); + bot->InterruptNonMeleeSpells(false); + return MoveTo(bot->GetMapId(), safePos.m_positionX, safePos.m_positionY, safePos.m_positionZ, + false, false, false, false, MovementPriority::MOVEMENT_COMBAT, true, false); + } + + return false; +} + +// Run away from Maulgar during Whirlwind (logic for after all other ogres are dead) +bool HighKingMaulgarRunAwayFromWhirlwindAction::Execute(Event event) +{ + Unit* maulgar = AI_VALUE2(Unit*, "find target", "high king maulgar"); + + const float safeDistance = 10.0f; + float distance = bot->GetExactDist2d(maulgar); + + if (distance < safeDistance) + { + float angle = atan2(bot->GetPositionY() - maulgar->GetPositionY(), + bot->GetPositionX() - maulgar->GetPositionX()); + float destX = maulgar->GetPositionX() + safeDistance * cos(angle); + float destY = maulgar->GetPositionY() + safeDistance * sin(angle); + float destZ = bot->GetPositionZ(); + + if (!bot->GetMap()->CheckCollisionAndGetValidCoords(bot, bot->GetPositionX(), bot->GetPositionY(), + bot->GetPositionZ(), destX, destY, destZ)) + return false; + + float destDist = maulgar->GetExactDist2d(destX, destY); + + if (destDist >= safeDistance - 0.1f) + { + bot->AttackStop(); + bot->InterruptNonMeleeSpells(true); + return MoveTo(maulgar->GetMapId(), destX, destY, destZ, false, false, false, false, + MovementPriority::MOVEMENT_COMBAT, true, false); + } + } + + return false; +} + +bool HighKingMaulgarBanishFelstalkerAction::Execute(Event event) +{ + Group* group = bot->GetGroup(); + if (!group) + return false; + + const GuidVector& npcs = AI_VALUE(GuidVector, "nearest hostile npcs"); + std::vector felStalkers; + for (auto const& npc : npcs) + { + Unit* unit = botAI->GetUnit(npc); + if (unit && unit->GetEntry() == NPC_WILD_FEL_STALKER && unit->IsAlive()) + felStalkers.push_back(unit); + } + + std::vector warlocks; + for (GroupReference* ref = group->GetFirstMember(); ref; ref = ref->next()) + { + Player* member = ref->GetSource(); + if (member && member->IsAlive() && member->getClass() == CLASS_WARLOCK && GET_PLAYERBOT_AI(member)) + warlocks.push_back(member); + } + + int warlockIndex = -1; + for (size_t i = 0; i < warlocks.size(); ++i) + { + if (warlocks[i] == bot) + { + warlockIndex = static_cast(i); + break; + } + } + + if (warlockIndex >= 0 && warlockIndex < felStalkers.size()) + { + Unit* assignedFelStalker = felStalkers[warlockIndex]; + if (!assignedFelStalker->HasAura(SPELL_BANISH) && botAI->CanCastSpell(SPELL_BANISH, assignedFelStalker, true)) + return botAI->CastSpell("banish", assignedFelStalker); + } + + return false; +} + +// Hunter 1: Misdirect Olm to first offtank and have pet attack Blindeye +// Hunter 2: Misdirect Blindeye to second offtank +bool HighKingMaulgarMisdirectOlmAndBlindeyeAction::Execute(Event event) +{ + Group* group = bot->GetGroup(); + if (!group) + return false; + + std::vector hunters; + for (GroupReference* ref = group->GetFirstMember(); ref; ref = ref->next()) + { + Player* member = ref->GetSource(); + if (member && member->IsAlive() && member->getClass() == CLASS_HUNTER && GET_PLAYERBOT_AI(member)) + hunters.push_back(member); + } + + int hunterIndex = -1; + for (size_t i = 0; i < hunters.size(); ++i) + { + if (hunters[i] == bot) + { + hunterIndex = static_cast(i); + break; + } + } + + Unit* olm = AI_VALUE2(Unit*, "find target", "olm the summoner"); + Unit* blindeye = AI_VALUE2(Unit*, "find target", "blindeye the seer"); + Player* olmTank = nullptr; + Player* blindeyeTank = nullptr; + + for (GroupReference* ref = group->GetFirstMember(); ref; ref = ref->next()) + { + Player* member = ref->GetSource(); + if (!member || !member->IsAlive()) + continue; + else if (botAI->IsAssistTankOfIndex(member, 0)) olmTank = member; + else if (botAI->IsAssistTankOfIndex(member, 1)) blindeyeTank = member; + } + + switch (hunterIndex) + { + case 0: + botAI->CastSpell("misdirection", olmTank); + if (bot->HasAura(SPELL_MISDIRECTION)) + { + Pet* pet = bot->GetPet(); + if (pet && pet->IsAlive() && pet->GetVictim() != blindeye) + { + pet->ClearUnitState(UNIT_STATE_FOLLOW); + pet->AttackStop(); + pet->SetTarget(blindeye->GetGUID()); + if (pet->GetCharmInfo()) + { + pet->GetCharmInfo()->SetIsCommandAttack(true); + pet->GetCharmInfo()->SetIsAtStay(false); + pet->GetCharmInfo()->SetIsFollowing(false); + pet->GetCharmInfo()->SetIsCommandFollow(false); + pet->GetCharmInfo()->SetIsReturning(false); + } + pet->ToCreature()->AI()->AttackStart(blindeye); + } + return botAI->CastSpell("steady shot", olm); + } + break; + + case 1: + botAI->CastSpell("misdirection", blindeyeTank); + if (bot->HasAura(SPELL_MISDIRECTION)) + return botAI->CastSpell("steady shot", blindeye); + break; + + default: + break; + } + + return false; +} + +// Gruul the Dragonkiller Actions + +// Position in center of the room +bool GruulTheDragonkillerMainTankPositionBossAction::Execute(Event event) +{ + Unit* gruul = AI_VALUE2(Unit*, "find target", "gruul the dragonkiller"); + + if (bot->GetVictim() != gruul) + return Attack(gruul); + + if (gruul->GetVictim() == bot) + { + const Location& tankPosition = GruulsLairLocations::GruulTankPosition; + const float maxDistance = 3.0f; + + float dX = tankPosition.x - bot->GetPositionX(); + float dY = tankPosition.y - bot->GetPositionY(); + float distanceToTankPosition = bot->GetExactDist2d(tankPosition.x, tankPosition.y); + + if (distanceToTankPosition > maxDistance) + { + float step = std::min(maxDistance, distanceToTankPosition); + float moveX = bot->GetPositionX() + (dX / distanceToTankPosition) * maxDistance; + float moveY = bot->GetPositionY() + (dY / distanceToTankPosition) * maxDistance; + const float moveZ = tankPosition.z; + return MoveTo(bot->GetMapId(), moveX, moveY, moveZ, false, false, false, false, + MovementPriority::MOVEMENT_COMBAT, true, false); + } + + float orientation = atan2(gruul->GetPositionY() - bot->GetPositionY(), + gruul->GetPositionX() - bot->GetPositionX()); + bot->SetFacingTo(orientation); + } + else if (!bot->IsWithinMeleeRange(gruul)) + { + return MoveTo(gruul->GetMapId(), gruul->GetPositionX(), gruul->GetPositionY(), gruul->GetPositionZ(), + false, false, false, false, MovementPriority::MOVEMENT_COMBAT, true, false); + } + + return false; +} + +// Ranged will take initial positions around the middle of the room, 25-40 yards from center +// Ranged should spread out 10 yards from each other +bool GruulTheDragonkillerSpreadRangedAction::Execute(Event event) +{ + Group* group = bot->GetGroup(); + if (!group) + return false; + + static std::unordered_map initialPositions; + static std::unordered_map hasReachedInitialPosition; + + Unit* gruul = AI_VALUE2(Unit*, "find target", "gruul the dragonkiller"); + if (gruul && gruul->IsAlive() && gruul->GetHealth() == gruul->GetMaxHealth()) + { + initialPositions.clear(); + hasReachedInitialPosition.clear(); + } + + const Location& tankPosition = GruulsLairLocations::GruulTankPosition; + const float centerX = tankPosition.x; + const float centerY = tankPosition.y; + float centerZ = bot->GetPositionZ(); + const float minRadius = 25.0f; + const float maxRadius = 40.0f; + + std::vector members; + Player* closestMember = nullptr; + float closestDist = std::numeric_limits::max(); + for (GroupReference* ref = group->GetFirstMember(); ref; ref = ref->next()) + { + Player* member = ref->GetSource(); + if (!member || !member->IsAlive()) + continue; + + members.push_back(member); + if (member != bot) + { + float dist = bot->GetExactDist2d(member); + if (dist < closestDist) + { + closestDist = dist; + closestMember = member; + } + } + } + + if (!initialPositions.count(bot->GetGUID())) + { + auto it = std::find(members.begin(), members.end(), bot); + uint8 botIndex = (it != members.end()) ? std::distance(members.begin(), it) : 0; + uint8 count = members.size(); + + float angle = 2 * M_PI * botIndex / count; + float radius = minRadius + static_cast(rand()) / + static_cast(RAND_MAX) * (maxRadius - minRadius); + float targetX = centerX + radius * cos(angle); + float targetY = centerY + radius * sin(angle); + + initialPositions[bot->GetGUID()] = Position(targetX, targetY, centerZ); + hasReachedInitialPosition[bot->GetGUID()] = false; + } + + Position targetPosition = initialPositions[bot->GetGUID()]; + if (!hasReachedInitialPosition[bot->GetGUID()]) + { + if (!bot->IsWithinDist2d(targetPosition.GetPositionX(), targetPosition.GetPositionY(), 2.0f)) + { + float destX = targetPosition.GetPositionX(); + float destY = targetPosition.GetPositionY(); + float destZ = targetPosition.GetPositionZ(); + + if (!bot->GetMap()->CheckCollisionAndGetValidCoords(bot, bot->GetPositionX(), + bot->GetPositionY(), bot->GetPositionZ(), destX, destY, destZ)) + return false; + + return MoveTo(bot->GetMapId(), destX, destY, destZ, false, false, false, false, + MovementPriority::MOVEMENT_COMBAT, true, false); + } + + hasReachedInitialPosition[bot->GetGUID()] = true; + } + + const float minSpreadDistance = 10.0f; + const float movementThreshold = 2.0f; + + if (closestMember && closestDist < minSpreadDistance - movementThreshold) + { + return FleePosition(Position(closestMember->GetPositionX(), closestMember->GetPositionY(), + closestMember->GetPositionZ()), minSpreadDistance, 0); + } + + return false; +} + +// Try to get away from other group members when Ground Slam is cast +bool GruulTheDragonkillerShatterSpreadAction::Execute(Event event) +{ + Group* group = bot->GetGroup(); + if (!group) + return false; + + GuidVector members = AI_VALUE(GuidVector, "group members"); + Unit* closestMember = nullptr; + float closestDist = std::numeric_limits::max(); + + for (auto& member : members) + { + Unit* unit = botAI->GetUnit(member); + if (!unit || bot->GetGUID() == member) + continue; + + const float dist = bot->GetExactDist2d(unit); + if (dist < closestDist) + { + closestDist = dist; + closestMember = unit; + } + } + + if (closestMember) + { + return FleePosition(Position(closestMember->GetPositionX(), closestMember->GetPositionY(), + closestMember->GetPositionZ()), 6.0f, 0); + } + + return false; +} diff --git a/src/strategy/raids/gruulslair/RaidGruulsLairActions.h b/src/strategy/raids/gruulslair/RaidGruulsLairActions.h new file mode 100644 index 0000000000..6faf7ed3ec --- /dev/null +++ b/src/strategy/raids/gruulslair/RaidGruulsLairActions.h @@ -0,0 +1,112 @@ +#ifndef _PLAYERBOT_RAIDGRUULSLAIRACTIONS_H +#define _PLAYERBOT_RAIDGRUULSLAIRACTIONS_H + +#include "Action.h" +#include "AttackAction.h" +#include "MovementActions.h" + +class HighKingMaulgarMainTankAttackMaulgarAction : public AttackAction +{ +public: + HighKingMaulgarMainTankAttackMaulgarAction(PlayerbotAI* botAI, std::string const name = "high king maulgar main tank attack maulgar") : AttackAction(botAI, name) {}; + + bool Execute(Event event) override; +}; + +class HighKingMaulgarFirstAssistTankAttackOlmAction : public AttackAction +{ +public: + HighKingMaulgarFirstAssistTankAttackOlmAction(PlayerbotAI* botAI, std::string const name = "high king maulgar first assist tank attack olm") : AttackAction(botAI, name) {}; + + bool Execute(Event event) override; +}; + +class HighKingMaulgarSecondAssistTankAttackBlindeyeAction : public AttackAction +{ +public: + HighKingMaulgarSecondAssistTankAttackBlindeyeAction(PlayerbotAI* botAI, std::string const name = "high king maulgar second assist tank attack blindeye") : AttackAction(botAI, name) {}; + + bool Execute(Event event) override; +}; + +class HighKingMaulgarMageTankAttackKroshAction : public AttackAction +{ +public: + HighKingMaulgarMageTankAttackKroshAction(PlayerbotAI* botAI, std::string const name = "high king maulgar mage tank attack krosh") : AttackAction(botAI, name) {}; + + bool Execute(Event event) override; +}; + +class HighKingMaulgarMoonkinTankAttackKigglerAction : public AttackAction +{ +public: + HighKingMaulgarMoonkinTankAttackKigglerAction(PlayerbotAI* botAI, std::string const name = "high king maulgar moonkin tank attack kiggler") : AttackAction(botAI, name) {}; + + bool Execute(Event event) override; +}; + +class HighKingMaulgarAssignDPSPriorityAction : public AttackAction +{ +public: + HighKingMaulgarAssignDPSPriorityAction(PlayerbotAI* botAI, std::string const name = "high king maulgar assign dps priority") : AttackAction(botAI, name) {}; + + bool Execute(Event event) override; +}; + +class HighKingMaulgarHealerFindSafePositionAction : public MovementAction +{ +public: + HighKingMaulgarHealerFindSafePositionAction(PlayerbotAI* botAI, std::string const name = "high king maulgar healer find safe position") : MovementAction(botAI, name) {}; + + bool Execute(Event event) override; +}; + +class HighKingMaulgarRunAwayFromWhirlwindAction : public MovementAction +{ +public: + HighKingMaulgarRunAwayFromWhirlwindAction(PlayerbotAI* botAI, std::string const name = "high king maulgar run away from whirlwind") : MovementAction(botAI, name) {}; + + bool Execute(Event event) override; +}; + +class HighKingMaulgarBanishFelstalkerAction : public AttackAction +{ +public: + HighKingMaulgarBanishFelstalkerAction(PlayerbotAI* botAI, std::string const name = "high king maulgar banish felstalker") : AttackAction(botAI, name) {}; + + bool Execute(Event event) override; +}; + +class HighKingMaulgarMisdirectOlmAndBlindeyeAction : public AttackAction +{ +public: + HighKingMaulgarMisdirectOlmAndBlindeyeAction(PlayerbotAI* botAI, std::string const name = "high king maulgar misdirect olm and blindeye") : AttackAction(botAI, name) {}; + + bool Execute(Event event) override; +}; + +class GruulTheDragonkillerMainTankPositionBossAction : public AttackAction +{ +public: + GruulTheDragonkillerMainTankPositionBossAction(PlayerbotAI* botAI, std::string const name = "gruul the dragonkiller main tank position boss") : AttackAction(botAI, name) {}; + + bool Execute(Event event) override; +}; + +class GruulTheDragonkillerSpreadRangedAction : public MovementAction +{ +public: + GruulTheDragonkillerSpreadRangedAction(PlayerbotAI* botAI, std::string const name = "gruul the dragonkiller spread ranged") : MovementAction(botAI, name) {}; + + bool Execute(Event event) override; +}; + +class GruulTheDragonkillerShatterSpreadAction : public MovementAction +{ +public: + GruulTheDragonkillerShatterSpreadAction(PlayerbotAI* botAI, std::string const name = "gruul the dragonkiller shatter spread") : MovementAction(botAI, name) {}; + + bool Execute(Event event) override; +}; + +#endif diff --git a/src/strategy/raids/gruulslair/RaidGruulsLairHelpers.cpp b/src/strategy/raids/gruulslair/RaidGruulsLairHelpers.cpp new file mode 100644 index 0000000000..0c8a23a19c --- /dev/null +++ b/src/strategy/raids/gruulslair/RaidGruulsLairHelpers.cpp @@ -0,0 +1,241 @@ +#include "RaidGruulsLairHelpers.h" +#include "AiFactory.h" +#include "GroupReference.h" +#include "Playerbots.h" +#include "Unit.h" + +namespace GruulsLairHelpers +{ + namespace GruulsLairLocations + { + // Olm does not chase properly due to the Core's caster movement issues + // Thus, the below "OlmTankPosition" is beyond the actual desired tanking location + // It is the spot to which the OlmTank runs to to pull Olm to a decent tanking location + // "MaulgarRoomCenter" is to keep healers in a centralized location + const Location MaulgarTankPosition = { 90.686f, 167.047f, -13.234f }; + const Location OlmTankPosition = { 87.485f, 234.942f, -3.635f }; + const Location BlindeyeTankPosition = { 99.681f, 213.989f, -10.345f }; + const Location KroshTankPosition = { 116.880f, 166.208f, -14.231f }; + const Location MaulgarRoomCenter = { 88.754f, 150.759f, -11.569f }; + const Location GruulTankPosition = { 241.238f, 365.025f, -4.220f }; + } + + bool IsAnyOgreBossAlive(PlayerbotAI* botAI) + { + const char* ogreBossNames[] = + { + "high king maulgar", + "kiggler the crazed", + "krosh firehand", + "olm the summoner", + "blindeye the seer" + }; + + for (const char* name : ogreBossNames) + { + Unit* boss = botAI->GetAiObjectContext()->GetValue("find target", name)->Get(); + if (!boss || !boss->IsAlive()) + continue; + return true; + } + + return false; + } + + void MarkTargetWithIcon(Player* bot, Unit* target, uint8 iconId) + { + Group* group = bot->GetGroup(); + if (!target || !group) + return; + + ObjectGuid currentGuid = group->GetTargetIcon(iconId); + if (currentGuid != target->GetGUID()) + { + group->SetTargetIcon(iconId, bot->GetGUID(), target->GetGUID()); + } + } + + void MarkTargetWithSquare(Player* bot, Unit* target) + { + MarkTargetWithIcon(bot, target, RtiTargetValue::squareIndex); + } + + void MarkTargetWithStar(Player* bot, Unit* target) + { + MarkTargetWithIcon(bot, target, RtiTargetValue::starIndex); + } + + void MarkTargetWithCircle(Player* bot, Unit* target) + { + MarkTargetWithIcon(bot, target, RtiTargetValue::circleIndex); + } + + void MarkTargetWithDiamond(Player* bot, Unit* target) + { + MarkTargetWithIcon(bot, target, RtiTargetValue::diamondIndex); + } + + void MarkTargetWithTriangle(Player* bot, Unit* target) + { + MarkTargetWithIcon(bot, target, RtiTargetValue::triangleIndex); + } + + void SetRtiTarget(PlayerbotAI* botAI, const std::string& rtiName, Unit* target) + { + if (!target) + return; + + std::string currentRti = botAI->GetAiObjectContext()->GetValue("rti")->Get(); + Unit* currentTarget = botAI->GetAiObjectContext()->GetValue("rti target")->Get(); + + if (currentRti != rtiName || currentTarget != target) + { + botAI->GetAiObjectContext()->GetValue("rti")->Set(rtiName); + botAI->GetAiObjectContext()->GetValue("rti target")->Set(target); + } + } + + bool IsKroshMageTank(PlayerbotAI* botAI, Player* bot) + { + Group* group = bot->GetGroup(); + if (!group) + return false; + + Player* highestHpMage = nullptr; + uint32 highestHp = 0; + for (GroupReference* ref = group->GetFirstMember(); ref; ref = ref->next()) + { + Player* member = ref->GetSource(); + if (!member || !member->IsAlive() || !GET_PLAYERBOT_AI(member)) + continue; + + if (member->getClass() == CLASS_MAGE) + { + uint32 hp = member->GetMaxHealth(); + if (!highestHpMage || hp > highestHp) + { + highestHpMage = member; + highestHp = hp; + } + } + } + + return highestHpMage == bot; + } + + bool IsKigglerMoonkinTank(PlayerbotAI* botAI, Player* bot) + { + Group* group = bot->GetGroup(); + if (!group) + return false; + + Player* highestHpMoonkin = nullptr; + uint32 highestHp = 0; + + for (GroupReference* ref = group->GetFirstMember(); ref; ref = ref->next()) + { + Player* member = ref->GetSource(); + if (!member || !member->IsAlive() || !GET_PLAYERBOT_AI(member)) + continue; + + if (member->getClass() == CLASS_DRUID) + { + int tab = AiFactory::GetPlayerSpecTab(member); + if (tab == DRUID_TAB_BALANCE) + { + uint32 hp = member->GetMaxHealth(); + if (!highestHpMoonkin || hp > highestHp) + { + highestHpMoonkin = member; + highestHp = hp; + } + } + } + } + + return highestHpMoonkin == bot; + } + + bool IsPositionSafe(PlayerbotAI* botAI, Player* bot, Position pos) + { + const float KROSH_SAFE_DISTANCE = 20.0f; + const float MAULGAR_SAFE_DISTANCE = 10.0f; + bool isSafe = true; + + Unit* krosh = botAI->GetAiObjectContext()->GetValue("find target", "krosh firehand")->Get(); + if (krosh && krosh->IsAlive()) + { + float dist = sqrt(pow(pos.GetPositionX() - krosh->GetPositionX(), 2) + pow(pos.GetPositionY() - krosh->GetPositionY(), 2)); + if (dist < KROSH_SAFE_DISTANCE) + isSafe = false; + } + + Unit* maulgar = botAI->GetAiObjectContext()->GetValue("find target", "high king maulgar")->Get(); + if (botAI->IsRanged(bot) && maulgar && maulgar->IsAlive()) + { + float dist = sqrt(pow(pos.GetPositionX() - maulgar->GetPositionX(), 2) + pow(pos.GetPositionY() - maulgar->GetPositionY(), 2)); + if (dist < MAULGAR_SAFE_DISTANCE) + isSafe = false; + } + + return isSafe; + } + + bool TryGetNewSafePosition(PlayerbotAI* botAI, Player* bot, Position& outPos) + { + const float SEARCH_RADIUS = 30.0f; + const uint8 NUM_POSITIONS = 32; + + outPos = { bot->GetPositionX(), bot->GetPositionY(), bot->GetPositionZ() }; + if (IsPositionSafe(botAI, bot, outPos)) + { + outPos = Position(); + return false; + } + + float bestScore = std::numeric_limits::max(); + bool foundSafeSpot = false; + Position bestPos; + + for (int i = 0; i < NUM_POSITIONS; ++i) + { + float angle = 2 * M_PI * i / NUM_POSITIONS; + Position candidatePos; + candidatePos.m_positionX = bot->GetPositionX() + SEARCH_RADIUS * cos(angle); + candidatePos.m_positionY = bot->GetPositionY() + SEARCH_RADIUS * sin(angle); + candidatePos.m_positionZ = bot->GetPositionZ(); + + float destX = candidatePos.m_positionX, destY = candidatePos.m_positionY, destZ = candidatePos.m_positionZ; + if (!bot->GetMap()->CheckCollisionAndGetValidCoords(bot, bot->GetPositionX(), bot->GetPositionY(), + bot->GetPositionZ(), destX, destY, destZ, true)) + continue; + + if (destX != candidatePos.m_positionX || destY != candidatePos.m_positionY) + continue; + + candidatePos.m_positionX = destX; + candidatePos.m_positionY = destY; + candidatePos.m_positionZ = destZ; + + if (IsPositionSafe(botAI, bot, candidatePos)) + { + float movementDistance = sqrt(pow(destX - bot->GetPositionX(), 2) + pow(destY - bot->GetPositionY(), 2)); + if (movementDistance < bestScore) + { + bestScore = movementDistance; + bestPos = candidatePos; + foundSafeSpot = true; + } + } + } + + if (foundSafeSpot) + { + outPos = bestPos; + return true; + } + + outPos = Position(); + return false; + } +} diff --git a/src/strategy/raids/gruulslair/RaidGruulsLairHelpers.h b/src/strategy/raids/gruulslair/RaidGruulsLairHelpers.h new file mode 100644 index 0000000000..aa5a83acb0 --- /dev/null +++ b/src/strategy/raids/gruulslair/RaidGruulsLairHelpers.h @@ -0,0 +1,62 @@ +#ifndef RAID_GRUULSLAIRHELPERS_H +#define RAID_GRUULSLAIRHELPERS_H + +#include "PlayerbotAI.h" +#include "RtiTargetValue.h" + +namespace GruulsLairHelpers +{ + enum GruulsLairSpells + { + // High King Maulgar + SPELL_WHIRLWIND = 33238, + + // Krosh Firehand + SPELL_SPELL_SHIELD = 33054, + + // Hunter + SPELL_MISDIRECTION = 34477, + + // Warlock + SPELL_BANISH = 18647, // Rank 2 + + // Gruul the Dragonkiller + SPELL_GROUND_SLAM_1 = 33525, + SPELL_GROUND_SLAM_2 = 39187, + }; + + enum GruulsLairNPCs + { + NPC_WILD_FEL_STALKER = 18847, + }; + + bool IsAnyOgreBossAlive(PlayerbotAI* botAI); + void MarkTargetWithIcon(Player* bot, Unit* target, uint8 iconId); + void MarkTargetWithSquare(Player* bot, Unit* target); + void MarkTargetWithStar(Player* bot, Unit* target); + void MarkTargetWithCircle(Player* bot, Unit* target); + void MarkTargetWithDiamond(Player* bot, Unit* target); + void MarkTargetWithTriangle(Player* bot, Unit* target); + void SetRtiTarget(PlayerbotAI* botAI, const std::string& rtiName, Unit* target); + bool IsKroshMageTank(PlayerbotAI* botAI, Player* bot); + bool IsKigglerMoonkinTank(PlayerbotAI* botAI, Player* bot); + bool IsPositionSafe(PlayerbotAI* botAI, Player* bot, Position pos); + bool TryGetNewSafePosition(PlayerbotAI* botAI, Player* bot, Position& outPos); + + struct Location + { + float x, y, z; + }; + + namespace GruulsLairLocations + { + extern const Location MaulgarTankPosition; + extern const Location OlmTankPosition; + extern const Location BlindeyeTankPosition; + extern const Location KroshTankPosition; + extern const Location MaulgarRoomCenter; + extern const Location GruulTankPosition; + } +} + +#endif diff --git a/src/strategy/raids/gruulslair/RaidGruulsLairMultipliers.cpp b/src/strategy/raids/gruulslair/RaidGruulsLairMultipliers.cpp new file mode 100644 index 0000000000..5ca2de9327 --- /dev/null +++ b/src/strategy/raids/gruulslair/RaidGruulsLairMultipliers.cpp @@ -0,0 +1,110 @@ +#include "RaidGruulsLairMultipliers.h" +#include "RaidGruulsLairActions.h" +#include "RaidGruulsLairHelpers.h" +#include "ChooseTargetActions.h" +#include "DruidBearActions.h" +#include "DruidCatActions.h" +#include "GenericSpellActions.h" +#include "HunterActions.h" +#include "MageActions.h" +#include "Playerbots.h" +#include "WarriorActions.h" + +using namespace GruulsLairHelpers; + +static bool IsChargeAction(Action* action) +{ + return dynamic_cast(action) || + dynamic_cast(action) || + dynamic_cast(action) || + dynamic_cast(action); +} + +float HighKingMaulgarDisableTankAssistMultiplier::GetValue(Action* action) +{ + if (IsAnyOgreBossAlive(botAI) && dynamic_cast(action)) + return 0.0f; + + return 1.0f; +} + +// Don't run back in during Whirlwind +float HighKingMaulgarAvoidWhirlwindMultiplier::GetValue(Action* action) +{ + Unit* maulgar = AI_VALUE2(Unit*, "find target", "high king maulgar"); + Unit* kiggler = AI_VALUE2(Unit*, "find target", "kiggler the crazed"); + Unit* krosh = AI_VALUE2(Unit*, "find target", "krosh firehand"); + Unit* olm = AI_VALUE2(Unit*, "find target", "olm the summoner"); + Unit* blindeye = AI_VALUE2(Unit*, "find target", "blindeye the seer"); + + if (maulgar && maulgar->HasAura(SPELL_WHIRLWIND) && + (!kiggler || !kiggler->IsAlive()) && + (!krosh || !krosh->IsAlive()) && + (!olm || !olm->IsAlive()) && + (!blindeye || !blindeye->IsAlive())) + { + if (IsChargeAction(action) || (dynamic_cast(action) && + !dynamic_cast(action))) + return 0.0f; + } + + return 1.0f; +} + +// Arcane Shot will remove Spell Shield, which the mage tank needs to survive +float HighKingMaulgarDisableArcaneShotOnKroshMultiplier::GetValue(Action* action) +{ + Unit* krosh = AI_VALUE2(Unit*, "find target", "krosh firehand"); + Unit* target = AI_VALUE(Unit*, "current target"); + + if (krosh && target && target->GetGUID() == krosh->GetGUID() && dynamic_cast(action)) + return 0.0f; + + return 1.0f; +} + +float HighKingMaulgarDisableMageTankAOEMultiplier::GetValue(Action* action) +{ + if (IsKroshMageTank(botAI, bot) && + (dynamic_cast(action) || dynamic_cast(action) || + dynamic_cast(action) || dynamic_cast(action) || + dynamic_cast(action) || dynamic_cast(action))) + return 0.0f; + + return 1.0f; +} + +float GruulTheDragonkillerMainTankMovementMultiplier::GetValue(Action* action) +{ + Unit* gruul = AI_VALUE2(Unit*, "find target", "gruul the dragonkiller"); + if (!gruul) + return 1.0f; + + if (botAI->IsMainTank(bot)) + { + if (gruul->GetVictim() == bot && dynamic_cast(action)) + return 0.0f; + + if (dynamic_cast(action)) + return 0.0f; + } + + return 1.0f; +} + +float GruulTheDragonkillerGroundSlamMultiplier::GetValue(Action* action) +{ + Unit* gruul = AI_VALUE2(Unit*, "find target", "gruul the dragonkiller"); + if (!gruul) + return 1.0f; + + if (bot->HasAura(SPELL_GROUND_SLAM_1) || + bot->HasAura(SPELL_GROUND_SLAM_2)) + { + if ((dynamic_cast(action) && !dynamic_cast(action)) || + IsChargeAction(action)) + return 0.0f; + } + + return 1.0f; +} diff --git a/src/strategy/raids/gruulslair/RaidGruulsLairMultipliers.h b/src/strategy/raids/gruulslair/RaidGruulsLairMultipliers.h new file mode 100644 index 0000000000..d67e8523e7 --- /dev/null +++ b/src/strategy/raids/gruulslair/RaidGruulsLairMultipliers.h @@ -0,0 +1,48 @@ +#ifndef _PLAYERBOT_RAIDGRUULSLAIRMULTIPLIERS_H +#define _PLAYERBOT_RAIDGRUULSLAIRMULTIPLIERS_H + +#include "Multiplier.h" + +class HighKingMaulgarDisableTankAssistMultiplier : public Multiplier +{ +public: + HighKingMaulgarDisableTankAssistMultiplier(PlayerbotAI* botAI) : Multiplier(botAI, "high king maulgar disable tank assist multiplier") {} + float GetValue(Action* action) override; +}; + +class HighKingMaulgarAvoidWhirlwindMultiplier : public Multiplier +{ +public: + HighKingMaulgarAvoidWhirlwindMultiplier(PlayerbotAI* botAI) : Multiplier(botAI, "high king maulgar avoid whirlwind multiplier") {} + float GetValue(Action* action) override; +}; + +class HighKingMaulgarDisableArcaneShotOnKroshMultiplier : public Multiplier +{ +public: + HighKingMaulgarDisableArcaneShotOnKroshMultiplier(PlayerbotAI* botAI) : Multiplier(botAI, "high king maulgar disable arcane shot on krosh multiplier") {} + float GetValue(Action* action) override; +}; + +class HighKingMaulgarDisableMageTankAOEMultiplier : public Multiplier +{ +public: + HighKingMaulgarDisableMageTankAOEMultiplier(PlayerbotAI* botAI) : Multiplier(botAI, "high king maulgar disable mage tank aoe multiplier") {} + float GetValue(Action* action) override; +}; + +class GruulTheDragonkillerMainTankMovementMultiplier : public Multiplier +{ +public: + GruulTheDragonkillerMainTankMovementMultiplier(PlayerbotAI* botAI) : Multiplier(botAI, "gruul the dragonkiller main tank movement multiplier") {} + float GetValue(Action* action) override; +}; + +class GruulTheDragonkillerGroundSlamMultiplier : public Multiplier +{ +public: + GruulTheDragonkillerGroundSlamMultiplier(PlayerbotAI* botAI) : Multiplier(botAI, "gruul the dragonkiller ground slam multiplier") {} + float GetValue(Action* action) override; +}; + +#endif diff --git a/src/strategy/raids/gruulslair/RaidGruulsLairStrategy.cpp b/src/strategy/raids/gruulslair/RaidGruulsLairStrategy.cpp new file mode 100644 index 0000000000..bd7c9cd970 --- /dev/null +++ b/src/strategy/raids/gruulslair/RaidGruulsLairStrategy.cpp @@ -0,0 +1,56 @@ +#include "RaidGruulsLairStrategy.h" +#include "RaidGruulsLairMultipliers.h" + +void RaidGruulsLairStrategy::InitTriggers(std::vector& triggers) +{ + // High King Maulgar + triggers.push_back(new TriggerNode("high king maulgar is main tank", NextAction::array(0, + new NextAction("high king maulgar main tank attack maulgar", ACTION_RAID + 1), nullptr))); + + triggers.push_back(new TriggerNode("high king maulgar is first assist tank", NextAction::array(0, + new NextAction("high king maulgar first assist tank attack olm", ACTION_RAID + 1), nullptr))); + + triggers.push_back(new TriggerNode("high king maulgar is second assist tank", NextAction::array(0, + new NextAction("high king maulgar second assist tank attack blindeye", ACTION_RAID + 1), nullptr))); + + triggers.push_back(new TriggerNode("high king maulgar is mage tank", NextAction::array(0, + new NextAction("high king maulgar mage tank attack krosh", ACTION_RAID + 1), nullptr))); + + triggers.push_back(new TriggerNode("high king maulgar is moonkin tank", NextAction::array(0, + new NextAction("high king maulgar moonkin tank attack kiggler", ACTION_RAID + 1), nullptr))); + + triggers.push_back(new TriggerNode("high king maulgar determining kill order", NextAction::array(0, + new NextAction("high king maulgar assign dps priority", ACTION_RAID + 1), nullptr))); + + triggers.push_back(new TriggerNode("high king maulgar healer in danger", NextAction::array(0, + new NextAction("high king maulgar healer find safe position", ACTION_RAID + 1), nullptr))); + + triggers.push_back(new TriggerNode("high king maulgar boss channeling whirlwind", NextAction::array(0, + new NextAction("high king maulgar run away from whirlwind", ACTION_EMERGENCY + 6), nullptr))); + + triggers.push_back(new TriggerNode("high king maulgar wild felstalker spawned", NextAction::array(0, + new NextAction("high king maulgar banish felstalker", ACTION_RAID + 2), nullptr))); + + triggers.push_back(new TriggerNode("high king maulgar pulling olm and blindeye", NextAction::array(0, + new NextAction("high king maulgar misdirect olm and blindeye", ACTION_RAID + 2), nullptr))); + + // Gruul the Dragonkiller + triggers.push_back(new TriggerNode("gruul the dragonkiller boss engaged by main tank", NextAction::array(0, + new NextAction("gruul the dragonkiller main tank position boss", ACTION_RAID + 1), nullptr))); + + triggers.push_back(new TriggerNode("gruul the dragonkiller boss engaged by range", NextAction::array(0, + new NextAction("gruul the dragonkiller spread ranged", ACTION_RAID + 1), nullptr))); + + triggers.push_back(new TriggerNode("gruul the dragonkiller incoming shatter", NextAction::array(0, + new NextAction("gruul the dragonkiller shatter spread", ACTION_EMERGENCY + 6), nullptr))); +} + +void RaidGruulsLairStrategy::InitMultipliers(std::vector& multipliers) +{ + multipliers.push_back(new HighKingMaulgarDisableTankAssistMultiplier(botAI)); + multipliers.push_back(new HighKingMaulgarAvoidWhirlwindMultiplier(botAI)); + multipliers.push_back(new HighKingMaulgarDisableArcaneShotOnKroshMultiplier(botAI)); + multipliers.push_back(new HighKingMaulgarDisableMageTankAOEMultiplier(botAI)); + multipliers.push_back(new GruulTheDragonkillerMainTankMovementMultiplier(botAI)); + multipliers.push_back(new GruulTheDragonkillerGroundSlamMultiplier(botAI)); +} diff --git a/src/strategy/raids/gruulslair/RaidGruulsLairStrategy.h b/src/strategy/raids/gruulslair/RaidGruulsLairStrategy.h new file mode 100644 index 0000000000..ba6f33f076 --- /dev/null +++ b/src/strategy/raids/gruulslair/RaidGruulsLairStrategy.h @@ -0,0 +1,18 @@ +#ifndef _PLAYERBOT_RAIDGRUULSLAIRSTRATEGY_H +#define _PLAYERBOT_RAIDGRUULSLAIRSTRATEGY_H + +#include "Strategy.h" +#include "Multiplier.h" + +class RaidGruulsLairStrategy : public Strategy +{ +public: + RaidGruulsLairStrategy(PlayerbotAI* botAI) : Strategy(botAI) {} + + std::string const getName() override { return "gruulslair"; } + + void InitTriggers(std::vector& triggers) override; + void InitMultipliers(std::vector &multipliers) override; +}; + +#endif diff --git a/src/strategy/raids/gruulslair/RaidGruulsLairTriggerContext.h b/src/strategy/raids/gruulslair/RaidGruulsLairTriggerContext.h new file mode 100644 index 0000000000..fa8e76f58b --- /dev/null +++ b/src/strategy/raids/gruulslair/RaidGruulsLairTriggerContext.h @@ -0,0 +1,49 @@ +#ifndef _PLAYERBOT_RAIDGRUULSLAIRTRIGGERCONTEXT_H +#define _PLAYERBOT_RAIDGRUULSLAIRTRIGGERCONTEXT_H + +#include "RaidGruulsLairTriggers.h" +#include "AiObjectContext.h" + +class RaidGruulsLairTriggerContext : public NamedObjectContext +{ +public: + RaidGruulsLairTriggerContext() : NamedObjectContext() + { + // High King Maulgar + creators["high king maulgar is main tank"] = &RaidGruulsLairTriggerContext::high_king_maulgar_is_main_tank; + creators["high king maulgar is first assist tank"] = &RaidGruulsLairTriggerContext::high_king_maulgar_is_first_assist_tank; + creators["high king maulgar is second assist tank"] = &RaidGruulsLairTriggerContext::high_king_maulgar_is_second_assist_tank; + creators["high king maulgar is mage tank"] = &RaidGruulsLairTriggerContext::high_king_maulgar_is_mage_tank; + creators["high king maulgar is moonkin tank"] = &RaidGruulsLairTriggerContext::high_king_maulgar_is_moonkin_tank; + creators["high king maulgar determining kill order"] = &RaidGruulsLairTriggerContext::high_king_maulgar_determining_kill_order; + creators["high king maulgar healer in danger"] = &RaidGruulsLairTriggerContext::high_king_maulgar_healer_in_danger; + creators["high king maulgar boss channeling whirlwind"] = &RaidGruulsLairTriggerContext::high_king_maulgar_boss_channeling_whirlwind; + creators["high king maulgar wild felstalker spawned"] = &RaidGruulsLairTriggerContext::high_king_maulgar_wild_felstalker_spawned; + creators["high king maulgar pulling olm and blindeye"] = &RaidGruulsLairTriggerContext::high_king_maulgar_pulling_olm_and_blindeye; + + // Gruul the Dragonkiller + creators["gruul the dragonkiller boss engaged by main tank"] = &RaidGruulsLairTriggerContext::gruul_the_dragonkiller_boss_engaged_by_main_tank; + creators["gruul the dragonkiller boss engaged by range"] = &RaidGruulsLairTriggerContext::gruul_the_dragonkiller_boss_engaged_by_range; + creators["gruul the dragonkiller incoming shatter"] = &RaidGruulsLairTriggerContext::gruul_the_dragonkiller_incoming_shatter; + } + +private: + // High King Maulgar + static Trigger* high_king_maulgar_is_main_tank(PlayerbotAI* botAI) { return new HighKingMaulgarIsMainTankTrigger(botAI); } + static Trigger* high_king_maulgar_is_first_assist_tank(PlayerbotAI* botAI) { return new HighKingMaulgarIsFirstAssistTankTrigger(botAI); } + static Trigger* high_king_maulgar_is_second_assist_tank(PlayerbotAI* botAI) { return new HighKingMaulgarIsSecondAssistTankTrigger(botAI); } + static Trigger* high_king_maulgar_is_mage_tank(PlayerbotAI* botAI) { return new HighKingMaulgarIsMageTankTrigger(botAI); } + static Trigger* high_king_maulgar_is_moonkin_tank(PlayerbotAI* botAI) { return new HighKingMaulgarIsMoonkinTankTrigger(botAI); } + static Trigger* high_king_maulgar_determining_kill_order(PlayerbotAI* botAI) { return new HighKingMaulgarDeterminingKillOrderTrigger(botAI); } + static Trigger* high_king_maulgar_healer_in_danger(PlayerbotAI* botAI) { return new HighKingMaulgarHealerInDangerTrigger(botAI); } + static Trigger* high_king_maulgar_boss_channeling_whirlwind(PlayerbotAI* botAI) { return new HighKingMaulgarBossChannelingWhirlwindTrigger(botAI); } + static Trigger* high_king_maulgar_wild_felstalker_spawned(PlayerbotAI* botAI) { return new HighKingMaulgarWildFelstalkerSpawnedTrigger(botAI); } + static Trigger* high_king_maulgar_pulling_olm_and_blindeye(PlayerbotAI* botAI) { return new HighKingMaulgarPullingOlmAndBlindeyeTrigger(botAI); } + + // Gruul the Dragonkiller + static Trigger* gruul_the_dragonkiller_boss_engaged_by_main_tank(PlayerbotAI* botAI) { return new GruulTheDragonkillerBossEngagedByMainTankTrigger(botAI); } + static Trigger* gruul_the_dragonkiller_boss_engaged_by_range(PlayerbotAI* botAI) { return new GruulTheDragonkillerBossEngagedByRangeTrigger(botAI); } + static Trigger* gruul_the_dragonkiller_incoming_shatter(PlayerbotAI* botAI) { return new GruulTheDragonkillerIncomingShatterTrigger(botAI); } +}; + +#endif diff --git a/src/strategy/raids/gruulslair/RaidGruulsLairTriggers.cpp b/src/strategy/raids/gruulslair/RaidGruulsLairTriggers.cpp new file mode 100644 index 0000000000..35d9f9a1da --- /dev/null +++ b/src/strategy/raids/gruulslair/RaidGruulsLairTriggers.cpp @@ -0,0 +1,160 @@ +#include "RaidGruulsLairTriggers.h" +#include "RaidGruulsLairHelpers.h" +#include "Playerbots.h" + +using namespace GruulsLairHelpers; + +// High King Maulgar Triggers + +bool HighKingMaulgarIsMainTankTrigger::IsActive() +{ + Unit* maulgar = AI_VALUE2(Unit*, "find target", "high king maulgar"); + + return botAI->IsMainTank(bot) && maulgar && maulgar->IsAlive(); +} + +bool HighKingMaulgarIsFirstAssistTankTrigger::IsActive() +{ + Unit* olm = AI_VALUE2(Unit*, "find target", "olm the summoner"); + + return botAI->IsAssistTankOfIndex(bot, 0) && olm && olm->IsAlive(); +} + +bool HighKingMaulgarIsSecondAssistTankTrigger::IsActive() +{ + Unit* blindeye = AI_VALUE2(Unit*, "find target", "blindeye the seer"); + + return botAI->IsAssistTankOfIndex(bot, 1) && blindeye && blindeye->IsAlive(); +} + +bool HighKingMaulgarIsMageTankTrigger::IsActive() +{ + Unit* krosh = AI_VALUE2(Unit*, "find target", "krosh firehand"); + + return IsKroshMageTank(botAI, bot) && krosh && krosh->IsAlive(); +} + +bool HighKingMaulgarIsMoonkinTankTrigger::IsActive() +{ + Unit* kiggler = AI_VALUE2(Unit*, "find target", "kiggler the crazed"); + + return IsKigglerMoonkinTank(botAI, bot) && kiggler && kiggler->IsAlive(); +} + +bool HighKingMaulgarDeterminingKillOrderTrigger::IsActive() +{ + Unit* maulgar = AI_VALUE2(Unit*, "find target", "high king maulgar"); + Unit* kiggler = AI_VALUE2(Unit*, "find target", "kiggler the crazed"); + Unit* olm = AI_VALUE2(Unit*, "find target", "olm the summoner"); + Unit* blindeye = AI_VALUE2(Unit*, "find target", "blindeye the seer"); + Unit* krosh = AI_VALUE2(Unit*, "find target", "krosh firehand"); + + return (botAI->IsDps(bot) || botAI->IsTank(bot)) && + !(botAI->IsMainTank(bot) && maulgar && maulgar->IsAlive()) && + !(botAI->IsAssistTankOfIndex(bot, 0) && olm && olm->IsAlive()) && + !(botAI->IsAssistTankOfIndex(bot, 1) && blindeye && blindeye->IsAlive()) && + !(IsKroshMageTank(botAI, bot) && krosh && krosh->IsAlive()) && + !(IsKigglerMoonkinTank(botAI, bot) && kiggler && kiggler->IsAlive()); +} + +bool HighKingMaulgarHealerInDangerTrigger::IsActive() +{ + return botAI->IsHeal(bot) && IsAnyOgreBossAlive(botAI); +} + +bool HighKingMaulgarBossChannelingWhirlwindTrigger::IsActive() +{ + Unit* maulgar = AI_VALUE2(Unit*, "find target", "high king maulgar"); + + return maulgar && maulgar->IsAlive() && maulgar->HasAura(SPELL_WHIRLWIND) && + !botAI->IsMainTank(bot); +} + +bool HighKingMaulgarWildFelstalkerSpawnedTrigger::IsActive() +{ + Unit* felStalker = AI_VALUE2(Unit*, "find target", "wild fel stalker"); + + return felStalker && felStalker->IsAlive() && bot->getClass() == CLASS_WARLOCK; +} + +bool HighKingMaulgarPullingOlmAndBlindeyeTrigger::IsActive() +{ + Group* group = bot->GetGroup(); + if (!group || bot->getClass() != CLASS_HUNTER) + return false; + + std::vector hunters; + for (GroupReference* ref = group->GetFirstMember(); ref; ref = ref->next()) + { + Player* member = ref->GetSource(); + if (member && member->IsAlive() && member->getClass() == CLASS_HUNTER && GET_PLAYERBOT_AI(member)) + hunters.push_back(member); + } + + int hunterIndex = -1; + for (size_t i = 0; i < hunters.size(); ++i) + { + if (hunters[i] == bot) + { + hunterIndex = static_cast(i); + break; + } + } + if (hunterIndex == -1 || hunterIndex > 1) + return false; + + Unit* olm = AI_VALUE2(Unit*, "find target", "olm the summoner"); + Unit* blindeye = AI_VALUE2(Unit*, "find target", "blindeye the seer"); + Player* olmTank = nullptr; + Player* blindeyeTank = nullptr; + + for (GroupReference* ref = group->GetFirstMember(); ref; ref = ref->next()) + { + Player* member = ref->GetSource(); + if (!member || !member->IsAlive()) + continue; + else if (botAI->IsAssistTankOfIndex(member, 0)) olmTank = member; + else if (botAI->IsAssistTankOfIndex(member, 1)) blindeyeTank = member; + } + + switch (hunterIndex) + { + case 0: + return olm && olm->IsAlive() && olm->GetHealthPct() > 98.0f && + olmTank && olmTank->IsAlive() && botAI->CanCastSpell("misdirection", olmTank); + + case 1: + return blindeye && blindeye->IsAlive() && blindeye->GetHealthPct() > 90.0f && + blindeyeTank && blindeyeTank->IsAlive() && botAI->CanCastSpell("misdirection", blindeyeTank); + + default: + break; + } + + return false; +} + +// Gruul the Dragonkiller Triggers + +bool GruulTheDragonkillerBossEngagedByMainTankTrigger::IsActive() +{ + Unit* gruul = AI_VALUE2(Unit*, "find target", "gruul the dragonkiller"); + + return gruul && gruul->IsAlive() && botAI->IsMainTank(bot); +} + +bool GruulTheDragonkillerBossEngagedByRangeTrigger::IsActive() +{ + Unit* gruul = AI_VALUE2(Unit*, "find target", "gruul the dragonkiller"); + + return gruul && gruul->IsAlive() && botAI->IsRanged(bot); +} + +bool GruulTheDragonkillerIncomingShatterTrigger::IsActive() +{ + Unit* gruul = AI_VALUE2(Unit*, "find target", "gruul the dragonkiller"); + + return gruul && gruul->IsAlive() && + (bot->HasAura(SPELL_GROUND_SLAM_1) || + bot->HasAura(SPELL_GROUND_SLAM_2)); +} diff --git a/src/strategy/raids/gruulslair/RaidGruulsLairTriggers.h b/src/strategy/raids/gruulslair/RaidGruulsLairTriggers.h new file mode 100644 index 0000000000..f3f3285361 --- /dev/null +++ b/src/strategy/raids/gruulslair/RaidGruulsLairTriggers.h @@ -0,0 +1,97 @@ +#ifndef _PLAYERBOT_RAIDGRUULSLAIRTRIGGERS_H +#define _PLAYERBOT_RAIDGRUULSLAIRTRIGGERS_H + +#include "Trigger.h" + +class HighKingMaulgarIsMainTankTrigger : public Trigger +{ +public: + HighKingMaulgarIsMainTankTrigger(PlayerbotAI* botAI) : Trigger(botAI, "high king maulgar is main tank") {} + bool IsActive() override; +}; + +class HighKingMaulgarIsFirstAssistTankTrigger : public Trigger +{ +public: + HighKingMaulgarIsFirstAssistTankTrigger(PlayerbotAI* botAI) : Trigger(botAI, "high king maulgar is first assist tank") {} + bool IsActive() override; +}; + +class HighKingMaulgarIsSecondAssistTankTrigger : public Trigger +{ +public: + HighKingMaulgarIsSecondAssistTankTrigger(PlayerbotAI* botAI) : Trigger(botAI, "high king maulgar is second assist tank") {} + bool IsActive() override; +}; + +class HighKingMaulgarIsMageTankTrigger : public Trigger +{ +public: + HighKingMaulgarIsMageTankTrigger(PlayerbotAI* botAI) : Trigger(botAI, "high king maulgar is mage tank") {} + bool IsActive() override; +}; + +class HighKingMaulgarIsMoonkinTankTrigger : public Trigger +{ +public: + HighKingMaulgarIsMoonkinTankTrigger(PlayerbotAI* botAI) : Trigger(botAI, "high king maulgar is moonkin tank") {} + bool IsActive() override; +}; + +class HighKingMaulgarDeterminingKillOrderTrigger : public Trigger +{ +public: + HighKingMaulgarDeterminingKillOrderTrigger(PlayerbotAI* botAI) : Trigger(botAI, "high king maulgar determining kill order") {} + bool IsActive() override; +}; + +class HighKingMaulgarHealerInDangerTrigger : public Trigger +{ +public: + HighKingMaulgarHealerInDangerTrigger(PlayerbotAI* botAI) : Trigger(botAI, "high king maulgar healers in danger") {} + bool IsActive() override; +}; + +class HighKingMaulgarBossChannelingWhirlwindTrigger : public Trigger +{ +public: + HighKingMaulgarBossChannelingWhirlwindTrigger(PlayerbotAI* botAI) : Trigger(botAI, "high king maulgar boss channeling whirlwind") {} + bool IsActive() override; +}; + +class HighKingMaulgarWildFelstalkerSpawnedTrigger : public Trigger +{ +public: + HighKingMaulgarWildFelstalkerSpawnedTrigger(PlayerbotAI* botAI) : Trigger(botAI, "high king maulgar wild felstalker spawned") {} + bool IsActive() override; +}; + +class HighKingMaulgarPullingOlmAndBlindeyeTrigger : public Trigger +{ +public: + HighKingMaulgarPullingOlmAndBlindeyeTrigger(PlayerbotAI* botAI) : Trigger(botAI, "high king maulgar pulling olm and blindeye") {} + bool IsActive() override; +}; + +class GruulTheDragonkillerBossEngagedByMainTankTrigger : public Trigger +{ +public: + GruulTheDragonkillerBossEngagedByMainTankTrigger(PlayerbotAI* botAI) : Trigger(botAI, "gruul the dragonkiller boss engaged by main tank") {} + bool IsActive() override; +}; + +class GruulTheDragonkillerBossEngagedByRangeTrigger : public Trigger +{ +public: + GruulTheDragonkillerBossEngagedByRangeTrigger(PlayerbotAI* botAI) : Trigger(botAI, "gruul the dragonkiller boss engaged by range") {} + bool IsActive() override; +}; + +class GruulTheDragonkillerIncomingShatterTrigger : public Trigger +{ +public: + GruulTheDragonkillerIncomingShatterTrigger(PlayerbotAI* botAI) : Trigger(botAI, "gruul the dragonkiller incoming shatter") {} + bool IsActive() override; +}; + +#endif From 26a135a1ecba1c02d8ce1404308c2531d2b912a4 Mon Sep 17 00:00:00 2001 From: privatecore Date: Tue, 4 Nov 2025 23:25:59 +0100 Subject: [PATCH 134/151] Rewrite RandomPlayerbotFactory for improved maintainability and future updates (#1758) * Rewrite RandomPlayerbotFactory - rewrite constructor and utility methods, simplify checks and logic * Update the comment to clarify the original logic for race selection * Remove magic numbers from CombineRaceAndGender method (gender) * Add checks for races and classes disabled during random bot creation --- src/RandomPlayerbotFactory.cpp | 233 ++++++++++----------------------- src/RandomPlayerbotFactory.h | 8 +- 2 files changed, 73 insertions(+), 168 deletions(-) diff --git a/src/RandomPlayerbotFactory.cpp b/src/RandomPlayerbotFactory.cpp index ceed748d42..4be2d0edfc 100644 --- a/src/RandomPlayerbotFactory.cpp +++ b/src/RandomPlayerbotFactory.cpp @@ -19,188 +19,99 @@ #include "Log.h" #include "GuildMgr.h" -std::map> RandomPlayerbotFactory::availableRaces; - -constexpr RandomPlayerbotFactory::NameRaceAndGender RandomPlayerbotFactory::CombineRaceAndGender(uint8 gender, - uint8 race) +constexpr RandomPlayerbotFactory::NameRaceAndGender RandomPlayerbotFactory::CombineRaceAndGender(uint8 race, + uint8 gender) { + NameRaceAndGender baseIndex; switch (race) { + case RACE_ORC: baseIndex = NameRaceAndGender::OrcMale; break; + case RACE_DWARF: baseIndex = NameRaceAndGender::DwarfMale; break; + case RACE_NIGHTELF: baseIndex = NameRaceAndGender::NightelfMale; break; + case RACE_TAUREN: baseIndex = NameRaceAndGender::TaurenMale; break; + case RACE_GNOME: baseIndex = NameRaceAndGender::GnomeMale; break; + case RACE_TROLL: baseIndex = NameRaceAndGender::TrollMale; break; + case RACE_BLOODELF: baseIndex = NameRaceAndGender::BloodelfMale; break; + case RACE_DRAENEI: baseIndex = NameRaceAndGender::DraeneiMale; break; case RACE_HUMAN: - return static_cast(static_cast(NameRaceAndGender::GenericMale) + gender); - case RACE_ORC: - return static_cast(static_cast(NameRaceAndGender::OrcMale) + gender); - case RACE_DWARF: - return static_cast(static_cast(NameRaceAndGender::DwarfMale) + gender); - case RACE_NIGHTELF: - return static_cast(static_cast(NameRaceAndGender::NightelfMale) + gender); case RACE_UNDEAD_PLAYER: - return static_cast(static_cast(NameRaceAndGender::GenericMale) + gender); - case RACE_TAUREN: - return static_cast(static_cast(NameRaceAndGender::TaurenMale) + gender); - case RACE_GNOME: - return static_cast(static_cast(NameRaceAndGender::GnomeMale) + gender); - case RACE_TROLL: - return static_cast(static_cast(NameRaceAndGender::TrollMale) + gender); - case RACE_DRAENEI: - return static_cast(static_cast(NameRaceAndGender::DraeneiMale) + gender); - case RACE_BLOODELF: - return static_cast(static_cast(NameRaceAndGender::BloodelfMale) + gender); default: - LOG_ERROR("playerbots", "The race with ID %d does not have a naming category", race); - return static_cast(static_cast(NameRaceAndGender::GenericMale) + gender); + baseIndex = NameRaceAndGender::GenericMale; + break; } + + return static_cast(static_cast(baseIndex) + ((gender >= GENDER_NONE) ? GENDER_MALE : gender)); } -RandomPlayerbotFactory::RandomPlayerbotFactory(uint32 accountId) : accountId(accountId) +bool RandomPlayerbotFactory::IsValidRaceClassCombination(uint8 race, uint8 cls, uint32 expansion) { - uint32 const expansion = sWorld->getIntConfig(CONFIG_EXPANSION); - - availableRaces[CLASS_WARRIOR].push_back(RACE_HUMAN); - availableRaces[CLASS_WARRIOR].push_back(RACE_NIGHTELF); - availableRaces[CLASS_WARRIOR].push_back(RACE_GNOME); - availableRaces[CLASS_WARRIOR].push_back(RACE_DWARF); - availableRaces[CLASS_WARRIOR].push_back(RACE_ORC); - availableRaces[CLASS_WARRIOR].push_back(RACE_UNDEAD_PLAYER); - availableRaces[CLASS_WARRIOR].push_back(RACE_TAUREN); - availableRaces[CLASS_WARRIOR].push_back(RACE_TROLL); - if (expansion >= EXPANSION_THE_BURNING_CRUSADE) - { - availableRaces[CLASS_WARRIOR].push_back(RACE_DRAENEI); - } - - availableRaces[CLASS_PALADIN].push_back(RACE_HUMAN); - availableRaces[CLASS_PALADIN].push_back(RACE_DWARF); - if (expansion >= EXPANSION_THE_BURNING_CRUSADE) - { - availableRaces[CLASS_PALADIN].push_back(RACE_DRAENEI); - availableRaces[CLASS_PALADIN].push_back(RACE_BLOODELF); - } - - availableRaces[CLASS_ROGUE].push_back(RACE_HUMAN); - availableRaces[CLASS_ROGUE].push_back(RACE_DWARF); - availableRaces[CLASS_ROGUE].push_back(RACE_NIGHTELF); - availableRaces[CLASS_ROGUE].push_back(RACE_GNOME); - availableRaces[CLASS_ROGUE].push_back(RACE_ORC); - availableRaces[CLASS_ROGUE].push_back(RACE_UNDEAD_PLAYER); - availableRaces[CLASS_ROGUE].push_back(RACE_TROLL); - if (expansion >= EXPANSION_THE_BURNING_CRUSADE) - { - availableRaces[CLASS_ROGUE].push_back(RACE_BLOODELF); - } - - availableRaces[CLASS_PRIEST].push_back(RACE_HUMAN); - availableRaces[CLASS_PRIEST].push_back(RACE_DWARF); - availableRaces[CLASS_PRIEST].push_back(RACE_NIGHTELF); - availableRaces[CLASS_PRIEST].push_back(RACE_TROLL); - availableRaces[CLASS_PRIEST].push_back(RACE_UNDEAD_PLAYER); - if (expansion >= EXPANSION_THE_BURNING_CRUSADE) - { - availableRaces[CLASS_PRIEST].push_back(RACE_DRAENEI); - availableRaces[CLASS_PRIEST].push_back(RACE_BLOODELF); - } - - availableRaces[CLASS_MAGE].push_back(RACE_HUMAN); - availableRaces[CLASS_MAGE].push_back(RACE_GNOME); - availableRaces[CLASS_MAGE].push_back(RACE_UNDEAD_PLAYER); - availableRaces[CLASS_MAGE].push_back(RACE_TROLL); - if (expansion >= EXPANSION_THE_BURNING_CRUSADE) - { - availableRaces[CLASS_MAGE].push_back(RACE_DRAENEI); - availableRaces[CLASS_MAGE].push_back(RACE_BLOODELF); - } - - availableRaces[CLASS_WARLOCK].push_back(RACE_HUMAN); - availableRaces[CLASS_WARLOCK].push_back(RACE_GNOME); - availableRaces[CLASS_WARLOCK].push_back(RACE_UNDEAD_PLAYER); - availableRaces[CLASS_WARLOCK].push_back(RACE_ORC); - if (expansion >= EXPANSION_THE_BURNING_CRUSADE) - { - availableRaces[CLASS_WARLOCK].push_back(RACE_BLOODELF); - } - - availableRaces[CLASS_SHAMAN].push_back(RACE_ORC); - availableRaces[CLASS_SHAMAN].push_back(RACE_TAUREN); - availableRaces[CLASS_SHAMAN].push_back(RACE_TROLL); - if (expansion >= EXPANSION_THE_BURNING_CRUSADE) - { - availableRaces[CLASS_SHAMAN].push_back(RACE_DRAENEI); - } - - availableRaces[CLASS_HUNTER].push_back(RACE_DWARF); - availableRaces[CLASS_HUNTER].push_back(RACE_NIGHTELF); - availableRaces[CLASS_HUNTER].push_back(RACE_ORC); - availableRaces[CLASS_HUNTER].push_back(RACE_TAUREN); - availableRaces[CLASS_HUNTER].push_back(RACE_TROLL); - if (expansion >= EXPANSION_THE_BURNING_CRUSADE) - { - availableRaces[CLASS_HUNTER].push_back(RACE_DRAENEI); - availableRaces[CLASS_HUNTER].push_back(RACE_BLOODELF); - } + // skip expansion races if not playing with expansion + if (expansion < EXPANSION_THE_BURNING_CRUSADE && (race == RACE_BLOODELF || race == RACE_DRAENEI)) + return false; - availableRaces[CLASS_DRUID].push_back(RACE_NIGHTELF); - availableRaces[CLASS_DRUID].push_back(RACE_TAUREN); + // skip expansion classes if not playing with expansion + if (expansion < EXPANSION_WRATH_OF_THE_LICH_KING && cls == CLASS_DEATH_KNIGHT) + return false; - if (expansion == EXPANSION_WRATH_OF_THE_LICH_KING) - { - availableRaces[CLASS_DEATH_KNIGHT].push_back(RACE_NIGHTELF); - availableRaces[CLASS_DEATH_KNIGHT].push_back(RACE_TAUREN); - availableRaces[CLASS_DEATH_KNIGHT].push_back(RACE_HUMAN); - availableRaces[CLASS_DEATH_KNIGHT].push_back(RACE_ORC); - availableRaces[CLASS_DEATH_KNIGHT].push_back(RACE_UNDEAD_PLAYER); - availableRaces[CLASS_DEATH_KNIGHT].push_back(RACE_TROLL); - availableRaces[CLASS_DEATH_KNIGHT].push_back(RACE_BLOODELF); - availableRaces[CLASS_DEATH_KNIGHT].push_back(RACE_DRAENEI); - availableRaces[CLASS_DEATH_KNIGHT].push_back(RACE_GNOME); - availableRaces[CLASS_DEATH_KNIGHT].push_back(RACE_DWARF); - } + PlayerInfo const* info = sObjectMgr->GetPlayerInfo(race, cls); + return info != nullptr; } Player* RandomPlayerbotFactory::CreateRandomBot(WorldSession* session, uint8 cls, std::unordered_map>& nameCache) { - LOG_DEBUG("playerbots", "Creating new random bot for class {}", cls); + LOG_DEBUG("playerbots", "Creating a new random bot for class: {}", cls); + + const bool alliance = static_cast(urand(0, 1)); - uint8 gender = rand() % 2 ? GENDER_MALE : GENDER_FEMALE; - bool alliance = rand() % 2 ? true : false; std::vector raceOptions; - for (const auto& race : availableRaces[cls]) + for (uint8 race = RACE_HUMAN; race < MAX_RACES; ++race) { + // skip disabled with config races + if ((1 << (race - 1)) & sWorld->getIntConfig(CONFIG_CHARACTER_CREATING_DISABLED_RACEMASK)) + continue; + + // Try to get 50/50 faction distribution for random bot population balance. + // Without this check, races from the faction with more class options would dominate. if (alliance == IsAlliance(race)) { - raceOptions.push_back(race); + if (IsValidRaceClassCombination(race, cls, sWorld->getIntConfig(CONFIG_EXPANSION))) + raceOptions.push_back(race); } } if (raceOptions.empty()) { - LOG_ERROR("playerbots", "No races available for class: {}", cls); + LOG_ERROR("playerbots", "No races are available for class: {}", cls); return nullptr; } - uint8 race = raceOptions[urand(0, raceOptions.size() - 1)]; - - const auto raceAndGender = CombineRaceAndGender(gender, race); + const uint8 race = raceOptions[urand(0, raceOptions.size() - 1)]; + const uint8 gender = urand(0, 1) ? GENDER_MALE : GENDER_FEMALE; + const auto raceAndGender = CombineRaceAndGender(race, gender); std::string name; - if (nameCache.empty()) - { - name = CreateRandomBotName(raceAndGender); - } - else + if (!nameCache.empty()) { if (nameCache[raceAndGender].empty()) { - LOG_ERROR("playerbots", "No name found for race and gender: {}", raceAndGender); + LOG_ERROR("playerbots", "No names found for the specified race: {} and gender: {}", + race, gender); return nullptr; } + uint32 i = urand(0, nameCache[raceAndGender].size() - 1); name = nameCache[raceAndGender][i]; swap(nameCache[raceAndGender][i], nameCache[raceAndGender].back()); nameCache[raceAndGender].pop_back(); } + else + { + name = CreateRandomBotName(raceAndGender); + } + if (name.empty()) { - LOG_ERROR("playerbots", "Unable to get random bot name!"); + LOG_ERROR("playerbots", "Failed to get a valid random bot name"); return nullptr; } @@ -246,19 +157,20 @@ Player* RandomPlayerbotFactory::CreateRandomBot(WorldSession* session, uint8 cls player->CleanupsBeforeDelete(); delete player; - LOG_ERROR("playerbots", "Unable to create random bot for account {} - name: \"{}\"; race: {}; class: {}", - accountId, name.c_str(), race, cls); + LOG_ERROR("playerbots", "Unable to create random bot - name: \"{}\", race: {}, class: {}", + name.c_str(), race, cls); return nullptr; } player->setCinematic(2); player->SetAtLoginFlag(AT_LOGIN_NONE); - if (player->getClass() == CLASS_DEATH_KNIGHT) + if (cls == CLASS_DEATH_KNIGHT) { player->learnSpell(50977, false); } - LOG_DEBUG("playerbots", "Random bot created for account {} - name: \"{}\"; race: {}; class: {}", accountId, + + LOG_DEBUG("playerbots", "Random bot created - name: \"{}\", race: {}, class: {}", name.c_str(), race, cls); return player; @@ -786,7 +698,7 @@ void RandomPlayerbotFactory::CreateRandomBots() } LOG_DEBUG("playerbots", "Creating random bot characters for account: [{}/{}]", accountNumber + 1, totalAccountCount); - RandomPlayerbotFactory factory(accountId); + RandomPlayerbotFactory factory; WorldSession* session = new WorldSession(accountId, "", 0x0, nullptr, SEC_PLAYER, EXPANSION_WRATH_OF_THE_LICH_KING, time_t(0), LOCALE_enUS, 0, false, false, 0, true); @@ -798,29 +710,24 @@ void RandomPlayerbotFactory::CreateRandomBots() if (!((1 << (cls - 1)) & CLASSMASK_ALL_PLAYABLE) || !sChrClassesStore.LookupEntry(cls)) continue; - if (bool const isClassDeathKnight = cls == CLASS_DEATH_KNIGHT; - isClassDeathKnight && sWorld->getIntConfig(CONFIG_EXPANSION) != EXPANSION_WRATH_OF_THE_LICH_KING) - { + // skip disabled with config classes + if ((1 << (cls - 1)) & sWorld->getIntConfig(CONFIG_CHARACTER_CREATING_DISABLED_CLASSMASK)) continue; - } - if (cls != 10) + Player* playerBot = factory.CreateRandomBot(session, cls, nameCache); + if (!playerBot) { - if (Player* playerBot = factory.CreateRandomBot(session, cls, nameCache)) - { - playerBot->SaveToDB(true, false); - sCharacterCache->AddCharacterCacheEntry(playerBot->GetGUID(), accountId, playerBot->GetName(), - playerBot->getGender(), playerBot->getRace(), - playerBot->getClass(), playerBot->GetLevel()); - playerBot->CleanupsBeforeDelete(); - delete playerBot; - bot_creation++; - } - else - { - LOG_ERROR("playerbots", "Fail to create character for account {}", accountId); - } + LOG_ERROR("playerbots", "Fail to create character for account {}", accountId); + continue; } + + playerBot->SaveToDB(true, false); + sCharacterCache->AddCharacterCacheEntry(playerBot->GetGUID(), accountId, playerBot->GetName(), + playerBot->getGender(), playerBot->getRace(), + playerBot->getClass(), playerBot->GetLevel()); + playerBot->CleanupsBeforeDelete(); + delete playerBot; + bot_creation++; } } diff --git a/src/RandomPlayerbotFactory.h b/src/RandomPlayerbotFactory.h index e74926a20e..d6c19e454b 100644 --- a/src/RandomPlayerbotFactory.h +++ b/src/RandomPlayerbotFactory.h @@ -44,9 +44,9 @@ class RandomPlayerbotFactory BloodelfFemale }; - static constexpr NameRaceAndGender CombineRaceAndGender(uint8 gender, uint8 race); + static constexpr NameRaceAndGender CombineRaceAndGender(uint8 race, uint8 gender); - RandomPlayerbotFactory(uint32 accountId); + RandomPlayerbotFactory() {}; virtual ~RandomPlayerbotFactory() {} Player* CreateRandomBot(WorldSession* session, uint8 cls, std::unordered_map>& names); @@ -58,11 +58,9 @@ class RandomPlayerbotFactory static uint32 CalculateAvailableCharsPerAccount(); private: + static bool IsValidRaceClassCombination(uint8 race, uint8 class_, uint32 expansion); std::string const CreateRandomBotName(NameRaceAndGender raceAndGender); static std::string const CreateRandomArenaTeamName(); - - uint32 accountId; - static std::map> availableRaces; }; #endif From 80dbd22ba1f4122a1fbfda18d47ef7c6a5a6b3a0 Mon Sep 17 00:00:00 2001 From: avirar Date: Wed, 5 Nov 2025 09:27:50 +1100 Subject: [PATCH 135/151] Fixes equip bug with random suffix rings (#1757) * Check item score of rings/trinkets to determine the correct slot to equip * Early return, removed unecessary if statements, single line statements Simplify logic for equipping items by reducing nested conditions. --- src/strategy/actions/EquipAction.cpp | 31 ++++++++++++++++++++++------ 1 file changed, 25 insertions(+), 6 deletions(-) diff --git a/src/strategy/actions/EquipAction.cpp b/src/strategy/actions/EquipAction.cpp index 946af5b2f6..f24d89f7bd 100644 --- a/src/strategy/actions/EquipAction.cpp +++ b/src/strategy/actions/EquipAction.cpp @@ -271,19 +271,38 @@ void EquipAction::EquipItem(Item* item) { if (equippedItems[1]) { - // Both slots are full - pick the worst item to replace + // Both slots are full - pick the worst item to replace, but only if new item is better StatsWeightCalculator calc(bot); calc.SetItemSetBonus(false); calc.SetOverflowPenalty(false); - float firstItemScore = calc.CalculateItem(equippedItems[0]->GetTemplate()->ItemId); - float secondItemScore = calc.CalculateItem(equippedItems[1]->GetTemplate()->ItemId); + // Calculate new item score with random properties + int32 newItemRandomProp = item->GetItemRandomPropertyId(); + float newItemScore = calc.CalculateItem(itemId, newItemRandomProp); - // If the second slot is worse, place the new item there - if (firstItemScore > secondItemScore) + // Calculate equipped items scores with random properties + int32 firstRandomProp = equippedItems[0]->GetItemRandomPropertyId(); + int32 secondRandomProp = equippedItems[1]->GetItemRandomPropertyId(); + float firstItemScore = calc.CalculateItem(equippedItems[0]->GetTemplate()->ItemId, firstRandomProp); + float secondItemScore = calc.CalculateItem(equippedItems[1]->GetTemplate()->ItemId, secondRandomProp); + + // Determine which slot (if any) should be replaced + bool betterThanFirst = newItemScore > firstItemScore; + bool betterThanSecond = newItemScore > secondItemScore; + + // Early return if new item is not better than either equipped item + if (!betterThanFirst && !betterThanSecond) + return; + + if (betterThanFirst && betterThanSecond) { - dstSlot++; + // New item is better than both - replace the worse of the two equipped items + if (firstItemScore > secondItemScore) + dstSlot++; // Replace second slot (worse) + // else: keep dstSlot as-is (replace first slot) } + else if (betterThanSecond) + dstSlot++; // Only better than second slot - replace it } else { From acdb646a3d50461390bb17f938063941b8786565 Mon Sep 17 00:00:00 2001 From: Tecc Date: Wed, 5 Nov 2025 14:42:35 +0100 Subject: [PATCH 136/151] Enhance Wintergrasp bot behavior: Implement auto-join feature and refine strategy for bot participation based on player presence --- conf/playerbots.conf.dist | 16 +- src/RandomPlayerbotMgr.cpp | 11 +- src/strategy/actions/BattleGroundTactics.cpp | 386 ++++++++++++------- 3 files changed, 253 insertions(+), 160 deletions(-) diff --git a/conf/playerbots.conf.dist b/conf/playerbots.conf.dist index 42867c0a80..d8b716ea42 100644 --- a/conf/playerbots.conf.dist +++ b/conf/playerbots.conf.dist @@ -630,7 +630,7 @@ AiPlayerbot.RandomBotHordeRatio = 50 AiPlayerbot.DisableDeathKnightLogin = 0 # Enable simulated expansion limitation for talents and glyphs -# If enabled, limits talent trees to 5 rows plus the middle talent of the 6th row for bots until level 61 +# If enabled, limits talent trees to 5 rows plus the middle talent of the 6th row for bots until level 61 # and 7 rows plus the middle talent of the 8th row for bots from level 61 until level 71 # Default: 0 (disabled) AiPlayerbot.LimitTalentsExpansion = 0 @@ -1114,20 +1114,20 @@ AiPlayerbot.RandomBotJoinBG = 1 # Enable auto-joining of battlegrounds - have bots start battlegrounds and arenas on their own AiPlayerbot.RandomBotAutoJoinBG = 0 - + # Allow random bots to participate in Wintergrasp (Battlefield) and fill the teams # Similar to AiPlayerbot.RandomBotJoinBG for battlegrounds. # Default: 1 (enabled) AiPlayerbot.RandomBotJoinWG = 1 -# Random bots may auto-join the Wintergrasp queue (anywhere), so at war start they get teleported in. -# This simulates queuing via the Dalaran WG battlemage/gossip and fills teams when players join. -# Default: 1 (enabled) +# Random bots may auto-queue and join Wintergrasp even when no real players participate. +# When disabled, bots only join when real players are already in the battle (like other BGs). +# Default: 0 (disabled) AiPlayerbot.RandomBotAutoJoinWGQueue = 0 # Note: AiPlayerbot.RandomBotAutoJoinWGQueue takes effect only when -# AiPlayerbot.RandomBotJoinWG = 1. When both are enabled, random bots may -# queue for WG on their own. When only RandomBotJoinWG is enabled, bots will -# fill when real players have queued and the battle is underway. +# AiPlayerbot.RandomBotJoinWG = 1. When both are enabled, bots may +# queue and fight each other autonomously. When only RandomBotJoinWG is enabled, bots will +# only fill when real players have joined the battle. # Required Configuration for RandomBotAutoJoinBG # diff --git a/src/RandomPlayerbotMgr.cpp b/src/RandomPlayerbotMgr.cpp index b9987b6178..8fd8267493 100644 --- a/src/RandomPlayerbotMgr.cpp +++ b/src/RandomPlayerbotMgr.cpp @@ -1405,9 +1405,12 @@ void RandomPlayerbotMgr::CheckWGFill() ++realInWG[t]; } - // Only fill if at least one real player is present on any side - if (realInWG[TEAM_ALLIANCE] == 0 && realInWG[TEAM_HORDE] == 0) - return; + // Only fill if at least one real player is present, unless auto-join is enabled + if (!sPlayerbotAIConfig->randomBotAutoJoinWGQueue) + { + if (realInWG[TEAM_ALLIANCE] == 0 && realInWG[TEAM_HORDE] == 0) + return; + } // desired cap per team from worldserver config (same value BattlefieldWG uses) const uint32 teamCap = sWorld->getIntConfig(CONFIG_WINTERGRASP_PLR_MAX); @@ -1686,7 +1689,7 @@ bool RandomPlayerbotMgr::ProcessBot(Player* bot) { idleBot = true; } - + if (idleBot) { // randomize diff --git a/src/strategy/actions/BattleGroundTactics.cpp b/src/strategy/actions/BattleGroundTactics.cpp index 39285150f6..619bd3f5e2 100644 --- a/src/strategy/actions/BattleGroundTactics.cpp +++ b/src/strategy/actions/BattleGroundTactics.cpp @@ -1991,237 +1991,324 @@ bool BGTactics::selectObjective(bool reset) // Wintergrasp Battlefield objective selection (zone-driven) if (isWGZone) { - // Determine defender/attacker side - bool isDefender = false; - if (Battlefield* bf = sBattlefieldMgr->GetBattlefieldToZoneId(4197)) - isDefender = (bf->GetDefenderTeam() == bot->GetTeamId()); + Battlefield* bf = sBattlefieldMgr->GetBattlefieldToZoneId(4197); + if (!bf) + return false; + + // Determine defender/attacker side and battle state + bool isDefender = (bf->GetDefenderTeam() == bot->GetTeamId()); + bool isWarTime = bf->IsWarTime(); + TeamId team = bot->GetTeamId(); + uint32 role = context->GetValue("bg role")->Get(); + + // WG Strategy system similar to other BGs + enum WGBotStrategy { WG_STRATEGY_BALANCED = 0, WG_STRATEGY_OFFENSIVE, WG_STRATEGY_DEFENSIVE }; + WGBotStrategy strategy = static_cast(role % 3); // Simple strategy assignment + + // Role distribution based on strategy (similar to AV/AB) + uint8 defendersProhab = 4; // Default balanced + switch (strategy) + { + case WG_STRATEGY_OFFENSIVE: + defendersProhab = (isDefender ? 6 : 2); // Defenders stay defensive, attackers go aggressive + break; + case WG_STRATEGY_DEFENSIVE: + defendersProhab = (isDefender ? 8 : 3); // Heavy defense for defenders, balanced for attackers + break; + case WG_STRATEGY_BALANCED: + default: + defendersProhab = 4; + break; + } + + bool isDefensiveRole = (role % 10) < defendersProhab; + bool shouldUseVehicles = !isDefensiveRole || strategy == WG_STRATEGY_OFFENSIVE; // Try to push siege objectives; fall back to local PvP - // Gate push if friendly vehicles are massed (with some randomness to choose a side breach) + // Priority 1: Workshop Banner Control (highest priority - enables vehicle production) { - GuidVector nearbyVehicles = AI_VALUE(GuidVector, "nearest vehicles"); - uint32 friendlyAtGate = 0; - for (ObjectGuid const& vg : nearbyVehicles) + GuidVector noLosObjects = AI_VALUE(GuidVector, "nearest game objects no los"); + std::vector contested_banners, neutral_banners, enemy_banners; + + for (ObjectGuid const& gid : noLosObjects) { - Unit* v = botAI->GetUnit(vg); - if (!v || !v->IsFriendlyTo(bot)) + GameObject* go = botAI->GetGameObject(gid); + if (!go || std::find(vFlagsWG.begin(), vFlagsWG.end(), go->GetEntry()) == vFlagsWG.end()) continue; - if (v->GetDistance(WG_GATE_POS) < 200.0f) - friendlyAtGate++; - } - if (friendlyAtGate >= 2) - { - // 25% chance to breach via a side lane instead of the main gate, to avoid predictable zergs - uint32 role = context->GetValue("bg role")->Get(); - bool sideBreach = urand(0, 99) < 25; - if (!sideBreach) + if (go->GetEntry() == 192829) // Skip relic for now + continue; + + float dist = bot->GetDistance(go); + if (dist > 300.0f) // Only consider nearby banners + continue; + + bool canUse = bot->CanUseBattlegroundObject(go); + if (canUse) { - PositionInfo& siege = context->GetValue("position")->Get()["bg siege"]; - pos.Set(WG_GATE_POS.GetPositionX(), WG_GATE_POS.GetPositionY(), WG_GATE_POS.GetPositionZ(), bot->GetMapId()); - posMap["bg objective"] = pos; - siege.Set(pos.x, pos.y, pos.z, pos.mapId); - return true; + // Determine banner state by checking interaction availability + contested_banners.push_back(go); } - // choose a side tower as breach point based on role - Position breach = (role % 2 == 0 ? WG_TOWER_W_POS : WG_TOWER_E_POS); - pos.Set(breach.GetPositionX(), breach.GetPositionY(), breach.GetPositionZ(), bot->GetMapId()); + else + { + enemy_banners.push_back(go); + } + } + + // Prioritize: contested > enemy > neutral + GameObject* targetBanner = nullptr; + if (!contested_banners.empty()) + targetBanner = contested_banners[urand(0, contested_banners.size() - 1)]; + else if (!enemy_banners.empty() && !isDefensiveRole) + targetBanner = enemy_banners[urand(0, enemy_banners.size() - 1)]; + + if (targetBanner) + { + pos.Set(targetBanner->GetPositionX(), targetBanner->GetPositionY(), targetBanner->GetPositionZ(), bot->GetMapId()); posMap["bg objective"] = pos; return true; } } - // Defenders: intercept nearest enemy vehicle - if (isDefender) + // Priority 2: Vehicle-based siege assault/defense { - GuidVector vehs = AI_VALUE(GuidVector, "nearest vehicles"); - Unit* enemyVeh = nullptr; - float evDist = FLT_MAX; - for (ObjectGuid const& vg : vehs) + GuidVector nearbyVehicles = AI_VALUE(GuidVector, "nearest vehicles"); + uint32 friendlyAtGate = 0, enemyAtGate = 0; + + for (ObjectGuid const& vg : nearbyVehicles) { Unit* v = botAI->GetUnit(vg); - if (!v || v->IsFriendlyTo(bot)) + if (!v) continue; - float d = bot->GetDistance(v); - if (d < evDist) + + float distToGate = v->GetDistance(WG_GATE_POS); + if (distToGate < 200.0f) { - evDist = d; - enemyVeh = v; + if (v->IsFriendlyTo(bot)) + friendlyAtGate++; + else + enemyAtGate++; } } - if (enemyVeh && evDist < 250.0f) + + // Attackers: coordinate siege push + if (!isDefender && shouldUseVehicles && friendlyAtGate >= 1) { - pos.Set(enemyVeh->GetPositionX(), enemyVeh->GetPositionY(), enemyVeh->GetPositionZ(), bot->GetMapId()); + // Strategy-based target selection + Position siegeTarget; + switch (strategy) + { + case WG_STRATEGY_OFFENSIVE: + siegeTarget = WG_GATE_POS; // Focus fire on gate + break; + case WG_STRATEGY_BALANCED: + // Spread across multiple targets + switch (role % 4) + { + case 0: case 1: siegeTarget = WG_GATE_POS; break; + case 2: siegeTarget = WG_TOWER_W_POS; break; + case 3: siegeTarget = WG_TOWER_E_POS; break; + } + break; + case WG_STRATEGY_DEFENSIVE: + siegeTarget = (role % 2 == 0) ? WG_TOWER_S_POS : WG_GATE_POS; + break; + } + + pos.Set(siegeTarget.GetPositionX(), siegeTarget.GetPositionY(), siegeTarget.GetPositionZ(), bot->GetMapId()); posMap["bg objective"] = pos; - context->GetValue("current target")->Set(enemyVeh); return true; } + + // Defenders: counter-siege tactics + if (isDefender && enemyAtGate >= 1) + { + if (isDefensiveRole) + { + // Defend the gate area + float rx, ry, rz; + bot->GetRandomPoint(WG_GATE_POS, 75.0f, rx, ry, rz); + pos.Set(rx, ry, rz, bot->GetMapId()); + posMap["bg objective"] = pos; + return true; + } + else + { + // Counter-attack enemy siege positions + Position counterTarget = (role % 2 == 0) ? WG_TOWER_W_POS : WG_TOWER_E_POS; + pos.Set(counterTarget.GetPositionX(), counterTarget.GetPositionY(), counterTarget.GetPositionZ(), bot->GetMapId()); + posMap["bg objective"] = pos; + return true; + } + } } - // Defenders: if gate pressure is low, send strike teams to attacker towers to weaken attackers - if (isDefender) + // Priority 3: Vehicle hunting and escort (similar to AV/IC vehicle mechanics) { GuidVector vehs = AI_VALUE(GuidVector, "nearest vehicles"); - uint32 enemyAtGate = 0; + Unit* targetVehicle = nullptr; + float bestDist = FLT_MAX; + bool seekingFriendly = false; + + // Choose vehicle target based on role and strategy for (ObjectGuid const& vg : vehs) { Unit* v = botAI->GetUnit(vg); - if (!v || v->IsFriendlyTo(bot)) + if (!v) continue; - if (v->GetDistance(WG_GATE_POS) < 200.0f) - enemyAtGate++; - } - - if (enemyAtGate < 2) - { - uint32 role = context->GetValue("bg role")->Get(); - Position strike = WG_TOWER_S_POS; - switch (role % 3) - { - case 0: strike = WG_TOWER_W_POS; break; - case 1: strike = WG_TOWER_S_POS; break; - case 2: strike = WG_TOWER_E_POS; break; - } - // Prefer pushing towers with vehicles. If already in a vehicle, go straight to strike. - if (bot->GetVehicle()) - { - pos.Set(strike.GetPositionX(), strike.GetPositionY(), strike.GetPositionZ(), bot->GetMapId()); - posMap["bg objective"] = pos; - return true; - } + float d = bot->GetDistance(v); + bool isFriendly = v->IsFriendlyTo(bot); - // Seek nearest friendly vehicle suitable for a strike (Siege Engine / Demolisher) - Unit* bestVeh = nullptr; - float bestDist = FLT_MAX; - GuidVector nearVeh = AI_VALUE(GuidVector, "nearest vehicles"); - for (ObjectGuid const& vg : nearVeh) + // Defenders prioritize enemy vehicles for interception + if (isDefender && !isFriendly && d < 300.0f) { - Unit* v = botAI->GetUnit(vg); - if (!v || !v->IsFriendlyTo(bot)) - continue; - uint32 ve = v->GetEntry(); - if (ve != WG_ENTRY_SIEGE_ENGINE_A && ve != WG_ENTRY_SIEGE_ENGINE_H && ve != WG_ENTRY_DEMOLISHER) - continue; - float d = bot->GetDistance(v); if (d < bestDist) { bestDist = d; - bestVeh = v; + targetVehicle = v; + seekingFriendly = false; } } - - if (bestVeh) + // Escort role: follow friendly siege engines + else if (!isDefensiveRole && (role % 4 == 3) && isFriendly && d < 200.0f) { - // Move to vehicle; EnterVehicleAction will handle boarding if seats are available - pos.Set(bestVeh->GetPositionX(), bestVeh->GetPositionY(), bestVeh->GetPositionZ(), bot->GetMapId()); - posMap["bg objective"] = pos; - return true; + uint32 entry = v->GetEntry(); + if (entry == WG_ENTRY_SIEGE_ENGINE_A || entry == WG_ENTRY_SIEGE_ENGINE_H || entry == WG_ENTRY_DEMOLISHER) + { + if (d < bestDist) + { + bestDist = d; + targetVehicle = v; + seekingFriendly = true; + } + } } + } - // Fallback: move to tower on foot - pos.Set(strike.GetPositionX(), strike.GetPositionY(), strike.GetPositionZ(), bot->GetMapId()); + if (targetVehicle) + { + if (seekingFriendly) + { + // Follow friendly vehicle at escort distance + float rx, ry, rz; + bot->GetRandomPoint(targetVehicle->GetPosition(), frand(20.0f, 40.0f), rx, ry, rz); + pos.Set(rx, ry, rz, bot->GetMapId()); + } + else + { + // Attack enemy vehicle + pos.Set(targetVehicle->GetPositionX(), targetVehicle->GetPositionY(), targetVehicle->GetPositionZ(), bot->GetMapId()); + context->GetValue("current target")->Set(targetVehicle); + } posMap["bg objective"] = pos; return true; } } - // Prefer nearby banners that are capturable + // Continue to remaining priorities... + + // Priority 4: Victory condition push (Titan's Relic - similar to AV boss mechanics) + if (!isDefender && bot->GetDistance(WG_RELIC_POS) < 300.0f) { - GuidVector noLosObjects = AI_VALUE(GuidVector, "nearest game objects no los"); - GameObject* nearestBanner = nullptr; - float bestBannerDist = FLT_MAX; - for (ObjectGuid const& gid : noLosObjects) + // Only go for relic if we have enough support (like AV boss requirements) + uint32 friendlyNearRelic = 0; + GuidVector nearbyPlayers = AI_VALUE(GuidVector, "nearest friendly players"); + for (ObjectGuid const& pg : nearbyPlayers) { - GameObject* go = botAI->GetGameObject(gid); - if (!go) - continue; - if (std::find(vFlagsWG.begin(), vFlagsWG.end(), go->GetEntry()) == vFlagsWG.end()) - continue; - if (go->GetEntry() == 192829) // Relic handled separately - continue; - bool canUse = bot->CanUseBattlegroundObject(go); - float d = bot->GetDistance(go); - if ((canUse && d < bestBannerDist) || (!nearestBanner && d < bestBannerDist)) - { - bestBannerDist = d; - nearestBanner = go; - } + Unit* p = botAI->GetUnit(pg); + if (p && p->GetDistance(WG_RELIC_POS) < 100.0f) + friendlyNearRelic++; } - if (nearestBanner) + + if (friendlyNearRelic >= 2 || strategy == WG_STRATEGY_OFFENSIVE) { - pos.Set(nearestBanner->GetPositionX(), nearestBanner->GetPositionY(), nearestBanner->GetPositionZ(), bot->GetMapId()); + pos.Set(WG_RELIC_POS.GetPositionX(), WG_RELIC_POS.GetPositionY(), WG_RELIC_POS.GetPositionZ(), bot->GetMapId()); posMap["bg objective"] = pos; return true; } } - // If close to relic, go for it - if (bot->GetDistance(WG_RELIC_POS) < 200.0f) + // Priority 5: Enemy player engagement (similar to AB/EY enemy hunting) + if (urand(0, 99) < 15) // 15% chance for direct PvP engagement { - pos.Set(WG_RELIC_POS.GetPositionX(), WG_RELIC_POS.GetPositionY(), WG_RELIC_POS.GetPositionZ(), bot->GetMapId()); - posMap["bg objective"] = pos; - PositionInfo& siege = context->GetValue("position")->Get()["bg siege"]; - siege.Set(pos.x, pos.y, pos.z, pos.mapId); - return true; + if (Unit* enemy = AI_VALUE(Unit*, "enemy player target")) + { + float dist = bot->GetDistance(enemy); + if (dist < 400.0f && dist > 50.0f) // Not too close, not too far + { + pos.Set(enemy->GetPositionX(), enemy->GetPositionY(), enemy->GetPositionZ(), bot->GetMapId()); + posMap["bg objective"] = pos; + return true; + } + } } - // Escort role for attackers - uint32 role = context->GetValue("bg role")->Get(); - if (!isDefender && (role % 4 == 3)) + // Priority 6: Vehicle acquisition (similar to IC vehicle spawns) + if (shouldUseVehicles && !bot->GetVehicle()) { - GuidVector nearby = AI_VALUE(GuidVector, "nearest vehicles"); - Unit* best = nullptr; - float bestd = FLT_MAX; - for (ObjectGuid const& vg : nearby) + GuidVector nearVehicles = AI_VALUE(GuidVector, "nearest vehicles"); + Unit* bestVehicle = nullptr; + float bestVehDist = FLT_MAX; + + for (ObjectGuid const& vg : nearVehicles) { Unit* v = botAI->GetUnit(vg); if (!v || !v->IsFriendlyTo(bot)) continue; - uint32 ve = v->GetEntry(); - if (ve != WG_ENTRY_SIEGE_ENGINE_A && ve != WG_ENTRY_SIEGE_ENGINE_H && ve != WG_ENTRY_CATAPULT && ve != WG_ENTRY_DEMOLISHER) + + uint32 entry = v->GetEntry(); + if (entry != WG_ENTRY_SIEGE_ENGINE_A && entry != WG_ENTRY_SIEGE_ENGINE_H && + entry != WG_ENTRY_DEMOLISHER && entry != WG_ENTRY_CATAPULT) continue; + float d = bot->GetDistance(v); - if (d < bestd) + if (d < bestVehDist && d < 100.0f) { - bestd = d; - best = v; + bestVehDist = d; + bestVehicle = v; } } - if (best && bestd < 150.0f) + + if (bestVehicle) { - pos.Set(best->GetPositionX(), best->GetPositionY(), best->GetPositionZ(), bot->GetMapId()); + pos.Set(bestVehicle->GetPositionX(), bestVehicle->GetPositionY(), bestVehicle->GetPositionZ(), bot->GetMapId()); posMap["bg objective"] = pos; return true; } } - // Choose siege objective - Position siegeTarget = WG_GATE_POS; - if (!isDefender) + // Priority 7: Fallback positioning (similar to other BG fallback logic) + Position fallbackTarget; + if (isDefender) { - if (role % 3 == 1) - siegeTarget = WG_TOWER_S_POS; - else if (role % 3 == 2) - siegeTarget = (bot->GetTeamId() == TEAM_ALLIANCE ? WG_TOWER_W_POS : WG_TOWER_E_POS); + // Defenders spread around fortress + switch (role % 4) + { + case 0: fallbackTarget = WG_GATE_POS; break; + case 1: fallbackTarget = WG_RELIC_POS; break; + case 2: fallbackTarget = Position(5200.0f, 2900.0f, 420.0f, 0.0f); break; // North courtyard + case 3: fallbackTarget = Position(5200.0f, 2780.0f, 420.0f, 0.0f); break; // South courtyard + } } else { - siegeTarget = (role % 2 == 1) ? WG_GATE_POS : (bot->GetTeamId() == TEAM_ALLIANCE ? WG_TOWER_E_POS : WG_TOWER_W_POS); + // Attackers focus on siege positions + switch (role % 3) + { + case 0: fallbackTarget = WG_GATE_POS; break; + case 1: fallbackTarget = WG_TOWER_W_POS; break; + case 2: fallbackTarget = WG_TOWER_E_POS; break; + } } - if (isDefender && siegeTarget.GetPositionX() == WG_GATE_POS.GetPositionX() && !botAI->IsRanged(bot)) - { - float ox = (role % 2 == 0 ? -12.0f : 12.0f); - float oy = (role % 3 == 0 ? -6.0f : 6.0f); - pos.Set(WG_GATE_POS.GetPositionX() + ox, WG_GATE_POS.GetPositionY() + oy, WG_GATE_POS.GetPositionZ(), bot->GetMapId()); - } - else - { - pos.Set(siegeTarget.GetPositionX(), siegeTarget.GetPositionY(), siegeTarget.GetPositionZ(), bot->GetMapId()); - } + // Add randomization to avoid clustering + float rx, ry, rz; + bot->GetRandomPoint(fallbackTarget, frand(30.0f, 60.0f), rx, ry, rz); + pos.Set(rx, ry, rz, bot->GetMapId()); posMap["bg objective"] = pos; return true; } + } switch (bgType) { case BATTLEGROUND_AV: @@ -4692,6 +4779,7 @@ bool WintergraspQueueAction::isUseful() return false; } + // Auto-queue requires the auto-join setting if (!sPlayerbotAIConfig->randomBotAutoJoinWGQueue) { LOG_DEBUG("playerbots", "WG queue gated: randomBotAutoJoinWGQueue=0 for bot {}", bot->GetName()); @@ -4777,7 +4865,8 @@ bool WintergraspEnterWarAction::isUseful() return false; } - // If auto-join queue is disabled, only fill when real players joined (present in WG) + // If auto-join is disabled, only fill when real players joined (present in WG) + // This implements the "join when players participate" behavior if (!sPlayerbotAIConfig->randomBotAutoJoinWGQueue) { std::shared_lock lock(*HashMapHolder::GetLock()); @@ -4807,6 +4896,7 @@ bool WintergraspEnterWarAction::isUseful() LOG_DEBUG("playerbots", "WG enter ok: {} real players detected in WG zone; bot {} may fill", realCount, bot->GetName()); } } + // If auto-join is enabled, bots can join even without real players return true; } From d02d61e6903e0f62dc41216d62448a73fe6c8f2a Mon Sep 17 00:00:00 2001 From: Crow Date: Wed, 5 Nov 2025 07:53:16 -0600 Subject: [PATCH 137/151] Implement Magtheridon strategy (#1721) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit I'm marking this as a draft for now because I haven't done a detailed review of the code, but I'm posting it now in case anybody wants to give it a try. Here's what the strategy (should) do. ### **Channeler Phase** While you can probably AoE down all five Hellfire Channelers, that's more dicey with IP nerfs and it's no fun, so the strategy takes what would have still been considered an aggressive approach back in the day by (1) assigning the Main Tank to the first Channeler, (2) having Hunters misdirect two more Channelers to the MT, and (3) one Off Tank picking up each of the fourth and fifth Channelers and dragging them out of Shadow Volley Range from the main group. Sometimes the pull gets a little wonky and one of the OTs might end up with one of the Channelers that was intended for the MT, but it should work out in the end. DPS will move through Channelers from Square -> Star -> Circle -> Diamond -> Triangle. Once Square, Star, and Circle are down, the MT will go sit by Magtheridon and wait for him to become active instead of helping with the last two Channelers. I could have made the MT help with the fourth Channeler too, but it's not needed, and positioning to pick up Magtheridon after the third Channeler is a failsafe for low DPS groups that aren't able to get four down before Magtheridon breaks free. The top priority for Warlocks is to banish/fear the Burning Abyssals, and they will continue to do so even after Magtheridon becomes active (you are not supposed to kill the Abyssals; they have a gazillion HP and automatically despawn after a minute). Their next priority is to put Curse of Tongues on the Channelers. ### **Magtheridon Positioning** The MT will pick up Magtheridon and pull him (moving backwards because Magtheridon kind of hits like a bus) to a position up against the far wall. Ranged DPS will spread out from a point roughly in the center of the room, and Healers will spread out from a point that is a little closer to Magtheridon. I have not built in aoe avoidance (except for cube clickers, see below) because the general avoid aoe strategy seems to work fine for this fight. ### **Clicking Manticron Cubes** Now, the fun part. Bots will be assigned to clicking cubes by standard group selection order (reverse join order), but assignment is done via two passes. The first pass will look to select five ranged DPS bots that are _not_ Warlocks. This is because Warlocks may still be needed to keep Abyssals banished/feared and because Warlocks of all three specs put out by far the most damage of all ranged DPS at level 70 in pre-raid/T4 gear. If there are not five non-Warlock ranged DPS bots available, then the logic goes to the second pass, which can pick any bot that is not a Tank. Cube clicking works on a timer: 1. 48 seconds after Magtheridon breaks free, assigned cube clickers move near their cubes (but a few yards outside of interact distance). During this time, they should move around still to avoid Debris (by maintaining distance from the triggering NPC) and Conflagration (by maintaining distance from the triggering gameobject). Blast Nova is on a 54.35s to 55.4s timer, and I found 48s to always be ample time to get to the cubes, but YMMV so this is a good thing to test. Going to a cube too early not only takes away DPS but also risks more hazards appearing on/around the cube that will then cause problems when the cube needs to be clicked. 2. Blast Nova is a 2s cast, followed by a 10s channel (if not interrupted by the cubes). As soon as the cast begins, bots will move into interaction range and click the cube. Well, there is a randomized delay between 200ms (about the fastest possible human reaction time to visual stimuli) and 1500ms. It didn’t happen to me in a few runs, but it may be possible that the delay causes the raid to eat one tick of Blast Nova (I’m not sure if the first blast comes as soon as the channel starts). Again, another good thing to test, but also one tick is not going to kill anybody, and it’s arguably good to introduce some degree of imperfection. 3. Once Blast Nova stops channeling (i.e., all five cubes have been clicked and channeled simultaneously), bots will interrupt their cube clicking and go back to regularly scheduled activities. Again, I’ve introduced a randomized delay, this time between 200ms and 3000ms. Note that bots can easily be perfect at this—if I don’t do the randomized delay, they click and let go so fast that you can barely even see the beams appear. It’s so atrocious for immersion that I consider the lack of any randomization to be totally unacceptable for this strategy. 4. 48s after Blast Nova, bots will go back to their near-cube positions, rinse and repeat. If an assigned cube clicker dies, another bot should be immediately assigned. All bots in the raid track the same timer so the new bot should step into the prior bot’s shoes. Of course, if Blast Nova is about to go off and a clicker dies next to a cube, you’re probably wiping because I didn’t assign backups to stand in place. That’s too much of a dad guild-level strategy even for me. And that’s about it. Figuring out the cubes was a tremendous pain in the ass, but I’ve really enjoyed the learning process. --------- Co-authored-by: bash <31279994+hermensbas@users.noreply.github.com> --- src/PlayerbotAI.cpp | 2 + src/strategy/AiObjectContext.cpp | 4 + src/strategy/raids/RaidStrategyContext.h | 3 + .../RaidMagtheridonActionContext.h | 37 + .../magtheridon/RaidMagtheridonActions.cpp | 703 ++++++++++++++++++ .../magtheridon/RaidMagtheridonActions.h | 100 +++ .../magtheridon/RaidMagtheridonHelpers.cpp | 226 ++++++ .../magtheridon/RaidMagtheridonHelpers.h | 90 +++ .../RaidMagtheridonMultipliers.cpp | 71 ++ .../magtheridon/RaidMagtheridonMultipliers.h | 27 + .../magtheridon/RaidMagtheridonStrategy.cpp | 42 ++ .../magtheridon/RaidMagtheridonStrategy.h | 18 + .../RaidMagtheridonTriggerContext.h | 37 + .../magtheridon/RaidMagtheridonTriggers.cpp | 128 ++++ .../magtheridon/RaidMagtheridonTriggers.h | 77 ++ 15 files changed, 1565 insertions(+) create mode 100644 src/strategy/raids/magtheridon/RaidMagtheridonActionContext.h create mode 100644 src/strategy/raids/magtheridon/RaidMagtheridonActions.cpp create mode 100644 src/strategy/raids/magtheridon/RaidMagtheridonActions.h create mode 100644 src/strategy/raids/magtheridon/RaidMagtheridonHelpers.cpp create mode 100644 src/strategy/raids/magtheridon/RaidMagtheridonHelpers.h create mode 100644 src/strategy/raids/magtheridon/RaidMagtheridonMultipliers.cpp create mode 100644 src/strategy/raids/magtheridon/RaidMagtheridonMultipliers.h create mode 100644 src/strategy/raids/magtheridon/RaidMagtheridonStrategy.cpp create mode 100644 src/strategy/raids/magtheridon/RaidMagtheridonStrategy.h create mode 100644 src/strategy/raids/magtheridon/RaidMagtheridonTriggerContext.h create mode 100644 src/strategy/raids/magtheridon/RaidMagtheridonTriggers.cpp create mode 100644 src/strategy/raids/magtheridon/RaidMagtheridonTriggers.h diff --git a/src/PlayerbotAI.cpp b/src/PlayerbotAI.cpp index bf6b0a343a..48a259e1b3 100644 --- a/src/PlayerbotAI.cpp +++ b/src/PlayerbotAI.cpp @@ -1534,6 +1534,8 @@ void PlayerbotAI::ApplyInstanceStrategies(uint32 mapId, bool tellMaster) case 533: strategyName = "naxx"; // Naxxramas break; + case 544: + strategyName = "magtheridon"; // Magtheridon's Lair case 565: strategyName = "gruulslair"; // Gruul's Lair break; diff --git a/src/strategy/AiObjectContext.cpp b/src/strategy/AiObjectContext.cpp index 4c49fe4eac..7a1da0f8a6 100644 --- a/src/strategy/AiObjectContext.cpp +++ b/src/strategy/AiObjectContext.cpp @@ -39,6 +39,8 @@ #include "raids/blackwinglair/RaidBwlTriggerContext.h" #include "raids/karazhan/RaidKarazhanActionContext.h" #include "raids/karazhan/RaidKarazhanTriggerContext.h" +#include "raids/magtheridon/RaidMagtheridonActionContext.h" +#include "raids/magtheridon/RaidMagtheridonTriggerContext.h" #include "raids/gruulslair/RaidGruulsLairActionContext.h" #include "raids/gruulslair/RaidGruulsLairTriggerContext.h" #include "raids/naxxramas/RaidNaxxActionContext.h" @@ -113,6 +115,7 @@ void AiObjectContext::BuildSharedActionContexts(SharedNamedObjectContextList creators["mc"] = &RaidStrategyContext::mc; creators["bwl"] = &RaidStrategyContext::bwl; creators["karazhan"] = &RaidStrategyContext::karazhan; + creators["magtheridon"] = &RaidStrategyContext::magtheridon; creators["gruulslair"] = &RaidStrategyContext::gruulslair; creators["naxx"] = &RaidStrategyContext::naxx; creators["wotlk-os"] = &RaidStrategyContext::wotlk_os; @@ -39,6 +41,7 @@ class RaidStrategyContext : public NamedObjectContext static Strategy* mc(PlayerbotAI* botAI) { return new RaidMcStrategy(botAI); } static Strategy* bwl(PlayerbotAI* botAI) { return new RaidBwlStrategy(botAI); } static Strategy* karazhan(PlayerbotAI* botAI) { return new RaidKarazhanStrategy(botAI); } + static Strategy* magtheridon(PlayerbotAI* botAI) { return new RaidMagtheridonStrategy(botAI); } static Strategy* gruulslair(PlayerbotAI* botAI) { return new RaidGruulsLairStrategy(botAI); } static Strategy* naxx(PlayerbotAI* botAI) { return new RaidNaxxStrategy(botAI); } static Strategy* wotlk_os(PlayerbotAI* botAI) { return new RaidOsStrategy(botAI); } diff --git a/src/strategy/raids/magtheridon/RaidMagtheridonActionContext.h b/src/strategy/raids/magtheridon/RaidMagtheridonActionContext.h new file mode 100644 index 0000000000..48e8cfd351 --- /dev/null +++ b/src/strategy/raids/magtheridon/RaidMagtheridonActionContext.h @@ -0,0 +1,37 @@ +#ifndef _PLAYERBOT_RAIDMAGTHERIDONACTIONCONTEXT_H +#define _PLAYERBOT_RAIDMAGTHERIDONACTIONCONTEXT_H + +#include "RaidMagtheridonActions.h" +#include "NamedObjectContext.h" + +class RaidMagtheridonActionContext : public NamedObjectContext +{ +public: + RaidMagtheridonActionContext() + { + creators["magtheridon main tank attack first three channelers"] = &RaidMagtheridonActionContext::magtheridon_main_tank_attack_first_three_channelers; + creators["magtheridon first assist tank attack nw channeler"] = &RaidMagtheridonActionContext::magtheridon_first_assist_tank_attack_nw_channeler; + creators["magtheridon second assist tank attack ne channeler"] = &RaidMagtheridonActionContext::magtheridon_second_assist_tank_attack_ne_channeler; + creators["magtheridon misdirect hellfire channelers"] = &RaidMagtheridonActionContext::magtheridon_misdirect_hellfire_channelers; + creators["magtheridon assign dps priority"] = &RaidMagtheridonActionContext::magtheridon_assign_dps_priority; + creators["magtheridon warlock cc burning abyssal"] = &RaidMagtheridonActionContext::magtheridon_warlock_cc_burning_abyssal; + creators["magtheridon main tank position boss"] = &RaidMagtheridonActionContext::magtheridon_main_tank_position_boss; + creators["magtheridon spread ranged"] = &RaidMagtheridonActionContext::magtheridon_spread_ranged; + creators["magtheridon use manticron cube"] = &RaidMagtheridonActionContext::magtheridon_use_manticron_cube; + creators["magtheridon manage timers and assignments"] = &RaidMagtheridonActionContext::magtheridon_manage_timers_and_assignments; + } + +private: + static Action* magtheridon_main_tank_attack_first_three_channelers(PlayerbotAI* botAI) { return new MagtheridonMainTankAttackFirstThreeChannelersAction(botAI); } + static Action* magtheridon_first_assist_tank_attack_nw_channeler(PlayerbotAI* botAI) { return new MagtheridonFirstAssistTankAttackNWChannelerAction(botAI); } + static Action* magtheridon_second_assist_tank_attack_ne_channeler(PlayerbotAI* botAI) { return new MagtheridonSecondAssistTankAttackNEChannelerAction(botAI); } + static Action* magtheridon_misdirect_hellfire_channelers(PlayerbotAI* botAI) { return new MagtheridonMisdirectHellfireChannelers(botAI); } + static Action* magtheridon_assign_dps_priority(PlayerbotAI* botAI) { return new MagtheridonAssignDPSPriorityAction(botAI); } + static Action* magtheridon_warlock_cc_burning_abyssal(PlayerbotAI* botAI) { return new MagtheridonWarlockCCBurningAbyssalAction(botAI); } + static Action* magtheridon_main_tank_position_boss(PlayerbotAI* botAI) { return new MagtheridonMainTankPositionBossAction(botAI); } + static Action* magtheridon_spread_ranged(PlayerbotAI* botAI) { return new MagtheridonSpreadRangedAction(botAI); } + static Action* magtheridon_use_manticron_cube(PlayerbotAI* botAI) { return new MagtheridonUseManticronCubeAction(botAI); } + static Action* magtheridon_manage_timers_and_assignments(PlayerbotAI* botAI) { return new MagtheridonManageTimersAndAssignmentsAction(botAI); } +}; + +#endif diff --git a/src/strategy/raids/magtheridon/RaidMagtheridonActions.cpp b/src/strategy/raids/magtheridon/RaidMagtheridonActions.cpp new file mode 100644 index 0000000000..8efc0e0656 --- /dev/null +++ b/src/strategy/raids/magtheridon/RaidMagtheridonActions.cpp @@ -0,0 +1,703 @@ +#include "RaidMagtheridonActions.h" +#include "RaidMagtheridonHelpers.h" +#include "Creature.h" +#include "ObjectAccessor.h" +#include "ObjectGuid.h" +#include "Playerbots.h" + +using namespace MagtheridonHelpers; + +bool MagtheridonMainTankAttackFirstThreeChannelersAction::Execute(Event event) +{ + Unit* magtheridon = AI_VALUE2(Unit*, "find target", "magtheridon"); + if (!magtheridon) + return false; + + Creature* channelerSquare = GetChanneler(bot, SOUTH_CHANNELER); + if (channelerSquare && channelerSquare->IsAlive()) + MarkTargetWithSquare(bot, channelerSquare); + + Creature* channelerStar = GetChanneler(bot, WEST_CHANNELER); + if (channelerStar && channelerStar->IsAlive()) + MarkTargetWithStar(bot, channelerStar); + + Creature* channelerCircle = GetChanneler(bot, EAST_CHANNELER); + if (channelerCircle && channelerCircle->IsAlive()) + MarkTargetWithCircle(bot, channelerCircle); + + // After first three channelers are dead, wait for Magtheridon to activate + if ((!channelerSquare || !channelerSquare->IsAlive()) && + (!channelerStar || !channelerStar->IsAlive()) && + (!channelerCircle || !channelerCircle->IsAlive())) + { + const Location& position = MagtheridonsLairLocations::WaitingForMagtheridonPosition; + if (!bot->IsWithinDist2d(position.x, position.y, 2.0f)) + { + return MoveTo(bot->GetMapId(), position.x, position.y, position.z, false, false, false, false, + MovementPriority::MOVEMENT_COMBAT, true, false); + } + + bot->SetFacingTo(position.orientation); + return true; + } + + Creature* currentTarget = nullptr; + std::string rtiName; + if (channelerSquare && channelerSquare->IsAlive()) + { + currentTarget = channelerSquare; + rtiName = "square"; + } + else if (channelerStar && channelerStar->IsAlive()) + { + currentTarget = channelerStar; + rtiName = "star"; + } + else if (channelerCircle && channelerCircle->IsAlive()) + { + currentTarget = channelerCircle; + rtiName = "circle"; + } + + SetRtiTarget(botAI, rtiName, currentTarget); + + if (currentTarget && bot->GetVictim() != currentTarget) + return Attack(currentTarget); + + return false; +} + +bool MagtheridonFirstAssistTankAttackNWChannelerAction::Execute(Event event) +{ + Creature* channelerDiamond = GetChanneler(bot, NORTHWEST_CHANNELER); + if (!channelerDiamond || !channelerDiamond->IsAlive()) + return false; + + MarkTargetWithDiamond(bot, channelerDiamond); + SetRtiTarget(botAI, "diamond", channelerDiamond); + + if (bot->GetVictim() != channelerDiamond) + return Attack(channelerDiamond); + + if (channelerDiamond->GetVictim() == bot) + { + const Location& position = MagtheridonsLairLocations::NWChannelerTankPosition; + const float maxDistance = 3.0f; + + if (bot->GetExactDist2d(position.x, position.y) > maxDistance) + { + float dX = position.x - bot->GetPositionX(); + float dY = position.y - bot->GetPositionY(); + float dist = sqrt(dX * dX + dY * dY); + float moveX = bot->GetPositionX() + (dX / dist) * maxDistance; + float moveY = bot->GetPositionY() + (dY / dist) * maxDistance; + + return MoveTo(bot->GetMapId(), moveX, moveY, position.z, false, false, false, false, + MovementPriority::MOVEMENT_COMBAT, true, false); + } + } + + return false; +} + +bool MagtheridonSecondAssistTankAttackNEChannelerAction::Execute(Event event) +{ + Creature* channelerTriangle = GetChanneler(bot, NORTHEAST_CHANNELER); + if (!channelerTriangle || !channelerTriangle->IsAlive()) + return false; + + MarkTargetWithTriangle(bot, channelerTriangle); + SetRtiTarget(botAI, "triangle", channelerTriangle); + + if (bot->GetVictim() != channelerTriangle) + return Attack(channelerTriangle); + + if (channelerTriangle->GetVictim() == bot) + { + const Location& position = MagtheridonsLairLocations::NEChannelerTankPosition; + const float maxDistance = 3.0f; + + if (bot->GetExactDist2d(position.x, position.y) > maxDistance) + { + float dX = position.x - bot->GetPositionX(); + float dY = position.y - bot->GetPositionY(); + float dist = sqrt(dX * dX + dY * dY); + float moveX = bot->GetPositionX() + (dX / dist) * maxDistance; + float moveY = bot->GetPositionY() + (dY / dist) * maxDistance; + + return MoveTo(bot->GetMapId(), moveX, moveY, position.z, false, false, false, false, + MovementPriority::MOVEMENT_COMBAT, true, false); + } + } + + return false; +} + +// Misdirect West & East Channelers to Main Tank +bool MagtheridonMisdirectHellfireChannelers::Execute(Event event) +{ + Group* group = bot->GetGroup(); + if (!group) + return false; + + std::vector hunters; + for (GroupReference* ref = group->GetFirstMember(); ref; ref = ref->next()) + { + Player* member = ref->GetSource(); + if (member && member->IsAlive() && member->getClass() == CLASS_HUNTER && GET_PLAYERBOT_AI(member)) + hunters.push_back(member); + } + + int hunterIndex = -1; + for (size_t i = 0; i < hunters.size(); ++i) + { + if (hunters[i] == bot) + { + hunterIndex = static_cast(i); + break; + } + } + + Player* mainTank = nullptr; + for (GroupReference* ref = group->GetFirstMember(); ref; ref = ref->next()) + { + Player* member = ref->GetSource(); + if (member && member->IsAlive() && botAI->IsMainTank(member)) + { + mainTank = member; + break; + } + } + + Creature* channelerStar = GetChanneler(bot, WEST_CHANNELER); + Creature* channelerCircle = GetChanneler(bot, EAST_CHANNELER); + + switch (hunterIndex) + { + case 0: + if (mainTank && channelerStar && channelerStar->IsAlive() && + channelerStar->GetVictim() != mainTank) + { + if (botAI->CanCastSpell("misdirection", mainTank)) + return botAI->CastSpell("misdirection", mainTank); + + if (!bot->HasAura(SPELL_MISDIRECTION)) + return false; + + if (botAI->CanCastSpell("steady shot", channelerStar)) + return botAI->CastSpell("steady shot", channelerStar); + } + break; + + case 1: + if (mainTank && channelerCircle && channelerCircle->IsAlive() && + channelerCircle->GetVictim() != mainTank) + { + if (botAI->CanCastSpell("misdirection", mainTank)) + return botAI->CastSpell("misdirection", mainTank); + + if (!bot->HasAura(SPELL_MISDIRECTION)) + return false; + + if (botAI->CanCastSpell("steady shot", channelerCircle)) + return botAI->CastSpell("steady shot", channelerCircle); + } + break; + + default: + break; + } + + return false; +} + +bool MagtheridonAssignDPSPriorityAction::Execute(Event event) +{ + // Listed in order of priority + Creature* channelerSquare = GetChanneler(bot, SOUTH_CHANNELER); + if (channelerSquare && channelerSquare->IsAlive()) + { + SetRtiTarget(botAI, "square", channelerSquare); + + if (bot->GetTarget() != channelerSquare->GetGUID()) + { + bot->SetSelection(channelerSquare->GetGUID()); + return Attack(channelerSquare); + } + + return false; + } + + Creature* channelerStar = GetChanneler(bot, WEST_CHANNELER); + if (channelerStar && channelerStar->IsAlive()) + { + SetRtiTarget(botAI, "star", channelerStar); + + if (bot->GetTarget() != channelerStar->GetGUID()) + { + bot->SetSelection(channelerStar->GetGUID()); + return Attack(channelerStar); + } + + return false; + } + + Creature* channelerCircle = GetChanneler(bot, EAST_CHANNELER); + if (channelerCircle && channelerCircle->IsAlive()) + { + SetRtiTarget(botAI, "circle", channelerCircle); + + if (bot->GetTarget() != channelerCircle->GetGUID()) + { + bot->SetSelection(channelerCircle->GetGUID()); + return Attack(channelerCircle); + } + + return false; + } + + Creature* channelerDiamond = GetChanneler(bot, NORTHWEST_CHANNELER); + if (channelerDiamond && channelerDiamond->IsAlive()) + { + SetRtiTarget(botAI, "diamond", channelerDiamond); + + if (bot->GetTarget() != channelerDiamond->GetGUID()) + { + bot->SetSelection(channelerDiamond->GetGUID()); + return Attack(channelerDiamond); + } + + return false; + } + + Creature* channelerTriangle = GetChanneler(bot, NORTHEAST_CHANNELER); + if (channelerTriangle && channelerTriangle->IsAlive()) + { + SetRtiTarget(botAI, "triangle", channelerTriangle); + + if (bot->GetTarget() != channelerTriangle->GetGUID()) + { + bot->SetSelection(channelerTriangle->GetGUID()); + return Attack(channelerTriangle); + } + + return false; + } + + Unit* magtheridon = AI_VALUE2(Unit*, "find target", "magtheridon"); + if (magtheridon && !magtheridon->HasAura(SPELL_SHADOW_CAGE) && + (!channelerSquare || !channelerSquare->IsAlive()) && + (!channelerStar || !channelerStar->IsAlive()) && + (!channelerCircle || !channelerCircle->IsAlive()) && + (!channelerDiamond || !channelerDiamond->IsAlive()) && + (!channelerTriangle || !channelerTriangle->IsAlive())) + { + SetRtiTarget(botAI, "cross", magtheridon); + + if (bot->GetTarget() != magtheridon->GetGUID()) + { + bot->SetSelection(magtheridon->GetGUID()); + return Attack(magtheridon); + } + } + + return false; +} + +// Assign Burning Abyssals to Warlocks to Banish +// Burning Abyssals in excess of Warlocks in party will be Feared +bool MagtheridonWarlockCCBurningAbyssalAction::Execute(Event event) +{ + Group* group = bot->GetGroup(); + if (!group) + return false; + + const GuidVector& npcs = AI_VALUE(GuidVector, "nearest hostile npcs"); + + std::vector abyssals; + for (auto const& npc : npcs) + { + Unit* unit = botAI->GetUnit(npc); + if (unit && unit->GetEntry() == NPC_BURNING_ABYSSAL && unit->IsAlive()) + abyssals.push_back(unit); + } + + std::vector warlocks; + for (GroupReference* ref = group->GetFirstMember(); ref; ref = ref->next()) + { + Player* member = ref->GetSource(); + if (member && member->IsAlive() && member->getClass() == CLASS_WARLOCK && GET_PLAYERBOT_AI(member)) + warlocks.push_back(member); + } + + int warlockIndex = -1; + for (size_t i = 0; i < warlocks.size(); ++i) + { + if (warlocks[i] == bot) + { + warlockIndex = static_cast(i); + break; + } + } + + if (warlockIndex >= 0 && warlockIndex < abyssals.size()) + { + Unit* assignedAbyssal = abyssals[warlockIndex]; + if (!assignedAbyssal->HasAura(SPELL_BANISH) && botAI->CanCastSpell(SPELL_BANISH, assignedAbyssal, true)) + return botAI->CastSpell("banish", assignedAbyssal); + } + + for (size_t i = warlocks.size(); i < abyssals.size(); ++i) + { + Unit* excessAbyssal = abyssals[i]; + if (!excessAbyssal->HasAura(SPELL_BANISH) && !excessAbyssal->HasAura(SPELL_FEAR) && + botAI->CanCastSpell(SPELL_FEAR, excessAbyssal, true)) + return botAI->CastSpell("fear", excessAbyssal); + } + + return false; +} + +// Main tank will back up to the Northern point of the room +bool MagtheridonMainTankPositionBossAction::Execute(Event event) +{ + Unit* magtheridon = AI_VALUE2(Unit*, "find target", "magtheridon"); + if (!magtheridon) + return false; + + MarkTargetWithCross(bot, magtheridon); + SetRtiTarget(botAI, "cross", magtheridon); + + if (bot->GetVictim() != magtheridon) + return Attack(magtheridon); + + if (magtheridon->GetVictim() == bot) + { + const Location& position = MagtheridonsLairLocations::MagtheridonTankPosition; + const float maxDistance = 2.0f; + + if (bot->GetExactDist2d(position.x, position.y) > maxDistance) + { + float dX = position.x - bot->GetPositionX(); + float dY = position.y - bot->GetPositionY(); + float dist = sqrt(dX * dX + dY * dY); + float moveX = bot->GetPositionX() + (dX / dist) * maxDistance; + float moveY = bot->GetPositionY() + (dY / dist) * maxDistance; + + return MoveTo(bot->GetMapId(), moveX, moveY, position.z, false, false, false, false, + MovementPriority::MOVEMENT_COMBAT, true, true); + } + + bot->SetFacingTo(position.orientation); + } + + return false; +} + +// Ranged DPS will remain within 25 yards of the center of the room +// Healers will remain within 15 yards of a position that is between ranged DPS and the boss +std::unordered_map MagtheridonSpreadRangedAction::initialPositions; +std::unordered_map MagtheridonSpreadRangedAction::hasReachedInitialPosition; + +bool MagtheridonSpreadRangedAction::Execute(Event event) +{ + Group* group = bot->GetGroup(); + if (!group) + return false; + + // Wait for 6 seconds after Magtheridon activates to spread + const uint8 spreadWaitSeconds = 6; + auto it = magtheridonSpreadWaitTimer.find(bot->GetMapId()); + if (it == magtheridonSpreadWaitTimer.end() || + (time(nullptr) - it->second) < spreadWaitSeconds) + return false; + + auto cubeIt = botToCubeAssignment.find(bot->GetGUID()); + if (cubeIt != botToCubeAssignment.end()) + { + time_t now = time(nullptr); + auto timerIt = magtheridonBlastNovaTimer.find(bot->GetMapId()); + if (timerIt != magtheridonBlastNovaTimer.end()) + { + time_t lastBlastNova = timerIt->second; + if (now - lastBlastNova >= 49) + return false; + } + } + + std::vector members; + for (GroupReference* ref = group->GetFirstMember(); ref; ref = ref->next()) + { + Player* member = ref->GetSource(); + if (member && member->IsAlive()) + members.push_back(member); + } + + bool isHealer = botAI->IsHeal(bot); + const Location& center = isHealer + ? MagtheridonsLairLocations::HealerSpreadPosition + : MagtheridonsLairLocations::RangedSpreadPosition; + float maxSpreadRadius = isHealer ? 15.0f : 20.0f; + float centerX = center.x; + float centerY = center.y; + float centerZ = bot->GetPositionZ(); + const float radiusBuffer = 3.0f; + + if (!initialPositions.count(bot->GetGUID())) + { + auto it = std::find(members.begin(), members.end(), bot); + uint8 botIndex = (it != members.end()) ? std::distance(members.begin(), it) : 0; + uint8 count = members.size(); + + float angle = 2 * M_PI * botIndex / count; + float radius = static_cast(rand()) / RAND_MAX * maxSpreadRadius; + float targetX = centerX + radius * cos(angle); + float targetY = centerY + radius * sin(angle); + + initialPositions[bot->GetGUID()] = Position(targetX, targetY, centerZ); + hasReachedInitialPosition[bot->GetGUID()] = false; + } + + Position targetPosition = initialPositions[bot->GetGUID()]; + if (!hasReachedInitialPosition[bot->GetGUID()]) + { + if (!bot->IsWithinDist2d(targetPosition.GetPositionX(), targetPosition.GetPositionY(), 2.0f)) + { + float destX = targetPosition.GetPositionX(); + float destY = targetPosition.GetPositionY(); + float destZ = targetPosition.GetPositionZ(); + + if (!bot->GetMap()->CheckCollisionAndGetValidCoords(bot, bot->GetPositionX(), + bot->GetPositionY(), bot->GetPositionZ(), destX, destY, destZ)) + return false; + + bot->AttackStop(); + bot->InterruptNonMeleeSpells(false); + return MoveTo(bot->GetMapId(), destX, destY, destZ, false, false, false, false, + MovementPriority::MOVEMENT_COMBAT, true, false); + } + hasReachedInitialPosition[bot->GetGUID()] = true; + } + + float distToCenter = bot->GetExactDist2d(centerX, centerY); + + if (distToCenter > maxSpreadRadius + radiusBuffer) + { + float angle = static_cast(rand()) / RAND_MAX * 2.0f * M_PI; + float radius = static_cast(rand()) / RAND_MAX * maxSpreadRadius; + float targetX = centerX + radius * cos(angle); + float targetY = centerY + radius * sin(angle); + + if (bot->GetMap()->CheckCollisionAndGetValidCoords(bot, bot->GetPositionX(), bot->GetPositionY(), + bot->GetPositionZ(), targetX, targetY, centerZ)) + { + bot->AttackStop(); + bot->InterruptNonMeleeSpells(false); + return MoveTo(bot->GetMapId(), targetX, targetY, centerZ, false, false, false, false, + MovementPriority::MOVEMENT_COMBAT, true, false); + } + } + + return false; +} + +// For bots that are assigned to click cubes +// Magtheridon casts Blast Nova every 54.35 to 55.40s, with a 2s cast time +bool MagtheridonUseManticronCubeAction::Execute(Event event) +{ + Unit* magtheridon = AI_VALUE2(Unit*, "find target", "magtheridon"); + if (!magtheridon) + return false; + + auto it = botToCubeAssignment.find(bot->GetGUID()); + const CubeInfo& cubeInfo = it->second; + GameObject* cube = botAI->GetGameObject(cubeInfo.guid); + if (!cube) + return false; + + // Release cubes after Blast Nova is interrupted + if (HandleCubeRelease(magtheridon, cube)) + return true; + + // Check if cube logic should be active (49+ second rule) + if (!ShouldActivateCubeLogic(magtheridon)) + return false; + + // Handle active cube logic based on Blast Nova casting state + bool blastNovaActive = magtheridon->HasUnitState(UNIT_STATE_CASTING) && + magtheridon->FindCurrentSpellBySpellId(SPELL_BLAST_NOVA); + + if (!blastNovaActive) + // After 49 seconds, wait at safe distance from cube + return HandleWaitingPhase(cubeInfo); + else + // Blast Nova is casting - move to and click cube + return HandleCubeInteraction(cubeInfo, cube); + + return false; +} + +bool MagtheridonUseManticronCubeAction::HandleCubeRelease(Unit* magtheridon, GameObject* cube) +{ + if (bot->HasAura(SPELL_SHADOW_GRASP) && + !(magtheridon->HasUnitState(UNIT_STATE_CASTING) && + magtheridon->FindCurrentSpellBySpellId(SPELL_BLAST_NOVA))) + { + uint32 delay = urand(200, 3000); + botAI->AddTimedEvent( + [this] + { + botAI->Reset(); + }, + delay); + botAI->SetNextCheckDelay(delay + 50); + return true; + } + + return false; +} + +bool MagtheridonUseManticronCubeAction::ShouldActivateCubeLogic(Unit* magtheridon) +{ + auto timerIt = magtheridonBlastNovaTimer.find(bot->GetMapId()); + if (timerIt == magtheridonBlastNovaTimer.end()) + return false; + + time_t now = time(nullptr); + time_t lastBlastNova = timerIt->second; + + return (now - lastBlastNova >= 49); +} + +bool MagtheridonUseManticronCubeAction::HandleWaitingPhase(const CubeInfo& cubeInfo) +{ + const float safeWaitDistance = 8.0f; + float cubeDist = bot->GetExactDist2d(cubeInfo.x, cubeInfo.y); + + if (fabs(cubeDist - safeWaitDistance) > 1.0f) + { + for (int i = 0; i < 12; ++i) + { + float angle = i * M_PI / 6.0f; + float targetX = cubeInfo.x + cos(angle) * safeWaitDistance; + float targetY = cubeInfo.y + sin(angle) * safeWaitDistance; + float targetZ = bot->GetPositionZ(); + + if (IsSafeFromMagtheridonHazards(botAI, bot, targetX, targetY, targetZ)) + { + bot->AttackStop(); + bot->InterruptNonMeleeSpells(true); + return MoveTo(bot->GetMapId(), targetX, targetY, targetZ, false, false, false, false, + MovementPriority::MOVEMENT_COMBAT, true, false); + } + } + + float angle = static_cast(rand()) / RAND_MAX * 2.0f * M_PI; + float fallbackX = cubeInfo.x + cos(angle) * safeWaitDistance; + float fallbackY = cubeInfo.y + sin(angle) * safeWaitDistance; + float fallbackZ = bot->GetPositionZ(); + + return MoveTo(bot->GetMapId(), fallbackX, fallbackY, fallbackZ, false, false, false, false, + MovementPriority::MOVEMENT_COMBAT, true, false); + } + + return true; +} + +bool MagtheridonUseManticronCubeAction::HandleCubeInteraction(const CubeInfo& cubeInfo, GameObject* cube) +{ + const float interactDistance = 1.0f; + float cubeDist = bot->GetExactDist2d(cubeInfo.x, cubeInfo.y); + + if (cubeDist > interactDistance) + { + if (cubeDist <= interactDistance + 1.0f) + { + uint32 delay = urand(200, 1500); + botAI->AddTimedEvent( + [this, cube] + { + bot->StopMoving(); + cube->Use(bot); + }, + delay); + botAI->SetNextCheckDelay(delay + 50); + return true; + } + + float angle = atan2(cubeInfo.y - bot->GetPositionY(), cubeInfo.x - bot->GetPositionX()); + float targetX = cubeInfo.x - cos(angle) * interactDistance; + float targetY = cubeInfo.y - sin(angle) * interactDistance; + float targetZ = bot->GetPositionZ(); + + bot->AttackStop(); + bot->InterruptNonMeleeSpells(true); + return MoveTo(bot->GetMapId(), targetX, targetY, targetZ, false, false, false, false, + MovementPriority::MOVEMENT_FORCED, true, false); + } + + return false; +} + +// The Blast Nova timer resets when Magtheridon stops casting it, which is needed to ensure that bots use cubes. +// However, Magtheridon's Blast Nova cooldown actually runs from when he starts casting it. This means that if a Blast Nova +// is not interrupted or takes too long to interrupt, the timer will be thrown off for the rest of the encounter. +// Correcting this issue is complicated and probably would need some rewriting--I have not done so and +// and view the current solution as sufficient since in TBC a missed Blast Nova would be a guaranteed wipe anyway. +bool MagtheridonManageTimersAndAssignmentsAction::Execute(Event event) +{ + Unit* magtheridon = AI_VALUE2(Unit*, "find target", "magtheridon"); + if (!magtheridon) + return false; + + uint32 mapId = magtheridon->GetMapId(); + + bool blastNovaActive = magtheridon->HasUnitState(UNIT_STATE_CASTING) && + magtheridon->FindCurrentSpellBySpellId(SPELL_BLAST_NOVA); + bool lastBlastNova = lastBlastNovaState[mapId]; + + if (lastBlastNova && !blastNovaActive && IsMapIDTimerManager(botAI, bot)) + magtheridonBlastNovaTimer[mapId] = time(nullptr); + lastBlastNovaState[mapId] = blastNovaActive; + + if (IsMapIDTimerManager(botAI, bot)) + { + if (!magtheridon->HasAura(SPELL_SHADOW_CAGE)) + { + if (magtheridonSpreadWaitTimer.find(mapId) == magtheridonSpreadWaitTimer.end()) + magtheridonSpreadWaitTimer[mapId] = time(nullptr); + + if (magtheridonBlastNovaTimer.find(mapId) == magtheridonBlastNovaTimer.end()) + magtheridonBlastNovaTimer[mapId] = time(nullptr); + + if (magtheridonAggroWaitTimer.find(mapId) == magtheridonAggroWaitTimer.end()) + magtheridonAggroWaitTimer[mapId] = time(nullptr); + } + } + + if (magtheridon->HasAura(SPELL_SHADOW_CAGE)) + { + if (!MagtheridonSpreadRangedAction::initialPositions.empty()) + MagtheridonSpreadRangedAction::initialPositions.clear(); + + if (!MagtheridonSpreadRangedAction::hasReachedInitialPosition.empty()) + MagtheridonSpreadRangedAction::hasReachedInitialPosition.clear(); + + if (!botToCubeAssignment.empty()) + botToCubeAssignment.clear(); + + if (IsMapIDTimerManager(botAI, bot)) + { + if (magtheridonSpreadWaitTimer.find(mapId) != magtheridonSpreadWaitTimer.end()) + magtheridonSpreadWaitTimer.erase(mapId); + + if (magtheridonBlastNovaTimer.find(mapId) != magtheridonBlastNovaTimer.end()) + magtheridonBlastNovaTimer.erase(mapId); + + if (magtheridonAggroWaitTimer.find(mapId) != magtheridonAggroWaitTimer.end()) + magtheridonAggroWaitTimer.erase(mapId); + } + } + + return false; +} diff --git a/src/strategy/raids/magtheridon/RaidMagtheridonActions.h b/src/strategy/raids/magtheridon/RaidMagtheridonActions.h new file mode 100644 index 0000000000..6c4ed84c22 --- /dev/null +++ b/src/strategy/raids/magtheridon/RaidMagtheridonActions.h @@ -0,0 +1,100 @@ +#ifndef _PLAYERBOT_RAIDMAGTHERIDONACTIONS_H +#define _PLAYERBOT_RAIDMAGTHERIDONACTIONS_H + +#include "RaidMagtheridonHelpers.h" +#include "Action.h" +#include "AttackAction.h" +#include "MovementActions.h" + +using namespace MagtheridonHelpers; + +class MagtheridonMainTankAttackFirstThreeChannelersAction : public AttackAction +{ +public: + MagtheridonMainTankAttackFirstThreeChannelersAction(PlayerbotAI* botAI, std::string const name = "magtheridon main tank attack first three channelers") : AttackAction(botAI, name) {}; + + bool Execute(Event event) override; +}; + +class MagtheridonFirstAssistTankAttackNWChannelerAction : public AttackAction +{ +public: + MagtheridonFirstAssistTankAttackNWChannelerAction(PlayerbotAI* botAI, std::string const name = "magtheridon first assist tank attack nw channeler") : AttackAction(botAI, name) {}; + + bool Execute(Event event) override; +}; + +class MagtheridonSecondAssistTankAttackNEChannelerAction : public AttackAction +{ +public: + MagtheridonSecondAssistTankAttackNEChannelerAction(PlayerbotAI* botAI, std::string const name = "magtheridon second assist tank attack ne channeler") : AttackAction(botAI, name) {}; + + bool Execute(Event event) override; +}; + +class MagtheridonMisdirectHellfireChannelers : public AttackAction +{ +public: + MagtheridonMisdirectHellfireChannelers(PlayerbotAI* botAI, std::string const name = "magtheridon misdirect hellfire channelers") : AttackAction(botAI, name) {}; + + bool Execute(Event event) override; +}; + +class MagtheridonAssignDPSPriorityAction : public AttackAction +{ +public: + MagtheridonAssignDPSPriorityAction(PlayerbotAI* botAI, std::string const name = "magtheridon assign dps priority") : AttackAction(botAI, name) {}; + + bool Execute(Event event) override; +}; + +class MagtheridonWarlockCCBurningAbyssalAction : public AttackAction +{ +public: + MagtheridonWarlockCCBurningAbyssalAction(PlayerbotAI* botAI, std::string const name = "magtheridon warlock cc burning abyssal") : AttackAction(botAI, name) {}; + + bool Execute(Event event) override; +}; + +class MagtheridonMainTankPositionBossAction : public AttackAction +{ +public: + MagtheridonMainTankPositionBossAction(PlayerbotAI* botAI, std::string const name = "magtheridon main tank position boss") : AttackAction(botAI, name) {}; + + bool Execute(Event event) override; +}; + +class MagtheridonSpreadRangedAction : public MovementAction +{ +public: + static std::unordered_map initialPositions; + static std::unordered_map hasReachedInitialPosition; + + MagtheridonSpreadRangedAction(PlayerbotAI* botAI, std::string const name = "magtheridon spread ranged") : MovementAction(botAI, name) {}; + + bool Execute(Event event) override; +}; + +class MagtheridonUseManticronCubeAction : public MovementAction +{ +public: + MagtheridonUseManticronCubeAction(PlayerbotAI* botAI, std::string const name = "magtheridon use manticron cube") : MovementAction(botAI, name) {}; + + bool Execute(Event event) override; + +private: + bool HandleCubeRelease(Unit* magtheridon, GameObject* cube); + bool ShouldActivateCubeLogic(Unit* magtheridon); + bool HandleWaitingPhase(const CubeInfo& cubeInfo); + bool HandleCubeInteraction(const CubeInfo& cubeInfo, GameObject* cube); +}; + +class MagtheridonManageTimersAndAssignmentsAction : public Action +{ +public: + MagtheridonManageTimersAndAssignmentsAction(PlayerbotAI* botAI, std::string const name = "magtheridon manage timers and assignments") : Action(botAI, name) {}; + + bool Execute(Event event) override; +}; + +#endif diff --git a/src/strategy/raids/magtheridon/RaidMagtheridonHelpers.cpp b/src/strategy/raids/magtheridon/RaidMagtheridonHelpers.cpp new file mode 100644 index 0000000000..8a0d693cf5 --- /dev/null +++ b/src/strategy/raids/magtheridon/RaidMagtheridonHelpers.cpp @@ -0,0 +1,226 @@ +#include "RaidMagtheridonHelpers.h" +#include "Creature.h" +#include "GameObject.h" +#include "GroupReference.h" +#include "Map.h" +#include "ObjectGuid.h" +#include "Playerbots.h" + +namespace MagtheridonHelpers +{ + namespace MagtheridonsLairLocations + { + const Location WaitingForMagtheridonPosition = { 1.359f, 2.048f, -0.406f, 3.135f }; + const Location MagtheridonTankPosition = { 22.827f, 2.105f, -0.406f, 3.135f }; + const Location NWChannelerTankPosition = { -11.764f, 30.818f, -0.411f, 0.0f }; + const Location NEChannelerTankPosition = { -12.490f, -26.211f, -0.411f, 0.0f }; + const Location RangedSpreadPosition = { -14.890f, 1.995f, -0.406f, 0.0f }; + const Location HealerSpreadPosition = { -2.265f, 1.874f, -0.404f, 0.0f }; + } + + // Identify channelers by their database GUIDs + Creature* GetChanneler(Player* bot, uint32 dbGuid) + { + Map* map = bot->GetMap(); + if (!map) + return nullptr; + + auto it = map->GetCreatureBySpawnIdStore().find(dbGuid); + if (it == map->GetCreatureBySpawnIdStore().end()) + return nullptr; + + return it->second; + } + + void MarkTargetWithIcon(Player* bot, Unit* target, uint8 iconId) + { + Group* group = bot->GetGroup(); + if (!target || !group) + return; + + ObjectGuid currentGuid = group->GetTargetIcon(iconId); + if (currentGuid != target->GetGUID()) + group->SetTargetIcon(iconId, bot->GetGUID(), target->GetGUID()); + } + + void SetRtiTarget(PlayerbotAI* botAI, const std::string& rtiName, Unit* target) + { + if (!target) + return; + + std::string currentRti = botAI->GetAiObjectContext()->GetValue("rti")->Get(); + Unit* currentTarget = botAI->GetAiObjectContext()->GetValue("rti target")->Get(); + + if (currentRti != rtiName || currentTarget != target) + { + botAI->GetAiObjectContext()->GetValue("rti")->Set(rtiName); + botAI->GetAiObjectContext()->GetValue("rti target")->Set(target); + } + } + + void MarkTargetWithSquare(Player* bot, Unit* target) + { + MarkTargetWithIcon(bot, target, RtiTargetValue::squareIndex); + } + + void MarkTargetWithStar(Player* bot, Unit* target) + { + MarkTargetWithIcon(bot, target, RtiTargetValue::starIndex); + } + + void MarkTargetWithCircle(Player* bot, Unit* target) + { + MarkTargetWithIcon(bot, target, RtiTargetValue::circleIndex); + } + + void MarkTargetWithDiamond(Player* bot, Unit* target) + { + MarkTargetWithIcon(bot, target, RtiTargetValue::diamondIndex); + } + + void MarkTargetWithTriangle(Player* bot, Unit* target) + { + MarkTargetWithIcon(bot, target, RtiTargetValue::triangleIndex); + } + + void MarkTargetWithCross(Player* bot, Unit* target) + { + MarkTargetWithIcon(bot, target, RtiTargetValue::crossIndex); + } + + const std::vector MANTICRON_CUBE_DB_GUIDS = { 43157, 43158, 43159, 43160, 43161 }; + + // Get the positions of all Manticron Cubes by their database GUIDs + std::vector GetAllCubeInfosByDbGuids(Map* map, const std::vector& cubeDbGuids) + { + std::vector cubes; + if (!map) + return cubes; + + for (uint32 dbGuid : cubeDbGuids) + { + auto bounds = map->GetGameObjectBySpawnIdStore().equal_range(dbGuid); + if (bounds.first == bounds.second) + continue; + + GameObject* go = bounds.first->second; + if (!go) + continue; + + CubeInfo info; + info.guid = go->GetGUID(); + info.x = go->GetPositionX(); + info.y = go->GetPositionY(); + info.z = go->GetPositionZ(); + cubes.push_back(info); + } + + return cubes; + } + + std::unordered_map botToCubeAssignment; + + void AssignBotsToCubesByGuidAndCoords(Group* group, const std::vector& cubes, PlayerbotAI* botAI) + { + botToCubeAssignment.clear(); + if (!group) + return; + + size_t cubeIndex = 0; + std::vector candidates; + + // Assign ranged DPS (excluding Warlocks) to cubes first + for (GroupReference* ref = group->GetFirstMember(); ref && cubeIndex < cubes.size(); ref = ref->next()) + { + Player* member = ref->GetSource(); + if (!member || !member->IsAlive() || !botAI->IsRangedDps(member, true) || + member->getClass() == CLASS_WARLOCK || !GET_PLAYERBOT_AI(member)) + continue; + + candidates.push_back(member); + if (candidates.size() >= cubes.size()) + break; + } + + // If there are still cubes left, assign any other non-tank bots + if (candidates.size() < cubes.size()) + { + for (GroupReference* ref = group->GetFirstMember(); + ref && candidates.size() < cubes.size(); ref = ref->next()) + { + Player* member = ref->GetSource(); + if (!member || !member->IsAlive() || !GET_PLAYERBOT_AI(member) || botAI->IsTank(member)) + continue; + + if (std::find(candidates.begin(), candidates.end(), member) == candidates.end()) + candidates.push_back(member); + } + } + + for (Player* member : candidates) + { + if (cubeIndex >= cubes.size()) + break; + + if (!member || !member->IsAlive()) + continue; + + botToCubeAssignment[member->GetGUID()] = cubes[cubeIndex++]; + } + } + + std::unordered_map lastBlastNovaState; + std::unordered_map magtheridonBlastNovaTimer; + std::unordered_map magtheridonSpreadWaitTimer; + std::unordered_map magtheridonAggroWaitTimer; + + bool IsSafeFromMagtheridonHazards(PlayerbotAI* botAI, Player* bot, float x, float y, float z) + { + // Debris + std::vector debrisHazards; + const GuidVector npcs = botAI->GetAiObjectContext()->GetValue("nearest npcs")->Get(); + for (auto const& npcGuid : npcs) + { + Unit* unit = botAI->GetUnit(npcGuid); + if (!unit || unit->GetEntry() != NPC_TARGET_TRIGGER) + continue; + debrisHazards.push_back(unit); + } + for (Unit* hazard : debrisHazards) + { + float dist = std::sqrt(std::pow(x - hazard->GetPositionX(), 2) + std::pow(y - hazard->GetPositionY(), 2)); + if (dist < 9.0f) + return false; + } + + // Conflagration + GuidVector gos = *botAI->GetAiObjectContext()->GetValue("nearest game objects"); + for (auto const& goGuid : gos) + { + GameObject* go = botAI->GetGameObject(goGuid); + if (!go || go->GetEntry() != GO_BLAZE) + continue; + + float dist = std::sqrt(std::pow(x - go->GetPositionX(), 2) + std::pow(y - go->GetPositionY(), 2)); + if (dist < 5.0f) + return false; + } + + return true; + } + + bool IsMapIDTimerManager(PlayerbotAI* botAI, Player* bot) + { + if (Group* group = bot->GetGroup()) + { + for (GroupReference* ref = group->GetFirstMember(); ref; ref = ref->next()) + { + Player* member = ref->GetSource(); + if (member && member->IsAlive() && !botAI->IsMainTank(member) && GET_PLAYERBOT_AI(member)) + return member == bot; + } + } + + return true; + } +} diff --git a/src/strategy/raids/magtheridon/RaidMagtheridonHelpers.h b/src/strategy/raids/magtheridon/RaidMagtheridonHelpers.h new file mode 100644 index 0000000000..21fd9d459c --- /dev/null +++ b/src/strategy/raids/magtheridon/RaidMagtheridonHelpers.h @@ -0,0 +1,90 @@ +#ifndef _PLAYERBOT_RAIDMAGTHERIDONHELPERS_H +#define _PLAYERBOT_RAIDMAGTHERIDONHELPERS_H + +#include +#include +#include + +#include "Group.h" +#include "ObjectGuid.h" +#include "PlayerbotAI.h" +#include "RtiTargetValue.h" + +namespace MagtheridonHelpers +{ + enum MagtheridonSpells + { + // Magtheridon + SPELL_SHADOW_CAGE = 30205, + SPELL_BLAST_NOVA = 30616, + SPELL_SHADOW_GRASP = 30410, + + // Warlock + SPELL_BANISH = 18647, + SPELL_FEAR = 6215, + + // Hunter + SPELL_MISDIRECTION = 34477, + }; + + enum MagtheridonNPCs + { + NPC_BURNING_ABYSSAL = 17454, + NPC_TARGET_TRIGGER = 17474, + }; + + enum MagtheridonObjects + { + GO_BLAZE = 181832, + }; + + constexpr uint32 SOUTH_CHANNELER = 90978; + constexpr uint32 WEST_CHANNELER = 90979; + constexpr uint32 NORTHWEST_CHANNELER = 90980; + constexpr uint32 EAST_CHANNELER = 90982; + constexpr uint32 NORTHEAST_CHANNELER = 90981; + + Creature* GetChanneler(Player* bot, uint32 dbGuid); + void MarkTargetWithIcon(Player* bot, Unit* target, uint8 iconId); + void MarkTargetWithSquare(Player* bot, Unit* target); + void MarkTargetWithStar(Player* bot, Unit* target); + void MarkTargetWithCircle(Player* bot, Unit* target); + void MarkTargetWithDiamond(Player* bot, Unit* target); + void MarkTargetWithTriangle(Player* bot, Unit* target); + void MarkTargetWithCross(Player* bot, Unit* target); + void SetRtiTarget(PlayerbotAI* botAI, const std::string& rtiName, Unit* target); + bool IsSafeFromMagtheridonHazards(PlayerbotAI* botAI, Player* bot, float x, float y, float z); + bool IsMapIDTimerManager(PlayerbotAI* botAI, Player* bot); + + struct Location + { + float x, y, z, orientation; + }; + + namespace MagtheridonsLairLocations + { + extern const Location WaitingForMagtheridonPosition; + extern const Location MagtheridonTankPosition; + extern const Location NWChannelerTankPosition; + extern const Location NEChannelerTankPosition; + extern const Location RangedSpreadPosition; + extern const Location HealerSpreadPosition; + } + + struct CubeInfo + { + ObjectGuid guid; + float x, y, z; + }; + + extern const std::vector MANTICRON_CUBE_DB_GUIDS; + extern std::unordered_map botToCubeAssignment; + std::vector GetAllCubeInfosByDbGuids(Map* map, const std::vector& cubeDbGuids); + void AssignBotsToCubesByGuidAndCoords(Group* group, const std::vector& cubes, PlayerbotAI* botAI); + extern std::unordered_map lastBlastNovaState; + extern std::unordered_map magtheridonBlastNovaTimer; + extern std::unordered_map magtheridonSpreadWaitTimer; + extern std::unordered_map magtheridonAggroWaitTimer; +} + +#endif diff --git a/src/strategy/raids/magtheridon/RaidMagtheridonMultipliers.cpp b/src/strategy/raids/magtheridon/RaidMagtheridonMultipliers.cpp new file mode 100644 index 0000000000..c32ce152cd --- /dev/null +++ b/src/strategy/raids/magtheridon/RaidMagtheridonMultipliers.cpp @@ -0,0 +1,71 @@ +#include +#include + +#include "RaidMagtheridonMultipliers.h" +#include "RaidMagtheridonActions.h" +#include "RaidMagtheridonHelpers.h" +#include "ChooseTargetActions.h" +#include "GenericSpellActions.h" +#include "Playerbots.h" +#include "WarlockActions.h" + +using namespace MagtheridonHelpers; + +// Don't do anything other than clicking cubes when Magtheridon is casting Blast Nova +float MagtheridonUseManticronCubeMultiplier::GetValue(Action* action) +{ + Unit* magtheridon = AI_VALUE2(Unit*, "find target", "magtheridon"); + if (!magtheridon) + return 1.0f; + + if (magtheridon->HasUnitState(UNIT_STATE_CASTING) && + magtheridon->FindCurrentSpellBySpellId(SPELL_BLAST_NOVA)) + { + auto it = botToCubeAssignment.find(bot->GetGUID()); + if (it != botToCubeAssignment.end()) + { + if (dynamic_cast(action)) + return 1.0f; + + return 0.0f; + } + } + + return 1.0f; +} + +// Bots will wait for 6 seconds after Magtheridon becomes attackable before engaging +float MagtheridonWaitToAttackMultiplier::GetValue(Action* action) +{ + Unit* magtheridon = AI_VALUE2(Unit*, "find target", "magtheridon"); + if (!magtheridon || magtheridon->HasAura(SPELL_SHADOW_CAGE)) + return 1.0f; + + const uint8 aggroWaitSeconds = 6; + auto it = magtheridonAggroWaitTimer.find(bot->GetMapId()); + if (it == magtheridonAggroWaitTimer.end() || + (time(nullptr) - it->second) < aggroWaitSeconds) + { + if (!botAI->IsMainTank(bot) && (dynamic_cast(action) || + (!botAI->IsHeal(bot) && dynamic_cast(action)))) + return 0.0f; + } + + return 1.0f; +} + +// No tank assist for offtanks during the channeler phase +// So they don't try to pull channelers from each other or the main tank +float MagtheridonDisableOffTankAssistMultiplier::GetValue(Action* action) +{ + Unit* magtheridon = AI_VALUE2(Unit*, "find target", "magtheridon"); + Unit* channeler = AI_VALUE2(Unit*, "find target", "hellfire channeler"); + if (!magtheridon) + return 1.0f; + + if ((botAI->IsAssistTankOfIndex(bot, 0) || botAI->IsAssistTankOfIndex(bot, 1)) && + dynamic_cast(action)) + return 0.0f; + + return 1.0f; +} diff --git a/src/strategy/raids/magtheridon/RaidMagtheridonMultipliers.h b/src/strategy/raids/magtheridon/RaidMagtheridonMultipliers.h new file mode 100644 index 0000000000..2cce516b6f --- /dev/null +++ b/src/strategy/raids/magtheridon/RaidMagtheridonMultipliers.h @@ -0,0 +1,27 @@ +#ifndef _PLAYERBOT_RAIDMAGTHERIDONMULTIPLIERS_H +#define _PLAYERBOT_RAIDMAGTHERIDONMULTIPLIERS_H + +#include "Multiplier.h" + +class MagtheridonUseManticronCubeMultiplier : public Multiplier +{ +public: + MagtheridonUseManticronCubeMultiplier(PlayerbotAI* botAI) : Multiplier(botAI, "magtheridon use manticron cube multiplier") {} + float GetValue(Action* action) override; +}; + +class MagtheridonWaitToAttackMultiplier : public Multiplier +{ +public: + MagtheridonWaitToAttackMultiplier(PlayerbotAI* botAI) : Multiplier(botAI, "magtheridon wait to attack multiplier") {} + float GetValue(Action* action) override; +}; + +class MagtheridonDisableOffTankAssistMultiplier : public Multiplier +{ +public: + MagtheridonDisableOffTankAssistMultiplier(PlayerbotAI* botAI) : Multiplier(botAI, "magtheridon disable off tank assist multiplier") {} + float GetValue(Action* action) override; +}; + +#endif diff --git a/src/strategy/raids/magtheridon/RaidMagtheridonStrategy.cpp b/src/strategy/raids/magtheridon/RaidMagtheridonStrategy.cpp new file mode 100644 index 0000000000..27281dde84 --- /dev/null +++ b/src/strategy/raids/magtheridon/RaidMagtheridonStrategy.cpp @@ -0,0 +1,42 @@ +#include "RaidMagtheridonStrategy.h" +#include "RaidMagtheridonMultipliers.h" + +void RaidMagtheridonStrategy::InitTriggers(std::vector& triggers) +{ + triggers.push_back(new TriggerNode("magtheridon incoming blast nova", NextAction::array(0, + new NextAction("magtheridon use manticron cube", ACTION_EMERGENCY + 10), nullptr))); + + triggers.push_back(new TriggerNode("magtheridon need to manage timers and assignments", NextAction::array(0, + new NextAction("magtheridon manage timers and assignments", ACTION_EMERGENCY + 1), nullptr))); + + triggers.push_back(new TriggerNode("magtheridon burning abyssal spawned", NextAction::array(0, + new NextAction("magtheridon warlock cc burning abyssal", ACTION_RAID + 3), nullptr))); + + triggers.push_back(new TriggerNode("magtheridon boss engaged by ranged", NextAction::array(0, + new NextAction("magtheridon spread ranged", ACTION_RAID + 2), nullptr))); + + triggers.push_back(new TriggerNode("magtheridon pulling west and east channelers", NextAction::array(0, + new NextAction("magtheridon misdirect hellfire channelers", ACTION_RAID + 2), nullptr))); + + triggers.push_back(new TriggerNode("magtheridon boss engaged by main tank", NextAction::array(0, + new NextAction("magtheridon main tank position boss", ACTION_RAID + 2), nullptr))); + + triggers.push_back(new TriggerNode("magtheridon first three channelers engaged by main tank", NextAction::array(0, + new NextAction("magtheridon main tank attack first three channelers", ACTION_RAID + 1), nullptr))); + + triggers.push_back(new TriggerNode("magtheridon nw channeler engaged by first assist tank", NextAction::array(0, + new NextAction("magtheridon first assist tank attack nw channeler", ACTION_RAID + 1), nullptr))); + + triggers.push_back(new TriggerNode("magtheridon ne channeler engaged by second assist tank", NextAction::array(0, + new NextAction("magtheridon second assist tank attack ne channeler", ACTION_RAID + 1), nullptr))); + + triggers.push_back(new TriggerNode("magtheridon determining kill order", NextAction::array(0, + new NextAction("magtheridon assign dps priority", ACTION_RAID + 1), nullptr))); +} + +void RaidMagtheridonStrategy::InitMultipliers(std::vector& multipliers) +{ + multipliers.push_back(new MagtheridonUseManticronCubeMultiplier(botAI)); + multipliers.push_back(new MagtheridonWaitToAttackMultiplier(botAI)); + multipliers.push_back(new MagtheridonDisableOffTankAssistMultiplier(botAI)); +} diff --git a/src/strategy/raids/magtheridon/RaidMagtheridonStrategy.h b/src/strategy/raids/magtheridon/RaidMagtheridonStrategy.h new file mode 100644 index 0000000000..7b8ab8f9b1 --- /dev/null +++ b/src/strategy/raids/magtheridon/RaidMagtheridonStrategy.h @@ -0,0 +1,18 @@ +#ifndef _PLAYERBOT_RAIDMAGTHERIDONSTRATEGY_H +#define _PLAYERBOT_RAIDMAGTHERIDONSTRATEGY_H + +#include "Strategy.h" +#include "Multiplier.h" + +class RaidMagtheridonStrategy : public Strategy +{ +public: + RaidMagtheridonStrategy(PlayerbotAI* botAI) : Strategy(botAI) {} + + std::string const getName() override { return "magtheridon"; } + + void InitTriggers(std::vector& triggers) override; + void InitMultipliers(std::vector& multipliers) override; +}; + +#endif diff --git a/src/strategy/raids/magtheridon/RaidMagtheridonTriggerContext.h b/src/strategy/raids/magtheridon/RaidMagtheridonTriggerContext.h new file mode 100644 index 0000000000..525fe496e8 --- /dev/null +++ b/src/strategy/raids/magtheridon/RaidMagtheridonTriggerContext.h @@ -0,0 +1,37 @@ +#ifndef _PLAYERBOT_RAIDMAGTHERIDONTRIGGERCONTEXT_H +#define _PLAYERBOT_RAIDMAGTHERIDONTRIGGERCONTEXT_H + +#include "RaidMagtheridonTriggers.h" +#include "AiObjectContext.h" + +class RaidMagtheridonTriggerContext : public NamedObjectContext +{ +public: + RaidMagtheridonTriggerContext() : NamedObjectContext() + { + creators["magtheridon first three channelers engaged by main tank"] = &RaidMagtheridonTriggerContext::magtheridon_first_three_channelers_engaged_by_main_tank; + creators["magtheridon nw channeler engaged by first assist tank"] = &RaidMagtheridonTriggerContext::magtheridon_nw_channeler_engaged_by_first_assist_tank; + creators["magtheridon ne channeler engaged by second assist tank"] = &RaidMagtheridonTriggerContext::magtheridon_ne_channeler_engaged_by_second_assist_tank; + creators["magtheridon pulling west and east channelers"] = &RaidMagtheridonTriggerContext::magtheridon_pull_west_and_east_channelers; + creators["magtheridon determining kill order"] = &RaidMagtheridonTriggerContext::magtheridon_determining_kill_order; + creators["magtheridon burning abyssal spawned"] = &RaidMagtheridonTriggerContext::magtheridon_burning_abyssal_spawned; + creators["magtheridon boss engaged by main tank"] = &RaidMagtheridonTriggerContext::magtheridon_boss_engaged_by_main_tank; + creators["magtheridon boss engaged by ranged"] = &RaidMagtheridonTriggerContext::magtheridon_boss_engaged_by_ranged; + creators["magtheridon incoming blast nova"] = &RaidMagtheridonTriggerContext::magtheridon_incoming_blast_nova; + creators["magtheridon need to manage timers and assignments"] = &RaidMagtheridonTriggerContext::magtheridon_need_to_manage_timers_and_assignments; + } + +private: + static Trigger* magtheridon_first_three_channelers_engaged_by_main_tank(PlayerbotAI* botAI) { return new MagtheridonFirstThreeChannelersEngagedByMainTankTrigger(botAI); } + static Trigger* magtheridon_nw_channeler_engaged_by_first_assist_tank(PlayerbotAI* botAI) { return new MagtheridonNWChannelerEngagedByFirstAssistTankTrigger(botAI); } + static Trigger* magtheridon_ne_channeler_engaged_by_second_assist_tank(PlayerbotAI* botAI) { return new MagtheridonNEChannelerEngagedBySecondAssistTankTrigger(botAI); } + static Trigger* magtheridon_pull_west_and_east_channelers(PlayerbotAI* botAI) { return new MagtheridonPullingWestAndEastChannelersTrigger(botAI); } + static Trigger* magtheridon_determining_kill_order(PlayerbotAI* botAI) { return new MagtheridonDeterminingKillOrderTrigger(botAI); } + static Trigger* magtheridon_burning_abyssal_spawned(PlayerbotAI* botAI) { return new MagtheridonBurningAbyssalSpawnedTrigger(botAI); } + static Trigger* magtheridon_boss_engaged_by_main_tank(PlayerbotAI* botAI) { return new MagtheridonBossEngagedByMainTankTrigger(botAI); } + static Trigger* magtheridon_boss_engaged_by_ranged(PlayerbotAI* botAI) { return new MagtheridonBossEngagedByRangedTrigger(botAI); } + static Trigger* magtheridon_incoming_blast_nova(PlayerbotAI* botAI) { return new MagtheridonIncomingBlastNovaTrigger(botAI); } + static Trigger* magtheridon_need_to_manage_timers_and_assignments(PlayerbotAI* botAI) { return new MagtheridonNeedToManageTimersAndAssignmentsTrigger(botAI); } +}; + +#endif diff --git a/src/strategy/raids/magtheridon/RaidMagtheridonTriggers.cpp b/src/strategy/raids/magtheridon/RaidMagtheridonTriggers.cpp new file mode 100644 index 0000000000..35442df6e0 --- /dev/null +++ b/src/strategy/raids/magtheridon/RaidMagtheridonTriggers.cpp @@ -0,0 +1,128 @@ +#include "RaidMagtheridonTriggers.h" +#include "RaidMagtheridonHelpers.h" +#include "Playerbots.h" + +using namespace MagtheridonHelpers; + +bool MagtheridonFirstThreeChannelersEngagedByMainTankTrigger::IsActive() +{ + Unit* magtheridon = AI_VALUE2(Unit*, "find target", "magtheridon"); + + return magtheridon && botAI->IsMainTank(bot) && + magtheridon->HasAura(SPELL_SHADOW_CAGE); +} + +bool MagtheridonNWChannelerEngagedByFirstAssistTankTrigger::IsActive() +{ + Unit* magtheridon = AI_VALUE2(Unit*, "find target", "magtheridon"); + Creature* channelerDiamond = GetChanneler(bot, NORTHWEST_CHANNELER); + + return magtheridon && botAI->IsAssistTankOfIndex(bot, 0) && + channelerDiamond && channelerDiamond->IsAlive(); +} + +bool MagtheridonNEChannelerEngagedBySecondAssistTankTrigger::IsActive() +{ + Unit* magtheridon = AI_VALUE2(Unit*, "find target", "magtheridon"); + Creature* channelerTriangle = GetChanneler(bot, NORTHEAST_CHANNELER); + + return magtheridon && botAI->IsAssistTankOfIndex(bot, 1) && + channelerTriangle && channelerTriangle->IsAlive(); +} + +bool MagtheridonPullingWestAndEastChannelersTrigger::IsActive() +{ + Unit* magtheridon = AI_VALUE2(Unit*, "find target", "magtheridon"); + + Creature* channelerStar = GetChanneler(bot, WEST_CHANNELER); + Creature* channelerCircle = GetChanneler(bot, EAST_CHANNELER); + + return magtheridon && bot->getClass() == CLASS_HUNTER && + ((channelerStar && channelerStar->IsAlive()) || + (channelerCircle && channelerCircle->IsAlive())); +} + +bool MagtheridonDeterminingKillOrderTrigger::IsActive() +{ + Unit* magtheridon = AI_VALUE2(Unit*, "find target", "magtheridon"); + Unit* channeler = AI_VALUE2(Unit*, "find target", "hellfire channeler"); + + Creature* channelerDiamond = GetChanneler(bot, NORTHWEST_CHANNELER); + Creature* channelerTriangle = GetChanneler(bot, NORTHEAST_CHANNELER); + + if (!magtheridon || botAI->IsHeal(bot) || botAI->IsMainTank(bot) || + (botAI->IsAssistTankOfIndex(bot, 0) && channelerDiamond && channelerDiamond->IsAlive()) || + (botAI->IsAssistTankOfIndex(bot, 1) && channelerTriangle && channelerTriangle->IsAlive())) + return false; + + return (channeler && channeler->IsAlive()) || (magtheridon && + !magtheridon->HasAura(SPELL_SHADOW_CAGE)); +} + +bool MagtheridonBurningAbyssalSpawnedTrigger::IsActive() +{ + Unit* magtheridon = AI_VALUE2(Unit*, "find target", "magtheridon"); + if (!magtheridon || bot->getClass() != CLASS_WARLOCK) + return false; + + const GuidVector& npcs = AI_VALUE(GuidVector, "nearest hostile npcs"); + return std::any_of(npcs.begin(), npcs.end(), [this](const ObjectGuid& npc) + { + Unit* unit = botAI->GetUnit(npc); + return unit && unit->GetEntry() == NPC_BURNING_ABYSSAL; + }); +} + +bool MagtheridonBossEngagedByMainTankTrigger::IsActive() +{ + Unit* magtheridon = AI_VALUE2(Unit*, "find target", "magtheridon"); + + return magtheridon && botAI->IsMainTank(bot) && + !magtheridon->HasAura(SPELL_SHADOW_CAGE); +} + +bool MagtheridonBossEngagedByRangedTrigger::IsActive() +{ + Unit* magtheridon = AI_VALUE2(Unit*, "find target", "magtheridon"); + Unit* channeler = AI_VALUE2(Unit*, "find target", "hellfire channeler"); + + return magtheridon && botAI->IsRanged(bot) && + !(channeler && channeler->IsAlive()); +} + +bool MagtheridonIncomingBlastNovaTrigger::IsActive() +{ + Unit* magtheridon = AI_VALUE2(Unit*, "find target", "magtheridon"); + Group* group = bot->GetGroup(); + if (!group || !magtheridon || magtheridon->HasAura(SPELL_SHADOW_CAGE)) + return false; + + bool needsReassign = botToCubeAssignment.empty(); + if (!needsReassign) + { + for (auto const& pair : botToCubeAssignment) + { + Player* assigned = ObjectAccessor::FindPlayer(pair.first); + if (!assigned || !assigned->IsAlive()) + { + needsReassign = true; + break; + } + } + } + + if (needsReassign) + { + std::vector cubes = GetAllCubeInfosByDbGuids(bot->GetMap(), MANTICRON_CUBE_DB_GUIDS); + AssignBotsToCubesByGuidAndCoords(group, cubes, botAI); + } + + return botToCubeAssignment.find(bot->GetGUID()) != botToCubeAssignment.end(); +} + +bool MagtheridonNeedToManageTimersAndAssignmentsTrigger::IsActive() +{ + Unit* magtheridon = AI_VALUE2(Unit*, "find target", "magtheridon"); + + return magtheridon; +} diff --git a/src/strategy/raids/magtheridon/RaidMagtheridonTriggers.h b/src/strategy/raids/magtheridon/RaidMagtheridonTriggers.h new file mode 100644 index 0000000000..0039c4e276 --- /dev/null +++ b/src/strategy/raids/magtheridon/RaidMagtheridonTriggers.h @@ -0,0 +1,77 @@ +#ifndef _PLAYERBOT_RAIDMAGTHERIDONTRIGGERS_H +#define _PLAYERBOT_RAIDMAGTHERIDONTRIGGERS_H + +#include "Trigger.h" +#include "PlayerbotAI.h" + +class MagtheridonFirstThreeChannelersEngagedByMainTankTrigger : public Trigger +{ +public: + MagtheridonFirstThreeChannelersEngagedByMainTankTrigger(PlayerbotAI* botAI) : Trigger(botAI, "magtheridon first three channelers engaged by main tank") {}; + bool IsActive() override; +}; + +class MagtheridonNWChannelerEngagedByFirstAssistTankTrigger : public Trigger +{ +public: + MagtheridonNWChannelerEngagedByFirstAssistTankTrigger(PlayerbotAI* botAI) : Trigger(botAI, "magtheridon nw channeler engaged by first assist tank") {}; + bool IsActive() override; +}; + +class MagtheridonNEChannelerEngagedBySecondAssistTankTrigger : public Trigger +{ +public: + MagtheridonNEChannelerEngagedBySecondAssistTankTrigger(PlayerbotAI* botAI) : Trigger(botAI, "magtheridon ne channeler engaged by second assist tank") {}; + bool IsActive() override; +}; + +class MagtheridonPullingWestAndEastChannelersTrigger : public Trigger +{ +public: + MagtheridonPullingWestAndEastChannelersTrigger(PlayerbotAI* botAI) : Trigger(botAI, "magtheridon pulling west and east channelers") {}; + bool IsActive() override; +}; + +class MagtheridonDeterminingKillOrderTrigger : public Trigger +{ +public: + MagtheridonDeterminingKillOrderTrigger(PlayerbotAI* botAI) : Trigger(botAI, "magtheridon determining kill order") {}; + bool IsActive() override; +}; + +class MagtheridonBurningAbyssalSpawnedTrigger : public Trigger +{ +public: + MagtheridonBurningAbyssalSpawnedTrigger(PlayerbotAI* botAI) : Trigger(botAI, "magtheridon burning abyssal spawned") {}; + bool IsActive() override; +}; + +class MagtheridonBossEngagedByMainTankTrigger : public Trigger +{ +public: + MagtheridonBossEngagedByMainTankTrigger(PlayerbotAI* botAI) : Trigger(botAI, "magtheridon boss engaged by main tank") {}; + bool IsActive() override; +}; + +class MagtheridonBossEngagedByRangedTrigger : public Trigger +{ +public: + MagtheridonBossEngagedByRangedTrigger(PlayerbotAI* botAI) : Trigger(botAI, "magtheridon boss engaged by ranged") {}; + bool IsActive() override; +}; + +class MagtheridonIncomingBlastNovaTrigger : public Trigger +{ +public: + MagtheridonIncomingBlastNovaTrigger(PlayerbotAI* botAI) : Trigger(botAI, "magtheridon incoming blast nova") {}; + bool IsActive() override; +}; + +class MagtheridonNeedToManageTimersAndAssignmentsTrigger : public Trigger +{ +public: + MagtheridonNeedToManageTimersAndAssignmentsTrigger(PlayerbotAI* botAI) : Trigger(botAI, "magtheridon need to manage timers and assignments") {}; + bool IsActive() override; +}; + +#endif From 80886d6dcfbe68731b020c9f26cd34d75e0b2558 Mon Sep 17 00:00:00 2001 From: Tecc Date: Wed, 5 Nov 2025 14:56:33 +0100 Subject: [PATCH 138/151] Refine Wintergrasp bot strategy: Enhance objective selection and role assignments based on game state and team dynamics --- src/strategy/actions/BattleGroundTactics.cpp | 508 +++++++++++++------ 1 file changed, 341 insertions(+), 167 deletions(-) diff --git a/src/strategy/actions/BattleGroundTactics.cpp b/src/strategy/actions/BattleGroundTactics.cpp index 619bd3f5e2..0d88e62653 100644 --- a/src/strategy/actions/BattleGroundTactics.cpp +++ b/src/strategy/actions/BattleGroundTactics.cpp @@ -2001,155 +2001,320 @@ bool BGTactics::selectObjective(bool reset) TeamId team = bot->GetTeamId(); uint32 role = context->GetValue("bg role")->Get(); - // WG Strategy system similar to other BGs + if (!isWarTime) + { + // Not in battle - move to staging area + Position waitPos = isDefender ? WG_GATE_POS : WG_TOWER_S_POS; + float rx, ry, rz; + bot->GetRandomPoint(waitPos, 50.0f, rx, ry, rz); + pos.Set(rx, ry, rz, bot->GetMapId()); + posMap["bg objective"] = pos; + return true; + } + + // WG Strategy system based on team objectives enum WGBotStrategy { WG_STRATEGY_BALANCED = 0, WG_STRATEGY_OFFENSIVE, WG_STRATEGY_DEFENSIVE }; - WGBotStrategy strategy = static_cast(role % 3); // Simple strategy assignment + WGBotStrategy strategy = static_cast(role % 3); + + // Dynamic battle state analysis + uint32 timeRemaining = bf->GetTimer() / 1000; // seconds remaining + bool isEarlyGame = timeRemaining > 1200; // first 10 minutes + bool isLateGame = timeRemaining < 600; // last 10 minutes + + // Count destroyed towers (affects attacker priorities) + uint32 towersRemaining = 3; // TODO: Query actual tower states if available + bool towersDestroyed = (towersRemaining == 0); + + // Role assignments based on team and strategy + uint8 workshopFocusProb = 3; // Workshop cappers + uint8 towerDefenseProb = 2; // Tower defenders (attackers only) + uint8 fortressAssaultProb = 3; // Direct fortress assault + uint8 pvpHunterProb = 2; // PvP roamers - // Role distribution based on strategy (similar to AV/AB) - uint8 defendersProhab = 4; // Default balanced - switch (strategy) + if (isDefender) { - case WG_STRATEGY_OFFENSIVE: - defendersProhab = (isDefender ? 6 : 2); // Defenders stay defensive, attackers go aggressive - break; - case WG_STRATEGY_DEFENSIVE: - defendersProhab = (isDefender ? 8 : 3); // Heavy defense for defenders, balanced for attackers - break; - case WG_STRATEGY_BALANCED: - default: - defendersProhab = 4; - break; + // Defenders: fortress defense, workshop control, tower destruction + switch (strategy) + { + case WG_STRATEGY_OFFENSIVE: + workshopFocusProb = 2; towerDefenseProb = 0; fortressAssaultProb = 6; pvpHunterProb = 2; + break; + case WG_STRATEGY_DEFENSIVE: + workshopFocusProb = 1; towerDefenseProb = 0; fortressAssaultProb = 8; pvpHunterProb = 1; + break; + case WG_STRATEGY_BALANCED: + default: + workshopFocusProb = 3; towerDefenseProb = 0; fortressAssaultProb = 5; pvpHunterProb = 2; + break; + } + } + else + { + // Attackers: workshop capture, tower defense, fortress assault + switch (strategy) + { + case WG_STRATEGY_OFFENSIVE: + workshopFocusProb = 2; + towerDefenseProb = towersDestroyed ? 0 : 1; // No point defending destroyed towers + fortressAssaultProb = 6; pvpHunterProb = 1; + break; + case WG_STRATEGY_DEFENSIVE: + workshopFocusProb = 4; + towerDefenseProb = towersDestroyed ? 0 : 3; + fortressAssaultProb = 2; pvpHunterProb = 1; + break; + case WG_STRATEGY_BALANCED: + default: + workshopFocusProb = 3; + towerDefenseProb = towersDestroyed ? 0 : 2; + fortressAssaultProb = 4; pvpHunterProb = 1; + break; + } } - bool isDefensiveRole = (role % 10) < defendersProhab; - bool shouldUseVehicles = !isDefensiveRole || strategy == WG_STRATEGY_OFFENSIVE; + // Determine bot's role based on probabilities + uint32 roleType = role % 10; + bool isWorkshopCapper = roleType < workshopFocusProb; + bool isTowerDefender = !isWorkshopCapper && roleType < (workshopFocusProb + towerDefenseProb); + bool isFortressAssaulter = !isWorkshopCapper && !isTowerDefender && roleType < (workshopFocusProb + towerDefenseProb + fortressAssaultProb); + bool isPvpHunter = !isWorkshopCapper && !isTowerDefender && !isFortressAssaulter; + + // Late game override: everyone focuses on victory condition + if (isLateGame) + { + if (isDefender) + { + isFortressAssaulter = true; // All defenders protect relic + isWorkshopCapper = false; isTowerDefender = false; isPvpHunter = false; + } + else + { + isFortressAssaulter = true; // All attackers push relic + isWorkshopCapper = false; isTowerDefender = false; isPvpHunter = false; + } + } - // Try to push siege objectives; fall back to local PvP - // Priority 1: Workshop Banner Control (highest priority - enables vehicle production) + // Priority 1: Workshop Control (Essential for vehicle production) + if (isWorkshopCapper || (isEarlyGame && urand(0, 2) == 0)) { GuidVector noLosObjects = AI_VALUE(GuidVector, "nearest game objects no los"); - std::vector contested_banners, neutral_banners, enemy_banners; + std::vector workshop_banners; for (ObjectGuid const& gid : noLosObjects) { GameObject* go = botAI->GetGameObject(gid); if (!go || std::find(vFlagsWG.begin(), vFlagsWG.end(), go->GetEntry()) == vFlagsWG.end()) continue; - if (go->GetEntry() == 192829) // Skip relic for now + if (go->GetEntry() == 192829) // Skip relic continue; float dist = bot->GetDistance(go); - if (dist > 300.0f) // Only consider nearby banners + if (dist > 400.0f) // Extended range for workshop hunting continue; - bool canUse = bot->CanUseBattlegroundObject(go); - if (canUse) + // Check if this workshop is capturable + bool canCapture = bot->CanUseBattlegroundObject(go); + // Include contested/enemy workshops as valid targets + if (canCapture || !go->IsFriendlyTo(bot)) { - // Determine banner state by checking interaction availability - contested_banners.push_back(go); + workshop_banners.push_back(go); } - else + } + + if (!workshop_banners.empty()) + { + // Prioritize workshops closer to enemy base for attackers, closer to friendly base for defenders + GameObject* bestWorkshop = nullptr; + float bestScore = -1.0f; + + for (GameObject* workshop : workshop_banners) { - enemy_banners.push_back(go); + float distToGate = workshop->GetDistance(WG_GATE_POS); + float score; + + if (isDefender) + score = 500.0f - distToGate; // Defenders prefer workshops near gate + else + score = distToGate; // Attackers prefer workshops far from gate (captured ones) + + if (score > bestScore) + { + bestScore = score; + bestWorkshop = workshop; + } + } + + if (bestWorkshop) + { + pos.Set(bestWorkshop->GetPositionX(), bestWorkshop->GetPositionY(), bestWorkshop->GetPositionZ(), bot->GetMapId()); + posMap["bg objective"] = pos; + return true; } } + } - // Prioritize: contested > enemy > neutral - GameObject* targetBanner = nullptr; - if (!contested_banners.empty()) - targetBanner = contested_banners[urand(0, contested_banners.size() - 1)]; - else if (!enemy_banners.empty() && !isDefensiveRole) - targetBanner = enemy_banners[urand(0, enemy_banners.size() - 1)]; + // Priority 2: Tower Defense/Destruction (Attackers defend towers, Defenders destroy towers) + if (isTowerDefender && !towersDestroyed) + { + // Attackers: Defend towers from destruction (provides damage buff) + if (!isDefender) + { + std::vector towerPositions = { WG_TOWER_W_POS, WG_TOWER_S_POS, WG_TOWER_E_POS }; + Position targetTower = towerPositions[role % towerPositions.size()]; - if (targetBanner) + // Check for enemies near tower + bool enemiesNearTower = false; + GuidVector nearbyEnemies = AI_VALUE(GuidVector, "nearest hostile players"); + for (ObjectGuid const& eg : nearbyEnemies) + { + Unit* enemy = botAI->GetUnit(eg); + if (enemy && enemy->GetDistance(targetTower) < 100.0f) + { + enemiesNearTower = true; + break; + } + } + + if (enemiesNearTower || isEarlyGame) + { + float rx, ry, rz; + bot->GetRandomPoint(targetTower, 40.0f, rx, ry, rz); + pos.Set(rx, ry, rz, bot->GetMapId()); + posMap["bg objective"] = pos; + return true; + } + } + // Defenders: Attack enemy towers to remove their buff and reduce battle time + else { - pos.Set(targetBanner->GetPositionX(), targetBanner->GetPositionY(), targetBanner->GetPositionZ(), bot->GetMapId()); + std::vector towerPositions = { WG_TOWER_W_POS, WG_TOWER_S_POS, WG_TOWER_E_POS }; + Position targetTower = towerPositions[role % towerPositions.size()]; + + pos.Set(targetTower.GetPositionX(), targetTower.GetPositionY(), targetTower.GetPositionZ(), bot->GetMapId()); posMap["bg objective"] = pos; return true; } } - // Priority 2: Vehicle-based siege assault/defense + // Priority 3: Fortress Assault/Defense (Main objective push) + if (isFortressAssaulter) { - GuidVector nearbyVehicles = AI_VALUE(GuidVector, "nearest vehicles"); - uint32 friendlyAtGate = 0, enemyAtGate = 0; - - for (ObjectGuid const& vg : nearbyVehicles) + if (!isDefender) { - Unit* v = botAI->GetUnit(vg); - if (!v) - continue; + // Attackers: Progressive fortress assault + // Check distance to different fortress layers to determine current objective + float distToOuterWall = bot->GetDistance(WG_GATE_POS); + float distToRelic = bot->GetDistance(WG_RELIC_POS); - float distToGate = v->GetDistance(WG_GATE_POS); - if (distToGate < 200.0f) + Position assaultTarget; + if (distToRelic < 150.0f) { - if (v->IsFriendlyTo(bot)) - friendlyAtGate++; - else - enemyAtGate++; + // Close to relic - go for victory + assaultTarget = WG_RELIC_POS; } - } - - // Attackers: coordinate siege push - if (!isDefender && shouldUseVehicles && friendlyAtGate >= 1) - { - // Strategy-based target selection - Position siegeTarget; - switch (strategy) + else if (distToOuterWall < 200.0f) { - case WG_STRATEGY_OFFENSIVE: - siegeTarget = WG_GATE_POS; // Focus fire on gate - break; - case WG_STRATEGY_BALANCED: - // Spread across multiple targets - switch (role % 4) - { - case 0: case 1: siegeTarget = WG_GATE_POS; break; - case 2: siegeTarget = WG_TOWER_W_POS; break; - case 3: siegeTarget = WG_TOWER_E_POS; break; - } - break; - case WG_STRATEGY_DEFENSIVE: - siegeTarget = (role % 2 == 0) ? WG_TOWER_S_POS : WG_GATE_POS; - break; + // Breach the walls + assaultTarget = WG_GATE_POS; + } + else + { + // Approach the fortress + switch (role % 3) + { + case 0: assaultTarget = Position(5200.0f, 2840.0f, 420.0f, 0.0f); break; // West approach + case 1: assaultTarget = WG_GATE_POS; break; // Center approach + case 2: assaultTarget = Position(5280.0f, 2840.0f, 420.0f, 0.0f); break; // East approach + } } - pos.Set(siegeTarget.GetPositionX(), siegeTarget.GetPositionY(), siegeTarget.GetPositionZ(), bot->GetMapId()); + float rx, ry, rz; + bot->GetRandomPoint(assaultTarget, 25.0f, rx, ry, rz); + pos.Set(rx, ry, rz, bot->GetMapId()); posMap["bg objective"] = pos; return true; } - - // Defenders: counter-siege tactics - if (isDefender && enemyAtGate >= 1) + else { - if (isDefensiveRole) + // Defenders: Multi-layered defense + float distToGate = bot->GetDistance(WG_GATE_POS); + float distToRelic = bot->GetDistance(WG_RELIC_POS); + + Position defenseTarget; + if (distToRelic < 100.0f) { - // Defend the gate area - float rx, ry, rz; - bot->GetRandomPoint(WG_GATE_POS, 75.0f, rx, ry, rz); - pos.Set(rx, ry, rz, bot->GetMapId()); - posMap["bg objective"] = pos; - return true; + // Last stand at relic + defenseTarget = WG_RELIC_POS; + } + else if (distToGate < 150.0f) + { + // Defend the gate/courtyard + switch (role % 4) + { + case 0: defenseTarget = Position(5180.0f, 2840.0f, 420.0f, 0.0f); break; // West courtyard + case 1: defenseTarget = WG_GATE_POS; break; // Main gate + case 2: defenseTarget = Position(5300.0f, 2840.0f, 420.0f, 0.0f); break; // East courtyard + case 3: defenseTarget = Position(5240.0f, 2780.0f, 420.0f, 0.0f); break; // South courtyard + } } else { - // Counter-attack enemy siege positions - Position counterTarget = (role % 2 == 0) ? WG_TOWER_W_POS : WG_TOWER_E_POS; - pos.Set(counterTarget.GetPositionX(), counterTarget.GetPositionY(), counterTarget.GetPositionZ(), bot->GetMapId()); - posMap["bg objective"] = pos; - return true; + // Forward defense - harass attackers + defenseTarget = Position(5240.0f + frand(-50.0f, 50.0f), 2700.0f + frand(-30.0f, 30.0f), + WG_GATE_POS.GetPositionZ(), 0.0f); + } + + float rx, ry, rz; + bot->GetRandomPoint(defenseTarget, 30.0f, rx, ry, rz); + pos.Set(rx, ry, rz, bot->GetMapId()); + posMap["bg objective"] = pos; + return true; + } + } + + // Priority 4: Vehicle Operations (Acquire and use siege vehicles) + if (!bot->GetVehicle() && urand(0, 3) == 0) + { + // Try to acquire a vehicle if we need one + GuidVector nearVehicles = AI_VALUE(GuidVector, "nearest vehicles"); + Unit* bestVehicle = nullptr; + float bestVehDist = FLT_MAX; + + for (ObjectGuid const& vg : nearVehicles) + { + Unit* v = botAI->GetUnit(vg); + if (!v || !v->IsFriendlyTo(bot) || v->GetVehicleKit()->GetAvailableSeatCount() == 0) + continue; + + uint32 entry = v->GetEntry(); + // Only consider siege vehicles + if (entry != WG_ENTRY_SIEGE_ENGINE_A && entry != WG_ENTRY_SIEGE_ENGINE_H && + entry != WG_ENTRY_DEMOLISHER && entry != WG_ENTRY_CATAPULT) + continue; + + float d = bot->GetDistance(v); + if (d < bestVehDist && d < 150.0f) + { + bestVehDist = d; + bestVehicle = v; } } + + if (bestVehicle) + { + pos.Set(bestVehicle->GetPositionX(), bestVehicle->GetPositionY(), bestVehicle->GetPositionZ(), bot->GetMapId()); + posMap["bg objective"] = pos; + return true; + } } - // Priority 3: Vehicle hunting and escort (similar to AV/IC vehicle mechanics) + // Priority 5: Vehicle Combat (Hunt enemy vehicles or escort friendlies) { GuidVector vehs = AI_VALUE(GuidVector, "nearest vehicles"); Unit* targetVehicle = nullptr; float bestDist = FLT_MAX; - bool seekingFriendly = false; + bool shouldEscort = false; - // Choose vehicle target based on role and strategy for (ObjectGuid const& vg : vehs) { Unit* v = botAI->GetUnit(vg); @@ -2158,40 +2323,38 @@ bool BGTactics::selectObjective(bool reset) float d = bot->GetDistance(v); bool isFriendly = v->IsFriendlyTo(bot); + uint32 entry = v->GetEntry(); - // Defenders prioritize enemy vehicles for interception - if (isDefender && !isFriendly && d < 300.0f) + // Target enemy vehicles for destruction + if (!isFriendly && d < 250.0f) { if (d < bestDist) { bestDist = d; targetVehicle = v; - seekingFriendly = false; + shouldEscort = false; } } - // Escort role: follow friendly siege engines - else if (!isDefensiveRole && (role % 4 == 3) && isFriendly && d < 200.0f) + // Escort friendly siege engines + else if (isFriendly && d < 150.0f && !isDefender && + (entry == WG_ENTRY_SIEGE_ENGINE_A || entry == WG_ENTRY_SIEGE_ENGINE_H || entry == WG_ENTRY_DEMOLISHER)) { - uint32 entry = v->GetEntry(); - if (entry == WG_ENTRY_SIEGE_ENGINE_A || entry == WG_ENTRY_SIEGE_ENGINE_H || entry == WG_ENTRY_DEMOLISHER) + if (d < bestDist && (role % 5 == 4)) // Only some bots escort { - if (d < bestDist) - { - bestDist = d; - targetVehicle = v; - seekingFriendly = true; - } + bestDist = d; + targetVehicle = v; + shouldEscort = true; } } } if (targetVehicle) { - if (seekingFriendly) + if (shouldEscort) { // Follow friendly vehicle at escort distance float rx, ry, rz; - bot->GetRandomPoint(targetVehicle->GetPosition(), frand(20.0f, 40.0f), rx, ry, rz); + bot->GetRandomPoint(targetVehicle->GetPosition(), frand(25.0f, 45.0f), rx, ry, rz); pos.Set(rx, ry, rz, bot->GetMapId()); } else @@ -2205,44 +2368,6 @@ bool BGTactics::selectObjective(bool reset) } } - // Continue to remaining priorities... - - // Priority 4: Victory condition push (Titan's Relic - similar to AV boss mechanics) - if (!isDefender && bot->GetDistance(WG_RELIC_POS) < 300.0f) - { - // Only go for relic if we have enough support (like AV boss requirements) - uint32 friendlyNearRelic = 0; - GuidVector nearbyPlayers = AI_VALUE(GuidVector, "nearest friendly players"); - for (ObjectGuid const& pg : nearbyPlayers) - { - Unit* p = botAI->GetUnit(pg); - if (p && p->GetDistance(WG_RELIC_POS) < 100.0f) - friendlyNearRelic++; - } - - if (friendlyNearRelic >= 2 || strategy == WG_STRATEGY_OFFENSIVE) - { - pos.Set(WG_RELIC_POS.GetPositionX(), WG_RELIC_POS.GetPositionY(), WG_RELIC_POS.GetPositionZ(), bot->GetMapId()); - posMap["bg objective"] = pos; - return true; - } - } - - // Priority 5: Enemy player engagement (similar to AB/EY enemy hunting) - if (urand(0, 99) < 15) // 15% chance for direct PvP engagement - { - if (Unit* enemy = AI_VALUE(Unit*, "enemy player target")) - { - float dist = bot->GetDistance(enemy); - if (dist < 400.0f && dist > 50.0f) // Not too close, not too far - { - pos.Set(enemy->GetPositionX(), enemy->GetPositionY(), enemy->GetPositionZ(), bot->GetMapId()); - posMap["bg objective"] = pos; - return true; - } - } - } - // Priority 6: Vehicle acquisition (similar to IC vehicle spawns) if (shouldUseVehicles && !bot->GetVehicle()) { @@ -2277,36 +2402,85 @@ bool BGTactics::selectObjective(bool reset) } } - // Priority 7: Fallback positioning (similar to other BG fallback logic) - Position fallbackTarget; - if (isDefender) + // Priority 7: Enemy player hunting and disruption + if (urand(0, 99) < 25) // 25% chance for direct PvP engagement { - // Defenders spread around fortress - switch (role % 4) + if (Unit* enemy = AI_VALUE(Unit*, "enemy player target")) { - case 0: fallbackTarget = WG_GATE_POS; break; - case 1: fallbackTarget = WG_RELIC_POS; break; - case 2: fallbackTarget = Position(5200.0f, 2900.0f, 420.0f, 0.0f); break; // North courtyard - case 3: fallbackTarget = Position(5200.0f, 2780.0f, 420.0f, 0.0f); break; // South courtyard + float dist = bot->GetDistance(enemy); + if (dist < 350.0f && dist > 40.0f) + { + pos.Set(enemy->GetPositionX(), enemy->GetPositionY(), enemy->GetPositionZ(), bot->GetMapId()); + posMap["bg objective"] = pos; + return true; + } } } - else + + // Priority 8: Patrol routes and fallback positioning { - // Attackers focus on siege positions - switch (role % 3) + float x, y, z; + if (isDefender) { - case 0: fallbackTarget = WG_GATE_POS; break; - case 1: fallbackTarget = WG_TOWER_W_POS; break; - case 2: fallbackTarget = WG_TOWER_E_POS; break; + // Defenders patrol around keep and walls + int patrolType = role % 4; + switch (patrolType) + { + case 0: // Keep patrol + x = 5266.0f + frand(-50.0f, 50.0f); + y = 2838.0f + frand(-50.0f, 50.0f); + z = 409.0f; + break; + case 1: // Wall patrol + x = 5328.0f + frand(-100.0f, 100.0f); + y = 2827.0f + frand(-80.0f, 80.0f); + z = 409.0f; + break; + case 2: // North courtyard + x = 5200.0f + frand(-75.0f, 75.0f); + y = 2900.0f + frand(-60.0f, 60.0f); + z = 420.0f; + break; + default: // South courtyard + x = 5200.0f + frand(-75.0f, 75.0f); + y = 2780.0f + frand(-60.0f, 60.0f); + z = 420.0f; + break; + } + } + else + { + // Attackers spread across battlefield approaches + int patrolType = role % 4; + switch (patrolType) + { + case 0: // Western approach + x = 5140.0f + frand(-100.0f, 50.0f); + y = 2750.0f + frand(-120.0f, 120.0f); + z = 390.0f; + break; + case 1: // Eastern approach + x = 5450.0f + frand(-50.0f, 100.0f); + y = 2750.0f + frand(-120.0f, 120.0f); + z = 390.0f; + break; + case 2: // Southern staging area + x = 5300.0f + frand(-150.0f, 150.0f); + y = 2500.0f + frand(-100.0f, 100.0f); + z = 390.0f; + break; + default: // Central advance + x = 5300.0f + frand(-100.0f, 100.0f); + y = 2650.0f + frand(-80.0f, 80.0f); + z = 390.0f; + break; + } } - } - // Add randomization to avoid clustering - float rx, ry, rz; - bot->GetRandomPoint(fallbackTarget, frand(30.0f, 60.0f), rx, ry, rz); - pos.Set(rx, ry, rz, bot->GetMapId()); - posMap["bg objective"] = pos; - return true; + pos.Set(x, y, z, bot->GetMapId()); + posMap["bg objective"] = pos; + return true; + } } } switch (bgType) From 1f27b31ca1c46782f3abdb3a99fd095cc4acf35e Mon Sep 17 00:00:00 2001 From: Tecc Date: Wed, 5 Nov 2025 15:06:17 +0100 Subject: [PATCH 139/151] Add Wintergrasp battlefield data constants and update tower state query in objective selection --- src/strategy/actions/BattleGroundTactics.cpp | 18 +++++++++++++++++- 1 file changed, 17 insertions(+), 1 deletion(-) diff --git a/src/strategy/actions/BattleGroundTactics.cpp b/src/strategy/actions/BattleGroundTactics.cpp index 0d88e62653..4f753a5141 100644 --- a/src/strategy/actions/BattleGroundTactics.cpp +++ b/src/strategy/actions/BattleGroundTactics.cpp @@ -36,6 +36,19 @@ #include "ObjectAccessor.h" #include "TravelMgr.h" +// Wintergrasp Battlefield Data constants (from AzerothCore BattlefieldWG.h) +enum WintergraspData +{ + BATTLEFIELD_WG_DATA_INTACT_TOWER_ATT, + BATTLEFIELD_WG_DATA_DAMAGED_TOWER_ATT, + BATTLEFIELD_WG_DATA_BROKEN_TOWER_ATT, + BATTLEFIELD_WG_DATA_MAX_VEHICLE_A, + BATTLEFIELD_WG_DATA_MAX_VEHICLE_H, + BATTLEFIELD_WG_DATA_VEHICLE_A, + BATTLEFIELD_WG_DATA_VEHICLE_H, + BATTLEFIELD_WG_DATA_MAX, +}; + // common bg positions Position const WS_WAITING_POS_HORDE_1 = {944.981f, 1423.478f, 345.434f, 6.18f}; Position const WS_WAITING_POS_HORDE_2 = {948.488f, 1459.834f, 343.066f, 6.27f}; @@ -2022,7 +2035,10 @@ bool BGTactics::selectObjective(bool reset) bool isLateGame = timeRemaining < 600; // last 10 minutes // Count destroyed towers (affects attacker priorities) - uint32 towersRemaining = 3; // TODO: Query actual tower states if available + // Query actual WG attacker tower states from Battlefield data + uint32 intactTowers = bf->GetData(BATTLEFIELD_WG_DATA_INTACT_TOWER_ATT); + uint32 brokenTowers = bf->GetData(BATTLEFIELD_WG_DATA_BROKEN_TOWER_ATT); + uint32 towersRemaining = intactTowers; bool towersDestroyed = (towersRemaining == 0); // Role assignments based on team and strategy From 0f46bc69ccd0314a4d45cfe9bee1f7d46ee905e5 Mon Sep 17 00:00:00 2001 From: Tecc Date: Wed, 5 Nov 2025 15:24:39 +0100 Subject: [PATCH 140/151] Enhance Wintergrasp strategy: Implement workshop control tracking, dynamic vehicle limits, and refined role assignments based on urgency and rank. Update vehicle ability usage for authentic gameplay experience. --- src/strategy/actions/BattleGroundTactics.cpp | 231 ++++++++++++++---- src/strategy/generic/BattlegroundStrategy.cpp | 16 +- 2 files changed, 194 insertions(+), 53 deletions(-) diff --git a/src/strategy/actions/BattleGroundTactics.cpp b/src/strategy/actions/BattleGroundTactics.cpp index 4f753a5141..6462ff73bc 100644 --- a/src/strategy/actions/BattleGroundTactics.cpp +++ b/src/strategy/actions/BattleGroundTactics.cpp @@ -49,6 +49,15 @@ enum WintergraspData BATTLEFIELD_WG_DATA_MAX, }; +// Workshop control tracking (estimated IDs - may need adjustment for specific core) +enum WintergraspWorkshopData +{ + BATTLEFIELD_WG_DATA_WORKSHOP_NE = 50, + BATTLEFIELD_WG_DATA_WORKSHOP_NW = 51, + BATTLEFIELD_WG_DATA_WORKSHOP_SE = 52, + BATTLEFIELD_WG_DATA_WORKSHOP_SW = 53, +}; + // common bg positions Position const WS_WAITING_POS_HORDE_1 = {944.981f, 1423.478f, 345.434f, 6.18f}; Position const WS_WAITING_POS_HORDE_2 = {948.488f, 1459.834f, 343.066f, 6.27f}; @@ -2041,11 +2050,63 @@ bool BGTactics::selectObjective(bool reset) uint32 towersRemaining = intactTowers; bool towersDestroyed = (towersRemaining == 0); - // Role assignments based on team and strategy - uint8 workshopFocusProb = 3; // Workshop cappers - uint8 towerDefenseProb = 2; // Tower defenders (attackers only) - uint8 fortressAssaultProb = 3; // Direct fortress assault - uint8 pvpHunterProb = 2; // PvP roamers + // Workshop control detection (affects vehicle availability and priorities) + uint32 workshopsControlled = 0; + TeamId myTeam = TeamId(bot->GetTeamId()); + + // Count workshops controlled by bot's team (fallback to estimated count if data unavailable) + try { + if (bf->GetData(BATTLEFIELD_WG_DATA_WORKSHOP_NE) == myTeam) workshopsControlled++; + if (bf->GetData(BATTLEFIELD_WG_DATA_WORKSHOP_NW) == myTeam) workshopsControlled++; + if (bf->GetData(BATTLEFIELD_WG_DATA_WORKSHOP_SE) == myTeam) workshopsControlled++; + if (bf->GetData(BATTLEFIELD_WG_DATA_WORKSHOP_SW) == myTeam) workshopsControlled++; + } catch (...) { + // Fallback: estimate workshop control based on team and strategy + workshopsControlled = isDefender ? 2 : 1; // Defenders typically hold more workshops initially + } + + // Dynamic vehicle limits based on workshop control (each workshop = +2 vehicle capacity) + uint32 baseVehicleLimit = isDefender ? 4 : 6; // Attackers need more vehicles for siege + uint32 maxVehiclesAvailable = baseVehicleLimit + (workshopsControlled * 2); + + // Keep/fortress destruction state detection (affects attacker priorities) + bool outerWallsDestroyed = false; + bool innerWallsDestroyed = false; + bool keepDoorDestroyed = false; + bool relicAccessible = false; + + // Estimate fortress breach status based on battle progress and time + if (!isDefender) { + float progressEstimate = (1800.0f - timeRemaining) / 1800.0f; // 0.0 = start, 1.0 = end + outerWallsDestroyed = (progressEstimate > 0.3f) || (brokenTowers >= 2); + innerWallsDestroyed = (progressEstimate > 0.6f) || (brokenTowers >= 3); + keepDoorDestroyed = (progressEstimate > 0.8f); + relicAccessible = keepDoorDestroyed && (progressEstimate > 0.9f); + } + + // Rank tracking and priority adjustments (affects vehicle access and tactical priorities) + bool hasWGRank = bot->HasAura(37795) || bot->HasAura(33280) || bot->HasAura(55629); // Recruit, Corporal, Lieutenant + bool hasCorporal = bot->HasAura(33280) || bot->HasAura(55629); // Corporal or Lieutenant + bool hasLieutenant = bot->HasAura(55629); // Lieutenant + + // Rank-based priority modifiers + uint8 rankMultiplier = hasLieutenant ? 3 : (hasCorporal ? 2 : (hasWGRank ? 1 : 0)); + bool canUseAdvancedVehicles = hasCorporal; // Catapults/Demolishers require Corporal+ + bool canUseSiegeEngines = hasLieutenant; // Siege Engines require Lieutenant + + // Time-based urgency adjustments + float urgencyMultiplier = 1.0f; + if (isLateGame) { + urgencyMultiplier = 2.0f; // Double priority weights in final 10 minutes + } else if (timeRemaining < 900) { // Last 15 minutes + urgencyMultiplier = 1.5f; // 50% increase in urgency + } + + // Role assignments based on team and strategy (modified by urgency and rank) + uint8 workshopFocusProb = uint8(3 * urgencyMultiplier); // Workshop cappers + uint8 towerDefenseProb = uint8(2 * urgencyMultiplier); // Tower defenders (attackers only) + uint8 fortressAssaultProb = uint8(3 * urgencyMultiplier * (canUseAdvancedVehicles ? 1.5f : 1.0f)); // Direct fortress assault (boosted by rank) + uint8 pvpHunterProb = uint8(2 + rankMultiplier); // PvP roamers (rank incentive) if (isDefender) { @@ -2139,23 +2200,45 @@ bool BGTactics::selectObjective(bool reset) if (!workshop_banners.empty()) { - // Prioritize workshops closer to enemy base for attackers, closer to friendly base for defenders + // Enhanced workshop prioritization with group coordination GameObject* bestWorkshop = nullptr; float bestScore = -1.0f; for (GameObject* workshop : workshop_banners) { float distToGate = workshop->GetDistance(WG_GATE_POS); - float score; + float baseScore; if (isDefender) - score = 500.0f - distToGate; // Defenders prefer workshops near gate + baseScore = 500.0f - distToGate; // Defenders prefer workshops near gate else - score = distToGate; // Attackers prefer workshops far from gate (captured ones) + baseScore = distToGate; // Attackers prefer workshops far from gate (captured ones) + + // Group coordination: count nearby allies for workshop captures + uint32 nearbyAllies = 0; + std::list nearbyUnits = botAI->GetAiObjectContext()->GetValue>("nearest friendly players")->Get(); + for (ObjectGuid const& allyGuid : nearbyUnits) + { + if (Unit* ally = botAI->GetUnit(allyGuid)) + { + if (ally->GetDistance(workshop) < 40.0f) // Close enough to help capture + nearbyAllies++; + } + } + + // Bonus for coordinated captures (more allies = higher priority) + float coordinationBonus = nearbyAllies * 50.0f; + + // Late game urgency for workshop control + float urgencyBonus = 0.0f; + if (isLateGame && workshopsControlled < 2) + urgencyBonus = 100.0f; + + float finalScore = baseScore + coordinationBonus + urgencyBonus; - if (score > bestScore) + if (finalScore > bestScore) { - bestScore = score; + bestScore = finalScore; bestWorkshop = workshop; } } @@ -2351,11 +2434,30 @@ bool BGTactics::selectObjective(bool reset) shouldEscort = false; } } - // Escort friendly siege engines - else if (isFriendly && d < 150.0f && !isDefender && + // Enhanced escort for friendly siege engines with coordination + else if (isFriendly && d < 200.0f && !isDefender && (entry == WG_ENTRY_SIEGE_ENGINE_A || entry == WG_ENTRY_SIEGE_ENGINE_H || entry == WG_ENTRY_DEMOLISHER)) { - if (d < bestDist && (role % 5 == 4)) // Only some bots escort + // Count current escorts for this vehicle + uint32 currentEscorts = 0; + std::list nearbyAllies = botAI->GetAiObjectContext()->GetValue>("nearest friendly players")->Get(); + for (ObjectGuid const& allyGuid : nearbyAllies) + { + if (Unit* ally = botAI->GetUnit(allyGuid)) + { + if (ally->GetDistance(v) < 50.0f && !ally->GetVehicle()) // Ally escorting this vehicle + currentEscorts++; + } + } + + // Decide if this bot should escort based on need and role + bool shouldProvideEscort = false; + if (currentEscorts < 2) // Need more escorts + shouldProvideEscort = (role % 4 == 3) || (currentEscorts == 0); // Priority roles or critical need + else if (isLateGame && currentEscorts < 3) // Late game needs more protection + shouldProvideEscort = (role % 6 == 5); + + if (shouldProvideEscort && d < bestDist) { bestDist = d; targetVehicle = v; @@ -2368,15 +2470,40 @@ bool BGTactics::selectObjective(bool reset) { if (shouldEscort) { - // Follow friendly vehicle at escort distance - float rx, ry, rz; - bot->GetRandomPoint(targetVehicle->GetPosition(), frand(25.0f, 45.0f), rx, ry, rz); - pos.Set(rx, ry, rz, bot->GetMapId()); + // Advanced escort positioning with formation awareness + float escortDistance = 30.0f + (role % 3) * 10.0f; // 30-50 yard formation spread + + // Position escorts in formation around the vehicle + float escortAngle = 0.0f; + switch (role % 4) + { + case 0: escortAngle = 0.0f; break; // Front escort (scout) + case 1: escortAngle = M_PI / 2; break; // Right flank + case 2: escortAngle = M_PI; break; // Rear guard + case 3: escortAngle = 3 * M_PI / 2; break; // Left flank + } + + // Calculate escort position relative to vehicle's movement direction + float vehicleOrientation = targetVehicle->GetOrientation(); + float finalAngle = vehicleOrientation + escortAngle; + + float escortX = targetVehicle->GetPositionX() + escortDistance * cos(finalAngle); + float escortY = targetVehicle->GetPositionY() + escortDistance * sin(finalAngle); + float escortZ = targetVehicle->GetPositionZ(); + + pos.Set(escortX, escortY, escortZ, bot->GetMapId()); } else { - // Attack enemy vehicle - pos.Set(targetVehicle->GetPositionX(), targetVehicle->GetPositionY(), targetVehicle->GetPositionZ(), bot->GetMapId()); + // Attack enemy vehicle with flanking maneuvers + float attackAngle = frand(0, 2 * M_PI); // Random flanking angle + float attackDistance = 15.0f + frand(0, 20.0f); // 15-35 yard attack range + + float attackX = targetVehicle->GetPositionX() + attackDistance * cos(attackAngle); + float attackY = targetVehicle->GetPositionY() + attackDistance * sin(attackAngle); + float attackZ = targetVehicle->GetPositionZ(); + + pos.Set(attackX, attackY, attackZ, bot->GetMapId()); context->GetValue("current target")->Set(targetVehicle); } posMap["bg objective"] = pos; @@ -2384,37 +2511,53 @@ bool BGTactics::selectObjective(bool reset) } } - // Priority 6: Vehicle acquisition (similar to IC vehicle spawns) - if (shouldUseVehicles && !bot->GetVehicle()) + // Priority 6: Vehicle acquisition (rank-aware and workshop-limited) + if (shouldUseVehicles && !bot->GetVehicle() && hasWGRank) { - GuidVector nearVehicles = AI_VALUE(GuidVector, "nearest vehicles"); - Unit* bestVehicle = nullptr; - float bestVehDist = FLT_MAX; + // Get current team vehicle count + uint32 currentVehicles = isDefender ? + bf->GetData(BATTLEFIELD_WG_DATA_VEHICLE_A) : + bf->GetData(BATTLEFIELD_WG_DATA_VEHICLE_H); - for (ObjectGuid const& vg : nearVehicles) + // Only try to get vehicle if under limit + if (currentVehicles < maxVehiclesAvailable) { - Unit* v = botAI->GetUnit(vg); - if (!v || !v->IsFriendlyTo(bot)) - continue; + GuidVector nearVehicles = AI_VALUE(GuidVector, "nearest vehicles"); + Unit* bestVehicle = nullptr; + float bestVehDist = FLT_MAX; - uint32 entry = v->GetEntry(); - if (entry != WG_ENTRY_SIEGE_ENGINE_A && entry != WG_ENTRY_SIEGE_ENGINE_H && - entry != WG_ENTRY_DEMOLISHER && entry != WG_ENTRY_CATAPULT) - continue; - - float d = bot->GetDistance(v); - if (d < bestVehDist && d < 100.0f) + for (ObjectGuid const& vg : nearVehicles) { - bestVehDist = d; - bestVehicle = v; + Unit* v = botAI->GetUnit(vg); + if (!v || !v->IsFriendlyTo(bot)) + continue; + + uint32 entry = v->GetEntry(); + + // Rank-based vehicle access control + bool canUseThisVehicle = false; + if (entry == WG_ENTRY_CATAPULT || entry == WG_ENTRY_DEMOLISHER) + canUseThisVehicle = canUseAdvancedVehicles; + else if (entry == WG_ENTRY_SIEGE_ENGINE_A || entry == WG_ENTRY_SIEGE_ENGINE_H) + canUseThisVehicle = canUseSiegeEngines; + + if (!canUseThisVehicle) + continue; + + float d = bot->GetDistance(v); + if (d < bestVehDist && d < 100.0f) + { + bestVehDist = d; + bestVehicle = v; + } } - } - if (bestVehicle) - { - pos.Set(bestVehicle->GetPositionX(), bestVehicle->GetPositionY(), bestVehicle->GetPositionZ(), bot->GetMapId()); - posMap["bg objective"] = pos; - return true; + if (bestVehicle) + { + pos.Set(bestVehicle->GetPositionX(), bestVehicle->GetPositionY(), bestVehicle->GetPositionZ(), bot->GetMapId()); + posMap["bg objective"] = pos; + return true; + } } } diff --git a/src/strategy/generic/BattlegroundStrategy.cpp b/src/strategy/generic/BattlegroundStrategy.cpp index 37edc96669..ccb77d2c24 100644 --- a/src/strategy/generic/BattlegroundStrategy.cpp +++ b/src/strategy/generic/BattlegroundStrategy.cpp @@ -104,18 +104,16 @@ void WintergraspStrategy::InitTriggers(std::vector& triggers) triggers.push_back(new TriggerNode("bg active", NextAction::array(0, new NextAction("enter vehicle", ACTION_MOVE + 7.0f), nullptr))); triggers.push_back(new TriggerNode("often", NextAction::array(0, new NextAction("enter vehicle", ACTION_MOVE + 6.5f), nullptr))); - // Vehicle ability usage + // Wintergrasp vehicle ability usage (authentic WG vehicle abilities) + // Catapult/Demolisher: Boulder attacks for siege warfare triggers.push_back(new TriggerNode("in vehicle", NextAction::array(0, new NextAction("hurl boulder", ACTION_MOVE + 9.0f), nullptr))); - triggers.push_back(new TriggerNode("in vehicle", NextAction::array(0, new NextAction("fire cannon", ACTION_MOVE + 9.0f), nullptr))); - triggers.push_back(new TriggerNode("in vehicle", NextAction::array(0, new NextAction("incendiary rocket", ACTION_MOVE + 9.0f), nullptr))); - triggers.push_back(new TriggerNode("in vehicle", NextAction::array(0, new NextAction("rocket blast", ACTION_MOVE + 9.0f), nullptr))); - triggers.push_back(new TriggerNode("in vehicle", NextAction::array(0, new NextAction("napalm", ACTION_MOVE + 9.0f), nullptr))); - // Close-quarters while in vehicles (steam/ram style interactions) - triggers.push_back(new TriggerNode("enemy is close", NextAction::array(0, new NextAction("steam blast", ACTION_MOVE + 9.0f), nullptr))); - triggers.push_back(new TriggerNode("in vehicle", NextAction::array(0, new NextAction("ram", ACTION_MOVE + 9.0f), nullptr))); + // Siege Engine: Primary cannon fire and ram attacks + triggers.push_back(new TriggerNode("in vehicle", NextAction::array(0, new NextAction("fire cannon", ACTION_MOVE + 8.9f), nullptr))); + triggers.push_back(new TriggerNode("in vehicle", NextAction::array(0, new NextAction("ram", ACTION_MOVE + 8.8f), nullptr))); + + // All vehicles: Close-quarters ram when enemies are near triggers.push_back(new TriggerNode("enemy is close", NextAction::array(0, new NextAction("ram", ACTION_MOVE + 9.1f), nullptr))); - triggers.push_back(new TriggerNode("enemy out of melee", NextAction::array(0, new NextAction("steam rush", ACTION_MOVE + 9.2f), nullptr))); // Objective and capture flow for Battlefield WG (zone-based) // Drive the same BGTactics actions used in BGs but without requiring InBattleground() From ce51191e8f88a8ddf8e3601427f4bbb72189f62e Mon Sep 17 00:00:00 2001 From: Keleborn <22352763+Celandriel@users.noreply.github.com> Date: Wed, 5 Nov 2025 06:38:14 -0800 Subject: [PATCH 141/151] Fix. Leave group actions (#1774) Fix for issue #1768 where the bot master was not getting reset. I also cleaned up leave group action to focus up function scope. I moved the resets from #612 to the actual leaving function. Disclosure: LLMs were NOT used in authoring this PR. Test cases to consider for testers. 1. Master disbands group with random bots. Bots should go about their business. 2. If you can dual box, create a raid where two real player both invite random bots. One player leaves group, their bots should also leave. (edge case, if a random bot that is supposed to leave the group becomes leader they may disband the whole group. --- code_format.sh | 2 +- src/PlayerbotAI.cpp | 203 +++++++++------------- src/PlayerbotAI.h | 5 +- src/strategy/actions/LeaveGroupAction.cpp | 74 ++++---- src/strategy/actions/LeaveGroupAction.h | 2 +- 5 files changed, 122 insertions(+), 164 deletions(-) mode change 100755 => 100644 code_format.sh diff --git a/code_format.sh b/code_format.sh old mode 100755 new mode 100644 index 3e2d3552a4..e9612dacd6 --- a/code_format.sh +++ b/code_format.sh @@ -15,4 +15,4 @@ for file in $cpp_files; do $CLANG_FORMAT_PATH -i $file done -echo "All .cpp or .h files have been formatted." +echo "All .cpp or .h files have been formatted." \ No newline at end of file diff --git a/src/PlayerbotAI.cpp b/src/PlayerbotAI.cpp index 48a259e1b3..f014151ec1 100644 --- a/src/PlayerbotAI.cpp +++ b/src/PlayerbotAI.cpp @@ -355,7 +355,7 @@ void PlayerbotAI::UpdateAI(uint32 elapsed, bool minimal) } // Update the bot's group status (moved to helper function) - UpdateAIGroupMembership(); + UpdateAIGroupAndMaster(); // Update internal AI UpdateAIInternal(elapsed, minimal); @@ -363,47 +363,60 @@ void PlayerbotAI::UpdateAI(uint32 elapsed, bool minimal) } // Helper function for UpdateAI to check group membership and handle removal if necessary -void PlayerbotAI::UpdateAIGroupMembership() +void PlayerbotAI::UpdateAIGroupAndMaster() { - if (!bot || !bot->GetGroup()) + if (!bot) return; - Group* group = bot->GetGroup(); - - if (!bot->InBattleground() && !bot->inRandomLfgDungeon() && !group->isLFGGroup()) + // If bot is not in group verify that for is RandomBot before clearing master and resetting. + if (!group) { - Player* leader = group->GetLeader(); - if (leader && leader != bot) // Ensure the leader is valid and not the bot itself + if (master && sRandomPlayerbotMgr->IsRandomBot(bot)) { - PlayerbotAI* leaderAI = GET_PLAYERBOT_AI(leader); - if (leaderAI && !leaderAI->IsRealPlayer()) - { - LeaveOrDisbandGroup(); - } + SetMaster(nullptr); + Reset(true); + ResetStrategies(); } + return; } - else if (group->isLFGGroup()) - { - bool hasRealPlayer = false; - // Iterate over all group members to check if at least one is a real player - for (GroupReference* ref = group->GetFirstMember(); ref; ref = ref->next()) + if (bot->InBattleground() && bot->GetBattleground()->GetBgTypeID() != BATTLEGROUND_AV) + return; + + PlayerbotAI* botAI = GET_PLAYERBOT_AI(bot); + if (!botAI) + return; + + PlayerbotAI* masterBotAI = nullptr; + if (master) + masterBotAI = GET_PLAYERBOT_AI(master); + + if (!master || (masterBotAI && !masterBotAI->IsRealPlayer())) + { + Player* newMaster = FindNewMaster(); + if (newMaster) { - Player* member = ref->GetSource(); - if (!member) - continue; + master = newMaster; + botAI->SetMaster(newMaster); + botAI->ResetStrategies(); - PlayerbotAI* memberAI = GET_PLAYERBOT_AI(member); - if (memberAI && !memberAI->IsRealPlayer()) - continue; + if (!bot->InBattleground()) + { + botAI->ChangeStrategy("+follow", BOT_STATE_NON_COMBAT); - hasRealPlayer = true; - break; + if (botAI->GetMaster() == botAI->GetGroupMaster()) + botAI->TellMaster("Hello, I follow you!"); + else + botAI->TellMaster(!urand(0, 2) ? "Hello!" : "Hi!"); + } + else + { + // we're in a battleground, stay with the pack and focus on objective + botAI->ChangeStrategy("-follow", BOT_STATE_NON_COMBAT); + } } - if (!hasRealPlayer) - { + else if (!newMaster && !bot->InBattleground()) LeaveOrDisbandGroup(); - } } } @@ -792,7 +805,6 @@ void PlayerbotAI::LeaveOrDisbandGroup() WorldPacket* packet = new WorldPacket(CMSG_GROUP_DISBAND); bot->GetSession()->QueuePacket(packet); - ResetStrategies(); } bool PlayerbotAI::IsAllowedCommand(std::string const text) @@ -1301,7 +1313,6 @@ void PlayerbotAI::DoNextAction(bool min) return; } - // Change engine if just died bool isBotAlive = bot->IsAlive(); if (currentEngine != engines[BOT_STATE_DEAD] && !isBotAlive) @@ -1361,92 +1372,6 @@ void PlayerbotAI::DoNextAction(bool min) Group* group = bot->GetGroup(); PlayerbotAI* masterBotAI = nullptr; - if (master) - masterBotAI = GET_PLAYERBOT_AI(master); - - // Test BG master set - if ((!master || (masterBotAI && !masterBotAI->IsRealPlayer())) && group) - { - PlayerbotAI* botAI = GET_PLAYERBOT_AI(bot); - if (!botAI) - { - return; - } - - // Ideally we want to have the leader as master. - Player* newMaster = botAI->GetGroupMaster(); - Player* playerMaster = nullptr; - - // Are there any non-bot players in the group? - if (!newMaster || GET_PLAYERBOT_AI(newMaster)) - { - for (GroupReference* gref = group->GetFirstMember(); gref; gref = gref->next()) - { - Player* member = gref->GetSource(); - if (!member || member == bot || member == newMaster || !member->IsInWorld() || - !member->IsInSameRaidWith(bot)) - continue; - - PlayerbotAI* memberBotAI = GET_PLAYERBOT_AI(member); - if (memberBotAI) - { - if (memberBotAI->IsRealPlayer() && !bot->InBattleground()) - playerMaster = member; - - continue; - } - - // Same BG checks (optimize checking conditions here) - if (bot->InBattleground() && bot->GetBattleground() && - bot->GetBattleground()->GetBgTypeID() == BATTLEGROUND_AV && !GET_PLAYERBOT_AI(member) && - member->InBattleground() && bot->GetMapId() == member->GetMapId()) - { - // Skip if same BG but same subgroup or lower level - if (!group->SameSubGroup(bot, member) || member->GetLevel() < bot->GetLevel()) - continue; - - // Follow real player only if higher honor points - uint32 honorpts = member->GetHonorPoints(); - if (bot->GetHonorPoints() && honorpts < bot->GetHonorPoints()) - continue; - - playerMaster = member; - continue; - } - - if (bot->InBattleground()) - continue; - - newMaster = member; - break; - } - } - - if (!newMaster && playerMaster) - newMaster = playerMaster; - - if (newMaster && (!master || master != newMaster) && bot != newMaster) - { - master = newMaster; - botAI->SetMaster(newMaster); - botAI->ResetStrategies(); - - if (!bot->InBattleground()) - { - botAI->ChangeStrategy("+follow", BOT_STATE_NON_COMBAT); - - if (botAI->GetMaster() == botAI->GetGroupMaster()) - botAI->TellMaster("Hello, I follow you!"); - else - botAI->TellMaster(!urand(0, 2) ? "Hello!" : "Hi!"); - } - else - { - // we're in a battleground, stay with the pack and focus on objective - botAI->ChangeStrategy("-follow", BOT_STATE_NON_COMBAT); - } - } - } if (master && master->IsInWorld()) { @@ -4135,6 +4060,50 @@ bool IsAlliance(uint8 race) race == RACE_DRAENEI; } +Player* PlayerbotAI::FindNewMaster() +{ + // Ideally we want to have the leader as master. + Group* group = bot->GetGroup(); + // Only allow real players as masters unless in battleground. + if (!group) + return nullptr; + + Player* groupLeader = GetGroupMaster(); + PlayerbotAI* leaderBotAI = GET_PLAYERBOT_AI(groupLeader); + if (!leaderBotAI || leaderBotAI->IsRealPlayer()) + return groupLeader; + + // Find the real player in group + for (GroupReference* gref = group->GetFirstMember(); gref; gref = gref->next()) + { + Player* member = gref->GetSource(); + if (!member || member == bot || !member->IsInWorld() || + !member->IsInSameRaidWith(bot)) + continue; + + PlayerbotAI* memberBotAI = GET_PLAYERBOT_AI(member); + if ((!memberBotAI || memberBotAI->IsRealPlayer()) && !bot->InBattleground()) + return member; + + if (bot->InBattleground() && bot->GetBattleground() && + bot->GetBattleground()->GetBgTypeID() == BATTLEGROUND_AV && !GET_PLAYERBOT_AI(member) && + member->InBattleground() && bot->GetMapId() == member->GetMapId()) + { + // Skip if same BG but same subgroup or lower level + if (!group->SameSubGroup(bot, member) || member->GetLevel() < bot->GetLevel()) + continue; + + // Follow real player only if higher honor points + uint32 honorpts = member->GetHonorPoints(); + if (bot->GetHonorPoints() && honorpts < bot->GetHonorPoints()) + continue; + + return member; + } + } + return nullptr; +} + bool PlayerbotAI::HasRealPlayerMaster() { if (master) diff --git a/src/PlayerbotAI.h b/src/PlayerbotAI.h index a6600845fe..b5dacd7642 100644 --- a/src/PlayerbotAI.h +++ b/src/PlayerbotAI.h @@ -529,7 +529,8 @@ class PlayerbotAI : public PlayerbotAIBase Player* GetBot() { return bot; } Player* GetMaster() { return master; } - + Player* FindNewMaster(); + // Checks if the bot is really a player. Players always have themselves as master. bool IsRealPlayer() { return master ? (master == bot) : false; } // Bot has a master that is a player. @@ -611,7 +612,7 @@ class PlayerbotAI : public PlayerbotAIBase static void _fillGearScoreData(Player* player, Item* item, std::vector* gearScore, uint32& twoHandScore, bool mixed = false); bool IsTellAllowed(PlayerbotSecurityLevel securityLevel = PLAYERBOT_SECURITY_ALLOW_ALL); - void UpdateAIGroupMembership(); + void UpdateAIGroupAndMaster(); Item* FindItemInInventory(std::function checkItem) const; void HandleCommands(); void HandleCommand(uint32 type, const std::string& text, Player& fromPlayer, const uint32 lang = LANG_UNIVERSAL); diff --git a/src/strategy/actions/LeaveGroupAction.cpp b/src/strategy/actions/LeaveGroupAction.cpp index 88567b1ddd..039c476bf5 100644 --- a/src/strategy/actions/LeaveGroupAction.cpp +++ b/src/strategy/actions/LeaveGroupAction.cpp @@ -11,8 +11,11 @@ bool LeaveGroupAction::Execute(Event event) { - Player* master = event.getOwner(); - return Leave(master); + Player* player = event.getOwner(); + if (player == botAI->GetMaster()) + return Leave(); + + return false; } bool PartyCommandAction::Execute(Event event) @@ -26,13 +29,21 @@ bool PartyCommandAction::Execute(Event event) if (operation != PARTY_OP_LEAVE) return false; - + // Only leave if master has left the party, and randombot cannot set new master. Player* master = GetMaster(); if (master && member == master->GetName()) - return Leave(bot); - - botAI->Reset(); - + { + if (sRandomPlayerbotMgr->IsRandomBot(bot)) + { + Player* newMaster = botAI->FindNewMaster(); + if (newMaster || bot->InBattleground()) + { + botAI->SetMaster(newMaster); + return false; + } + } + return Leave(); + } return false; } @@ -42,17 +53,17 @@ bool UninviteAction::Execute(Event event) if (p.GetOpcode() == CMSG_GROUP_UNINVITE) { p.rpos(0); - std::string membername; - p >> membername; + std::string memberName; + p >> memberName; // player not found - if (!normalizePlayerName(membername)) + if (!normalizePlayerName(memberName)) { return false; } - if (bot->GetName() == membername) - return Leave(bot); + if (bot->GetName() == memberName) + return Leave(); } if (p.GetOpcode() == CMSG_GROUP_UNINVITE_GUID) @@ -62,50 +73,29 @@ bool UninviteAction::Execute(Event event) p >> guid; if (bot->GetGUID() == guid) - return Leave(bot); + return Leave(); } - botAI->Reset(); - return false; } -bool LeaveGroupAction::Leave(Player* player) +bool LeaveGroupAction::Leave() { - if (player && - !botAI && - !botAI->GetSecurity()->CheckLevelFor(PLAYERBOT_SECURITY_INVITE, false, player)) - + if (!botAI) return false; - bool aiMaster = GET_PLAYERBOT_AI(botAI->GetMaster()) != nullptr; - - botAI->TellMaster("Goodbye!", PLAYERBOT_SECURITY_TALK); - - bool randomBot = sRandomPlayerbotMgr->IsRandomBot(bot); - bool shouldStay = randomBot && bot->GetGroup() && player == bot; - if (!shouldStay) - { - botAI->LeaveOrDisbandGroup(); - } - - if (randomBot) - { - GET_PLAYERBOT_AI(bot)->SetMaster(nullptr); - } - - if (!aiMaster) - botAI->ResetStrategies(!randomBot); - - botAI->Reset(); + Player* master = botAI -> GetMaster(); + if (master) + botAI->TellMaster("Goodbye!", PLAYERBOT_SECURITY_TALK); + botAI->LeaveOrDisbandGroup(); return true; } bool LeaveFarAwayAction::Execute(Event event) { // allow bot to leave party when they want - return Leave(botAI->GetGroupMaster()); + return Leave(); } bool LeaveFarAwayAction::isUseful() @@ -165,7 +155,5 @@ bool LeaveFarAwayAction::isUseful() return true; } - botAI->Reset(); - return false; } diff --git a/src/strategy/actions/LeaveGroupAction.h b/src/strategy/actions/LeaveGroupAction.h index dcb4e96ce5..83baea3c1b 100644 --- a/src/strategy/actions/LeaveGroupAction.h +++ b/src/strategy/actions/LeaveGroupAction.h @@ -18,7 +18,7 @@ class LeaveGroupAction : public Action bool Execute(Event event) override; - virtual bool Leave(Player* player); + virtual bool Leave(); }; class PartyCommandAction : public LeaveGroupAction From 26e5008f45f2ca9815891a455a7e2791372c6fe7 Mon Sep 17 00:00:00 2001 From: Tecc Date: Wed, 5 Nov 2025 15:39:54 +0100 Subject: [PATCH 142/151] Refine Wintergrasp workshop and data IDs: Update enum definitions for workshops and game objects, ensuring accurate references for gameplay mechanics and interactions. --- src/strategy/actions/BattleGroundTactics.cpp | 81 ++++++++++++++------ 1 file changed, 56 insertions(+), 25 deletions(-) diff --git a/src/strategy/actions/BattleGroundTactics.cpp b/src/strategy/actions/BattleGroundTactics.cpp index 6462ff73bc..bfa4d5c06f 100644 --- a/src/strategy/actions/BattleGroundTactics.cpp +++ b/src/strategy/actions/BattleGroundTactics.cpp @@ -49,13 +49,36 @@ enum WintergraspData BATTLEFIELD_WG_DATA_MAX, }; -// Workshop control tracking (estimated IDs - may need adjustment for specific core) -enum WintergraspWorkshopData +// Real AzerothCore Wintergrasp workshop and data IDs +enum WintergraspWorkshopIds { - BATTLEFIELD_WG_DATA_WORKSHOP_NE = 50, - BATTLEFIELD_WG_DATA_WORKSHOP_NW = 51, - BATTLEFIELD_WG_DATA_WORKSHOP_SE = 52, - BATTLEFIELD_WG_DATA_WORKSHOP_SW = 53, + BATTLEFIELD_WG_WORKSHOP_NE = 0, + BATTLEFIELD_WG_WORKSHOP_NW = 1, + BATTLEFIELD_WG_WORKSHOP_SE = 2, + BATTLEFIELD_WG_WORKSHOP_SW = 3, + BATTLEFIELD_WG_WORKSHOP_KEEP_WEST = 4, + BATTLEFIELD_WG_WORKSHOP_KEEP_EAST = 5, +}; + +enum WintergraspDataIds +{ + BATTLEFIELD_WG_DATA_INTACT_TOWER_ATT = 0, + BATTLEFIELD_WG_DATA_DAMAGED_TOWER_ATT = 1, + BATTLEFIELD_WG_DATA_BROKEN_TOWER_ATT = 2, + BATTLEFIELD_WG_DATA_MAX_VEHICLE_A = 3, + BATTLEFIELD_WG_DATA_MAX_VEHICLE_H = 4, + BATTLEFIELD_WG_DATA_VEHICLE_A = 5, + BATTLEFIELD_WG_DATA_VEHICLE_H = 6, + BATTLEFIELD_WG_DATA_MAX = 7, +}; + +enum WintergraspGameObjects +{ + GO_WINTERGRASP_FACTORY_BANNER_NE = 190475, + GO_WINTERGRASP_FACTORY_BANNER_NW = 190487, + GO_WINTERGRASP_FACTORY_BANNER_SE = 194959, + GO_WINTERGRASP_FACTORY_BANNER_SW = 194962, + GO_WINTERGRASP_TITAN_S_RELIC = 192829, }; // common bg positions @@ -214,15 +237,15 @@ std::vector const vFlagsIC = {GO_HORDE_BANNER, GO_HORDE_BANNER_GRAVEYARD_H, GO_HORDE_BANNER_GRAVEYARD_H_CONT}; -// Wintergrasp capture/interaction objects (Trinity 3.3.5 IDs) -// - Factory banners: capture points for workshops -// - Titan's Relic: game-ending interactable for attackers +// Wintergrasp capture/interaction objects (AzerothCore validated IDs) +// - Factory banners: capture points for workshops that produce vehicles +// - Titan's Relic: game-ending interactable for attackers to claim victory std::vector const vFlagsWG = { - 190475, // GO_WINTERGRASP_FACTORY_BANNER_NE - 190487, // GO_WINTERGRASP_FACTORY_BANNER_NW - 194959, // GO_WINTERGRASP_FACTORY_BANNER_SE - 194962, // GO_WINTERGRASP_FACTORY_BANNER_SW - 192829 // GO_WINTERGRASP_TITAN_S_RELIC + GO_WINTERGRASP_FACTORY_BANNER_NE, // Northeast workshop (Sunken Ring) + GO_WINTERGRASP_FACTORY_BANNER_NW, // Northwest workshop (Broken Temple) + GO_WINTERGRASP_FACTORY_BANNER_SE, // Southeast workshop (Eastspark Workshop) + GO_WINTERGRASP_FACTORY_BANNER_SW, // Southwest workshop (Westspark Workshop) + GO_WINTERGRASP_TITAN_S_RELIC // Victory objective in fortress }; // BG Waypoints (vmangos) @@ -2054,15 +2077,23 @@ bool BGTactics::selectObjective(bool reset) uint32 workshopsControlled = 0; TeamId myTeam = TeamId(bot->GetTeamId()); - // Count workshops controlled by bot's team (fallback to estimated count if data unavailable) - try { - if (bf->GetData(BATTLEFIELD_WG_DATA_WORKSHOP_NE) == myTeam) workshopsControlled++; - if (bf->GetData(BATTLEFIELD_WG_DATA_WORKSHOP_NW) == myTeam) workshopsControlled++; - if (bf->GetData(BATTLEFIELD_WG_DATA_WORKSHOP_SE) == myTeam) workshopsControlled++; - if (bf->GetData(BATTLEFIELD_WG_DATA_WORKSHOP_SW) == myTeam) workshopsControlled++; - } catch (...) { - // Fallback: estimate workshop control based on team and strategy - workshopsControlled = isDefender ? 2 : 1; // Defenders typically hold more workshops initially + // Count workshops controlled by bot's team through proper AzerothCore access + // Based on AzerothCore: workshops are accessible through area control data + workshopsControlled = 0; + + // Check workshop control through battlefield area data (real AzerothCore method) + if (bf->GetData(4538) == myTeam) workshopsControlled++; // AREA_THE_SUNKEN_RING (NE Workshop) + if (bf->GetData(4539) == myTeam) workshopsControlled++; // AREA_THE_BROKEN_TEMPLE (NW Workshop) + if (bf->GetData(4611) == myTeam) workshopsControlled++; // AREA_WESTSPARK_WORKSHOP (SW Workshop) + if (bf->GetData(4612) == myTeam) workshopsControlled++; // AREA_EASTSPARK_WORKSHOP (SE Workshop) + + // Fallback calculation if area data not available + if (workshopsControlled == 0) { + // Use vehicle capacity as indicator of workshop control (each workshop adds +4 vehicles in AC) + uint32 maxVehForTeam = (myTeam == TEAM_ALLIANCE) ? + bf->GetData(BATTLEFIELD_WG_DATA_MAX_VEHICLE_A) : + bf->GetData(BATTLEFIELD_WG_DATA_MAX_VEHICLE_H); + workshopsControlled = maxVehForTeam / 4; // Each workshop = 4 vehicles in AzerothCore } // Dynamic vehicle limits based on workshop control (each workshop = +2 vehicle capacity) @@ -2182,7 +2213,7 @@ bool BGTactics::selectObjective(bool reset) GameObject* go = botAI->GetGameObject(gid); if (!go || std::find(vFlagsWG.begin(), vFlagsWG.end(), go->GetEntry()) == vFlagsWG.end()) continue; - if (go->GetEntry() == 192829) // Skip relic + if (go->GetEntry() == GO_WINTERGRASP_TITAN_S_RELIC) // Skip relic continue; float dist = bot->GetDistance(go); @@ -4182,7 +4213,7 @@ bool BGTactics::resetObjective() bool BGTactics::handleWGTitansRelic(GameObject* go, float dist) { - if (!go || go->GetEntry() != 192829) + if (!go || go->GetEntry() != GO_WINTERGRASP_TITAN_S_RELIC) return false; if (dist < INTERACTION_DISTANCE) From cf41198eed47ba192f2e6e6010346aad281d83c3 Mon Sep 17 00:00:00 2001 From: Tecc Date: Wed, 5 Nov 2025 17:04:11 +0100 Subject: [PATCH 143/151] Remove redundant comments regarding Wintergrasp battlefield ID mapping in join actions --- src/strategy/actions/BattleGroundJoinAction.cpp | 3 --- 1 file changed, 3 deletions(-) diff --git a/src/strategy/actions/BattleGroundJoinAction.cpp b/src/strategy/actions/BattleGroundJoinAction.cpp index a33be4cd67..542c7566ff 100644 --- a/src/strategy/actions/BattleGroundJoinAction.cpp +++ b/src/strategy/actions/BattleGroundJoinAction.cpp @@ -381,7 +381,6 @@ bool BGJoinAction::isUseful() } } - if (!bgList.empty()) return true; @@ -481,7 +480,6 @@ bool BGJoinAction::JoinQueue(uint32 type) case BATTLEGROUND_IC: _bgType = "IoC"; break; - // WG is Battlefield on AC; no BG id mapping here default: break; } @@ -856,7 +854,6 @@ bool BGStatusAction::Execute(Event event) case BATTLEGROUND_IC: _bgType = "IoC"; break; - // WG is Battlefield on AC; no BG id mapping here default: break; } From 72947b7ba2902bc09d8e6e2f8fa922d12ae06aea Mon Sep 17 00:00:00 2001 From: Tecc Date: Wed, 5 Nov 2025 18:15:44 +0100 Subject: [PATCH 144/151] Update src/PlayerbotAIConfig.cpp Co-authored-by: gemini-code-assist[bot] <176961590+gemini-code-assist[bot]@users.noreply.github.com> --- src/PlayerbotAIConfig.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/PlayerbotAIConfig.cpp b/src/PlayerbotAIConfig.cpp index 7bdaf18fb6..4cbe9c26bf 100644 --- a/src/PlayerbotAIConfig.cpp +++ b/src/PlayerbotAIConfig.cpp @@ -320,7 +320,7 @@ bool PlayerbotAIConfig::Initialize() // Wintergrasp master toggle (similar to RandomBotJoinBG) randomBotJoinWG = sConfigMgr->GetOption("AiPlayerbot.RandomBotJoinWG", true); // Wintergrasp (Battlefield) queue participation - randomBotAutoJoinWGQueue = sConfigMgr->GetOption("AiPlayerbot.RandomBotAutoJoinWGQueue", true); + randomBotAutoJoinWGQueue = sConfigMgr->GetOption("AiPlayerbot.RandomBotAutoJoinWGQueue", false); randomBotAutoJoinArenaBracket = sConfigMgr->GetOption("AiPlayerbot.RandomBotAutoJoinArenaBracket", 7); From 819291ee725049155759ad5601c786829d84ed6d Mon Sep 17 00:00:00 2001 From: Tecc Date: Wed, 5 Nov 2025 18:19:33 +0100 Subject: [PATCH 145/151] Apply suggestion from @Copilot Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com> --- src/strategy/actions/ActionContext.h | 1 - 1 file changed, 1 deletion(-) diff --git a/src/strategy/actions/ActionContext.h b/src/strategy/actions/ActionContext.h index bb3dbb2643..27569ee2ae 100644 --- a/src/strategy/actions/ActionContext.h +++ b/src/strategy/actions/ActionContext.h @@ -209,7 +209,6 @@ class ActionContext : public NamedObjectContext creators["wg travel"] = &ActionContext::wg_travel; creators["wg queue"] = &ActionContext::wg_queue; creators["wg enter war"] = &ActionContext::wg_enter_war; - creators["wg travel"] = &ActionContext::wg_travel; // Vehicles creators["enter vehicle"] = &ActionContext::enter_vehicle; From 9689c2fff76aecbd4cda72505b5db70d3dfe4fc3 Mon Sep 17 00:00:00 2001 From: Tecc Date: Wed, 5 Nov 2025 19:52:27 +0100 Subject: [PATCH 146/151] Replaces hardcoded Wintergrasp zone ID (4197) with a defined constant (WINTERGRASP_ZONE_ID) for improved code readability and maintainability. Centralizes Wintergrasp-related constants and enumerations in a header file, reducing duplication and aligning with best practices. Updates related logic to use the new definitions, ensuring consistency across files and improving the clarity of battlefield handling and strategy execution. --- src/AiFactory.cpp | 3 +- src/PlayerbotAIConfig.cpp | 3 +- src/RandomPlayerbotMgr.cpp | 11 +- src/strategy/actions/BattleGroundTactics.cpp | 131 ++++++------------- src/strategy/actions/BattleGroundTactics.h | 65 +++++++++ src/strategy/actions/VehicleActions.cpp | 18 +-- 6 files changed, 118 insertions(+), 113 deletions(-) diff --git a/src/AiFactory.cpp b/src/AiFactory.cpp index e2c100dd6e..a2d51f1062 100644 --- a/src/AiFactory.cpp +++ b/src/AiFactory.cpp @@ -7,6 +7,7 @@ #include "BattlegroundMgr.h" #include "BattlefieldMgr.h" +#include "BattleGroundTactics.h" #include "DKAiObjectContext.h" #include "DruidAiObjectContext.h" #include "Engine.h" @@ -731,7 +732,7 @@ void AiFactory::AddDefaultNonCombatStrategies(Player* player, PlayerbotAI* const } // Ensure Wintergrasp strategy is available; triggers inside gate actual behavior. // Always add for random bots so they can react to wartime and travel. - if (sRandomPlayerbotMgr->IsRandomBot(player) || (sBattlefieldMgr->GetBattlefieldToZoneId(4197) != nullptr)) + if (sRandomPlayerbotMgr->IsRandomBot(player) || (sBattlefieldMgr->GetBattlefieldToZoneId(WINTERGRASP_ZONE_ID) != nullptr)) nonCombatEngine->addStrategy("wintergrasp", false); // nonCombatEngine->addStrategy("battleground"); diff --git a/src/PlayerbotAIConfig.cpp b/src/PlayerbotAIConfig.cpp index 4cbe9c26bf..a4f065db40 100644 --- a/src/PlayerbotAIConfig.cpp +++ b/src/PlayerbotAIConfig.cpp @@ -5,6 +5,7 @@ #include "PlayerbotAIConfig.h" #include +#include "BattleGroundTactics.h" #include "Config.h" #include "NewRpgInfo.h" #include "PlayerbotDungeonSuggestionMgr.h" @@ -370,7 +371,7 @@ bool PlayerbotAIConfig::Initialize() // The Burning Crusade - Zones 3483, 3518, 3519, 3520, 3521, 3522, 3523, 4080, // Wrath of the Lich King - Zones - 65, 66, 67, 210, 394, 495, 2817, 3537, 3711, 4197 + 65, 66, 67, 210, 394, 495, 2817, 3537, 3711, WINTERGRASP_ZONE_ID }; for (uint32 zoneId : zoneIds) diff --git a/src/RandomPlayerbotMgr.cpp b/src/RandomPlayerbotMgr.cpp index 8fd8267493..43b0200561 100644 --- a/src/RandomPlayerbotMgr.cpp +++ b/src/RandomPlayerbotMgr.cpp @@ -19,6 +19,7 @@ #include "ArenaTeamMgr.h" #include "Battleground.h" #include "BattlegroundMgr.h" +#include "BattleGroundTactics.h" #include "CellImpl.h" #include "ChannelMgr.h" #include "DBCStores.h" @@ -1380,7 +1381,7 @@ void RandomPlayerbotMgr::CheckWGFill() WGCheckTimer = time(nullptr); - Battlefield* bf = sBattlefieldMgr->GetBattlefieldToZoneId(4197 /* Wintergrasp */); + Battlefield* bf = sBattlefieldMgr->GetBattlefieldToZoneId(WINTERGRASP_ZONE_ID); if (!bf) return; @@ -1395,7 +1396,7 @@ void RandomPlayerbotMgr::CheckWGFill() { if (!p || !p->IsInWorld()) continue; - if (p->GetZoneId() != 4197) + if (p->GetZoneId() != WINTERGRASP_ZONE_ID) continue; TeamId t = p->GetTeamId(); @@ -1417,7 +1418,7 @@ void RandomPlayerbotMgr::CheckWGFill() // WG level bracket (default 79-80) uint32 minLevel = 79; - auto it = zone2LevelBracket.find(4197); + auto it = zone2LevelBracket.find(WINTERGRASP_ZONE_ID); if (it != zone2LevelBracket.end()) minLevel = it->second.low; @@ -1433,7 +1434,7 @@ void RandomPlayerbotMgr::CheckWGFill() continue; if (p->InBattleground()) continue; - if (p->GetZoneId() == 4197) + if (p->GetZoneId() == WINTERGRASP_ZONE_ID) continue; // already in WG eligible[p->GetTeamId()].push_back(p); @@ -1976,7 +1977,7 @@ void RandomPlayerbotMgr::PrepareZone2LevelBracket() zone2LevelBracket[2817] = {77, 80}; // Crystalsong Forest zone2LevelBracket[3537] = {68, 75}; // Borean Tundra zone2LevelBracket[3711] = {75, 80}; // Sholazar Basin - zone2LevelBracket[4197] = {79, 80}; // Wintergrasp + zone2LevelBracket[WINTERGRASP_ZONE_ID] = {79, 80}; // Wintergrasp // Override with values from config for (auto const& [zoneId, bracketPair] : sPlayerbotAIConfig->zoneBrackets) diff --git a/src/strategy/actions/BattleGroundTactics.cpp b/src/strategy/actions/BattleGroundTactics.cpp index bfa4d5c06f..af39a410be 100644 --- a/src/strategy/actions/BattleGroundTactics.cpp +++ b/src/strategy/actions/BattleGroundTactics.cpp @@ -30,56 +30,12 @@ #include "PathGenerator.h" #include "ServerFacade.h" #include "Vehicle.h" -#include "BattlefieldMgr.h" #include "Battlefield.h" #include "ChooseTravelTargetAction.h" #include "ObjectAccessor.h" #include "TravelMgr.h" -// Wintergrasp Battlefield Data constants (from AzerothCore BattlefieldWG.h) -enum WintergraspData -{ - BATTLEFIELD_WG_DATA_INTACT_TOWER_ATT, - BATTLEFIELD_WG_DATA_DAMAGED_TOWER_ATT, - BATTLEFIELD_WG_DATA_BROKEN_TOWER_ATT, - BATTLEFIELD_WG_DATA_MAX_VEHICLE_A, - BATTLEFIELD_WG_DATA_MAX_VEHICLE_H, - BATTLEFIELD_WG_DATA_VEHICLE_A, - BATTLEFIELD_WG_DATA_VEHICLE_H, - BATTLEFIELD_WG_DATA_MAX, -}; - -// Real AzerothCore Wintergrasp workshop and data IDs -enum WintergraspWorkshopIds -{ - BATTLEFIELD_WG_WORKSHOP_NE = 0, - BATTLEFIELD_WG_WORKSHOP_NW = 1, - BATTLEFIELD_WG_WORKSHOP_SE = 2, - BATTLEFIELD_WG_WORKSHOP_SW = 3, - BATTLEFIELD_WG_WORKSHOP_KEEP_WEST = 4, - BATTLEFIELD_WG_WORKSHOP_KEEP_EAST = 5, -}; - -enum WintergraspDataIds -{ - BATTLEFIELD_WG_DATA_INTACT_TOWER_ATT = 0, - BATTLEFIELD_WG_DATA_DAMAGED_TOWER_ATT = 1, - BATTLEFIELD_WG_DATA_BROKEN_TOWER_ATT = 2, - BATTLEFIELD_WG_DATA_MAX_VEHICLE_A = 3, - BATTLEFIELD_WG_DATA_MAX_VEHICLE_H = 4, - BATTLEFIELD_WG_DATA_VEHICLE_A = 5, - BATTLEFIELD_WG_DATA_VEHICLE_H = 6, - BATTLEFIELD_WG_DATA_MAX = 7, -}; -enum WintergraspGameObjects -{ - GO_WINTERGRASP_FACTORY_BANNER_NE = 190475, - GO_WINTERGRASP_FACTORY_BANNER_NW = 190487, - GO_WINTERGRASP_FACTORY_BANNER_SE = 194959, - GO_WINTERGRASP_FACTORY_BANNER_SW = 194962, - GO_WINTERGRASP_TITAN_S_RELIC = 192829, -}; // common bg positions Position const WS_WAITING_POS_HORDE_1 = {944.981f, 1423.478f, 345.434f, 6.18f}; @@ -154,21 +110,12 @@ Position const IC_CANNON_POS_ALLIANCE2 = {425.525f, -779.538f, 87.717f, 5.88f}; Position const IC_GATE_ATTACK_POS_HORDE = {506.782f, -828.594f, 24.313f, 0.0f}; Position const IC_GATE_ATTACK_POS_ALLIANCE = {1091.273f, -763.619f, 42.352f, 0.0f}; -// Wintergrasp key positions (from TC 3.3.5) -// Fortress outer gate (siege focus for attackers) -static Position const WG_GATE_POS = {5162.991f, 2841.232f, 410.1892f, -3.132858f}; -// Titan's Relic (final objective for attackers) -static Position const WG_RELIC_POS = {5440.379f, 2840.493f, 430.2816f, -1.832595f}; -// Southern/external towers (attacker siege boosters / defender priorities) -static Position const WG_TOWER_W_POS = {4557.173f, 3623.943f, 395.8828f, 1.675516f}; -static Position const WG_TOWER_S_POS = {4398.172f, 2822.497f, 405.6270f, -3.124123f}; -static Position const WG_TOWER_E_POS = {4459.105f, 1944.326f, 434.9912f, -2.002762f}; - -// WG vehicle entries (Trinity 3.3.5) -static constexpr uint32 WG_ENTRY_SIEGE_ENGINE_A = 28312; -static constexpr uint32 WG_ENTRY_SIEGE_ENGINE_H = 32627; -static constexpr uint32 WG_ENTRY_CATAPULT = 27881; -static constexpr uint32 WG_ENTRY_DEMOLISHER = 28094; +// Wintergrasp key positions (from TC 3.3.5) - definitions for extern declarations in header +Position const WG_GATE_POS = {5162.991f, 2841.232f, 410.1892f, -3.132858f}; // Fortress outer gate (siege focus for attackers) +Position const WG_RELIC_POS = {5440.379f, 2840.493f, 430.2816f, -1.832595f}; // Titan's Relic (final objective for attackers) +Position const WG_TOWER_W_POS = {4557.173f, 3623.943f, 395.8828f, 1.675516f}; // Western tower (attacker siege boosters / defender priorities) +Position const WG_TOWER_S_POS = {4398.172f, 2822.497f, 405.6270f, -3.124123f}; // Southern tower +Position const WG_TOWER_E_POS = {4459.105f, 1944.326f, 434.9912f, -2.002762f}; // Eastern tower enum BattleBotWsgWaitSpot { @@ -1673,7 +1620,7 @@ bool BGTactics::eyJumpDown() bool BGTactics::Execute(Event event) { Battleground* bg = bot->GetBattleground(); - bool isWGZone = (bot->GetZoneId() == 4197); + bool isWGZone = (bot->GetZoneId() == WINTERGRASP_ZONE_ID); if (!bg && !isWGZone) { botAI->ResetStrategies(); @@ -1700,8 +1647,6 @@ bool BGTactics::Execute(Event event) bgType = bot->GetBattleground()->GetBgTypeID(true); // Wintergrasp (Battlefield) support: set paths/flags by zone - // Wintergrasp (Battlefield) support: set paths/flags by zone - // isWGZone already set above if (isWGZone) { vPaths = &vPaths_WG; @@ -1740,7 +1685,7 @@ bool BGTactics::Execute(Event event) vFlagIds = &vFlagsIC; break; } - // Note: Wintergrasp is a Battlefield on AzerothCore (handled by zoneId 4197 above) + // Note: Wintergrasp is a Battlefield on AzerothCore (handled by zoneId WINTERGRASP_ZONE_ID above) default: // can't use this in this BG - no vPaths/vFlagIds (will crash server) // For WG (Battlefield) we rely on zone-based handling above @@ -1852,7 +1797,7 @@ bool BGTactics::Execute(Event event) bool BGTactics::moveToStart(bool force) { Battleground* bg = bot->GetBattleground(); - bool isWGZone = (bot->GetZoneId() == 4197); + bool isWGZone = (bot->GetZoneId() == WINTERGRASP_ZONE_ID); if (!bg && !isWGZone) return false; @@ -1970,7 +1915,7 @@ bool BGTactics::moveToStart(bool force) } else if (isWGZone) { - Battlefield* bf = sBattlefieldMgr->GetBattlefieldToZoneId(4197 /* Wintergrasp */); + Battlefield* bf = sBattlefieldMgr->GetBattlefieldToZoneId(WINTERGRASP_ZONE_ID /* Wintergrasp */); if (!bf || !bf->IsWarTime()) return true; // Spread bots across lanes before battle start to avoid zerging one spot. @@ -2002,7 +1947,7 @@ bool BGTactics::moveToStart(bool force) lane = WG_TOWER_E_POS; return MoveTo(bot->GetMapId(), lane.GetPositionX() + frand(-8.0f, 8.0f), lane.GetPositionY() + frand(-8.0f, 8.0f), lane.GetPositionZ()); - } + } } return true; @@ -2011,7 +1956,7 @@ bool BGTactics::moveToStart(bool force) bool BGTactics::selectObjective(bool reset) { Battleground* bg = bot->GetBattleground(); - bool isWGZone = (bot->GetZoneId() == 4197); + bool isWGZone = (bot->GetZoneId() == WINTERGRASP_ZONE_ID); if (!bg) { // Allow Wintergrasp objective selection outside of Battleground @@ -2036,7 +1981,7 @@ bool BGTactics::selectObjective(bool reset) // Wintergrasp Battlefield objective selection (zone-driven) if (isWGZone) { - Battlefield* bf = sBattlefieldMgr->GetBattlefieldToZoneId(4197); + Battlefield* bf = sBattlefieldMgr->GetBattlefieldToZoneId(WINTERGRASP_ZONE_ID); if (!bf) return false; @@ -2058,7 +2003,6 @@ bool BGTactics::selectObjective(bool reset) } // WG Strategy system based on team objectives - enum WGBotStrategy { WG_STRATEGY_BALANCED = 0, WG_STRATEGY_OFFENSIVE, WG_STRATEGY_DEFENSIVE }; WGBotStrategy strategy = static_cast(role % 3); // Dynamic battle state analysis @@ -2116,9 +2060,9 @@ bool BGTactics::selectObjective(bool reset) } // Rank tracking and priority adjustments (affects vehicle access and tactical priorities) - bool hasWGRank = bot->HasAura(37795) || bot->HasAura(33280) || bot->HasAura(55629); // Recruit, Corporal, Lieutenant - bool hasCorporal = bot->HasAura(33280) || bot->HasAura(55629); // Corporal or Lieutenant - bool hasLieutenant = bot->HasAura(55629); // Lieutenant + bool hasWGRank = bot->HasAura(WG_SPELL_RECRUIT) || bot->HasAura(WG_SPELL_CORPORAL) || bot->HasAura(WG_SPELL_LIEUTENANT); // Recruit, Corporal, Lieutenant + bool hasCorporal = bot->HasAura(WG_SPELL_CORPORAL) || bot->HasAura(WG_SPELL_LIEUTENANT); // Corporal or Lieutenant + bool hasLieutenant = bot->HasAura(WG_SPELL_LIEUTENANT); // Lieutenant // Rank-based priority modifiers uint8 rankMultiplier = hasLieutenant ? 3 : (hasCorporal ? 2 : (hasWGRank ? 1 : 0)); @@ -2542,6 +2486,12 @@ bool BGTactics::selectObjective(bool reset) } } + // Vehicle usage decision based on tactical situation + bool shouldUseVehicles = (workshopsControlled > 0) && // Must have workshops for vehicles + (maxVehiclesAvailable > 0) && // Must have vehicle capacity + (!isLateGame || !isDefender) && // Defenders focus on relic defense in late game + (hasWGRank); // Must have appropriate rank + // Priority 6: Vehicle acquisition (rank-aware and workshop-limited) if (shouldUseVehicles && !bot->GetVehicle() && hasWGRank) { @@ -2672,7 +2622,6 @@ bool BGTactics::selectObjective(bool reset) return true; } } - } switch (bgType) { case BATTLEGROUND_AV: @@ -2957,7 +2906,7 @@ bool BGTactics::selectObjective(bool reset) break; } - // Note: Wintergrasp is a Battlefield on AzerothCore (handled by zoneId 4197 above) + // Note: Wintergrasp is a Battlefield on AzerothCore (handled by zoneId WINTERGRASP_ZONE_ID above) case BATTLEGROUND_WS: { Position target; @@ -3994,7 +3943,7 @@ bool BGTactics::selectObjective(bool reset) bool BGTactics::moveToObjective(bool ignoreDist) { Battleground* bg = bot->GetBattleground(); - bool isWGZone = (bot->GetZoneId() == 4197); + bool isWGZone = (bot->GetZoneId() == WINTERGRASP_ZONE_ID); if (!bg && !isWGZone) return false; @@ -4178,7 +4127,7 @@ bool BGTactics::selectObjectiveWp(std::vector const& vPaths) bool BGTactics::resetObjective() { Battleground* bg = bot->GetBattleground(); - bool isWGZone = (bot->GetZoneId() == 4197); + bool isWGZone = (bot->GetZoneId() == WINTERGRASP_ZONE_ID); // Adjust role-change chance based on battleground type uint32 oddsToChangeRole = 1; // default low @@ -4394,7 +4343,7 @@ bool BGTactics::atFlag(std::vector const& vPaths, std::vectorGetBattleground(); - bool isWGZone = (bot->GetZoneId() == 4197); + bool isWGZone = (bot->GetZoneId() == WINTERGRASP_ZONE_ID); if (!bg && !isWGZone) return false; @@ -5086,19 +5035,19 @@ bool WintergraspTravelAction::isUseful() return false; } - if (bot->GetZoneId() == 4197) // already in WG + if (bot->GetZoneId() == WINTERGRASP_ZONE_ID) // already in WG { LOG_DEBUG("playerbots", "WG travel gated: already in WG zone for bot {}", bot->GetName()); return false; } - if (Battlefield* bf = sBattlefieldMgr->GetBattlefieldToZoneId(4197)) + if (Battlefield* bf = sBattlefieldMgr->GetBattlefieldToZoneId(WINTERGRASP_ZONE_ID)) { // Travel during wartime, or pre-stage when the battlefield exists (no timer exposed; staging is opportunistic) return true; } - LOG_DEBUG("playerbots", "WG travel gated: no Battlefield for WG (zone 4197) for bot {}", bot->GetName()); + LOG_DEBUG("playerbots", "WG travel gated: no Battlefield for WG (zone WINTERGRASP_ZONE_ID) for bot {}", bot->GetName()); return false; } @@ -5156,10 +5105,10 @@ bool WintergraspQueueAction::isUseful() return false; } - Battlefield* bf = sBattlefieldMgr->GetBattlefieldToZoneId(4197); + Battlefield* bf = sBattlefieldMgr->GetBattlefieldToZoneId(WINTERGRASP_ZONE_ID); if (!bf) { - LOG_DEBUG("playerbots", "WG queue gated: no Battlefield for WG (zone 4197) for bot {}", bot->GetName()); + LOG_DEBUG("playerbots", "WG queue gated: no Battlefield for WG (zone WINTERGRASP_ZONE_ID) for bot {}", bot->GetName()); return false; } @@ -5171,7 +5120,7 @@ bool WintergraspQueueAction::isUseful() } // Simple level gate: respect WG bracket (default 79-80) - auto it = sRandomPlayerbotMgr->zone2LevelBracket.find(4197); + auto it = sRandomPlayerbotMgr->zone2LevelBracket.find(WINTERGRASP_ZONE_ID); if (it != sRandomPlayerbotMgr->zone2LevelBracket.end()) { uint32 minL = it->second.low; @@ -5187,13 +5136,13 @@ bool WintergraspQueueAction::isUseful() bool WintergraspQueueAction::Execute(Event /*event*/) { - if (Battlefield* bf = sBattlefieldMgr->GetBattlefieldToZoneId(4197)) + if (Battlefield* bf = sBattlefieldMgr->GetBattlefieldToZoneId(WINTERGRASP_ZONE_ID)) { bf->PlayerAcceptInviteToQueue(bot); LOG_INFO("playerbots", "Bot {} queued for Wintergrasp", bot->GetName()); return true; } - LOG_DEBUG("playerbots", "WG queue Execute: no Battlefield for WG (zone 4197) for bot {}", bot->GetName()); + LOG_DEBUG("playerbots", "WG queue Execute: no Battlefield for WG (zone WINTERGRASP_ZONE_ID) for bot {}", bot->GetName()); return false; } @@ -5208,10 +5157,10 @@ bool WintergraspEnterWarAction::isUseful() return false; } - Battlefield* bf = sBattlefieldMgr->GetBattlefieldToZoneId(4197); + Battlefield* bf = sBattlefieldMgr->GetBattlefieldToZoneId(WINTERGRASP_ZONE_ID); if (!bf) { - LOG_DEBUG("playerbots", "WG enter gated: no Battlefield for WG (zone 4197) for bot {}", bot->GetName()); + LOG_DEBUG("playerbots", "WG enter gated: no Battlefield for WG (zone WINTERGRASP_ZONE_ID) for bot {}", bot->GetName()); return false; } @@ -5223,7 +5172,7 @@ bool WintergraspEnterWarAction::isUseful() } // If already in Wintergrasp map/zone, no need - if (bot->GetZoneId() == 4197) + if (bot->GetZoneId() == WINTERGRASP_ZONE_ID) { LOG_DEBUG("playerbots", "WG enter gated: already in WG zone for bot {}", bot->GetName()); return false; @@ -5242,7 +5191,7 @@ bool WintergraspEnterWarAction::isUseful() Player* plr = pair.second; if (!plr || !plr->IsInWorld()) continue; - if (plr->GetZoneId() != 4197) + if (plr->GetZoneId() != WINTERGRASP_ZONE_ID) continue; if (sRandomPlayerbotMgr->IsRandomBot(plr)) continue; // skip bots @@ -5267,13 +5216,13 @@ bool WintergraspEnterWarAction::isUseful() bool WintergraspEnterWarAction::Execute(Event /*event*/) { - if (Battlefield* bf = sBattlefieldMgr->GetBattlefieldToZoneId(4197)) + if (Battlefield* bf = sBattlefieldMgr->GetBattlefieldToZoneId(WINTERGRASP_ZONE_ID)) { bf->PlayerAcceptInviteToWar(bot); LOG_INFO("playerbots", "Bot {} forced entry into Wintergrasp war", bot->GetName()); return true; } - LOG_DEBUG("playerbots", "WG enter Execute: no Battlefield for WG (zone 4197) for bot {}", bot->GetName()); + LOG_DEBUG("playerbots", "WG enter Execute: no Battlefield for WG (zone WINTERGRASP_ZONE_ID) for bot {}", bot->GetName()); return false; } diff --git a/src/strategy/actions/BattleGroundTactics.h b/src/strategy/actions/BattleGroundTactics.h index a50dcf735e..3f75bfb695 100644 --- a/src/strategy/actions/BattleGroundTactics.h +++ b/src/strategy/actions/BattleGroundTactics.h @@ -50,6 +50,71 @@ enum EYBotStrategy : uint8 EY_STRATEGY_MAX = 4 }; +// Wintergrasp Zone and Constants +constexpr uint32 WINTERGRASP_ZONE_ID = 4197; + +// Wintergrasp Strategy Types +enum WGBotStrategy : uint8 +{ + WG_STRATEGY_BALANCED = 0, + WG_STRATEGY_OFFENSIVE = 1, + WG_STRATEGY_DEFENSIVE = 2, + WG_STRATEGY_MAX = 3 +}; + +// Wintergrasp Battlefield Data constants (from AzerothCore BattlefieldWG.h) +enum WintergraspDataIds +{ + BATTLEFIELD_WG_DATA_INTACT_TOWER_ATT = 0, + BATTLEFIELD_WG_DATA_DAMAGED_TOWER_ATT = 1, + BATTLEFIELD_WG_DATA_BROKEN_TOWER_ATT = 2, + BATTLEFIELD_WG_DATA_MAX_VEHICLE_A = 3, + BATTLEFIELD_WG_DATA_MAX_VEHICLE_H = 4, + BATTLEFIELD_WG_DATA_VEHICLE_A = 5, + BATTLEFIELD_WG_DATA_VEHICLE_H = 6, + BATTLEFIELD_WG_DATA_MAX = 7, +}; + +// Wintergrasp Workshop IDs +enum WintergraspWorkshopIds +{ + BATTLEFIELD_WG_WORKSHOP_NE = 0, + BATTLEFIELD_WG_WORKSHOP_NW = 1, + BATTLEFIELD_WG_WORKSHOP_SE = 2, + BATTLEFIELD_WG_WORKSHOP_SW = 3, + BATTLEFIELD_WG_WORKSHOP_KEEP_WEST = 4, + BATTLEFIELD_WG_WORKSHOP_KEEP_EAST = 5, +}; + +// Wintergrasp Game Objects +enum WintergraspGameObjects +{ + GO_WINTERGRASP_FACTORY_BANNER_NE = 190475, + GO_WINTERGRASP_FACTORY_BANNER_NW = 190487, + GO_WINTERGRASP_FACTORY_BANNER_SE = 194959, + GO_WINTERGRASP_FACTORY_BANNER_SW = 194962, + GO_WINTERGRASP_TITAN_S_RELIC = 192829, +}; + +// Wintergrasp Vehicle Entries +constexpr uint32 WG_ENTRY_SIEGE_ENGINE_A = 28312; +constexpr uint32 WG_ENTRY_SIEGE_ENGINE_H = 32627; +constexpr uint32 WG_ENTRY_CATAPULT = 27881; +constexpr uint32 WG_ENTRY_DEMOLISHER = 28094; +constexpr uint32 WG_TOWER_CANNON_ENTRY = 28366; // NPC_WINTERGRASP_TOWER_CANNON + +// Wintergrasp Rank Auras +constexpr uint32 WG_SPELL_RECRUIT = 37795; +constexpr uint32 WG_SPELL_CORPORAL = 33280; +constexpr uint32 WG_SPELL_LIEUTENANT = 55629; + +// Wintergrasp Key Positions +extern Position const WG_GATE_POS; // Fortress outer gate (siege focus for attackers) +extern Position const WG_RELIC_POS; // Titan's Relic (final objective for attackers) +extern Position const WG_TOWER_W_POS; // Western tower +extern Position const WG_TOWER_S_POS; // Southern tower +extern Position const WG_TOWER_E_POS; // Eastern tower + typedef void (*BattleBotWaypointFunc)(); struct BGStrategyData diff --git a/src/strategy/actions/VehicleActions.cpp b/src/strategy/actions/VehicleActions.cpp index 3765381437..2f074ccd1e 100644 --- a/src/strategy/actions/VehicleActions.cpp +++ b/src/strategy/actions/VehicleActions.cpp @@ -6,6 +6,7 @@ #include "VehicleActions.h" #include "BattlegroundIC.h" +#include "BattleGroundTactics.h" #include "ItemVisitors.h" #include "ObjectDefines.h" #include "Playerbots.h" @@ -15,19 +16,6 @@ #include "Vehicle.h" #include "BattlefieldMgr.h" -// Wintergrasp rank auras (from TC 3.3.5 BattlefieldWG.h) -static constexpr uint32 WG_SPELL_RECRUIT = 37795; -static constexpr uint32 WG_SPELL_CORPORAL = 33280; -static constexpr uint32 WG_SPELL_LIEUTENANT = 55629; -static constexpr uint32 WG_ZONE_ID = 4197; // Wintergrasp Zone - -// Wintergrasp vehicle entries (Trinity 3.3.5) -static constexpr uint32 WG_ENTRY_SIEGE_ENGINE_A = 28312; -static constexpr uint32 WG_ENTRY_SIEGE_ENGINE_H = 32627; -static constexpr uint32 WG_ENTRY_CATAPULT = 27881; -static constexpr uint32 WG_ENTRY_DEMOLISHER = 28094; -static constexpr uint32 WG_TOWER_CANNON_ENTRY = 28366; // NPC_WINTERGRASP_TOWER_CANNON - // Wintergrasp key position (Gate) to detect fortress pressure static constexpr float WG_GATE_X = 5162.991f; static constexpr float WG_GATE_Y = 2841.232f; @@ -66,7 +54,7 @@ bool EnterVehicleAction::Execute(Event event) return false; // In Wintergrasp, require rank aura before entering vehicles - bool isInWG = (bot->GetZoneId() == WG_ZONE_ID); + bool isInWG = (bot->GetZoneId() == WINTERGRASP_ZONE_ID); if (isInWG && !HasWGRankAtLeast(bot)) return false; @@ -92,7 +80,7 @@ bool EnterVehicleAction::Execute(Event event) bool isWGDefender = false; if (isInWG) { - if (Battlefield* bf = sBattlefieldMgr->GetBattlefieldToZoneId(WG_ZONE_ID)) + if (Battlefield* bf = sBattlefieldMgr->GetBattlefieldToZoneId(WINTERGRASP_ZONE_ID)) { // Do not enter vehicles during WG preparation (no wartime) if (!bf->IsWarTime()) From 85c7009fe1af8815c203ed963f431b5a08930f86 Mon Sep 17 00:00:00 2001 From: kadeshar Date: Wed, 5 Nov 2025 21:10:17 +0100 Subject: [PATCH 147/151] Codestyle fix (#1797) Warning: Dont change this PR as draft to make it testable DONT REVIEW UNTIL Codestyle C++ workflow dont pass --- .github/workflows/codestyle_cpp.yml | 2 +- var/.suppress.cppcheck => .suppress.cppcheck | 0 apps/{ => codestyle}/codestyle-cpp.py | 0 src/AiFactory.cpp | 10 +- src/BroadcastHelper.cpp | 5 +- src/ChatFilter.cpp | 4 +- src/ChatHelper.cpp | 9 +- src/GuildTaskMgr.cpp | 2 +- src/PlayerbotAI.cpp | 37 +++--- src/PlayerbotAI.h | 2 +- src/PlayerbotMgr.cpp | 3 +- src/RandomItemMgr.cpp | 11 +- src/RandomPlayerbotMgr.cpp | 23 ++-- src/ServerFacade.cpp | 2 +- src/TravelMgr.cpp | 9 +- src/TravelNode.cpp | 9 +- src/factory/PlayerbotFactory.cpp | 16 ++- src/factory/StatsWeightCalculator.cpp | 2 +- src/strategy/Engine.cpp | 4 +- src/strategy/NamedObjectContext.h | 4 +- src/strategy/actions/AttackAction.cpp | 10 +- .../AutoMaintenanceOnLevelupAction.cpp | 1 - src/strategy/actions/BankAction.cpp | 2 +- src/strategy/actions/BattleGroundTactics.cpp | 28 ++-- .../actions/CheckMountStateAction.cpp | 4 +- .../actions/ChooseTravelTargetAction.cpp | 3 +- src/strategy/actions/DropQuestAction.cpp | 2 - src/strategy/actions/EmoteAction.cpp | 8 +- src/strategy/actions/EquipAction.cpp | 15 ++- src/strategy/actions/GenericBuffUtils.cpp | 2 +- src/strategy/actions/GenericBuffUtils.h | 1 - src/strategy/actions/GenericSpellActions.cpp | 7 +- .../actions/GuildManagementActions.cpp | 2 +- src/strategy/actions/LfgActions.cpp | 5 +- src/strategy/actions/LootRollAction.cpp | 8 +- src/strategy/actions/MovementActions.cpp | 49 ++++--- src/strategy/actions/MovementActions.h | 1 - src/strategy/actions/NonCombatActions.cpp | 16 +-- src/strategy/actions/QuestAction.cpp | 6 +- src/strategy/actions/QuestAction.h | 4 +- src/strategy/actions/ReleaseSpiritAction.cpp | 2 +- .../actions/RevealGatheringItemAction.cpp | 19 +-- .../actions/ReviveFromCorpseAction.cpp | 2 +- src/strategy/actions/RpgAction.cpp | 1 - src/strategy/actions/SayAction.cpp | 2 +- src/strategy/actions/SetHomeAction.cpp | 2 +- .../actions/SuggestWhatToDoAction.cpp | 3 +- src/strategy/actions/TameAction.cpp | 4 +- src/strategy/actions/TellGlyphsAction.h | 1 - src/strategy/actions/TradeAction.cpp | 2 +- src/strategy/actions/TrainerAction.cpp | 4 +- .../actions/UseMeetingStoneAction.cpp | 23 +--- src/strategy/actions/WorldBuffAction.cpp | 1 - src/strategy/actions/XpGainAction.cpp | 1 - src/strategy/deathknight/DKActions.cpp | 4 +- src/strategy/druid/DruidActions.h | 1 - .../dungeons/DungeonStrategyContext.h | 4 - .../wotlk/WotlkDungeonTriggerContext.h | 1 - .../wotlk/azjolnerub/AzjolNerubActions.cpp | 1 - .../wotlk/azjolnerub/AzjolNerubStrategy.cpp | 1 - .../wotlk/azjolnerub/AzjolNerubStrategy.h | 1 - .../wotlk/azjolnerub/AzjolNerubTriggers.cpp | 1 - .../CullingOfStratholmeActions.cpp | 5 +- .../CullingOfStratholmeStrategy.cpp | 1 - .../CullingOfStratholmeStrategy.h | 1 - .../CullingOfStratholmeTriggers.cpp | 1 - .../draktharonkeep/DrakTharonKeepActions.cpp | 1 - .../draktharonkeep/DrakTharonKeepStrategy.cpp | 1 - .../draktharonkeep/DrakTharonKeepStrategy.h | 1 - .../draktharonkeep/DrakTharonKeepTriggers.cpp | 1 - .../forgeofsouls/ForgeOfSoulsActions.cpp | 4 - .../forgeofsouls/ForgeOfSoulsMultipliers.cpp | 1 - .../forgeofsouls/ForgeOfSoulsMultipliers.h | 1 - .../wotlk/gundrak/GundrakStrategy.cpp | 1 - .../dungeons/wotlk/gundrak/GundrakStrategy.h | 1 - .../HallsOfLightningActions.cpp | 5 +- .../HallsOfLightningMultipliers.cpp | 1 - .../HallsOfLightningStrategy.cpp | 1 - .../HallsOfLightningStrategy.h | 1 - .../hallsofstone/HallsOfStoneStrategy.cpp | 1 - .../wotlk/hallsofstone/HallsOfStoneStrategy.h | 1 - .../dungeons/wotlk/nexus/NexusMultipliers.cpp | 1 - .../dungeons/wotlk/nexus/NexusStrategy.cpp | 1 - .../dungeons/wotlk/nexus/NexusStrategy.h | 1 - .../wotlk/oculus/OculusMultipliers.cpp | 2 +- .../dungeons/wotlk/oculus/OculusStrategy.cpp | 1 - .../dungeons/wotlk/oculus/OculusStrategy.h | 1 - .../wotlk/oldkingdom/OldKingdomActions.cpp | 1 - .../wotlk/oldkingdom/OldKingdomStrategy.cpp | 1 - .../wotlk/oldkingdom/OldKingdomStrategy.h | 1 - .../wotlk/oldkingdom/OldKingdomTriggers.cpp | 1 - .../wotlk/pitofsaron/PitOfSaronActions.cpp | 1 - .../pitofsaron/PitOfSaronMultipliers.cpp | 2 - .../wotlk/pitofsaron/PitOfSaronMultipliers.h | 1 - .../TrialOfTheChampionActions.cpp | 1 - .../TrialOfTheChampionStrategy.cpp | 1 - .../TrialOfTheChampionTriggers.cpp | 2 - .../TrialOfTheChampionTriggers.h | 7 - .../wotlk/utgardekeep/UtgardeKeepStrategy.cpp | 1 - .../wotlk/utgardekeep/UtgardeKeepStrategy.h | 1 - .../UtgardePinnacleStrategy.cpp | 1 - .../utgardepinnacle/UtgardePinnacleStrategy.h | 1 - .../wotlk/violethold/VioletHoldActions.cpp | 1 - .../wotlk/violethold/VioletHoldStrategy.cpp | 1 - .../wotlk/violethold/VioletHoldStrategy.h | 1 - .../wotlk/violethold/VioletHoldTriggers.cpp | 1 - src/strategy/hunter/GenericHunterStrategy.h | 2 - src/strategy/paladin/PaladinActions.cpp | 2 - src/strategy/priest/GenericPriestStrategy.cpp | 1 - src/strategy/raids/aq20/RaidAq20Actions.cpp | 1 - src/strategy/raids/aq20/RaidAq20Triggers.cpp | 1 - .../raids/gruulslair/RaidGruulsLairHelpers.h | 102 +++++++-------- .../raids/icecrown/RaidIccActions.cpp | 120 ++++++++---------- src/strategy/raids/icecrown/RaidIccActions.h | 6 - .../raids/icecrown/RaidIccMultipliers.cpp | 6 +- .../raids/icecrown/RaidIccMultipliers.h | 1 - .../raids/icecrown/RaidIccStrategy.cpp | 1 - .../raids/icecrown/RaidIccTriggers.cpp | 4 +- src/strategy/raids/icecrown/RaidIccTriggers.h | 5 - .../raids/karazhan/RaidKarazhanActions.cpp | 90 ++++++------- .../raids/karazhan/RaidKarazhanHelpers.cpp | 20 +-- .../raids/karazhan/RaidKarazhanHelpers.h | 2 +- .../karazhan/RaidKarazhanMultipliers.cpp | 12 +- .../raids/naxxramas/RaidNaxxMultipliers.cpp | 21 ++- .../raids/naxxramas/RaidNaxxTriggers.h | 3 +- .../raids/obsidiansanctum/RaidOsTriggers.cpp | 5 +- .../raids/ulduar/RaidUlduarActions.cpp | 4 +- .../raids/ulduar/RaidUlduarBossHelper.cpp | 3 +- .../raids/ulduar/RaidUlduarTriggers.cpp | 3 +- src/strategy/rogue/RogueActions.cpp | 1 - src/strategy/rogue/RogueTriggers.h | 3 - .../shaman/ElementalShamanStrategy.cpp | 1 - src/strategy/shaman/ShamanActions.cpp | 8 +- src/strategy/shaman/ShamanActions.h | 1 - src/strategy/shaman/ShamanTriggers.cpp | 54 ++++---- src/strategy/shaman/ShamanTriggers.h | 2 +- src/strategy/triggers/GenericTriggers.h | 2 +- src/strategy/triggers/PvpTriggers.cpp | 1 - src/strategy/triggers/RangeTriggers.cpp | 9 +- src/strategy/triggers/TriggerContext.h | 1 - .../triggers/WorldPacketTriggerContext.h | 1 - src/strategy/values/EnemyPlayerValue.cpp | 2 +- src/strategy/values/HasTotemValue.cpp | 3 +- src/strategy/values/ItemUsageValue.cpp | 10 +- .../values/PossibleRpgTargetsValue.cpp | 22 ++-- src/strategy/warlock/WarlockTriggers.h | 1 - src/strategy/warrior/WarriorActions.cpp | 4 +- src/strategy/warrior/WarriorTriggers.cpp | 1 - src/strategy/warrior/WarriorTriggers.h | 1 - 149 files changed, 451 insertions(+), 565 deletions(-) rename var/.suppress.cppcheck => .suppress.cppcheck (100%) rename apps/{ => codestyle}/codestyle-cpp.py (100%) diff --git a/.github/workflows/codestyle_cpp.yml b/.github/workflows/codestyle_cpp.yml index 0afaf4b795..b868e30b18 100644 --- a/.github/workflows/codestyle_cpp.yml +++ b/.github/workflows/codestyle_cpp.yml @@ -14,7 +14,7 @@ jobs: triage: runs-on: ubuntu-latest name: C++ - if: github.repository == 'mod-playerbots/mod-playerbots' && !github.event.pull_request.draft + if: github.event.pull_request.draft == false steps: - uses: actions/checkout@v4 - name: Setup python diff --git a/var/.suppress.cppcheck b/.suppress.cppcheck similarity index 100% rename from var/.suppress.cppcheck rename to .suppress.cppcheck diff --git a/apps/codestyle-cpp.py b/apps/codestyle/codestyle-cpp.py similarity index 100% rename from apps/codestyle-cpp.py rename to apps/codestyle/codestyle-cpp.py diff --git a/src/AiFactory.cpp b/src/AiFactory.cpp index 3ec1418aab..5d6377f466 100644 --- a/src/AiFactory.cpp +++ b/src/AiFactory.cpp @@ -413,10 +413,12 @@ void AiFactory::AddDefaultCombatStrategies(Player* player, PlayerbotAI* const fa break; } - if (PlayerbotAI::IsTank(player, true)) { + if (PlayerbotAI::IsTank(player, true)) + { engine->addStrategy("tank face", false); } - if (PlayerbotAI::IsMelee(player, true) && PlayerbotAI::IsDps(player, true)) { + if (PlayerbotAI::IsMelee(player, true) && PlayerbotAI::IsDps(player, true)) + { engine->addStrategy("behind", false); } if (PlayerbotAI::IsHeal(player, true)) @@ -706,7 +708,9 @@ void AiFactory::AddDefaultNonCombatStrategies(Player* player, PlayerbotAI* const // { // // nonCombatEngine->addStrategy("travel"); // nonCombatEngine->addStrategy("rpg"); - // } else { + // } + // else + // { // nonCombatEngine->addStrategy("move random"); // } diff --git a/src/BroadcastHelper.cpp b/src/BroadcastHelper.cpp index 85bc52218c..19979d3d9f 100644 --- a/src/BroadcastHelper.cpp +++ b/src/BroadcastHelper.cpp @@ -70,7 +70,7 @@ bool BroadcastHelper::BroadcastToChannelWithGlobalChance(PlayerbotAI* ai, std::s return false; } - for (const auto& pair : toChannels) + for (auto const& pair : toChannels) { uint32 roll = urand(1, 100); uint32 chance = pair.second; @@ -166,7 +166,7 @@ bool BroadcastHelper::BroadcastToChannelWithGlobalChance(PlayerbotAI* ai, std::s return false; } -bool BroadcastHelper::BroadcastLootingItem(PlayerbotAI* ai, Player* bot, const ItemTemplate *proto) +bool BroadcastHelper::BroadcastLootingItem(PlayerbotAI* ai, Player* bot, ItemTemplate const* proto) { if (!sPlayerbotAIConfig->enableBroadcasts) return false; @@ -410,7 +410,6 @@ bool BroadcastHelper::BroadcastQuestUpdateComplete(PlayerbotAI* ai, Player* bot, placeholders["%my_race"] = ai->GetChatHelper()->FormatRace(bot->getRace()); placeholders["%my_level"] = std::to_string(bot->GetLevel()); - return BroadcastToChannelWithGlobalChance( ai, BOT_TEXT2("broadcast_quest_update_complete", placeholders), diff --git a/src/ChatFilter.cpp b/src/ChatFilter.cpp index 9a6b67002b..6025a56274 100644 --- a/src/ChatFilter.cpp +++ b/src/ChatFilter.cpp @@ -373,7 +373,7 @@ class SpecChatFilter : public ChatFilter bool ParseSpecPrefix(const std::string& message, std::string& specPrefix, std::string& rest) { std::string msgLower = ToLower(message); - for (const auto& entry : specTabNames) + for (auto const& entry : specTabNames) { std::string prefix = "@" + entry.second; if (msgLower.find(ToLower(prefix)) == 0) @@ -555,7 +555,7 @@ class AggroByChatFilter : public ChatFilter const float radius = 100.0f; GuidVector npcs = botAI->GetAiObjectContext()->GetValue("nearest npcs")->Get(); bool match = false; - for (const auto& guid : npcs) + for (auto const& guid : npcs) { Creature* c = botAI->GetCreature(guid); if (!c) diff --git a/src/ChatHelper.cpp b/src/ChatHelper.cpp index d1a5050960..bf28874700 100644 --- a/src/ChatHelper.cpp +++ b/src/ChatHelper.cpp @@ -329,9 +329,11 @@ ItemWithRandomProperty ChatHelper::parseItemWithRandomProperty(std::string const while (currentPos < text.length()) { size_t nextColon = text.find(':', currentPos); - if (nextColon == std::string::npos) { + if (nextColon == std::string::npos) + { size_t hTag = text.find("|h", currentPos); - if (hTag != std::string::npos) { + if (hTag != std::string::npos) + { params.push_back(text.substr(currentPos, hTag - currentPos)); } break; @@ -341,7 +343,8 @@ ItemWithRandomProperty ChatHelper::parseItemWithRandomProperty(std::string const currentPos = nextColon + 1; } - if (params.size() >= 6) { + if (params.size() >= 6) + { res.randomPropertyId = atoi(params[5].c_str()); } diff --git a/src/GuildTaskMgr.cpp b/src/GuildTaskMgr.cpp index a689abdb86..37589ebd6b 100644 --- a/src/GuildTaskMgr.cpp +++ b/src/GuildTaskMgr.cpp @@ -1067,7 +1067,7 @@ void GuildTaskMgr::SendCompletionMessage(Player* player, std::string const verb) void GuildTaskMgr::CheckKillTaskInternal(Player* player, Unit* victim) { ObjectGuid::LowType owner = player->GetGUID().GetCounter(); - if (victim->GetTypeId() != TYPEID_UNIT) + if (victim->IsCreature()) return; Creature* creature = reinterpret_cast(victim); diff --git a/src/PlayerbotAI.cpp b/src/PlayerbotAI.cpp index f014151ec1..414b4b2275 100644 --- a/src/PlayerbotAI.cpp +++ b/src/PlayerbotAI.cpp @@ -1442,22 +1442,22 @@ void PlayerbotAI::ApplyInstanceStrategies(uint32 mapId, bool tellMaster) switch (mapId) { case 249: - strategyName = "onyxia"; // Onyxia's Lair + strategyName = "onyxia"; // Onyxia's Lair break; case 409: - strategyName = "mc"; // Molten Core + strategyName = "mc"; // Molten Core break; case 469: - strategyName = "bwl"; // Blackwing Lair + strategyName = "bwl"; // Blackwing Lair break; case 509: - strategyName = "aq20"; // Ruins of Ahn'Qiraj + strategyName = "aq20"; // Ruins of Ahn'Qiraj break; case 532: strategyName = "karazhan"; // Karazhan break; case 533: - strategyName = "naxx"; // Naxxramas + strategyName = "naxx"; // Naxxramas break; case 544: strategyName = "magtheridon"; // Magtheridon's Lair @@ -3097,8 +3097,10 @@ bool PlayerbotAI::CanCastSpell(uint32 spellid, Unit* target, bool checkHasSpell, SpellCastResult result = spell->CheckCast(true); delete spell; - // if (!sPlayerbotAIConfig->logInGroupOnly || (bot->GetGroup() && HasRealPlayerMaster())) { - // if (result != SPELL_FAILED_NOT_READY && result != SPELL_CAST_OK) { + // if (!sPlayerbotAIConfig->logInGroupOnly || (bot->GetGroup() && HasRealPlayerMaster())) + // { + // if (result != SPELL_FAILED_NOT_READY && result != SPELL_CAST_OK) + // { // LOG_DEBUG("playerbots", "CanCastSpell - target name: {}, spellid: {}, bot name: {}, result: {}", // target->GetName(), spellid, bot->GetName(), result); // } @@ -3121,7 +3123,6 @@ bool PlayerbotAI::CanCastSpell(uint32 spellid, Unit* target, bool checkHasSpell, default: if (!sPlayerbotAIConfig->logInGroupOnly || (bot->GetGroup() && HasRealPlayerMaster())) { - // if (result != SPELL_FAILED_NOT_READY && result != SPELL_CAST_OK) { LOG_DEBUG("playerbots", "CanCastSpell Check Failed. - target name: {}, spellid: {}, bot name: {}, result: {}", target->GetName(), spellid, bot->GetName(), result); @@ -3304,7 +3305,8 @@ bool PlayerbotAI::CastSpell(uint32 spellId, Unit* target, Item* itemTarget) if (bot->IsFlying() || bot->HasUnitState(UNIT_STATE_IN_FLIGHT)) { - // if (!sPlayerbotAIConfig->logInGroupOnly || (bot->GetGroup() && HasRealPlayerMaster())) { + // if (!sPlayerbotAIConfig->logInGroupOnly || (bot->GetGroup() && HasRealPlayerMaster())) + // { // LOG_DEBUG("playerbots", "Spell cast is flying - target name: {}, spellid: {}, bot name: {}}", // target->GetName(), spellId, bot->GetName()); // } @@ -3349,7 +3351,8 @@ bool PlayerbotAI::CastSpell(uint32 spellId, Unit* target, Item* itemTarget) { bot->GetTradeData()->SetSpell(spellId); delete spell; - // if (!sPlayerbotAIConfig->logInGroupOnly || (bot->GetGroup() && HasRealPlayerMaster())) { + // if (!sPlayerbotAIConfig->logInGroupOnly || (bot->GetGroup() && HasRealPlayerMaster())) + // { // LOG_DEBUG("playerbots", "Spell cast no item - target name: {}, spellid: {}, bot name: {}", // target->GetName(), spellId, bot->GetName()); // } @@ -3418,7 +3421,8 @@ bool PlayerbotAI::CastSpell(uint32 spellId, Unit* target, Item* itemTarget) // spell->m_targets.SetUnitTarget(target); // SpellCastResult spellSuccess = spell->CheckCast(true); - // if (!sPlayerbotAIConfig->logInGroupOnly || (bot->GetGroup() && HasRealPlayerMaster())) { + // if (!sPlayerbotAIConfig->logInGroupOnly || (bot->GetGroup() && HasRealPlayerMaster())) + // { // LOG_DEBUG("playerbots", "Spell cast result - target name: {}, spellid: {}, bot name: {}, result: {}", // target->GetName(), spellId, bot->GetName(), spellSuccess); // } @@ -3429,7 +3433,8 @@ bool PlayerbotAI::CastSpell(uint32 spellId, Unit* target, Item* itemTarget) if (result != SPELL_CAST_OK) { - // if (!sPlayerbotAIConfig->logInGroupOnly || (bot->GetGroup() && HasRealPlayerMaster())) { + // if (!sPlayerbotAIConfig->logInGroupOnly || (bot->GetGroup() && HasRealPlayerMaster())) + // { // LOG_DEBUG("playerbots", "Spell cast failed. - target name: {}, spellid: {}, bot name: {}, result: {}", // target->GetName(), spellId, bot->GetName(), result); // } @@ -3496,7 +3501,8 @@ bool PlayerbotAI::CastSpell(uint32 spellId, Unit* target, Item* itemTarget) // { // spell->cancel(); // delete spell; - // if (!sPlayerbotAIConfig->logInGroupOnly || (bot->GetGroup() && HasRealPlayerMaster())) { + // if (!sPlayerbotAIConfig->logInGroupOnly || (bot->GetGroup() && HasRealPlayerMaster())) + // { // LOG_DEBUG("playerbots", "Spell cast loot - target name: {}, spellid: {}, bot name: {}", // target->GetName(), spellId, bot->GetName()); // } @@ -4727,7 +4733,6 @@ uint32 PlayerbotAI::GetEquipGearScore(Player* player) sum += gearScore[i]; } - if (count) { uint32 res = uint32(sum / count); @@ -5264,7 +5269,7 @@ Item* PlayerbotAI::FindOpenableItem() const return FindItemInInventory( [this](ItemTemplate const* itemTemplate) -> bool { - return (itemTemplate->Flags & ITEM_FLAG_HAS_LOOT) && + return itemTemplate->HasFlag(ITEM_FLAG_HAS_LOOT) && (itemTemplate->LockID == 0 || !this->bot->GetItemByEntry(itemTemplate->ItemId)->IsLocked()); }); } @@ -5415,7 +5420,7 @@ Item* PlayerbotAI::FindOilFor(Item* weapon) const if (prioritizedOils) { - for (const auto& id : *prioritizedOils) + for (auto const& id : *prioritizedOils) { oil = FindConsumable(id); if (oil) diff --git a/src/PlayerbotAI.h b/src/PlayerbotAI.h index b5dacd7642..8c8cff14f2 100644 --- a/src/PlayerbotAI.h +++ b/src/PlayerbotAI.h @@ -530,7 +530,7 @@ class PlayerbotAI : public PlayerbotAIBase Player* GetBot() { return bot; } Player* GetMaster() { return master; } Player* FindNewMaster(); - + // Checks if the bot is really a player. Players always have themselves as master. bool IsRealPlayer() { return master ? (master == bot) : false; } // Bot has a master that is a player. diff --git a/src/PlayerbotMgr.cpp b/src/PlayerbotMgr.cpp index b2b1a0f3c9..6bdbf9b659 100644 --- a/src/PlayerbotMgr.cpp +++ b/src/PlayerbotMgr.cpp @@ -1736,7 +1736,8 @@ PlayerbotAI* PlayerbotsMgr::GetPlayerbotAI(Player* player) { return nullptr; } - // if (player->GetSession()->isLogingOut() || player->IsDuringRemoveFromWorld()) { + // if (player->GetSession()->isLogingOut() || player->IsDuringRemoveFromWorld()) + // { // return nullptr; // } auto itr = _playerbotsAIMap.find(player->GetGUID()); diff --git a/src/RandomItemMgr.cpp b/src/RandomItemMgr.cpp index f99c49590b..a6e143ae14 100644 --- a/src/RandomItemMgr.cpp +++ b/src/RandomItemMgr.cpp @@ -982,7 +982,7 @@ void RandomItemMgr::BuildItemInfoCache() continue; } - if (proto->Flags & ITEM_FLAG_DEPRECATED) + if (proto->HasFlag(ITEM_FLAG_DEPRECATED)) { itemForTest.insert(proto->ItemId); continue; @@ -1072,10 +1072,10 @@ void RandomItemMgr::BuildItemInfoCache() // cacheInfo.team = TEAM_NEUTRAL; // // check faction - // if (proto->Flags2 & ITEM_FLAG2_FACTION_HORDE) + // if (proto->HasFlag2(ITEM_FLAG2_FACTION_HORDE)) // cacheInfo.team = TEAM_HORDE; - // if (proto->Flags2 & ITEM_FLAG2_FACTION_ALLIANCE) + // if (proto->HasFlag2(ITEM_FLAG2_FACTION_ALLIANCE)) // cacheInfo.team = TEAM_ALLIANCE; // if (cacheInfo.team == TEAM_NEUTRAL && proto->AllowableRace > 1 && proto->AllowableRace < 8388607) @@ -1099,7 +1099,7 @@ void RandomItemMgr::BuildItemInfoCache() // // check item source - // if (proto->Flags & ITEM_FLAG_NO_DISENCHANT) + // if (proto->HasFlag(ITEM_FLAG_NO_DISENCHANT)) // { // cacheInfo.source = ITEM_SOURCE_PVP; // LOG_DEBUG("playerbots", "Item: {}, source: PvP Reward", proto->ItemId); @@ -1367,7 +1367,7 @@ uint32 RandomItemMgr::CalculateStatWeight(uint8 playerclass, uint8 spec, ItemTem } // check item spells - for (const auto& spellData : proto->Spells) + for (auto const& spellData : proto->Spells) { // no spell if (!spellData.SpellId) @@ -2374,7 +2374,6 @@ void RandomItemMgr::BuildPotionCache() if (proto->Duration & 0x80000000) continue; - if (proto->AllowableClass != -1) continue; diff --git a/src/RandomPlayerbotMgr.cpp b/src/RandomPlayerbotMgr.cpp index 12713cbb34..abd2b40216 100644 --- a/src/RandomPlayerbotMgr.cpp +++ b/src/RandomPlayerbotMgr.cpp @@ -633,7 +633,7 @@ void RandomPlayerbotMgr::AssignAccountTypes() uint32 existingRndBotAccounts = 0; uint32 existingAddClassAccounts = 0; - for (const auto& [accountId, accountType] : currentAssignments) + for (auto const& [accountId, accountType] : currentAssignments) { if (accountType == 1) existingRndBotAccounts++; else if (accountType == 2) existingAddClassAccounts++; @@ -688,7 +688,7 @@ void RandomPlayerbotMgr::AssignAccountTypes() } // Populate filtered account lists with ALL accounts of each type - for (const auto& [accountId, accountType] : currentAssignments) + for (auto const& [accountId, accountType] : currentAssignments) { if (accountType == 1) rndBotTypeAccounts.push_back(accountId); else if (accountType == 2) addClassTypeAccounts.push_back(accountId); @@ -798,7 +798,7 @@ uint32 RandomPlayerbotMgr::AddRandomBots() std::vector allianceChars; std::vector hordeChars; - for (const auto& charInfo : allCharacters) + for (auto const& charInfo : allCharacters) { if (IsAlliance(charInfo.rRace)) allianceChars.push_back(charInfo); @@ -832,7 +832,7 @@ uint32 RandomPlayerbotMgr::AddRandomBots() }; // PHASE 1: Log-in Alliance bots up to allowedAllianceCount - for (const auto& charInfo : allianceChars) + for (auto const& charInfo : allianceChars) { if (!allowedAllianceCount) break; @@ -845,7 +845,7 @@ uint32 RandomPlayerbotMgr::AddRandomBots() } // PHASE 2: Log-in Horde bots up to maxAllowedBotCount - for (const auto& charInfo : hordeChars) + for (auto const& charInfo : hordeChars) { if (!maxAllowedBotCount) break; @@ -855,7 +855,7 @@ uint32 RandomPlayerbotMgr::AddRandomBots() } // PHASE 3: If maxAllowedBotCount wasn't reached, log-in more Alliance bots - for (const auto& charInfo : allianceChars) + for (auto const& charInfo : allianceChars) { if (!maxAllowedBotCount) break; @@ -1248,7 +1248,7 @@ void RandomPlayerbotMgr::CheckBgQueue() void RandomPlayerbotMgr::LogBattlegroundInfo() { - for (const auto& queueTypePair : BattlegroundData) + for (auto const& queueTypePair : BattlegroundData) { uint8 queueType = queueTypePair.first; @@ -1256,7 +1256,7 @@ void RandomPlayerbotMgr::LogBattlegroundInfo() if (uint8 type = BattlegroundMgr::BGArenaType(queueTypeId)) { - for (const auto& bracketIdPair : queueTypePair.second) + for (auto const& bracketIdPair : queueTypePair.second) { auto& bgInfo = bracketIdPair.second; if (bgInfo.minLevel == 0) @@ -1306,7 +1306,7 @@ void RandomPlayerbotMgr::LogBattlegroundInfo() break; } - for (const auto& bracketIdPair : queueTypePair.second) + for (auto const& bracketIdPair : queueTypePair.second) { auto& bgInfo = bracketIdPair.second; if (bgInfo.minLevel == 0) @@ -1576,7 +1576,7 @@ bool RandomPlayerbotMgr::ProcessBot(Player* bot) { idleBot = true; } - + if (idleBot) { // randomize @@ -1704,7 +1704,6 @@ void RandomPlayerbotMgr::RandomTeleport(Player* bot, std::vector& return; } - PerformanceMonitorOperation* pmo = sPerformanceMonitor->start(PERF_MON_RNDBOT, "RandomTeleportByLocations"); std::shuffle(std::begin(tlocs), std::end(tlocs), RandomEngine::Instance()); @@ -2256,7 +2255,7 @@ void RandomPlayerbotMgr::RandomTeleportForLevel(Player* bot) // Pick a weighted city randomly, then a random banker in that city // then teleport to that banker CityId selectedCity = weightedCities[urand(0, weightedCities.size() - 1)]; - const auto& bankers = cityToBankers.at(selectedCity); + auto const& bankers = cityToBankers.at(selectedCity); uint32 selectedBankerEntry = bankers[urand(0, bankers.size() - 1)]; auto locIt = bankerEntryToLocation.find(selectedBankerEntry); if (locIt != bankerEntryToLocation.end()) diff --git a/src/ServerFacade.cpp b/src/ServerFacade.cpp index 61b9b0d43f..f85525bc31 100644 --- a/src/ServerFacade.cpp +++ b/src/ServerFacade.cpp @@ -56,7 +56,7 @@ Unit* ServerFacade::GetChaseTarget(Unit* target) MovementGenerator* movementGen = target->GetMotionMaster()->top(); if (movementGen && movementGen->GetMovementGeneratorType() == CHASE_MOTION_TYPE) { - if (target->GetTypeId() == TYPEID_PLAYER) + if (target->IsPlayer()) { return static_cast const*>(movementGen)->GetTarget(); } diff --git a/src/TravelMgr.cpp b/src/TravelMgr.cpp index f8df8bfea9..8dfbbe4526 100644 --- a/src/TravelMgr.cpp +++ b/src/TravelMgr.cpp @@ -480,7 +480,7 @@ std::string const WorldPosition::getAreaName(bool fullName, bool zoneName) std::set WorldPosition::getTransports(uint32 entry) { /* - if(!entry) + if (!entry) return getMap()->m_transports; else { @@ -488,7 +488,7 @@ std::set WorldPosition::getTransports(uint32 entry) std::set transports; /* for (auto transport : getMap()->m_transports) - if(transport->GetEntry() == entry) + if (transport->GetEntry() == entry) transports.insert(transport); return transports; @@ -1272,7 +1272,7 @@ std::string const RpgTravelDestination::getTitle() { std::ostringstream out; - if(entry > 0) + if (entry > 0) out << "rpg npc "; out << " " << ChatHelper::FormatWorldEntry(entry); @@ -2076,7 +2076,6 @@ void TravelMgr::LoadQuestTravelTable() continue; } - if (r.role == 0) { container->questGivers.push_back(loc); @@ -2591,7 +2590,7 @@ void TravelMgr::LoadQuestTravelTable() //if (data->displayId == 3015) // pos.setZ(pos.getZ() + 6.0f); - //else if(data->displayId == 3031) + //else if (data->displayId == 3031) // pos.setZ(pos.getZ() - 17.0f); if (prevNode) diff --git a/src/TravelNode.cpp b/src/TravelNode.cpp index 8e88006700..d3c03ed97e 100644 --- a/src/TravelNode.cpp +++ b/src/TravelNode.cpp @@ -180,7 +180,7 @@ uint32 TravelNodePath::getPrice() if (!taxiPath) return 0; - + return taxiPath->price; } @@ -470,7 +470,6 @@ bool TravelNode::cropUselessLinks() for (auto& firstLink : getLinks()) { - TravelNode* firstNode = firstLink.first; float firstLength = firstLink.second.getDistance(); for (auto& secondLink : getLinks()) @@ -1302,7 +1301,7 @@ TravelNodeRoute TravelNodeMap::getRoute(TravelNode* start, TravelNode* goal, Pla return TravelNodeRoute(path); } - for (const auto& link : *currentNode->dataNode->getLinks()) // for each successor n' of n + for (auto const& link : *currentNode->dataNode->getLinks()) // for each successor n' of n { TravelNode* linkNode = link.first; float linkCost = link.second->getCost(bot, currentNode->currentGold); @@ -1351,7 +1350,7 @@ TravelNodeRoute TravelNodeMap::getRoute(WorldPosition startPos, WorldPosition en std::vector newStartPath; std::vector startNodes = m_nodes, endNodes = m_nodes; - if(!startNodes.size() || !endNodes.size()) + if (!startNodes.size() || !endNodes.size()) return TravelNodeRoute(); // Partial sort to get the closest 5 nodes at the begin of the array. @@ -1902,7 +1901,7 @@ void TravelNodeMap::generateTransportNodes() // if (data->displayId == 3015) // pos.setZ(pos.getZ() + 6.0f); - // else if(data->displayId == 3031) + // else if (data->displayId == 3031) // pos.setZ(pos.getZ() - 17.0f); if (prevNode) diff --git a/src/factory/PlayerbotFactory.cpp b/src/factory/PlayerbotFactory.cpp index af1552a3f9..65ffc444ee 100644 --- a/src/factory/PlayerbotFactory.cpp +++ b/src/factory/PlayerbotFactory.cpp @@ -180,7 +180,7 @@ void PlayerbotFactory::Init() continue; } - if (proto->Flags & ITEM_FLAG_UNIQUE_EQUIPPABLE) + if (proto->HasFlag(ITEM_FLAG_UNIQUE_EQUIPPABLE)) { continue; } @@ -1391,7 +1391,7 @@ bool PlayerbotFactory::CanEquipArmor(ItemTemplate const* proto) // for (uint8 j = 0; j < MAX_ITEM_PROTO_STATS; ++j) // { // // for ItemStatValue != 0 - // if(!proto->ItemStat[j].ItemStatValue) + // if (!proto->ItemStat[j].ItemStatValue) // continue; // AddItemStats(proto->ItemStat[j].ItemStatType, sp, ap, tank); @@ -1600,7 +1600,8 @@ void Shuffle(std::vector& items) // bool noItem = false; // uint32 quality = urand(ITEM_QUALITY_UNCOMMON, ITEM_QUALITY_EPIC); // uint32 attempts = 10; -// if (urand(0, 100) < 100 * sPlayerbotAIConfig->randomGearLoweringChance && quality > ITEM_QUALITY_NORMAL) { +// if (urand(0, 100) < 100 * sPlayerbotAIConfig->randomGearLoweringChance && quality > ITEM_QUALITY_NORMAL) +// { // quality--; // } // // current item; @@ -1705,7 +1706,8 @@ void PlayerbotFactory::InitEquipment(bool incremental, bool second_chance) if (incremental && !sPlayerbotAIConfig->incrementalGearInit) return; - if (level < 5) { + if (level < 5) + { // original items if (CharStartOutfitEntry const* oEntry = GetCharStartOutfitEntry(bot->getRace(), bot->getClass(), bot->getGender())) { @@ -1734,7 +1736,8 @@ void PlayerbotFactory::InitEquipment(bool incremental, bool second_chance) continue; } - if (bot->HasItemCount(itemId, count)) { + if (bot->HasItemCount(itemId, count)) + { continue; } @@ -2771,7 +2774,8 @@ void PlayerbotFactory::InitTalents(uint32 specNo) void PlayerbotFactory::InitTalentsByTemplate(uint32 specTab) { - // if (sPlayerbotAIConfig->parsedSpecLinkOrder[bot->getClass()][specNo][80].size() == 0) { + // if (sPlayerbotAIConfig->parsedSpecLinkOrder[bot->getClass()][specNo][80].size() == 0) + // { // return; // } uint32 cls = bot->getClass(); diff --git a/src/factory/StatsWeightCalculator.cpp b/src/factory/StatsWeightCalculator.cpp index fa9e8a83b8..8a3048914e 100644 --- a/src/factory/StatsWeightCalculator.cpp +++ b/src/factory/StatsWeightCalculator.cpp @@ -97,7 +97,7 @@ float StatsWeightCalculator::CalculateItem(uint32 itemId, int32 randomPropertyId // Use player level as effective item level for heirlooms - Quality EPIC // Else - Blend with item quality and level for normal items if (proto->Quality == ITEM_QUALITY_HEIRLOOM) - weight_ *= PlayerbotFactory::CalcMixedGearScore(lvl, ITEM_QUALITY_EPIC); + weight_ *= PlayerbotFactory::CalcMixedGearScore(lvl, ITEM_QUALITY_EPIC); else weight_ *= PlayerbotFactory::CalcMixedGearScore(proto->ItemLevel, proto->Quality); diff --git a/src/strategy/Engine.cpp b/src/strategy/Engine.cpp index c1072ff9f6..2e36e05715 100644 --- a/src/strategy/Engine.cpp +++ b/src/strategy/Engine.cpp @@ -77,7 +77,8 @@ Engine::~Engine(void) // for (std::map::iterator i = strategies.begin(); i != strategies.end(); i++) // { // Strategy* strategy = i->second; - // if (strategy) { + // if (strategy) + // { // delete strategy; // } // } @@ -402,7 +403,6 @@ void Engine::addStrategiesNoInit(std::string first, ...) va_end(vl); } - bool Engine::removeStrategy(std::string const name, bool init) { std::map::iterator i = strategies.find(name); diff --git a/src/strategy/NamedObjectContext.h b/src/strategy/NamedObjectContext.h index af8c4ecec6..b60232a5c3 100644 --- a/src/strategy/NamedObjectContext.h +++ b/src/strategy/NamedObjectContext.h @@ -148,7 +148,7 @@ class SharedNamedObjectContextList void Add(NamedObjectContext* context) { contexts.push_back(context); - for (const auto& iter : context->creators) + for (auto const& iter : context->creators) creators[iter.first] = iter.second; } }; @@ -294,7 +294,7 @@ class NamedObjectFactoryList void Add(NamedObjectFactory* context) { factories.push_back(context); - for (const auto& iter : context->creators) + for (auto const& iter : context->creators) creators[iter.first] = iter.second; } diff --git a/src/strategy/actions/AttackAction.cpp b/src/strategy/actions/AttackAction.cpp index 94c9541830..4ea8694378 100644 --- a/src/strategy/actions/AttackAction.cpp +++ b/src/strategy/actions/AttackAction.cpp @@ -161,17 +161,21 @@ bool AttackAction::Attack(Unit* target, bool with_pet /*true*/) bot->Attack(target, shouldMelee); /* prevent pet dead immediately in group */ - // if (bot->GetMap()->IsDungeon() && bot->GetGroup() && !target->IsInCombat()) { + // if (bot->GetMap()->IsDungeon() && bot->GetGroup() && !target->IsInCombat()) + // { // with_pet = false; // } // if (Pet* pet = bot->GetPet()) // { - // if (with_pet) { + // if (with_pet) + // { // pet->SetReactState(REACT_DEFENSIVE); // pet->SetTarget(target->GetGUID()); // pet->GetCharmInfo()->SetIsCommandAttack(true); // pet->AI()->AttackStart(target); - // } else { + // } + // else + // { // pet->SetReactState(REACT_PASSIVE); // pet->GetCharmInfo()->SetIsCommandFollow(true); // pet->GetCharmInfo()->IsReturning(); diff --git a/src/strategy/actions/AutoMaintenanceOnLevelupAction.cpp b/src/strategy/actions/AutoMaintenanceOnLevelupAction.cpp index b83936daeb..ad6a00c6d6 100644 --- a/src/strategy/actions/AutoMaintenanceOnLevelupAction.cpp +++ b/src/strategy/actions/AutoMaintenanceOnLevelupAction.cpp @@ -176,4 +176,3 @@ void AutoMaintenanceOnLevelupAction::AutoUpgradeEquip() factory.InitEquipment(true); } } - diff --git a/src/strategy/actions/BankAction.cpp b/src/strategy/actions/BankAction.cpp index 19804da874..4d8d6c4d8c 100644 --- a/src/strategy/actions/BankAction.cpp +++ b/src/strategy/actions/BankAction.cpp @@ -17,7 +17,7 @@ bool BankAction::Execute(Event event) for (GuidVector::iterator i = npcs.begin(); i != npcs.end(); i++) { Unit* npc = botAI->GetUnit(*i); - if (!npc || !npc->HasFlag(UNIT_NPC_FLAGS, UNIT_NPC_FLAG_BANKER)) + if (!npc || !npc->HasNpcFlag(UNIT_NPC_FLAG_BANKER)) continue; return ExecuteBank(text, npc); diff --git a/src/strategy/actions/BattleGroundTactics.cpp b/src/strategy/actions/BattleGroundTactics.cpp index 5e9e7daf0c..db5235f515 100644 --- a/src/strategy/actions/BattleGroundTactics.cpp +++ b/src/strategy/actions/BattleGroundTactics.cpp @@ -1894,13 +1894,13 @@ bool BGTactics::selectObjective(bool reset) bool isDefender = role < defendersProhab; bool isAdvanced = !isDefender && role > 8; - const auto& attackObjectives = + auto const& attackObjectives = (team == TEAM_HORDE) ? AV_AttackObjectives_Horde : AV_AttackObjectives_Alliance; - const auto& defendObjectives = + auto const& defendObjectives = (team == TEAM_HORDE) ? AV_DefendObjectives_Horde : AV_DefendObjectives_Alliance; uint32 destroyedNodes = 0; - for (const auto& [nodeId, _] : defendObjectives) + for (auto const& [nodeId, _] : defendObjectives) if (av->GetAVNodeInfo(nodeId).State == POINT_DESTROYED) destroyedNodes++; @@ -2000,7 +2000,7 @@ bool BGTactics::selectObjective(bool reset) std::vector contestedObjectives; std::vector availableObjectives; - for (const auto& [nodeId, goId] : defendObjectives) + for (auto const& [nodeId, goId] : defendObjectives) { const BG_AV_NodeInfo& node = av->GetAVNodeInfo(nodeId); if (node.State == POINT_DESTROYED) @@ -2026,7 +2026,7 @@ bool BGTactics::selectObjective(bool reset) if (!BgObjective) { uint32 towersDown = 0; - for (const auto& [nodeId, _] : attackObjectives) + for (auto const& [nodeId, _] : attackObjectives) if (av->GetAVNodeInfo(nodeId).State == POINT_DESTROYED) towersDown++; @@ -2053,7 +2053,7 @@ bool BGTactics::selectObjective(bool reset) { std::vector candidates; - for (const auto& [nodeId, goId] : attackObjectives) + for (auto const& [nodeId, goId] : attackObjectives) { const BG_AV_NodeInfo& node = av->GetAVNodeInfo(nodeId); GameObject* go = bg->GetBGObject(goId); @@ -2105,13 +2105,13 @@ bool BGTactics::selectObjective(bool reset) Position objPos = BgObjective->GetPosition(); Optional linkedNodeId; - for (const auto& [nodeId, goId] : attackObjectives) + for (auto const& [nodeId, goId] : attackObjectives) if (bg->GetBGObject(goId) == BgObjective) linkedNodeId = nodeId; if (!linkedNodeId) { - for (const auto& [nodeId, goId] : defendObjectives) + for (auto const& [nodeId, goId] : defendObjectives) if (bg->GetBGObject(goId) == BgObjective) linkedNodeId = nodeId; } @@ -2543,7 +2543,7 @@ bool BGTactics::selectObjective(bool reset) float bestDist = FLT_MAX; uint32 bestTrigger = 0; - for (const auto& [nodeId, _, areaTrigger] : EY_AttackObjectives) + for (auto const& [nodeId, _, areaTrigger] : EY_AttackObjectives) { if (!IsOwned(nodeId)) continue; @@ -2610,7 +2610,7 @@ bool BGTactics::selectObjective(bool reset) // --- PRIORITY 2: Nearby unowned contested node --- if (!foundObjective) { - for (const auto& [nodeId, _, __] : EY_AttackObjectives) + for (auto const& [nodeId, _, __] : EY_AttackObjectives) { if (IsOwned(nodeId)) continue; @@ -2711,7 +2711,7 @@ bool BGTactics::selectObjective(bool reset) if (!foundObjective && strategy == EY_STRATEGY_FLAG_FOCUS) { bool ownsAny = false; - for (const auto& [nodeId, _, __] : EY_AttackObjectives) + for (auto const& [nodeId, _, __] : EY_AttackObjectives) { if (IsOwned(nodeId)) { @@ -2739,7 +2739,7 @@ bool BGTactics::selectObjective(bool reset) float bestDist = FLT_MAX; Optional bestNode; - for (const auto& [nodeId, _, __] : EY_AttackObjectives) + for (auto const& [nodeId, _, __] : EY_AttackObjectives) { if (IsOwned(nodeId)) continue; @@ -2974,7 +2974,7 @@ bool BGTactics::selectObjective(bool reset) uint32 len = end(IC_AttackObjectives) - begin(IC_AttackObjectives); for (uint32 i = 0; i < len; i++) { - const auto& objective = + auto const& objective = IC_AttackObjectives[(i + role) % len]; // use role to determine which objective checked first if (isleOfConquestBG->GetICNodePoint(objective.first).nodeState != NODE_STATE_CONTROLLED_H) @@ -3126,7 +3126,7 @@ bool BGTactics::selectObjective(bool reset) uint32 len = end(IC_AttackObjectives) - begin(IC_AttackObjectives); for (uint32 i = 0; i < len; i++) { - const auto& objective = + auto const& objective = IC_AttackObjectives[(i + role) % len]; // use role to determine which objective checked first if (isleOfConquestBG->GetICNodePoint(objective.first).nodeState != NODE_STATE_CONTROLLED_H) diff --git a/src/strategy/actions/CheckMountStateAction.cpp b/src/strategy/actions/CheckMountStateAction.cpp index 7bbcd58efb..0366c56d7d 100644 --- a/src/strategy/actions/CheckMountStateAction.cpp +++ b/src/strategy/actions/CheckMountStateAction.cpp @@ -370,7 +370,7 @@ bool CheckMountStateAction::TryPreferredMount(Player* master) const bool CheckMountStateAction::TryRandomMountFiltered(const std::map>& spells, int32 masterSpeed) const { - for (const auto& pair : spells) + for (auto const& pair : spells) { int32 currentSpeed = pair.first; @@ -378,7 +378,7 @@ bool CheckMountStateAction::TryRandomMountFiltered(const std::map 10) { @@ -673,7 +672,7 @@ bool ChooseTravelTargetAction::SetExploreTarget(TravelTarget* target) //271 south shore //35 booty bay //380 The Barrens The Crossroads - if(((ExploreTravelDestination * )activeTarget)->getAreaId() == 380) + if (((ExploreTravelDestination * )activeTarget)->getAreaId() == 380) { activePoints.push_back(activeTarget->getPoints(true)[0]); } diff --git a/src/strategy/actions/DropQuestAction.cpp b/src/strategy/actions/DropQuestAction.cpp index ddcdaef52b..48e571eb3e 100644 --- a/src/strategy/actions/DropQuestAction.cpp +++ b/src/strategy/actions/DropQuestAction.cpp @@ -58,7 +58,6 @@ bool DropQuestAction::Execute(Event event) return true; } - bool CleanQuestLogAction::Execute(Event event) { Player* requester = event.getOwner() ? event.getOwner() : GetMaster(); @@ -165,7 +164,6 @@ bool CleanQuestLogAction::Execute(Event event) return true; } - void CleanQuestLogAction::DropQuestType(uint8& numQuest, uint8 wantNum, bool isGreen, bool hasProgress, bool isComplete) { std::vector slots; diff --git a/src/strategy/actions/EmoteAction.cpp b/src/strategy/actions/EmoteAction.cpp index 72952e66cc..1770ca2b75 100644 --- a/src/strategy/actions/EmoteAction.cpp +++ b/src/strategy/actions/EmoteAction.cpp @@ -837,8 +837,8 @@ uint32 TalkAction::GetRandomEmote(Unit* unit, bool textEmote) types.push_back(TEXT_EMOTE_TALKEX); types.push_back(TEXT_EMOTE_TALKQ); - if (unit && (unit->HasFlag(UNIT_NPC_FLAGS, UNIT_NPC_FLAG_TRAINER) || - unit->HasFlag(UNIT_NPC_FLAGS, UNIT_NPC_FLAG_QUESTGIVER))) + if (unit && (unit->HasNpcFlag(UNIT_NPC_FLAG_TRAINER) || + unit->HasNpcFlag(UNIT_NPC_FLAG_QUESTGIVER))) { types.push_back(TEXT_EMOTE_SALUTE); } @@ -864,8 +864,8 @@ uint32 TalkAction::GetRandomEmote(Unit* unit, bool textEmote) types.push_back(EMOTE_ONESHOT_EXCLAMATION); types.push_back(EMOTE_ONESHOT_QUESTION); - if (unit && (unit->HasFlag(UNIT_NPC_FLAGS, UNIT_NPC_FLAG_TRAINER) || - unit->HasFlag(UNIT_NPC_FLAGS, UNIT_NPC_FLAG_QUESTGIVER))) + if (unit && (unit->HasNpcFlag(UNIT_NPC_FLAG_TRAINER) || + unit->HasNpcFlag(UNIT_NPC_FLAG_QUESTGIVER))) { types.push_back(EMOTE_ONESHOT_SALUTE); } diff --git a/src/strategy/actions/EquipAction.cpp b/src/strategy/actions/EquipAction.cpp index f24d89f7bd..71a2df01e6 100644 --- a/src/strategy/actions/EquipAction.cpp +++ b/src/strategy/actions/EquipAction.cpp @@ -328,7 +328,6 @@ void EquipAction::EquipItem(Item* item) botAI->TellMaster(out); } - bool EquipUpgradesAction::Execute(Event event) { if (!sPlayerbotAIConfig->autoEquipUpgradeLoot && !sRandomPlayerbotMgr->IsRandomBot(bot)) @@ -357,9 +356,12 @@ bool EquipUpgradesAction::Execute(Event event) int32 randomProperty = item->GetItemRandomPropertyId(); uint32 itemId = item->GetTemplate()->ItemId; std::string itemUsageParam; - if (randomProperty != 0) { + if (randomProperty != 0) + { itemUsageParam = std::to_string(itemId) + "," + std::to_string(randomProperty); - } else { + } + else + { itemUsageParam = std::to_string(itemId); } ItemUsage usage = AI_VALUE2(ItemUsage, "item usage", itemUsageParam); @@ -388,9 +390,12 @@ bool EquipUpgradeAction::Execute(Event event) int32 randomProperty = item->GetItemRandomPropertyId(); uint32 itemId = item->GetTemplate()->ItemId; std::string itemUsageParam; - if (randomProperty != 0) { + if (randomProperty != 0) + { itemUsageParam = std::to_string(itemId) + "," + std::to_string(randomProperty); - } else { + } + else + { itemUsageParam = std::to_string(itemId); } ItemUsage usage = AI_VALUE2(ItemUsage, "item usage", itemUsageParam); diff --git a/src/strategy/actions/GenericBuffUtils.cpp b/src/strategy/actions/GenericBuffUtils.cpp index 9e227caf15..1ac71bad4e 100644 --- a/src/strategy/actions/GenericBuffUtils.cpp +++ b/src/strategy/actions/GenericBuffUtils.cpp @@ -61,7 +61,7 @@ namespace ai::buff return false; if (SpellInfo const* info = sSpellMgr->GetSpellInfo(spellId)) - { + { for (int i = 0; i < MAX_SPELL_REAGENTS; ++i) { if (info->Reagent[i] > 0) diff --git a/src/strategy/actions/GenericBuffUtils.h b/src/strategy/actions/GenericBuffUtils.h index d9cfc84213..c893de5976 100644 --- a/src/strategy/actions/GenericBuffUtils.h +++ b/src/strategy/actions/GenericBuffUtils.h @@ -29,7 +29,6 @@ namespace ai::buff // Returns false if the spellId is invalid. bool HasRequiredReagents(Player* bot, uint32 spellId); - // Applies the "switch to group buff" policy if: the bot is in a group of size x+, // the group variant is known/useful, and reagents are available. Otherwise, returns baseName. // If announceOnMissing == true and reagents are missing, calls the 'announce' callback diff --git a/src/strategy/actions/GenericSpellActions.cpp b/src/strategy/actions/GenericSpellActions.cpp index 3a36d9ccd0..b30975ad14 100644 --- a/src/strategy/actions/GenericSpellActions.cpp +++ b/src/strategy/actions/GenericSpellActions.cpp @@ -190,8 +190,8 @@ CastEnchantItemAction::CastEnchantItemAction(PlayerbotAI* botAI, std::string con bool CastEnchantItemAction::isPossible() { - // if (!CastSpellAction::isPossible()) { - + // if (!CastSpellAction::isPossible()) + // { // botAI->TellMasterNoFacing("Impossible: " + spell); // return false; // } @@ -364,7 +364,8 @@ bool UseTrinketAction::UseTrinket(Item* item) for (int i = 0; i < MAX_SPELL_EFFECTS; i++) { const SpellEffectInfo& effectInfo = spellInfo->Effects[i]; - if (effectInfo.Effect == SPELL_EFFECT_APPLY_AURA) { + if (effectInfo.Effect == SPELL_EFFECT_APPLY_AURA) + { applyAura = true; break; } diff --git a/src/strategy/actions/GuildManagementActions.cpp b/src/strategy/actions/GuildManagementActions.cpp index af5a1f0172..4ab6d72c59 100644 --- a/src/strategy/actions/GuildManagementActions.cpp +++ b/src/strategy/actions/GuildManagementActions.cpp @@ -193,7 +193,7 @@ bool GuildManageNearbyAction::Execute(Event event) if (guild->GetMemberSize() > 1000) return false; - if ( (guild->GetRankRights(botMember->GetRankId()) & GR_RIGHT_INVITE) == 0) + if ((guild->GetRankRights(botMember->GetRankId()) & GR_RIGHT_INVITE) == 0) continue; if (player->GetGuildIdInvited()) diff --git a/src/strategy/actions/LfgActions.cpp b/src/strategy/actions/LfgActions.cpp index 406a0ec05e..15f8b92f25 100644 --- a/src/strategy/actions/LfgActions.cpp +++ b/src/strategy/actions/LfgActions.cpp @@ -16,7 +16,6 @@ using namespace lfg; - bool LfgJoinAction::Execute(Event event) { return JoinLFG(); } uint32 LfgJoinAction::GetRoles() @@ -113,7 +112,7 @@ bool LfgJoinAction::JoinLFG() dungeon->TypeID != LFG_TYPE_HEROIC && dungeon->TypeID != LFG_TYPE_RAID)) continue; - const auto& botLevel = bot->GetLevel(); + auto const& botLevel = bot->GetLevel(); /*LFG_TYPE_RANDOM on classic is 15-58 so bot over level 25 will never queue*/ if (dungeon->MinLevel && (botLevel < dungeon->MinLevel || botLevel > dungeon->MaxLevel) || @@ -180,7 +179,6 @@ bool LfgRoleCheckAction::Execute(Event event) // if (currentRoles == newRoles) // return false; - WorldPacket* packet = new WorldPacket(CMSG_LFG_SET_ROLES); *packet << (uint8)newRoles; bot->GetSession()->QueuePacket(packet); @@ -267,7 +265,6 @@ bool LfgAcceptAction::Execute(Event event) return false; } - bool LfgLeaveAction::Execute(Event event) { // Don't leave if lfg strategy enabled diff --git a/src/strategy/actions/LootRollAction.cpp b/src/strategy/actions/LootRollAction.cpp index 3b3a4240ec..912f75fddf 100644 --- a/src/strategy/actions/LootRollAction.cpp +++ b/src/strategy/actions/LootRollAction.cpp @@ -41,9 +41,12 @@ bool LootRollAction::Execute(Event event) continue; std::string itemUsageParam; - if (randomProperty != 0) { + if (randomProperty != 0) + { itemUsageParam = std::to_string(itemId) + "," + std::to_string(randomProperty); - } else { + } + else + { itemUsageParam = std::to_string(itemId); } ItemUsage usage = AI_VALUE2(ItemUsage, "item usage", itemUsageParam); @@ -120,7 +123,6 @@ bool LootRollAction::Execute(Event event) return false; } - RollVote LootRollAction::CalculateRollVote(ItemTemplate const* proto) { std::ostringstream out; diff --git a/src/strategy/actions/MovementActions.cpp b/src/strategy/actions/MovementActions.cpp index 0598a39d19..04a89fa108 100644 --- a/src/strategy/actions/MovementActions.cpp +++ b/src/strategy/actions/MovementActions.cpp @@ -248,7 +248,7 @@ bool MovementAction::MoveTo(uint32 mapId, float x, float y, float z, bool idle, // bot->CastStop(); // botAI->InterruptSpell(); // } - + MotionMaster& mm = *bot->GetMotionMaster(); // No ground pathfinding if the bot/master are flying => allow true 3D (Z) movement auto isFlying = [](Unit* u){ return u && (u->HasUnitMovementFlag(MOVEMENTFLAG_FLYING) || u->IsInFlight()); }; @@ -530,7 +530,8 @@ bool MovementAction::MoveTo(uint32 mapId, float x, float y, float z, bool idle, // { // AI_VALUE(LastMovement&, "last area trigger").lastAreaTrigger = entry; // } - // else { + // else + // { // LOG_DEBUG("playerbots", "!entry"); // return bot->TeleportTo(movePosition.getMapId(), movePosition.getX(), movePosition.getY(), // movePosition.getZ(), movePosition.getO(), 0); @@ -876,7 +877,8 @@ bool MovementAction::ReachCombatTo(Unit* target, float distance) deltaAngle -= 2.0f * M_PI; // -PI..PI // if target is moving forward and moving far away, predict the position bool behind = fabs(deltaAngle) > M_PI_2; - if (target->HasUnitMovementFlag(MOVEMENTFLAG_FORWARD) && behind) { + if (target->HasUnitMovementFlag(MOVEMENTFLAG_FORWARD) && behind) + { float predictDis = std::min(3.0f, target->GetObjectSize() * 2); tx += cos(target->GetOrientation()) * predictDis; ty += sin(target->GetOrientation()) * predictDis; @@ -1009,7 +1011,8 @@ bool MovementAction::IsMovingAllowed() return false; } - // if (bot->HasUnitMovementFlag(MOVEMENTFLAG_FALLING)) { + // if (bot->HasUnitMovementFlag(MOVEMENTFLAG_FALLING)) + // { // return false; // } return bot->GetMotionMaster()->GetCurrentMovementGeneratorType() != FLIGHT_MOTION_TYPE; @@ -1094,9 +1097,12 @@ void MovementAction::UpdateMovementState() wasMovementRestricted = isCurrentlyRestricted; // Temporary speed increase in group - // if (botAI->HasRealPlayerMaster()) { + // if (botAI->HasRealPlayerMaster()) + // { // bot->SetSpeedRate(MOVE_RUN, 1.1f); - // } else { + // } + // else + // { // bot->SetSpeedRate(MOVE_RUN, 1.0f); // } // check if target is not reachable (from Vmangos) @@ -1105,7 +1111,7 @@ void MovementAction::UpdateMovementState() // { // if (Unit* pTarget = sServerFacade->GetChaseTarget(bot)) // { - // if (!bot->IsWithinMeleeRange(pTarget) && pTarget->GetTypeId() == TYPEID_UNIT) + // if (!bot->IsWithinMeleeRange(pTarget) && pTarget->IsCreature()) // { // float angle = bot->GetAngle(pTarget); // float distance = 5.0f; @@ -1721,7 +1727,8 @@ bool MovementAction::MoveInside(uint32 mapId, float x, float y, float z, float d // float MovementAction::SearchBestGroundZForPath(float x, float y, float z, bool generatePath, float range, bool // normal_only, float step) // { -// if (!generatePath) { +// if (!generatePath) +// { // return z; // } // float min_length = 100000.0f; @@ -1732,10 +1739,12 @@ bool MovementAction::MoveInside(uint32 mapId, float x, float y, float z, float d // modified_z = bot->GetMapWaterOrGroundLevel(x, y, z + delta); // PathGenerator gen(bot); // gen.CalculatePath(x, y, modified_z); -// if (gen.GetPathType() == PATHFIND_NORMAL && gen.getPathLength() < min_length) { +// if (gen.GetPathType() == PATHFIND_NORMAL && gen.getPathLength() < min_length) +// { // min_length = gen.getPathLength(); // current_z = modified_z; -// if (abs(current_z - z) < 0.5f) { +// if (abs(current_z - z) < 0.5f) +// { // return current_z; // } // } @@ -1744,10 +1753,12 @@ bool MovementAction::MoveInside(uint32 mapId, float x, float y, float z, float d // modified_z = bot->GetMapWaterOrGroundLevel(x, y, z + delta); // PathGenerator gen(bot); // gen.CalculatePath(x, y, modified_z); -// if (gen.GetPathType() == PATHFIND_NORMAL && gen.getPathLength() < min_length) { +// if (gen.GetPathType() == PATHFIND_NORMAL && gen.getPathLength() < min_length) +// { // min_length = gen.getPathLength(); // current_z = modified_z; -// if (abs(current_z - z) < 0.5f) { +// if (abs(current_z - z) < 0.5f) +// { // return current_z; // } // } @@ -1756,18 +1767,22 @@ bool MovementAction::MoveInside(uint32 mapId, float x, float y, float z, float d // modified_z = bot->GetMapWaterOrGroundLevel(x, y, z + delta); // PathGenerator gen(bot); // gen.CalculatePath(x, y, modified_z); -// if (gen.GetPathType() == PATHFIND_NORMAL && gen.getPathLength() < min_length) { +// if (gen.GetPathType() == PATHFIND_NORMAL && gen.getPathLength() < min_length) +// { // min_length = gen.getPathLength(); // current_z = modified_z; -// if (abs(current_z - z) < 0.5f) { +// if (abs(current_z - z) < 0.5f) +// { // return current_z; // } // } // } -// if (current_z == INVALID_HEIGHT && normal_only) { +// if (current_z == INVALID_HEIGHT && normal_only) +// { // return INVALID_HEIGHT; // } -// if (current_z == INVALID_HEIGHT && !normal_only) { +// if (current_z == INVALID_HEIGHT && !normal_only) +// { // return z; // } // return current_z; @@ -2818,7 +2833,7 @@ bool MoveAwayFromCreatureAction::Execute(Event event) // Find all creatures with the specified Id std::vector creatures; - for (const auto& guid : targets) + for (auto const& guid : targets) { Unit* unit = botAI->GetUnit(guid); if (unit && (alive && unit->IsAlive()) && unit->GetEntry() == creatureId) diff --git a/src/strategy/actions/MovementActions.h b/src/strategy/actions/MovementActions.h index b5f7a38912..f50e4b9570 100644 --- a/src/strategy/actions/MovementActions.h +++ b/src/strategy/actions/MovementActions.h @@ -119,7 +119,6 @@ class AvoidAoeAction : public MovementAction int moveInterval; }; - class CombatFormationMoveAction : public MovementAction { public: diff --git a/src/strategy/actions/NonCombatActions.cpp b/src/strategy/actions/NonCombatActions.cpp index e810ad27cd..f87aa891dd 100644 --- a/src/strategy/actions/NonCombatActions.cpp +++ b/src/strategy/actions/NonCombatActions.cpp @@ -47,16 +47,16 @@ bool DrinkAction::Execute(Event event) return UseItemAction::Execute(event); } -bool DrinkAction::isUseful() -{ - return UseItemAction::isUseful() && +bool DrinkAction::isUseful() +{ + return UseItemAction::isUseful() && AI_VALUE2(bool, "has mana", "self target") && AI_VALUE2(uint8, "mana", "self target") < 100; } bool DrinkAction::isPossible() { - return !bot->IsInCombat() && + return !bot->IsInCombat() && !bot->IsMounted() && !botAI->HasAnyAuraOf(GetTarget(), "dire bear form", "bear form", "cat form", "travel form", "aquatic form","flight form", "swift flight form", nullptr) && @@ -102,15 +102,15 @@ bool EatAction::Execute(Event event) return UseItemAction::Execute(event); } -bool EatAction::isUseful() -{ - return UseItemAction::isUseful() && +bool EatAction::isUseful() +{ + return UseItemAction::isUseful() && AI_VALUE2(uint8, "health", "self target") < 100; } bool EatAction::isPossible() { - return !bot->IsInCombat() && + return !bot->IsInCombat() && !bot->IsMounted() && !botAI->HasAnyAuraOf(GetTarget(), "dire bear form", "bear form", "cat form", "travel form", "aquatic form","flight form", "swift flight form", nullptr) && diff --git a/src/strategy/actions/QuestAction.cpp b/src/strategy/actions/QuestAction.cpp index 39e8e1ba68..b96c539475 100644 --- a/src/strategy/actions/QuestAction.cpp +++ b/src/strategy/actions/QuestAction.cpp @@ -48,7 +48,7 @@ bool QuestAction::Execute(Event event) // Check the nearest NPCs GuidVector npcs = AI_VALUE(GuidVector, "nearest npcs"); - for (const auto& npc : npcs) + for (auto const& npc : npcs) { Unit* unit = botAI->GetUnit(npc); if (unit && bot->GetDistance(unit) <= INTERACTION_DISTANCE) @@ -59,7 +59,7 @@ bool QuestAction::Execute(Event event) // Checks the nearest game objects GuidVector gos = AI_VALUE(GuidVector, "nearest game objects"); - for (const auto& go : gos) + for (auto const& go : gos) { GameObject* gameobj = botAI->GetGameObject(go); if (gameobj && bot->GetDistance(gameobj) <= INTERACTION_DISTANCE) @@ -359,7 +359,7 @@ bool QuestUpdateAddItemAction::Execute(Event event) uint32 availableItemsCount = botAI->GetInventoryItemsCountWithId(itemId); placeholders["%quest_obj_available"] = std::to_string(availableItemsCount); - for (const auto& pair : botAI->GetCurrentQuestsRequiringItemId(itemId)) + for (auto const& pair : botAI->GetCurrentQuestsRequiringItemId(itemId)) { placeholders["%quest_link"] = chat->FormatQuest(pair.first); uint32 requiredItemsCount = pair.second; diff --git a/src/strategy/actions/QuestAction.h b/src/strategy/actions/QuestAction.h index b9ca10e54b..c19faf9ece 100644 --- a/src/strategy/actions/QuestAction.h +++ b/src/strategy/actions/QuestAction.h @@ -49,7 +49,7 @@ class QuestUpdateAddItemAction : public Action { public: QuestUpdateAddItemAction(PlayerbotAI* ai) : Action(ai, "quest update add item") {} - bool Execute(Event event) override;; + bool Execute(Event event) override; }; class QuestUpdateFailedAction : public Action @@ -70,7 +70,7 @@ class QuestItemPushResultAction : public Action { public: QuestItemPushResultAction(PlayerbotAI* ai) : Action(ai, "quest item push result") {} - bool Execute(Event event) override;; + bool Execute(Event event) override; }; #endif diff --git a/src/strategy/actions/ReleaseSpiritAction.cpp b/src/strategy/actions/ReleaseSpiritAction.cpp index 666e42aba3..b06fc89263 100644 --- a/src/strategy/actions/ReleaseSpiritAction.cpp +++ b/src/strategy/actions/ReleaseSpiritAction.cpp @@ -128,7 +128,7 @@ bool AutoReleaseSpiritAction::HandleBattlegroundSpiritHealer() GuidVector npcs = NearestNpcsValue(botAI, bgRange); Unit* spiritHealer = nullptr; - for (const auto& guid : npcs) + for (auto const& guid : npcs) { Unit* unit = botAI->GetUnit(guid); if (unit && unit->IsFriendlyTo(bot) && unit->IsSpiritService()) diff --git a/src/strategy/actions/RevealGatheringItemAction.cpp b/src/strategy/actions/RevealGatheringItemAction.cpp index 00f1cc1db4..9725dce5ce 100644 --- a/src/strategy/actions/RevealGatheringItemAction.cpp +++ b/src/strategy/actions/RevealGatheringItemAction.cpp @@ -12,24 +12,7 @@ #include "GridNotifiersImpl.h" #include "Playerbots.h" #include "ServerFacade.h" - -class AnyGameObjectInObjectRangeCheck -{ -public: - AnyGameObjectInObjectRangeCheck(WorldObject const* obj, float range) : i_obj(obj), i_range(range) {} - WorldObject const& GetFocusObject() const { return *i_obj; } - bool operator()(GameObject* go) - { - if (go && i_obj->IsWithinDistInMap(go, i_range) && go->isSpawned() && go->GetGOInfo()) - return true; - - return false; - } - -private: - WorldObject const* i_obj; - float i_range; -}; +#include "NearestGameObjects.h" bool RevealGatheringItemAction::Execute(Event event) { diff --git a/src/strategy/actions/ReviveFromCorpseAction.cpp b/src/strategy/actions/ReviveFromCorpseAction.cpp index 83897dc2ab..74237670df 100644 --- a/src/strategy/actions/ReviveFromCorpseAction.cpp +++ b/src/strategy/actions/ReviveFromCorpseAction.cpp @@ -314,7 +314,7 @@ bool SpiritHealerAction::Execute(Event event) for (GuidVector::iterator i = npcs.begin(); i != npcs.end(); i++) { Unit* unit = botAI->GetUnit(*i); - if (unit && unit->HasFlag(UNIT_NPC_FLAGS, UNIT_NPC_FLAG_SPIRITHEALER)) + if (unit && unit->HasNpcFlag(UNIT_NPC_FLAG_SPIRITHEALER)) { LOG_DEBUG("playerbots", "Bot {} {}:{} <{}> revives at spirit healer", bot->GetGUID().ToString().c_str(), bot->GetTeamId() == TEAM_ALLIANCE ? "A" : "H", bot->GetLevel(), bot->GetName()); diff --git a/src/strategy/actions/RpgAction.cpp b/src/strategy/actions/RpgAction.cpp index 21b68d6bf8..ae6a50fddb 100644 --- a/src/strategy/actions/RpgAction.cpp +++ b/src/strategy/actions/RpgAction.cpp @@ -50,7 +50,6 @@ bool RpgAction::SetNextRpgAction() std::vector relevances; std::vector triggerNodes; - for (auto& strategy : botAI->GetAiObjectContext()->GetSupportedStrategies()) { if (strategy.find("rpg") == std::string::npos) diff --git a/src/strategy/actions/SayAction.cpp b/src/strategy/actions/SayAction.cpp index 474f37e4ce..00fae65293 100644 --- a/src/strategy/actions/SayAction.cpp +++ b/src/strategy/actions/SayAction.cpp @@ -195,7 +195,7 @@ void ChatReplyAction::ChatReplyDo(Player* bot, uint32& type, uint32& guid1, uint } ChatChannelSource chatChannelSource = GET_PLAYERBOT_AI(bot)->GetChatChannelSource(bot, type, chanName); - if ( (msg.starts_with("LFG") || msg.starts_with("LFM")) && HandleLFGQuestsReply(bot, chatChannelSource, msg, name)) + if ((msg.starts_with("LFG") || msg.starts_with("LFM")) && HandleLFGQuestsReply(bot, chatChannelSource, msg, name)) { return; } diff --git a/src/strategy/actions/SetHomeAction.cpp b/src/strategy/actions/SetHomeAction.cpp index 36893f4a8c..44f3c7b49f 100644 --- a/src/strategy/actions/SetHomeAction.cpp +++ b/src/strategy/actions/SetHomeAction.cpp @@ -24,7 +24,7 @@ bool SetHomeAction::Execute(Event event) } if (Unit* unit = botAI->GetUnit(selection)) - if (unit->HasFlag(UNIT_NPC_FLAGS, UNIT_NPC_FLAG_INNKEEPER)) + if (unit->HasNpcFlag(UNIT_NPC_FLAG_INNKEEPER)) { if (isRpgAction) { diff --git a/src/strategy/actions/SuggestWhatToDoAction.cpp b/src/strategy/actions/SuggestWhatToDoAction.cpp index 468b1f5077..96cc7f52ac 100644 --- a/src/strategy/actions/SuggestWhatToDoAction.cpp +++ b/src/strategy/actions/SuggestWhatToDoAction.cpp @@ -120,7 +120,8 @@ void SuggestWhatToDoAction::grindMaterials() for (std::map::iterator i = categories.begin(); i != categories.end(); ++i) { - if (urand(0, 10) < 3) { + if (urand(0, 10) < 3) + { std::string name = i->first; double multiplier = i->second; diff --git a/src/strategy/actions/TameAction.cpp b/src/strategy/actions/TameAction.cpp index b414b47806..5b3eda1034 100644 --- a/src/strategy/actions/TameAction.cpp +++ b/src/strategy/actions/TameAction.cpp @@ -81,7 +81,7 @@ bool TameAction::Execute(Event event) std::ostringstream oss; oss << "Available pet families: "; size_t count = 0; - for (const auto& name : normalFamilies) + for (auto const& name : normalFamilies) { if (count++ != 0) oss << ", "; @@ -93,7 +93,7 @@ bool TameAction::Execute(Event event) oss << " | "; oss << "Exotic: "; count = 0; - for (const auto& name : exoticFamilies) + for (auto const& name : exoticFamilies) { if (count++ != 0) oss << ", "; diff --git a/src/strategy/actions/TellGlyphsAction.h b/src/strategy/actions/TellGlyphsAction.h index 6f3e0dace3..77bb5b1ca5 100644 --- a/src/strategy/actions/TellGlyphsAction.h +++ b/src/strategy/actions/TellGlyphsAction.h @@ -18,4 +18,3 @@ class TellGlyphsAction : public Action }; #endif - diff --git a/src/strategy/actions/TradeAction.cpp b/src/strategy/actions/TradeAction.cpp index 9ac7aca2be..ad81d9f93b 100644 --- a/src/strategy/actions/TradeAction.cpp +++ b/src/strategy/actions/TradeAction.cpp @@ -15,7 +15,7 @@ bool TradeAction::Execute(Event event) std::string const text = event.getParam(); // If text starts with any excluded prefix, don't process it further. - for (const auto& prefix : sPlayerbotAIConfig->tradeActionExcludedPrefixes) + for (auto const& prefix : sPlayerbotAIConfig->tradeActionExcludedPrefixes) { if (text.find(prefix) == 0) return false; diff --git a/src/strategy/actions/TrainerAction.cpp b/src/strategy/actions/TrainerAction.cpp index c5509cf8b8..e2e89115b9 100644 --- a/src/strategy/actions/TrainerAction.cpp +++ b/src/strategy/actions/TrainerAction.cpp @@ -172,7 +172,7 @@ bool MaintenanceAction::Execute(Event event) PlayerbotFactory factory(bot, bot->GetLevel()); if (!botAI->IsAlt()) - { + { factory.InitAttunementQuests(); factory.InitBags(false); factory.InitAmmo(); @@ -194,7 +194,7 @@ bool MaintenanceAction::Execute(Event event) if (bot->GetLevel() >= sPlayerbotAIConfig->minEnchantingBotLevel) factory.ApplyEnchantAndGemsNew(); } - else + else { if (sPlayerbotAIConfig->altMaintenanceAttunementQs) factory.InitAttunementQuests(); diff --git a/src/strategy/actions/UseMeetingStoneAction.cpp b/src/strategy/actions/UseMeetingStoneAction.cpp index 24d58aff30..6e902730b8 100644 --- a/src/strategy/actions/UseMeetingStoneAction.cpp +++ b/src/strategy/actions/UseMeetingStoneAction.cpp @@ -9,6 +9,7 @@ #include "Event.h" #include "GridNotifiers.h" #include "GridNotifiersImpl.h" +#include "NearestGameObjects.h" #include "PlayerbotAIConfig.h" #include "Playerbots.h" #include "PositionValue.h" @@ -54,24 +55,6 @@ bool UseMeetingStoneAction::Execute(Event event) return Teleport(master, bot); } -class AnyGameObjectInObjectRangeCheck -{ -public: - AnyGameObjectInObjectRangeCheck(WorldObject const* obj, float range) : i_obj(obj), i_range(range) {} - WorldObject const& GetFocusObject() const { return *i_obj; } - bool operator()(GameObject* go) - { - if (go && i_obj->IsWithinDistInMap(go, i_range) && go->isSpawned() && go->GetGOInfo()) - return true; - - return false; - } - -private: - WorldObject const* i_obj; - float i_range; -}; - bool SummonAction::Execute(Event event) { Player* master = GetMaster(); @@ -134,7 +117,7 @@ bool SummonAction::SummonUsingNpcs(Player* summoner, Player* player) for (Unit* unit : targets) { - if (unit && unit->HasFlag(UNIT_NPC_FLAGS, UNIT_NPC_FLAG_INNKEEPER)) + if (unit && unit->HasNpcFlag(UNIT_NPC_FLAG_INNKEEPER)) { if (!player->HasItemCount(6948, 1, false)) { @@ -242,7 +225,7 @@ bool SummonAction::Teleport(Player* summoner, Player* player) } } - if(summoner != player) + if (summoner != player) botAI->TellError("Not enough place to summon"); return false; } diff --git a/src/strategy/actions/WorldBuffAction.cpp b/src/strategy/actions/WorldBuffAction.cpp index b47083850a..3cd770e4d0 100644 --- a/src/strategy/actions/WorldBuffAction.cpp +++ b/src/strategy/actions/WorldBuffAction.cpp @@ -97,4 +97,3 @@ std::vector WorldBuffAction::NeedWorldBuffs(Unit* unit) return retVec; } - diff --git a/src/strategy/actions/XpGainAction.cpp b/src/strategy/actions/XpGainAction.cpp index 446be3bb6d..4048ce3af8 100644 --- a/src/strategy/actions/XpGainAction.cpp +++ b/src/strategy/actions/XpGainAction.cpp @@ -15,7 +15,6 @@ bool XpGainAction::Execute(Event event) { context->GetValue("death count")->Set(0); - WorldPacket p(event.getPacket()); // (8+4+1+4+8) ObjectGuid guid; // uint32 xpgain; diff --git a/src/strategy/deathknight/DKActions.cpp b/src/strategy/deathknight/DKActions.cpp index 5206103617..2b5ce97706 100644 --- a/src/strategy/deathknight/DKActions.cpp +++ b/src/strategy/deathknight/DKActions.cpp @@ -43,7 +43,7 @@ bool CastRaiseDeadAction::Execute(Event event) return false; } uint32 spellId = AI_VALUE2(uint32, "spell id", spell); - // const SpellInfo *spellInfo = sSpellMgr->GetSpellInfo(spellId); + // SpellInfo const *spellInfo = sSpellMgr->GetSpellInfo(spellId); bot->AddSpellCooldown(spellId, 0, 3 * 60 * 1000); return true; -} \ No newline at end of file +} diff --git a/src/strategy/druid/DruidActions.h b/src/strategy/druid/DruidActions.h index f7a4ef32ce..402073d26d 100644 --- a/src/strategy/druid/DruidActions.h +++ b/src/strategy/druid/DruidActions.h @@ -311,7 +311,6 @@ class CastEnrageAction : public CastBuffSpellAction CastEnrageAction(PlayerbotAI* ai) : CastBuffSpellAction(ai, "enrage") {} }; - class CastRejuvenationOnNotFullAction : public HealPartyMemberAction { public: diff --git a/src/strategy/dungeons/DungeonStrategyContext.h b/src/strategy/dungeons/DungeonStrategyContext.h index ce982b148f..cc606afef8 100644 --- a/src/strategy/dungeons/DungeonStrategyContext.h +++ b/src/strategy/dungeons/DungeonStrategyContext.h @@ -35,8 +35,6 @@ Bronjahm, Devourer of Souls */ - - class DungeonStrategyContext : public NamedObjectContext { public: @@ -84,8 +82,6 @@ class DungeonStrategyContext : public NamedObjectContext static Strategy* wotlk_toc(PlayerbotAI* botAI) { return new WotlkDungeonToCStrategy(botAI); } // NYI from here down static Strategy* wotlk_hor(PlayerbotAI* botAI) { return new WotlkDungeonUKStrategy(botAI); } - - }; #endif diff --git a/src/strategy/dungeons/wotlk/WotlkDungeonTriggerContext.h b/src/strategy/dungeons/wotlk/WotlkDungeonTriggerContext.h index 057d25e020..1a3d7a94a3 100644 --- a/src/strategy/dungeons/wotlk/WotlkDungeonTriggerContext.h +++ b/src/strategy/dungeons/wotlk/WotlkDungeonTriggerContext.h @@ -18,5 +18,4 @@ #include "trialofthechampion/TrialOfTheChampionTriggerContext.h" // #include "hallsofreflection/HallsOfReflectionTriggerContext.h" - #endif diff --git a/src/strategy/dungeons/wotlk/azjolnerub/AzjolNerubActions.cpp b/src/strategy/dungeons/wotlk/azjolnerub/AzjolNerubActions.cpp index 2b7e7c9f13..e31ffd00f5 100644 --- a/src/strategy/dungeons/wotlk/azjolnerub/AzjolNerubActions.cpp +++ b/src/strategy/dungeons/wotlk/azjolnerub/AzjolNerubActions.cpp @@ -2,7 +2,6 @@ #include "AzjolNerubActions.h" #include "AzjolNerubStrategy.h" - bool AttackWebWrapAction::isUseful() { return !botAI->IsHeal(bot); } bool AttackWebWrapAction::Execute(Event event) { diff --git a/src/strategy/dungeons/wotlk/azjolnerub/AzjolNerubStrategy.cpp b/src/strategy/dungeons/wotlk/azjolnerub/AzjolNerubStrategy.cpp index dcefbae507..1a30e98ce8 100644 --- a/src/strategy/dungeons/wotlk/azjolnerub/AzjolNerubStrategy.cpp +++ b/src/strategy/dungeons/wotlk/azjolnerub/AzjolNerubStrategy.cpp @@ -1,7 +1,6 @@ #include "AzjolNerubStrategy.h" #include "AzjolNerubMultipliers.h" - void WotlkDungeonANStrategy::InitTriggers(std::vector &triggers) { // Krik'thir the Gatewatcher diff --git a/src/strategy/dungeons/wotlk/azjolnerub/AzjolNerubStrategy.h b/src/strategy/dungeons/wotlk/azjolnerub/AzjolNerubStrategy.h index bf5a7917a2..70196e6e41 100644 --- a/src/strategy/dungeons/wotlk/azjolnerub/AzjolNerubStrategy.h +++ b/src/strategy/dungeons/wotlk/azjolnerub/AzjolNerubStrategy.h @@ -5,7 +5,6 @@ #include "AiObjectContext.h" #include "Strategy.h" - class WotlkDungeonANStrategy : public Strategy { public: diff --git a/src/strategy/dungeons/wotlk/azjolnerub/AzjolNerubTriggers.cpp b/src/strategy/dungeons/wotlk/azjolnerub/AzjolNerubTriggers.cpp index df52374c4d..f9ef4ff953 100644 --- a/src/strategy/dungeons/wotlk/azjolnerub/AzjolNerubTriggers.cpp +++ b/src/strategy/dungeons/wotlk/azjolnerub/AzjolNerubTriggers.cpp @@ -3,7 +3,6 @@ #include "AiObject.h" #include "AiObjectContext.h" - bool KrikthirWebWrapTrigger::IsActive() { if (!botAI->IsDps(bot)) { return false; } diff --git a/src/strategy/dungeons/wotlk/cullingofstratholme/CullingOfStratholmeActions.cpp b/src/strategy/dungeons/wotlk/cullingofstratholme/CullingOfStratholmeActions.cpp index dd857569a0..15121f4a2e 100644 --- a/src/strategy/dungeons/wotlk/cullingofstratholme/CullingOfStratholmeActions.cpp +++ b/src/strategy/dungeons/wotlk/cullingofstratholme/CullingOfStratholmeActions.cpp @@ -2,7 +2,6 @@ #include "CullingOfStratholmeActions.h" #include "CullingOfStratholmeStrategy.h" - bool ExplodeGhoulSpreadAction::Execute(Event event) { Unit* boss = AI_VALUE2(Unit*, "find target", "salramm the fleshcrafter"); @@ -32,7 +31,7 @@ bool EpochStackAction::isUseful() // Hunter bots will try and melee in between ranged attacks, or just melee entirely at 5 as they are in range. // 7.5 or 8.0 solves this for this boss. // Unfortunately at this range the boss will charge. So I guess just don't stack as a hunter.. - // if(bot->getClass() == CLASS_HUNTER) + // if (bot->getClass() == CLASS_HUNTER) // { // return AI_VALUE2(float, "distance", "current target") > 7.5f; // } @@ -45,7 +44,7 @@ bool EpochStackAction::Execute(Event event) if (!boss) { return false; } float maxMovement = 10.0f; - // if(bot->getClass() == CLASS_HUNTER) + // if (bot->getClass() == CLASS_HUNTER) // { // return Move(bot->GetAngle(boss), fmin(bot->GetExactDist2d(boss) - 6.5f, maxMovement)); // } diff --git a/src/strategy/dungeons/wotlk/cullingofstratholme/CullingOfStratholmeStrategy.cpp b/src/strategy/dungeons/wotlk/cullingofstratholme/CullingOfStratholmeStrategy.cpp index b9081ba82c..e9011ee7ff 100644 --- a/src/strategy/dungeons/wotlk/cullingofstratholme/CullingOfStratholmeStrategy.cpp +++ b/src/strategy/dungeons/wotlk/cullingofstratholme/CullingOfStratholmeStrategy.cpp @@ -1,7 +1,6 @@ #include "CullingOfStratholmeStrategy.h" #include "CullingOfStratholmeMultipliers.h" - void WotlkDungeonCoSStrategy::InitTriggers(std::vector &triggers) { // Meathook diff --git a/src/strategy/dungeons/wotlk/cullingofstratholme/CullingOfStratholmeStrategy.h b/src/strategy/dungeons/wotlk/cullingofstratholme/CullingOfStratholmeStrategy.h index 9c687da9c5..bff1267435 100644 --- a/src/strategy/dungeons/wotlk/cullingofstratholme/CullingOfStratholmeStrategy.h +++ b/src/strategy/dungeons/wotlk/cullingofstratholme/CullingOfStratholmeStrategy.h @@ -5,7 +5,6 @@ #include "AiObjectContext.h" #include "Strategy.h" - class WotlkDungeonCoSStrategy : public Strategy { public: diff --git a/src/strategy/dungeons/wotlk/cullingofstratholme/CullingOfStratholmeTriggers.cpp b/src/strategy/dungeons/wotlk/cullingofstratholme/CullingOfStratholmeTriggers.cpp index a2b7dc11cc..cb67ad077f 100644 --- a/src/strategy/dungeons/wotlk/cullingofstratholme/CullingOfStratholmeTriggers.cpp +++ b/src/strategy/dungeons/wotlk/cullingofstratholme/CullingOfStratholmeTriggers.cpp @@ -3,7 +3,6 @@ #include "AiObject.h" #include "AiObjectContext.h" - bool ExplodeGhoulTrigger::IsActive() { Unit* boss = AI_VALUE2(Unit*, "find target", "salramm the fleshcrafter"); diff --git a/src/strategy/dungeons/wotlk/draktharonkeep/DrakTharonKeepActions.cpp b/src/strategy/dungeons/wotlk/draktharonkeep/DrakTharonKeepActions.cpp index 0ab72c1bb0..8cbbe49c2a 100644 --- a/src/strategy/dungeons/wotlk/draktharonkeep/DrakTharonKeepActions.cpp +++ b/src/strategy/dungeons/wotlk/draktharonkeep/DrakTharonKeepActions.cpp @@ -2,7 +2,6 @@ #include "DrakTharonKeepActions.h" #include "DrakTharonKeepStrategy.h" - bool CorpseExplodeSpreadAction::Execute(Event event) { Unit* boss = AI_VALUE2(Unit*, "find target", "trollgore"); diff --git a/src/strategy/dungeons/wotlk/draktharonkeep/DrakTharonKeepStrategy.cpp b/src/strategy/dungeons/wotlk/draktharonkeep/DrakTharonKeepStrategy.cpp index 4166f2f5b3..a32d523135 100644 --- a/src/strategy/dungeons/wotlk/draktharonkeep/DrakTharonKeepStrategy.cpp +++ b/src/strategy/dungeons/wotlk/draktharonkeep/DrakTharonKeepStrategy.cpp @@ -1,7 +1,6 @@ #include "DrakTharonKeepStrategy.h" #include "DrakTharonKeepMultipliers.h" - void WotlkDungeonDTKStrategy::InitTriggers(std::vector &triggers) { // Trollgore diff --git a/src/strategy/dungeons/wotlk/draktharonkeep/DrakTharonKeepStrategy.h b/src/strategy/dungeons/wotlk/draktharonkeep/DrakTharonKeepStrategy.h index b819ad3809..41ef0ced6f 100644 --- a/src/strategy/dungeons/wotlk/draktharonkeep/DrakTharonKeepStrategy.h +++ b/src/strategy/dungeons/wotlk/draktharonkeep/DrakTharonKeepStrategy.h @@ -5,7 +5,6 @@ #include "AiObjectContext.h" #include "Strategy.h" - class WotlkDungeonDTKStrategy : public Strategy { public: diff --git a/src/strategy/dungeons/wotlk/draktharonkeep/DrakTharonKeepTriggers.cpp b/src/strategy/dungeons/wotlk/draktharonkeep/DrakTharonKeepTriggers.cpp index 9ed4b19121..406f4d4333 100644 --- a/src/strategy/dungeons/wotlk/draktharonkeep/DrakTharonKeepTriggers.cpp +++ b/src/strategy/dungeons/wotlk/draktharonkeep/DrakTharonKeepTriggers.cpp @@ -3,7 +3,6 @@ #include "AiObject.h" #include "AiObjectContext.h" - bool CorpseExplodeTrigger::IsActive() { Unit* boss = AI_VALUE2(Unit*, "find target", "trollgore"); diff --git a/src/strategy/dungeons/wotlk/forgeofsouls/ForgeOfSoulsActions.cpp b/src/strategy/dungeons/wotlk/forgeofsouls/ForgeOfSoulsActions.cpp index 3bd21f34d1..e72fe98d5f 100644 --- a/src/strategy/dungeons/wotlk/forgeofsouls/ForgeOfSoulsActions.cpp +++ b/src/strategy/dungeons/wotlk/forgeofsouls/ForgeOfSoulsActions.cpp @@ -17,7 +17,6 @@ bool MoveFromBronjahmAction::Execute(Event event) return false; } - bool AttackCorruptedSoulFragmentAction::Execute(Event event) { Unit* currentTarget = AI_VALUE(Unit*, "current target"); @@ -52,7 +51,6 @@ bool AttackCorruptedSoulFragmentAction::Execute(Event event) return false; } - bool BronjahmGroupPositionAction::Execute(Event event) { Unit* boss = AI_VALUE2(Unit*, "find target", "bronjahm"); @@ -165,5 +163,3 @@ bool DevourerOfSoulsAction::Execute(Event event) return false; } - - diff --git a/src/strategy/dungeons/wotlk/forgeofsouls/ForgeOfSoulsMultipliers.cpp b/src/strategy/dungeons/wotlk/forgeofsouls/ForgeOfSoulsMultipliers.cpp index 7ddcffb86d..7873e7c1d1 100644 --- a/src/strategy/dungeons/wotlk/forgeofsouls/ForgeOfSoulsMultipliers.cpp +++ b/src/strategy/dungeons/wotlk/forgeofsouls/ForgeOfSoulsMultipliers.cpp @@ -6,7 +6,6 @@ #include "ForgeOfSoulsTriggers.h" #include "ForgeOfSoulsActions.h" - float BronjahmMultiplier::GetValue(Action* action) { Unit* boss = AI_VALUE2(Unit *, "find target", "bronjahm"); if (!boss) diff --git a/src/strategy/dungeons/wotlk/forgeofsouls/ForgeOfSoulsMultipliers.h b/src/strategy/dungeons/wotlk/forgeofsouls/ForgeOfSoulsMultipliers.h index 99d7e47b64..1c89bb096b 100644 --- a/src/strategy/dungeons/wotlk/forgeofsouls/ForgeOfSoulsMultipliers.h +++ b/src/strategy/dungeons/wotlk/forgeofsouls/ForgeOfSoulsMultipliers.h @@ -20,5 +20,4 @@ class AttackFragmentMultiplier : public Multiplier float GetValue(Action* action) override; }; - #endif diff --git a/src/strategy/dungeons/wotlk/gundrak/GundrakStrategy.cpp b/src/strategy/dungeons/wotlk/gundrak/GundrakStrategy.cpp index ac7b909d2d..8c5612dc65 100644 --- a/src/strategy/dungeons/wotlk/gundrak/GundrakStrategy.cpp +++ b/src/strategy/dungeons/wotlk/gundrak/GundrakStrategy.cpp @@ -1,7 +1,6 @@ #include "GundrakStrategy.h" #include "GundrakMultipliers.h" - void WotlkDungeonGDStrategy::InitTriggers(std::vector &triggers) { // Moorabi diff --git a/src/strategy/dungeons/wotlk/gundrak/GundrakStrategy.h b/src/strategy/dungeons/wotlk/gundrak/GundrakStrategy.h index c7910c1ca1..47f8617f17 100644 --- a/src/strategy/dungeons/wotlk/gundrak/GundrakStrategy.h +++ b/src/strategy/dungeons/wotlk/gundrak/GundrakStrategy.h @@ -5,7 +5,6 @@ #include "AiObjectContext.h" #include "Strategy.h" - class WotlkDungeonGDStrategy : public Strategy { public: diff --git a/src/strategy/dungeons/wotlk/hallsoflightning/HallsOfLightningActions.cpp b/src/strategy/dungeons/wotlk/hallsoflightning/HallsOfLightningActions.cpp index a31699f806..047e0aee13 100644 --- a/src/strategy/dungeons/wotlk/hallsoflightning/HallsOfLightningActions.cpp +++ b/src/strategy/dungeons/wotlk/hallsoflightning/HallsOfLightningActions.cpp @@ -126,7 +126,7 @@ bool LokenStackAction::isUseful() // Minimum hunter range is 5, but values too close to this seem to cause issues.. // Hunter bots will try and melee in between ranged attacks, or just melee entirely at 5 as they are in range. // 6.5 or 7.0 solves this for this boss. - if(bot->getClass() == CLASS_HUNTER) + if (bot->getClass() == CLASS_HUNTER) { return AI_VALUE2(float, "distance", "current target") > 6.5f; } @@ -141,7 +141,7 @@ bool LokenStackAction::Execute(Event event) float maxMovement = 10.0f; if (!boss->HasUnitState(UNIT_STATE_CASTING)) { - if(bot->getClass() == CLASS_HUNTER) + if (bot->getClass() == CLASS_HUNTER) { return Move(bot->GetAngle(boss), fmin(bot->GetExactDist2d(boss) - 6.5f, maxMovement)); } @@ -152,7 +152,6 @@ bool LokenStackAction::Execute(Event event) return false; } - bool AvoidLightningNovaAction::Execute(Event event) { Unit* boss = AI_VALUE2(Unit*, "find target", "loken"); diff --git a/src/strategy/dungeons/wotlk/hallsoflightning/HallsOfLightningMultipliers.cpp b/src/strategy/dungeons/wotlk/hallsoflightning/HallsOfLightningMultipliers.cpp index fa67682237..3bf9fcfd63 100644 --- a/src/strategy/dungeons/wotlk/hallsoflightning/HallsOfLightningMultipliers.cpp +++ b/src/strategy/dungeons/wotlk/hallsoflightning/HallsOfLightningMultipliers.cpp @@ -123,4 +123,3 @@ float LokenMultiplier::GetValue(Action* action) return 1.0f; // Default multiplier value for other cases. } - diff --git a/src/strategy/dungeons/wotlk/hallsoflightning/HallsOfLightningStrategy.cpp b/src/strategy/dungeons/wotlk/hallsoflightning/HallsOfLightningStrategy.cpp index dc17c3d8f7..42d30d96d9 100644 --- a/src/strategy/dungeons/wotlk/hallsoflightning/HallsOfLightningStrategy.cpp +++ b/src/strategy/dungeons/wotlk/hallsoflightning/HallsOfLightningStrategy.cpp @@ -1,7 +1,6 @@ #include "HallsOfLightningStrategy.h" #include "HallsOfLightningMultipliers.h" - void WotlkDungeonHoLStrategy::InitTriggers(std::vector &triggers) { // General Bjarngrim diff --git a/src/strategy/dungeons/wotlk/hallsoflightning/HallsOfLightningStrategy.h b/src/strategy/dungeons/wotlk/hallsoflightning/HallsOfLightningStrategy.h index 8ee265dd47..6463033b3a 100644 --- a/src/strategy/dungeons/wotlk/hallsoflightning/HallsOfLightningStrategy.h +++ b/src/strategy/dungeons/wotlk/hallsoflightning/HallsOfLightningStrategy.h @@ -5,7 +5,6 @@ #include "AiObjectContext.h" #include "Strategy.h" - class WotlkDungeonHoLStrategy : public Strategy { public: diff --git a/src/strategy/dungeons/wotlk/hallsofstone/HallsOfStoneStrategy.cpp b/src/strategy/dungeons/wotlk/hallsofstone/HallsOfStoneStrategy.cpp index 78d73f4de8..b13d4d6353 100644 --- a/src/strategy/dungeons/wotlk/hallsofstone/HallsOfStoneStrategy.cpp +++ b/src/strategy/dungeons/wotlk/hallsofstone/HallsOfStoneStrategy.cpp @@ -1,7 +1,6 @@ #include "HallsOfStoneStrategy.h" #include "HallsOfStoneMultipliers.h" - void WotlkDungeonHoSStrategy::InitTriggers(std::vector &triggers) { // Maiden of Grief diff --git a/src/strategy/dungeons/wotlk/hallsofstone/HallsOfStoneStrategy.h b/src/strategy/dungeons/wotlk/hallsofstone/HallsOfStoneStrategy.h index 6208483816..ee26aa2cd2 100644 --- a/src/strategy/dungeons/wotlk/hallsofstone/HallsOfStoneStrategy.h +++ b/src/strategy/dungeons/wotlk/hallsofstone/HallsOfStoneStrategy.h @@ -5,7 +5,6 @@ #include "AiObjectContext.h" #include "Strategy.h" - class WotlkDungeonHoSStrategy : public Strategy { public: diff --git a/src/strategy/dungeons/wotlk/nexus/NexusMultipliers.cpp b/src/strategy/dungeons/wotlk/nexus/NexusMultipliers.cpp index 764c9f346c..7adc79b455 100644 --- a/src/strategy/dungeons/wotlk/nexus/NexusMultipliers.cpp +++ b/src/strategy/dungeons/wotlk/nexus/NexusMultipliers.cpp @@ -94,4 +94,3 @@ float OrmorokMultiplier::GetValue(Action* action) } return 1.0f; } - diff --git a/src/strategy/dungeons/wotlk/nexus/NexusStrategy.cpp b/src/strategy/dungeons/wotlk/nexus/NexusStrategy.cpp index e471d3b804..22a85f5027 100644 --- a/src/strategy/dungeons/wotlk/nexus/NexusStrategy.cpp +++ b/src/strategy/dungeons/wotlk/nexus/NexusStrategy.cpp @@ -1,7 +1,6 @@ #include "NexusStrategy.h" #include "NexusMultipliers.h" - void WotlkDungeonNexStrategy::InitTriggers(std::vector &triggers) { // Horde Commander (Alliance N)/Commander Kolurg (Alliance H) diff --git a/src/strategy/dungeons/wotlk/nexus/NexusStrategy.h b/src/strategy/dungeons/wotlk/nexus/NexusStrategy.h index f9ecf42643..c78225b93b 100644 --- a/src/strategy/dungeons/wotlk/nexus/NexusStrategy.h +++ b/src/strategy/dungeons/wotlk/nexus/NexusStrategy.h @@ -5,7 +5,6 @@ #include "AiObjectContext.h" #include "Strategy.h" - class WotlkDungeonNexStrategy : public Strategy { public: diff --git a/src/strategy/dungeons/wotlk/oculus/OculusMultipliers.cpp b/src/strategy/dungeons/wotlk/oculus/OculusMultipliers.cpp index 5789d69649..7be543ee70 100644 --- a/src/strategy/dungeons/wotlk/oculus/OculusMultipliers.cpp +++ b/src/strategy/dungeons/wotlk/oculus/OculusMultipliers.cpp @@ -40,7 +40,7 @@ float OccFlyingMultiplier::GetValue(Action* action) float UromMultiplier::GetValue(Action* action) { - if(GetPhaseByCurrentPosition(bot) < 3) + if (GetPhaseByCurrentPosition(bot) < 3) { Unit* target = action->GetTarget(); if (target && target->GetEntry() == NPC_MAGE_LORD_UROM) diff --git a/src/strategy/dungeons/wotlk/oculus/OculusStrategy.cpp b/src/strategy/dungeons/wotlk/oculus/OculusStrategy.cpp index 1220e56f49..3e98dfa6a4 100644 --- a/src/strategy/dungeons/wotlk/oculus/OculusStrategy.cpp +++ b/src/strategy/dungeons/wotlk/oculus/OculusStrategy.cpp @@ -1,7 +1,6 @@ #include "OculusStrategy.h" #include "OculusMultipliers.h" - void WotlkDungeonOccStrategy::InitTriggers(std::vector &triggers) { // Drakos the Interrogator diff --git a/src/strategy/dungeons/wotlk/oculus/OculusStrategy.h b/src/strategy/dungeons/wotlk/oculus/OculusStrategy.h index a734f2f450..2accfd8f4d 100644 --- a/src/strategy/dungeons/wotlk/oculus/OculusStrategy.h +++ b/src/strategy/dungeons/wotlk/oculus/OculusStrategy.h @@ -5,7 +5,6 @@ #include "AiObjectContext.h" #include "Strategy.h" - class WotlkDungeonOccStrategy : public Strategy { public: diff --git a/src/strategy/dungeons/wotlk/oldkingdom/OldKingdomActions.cpp b/src/strategy/dungeons/wotlk/oldkingdom/OldKingdomActions.cpp index 703c7454a5..916bf29200 100644 --- a/src/strategy/dungeons/wotlk/oldkingdom/OldKingdomActions.cpp +++ b/src/strategy/dungeons/wotlk/oldkingdom/OldKingdomActions.cpp @@ -2,7 +2,6 @@ #include "OldKingdomActions.h" #include "OldKingdomStrategy.h" - bool AttackNadoxGuardianAction::Execute(Event event) { Unit* target = AI_VALUE2(Unit*, "find target", "ahn'kahar guardian"); diff --git a/src/strategy/dungeons/wotlk/oldkingdom/OldKingdomStrategy.cpp b/src/strategy/dungeons/wotlk/oldkingdom/OldKingdomStrategy.cpp index 850fcfcb85..50a38412f7 100644 --- a/src/strategy/dungeons/wotlk/oldkingdom/OldKingdomStrategy.cpp +++ b/src/strategy/dungeons/wotlk/oldkingdom/OldKingdomStrategy.cpp @@ -1,7 +1,6 @@ #include "OldKingdomStrategy.h" #include "OldKingdomMultipliers.h" - void WotlkDungeonOKStrategy::InitTriggers(std::vector &triggers) { // Elder Nadox diff --git a/src/strategy/dungeons/wotlk/oldkingdom/OldKingdomStrategy.h b/src/strategy/dungeons/wotlk/oldkingdom/OldKingdomStrategy.h index 03c5085ee9..75c475559e 100644 --- a/src/strategy/dungeons/wotlk/oldkingdom/OldKingdomStrategy.h +++ b/src/strategy/dungeons/wotlk/oldkingdom/OldKingdomStrategy.h @@ -5,7 +5,6 @@ #include "AiObjectContext.h" #include "Strategy.h" - class WotlkDungeonOKStrategy : public Strategy { public: diff --git a/src/strategy/dungeons/wotlk/oldkingdom/OldKingdomTriggers.cpp b/src/strategy/dungeons/wotlk/oldkingdom/OldKingdomTriggers.cpp index 2de9190ce9..6b72f656a9 100644 --- a/src/strategy/dungeons/wotlk/oldkingdom/OldKingdomTriggers.cpp +++ b/src/strategy/dungeons/wotlk/oldkingdom/OldKingdomTriggers.cpp @@ -3,7 +3,6 @@ #include "AiObject.h" #include "AiObjectContext.h" - bool NadoxGuardianTrigger::IsActive() { if (botAI->IsHeal(bot)) { return false; } diff --git a/src/strategy/dungeons/wotlk/pitofsaron/PitOfSaronActions.cpp b/src/strategy/dungeons/wotlk/pitofsaron/PitOfSaronActions.cpp index fee0ed6078..f34b98462e 100644 --- a/src/strategy/dungeons/wotlk/pitofsaron/PitOfSaronActions.cpp +++ b/src/strategy/dungeons/wotlk/pitofsaron/PitOfSaronActions.cpp @@ -136,7 +136,6 @@ bool IckAndKrickAction::PoisonNova(bool poisonNova, Unit* boss) return false; } - bool IckAndKrickAction::ExplosiveBarrage(bool explosiveBarrage, Unit* boss) { std::vector orbs; diff --git a/src/strategy/dungeons/wotlk/pitofsaron/PitOfSaronMultipliers.cpp b/src/strategy/dungeons/wotlk/pitofsaron/PitOfSaronMultipliers.cpp index cbe1877800..be36e480f2 100644 --- a/src/strategy/dungeons/wotlk/pitofsaron/PitOfSaronMultipliers.cpp +++ b/src/strategy/dungeons/wotlk/pitofsaron/PitOfSaronMultipliers.cpp @@ -5,8 +5,6 @@ #include "MovementActions.h" #include "PitOfSaronTriggers.h" - - float IckAndKrickMultiplier::GetValue(Action* action) { Unit* boss = AI_VALUE2(Unit*, "find target", "ick"); diff --git a/src/strategy/dungeons/wotlk/pitofsaron/PitOfSaronMultipliers.h b/src/strategy/dungeons/wotlk/pitofsaron/PitOfSaronMultipliers.h index fabf6319a3..bcafc01a43 100644 --- a/src/strategy/dungeons/wotlk/pitofsaron/PitOfSaronMultipliers.h +++ b/src/strategy/dungeons/wotlk/pitofsaron/PitOfSaronMultipliers.h @@ -20,5 +20,4 @@ class GarfrostMultiplier : public Multiplier float GetValue(Action* action) override; }; - #endif diff --git a/src/strategy/dungeons/wotlk/trialofthechampion/TrialOfTheChampionActions.cpp b/src/strategy/dungeons/wotlk/trialofthechampion/TrialOfTheChampionActions.cpp index 0cb1ee0e7b..5dd1ef8bcc 100644 --- a/src/strategy/dungeons/wotlk/trialofthechampion/TrialOfTheChampionActions.cpp +++ b/src/strategy/dungeons/wotlk/trialofthechampion/TrialOfTheChampionActions.cpp @@ -9,7 +9,6 @@ #include "GenericActions.h" #include - bool ToCLanceAction::Execute(Event event) { // If already has lance equipped, do nothing diff --git a/src/strategy/dungeons/wotlk/trialofthechampion/TrialOfTheChampionStrategy.cpp b/src/strategy/dungeons/wotlk/trialofthechampion/TrialOfTheChampionStrategy.cpp index 4c439e18a5..e1f97000c6 100644 --- a/src/strategy/dungeons/wotlk/trialofthechampion/TrialOfTheChampionStrategy.cpp +++ b/src/strategy/dungeons/wotlk/trialofthechampion/TrialOfTheChampionStrategy.cpp @@ -1,7 +1,6 @@ #include "TrialOfTheChampionStrategy.h" #include "TrialOfTheChampionMultipliers.h" - void WotlkDungeonToCStrategy::InitTriggers(std::vector &triggers) { triggers.push_back(new TriggerNode("toc lance", diff --git a/src/strategy/dungeons/wotlk/trialofthechampion/TrialOfTheChampionTriggers.cpp b/src/strategy/dungeons/wotlk/trialofthechampion/TrialOfTheChampionTriggers.cpp index 81cfefec95..6c388382e7 100644 --- a/src/strategy/dungeons/wotlk/trialofthechampion/TrialOfTheChampionTriggers.cpp +++ b/src/strategy/dungeons/wotlk/trialofthechampion/TrialOfTheChampionTriggers.cpp @@ -3,7 +3,6 @@ #include "AiObject.h" #include "AiObjectContext.h" - bool ToCLanceTrigger::IsActive() { if (bot->GetVehicle()) @@ -82,4 +81,3 @@ bool ToCEadricTrigger::IsActive() return true; } - diff --git a/src/strategy/dungeons/wotlk/trialofthechampion/TrialOfTheChampionTriggers.h b/src/strategy/dungeons/wotlk/trialofthechampion/TrialOfTheChampionTriggers.h index c92cd87834..0daaf914a8 100644 --- a/src/strategy/dungeons/wotlk/trialofthechampion/TrialOfTheChampionTriggers.h +++ b/src/strategy/dungeons/wotlk/trialofthechampion/TrialOfTheChampionTriggers.h @@ -16,20 +16,16 @@ enum TocC_IDs //Eadric SPELL_RADIANCE = 66935, - // Objects OBJECT_LANCE_RACK = 196398, - // Items ITEM_LANCE = 46106, - // Vehicles NPC_ARGENT_WARHORSE = 35644, NPC_ARGENT_BATTLEWORG = 36558, - // Horde Champions NPC_MOKRA = 35572, NPC_ERESSEA = 35569, @@ -37,7 +33,6 @@ enum TocC_IDs NPC_ZULTORE = 35570, NPC_VISCERI = 35617, - // Alliance Champions NPC_JACOB = 34705, NPC_AMBROSE = 34702, @@ -45,7 +40,6 @@ enum TocC_IDs NPC_JAELYNE = 34657, NPC_LANA = 34703, - // Grand Champion Minions NPC_IRONFORGE_MINION = 35329, NPC_STORMWIND_MINION = 35328, @@ -58,7 +52,6 @@ enum TocC_IDs NPC_SENJIN_MINION = 35323, NPC_UNDERCITY_MINION = 35327, - // Rest of the bosses and npcs NPC_EADRIC = 35119, NPC_EADRIC_H = 35518, diff --git a/src/strategy/dungeons/wotlk/utgardekeep/UtgardeKeepStrategy.cpp b/src/strategy/dungeons/wotlk/utgardekeep/UtgardeKeepStrategy.cpp index 681083efa1..ee7d102a9b 100644 --- a/src/strategy/dungeons/wotlk/utgardekeep/UtgardeKeepStrategy.cpp +++ b/src/strategy/dungeons/wotlk/utgardekeep/UtgardeKeepStrategy.cpp @@ -1,7 +1,6 @@ #include "UtgardeKeepStrategy.h" #include "UtgardeKeepMultipliers.h" - void WotlkDungeonUKStrategy::InitTriggers(std::vector &triggers) { // Prince Keleseth diff --git a/src/strategy/dungeons/wotlk/utgardekeep/UtgardeKeepStrategy.h b/src/strategy/dungeons/wotlk/utgardekeep/UtgardeKeepStrategy.h index 90873feb01..41ce1e76e6 100644 --- a/src/strategy/dungeons/wotlk/utgardekeep/UtgardeKeepStrategy.h +++ b/src/strategy/dungeons/wotlk/utgardekeep/UtgardeKeepStrategy.h @@ -5,7 +5,6 @@ #include "AiObjectContext.h" #include "Strategy.h" - class WotlkDungeonUKStrategy : public Strategy { public: diff --git a/src/strategy/dungeons/wotlk/utgardepinnacle/UtgardePinnacleStrategy.cpp b/src/strategy/dungeons/wotlk/utgardepinnacle/UtgardePinnacleStrategy.cpp index b6e3344936..bcc4399cda 100644 --- a/src/strategy/dungeons/wotlk/utgardepinnacle/UtgardePinnacleStrategy.cpp +++ b/src/strategy/dungeons/wotlk/utgardepinnacle/UtgardePinnacleStrategy.cpp @@ -1,7 +1,6 @@ #include "UtgardePinnacleStrategy.h" #include "UtgardePinnacleMultipliers.h" - void WotlkDungeonUPStrategy::InitTriggers(std::vector &triggers) { // Svala Sorrowgrave diff --git a/src/strategy/dungeons/wotlk/utgardepinnacle/UtgardePinnacleStrategy.h b/src/strategy/dungeons/wotlk/utgardepinnacle/UtgardePinnacleStrategy.h index e8f45363b9..8ce816f808 100644 --- a/src/strategy/dungeons/wotlk/utgardepinnacle/UtgardePinnacleStrategy.h +++ b/src/strategy/dungeons/wotlk/utgardepinnacle/UtgardePinnacleStrategy.h @@ -5,7 +5,6 @@ #include "AiObjectContext.h" #include "Strategy.h" - class WotlkDungeonUPStrategy : public Strategy { public: diff --git a/src/strategy/dungeons/wotlk/violethold/VioletHoldActions.cpp b/src/strategy/dungeons/wotlk/violethold/VioletHoldActions.cpp index 009da3b19d..b590642d8b 100644 --- a/src/strategy/dungeons/wotlk/violethold/VioletHoldActions.cpp +++ b/src/strategy/dungeons/wotlk/violethold/VioletHoldActions.cpp @@ -2,7 +2,6 @@ #include "VioletHoldActions.h" #include "VioletHoldStrategy.h" - bool AttackErekemAction::Execute(Event event) { // Focus boss first, adds after diff --git a/src/strategy/dungeons/wotlk/violethold/VioletHoldStrategy.cpp b/src/strategy/dungeons/wotlk/violethold/VioletHoldStrategy.cpp index 59f2225b52..5b610300f3 100644 --- a/src/strategy/dungeons/wotlk/violethold/VioletHoldStrategy.cpp +++ b/src/strategy/dungeons/wotlk/violethold/VioletHoldStrategy.cpp @@ -1,7 +1,6 @@ #include "VioletHoldStrategy.h" #include "VioletHoldMultipliers.h" - void WotlkDungeonVHStrategy::InitTriggers(std::vector &triggers) { // Erekem diff --git a/src/strategy/dungeons/wotlk/violethold/VioletHoldStrategy.h b/src/strategy/dungeons/wotlk/violethold/VioletHoldStrategy.h index 1670887100..a06f64ce39 100644 --- a/src/strategy/dungeons/wotlk/violethold/VioletHoldStrategy.h +++ b/src/strategy/dungeons/wotlk/violethold/VioletHoldStrategy.h @@ -5,7 +5,6 @@ #include "AiObjectContext.h" #include "Strategy.h" - class WotlkDungeonVHStrategy : public Strategy { public: diff --git a/src/strategy/dungeons/wotlk/violethold/VioletHoldTriggers.cpp b/src/strategy/dungeons/wotlk/violethold/VioletHoldTriggers.cpp index bd2eee765d..87284b0e49 100644 --- a/src/strategy/dungeons/wotlk/violethold/VioletHoldTriggers.cpp +++ b/src/strategy/dungeons/wotlk/violethold/VioletHoldTriggers.cpp @@ -3,7 +3,6 @@ #include "AiObject.h" #include "AiObjectContext.h" - bool ErekemTargetTrigger::IsActive() { Unit* boss = AI_VALUE2(Unit*, "find target", "erekem"); diff --git a/src/strategy/hunter/GenericHunterStrategy.h b/src/strategy/hunter/GenericHunterStrategy.h index 0fa9ed69ab..01aef4cecc 100644 --- a/src/strategy/hunter/GenericHunterStrategy.h +++ b/src/strategy/hunter/GenericHunterStrategy.h @@ -21,7 +21,6 @@ class GenericHunterStrategy : public CombatStrategy uint32 GetType() const override { return CombatStrategy::GetType() | STRATEGY_TYPE_RANGED | STRATEGY_TYPE_DPS; } }; - class AoEHunterStrategy : public CombatStrategy { public: @@ -58,5 +57,4 @@ class HunterTrapWeaveStrategy : public Strategy std::string const getName() override { return "trap weave"; } }; - #endif diff --git a/src/strategy/paladin/PaladinActions.cpp b/src/strategy/paladin/PaladinActions.cpp index 7dbf7c91ed..190ecb264a 100644 --- a/src/strategy/paladin/PaladinActions.cpp +++ b/src/strategy/paladin/PaladinActions.cpp @@ -250,7 +250,6 @@ bool CastBlessingOfWisdomOnPartyAction::Execute(Event event) return botAI->CastSpell(castName, target); } - Value* CastBlessingOfSanctuaryOnPartyAction::GetTargetValue() { return context->GetValue( @@ -488,7 +487,6 @@ Unit* CastRighteousDefenseAction::GetTarget() return current_target->GetVictim(); } - bool CastDivineSacrificeAction::isUseful() { return GetTarget() && (GetTarget() != nullptr) && CastSpellAction::isUseful() && diff --git a/src/strategy/priest/GenericPriestStrategy.cpp b/src/strategy/priest/GenericPriestStrategy.cpp index cbd838abdb..acf9d39d86 100644 --- a/src/strategy/priest/GenericPriestStrategy.cpp +++ b/src/strategy/priest/GenericPriestStrategy.cpp @@ -109,4 +109,3 @@ void PriestHealerDpsStrategy::InitTriggers(std::vector& triggers) new NextAction("mind sear", ACTION_DEFAULT + 0.5f), nullptr))); } - diff --git a/src/strategy/raids/aq20/RaidAq20Actions.cpp b/src/strategy/raids/aq20/RaidAq20Actions.cpp index 9b7e40652b..1bf33147f8 100644 --- a/src/strategy/raids/aq20/RaidAq20Actions.cpp +++ b/src/strategy/raids/aq20/RaidAq20Actions.cpp @@ -3,7 +3,6 @@ #include "Playerbots.h" #include "RaidAq20Utils.h" - bool Aq20UseCrystalAction::Execute(Event event) { if (Unit* boss = AI_VALUE2(Unit*, "find target", "ossirian the unscarred")) diff --git a/src/strategy/raids/aq20/RaidAq20Triggers.cpp b/src/strategy/raids/aq20/RaidAq20Triggers.cpp index fbda881a57..1a580d6bd3 100644 --- a/src/strategy/raids/aq20/RaidAq20Triggers.cpp +++ b/src/strategy/raids/aq20/RaidAq20Triggers.cpp @@ -3,7 +3,6 @@ #include "SharedDefines.h" #include "RaidAq20Utils.h" - bool Aq20MoveToCrystalTrigger::IsActive() { if (Unit* boss = AI_VALUE2(Unit*, "find target", "ossirian the unscarred")) diff --git a/src/strategy/raids/gruulslair/RaidGruulsLairHelpers.h b/src/strategy/raids/gruulslair/RaidGruulsLairHelpers.h index aa5a83acb0..8cd01c2e6b 100644 --- a/src/strategy/raids/gruulslair/RaidGruulsLairHelpers.h +++ b/src/strategy/raids/gruulslair/RaidGruulsLairHelpers.h @@ -6,57 +6,57 @@ namespace GruulsLairHelpers { - enum GruulsLairSpells - { - // High King Maulgar - SPELL_WHIRLWIND = 33238, - - // Krosh Firehand - SPELL_SPELL_SHIELD = 33054, - - // Hunter - SPELL_MISDIRECTION = 34477, - - // Warlock - SPELL_BANISH = 18647, // Rank 2 - - // Gruul the Dragonkiller - SPELL_GROUND_SLAM_1 = 33525, - SPELL_GROUND_SLAM_2 = 39187, - }; - - enum GruulsLairNPCs - { - NPC_WILD_FEL_STALKER = 18847, - }; - - bool IsAnyOgreBossAlive(PlayerbotAI* botAI); - void MarkTargetWithIcon(Player* bot, Unit* target, uint8 iconId); - void MarkTargetWithSquare(Player* bot, Unit* target); - void MarkTargetWithStar(Player* bot, Unit* target); - void MarkTargetWithCircle(Player* bot, Unit* target); - void MarkTargetWithDiamond(Player* bot, Unit* target); - void MarkTargetWithTriangle(Player* bot, Unit* target); - void SetRtiTarget(PlayerbotAI* botAI, const std::string& rtiName, Unit* target); - bool IsKroshMageTank(PlayerbotAI* botAI, Player* bot); - bool IsKigglerMoonkinTank(PlayerbotAI* botAI, Player* bot); - bool IsPositionSafe(PlayerbotAI* botAI, Player* bot, Position pos); - bool TryGetNewSafePosition(PlayerbotAI* botAI, Player* bot, Position& outPos); - - struct Location - { - float x, y, z; - }; - - namespace GruulsLairLocations - { - extern const Location MaulgarTankPosition; - extern const Location OlmTankPosition; - extern const Location BlindeyeTankPosition; - extern const Location KroshTankPosition; - extern const Location MaulgarRoomCenter; - extern const Location GruulTankPosition; - } + enum GruulsLairSpells + { + // High King Maulgar + SPELL_WHIRLWIND = 33238, + + // Krosh Firehand + SPELL_SPELL_SHIELD = 33054, + + // Hunter + SPELL_MISDIRECTION = 34477, + + // Warlock + SPELL_BANISH = 18647, // Rank 2 + + // Gruul the Dragonkiller + SPELL_GROUND_SLAM_1 = 33525, + SPELL_GROUND_SLAM_2 = 39187, + }; + + enum GruulsLairNPCs + { + NPC_WILD_FEL_STALKER = 18847, + }; + + bool IsAnyOgreBossAlive(PlayerbotAI* botAI); + void MarkTargetWithIcon(Player* bot, Unit* target, uint8 iconId); + void MarkTargetWithSquare(Player* bot, Unit* target); + void MarkTargetWithStar(Player* bot, Unit* target); + void MarkTargetWithCircle(Player* bot, Unit* target); + void MarkTargetWithDiamond(Player* bot, Unit* target); + void MarkTargetWithTriangle(Player* bot, Unit* target); + void SetRtiTarget(PlayerbotAI* botAI, const std::string& rtiName, Unit* target); + bool IsKroshMageTank(PlayerbotAI* botAI, Player* bot); + bool IsKigglerMoonkinTank(PlayerbotAI* botAI, Player* bot); + bool IsPositionSafe(PlayerbotAI* botAI, Player* bot, Position pos); + bool TryGetNewSafePosition(PlayerbotAI* botAI, Player* bot, Position& outPos); + + struct Location + { + float x, y, z; + }; + + namespace GruulsLairLocations + { + extern const Location MaulgarTankPosition; + extern const Location OlmTankPosition; + extern const Location BlindeyeTankPosition; + extern const Location KroshTankPosition; + extern const Location MaulgarRoomCenter; + extern const Location GruulTankPosition; + } } #endif diff --git a/src/strategy/raids/icecrown/RaidIccActions.cpp b/src/strategy/raids/icecrown/RaidIccActions.cpp index a1b7100f8b..4f763ecb95 100644 --- a/src/strategy/raids/icecrown/RaidIccActions.cpp +++ b/src/strategy/raids/icecrown/RaidIccActions.cpp @@ -116,7 +116,7 @@ bool IccSpikeAction::HandleSpikeTargeting(Unit* boss) // First check for alive spikes for (const auto entry : spikeEntries) { - for (const auto& guid : spikes) + for (auto const& guid : spikes) { if (Unit* unit = botAI->GetUnit(guid)) { @@ -238,7 +238,7 @@ bool IccRangedPositionLadyDeathwhisperAction::MaintainRangedSpacing() float totalY = 0.0f; int nearbyCount = 0; - for (const auto& memberGuid : members) + for (auto const& memberGuid : members) { Unit* member = botAI->GetUnit(memberGuid); if (!member || !member->IsAlive() || member == bot) @@ -340,7 +340,7 @@ bool IccAddsLadyDeathwhisperAction::Execute(Event event) bool IccAddsLadyDeathwhisperAction::IsTargetedByShade(uint32 shadeEntry) { const GuidVector npcs = AI_VALUE(GuidVector, "nearest hostile npcs"); - for (const auto& npcGuid : npcs) + for (auto const& npcGuid : npcs) { Unit* unit = botAI->GetUnit(npcGuid); if (unit && unit->GetEntry() == shadeEntry && unit->GetVictim() == bot) @@ -376,9 +376,9 @@ bool IccAddsLadyDeathwhisperAction::HandleAddTargeting(Unit* boss) bool hasValidAdds = false; // First check for alive adds - for (const auto& entry : addEntriesLady) + for (auto const& entry : addEntriesLady) { - for (const auto& guid : targets) + for (auto const& guid : targets) { Unit* unit = botAI->GetUnit(guid); if (unit && unit->IsAlive() && unit->GetEntry() == entry) @@ -427,7 +427,7 @@ bool IccShadeLadyDeathwhisperAction::Execute(Event event) // Get the nearest hostile NPCs const GuidVector npcs = AI_VALUE(GuidVector, "nearest hostile npcs"); - for (const auto& npcGuid : npcs) + for (auto const& npcGuid : npcs) { Unit* shade = botAI->GetUnit(npcGuid); @@ -506,7 +506,7 @@ bool IccRottingFrostGiantTankPositionAction::Execute(Event event) std::map targetCounts; // First, identify all infected bots and their current targets (approximate) - for (const auto& memberGuid : members) + for (auto const& memberGuid : members) { Unit* member = botAI->GetUnit(memberGuid); if (!member || !member->IsAlive() || member == bot) @@ -520,7 +520,7 @@ bool IccRottingFrostGiantTankPositionAction::Execute(Event event) float minDist = 5.0f; // Only count if they're close enough to likely be targeting Unit* likelyTarget = nullptr; - for (const auto& targetGuid : members) + for (auto const& targetGuid : members) { Unit* potentialTarget = botAI->GetUnit(targetGuid); if (!potentialTarget || !potentialTarget->IsAlive() || potentialTarget == member) @@ -551,7 +551,7 @@ bool IccRottingFrostGiantTankPositionAction::Execute(Event event) std::vector> viableTargets; // First try to find ranged, non-infected, non-cured bots - for (const auto& memberGuid : members) + for (auto const& memberGuid : members) { Unit* member = botAI->GetUnit(memberGuid); if (!member || !member->IsAlive() || member == bot) @@ -630,7 +630,7 @@ bool IccRottingFrostGiantTankPositionAction::Execute(Event event) float totalY = 0.0f; int nearbyCount = 0; - for (const auto& memberGuid : members) + for (auto const& memberGuid : members) { Unit* member = botAI->GetUnit(memberGuid); if (!member || !member->IsAlive() || member == bot) @@ -726,7 +726,7 @@ Unit* IccCannonFireAction::FindValidCannonTarget() { const GuidVector attackers = AI_VALUE(GuidVector, "possible targets no los"); - for (const auto& attackerGuid : attackers) + for (auto const& attackerGuid : attackers) { Unit* unit = botAI->GetUnit(attackerGuid); if (!unit) @@ -774,7 +774,7 @@ Unit* IccGunshipEnterCannonAction::FindBestAvailableCannon() Unit* bestVehicle = nullptr; const GuidVector npcs = AI_VALUE(GuidVector, "nearest vehicles"); - for (const auto& npcGuid : npcs) + for (auto const& npcGuid : npcs) { Unit* vehicleBase = botAI->GetUnit(npcGuid); if (!IsValidCannon(vehicleBase, validCannonEntries)) @@ -1006,8 +1006,6 @@ bool IccDbsTankPositionAction::Execute(Event event) ICC_DBS_TANK_POSITION.GetPositionZ(), false, false, false, true, MovementPriority::MOVEMENT_NORMAL); - - // Early return if this tank has Rune of Blood if (botAI->GetAura("Rune of Blood", bot)) return true; @@ -1041,7 +1039,7 @@ bool IccDbsTankPositionAction::CrowdControlBloodBeasts() bool appliedCC = false; - for (const auto& npc : npcs) + for (auto const& npc : npcs) { Unit* unit = botAI->GetUnit(npc); if (!unit || !unit->IsAlive()) @@ -1143,7 +1141,7 @@ bool IccDbsTankPositionAction::EvadeBloodBeasts() // Get the nearest hostile NPCs const GuidVector npcs = AI_VALUE(GuidVector, "nearest hostile npcs"); - for (const auto& npc : npcs) + for (auto const& npc : npcs) { Unit* unit = botAI->GetUnit(npc); if (!unit) @@ -1326,7 +1324,7 @@ bool IccFestergutGroupPositionAction::HasSporesInGroup() { const GuidVector members = AI_VALUE(GuidVector, "group members"); - for (const auto& memberGuid : members) + for (auto const& memberGuid : members) { Unit* unit = botAI->GetUnit(memberGuid); if (unit && unit->HasAura(SPELL_GAS_SPORE)) @@ -1564,7 +1562,7 @@ IccFestergutSporeAction::SporeInfo IccFestergutSporeAction::FindSporedPlayers() SporeInfo info; const GuidVector members = AI_VALUE(GuidVector, "group members"); - for (const auto& memberGuid : members) + for (auto const& memberGuid : members) { Unit* unit = botAI->GetUnit(memberGuid); if (!unit) @@ -1612,7 +1610,7 @@ bool IccFestergutSporeAction::CheckMainTankSpore() { const GuidVector members = AI_VALUE(GuidVector, "group members"); - for (const auto& memberGuid : members) + for (auto const& memberGuid : members) { Unit* unit = botAI->GetUnit(memberGuid); if (!unit) @@ -1702,14 +1700,13 @@ bool IccRotfaceTankPositionAction::HandleAssistTankPositioning(Unit* boss) return HandleBigOozePositioning(boss); } - bool IccRotfaceTankPositionAction::HandleBigOozePositioning(Unit* boss) { // Find all big oozes GuidVector bigOozes = AI_VALUE(GuidVector, "nearest hostile npcs"); std::vector activeBigOozes; - for (const auto& guid : bigOozes) + for (auto const& guid : bigOozes) { Unit* unit = botAI->GetUnit(guid); if (unit && unit->IsAlive() && unit->GetEntry() == NPC_BIG_OOZE && unit->IsVisible()) @@ -1799,7 +1796,7 @@ bool IccRotfaceTankPositionAction::HandleBigOozePositioning(Unit* boss) GuidVector puddles = AI_VALUE(GuidVector, "nearest hostile npcs"); bool isSafeFromPuddles = true; - for (const auto& puddleGuid : puddles) + for (auto const& puddleGuid : puddles) { Unit* puddle = botAI->GetUnit(puddleGuid); if (puddle && botAI->GetAura("Ooze Flood", puddle)) @@ -1827,7 +1824,6 @@ bool IccRotfaceTankPositionAction::HandleBigOozePositioning(Unit* boss) return false; } - bool IccRotfaceGroupPositionAction::Execute(Event event) { Unit* boss = AI_VALUE2(Unit*, "find target", "rotface"); @@ -1837,7 +1833,7 @@ bool IccRotfaceGroupPositionAction::Execute(Event event) const GuidVector npcs = AI_VALUE(GuidVector, "nearest hostile npcs"); bool floodPresent = false; - for (const auto& npc : npcs) + for (auto const& npc : npcs) { Unit* unit = botAI->GetUnit(npc); if (!unit || !botAI->HasAura("Ooze Flood", unit)) @@ -1876,7 +1872,7 @@ bool IccRotfaceGroupPositionAction::HandlePuddleAvoidance(Unit* boss) { const GuidVector npcs = AI_VALUE(GuidVector, "nearest hostile npcs"); - for (const auto& npc : npcs) + for (auto const& npc : npcs) { Unit* unit = botAI->GetUnit(npc); if (!unit || !botAI->HasAura("Ooze Flood", unit)) @@ -2062,7 +2058,7 @@ bool IccRotfaceGroupPositionAction::FindAndMoveFromClosestMember(Unit* boss, Uni const GuidVector npcs = AI_VALUE(GuidVector, "nearest hostile npcs"); Unit* puddle = nullptr; - for (const auto& npc : npcs) + for (auto const& npc : npcs) { Unit* unit = botAI->GetUnit(npc); if (!unit || !botAI->HasAura("Ooze Flood", unit)) @@ -2087,11 +2083,11 @@ bool IccRotfaceGroupPositionAction::FindAndMoveFromClosestMember(Unit* boss, Uni float totalY = 0.0f; int nearbyCount = 0; - for (const auto& memberGuid : members) + for (auto const& memberGuid : members) { Unit* member = botAI->GetUnit(memberGuid); if (!member || !member->IsAlive() || member == bot || (smallOoze && smallOoze->GetVictim() == member) || - (member->GetTypeId() == TYPEID_PLAYER && botAI->IsAssistTank(static_cast(member)))) + (member->IsPlayer() && botAI->IsAssistTank(static_cast(member)))) continue; const float distance = bot->GetExactDist2d(member); @@ -2202,7 +2198,7 @@ bool IccRotfaceMoveAwayFromExplosionAction::MoveToRandomSafeLocation() // Ensure the position is at least 30 yards away from any puddle const GuidVector npcs = AI_VALUE(GuidVector, "nearest hostile npcs"); - for (const auto& npc : npcs) + for (auto const& npc : npcs) { Unit* puddle = botAI->GetUnit(npc); if (!puddle || !botAI->HasAura("Ooze Flood", puddle)) @@ -2287,7 +2283,7 @@ Unit* IccPutricideGrowingOozePuddleAction::FindClosestThreateningPuddle() float closestDistance = FLT_MAX; float closestSafeDistance = BASE_RADIUS; - for (const auto& npc : npcs) + for (auto const& npc : npcs) { Unit* unit = botAI->GetUnit(npc); if (!unit || unit->GetEntry() != NPC_GROWING_OOZE_PUDDLE) @@ -2402,7 +2398,7 @@ bool IccPutricideGrowingOozePuddleAction::IsPositionTooCloseToOtherPuddles(float static const float STACK_MULTIPLIER = 0.6f; GuidVector npcs = AI_VALUE(GuidVector, "nearest hostile npcs"); - for (const auto& npc : npcs) + for (auto const& npc : npcs) { Unit* unit = botAI->GetUnit(npc); if (!unit || unit == ignorePuddle || unit->GetEntry() != NPC_GROWING_OOZE_PUDDLE) @@ -2445,7 +2441,7 @@ bool IccPutricideVolatileOozeAction::Execute(Event event) // Find all alive oozes std::vector aliveOozes; const GuidVector npcs = AI_VALUE(GuidVector, "nearest hostile npcs"); - for (const auto& guid : npcs) + for (auto const& guid : npcs) { Unit* unit = botAI->GetUnit(guid); if (unit && unit->IsAlive() && unit->GetEntry() == ooze->GetEntry()) @@ -2533,7 +2529,6 @@ Unit* IccPutricideVolatileOozeAction::FindAuraTarget() return nullptr; } - bool IccPutricideGasCloudAction::Execute(Event event) { Unit* gasCloud = AI_VALUE2(Unit*, "find target", "gas cloud"); @@ -2560,7 +2555,7 @@ bool IccPutricideGasCloudAction::Execute(Event event) // Find all alive gasCloud std::vector aliveGasCloud; const GuidVector npcs = AI_VALUE(GuidVector, "nearest hostile npcs"); - for (const auto& guid : npcs) + for (auto const& guid : npcs) { Unit* unit = botAI->GetUnit(guid); if (unit && unit->IsAlive() && unit->GetEntry() == gasCloud->GetEntry()) @@ -2613,7 +2608,7 @@ bool IccPutricideGasCloudAction::HandleGaseousBloatMovement(Unit* gasCloud) // Gather all choking gas bombs GuidVector npcs = AI_VALUE(GuidVector, "nearest hostile npcs"); std::vector gasBombs; - for (const auto& guid : npcs) + for (auto const& guid : npcs) { Unit* unit = botAI->GetUnit(guid); if (unit && unit->IsAlive() && unit->GetEntry() == NPC_CHOKING_GAS_BOMB) @@ -3048,7 +3043,6 @@ bool IccPutricideAvoidMalleableGooAction::HandleUnboundPlague(Unit* boss) return false; } - bool IccPutricideAvoidMalleableGooAction::HandleBossPositioning(Unit* boss) { if (botAI->IsTank(bot)) @@ -3128,7 +3122,7 @@ Position IccPutricideAvoidMalleableGooAction::CalculateBossPosition(Unit* boss, bool IccPutricideAvoidMalleableGooAction::HasObstacleBetween(const Position& from, const Position& to) { GuidVector npcs = AI_VALUE(GuidVector, "nearest hostile npcs"); - for (const auto& npc : npcs) + for (auto const& npc : npcs) { Unit* unit = botAI->GetUnit(npc); if (!unit || !unit->IsAlive()) @@ -3261,7 +3255,7 @@ bool IccBpcKelesethTankAction::Execute(Event event) if (boss->GetVictim() == bot) { GuidVector targets = AI_VALUE(GuidVector, "possible targets"); - for (const auto& targetGuid : targets) + for (auto const& targetGuid : targets) { Unit* nucleus = botAI->GetUnit(targetGuid); if (nucleus && nucleus->IsAlive() && nucleus->GetEntry() == NPC_DARK_NUCLEUS) @@ -3392,7 +3386,7 @@ void IccBpcMainTankAction::MarkEmpoweredPrince() Unit* empoweredPrince = nullptr; const GuidVector& targets = AI_VALUE(GuidVector, "possible targets"); - for (const auto& targetGuid : targets) + for (auto const& targetGuid : targets) { Unit* unit = botAI->GetUnit(targetGuid); if (!unit || !unit->IsAlive()) @@ -3478,7 +3472,7 @@ bool IccBpcEmpoweredVortexAction::MaintainRangedSpacing() float totalY = 0.0f; int nearbyCount = 0; - for (const auto& memberGuid : members) + for (auto const& memberGuid : members) { Unit* member = botAI->GetUnit(memberGuid); if (!member || !member->IsAlive() || member == bot) @@ -3557,7 +3551,7 @@ bool IccBpcEmpoweredVortexAction::HandleEmpoweredVortexSpread() float totalY = 0.0f; int nearbyCount = 0; - for (const auto& memberGuid : members) + for (auto const& memberGuid : members) { Unit* member = botAI->GetUnit(memberGuid); if (!member || !member->IsAlive() || member == bot) @@ -3676,7 +3670,7 @@ Unit* IccBpcKineticBombAction::FindOptimalKineticBomb() // Gather all valid kinetic bombs std::vector kineticBombs; - for (const auto& guid : targets) + for (auto const& guid : targets) { Unit* unit = botAI->GetUnit(guid); if (!unit || !unit->IsAlive()) @@ -3764,7 +3758,6 @@ bool IccBpcKineticBombAction::IsBombAlreadyHandled(Unit* bomb, Group* group) return false; } - bool IccBpcBallOfFlameAction::Execute(Event event) { Unit* boss = AI_VALUE2(Unit*, "find target", "prince taldaram"); @@ -3814,7 +3807,7 @@ bool IccBpcBallOfFlameAction::Execute(Event event) { const float SAFE_DIST = 15.0f; GuidVector members = AI_VALUE(GuidVector, "group members"); - for (const auto& memberGuid : members) + for (auto const& memberGuid : members) { Unit* member = botAI->GetUnit(memberGuid); if (!member || !member->IsAlive() || member == bot) @@ -4341,7 +4334,7 @@ bool IccBqlGroupPositionAction::HandleGroupPosition(Unit* boss, Aura* frenzyAura // Gather all ranged and healers, sort by GUID for deterministic assignment std::vector rangedBots; std::vector healers; - for (const auto& guid : members) + for (auto const& guid : members) { Unit* member = botAI->GetUnit(guid); if (!member || !member->IsAlive()) @@ -4457,7 +4450,7 @@ bool IccBqlGroupPositionAction::HandleGroupPosition(Unit* boss, Aura* frenzyAura } // Also spread from swarming shadows GuidVector npcs = AI_VALUE(GuidVector, "nearest hostile npcs"); - for (const auto& npcGuid : npcs) + for (auto const& npcGuid : npcs) { Unit* unit = botAI->GetUnit(npcGuid); if (unit && unit->IsAlive() && unit->GetEntry() == NPC_SWARMING_SHADOWS) @@ -4605,7 +4598,6 @@ bool IccBqlGroupPositionAction::HandleGroupPosition(Unit* boss, Aura* frenzyAura return true; } - return false; } @@ -4798,7 +4790,7 @@ Player* IccBqlVampiricBiteAction::FindBestBiteTarget(Group* group) } // Sort by distance - auto sortByDistance = [](const auto& a, const auto& b) { return a.second < b.second; }; + auto sortByDistance = [](auto const& a, auto const& b) { return a.second < b.second; }; std::sort(dpsTargets.begin(), dpsTargets.end(), sortByDistance); std::sort(healTargets.begin(), healTargets.end(), sortByDistance); @@ -4955,7 +4947,7 @@ bool IccValithriaGroupAction::Execute(Event event) // Tank behavior if (botAI->IsTank(bot)) { - for (const auto& targetGuid : AI_VALUE(GuidVector, "possible targets")) + for (auto const& targetGuid : AI_VALUE(GuidVector, "possible targets")) { if (Unit* unit = botAI->GetUnit(targetGuid)) { @@ -4965,7 +4957,7 @@ bool IccValithriaGroupAction::Execute(Event event) // Skip if unit is already attacking any tank if (Unit* victim = unit->GetVictim()) { - if (victim->GetTypeId() == TYPEID_PLAYER && botAI->IsTank(static_cast(victim))) + if (victim->IsPlayer() && botAI->IsTank(static_cast(victim))) { continue; } @@ -5133,7 +5125,7 @@ bool IccValithriaGroupAction::Handle25ManGroupLogic() } // Sort by GUID for consistent ordering - std::sort(nonHeals.begin(), nonHeals.end(), [](const auto& a, const auto& b) { return a.first < b.first; }); + std::sort(nonHeals.begin(), nonHeals.end(), [](auto const& a, auto const& b) { return a.first < b.first; }); // Assign to groups std::vector group1, group2; @@ -5168,7 +5160,6 @@ bool IccValithriaGroupAction::Handle25ManGroupLogic() if (botAI->IsTank(bot) || botAI->IsDps(bot)) HandleMarkingLogic(inGroup1, inGroup2, group1Pos, group2Pos); - // Movement logic for non-healers if (!botAI->IsHeal(bot)) { @@ -5230,7 +5221,7 @@ bool IccValithriaGroupAction::HandleMarkingLogic(bool inGroup1, bool inGroup2, c for (uint32 entry : addPriority) { - for (const auto& guid : adds) + for (auto const& guid : adds) { if (Unit* unit = botAI->GetUnit(guid)) { @@ -5291,7 +5282,7 @@ bool IccValithriaGroupAction::Handle10ManGroupLogic() for (uint32 entry : addPriority) { - for (const auto& guid : adds) + for (auto const& guid : adds) { if (Unit* unit = botAI->GetUnit(guid)) { @@ -5337,7 +5328,7 @@ bool IccValithriaPortalAction::Execute(Event event) GuidVector npcs = AI_VALUE(GuidVector, "nearest npcs"); std::vector preEffectPortals; std::vector realPortals; - for (const auto& guid : npcs) + for (auto const& guid : npcs) { Creature* c = dynamic_cast(botAI->GetUnit(guid)); if (!c) @@ -5564,7 +5555,7 @@ bool IccValithriaDreamCloudAction::Execute(Event event) // Gather all group members with dream state const GuidVector members = AI_VALUE(GuidVector, "group members"); std::vector dreamBots; - for (const auto& guid : members) + for (auto const& guid : members) { Unit* member = botAI->GetUnit(guid); if (member && member->IsAlive() && member->HasAura(SPELL_DREAM_STATE)) @@ -5615,7 +5606,6 @@ bool IccValithriaDreamCloudAction::Execute(Event event) } } - // All stacked: leader (lowest guid) moves to next cloud, others follow and stack at leader's new position // Find all dream and nightmare clouds GuidVector npcs = AI_VALUE(GuidVector, "nearest hostile npcs"); @@ -5997,7 +5987,7 @@ bool IccSindragosaGroupPositionAction::HandleNonTankPositioning() for (const auto entry : tombEntries) { - for (const auto& guid : tombGuids) + for (auto const& guid : tombGuids) { if (Unit* unit = botAI->GetUnit(guid)) { @@ -6160,7 +6150,7 @@ void IccSindragosaFrostBeaconAction::HandleSupportActions() if (botAI->IsHeal(bot) && !bot->HasAura(FROST_BEACON_AURA_ID)) { const auto members = AI_VALUE(GuidVector, "group members"); - for (const auto& memberGuid : members) + for (auto const& memberGuid : members) { Unit* member = botAI->GetUnit(memberGuid); if (!member || !member->IsAlive() || !member->HasAura(FROST_BEACON_AURA_ID)) @@ -6266,7 +6256,7 @@ bool IccSindragosaFrostBeaconAction::HandleNonBeaconedPlayer(const Unit* boss) // Collect beaconed players std::vector beaconedPlayers; const auto members = AI_VALUE(GuidVector, "group members"); - for (const auto& memberGuid : members) + for (auto const& memberGuid : members) { Unit* player = botAI->GetUnit(memberGuid); if (player && player->GetGUID() != bot->GetGUID() && player->HasAura(FROST_BEACON_AURA_ID)) @@ -6474,7 +6464,7 @@ bool IccSindragosaMysticBuffetAction::Execute(Event event) for (const auto entry : tombEntries) { - for (const auto& guid : tombGuids) + for (auto const& guid : tombGuids) { if (Unit* unit = botAI->GetUnit(guid)) { @@ -6518,7 +6508,6 @@ bool IccSindragosaMysticBuffetAction::Execute(Event event) return true; } - botAI->Reset(); // Move to LOS2 position return MoveTo(bot->GetMapId(), ICC_SINDRAGOSA_LOS2_POSITION.GetPositionX(), @@ -8062,7 +8051,7 @@ bool IccLichKingAddsAction::HandleSpiritBombAvoidance(Difficulty diff, Unit* ter float minDistAtPos = std::numeric_limits::max(); int bombCountInVicinity = 0; - for (const auto& bombPair : spiritBombs) + for (auto const& bombPair : spiritBombs) { Unit* bomb = bombPair.second; if (!bomb || !bomb->IsAlive()) @@ -8166,7 +8155,7 @@ void IccLichKingAddsAction::HandleSpiritMarkingAndTargeting(Difficulty diff, Uni if (currentMarkedTarget && currentMarkedTarget->IsAlive()) { Unit* spiritTarget = currentMarkedTarget->GetVictim(); - if (spiritTarget && spiritTarget->GetTypeId() == TYPEID_PLAYER) + if (spiritTarget && spiritTarget->IsPlayer()) { if (Group* spiritTargetGroup = spiritTarget->ToPlayer()->GetGroup()) { @@ -8206,7 +8195,7 @@ void IccLichKingAddsAction::HandleSpiritMarkingAndTargeting(Difficulty diff, Uni // Check if this spirit is targeting a group member bool targetingGroupMember = false; Unit* spiritTarget = unit->GetVictim(); - if (spiritTarget && spiritTarget->GetTypeId() == TYPEID_PLAYER) + if (spiritTarget && spiritTarget->IsPlayer()) { if (Group* spiritTargetGroup = spiritTarget->ToPlayer()->GetGroup()) { @@ -9347,4 +9336,3 @@ void IccLichKingAddsAction::HandleVileSpiritMechanics() } } } - diff --git a/src/strategy/raids/icecrown/RaidIccActions.h b/src/strategy/raids/icecrown/RaidIccActions.h index 17cab50424..9ac2a48a04 100644 --- a/src/strategy/raids/icecrown/RaidIccActions.h +++ b/src/strategy/raids/icecrown/RaidIccActions.h @@ -311,8 +311,6 @@ class IccPutricideGrowingOozePuddleAction : public AttackAction Unit* FindClosestThreateningPuddle(); Position CalculateSafeMovePosition(Unit* closestPuddle); bool IsPositionTooCloseToOtherPuddles(float x, float y, Unit* ignorePuddle); - - }; class IccPutricideVolatileOozeAction : public AttackAction @@ -599,7 +597,6 @@ class IccSindragosaTankSwapPositionAction : public AttackAction bool Execute(Event event) override; }; - //LK class IccLichKingShadowTrapAction : public MovementAction { @@ -633,7 +630,6 @@ class IccLichKingWinterAction : public AttackAction void HandleMainTankAddManagement(Unit* boss, const Position* tankPos); void HandleAssistTankAddManagement(Unit* boss, const Position* tankPos); - private: const Position* GetMainTankPosition(); const Position* GetMainTankRangedPosition(); @@ -670,6 +666,4 @@ class IccLichKingAddsAction : public AttackAction void HandleVileSpiritMechanics(); }; - - #endif diff --git a/src/strategy/raids/icecrown/RaidIccMultipliers.cpp b/src/strategy/raids/icecrown/RaidIccMultipliers.cpp index 8c71110305..fc02d56bea 100644 --- a/src/strategy/raids/icecrown/RaidIccMultipliers.cpp +++ b/src/strategy/raids/icecrown/RaidIccMultipliers.cpp @@ -51,7 +51,7 @@ float IccLadyDeathwhisperMultiplier::GetValue(Action* action) if (dynamic_cast(action)) return 1.0f; - for (const auto& npcGuid : npcs) + for (auto const& npcGuid : npcs) { Unit* shade = botAI->GetUnit(npcGuid); @@ -156,7 +156,6 @@ float IccFestergutMultiplier::GetValue(Action* action) if (bot->HasAura(SPELL_GAS_SPORE)) return 0.0f; - return 1.0f; } @@ -375,7 +374,7 @@ float IccBpcAssistMultiplier::GetValue(Action* action) for (const auto entry : bombEntries) { - for (const auto& guid : bombs) + for (auto const& guid : bombs) { if (Unit* unit = botAI->GetUnit(guid)) { @@ -491,7 +490,6 @@ float IccValithriaDreamCloudMultiplier::GetValue(Action* action) Aura* twistedNightmares = botAI->GetAura("Twisted Nightmares", bot); Aura* emeraldVigor = botAI->GetAura("Emerald Vigor", bot); - if (!boss && !bot->HasAura(SPELL_DREAM_STATE)) return 1.0f; diff --git a/src/strategy/raids/icecrown/RaidIccMultipliers.h b/src/strategy/raids/icecrown/RaidIccMultipliers.h index 8eb1f6f14a..69d1ac51ba 100644 --- a/src/strategy/raids/icecrown/RaidIccMultipliers.h +++ b/src/strategy/raids/icecrown/RaidIccMultipliers.h @@ -99,5 +99,4 @@ class IccLichKingAddsMultiplier : public Multiplier virtual float GetValue(Action* action); }; - #endif diff --git a/src/strategy/raids/icecrown/RaidIccStrategy.cpp b/src/strategy/raids/icecrown/RaidIccStrategy.cpp index 6bdb0e6bcf..1acf1e7884 100644 --- a/src/strategy/raids/icecrown/RaidIccStrategy.cpp +++ b/src/strategy/raids/icecrown/RaidIccStrategy.cpp @@ -115,7 +115,6 @@ void RaidIccStrategy::InitTriggers(std::vector& triggers) triggers.push_back(new TriggerNode("icc sister svalna", NextAction::array(0, new NextAction("icc sister svalna", ACTION_RAID + 5), nullptr))); - //VDW triggers.push_back(new TriggerNode("icc valithria group", NextAction::array(0, new NextAction("icc valithria group", ACTION_RAID + 1), nullptr))); diff --git a/src/strategy/raids/icecrown/RaidIccTriggers.cpp b/src/strategy/raids/icecrown/RaidIccTriggers.cpp index 7ea7e845fc..44a2008b1b 100644 --- a/src/strategy/raids/icecrown/RaidIccTriggers.cpp +++ b/src/strategy/raids/icecrown/RaidIccTriggers.cpp @@ -299,7 +299,7 @@ bool IccPutricideGrowingOozePuddleTrigger::IsActive() } const GuidVector& npcs = AI_VALUE(GuidVector, "nearest hostile npcs"); - for (const auto& npc : npcs) + for (auto const& npc : npcs) { if (Unit* unit = botAI->GetUnit(npc)) { @@ -477,7 +477,7 @@ bool IccBpcKineticBombTrigger::IsActive() for (const auto entry : bombEntries) { - for (const auto& guid : bombs) + for (auto const& guid : bombs) { if (Unit* unit = botAI->GetUnit(guid)) { diff --git a/src/strategy/raids/icecrown/RaidIccTriggers.h b/src/strategy/raids/icecrown/RaidIccTriggers.h index e51f62adc7..cd332e0046 100644 --- a/src/strategy/raids/icecrown/RaidIccTriggers.h +++ b/src/strategy/raids/icecrown/RaidIccTriggers.h @@ -336,7 +336,6 @@ class IccRotfaceGroupPositionTrigger : public Trigger bool IsActive() override; }; - class IccRotfaceMoveAwayFromExplosionTrigger : public Trigger { public: @@ -359,7 +358,6 @@ class IccPutricideGasCloudTrigger : public Trigger bool IsActive() override; }; - class IccPutricideGrowingOozePuddleTrigger : public Trigger { public: @@ -454,7 +452,6 @@ class IccSisterSvalnaTrigger : public Trigger bool IsActive() override; }; - // Valithria Dreamwalker class IccValithriaGroupTrigger : public Trigger @@ -485,7 +482,6 @@ class IccValithriaDreamCloudTrigger : public Trigger bool IsActive() override; }; - //SINDRAGOSA class IccSindragosaGroupPositionTrigger : public Trigger { @@ -550,7 +546,6 @@ class IccSindragosaFrostBombTrigger : public Trigger bool IsActive() override; }; - //LICH KING class IccLichKingShadowTrapTrigger : public Trigger { diff --git a/src/strategy/raids/karazhan/RaidKarazhanActions.cpp b/src/strategy/raids/karazhan/RaidKarazhanActions.cpp index 8ec3ea9143..e45d63f7b2 100644 --- a/src/strategy/raids/karazhan/RaidKarazhanActions.cpp +++ b/src/strategy/raids/karazhan/RaidKarazhanActions.cpp @@ -7,7 +7,7 @@ #include "Playerbots.h" #include "Position.h" -namespace +namespace { // Big Bad Wolf static int currentIndex = 0; @@ -131,7 +131,7 @@ bool KarazhanMaidenOfVirtuePositionRangedAction::Execute(Event event) const GuidVector members = AI_VALUE(GuidVector, "group members"); - for (const auto& memberGuid : members) + for (auto const& memberGuid : members) { Unit* member = botAI->GetUnit(memberGuid); @@ -205,7 +205,7 @@ bool KarazhanBigBadWolfPositionBossAction::isUseful() { Unit* boss = AI_VALUE2(Unit*, "find target", "the big bad wolf"); - return boss && botAI->IsTank(bot) && botAI->HasAggro(boss) && boss->GetVictim() == bot && + return boss && botAI->IsTank(bot) && botAI->HasAggro(boss) && boss->GetVictim() == bot && !bot->HasAura(SPELL_LITTLE_RED_RIDING_HOOD); } @@ -369,16 +369,16 @@ bool KarazhanTerestianIllhoofMarkTargetAction::Execute(Event event) RaidKarazhanHelpers karazhanHelper(botAI); Unit* target = karazhanHelper.GetFirstAliveUnitByEntry(NPC_DEMON_CHAINS); - if (!target || !target->IsAlive()) + if (!target || !target->IsAlive()) { target = karazhanHelper.GetFirstAliveUnitByEntry(NPC_KILREK); - if (!target || !target->IsAlive()) + if (!target || !target->IsAlive()) { target = boss; } } karazhanHelper.MarkTargetWithSkull(target); - + return false; } @@ -420,7 +420,7 @@ bool KarazhanShadeOfAranFlameWreathStopMovementAction::Execute(Event event) } return true; } - + return false; } @@ -430,7 +430,7 @@ bool KarazhanShadeOfAranMarkConjuredElementalAction::Execute(Event event) Unit* boss = AI_VALUE2(Unit*, "find target", "shade of aran"); Unit* target = karazhanHelper.GetFirstAliveUnitByEntry(NPC_CONJURED_ELEMENTAL); - if (!boss || !boss->IsAlive() || + if (!boss || !boss->IsAlive() || !target || !target->IsAlive() || target->HasAura(SPELL_WARLOCK_BANISH)) { return false; @@ -522,12 +522,12 @@ bool KarazhanNetherspiteBlockRedBeamAction::Execute(Event event) lastBeamMoveSideways[botGuid] = !lastBeamMoveSideways[botGuid]; beamMoveTimes[botGuid] = time(nullptr); } - if (!lastBeamMoveSideways[botGuid]) + if (!lastBeamMoveSideways[botGuid]) { - return MoveTo(bot->GetMapId(), beamPos.GetPositionX(), beamPos.GetPositionY(), beamPos.GetPositionZ(), + return MoveTo(bot->GetMapId(), beamPos.GetPositionX(), beamPos.GetPositionY(), beamPos.GetPositionZ(), false, false, false, true, MovementPriority::MOVEMENT_FORCED); - } - else + } + else { float bx = boss->GetPositionX(); float by = boss->GetPositionY(); @@ -549,7 +549,7 @@ bool KarazhanNetherspiteBlockRedBeamAction::Execute(Event event) float sideY = beamPos.GetPositionY() + perpDy * 3.0f; float sideZ = beamPos.GetPositionZ(); - return MoveTo(bot->GetMapId(), sideX, sideY, sideZ, false, false, false, true, + return MoveTo(bot->GetMapId(), sideX, sideY, sideZ, false, false, false, true, MovementPriority::MOVEMENT_FORCED); } } @@ -602,7 +602,7 @@ bool KarazhanNetherspiteBlockBlueBeamAction::Execute(Event event) "netherspite_beam_leaving_blue", "%player is leaving the blue beam--next blocker up!", ph); bot->Yell(text, LANG_UNIVERSAL); wasBlockingBlueBeam[botGuid] = false; - + return false; } @@ -637,17 +637,17 @@ bool KarazhanNetherspiteBlockBlueBeamAction::Execute(Event event) float bestDist = 150.0f; Position bestPos; bool found = false; - for (float dist = 18.0f; dist <= 30.0f; dist += 0.5f) + for (float dist = 18.0f; dist <= 30.0f; dist += 0.5f) { float candidateX = bx + dx * dist; float candidateY = by + dy * dist; float candidateZ = bz; bool outsideAllVoidZones = true; - for (Unit* voidZone : voidZones) + for (Unit* voidZone : voidZones) { - float voidZoneDist = sqrt(pow(candidateX - voidZone->GetPositionX(), 2) + + float voidZoneDist = sqrt(pow(candidateX - voidZone->GetPositionX(), 2) + pow(candidateY - voidZone->GetPositionY(), 2)); - if (voidZoneDist < 4.0f) + if (voidZoneDist < 4.0f) { outsideAllVoidZones = false; break; @@ -658,14 +658,14 @@ bool KarazhanNetherspiteBlockBlueBeamAction::Execute(Event event) continue; } float distToIdeal = fabs(dist - 18.0f); - if (!found || distToIdeal < bestDist) + if (!found || distToIdeal < bestDist) { bestDist = distToIdeal; bestPos = Position(candidateX, candidateY, candidateZ); found = true; } } - if (found) + if (found) { bot->AttackStop(); bot->InterruptNonMeleeSpells(false); @@ -747,17 +747,17 @@ bool KarazhanNetherspiteBlockGreenBeamAction::Execute(Event event) float bestDist = 150.0f; Position bestPos; bool found = false; - for (float dist = 18.0f; dist <= 30.0f; dist += 0.5f) + for (float dist = 18.0f; dist <= 30.0f; dist += 0.5f) { float candidateX = bx + dx * dist; float candidateY = by + dy * dist; float candidateZ = bz; bool outsideAllVoidZones = true; - for (Unit* voidZone : voidZones) + for (Unit* voidZone : voidZones) { - float voidZoneDist = sqrt(pow(candidateX - voidZone->GetPositionX(), 2) + + float voidZoneDist = sqrt(pow(candidateX - voidZone->GetPositionX(), 2) + pow(candidateY - voidZone->GetPositionY(), 2)); - if (voidZoneDist < 4.0f) + if (voidZoneDist < 4.0f) { outsideAllVoidZones = false; break; @@ -768,19 +768,19 @@ bool KarazhanNetherspiteBlockGreenBeamAction::Execute(Event event) continue; } float distToIdeal = fabs(dist - 18.0f); - if (!found || distToIdeal < bestDist) + if (!found || distToIdeal < bestDist) { bestDist = distToIdeal; bestPos = Position(candidateX, candidateY, candidateZ); found = true; } } - if (found) + if (found) { bot->AttackStop(); bot->InterruptNonMeleeSpells(false); - return MoveTo(bot->GetMapId(), bestPos.GetPositionX(), bestPos.GetPositionY(), bestPos.GetPositionZ(), + return MoveTo(bot->GetMapId(), bestPos.GetPositionX(), bestPos.GetPositionY(), bestPos.GetPositionZ(), false, false, false, true, MovementPriority::MOVEMENT_FORCED); } @@ -820,7 +820,7 @@ bool KarazhanNetherspiteAvoidBeamAndVoidZoneAction::Execute(Event event) Unit* redPortal = bot->FindNearestCreature(NPC_RED_PORTAL, 150.0f); Unit* bluePortal = bot->FindNearestCreature(NPC_BLUE_PORTAL, 150.0f); Unit* greenPortal = bot->FindNearestCreature(NPC_GREEN_PORTAL, 150.0f); - if (redPortal) + if (redPortal) { float bx = boss->GetPositionX(), by = boss->GetPositionY(); float px = redPortal->GetPositionX(), py = redPortal->GetPositionY(); @@ -828,7 +828,7 @@ bool KarazhanNetherspiteAvoidBeamAndVoidZoneAction::Execute(Event event) float length = sqrt(dx*dx + dy*dy); beams.push_back({redPortal, 0.0f, length}); } - if (bluePortal) + if (bluePortal) { float bx = boss->GetPositionX(), by = boss->GetPositionY(); float px = bluePortal->GetPositionX(), py = bluePortal->GetPositionY(); @@ -836,7 +836,7 @@ bool KarazhanNetherspiteAvoidBeamAndVoidZoneAction::Execute(Event event) float length = sqrt(dx*dx + dy*dy); beams.push_back({bluePortal, 0.0f, length}); } - if (greenPortal) + if (greenPortal) { float bx = boss->GetPositionX(), by = boss->GetPositionY(); float px = greenPortal->GetPositionX(), py = greenPortal->GetPositionY(); @@ -845,7 +845,7 @@ bool KarazhanNetherspiteAvoidBeamAndVoidZoneAction::Execute(Event event) beams.push_back({greenPortal, 0.0f, length}); } bool nearBeam = false; - for (const auto& beam : beams) + for (auto const& beam : beams) { float bx = boss->GetPositionX(), by = boss->GetPositionY(); float px = beam.portal->GetPositionX(), py = beam.portal->GetPositionY(); @@ -888,13 +888,13 @@ bool KarazhanNetherspiteAvoidBeamAndVoidZoneAction::Execute(Event event) continue; } bool tooCloseToBeam = false; - for (const auto& beam : beams) + for (auto const& beam : beams) { float bx = boss->GetPositionX(), by = boss->GetPositionY(); float px = beam.portal->GetPositionX(), py = beam.portal->GetPositionY(); float dx = px - bx, dy = py - by; float length = sqrt(dx*dx + dy*dy); - if (length == 0.0f) + if (length == 0.0f) { continue; } @@ -918,7 +918,7 @@ bool KarazhanNetherspiteAvoidBeamAndVoidZoneAction::Execute(Event event) { continue; } - if (!found || moveDist < bestDist) + if (!found || moveDist < bestDist) { bestCandidate = Position(cx, cy, cz); bestDist = moveDist; @@ -926,17 +926,17 @@ bool KarazhanNetherspiteAvoidBeamAndVoidZoneAction::Execute(Event event) } } } - if (found && karazhanHelper.IsSafePosition(bestCandidate.GetPositionX(), - bestCandidate.GetPositionY(), bestCandidate.GetPositionZ(), + if (found && karazhanHelper.IsSafePosition(bestCandidate.GetPositionX(), + bestCandidate.GetPositionY(), bestCandidate.GetPositionZ(), voidZones, 4.0f)) { bot->AttackStop(); bot->InterruptNonMeleeSpells(false); - return MoveTo(bot->GetMapId(), bestCandidate.GetPositionX(), bestCandidate.GetPositionY(), + return MoveTo(bot->GetMapId(), bestCandidate.GetPositionX(), bestCandidate.GetPositionY(), bestCandidate.GetPositionZ(), false, false, false, true, MovementPriority::MOVEMENT_COMBAT); } - + return false; } @@ -984,7 +984,7 @@ bool KarazhanNetherspiteBanishPhaseAvoidVoidZoneAction::isUseful() RaidKarazhanHelpers karazhanHelper(botAI); std::vector voidZones = karazhanHelper.GetAllVoidZones(); - for (Unit* vz : voidZones) + for (Unit* vz : voidZones) { if (bot->GetExactDist2d(vz) < 4.0f) { @@ -1056,7 +1056,7 @@ bool KarazhanPrinceMalchezaarNonTankAvoidHazardAction::Execute(Event event) bot->AttackStop(); bot->InterruptNonMeleeSpells(false); - return MoveTo(bot->GetMapId(), bestDestX, bestDestY, bestDestZ, false, false, false, true, + return MoveTo(bot->GetMapId(), bestDestX, bestDestY, bestDestZ, false, false, false, true, MovementPriority::MOVEMENT_FORCED); } @@ -1123,7 +1123,7 @@ bool KarazhanPrinceMalchezaarNonTankAvoidHazardAction::Execute(Event event) bot->AttackStop(); bot->InterruptNonMeleeSpells(false); - return MoveTo(bot->GetMapId(), bestDestX, bestDestY, bestDestZ, false, false, false, true, + return MoveTo(bot->GetMapId(), bestDestX, bestDestY, bestDestZ, false, false, false, true, MovementPriority::MOVEMENT_COMBAT); } } @@ -1135,7 +1135,7 @@ bool KarazhanPrinceMalchezaarNonTankAvoidHazardAction::Execute(Event event) bool KarazhanPrinceMalchezaarNonTankAvoidHazardAction::isUseful() { Unit* boss = AI_VALUE2(Unit*, "find target", "prince malchezaar"); - + return boss && !(botAI->IsTank(bot) && botAI->HasAggro(boss) && boss->GetVictim() == bot); } @@ -1198,7 +1198,7 @@ bool KarazhanPrinceMalchezaarTankAvoidHazardAction::Execute(Event event) if (!destSafe) continue; - bool pathSafe = karazhanHelper.IsStraightPathSafe(Position(bx, by, bz), Position(destX, destY, destZ), + bool pathSafe = karazhanHelper.IsStraightPathSafe(Position(bx, by, bz), Position(destX, destY, destZ), infernals, safeInfernalDistance, stepSize); float moveDist = sqrt(pow(destX - bx, 2) + pow(destY - by, 2)); if (pathSafe && moveDist < bestMoveDist) @@ -1255,7 +1255,7 @@ bool KarazhanPrinceMalchezaarTankAvoidHazardAction::Execute(Event event) bot->AttackStop(); bot->InterruptNonMeleeSpells(false); - return MoveTo(bot->GetMapId(), bestDestX, bestDestY, bestDestZ, false, false, false, true, + return MoveTo(bot->GetMapId(), bestDestX, bestDestY, bestDestZ, false, false, false, true, MovementPriority::MOVEMENT_COMBAT); } } @@ -1266,6 +1266,6 @@ bool KarazhanPrinceMalchezaarTankAvoidHazardAction::Execute(Event event) bool KarazhanPrinceMalchezaarTankAvoidHazardAction::isUseful() { Unit* boss = AI_VALUE2(Unit*, "find target", "prince malchezaar"); - + return boss && botAI->IsTank(bot) && botAI->HasAggro(boss) && boss->GetVictim() == bot; } diff --git a/src/strategy/raids/karazhan/RaidKarazhanHelpers.cpp b/src/strategy/raids/karazhan/RaidKarazhanHelpers.cpp index b4d6d5dfb8..296341746f 100644 --- a/src/strategy/raids/karazhan/RaidKarazhanHelpers.cpp +++ b/src/strategy/raids/karazhan/RaidKarazhanHelpers.cpp @@ -22,11 +22,11 @@ const Position KARAZHAN_MAIDEN_OF_VIRTUE_RANGED_POSITION[8] = }; const Position KARAZHAN_BIG_BAD_WOLF_BOSS_POSITION = Position(-10913.391f, -1773.508f, 90.477f); -const Position KARAZHAN_BIG_BAD_WOLF_RUN_POSITION[4] = +const Position KARAZHAN_BIG_BAD_WOLF_RUN_POSITION[4] = { { -10875.456f, -1779.036f, 90.477f }, { -10872.281f, -1751.638f, 90.477f }, - { -10910.492f, -1747.401f, 90.477f }, + { -10910.492f, -1747.401f, 90.477f }, { -10913.391f, -1773.508f, 90.477f }, }; @@ -68,7 +68,7 @@ Unit* RaidKarazhanHelpers::GetFirstAliveUnitByEntry(uint32 entry) { const GuidVector npcs = AI_VALUE(GuidVector, "nearest hostile npcs"); - for (const auto& npcGuid : npcs) + for (auto const& npcGuid : npcs) { Unit* unit = botAI->GetUnit(npcGuid); @@ -253,7 +253,7 @@ std::tuple RaidKarazhanHelpers::GetCurrentBeamBlocker std::vector redBlockers = GetRedBlockers(); if (!redBlockers.empty()) { - auto it = std::find_if(redBlockers.begin(), redBlockers.end(), [](Player* p) + auto it = std::find_if(redBlockers.begin(), redBlockers.end(), [](Player* p) { return p && p->GetGUID() == currentRedBlocker; }); @@ -276,7 +276,7 @@ std::tuple RaidKarazhanHelpers::GetCurrentBeamBlocker std::vector greenBlockers = GetGreenBlockers(); if (!greenBlockers.empty()) { - auto it = std::find_if(greenBlockers.begin(), greenBlockers.end(), [](Player* p) + auto it = std::find_if(greenBlockers.begin(), greenBlockers.end(), [](Player* p) { return p && p->GetGUID() == currentGreenBlocker; }); @@ -299,7 +299,7 @@ std::tuple RaidKarazhanHelpers::GetCurrentBeamBlocker std::vector blueBlockers = GetBlueBlockers(); if (!blueBlockers.empty()) { - auto it = std::find_if(blueBlockers.begin(), blueBlockers.end(), [](Player* p) + auto it = std::find_if(blueBlockers.begin(), blueBlockers.end(), [](Player* p) { return p && p->GetGUID() == currentBlueBlocker; }); @@ -327,7 +327,7 @@ std::vector RaidKarazhanHelpers::GetAllVoidZones() std::vector voidZones; const float radius = 30.0f; const GuidVector npcs = botAI->GetAiObjectContext()->GetValue("nearest npcs")->Get(); - for (const auto& npcGuid : npcs) + for (auto const& npcGuid : npcs) { Unit* unit = botAI->GetUnit(npcGuid); if (!unit || unit->GetEntry() != NPC_VOID_ZONE) @@ -363,7 +363,7 @@ std::vector RaidKarazhanHelpers::GetSpawnedInfernals() const { std::vector infernals; const GuidVector npcs = botAI->GetAiObjectContext()->GetValue("nearest npcs")->Get(); - for (const auto& npcGuid : npcs) + for (auto const& npcGuid : npcs) { Unit* unit = botAI->GetUnit(npcGuid); if (unit && unit->GetEntry() == NPC_NETHERSPITE_INFERNAL) @@ -388,7 +388,7 @@ bool RaidKarazhanHelpers::IsStraightPathSafe(const Position& start, const Positi { return true; } - + for (float checkDist = 0.0f; checkDist <= totalDist; checkDist += stepSize) { float t = checkDist / totalDist; @@ -404,6 +404,6 @@ bool RaidKarazhanHelpers::IsStraightPathSafe(const Position& start, const Positi } } } - + return true; } diff --git a/src/strategy/raids/karazhan/RaidKarazhanHelpers.h b/src/strategy/raids/karazhan/RaidKarazhanHelpers.h index 89d06a950b..d26d8501d1 100644 --- a/src/strategy/raids/karazhan/RaidKarazhanHelpers.h +++ b/src/strategy/raids/karazhan/RaidKarazhanHelpers.h @@ -78,7 +78,7 @@ class RaidKarazhanHelpers : public AiObject bool IsSafePosition (float x, float y, float z, const std::vector& hazards, float hazardRadius); std::vector GetSpawnedInfernals() const; - bool IsStraightPathSafe(const Position& start, const Position& target, + bool IsStraightPathSafe(const Position& start, const Position& target, const std::vector& hazards, float hazardRadius, float stepSize); }; diff --git a/src/strategy/raids/karazhan/RaidKarazhanMultipliers.cpp b/src/strategy/raids/karazhan/RaidKarazhanMultipliers.cpp index ac23560338..f68cbe8b57 100644 --- a/src/strategy/raids/karazhan/RaidKarazhanMultipliers.cpp +++ b/src/strategy/raids/karazhan/RaidKarazhanMultipliers.cpp @@ -40,7 +40,7 @@ float KarazhanBigBadWolfMultiplier::GetValue(Action* action) if (bot->HasAura(SPELL_LITTLE_RED_RIDING_HOOD)) { - if ((dynamic_cast(action) && !dynamic_cast(action)) || + if ((dynamic_cast(action) && !dynamic_cast(action)) || (dynamic_cast(action))) { return 0.0f; @@ -58,7 +58,7 @@ float KarazhanShadeOfAranMultiplier::GetValue(Action* action) return 1.0f; } - if (boss->HasUnitState(UNIT_STATE_CASTING) && boss->FindCurrentSpellBySpellId(SPELL_ARCANE_EXPLOSION)) + if (boss->HasUnitState(UNIT_STATE_CASTING) && boss->FindCurrentSpellBySpellId(SPELL_ARCANE_EXPLOSION)) { if (IsChargeAction(action)) { @@ -120,7 +120,7 @@ float KarazhanNetherspiteBlueAndGreenBeamMultiplier::GetValue(Action* action) Unit* bluePortal = bot->FindNearestCreature(NPC_BLUE_PORTAL, 150.0f); Unit* greenPortal = bot->FindNearestCreature(NPC_GREEN_PORTAL, 150.0f); bool inBeam = false; - for (Unit* portal : {bluePortal, greenPortal}) + for (Unit* portal : {bluePortal, greenPortal}) { if (!portal) { @@ -139,7 +139,7 @@ float KarazhanNetherspiteBlueAndGreenBeamMultiplier::GetValue(Action* action) float t = (botdx * dx + botdy * dy); float beamX = bx + dx * t, beamY = by + dy * t; float distToBeam = sqrt(pow(bot->GetPositionX() - beamX, 2) + pow(bot->GetPositionY() - beamY, 2)); - if (distToBeam < 0.3f && t > 0.0f && t < length) + if (distToBeam < 0.3f && t > 0.0f && t < length) { inBeam = true; break; @@ -149,7 +149,7 @@ float KarazhanNetherspiteBlueAndGreenBeamMultiplier::GetValue(Action* action) { std::vector voidZones = karazhanHelper.GetAllVoidZones(); bool inVoidZone = false; - for (Unit* vz : voidZones) + for (Unit* vz : voidZones) { if (bot->GetExactDist2d(vz) < 4.0f) { @@ -232,7 +232,7 @@ float KarazhanNetherspiteRedBeamMultiplier::GetValue(Action* action) } } } - + return 1.0f; } diff --git a/src/strategy/raids/naxxramas/RaidNaxxMultipliers.cpp b/src/strategy/raids/naxxramas/RaidNaxxMultipliers.cpp index 3b41ec0dc4..2ffe429d1d 100644 --- a/src/strategy/raids/naxxramas/RaidNaxxMultipliers.cpp +++ b/src/strategy/raids/naxxramas/RaidNaxxMultipliers.cpp @@ -140,15 +140,18 @@ float ThaddiusGenericMultiplier::GetValue(Action* action) } // magnetic pull // uint32 curr_timer = eventMap->GetTimer(); - // // if (curr_phase == 2 && bot->GetPositionZ() > 312.5f && dynamic_cast(action)) { + // // if (curr_phase == 2 && bot->GetPositionZ() > 312.5f && dynamic_cast(action)) + // { // if (curr_phase == 2 && (curr_timer % 20000 >= 18000 || curr_timer % 20000 <= 2000) && - // dynamic_cast(action)) { + // dynamic_cast(action)) + // { // // MotionMaster *mm = bot->GetMotionMaster(); // // mm->Clear(); // return 0.0f; // } // thaddius phase - // if (curr_phase == 8 && dynamic_cast(action)) { + // if (curr_phase == 8 && dynamic_cast(action)) + // { // return 0.0f; // } return 1.0f; @@ -263,18 +266,22 @@ float FourhorsemanGenericMultiplier::GetValue(Action* action) // float GothikGenericMultiplier::GetValue(Action* action) // { // Unit* boss = AI_VALUE2(Unit*, "find target", "gothik the harvester"); -// if (!boss) { +// if (!boss) +// { // return 1.0f; // } // BossAI* boss_ai = dynamic_cast(boss->GetAI()); // EventMap* eventMap = boss_botAI->GetEvents(); // uint32 curr_phase = eventMap->GetPhaseMask(); -// if (curr_phase == 1 && (dynamic_cast(action))) { +// if (curr_phase == 1 && (dynamic_cast(action))) +// { // return 0.0f; // } -// if (curr_phase == 1 && (dynamic_cast(action))) { +// if (curr_phase == 1 && (dynamic_cast(action))) +// { // Unit* target = action->GetTarget(); -// if (target == boss) { +// if (target == boss) +// { // return 0.0f; // } // } diff --git a/src/strategy/raids/naxxramas/RaidNaxxTriggers.h b/src/strategy/raids/naxxramas/RaidNaxxTriggers.h index ec10c5ded3..a1f5bc2a8f 100644 --- a/src/strategy/raids/naxxramas/RaidNaxxTriggers.h +++ b/src/strategy/raids/naxxramas/RaidNaxxTriggers.h @@ -178,7 +178,6 @@ class SapphironGroundTrigger : public Trigger SapphironBossHelper helper; }; - class SapphironFlightTrigger : public Trigger { public: @@ -221,4 +220,4 @@ class LoathebTrigger : public Trigger LoathebBossHelper helper; }; -#endif \ No newline at end of file +#endif diff --git a/src/strategy/raids/obsidiansanctum/RaidOsTriggers.cpp b/src/strategy/raids/obsidiansanctum/RaidOsTriggers.cpp index 2deda7e88b..2c3758856d 100644 --- a/src/strategy/raids/obsidiansanctum/RaidOsTriggers.cpp +++ b/src/strategy/raids/obsidiansanctum/RaidOsTriggers.cpp @@ -17,7 +17,6 @@ bool FlameTsunamiTrigger::IsActive() Unit* boss = AI_VALUE2(Unit*, "find target", "sartharion"); if (!boss) { return false; } - GuidVector npcs = AI_VALUE(GuidVector, "nearest hostile npcs"); for (auto& npc : npcs) { @@ -39,7 +38,6 @@ bool TwilightFissureTrigger::IsActive() Unit* boss = AI_VALUE2(Unit*, "find target", "sartharion"); if (!boss) { return false; } - GuidVector npcs = AI_VALUE(GuidVector, "nearest hostile npcs"); for (auto& npc : npcs) { @@ -98,7 +96,6 @@ bool TwilightPortalEnterTrigger::IsActive() // } // } - // Don't enter portal until drakes are dead if (bot->HasAura(SPELL_POWER_OF_SHADRON) || bot->HasAura(SPELL_POWER_OF_TENEBRON) || @@ -125,4 +122,4 @@ bool TwilightPortalEnterTrigger::IsActive() bool TwilightPortalExitTrigger::IsActive() { return bot->HasAura(SPELL_TWILIGHT_SHIFT) && !AI_VALUE2(Unit*, "find target", "acolyte of shadron"); -} \ No newline at end of file +} diff --git a/src/strategy/raids/ulduar/RaidUlduarActions.cpp b/src/strategy/raids/ulduar/RaidUlduarActions.cpp index 7f7af7bab6..b7c3723bb3 100644 --- a/src/strategy/raids/ulduar/RaidUlduarActions.cpp +++ b/src/strategy/raids/ulduar/RaidUlduarActions.cpp @@ -1001,7 +1001,7 @@ bool RazorscaleHarpoonAction::Execute(Event event) float minDistance = std::numeric_limits::max(); // Find the nearest harpoon that hasn't been fired and is not on cooldown - for (const auto& harpoon : harpoonData) + for (auto const& harpoon : harpoonData) { if (razorscaleHelper.IsHarpoonFired(harpoon.chainSpellId)) continue; @@ -1087,7 +1087,7 @@ bool RazorscaleHarpoonAction::isUseful() const std::vector& harpoonData = razorscaleHelper.GetHarpoonData(); - for (const auto& harpoon : harpoonData) + for (auto const& harpoon : harpoonData) { if (razorscaleHelper.IsHarpoonFired(harpoon.chainSpellId)) continue; diff --git a/src/strategy/raids/ulduar/RaidUlduarBossHelper.cpp b/src/strategy/raids/ulduar/RaidUlduarBossHelper.cpp index b82d70459e..72333a079b 100644 --- a/src/strategy/raids/ulduar/RaidUlduarBossHelper.cpp +++ b/src/strategy/raids/ulduar/RaidUlduarBossHelper.cpp @@ -84,7 +84,7 @@ GameObject* RazorscaleBossHelper::FindNearestHarpoon(float x, float y, float z) GameObject* nearestHarpoon = nullptr; float minDistanceSq = std::numeric_limits::max(); - for (const auto& harpoon : GetHarpoonData()) + for (auto const& harpoon : GetHarpoonData()) { if (GameObject* harpoonGO = bot->FindNearestGameObject(harpoon.gameObjectEntry, 200.0f)) { @@ -158,7 +158,6 @@ bool RazorscaleBossHelper::CanSwapRoles() const return (currentTime - lastSwapTime) >= _roleSwapCooldown; } - void RazorscaleBossHelper::AssignRolesBasedOnHealth() { // Check if enough time has passed since last swap diff --git a/src/strategy/raids/ulduar/RaidUlduarTriggers.cpp b/src/strategy/raids/ulduar/RaidUlduarTriggers.cpp index 4222205268..89ad7ac5fb 100644 --- a/src/strategy/raids/ulduar/RaidUlduarTriggers.cpp +++ b/src/strategy/raids/ulduar/RaidUlduarTriggers.cpp @@ -211,7 +211,7 @@ bool RazorscaleHarpoonAvailableTrigger::IsActive() } // Check each harpoon entry - for (const auto& harpoon : harpoonData) + for (auto const& harpoon : harpoonData) { // Skip harpoons whose chain spell is already active on the boss if (razorscaleHelper.IsHarpoonFired(harpoon.chainSpellId)) @@ -808,7 +808,6 @@ bool ThorimMarkDpsTargetTrigger::IsActive() if (!boss || !boss->IsAlive() || !boss->IsHostileTo(bot)) return false; - if (boss->GetPositionZ() < ULDUAR_THORIM_AXIS_Z_FLOOR_THRESHOLD && (!currentSkullUnit || !currentSkullUnit->IsAlive())) { group->SetTargetIcon(RtiTargetValue::skullIndex, bot->GetGUID(), boss->GetGUID()); diff --git a/src/strategy/rogue/RogueActions.cpp b/src/strategy/rogue/RogueActions.cpp index 8a04a01d0c..3019e0ec86 100644 --- a/src/strategy/rogue/RogueActions.cpp +++ b/src/strategy/rogue/RogueActions.cpp @@ -19,7 +19,6 @@ bool CastStealthAction::isUseful() return true; } - bool CastStealthAction::isPossible() { // do not use with WSG flag or EYE flag diff --git a/src/strategy/rogue/RogueTriggers.h b/src/strategy/rogue/RogueTriggers.h index 4ef826a8c3..d9a184238d 100644 --- a/src/strategy/rogue/RogueTriggers.h +++ b/src/strategy/rogue/RogueTriggers.h @@ -42,7 +42,6 @@ class BladeFuryTrigger : public BoostTrigger BladeFuryTrigger(PlayerbotAI* botAI) : BoostTrigger(botAI, "blade fury") {} }; - class RuptureTrigger : public DebuffTrigger { public: @@ -127,6 +126,4 @@ class TricksOfTheTradeOnMainTankTrigger : public BuffOnMainTankTrigger TricksOfTheTradeOnMainTankTrigger(PlayerbotAI* ai) : BuffOnMainTankTrigger(ai, "tricks of the trade", true) {} }; - - #endif diff --git a/src/strategy/shaman/ElementalShamanStrategy.cpp b/src/strategy/shaman/ElementalShamanStrategy.cpp index 3e058925ff..350b347219 100644 --- a/src/strategy/shaman/ElementalShamanStrategy.cpp +++ b/src/strategy/shaman/ElementalShamanStrategy.cpp @@ -73,4 +73,3 @@ void ElementalShamanStrategy::InitTriggers(std::vector& triggers) // Range Triggers triggers.push_back(new TriggerNode("enemy is close", NextAction::array(0, new NextAction("thunderstorm", 19.0f), nullptr))); } - diff --git a/src/strategy/shaman/ShamanActions.cpp b/src/strategy/shaman/ShamanActions.cpp index 4915aa2780..e8ed1234bf 100644 --- a/src/strategy/shaman/ShamanActions.cpp +++ b/src/strategy/shaman/ShamanActions.cpp @@ -29,7 +29,7 @@ bool CastFireNovaAction::isUseful() { Unit* target = AI_VALUE(Unit*, "current target"); if (!target) return false; - + Creature* fireTotem = bot->GetMap()->GetCreature(bot->m_SummonSlot[1]); if (!fireTotem) return false; @@ -46,9 +46,9 @@ bool CastCleansingTotemAction::isUseful() } // Will only cast Stoneclaw Totem if low on health and not in a group -bool CastStoneclawTotemAction::isUseful() -{ - return !bot->GetGroup(); +bool CastStoneclawTotemAction::isUseful() +{ + return !bot->GetGroup(); } // Will only cast Lava Burst if Flame Shock is on the target diff --git a/src/strategy/shaman/ShamanActions.h b/src/strategy/shaman/ShamanActions.h index 3af0113436..69f29f0496 100644 --- a/src/strategy/shaman/ShamanActions.h +++ b/src/strategy/shaman/ShamanActions.h @@ -286,7 +286,6 @@ class CastLavaBurstAction : public CastSpellAction bool isUseful() override; }; - // Healing Actions class CastLesserHealingWaveAction : public CastHealingSpellAction diff --git a/src/strategy/shaman/ShamanTriggers.cpp b/src/strategy/shaman/ShamanTriggers.cpp index 574ab638d7..753edb83fd 100644 --- a/src/strategy/shaman/ShamanTriggers.cpp +++ b/src/strategy/shaman/ShamanTriggers.cpp @@ -19,7 +19,7 @@ bool MainHandWeaponNoImbueTrigger::IsActive() Item* const itemForSpell = bot->GetItemByPos(INVENTORY_SLOT_BAG_0, EQUIPMENT_SLOT_MAINHAND); if (!itemForSpell || itemForSpell->GetEnchantmentId(TEMP_ENCHANTMENT_SLOT)) return false; - + return true; } @@ -28,18 +28,18 @@ bool OffHandWeaponNoImbueTrigger::IsActive() Item* const itemForSpell = bot->GetItemByPos(INVENTORY_SLOT_BAG_0, EQUIPMENT_SLOT_OFFHAND); if (!itemForSpell) return false; - + uint32 invType = itemForSpell->GetTemplate()->InventoryType; bool allowedType = (invType == INVTYPE_WEAPON) || (invType == INVTYPE_WEAPONOFFHAND); if (itemForSpell->GetEnchantmentId(TEMP_ENCHANTMENT_SLOT) || !allowedType) return false; - + return true; } bool ShockTrigger::IsActive() { - return SpellTrigger::IsActive() && + return SpellTrigger::IsActive() && !botAI->HasAura("flame shock", GetTarget(), false, true) && !botAI->HasAura("frost shock", GetTarget(), false, true); } @@ -64,19 +64,19 @@ bool EarthShockExecuteTrigger::IsActive() bool TotemTrigger::IsActive() { - return AI_VALUE(uint8, "attacker count") >= attackerCount && + return AI_VALUE(uint8, "attacker count") >= attackerCount && !AI_VALUE2(bool, "has totem", name) && !botAI->HasAura(name, bot); } -bool WaterWalkingTrigger::IsActive() -{ - return BuffTrigger::IsActive() && AI_VALUE2(bool, "swimming", "self target"); +bool WaterWalkingTrigger::IsActive() +{ + return BuffTrigger::IsActive() && AI_VALUE2(bool, "swimming", "self target"); } -bool WaterBreathingTrigger::IsActive() -{ - return BuffTrigger::IsActive() && AI_VALUE2(bool, "swimming", "self target"); +bool WaterBreathingTrigger::IsActive() +{ + return BuffTrigger::IsActive() && AI_VALUE2(bool, "swimming", "self target"); } bool WaterWalkingOnPartyTrigger::IsActive() @@ -123,7 +123,7 @@ bool SpiritWalkTrigger::IsActive() } } } - + return false; } @@ -138,7 +138,7 @@ bool CallOfTheElementsTrigger::IsActive() int emptyCount = 0; static const uint8 slots[] = { - SUMMON_SLOT_TOTEM_EARTH, SUMMON_SLOT_TOTEM_FIRE, + SUMMON_SLOT_TOTEM_EARTH, SUMMON_SLOT_TOTEM_FIRE, SUMMON_SLOT_TOTEM_WATER, SUMMON_SLOT_TOTEM_AIR }; @@ -210,10 +210,10 @@ bool TotemicRecallTrigger::IsActive() Player* member = ref->GetSource(); if (!member) continue; - + if (member->IsInCombat()) return false; - + Pet* pet = member->GetPet(); if (pet && pet->IsInCombat()) return false; @@ -261,7 +261,7 @@ bool TotemicRecallTrigger::IsActive() } // Find the active totem strategy for this slot, and return the highest-rank spellId the bot knows for it -static uint32 GetRequiredTotemSpellId(PlayerbotAI* ai, const char* strategies[], +static uint32 GetRequiredTotemSpellId(PlayerbotAI* ai, const char* strategies[], const uint32* spellList[], const size_t spellCounts[], size_t numStrategies) { Player* bot = ai->GetBot(); @@ -279,7 +279,7 @@ static uint32 GetRequiredTotemSpellId(PlayerbotAI* ai, const char* strategies[], } } } - + return 0; // No relevant strategy active, or bot doesn't know any rank } @@ -289,11 +289,11 @@ static uint32 GetSummonedTotemSpellId(Player* bot, uint8 slot) ObjectGuid guid = bot->m_SummonSlot[slot]; if (guid.IsEmpty()) return 0; - + Creature* totem = bot->GetMap()->GetCreature(guid); if (!totem) return 0; - + return totem->GetUInt32Value(UNIT_CREATED_BY_SPELL); } @@ -309,7 +309,7 @@ bool NoEarthTotemTrigger::IsActive() if (!guid.IsEmpty()) { totem = bot->GetMap()->GetCreature(guid); - if (totem) + if (totem) { currentSpell = totem->GetUInt32Value(UNIT_CREATED_BY_SPELL); } @@ -320,18 +320,18 @@ bool NoEarthTotemTrigger::IsActive() static const uint32* spells[] = {STRENGTH_OF_EARTH_TOTEM, STONESKIN_TOTEM, TREMOR_TOTEM, EARTHBIND_TOTEM}; static const size_t counts[] = {STRENGTH_OF_EARTH_TOTEM_COUNT, STONESKIN_TOTEM_COUNT, TREMOR_TOTEM_COUNT, EARTHBIND_TOTEM_COUNT}; - + uint32 requiredSpell = GetRequiredTotemSpellId(botAI, names, spells, counts, 4); // EXCEPTION: If Stoneclaw Totem is out and in range, consider the slot "occupied" (do not fire the trigger) - for (size_t i = 0; i < STONECLAW_TOTEM_COUNT; ++i) + for (size_t i = 0; i < STONECLAW_TOTEM_COUNT; ++i) { if (currentSpell == STONECLAW_TOTEM[i] && totem && totem->GetDistance(bot) <= 30.0f) return false; } // If no relevant strategy, only care if the slot is empty or totem is too far away - if (!requiredSpell) + if (!requiredSpell) return guid.IsEmpty() || !totem || totem->GetDistance(bot) > 30.0f; // Fire if slot is empty or wrong totem or totem is too far away @@ -350,7 +350,7 @@ bool NoFireTotemTrigger::IsActive() if (!guid.IsEmpty()) { totem = bot->GetMap()->GetCreature(guid); - if (totem) + if (totem) { currentSpell = totem->GetUInt32Value(UNIT_CREATED_BY_SPELL); } @@ -366,7 +366,7 @@ bool NoFireTotemTrigger::IsActive() uint32 requiredSpell = GetRequiredTotemSpellId(botAI, names, spells, counts, 5); // EXCEPTION: If Fire Elemental is out and in range, consider the slot "occupied" (do not fire the trigger) - for (size_t i = 0; i < FIRE_ELEMENTAL_TOTEM_COUNT; ++i) + for (size_t i = 0; i < FIRE_ELEMENTAL_TOTEM_COUNT; ++i) { if (currentSpell == FIRE_ELEMENTAL_TOTEM[i] && totem && totem->GetDistance(bot) <= 30.0f) return false; @@ -407,14 +407,14 @@ bool NoWaterTotemTrigger::IsActive() uint32 requiredSpell = GetRequiredTotemSpellId(botAI, names, spells, counts, 4); // EXCEPTION: If Mana Tide is out and in range, consider the slot "occupied" (do not fire the trigger) - for (size_t i = 0; i < MANA_TIDE_TOTEM_COUNT; ++i) + for (size_t i = 0; i < MANA_TIDE_TOTEM_COUNT; ++i) { if (currentSpell == MANA_TIDE_TOTEM[i] && totem && totem->GetDistance(bot) <= 30.0f) return false; } // If no relevant strategy, only care if the slot is empty or totem is too far away - if (!requiredSpell) + if (!requiredSpell) { return guid.IsEmpty() || !totem || totem->GetDistance(bot) > 30.0f; } diff --git a/src/strategy/shaman/ShamanTriggers.h b/src/strategy/shaman/ShamanTriggers.h index 7fbaf2fd8b..abf4ed566c 100644 --- a/src/strategy/shaman/ShamanTriggers.h +++ b/src/strategy/shaman/ShamanTriggers.h @@ -374,7 +374,7 @@ class SetTotemTrigger : public Trigger private: uint32 requiredSpellId; uint32 const* totemSpellIds; - size_t totemSpellIdsCount; + size_t totemSpellIdsCount; int actionButtonId; }; diff --git a/src/strategy/triggers/GenericTriggers.h b/src/strategy/triggers/GenericTriggers.h index 5f03f8a134..943e80b742 100644 --- a/src/strategy/triggers/GenericTriggers.h +++ b/src/strategy/triggers/GenericTriggers.h @@ -550,7 +550,7 @@ class MediumManaTrigger : public Trigger bool IsActive() override; }; -BEGIN_TRIGGER(PanicTrigger, Trigger) +BEGIN_TRIGGER(PanicTrigger, Trigger) // cppcheck-suppress unknownMacro std::string const getName() override { return "panic"; } END_TRIGGER() diff --git a/src/strategy/triggers/PvpTriggers.cpp b/src/strategy/triggers/PvpTriggers.cpp index f70ef1d7a3..c837d8b16c 100644 --- a/src/strategy/triggers/PvpTriggers.cpp +++ b/src/strategy/triggers/PvpTriggers.cpp @@ -217,7 +217,6 @@ bool TeamHasFlag::IsActive() return ownTeamHasFlag && !enemyTeamHasFlag; } - bool EnemyTeamHasFlag::IsActive() { if (botAI->GetBot()->InBattleground()) diff --git a/src/strategy/triggers/RangeTriggers.cpp b/src/strategy/triggers/RangeTriggers.cpp index ee1266e607..3c60934fd2 100644 --- a/src/strategy/triggers/RangeTriggers.cpp +++ b/src/strategy/triggers/RangeTriggers.cpp @@ -22,7 +22,8 @@ bool EnemyTooCloseForSpellTrigger::IsActive() return target && (target->GetVictim() != bot || target->isFrozen() || target->HasRootAura()) && target->GetObjectSize() <= 10.0f && target->IsWithinCombatRange(bot, MIN_MELEE_REACH); // Unit* target = AI_VALUE(Unit*, "current target"); - // if (!target) { + // if (!target) + // { // return false; // } @@ -34,7 +35,7 @@ bool EnemyTooCloseForSpellTrigger::IsActive() // bool isRaid = false; // float combatReach = bot->GetCombatReach() + target->GetCombatReach(); // float targetDistance = sServerFacade->GetDistance2d(bot, target) + combatReach; - // if (target->GetTypeId() == TYPEID_UNIT) + // if (target->IsCreature()) // { // Creature* creature = botAI->GetCreature(target->GetGUID()); // if (creature) @@ -80,7 +81,7 @@ bool EnemyTooCloseForAutoShotTrigger::IsActive() // bool isRaid = false; // float combatReach = bot->GetCombatReach() + target->GetCombatReach(); // float targetDistance = sServerFacade->GetDistance2d(bot, target) + combatReach; - // if (target->GetTypeId() == TYPEID_UNIT) + // if (target->IsCreature()) // { // Creature* creature = botAI->GetCreature(target->GetGUID()); // if (creature) @@ -115,7 +116,7 @@ bool EnemyTooCloseForShootTrigger::IsActive() // bool isRaid = false; // float combatReach = bot->GetCombatReach() + target->GetCombatReach(); // float targetDistance = sServerFacade->GetDistance2d(bot, target) + combatReach; - // if (target->GetTypeId() == TYPEID_UNIT) + // if (target->IsCreature()) // { // Creature* creature = botAI->GetCreature(target->GetGUID()); // if (creature) diff --git a/src/strategy/triggers/TriggerContext.h b/src/strategy/triggers/TriggerContext.h index 1323e65344..1c829ae9f6 100644 --- a/src/strategy/triggers/TriggerContext.h +++ b/src/strategy/triggers/TriggerContext.h @@ -53,7 +53,6 @@ class TriggerContext : public NamedObjectContext creators["almost full mana"] = &TriggerContext::AlmostFullMana; creators["enough mana"] = &TriggerContext::EnoughMana; - creators["party member critical health"] = &TriggerContext::PartyMemberCriticalHealth; creators["party member low health"] = &TriggerContext::PartyMemberLowHealth; creators["party member medium health"] = &TriggerContext::PartyMemberMediumHealth; diff --git a/src/strategy/triggers/WorldPacketTriggerContext.h b/src/strategy/triggers/WorldPacketTriggerContext.h index 0f7f4c6e86..1e73095244 100644 --- a/src/strategy/triggers/WorldPacketTriggerContext.h +++ b/src/strategy/triggers/WorldPacketTriggerContext.h @@ -45,7 +45,6 @@ class WorldPacketTriggerContext : public NamedObjectContext creators["quest update complete"] = &WorldPacketTriggerContext::quest_update_complete; creators["questgiver quest details"] = &WorldPacketTriggerContext::questgiver_quest_details; - creators["item push result"] = &WorldPacketTriggerContext::item_push_result; creators["party command"] = &WorldPacketTriggerContext::party_command; creators["taxi done"] = &WorldPacketTriggerContext::taxi_done; diff --git a/src/strategy/values/EnemyPlayerValue.cpp b/src/strategy/values/EnemyPlayerValue.cpp index 9c2a413042..2325c9c09b 100644 --- a/src/strategy/values/EnemyPlayerValue.cpp +++ b/src/strategy/values/EnemyPlayerValue.cpp @@ -83,7 +83,7 @@ Unit* EnemyPlayerValue::Calculate() GuidVector players = AI_VALUE(GuidVector, "nearest enemy players"); float const maxAggroDistance = GetMaxAttackDistance(); - for (const auto& gTarget : players) + for (auto const& gTarget : players) { Unit* pUnit = botAI->GetUnit(gTarget); if (!pUnit) diff --git a/src/strategy/values/HasTotemValue.cpp b/src/strategy/values/HasTotemValue.cpp index 94a51837e0..0968b2e01a 100644 --- a/src/strategy/values/HasTotemValue.cpp +++ b/src/strategy/values/HasTotemValue.cpp @@ -57,7 +57,8 @@ bool HasTotemValue::Calculate() // continue; // Creature* creature = dynamic_cast(unit); -// if (creature->GetOwner() != bot) { +// if (creature->GetOwner() != bot) +// { // continue; // } diff --git a/src/strategy/values/ItemUsageValue.cpp b/src/strategy/values/ItemUsageValue.cpp index 136c74f8a4..3be0db2c1f 100644 --- a/src/strategy/values/ItemUsageValue.cpp +++ b/src/strategy/values/ItemUsageValue.cpp @@ -22,10 +22,13 @@ ItemUsage ItemUsageValue::Calculate() uint32 itemId = 0; uint32 randomPropertyId = 0; size_t pos = qualifier.find(","); - if (pos != std::string::npos) { + if (pos != std::string::npos) + { itemId = atoi(qualifier.substr(0, pos).c_str()); randomPropertyId = atoi(qualifier.substr(pos + 1).c_str()); - } else { + } + else + { itemId = atoi(qualifier.c_str()); } @@ -261,7 +264,7 @@ ItemUsage ItemUsageValue::QueryItemUsageForEquip(ItemTemplate const* itemProto, { needToCheckUnique = true; } - else if (itemProto->Flags & ITEM_FLAG_UNIQUE_EQUIPPABLE) + else if (itemProto->HasFlag(ITEM_FLAG_UNIQUE_EQUIPPABLE)) { needToCheckUnique = true; } @@ -373,7 +376,6 @@ ItemUsage ItemUsageValue::QueryItemUsageForEquip(ItemTemplate const* itemProto, } } - for (uint8 i = 0; i < possibleSlots; i++) { bool shouldEquipInSlot = shouldEquip; diff --git a/src/strategy/values/PossibleRpgTargetsValue.cpp b/src/strategy/values/PossibleRpgTargetsValue.cpp index 1b136c825c..6e78f37f9a 100644 --- a/src/strategy/values/PossibleRpgTargetsValue.cpp +++ b/src/strategy/values/PossibleRpgTargetsValue.cpp @@ -54,18 +54,18 @@ void PossibleRpgTargetsValue::FindUnits(std::list& targets) bool PossibleRpgTargetsValue::AcceptUnit(Unit* unit) { - if (unit->IsHostileTo(bot) || unit->GetTypeId() == TYPEID_PLAYER) + if (unit->IsHostileTo(bot) || unit->IsPlayer()) return false; if (sServerFacade->GetDistance2d(bot, unit) <= sPlayerbotAIConfig->tooCloseDistance) return false; - if (unit->HasFlag(UNIT_NPC_FLAGS, UNIT_NPC_FLAG_SPIRITHEALER)) + if (unit->HasNpcFlag(UNIT_NPC_FLAG_SPIRITHEALER)) return false; for (uint32 npcFlag : allowedNpcFlags) { - if (unit->HasFlag(UNIT_NPC_FLAGS, npcFlag)) + if (unit->HasNpcFlag(static_cast(npcFlag))) return true; } @@ -82,7 +82,6 @@ bool PossibleRpgTargetsValue::AcceptUnit(Unit* unit) return false; } - std::vector PossibleNewRpgTargetsValue::allowedNpcFlags; PossibleNewRpgTargetsValue::PossibleNewRpgTargetsValue(PlayerbotAI* botAI, float range) @@ -127,11 +126,11 @@ GuidVector PossibleNewRpgTargetsValue::Calculate() guidDistancePairs.push_back({unit->GetGUID(), bot->GetExactDist(unit)}); } // Override to sort by distance - std::sort(guidDistancePairs.begin(), guidDistancePairs.end(), [](const auto& a, const auto& b) { + std::sort(guidDistancePairs.begin(), guidDistancePairs.end(), [](auto const& a, auto const& b) { return a.second < b.second; }); - for (const auto& pair : guidDistancePairs) { + for (auto const& pair : guidDistancePairs) { results.push_back(pair.first); } return results; @@ -146,15 +145,15 @@ void PossibleNewRpgTargetsValue::FindUnits(std::list& targets) bool PossibleNewRpgTargetsValue::AcceptUnit(Unit* unit) { - if (unit->IsHostileTo(bot) || unit->GetTypeId() == TYPEID_PLAYER) + if (unit->IsHostileTo(bot) || unit->IsPlayer()) return false; - if (unit->HasFlag(UNIT_NPC_FLAGS, UNIT_NPC_FLAG_SPIRITHEALER)) + if (unit->HasNpcFlag(UNIT_NPC_FLAG_SPIRITHEALER)) return false; for (uint32 npcFlag : allowedNpcFlags) { - if (unit->HasFlag(UNIT_NPC_FLAGS, npcFlag)) + if (unit->HasNpcFlag(static_cast(npcFlag))) return true; } @@ -170,7 +169,6 @@ GuidVector PossibleNewRpgGameObjectsValue::Calculate() Acore::GameObjectListSearcher searcher(bot, targets, u_check); Cell::VisitObjects(bot, searcher, range); - std::vector> guidDistancePairs; for (GameObject* go : targets) { @@ -194,11 +192,11 @@ GuidVector PossibleNewRpgGameObjectsValue::Calculate() GuidVector results; // Sort by distance - std::sort(guidDistancePairs.begin(), guidDistancePairs.end(), [](const auto& a, const auto& b) { + std::sort(guidDistancePairs.begin(), guidDistancePairs.end(), [](auto const& a, auto const& b) { return a.second < b.second; }); - for (const auto& pair : guidDistancePairs) { + for (auto const& pair : guidDistancePairs) { results.push_back(pair.first); } return results; diff --git a/src/strategy/warlock/WarlockTriggers.h b/src/strategy/warlock/WarlockTriggers.h index 295b6d895b..8512549012 100644 --- a/src/strategy/warlock/WarlockTriggers.h +++ b/src/strategy/warlock/WarlockTriggers.h @@ -121,7 +121,6 @@ class WrongPetTrigger : public Trigger bool IsActive() override; }; - // CC and Pet Triggers class BanishTrigger : public HasCcTargetTrigger diff --git a/src/strategy/warrior/WarriorActions.cpp b/src/strategy/warrior/WarriorActions.cpp index c679a6b584..9733226a95 100644 --- a/src/strategy/warrior/WarriorActions.cpp +++ b/src/strategy/warrior/WarriorActions.cpp @@ -126,7 +126,7 @@ bool CastRetaliationAction::isUseful() continue; // Check if the attacker is melee-based using unit_class - if (attacker->GetTypeId() == TYPEID_UNIT) + if (attacker->IsCreature()) { Creature* creature = attacker->ToCreature(); if (creature && (creature->IsClass(CLASS_WARRIOR) @@ -136,7 +136,7 @@ bool CastRetaliationAction::isUseful() ++meleeAttackers; } } - else if (attacker->GetTypeId() == TYPEID_PLAYER) + else if (attacker->IsPlayer()) { Player* playerAttacker = attacker->ToPlayer(); if (playerAttacker && botAI->IsMelee(playerAttacker)) // Reuse existing Player melee check diff --git a/src/strategy/warrior/WarriorTriggers.cpp b/src/strategy/warrior/WarriorTriggers.cpp index 4ca2e5b9c7..b561c4815d 100644 --- a/src/strategy/warrior/WarriorTriggers.cpp +++ b/src/strategy/warrior/WarriorTriggers.cpp @@ -119,4 +119,3 @@ bool ShatteringThrowTrigger::IsActive() return false; // No valid targets within range } - diff --git a/src/strategy/warrior/WarriorTriggers.h b/src/strategy/warrior/WarriorTriggers.h index 4e4f4cabf4..563d707698 100644 --- a/src/strategy/warrior/WarriorTriggers.h +++ b/src/strategy/warrior/WarriorTriggers.h @@ -80,7 +80,6 @@ class ShatteringThrowTrigger : public Trigger bool IsActive() override; }; - // class SlamTrigger : public HasAuraTrigger // { // public: From 82b066cd7ee960bd4182f750db6bcf3fba336faf Mon Sep 17 00:00:00 2001 From: Tecc Date: Wed, 5 Nov 2025 22:52:35 +0100 Subject: [PATCH 148/151] Optimize Wintergrasp logic with cached team capacity and refactoring Caches Wintergrasp team capacity to minimize redundant config lookups, improving performance. Introduces a method to refresh the cache when needed. Refactors vehicle selection and workshop control logic for clarity and consistency, replacing magic numbers with constants and enhancing readability. Removes unused Wintergrasp Titan's Relic handling to streamline related code paths. --- src/RandomPlayerbotMgr.cpp | 13 ++- src/RandomPlayerbotMgr.h | 2 + src/strategy/actions/BattleGroundTactics.cpp | 88 ++++++++++---------- src/strategy/actions/BattleGroundTactics.h | 11 +++ 4 files changed, 69 insertions(+), 45 deletions(-) diff --git a/src/RandomPlayerbotMgr.cpp b/src/RandomPlayerbotMgr.cpp index 43b0200561..3161676f39 100644 --- a/src/RandomPlayerbotMgr.cpp +++ b/src/RandomPlayerbotMgr.cpp @@ -244,6 +244,10 @@ RandomPlayerbotMgr::RandomPlayerbotMgr() : PlayerbotHolder(), processTicks(0) BgCheckTimer = 0; LfgCheckTimer = 0; PlayersCheckTimer = 0; + WGCheckTimer = 0; + + // Cache Wintergrasp team capacity to avoid repeated config lookups + wgTeamCapCache = sWorld->getIntConfig(CONFIG_WINTERGRASP_PLR_MAX); } RandomPlayerbotMgr::~RandomPlayerbotMgr() {} @@ -1413,8 +1417,8 @@ void RandomPlayerbotMgr::CheckWGFill() return; } - // desired cap per team from worldserver config (same value BattlefieldWG uses) - const uint32 teamCap = sWorld->getIntConfig(CONFIG_WINTERGRASP_PLR_MAX); + // Use cached team cap value to avoid repeated config lookups + const uint32 teamCap = wgTeamCapCache; // WG level bracket (default 79-80) uint32 minLevel = 79; @@ -1521,6 +1525,11 @@ void RandomPlayerbotMgr::ScheduleChangeStrategy(uint32 bot, uint32 time) SetEventValue(bot, "change_strategy", 1, time); } +void RandomPlayerbotMgr::RefreshWGTeamCapCache() +{ + wgTeamCapCache = sWorld->getIntConfig(CONFIG_WINTERGRASP_PLR_MAX); +} + bool RandomPlayerbotMgr::ProcessBot(uint32 bot) { ObjectGuid botGUID = ObjectGuid::Create(bot); diff --git a/src/RandomPlayerbotMgr.h b/src/RandomPlayerbotMgr.h index b93c4f8d93..d826a59053 100644 --- a/src/RandomPlayerbotMgr.h +++ b/src/RandomPlayerbotMgr.h @@ -116,6 +116,7 @@ class RandomPlayerbotMgr : public PlayerbotHolder void IncreaseLevel(Player* bot); void ScheduleTeleport(uint32 bot, uint32 time = 0); void ScheduleChangeStrategy(uint32 bot, uint32 time = 0); + void RefreshWGTeamCapCache(); // Refresh cached Wintergrasp team capacity from config void HandleCommand(uint32 type, std::string const text, Player* fromPlayer, std::string channelName = ""); std::string const HandleRemoteCommand(std::string const request); void OnPlayerLogout(Player* player); @@ -217,6 +218,7 @@ class RandomPlayerbotMgr : public PlayerbotHolder time_t RealPlayerLastTimeSeen = 0; time_t DelayLoginBotsTimer; time_t printStatsTimer; + uint32 wgTeamCapCache; // Cached Wintergrasp team capacity from config uint32 AddRandomBots(); bool ProcessBot(uint32 bot); void ScheduleRandomize(uint32 bot, uint32 time); diff --git a/src/strategy/actions/BattleGroundTactics.cpp b/src/strategy/actions/BattleGroundTactics.cpp index af39a410be..684b3ce9d5 100644 --- a/src/strategy/actions/BattleGroundTactics.cpp +++ b/src/strategy/actions/BattleGroundTactics.cpp @@ -2026,18 +2026,20 @@ bool BGTactics::selectObjective(bool reset) workshopsControlled = 0; // Check workshop control through battlefield area data (real AzerothCore method) - if (bf->GetData(4538) == myTeam) workshopsControlled++; // AREA_THE_SUNKEN_RING (NE Workshop) - if (bf->GetData(4539) == myTeam) workshopsControlled++; // AREA_THE_BROKEN_TEMPLE (NW Workshop) - if (bf->GetData(4611) == myTeam) workshopsControlled++; // AREA_WESTSPARK_WORKSHOP (SW Workshop) - if (bf->GetData(4612) == myTeam) workshopsControlled++; // AREA_EASTSPARK_WORKSHOP (SE Workshop) + // Note: GetData() for area control returns TeamId (0=TEAM_ALLIANCE, 1=TEAM_HORDE) + uint32 teamIdData = static_cast(myTeam); // Convert TeamId enum to uint32 for comparison + if (bf->GetData(AREA_THE_SUNKEN_RING) == teamIdData) workshopsControlled++; // NE Workshop + if (bf->GetData(AREA_THE_BROKEN_TEMPLE) == teamIdData) workshopsControlled++; // NW Workshop + if (bf->GetData(AREA_WESTSPARK_WORKSHOP) == teamIdData) workshopsControlled++; // SW Workshop + if (bf->GetData(AREA_EASTSPARK_WORKSHOP) == teamIdData) workshopsControlled++; // SE Workshop // Fallback calculation if area data not available if (workshopsControlled == 0) { - // Use vehicle capacity as indicator of workshop control (each workshop adds +4 vehicles in AC) + // Use vehicle capacity as indicator of workshop control uint32 maxVehForTeam = (myTeam == TEAM_ALLIANCE) ? bf->GetData(BATTLEFIELD_WG_DATA_MAX_VEHICLE_A) : bf->GetData(BATTLEFIELD_WG_DATA_MAX_VEHICLE_H); - workshopsControlled = maxVehForTeam / 4; // Each workshop = 4 vehicles in AzerothCore + workshopsControlled = maxVehForTeam / WG_VEHICLES_PER_WORKSHOP; // Each workshop adds vehicle capacity } // Dynamic vehicle limits based on workshop control (each workshop = +2 vehicle capacity) @@ -2354,23 +2356,27 @@ bool BGTactics::selectObjective(bool reset) Unit* bestVehicle = nullptr; float bestVehDist = FLT_MAX; - for (ObjectGuid const& vg : nearVehicles) + for (ObjectGuid const& vehicleGuid : nearVehicles) { - Unit* v = botAI->GetUnit(vg); - if (!v || !v->IsFriendlyTo(bot) || v->GetVehicleKit()->GetAvailableSeatCount() == 0) + Unit* vehicle = botAI->GetUnit(vehicleGuid); + if (!vehicle || !vehicle->IsFriendlyTo(bot)) continue; - uint32 entry = v->GetEntry(); + Vehicle* vehicleKit = vehicle->GetVehicleKit(); + if (!vehicleKit || vehicleKit->GetAvailableSeatCount() == 0) + continue; + + uint32 entry = vehicle->GetEntry(); // Only consider siege vehicles if (entry != WG_ENTRY_SIEGE_ENGINE_A && entry != WG_ENTRY_SIEGE_ENGINE_H && entry != WG_ENTRY_DEMOLISHER && entry != WG_ENTRY_CATAPULT) continue; - float d = bot->GetDistance(v); - if (d < bestVehDist && d < 150.0f) + float distance = bot->GetDistance(vehicle); + if (distance < bestVehDist && distance < 150.0f) { - bestVehDist = d; - bestVehicle = v; + bestVehDist = distance; + bestVehicle = vehicle; } } @@ -2389,28 +2395,28 @@ bool BGTactics::selectObjective(bool reset) float bestDist = FLT_MAX; bool shouldEscort = false; - for (ObjectGuid const& vg : vehs) + for (ObjectGuid const& vehicleGuid : vehs) { - Unit* v = botAI->GetUnit(vg); - if (!v) + Unit* vehicle = botAI->GetUnit(vehicleGuid); + if (!vehicle) continue; - float d = bot->GetDistance(v); - bool isFriendly = v->IsFriendlyTo(bot); - uint32 entry = v->GetEntry(); + float distance = bot->GetDistance(vehicle); + bool isFriendly = vehicle->IsFriendlyTo(bot); + uint32 entry = vehicle->GetEntry(); // Target enemy vehicles for destruction - if (!isFriendly && d < 250.0f) + if (!isFriendly && distance < 250.0f) { - if (d < bestDist) + if (distance < bestDist) { - bestDist = d; - targetVehicle = v; + bestDist = distance; + targetVehicle = vehicle; shouldEscort = false; } } // Enhanced escort for friendly siege engines with coordination - else if (isFriendly && d < 200.0f && !isDefender && + else if (isFriendly && distance < 200.0f && !isDefender && (entry == WG_ENTRY_SIEGE_ENGINE_A || entry == WG_ENTRY_SIEGE_ENGINE_H || entry == WG_ENTRY_DEMOLISHER)) { // Count current escorts for this vehicle @@ -2420,7 +2426,7 @@ bool BGTactics::selectObjective(bool reset) { if (Unit* ally = botAI->GetUnit(allyGuid)) { - if (ally->GetDistance(v) < 50.0f && !ally->GetVehicle()) // Ally escorting this vehicle + if (ally->GetDistance(vehicle) < 50.0f && !ally->GetVehicle()) // Ally escorting this vehicle currentEscorts++; } } @@ -2432,10 +2438,10 @@ bool BGTactics::selectObjective(bool reset) else if (isLateGame && currentEscorts < 3) // Late game needs more protection shouldProvideEscort = (role % 6 == 5); - if (shouldProvideEscort && d < bestDist) + if (shouldProvideEscort && distance < bestDist) { - bestDist = d; - targetVehicle = v; + bestDist = distance; + targetVehicle = vehicle; shouldEscort = true; } } @@ -2495,8 +2501,8 @@ bool BGTactics::selectObjective(bool reset) // Priority 6: Vehicle acquisition (rank-aware and workshop-limited) if (shouldUseVehicles && !bot->GetVehicle() && hasWGRank) { - // Get current team vehicle count - uint32 currentVehicles = isDefender ? + // Get current team vehicle count (based on bot's actual team, not defender status) + uint32 currentVehicles = (bot->GetTeamId() == TEAM_ALLIANCE) ? bf->GetData(BATTLEFIELD_WG_DATA_VEHICLE_A) : bf->GetData(BATTLEFIELD_WG_DATA_VEHICLE_H); @@ -2507,13 +2513,13 @@ bool BGTactics::selectObjective(bool reset) Unit* bestVehicle = nullptr; float bestVehDist = FLT_MAX; - for (ObjectGuid const& vg : nearVehicles) + for (ObjectGuid const& vehicleGuid : nearVehicles) { - Unit* v = botAI->GetUnit(vg); - if (!v || !v->IsFriendlyTo(bot)) + Unit* vehicle = botAI->GetUnit(vehicleGuid); + if (!vehicle || !vehicle->IsFriendlyTo(bot)) continue; - uint32 entry = v->GetEntry(); + uint32 entry = vehicle->GetEntry(); // Rank-based vehicle access control bool canUseThisVehicle = false; @@ -2525,11 +2531,11 @@ bool BGTactics::selectObjective(bool reset) if (!canUseThisVehicle) continue; - float d = bot->GetDistance(v); - if (d < bestVehDist && d < 100.0f) + float distance = bot->GetDistance(vehicle); + if (distance < bestVehDist && distance < 100.0f) { - bestVehDist = d; - bestVehicle = v; + bestVehDist = distance; + bestVehicle = vehicle; } } @@ -4559,10 +4565,6 @@ bool BGTactics::atFlag(std::vector const& vPaths, std::vector Date: Wed, 5 Nov 2025 22:57:49 +0100 Subject: [PATCH 149/151] Prevents bots from entering IoC Catapults Adds logic to prevent bots from entering IoC Catapults by introducing a new constant for the vehicle entry ID. Updates the existing check to exclude both Keep Cannons and Catapults in Isle of Conquest while allowing WG tower cannons for defenders. Improves bot behavior consistency and ensures they avoid restricted vehicles in IoC. --- src/strategy/actions/VehicleActions.cpp | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/src/strategy/actions/VehicleActions.cpp b/src/strategy/actions/VehicleActions.cpp index 2f074ccd1e..c1f742681e 100644 --- a/src/strategy/actions/VehicleActions.cpp +++ b/src/strategy/actions/VehicleActions.cpp @@ -21,6 +21,10 @@ static constexpr float WG_GATE_X = 5162.991f; static constexpr float WG_GATE_Y = 2841.232f; static constexpr float WG_GATE_Z = 410.189f; +// IoC (Isle of Conquest) vehicle entries that bots should avoid +static constexpr uint32 NPC_KEEP_CANNON = 34929; // IoC Keep Cannon +static constexpr uint32 NPC_CATAPULT = 34935; // IoC Catapult + static inline bool HasWGRankAtLeast(Player* p) { // Any of the rank auras qualifies as ranked; specific vehicle types may require higher ranks (checked below) @@ -141,9 +145,9 @@ bool EnterVehicleAction::Execute(Event event) if (vehicleBase->HasUnitFlag(UNIT_FLAG_NOT_SELECTABLE)) continue; - // don't let them get in IoC cannons; allow WG tower cannons for defenders + // Don't let them get in IoC cannons (Keep Cannon & Catapult); allow WG tower cannons for defenders only uint32 entry = vehicleBase->GetEntry(); - if (NPC_KEEP_CANNON == entry || (!isWGDefender && entry == WG_TOWER_CANNON_ENTRY)) + if (NPC_KEEP_CANNON == entry || NPC_CATAPULT == entry || (!isWGDefender && entry == WG_TOWER_CANNON_ENTRY)) continue; // Enforce WG per-vehicle rank requirements when in WG From 4f96e6f2ce87ba241feb6ce7268744e1769e2843 Mon Sep 17 00:00:00 2001 From: Tecc Date: Wed, 5 Nov 2025 23:32:33 +0100 Subject: [PATCH 150/151] Codestyle fixes --- src/PlayerbotAIConfig.cpp | 14 ++++++++++---- src/strategy/actions/BattleGroundTactics.cpp | 13 +++++++++---- 2 files changed, 19 insertions(+), 8 deletions(-) diff --git a/src/PlayerbotAIConfig.cpp b/src/PlayerbotAIConfig.cpp index a4f065db40..2f5b7973fe 100644 --- a/src/PlayerbotAIConfig.cpp +++ b/src/PlayerbotAIConfig.cpp @@ -824,9 +824,12 @@ void PlayerbotAIConfig::loadWorldBuff() std::string token; while (std::getline(metaStream, token, ',')) { - try { + try + { ids.push_back(static_cast(std::stoi(token))); - } catch (...) { + } + catch (...) + { LOG_ERROR("playerbots", "Invalid meta token in [{}]", entry); break; } @@ -841,11 +844,14 @@ void PlayerbotAIConfig::loadWorldBuff() std::istringstream spellStream(spellPart); while (std::getline(spellStream, token, ',')) { - try { + try + { uint32 spellId = static_cast(std::stoi(token)); worldBuff wb = { spellId, ids[0], ids[1], ids[2], ids[3], ids[4] }; worldBuffs.push_back(wb); - } catch (...) { + } + catch (...) + { LOG_ERROR("playerbots", "Invalid spell ID in [{}]", entry); } } diff --git a/src/strategy/actions/BattleGroundTactics.cpp b/src/strategy/actions/BattleGroundTactics.cpp index 684b3ce9d5..e3d9dcfc4a 100644 --- a/src/strategy/actions/BattleGroundTactics.cpp +++ b/src/strategy/actions/BattleGroundTactics.cpp @@ -2034,7 +2034,8 @@ bool BGTactics::selectObjective(bool reset) if (bf->GetData(AREA_EASTSPARK_WORKSHOP) == teamIdData) workshopsControlled++; // SE Workshop // Fallback calculation if area data not available - if (workshopsControlled == 0) { + if (workshopsControlled == 0) + { // Use vehicle capacity as indicator of workshop control uint32 maxVehForTeam = (myTeam == TEAM_ALLIANCE) ? bf->GetData(BATTLEFIELD_WG_DATA_MAX_VEHICLE_A) : @@ -2053,7 +2054,8 @@ bool BGTactics::selectObjective(bool reset) bool relicAccessible = false; // Estimate fortress breach status based on battle progress and time - if (!isDefender) { + if (!isDefender) + { float progressEstimate = (1800.0f - timeRemaining) / 1800.0f; // 0.0 = start, 1.0 = end outerWallsDestroyed = (progressEstimate > 0.3f) || (brokenTowers >= 2); innerWallsDestroyed = (progressEstimate > 0.6f) || (brokenTowers >= 3); @@ -2073,9 +2075,12 @@ bool BGTactics::selectObjective(bool reset) // Time-based urgency adjustments float urgencyMultiplier = 1.0f; - if (isLateGame) { + if (isLateGame) + { urgencyMultiplier = 2.0f; // Double priority weights in final 10 minutes - } else if (timeRemaining < 900) { // Last 15 minutes + } + else if (timeRemaining < 900) // Last 15 minutes + { urgencyMultiplier = 1.5f; // 50% increase in urgency } From cb240a0feaa99ff439c9eba2b84796b6722a7b24 Mon Sep 17 00:00:00 2001 From: Tecc Date: Wed, 5 Nov 2025 23:35:06 +0100 Subject: [PATCH 151/151] remove blanklines (codestyle) --- src/strategy/actions/BattleGroundTactics.cpp | 2 -- 1 file changed, 2 deletions(-) diff --git a/src/strategy/actions/BattleGroundTactics.cpp b/src/strategy/actions/BattleGroundTactics.cpp index ea8911522b..1e0c35d20f 100644 --- a/src/strategy/actions/BattleGroundTactics.cpp +++ b/src/strategy/actions/BattleGroundTactics.cpp @@ -35,8 +35,6 @@ #include "ObjectAccessor.h" #include "TravelMgr.h" - - // common bg positions Position const WS_WAITING_POS_HORDE_1 = {944.981f, 1423.478f, 345.434f, 6.18f}; Position const WS_WAITING_POS_HORDE_2 = {948.488f, 1459.834f, 343.066f, 6.27f};