mirror of
https://github.com/EQEmu/Server.git
synced 2025-12-11 12:41:30 +00:00
[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:
parent
df83113cea
commit
aeeb350068
File diff suppressed because it is too large
Load Diff
189
common/classes.h
189
common/classes.h
@ -19,99 +19,106 @@
|
||||
#define CLASSES_CH
|
||||
|
||||
#include "../common/types.h"
|
||||
#include "../common/rulesys.h"
|
||||
#include <string>
|
||||
#include <map>
|
||||
|
||||
#define NO_CLASS 0
|
||||
#define WARRIOR 1
|
||||
#define CLERIC 2
|
||||
#define PALADIN 3
|
||||
#define RANGER 4
|
||||
#define SHADOWKNIGHT 5
|
||||
#define DRUID 6
|
||||
#define MONK 7
|
||||
#define BARD 8
|
||||
#define ROGUE 9
|
||||
#define SHAMAN 10
|
||||
#define NECROMANCER 11
|
||||
#define WIZARD 12
|
||||
#define MAGICIAN 13
|
||||
#define ENCHANTER 14
|
||||
#define BEASTLORD 15
|
||||
#define BERSERKER 16
|
||||
#define WARRIORGM 20
|
||||
#define CLERICGM 21
|
||||
#define PALADINGM 22
|
||||
#define RANGERGM 23
|
||||
#define SHADOWKNIGHTGM 24
|
||||
#define DRUIDGM 25
|
||||
#define MONKGM 26
|
||||
#define BARDGM 27
|
||||
#define ROGUEGM 28
|
||||
#define SHAMANGM 29
|
||||
#define NECROMANCERGM 30
|
||||
#define WIZARDGM 31
|
||||
#define MAGICIANGM 32
|
||||
#define ENCHANTERGM 33
|
||||
#define BEASTLORDGM 34
|
||||
#define BERSERKERGM 35
|
||||
#define BANKER 40
|
||||
#define MERCHANT 41
|
||||
#define DISCORD_MERCHANT 59
|
||||
#define ADVENTURE_RECRUITER 60
|
||||
#define ADVENTURE_MERCHANT 61
|
||||
#define LDON_TREASURE 62 // objects you can use /open on first seen in LDONs, seen on Danvi's Corpse in Akheva
|
||||
#define TRIBUTE_MASTER 63
|
||||
#define GUILD_TRIBUTE_MASTER 64 // not sure
|
||||
#define GUILD_BANKER 66
|
||||
#define NORRATHS_KEEPERS_MERCHANT 67
|
||||
#define DARK_REIGN_MERCHANT 68
|
||||
#define FELLOWSHIP_MASTER 69
|
||||
#define ALT_CURRENCY_MERCHANT 70
|
||||
#define MERCENARY_MASTER 71
|
||||
namespace Class {
|
||||
constexpr uint8 None = 0;
|
||||
constexpr uint8 Warrior = 1;
|
||||
constexpr uint8 Cleric = 2;
|
||||
constexpr uint8 Paladin = 3;
|
||||
constexpr uint8 Ranger = 4;
|
||||
constexpr uint8 ShadowKnight = 5;
|
||||
constexpr uint8 Druid = 6;
|
||||
constexpr uint8 Monk = 7;
|
||||
constexpr uint8 Bard = 8;
|
||||
constexpr uint8 Rogue = 9;
|
||||
constexpr uint8 Shaman = 10;
|
||||
constexpr uint8 Necromancer = 11;
|
||||
constexpr uint8 Wizard = 12;
|
||||
constexpr uint8 Magician = 13;
|
||||
constexpr uint8 Enchanter = 14;
|
||||
constexpr uint8 Beastlord = 15;
|
||||
constexpr uint8 Berserker = 16;
|
||||
constexpr uint8 WarriorGM = 20;
|
||||
constexpr uint8 ClericGM = 21;
|
||||
constexpr uint8 PaladinGM = 22;
|
||||
constexpr uint8 RangerGM = 23;
|
||||
constexpr uint8 ShadowKnightGM = 24;
|
||||
constexpr uint8 DruidGM = 25;
|
||||
constexpr uint8 MonkGM = 26;
|
||||
constexpr uint8 BardGM = 27;
|
||||
constexpr uint8 RogueGM = 28;
|
||||
constexpr uint8 ShamanGM = 29;
|
||||
constexpr uint8 NecromancerGM = 30;
|
||||
constexpr uint8 WizardGM = 31;
|
||||
constexpr uint8 MagicianGM = 32;
|
||||
constexpr uint8 EnchanterGM = 33;
|
||||
constexpr uint8 BeastlordGM = 34;
|
||||
constexpr uint8 BerserkerGM = 35;
|
||||
constexpr uint8 Banker = 40;
|
||||
constexpr uint8 Merchant = 41;
|
||||
constexpr uint8 DiscordMerchant = 59;
|
||||
constexpr uint8 AdventureRecruiter = 60;
|
||||
constexpr uint8 AdventureMerchant = 61;
|
||||
constexpr uint8 LDoNTreasure = 62;
|
||||
constexpr uint8 TributeMaster = 63;
|
||||
constexpr uint8 GuildTributeMaster = 64;
|
||||
constexpr uint8 GuildBanker = 66;
|
||||
constexpr uint8 NorrathsKeepersMerchant = 67;
|
||||
constexpr uint8 DarkReignMerchant = 68;
|
||||
constexpr uint8 FellowshipMaster = 69;
|
||||
constexpr uint8 AlternateCurrencyMerchant = 70;
|
||||
constexpr uint8 MercenaryLiaison = 71;
|
||||
|
||||
constexpr uint8 PLAYER_CLASS_COUNT = 16;
|
||||
constexpr uint16 ALL_CLASSES_BITMASK = 65535;
|
||||
};
|
||||
|
||||
// player class values
|
||||
#define PLAYER_CLASS_UNKNOWN 0
|
||||
#define PLAYER_CLASS_WARRIOR 1
|
||||
#define PLAYER_CLASS_CLERIC 2
|
||||
#define PLAYER_CLASS_PALADIN 3
|
||||
#define PLAYER_CLASS_RANGER 4
|
||||
#define PLAYER_CLASS_SHADOWKNIGHT 5
|
||||
#define PLAYER_CLASS_DRUID 6
|
||||
#define PLAYER_CLASS_MONK 7
|
||||
#define PLAYER_CLASS_BARD 8
|
||||
#define PLAYER_CLASS_ROGUE 9
|
||||
#define PLAYER_CLASS_SHAMAN 10
|
||||
#define PLAYER_CLASS_NECROMANCER 11
|
||||
#define PLAYER_CLASS_WIZARD 12
|
||||
#define PLAYER_CLASS_MAGICIAN 13
|
||||
#define PLAYER_CLASS_ENCHANTER 14
|
||||
#define PLAYER_CLASS_BEASTLORD 15
|
||||
#define PLAYER_CLASS_BERSERKER 16
|
||||
static std::map<uint8, uint16> player_class_bitmasks = {
|
||||
{Class::Warrior, 1},
|
||||
{Class::Cleric, 2},
|
||||
{Class::Paladin, 4},
|
||||
{Class::Ranger, 8},
|
||||
{Class::ShadowKnight, 16},
|
||||
{Class::Druid, 32},
|
||||
{Class::Monk, 64},
|
||||
{Class::Bard, 128},
|
||||
{Class::Rogue, 256},
|
||||
{Class::Shaman, 512},
|
||||
{Class::Necromancer, 1024},
|
||||
{Class::Wizard, 2048},
|
||||
{Class::Magician, 4096},
|
||||
{Class::Enchanter, 8192},
|
||||
{Class::Beastlord, 16384},
|
||||
{Class::Berserker, 32768},
|
||||
};
|
||||
|
||||
#define PLAYER_CLASS_COUNT 16
|
||||
static std::string shadow_knight_class_name = (
|
||||
RuleB(World, UseOldShadowKnightClassExport) ?
|
||||
"Shadowknight" :
|
||||
"Shadow Knight"
|
||||
);
|
||||
|
||||
|
||||
// player class bits
|
||||
#define PLAYER_CLASS_UNKNOWN_BIT 0
|
||||
#define PLAYER_CLASS_WARRIOR_BIT 1
|
||||
#define PLAYER_CLASS_CLERIC_BIT 2
|
||||
#define PLAYER_CLASS_PALADIN_BIT 4
|
||||
#define PLAYER_CLASS_RANGER_BIT 8
|
||||
#define PLAYER_CLASS_SHADOWKNIGHT_BIT 16
|
||||
#define PLAYER_CLASS_DRUID_BIT 32
|
||||
#define PLAYER_CLASS_MONK_BIT 64
|
||||
#define PLAYER_CLASS_BARD_BIT 128
|
||||
#define PLAYER_CLASS_ROGUE_BIT 256
|
||||
#define PLAYER_CLASS_SHAMAN_BIT 512
|
||||
#define PLAYER_CLASS_NECROMANCER_BIT 1024
|
||||
#define PLAYER_CLASS_WIZARD_BIT 2048
|
||||
#define PLAYER_CLASS_MAGICIAN_BIT 4096
|
||||
#define PLAYER_CLASS_ENCHANTER_BIT 8192
|
||||
#define PLAYER_CLASS_BEASTLORD_BIT 16384
|
||||
#define PLAYER_CLASS_BERSERKER_BIT 32768
|
||||
|
||||
#define PLAYER_CLASS_ALL_MASK 65535 // was 65536
|
||||
static std::map<uint8, std::string> class_names = {
|
||||
{Class::Warrior, "Warrior"},
|
||||
{Class::Cleric, "Cleric"},
|
||||
{Class::Paladin, "Paladin"},
|
||||
{Class::Ranger, "Ranger"},
|
||||
{Class::ShadowKnight, shadow_knight_class_name},
|
||||
{Class::Druid, "Druid"},
|
||||
{Class::Monk, "Monk"},
|
||||
{Class::Bard, "Bard"},
|
||||
{Class::Rogue, "Rogue"},
|
||||
{Class::Shaman, "Shaman"},
|
||||
{Class::Necromancer, "Necromancer"},
|
||||
{Class::Wizard, "Wizard"},
|
||||
{Class::Magician, "Magician"},
|
||||
{Class::Enchanter, "Enchanter"},
|
||||
{Class::Beastlord, "Beastlord"},
|
||||
{Class::Berserker, "Berserker"},
|
||||
};
|
||||
|
||||
|
||||
#define ARMOR_TYPE_UNKNOWN 0
|
||||
@ -126,16 +133,12 @@
|
||||
|
||||
|
||||
const char* GetClassIDName(uint8 class_id, uint8 level = 0);
|
||||
const char* GetPlayerClassName(uint32 player_class_value, uint8 level = 0);
|
||||
|
||||
bool IsPlayerClass(uint8 class_id);
|
||||
const std::string GetPlayerClassAbbreviation(uint8 class_id);
|
||||
|
||||
uint32 GetPlayerClassValue(uint8 class_id);
|
||||
uint32 GetPlayerClassBit(uint8 class_id);
|
||||
|
||||
uint8 GetClassIDFromPlayerClassValue(uint32 player_class_value);
|
||||
uint8 GetClassIDFromPlayerClassBit(uint32 player_class_bit);
|
||||
uint8 GetPlayerClassValue(uint8 class_id);
|
||||
uint16 GetPlayerClassBit(uint8 class_id);
|
||||
|
||||
bool IsFighterClass(uint8 class_id);
|
||||
bool IsSpellFighterClass(uint8 class_id);
|
||||
|
||||
@ -132,7 +132,7 @@ namespace EQ
|
||||
|
||||
// Swap items in inventory
|
||||
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
|
||||
bool DeleteItem(int16 slot_id, int16 quantity = 0);
|
||||
|
||||
@ -2706,7 +2706,7 @@ namespace RoF2
|
||||
|
||||
switch (raid_gen->action)
|
||||
{
|
||||
case raidAdd:
|
||||
case raidAdd:
|
||||
{
|
||||
RaidAddMember_Struct* emu = (RaidAddMember_Struct*)__emu_buffer;
|
||||
|
||||
@ -3986,7 +3986,7 @@ namespace RoF2
|
||||
if (strlen(emu->suffix))
|
||||
PacketSize += strlen(emu->suffix) + 1;
|
||||
|
||||
if (emu->DestructibleObject || emu->class_ == LDON_TREASURE)
|
||||
if (emu->DestructibleObject || emu->class_ == Class::LDoNTreasure)
|
||||
{
|
||||
if (emu->DestructibleObject)
|
||||
PacketSize = PacketSize - 4; // No bodytype
|
||||
@ -4076,7 +4076,7 @@ namespace RoF2
|
||||
// actually part of bitfields
|
||||
uint8 OtherData = 0;
|
||||
|
||||
if (emu->class_ == LDON_TREASURE) //LDoN Chest
|
||||
if (emu->class_ == Class::LDoNTreasure) //LDoN Chest
|
||||
{
|
||||
OtherData = OtherData | 0x04;
|
||||
}
|
||||
@ -4104,7 +4104,7 @@ namespace RoF2
|
||||
// int DefaultEmitterID
|
||||
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->DestructibleName2);
|
||||
|
||||
@ -2758,7 +2758,7 @@ namespace UF
|
||||
if (strlen(emu->suffix))
|
||||
PacketSize += strlen(emu->suffix) + 1;
|
||||
|
||||
if (emu->DestructibleObject || emu->class_ == LDON_TREASURE)
|
||||
if (emu->DestructibleObject || emu->class_ == Class::LDoNTreasure)
|
||||
{
|
||||
if (emu->DestructibleObject)
|
||||
PacketSize = PacketSize - 4; // No bodytype
|
||||
@ -2847,7 +2847,7 @@ namespace UF
|
||||
|
||||
uint8 OtherData = 0;
|
||||
|
||||
if (emu->class_ == LDON_TREASURE) //Ldon chest
|
||||
if (emu->class_ == Class::LDoNTreasure) //Ldon chest
|
||||
{
|
||||
OtherData = OtherData | 0x01;
|
||||
}
|
||||
@ -2873,7 +2873,7 @@ namespace UF
|
||||
}
|
||||
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->DestructibleName2);
|
||||
|
||||
@ -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, 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, UseOldShadowKnightClassExport, true, "Disable to have Shadowknight show as Shadow Knight (live-like)")
|
||||
RULE_CATEGORY_END()
|
||||
|
||||
RULE_CATEGORY(Zone)
|
||||
|
||||
@ -1808,7 +1808,7 @@ bool SharedDatabase::LoadSkillCaps(const std::string &prefix) {
|
||||
}
|
||||
|
||||
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 level_count = HARD_LEVEL_CAP + 1;
|
||||
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);
|
||||
}
|
||||
|
||||
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 level_count = HARD_LEVEL_CAP + 1;
|
||||
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);
|
||||
}
|
||||
|
||||
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 level_count = HARD_LEVEL_CAP + 1;
|
||||
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].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].casting_animation=Strings::ToInt(row[120]);
|
||||
|
||||
@ -666,7 +666,7 @@ bool IsBardSong(uint16 spell_id)
|
||||
const auto& spell = spells[spell_id];
|
||||
|
||||
if (
|
||||
spell.classes[BARD - 1] < UINT8_MAX &&
|
||||
spell.classes[Class::Bard - 1] < UINT8_MAX &&
|
||||
!spell.is_discipline
|
||||
) {
|
||||
return true;
|
||||
@ -780,7 +780,7 @@ uint8 GetSpellMinimumLevel(uint16 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) {
|
||||
minimum_level = spell.classes[i];
|
||||
}
|
||||
@ -798,7 +798,7 @@ uint8 GetSpellLevel(uint16 spell_id, uint8 class_id)
|
||||
return UINT8_MAX;
|
||||
}
|
||||
|
||||
if (class_id >= PLAYER_CLASS_COUNT) {
|
||||
if (class_id >= Class::PLAYER_CLASS_COUNT) {
|
||||
return UINT8_MAX;
|
||||
}
|
||||
|
||||
|
||||
@ -1369,7 +1369,7 @@ struct SPDat_Spell_Struct
|
||||
/* 101 */ int8 zone_type; // 01=Outdoors, 02=dungeons, ff=Any -- ZONETYPE
|
||||
/* 102 */ int8 environment_type; // -- ENVIRONMENTTYPE
|
||||
/* 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
|
||||
/* 121 */ //uint8 TargetAnim; // -- TARGETANIM
|
||||
/* 122 */ //uint32 TravelType; // -- TRAVELTYPE
|
||||
|
||||
@ -29,7 +29,7 @@ void LoadSkillCaps(SharedDatabase *database, const std::string &prefix) {
|
||||
EQ::IPCMutex mutex("skill_caps");
|
||||
mutex.Lock();
|
||||
|
||||
uint32 class_count = PLAYER_CLASS_COUNT;
|
||||
uint32 class_count = Class::PLAYER_CLASS_COUNT;
|
||||
uint32 skill_count = EQ::skills::HIGHEST_SKILL + 1;
|
||||
uint32 level_count = HARD_LEVEL_CAP + 1;
|
||||
uint32 size = (class_count * skill_count * level_count * sizeof(uint16));
|
||||
|
||||
@ -1966,7 +1966,7 @@ bool CheckCharCreateInfoTitanium(CharCreate_Struct *cc)
|
||||
{ /*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*/
|
||||
{ /*Warrior*/ 10, 10, 5, 0, 0, 0, 0, 25},
|
||||
{ /*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}
|
||||
};
|
||||
|
||||
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*/
|
||||
{ /*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},
|
||||
@ -2021,7 +2021,7 @@ bool CheckCharCreateInfoTitanium(CharCreate_Struct *cc)
|
||||
|
||||
// if out of range looking it up in the table would crash stuff
|
||||
// so we return from these
|
||||
if (classtemp >= PLAYER_CLASS_COUNT) {
|
||||
if (classtemp >= Class::PLAYER_CLASS_COUNT) {
|
||||
LogInfo(" class is out of range");
|
||||
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::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
|
||||
switch(pp->class_) {
|
||||
case ROGUE:
|
||||
case Class::Rogue:
|
||||
pp->languages[LANG_THIEVES_CANT] = 100;
|
||||
break;
|
||||
default:
|
||||
|
||||
@ -33,7 +33,7 @@ GroupLFP::GroupLFP(uint32 inLeaderID) {
|
||||
LeaderID = inLeaderID;
|
||||
for (auto &member : Members) {
|
||||
member.Name[0] = '\0';
|
||||
member.Class = NO_CLASS;
|
||||
member.Class = Class::None;
|
||||
member.Level = 0;
|
||||
member.Zone = 0;
|
||||
}
|
||||
@ -77,7 +77,7 @@ void GroupLFP::SetDetails(ServerLFPUpdate_Struct *Update) {
|
||||
Members[i].GuildID = CLE->GuildID();
|
||||
}
|
||||
else {
|
||||
Members[i].Class = NO_CLASS;
|
||||
Members[i].Class = Class::None;
|
||||
Members[i].Level = 0;
|
||||
Members[i].Zone = 0;
|
||||
Members[i].GuildID = 0xFFFF;
|
||||
|
||||
34
zone/aa.cpp
34
zone/aa.cpp
@ -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
|
||||
switch (corpse_to_use->class_)
|
||||
{
|
||||
case CLERIC:
|
||||
case Class::Cleric:
|
||||
made_npc->npc_spells_id = 1;
|
||||
break;
|
||||
case WIZARD:
|
||||
case Class::Wizard:
|
||||
made_npc->npc_spells_id = 2;
|
||||
break;
|
||||
case NECROMANCER:
|
||||
case Class::Necromancer:
|
||||
made_npc->npc_spells_id = 3;
|
||||
break;
|
||||
case MAGICIAN:
|
||||
case Class::Magician:
|
||||
made_npc->npc_spells_id = 4;
|
||||
break;
|
||||
case ENCHANTER:
|
||||
case Class::Enchanter:
|
||||
made_npc->npc_spells_id = 5;
|
||||
break;
|
||||
case SHAMAN:
|
||||
case Class::Shaman:
|
||||
made_npc->npc_spells_id = 6;
|
||||
break;
|
||||
case DRUID:
|
||||
case Class::Druid:
|
||||
made_npc->npc_spells_id = 7;
|
||||
break;
|
||||
case PALADIN:
|
||||
case Class::Paladin:
|
||||
//SPECATK_TRIPLE
|
||||
strcpy(made_npc->special_abilities, "6,1");
|
||||
made_npc->current_hp = made_npc->current_hp * 150 / 100;
|
||||
made_npc->max_hp = made_npc->max_hp * 150 / 100;
|
||||
made_npc->npc_spells_id = 8;
|
||||
break;
|
||||
case SHADOWKNIGHT:
|
||||
case Class::ShadowKnight:
|
||||
strcpy(made_npc->special_abilities, "6,1");
|
||||
made_npc->current_hp = made_npc->current_hp * 150 / 100;
|
||||
made_npc->max_hp = made_npc->max_hp * 150 / 100;
|
||||
made_npc->npc_spells_id = 9;
|
||||
break;
|
||||
case RANGER:
|
||||
case Class::Ranger:
|
||||
strcpy(made_npc->special_abilities, "7,1");
|
||||
made_npc->current_hp = made_npc->current_hp * 135 / 100;
|
||||
made_npc->max_hp = made_npc->max_hp * 135 / 100;
|
||||
made_npc->npc_spells_id = 10;
|
||||
break;
|
||||
case BARD:
|
||||
case Class::Bard:
|
||||
strcpy(made_npc->special_abilities, "6,1");
|
||||
made_npc->current_hp = made_npc->current_hp * 110 / 100;
|
||||
made_npc->max_hp = made_npc->max_hp * 110 / 100;
|
||||
made_npc->npc_spells_id = 11;
|
||||
break;
|
||||
case BEASTLORD:
|
||||
case Class::Beastlord:
|
||||
strcpy(made_npc->special_abilities, "7,1");
|
||||
made_npc->current_hp = made_npc->current_hp * 110 / 100;
|
||||
made_npc->max_hp = made_npc->max_hp * 110 / 100;
|
||||
made_npc->npc_spells_id = 12;
|
||||
break;
|
||||
case ROGUE:
|
||||
case Class::Rogue:
|
||||
strcpy(made_npc->special_abilities, "7,1");
|
||||
made_npc->max_dmg = made_npc->max_dmg * 150 / 100;
|
||||
made_npc->current_hp = made_npc->current_hp * 110 / 100;
|
||||
made_npc->max_hp = made_npc->max_hp * 110 / 100;
|
||||
break;
|
||||
case MONK:
|
||||
case Class::Monk:
|
||||
strcpy(made_npc->special_abilities, "7,1");
|
||||
made_npc->max_dmg = made_npc->max_dmg * 150 / 100;
|
||||
made_npc->current_hp = made_npc->current_hp * 135 / 100;
|
||||
made_npc->max_hp = made_npc->max_hp * 135 / 100;
|
||||
break;
|
||||
case WARRIOR:
|
||||
case BERSERKER:
|
||||
case Class::Warrior:
|
||||
case Class::Berserker:
|
||||
strcpy(made_npc->special_abilities, "7,1");
|
||||
made_npc->max_dmg = made_npc->max_dmg * 150 / 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 {
|
||||
// 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)) {
|
||||
return;
|
||||
}
|
||||
|
||||
@ -678,7 +678,7 @@ bool Mob::IsAttackAllowed(Mob *target, bool isSpellAttack)
|
||||
|
||||
if(!isSpellAttack)
|
||||
{
|
||||
if(GetClass() == LDON_TREASURE)
|
||||
if(GetClass() == Class::LDoNTreasure)
|
||||
{
|
||||
return false;
|
||||
}
|
||||
@ -1070,10 +1070,10 @@ bool Mob::CombatRange(Mob* other, float fixed_size_mod, bool aeRampage, ExtraAtt
|
||||
SetPseudoRoot(false);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
if (aeRampage) {
|
||||
float aeramp_size = RuleR(Combat, AERampageMaxDistance);
|
||||
|
||||
|
||||
LogCombatDetail("AERampage: Default - aeramp_size = [{}] ", aeramp_size);
|
||||
|
||||
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: _DistNoRoot [{}] <= ramp_range [{}]", _DistNoRoot, ramp_range);
|
||||
|
||||
|
||||
if (_DistNoRoot <= ramp_range) {
|
||||
LogCombatDetail("AE Rampage: Combat Distance returned [true]");
|
||||
return true;
|
||||
|
||||
196
zone/attack.cpp
196
zone/attack.cpp
@ -558,7 +558,7 @@ bool Mob::AvoidDamage(Mob *other, DamageHitInfo &hit)
|
||||
}
|
||||
|
||||
// dodge
|
||||
if (CanThisClassDodge() && (InFront || GetClass() == MONK)) {
|
||||
if (CanThisClassDodge() && (InFront || GetClass() == Class::Monk)) {
|
||||
if (IsClient())
|
||||
CastToClient()->CheckIncreaseSkill(EQ::skills::SkillDodge, other, -10);
|
||||
// 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;
|
||||
|
||||
switch (GetClass()) {
|
||||
case WARRIOR:
|
||||
case Class::Warrior:
|
||||
return war_softcaps[level];
|
||||
case CLERIC:
|
||||
case BARD:
|
||||
case MONK:
|
||||
case Class::Cleric:
|
||||
case Class::Bard:
|
||||
case Class::Monk:
|
||||
return clrbrdmnk_softcaps[level];
|
||||
case PALADIN:
|
||||
case SHADOWKNIGHT:
|
||||
case Class::Paladin:
|
||||
case Class::ShadowKnight:
|
||||
return palshd_softcaps[level];
|
||||
case RANGER:
|
||||
case Class::Ranger:
|
||||
return rng_softcaps[level];
|
||||
case DRUID:
|
||||
case Class::Druid:
|
||||
return dru_softcaps[level];
|
||||
case ROGUE:
|
||||
case SHAMAN:
|
||||
case BEASTLORD:
|
||||
case BERSERKER:
|
||||
case Class::Rogue:
|
||||
case Class::Shaman:
|
||||
case Class::Beastlord:
|
||||
case Class::Berserker:
|
||||
return rogshmbstber_softcaps[level];
|
||||
case NECROMANCER:
|
||||
case WIZARD:
|
||||
case MAGICIAN:
|
||||
case ENCHANTER:
|
||||
case Class::Necromancer:
|
||||
case Class::Wizard:
|
||||
case Class::Magician:
|
||||
case Class::Enchanter:
|
||||
return necwizmagenc_softcaps[level];
|
||||
default:
|
||||
return 350;
|
||||
@ -707,28 +707,28 @@ double Mob::GetSoftcapReturns()
|
||||
// These are based on the dev post, they seem to be correct for every level
|
||||
// AKA no more hard caps
|
||||
switch (GetClass()) {
|
||||
case WARRIOR:
|
||||
case Class::Warrior:
|
||||
return 0.35;
|
||||
case CLERIC:
|
||||
case BARD:
|
||||
case MONK:
|
||||
case Class::Cleric:
|
||||
case Class::Bard:
|
||||
case Class::Monk:
|
||||
return 0.3;
|
||||
case PALADIN:
|
||||
case SHADOWKNIGHT:
|
||||
case Class::Paladin:
|
||||
case Class::ShadowKnight:
|
||||
return 0.33;
|
||||
case RANGER:
|
||||
case Class::Ranger:
|
||||
return 0.315;
|
||||
case DRUID:
|
||||
case Class::Druid:
|
||||
return 0.265;
|
||||
case ROGUE:
|
||||
case SHAMAN:
|
||||
case BEASTLORD:
|
||||
case BERSERKER:
|
||||
case Class::Rogue:
|
||||
case Class::Shaman:
|
||||
case Class::Beastlord:
|
||||
case Class::Berserker:
|
||||
return 0.28;
|
||||
case NECROMANCER:
|
||||
case WIZARD:
|
||||
case MAGICIAN:
|
||||
case ENCHANTER:
|
||||
case Class::Necromancer:
|
||||
case Class::Wizard:
|
||||
case Class::Magician:
|
||||
case Class::Enchanter:
|
||||
return 0.25;
|
||||
default:
|
||||
return 0.3;
|
||||
@ -739,7 +739,7 @@ int Mob::GetClassRaceACBonus()
|
||||
{
|
||||
int ac_bonus = 0;
|
||||
auto level = GetLevel();
|
||||
if (GetClass() == MONK) {
|
||||
if (GetClass() == Class::Monk) {
|
||||
int hardcap = 30;
|
||||
int softcap = 14;
|
||||
if (level > 99) {
|
||||
@ -824,7 +824,7 @@ int Mob::GetClassRaceACBonus()
|
||||
}
|
||||
}
|
||||
|
||||
if (GetClass() == ROGUE) {
|
||||
if (GetClass() == Class::Rogue) {
|
||||
int level_scaler = level - 26;
|
||||
if (GetAGI() < 80)
|
||||
ac_bonus = level_scaler / 4;
|
||||
@ -840,7 +840,7 @@ int Mob::GetClassRaceACBonus()
|
||||
ac_bonus = 12;
|
||||
}
|
||||
|
||||
if (GetClass() == BEASTLORD) {
|
||||
if (GetClass() == Class::Beastlord) {
|
||||
int level_scaler = level - 6;
|
||||
if (GetAGI() < 80)
|
||||
ac_bonus = level_scaler / 5;
|
||||
@ -894,14 +894,14 @@ int Mob::ACSum(bool skip_caps)
|
||||
ac += GetPetACBonusFromOwner();
|
||||
auto spell_aa_ac = aabonuses.AC + spellbonuses.AC;
|
||||
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;
|
||||
else
|
||||
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
|
||||
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;
|
||||
else
|
||||
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;
|
||||
}
|
||||
}
|
||||
else if ((GetClass() == MONK || GetClass() == BEASTLORD) && GetLevel() >= 30) {
|
||||
else if ((GetClass() == Class::Monk || GetClass() == Class::Beastlord) && GetLevel() >= 30) {
|
||||
dmg = GetHandToHandDamage();
|
||||
}
|
||||
else {
|
||||
@ -1199,7 +1199,7 @@ int64 Mob::GetWeaponDamage(Mob *against, const EQ::ItemInstance *weapon_item, in
|
||||
MagicGloves = gloves->GetItemMagical(true);
|
||||
}
|
||||
|
||||
if (GetClass() == MONK || GetClass() == BEASTLORD) {
|
||||
if (GetClass() == Class::Monk || GetClass() == Class::Beastlord) {
|
||||
if (MagicGloves || GetLevel() >= 30) {
|
||||
dmg = GetHandToHandDamage();
|
||||
if (hate)
|
||||
@ -1295,15 +1295,15 @@ int64 Mob::DoDamageCaps(int64 base_damage)
|
||||
}
|
||||
else if (level >= 40) {
|
||||
switch (GetClass()) {
|
||||
case CLERIC:
|
||||
case DRUID:
|
||||
case SHAMAN:
|
||||
case Class::Cleric:
|
||||
case Class::Druid:
|
||||
case Class::Shaman:
|
||||
cap = 80;
|
||||
break;
|
||||
case NECROMANCER:
|
||||
case WIZARD:
|
||||
case MAGICIAN:
|
||||
case ENCHANTER:
|
||||
case Class::Necromancer:
|
||||
case Class::Wizard:
|
||||
case Class::Magician:
|
||||
case Class::Enchanter:
|
||||
cap = 40;
|
||||
break;
|
||||
default:
|
||||
@ -1313,15 +1313,15 @@ int64 Mob::DoDamageCaps(int64 base_damage)
|
||||
}
|
||||
else if (level >= 30) {
|
||||
switch (GetClass()) {
|
||||
case CLERIC:
|
||||
case DRUID:
|
||||
case SHAMAN:
|
||||
case Class::Cleric:
|
||||
case Class::Druid:
|
||||
case Class::Shaman:
|
||||
cap = 26;
|
||||
break;
|
||||
case NECROMANCER:
|
||||
case WIZARD:
|
||||
case MAGICIAN:
|
||||
case ENCHANTER:
|
||||
case Class::Necromancer:
|
||||
case Class::Wizard:
|
||||
case Class::Magician:
|
||||
case Class::Enchanter:
|
||||
cap = 18;
|
||||
break;
|
||||
default:
|
||||
@ -1331,15 +1331,15 @@ int64 Mob::DoDamageCaps(int64 base_damage)
|
||||
}
|
||||
else if (level >= 20) {
|
||||
switch (GetClass()) {
|
||||
case CLERIC:
|
||||
case DRUID:
|
||||
case SHAMAN:
|
||||
case Class::Cleric:
|
||||
case Class::Druid:
|
||||
case Class::Shaman:
|
||||
cap = 20;
|
||||
break;
|
||||
case NECROMANCER:
|
||||
case WIZARD:
|
||||
case MAGICIAN:
|
||||
case ENCHANTER:
|
||||
case Class::Necromancer:
|
||||
case Class::Wizard:
|
||||
case Class::Magician:
|
||||
case Class::Enchanter:
|
||||
cap = 12;
|
||||
break;
|
||||
default:
|
||||
@ -1349,15 +1349,15 @@ int64 Mob::DoDamageCaps(int64 base_damage)
|
||||
}
|
||||
else if (level >= 10) {
|
||||
switch (GetClass()) {
|
||||
case CLERIC:
|
||||
case DRUID:
|
||||
case SHAMAN:
|
||||
case Class::Cleric:
|
||||
case Class::Druid:
|
||||
case Class::Shaman:
|
||||
cap = 12;
|
||||
break;
|
||||
case NECROMANCER:
|
||||
case WIZARD:
|
||||
case MAGICIAN:
|
||||
case ENCHANTER:
|
||||
case Class::Necromancer:
|
||||
case Class::Wizard:
|
||||
case Class::Magician:
|
||||
case Class::Enchanter:
|
||||
cap = 10;
|
||||
break;
|
||||
default:
|
||||
@ -1367,15 +1367,15 @@ int64 Mob::DoDamageCaps(int64 base_damage)
|
||||
}
|
||||
else {
|
||||
switch (GetClass()) {
|
||||
case CLERIC:
|
||||
case DRUID:
|
||||
case SHAMAN:
|
||||
case Class::Cleric:
|
||||
case Class::Druid:
|
||||
case Class::Shaman:
|
||||
cap = 9;
|
||||
break;
|
||||
case NECROMANCER:
|
||||
case WIZARD:
|
||||
case MAGICIAN:
|
||||
case ENCHANTER:
|
||||
case Class::Necromancer:
|
||||
case Class::Wizard:
|
||||
case Class::Magician:
|
||||
case Class::Enchanter:
|
||||
cap = 6;
|
||||
break;
|
||||
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" : "");
|
||||
|
||||
if (
|
||||
(IsCasting() && GetClass() != BARD && !IsFromSpell)
|
||||
(IsCasting() && GetClass() != Class::Bard && !IsFromSpell)
|
||||
|| ((IsClient() && CastToClient()->dead) || (other->IsClient() && other->CastToClient()->dead))
|
||||
|| (GetHP() < 0)
|
||||
|| (!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)
|
||||
*/
|
||||
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);
|
||||
}
|
||||
|
||||
@ -2343,7 +2343,7 @@ void NPC::Damage(Mob* other, int64 damage, uint16 spell_id, EQ::skills::SkillTyp
|
||||
if (!IsEngaged())
|
||||
zone->AddAggroMob();
|
||||
|
||||
if (GetClass() == LDON_TREASURE)
|
||||
if (GetClass() == Class::LDoNTreasure)
|
||||
{
|
||||
if (IsLDoNLocked() && GetLDoNLockedSkill() != LDoNTypeMechanical)
|
||||
{
|
||||
@ -2461,7 +2461,7 @@ bool NPC::Death(Mob* killer_mob, int64 damage, uint16 spell, EQ::skills::SkillTy
|
||||
BuffFadeAll();
|
||||
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));
|
||||
Animation_Struct* anim = (Animation_Struct*)outapp->pBuffer;
|
||||
anim->spawnid = GetID();
|
||||
@ -2488,7 +2488,7 @@ bool NPC::Death(Mob* killer_mob, int64 damage, uint16 spell, EQ::skills::SkillTy
|
||||
respawn2->DeathReset(1);
|
||||
}
|
||||
|
||||
if (killer_mob && GetClass() != LDON_TREASURE) {
|
||||
if (killer_mob && GetClass() != Class::LDoNTreasure) {
|
||||
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());
|
||||
}
|
||||
|
||||
bool IsLdonTreasure = (GetClass() == LDON_TREASURE);
|
||||
bool IsLdonTreasure = (GetClass() == Class::LDoNTreasure);
|
||||
|
||||
if (give_exp_client && !IsCorpse()) {
|
||||
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 is_merchant = (class_ == MERCHANT || class_ == ADVENTURE_MERCHANT || MerchantType != 0);
|
||||
bool is_merchant = (class_ == Class::Merchant || class_ == Class::AdventureMerchant || MerchantType != 0);
|
||||
|
||||
Corpse* corpse = nullptr;
|
||||
|
||||
@ -3295,14 +3295,14 @@ int Mob::GetHandToHandDamage(void)
|
||||
7, 7, 7, 8, 8, 8, 8, 8, 8, 9, // 21-30
|
||||
9, 9, 9, 9, 9, 10, 10, 10, 10, 10, // 31-40
|
||||
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)
|
||||
return 9;
|
||||
if (level > 62)
|
||||
return 15;
|
||||
return mnk_dmg[level];
|
||||
}
|
||||
else if (GetClass() == BEASTLORD) {
|
||||
else if (GetClass() == Class::Beastlord) {
|
||||
if (level > 49)
|
||||
return 13;
|
||||
return bst_dmg[level];
|
||||
@ -3354,7 +3354,7 @@ int Mob::GetHandToHandDelay(void)
|
||||
28, 28, 28, 27, 27, 27, 27, 27, 26, 26, // 61-70
|
||||
26, 26, 26 }; // 71-73
|
||||
|
||||
if (GetClass() == MONK) {
|
||||
if (GetClass() == Class::Monk) {
|
||||
// Have a look to see if we have epic fists on
|
||||
if (IsClient() && CastToClient()->GetItemIDAt(12) == 10652 && GetLevel() > 50)
|
||||
return 16;
|
||||
@ -3363,7 +3363,7 @@ int Mob::GetHandToHandDelay(void)
|
||||
return GetRace() == IKSAR ? 21 : 20;
|
||||
return GetRace() == IKSAR ? mnk_iks_delay[level] : mnk_hum_delay[level];
|
||||
}
|
||||
else if (GetClass() == BEASTLORD) {
|
||||
else if (GetClass() == Class::Beastlord) {
|
||||
int level = GetLevel();
|
||||
if (level > 73)
|
||||
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 &&
|
||||
(attacker->GetLevel() > 55 || attacker->IsNPC()) && GetClass() == WARRIOR) {
|
||||
(attacker->GetLevel() > 55 || attacker->IsNPC()) && GetClass() == Class::Warrior) {
|
||||
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
|
||||
bool innate_crit = false;
|
||||
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;
|
||||
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;
|
||||
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;
|
||||
|
||||
// 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
|
||||
|
||||
// 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;
|
||||
|
||||
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);
|
||||
|
||||
// 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())) {
|
||||
int chance = GetLevel() * 12;
|
||||
if (zone->random.Int(1, 1000) < chance) {
|
||||
@ -5284,7 +5284,7 @@ void Mob::DoRiposte(Mob *defender)
|
||||
if (DoubleRipChance && zone->random.Roll(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]);
|
||||
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);
|
||||
@ -5301,7 +5301,7 @@ void Mob::ApplyMeleeDamageMods(uint16 skill, int64 &damage, Mob *defender, Extra
|
||||
dmgbonusmod += opts->melee_damage_bonus_flat;
|
||||
|
||||
if (defender) {
|
||||
if (defender->IsOfClientBotMerc() && defender->GetClass() == WARRIOR) {
|
||||
if (defender->IsOfClientBotMerc() && defender->GetClass() == Class::Warrior) {
|
||||
dmgbonusmod -= 5;
|
||||
}
|
||||
// 168 defensive
|
||||
@ -5445,7 +5445,7 @@ const DamageTable &Mob::GetDamageTable() const
|
||||
{ 415, 15, 40 }, // 105
|
||||
};
|
||||
|
||||
bool monk = GetClass() == MONK;
|
||||
bool monk = GetClass() == Class::Monk;
|
||||
bool melee = IsWarriorClass();
|
||||
// tables caped at 105 for now -- future proofed for a while at least :P
|
||||
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
|
||||
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;
|
||||
|
||||
if (hit.damage_done < 1)
|
||||
@ -5906,7 +5906,7 @@ void Mob::CommonOutgoingHitSuccess(Mob* defender, DamageHitInfo &hit, ExtraAttac
|
||||
if (headshot > 0) {
|
||||
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)) {
|
||||
hit.damage_done *= 2;
|
||||
MessageString(Chat::MeleeCrit, BOW_DOUBLE_DAMAGE);
|
||||
@ -5931,7 +5931,7 @@ void Mob::CommonOutgoingHitSuccess(Mob* defender, DamageHitInfo &hit, ExtraAttac
|
||||
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;
|
||||
}
|
||||
|
||||
|
||||
@ -117,7 +117,7 @@ void Client::CalcBonuses()
|
||||
|
||||
// hmm maybe a better way to do this
|
||||
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;
|
||||
if (timer != consume_food_timer.GetTimerTime())
|
||||
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.
|
||||
}
|
||||
|
||||
|
||||
300
zone/bot.cpp
300
zone/bot.cpp
@ -78,10 +78,10 @@ Bot::Bot(NPCType *npcTypeData, Client* botOwner) : NPC(npcTypeData, nullptr, glm
|
||||
SetBotCharmer(false);
|
||||
SetPetChooser(false);
|
||||
SetRangerAutoWeaponSelect(false);
|
||||
SetTaunting(GetClass() == WARRIOR || GetClass() == PALADIN || GetClass() == SHADOWKNIGHT);
|
||||
SetTaunting(GetClass() == Class::Warrior || GetClass() == Class::Paladin || GetClass() == Class::ShadowKnight);
|
||||
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);
|
||||
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);
|
||||
|
||||
m_alt_combat_hate_timer.Start(250);
|
||||
@ -241,7 +241,7 @@ Bot::Bot(
|
||||
for (int i = 0; i < MaxTimer; i++)
|
||||
timers[i] = 0;
|
||||
|
||||
if (GetClass() == ROGUE) {
|
||||
if (GetClass() == Class::Rogue) {
|
||||
m_evade_timer.Start();
|
||||
}
|
||||
|
||||
@ -561,7 +561,7 @@ uint32 Bot::GetBotArcheryRange() {
|
||||
}
|
||||
|
||||
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) {
|
||||
BotAddEquipItem(EQ::invslot::slotPrimary, GetBotItemBySlot(EQ::invslot::slotPrimary));
|
||||
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...
|
||||
switch (GetClass()) {
|
||||
case WARRIOR:
|
||||
case Class::Warrior:
|
||||
BotSpellID = 3001;
|
||||
Strength += 10;
|
||||
Stamina += 20;
|
||||
@ -777,7 +777,7 @@ void Bot::GenerateBaseStats()
|
||||
Dexterity += 10;
|
||||
Attack += 12;
|
||||
break;
|
||||
case CLERIC:
|
||||
case Class::Cleric:
|
||||
BotSpellID = 3002;
|
||||
Strength += 5;
|
||||
Stamina += 5;
|
||||
@ -785,7 +785,7 @@ void Bot::GenerateBaseStats()
|
||||
Wisdom += 30;
|
||||
Attack += 8;
|
||||
break;
|
||||
case PALADIN:
|
||||
case Class::Paladin:
|
||||
BotSpellID = 3003;
|
||||
Strength += 15;
|
||||
Stamina += 5;
|
||||
@ -794,7 +794,7 @@ void Bot::GenerateBaseStats()
|
||||
Dexterity += 5;
|
||||
Attack += 17;
|
||||
break;
|
||||
case RANGER:
|
||||
case Class::Ranger:
|
||||
BotSpellID = 3004;
|
||||
Strength += 15;
|
||||
Stamina += 10;
|
||||
@ -802,7 +802,7 @@ void Bot::GenerateBaseStats()
|
||||
Wisdom += 15;
|
||||
Attack += 17;
|
||||
break;
|
||||
case SHADOWKNIGHT:
|
||||
case Class::ShadowKnight:
|
||||
BotSpellID = 3005;
|
||||
Strength += 10;
|
||||
Stamina += 15;
|
||||
@ -810,13 +810,13 @@ void Bot::GenerateBaseStats()
|
||||
Charisma += 5;
|
||||
Attack += 17;
|
||||
break;
|
||||
case DRUID:
|
||||
case Class::Druid:
|
||||
BotSpellID = 3006;
|
||||
Stamina += 15;
|
||||
Wisdom += 35;
|
||||
Attack += 5;
|
||||
break;
|
||||
case MONK:
|
||||
case Class::Monk:
|
||||
BotSpellID = 3007;
|
||||
Strength += 5;
|
||||
Stamina += 15;
|
||||
@ -824,7 +824,7 @@ void Bot::GenerateBaseStats()
|
||||
Dexterity += 15;
|
||||
Attack += 17;
|
||||
break;
|
||||
case BARD:
|
||||
case Class::Bard:
|
||||
BotSpellID = 3008;
|
||||
Strength += 15;
|
||||
Dexterity += 10;
|
||||
@ -832,7 +832,7 @@ void Bot::GenerateBaseStats()
|
||||
Intelligence += 10;
|
||||
Attack += 17;
|
||||
break;
|
||||
case ROGUE:
|
||||
case Class::Rogue:
|
||||
BotSpellID = 3009;
|
||||
Strength += 10;
|
||||
Stamina += 20;
|
||||
@ -840,39 +840,39 @@ void Bot::GenerateBaseStats()
|
||||
Dexterity += 10;
|
||||
Attack += 12;
|
||||
break;
|
||||
case SHAMAN:
|
||||
case Class::Shaman:
|
||||
BotSpellID = 3010;
|
||||
Stamina += 10;
|
||||
Wisdom += 30;
|
||||
Charisma += 10;
|
||||
Attack += 28;
|
||||
break;
|
||||
case NECROMANCER:
|
||||
case Class::Necromancer:
|
||||
BotSpellID = 3011;
|
||||
Dexterity += 10;
|
||||
Agility += 10;
|
||||
Intelligence += 30;
|
||||
Attack += 5;
|
||||
break;
|
||||
case WIZARD:
|
||||
case Class::Wizard:
|
||||
BotSpellID = 3012;
|
||||
Stamina += 20;
|
||||
Intelligence += 30;
|
||||
Attack += 5;
|
||||
break;
|
||||
case MAGICIAN:
|
||||
case Class::Magician:
|
||||
BotSpellID = 3013;
|
||||
Stamina += 20;
|
||||
Intelligence += 30;
|
||||
Attack += 5;
|
||||
break;
|
||||
case ENCHANTER:
|
||||
case Class::Enchanter:
|
||||
BotSpellID = 3014;
|
||||
Intelligence += 25;
|
||||
Charisma += 25;
|
||||
Attack += 5;
|
||||
break;
|
||||
case BEASTLORD:
|
||||
case Class::Beastlord:
|
||||
BotSpellID = 3015;
|
||||
Stamina += 10;
|
||||
Agility += 10;
|
||||
@ -881,7 +881,7 @@ void Bot::GenerateBaseStats()
|
||||
Charisma += 5;
|
||||
Attack += 31;
|
||||
break;
|
||||
case BERSERKER:
|
||||
case Class::Berserker:
|
||||
BotSpellID = 3016;
|
||||
Strength += 10;
|
||||
Stamina += 15;
|
||||
@ -1497,7 +1497,7 @@ bool Bot::LoadPet()
|
||||
if (!bot_owner)
|
||||
return false;
|
||||
|
||||
if (GetClass() == WIZARD) {
|
||||
if (GetClass() == Class::Wizard) {
|
||||
auto buffs_max = GetMaxBuffSlots();
|
||||
auto my_buffs = GetBuffs();
|
||||
if (buffs_max && my_buffs) {
|
||||
@ -1799,7 +1799,7 @@ void Bot::AI_Bot_Init()
|
||||
void Bot::SpellProcess() {
|
||||
if (spellend_timer.Check(false)) {
|
||||
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)
|
||||
uint32 bonusGiveDA = (aabonuses.GiveDoubleAttack + spellbonuses.GiveDoubleAttack + itembonuses.GiveDoubleAttack);
|
||||
// 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;
|
||||
|
||||
// You start with no chance of double attacking
|
||||
@ -1941,7 +1941,7 @@ void Bot::SetGuardMode() {
|
||||
m_GuardPoint = GetPosition();
|
||||
SetGuardFlag();
|
||||
|
||||
if (HasPet() && (GetClass() != ENCHANTER || GetPet()->GetPetType() != petAnimation || GetAA(aaAnimationEmpathy) >= 2)) {
|
||||
if (HasPet() && (GetClass() != Class::Enchanter || GetPet()->GetPetType() != petAnimation || GetAA(aaAnimationEmpathy) >= 2)) {
|
||||
GetPet()->StopMoving();
|
||||
}
|
||||
}
|
||||
@ -1953,7 +1953,7 @@ void Bot::SetHoldMode() {
|
||||
|
||||
// AI Processing for the Bot object
|
||||
|
||||
constexpr float MAX_CASTER_DISTANCE[PLAYER_CLASS_COUNT] = {
|
||||
constexpr float MAX_CASTER_DISTANCE[Class::PLAYER_CLASS_COUNT] = {
|
||||
0,
|
||||
(34 * 34),
|
||||
(24 * 24),
|
||||
@ -2111,7 +2111,7 @@ void Bot::AI_Process()
|
||||
}
|
||||
|
||||
// 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
|
||||
GetPet()->SetTarget(tar);
|
||||
@ -2156,7 +2156,7 @@ void Bot::AI_Process()
|
||||
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)) {
|
||||
return;
|
||||
@ -2228,7 +2228,7 @@ void Bot::AI_Process()
|
||||
|
||||
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()->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
|
||||
|
||||
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();
|
||||
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
|
||||
|
||||
if (AI_movement_timer->Check() && (!IsCasting() || GetClass() == BARD)) {
|
||||
if (AI_movement_timer->Check() && (!IsCasting() || GetClass() == Class::Bard)) {
|
||||
if (GUARDING) {
|
||||
Goal = GetGuardPoint();
|
||||
}
|
||||
@ -2311,12 +2311,12 @@ bool Bot::TryIdleChecks(float fm_distance) {
|
||||
|
||||
if (NOT_PASSIVE) {
|
||||
|
||||
if (!AI_IdleCastCheck() && !IsCasting() && GetClass() != BARD) {
|
||||
if (!AI_IdleCastCheck() && !IsCasting() && GetClass() != Class::Bard) {
|
||||
BotMeditate(true);
|
||||
}
|
||||
|
||||
} else {
|
||||
if (GetClass() != BARD) {
|
||||
if (GetClass() != Class::Bard) {
|
||||
BotMeditate(true);
|
||||
}
|
||||
|
||||
@ -2363,7 +2363,7 @@ bool Bot::TryAutoDefend(Client* bot_owner, float leash_distance) {
|
||||
SetTarget(hater);
|
||||
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()->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
|
||||
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()) {
|
||||
LogAIDetail("Pursuing [{}] while engaged", GetTarget()->GetCleanName());
|
||||
Goal = GetTarget()->GetPosition();
|
||||
@ -2410,7 +2410,7 @@ bool Bot::TryPursueTarget(float leash_distance, glm::vec3& Goal) {
|
||||
WipeHateList();
|
||||
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()->SetTarget(nullptr);
|
||||
}
|
||||
@ -2446,7 +2446,7 @@ bool Bot::TrySecondaryWeaponAttacks(Mob* tar, const EQ::ItemInstance* s_item) {
|
||||
const EQ::ItemData* s_itemdata = nullptr;
|
||||
|
||||
// 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) {
|
||||
s_itemdata = s_item->GetItem();
|
||||
@ -2597,7 +2597,7 @@ bool Bot::TryEvade(Mob* tar) {
|
||||
HasTargetReflection() &&
|
||||
!tar->IsFeared() &&
|
||||
!tar->IsStunned() &&
|
||||
GetClass() == ROGUE &&
|
||||
GetClass() == Class::Rogue &&
|
||||
m_evade_timer.Check(false)
|
||||
) {
|
||||
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);
|
||||
bool behind_mob = 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
|
||||
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;
|
||||
|
||||
switch (GetClass()) {
|
||||
case WARRIOR:
|
||||
case PALADIN:
|
||||
case SHADOWKNIGHT:
|
||||
case Class::Warrior:
|
||||
case Class::Paladin:
|
||||
case Class::ShadowKnight:
|
||||
if (p_item && p_item->GetItem()->IsType2HWeapon()) {
|
||||
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;
|
||||
}
|
||||
break;
|
||||
case NECROMANCER:
|
||||
case WIZARD:
|
||||
case MAGICIAN:
|
||||
case ENCHANTER:
|
||||
case Class::Necromancer:
|
||||
case Class::Wizard:
|
||||
case Class::Magician:
|
||||
case Class::Enchanter:
|
||||
if (p_item && p_item->GetItem()->IsType2HWeapon()) {
|
||||
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;
|
||||
}
|
||||
break;
|
||||
case ROGUE:
|
||||
case Class::Rogue:
|
||||
if (behind_mob && backstab_weapon) {
|
||||
if (p_item->GetItem()->IsType2HWeapon()) {
|
||||
melee_distance = melee_distance_max * 0.30f;
|
||||
@ -2860,7 +2860,7 @@ void Bot::AcquireBotTarget(Group* bot_group, Raid* raid, Client* leash_owner, fl
|
||||
if (
|
||||
HasPet() &&
|
||||
(
|
||||
GetClass() != ENCHANTER ||
|
||||
GetClass() != Class::Enchanter ||
|
||||
GetPet()->GetPetType() != petAnimation ||
|
||||
GetAA(aaAnimationEmpathy) >= 2
|
||||
)
|
||||
@ -2880,7 +2880,7 @@ void Bot::AcquireBotTarget(Group* bot_group, Raid* raid, Client* leash_owner, fl
|
||||
if (
|
||||
HasPet() &&
|
||||
(
|
||||
GetClass() != ENCHANTER ||
|
||||
GetClass() != Class::Enchanter ||
|
||||
GetPet()->GetPetType() != petAnimation ||
|
||||
GetAA(aaAnimationEmpathy) >= 1
|
||||
)
|
||||
@ -2962,7 +2962,7 @@ bool Bot::PullingFlagChecks(Client* bot_owner) {
|
||||
SetReturningFlag();
|
||||
|
||||
if (HasPet() &&
|
||||
(GetClass() != ENCHANTER || GetPet()->GetPetType() != petAnimation || GetAA(aaAnimationEmpathy) >= 1)) {
|
||||
(GetClass() != Class::Enchanter || GetPet()->GetPetType() != petAnimation || GetAA(aaAnimationEmpathy) >= 1)) {
|
||||
|
||||
GetPet()->WipeHateList();
|
||||
GetPet()->SetTarget(nullptr);
|
||||
@ -3058,7 +3058,7 @@ bool Bot::CheckIfCasting(float fm_distance) {
|
||||
AdvanceHealRotation(false);
|
||||
return true;
|
||||
}
|
||||
else if (GetClass() != BARD) {
|
||||
else if (GetClass() != Class::Bard) {
|
||||
|
||||
if (IsEngaged()) {
|
||||
return true;
|
||||
@ -3104,7 +3104,7 @@ bool Bot::CheckIfIncapacitated() {
|
||||
}
|
||||
|
||||
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) {
|
||||
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))
|
||||
{
|
||||
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()->SetTarget(lo_target);
|
||||
}
|
||||
@ -3188,7 +3188,7 @@ void Bot::SetOwnerTarget(Client* bot_owner) {
|
||||
AddToHateList(attack_target, 1);
|
||||
SetTarget(attack_target);
|
||||
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()->AddToHateList(attack_target, 1);
|
||||
GetPet()->SetTarget(attack_target);
|
||||
@ -3227,7 +3227,7 @@ void Bot::BotPullerProcess(Client* bot_owner, Raid* raid) {
|
||||
SetTarget(pull_target);
|
||||
SetPullingFlag();
|
||||
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()->SetTarget(nullptr);
|
||||
@ -3247,7 +3247,7 @@ void Bot::SetBotGroupTarget(const Client* bot_owner, Client* leash_owner, float
|
||||
IsAttackAllowed(bgm_target))
|
||||
{
|
||||
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()->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_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);
|
||||
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
|
||||
9, 9, 9, 9, 9, 10, 10, 10, 10, 10, // 31-40
|
||||
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)
|
||||
return 9;
|
||||
if (level > 62)
|
||||
return 15;
|
||||
return mnk_dmg[level];
|
||||
} else if (GetClass() == BEASTLORD) {
|
||||
} else if (GetClass() == Class::Beastlord) {
|
||||
if (level > 49)
|
||||
return 13;
|
||||
return bst_dmg[level];
|
||||
@ -4783,7 +4783,7 @@ void Bot::DoRiposte(Mob* defender) {
|
||||
|
||||
DoubleRipChance = defender->GetAABonuses().GiveDoubleRiposte[1];
|
||||
if (DoubleRipChance && (DoubleRipChance >= zone->random.Int(0, 100))) {
|
||||
if (defender->GetClass() == MONK)
|
||||
if (defender->GetClass() == Class::Monk)
|
||||
defender->MonkSpecialAttack(this, defender->GetAABonuses().GiveDoubleRiposte[2]);
|
||||
else if (defender->IsBot())
|
||||
defender->CastToClient()->DoClassAttacks(this,defender->GetAABonuses().GiveDoubleRiposte[2], true);
|
||||
@ -5044,13 +5044,13 @@ void Bot::DoClassAttacks(Mob *target, bool IsRiposte) {
|
||||
if (ka_time) {
|
||||
|
||||
switch (GetClass()) {
|
||||
case SHADOWKNIGHT: {
|
||||
case Class::ShadowKnight: {
|
||||
CastSpell(SPELL_NPC_HARM_TOUCH, target->GetID());
|
||||
knightattack_timer.Start(HarmTouchReuseTime * 1000);
|
||||
|
||||
break;
|
||||
}
|
||||
case PALADIN: {
|
||||
case Class::Paladin: {
|
||||
if (GetHPRatio() < 20) {
|
||||
CastSpell(SPELL_LAY_ON_HANDS, GetID());
|
||||
knightattack_timer.Start(LayOnHandsReuseTime * 1000);
|
||||
@ -5083,7 +5083,7 @@ void Bot::DoClassAttacks(Mob *target, bool IsRiposte) {
|
||||
|
||||
if (ma_time) {
|
||||
switch (GetClass()) {
|
||||
case MONK: {
|
||||
case Class::Monk: {
|
||||
int reuse = (MonkSpecialAttack(target, EQ::skills::SkillTigerClaw) - 1);
|
||||
|
||||
// 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
|
||||
bool did_attack = false;
|
||||
switch (GetClass()) {
|
||||
case WARRIOR:
|
||||
case Class::Warrior:
|
||||
if (bot_level >= RuleI(Combat, NPCBashKickLevel)) {
|
||||
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))
|
||||
@ -5159,22 +5159,22 @@ void Bot::DoClassAttacks(Mob *target, bool IsRiposte) {
|
||||
else
|
||||
skill_to_use = EQ::skills::SkillBash;
|
||||
}
|
||||
case RANGER:
|
||||
case BEASTLORD:
|
||||
case Class::Ranger:
|
||||
case Class::Beastlord:
|
||||
skill_to_use = EQ::skills::SkillKick;
|
||||
break;
|
||||
case BERSERKER:
|
||||
case Class::Berserker:
|
||||
skill_to_use = EQ::skills::SkillFrenzy;
|
||||
break;
|
||||
case CLERIC:
|
||||
case SHADOWKNIGHT:
|
||||
case PALADIN:
|
||||
case Class::Cleric:
|
||||
case Class::ShadowKnight:
|
||||
case Class::Paladin:
|
||||
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))
|
||||
skill_to_use = EQ::skills::SkillBash;
|
||||
}
|
||||
break;
|
||||
case MONK:
|
||||
case Class::Monk:
|
||||
if (GetLevel() >= 30) {
|
||||
skill_to_use = EQ::skills::SkillFlyingKick;
|
||||
}
|
||||
@ -5192,7 +5192,7 @@ void Bot::DoClassAttacks(Mob *target, bool IsRiposte) {
|
||||
}
|
||||
|
||||
break;
|
||||
case ROGUE:
|
||||
case Class::Rogue:
|
||||
skill_to_use = EQ::skills::SkillBackstab;
|
||||
break;
|
||||
}
|
||||
@ -5600,7 +5600,7 @@ bool Bot::CastSpell(
|
||||
ZeroCastingVars();
|
||||
}
|
||||
|
||||
if (GetClass() != BARD) {
|
||||
if (GetClass() != Class::Bard) {
|
||||
if (
|
||||
!IsValidSpell(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 Result = false;
|
||||
if (GetClass() == BARD)
|
||||
if (GetClass() == Class::Bard)
|
||||
cast_time = 0;
|
||||
|
||||
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() {
|
||||
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);
|
||||
}
|
||||
|
||||
@ -5874,7 +5874,7 @@ bool Bot::DoFinishedSpellSingleTarget(uint16 spell_id, Mob* spellTarget, EQ::spe
|
||||
bool spellequal = (j == thespell);
|
||||
bool spelltypeequal = ((spelltype == 2) || (spelltype == 16) || (spelltype == 32));
|
||||
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);
|
||||
if (spellequal || slotequal) {
|
||||
if ((spelltypeequal || spelltypetargetequal) || spelltypeclassequal || slotequal) {
|
||||
@ -5896,7 +5896,7 @@ bool Bot::DoFinishedSpellSingleTarget(uint16 spell_id, Mob* spellTarget, EQ::spe
|
||||
if (g) {
|
||||
for (int i = 0; i < MAX_GROUP_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
|
||||
SpellOnTarget(thespell, g->members[i]);
|
||||
@ -5917,7 +5917,7 @@ bool Bot::DoFinishedSpellGroupTarget(uint16 spell_id, Mob* spellTarget, EQ::spel
|
||||
bool isMainGroupMGB = false;
|
||||
Raid* raid = entity_list.GetRaidByBotName(GetName());
|
||||
|
||||
if (isMainGroupMGB && (GetClass() != BARD)) {
|
||||
if (isMainGroupMGB && (GetClass() != Class::Bard)) {
|
||||
BotGroupSay(
|
||||
this,
|
||||
fmt::format(
|
||||
@ -6201,7 +6201,7 @@ int32 Bot::CalcCHA() {
|
||||
|
||||
int32 Bot::CalcMR() {
|
||||
MR += (itembonuses.MR + spellbonuses.MR + aabonuses.MR);
|
||||
if (GetClass() == WARRIOR)
|
||||
if (GetClass() == Class::Warrior)
|
||||
MR += (GetLevel() / 2);
|
||||
|
||||
if (MR < 1)
|
||||
@ -6215,7 +6215,7 @@ int32 Bot::CalcMR() {
|
||||
|
||||
int32 Bot::CalcFR() {
|
||||
int c = GetClass();
|
||||
if (c == RANGER) {
|
||||
if (c == Class::Ranger) {
|
||||
FR += 4;
|
||||
int l = GetLevel();
|
||||
if (l > 49)
|
||||
@ -6235,12 +6235,12 @@ int32 Bot::CalcFR() {
|
||||
|
||||
int32 Bot::CalcDR() {
|
||||
int c = GetClass();
|
||||
if (c == PALADIN) {
|
||||
if (c == Class::Paladin) {
|
||||
DR += 8;
|
||||
int l = GetLevel();
|
||||
if (l > 49)
|
||||
DR += (l - 49);
|
||||
} else if (c == SHADOWKNIGHT) {
|
||||
} else if (c == Class::ShadowKnight) {
|
||||
DR += 4;
|
||||
int l = GetLevel();
|
||||
if (l > 49)
|
||||
@ -6259,12 +6259,12 @@ int32 Bot::CalcDR() {
|
||||
|
||||
int32 Bot::CalcPR() {
|
||||
int c = GetClass();
|
||||
if (c == ROGUE) {
|
||||
if (c == Class::Rogue) {
|
||||
PR += 8;
|
||||
int l = GetLevel();
|
||||
if (l > 49)
|
||||
PR += (l - 49);
|
||||
} else if (c == SHADOWKNIGHT) {
|
||||
} else if (c == Class::ShadowKnight) {
|
||||
PR += 4;
|
||||
int l = GetLevel();
|
||||
if (l > 49)
|
||||
@ -6284,7 +6284,7 @@ int32 Bot::CalcPR() {
|
||||
|
||||
int32 Bot::CalcCR() {
|
||||
int c = GetClass();
|
||||
if (c == RANGER) {
|
||||
if (c == Class::Ranger) {
|
||||
CR += 4;
|
||||
int l = GetLevel();
|
||||
if (l > 49)
|
||||
@ -6401,7 +6401,7 @@ int64 Bot::CalcManaRegen() {
|
||||
int32 regen = 0;
|
||||
if (IsSitting()) {
|
||||
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 += (spellbonuses.ManaRegen + itembonuses.ManaRegen);
|
||||
} else
|
||||
@ -6423,25 +6423,25 @@ int64 Bot::CalcManaRegen() {
|
||||
uint64 Bot::GetClassHPFactor() {
|
||||
uint32 factor;
|
||||
switch (GetClass()) {
|
||||
case BEASTLORD:
|
||||
case BERSERKER:
|
||||
case MONK:
|
||||
case ROGUE:
|
||||
case SHAMAN:
|
||||
case Class::Beastlord:
|
||||
case Class::Berserker:
|
||||
case Class::Monk:
|
||||
case Class::Rogue:
|
||||
case Class::Shaman:
|
||||
factor = 255;
|
||||
break;
|
||||
case BARD:
|
||||
case CLERIC:
|
||||
case Class::Bard:
|
||||
case Class::Cleric:
|
||||
factor = 264;
|
||||
break;
|
||||
case SHADOWKNIGHT:
|
||||
case PALADIN:
|
||||
case Class::ShadowKnight:
|
||||
case Class::Paladin:
|
||||
factor = 288;
|
||||
break;
|
||||
case RANGER:
|
||||
case Class::Ranger:
|
||||
factor = 276;
|
||||
break;
|
||||
case WARRIOR:
|
||||
case Class::Warrior:
|
||||
factor = 300;
|
||||
break;
|
||||
default:
|
||||
@ -6682,46 +6682,46 @@ void Bot::UpdateGroupCastingRoles(const Group* group, bool disband)
|
||||
|
||||
// GroupHealer
|
||||
switch (iter->GetClass()) {
|
||||
case CLERIC:
|
||||
case Class::Cleric:
|
||||
if (!healer)
|
||||
healer = iter;
|
||||
else
|
||||
switch (healer->GetClass()) {
|
||||
case CLERIC:
|
||||
case Class::Cleric:
|
||||
break;
|
||||
default:
|
||||
healer = iter;
|
||||
}
|
||||
|
||||
break;
|
||||
case DRUID:
|
||||
case Class::Druid:
|
||||
if (!healer)
|
||||
healer = iter;
|
||||
else
|
||||
switch (healer->GetClass()) {
|
||||
case CLERIC:
|
||||
case DRUID:
|
||||
case Class::Cleric:
|
||||
case Class::Druid:
|
||||
break;
|
||||
default:
|
||||
healer = iter;
|
||||
}
|
||||
break;
|
||||
case SHAMAN:
|
||||
case Class::Shaman:
|
||||
if (!healer)
|
||||
healer = iter;
|
||||
else
|
||||
switch (healer->GetClass()) {
|
||||
case CLERIC:
|
||||
case DRUID:
|
||||
case SHAMAN:
|
||||
case Class::Cleric:
|
||||
case Class::Druid:
|
||||
case Class::Shaman:
|
||||
break;
|
||||
default:
|
||||
healer = iter;
|
||||
}
|
||||
break;
|
||||
case PALADIN:
|
||||
case RANGER:
|
||||
case BEASTLORD:
|
||||
case Class::Paladin:
|
||||
case Class::Ranger:
|
||||
case Class::Beastlord:
|
||||
if (!healer)
|
||||
healer = iter;
|
||||
break;
|
||||
@ -6731,30 +6731,30 @@ void Bot::UpdateGroupCastingRoles(const Group* group, bool disband)
|
||||
|
||||
// GroupSlower
|
||||
switch (iter->GetClass()) {
|
||||
case SHAMAN:
|
||||
case Class::Shaman:
|
||||
if (!slower)
|
||||
slower = iter;
|
||||
else
|
||||
switch (slower->GetClass()) {
|
||||
case SHAMAN:
|
||||
case Class::Shaman:
|
||||
break;
|
||||
default:
|
||||
slower = iter;
|
||||
}
|
||||
break;
|
||||
case ENCHANTER:
|
||||
case Class::Enchanter:
|
||||
if (!slower)
|
||||
slower = iter;
|
||||
else
|
||||
switch (slower->GetClass()) {
|
||||
case SHAMAN:
|
||||
case ENCHANTER:
|
||||
case Class::Shaman:
|
||||
case Class::Enchanter:
|
||||
break;
|
||||
default:
|
||||
slower = iter;
|
||||
}
|
||||
break;
|
||||
case BEASTLORD:
|
||||
case Class::Beastlord:
|
||||
if (!slower)
|
||||
slower = iter;
|
||||
break;
|
||||
@ -6985,7 +6985,7 @@ void Bot::CalcBotStats(bool showtext) {
|
||||
|
||||
taunt_timer.Start(1000);
|
||||
|
||||
if (GetClass() == MONK && GetLevel() >= 10) {
|
||||
if (GetClass() == Class::Monk && GetLevel() >= 10) {
|
||||
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, "Resists-- Magic: %i, Poison: %i, Fire: %i, Cold: %i, Disease: %i, Corruption: %i.",MR,PR,FR,CR,DR,Corrup);
|
||||
// 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",
|
||||
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, "Resists-- Magic: %i, Poison: %i, Fire: %i, Cold: %i, Disease: %i, Corruption: %i.",GetMR(),GetPR(),GetFR(),GetCR(),GetDR(),GetCorrup());
|
||||
// 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",
|
||||
GetSkill(EQ::skills::SkillBrassInstruments) + GetBrassMod(),
|
||||
GetSkill(EQ::skills::SkillPercussionInstruments) + GetPercMod(),
|
||||
@ -7057,7 +7057,7 @@ bool EntityList::Bot_AICheckCloseBeneficialSpells(Bot* caster, uint8 iChance, fl
|
||||
uint8 botCasterClass = caster->GetClass();
|
||||
|
||||
if (iSpellTypes == SpellType_Heal) {
|
||||
if (botCasterClass == CLERIC || botCasterClass == DRUID || botCasterClass == SHAMAN) {
|
||||
if (botCasterClass == Class::Cleric || botCasterClass == Class::Druid || botCasterClass == Class::Shaman) {
|
||||
if (caster->IsRaidGrouped()) {
|
||||
Raid* raid = entity_list.GetRaidByBotName(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))
|
||||
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))
|
||||
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))
|
||||
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->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;
|
||||
|
||||
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 (caster->AICastSpell(g->members[i], 100, SpellType_Heal))
|
||||
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))
|
||||
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))
|
||||
return true;
|
||||
} 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]->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;
|
||||
|
||||
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;
|
||||
switch(caster->GetBotStance()) {
|
||||
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))
|
||||
return true;
|
||||
} else if (
|
||||
(iter->member->GetClass() == WARRIOR || iter->member->GetClass() == PALADIN ||
|
||||
iter->member->GetClass() == SHADOWKNIGHT) &&
|
||||
(iter->member->GetClass() == Class::Warrior || iter->member->GetClass() == Class::Paladin ||
|
||||
iter->member->GetClass() == Class::ShadowKnight) &&
|
||||
iter->member->GetHPRatio() < hpRatioToHeal) {
|
||||
if (caster->AICastSpell(iter->member, 100, SpellType_Heal))
|
||||
return true;
|
||||
} else if (iter->member->GetClass() == ENCHANTER &&
|
||||
} else if (iter->member->GetClass() == Class::Enchanter &&
|
||||
iter->member->GetHPRatio() < hpRatioToHeal) {
|
||||
if (caster->AICastSpell(iter->member, 100, SpellType_Heal))
|
||||
return true;
|
||||
@ -7174,7 +7174,7 @@ bool EntityList::Bot_AICheckCloseBeneficialSpells(Bot* caster, uint8 iChance, fl
|
||||
if (iter->member && !iter->member->qglobal && iter->member->HasPet() &&
|
||||
iter->member->GetPet()->GetHPRatio() < 25) {
|
||||
if (iter->member->GetPet()->GetOwner() != caster && caster->IsEngaged() &&
|
||||
iter->member->IsCasting() && iter->member->GetClass() != ENCHANTER)
|
||||
iter->member->IsCasting() && iter->member->GetClass() != Class::Enchanter)
|
||||
continue;
|
||||
|
||||
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 (caster->AICastSpell(g->members[i], 100, SpellType_Heal))
|
||||
return true;
|
||||
} else if ((g->members[i]->GetClass() == WARRIOR || g->members[i]->GetClass() == PALADIN ||
|
||||
g->members[i]->GetClass() == SHADOWKNIGHT) &&
|
||||
} else if ((g->members[i]->GetClass() == Class::Warrior || g->members[i]->GetClass() == Class::Paladin ||
|
||||
g->members[i]->GetClass() == Class::ShadowKnight) &&
|
||||
g->members[i]->GetHPRatio() < hpRatioToHeal) {
|
||||
if (caster->AICastSpell(g->members[i], 100, SpellType_Heal))
|
||||
return true;
|
||||
} else if (g->members[i]->GetClass() == ENCHANTER &&
|
||||
} else if (g->members[i]->GetClass() == Class::Enchanter &&
|
||||
g->members[i]->GetHPRatio() < hpRatioToHeal) {
|
||||
if (caster->AICastSpell(g->members[i], 100, SpellType_Heal))
|
||||
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() &&
|
||||
g->members[i]->GetPet()->GetHPRatio() < 25) {
|
||||
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;
|
||||
|
||||
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) {
|
||||
uint8 chanceToCast = caster->IsEngaged() ? caster->GetChanceToCastBySpellType(SpellType_Buff) : 100;
|
||||
if (botCasterClass == BARD) {
|
||||
if (botCasterClass == Class::Bard) {
|
||||
if (caster->AICastSpell(caster, chanceToCast, SpellType_Buff)) {
|
||||
return true;
|
||||
} else
|
||||
@ -7266,7 +7266,7 @@ bool EntityList::Bot_AICheckCloseBeneficialSpells(Bot* caster, uint8 iChance, fl
|
||||
if (iter->member && caster->GetNeedsCured(iter->member)) {
|
||||
if (caster->AICastSpell(iter->member, caster->GetChanceToCastBySpellType(SpellType_Cure), SpellType_Cure))
|
||||
return true;
|
||||
else if (botCasterClass == BARD) {
|
||||
else if (botCasterClass == Class::Bard) {
|
||||
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 (caster->AICastSpell(g->members[i], caster->GetChanceToCastBySpellType(SpellType_Cure), SpellType_Cure))
|
||||
return true;
|
||||
else if (botCasterClass == BARD)
|
||||
else if (botCasterClass == Class::Bard)
|
||||
return false;
|
||||
}
|
||||
|
||||
@ -7329,7 +7329,7 @@ bool EntityList::Bot_AICheckCloseBeneficialSpells(Bot* caster, uint8 iChance, fl
|
||||
}
|
||||
|
||||
if (iSpellTypes == SpellType_PreCombatBuff) {
|
||||
if (botCasterClass == BARD || caster->IsEngaged())
|
||||
if (botCasterClass == Class::Bard || caster->IsEngaged())
|
||||
return false;
|
||||
|
||||
//added raid check
|
||||
@ -7361,7 +7361,7 @@ bool EntityList::Bot_AICheckCloseBeneficialSpells(Bot* caster, uint8 iChance, fl
|
||||
}
|
||||
|
||||
if (iSpellTypes == SpellType_InCombatBuff) {
|
||||
if (botCasterClass == BARD) {
|
||||
if (botCasterClass == Class::Bard) {
|
||||
if (caster->AICastSpell(caster, iChance, SpellType_InCombatBuff)) {
|
||||
return true;
|
||||
}
|
||||
@ -7836,16 +7836,16 @@ bool Bot::GetNeedsHateRedux(Mob *tar) {
|
||||
|
||||
if (tar->IsBot()) {
|
||||
switch (tar->GetClass()) {
|
||||
case ROGUE:
|
||||
case Class::Rogue:
|
||||
if (tar->CanFacestab() || tar->CastToBot()->m_evade_timer.Check(false))
|
||||
return false;
|
||||
case CLERIC:
|
||||
case DRUID:
|
||||
case SHAMAN:
|
||||
case NECROMANCER:
|
||||
case WIZARD:
|
||||
case MAGICIAN:
|
||||
case ENCHANTER:
|
||||
case Class::Cleric:
|
||||
case Class::Druid:
|
||||
case Class::Shaman:
|
||||
case Class::Necromancer:
|
||||
case Class::Wizard:
|
||||
case Class::Magician:
|
||||
case Class::Enchanter:
|
||||
return true;
|
||||
default:
|
||||
return false;
|
||||
@ -7874,7 +7874,7 @@ bool Bot::HasOrMayGetAggro() {
|
||||
|
||||
void Bot::SetDefaultBotStance() {
|
||||
EQ::constants::StanceType defaultStance = EQ::constants::stanceBalanced;
|
||||
if (GetClass() == WARRIOR)
|
||||
if (GetClass() == Class::Warrior)
|
||||
defaultStance = EQ::constants::stanceAggressive;
|
||||
|
||||
_botStance = defaultStance;
|
||||
@ -8707,7 +8707,7 @@ float Bot::GetBotCasterMaxRange(float melee_distance_max) {// Calculate caster d
|
||||
float caster_distance = 0.0f;
|
||||
|
||||
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];
|
||||
}
|
||||
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 };
|
||||
|
||||
@ -394,14 +394,14 @@ public:
|
||||
|
||||
// Static Class Methods
|
||||
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 bool IsBotAttackAllowed(Mob* attacker, Mob* target, bool& hasRuleDefined);
|
||||
static Bot* GetBotByBotClientOwnerAndBotName(Client* c, const std::string& botName);
|
||||
static void ProcessBotGroupInvite(Client* c, std::string const& 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 LoadAndSpawnAllZonedBots(Client* bot_owner);
|
||||
static bool GroupHasBot(Group* group);
|
||||
@ -604,7 +604,7 @@ public:
|
||||
void SetBotCharmer(bool c) { _botCharmer = c; }
|
||||
void SetPetChooser(bool p) { _petChooser = p; }
|
||||
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) {
|
||||
if (botStance >= EQ::constants::stancePassive && botStance <= EQ::constants::stanceBurnAE)
|
||||
_botStance = botStance;
|
||||
@ -738,7 +738,7 @@ public:
|
||||
//Raid additions
|
||||
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 BotCastHeal(Mob* tar, uint8 botLevel, uint8 botClass, BotSpell& botSpell, Raid* raid);
|
||||
|
||||
@ -84,8 +84,8 @@ namespace
|
||||
|
||||
enum { EffectIDFirst = 1, EffectIDLast = 12 };
|
||||
|
||||
#define VALIDATECLASSID(x) ((x >= WARRIOR && x <= BERSERKER) ? (x) : (0))
|
||||
#define CLASSIDTOINDEX(x) ((x >= WARRIOR && x <= BERSERKER) ? (x - 1) : (0))
|
||||
#define VALIDATECLASSID(x) ((x >= Class::Warrior && x <= Class::Berserker) ? (x) : (0))
|
||||
#define CLASSIDTOINDEX(x) ((x >= Class::Warrior && x <= Class::Berserker) ? (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 RESISTANCEIDTOINDEX(x) ((x >= BCEnum::RT_Fire && x <= BCEnum::RT_Corruption) ? (x - 1) : (0))
|
||||
@ -196,7 +196,7 @@ public:
|
||||
|
||||
uint8 class_levels[16] = {0};
|
||||
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);
|
||||
if (spells[spell_id].classes[class_index] == 0 ||
|
||||
spells[spell_id].classes[class_index] > HARD_LEVEL_CAP) {
|
||||
@ -489,7 +489,7 @@ public:
|
||||
entry_prototype->target_type = target_type;
|
||||
|
||||
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);
|
||||
if (!class_levels[class_index])
|
||||
continue;
|
||||
@ -1119,7 +1119,7 @@ private:
|
||||
}
|
||||
|
||||
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...";
|
||||
|
||||
if (bot_levels.empty()) {
|
||||
@ -2377,7 +2377,7 @@ namespace ActionableBots
|
||||
else if (!ab_type_arg.compare("healrotationtargets")) {
|
||||
ab_type = ABT_HealRotationTargets;
|
||||
}
|
||||
else if (!ab_type_arg.compare("byclass")) {
|
||||
else if (!ab_type_arg.compare("byclass")) {
|
||||
ab_type = ABT_Class;
|
||||
}
|
||||
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) {
|
||||
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() == 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::Rogue && l->GetClass() != Class::Bard); });
|
||||
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() == Class::Bard && l->GetLevel() < 40); });
|
||||
|
||||
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->IsBot() &&
|
||||
t->CastToBot()->GetBotOwnerCharacterID() == c->CharacterID() &&
|
||||
t->GetClass() == ROGUE
|
||||
t->GetClass() == Class::Rogue
|
||||
) {
|
||||
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 (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!");
|
||||
return;
|
||||
@ -3353,8 +3353,8 @@ void bot_command_depart(Client *c, const Seperator *sep)
|
||||
|
||||
std::string destination = sep->arg[1];
|
||||
if (!destination.compare("list")) {
|
||||
Bot* my_druid_bot = ActionableBots::AsGroupMember_ByClass(c, c, DRUID);
|
||||
Bot* my_wizard_bot = ActionableBots::AsGroupMember_ByClass(c, c, WIZARD);
|
||||
Bot* my_druid_bot = ActionableBots::AsGroupMember_ByClass(c, c, Class::Druid);
|
||||
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);
|
||||
return;
|
||||
}
|
||||
@ -4647,17 +4647,17 @@ void bot_command_pull(Client *c, const Seperator *sep)
|
||||
}
|
||||
|
||||
switch (bot_iter->GetClass()) {
|
||||
case ROGUE:
|
||||
case MONK:
|
||||
case BARD:
|
||||
case RANGER:
|
||||
case Class::Rogue:
|
||||
case Class::Monk:
|
||||
case Class::Bard:
|
||||
case Class::Ranger:
|
||||
bot_puller = bot_iter;
|
||||
break;
|
||||
case WARRIOR:
|
||||
case SHADOWKNIGHT:
|
||||
case PALADIN:
|
||||
case BERSERKER:
|
||||
case BEASTLORD:
|
||||
case Class::Warrior:
|
||||
case Class::ShadowKnight:
|
||||
case Class::Paladin:
|
||||
case Class::Berserker:
|
||||
case Class::Beastlord:
|
||||
if (!bot_puller) {
|
||||
|
||||
bot_puller = bot_iter;
|
||||
@ -4665,22 +4665,22 @@ void bot_command_pull(Client *c, const Seperator *sep)
|
||||
}
|
||||
|
||||
switch (bot_puller->GetClass()) {
|
||||
case DRUID:
|
||||
case SHAMAN:
|
||||
case CLERIC:
|
||||
case WIZARD:
|
||||
case NECROMANCER:
|
||||
case MAGICIAN:
|
||||
case ENCHANTER:
|
||||
case Class::Druid:
|
||||
case Class::Shaman:
|
||||
case Class::Cleric:
|
||||
case Class::Wizard:
|
||||
case Class::Necromancer:
|
||||
case Class::Magician:
|
||||
case Class::Enchanter:
|
||||
bot_puller = bot_iter;
|
||||
default:
|
||||
continue;
|
||||
}
|
||||
|
||||
continue;
|
||||
case DRUID:
|
||||
case SHAMAN:
|
||||
case CLERIC:
|
||||
case Class::Druid:
|
||||
case Class::Shaman:
|
||||
case Class::Cleric:
|
||||
if (!bot_puller) {
|
||||
|
||||
bot_puller = bot_iter;
|
||||
@ -4688,20 +4688,20 @@ void bot_command_pull(Client *c, const Seperator *sep)
|
||||
}
|
||||
|
||||
switch (bot_puller->GetClass()) {
|
||||
case WIZARD:
|
||||
case NECROMANCER:
|
||||
case MAGICIAN:
|
||||
case ENCHANTER:
|
||||
case Class::Wizard:
|
||||
case Class::Necromancer:
|
||||
case Class::Magician:
|
||||
case Class::Enchanter:
|
||||
bot_puller = bot_iter;
|
||||
default:
|
||||
continue;
|
||||
}
|
||||
|
||||
continue;
|
||||
case WIZARD:
|
||||
case NECROMANCER:
|
||||
case MAGICIAN:
|
||||
case ENCHANTER:
|
||||
case Class::Wizard:
|
||||
case Class::Necromancer:
|
||||
case Class::Magician:
|
||||
case Class::Enchanter:
|
||||
if (!bot_puller) {
|
||||
bot_puller = bot_iter;
|
||||
}
|
||||
@ -5210,15 +5210,15 @@ void bot_command_track(Client *c, const Seperator *sep)
|
||||
std::list<Bot*> 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);
|
||||
|
||||
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 (!my_bot)
|
||||
my_bot = ActionableBots::AsSpawned_ByMinLevelAndClass(c, sbl, 20, DRUID);
|
||||
my_bot = ActionableBots::AsSpawned_ByMinLevelAndClass(c, sbl, 20, Class::Druid);
|
||||
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) {
|
||||
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;
|
||||
std::string tracking_msg;
|
||||
switch (my_bot->GetClass()) {
|
||||
case RANGER:
|
||||
case Class::Ranger:
|
||||
if (!tracking_scope.compare("local")) {
|
||||
base_distance = 30;
|
||||
tracking_msg = "Local tracking...";
|
||||
@ -5244,11 +5244,11 @@ void bot_command_track(Client *c, const Seperator *sep)
|
||||
tracking_msg = "Advanced tracking...";
|
||||
}
|
||||
break;
|
||||
case DRUID:
|
||||
case Class::Druid:
|
||||
base_distance = 30;
|
||||
tracking_msg = "Local tracking...";
|
||||
break;
|
||||
case BARD:
|
||||
case Class::Bard:
|
||||
base_distance = 20;
|
||||
tracking_msg = "Near tracking...";
|
||||
break;
|
||||
@ -6612,7 +6612,7 @@ void bot_subcommand_bot_list(Client *c, const Seperator *sep)
|
||||
).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);
|
||||
|
||||
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];
|
||||
|
||||
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)) {
|
||||
c->Message(
|
||||
Chat::White,
|
||||
@ -6972,22 +6972,22 @@ void bot_subcommand_bot_spawn(Client *c, const Seperator *sep)
|
||||
|
||||
static std::string bot_spawn_message[17] = {
|
||||
"I am ready to fight!", // DEFAULT
|
||||
"A solid weapon is my ally!", // WARRIOR
|
||||
"The pious shall never die!", // CLERIC
|
||||
"I am the symbol of Light!", // PALADIN
|
||||
"There are enemies near!", // RANGER
|
||||
"Out of the shadows, I step!", // SHADOWKNIGHT
|
||||
"Nature's fury shall be wrought!", // DRUID
|
||||
"Your punishment will be my fist!", // MONK
|
||||
"A solid weapon is my ally!", // Class::Warrior
|
||||
"The pious shall never die!", // Class::Cleric
|
||||
"I am the symbol of Light!", // Class::Paladin
|
||||
"There are enemies near!", // Class::Ranger
|
||||
"Out of the shadows, I step!", // Class::ShadowKnight
|
||||
"Nature's fury shall be wrought!", // Class::Druid
|
||||
"Your punishment will be my fist!", // Class::Monk
|
||||
"Music is the overture of battle! ", // BARD
|
||||
"Daggers into the backs of my enemies!", // ROGUE
|
||||
"More bones to grind!", // SHAMAN
|
||||
"Death is only the beginning!", // NECROMANCER
|
||||
"I am the harbinger of demise!", // WIZARD
|
||||
"The elements are at my command!", // MAGICIAN
|
||||
"No being can resist my charm!", // ENCHANTER
|
||||
"Battles are won by hand and paw!", // BEASTLORD
|
||||
"My bloodthirst shall not be quenched!" // BERSERKER
|
||||
"Daggers into the backs of my enemies!", // Class::Rogue
|
||||
"More bones to grind!", // Class::Shaman
|
||||
"Death is only the beginning!", // Class::Necromancer
|
||||
"I am the harbinger of demise!", // Class::Wizard
|
||||
"The elements are at my command!", // Class::Magician
|
||||
"No being can resist my charm!", // Class::Enchanter
|
||||
"Battles are won by hand and paw!", // Class::Beastlord
|
||||
"My bloodthirst shall not be quenched!" // Class::Berserker
|
||||
};
|
||||
|
||||
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());
|
||||
|
||||
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());
|
||||
}
|
||||
}
|
||||
@ -7467,7 +7467,7 @@ void bot_subcommand_circle(Client *c, const Seperator *sep)
|
||||
return;
|
||||
if (helper_is_help_or_usage(sep->arg[1])) {
|
||||
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;
|
||||
}
|
||||
|
||||
@ -7478,7 +7478,7 @@ void bot_subcommand_circle(Client *c, const Seperator *sep)
|
||||
|
||||
std::string destination = sep->arg[1];
|
||||
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);
|
||||
return;
|
||||
}
|
||||
@ -7497,7 +7497,7 @@ void bot_subcommand_circle(Client *c, const Seperator *sep)
|
||||
auto local_entry = list_iter->SafeCastToDepart();
|
||||
if (helper_spell_check_fail(local_entry))
|
||||
continue;
|
||||
if (local_entry->caster_class != DRUID)
|
||||
if (local_entry->caster_class != Class::Druid)
|
||||
continue;
|
||||
if (local_entry->single != single)
|
||||
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)
|
||||
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);
|
||||
if (sbl.empty()) {
|
||||
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)
|
||||
return;
|
||||
|
||||
uint16 class_mask = PLAYER_CLASS_MAGICIAN_BIT;
|
||||
uint16 class_mask = player_class_bitmasks[Class::Magician];
|
||||
ActionableBots::Filter_ByClasses(c, sbl, class_mask);
|
||||
if (sbl.empty()) {
|
||||
c->Message(Chat::White, "You have no spawned Magician bots");
|
||||
@ -9103,7 +9103,7 @@ void bot_subcommand_portal(Client *c, const Seperator *sep)
|
||||
return;
|
||||
if (helper_is_help_or_usage(sep->arg[1])) {
|
||||
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;
|
||||
}
|
||||
|
||||
@ -9114,7 +9114,7 @@ void bot_subcommand_portal(Client *c, const Seperator *sep)
|
||||
|
||||
std::string destination = sep->arg[1];
|
||||
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);
|
||||
return;
|
||||
}
|
||||
@ -9133,7 +9133,7 @@ void bot_subcommand_portal(Client *c, const Seperator *sep)
|
||||
auto local_entry = list_iter->SafeCastToDepart();
|
||||
if (helper_spell_check_fail(local_entry))
|
||||
continue;
|
||||
if (local_entry->caster_class != WIZARD)
|
||||
if (local_entry->caster_class != Class::Wizard)
|
||||
continue;
|
||||
if (local_entry->single != single)
|
||||
continue;
|
||||
@ -9427,26 +9427,26 @@ void helper_bot_out_of_combat(Client *bot_owner, Bot *my_bot)
|
||||
return;
|
||||
|
||||
switch (my_bot->GetClass()) {
|
||||
case WARRIOR:
|
||||
case CLERIC:
|
||||
case PALADIN:
|
||||
case RANGER:
|
||||
case SHADOWKNIGHT:
|
||||
case DRUID:
|
||||
case MONK:
|
||||
case Class::Warrior:
|
||||
case Class::Cleric:
|
||||
case Class::Paladin:
|
||||
case Class::Ranger:
|
||||
case Class::ShadowKnight:
|
||||
case Class::Druid:
|
||||
case Class::Monk:
|
||||
bot_owner->Message(Chat::White, "%s has no out-of-combat behavior defined", my_bot->GetCleanName());
|
||||
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")));
|
||||
break;
|
||||
case ROGUE:
|
||||
case SHAMAN:
|
||||
case NECROMANCER:
|
||||
case WIZARD:
|
||||
case MAGICIAN:
|
||||
case ENCHANTER:
|
||||
case BEASTLORD:
|
||||
case BERSERKER:
|
||||
case Class::Rogue:
|
||||
case Class::Shaman:
|
||||
case Class::Necromancer:
|
||||
case Class::Wizard:
|
||||
case Class::Magician:
|
||||
case Class::Enchanter:
|
||||
case Class::Beastlord:
|
||||
case Class::Berserker:
|
||||
bot_owner->Message(Chat::White, "%s has no out-of-combat behavior defined", my_bot->GetCleanName());
|
||||
break;
|
||||
default:
|
||||
@ -10457,8 +10457,8 @@ void bot_command_pickpocket(Client *c, const Seperator *sep)
|
||||
MyBots::PopulateSBL_BySpawnedBots(c, sbl);
|
||||
|
||||
// Check for capable rogue
|
||||
ActionableBots::Filter_ByClasses(c, sbl, PLAYER_CLASS_ROGUE_BIT);
|
||||
Bot *my_bot = ActionableBots::AsSpawned_ByMinLevelAndClass(c, sbl, 7, ROGUE);
|
||||
ActionableBots::Filter_ByClasses(c, sbl, player_class_bitmasks[Class::Rogue]);
|
||||
Bot *my_bot = ActionableBots::AsSpawned_ByMinLevelAndClass(c, sbl, 7, Class::Rogue);
|
||||
if (!my_bot) {
|
||||
c->Message(Chat::White, "No bots are capable of performing this action");
|
||||
return;
|
||||
|
||||
@ -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_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_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_list_fail(Client *bot_owner, bcst_list* spell_list, BCEnum::SpType spell_type);
|
||||
#endif
|
||||
|
||||
@ -141,7 +141,7 @@ bool BotDatabase::LoadBotSpellCastingChances()
|
||||
if (spell_type_index >= Bot::SPELL_TYPE_COUNT)
|
||||
continue;
|
||||
uint8 class_index = Strings::ToInt(row[1]);
|
||||
if (class_index < WARRIOR || class_index > BERSERKER)
|
||||
if (class_index < Class::Warrior || class_index > Class::Berserker)
|
||||
continue;
|
||||
--class_index;
|
||||
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();
|
||||
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(
|
||||
"SELECT COUNT(`bot_id`) FROM `bot_data` WHERE `owner_id` = {} AND `class` = {}",
|
||||
owner_id,
|
||||
@ -2517,7 +2517,7 @@ uint8 BotDatabase::GetSpellCastingChance(uint8 spell_type_index, uint8 class_ind
|
||||
{
|
||||
if (spell_type_index >= Bot::SPELL_TYPE_COUNT)
|
||||
return 0;
|
||||
if (class_index >= PLAYER_CLASS_COUNT)
|
||||
if (class_index >= Class::PLAYER_CLASS_COUNT)
|
||||
return 0;
|
||||
if (stance_index >= EQ::constants::STANCE_TYPE_COUNT)
|
||||
return 0;
|
||||
|
||||
@ -101,7 +101,7 @@ bool Bot::AICastSpell(Mob* tar, uint8 iChance, uint32 iSpellTypes) {
|
||||
|
||||
bool Bot::BotCastSong(Mob* tar, uint8 botLevel) {
|
||||
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;
|
||||
|
||||
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 casted_spell = false;
|
||||
if (GetClass() == BARD) {
|
||||
if (GetClass() == Class::Bard) {
|
||||
std::list<BotSpell_wPriority> botSongList = GetPrioritizedBotSpellsBySpellType(this, SpellType_HateRedux);
|
||||
for (auto iter : botSongList) {
|
||||
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);
|
||||
|
||||
if (casted_spell && botClass != BARD) {
|
||||
if (casted_spell && botClass != Class::Bard) {
|
||||
if (IsGroupSpell(botSpell.SpellId)) {
|
||||
if (HasGroup()) {
|
||||
Group const* group = GetGroup();
|
||||
@ -301,7 +301,7 @@ bool Bot::BotCastSlow(Mob* tar, uint8 botLevel, uint8 botClass, BotSpell& botSpe
|
||||
}
|
||||
|
||||
switch (botClass) {
|
||||
case BARD: {
|
||||
case Class::Bard: {
|
||||
// probably needs attackable check
|
||||
for (
|
||||
auto botSongList = GetPrioritizedBotSpellsBySpellType(this, SpellType_Slow);
|
||||
@ -339,12 +339,12 @@ bool Bot::BotCastSlow(Mob* tar, uint8 botLevel, uint8 botClass, BotSpell& botSpe
|
||||
|
||||
break;
|
||||
}
|
||||
case ENCHANTER: {
|
||||
case Class::Enchanter: {
|
||||
botSpell = GetBestBotSpellForMagicBasedSlow(this);
|
||||
break;
|
||||
}
|
||||
case SHAMAN:
|
||||
case BEASTLORD: {
|
||||
case Class::Shaman:
|
||||
case Class::Beastlord: {
|
||||
botSpell = GetBestBotSpellForDiseaseBasedSlow(this);
|
||||
|
||||
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);
|
||||
}
|
||||
|
||||
if (casted_spell && GetClass() != BARD) {
|
||||
if (casted_spell && GetClass() != Class::Bard) {
|
||||
if (raid) {
|
||||
const auto msg = fmt::format("Attempting to slow {}.", tar->GetCleanName());
|
||||
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;
|
||||
}
|
||||
|
||||
if (GetClass() == BARD) {
|
||||
if (GetClass() == Class::Bard) {
|
||||
std::list<BotSpell_wPriority> dotList = GetPrioritizedBotSpellsBySpellType(this, SpellType_DOT);
|
||||
|
||||
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) ||
|
||||
spells[s.SpellId].target_type == ST_Group ||
|
||||
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->CanBuffStack(s.SpellId, botLevel, true) >= 0
|
||||
@ -582,7 +582,7 @@ bool Bot::BotCastCombatBuff(Mob* tar, uint8 botLevel, uint8 botClass) {
|
||||
if (
|
||||
((IsEffectInSpell(s.SpellId, SE_Levitate) && !zone->CanLevitate()) ||
|
||||
(IsEffectInSpell(s.SpellId, SE_MovementSpeed) && !zone->CanCastOutdoor())) &&
|
||||
(botClass != BARD || !IsSpellUsableInThisZoneType(s.SpellId, zone->GetZoneType()))
|
||||
(botClass != Class::Bard || !IsSpellUsableInThisZoneType(s.SpellId, zone->GetZoneType()))
|
||||
) {
|
||||
continue;
|
||||
}
|
||||
@ -625,7 +625,7 @@ bool Bot::BotCastCombatBuff(Mob* tar, uint8 botLevel, uint8 botClass) {
|
||||
}
|
||||
}
|
||||
// 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;
|
||||
|
||||
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 casted_spell = false;
|
||||
if (!IsPet() && !GetPetID() && !IsBotCharmer()) {
|
||||
if (botClass == WIZARD) {
|
||||
if (botClass == Class::Wizard) {
|
||||
auto buffs_max = GetMaxBuffSlots();
|
||||
auto my_buffs = GetBuffs();
|
||||
int familiar_buff_slot = -1;
|
||||
@ -694,7 +694,7 @@ bool Bot::BotCastPet(Mob* tar, uint8 botClass, BotSpell& botSpell) {
|
||||
|
||||
botSpell = GetFirstBotSpellBySpellType(this, SpellType_Pet);
|
||||
}
|
||||
else if (botClass == MAGICIAN) {
|
||||
else if (botClass == Class::Magician) {
|
||||
botSpell = GetBestBotMagicianPetSpell(this);
|
||||
}
|
||||
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 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))) {
|
||||
return casted_spell;
|
||||
}
|
||||
|
||||
if (botClass == CLERIC || botClass == ENCHANTER)
|
||||
if (botClass == Class::Cleric || botClass == Class::Enchanter)
|
||||
{
|
||||
float manaRatioToCast = 75.0f;
|
||||
|
||||
@ -770,17 +770,17 @@ bool Bot::BotCastNuke(Mob* tar, uint8 botLevel, uint8 botClass, BotSpell& botSpe
|
||||
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)
|
||||
botSpell = GetBestBotSpellForNukeByTargetType(this, ST_Undead);
|
||||
else if (tar->GetBodyType() == BT_Summoned || tar->GetBodyType() == BT_Summoned2 || tar->GetBodyType() == BT_Summoned3)
|
||||
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);
|
||||
|
||||
if (botClass == PALADIN) {
|
||||
if (botClass == Class::Paladin) {
|
||||
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);
|
||||
}
|
||||
|
||||
@ -819,7 +819,7 @@ bool Bot::BotCastEscape(Mob*& tar, uint8 botClass, BotSpell& botSpell, uint32 iS
|
||||
auto hpr = (uint8) GetHPRatio();
|
||||
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();
|
||||
}
|
||||
|
||||
@ -835,7 +835,7 @@ bool Bot::BotCastEscape(Mob*& tar, uint8 botClass, BotSpell& botSpell, uint32 iS
|
||||
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);
|
||||
}
|
||||
}
|
||||
@ -877,7 +877,7 @@ bool Bot::BotCastBuff(Mob* tar, uint8 botLevel, uint8 botClass) {
|
||||
(tar == this && spells[s.SpellId].target_type != ST_TargetsTarget) ||
|
||||
spells[s.SpellId].target_type == ST_Group ||
|
||||
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->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_MovementSpeed) && !zone->CanCastOutdoor())
|
||||
) &&
|
||||
(botClass != BARD || !IsSpellUsableInThisZoneType(s.SpellId, zone->GetZoneType()))
|
||||
(botClass != Class::Bard || !IsSpellUsableInThisZoneType(s.SpellId, zone->GetZoneType()))
|
||||
) {
|
||||
continue;
|
||||
}
|
||||
@ -919,7 +919,7 @@ bool Bot::BotCastBuff(Mob* tar, uint8 botLevel, uint8 botClass) {
|
||||
break;
|
||||
}
|
||||
|
||||
if (botClass == ENCHANTER && IsEffectInSpell(s.SpellId, SE_Rune))
|
||||
if (botClass == Class::Enchanter && IsEffectInSpell(s.SpellId, SE_Rune))
|
||||
{
|
||||
float manaRatioToCast = 75.0f;
|
||||
|
||||
@ -1003,17 +1003,17 @@ bool Bot::BotCastHeal(Mob* tar, uint8 botLevel, uint8 botClass, BotSpell& botSpe
|
||||
isPrimaryHealer = IsGroupHealer();
|
||||
}
|
||||
|
||||
if (hpr < 95 || tar->IsClient() || botClass == BARD) {
|
||||
if (tar->GetClass() == NECROMANCER && hpr >= 40) {
|
||||
if (hpr < 95 || tar->IsClient() || botClass == Class::Bard) {
|
||||
if (tar->GetClass() == Class::Necromancer && hpr >= 40) {
|
||||
return false;
|
||||
}
|
||||
|
||||
if (tar->GetClass() == SHAMAN && hpr >= 80) {
|
||||
if (tar->GetClass() == Class::Shaman && hpr >= 80) {
|
||||
return false;
|
||||
}
|
||||
|
||||
// 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) {
|
||||
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) {
|
||||
botSpell = GetBestBotSpellForGroupCompleteHeal(this);
|
||||
|
||||
@ -1119,7 +1119,7 @@ bool Bot::BotCastHeal(Mob* tar, uint8 botLevel, uint8 botClass, BotSpell& botSpe
|
||||
if (!IsValidSpell(botSpell.SpellId)) {
|
||||
botSpell = GetFirstBotSpellForSingleTargetHeal(this);
|
||||
}
|
||||
if (botSpell.SpellId == 0 && botClass == BARD) {
|
||||
if (botSpell.SpellId == 0 && botClass == Class::Bard) {
|
||||
botSpell = GetFirstBotSpellBySpellType(this, SpellType_Heal);
|
||||
}
|
||||
|
||||
@ -1134,11 +1134,11 @@ bool Bot::BotCastHeal(Mob* tar, uint8 botLevel, uint8 botClass, BotSpell& botSpe
|
||||
|
||||
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);
|
||||
}
|
||||
|
||||
if (casted_spell && botClass != BARD) {
|
||||
if (casted_spell && botClass != Class::Bard) {
|
||||
if (IsGroupSpell(botSpell.SpellId)) {
|
||||
if (HasGroup()) {
|
||||
Group *group = GetGroup();
|
||||
@ -1362,9 +1362,9 @@ bool Bot::AI_IdleCastCheck() {
|
||||
//Ok, IdleCastCheck depends of class.
|
||||
switch (GetClass()) {
|
||||
// Healers WITHOUT pets will check if a heal is needed before buffing.
|
||||
case CLERIC:
|
||||
case PALADIN:
|
||||
case RANGER: {
|
||||
case Class::Cleric:
|
||||
case Class::Paladin:
|
||||
case Class::Ranger: {
|
||||
if (!entity_list.Bot_AICheckCloseBeneficialSpells(this, 100, BotAISpellRange, SpellType_Cure)) {
|
||||
if (!AICastSpell(this, 100, SpellType_Heal)) {
|
||||
if (!entity_list.Bot_AICheckCloseBeneficialSpells(this, 100, BotAISpellRange, SpellType_Heal)) {
|
||||
@ -1379,10 +1379,10 @@ bool Bot::AI_IdleCastCheck() {
|
||||
result = true;
|
||||
break;
|
||||
}
|
||||
case MONK:
|
||||
case ROGUE:
|
||||
case WARRIOR:
|
||||
case BERSERKER: {
|
||||
case Class::Monk:
|
||||
case Class::Rogue:
|
||||
case Class::Warrior:
|
||||
case Class::Berserker: {
|
||||
if (!AICastSpell(this, 100, SpellType_Cure)) {
|
||||
if (!AICastSpell(this, 100, SpellType_Heal)) {
|
||||
if (!AICastSpell(this, 100, SpellType_Buff)) {
|
||||
@ -1397,10 +1397,10 @@ bool Bot::AI_IdleCastCheck() {
|
||||
}
|
||||
// Pets class will first cast their pet, then buffs
|
||||
|
||||
case MAGICIAN:
|
||||
case SHADOWKNIGHT:
|
||||
case NECROMANCER:
|
||||
case ENCHANTER: {
|
||||
case Class::Magician:
|
||||
case Class::ShadowKnight:
|
||||
case Class::Necromancer:
|
||||
case Class::Enchanter: {
|
||||
if (!AICastSpell(this, 100, SpellType_Pet)) {
|
||||
if (!AICastSpell(this, 100, SpellType_Cure)) {
|
||||
if (!AICastSpell(GetPet(), 100, SpellType_Cure)) {
|
||||
@ -1417,9 +1417,9 @@ bool Bot::AI_IdleCastCheck() {
|
||||
result = true;
|
||||
break;
|
||||
}
|
||||
case DRUID:
|
||||
case SHAMAN:
|
||||
case BEASTLORD: {
|
||||
case Class::Druid:
|
||||
case Class::Shaman:
|
||||
case Class::Beastlord: {
|
||||
if (!entity_list.Bot_AICheckCloseBeneficialSpells(this, 100, BotAISpellRange, SpellType_Cure)) {
|
||||
if (!AICastSpell(this, 100, SpellType_Pet)) {
|
||||
if (!AICastSpell(this, 100, SpellType_Heal)) {
|
||||
@ -1438,7 +1438,7 @@ bool Bot::AI_IdleCastCheck() {
|
||||
result = true;
|
||||
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 (!AICastSpell(this, 100, SpellType_Pet)) {
|
||||
if (!AICastSpell(this, 100, SpellType_Cure)) {
|
||||
@ -1469,7 +1469,7 @@ bool Bot::AI_IdleCastCheck() {
|
||||
result = true;
|
||||
break;
|
||||
}
|
||||
case BARD: {
|
||||
case Class::Bard: {
|
||||
if (pre_combat) {
|
||||
if (!entity_list.Bot_AICheckCloseBeneficialSpells(this, 100, BotAISpellRange, SpellType_Cure)) {
|
||||
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");
|
||||
|
||||
if (botClass == CLERIC) {
|
||||
if (botClass == Class::Cleric) {
|
||||
if (!AICastSpell(GetTarget(), GetChanceToCastBySpellType(SpellType_Escape), SpellType_Escape)) {
|
||||
if (!AICastSpell(this, GetChanceToCastBySpellType(SpellType_Heal), 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(this, GetChanceToCastBySpellType(SpellType_Heal), 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_Slow), SpellType_Slow)) {
|
||||
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(this, GetChanceToCastBySpellType(SpellType_Heal), SpellType_Heal)) {
|
||||
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(this, GetChanceToCastBySpellType(SpellType_Heal), SpellType_Heal)) {
|
||||
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_Debuff), SpellType_Debuff)) {
|
||||
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 (!entity_list.Bot_AICheckCloseBeneficialSpells(this, GetChanceToCastBySpellType(SpellType_InCombatBuff), BotAISpellRange, SpellType_InCombatBuff)) {
|
||||
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 (!entity_list.Bot_AICheckCloseBeneficialSpells(this, GetChanceToCastBySpellType(SpellType_InCombatBuff), BotAISpellRange, SpellType_InCombatBuff)) {
|
||||
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(GetTarget(), GetChanceToCastBySpellType(SpellType_Debuff), SpellType_Debuff)) {
|
||||
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(this, GetChanceToCastBySpellType(SpellType_Pet), SpellType_Pet)) {
|
||||
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_Escape), SpellType_Escape)) {
|
||||
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 (!entity_list.Bot_AICheckCloseBeneficialSpells(this, GetChanceToCastBySpellType(SpellType_HateRedux), BotAISpellRange, SpellType_HateRedux)) {
|
||||
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(this, GetChanceToCastBySpellType(SpellType_Heal), SpellType_Heal)) {
|
||||
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(this, GetChanceToCastBySpellType(SpellType_Heal), SpellType_Heal)) {
|
||||
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(this, GetChanceToCastBySpellType(SpellType_Heal), SpellType_Heal)) {
|
||||
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 (!entity_list.Bot_AICheckCloseBeneficialSpells(this, GetChanceToCastBySpellType(SpellType_InCombatBuff), BotAISpellRange, SpellType_InCombatBuff)) {
|
||||
if (!AICastSpell(GetTarget(), GetChanceToCastBySpellType(SpellType_Debuff), SpellType_Debuff)) {
|
||||
@ -3000,7 +3000,7 @@ uint8 Bot::GetChanceToCastBySpellType(uint32 spellType)
|
||||
return 0;
|
||||
|
||||
uint8 class_index = GetClass();
|
||||
if (class_index > BERSERKER || class_index < WARRIOR)
|
||||
if (class_index > Class::Berserker || class_index < Class::Warrior)
|
||||
return 0;
|
||||
--class_index;
|
||||
|
||||
|
||||
@ -2676,7 +2676,7 @@ bool Client::HasSkill(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;
|
||||
|
||||
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 {
|
||||
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;
|
||||
|
||||
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_)
|
||||
{
|
||||
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;
|
||||
|
||||
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;
|
||||
|
||||
if (GetClass() == MONK && GetSkill(EQ::skills::SkillBindWound) > 200) {
|
||||
if (GetClass() == Class::Monk && GetSkill(EQ::skills::SkillBindWound) > 200) {
|
||||
max_percent = 70 + maxHPBonus;
|
||||
}
|
||||
|
||||
@ -3077,9 +3077,9 @@ bool Client::BindWound(Mob *bindmob, bool start, bool fail)
|
||||
else {
|
||||
int percent_base = 50;
|
||||
if (GetRawSkill(EQ::skills::SkillBindWound) > 200) {
|
||||
if ((GetClass() == MONK) || (GetClass() == BEASTLORD))
|
||||
if ((GetClass() == Class::Monk) || (GetClass() == Class::Beastlord))
|
||||
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;
|
||||
}
|
||||
|
||||
@ -4232,7 +4232,7 @@ void Client::UpdateLFP() {
|
||||
|
||||
for(unsigned int i=0; i<MAX_GROUP_MEMBERS; i++) {
|
||||
LFPMembers[i].Name[0] = '\0';
|
||||
LFPMembers[i].Class = NO_CLASS;
|
||||
LFPMembers[i].Class = Class::None;
|
||||
LFPMembers[i].Level = 0;
|
||||
LFPMembers[i].Zone = 0;
|
||||
}
|
||||
@ -4849,7 +4849,7 @@ void Client::HandleLDoNOpen(NPC *target)
|
||||
{
|
||||
if(target)
|
||||
{
|
||||
if(target->GetClass() != LDON_TREASURE)
|
||||
if(target->GetClass() != Class::LDoNTreasure)
|
||||
{
|
||||
LogDebug("[{}] tried to open [{}] but [{}] was not a treasure chest",
|
||||
GetName(), target->GetName(), target->GetName());
|
||||
@ -4918,7 +4918,7 @@ void Client::HandleLDoNOpen(NPC *target)
|
||||
|
||||
void Client::HandleLDoNSenseTraps(NPC *target, uint16 skill, uint8 type)
|
||||
{
|
||||
if(target && target->GetClass() == LDON_TREASURE)
|
||||
if(target && target->GetClass() == Class::LDoNTreasure)
|
||||
{
|
||||
if(target->IsLDoNTrapped())
|
||||
{
|
||||
@ -4961,7 +4961,7 @@ void Client::HandleLDoNDisarm(NPC *target, uint16 skill, uint8 type)
|
||||
{
|
||||
if(target)
|
||||
{
|
||||
if(target->GetClass() == LDON_TREASURE)
|
||||
if(target->GetClass() == Class::LDoNTreasure)
|
||||
{
|
||||
if(!target->IsLDoNTrapped())
|
||||
{
|
||||
@ -5011,7 +5011,7 @@ void Client::HandleLDoNPickLock(NPC *target, uint16 skill, uint8 type)
|
||||
{
|
||||
if(target)
|
||||
{
|
||||
if(target->GetClass() == LDON_TREASURE)
|
||||
if(target->GetClass() == Class::LDoNTreasure)
|
||||
{
|
||||
if(target->IsLDoNTrapped())
|
||||
{
|
||||
@ -8603,20 +8603,20 @@ void Client::InitInnates()
|
||||
}
|
||||
|
||||
switch (class_) {
|
||||
case DRUID:
|
||||
case Class::Druid:
|
||||
m_pp.InnateSkills[InnateHarmony] = InnateEnabled;
|
||||
break;
|
||||
case BARD:
|
||||
case Class::Bard:
|
||||
m_pp.InnateSkills[InnateReveal] = InnateEnabled;
|
||||
break;
|
||||
case ROGUE:
|
||||
case Class::Rogue:
|
||||
m_pp.InnateSkills[InnateSurprise] = InnateEnabled;
|
||||
m_pp.InnateSkills[InnateReveal] = InnateEnabled;
|
||||
break;
|
||||
case RANGER:
|
||||
case Class::Ranger:
|
||||
m_pp.InnateSkills[InnateAwareness] = InnateEnabled;
|
||||
break;
|
||||
case MONK:
|
||||
case Class::Monk:
|
||||
m_pp.InnateSkills[InnateSurprise] = InnateEnabled;
|
||||
m_pp.InnateSkills[InnateAwareness] = InnateEnabled;
|
||||
default:
|
||||
@ -9754,7 +9754,7 @@ std::vector<int> Client::GetLearnableDisciplines(uint8 min_level, uint8 max_leve
|
||||
continue;
|
||||
}
|
||||
|
||||
if (spells[spell_id].classes[WARRIOR] == 0) {
|
||||
if (spells[spell_id].classes[Class::Warrior] == 0) {
|
||||
continue;
|
||||
}
|
||||
|
||||
@ -9825,7 +9825,7 @@ std::vector<int> Client::GetScribeableSpells(uint8 min_level, uint8 max_level) {
|
||||
continue;
|
||||
}
|
||||
|
||||
if (spells[spell_id].classes[WARRIOR] == 0) {
|
||||
if (spells[spell_id].classes[Class::Warrior] == 0) {
|
||||
continue;
|
||||
}
|
||||
|
||||
@ -10694,37 +10694,37 @@ uint16 Client::LearnDisciplines(uint8 min_level, uint8 max_level)
|
||||
|
||||
uint16 Client::GetClassTrackingDistanceMultiplier(uint16 class_) {
|
||||
switch (class_) {
|
||||
case WARRIOR:
|
||||
case Class::Warrior:
|
||||
return RuleI(Character, WarriorTrackingDistanceMultiplier);
|
||||
case CLERIC:
|
||||
case Class::Cleric:
|
||||
return RuleI(Character, ClericTrackingDistanceMultiplier);
|
||||
case PALADIN:
|
||||
case Class::Paladin:
|
||||
return RuleI(Character, PaladinTrackingDistanceMultiplier);
|
||||
case RANGER:
|
||||
case Class::Ranger:
|
||||
return RuleI(Character, RangerTrackingDistanceMultiplier);
|
||||
case SHADOWKNIGHT:
|
||||
case Class::ShadowKnight:
|
||||
return RuleI(Character, ShadowKnightTrackingDistanceMultiplier);
|
||||
case DRUID:
|
||||
case Class::Druid:
|
||||
return RuleI(Character, DruidTrackingDistanceMultiplier);
|
||||
case MONK:
|
||||
case Class::Monk:
|
||||
return RuleI(Character, MonkTrackingDistanceMultiplier);
|
||||
case BARD:
|
||||
case Class::Bard:
|
||||
return RuleI(Character, BardTrackingDistanceMultiplier);
|
||||
case ROGUE:
|
||||
case Class::Rogue:
|
||||
return RuleI(Character, RogueTrackingDistanceMultiplier);
|
||||
case SHAMAN:
|
||||
case Class::Shaman:
|
||||
return RuleI(Character, ShamanTrackingDistanceMultiplier);
|
||||
case NECROMANCER:
|
||||
case Class::Necromancer:
|
||||
return RuleI(Character, NecromancerTrackingDistanceMultiplier);
|
||||
case WIZARD:
|
||||
case Class::Wizard:
|
||||
return RuleI(Character, WizardTrackingDistanceMultiplier);
|
||||
case MAGICIAN:
|
||||
case Class::Magician:
|
||||
return RuleI(Character, MagicianTrackingDistanceMultiplier);
|
||||
case ENCHANTER:
|
||||
case Class::Enchanter:
|
||||
return RuleI(Character, EnchanterTrackingDistanceMultiplier);
|
||||
case BEASTLORD:
|
||||
case Class::Beastlord:
|
||||
return RuleI(Character, BeastlordTrackingDistanceMultiplier);
|
||||
case BERSERKER:
|
||||
case Class::Berserker:
|
||||
return RuleI(Character, BerserkerTrackingDistanceMultiplier);
|
||||
default:
|
||||
return 0;
|
||||
|
||||
@ -2045,14 +2045,14 @@ public:
|
||||
bool GetBotPrecombat() { return m_bot_precombat; }
|
||||
void SetBotPrecombat(bool flag = true) { m_bot_precombat = flag; }
|
||||
|
||||
int GetBotRequiredLevel(uint8 class_id = NO_CLASS);
|
||||
uint32 GetBotCreationLimit(uint8 class_id = NO_CLASS);
|
||||
int GetBotSpawnLimit(uint8 class_id = NO_CLASS);
|
||||
void SetBotCreationLimit(uint32 new_creation_limit, uint8 class_id = NO_CLASS);
|
||||
void SetBotRequiredLevel(int new_required_level, uint8 class_id = NO_CLASS);
|
||||
void SetBotSpawnLimit(int new_spawn_limit, uint8 class_id = NO_CLASS);
|
||||
int GetBotRequiredLevel(uint8 class_id = Class::None);
|
||||
uint32 GetBotCreationLimit(uint8 class_id = Class::None);
|
||||
int GetBotSpawnLimit(uint8 class_id = Class::None);
|
||||
void SetBotCreationLimit(uint32 new_creation_limit, uint8 class_id = Class::None);
|
||||
void SetBotRequiredLevel(int new_required_level, uint8 class_id = Class::None);
|
||||
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);
|
||||
|
||||
private:
|
||||
|
||||
@ -345,7 +345,7 @@ uint32 Mob::GetClassLevelFactor()
|
||||
uint32 multiplier = 0;
|
||||
uint8 mlevel = GetLevel();
|
||||
switch (GetClass()) {
|
||||
case WARRIOR: {
|
||||
case Class::Warrior: {
|
||||
if (mlevel < 20) {
|
||||
multiplier = 220;
|
||||
}
|
||||
@ -372,9 +372,9 @@ uint32 Mob::GetClassLevelFactor()
|
||||
}
|
||||
break;
|
||||
}
|
||||
case DRUID:
|
||||
case CLERIC:
|
||||
case SHAMAN: {
|
||||
case Class::Druid:
|
||||
case Class::Cleric:
|
||||
case Class::Shaman: {
|
||||
if (mlevel < 70) {
|
||||
multiplier = 150;
|
||||
}
|
||||
@ -383,9 +383,9 @@ uint32 Mob::GetClassLevelFactor()
|
||||
}
|
||||
break;
|
||||
}
|
||||
case BERSERKER:
|
||||
case PALADIN:
|
||||
case SHADOWKNIGHT: {
|
||||
case Class::Berserker:
|
||||
case Class::Paladin:
|
||||
case Class::ShadowKnight: {
|
||||
if (mlevel < 35) {
|
||||
multiplier = 210;
|
||||
}
|
||||
@ -409,10 +409,10 @@ uint32 Mob::GetClassLevelFactor()
|
||||
}
|
||||
break;
|
||||
}
|
||||
case MONK:
|
||||
case BARD:
|
||||
case ROGUE:
|
||||
case BEASTLORD: {
|
||||
case Class::Monk:
|
||||
case Class::Bard:
|
||||
case Class::Rogue:
|
||||
case Class::Beastlord: {
|
||||
if (mlevel < 51) {
|
||||
multiplier = 180;
|
||||
}
|
||||
@ -427,7 +427,7 @@ uint32 Mob::GetClassLevelFactor()
|
||||
}
|
||||
break;
|
||||
}
|
||||
case RANGER: {
|
||||
case Class::Ranger: {
|
||||
if (mlevel < 58) {
|
||||
multiplier = 200;
|
||||
}
|
||||
@ -439,10 +439,10 @@ uint32 Mob::GetClassLevelFactor()
|
||||
}
|
||||
break;
|
||||
}
|
||||
case MAGICIAN:
|
||||
case WIZARD:
|
||||
case NECROMANCER:
|
||||
case ENCHANTER: {
|
||||
case Class::Magician:
|
||||
case Class::Wizard:
|
||||
case Class::Necromancer:
|
||||
case Class::Enchanter: {
|
||||
if (mlevel < 70) {
|
||||
multiplier = 120;
|
||||
}
|
||||
@ -677,7 +677,7 @@ int64 Client::CalcManaRegen(bool bCombat)
|
||||
if (IsSitting() || CanMedOnHorse()) {
|
||||
// kind of weird to do it here w/e
|
||||
// client does some base medding regen for shrouds here
|
||||
if (GetClass() != BARD) {
|
||||
if (GetClass() != Class::Bard) {
|
||||
auto skill = GetSkill(EQ::skills::SkillMeditate);
|
||||
if (skill > 0) {
|
||||
regen++;
|
||||
@ -1077,7 +1077,7 @@ int32 Client::CalcMR()
|
||||
MR = 20;
|
||||
}
|
||||
MR += itembonuses.MR + spellbonuses.MR + aabonuses.MR;
|
||||
if (GetClass() == WARRIOR || GetClass() == BERSERKER) {
|
||||
if (GetClass() == Class::Warrior || GetClass() == Class::Berserker) {
|
||||
MR += GetLevel() / 2;
|
||||
}
|
||||
if (MR < 1) {
|
||||
@ -1151,14 +1151,14 @@ int32 Client::CalcFR()
|
||||
FR = 20;
|
||||
}
|
||||
int c = GetClass();
|
||||
if (c == RANGER) {
|
||||
if (c == Class::Ranger) {
|
||||
FR += 4;
|
||||
int l = GetLevel();
|
||||
if (l > 49) {
|
||||
FR += l - 49;
|
||||
}
|
||||
}
|
||||
if (c == MONK) {
|
||||
if (c == Class::Monk) {
|
||||
FR += 8;
|
||||
int l = GetLevel();
|
||||
if (l > 49) {
|
||||
@ -1238,19 +1238,19 @@ int32 Client::CalcDR()
|
||||
}
|
||||
int c = GetClass();
|
||||
// the monk one is part of base resist
|
||||
if (c == MONK) {
|
||||
if (c == Class::Monk) {
|
||||
int l = GetLevel();
|
||||
if (l > 50)
|
||||
DR += l - 50;
|
||||
}
|
||||
if (c == PALADIN) {
|
||||
if (c == Class::Paladin) {
|
||||
DR += 8;
|
||||
int l = GetLevel();
|
||||
if (l > 49) {
|
||||
DR += l - 49;
|
||||
}
|
||||
}
|
||||
else if (c == SHADOWKNIGHT || c == BEASTLORD) {
|
||||
else if (c == Class::ShadowKnight || c == Class::Beastlord) {
|
||||
DR += 4;
|
||||
int l = GetLevel();
|
||||
if (l > 49) {
|
||||
@ -1330,19 +1330,19 @@ int32 Client::CalcPR()
|
||||
}
|
||||
int c = GetClass();
|
||||
// this monk bonus is part of the base
|
||||
if (c == MONK) {
|
||||
if (c == Class::Monk) {
|
||||
int l = GetLevel();
|
||||
if (l > 50)
|
||||
PR += l - 50;
|
||||
}
|
||||
if (c == ROGUE) {
|
||||
if (c == Class::Rogue) {
|
||||
PR += 8;
|
||||
int l = GetLevel();
|
||||
if (l > 49) {
|
||||
PR += l - 49;
|
||||
}
|
||||
}
|
||||
else if (c == SHADOWKNIGHT) {
|
||||
else if (c == Class::ShadowKnight) {
|
||||
PR += 4;
|
||||
int l = GetLevel();
|
||||
if (l > 49) {
|
||||
@ -1421,7 +1421,7 @@ int32 Client::CalcCR()
|
||||
CR = 25;
|
||||
}
|
||||
int c = GetClass();
|
||||
if (c == RANGER || c == BEASTLORD) {
|
||||
if (c == Class::Ranger || c == Class::Beastlord) {
|
||||
CR += 4;
|
||||
int l = GetLevel();
|
||||
if (l > 49) {
|
||||
@ -1455,7 +1455,7 @@ int32 Client::CalcATK()
|
||||
|
||||
uint32 Mob::GetInstrumentMod(uint16 spell_id)
|
||||
{
|
||||
if (GetClass() != BARD) {
|
||||
if (GetClass() != Class::Bard) {
|
||||
//Other classes can get a base effects mod using SPA 413
|
||||
if (HasBaseEffectFocus()) {
|
||||
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();
|
||||
auto level = GetLevel();
|
||||
if (GetClass() == MONK) {
|
||||
if (GetClass() == Class::Monk) {
|
||||
if (level > 99)
|
||||
weight_limit = 58;
|
||||
else if (level > 94)
|
||||
|
||||
@ -1381,7 +1381,7 @@ void Client::Handle_Connect_OP_ZoneEntry(const EQApplicationPacket *app)
|
||||
SetClientMaxLevel(client_max_level);
|
||||
|
||||
// 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);
|
||||
|
||||
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;
|
||||
|
||||
/* 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;
|
||||
if (m_pp.class_ == SHADOWKNIGHT) { abilitynum = pTimerHarmTouch; }
|
||||
if (m_pp.class_ == Class::ShadowKnight) { abilitynum = pTimerHarmTouch; }
|
||||
else { abilitynum = pTimerLayHands; }
|
||||
|
||||
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;
|
||||
uint32 merchantid = 0;
|
||||
Mob* tmp = entity_list.GetMob(aps->npcid);
|
||||
if (tmp == 0 || !tmp->IsNPC() || ((tmp->GetClass() != ADVENTURE_MERCHANT) &&
|
||||
(tmp->GetClass() != DISCORD_MERCHANT) && (tmp->GetClass() != NORRATHS_KEEPERS_MERCHANT) && (tmp->GetClass() != DARK_REIGN_MERCHANT)))
|
||||
if (tmp == 0 || !tmp->IsNPC() || ((tmp->GetClass() != Class::AdventureMerchant) &&
|
||||
(tmp->GetClass() != Class::DiscordMerchant) && (tmp->GetClass() != Class::NorrathsKeepersMerchant) && (tmp->GetClass() != Class::DarkReignMerchant)))
|
||||
return;
|
||||
|
||||
//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;
|
||||
|
||||
Mob* tmp = entity_list.GetMob(eid->entity_id);
|
||||
if (tmp == 0 || !tmp->IsNPC() || ((tmp->GetClass() != ADVENTURE_MERCHANT) &&
|
||||
(tmp->GetClass() != DISCORD_MERCHANT) && (tmp->GetClass() != NORRATHS_KEEPERS_MERCHANT) && (tmp->GetClass() != DARK_REIGN_MERCHANT)))
|
||||
if (tmp == 0 || !tmp->IsNPC() || ((tmp->GetClass() != Class::AdventureMerchant) &&
|
||||
(tmp->GetClass() != Class::DiscordMerchant) && (tmp->GetClass() != Class::NorrathsKeepersMerchant) && (tmp->GetClass() != Class::DarkReignMerchant)))
|
||||
return;
|
||||
|
||||
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;
|
||||
|
||||
Mob* vendor = entity_list.GetMob(ams_in->npcid);
|
||||
if (vendor == 0 || !vendor->IsNPC() || ((vendor->GetClass() != ADVENTURE_MERCHANT) &&
|
||||
(vendor->GetClass() != NORRATHS_KEEPERS_MERCHANT) && (vendor->GetClass() != DARK_REIGN_MERCHANT)))
|
||||
if (vendor == 0 || !vendor->IsNPC() || ((vendor->GetClass() != Class::AdventureMerchant) &&
|
||||
(vendor->GetClass() != Class::NorrathsKeepersMerchant) && (vendor->GetClass() != Class::DarkReignMerchant)))
|
||||
{
|
||||
Message(Chat::Red, "Vendor was not found.");
|
||||
return;
|
||||
@ -2298,17 +2298,17 @@ void Client::Handle_OP_AdventureMerchantSell(const EQApplicationPacket *app)
|
||||
|
||||
switch (vendor->GetClass())
|
||||
{
|
||||
case ADVENTURE_MERCHANT:
|
||||
case Class::AdventureMerchant:
|
||||
{
|
||||
UpdateLDoNPoints(6, price);
|
||||
break;
|
||||
}
|
||||
case NORRATHS_KEEPERS_MERCHANT:
|
||||
case Class::NorrathsKeepersMerchant:
|
||||
{
|
||||
SetRadiantCrystals(GetRadiantCrystals() + price);
|
||||
break;
|
||||
}
|
||||
case DARK_REIGN_MERCHANT:
|
||||
case Class::DarkReignMerchant:
|
||||
{
|
||||
SetEbonCrystals(GetEbonCrystals() + price);
|
||||
break;
|
||||
@ -2482,7 +2482,7 @@ void Client::Handle_OP_AltCurrencyMerchantRequest(const EQApplicationPacket *app
|
||||
return;
|
||||
}
|
||||
|
||||
if (target->GetClass() != ALT_CURRENCY_MERCHANT) {
|
||||
if (target->GetClass() != Class::AlternateCurrencyMerchant) {
|
||||
return;
|
||||
}
|
||||
|
||||
@ -2553,7 +2553,7 @@ void Client::Handle_OP_AltCurrencyPurchase(const EQApplicationPacket *app)
|
||||
if (DistanceSquared(m_Position, tar->GetPosition())> USE_NPC_RANGE2)
|
||||
return;
|
||||
|
||||
if (tar->GetClass() != ALT_CURRENCY_MERCHANT) {
|
||||
if (tar->GetClass() != Class::AlternateCurrencyMerchant) {
|
||||
return;
|
||||
}
|
||||
|
||||
@ -2722,7 +2722,7 @@ void Client::Handle_OP_AltCurrencySell(const EQApplicationPacket *app)
|
||||
if (DistanceSquared(m_Position, tar->GetPosition()) > USE_NPC_RANGE2)
|
||||
return;
|
||||
|
||||
if (tar->GetClass() != ALT_CURRENCY_MERCHANT) {
|
||||
if (tar->GetClass() != Class::AlternateCurrencyMerchant) {
|
||||
return;
|
||||
}
|
||||
|
||||
@ -2858,7 +2858,7 @@ void Client::Handle_OP_AltCurrencySellSelection(const EQApplicationPacket *app)
|
||||
if (DistanceSquared(m_Position, tar->GetPosition()) > USE_NPC_RANGE2)
|
||||
return;
|
||||
|
||||
if (tar->GetClass() != ALT_CURRENCY_MERCHANT) {
|
||||
if (tar->GetClass() != Class::AlternateCurrencyMerchant) {
|
||||
return;
|
||||
}
|
||||
|
||||
@ -2966,7 +2966,7 @@ void Client::Handle_OP_ApplyPoison(const EQApplicationPacket *app)
|
||||
|
||||
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
|
||||
CheckIncreaseSkill(EQ::skills::SkillApplyPoison, nullptr, 10);
|
||||
@ -3926,7 +3926,7 @@ void Client::Handle_OP_Begging(const EQApplicationPacket *app)
|
||||
if (!HasSkill(EQ::skills::SkillBegging) || !GetTarget())
|
||||
return;
|
||||
|
||||
if (GetTarget()->GetClass() == LDON_TREASURE)
|
||||
if (GetTarget()->GetClass() == Class::LDoNTreasure)
|
||||
return;
|
||||
|
||||
p_timers.Start(pTimerBeggingPickPocket, 8);
|
||||
@ -4471,7 +4471,7 @@ void Client::Handle_OP_CastSpell(const EQApplicationPacket *app)
|
||||
else if (slot == CastingSlot::Ability) {
|
||||
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)) {
|
||||
Message(Chat::Red, "Ability recovery time not yet met.");
|
||||
InterruptSpell(castspell->spell_id);
|
||||
@ -4481,7 +4481,7 @@ void Client::Handle_OP_CastSpell(const EQApplicationPacket *app)
|
||||
p_timers.Start(pTimerLayHands, LayOnHandsReuseTime);
|
||||
}
|
||||
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)) {
|
||||
Message(Chat::Red, "Ability recovery time not yet met.");
|
||||
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());
|
||||
return;
|
||||
}
|
||||
@ -8626,7 +8626,7 @@ void Client::Handle_OP_Hide(const EQApplicationPacket *app)
|
||||
hidden = true;
|
||||
tmHidden = Timer::GetCurrentTime();
|
||||
}
|
||||
if (GetClass() == ROGUE) {
|
||||
if (GetClass() == Class::Rogue) {
|
||||
auto outapp = new EQApplicationPacket(OP_SimpleMessage, sizeof(SimpleMessage_Struct));
|
||||
SimpleMessage_Struct *msg = (SimpleMessage_Struct *)outapp->pBuffer;
|
||||
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.
|
||||
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;
|
||||
}
|
||||
@ -9341,7 +9341,7 @@ void Client::Handle_OP_ItemVerifyRequest(const EQApplicationPacket *app)
|
||||
if (!IsCastWhileInvisibleSpell(item->Click.Effect)) {
|
||||
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);
|
||||
}
|
||||
else {
|
||||
@ -9413,7 +9413,7 @@ void Client::Handle_OP_ItemVerifyRequest(const EQApplicationPacket *app)
|
||||
if (!IsCastWhileInvisibleSpell(augitem->Click.Effect)) {
|
||||
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);
|
||||
}
|
||||
else {
|
||||
@ -9549,7 +9549,7 @@ void Client::Handle_OP_LDoNDisarmTraps(const EQApplicationPacket *app)
|
||||
void Client::Handle_OP_LDoNInspect(const EQApplicationPacket *app)
|
||||
{
|
||||
auto* t = GetTarget();
|
||||
if (t && t->GetClass() == LDON_TREASURE && !t->IsAura()) {
|
||||
if (t && t->GetClass() == Class::LDoNTreasure && !t->IsAura()) {
|
||||
if (parse->PlayerHasQuestSub(EVENT_INSPECT)) {
|
||||
std::vector<std::any> args = { t };
|
||||
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++) {
|
||||
LFPMembers[i].Name[0] = '\0';
|
||||
LFPMembers[i].Class = NO_CLASS;
|
||||
LFPMembers[i].Class = Class::None;
|
||||
LFPMembers[i].Level = 0;
|
||||
LFPMembers[i].Zone = 0;
|
||||
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)
|
||||
return;
|
||||
|
||||
if (tar->GetClass() != MERCENARY_MASTER) {
|
||||
if (tar->GetClass() != Class::MercenaryLiaison) {
|
||||
return;
|
||||
}
|
||||
|
||||
@ -10594,7 +10594,7 @@ void Client::Handle_OP_OpenGuildTributeMaster(const EQApplicationPacket *app)
|
||||
//Opens the guild tribute master window
|
||||
StartTribute_Struct* st = (StartTribute_Struct*)app->pBuffer;
|
||||
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) {
|
||||
st->response = 1;
|
||||
QueuePacket(app);
|
||||
@ -10625,7 +10625,7 @@ void Client::Handle_OP_OpenTributeMaster(const EQApplicationPacket *app)
|
||||
//Opens the tribute master window
|
||||
StartTribute_Struct* st = (StartTribute_Struct*)app->pBuffer;
|
||||
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) {
|
||||
st->response = 1;
|
||||
QueuePacket(app);
|
||||
@ -13531,7 +13531,7 @@ void Client::Handle_OP_Shielding(const EQApplicationPacket *app)
|
||||
return;
|
||||
}
|
||||
|
||||
if (GetClass() != WARRIOR){
|
||||
if (GetClass() != Class::Warrior){
|
||||
return;
|
||||
}
|
||||
|
||||
@ -13587,7 +13587,7 @@ void Client::Handle_OP_ShopPlayerBuy(const EQApplicationPacket *app)
|
||||
bool tmpmer_used = false;
|
||||
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;
|
||||
|
||||
if (mp->quantity < 1) return;
|
||||
@ -13896,7 +13896,7 @@ void Client::Handle_OP_ShopPlayerSell(const EQApplicationPacket *app)
|
||||
|
||||
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;
|
||||
|
||||
//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;
|
||||
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;
|
||||
|
||||
//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;
|
||||
QueuePacket(outapp);
|
||||
safe_delete(outapp);
|
||||
if (GetClass() == ROGUE) {
|
||||
if (GetClass() == Class::Rogue) {
|
||||
outapp = new EQApplicationPacket(OP_SimpleMessage, 12);
|
||||
SimpleMessage_Struct *msg = (SimpleMessage_Struct *)outapp->pBuffer;
|
||||
msg->color = 0x010E;
|
||||
@ -15545,7 +15545,7 @@ void Client::Handle_OP_TributeItem(const EQApplicationPacket *app)
|
||||
tribute_master_id = t->tribute_master_id;
|
||||
//make sure they are dealing with a valid tribute master
|
||||
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;
|
||||
if (DistanceSquared(m_Position, tribmast->GetPosition()) > USE_NPC_RANGE2)
|
||||
return;
|
||||
@ -15572,7 +15572,7 @@ void Client::Handle_OP_TributeMoney(const EQApplicationPacket *app)
|
||||
tribute_master_id = t->tribute_master_id;
|
||||
//make sure they are dealing with a valid tribute master
|
||||
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;
|
||||
if (DistanceSquared(m_Position, tribmast->GetPosition()) > USE_NPC_RANGE2)
|
||||
return;
|
||||
|
||||
@ -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)) {
|
||||
entity_list.MessageCloseString(this, false, 200, 0, BERSERK_START, GetName());
|
||||
berserk = true;
|
||||
@ -1121,7 +1121,7 @@ void Client::OPMemorizeSpell(const EQApplicationPacket* app)
|
||||
if (
|
||||
m->scribing != memSpellForget &&
|
||||
(
|
||||
!EQ::ValueWithin(GetClass(), PLAYER_CLASS_WARRIOR, PLAYER_CLASS_BERSERKER) ||
|
||||
!IsPlayerClass(GetClass()) ||
|
||||
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);
|
||||
|
||||
if(!pTrainer || !pTrainer->IsNPC() || pTrainer->GetClass() < WARRIORGM || pTrainer->GetClass() > BERSERKERGM)
|
||||
if(!pTrainer || !pTrainer->IsNPC() || pTrainer->GetClass() < Class::WarriorGM || pTrainer->GetClass() > Class::BerserkerGM)
|
||||
return;
|
||||
|
||||
//you can only use your own trainer, client enforces this, but why trust it
|
||||
if (!RuleB(Character, AllowCrossClassTrainers)) {
|
||||
int trains_class = pTrainer->GetClass() - (WARRIORGM - WARRIOR);
|
||||
int trains_class = pTrainer->GetClass() - (Class::WarriorGM - Class::Warrior);
|
||||
if (GetClass() != trains_class)
|
||||
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::Skill2HPiercing] = 0;
|
||||
}
|
||||
@ -1607,12 +1607,12 @@ void Client::OPGMEndTraining(const EQApplicationPacket *app)
|
||||
FastQueuePacket(&outapp);
|
||||
|
||||
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;
|
||||
|
||||
//you can only use your own trainer, client enforces this, but why trust it
|
||||
if (!RuleB(Character, AllowCrossClassTrainers)) {
|
||||
int trains_class = pTrainer->GetClass() - (WARRIORGM - WARRIOR);
|
||||
int trains_class = pTrainer->GetClass() - (Class::WarriorGM - Class::Warrior);
|
||||
if (GetClass() != trains_class)
|
||||
return;
|
||||
}
|
||||
@ -1638,12 +1638,12 @@ void Client::OPGMTrainSkill(const EQApplicationPacket *app)
|
||||
GMSkillChange_Struct* gmskill = (GMSkillChange_Struct*) app->pBuffer;
|
||||
|
||||
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;
|
||||
|
||||
//you can only use your own trainer, client enforces this, but why trust it
|
||||
if (!RuleB(Character, AllowCrossClassTrainers)) {
|
||||
int trains_class = pTrainer->GetClass() - (WARRIORGM - WARRIOR);
|
||||
int trains_class = pTrainer->GetClass() - (Class::WarriorGM - Class::Warrior);
|
||||
if (GetClass() != trains_class)
|
||||
return;
|
||||
}
|
||||
|
||||
@ -75,7 +75,7 @@ int64 Mob::GetActSpellDamage(uint16 spell_id, int64 value, Mob* target) {
|
||||
chance += itembonuses.FrenziedDevastation + spellbonuses.FrenziedDevastation + aabonuses.FrenziedDevastation;
|
||||
|
||||
//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.
|
||||
|
||||
@ -92,7 +92,7 @@ int64 Mob::GetActSpellDamage(uint16 spell_id, int64 value, Mob* target) {
|
||||
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))){
|
||||
//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));
|
||||
@ -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
|
||||
}
|
||||
|
||||
@ -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*GetFocusEffect(focusImprovedHeal, spell_id, nullptr, from_buff_tic) / 100);
|
||||
@ -632,7 +632,7 @@ bool Client::TrainDiscipline(uint32 itemid) {
|
||||
}
|
||||
|
||||
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.");
|
||||
//summon them the item back...
|
||||
SummonItem(itemid);
|
||||
@ -906,7 +906,7 @@ bool Client::UseDiscipline(uint32 spell_id, uint32 target) {
|
||||
if (reduced_recast > 0) {
|
||||
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)) {
|
||||
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 (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)) {
|
||||
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++) {
|
||||
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);
|
||||
} else {
|
||||
attacker->CastToClient()->DoAttackRounds(current_mob, Hand, is_from_spell);
|
||||
|
||||
@ -4918,7 +4918,7 @@ void EntityList::ZoneWho(Client *c, Who_All_Struct *Who)
|
||||
FormatMSGID = 5024; // 5024 %T1[ANONYMOUS] %2 %3
|
||||
else if (ClientEntry->GetAnon() == 2)
|
||||
FormatMSGID = 5023; // 5023 %T1[ANONYMOUS] %2 %3 %4
|
||||
uint32 PlayerClass = NO_CLASS;
|
||||
uint32 PlayerClass = Class::None;
|
||||
uint32 PlayerLevel = 0;
|
||||
uint32 PlayerRace = RACE_DOUG_0;
|
||||
uint32 ZoneMSGID = 0xFFFFFFFF;
|
||||
@ -4995,7 +4995,7 @@ uint32 EntityList::CheckNPCsClose(Mob *center)
|
||||
auto it = npc_list.begin();
|
||||
while (it != npc_list.end()) {
|
||||
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) {
|
||||
++it;
|
||||
continue;
|
||||
@ -5355,7 +5355,7 @@ void EntityList::AddLootToNPCS(uint32 item_id, uint32 count)
|
||||
auto it = npc_list.begin();
|
||||
while (it != npc_list.end()) {
|
||||
if (!it->second->IsPet()
|
||||
&& it->second->GetClass() != LDON_TREASURE
|
||||
&& it->second->GetClass() != Class::LDoNTreasure
|
||||
&& it->second->GetBodyType() != BT_NoTarget
|
||||
&& it->second->GetBodyType() != BT_NoTarget2
|
||||
&& it->second->GetBodyType() != BT_Special)
|
||||
@ -5376,7 +5376,7 @@ void EntityList::AddLootToNPCS(uint32 item_id, uint32 count)
|
||||
it = npc_list.begin();
|
||||
while (it != npc_list.end()) {
|
||||
if (!it->second->IsPet()
|
||||
&& it->second->GetClass() != LDON_TREASURE
|
||||
&& it->second->GetClass() != Class::LDoNTreasure
|
||||
&& it->second->GetBodyType() != BT_NoTarget
|
||||
&& it->second->GetBodyType() != BT_NoTarget2
|
||||
&& it->second->GetBodyType() != BT_Special)
|
||||
@ -5429,7 +5429,7 @@ NPC *EntityList::GetClosestBanker(Mob *sender, uint32 &distance)
|
||||
|
||||
auto it = npc_list.begin();
|
||||
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())) +
|
||||
((it->second->GetX() - sender->GetX()) * (it->second->GetX() - sender->GetX()));
|
||||
if (nd < distance){
|
||||
|
||||
@ -529,8 +529,8 @@ public:
|
||||
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::list<Bot *> &GetBotList() { return bot_list; }
|
||||
std::vector<Bot *> GetBotListByCharacterID(uint32 character_id, uint8 class_id = NO_CLASS);
|
||||
std::vector<Bot *> GetBotListByClientName(std::string client_name, 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 = Class::None);
|
||||
void SignalAllBotsByOwnerCharacterID(uint32 character_id, int signal_id);
|
||||
void SignalAllBotsByOwnerName(std::string owner_name, int signal_id);
|
||||
void SignalBotByBotID(uint32 bot_id, int signal_id);
|
||||
|
||||
18
zone/exp.cpp
18
zone/exp.cpp
@ -128,8 +128,8 @@ uint64 Client::CalcEXP(uint8 consider_level, bool ignore_modifiers) {
|
||||
|
||||
if (RuleB(Character, UseRaceClassExpBonuses)) {
|
||||
if (
|
||||
GetClass() == WARRIOR ||
|
||||
GetClass() == ROGUE ||
|
||||
GetClass() == Class::Warrior ||
|
||||
GetClass() == Class::Rogue ||
|
||||
GetBaseRace() == HALFLING
|
||||
) {
|
||||
total_modifier *= 1.05;
|
||||
@ -295,7 +295,7 @@ void Client::CalculateStandardAAExp(uint64 &add_aaxp, uint8 conlevel, bool resex
|
||||
aatotalmod *= 1.05;
|
||||
}
|
||||
|
||||
if (GetClass() == ROGUE || GetClass() == WARRIOR) {
|
||||
if (GetClass() == Class::Rogue || GetClass() == Class::Warrior) {
|
||||
aatotalmod *= 1.05;
|
||||
}
|
||||
}
|
||||
@ -443,7 +443,7 @@ void Client::CalculateExp(uint64 in_add_exp, uint64 &add_exp, uint64 &add_aaxp,
|
||||
totalmod *= 1.05;
|
||||
}
|
||||
|
||||
if (GetClass() == ROGUE || GetClass() == WARRIOR) {
|
||||
if (GetClass() == Class::Rogue || GetClass() == Class::Warrior) {
|
||||
totalmod *= 1.05;
|
||||
}
|
||||
}
|
||||
@ -1051,15 +1051,15 @@ uint32 Client::GetEXPForLevel(uint16 check_level)
|
||||
if(RuleB(Character,UseOldClassExpPenalties))
|
||||
{
|
||||
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;
|
||||
} else if(GetClass() == MONK) {
|
||||
} else if(GetClass() == Class::Monk) {
|
||||
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;
|
||||
} else if(GetClass() == ROGUE) {
|
||||
} else if(GetClass() == Class::Rogue) {
|
||||
classmod = 0.91;
|
||||
} else if(GetClass() == WARRIOR) {
|
||||
} else if(GetClass() == Class::Warrior) {
|
||||
classmod = 0.9;
|
||||
}
|
||||
|
||||
|
||||
@ -4,7 +4,7 @@ void FindClass(Client *c, const Seperator *sep)
|
||||
{
|
||||
if (sep->IsNumber(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);
|
||||
c->Message(
|
||||
Chat::White,
|
||||
@ -41,7 +41,7 @@ void FindClass(Client *c, const Seperator *sep)
|
||||
|
||||
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 auto& class_name_lower = Strings::ToLower(class_name);
|
||||
if (!Strings::Contains(class_name_lower, search_criteria)) {
|
||||
|
||||
@ -7,12 +7,12 @@ void command_merchantshop(Client *c, const Seperator *sep)
|
||||
!m ||
|
||||
!m->IsNPC() ||
|
||||
(
|
||||
m->GetClass() != MERCHANT &&
|
||||
m->GetClass() != DISCORD_MERCHANT &&
|
||||
m->GetClass() != ADVENTURE_MERCHANT &&
|
||||
m->GetClass() != NORRATHS_KEEPERS_MERCHANT &&
|
||||
m->GetClass() != DARK_REIGN_MERCHANT &&
|
||||
m->GetClass() != ALT_CURRENCY_MERCHANT
|
||||
m->GetClass() != Class::Merchant &&
|
||||
m->GetClass() != Class::DiscordMerchant &&
|
||||
m->GetClass() != Class::AdventureMerchant &&
|
||||
m->GetClass() != Class::NorrathsKeepersMerchant &&
|
||||
m->GetClass() != Class::DarkReignMerchant &&
|
||||
m->GetClass() != Class::AlternateCurrencyMerchant
|
||||
)
|
||||
) {
|
||||
c->Message(Chat::White, "You must target a merchant.");
|
||||
|
||||
@ -46,7 +46,7 @@ void command_scribespell(Client *c, const Seperator *sep)
|
||||
);
|
||||
|
||||
if (
|
||||
spells[spell_id].classes[WARRIOR] != 0 &&
|
||||
spells[spell_id].classes[Class::Warrior] != 0 &&
|
||||
spells[spell_id].skill != EQ::skills::SkillTigerClaw &&
|
||||
spells[spell_id].classes[t->GetPP().class_ - 1] > 0 &&
|
||||
!IsDiscipline(spell_id)
|
||||
|
||||
@ -600,7 +600,7 @@ bool HealRotation::healable_target(bool use_class_at, bool critical_only)
|
||||
return false;
|
||||
if (healable_target->GetHPRatio() > m_safe_hp_ratio[ClassArmorType(healable_target->GetClass())])
|
||||
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())])
|
||||
return false;
|
||||
}
|
||||
@ -610,7 +610,7 @@ bool HealRotation::healable_target(bool use_class_at, bool critical_only)
|
||||
return false;
|
||||
if (healable_target->GetHPRatio() > SAFE_HP_RATIO_BASE)
|
||||
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)
|
||||
return false;
|
||||
}
|
||||
@ -938,9 +938,9 @@ void HealRotation::validate_hot()
|
||||
bool IsHealRotationMemberClass(uint8 class_id)
|
||||
{
|
||||
switch (class_id) {
|
||||
case CLERIC:
|
||||
case DRUID:
|
||||
case SHAMAN:
|
||||
case Class::Cleric:
|
||||
case Class::Druid:
|
||||
case Class::Shaman:
|
||||
return true;
|
||||
default:
|
||||
return false;
|
||||
|
||||
@ -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(gender, uint8, 0);
|
||||
LuaCreateNPCParse(race, uint16, 1);
|
||||
LuaCreateNPCParse(class_, uint8, WARRIOR);
|
||||
LuaCreateNPCParse(class_, uint8, Class::Warrior);
|
||||
LuaCreateNPCParse(bodytype, uint8, 0);
|
||||
LuaCreateNPCParse(deity, uint8, 0);
|
||||
LuaCreateNPCParse(level, uint8, 1);
|
||||
@ -6778,51 +6778,52 @@ luabind::scope lua_register_classes() {
|
||||
return luabind::class_<Classes>("Class")
|
||||
.enum_("constants")
|
||||
[(
|
||||
luabind::value("WARRIOR", WARRIOR),
|
||||
luabind::value("CLERIC", CLERIC),
|
||||
luabind::value("PALADIN", PALADIN),
|
||||
luabind::value("RANGER", RANGER),
|
||||
luabind::value("SHADOWKNIGHT", SHADOWKNIGHT),
|
||||
luabind::value("DRUID", DRUID),
|
||||
luabind::value("MONK", MONK),
|
||||
luabind::value("BARD", BARD),
|
||||
luabind::value("ROGUE", ROGUE),
|
||||
luabind::value("SHAMAN", SHAMAN),
|
||||
luabind::value("NECROMANCER", NECROMANCER),
|
||||
luabind::value("WIZARD", WIZARD),
|
||||
luabind::value("MAGICIAN", MAGICIAN),
|
||||
luabind::value("ENCHANTER", ENCHANTER),
|
||||
luabind::value("BEASTLORD", BEASTLORD),
|
||||
luabind::value("BERSERKER", BERSERKER),
|
||||
luabind::value("WARRIORGM", WARRIORGM),
|
||||
luabind::value("CLERICGM", CLERICGM),
|
||||
luabind::value("PALADINGM", PALADINGM),
|
||||
luabind::value("RANGERGM", RANGERGM),
|
||||
luabind::value("SHADOWKNIGHTGM", SHADOWKNIGHTGM),
|
||||
luabind::value("DRUIDGM", DRUIDGM),
|
||||
luabind::value("MONKGM", MONKGM),
|
||||
luabind::value("BARDGM", BARDGM),
|
||||
luabind::value("ROGUEGM", ROGUEGM),
|
||||
luabind::value("SHAMANGM", SHAMANGM),
|
||||
luabind::value("NECROMANCERGM", NECROMANCERGM),
|
||||
luabind::value("WIZARDGM", WIZARDGM),
|
||||
luabind::value("MAGICIANGM", MAGICIANGM),
|
||||
luabind::value("ENCHANTERGM", ENCHANTERGM),
|
||||
luabind::value("BEASTLORDGM", BEASTLORDGM),
|
||||
luabind::value("BERSERKERGM", BERSERKERGM),
|
||||
luabind::value("BANKER", BANKER),
|
||||
luabind::value("MERCHANT", MERCHANT),
|
||||
luabind::value("DISCORD_MERCHANT", DISCORD_MERCHANT),
|
||||
luabind::value("ADVENTURE_RECRUITER", ADVENTURE_RECRUITER),
|
||||
luabind::value("ADVENTURE_MERCHANT", ADVENTURE_MERCHANT),
|
||||
luabind::value("LDON_TREASURE", LDON_TREASURE),
|
||||
luabind::value("TRIBUTE_MASTER", TRIBUTE_MASTER),
|
||||
luabind::value("GUILD_TRIBUTE_MASTER", GUILD_TRIBUTE_MASTER),
|
||||
luabind::value("NORRATHS_KEEPERS_MERCHANT", NORRATHS_KEEPERS_MERCHANT),
|
||||
luabind::value("DARK_REIGN_MERCHANT", DARK_REIGN_MERCHANT),
|
||||
luabind::value("FELLOWSHIP_MASTER", FELLOWSHIP_MASTER),
|
||||
luabind::value("ALT_CURRENCY_MERCHANT", ALT_CURRENCY_MERCHANT),
|
||||
luabind::value("MERCENARY_MASTER", MERCENARY_MASTER)
|
||||
luabind::value("WARRIOR", Class::Warrior),
|
||||
luabind::value("CLERIC", Class::Cleric),
|
||||
luabind::value("PALADIN", Class::Paladin),
|
||||
luabind::value("RANGER", Class::Ranger),
|
||||
luabind::value("SHADOWKNIGHT", Class::ShadowKnight),
|
||||
luabind::value("DRUID", Class::Druid),
|
||||
luabind::value("MONK", Class::Monk),
|
||||
luabind::value("BARD", Class::Bard),
|
||||
luabind::value("ROGUE", Class::Rogue),
|
||||
luabind::value("SHAMAN", Class::Shaman),
|
||||
luabind::value("NECROMANCER", Class::Necromancer),
|
||||
luabind::value("WIZARD", Class::Wizard),
|
||||
luabind::value("MAGICIAN", Class::Magician),
|
||||
luabind::value("ENCHANTER", Class::Enchanter),
|
||||
luabind::value("BEASTLORD", Class::Beastlord),
|
||||
luabind::value("BERSERKER", Class::Berserker),
|
||||
luabind::value("WARRIORGM", Class::WarriorGM),
|
||||
luabind::value("CLERICGM", Class::ClericGM),
|
||||
luabind::value("PALADINGM", Class::PaladinGM),
|
||||
luabind::value("RANGERGM", Class::RangerGM),
|
||||
luabind::value("SHADOWKNIGHTGM", Class::ShadowKnightGM),
|
||||
luabind::value("DRUIDGM", Class::DruidGM),
|
||||
luabind::value("MONKGM", Class::MonkGM),
|
||||
luabind::value("BARDGM", Class::BardGM),
|
||||
luabind::value("ROGUEGM", Class::RogueGM),
|
||||
luabind::value("SHAMANGM", Class::ShamanGM),
|
||||
luabind::value("NECROMANCERGM", Class::NecromancerGM),
|
||||
luabind::value("WIZARDGM", Class::WizardGM),
|
||||
luabind::value("MAGICIANGM", Class::MagicianGM),
|
||||
luabind::value("ENCHANTERGM", Class::EnchanterGM),
|
||||
luabind::value("BEASTLORDGM", Class::BeastlordGM),
|
||||
luabind::value("BERSERKERGM", Class::BerserkerGM),
|
||||
luabind::value("BANKER", Class::Banker),
|
||||
luabind::value("MERCHANT", Class::Merchant),
|
||||
luabind::value("DISCORD_MERCHANT", Class::DiscordMerchant),
|
||||
luabind::value("ADVENTURE_RECRUITER", Class::AdventureRecruiter),
|
||||
luabind::value("ADVENTURE_MERCHANT", Class::AdventureMerchant),
|
||||
luabind::value("LDON_TREASURE", Class::LDoNTreasure),
|
||||
luabind::value("TRIBUTE_MASTER", Class::TributeMaster),
|
||||
luabind::value("GUILD_TRIBUTE_MASTER", Class::GuildTributeMaster),
|
||||
luabind::value("GUILD_BANKER", Class::GuildBanker),
|
||||
luabind::value("NORRATHS_KEEPERS_MERCHANT", Class::NorrathsKeepersMerchant),
|
||||
luabind::value("DARK_REIGN_MERCHANT", Class::DarkReignMerchant),
|
||||
luabind::value("FELLOWSHIP_MASTER", Class::FellowshipMaster),
|
||||
luabind::value("ALT_CURRENCY_MERCHANT", Class::AlternateCurrencyMerchant),
|
||||
luabind::value("MERCENARY_MASTER", Class::MercenaryLiaison)
|
||||
)];
|
||||
}
|
||||
|
||||
|
||||
@ -60,7 +60,7 @@ Merc::Merc(const NPCType* d, float x, float y, float z, float heading)
|
||||
SetStance(EQ::constants::stanceBalanced);
|
||||
rest_timer.Disable();
|
||||
|
||||
if (GetClass() == ROGUE)
|
||||
if (GetClass() == Class::Rogue)
|
||||
evade_timer.Start();
|
||||
|
||||
int r;
|
||||
@ -1090,7 +1090,7 @@ void Merc::AI_Process() {
|
||||
|
||||
float meleeDistance = GetMaxMeleeRangeToTarget(GetTarget());
|
||||
|
||||
if(GetClass() == SHADOWKNIGHT || GetClass() == PALADIN || GetClass() == WARRIOR) {
|
||||
if(GetClass() == Class::ShadowKnight || GetClass() == Class::Paladin || GetClass() == Class::Warrior) {
|
||||
meleeDistance = meleeDistance * .30;
|
||||
}
|
||||
else {
|
||||
@ -1118,7 +1118,7 @@ void Merc::AI_Process() {
|
||||
|
||||
if(AI_movement_timer->Check()) {
|
||||
if (!IsMoving()) {
|
||||
if (GetClass() == ROGUE) {
|
||||
if (GetClass() == Class::Rogue) {
|
||||
if (HasTargetReflection() && !GetTarget()->IsFeared() && !GetTarget()->IsStunned()) {
|
||||
// Hate redux actions
|
||||
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
|
||||
float newX = 0;
|
||||
float newY = 0;
|
||||
@ -1240,7 +1240,7 @@ void Merc::AI_Process() {
|
||||
}
|
||||
|
||||
// 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) {
|
||||
// entity_list.MessageCloseString(this, false, 200, 0, BERSERK_START, GetName());
|
||||
// berserk = true;
|
||||
@ -1685,8 +1685,8 @@ bool Merc::AICastSpell(int8 iChance, uint32 iSpellTypes) {
|
||||
continue;
|
||||
}
|
||||
|
||||
if(IsEngaged() && (g->members[i]->GetClass() == NECROMANCER && hpr >= 50)
|
||||
|| (g->members[i]->GetClass() == SHAMAN && hpr >= 80)) {
|
||||
if(IsEngaged() && (g->members[i]->GetClass() == Class::Necromancer && hpr >= 50)
|
||||
|| (g->members[i]->GetClass() == Class::Shaman && hpr >= 80)) {
|
||||
//allow necros to lifetap & shaman to canni without wasting mana
|
||||
continue;
|
||||
}
|
||||
|
||||
264
zone/mob.cpp
264
zone/mob.cpp
@ -983,33 +983,33 @@ int64 Mob::GetSpellHPBonuses() {
|
||||
char Mob::GetCasterClass() const {
|
||||
switch(class_)
|
||||
{
|
||||
case CLERIC:
|
||||
case PALADIN:
|
||||
case RANGER:
|
||||
case DRUID:
|
||||
case SHAMAN:
|
||||
case BEASTLORD:
|
||||
case CLERICGM:
|
||||
case PALADINGM:
|
||||
case RANGERGM:
|
||||
case DRUIDGM:
|
||||
case SHAMANGM:
|
||||
case BEASTLORDGM:
|
||||
case Class::Cleric:
|
||||
case Class::Paladin:
|
||||
case Class::Ranger:
|
||||
case Class::Druid:
|
||||
case Class::Shaman:
|
||||
case Class::Beastlord:
|
||||
case Class::ClericGM:
|
||||
case Class::PaladinGM:
|
||||
case Class::RangerGM:
|
||||
case Class::DruidGM:
|
||||
case Class::ShamanGM:
|
||||
case Class::BeastlordGM:
|
||||
return 'W';
|
||||
break;
|
||||
|
||||
case SHADOWKNIGHT:
|
||||
case BARD:
|
||||
case NECROMANCER:
|
||||
case WIZARD:
|
||||
case MAGICIAN:
|
||||
case ENCHANTER:
|
||||
case SHADOWKNIGHTGM:
|
||||
case BARDGM:
|
||||
case NECROMANCERGM:
|
||||
case WIZARDGM:
|
||||
case MAGICIANGM:
|
||||
case ENCHANTERGM:
|
||||
case Class::ShadowKnight:
|
||||
case Class::Bard:
|
||||
case Class::Necromancer:
|
||||
case Class::Wizard:
|
||||
case Class::Magician:
|
||||
case Class::Enchanter:
|
||||
case Class::ShadowKnightGM:
|
||||
case Class::BardGM:
|
||||
case Class::NecromancerGM:
|
||||
case Class::WizardGM:
|
||||
case Class::MagicianGM:
|
||||
case Class::EnchanterGM:
|
||||
return 'I';
|
||||
break;
|
||||
|
||||
@ -1022,42 +1022,42 @@ char Mob::GetCasterClass() const {
|
||||
uint8 Mob::GetArchetype() const {
|
||||
switch(class_)
|
||||
{
|
||||
case PALADIN:
|
||||
case RANGER:
|
||||
case SHADOWKNIGHT:
|
||||
case BARD:
|
||||
case BEASTLORD:
|
||||
case PALADINGM:
|
||||
case RANGERGM:
|
||||
case SHADOWKNIGHTGM:
|
||||
case BARDGM:
|
||||
case BEASTLORDGM:
|
||||
case Class::Paladin:
|
||||
case Class::Ranger:
|
||||
case Class::ShadowKnight:
|
||||
case Class::Bard:
|
||||
case Class::Beastlord:
|
||||
case Class::PaladinGM:
|
||||
case Class::RangerGM:
|
||||
case Class::ShadowKnightGM:
|
||||
case Class::BardGM:
|
||||
case Class::BeastlordGM:
|
||||
return ARCHETYPE_HYBRID;
|
||||
break;
|
||||
case CLERIC:
|
||||
case DRUID:
|
||||
case SHAMAN:
|
||||
case NECROMANCER:
|
||||
case WIZARD:
|
||||
case MAGICIAN:
|
||||
case ENCHANTER:
|
||||
case CLERICGM:
|
||||
case DRUIDGM:
|
||||
case SHAMANGM:
|
||||
case NECROMANCERGM:
|
||||
case WIZARDGM:
|
||||
case MAGICIANGM:
|
||||
case ENCHANTERGM:
|
||||
case Class::Cleric:
|
||||
case Class::Druid:
|
||||
case Class::Shaman:
|
||||
case Class::Necromancer:
|
||||
case Class::Wizard:
|
||||
case Class::Magician:
|
||||
case Class::Enchanter:
|
||||
case Class::ClericGM:
|
||||
case Class::DruidGM:
|
||||
case Class::ShamanGM:
|
||||
case Class::NecromancerGM:
|
||||
case Class::WizardGM:
|
||||
case Class::MagicianGM:
|
||||
case Class::EnchanterGM:
|
||||
return ARCHETYPE_CASTER;
|
||||
break;
|
||||
case WARRIOR:
|
||||
case MONK:
|
||||
case ROGUE:
|
||||
case BERSERKER:
|
||||
case WARRIORGM:
|
||||
case MONKGM:
|
||||
case ROGUEGM:
|
||||
case BERSERKERGM:
|
||||
case Class::Warrior:
|
||||
case Class::Monk:
|
||||
case Class::Rogue:
|
||||
case Class::Berserker:
|
||||
case Class::WarriorGM:
|
||||
case Class::MonkGM:
|
||||
case Class::RogueGM:
|
||||
case Class::BerserkerGM:
|
||||
return ARCHETYPE_MELEE;
|
||||
break;
|
||||
default:
|
||||
@ -1069,73 +1069,73 @@ uint8 Mob::GetArchetype() const {
|
||||
void Mob::SetSpawnLastNameByClass(NewSpawn_Struct* ns)
|
||||
{
|
||||
switch (ns->spawn.class_) {
|
||||
case TRIBUTE_MASTER:
|
||||
case Class::TributeMaster:
|
||||
strcpy(ns->spawn.lastName, "Tribute Master");
|
||||
break;
|
||||
case GUILD_TRIBUTE_MASTER:
|
||||
case Class::GuildTributeMaster:
|
||||
strcpy(ns->spawn.lastName, "Guild Tribute Master");
|
||||
break;
|
||||
case GUILD_BANKER:
|
||||
case Class::GuildBanker:
|
||||
strcpy(ns->spawn.lastName, "Guild Banker");
|
||||
break;
|
||||
case ADVENTURE_RECRUITER:
|
||||
case Class::AdventureRecruiter:
|
||||
strcpy(ns->spawn.lastName, "Adventure Recruiter");
|
||||
break;
|
||||
case ADVENTURE_MERCHANT:
|
||||
case Class::AdventureMerchant:
|
||||
strcpy(ns->spawn.lastName, "Adventure Merchant");
|
||||
break;
|
||||
case BANKER:
|
||||
case Class::Banker:
|
||||
strcpy(ns->spawn.lastName, "Banker");
|
||||
break;
|
||||
case WARRIORGM:
|
||||
case Class::WarriorGM:
|
||||
strcpy(ns->spawn.lastName, "Warrior Guildmaster");
|
||||
break;
|
||||
case CLERICGM:
|
||||
case Class::ClericGM:
|
||||
strcpy(ns->spawn.lastName, "Cleric Guildmaster");
|
||||
break;
|
||||
case PALADINGM:
|
||||
case Class::PaladinGM:
|
||||
strcpy(ns->spawn.lastName, "Paladin Guildmaster");
|
||||
break;
|
||||
case RANGERGM:
|
||||
case Class::RangerGM:
|
||||
strcpy(ns->spawn.lastName, "Ranger Guildmaster");
|
||||
break;
|
||||
case SHADOWKNIGHTGM:
|
||||
case Class::ShadowKnightGM:
|
||||
strcpy(ns->spawn.lastName, "Shadow Knight Guildmaster");
|
||||
break;
|
||||
case DRUIDGM:
|
||||
case Class::DruidGM:
|
||||
strcpy(ns->spawn.lastName, "Druid Guildmaster");
|
||||
break;
|
||||
case MONKGM:
|
||||
case Class::MonkGM:
|
||||
strcpy(ns->spawn.lastName, "Monk Guildmaster");
|
||||
break;
|
||||
case BARDGM:
|
||||
case Class::BardGM:
|
||||
strcpy(ns->spawn.lastName, "Bard Guildmaster");
|
||||
break;
|
||||
case ROGUEGM:
|
||||
case Class::RogueGM:
|
||||
strcpy(ns->spawn.lastName, "Rogue Guildmaster");
|
||||
break;
|
||||
case SHAMANGM:
|
||||
case Class::ShamanGM:
|
||||
strcpy(ns->spawn.lastName, "Shaman Guildmaster");
|
||||
break;
|
||||
case NECROMANCERGM:
|
||||
case Class::NecromancerGM:
|
||||
strcpy(ns->spawn.lastName, "Necromancer Guildmaster");
|
||||
break;
|
||||
case WIZARDGM:
|
||||
case Class::WizardGM:
|
||||
strcpy(ns->spawn.lastName, "Wizard Guildmaster");
|
||||
break;
|
||||
case MAGICIANGM:
|
||||
case Class::MagicianGM:
|
||||
strcpy(ns->spawn.lastName, "Magician Guildmaster");
|
||||
break;
|
||||
case ENCHANTERGM:
|
||||
case Class::EnchanterGM:
|
||||
strcpy(ns->spawn.lastName, "Enchanter Guildmaster");
|
||||
break;
|
||||
case BEASTLORDGM:
|
||||
case Class::BeastlordGM:
|
||||
strcpy(ns->spawn.lastName, "Beastlord Guildmaster");
|
||||
break;
|
||||
case BERSERKERGM:
|
||||
case Class::BerserkerGM:
|
||||
strcpy(ns->spawn.lastName, "Berserker Guildmaster");
|
||||
break;
|
||||
case MERCENARY_MASTER:
|
||||
case Class::MercenaryLiaison:
|
||||
strcpy(ns->spawn.lastName, "Mercenary Liaison");
|
||||
break;
|
||||
default:
|
||||
@ -1346,8 +1346,8 @@ void Mob::FillSpawnStruct(NewSpawn_Struct* ns, Mob* ForWho)
|
||||
}
|
||||
|
||||
if (RuleB(Character, AllowCrossClassTrainers) && ForWho) {
|
||||
if (ns->spawn.class_ >= WARRIORGM && ns->spawn.class_ <= BERSERKERGM) {
|
||||
int trainer_class = WARRIORGM + (ForWho->GetClass() - 1);
|
||||
if (ns->spawn.class_ >= Class::WarriorGM && ns->spawn.class_ <= Class::BerserkerGM) {
|
||||
int trainer_class = Class::WarriorGM + (ForWho->GetClass() - 1);
|
||||
ns->spawn.class_ = trainer_class;
|
||||
}
|
||||
}
|
||||
@ -2118,7 +2118,7 @@ void Mob::SendStatsWindow(Client* c, bool use_window)
|
||||
|
||||
std::string bard_info;
|
||||
|
||||
if (GetClass() == BARD) {
|
||||
if (GetClass() == Class::Bard) {
|
||||
const auto brass_mod = IsBot() ? CastToBot()->GetBrassMod() : CastToClient()->GetBrassMod();
|
||||
const auto perc_mod = IsBot() ? CastToBot()->GetPercMod() : CastToClient()->GetPercMod();
|
||||
const auto sing_mod = IsBot() ? CastToBot()->GetSingMod() : CastToClient()->GetSingMod();
|
||||
@ -2419,7 +2419,7 @@ void Mob::SendStatsWindow(Client* c, bool use_window)
|
||||
}
|
||||
|
||||
// Bard Modifiers
|
||||
if (GetClass() == BARD) {
|
||||
if (GetClass() == Class::Bard) {
|
||||
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 perc_mod = IsBot() ? CastToBot()->GetPercMod() : CastToClient()->GetPercMod();
|
||||
const auto sing_mod = IsBot() ? CastToBot()->GetSingMod() : CastToClient()->GetSingMod();
|
||||
@ -4531,7 +4531,7 @@ bool Mob::CanThisClassDualWield(void) const {
|
||||
|
||||
// Dual-Wielding Empty Fists
|
||||
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 true;
|
||||
@ -4564,24 +4564,24 @@ bool Mob::IsWarriorClass(void) const
|
||||
{
|
||||
switch(GetClass())
|
||||
{
|
||||
case WARRIOR:
|
||||
case WARRIORGM:
|
||||
case ROGUE:
|
||||
case ROGUEGM:
|
||||
case MONK:
|
||||
case MONKGM:
|
||||
case PALADIN:
|
||||
case PALADINGM:
|
||||
case SHADOWKNIGHT:
|
||||
case SHADOWKNIGHTGM:
|
||||
case RANGER:
|
||||
case RANGERGM:
|
||||
case BEASTLORD:
|
||||
case BEASTLORDGM:
|
||||
case BERSERKER:
|
||||
case BERSERKERGM:
|
||||
case BARD:
|
||||
case BARDGM:
|
||||
case Class::Warrior:
|
||||
case Class::WarriorGM:
|
||||
case Class::Rogue:
|
||||
case Class::RogueGM:
|
||||
case Class::Monk:
|
||||
case Class::MonkGM:
|
||||
case Class::Paladin:
|
||||
case Class::PaladinGM:
|
||||
case Class::ShadowKnight:
|
||||
case Class::ShadowKnightGM:
|
||||
case Class::Ranger:
|
||||
case Class::RangerGM:
|
||||
case Class::Beastlord:
|
||||
case Class::BeastlordGM:
|
||||
case Class::Berserker:
|
||||
case Class::BerserkerGM:
|
||||
case Class::Bard:
|
||||
case Class::BardGM:
|
||||
{
|
||||
return true;
|
||||
}
|
||||
@ -5185,7 +5185,7 @@ int32 Mob::GetActSpellCasttime(uint16 spell_id, int32 casttime)
|
||||
int32 cast_reducer_no_limit = GetFocusEffect(focusFcCastTimeMod2, spell_id);
|
||||
|
||||
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);
|
||||
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)
|
||||
{
|
||||
const EQ::ItemData* itm = nullptr;
|
||||
itm = database.GetItem(item_id);
|
||||
|
||||
if (!itm) {
|
||||
const auto *item = database.GetItem(item_id);
|
||||
if (!item) {
|
||||
return false;
|
||||
}
|
||||
|
||||
auto item_classes = itm->Classes;
|
||||
if(item_classes == PLAYER_CLASS_ALL_MASK) {
|
||||
const uint16 item_classes = item->Classes;
|
||||
if (item_classes == Class::ALL_CLASSES_BITMASK) {
|
||||
return true;
|
||||
}
|
||||
|
||||
auto class_id = GetClass();
|
||||
if (class_id > BERSERKER) {
|
||||
const uint8 class_id = GetClass();
|
||||
if (!IsPlayerClass(class_id)) {
|
||||
return false;
|
||||
}
|
||||
|
||||
int class_bitmask = GetPlayerClassBit(class_id);
|
||||
if(!(item_classes & class_bitmask)) {
|
||||
return false;
|
||||
} else {
|
||||
return true;
|
||||
}
|
||||
const uint16 class_bitmask = GetPlayerClassBit(class_id);
|
||||
return (item_classes & class_bitmask);
|
||||
}
|
||||
|
||||
bool Mob::CanRaceEquipItem(uint32 item_id)
|
||||
@ -8264,37 +8258,37 @@ std::string Mob::GetRacePlural()
|
||||
std::string Mob::GetClassPlural()
|
||||
{
|
||||
switch (GetClass()) {
|
||||
case WARRIOR:
|
||||
case Class::Warrior:
|
||||
return "Warriors";
|
||||
case CLERIC:
|
||||
case Class::Cleric:
|
||||
return "Clerics";
|
||||
case PALADIN:
|
||||
case Class::Paladin:
|
||||
return "Paladins";
|
||||
case RANGER:
|
||||
case Class::Ranger:
|
||||
return "Rangers";
|
||||
case SHADOWKNIGHT:
|
||||
return "Shadowknights";
|
||||
case DRUID:
|
||||
case Class::ShadowKnight:
|
||||
return fmt::format("{}s", shadow_knight_class_name);
|
||||
case Class::Druid:
|
||||
return "Druids";
|
||||
case MONK:
|
||||
case Class::Monk:
|
||||
return "Monks";
|
||||
case BARD:
|
||||
case Class::Bard:
|
||||
return "Bards";
|
||||
case ROGUE:
|
||||
case Class::Rogue:
|
||||
return "Rogues";
|
||||
case SHAMAN:
|
||||
case Class::Shaman:
|
||||
return "Shamans";
|
||||
case NECROMANCER:
|
||||
case Class::Necromancer:
|
||||
return "Necromancers";
|
||||
case WIZARD:
|
||||
case Class::Wizard:
|
||||
return "Wizards";
|
||||
case MAGICIAN:
|
||||
case Class::Magician:
|
||||
return "Magicians";
|
||||
case ENCHANTER:
|
||||
case Class::Enchanter:
|
||||
return "Enchanters";
|
||||
case BEASTLORD:
|
||||
case Class::Beastlord:
|
||||
return "Beastlords";
|
||||
case BERSERKER:
|
||||
case Class::Berserker:
|
||||
return "Berserkers";
|
||||
default:
|
||||
return "Classes";
|
||||
|
||||
@ -1330,7 +1330,7 @@ void Mob::AI_Process() {
|
||||
// Now pursue
|
||||
// TODO: Check here for another person on hate list with close hate value
|
||||
if (AI_PursueCastCheck()) {
|
||||
if (IsCasting() && GetClass() != BARD) {
|
||||
if (IsCasting() && GetClass() != Class::Bard) {
|
||||
StopNavigation();
|
||||
FaceTarget();
|
||||
}
|
||||
@ -1382,7 +1382,7 @@ void Mob::AI_Process() {
|
||||
}
|
||||
}
|
||||
if (AI_IdleCastCheck()) {
|
||||
if (IsCasting() && GetClass() != BARD) {
|
||||
if (IsCasting() && GetClass() != Class::Bard) {
|
||||
StopNavigation();
|
||||
}
|
||||
}
|
||||
|
||||
18
zone/npc.cpp
18
zone/npc.cpp
@ -245,12 +245,12 @@ NPC::NPC(const NPCType *npc_type_data, Spawn2 *in_respawn, const glm::vec4 &posi
|
||||
|
||||
MerchantType = npc_type_data->merchanttype;
|
||||
merchant_open = (
|
||||
GetClass() == MERCHANT ||
|
||||
GetClass() == DISCORD_MERCHANT ||
|
||||
GetClass() == ADVENTURE_MERCHANT ||
|
||||
GetClass() == NORRATHS_KEEPERS_MERCHANT ||
|
||||
GetClass() == DARK_REIGN_MERCHANT ||
|
||||
GetClass() == ALT_CURRENCY_MERCHANT
|
||||
GetClass() == Class::Merchant ||
|
||||
GetClass() == Class::DiscordMerchant ||
|
||||
GetClass() == Class::AdventureMerchant ||
|
||||
GetClass() == Class::NorrathsKeepersMerchant ||
|
||||
GetClass() == Class::DarkReignMerchant ||
|
||||
GetClass() == Class::AlternateCurrencyMerchant
|
||||
);
|
||||
adventure_template_id = npc_type_data->adventure_template;
|
||||
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;
|
||||
m_record_loot_stats = false;
|
||||
|
||||
if (GetClass() == MERCENARY_MASTER && RuleB(Mercs, AllowMercs)) {
|
||||
if (GetClass() == Class::MercenaryLiaison && RuleB(Mercs, AllowMercs)) {
|
||||
LoadMercTypes();
|
||||
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
|
||||
// the theory of needing to be able to set skills for each mob separately
|
||||
if (IsBot()) {
|
||||
if (GetClass() != PALADIN && GetClass() != SHADOWKNIGHT) {
|
||||
if (GetClass() != Class::Paladin && GetClass() != Class::ShadowKnight) {
|
||||
knightattack_timer.Disable();
|
||||
}
|
||||
else if (GetClass() != MONK || GetLevel() < 10) {
|
||||
else if (GetClass() != Class::Monk || GetLevel() < 10) {
|
||||
monkattack_timer.Disable();
|
||||
}
|
||||
}
|
||||
|
||||
@ -417,7 +417,7 @@ uint32 NpcScaleManager::GetClassLevelDamageMod(uint32 level, uint32 npc_class)
|
||||
uint32 multiplier;
|
||||
|
||||
switch (npc_class) {
|
||||
case WARRIOR: {
|
||||
case Class::Warrior: {
|
||||
if (level < 20) {
|
||||
multiplier = 220;
|
||||
}
|
||||
@ -444,9 +444,9 @@ uint32 NpcScaleManager::GetClassLevelDamageMod(uint32 level, uint32 npc_class)
|
||||
}
|
||||
break;
|
||||
}
|
||||
case DRUID:
|
||||
case CLERIC:
|
||||
case SHAMAN: {
|
||||
case Class::Druid:
|
||||
case Class::Cleric:
|
||||
case Class::Shaman: {
|
||||
if (level < 70) {
|
||||
multiplier = 150;
|
||||
}
|
||||
@ -455,9 +455,9 @@ uint32 NpcScaleManager::GetClassLevelDamageMod(uint32 level, uint32 npc_class)
|
||||
}
|
||||
break;
|
||||
}
|
||||
case BERSERKER:
|
||||
case PALADIN:
|
||||
case SHADOWKNIGHT: {
|
||||
case Class::Berserker:
|
||||
case Class::Paladin:
|
||||
case Class::ShadowKnight: {
|
||||
if (level < 35) {
|
||||
multiplier = 210;
|
||||
}
|
||||
@ -481,10 +481,10 @@ uint32 NpcScaleManager::GetClassLevelDamageMod(uint32 level, uint32 npc_class)
|
||||
}
|
||||
break;
|
||||
}
|
||||
case MONK:
|
||||
case BARD:
|
||||
case ROGUE:
|
||||
case BEASTLORD: {
|
||||
case Class::Monk:
|
||||
case Class::Bard:
|
||||
case Class::Rogue:
|
||||
case Class::Beastlord: {
|
||||
if (level < 51) {
|
||||
multiplier = 180;
|
||||
}
|
||||
@ -499,7 +499,7 @@ uint32 NpcScaleManager::GetClassLevelDamageMod(uint32 level, uint32 npc_class)
|
||||
}
|
||||
break;
|
||||
}
|
||||
case RANGER: {
|
||||
case Class::Ranger: {
|
||||
if (level < 58) {
|
||||
multiplier = 200;
|
||||
}
|
||||
@ -511,10 +511,10 @@ uint32 NpcScaleManager::GetClassLevelDamageMod(uint32 level, uint32 npc_class)
|
||||
}
|
||||
break;
|
||||
}
|
||||
case MAGICIAN:
|
||||
case WIZARD:
|
||||
case NECROMANCER:
|
||||
case ENCHANTER: {
|
||||
case Class::Magician:
|
||||
case Class::Wizard:
|
||||
case Class::Necromancer:
|
||||
case Class::Enchanter: {
|
||||
if (level < 70) {
|
||||
multiplier = 120;
|
||||
}
|
||||
|
||||
@ -70,7 +70,7 @@ void Petition::SendPetitionToPlayer(Client* clientto) {
|
||||
Petition::Petition(uint32 id)
|
||||
{
|
||||
petid = id;
|
||||
charclass = NO_CLASS;
|
||||
charclass = Class::None;
|
||||
charrace = RACE_DOUG_0;
|
||||
charlevel = 0;
|
||||
checkouts = 0;
|
||||
|
||||
@ -1029,10 +1029,10 @@ bool QuestManager::isdisctome(uint32 item_id) {
|
||||
|
||||
//we know for sure none of the int casters get disciplines
|
||||
uint32 class_bit = 0;
|
||||
class_bit |= 1 << (WIZARD - 1);
|
||||
class_bit |= 1 << (ENCHANTER - 1);
|
||||
class_bit |= 1 << (MAGICIAN - 1);
|
||||
class_bit |= 1 << (NECROMANCER - 1);
|
||||
class_bit |= 1 << (Class::Wizard - 1);
|
||||
class_bit |= 1 << (Class::Enchanter - 1);
|
||||
class_bit |= 1 << (Class::Magician - 1);
|
||||
class_bit |= 1 << (Class::Necromancer - 1);
|
||||
if (item->Classes & class_bit) {
|
||||
return false;
|
||||
}
|
||||
@ -1045,10 +1045,10 @@ bool QuestManager::isdisctome(uint32 item_id) {
|
||||
//we know for sure none of the int casters get disciplines
|
||||
const auto& spell = spells[spell_id];
|
||||
if(
|
||||
spell.classes[WIZARD - 1] != 255 &&
|
||||
spell.classes[ENCHANTER - 1] != 255 &&
|
||||
spell.classes[MAGICIAN - 1] != 255 &&
|
||||
spell.classes[NECROMANCER - 1] != 255
|
||||
spell.classes[Class::Wizard - 1] != 255 &&
|
||||
spell.classes[Class::Enchanter - 1] != 255 &&
|
||||
spell.classes[Class::Magician - 1] != 255 &&
|
||||
spell.classes[Class::Necromancer - 1] != 255
|
||||
) {
|
||||
return false;
|
||||
}
|
||||
@ -3128,7 +3128,7 @@ void QuestManager::UpdateSpawnTimer(uint32 id, uint32 newTime)
|
||||
void QuestManager::MerchantSetItem(uint32 NPCid, uint32 itemid, uint32 quantity) {
|
||||
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
|
||||
|
||||
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) {
|
||||
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
|
||||
|
||||
const EQ::ItemData* item = nullptr;
|
||||
|
||||
@ -365,8 +365,8 @@ public:
|
||||
std::string GetEncounter() const;
|
||||
inline bool ProximitySayInUse() { return HaveProximitySays; }
|
||||
|
||||
int createbotcount(uint8 class_id = NO_CLASS);
|
||||
int spawnbotcount(uint8 class_id = NO_CLASS);
|
||||
int createbotcount(uint8 class_id = Class::None);
|
||||
int spawnbotcount(uint8 class_id = Class::None);
|
||||
bool botquest();
|
||||
bool createBot(const char *name, const char *lastname, uint8 level, uint16 race, uint8 botclass, uint8 gender);
|
||||
|
||||
|
||||
@ -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)
|
||||
if (
|
||||
(spellend_timer.Enabled() && GetClass() != BARD) ||
|
||||
(spellend_timer.Enabled() && GetClass() != Class::Bard) ||
|
||||
IsFeared() ||
|
||||
IsStunned() ||
|
||||
IsMezzed() ||
|
||||
@ -420,7 +420,7 @@ void Client::OPCombatAbility(const CombatAbility_Struct *ca_atk)
|
||||
CheckIncreaseSkill(EQ::skills::SkillFrenzy, GetTarget(), 10);
|
||||
DoAnim(anim1HWeapon, 0, false);
|
||||
|
||||
if (GetClass() == BERSERKER) {
|
||||
if (GetClass() == Class::Berserker) {
|
||||
int chance = GetLevel() * 2 + GetSkill(EQ::skills::SkillFrenzy);
|
||||
|
||||
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 bool can_use_kick = (
|
||||
class_id == WARRIOR ||
|
||||
class_id == RANGER ||
|
||||
class_id == MONK ||
|
||||
class_id == BEASTLORD ||
|
||||
class_id == BERSERKER ||
|
||||
class_id == Class::Warrior ||
|
||||
class_id == Class::Ranger ||
|
||||
class_id == Class::Monk ||
|
||||
class_id == Class::Beastlord ||
|
||||
class_id == Class::Berserker ||
|
||||
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;
|
||||
|
||||
// Live AA - Technique of Master Wu
|
||||
@ -559,7 +559,7 @@ void Client::OPCombatAbility(const CombatAbility_Struct *ca_atk)
|
||||
if (
|
||||
ca_atk->m_atk == 100 &&
|
||||
ca_atk->m_skill == EQ::skills::SkillBackstab &&
|
||||
class_id == ROGUE
|
||||
class_id == Class::Rogue
|
||||
) {
|
||||
reuse_time = BackstabReuseTime - 1 - skill_reduction;
|
||||
TryBackstab(GetTarget(), reuse_time);
|
||||
@ -1495,7 +1495,7 @@ void Client::ThrowingAttack(Mob* other, bool CanDoubleAttack) { //old was 51
|
||||
}
|
||||
|
||||
if(!IsAttackAllowed(other) ||
|
||||
(IsCasting() && GetClass() != BARD) ||
|
||||
(IsCasting() && GetClass() != Class::Bard) ||
|
||||
IsSitting() ||
|
||||
(DivineAura() && !GetGM()) ||
|
||||
IsStunned() ||
|
||||
@ -1779,13 +1779,13 @@ void NPC::DoClassAttacks(Mob *target) {
|
||||
int knightreuse = 1000; //lets give it a small cooldown actually.
|
||||
|
||||
switch(GetClass()){
|
||||
case SHADOWKNIGHT: case SHADOWKNIGHTGM:{
|
||||
case Class::ShadowKnight: case Class::ShadowKnightGM:{
|
||||
if (CastSpell(SPELL_NPC_HARM_TOUCH, target->GetID())) {
|
||||
knightreuse = HarmTouchReuseTime * 1000;
|
||||
}
|
||||
break;
|
||||
}
|
||||
case PALADIN: case PALADINGM:{
|
||||
case Class::Paladin: case Class::PaladinGM:{
|
||||
if(GetHPRatio() < 20) {
|
||||
if (CastSpell(SPELL_LAY_ON_HANDS, GetID())) {
|
||||
knightreuse = LayOnHandsReuseTime * 1000;
|
||||
@ -1822,14 +1822,14 @@ void NPC::DoClassAttacks(Mob *target) {
|
||||
bool did_attack = false;
|
||||
//class specific stuff...
|
||||
switch(GetClass()) {
|
||||
case ROGUE: case ROGUEGM:
|
||||
case Class::Rogue: case Class::RogueGM:
|
||||
if(level >= 10) {
|
||||
reuse = BackstabReuseTime * 1000;
|
||||
TryBackstab(target, reuse);
|
||||
did_attack = true;
|
||||
}
|
||||
break;
|
||||
case MONK: case MONKGM: {
|
||||
case Class::Monk: case Class::MonkGM: {
|
||||
uint8 satype = EQ::skills::SkillKick;
|
||||
if (level > 29) { satype = EQ::skills::SkillFlyingKick; }
|
||||
else if (level > 24) { satype = EQ::skills::SkillDragonPunch; }
|
||||
@ -1842,7 +1842,7 @@ void NPC::DoClassAttacks(Mob *target) {
|
||||
did_attack = true;
|
||||
break;
|
||||
}
|
||||
case WARRIOR: case WARRIORGM:{
|
||||
case Class::Warrior: case Class::WarriorGM:{
|
||||
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.
|
||||
DoAnim(animKick, 0, false);
|
||||
@ -1870,12 +1870,12 @@ void NPC::DoClassAttacks(Mob *target) {
|
||||
}
|
||||
break;
|
||||
}
|
||||
case BERSERKER: case BERSERKERGM:{
|
||||
case Class::Berserker: case Class::BerserkerGM:{
|
||||
int AtkRounds = 1;
|
||||
int32 max_dmg = GetBaseSkillDamage(EQ::skills::SkillFrenzy);
|
||||
DoAnim(anim2HSlashing, 0, false);
|
||||
|
||||
if (GetClass() == BERSERKER) {
|
||||
if (GetClass() == Class::Berserker) {
|
||||
int chance = GetLevel() * 2 + GetSkill(EQ::skills::SkillFrenzy);
|
||||
if (zone->random.Roll0(450) < chance)
|
||||
AtkRounds++;
|
||||
@ -1892,8 +1892,8 @@ void NPC::DoClassAttacks(Mob *target) {
|
||||
did_attack = true;
|
||||
break;
|
||||
}
|
||||
case RANGER: case RANGERGM:
|
||||
case BEASTLORD: case BEASTLORDGM: {
|
||||
case Class::Ranger: case Class::RangerGM:
|
||||
case Class::Beastlord: case Class::BeastlordGM: {
|
||||
//kick
|
||||
if(level >= RuleI(Combat, NPCBashKickLevel)){
|
||||
DoAnim(animKick, 0, false);
|
||||
@ -1908,9 +1908,9 @@ void NPC::DoClassAttacks(Mob *target) {
|
||||
}
|
||||
break;
|
||||
}
|
||||
case CLERIC: case CLERICGM: //clerics can bash too.
|
||||
case SHADOWKNIGHT: case SHADOWKNIGHTGM:
|
||||
case PALADIN: case PALADINGM:{
|
||||
case Class::Cleric: case Class::ClericGM: //clerics can bash too.
|
||||
case Class::ShadowKnight: case Class::ShadowKnightGM:
|
||||
case Class::Paladin: case Class::PaladinGM:{
|
||||
if(level >= RuleI(Combat, NPCBashKickLevel)){
|
||||
DoAnim(animTailRake, 0, false);
|
||||
int64 dmg = GetBaseSkillDamage(EQ::skills::SkillBash);
|
||||
@ -1957,19 +1957,19 @@ void Client::DoClassAttacks(Mob *ca_target, uint16 skill, bool IsRiposte)
|
||||
|
||||
if (skill == -1){
|
||||
switch(GetClass()){
|
||||
case WARRIOR:
|
||||
case RANGER:
|
||||
case BEASTLORD:
|
||||
case Class::Warrior:
|
||||
case Class::Ranger:
|
||||
case Class::Beastlord:
|
||||
skill_to_use = EQ::skills::SkillKick;
|
||||
break;
|
||||
case BERSERKER:
|
||||
case Class::Berserker:
|
||||
skill_to_use = EQ::skills::SkillFrenzy;
|
||||
break;
|
||||
case SHADOWKNIGHT:
|
||||
case PALADIN:
|
||||
case Class::ShadowKnight:
|
||||
case Class::Paladin:
|
||||
skill_to_use = EQ::skills::SkillBash;
|
||||
break;
|
||||
case MONK:
|
||||
case Class::Monk:
|
||||
if(GetLevel() >= 30)
|
||||
{
|
||||
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;
|
||||
}
|
||||
break;
|
||||
case ROGUE:
|
||||
case Class::Rogue:
|
||||
skill_to_use = EQ::skills::SkillBackstab;
|
||||
break;
|
||||
}
|
||||
@ -2035,7 +2035,7 @@ void Client::DoClassAttacks(Mob *ca_target, uint16 skill, bool IsRiposte)
|
||||
ReuseTime = (FrenzyReuseTime - 1) / HasteMod;
|
||||
|
||||
// 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);
|
||||
if (zone->random.Roll0(450) < chance)
|
||||
AtkRounds++;
|
||||
|
||||
@ -441,7 +441,7 @@ bool Mob::SpellEffect(Mob* caster, uint16 spell_id, float partial, int level_ove
|
||||
case SE_CurrentMana:
|
||||
{
|
||||
// Bards don't get mana from effects, good or bad.
|
||||
if(GetClass() == BARD)
|
||||
if(GetClass() == Class::Bard)
|
||||
break;
|
||||
if(IsManaTapSpell(spell_id)) {
|
||||
if(GetCasterClass() != 'N') {
|
||||
@ -478,7 +478,7 @@ bool Mob::SpellEffect(Mob* caster, uint16 spell_id, float partial, int level_ove
|
||||
case SE_CurrentManaOnce:
|
||||
{
|
||||
// Bards don't get mana from effects, good or bad.
|
||||
if(GetClass() == BARD)
|
||||
if(GetClass() == Class::Bard)
|
||||
break;
|
||||
#ifdef SPELL_EFFECT_SPAM
|
||||
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.
|
||||
if (caster && caster->GetClass() != BARD && caster->HasBaseEffectFocus()) {
|
||||
if (caster && caster->GetClass() != Class::Bard && caster->HasBaseEffectFocus()) {
|
||||
|
||||
oval = effect_value;
|
||||
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) {
|
||||
|
||||
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;
|
||||
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: {
|
||||
if (!caster || !PassCharismaCheck(caster, buff.spellid)) {
|
||||
BuffFadeByEffect(SE_Charm);
|
||||
|
||||
|
||||
// Remove from hate list of any NPC's hate list and remove all NPCs this hate list
|
||||
if (IsNPC()) {
|
||||
entity_list.RemoveFromHateLists(this);
|
||||
@ -7248,7 +7248,7 @@ bool Mob::PassLimitClass(uint32 Classes_, uint16 Class_)
|
||||
return false;
|
||||
|
||||
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 (CurrentClass == Class_)
|
||||
return true;
|
||||
@ -7481,7 +7481,7 @@ bool Mob::PassCastRestriction(int value)
|
||||
|
||||
case IS_CLASS_WIZARD:
|
||||
case IS_WIZARD_USED_ON_MAGE_FIRE_PET:
|
||||
if (GetClass() == WIZARD)
|
||||
if (GetClass() == Class::Wizard)
|
||||
return true;
|
||||
break;
|
||||
|
||||
@ -7521,12 +7521,12 @@ bool Mob::PassCastRestriction(int value)
|
||||
break;
|
||||
|
||||
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;
|
||||
break;
|
||||
|
||||
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;
|
||||
break;
|
||||
|
||||
@ -7541,78 +7541,78 @@ bool Mob::PassCastRestriction(int value)
|
||||
break;
|
||||
|
||||
case IS_CLASS_WARRIOR:
|
||||
if (GetClass() == WARRIOR)
|
||||
if (GetClass() == Class::Warrior)
|
||||
return true;
|
||||
break;
|
||||
|
||||
case IS_CLASS_CLERIC:
|
||||
if (GetClass() == CLERIC)
|
||||
if (GetClass() == Class::Cleric)
|
||||
return true;
|
||||
break;
|
||||
|
||||
case IS_CLASS_PALADIN:
|
||||
if (GetClass() == PALADIN)
|
||||
if (GetClass() == Class::Paladin)
|
||||
return true;
|
||||
break;
|
||||
|
||||
case IS_CLASS_RANGER:
|
||||
if (GetClass() == RANGER)
|
||||
if (GetClass() == Class::Ranger)
|
||||
return true;
|
||||
break;
|
||||
|
||||
case IS_CLASS_SHADOWKNIGHT:
|
||||
if (GetClass() == SHADOWKNIGHT)
|
||||
if (GetClass() == Class::ShadowKnight)
|
||||
return true;
|
||||
break;
|
||||
|
||||
case IS_CLASS_DRUID:
|
||||
if (GetClass() == DRUID)
|
||||
if (GetClass() == Class::Druid)
|
||||
return true;
|
||||
break;
|
||||
|
||||
case IS_CLASS_MONK:
|
||||
if (GetClass() == MONK)
|
||||
if (GetClass() == Class::Monk)
|
||||
return true;
|
||||
break;
|
||||
|
||||
case IS_CLASS_BARD2:
|
||||
case IS_CLASS_BARD:
|
||||
if (GetClass() == BARD)
|
||||
if (GetClass() == Class::Bard)
|
||||
return true;
|
||||
break;
|
||||
|
||||
case IS_CLASS_ROGUE:
|
||||
if (GetClass() == ROGUE)
|
||||
if (GetClass() == Class::Rogue)
|
||||
return true;
|
||||
break;
|
||||
|
||||
case IS_CLASS_SHAMAN:
|
||||
if (GetClass() == SHAMAN)
|
||||
if (GetClass() == Class::Shaman)
|
||||
return true;
|
||||
break;
|
||||
|
||||
case IS_CLASS_NECRO:
|
||||
if (GetClass() == NECROMANCER)
|
||||
if (GetClass() == Class::Necromancer)
|
||||
return true;
|
||||
break;
|
||||
|
||||
case IS_CLASS_MAGE:
|
||||
if (GetClass() == MAGICIAN)
|
||||
if (GetClass() == Class::Magician)
|
||||
return true;
|
||||
break;
|
||||
|
||||
case IS_CLASS_ENCHANTER:
|
||||
if (GetClass() == ENCHANTER)
|
||||
if (GetClass() == Class::Enchanter)
|
||||
return true;
|
||||
break;
|
||||
|
||||
case IS_CLASS_BEASTLORD:
|
||||
if (GetClass() == BEASTLORD)
|
||||
if (GetClass() == Class::Beastlord)
|
||||
return true;
|
||||
break;
|
||||
|
||||
case IS_CLASS_BERSERKER:
|
||||
if (GetClass() == BERSERKER)
|
||||
if (GetClass() == Class::Berserker)
|
||||
return true;
|
||||
break;
|
||||
|
||||
@ -7622,7 +7622,7 @@ bool Mob::PassCastRestriction(int value)
|
||||
break;
|
||||
|
||||
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;
|
||||
break;
|
||||
|
||||
@ -7722,8 +7722,8 @@ bool Mob::PassCastRestriction(int value)
|
||||
}
|
||||
|
||||
case IS_CLASS_CHAIN_OR_PLATE:
|
||||
if ((GetClass() == WARRIOR) || (GetClass() == BARD) || (GetClass() == SHADOWKNIGHT) || (GetClass() == PALADIN) || (GetClass() == CLERIC)
|
||||
|| (GetClass() == RANGER) || (GetClass() == SHAMAN) || (GetClass() == ROGUE) || (GetClass() == BERSERKER)) {
|
||||
if ((GetClass() == Class::Warrior) || (GetClass() == Class::Bard) || (GetClass() == Class::ShadowKnight) || (GetClass() == Class::Paladin) || (GetClass() == Class::Cleric)
|
||||
|| (GetClass() == Class::Ranger) || (GetClass() == Class::Shaman) || (GetClass() == Class::Rogue) || (GetClass() == Class::Berserker)) {
|
||||
return true;
|
||||
}
|
||||
break;
|
||||
@ -7914,7 +7914,7 @@ bool Mob::PassCastRestriction(int value)
|
||||
break;
|
||||
|
||||
case IS_CLASS_WARRIOR_CASTER_PRIEST:
|
||||
if (IsCasterClass(GetClass()) || GetClass() == WARRIOR)
|
||||
if (IsCasterClass(GetClass()) || GetClass() == Class::Warrior)
|
||||
return true;
|
||||
break;
|
||||
|
||||
@ -8082,13 +8082,13 @@ bool Mob::PassCastRestriction(int value)
|
||||
break;
|
||||
|
||||
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;
|
||||
break;
|
||||
|
||||
case IS_CLIENT_AND_MALE_BEASTLORD_BERSERKER_MONK_RANGER_OR_ROGUE:
|
||||
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;
|
||||
break;
|
||||
|
||||
@ -8098,13 +8098,13 @@ bool Mob::PassCastRestriction(int value)
|
||||
break;
|
||||
|
||||
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;
|
||||
break;
|
||||
|
||||
case IS_CLIENT_AND_FEMALE_BEASTLORD_BERSERKER_MONK_RANGER_OR_ROGUE:
|
||||
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;
|
||||
break;
|
||||
|
||||
@ -8177,7 +8177,7 @@ bool Mob::PassCastRestriction(int value)
|
||||
}
|
||||
|
||||
case IS_NOT_CLASS_BARD:
|
||||
if (GetClass() != BARD)
|
||||
if (GetClass() != Class::Bard)
|
||||
return true;
|
||||
break;
|
||||
|
||||
|
||||
@ -1094,7 +1094,7 @@ bool Client::CheckFizzle(uint16 spell_id)
|
||||
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(GetClass() == BARD)
|
||||
if(GetClass() == Class::Bard)
|
||||
{
|
||||
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);
|
||||
// here we do different things if this is a bard casting a bard song from
|
||||
// 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 (spells[spell_id].buff_duration == 0xFFFF) {
|
||||
@ -1938,7 +1938,7 @@ bool Mob::DetermineSpellTargets(uint16 spell_id, Mob *&spell_target, Mob *&ae_ce
|
||||
return false;
|
||||
}
|
||||
|
||||
if(spell_target->GetClass() != LDON_TREASURE)
|
||||
if(spell_target->GetClass() != Class::LDoNTreasure)
|
||||
{
|
||||
LogSpells("Spell [{}] canceled: invalid target (normal)", spell_id);
|
||||
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
|
||||
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);
|
||||
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)
|
||||
continue;
|
||||
|
||||
if (IsBardOnlyStackEffect(effect1) && GetSpellLevel(spellid1, BARD) != 255 &&
|
||||
GetSpellLevel(spellid2, BARD) != 255)
|
||||
if (IsBardOnlyStackEffect(effect1) && GetSpellLevel(spellid1, Class::Bard) != 255 &&
|
||||
GetSpellLevel(spellid2, Class::Bard) != 255)
|
||||
continue;
|
||||
|
||||
// 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) &&
|
||||
slot != -1 &&
|
||||
GetClass() == BARD &&
|
||||
GetClass() == Class::Bard &&
|
||||
slot <= EQ::spells::SPELL_GEM_COUNT &&
|
||||
IsBardSong(spell_id)
|
||||
);
|
||||
|
||||
@ -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
|
||||
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.");
|
||||
auto outapp = new EQApplicationPacket(OP_TradeSkillCombine, 0);
|
||||
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) {
|
||||
if (user_pp.class_ != ROGUE) {
|
||||
if (user_pp.class_ != Class::Rogue) {
|
||||
user->Message(Chat::Red, "Only rogues can mix poisons.");
|
||||
auto outapp = new EQApplicationPacket(OP_TradeSkillCombine, 0);
|
||||
user->QueuePacket(outapp);
|
||||
|
||||
@ -1068,14 +1068,14 @@ int64 Mob::TuneACSum(bool skip_caps, int ac_override, int add_ac)
|
||||
ac += GetPetACBonusFromOwner();
|
||||
auto spell_aa_ac = aabonuses.AC + spellbonuses.AC;
|
||||
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;
|
||||
else
|
||||
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
|
||||
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;
|
||||
else
|
||||
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
|
||||
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;
|
||||
|
||||
if (hit.damage_done < 1)
|
||||
@ -1436,7 +1436,7 @@ void Mob::TuneCommonOutgoingHitSuccess(Mob* defender, DamageHitInfo &hit, ExtraA
|
||||
if (headshot > 0) {
|
||||
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)) {
|
||||
hit.damage_done *= 2;
|
||||
MessageString(Chat::MeleeCrit, BOW_DOUBLE_DAMAGE);
|
||||
@ -1461,7 +1461,7 @@ void Mob::TuneCommonOutgoingHitSuccess(Mob* defender, DamageHitInfo &hit, ExtraA
|
||||
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;
|
||||
}
|
||||
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user