[Cleanup] Cleanup classes.cpp/classes.h (#3752)

* [Cleanup] Cleanup classes.cpp/classes.h

# Notes
- Remove unused methods and cleanup logic.

* Update classes.cpp

* Final push.
This commit is contained in:
Alex King 2023-12-13 18:38:45 -05:00 committed by GitHub
parent df83113cea
commit aeeb350068
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
49 changed files with 1308 additions and 1486 deletions

File diff suppressed because it is too large Load Diff

View File

@ -19,99 +19,106 @@
#define CLASSES_CH #define CLASSES_CH
#include "../common/types.h" #include "../common/types.h"
#include "../common/rulesys.h"
#include <string> #include <string>
#include <map>
#define NO_CLASS 0 namespace Class {
#define WARRIOR 1 constexpr uint8 None = 0;
#define CLERIC 2 constexpr uint8 Warrior = 1;
#define PALADIN 3 constexpr uint8 Cleric = 2;
#define RANGER 4 constexpr uint8 Paladin = 3;
#define SHADOWKNIGHT 5 constexpr uint8 Ranger = 4;
#define DRUID 6 constexpr uint8 ShadowKnight = 5;
#define MONK 7 constexpr uint8 Druid = 6;
#define BARD 8 constexpr uint8 Monk = 7;
#define ROGUE 9 constexpr uint8 Bard = 8;
#define SHAMAN 10 constexpr uint8 Rogue = 9;
#define NECROMANCER 11 constexpr uint8 Shaman = 10;
#define WIZARD 12 constexpr uint8 Necromancer = 11;
#define MAGICIAN 13 constexpr uint8 Wizard = 12;
#define ENCHANTER 14 constexpr uint8 Magician = 13;
#define BEASTLORD 15 constexpr uint8 Enchanter = 14;
#define BERSERKER 16 constexpr uint8 Beastlord = 15;
#define WARRIORGM 20 constexpr uint8 Berserker = 16;
#define CLERICGM 21 constexpr uint8 WarriorGM = 20;
#define PALADINGM 22 constexpr uint8 ClericGM = 21;
#define RANGERGM 23 constexpr uint8 PaladinGM = 22;
#define SHADOWKNIGHTGM 24 constexpr uint8 RangerGM = 23;
#define DRUIDGM 25 constexpr uint8 ShadowKnightGM = 24;
#define MONKGM 26 constexpr uint8 DruidGM = 25;
#define BARDGM 27 constexpr uint8 MonkGM = 26;
#define ROGUEGM 28 constexpr uint8 BardGM = 27;
#define SHAMANGM 29 constexpr uint8 RogueGM = 28;
#define NECROMANCERGM 30 constexpr uint8 ShamanGM = 29;
#define WIZARDGM 31 constexpr uint8 NecromancerGM = 30;
#define MAGICIANGM 32 constexpr uint8 WizardGM = 31;
#define ENCHANTERGM 33 constexpr uint8 MagicianGM = 32;
#define BEASTLORDGM 34 constexpr uint8 EnchanterGM = 33;
#define BERSERKERGM 35 constexpr uint8 BeastlordGM = 34;
#define BANKER 40 constexpr uint8 BerserkerGM = 35;
#define MERCHANT 41 constexpr uint8 Banker = 40;
#define DISCORD_MERCHANT 59 constexpr uint8 Merchant = 41;
#define ADVENTURE_RECRUITER 60 constexpr uint8 DiscordMerchant = 59;
#define ADVENTURE_MERCHANT 61 constexpr uint8 AdventureRecruiter = 60;
#define LDON_TREASURE 62 // objects you can use /open on first seen in LDONs, seen on Danvi's Corpse in Akheva constexpr uint8 AdventureMerchant = 61;
#define TRIBUTE_MASTER 63 constexpr uint8 LDoNTreasure = 62;
#define GUILD_TRIBUTE_MASTER 64 // not sure constexpr uint8 TributeMaster = 63;
#define GUILD_BANKER 66 constexpr uint8 GuildTributeMaster = 64;
#define NORRATHS_KEEPERS_MERCHANT 67 constexpr uint8 GuildBanker = 66;
#define DARK_REIGN_MERCHANT 68 constexpr uint8 NorrathsKeepersMerchant = 67;
#define FELLOWSHIP_MASTER 69 constexpr uint8 DarkReignMerchant = 68;
#define ALT_CURRENCY_MERCHANT 70 constexpr uint8 FellowshipMaster = 69;
#define MERCENARY_MASTER 71 constexpr uint8 AlternateCurrencyMerchant = 70;
constexpr uint8 MercenaryLiaison = 71;
constexpr uint8 PLAYER_CLASS_COUNT = 16;
constexpr uint16 ALL_CLASSES_BITMASK = 65535;
};
// player class values static std::map<uint8, uint16> player_class_bitmasks = {
#define PLAYER_CLASS_UNKNOWN 0 {Class::Warrior, 1},
#define PLAYER_CLASS_WARRIOR 1 {Class::Cleric, 2},
#define PLAYER_CLASS_CLERIC 2 {Class::Paladin, 4},
#define PLAYER_CLASS_PALADIN 3 {Class::Ranger, 8},
#define PLAYER_CLASS_RANGER 4 {Class::ShadowKnight, 16},
#define PLAYER_CLASS_SHADOWKNIGHT 5 {Class::Druid, 32},
#define PLAYER_CLASS_DRUID 6 {Class::Monk, 64},
#define PLAYER_CLASS_MONK 7 {Class::Bard, 128},
#define PLAYER_CLASS_BARD 8 {Class::Rogue, 256},
#define PLAYER_CLASS_ROGUE 9 {Class::Shaman, 512},
#define PLAYER_CLASS_SHAMAN 10 {Class::Necromancer, 1024},
#define PLAYER_CLASS_NECROMANCER 11 {Class::Wizard, 2048},
#define PLAYER_CLASS_WIZARD 12 {Class::Magician, 4096},
#define PLAYER_CLASS_MAGICIAN 13 {Class::Enchanter, 8192},
#define PLAYER_CLASS_ENCHANTER 14 {Class::Beastlord, 16384},
#define PLAYER_CLASS_BEASTLORD 15 {Class::Berserker, 32768},
#define PLAYER_CLASS_BERSERKER 16 };
#define PLAYER_CLASS_COUNT 16 static std::string shadow_knight_class_name = (
RuleB(World, UseOldShadowKnightClassExport) ?
"Shadowknight" :
"Shadow Knight"
);
static std::map<uint8, std::string> class_names = {
// player class bits {Class::Warrior, "Warrior"},
#define PLAYER_CLASS_UNKNOWN_BIT 0 {Class::Cleric, "Cleric"},
#define PLAYER_CLASS_WARRIOR_BIT 1 {Class::Paladin, "Paladin"},
#define PLAYER_CLASS_CLERIC_BIT 2 {Class::Ranger, "Ranger"},
#define PLAYER_CLASS_PALADIN_BIT 4 {Class::ShadowKnight, shadow_knight_class_name},
#define PLAYER_CLASS_RANGER_BIT 8 {Class::Druid, "Druid"},
#define PLAYER_CLASS_SHADOWKNIGHT_BIT 16 {Class::Monk, "Monk"},
#define PLAYER_CLASS_DRUID_BIT 32 {Class::Bard, "Bard"},
#define PLAYER_CLASS_MONK_BIT 64 {Class::Rogue, "Rogue"},
#define PLAYER_CLASS_BARD_BIT 128 {Class::Shaman, "Shaman"},
#define PLAYER_CLASS_ROGUE_BIT 256 {Class::Necromancer, "Necromancer"},
#define PLAYER_CLASS_SHAMAN_BIT 512 {Class::Wizard, "Wizard"},
#define PLAYER_CLASS_NECROMANCER_BIT 1024 {Class::Magician, "Magician"},
#define PLAYER_CLASS_WIZARD_BIT 2048 {Class::Enchanter, "Enchanter"},
#define PLAYER_CLASS_MAGICIAN_BIT 4096 {Class::Beastlord, "Beastlord"},
#define PLAYER_CLASS_ENCHANTER_BIT 8192 {Class::Berserker, "Berserker"},
#define PLAYER_CLASS_BEASTLORD_BIT 16384 };
#define PLAYER_CLASS_BERSERKER_BIT 32768
#define PLAYER_CLASS_ALL_MASK 65535 // was 65536
#define ARMOR_TYPE_UNKNOWN 0 #define ARMOR_TYPE_UNKNOWN 0
@ -126,16 +133,12 @@
const char* GetClassIDName(uint8 class_id, uint8 level = 0); const char* GetClassIDName(uint8 class_id, uint8 level = 0);
const char* GetPlayerClassName(uint32 player_class_value, uint8 level = 0);
bool IsPlayerClass(uint8 class_id); bool IsPlayerClass(uint8 class_id);
const std::string GetPlayerClassAbbreviation(uint8 class_id); const std::string GetPlayerClassAbbreviation(uint8 class_id);
uint32 GetPlayerClassValue(uint8 class_id); uint8 GetPlayerClassValue(uint8 class_id);
uint32 GetPlayerClassBit(uint8 class_id); uint16 GetPlayerClassBit(uint8 class_id);
uint8 GetClassIDFromPlayerClassValue(uint32 player_class_value);
uint8 GetClassIDFromPlayerClassBit(uint32 player_class_bit);
bool IsFighterClass(uint8 class_id); bool IsFighterClass(uint8 class_id);
bool IsSpellFighterClass(uint8 class_id); bool IsSpellFighterClass(uint8 class_id);

View File

@ -132,7 +132,7 @@ namespace EQ
// Swap items in inventory // Swap items in inventory
enum SwapItemFailState : int8 { swapInvalid = -1, swapPass = 0, swapNotAllowed, swapNullData, swapRaceClass, swapDeity, swapLevel }; enum SwapItemFailState : int8 { swapInvalid = -1, swapPass = 0, swapNotAllowed, swapNullData, swapRaceClass, swapDeity, swapLevel };
bool SwapItem(int16 source_slot, int16 destination_slot, SwapItemFailState& fail_state, uint16 race_id = RACE_DOUG_0, uint8 class_id = NO_CLASS, uint16 deity_id = deity::DeityType::DeityUnknown, uint8 level = 0); bool SwapItem(int16 source_slot, int16 destination_slot, SwapItemFailState& fail_state, uint16 race_id = RACE_DOUG_0, uint8 class_id = Class::None, uint16 deity_id = deity::DeityType::DeityUnknown, uint8 level = 0);
// Remove item from inventory // Remove item from inventory
bool DeleteItem(int16 slot_id, int16 quantity = 0); bool DeleteItem(int16 slot_id, int16 quantity = 0);

View File

@ -2706,7 +2706,7 @@ namespace RoF2
switch (raid_gen->action) switch (raid_gen->action)
{ {
case raidAdd: case raidAdd:
{ {
RaidAddMember_Struct* emu = (RaidAddMember_Struct*)__emu_buffer; RaidAddMember_Struct* emu = (RaidAddMember_Struct*)__emu_buffer;
@ -3986,7 +3986,7 @@ namespace RoF2
if (strlen(emu->suffix)) if (strlen(emu->suffix))
PacketSize += strlen(emu->suffix) + 1; PacketSize += strlen(emu->suffix) + 1;
if (emu->DestructibleObject || emu->class_ == LDON_TREASURE) if (emu->DestructibleObject || emu->class_ == Class::LDoNTreasure)
{ {
if (emu->DestructibleObject) if (emu->DestructibleObject)
PacketSize = PacketSize - 4; // No bodytype PacketSize = PacketSize - 4; // No bodytype
@ -4076,7 +4076,7 @@ namespace RoF2
// actually part of bitfields // actually part of bitfields
uint8 OtherData = 0; uint8 OtherData = 0;
if (emu->class_ == LDON_TREASURE) //LDoN Chest if (emu->class_ == Class::LDoNTreasure) //LDoN Chest
{ {
OtherData = OtherData | 0x04; OtherData = OtherData | 0x04;
} }
@ -4104,7 +4104,7 @@ namespace RoF2
// int DefaultEmitterID // int DefaultEmitterID
VARSTRUCT_ENCODE_TYPE(float, Buffer, 0); // unknown4 VARSTRUCT_ENCODE_TYPE(float, Buffer, 0); // unknown4
if (emu->DestructibleObject || emu->class_ == LDON_TREASURE) if (emu->DestructibleObject || emu->class_ == Class::LDoNTreasure)
{ {
VARSTRUCT_ENCODE_STRING(Buffer, emu->DestructibleModel); VARSTRUCT_ENCODE_STRING(Buffer, emu->DestructibleModel);
VARSTRUCT_ENCODE_STRING(Buffer, emu->DestructibleName2); VARSTRUCT_ENCODE_STRING(Buffer, emu->DestructibleName2);

View File

@ -2758,7 +2758,7 @@ namespace UF
if (strlen(emu->suffix)) if (strlen(emu->suffix))
PacketSize += strlen(emu->suffix) + 1; PacketSize += strlen(emu->suffix) + 1;
if (emu->DestructibleObject || emu->class_ == LDON_TREASURE) if (emu->DestructibleObject || emu->class_ == Class::LDoNTreasure)
{ {
if (emu->DestructibleObject) if (emu->DestructibleObject)
PacketSize = PacketSize - 4; // No bodytype PacketSize = PacketSize - 4; // No bodytype
@ -2847,7 +2847,7 @@ namespace UF
uint8 OtherData = 0; uint8 OtherData = 0;
if (emu->class_ == LDON_TREASURE) //Ldon chest if (emu->class_ == Class::LDoNTreasure) //Ldon chest
{ {
OtherData = OtherData | 0x01; OtherData = OtherData | 0x01;
} }
@ -2873,7 +2873,7 @@ namespace UF
} }
VARSTRUCT_ENCODE_TYPE(float, Buffer, 0); // unknown4 VARSTRUCT_ENCODE_TYPE(float, Buffer, 0); // unknown4
if (emu->DestructibleObject || emu->class_ == LDON_TREASURE) if (emu->DestructibleObject || emu->class_ == Class::LDoNTreasure)
{ {
VARSTRUCT_ENCODE_STRING(Buffer, emu->DestructibleModel); VARSTRUCT_ENCODE_STRING(Buffer, emu->DestructibleModel);
VARSTRUCT_ENCODE_STRING(Buffer, emu->DestructibleName2); VARSTRUCT_ENCODE_STRING(Buffer, emu->DestructibleName2);

View File

@ -305,6 +305,7 @@ RULE_BOOL(World, EnableChecksumVerification, false, "Enable or Disable the Check
RULE_INT(World, MaximumQuestErrors, 30, "Changes the maximum number of quest errors that can be displayed in #questerrors, default is 30") RULE_INT(World, MaximumQuestErrors, 30, "Changes the maximum number of quest errors that can be displayed in #questerrors, default is 30")
RULE_INT(World, BootHour, 0, "Sets the in-game hour world will set when it first boots. 0-24 are valid options, where 0 disables this rule") RULE_INT(World, BootHour, 0, "Sets the in-game hour world will set when it first boots. 0-24 are valid options, where 0 disables this rule")
RULE_BOOL(World, UseItemLinksForKeyRing, false, "Uses item links for Key Ring Listing instead of item name") RULE_BOOL(World, UseItemLinksForKeyRing, false, "Uses item links for Key Ring Listing instead of item name")
RULE_BOOL(World, UseOldShadowKnightClassExport, true, "Disable to have Shadowknight show as Shadow Knight (live-like)")
RULE_CATEGORY_END() RULE_CATEGORY_END()
RULE_CATEGORY(Zone) RULE_CATEGORY(Zone)

View File

@ -1808,7 +1808,7 @@ bool SharedDatabase::LoadSkillCaps(const std::string &prefix) {
} }
void SharedDatabase::LoadSkillCaps(void *data) { void SharedDatabase::LoadSkillCaps(void *data) {
const uint32 class_count = PLAYER_CLASS_COUNT; const uint32 class_count = Class::PLAYER_CLASS_COUNT;
const uint32 skill_count = EQ::skills::HIGHEST_SKILL + 1; const uint32 skill_count = EQ::skills::HIGHEST_SKILL + 1;
const uint32 level_count = HARD_LEVEL_CAP + 1; const uint32 level_count = HARD_LEVEL_CAP + 1;
uint16 *skill_caps_table = static_cast<uint16*>(data); uint16 *skill_caps_table = static_cast<uint16*>(data);
@ -1848,7 +1848,7 @@ uint16 SharedDatabase::GetSkillCap(uint8 Class_, EQ::skills::SkillType Skill, ui
SkillMaxLevel = RuleI(Character, MaxLevel); SkillMaxLevel = RuleI(Character, MaxLevel);
} }
const uint32 class_count = PLAYER_CLASS_COUNT; const uint32 class_count = Class::PLAYER_CLASS_COUNT;
const uint32 skill_count = EQ::skills::HIGHEST_SKILL + 1; const uint32 skill_count = EQ::skills::HIGHEST_SKILL + 1;
const uint32 level_count = HARD_LEVEL_CAP + 1; const uint32 level_count = HARD_LEVEL_CAP + 1;
if(Class_ > class_count || static_cast<uint32>(Skill) > skill_count || Level > level_count) { if(Class_ > class_count || static_cast<uint32>(Skill) > skill_count || Level > level_count) {
@ -1878,7 +1878,7 @@ uint8 SharedDatabase::GetTrainLevel(uint8 Class_, EQ::skills::SkillType Skill, u
SkillMaxLevel = RuleI(Character, MaxLevel); SkillMaxLevel = RuleI(Character, MaxLevel);
} }
const uint32 class_count = PLAYER_CLASS_COUNT; const uint32 class_count = Class::PLAYER_CLASS_COUNT;
const uint32 skill_count = EQ::skills::HIGHEST_SKILL + 1; const uint32 skill_count = EQ::skills::HIGHEST_SKILL + 1;
const uint32 level_count = HARD_LEVEL_CAP + 1; const uint32 level_count = HARD_LEVEL_CAP + 1;
if(Class_ > class_count || static_cast<uint32>(Skill) > skill_count || Level > level_count) { if(Class_ > class_count || static_cast<uint32>(Skill) > skill_count || Level > level_count) {
@ -2061,7 +2061,7 @@ void SharedDatabase::LoadSpells(void *data, int max_spells) {
sp[tempid].environment_type=Strings::ToInt(row[102]); sp[tempid].environment_type=Strings::ToInt(row[102]);
sp[tempid].time_of_day=Strings::ToInt(row[103]); sp[tempid].time_of_day=Strings::ToInt(row[103]);
for(y=0; y < PLAYER_CLASS_COUNT;y++) for(y=0; y < Class::PLAYER_CLASS_COUNT;y++)
sp[tempid].classes[y]=Strings::ToInt(row[104+y]); sp[tempid].classes[y]=Strings::ToInt(row[104+y]);
sp[tempid].casting_animation=Strings::ToInt(row[120]); sp[tempid].casting_animation=Strings::ToInt(row[120]);

View File

@ -666,7 +666,7 @@ bool IsBardSong(uint16 spell_id)
const auto& spell = spells[spell_id]; const auto& spell = spells[spell_id];
if ( if (
spell.classes[BARD - 1] < UINT8_MAX && spell.classes[Class::Bard - 1] < UINT8_MAX &&
!spell.is_discipline !spell.is_discipline
) { ) {
return true; return true;
@ -780,7 +780,7 @@ uint8 GetSpellMinimumLevel(uint16 spell_id)
const auto& spell = spells[spell_id]; const auto& spell = spells[spell_id];
for (int i = 0; i < PLAYER_CLASS_COUNT; i++) { for (int i = 0; i < Class::PLAYER_CLASS_COUNT; i++) {
if (spell.classes[i] < minimum_level) { if (spell.classes[i] < minimum_level) {
minimum_level = spell.classes[i]; minimum_level = spell.classes[i];
} }
@ -798,7 +798,7 @@ uint8 GetSpellLevel(uint16 spell_id, uint8 class_id)
return UINT8_MAX; return UINT8_MAX;
} }
if (class_id >= PLAYER_CLASS_COUNT) { if (class_id >= Class::PLAYER_CLASS_COUNT) {
return UINT8_MAX; return UINT8_MAX;
} }

View File

@ -1369,7 +1369,7 @@ struct SPDat_Spell_Struct
/* 101 */ int8 zone_type; // 01=Outdoors, 02=dungeons, ff=Any -- ZONETYPE /* 101 */ int8 zone_type; // 01=Outdoors, 02=dungeons, ff=Any -- ZONETYPE
/* 102 */ int8 environment_type; // -- ENVIRONMENTTYPE /* 102 */ int8 environment_type; // -- ENVIRONMENTTYPE
/* 103 */ int8 time_of_day; // -- TIMEOFDAY /* 103 */ int8 time_of_day; // -- TIMEOFDAY
/* 104 */ uint8 classes[PLAYER_CLASS_COUNT]; // Classes, and their min levels -- WARRIORMIN ... BERSERKERMIN /* 104 */ uint8 classes[Class::PLAYER_CLASS_COUNT]; // Classes, and their min levels -- WARRIORMIN ... BERSERKERMIN
/* 120 */ uint8 casting_animation; // -- CASTINGANIM /* 120 */ uint8 casting_animation; // -- CASTINGANIM
/* 121 */ //uint8 TargetAnim; // -- TARGETANIM /* 121 */ //uint8 TargetAnim; // -- TARGETANIM
/* 122 */ //uint32 TravelType; // -- TRAVELTYPE /* 122 */ //uint32 TravelType; // -- TRAVELTYPE

View File

@ -29,7 +29,7 @@ void LoadSkillCaps(SharedDatabase *database, const std::string &prefix) {
EQ::IPCMutex mutex("skill_caps"); EQ::IPCMutex mutex("skill_caps");
mutex.Lock(); mutex.Lock();
uint32 class_count = PLAYER_CLASS_COUNT; uint32 class_count = Class::PLAYER_CLASS_COUNT;
uint32 skill_count = EQ::skills::HIGHEST_SKILL + 1; uint32 skill_count = EQ::skills::HIGHEST_SKILL + 1;
uint32 level_count = HARD_LEVEL_CAP + 1; uint32 level_count = HARD_LEVEL_CAP + 1;
uint32 size = (class_count * skill_count * level_count * sizeof(uint16)); uint32 size = (class_count * skill_count * level_count * sizeof(uint16));

View File

@ -1966,7 +1966,7 @@ bool CheckCharCreateInfoTitanium(CharCreate_Struct *cc)
{ /*Drakkin*/ 70, 80, 85, 75, 80, 85, 75} { /*Drakkin*/ 70, 80, 85, 75, 80, 85, 75}
}; };
static const int BaseClass[PLAYER_CLASS_COUNT][8] = static const int BaseClass[Class::PLAYER_CLASS_COUNT][8] =
{ /* STR STA AGI DEX WIS INT CHR ADD*/ { /* STR STA AGI DEX WIS INT CHR ADD*/
{ /*Warrior*/ 10, 10, 5, 0, 0, 0, 0, 25}, { /*Warrior*/ 10, 10, 5, 0, 0, 0, 0, 25},
{ /*Cleric*/ 5, 5, 0, 0, 10, 0, 0, 30}, { /*Cleric*/ 5, 5, 0, 0, 10, 0, 0, 30},
@ -1986,7 +1986,7 @@ bool CheckCharCreateInfoTitanium(CharCreate_Struct *cc)
{ /*Berserker*/ 10, 5, 0, 10, 0, 0, 0, 25} { /*Berserker*/ 10, 5, 0, 10, 0, 0, 0, 25}
}; };
static const bool ClassRaceLookupTable[PLAYER_CLASS_COUNT][_TABLE_RACES]= static const bool ClassRaceLookupTable[Class::PLAYER_CLASS_COUNT][_TABLE_RACES]=
{ /*Human Barbarian Erudite Woodelf Highelf Darkelf Halfelf Dwarf Troll Ogre Halfling Gnome Iksar Vahshir Froglok Drakkin*/ { /*Human Barbarian Erudite Woodelf Highelf Darkelf Halfelf Dwarf Troll Ogre Halfling Gnome Iksar Vahshir Froglok Drakkin*/
{ /*Warrior*/ true, true, false, true, false, true, true, true, true, true, true, true, true, true, true, true}, { /*Warrior*/ true, true, false, true, false, true, true, true, true, true, true, true, true, true, true, true},
{ /*Cleric*/ true, false, true, false, true, true, true, true, false, false, true, true, false, false, true, true}, { /*Cleric*/ true, false, true, false, true, true, true, true, false, false, true, true, false, false, true, true},
@ -2021,7 +2021,7 @@ bool CheckCharCreateInfoTitanium(CharCreate_Struct *cc)
// if out of range looking it up in the table would crash stuff // if out of range looking it up in the table would crash stuff
// so we return from these // so we return from these
if (classtemp >= PLAYER_CLASS_COUNT) { if (classtemp >= Class::PLAYER_CLASS_COUNT) {
LogInfo(" class is out of range"); LogInfo(" class is out of range");
return false; return false;
} }
@ -2114,7 +2114,7 @@ void Client::SetClassStartingSkills(PlayerProfile_Struct *pp)
} }
} }
if (cle->GetClientVersion() < static_cast<uint8>(EQ::versions::ClientVersion::RoF2) && pp->class_ == BERSERKER) { if (cle->GetClientVersion() < static_cast<uint8>(EQ::versions::ClientVersion::RoF2) && pp->class_ == Class::Berserker) {
pp->skills[EQ::skills::Skill1HPiercing] = pp->skills[EQ::skills::Skill2HPiercing]; pp->skills[EQ::skills::Skill1HPiercing] = pp->skills[EQ::skills::Skill2HPiercing];
pp->skills[EQ::skills::Skill2HPiercing] = 0; pp->skills[EQ::skills::Skill2HPiercing] = 0;
} }
@ -2299,7 +2299,7 @@ void Client::SetClassLanguages(PlayerProfile_Struct *pp)
{ {
// we only need to handle one class, but custom server might want to do more // we only need to handle one class, but custom server might want to do more
switch(pp->class_) { switch(pp->class_) {
case ROGUE: case Class::Rogue:
pp->languages[LANG_THIEVES_CANT] = 100; pp->languages[LANG_THIEVES_CANT] = 100;
break; break;
default: default:

View File

@ -33,7 +33,7 @@ GroupLFP::GroupLFP(uint32 inLeaderID) {
LeaderID = inLeaderID; LeaderID = inLeaderID;
for (auto &member : Members) { for (auto &member : Members) {
member.Name[0] = '\0'; member.Name[0] = '\0';
member.Class = NO_CLASS; member.Class = Class::None;
member.Level = 0; member.Level = 0;
member.Zone = 0; member.Zone = 0;
} }
@ -77,7 +77,7 @@ void GroupLFP::SetDetails(ServerLFPUpdate_Struct *Update) {
Members[i].GuildID = CLE->GuildID(); Members[i].GuildID = CLE->GuildID();
} }
else { else {
Members[i].Class = NO_CLASS; Members[i].Class = Class::None;
Members[i].Level = 0; Members[i].Level = 0;
Members[i].Zone = 0; Members[i].Zone = 0;
Members[i].GuildID = 0xFFFF; Members[i].GuildID = 0xFFFF;

View File

@ -373,72 +373,72 @@ void Mob::WakeTheDead(uint16 spell_id, Corpse *corpse_to_use, Mob *tar, uint32 d
//some basic combat mods here too since it's convienent //some basic combat mods here too since it's convienent
switch (corpse_to_use->class_) switch (corpse_to_use->class_)
{ {
case CLERIC: case Class::Cleric:
made_npc->npc_spells_id = 1; made_npc->npc_spells_id = 1;
break; break;
case WIZARD: case Class::Wizard:
made_npc->npc_spells_id = 2; made_npc->npc_spells_id = 2;
break; break;
case NECROMANCER: case Class::Necromancer:
made_npc->npc_spells_id = 3; made_npc->npc_spells_id = 3;
break; break;
case MAGICIAN: case Class::Magician:
made_npc->npc_spells_id = 4; made_npc->npc_spells_id = 4;
break; break;
case ENCHANTER: case Class::Enchanter:
made_npc->npc_spells_id = 5; made_npc->npc_spells_id = 5;
break; break;
case SHAMAN: case Class::Shaman:
made_npc->npc_spells_id = 6; made_npc->npc_spells_id = 6;
break; break;
case DRUID: case Class::Druid:
made_npc->npc_spells_id = 7; made_npc->npc_spells_id = 7;
break; break;
case PALADIN: case Class::Paladin:
//SPECATK_TRIPLE //SPECATK_TRIPLE
strcpy(made_npc->special_abilities, "6,1"); strcpy(made_npc->special_abilities, "6,1");
made_npc->current_hp = made_npc->current_hp * 150 / 100; made_npc->current_hp = made_npc->current_hp * 150 / 100;
made_npc->max_hp = made_npc->max_hp * 150 / 100; made_npc->max_hp = made_npc->max_hp * 150 / 100;
made_npc->npc_spells_id = 8; made_npc->npc_spells_id = 8;
break; break;
case SHADOWKNIGHT: case Class::ShadowKnight:
strcpy(made_npc->special_abilities, "6,1"); strcpy(made_npc->special_abilities, "6,1");
made_npc->current_hp = made_npc->current_hp * 150 / 100; made_npc->current_hp = made_npc->current_hp * 150 / 100;
made_npc->max_hp = made_npc->max_hp * 150 / 100; made_npc->max_hp = made_npc->max_hp * 150 / 100;
made_npc->npc_spells_id = 9; made_npc->npc_spells_id = 9;
break; break;
case RANGER: case Class::Ranger:
strcpy(made_npc->special_abilities, "7,1"); strcpy(made_npc->special_abilities, "7,1");
made_npc->current_hp = made_npc->current_hp * 135 / 100; made_npc->current_hp = made_npc->current_hp * 135 / 100;
made_npc->max_hp = made_npc->max_hp * 135 / 100; made_npc->max_hp = made_npc->max_hp * 135 / 100;
made_npc->npc_spells_id = 10; made_npc->npc_spells_id = 10;
break; break;
case BARD: case Class::Bard:
strcpy(made_npc->special_abilities, "6,1"); strcpy(made_npc->special_abilities, "6,1");
made_npc->current_hp = made_npc->current_hp * 110 / 100; made_npc->current_hp = made_npc->current_hp * 110 / 100;
made_npc->max_hp = made_npc->max_hp * 110 / 100; made_npc->max_hp = made_npc->max_hp * 110 / 100;
made_npc->npc_spells_id = 11; made_npc->npc_spells_id = 11;
break; break;
case BEASTLORD: case Class::Beastlord:
strcpy(made_npc->special_abilities, "7,1"); strcpy(made_npc->special_abilities, "7,1");
made_npc->current_hp = made_npc->current_hp * 110 / 100; made_npc->current_hp = made_npc->current_hp * 110 / 100;
made_npc->max_hp = made_npc->max_hp * 110 / 100; made_npc->max_hp = made_npc->max_hp * 110 / 100;
made_npc->npc_spells_id = 12; made_npc->npc_spells_id = 12;
break; break;
case ROGUE: case Class::Rogue:
strcpy(made_npc->special_abilities, "7,1"); strcpy(made_npc->special_abilities, "7,1");
made_npc->max_dmg = made_npc->max_dmg * 150 / 100; made_npc->max_dmg = made_npc->max_dmg * 150 / 100;
made_npc->current_hp = made_npc->current_hp * 110 / 100; made_npc->current_hp = made_npc->current_hp * 110 / 100;
made_npc->max_hp = made_npc->max_hp * 110 / 100; made_npc->max_hp = made_npc->max_hp * 110 / 100;
break; break;
case MONK: case Class::Monk:
strcpy(made_npc->special_abilities, "7,1"); strcpy(made_npc->special_abilities, "7,1");
made_npc->max_dmg = made_npc->max_dmg * 150 / 100; made_npc->max_dmg = made_npc->max_dmg * 150 / 100;
made_npc->current_hp = made_npc->current_hp * 135 / 100; made_npc->current_hp = made_npc->current_hp * 135 / 100;
made_npc->max_hp = made_npc->max_hp * 135 / 100; made_npc->max_hp = made_npc->max_hp * 135 / 100;
break; break;
case WARRIOR: case Class::Warrior:
case BERSERKER: case Class::Berserker:
strcpy(made_npc->special_abilities, "7,1"); strcpy(made_npc->special_abilities, "7,1");
made_npc->max_dmg = made_npc->max_dmg * 150 / 100; made_npc->max_dmg = made_npc->max_dmg * 150 / 100;
made_npc->current_hp = made_npc->current_hp * 175 / 100; made_npc->current_hp = made_npc->current_hp * 175 / 100;
@ -1354,7 +1354,7 @@ void Client::ActivateAlternateAdvancementAbility(int rank_id, int target_id) {
} }
else { else {
// Bards can cast instant cast AAs while they are casting or channeling item cast. // Bards can cast instant cast AAs while they are casting or channeling item cast.
if (GetClass() == BARD && IsCasting() && spells[rank->spell].cast_time == 0) { if (GetClass() == Class::Bard && IsCasting() && spells[rank->spell].cast_time == 0) {
if (!DoCastingChecksOnCaster(rank->spell, EQ::spells::CastingSlot::AltAbility)) { if (!DoCastingChecksOnCaster(rank->spell, EQ::spells::CastingSlot::AltAbility)) {
return; return;
} }

View File

@ -678,7 +678,7 @@ bool Mob::IsAttackAllowed(Mob *target, bool isSpellAttack)
if(!isSpellAttack) if(!isSpellAttack)
{ {
if(GetClass() == LDON_TREASURE) if(GetClass() == Class::LDoNTreasure)
{ {
return false; return false;
} }
@ -1070,10 +1070,10 @@ bool Mob::CombatRange(Mob* other, float fixed_size_mod, bool aeRampage, ExtraAtt
SetPseudoRoot(false); SetPseudoRoot(false);
} }
} }
if (aeRampage) { if (aeRampage) {
float aeramp_size = RuleR(Combat, AERampageMaxDistance); float aeramp_size = RuleR(Combat, AERampageMaxDistance);
LogCombatDetail("AERampage: Default - aeramp_size = [{}] ", aeramp_size); LogCombatDetail("AERampage: Default - aeramp_size = [{}] ", aeramp_size);
if (opts) { if (opts) {
@ -1093,7 +1093,7 @@ bool Mob::CombatRange(Mob* other, float fixed_size_mod, bool aeRampage, ExtraAtt
LogCombatDetail("AE Rampage: ramp_range = [{}] -- (size_mod [{}] * aeramp_size [{}])", ramp_range, size_mod, aeramp_size); LogCombatDetail("AE Rampage: ramp_range = [{}] -- (size_mod [{}] * aeramp_size [{}])", ramp_range, size_mod, aeramp_size);
LogCombatDetail("AE Rampage: _DistNoRoot [{}] <= ramp_range [{}]", _DistNoRoot, ramp_range); LogCombatDetail("AE Rampage: _DistNoRoot [{}] <= ramp_range [{}]", _DistNoRoot, ramp_range);
if (_DistNoRoot <= ramp_range) { if (_DistNoRoot <= ramp_range) {
LogCombatDetail("AE Rampage: Combat Distance returned [true]"); LogCombatDetail("AE Rampage: Combat Distance returned [true]");
return true; return true;

View File

@ -558,7 +558,7 @@ bool Mob::AvoidDamage(Mob *other, DamageHitInfo &hit)
} }
// dodge // dodge
if (CanThisClassDodge() && (InFront || GetClass() == MONK)) { if (CanThisClassDodge() && (InFront || GetClass() == Class::Monk)) {
if (IsClient()) if (IsClient())
CastToClient()->CheckIncreaseSkill(EQ::skills::SkillDodge, other, -10); CastToClient()->CheckIncreaseSkill(EQ::skills::SkillDodge, other, -10);
// check auto discs ... I guess aa/items too :P // check auto discs ... I guess aa/items too :P
@ -674,28 +674,28 @@ int Mob::GetACSoftcap()
int level = std::min(105, static_cast<int>(GetLevel())) - 1; int level = std::min(105, static_cast<int>(GetLevel())) - 1;
switch (GetClass()) { switch (GetClass()) {
case WARRIOR: case Class::Warrior:
return war_softcaps[level]; return war_softcaps[level];
case CLERIC: case Class::Cleric:
case BARD: case Class::Bard:
case MONK: case Class::Monk:
return clrbrdmnk_softcaps[level]; return clrbrdmnk_softcaps[level];
case PALADIN: case Class::Paladin:
case SHADOWKNIGHT: case Class::ShadowKnight:
return palshd_softcaps[level]; return palshd_softcaps[level];
case RANGER: case Class::Ranger:
return rng_softcaps[level]; return rng_softcaps[level];
case DRUID: case Class::Druid:
return dru_softcaps[level]; return dru_softcaps[level];
case ROGUE: case Class::Rogue:
case SHAMAN: case Class::Shaman:
case BEASTLORD: case Class::Beastlord:
case BERSERKER: case Class::Berserker:
return rogshmbstber_softcaps[level]; return rogshmbstber_softcaps[level];
case NECROMANCER: case Class::Necromancer:
case WIZARD: case Class::Wizard:
case MAGICIAN: case Class::Magician:
case ENCHANTER: case Class::Enchanter:
return necwizmagenc_softcaps[level]; return necwizmagenc_softcaps[level];
default: default:
return 350; return 350;
@ -707,28 +707,28 @@ double Mob::GetSoftcapReturns()
// These are based on the dev post, they seem to be correct for every level // These are based on the dev post, they seem to be correct for every level
// AKA no more hard caps // AKA no more hard caps
switch (GetClass()) { switch (GetClass()) {
case WARRIOR: case Class::Warrior:
return 0.35; return 0.35;
case CLERIC: case Class::Cleric:
case BARD: case Class::Bard:
case MONK: case Class::Monk:
return 0.3; return 0.3;
case PALADIN: case Class::Paladin:
case SHADOWKNIGHT: case Class::ShadowKnight:
return 0.33; return 0.33;
case RANGER: case Class::Ranger:
return 0.315; return 0.315;
case DRUID: case Class::Druid:
return 0.265; return 0.265;
case ROGUE: case Class::Rogue:
case SHAMAN: case Class::Shaman:
case BEASTLORD: case Class::Beastlord:
case BERSERKER: case Class::Berserker:
return 0.28; return 0.28;
case NECROMANCER: case Class::Necromancer:
case WIZARD: case Class::Wizard:
case MAGICIAN: case Class::Magician:
case ENCHANTER: case Class::Enchanter:
return 0.25; return 0.25;
default: default:
return 0.3; return 0.3;
@ -739,7 +739,7 @@ int Mob::GetClassRaceACBonus()
{ {
int ac_bonus = 0; int ac_bonus = 0;
auto level = GetLevel(); auto level = GetLevel();
if (GetClass() == MONK) { if (GetClass() == Class::Monk) {
int hardcap = 30; int hardcap = 30;
int softcap = 14; int softcap = 14;
if (level > 99) { if (level > 99) {
@ -824,7 +824,7 @@ int Mob::GetClassRaceACBonus()
} }
} }
if (GetClass() == ROGUE) { if (GetClass() == Class::Rogue) {
int level_scaler = level - 26; int level_scaler = level - 26;
if (GetAGI() < 80) if (GetAGI() < 80)
ac_bonus = level_scaler / 4; ac_bonus = level_scaler / 4;
@ -840,7 +840,7 @@ int Mob::GetClassRaceACBonus()
ac_bonus = 12; ac_bonus = 12;
} }
if (GetClass() == BEASTLORD) { if (GetClass() == Class::Beastlord) {
int level_scaler = level - 6; int level_scaler = level - 6;
if (GetAGI() < 80) if (GetAGI() < 80)
ac_bonus = level_scaler / 5; ac_bonus = level_scaler / 5;
@ -894,14 +894,14 @@ int Mob::ACSum(bool skip_caps)
ac += GetPetACBonusFromOwner(); ac += GetPetACBonusFromOwner();
auto spell_aa_ac = aabonuses.AC + spellbonuses.AC; auto spell_aa_ac = aabonuses.AC + spellbonuses.AC;
ac += GetSkill(EQ::skills::SkillDefense) / 5; ac += GetSkill(EQ::skills::SkillDefense) / 5;
if (EQ::ValueWithin(static_cast<int>(GetClass()), NECROMANCER, ENCHANTER)) if (EQ::ValueWithin(static_cast<int>(GetClass()), Class::Necromancer, Class::Enchanter))
ac += spell_aa_ac / 3; ac += spell_aa_ac / 3;
else else
ac += spell_aa_ac / 4; ac += spell_aa_ac / 4;
} }
else { // TODO: so we can't set NPC skills ... so the skill bonus ends up being HUGE so lets nerf them a bit else { // TODO: so we can't set NPC skills ... so the skill bonus ends up being HUGE so lets nerf them a bit
auto spell_aa_ac = aabonuses.AC + spellbonuses.AC; auto spell_aa_ac = aabonuses.AC + spellbonuses.AC;
if (EQ::ValueWithin(static_cast<int>(GetClass()), NECROMANCER, ENCHANTER)) if (EQ::ValueWithin(static_cast<int>(GetClass()), Class::Necromancer, Class::Enchanter))
ac += GetSkill(EQ::skills::SkillDefense) / 2 + spell_aa_ac / 3; ac += GetSkill(EQ::skills::SkillDefense) / 2 + spell_aa_ac / 3;
else else
ac += GetSkill(EQ::skills::SkillDefense) / 3 + spell_aa_ac / 4; ac += GetSkill(EQ::skills::SkillDefense) / 3 + spell_aa_ac / 4;
@ -1085,7 +1085,7 @@ int64 Mob::GetWeaponDamage(Mob *against, const EQ::ItemData *weapon_item) {
return 0; return 0;
} }
} }
else if ((GetClass() == MONK || GetClass() == BEASTLORD) && GetLevel() >= 30) { else if ((GetClass() == Class::Monk || GetClass() == Class::Beastlord) && GetLevel() >= 30) {
dmg = GetHandToHandDamage(); dmg = GetHandToHandDamage();
} }
else { else {
@ -1199,7 +1199,7 @@ int64 Mob::GetWeaponDamage(Mob *against, const EQ::ItemInstance *weapon_item, in
MagicGloves = gloves->GetItemMagical(true); MagicGloves = gloves->GetItemMagical(true);
} }
if (GetClass() == MONK || GetClass() == BEASTLORD) { if (GetClass() == Class::Monk || GetClass() == Class::Beastlord) {
if (MagicGloves || GetLevel() >= 30) { if (MagicGloves || GetLevel() >= 30) {
dmg = GetHandToHandDamage(); dmg = GetHandToHandDamage();
if (hate) if (hate)
@ -1295,15 +1295,15 @@ int64 Mob::DoDamageCaps(int64 base_damage)
} }
else if (level >= 40) { else if (level >= 40) {
switch (GetClass()) { switch (GetClass()) {
case CLERIC: case Class::Cleric:
case DRUID: case Class::Druid:
case SHAMAN: case Class::Shaman:
cap = 80; cap = 80;
break; break;
case NECROMANCER: case Class::Necromancer:
case WIZARD: case Class::Wizard:
case MAGICIAN: case Class::Magician:
case ENCHANTER: case Class::Enchanter:
cap = 40; cap = 40;
break; break;
default: default:
@ -1313,15 +1313,15 @@ int64 Mob::DoDamageCaps(int64 base_damage)
} }
else if (level >= 30) { else if (level >= 30) {
switch (GetClass()) { switch (GetClass()) {
case CLERIC: case Class::Cleric:
case DRUID: case Class::Druid:
case SHAMAN: case Class::Shaman:
cap = 26; cap = 26;
break; break;
case NECROMANCER: case Class::Necromancer:
case WIZARD: case Class::Wizard:
case MAGICIAN: case Class::Magician:
case ENCHANTER: case Class::Enchanter:
cap = 18; cap = 18;
break; break;
default: default:
@ -1331,15 +1331,15 @@ int64 Mob::DoDamageCaps(int64 base_damage)
} }
else if (level >= 20) { else if (level >= 20) {
switch (GetClass()) { switch (GetClass()) {
case CLERIC: case Class::Cleric:
case DRUID: case Class::Druid:
case SHAMAN: case Class::Shaman:
cap = 20; cap = 20;
break; break;
case NECROMANCER: case Class::Necromancer:
case WIZARD: case Class::Wizard:
case MAGICIAN: case Class::Magician:
case ENCHANTER: case Class::Enchanter:
cap = 12; cap = 12;
break; break;
default: default:
@ -1349,15 +1349,15 @@ int64 Mob::DoDamageCaps(int64 base_damage)
} }
else if (level >= 10) { else if (level >= 10) {
switch (GetClass()) { switch (GetClass()) {
case CLERIC: case Class::Cleric:
case DRUID: case Class::Druid:
case SHAMAN: case Class::Shaman:
cap = 12; cap = 12;
break; break;
case NECROMANCER: case Class::Necromancer:
case WIZARD: case Class::Wizard:
case MAGICIAN: case Class::Magician:
case ENCHANTER: case Class::Enchanter:
cap = 10; cap = 10;
break; break;
default: default:
@ -1367,15 +1367,15 @@ int64 Mob::DoDamageCaps(int64 base_damage)
} }
else { else {
switch (GetClass()) { switch (GetClass()) {
case CLERIC: case Class::Cleric:
case DRUID: case Class::Druid:
case SHAMAN: case Class::Shaman:
cap = 9; cap = 9;
break; break;
case NECROMANCER: case Class::Necromancer:
case WIZARD: case Class::Wizard:
case MAGICIAN: case Class::Magician:
case ENCHANTER: case Class::Enchanter:
cap = 6; cap = 6;
break; break;
default: default:
@ -1476,7 +1476,7 @@ bool Mob::Attack(Mob* other, int Hand, bool bRiposte, bool IsStrikethrough, bool
LogCombatDetail("Attacking [{}] with hand [{}] [{}]", other->GetName(), Hand, bRiposte ? "this is a riposte" : ""); LogCombatDetail("Attacking [{}] with hand [{}] [{}]", other->GetName(), Hand, bRiposte ? "this is a riposte" : "");
if ( if (
(IsCasting() && GetClass() != BARD && !IsFromSpell) (IsCasting() && GetClass() != Class::Bard && !IsFromSpell)
|| ((IsClient() && CastToClient()->dead) || (other->IsClient() && other->CastToClient()->dead)) || ((IsClient() && CastToClient()->dead) || (other->IsClient() && other->CastToClient()->dead))
|| (GetHP() < 0) || (GetHP() < 0)
|| (!IsAttackAllowed(other)) || (!IsAttackAllowed(other))
@ -2019,7 +2019,7 @@ bool Client::Death(Mob* killerMob, int64 damage, uint16 spell, EQ::skills::Skill
/* /*
Reset reuse timer for classic skill based Lay on Hands (For tit I guess) Reset reuse timer for classic skill based Lay on Hands (For tit I guess)
*/ */
if (GetClass() == PALADIN) { // we could check if it's not expired I guess, but should be fine not to if (GetClass() == Class::Paladin) { // we could check if it's not expired I guess, but should be fine not to
p_timers.Clear(&database, pTimerLayHands); p_timers.Clear(&database, pTimerLayHands);
} }
@ -2343,7 +2343,7 @@ void NPC::Damage(Mob* other, int64 damage, uint16 spell_id, EQ::skills::SkillTyp
if (!IsEngaged()) if (!IsEngaged())
zone->AddAggroMob(); zone->AddAggroMob();
if (GetClass() == LDON_TREASURE) if (GetClass() == Class::LDoNTreasure)
{ {
if (IsLDoNLocked() && GetLDoNLockedSkill() != LDoNTypeMechanical) if (IsLDoNLocked() && GetLDoNLockedSkill() != LDoNTypeMechanical)
{ {
@ -2461,7 +2461,7 @@ bool NPC::Death(Mob* killer_mob, int64 damage, uint16 spell, EQ::skills::SkillTy
BuffFadeAll(); BuffFadeAll();
const auto killed_level = GetLevel(); const auto killed_level = GetLevel();
if (GetClass() == LDON_TREASURE) { // open chest if (GetClass() == Class::LDoNTreasure) { // open chest
auto outapp = new EQApplicationPacket(OP_Animation, sizeof(Animation_Struct)); auto outapp = new EQApplicationPacket(OP_Animation, sizeof(Animation_Struct));
Animation_Struct* anim = (Animation_Struct*)outapp->pBuffer; Animation_Struct* anim = (Animation_Struct*)outapp->pBuffer;
anim->spawnid = GetID(); anim->spawnid = GetID();
@ -2488,7 +2488,7 @@ bool NPC::Death(Mob* killer_mob, int64 damage, uint16 spell, EQ::skills::SkillTy
respawn2->DeathReset(1); respawn2->DeathReset(1);
} }
if (killer_mob && GetClass() != LDON_TREASURE) { if (killer_mob && GetClass() != Class::LDoNTreasure) {
hate_list.AddEntToHateList(killer_mob, damage); hate_list.AddEntToHateList(killer_mob, damage);
} }
@ -2535,7 +2535,7 @@ bool NPC::Death(Mob* killer_mob, int64 damage, uint16 spell, EQ::skills::SkillTy
hate_list.DoFactionHits(GetNPCFactionID(), GetPrimaryFaction(), GetFactionAmount()); hate_list.DoFactionHits(GetNPCFactionID(), GetPrimaryFaction(), GetFactionAmount());
} }
bool IsLdonTreasure = (GetClass() == LDON_TREASURE); bool IsLdonTreasure = (GetClass() == Class::LDoNTreasure);
if (give_exp_client && !IsCorpse()) { if (give_exp_client && !IsCorpse()) {
Group *kg = entity_list.GetGroupByClient(give_exp_client); Group *kg = entity_list.GetGroupByClient(give_exp_client);
@ -2701,7 +2701,7 @@ bool NPC::Death(Mob* killer_mob, int64 damage, uint16 spell, EQ::skills::SkillTy
} }
bool allow_merchant_corpse = RuleB(Merchant, AllowCorpse); bool allow_merchant_corpse = RuleB(Merchant, AllowCorpse);
bool is_merchant = (class_ == MERCHANT || class_ == ADVENTURE_MERCHANT || MerchantType != 0); bool is_merchant = (class_ == Class::Merchant || class_ == Class::AdventureMerchant || MerchantType != 0);
Corpse* corpse = nullptr; Corpse* corpse = nullptr;
@ -3295,14 +3295,14 @@ int Mob::GetHandToHandDamage(void)
7, 7, 7, 8, 8, 8, 8, 8, 8, 9, // 21-30 7, 7, 7, 8, 8, 8, 8, 8, 8, 9, // 21-30
9, 9, 9, 9, 9, 10, 10, 10, 10, 10, // 31-40 9, 9, 9, 9, 9, 10, 10, 10, 10, 10, // 31-40
10, 11, 11, 11, 11, 11, 11, 12, 12 }; // 41-49 10, 11, 11, 11, 11, 11, 11, 12, 12 }; // 41-49
if (GetClass() == MONK) { if (GetClass() == Class::Monk) {
if (IsClient() && CastToClient()->GetItemIDAt(12) == 10652 && GetLevel() > 50) if (IsClient() && CastToClient()->GetItemIDAt(12) == 10652 && GetLevel() > 50)
return 9; return 9;
if (level > 62) if (level > 62)
return 15; return 15;
return mnk_dmg[level]; return mnk_dmg[level];
} }
else if (GetClass() == BEASTLORD) { else if (GetClass() == Class::Beastlord) {
if (level > 49) if (level > 49)
return 13; return 13;
return bst_dmg[level]; return bst_dmg[level];
@ -3354,7 +3354,7 @@ int Mob::GetHandToHandDelay(void)
28, 28, 28, 27, 27, 27, 27, 27, 26, 26, // 61-70 28, 28, 28, 27, 27, 27, 27, 27, 26, 26, // 61-70
26, 26, 26 }; // 71-73 26, 26, 26 }; // 71-73
if (GetClass() == MONK) { if (GetClass() == Class::Monk) {
// Have a look to see if we have epic fists on // Have a look to see if we have epic fists on
if (IsClient() && CastToClient()->GetItemIDAt(12) == 10652 && GetLevel() > 50) if (IsClient() && CastToClient()->GetItemIDAt(12) == 10652 && GetLevel() > 50)
return 16; return 16;
@ -3363,7 +3363,7 @@ int Mob::GetHandToHandDelay(void)
return GetRace() == IKSAR ? 21 : 20; return GetRace() == IKSAR ? 21 : 20;
return GetRace() == IKSAR ? mnk_iks_delay[level] : mnk_hum_delay[level]; return GetRace() == IKSAR ? mnk_iks_delay[level] : mnk_hum_delay[level];
} }
else if (GetClass() == BEASTLORD) { else if (GetClass() == Class::Beastlord) {
int level = GetLevel(); int level = GetLevel();
if (level > 73) if (level > 73)
return 25; return 25;
@ -4067,7 +4067,7 @@ void Mob::CommonDamage(Mob* attacker, int64 &damage, const uint16 spell_id, cons
} }
} }
else if (skill_used == EQ::skills::SkillKick && else if (skill_used == EQ::skills::SkillKick &&
(attacker->GetLevel() > 55 || attacker->IsNPC()) && GetClass() == WARRIOR) { (attacker->GetLevel() > 55 || attacker->IsNPC()) && GetClass() == Class::Warrior) {
can_stun = true; can_stun = true;
} }
@ -5053,11 +5053,11 @@ void Mob::TryCriticalHit(Mob *defender, DamageHitInfo &hit, ExtraAttackOptions *
// We either require an innate crit chance or some SPA 169 to crit // We either require an innate crit chance or some SPA 169 to crit
bool innate_crit = false; bool innate_crit = false;
int crit_chance = GetCriticalChanceBonus(hit.skill); int crit_chance = GetCriticalChanceBonus(hit.skill);
if ((GetClass() == WARRIOR || GetClass() == BERSERKER) && GetLevel() >= 12) if ((GetClass() == Class::Warrior || GetClass() == Class::Berserker) && GetLevel() >= 12)
innate_crit = true; innate_crit = true;
else if (GetClass() == RANGER && GetLevel() >= 12 && hit.skill == EQ::skills::SkillArchery) else if (GetClass() == Class::Ranger && GetLevel() >= 12 && hit.skill == EQ::skills::SkillArchery)
innate_crit = true; innate_crit = true;
else if (GetClass() == ROGUE && GetLevel() >= 12 && hit.skill == EQ::skills::SkillThrowing) else if (GetClass() == Class::Rogue && GetLevel() >= 12 && hit.skill == EQ::skills::SkillThrowing)
innate_crit = true; innate_crit = true;
// we have a chance to crit! // we have a chance to crit!
@ -5077,7 +5077,7 @@ void Mob::TryCriticalHit(Mob *defender, DamageHitInfo &hit, ExtraAttackOptions *
dex_bonus += 45; // chances did not match live without a small boost dex_bonus += 45; // chances did not match live without a small boost
// so if we have an innate crit we have a better chance, except for ber throwing // so if we have an innate crit we have a better chance, except for ber throwing
if (!innate_crit || (GetClass() == BERSERKER && hit.skill == EQ::skills::SkillThrowing)) if (!innate_crit || (GetClass() == Class::Berserker && hit.skill == EQ::skills::SkillThrowing))
dex_bonus = dex_bonus * 3 / 5; dex_bonus = dex_bonus * 3 / 5;
if (crit_chance) if (crit_chance)
@ -5101,7 +5101,7 @@ void Mob::TryCriticalHit(Mob *defender, DamageHitInfo &hit, ExtraAttackOptions *
LogCombat("Crit success roll [{}] dex chance [{}] og dmg [{}] crit_mod [{}] new dmg [{}]", roll, dex_bonus, og_damage, crit_mod, hit.damage_done); LogCombat("Crit success roll [{}] dex chance [{}] og dmg [{}] crit_mod [{}] new dmg [{}]", roll, dex_bonus, og_damage, crit_mod, hit.damage_done);
// step 3: check deadly strike // step 3: check deadly strike
if (GetClass() == ROGUE && hit.skill == EQ::skills::SkillThrowing) { if (GetClass() == Class::Rogue && hit.skill == EQ::skills::SkillThrowing) {
if (BehindMob(defender, GetX(), GetY())) { if (BehindMob(defender, GetX(), GetY())) {
int chance = GetLevel() * 12; int chance = GetLevel() * 12;
if (zone->random.Int(1, 1000) < chance) { if (zone->random.Int(1, 1000) < chance) {
@ -5284,7 +5284,7 @@ void Mob::DoRiposte(Mob *defender)
if (DoubleRipChance && zone->random.Roll(DoubleRipChance)) { if (DoubleRipChance && zone->random.Roll(DoubleRipChance)) {
LogCombat("Preforming a return SPECIAL ATTACK ([{}] percent chance)", DoubleRipChance); LogCombat("Preforming a return SPECIAL ATTACK ([{}] percent chance)", DoubleRipChance);
if (defender->GetClass() == MONK) if (defender->GetClass() == Class::Monk)
defender->MonkSpecialAttack(this, defender->aabonuses.GiveDoubleRiposte[SBIndex::DOUBLE_RIPOSTE_SKILL]); defender->MonkSpecialAttack(this, defender->aabonuses.GiveDoubleRiposte[SBIndex::DOUBLE_RIPOSTE_SKILL]);
else if (defender->IsClient()) // so yeah, even if you don't have the skill you can still do the attack :P (and we don't crash anymore) else if (defender->IsClient()) // so yeah, even if you don't have the skill you can still do the attack :P (and we don't crash anymore)
defender->CastToClient()->DoClassAttacks(this, defender->aabonuses.GiveDoubleRiposte[SBIndex::DOUBLE_RIPOSTE_SKILL], true); defender->CastToClient()->DoClassAttacks(this, defender->aabonuses.GiveDoubleRiposte[SBIndex::DOUBLE_RIPOSTE_SKILL], true);
@ -5301,7 +5301,7 @@ void Mob::ApplyMeleeDamageMods(uint16 skill, int64 &damage, Mob *defender, Extra
dmgbonusmod += opts->melee_damage_bonus_flat; dmgbonusmod += opts->melee_damage_bonus_flat;
if (defender) { if (defender) {
if (defender->IsOfClientBotMerc() && defender->GetClass() == WARRIOR) { if (defender->IsOfClientBotMerc() && defender->GetClass() == Class::Warrior) {
dmgbonusmod -= 5; dmgbonusmod -= 5;
} }
// 168 defensive // 168 defensive
@ -5445,7 +5445,7 @@ const DamageTable &Mob::GetDamageTable() const
{ 415, 15, 40 }, // 105 { 415, 15, 40 }, // 105
}; };
bool monk = GetClass() == MONK; bool monk = GetClass() == Class::Monk;
bool melee = IsWarriorClass(); bool melee = IsWarriorClass();
// tables caped at 105 for now -- future proofed for a while at least :P // tables caped at 105 for now -- future proofed for a while at least :P
int level = std::min(static_cast<int>(GetLevel()), 105); int level = std::min(static_cast<int>(GetLevel()), 105);
@ -5893,7 +5893,7 @@ void Mob::CommonOutgoingHitSuccess(Mob* defender, DamageHitInfo &hit, ExtraAttac
// BER weren't parsing the halving // BER weren't parsing the halving
if (hit.skill == EQ::skills::SkillArchery || if (hit.skill == EQ::skills::SkillArchery ||
(hit.skill == EQ::skills::SkillThrowing && GetClass() != BERSERKER)) (hit.skill == EQ::skills::SkillThrowing && GetClass() != Class::Berserker))
hit.damage_done /= 2; hit.damage_done /= 2;
if (hit.damage_done < 1) if (hit.damage_done < 1)
@ -5906,7 +5906,7 @@ void Mob::CommonOutgoingHitSuccess(Mob* defender, DamageHitInfo &hit, ExtraAttac
if (headshot > 0) { if (headshot > 0) {
hit.damage_done = headshot; hit.damage_done = headshot;
} }
else if (GetClass() == RANGER && GetLevel() > 50) { // no double dmg on headshot else if (GetClass() == Class::Ranger && GetLevel() > 50) { // no double dmg on headshot
if ((defender->IsNPC() && !defender->IsMoving() && !defender->IsRooted()) || !RuleB(Combat, ArcheryBonusRequiresStationary)) { if ((defender->IsNPC() && !defender->IsMoving() && !defender->IsRooted()) || !RuleB(Combat, ArcheryBonusRequiresStationary)) {
hit.damage_done *= 2; hit.damage_done *= 2;
MessageString(Chat::MeleeCrit, BOW_DOUBLE_DAMAGE); MessageString(Chat::MeleeCrit, BOW_DOUBLE_DAMAGE);
@ -5931,7 +5931,7 @@ void Mob::CommonOutgoingHitSuccess(Mob* defender, DamageHitInfo &hit, ExtraAttac
hit.damage_done = ass; hit.damage_done = ass;
} }
} }
else if (hit.skill == EQ::skills::SkillFrenzy && GetClass() == BERSERKER && GetLevel() > 50) { else if (hit.skill == EQ::skills::SkillFrenzy && GetClass() == Class::Berserker && GetLevel() > 50) {
extra_mincap = 4 * GetLevel() / 5; extra_mincap = 4 * GetLevel() / 5;
} }

View File

@ -117,7 +117,7 @@ void Client::CalcBonuses()
// hmm maybe a better way to do this // hmm maybe a better way to do this
int metabolism = spellbonuses.Metabolism + itembonuses.Metabolism + aabonuses.Metabolism; int metabolism = spellbonuses.Metabolism + itembonuses.Metabolism + aabonuses.Metabolism;
int timer = GetClass() == MONK ? CONSUMPTION_MNK_TIMER : CONSUMPTION_TIMER; int timer = GetClass() == Class::Monk ? CONSUMPTION_MNK_TIMER : CONSUMPTION_TIMER;
timer = timer * (100 + metabolism) / 100; timer = timer * (100 + metabolism) / 100;
if (timer != consume_food_timer.GetTimerTime()) if (timer != consume_food_timer.GetTimerTime())
consume_food_timer.SetTimer(timer); consume_food_timer.SetTimer(timer);
@ -2053,7 +2053,7 @@ void Mob::CalcSpellBonuses(StatBonuses* newbon)
} }
} }
if (GetClass() == BARD) if (GetClass() == Class::Bard)
newbon->ManaRegen = 0; // Bards do not get mana regen from spells. newbon->ManaRegen = 0; // Bards do not get mana regen from spells.
} }

View File

@ -78,10 +78,10 @@ Bot::Bot(NPCType *npcTypeData, Client* botOwner) : NPC(npcTypeData, nullptr, glm
SetBotCharmer(false); SetBotCharmer(false);
SetPetChooser(false); SetPetChooser(false);
SetRangerAutoWeaponSelect(false); SetRangerAutoWeaponSelect(false);
SetTaunting(GetClass() == WARRIOR || GetClass() == PALADIN || GetClass() == SHADOWKNIGHT); SetTaunting(GetClass() == Class::Warrior || GetClass() == Class::Paladin || GetClass() == Class::ShadowKnight);
SetDefaultBotStance(); SetDefaultBotStance();
SetAltOutOfCombatBehavior(GetClass() == BARD); // will need to be updated if more classes make use of this flag SetAltOutOfCombatBehavior(GetClass() == Class::Bard); // will need to be updated if more classes make use of this flag
SetShowHelm(true); SetShowHelm(true);
SetPauseAI(false); SetPauseAI(false);
@ -201,7 +201,7 @@ Bot::Bot(
); );
} }
SetTaunting((GetClass() == WARRIOR || GetClass() == PALADIN || GetClass() == SHADOWKNIGHT) && (GetBotStance() == EQ::constants::stanceAggressive)); SetTaunting((GetClass() == Class::Warrior || GetClass() == Class::Paladin || GetClass() == Class::ShadowKnight) && (GetBotStance() == EQ::constants::stanceAggressive));
SetPauseAI(false); SetPauseAI(false);
m_alt_combat_hate_timer.Start(250); m_alt_combat_hate_timer.Start(250);
@ -241,7 +241,7 @@ Bot::Bot(
for (int i = 0; i < MaxTimer; i++) for (int i = 0; i < MaxTimer; i++)
timers[i] = 0; timers[i] = 0;
if (GetClass() == ROGUE) { if (GetClass() == Class::Rogue) {
m_evade_timer.Start(); m_evade_timer.Start();
} }
@ -561,7 +561,7 @@ uint32 Bot::GetBotArcheryRange() {
} }
void Bot::ChangeBotArcherWeapons(bool isArcher) { void Bot::ChangeBotArcherWeapons(bool isArcher) {
if ((GetClass()==WARRIOR) || (GetClass()==PALADIN) || (GetClass()==RANGER) || (GetClass()==SHADOWKNIGHT) || (GetClass()==ROGUE)) { if ((GetClass()==Class::Warrior) || (GetClass()==Class::Paladin) || (GetClass()==Class::Ranger) || (GetClass()==Class::ShadowKnight) || (GetClass()==Class::Rogue)) {
if (!isArcher) { if (!isArcher) {
BotAddEquipItem(EQ::invslot::slotPrimary, GetBotItemBySlot(EQ::invslot::slotPrimary)); BotAddEquipItem(EQ::invslot::slotPrimary, GetBotItemBySlot(EQ::invslot::slotPrimary));
BotAddEquipItem(EQ::invslot::slotSecondary, GetBotItemBySlot(EQ::invslot::slotSecondary)); BotAddEquipItem(EQ::invslot::slotSecondary, GetBotItemBySlot(EQ::invslot::slotSecondary));
@ -769,7 +769,7 @@ void Bot::GenerateBaseStats()
// pulling fixed values from an auto-increment field is dangerous... // pulling fixed values from an auto-increment field is dangerous...
switch (GetClass()) { switch (GetClass()) {
case WARRIOR: case Class::Warrior:
BotSpellID = 3001; BotSpellID = 3001;
Strength += 10; Strength += 10;
Stamina += 20; Stamina += 20;
@ -777,7 +777,7 @@ void Bot::GenerateBaseStats()
Dexterity += 10; Dexterity += 10;
Attack += 12; Attack += 12;
break; break;
case CLERIC: case Class::Cleric:
BotSpellID = 3002; BotSpellID = 3002;
Strength += 5; Strength += 5;
Stamina += 5; Stamina += 5;
@ -785,7 +785,7 @@ void Bot::GenerateBaseStats()
Wisdom += 30; Wisdom += 30;
Attack += 8; Attack += 8;
break; break;
case PALADIN: case Class::Paladin:
BotSpellID = 3003; BotSpellID = 3003;
Strength += 15; Strength += 15;
Stamina += 5; Stamina += 5;
@ -794,7 +794,7 @@ void Bot::GenerateBaseStats()
Dexterity += 5; Dexterity += 5;
Attack += 17; Attack += 17;
break; break;
case RANGER: case Class::Ranger:
BotSpellID = 3004; BotSpellID = 3004;
Strength += 15; Strength += 15;
Stamina += 10; Stamina += 10;
@ -802,7 +802,7 @@ void Bot::GenerateBaseStats()
Wisdom += 15; Wisdom += 15;
Attack += 17; Attack += 17;
break; break;
case SHADOWKNIGHT: case Class::ShadowKnight:
BotSpellID = 3005; BotSpellID = 3005;
Strength += 10; Strength += 10;
Stamina += 15; Stamina += 15;
@ -810,13 +810,13 @@ void Bot::GenerateBaseStats()
Charisma += 5; Charisma += 5;
Attack += 17; Attack += 17;
break; break;
case DRUID: case Class::Druid:
BotSpellID = 3006; BotSpellID = 3006;
Stamina += 15; Stamina += 15;
Wisdom += 35; Wisdom += 35;
Attack += 5; Attack += 5;
break; break;
case MONK: case Class::Monk:
BotSpellID = 3007; BotSpellID = 3007;
Strength += 5; Strength += 5;
Stamina += 15; Stamina += 15;
@ -824,7 +824,7 @@ void Bot::GenerateBaseStats()
Dexterity += 15; Dexterity += 15;
Attack += 17; Attack += 17;
break; break;
case BARD: case Class::Bard:
BotSpellID = 3008; BotSpellID = 3008;
Strength += 15; Strength += 15;
Dexterity += 10; Dexterity += 10;
@ -832,7 +832,7 @@ void Bot::GenerateBaseStats()
Intelligence += 10; Intelligence += 10;
Attack += 17; Attack += 17;
break; break;
case ROGUE: case Class::Rogue:
BotSpellID = 3009; BotSpellID = 3009;
Strength += 10; Strength += 10;
Stamina += 20; Stamina += 20;
@ -840,39 +840,39 @@ void Bot::GenerateBaseStats()
Dexterity += 10; Dexterity += 10;
Attack += 12; Attack += 12;
break; break;
case SHAMAN: case Class::Shaman:
BotSpellID = 3010; BotSpellID = 3010;
Stamina += 10; Stamina += 10;
Wisdom += 30; Wisdom += 30;
Charisma += 10; Charisma += 10;
Attack += 28; Attack += 28;
break; break;
case NECROMANCER: case Class::Necromancer:
BotSpellID = 3011; BotSpellID = 3011;
Dexterity += 10; Dexterity += 10;
Agility += 10; Agility += 10;
Intelligence += 30; Intelligence += 30;
Attack += 5; Attack += 5;
break; break;
case WIZARD: case Class::Wizard:
BotSpellID = 3012; BotSpellID = 3012;
Stamina += 20; Stamina += 20;
Intelligence += 30; Intelligence += 30;
Attack += 5; Attack += 5;
break; break;
case MAGICIAN: case Class::Magician:
BotSpellID = 3013; BotSpellID = 3013;
Stamina += 20; Stamina += 20;
Intelligence += 30; Intelligence += 30;
Attack += 5; Attack += 5;
break; break;
case ENCHANTER: case Class::Enchanter:
BotSpellID = 3014; BotSpellID = 3014;
Intelligence += 25; Intelligence += 25;
Charisma += 25; Charisma += 25;
Attack += 5; Attack += 5;
break; break;
case BEASTLORD: case Class::Beastlord:
BotSpellID = 3015; BotSpellID = 3015;
Stamina += 10; Stamina += 10;
Agility += 10; Agility += 10;
@ -881,7 +881,7 @@ void Bot::GenerateBaseStats()
Charisma += 5; Charisma += 5;
Attack += 31; Attack += 31;
break; break;
case BERSERKER: case Class::Berserker:
BotSpellID = 3016; BotSpellID = 3016;
Strength += 10; Strength += 10;
Stamina += 15; Stamina += 15;
@ -1497,7 +1497,7 @@ bool Bot::LoadPet()
if (!bot_owner) if (!bot_owner)
return false; return false;
if (GetClass() == WIZARD) { if (GetClass() == Class::Wizard) {
auto buffs_max = GetMaxBuffSlots(); auto buffs_max = GetMaxBuffSlots();
auto my_buffs = GetBuffs(); auto my_buffs = GetBuffs();
if (buffs_max && my_buffs) { if (buffs_max && my_buffs) {
@ -1799,7 +1799,7 @@ void Bot::AI_Bot_Init()
void Bot::SpellProcess() { void Bot::SpellProcess() {
if (spellend_timer.Check(false)) { if (spellend_timer.Check(false)) {
NPC::SpellProcess(); NPC::SpellProcess();
if (GetClass() == BARD && casting_spell_id != 0) casting_spell_id = 0; if (GetClass() == Class::Bard && casting_spell_id != 0) casting_spell_id = 0;
} }
} }
@ -1891,7 +1891,7 @@ bool Bot::CheckBotDoubleAttack(bool tripleAttack) {
//Check for bonuses that give you a double attack chance regardless of skill (ie Bestial Frenzy/Harmonious Attack AA) //Check for bonuses that give you a double attack chance regardless of skill (ie Bestial Frenzy/Harmonious Attack AA)
uint32 bonusGiveDA = (aabonuses.GiveDoubleAttack + spellbonuses.GiveDoubleAttack + itembonuses.GiveDoubleAttack); uint32 bonusGiveDA = (aabonuses.GiveDoubleAttack + spellbonuses.GiveDoubleAttack + itembonuses.GiveDoubleAttack);
// If you don't have the double attack skill, return // If you don't have the double attack skill, return
if (!GetSkill(EQ::skills::SkillDoubleAttack) && !(GetClass() == BARD || GetClass() == BEASTLORD)) if (!GetSkill(EQ::skills::SkillDoubleAttack) && !(GetClass() == Class::Bard || GetClass() == Class::Beastlord))
return false; return false;
// You start with no chance of double attacking // You start with no chance of double attacking
@ -1941,7 +1941,7 @@ void Bot::SetGuardMode() {
m_GuardPoint = GetPosition(); m_GuardPoint = GetPosition();
SetGuardFlag(); SetGuardFlag();
if (HasPet() && (GetClass() != ENCHANTER || GetPet()->GetPetType() != petAnimation || GetAA(aaAnimationEmpathy) >= 2)) { if (HasPet() && (GetClass() != Class::Enchanter || GetPet()->GetPetType() != petAnimation || GetAA(aaAnimationEmpathy) >= 2)) {
GetPet()->StopMoving(); GetPet()->StopMoving();
} }
} }
@ -1953,7 +1953,7 @@ void Bot::SetHoldMode() {
// AI Processing for the Bot object // AI Processing for the Bot object
constexpr float MAX_CASTER_DISTANCE[PLAYER_CLASS_COUNT] = { constexpr float MAX_CASTER_DISTANCE[Class::PLAYER_CLASS_COUNT] = {
0, 0,
(34 * 34), (34 * 34),
(24 * 24), (24 * 24),
@ -2111,7 +2111,7 @@ void Bot::AI_Process()
} }
// This causes conflicts with default pet handler (bounces between targets) // This causes conflicts with default pet handler (bounces between targets)
if (NOT_PULLING_BOT && HasPet() && (GetClass() != ENCHANTER || GetPet()->GetPetType() != petAnimation || GetAA(aaAnimationEmpathy) >= 2)) { if (NOT_PULLING_BOT && HasPet() && (GetClass() != Class::Enchanter || GetPet()->GetPetType() != petAnimation || GetAA(aaAnimationEmpathy) >= 2)) {
// We don't add to hate list here because it's assumed to already be on the list // We don't add to hate list here because it's assumed to already be on the list
GetPet()->SetTarget(tar); GetPet()->SetTarget(tar);
@ -2156,7 +2156,7 @@ void Bot::AI_Process()
return; return;
} }
if (AI_movement_timer->Check() && (!spellend_timer.Enabled() || GetClass() == BARD)) { if (AI_movement_timer->Check() && (!spellend_timer.Enabled() || GetClass() == Class::Bard)) {
if (TryEvade(tar)) { if (TryEvade(tar)) {
return; return;
@ -2228,7 +2228,7 @@ void Bot::AI_Process()
SetTarget(nullptr); SetTarget(nullptr);
if (HasPet() && (GetClass() != ENCHANTER || GetPet()->GetPetType() != petAnimation || GetAA(aaAnimationEmpathy) >= 1)) { if (HasPet() && (GetClass() != Class::Enchanter || GetPet()->GetPetType() != petAnimation || GetAA(aaAnimationEmpathy) >= 1)) {
GetPet()->WipeHateList(); GetPet()->WipeHateList();
GetPet()->SetTarget(nullptr); GetPet()->SetTarget(nullptr);
@ -2255,7 +2255,7 @@ void Bot::AI_Process()
bool Bot::TryBardMovementCasts() {// Basically, bard bots get a chance to cast idle spells while moving bool Bot::TryBardMovementCasts() {// Basically, bard bots get a chance to cast idle spells while moving
if (GetClass() == BARD && IsMoving() && NOT_PASSIVE && !spellend_timer.Enabled() && AI_think_timer->Check()) { if (GetClass() == Class::Bard && IsMoving() && NOT_PASSIVE && !spellend_timer.Enabled() && AI_think_timer->Check()) {
AI_IdleCastCheck(); AI_IdleCastCheck();
return true; return true;
@ -2265,7 +2265,7 @@ bool Bot::TryBardMovementCasts() {// Basically, bard bots get a chance to cast i
bool Bot::TryNonCombatMovementChecks(Client* bot_owner, const Mob* follow_mob, glm::vec3& Goal) {// Non-engaged movement checks bool Bot::TryNonCombatMovementChecks(Client* bot_owner, const Mob* follow_mob, glm::vec3& Goal) {// Non-engaged movement checks
if (AI_movement_timer->Check() && (!IsCasting() || GetClass() == BARD)) { if (AI_movement_timer->Check() && (!IsCasting() || GetClass() == Class::Bard)) {
if (GUARDING) { if (GUARDING) {
Goal = GetGuardPoint(); Goal = GetGuardPoint();
} }
@ -2311,12 +2311,12 @@ bool Bot::TryIdleChecks(float fm_distance) {
if (NOT_PASSIVE) { if (NOT_PASSIVE) {
if (!AI_IdleCastCheck() && !IsCasting() && GetClass() != BARD) { if (!AI_IdleCastCheck() && !IsCasting() && GetClass() != Class::Bard) {
BotMeditate(true); BotMeditate(true);
} }
} else { } else {
if (GetClass() != BARD) { if (GetClass() != Class::Bard) {
BotMeditate(true); BotMeditate(true);
} }
@ -2363,7 +2363,7 @@ bool Bot::TryAutoDefend(Client* bot_owner, float leash_distance) {
SetTarget(hater); SetTarget(hater);
SetAttackingFlag(); SetAttackingFlag();
if (HasPet() && (GetClass() != ENCHANTER || GetPet()->GetPetType() != petAnimation || GetAA(aaAnimationEmpathy) >= 2)) { if (HasPet() && (GetClass() != Class::Enchanter || GetPet()->GetPetType() != petAnimation || GetAA(aaAnimationEmpathy) >= 2)) {
GetPet()->AddToHateList(hater, 1); GetPet()->AddToHateList(hater, 1);
GetPet()->SetTarget(hater); GetPet()->SetTarget(hater);
} }
@ -2399,7 +2399,7 @@ bool Bot::TryMeditate() {
// This code actually gets processed when we are too far away from target and have not engaged yet // This code actually gets processed when we are too far away from target and have not engaged yet
bool Bot::TryPursueTarget(float leash_distance, glm::vec3& Goal) { bool Bot::TryPursueTarget(float leash_distance, glm::vec3& Goal) {
if (AI_movement_timer->Check() && (!spellend_timer.Enabled() || GetClass() == BARD)) { if (AI_movement_timer->Check() && (!spellend_timer.Enabled() || GetClass() == Class::Bard)) {
if (GetTarget() && !IsRooted()) { if (GetTarget() && !IsRooted()) {
LogAIDetail("Pursuing [{}] while engaged", GetTarget()->GetCleanName()); LogAIDetail("Pursuing [{}] while engaged", GetTarget()->GetCleanName());
Goal = GetTarget()->GetPosition(); Goal = GetTarget()->GetPosition();
@ -2410,7 +2410,7 @@ bool Bot::TryPursueTarget(float leash_distance, glm::vec3& Goal) {
WipeHateList(); WipeHateList();
SetTarget(nullptr); SetTarget(nullptr);
if (HasPet() && (GetClass() != ENCHANTER || GetPet()->GetPetType() != petAnimation || GetAA(aaAnimationEmpathy) >= 2)) { if (HasPet() && (GetClass() != Class::Enchanter || GetPet()->GetPetType() != petAnimation || GetAA(aaAnimationEmpathy) >= 2)) {
GetPet()->WipeHateList(); GetPet()->WipeHateList();
GetPet()->SetTarget(nullptr); GetPet()->SetTarget(nullptr);
} }
@ -2446,7 +2446,7 @@ bool Bot::TrySecondaryWeaponAttacks(Mob* tar, const EQ::ItemInstance* s_item) {
const EQ::ItemData* s_itemdata = nullptr; const EQ::ItemData* s_itemdata = nullptr;
// Can only dual wield without a weapon if you're a monk // Can only dual wield without a weapon if you're a monk
if (s_item || (GetClass() == MONK)) { if (s_item || (GetClass() == Class::Monk)) {
if (s_item) { if (s_item) {
s_itemdata = s_item->GetItem(); s_itemdata = s_item->GetItem();
@ -2597,7 +2597,7 @@ bool Bot::TryEvade(Mob* tar) {
HasTargetReflection() && HasTargetReflection() &&
!tar->IsFeared() && !tar->IsFeared() &&
!tar->IsStunned() && !tar->IsStunned() &&
GetClass() == ROGUE && GetClass() == Class::Rogue &&
m_evade_timer.Check(false) m_evade_timer.Check(false)
) { ) {
int timer_duration = (HideReuseTime - GetSkillReuseTime(EQ::skills::SkillHide)) * 1000; int timer_duration = (HideReuseTime - GetSkillReuseTime(EQ::skills::SkillHide)) * 1000;
@ -2623,7 +2623,7 @@ void Bot::CheckCombatRange(Mob* tar, float tar_distance, bool& atCombatRange, co
s_item= GetBotItem(EQ::invslot::slotSecondary); s_item= GetBotItem(EQ::invslot::slotSecondary);
bool behind_mob = false; bool behind_mob = false;
bool backstab_weapon = false; bool backstab_weapon = false;
if (GetClass() == ROGUE) { if (GetClass() == Class::Rogue) {
behind_mob = BehindMob(tar, GetX(), GetY()); // Can be separated for other future use behind_mob = BehindMob(tar, GetX(), GetY()); // Can be separated for other future use
backstab_weapon = p_item && p_item->GetItemBackstabDamage(); backstab_weapon = p_item && p_item->GetItemBackstabDamage();
@ -2721,9 +2721,9 @@ void Bot::CalcMeleeDistances(const Mob* tar, const EQ::ItemInstance* const& p_it
melee_distance_max = size_mod; melee_distance_max = size_mod;
switch (GetClass()) { switch (GetClass()) {
case WARRIOR: case Class::Warrior:
case PALADIN: case Class::Paladin:
case SHADOWKNIGHT: case Class::ShadowKnight:
if (p_item && p_item->GetItem()->IsType2HWeapon()) { if (p_item && p_item->GetItem()->IsType2HWeapon()) {
melee_distance = melee_distance_max * 0.45f; melee_distance = melee_distance_max * 0.45f;
} }
@ -2734,10 +2734,10 @@ void Bot::CalcMeleeDistances(const Mob* tar, const EQ::ItemInstance* const& p_it
melee_distance = melee_distance_max * 0.40f; melee_distance = melee_distance_max * 0.40f;
} }
break; break;
case NECROMANCER: case Class::Necromancer:
case WIZARD: case Class::Wizard:
case MAGICIAN: case Class::Magician:
case ENCHANTER: case Class::Enchanter:
if (p_item && p_item->GetItem()->IsType2HWeapon()) { if (p_item && p_item->GetItem()->IsType2HWeapon()) {
melee_distance = melee_distance_max * 0.95f; melee_distance = melee_distance_max * 0.95f;
} }
@ -2745,7 +2745,7 @@ void Bot::CalcMeleeDistances(const Mob* tar, const EQ::ItemInstance* const& p_it
melee_distance = melee_distance_max * 0.75f; melee_distance = melee_distance_max * 0.75f;
} }
break; break;
case ROGUE: case Class::Rogue:
if (behind_mob && backstab_weapon) { if (behind_mob && backstab_weapon) {
if (p_item->GetItem()->IsType2HWeapon()) { if (p_item->GetItem()->IsType2HWeapon()) {
melee_distance = melee_distance_max * 0.30f; melee_distance = melee_distance_max * 0.30f;
@ -2860,7 +2860,7 @@ void Bot::AcquireBotTarget(Group* bot_group, Raid* raid, Client* leash_owner, fl
if ( if (
HasPet() && HasPet() &&
( (
GetClass() != ENCHANTER || GetClass() != Class::Enchanter ||
GetPet()->GetPetType() != petAnimation || GetPet()->GetPetType() != petAnimation ||
GetAA(aaAnimationEmpathy) >= 2 GetAA(aaAnimationEmpathy) >= 2
) )
@ -2880,7 +2880,7 @@ void Bot::AcquireBotTarget(Group* bot_group, Raid* raid, Client* leash_owner, fl
if ( if (
HasPet() && HasPet() &&
( (
GetClass() != ENCHANTER || GetClass() != Class::Enchanter ||
GetPet()->GetPetType() != petAnimation || GetPet()->GetPetType() != petAnimation ||
GetAA(aaAnimationEmpathy) >= 1 GetAA(aaAnimationEmpathy) >= 1
) )
@ -2962,7 +2962,7 @@ bool Bot::PullingFlagChecks(Client* bot_owner) {
SetReturningFlag(); SetReturningFlag();
if (HasPet() && if (HasPet() &&
(GetClass() != ENCHANTER || GetPet()->GetPetType() != petAnimation || GetAA(aaAnimationEmpathy) >= 1)) { (GetClass() != Class::Enchanter || GetPet()->GetPetType() != petAnimation || GetAA(aaAnimationEmpathy) >= 1)) {
GetPet()->WipeHateList(); GetPet()->WipeHateList();
GetPet()->SetTarget(nullptr); GetPet()->SetTarget(nullptr);
@ -3058,7 +3058,7 @@ bool Bot::CheckIfCasting(float fm_distance) {
AdvanceHealRotation(false); AdvanceHealRotation(false);
return true; return true;
} }
else if (GetClass() != BARD) { else if (GetClass() != Class::Bard) {
if (IsEngaged()) { if (IsEngaged()) {
return true; return true;
@ -3104,7 +3104,7 @@ bool Bot::CheckIfIncapacitated() {
} }
void Bot::SetBerserkState() {// Berserk updates should occur if primary AI criteria are met void Bot::SetBerserkState() {// Berserk updates should occur if primary AI criteria are met
if (GetClass() == WARRIOR || GetClass() == BERSERKER) { if (GetClass() == Class::Warrior || GetClass() == Class::Berserker) {
if (!berserk && GetHP() > 0 && GetHPRatio() < 30.0f) { if (!berserk && GetHP() > 0 && GetHPRatio() < 30.0f) {
entity_list.MessageCloseString(this, false, 200, 0, BERSERK_START, GetName()); entity_list.MessageCloseString(this, false, 200, 0, BERSERK_START, GetName());
@ -3159,7 +3159,7 @@ void Bot::SetLeashOwnerTarget(Client* leash_owner, Client* bot_owner, float lo_d
IsAttackAllowed(lo_target)) IsAttackAllowed(lo_target))
{ {
AddToHateList(lo_target, 1); AddToHateList(lo_target, 1);
if (HasPet() && (GetClass() != ENCHANTER || GetPet()->GetPetType() != petAnimation || GetAA(aaAnimationEmpathy) >= 2)) { if (HasPet() && (GetClass() != Class::Enchanter || GetPet()->GetPetType() != petAnimation || GetAA(aaAnimationEmpathy) >= 2)) {
GetPet()->AddToHateList(lo_target, 1); GetPet()->AddToHateList(lo_target, 1);
GetPet()->SetTarget(lo_target); GetPet()->SetTarget(lo_target);
} }
@ -3188,7 +3188,7 @@ void Bot::SetOwnerTarget(Client* bot_owner) {
AddToHateList(attack_target, 1); AddToHateList(attack_target, 1);
SetTarget(attack_target); SetTarget(attack_target);
SetAttackingFlag(); SetAttackingFlag();
if (GetPet() && (GetClass() != ENCHANTER || GetPet()->GetPetType() != petAnimation || GetAA(aaAnimationEmpathy) >= 2)) { if (GetPet() && (GetClass() != Class::Enchanter || GetPet()->GetPetType() != petAnimation || GetAA(aaAnimationEmpathy) >= 2)) {
GetPet()->WipeHateList(); GetPet()->WipeHateList();
GetPet()->AddToHateList(attack_target, 1); GetPet()->AddToHateList(attack_target, 1);
GetPet()->SetTarget(attack_target); GetPet()->SetTarget(attack_target);
@ -3227,7 +3227,7 @@ void Bot::BotPullerProcess(Client* bot_owner, Raid* raid) {
SetTarget(pull_target); SetTarget(pull_target);
SetPullingFlag(); SetPullingFlag();
bot_owner->SetBotPulling(); bot_owner->SetBotPulling();
if (HasPet() && (GetClass() != ENCHANTER || GetPet()->GetPetType() != petAnimation || GetAA(aaAnimationEmpathy) >= 1)) { if (HasPet() && (GetClass() != Class::Enchanter || GetPet()->GetPetType() != petAnimation || GetAA(aaAnimationEmpathy) >= 1)) {
GetPet()->WipeHateList(); GetPet()->WipeHateList();
GetPet()->SetTarget(nullptr); GetPet()->SetTarget(nullptr);
@ -3247,7 +3247,7 @@ void Bot::SetBotGroupTarget(const Client* bot_owner, Client* leash_owner, float
IsAttackAllowed(bgm_target)) IsAttackAllowed(bgm_target))
{ {
AddToHateList(bgm_target, 1); AddToHateList(bgm_target, 1);
if (HasPet() && (GetClass() != ENCHANTER || GetPet()->GetPetType() != petAnimation || GetAA(aaAnimationEmpathy) >= 2)) { if (HasPet() && (GetClass() != Class::Enchanter || GetPet()->GetPetType() != petAnimation || GetAA(aaAnimationEmpathy) >= 2)) {
GetPet()->AddToHateList(bgm_target, 1); GetPet()->AddToHateList(bgm_target, 1);
GetPet()->SetTarget(bgm_target); GetPet()->SetTarget(bgm_target);
} }
@ -3544,7 +3544,7 @@ void Bot::LoadAndSpawnAllZonedBots(Client* bot_owner) {
std::vector<int> bot_class_spawn_limits; std::vector<int> bot_class_spawn_limits;
std::vector<int> bot_class_spawned_count = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }; std::vector<int> bot_class_spawned_count = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 };
for (uint8 class_id = WARRIOR; class_id <= BERSERKER; class_id++) { for (uint8 class_id = Class::Warrior; class_id <= Class::Berserker; class_id++) {
auto bot_class_limit = bot_owner->GetBotSpawnLimit(class_id); auto bot_class_limit = bot_owner->GetBotSpawnLimit(class_id);
bot_class_spawn_limits.push_back(bot_class_limit); bot_class_spawn_limits.push_back(bot_class_limit);
} }
@ -4731,13 +4731,13 @@ int Bot::GetHandToHandDamage(void) {
7, 7, 7, 8, 8, 8, 8, 8, 8, 9, // 21-30 7, 7, 7, 8, 8, 8, 8, 8, 8, 9, // 21-30
9, 9, 9, 9, 9, 10, 10, 10, 10, 10, // 31-40 9, 9, 9, 9, 9, 10, 10, 10, 10, 10, // 31-40
10, 11, 11, 11, 11, 11, 11, 12, 12}; // 41-49 10, 11, 11, 11, 11, 11, 11, 12, 12}; // 41-49
if (GetClass() == MONK) { if (GetClass() == Class::Monk) {
if (CastToNPC()->GetEquippedItemFromTextureSlot(EQ::textures::armorHands) == 10652 && GetLevel() > 50) if (CastToNPC()->GetEquippedItemFromTextureSlot(EQ::textures::armorHands) == 10652 && GetLevel() > 50)
return 9; return 9;
if (level > 62) if (level > 62)
return 15; return 15;
return mnk_dmg[level]; return mnk_dmg[level];
} else if (GetClass() == BEASTLORD) { } else if (GetClass() == Class::Beastlord) {
if (level > 49) if (level > 49)
return 13; return 13;
return bst_dmg[level]; return bst_dmg[level];
@ -4783,7 +4783,7 @@ void Bot::DoRiposte(Mob* defender) {
DoubleRipChance = defender->GetAABonuses().GiveDoubleRiposte[1]; DoubleRipChance = defender->GetAABonuses().GiveDoubleRiposte[1];
if (DoubleRipChance && (DoubleRipChance >= zone->random.Int(0, 100))) { if (DoubleRipChance && (DoubleRipChance >= zone->random.Int(0, 100))) {
if (defender->GetClass() == MONK) if (defender->GetClass() == Class::Monk)
defender->MonkSpecialAttack(this, defender->GetAABonuses().GiveDoubleRiposte[2]); defender->MonkSpecialAttack(this, defender->GetAABonuses().GiveDoubleRiposte[2]);
else if (defender->IsBot()) else if (defender->IsBot())
defender->CastToClient()->DoClassAttacks(this,defender->GetAABonuses().GiveDoubleRiposte[2], true); defender->CastToClient()->DoClassAttacks(this,defender->GetAABonuses().GiveDoubleRiposte[2], true);
@ -5044,13 +5044,13 @@ void Bot::DoClassAttacks(Mob *target, bool IsRiposte) {
if (ka_time) { if (ka_time) {
switch (GetClass()) { switch (GetClass()) {
case SHADOWKNIGHT: { case Class::ShadowKnight: {
CastSpell(SPELL_NPC_HARM_TOUCH, target->GetID()); CastSpell(SPELL_NPC_HARM_TOUCH, target->GetID());
knightattack_timer.Start(HarmTouchReuseTime * 1000); knightattack_timer.Start(HarmTouchReuseTime * 1000);
break; break;
} }
case PALADIN: { case Class::Paladin: {
if (GetHPRatio() < 20) { if (GetHPRatio() < 20) {
CastSpell(SPELL_LAY_ON_HANDS, GetID()); CastSpell(SPELL_LAY_ON_HANDS, GetID());
knightattack_timer.Start(LayOnHandsReuseTime * 1000); knightattack_timer.Start(LayOnHandsReuseTime * 1000);
@ -5083,7 +5083,7 @@ void Bot::DoClassAttacks(Mob *target, bool IsRiposte) {
if (ma_time) { if (ma_time) {
switch (GetClass()) { switch (GetClass()) {
case MONK: { case Class::Monk: {
int reuse = (MonkSpecialAttack(target, EQ::skills::SkillTigerClaw) - 1); int reuse = (MonkSpecialAttack(target, EQ::skills::SkillTigerClaw) - 1);
// Live AA - Technique of Master Wu // Live AA - Technique of Master Wu
@ -5148,7 +5148,7 @@ void Bot::DoClassAttacks(Mob *target, bool IsRiposte) {
int reuse = (TauntReuseTime * 1000); // Same as Bash and Kick int reuse = (TauntReuseTime * 1000); // Same as Bash and Kick
bool did_attack = false; bool did_attack = false;
switch (GetClass()) { switch (GetClass()) {
case WARRIOR: case Class::Warrior:
if (bot_level >= RuleI(Combat, NPCBashKickLevel)) { if (bot_level >= RuleI(Combat, NPCBashKickLevel)) {
bool canBash = false; bool canBash = false;
if ((GetRace() == OGRE || GetRace() == TROLL || GetRace() == BARBARIAN) || (m_inv.GetItem(EQ::invslot::slotSecondary) && m_inv.GetItem(EQ::invslot::slotSecondary)->GetItem()->ItemType == EQ::item::ItemTypeShield) || (m_inv.GetItem(EQ::invslot::slotPrimary) && m_inv.GetItem(EQ::invslot::slotPrimary)->GetItem()->IsType2HWeapon() && GetAA(aa2HandBash) >= 1)) if ((GetRace() == OGRE || GetRace() == TROLL || GetRace() == BARBARIAN) || (m_inv.GetItem(EQ::invslot::slotSecondary) && m_inv.GetItem(EQ::invslot::slotSecondary)->GetItem()->ItemType == EQ::item::ItemTypeShield) || (m_inv.GetItem(EQ::invslot::slotPrimary) && m_inv.GetItem(EQ::invslot::slotPrimary)->GetItem()->IsType2HWeapon() && GetAA(aa2HandBash) >= 1))
@ -5159,22 +5159,22 @@ void Bot::DoClassAttacks(Mob *target, bool IsRiposte) {
else else
skill_to_use = EQ::skills::SkillBash; skill_to_use = EQ::skills::SkillBash;
} }
case RANGER: case Class::Ranger:
case BEASTLORD: case Class::Beastlord:
skill_to_use = EQ::skills::SkillKick; skill_to_use = EQ::skills::SkillKick;
break; break;
case BERSERKER: case Class::Berserker:
skill_to_use = EQ::skills::SkillFrenzy; skill_to_use = EQ::skills::SkillFrenzy;
break; break;
case CLERIC: case Class::Cleric:
case SHADOWKNIGHT: case Class::ShadowKnight:
case PALADIN: case Class::Paladin:
if (bot_level >= RuleI(Combat, NPCBashKickLevel)) { if (bot_level >= RuleI(Combat, NPCBashKickLevel)) {
if ((GetRace() == OGRE || GetRace() == TROLL || GetRace() == BARBARIAN) || (m_inv.GetItem(EQ::invslot::slotSecondary) && m_inv.GetItem(EQ::invslot::slotSecondary)->GetItem()->ItemType == EQ::item::ItemTypeShield) || (m_inv.GetItem(EQ::invslot::slotPrimary) && m_inv.GetItem(EQ::invslot::slotPrimary)->GetItem()->IsType2HWeapon() && GetAA(aa2HandBash) >= 1)) if ((GetRace() == OGRE || GetRace() == TROLL || GetRace() == BARBARIAN) || (m_inv.GetItem(EQ::invslot::slotSecondary) && m_inv.GetItem(EQ::invslot::slotSecondary)->GetItem()->ItemType == EQ::item::ItemTypeShield) || (m_inv.GetItem(EQ::invslot::slotPrimary) && m_inv.GetItem(EQ::invslot::slotPrimary)->GetItem()->IsType2HWeapon() && GetAA(aa2HandBash) >= 1))
skill_to_use = EQ::skills::SkillBash; skill_to_use = EQ::skills::SkillBash;
} }
break; break;
case MONK: case Class::Monk:
if (GetLevel() >= 30) { if (GetLevel() >= 30) {
skill_to_use = EQ::skills::SkillFlyingKick; skill_to_use = EQ::skills::SkillFlyingKick;
} }
@ -5192,7 +5192,7 @@ void Bot::DoClassAttacks(Mob *target, bool IsRiposte) {
} }
break; break;
case ROGUE: case Class::Rogue:
skill_to_use = EQ::skills::SkillBackstab; skill_to_use = EQ::skills::SkillBackstab;
break; break;
} }
@ -5600,7 +5600,7 @@ bool Bot::CastSpell(
ZeroCastingVars(); ZeroCastingVars();
} }
if (GetClass() != BARD) { if (GetClass() != Class::Bard) {
if ( if (
!IsValidSpell(spell_id) || !IsValidSpell(spell_id) ||
casting_spell_id || casting_spell_id ||
@ -5753,7 +5753,7 @@ bool Bot::DetermineSpellTargets(uint16 spell_id, Mob *&spell_target, Mob *&ae_ce
bool Bot::DoCastSpell(uint16 spell_id, uint16 target_id, EQ::spells::CastingSlot slot, int32 cast_time, int32 mana_cost, uint32* oSpellWillFinish, uint32 item_slot, uint32 aa_id) { bool Bot::DoCastSpell(uint16 spell_id, uint16 target_id, EQ::spells::CastingSlot slot, int32 cast_time, int32 mana_cost, uint32* oSpellWillFinish, uint32 item_slot, uint32 aa_id) {
bool Result = false; bool Result = false;
if (GetClass() == BARD) if (GetClass() == Class::Bard)
cast_time = 0; cast_time = 0;
Result = Mob::DoCastSpell(spell_id, target_id, slot, cast_time, mana_cost, oSpellWillFinish, item_slot, aa_id); Result = Mob::DoCastSpell(spell_id, target_id, slot, cast_time, mana_cost, oSpellWillFinish, item_slot, aa_id);
@ -5851,7 +5851,7 @@ int32 Bot::GenerateBaseManaPoints() {
} }
void Bot::GenerateSpecialAttacks() { void Bot::GenerateSpecialAttacks() {
if (((GetClass() == MONK) || (GetClass() == WARRIOR) || (GetClass() == RANGER) || (GetClass() == BERSERKER)) && (GetLevel() >= 60)) if (((GetClass() == Class::Monk) || (GetClass() == Class::Warrior) || (GetClass() == Class::Ranger) || (GetClass() == Class::Berserker)) && (GetLevel() >= 60))
SetSpecialAbility(SPECATK_TRIPLE, 1); SetSpecialAbility(SPECATK_TRIPLE, 1);
} }
@ -5874,7 +5874,7 @@ bool Bot::DoFinishedSpellSingleTarget(uint16 spell_id, Mob* spellTarget, EQ::spe
bool spellequal = (j == thespell); bool spellequal = (j == thespell);
bool spelltypeequal = ((spelltype == 2) || (spelltype == 16) || (spelltype == 32)); bool spelltypeequal = ((spelltype == 2) || (spelltype == 16) || (spelltype == 32));
bool spelltypetargetequal = ((spelltype == 8) && (spells[thespell].target_type == ST_Self)); bool spelltypetargetequal = ((spelltype == 8) && (spells[thespell].target_type == ST_Self));
bool spelltypeclassequal = ((spelltype == 1024) && (GetClass() == SHAMAN)); bool spelltypeclassequal = ((spelltype == 1024) && (GetClass() == Class::Shaman));
bool slotequal = (slot == EQ::spells::CastingSlot::Item); bool slotequal = (slot == EQ::spells::CastingSlot::Item);
if (spellequal || slotequal) { if (spellequal || slotequal) {
if ((spelltypeequal || spelltypetargetequal) || spelltypeclassequal || slotequal) { if ((spelltypeequal || spelltypetargetequal) || spelltypeclassequal || slotequal) {
@ -5896,7 +5896,7 @@ bool Bot::DoFinishedSpellSingleTarget(uint16 spell_id, Mob* spellTarget, EQ::spe
if (g) { if (g) {
for (int i = 0; i < MAX_GROUP_MEMBERS; i++) { for (int i = 0; i < MAX_GROUP_MEMBERS; i++) {
if (g->members[i]) { if (g->members[i]) {
if ((g->members[i]->GetClass() == NECROMANCER) && (IsEffectInSpell(thespell, SE_AbsorbMagicAtt) || IsEffectInSpell(thespell, SE_Rune))) { if ((g->members[i]->GetClass() == Class::Necromancer) && (IsEffectInSpell(thespell, SE_AbsorbMagicAtt) || IsEffectInSpell(thespell, SE_Rune))) {
} }
else else
SpellOnTarget(thespell, g->members[i]); SpellOnTarget(thespell, g->members[i]);
@ -5917,7 +5917,7 @@ bool Bot::DoFinishedSpellGroupTarget(uint16 spell_id, Mob* spellTarget, EQ::spel
bool isMainGroupMGB = false; bool isMainGroupMGB = false;
Raid* raid = entity_list.GetRaidByBotName(GetName()); Raid* raid = entity_list.GetRaidByBotName(GetName());
if (isMainGroupMGB && (GetClass() != BARD)) { if (isMainGroupMGB && (GetClass() != Class::Bard)) {
BotGroupSay( BotGroupSay(
this, this,
fmt::format( fmt::format(
@ -6201,7 +6201,7 @@ int32 Bot::CalcCHA() {
int32 Bot::CalcMR() { int32 Bot::CalcMR() {
MR += (itembonuses.MR + spellbonuses.MR + aabonuses.MR); MR += (itembonuses.MR + spellbonuses.MR + aabonuses.MR);
if (GetClass() == WARRIOR) if (GetClass() == Class::Warrior)
MR += (GetLevel() / 2); MR += (GetLevel() / 2);
if (MR < 1) if (MR < 1)
@ -6215,7 +6215,7 @@ int32 Bot::CalcMR() {
int32 Bot::CalcFR() { int32 Bot::CalcFR() {
int c = GetClass(); int c = GetClass();
if (c == RANGER) { if (c == Class::Ranger) {
FR += 4; FR += 4;
int l = GetLevel(); int l = GetLevel();
if (l > 49) if (l > 49)
@ -6235,12 +6235,12 @@ int32 Bot::CalcFR() {
int32 Bot::CalcDR() { int32 Bot::CalcDR() {
int c = GetClass(); int c = GetClass();
if (c == PALADIN) { if (c == Class::Paladin) {
DR += 8; DR += 8;
int l = GetLevel(); int l = GetLevel();
if (l > 49) if (l > 49)
DR += (l - 49); DR += (l - 49);
} else if (c == SHADOWKNIGHT) { } else if (c == Class::ShadowKnight) {
DR += 4; DR += 4;
int l = GetLevel(); int l = GetLevel();
if (l > 49) if (l > 49)
@ -6259,12 +6259,12 @@ int32 Bot::CalcDR() {
int32 Bot::CalcPR() { int32 Bot::CalcPR() {
int c = GetClass(); int c = GetClass();
if (c == ROGUE) { if (c == Class::Rogue) {
PR += 8; PR += 8;
int l = GetLevel(); int l = GetLevel();
if (l > 49) if (l > 49)
PR += (l - 49); PR += (l - 49);
} else if (c == SHADOWKNIGHT) { } else if (c == Class::ShadowKnight) {
PR += 4; PR += 4;
int l = GetLevel(); int l = GetLevel();
if (l > 49) if (l > 49)
@ -6284,7 +6284,7 @@ int32 Bot::CalcPR() {
int32 Bot::CalcCR() { int32 Bot::CalcCR() {
int c = GetClass(); int c = GetClass();
if (c == RANGER) { if (c == Class::Ranger) {
CR += 4; CR += 4;
int l = GetLevel(); int l = GetLevel();
if (l > 49) if (l > 49)
@ -6401,7 +6401,7 @@ int64 Bot::CalcManaRegen() {
int32 regen = 0; int32 regen = 0;
if (IsSitting()) { if (IsSitting()) {
BuffFadeBySitModifier(); BuffFadeBySitModifier();
if (botclass != WARRIOR && botclass != MONK && botclass != ROGUE && botclass != BERSERKER) { if (botclass != Class::Warrior && botclass != Class::Monk && botclass != Class::Rogue && botclass != Class::Berserker) {
regen = ((((GetSkill(EQ::skills::SkillMeditate) / 10) + (level - (level / 4))) / 4) + 4); regen = ((((GetSkill(EQ::skills::SkillMeditate) / 10) + (level - (level / 4))) / 4) + 4);
regen += (spellbonuses.ManaRegen + itembonuses.ManaRegen); regen += (spellbonuses.ManaRegen + itembonuses.ManaRegen);
} else } else
@ -6423,25 +6423,25 @@ int64 Bot::CalcManaRegen() {
uint64 Bot::GetClassHPFactor() { uint64 Bot::GetClassHPFactor() {
uint32 factor; uint32 factor;
switch (GetClass()) { switch (GetClass()) {
case BEASTLORD: case Class::Beastlord:
case BERSERKER: case Class::Berserker:
case MONK: case Class::Monk:
case ROGUE: case Class::Rogue:
case SHAMAN: case Class::Shaman:
factor = 255; factor = 255;
break; break;
case BARD: case Class::Bard:
case CLERIC: case Class::Cleric:
factor = 264; factor = 264;
break; break;
case SHADOWKNIGHT: case Class::ShadowKnight:
case PALADIN: case Class::Paladin:
factor = 288; factor = 288;
break; break;
case RANGER: case Class::Ranger:
factor = 276; factor = 276;
break; break;
case WARRIOR: case Class::Warrior:
factor = 300; factor = 300;
break; break;
default: default:
@ -6682,46 +6682,46 @@ void Bot::UpdateGroupCastingRoles(const Group* group, bool disband)
// GroupHealer // GroupHealer
switch (iter->GetClass()) { switch (iter->GetClass()) {
case CLERIC: case Class::Cleric:
if (!healer) if (!healer)
healer = iter; healer = iter;
else else
switch (healer->GetClass()) { switch (healer->GetClass()) {
case CLERIC: case Class::Cleric:
break; break;
default: default:
healer = iter; healer = iter;
} }
break; break;
case DRUID: case Class::Druid:
if (!healer) if (!healer)
healer = iter; healer = iter;
else else
switch (healer->GetClass()) { switch (healer->GetClass()) {
case CLERIC: case Class::Cleric:
case DRUID: case Class::Druid:
break; break;
default: default:
healer = iter; healer = iter;
} }
break; break;
case SHAMAN: case Class::Shaman:
if (!healer) if (!healer)
healer = iter; healer = iter;
else else
switch (healer->GetClass()) { switch (healer->GetClass()) {
case CLERIC: case Class::Cleric:
case DRUID: case Class::Druid:
case SHAMAN: case Class::Shaman:
break; break;
default: default:
healer = iter; healer = iter;
} }
break; break;
case PALADIN: case Class::Paladin:
case RANGER: case Class::Ranger:
case BEASTLORD: case Class::Beastlord:
if (!healer) if (!healer)
healer = iter; healer = iter;
break; break;
@ -6731,30 +6731,30 @@ void Bot::UpdateGroupCastingRoles(const Group* group, bool disband)
// GroupSlower // GroupSlower
switch (iter->GetClass()) { switch (iter->GetClass()) {
case SHAMAN: case Class::Shaman:
if (!slower) if (!slower)
slower = iter; slower = iter;
else else
switch (slower->GetClass()) { switch (slower->GetClass()) {
case SHAMAN: case Class::Shaman:
break; break;
default: default:
slower = iter; slower = iter;
} }
break; break;
case ENCHANTER: case Class::Enchanter:
if (!slower) if (!slower)
slower = iter; slower = iter;
else else
switch (slower->GetClass()) { switch (slower->GetClass()) {
case SHAMAN: case Class::Shaman:
case ENCHANTER: case Class::Enchanter:
break; break;
default: default:
slower = iter; slower = iter;
} }
break; break;
case BEASTLORD: case Class::Beastlord:
if (!slower) if (!slower)
slower = iter; slower = iter;
break; break;
@ -6985,7 +6985,7 @@ void Bot::CalcBotStats(bool showtext) {
taunt_timer.Start(1000); taunt_timer.Start(1000);
if (GetClass() == MONK && GetLevel() >= 10) { if (GetClass() == Class::Monk && GetLevel() >= 10) {
monkattack_timer.Start(1000); monkattack_timer.Start(1000);
} }
@ -6997,7 +6997,7 @@ void Bot::CalcBotStats(bool showtext) {
GetBotOwner()->Message(Chat::Yellow, "Level: %i HP: %i AC: %i Mana: %i STR: %i STA: %i DEX: %i AGI: %i INT: %i WIS: %i CHA: %i", GetLevel(), base_hp, AC, max_mana, STR, STA, DEX, AGI, INT, WIS, CHA); GetBotOwner()->Message(Chat::Yellow, "Level: %i HP: %i AC: %i Mana: %i STR: %i STA: %i DEX: %i AGI: %i INT: %i WIS: %i CHA: %i", GetLevel(), base_hp, AC, max_mana, STR, STA, DEX, AGI, INT, WIS, CHA);
GetBotOwner()->Message(Chat::Yellow, "Resists-- Magic: %i, Poison: %i, Fire: %i, Cold: %i, Disease: %i, Corruption: %i.",MR,PR,FR,CR,DR,Corrup); GetBotOwner()->Message(Chat::Yellow, "Resists-- Magic: %i, Poison: %i, Fire: %i, Cold: %i, Disease: %i, Corruption: %i.",MR,PR,FR,CR,DR,Corrup);
// Test Code // Test Code
if (GetClass() == BARD) if (GetClass() == Class::Bard)
GetBotOwner()->Message(Chat::Yellow, "Bard Skills-- Brass: %i, Percussion: %i, Singing: %i, Stringed: %i, Wind: %i", GetBotOwner()->Message(Chat::Yellow, "Bard Skills-- Brass: %i, Percussion: %i, Singing: %i, Stringed: %i, Wind: %i",
GetSkill(EQ::skills::SkillBrassInstruments), GetSkill(EQ::skills::SkillPercussionInstruments), GetSkill(EQ::skills::SkillSinging), GetSkill(EQ::skills::SkillStringedInstruments), GetSkill(EQ::skills::SkillWindInstruments)); GetSkill(EQ::skills::SkillBrassInstruments), GetSkill(EQ::skills::SkillPercussionInstruments), GetSkill(EQ::skills::SkillSinging), GetSkill(EQ::skills::SkillStringedInstruments), GetSkill(EQ::skills::SkillWindInstruments));
} }
@ -7014,7 +7014,7 @@ void Bot::CalcBotStats(bool showtext) {
GetBotOwner()->Message(Chat::Yellow, "Level: %i HP: %i AC: %i Mana: %i STR: %i STA: %i DEX: %i AGI: %i INT: %i WIS: %i CHA: %i", GetLevel(), max_hp, GetAC(), max_mana, GetSTR(), GetSTA(), GetDEX(), GetAGI(), GetINT(), GetWIS(), GetCHA()); GetBotOwner()->Message(Chat::Yellow, "Level: %i HP: %i AC: %i Mana: %i STR: %i STA: %i DEX: %i AGI: %i INT: %i WIS: %i CHA: %i", GetLevel(), max_hp, GetAC(), max_mana, GetSTR(), GetSTA(), GetDEX(), GetAGI(), GetINT(), GetWIS(), GetCHA());
GetBotOwner()->Message(Chat::Yellow, "Resists-- Magic: %i, Poison: %i, Fire: %i, Cold: %i, Disease: %i, Corruption: %i.",GetMR(),GetPR(),GetFR(),GetCR(),GetDR(),GetCorrup()); GetBotOwner()->Message(Chat::Yellow, "Resists-- Magic: %i, Poison: %i, Fire: %i, Cold: %i, Disease: %i, Corruption: %i.",GetMR(),GetPR(),GetFR(),GetCR(),GetDR(),GetCorrup());
// Test Code // Test Code
if (GetClass() == BARD) { if (GetClass() == Class::Bard) {
GetBotOwner()->Message(Chat::Yellow, "Bard Skills-- Brass: %i, Percussion: %i, Singing: %i, Stringed: %i, Wind: %i", GetBotOwner()->Message(Chat::Yellow, "Bard Skills-- Brass: %i, Percussion: %i, Singing: %i, Stringed: %i, Wind: %i",
GetSkill(EQ::skills::SkillBrassInstruments) + GetBrassMod(), GetSkill(EQ::skills::SkillBrassInstruments) + GetBrassMod(),
GetSkill(EQ::skills::SkillPercussionInstruments) + GetPercMod(), GetSkill(EQ::skills::SkillPercussionInstruments) + GetPercMod(),
@ -7057,7 +7057,7 @@ bool EntityList::Bot_AICheckCloseBeneficialSpells(Bot* caster, uint8 iChance, fl
uint8 botCasterClass = caster->GetClass(); uint8 botCasterClass = caster->GetClass();
if (iSpellTypes == SpellType_Heal) { if (iSpellTypes == SpellType_Heal) {
if (botCasterClass == CLERIC || botCasterClass == DRUID || botCasterClass == SHAMAN) { if (botCasterClass == Class::Cleric || botCasterClass == Class::Druid || botCasterClass == Class::Shaman) {
if (caster->IsRaidGrouped()) { if (caster->IsRaidGrouped()) {
Raid* raid = entity_list.GetRaidByBotName(caster->GetName()); Raid* raid = entity_list.GetRaidByBotName(caster->GetName());
uint32 gid = raid->GetGroup(caster->GetName()); uint32 gid = raid->GetGroup(caster->GetName());
@ -7069,11 +7069,11 @@ bool EntityList::Bot_AICheckCloseBeneficialSpells(Bot* caster, uint8 iChance, fl
if (caster->AICastSpell(iter->member, 100, SpellType_Heal)) if (caster->AICastSpell(iter->member, 100, SpellType_Heal))
return true; return true;
} }
else if ((iter->member->GetClass() == WARRIOR || iter->member->GetClass() == PALADIN || iter->member->GetClass() == SHADOWKNIGHT) && iter->member->GetHPRatio() < 95) { else if ((iter->member->GetClass() == Class::Warrior || iter->member->GetClass() == Class::Paladin || iter->member->GetClass() == Class::ShadowKnight) && iter->member->GetHPRatio() < 95) {
if (caster->AICastSpell(iter->member, 100, SpellType_Heal)) if (caster->AICastSpell(iter->member, 100, SpellType_Heal))
return true; return true;
} }
else if (iter->member->GetClass() == ENCHANTER && iter->member->GetHPRatio() < 80) { else if (iter->member->GetClass() == Class::Enchanter && iter->member->GetHPRatio() < 80) {
if (caster->AICastSpell(iter->member, 100, SpellType_Heal)) if (caster->AICastSpell(iter->member, 100, SpellType_Heal))
return true; return true;
} }
@ -7085,7 +7085,7 @@ bool EntityList::Bot_AICheckCloseBeneficialSpells(Bot* caster, uint8 iChance, fl
} }
if (iter->member && !iter->member->qglobal && iter->member->HasPet() && iter->member->GetPet()->GetHPRatio() < 50) { if (iter->member && !iter->member->qglobal && iter->member->HasPet() && iter->member->GetPet()->GetHPRatio() < 50) {
if (iter->member->GetPet()->GetOwner() != caster && caster->IsEngaged() && iter->member->IsCasting() && iter->member->GetClass() != ENCHANTER) if (iter->member->GetPet()->GetOwner() != caster && caster->IsEngaged() && iter->member->IsCasting() && iter->member->GetClass() != Class::Enchanter)
continue; continue;
if (caster->AICastSpell(iter->member->GetPet(), 100, SpellType_Heal)) if (caster->AICastSpell(iter->member->GetPet(), 100, SpellType_Heal))
@ -7103,10 +7103,10 @@ bool EntityList::Bot_AICheckCloseBeneficialSpells(Bot* caster, uint8 iChance, fl
if (g->members[i]->IsClient() && g->members[i]->GetHPRatio() < 90) { if (g->members[i]->IsClient() && g->members[i]->GetHPRatio() < 90) {
if (caster->AICastSpell(g->members[i], 100, SpellType_Heal)) if (caster->AICastSpell(g->members[i], 100, SpellType_Heal))
return true; return true;
} else if ((g->members[i]->GetClass() == WARRIOR || g->members[i]->GetClass() == PALADIN || g->members[i]->GetClass() == SHADOWKNIGHT) && g->members[i]->GetHPRatio() < 95) { } else if ((g->members[i]->GetClass() == Class::Warrior || g->members[i]->GetClass() == Class::Paladin || g->members[i]->GetClass() == Class::ShadowKnight) && g->members[i]->GetHPRatio() < 95) {
if (caster->AICastSpell(g->members[i], 100, SpellType_Heal)) if (caster->AICastSpell(g->members[i], 100, SpellType_Heal))
return true; return true;
} else if (g->members[i]->GetClass() == ENCHANTER && g->members[i]->GetHPRatio() < 80) { } else if (g->members[i]->GetClass() == Class::Enchanter && g->members[i]->GetHPRatio() < 80) {
if (caster->AICastSpell(g->members[i], 100, SpellType_Heal)) if (caster->AICastSpell(g->members[i], 100, SpellType_Heal))
return true; return true;
} else if (g->members[i]->GetHPRatio() < 70) { } else if (g->members[i]->GetHPRatio() < 70) {
@ -7116,7 +7116,7 @@ bool EntityList::Bot_AICheckCloseBeneficialSpells(Bot* caster, uint8 iChance, fl
} }
if (g->members[i] && !g->members[i]->qglobal && g->members[i]->HasPet() && g->members[i]->GetPet()->GetHPRatio() < 50) { if (g->members[i] && !g->members[i]->qglobal && g->members[i]->HasPet() && g->members[i]->GetPet()->GetHPRatio() < 50) {
if (g->members[i]->GetPet()->GetOwner() != caster && caster->IsEngaged() && g->members[i]->IsCasting() && g->members[i]->GetClass() != ENCHANTER ) if (g->members[i]->GetPet()->GetOwner() != caster && caster->IsEngaged() && g->members[i]->IsCasting() && g->members[i]->GetClass() != Class::Enchanter )
continue; continue;
if (caster->AICastSpell(g->members[i]->GetPet(), 100, SpellType_Heal)) if (caster->AICastSpell(g->members[i]->GetPet(), 100, SpellType_Heal))
@ -7127,7 +7127,7 @@ bool EntityList::Bot_AICheckCloseBeneficialSpells(Bot* caster, uint8 iChance, fl
} }
} }
if ((botCasterClass == PALADIN || botCasterClass == BEASTLORD || botCasterClass == RANGER) && (caster->HasGroup() || caster->IsRaidGrouped())) { if ((botCasterClass == Class::Paladin || botCasterClass == Class::Beastlord || botCasterClass == Class::Ranger) && (caster->HasGroup() || caster->IsRaidGrouped())) {
float hpRatioToHeal = 25.0f; float hpRatioToHeal = 25.0f;
switch(caster->GetBotStance()) { switch(caster->GetBotStance()) {
case EQ::constants::stanceReactive: case EQ::constants::stanceReactive:
@ -7156,12 +7156,12 @@ bool EntityList::Bot_AICheckCloseBeneficialSpells(Bot* caster, uint8 iChance, fl
if (caster->AICastSpell(iter->member, 100, SpellType_Heal)) if (caster->AICastSpell(iter->member, 100, SpellType_Heal))
return true; return true;
} else if ( } else if (
(iter->member->GetClass() == WARRIOR || iter->member->GetClass() == PALADIN || (iter->member->GetClass() == Class::Warrior || iter->member->GetClass() == Class::Paladin ||
iter->member->GetClass() == SHADOWKNIGHT) && iter->member->GetClass() == Class::ShadowKnight) &&
iter->member->GetHPRatio() < hpRatioToHeal) { iter->member->GetHPRatio() < hpRatioToHeal) {
if (caster->AICastSpell(iter->member, 100, SpellType_Heal)) if (caster->AICastSpell(iter->member, 100, SpellType_Heal))
return true; return true;
} else if (iter->member->GetClass() == ENCHANTER && } else if (iter->member->GetClass() == Class::Enchanter &&
iter->member->GetHPRatio() < hpRatioToHeal) { iter->member->GetHPRatio() < hpRatioToHeal) {
if (caster->AICastSpell(iter->member, 100, SpellType_Heal)) if (caster->AICastSpell(iter->member, 100, SpellType_Heal))
return true; return true;
@ -7174,7 +7174,7 @@ bool EntityList::Bot_AICheckCloseBeneficialSpells(Bot* caster, uint8 iChance, fl
if (iter->member && !iter->member->qglobal && iter->member->HasPet() && if (iter->member && !iter->member->qglobal && iter->member->HasPet() &&
iter->member->GetPet()->GetHPRatio() < 25) { iter->member->GetPet()->GetHPRatio() < 25) {
if (iter->member->GetPet()->GetOwner() != caster && caster->IsEngaged() && if (iter->member->GetPet()->GetOwner() != caster && caster->IsEngaged() &&
iter->member->IsCasting() && iter->member->GetClass() != ENCHANTER) iter->member->IsCasting() && iter->member->GetClass() != Class::Enchanter)
continue; continue;
if (caster->AICastSpell(iter->member->GetPet(), 100, SpellType_Heal)) if (caster->AICastSpell(iter->member->GetPet(), 100, SpellType_Heal))
@ -7191,12 +7191,12 @@ bool EntityList::Bot_AICheckCloseBeneficialSpells(Bot* caster, uint8 iChance, fl
if (g->members[i]->IsClient() && g->members[i]->GetHPRatio() < hpRatioToHeal) { if (g->members[i]->IsClient() && g->members[i]->GetHPRatio() < hpRatioToHeal) {
if (caster->AICastSpell(g->members[i], 100, SpellType_Heal)) if (caster->AICastSpell(g->members[i], 100, SpellType_Heal))
return true; return true;
} else if ((g->members[i]->GetClass() == WARRIOR || g->members[i]->GetClass() == PALADIN || } else if ((g->members[i]->GetClass() == Class::Warrior || g->members[i]->GetClass() == Class::Paladin ||
g->members[i]->GetClass() == SHADOWKNIGHT) && g->members[i]->GetClass() == Class::ShadowKnight) &&
g->members[i]->GetHPRatio() < hpRatioToHeal) { g->members[i]->GetHPRatio() < hpRatioToHeal) {
if (caster->AICastSpell(g->members[i], 100, SpellType_Heal)) if (caster->AICastSpell(g->members[i], 100, SpellType_Heal))
return true; return true;
} else if (g->members[i]->GetClass() == ENCHANTER && } else if (g->members[i]->GetClass() == Class::Enchanter &&
g->members[i]->GetHPRatio() < hpRatioToHeal) { g->members[i]->GetHPRatio() < hpRatioToHeal) {
if (caster->AICastSpell(g->members[i], 100, SpellType_Heal)) if (caster->AICastSpell(g->members[i], 100, SpellType_Heal))
return true; return true;
@ -7209,7 +7209,7 @@ bool EntityList::Bot_AICheckCloseBeneficialSpells(Bot* caster, uint8 iChance, fl
if (g->members[i] && !g->members[i]->qglobal && g->members[i]->HasPet() && if (g->members[i] && !g->members[i]->qglobal && g->members[i]->HasPet() &&
g->members[i]->GetPet()->GetHPRatio() < 25) { g->members[i]->GetPet()->GetHPRatio() < 25) {
if (g->members[i]->GetPet()->GetOwner() != caster && caster->IsEngaged() && if (g->members[i]->GetPet()->GetOwner() != caster && caster->IsEngaged() &&
g->members[i]->IsCasting() && g->members[i]->GetClass() != ENCHANTER) g->members[i]->IsCasting() && g->members[i]->GetClass() != Class::Enchanter)
continue; continue;
if (caster->AICastSpell(g->members[i]->GetPet(), 100, SpellType_Heal)) if (caster->AICastSpell(g->members[i]->GetPet(), 100, SpellType_Heal))
@ -7223,7 +7223,7 @@ bool EntityList::Bot_AICheckCloseBeneficialSpells(Bot* caster, uint8 iChance, fl
if (iSpellTypes == SpellType_Buff) { if (iSpellTypes == SpellType_Buff) {
uint8 chanceToCast = caster->IsEngaged() ? caster->GetChanceToCastBySpellType(SpellType_Buff) : 100; uint8 chanceToCast = caster->IsEngaged() ? caster->GetChanceToCastBySpellType(SpellType_Buff) : 100;
if (botCasterClass == BARD) { if (botCasterClass == Class::Bard) {
if (caster->AICastSpell(caster, chanceToCast, SpellType_Buff)) { if (caster->AICastSpell(caster, chanceToCast, SpellType_Buff)) {
return true; return true;
} else } else
@ -7266,7 +7266,7 @@ bool EntityList::Bot_AICheckCloseBeneficialSpells(Bot* caster, uint8 iChance, fl
if (iter->member && caster->GetNeedsCured(iter->member)) { if (iter->member && caster->GetNeedsCured(iter->member)) {
if (caster->AICastSpell(iter->member, caster->GetChanceToCastBySpellType(SpellType_Cure), SpellType_Cure)) if (caster->AICastSpell(iter->member, caster->GetChanceToCastBySpellType(SpellType_Cure), SpellType_Cure))
return true; return true;
else if (botCasterClass == BARD) { else if (botCasterClass == Class::Bard) {
return false; return false;
} }
} }
@ -7285,7 +7285,7 @@ bool EntityList::Bot_AICheckCloseBeneficialSpells(Bot* caster, uint8 iChance, fl
if (g->members[i] && caster->GetNeedsCured(g->members[i])) { if (g->members[i] && caster->GetNeedsCured(g->members[i])) {
if (caster->AICastSpell(g->members[i], caster->GetChanceToCastBySpellType(SpellType_Cure), SpellType_Cure)) if (caster->AICastSpell(g->members[i], caster->GetChanceToCastBySpellType(SpellType_Cure), SpellType_Cure))
return true; return true;
else if (botCasterClass == BARD) else if (botCasterClass == Class::Bard)
return false; return false;
} }
@ -7329,7 +7329,7 @@ bool EntityList::Bot_AICheckCloseBeneficialSpells(Bot* caster, uint8 iChance, fl
} }
if (iSpellTypes == SpellType_PreCombatBuff) { if (iSpellTypes == SpellType_PreCombatBuff) {
if (botCasterClass == BARD || caster->IsEngaged()) if (botCasterClass == Class::Bard || caster->IsEngaged())
return false; return false;
//added raid check //added raid check
@ -7361,7 +7361,7 @@ bool EntityList::Bot_AICheckCloseBeneficialSpells(Bot* caster, uint8 iChance, fl
} }
if (iSpellTypes == SpellType_InCombatBuff) { if (iSpellTypes == SpellType_InCombatBuff) {
if (botCasterClass == BARD) { if (botCasterClass == Class::Bard) {
if (caster->AICastSpell(caster, iChance, SpellType_InCombatBuff)) { if (caster->AICastSpell(caster, iChance, SpellType_InCombatBuff)) {
return true; return true;
} }
@ -7836,16 +7836,16 @@ bool Bot::GetNeedsHateRedux(Mob *tar) {
if (tar->IsBot()) { if (tar->IsBot()) {
switch (tar->GetClass()) { switch (tar->GetClass()) {
case ROGUE: case Class::Rogue:
if (tar->CanFacestab() || tar->CastToBot()->m_evade_timer.Check(false)) if (tar->CanFacestab() || tar->CastToBot()->m_evade_timer.Check(false))
return false; return false;
case CLERIC: case Class::Cleric:
case DRUID: case Class::Druid:
case SHAMAN: case Class::Shaman:
case NECROMANCER: case Class::Necromancer:
case WIZARD: case Class::Wizard:
case MAGICIAN: case Class::Magician:
case ENCHANTER: case Class::Enchanter:
return true; return true;
default: default:
return false; return false;
@ -7874,7 +7874,7 @@ bool Bot::HasOrMayGetAggro() {
void Bot::SetDefaultBotStance() { void Bot::SetDefaultBotStance() {
EQ::constants::StanceType defaultStance = EQ::constants::stanceBalanced; EQ::constants::StanceType defaultStance = EQ::constants::stanceBalanced;
if (GetClass() == WARRIOR) if (GetClass() == Class::Warrior)
defaultStance = EQ::constants::stanceAggressive; defaultStance = EQ::constants::stanceAggressive;
_botStance = defaultStance; _botStance = defaultStance;
@ -8707,7 +8707,7 @@ float Bot::GetBotCasterMaxRange(float melee_distance_max) {// Calculate caster d
float caster_distance = 0.0f; float caster_distance = 0.0f;
caster_distance_max = GetBotCasterRange() * GetBotCasterRange(); caster_distance_max = GetBotCasterRange() * GetBotCasterRange();
if (!GetBotCasterRange() && GetLevel() >= GetStopMeleeLevel() && GetClass() >= WARRIOR && GetClass() <= BERSERKER) { if (!GetBotCasterRange() && GetLevel() >= GetStopMeleeLevel() && GetClass() >= Class::Warrior && GetClass() <= Class::Berserker) {
caster_distance_max = MAX_CASTER_DISTANCE[GetClass() - 1]; caster_distance_max = MAX_CASTER_DISTANCE[GetClass() - 1];
} }
if (caster_distance_max) { if (caster_distance_max) {
@ -8806,4 +8806,4 @@ void Bot::AddBotStartingItems(uint16 race_id, uint8 class_id)
} }
} }
uint8 Bot::spell_casting_chances[SPELL_TYPE_COUNT][PLAYER_CLASS_COUNT][EQ::constants::STANCE_TYPE_COUNT][cntHSND] = { 0 }; uint8 Bot::spell_casting_chances[SPELL_TYPE_COUNT][Class::PLAYER_CLASS_COUNT][EQ::constants::STANCE_TYPE_COUNT][cntHSND] = { 0 };

View File

@ -394,14 +394,14 @@ public:
// Static Class Methods // Static Class Methods
static Bot* LoadBot(uint32 botID); static Bot* LoadBot(uint32 botID);
static uint32 SpawnedBotCount(const uint32 owner_id, uint8 class_id = NO_CLASS); static uint32 SpawnedBotCount(const uint32 owner_id, uint8 class_id = Class::None);
static void LevelBotWithClient(Client* client, uint8 level, bool sendlvlapp); static void LevelBotWithClient(Client* client, uint8 level, bool sendlvlapp);
static bool IsBotAttackAllowed(Mob* attacker, Mob* target, bool& hasRuleDefined); static bool IsBotAttackAllowed(Mob* attacker, Mob* target, bool& hasRuleDefined);
static Bot* GetBotByBotClientOwnerAndBotName(Client* c, const std::string& botName); static Bot* GetBotByBotClientOwnerAndBotName(Client* c, const std::string& botName);
static void ProcessBotGroupInvite(Client* c, std::string const& botName); static void ProcessBotGroupInvite(Client* c, std::string const& botName);
static void ProcessBotGroupDisband(Client* c, const std::string& botName); static void ProcessBotGroupDisband(Client* c, const std::string& botName);
static void BotOrderCampAll(Client* c, uint8 class_id = NO_CLASS); static void BotOrderCampAll(Client* c, uint8 class_id = Class::None);
static void ProcessBotInspectionRequest(Bot* inspectedBot, Client* client); static void ProcessBotInspectionRequest(Bot* inspectedBot, Client* client);
static void LoadAndSpawnAllZonedBots(Client* bot_owner); static void LoadAndSpawnAllZonedBots(Client* bot_owner);
static bool GroupHasBot(Group* group); static bool GroupHasBot(Group* group);
@ -604,7 +604,7 @@ public:
void SetBotCharmer(bool c) { _botCharmer = c; } void SetBotCharmer(bool c) { _botCharmer = c; }
void SetPetChooser(bool p) { _petChooser = p; } void SetPetChooser(bool p) { _petChooser = p; }
void SetBotOwner(Mob* botOwner) { this->_botOwner = botOwner; } void SetBotOwner(Mob* botOwner) { this->_botOwner = botOwner; }
void SetRangerAutoWeaponSelect(bool enable) { GetClass() == RANGER ? _rangerAutoWeaponSelect = enable : _rangerAutoWeaponSelect = false; } void SetRangerAutoWeaponSelect(bool enable) { GetClass() == Class::Ranger ? _rangerAutoWeaponSelect = enable : _rangerAutoWeaponSelect = false; }
void SetBotStance(EQ::constants::StanceType botStance) { void SetBotStance(EQ::constants::StanceType botStance) {
if (botStance >= EQ::constants::stancePassive && botStance <= EQ::constants::stanceBurnAE) if (botStance >= EQ::constants::stancePassive && botStance <= EQ::constants::stanceBurnAE)
_botStance = botStance; _botStance = botStance;
@ -738,7 +738,7 @@ public:
//Raid additions //Raid additions
Raid* p_raid_instance; Raid* p_raid_instance;
static uint8 spell_casting_chances[SPELL_TYPE_COUNT][PLAYER_CLASS_COUNT][EQ::constants::STANCE_TYPE_COUNT][cntHSND]; static uint8 spell_casting_chances[SPELL_TYPE_COUNT][Class::PLAYER_CLASS_COUNT][EQ::constants::STANCE_TYPE_COUNT][cntHSND];
bool BotCastMez(Mob* tar, uint8 botLevel, bool checked_los, BotSpell& botSpell, Raid* raid); bool BotCastMez(Mob* tar, uint8 botLevel, bool checked_los, BotSpell& botSpell, Raid* raid);
bool BotCastHeal(Mob* tar, uint8 botLevel, uint8 botClass, BotSpell& botSpell, Raid* raid); bool BotCastHeal(Mob* tar, uint8 botLevel, uint8 botClass, BotSpell& botSpell, Raid* raid);

View File

@ -84,8 +84,8 @@ namespace
enum { EffectIDFirst = 1, EffectIDLast = 12 }; enum { EffectIDFirst = 1, EffectIDLast = 12 };
#define VALIDATECLASSID(x) ((x >= WARRIOR && x <= BERSERKER) ? (x) : (0)) #define VALIDATECLASSID(x) ((x >= Class::Warrior && x <= Class::Berserker) ? (x) : (0))
#define CLASSIDTOINDEX(x) ((x >= WARRIOR && x <= BERSERKER) ? (x - 1) : (0)) #define CLASSIDTOINDEX(x) ((x >= Class::Warrior && x <= Class::Berserker) ? (x - 1) : (0))
#define EFFECTIDTOINDEX(x) ((x >= EffectIDFirst && x <= EffectIDLast) ? (x - 1) : (0)) #define EFFECTIDTOINDEX(x) ((x >= EffectIDFirst && x <= EffectIDLast) ? (x - 1) : (0))
#define AILMENTIDTOINDEX(x) ((x >= BCEnum::AT_Blindness && x <= BCEnum::AT_Corruption) ? (x - 1) : (0)) #define AILMENTIDTOINDEX(x) ((x >= BCEnum::AT_Blindness && x <= BCEnum::AT_Corruption) ? (x - 1) : (0))
#define RESISTANCEIDTOINDEX(x) ((x >= BCEnum::RT_Fire && x <= BCEnum::RT_Corruption) ? (x - 1) : (0)) #define RESISTANCEIDTOINDEX(x) ((x >= BCEnum::RT_Fire && x <= BCEnum::RT_Corruption) ? (x - 1) : (0))
@ -196,7 +196,7 @@ public:
uint8 class_levels[16] = {0}; uint8 class_levels[16] = {0};
bool player_spell = false; bool player_spell = false;
for (int class_type = WARRIOR; class_type <= BERSERKER; ++class_type) { for (int class_type = Class::Warrior; class_type <= Class::Berserker; ++class_type) {
int class_index = CLASSIDTOINDEX(class_type); int class_index = CLASSIDTOINDEX(class_type);
if (spells[spell_id].classes[class_index] == 0 || if (spells[spell_id].classes[class_index] == 0 ||
spells[spell_id].classes[class_index] > HARD_LEVEL_CAP) { spells[spell_id].classes[class_index] > HARD_LEVEL_CAP) {
@ -489,7 +489,7 @@ public:
entry_prototype->target_type = target_type; entry_prototype->target_type = target_type;
bcst_levels& bot_levels = bot_levels_map[entry_prototype->BCST()]; bcst_levels& bot_levels = bot_levels_map[entry_prototype->BCST()];
for (int class_type = WARRIOR; class_type <= BERSERKER; ++class_type) { for (int class_type = Class::Warrior; class_type <= Class::Berserker; ++class_type) {
int class_index = CLASSIDTOINDEX(class_type); int class_index = CLASSIDTOINDEX(class_type);
if (!class_levels[class_index]) if (!class_levels[class_index])
continue; continue;
@ -1119,7 +1119,7 @@ private:
} }
static void helper_bots_string(BCEnum::SpType type_index, bcst_levels& bot_levels) { static void helper_bots_string(BCEnum::SpType type_index, bcst_levels& bot_levels) {
for (int i = WARRIOR; i <= BERSERKER; ++i) for (int i = Class::Warrior; i <= Class::Berserker; ++i)
required_bots_map_by_class[type_index][i] = "Unavailable..."; required_bots_map_by_class[type_index][i] = "Unavailable...";
if (bot_levels.empty()) { if (bot_levels.empty()) {
@ -2377,7 +2377,7 @@ namespace ActionableBots
else if (!ab_type_arg.compare("healrotationtargets")) { else if (!ab_type_arg.compare("healrotationtargets")) {
ab_type = ABT_HealRotationTargets; ab_type = ABT_HealRotationTargets;
} }
else if (!ab_type_arg.compare("byclass")) { else if (!ab_type_arg.compare("byclass")) {
ab_type = ABT_Class; ab_type = ABT_Class;
} }
else if (!ab_type_arg.compare("byrace")) { else if (!ab_type_arg.compare("byrace")) {
@ -2730,9 +2730,9 @@ namespace ActionableBots
static void Filter_ByHighestPickLock(Client* bot_owner, std::list<Bot*>& sbl, float& pick_lock_value) { static void Filter_ByHighestPickLock(Client* bot_owner, std::list<Bot*>& sbl, float& pick_lock_value) {
sbl.remove_if([bot_owner](Bot* l) { return (!MyBots::IsMyBot(bot_owner, l)); }); sbl.remove_if([bot_owner](Bot* l) { return (!MyBots::IsMyBot(bot_owner, l)); });
sbl.remove_if([bot_owner](const Bot* l) { return (l->GetClass() != ROGUE && l->GetClass() != BARD); }); sbl.remove_if([bot_owner](const Bot* l) { return (l->GetClass() != Class::Rogue && l->GetClass() != Class::Bard); });
sbl.remove_if([bot_owner](const Bot* l) { return (l->GetClass() == ROGUE && l->GetLevel() < 5); }); sbl.remove_if([bot_owner](const Bot* l) { return (l->GetClass() == Class::Rogue && l->GetLevel() < 5); });
sbl.remove_if([bot_owner](const Bot* l) { return (l->GetClass() == BARD && l->GetLevel() < 40); }); sbl.remove_if([bot_owner](const Bot* l) { return (l->GetClass() == Class::Bard && l->GetLevel() < 40); });
ActionableBots::Filter_ByHighestSkill(bot_owner, sbl, EQ::skills::SkillPickLock, pick_lock_value); ActionableBots::Filter_ByHighestSkill(bot_owner, sbl, EQ::skills::SkillPickLock, pick_lock_value);
} }
@ -2856,7 +2856,7 @@ void bot_command_apply_poison(Client *c, const Seperator *sep)
t && t &&
t->IsBot() && t->IsBot() &&
t->CastToBot()->GetBotOwnerCharacterID() == c->CharacterID() && t->CastToBot()->GetBotOwnerCharacterID() == c->CharacterID() &&
t->GetClass() == ROGUE t->GetClass() == Class::Rogue
) { ) {
my_rogue_bot = t->CastToBot(); my_rogue_bot = t->CastToBot();
} }
@ -2964,7 +2964,7 @@ void bot_command_apply_potion(Client* c, const Seperator* sep)
if (potion_data->ItemType == EQ::item::ItemTypePotion && potion_data->Click.Effect > 0) { if (potion_data->ItemType == EQ::item::ItemTypePotion && potion_data->Click.Effect > 0) {
if (RuleB(Bots, RestrictApplyPotionToRogue) && potion_data->Classes != PLAYER_CLASS_ROGUE_BIT) { if (RuleB(Bots, RestrictApplyPotionToRogue) && potion_data->Classes != player_class_bitmasks[Class::Rogue]) {
c->Message(Chat::White, "This command is restricted to rogue poison potions only!"); c->Message(Chat::White, "This command is restricted to rogue poison potions only!");
return; return;
@ -3353,8 +3353,8 @@ void bot_command_depart(Client *c, const Seperator *sep)
std::string destination = sep->arg[1]; std::string destination = sep->arg[1];
if (!destination.compare("list")) { if (!destination.compare("list")) {
Bot* my_druid_bot = ActionableBots::AsGroupMember_ByClass(c, c, DRUID); Bot* my_druid_bot = ActionableBots::AsGroupMember_ByClass(c, c, Class::Druid);
Bot* my_wizard_bot = ActionableBots::AsGroupMember_ByClass(c, c, WIZARD); Bot* my_wizard_bot = ActionableBots::AsGroupMember_ByClass(c, c, Class::Wizard);
helper_command_depart_list(c, my_druid_bot, my_wizard_bot, local_list, single); helper_command_depart_list(c, my_druid_bot, my_wizard_bot, local_list, single);
return; return;
} }
@ -4647,17 +4647,17 @@ void bot_command_pull(Client *c, const Seperator *sep)
} }
switch (bot_iter->GetClass()) { switch (bot_iter->GetClass()) {
case ROGUE: case Class::Rogue:
case MONK: case Class::Monk:
case BARD: case Class::Bard:
case RANGER: case Class::Ranger:
bot_puller = bot_iter; bot_puller = bot_iter;
break; break;
case WARRIOR: case Class::Warrior:
case SHADOWKNIGHT: case Class::ShadowKnight:
case PALADIN: case Class::Paladin:
case BERSERKER: case Class::Berserker:
case BEASTLORD: case Class::Beastlord:
if (!bot_puller) { if (!bot_puller) {
bot_puller = bot_iter; bot_puller = bot_iter;
@ -4665,22 +4665,22 @@ void bot_command_pull(Client *c, const Seperator *sep)
} }
switch (bot_puller->GetClass()) { switch (bot_puller->GetClass()) {
case DRUID: case Class::Druid:
case SHAMAN: case Class::Shaman:
case CLERIC: case Class::Cleric:
case WIZARD: case Class::Wizard:
case NECROMANCER: case Class::Necromancer:
case MAGICIAN: case Class::Magician:
case ENCHANTER: case Class::Enchanter:
bot_puller = bot_iter; bot_puller = bot_iter;
default: default:
continue; continue;
} }
continue; continue;
case DRUID: case Class::Druid:
case SHAMAN: case Class::Shaman:
case CLERIC: case Class::Cleric:
if (!bot_puller) { if (!bot_puller) {
bot_puller = bot_iter; bot_puller = bot_iter;
@ -4688,20 +4688,20 @@ void bot_command_pull(Client *c, const Seperator *sep)
} }
switch (bot_puller->GetClass()) { switch (bot_puller->GetClass()) {
case WIZARD: case Class::Wizard:
case NECROMANCER: case Class::Necromancer:
case MAGICIAN: case Class::Magician:
case ENCHANTER: case Class::Enchanter:
bot_puller = bot_iter; bot_puller = bot_iter;
default: default:
continue; continue;
} }
continue; continue;
case WIZARD: case Class::Wizard:
case NECROMANCER: case Class::Necromancer:
case MAGICIAN: case Class::Magician:
case ENCHANTER: case Class::Enchanter:
if (!bot_puller) { if (!bot_puller) {
bot_puller = bot_iter; bot_puller = bot_iter;
} }
@ -5210,15 +5210,15 @@ void bot_command_track(Client *c, const Seperator *sep)
std::list<Bot*> sbl; std::list<Bot*> sbl;
MyBots::PopulateSBL_BySpawnedBots(c, sbl); MyBots::PopulateSBL_BySpawnedBots(c, sbl);
uint16 class_mask = (PLAYER_CLASS_RANGER_BIT | PLAYER_CLASS_DRUID_BIT | PLAYER_CLASS_BARD_BIT); uint16 class_mask = (player_class_bitmasks[Class::Ranger] | player_class_bitmasks[Class::Druid] | player_class_bitmasks[Class::Bard]);
ActionableBots::Filter_ByClasses(c, sbl, class_mask); ActionableBots::Filter_ByClasses(c, sbl, class_mask);
Bot* my_bot = ActionableBots::AsSpawned_ByMinLevelAndClass(c, sbl, 1, RANGER); Bot* my_bot = ActionableBots::AsSpawned_ByMinLevelAndClass(c, sbl, 1, Class::Ranger);
if (tracking_scope.empty()) { if (tracking_scope.empty()) {
if (!my_bot) if (!my_bot)
my_bot = ActionableBots::AsSpawned_ByMinLevelAndClass(c, sbl, 20, DRUID); my_bot = ActionableBots::AsSpawned_ByMinLevelAndClass(c, sbl, 20, Class::Druid);
if (!my_bot) if (!my_bot)
my_bot = ActionableBots::AsSpawned_ByMinLevelAndClass(c, sbl, 35, BARD); my_bot = ActionableBots::AsSpawned_ByMinLevelAndClass(c, sbl, 35, Class::Bard);
} }
if (!my_bot) { if (!my_bot) {
c->Message(Chat::White, "No bots are capable of performing this action"); c->Message(Chat::White, "No bots are capable of performing this action");
@ -5229,7 +5229,7 @@ void bot_command_track(Client *c, const Seperator *sep)
bool track_named = false; bool track_named = false;
std::string tracking_msg; std::string tracking_msg;
switch (my_bot->GetClass()) { switch (my_bot->GetClass()) {
case RANGER: case Class::Ranger:
if (!tracking_scope.compare("local")) { if (!tracking_scope.compare("local")) {
base_distance = 30; base_distance = 30;
tracking_msg = "Local tracking..."; tracking_msg = "Local tracking...";
@ -5244,11 +5244,11 @@ void bot_command_track(Client *c, const Seperator *sep)
tracking_msg = "Advanced tracking..."; tracking_msg = "Advanced tracking...";
} }
break; break;
case DRUID: case Class::Druid:
base_distance = 30; base_distance = 30;
tracking_msg = "Local tracking..."; tracking_msg = "Local tracking...";
break; break;
case BARD: case Class::Bard:
base_distance = 20; base_distance = 20;
tracking_msg = "Near tracking..."; tracking_msg = "Near tracking...";
break; break;
@ -6612,7 +6612,7 @@ void bot_subcommand_bot_list(Client *c, const Seperator *sep)
).c_str() ).c_str()
); );
for (uint8 class_id = WARRIOR; class_id <= BERSERKER; class_id++) { for (uint8 class_id = Class::Warrior; class_id <= Class::Berserker; class_id++) {
auto class_creation_limit = c->GetBotCreationLimit(class_id); auto class_creation_limit = c->GetBotCreationLimit(class_id);
if (class_creation_limit != overall_bot_creation_limit) { if (class_creation_limit != overall_bot_creation_limit) {
@ -6865,7 +6865,7 @@ void bot_subcommand_bot_spawn(Client *c, const Seperator *sep)
std::string bot_name = sep->arg[1]; std::string bot_name = sep->arg[1];
uint32 bot_id = 0; uint32 bot_id = 0;
uint8 bot_class = NO_CLASS; uint8 bot_class = Class::None;
if (!database.botdb.LoadBotID(c->CharacterID(), bot_name, bot_id, bot_class)) { if (!database.botdb.LoadBotID(c->CharacterID(), bot_name, bot_id, bot_class)) {
c->Message( c->Message(
Chat::White, Chat::White,
@ -6972,22 +6972,22 @@ void bot_subcommand_bot_spawn(Client *c, const Seperator *sep)
static std::string bot_spawn_message[17] = { static std::string bot_spawn_message[17] = {
"I am ready to fight!", // DEFAULT "I am ready to fight!", // DEFAULT
"A solid weapon is my ally!", // WARRIOR "A solid weapon is my ally!", // Class::Warrior
"The pious shall never die!", // CLERIC "The pious shall never die!", // Class::Cleric
"I am the symbol of Light!", // PALADIN "I am the symbol of Light!", // Class::Paladin
"There are enemies near!", // RANGER "There are enemies near!", // Class::Ranger
"Out of the shadows, I step!", // SHADOWKNIGHT "Out of the shadows, I step!", // Class::ShadowKnight
"Nature's fury shall be wrought!", // DRUID "Nature's fury shall be wrought!", // Class::Druid
"Your punishment will be my fist!", // MONK "Your punishment will be my fist!", // Class::Monk
"Music is the overture of battle! ", // BARD "Music is the overture of battle! ", // BARD
"Daggers into the backs of my enemies!", // ROGUE "Daggers into the backs of my enemies!", // Class::Rogue
"More bones to grind!", // SHAMAN "More bones to grind!", // Class::Shaman
"Death is only the beginning!", // NECROMANCER "Death is only the beginning!", // Class::Necromancer
"I am the harbinger of demise!", // WIZARD "I am the harbinger of demise!", // Class::Wizard
"The elements are at my command!", // MAGICIAN "The elements are at my command!", // Class::Magician
"No being can resist my charm!", // ENCHANTER "No being can resist my charm!", // Class::Enchanter
"Battles are won by hand and paw!", // BEASTLORD "Battles are won by hand and paw!", // Class::Beastlord
"My bloodthirst shall not be quenched!" // BERSERKER "My bloodthirst shall not be quenched!" // Class::Berserker
}; };
uint8 message_index = 0; uint8 message_index = 0;
@ -7257,7 +7257,7 @@ void bot_subcommand_bot_toggle_archer(Client *c, const Seperator *sep)
} }
bot_iter->ChangeBotArcherWeapons(bot_iter->IsBotArcher()); bot_iter->ChangeBotArcherWeapons(bot_iter->IsBotArcher());
if (bot_iter->GetClass() == RANGER && bot_iter->GetLevel() >= 61) { if (bot_iter->GetClass() == Class::Ranger && bot_iter->GetLevel() >= 61) {
bot_iter->SetRangerAutoWeaponSelect(bot_iter->IsBotArcher()); bot_iter->SetRangerAutoWeaponSelect(bot_iter->IsBotArcher());
} }
} }
@ -7467,7 +7467,7 @@ void bot_subcommand_circle(Client *c, const Seperator *sep)
return; return;
if (helper_is_help_or_usage(sep->arg[1])) { if (helper_is_help_or_usage(sep->arg[1])) {
c->Message(Chat::White, "usage: %s [list | destination] ([option: single])", sep->arg[0]); c->Message(Chat::White, "usage: %s [list | destination] ([option: single])", sep->arg[0]);
helper_send_usage_required_bots(c, BCEnum::SpT_Depart, DRUID); helper_send_usage_required_bots(c, BCEnum::SpT_Depart, Class::Druid);
return; return;
} }
@ -7478,7 +7478,7 @@ void bot_subcommand_circle(Client *c, const Seperator *sep)
std::string destination = sep->arg[1]; std::string destination = sep->arg[1];
if (!destination.compare("list")) { if (!destination.compare("list")) {
auto my_druid_bot = ActionableBots::AsGroupMember_ByClass(c, c, DRUID); auto my_druid_bot = ActionableBots::AsGroupMember_ByClass(c, c, Class::Druid);
helper_command_depart_list(c, my_druid_bot, nullptr, local_list, single); helper_command_depart_list(c, my_druid_bot, nullptr, local_list, single);
return; return;
} }
@ -7497,7 +7497,7 @@ void bot_subcommand_circle(Client *c, const Seperator *sep)
auto local_entry = list_iter->SafeCastToDepart(); auto local_entry = list_iter->SafeCastToDepart();
if (helper_spell_check_fail(local_entry)) if (helper_spell_check_fail(local_entry))
continue; continue;
if (local_entry->caster_class != DRUID) if (local_entry->caster_class != Class::Druid)
continue; continue;
if (local_entry->single != single) if (local_entry->single != single)
continue; continue;
@ -8988,7 +8988,7 @@ void bot_subcommand_pet_remove(Client *c, const Seperator *sep)
if (ActionableBots::PopulateSBL(c, sep->arg[1], sbl, ab_mask, sep->arg[2]) == ActionableBots::ABT_None) if (ActionableBots::PopulateSBL(c, sep->arg[1], sbl, ab_mask, sep->arg[2]) == ActionableBots::ABT_None)
return; return;
uint16 class_mask = (PLAYER_CLASS_DRUID_BIT | PLAYER_CLASS_NECROMANCER_BIT | PLAYER_CLASS_ENCHANTER_BIT); uint16 class_mask = (player_class_bitmasks[Class::Druid] | player_class_bitmasks[Class::Necromancer] | player_class_bitmasks[Class::Enchanter]);
ActionableBots::Filter_ByClasses(c, sbl, class_mask); ActionableBots::Filter_ByClasses(c, sbl, class_mask);
if (sbl.empty()) { if (sbl.empty()) {
c->Message(Chat::White, "You have no spawned bots capable of charming"); c->Message(Chat::White, "You have no spawned bots capable of charming");
@ -9068,7 +9068,7 @@ void bot_subcommand_pet_set_type(Client *c, const Seperator *sep)
if (ActionableBots::PopulateSBL(c, sep->arg[2], sbl, ab_mask, sep->arg[3]) == ActionableBots::ABT_None) if (ActionableBots::PopulateSBL(c, sep->arg[2], sbl, ab_mask, sep->arg[3]) == ActionableBots::ABT_None)
return; return;
uint16 class_mask = PLAYER_CLASS_MAGICIAN_BIT; uint16 class_mask = player_class_bitmasks[Class::Magician];
ActionableBots::Filter_ByClasses(c, sbl, class_mask); ActionableBots::Filter_ByClasses(c, sbl, class_mask);
if (sbl.empty()) { if (sbl.empty()) {
c->Message(Chat::White, "You have no spawned Magician bots"); c->Message(Chat::White, "You have no spawned Magician bots");
@ -9103,7 +9103,7 @@ void bot_subcommand_portal(Client *c, const Seperator *sep)
return; return;
if (helper_is_help_or_usage(sep->arg[1])) { if (helper_is_help_or_usage(sep->arg[1])) {
c->Message(Chat::White, "usage: %s [list | destination] ([option: single])", sep->arg[0]); c->Message(Chat::White, "usage: %s [list | destination] ([option: single])", sep->arg[0]);
helper_send_usage_required_bots(c, BCEnum::SpT_Depart, WIZARD); helper_send_usage_required_bots(c, BCEnum::SpT_Depart, Class::Wizard);
return; return;
} }
@ -9114,7 +9114,7 @@ void bot_subcommand_portal(Client *c, const Seperator *sep)
std::string destination = sep->arg[1]; std::string destination = sep->arg[1];
if (!destination.compare("list")) { if (!destination.compare("list")) {
auto my_wizard_bot = ActionableBots::AsGroupMember_ByClass(c, c, WIZARD); auto my_wizard_bot = ActionableBots::AsGroupMember_ByClass(c, c, Class::Wizard);
helper_command_depart_list(c, nullptr, my_wizard_bot, local_list, single); helper_command_depart_list(c, nullptr, my_wizard_bot, local_list, single);
return; return;
} }
@ -9133,7 +9133,7 @@ void bot_subcommand_portal(Client *c, const Seperator *sep)
auto local_entry = list_iter->SafeCastToDepart(); auto local_entry = list_iter->SafeCastToDepart();
if (helper_spell_check_fail(local_entry)) if (helper_spell_check_fail(local_entry))
continue; continue;
if (local_entry->caster_class != WIZARD) if (local_entry->caster_class != Class::Wizard)
continue; continue;
if (local_entry->single != single) if (local_entry->single != single)
continue; continue;
@ -9427,26 +9427,26 @@ void helper_bot_out_of_combat(Client *bot_owner, Bot *my_bot)
return; return;
switch (my_bot->GetClass()) { switch (my_bot->GetClass()) {
case WARRIOR: case Class::Warrior:
case CLERIC: case Class::Cleric:
case PALADIN: case Class::Paladin:
case RANGER: case Class::Ranger:
case SHADOWKNIGHT: case Class::ShadowKnight:
case DRUID: case Class::Druid:
case MONK: case Class::Monk:
bot_owner->Message(Chat::White, "%s has no out-of-combat behavior defined", my_bot->GetCleanName()); bot_owner->Message(Chat::White, "%s has no out-of-combat behavior defined", my_bot->GetCleanName());
break; break;
case BARD: case Class::Bard:
bot_owner->Message(Chat::White, "%s will %s use out-of-combat behavior for bard songs", my_bot->GetCleanName(), ((my_bot->GetAltOutOfCombatBehavior()) ? ("now") : ("no longer"))); bot_owner->Message(Chat::White, "%s will %s use out-of-combat behavior for bard songs", my_bot->GetCleanName(), ((my_bot->GetAltOutOfCombatBehavior()) ? ("now") : ("no longer")));
break; break;
case ROGUE: case Class::Rogue:
case SHAMAN: case Class::Shaman:
case NECROMANCER: case Class::Necromancer:
case WIZARD: case Class::Wizard:
case MAGICIAN: case Class::Magician:
case ENCHANTER: case Class::Enchanter:
case BEASTLORD: case Class::Beastlord:
case BERSERKER: case Class::Berserker:
bot_owner->Message(Chat::White, "%s has no out-of-combat behavior defined", my_bot->GetCleanName()); bot_owner->Message(Chat::White, "%s has no out-of-combat behavior defined", my_bot->GetCleanName());
break; break;
default: default:
@ -10457,8 +10457,8 @@ void bot_command_pickpocket(Client *c, const Seperator *sep)
MyBots::PopulateSBL_BySpawnedBots(c, sbl); MyBots::PopulateSBL_BySpawnedBots(c, sbl);
// Check for capable rogue // Check for capable rogue
ActionableBots::Filter_ByClasses(c, sbl, PLAYER_CLASS_ROGUE_BIT); ActionableBots::Filter_ByClasses(c, sbl, player_class_bitmasks[Class::Rogue]);
Bot *my_bot = ActionableBots::AsSpawned_ByMinLevelAndClass(c, sbl, 7, ROGUE); Bot *my_bot = ActionableBots::AsSpawned_ByMinLevelAndClass(c, sbl, 7, Class::Rogue);
if (!my_bot) { if (!my_bot) {
c->Message(Chat::White, "No bots are capable of performing this action"); c->Message(Chat::White, "No bots are capable of performing this action");
return; return;

View File

@ -677,7 +677,7 @@ void helper_command_depart_list(Client* bot_owner, Bot* druid_bot, Bot* wizard_b
bool helper_is_help_or_usage(const char* arg); bool helper_is_help_or_usage(const char* arg);
bool helper_no_available_bots(Client *bot_owner, Bot *my_bot = nullptr); bool helper_no_available_bots(Client *bot_owner, Bot *my_bot = nullptr);
void helper_send_available_subcommands(Client *bot_owner, const char* command_simile, const std::list<const char*>& subcommand_list); void helper_send_available_subcommands(Client *bot_owner, const char* command_simile, const std::list<const char*>& subcommand_list);
void helper_send_usage_required_bots(Client *bot_owner, BCEnum::SpType spell_type, uint8 bot_class = NO_CLASS); void helper_send_usage_required_bots(Client *bot_owner, BCEnum::SpType spell_type, uint8 bot_class = Class::None);
bool helper_spell_check_fail(STBaseEntry* local_entry); bool helper_spell_check_fail(STBaseEntry* local_entry);
bool helper_spell_list_fail(Client *bot_owner, bcst_list* spell_list, BCEnum::SpType spell_type); bool helper_spell_list_fail(Client *bot_owner, bcst_list* spell_list, BCEnum::SpType spell_type);
#endif #endif

View File

@ -141,7 +141,7 @@ bool BotDatabase::LoadBotSpellCastingChances()
if (spell_type_index >= Bot::SPELL_TYPE_COUNT) if (spell_type_index >= Bot::SPELL_TYPE_COUNT)
continue; continue;
uint8 class_index = Strings::ToInt(row[1]); uint8 class_index = Strings::ToInt(row[1]);
if (class_index < WARRIOR || class_index > BERSERKER) if (class_index < Class::Warrior || class_index > Class::Berserker)
continue; continue;
--class_index; --class_index;
uint8 stance_index = Strings::ToInt(row[2]); uint8 stance_index = Strings::ToInt(row[2]);
@ -224,7 +224,7 @@ bool BotDatabase::QueryBotCount(const uint32 owner_id, int class_id, uint32& bot
auto row = results.begin(); auto row = results.begin();
bot_count = Strings::ToUnsignedInt(row[0]); bot_count = Strings::ToUnsignedInt(row[0]);
if (EQ::ValueWithin(class_id, WARRIOR, BERSERKER)) { if (EQ::ValueWithin(class_id, Class::Warrior, Class::Berserker)) {
query = fmt::format( query = fmt::format(
"SELECT COUNT(`bot_id`) FROM `bot_data` WHERE `owner_id` = {} AND `class` = {}", "SELECT COUNT(`bot_id`) FROM `bot_data` WHERE `owner_id` = {} AND `class` = {}",
owner_id, owner_id,
@ -2517,7 +2517,7 @@ uint8 BotDatabase::GetSpellCastingChance(uint8 spell_type_index, uint8 class_ind
{ {
if (spell_type_index >= Bot::SPELL_TYPE_COUNT) if (spell_type_index >= Bot::SPELL_TYPE_COUNT)
return 0; return 0;
if (class_index >= PLAYER_CLASS_COUNT) if (class_index >= Class::PLAYER_CLASS_COUNT)
return 0; return 0;
if (stance_index >= EQ::constants::STANCE_TYPE_COUNT) if (stance_index >= EQ::constants::STANCE_TYPE_COUNT)
return 0; return 0;

View File

@ -101,7 +101,7 @@ bool Bot::AICastSpell(Mob* tar, uint8 iChance, uint32 iSpellTypes) {
bool Bot::BotCastSong(Mob* tar, uint8 botLevel) { bool Bot::BotCastSong(Mob* tar, uint8 botLevel) {
bool casted_spell = false; bool casted_spell = false;
if (GetClass() != BARD || tar != this || IsEngaged()) // Out-of-Combat songs can not be cast in combat if (GetClass() != Class::Bard || tar != this || IsEngaged()) // Out-of-Combat songs can not be cast in combat
return casted_spell; return casted_spell;
for (auto botSongList = GetPrioritizedBotSpellsBySpellType(this, SpellType_OutOfCombatBuffSong); for (auto botSongList = GetPrioritizedBotSpellsBySpellType(this, SpellType_OutOfCombatBuffSong);
@ -169,7 +169,7 @@ bool Bot::BotCastCombatSong(Mob* tar, uint8 botLevel) {
bool Bot::BotCastHateReduction(Mob* tar, uint8 botLevel, const BotSpell& botSpell) { bool Bot::BotCastHateReduction(Mob* tar, uint8 botLevel, const BotSpell& botSpell) {
bool casted_spell = false; bool casted_spell = false;
if (GetClass() == BARD) { if (GetClass() == Class::Bard) {
std::list<BotSpell_wPriority> botSongList = GetPrioritizedBotSpellsBySpellType(this, SpellType_HateRedux); std::list<BotSpell_wPriority> botSongList = GetPrioritizedBotSpellsBySpellType(this, SpellType_HateRedux);
for (auto iter : botSongList) { for (auto iter : botSongList) {
if (!iter.SpellId) if (!iter.SpellId)
@ -220,7 +220,7 @@ bool Bot::BotCastCure(Mob* tar, uint8 botClass, BotSpell& botSpell, Raid* raid)
casted_spell = AIDoSpellCast(botSpell.SpellIndex, tar, botSpell.ManaCost, &TempDontCureMeBeforeTime); casted_spell = AIDoSpellCast(botSpell.SpellIndex, tar, botSpell.ManaCost, &TempDontCureMeBeforeTime);
if (casted_spell && botClass != BARD) { if (casted_spell && botClass != Class::Bard) {
if (IsGroupSpell(botSpell.SpellId)) { if (IsGroupSpell(botSpell.SpellId)) {
if (HasGroup()) { if (HasGroup()) {
Group const* group = GetGroup(); Group const* group = GetGroup();
@ -301,7 +301,7 @@ bool Bot::BotCastSlow(Mob* tar, uint8 botLevel, uint8 botClass, BotSpell& botSpe
} }
switch (botClass) { switch (botClass) {
case BARD: { case Class::Bard: {
// probably needs attackable check // probably needs attackable check
for ( for (
auto botSongList = GetPrioritizedBotSpellsBySpellType(this, SpellType_Slow); auto botSongList = GetPrioritizedBotSpellsBySpellType(this, SpellType_Slow);
@ -339,12 +339,12 @@ bool Bot::BotCastSlow(Mob* tar, uint8 botLevel, uint8 botClass, BotSpell& botSpe
break; break;
} }
case ENCHANTER: { case Class::Enchanter: {
botSpell = GetBestBotSpellForMagicBasedSlow(this); botSpell = GetBestBotSpellForMagicBasedSlow(this);
break; break;
} }
case SHAMAN: case Class::Shaman:
case BEASTLORD: { case Class::Beastlord: {
botSpell = GetBestBotSpellForDiseaseBasedSlow(this); botSpell = GetBestBotSpellForDiseaseBasedSlow(this);
if (botSpell.SpellId == 0 || ((tar->GetMR() - 50) < (tar->GetDR() + spells[botSpell.SpellId].resist_difficulty))) if (botSpell.SpellId == 0 || ((tar->GetMR() - 50) < (tar->GetDR() + spells[botSpell.SpellId].resist_difficulty)))
@ -364,7 +364,7 @@ bool Bot::BotCastSlow(Mob* tar, uint8 botLevel, uint8 botClass, BotSpell& botSpe
casted_spell = AIDoSpellCast(botSpell.SpellIndex, tar, botSpell.ManaCost); casted_spell = AIDoSpellCast(botSpell.SpellIndex, tar, botSpell.ManaCost);
} }
if (casted_spell && GetClass() != BARD) { if (casted_spell && GetClass() != Class::Bard) {
if (raid) { if (raid) {
const auto msg = fmt::format("Attempting to slow {}.", tar->GetCleanName()); const auto msg = fmt::format("Attempting to slow {}.", tar->GetCleanName());
raid->RaidSay(msg.c_str(), GetCleanName(), 0, 100); raid->RaidSay(msg.c_str(), GetCleanName(), 0, 100);
@ -391,7 +391,7 @@ bool Bot::BotCastDOT(Mob* tar, uint8 botLevel, const BotSpell& botSpell, const b
return casted_spell; return casted_spell;
} }
if (GetClass() == BARD) { if (GetClass() == Class::Bard) {
std::list<BotSpell_wPriority> dotList = GetPrioritizedBotSpellsBySpellType(this, SpellType_DOT); std::list<BotSpell_wPriority> dotList = GetPrioritizedBotSpellsBySpellType(this, SpellType_DOT);
const int maxDotSelect = 5; const int maxDotSelect = 5;
@ -569,7 +569,7 @@ bool Bot::BotCastCombatBuff(Mob* tar, uint8 botLevel, uint8 botClass) {
(tar == this && spells[s.SpellId].target_type != ST_TargetsTarget) || (tar == this && spells[s.SpellId].target_type != ST_TargetsTarget) ||
spells[s.SpellId].target_type == ST_Group || spells[s.SpellId].target_type == ST_Group ||
spells[s.SpellId].target_type == ST_GroupTeleport || spells[s.SpellId].target_type == ST_GroupTeleport ||
(botClass == BARD && spells[s.SpellId].target_type == ST_AEBard) (botClass == Class::Bard && spells[s.SpellId].target_type == ST_AEBard)
) && ) &&
!tar->IsImmuneToSpell(s.SpellId, this) && !tar->IsImmuneToSpell(s.SpellId, this) &&
tar->CanBuffStack(s.SpellId, botLevel, true) >= 0 tar->CanBuffStack(s.SpellId, botLevel, true) >= 0
@ -582,7 +582,7 @@ bool Bot::BotCastCombatBuff(Mob* tar, uint8 botLevel, uint8 botClass) {
if ( if (
((IsEffectInSpell(s.SpellId, SE_Levitate) && !zone->CanLevitate()) || ((IsEffectInSpell(s.SpellId, SE_Levitate) && !zone->CanLevitate()) ||
(IsEffectInSpell(s.SpellId, SE_MovementSpeed) && !zone->CanCastOutdoor())) && (IsEffectInSpell(s.SpellId, SE_MovementSpeed) && !zone->CanCastOutdoor())) &&
(botClass != BARD || !IsSpellUsableInThisZoneType(s.SpellId, zone->GetZoneType())) (botClass != Class::Bard || !IsSpellUsableInThisZoneType(s.SpellId, zone->GetZoneType()))
) { ) {
continue; continue;
} }
@ -625,7 +625,7 @@ bool Bot::BotCastCombatBuff(Mob* tar, uint8 botLevel, uint8 botClass) {
} }
} }
// TODO: Add TriggerSpell Support for Exchanter Runes // TODO: Add TriggerSpell Support for Exchanter Runes
if (botClass == ENCHANTER && IsEffectInSpell(s.SpellId, SE_Rune)) { if (botClass == Class::Enchanter && IsEffectInSpell(s.SpellId, SE_Rune)) {
float manaRatioToCast = 75.0f; float manaRatioToCast = 75.0f;
switch(GetBotStance()) { switch(GetBotStance()) {
@ -671,7 +671,7 @@ bool Bot::BotCastCombatBuff(Mob* tar, uint8 botLevel, uint8 botClass) {
bool Bot::BotCastPet(Mob* tar, uint8 botClass, BotSpell& botSpell) { bool Bot::BotCastPet(Mob* tar, uint8 botClass, BotSpell& botSpell) {
bool casted_spell = false; bool casted_spell = false;
if (!IsPet() && !GetPetID() && !IsBotCharmer()) { if (!IsPet() && !GetPetID() && !IsBotCharmer()) {
if (botClass == WIZARD) { if (botClass == Class::Wizard) {
auto buffs_max = GetMaxBuffSlots(); auto buffs_max = GetMaxBuffSlots();
auto my_buffs = GetBuffs(); auto my_buffs = GetBuffs();
int familiar_buff_slot = -1; int familiar_buff_slot = -1;
@ -694,7 +694,7 @@ bool Bot::BotCastPet(Mob* tar, uint8 botClass, BotSpell& botSpell) {
botSpell = GetFirstBotSpellBySpellType(this, SpellType_Pet); botSpell = GetFirstBotSpellBySpellType(this, SpellType_Pet);
} }
else if (botClass == MAGICIAN) { else if (botClass == Class::Magician) {
botSpell = GetBestBotMagicianPetSpell(this); botSpell = GetBestBotMagicianPetSpell(this);
} }
else { else {
@ -735,13 +735,13 @@ bool Bot::BotCastDispel(Mob* tar, BotSpell& botSpell, uint32 iSpellTypes, const
bool Bot::BotCastNuke(Mob* tar, uint8 botLevel, uint8 botClass, BotSpell& botSpell, const bool& checked_los) { bool Bot::BotCastNuke(Mob* tar, uint8 botLevel, uint8 botClass, BotSpell& botSpell, const bool& checked_los) {
bool casted_spell = false; bool casted_spell = false;
if ((tar->GetHPRatio() <= 95.0f) || ((botClass == BARD) || (botClass == SHAMAN) || (botClass == ENCHANTER) || (botClass == PALADIN) || (botClass == SHADOWKNIGHT) || (botClass == WARRIOR))) if ((tar->GetHPRatio() <= 95.0f) || ((botClass == Class::Bard) || (botClass == Class::Shaman) || (botClass == Class::Enchanter) || (botClass == Class::Paladin) || (botClass == Class::ShadowKnight) || (botClass == Class::Warrior)))
{ {
if (!checked_los && (!CheckLosFN(tar) || !CheckWaterLoS(tar))) { if (!checked_los && (!CheckLosFN(tar) || !CheckWaterLoS(tar))) {
return casted_spell; return casted_spell;
} }
if (botClass == CLERIC || botClass == ENCHANTER) if (botClass == Class::Cleric || botClass == Class::Enchanter)
{ {
float manaRatioToCast = 75.0f; float manaRatioToCast = 75.0f;
@ -770,17 +770,17 @@ bool Bot::BotCastNuke(Mob* tar, uint8 botLevel, uint8 botClass, BotSpell& botSpe
return casted_spell; return casted_spell;
} }
if (botClass == MAGICIAN || botClass == SHADOWKNIGHT || botClass == NECROMANCER || botClass == PALADIN || botClass == RANGER || botClass == DRUID || botClass == CLERIC) { if (botClass == Class::Magician || botClass == Class::ShadowKnight || botClass == Class::Necromancer || botClass == Class::Paladin || botClass == Class::Ranger || botClass == Class::Druid || botClass == Class::Cleric) {
if (tar->GetBodyType() == BT_Undead || tar->GetBodyType() == BT_SummonedUndead || tar->GetBodyType() == BT_Vampire) if (tar->GetBodyType() == BT_Undead || tar->GetBodyType() == BT_SummonedUndead || tar->GetBodyType() == BT_Vampire)
botSpell = GetBestBotSpellForNukeByTargetType(this, ST_Undead); botSpell = GetBestBotSpellForNukeByTargetType(this, ST_Undead);
else if (tar->GetBodyType() == BT_Summoned || tar->GetBodyType() == BT_Summoned2 || tar->GetBodyType() == BT_Summoned3) else if (tar->GetBodyType() == BT_Summoned || tar->GetBodyType() == BT_Summoned2 || tar->GetBodyType() == BT_Summoned3)
botSpell = GetBestBotSpellForNukeByTargetType(this, ST_Summoned); botSpell = GetBestBotSpellForNukeByTargetType(this, ST_Summoned);
} }
if ((botClass == PALADIN || botClass == DRUID || botClass == CLERIC || botClass == ENCHANTER || botClass == WIZARD) && !IsValidSpell(botSpell.SpellId)) { if ((botClass == Class::Paladin || botClass == Class::Druid || botClass == Class::Cleric || botClass == Class::Enchanter || botClass == Class::Wizard) && !IsValidSpell(botSpell.SpellId)) {
uint8 stunChance = (tar->IsCasting() ? 30: 15); uint8 stunChance = (tar->IsCasting() ? 30: 15);
if (botClass == PALADIN) { if (botClass == Class::Paladin) {
stunChance = 50; stunChance = 50;
} }
@ -789,7 +789,7 @@ bool Bot::BotCastNuke(Mob* tar, uint8 botLevel, uint8 botClass, BotSpell& botSpe
} }
} }
if (botClass == WIZARD && botSpell.SpellId == 0) { if (botClass == Class::Wizard && botSpell.SpellId == 0) {
botSpell = GetBestBotWizardNukeSpellByTargetResists(this, tar); botSpell = GetBestBotWizardNukeSpellByTargetResists(this, tar);
} }
@ -819,7 +819,7 @@ bool Bot::BotCastEscape(Mob*& tar, uint8 botClass, BotSpell& botSpell, uint32 iS
auto hpr = (uint8) GetHPRatio(); auto hpr = (uint8) GetHPRatio();
bool mayGetAggro = false; bool mayGetAggro = false;
if (hpr > 15 && ((botClass == WIZARD) || (botClass == ENCHANTER) || (botClass == RANGER))) { if (hpr > 15 && ((botClass == Class::Wizard) || (botClass == Class::Enchanter) || (botClass == Class::Ranger))) {
mayGetAggro = HasOrMayGetAggro(); mayGetAggro = HasOrMayGetAggro();
} }
@ -835,7 +835,7 @@ bool Bot::BotCastEscape(Mob*& tar, uint8 botClass, BotSpell& botSpell, uint32 iS
tar = this; //target self for invul type spells tar = this; //target self for invul type spells
} }
if (IsValidSpellRange(botSpell.SpellId, tar) || botClass == BARD) { if (IsValidSpellRange(botSpell.SpellId, tar) || botClass == Class::Bard) {
casted_spell = AIDoSpellCast(botSpell.SpellIndex, tar, botSpell.ManaCost); casted_spell = AIDoSpellCast(botSpell.SpellIndex, tar, botSpell.ManaCost);
} }
} }
@ -877,7 +877,7 @@ bool Bot::BotCastBuff(Mob* tar, uint8 botLevel, uint8 botClass) {
(tar == this && spells[s.SpellId].target_type != ST_TargetsTarget) || (tar == this && spells[s.SpellId].target_type != ST_TargetsTarget) ||
spells[s.SpellId].target_type == ST_Group || spells[s.SpellId].target_type == ST_Group ||
spells[s.SpellId].target_type == ST_GroupTeleport || spells[s.SpellId].target_type == ST_GroupTeleport ||
(botClass == BARD && spells[s.SpellId].target_type == ST_AEBard) (botClass == Class::Bard && spells[s.SpellId].target_type == ST_AEBard)
) && ) &&
!tar->IsImmuneToSpell(s.SpellId, this) && !tar->IsImmuneToSpell(s.SpellId, this) &&
tar->CanBuffStack(s.SpellId, botLevel, true) >= 0 tar->CanBuffStack(s.SpellId, botLevel, true) >= 0
@ -892,7 +892,7 @@ bool Bot::BotCastBuff(Mob* tar, uint8 botLevel, uint8 botClass) {
(IsEffectInSpell(s.SpellId, SE_Levitate) && !zone->CanLevitate()) || (IsEffectInSpell(s.SpellId, SE_Levitate) && !zone->CanLevitate()) ||
(IsEffectInSpell(s.SpellId, SE_MovementSpeed) && !zone->CanCastOutdoor()) (IsEffectInSpell(s.SpellId, SE_MovementSpeed) && !zone->CanCastOutdoor())
) && ) &&
(botClass != BARD || !IsSpellUsableInThisZoneType(s.SpellId, zone->GetZoneType())) (botClass != Class::Bard || !IsSpellUsableInThisZoneType(s.SpellId, zone->GetZoneType()))
) { ) {
continue; continue;
} }
@ -919,7 +919,7 @@ bool Bot::BotCastBuff(Mob* tar, uint8 botLevel, uint8 botClass) {
break; break;
} }
if (botClass == ENCHANTER && IsEffectInSpell(s.SpellId, SE_Rune)) if (botClass == Class::Enchanter && IsEffectInSpell(s.SpellId, SE_Rune))
{ {
float manaRatioToCast = 75.0f; float manaRatioToCast = 75.0f;
@ -1003,17 +1003,17 @@ bool Bot::BotCastHeal(Mob* tar, uint8 botLevel, uint8 botClass, BotSpell& botSpe
isPrimaryHealer = IsGroupHealer(); isPrimaryHealer = IsGroupHealer();
} }
if (hpr < 95 || tar->IsClient() || botClass == BARD) { if (hpr < 95 || tar->IsClient() || botClass == Class::Bard) {
if (tar->GetClass() == NECROMANCER && hpr >= 40) { if (tar->GetClass() == Class::Necromancer && hpr >= 40) {
return false; return false;
} }
if (tar->GetClass() == SHAMAN && hpr >= 80) { if (tar->GetClass() == Class::Shaman && hpr >= 80) {
return false; return false;
} }
// Evaluate the situation // Evaluate the situation
if ((IsEngaged()) && ((botClass == CLERIC) || (botClass == DRUID) || (botClass == SHAMAN) || (botClass == PALADIN))) { if ((IsEngaged()) && ((botClass == Class::Cleric) || (botClass == Class::Druid) || (botClass == Class::Shaman) || (botClass == Class::Paladin))) {
if (tar->GetTarget() && tar->GetTarget()->GetHateTop() && tar->GetTarget()->GetHateTop() == tar) { if (tar->GetTarget() && tar->GetTarget()->GetHateTop() && tar->GetTarget()->GetHateTop() == tar) {
hasAggro = true; hasAggro = true;
} }
@ -1045,7 +1045,7 @@ bool Bot::BotCastHeal(Mob* tar, uint8 botLevel, uint8 botClass, BotSpell& botSpe
} }
} }
} }
else if ((botClass == CLERIC) || (botClass == DRUID) || (botClass == SHAMAN) || (botClass == PALADIN)) { else if ((botClass == Class::Cleric) || (botClass == Class::Druid) || (botClass == Class::Shaman) || (botClass == Class::Paladin)) {
if (GetNumberNeedingHealedInGroup(40, true, raid) >= 2) { if (GetNumberNeedingHealedInGroup(40, true, raid) >= 2) {
botSpell = GetBestBotSpellForGroupCompleteHeal(this); botSpell = GetBestBotSpellForGroupCompleteHeal(this);
@ -1119,7 +1119,7 @@ bool Bot::BotCastHeal(Mob* tar, uint8 botLevel, uint8 botClass, BotSpell& botSpe
if (!IsValidSpell(botSpell.SpellId)) { if (!IsValidSpell(botSpell.SpellId)) {
botSpell = GetFirstBotSpellForSingleTargetHeal(this); botSpell = GetFirstBotSpellForSingleTargetHeal(this);
} }
if (botSpell.SpellId == 0 && botClass == BARD) { if (botSpell.SpellId == 0 && botClass == Class::Bard) {
botSpell = GetFirstBotSpellBySpellType(this, SpellType_Heal); botSpell = GetFirstBotSpellBySpellType(this, SpellType_Heal);
} }
@ -1134,11 +1134,11 @@ bool Bot::BotCastHeal(Mob* tar, uint8 botLevel, uint8 botClass, BotSpell& botSpe
uint32 TempDontHealMeBeforeTime = tar->DontHealMeBefore(); uint32 TempDontHealMeBeforeTime = tar->DontHealMeBefore();
if (IsValidSpellRange(botSpell.SpellId, tar) || botClass == BARD) { if (IsValidSpellRange(botSpell.SpellId, tar) || botClass == Class::Bard) {
casted_spell = AIDoSpellCast(botSpell.SpellIndex, tar, botSpell.ManaCost, &TempDontHealMeBeforeTime); casted_spell = AIDoSpellCast(botSpell.SpellIndex, tar, botSpell.ManaCost, &TempDontHealMeBeforeTime);
} }
if (casted_spell && botClass != BARD) { if (casted_spell && botClass != Class::Bard) {
if (IsGroupSpell(botSpell.SpellId)) { if (IsGroupSpell(botSpell.SpellId)) {
if (HasGroup()) { if (HasGroup()) {
Group *group = GetGroup(); Group *group = GetGroup();
@ -1362,9 +1362,9 @@ bool Bot::AI_IdleCastCheck() {
//Ok, IdleCastCheck depends of class. //Ok, IdleCastCheck depends of class.
switch (GetClass()) { switch (GetClass()) {
// Healers WITHOUT pets will check if a heal is needed before buffing. // Healers WITHOUT pets will check if a heal is needed before buffing.
case CLERIC: case Class::Cleric:
case PALADIN: case Class::Paladin:
case RANGER: { case Class::Ranger: {
if (!entity_list.Bot_AICheckCloseBeneficialSpells(this, 100, BotAISpellRange, SpellType_Cure)) { if (!entity_list.Bot_AICheckCloseBeneficialSpells(this, 100, BotAISpellRange, SpellType_Cure)) {
if (!AICastSpell(this, 100, SpellType_Heal)) { if (!AICastSpell(this, 100, SpellType_Heal)) {
if (!entity_list.Bot_AICheckCloseBeneficialSpells(this, 100, BotAISpellRange, SpellType_Heal)) { if (!entity_list.Bot_AICheckCloseBeneficialSpells(this, 100, BotAISpellRange, SpellType_Heal)) {
@ -1379,10 +1379,10 @@ bool Bot::AI_IdleCastCheck() {
result = true; result = true;
break; break;
} }
case MONK: case Class::Monk:
case ROGUE: case Class::Rogue:
case WARRIOR: case Class::Warrior:
case BERSERKER: { case Class::Berserker: {
if (!AICastSpell(this, 100, SpellType_Cure)) { if (!AICastSpell(this, 100, SpellType_Cure)) {
if (!AICastSpell(this, 100, SpellType_Heal)) { if (!AICastSpell(this, 100, SpellType_Heal)) {
if (!AICastSpell(this, 100, SpellType_Buff)) { if (!AICastSpell(this, 100, SpellType_Buff)) {
@ -1397,10 +1397,10 @@ bool Bot::AI_IdleCastCheck() {
} }
// Pets class will first cast their pet, then buffs // Pets class will first cast their pet, then buffs
case MAGICIAN: case Class::Magician:
case SHADOWKNIGHT: case Class::ShadowKnight:
case NECROMANCER: case Class::Necromancer:
case ENCHANTER: { case Class::Enchanter: {
if (!AICastSpell(this, 100, SpellType_Pet)) { if (!AICastSpell(this, 100, SpellType_Pet)) {
if (!AICastSpell(this, 100, SpellType_Cure)) { if (!AICastSpell(this, 100, SpellType_Cure)) {
if (!AICastSpell(GetPet(), 100, SpellType_Cure)) { if (!AICastSpell(GetPet(), 100, SpellType_Cure)) {
@ -1417,9 +1417,9 @@ bool Bot::AI_IdleCastCheck() {
result = true; result = true;
break; break;
} }
case DRUID: case Class::Druid:
case SHAMAN: case Class::Shaman:
case BEASTLORD: { case Class::Beastlord: {
if (!entity_list.Bot_AICheckCloseBeneficialSpells(this, 100, BotAISpellRange, SpellType_Cure)) { if (!entity_list.Bot_AICheckCloseBeneficialSpells(this, 100, BotAISpellRange, SpellType_Cure)) {
if (!AICastSpell(this, 100, SpellType_Pet)) { if (!AICastSpell(this, 100, SpellType_Pet)) {
if (!AICastSpell(this, 100, SpellType_Heal)) { if (!AICastSpell(this, 100, SpellType_Heal)) {
@ -1438,7 +1438,7 @@ bool Bot::AI_IdleCastCheck() {
result = true; result = true;
break; break;
} }
case WIZARD: { // This can eventually be move into the BEASTLORD case handler once pre-combat is fully implemented case Class::Wizard: { // This can eventually be move into the Class::Beastlord case handler once pre-combat is fully implemented
if (pre_combat) { if (pre_combat) {
if (!AICastSpell(this, 100, SpellType_Pet)) { if (!AICastSpell(this, 100, SpellType_Pet)) {
if (!AICastSpell(this, 100, SpellType_Cure)) { if (!AICastSpell(this, 100, SpellType_Cure)) {
@ -1469,7 +1469,7 @@ bool Bot::AI_IdleCastCheck() {
result = true; result = true;
break; break;
} }
case BARD: { case Class::Bard: {
if (pre_combat) { if (pre_combat) {
if (!entity_list.Bot_AICheckCloseBeneficialSpells(this, 100, BotAISpellRange, SpellType_Cure)) { if (!entity_list.Bot_AICheckCloseBeneficialSpells(this, 100, BotAISpellRange, SpellType_Cure)) {
if (!AICastSpell(this, 100, SpellType_Buff)) { if (!AICastSpell(this, 100, SpellType_Buff)) {
@ -1518,7 +1518,7 @@ bool Bot::AI_EngagedCastCheck() {
LogAIDetail("Engaged autocast check triggered (BOTS). Trying to cast healing spells then maybe offensive spells"); LogAIDetail("Engaged autocast check triggered (BOTS). Trying to cast healing spells then maybe offensive spells");
if (botClass == CLERIC) { if (botClass == Class::Cleric) {
if (!AICastSpell(GetTarget(), GetChanceToCastBySpellType(SpellType_Escape), SpellType_Escape)) { if (!AICastSpell(GetTarget(), GetChanceToCastBySpellType(SpellType_Escape), SpellType_Escape)) {
if (!AICastSpell(this, GetChanceToCastBySpellType(SpellType_Heal), SpellType_Heal)) { if (!AICastSpell(this, GetChanceToCastBySpellType(SpellType_Heal), SpellType_Heal)) {
if (!entity_list.Bot_AICheckCloseBeneficialSpells(this, GetChanceToCastBySpellType(SpellType_Heal), BotAISpellRange, SpellType_Heal)) { if (!entity_list.Bot_AICheckCloseBeneficialSpells(this, GetChanceToCastBySpellType(SpellType_Heal), BotAISpellRange, SpellType_Heal)) {
@ -1534,7 +1534,7 @@ bool Bot::AI_EngagedCastCheck() {
} }
} }
} }
else if (botClass == DRUID) { else if (botClass == Class::Druid) {
if (!AICastSpell(GetTarget(), GetChanceToCastBySpellType(SpellType_Escape), SpellType_Escape)) { if (!AICastSpell(GetTarget(), GetChanceToCastBySpellType(SpellType_Escape), SpellType_Escape)) {
if (!AICastSpell(this, GetChanceToCastBySpellType(SpellType_Heal), SpellType_Heal)) { if (!AICastSpell(this, GetChanceToCastBySpellType(SpellType_Heal), SpellType_Heal)) {
if (!entity_list.Bot_AICheckCloseBeneficialSpells(this, GetChanceToCastBySpellType(SpellType_Heal), BotAISpellRange, SpellType_Heal)) { if (!entity_list.Bot_AICheckCloseBeneficialSpells(this, GetChanceToCastBySpellType(SpellType_Heal), BotAISpellRange, SpellType_Heal)) {
@ -1552,7 +1552,7 @@ bool Bot::AI_EngagedCastCheck() {
} }
} }
} }
else if (botClass == SHAMAN) { else if (botClass == Class::Shaman) {
if (!AICastSpell(GetTarget(), GetChanceToCastBySpellType(SpellType_Escape), SpellType_Escape)) { if (!AICastSpell(GetTarget(), GetChanceToCastBySpellType(SpellType_Escape), SpellType_Escape)) {
if (!AICastSpell(GetTarget(), GetChanceToCastBySpellType(SpellType_Slow), SpellType_Slow)) { if (!AICastSpell(GetTarget(), GetChanceToCastBySpellType(SpellType_Slow), SpellType_Slow)) {
if (!AICastSpell(this, GetChanceToCastBySpellType(SpellType_Heal), SpellType_Heal)) { if (!AICastSpell(this, GetChanceToCastBySpellType(SpellType_Heal), SpellType_Heal)) {
@ -1573,7 +1573,7 @@ bool Bot::AI_EngagedCastCheck() {
} }
} }
} }
else if (botClass == RANGER) { else if (botClass == Class::Ranger) {
if (!AICastSpell(GetTarget(), GetChanceToCastBySpellType(SpellType_Escape), SpellType_Escape)) { if (!AICastSpell(GetTarget(), GetChanceToCastBySpellType(SpellType_Escape), SpellType_Escape)) {
if (!AICastSpell(this, GetChanceToCastBySpellType(SpellType_Heal), SpellType_Heal)) { if (!AICastSpell(this, GetChanceToCastBySpellType(SpellType_Heal), SpellType_Heal)) {
if (!entity_list.Bot_AICheckCloseBeneficialSpells(this, GetChanceToCastBySpellType(SpellType_InCombatBuff), BotAISpellRange, SpellType_InCombatBuff)) { if (!entity_list.Bot_AICheckCloseBeneficialSpells(this, GetChanceToCastBySpellType(SpellType_InCombatBuff), BotAISpellRange, SpellType_InCombatBuff)) {
@ -1588,7 +1588,7 @@ bool Bot::AI_EngagedCastCheck() {
} }
} }
} }
else if (botClass == BEASTLORD) { else if (botClass == Class::Beastlord) {
if (!AICastSpell(GetTarget(), GetChanceToCastBySpellType(SpellType_Slow), SpellType_Slow)) { if (!AICastSpell(GetTarget(), GetChanceToCastBySpellType(SpellType_Slow), SpellType_Slow)) {
if (!AICastSpell(this, GetChanceToCastBySpellType(SpellType_Heal), SpellType_Heal)) { if (!AICastSpell(this, GetChanceToCastBySpellType(SpellType_Heal), SpellType_Heal)) {
if (!AICastSpell(GetTarget(), GetChanceToCastBySpellType(SpellType_Debuff), SpellType_Debuff)) { if (!AICastSpell(GetTarget(), GetChanceToCastBySpellType(SpellType_Debuff), SpellType_Debuff)) {
@ -1609,7 +1609,7 @@ bool Bot::AI_EngagedCastCheck() {
} }
} }
} }
else if (botClass == WIZARD) { else if (botClass == Class::Wizard) {
if (!AICastSpell(GetTarget(), GetChanceToCastBySpellType(SpellType_Escape), SpellType_Escape)) { if (!AICastSpell(GetTarget(), GetChanceToCastBySpellType(SpellType_Escape), SpellType_Escape)) {
if (!AICastSpell(GetTarget(), GetChanceToCastBySpellType(SpellType_Debuff), SpellType_Debuff)) { if (!AICastSpell(GetTarget(), GetChanceToCastBySpellType(SpellType_Debuff), SpellType_Debuff)) {
if (!entity_list.Bot_AICheckCloseBeneficialSpells(this, GetChanceToCastBySpellType(SpellType_InCombatBuff), BotAISpellRange, SpellType_InCombatBuff)) { if (!entity_list.Bot_AICheckCloseBeneficialSpells(this, GetChanceToCastBySpellType(SpellType_InCombatBuff), BotAISpellRange, SpellType_InCombatBuff)) {
@ -1620,7 +1620,7 @@ bool Bot::AI_EngagedCastCheck() {
} }
} }
} }
else if (botClass == PALADIN) { else if (botClass == Class::Paladin) {
if (!AICastSpell(this, GetChanceToCastBySpellType(SpellType_Heal), SpellType_Heal)) { if (!AICastSpell(this, GetChanceToCastBySpellType(SpellType_Heal), SpellType_Heal)) {
if (!entity_list.Bot_AICheckCloseBeneficialSpells(this, GetChanceToCastBySpellType(SpellType_InCombatBuff), BotAISpellRange, SpellType_InCombatBuff)) { if (!entity_list.Bot_AICheckCloseBeneficialSpells(this, GetChanceToCastBySpellType(SpellType_InCombatBuff), BotAISpellRange, SpellType_InCombatBuff)) {
if (!AICastSpell(GetTarget(), GetChanceToCastBySpellType(SpellType_Debuff), SpellType_Debuff)) { if (!AICastSpell(GetTarget(), GetChanceToCastBySpellType(SpellType_Debuff), SpellType_Debuff)) {
@ -1633,7 +1633,7 @@ bool Bot::AI_EngagedCastCheck() {
} }
} }
} }
else if (botClass == SHADOWKNIGHT) { else if (botClass == Class::ShadowKnight) {
if (!AICastSpell(GetTarget(), GetChanceToCastBySpellType(SpellType_Lifetap), SpellType_Lifetap)) { if (!AICastSpell(GetTarget(), GetChanceToCastBySpellType(SpellType_Lifetap), SpellType_Lifetap)) {
if (!entity_list.Bot_AICheckCloseBeneficialSpells(this, GetChanceToCastBySpellType(SpellType_InCombatBuff), BotAISpellRange, SpellType_InCombatBuff)) { if (!entity_list.Bot_AICheckCloseBeneficialSpells(this, GetChanceToCastBySpellType(SpellType_InCombatBuff), BotAISpellRange, SpellType_InCombatBuff)) {
if (!AICastSpell(GetTarget(), GetChanceToCastBySpellType(SpellType_Debuff), SpellType_Debuff)) { if (!AICastSpell(GetTarget(), GetChanceToCastBySpellType(SpellType_Debuff), SpellType_Debuff)) {
@ -1646,7 +1646,7 @@ bool Bot::AI_EngagedCastCheck() {
} }
} }
} }
else if (botClass == MAGICIAN) { else if (botClass == Class::Magician) {
if (!AICastSpell(this, GetChanceToCastBySpellType(SpellType_Pet), SpellType_Pet)) { if (!AICastSpell(this, GetChanceToCastBySpellType(SpellType_Pet), SpellType_Pet)) {
if (!AICastSpell(GetTarget(), GetChanceToCastBySpellType(SpellType_Debuff), SpellType_Debuff)) { if (!AICastSpell(GetTarget(), GetChanceToCastBySpellType(SpellType_Debuff), SpellType_Debuff)) {
if (!entity_list.Bot_AICheckCloseBeneficialSpells(this, GetChanceToCastBySpellType(SpellType_InCombatBuff), BotAISpellRange, SpellType_InCombatBuff)) { if (!entity_list.Bot_AICheckCloseBeneficialSpells(this, GetChanceToCastBySpellType(SpellType_InCombatBuff), BotAISpellRange, SpellType_InCombatBuff)) {
@ -1659,7 +1659,7 @@ bool Bot::AI_EngagedCastCheck() {
} }
} }
} }
else if (botClass == NECROMANCER) { else if (botClass == Class::Necromancer) {
if (!AICastSpell(GetTarget(), GetChanceToCastBySpellType(SpellType_Escape), SpellType_Escape)) { if (!AICastSpell(GetTarget(), GetChanceToCastBySpellType(SpellType_Escape), SpellType_Escape)) {
if (!AICastSpell(this, GetChanceToCastBySpellType(SpellType_Pet), SpellType_Pet)) { if (!AICastSpell(this, GetChanceToCastBySpellType(SpellType_Pet), SpellType_Pet)) {
if (!AICastSpell(GetTarget(), GetChanceToCastBySpellType(SpellType_Debuff), SpellType_Debuff)) { if (!AICastSpell(GetTarget(), GetChanceToCastBySpellType(SpellType_Debuff), SpellType_Debuff)) {
@ -1678,7 +1678,7 @@ bool Bot::AI_EngagedCastCheck() {
} }
} }
} }
else if (botClass == ENCHANTER) { else if (botClass == Class::Enchanter) {
if (!AICastSpell(GetTarget(), GetChanceToCastBySpellType(SpellType_Mez), SpellType_Mez)) { if (!AICastSpell(GetTarget(), GetChanceToCastBySpellType(SpellType_Mez), SpellType_Mez)) {
if (!AICastSpell(GetTarget(), GetChanceToCastBySpellType(SpellType_Escape), SpellType_Escape)) { if (!AICastSpell(GetTarget(), GetChanceToCastBySpellType(SpellType_Escape), SpellType_Escape)) {
if (!AICastSpell(GetTarget(), GetChanceToCastBySpellType(SpellType_Slow), SpellType_Slow)) { if (!AICastSpell(GetTarget(), GetChanceToCastBySpellType(SpellType_Slow), SpellType_Slow)) {
@ -1695,7 +1695,7 @@ bool Bot::AI_EngagedCastCheck() {
} }
} }
} }
else if (botClass == BARD) { else if (botClass == Class::Bard) {
if (!AICastSpell(GetTarget(), GetChanceToCastBySpellType(SpellType_Escape), SpellType_Escape)) {// Bards will use their escape songs if (!AICastSpell(GetTarget(), GetChanceToCastBySpellType(SpellType_Escape), SpellType_Escape)) {// Bards will use their escape songs
if (!entity_list.Bot_AICheckCloseBeneficialSpells(this, GetChanceToCastBySpellType(SpellType_HateRedux), BotAISpellRange, SpellType_HateRedux)) { if (!entity_list.Bot_AICheckCloseBeneficialSpells(this, GetChanceToCastBySpellType(SpellType_HateRedux), BotAISpellRange, SpellType_HateRedux)) {
if (!AICastSpell(GetTarget(), GetChanceToCastBySpellType(SpellType_Slow), SpellType_Slow)) { if (!AICastSpell(GetTarget(), GetChanceToCastBySpellType(SpellType_Slow), SpellType_Slow)) {
@ -1714,7 +1714,7 @@ bool Bot::AI_EngagedCastCheck() {
} }
} }
} }
else if (botClass == BERSERKER) { else if (botClass == Class::Berserker) {
if (!AICastSpell(GetTarget(), GetChanceToCastBySpellType(SpellType_Escape), SpellType_Escape)) { if (!AICastSpell(GetTarget(), GetChanceToCastBySpellType(SpellType_Escape), SpellType_Escape)) {
if (!AICastSpell(this, GetChanceToCastBySpellType(SpellType_Heal), SpellType_Heal)) { if (!AICastSpell(this, GetChanceToCastBySpellType(SpellType_Heal), SpellType_Heal)) {
if (!AICastSpell(GetTarget(), GetChanceToCastBySpellType(SpellType_Debuff), SpellType_Debuff)) { if (!AICastSpell(GetTarget(), GetChanceToCastBySpellType(SpellType_Debuff), SpellType_Debuff)) {
@ -1731,7 +1731,7 @@ bool Bot::AI_EngagedCastCheck() {
} }
} }
} }
else if (botClass == MONK) { else if (botClass == Class::Monk) {
if (!AICastSpell(GetTarget(), GetChanceToCastBySpellType(SpellType_Escape), SpellType_Escape)) { if (!AICastSpell(GetTarget(), GetChanceToCastBySpellType(SpellType_Escape), SpellType_Escape)) {
if (!AICastSpell(this, GetChanceToCastBySpellType(SpellType_Heal), SpellType_Heal)) { if (!AICastSpell(this, GetChanceToCastBySpellType(SpellType_Heal), SpellType_Heal)) {
if (!AICastSpell(GetTarget(), GetChanceToCastBySpellType(SpellType_Debuff), SpellType_Debuff)) { if (!AICastSpell(GetTarget(), GetChanceToCastBySpellType(SpellType_Debuff), SpellType_Debuff)) {
@ -1748,7 +1748,7 @@ bool Bot::AI_EngagedCastCheck() {
} }
} }
} }
else if (botClass == ROGUE) { else if (botClass == Class::Rogue) {
if (!AICastSpell(GetTarget(), GetChanceToCastBySpellType(SpellType_Escape), SpellType_Escape)) { if (!AICastSpell(GetTarget(), GetChanceToCastBySpellType(SpellType_Escape), SpellType_Escape)) {
if (!AICastSpell(this, GetChanceToCastBySpellType(SpellType_Heal), SpellType_Heal)) { if (!AICastSpell(this, GetChanceToCastBySpellType(SpellType_Heal), SpellType_Heal)) {
if (!AICastSpell(GetTarget(), GetChanceToCastBySpellType(SpellType_Debuff), SpellType_Debuff)) { if (!AICastSpell(GetTarget(), GetChanceToCastBySpellType(SpellType_Debuff), SpellType_Debuff)) {
@ -1765,7 +1765,7 @@ bool Bot::AI_EngagedCastCheck() {
} }
} }
} }
else if (botClass == WARRIOR) { else if (botClass == Class::Warrior) {
if (!AICastSpell(this, GetChanceToCastBySpellType(SpellType_Heal), SpellType_Heal)) { if (!AICastSpell(this, GetChanceToCastBySpellType(SpellType_Heal), SpellType_Heal)) {
if (!entity_list.Bot_AICheckCloseBeneficialSpells(this, GetChanceToCastBySpellType(SpellType_InCombatBuff), BotAISpellRange, SpellType_InCombatBuff)) { if (!entity_list.Bot_AICheckCloseBeneficialSpells(this, GetChanceToCastBySpellType(SpellType_InCombatBuff), BotAISpellRange, SpellType_InCombatBuff)) {
if (!AICastSpell(GetTarget(), GetChanceToCastBySpellType(SpellType_Debuff), SpellType_Debuff)) { if (!AICastSpell(GetTarget(), GetChanceToCastBySpellType(SpellType_Debuff), SpellType_Debuff)) {
@ -3000,7 +3000,7 @@ uint8 Bot::GetChanceToCastBySpellType(uint32 spellType)
return 0; return 0;
uint8 class_index = GetClass(); uint8 class_index = GetClass();
if (class_index > BERSERKER || class_index < WARRIOR) if (class_index > Class::Berserker || class_index < Class::Warrior)
return 0; return 0;
--class_index; --class_index;

View File

@ -2676,7 +2676,7 @@ bool Client::HasSkill(EQ::skills::SkillType skill_id) const {
} }
bool Client::CanHaveSkill(EQ::skills::SkillType skill_id) const { bool Client::CanHaveSkill(EQ::skills::SkillType skill_id) const {
if (ClientVersion() < EQ::versions::ClientVersion::RoF2 && class_ == BERSERKER && skill_id == EQ::skills::Skill1HPiercing) if (ClientVersion() < EQ::versions::ClientVersion::RoF2 && class_ == Class::Berserker && skill_id == EQ::skills::Skill1HPiercing)
skill_id = EQ::skills::Skill2HPiercing; skill_id = EQ::skills::Skill2HPiercing;
return(content_db.GetSkillCap(GetClass(), skill_id, RuleI(Character, MaxLevel)) > 0); return(content_db.GetSkillCap(GetClass(), skill_id, RuleI(Character, MaxLevel)) > 0);
@ -2684,7 +2684,7 @@ bool Client::CanHaveSkill(EQ::skills::SkillType skill_id) const {
} }
uint16 Client::MaxSkill(EQ::skills::SkillType skillid, uint16 class_, uint16 level) const { uint16 Client::MaxSkill(EQ::skills::SkillType skillid, uint16 class_, uint16 level) const {
if (ClientVersion() < EQ::versions::ClientVersion::RoF2 && class_ == BERSERKER && skillid == EQ::skills::Skill1HPiercing) if (ClientVersion() < EQ::versions::ClientVersion::RoF2 && class_ == Class::Berserker && skillid == EQ::skills::Skill1HPiercing)
skillid = EQ::skills::Skill2HPiercing; skillid = EQ::skills::Skill2HPiercing;
return(content_db.GetSkillCap(class_, skillid, level)); return(content_db.GetSkillCap(class_, skillid, level));
@ -2692,7 +2692,7 @@ uint16 Client::MaxSkill(EQ::skills::SkillType skillid, uint16 class_, uint16 lev
uint8 Client::SkillTrainLevel(EQ::skills::SkillType skillid, uint16 class_) uint8 Client::SkillTrainLevel(EQ::skills::SkillType skillid, uint16 class_)
{ {
if (ClientVersion() < EQ::versions::ClientVersion::RoF2 && class_ == BERSERKER && skillid == EQ::skills::Skill1HPiercing) if (ClientVersion() < EQ::versions::ClientVersion::RoF2 && class_ == Class::Berserker && skillid == EQ::skills::Skill1HPiercing)
skillid = EQ::skills::Skill2HPiercing; skillid = EQ::skills::Skill2HPiercing;
return(content_db.GetTrainLevel(class_, skillid, RuleI(Character, MaxLevel))); return(content_db.GetTrainLevel(class_, skillid, RuleI(Character, MaxLevel)));
@ -3028,7 +3028,7 @@ bool Client::BindWound(Mob *bindmob, bool start, bool fail)
int max_percent = 50 + maxHPBonus; int max_percent = 50 + maxHPBonus;
if (GetClass() == MONK && GetSkill(EQ::skills::SkillBindWound) > 200) { if (GetClass() == Class::Monk && GetSkill(EQ::skills::SkillBindWound) > 200) {
max_percent = 70 + maxHPBonus; max_percent = 70 + maxHPBonus;
} }
@ -3077,9 +3077,9 @@ bool Client::BindWound(Mob *bindmob, bool start, bool fail)
else { else {
int percent_base = 50; int percent_base = 50;
if (GetRawSkill(EQ::skills::SkillBindWound) > 200) { if (GetRawSkill(EQ::skills::SkillBindWound) > 200) {
if ((GetClass() == MONK) || (GetClass() == BEASTLORD)) if ((GetClass() == Class::Monk) || (GetClass() == Class::Beastlord))
percent_base = 70; percent_base = 70;
else if ((GetLevel() > 50) && ((GetClass() == WARRIOR) || (GetClass() == ROGUE) || (GetClass() == CLERIC))) else if ((GetLevel() > 50) && ((GetClass() == Class::Warrior) || (GetClass() == Class::Rogue) || (GetClass() == Class::Cleric)))
percent_base = 70; percent_base = 70;
} }
@ -4232,7 +4232,7 @@ void Client::UpdateLFP() {
for(unsigned int i=0; i<MAX_GROUP_MEMBERS; i++) { for(unsigned int i=0; i<MAX_GROUP_MEMBERS; i++) {
LFPMembers[i].Name[0] = '\0'; LFPMembers[i].Name[0] = '\0';
LFPMembers[i].Class = NO_CLASS; LFPMembers[i].Class = Class::None;
LFPMembers[i].Level = 0; LFPMembers[i].Level = 0;
LFPMembers[i].Zone = 0; LFPMembers[i].Zone = 0;
} }
@ -4849,7 +4849,7 @@ void Client::HandleLDoNOpen(NPC *target)
{ {
if(target) if(target)
{ {
if(target->GetClass() != LDON_TREASURE) if(target->GetClass() != Class::LDoNTreasure)
{ {
LogDebug("[{}] tried to open [{}] but [{}] was not a treasure chest", LogDebug("[{}] tried to open [{}] but [{}] was not a treasure chest",
GetName(), target->GetName(), target->GetName()); GetName(), target->GetName(), target->GetName());
@ -4918,7 +4918,7 @@ void Client::HandleLDoNOpen(NPC *target)
void Client::HandleLDoNSenseTraps(NPC *target, uint16 skill, uint8 type) void Client::HandleLDoNSenseTraps(NPC *target, uint16 skill, uint8 type)
{ {
if(target && target->GetClass() == LDON_TREASURE) if(target && target->GetClass() == Class::LDoNTreasure)
{ {
if(target->IsLDoNTrapped()) if(target->IsLDoNTrapped())
{ {
@ -4961,7 +4961,7 @@ void Client::HandleLDoNDisarm(NPC *target, uint16 skill, uint8 type)
{ {
if(target) if(target)
{ {
if(target->GetClass() == LDON_TREASURE) if(target->GetClass() == Class::LDoNTreasure)
{ {
if(!target->IsLDoNTrapped()) if(!target->IsLDoNTrapped())
{ {
@ -5011,7 +5011,7 @@ void Client::HandleLDoNPickLock(NPC *target, uint16 skill, uint8 type)
{ {
if(target) if(target)
{ {
if(target->GetClass() == LDON_TREASURE) if(target->GetClass() == Class::LDoNTreasure)
{ {
if(target->IsLDoNTrapped()) if(target->IsLDoNTrapped())
{ {
@ -8603,20 +8603,20 @@ void Client::InitInnates()
} }
switch (class_) { switch (class_) {
case DRUID: case Class::Druid:
m_pp.InnateSkills[InnateHarmony] = InnateEnabled; m_pp.InnateSkills[InnateHarmony] = InnateEnabled;
break; break;
case BARD: case Class::Bard:
m_pp.InnateSkills[InnateReveal] = InnateEnabled; m_pp.InnateSkills[InnateReveal] = InnateEnabled;
break; break;
case ROGUE: case Class::Rogue:
m_pp.InnateSkills[InnateSurprise] = InnateEnabled; m_pp.InnateSkills[InnateSurprise] = InnateEnabled;
m_pp.InnateSkills[InnateReveal] = InnateEnabled; m_pp.InnateSkills[InnateReveal] = InnateEnabled;
break; break;
case RANGER: case Class::Ranger:
m_pp.InnateSkills[InnateAwareness] = InnateEnabled; m_pp.InnateSkills[InnateAwareness] = InnateEnabled;
break; break;
case MONK: case Class::Monk:
m_pp.InnateSkills[InnateSurprise] = InnateEnabled; m_pp.InnateSkills[InnateSurprise] = InnateEnabled;
m_pp.InnateSkills[InnateAwareness] = InnateEnabled; m_pp.InnateSkills[InnateAwareness] = InnateEnabled;
default: default:
@ -9754,7 +9754,7 @@ std::vector<int> Client::GetLearnableDisciplines(uint8 min_level, uint8 max_leve
continue; continue;
} }
if (spells[spell_id].classes[WARRIOR] == 0) { if (spells[spell_id].classes[Class::Warrior] == 0) {
continue; continue;
} }
@ -9825,7 +9825,7 @@ std::vector<int> Client::GetScribeableSpells(uint8 min_level, uint8 max_level) {
continue; continue;
} }
if (spells[spell_id].classes[WARRIOR] == 0) { if (spells[spell_id].classes[Class::Warrior] == 0) {
continue; continue;
} }
@ -10694,37 +10694,37 @@ uint16 Client::LearnDisciplines(uint8 min_level, uint8 max_level)
uint16 Client::GetClassTrackingDistanceMultiplier(uint16 class_) { uint16 Client::GetClassTrackingDistanceMultiplier(uint16 class_) {
switch (class_) { switch (class_) {
case WARRIOR: case Class::Warrior:
return RuleI(Character, WarriorTrackingDistanceMultiplier); return RuleI(Character, WarriorTrackingDistanceMultiplier);
case CLERIC: case Class::Cleric:
return RuleI(Character, ClericTrackingDistanceMultiplier); return RuleI(Character, ClericTrackingDistanceMultiplier);
case PALADIN: case Class::Paladin:
return RuleI(Character, PaladinTrackingDistanceMultiplier); return RuleI(Character, PaladinTrackingDistanceMultiplier);
case RANGER: case Class::Ranger:
return RuleI(Character, RangerTrackingDistanceMultiplier); return RuleI(Character, RangerTrackingDistanceMultiplier);
case SHADOWKNIGHT: case Class::ShadowKnight:
return RuleI(Character, ShadowKnightTrackingDistanceMultiplier); return RuleI(Character, ShadowKnightTrackingDistanceMultiplier);
case DRUID: case Class::Druid:
return RuleI(Character, DruidTrackingDistanceMultiplier); return RuleI(Character, DruidTrackingDistanceMultiplier);
case MONK: case Class::Monk:
return RuleI(Character, MonkTrackingDistanceMultiplier); return RuleI(Character, MonkTrackingDistanceMultiplier);
case BARD: case Class::Bard:
return RuleI(Character, BardTrackingDistanceMultiplier); return RuleI(Character, BardTrackingDistanceMultiplier);
case ROGUE: case Class::Rogue:
return RuleI(Character, RogueTrackingDistanceMultiplier); return RuleI(Character, RogueTrackingDistanceMultiplier);
case SHAMAN: case Class::Shaman:
return RuleI(Character, ShamanTrackingDistanceMultiplier); return RuleI(Character, ShamanTrackingDistanceMultiplier);
case NECROMANCER: case Class::Necromancer:
return RuleI(Character, NecromancerTrackingDistanceMultiplier); return RuleI(Character, NecromancerTrackingDistanceMultiplier);
case WIZARD: case Class::Wizard:
return RuleI(Character, WizardTrackingDistanceMultiplier); return RuleI(Character, WizardTrackingDistanceMultiplier);
case MAGICIAN: case Class::Magician:
return RuleI(Character, MagicianTrackingDistanceMultiplier); return RuleI(Character, MagicianTrackingDistanceMultiplier);
case ENCHANTER: case Class::Enchanter:
return RuleI(Character, EnchanterTrackingDistanceMultiplier); return RuleI(Character, EnchanterTrackingDistanceMultiplier);
case BEASTLORD: case Class::Beastlord:
return RuleI(Character, BeastlordTrackingDistanceMultiplier); return RuleI(Character, BeastlordTrackingDistanceMultiplier);
case BERSERKER: case Class::Berserker:
return RuleI(Character, BerserkerTrackingDistanceMultiplier); return RuleI(Character, BerserkerTrackingDistanceMultiplier);
default: default:
return 0; return 0;

View File

@ -2045,14 +2045,14 @@ public:
bool GetBotPrecombat() { return m_bot_precombat; } bool GetBotPrecombat() { return m_bot_precombat; }
void SetBotPrecombat(bool flag = true) { m_bot_precombat = flag; } void SetBotPrecombat(bool flag = true) { m_bot_precombat = flag; }
int GetBotRequiredLevel(uint8 class_id = NO_CLASS); int GetBotRequiredLevel(uint8 class_id = Class::None);
uint32 GetBotCreationLimit(uint8 class_id = NO_CLASS); uint32 GetBotCreationLimit(uint8 class_id = Class::None);
int GetBotSpawnLimit(uint8 class_id = NO_CLASS); int GetBotSpawnLimit(uint8 class_id = Class::None);
void SetBotCreationLimit(uint32 new_creation_limit, uint8 class_id = NO_CLASS); void SetBotCreationLimit(uint32 new_creation_limit, uint8 class_id = Class::None);
void SetBotRequiredLevel(int new_required_level, uint8 class_id = NO_CLASS); void SetBotRequiredLevel(int new_required_level, uint8 class_id = Class::None);
void SetBotSpawnLimit(int new_spawn_limit, uint8 class_id = NO_CLASS); void SetBotSpawnLimit(int new_spawn_limit, uint8 class_id = Class::None);
void CampAllBots(uint8 class_id = NO_CLASS); void CampAllBots(uint8 class_id = Class::None);
void SpawnRaidBotsOnConnect(Raid* raid); void SpawnRaidBotsOnConnect(Raid* raid);
private: private:

View File

@ -345,7 +345,7 @@ uint32 Mob::GetClassLevelFactor()
uint32 multiplier = 0; uint32 multiplier = 0;
uint8 mlevel = GetLevel(); uint8 mlevel = GetLevel();
switch (GetClass()) { switch (GetClass()) {
case WARRIOR: { case Class::Warrior: {
if (mlevel < 20) { if (mlevel < 20) {
multiplier = 220; multiplier = 220;
} }
@ -372,9 +372,9 @@ uint32 Mob::GetClassLevelFactor()
} }
break; break;
} }
case DRUID: case Class::Druid:
case CLERIC: case Class::Cleric:
case SHAMAN: { case Class::Shaman: {
if (mlevel < 70) { if (mlevel < 70) {
multiplier = 150; multiplier = 150;
} }
@ -383,9 +383,9 @@ uint32 Mob::GetClassLevelFactor()
} }
break; break;
} }
case BERSERKER: case Class::Berserker:
case PALADIN: case Class::Paladin:
case SHADOWKNIGHT: { case Class::ShadowKnight: {
if (mlevel < 35) { if (mlevel < 35) {
multiplier = 210; multiplier = 210;
} }
@ -409,10 +409,10 @@ uint32 Mob::GetClassLevelFactor()
} }
break; break;
} }
case MONK: case Class::Monk:
case BARD: case Class::Bard:
case ROGUE: case Class::Rogue:
case BEASTLORD: { case Class::Beastlord: {
if (mlevel < 51) { if (mlevel < 51) {
multiplier = 180; multiplier = 180;
} }
@ -427,7 +427,7 @@ uint32 Mob::GetClassLevelFactor()
} }
break; break;
} }
case RANGER: { case Class::Ranger: {
if (mlevel < 58) { if (mlevel < 58) {
multiplier = 200; multiplier = 200;
} }
@ -439,10 +439,10 @@ uint32 Mob::GetClassLevelFactor()
} }
break; break;
} }
case MAGICIAN: case Class::Magician:
case WIZARD: case Class::Wizard:
case NECROMANCER: case Class::Necromancer:
case ENCHANTER: { case Class::Enchanter: {
if (mlevel < 70) { if (mlevel < 70) {
multiplier = 120; multiplier = 120;
} }
@ -677,7 +677,7 @@ int64 Client::CalcManaRegen(bool bCombat)
if (IsSitting() || CanMedOnHorse()) { if (IsSitting() || CanMedOnHorse()) {
// kind of weird to do it here w/e // kind of weird to do it here w/e
// client does some base medding regen for shrouds here // client does some base medding regen for shrouds here
if (GetClass() != BARD) { if (GetClass() != Class::Bard) {
auto skill = GetSkill(EQ::skills::SkillMeditate); auto skill = GetSkill(EQ::skills::SkillMeditate);
if (skill > 0) { if (skill > 0) {
regen++; regen++;
@ -1077,7 +1077,7 @@ int32 Client::CalcMR()
MR = 20; MR = 20;
} }
MR += itembonuses.MR + spellbonuses.MR + aabonuses.MR; MR += itembonuses.MR + spellbonuses.MR + aabonuses.MR;
if (GetClass() == WARRIOR || GetClass() == BERSERKER) { if (GetClass() == Class::Warrior || GetClass() == Class::Berserker) {
MR += GetLevel() / 2; MR += GetLevel() / 2;
} }
if (MR < 1) { if (MR < 1) {
@ -1151,14 +1151,14 @@ int32 Client::CalcFR()
FR = 20; FR = 20;
} }
int c = GetClass(); int c = GetClass();
if (c == RANGER) { if (c == Class::Ranger) {
FR += 4; FR += 4;
int l = GetLevel(); int l = GetLevel();
if (l > 49) { if (l > 49) {
FR += l - 49; FR += l - 49;
} }
} }
if (c == MONK) { if (c == Class::Monk) {
FR += 8; FR += 8;
int l = GetLevel(); int l = GetLevel();
if (l > 49) { if (l > 49) {
@ -1238,19 +1238,19 @@ int32 Client::CalcDR()
} }
int c = GetClass(); int c = GetClass();
// the monk one is part of base resist // the monk one is part of base resist
if (c == MONK) { if (c == Class::Monk) {
int l = GetLevel(); int l = GetLevel();
if (l > 50) if (l > 50)
DR += l - 50; DR += l - 50;
} }
if (c == PALADIN) { if (c == Class::Paladin) {
DR += 8; DR += 8;
int l = GetLevel(); int l = GetLevel();
if (l > 49) { if (l > 49) {
DR += l - 49; DR += l - 49;
} }
} }
else if (c == SHADOWKNIGHT || c == BEASTLORD) { else if (c == Class::ShadowKnight || c == Class::Beastlord) {
DR += 4; DR += 4;
int l = GetLevel(); int l = GetLevel();
if (l > 49) { if (l > 49) {
@ -1330,19 +1330,19 @@ int32 Client::CalcPR()
} }
int c = GetClass(); int c = GetClass();
// this monk bonus is part of the base // this monk bonus is part of the base
if (c == MONK) { if (c == Class::Monk) {
int l = GetLevel(); int l = GetLevel();
if (l > 50) if (l > 50)
PR += l - 50; PR += l - 50;
} }
if (c == ROGUE) { if (c == Class::Rogue) {
PR += 8; PR += 8;
int l = GetLevel(); int l = GetLevel();
if (l > 49) { if (l > 49) {
PR += l - 49; PR += l - 49;
} }
} }
else if (c == SHADOWKNIGHT) { else if (c == Class::ShadowKnight) {
PR += 4; PR += 4;
int l = GetLevel(); int l = GetLevel();
if (l > 49) { if (l > 49) {
@ -1421,7 +1421,7 @@ int32 Client::CalcCR()
CR = 25; CR = 25;
} }
int c = GetClass(); int c = GetClass();
if (c == RANGER || c == BEASTLORD) { if (c == Class::Ranger || c == Class::Beastlord) {
CR += 4; CR += 4;
int l = GetLevel(); int l = GetLevel();
if (l > 49) { if (l > 49) {
@ -1455,7 +1455,7 @@ int32 Client::CalcATK()
uint32 Mob::GetInstrumentMod(uint16 spell_id) uint32 Mob::GetInstrumentMod(uint16 spell_id)
{ {
if (GetClass() != BARD) { if (GetClass() != Class::Bard) {
//Other classes can get a base effects mod using SPA 413 //Other classes can get a base effects mod using SPA 413
if (HasBaseEffectFocus()) { if (HasBaseEffectFocus()) {
return (10 + (GetFocusEffect(focusFcBaseEffects, spell_id) / 10));//TODO: change action->instrument mod to float to support < 10% focus values return (10 + (GetFocusEffect(focusFcBaseEffects, spell_id) / 10));//TODO: change action->instrument mod to float to support < 10% focus values
@ -1689,7 +1689,7 @@ int64 Client::CalcEnduranceRegen(bool bCombat)
int weight_limit = GetSTR(); int weight_limit = GetSTR();
auto level = GetLevel(); auto level = GetLevel();
if (GetClass() == MONK) { if (GetClass() == Class::Monk) {
if (level > 99) if (level > 99)
weight_limit = 58; weight_limit = 58;
else if (level > 94) else if (level > 94)

View File

@ -1381,7 +1381,7 @@ void Client::Handle_Connect_OP_ZoneEntry(const EQApplicationPacket *app)
SetClientMaxLevel(client_max_level); SetClientMaxLevel(client_max_level);
// we know our class now, so we might have to fix our consume timer! // we know our class now, so we might have to fix our consume timer!
if (class_ == MONK) if (class_ == Class::Monk)
consume_food_timer.SetTimer(CONSUMPTION_MNK_TIMER); consume_food_timer.SetTimer(CONSUMPTION_MNK_TIMER);
InitInnates(); InitInnates();
@ -1592,9 +1592,9 @@ void Client::Handle_Connect_OP_ZoneEntry(const EQApplicationPacket *app)
m_pp.spellSlotRefresh[i] = p_timers.GetRemainingTime(pTimerSpellStart + m_pp.mem_spells[i]) * 1000; m_pp.spellSlotRefresh[i] = p_timers.GetRemainingTime(pTimerSpellStart + m_pp.mem_spells[i]) * 1000;
/* Ability slot refresh send SK/PAL */ /* Ability slot refresh send SK/PAL */
if (m_pp.class_ == SHADOWKNIGHT || m_pp.class_ == PALADIN) { if (m_pp.class_ == Class::ShadowKnight || m_pp.class_ == Class::Paladin) {
uint32 abilitynum = 0; uint32 abilitynum = 0;
if (m_pp.class_ == SHADOWKNIGHT) { abilitynum = pTimerHarmTouch; } if (m_pp.class_ == Class::ShadowKnight) { abilitynum = pTimerHarmTouch; }
else { abilitynum = pTimerLayHands; } else { abilitynum = pTimerLayHands; }
uint32 remaining = p_timers.GetRemainingTime(abilitynum); uint32 remaining = p_timers.GetRemainingTime(abilitynum);
@ -1935,8 +1935,8 @@ void Client::Handle_OP_AdventureMerchantPurchase(const EQApplicationPacket *app)
Adventure_Purchase_Struct* aps = (Adventure_Purchase_Struct*)app->pBuffer; Adventure_Purchase_Struct* aps = (Adventure_Purchase_Struct*)app->pBuffer;
uint32 merchantid = 0; uint32 merchantid = 0;
Mob* tmp = entity_list.GetMob(aps->npcid); Mob* tmp = entity_list.GetMob(aps->npcid);
if (tmp == 0 || !tmp->IsNPC() || ((tmp->GetClass() != ADVENTURE_MERCHANT) && if (tmp == 0 || !tmp->IsNPC() || ((tmp->GetClass() != Class::AdventureMerchant) &&
(tmp->GetClass() != DISCORD_MERCHANT) && (tmp->GetClass() != NORRATHS_KEEPERS_MERCHANT) && (tmp->GetClass() != DARK_REIGN_MERCHANT))) (tmp->GetClass() != Class::DiscordMerchant) && (tmp->GetClass() != Class::NorrathsKeepersMerchant) && (tmp->GetClass() != Class::DarkReignMerchant)))
return; return;
//you have to be somewhat close to them to be properly using them //you have to be somewhat close to them to be properly using them
@ -2121,8 +2121,8 @@ void Client::Handle_OP_AdventureMerchantRequest(const EQApplicationPacket *app)
uint32 merchantid = 0; uint32 merchantid = 0;
Mob* tmp = entity_list.GetMob(eid->entity_id); Mob* tmp = entity_list.GetMob(eid->entity_id);
if (tmp == 0 || !tmp->IsNPC() || ((tmp->GetClass() != ADVENTURE_MERCHANT) && if (tmp == 0 || !tmp->IsNPC() || ((tmp->GetClass() != Class::AdventureMerchant) &&
(tmp->GetClass() != DISCORD_MERCHANT) && (tmp->GetClass() != NORRATHS_KEEPERS_MERCHANT) && (tmp->GetClass() != DARK_REIGN_MERCHANT))) (tmp->GetClass() != Class::DiscordMerchant) && (tmp->GetClass() != Class::NorrathsKeepersMerchant) && (tmp->GetClass() != Class::DarkReignMerchant)))
return; return;
if (!tmp->CastToNPC()->IsMerchantOpen()) { if (!tmp->CastToNPC()->IsMerchantOpen()) {
@ -2197,8 +2197,8 @@ void Client::Handle_OP_AdventureMerchantSell(const EQApplicationPacket *app)
Adventure_Sell_Struct *ams_in = (Adventure_Sell_Struct*)app->pBuffer; Adventure_Sell_Struct *ams_in = (Adventure_Sell_Struct*)app->pBuffer;
Mob* vendor = entity_list.GetMob(ams_in->npcid); Mob* vendor = entity_list.GetMob(ams_in->npcid);
if (vendor == 0 || !vendor->IsNPC() || ((vendor->GetClass() != ADVENTURE_MERCHANT) && if (vendor == 0 || !vendor->IsNPC() || ((vendor->GetClass() != Class::AdventureMerchant) &&
(vendor->GetClass() != NORRATHS_KEEPERS_MERCHANT) && (vendor->GetClass() != DARK_REIGN_MERCHANT))) (vendor->GetClass() != Class::NorrathsKeepersMerchant) && (vendor->GetClass() != Class::DarkReignMerchant)))
{ {
Message(Chat::Red, "Vendor was not found."); Message(Chat::Red, "Vendor was not found.");
return; return;
@ -2298,17 +2298,17 @@ void Client::Handle_OP_AdventureMerchantSell(const EQApplicationPacket *app)
switch (vendor->GetClass()) switch (vendor->GetClass())
{ {
case ADVENTURE_MERCHANT: case Class::AdventureMerchant:
{ {
UpdateLDoNPoints(6, price); UpdateLDoNPoints(6, price);
break; break;
} }
case NORRATHS_KEEPERS_MERCHANT: case Class::NorrathsKeepersMerchant:
{ {
SetRadiantCrystals(GetRadiantCrystals() + price); SetRadiantCrystals(GetRadiantCrystals() + price);
break; break;
} }
case DARK_REIGN_MERCHANT: case Class::DarkReignMerchant:
{ {
SetEbonCrystals(GetEbonCrystals() + price); SetEbonCrystals(GetEbonCrystals() + price);
break; break;
@ -2482,7 +2482,7 @@ void Client::Handle_OP_AltCurrencyMerchantRequest(const EQApplicationPacket *app
return; return;
} }
if (target->GetClass() != ALT_CURRENCY_MERCHANT) { if (target->GetClass() != Class::AlternateCurrencyMerchant) {
return; return;
} }
@ -2553,7 +2553,7 @@ void Client::Handle_OP_AltCurrencyPurchase(const EQApplicationPacket *app)
if (DistanceSquared(m_Position, tar->GetPosition())> USE_NPC_RANGE2) if (DistanceSquared(m_Position, tar->GetPosition())> USE_NPC_RANGE2)
return; return;
if (tar->GetClass() != ALT_CURRENCY_MERCHANT) { if (tar->GetClass() != Class::AlternateCurrencyMerchant) {
return; return;
} }
@ -2722,7 +2722,7 @@ void Client::Handle_OP_AltCurrencySell(const EQApplicationPacket *app)
if (DistanceSquared(m_Position, tar->GetPosition()) > USE_NPC_RANGE2) if (DistanceSquared(m_Position, tar->GetPosition()) > USE_NPC_RANGE2)
return; return;
if (tar->GetClass() != ALT_CURRENCY_MERCHANT) { if (tar->GetClass() != Class::AlternateCurrencyMerchant) {
return; return;
} }
@ -2858,7 +2858,7 @@ void Client::Handle_OP_AltCurrencySellSelection(const EQApplicationPacket *app)
if (DistanceSquared(m_Position, tar->GetPosition()) > USE_NPC_RANGE2) if (DistanceSquared(m_Position, tar->GetPosition()) > USE_NPC_RANGE2)
return; return;
if (tar->GetClass() != ALT_CURRENCY_MERCHANT) { if (tar->GetClass() != Class::AlternateCurrencyMerchant) {
return; return;
} }
@ -2966,7 +2966,7 @@ void Client::Handle_OP_ApplyPoison(const EQApplicationPacket *app)
bool IsPoison = (poison && poison->ItemType == EQ::item::ItemTypePoison); bool IsPoison = (poison && poison->ItemType == EQ::item::ItemTypePoison);
if (IsPoison && GetClass() == ROGUE) { if (IsPoison && GetClass() == Class::Rogue) {
// Live always checks for skillup, even when poison is too high // Live always checks for skillup, even when poison is too high
CheckIncreaseSkill(EQ::skills::SkillApplyPoison, nullptr, 10); CheckIncreaseSkill(EQ::skills::SkillApplyPoison, nullptr, 10);
@ -3926,7 +3926,7 @@ void Client::Handle_OP_Begging(const EQApplicationPacket *app)
if (!HasSkill(EQ::skills::SkillBegging) || !GetTarget()) if (!HasSkill(EQ::skills::SkillBegging) || !GetTarget())
return; return;
if (GetTarget()->GetClass() == LDON_TREASURE) if (GetTarget()->GetClass() == Class::LDoNTreasure)
return; return;
p_timers.Start(pTimerBeggingPickPocket, 8); p_timers.Start(pTimerBeggingPickPocket, 8);
@ -4471,7 +4471,7 @@ void Client::Handle_OP_CastSpell(const EQApplicationPacket *app)
else if (slot == CastingSlot::Ability) { else if (slot == CastingSlot::Ability) {
uint16 spell_to_cast = 0; uint16 spell_to_cast = 0;
if (castspell->spell_id == SPELL_LAY_ON_HANDS && GetClass() == PALADIN) { if (castspell->spell_id == SPELL_LAY_ON_HANDS && GetClass() == Class::Paladin) {
if (!p_timers.Expired(&database, pTimerLayHands)) { if (!p_timers.Expired(&database, pTimerLayHands)) {
Message(Chat::Red, "Ability recovery time not yet met."); Message(Chat::Red, "Ability recovery time not yet met.");
InterruptSpell(castspell->spell_id); InterruptSpell(castspell->spell_id);
@ -4481,7 +4481,7 @@ void Client::Handle_OP_CastSpell(const EQApplicationPacket *app)
p_timers.Start(pTimerLayHands, LayOnHandsReuseTime); p_timers.Start(pTimerLayHands, LayOnHandsReuseTime);
} }
else if ((castspell->spell_id == SPELL_HARM_TOUCH else if ((castspell->spell_id == SPELL_HARM_TOUCH
|| castspell->spell_id == SPELL_HARM_TOUCH2) && GetClass() == SHADOWKNIGHT) { || castspell->spell_id == SPELL_HARM_TOUCH2) && GetClass() == Class::ShadowKnight) {
if (!p_timers.Expired(&database, pTimerHarmTouch)) { if (!p_timers.Expired(&database, pTimerHarmTouch)) {
Message(Chat::Red, "Ability recovery time not yet met."); Message(Chat::Red, "Ability recovery time not yet met.");
InterruptSpell(castspell->spell_id); InterruptSpell(castspell->spell_id);
@ -5122,7 +5122,7 @@ void Client::Handle_OP_Consider(const EQApplicationPacket *app)
} }
} }
if (t->GetClass() == LDON_TREASURE) { if (t->GetClass() == Class::LDoNTreasure) {
Message(Chat::Yellow, fmt::format("{}", t->GetCleanName()).c_str()); Message(Chat::Yellow, fmt::format("{}", t->GetCleanName()).c_str());
return; return;
} }
@ -8626,7 +8626,7 @@ void Client::Handle_OP_Hide(const EQApplicationPacket *app)
hidden = true; hidden = true;
tmHidden = Timer::GetCurrentTime(); tmHidden = Timer::GetCurrentTime();
} }
if (GetClass() == ROGUE) { if (GetClass() == Class::Rogue) {
auto outapp = new EQApplicationPacket(OP_SimpleMessage, sizeof(SimpleMessage_Struct)); auto outapp = new EQApplicationPacket(OP_SimpleMessage, sizeof(SimpleMessage_Struct));
SimpleMessage_Struct *msg = (SimpleMessage_Struct *)outapp->pBuffer; SimpleMessage_Struct *msg = (SimpleMessage_Struct *)outapp->pBuffer;
msg->color = 0x010E; msg->color = 0x010E;
@ -9175,7 +9175,7 @@ void Client::Handle_OP_ItemVerifyRequest(const EQApplicationPacket *app)
Bards on live can click items while casting spell gems, it stops that song cast and replaces it with item click cast. Bards on live can click items while casting spell gems, it stops that song cast and replaces it with item click cast.
Can not click while casting other items. Can not click while casting other items.
*/ */
if (GetClass() == BARD && IsCasting() && casting_spell_slot < CastingSlot::MaxGems) if (GetClass() == Class::Bard && IsCasting() && casting_spell_slot < CastingSlot::MaxGems)
{ {
is_casting_bard_song = true; is_casting_bard_song = true;
} }
@ -9341,7 +9341,7 @@ void Client::Handle_OP_ItemVerifyRequest(const EQApplicationPacket *app)
if (!IsCastWhileInvisibleSpell(item->Click.Effect)) { if (!IsCastWhileInvisibleSpell(item->Click.Effect)) {
CommonBreakInvisible(); // client can't do this for us :( CommonBreakInvisible(); // client can't do this for us :(
} }
if (GetClass() == BARD){ if (GetClass() == Class::Bard){
DoBardCastingFromItemClick(is_casting_bard_song, item->CastTime, item->Click.Effect, target_id, CastingSlot::Item, slot_id, item->RecastType, item->RecastDelay); DoBardCastingFromItemClick(is_casting_bard_song, item->CastTime, item->Click.Effect, target_id, CastingSlot::Item, slot_id, item->RecastType, item->RecastDelay);
} }
else { else {
@ -9413,7 +9413,7 @@ void Client::Handle_OP_ItemVerifyRequest(const EQApplicationPacket *app)
if (!IsCastWhileInvisibleSpell(augitem->Click.Effect)) { if (!IsCastWhileInvisibleSpell(augitem->Click.Effect)) {
CommonBreakInvisible(); // client can't do this for us :( CommonBreakInvisible(); // client can't do this for us :(
} }
if (GetClass() == BARD) { if (GetClass() == Class::Bard) {
DoBardCastingFromItemClick(is_casting_bard_song, augitem->CastTime, augitem->Click.Effect, target_id, CastingSlot::Item, slot_id, augitem->RecastType, augitem->RecastDelay); DoBardCastingFromItemClick(is_casting_bard_song, augitem->CastTime, augitem->Click.Effect, target_id, CastingSlot::Item, slot_id, augitem->RecastType, augitem->RecastDelay);
} }
else { else {
@ -9549,7 +9549,7 @@ void Client::Handle_OP_LDoNDisarmTraps(const EQApplicationPacket *app)
void Client::Handle_OP_LDoNInspect(const EQApplicationPacket *app) void Client::Handle_OP_LDoNInspect(const EQApplicationPacket *app)
{ {
auto* t = GetTarget(); auto* t = GetTarget();
if (t && t->GetClass() == LDON_TREASURE && !t->IsAura()) { if (t && t->GetClass() == Class::LDoNTreasure && !t->IsAura()) {
if (parse->PlayerHasQuestSub(EVENT_INSPECT)) { if (parse->PlayerHasQuestSub(EVENT_INSPECT)) {
std::vector<std::any> args = { t }; std::vector<std::any> args = { t };
if (parse->EventPlayer(EVENT_INSPECT, this, "", t->GetID(), &args) == 0) { if (parse->EventPlayer(EVENT_INSPECT, this, "", t->GetID(), &args) == 0) {
@ -9878,7 +9878,7 @@ void Client::Handle_OP_LFPCommand(const EQApplicationPacket *app)
for (unsigned int i = 0; i<MAX_GROUP_MEMBERS; i++) { for (unsigned int i = 0; i<MAX_GROUP_MEMBERS; i++) {
LFPMembers[i].Name[0] = '\0'; LFPMembers[i].Name[0] = '\0';
LFPMembers[i].Class = NO_CLASS; LFPMembers[i].Class = Class::None;
LFPMembers[i].Level = 0; LFPMembers[i].Level = 0;
LFPMembers[i].Zone = 0; LFPMembers[i].Zone = 0;
LFPMembers[i].GuildID = 0xFFFF; LFPMembers[i].GuildID = 0xFFFF;
@ -10219,7 +10219,7 @@ void Client::Handle_OP_MercenaryDataRequest(const EQApplicationPacket *app)
if (DistanceSquared(m_Position, tar->GetPosition()) > USE_NPC_RANGE2) if (DistanceSquared(m_Position, tar->GetPosition()) > USE_NPC_RANGE2)
return; return;
if (tar->GetClass() != MERCENARY_MASTER) { if (tar->GetClass() != Class::MercenaryLiaison) {
return; return;
} }
@ -10594,7 +10594,7 @@ void Client::Handle_OP_OpenGuildTributeMaster(const EQApplicationPacket *app)
//Opens the guild tribute master window //Opens the guild tribute master window
StartTribute_Struct* st = (StartTribute_Struct*)app->pBuffer; StartTribute_Struct* st = (StartTribute_Struct*)app->pBuffer;
Mob* tribmast = entity_list.GetMob(st->tribute_master_id); Mob* tribmast = entity_list.GetMob(st->tribute_master_id);
if (tribmast && tribmast->IsNPC() && tribmast->GetClass() == GUILD_TRIBUTE_MASTER if (tribmast && tribmast->IsNPC() && tribmast->GetClass() == Class::GuildTributeMaster
&& DistanceSquared(m_Position, tribmast->GetPosition()) <= USE_NPC_RANGE2) { && DistanceSquared(m_Position, tribmast->GetPosition()) <= USE_NPC_RANGE2) {
st->response = 1; st->response = 1;
QueuePacket(app); QueuePacket(app);
@ -10625,7 +10625,7 @@ void Client::Handle_OP_OpenTributeMaster(const EQApplicationPacket *app)
//Opens the tribute master window //Opens the tribute master window
StartTribute_Struct* st = (StartTribute_Struct*)app->pBuffer; StartTribute_Struct* st = (StartTribute_Struct*)app->pBuffer;
Mob* tribmast = entity_list.GetMob(st->tribute_master_id); Mob* tribmast = entity_list.GetMob(st->tribute_master_id);
if (tribmast && tribmast->IsNPC() && tribmast->GetClass() == TRIBUTE_MASTER if (tribmast && tribmast->IsNPC() && tribmast->GetClass() == Class::TributeMaster
&& DistanceSquared(m_Position, tribmast->GetPosition()) <= USE_NPC_RANGE2) { && DistanceSquared(m_Position, tribmast->GetPosition()) <= USE_NPC_RANGE2) {
st->response = 1; st->response = 1;
QueuePacket(app); QueuePacket(app);
@ -13531,7 +13531,7 @@ void Client::Handle_OP_Shielding(const EQApplicationPacket *app)
return; return;
} }
if (GetClass() != WARRIOR){ if (GetClass() != Class::Warrior){
return; return;
} }
@ -13587,7 +13587,7 @@ void Client::Handle_OP_ShopPlayerBuy(const EQApplicationPacket *app)
bool tmpmer_used = false; bool tmpmer_used = false;
Mob* tmp = entity_list.GetMob(mp->npcid); Mob* tmp = entity_list.GetMob(mp->npcid);
if (tmp == 0 || !tmp->IsNPC() || tmp->GetClass() != MERCHANT) if (tmp == 0 || !tmp->IsNPC() || tmp->GetClass() != Class::Merchant)
return; return;
if (mp->quantity < 1) return; if (mp->quantity < 1) return;
@ -13896,7 +13896,7 @@ void Client::Handle_OP_ShopPlayerSell(const EQApplicationPacket *app)
Mob* vendor = entity_list.GetMob(mp->npcid); Mob* vendor = entity_list.GetMob(mp->npcid);
if (vendor == 0 || !vendor->IsNPC() || vendor->GetClass() != MERCHANT) if (vendor == 0 || !vendor->IsNPC() || vendor->GetClass() != Class::Merchant)
return; return;
//you have to be somewhat close to them to be properly using them //you have to be somewhat close to them to be properly using them
@ -14122,7 +14122,7 @@ void Client::Handle_OP_ShopRequest(const EQApplicationPacket *app)
int merchantid = 0; int merchantid = 0;
Mob* tmp = entity_list.GetMob(mc->npcid); Mob* tmp = entity_list.GetMob(mc->npcid);
if (tmp == 0 || !tmp->IsNPC() || tmp->GetClass() != MERCHANT) if (tmp == 0 || !tmp->IsNPC() || tmp->GetClass() != Class::Merchant)
return; return;
//you have to be somewhat close to them to be properly using them //you have to be somewhat close to them to be properly using them
@ -14229,7 +14229,7 @@ void Client::Handle_OP_Sneak(const EQApplicationPacket *app)
sa_out->parameter = sneaking; sa_out->parameter = sneaking;
QueuePacket(outapp); QueuePacket(outapp);
safe_delete(outapp); safe_delete(outapp);
if (GetClass() == ROGUE) { if (GetClass() == Class::Rogue) {
outapp = new EQApplicationPacket(OP_SimpleMessage, 12); outapp = new EQApplicationPacket(OP_SimpleMessage, 12);
SimpleMessage_Struct *msg = (SimpleMessage_Struct *)outapp->pBuffer; SimpleMessage_Struct *msg = (SimpleMessage_Struct *)outapp->pBuffer;
msg->color = 0x010E; msg->color = 0x010E;
@ -15545,7 +15545,7 @@ void Client::Handle_OP_TributeItem(const EQApplicationPacket *app)
tribute_master_id = t->tribute_master_id; tribute_master_id = t->tribute_master_id;
//make sure they are dealing with a valid tribute master //make sure they are dealing with a valid tribute master
Mob* tribmast = entity_list.GetMob(t->tribute_master_id); Mob* tribmast = entity_list.GetMob(t->tribute_master_id);
if (!tribmast || !tribmast->IsNPC() || tribmast->GetClass() != TRIBUTE_MASTER) if (!tribmast || !tribmast->IsNPC() || tribmast->GetClass() != Class::TributeMaster)
return; return;
if (DistanceSquared(m_Position, tribmast->GetPosition()) > USE_NPC_RANGE2) if (DistanceSquared(m_Position, tribmast->GetPosition()) > USE_NPC_RANGE2)
return; return;
@ -15572,7 +15572,7 @@ void Client::Handle_OP_TributeMoney(const EQApplicationPacket *app)
tribute_master_id = t->tribute_master_id; tribute_master_id = t->tribute_master_id;
//make sure they are dealing with a valid tribute master //make sure they are dealing with a valid tribute master
Mob* tribmast = entity_list.GetMob(t->tribute_master_id); Mob* tribmast = entity_list.GetMob(t->tribute_master_id);
if (!tribmast || !tribmast->IsNPC() || tribmast->GetClass() != TRIBUTE_MASTER) if (!tribmast || !tribmast->IsNPC() || tribmast->GetClass() != Class::TributeMaster)
return; return;
if (DistanceSquared(m_Position, tribmast->GetPosition()) > USE_NPC_RANGE2) if (DistanceSquared(m_Position, tribmast->GetPosition()) > USE_NPC_RANGE2)
return; return;

View File

@ -434,7 +434,7 @@ bool Client::Process() {
} }
} }
if (GetClass() == WARRIOR || GetClass() == BERSERKER) { if (GetClass() == Class::Warrior || GetClass() == Class::Berserker) {
if (!dead && !IsBerserk() && GetHPRatio() < RuleI(Combat, BerserkerFrenzyStart)) { if (!dead && !IsBerserk() && GetHPRatio() < RuleI(Combat, BerserkerFrenzyStart)) {
entity_list.MessageCloseString(this, false, 200, 0, BERSERK_START, GetName()); entity_list.MessageCloseString(this, false, 200, 0, BERSERK_START, GetName());
berserk = true; berserk = true;
@ -1121,7 +1121,7 @@ void Client::OPMemorizeSpell(const EQApplicationPacket* app)
if ( if (
m->scribing != memSpellForget && m->scribing != memSpellForget &&
( (
!EQ::ValueWithin(GetClass(), PLAYER_CLASS_WARRIOR, PLAYER_CLASS_BERSERKER) || !IsPlayerClass(GetClass()) ||
GetLevel() < spells[m->spell_id].classes[GetClass() - 1] GetLevel() < spells[m->spell_id].classes[GetClass() - 1]
) )
) { ) {
@ -1552,12 +1552,12 @@ void Client::OPGMTraining(const EQApplicationPacket *app)
Mob* pTrainer = entity_list.GetMob(gmtrain->npcid); Mob* pTrainer = entity_list.GetMob(gmtrain->npcid);
if(!pTrainer || !pTrainer->IsNPC() || pTrainer->GetClass() < WARRIORGM || pTrainer->GetClass() > BERSERKERGM) if(!pTrainer || !pTrainer->IsNPC() || pTrainer->GetClass() < Class::WarriorGM || pTrainer->GetClass() > Class::BerserkerGM)
return; return;
//you can only use your own trainer, client enforces this, but why trust it //you can only use your own trainer, client enforces this, but why trust it
if (!RuleB(Character, AllowCrossClassTrainers)) { if (!RuleB(Character, AllowCrossClassTrainers)) {
int trains_class = pTrainer->GetClass() - (WARRIORGM - WARRIOR); int trains_class = pTrainer->GetClass() - (Class::WarriorGM - Class::Warrior);
if (GetClass() != trains_class) if (GetClass() != trains_class)
return; return;
} }
@ -1579,7 +1579,7 @@ void Client::OPGMTraining(const EQApplicationPacket *app)
} }
} }
if (ClientVersion() < EQ::versions::ClientVersion::RoF2 && GetClass() == BERSERKER) { if (ClientVersion() < EQ::versions::ClientVersion::RoF2 && GetClass() == Class::Berserker) {
gmtrain->skills[EQ::skills::Skill1HPiercing] = gmtrain->skills[EQ::skills::Skill2HPiercing]; gmtrain->skills[EQ::skills::Skill1HPiercing] = gmtrain->skills[EQ::skills::Skill2HPiercing];
gmtrain->skills[EQ::skills::Skill2HPiercing] = 0; gmtrain->skills[EQ::skills::Skill2HPiercing] = 0;
} }
@ -1607,12 +1607,12 @@ void Client::OPGMEndTraining(const EQApplicationPacket *app)
FastQueuePacket(&outapp); FastQueuePacket(&outapp);
Mob* pTrainer = entity_list.GetMob(p->npcid); Mob* pTrainer = entity_list.GetMob(p->npcid);
if(!pTrainer || !pTrainer->IsNPC() || pTrainer->GetClass() < WARRIORGM || pTrainer->GetClass() > BERSERKERGM) if(!pTrainer || !pTrainer->IsNPC() || pTrainer->GetClass() < Class::WarriorGM || pTrainer->GetClass() > Class::BerserkerGM)
return; return;
//you can only use your own trainer, client enforces this, but why trust it //you can only use your own trainer, client enforces this, but why trust it
if (!RuleB(Character, AllowCrossClassTrainers)) { if (!RuleB(Character, AllowCrossClassTrainers)) {
int trains_class = pTrainer->GetClass() - (WARRIORGM - WARRIOR); int trains_class = pTrainer->GetClass() - (Class::WarriorGM - Class::Warrior);
if (GetClass() != trains_class) if (GetClass() != trains_class)
return; return;
} }
@ -1638,12 +1638,12 @@ void Client::OPGMTrainSkill(const EQApplicationPacket *app)
GMSkillChange_Struct* gmskill = (GMSkillChange_Struct*) app->pBuffer; GMSkillChange_Struct* gmskill = (GMSkillChange_Struct*) app->pBuffer;
Mob* pTrainer = entity_list.GetMob(gmskill->npcid); Mob* pTrainer = entity_list.GetMob(gmskill->npcid);
if(!pTrainer || !pTrainer->IsNPC() || pTrainer->GetClass() < WARRIORGM || pTrainer->GetClass() > BERSERKERGM) if(!pTrainer || !pTrainer->IsNPC() || pTrainer->GetClass() < Class::WarriorGM || pTrainer->GetClass() > Class::BerserkerGM)
return; return;
//you can only use your own trainer, client enforces this, but why trust it //you can only use your own trainer, client enforces this, but why trust it
if (!RuleB(Character, AllowCrossClassTrainers)) { if (!RuleB(Character, AllowCrossClassTrainers)) {
int trains_class = pTrainer->GetClass() - (WARRIORGM - WARRIOR); int trains_class = pTrainer->GetClass() - (Class::WarriorGM - Class::Warrior);
if (GetClass() != trains_class) if (GetClass() != trains_class)
return; return;
} }

View File

@ -75,7 +75,7 @@ int64 Mob::GetActSpellDamage(uint16 spell_id, int64 value, Mob* target) {
chance += itembonuses.FrenziedDevastation + spellbonuses.FrenziedDevastation + aabonuses.FrenziedDevastation; chance += itembonuses.FrenziedDevastation + spellbonuses.FrenziedDevastation + aabonuses.FrenziedDevastation;
//Crtical Hit Calculation pathway //Crtical Hit Calculation pathway
if (chance > 0 || (IsOfClientBot() && GetClass() == WIZARD && GetLevel() >= RuleI(Spells, WizCritLevel))) { if (chance > 0 || (IsOfClientBot() && GetClass() == Class::Wizard && GetLevel() >= RuleI(Spells, WizCritLevel))) {
int32 ratio = RuleI(Spells, BaseCritRatio); //Critical modifier is applied from spell effects only. Keep at 100 for live like criticals. int32 ratio = RuleI(Spells, BaseCritRatio); //Critical modifier is applied from spell effects only. Keep at 100 for live like criticals.
@ -92,7 +92,7 @@ int64 Mob::GetActSpellDamage(uint16 spell_id, int64 value, Mob* target) {
ratio += itembonuses.SpellCritDmgIncNoStack + spellbonuses.SpellCritDmgIncNoStack + aabonuses.SpellCritDmgIncNoStack; ratio += itembonuses.SpellCritDmgIncNoStack + spellbonuses.SpellCritDmgIncNoStack + aabonuses.SpellCritDmgIncNoStack;
} }
else if ((IsOfClientBot() && GetClass() == WIZARD) || (IsMerc() && GetClass() == CASTERDPS)) { else if ((IsOfClientBot() && GetClass() == Class::Wizard) || (IsMerc() && GetClass() == CASTERDPS)) {
if ((GetLevel() >= RuleI(Spells, WizCritLevel)) && zone->random.Roll(RuleI(Spells, WizCritChance))){ if ((GetLevel() >= RuleI(Spells, WizCritLevel)) && zone->random.Roll(RuleI(Spells, WizCritChance))){
//Wizard innate critical chance is calculated seperately from spell effect and is not a set ratio. (20-70 is parse confirmed) //Wizard innate critical chance is calculated seperately from spell effect and is not a set ratio. (20-70 is parse confirmed)
ratio += zone->random.Int(RuleI(Spells, WizardCritMinimumRandomRatio), RuleI(Spells, WizardCritMaximumRandomRatio)); ratio += zone->random.Int(RuleI(Spells, WizardCritMinimumRandomRatio), RuleI(Spells, WizardCritMaximumRandomRatio));
@ -100,7 +100,7 @@ int64 Mob::GetActSpellDamage(uint16 spell_id, int64 value, Mob* target) {
} }
} }
if (IsOfClientBot() && GetClass() == WIZARD) { if (IsOfClientBot() && GetClass() == Class::Wizard) {
ratio += RuleI(Spells, WizCritRatio); //Default is zero ratio += RuleI(Spells, WizCritRatio); //Default is zero
} }
@ -426,7 +426,7 @@ int64 Mob::GetActSpellHealing(uint16 spell_id, int64 value, Mob* target, bool fr
} }
} }
if (GetClass() == CLERIC) { if (GetClass() == Class::Cleric) {
value += int64(base_value*RuleI(Spells, ClericInnateHealFocus) / 100); //confirmed on live parsing clerics get an innate 5 pct heal focus value += int64(base_value*RuleI(Spells, ClericInnateHealFocus) / 100); //confirmed on live parsing clerics get an innate 5 pct heal focus
} }
value += int64(base_value*GetFocusEffect(focusImprovedHeal, spell_id, nullptr, from_buff_tic) / 100); value += int64(base_value*GetFocusEffect(focusImprovedHeal, spell_id, nullptr, from_buff_tic) / 100);
@ -632,7 +632,7 @@ bool Client::TrainDiscipline(uint32 itemid) {
} }
const auto player_class = GetClass(); const auto player_class = GetClass();
if (player_class == WIZARD || player_class == ENCHANTER || player_class == MAGICIAN || player_class == NECROMANCER) { if (player_class == Class::Wizard || player_class == Class::Enchanter || player_class == Class::Magician || player_class == Class::Necromancer) {
Message(Chat::Red, "Your class cannot learn from this tome."); Message(Chat::Red, "Your class cannot learn from this tome.");
//summon them the item back... //summon them the item back...
SummonItem(itemid); SummonItem(itemid);
@ -906,7 +906,7 @@ bool Client::UseDiscipline(uint32 spell_id, uint32 target) {
if (reduced_recast > 0) { if (reduced_recast > 0) {
instant_recast = false; instant_recast = false;
if (GetClass() == BARD && IsCasting() && spells[spell_id].cast_time == 0) { if (GetClass() == Class::Bard && IsCasting() && spells[spell_id].cast_time == 0) {
if (DoCastingChecksOnCaster(spell_id, EQ::spells::CastingSlot::Discipline)) { if (DoCastingChecksOnCaster(spell_id, EQ::spells::CastingSlot::Discipline)) {
SpellFinished(spell_id, entity_list.GetMob(target), EQ::spells::CastingSlot::Discipline, 0, -1, spells[spell_id].resist_difficulty, false, -1, (uint32)DiscTimer, reduced_recast, false); SpellFinished(spell_id, entity_list.GetMob(target), EQ::spells::CastingSlot::Discipline, 0, -1, spells[spell_id].resist_difficulty, false, -1, (uint32)DiscTimer, reduced_recast, false);
} }
@ -921,7 +921,7 @@ bool Client::UseDiscipline(uint32 spell_id, uint32 target) {
} }
if (instant_recast) { if (instant_recast) {
if (GetClass() == BARD && IsCasting() && spells[spell_id].cast_time == 0) { if (GetClass() == Class::Bard && IsCasting() && spells[spell_id].cast_time == 0) {
if (DoCastingChecksOnCaster(spell_id, EQ::spells::CastingSlot::Discipline)) { if (DoCastingChecksOnCaster(spell_id, EQ::spells::CastingSlot::Discipline)) {
SpellFinished(spell_id, entity_list.GetMob(target), EQ::spells::CastingSlot::Discipline, 0, -1, spells[spell_id].resist_difficulty, false, -1, 0xFFFFFFFF, 0, false); SpellFinished(spell_id, entity_list.GetMob(target), EQ::spells::CastingSlot::Discipline, 0, -1, spells[spell_id].resist_difficulty, false, -1, 0xFFFFFFFF, 0, false);
} }
@ -1320,7 +1320,7 @@ void EntityList::AEAttack(
) { ) {
for (int i = 0; i < attack_rounds; i++) { for (int i = 0; i < attack_rounds; i++) {
if (!attacker->IsClient() || attacker->GetClass() == MONK || attacker->GetClass() == RANGER) { if (!attacker->IsClient() || attacker->GetClass() == Class::Monk || attacker->GetClass() == Class::Ranger) {
attacker->Attack(current_mob, Hand, false, false, is_from_spell); attacker->Attack(current_mob, Hand, false, false, is_from_spell);
} else { } else {
attacker->CastToClient()->DoAttackRounds(current_mob, Hand, is_from_spell); attacker->CastToClient()->DoAttackRounds(current_mob, Hand, is_from_spell);

View File

@ -4918,7 +4918,7 @@ void EntityList::ZoneWho(Client *c, Who_All_Struct *Who)
FormatMSGID = 5024; // 5024 %T1[ANONYMOUS] %2 %3 FormatMSGID = 5024; // 5024 %T1[ANONYMOUS] %2 %3
else if (ClientEntry->GetAnon() == 2) else if (ClientEntry->GetAnon() == 2)
FormatMSGID = 5023; // 5023 %T1[ANONYMOUS] %2 %3 %4 FormatMSGID = 5023; // 5023 %T1[ANONYMOUS] %2 %3 %4
uint32 PlayerClass = NO_CLASS; uint32 PlayerClass = Class::None;
uint32 PlayerLevel = 0; uint32 PlayerLevel = 0;
uint32 PlayerRace = RACE_DOUG_0; uint32 PlayerRace = RACE_DOUG_0;
uint32 ZoneMSGID = 0xFFFFFFFF; uint32 ZoneMSGID = 0xFFFFFFFF;
@ -4995,7 +4995,7 @@ uint32 EntityList::CheckNPCsClose(Mob *center)
auto it = npc_list.begin(); auto it = npc_list.begin();
while (it != npc_list.end()) { while (it != npc_list.end()) {
NPC *cur = it->second; NPC *cur = it->second;
if (!cur || cur == center || cur->IsPet() || cur->GetClass() == LDON_TREASURE || if (!cur || cur == center || cur->IsPet() || cur->GetClass() == Class::LDoNTreasure ||
cur->GetBodyType() == BT_NoTarget || cur->GetBodyType() == BT_Special) { cur->GetBodyType() == BT_NoTarget || cur->GetBodyType() == BT_Special) {
++it; ++it;
continue; continue;
@ -5355,7 +5355,7 @@ void EntityList::AddLootToNPCS(uint32 item_id, uint32 count)
auto it = npc_list.begin(); auto it = npc_list.begin();
while (it != npc_list.end()) { while (it != npc_list.end()) {
if (!it->second->IsPet() if (!it->second->IsPet()
&& it->second->GetClass() != LDON_TREASURE && it->second->GetClass() != Class::LDoNTreasure
&& it->second->GetBodyType() != BT_NoTarget && it->second->GetBodyType() != BT_NoTarget
&& it->second->GetBodyType() != BT_NoTarget2 && it->second->GetBodyType() != BT_NoTarget2
&& it->second->GetBodyType() != BT_Special) && it->second->GetBodyType() != BT_Special)
@ -5376,7 +5376,7 @@ void EntityList::AddLootToNPCS(uint32 item_id, uint32 count)
it = npc_list.begin(); it = npc_list.begin();
while (it != npc_list.end()) { while (it != npc_list.end()) {
if (!it->second->IsPet() if (!it->second->IsPet()
&& it->second->GetClass() != LDON_TREASURE && it->second->GetClass() != Class::LDoNTreasure
&& it->second->GetBodyType() != BT_NoTarget && it->second->GetBodyType() != BT_NoTarget
&& it->second->GetBodyType() != BT_NoTarget2 && it->second->GetBodyType() != BT_NoTarget2
&& it->second->GetBodyType() != BT_Special) && it->second->GetBodyType() != BT_Special)
@ -5429,7 +5429,7 @@ NPC *EntityList::GetClosestBanker(Mob *sender, uint32 &distance)
auto it = npc_list.begin(); auto it = npc_list.begin();
while (it != npc_list.end()) { while (it != npc_list.end()) {
if (it->second->GetClass() == BANKER) { if (it->second->GetClass() == Class::Banker) {
uint32 nd = ((it->second->GetY() - sender->GetY()) * (it->second->GetY() - sender->GetY())) + uint32 nd = ((it->second->GetY() - sender->GetY()) * (it->second->GetY() - sender->GetY())) +
((it->second->GetX() - sender->GetX()) * (it->second->GetX() - sender->GetX())); ((it->second->GetX() - sender->GetX()) * (it->second->GetX() - sender->GetX()));
if (nd < distance){ if (nd < distance){

View File

@ -529,8 +529,8 @@ public:
inline const std::unordered_map<uint16, Merc *> &GetMercList() { return merc_list; } inline const std::unordered_map<uint16, Merc *> &GetMercList() { return merc_list; }
inline const std::unordered_map<uint16, Client *> &GetClientList() { return client_list; } inline const std::unordered_map<uint16, Client *> &GetClientList() { return client_list; }
inline const std::list<Bot *> &GetBotList() { return bot_list; } inline const std::list<Bot *> &GetBotList() { return bot_list; }
std::vector<Bot *> GetBotListByCharacterID(uint32 character_id, uint8 class_id = NO_CLASS); std::vector<Bot *> GetBotListByCharacterID(uint32 character_id, uint8 class_id = Class::None);
std::vector<Bot *> GetBotListByClientName(std::string client_name, uint8 class_id = NO_CLASS); std::vector<Bot *> GetBotListByClientName(std::string client_name, uint8 class_id = Class::None);
void SignalAllBotsByOwnerCharacterID(uint32 character_id, int signal_id); void SignalAllBotsByOwnerCharacterID(uint32 character_id, int signal_id);
void SignalAllBotsByOwnerName(std::string owner_name, int signal_id); void SignalAllBotsByOwnerName(std::string owner_name, int signal_id);
void SignalBotByBotID(uint32 bot_id, int signal_id); void SignalBotByBotID(uint32 bot_id, int signal_id);

View File

@ -128,8 +128,8 @@ uint64 Client::CalcEXP(uint8 consider_level, bool ignore_modifiers) {
if (RuleB(Character, UseRaceClassExpBonuses)) { if (RuleB(Character, UseRaceClassExpBonuses)) {
if ( if (
GetClass() == WARRIOR || GetClass() == Class::Warrior ||
GetClass() == ROGUE || GetClass() == Class::Rogue ||
GetBaseRace() == HALFLING GetBaseRace() == HALFLING
) { ) {
total_modifier *= 1.05; total_modifier *= 1.05;
@ -295,7 +295,7 @@ void Client::CalculateStandardAAExp(uint64 &add_aaxp, uint8 conlevel, bool resex
aatotalmod *= 1.05; aatotalmod *= 1.05;
} }
if (GetClass() == ROGUE || GetClass() == WARRIOR) { if (GetClass() == Class::Rogue || GetClass() == Class::Warrior) {
aatotalmod *= 1.05; aatotalmod *= 1.05;
} }
} }
@ -443,7 +443,7 @@ void Client::CalculateExp(uint64 in_add_exp, uint64 &add_exp, uint64 &add_aaxp,
totalmod *= 1.05; totalmod *= 1.05;
} }
if (GetClass() == ROGUE || GetClass() == WARRIOR) { if (GetClass() == Class::Rogue || GetClass() == Class::Warrior) {
totalmod *= 1.05; totalmod *= 1.05;
} }
} }
@ -1051,15 +1051,15 @@ uint32 Client::GetEXPForLevel(uint16 check_level)
if(RuleB(Character,UseOldClassExpPenalties)) if(RuleB(Character,UseOldClassExpPenalties))
{ {
float classmod = 1.0; float classmod = 1.0;
if(GetClass() == PALADIN || GetClass() == SHADOWKNIGHT || GetClass() == RANGER || GetClass() == BARD) { if(GetClass() == Class::Paladin || GetClass() == Class::ShadowKnight || GetClass() == Class::Ranger || GetClass() == Class::Bard) {
classmod = 1.4; classmod = 1.4;
} else if(GetClass() == MONK) { } else if(GetClass() == Class::Monk) {
classmod = 1.2; classmod = 1.2;
} else if(GetClass() == WIZARD || GetClass() == ENCHANTER || GetClass() == MAGICIAN || GetClass() == NECROMANCER) { } else if(GetClass() == Class::Wizard || GetClass() == Class::Enchanter || GetClass() == Class::Magician || GetClass() == Class::Necromancer) {
classmod = 1.1; classmod = 1.1;
} else if(GetClass() == ROGUE) { } else if(GetClass() == Class::Rogue) {
classmod = 0.91; classmod = 0.91;
} else if(GetClass() == WARRIOR) { } else if(GetClass() == Class::Warrior) {
classmod = 0.9; classmod = 0.9;
} }

View File

@ -4,7 +4,7 @@ void FindClass(Client *c, const Seperator *sep)
{ {
if (sep->IsNumber(2)) { if (sep->IsNumber(2)) {
const auto class_id = Strings::ToInt(sep->arg[2]); const auto class_id = Strings::ToInt(sep->arg[2]);
if (EQ::ValueWithin(class_id, WARRIOR, BERSERKER)) { if (EQ::ValueWithin(class_id, Class::Warrior, Class::Berserker)) {
const std::string& class_name = GetClassIDName(class_id); const std::string& class_name = GetClassIDName(class_id);
c->Message( c->Message(
Chat::White, Chat::White,
@ -41,7 +41,7 @@ void FindClass(Client *c, const Seperator *sep)
auto found_count = 0; auto found_count = 0;
for (uint16 class_id = WARRIOR; class_id <= MERCENARY_MASTER; class_id++) { for (uint16 class_id = Class::Warrior; class_id <= Class::MercenaryLiaison; class_id++) {
const std::string& class_name = GetClassIDName(class_id); const std::string& class_name = GetClassIDName(class_id);
const auto& class_name_lower = Strings::ToLower(class_name); const auto& class_name_lower = Strings::ToLower(class_name);
if (!Strings::Contains(class_name_lower, search_criteria)) { if (!Strings::Contains(class_name_lower, search_criteria)) {

View File

@ -7,12 +7,12 @@ void command_merchantshop(Client *c, const Seperator *sep)
!m || !m ||
!m->IsNPC() || !m->IsNPC() ||
( (
m->GetClass() != MERCHANT && m->GetClass() != Class::Merchant &&
m->GetClass() != DISCORD_MERCHANT && m->GetClass() != Class::DiscordMerchant &&
m->GetClass() != ADVENTURE_MERCHANT && m->GetClass() != Class::AdventureMerchant &&
m->GetClass() != NORRATHS_KEEPERS_MERCHANT && m->GetClass() != Class::NorrathsKeepersMerchant &&
m->GetClass() != DARK_REIGN_MERCHANT && m->GetClass() != Class::DarkReignMerchant &&
m->GetClass() != ALT_CURRENCY_MERCHANT m->GetClass() != Class::AlternateCurrencyMerchant
) )
) { ) {
c->Message(Chat::White, "You must target a merchant."); c->Message(Chat::White, "You must target a merchant.");

View File

@ -46,7 +46,7 @@ void command_scribespell(Client *c, const Seperator *sep)
); );
if ( if (
spells[spell_id].classes[WARRIOR] != 0 && spells[spell_id].classes[Class::Warrior] != 0 &&
spells[spell_id].skill != EQ::skills::SkillTigerClaw && spells[spell_id].skill != EQ::skills::SkillTigerClaw &&
spells[spell_id].classes[t->GetPP().class_ - 1] > 0 && spells[spell_id].classes[t->GetPP().class_ - 1] > 0 &&
!IsDiscipline(spell_id) !IsDiscipline(spell_id)

View File

@ -600,7 +600,7 @@ bool HealRotation::healable_target(bool use_class_at, bool critical_only)
return false; return false;
if (healable_target->GetHPRatio() > m_safe_hp_ratio[ClassArmorType(healable_target->GetClass())]) if (healable_target->GetHPRatio() > m_safe_hp_ratio[ClassArmorType(healable_target->GetClass())])
return false; return false;
if (healable_target->IsBerserk() && (healable_target->GetClass() == WARRIOR || healable_target->GetClass() == BERSERKER)) { if (healable_target->IsBerserk() && (healable_target->GetClass() == Class::Warrior || healable_target->GetClass() == Class::Berserker)) {
if (healable_target->GetHPRatio() <= RuleI(Combat, BerserkerFrenzyEnd) && healable_target->GetHPRatio() > m_critical_hp_ratio[ClassArmorType(healable_target->GetClass())]) if (healable_target->GetHPRatio() <= RuleI(Combat, BerserkerFrenzyEnd) && healable_target->GetHPRatio() > m_critical_hp_ratio[ClassArmorType(healable_target->GetClass())])
return false; return false;
} }
@ -610,7 +610,7 @@ bool HealRotation::healable_target(bool use_class_at, bool critical_only)
return false; return false;
if (healable_target->GetHPRatio() > SAFE_HP_RATIO_BASE) if (healable_target->GetHPRatio() > SAFE_HP_RATIO_BASE)
return false; return false;
if (healable_target->IsBerserk() && (healable_target->GetClass() == WARRIOR || healable_target->GetClass() == BERSERKER)) { if (healable_target->IsBerserk() && (healable_target->GetClass() == Class::Warrior || healable_target->GetClass() == Class::Berserker)) {
if (healable_target->GetHPRatio() <= RuleI(Combat, BerserkerFrenzyEnd) && healable_target->GetHPRatio() > CRITICAL_HP_RATIO_BASE) if (healable_target->GetHPRatio() <= RuleI(Combat, BerserkerFrenzyEnd) && healable_target->GetHPRatio() > CRITICAL_HP_RATIO_BASE)
return false; return false;
} }
@ -938,9 +938,9 @@ void HealRotation::validate_hot()
bool IsHealRotationMemberClass(uint8 class_id) bool IsHealRotationMemberClass(uint8 class_id)
{ {
switch (class_id) { switch (class_id) {
case CLERIC: case Class::Cleric:
case DRUID: case Class::Druid:
case SHAMAN: case Class::Shaman:
return true; return true;
default: default:
return false; return false;

View File

@ -5431,7 +5431,7 @@ void lua_create_npc(luabind::adl::object table, float x, float y, float z, float
LuaCreateNPCParse(runspeed, float, 1.25f); LuaCreateNPCParse(runspeed, float, 1.25f);
LuaCreateNPCParse(gender, uint8, 0); LuaCreateNPCParse(gender, uint8, 0);
LuaCreateNPCParse(race, uint16, 1); LuaCreateNPCParse(race, uint16, 1);
LuaCreateNPCParse(class_, uint8, WARRIOR); LuaCreateNPCParse(class_, uint8, Class::Warrior);
LuaCreateNPCParse(bodytype, uint8, 0); LuaCreateNPCParse(bodytype, uint8, 0);
LuaCreateNPCParse(deity, uint8, 0); LuaCreateNPCParse(deity, uint8, 0);
LuaCreateNPCParse(level, uint8, 1); LuaCreateNPCParse(level, uint8, 1);
@ -6778,51 +6778,52 @@ luabind::scope lua_register_classes() {
return luabind::class_<Classes>("Class") return luabind::class_<Classes>("Class")
.enum_("constants") .enum_("constants")
[( [(
luabind::value("WARRIOR", WARRIOR), luabind::value("WARRIOR", Class::Warrior),
luabind::value("CLERIC", CLERIC), luabind::value("CLERIC", Class::Cleric),
luabind::value("PALADIN", PALADIN), luabind::value("PALADIN", Class::Paladin),
luabind::value("RANGER", RANGER), luabind::value("RANGER", Class::Ranger),
luabind::value("SHADOWKNIGHT", SHADOWKNIGHT), luabind::value("SHADOWKNIGHT", Class::ShadowKnight),
luabind::value("DRUID", DRUID), luabind::value("DRUID", Class::Druid),
luabind::value("MONK", MONK), luabind::value("MONK", Class::Monk),
luabind::value("BARD", BARD), luabind::value("BARD", Class::Bard),
luabind::value("ROGUE", ROGUE), luabind::value("ROGUE", Class::Rogue),
luabind::value("SHAMAN", SHAMAN), luabind::value("SHAMAN", Class::Shaman),
luabind::value("NECROMANCER", NECROMANCER), luabind::value("NECROMANCER", Class::Necromancer),
luabind::value("WIZARD", WIZARD), luabind::value("WIZARD", Class::Wizard),
luabind::value("MAGICIAN", MAGICIAN), luabind::value("MAGICIAN", Class::Magician),
luabind::value("ENCHANTER", ENCHANTER), luabind::value("ENCHANTER", Class::Enchanter),
luabind::value("BEASTLORD", BEASTLORD), luabind::value("BEASTLORD", Class::Beastlord),
luabind::value("BERSERKER", BERSERKER), luabind::value("BERSERKER", Class::Berserker),
luabind::value("WARRIORGM", WARRIORGM), luabind::value("WARRIORGM", Class::WarriorGM),
luabind::value("CLERICGM", CLERICGM), luabind::value("CLERICGM", Class::ClericGM),
luabind::value("PALADINGM", PALADINGM), luabind::value("PALADINGM", Class::PaladinGM),
luabind::value("RANGERGM", RANGERGM), luabind::value("RANGERGM", Class::RangerGM),
luabind::value("SHADOWKNIGHTGM", SHADOWKNIGHTGM), luabind::value("SHADOWKNIGHTGM", Class::ShadowKnightGM),
luabind::value("DRUIDGM", DRUIDGM), luabind::value("DRUIDGM", Class::DruidGM),
luabind::value("MONKGM", MONKGM), luabind::value("MONKGM", Class::MonkGM),
luabind::value("BARDGM", BARDGM), luabind::value("BARDGM", Class::BardGM),
luabind::value("ROGUEGM", ROGUEGM), luabind::value("ROGUEGM", Class::RogueGM),
luabind::value("SHAMANGM", SHAMANGM), luabind::value("SHAMANGM", Class::ShamanGM),
luabind::value("NECROMANCERGM", NECROMANCERGM), luabind::value("NECROMANCERGM", Class::NecromancerGM),
luabind::value("WIZARDGM", WIZARDGM), luabind::value("WIZARDGM", Class::WizardGM),
luabind::value("MAGICIANGM", MAGICIANGM), luabind::value("MAGICIANGM", Class::MagicianGM),
luabind::value("ENCHANTERGM", ENCHANTERGM), luabind::value("ENCHANTERGM", Class::EnchanterGM),
luabind::value("BEASTLORDGM", BEASTLORDGM), luabind::value("BEASTLORDGM", Class::BeastlordGM),
luabind::value("BERSERKERGM", BERSERKERGM), luabind::value("BERSERKERGM", Class::BerserkerGM),
luabind::value("BANKER", BANKER), luabind::value("BANKER", Class::Banker),
luabind::value("MERCHANT", MERCHANT), luabind::value("MERCHANT", Class::Merchant),
luabind::value("DISCORD_MERCHANT", DISCORD_MERCHANT), luabind::value("DISCORD_MERCHANT", Class::DiscordMerchant),
luabind::value("ADVENTURE_RECRUITER", ADVENTURE_RECRUITER), luabind::value("ADVENTURE_RECRUITER", Class::AdventureRecruiter),
luabind::value("ADVENTURE_MERCHANT", ADVENTURE_MERCHANT), luabind::value("ADVENTURE_MERCHANT", Class::AdventureMerchant),
luabind::value("LDON_TREASURE", LDON_TREASURE), luabind::value("LDON_TREASURE", Class::LDoNTreasure),
luabind::value("TRIBUTE_MASTER", TRIBUTE_MASTER), luabind::value("TRIBUTE_MASTER", Class::TributeMaster),
luabind::value("GUILD_TRIBUTE_MASTER", GUILD_TRIBUTE_MASTER), luabind::value("GUILD_TRIBUTE_MASTER", Class::GuildTributeMaster),
luabind::value("NORRATHS_KEEPERS_MERCHANT", NORRATHS_KEEPERS_MERCHANT), luabind::value("GUILD_BANKER", Class::GuildBanker),
luabind::value("DARK_REIGN_MERCHANT", DARK_REIGN_MERCHANT), luabind::value("NORRATHS_KEEPERS_MERCHANT", Class::NorrathsKeepersMerchant),
luabind::value("FELLOWSHIP_MASTER", FELLOWSHIP_MASTER), luabind::value("DARK_REIGN_MERCHANT", Class::DarkReignMerchant),
luabind::value("ALT_CURRENCY_MERCHANT", ALT_CURRENCY_MERCHANT), luabind::value("FELLOWSHIP_MASTER", Class::FellowshipMaster),
luabind::value("MERCENARY_MASTER", MERCENARY_MASTER) luabind::value("ALT_CURRENCY_MERCHANT", Class::AlternateCurrencyMerchant),
luabind::value("MERCENARY_MASTER", Class::MercenaryLiaison)
)]; )];
} }

View File

@ -60,7 +60,7 @@ Merc::Merc(const NPCType* d, float x, float y, float z, float heading)
SetStance(EQ::constants::stanceBalanced); SetStance(EQ::constants::stanceBalanced);
rest_timer.Disable(); rest_timer.Disable();
if (GetClass() == ROGUE) if (GetClass() == Class::Rogue)
evade_timer.Start(); evade_timer.Start();
int r; int r;
@ -1090,7 +1090,7 @@ void Merc::AI_Process() {
float meleeDistance = GetMaxMeleeRangeToTarget(GetTarget()); float meleeDistance = GetMaxMeleeRangeToTarget(GetTarget());
if(GetClass() == SHADOWKNIGHT || GetClass() == PALADIN || GetClass() == WARRIOR) { if(GetClass() == Class::ShadowKnight || GetClass() == Class::Paladin || GetClass() == Class::Warrior) {
meleeDistance = meleeDistance * .30; meleeDistance = meleeDistance * .30;
} }
else { else {
@ -1118,7 +1118,7 @@ void Merc::AI_Process() {
if(AI_movement_timer->Check()) { if(AI_movement_timer->Check()) {
if (!IsMoving()) { if (!IsMoving()) {
if (GetClass() == ROGUE) { if (GetClass() == Class::Rogue) {
if (HasTargetReflection() && !GetTarget()->IsFeared() && !GetTarget()->IsStunned()) { if (HasTargetReflection() && !GetTarget()->IsFeared() && !GetTarget()->IsStunned()) {
// Hate redux actions // Hate redux actions
if (evade_timer.Check(false)) { if (evade_timer.Check(false)) {
@ -1161,7 +1161,7 @@ void Merc::AI_Process() {
} }
} }
} }
else if (GetClass() != ROGUE && (DistanceSquaredNoZ(m_Position, GetTarget()->GetPosition()) < GetTarget()->GetSize())) { else if (GetClass() != Class::Rogue && (DistanceSquaredNoZ(m_Position, GetTarget()->GetPosition()) < GetTarget()->GetSize())) {
// If we are not a rogue trying to backstab, let's try to adjust our melee range so we don't appear to be bunched up // If we are not a rogue trying to backstab, let's try to adjust our melee range so we don't appear to be bunched up
float newX = 0; float newX = 0;
float newY = 0; float newY = 0;
@ -1240,7 +1240,7 @@ void Merc::AI_Process() {
} }
// TODO: Do mercs berserk? Find this out on live... // TODO: Do mercs berserk? Find this out on live...
//if (GetClass() == WARRIOR || GetClass() == BERSERKER) { //if (GetClass() == Class::Warrior || GetClass() == Class::Berserker) {
// if(GetHP() > 0 && !berserk && GetHPRatio() < 30) { // if(GetHP() > 0 && !berserk && GetHPRatio() < 30) {
// entity_list.MessageCloseString(this, false, 200, 0, BERSERK_START, GetName()); // entity_list.MessageCloseString(this, false, 200, 0, BERSERK_START, GetName());
// berserk = true; // berserk = true;
@ -1685,8 +1685,8 @@ bool Merc::AICastSpell(int8 iChance, uint32 iSpellTypes) {
continue; continue;
} }
if(IsEngaged() && (g->members[i]->GetClass() == NECROMANCER && hpr >= 50) if(IsEngaged() && (g->members[i]->GetClass() == Class::Necromancer && hpr >= 50)
|| (g->members[i]->GetClass() == SHAMAN && hpr >= 80)) { || (g->members[i]->GetClass() == Class::Shaman && hpr >= 80)) {
//allow necros to lifetap & shaman to canni without wasting mana //allow necros to lifetap & shaman to canni without wasting mana
continue; continue;
} }

View File

@ -983,33 +983,33 @@ int64 Mob::GetSpellHPBonuses() {
char Mob::GetCasterClass() const { char Mob::GetCasterClass() const {
switch(class_) switch(class_)
{ {
case CLERIC: case Class::Cleric:
case PALADIN: case Class::Paladin:
case RANGER: case Class::Ranger:
case DRUID: case Class::Druid:
case SHAMAN: case Class::Shaman:
case BEASTLORD: case Class::Beastlord:
case CLERICGM: case Class::ClericGM:
case PALADINGM: case Class::PaladinGM:
case RANGERGM: case Class::RangerGM:
case DRUIDGM: case Class::DruidGM:
case SHAMANGM: case Class::ShamanGM:
case BEASTLORDGM: case Class::BeastlordGM:
return 'W'; return 'W';
break; break;
case SHADOWKNIGHT: case Class::ShadowKnight:
case BARD: case Class::Bard:
case NECROMANCER: case Class::Necromancer:
case WIZARD: case Class::Wizard:
case MAGICIAN: case Class::Magician:
case ENCHANTER: case Class::Enchanter:
case SHADOWKNIGHTGM: case Class::ShadowKnightGM:
case BARDGM: case Class::BardGM:
case NECROMANCERGM: case Class::NecromancerGM:
case WIZARDGM: case Class::WizardGM:
case MAGICIANGM: case Class::MagicianGM:
case ENCHANTERGM: case Class::EnchanterGM:
return 'I'; return 'I';
break; break;
@ -1022,42 +1022,42 @@ char Mob::GetCasterClass() const {
uint8 Mob::GetArchetype() const { uint8 Mob::GetArchetype() const {
switch(class_) switch(class_)
{ {
case PALADIN: case Class::Paladin:
case RANGER: case Class::Ranger:
case SHADOWKNIGHT: case Class::ShadowKnight:
case BARD: case Class::Bard:
case BEASTLORD: case Class::Beastlord:
case PALADINGM: case Class::PaladinGM:
case RANGERGM: case Class::RangerGM:
case SHADOWKNIGHTGM: case Class::ShadowKnightGM:
case BARDGM: case Class::BardGM:
case BEASTLORDGM: case Class::BeastlordGM:
return ARCHETYPE_HYBRID; return ARCHETYPE_HYBRID;
break; break;
case CLERIC: case Class::Cleric:
case DRUID: case Class::Druid:
case SHAMAN: case Class::Shaman:
case NECROMANCER: case Class::Necromancer:
case WIZARD: case Class::Wizard:
case MAGICIAN: case Class::Magician:
case ENCHANTER: case Class::Enchanter:
case CLERICGM: case Class::ClericGM:
case DRUIDGM: case Class::DruidGM:
case SHAMANGM: case Class::ShamanGM:
case NECROMANCERGM: case Class::NecromancerGM:
case WIZARDGM: case Class::WizardGM:
case MAGICIANGM: case Class::MagicianGM:
case ENCHANTERGM: case Class::EnchanterGM:
return ARCHETYPE_CASTER; return ARCHETYPE_CASTER;
break; break;
case WARRIOR: case Class::Warrior:
case MONK: case Class::Monk:
case ROGUE: case Class::Rogue:
case BERSERKER: case Class::Berserker:
case WARRIORGM: case Class::WarriorGM:
case MONKGM: case Class::MonkGM:
case ROGUEGM: case Class::RogueGM:
case BERSERKERGM: case Class::BerserkerGM:
return ARCHETYPE_MELEE; return ARCHETYPE_MELEE;
break; break;
default: default:
@ -1069,73 +1069,73 @@ uint8 Mob::GetArchetype() const {
void Mob::SetSpawnLastNameByClass(NewSpawn_Struct* ns) void Mob::SetSpawnLastNameByClass(NewSpawn_Struct* ns)
{ {
switch (ns->spawn.class_) { switch (ns->spawn.class_) {
case TRIBUTE_MASTER: case Class::TributeMaster:
strcpy(ns->spawn.lastName, "Tribute Master"); strcpy(ns->spawn.lastName, "Tribute Master");
break; break;
case GUILD_TRIBUTE_MASTER: case Class::GuildTributeMaster:
strcpy(ns->spawn.lastName, "Guild Tribute Master"); strcpy(ns->spawn.lastName, "Guild Tribute Master");
break; break;
case GUILD_BANKER: case Class::GuildBanker:
strcpy(ns->spawn.lastName, "Guild Banker"); strcpy(ns->spawn.lastName, "Guild Banker");
break; break;
case ADVENTURE_RECRUITER: case Class::AdventureRecruiter:
strcpy(ns->spawn.lastName, "Adventure Recruiter"); strcpy(ns->spawn.lastName, "Adventure Recruiter");
break; break;
case ADVENTURE_MERCHANT: case Class::AdventureMerchant:
strcpy(ns->spawn.lastName, "Adventure Merchant"); strcpy(ns->spawn.lastName, "Adventure Merchant");
break; break;
case BANKER: case Class::Banker:
strcpy(ns->spawn.lastName, "Banker"); strcpy(ns->spawn.lastName, "Banker");
break; break;
case WARRIORGM: case Class::WarriorGM:
strcpy(ns->spawn.lastName, "Warrior Guildmaster"); strcpy(ns->spawn.lastName, "Warrior Guildmaster");
break; break;
case CLERICGM: case Class::ClericGM:
strcpy(ns->spawn.lastName, "Cleric Guildmaster"); strcpy(ns->spawn.lastName, "Cleric Guildmaster");
break; break;
case PALADINGM: case Class::PaladinGM:
strcpy(ns->spawn.lastName, "Paladin Guildmaster"); strcpy(ns->spawn.lastName, "Paladin Guildmaster");
break; break;
case RANGERGM: case Class::RangerGM:
strcpy(ns->spawn.lastName, "Ranger Guildmaster"); strcpy(ns->spawn.lastName, "Ranger Guildmaster");
break; break;
case SHADOWKNIGHTGM: case Class::ShadowKnightGM:
strcpy(ns->spawn.lastName, "Shadow Knight Guildmaster"); strcpy(ns->spawn.lastName, "Shadow Knight Guildmaster");
break; break;
case DRUIDGM: case Class::DruidGM:
strcpy(ns->spawn.lastName, "Druid Guildmaster"); strcpy(ns->spawn.lastName, "Druid Guildmaster");
break; break;
case MONKGM: case Class::MonkGM:
strcpy(ns->spawn.lastName, "Monk Guildmaster"); strcpy(ns->spawn.lastName, "Monk Guildmaster");
break; break;
case BARDGM: case Class::BardGM:
strcpy(ns->spawn.lastName, "Bard Guildmaster"); strcpy(ns->spawn.lastName, "Bard Guildmaster");
break; break;
case ROGUEGM: case Class::RogueGM:
strcpy(ns->spawn.lastName, "Rogue Guildmaster"); strcpy(ns->spawn.lastName, "Rogue Guildmaster");
break; break;
case SHAMANGM: case Class::ShamanGM:
strcpy(ns->spawn.lastName, "Shaman Guildmaster"); strcpy(ns->spawn.lastName, "Shaman Guildmaster");
break; break;
case NECROMANCERGM: case Class::NecromancerGM:
strcpy(ns->spawn.lastName, "Necromancer Guildmaster"); strcpy(ns->spawn.lastName, "Necromancer Guildmaster");
break; break;
case WIZARDGM: case Class::WizardGM:
strcpy(ns->spawn.lastName, "Wizard Guildmaster"); strcpy(ns->spawn.lastName, "Wizard Guildmaster");
break; break;
case MAGICIANGM: case Class::MagicianGM:
strcpy(ns->spawn.lastName, "Magician Guildmaster"); strcpy(ns->spawn.lastName, "Magician Guildmaster");
break; break;
case ENCHANTERGM: case Class::EnchanterGM:
strcpy(ns->spawn.lastName, "Enchanter Guildmaster"); strcpy(ns->spawn.lastName, "Enchanter Guildmaster");
break; break;
case BEASTLORDGM: case Class::BeastlordGM:
strcpy(ns->spawn.lastName, "Beastlord Guildmaster"); strcpy(ns->spawn.lastName, "Beastlord Guildmaster");
break; break;
case BERSERKERGM: case Class::BerserkerGM:
strcpy(ns->spawn.lastName, "Berserker Guildmaster"); strcpy(ns->spawn.lastName, "Berserker Guildmaster");
break; break;
case MERCENARY_MASTER: case Class::MercenaryLiaison:
strcpy(ns->spawn.lastName, "Mercenary Liaison"); strcpy(ns->spawn.lastName, "Mercenary Liaison");
break; break;
default: default:
@ -1346,8 +1346,8 @@ void Mob::FillSpawnStruct(NewSpawn_Struct* ns, Mob* ForWho)
} }
if (RuleB(Character, AllowCrossClassTrainers) && ForWho) { if (RuleB(Character, AllowCrossClassTrainers) && ForWho) {
if (ns->spawn.class_ >= WARRIORGM && ns->spawn.class_ <= BERSERKERGM) { if (ns->spawn.class_ >= Class::WarriorGM && ns->spawn.class_ <= Class::BerserkerGM) {
int trainer_class = WARRIORGM + (ForWho->GetClass() - 1); int trainer_class = Class::WarriorGM + (ForWho->GetClass() - 1);
ns->spawn.class_ = trainer_class; ns->spawn.class_ = trainer_class;
} }
} }
@ -2118,7 +2118,7 @@ void Mob::SendStatsWindow(Client* c, bool use_window)
std::string bard_info; std::string bard_info;
if (GetClass() == BARD) { if (GetClass() == Class::Bard) {
const auto brass_mod = IsBot() ? CastToBot()->GetBrassMod() : CastToClient()->GetBrassMod(); const auto brass_mod = IsBot() ? CastToBot()->GetBrassMod() : CastToClient()->GetBrassMod();
const auto perc_mod = IsBot() ? CastToBot()->GetPercMod() : CastToClient()->GetPercMod(); const auto perc_mod = IsBot() ? CastToBot()->GetPercMod() : CastToClient()->GetPercMod();
const auto sing_mod = IsBot() ? CastToBot()->GetSingMod() : CastToClient()->GetSingMod(); const auto sing_mod = IsBot() ? CastToBot()->GetSingMod() : CastToClient()->GetSingMod();
@ -2419,7 +2419,7 @@ void Mob::SendStatsWindow(Client* c, bool use_window)
} }
// Bard Modifiers // Bard Modifiers
if (GetClass() == BARD) { if (GetClass() == Class::Bard) {
final_string += bard_info + DialogueWindow::Break(1); final_string += bard_info + DialogueWindow::Break(1);
} }
@ -2688,7 +2688,7 @@ void Mob::SendStatsWindow(Client* c, bool use_window)
); );
} }
if (GetClass() == BARD) { if (GetClass() == Class::Bard) {
const auto brass_mod = IsBot() ? CastToBot()->GetBrassMod() : CastToClient()->GetBrassMod(); const auto brass_mod = IsBot() ? CastToBot()->GetBrassMod() : CastToClient()->GetBrassMod();
const auto perc_mod = IsBot() ? CastToBot()->GetPercMod() : CastToClient()->GetPercMod(); const auto perc_mod = IsBot() ? CastToBot()->GetPercMod() : CastToClient()->GetPercMod();
const auto sing_mod = IsBot() ? CastToBot()->GetSingMod() : CastToClient()->GetSingMod(); const auto sing_mod = IsBot() ? CastToBot()->GetSingMod() : CastToClient()->GetSingMod();
@ -4531,7 +4531,7 @@ bool Mob::CanThisClassDualWield(void) const {
// Dual-Wielding Empty Fists // Dual-Wielding Empty Fists
if(!pinst && !sinst) if(!pinst && !sinst)
if(class_ != MONK && class_ != MONKGM && class_ != BEASTLORD && class_ != BEASTLORDGM) if(class_ != Class::Monk && class_ != Class::MonkGM && class_ != Class::Beastlord && class_ != Class::BeastlordGM)
return false; return false;
return true; return true;
@ -4564,24 +4564,24 @@ bool Mob::IsWarriorClass(void) const
{ {
switch(GetClass()) switch(GetClass())
{ {
case WARRIOR: case Class::Warrior:
case WARRIORGM: case Class::WarriorGM:
case ROGUE: case Class::Rogue:
case ROGUEGM: case Class::RogueGM:
case MONK: case Class::Monk:
case MONKGM: case Class::MonkGM:
case PALADIN: case Class::Paladin:
case PALADINGM: case Class::PaladinGM:
case SHADOWKNIGHT: case Class::ShadowKnight:
case SHADOWKNIGHTGM: case Class::ShadowKnightGM:
case RANGER: case Class::Ranger:
case RANGERGM: case Class::RangerGM:
case BEASTLORD: case Class::Beastlord:
case BEASTLORDGM: case Class::BeastlordGM:
case BERSERKER: case Class::Berserker:
case BERSERKERGM: case Class::BerserkerGM:
case BARD: case Class::Bard:
case BARDGM: case Class::BardGM:
{ {
return true; return true;
} }
@ -5185,7 +5185,7 @@ int32 Mob::GetActSpellCasttime(uint16 spell_id, int32 casttime)
int32 cast_reducer_no_limit = GetFocusEffect(focusFcCastTimeMod2, spell_id); int32 cast_reducer_no_limit = GetFocusEffect(focusFcCastTimeMod2, spell_id);
if (level > 50 && casttime >= 3000 && !spells[spell_id].good_effect && if (level > 50 && casttime >= 3000 && !spells[spell_id].good_effect &&
(GetClass() == RANGER || GetClass() == SHADOWKNIGHT || GetClass() == PALADIN || GetClass() == BEASTLORD)) { (GetClass() == Class::Ranger || GetClass() == Class::ShadowKnight || GetClass() == Class::Paladin || GetClass() == Class::Beastlord)) {
int level_mod = std::min(15, GetLevel() - 50); int level_mod = std::min(15, GetLevel() - 50);
cast_reducer += level_mod * 3; cast_reducer += level_mod * 3;
} }
@ -7520,29 +7520,23 @@ int32 Mob::GetSpellStat(uint32 spell_id, const char *identifier, uint8 slot)
bool Mob::CanClassEquipItem(uint32 item_id) bool Mob::CanClassEquipItem(uint32 item_id)
{ {
const EQ::ItemData* itm = nullptr; const auto *item = database.GetItem(item_id);
itm = database.GetItem(item_id); if (!item) {
if (!itm) {
return false; return false;
} }
auto item_classes = itm->Classes; const uint16 item_classes = item->Classes;
if(item_classes == PLAYER_CLASS_ALL_MASK) { if (item_classes == Class::ALL_CLASSES_BITMASK) {
return true; return true;
} }
auto class_id = GetClass(); const uint8 class_id = GetClass();
if (class_id > BERSERKER) { if (!IsPlayerClass(class_id)) {
return false; return false;
} }
int class_bitmask = GetPlayerClassBit(class_id); const uint16 class_bitmask = GetPlayerClassBit(class_id);
if(!(item_classes & class_bitmask)) { return (item_classes & class_bitmask);
return false;
} else {
return true;
}
} }
bool Mob::CanRaceEquipItem(uint32 item_id) bool Mob::CanRaceEquipItem(uint32 item_id)
@ -8264,37 +8258,37 @@ std::string Mob::GetRacePlural()
std::string Mob::GetClassPlural() std::string Mob::GetClassPlural()
{ {
switch (GetClass()) { switch (GetClass()) {
case WARRIOR: case Class::Warrior:
return "Warriors"; return "Warriors";
case CLERIC: case Class::Cleric:
return "Clerics"; return "Clerics";
case PALADIN: case Class::Paladin:
return "Paladins"; return "Paladins";
case RANGER: case Class::Ranger:
return "Rangers"; return "Rangers";
case SHADOWKNIGHT: case Class::ShadowKnight:
return "Shadowknights"; return fmt::format("{}s", shadow_knight_class_name);
case DRUID: case Class::Druid:
return "Druids"; return "Druids";
case MONK: case Class::Monk:
return "Monks"; return "Monks";
case BARD: case Class::Bard:
return "Bards"; return "Bards";
case ROGUE: case Class::Rogue:
return "Rogues"; return "Rogues";
case SHAMAN: case Class::Shaman:
return "Shamans"; return "Shamans";
case NECROMANCER: case Class::Necromancer:
return "Necromancers"; return "Necromancers";
case WIZARD: case Class::Wizard:
return "Wizards"; return "Wizards";
case MAGICIAN: case Class::Magician:
return "Magicians"; return "Magicians";
case ENCHANTER: case Class::Enchanter:
return "Enchanters"; return "Enchanters";
case BEASTLORD: case Class::Beastlord:
return "Beastlords"; return "Beastlords";
case BERSERKER: case Class::Berserker:
return "Berserkers"; return "Berserkers";
default: default:
return "Classes"; return "Classes";

View File

@ -1330,7 +1330,7 @@ void Mob::AI_Process() {
// Now pursue // Now pursue
// TODO: Check here for another person on hate list with close hate value // TODO: Check here for another person on hate list with close hate value
if (AI_PursueCastCheck()) { if (AI_PursueCastCheck()) {
if (IsCasting() && GetClass() != BARD) { if (IsCasting() && GetClass() != Class::Bard) {
StopNavigation(); StopNavigation();
FaceTarget(); FaceTarget();
} }
@ -1382,7 +1382,7 @@ void Mob::AI_Process() {
} }
} }
if (AI_IdleCastCheck()) { if (AI_IdleCastCheck()) {
if (IsCasting() && GetClass() != BARD) { if (IsCasting() && GetClass() != Class::Bard) {
StopNavigation(); StopNavigation();
} }
} }

View File

@ -245,12 +245,12 @@ NPC::NPC(const NPCType *npc_type_data, Spawn2 *in_respawn, const glm::vec4 &posi
MerchantType = npc_type_data->merchanttype; MerchantType = npc_type_data->merchanttype;
merchant_open = ( merchant_open = (
GetClass() == MERCHANT || GetClass() == Class::Merchant ||
GetClass() == DISCORD_MERCHANT || GetClass() == Class::DiscordMerchant ||
GetClass() == ADVENTURE_MERCHANT || GetClass() == Class::AdventureMerchant ||
GetClass() == NORRATHS_KEEPERS_MERCHANT || GetClass() == Class::NorrathsKeepersMerchant ||
GetClass() == DARK_REIGN_MERCHANT || GetClass() == Class::DarkReignMerchant ||
GetClass() == ALT_CURRENCY_MERCHANT GetClass() == Class::AlternateCurrencyMerchant
); );
adventure_template_id = npc_type_data->adventure_template; adventure_template_id = npc_type_data->adventure_template;
flymode = iflymode; flymode = iflymode;
@ -294,7 +294,7 @@ NPC::NPC(const NPCType *npc_type_data, Spawn2 *in_respawn, const glm::vec4 &posi
innate_proc_spell_id = 0; innate_proc_spell_id = 0;
m_record_loot_stats = false; m_record_loot_stats = false;
if (GetClass() == MERCENARY_MASTER && RuleB(Mercs, AllowMercs)) { if (GetClass() == Class::MercenaryLiaison && RuleB(Mercs, AllowMercs)) {
LoadMercTypes(); LoadMercTypes();
LoadMercs(); LoadMercs();
} }
@ -364,10 +364,10 @@ NPC::NPC(const NPCType *npc_type_data, Spawn2 *in_respawn, const glm::vec4 &posi
// There are some known low level SHM/BST pets that do not follow this, which supports // There are some known low level SHM/BST pets that do not follow this, which supports
// the theory of needing to be able to set skills for each mob separately // the theory of needing to be able to set skills for each mob separately
if (IsBot()) { if (IsBot()) {
if (GetClass() != PALADIN && GetClass() != SHADOWKNIGHT) { if (GetClass() != Class::Paladin && GetClass() != Class::ShadowKnight) {
knightattack_timer.Disable(); knightattack_timer.Disable();
} }
else if (GetClass() != MONK || GetLevel() < 10) { else if (GetClass() != Class::Monk || GetLevel() < 10) {
monkattack_timer.Disable(); monkattack_timer.Disable();
} }
} }

View File

@ -417,7 +417,7 @@ uint32 NpcScaleManager::GetClassLevelDamageMod(uint32 level, uint32 npc_class)
uint32 multiplier; uint32 multiplier;
switch (npc_class) { switch (npc_class) {
case WARRIOR: { case Class::Warrior: {
if (level < 20) { if (level < 20) {
multiplier = 220; multiplier = 220;
} }
@ -444,9 +444,9 @@ uint32 NpcScaleManager::GetClassLevelDamageMod(uint32 level, uint32 npc_class)
} }
break; break;
} }
case DRUID: case Class::Druid:
case CLERIC: case Class::Cleric:
case SHAMAN: { case Class::Shaman: {
if (level < 70) { if (level < 70) {
multiplier = 150; multiplier = 150;
} }
@ -455,9 +455,9 @@ uint32 NpcScaleManager::GetClassLevelDamageMod(uint32 level, uint32 npc_class)
} }
break; break;
} }
case BERSERKER: case Class::Berserker:
case PALADIN: case Class::Paladin:
case SHADOWKNIGHT: { case Class::ShadowKnight: {
if (level < 35) { if (level < 35) {
multiplier = 210; multiplier = 210;
} }
@ -481,10 +481,10 @@ uint32 NpcScaleManager::GetClassLevelDamageMod(uint32 level, uint32 npc_class)
} }
break; break;
} }
case MONK: case Class::Monk:
case BARD: case Class::Bard:
case ROGUE: case Class::Rogue:
case BEASTLORD: { case Class::Beastlord: {
if (level < 51) { if (level < 51) {
multiplier = 180; multiplier = 180;
} }
@ -499,7 +499,7 @@ uint32 NpcScaleManager::GetClassLevelDamageMod(uint32 level, uint32 npc_class)
} }
break; break;
} }
case RANGER: { case Class::Ranger: {
if (level < 58) { if (level < 58) {
multiplier = 200; multiplier = 200;
} }
@ -511,10 +511,10 @@ uint32 NpcScaleManager::GetClassLevelDamageMod(uint32 level, uint32 npc_class)
} }
break; break;
} }
case MAGICIAN: case Class::Magician:
case WIZARD: case Class::Wizard:
case NECROMANCER: case Class::Necromancer:
case ENCHANTER: { case Class::Enchanter: {
if (level < 70) { if (level < 70) {
multiplier = 120; multiplier = 120;
} }

View File

@ -70,7 +70,7 @@ void Petition::SendPetitionToPlayer(Client* clientto) {
Petition::Petition(uint32 id) Petition::Petition(uint32 id)
{ {
petid = id; petid = id;
charclass = NO_CLASS; charclass = Class::None;
charrace = RACE_DOUG_0; charrace = RACE_DOUG_0;
charlevel = 0; charlevel = 0;
checkouts = 0; checkouts = 0;

View File

@ -1029,10 +1029,10 @@ bool QuestManager::isdisctome(uint32 item_id) {
//we know for sure none of the int casters get disciplines //we know for sure none of the int casters get disciplines
uint32 class_bit = 0; uint32 class_bit = 0;
class_bit |= 1 << (WIZARD - 1); class_bit |= 1 << (Class::Wizard - 1);
class_bit |= 1 << (ENCHANTER - 1); class_bit |= 1 << (Class::Enchanter - 1);
class_bit |= 1 << (MAGICIAN - 1); class_bit |= 1 << (Class::Magician - 1);
class_bit |= 1 << (NECROMANCER - 1); class_bit |= 1 << (Class::Necromancer - 1);
if (item->Classes & class_bit) { if (item->Classes & class_bit) {
return false; return false;
} }
@ -1045,10 +1045,10 @@ bool QuestManager::isdisctome(uint32 item_id) {
//we know for sure none of the int casters get disciplines //we know for sure none of the int casters get disciplines
const auto& spell = spells[spell_id]; const auto& spell = spells[spell_id];
if( if(
spell.classes[WIZARD - 1] != 255 && spell.classes[Class::Wizard - 1] != 255 &&
spell.classes[ENCHANTER - 1] != 255 && spell.classes[Class::Enchanter - 1] != 255 &&
spell.classes[MAGICIAN - 1] != 255 && spell.classes[Class::Magician - 1] != 255 &&
spell.classes[NECROMANCER - 1] != 255 spell.classes[Class::Necromancer - 1] != 255
) { ) {
return false; return false;
} }
@ -3128,7 +3128,7 @@ void QuestManager::UpdateSpawnTimer(uint32 id, uint32 newTime)
void QuestManager::MerchantSetItem(uint32 NPCid, uint32 itemid, uint32 quantity) { void QuestManager::MerchantSetItem(uint32 NPCid, uint32 itemid, uint32 quantity) {
Mob* merchant = entity_list.GetMobByNpcTypeID(NPCid); Mob* merchant = entity_list.GetMobByNpcTypeID(NPCid);
if (merchant == 0 || !merchant->IsNPC() || (merchant->GetClass() != MERCHANT)) if (merchant == 0 || !merchant->IsNPC() || (merchant->GetClass() != Class::Merchant))
return; // don't do anything if NPCid isn't a merchant return; // don't do anything if NPCid isn't a merchant
const EQ::ItemData* item = nullptr; const EQ::ItemData* item = nullptr;
@ -3141,7 +3141,7 @@ void QuestManager::MerchantSetItem(uint32 NPCid, uint32 itemid, uint32 quantity)
uint32 QuestManager::MerchantCountItem(uint32 NPCid, uint32 itemid) { uint32 QuestManager::MerchantCountItem(uint32 NPCid, uint32 itemid) {
Mob* merchant = entity_list.GetMobByNpcTypeID(NPCid); Mob* merchant = entity_list.GetMobByNpcTypeID(NPCid);
if (merchant == 0 || !merchant->IsNPC() || (merchant->GetClass() != MERCHANT)) if (merchant == 0 || !merchant->IsNPC() || (merchant->GetClass() != Class::Merchant))
return 0; // if it isn't a merchant, it doesn't have any items return 0; // if it isn't a merchant, it doesn't have any items
const EQ::ItemData* item = nullptr; const EQ::ItemData* item = nullptr;

View File

@ -365,8 +365,8 @@ public:
std::string GetEncounter() const; std::string GetEncounter() const;
inline bool ProximitySayInUse() { return HaveProximitySays; } inline bool ProximitySayInUse() { return HaveProximitySays; }
int createbotcount(uint8 class_id = NO_CLASS); int createbotcount(uint8 class_id = Class::None);
int spawnbotcount(uint8 class_id = NO_CLASS); int spawnbotcount(uint8 class_id = Class::None);
bool botquest(); bool botquest();
bool createBot(const char *name, const char *lastname, uint8 level, uint16 race, uint8 botclass, uint8 gender); bool createBot(const char *name, const char *lastname, uint8 level, uint16 race, uint8 botclass, uint8 gender);

View File

@ -287,7 +287,7 @@ void Client::OPCombatAbility(const CombatAbility_Struct *ca_atk)
// make sure were actually able to use such an attack. (Bards can throw while casting. ~Kayen confirmed on live 1/22) // make sure were actually able to use such an attack. (Bards can throw while casting. ~Kayen confirmed on live 1/22)
if ( if (
(spellend_timer.Enabled() && GetClass() != BARD) || (spellend_timer.Enabled() && GetClass() != Class::Bard) ||
IsFeared() || IsFeared() ||
IsStunned() || IsStunned() ||
IsMezzed() || IsMezzed() ||
@ -420,7 +420,7 @@ void Client::OPCombatAbility(const CombatAbility_Struct *ca_atk)
CheckIncreaseSkill(EQ::skills::SkillFrenzy, GetTarget(), 10); CheckIncreaseSkill(EQ::skills::SkillFrenzy, GetTarget(), 10);
DoAnim(anim1HWeapon, 0, false); DoAnim(anim1HWeapon, 0, false);
if (GetClass() == BERSERKER) { if (GetClass() == Class::Berserker) {
int chance = GetLevel() * 2 + GetSkill(EQ::skills::SkillFrenzy); int chance = GetLevel() * 2 + GetSkill(EQ::skills::SkillFrenzy);
if (zone->random.Roll0(450) < chance) { if (zone->random.Roll0(450) < chance) {
@ -461,11 +461,11 @@ void Client::OPCombatAbility(const CombatAbility_Struct *ca_atk)
const uint32 allowed_kick_classes = RuleI(Combat, ExtraAllowedKickClassesBitmask); const uint32 allowed_kick_classes = RuleI(Combat, ExtraAllowedKickClassesBitmask);
const bool can_use_kick = ( const bool can_use_kick = (
class_id == WARRIOR || class_id == Class::Warrior ||
class_id == RANGER || class_id == Class::Ranger ||
class_id == MONK || class_id == Class::Monk ||
class_id == BEASTLORD || class_id == Class::Beastlord ||
class_id == BERSERKER || class_id == Class::Berserker ||
allowed_kick_classes & GetPlayerClassBit(class_id) allowed_kick_classes & GetPlayerClassBit(class_id)
); );
@ -494,7 +494,7 @@ void Client::OPCombatAbility(const CombatAbility_Struct *ca_atk)
} }
} }
if (class_id == MONK) { if (class_id == Class::Monk) {
reuse_time = MonkSpecialAttack(GetTarget(), ca_atk->m_skill) - 1 - skill_reduction; reuse_time = MonkSpecialAttack(GetTarget(), ca_atk->m_skill) - 1 - skill_reduction;
// Live AA - Technique of Master Wu // Live AA - Technique of Master Wu
@ -559,7 +559,7 @@ void Client::OPCombatAbility(const CombatAbility_Struct *ca_atk)
if ( if (
ca_atk->m_atk == 100 && ca_atk->m_atk == 100 &&
ca_atk->m_skill == EQ::skills::SkillBackstab && ca_atk->m_skill == EQ::skills::SkillBackstab &&
class_id == ROGUE class_id == Class::Rogue
) { ) {
reuse_time = BackstabReuseTime - 1 - skill_reduction; reuse_time = BackstabReuseTime - 1 - skill_reduction;
TryBackstab(GetTarget(), reuse_time); TryBackstab(GetTarget(), reuse_time);
@ -1495,7 +1495,7 @@ void Client::ThrowingAttack(Mob* other, bool CanDoubleAttack) { //old was 51
} }
if(!IsAttackAllowed(other) || if(!IsAttackAllowed(other) ||
(IsCasting() && GetClass() != BARD) || (IsCasting() && GetClass() != Class::Bard) ||
IsSitting() || IsSitting() ||
(DivineAura() && !GetGM()) || (DivineAura() && !GetGM()) ||
IsStunned() || IsStunned() ||
@ -1779,13 +1779,13 @@ void NPC::DoClassAttacks(Mob *target) {
int knightreuse = 1000; //lets give it a small cooldown actually. int knightreuse = 1000; //lets give it a small cooldown actually.
switch(GetClass()){ switch(GetClass()){
case SHADOWKNIGHT: case SHADOWKNIGHTGM:{ case Class::ShadowKnight: case Class::ShadowKnightGM:{
if (CastSpell(SPELL_NPC_HARM_TOUCH, target->GetID())) { if (CastSpell(SPELL_NPC_HARM_TOUCH, target->GetID())) {
knightreuse = HarmTouchReuseTime * 1000; knightreuse = HarmTouchReuseTime * 1000;
} }
break; break;
} }
case PALADIN: case PALADINGM:{ case Class::Paladin: case Class::PaladinGM:{
if(GetHPRatio() < 20) { if(GetHPRatio() < 20) {
if (CastSpell(SPELL_LAY_ON_HANDS, GetID())) { if (CastSpell(SPELL_LAY_ON_HANDS, GetID())) {
knightreuse = LayOnHandsReuseTime * 1000; knightreuse = LayOnHandsReuseTime * 1000;
@ -1822,14 +1822,14 @@ void NPC::DoClassAttacks(Mob *target) {
bool did_attack = false; bool did_attack = false;
//class specific stuff... //class specific stuff...
switch(GetClass()) { switch(GetClass()) {
case ROGUE: case ROGUEGM: case Class::Rogue: case Class::RogueGM:
if(level >= 10) { if(level >= 10) {
reuse = BackstabReuseTime * 1000; reuse = BackstabReuseTime * 1000;
TryBackstab(target, reuse); TryBackstab(target, reuse);
did_attack = true; did_attack = true;
} }
break; break;
case MONK: case MONKGM: { case Class::Monk: case Class::MonkGM: {
uint8 satype = EQ::skills::SkillKick; uint8 satype = EQ::skills::SkillKick;
if (level > 29) { satype = EQ::skills::SkillFlyingKick; } if (level > 29) { satype = EQ::skills::SkillFlyingKick; }
else if (level > 24) { satype = EQ::skills::SkillDragonPunch; } else if (level > 24) { satype = EQ::skills::SkillDragonPunch; }
@ -1842,7 +1842,7 @@ void NPC::DoClassAttacks(Mob *target) {
did_attack = true; did_attack = true;
break; break;
} }
case WARRIOR: case WARRIORGM:{ case Class::Warrior: case Class::WarriorGM:{
if(level >= RuleI(Combat, NPCBashKickLevel)){ if(level >= RuleI(Combat, NPCBashKickLevel)){
if(zone->random.Roll(75)) { //tested on live, warrior mobs both kick and bash, kick about 75% of the time, casting doesn't seem to make a difference. if(zone->random.Roll(75)) { //tested on live, warrior mobs both kick and bash, kick about 75% of the time, casting doesn't seem to make a difference.
DoAnim(animKick, 0, false); DoAnim(animKick, 0, false);
@ -1870,12 +1870,12 @@ void NPC::DoClassAttacks(Mob *target) {
} }
break; break;
} }
case BERSERKER: case BERSERKERGM:{ case Class::Berserker: case Class::BerserkerGM:{
int AtkRounds = 1; int AtkRounds = 1;
int32 max_dmg = GetBaseSkillDamage(EQ::skills::SkillFrenzy); int32 max_dmg = GetBaseSkillDamage(EQ::skills::SkillFrenzy);
DoAnim(anim2HSlashing, 0, false); DoAnim(anim2HSlashing, 0, false);
if (GetClass() == BERSERKER) { if (GetClass() == Class::Berserker) {
int chance = GetLevel() * 2 + GetSkill(EQ::skills::SkillFrenzy); int chance = GetLevel() * 2 + GetSkill(EQ::skills::SkillFrenzy);
if (zone->random.Roll0(450) < chance) if (zone->random.Roll0(450) < chance)
AtkRounds++; AtkRounds++;
@ -1892,8 +1892,8 @@ void NPC::DoClassAttacks(Mob *target) {
did_attack = true; did_attack = true;
break; break;
} }
case RANGER: case RANGERGM: case Class::Ranger: case Class::RangerGM:
case BEASTLORD: case BEASTLORDGM: { case Class::Beastlord: case Class::BeastlordGM: {
//kick //kick
if(level >= RuleI(Combat, NPCBashKickLevel)){ if(level >= RuleI(Combat, NPCBashKickLevel)){
DoAnim(animKick, 0, false); DoAnim(animKick, 0, false);
@ -1908,9 +1908,9 @@ void NPC::DoClassAttacks(Mob *target) {
} }
break; break;
} }
case CLERIC: case CLERICGM: //clerics can bash too. case Class::Cleric: case Class::ClericGM: //clerics can bash too.
case SHADOWKNIGHT: case SHADOWKNIGHTGM: case Class::ShadowKnight: case Class::ShadowKnightGM:
case PALADIN: case PALADINGM:{ case Class::Paladin: case Class::PaladinGM:{
if(level >= RuleI(Combat, NPCBashKickLevel)){ if(level >= RuleI(Combat, NPCBashKickLevel)){
DoAnim(animTailRake, 0, false); DoAnim(animTailRake, 0, false);
int64 dmg = GetBaseSkillDamage(EQ::skills::SkillBash); int64 dmg = GetBaseSkillDamage(EQ::skills::SkillBash);
@ -1957,19 +1957,19 @@ void Client::DoClassAttacks(Mob *ca_target, uint16 skill, bool IsRiposte)
if (skill == -1){ if (skill == -1){
switch(GetClass()){ switch(GetClass()){
case WARRIOR: case Class::Warrior:
case RANGER: case Class::Ranger:
case BEASTLORD: case Class::Beastlord:
skill_to_use = EQ::skills::SkillKick; skill_to_use = EQ::skills::SkillKick;
break; break;
case BERSERKER: case Class::Berserker:
skill_to_use = EQ::skills::SkillFrenzy; skill_to_use = EQ::skills::SkillFrenzy;
break; break;
case SHADOWKNIGHT: case Class::ShadowKnight:
case PALADIN: case Class::Paladin:
skill_to_use = EQ::skills::SkillBash; skill_to_use = EQ::skills::SkillBash;
break; break;
case MONK: case Class::Monk:
if(GetLevel() >= 30) if(GetLevel() >= 30)
{ {
skill_to_use = EQ::skills::SkillFlyingKick; skill_to_use = EQ::skills::SkillFlyingKick;
@ -1995,7 +1995,7 @@ void Client::DoClassAttacks(Mob *ca_target, uint16 skill, bool IsRiposte)
skill_to_use = EQ::skills::SkillKick; skill_to_use = EQ::skills::SkillKick;
} }
break; break;
case ROGUE: case Class::Rogue:
skill_to_use = EQ::skills::SkillBackstab; skill_to_use = EQ::skills::SkillBackstab;
break; break;
} }
@ -2035,7 +2035,7 @@ void Client::DoClassAttacks(Mob *ca_target, uint16 skill, bool IsRiposte)
ReuseTime = (FrenzyReuseTime - 1) / HasteMod; ReuseTime = (FrenzyReuseTime - 1) / HasteMod;
// bards can do riposte frenzy for some reason // bards can do riposte frenzy for some reason
if (!IsRiposte && GetClass() == BERSERKER) { if (!IsRiposte && GetClass() == Class::Berserker) {
int chance = GetLevel() * 2 + GetSkill(EQ::skills::SkillFrenzy); int chance = GetLevel() * 2 + GetSkill(EQ::skills::SkillFrenzy);
if (zone->random.Roll0(450) < chance) if (zone->random.Roll0(450) < chance)
AtkRounds++; AtkRounds++;

View File

@ -441,7 +441,7 @@ bool Mob::SpellEffect(Mob* caster, uint16 spell_id, float partial, int level_ove
case SE_CurrentMana: case SE_CurrentMana:
{ {
// Bards don't get mana from effects, good or bad. // Bards don't get mana from effects, good or bad.
if(GetClass() == BARD) if(GetClass() == Class::Bard)
break; break;
if(IsManaTapSpell(spell_id)) { if(IsManaTapSpell(spell_id)) {
if(GetCasterClass() != 'N') { if(GetCasterClass() != 'N') {
@ -478,7 +478,7 @@ bool Mob::SpellEffect(Mob* caster, uint16 spell_id, float partial, int level_ove
case SE_CurrentManaOnce: case SE_CurrentManaOnce:
{ {
// Bards don't get mana from effects, good or bad. // Bards don't get mana from effects, good or bad.
if(GetClass() == BARD) if(GetClass() == Class::Bard)
break; break;
#ifdef SPELL_EFFECT_SPAM #ifdef SPELL_EFFECT_SPAM
snprintf(effect_desc, _EDLEN, "Current Mana Once: %+i", effect_value); snprintf(effect_desc, _EDLEN, "Current Mana Once: %+i", effect_value);
@ -3432,7 +3432,7 @@ int64 Mob::CalcSpellEffectValue(uint16 spell_id, int effect_id, int caster_level
*/ */
//This is checked from Mob::SpellEffects and applied to instant spells and runes. //This is checked from Mob::SpellEffects and applied to instant spells and runes.
if (caster && caster->GetClass() != BARD && caster->HasBaseEffectFocus()) { if (caster && caster->GetClass() != Class::Bard && caster->HasBaseEffectFocus()) {
oval = effect_value; oval = effect_value;
int mod = caster->GetFocusEffect(focusFcBaseEffects, spell_id); int mod = caster->GetFocusEffect(focusFcBaseEffects, spell_id);
@ -3445,7 +3445,7 @@ int64 Mob::CalcSpellEffectValue(uint16 spell_id, int effect_id, int caster_level
else if (caster_id && instrument_mod > 10) { else if (caster_id && instrument_mod > 10) {
Mob* buff_caster = entity_list.GetMob(caster_id);//If targeted bard song needed to confirm caster is not bard. Mob* buff_caster = entity_list.GetMob(caster_id);//If targeted bard song needed to confirm caster is not bard.
if (buff_caster && buff_caster->GetClass() != BARD) { if (buff_caster && buff_caster->GetClass() != Class::Bard) {
oval = effect_value; oval = effect_value;
effect_value = effect_value * static_cast<int>(instrument_mod) / 10; effect_value = effect_value * static_cast<int>(instrument_mod) / 10;
@ -3991,7 +3991,7 @@ void Mob::DoBuffTic(const Buffs_Struct &buff, int slot, Mob *caster)
case SE_Charm: { case SE_Charm: {
if (!caster || !PassCharismaCheck(caster, buff.spellid)) { if (!caster || !PassCharismaCheck(caster, buff.spellid)) {
BuffFadeByEffect(SE_Charm); BuffFadeByEffect(SE_Charm);
// Remove from hate list of any NPC's hate list and remove all NPCs this hate list // Remove from hate list of any NPC's hate list and remove all NPCs this hate list
if (IsNPC()) { if (IsNPC()) {
entity_list.RemoveFromHateLists(this); entity_list.RemoveFromHateLists(this);
@ -7248,7 +7248,7 @@ bool Mob::PassLimitClass(uint32 Classes_, uint16 Class_)
return false; return false;
Class_ += 1; Class_ += 1;
for (int CurrentClass = 1; CurrentClass <= PLAYER_CLASS_COUNT; ++CurrentClass){ for (int CurrentClass = 1; CurrentClass <= Class::PLAYER_CLASS_COUNT; ++CurrentClass){
if (Classes_ % 2 == 1){ if (Classes_ % 2 == 1){
if (CurrentClass == Class_) if (CurrentClass == Class_)
return true; return true;
@ -7481,7 +7481,7 @@ bool Mob::PassCastRestriction(int value)
case IS_CLASS_WIZARD: case IS_CLASS_WIZARD:
case IS_WIZARD_USED_ON_MAGE_FIRE_PET: case IS_WIZARD_USED_ON_MAGE_FIRE_PET:
if (GetClass() == WIZARD) if (GetClass() == Class::Wizard)
return true; return true;
break; break;
@ -7521,12 +7521,12 @@ bool Mob::PassCastRestriction(int value)
break; break;
case IS_CLASS_MELEE_THAT_CAN_BASH_OR_KICK_EXCEPT_BARD: case IS_CLASS_MELEE_THAT_CAN_BASH_OR_KICK_EXCEPT_BARD:
if ((GetClass() != BARD) && (GetClass() != ROGUE) && IsFighterClass(GetClass())) if ((GetClass() != Class::Bard) && (GetClass() != Class::Rogue) && IsFighterClass(GetClass()))
return true; return true;
break; break;
case IS_CLASS_PURE_MELEE: case IS_CLASS_PURE_MELEE:
if (GetClass() == ROGUE || GetClass() == WARRIOR || GetClass() == BERSERKER || GetClass() == MONK) if (GetClass() == Class::Rogue || GetClass() == Class::Warrior || GetClass() == Class::Berserker || GetClass() == Class::Monk)
return true; return true;
break; break;
@ -7541,78 +7541,78 @@ bool Mob::PassCastRestriction(int value)
break; break;
case IS_CLASS_WARRIOR: case IS_CLASS_WARRIOR:
if (GetClass() == WARRIOR) if (GetClass() == Class::Warrior)
return true; return true;
break; break;
case IS_CLASS_CLERIC: case IS_CLASS_CLERIC:
if (GetClass() == CLERIC) if (GetClass() == Class::Cleric)
return true; return true;
break; break;
case IS_CLASS_PALADIN: case IS_CLASS_PALADIN:
if (GetClass() == PALADIN) if (GetClass() == Class::Paladin)
return true; return true;
break; break;
case IS_CLASS_RANGER: case IS_CLASS_RANGER:
if (GetClass() == RANGER) if (GetClass() == Class::Ranger)
return true; return true;
break; break;
case IS_CLASS_SHADOWKNIGHT: case IS_CLASS_SHADOWKNIGHT:
if (GetClass() == SHADOWKNIGHT) if (GetClass() == Class::ShadowKnight)
return true; return true;
break; break;
case IS_CLASS_DRUID: case IS_CLASS_DRUID:
if (GetClass() == DRUID) if (GetClass() == Class::Druid)
return true; return true;
break; break;
case IS_CLASS_MONK: case IS_CLASS_MONK:
if (GetClass() == MONK) if (GetClass() == Class::Monk)
return true; return true;
break; break;
case IS_CLASS_BARD2: case IS_CLASS_BARD2:
case IS_CLASS_BARD: case IS_CLASS_BARD:
if (GetClass() == BARD) if (GetClass() == Class::Bard)
return true; return true;
break; break;
case IS_CLASS_ROGUE: case IS_CLASS_ROGUE:
if (GetClass() == ROGUE) if (GetClass() == Class::Rogue)
return true; return true;
break; break;
case IS_CLASS_SHAMAN: case IS_CLASS_SHAMAN:
if (GetClass() == SHAMAN) if (GetClass() == Class::Shaman)
return true; return true;
break; break;
case IS_CLASS_NECRO: case IS_CLASS_NECRO:
if (GetClass() == NECROMANCER) if (GetClass() == Class::Necromancer)
return true; return true;
break; break;
case IS_CLASS_MAGE: case IS_CLASS_MAGE:
if (GetClass() == MAGICIAN) if (GetClass() == Class::Magician)
return true; return true;
break; break;
case IS_CLASS_ENCHANTER: case IS_CLASS_ENCHANTER:
if (GetClass() == ENCHANTER) if (GetClass() == Class::Enchanter)
return true; return true;
break; break;
case IS_CLASS_BEASTLORD: case IS_CLASS_BEASTLORD:
if (GetClass() == BEASTLORD) if (GetClass() == Class::Beastlord)
return true; return true;
break; break;
case IS_CLASS_BERSERKER: case IS_CLASS_BERSERKER:
if (GetClass() == BERSERKER) if (GetClass() == Class::Berserker)
return true; return true;
break; break;
@ -7622,7 +7622,7 @@ bool Mob::PassCastRestriction(int value)
break; break;
case IS_CLASS_NOT_WAR_PAL_SK: case IS_CLASS_NOT_WAR_PAL_SK:
if ((GetClass() != WARRIOR) && (GetClass() != PALADIN) && (GetClass() != SHADOWKNIGHT)) if ((GetClass() != Class::Warrior) && (GetClass() != Class::Paladin) && (GetClass() != Class::ShadowKnight))
return true; return true;
break; break;
@ -7722,8 +7722,8 @@ bool Mob::PassCastRestriction(int value)
} }
case IS_CLASS_CHAIN_OR_PLATE: case IS_CLASS_CHAIN_OR_PLATE:
if ((GetClass() == WARRIOR) || (GetClass() == BARD) || (GetClass() == SHADOWKNIGHT) || (GetClass() == PALADIN) || (GetClass() == CLERIC) if ((GetClass() == Class::Warrior) || (GetClass() == Class::Bard) || (GetClass() == Class::ShadowKnight) || (GetClass() == Class::Paladin) || (GetClass() == Class::Cleric)
|| (GetClass() == RANGER) || (GetClass() == SHAMAN) || (GetClass() == ROGUE) || (GetClass() == BERSERKER)) { || (GetClass() == Class::Ranger) || (GetClass() == Class::Shaman) || (GetClass() == Class::Rogue) || (GetClass() == Class::Berserker)) {
return true; return true;
} }
break; break;
@ -7914,7 +7914,7 @@ bool Mob::PassCastRestriction(int value)
break; break;
case IS_CLASS_WARRIOR_CASTER_PRIEST: case IS_CLASS_WARRIOR_CASTER_PRIEST:
if (IsCasterClass(GetClass()) || GetClass() == WARRIOR) if (IsCasterClass(GetClass()) || GetClass() == Class::Warrior)
return true; return true;
break; break;
@ -8082,13 +8082,13 @@ bool Mob::PassCastRestriction(int value)
break; break;
case IS_CLEINT_AND_MALE_DRUID_ENCHANTER_MAGICIAN_NECROANCER_SHAMAN_OR_WIZARD: case IS_CLEINT_AND_MALE_DRUID_ENCHANTER_MAGICIAN_NECROANCER_SHAMAN_OR_WIZARD:
if (IsClient() && GetGender() == MALE && (IsCasterClass(GetClass()) && GetClass() != CLERIC)) if (IsClient() && GetGender() == MALE && (IsCasterClass(GetClass()) && GetClass() != Class::Cleric))
return true; return true;
break; break;
case IS_CLIENT_AND_MALE_BEASTLORD_BERSERKER_MONK_RANGER_OR_ROGUE: case IS_CLIENT_AND_MALE_BEASTLORD_BERSERKER_MONK_RANGER_OR_ROGUE:
if (IsClient() && GetGender() == MALE && if (IsClient() && GetGender() == MALE &&
(GetClass() == BEASTLORD || GetClass() == BERSERKER || GetClass() == MONK || GetClass() == RANGER || GetClass() == ROGUE)) (GetClass() == Class::Beastlord || GetClass() == Class::Berserker || GetClass() == Class::Monk || GetClass() == Class::Ranger || GetClass() == Class::Rogue))
return true; return true;
break; break;
@ -8098,13 +8098,13 @@ bool Mob::PassCastRestriction(int value)
break; break;
case IS_CLIENT_AND_FEMALE_DRUID_ENCHANTER_MAGICIAN_NECROANCER_SHAMAN_OR_WIZARD: case IS_CLIENT_AND_FEMALE_DRUID_ENCHANTER_MAGICIAN_NECROANCER_SHAMAN_OR_WIZARD:
if (IsClient() && GetGender() == FEMALE && (IsCasterClass(GetClass()) && GetClass() != CLERIC)) if (IsClient() && GetGender() == FEMALE && (IsCasterClass(GetClass()) && GetClass() != Class::Cleric))
return true; return true;
break; break;
case IS_CLIENT_AND_FEMALE_BEASTLORD_BERSERKER_MONK_RANGER_OR_ROGUE: case IS_CLIENT_AND_FEMALE_BEASTLORD_BERSERKER_MONK_RANGER_OR_ROGUE:
if (IsClient() && GetGender() == FEMALE && if (IsClient() && GetGender() == FEMALE &&
(GetClass() == BEASTLORD || GetClass() == BERSERKER || GetClass() == MONK || GetClass() == RANGER || GetClass() == ROGUE)) (GetClass() == Class::Beastlord || GetClass() == Class::Berserker || GetClass() == Class::Monk || GetClass() == Class::Ranger || GetClass() == Class::Rogue))
return true; return true;
break; break;
@ -8177,7 +8177,7 @@ bool Mob::PassCastRestriction(int value)
} }
case IS_NOT_CLASS_BARD: case IS_NOT_CLASS_BARD:
if (GetClass() != BARD) if (GetClass() != Class::Bard)
return true; return true;
break; break;

View File

@ -1094,7 +1094,7 @@ bool Client::CheckFizzle(uint16 spell_id)
float diff = par_skill + static_cast<float>(spells[spell_id].base_difficulty) - act_skill; float diff = par_skill + static_cast<float>(spells[spell_id].base_difficulty) - act_skill;
// if you have high int/wis you fizzle less, you fizzle more if you are stupid // if you have high int/wis you fizzle less, you fizzle more if you are stupid
if(GetClass() == BARD) if(GetClass() == Class::Bard)
{ {
diff -= (GetCHA() - 110) / 20.0; diff -= (GetCHA() - 110) / 20.0;
} }
@ -1381,7 +1381,7 @@ void Mob::CastedSpellFinished(uint16 spell_id, uint32 target_id, CastingSlot slo
Mob *spell_target = entity_list.GetMob(target_id); Mob *spell_target = entity_list.GetMob(target_id);
// here we do different things if this is a bard casting a bard song from // here we do different things if this is a bard casting a bard song from
// a spell bar slot // a spell bar slot
if(GetClass() == BARD) // bard's can move when casting any spell... if(GetClass() == Class::Bard) // bard's can move when casting any spell...
{ {
if (IsBardSong(spell_id) && slot < CastingSlot::MaxGems) { if (IsBardSong(spell_id) && slot < CastingSlot::MaxGems) {
if (spells[spell_id].buff_duration == 0xFFFF) { if (spells[spell_id].buff_duration == 0xFFFF) {
@ -1938,7 +1938,7 @@ bool Mob::DetermineSpellTargets(uint16 spell_id, Mob *&spell_target, Mob *&ae_ce
return false; return false;
} }
if(spell_target->GetClass() != LDON_TREASURE) if(spell_target->GetClass() != Class::LDoNTreasure)
{ {
LogSpells("Spell [{}] canceled: invalid target (normal)", spell_id); LogSpells("Spell [{}] canceled: invalid target (normal)", spell_id);
MessageString(Chat::Red,SPELL_NEED_TAR); MessageString(Chat::Red,SPELL_NEED_TAR);
@ -2694,7 +2694,7 @@ bool Mob::SpellFinished(uint16 spell_id, Mob *spell_target, CastingSlot slot, in
} }
} }
//handle bard AA and Discipline recast timers when singing //handle bard AA and Discipline recast timers when singing
if (GetClass() == BARD && spell_id != casting_spell_id && timer != 0xFFFFFFFF) { if (GetClass() == Class::Bard && spell_id != casting_spell_id && timer != 0xFFFFFFFF) {
CastToClient()->GetPTimers().Start(timer, timer_duration); CastToClient()->GetPTimers().Start(timer, timer_duration);
LogSpells("Spell [{}]: Setting BARD custom reuse timer [{}] to [{}]", spell_id, casting_spell_timer, casting_spell_timer_duration); LogSpells("Spell [{}]: Setting BARD custom reuse timer [{}] to [{}]", spell_id, casting_spell_timer, casting_spell_timer_duration);
} }
@ -3150,8 +3150,8 @@ int Mob::CheckStackConflict(uint16 spellid1, int caster_level1, uint16 spellid2,
if(effect1 != effect2) if(effect1 != effect2)
continue; continue;
if (IsBardOnlyStackEffect(effect1) && GetSpellLevel(spellid1, BARD) != 255 && if (IsBardOnlyStackEffect(effect1) && GetSpellLevel(spellid1, Class::Bard) != 255 &&
GetSpellLevel(spellid2, BARD) != 255) GetSpellLevel(spellid2, Class::Bard) != 255)
continue; continue;
// big ol' list according to the client, wasn't that nice! // big ol' list according to the client, wasn't that nice!
@ -6206,7 +6206,7 @@ bool Mob::UseBardSpellLogic(uint16 spell_id, int slot)
( (
IsValidSpell(spell_id) && IsValidSpell(spell_id) &&
slot != -1 && slot != -1 &&
GetClass() == BARD && GetClass() == Class::Bard &&
slot <= EQ::spells::SPELL_GEM_COUNT && slot <= EQ::spells::SPELL_GEM_COUNT &&
IsBardSong(spell_id) IsBardSong(spell_id)
); );

View File

@ -448,7 +448,7 @@ void Object::HandleCombine(Client* user, const NewCombine_Struct* in_combine, Ob
//changing from a switch to string of if's since we don't need to iterate through all of the skills in the SkillType enum //changing from a switch to string of if's since we don't need to iterate through all of the skills in the SkillType enum
if (spec.tradeskill == EQ::skills::SkillAlchemy) { if (spec.tradeskill == EQ::skills::SkillAlchemy) {
if (user_pp.class_ != SHAMAN) { if (user_pp.class_ != Class::Shaman) {
user->Message(Chat::Red, "This tradeskill can only be performed by a shaman."); user->Message(Chat::Red, "This tradeskill can only be performed by a shaman.");
auto outapp = new EQApplicationPacket(OP_TradeSkillCombine, 0); auto outapp = new EQApplicationPacket(OP_TradeSkillCombine, 0);
user->QueuePacket(outapp); user->QueuePacket(outapp);
@ -473,7 +473,7 @@ void Object::HandleCombine(Client* user, const NewCombine_Struct* in_combine, Ob
} }
} }
else if (spec.tradeskill == EQ::skills::SkillMakePoison) { else if (spec.tradeskill == EQ::skills::SkillMakePoison) {
if (user_pp.class_ != ROGUE) { if (user_pp.class_ != Class::Rogue) {
user->Message(Chat::Red, "Only rogues can mix poisons."); user->Message(Chat::Red, "Only rogues can mix poisons.");
auto outapp = new EQApplicationPacket(OP_TradeSkillCombine, 0); auto outapp = new EQApplicationPacket(OP_TradeSkillCombine, 0);
user->QueuePacket(outapp); user->QueuePacket(outapp);

View File

@ -1068,14 +1068,14 @@ int64 Mob::TuneACSum(bool skip_caps, int ac_override, int add_ac)
ac += GetPetACBonusFromOwner(); ac += GetPetACBonusFromOwner();
auto spell_aa_ac = aabonuses.AC + spellbonuses.AC; auto spell_aa_ac = aabonuses.AC + spellbonuses.AC;
ac += GetSkill(EQ::skills::SkillDefense) / 5; ac += GetSkill(EQ::skills::SkillDefense) / 5;
if (EQ::ValueWithin(static_cast<int>(GetClass()), NECROMANCER, ENCHANTER)) if (EQ::ValueWithin(static_cast<int>(GetClass()), Class::Necromancer, Class::Enchanter))
ac += spell_aa_ac / 3; ac += spell_aa_ac / 3;
else else
ac += spell_aa_ac / 4; ac += spell_aa_ac / 4;
} }
else { // TODO: so we can't set NPC skills ... so the skill bonus ends up being HUGE so lets nerf them a bit else { // TODO: so we can't set NPC skills ... so the skill bonus ends up being HUGE so lets nerf them a bit
auto spell_aa_ac = aabonuses.AC + spellbonuses.AC; auto spell_aa_ac = aabonuses.AC + spellbonuses.AC;
if (EQ::ValueWithin(static_cast<int>(GetClass()), NECROMANCER, ENCHANTER)) if (EQ::ValueWithin(static_cast<int>(GetClass()), Class::Necromancer, Class::Enchanter))
ac += GetSkill(EQ::skills::SkillDefense) / 2 + spell_aa_ac / 3; ac += GetSkill(EQ::skills::SkillDefense) / 2 + spell_aa_ac / 3;
else else
ac += GetSkill(EQ::skills::SkillDefense) / 3 + spell_aa_ac / 4; ac += GetSkill(EQ::skills::SkillDefense) / 3 + spell_aa_ac / 4;
@ -1423,7 +1423,7 @@ void Mob::TuneCommonOutgoingHitSuccess(Mob* defender, DamageHitInfo &hit, ExtraA
// BER weren't parsing the halving // BER weren't parsing the halving
if (hit.skill == EQ::skills::SkillArchery || if (hit.skill == EQ::skills::SkillArchery ||
(hit.skill == EQ::skills::SkillThrowing && GetClass() != BERSERKER)) (hit.skill == EQ::skills::SkillThrowing && GetClass() != Class::Berserker))
hit.damage_done /= 2; hit.damage_done /= 2;
if (hit.damage_done < 1) if (hit.damage_done < 1)
@ -1436,7 +1436,7 @@ void Mob::TuneCommonOutgoingHitSuccess(Mob* defender, DamageHitInfo &hit, ExtraA
if (headshot > 0) { if (headshot > 0) {
hit.damage_done = headshot; hit.damage_done = headshot;
} }
else if (GetClass() == RANGER && GetLevel() > 50) { // no double dmg on headshot else if (GetClass() == Class::Ranger && GetLevel() > 50) { // no double dmg on headshot
if ((defender->IsNPC() && !defender->IsMoving() && !defender->IsRooted()) || !RuleB(Combat, ArcheryBonusRequiresStationary)) { if ((defender->IsNPC() && !defender->IsMoving() && !defender->IsRooted()) || !RuleB(Combat, ArcheryBonusRequiresStationary)) {
hit.damage_done *= 2; hit.damage_done *= 2;
MessageString(Chat::MeleeCrit, BOW_DOUBLE_DAMAGE); MessageString(Chat::MeleeCrit, BOW_DOUBLE_DAMAGE);
@ -1461,7 +1461,7 @@ void Mob::TuneCommonOutgoingHitSuccess(Mob* defender, DamageHitInfo &hit, ExtraA
hit.damage_done = ass; hit.damage_done = ass;
} }
} }
else if (hit.skill == EQ::skills::SkillFrenzy && GetClass() == BERSERKER && GetLevel() > 50) { else if (hit.skill == EQ::skills::SkillFrenzy && GetClass() == Class::Berserker && GetLevel() > 50) {
extra_mincap = 4 * GetLevel() / 5; extra_mincap = 4 * GetLevel() / 5;
} }