Files
mod-playerbots/src/strategy/values/PvpValues.cpp
SaW 5a4acbe36c Update PvpValues.cpp (#1746)
Set uninitialized variable
Remove std::move
2025-10-20 01:04:11 +02:00

215 lines
6.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 "PvpValues.h"
#include "BattlegroundEY.h"
#include "BattlegroundMgr.h"
#include "BattlegroundWS.h"
#include "Playerbots.h"
#include "ServerFacade.h"
Unit* FlagCarrierValue::Calculate()
{
Unit* carrier = nullptr;
if (botAI->GetBot()->InBattleground())
{
if (botAI->GetBot()->GetBattlegroundTypeId() == BattlegroundTypeId::BATTLEGROUND_WS)
{
BattlegroundWS* bg = (BattlegroundWS*)botAI->GetBot()->GetBattleground();
if (!bg)
return nullptr;
if ((!sameTeam && bot->GetTeamId() == TEAM_HORDE || (sameTeam && bot->GetTeamId() == TEAM_ALLIANCE)) &&
!bg->GetFlagPickerGUID(TEAM_HORDE).IsEmpty())
carrier = ObjectAccessor::GetPlayer(bg->GetBgMap(), bg->GetFlagPickerGUID(TEAM_HORDE));
if ((!sameTeam && bot->GetTeamId() == TEAM_ALLIANCE || (sameTeam && bot->GetTeamId() == TEAM_HORDE)) &&
!bg->GetFlagPickerGUID(TEAM_ALLIANCE).IsEmpty())
carrier = ObjectAccessor::GetPlayer(bg->GetBgMap(), bg->GetFlagPickerGUID(TEAM_ALLIANCE));
if (carrier)
{
if (ignoreRange || bot->IsWithinDistInMap(carrier, sPlayerbotAIConfig->sightDistance))
{
return carrier;
}
else
return nullptr;
}
}
if (botAI->GetBot()->GetBattlegroundTypeId() == BATTLEGROUND_EY)
{
BattlegroundEY* bg = (BattlegroundEY*)botAI->GetBot()->GetBattleground();
if (!bg)
return nullptr;
if (bg->GetFlagPickerGUID().IsEmpty())
return nullptr;
Player* fc = ObjectAccessor::GetPlayer(bg->GetBgMap(), bg->GetFlagPickerGUID());
if (!fc)
return nullptr;
if (!sameTeam && (fc->GetTeamId() != bot->GetTeamId()))
carrier = fc;
if (sameTeam && (fc->GetTeamId() == bot->GetTeamId()))
carrier = fc;
if (carrier)
{
if (ignoreRange || bot->IsWithinDistInMap(carrier, sPlayerbotAIConfig->sightDistance))
{
return carrier;
}
else
return nullptr;
}
}
}
return carrier;
}
std::vector<CreatureData const*> BgMastersValue::Calculate()
{
BattlegroundTypeId bgTypeId = (BattlegroundTypeId)stoi(qualifier);
std::vector<uint32> entries;
std::map<TeamId, std::map<BattlegroundTypeId, std::vector<uint32>>> battleMastersCache =
sRandomPlayerbotMgr->getBattleMastersCache();
entries.insert(entries.end(), battleMastersCache[TEAM_NEUTRAL][bgTypeId].begin(),
battleMastersCache[TEAM_NEUTRAL][bgTypeId].end());
entries.insert(entries.end(), battleMastersCache[TEAM_ALLIANCE][bgTypeId].begin(),
battleMastersCache[TEAM_ALLIANCE][bgTypeId].end());
entries.insert(entries.end(), battleMastersCache[TEAM_HORDE][bgTypeId].begin(),
battleMastersCache[TEAM_HORDE][bgTypeId].end());
std::vector<CreatureData const*> bmGuids;
for (auto entry : entries)
{
for (auto creaturePair : WorldPosition().getCreaturesNear(0, entry))
{
bmGuids.push_back(creaturePair);
}
}
return bmGuids;
}
CreatureData const* BgMasterValue::Calculate()
{
CreatureData const* bmPair = NearestBm(false);
if (!bmPair)
bmPair = NearestBm(true);
return bmPair;
}
CreatureData const* BgMasterValue::NearestBm(bool allowDead)
{
WorldPosition botPos(bot);
std::vector<CreatureData const*> bmPairs = AI_VALUE2(std::vector<CreatureData const*>, "bg masters", qualifier);
float rDist = 0.0f;
CreatureData const* rbmPair = nullptr;
for (auto& bmPair : bmPairs)
{
if (!bmPair)
continue;
WorldPosition bmPos(bmPair->mapid, bmPair->posX, bmPair->posY, bmPair->posZ, bmPair->orientation);
float dist = botPos.distance(bmPos); // This is the aproximate travel distance.
// Did we already find a closer unit that is not dead?
if (rbmPair && rDist <= dist)
continue;
CreatureTemplate const* bmTemplate = sObjectMgr->GetCreatureTemplate(bmPair->id1);
if (!bmTemplate)
continue;
FactionTemplateEntry const* bmFactionEntry = sFactionTemplateStore.LookupEntry(bmTemplate->faction);
// Is the unit hostile?
if (Unit::GetFactionReactionTo(bot->GetFactionTemplateEntry(), bmFactionEntry) < REP_NEUTRAL)
continue;
AreaTableEntry const* area = bmPos.getArea();
if (!area)
continue;
// Is the area hostile?
if (area->team == 4 && bot->GetTeamId() == TEAM_ALLIANCE)
continue;
if (area->team == 2 && bot->GetTeamId() == TEAM_HORDE)
continue;
if (!allowDead)
{
Unit* unit = botAI->GetUnit(bmPair);
if (!unit)
continue;
// Is the unit dead?
if (unit->getDeathState() == DeathState::Dead)
continue;
}
rbmPair = bmPair;
rDist = dist;
}
return rbmPair;
}
BattlegroundTypeId RpgBgTypeValue::Calculate()
{
GuidPosition guidPosition = AI_VALUE(GuidPosition, "rpg target");
if (guidPosition)
for (uint32 i = 1; i < MAX_BATTLEGROUND_QUEUE_TYPES; i++)
{
BattlegroundQueueTypeId queueTypeId = (BattlegroundQueueTypeId)i;
BattlegroundTypeId bgTypeId = sBattlegroundMgr->BGTemplateId(queueTypeId);
Battleground* bg = sBattlegroundMgr->GetBattlegroundTemplate(bgTypeId);
if (!bg)
continue;
if (bot->GetLevel() < bg->GetMinLevel())
continue;
// check if already in queue
if (bot->InBattlegroundQueueForBattlegroundQueueType(queueTypeId))
continue;
std::map<TeamId, std::map<BattlegroundTypeId, std::vector<uint32>>> battleMastersCache =
sRandomPlayerbotMgr->getBattleMastersCache();
for (auto& entry : battleMastersCache[TEAM_NEUTRAL][bgTypeId])
if (entry == guidPosition.GetEntry())
return bgTypeId;
for (auto& entry : battleMastersCache[bot->GetTeamId()][bgTypeId])
if (entry == guidPosition.GetEntry())
return bgTypeId;
}
return BATTLEGROUND_TYPE_NONE;
}