From 322f8c5ffda64bfe7b2c024be9cde3c86ddd9ce1 Mon Sep 17 00:00:00 2001 From: nytmyr <53322305+nytmyr@users.noreply.github.com> Date: Fri, 20 Dec 2024 09:38:40 -0600 Subject: [PATCH] Implmenet PetCures, add some missing types for defaults/chance to cast --- common/spdat.cpp | 6 ++ common/spdat.h | 9 ++- zone/bot.cpp | 83 ++++++++++++--------- zone/botspellsai.cpp | 4 +- zone/mob.cpp | 173 ++++++++++++++++++++++++------------------- 5 files changed, 157 insertions(+), 118 deletions(-) diff --git a/common/spdat.cpp b/common/spdat.cpp index e81574aa7..e2b00a503 100644 --- a/common/spdat.cpp +++ b/common/spdat.cpp @@ -2849,6 +2849,7 @@ bool IsBotSpellTypeBeneficial(uint16 spellType) { case BotSpellTypes::Buff: case BotSpellTypes::Cure: case BotSpellTypes::GroupCures: + case BotSpellTypes::PetCures: case BotSpellTypes::DamageShields: case BotSpellTypes::InCombatBuffSong: case BotSpellTypes::OutOfCombatBuffSong: @@ -2898,6 +2899,7 @@ bool IsBotSpellTypeOtherBeneficial(uint16 spellType) { case BotSpellTypes::Buff: case BotSpellTypes::Cure: case BotSpellTypes::GroupCures: + case BotSpellTypes::PetCures: case BotSpellTypes::DamageShields: case BotSpellTypes::PetDamageShields: case BotSpellTypes::PetBuffs: @@ -3020,6 +3022,7 @@ bool IsPetBotSpellType(uint16 spellType) { case BotSpellTypes::PetHoTHeals: case BotSpellTypes::PetDamageShields: case BotSpellTypes::PetResistBuffs: + case BotSpellTypes::PetCures: return true; default: return false; @@ -3046,6 +3049,7 @@ bool IsClientBotSpellType(uint16 spellType) { case BotSpellTypes::Buff: case BotSpellTypes::Cure: case BotSpellTypes::GroupCures: + case BotSpellTypes::PetCures: case BotSpellTypes::DamageShields: case BotSpellTypes::PetDamageShields: case BotSpellTypes::PetBuffs: @@ -3513,6 +3517,8 @@ uint16 GetPetSpellType(uint16 spellType) { return BotSpellTypes::PetVeryFastHeals; case BotSpellTypes::HoTHeals: return BotSpellTypes::PetHoTHeals; + case BotSpellTypes::Cures: + return BotSpellTypes::PetCures; case BotSpellTypes::DamageShields: return BotSpellTypes::PetDamageShields; case BotSpellTypes::ResistBuffs: diff --git a/common/spdat.h b/common/spdat.h index cf182aabd..b518dc725 100644 --- a/common/spdat.h +++ b/common/spdat.h @@ -706,10 +706,11 @@ namespace BotSpellTypes constexpr uint16 PetFastHeals = 50; constexpr uint16 PetVeryFastHeals = 51; constexpr uint16 PetHoTHeals = 52; - constexpr uint16 DamageShields = 53; - constexpr uint16 ResistBuffs = 54; - constexpr uint16 PetDamageShields = 55; - constexpr uint16 PetResistBuffs = 56; + constexpr uint16 PetCures = 53; + constexpr uint16 DamageShields = 54; + constexpr uint16 ResistBuffs = 55; + constexpr uint16 PetDamageShields = 56; + constexpr uint16 PetResistBuffs = 57; // Command Spell Types constexpr uint16 Teleport = 100; // this is handled by ^depart so uses other logic diff --git a/zone/bot.cpp b/zone/bot.cpp index 9eec3aa91..be519bb39 100644 --- a/zone/bot.cpp +++ b/zone/bot.cpp @@ -10550,45 +10550,49 @@ uint16 Bot::GetDefaultSpellTypeIdlePriority(uint16 spellType, uint8 botClass, ui priority = 15; break; - case BotSpellTypes::Pet: + case BotSpellTypes::PetCures: priority = 16; break; - case BotSpellTypes::Buff: + case BotSpellTypes::Pet: priority = 17; break; - case BotSpellTypes::OutOfCombatBuffSong: + case BotSpellTypes::Buff: priority = 18; break; - case BotSpellTypes::ResistBuffs: + case BotSpellTypes::OutOfCombatBuffSong: priority = 19; break; - case BotSpellTypes::DamageShields: + case BotSpellTypes::ResistBuffs: priority = 20; break; - case BotSpellTypes::PetBuffs: + case BotSpellTypes::DamageShields: priority = 21; break; - case BotSpellTypes::PreCombatBuff: + case BotSpellTypes::PetBuffs: priority = 22; break; - case BotSpellTypes::PreCombatBuffSong: + case BotSpellTypes::PreCombatBuff: priority = 23; break; - case BotSpellTypes::PetResistBuffs: + case BotSpellTypes::PreCombatBuffSong: priority = 24; break; - case BotSpellTypes::PetDamageShields: + case BotSpellTypes::PetResistBuffs: priority = 25; + break; + case BotSpellTypes::PetDamageShields: + priority = 26; + break; default: priority = 0; //unused @@ -10633,60 +10637,62 @@ uint16 Bot::GetDefaultSpellTypeEngagedPriority(uint16 spellType, uint8 botClass, return 15; case BotSpellTypes::PetHoTHeals: return 16; - case BotSpellTypes::AELifetap: + case BotSpellTypes::PetCures: return 17; - case BotSpellTypes::Lifetap: + case BotSpellTypes::AELifetap: return 18; - case BotSpellTypes::HateRedux: + case BotSpellTypes::Lifetap: return 19; - case BotSpellTypes::AEMez: + case BotSpellTypes::HateRedux: return 20; - case BotSpellTypes::Mez: + case BotSpellTypes::AEMez: return 21; - case BotSpellTypes::AEHateLine: + case BotSpellTypes::Mez: return 22; - case BotSpellTypes::HateLine: + case BotSpellTypes::AEHateLine: return 23; - case BotSpellTypes::AEDispel: + case BotSpellTypes::HateLine: return 24; - case BotSpellTypes::Dispel: + case BotSpellTypes::AEDispel: return 25; - case BotSpellTypes::AEDebuff: + case BotSpellTypes::Dispel: return 26; - case BotSpellTypes::Debuff: + case BotSpellTypes::AEDebuff: return 27; - case BotSpellTypes::AESnare: + case BotSpellTypes::Debuff: return 28; - case BotSpellTypes::Snare: + case BotSpellTypes::AESnare: return 29; - case BotSpellTypes::AESlow: + case BotSpellTypes::Snare: return 30; - case BotSpellTypes::Slow: + case BotSpellTypes::AESlow: return 31; - case BotSpellTypes::AERoot: + case BotSpellTypes::Slow: return 32; - case BotSpellTypes::Root: + case BotSpellTypes::AERoot: return 33; - case BotSpellTypes::AEDoT: + case BotSpellTypes::Root: return 34; - case BotSpellTypes::DOT: + case BotSpellTypes::AEDoT: return 35; - case BotSpellTypes::AEStun: + case BotSpellTypes::DOT: return 36; - case BotSpellTypes::PBAENuke: + case BotSpellTypes::AEStun: return 37; - case BotSpellTypes::AENukes: + case BotSpellTypes::PBAENuke: return 38; - case BotSpellTypes::AERains: + case BotSpellTypes::AENukes: return 39; - case BotSpellTypes::Stun: + case BotSpellTypes::AERains: return 40; - case BotSpellTypes::Nuke: + case BotSpellTypes::Stun: return 41; - case BotSpellTypes::InCombatBuff: + case BotSpellTypes::Nuke: return 42; - case BotSpellTypes::InCombatBuffSong: + case BotSpellTypes::InCombatBuff: return 43; + case BotSpellTypes::InCombatBuffSong: + return 44; default: return 0; } @@ -10738,6 +10744,8 @@ uint16 Bot::GetDefaultSpellTypePursuePriority(uint16 spellType, uint8 botClass, return 21; case BotSpellTypes::PetHoTHeals: return 22; + case BotSpellTypes::PetCures: + return 23; default: return 0; } @@ -11215,6 +11223,7 @@ uint16 Bot::GetSpellListSpellType(uint16 spellType) { return BotSpellTypes::Fear; case BotSpellTypes::GroupCures: case BotSpellTypes::Cure: + case BotSpellTypes::PetCures: return BotSpellTypes::Cure; case BotSpellTypes::AERoot: case BotSpellTypes::Root: diff --git a/zone/botspellsai.cpp b/zone/botspellsai.cpp index b7a712757..85052dbfc 100644 --- a/zone/botspellsai.cpp +++ b/zone/botspellsai.cpp @@ -38,7 +38,7 @@ bool Bot::AICastSpell(Mob* tar, uint8 iChance, uint16 spellType, uint16 subTarge (spellType == BotSpellTypes::PreCombatBuffSong && tar->IsPet()) || (!RuleB(Bots, AllowBuffingHealingFamiliars) && tar->IsFamiliar()) || (tar->IsPet() && tar->IsCharmed() && spellType == BotSpellTypes::PetBuffs && !RuleB(Bots, AllowCharmedPetBuffs)) || - (tar->IsPet() && tar->IsCharmed() && (spellType == BotSpellTypes::Cure || spellType == BotSpellTypes::GroupCures) && !RuleB(Bots, AllowCharmedPetCures)) || + (tar->IsPet() && tar->IsCharmed() && spellType == BotSpellTypes::PetCures && !RuleB(Bots, AllowCharmedPetCures)) || (tar->IsPet() && tar->IsCharmed() && IsHealBotSpellType(spellType) && !RuleB(Bots, AllowCharmedPetHeals)) ) { return false; @@ -189,6 +189,7 @@ bool Bot::AICastSpell(Mob* tar, uint8 iChance, uint16 spellType, uint16 subTarge return BotCastHeal(tar, botClass, botSpell, spellType); case BotSpellTypes::GroupCures: case BotSpellTypes::Cure: + case BotSpellTypes::PetCures: if (!tar->IsOfClientBot() && !(tar->IsPet() && tar->GetOwner() && tar->GetOwner()->IsOfClientBot())) { return false; } @@ -2093,6 +2094,7 @@ uint8 Bot::GetChanceToCastBySpellType(uint16 spellType) case BotSpellTypes::Debuff: return RuleI(Bots, PercentChanceToCastDebuff); case BotSpellTypes::Cure: + case BotSpellTypes::PetCures: return RuleI(Bots, PercentChanceToCastCure); case BotSpellTypes::GroupCures: return RuleI(Bots, PercentChanceToCastGroupCure); diff --git a/zone/mob.cpp b/zone/mob.cpp index af159dfbc..a7f81ab16 100644 --- a/zone/mob.cpp +++ b/zone/mob.cpp @@ -8863,6 +8863,9 @@ std::string Mob::GetSpellTypeNameByID(uint16 spellType) { case BotSpellTypes::GroupCures: spellTypeName = "Group Cure"; break; + case BotSpellTypes::PetCures: + spellTypeName = "Pet Cure"; + break; case BotSpellTypes::Resurrect: spellTypeName = "Resurrect"; break; @@ -9087,6 +9090,9 @@ std::string Mob::GetSpellTypeShortNameByID(uint16 spellType) { case BotSpellTypes::GroupCures: spellTypeName = "groupcures"; break; + case BotSpellTypes::PetCures: + spellTypeName = "petcure"; + break; case BotSpellTypes::Resurrect: spellTypeName = "resurrect"; break; @@ -9298,7 +9304,56 @@ std::string Mob::GetSubTypeNameByID(uint16 subType) { } bool Mob::GetDefaultSpellHold(uint16 spellType, uint8 stance) { + uint8 botClass = GetClass(); + switch (spellType) { + case BotSpellTypes::FastHeals: + case BotSpellTypes::VeryFastHeals: + case BotSpellTypes::Pet: + case BotSpellTypes::Escape: + case BotSpellTypes::Lifetap: + case BotSpellTypes::Buff: + case BotSpellTypes::PetBuffs: + case BotSpellTypes::InCombatBuff: + case BotSpellTypes::PreCombatBuff: + case BotSpellTypes::DamageShields: + return false; + case BotSpellTypes::GroupCompleteHeals: + case BotSpellTypes::GroupHeals: + case BotSpellTypes::GroupHoTHeals: + case BotSpellTypes::HoTHeals: + case BotSpellTypes::CompleteHeal: + case BotSpellTypes::PetFastHeals: + case BotSpellTypes::PetRegularHeals: + case BotSpellTypes::PetVeryFastHeals: + case BotSpellTypes::RegularHeal: + switch (stance) { + case Stance::Aggressive: + case Stance::AEBurn: + case Stance::Burn: + return true; + default: + return false; + } + case BotSpellTypes::Cure: + case BotSpellTypes::GroupCures: + switch (stance) { + case Stance::Aggressive: + case Stance::AEBurn: + case Stance::Burn: + return true; + default: + return false; + } + case BotSpellTypes::InCombatBuffSong: + case BotSpellTypes::OutOfCombatBuffSong: + case BotSpellTypes::PreCombatBuffSong: + if (botClass == Class::Bard) { + return false; + } + else { + return true; + } case BotSpellTypes::Nuke: case BotSpellTypes::DOT: case BotSpellTypes::Stun: @@ -9320,15 +9375,6 @@ bool Mob::GetDefaultSpellHold(uint16 spellType, uint8 stance) { default: return true; } - case BotSpellTypes::AESnare: - case BotSpellTypes::AERoot: - case BotSpellTypes::Root: - case BotSpellTypes::AEDispel: - case BotSpellTypes::Dispel: - case BotSpellTypes::AEFear: - case BotSpellTypes::Fear: - case BotSpellTypes::AEHateLine: - return true; case BotSpellTypes::Mez: case BotSpellTypes::AEMez: case BotSpellTypes::Debuff: @@ -9352,17 +9398,8 @@ bool Mob::GetDefaultSpellHold(uint16 spellType, uint8 stance) { default: return false; } - case BotSpellTypes::InCombatBuffSong: - case BotSpellTypes::OutOfCombatBuffSong: - case BotSpellTypes::PreCombatBuffSong: - if (GetClass() == Class::Bard) { - return false; - } - else { - return true; - } case BotSpellTypes::HateLine: - if (GetClass() == Class::ShadowKnight || GetClass() == Class::Paladin) { + if (botClass == Class::ShadowKnight || botClass == Class::Paladin) { switch (stance) { case Stance::Aggressive: return false; @@ -9373,45 +9410,23 @@ bool Mob::GetDefaultSpellHold(uint16 spellType, uint8 stance) { else { return true; } - case BotSpellTypes::Cure: - case BotSpellTypes::GroupCures: - switch (stance) { - case Stance::Aggressive: - case Stance::AEBurn: - case Stance::Burn: - return true; - default: - return false; - } - case BotSpellTypes::GroupCompleteHeals: - case BotSpellTypes::GroupHeals: - case BotSpellTypes::GroupHoTHeals: - case BotSpellTypes::HoTHeals: - case BotSpellTypes::CompleteHeal: - case BotSpellTypes::PetCompleteHeals: - case BotSpellTypes::PetFastHeals: + case BotSpellTypes::Charm: + case BotSpellTypes::Resurrect: + case BotSpellTypes::AESnare: + case BotSpellTypes::AERoot: + case BotSpellTypes::Root: + case BotSpellTypes::AEDispel: + case BotSpellTypes::Dispel: + case BotSpellTypes::AEFear: + case BotSpellTypes::Fear: + case BotSpellTypes::AEHateLine: + case BotSpellTypes::PetCures: case BotSpellTypes::PetHoTHeals: - case BotSpellTypes::PetRegularHeals: - case BotSpellTypes::PetVeryFastHeals: - case BotSpellTypes::RegularHeal: - switch (stance) { - case Stance::Aggressive: - case Stance::AEBurn: - case Stance::Burn: - return true; - default: - return false; - } - case BotSpellTypes::FastHeals: - case BotSpellTypes::VeryFastHeals: - case BotSpellTypes::Pet: - case BotSpellTypes::Escape: - case BotSpellTypes::Lifetap: - case BotSpellTypes::Buff: - case BotSpellTypes::InCombatBuff: - case BotSpellTypes::PreCombatBuff: + case BotSpellTypes::PetCompleteHeals: + case BotSpellTypes::PetDamageShields: + case BotSpellTypes::PetResistBuffs: default: - return false; + return true; } } @@ -9531,6 +9546,8 @@ uint8 Mob::GetDefaultSpellMinThreshold(uint16 spellType, uint8 stance) { } uint8 Mob::GetDefaultSpellMaxThreshold(uint16 spellType, uint8 stance) { + uint8 botClass = GetClass(); + switch (spellType) { case BotSpellTypes::Escape: case BotSpellTypes::VeryFastHeals: @@ -9599,6 +9616,7 @@ uint8 Mob::GetDefaultSpellMaxThreshold(uint16 spellType, uint8 stance) { case BotSpellTypes::Snare: case BotSpellTypes::AEFear: case BotSpellTypes::Fear: + case BotSpellTypes::AEDispel: case BotSpellTypes::Dispel: case BotSpellTypes::AEDebuff: case BotSpellTypes::Debuff: @@ -9614,10 +9632,30 @@ uint8 Mob::GetDefaultSpellMaxThreshold(uint16 spellType, uint8 stance) { default: return 99; } + case BotSpellTypes::GroupHoTHeals: + case BotSpellTypes::HoTHeals: + case BotSpellTypes::PetHoTHeals: + if (botClass == Class::Necromancer || botClass == Class::Shaman) { + return 60; + } + else { + switch (stance) { + case Stance::AEBurn: + case Stance::Burn: + case Stance::Aggressive: + return 95; + case Stance::Efficient: + return 80; + default: + return 90; + } + } case BotSpellTypes::Buff: case BotSpellTypes::Charm: case BotSpellTypes::Cure: - case BotSpellTypes::DamageShields: + case BotSpellTypes::GroupCures: + case BotSpellTypes::PetCures: + case BotSpellTypes::DamageShields: case BotSpellTypes::HateRedux: case BotSpellTypes::InCombatBuff: case BotSpellTypes::InCombatBuffSong: @@ -9634,25 +9672,6 @@ uint8 Mob::GetDefaultSpellMaxThreshold(uint16 spellType, uint8 stance) { case BotSpellTypes::Resurrect: case BotSpellTypes::HateLine: case BotSpellTypes::AEHateLine: - return 100; - case BotSpellTypes::GroupHoTHeals: - case BotSpellTypes::HoTHeals: - case BotSpellTypes::PetHoTHeals: - if (GetClass() == Class::Necromancer || GetClass() == Class::Shaman) { - return 60; - } - else { - switch (stance) { - case Stance::AEBurn: - case Stance::Burn: - case Stance::Aggressive: - return 95; - case Stance::Efficient: - return 80; - default: - return 90; - } - } default: return 100; } @@ -9785,6 +9804,8 @@ uint16 Mob::GetPetSpellType(uint16 spellType) { return BotSpellTypes::PetHoTHeals; case BotSpellTypes::Buff: return BotSpellTypes::PetBuffs; + case BotSpellTypes::Cure: + return BotSpellTypes::PetCures; case BotSpellTypes::DamageShields: return BotSpellTypes::PetDamageShields; case BotSpellTypes::ResistBuffs: