找回密码
 立即注册
搜索
热搜: 活动 交友 discuz
查看: 57|回复: 0

魔兽世界Trinity服务端的PVP的头衔系统335WOTLK(适用于T端版本)

[复制链接]
发表于 2024-11-12 21:44:44 | 显示全部楼层 |阅读模式
魔兽世界Trinity服务端的PVP的头衔系统335WOTLK(适用于T端版本)
  1. From 9136b138a82b3e14bfc47407c0a0728e9a7eefa0 Mon Sep 17 00:00:00 2001From: LordPsyan <[email protected]>
  2. Date: Tue, 8 Feb 2011 02:57:50 -0500
  3. Subject: [PATCH] 11185-PVPRanks

  4. ---
  5. src/server/game/Entities/Player/Player.cpp |   81 ++++++++++++++++++++++++---
  6. src/server/game/Entities/Player/Player.h   |   22 ++++++++
  7. src/server/game/World/World.cpp            |   12 ++++
  8. src/server/game/World/World.h              |   23 ++++++++
  9. 4 files changed, 129 insertions(+), 9 deletions(-)

  10. diff --git a/src/server/game/Entities/Player/Player.cpp b/src/server/game/Entities/Player/Player.cpp
  11. index a6a8e9a..4e1fa09 100755
  12. --- a/src/server/game/Entities/Player/Player.cpp
  13. +++ b/src/server/game/Entities/Player/Player.cpp
  14. @@ -6867,6 +6867,7 @@ bool Player::RewardHonor(Unit *uVictim, uint32 groupsize, int32 honor, bool pvpt

  15.      uint64 victim_guid = 0;
  16.      uint32 victim_rank = 0;
  17. +        uint32 rank_diff = 0;

  18.      // need call before fields update to have chance move yesterday data to appropriate fields before today data change.
  19.      UpdateHonorFields();
  20. @@ -6911,17 +6912,54 @@ bool Player::RewardHonor(Unit *uVictim, uint32 groupsize, int32 honor, bool pvpt
  21.              //  title[1..14]  -> rank[5..18]
  22.              //  title[15..28] -> rank[5..18]
  23.              //  title[other]  -> 0
  24. -            if (victim_title == 0)
  25. -                victim_guid = 0;                        // Don't show HK: <rank> message, only log.
  26. -            else if (victim_title < 15)
  27. -                victim_rank = victim_title + 4;
  28. -            else if (victim_title < 29)
  29. -                victim_rank = victim_title - 14 + 4;
  30. -            else
  31. -                victim_guid = 0;                        // Don't show HK: <rank> message, only log.
  32. +                // PLAYER__FIELD_KNOWN_TITLES describe which titles player can use,
  33. +                // so we must find biggest pvp title , even for killer to find extra honor value
  34. +                uint32 vtitle = pVictim->GetUInt32Value(PLAYER__FIELD_KNOWN_TITLES);
  35. +                //uint32 victim_title = 0;
  36. +                uint32 ktitle = GetUInt32Value(PLAYER__FIELD_KNOWN_TITLES);
  37. +                uint32 killer_title = 0;
  38. +                if (PLAYER_TITLE_MASK_ALL_PVP & ktitle)
  39. +                {
  40. +                    for (int i = ((GetTeam() == ALLIANCE) ? 1:HKRANKMAX);i!=((GetTeam() == ALLIANCE) ? HKRANKMAX : (2*HKRANKMAX-1));i++)
  41. +                    {
  42. +                        if (ktitle & (1<<i))
  43. +                            killer_title = i;
  44. +                    }
  45. +                }
  46. +                if (PLAYER_TITLE_MASK_ALL_PVP & vtitle)
  47. +                {
  48. +                    for (int i = ((pVictim->GetTeam() == ALLIANCE) ? 1:HKRANKMAX);i!=((pVictim->GetTeam() == ALLIANCE) ? HKRANKMAX : (2*HKRANKMAX-1));i++)
  49. +                    {
  50. +                        if (vtitle & (1<<i))
  51. +                            victim_title = i;
  52. +                    }
  53. +                }

  54. -            honor_f = ceil(Trinity::Honor::hk_honor_at_level_f(k_level) * (v_level - k_grey) / (k_level - k_grey));
  55. +                // Get Killer titles, CharTitlesEntry::bit_index
  56. +                // Ranks:
  57. +                //  title[1..14]  -> rank[5..18]
  58. +                //  title[15..28] -> rank[5..18]
  59. +                //  title[other]  -> 0
  60. +                if (victim_title == 0)
  61. +                    victim_guid = 0;                        // Don't show HK: <rank> message, only log.
  62. +                else if (victim_title < HKRANKMAX)
  63. +                    victim_rank = victim_title + 4;
  64. +                else if (victim_title < (2*HKRANKMAX-1))
  65. +                    victim_rank = victim_title - (HKRANKMAX-1) + 4;
  66. +                else
  67. +                    victim_guid = 0;                        // Don't show HK: <rank> message, only log.
  68. +
  69. +                // now find rank difference
  70. +                if (killer_title == 0 && victim_rank>4)
  71. +                    rank_diff = victim_rank - 4;
  72. +                else if (killer_title < HKRANKMAX)
  73. +                    rank_diff = (victim_rank>(killer_title + 4))? (victim_rank - (killer_title + 4)) : 0;
  74. +                else if (killer_title < (2*HKRANKMAX-1))
  75. +                    rank_diff = (victim_rank>(killer_title - (HKRANKMAX-1) +4))? (victim_rank - (killer_title - (HKRANKMAX-1) + 4)) : 0;

  76. +
  77. +            honor_f = ceil(Trinity::Honor::hk_honor_at_level_f(k_level) * (v_level - k_grey) / (k_level - k_grey));
  78. +                        honor *= 1 + sWorld->getRate(RATE_PVP_RANK_EXTRA_HONOR)*(((float)rank_diff) / 10.0f);
  79.              // count the number of playerkills in one day
  80.              ApplyModUInt32Value(PLAYER_FIELD_KILLS, 1, true);
  81.              // and those in a lifetime
  82. @@ -6929,6 +6967,7 @@ bool Player::RewardHonor(Unit *uVictim, uint32 groupsize, int32 honor, bool pvpt
  83.              UpdateAchievementCriteria(ACHIEVEMENT_CRITERIA_TYPE_EARN_HONORABLE_KILL);
  84.              UpdateAchievementCriteria(ACHIEVEMENT_CRITERIA_TYPE_HK_CLASS, pVictim->getClass());
  85.              UpdateAchievementCriteria(ACHIEVEMENT_CRITERIA_TYPE_HK_RACE, pVictim->getRace());
  86. +                        UpdateKnownTitles();
  87.              UpdateAchievementCriteria(ACHIEVEMENT_CRITERIA_TYPE_HONORABLE_KILL_AT_AREA, GetAreaId());
  88.              UpdateAchievementCriteria(ACHIEVEMENT_CRITERIA_TYPE_HONORABLE_KILL, 1, 0, pVictim);
  89.          }
  90. @@ -7004,6 +7043,30 @@ bool Player::RewardHonor(Unit *uVictim, uint32 groupsize, int32 honor, bool pvpt
  91.      return true;
  92. }

  93. +void Player::UpdateKnownTitles()
  94. +{
  95. +    uint32 new_title = 0;
  96. +    uint32 honor_kills = GetUInt32Value(PLAYER_FIELD_LIFETIME_HONORABLE_KILLS);
  97. +    uint32 old_title = GetUInt32Value(PLAYER_CHOSEN_TITLE);
  98. +    RemoveFlag64(PLAYER__FIELD_KNOWN_TITLES,PLAYER_TITLE_MASK_ALL_PVP);
  99. +    if (honor_kills < 0)
  100. +        return;
  101. +    bool max_rank = ((honor_kills >= sWorld->pvp_ranks[HKRANKMAX-1]) ? true : false);
  102. +    for (int i = HKRANK01; i != HKRANKMAX; ++i)
  103. +    {
  104. +        if (honor_kills < sWorld->pvp_ranks || (max_rank))
  105. +        {
  106. +            new_title = ((max_rank) ? (HKRANKMAX-1) : (i-1));
  107. +            if (new_title > 0)
  108. +                new_title += ((GetTeam() == ALLIANCE) ? 0 : (HKRANKMAX-1));
  109. +            break;
  110. +        }
  111. +    }
  112. +    SetFlag64(PLAYER__FIELD_KNOWN_TITLES,uint64(1) << new_title);
  113. +    if (old_title > 0 && old_title < (2*HKRANKMAX-1) && new_title > old_title)
  114. +        SetUInt32Value(PLAYER_CHOSEN_TITLE,new_title);
  115. +}
  116. +
  117. void Player::ModifyHonorPoints(int32 value)
  118. {
  119.      if (value < 0)
  120. diff --git a/src/server/game/Entities/Player/Player.h b/src/server/game/Entities/Player/Player.h
  121. index a4f5b42..93f365a 100755
  122. --- a/src/server/game/Entities/Player/Player.h
  123. +++ b/src/server/game/Entities/Player/Player.h
  124. @@ -386,6 +386,27 @@ enum PlayerFlags
  125.      PLAYER_FLAGS_NO_XP_GAIN     = 0x02000000
  126. };

  127. +#define PLAYER_TITLE_MASK_ALLIANCE_PVP             \
  128. +    (PLAYER_TITLE_PRIVATE | PLAYER_TITLE_CORPORAL |  \
  129. +      PLAYER_TITLE_SERGEANT_A | PLAYER_TITLE_MASTER_SERGEANT | \
  130. +      PLAYER_TITLE_SERGEANT_MAJOR | PLAYER_TITLE_KNIGHT | \
  131. +      PLAYER_TITLE_KNIGHT_LIEUTENANT | PLAYER_TITLE_KNIGHT_CAPTAIN | \
  132. +      PLAYER_TITLE_KNIGHT_CHAMPION | PLAYER_TITLE_LIEUTENANT_COMMANDER | \
  133. +      PLAYER_TITLE_COMMANDER | PLAYER_TITLE_MARSHAL | \
  134. +      PLAYER_TITLE_FIELD_MARSHAL | PLAYER_TITLE_GRAND_MARSHAL)
  135. +
  136. +#define PLAYER_TITLE_MASK_HORDE_PVP                           \
  137. +    (PLAYER_TITLE_SCOUT | PLAYER_TITLE_GRUNT |  \
  138. +      PLAYER_TITLE_SERGEANT_H | PLAYER_TITLE_SENIOR_SERGEANT | \
  139. +      PLAYER_TITLE_FIRST_SERGEANT | PLAYER_TITLE_STONE_GUARD | \
  140. +      PLAYER_TITLE_BLOOD_GUARD | PLAYER_TITLE_LEGIONNAIRE | \
  141. +      PLAYER_TITLE_CENTURION | PLAYER_TITLE_CHAMPION | \
  142. +      PLAYER_TITLE_LIEUTENANT_GENERAL | PLAYER_TITLE_GENERAL | \
  143. +      PLAYER_TITLE_WARLORD | PLAYER_TITLE_HIGH_WARLORD)
  144. +
  145. +#define PLAYER_TITLE_MASK_ALL_PVP  \
  146. +    (PLAYER_TITLE_MASK_ALLIANCE_PVP | PLAYER_TITLE_MASK_HORDE_PVP)
  147. +
  148. // used for PLAYER__FIELD_KNOWN_TITLES field (uint64), (1<<bit_index) without (-1)
  149. // can't use enum for uint64 values
  150. #define PLAYER_TITLE_DISABLED              UI64LIT(0x0000000000000000)
  151. @@ -1961,6 +1982,7 @@ class Player : public Unit, public GridObject<Player>
  152.          void ModifyHonorPoints(int32 value);
  153.          void ModifyArenaPoints(int32 value);
  154.          uint32 GetMaxPersonalArenaRatingRequirement(uint32 minarenaslot);
  155. +                void UpdateKnownTitles();
  156.          void SetHonorPoints(uint32 value)
  157.          {
  158.              SetUInt32Value(PLAYER_FIELD_HONOR_CURRENCY, value);
  159. diff --git a/src/server/game/World/World.cpp b/src/server/game/World/World.cpp
  160. index ab5071a..433fccf 100755
  161. --- a/src/server/game/World/World.cpp
  162. +++ b/src/server/game/World/World.cpp
  163. @@ -844,6 +844,18 @@ void World::LoadConfigSettings(bool reload)
  164.          sLog->outError("MinPetitionSigns (%i) must be in range 0..9. Set to 9.", m_int_configs[CONFIG_MIN_PETITION_SIGNS]);
  165.          m_int_configs[CONFIG_MIN_PETITION_SIGNS] = 9;
  166.      }
  167. +    rate_values[RATE_PVP_RANK_EXTRA_HONOR] = sConfig->GetFloatDefault("PvPRank.Rate.ExtraHonor", 1);
  168. +    std::string s_pvp_ranks = sConfig->GetStringDefault("PvPRank.HKPerRank", "10,50,100,200,450,750,1300,2000,3500,6000,9500,15000,21000,30000");
  169. +    char *c_pvp_ranks = const_cast<char*>(s_pvp_ranks.c_str());
  170. +    for (int i = 0; i !=HKRANKMAX; i++)
  171. +    {
  172. +        if (i==0)
  173. +            pvp_ranks[0] = 0;
  174. +        else if (i==1)
  175. +            pvp_ranks[1] = atoi(strtok (c_pvp_ranks, ","));
  176. +        else
  177. +            pvp_ranks = atoi(strtok (NULL, ","));
  178. +    }

  179.      m_int_configs[CONFIG_GM_LOGIN_STATE]        = sConfig->GetIntDefault("GM.LoginState", 2);
  180.      m_int_configs[CONFIG_GM_VISIBLE_STATE]      = sConfig->GetIntDefault("GM.Visible", 2);
  181. diff --git a/src/server/game/World/World.h b/src/server/game/World/World.h
  182. index 7e052ed..783cffa 100755
  183. --- a/src/server/game/World/World.h
  184. +++ b/src/server/game/World/World.h
  185. @@ -378,10 +378,31 @@ enum Rates
  186.      RATE_DURABILITY_LOSS_PARRY,
  187.      RATE_DURABILITY_LOSS_ABSORB,
  188.      RATE_DURABILITY_LOSS_BLOCK,
  189. +    RATE_PVP_RANK_EXTRA_HONOR,
  190.      RATE_MOVESPEED,
  191.      MAX_RATES
  192. };

  193. +enum HonorKillPvPRank
  194. +{
  195. +    HKRANK00,
  196. +    HKRANK01,
  197. +    HKRANK02,
  198. +    HKRANK03,
  199. +    HKRANK04,
  200. +    HKRANK05,
  201. +    HKRANK06,
  202. +    HKRANK07,
  203. +    HKRANK08,
  204. +    HKRANK09,
  205. +    HKRANK10,
  206. +    HKRANK11,
  207. +    HKRANK12,
  208. +    HKRANK13,
  209. +    HKRANK14,
  210. +    HKRANKMAX
  211. +};
  212. +
  213. /// Can be used in SMSG_AUTH_RESPONSE packet
  214. enum BillingPlanFlags
  215. {
  216. @@ -628,6 +649,8 @@ class World
  217.          void SendZoneText(uint32 zone, const char *text, WorldSession *self = 0, uint32 team = 0);
  218.          void SendServerMessage(ServerMessageType type, const char *text = "", Player* player = NULL);

  219. +        uint32 pvp_ranks[HKRANKMAX];
  220. +
  221.          /// Are we in the middle of a shutdown?
  222.          bool IsShutdowning() const { return m_ShutdownTimer > 0; }
  223.          void ShutdownServ(uint32 time, uint32 options, uint8 exitcode);
  224. --
  225. 1.7.2.3
复制代码

Archiver|手机版|小黑屋|网单游戏

GMT+8, 2026-11-6 16:19 , Processed in 0.043365 second(s), 15 queries .

Powered by Discuz! X3.5

© 2001-2026 Discuz! Team.

快速回复 返回顶部 返回列表