|
Регистрация | Файлы | Правила | Альбомы | Дневники | Справка | Пользователи | Календарь | Поиск | Сообщения за день | Все разделы прочитаны |
Моды Неофициальная модификация ядра MaNGOS, собственные наработки, расширение функционала |
|
Опции темы | Поиск в этой теме | Опции просмотра |
|
09.03.2010, 13:30 | #1 |
Новичок
Регистрация: 07.03.2010
Сообщений: 17
Сказал(а) спасибо: 10
Поблагодарили 14 раз(а) в 4 сообщениях
|
[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 |
14.03.2010, 14:48 | #2 |
Гость
Сообщений: 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 |
Новичок
Регистрация: 07.03.2010
Сообщений: 13
Сказал(а) спасибо: 100
Поблагодарили 9 раз(а) в 6 сообщениях
|
почему у titleEntry нет проверки на NULL ?
Последний раз редактировалось Ranger; 14.03.2010 в 15:15. |
14.03.2010, 15:29 | #4 |
YTDB Dev
Регистрация: 06.03.2010
Сообщений: 259
Сказал(а) спасибо: 28
Поблагодарили 280 раз(а) в 136 сообщениях
|
Нашел у себя еще одну версию, автора, к сожалению, не помню...
Код:
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)) |
Пользователь сказал cпасибо: | Hantet (24.04.2010) |
Опции темы | Поиск в этой теме |
Опции просмотра | |
|
|
Похожие темы | ||||
Тема | Автор | Раздел | Ответов | Последнее сообщение |
[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 |