From 3cb5d065d5b82a3f6ac98fc66d59b7266c1de214 Mon Sep 17 00:00:00 2001 From: Velite12 <45871932+Velite12@users.noreply.github.com> Date: Sun, 28 Jun 2026 22:22:46 -0400 Subject: [PATCH 1/4] Add mechanar strategy/action/trigger files --- playerbot/strategy/StrategyContext.h | 3 ++ playerbot/strategy/actions/ActionContext.h | 7 ++++ .../actions/MechanarDungeonActions.cpp | 5 +++ .../strategy/actions/MechanarDungeonActions.h | 37 +++++++++++++++++++ .../generic/MechanarDungeonStrategies.cpp | 34 +++++++++++++++++ .../generic/MechanarDungeonStrategies.h | 27 ++++++++++++++ .../triggers/MechanarDungeonTriggers.cpp | 9 +++++ .../triggers/MechanarDungeonTriggers.h | 36 ++++++++++++++++++ playerbot/strategy/triggers/TriggerContext.h | 7 ++++ 9 files changed, 165 insertions(+) create mode 100644 playerbot/strategy/actions/MechanarDungeonActions.cpp create mode 100644 playerbot/strategy/actions/MechanarDungeonActions.h create mode 100644 playerbot/strategy/generic/MechanarDungeonStrategies.cpp create mode 100644 playerbot/strategy/generic/MechanarDungeonStrategies.h create mode 100644 playerbot/strategy/triggers/MechanarDungeonTriggers.cpp create mode 100644 playerbot/strategy/triggers/MechanarDungeonTriggers.h diff --git a/playerbot/strategy/StrategyContext.h b/playerbot/strategy/StrategyContext.h index 5368e59e2..0fdeb5b82 100644 --- a/playerbot/strategy/StrategyContext.h +++ b/playerbot/strategy/StrategyContext.h @@ -56,6 +56,7 @@ #include "generic/BlackwingLairDungeonStrategies.h" #include "generic/KarazhanDungeonStrategies.h" #include "generic/NaxxramasDungeonStrategies.h" +#include "generic/MechanarDungeonStrategies.h" namespace ai { @@ -170,6 +171,7 @@ namespace ai creators["blackwing lair"] = [](PlayerbotAI* ai) { return new BlackwingLairDungeonStrategy(ai); }; creators["karazhan"] = [](PlayerbotAI* ai) { return new KarazhanDungeonStrategy(ai); }; creators["naxxramas"] = [](PlayerbotAI* ai) { return new NaxxramasDungeonStrategy(ai); }; + creators["mechanar"] = [](PlayerbotAI* ai) { return new MechanarDungeonStrategy(ai); }; // Dungeon Boss Strategies creators["onyxia"] = [](PlayerbotAI* ai) { return new OnyxiaFightStrategy(ai); }; @@ -178,6 +180,7 @@ namespace ai creators["netherspite"] = [](PlayerbotAI* ai) { return new NetherspiteFightStrategy(ai); }; creators["prince malchezaar"] = [](PlayerbotAI* ai) { return new PrinceMalchezaarFightStrategy(ai); }; creators["four horseman"] = [](PlayerbotAI* ai) { return new FourHorsemanFightStrategy(ai); }; + creators["nethermancer sepethrea"] = [](PlayerbotAI* ai) { return new NethermancerSepethreaFightStrategy(ai); }; #ifdef GenerateBotTests creators["test"] = [](PlayerbotAI* ai) { return new TestStrategy(ai); }; diff --git a/playerbot/strategy/actions/ActionContext.h b/playerbot/strategy/actions/ActionContext.h index 227e550f5..9bbc78b15 100644 --- a/playerbot/strategy/actions/ActionContext.h +++ b/playerbot/strategy/actions/ActionContext.h @@ -79,6 +79,7 @@ #include "BlackwingLairDungeonActions.h" #include "KarazhanDungeonActions.h" #include "NaxxramasDungeonActions.h" +#include "MechanarDungeonActions.h" #ifdef GenerateBotTests #include "../tests/TestAction.h" @@ -374,6 +375,8 @@ namespace ai creators["disable karazhan strategy"] = [](PlayerbotAI* ai) { return new KarazhanDisableDungeonStrategyAction(ai); }; creators["enable naxxramas strategy"] = [](PlayerbotAI* ai) { return new NaxxramasEnableDungeonStrategyAction(ai); }; creators["disable naxxramas strategy"] = [](PlayerbotAI* ai) { return new NaxxramasDisableDungeonStrategyAction(ai); }; + creators["enable mechanar strategy"] = [](PlayerbotAI* ai) { return new MechanarEnableDungeonStrategyAction(ai); }; + creators["disable mechanar strategy"] = [](PlayerbotAI* ai) { return new MechanarDisableDungeonStrategyAction(ai); }; // Dungeon Boss Actions creators["enable onyxia fight strategy"] = [](PlayerbotAI* ai) { return new OnyxiaEnableFightStrategyAction(ai); }; @@ -408,6 +411,10 @@ namespace ai creators["enable four horseman fight strategy"] = [](PlayerbotAI* ai) { return new FourHorsemanEnableFightStrategyAction(ai); }; creators["disable four horseman fight strategy"] = [](PlayerbotAI* ai) { return new FourHorsemanDisableFightStrategyAction(ai); }; + creators["enable nethermancer sepethrea fight strategy"] = [](PlayerbotAI* ai) { return new NethermancerSepethreaEnableFightStrategyAction(ai); }; + creators["disable nethermancer sepethrea fight strategy"] = [](PlayerbotAI* ai) { return new NethermancerSepethreaDisableFightStrategyAction(ai); }; + creators["move away from raging flames"] = [](PlayerbotAI* ai) { return new RagingFlamesMoveAwayAction(ai); }; + #ifdef GenerateBotTests creators["test"] = [](PlayerbotAI* ai) { return new TestAction(ai); }; #endif diff --git a/playerbot/strategy/actions/MechanarDungeonActions.cpp b/playerbot/strategy/actions/MechanarDungeonActions.cpp new file mode 100644 index 000000000..506762607 --- /dev/null +++ b/playerbot/strategy/actions/MechanarDungeonActions.cpp @@ -0,0 +1,5 @@ + +#include "playerbot/playerbot.h" +#include "MechanarDungeonActions.h" + +using namespace ai; \ No newline at end of file diff --git a/playerbot/strategy/actions/MechanarDungeonActions.h b/playerbot/strategy/actions/MechanarDungeonActions.h new file mode 100644 index 000000000..b5c04ef90 --- /dev/null +++ b/playerbot/strategy/actions/MechanarDungeonActions.h @@ -0,0 +1,37 @@ +#pragma once +#include "DungeonActions.h" +#include "ChangeStrategyAction.h" +#include "UseItemAction.h" + +namespace ai +{ + class MechanarEnableDungeonStrategyAction : public ChangeAllStrategyAction + { + public: + MechanarEnableDungeonStrategyAction(PlayerbotAI* ai) : ChangeAllStrategyAction(ai, "enable mechanar strategy", "+mechanar") {} + }; + + class MechanarDisableDungeonStrategyAction : public ChangeAllStrategyAction + { + public: + MechanarDisableDungeonStrategyAction(PlayerbotAI* ai) : ChangeAllStrategyAction(ai, "disable mechanar strategy", "-tempest keep") {} + }; + + class NethermancerSepethreaEnableFightStrategyAction : public ChangeAllStrategyAction + { + public: + NethermancerSepethreaEnableFightStrategyAction(PlayerbotAI* ai) : ChangeAllStrategyAction(ai, "enable nethermancer sepethrea fight strategy", "+nethermancer sepethrea") {} + }; + + class NethermancerSepethreaDisableFightStrategyAction : public ChangeAllStrategyAction + { + public: + NethermancerSepethreaDisableFightStrategyAction(PlayerbotAI* ai) : ChangeAllStrategyAction(ai, "disable nethermancer sepethrea fight strategy", "-nethermancer sepethrea") {} + }; + + class RagingFlamesMoveAwayAction : public MoveAwayFromCreature + { + public: + RagingFlamesMoveAwayAction(PlayerbotAI* ai) : MoveAwayFromCreature(ai, "move away from raging flames", 20481, 10.0f) {} + }; +} \ No newline at end of file diff --git a/playerbot/strategy/generic/MechanarDungeonStrategies.cpp b/playerbot/strategy/generic/MechanarDungeonStrategies.cpp new file mode 100644 index 000000000..3973a9947 --- /dev/null +++ b/playerbot/strategy/generic/MechanarDungeonStrategies.cpp @@ -0,0 +1,34 @@ + +#include "playerbot/playerbot.h" +#include "MechanarDungeonStrategies.h" +#include "DungeonMultipliers.h" + +using namespace ai; + +void MechanarDungeonStrategy::InitCombatTriggers(std::list& triggers) +{ + triggers.push_back(new TriggerNode( + "start nethermancer sepethrea fight", + NextAction::array(0, new NextAction("enable nethermancer sepethrea fight strategy", 100.0f), NULL))); +} + +void NethermancerSepethreaFightStrategy::InitCombatTriggers(std::list& triggers) +{ + triggers.push_back(new TriggerNode( + "raging flames too close", + NextAction::array(0, new NextAction("move away from raging flames", 100.0f), NULL))); +} + +void NethermancerSepethreaFightStrategy::InitNonCombatTriggers(std::list& triggers) +{ + triggers.push_back(new TriggerNode( + "end nethermancer sepethrea fight", + NextAction::array(0, new NextAction("disable nethermancer sepethrea fight strategy", 100.0f), NULL))); +} + +void NethermancerSepethreaFightStrategy::InitDeadTriggers(std::list& triggers) +{ + triggers.push_back(new TriggerNode( + "end nethermancer sepethrea fight", + NextAction::array(0, new NextAction("disable nethermancer sepethrea fight strategy", 100.0f), NULL))); +} diff --git a/playerbot/strategy/generic/MechanarDungeonStrategies.h b/playerbot/strategy/generic/MechanarDungeonStrategies.h new file mode 100644 index 000000000..80192d229 --- /dev/null +++ b/playerbot/strategy/generic/MechanarDungeonStrategies.h @@ -0,0 +1,27 @@ +#pragma once +#include "playerbot/strategy/Strategy.h" + +namespace ai +{ + class MechanarDungeonStrategy : public Strategy + { + public: + MechanarDungeonStrategy(PlayerbotAI* ai) : Strategy(ai) {} + std::string getName() override { return "mechanar"; } + + private: + void InitCombatTriggers(std::list& triggers) override; + }; + + class NethermancerSepethreaFightStrategy : public Strategy + { + public: + NethermancerSepethreaFightStrategy(PlayerbotAI* ai) : Strategy(ai) {} + std::string getName() override { return "nethermancer sepethrea"; } + + private: + void InitCombatTriggers(std::list& triggers) override; + void InitNonCombatTriggers(std::list& triggers) override; + void InitDeadTriggers(std::list& triggers) override; + }; +} \ No newline at end of file diff --git a/playerbot/strategy/triggers/MechanarDungeonTriggers.cpp b/playerbot/strategy/triggers/MechanarDungeonTriggers.cpp new file mode 100644 index 000000000..8f8745034 --- /dev/null +++ b/playerbot/strategy/triggers/MechanarDungeonTriggers.cpp @@ -0,0 +1,9 @@ + +#include "playerbot/playerbot.h" +#include "MechanarDungeonTriggers.h" +#include "GenericTriggers.h" +#include "Grids/GridNotifiers.h" +#include "Grids/GridNotifiersImpl.h" +#include "Grids/CellImpl.h" + +using namespace ai; \ No newline at end of file diff --git a/playerbot/strategy/triggers/MechanarDungeonTriggers.h b/playerbot/strategy/triggers/MechanarDungeonTriggers.h new file mode 100644 index 000000000..dddd2d174 --- /dev/null +++ b/playerbot/strategy/triggers/MechanarDungeonTriggers.h @@ -0,0 +1,36 @@ +#pragma once +#include "DungeonTriggers.h" +#include "GenericTriggers.h" + +namespace ai +{ + class MechanarEnterDungeonTrigger : public EnterDungeonTrigger + { + public: + MechanarEnterDungeonTrigger(PlayerbotAI* ai) : EnterDungeonTrigger(ai, "enter mechanar", "mechanar", 554) {} + }; + + class MechanarLeaveDungeonTrigger : public LeaveDungeonTrigger + { + public: + MechanarLeaveDungeonTrigger(PlayerbotAI* ai) : LeaveDungeonTrigger(ai, "leave mechanar", "mechanar", 554) {} + }; + + class NethermancerSepethreaStartFightTrigger : public StartBossFightTrigger + { + public: + NethermancerSepethreaStartFightTrigger(PlayerbotAI* ai) : StartBossFightTrigger(ai, "start nethermancer sepethrea fight", "nethermancer sepethrea", 19221) {} + }; + + class NethermancerSepethreaEndFightTrigger : public EndBossFightTrigger + { + public: + NethermancerSepethreaEndFightTrigger(PlayerbotAI* ai) : EndBossFightTrigger(ai, "end nethermancer sepethrea fight", "nethermancer sepethrea", 19221) {} + }; + + class RagingFlamesTooCloseTrigger : public CloseToCreatureTrigger + { + public: + RagingFlamesTooCloseTrigger(PlayerbotAI* ai) : CloseToCreatureTrigger(ai, "raging flames too close", 20481, 10.0f) {} + }; +} \ No newline at end of file diff --git a/playerbot/strategy/triggers/TriggerContext.h b/playerbot/strategy/triggers/TriggerContext.h index 967196cbb..8706b278e 100644 --- a/playerbot/strategy/triggers/TriggerContext.h +++ b/playerbot/strategy/triggers/TriggerContext.h @@ -19,6 +19,7 @@ #include "BlackwingLairDungeonTriggers.h" #include "KarazhanDungeonTriggers.h" #include "NaxxramasDungeonTriggers.h" +#include "MechanarDungeonTriggers.h" #include "GlyphTriggers.h" #include "WorldBuffTravelTriggers.h" @@ -308,6 +309,8 @@ namespace ai creators["leave naxxramas"] = [](PlayerbotAI* ai) { return new NaxxramasLeaveDungeonTrigger(ai); }; creators["enter blackwing lair"] = [](PlayerbotAI* ai) { return new BlackwingLairEnterDungeonTrigger(ai); }; creators["leave blackwing lair"] = [](PlayerbotAI* ai) { return new BlackwingLairLeaveDungeonTrigger(ai); }; + creators["enter mechanar"] = [](PlayerbotAI* ai) { return new MechanarEnterDungeonTrigger(ai); }; + creators["leave mechanar"] = [](PlayerbotAI* ai) { return new MechanarLeaveDungeonTrigger(ai); }; // Dungeon Boss Triggers creators["start onyxia fight"] = [](PlayerbotAI* ai) { return new OnyxiaStartFightTrigger(ai); }; @@ -343,6 +346,10 @@ namespace ai creators["start four horseman fight"] = [](PlayerbotAI* ai) { return new FourHorsemanStartFightTrigger(ai); }; creators["end four horseman fight"] = [](PlayerbotAI* ai) { return new FourHorsemanEndFightTrigger(ai); }; + creators["start nethermancer sepethrea fight"] = [](PlayerbotAI* ai) { return new NethermancerSepethreaStartFightTrigger(ai); }; + creators["end nethermancer sepethrea fight"] = [](PlayerbotAI* ai) { return new NethermancerSepethreaEndFightTrigger(ai); }; + creators["raging flames too close"] = [](PlayerbotAI* ai) { return new RagingFlamesTooCloseTrigger(ai); }; + // Test framework triggers #ifdef GenerateBotTests creators["test ready"] = [](PlayerbotAI* ai) { return new TestReadyTrigger(ai); }; From 6af37a5423c22ac03751964ddfa772b9153b8eff Mon Sep 17 00:00:00 2001 From: Velite12 <45871932+Velite12@users.noreply.github.com> Date: Sun, 28 Jun 2026 22:35:27 -0400 Subject: [PATCH 2/4] Add to dungeonstrategy.cpp --- playerbot/strategy/generic/DungeonStrategy.cpp | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/playerbot/strategy/generic/DungeonStrategy.cpp b/playerbot/strategy/generic/DungeonStrategy.cpp index bcd1a43c5..43f0a57e9 100644 --- a/playerbot/strategy/generic/DungeonStrategy.cpp +++ b/playerbot/strategy/generic/DungeonStrategy.cpp @@ -22,6 +22,10 @@ void DungeonStrategy::InitCombatTriggers(std::list& triggers) triggers.push_back(new TriggerNode( "enter karazhan", NextAction::array(0, new NextAction("enable karazhan strategy", 100.0f), NULL))); + + triggers.push_back(new TriggerNode( + "enter mechanar", + NextAction::array(0, new NextAction("enable mechanar strategy", 100.0f), NULL))); } void DungeonStrategy::InitNonCombatTriggers(std::list& triggers) @@ -57,4 +61,12 @@ void DungeonStrategy::InitNonCombatTriggers(std::list& triggers) triggers.push_back(new TriggerNode( "leave karazhan", NextAction::array(0, new NextAction("disable karazhan strategy", 100.0f), NULL))); + + triggers.push_back(new TriggerNode( + "enter mechanar", + NextAction::array(0, new NextAction("enable mechanar strategy", 100.0f), NULL))); + + triggers.push_back(new TriggerNode( + "leave mechanar", + NextAction::array(0, new NextAction("disable mechanar strategy", 100.0f), NULL))); } \ No newline at end of file From 41ac61cf67c836d16e3de18ac5b8a80c5319e9ba Mon Sep 17 00:00:00 2001 From: Velite12 <45871932+Velite12@users.noreply.github.com> Date: Mon, 29 Jun 2026 00:55:13 -0400 Subject: [PATCH 3/4] Fix typo in mechanar disable --- playerbot/strategy/actions/MechanarDungeonActions.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/playerbot/strategy/actions/MechanarDungeonActions.h b/playerbot/strategy/actions/MechanarDungeonActions.h index b5c04ef90..e0df47c88 100644 --- a/playerbot/strategy/actions/MechanarDungeonActions.h +++ b/playerbot/strategy/actions/MechanarDungeonActions.h @@ -14,7 +14,7 @@ namespace ai class MechanarDisableDungeonStrategyAction : public ChangeAllStrategyAction { public: - MechanarDisableDungeonStrategyAction(PlayerbotAI* ai) : ChangeAllStrategyAction(ai, "disable mechanar strategy", "-tempest keep") {} + MechanarDisableDungeonStrategyAction(PlayerbotAI* ai) : ChangeAllStrategyAction(ai, "disable mechanar strategy", "-mechanar") {} }; class NethermancerSepethreaEnableFightStrategyAction : public ChangeAllStrategyAction From 442351e7ba84dcdbf079993b2bed68b8dfb2e1e0 Mon Sep 17 00:00:00 2001 From: Velite12 <45871932+Velite12@users.noreply.github.com> Date: Mon, 29 Jun 2026 22:14:56 -0400 Subject: [PATCH 4/4] final changes I think --- playerbot/strategy/actions/DungeonActions.cpp | 2 +- playerbot/strategy/actions/DungeonActions.h | 3 ++- playerbot/strategy/actions/MechanarDungeonActions.h | 2 +- playerbot/strategy/triggers/DungeonTriggers.cpp | 4 ++-- playerbot/strategy/triggers/DungeonTriggers.h | 6 ++++-- playerbot/strategy/triggers/MechanarDungeonTriggers.h | 2 +- 6 files changed, 11 insertions(+), 8 deletions(-) diff --git a/playerbot/strategy/actions/DungeonActions.cpp b/playerbot/strategy/actions/DungeonActions.cpp index 421db8386..295d84132 100644 --- a/playerbot/strategy/actions/DungeonActions.cpp +++ b/playerbot/strategy/actions/DungeonActions.cpp @@ -166,7 +166,7 @@ bool MoveAwayFromCreature::Execute(Event& event) float angleLeft = creaturePosition.getAngleTo(botPosition); float angleRight = angleLeft; - const uint8 attempts = 20; + const uint8 attempts = 60; const uint8 halfAtempts = (uint8)(attempts * 0.5f); float angleIncrement = (float)((M_PI) / halfAtempts); diff --git a/playerbot/strategy/actions/DungeonActions.h b/playerbot/strategy/actions/DungeonActions.h index d51630a21..c8abdd9f3 100644 --- a/playerbot/strategy/actions/DungeonActions.h +++ b/playerbot/strategy/actions/DungeonActions.h @@ -29,7 +29,7 @@ namespace ai class MoveAwayFromCreature : public MovementAction { public: - MoveAwayFromCreature(PlayerbotAI* ai, std::string name, uint32 creatureID, float range) : MovementAction(ai, name), creatureID(creatureID), range(range) {} + MoveAwayFromCreature(PlayerbotAI* ai, std::string name, uint32 creatureID, float range, bool ignoreVictim = false) : MovementAction(ai, name), creatureID(creatureID), range(range), ignoreVictim(ignoreVictim) {} bool Execute(Event& event) override; bool isPossible() override; @@ -52,5 +52,6 @@ namespace ai private: uint32 creatureID; float range; + bool ignoreVictim; }; } diff --git a/playerbot/strategy/actions/MechanarDungeonActions.h b/playerbot/strategy/actions/MechanarDungeonActions.h index e0df47c88..885cd1885 100644 --- a/playerbot/strategy/actions/MechanarDungeonActions.h +++ b/playerbot/strategy/actions/MechanarDungeonActions.h @@ -32,6 +32,6 @@ namespace ai class RagingFlamesMoveAwayAction : public MoveAwayFromCreature { public: - RagingFlamesMoveAwayAction(PlayerbotAI* ai) : MoveAwayFromCreature(ai, "move away from raging flames", 20481, 10.0f) {} + RagingFlamesMoveAwayAction(PlayerbotAI* ai) : MoveAwayFromCreature(ai, "move away from raging flames", 20481, 20.0f) {} }; } \ No newline at end of file diff --git a/playerbot/strategy/triggers/DungeonTriggers.cpp b/playerbot/strategy/triggers/DungeonTriggers.cpp index 341f0c04b..e655d84c4 100644 --- a/playerbot/strategy/triggers/DungeonTriggers.cpp +++ b/playerbot/strategy/triggers/DungeonTriggers.cpp @@ -233,8 +233,8 @@ bool CloseToCreatureTrigger::IsActive() Creature* creature = (Creature*)unit; if (creature) { - // Check if the bot is not being targeted by the creature - if (!creature->GetVictim() || (creature->GetVictim()->GetObjectGuid() != bot->GetObjectGuid())) + // Check if the bot is not being targeted by the creature, unless we don't care + if ((!creature->GetVictim() || (creature->GetVictim()->GetObjectGuid() != bot->GetObjectGuid())) || ignoreVictim) { // See if the creature is within the specified distance if (bot->IsWithinDist(creature, range)) diff --git a/playerbot/strategy/triggers/DungeonTriggers.h b/playerbot/strategy/triggers/DungeonTriggers.h index aa8230f64..598c26d8b 100644 --- a/playerbot/strategy/triggers/DungeonTriggers.h +++ b/playerbot/strategy/triggers/DungeonTriggers.h @@ -131,16 +131,18 @@ namespace ai class CloseToCreatureTrigger : public Trigger { public: - CloseToCreatureTrigger(PlayerbotAI* ai, std::string name, uint32 creatureID, float range) + CloseToCreatureTrigger(PlayerbotAI* ai, std::string name, uint32 creatureID, float range, bool ignoreVictim = false) : Trigger(ai, name, 1) , creatureID(creatureID) - , range(range) {} + , range(range) + , ignoreVictim(ignoreVictim) {} bool IsActive() override; private: uint32 creatureID; float range; + bool ignoreVictim; }; class ItemReadyTrigger : public Trigger diff --git a/playerbot/strategy/triggers/MechanarDungeonTriggers.h b/playerbot/strategy/triggers/MechanarDungeonTriggers.h index dddd2d174..e08e111bd 100644 --- a/playerbot/strategy/triggers/MechanarDungeonTriggers.h +++ b/playerbot/strategy/triggers/MechanarDungeonTriggers.h @@ -31,6 +31,6 @@ namespace ai class RagingFlamesTooCloseTrigger : public CloseToCreatureTrigger { public: - RagingFlamesTooCloseTrigger(PlayerbotAI* ai) : CloseToCreatureTrigger(ai, "raging flames too close", 20481, 10.0f) {} + RagingFlamesTooCloseTrigger(PlayerbotAI* ai) : CloseToCreatureTrigger(ai, "raging flames too close", 20481, 15.0f, true) {} }; } \ No newline at end of file