mirror of
https://github.com/ZhengPeiRu21/mod-individual-progression
synced 2025-11-29 23:44:51 +08:00
optional pvp system based on mod-pvp-titles pvp items are now hidden on pvp vendors until you have the required rank for them.
376 lines
14 KiB
C++
376 lines
14 KiB
C++
#ifndef AZEROTHCORE_INDIVIDUALPROGRESSION_H
|
|
#define AZEROTHCORE_INDIVIDUALPROGRESSION_H
|
|
|
|
#include "ScriptMgr.h"
|
|
#include "Player.h"
|
|
#include "Config.h"
|
|
#include "Chat.h"
|
|
#include "ScriptedCreature.h"
|
|
#include "GameObjectAI.h"
|
|
#include "MapMgr.h"
|
|
#include "ObjectAccessor.h"
|
|
#include "ObjectMgr.h"
|
|
#include "Group.h"
|
|
#include "Pet.h"
|
|
#include "DBCEnums.h"
|
|
#include "QuestDef.h"
|
|
#include "GameObject.h"
|
|
#include "AreaDefines.h"
|
|
#include "IWorld.h"
|
|
#include <regex>
|
|
|
|
typedef std::unordered_map<uint32, uint32> questXpMapType;
|
|
|
|
enum ProgressionLevelThreshold
|
|
{
|
|
IP_LEVEL_VANILLA = 60,
|
|
IP_LEVEL_TBC = 70,
|
|
IP_LEVEL_WOTLK = 80
|
|
};
|
|
|
|
enum ProgressionBossIDs
|
|
{
|
|
RAGNAROS = 11502,
|
|
ONYXIA = 10184,
|
|
ONYXIA_40 = 301000,
|
|
NEFARIAN = 11583,
|
|
CTHUN = 15727,
|
|
KELTHUZAD = 15990,
|
|
KELTHUZAD_40 = 351019,
|
|
MALCHEZAAR = 15690,
|
|
KAELTHAS = 19622,
|
|
ILLIDAN = 22917,
|
|
ZULJIN = 23863,
|
|
KILJAEDEN = 25315,
|
|
YOGGSARON = 33288,
|
|
ANUBARAK = 34564,
|
|
LICH_KING = 36597,
|
|
HALION = 39863,
|
|
RHAHK_ZOR = 644,
|
|
SNEED = 643,
|
|
GILNID = 1763
|
|
};
|
|
|
|
enum BuffSpells
|
|
{
|
|
HP_AURA_SPELL = 89501,
|
|
ABSORB_SPELL = 89505,
|
|
RANGED_HASTE_SPELL = 89507,
|
|
SPELL_RUNE_TAP = 48982,
|
|
SPELL_LIFE_STEAL = 20004,
|
|
IPP_PHASE = 89509,
|
|
IPP_PHASE_II = 89511,
|
|
IPP_PHASE_III = 89513
|
|
};
|
|
|
|
enum ProgressionQuestIDs
|
|
{
|
|
QUEST_TROLL_NECKLACE = 2881,
|
|
QUEST_MORROWGRAIN = 3803,
|
|
QUEST_DEADWOOD = 6221,
|
|
QUEST_WINTERFALL = 6241,
|
|
QUEST_THE_ANCIENT_LEAF = 7632,
|
|
MIGHT_OF_KALIMDOR = 8742,
|
|
INTO_THE_BREACH = 10259,
|
|
BANG_A_GONG = 108743,
|
|
CHAOS_AND_DESTRUCTION = 108744
|
|
};
|
|
|
|
enum ProgressionAchievements
|
|
{
|
|
KEL_THUZAD_40_KILL = 533,
|
|
KEL_THUZAD_KILL = 575, // WotLK
|
|
ONYXIAS_KILL = 684,
|
|
NEFARIAN_KILL = 685,
|
|
RAGNAROS_KILL = 686,
|
|
C_THUN_KILL = 687,
|
|
MALCHEZAAR_KILL = 690,
|
|
ZUL_JIN_KILL = 691,
|
|
KAEL_THAS_KILL = 696,
|
|
ILLIDAN_KILL = 697,
|
|
KIL_JAEDEN_KILL = 698,
|
|
ANUB_ARAK_KILL = 3916,
|
|
LICH_KING_KILL = 4597,
|
|
HALION_KILL = 4815
|
|
};
|
|
|
|
enum ProgressionZones
|
|
{
|
|
ZONE_AZUREMYST = 3524,
|
|
ZONE_BLOODMYST = 3525,
|
|
ZONE_GHOSTLANDS = 3433,
|
|
ZONE_EVERSONG = 3430,
|
|
ZONE_EXODAR = 3557,
|
|
ZONE_SILVERMOON = 3487,
|
|
ZONE_QUELDANAS = 4080,
|
|
ZONE_VEILED_SEA = 3479
|
|
};
|
|
|
|
enum ProgressionAreas
|
|
{
|
|
AREA_THE_DARK_PORTAL = 72,
|
|
AREA_DREADMAUL_ROCK = 249,
|
|
AREA_RUINS_OF_THAURISSAN = 250,
|
|
AREA_BLACKROCK_MOUNTAIN = 254,
|
|
AREA_SERADANE = 356,
|
|
AREA_BOUGH_SHADOW = 438,
|
|
AREA_GROVE_OF_THE_ANCIENTS = 448,
|
|
AREA_WILDBEND_RIVER = 454,
|
|
AREA_TWILIGHT_GROVE = 856,
|
|
AREA_PURGATION_ISLE = 896,
|
|
AREA_GADGETZAN = 976,
|
|
AREA_DREAM_BOUGH = 1111,
|
|
AREA_JADEMIR_LAKE = 1112,
|
|
AREA_THE_SHATTERED_STRAND = 1228,
|
|
AREA_SOUTHRIDGE_BEACH = 1231,
|
|
AREA_HALDARR_ENCAMPMENT = 1236,
|
|
AREA_DREADMAUL_HOLD = 1437,
|
|
AREA_DREADMAUL_POST = 1439,
|
|
AREA_SERPENTS_COIL = 1440,
|
|
AREA_VALLEY_OF_HEROES = 1611,
|
|
AREA_IRONTREE_WOOD = 1767,
|
|
AREA_BROKEN_PILLAR = 1938,
|
|
AREA_ABYSSAL_SANDS = 1939,
|
|
AREA_TWILIGHT_VALE = 2077,
|
|
AREA_FROSTSABER_ROCK = 2241,
|
|
AREA_TIMBERMAW_POST = 2243,
|
|
AREA_MAZTHORIL = 2245,
|
|
AREA_ICE_THISTLE_HILLS = 2247,
|
|
AREA_THE_MARRIS_STEAD = 2260,
|
|
AREA_LIGHTS_HOPE = 2268,
|
|
AREA_DRACO_DAR = 2421,
|
|
AREA_RISE_OF_THE_DEFILER = 2517,
|
|
AREA_PESTILENT_SCAR = 2622,
|
|
AREA_HIVE_ASHI = 2742,
|
|
AREA_HIVE_ZORA = 2743,
|
|
AREA_HIVE_REGAL = 2744,
|
|
AREA_ARGENT_SUNREAVER_PAVILION = 4666,
|
|
AREA_ARGENT_SILVER_COVENANT_PAVILION = 4667,
|
|
AREA_ARGENT_PAVILION = 4674
|
|
};
|
|
|
|
enum ProgressionSettings
|
|
{
|
|
SETTING_PROGRESSION_STATE = 0
|
|
};
|
|
|
|
enum DungeonKeys
|
|
{
|
|
ITEM_DRAKEFIRE_AMULET = 16309
|
|
};
|
|
|
|
enum ProgressionState : uint8 // Progression stands for what has been completed
|
|
{
|
|
PROGRESSION_START = 0,
|
|
PROGRESSION_MOLTEN_CORE = 1, // BWL available
|
|
PROGRESSION_ONYXIA = 2,
|
|
PROGRESSION_BLACKWING_LAIR = 3, // ZG, AQ War effort, AQ quest line
|
|
PROGRESSION_PRE_AQ = 4, // AQ gates open, raids available, AQ outdoors war
|
|
PROGRESSION_AQ_WAR = 5, // AQ gates open, raids, Field Duty quests and all Cenarion Hold npcs available
|
|
PROGRESSION_AQ = 6, // Naxx40 and Scourge Invasion
|
|
PROGRESSION_NAXX40 = 7, // Into the Breach
|
|
PROGRESSION_PRE_TBC = 8, // Karazhan, Gruul's Lair, Magtheridon's Lair
|
|
PROGRESSION_TBC_TIER_1 = 9, // Serpentshrine Cavern, Tempest Keep
|
|
PROGRESSION_TBC_TIER_2 = 10, // Hyjal Summit and Black Temple
|
|
PROGRESSION_TBC_TIER_3 = 11, // Zul'Aman
|
|
PROGRESSION_TBC_TIER_4 = 12, // Sunwell Plateau
|
|
PROGRESSION_TBC_TIER_5 = 13, // WotLK Naxx, EoE, OS
|
|
PROGRESSION_WOTLK_TIER_1 = 14, // Ulduar
|
|
PROGRESSION_WOTLK_TIER_2 = 15, // TotC
|
|
PROGRESSION_WOTLK_TIER_3 = 16, // ICC
|
|
PROGRESSION_WOTLK_TIER_4 = 17, // Ruby Sanctum
|
|
PROGRESSION_WOTLK_TIER_5 = 18
|
|
};
|
|
|
|
enum RandomDungeonIds : uint16
|
|
{
|
|
// Values from LFGDungeons.dbc
|
|
RDF_CLASSIC = 258,
|
|
RDF_THE_BURNING_CRUSADE = 259,
|
|
RDF_THE_BURNING_CRUSADE_HEROIC = 260,
|
|
RDF_WRATH_OF_THE_LICH_KING = 261,
|
|
RDF_WRATH_OF_THE_LICH_KING_HEROIC = 262
|
|
};
|
|
|
|
struct IppPvPTitles
|
|
{
|
|
uint32 RequiredKills;
|
|
uint32 TitleId;
|
|
};
|
|
|
|
struct IppPvPTitleData
|
|
{
|
|
uint32 TitleId[2];
|
|
};
|
|
|
|
struct PvPTitleData
|
|
{
|
|
uint32 TitleId[2];
|
|
};
|
|
|
|
enum IppRanks
|
|
{ // A H
|
|
RANK_ONE = 0, // Private & Scout
|
|
RANK_TWO = 1, // Corporal & Grunt
|
|
RANK_THREE = 2, // Sergeant & Sergeant
|
|
RANK_FOUR = 3, // Master Sergeant & Senior Sergeant
|
|
RANK_FIVE = 4, // Sergeant Major & First Sergeant
|
|
RANK_SIX = 5, // Knight & Stone Guard
|
|
RANK_SEVEN = 6, // Knight Lieutenant & Blood Guard
|
|
RANK_EIGHT = 7, // Knight Captain & Legionnaire
|
|
RANK_NINE = 8, // Knight Champion & Centurion
|
|
RANK_TEN = 9, // Lieutenant Commander & Champion
|
|
RANK_ELEVEN = 10, // Commander & Lieutenant General
|
|
RANK_TWELVE = 11, // Marshal & General
|
|
RANK_THIRTEEN = 12, // Field Marshal & Warlord
|
|
RANK_FOURTEEN = 13 // Grand Marshal & High Warlord
|
|
};
|
|
|
|
enum PvPAchievements
|
|
{
|
|
// Alliance
|
|
ACHIEVEMENT_PRIVATE = 442,
|
|
ACHIEVEMENT_CORPORAL = 470,
|
|
ACHIEVEMENT_SERGEANT = 471,
|
|
ACHIEVEMENT_MASTER_SERGEANT = 441,
|
|
ACHIEVEMENT_SERGEANT_MAJOR = 440,
|
|
ACHIEVEMENT_KNIGHT = 439,
|
|
ACHIEVEMENT_KNIGHT_LIEUTENANT = 472,
|
|
ACHIEVEMENT_KNIGHT_CAPTAIN = 438,
|
|
ACHIEVEMENT_KNIGHT_CHAMPION = 437,
|
|
ACHIEVEMENT_LIEUTENANT_COMMANDER = 436,
|
|
ACHIEVEMENT_COMMANDER = 435,
|
|
ACHIEVEMENT_MARSHAL = 473,
|
|
ACHIEVEMENT_FIELD_MARSHAL = 434,
|
|
ACHIEVEMENT_GRAND_MARSHAL = 433,
|
|
|
|
// Horde
|
|
ACHIEVEMENT_SCOUT = 454,
|
|
ACHIEVEMENT_GRUNT = 468,
|
|
ACHIEVEMENT_SERGEANT_H = 453,
|
|
ACHIEVEMENT_SENIOR_SERGEANT = 450,
|
|
ACHIEVEMENT_FIRST_SERGEANT = 452,
|
|
ACHIEVEMENT_STONE_GUARD = 451,
|
|
ACHIEVEMENT_BLOOD_GUARD = 449,
|
|
ACHIEVEMENT_LEGIONNAIRE = 469,
|
|
ACHIEVEMENT_CENTURION = 448,
|
|
ACHIEVEMENT_CHAMPION = 447,
|
|
ACHIEVEMENT_LIEUTENANT_GENERAL = 444,
|
|
ACHIEVEMENT_GENERAL = 446,
|
|
ACHIEVEMENT_WARLORD = 445,
|
|
ACHIEVEMENT_HIGH_WARLORD = 443
|
|
};
|
|
|
|
enum IppTitles
|
|
{
|
|
// Alliance
|
|
PRIVATE = 1,
|
|
CORPORAL = 2,
|
|
SERGEANT = 3,
|
|
MASTER_SERGEANT = 4,
|
|
SERGEANT_MAJOR = 5,
|
|
KNIGHT = 6,
|
|
KNIGHT_LIEUTENANT = 7,
|
|
KNIGHT_CAPTAIN = 8,
|
|
KNIGHT_CHAMPION = 9,
|
|
LIEUTENANT_COMMANDER = 10,
|
|
COMMANDER = 11,
|
|
MARSHAL = 12,
|
|
FIELD_MARSHAL = 13,
|
|
GRAND_MARSHAL = 14,
|
|
|
|
// Horde
|
|
SCOUT = 15,
|
|
GRUNT = 16,
|
|
SERGEANT_H = 17,
|
|
SENIOR_SERGEANT = 18,
|
|
FIRST_SERGEANT = 19,
|
|
STONE_GUARD = 20,
|
|
BLOOD_GUARD = 21,
|
|
LEGIONNAIRE = 22,
|
|
CENTURION = 23,
|
|
CHAMPION = 24,
|
|
LIEUTENANT_GENERAL = 25,
|
|
GENERAL = 26,
|
|
WARLORD = 27,
|
|
HIGH_WARLORD = 28
|
|
};
|
|
|
|
IppPvPTitleData const TitleData[14] =
|
|
{
|
|
{ PRIVATE, SCOUT },
|
|
{ CORPORAL, GRUNT },
|
|
{ SERGEANT, SERGEANT_H },
|
|
{ MASTER_SERGEANT, SENIOR_SERGEANT },
|
|
{ SERGEANT_MAJOR, FIRST_SERGEANT },
|
|
{ KNIGHT, STONE_GUARD },
|
|
{ KNIGHT_LIEUTENANT, BLOOD_GUARD },
|
|
{ KNIGHT_CAPTAIN, LEGIONNAIRE },
|
|
{ KNIGHT_CHAMPION, CENTURION },
|
|
{ LIEUTENANT_COMMANDER, CHAMPION },
|
|
{ COMMANDER, LIEUTENANT_GENERAL },
|
|
{ MARSHAL, GENERAL },
|
|
{ FIELD_MARSHAL, WARLORD },
|
|
{ GRAND_MARSHAL, HIGH_WARLORD }
|
|
};
|
|
|
|
PvPTitleData const AchievementData[14] =
|
|
{
|
|
{ ACHIEVEMENT_PRIVATE, ACHIEVEMENT_SCOUT },
|
|
{ ACHIEVEMENT_CORPORAL, ACHIEVEMENT_GRUNT },
|
|
{ ACHIEVEMENT_SERGEANT, ACHIEVEMENT_SERGEANT_H },
|
|
{ ACHIEVEMENT_MASTER_SERGEANT, ACHIEVEMENT_SENIOR_SERGEANT },
|
|
{ ACHIEVEMENT_SERGEANT_MAJOR, ACHIEVEMENT_FIRST_SERGEANT },
|
|
{ ACHIEVEMENT_KNIGHT, ACHIEVEMENT_STONE_GUARD },
|
|
{ ACHIEVEMENT_KNIGHT_LIEUTENANT, ACHIEVEMENT_BLOOD_GUARD },
|
|
{ ACHIEVEMENT_KNIGHT_CAPTAIN, ACHIEVEMENT_LEGIONNAIRE },
|
|
{ ACHIEVEMENT_KNIGHT_CHAMPION, ACHIEVEMENT_CENTURION },
|
|
{ ACHIEVEMENT_LIEUTENANT_COMMANDER, ACHIEVEMENT_CHAMPION },
|
|
{ ACHIEVEMENT_COMMANDER, ACHIEVEMENT_LIEUTENANT_GENERAL },
|
|
{ ACHIEVEMENT_MARSHAL, ACHIEVEMENT_GENERAL },
|
|
{ ACHIEVEMENT_FIELD_MARSHAL, ACHIEVEMENT_WARLORD },
|
|
{ ACHIEVEMENT_GRAND_MARSHAL, ACHIEVEMENT_HIGH_WARLORD }
|
|
};
|
|
|
|
class IndividualProgression
|
|
{
|
|
public:
|
|
static IndividualProgression* instance();
|
|
|
|
std::map<uint32, uint8> customProgressionMap;
|
|
questXpMapType questXpMap;
|
|
float vanillaPowerAdjustment, vanillaHealthAdjustment, tbcPowerAdjustment, tbcHealthAdjustment, vanillaHealingAdjustment, tbcHealingAdjustment;
|
|
bool enabled, questXpFix, hunterPetLevelFix, enforceGroupRules, fishingFix, simpleConfigOverride, questMoneyAtLevelCap, repeatableVanillaQuestsXp, disableDefaultProgression, earlyDungeonSet2, requireNaxxStrath, DisableRDF, excludeAccounts, VanillaPvpTitlesKeepPostVanilla, VanillaPvpTitlesEarnPostVanilla;
|
|
int progressionLimit, startingProgression, tbcRacesProgressionLevel, deathKnightProgressionLevel, deathKnightStartingProgression;
|
|
uint32 VanillaPvpKillRank1, VanillaPvpKillRank2, VanillaPvpKillRank3, VanillaPvpKillRank4, VanillaPvpKillRank5, VanillaPvpKillRank6, VanillaPvpKillRank7, VanillaPvpKillRank8, VanillaPvpKillRank9, VanillaPvpKillRank10, VanillaPvpKillRank11, VanillaPvpKillRank12, VanillaPvpKillRank13, VanillaPvpKillRank14;
|
|
std::string excludedAccountsRegex;
|
|
|
|
bool hasPassedProgression(Player* player, ProgressionState state) const;
|
|
static bool isBeforeProgression(Player* player, ProgressionState state) ;
|
|
void UpdateProgressionState(Player* player, ProgressionState newState) const;
|
|
static void ForceUpdateProgressionState(Player* player, ProgressionState newState);
|
|
void CheckAdjustments(Player* player) const;
|
|
void ApplyGearStatsTuning(Player* player, float& computedAdjustment, ItemTemplate const* item) const;
|
|
void AdjustVanillaStats(Player* player) const;
|
|
void AdjustTBCStats(Player* player) const;
|
|
void AdjustWotLKStats(Player* player) const;
|
|
bool hasCustomProgressionValue(uint32 creatureEntry);
|
|
bool isExcludedFromProgression(Player* player);
|
|
bool isAttuned(Player* player);
|
|
void checkIPProgression(Player* player);
|
|
void UpdateProgressionQuests(Player* player);
|
|
void UpdateProgressionAchievements(Player* player, uint16 achievementID);
|
|
void checkKillProgression(Player* player, Creature* killed);
|
|
void CleanUpVanillaPvpTitles(Player* player);
|
|
void AwardEarnedVanillaPvpTitles(Player* player);
|
|
static void LoadCustomProgressionEntries(const std::string& customProgressionString);
|
|
static void RemovePlayerAchievement(uint16 playerGUID, uint16 achievementId);
|
|
static void AdjustStats(Player* player, float computedPowerAdjustment, float computedHealthAdjustment);
|
|
static float ComputeVanillaAdjustment(uint8 playerLevel, float configAdjustmentValue);
|
|
static uint8 GetAccountProgression(uint32 accountId);
|
|
};
|
|
|
|
#define sIndividualProgression IndividualProgression::instance()
|
|
|
|
#endif //AZEROTHCORE_INDIVIDUALPROGRESSION_H
|