From 7227211ddf1f444c1589035aef5ace1018ca83fd Mon Sep 17 00:00:00 2001 From: Atidot3 Date: Sun, 4 Aug 2024 10:14:07 +0200 Subject: [PATCH] Chat tweak, guild bots management tooggle --- conf/playerbots.conf.dist | 9 ++ src/AiFactory.cpp | 2 +- src/PlayerbotAIConfig.cpp | 3 + src/PlayerbotAIConfig.h | 1 + src/strategy/actions/DropQuestAction.cpp | 2 +- .../actions/GuildManagementActions.cpp | 145 ++++++++++++++---- .../actions/SuggestWhatToDoAction.cpp | 2 +- src/strategy/actions/SuggestWhatToDoAction.h | 2 - 8 files changed, 127 insertions(+), 39 deletions(-) diff --git a/conf/playerbots.conf.dist b/conf/playerbots.conf.dist index 876b1b99..cdfdf522 100644 --- a/conf/playerbots.conf.dist +++ b/conf/playerbots.conf.dist @@ -128,6 +128,15 @@ AiPlayerbot.AllowPlayerBots = 0 # Allow/deny bots from your guild AiPlayerbot.AllowGuildBots = 1 +# Randombots will invite nearby bots to guilds +AiPlayerbot.RandomBotGuildNearby = 0 + +# Randombots will invite players to groups/raids/guilds. +AiPlayerbot.RandomBotInvitePlayer = 0 + +# Bots will chat in say/guild when they invite other bots to groups/raids/guilds +AiPlayerbot.InviteChat = 0 + # Bots will be summoned to player when accept group invitation AiPlayerbot.SummonWhenGroup = 1 diff --git a/src/AiFactory.cpp b/src/AiFactory.cpp index f1f59e00..86d80d3b 100644 --- a/src/AiFactory.cpp +++ b/src/AiFactory.cpp @@ -272,7 +272,7 @@ void AiFactory::AddDefaultCombatStrategies(Player* player, PlayerbotAI* const fa if (!player->InBattleground()) { - engine->addStrategies("racials", "chat", "default", "cast time", "duel", "boost", "emote", nullptr); + engine->addStrategies("racials", "chat", "default", "cast time", "duel", "boost", nullptr); } if (sPlayerbotAIConfig->autoSaveMana) { diff --git a/src/PlayerbotAIConfig.cpp b/src/PlayerbotAIConfig.cpp index 0f7d0272..629ff418 100644 --- a/src/PlayerbotAIConfig.cpp +++ b/src/PlayerbotAIConfig.cpp @@ -105,6 +105,9 @@ bool PlayerbotAIConfig::Initialize() iterationsPerTick = sConfigMgr->GetOption("AiPlayerbot.IterationsPerTick", 100); allowGuildBots = sConfigMgr->GetOption("AiPlayerbot.AllowGuildBots", true); + randomBotGuildNearby = sConfigMgr->GetOption("AiPlayerbot.RandomBotGuildNearby", false); + randomBotInvitePlayer = sConfigMgr->GetOption("AiPlayerbot.RandomBotInvitePlayer", false); + inviteChat = sConfigMgr->GetOption("AiPlayerbot.InviteChat", false); allowPlayerBots = sConfigMgr->GetOption("AiPlayerbot.AllowPlayerBots", false); randomBotMapsAsString = sConfigMgr->GetOption("AiPlayerbot.RandomBotMaps", "0,1,530,571"); diff --git a/src/PlayerbotAIConfig.h b/src/PlayerbotAIConfig.h index fe9596a3..acc39142 100644 --- a/src/PlayerbotAIConfig.h +++ b/src/PlayerbotAIConfig.h @@ -54,6 +54,7 @@ class PlayerbotAIConfig bool enabled; bool allowGuildBots, allowPlayerBots; + bool randomBotGuildNearby, randomBotInvitePlayer, inviteChat; uint32 globalCoolDown, reactDelay, maxWaitForMove, disableMoveSplinePath, maxMovementSearchTime, expireActionTime, dispelAuraDuration, passiveDelay, repeatDelay, errorDelay, rpgDelay, sitDelay, returnDelay, lootDelay; diff --git a/src/strategy/actions/DropQuestAction.cpp b/src/strategy/actions/DropQuestAction.cpp index cb2ea770..9cef44c1 100644 --- a/src/strategy/actions/DropQuestAction.cpp +++ b/src/strategy/actions/DropQuestAction.cpp @@ -60,7 +60,7 @@ bool CleanQuestLogAction::Execute(Event event) { Player* requester = event.getOwner() ? event.getOwner() : GetMaster(); std::string link = event.getParam(); - if (botAI->HasActivePlayerMaster()) + if (botAI->HasActivePlayerMaster() || !sRandomPlayerbotMgr->IsRandomBot(bot)) return false; uint8 totalQuests = 0; diff --git a/src/strategy/actions/GuildManagementActions.cpp b/src/strategy/actions/GuildManagementActions.cpp index b7316f27..e0dddff3 100644 --- a/src/strategy/actions/GuildManagementActions.cpp +++ b/src/strategy/actions/GuildManagementActions.cpp @@ -159,64 +159,141 @@ bool GuildManageNearbyAction::Execute(Event event) if (!player || bot == player) continue; - if (player->GetGuildId()) //Promote or demote nearby members based on chance. + if (player->isDND()) + continue; + + + if (player->GetGuildId() && player->GetGuildId() == bot->GetGuildId()) //Promote or demote nearby members based on chance. { Guild::Member* member = guild->GetMember(player->GetGUID()); uint32 dCount = AI_VALUE(uint32, "death count"); - if ((dCount < 2 || !urand(0, 10)) && guild->GetRankRights(botMember->GetRankId() & GR_RIGHT_PROMOTE)) + if (!urand(0, 30) && dCount < 2 && guild->GetRankRights(botMember->GetRankId()) & GR_RIGHT_PROMOTE) { - if (!urand(0, 10)) - { - BroadcastHelper::BroadcastGuildMemberPromotion(botAI, bot, player); - botAI->DoSpecificAction("guild promote", Event("guild management", guid), true); + BroadcastHelper::BroadcastGuildMemberPromotion(botAI, bot, player); - continue; - } + botAI->DoSpecificAction("guild promote", Event("guild management", guid), true); + continue; } - if ((dCount > 3 || !urand(0, 10)) && guild->GetRankRights(botMember->GetRankId() & GR_RIGHT_DEMOTE)) + if (!urand(0, 30) && dCount > 2 && guild->GetRankRights(botMember->GetRankId()) & GR_RIGHT_DEMOTE) { - if (!urand(0, 10)) - { - botAI->DoSpecificAction("guild demote", Event("guild management", guid), true); + BroadcastHelper::BroadcastGuildMemberDemotion(botAI, bot, player); - continue; - } + botAI->DoSpecificAction("guild demote", Event("guild management", guid), true); + continue; } continue; } - if (!(guild->GetRankRights(botMember->GetRankId()) & GR_RIGHT_INVITE)) + if (!sPlayerbotAIConfig->randomBotGuildNearby) + return false; + + if (guild->GetMemberSize() > 1000) + return false; + + if ( (guild->GetRankRights(botMember->GetRankId()) & GR_RIGHT_INVITE) == 0) continue; if (player->GetGuildIdInvited()) continue; - PlayerbotAI* botAI = GET_PLAYERBOT_AI(player); + PlayerbotAI* botAi = GET_PLAYERBOT_AI(player); - if (botAI) - { - - if (botAI->GetGuilderType() == GuilderType::SOLO && !botAI->HasRealPlayerMaster()) //Do not invite solo players. - continue; - - - if (botAI->HasActivePlayerMaster()) //Do not invite alts of active players. - continue; - } - else - { - if (!sPlayerbotAIConfig->randomBotGroupNearby) - return false; - } - - if (sServerFacade->GetDistance2d(bot, player) > sPlayerbotAIConfig->sightDistance) + if (!sPlayerbotAIConfig->randomBotInvitePlayer && botAi && botAi->IsRealPlayer()) continue; - if (botAI && botAI->DoSpecificAction("ginvite", Event("guild management", guid))) + if (botAi) + { + if (botAi->GetGuilderType() == GuilderType::SOLO && !botAi->HasRealPlayerMaster()) //Do not invite solo players. + continue; + + if (botAi->HasActivePlayerMaster() && !sRandomPlayerbotMgr->IsRandomBot(player)) //Do not invite alts of active players. + continue; + } + + bool sameGroup = bot->GetGroup() && bot->GetGroup()->IsMember(player->GetGUID()); + + if (!sameGroup && sServerFacade->GetDistance2d(bot, player) > sPlayerbotAIConfig->spellDistance) + continue; + + if (sPlayerbotAIConfig->inviteChat && (sRandomPlayerbotMgr->IsRandomBot(bot) || !botAI->HasActivePlayerMaster())) + { + std::map placeholders; + placeholders["%name"] = player->GetName(); + placeholders["%members"] = std::to_string(guild->GetMemberSize()); + placeholders["%guildname"] = guild->GetName(); + AreaTableEntry const* current_area = botAI->GetCurrentArea(); + AreaTableEntry const* current_zone = botAI->GetCurrentZone(); + placeholders["%area_name"] = current_area ? current_area->area_name[BroadcastHelper::GetLocale()] : BOT_TEXT1("string_unknown_area"); + placeholders["%zone_name"] = current_zone ? current_zone->area_name[BroadcastHelper::GetLocale()] : BOT_TEXT1("string_unknown_area"); + + std::vector lines; + + //TODO - Move these hardcoded texts to sql! + switch ((urand(0, 10) * urand(0, 10)) / 10) + { + case 0: + lines.push_back(BOT_TEXT2("Hey %name do you want to join my guild?", placeholders)); + break; + case 1: + lines.push_back(BOT_TEXT2("Hey man you wanna join my guild %name?", placeholders)); + break; + case 2: + lines.push_back(BOT_TEXT2("I think you would be a good contribution to %guildname. Would you like to join %name?", placeholders)); + break; + case 3: + lines.push_back(BOT_TEXT2("My guild %guildname has %members quality members. Would you like to make it 1 more %name?", placeholders)); + break; + case 4: + lines.push_back(BOT_TEXT2("Hey %name do you want to join %guildname? We have %members members and looking to become number 1 of the server.", placeholders)); + break; + case 5: + lines.push_back(BOT_TEXT2("I'm not really good at smalltalk. Do you wanna join my guild %name/r?", placeholders)); + break; + case 6: + lines.push_back(BOT_TEXT2("Welcome to %zone_name.... do you want to join my guild %name?", placeholders)); + break; + case 7: + lines.push_back(BOT_TEXT2("%name, you should join my guild!", placeholders)); + break; + case 8: + lines.push_back(BOT_TEXT2("%name, I got this guild....", placeholders)); + break; + case 9: + lines.push_back(BOT_TEXT2("You are actually going to join my guild %name?", placeholders)); + lines.push_back(BOT_TEXT2("Haha.. you are the man! We are going to raid Molten...", placeholders)); + break; + case 10: + lines.push_back(BOT_TEXT2("Hey Hey! do you guys wanna join my gild????", placeholders)); + lines.push_back(BOT_TEXT2("We've got a bunch of high levels and we are really super friendly..", placeholders)); + lines.push_back(BOT_TEXT2("..and watch your dog and do your homework...", placeholders)); + lines.push_back(BOT_TEXT2("..and we raid once a week and are working on MC raids...", placeholders)); + lines.push_back(BOT_TEXT2("..and we have more members than just me...", placeholders)); + lines.push_back(BOT_TEXT2("..and please stop I'm lonenly and we can get a ride the whole time...", placeholders)); + lines.push_back(BOT_TEXT2("..and it's really beautifull and I feel like crying...", placeholders)); + lines.push_back(BOT_TEXT2("So what do you guys say are you going to join are you going to join?", placeholders)); + break; + } + + for (auto line : lines) + if (sameGroup) + { + WorldPacket data; + ChatHandler::BuildChatPacket(data, bot->GetGroup()->isRaidGroup() ? CHAT_MSG_RAID : CHAT_MSG_PARTY, line.c_str(), LANG_UNIVERSAL, CHAT_TAG_NONE, bot->GetGUID(), bot->GetName()); + bot->GetGroup()->BroadcastPacket(&data, true); + } + else + bot->Say(line, (bot->GetTeamId() == TEAM_ALLIANCE ? LANG_COMMON : LANG_ORCISH)); + } + + if (botAI->DoSpecificAction("guild invite", Event("guild management", guid), true)) + { + if (sPlayerbotAIConfig->inviteChat) + return true; found++; + } } return found > 0; diff --git a/src/strategy/actions/SuggestWhatToDoAction.cpp b/src/strategy/actions/SuggestWhatToDoAction.cpp index 699cf858..013fb989 100644 --- a/src/strategy/actions/SuggestWhatToDoAction.cpp +++ b/src/strategy/actions/SuggestWhatToDoAction.cpp @@ -42,7 +42,7 @@ SuggestWhatToDoAction::SuggestWhatToDoAction(PlayerbotAI* botAI, std::string con bool SuggestWhatToDoAction::isUseful() { - if (!sRandomPlayerbotMgr->IsRandomBot(bot) || bot->GetGroup() || bot->GetInstanceId()) + if (!sRandomPlayerbotMgr->IsRandomBot(bot) || bot->GetGroup() || bot->GetInstanceId() || bot->GetBattleground()) return false; std::string qualifier = "suggest what to do"; diff --git a/src/strategy/actions/SuggestWhatToDoAction.h b/src/strategy/actions/SuggestWhatToDoAction.h index 9548737c..e6a46c36 100644 --- a/src/strategy/actions/SuggestWhatToDoAction.h +++ b/src/strategy/actions/SuggestWhatToDoAction.h @@ -41,7 +41,6 @@ class SuggestTradeAction : public SuggestWhatToDoAction SuggestTradeAction(PlayerbotAI* botAI); bool Execute(Event event) override; - bool isUseful() override { return true; } }; class SuggestDungeonAction : public SuggestWhatToDoAction @@ -50,7 +49,6 @@ class SuggestDungeonAction : public SuggestWhatToDoAction SuggestDungeonAction(PlayerbotAI* botAI); bool Execute(Event event) override; - bool isUseful() override { return true; } private: static std::map instances; };