Files
Viano-Core/src/server/game/World/AdventureRotationPolicy.h
T
Nico a758239da9
clang PCH / build (push) Canceled after 0s
GCC PCH / build (push) Canceled after 0s
Implement AdventureBot class rotations, group roles and instance encounters
2026-10-28 22:37:18 +01:00

86 lines
5.5 KiB
C++

#ifndef VCORE_ADVENTURE_ROTATION_POLICY_H
#define VCORE_ADVENTURE_ROTATION_POLICY_H
#include <vector>
#include <cstdint>
namespace AdventureRotationPolicy
{
enum class Condition { Always, MissingAura, Execute, Injured, Emergency, Resource, LowResource, Interrupt };
struct Action { uint32_t Spell; Condition When = Condition::Always; bool Self = false; uint32_t Aura = 0; unsigned Combo = 0; uint32_t Proc = 0; };
// Stable, shared PvE priorities. Native spell validation handles level,
// resources, procs, cooldowns and learned ranks; no random action selection.
inline unsigned SoloSpec(unsigned klass, uint32_t seed)
{
switch (klass)
{
case 1: case 4: case 7: case 8: case 11: return seed % 2;
case 3: case 6: return 1 + seed % 2;
case 2: case 5: return 2;
case 9: return seed % 3;
default: return 0;
}
}
inline bool Ranged(unsigned klass, unsigned spec)
{ return klass==3 || klass==5 || klass==8 || klass==9 || (klass==7 && spec!=1) || (klass==11 && spec!=1); }
inline std::vector<Action> Damage(unsigned klass, unsigned spec)
{
using C=Condition;
switch (klass)
{
case 1:
if(spec==2)return {{71,C::MissingAura,true},{871,C::Emergency,true},{12975,C::Emergency,true},{2565,C::Injured,true},{23922},{6572},{772,C::MissingAura},{20243},{78,C::Resource}};
if(spec==1)return {{2458,C::MissingAura,true},{23881},{85288},{5308,C::Execute},{86346},{1464,C::Always,false,0,0,46916},{78,C::Resource}};
return {{2457,C::MissingAura,true},{772,C::MissingAura},{12294},{86346},{7384},{5308,C::Execute},{1464},{78,C::Resource}};
case 2:
if(spec==0)return {{20271},{879},{35395}};
if(spec==1)return {{25780,C::MissingAura,true},{498,C::Injured,true},{31850,C::Emergency,true},{31935},{53600},{35395},{20271},{24275,C::Execute}};
return {{85256},{35395},{24275,C::Execute},{20271},{879}};
case 3:
if(spec==2)return {{1978,C::MissingAura},{53301},{3674},{53351,C::Execute},{77767},{3044}};
return {{1978,C::MissingAura},{53209},{53351,C::Execute},{19434},{56641},{3044}};
case 4:
if(spec==0)return {{5171,C::MissingAura,true,0,3},{1943,C::MissingAura,false,0,1},{32645,C::Always,false,0,5},{2098,C::Always,false,0,5},{1329},{1752}};
return {{5171,C::MissingAura,true,0,3},{1943,C::MissingAura,false,0,5},{2098,C::Always,false,0,5},{84617},{1752}};
case 5:
if(spec!=2)return {{585}};
return {{15473,C::MissingAura,true},{34914,C::MissingAura},{589,C::MissingAura},{2944,C::MissingAura},{8092},{32379,C::Execute},{15407},{585}};
case 6:
if(spec==0)return {{48263,C::MissingAura,true},{48792,C::Emergency,true},{45462,C::MissingAura,false,55078},{45477,C::MissingAura,false,55095},{49998},{55050},{47541}};
if(spec==1)return {{48265,C::MissingAura,true},{45477,C::MissingAura,false,55095},{45462,C::MissingAura,false,55078},{49020},{49143},{49184},{47541}};
return {{48265,C::MissingAura,true},{45477,C::MissingAura,false,55095},{45462,C::MissingAura,false,55078},{55090},{85948},{47541}};
case 7:
if(spec==2)return {{403}};
if(spec==1)return {{17364},{60103},{8050,C::MissingAura},{8042},{73899},{403}};
return {{324,C::MissingAura,true},{8050,C::MissingAura},{51505},{8042},{403}};
case 8:
if(spec==1)return {{30482,C::MissingAura,true},{44457,C::MissingAura},{11366,C::Always,false,0,0,48108},{2136},{133}};
return {{6117,C::MissingAura,true},{12042,C::Resource,true},{30451},{5143,C::Always,false,0,0,79808},{44425}};
case 9:
if(spec==1)return {{28176,C::MissingAura,true},{348,C::MissingAura},{172,C::MissingAura},{603,C::MissingAura},{71521},{29722},{686}};
if(spec==2)return {{28176,C::MissingAura,true},{348,C::MissingAura},{17962},{50796},{29722},{17877,C::Execute}};
return {{28176,C::MissingAura,true},{172,C::MissingAura},{30108,C::MissingAura},{980,C::MissingAura},{48181},{1120,C::Execute},{686}};
case 11:
if(spec==2)return {{5176}};
if(spec==1)return {{768,C::MissingAura,true},{5217,C::LowResource,true},{52610,C::MissingAura,true,0,3},{33876,C::MissingAura},{1079,C::MissingAura,false,0,5},{1822,C::MissingAura},{22568,C::Always,false,0,5},{5221},{33876},{1082}};
return {{24858,C::MissingAura,true},{8921,C::MissingAura},{5570,C::MissingAura},{78674},{2912},{5176}};
default:return {};
}
}
inline std::vector<Action> Healing(unsigned klass, unsigned spec, float hp)
{
using C=Condition;
switch(klass)
{
case 2: if(hp<30)return {{633},{20473},{19750},{82326},{635}}; return {{20473},{82326},{635},{19750}};
case 5:
if(spec==0 && hp<40)return {{33206},{17,C::MissingAura},{47540},{2061},{2060}};
if(hp<35)return {{47788},{2061},{2050}};
if(hp<70)return {{33076,C::MissingAura},{47540},{2060},{2050}};
return {{139,C::MissingAura},{2050},{2061}};
case 7: if(hp<35)return {{61295},{8004},{77472},{331}}; return {{61295,C::MissingAura},{77472},{331}};
case 11: if(hp<35)return {{18562},{8936},{5185}}; return {{33763,C::MissingAura},{774,C::MissingAura},{50464},{5185}};
default:return {};
}
}
}
#endif