mirror of
https://github.com/mod-playerbots/mod-playerbots.git
synced 2026-01-15 18:00:27 +00:00
81 lines
2.2 KiB
C++
81 lines
2.2 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 "ThreatValues.h"
|
|
#include "ThreatMgr.h"
|
|
#include "Playerbots.h"
|
|
|
|
uint8 ThreatValue::Calculate()
|
|
{
|
|
if (qualifier == "aoe")
|
|
{
|
|
uint8 maxThreat = 0;
|
|
GuidVector attackers = context->GetValue<GuidVector >("attackers")->Get();
|
|
for (ObjectGuid const guid : attackers)
|
|
{
|
|
Unit* unit = botAI->GetUnit(guid);
|
|
if (!unit || !unit->IsAlive())
|
|
continue;
|
|
|
|
uint8 threat = Calculate(unit);
|
|
if (!maxThreat || threat > maxThreat)
|
|
maxThreat = threat;
|
|
}
|
|
|
|
return maxThreat;
|
|
}
|
|
|
|
Unit* target = AI_VALUE(Unit*, qualifier);
|
|
return Calculate(target);
|
|
}
|
|
|
|
uint8 ThreatValue::Calculate(Unit* target)
|
|
{
|
|
if (!target)
|
|
return 0;
|
|
|
|
if (target->GetGUID().IsPlayer())
|
|
return 0;
|
|
|
|
Group* group = bot->GetGroup();
|
|
if (!group)
|
|
return 0;
|
|
|
|
float botThreat = target->GetThreatMgr().GetThreat(bot);
|
|
float maxThreat = -1.0f;
|
|
bool hasTank = false;
|
|
|
|
for (GroupReference* gref = group->GetFirstMember(); gref; gref = gref->next())
|
|
{
|
|
Player* player = gref->GetSource();
|
|
if (!player || !player->IsAlive() || player == bot)
|
|
continue;
|
|
|
|
if (botAI->IsTank(player))
|
|
{
|
|
hasTank = true;
|
|
float threat = target->GetThreatMgr().GetThreat(player);
|
|
if (maxThreat < threat)
|
|
maxThreat = threat;
|
|
}
|
|
}
|
|
|
|
if (maxThreat <= 0 && !hasTank)
|
|
return 0;
|
|
|
|
// calculate normal threat for fleeing targets
|
|
bool fleeing = target->GetMotionMaster()->GetCurrentMovementGeneratorType() == FLEEING_MOTION_TYPE ||
|
|
target->GetMotionMaster()->GetCurrentMovementGeneratorType() == TIMED_FLEEING_MOTION_TYPE;
|
|
|
|
// return high threat if tank has no threat
|
|
if (target->IsInCombat() && maxThreat <= 0 && botThreat <= 0 && hasTank && !fleeing)
|
|
return 100;
|
|
|
|
// return low threat if mob if fleeing
|
|
if (hasTank && fleeing)
|
|
return 0;
|
|
|
|
return botThreat * 100 / maxThreat;
|
|
}
|