diff --git a/conf/playerbots.conf.dist b/conf/playerbots.conf.dist index 4fbf9c77..e9d6b734 100644 --- a/conf/playerbots.conf.dist +++ b/conf/playerbots.conf.dist @@ -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 @@ -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 # @@ -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.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.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.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.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.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 " [item link]" -# AiPlayerbot.BroadcastChanceSuggestToxicLinks = 0 +AiPlayerbot.BroadcastChanceSuggestToxicLinks = 0 # # prefix is used as a word in " [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 # #################################################################################################### diff --git a/src/BroadcastHelper.cpp b/src/BroadcastHelper.cpp index 19cd98d9..58c47ae7 100644 --- a/src/BroadcastHelper.cpp +++ b/src/BroadcastHelper.cpp @@ -63,6 +63,8 @@ bool BroadcastHelper::BroadcastTest(PlayerbotAI* ai, Player* bot) */ bool BroadcastHelper::BroadcastToChannelWithGlobalChance(PlayerbotAI* ai, std::string message, std::list> toChannels) { + if (!sPlayerbotAIConfig->enableBroadcasts) + return false; if (message.empty()) { return false; @@ -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 placeholders; placeholders["%item_link"] = ai->GetChatHelper()->FormatItem(proto); AreaTableEntry const* current_area = ai->GetCurrentArea(); @@ -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 placeholders; @@ -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 placeholders; AreaTableEntry const* current_area = ai->GetCurrentArea(); AreaTableEntry const* current_zone = ai->GetCurrentZone(); @@ -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 placeholders; AreaTableEntry const* current_area = ai->GetCurrentArea(); AreaTableEntry const* current_zone = ai->GetCurrentZone(); @@ -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 placeholders; @@ -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 placeholders; @@ -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 placeholders; @@ -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 placeholders; placeholders["%victim_name"] = creature->GetName(); AreaTableEntry const* current_area = ai->GetCurrentArea(); @@ -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 placeholders; @@ -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 placeholders; @@ -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 placeholders; placeholders["%name"] = player->GetName(); AreaTableEntry const* current_area = ai->GetCurrentArea(); @@ -660,6 +684,8 @@ bool BroadcastHelper::BroadcastGuildGroupOrRaidInvite(PlayerbotAI* ai, Player* b bool BroadcastHelper::BroadcastSuggestInstance(PlayerbotAI* ai, std::vector& allowedInstances, Player* bot) { + if (!sPlayerbotAIConfig->enableBroadcasts) + return false; if (urand(1, sPlayerbotAIConfig->broadcastChanceMaxValue) <= sPlayerbotAIConfig->broadcastChanceSuggestInstance) { std::map placeholders; @@ -686,6 +712,8 @@ bool BroadcastHelper::BroadcastSuggestInstance(PlayerbotAI* ai, std::vector& quests, Player* bot) { + if (!sPlayerbotAIConfig->enableBroadcasts) + return false; if (urand(1, sPlayerbotAIConfig->broadcastChanceMaxValue) <= sPlayerbotAIConfig->broadcastChanceSuggestQuest) { @@ -713,6 +741,8 @@ bool BroadcastHelper::BroadcastSuggestQuest(PlayerbotAI* ai, std::vector bool BroadcastHelper::BroadcastSuggestGrindMaterials(PlayerbotAI* ai, std::string item, Player* bot) { + if (!sPlayerbotAIConfig->enableBroadcasts) + return false; if (urand(1, sPlayerbotAIConfig->broadcastChanceMaxValue) <= sPlayerbotAIConfig->broadcastChanceSuggestGrindMaterials) { @@ -736,6 +766,8 @@ bool BroadcastHelper::BroadcastSuggestGrindMaterials(PlayerbotAI* ai, std::strin bool BroadcastHelper::BroadcastSuggestGrindReputation(PlayerbotAI* ai, std::vector levels, std::vector allowedFactions, Player* bot) { + if (!sPlayerbotAIConfig->enableBroadcasts) + return false; if (urand(1, sPlayerbotAIConfig->broadcastChanceMaxValue) <= sPlayerbotAIConfig->broadcastChanceSuggestGrindReputation) { @@ -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) { @@ -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 placeholders; @@ -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 @@ -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 diff --git a/src/PlayerbotAI.cpp b/src/PlayerbotAI.cpp index 7a18c520..0948a5da 100644 --- a/src/PlayerbotAI.cpp +++ b/src/PlayerbotAI.cpp @@ -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"); @@ -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)) { diff --git a/src/strategy/actions/AcceptQuestAction.cpp b/src/strategy/actions/AcceptQuestAction.cpp index 882e65ca..72abeef9 100644 --- a/src/strategy/actions/AcceptQuestAction.cpp +++ b/src/strategy/actions/AcceptQuestAction.cpp @@ -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; } @@ -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; } diff --git a/src/strategy/actions/AutoLearnSpellAction.cpp b/src/strategy/actions/AutoLearnSpellAction.cpp index 96a93161..fe72b8d6 100644 --- a/src/strategy/actions/AutoLearnSpellAction.cpp +++ b/src/strategy/actions/AutoLearnSpellAction.cpp @@ -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); } diff --git a/src/strategy/actions/LootAction.cpp b/src/strategy/actions/LootAction.cpp index be48b066..0b45763d 100644 --- a/src/strategy/actions/LootAction.cpp +++ b/src/strategy/actions/LootAction.cpp @@ -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); diff --git a/src/strategy/generic/EmoteStrategy.cpp b/src/strategy/generic/EmoteStrategy.cpp index 373bc747..f2c67f75 100644 --- a/src/strategy/generic/EmoteStrategy.cpp +++ b/src/strategy/generic/EmoteStrategy.cpp @@ -11,6 +11,7 @@ void EmoteStrategy::InitTriggers(std::vector& 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))); @@ -23,7 +24,7 @@ void EmoteStrategy::InitTriggers(std::vector& 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)