Chat tweak, guild bots management tooggle

This commit is contained in:
Atidot3
2024-08-04 10:14:07 +02:00
parent 6e41c87e93
commit 7227211ddf
8 changed files with 127 additions and 39 deletions

View File

@@ -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

View File

@@ -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)
{

View File

@@ -105,6 +105,9 @@ bool PlayerbotAIConfig::Initialize()
iterationsPerTick = sConfigMgr->GetOption<int32>("AiPlayerbot.IterationsPerTick", 100);
allowGuildBots = sConfigMgr->GetOption<bool>("AiPlayerbot.AllowGuildBots", true);
randomBotGuildNearby = sConfigMgr->GetOption<bool>("AiPlayerbot.RandomBotGuildNearby", false);
randomBotInvitePlayer = sConfigMgr->GetOption<bool>("AiPlayerbot.RandomBotInvitePlayer", false);
inviteChat = sConfigMgr->GetOption<bool>("AiPlayerbot.InviteChat", false);
allowPlayerBots = sConfigMgr->GetOption<bool>("AiPlayerbot.AllowPlayerBots", false);
randomBotMapsAsString = sConfigMgr->GetOption<std::string>("AiPlayerbot.RandomBotMaps", "0,1,530,571");

View File

@@ -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;

View File

@@ -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;

View File

@@ -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<std::string, std::string> 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<std::string> 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;

View File

@@ -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";

View File

@@ -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<std::string, uint8> instances;
};