Ru-MaNGOS

Вернуться   Ru-MaNGOS > Ядро > Модификации ядра > Моды

Важная информация

Моды Неофициальная модификация ядра MaNGOS, собственные наработки, расширение функционала

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
Старый 09.03.2010, 13:30   #1
Dimitrius
Новичок
 
Регистрация: 07.03.2010
Сообщений: 17
Сказал(а) спасибо: 10
Поблагодарили 14 раз(а) в 4 сообщениях
Dimitrius На верном пути
По умолчанию [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
Dimitrius вне форума   Ответить с цитированием
10 пользователя(ей) сказали cпасибо:
Hantet (10.03.2010), PSZ (09.03.2010), rootor (09.03.2010), StinK (11.03.2010)
Старый 14.03.2010, 14:48   #2
Cheburator
Гость
 
Сообщений: n/a
По умолчанию

Может быть есть смысл немного сократить код? а точнее вот эту часть
Код:
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;
+

Последний раз редактировалось Cheburator; 15.03.2010 в 12:11.
  Ответить с цитированием
Старый 14.03.2010, 15:10   #3
Ranger
Новичок
 
Регистрация: 07.03.2010
Сообщений: 13
Сказал(а) спасибо: 100
Поблагодарили 9 раз(а) в 6 сообщениях
Ranger На верном пути
По умолчанию

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

Последний раз редактировалось Ranger; 14.03.2010 в 15:15.
Ranger вне форума   Ответить с цитированием
Старый 14.03.2010, 15:29   #4
NeatElves
YTDB Dev
 
Аватар для NeatElves
 
Регистрация: 06.03.2010
Сообщений: 259
Сказал(а) спасибо: 28
Поблагодарили 280 раз(а) в 136 сообщениях
NeatElves Как самоцвет среди гранитаNeatElves Как самоцвет среди гранитаNeatElves Как самоцвет среди гранита
По умолчанию

Нашел у себя еще одну версию, автора, к сожалению, не помню...
Код:
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))
NeatElves вне форума   Ответить с цитированием
Пользователь сказал cпасибо:
Hantet (24.04.2010)
Ответ

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
[10476] Fix 31228 and ranks newsbot CMaNGOS Commits 0 12.09.2010 19:00
Implement 49220 and ranks newsbot CMaNGOS Commits 0 15.06.2010 15:30
[9834] Fix damage bonus applying from 49471 and ranks to 49143 and ranks newsbot CMaNGOS Commits 0 04.05.2010 17:20
[9646] Really restore titles from data_backup table. newsbot CMaNGOS Commits 0 31.03.2010 01:22
[9632] Restore load/save known titles. newsbot CMaNGOS Commits 0 28.03.2010 00:12


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


ru-mangos.ru - Русское сообщество MaNGOS
Главная цель проекта MaNGOS - обучающая, поэтому разрешается использовать исходный код и собранную программу только для образовательных целей.
Вы не можете использовать MaNGOS в коммерческих целях, а также не разрешается устанавливать публичные серверы на базе MaNGOS.
Любое копирование материалов, информации в любом виде без указания источника - форума Ru-MaNGOS будет считаться нарушением авторских прав и нарушением Уголовного Кодекса РФ, ст. 146 ст. 147.
Перевод vBulletin: zCarot