diff --git a/src/AiFactory.cpp b/src/AiFactory.cpp index 15ce83ce..84fab366 100644 --- a/src/AiFactory.cpp +++ b/src/AiFactory.cpp @@ -326,11 +326,11 @@ void AiFactory::AddDefaultCombatStrategies(Player* player, PlayerbotAI* const fa break; case CLASS_PALADIN: if (tab == 1) - engine->addStrategies("tank", "tank assist", "bthreat", "cure", "barmor", "bstats", "close", "cc", nullptr); + engine->addStrategies("tank", "tank assist", "bthreat", "cure", "baoe", "bstats", "close", "cc", nullptr); else if (tab == 0) - engine->addStrategies("heal", "bmana", "dps assist", "cure", "flee", "barmor", nullptr); + engine->addStrategies("heal", "bmana", "dps assist", "cure", "flee", "cc", nullptr); else - engine->addStrategies("dps", "bdps", "dps assist", "cure", "baoe", "close", "cc", nullptr); + engine->addStrategies("dps", "bdps", "dps assist", "cure", "close", "cc", nullptr); if (player->getLevel() < 14) { @@ -492,11 +492,11 @@ void AiFactory::AddDefaultNonCombatStrategies(Player* player, PlayerbotAI* const break; case CLASS_PALADIN: if (tab == 1) - nonCombatEngine->addStrategies("bthreat", "tank assist", "barmor", "bstats", nullptr); + nonCombatEngine->addStrategies("bthreat", "tank assist", "baoe", "bstats", nullptr); else if (tab == 0) - nonCombatEngine->addStrategies("dps assist", "barmor", "bmana", nullptr); + nonCombatEngine->addStrategies("dps assist", "bmana", nullptr); else - nonCombatEngine->addStrategies("dps assist", "baoe", "bdps", nullptr); + nonCombatEngine->addStrategies("dps assist", "bdps", nullptr); nonCombatEngine->addStrategies("cure", nullptr); diff --git a/src/strategy/paladin/DpsPaladinStrategy.cpp b/src/strategy/paladin/DpsPaladinStrategy.cpp index 2c1e5509..f3814520 100644 --- a/src/strategy/paladin/DpsPaladinStrategy.cpp +++ b/src/strategy/paladin/DpsPaladinStrategy.cpp @@ -10,10 +10,16 @@ class DpsPaladinStrategyActionNodeFactory : public NamedObjectFactory& triggers) { GenericPaladinStrategy::InitTriggers(triggers); - triggers.push_back(new TriggerNode("seal", NextAction::array(0, new NextAction("seal of wisdom", 90.0f), nullptr))); - triggers.push_back(new TriggerNode("low health", NextAction::array(0, new NextAction("divine shield", ACTION_CRITICAL_HEAL + 2), new NextAction("holy light", ACTION_CRITICAL_HEAL + 2), nullptr))); - triggers.push_back(new TriggerNode("judgement of wisdom", NextAction::array(0, new NextAction("judgement of wisdom", ACTION_NORMAL + 2), nullptr))); + triggers.push_back(new TriggerNode("seal", NextAction::array(0, new NextAction("seal of command", 90.0f), nullptr))); + triggers.push_back(new TriggerNode("low mana", NextAction::array(0, new NextAction("seal of wisdom", 91.0f), nullptr))); + triggers.push_back(new TriggerNode("sanctity aura", NextAction::array(0, new NextAction("sanctity aura", 90.0f), nullptr))); + triggers.push_back(new TriggerNode("low health", NextAction::array(0, new NextAction("repentance or shield", ACTION_CRITICAL_HEAL + 3), new NextAction("holy light", ACTION_CRITICAL_HEAL + 2), nullptr))); + triggers.push_back(new TriggerNode("judgement of wisdom", NextAction::array(0, new NextAction("judgement of wisdom", ACTION_NORMAL + 10), nullptr))); + triggers.push_back(new TriggerNode("judgement", NextAction::array(0, new NextAction("judgement", ACTION_HIGH + 10), nullptr))); + triggers.push_back(new TriggerNode("enemy is close", NextAction::array(0, new NextAction("consecration", ACTION_INTERRUPT), nullptr))); + triggers.push_back(new TriggerNode("repentance on enemy healer", NextAction::array(0, new NextAction("repentance on enemy healer", ACTION_INTERRUPT + 2), nullptr))); + triggers.push_back(new TriggerNode("repentance on snare target", NextAction::array(0, new NextAction("repentance on snare target", ACTION_INTERRUPT + 2), nullptr))); + triggers.push_back(new TriggerNode("repentance", NextAction::array(0, new NextAction("repentance", ACTION_INTERRUPT + 2), nullptr))); triggers.push_back(new TriggerNode("medium aoe", NextAction::array(0, new NextAction("divine storm", ACTION_HIGH + 1), new NextAction("consecration", ACTION_HIGH + 1), nullptr))); triggers.push_back(new TriggerNode("art of war", NextAction::array(0, new NextAction("exorcism", ACTION_HIGH + 2), nullptr))); + triggers.push_back(new TriggerNode("target critical health", NextAction::array(0, new NextAction("hammer of wrath", ACTION_CRITICAL_HEAL), nullptr))); } diff --git a/src/strategy/paladin/GenericPaladinNonCombatStrategy.cpp b/src/strategy/paladin/GenericPaladinNonCombatStrategy.cpp index 30a54546..448e8b32 100644 --- a/src/strategy/paladin/GenericPaladinNonCombatStrategy.cpp +++ b/src/strategy/paladin/GenericPaladinNonCombatStrategy.cpp @@ -16,4 +16,6 @@ void GenericPaladinNonCombatStrategy::InitTriggers(std::vector& tr NonCombatStrategy::InitTriggers(triggers); triggers.push_back(new TriggerNode("party member dead", NextAction::array(0, new NextAction("redemption", 30.0f), nullptr))); + triggers.push_back(new TriggerNode("almost full health", NextAction::array(0, new NextAction("flash of light", 23.0f), nullptr))); + triggers.push_back(new TriggerNode("party member almost full health", NextAction::array(0, new NextAction("flash of light on party", 24.0f), nullptr))); } diff --git a/src/strategy/paladin/GenericPaladinStrategy.cpp b/src/strategy/paladin/GenericPaladinStrategy.cpp index ec40cb5f..2a28539f 100644 --- a/src/strategy/paladin/GenericPaladinStrategy.cpp +++ b/src/strategy/paladin/GenericPaladinStrategy.cpp @@ -15,15 +15,12 @@ void GenericPaladinStrategy::InitTriggers(std::vector& triggers) { CombatStrategy::InitTriggers(triggers); - triggers.push_back(new TriggerNode("low health", NextAction::array(0, new NextAction("divine protection", ACTION_CRITICAL_HEAL + 2), new NextAction("holy light", ACTION_CRITICAL_HEAL + 2), nullptr))); - triggers.push_back(new TriggerNode("party member low health", NextAction::array(0, new NextAction("holy light on party", ACTION_CRITICAL_HEAL + 1), nullptr))); - triggers.push_back(new TriggerNode("hammer of justice interrupt", NextAction::array(0, new NextAction("hammer of justice", ACTION_INTERRUPT), nullptr))); - triggers.push_back(new TriggerNode("hammer of justice on enemy healer", NextAction::array(0, new NextAction("hammer of justice on enemy healer", ACTION_INTERRUPT), nullptr))); - triggers.push_back(new TriggerNode("hammer of justice on snare target", NextAction::array(0, new NextAction("hammer of justice on snare target", ACTION_MOVE + 1), nullptr))); - triggers.push_back(new TriggerNode("critical health", NextAction::array(0, new NextAction("lay on hands", ACTION_EMERGENCY), nullptr))); - triggers.push_back(new TriggerNode("party member critical health", NextAction::array(0, new NextAction("lay on hands on party", ACTION_EMERGENCY), nullptr))); - triggers.push_back(new TriggerNode("target critical health", NextAction::array(0, new NextAction("hammer of wrath", ACTION_HIGH + 1), nullptr))); - triggers.push_back(new TriggerNode("often", NextAction::array(0, new NextAction("apply stone", 1.0f), nullptr))); + triggers.push_back(new TriggerNode("low health", NextAction::array(0, new NextAction("divine shield", ACTION_CRITICAL_HEAL + 2), new NextAction("holy light", ACTION_CRITICAL_HEAL + 2), nullptr))); + triggers.push_back(new TriggerNode("hammer of justice interrupt", NextAction::array(0, new NextAction("hammer of justice", ACTION_INTERRUPT), nullptr))); + triggers.push_back(new TriggerNode("hammer of justice on enemy healer", NextAction::array(0, new NextAction("hammer of justice on enemy healer", ACTION_INTERRUPT), nullptr))); + triggers.push_back(new TriggerNode("hammer of justice on snare target", NextAction::array(0, new NextAction("hammer of justice on snare target", ACTION_INTERRUPT), nullptr))); + triggers.push_back(new TriggerNode("critical health", NextAction::array(0, new NextAction("lay on hands", ACTION_EMERGENCY), nullptr))); + triggers.push_back(new TriggerNode("party member critical health", NextAction::array(0, new NextAction("lay on hands on party", ACTION_EMERGENCY + 1), nullptr))); triggers.push_back(new TriggerNode("protect party member", NextAction::array(0, new NextAction("blessing of protection on party", ACTION_EMERGENCY + 2), nullptr))); } diff --git a/src/strategy/paladin/HealPaladinStrategy.cpp b/src/strategy/paladin/HealPaladinStrategy.cpp index 6123e309..bb78569d 100644 --- a/src/strategy/paladin/HealPaladinStrategy.cpp +++ b/src/strategy/paladin/HealPaladinStrategy.cpp @@ -5,21 +5,43 @@ #include "HealPaladinStrategy.h" #include "Playerbots.h" +class HealPaladinStrategyActionNodeFactory : public NamedObjectFactory +{ +public: + HealPaladinStrategyActionNodeFactory() + { + creators["concentration aura"] = &concentration_aura; + } + +private: + ACTION_NODE_A(concentration_aura, "concentration aura", "devotion aura"); +}; + HealPaladinStrategy::HealPaladinStrategy(PlayerbotAI* botAI) : GenericPaladinStrategy(botAI) { + actionNodeFactories.Add(new HealPaladinStrategyActionNodeFactory()); } NextAction** HealPaladinStrategy::getDefaultActions() { - return NextAction::array(0, new NextAction("melee", ACTION_NORMAL), nullptr); + return NextAction::array(0, new NextAction("reach party member to heal", ACTION_NORMAL + 1), new NextAction("judgement", ACTION_NORMAL), nullptr); } void HealPaladinStrategy::InitTriggers(std::vector& triggers) { GenericPaladinStrategy::InitTriggers(triggers); + triggers.push_back(new TriggerNode("concentration aura", NextAction::array(0, new NextAction("concentration aura", 90.0f), nullptr))); + triggers.push_back(new TriggerNode("seal", NextAction::array(0, new NextAction("seal of light", ACTION_HIGH), nullptr))); + triggers.push_back(new TriggerNode("enemy is close", NextAction::array(0, new NextAction("judgement of light", ACTION_HIGH + 10), nullptr))); + triggers.push_back(new TriggerNode("enemy is close", NextAction::array(0, new NextAction("judgement", ACTION_HIGH + 10), nullptr))); + triggers.push_back(new TriggerNode("low mana", NextAction::array(0, new NextAction("divine favor", ACTION_HIGH + 1), nullptr))); + triggers.push_back(new TriggerNode("almost full health", NextAction::array(0, new NextAction("flash of light", ACTION_LIGHT_HEAL + 2), nullptr))); + triggers.push_back(new TriggerNode("party member almost full health", NextAction::array(0, new NextAction("flash of light on party", ACTION_LIGHT_HEAL + 1), nullptr))); triggers.push_back(new TriggerNode("medium health", NextAction::array(0, new NextAction("flash of light", ACTION_MEDIUM_HEAL + 2), nullptr))); triggers.push_back(new TriggerNode("party member medium health", NextAction::array(0, new NextAction("flash of light on party", ACTION_MEDIUM_HEAL + 1), nullptr))); + triggers.push_back(new TriggerNode("low health", NextAction::array(0, new NextAction("divine favor", ACTION_MEDIUM_HEAL + 4), new NextAction("holy shock", ACTION_MEDIUM_HEAL + 3), new NextAction("holy light", ACTION_MEDIUM_HEAL + 2), nullptr))); + triggers.push_back(new TriggerNode("party member low health", NextAction::array(0, new NextAction("divine favor", ACTION_MEDIUM_HEAL + 7), new NextAction("holy shock on party", ACTION_MEDIUM_HEAL + 6), new NextAction("holy light on party", ACTION_MEDIUM_HEAL + 5), nullptr))); triggers.push_back(new TriggerNode("blessing", NextAction::array(0, new NextAction("blessing of sanctuary", ACTION_HIGH + 9), nullptr))); - triggers.push_back(new TriggerNode("party member to heal out of spell range", NextAction::array(0, new NextAction("reach party member to heal", ACTION_CRITICAL_HEAL + 1), nullptr))); + triggers.push_back(new TriggerNode("party member to heal out of spell range", NextAction::array(0, new NextAction("reach party member to heal", ACTION_EMERGENCY + 3), nullptr))); } diff --git a/src/strategy/paladin/PaladinActions.h b/src/strategy/paladin/PaladinActions.h index 12a408ae..5d78343d 100644 --- a/src/strategy/paladin/PaladinActions.h +++ b/src/strategy/paladin/PaladinActions.h @@ -11,12 +11,6 @@ class PlayerbotAI; class Unit; -// judgements -MELEE_ACTION(CastJudgementAction, "judgement"); -MELEE_ACTION(CastJudgementOfLightAction, "judgement of light"); -MELEE_ACTION(CastJudgementOfWisdomAction, "judgement of wisdom"); -MELEE_ACTION(CastJudgementOfJusticeAction, "judgement of justice"); - // seals BUFF_ACTION(CastSealOfRighteousnessAction, "seal of righteousness"); BUFF_ACTION(CastSealOfJusticeAction, "seal of justice"); @@ -25,10 +19,40 @@ BUFF_ACTION(CastSealOfWisdomAction, "seal of wisdom"); BUFF_ACTION(CastSealOfCommandAction, "seal of command"); BUFF_ACTION(CastSealOfVengeanceAction, "seal of vengeance"); +// judgements +DEBUFF_ACTION_R(CastJudgementAction, "judgement", 10.0f); +DEBUFF_ACTION_R(CastJudgementOfLightAction, "judgement of light", 10.0f); +DEBUFF_ACTION_R(CastJudgementOfWisdomAction, "judgement of wisdom", 10.0f); +DEBUFF_ACTION_R(CastJudgementOfJusticeAction, "judgement of justice", 10.0f); + // auras BUFF_ACTION(CastDevotionAuraAction, "devotion aura"); BUFF_ACTION(CastRetributionAuraAction, "retribution aura"); BUFF_ACTION(CastConcentrationAuraAction, "concentration aura"); +BUFF_ACTION(CastShadowResistanceAuraAction, "shadow resistance aura"); +BUFF_ACTION(CastFrostResistanceAuraAction, "frost resistance aura"); +BUFF_ACTION(CastFireResistanceAuraAction, "fire resistance aura"); +BUFF_ACTION(CastCrusaderAuraAction, "crusader aura"); +BUFF_ACTION(CastSanctityAuraAction, "sanctity aura"); + +SPELL_ACTION(CastHolyShockAction, "holy shock"); +HEAL_PARTY_ACTION(CastHolyShockOnPartyAction, "holy shock"); + +// consecration +SPELL_ACTION(CastConsecrationAction, "consecration"); + +// repentance +SNARE_ACTION(CastRepentanceSnareAction, "repentance"); +DEBUFF_ACTION(CastRepentanceAction, "repentance"); +ENEMY_HEALER_ACTION(CastRepentanceOnHealerAction, "repentance"); + +//hamme of wrath +SPELL_ACTION(CastHammerOfWrathAction, "hammer of wrath"); + +// buffs +BUFF_ACTION(CastDivineFavorAction, "divine favor"); + +// blessings // fury BUFF_ACTION(CastRighteousFuryAction, "righteous fury"); @@ -45,30 +69,6 @@ class CastCrusaderStrikeAction : public CastMeleeSpellAction CastCrusaderStrikeAction(PlayerbotAI* botAI) : CastMeleeSpellAction(botAI, "crusader strike") { } }; -class CastShadowResistanceAuraAction : public CastBuffSpellAction -{ - public: - CastShadowResistanceAuraAction(PlayerbotAI* botAI) : CastBuffSpellAction(botAI, "shadow resistance aura") { } -}; - -class CastFrostResistanceAuraAction : public CastBuffSpellAction -{ - public: - CastFrostResistanceAuraAction(PlayerbotAI* botAI) : CastBuffSpellAction(botAI, "frost resistance aura") { } -}; - -class CastFireResistanceAuraAction : public CastBuffSpellAction -{ - public: - CastFireResistanceAuraAction(PlayerbotAI* botAI) : CastBuffSpellAction(botAI, "fire resistance aura") { } -}; - -class CastCrusaderAuraAction : public CastBuffSpellAction -{ - public: - CastCrusaderAuraAction(PlayerbotAI* botAI) : CastBuffSpellAction(botAI, "crusader aura") { } -}; - class CastSealSpellAction : public CastBuffSpellAction { public: @@ -157,8 +157,6 @@ class CastHolyLightOnPartyAction : public HealPartyMemberAction { public: CastHolyLightOnPartyAction(PlayerbotAI* botAI) : HealPartyMemberAction(botAI, "holy light") { } - - std::string const getName() override { return "holy light on party"; } }; class CastFlashOfLightAction : public CastHealingSpellAction @@ -171,8 +169,6 @@ class CastFlashOfLightOnPartyAction : public HealPartyMemberAction { public: CastFlashOfLightOnPartyAction(PlayerbotAI* botAI) : HealPartyMemberAction(botAI, "flash of light") { } - - std::string const getName() override { return "flash of light on party"; } }; class CastLayOnHandsAction : public CastHealingSpellAction @@ -185,8 +181,6 @@ class CastLayOnHandsOnPartyAction : public HealPartyMemberAction { public: CastLayOnHandsOnPartyAction(PlayerbotAI* botAI) : HealPartyMemberAction(botAI, "lay on hands") { } - - std::string const getName() override { return "lay on hands on party"; } }; class CastDivineProtectionAction : public CastBuffSpellAction @@ -209,12 +203,6 @@ class CastDivineShieldAction: public CastBuffSpellAction CastDivineShieldAction(PlayerbotAI* botAI) : CastBuffSpellAction(botAI, "divine shield") { } }; -class CastConsecrationAction : public CastMeleeSpellAction -{ - public: - CastConsecrationAction(PlayerbotAI* botAI) : CastMeleeSpellAction(botAI, "consecration") { } -}; - class CastHolyWrathAction : public CastMeleeSpellAction { public: @@ -227,12 +215,6 @@ class CastHammerOfJusticeAction : public CastMeleeSpellAction CastHammerOfJusticeAction(PlayerbotAI* botAI) : CastMeleeSpellAction(botAI, "hammer of justice") { } }; -class CastHammerOfWrathAction : public CastMeleeSpellAction -{ - public: - CastHammerOfWrathAction(PlayerbotAI* botAI) : CastMeleeSpellAction(botAI, "hammer of wrath") { } -}; - class CastHammerOfTheRighteousAction : public CastMeleeSpellAction { public: @@ -351,12 +333,6 @@ class CastHammerOfJusticeSnareAction : public CastSnareSpellAction CastHammerOfJusticeSnareAction(PlayerbotAI* botAI) : CastSnareSpellAction(botAI, "hammer of justice") { } }; -class CastDivineFavorAction : public CastBuffSpellAction -{ - public: - CastDivineFavorAction(PlayerbotAI* botAI) : CastBuffSpellAction(botAI, "divine favor") { } -}; - class CastTurnUndeadAction : public CastBuffSpellAction { public: diff --git a/src/strategy/paladin/PaladinAiObjectContext.cpp b/src/strategy/paladin/PaladinAiObjectContext.cpp index 4ede9946..5d2f213b 100644 --- a/src/strategy/paladin/PaladinAiObjectContext.cpp +++ b/src/strategy/paladin/PaladinAiObjectContext.cpp @@ -92,6 +92,7 @@ class PaladinTriggerFactoryInternal : public NamedObjectContext public: PaladinTriggerFactoryInternal() { + creators["judgement"] = &PaladinTriggerFactoryInternal::judgement; creators["judgement of wisdom"] = &PaladinTriggerFactoryInternal::judgement_of_wisdom; creators["judgement of light"] = &PaladinTriggerFactoryInternal::judgement_of_light; creators["blessing"] = &PaladinTriggerFactoryInternal::blessing; @@ -101,6 +102,8 @@ class PaladinTriggerFactoryInternal : public NamedObjectContext creators["crusader aura"] = &PaladinTriggerFactoryInternal::crusader_aura; creators["retribution aura"] = &PaladinTriggerFactoryInternal::retribution_aura; creators["devotion aura"] = &PaladinTriggerFactoryInternal::devotion_aura; + creators["sanctity aura"] = &PaladinTriggerFactoryInternal::sanctity_aura; + creators["concentration aura"] = &PaladinTriggerFactoryInternal::concentration_aura; creators["shadow resistance aura"] = &PaladinTriggerFactoryInternal::shadow_resistance_aura; creators["frost resistance aura"] = &PaladinTriggerFactoryInternal::frost_resistance_aura; creators["fire resistance aura"] = &PaladinTriggerFactoryInternal::fire_resistance_aura; @@ -119,6 +122,10 @@ class PaladinTriggerFactoryInternal : public NamedObjectContext creators["divine favor"] = &PaladinTriggerFactoryInternal::divine_favor; creators["turn undead"] = &PaladinTriggerFactoryInternal::turn_undead; creators["avenger's shield"] = &PaladinTriggerFactoryInternal::avenger_shield; + creators["consecration"] = &PaladinTriggerFactoryInternal::consecration; + creators["repentance on enemy healer"] = &PaladinTriggerFactoryInternal::repentance_on_enemy_healer; + creators["repentance on snare target"] = &PaladinTriggerFactoryInternal::repentance_on_snare_target; + creators["repentance interrupt"] = &PaladinTriggerFactoryInternal::repentance_interrupt; } private: @@ -126,6 +133,7 @@ class PaladinTriggerFactoryInternal : public NamedObjectContext static Trigger* divine_favor(PlayerbotAI* botAI) { return new DivineFavorTrigger(botAI); } static Trigger* holy_shield(PlayerbotAI* botAI) { return new HolyShieldTrigger(botAI); } static Trigger* righteous_fury(PlayerbotAI* botAI) { return new RighteousFuryTrigger(botAI); } + static Trigger* judgement(PlayerbotAI* botAI) { return new JudgementTrigger(botAI); } static Trigger* judgement_of_wisdom(PlayerbotAI* botAI) { return new JudgementOfWisdomTrigger(botAI); } static Trigger* judgement_of_light(PlayerbotAI* botAI) { return new JudgementOfLightTrigger(botAI); } static Trigger* blessing(PlayerbotAI* botAI) { return new BlessingTrigger(botAI); } @@ -135,6 +143,8 @@ class PaladinTriggerFactoryInternal : public NamedObjectContext static Trigger* crusader_aura(PlayerbotAI* botAI) { return new CrusaderAuraTrigger(botAI); } static Trigger* retribution_aura(PlayerbotAI* botAI) { return new RetributionAuraTrigger(botAI); } static Trigger* devotion_aura(PlayerbotAI* botAI) { return new DevotionAuraTrigger(botAI); } + static Trigger* sanctity_aura(PlayerbotAI* botAI) { return new SanctityAuraTrigger(botAI); } + static Trigger* concentration_aura(PlayerbotAI* botAI) { return new ConcentrationAuraTrigger(botAI); } static Trigger* shadow_resistance_aura(PlayerbotAI* botAI) { return new ShadowResistanceAuraTrigger(botAI); } static Trigger* frost_resistance_aura(PlayerbotAI* botAI) { return new FrostResistanceAuraTrigger(botAI); } static Trigger* fire_resistance_aura(PlayerbotAI* botAI) { return new FireResistanceAuraTrigger(botAI); } @@ -149,6 +159,10 @@ class PaladinTriggerFactoryInternal : public NamedObjectContext static Trigger* hammer_of_justice_on_enemy_target(PlayerbotAI* botAI) { return new HammerOfJusticeEnemyHealerTrigger(botAI); } static Trigger* hammer_of_justice_on_snare_target(PlayerbotAI* botAI) { return new HammerOfJusticeSnareTrigger(botAI); } static Trigger* avenger_shield(PlayerbotAI* botAI) { return new AvengerShieldTrigger(botAI); } + static Trigger* consecration(PlayerbotAI* botAI) { return new ConsecrationTrigger(ai); } + static Trigger* repentance_on_enemy_healer(PlayerbotAI* botAI) { return new RepentanceOnHealerTrigger(botAI); } + static Trigger* repentance_on_snare_target(PlayerbotAI* botAI) { return new RepentanceSnareTrigger(botAI); } + static Trigger* repentance_interrupt(PlayerbotAI* botAI) { return new RepentanceInterruptTrigger(botAI); } }; class PaladinAiObjectContextInternal : public NamedObjectContext @@ -171,6 +185,7 @@ class PaladinAiObjectContextInternal : public NamedObjectContext creators["crusader aura"] = &PaladinAiObjectContextInternal::crusader_aura; creators["seal of light"] = &PaladinAiObjectContextInternal::seal_of_light; creators["devotion aura"] = &PaladinAiObjectContextInternal::devotion_aura; + creators["concentration aura"] = &PaladinAiObjectContextInternal::concentration_aura; creators["holy wrath"] = &PaladinAiObjectContextInternal::holy_wrath; creators["consecration"] = &PaladinAiObjectContextInternal::consecration; creators["cleanse disease"] = &PaladinAiObjectContextInternal::cleanse_disease; @@ -217,6 +232,12 @@ class PaladinAiObjectContextInternal : public NamedObjectContext creators["turn undead"] = &PaladinAiObjectContextInternal::turn_undead; creators["blessing of protection on party"] = &PaladinAiObjectContextInternal::blessing_of_protection_on_party; creators["righteous defense"] = &PaladinAiObjectContextInternal::righteous_defense; + creators["repentance"] = &PaladinAiObjectContextInternal::repentance; + creators["repentance on snare target"] = &PaladinAiObjectContextInternal::repentance_on_snare_target; + creators["repentance on enemy healer"] = &PaladinAiObjectContextInternal::repentance_on_enemy_healer; + creators["sanctity aura"] = &PaladinAiObjectContextInternal::sanctity_aura; + creators["holy shock"] = &PaladinAiObjectContextInternal::holy_shock; + creators["holy shock on party"] = &PaladinAiObjectContextInternal::holy_shock_on_party; } private: @@ -239,6 +260,7 @@ class PaladinAiObjectContextInternal : public NamedObjectContext static Action* crusader_aura(PlayerbotAI* botAI) { return new CastCrusaderAuraAction(botAI); } static Action* seal_of_light(PlayerbotAI* botAI) { return new CastSealOfLightAction(botAI); } static Action* devotion_aura(PlayerbotAI* botAI) { return new CastDevotionAuraAction(botAI); } + static Action* concentration_aura(PlayerbotAI* botAI) { return new CastConcentrationAuraAction(botAI); } static Action* holy_wrath(PlayerbotAI* botAI) { return new CastHolyWrathAction(botAI); } static Action* consecration(PlayerbotAI* botAI) { return new CastConsecrationAction(botAI); } static Action* cleanse_poison(PlayerbotAI* botAI) { return new CastCleansePoisonAction(botAI); } @@ -281,6 +303,12 @@ class PaladinAiObjectContextInternal : public NamedObjectContext static Action* hammer_of_justice_on_enemy_healer(PlayerbotAI* botAI) { return new CastHammerOfJusticeOnEnemyHealerAction(botAI); } static Action* hammer_of_justice_on_snare_target(PlayerbotAI* botAI) { return new CastHammerOfJusticeSnareAction(botAI); } static Action* righteous_defense(PlayerbotAI* botAI) { return new CastRighteousDefenseAction(botAI); } + static Action* repentance(PlayerbotAI* botAI) { return new CastRepentanceAction(botAI); } + static Action* repentance_on_snare_target(PlayerbotAI* botAI) { return new CastRepentanceSnareAction(botAI); } + static Action* repentance_on_enemy_healer(PlayerbotAI* botAI) { return new CastRepentanceOnHealerAction(botAI); } + static Action* sanctity_aura(PlayerbotAI* botAI) { return new CastSanctityAuraAction(botAI); } + static Action* holy_shock(PlayerbotAI* botAI) { return new CastHolyShockAction(botAI); } + static Action* holy_shock_on_party(PlayerbotAI* botAI) { return new CastHolyShockOnPartyAction(botAI); } }; PaladinAiObjectContext::PaladinAiObjectContext(PlayerbotAI* botAI) : AiObjectContext(botAI) diff --git a/src/strategy/paladin/PaladinTriggers.h b/src/strategy/paladin/PaladinTriggers.h index 3391ce8b..04fe65e8 100644 --- a/src/strategy/paladin/PaladinTriggers.h +++ b/src/strategy/paladin/PaladinTriggers.h @@ -31,9 +31,19 @@ class SealTrigger : public BuffTrigger bool IsActive() override; }; +// judgements +DEBUFF_TRIGGER(JudgementTrigger, "judgement"); DEBUFF_TRIGGER(JudgementOfLightTrigger, "judgement of light"); DEBUFF_TRIGGER(JudgementOfWisdomTrigger, "judgement of wisdom"); +DEBUFF_TRIGGER(ConsecrationTrigger, "consecration"); + +// repentance triggers +INTERRUPT_HEALER_TRIGGER(RepentanceOnHealerTrigger, "repentance on enemy healer"); +SNARE_TRIGGER(RepentanceSnareTrigger, "repentance on snare target"); +INTERRUPT_TRIGGER(RepentanceInterruptTrigger, "repentance"); + + class BlessingOnPartyTrigger : public BuffOnPartyTrigger { public: @@ -90,6 +100,9 @@ class DevotionAuraTrigger : public BuffTrigger DevotionAuraTrigger(PlayerbotAI* botAI) : BuffTrigger(botAI, "devotion aura") { } }; +BUFF_TRIGGER(ConcentrationAuraTrigger, "concentration aura"); + + class CleanseCureDiseaseTrigger : public NeedCureTrigger { public: diff --git a/src/strategy/paladin/TankPaladinStrategy.cpp b/src/strategy/paladin/TankPaladinStrategy.cpp index 36a7daf9..b35cf783 100644 --- a/src/strategy/paladin/TankPaladinStrategy.cpp +++ b/src/strategy/paladin/TankPaladinStrategy.cpp @@ -40,15 +40,18 @@ void TankPaladinStrategy::InitTriggers(std::vector& triggers) { GenericPaladinStrategy::InitTriggers(triggers); - triggers.push_back(new TriggerNode("seal", NextAction::array(0, new NextAction("seal of vengeance", 90.0f), nullptr))); - triggers.push_back(new TriggerNode("judgement of light", NextAction::array(0, new NextAction("judgement of light", ACTION_NORMAL + 2), nullptr))); - triggers.push_back(new TriggerNode("medium mana", NextAction::array(0, new NextAction("judgement of wisdom", ACTION_NORMAL + 3), nullptr))); - triggers.push_back(new TriggerNode("enemy is close", NextAction::array(0, new NextAction("judgement", ACTION_NORMAL + 3), nullptr))); - triggers.push_back(new TriggerNode("light aoe", NextAction::array(0, new NextAction("hammer of the righteous", ACTION_HIGH + 6), new NextAction("avenger's shield", ACTION_HIGH + 6), nullptr))); - triggers.push_back(new TriggerNode("avenger's shield", NextAction::array(0, new NextAction("avenger's shield", ACTION_HIGH + 6), nullptr))); - triggers.push_back(new TriggerNode("medium aoe", NextAction::array(0, new NextAction("consecration", ACTION_HIGH + 6), nullptr))); - triggers.push_back(new TriggerNode("enemy is close", NextAction::array(0, new NextAction("consecration", ACTION_HIGH + 6), nullptr))); + triggers.push_back(new TriggerNode("seal", NextAction::array(0, new NextAction("seal of vengeance", 90.0f), NULL))); + triggers.push_back(new TriggerNode("low mana", NextAction::array(0, new NextAction("seal of wisdom", 91.0f), nullptr))); + triggers.push_back(new TriggerNode("judgement of light", NextAction::array(0, new NextAction("judgement of light", ACTION_HIGH + 6), nullptr))); + triggers.push_back(new TriggerNode("medium mana", NextAction::array(0, new NextAction("judgement of wisdom", ACTION_HIGH + 6), nullptr))); + triggers.push_back(new TriggerNode("judgement", NextAction::array(0, new NextAction("judgement", ACTION_HIGH + 6), nullptr))); + triggers.push_back(new TriggerNode("judgement", NextAction::array(0, new NextAction("exorcism", ACTION_HIGH + 6), nullptr))); + triggers.push_back(new TriggerNode("light aoe", NextAction::array(0, new NextAction("hammer of the righteous", ACTION_HIGH + 8), new NextAction("avenger's shield", ACTION_HIGH + 7), nullptr))); + triggers.push_back(new TriggerNode("avenger's shield", NextAction::array(0, new NextAction("avenger's shield", ACTION_HIGH + 7), nullptr))); + triggers.push_back(new TriggerNode("enemy is close", NextAction::array(0, new NextAction("consecration", ACTION_INTERRUPT), nullptr))); triggers.push_back(new TriggerNode("lose aggro", NextAction::array(0, new NextAction("hand of reckoning", ACTION_HIGH + 7), nullptr))); - triggers.push_back(new TriggerNode("holy shield", NextAction::array(0, new NextAction("holy shield", ACTION_HIGH + 7), nullptr))); + triggers.push_back(new TriggerNode("lose aggro", NextAction::array(0, new NextAction("exorcism", ACTION_HIGH + 8), nullptr))); + triggers.push_back(new TriggerNode("holy shield", NextAction::array(0, new NextAction("holy shield", ACTION_HIGH + 7), nullptr))); triggers.push_back(new TriggerNode("blessing", NextAction::array(0, new NextAction("blessing of sanctuary", ACTION_HIGH + 9), nullptr))); + triggers.push_back(new TriggerNode("target critical health", NextAction::array(0, new NextAction("hammer of wrath", ACTION_CRITICAL_HEAL), nullptr))); }