Merge pull request #175 from liyunfan1223/config/spec

Improve premade spec links
This commit is contained in:
Yunfan Li
2024-04-10 23:49:23 +08:00
committed by GitHub
15 changed files with 187 additions and 78 deletions

View File

@@ -475,112 +475,160 @@ Playerbots.Updates.EnableDatabases = 1
##############################################
# AiPlayerbot.PremadeSpecName.<class>.<specno> = <name> #Name of the talent specialisation
# AiPlayerbot.PremadeSpecLink.<class>.<specno>.<level> = <link> #Wowhead style link the bot should work towards at given level.
# AiPlayerbot.PremadeSpecGlyph.<class>.<specno> = <major 1>,<minor 1>,<major 2>,<minor 2>,<minor 3>,<major 3>
# 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.PremadeSpecLink.1.0.60 =
AiPlayerbot.PremadeSpecGlyph.1.0 = 0,0,0,0,0,0
AiPlayerbot.PremadeSpecLink.1.0.60 = 3022032023335100202012013031241
AiPlayerbot.PremadeSpecLink.1.0.80 = 3022032123335100202012013031251-32505010002
# AiPlayerbot.PremadeSpecGlyph.1.0 = 0,0,0,0,0,0
AiPlayerbot.PremadeSpecName.1.1 = fury pve
AiPlayerbot.PremadeSpecLink.1.1.60 =
AiPlayerbot.PremadeSpecGlyph.1.1 = 0,0,0,0,0,0
AiPlayerbot.PremadeSpecLink.1.1.60 = -305053000500310053120501351
AiPlayerbot.PremadeSpecLink.1.1.80 = 30202300233-305053000500310153120511351
AiPlayerbot.PremadeSpecName.1.2 = prot pve
AiPlayerbot.PremadeSpecLink.1.2.60 =
AiPlayerbot.PremadeSpecGlyph.1.2 = 0,0,0,0,0,0
AiPlayerbot.PremadeSpecLink.1.2.60 = --053351225000210521030113321
AiPlayerbot.PremadeSpecLink.1.2.80 = 3500030023-301-053351225000210521030113321
# Paladin
AiPlayerbot.PremadeSpecName.2.0 = holy pve
AiPlayerbot.PremadeSpecLink.2.0.60 =
AiPlayerbot.PremadeSpecGlyph.2.0 = 41106,43367,45741,43369,43365,41109
AiPlayerbot.PremadeSpecLink.2.0.60 = 50350151020013053100515221
AiPlayerbot.PremadeSpecLink.2.0.80 = 50350152220013053100515221-503201312
AiPlayerbot.PremadeSpecName.2.1 = prot pve
AiPlayerbot.PremadeSpecLink.2.1.60 =
AiPlayerbot.PremadeSpecGlyph.2.1 = 41100,43367,43869,43369,43365,45745
AiPlayerbot.PremadeSpecLink.2.1.60 = -05005135203102311333112321
AiPlayerbot.PremadeSpecLink.2.1.80 = -05005135203132311333312321-5023005
AiPlayerbot.PremadeSpecName.2.2 = ret pve
AiPlayerbot.PremadeSpecLink.2.2.60 =
AiPlayerbot.PremadeSpecGlyph.2.2 = 41092,43367,41099,43369,43365,43869
AiPlayerbot.PremadeSpecLink.2.2.60 = --05230051203331302133231131
AiPlayerbot.PremadeSpecLink.2.2.65 = -05-05230051203331302133231131
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.PremadeSpecLink.3.0.60 = 51200201505112243100511351
AiPlayerbot.PremadeSpecLink.3.0.80 = 51200201505112253100531351-015305021
AiPlayerbot.PremadeSpecName.3.1 = mm pve
AiPlayerbot.PremadeSpecLink.3.1.60 =
AiPlayerbot.PremadeSpecGlyph.3.1 = 0,0,0,0,0,0
AiPlayerbot.PremadeSpecLink.3.1.60 = -015305101230013233135030051
AiPlayerbot.PremadeSpecLink.3.1.80 = 502-035305101230013233135031351-5000002
AiPlayerbot.PremadeSpecName.3.2 = surv pve
AiPlayerbot.PremadeSpecLink.3.2.60 =
AiPlayerbot.PremadeSpecLink.3.2.80 = -0053041-5000032500033330523134321331
AiPlayerbot.PremadeSpecGlyph.3.2 = 0,0,0,0,0,0
AiPlayerbot.PremadeSpecLink.3.2.60 = --5000032500033330502135001331
AiPlayerbot.PremadeSpecLink.3.2.80 = -005305101-5000032500033330522135301331
# Rogue
AiPlayerbot.PremadeSpecName.4.0 = as pve
AiPlayerbot.PremadeSpecLink.4.0.60 =
AiPlayerbot.PremadeSpecLink.4.0.80 = 005323005350100520103331051-005005003-502
AiPlayerbot.PremadeSpecGlyph.4.0 = 45768,43379,45761,43380,43378,45767
AiPlayerbot.PremadeSpecLink.4.0.60 = 005323005350100520103331051
AiPlayerbot.PremadeSpecLink.4.0.80 = 005323005350100520103331051-005005005003-2
AiPlayerbot.PremadeSpecName.4.1 = combat pve
AiPlayerbot.PremadeSpecLink.4.1.60 =
AiPlayerbot.PremadeSpecLink.4.1.80 = 30530000522-0252051000035015223100501251
AiPlayerbot.PremadeSpecGlyph.4.1 = 45762,43379,45767,43380,43378,45766
AiPlayerbot.PremadeSpecLink.4.1.60 = -0252051000035015223100501251
AiPlayerbot.PremadeSpecLink.4.1.80 = 00532000523-0252051000035015223100501251
AiPlayerbot.PremadeSpecName.4.2 = subtlety pve
AiPlayerbot.PremadeSpecLink.4.2.60 =
AiPlayerbot.PremadeSpecGlyph.4.2 = 42967,43379,45764,43380,43378,45767
AiPlayerbot.PremadeSpecLink.4.2.60 = --5120122030321121050135031241
AiPlayerbot.PremadeSpecLink.4.2.80 = 0053231-2-5120222030321121050135231251
# Priest
AiPlayerbot.PremadeSpecName.5.0 = disc pve
AiPlayerbot.PremadeSpecLink.5.0.60 =
AiPlayerbot.PremadeSpecLink.5.0.80 = 0503203130300512331323231251-03530003
AiPlayerbot.PremadeSpecGlyph.5.0 = 0,0,0,0,0,0
AiPlayerbot.PremadeSpecLink.5.0.60 = 0503203130300512301323131051
AiPlayerbot.PremadeSpecLink.5.0.80 = 0503203130300512331323231251-03520103
AiPlayerbot.PremadeSpecName.5.1 = holy pve
AiPlayerbot.PremadeSpecLink.5.1.60 =
AiPlayerbot.PremadeSpecGlyph.5.1 = 0,0,0,0,0,0
AiPlayerbot.PremadeSpecLink.5.1.60 = -035050031301152530000331331
AiPlayerbot.PremadeSpecLink.5.1.80 = 05032031-235050032302152530000331351
AiPlayerbot.PremadeSpecName.5.2 = shadow pve
AiPlayerbot.PremadeSpecLink.5.2.60 =
AiPlayerbot.PremadeSpecGlyph.5.2 = 0,0,0,0,0,0
AiPlayerbot.PremadeSpecLink.5.2.60 = --325003041203010323150301351
AiPlayerbot.PremadeSpecLink.5.2.80 = 0503203--325023051223010323152301351
# DeathKnight
AiPlayerbot.PremadeSpecName.6.0 = blood pve
AiPlayerbot.PremadeSpecLink.6.0.60 =
AiPlayerbot.PremadeSpecGlyph.6.0 = 45805,43673,43827,43544,43672,43554
AiPlayerbot.PremadeSpecLink.6.0.60 = 0055021533003313201020131151
AiPlayerbot.PremadeSpecLink.6.0.80 = 0355021533003313201020131351-005-005032
AiPlayerbot.PremadeSpecName.6.1 = frost pve
AiPlayerbot.PremadeSpecLink.6.1.60 =
AiPlayerbot.PremadeSpecLink.6.1.80 = 03-32002350352203012300033101351-230200305
AiPlayerbot.PremadeSpecGlyph.6.1 = 45805,43673,43547,43544,43672,43543
AiPlayerbot.PremadeSpecLink.6.1.60 = -32003350332203012300023101351
AiPlayerbot.PremadeSpecLink.6.1.80 = -32002350352203012300033101351-230200305003
AiPlayerbot.PremadeSpecName.6.2 = unholy pve
AiPlayerbot.PremadeSpecLink.6.2.60 =
AiPlayerbot.PremadeSpecLink.6.2.80 = 23050202--2302003350032152003150003133151
AiPlayerbot.PremadeSpecGlyph.6.2 = 43542,43673,45804,43544,43672,43549
AiPlayerbot.PremadeSpecLink.6.2.60 = --2300303050032152000150213130051
AiPlayerbot.PremadeSpecLink.6.2.80 = -320053500002-2300303050032152000150213130051
AiPlayerbot.PremadeSpecName.6.3 = double aura blood pve
AiPlayerbot.PremadeSpecGlyph.6.3 = 45805,43673,43827,43544,43672,43554
AiPlayerbot.PremadeSpecLink.6.3.60 = 005512153330030320102013-305
AiPlayerbot.PremadeSpecLink.6.3.80 = 005512153330030320102013-3050505002023001-002
# Shaman
AiPlayerbot.PremadeSpecName.7.0 = ele pve
AiPlayerbot.PremadeSpecLink.7.0.60 =
AiPlayerbot.PremadeSpecGlyph.7.0 = 41536,43385,41532,43386,44923,45776
AiPlayerbot.PremadeSpecLink.7.0.60 = 4530001520213351102301351
AiPlayerbot.PremadeSpecLink.7.0.80 = 3530001523213351322301351-005050031
AiPlayerbot.PremadeSpecName.7.1 = enh pve
AiPlayerbot.PremadeSpecLink.7.1.60 =
AiPlayerbot.PremadeSpecGlyph.7.1 = 41530,43385,41539,43386,44923,41540
AiPlayerbot.PremadeSpecLink.7.1.60 = -30205033005001333031131131051
AiPlayerbot.PremadeSpecLink.7.1.80 = 053030052-30205033005021333031131131051
AiPlayerbot.PremadeSpecName.7.2 = resto pve
AiPlayerbot.PremadeSpecLink.7.2.60 =
AiPlayerbot.PremadeSpecGlyph.7.2 = 41517,43385,41527,43386,44923,45775
AiPlayerbot.PremadeSpecLink.7.2.60 = --50005301335310501002331241
AiPlayerbot.PremadeSpecLink.7.2.80 = -00505031-50005331335310501022331251
# Mage
AiPlayerbot.PremadeSpecName.8.0 = arcane pve
AiPlayerbot.PremadeSpecLink.8.0.60 =
AiPlayerbot.PremadeSpecLink.8.0.80 = 235005030100230150323102505321-03-203023001
AiPlayerbot.PremadeSpecGlyph.8.0 = 0,0,0,0,0,0
AiPlayerbot.PremadeSpecLink.8.0.60 = 23000503110033014032310150532
AiPlayerbot.PremadeSpecLink.8.0.80 = 23000523310033015032310250532-03-203203001
AiPlayerbot.PremadeSpecName.8.1 = fire pve
AiPlayerbot.PremadeSpecLink.8.1.60 =
AiPlayerbot.PremadeSpecGlyph.8.1 = 0,0,0,0,0,0
AiPlayerbot.PremadeSpecLink.8.1.60 = -0055030012303330053120300351
AiPlayerbot.PremadeSpecLink.8.1.80 = 23000503310003-0055030012303330053120300351
AiPlayerbot.PremadeSpecName.8.2 = frost pve
AiPlayerbot.PremadeSpecLink.8.2.60 =
AiPlayerbot.PremadeSpecGlyph.8.2 = 0,0,0,0,0,0
AiPlayerbot.PremadeSpecLink.8.2.60 = --3533103310203100232102231151
AiPlayerbot.PremadeSpecLink.8.2.80 = 23002322010203--3533103310203100232102231151
# Warlock
AiPlayerbot.PremadeSpecName.9.0 = affli pve
AiPlayerbot.PremadeSpecLink.9.0.60 =
AiPlayerbot.PremadeSpecLink.9.0.80 = 2350020021123510253500331151--55000005
AiPlayerbot.PremadeSpecGlyph.9.0 = 45785,43390,50077,43394,43393,45779
AiPlayerbot.PremadeSpecLink.9.0.60 = 2350022001113510053500131151
AiPlayerbot.PremadeSpecLink.9.0.70 = 2350022001113510053500131151--55
AiPlayerbot.PremadeSpecLink.9.0.80 = 2350022001113510253500331151--5500000501
AiPlayerbot.PremadeSpecName.9.1 = emo pve
AiPlayerbot.PremadeSpecLink.9.1.60 =
AiPlayerbot.PremadeSpecLink.9.1.80 = -003203301135212530135211351-55000005
AiPlayerbot.PremadeSpecGlyph.9.1 = 45785,43390,50077,43394,43393,42459
AiPlayerbot.PremadeSpecLink.9.1.60 = -003203301135112530131201-55
AiPlayerbot.PremadeSpecLink.9.1.70 = -003203301135112530135201051-55
AiPlayerbot.PremadeSpecLink.9.1.80 = -003203301135112530135221351-55000005
AiPlayerbot.PremadeSpecName.9.2 = destro pve
AiPlayerbot.PremadeSpecLink.9.2.60 =
AiPlayerbot.PremadeSpecGlyph.9.2 = 45785,43390,50077,43394,43393,42454
AiPlayerbot.PremadeSpecLink.9.2.60 = --05203205210131051313230341
AiPlayerbot.PremadeSpecLink.9.2.80 = -03310030003-05203205210331051335230351
# Druid
AiPlayerbot.PremadeSpecName.11.0 = balance pve
AiPlayerbot.PremadeSpecLink.11.0.60 =
AiPlayerbot.PremadeSpecGlyph.11.0 = 40916,43331,40921,43335,44922,40919
AiPlayerbot.PremadeSpecLink.11.0.60 = 5012203115331003213302301231
AiPlayerbot.PremadeSpecLink.11.0.80 = 5012203125331103213305301231--205003212
AiPlayerbot.PremadeSpecName.11.1 = feral pve
AiPlayerbot.PremadeSpecLink.11.1.60 =
AiPlayerbot.PremadeSpecName.11.1 = bear pve
AiPlayerbot.PremadeSpecGlyph.11.1 = 40897,43331,46372,43335,43332,40899
AiPlayerbot.PremadeSpecLink.11.1.60 = -500232130322110353100301310501
AiPlayerbot.PremadeSpecLink.11.1.80 = -501232130322110353120303313511-20350001
AiPlayerbot.PremadeSpecGlyph.11.1 = 40897,43331,46372,43335,43332
AiPlayerbot.PremadeSpecName.11.2 = resto pve
AiPlayerbot.PremadeSpecLink.11.2.60 =
AiPlayerbot.PremadeSpecGlyph.11.2 = 40913,43331,40906,43335,44922,45602
AiPlayerbot.PremadeSpecLink.11.2.60 = --230033312031501531050013051
AiPlayerbot.PremadeSpecLink.11.2.80 = 05320001--230033312031512531153313051
AiPlayerbot.PremadeSpecName.11.3 = cat pve
AiPlayerbot.PremadeSpecGlyph.11.3 = 40902,43331,40901,43335,44922,45604
AiPlayerbot.PremadeSpecLink.11.3.60 = -553202032322010052100030310501
AiPlayerbot.PremadeSpecLink.11.3.80 = -553202032322010053100030310511-205503012
##############################################
# Default TalentSpec for random bots #

View File

@@ -1388,7 +1388,7 @@ bool PlayerbotAI::IsCombo(Player* player)
{
int tab = AiFactory::GetPlayerSpecTab(player);
return player->getClass() == CLASS_ROGUE ||
(player->getClass() == CLASS_DRUID && tab == DRUID_TAB_FERAL && !IsTank(bot));
(player->getClass() == CLASS_DRUID && player->HasAura(768)); // cat druid
}
bool PlayerbotAI::IsRangedDps(Player* player)

View File

@@ -2883,6 +2883,9 @@ void PlayerbotFactory::InitGlyphs(bool increment)
if ((proto->AllowableClass & bot->getClassMask()) == 0 || (proto->AllowableRace & bot->getRaceMask()) == 0)
continue;
if (proto->RequiredLevel > bot->GetLevel())
continue;
uint32 glyph = 0;
for (uint32 spell = 0; spell < MAX_ITEM_PROTO_SPELLS; spell++)
{
@@ -3666,12 +3669,12 @@ float PlayerbotFactory::CalculateItemScore(uint32 item_id, Player* bot)
{
case SPELL_AURA_MOD_DAMAGE_DONE:
// case SPELL_AURA_MOD_HEALING_DONE: duplicated
spell_power += spellInfo->Effects[i].BasePoints + 1;
spell_power += (spellInfo->Effects[i].BasePoints + 1) * 0.2;
break;
case SPELL_AURA_MOD_ATTACK_POWER:
attack_power += spellInfo->Effects[i].BasePoints + 1;
attack_power += (spellInfo->Effects[i].BasePoints + 1) * 0.2;
case SPELL_AURA_MOD_SHIELD_BLOCKVALUE:
block += spellInfo->Effects[i].BasePoints + 1;
block += (spellInfo->Effects[i].BasePoints + 1) * 0.2;
default:
break;
}
@@ -3747,25 +3750,25 @@ float PlayerbotFactory::CalculateItemScore(uint32 item_id, Player* bot)
score *= 0.5;
}
// spec without double hand
// enhancement, rogue, ice dk, shield tank, fury warrior without titan's grip but with duel wield
// enhancement, rogue, ice dk, unholy dk, shield tank, fury warrior without titan's grip but with duel wield
if (isDoubleHand &&
((cls == CLASS_SHAMAN && tab == 1 && bot->HasSpell(674)) ||
((cls == CLASS_SHAMAN && tab == 1 && bot->CanDualWield()) ||
(cls == CLASS_ROGUE) ||
(cls == CLASS_DEATH_KNIGHT && tab == 1) ||
(cls == CLASS_WARRIOR && tab == 1 && !bot->HasAura(49152) && bot->HasSpell(674)) ||
(cls == CLASS_DEATH_KNIGHT && tab != 0) ||
(cls == CLASS_WARRIOR && tab == 1 && !bot->CanTitanGrip() && bot->CanDualWield()) ||
IsShieldTank(bot))) {
score *= 0.1;
}
// spec with double hand
// fury with titan's grip, fury without duel wield, arms, bear, retribution, blood dk
if (isDoubleHand &&
((cls == CLASS_WARRIOR && tab == WARRIOR_TAB_FURY && bot->HasAura(49152)) ||
(cls == CLASS_WARRIOR && tab == WARRIOR_TAB_FURY && !bot->HasSpell(674)) ||
((cls == CLASS_WARRIOR && tab == WARRIOR_TAB_FURY && bot->CanTitanGrip()) ||
(cls == CLASS_WARRIOR && tab == WARRIOR_TAB_FURY && !bot->CanDualWield()) ||
(cls == CLASS_WARRIOR && tab == WARRIOR_TAB_ARMS) ||
(cls == CLASS_DRUID && tab == 1) ||
(cls == CLASS_PALADIN && tab == 2) ||
(cls == CLASS_DEATH_KNIGHT && tab == 0) ||
(cls == CLASS_SHAMAN && tab == 1 && !bot->HasSpell(674)))) {
(cls == CLASS_SHAMAN && tab == 1 && !bot->CanDualWield()))) {
score *= 10;
}
}
@@ -3777,6 +3780,9 @@ float PlayerbotFactory::CalculateItemScore(uint32 item_id, Player* bot)
score *= 0.1;
}
}
if (proto->ItemSet != 0) {
score *= 1.1;
}
return (0.0001 + score) * itemLevel * (quality + 1);
}

View File

@@ -151,7 +151,7 @@ bool MovementAction::MoveTo(uint32 mapId, float x, float y, float z, bool idle,
// }
bool generatePath = !bot->HasAuraType(SPELL_AURA_MOD_INCREASE_MOUNTED_FLIGHT_SPEED) &&
!bot->IsFlying() && !bot->HasUnitMovementFlag(MOVEMENTFLAG_SWIMMING) && !bot->IsInWater();
float modifiedZ = SearchBestGroundZForPath(x, y, z, generatePath, 20.0f, normal_only);
float modifiedZ = SearchBestGroundZForPath(x, y, z, generatePath, 20.0f, normal_only, 8.0f);
if (modifiedZ == INVALID_HEIGHT) {
return false;
}

View File

@@ -42,7 +42,7 @@ class MovementAction : public Action
bool MoveInside(uint32 mapId, float x, float y, float z, float distance = sPlayerbotAIConfig->followDistance);
void CreateWp(Player* wpOwner, float x, float y, float z, float o, uint32 entry, bool important = false);
private:
float SearchBestGroundZForPath(float x, float y, float z, bool generatePath, float range = 15.0f, bool normal_only = false, float step = 3.0f);
float SearchBestGroundZForPath(float x, float y, float z, bool generatePath, float range = 20.0f, bool normal_only = false, float step = 8.0f);
};
class FleeAction : public MovementAction

View File

@@ -99,7 +99,7 @@ void BloodDKStrategy::InitTriggers(std::vector<TriggerNode*>& triggers)
triggers.push_back(new TriggerNode("rune strike", NextAction::array(0, new NextAction("rune strike", ACTION_NORMAL + 3), nullptr)));
triggers.push_back(new TriggerNode("blood tap", NextAction::array(0, new NextAction("blood tap", ACTION_HIGH + 5), nullptr)));
triggers.push_back(new TriggerNode("lose aggro", NextAction::array(0, new NextAction("dark command", ACTION_HIGH + 3), nullptr)));
triggers.push_back(new TriggerNode("low health", NextAction::array(0, new NextAction("blood tap", ACTION_HIGH + 5),
new NextAction("vampiric blood", ACTION_HIGH + 3), new NextAction("death strike", ACTION_HIGH + 4), nullptr)));
triggers.push_back(new TriggerNode("low health", NextAction::array(0, new NextAction("army of the dead", ACTION_HIGH + 5),
new NextAction("vampiric blood", ACTION_HIGH + 4), new NextAction("death strike", ACTION_HIGH + 3), nullptr)));
// triggers.push_back(new TriggerNode("army of the dead", NextAction::array(0, new NextAction("army of the dead", ACTION_HIGH + 6), nullptr)));
}

View File

@@ -224,10 +224,10 @@ class CastDeathCoilAction : public CastSpellAction
CastDeathCoilAction(PlayerbotAI* botAI) : CastSpellAction(botAI, "death coil") { }
};
class CastBloodBoilAction : public CastBuffSpellAction
class CastBloodBoilAction : public CastSpellAction
{
public:
CastBloodBoilAction(PlayerbotAI* botAI) : CastBuffSpellAction(botAI, "blood boil") { }
CastBloodBoilAction(PlayerbotAI* botAI) : CastSpellAction(botAI, "blood boil") { }
};
class CastDeathAndDecayAction : public CastSpellAction

View File

@@ -87,6 +87,9 @@ class DeathKnightTriggerFactoryInternal : public NamedObjectContext<Trigger>
creators["unbreakable armor"] = &DeathKnightTriggerFactoryInternal::unbreakable_armor;
creators["high blood rune"] = &DeathKnightTriggerFactoryInternal::high_blood_rune;
creators["freezing fog"] = &DeathKnightTriggerFactoryInternal::freezing_fog;
creators["no desolation"] = &DeathKnightTriggerFactoryInternal::no_desolation;
creators["death and decay cooldown"] = &DeathKnightTriggerFactoryInternal::death_and_decay_cooldown;
creators["army of the dead"] = &DeathKnightTriggerFactoryInternal::army_of_the_dead;
}
private:
@@ -110,7 +113,9 @@ class DeathKnightTriggerFactoryInternal : public NamedObjectContext<Trigger>
static Trigger* unbreakable_armor(PlayerbotAI* botAI) { return new UnbreakableArmorTrigger(botAI); }
static Trigger* high_blood_rune(PlayerbotAI* botAI) { return new HighBloodRuneTrigger(botAI); }
static Trigger* freezing_fog(PlayerbotAI* botAI) { return new FreezingFogTrigger(botAI); }
static Trigger* no_desolation(PlayerbotAI* botAI) { return new DesolationTrigger(botAI); }
static Trigger* death_and_decay_cooldown(PlayerbotAI* botAI) { return new DeathAndDecayCooldownTrigger(botAI); }
static Trigger* army_of_the_dead(PlayerbotAI* botAI) { return new ArmyOfTheDeadTrigger(botAI); }
};
class DeathKnightAiObjectContextInternal : public NamedObjectContext<Action>
@@ -128,7 +133,7 @@ class DeathKnightAiObjectContextInternal : public NamedObjectContext<Action>
creators["unholy blight"] = &DeathKnightAiObjectContextInternal::unholy_blight;
creators["scourge strike"] = &DeathKnightAiObjectContextInternal::scourge_strike;
creators["death and decay"] = &DeathKnightAiObjectContextInternal::death_and_decay;
creators["unholy pressence"] = &DeathKnightAiObjectContextInternal::unholy_pressence;
creators["unholy presence"] = &DeathKnightAiObjectContextInternal::unholy_presence;
creators["raise dead"] = &DeathKnightAiObjectContextInternal::raise_dead;
creators["army of the dead"] = &DeathKnightAiObjectContextInternal::army_of_the_dead;
creators["summon gargoyle"] = &DeathKnightAiObjectContextInternal::summon_gargoyle;
@@ -185,7 +190,7 @@ class DeathKnightAiObjectContextInternal : public NamedObjectContext<Action>
static Action* unholy_blight(PlayerbotAI* botAI) { return new CastUnholyBlightAction(botAI); }
static Action* scourge_strike(PlayerbotAI* botAI) { return new CastScourgeStrikeAction(botAI); }
static Action* death_and_decay(PlayerbotAI* botAI) { return new CastDeathAndDecayAction(botAI); }
static Action* unholy_pressence(PlayerbotAI* botAI) { return new CastUnholyPresenceAction(botAI); }
static Action* unholy_presence(PlayerbotAI* botAI) { return new CastUnholyPresenceAction(botAI); }
static Action* raise_dead(PlayerbotAI* botAI) { return new CastRaiseDeadAction(botAI); }
static Action* army_of_the_dead(PlayerbotAI* botAI) { return new CastArmyOfTheDeadAction(botAI); }
static Action* summon_gargoyle(PlayerbotAI* botAI) { return new CastSummonGargoyleAction(botAI); }

View File

@@ -3,6 +3,7 @@
*/
#include "DKTriggers.h"
#include "GenericTriggers.h"
#include "Playerbots.h"
#include "SharedDefines.h"
#include <string>
@@ -33,3 +34,15 @@ bool HighBloodRuneTrigger::IsActive() {
// bot->Say(std::to_string(bot->GetBaseRune(0)) + "_" + std::to_string(bot->GetRuneCooldown(0)) + " " + std::to_string(bot->GetBaseRune(1)) + "_" + std::to_string(bot->GetRuneCooldown(1)), LANG_UNIVERSAL);
return !bot->GetRuneCooldown(0) && !bot->GetRuneCooldown(1);
}
bool DesolationTrigger::IsActive() {
return bot->HasAura(66817) && !botAI->HasAura("desolation", GetTarget(), false, true, -1, true);
}
bool DeathAndDecayCooldownTrigger::IsActive() {
uint32 spellId = AI_VALUE2(uint32, "spell id", name);
if (!spellId)
return true;
return bot->HasSpellCooldown(spellId);
}

View File

@@ -139,4 +139,24 @@ class FreezingFogTrigger : public HasAuraTrigger
FreezingFogTrigger(PlayerbotAI* botAI) : HasAuraTrigger(botAI, "freezing fog") { }
};
class DesolationTrigger : public BuffTrigger
{
public:
DesolationTrigger(PlayerbotAI* botAI) : BuffTrigger(botAI, "desolation") { }
bool IsActive() override;
};
class DeathAndDecayCooldownTrigger : public SpellCooldownTrigger
{
public:
DeathAndDecayCooldownTrigger(PlayerbotAI* botAI) : SpellCooldownTrigger(botAI, "death and decay") { }
bool IsActive() override;
};
class ArmyOfTheDeadTrigger : public BoostTrigger
{
public:
ArmyOfTheDeadTrigger(PlayerbotAI* botAI) : BoostTrigger(botAI, "army of the dead") { }
};
#endif

View File

@@ -91,6 +91,7 @@ NextAction** FrostDKStrategy::getDefaultActions()
void FrostDKStrategy::InitTriggers(std::vector<TriggerNode*>& triggers)
{
GenericDKStrategy::InitTriggers(triggers);
triggers.push_back(new TriggerNode("army of the dead", NextAction::array(0, new NextAction("army of the dead", ACTION_HIGH + 6), nullptr)));
triggers.push_back(new TriggerNode("unbreakable armor", NextAction::array(0, new NextAction("unbreakable armor", ACTION_NORMAL + 4), nullptr)));
triggers.push_back(new TriggerNode("high blood rune", NextAction::array(0, new NextAction("blood strike", ACTION_NORMAL + 1), nullptr)));
triggers.push_back(new TriggerNode("freezing fog", NextAction::array(0, new NextAction("howling blast", ACTION_HIGH + 1), nullptr)));

View File

@@ -33,7 +33,7 @@ class GenericDKStrategyActionNodeFactory : public NamedObjectFactory<ActionNode>
//creators["improved icy talons"] = &improved_icy_talons; boost party
//unholy
//creators["death and decay"] = &death_and_decay;
creators["death and decay"] = &death_and_decay;
//creators["raise dead"] = &raise_dead;
//creators["army of the dead"] = &army of the dead;
//creators["summon gargoyle"] = &army of the dead;
@@ -130,6 +130,14 @@ class GenericDKStrategyActionNodeFactory : public NamedObjectFactory<ActionNode>
/*C*/ nullptr);
}
static ActionNode* death_and_decay([[maybe_unused]] PlayerbotAI* botAI)
{
return new ActionNode ("death and decay",
/*P*/ nullptr,
/*A*/ NextAction::array(0, new NextAction("blood tap"), nullptr),
/*C*/ nullptr);
}
static ActionNode* anti_magic_zone([[maybe_unused]] PlayerbotAI* botAI)
{
return new ActionNode ("anti magic zone",

View File

@@ -34,7 +34,7 @@ class UnholyDKStrategyActionNodeFactory : public NamedObjectFactory<ActionNode>
static ActionNode* death_strike([[maybe_unused]] PlayerbotAI* botAI)
{
return new ActionNode("death strike",
/*P*/ NextAction::array(0, new NextAction("blood presence"), nullptr),
/*P*/ NextAction::array(0, new NextAction("unholy presence"), nullptr),
/*A*/ nullptr,
/*C*/ nullptr);
}
@@ -42,7 +42,7 @@ class UnholyDKStrategyActionNodeFactory : public NamedObjectFactory<ActionNode>
static ActionNode* corpse_explosion([[maybe_unused]] PlayerbotAI* botAI)
{
return new ActionNode("corpse explosion",
/*P*/ NextAction::array(0, new NextAction("blood presence"), nullptr),
/*P*/ NextAction::array(0, new NextAction("unholy presence"), nullptr),
/*A*/ nullptr,
/*C*/ nullptr);
}
@@ -50,14 +50,14 @@ class UnholyDKStrategyActionNodeFactory : public NamedObjectFactory<ActionNode>
static ActionNode* scourge_strike([[maybe_unused]] PlayerbotAI* botAI)
{
return new ActionNode("scourge strike",
/*P*/ NextAction::array(0, new NextAction("blood presence"), nullptr),
/*P*/ NextAction::array(0, new NextAction("unholy presence"), nullptr),
/*A*/ nullptr,
/*C*/ nullptr);
}
static ActionNode* icy_touch([[maybe_unused]] PlayerbotAI* botAI)
{
return new ActionNode("icy touch",
/*P*/ NextAction::array(0, new NextAction("blood presence"), nullptr),
/*P*/ NextAction::array(0, new NextAction("unholy presence"), nullptr),
/*A*/ nullptr,
/*C*/ nullptr);
}
@@ -72,14 +72,11 @@ UnholyDKStrategy::UnholyDKStrategy(PlayerbotAI* botAI) : GenericDKStrategy(botAI
NextAction** UnholyDKStrategy::getDefaultActions()
{
return NextAction::array(0,
new NextAction("death and decay", ACTION_DEFAULT + 1.0f),
new NextAction("scourge strike", ACTION_DEFAULT + 0.8f),
new NextAction("blood strike", ACTION_DEFAULT + 0.7f),
new NextAction("ghoul frenzy", ACTION_DEFAULT + 0.6f),
new NextAction("summon gargoyle", ACTION_DEFAULT + 0.5f),
new NextAction("death coil", ACTION_DEFAULT + 0.4f),
new NextAction("plague strike", ACTION_DEFAULT + 0.3f),
new NextAction("icy touch", ACTION_DEFAULT + 0.2f),
new NextAction("horn of winter", ACTION_DEFAULT + 0.1f),
new NextAction("horn of winter", ACTION_DEFAULT + 0.6f),
new NextAction("summon gargoyle", ACTION_DEFAULT + 0.4f),
new NextAction("death coil", ACTION_DEFAULT + 0.2f),
new NextAction("melee", ACTION_DEFAULT),
nullptr);
}
@@ -89,7 +86,17 @@ void UnholyDKStrategy::InitTriggers(std::vector<TriggerNode*>& triggers)
GenericDKStrategy::InitTriggers(triggers);
// triggers.push_back(new TriggerNode("often", NextAction::array(0, new NextAction(, ACTION_NORMAL + 2), nullptr)));
triggers.push_back(new TriggerNode("critical health", NextAction::array(0, new NextAction("death pact", ACTION_EMERGENCY + 1), nullptr)));
triggers.push_back(new TriggerNode("army of the dead", NextAction::array(0, new NextAction("army of the dead", ACTION_HIGH + 6), nullptr)));
triggers.push_back(new TriggerNode("critical health", NextAction::array(0, new NextAction("death pact", ACTION_HIGH + 5), nullptr)));
triggers.push_back(new TriggerNode("no desolation", NextAction::array(0, new NextAction("blood strike", ACTION_HIGH + 4), nullptr)));
triggers.push_back(new TriggerNode("death and decay cooldown",
NextAction::array(0,
new NextAction("ghoul frenzy", ACTION_DEFAULT + 5.0f),
new NextAction("scourge strike", ACTION_DEFAULT + 4.0f),
new NextAction("blood boil", ACTION_NORMAL + 3.0f),
new NextAction("icy touch", ACTION_NORMAL + 2.0f),
new NextAction("plague strike", ACTION_NORMAL + 1.0f),
nullptr)));
}
void UnholyDKAoeStrategy::InitTriggers(std::vector<TriggerNode*>& triggers)

View File

@@ -81,8 +81,8 @@ DpsPaladinStrategy::DpsPaladinStrategy(PlayerbotAI* botAI) : GenericPaladinStrat
NextAction** DpsPaladinStrategy::getDefaultActions()
{
return NextAction::array(0,
new NextAction("judgement of wisdom", ACTION_DEFAULT + 0.4f),
new NextAction("crusader strike", ACTION_DEFAULT + 0.3f),
new NextAction("crusader strike", ACTION_DEFAULT + 0.4f),
new NextAction("judgement of wisdom", ACTION_DEFAULT + 0.3f),
new NextAction("divine storm", ACTION_DEFAULT + 0.2f),
new NextAction("melee consecration", ACTION_DEFAULT + 0.1f),
new NextAction("melee", ACTION_DEFAULT),

View File

@@ -5,6 +5,7 @@
#ifndef _PLAYERBOT_ENEMYPLAYERVALUE_H
#define _PLAYERBOT_ENEMYPLAYERVALUE_H
#include "PlayerbotAIConfig.h"
#include "TargetValue.h"
#include "PossibleTargetsValue.h"
@@ -14,7 +15,7 @@ class Unit;
class NearestEnemyPlayersValue : public PossibleTargetsValue
{
public:
NearestEnemyPlayersValue(PlayerbotAI* botAI, float range = 120.0f) :
NearestEnemyPlayersValue(PlayerbotAI* botAI, float range = sPlayerbotAIConfig->grindDistance) :
PossibleTargetsValue(botAI, "nearest enemy players", range) { }
public: