Files
mod-playerbots/src/strategy/actions/ShareQuestAction.cpp
antony 274101c000 Fix crash:
PlayerbotAI::FindOilFor was making the server randomly crashing
ChooseTravelTargetAction::getNewTarget: when active bot groupping was making the server crash as looking for unexisting params

Several bug fixes and tweak to Quest and Group

New fucntionnality:
Bots will now share quests randomly to their party
Bots will try to accomplish group member quest before moving on to new target
Bots will try to sells items only after few levels ( 5 ) when in group
When dropping a quest bots will try to select a new one they are on instead of idling for few time
Bots will no longuer try to invite themselfs to group or if group is full
Bots are now allowed to leave party by themself
Bots in groupe if not leader are forbbiden to tag in bgs
Bots in bot-groups no have a more limited range to look for grind target

Polish logs
2024-07-31 12:26:48 +02:00

110 lines
3.0 KiB
C++

/*
* Copyright (C) 2016+ AzerothCore <www.azerothcore.org>, released under GNU GPL v2 license, you may redistribute it and/or modify it under version 2 of the License, or (at your option), any later version.
*/
#include "ShareQuestAction.h"
#include "Event.h"
#include "Playerbots.h"
bool ShareQuestAction::Execute(Event event)
{
std::string const link = event.getParam();
if (!GetMaster())
return false;
PlayerbotChatHandler handler(GetMaster());
uint32 entry = handler.extractQuestId(link);
if (!entry)
return false;
Quest const* quest = sObjectMgr->GetQuestTemplate(entry);
if (!quest)
return false;
// remove all quest entries for 'entry' from quest log
for (uint8 slot = 0; slot < MAX_QUEST_LOG_SIZE; ++slot)
{
uint32 logQuest = bot->GetQuestSlotQuestId(slot);
if (logQuest == entry)
{
WorldPacket p;
p << entry;
bot->GetSession()->HandlePushQuestToParty(p);
botAI->TellMaster("Quest shared");
return true;
}
}
return false;
}
bool AutoShareQuestAction::Execute(Event event)
{
Player* requester = event.getOwner() ? event.getOwner() : GetMaster();
bool shared = false;
for (uint8 slot = 0; slot < MAX_QUEST_LOG_SIZE; ++slot)
{
uint32 logQuest = bot->GetQuestSlotQuestId(slot);
Quest const* quest = sObjectMgr->GetQuestTemplate(logQuest);
if (!quest)
continue;
bool partyNeedsQuest = false;
for (GroupReference* itr = bot->GetGroup()->GetFirstMember(); itr != nullptr; itr = itr->next())
{
Player* player = itr->GetSource();
if (!player || player == bot || !player->IsInWorld() || !botAI->IsSafe(player)) // skip self
continue;
if (bot->GetDistance(player) > 10)
continue;
if (!player->SatisfyQuestStatus(quest, false))
continue;
if (player->GetQuestStatus(logQuest) == QUEST_STATUS_COMPLETE)
continue;
if (!player->CanTakeQuest(quest, false))
continue;
if (!player->SatisfyQuestLog(false))
continue;
if (player->GetDivider())
continue;
if (auto ai = GET_PLAYERBOT_AI(player))
{
if (PAI_VALUE(uint8, "free quest log slots") < 15 || !urand(0,5))
{
WorldPacket packet(CMSG_PUSHQUESTTOPARTY, 20);
packet << logQuest;
ai->HandleMasterIncomingPacket(packet);
}
}
else
partyNeedsQuest = true;
}
if (!partyNeedsQuest)
continue;
WorldPacket p;
p << logQuest;
bot->GetSession()->HandlePushQuestToParty(p);
botAI->TellMaster("Quest shared");
shared = true;
}
return shared;
}
bool AutoShareQuestAction::isUseful()
{
return bot->GetGroup() && !botAI->HasActivePlayerMaster();
}