Guest User

Untitled

a guest
May 24th, 2018
108
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 9.63 KB | None | 0 0
  1. Old PVP Rank System Edited by spgm Member of Trinitycore for 3.3.3 Rev 8499
  2. diff --git a/src/server/game/Entities/Player/Player.cpp
  3. --- a/src/server/game/Entities/Player/Player.cpp
  4. +++ b/src/server/game/Entities/Player/Player.cpp
  5. @@ -6517,7 +6517,7 @@
  6.  
  7.      uint64 victim_guid = 0;
  8.      uint32 victim_rank = 0;
  9. -    //uint32 rank_diff = 0;
  10. +    uint32 rank_diff = 0;
  11.      //time_t now = time(NULL);
  12.  
  13.      // need call before fields update to have chance move yesterday data to appropriate fields before today data change.
  14. @@ -6553,21 +6553,50 @@
  15.                  //  [15..28] Horde honor titles and player name
  16.                  //  [29..38] Other title and player name
  17.                  //  [39+]    Nothing
  18. -                uint32 victim_title = pVictim->GetUInt32Value(PLAYER_CHOSEN_TITLE);
  19. -                                                            // Get Killer titles, CharTitlesEntry::bit_index
  20. +                // PLAYER__FIELD_KNOWN_TITLES describe which titles player can use,
  21. +                // so we must find biggest pvp title , even for killer to find extra honor value
  22. +                uint32 vtitle = pVictim->GetUInt32Value(PLAYER__FIELD_KNOWN_TITLES);
  23. +                uint32 victim_title = 0;
  24. +                uint32 ktitle = GetUInt32Value(PLAYER__FIELD_KNOWN_TITLES);
  25. +                uint32 killer_title = 0;
  26. +                if (PLAYER_TITLE_MASK_ALL_PVP & ktitle)
  27. +                {
  28. +                    for (int i = ((GetTeam() == ALLIANCE) ? 1:HKRANKMAX);i!=((GetTeam() == ALLIANCE) ? HKRANKMAX : (2*HKRANKMAX-1));i++)
  29. +                    {
  30. +                        if (ktitle & (1<<i))
  31. +                            killer_title = i;
  32. +                    }
  33. +                }
  34. +                if (PLAYER_TITLE_MASK_ALL_PVP & vtitle)
  35. +                {
  36. +                    for (int i = ((pVictim->GetTeam() == ALLIANCE) ? 1:HKRANKMAX);i!=((pVictim->GetTeam() == ALLIANCE) ? HKRANKMAX : (2*HKRANKMAX-1));i++)
  37. +                    {
  38. +                        if (vtitle & (1<<i))
  39. +                            victim_title = i;
  40. +                    }
  41. +                }
  42. +                // Get Killer titles, CharTitlesEntry::bit_index
  43.                  // Ranks:
  44.                  //  title[1..14]  -> rank[5..18]
  45.                  //  title[15..28] -> rank[5..18]
  46.                  //  title[other]  -> 0
  47.                  if (victim_title == 0)
  48.                      victim_guid = 0;                        // Don't show HK: <rank> message, only log.
  49. -                else if (victim_title < 15)
  50. +                else if (victim_title < HKRANKMAX)
  51.                      victim_rank = victim_title + 4;
  52. -                else if (victim_title < 29)
  53. -                    victim_rank = victim_title - 14 + 4;
  54. +                else if (victim_title < (2*HKRANKMAX-1))
  55. +                    victim_rank = victim_title - (HKRANKMAX-1) + 4;
  56.                  else
  57.                      victim_guid = 0;                        // Don't show HK: <rank> message, only log.
  58. -            }
  59. +
  60. +                // now find rank difference
  61. +                if (killer_title == 0 && victim_rank>4)
  62. +                    rank_diff = victim_rank - 4;
  63. +                else if (killer_title < HKRANKMAX)
  64. +                    rank_diff = (victim_rank>(killer_title + 4))? (victim_rank - (killer_title + 4)) : 0;
  65. +                else if (killer_title < (2*HKRANKMAX-1))
  66. +                    rank_diff = (victim_rank>(killer_title - (HKRANKMAX-1) +4))? (victim_rank - (killer_title - (HKRANKMAX-1) + 4)) : 0;
  67. +  }
  68.  
  69.              k_grey = Trinity::XP::GetGrayLevel(k_level);
  70.  
  71. @@ -6580,7 +6609,7 @@
  72.  
  73.              honor = ((f * diff_level * (190 + v_rank*10))/6);
  74.              honor *= ((float)k_level) / 21.50537f;              //factor of dependence on levels of the killer
  75. -
  76. +            honor *= 1 + sWorld.getRate(RATE_PVP_RANK_EXTRA_HONOR)*(((float)rank_diff) / 10.0f);
  77.              // count the number of playerkills in one day
  78.              ApplyModUInt32Value(PLAYER_FIELD_KILLS, 1, true);
  79.              // and those in a lifetime
  80. @@ -6588,6 +6617,7 @@
  81.              UpdateAchievementCriteria(ACHIEVEMENT_CRITERIA_TYPE_EARN_HONORABLE_KILL);
  82.              UpdateAchievementCriteria(ACHIEVEMENT_CRITERIA_TYPE_HK_CLASS, pVictim->getClass());
  83.              UpdateAchievementCriteria(ACHIEVEMENT_CRITERIA_TYPE_HK_RACE, pVictim->getRace());
  84. +            UpdateKnownTitles();
  85.          }
  86.          else
  87.          {
  88. @@ -6675,6 +6705,30 @@
  89.      return true;
  90.  }
  91.  
  92. +void Player::UpdateKnownTitles()
  93. +{
  94. +    uint32 new_title = 0;
  95. +    uint32 honor_kills = GetUInt32Value(PLAYER_FIELD_LIFETIME_HONORABLE_KILLS);
  96. +    uint32 old_title = GetUInt32Value(PLAYER_CHOSEN_TITLE);
  97. +    RemoveFlag64(PLAYER__FIELD_KNOWN_TITLES,PLAYER_TITLE_MASK_ALL_PVP);
  98. +    if (honor_kills < 0)
  99. +        return;
  100. +    bool max_rank = ((honor_kills >= sWorld.pvp_ranks[HKRANKMAX-1]) ? true : false);
  101. +    for (int i = HKRANK01; i != HKRANKMAX; ++i)
  102. +    {
  103. +        if (honor_kills < sWorld.pvp_ranks[i] || (max_rank))
  104. +        {
  105. +            new_title = ((max_rank) ? (HKRANKMAX-1) : (i-1));
  106. +            if (new_title > 0)
  107. +                new_title += ((GetTeam() == ALLIANCE) ? 0 : (HKRANKMAX-1));
  108. +            break;
  109. +        }
  110. +    }
  111. +    SetFlag64(PLAYER__FIELD_KNOWN_TITLES,uint64(1) << new_title);
  112. +    if (old_title > 0 && old_title < (2*HKRANKMAX-1) && new_title > old_title)
  113. +        SetUInt32Value(PLAYER_CHOSEN_TITLE,new_title);
  114. +}
  115. +
  116.  void Player::ModifyHonorPoints(int32 value)
  117.  {
  118.      if (value < 0)
  119. diff --git a/src/server/game/Entities/Player/Player.h b/src/server/game/Entities/Player/Player.h
  120. --- a/src/server/game/Entities/Player/Player.h
  121. +++ b/src/server/game/Entities/Player/Player.h
  122. @@ -454,6 +454,27 @@
  123.      PLAYER_FLAGS_NO_XP_GAIN     = 0x02000000
  124.  };
  125.  
  126. +#define PLAYER_TITLE_MASK_ALLIANCE_PVP             \
  127. +    (PLAYER_TITLE_PRIVATE | PLAYER_TITLE_CORPORAL |  \
  128. +      PLAYER_TITLE_SERGEANT_A | PLAYER_TITLE_MASTER_SERGEANT | \
  129. +      PLAYER_TITLE_SERGEANT_MAJOR | PLAYER_TITLE_KNIGHT | \
  130. +      PLAYER_TITLE_KNIGHT_LIEUTENANT | PLAYER_TITLE_KNIGHT_CAPTAIN | \
  131. +      PLAYER_TITLE_KNIGHT_CHAMPION | PLAYER_TITLE_LIEUTENANT_COMMANDER | \
  132. +      PLAYER_TITLE_COMMANDER | PLAYER_TITLE_MARSHAL | \
  133. +      PLAYER_TITLE_FIELD_MARSHAL | PLAYER_TITLE_GRAND_MARSHAL)
  134. +
  135. +#define PLAYER_TITLE_MASK_HORDE_PVP                           \
  136. +    (PLAYER_TITLE_SCOUT | PLAYER_TITLE_GRUNT |  \
  137. +      PLAYER_TITLE_SERGEANT_H | PLAYER_TITLE_SENIOR_SERGEANT | \
  138. +      PLAYER_TITLE_FIRST_SERGEANT | PLAYER_TITLE_STONE_GUARD | \
  139. +      PLAYER_TITLE_BLOOD_GUARD | PLAYER_TITLE_LEGIONNAIRE | \
  140. +      PLAYER_TITLE_CENTURION | PLAYER_TITLE_CHAMPION | \
  141. +      PLAYER_TITLE_LIEUTENANT_GENERAL | PLAYER_TITLE_GENERAL | \
  142. +      PLAYER_TITLE_WARLORD | PLAYER_TITLE_HIGH_WARLORD)
  143. +
  144. +#define PLAYER_TITLE_MASK_ALL_PVP  \
  145. +    (PLAYER_TITLE_MASK_ALLIANCE_PVP | PLAYER_TITLE_MASK_HORDE_PVP)
  146. +
  147.  // used for PLAYER__FIELD_KNOWN_TITLES field (uint64), (1<<bit_index) without (-1)
  148.  // can't use enum for uint64 values
  149.  #define PLAYER_TITLE_DISABLED              UI64LIT(0x0000000000000000)
  150. @@ -1943,6 +1964,7 @@
  151.          void ModifyHonorPoints(int32 value);
  152.          void ModifyArenaPoints(int32 value);
  153.          uint32 GetMaxPersonalArenaRatingRequirement(uint32 minarenaslot);
  154. +        void UpdateKnownTitles();
  155.  
  156.          //End of PvP System
  157.  
  158. diff --git a/src/server/game/World/World.cpp b/src/server/game/World/World.cpp
  159. --- a/src/server/game/World/World.cpp
  160. +++ b/src/server/game/World/World.cpp
  161. @@ -854,6 +854,18 @@
  162.              m_configs[CONFIG_START_ARENA_POINTS],m_configs[CONFIG_MAX_ARENA_POINTS],m_configs[CONFIG_MAX_ARENA_POINTS]);
  163.          m_configs[CONFIG_START_ARENA_POINTS] = m_configs[CONFIG_MAX_ARENA_POINTS];
  164.      }
  165. +    rate_values[RATE_PVP_RANK_EXTRA_HONOR] = sConfig.GetFloatDefault("PvPRank.Rate.ExtraHonor", 1);
  166. +    std::string s_pvp_ranks = sConfig.GetStringDefault("PvPRank.HKPerRank", "10,50,100,200,450,750,1300,2000,3500,6000,9500,15000,21000,30000");
  167. +    char *c_pvp_ranks = const_cast<char*>(s_pvp_ranks.c_str());
  168. +    for (int i = 0; i !=HKRANKMAX; i++)
  169. +    {
  170. +        if (i==0)
  171. +            pvp_ranks[0] = 0;
  172. +        else if (i==1)
  173. +            pvp_ranks[1] = atoi(strtok (c_pvp_ranks, ","));
  174. +        else
  175. +            pvp_ranks[i] = atoi(strtok (NULL, ","));
  176. +    }
  177.  
  178.      m_configs[CONFIG_ALL_TAXI_PATHS] = sConfig.GetBoolDefault("AllFlightPaths", false);
  179.      m_configs[CONFIG_INSTANT_TAXI] = sConfig.GetBoolDefault("InstantFlightPaths", false);
  180. diff --git a/src/server/game/World/World.h b/src/server/game/World/World.h
  181. --- a/src/server/game/World/World.h
  182. +++ b/src/server/game/World/World.h
  183. @@ -343,6 +343,7 @@
  184.      RATE_DURABILITY_LOSS_PARRY,
  185.      RATE_DURABILITY_LOSS_ABSORB,
  186.      RATE_DURABILITY_LOSS_BLOCK,
  187. +    RATE_PVP_RANK_EXTRA_HONOR,  
  188.      RATE_MOVESPEED,
  189.      MAX_RATES
  190.  };
  191. @@ -346,6 +347,26 @@
  192.      RATE_MOVESPEED,
  193.      MAX_RATES
  194.  };
  195. +  
  196. +enum HonorKillPvPRank
  197. +{
  198. +    HKRANK00,
  199. +    HKRANK01,
  200. +    HKRANK02,
  201. +    HKRANK03,
  202. +    HKRANK04,
  203. +    HKRANK05,
  204. +    HKRANK06,
  205. +    HKRANK07,
  206. +    HKRANK08,
  207. +    HKRANK09,
  208. +    HKRANK10,
  209. +    HKRANK11,
  210. +    HKRANK12,
  211. +    HKRANK13,
  212. +    HKRANK14,
  213. +    HKRANKMAX
  214. +};
  215.  
  216.  /// Can be used in SMSG_AUTH_RESPONSE packet
  217.  enum BillingPlanFlags
  218. @@ -580,6 +601,8 @@
  219.          void SendZoneText(uint32 zone, const char *text, WorldSession *self = 0, uint32 team = 0);
  220.          void SendServerMessage(ServerMessageType type, const char *text = "", Player* player = NULL);
  221.  
  222. +        uint32 pvp_ranks[HKRANKMAX];
  223. +
  224.          /// Are we in the middle of a shutdown?
  225.          bool IsShutdowning() const { return m_ShutdownTimer > 0; }
  226.          void ShutdownServ(uint32 time, uint32 options, uint8 exitcode);
Add Comment
Please, Sign In to add comment