Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- Old PVP Rank System Edited by spgm Member of Trinitycore for 3.3.3 Rev 8499
- diff --git a/src/server/game/Entities/Player/Player.cpp
- --- a/src/server/game/Entities/Player/Player.cpp
- +++ b/src/server/game/Entities/Player/Player.cpp
- @@ -6517,7 +6517,7 @@
- uint64 victim_guid = 0;
- uint32 victim_rank = 0;
- - //uint32 rank_diff = 0;
- + uint32 rank_diff = 0;
- //time_t now = time(NULL);
- // need call before fields update to have chance move yesterday data to appropriate fields before today data change.
- @@ -6553,21 +6553,50 @@
- // [15..28] Horde honor titles and player name
- // [29..38] Other title and player name
- // [39+] Nothing
- - uint32 victim_title = pVictim->GetUInt32Value(PLAYER_CHOSEN_TITLE);
- - // Get Killer titles, CharTitlesEntry::bit_index
- + // PLAYER__FIELD_KNOWN_TITLES describe which titles player can use,
- + // so we must find biggest pvp title , even for killer to find extra honor value
- + uint32 vtitle = pVictim->GetUInt32Value(PLAYER__FIELD_KNOWN_TITLES);
- + uint32 victim_title = 0;
- + uint32 ktitle = GetUInt32Value(PLAYER__FIELD_KNOWN_TITLES);
- + uint32 killer_title = 0;
- + if (PLAYER_TITLE_MASK_ALL_PVP & ktitle)
- + {
- + for (int i = ((GetTeam() == ALLIANCE) ? 1:HKRANKMAX);i!=((GetTeam() == ALLIANCE) ? HKRANKMAX : (2*HKRANKMAX-1));i++)
- + {
- + if (ktitle & (1<<i))
- + killer_title = i;
- + }
- + }
- + if (PLAYER_TITLE_MASK_ALL_PVP & vtitle)
- + {
- + for (int i = ((pVictim->GetTeam() == ALLIANCE) ? 1:HKRANKMAX);i!=((pVictim->GetTeam() == ALLIANCE) ? HKRANKMAX : (2*HKRANKMAX-1));i++)
- + {
- + if (vtitle & (1<<i))
- + victim_title = i;
- + }
- + }
- + // Get Killer titles, CharTitlesEntry::bit_index
- // Ranks:
- // title[1..14] -> rank[5..18]
- // title[15..28] -> rank[5..18]
- // title[other] -> 0
- if (victim_title == 0)
- victim_guid = 0; // Don't show HK: <rank> message, only log.
- - else if (victim_title < 15)
- + else if (victim_title < HKRANKMAX)
- victim_rank = victim_title + 4;
- - else if (victim_title < 29)
- - victim_rank = victim_title - 14 + 4;
- + else if (victim_title < (2*HKRANKMAX-1))
- + victim_rank = victim_title - (HKRANKMAX-1) + 4;
- else
- victim_guid = 0; // Don't show HK: <rank> message, only log.
- - }
- +
- + // now find rank difference
- + if (killer_title == 0 && victim_rank>4)
- + rank_diff = victim_rank - 4;
- + else if (killer_title < HKRANKMAX)
- + rank_diff = (victim_rank>(killer_title + 4))? (victim_rank - (killer_title + 4)) : 0;
- + else if (killer_title < (2*HKRANKMAX-1))
- + rank_diff = (victim_rank>(killer_title - (HKRANKMAX-1) +4))? (victim_rank - (killer_title - (HKRANKMAX-1) + 4)) : 0;
- + }
- k_grey = Trinity::XP::GetGrayLevel(k_level);
- @@ -6580,7 +6609,7 @@
- honor = ((f * diff_level * (190 + v_rank*10))/6);
- honor *= ((float)k_level) / 21.50537f; //factor of dependence on levels of the killer
- -
- + honor *= 1 + sWorld.getRate(RATE_PVP_RANK_EXTRA_HONOR)*(((float)rank_diff) / 10.0f);
- // count the number of playerkills in one day
- ApplyModUInt32Value(PLAYER_FIELD_KILLS, 1, true);
- // and those in a lifetime
- @@ -6588,6 +6617,7 @@
- UpdateAchievementCriteria(ACHIEVEMENT_CRITERIA_TYPE_EARN_HONORABLE_KILL);
- UpdateAchievementCriteria(ACHIEVEMENT_CRITERIA_TYPE_HK_CLASS, pVictim->getClass());
- UpdateAchievementCriteria(ACHIEVEMENT_CRITERIA_TYPE_HK_RACE, pVictim->getRace());
- + UpdateKnownTitles();
- }
- else
- {
- @@ -6675,6 +6705,30 @@
- return true;
- }
- +void Player::UpdateKnownTitles()
- +{
- + uint32 new_title = 0;
- + uint32 honor_kills = GetUInt32Value(PLAYER_FIELD_LIFETIME_HONORABLE_KILLS);
- + uint32 old_title = GetUInt32Value(PLAYER_CHOSEN_TITLE);
- + RemoveFlag64(PLAYER__FIELD_KNOWN_TITLES,PLAYER_TITLE_MASK_ALL_PVP);
- + if (honor_kills < 0)
- + return;
- + bool max_rank = ((honor_kills >= sWorld.pvp_ranks[HKRANKMAX-1]) ? true : false);
- + for (int i = HKRANK01; i != HKRANKMAX; ++i)
- + {
- + if (honor_kills < sWorld.pvp_ranks[i] || (max_rank))
- + {
- + new_title = ((max_rank) ? (HKRANKMAX-1) : (i-1));
- + if (new_title > 0)
- + new_title += ((GetTeam() == ALLIANCE) ? 0 : (HKRANKMAX-1));
- + break;
- + }
- + }
- + SetFlag64(PLAYER__FIELD_KNOWN_TITLES,uint64(1) << new_title);
- + if (old_title > 0 && old_title < (2*HKRANKMAX-1) && new_title > old_title)
- + SetUInt32Value(PLAYER_CHOSEN_TITLE,new_title);
- +}
- +
- void Player::ModifyHonorPoints(int32 value)
- {
- if (value < 0)
- diff --git a/src/server/game/Entities/Player/Player.h b/src/server/game/Entities/Player/Player.h
- --- a/src/server/game/Entities/Player/Player.h
- +++ b/src/server/game/Entities/Player/Player.h
- @@ -454,6 +454,27 @@
- PLAYER_FLAGS_NO_XP_GAIN = 0x02000000
- };
- +#define PLAYER_TITLE_MASK_ALLIANCE_PVP \
- + (PLAYER_TITLE_PRIVATE | PLAYER_TITLE_CORPORAL | \
- + PLAYER_TITLE_SERGEANT_A | PLAYER_TITLE_MASTER_SERGEANT | \
- + PLAYER_TITLE_SERGEANT_MAJOR | PLAYER_TITLE_KNIGHT | \
- + PLAYER_TITLE_KNIGHT_LIEUTENANT | PLAYER_TITLE_KNIGHT_CAPTAIN | \
- + PLAYER_TITLE_KNIGHT_CHAMPION | PLAYER_TITLE_LIEUTENANT_COMMANDER | \
- + PLAYER_TITLE_COMMANDER | PLAYER_TITLE_MARSHAL | \
- + PLAYER_TITLE_FIELD_MARSHAL | PLAYER_TITLE_GRAND_MARSHAL)
- +
- +#define PLAYER_TITLE_MASK_HORDE_PVP \
- + (PLAYER_TITLE_SCOUT | PLAYER_TITLE_GRUNT | \
- + PLAYER_TITLE_SERGEANT_H | PLAYER_TITLE_SENIOR_SERGEANT | \
- + PLAYER_TITLE_FIRST_SERGEANT | PLAYER_TITLE_STONE_GUARD | \
- + PLAYER_TITLE_BLOOD_GUARD | PLAYER_TITLE_LEGIONNAIRE | \
- + PLAYER_TITLE_CENTURION | PLAYER_TITLE_CHAMPION | \
- + PLAYER_TITLE_LIEUTENANT_GENERAL | PLAYER_TITLE_GENERAL | \
- + PLAYER_TITLE_WARLORD | PLAYER_TITLE_HIGH_WARLORD)
- +
- +#define PLAYER_TITLE_MASK_ALL_PVP \
- + (PLAYER_TITLE_MASK_ALLIANCE_PVP | PLAYER_TITLE_MASK_HORDE_PVP)
- +
- // used for PLAYER__FIELD_KNOWN_TITLES field (uint64), (1<<bit_index) without (-1)
- // can't use enum for uint64 values
- #define PLAYER_TITLE_DISABLED UI64LIT(0x0000000000000000)
- @@ -1943,6 +1964,7 @@
- void ModifyHonorPoints(int32 value);
- void ModifyArenaPoints(int32 value);
- uint32 GetMaxPersonalArenaRatingRequirement(uint32 minarenaslot);
- + void UpdateKnownTitles();
- //End of PvP System
- diff --git a/src/server/game/World/World.cpp b/src/server/game/World/World.cpp
- --- a/src/server/game/World/World.cpp
- +++ b/src/server/game/World/World.cpp
- @@ -854,6 +854,18 @@
- m_configs[CONFIG_START_ARENA_POINTS],m_configs[CONFIG_MAX_ARENA_POINTS],m_configs[CONFIG_MAX_ARENA_POINTS]);
- m_configs[CONFIG_START_ARENA_POINTS] = m_configs[CONFIG_MAX_ARENA_POINTS];
- }
- + rate_values[RATE_PVP_RANK_EXTRA_HONOR] = sConfig.GetFloatDefault("PvPRank.Rate.ExtraHonor", 1);
- + std::string s_pvp_ranks = sConfig.GetStringDefault("PvPRank.HKPerRank", "10,50,100,200,450,750,1300,2000,3500,6000,9500,15000,21000,30000");
- + char *c_pvp_ranks = const_cast<char*>(s_pvp_ranks.c_str());
- + for (int i = 0; i !=HKRANKMAX; i++)
- + {
- + if (i==0)
- + pvp_ranks[0] = 0;
- + else if (i==1)
- + pvp_ranks[1] = atoi(strtok (c_pvp_ranks, ","));
- + else
- + pvp_ranks[i] = atoi(strtok (NULL, ","));
- + }
- m_configs[CONFIG_ALL_TAXI_PATHS] = sConfig.GetBoolDefault("AllFlightPaths", false);
- m_configs[CONFIG_INSTANT_TAXI] = sConfig.GetBoolDefault("InstantFlightPaths", false);
- diff --git a/src/server/game/World/World.h b/src/server/game/World/World.h
- --- a/src/server/game/World/World.h
- +++ b/src/server/game/World/World.h
- @@ -343,6 +343,7 @@
- RATE_DURABILITY_LOSS_PARRY,
- RATE_DURABILITY_LOSS_ABSORB,
- RATE_DURABILITY_LOSS_BLOCK,
- + RATE_PVP_RANK_EXTRA_HONOR,
- RATE_MOVESPEED,
- MAX_RATES
- };
- @@ -346,6 +347,26 @@
- RATE_MOVESPEED,
- MAX_RATES
- };
- +
- +enum HonorKillPvPRank
- +{
- + HKRANK00,
- + HKRANK01,
- + HKRANK02,
- + HKRANK03,
- + HKRANK04,
- + HKRANK05,
- + HKRANK06,
- + HKRANK07,
- + HKRANK08,
- + HKRANK09,
- + HKRANK10,
- + HKRANK11,
- + HKRANK12,
- + HKRANK13,
- + HKRANK14,
- + HKRANKMAX
- +};
- /// Can be used in SMSG_AUTH_RESPONSE packet
- enum BillingPlanFlags
- @@ -580,6 +601,8 @@
- void SendZoneText(uint32 zone, const char *text, WorldSession *self = 0, uint32 team = 0);
- void SendServerMessage(ServerMessageType type, const char *text = "", Player* player = NULL);
- + uint32 pvp_ranks[HKRANKMAX];
- +
- /// Are we in the middle of a shutdown?
- bool IsShutdowning() const { return m_ShutdownTimer > 0; }
- void ShutdownServ(uint32 time, uint32 options, uint8 exitcode);
Add Comment
Please, Sign In to add comment