STALKER |
Дата: Пятница, 02.03.2012, 16:35 | Сообщение # 1 Offline |
| Доброго времени суток уважаемые пользователи портала!
Сегодня я расскажу вам как скомпилировать ядро и создать на его основе полноценную сборку TrinityCore Нам понадобится:
Visual C++ 2010. Express или Visual C++ 2008 Express - Платформа, на которой будет компилиться ядро .NET Framework 3.5 - возможно он у вас установленный, т.к. идёт установка вместе с Windows MySQL - сервер вашей базы данных, рекомендую использовать версии выше 5.х.х Git - c помощью него сможем качать исходники, и накатывать патчи Cmake - программа для построения проекта и подготовки исходного кода непосредственно к процессу компиляции. OpenSSL - система сокетов, создающая ключи RSA, DH, DSA Navicat - программа для управления MeSQL, проще говоря база данных
После того как скачаете и установите софт, приступаем к компиляции 1. Скачивание исходников. 1. Скачайте Git и установите на компьютер Создайте в любом вам удобном месте каталог TrinityCore, например D:\TrinityCore\ и на нем ПКМ вызовите контекстном меню. После чего выберите пункт Git Bash Here. На экране появится консоль, туда вводите Code git clone git://github.com/TrinityCore/TrinityCore.git Началось скачивание исходников По завершению в папке TrinityCore появятся исходники. После скачивания, я лично переименовываю папку с исходниками в source (для удобства) Исходники скачали 2.Накатывание патчей Установка патчей производится с помощью программы Git. Сейчас накатим патч на звания, чтобы за определённое кол-во убийств давали определённое звание(все патчи пишутся в С++) Code # HG changeset patch -- Bitbucket.org # Project EasyCore # URL [url]http://bitbucket.org/easytrinity/easycore/overview[/url] # User easytrinity <admin@likenet.ru] # Date 1285770323 -14400 # Node ID ccb906b16695e1f93c91ea9d6f173f60968b9c45 # Parent 9696c9e8cca39bf0626faaf07240ed434d2df805 added PvP Rank system --- a/src/server/game/World/World.cpp +++ b/src/server/game/World/World.cpp @@ -862,6 +862,18 @@ void World::LoadConfigSettings(bool relo sLog.outError("MinPetitionSigns (%i) must be in range 0..9. Set to 9.", m_int_configs[CONFIG_MIN_PETITION_SIGNS]); m_int_configs[CONFIG_MIN_PETITION_SIGNS]=9; } + rate_values[RATE_PVP_RANK_EXTRA_HONOR]=sConfig.GetFloatDefault("PvPRank.Rate.ExtraHonor", 1); + std::string s_pvp_ranks=sConfig.GetStringDefault("PvPRank.HKPerRank", "10,50,100,200,450,750,1300,2000,3500,6000,9500,15000,21000,30000"); + char *c_pvp_ranks=const_cast<char*](s_pvp_ranks.c_str()); + for (int i=0; i !=HKRANKMAX; i++) + { + if (i==0) + pvp_ranks[0]=0; + else if (i==1) + pvp_ranks[1]=atoi(strtok (c_pvp_ranks, ",")); + else + pvp_ranks[i]=atoi(strtok (NULL, ",")); + } m_int_configs[CONFIG_GM_LOGIN_STATE] = sConfig.GetIntDefault("GM.LoginState", 2); m_int_configs[CONFIG_GM_VISIBLE_STATE] = sConfig.GetIntDefault("GM.Visible", 2); --- a/src/server/game/World/World.h +++ b/src/server/game/World/World.h @@ -390,9 +390,30 @@ enum Rates RATE_DURABILITY_LOSS_PARRY, RATE_DURABILITY_LOSS_ABSORB, RATE_DURABILITY_LOSS_BLOCK, + RATE_PVP_RANK_EXTRA_HONOR, RATE_MOVESPEED, MAX_RATES }; + +enum HonorKillPvPRank +{ + HKRANK00, + HKRANK01, + HKRANK02, + HKRANK03, + HKRANK04, + HKRANK05, + HKRANK06, + HKRANK07, + HKRANK08, + HKRANK09, + HKRANK10, + HKRANK11, + HKRANK12, + HKRANK13, + HKRANK14, + HKRANKMAX +}; /// Can be used in SMSG_AUTH_RESPONSE packet enum BillingPlanFlags @@ -639,6 +660,8 @@ class World void SendZoneText(uint32 zone, const char *text, WorldSession *self=0, uint32 team=0); void SendServerMessage(ServerMessageType type, const char *text=", Player* player=NULL); + uint32 pvp_ranks[HKRANKMAX]; + /// Are we in the middle of a shutdown? bool IsShutdowning() const { return m_ShutdownTimer ] 0; } void ShutdownServ(uint32 time, uint32 options, uint8 exitcode); --- a/src/server/game/Entities/Player/Player.cpp +++ b/src/server/game/Entities/Player/Player.cpp @@ -6770,6 +6770,7 @@ bool Player::RewardHonor(Unit *uVictim, uint64 victim_gu uint32 victim_rank=0; + uint32 rank_diff=0; // need call before fields update to have chance move yesterday data to appropriate fields before today data change. UpdateHonorFields(); @@ -6808,22 +6809,52 @@ bool Player::RewardHonor(Unit *uVictim, // [15..28] Horde honor titles and player name // [29..38] Other title and player name // [39+] Nothing - uint32 victim_GetUInt32Value(PLAYER_CHOSEN_TITLE); - // Get Killer titles, CharTitlesEntry::bit_index + // PLAYER__FIELD_KNOWN_TITLES describe which titles player can use, + // so we must find biggest pvp title , even for killer to find extra honor value + uint32 vGetUInt32Value(PLAYER__FIELD_KNOWN_TITLES); + uint32 victim_ + uint32 k + uint32 killer_ + if (PLAYER_TITLE_MASK_ALL_PVP & ktitle) + { + for (int i=((GetTeam() == ALLIANCE) ? 1:HKRANKMAX);i!=((GetTeam() == ALLIANCE) ? HKRANKMAX : (2*HKRANKMAX-1));i++) + { + if (ktitle & (1<<i)) + killer_ + } + } + if (PLAYER_TITLE_MASK_ALL_PVP & vtitle) + { + for (int i=((pVictim-]GetTeam() == ALLIANCE) ? 1:HKRANKMAX);i!=((pVictim-]GetTeam() == ALLIANCE) ? HKRANKMAX : (2*HKRANKMAX-1));i++) + { + if (vtitle & (1<<i)) + victim_ + } + } + // Get Killer titles, CharTitlesEntry::bit_index // Ranks: // title[1..14] -] rank[5..18] // title[15..28] -] rank[5..18] // title[other] -] 0 if (victim_title == 0) + victim_gut show HK: <rank] message, only log.] + else if (victim_title < HKRANKMAX) + victim_rank=victim_title + 4; + else if (victim_title < (2*HKRANKMAX-1)) + victim_rank=victim_title - (HKRANKMAX-1) + 4; + else victim_gut show HK: <rank] message, only log. - else if (victim_title < 15) - victim_rank=victim_title + 4; - else if (victim_title < 29) - victim_rank=victim_title - 14 + 4; - else - victim_gut show HK: <rank] message, only log. + + // now find rank difference + if (killer_title == 0 && victim_rank]4) + rank_diff=victim_rank - 4; + else if (killer_title < HKRANKMAX) + rank_diff=(victim_rank](killer_title + 4))? (victim_rank - (killer_title + 4)) : 0; + else if (killer_title < (2*HKRANKMAX-1)) + rank_diff=(victim_rank](killer_title - (HKRANKMAX-1) +4))? (victim_rank - (killer_title - (HKRANKMAX-1) + 4)) : 0; - honor_f=ceil(Trinity::Honor::hk_honor_at_level_f(k_level) * (v_level - k_grey) / (k_level - k_grey)); + honor_f=1 + sWorld.getRate(RATE_PVP_RANK_EXTRA_HONOR)*(((float)rank_diff) / 10.0f); // count the number of playerkills in one day ApplyModUInt32Value(PLAYER_FIELD_KILLS, 1, true); @@ -6832,6 +6863,7 @@ bool Player::RewardHonor(Unit *uVictim, UpdateAchievementCriteria(ACHIEVEMENT_CRITERIA_TYPE_EARN_HONORABLE_KILL); UpdateAchievementCriteria(ACHIEVEMENT_CRITERIA_TYPE_HK_CLASS, pVictim-]getClass()); UpdateAchievementCriteria(ACHIEVEMENT_CRITERIA_TYPE_HK_RACE, pVictim-]getRace()); + UpdateKnownTitles(); } else { @@ -6905,6 +6937,30 @@ bool Player::RewardHonor(Unit *uVictim, return true; } +void Player::UpdateKnownTitles() +{ + uint32 new_ + uint32 honor_kills=GetUInt32Value(PLAYER_FIELD_LIFETIME_HONORABLE_KILLS); + uint32 old_ + RemoveFlag64(PLAYER__FIELD_KNOWN_TITLES,PLAYER_TITLE_MASK_ALL_PVP); + if (honor_kills < 0) + return; + bool max_rank=((honor_kills ]= sWorld.pvp_ranks[HKRANKMAX-1]) ? true : false); + for (int i=HKRANK01; i != HKRANKMAX; ++i) + { + if (honor_kills < sWorld.pvp_ranks[i] || (max_rank)) + { + new_ + if (new_title ] 0) + new_title += ((GetTeam() == ALLIANCE) ? 0 : (HKRANKMAX-1)); + break; + } + } + SetFlag64(PLAYER__FIELD_KNOWN_TITLES,uint64(1) << new_title); + if (old_title ] 0 && old_title < (2*HKRANKMAX-1) && new_title ] old_title) + SetUInt32Value(PLAYER_CHOSEN_TITLE,new_title); +} + void Player::ModifyHonorPoints(int32 value) { if (value < 0) --- a/src/server/game/Entities/Player/Player.h +++ b/src/server/game/Entities/Player/Player.h @@ -387,6 +387,27 @@ enum PlayerFlags PLAYER_FLAGS_NO_XP_GAIN = 0x02000000 }; +#define PLAYER_TITLE_MASK_ALLIANCE_PVP \ + (PLAYER_TITLE_PRIVATE | PLAYER_TITLE_CORPORAL | + PLAYER_TITLE_SERGEANT_A | PLAYER_TITLE_MASTER_SERGEANT | + PLAYER_TITLE_SERGEANT_MAJOR | PLAYER_TITLE_KNIGHT | + PLAYER_TITLE_KNIGHT_LIEUTENANT | PLAYER_TITLE_KNIGHT_CAPTAIN | + PLAYER_TITLE_KNIGHT_CHAMPION | PLAYER_TITLE_LIEUTENANT_COMMANDER | + PLAYER_TITLE_COMMANDER | PLAYER_TITLE_MARSHAL | + PLAYER_TITLE_FIELD_MARSHAL | PLAYER_TITLE_GRAND_MARSHAL) + +#define PLAYER_TITLE_MASK_HORDE_PVP \ + (PLAYER_TITLE_SCOUT | PLAYER_TITLE_GRUNT | + PLAYER_TITLE_SERGEANT_H | PLAYER_TITLE_SENIOR_SERGEANT | + PLAYER_TITLE_FIRST_SERGEANT | PLAYER_TITLE_STONE_GUARD | + PLAYER_TITLE_BLOOD_GUARD | PLAYER_TITLE_LEGIONNAIRE | + PLAYER_TITLE_CENTURION | PLAYER_TITLE_CHAMPION | + PLAYER_TITLE_LIEUTENANT_GENERAL | PLAYER_TITLE_GENERAL | + PLAYER_TITLE_WARLORD | PLAYER_TITLE_HIGH_WARLORD) + +#define PLAYER_TITLE_MASK_ALL_PVP \ + (PLAYER_TITLE_MASK_ALLIANCE_PVP | PLAYER_TITLE_MASK_HORDE_PVP) + // used for PLAYER__FIELD_KNOWN_TITLES field (uint64), (1<<bit_index) without (-1) // can't use enum for uint64 values #define PLAYER_TITLE_DISABLED UI64LIT(0x0000000000000000) @@ -1975,6 +1996,7 @@ class Player : public Unit, public GridO if (value) AddKnownCurrency(ITEM_ARENA_POINTS_ID); // Arena Points } + void UpdateKnownTitles(); //End of PvP System Копируем содержимое "code" в текстовый редактор, и добавляем расширение вместо .txt ==] .patch Закидываем патч в папку с исходниками После, жмём ПКМ на папку source(папка с исходниками) и выбираем Git Bash Here Появляется консоль GITa в которой прописываем Code patch -p1 < название.patch Жмём Entre, накатывание завершено! 3.Собираем компилятор Создаем новую папку в нашей рабочей директории Открываес скачанны и установленный Cmake В нём вписываем адресс Where is the source code- пусть к папке с исходниками Where to build the binaries - папка для готового проекта VS После жмем Configure и выбираем, на какой платформе будем компилировать, в моем случае это Visual Studio 10, выбираем, после чего жмем Finish Построение завершено! 4. Компиляция ядра. Запускаем файл с расширением .sln, в нашем случае это:TrinityCore.sln Code После открытия VS, запускаем Диспетчер конфигураций... и меняем Активную конфигурацию решения с Debug на Release, после жмем Закрыть Жмём F7, ЖДЁМ.... Если после компиляции мы видим результат без ошибок, значит, компиляция прошла успешно. 5. Настройка ядра. Наше скомпилированное ядро хранится в папке:D:\work\tc\bin\Release Для удобства переместим и переименуем папку с ядром. Перенесем папку Release в корень нашей рабочей папки, то есть:D:\work\Release И переименуем в server:D:\work\server После этого, нашему ядру не хватает три файла: libeay32.dll, ssleay32.dll и libmysql.dll Найти libeay32.dll и ssleay32.dll мы может в папке с ранее установленным OpenSSL-Win32. Копируем libeay32.dll и ssleay32.dll с директории OpenSSL-Win32 в директорию с ядром: D:\work\server Файл libmysql.dll у нас в ядре имеется, но нам необходимо его заменить на тот, что использует наш MySQL сервер, взять его нужно отсюда: C:\Program Files\MySQL\MySQL Server\bin Копируем его и вставляем в директорию с ядром с заменой имеющегося.
После чего переименовываем файлы: worldserver.conf.dist в worldserver.conf authserver.conf.dist в аuthserver.conf Теперь надо настроить подключение ядра к БазеДанных. Для этого открываем уже переименованный authserver.conf и настраиваем строчку: LoginDatabaseInfo=127.0.0.1;3306;trinity;trinity;auth"
Code 127.0.0.1 - адрес БД, выставлено по умолчанию. 3306 - порт БД, выставлено по умолчанию. trinity - логин БД - менять на свой. trinity - пароль БД - менять на свой. auth - название БД, выставлено по умолчанию. Нам необходимо поменять только логин и пароль на те, которые мы указали при установке MySQL сервера. После этого, сохраняем и закрываем authserver.conf. Открываем worldserver.conf, тут хранятся все настройки сервера, мы пока в них вникать не будем, сделаем только необходимое:Code LoginDatabaseInfo=127.0.0.1;3306;trinity;trinity;auth" WorldDatabaseInfo=127.0.0.1;3306;trinity;trinity;world" CharacterDatabaseInfo=127.0.0.1;3306;trinity;trinity;characters" Настраиваем также как и в authserver.conf. Закрываем worldserver.conf. После нам необходимо указать путь к папке содержащей карты для сервера, как извлечь я объясню чуть позже, а пока создаем папку в корне нашей рабочей папки с названием data: D:\work\data- тут будут храниться карты. На этом начальная настройка ядра окончена. 6. Работа с базами. Trinity Core имеет три базы: auth - база аккаунтов. characters - база персонажей. world - база мира, игрового Сейчас мы займемся созданием этих трех баз. Создание баз. Открываем скаченный нами ранее Navicat, жмем на Conntection, заполняем: User name: логин MySQL сервера Password: пароль MySQL сервера После в левой части у нас появится подключение Щелкаем ПКМ на нашем подключении и выбираем:New database... Далее заполняем название базы и кодировки Enter database name : auth Character set- utf8 -- UTF-8 Unicode Collation: utf8_general_ci Жмем ОК, теперь мы создали одну из трех баз. Также поступаем с остальными двумя. Меняется только название. Все, базы созданы. Можно пока закрыть Navicat. Наши базы ещё пусты, нам необходимо их заполнить. Заполнение баз. Заполнение баз auth и characters не вызовет у вас лишних вопросов, а вот с world можно подумать. Но все по порядку.Сами .sql файлы с базами лежат тут:D:\work\source\sql\base У нас имеются все три базы, но заливать будем только две, auth и characters, т.к. world будем качать. Заполнение базы auth. Заливать будем через консоль.
1. Открываем консоль - Пуск ] Все программы ] MySQL ] MySQL Server ] MySQL Command Line Client. 2. Вводим пароль MySQL сервера. 3. Подключаемся к БД, набираем: \u название базы, в нашем случае: \u auth 4. Выполняем "заливку" базы: \. D:\work\source\sql\base\auth_database.sql И жмем Enter. По завершению процесса, меняем базу с auth на characters и выполняем: \. D:\work\source\sql\base\characters_database.sql После этого закрываем консоль, т.к. стандартную базу world_database.sql мы заливать не будем, мы будем использовать базу YTDB. Качать необходимо последнюю FULL базу с последующими обновлениями. На этом начальная настройка ядра окончена. Тут Качаем,и последующие патчи, извлекаем все содержимое архивов и кидаем в нашу рабочую папку: D:\work После чего снова запускаем консоль MySQL, вводим пароль, указываем базу world и выполняем файлы в такой последовательности: ИМЯ СКАЧАННОЙ БАЗЫ 571_corepatch_world_10316_10340 571_updatepack_world_10340 572_corepatch_world_10340_10394 572_updatepack_world_10394 По завершению процесса, можно закрыть консоль. К настройке баз, в частности относится изменение имени Игрового мира и смены адреса сервера (Realmlist). Для того чтобы изменить имя и Realmlist сервера, открываем Navicat, открываем созданное нами ранее подключение, открываем базу auth, таблицу realmlist и меняем на наше усмотрение: (НАЗВАНИЕ игрового мира, порты и тп) Можно закрывать Navicat. Работа с базами окончена 7. Запуск сервера. Для запуска сервера необходимо запустить два файла: authserver.exe - логин сервер worldserver.exe - игровой сервер Всё!!!Сервер создан.... Теперь создаём аккаунт в консоли worldserver вводим .accoune create логин пароль Заходим, радуемся.
|
|
| |