mirror of
https://github.com/EQEmu/Server.git
synced 2026-04-02 12:22:27 +00:00
- License was intended to be GPLv3 per earlier commit of GPLv3 LICENSE FILE - This is confirmed by the inclusion of libraries that are incompatible with GPLv2 - This is also confirmed by KLS and the agreement of KLS's predecessors - Added GPLv3 license headers to the compilable source files - Removed Folly licensing in strings.h since the string functions do not match the Folly functions and are standard functions - this must have been left over from previous implementations - Removed individual contributor license headers since the project has been under the "developer" mantle for many years - Removed comments on files that were previously automatically generated since they've been manually modified multiple times and there are no automatic scripts referencing them (removed in 2023)
626 lines
13 KiB
C++
626 lines
13 KiB
C++
/* EQEmu: EQEmulator
|
|
|
|
Copyright (C) 2001-2026 EQEmu Development Team
|
|
|
|
This program is free software; you can redistribute it and/or modify
|
|
it under the terms of the GNU General Public License as published by
|
|
the Free Software Foundation; either version 3 of the License, or
|
|
(at your option) any later version.
|
|
|
|
This program is distributed in the hope that it will be useful,
|
|
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
GNU General Public License for more details.
|
|
|
|
You should have received a copy of the GNU General Public License
|
|
along with this program. If not, see <http://www.gnu.org/licenses/>.
|
|
*/
|
|
#include "classes.h"
|
|
|
|
#include "common/data_verification.h"
|
|
|
|
#include "fmt/format.h"
|
|
|
|
const char *GetClassIDName(uint8 class_id, uint8 level)
|
|
{
|
|
switch (class_id) {
|
|
case Class::Warrior: {
|
|
if (level >= 75) {
|
|
return "Imperator";
|
|
} else if (level >= 70) {
|
|
return "Vanquisher";
|
|
} else if (level >= 65) {
|
|
return "Overlord";
|
|
} else if (level >= 60) {
|
|
return "Warlord";
|
|
} else if (level >= 55) {
|
|
return "Myrmidon";
|
|
} else if (level >= 51) {
|
|
return "Champion";
|
|
} else {
|
|
return "Warrior";
|
|
}
|
|
}
|
|
case Class::Cleric: {
|
|
if (level >= 75) {
|
|
return "Exemplar";
|
|
} else if (level >= 70) {
|
|
return "Prelate";
|
|
} else if (level >= 65) {
|
|
return "Archon";
|
|
} else if (level >= 60) {
|
|
return "High Priest";
|
|
} else if (level >= 55) {
|
|
return "Templar";
|
|
} else if (level >= 51) {
|
|
return "Vicar";
|
|
} else {
|
|
return "Cleric";
|
|
}
|
|
}
|
|
case Class::Paladin: {
|
|
if (level >= 75) {
|
|
return "Holy Defender";
|
|
} else if (level >= 70) {
|
|
return "Lord";
|
|
} else if (level >= 65) {
|
|
return "Lord Protector";
|
|
} else if (level >= 60) {
|
|
return "Crusader";
|
|
} else if (level >= 55) {
|
|
return "Knight";
|
|
} else if (level >= 51) {
|
|
return "Cavalier";
|
|
} else {
|
|
return "Paladin";
|
|
}
|
|
}
|
|
case Class::Ranger: {
|
|
if (level >= 75) {
|
|
return "Huntmaster";
|
|
} else if (level >= 70) {
|
|
return "Plainswalker";
|
|
} else if (level >= 65) {
|
|
return "Forest Stalker";
|
|
} else if (level >= 60) {
|
|
return "Warder";
|
|
} else if (level >= 55) {
|
|
return "Outrider";
|
|
} else if (level >= 51) {
|
|
return "Pathfinder";
|
|
} else {
|
|
return "Ranger";
|
|
}
|
|
}
|
|
case Class::ShadowKnight: {
|
|
if (level >= 75) {
|
|
return "Bloodreaver";
|
|
} else if (level >= 70) {
|
|
return "Scourge Knight";
|
|
} else if (level >= 65) {
|
|
return "Dread Lord";
|
|
} else if (level >= 60) {
|
|
return "Grave Lord";
|
|
} else if (level >= 55) {
|
|
return "Revenant";
|
|
} else if (level >= 51) {
|
|
return "Reaver";
|
|
} else {
|
|
return shadow_knight_class_name.c_str();
|
|
}
|
|
}
|
|
case Class::Druid: {
|
|
if (level >= 75) {
|
|
return "Storm Caller";
|
|
} else if (level >= 70) {
|
|
return "Natureguard";
|
|
} else if (level >= 65) {
|
|
return "Storm Warden";
|
|
} else if (level >= 60) {
|
|
return "Hierophant";
|
|
} else if (level >= 55) {
|
|
return "Preserver";
|
|
} else if (level >= 51) {
|
|
return "Wanderer";
|
|
} else {
|
|
return "Druid";
|
|
}
|
|
}
|
|
case Class::Monk: {
|
|
if (level >= 75) {
|
|
return "Ashenhand";
|
|
} else if (level >= 70) {
|
|
return "Stone Fist";
|
|
} else if (level >= 65) {
|
|
return "Transcendent";
|
|
} else if (level >= 60) {
|
|
return "Grandmaster";
|
|
} else if (level >= 55) {
|
|
return "Master";
|
|
} else if (level >= 51) {
|
|
return "Disciple";
|
|
} else {
|
|
return "Monk";
|
|
}
|
|
}
|
|
case Class::Bard: {
|
|
if (level >= 75) {
|
|
return "Lyricist";
|
|
} else if (level >= 70) {
|
|
return "Performer";
|
|
} else if (level >= 65) {
|
|
return "Maestro";
|
|
} else if (level >= 60) {
|
|
return "Virtuoso";
|
|
} else if (level >= 55) {
|
|
return "Troubadour";
|
|
} else if (level >= 51) {
|
|
return "Minstrel";
|
|
} else {
|
|
return "Bard";
|
|
}
|
|
}
|
|
case Class::Rogue: {
|
|
if (level >= 75) {
|
|
return "Shadowblade";
|
|
} else if (level >= 70) {
|
|
return "Nemesis";
|
|
} else if (level >= 65) {
|
|
return "Deceiver";
|
|
} else if (level >= 60) {
|
|
return "Assassin";
|
|
} else if (level >= 55) {
|
|
return "Blackguard";
|
|
} else if (level >= 51) {
|
|
return "Rake";
|
|
} else {
|
|
return "Rogue";
|
|
}
|
|
}
|
|
case Class::Shaman: {
|
|
if (level >= 75) {
|
|
return "Spiritwatcher";
|
|
} else if (level >= 70) {
|
|
return "Soothsayer";
|
|
} else if (level >= 65) {
|
|
return "Prophet";
|
|
} else if (level >= 60) {
|
|
return "Oracle";
|
|
} else if (level >= 55) {
|
|
return "Luminary";
|
|
} else if (level >= 51) {
|
|
return "Mystic";
|
|
} else {
|
|
return "Shaman";
|
|
}
|
|
}
|
|
case Class::Necromancer: {
|
|
if (level >= 75) {
|
|
return "Deathcaller";
|
|
} else if (level >= 70) {
|
|
return "Wraith";
|
|
} else if (level >= 65) {
|
|
return "Arch Lich";
|
|
} else if (level >= 60) {
|
|
return "Warlock";
|
|
} else if (level >= 55) {
|
|
return "Defiler";
|
|
} else if (level >= 51) {
|
|
return "Heretic";
|
|
} else {
|
|
return "Necromancer";
|
|
}
|
|
}
|
|
case Class::Wizard: {
|
|
if (level >= 75) {
|
|
return "Pyromancer";
|
|
} else if (level >= 70) {
|
|
return "Grand Arcanist";
|
|
} else if (level >= 65) {
|
|
return "Arcanist";
|
|
} else if (level >= 60) {
|
|
return "Sorcerer";
|
|
} else if (level >= 55) {
|
|
return "Evoker";
|
|
} else if (level >= 51) {
|
|
return "Channeler";
|
|
} else {
|
|
return "Wizard";
|
|
}
|
|
}
|
|
case Class::Magician: {
|
|
if (level >= 75) {
|
|
return "Grand Summoner";
|
|
} else if (level >= 70) {
|
|
return "Arch Magus";
|
|
} else if (level >= 65) {
|
|
return "Arch Convoker";
|
|
} else if (level >= 60) {
|
|
return "Arch Mage";
|
|
} else if (level >= 55) {
|
|
return "Conjurer";
|
|
}
|
|
if (level >= 51) {
|
|
return "Elementalist";
|
|
} else {
|
|
return "Magician";
|
|
}
|
|
}
|
|
case Class::Enchanter: {
|
|
if (level >= 75) {
|
|
return "Entrancer";
|
|
} else if (level >= 70) {
|
|
return "Bedazzler";
|
|
} else if (level >= 65) {
|
|
return "Coercer";
|
|
} else if (level >= 60) {
|
|
return "Phantasmist";
|
|
} else if (level >= 55) {
|
|
return "Beguiler";
|
|
} else if (level >= 51) {
|
|
return "Illusionist";
|
|
} else {
|
|
return "Enchanter";
|
|
}
|
|
}
|
|
case Class::Beastlord: {
|
|
if (level >= 75) {
|
|
return "Frostblood";
|
|
} else if (level >= 70) {
|
|
return "Wildblood";
|
|
} else if (level >= 65) {
|
|
return "Feral Lord";
|
|
} else if (level >= 60) {
|
|
return "Savage Lord";
|
|
} else if (level >= 55) {
|
|
return "Animist";
|
|
} else if (level >= 51) {
|
|
return "Primalist";
|
|
} else {
|
|
return "Beastlord";
|
|
}
|
|
}
|
|
case Class::Berserker: {
|
|
if (level >= 75) {
|
|
return "Juggernaut";
|
|
} else if (level >= 70) {
|
|
return "Ravager";
|
|
} else if (level >= 65) {
|
|
return "Fury";
|
|
} else if (level >= 60) {
|
|
return "Rager";
|
|
} else if (level >= 55) {
|
|
return "Vehement";
|
|
} else if (level >= 51) {
|
|
return "Brawler";
|
|
} else {
|
|
return "Berserker";
|
|
}
|
|
}
|
|
case Class::Banker:
|
|
return "Banker";
|
|
case Class::WarriorGM:
|
|
return "Warrior Guildmaster";
|
|
case Class::ClericGM:
|
|
return "Cleric Guildmaster";
|
|
case Class::PaladinGM:
|
|
return "Paladin Guildmaster";
|
|
case Class::RangerGM:
|
|
return "Ranger Guildmaster";
|
|
case Class::ShadowKnightGM:
|
|
return fmt::format("{} Guildmaster", shadow_knight_class_name).c_str();
|
|
case Class::DruidGM:
|
|
return "Druid Guildmaster";
|
|
case Class::MonkGM:
|
|
return "Monk Guildmaster";
|
|
case Class::BardGM:
|
|
return "Bard Guildmaster";
|
|
case Class::RogueGM:
|
|
return "Rogue Guildmaster";
|
|
case Class::ShamanGM:
|
|
return "Shaman Guildmaster";
|
|
case Class::NecromancerGM:
|
|
return "Necromancer Guildmaster";
|
|
case Class::WizardGM:
|
|
return "Wizard Guildmaster";
|
|
case Class::MagicianGM:
|
|
return "Magician Guildmaster";
|
|
case Class::EnchanterGM:
|
|
return "Enchanter Guildmaster";
|
|
case Class::BeastlordGM:
|
|
return "Beastlord Guildmaster";
|
|
case Class::BerserkerGM:
|
|
return "Berserker Guildmaster";
|
|
case Class::Merchant:
|
|
return "Merchant";
|
|
case Class::DiscordMerchant:
|
|
return "Discord Merchant";
|
|
case Class::AdventureRecruiter:
|
|
return "Adventure Recruiter";
|
|
case Class::AdventureMerchant:
|
|
return "Adventure Merchant";
|
|
case Class::LDoNTreasure:
|
|
return "LDoN Treasure";
|
|
case Class::TributeMaster:
|
|
return "Tribute Master";
|
|
case Class::GuildTributeMaster:
|
|
return "Guild Tribute Master";
|
|
case Class::GuildBanker:
|
|
return "Guild Banker";
|
|
case Class::NorrathsKeepersMerchant:
|
|
return "Radiant Crystal Merchant";
|
|
case Class::DarkReignMerchant:
|
|
return "Ebon Crystal Merchant";
|
|
case Class::FellowshipMaster:
|
|
return "Fellowship Master";
|
|
case Class::AlternateCurrencyMerchant:
|
|
return "Alternate Currency Merchant";
|
|
case Class::MercenaryLiaison:
|
|
return "Mercenary Liaison";
|
|
default:
|
|
return "Unknown";
|
|
}
|
|
}
|
|
|
|
uint8 GetPlayerClassValue(uint8 class_id)
|
|
{
|
|
if (!IsPlayerClass(class_id)) {
|
|
return 0;
|
|
}
|
|
|
|
return class_id;
|
|
}
|
|
|
|
uint16 GetPlayerClassBit(uint8 class_id)
|
|
{
|
|
if (!IsPlayerClass(class_id)) {
|
|
return 0;
|
|
}
|
|
|
|
return player_class_bitmasks[class_id];
|
|
}
|
|
|
|
bool IsFighterClass(uint8 class_id)
|
|
{
|
|
switch (class_id) {
|
|
case Class::Warrior:
|
|
case Class::Paladin:
|
|
case Class::Ranger:
|
|
case Class::ShadowKnight:
|
|
case Class::Monk:
|
|
case Class::Bard:
|
|
case Class::Rogue:
|
|
case Class::Beastlord:
|
|
case Class::Berserker:
|
|
return true;
|
|
default:
|
|
return false;
|
|
}
|
|
}
|
|
|
|
bool IsSpellFighterClass(uint8 class_id)
|
|
{
|
|
switch (class_id) {
|
|
case Class::Paladin:
|
|
case Class::Ranger:
|
|
case Class::ShadowKnight:
|
|
case Class::Beastlord:
|
|
return true;
|
|
default:
|
|
return false;
|
|
}
|
|
}
|
|
|
|
bool IsNonSpellFighterClass(uint8 class_id)
|
|
{
|
|
switch (class_id) {
|
|
case Class::Warrior:
|
|
case Class::Monk:
|
|
case Class::Bard:
|
|
case Class::Rogue:
|
|
case Class::Berserker:
|
|
return true;
|
|
default:
|
|
return false;
|
|
}
|
|
}
|
|
|
|
bool IsHybridClass(uint8 class_id)
|
|
{
|
|
switch (class_id) {
|
|
case Class::Paladin:
|
|
case Class::Ranger:
|
|
case Class::ShadowKnight:
|
|
case Class::Bard:
|
|
case Class::Beastlord:
|
|
return true;
|
|
default:
|
|
return false;
|
|
}
|
|
}
|
|
|
|
bool IsCasterClass(uint8 class_id)
|
|
{
|
|
switch (class_id) {
|
|
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;
|
|
}
|
|
}
|
|
|
|
bool IsINTCasterClass(uint8 class_id)
|
|
{
|
|
switch (class_id) {
|
|
case Class::Necromancer:
|
|
case Class::Wizard:
|
|
case Class::Magician:
|
|
case Class::Enchanter:
|
|
return true;
|
|
default:
|
|
return false;
|
|
}
|
|
}
|
|
|
|
bool IsHeroicINTCasterClass(uint8 class_id)
|
|
{
|
|
switch (class_id) {
|
|
case Class::Necromancer:
|
|
case Class::Wizard:
|
|
case Class::Magician:
|
|
case Class::Enchanter:
|
|
case Class::ShadowKnight:
|
|
return true;
|
|
default:
|
|
return false;
|
|
}
|
|
}
|
|
|
|
bool IsWISCasterClass(uint8 class_id)
|
|
{
|
|
switch (class_id) {
|
|
case Class::Cleric:
|
|
case Class::Druid:
|
|
case Class::Shaman:
|
|
return true;
|
|
default:
|
|
return false;
|
|
}
|
|
}
|
|
|
|
bool IsHeroicWISCasterClass(uint8 class_id)
|
|
{
|
|
switch (class_id) {
|
|
case Class::Cleric:
|
|
case Class::Druid:
|
|
case Class::Shaman:
|
|
case Class::Paladin:
|
|
case Class::Beastlord:
|
|
case Class::Ranger:
|
|
return true;
|
|
default:
|
|
return false;
|
|
}
|
|
}
|
|
|
|
bool IsPlateClass(uint8 class_id)
|
|
{
|
|
switch (class_id) {
|
|
case Class::Warrior:
|
|
case Class::Cleric:
|
|
case Class::Paladin:
|
|
case Class::ShadowKnight:
|
|
case Class::Bard:
|
|
return true;
|
|
default:
|
|
return false;
|
|
}
|
|
}
|
|
|
|
bool IsChainClass(uint8 class_id)
|
|
{
|
|
switch (class_id) {
|
|
case Class::Ranger:
|
|
case Class::Rogue:
|
|
case Class::Shaman:
|
|
case Class::Berserker:
|
|
return true;
|
|
default:
|
|
return false;
|
|
}
|
|
}
|
|
|
|
bool IsLeatherClass(uint8 class_id)
|
|
{
|
|
switch (class_id) {
|
|
case Class::Druid:
|
|
case Class::Monk:
|
|
case Class::Beastlord:
|
|
return true;
|
|
default:
|
|
return false;
|
|
}
|
|
}
|
|
|
|
bool IsClothClass(uint8 class_id)
|
|
{
|
|
switch (class_id) {
|
|
case Class::Necromancer:
|
|
case Class::Wizard:
|
|
case Class::Magician:
|
|
case Class::Enchanter:
|
|
return true;
|
|
default:
|
|
return false;
|
|
}
|
|
}
|
|
|
|
uint8 ClassArmorType(uint8 class_id)
|
|
{
|
|
if (IsChainClass(class_id)) {
|
|
return ARMOR_TYPE_CHAIN;
|
|
} else if (IsClothClass(class_id)) {
|
|
return ARMOR_TYPE_CLOTH;
|
|
} else if (IsLeatherClass(class_id)) {
|
|
return ARMOR_TYPE_LEATHER;
|
|
} else if (IsPlateClass(class_id)) {
|
|
return ARMOR_TYPE_PLATE;
|
|
}
|
|
|
|
return ARMOR_TYPE_UNKNOWN;
|
|
}
|
|
|
|
const std::string GetPlayerClassAbbreviation(uint8 class_id)
|
|
{
|
|
if (!EQ::ValueWithin(class_id, Class::Warrior, Class::Berserker)) {
|
|
return std::string("UNK");
|
|
}
|
|
|
|
switch (class_id) {
|
|
case Class::Warrior:
|
|
return "WAR";
|
|
case Class::Cleric:
|
|
return "CLR";
|
|
case Class::Paladin:
|
|
return "PAL";
|
|
case Class::Ranger:
|
|
return "RNG";
|
|
case Class::ShadowKnight:
|
|
return "SHD";
|
|
case Class::Druid:
|
|
return "DRU";
|
|
case Class::Monk:
|
|
return "MNK";
|
|
case Class::Bard:
|
|
return "BRD";
|
|
case Class::Rogue:
|
|
return "ROG";
|
|
case Class::Shaman:
|
|
return "SHM";
|
|
case Class::Necromancer:
|
|
return "NEC";
|
|
case Class::Wizard:
|
|
return "WIZ";
|
|
case Class::Magician:
|
|
return "MAG";
|
|
case Class::Enchanter:
|
|
return "ENC";
|
|
case Class::Beastlord:
|
|
return "BST";
|
|
case Class::Berserker:
|
|
return "BER";
|
|
}
|
|
|
|
return std::string("UNK");
|
|
}
|
|
|
|
bool IsPlayerClass(uint8 class_id) {
|
|
return EQ::ValueWithin(class_id, Class::Warrior, Class::Berserker);
|
|
}
|