mirror of
https://github.com/liyunfan1223/mod-playerbots.git
synced 2026-06-20 15:39:25 +02:00
# Pull Request This PR removes the fallback for Seal of Wisdom action from generic Paladin strategy and moves it to Holy Paladin only. This is necessary because a paladin who does not have Seal of Wisdom yet who goes low mana and triggers the seal of wisdom action will end up falling back to Seal of Righteousness, even though a better seal may be available, such as Seal of Command. The fallback is added to Holy Paladin so that low level holy paladins still use Righteousness until they get Wisdom --- ## Feature Evaluation Please answer the following: - Describe the **minimum logic** required to achieve the intended behavior? Ret paladin without Seal of Wisdom shouldn't change seals on low mana. - Describe the **cheapest implementation** that produces an acceptable result? Cheapest implementation is to remove seal of wisdom fallback for non-holy paladins. - Describe the **runtime cost** when this logic executes across many bots? No difference in cost compared to existing logic. --- ## How to Test the Changes Use a ret paladin bot who has Seal of Command but who does not have Seal of Wisdom. A paladin under level 38 will do. Order them to attack something, like a test dummy, until they eventually run low on mana. Before this change: The paladin will switch to Seal of Righteousness when they get low mana. After this change: The paladin leaves Seal of Command on when they get low mana. ## Complexity & Impact Does this change add new decision branches? - - [x] No - - [ ] Yes (**explain below**) Does this change increase per-bot or per-tick processing? - - [x] No - - [ ] Yes (**describe and justify impact**) Could this logic scale poorly under load? - - [x] No - - [ ] Yes (**explain why**) --- ## Defaults & Configuration Does this change modify default bot behavior? - - [x] No - - [ ] Yes (**explain why**) If this introduces more advanced or AI-heavy logic: - - [x] Lightweight mode remains the default - - [ ] More complex behavior is optional and thereby configurable --- ## AI Assistance Was AI assistance (e.g. ChatGPT or similar tools) used while working on this change? - - [x] No - - [ ] Yes (**explain below**) If yes, please specify: - AI tool or model used (e.g. ChatGPT, GPT-4, Claude, etc.) - Purpose of usage (e.g. brainstorming, refactoring, documentation, code generation) - Which parts of the change were influenced or generated - Whether the result was manually reviewed and adapted AI assistance is allowed, but all submitted code must be fully understood, reviewed, and owned by the contributor. Any AI-influenced changes must be verified against existing CORE and PB logic. We expect contributors to be honest about what they do and do not understand. --- ## Final Checklist - - [x] Stability is not compromised - - [x] Performance impact is understood, tested, and acceptable - - [x] Added logic complexity is justified and explained - - [x] Documentation updated if needed --- ## Notes for Reviewers Anything that significantly improves realism at the cost of stability or performance should be carefully discussed before merging.
275 lines
11 KiB
C++
275 lines
11 KiB
C++
/*
|
|
* Copyright (C) 2016+ AzerothCore <www.azerothcore.org>, released under GNU AGPL v3 license, you may redistribute it
|
|
* and/or modify it under version 3 of the License, or (at your option), any later version.
|
|
*/
|
|
|
|
#ifndef _PLAYERBOT_GENERICPALADINSTRATEGYACTIONNODEFACTORY_H
|
|
#define _PLAYERBOT_GENERICPALADINSTRATEGYACTIONNODEFACTORY_H
|
|
|
|
#include "Action.h"
|
|
#include "NamedObjectContext.h"
|
|
|
|
class PlayerbotAI;
|
|
|
|
class GenericPaladinStrategyActionNodeFactory : public NamedObjectFactory<ActionNode>
|
|
{
|
|
public:
|
|
GenericPaladinStrategyActionNodeFactory()
|
|
{
|
|
// creators["seal of light"] = &seal_of_light;
|
|
creators["cleanse poison"] = &cleanse_poison;
|
|
creators["cleanse disease"] = &cleanse_disease;
|
|
creators["cleanse magic"] = &cleanse_magic;
|
|
creators["cleanse poison on party"] = &cleanse_poison_on_party;
|
|
creators["cleanse disease on party"] = &cleanse_disease_on_party;
|
|
creators["seal of corruption"] = &seal_of_corruption;
|
|
creators["seal of vengeance"] = &seal_of_vengeance;
|
|
creators["seal of command"] = &seal_of_command;
|
|
creators["seal of wisdom"] = &seal_of_wisdom;
|
|
creators["seal of justice"] = &seal_of_justice;
|
|
creators["hand of reckoning"] = &hand_of_reckoning;
|
|
creators["judgement"] = &judgement;
|
|
creators["judgement of wisdom"] = &judgement_of_wisdom;
|
|
creators["divine shield"] = &divine_shield;
|
|
creators["flash of light"] = &flash_of_light;
|
|
creators["flash of light on party"] = &flash_of_light_on_party;
|
|
creators["holy wrath"] = &holy_wrath;
|
|
creators["lay on hands"] = &lay_on_hands;
|
|
creators["lay on hands on party"] = &lay_on_hands_on_party;
|
|
creators["hammer of wrath"] = &hammer_of_wrath;
|
|
creators["retribution aura"] = &retribution_aura;
|
|
creators["blessing of kings"] = &blessing_of_kings;
|
|
creators["blessing of wisdom"] = &blessing_of_wisdom;
|
|
creators["blessing of kings on party"] = &blessing_of_kings_on_party;
|
|
creators["blessing of wisdom on party"] = &blessing_of_wisdom_on_party;
|
|
creators["blessing of sanctuary on party"] = &blessing_of_sanctuary_on_party;
|
|
creators["blessing of sanctuary"] = &blessing_of_sanctuary;
|
|
creators["taunt spell"] = &hand_of_reckoning;
|
|
creators["righteous defense"] = &righteous_defense;
|
|
creators["avenger's shield"] = &avengers_shield;
|
|
creators["divine sacrifice"] = &divine_sacrifice;
|
|
}
|
|
|
|
private:
|
|
static ActionNode* blessing_of_sanctuary(PlayerbotAI* /* ai */)
|
|
{
|
|
return new ActionNode("blessing of sanctuary",
|
|
/*P*/ {},
|
|
/*A*/ {},
|
|
/*C*/ {});
|
|
}
|
|
static ActionNode* blessing_of_kings(PlayerbotAI* /* ai */)
|
|
{
|
|
return new ActionNode("blessing of kings",
|
|
/*P*/ {},
|
|
/*A*/ {},
|
|
/*C*/ {});
|
|
}
|
|
static ActionNode* blessing_of_wisdom(PlayerbotAI* /* ai */)
|
|
{
|
|
return new ActionNode("blessing of wisdom",
|
|
/*P*/ {},
|
|
/*A*/ {},
|
|
/*C*/ {});
|
|
}
|
|
static ActionNode* blessing_of_kings_on_party(PlayerbotAI* /* ai */)
|
|
{
|
|
return new ActionNode("blessing of kings on party",
|
|
/*P*/ {},
|
|
/*A*/ {},
|
|
/*C*/ {});
|
|
}
|
|
static ActionNode* blessing_of_wisdom_on_party(PlayerbotAI* /* ai */)
|
|
{
|
|
return new ActionNode("blessing of wisdom on party",
|
|
/*P*/ {},
|
|
/*A*/ {},
|
|
/*C*/ {});
|
|
}
|
|
static ActionNode* blessing_of_sanctuary_on_party(PlayerbotAI* /* ai */)
|
|
{
|
|
return new ActionNode("blessing of sanctuary on party",
|
|
/*P*/ {},
|
|
/*A*/ {},
|
|
/*C*/ {});
|
|
}
|
|
static ActionNode* retribution_aura(PlayerbotAI* /* ai */)
|
|
{
|
|
return new ActionNode("retribution aura",
|
|
/*P*/ {},
|
|
/*A*/ { NextAction("devotion aura") },
|
|
/*C*/ {});
|
|
}
|
|
static ActionNode* lay_on_hands(PlayerbotAI* /* ai */)
|
|
{
|
|
return new ActionNode("lay on hands",
|
|
/*P*/ {},
|
|
/*A*/ {}, // { NextAction("divine shield"), new
|
|
// NextAction("flash of light"), NULL),
|
|
/*C*/ {});
|
|
}
|
|
static ActionNode* lay_on_hands_on_party(PlayerbotAI* /* ai */)
|
|
{
|
|
return new ActionNode("lay on hands on party",
|
|
/*P*/ {},
|
|
/*A*/ {}, // { NextAction("flash of light"), NULL),
|
|
/*C*/ {});
|
|
}
|
|
// static ActionNode* seal_of_light(PlayerbotAI* /* ai */)
|
|
// {
|
|
// return new ActionNode ("seal of light",
|
|
// /*P*/ NULL,
|
|
// /*A*/ { NextAction("seal of justice"), NULL),
|
|
// /*C*/ NULL);
|
|
// }
|
|
static ActionNode* cleanse_poison(PlayerbotAI* /* ai */)
|
|
{
|
|
return new ActionNode("cleanse poison",
|
|
/*P*/ {},
|
|
/*A*/ { NextAction("purify poison") },
|
|
/*C*/ {});
|
|
}
|
|
static ActionNode* cleanse_magic(PlayerbotAI* /* ai */)
|
|
{
|
|
return new ActionNode("cleanse magic",
|
|
/*P*/ {},
|
|
/*A*/ {},
|
|
/*C*/ {});
|
|
}
|
|
static ActionNode* cleanse_disease(PlayerbotAI* /* ai */)
|
|
{
|
|
return new ActionNode("cleanse disease",
|
|
/*P*/ {},
|
|
/*A*/ { NextAction("purify disease") },
|
|
/*C*/ {});
|
|
}
|
|
static ActionNode* cleanse_poison_on_party(PlayerbotAI* /* ai */)
|
|
{
|
|
return new ActionNode("cleanse poison on party",
|
|
/*P*/ {},
|
|
/*A*/ { NextAction("purify poison on party") },
|
|
/*C*/ {});
|
|
}
|
|
static ActionNode* cleanse_disease_on_party(PlayerbotAI* /* ai */)
|
|
{
|
|
return new ActionNode("cleanse disease on party",
|
|
/*P*/ {},
|
|
/*A*/ { NextAction("purify disease on party") },
|
|
/*C*/ {});
|
|
}
|
|
static ActionNode* seal_of_corruption(PlayerbotAI* /* ai */)
|
|
{
|
|
return new ActionNode("seal of corruption",
|
|
/*P*/ {},
|
|
/*A*/ { NextAction("seal of vengeance") },
|
|
/*C*/ {});
|
|
}
|
|
static ActionNode* seal_of_vengeance(PlayerbotAI* /* ai */)
|
|
{
|
|
return new ActionNode("seal of vengeance",
|
|
/*P*/ {},
|
|
/*A*/ { NextAction("seal of command") },
|
|
/*C*/ {});
|
|
}
|
|
static ActionNode* seal_of_command(PlayerbotAI* /* ai */)
|
|
{
|
|
return new ActionNode("seal of command",
|
|
/*P*/ {},
|
|
/*A*/ { NextAction("seal of righteousness") },
|
|
/*C*/ {});
|
|
}
|
|
static ActionNode* seal_of_wisdom(PlayerbotAI* /* ai */)
|
|
{
|
|
return new ActionNode ("seal of wisdom",
|
|
/*P*/ {},
|
|
/*A*/ { NextAction("seal of corruption") },
|
|
/*C*/ {});
|
|
}
|
|
static ActionNode* seal_of_justice(PlayerbotAI* /* ai */)
|
|
{
|
|
return new ActionNode("seal of justice",
|
|
/*P*/ {},
|
|
/*A*/ { NextAction("seal of corruption") },
|
|
/*C*/ {});
|
|
}
|
|
static ActionNode* hand_of_reckoning(PlayerbotAI* /* ai */)
|
|
{
|
|
return new ActionNode("hand of reckoning",
|
|
/*P*/ {},
|
|
/*A*/ { NextAction("righteous defense") },
|
|
/*C*/ {});
|
|
}
|
|
static ActionNode* righteous_defense(PlayerbotAI* /* ai */)
|
|
{
|
|
return new ActionNode("righteous defense",
|
|
/*P*/ {},
|
|
/*A*/ { NextAction("avenger's shield") },
|
|
/*C*/ {});
|
|
}
|
|
static ActionNode* avengers_shield(PlayerbotAI* /* ai */)
|
|
{
|
|
return new ActionNode("avenger's shield",
|
|
/*P*/ {},
|
|
/*A*/ { NextAction("judgement of wisdom") },
|
|
/*C*/ {});
|
|
}
|
|
static ActionNode* divine_sacrifice(PlayerbotAI* /* ai */)
|
|
{
|
|
return new ActionNode("divine sacrifice",
|
|
/*P*/ {},
|
|
/*A*/ {},
|
|
/*C*/ { NextAction("cancel divine sacrifice") });
|
|
}
|
|
static ActionNode* judgement_of_wisdom(PlayerbotAI* /* ai */)
|
|
{
|
|
return new ActionNode("judgement of wisdom",
|
|
/*P*/ {},
|
|
/*A*/ { NextAction("judgement of light") },
|
|
/*C*/ {});
|
|
}
|
|
static ActionNode* judgement(PlayerbotAI* /* ai */)
|
|
{
|
|
return new ActionNode("judgement",
|
|
/*P*/ {},
|
|
/*A*/ {},
|
|
/*C*/ {});
|
|
}
|
|
static ActionNode* divine_shield(PlayerbotAI* /* ai */)
|
|
{
|
|
return new ActionNode("divine shield",
|
|
/*P*/ {},
|
|
/*A*/ { NextAction("divine protection") },
|
|
/*C*/ {});
|
|
}
|
|
static ActionNode* flash_of_light(PlayerbotAI* /* ai */)
|
|
{
|
|
return new ActionNode("flash of light",
|
|
/*P*/ {},
|
|
/*A*/ { NextAction("holy light") },
|
|
/*C*/ {});
|
|
}
|
|
static ActionNode* flash_of_light_on_party(PlayerbotAI* /* ai */)
|
|
{
|
|
return new ActionNode("flash of light on party",
|
|
/*P*/ {},
|
|
/*A*/ { NextAction("holy light on party") },
|
|
/*C*/ {});
|
|
}
|
|
static ActionNode* holy_wrath(PlayerbotAI* /* ai */)
|
|
{
|
|
return new ActionNode("holy wrath",
|
|
/*P*/ {},
|
|
/*A*/ {},
|
|
/*C*/ {});
|
|
}
|
|
static ActionNode* hammer_of_wrath(PlayerbotAI* /* ai */)
|
|
{
|
|
return new ActionNode("hammer of wrath",
|
|
/*P*/ {},
|
|
/*A*/ {},
|
|
/*C*/ {});
|
|
}
|
|
};
|
|
|
|
#endif
|