mirror of
https://github.com/EQEmu/Server.git
synced 2025-12-11 16:51:29 +00:00
471 lines
12 KiB
C++
471 lines
12 KiB
C++
#include "spdat.h"
|
|
#include "../zone/bot.h"
|
|
|
|
bool IsBotSpellTypeDetrimental(uint16 spell_type) {
|
|
switch (spell_type) {
|
|
case BotSpellTypes::Nuke:
|
|
case BotSpellTypes::Root:
|
|
case BotSpellTypes::Lifetap:
|
|
case BotSpellTypes::Snare:
|
|
case BotSpellTypes::DOT:
|
|
case BotSpellTypes::Dispel:
|
|
case BotSpellTypes::Mez:
|
|
case BotSpellTypes::Charm:
|
|
case BotSpellTypes::Slow:
|
|
case BotSpellTypes::Debuff:
|
|
case BotSpellTypes::HateRedux:
|
|
case BotSpellTypes::Fear:
|
|
case BotSpellTypes::Stun:
|
|
case BotSpellTypes::AENukes:
|
|
case BotSpellTypes::AERains:
|
|
case BotSpellTypes::AEMez:
|
|
case BotSpellTypes::AEStun:
|
|
case BotSpellTypes::AEDebuff:
|
|
case BotSpellTypes::AESlow:
|
|
case BotSpellTypes::AESnare:
|
|
case BotSpellTypes::AEFear:
|
|
case BotSpellTypes::AEDispel:
|
|
case BotSpellTypes::AERoot:
|
|
case BotSpellTypes::AEDoT:
|
|
case BotSpellTypes::AELifetap:
|
|
case BotSpellTypes::PBAENuke:
|
|
case BotSpellTypes::Lull:
|
|
case BotSpellTypes::AELull:
|
|
case BotSpellTypes::HateLine:
|
|
case BotSpellTypes::AEHateLine:
|
|
return true;
|
|
default:
|
|
return false;
|
|
}
|
|
|
|
return false;
|
|
}
|
|
|
|
bool IsBotSpellTypeBeneficial(uint16 spell_type) {
|
|
switch (spell_type) {
|
|
case BotSpellTypes::RegularHeal:
|
|
case BotSpellTypes::CompleteHeal:
|
|
case BotSpellTypes::GroupCompleteHeals:
|
|
case BotSpellTypes::FastHeals:
|
|
case BotSpellTypes::VeryFastHeals:
|
|
case BotSpellTypes::GroupHeals:
|
|
case BotSpellTypes::GroupHoTHeals:
|
|
case BotSpellTypes::HoTHeals:
|
|
case BotSpellTypes::PetRegularHeals:
|
|
case BotSpellTypes::PetCompleteHeals:
|
|
case BotSpellTypes::PetFastHeals:
|
|
case BotSpellTypes::PetVeryFastHeals:
|
|
case BotSpellTypes::PetHoTHeals:
|
|
case BotSpellTypes::Buff:
|
|
case BotSpellTypes::Cure:
|
|
case BotSpellTypes::GroupCures:
|
|
case BotSpellTypes::PetCures:
|
|
case BotSpellTypes::DamageShields:
|
|
case BotSpellTypes::InCombatBuffSong:
|
|
case BotSpellTypes::OutOfCombatBuffSong:
|
|
case BotSpellTypes::Pet:
|
|
case BotSpellTypes::PetBuffs:
|
|
case BotSpellTypes::PreCombatBuff:
|
|
case BotSpellTypes::PreCombatBuffSong:
|
|
case BotSpellTypes::PetDamageShields:
|
|
case BotSpellTypes::PetResistBuffs:
|
|
case BotSpellTypes::ResistBuffs:
|
|
case BotSpellTypes::Resurrect:
|
|
case BotSpellTypes::Teleport:
|
|
case BotSpellTypes::Succor:
|
|
case BotSpellTypes::BindAffinity:
|
|
case BotSpellTypes::Identify:
|
|
case BotSpellTypes::Levitate:
|
|
case BotSpellTypes::Rune:
|
|
case BotSpellTypes::WaterBreathing:
|
|
case BotSpellTypes::Size:
|
|
case BotSpellTypes::Invisibility:
|
|
case BotSpellTypes::MovementSpeed:
|
|
case BotSpellTypes::SendHome:
|
|
case BotSpellTypes::SummonCorpse:
|
|
return true;
|
|
default:
|
|
return false;
|
|
}
|
|
|
|
return false;
|
|
}
|
|
|
|
bool BotSpellTypeUsesTargetSettings(uint16 spell_type) {
|
|
switch (spell_type) {
|
|
case BotSpellTypes::RegularHeal:
|
|
case BotSpellTypes::CompleteHeal:
|
|
case BotSpellTypes::GroupCompleteHeals:
|
|
case BotSpellTypes::FastHeals:
|
|
case BotSpellTypes::VeryFastHeals:
|
|
case BotSpellTypes::GroupHeals:
|
|
case BotSpellTypes::GroupHoTHeals:
|
|
case BotSpellTypes::HoTHeals:
|
|
case BotSpellTypes::PetRegularHeals:
|
|
case BotSpellTypes::PetCompleteHeals:
|
|
case BotSpellTypes::PetFastHeals:
|
|
case BotSpellTypes::PetVeryFastHeals:
|
|
case BotSpellTypes::PetHoTHeals:
|
|
case BotSpellTypes::Buff:
|
|
case BotSpellTypes::Cure:
|
|
case BotSpellTypes::GroupCures:
|
|
case BotSpellTypes::PetCures:
|
|
case BotSpellTypes::DamageShields:
|
|
case BotSpellTypes::PetDamageShields:
|
|
case BotSpellTypes::PetBuffs:
|
|
case BotSpellTypes::ResistBuffs:
|
|
case BotSpellTypes::PetResistBuffs:
|
|
case BotSpellTypes::Teleport:
|
|
case BotSpellTypes::Succor:
|
|
case BotSpellTypes::BindAffinity:
|
|
case BotSpellTypes::Identify:
|
|
case BotSpellTypes::Levitate:
|
|
case BotSpellTypes::Rune:
|
|
case BotSpellTypes::WaterBreathing:
|
|
case BotSpellTypes::Size:
|
|
case BotSpellTypes::Invisibility:
|
|
case BotSpellTypes::MovementSpeed:
|
|
case BotSpellTypes::SendHome:
|
|
case BotSpellTypes::SummonCorpse:
|
|
return true;
|
|
default:
|
|
return false;
|
|
}
|
|
|
|
return false;
|
|
}
|
|
|
|
bool IsBotSpellTypeInnate(uint16 spell_type) {
|
|
switch (spell_type) {
|
|
case BotSpellTypes::AENukes:
|
|
case BotSpellTypes::AERains:
|
|
case BotSpellTypes::PBAENuke:
|
|
case BotSpellTypes::Nuke:
|
|
case BotSpellTypes::AEDispel:
|
|
case BotSpellTypes::Dispel:
|
|
case BotSpellTypes::AERoot:
|
|
case BotSpellTypes::Root:
|
|
case BotSpellTypes::AESlow:
|
|
case BotSpellTypes::Slow:
|
|
case BotSpellTypes::Charm:
|
|
case BotSpellTypes::AEDebuff:
|
|
case BotSpellTypes::Debuff:
|
|
case BotSpellTypes::AEDoT:
|
|
case BotSpellTypes::DOT:
|
|
case BotSpellTypes::AELifetap:
|
|
case BotSpellTypes::Lifetap:
|
|
case BotSpellTypes::AEStun:
|
|
case BotSpellTypes::Stun:
|
|
case BotSpellTypes::AEMez:
|
|
case BotSpellTypes::Mez:
|
|
case BotSpellTypes::Lull:
|
|
case BotSpellTypes::AELull:
|
|
case BotSpellTypes::HateLine:
|
|
case BotSpellTypes::AEHateLine:
|
|
return true;
|
|
default:
|
|
return false;
|
|
}
|
|
|
|
return false;
|
|
}
|
|
|
|
bool IsAEBotSpellType(uint16 spell_type) {
|
|
switch (spell_type) {
|
|
case BotSpellTypes::AEDebuff:
|
|
case BotSpellTypes::AEFear:
|
|
case BotSpellTypes::AEMez:
|
|
case BotSpellTypes::AENukes:
|
|
case BotSpellTypes::AERains:
|
|
case BotSpellTypes::AESlow:
|
|
case BotSpellTypes::AESnare:
|
|
case BotSpellTypes::AEStun:
|
|
case BotSpellTypes::AEDispel:
|
|
case BotSpellTypes::AEDoT:
|
|
case BotSpellTypes::PBAENuke:
|
|
case BotSpellTypes::AELifetap:
|
|
case BotSpellTypes::AERoot:
|
|
case BotSpellTypes::AEHateLine:
|
|
case BotSpellTypes::AELull:
|
|
return true;
|
|
default:
|
|
return false;
|
|
}
|
|
|
|
return false;
|
|
}
|
|
|
|
bool IsGroupBotSpellType(uint16 spell_type) {
|
|
switch (spell_type) {
|
|
case BotSpellTypes::GroupCures:
|
|
case BotSpellTypes::GroupCompleteHeals:
|
|
case BotSpellTypes::GroupHeals:
|
|
case BotSpellTypes::GroupHoTHeals:
|
|
return true;
|
|
default:
|
|
return false;
|
|
}
|
|
|
|
return false;
|
|
}
|
|
|
|
bool IsGroupTargetOnlyBotSpellType(uint16 spell_type) {
|
|
switch (spell_type) {
|
|
case BotSpellTypes::GroupCures:
|
|
case BotSpellTypes::GroupCompleteHeals:
|
|
case BotSpellTypes::GroupHeals:
|
|
return true;
|
|
default:
|
|
return false;
|
|
}
|
|
|
|
return false;
|
|
}
|
|
|
|
bool IsPetBotSpellType(uint16 spell_type) {
|
|
switch (spell_type) {
|
|
case BotSpellTypes::PetBuffs:
|
|
case BotSpellTypes::PetRegularHeals:
|
|
case BotSpellTypes::PetCompleteHeals:
|
|
case BotSpellTypes::PetFastHeals:
|
|
case BotSpellTypes::PetVeryFastHeals:
|
|
case BotSpellTypes::PetHoTHeals:
|
|
case BotSpellTypes::PetDamageShields:
|
|
case BotSpellTypes::PetResistBuffs:
|
|
case BotSpellTypes::PetCures:
|
|
return true;
|
|
default:
|
|
return false;
|
|
}
|
|
|
|
return false;
|
|
}
|
|
|
|
bool IsClientBotSpellType(uint16 spell_type) {
|
|
switch (spell_type) {
|
|
case BotSpellTypes::RegularHeal:
|
|
case BotSpellTypes::CompleteHeal:
|
|
case BotSpellTypes::GroupCompleteHeals:
|
|
case BotSpellTypes::FastHeals:
|
|
case BotSpellTypes::VeryFastHeals:
|
|
case BotSpellTypes::GroupHeals:
|
|
case BotSpellTypes::GroupHoTHeals:
|
|
case BotSpellTypes::HoTHeals:
|
|
case BotSpellTypes::PetRegularHeals:
|
|
case BotSpellTypes::PetCompleteHeals:
|
|
case BotSpellTypes::PetFastHeals:
|
|
case BotSpellTypes::PetVeryFastHeals:
|
|
case BotSpellTypes::PetHoTHeals:
|
|
case BotSpellTypes::Buff:
|
|
case BotSpellTypes::Cure:
|
|
case BotSpellTypes::GroupCures:
|
|
case BotSpellTypes::PetCures:
|
|
case BotSpellTypes::DamageShields:
|
|
case BotSpellTypes::PetDamageShields:
|
|
case BotSpellTypes::PetBuffs:
|
|
case BotSpellTypes::ResistBuffs:
|
|
case BotSpellTypes::PetResistBuffs:
|
|
return true;
|
|
default:
|
|
return false;
|
|
}
|
|
|
|
return false;
|
|
}
|
|
|
|
bool IsHealBotSpellType(uint16 spell_type) {
|
|
switch (spell_type) {
|
|
case BotSpellTypes::VeryFastHeals:
|
|
case BotSpellTypes::FastHeals:
|
|
case BotSpellTypes::RegularHeal:
|
|
case BotSpellTypes::GroupHeals:
|
|
case BotSpellTypes::CompleteHeal:
|
|
case BotSpellTypes::GroupCompleteHeals:
|
|
case BotSpellTypes::HoTHeals:
|
|
case BotSpellTypes::GroupHoTHeals:
|
|
case BotSpellTypes::PetRegularHeals:
|
|
case BotSpellTypes::PetCompleteHeals:
|
|
case BotSpellTypes::PetFastHeals:
|
|
case BotSpellTypes::PetVeryFastHeals:
|
|
case BotSpellTypes::PetHoTHeals:
|
|
return true;
|
|
default:
|
|
return false;
|
|
}
|
|
|
|
return false;
|
|
}
|
|
|
|
bool BotSpellTypeRequiresLoS(uint16 spell_type) {
|
|
if (IsAEBotSpellType(spell_type)) { // These gather their own targets later
|
|
return false;
|
|
}
|
|
|
|
switch (spell_type) {
|
|
case BotSpellTypes::RegularHeal:
|
|
case BotSpellTypes::GroupCompleteHeals:
|
|
case BotSpellTypes::CompleteHeal:
|
|
case BotSpellTypes::FastHeals:
|
|
case BotSpellTypes::VeryFastHeals:
|
|
case BotSpellTypes::GroupHeals:
|
|
case BotSpellTypes::GroupHoTHeals:
|
|
case BotSpellTypes::HoTHeals:
|
|
case BotSpellTypes::PetRegularHeals:
|
|
case BotSpellTypes::PetCompleteHeals:
|
|
case BotSpellTypes::PetFastHeals:
|
|
case BotSpellTypes::PetVeryFastHeals:
|
|
case BotSpellTypes::PetHoTHeals:
|
|
case BotSpellTypes::InCombatBuff:
|
|
return false;
|
|
default:
|
|
return true;
|
|
}
|
|
|
|
return true;
|
|
}
|
|
|
|
bool BotSpellTypeRequiresTarget(uint16 spell_type) {
|
|
switch (spell_type) {
|
|
case BotSpellTypes::Pet:
|
|
case BotSpellTypes::Succor:
|
|
return false;
|
|
default:
|
|
return true;
|
|
}
|
|
|
|
return true;
|
|
}
|
|
|
|
bool BotSpellTypeRequiresAEChecks(uint16 spell_type) {
|
|
switch (spell_type) {
|
|
case BotSpellTypes::AEMez:
|
|
return false;
|
|
default:
|
|
return true;
|
|
}
|
|
|
|
return true;
|
|
}
|
|
|
|
bool RequiresStackCheck(uint16 spell_type) {
|
|
switch (spell_type) {
|
|
case BotSpellTypes::VeryFastHeals:
|
|
case BotSpellTypes::PetVeryFastHeals:
|
|
case BotSpellTypes::FastHeals:
|
|
case BotSpellTypes::PetFastHeals:
|
|
case BotSpellTypes::RegularHeal:
|
|
case BotSpellTypes::PetRegularHeals:
|
|
case BotSpellTypes::CompleteHeal:
|
|
case BotSpellTypes::PetCompleteHeals:
|
|
case BotSpellTypes::GroupCompleteHeals:
|
|
return false;
|
|
default:
|
|
return true;
|
|
}
|
|
|
|
return true;
|
|
}
|
|
|
|
bool IsCommandedBotSpellType(uint16 spell_type) {
|
|
switch (spell_type) {
|
|
case BotSpellTypes::Charm:
|
|
case BotSpellTypes::AEFear:
|
|
case BotSpellTypes::Fear:
|
|
case BotSpellTypes::Resurrect:
|
|
case BotSpellTypes::AELull:
|
|
case BotSpellTypes::Lull:
|
|
case BotSpellTypes::Teleport:
|
|
case BotSpellTypes::Succor:
|
|
case BotSpellTypes::BindAffinity:
|
|
case BotSpellTypes::Identify:
|
|
case BotSpellTypes::Levitate:
|
|
case BotSpellTypes::Rune:
|
|
case BotSpellTypes::WaterBreathing:
|
|
case BotSpellTypes::Size:
|
|
case BotSpellTypes::Invisibility:
|
|
case BotSpellTypes::MovementSpeed:
|
|
case BotSpellTypes::SendHome:
|
|
case BotSpellTypes::SummonCorpse:
|
|
return true;
|
|
default:
|
|
return false;
|
|
}
|
|
|
|
return false;
|
|
}
|
|
|
|
bool IsPullingBotSpellType(uint16 spell_type) {
|
|
switch (spell_type) {
|
|
case BotSpellTypes::Nuke:
|
|
case BotSpellTypes::Lifetap:
|
|
case BotSpellTypes::Snare:
|
|
case BotSpellTypes::DOT:
|
|
case BotSpellTypes::Dispel:
|
|
case BotSpellTypes::Slow:
|
|
case BotSpellTypes::Debuff:
|
|
case BotSpellTypes::Stun:
|
|
case BotSpellTypes::HateLine:
|
|
return true;
|
|
default:
|
|
return false;
|
|
}
|
|
|
|
return false;
|
|
}
|
|
|
|
uint16 GetCorrectBotSpellType(uint16 spell_type, uint16 spell_id) {
|
|
if (!IsValidSpell(spell_id)) {
|
|
return UINT16_MAX;
|
|
}
|
|
|
|
uint16 correct_type = spell_type;
|
|
|
|
if (!Bot::IsValidSpellTypeBySpellID(spell_type, spell_id)) {
|
|
correct_type = UINT16_MAX;
|
|
|
|
auto start = std::min({ BotSpellTypes::START, BotSpellTypes::COMMANDED_START, BotSpellTypes::DISCIPLINE_START });
|
|
auto end = std::max({ BotSpellTypes::END, BotSpellTypes::COMMANDED_END, BotSpellTypes::DISCIPLINE_END });
|
|
|
|
for (int i = end; i >= start; --i) {
|
|
if (!Bot::IsValidBotSpellType(i) || i == BotSpellTypes::InCombatBuff) {
|
|
continue;
|
|
}
|
|
|
|
if (Bot::IsValidSpellTypeBySpellID(i, spell_id)) {
|
|
correct_type = i;
|
|
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
|
|
return correct_type;
|
|
}
|
|
|
|
uint16 GetPetBotSpellType(uint16 spell_type) {
|
|
switch (spell_type) {
|
|
case BotSpellTypes::Buff:
|
|
return BotSpellTypes::PetBuffs;
|
|
case BotSpellTypes::RegularHeal:
|
|
return BotSpellTypes::PetRegularHeals;
|
|
case BotSpellTypes::CompleteHeal:
|
|
return BotSpellTypes::PetCompleteHeals;
|
|
case BotSpellTypes::FastHeals:
|
|
return BotSpellTypes::PetFastHeals;
|
|
case BotSpellTypes::VeryFastHeals:
|
|
return BotSpellTypes::PetVeryFastHeals;
|
|
case BotSpellTypes::HoTHeals:
|
|
return BotSpellTypes::PetHoTHeals;
|
|
case BotSpellTypes::Cure:
|
|
return BotSpellTypes::PetCures;
|
|
case BotSpellTypes::DamageShields:
|
|
return BotSpellTypes::PetDamageShields;
|
|
case BotSpellTypes::ResistBuffs:
|
|
return BotSpellTypes::PetResistBuffs;
|
|
default:
|
|
return spell_type;
|
|
}
|
|
|
|
return spell_type;
|
|
}
|