Core/Units: moved health and power ordering predicates from Unit header into CommonPredicates (#29584)

This commit is contained in:
Ovahlord
2024-01-16 20:18:25 +01:00
committed by GitHub
parent 39621fa41c
commit 2f6ed2c203
6 changed files with 68 additions and 60 deletions

View File

@@ -1972,60 +1972,4 @@ class TC_GAME_API Unit : public WorldObject
bool _isCombatDisallowed;
};
namespace Trinity
{
// Binary predicate for sorting Units based on percent value of a power
class PowerPctOrderPred
{
public:
PowerPctOrderPred(Powers power, bool ascending = true) : _power(power), _ascending(ascending) { }
bool operator()(WorldObject const* objA, WorldObject const* objB) const
{
Unit const* a = objA->ToUnit();
Unit const* b = objB->ToUnit();
float rA = a ? a->GetPowerPct(_power) : 0.0f;
float rB = b ? b->GetPowerPct(_power) : 0.0f;
return _ascending ? rA < rB : rA > rB;
}
bool operator()(Unit const* a, Unit const* b) const
{
float rA = a->GetPowerPct(_power);
float rB = b->GetPowerPct(_power);
return _ascending ? rA < rB : rA > rB;
}
private:
Powers const _power;
bool const _ascending;
};
// Binary predicate for sorting Units based on percent value of health
class HealthPctOrderPred
{
public:
HealthPctOrderPred(bool ascending = true) : _ascending(ascending) { }
bool operator()(WorldObject const* objA, WorldObject const* objB) const
{
Unit const* a = objA->ToUnit();
Unit const* b = objB->ToUnit();
float rA = (a && a->GetMaxHealth()) ? float(a->GetHealth()) / float(a->GetMaxHealth()) : 0.0f;
float rB = (b && b->GetMaxHealth()) ? float(b->GetHealth()) / float(b->GetMaxHealth()) : 0.0f;
return _ascending ? rA < rB : rA > rB;
}
bool operator() (Unit const* a, Unit const* b) const
{
float rA = a->GetMaxHealth() ? float(a->GetHealth()) / float(a->GetMaxHealth()) : 0.0f;
float rB = b->GetMaxHealth() ? float(b->GetHealth()) / float(b->GetMaxHealth()) : 0.0f;
return _ascending ? rA < rB : rA > rB;
}
private:
bool const _ascending;
};
}
#endif

View File

@@ -19,3 +19,35 @@
#include "Unit.h"
Trinity::Predicates::IsVictimOf::IsVictimOf(Unit const* attacker) : _victim(attacker ? attacker->GetVictim() : nullptr) { }
bool Trinity::Predicates::PowerPctOrderPred::operator()(WorldObject const* objA, WorldObject const* objB) const
{
Unit const* a = objA->ToUnit();
Unit const* b = objB->ToUnit();
float rA = a ? a->GetPowerPct(_power) : 0.0f;
float rB = b ? b->GetPowerPct(_power) : 0.0f;
return _ascending ? rA < rB : rA > rB;
}
bool Trinity::Predicates::PowerPctOrderPred::operator()(Unit const* a, Unit const* b) const
{
float rA = a->GetPowerPct(_power);
float rB = b->GetPowerPct(_power);
return _ascending ? rA < rB : rA > rB;
}
bool Trinity::Predicates::HealthPctOrderPred::operator()(WorldObject const* objA, WorldObject const* objB) const
{
Unit const* a = objA->ToUnit();
Unit const* b = objB->ToUnit();
float rA = (a && a->GetMaxHealth()) ? float(a->GetHealth()) / float(a->GetMaxHealth()) : 0.0f;
float rB = (b && b->GetMaxHealth()) ? float(b->GetHealth()) / float(b->GetMaxHealth()) : 0.0f;
return _ascending ? rA < rB : rA > rB;
}
bool Trinity::Predicates::HealthPctOrderPred::operator()(Unit const* a, Unit const* b) const
{
float rA = a->GetMaxHealth() ? float(a->GetHealth()) / float(a->GetMaxHealth()) : 0.0f;
float rB = b->GetMaxHealth() ? float(b->GetHealth()) / float(b->GetMaxHealth()) : 0.0f;
return _ascending ? rA < rB : rA > rB;
}

View File

@@ -24,6 +24,8 @@
class Unit;
class WorldObject;
enum Powers : int8;
namespace Trinity
{
namespace Predicates
@@ -38,6 +40,33 @@ namespace Trinity
WorldObject const* _victim;
};
/// Binary predicate for sorting Units based on percent value of a power
class TC_GAME_API PowerPctOrderPred
{
public:
PowerPctOrderPred(Powers power, bool ascending = true) : _power(power), _ascending(ascending) { }
bool operator()(WorldObject const* objA, WorldObject const* objB) const;
bool operator()(Unit const* a, Unit const* b) const;
private:
Powers const _power;
bool const _ascending;
};
/// Binary predicate for sorting Units based on percent value of health
class TC_GAME_API HealthPctOrderPred
{
public:
HealthPctOrderPred(bool ascending = true) : _ascending(ascending) { }
bool operator()(WorldObject const* objA, WorldObject const* objB) const;
bool operator() (Unit const* a, Unit const* b) const;
private:
bool const _ascending;
};
template <typename PRED>
class TC_GAME_API Inverter
{

View File

@@ -26,6 +26,7 @@
#include "Battleground.h"
#include "BattlePetMgr.h"
#include "CellImpl.h"
#include "CommonPredicates.h"
#include "Containers.h"
#include "CreatureAI.h"
#include "DB2Stores.h"
@@ -2991,7 +2992,7 @@ class spell_gen_replenishment : public SpellScript
if (targets.size() > maxTargets)
{
targets.sort(Trinity::PowerPctOrderPred(POWER_MANA));
targets.sort(Trinity::Predicates::PowerPctOrderPred(POWER_MANA));
targets.resize(maxTargets);
}
}

View File

@@ -23,6 +23,7 @@
#include "ScriptMgr.h"
#include "Battleground.h"
#include "CommonPredicates.h"
#include "Containers.h"
#include "Creature.h"
#include "CreatureAIImpl.h"
@@ -995,7 +996,7 @@ class spell_item_echoes_of_light : public SpellScript
if (targets.size() < 2)
return;
targets.sort(Trinity::HealthPctOrderPred());
targets.sort(Trinity::Predicates::HealthPctOrderPred());
WorldObject* target = targets.front();
targets.clear();

View File

@@ -24,6 +24,7 @@
#include "ScriptMgr.h"
#include "AreaTrigger.h"
#include "AreaTriggerAI.h"
#include "CommonPredicates.h"
#include "Containers.h"
#include "DB2Stores.h"
#include "Group.h"
@@ -692,7 +693,7 @@ class spell_pal_glyph_of_holy_light : public SpellScript
if (targets.size() > maxTargets)
{
targets.sort(Trinity::HealthPctOrderPred());
targets.sort(Trinity::Predicates::HealthPctOrderPred());
targets.resize(maxTargets);
}
}
@@ -897,7 +898,7 @@ class spell_pal_holy_prism_selector : public SpellScript
{
if (GetSpellInfo()->Id == SPELL_PALADIN_HOLY_PRISM_TARGET_ALLY)
{
targets.sort(Trinity::HealthPctOrderPred());
targets.sort(Trinity::Predicates::HealthPctOrderPred());
targets.resize(maxTargets);
}
else