Skip to content

Commit

Permalink
Merge pull request #474 from liyunfan1223/fix-chat
Browse files Browse the repository at this point in the history
Fix chat and quest
  • Loading branch information
liyunfan1223 authored Aug 14, 2024
2 parents 9fd4c0b + c7f0fec commit c778e30
Show file tree
Hide file tree
Showing 7 changed files with 103 additions and 57 deletions.
98 changes: 49 additions & 49 deletions conf/playerbots.conf.dist
Original file line number Diff line number Diff line change
Expand Up @@ -1273,7 +1273,7 @@ AiPlayerbot.CommandPrefix = ""
AiPlayerbot.CommandSeparator = "\\\\"

# Enable playerbot talk (say / yell / general chatting / lfg)
AiPlayerbot.RandomBotTalk = 0
AiPlayerbot.RandomBotTalk = 1
# Enable playerbot emote
AiPlayerbot.RandomBotEmote = 0
# Enable dungeon suggestions for random bots
Expand Down Expand Up @@ -1301,7 +1301,7 @@ AiPlayerbot.RandomBotSayWithoutMaster = 0
# Broadcast rates
#
# 1 - to enable broadcasts globally, 0 - to disable (default 1)
# AiPlayerbot.EnableBroadcasts = 1
AiPlayerbot.EnableBroadcasts = 1
#
# all broadcast chances should be in range 0-30000
#
Expand All @@ -1310,66 +1310,66 @@ AiPlayerbot.RandomBotSayWithoutMaster = 0
#
# setting channel broadcast chance to 0, will re-route most broadcasts to other available channels
# setting all channel broadcasts to 0 will disable most broadcasts
# AiPlayerbot.BroadcastToGuildGlobalChance = 30000
# AiPlayerbot.BroadcastToWorldGlobalChance = 30000
# AiPlayerbot.BroadcastToGeneralGlobalChance = 30000
# AiPlayerbot.BroadcastToTradeGlobalChance = 30000
# AiPlayerbot.BroadcastToLFGGlobalChance = 30000
# AiPlayerbot.BroadcastToLocalDefenseGlobalChance = 30000
# AiPlayerbot.BroadcastToWorldDefenseGlobalChance = 30000
# AiPlayerbot.BroadcastToGuildRecruitmentGlobalChance = 30000
AiPlayerbot.BroadcastToGuildGlobalChance = 30000
AiPlayerbot.BroadcastToWorldGlobalChance = 30000
AiPlayerbot.BroadcastToGeneralGlobalChance = 30000
AiPlayerbot.BroadcastToTradeGlobalChance = 30000
AiPlayerbot.BroadcastToLFGGlobalChance = 30000
AiPlayerbot.BroadcastToLocalDefenseGlobalChance = 30000
AiPlayerbot.BroadcastToWorldDefenseGlobalChance = 30000
AiPlayerbot.BroadcastToGuildRecruitmentGlobalChance = 30000
#
# individual settings
# setting one of these to 0 will disable the particular broadcast
# AiPlayerbot.BroadcastChanceLootingItemPoor = 30
# AiPlayerbot.BroadcastChanceLootingItemNormal = 150
# AiPlayerbot.BroadcastChanceLootingItemUncommon = 10000
# AiPlayerbot.BroadcastChanceLootingItemRare = 20000
# AiPlayerbot.BroadcastChanceLootingItemEpic = 30000
# AiPlayerbot.BroadcastChanceLootingItemLegendary = 30000
# AiPlayerbot.BroadcastChanceLootingItemArtifact = 30000
#
# AiPlayerbot.BroadcastChanceQuestAccepted = 6000
# AiPlayerbot.BroadcastChanceQuestUpdateObjectiveCompleted = 300
# AiPlayerbot.BroadcastChanceQuestUpdateObjectiveProgress = 300
# AiPlayerbot.BroadcastChanceQuestUpdateFailedTimer = 300
# AiPlayerbot.BroadcastChanceQuestUpdateComplete = 1000
# AiPlayerbot.BroadcastChanceQuestTurnedIn = 10000
#
# AiPlayerbot.BroadcastChanceKillNormal = 30
# AiPlayerbot.BroadcastChanceKillElite = 300
# AiPlayerbot.BroadcastChanceKillRareelite = 3000
# AiPlayerbot.BroadcastChanceKillWorldboss = 20000
# AiPlayerbot.BroadcastChanceKillRare = 10000
# AiPlayerbot.BroadcastChanceKillUnknown = 100
# AiPlayerbot.BroadcastChanceKillPet = 10
# AiPlayerbot.BroadcastChanceKillPlayer = 30
#
# AiPlayerbot.BroadcastChanceLevelupGeneric = 20000
# AiPlayerbot.BroadcastChanceLevelupTenX = 30000
# AiPlayerbot.BroadcastChanceLevelupMaxLevel = 30000
#
# AiPlayerbot.BroadcastChanceSuggestInstance = 5000
# AiPlayerbot.BroadcastChanceSuggestQuest = 10000
# AiPlayerbot.BroadcastChanceSuggestGrindMaterials = 5000
# AiPlayerbot.BroadcastChanceSuggestGrindReputation = 5000
# AiPlayerbot.BroadcastChanceSuggestSell = 300
# AiPlayerbot.BroadcastChanceSuggestSomething = 30000
AiPlayerbot.BroadcastChanceLootingItemPoor = 30
AiPlayerbot.BroadcastChanceLootingItemNormal = 150
AiPlayerbot.BroadcastChanceLootingItemUncommon = 10000
AiPlayerbot.BroadcastChanceLootingItemRare = 20000
AiPlayerbot.BroadcastChanceLootingItemEpic = 30000
AiPlayerbot.BroadcastChanceLootingItemLegendary = 30000
AiPlayerbot.BroadcastChanceLootingItemArtifact = 30000
#
AiPlayerbot.BroadcastChanceQuestAccepted = 6000
AiPlayerbot.BroadcastChanceQuestUpdateObjectiveCompleted = 300
AiPlayerbot.BroadcastChanceQuestUpdateObjectiveProgress = 300
AiPlayerbot.BroadcastChanceQuestUpdateFailedTimer = 300
AiPlayerbot.BroadcastChanceQuestUpdateComplete = 1000
AiPlayerbot.BroadcastChanceQuestTurnedIn = 10000
#
AiPlayerbot.BroadcastChanceKillNormal = 30
AiPlayerbot.BroadcastChanceKillElite = 300
AiPlayerbot.BroadcastChanceKillRareelite = 3000
AiPlayerbot.BroadcastChanceKillWorldboss = 20000
AiPlayerbot.BroadcastChanceKillRare = 10000
AiPlayerbot.BroadcastChanceKillUnknown = 100
AiPlayerbot.BroadcastChanceKillPet = 10
AiPlayerbot.BroadcastChanceKillPlayer = 30
#
AiPlayerbot.BroadcastChanceLevelupGeneric = 20000
AiPlayerbot.BroadcastChanceLevelupTenX = 30000
AiPlayerbot.BroadcastChanceLevelupMaxLevel = 30000
#
AiPlayerbot.BroadcastChanceSuggestInstance = 5000
AiPlayerbot.BroadcastChanceSuggestQuest = 10000
AiPlayerbot.BroadcastChanceSuggestGrindMaterials = 5000
AiPlayerbot.BroadcastChanceSuggestGrindReputation = 5000
AiPlayerbot.BroadcastChanceSuggestSell = 300
AiPlayerbot.BroadcastChanceSuggestSomething = 30000
#
# Very rude speeches
# AiPlayerbot.BroadcastChanceSuggestSomethingToxic = 0
AiPlayerbot.BroadcastChanceSuggestSomethingToxic = 0
#
# Specifically for "<word> [item link]"
# AiPlayerbot.BroadcastChanceSuggestToxicLinks = 0
AiPlayerbot.BroadcastChanceSuggestToxicLinks = 0
#
# prefix is used as a word in "<word> [item link]"
# AiPlayerbot.ToxicLinksPrefix = gnomes
AiPlayerbot.ToxicLinksPrefix = gnomes
#
# chance to suggest thunderfury
# AiPlayerbot.BroadcastChanceSuggestThunderfury = 1
AiPlayerbot.BroadcastChanceSuggestThunderfury = 1
#
# does not depend on global chance
# AiPlayerbot.BroadcastChanceGuildManagement = 30000
AiPlayerbot.BroadcastChanceGuildManagement = 30000
#
####################################################################################################

Expand Down
40 changes: 40 additions & 0 deletions src/BroadcastHelper.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -63,6 +63,8 @@ bool BroadcastHelper::BroadcastTest(PlayerbotAI* ai, Player* bot)
*/
bool BroadcastHelper::BroadcastToChannelWithGlobalChance(PlayerbotAI* ai, std::string message, std::list<std::pair<ToChannel, uint32>> toChannels)
{
if (!sPlayerbotAIConfig->enableBroadcasts)
return false;
if (message.empty())
{
return false;
Expand Down Expand Up @@ -166,6 +168,8 @@ bool BroadcastHelper::BroadcastToChannelWithGlobalChance(PlayerbotAI* ai, std::s

bool BroadcastHelper::BroadcastLootingItem(PlayerbotAI* ai, Player* bot, const ItemTemplate *proto)
{
if (!sPlayerbotAIConfig->enableBroadcasts)
return false;
std::map<std::string, std::string> placeholders;
placeholders["%item_link"] = ai->GetChatHelper()->FormatItem(proto);
AreaTableEntry const* current_area = ai->GetCurrentArea();
Expand Down Expand Up @@ -257,6 +261,8 @@ bool BroadcastHelper::BroadcastLootingItem(PlayerbotAI* ai, Player* bot, const I

bool BroadcastHelper::BroadcastQuestAccepted(PlayerbotAI* ai, Player* bot, const Quest* quest)
{
if (!sPlayerbotAIConfig->enableBroadcasts)
return false;
if (urand(1, sPlayerbotAIConfig->broadcastChanceMaxValue) <= sPlayerbotAIConfig->broadcastChanceQuestAccepted)
{
std::map<std::string, std::string> placeholders;
Expand All @@ -281,6 +287,8 @@ bool BroadcastHelper::BroadcastQuestAccepted(PlayerbotAI* ai, Player* bot, const

bool BroadcastHelper::BroadcastQuestUpdateAddKill(PlayerbotAI* ai, Player* bot, Quest const* quest, uint32 availableCount, uint32 requiredCount, std::string obectiveName)
{
if (!sPlayerbotAIConfig->enableBroadcasts)
return false;
std::map<std::string, std::string> placeholders;
AreaTableEntry const* current_area = ai->GetCurrentArea();
AreaTableEntry const* current_zone = ai->GetCurrentZone();
Expand Down Expand Up @@ -320,6 +328,8 @@ bool BroadcastHelper::BroadcastQuestUpdateAddKill(PlayerbotAI* ai, Player* bot,

bool BroadcastHelper::BroadcastQuestUpdateAddItem(PlayerbotAI* ai, Player* bot, Quest const* quest, uint32 availableCount, uint32 requiredCount, const ItemTemplate* proto)
{
if (!sPlayerbotAIConfig->enableBroadcasts)
return false;
std::map<std::string, std::string> placeholders;
AreaTableEntry const* current_area = ai->GetCurrentArea();
AreaTableEntry const* current_zone = ai->GetCurrentZone();
Expand Down Expand Up @@ -360,6 +370,8 @@ bool BroadcastHelper::BroadcastQuestUpdateAddItem(PlayerbotAI* ai, Player* bot,

bool BroadcastHelper::BroadcastQuestUpdateFailedTimer(PlayerbotAI* ai, Player* bot, Quest const* quest)
{
if (!sPlayerbotAIConfig->enableBroadcasts)
return false;
if (urand(1, sPlayerbotAIConfig->broadcastChanceMaxValue) <= sPlayerbotAIConfig->broadcastChanceQuestUpdateFailedTimer)
{
std::map<std::string, std::string> placeholders;
Expand All @@ -384,6 +396,8 @@ bool BroadcastHelper::BroadcastQuestUpdateFailedTimer(PlayerbotAI* ai, Player* b

bool BroadcastHelper::BroadcastQuestUpdateComplete(PlayerbotAI* ai, Player* bot, Quest const* quest)
{
if (!sPlayerbotAIConfig->enableBroadcasts)
return false;
if (urand(1, sPlayerbotAIConfig->broadcastChanceMaxValue) <= sPlayerbotAIConfig->broadcastChanceQuestUpdateComplete)
{
std::map<std::string, std::string> placeholders;
Expand All @@ -409,6 +423,8 @@ bool BroadcastHelper::BroadcastQuestUpdateComplete(PlayerbotAI* ai, Player* bot,

bool BroadcastHelper::BroadcastQuestTurnedIn(PlayerbotAI* ai, Player* bot, Quest const* quest)
{
if (!sPlayerbotAIConfig->enableBroadcasts)
return false;
if (urand(1, sPlayerbotAIConfig->broadcastChanceMaxValue) <= sPlayerbotAIConfig->broadcastChanceQuestTurnedIn)
{
std::map<std::string, std::string> placeholders;
Expand All @@ -433,6 +449,8 @@ bool BroadcastHelper::BroadcastQuestTurnedIn(PlayerbotAI* ai, Player* bot, Quest

bool BroadcastHelper::BroadcastKill(PlayerbotAI* ai, Player* bot, Creature *creature)
{
if (!sPlayerbotAIConfig->enableBroadcasts)
return false;
std::map<std::string, std::string> placeholders;
placeholders["%victim_name"] = creature->GetName();
AreaTableEntry const* current_area = ai->GetCurrentArea();
Expand Down Expand Up @@ -547,6 +565,8 @@ bool BroadcastHelper::BroadcastKill(PlayerbotAI* ai, Player* bot, Creature *crea

bool BroadcastHelper::BroadcastLevelup(PlayerbotAI* ai, Player* bot)
{
if (!sPlayerbotAIConfig->enableBroadcasts)
return false;
uint32 level = bot->GetLevel();

std::map<std::string, std::string> placeholders;
Expand Down Expand Up @@ -591,6 +611,8 @@ bool BroadcastHelper::BroadcastLevelup(PlayerbotAI* ai, Player* bot)

bool BroadcastHelper::BroadcastGuildMemberPromotion(PlayerbotAI* ai, Player* bot, Player* player)
{
if (!sPlayerbotAIConfig->enableBroadcasts)
return false;
if (urand(1, sPlayerbotAIConfig->broadcastChanceMaxValue) <= sPlayerbotAIConfig->broadcastChanceGuildManagement)
{
std::map<std::string, std::string> placeholders;
Expand Down Expand Up @@ -623,6 +645,8 @@ bool BroadcastHelper::BroadcastGuildMemberDemotion(PlayerbotAI* ai, Player* bot,

bool BroadcastHelper::BroadcastGuildGroupOrRaidInvite(PlayerbotAI* ai, Player* bot, Player* player, Group* group)
{
if (!sPlayerbotAIConfig->enableBroadcasts)
return false;
std::map<std::string, std::string> placeholders;
placeholders["%name"] = player->GetName();
AreaTableEntry const* current_area = ai->GetCurrentArea();
Expand Down Expand Up @@ -660,6 +684,8 @@ bool BroadcastHelper::BroadcastGuildGroupOrRaidInvite(PlayerbotAI* ai, Player* b

bool BroadcastHelper::BroadcastSuggestInstance(PlayerbotAI* ai, std::vector<std::string>& allowedInstances, Player* bot)
{
if (!sPlayerbotAIConfig->enableBroadcasts)
return false;
if (urand(1, sPlayerbotAIConfig->broadcastChanceMaxValue) <= sPlayerbotAIConfig->broadcastChanceSuggestInstance)
{
std::map<std::string, std::string> placeholders;
Expand All @@ -686,6 +712,8 @@ bool BroadcastHelper::BroadcastSuggestInstance(PlayerbotAI* ai, std::vector<std:

bool BroadcastHelper::BroadcastSuggestQuest(PlayerbotAI* ai, std::vector<uint32>& quests, Player* bot)
{
if (!sPlayerbotAIConfig->enableBroadcasts)
return false;
if (urand(1, sPlayerbotAIConfig->broadcastChanceMaxValue) <= sPlayerbotAIConfig->broadcastChanceSuggestQuest)
{

Expand Down Expand Up @@ -713,6 +741,8 @@ bool BroadcastHelper::BroadcastSuggestQuest(PlayerbotAI* ai, std::vector<uint32>

bool BroadcastHelper::BroadcastSuggestGrindMaterials(PlayerbotAI* ai, std::string item, Player* bot)
{
if (!sPlayerbotAIConfig->enableBroadcasts)
return false;
if (urand(1, sPlayerbotAIConfig->broadcastChanceMaxValue) <= sPlayerbotAIConfig->broadcastChanceSuggestGrindMaterials)
{

Expand All @@ -736,6 +766,8 @@ bool BroadcastHelper::BroadcastSuggestGrindMaterials(PlayerbotAI* ai, std::strin

bool BroadcastHelper::BroadcastSuggestGrindReputation(PlayerbotAI* ai, std::vector<std::string> levels, std::vector<std::string> allowedFactions, Player* bot)
{
if (!sPlayerbotAIConfig->enableBroadcasts)
return false;
if (urand(1, sPlayerbotAIConfig->broadcastChanceMaxValue) <= sPlayerbotAIConfig->broadcastChanceSuggestGrindReputation)
{

Expand Down Expand Up @@ -766,6 +798,8 @@ bool BroadcastHelper::BroadcastSuggestGrindReputation(PlayerbotAI* ai, std::vect

bool BroadcastHelper::BroadcastSuggestSell(PlayerbotAI* ai, const ItemTemplate* proto, uint32 count, uint32 price, Player* bot)
{
if (!sPlayerbotAIConfig->enableBroadcasts)
return false;
if (urand(1, sPlayerbotAIConfig->broadcastChanceMaxValue) <= sPlayerbotAIConfig->broadcastChanceSuggestSell)
{

Expand All @@ -791,6 +825,8 @@ bool BroadcastHelper::BroadcastSuggestSell(PlayerbotAI* ai, const ItemTemplate*

bool BroadcastHelper::BroadcastSuggestSomething(PlayerbotAI* ai, Player* bot)
{
if (!sPlayerbotAIConfig->enableBroadcasts)
return false;
if (urand(1, sPlayerbotAIConfig->broadcastChanceMaxValue) <= sPlayerbotAIConfig->broadcastChanceSuggestSomething)
{
std::map<std::string, std::string> placeholders;
Expand All @@ -816,6 +852,8 @@ bool BroadcastHelper::BroadcastSuggestSomething(PlayerbotAI* ai, Player* bot)

bool BroadcastHelper::BroadcastSuggestSomethingToxic(PlayerbotAI* ai, Player* bot)
{
if (!sPlayerbotAIConfig->enableBroadcasts)
return false;
if (urand(1, sPlayerbotAIConfig->broadcastChanceMaxValue) <= sPlayerbotAIConfig->broadcastChanceSuggestSomethingToxic)
{
//items
Expand Down Expand Up @@ -846,6 +884,8 @@ bool BroadcastHelper::BroadcastSuggestSomethingToxic(PlayerbotAI* ai, Player* bo

bool BroadcastHelper::BroadcastSuggestToxicLinks(PlayerbotAI* ai, Player* bot)
{
if (!sPlayerbotAIConfig->enableBroadcasts)
return false;
if (urand(1, sPlayerbotAIConfig->broadcastChanceMaxValue) <= sPlayerbotAIConfig->broadcastChanceSuggestToxicLinks)
{
//quests
Expand Down
5 changes: 4 additions & 1 deletion src/PlayerbotAI.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -190,6 +190,7 @@ PlayerbotAI::PlayerbotAI(Player* bot)
masterOutgoingPacketHandlers.AddHandler(SMSG_PARTY_COMMAND_RESULT, "party command");
masterOutgoingPacketHandlers.AddHandler(MSG_RAID_READY_CHECK, "ready check");
masterOutgoingPacketHandlers.AddHandler(MSG_RAID_READY_CHECK_FINISHED, "ready check finished");
masterOutgoingPacketHandlers.AddHandler(SMSG_QUESTGIVER_OFFER_REWARD, "questgiver quest details");

// quest packet
masterIncomingPacketHandlers.AddHandler(CMSG_QUESTGIVER_COMPLETE_QUEST, "complete quest");
Expand Down Expand Up @@ -934,9 +935,11 @@ void PlayerbotAI::HandleBotOutgoingPacket(WorldPacket const& packet)
}
case SMSG_MESSAGECHAT: // do not react to self or if not ready to reply
{
if (!sPlayerbotAIConfig->randomBotTalk)
return;

if (!AllowActivity())
return;

WorldPacket p(packet);
if (!p.empty() && (p.GetOpcode() == SMSG_MESSAGECHAT || p.GetOpcode() == SMSG_GM_MESSAGECHAT))
{
Expand Down
4 changes: 2 additions & 2 deletions src/strategy/actions/AcceptQuestAction.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -171,7 +171,7 @@ bool ConfirmQuestAction::Execute(Event event)
if (!bot->CanTakeQuest(qInfo, false))
{
// can't take quest
botAI->TellError("quest_cant_take");
// botAI->TellError("quest_cant_take");
return false;
}

Expand All @@ -187,7 +187,7 @@ bool ConfirmQuestAction::Execute(Event event)
bot->CastSpell(bot, qInfo->GetSrcSpell(), true);
}

botAI->TellMaster("quest_accept");
// botAI->TellMaster("quest_accept");
return true;
}

Expand Down
6 changes: 4 additions & 2 deletions src/strategy/actions/AutoLearnSpellAction.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -34,10 +34,12 @@ bool AutoLearnSpellAction::Execute(Event event)
void AutoLearnSpellAction::LearnSpells(std::ostringstream* out)
{
BroadcastHelper::BroadcastLevelup(botAI, bot);
if (sPlayerbotAIConfig->autoLearnTrainerSpells)
if (sPlayerbotAIConfig->autoLearnTrainerSpells &&
sRandomPlayerbotMgr->IsRandomBot(bot))
LearnTrainerSpells(out);

if (sPlayerbotAIConfig->autoLearnQuestSpells)
if (sPlayerbotAIConfig->autoLearnQuestSpells &&
sRandomPlayerbotMgr->IsRandomBot(bot))
LearnQuestSpells(out);
}

Expand Down
4 changes: 2 additions & 2 deletions src/strategy/actions/LootAction.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -419,10 +419,10 @@ bool StoreLootAction::Execute(Event event)
packet << itemindex;
bot->GetSession()->HandleAutostoreLootItemOpcode(packet);

if (proto->Quality > ITEM_QUALITY_NORMAL && !urand(0, 50) && botAI->HasStrategy("emote", BOT_STATE_NON_COMBAT))
if (proto->Quality > ITEM_QUALITY_NORMAL && !urand(0, 50) && botAI->HasStrategy("emote", BOT_STATE_NON_COMBAT) && sPlayerbotAIConfig->randomBotEmote)
botAI->PlayEmote(TEXT_EMOTE_CHEER);

if (proto->Quality >= ITEM_QUALITY_RARE && !urand(0, 1) && botAI->HasStrategy("emote", BOT_STATE_NON_COMBAT))
if (proto->Quality >= ITEM_QUALITY_RARE && !urand(0, 1) && botAI->HasStrategy("emote", BOT_STATE_NON_COMBAT) && sPlayerbotAIConfig->randomBotEmote)
botAI->PlayEmote(TEXT_EMOTE_CHEER);

BroadcastHelper::BroadcastLootingItem(botAI, bot, proto);
Expand Down
3 changes: 2 additions & 1 deletion src/strategy/generic/EmoteStrategy.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,7 @@ void EmoteStrategy::InitTriggers(std::vector<TriggerNode*>& triggers)
{
if (sPlayerbotAIConfig->randomBotEmote)
{
triggers.push_back(new TriggerNode("often", NextAction::array(0, new NextAction("talk", 1.0f), nullptr)));
triggers.push_back(new TriggerNode("seldom", NextAction::array(0, new NextAction("emote", 1.0f), nullptr)));
triggers.push_back(
new TriggerNode("receive text emote", NextAction::array(0, new NextAction("emote", 10.0f), nullptr)));
Expand All @@ -23,7 +24,7 @@ void EmoteStrategy::InitTriggers(std::vector<TriggerNode*>& triggers)
triggers.push_back(new TriggerNode(
"often",
NextAction::array(0, new NextAction("suggest what to do", 10.0f), new NextAction("suggest dungeon", 3.0f),
new NextAction("suggest trade", 3.0f), new NextAction("talk", 1.0f), nullptr)));
new NextAction("suggest trade", 3.0f), nullptr)));
}

if (sPlayerbotAIConfig->enableGreet)
Expand Down

0 comments on commit c778e30

Please sign in to comment.