Skip to content

Commit

Permalink
Fix demonology warlocks spamming summons for demonic sacrifices
Browse files Browse the repository at this point in the history
  • Loading branch information
davidonete committed Jul 2, 2023
1 parent eb14b15 commit 2bf4da6
Show file tree
Hide file tree
Showing 4 changed files with 88 additions and 6 deletions.
23 changes: 20 additions & 3 deletions playerbot/strategy/warlock/DemonologyWarlockStrategy.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,23 @@

using namespace ai;

class DemonologyWarlockStrategyActionNodeFactory : public NamedObjectFactory<ActionNode>
{
public:
DemonologyWarlockStrategyActionNodeFactory()
{
creators["demonic sacrifice raid"] = &demonic_sacrifice_raid;
}

private:
ACTION_NODE_P(demonic_sacrifice_raid, "demonic sacrifice", "summon succubus");
};

DemonologyWarlockStrategy::DemonologyWarlockStrategy(PlayerbotAI* ai) : WarlockStrategy(ai)
{
actionNodeFactories.Add(new DemonologyWarlockStrategyActionNodeFactory());
}

#ifdef MANGOSBOT_ZERO // Vanilla

ai::NextAction** DemonologyWarlockStrategy::GetDefaultCombatActions()
Expand Down Expand Up @@ -202,7 +219,7 @@ void DemonologyWarlockBuffRaidStrategy::InitNonCombatTriggers(std::list<TriggerN

triggers.push_back(new TriggerNode(
"demonic sacrifice",
NextAction::array(0, new NextAction("summon succubus", ACTION_HIGH), new NextAction("demonic sacrifice", ACTION_HIGH), NULL)));
NextAction::array(0, new NextAction("demonic sacrifice raid", ACTION_HIGH), NULL)));
}

void DemonologyWarlockCcStrategy::InitCombatTriggers(std::list<TriggerNode*>& triggers)
Expand Down Expand Up @@ -519,7 +536,7 @@ void DemonologyWarlockBuffRaidStrategy::InitNonCombatTriggers(std::list<TriggerN

triggers.push_back(new TriggerNode(
"demonic sacrifice",
NextAction::array(0, new NextAction("summon felguard", ACTION_HIGH), new NextAction("demonic sacrifice", ACTION_HIGH), NULL)));
NextAction::array(0, new NextAction("demonic sacrifice raid", ACTION_HIGH), NULL)));
}

void DemonologyWarlockCcStrategy::InitCombatTriggers(std::list<TriggerNode*>& triggers)
Expand Down Expand Up @@ -844,7 +861,7 @@ void DemonologyWarlockBuffRaidStrategy::InitNonCombatTriggers(std::list<TriggerN

triggers.push_back(new TriggerNode(
"demonic sacrifice",
NextAction::array(0, new NextAction("summon succubus", ACTION_HIGH), new NextAction("demonic sacrifice", ACTION_HIGH), NULL)));
NextAction::array(0, new NextAction("demonic sacrifice raid", ACTION_HIGH), NULL)));
}

void DemonologyWarlockCcStrategy::InitCombatTriggers(std::list<TriggerNode*>& triggers)
Expand Down
2 changes: 1 addition & 1 deletion playerbot/strategy/warlock/DemonologyWarlockStrategy.h
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,7 @@ namespace ai
class DemonologyWarlockStrategy : public WarlockStrategy
{
public:
DemonologyWarlockStrategy(PlayerbotAI* ai) : WarlockStrategy(ai) {}
DemonologyWarlockStrategy(PlayerbotAI* ai);

protected:
virtual void InitCombatTriggers(std::list<TriggerNode*>& triggers) override;
Expand Down
55 changes: 55 additions & 0 deletions playerbot/strategy/warlock/WarlockActions.h
Original file line number Diff line number Diff line change
Expand Up @@ -255,34 +255,89 @@ namespace ai
public:
CastSummonImpAction(PlayerbotAI* ai) : CastBuffSpellAction(ai, "summon imp") {}
string GetTargetName() override { return "self target"; }

bool isUseful() override
{
Unit* pet = AI_VALUE(Unit*, "pet target");
if (pet)
{
return pet->GetEntry() != 416;
}

return true;
}
};

class CastSummonSuccubusAction : public CastSpellAction
{
public:
CastSummonSuccubusAction(PlayerbotAI* ai) : CastSpellAction(ai, "summon succubus") {}
string GetTargetName() override { return "self target"; }

bool isUseful() override
{
Unit* pet = AI_VALUE(Unit*, "pet target");
if (pet)
{
return pet->GetEntry() != 1863;
}

return true;
}
};

class CastSummonFelhunterAction : public CastSpellAction
{
public:
CastSummonFelhunterAction(PlayerbotAI* ai) : CastSpellAction(ai, "summon felhunter") {}
string GetTargetName() override { return "self target"; }

bool isUseful() override
{
Unit* pet = AI_VALUE(Unit*, "pet target");
if (pet)
{
return pet->GetEntry() != 417;
}

return true;
}
};

class CastSummonVoidwalkerAction : public CastSpellAction
{
public:
CastSummonVoidwalkerAction(PlayerbotAI* ai) : CastSpellAction(ai, "summon voidwalker") {}
string GetTargetName() override { return "self target"; }

bool isUseful() override
{
Unit* pet = AI_VALUE(Unit*, "pet target");
if (pet)
{
return pet->GetEntry() != 1860;
}

return true;
}
};

class CastSummonFelguardAction : public CastSpellAction
{
public:
CastSummonFelguardAction(PlayerbotAI* ai) : CastSpellAction(ai, "summon felguard") {}
string GetTargetName() override { return "self target"; }

bool isUseful() override
{
Unit* pet = AI_VALUE(Unit*, "pet target");
if (pet)
{
return pet->GetEntry() != 17252;
}

return true;
}
};

class CastSummonInfernoAction : public CastSpellAction
Expand Down
14 changes: 12 additions & 2 deletions playerbot/strategy/warlock/WarlockTriggers.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -175,12 +175,22 @@ bool ConflagrateTrigger::IsActive()

bool DemonicSacrificeTrigger::IsActive()
{
return bot->HasSpell(18788) && !bot->HasAura(18788);
if (ai->HasStrategy("pet", BotState::BOT_STATE_COMBAT))
{
return ai->HasSpell(18788) &&
!ai->HasAura(18789, bot) && // Burning Wish (Imp)
!ai->HasAura(18790, bot) && // Fel Stamina (Voidwalker)
!ai->HasAura(18791, bot) && // Touch of Shadow (Succubus)
!ai->HasAura(18792, bot) && // Fel Energy (Felhunter)
!ai->HasAura(35701, bot); // Touch of Shadow (Felguard)
}

return false;
}

bool SoulLinkTrigger::IsActive()
{
return bot->HasSpell(19028) && !bot->HasAura(19028) && AI_VALUE(Unit*, "pet target");
return ai->HasSpell(19028) && !ai->HasAura(19028, bot) && AI_VALUE(Unit*, "pet target");
}

bool NoSpecificPetTrigger::IsActive()
Expand Down

0 comments on commit 2bf4da6

Please sign in to comment.