Ru-MaNGOS

Ru-MaNGOS (http://mangos.ytdb.ru/index.php)
-   Моды (http://mangos.ytdb.ru/forumdisplay.php?f=8)
-   -   [mod] PvP Ranks & Titles (http://mangos.ytdb.ru/showthread.php?t=176)

Dimitrius 09.03.2010 13:30

[mod] PvP Ranks & Titles
 
Патч добавляет поддержку титульных рангов за убийства, приносящие честь. По достижении нового титула, старый удаляется и присваивается новый.
Оригинальный автор мне не известен, Mr.Grom на гетмангос.ком выложил код, который послужил основой для моего скрипта.
Тема на гетмангосе - http://getmangos.com/community/showt...p-Ranks-Titles

Сам патч:
Код:

diff --git a/src/game/Player.cpp b/src/game/Player.cpp
index f8ececd..df26f92 100644
--- a/src/game/Player.cpp
+++ b/src/game/Player.cpp
@@ -6140,6 +6140,44 @@ void Player::UpdateHonorFields()
    }
 
    m_lastHonorUpdateTime = now;
+
+    uint32 HonorKills = GetUInt32Value(PLAYER_FIELD_LIFETIME_HONORBALE_KILLS);
+    uint32 victim_rank = 0;
+
+    if (HonorKills == 0)
+        return;
+
+    if (HonorKills >= 100 && HonorKills < 200)
+        victim_rank = 1;
+    else if (HonorKills >= 200 && HonorKills < 500)
+        victim_rank = 2;
+    else if (HonorKills >= 500 && HonorKills < 1000)
+        victim_rank = 3;
+    else if (HonorKills >= 1000 && HonorKills < 1500)
+        victim_rank = 4;
+    else if (HonorKills >= 1500 && HonorKills < 2000)
+        victim_rank = 5;
+    else if (HonorKills >= 2000 && HonorKills < 2500)
+        victim_rank = 6;
+    else if (HonorKills >= 2500 && HonorKills < 3000)
+      victim_rank = 7;
+    else if (HonorKills >= 3000 && HonorKills < 3500)
+        victim_rank = 8;
+    else if (HonorKills >= 3500 && HonorKills < 4000)
+        victim_rank = 9;
+    else if (HonorKills >= 4000 && HonorKills < 4500)
+        victim_rank = 10;
+    else if (HonorKills >= 4500 && HonorKills < 5000)
+        victim_rank = 11;
+    else if (HonorKills >= 5000 && HonorKills < 5500)
+        victim_rank = 12;
+    else if (HonorKills >= 5500 && HonorKills < 8000)
+        victim_rank = 13;
+    else if (HonorKills >= 8000)
+        victim_rank = 14;
+
+    if (victim_rank == 0)
+        return;
+
+    if (GetTeam() == HORDE && victim_rank != 0)
+        victim_rank += 14;
+
+    CharTitlesEntry const* titleEntry = sCharTitlesStore.LookupEntry(victim_rank);
+    if (!HasTitle(titleEntry))
+        SetTitle(titleEntry);
+    else
+        return;
+
+    SetUInt32Value(PLAYER_CHOSEN_TITLE,victim_rank);
+
+    uint32 startid = 1;
+    if (GetTeam() == HORDE)
+        startid = 15;
+
+    for(int i = startid; i < victim_rank; ++i)
+    {
+        if (i == victim_rank)
+            break;
+        else
+        {
+            if (!HasTitle(titleEntry))
+                continue;
+            else
+            {
+                CharTitlesEntry const* titleEntry = sCharTitlesStore.LookupEntry(i);
+                SetTitle(titleEntry,true);
+            }
+        }
+    }
 }
 
 ///Calculate the amount of honor gained based on the victim


Cheburator 14.03.2010 14:48

Может быть есть смысл немного сократить код? а точнее вот эту часть
Код:

if (HonorKills == 0)
+        return;
+
+    if (HonorKills >= 100 && HonorKills < 200)
+        victim_rank = 1;
+    else if (HonorKills >= 200 && HonorKills < 500)
+        victim_rank = 2;
+    else if (HonorKills >= 500 && HonorKills < 1000)
+        victim_rank = 3;
+    else if (HonorKills >= 1000 && HonorKills < 1500)
+        victim_rank = 4;
+    else if (HonorKills >= 1500 && HonorKills < 2000)
+        victim_rank = 5;
+    else if (HonorKills >= 2000 && HonorKills < 2500)
+        victim_rank = 6;
+    else if (HonorKills >= 2500 && HonorKills < 3000)
+      victim_rank = 7;
+    else if (HonorKills >= 3000 && HonorKills < 3500)
+        victim_rank = 8;
+    else if (HonorKills >= 3500 && HonorKills < 4000)
+        victim_rank = 9;
+    else if (HonorKills >= 4000 && HonorKills < 4500)
+        victim_rank = 10;
+    else if (HonorKills >= 4500 && HonorKills < 5000)
+        victim_rank = 11;
+    else if (HonorKills >= 5000 && HonorKills < 5500)
+        victim_rank = 12;
+    else if (HonorKills >= 5500 && HonorKills < 8000)
+        victim_rank = 13;
+    else if (HonorKills >= 8000)
+        victim_rank = 14;
+
+    if (victim_rank == 0)
+        return;
+

убрав лишнии условия получим
Код:

if (HonorKills < 100)
+        return;
+
+    if (HonorKills < 200)
+        victim_rank = 1;
+    else if (HonorKills < 500)
+        victim_rank = 2;
+    else if (HonorKills < 1000)
+        victim_rank = 3;
+    else if (HonorKills < 1500)
+        victim_rank = 4;
+    else if (HonorKills < 2000)
+        victim_rank = 5;
+    else if (HonorKills < 2500)
+        victim_rank = 6;
+    else if (HonorKills < 3000)
+      victim_rank = 7;
+    else if (HonorKills < 3500)
+        victim_rank = 8;
+    else if (HonorKills < 4000)
+        victim_rank = 9;
+    else if (HonorKills < 4500)
+        victim_rank = 10;
+    else if (HonorKills < 5000)
+        victim_rank = 11;
+    else if (HonorKills < 5500)
+        victim_rank = 12;
+    else if (HonorKills < 8000)
+        victim_rank = 13;
+    else victim_rank = 14;
+


Ranger 14.03.2010 15:10

почему у titleEntry нет проверки на NULL ?

NeatElves 14.03.2010 15:29

Нашел у себя еще одну версию, автора, к сожалению, не помню...
Код:

diff --git a/src/game/Player.cpp b/src/game/Player.cpp
index 8cedbab..554a5cd 100644
--- a/src/game/Player.cpp
+++ b/src/game/Player.cpp
@@ -14581,6 +14664,98 @@ bool Player::LoadFromDB( uint32 guid, SqlQueryHolder *holder )
 
    m_social = sSocialMgr.LoadFromDB(holder->GetResult(PLAYER_LOGIN_QUERY_LOADSOCIALLIST), GetGUIDLow());
 
+    //new titles system
+    if (uint32 hks = GetUInt32Value(PLAYER_FIELD_LIFETIME_HONORBALE_KILLS))
+    {
+        uint64 titles = GetUInt64Value(PLAYER__FIELD_KNOWN_TITLES);
+
+        //clear all prevous hk titles
+        titles &= ~0xFFFFFFF;
+
+        uint64 newTitle = 0;
+
+        if (GetTeam() == ALLIANCE)
+        {
+            if (hks > 0 && hks < 200)
+                newTitle |= PLAYER_TITLE_PRIVATE;
+            else if (hks >= 200 && hks < 500)
+                newTitle |= PLAYER_TITLE_CORPORAL;
+            else if (hks >= 500 && hks < 1000)
+                newTitle |= PLAYER_TITLE_SERGEANT_A;
+            else if (hks >= 1000 && hks < 1500)
+                newTitle |= PLAYER_TITLE_MASTER_SERGEANT;
+            else if (hks >= 1500 && hks < 2000)
+                newTitle |= PLAYER_TITLE_SERGEANT_MAJOR;
+            else if (hks >= 2000 && hks < 2500)
+                newTitle |= PLAYER_TITLE_KNIGHT;
+            else if (hks >= 2500 && hks < 3000)
+                newTitle |= PLAYER_TITLE_KNIGHT_LIEUTENANT;
+            else if (hks >= 3000 && hks < 3500)
+                newTitle |= PLAYER_TITLE_KNIGHT_CAPTAIN;
+            else if (hks >= 3500 && hks < 4000)
+                newTitle |= PLAYER_TITLE_KNIGHT_CHAMPION;
+            else if (hks >= 4000 && hks < 4500)
+                newTitle |= PLAYER_TITLE_LIEUTENANT_COMMANDER;
+            else if (hks >= 4500 && hks < 5000)
+                newTitle |= PLAYER_TITLE_COMMANDER;
+            else if (hks >= 5000 && hks < 5500)
+                newTitle |= PLAYER_TITLE_MARSHAL;
+            else if (hks >= 5500 && hks < 8000)
+                newTitle |= PLAYER_TITLE_FIELD_MARSHAL;
+            else if (hks >= 8000)
+                newTitle |= PLAYER_TITLE_GRAND_MARSHAL;
+        } else
+        {
+            if (hks > 0 && hks < 200)
+                newTitle |= PLAYER_TITLE_SCOUT;
+            else if (hks >= 200 && hks < 500)
+                newTitle |= PLAYER_TITLE_GRUNT;
+            else if (hks >= 500 && hks < 1000)
+                newTitle |= PLAYER_TITLE_SERGEANT_H;
+            else if (hks >= 1000 && hks < 1500)
+                newTitle |= PLAYER_TITLE_SENIOR_SERGEANT;
+            else if (hks >= 1500 && hks < 2000)
+                newTitle |= PLAYER_TITLE_FIRST_SERGEANT;
+            else if (hks >= 2000 && hks < 2500)
+                newTitle |= PLAYER_TITLE_STONE_GUARD;
+            else if (hks >= 2500 && hks < 3000)
+                newTitle |= PLAYER_TITLE_BLOOD_GUARD;
+            else if (hks >= 3000 && hks < 3500)
+                newTitle |= PLAYER_TITLE_LEGIONNAIRE;
+            else if (hks >= 3500 && hks < 4000)
+                newTitle |= PLAYER_TITLE_CENTURION;
+            else if (hks >= 4000 && hks < 4500)
+                newTitle |= PLAYER_TITLE_CHAMPION;
+            else if (hks >= 4500 && hks < 5000)
+                newTitle |= PLAYER_TITLE_LIEUTENANT_GENERAL;
+            else if (hks >= 5000 && hks < 5500)
+                newTitle |= PLAYER_TITLE_GENERAL;
+            else if (hks >= 5500 && hks < 8000)
+                newTitle |= PLAYER_TITLE_WARLORD;
+            else if (hks >= 8000)
+                newTitle |= PLAYER_TITLE_HIGH_WARLORD;
+        }
+
+        titles |= newTitle;
+
+        SetUInt64Value(PLAYER__FIELD_KNOWN_TITLES, titles);
+        uint64 chosen = uint64(1) << GetUInt32Value(PLAYER_CHOSEN_TITLE);
+        if (chosen <= PLAYER_TITLE_HIGH_WARLORD)
+        {
+            //refresh PLAYER_CHOSEN_TITLE
+          uint32 bitPos = 0;
+
+            //determine bit position
+            if (newTitle > 0)
+            {
+                while (uint64(1) << ++bitPos != newTitle && bitPos < sizeof(newTitle) * 8);
+
+                SetUInt32Value(PLAYER_CHOSEN_TITLE, bitPos);
+            }
+        }
+
+    }
+
    // check PLAYER_CHOSEN_TITLE compatibility with PLAYER__FIELD_KNOWN_TITLES
    // note: PLAYER__FIELD_KNOWN_TITLES updated at quest status loaded
    if(uint32 curTitle = GetUInt32Value(PLAYER_CHOSEN_TITLE))



Текущее время: 17:45. Часовой пояс GMT +3.

ru-mangos.ru - Русское сообщество MaNGOS