Files
mod-playerbots/src/strategy/actions/LeaveGroupAction.cpp
Keleborn 52c3e96641 Rename groupmaster to groupleader and related variables. (#1875)
Fix the naming conventions. 
Master should be reserved to identify a bots Master. 
groupleaders are not necessarily group masters and it should be clear
what the bot is looking for. (In most solo cases leader=master)
2025-12-03 13:25:01 +01:00

160 lines
3.7 KiB
C++

/*
* Copyright (C) 2016+ AzerothCore <www.azerothcore.org>, released under GNU AGPL v3 license, you may redistribute it
* and/or modify it under version 3 of the License, or (at your option), any later version.
*/
#include "LeaveGroupAction.h"
#include "Event.h"
#include "PlayerbotAIConfig.h"
#include "Playerbots.h"
bool LeaveGroupAction::Execute(Event event)
{
Player* player = event.getOwner();
if (player == botAI->GetMaster())
return Leave();
return false;
}
bool PartyCommandAction::Execute(Event event)
{
WorldPacket& p = event.getPacket();
p.rpos(0);
uint32 operation;
std::string member;
p >> operation >> member;
if (operation != PARTY_OP_LEAVE)
return false;
// Only leave if master has left the party, and randombot cannot set new master.
Player* master = GetMaster();
if (master && member == master->GetName())
{
if (sRandomPlayerbotMgr->IsRandomBot(bot))
{
Player* newMaster = botAI->FindNewMaster();
if (newMaster || bot->InBattleground())
{
botAI->SetMaster(newMaster);
return false;
}
}
return Leave();
}
return false;
}
bool UninviteAction::Execute(Event event)
{
WorldPacket& p = event.getPacket();
if (p.GetOpcode() == CMSG_GROUP_UNINVITE)
{
p.rpos(0);
std::string memberName;
p >> memberName;
// player not found
if (!normalizePlayerName(memberName))
{
return false;
}
if (bot->GetName() == memberName)
return Leave();
}
if (p.GetOpcode() == CMSG_GROUP_UNINVITE_GUID)
{
p.rpos(0);
ObjectGuid guid;
p >> guid;
if (bot->GetGUID() == guid)
return Leave();
}
return false;
}
bool LeaveGroupAction::Leave()
{
if (!botAI)
return false;
Player* master = botAI -> GetMaster();
if (master)
botAI->TellMaster("Goodbye!", PLAYERBOT_SECURITY_TALK);
botAI->LeaveOrDisbandGroup();
return true;
}
bool LeaveFarAwayAction::Execute(Event event)
{
// allow bot to leave party when they want
return Leave();
}
bool LeaveFarAwayAction::isUseful()
{
if (bot->InBattleground())
return false;
if (bot->InBattlegroundQueue())
return false;
if (!bot->GetGroup())
return false;
Player* groupLeader = botAI->GetGroupLeader();
Player* trueMaster = botAI->GetMaster();
if (!groupLeader || (bot == groupLeader && !botAI->IsRealPlayer()))
return false;
PlayerbotAI* groupLeaderBotAI = nullptr;
if (groupLeader)
groupLeaderBotAI = GET_PLAYERBOT_AI(groupLeader);
if (groupLeader && !groupLeaderBotAI)
return false;
if (trueMaster && !GET_PLAYERBOT_AI(trueMaster))
return false;
if (botAI->IsAlt() &&
(!groupLeaderBotAI || groupLeaderBotAI->IsRealPlayer())) // Don't leave group when alt grouped with player groupLeader.
return false;
if (botAI->GetGrouperType() == GrouperType::SOLO)
return true;
uint32 dCount = AI_VALUE(uint32, "death count");
if (dCount > 9)
return true;
if (dCount > 4 && !botAI->HasRealPlayerMaster())
return true;
if (bot->GetGuildId() == groupLeader->GetGuildId())
{
if (bot->GetLevel() > groupLeader->GetLevel() + 5)
{
if (AI_VALUE(bool, "should get money"))
return false;
}
}
if (abs(int32(groupLeader->GetLevel() - bot->GetLevel())) > 4)
return true;
if (bot->GetMapId() != groupLeader->GetMapId() || bot->GetDistance2d(groupLeader) >= 2 * sPlayerbotAIConfig->rpgDistance)
{
return true;
}
return false;
}