From 7d27000de5f064c844a3ea62d4afe8e164667c79 Mon Sep 17 00:00:00 2001 From: Yunfan Li Date: Sun, 21 Apr 2024 14:09:46 +0800 Subject: [PATCH 1/5] [Class spell] Fix paladin blessing --- src/strategy/paladin/PaladinActions.cpp | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/strategy/paladin/PaladinActions.cpp b/src/strategy/paladin/PaladinActions.cpp index 82fe4ec4..b2291d3d 100644 --- a/src/strategy/paladin/PaladinActions.cpp +++ b/src/strategy/paladin/PaladinActions.cpp @@ -26,17 +26,17 @@ inline std::string const GetActualBlessingOfMight(Unit* target) break; case CLASS_SHAMAN: if (tab == SHAMAN_TAB_ELEMENTAL || tab == SHAMAN_TAB_RESTORATION) { - return "bless of wisdom"; + return "blessing of wisdom"; } break; case CLASS_DRUID: if (tab == DRUID_TAB_RESTORATION || tab == DRUID_TAB_BALANCE) { - return "bless of wisdom"; + return "blessing of wisdom"; } break; case CLASS_PALADIN: if (tab == PALADIN_TAB_HOLY) { - return "bless of wisdom"; + return "blessing of wisdom"; } break; } From aaa33d8243844771a16aebff338c7de4d7bb7a07 Mon Sep 17 00:00:00 2001 From: Yunfan Li Date: Mon, 6 May 2024 21:56:02 +0800 Subject: [PATCH 2/5] Fix possible crash --- src/LootObjectStack.cpp | 4 ++-- src/strategy/values/DistanceValue.cpp | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/src/LootObjectStack.cpp b/src/LootObjectStack.cpp index 2a4ebd7e..4a047a16 100644 --- a/src/LootObjectStack.cpp +++ b/src/LootObjectStack.cpp @@ -182,11 +182,11 @@ WorldObject* LootObject::GetWorldObject(Player* bot) return nullptr; } Creature* creature = botAI->GetCreature(guid); - if (creature && creature->getDeathState() == DeathState::Corpse) + if (creature && creature->getDeathState() == DeathState::Corpse && creature->IsInWorld()) return creature; GameObject* go = botAI->GetGameObject(guid); - if (go && go->isSpawned()) + if (go && go->isSpawned() && go->IsInWorld()) return go; return nullptr; diff --git a/src/strategy/values/DistanceValue.cpp b/src/strategy/values/DistanceValue.cpp index 3882eab0..00850ed6 100644 --- a/src/strategy/values/DistanceValue.cpp +++ b/src/strategy/values/DistanceValue.cpp @@ -19,7 +19,7 @@ float DistanceValue::Calculate() return 0.0f; WorldObject* obj = loot.GetWorldObject(bot); - if (!obj) + if (!obj || !obj->IsInWorld()) return 0.0f; return sServerFacade->GetDistance2d(botAI->GetBot(), obj); From 4651a55bebf9455830652aaca38ca313e1b0367c Mon Sep 17 00:00:00 2001 From: Yunfan Li Date: Mon, 6 May 2024 22:45:24 +0800 Subject: [PATCH 3/5] [Configuration] Glyphs --- conf/playerbots.conf.dist | 26 +++++++++++++------------- 1 file changed, 13 insertions(+), 13 deletions(-) diff --git a/conf/playerbots.conf.dist b/conf/playerbots.conf.dist index 7651abf4..2b1d79b7 100644 --- a/conf/playerbots.conf.dist +++ b/conf/playerbots.conf.dist @@ -485,21 +485,21 @@ Playerbots.Updates.EnableDatabases = 1 ############################################## # AiPlayerbot.PremadeSpecName.. = #Name of the talent specialisation # AiPlayerbot.PremadeSpecLink... = #Wowhead style link the bot should work towards at given level. -# AiPlayerbot.PremadeSpecGlyph.. = ,,,,, +# AiPlayerbot.PremadeSpecGlyph.. = ,,,,, #ItemId of the glyphs # e.g., formulate the link on https://www.wowhead.com/wotlk/talent-calc/warrior/3022032123335100202012013031251-32505010002 # 0 <= specno < 20, 1 <= level <= 80 # Warrior AiPlayerbot.PremadeSpecName.1.0 = arms pve -AiPlayerbot.PremadeSpecGlyph.1.0 = 0,0,0,0,0,0 +AiPlayerbot.PremadeSpecGlyph.1.0 = 43418,43395,43423,43399,49084,43421 AiPlayerbot.PremadeSpecLink.1.0.60 = 3022032023335100202012013031241 AiPlayerbot.PremadeSpecLink.1.0.80 = 3022032123335100202012013031251-32505010002 AiPlayerbot.PremadeSpecName.1.1 = fury pve -AiPlayerbot.PremadeSpecGlyph.1.1 = 0,0,0,0,0,0 +AiPlayerbot.PremadeSpecGlyph.1.1 = 43418,43395,43414,43399,49084,43432 AiPlayerbot.PremadeSpecLink.1.1.60 = -305053000500310053120501351 AiPlayerbot.PremadeSpecLink.1.1.80 = 30202300233-305053000500310153120511351 AiPlayerbot.PremadeSpecName.1.2 = prot pve -AiPlayerbot.PremadeSpecGlyph.1.2 = 0,0,0,0,0,0 +AiPlayerbot.PremadeSpecGlyph.1.2 = 43424,43395,43425,43399,49084,45793 AiPlayerbot.PremadeSpecLink.1.2.60 = --053351225000210521030113321 AiPlayerbot.PremadeSpecLink.1.2.80 = 3500030023-301-053351225000210521030113321 @@ -520,15 +520,15 @@ AiPlayerbot.PremadeSpecLink.2.2.80 = 050501-05-05232051203331302133231331 # Hunter AiPlayerbot.PremadeSpecName.3.0 = bm pve -AiPlayerbot.PremadeSpecGlyph.3.0 = 0,0,0,0,0,0 +AiPlayerbot.PremadeSpecGlyph.3.0 = 42912,43350,42902,43351,43338,45732 AiPlayerbot.PremadeSpecLink.3.0.60 = 51200201505112243100511351 AiPlayerbot.PremadeSpecLink.3.0.80 = 51200201505112253100531351-015305021 AiPlayerbot.PremadeSpecName.3.1 = mm pve -AiPlayerbot.PremadeSpecGlyph.3.1 = 0,0,0,0,0,0 +AiPlayerbot.PremadeSpecGlyph.3.1 = 42912,43350,42915,43351,43338,45732 AiPlayerbot.PremadeSpecLink.3.1.60 = -015305101230013233135030051 AiPlayerbot.PremadeSpecLink.3.1.80 = 502-035305101230013233135031351-5000002 AiPlayerbot.PremadeSpecName.3.2 = surv pve -AiPlayerbot.PremadeSpecGlyph.3.2 = 0,0,0,0,0,0 +AiPlayerbot.PremadeSpecGlyph.3.2 = 42912,43350,45731,43351,43338,45732 AiPlayerbot.PremadeSpecLink.3.2.60 = --5000032500033330502135001331 AiPlayerbot.PremadeSpecLink.3.2.80 = -005305101-5000032500033330522135301331 @@ -548,15 +548,15 @@ AiPlayerbot.PremadeSpecLink.4.2.80 = 0053231-2-5120222030321121050135231251 # Priest AiPlayerbot.PremadeSpecName.5.0 = disc pve -AiPlayerbot.PremadeSpecGlyph.5.0 = 0,0,0,0,0,0 +AiPlayerbot.PremadeSpecGlyph.5.0 = 42408,43371,42400,43374,43342,45756 AiPlayerbot.PremadeSpecLink.5.0.60 = 0503203130300512301323131051 AiPlayerbot.PremadeSpecLink.5.0.80 = 0503203130300512331323231251-03520103 AiPlayerbot.PremadeSpecName.5.1 = holy pve -AiPlayerbot.PremadeSpecGlyph.5.1 = 0,0,0,0,0,0 +AiPlayerbot.PremadeSpecGlyph.5.1 = 42408,43371,42400,43374,43342,42396 AiPlayerbot.PremadeSpecLink.5.1.60 = -035050031301152530000331331 AiPlayerbot.PremadeSpecLink.5.1.80 = 05032031-235050032302152530000331351 AiPlayerbot.PremadeSpecName.5.2 = shadow pve -AiPlayerbot.PremadeSpecGlyph.5.2 = 0,0,0,0,0,0 +AiPlayerbot.PremadeSpecGlyph.5.2 = 42406,43371,42407,43374,43342,42415 AiPlayerbot.PremadeSpecLink.5.2.60 = --325003041203010323150301351 AiPlayerbot.PremadeSpecLink.5.2.80 = 0503203--325023051223010323152301351 @@ -594,15 +594,15 @@ AiPlayerbot.PremadeSpecLink.7.2.80 = -00505031-50005331335310501022331251 # Mage AiPlayerbot.PremadeSpecName.8.0 = arcane pve -AiPlayerbot.PremadeSpecGlyph.8.0 = 0,0,0,0,0,0 +AiPlayerbot.PremadeSpecGlyph.8.0 = 42735,43339,44955,43364,43361,42751 AiPlayerbot.PremadeSpecLink.8.0.60 = 23000503110033014032310150532 AiPlayerbot.PremadeSpecLink.8.0.80 = 23000523310033015032310250532-03-203203001 AiPlayerbot.PremadeSpecName.8.1 = fire pve -AiPlayerbot.PremadeSpecGlyph.8.1 = 0,0,0,0,0,0 +AiPlayerbot.PremadeSpecGlyph.8.1 = 42739,43339,45737,43364,44920,42751 AiPlayerbot.PremadeSpecLink.8.1.60 = -0055030012303330053120300351 AiPlayerbot.PremadeSpecLink.8.1.80 = 23000503310003-0055030012303330053120300351 AiPlayerbot.PremadeSpecName.8.2 = frost pve -AiPlayerbot.PremadeSpecGlyph.8.2 = 0,0,0,0,0,0 +AiPlayerbot.PremadeSpecGlyph.8.2 = 42742,43339,50045,43364,43361,42751 AiPlayerbot.PremadeSpecLink.8.2.60 = --3533103310203100232102231151 AiPlayerbot.PremadeSpecLink.8.2.80 = 23002322010203--3533103310203100232102231151 From 063d8e17d0713cff99a60a23bae78252e950b171 Mon Sep 17 00:00:00 2001 From: Yunfan Li Date: Mon, 6 May 2024 23:10:50 +0800 Subject: [PATCH 4/5] [Configuration] Frost mage talents --- conf/playerbots.conf.dist | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/conf/playerbots.conf.dist b/conf/playerbots.conf.dist index 2b1d79b7..141d3809 100644 --- a/conf/playerbots.conf.dist +++ b/conf/playerbots.conf.dist @@ -604,7 +604,7 @@ AiPlayerbot.PremadeSpecLink.8.1.80 = 23000503310003-0055030012303330053120300351 AiPlayerbot.PremadeSpecName.8.2 = frost pve AiPlayerbot.PremadeSpecGlyph.8.2 = 42742,43339,50045,43364,43361,42751 AiPlayerbot.PremadeSpecLink.8.2.60 = --3533103310203100232102231151 -AiPlayerbot.PremadeSpecLink.8.2.80 = 23002322010203--3533103310203100232102231151 +AiPlayerbot.PremadeSpecLink.8.2.80 = 23002322010203--0533003313203100232112231151 # Warlock AiPlayerbot.PremadeSpecName.9.0 = affli pve From 26faac914ebc7ec2e7deeba20e3b546d92d1f215 Mon Sep 17 00:00:00 2001 From: Yunfan Li Date: Tue, 7 May 2024 22:21:38 +0800 Subject: [PATCH 5/5] [Class spell] Fix healing priests stop casting due to threat --- src/AiFactory.cpp | 12 ++-- src/strategy/priest/HolyPriestStrategy.cpp | 61 +++++++++++++++++++ src/strategy/priest/HolyPriestStrategy.h | 15 ++++- src/strategy/priest/PriestAiObjectContext.cpp | 6 +- 4 files changed, 85 insertions(+), 9 deletions(-) diff --git a/src/AiFactory.cpp b/src/AiFactory.cpp index bd903b5c..3a29ef79 100644 --- a/src/AiFactory.cpp +++ b/src/AiFactory.cpp @@ -277,12 +277,12 @@ void AiFactory::AddDefaultCombatStrategies(Player* player, PlayerbotAI* const fa switch (player->getClass()) { case CLASS_PRIEST: - if (tab == 2) - { + if (tab == 2) { engine->addStrategies("dps", "shadow debuff", "shadow aoe", "threat", nullptr); - } - else { - engine->addStrategies("heal", "threat", nullptr); + } else if (tab == PRIEST_TAB_DISIPLINE) { + engine->addStrategies("heal", nullptr); + } else { + engine->addStrategies("holy heal", nullptr); } engine->addStrategies("dps assist", "cure", nullptr); @@ -375,7 +375,7 @@ void AiFactory::AddDefaultCombatStrategies(Player* player, PlayerbotAI* const fa switch (player->getClass()) { case CLASS_PRIEST: { if (tab != PRIEST_TAB_SHADOW) { - engine->addStrategies("holy", "shadow debuff", "shadow aoe", nullptr); + engine->addStrategies("holy dps", "shadow debuff", "shadow aoe", nullptr); } break; } diff --git a/src/strategy/priest/HolyPriestStrategy.cpp b/src/strategy/priest/HolyPriestStrategy.cpp index ba24d730..a9e64204 100644 --- a/src/strategy/priest/HolyPriestStrategy.cpp +++ b/src/strategy/priest/HolyPriestStrategy.cpp @@ -42,3 +42,64 @@ void HolyPriestStrategy::InitTriggers(std::vector& triggers) triggers.push_back(new TriggerNode("medium mana", NextAction::array(0, new NextAction("shadowfiend", ACTION_HIGH), nullptr))); triggers.push_back(new TriggerNode("low mana", NextAction::array(0, new NextAction("mana burn", ACTION_HIGH), nullptr))); } + +HolyHealPriestStrategy::HolyHealPriestStrategy(PlayerbotAI* botAI) : GenericPriestStrategy(botAI) +{ + actionNodeFactories.Add(new GenericPriestStrategyActionNodeFactory()); +} + +NextAction** HolyHealPriestStrategy::getDefaultActions() +{ + return NextAction::array(0, new NextAction("shoot", ACTION_DEFAULT), nullptr); +} + +void HolyHealPriestStrategy::InitTriggers(std::vector& triggers) +{ + GenericPriestStrategy::InitTriggers(triggers); + + triggers.push_back(new TriggerNode( + "group heal occasion", + NextAction::array(0, + new NextAction("circle of healing", ACTION_MEDIUM_HEAL + 8), + new NextAction("prayer of healing on party", ACTION_MEDIUM_HEAL + 6), + NULL))); + + triggers.push_back(new TriggerNode( + "medium group heal occasion", + NextAction::array(0, new NextAction("divine hymn", ACTION_CRITICAL_HEAL + 5), NULL))); + + triggers.push_back(new TriggerNode( + "party member critical health", + NextAction::array(0, + new NextAction("power word: shield on party", ACTION_CRITICAL_HEAL + 5), + new NextAction("flash heal on party", ACTION_CRITICAL_HEAL + 3), + new NextAction("prayer of mending on party", ACTION_CRITICAL_HEAL + 2), + NULL))); + + triggers.push_back(new TriggerNode( + "party member low health", + NextAction::array(0, + new NextAction("circle of healing", ACTION_MEDIUM_HEAL + 4), + new NextAction("greater heal on party", ACTION_MEDIUM_HEAL + 3), + new NextAction("prayer of mending on party", ACTION_MEDIUM_HEAL + 2), + new NextAction("flash heal on party", ACTION_MEDIUM_HEAL + 1), + NULL))); + + triggers.push_back(new TriggerNode( + "party member medium health", + NextAction::array(0, + new NextAction("circle of healing", ACTION_LIGHT_HEAL + 7), + new NextAction("prayer of mending on party", ACTION_LIGHT_HEAL + 6), + new NextAction("flash heal on party", ACTION_LIGHT_HEAL + 5), + // new NextAction("renew on party", ACTION_LIGHT_HEAL + 8), + NULL))); + + triggers.push_back(new TriggerNode( + "party member almost full health", + NextAction::array(0, + new NextAction("renew on party", ACTION_LIGHT_HEAL + 2), + // new NextAction("flash heal on party", ACTION_LIGHT_HEAL + 1), + NULL))); + + 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 + 10), nullptr))); +} diff --git a/src/strategy/priest/HolyPriestStrategy.h b/src/strategy/priest/HolyPriestStrategy.h index 39173069..108cdf68 100644 --- a/src/strategy/priest/HolyPriestStrategy.h +++ b/src/strategy/priest/HolyPriestStrategy.h @@ -6,6 +6,7 @@ #define _PLAYERBOT_HOLYPRIESTSTRATEGY_H #include "HealPriestStrategy.h" +#include "GenericPriestStrategyActionNodeFactory.h" class PlayerbotAI; @@ -16,8 +17,20 @@ class HolyPriestStrategy : public HealPriestStrategy NextAction** getDefaultActions() override; void InitTriggers(std::vector& triggers) override; - std::string const getName() override { return "holy"; } + std::string const getName() override { return "holy dps"; } uint32 GetType() const override { return STRATEGY_TYPE_DPS | STRATEGY_TYPE_RANGED; } }; +class HolyHealPriestStrategy : public GenericPriestStrategy +{ + public: + HolyHealPriestStrategy(PlayerbotAI* botAI); + + void InitTriggers(std::vector& triggers) override; + NextAction** getDefaultActions() override; + std::string const getName() override { return "holy heal"; } + uint32 GetType() const override { return STRATEGY_TYPE_HEAL | STRATEGY_TYPE_RANGED; } +}; + + #endif diff --git a/src/strategy/priest/PriestAiObjectContext.cpp b/src/strategy/priest/PriestAiObjectContext.cpp index d6810897..690539a5 100644 --- a/src/strategy/priest/PriestAiObjectContext.cpp +++ b/src/strategy/priest/PriestAiObjectContext.cpp @@ -50,13 +50,15 @@ class PriestCombatStrategyFactoryInternal : public NamedObjectContext creators["heal"] = &PriestCombatStrategyFactoryInternal::heal; creators["shadow"] = &PriestCombatStrategyFactoryInternal::dps; creators["dps"] = &PriestCombatStrategyFactoryInternal::dps; - creators["holy"] = &PriestCombatStrategyFactoryInternal::holy; + creators["holy dps"] = &PriestCombatStrategyFactoryInternal::holy_dps; + creators["holy heal"] = &PriestCombatStrategyFactoryInternal::holy_heal; } private: static Strategy* heal(PlayerbotAI* botAI) { return new HealPriestStrategy(botAI); } static Strategy* dps(PlayerbotAI* botAI) { return new ShadowPriestStrategy(botAI); } - static Strategy* holy(PlayerbotAI* botAI) { return new HolyPriestStrategy(botAI); } + static Strategy* holy_dps(PlayerbotAI* botAI) { return new HolyPriestStrategy(botAI); } + static Strategy* holy_heal(PlayerbotAI* botAI) { return new HolyHealPriestStrategy(botAI); } }; class PriestTriggerFactoryInternal : public NamedObjectContext