fix current_zone_name incorrect values + refactoring guild broadcast simplier + refactoring randomTalk to actually use area / zone general etc

This commit is contained in:
Atidot3
2024-07-28 18:42:51 +02:00
parent 90aa76e3c3
commit 06a63aa730
6 changed files with 43 additions and 40 deletions

View File

@@ -526,7 +526,7 @@ void PlayerbotHolder::OnBotLogin(Player* const bot)
// join standard channels // join standard channels
AreaTableEntry const* current_zone = sAreaTableStore.LookupEntry(bot->GetAreaId()); AreaTableEntry const* current_zone = sAreaTableStore.LookupEntry(bot->GetAreaId());
ChannelMgr* cMgr = ChannelMgr::forTeam(bot->GetTeamId()); ChannelMgr* cMgr = ChannelMgr::forTeam(bot->GetTeamId());
std::string current_zone_name = current_zone ? current_zone->area_name[0] : ""; std::string current_zone_name = current_zone ? current_zone->area_name[sWorld->GetDefaultDbcLocale()] : "";
if (current_zone && cMgr) if (current_zone && cMgr)
{ {

View File

@@ -41,13 +41,14 @@ void AutoLearnSpellAction::LearnSpells(std::ostringstream* out)
Guild* guild = sGuildMgr->GetGuildById(bot->GetGuildId()); Guild* guild = sGuildMgr->GetGuildById(bot->GetGuildId());
if (guild) if (guild)
{ {
std::map<std::string, std::string> placeholders; std::string toSay = "";
placeholders["%level"] = std::to_string(bot->GetLevel());
if (urand(0, 3)) if (urand(0, 3))
guild->BroadcastToGuild(bot->GetSession(), false, BOT_TEXT2("Ding!", placeholders), LANG_UNIVERSAL); toSay = "Ding !";
else else
guild->BroadcastToGuild(bot->GetSession(), false, BOT_TEXT2("Yay level %level!", placeholders), LANG_UNIVERSAL); toSay = "Yay level " + std::to_string(bot->GetLevel()) + " !";
guild->BroadcastToGuild(bot->GetSession(), false, toSay, LANG_UNIVERSAL);
} }
} }
} }

View File

@@ -423,13 +423,14 @@ bool StoreLootAction::Execute(Event event)
if (guild) if (guild)
{ {
std::map<std::string, std::string> placeholders; std::string toSay = "";
placeholders["%name"] = chat->FormatItem(proto);
if (urand(0, 3)) if (urand(0, 3))
guild->BroadcastToGuild(bot->GetSession(), false, BOT_TEXT2("Yay I looted %name!", placeholders), LANG_UNIVERSAL); toSay = "Yay I looted " + chat->FormatItem(proto) + " !";
else else
guild->BroadcastToGuild(bot->GetSession(), false, BOT_TEXT2("Guess who got a %name? Me!", placeholders), LANG_UNIVERSAL); toSay = "Guess who got a " + chat->FormatItem(proto) + " ? Me !";
guild->BroadcastToGuild(bot->GetSession(), false, toSay, LANG_UNIVERSAL);
} }
} }

View File

@@ -18,11 +18,11 @@
enum eTalkType enum eTalkType
{ {
General = ChannelFlags::CHANNEL_FLAG_GENERAL | ChannelFlags::CHANNEL_FLAG_NOT_LFG, /*0x18*/ General = ChannelFlags::CHANNEL_FLAG_GENERAL | ChannelFlags::CHANNEL_FLAG_NOT_LFG,
Trade = ChannelFlags::CHANNEL_FLAG_CITY | ChannelFlags::CHANNEL_FLAG_GENERAL | ChannelFlags::CHANNEL_FLAG_NOT_LFG | ChannelFlags::CHANNEL_FLAG_TRADE, /*0x3C*/ Trade = ChannelFlags::CHANNEL_FLAG_CITY | ChannelFlags::CHANNEL_FLAG_GENERAL | ChannelFlags::CHANNEL_FLAG_NOT_LFG | ChannelFlags::CHANNEL_FLAG_TRADE,
LocalDefence = ChannelFlags::CHANNEL_FLAG_GENERAL | ChannelFlags::CHANNEL_FLAG_NOT_LFG, /*0x18*/ LocalDefence = ChannelFlags::CHANNEL_FLAG_GENERAL | ChannelFlags::CHANNEL_FLAG_NOT_LFG,
GuildRecruitment = ChannelFlags::CHANNEL_FLAG_CITY | ChannelFlags::CHANNEL_FLAG_GENERAL | ChannelFlags::CHANNEL_FLAG_NOT_LFG, /*x038*/ GuildRecruitment = ChannelFlags::CHANNEL_FLAG_CITY | ChannelFlags::CHANNEL_FLAG_GENERAL | ChannelFlags::CHANNEL_FLAG_NOT_LFG,
LookingForGroup = ChannelFlags::CHANNEL_FLAG_LFG | ChannelFlags::CHANNEL_FLAG_GENERAL /*0x50*/ LookingForGroup = ChannelFlags::CHANNEL_FLAG_LFG | ChannelFlags::CHANNEL_FLAG_GENERAL
}; };
std::map<std::string, uint8> SuggestDungeonAction::instances; std::map<std::string, uint8> SuggestDungeonAction::instances;
@@ -93,7 +93,7 @@ void SuggestWhatToDoAction::specificQuest()
placeholders["%role"] = chat->FormatClass(bot, AiFactory::GetPlayerSpecTab(bot)); placeholders["%role"] = chat->FormatClass(bot, AiFactory::GetPlayerSpecTab(bot));
placeholders["%quest"] = chat->FormatQuest(quest); placeholders["%quest"] = chat->FormatQuest(quest);
spam(BOT_TEXT2("suggest_quest", placeholders), urand(0, 1) ? eTalkType::General : eTalkType::LookingForGroup, urand(0, 2), urand(0, 2)); spam(BOT_TEXT2("suggest_quest", placeholders), urand(0, 1) ? eTalkType::General : 0, !urand(0, 2), !urand(0, 3));
} }
void SuggestWhatToDoAction::grindMaterials() void SuggestWhatToDoAction::grindMaterials()
@@ -225,7 +225,7 @@ void SuggestWhatToDoAction::something()
out << entry->area_name[_dbc_locale]; out << entry->area_name[_dbc_locale];
placeholders["%zone"] = out.str(); placeholders["%zone"] = out.str();
spam(BOT_TEXT2("suggest_something", placeholders), eTalkType::General, !urand(0, 2), !urand(0, 3)); spam(BOT_TEXT2("suggest_something", placeholders), urand(0, 1) ? eTalkType::General : 0, !urand(0, 2), !urand(0, 3));
} }
void SuggestWhatToDoAction::spam(std::string msg, uint8 flags, bool worldChat, bool guild) void SuggestWhatToDoAction::spam(std::string msg, uint8 flags, bool worldChat, bool guild)
@@ -238,30 +238,34 @@ void SuggestWhatToDoAction::spam(std::string msg, uint8 flags, bool worldChat, b
if (!cMgr) if (!cMgr)
return; return;
AreaTableEntry const* zone = sAreaTableStore.LookupEntry(bot->GetMap()->GetZoneId(bot->GetPhaseMask(), bot->GetPositionX(), bot->GetPositionY(), bot->GetPositionZ()));
if (!zone) return;
/*AreaTableEntry const* area = sAreaTableStore.LookupEntry(bot->GetMap()->GetAreaId(bot->GetPhaseMask(), bot->GetPositionX(), bot->GetPositionY(), bot->GetPositionZ()));
if (!area) return;*/
std::string areaname = zone->area_name[_dbc_locale];
for (uint32 i = 0; i < sChatChannelsStore.GetNumRows(); ++i) for (uint32 i = 0; i < sChatChannelsStore.GetNumRows(); ++i)
{ {
ChatChannelsEntry const* channel = sChatChannelsStore.LookupEntry(i); ChatChannelsEntry const* channel = sChatChannelsStore.LookupEntry(i);
if (!channel) continue; if (!channel) continue;
AreaTableEntry const* current_zone = GetAreaEntryByAreaID(bot->GetAreaId());
if (!current_zone)
continue;
// combine full channel name // combine full channel name
char channelName[100]; char channelName[100];
Channel* chn = nullptr; Channel* chn = nullptr;
if ((channel->flags & CHANNEL_DBC_FLAG_LFG) != 0) if (channel->ChannelID == 24 || (channel->flags & CHANNEL_DBC_FLAG_LFG) != 0)
{ {
std::string chanName = channel->pattern[_dbc_locale]; std::string chanName = channel->pattern[_dbc_locale];
chn = cMgr->GetChannel(chanName, bot); chn = cMgr->GetChannel(chanName, bot);
} }
else else
{ {
snprintf(channelName, 100, channel->pattern[_dbc_locale], current_zone->area_name[_dbc_locale]); snprintf(channelName, 100, channel->pattern[_dbc_locale], areaname);
chn = cMgr->GetChannel(channelName, bot); chn = cMgr->GetChannel(channelName, bot);
} }
if (!chn) if (!chn)
continue; continue;
// skip world chat here // skip world chat here
if (chn->GetName() == "World") if (chn->GetName() == "World")
continue; continue;
@@ -269,8 +273,8 @@ void SuggestWhatToDoAction::spam(std::string msg, uint8 flags, bool worldChat, b
if (flags != 0 && chn->GetFlags() != flags) if (flags != 0 && chn->GetFlags() != flags)
continue; continue;
// skip local defense // skip local defense and universal defense
if (chn->GetChannelId() == 22) if (chn->GetChannelId() == 22 || chn->GetChannelId() == 23)
continue; continue;
// no filter, pick several options // no filter, pick several options
@@ -413,7 +417,7 @@ bool SuggestDungeonAction::Execute(Event event)
itemout << allowedInstances[urand(0, allowedInstances.size() - 1)]; itemout << allowedInstances[urand(0, allowedInstances.size() - 1)];
placeholders["%instance"] = itemout.str(); placeholders["%instance"] = itemout.str();
spam(BOT_TEXT2("suggest_instance", placeholders), urand(0, 1) ? eTalkType::LookingForGroup : eTalkType::General, urand(0, 2), urand(0, 2)); spam(BOT_TEXT2("suggest_instance", placeholders), urand(0, 1) ? eTalkType::LookingForGroup : 0, !urand(0, 2), !urand(0, 3));
return true; return true;
} }
@@ -423,9 +427,6 @@ SuggestTradeAction::SuggestTradeAction(PlayerbotAI* botAI) : SuggestWhatToDoActi
bool SuggestTradeAction::Execute(Event event) bool SuggestTradeAction::Execute(Event event)
{ {
if (!sRandomPlayerbotMgr->IsRandomBot(bot) || bot->GetGroup() || bot->GetInstanceId())
return false;
uint32 quality = urand(0, 100); uint32 quality = urand(0, 100);
if (quality > 95) if (quality > 95)
quality = ITEM_QUALITY_LEGENDARY; quality = ITEM_QUALITY_LEGENDARY;
@@ -481,6 +482,6 @@ bool SuggestTradeAction::Execute(Event event)
placeholders["%gold"] = chat->formatMoney(price); placeholders["%gold"] = chat->formatMoney(price);
spam(BOT_TEXT2("suggest_sell", placeholders), urand(0, 1) ? eTalkType::Trade : eTalkType::General, !urand(0, 2), urand(0, 5)); spam(BOT_TEXT2("suggest_sell", placeholders), urand(0, 1) ? eTalkType::Trade : 0, !urand(0, 2), urand(0, 5));
return true; return true;
} }

View File

@@ -41,13 +41,14 @@ bool XpGainAction::Execute(Event event)
Guild* guild = sGuildMgr->GetGuildById(bot->GetGuildId()); Guild* guild = sGuildMgr->GetGuildById(bot->GetGuildId());
if (guild) if (guild)
{ {
std::map<std::string, std::string> placeholders; std::string toSay = "";
placeholders["%name"] = creature->GetName();
if (urand(0, 3)) if (urand(0, 3))
guild->BroadcastToGuild(bot->GetSession(), false, BOT_TEXT2("Wow I just killed %name!", placeholders), LANG_UNIVERSAL); toSay = "Wow I just killed " + creature->GetName() + " !";
else else
guild->BroadcastToGuild(bot->GetSession(), false, BOT_TEXT2("Awesome that %name went down quickly!", placeholders), LANG_UNIVERSAL); toSay = "Awesome that " + creature->GetName() + " went down quickly !";
guild->BroadcastToGuild(bot->GetSession(), false, toSay, LANG_UNIVERSAL);
} }
} }
} }

View File

@@ -9,21 +9,20 @@ void EmoteStrategy::InitTriggers(std::vector<TriggerNode*>& triggers)
{ {
if (sPlayerbotAIConfig->randomBotEmote) if (sPlayerbotAIConfig->randomBotEmote)
{ {
triggers.push_back(new TriggerNode("seldom", NextAction::array(0, new NextAction("emote", 10.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))); triggers.push_back(new TriggerNode("receive text emote", NextAction::array(0, new NextAction("emote", 10.0f), nullptr)));
triggers.push_back(new TriggerNode("receive emote", NextAction::array(0, new NextAction("emote", 10.0f), nullptr))); triggers.push_back(new TriggerNode("receive emote", NextAction::array(0, new NextAction("emote", 10.0f), nullptr)));
} }
if (sPlayerbotAIConfig->randomBotTalk) if (sPlayerbotAIConfig->randomBotTalk)
{ {
triggers.push_back(new TriggerNode("often", NextAction::array(0, new NextAction("suggest what to do", 1.0f), nullptr))); triggers.push_back(new TriggerNode("often", NextAction::array(0, new NextAction("suggest what to do", 35.0f),
triggers.push_back(new TriggerNode("often", NextAction::array(0, new NextAction("suggest trade", 1.0f), nullptr))); new NextAction("suggest dungeon", 50.0f),
triggers.push_back(new TriggerNode("seldom", NextAction::array(0, new NextAction("talk", 1.0f), nullptr))); new NextAction("suggest trade", 65.0f),
new NextAction("talk", 10.0f),
nullptr)));
} }
if (sPlayerbotAIConfig->randomBotSuggestDungeons)
triggers.push_back(new TriggerNode("often", NextAction::array(0, new NextAction("suggest dungeon", 1.0f), nullptr)));
if (sPlayerbotAIConfig->enableGreet) if (sPlayerbotAIConfig->enableGreet)
triggers.push_back(new TriggerNode("new player nearby", NextAction::array(0, new NextAction("greet", 1.0f), nullptr))); triggers.push_back(new TriggerNode("new player nearby", NextAction::array(0, new NextAction("greet", 1.0f), nullptr)));