21:14 Rswow.ru - Worl... 3 Обычные сервера WoW от StaF
02:08 Бесплатный игро... 3 Обычные сервера WoW от morra
02:44 ^^Limit-WoW^^ ^... 3 Обычные сервера WoW от adidas9699
22:14 Xz-WoW.Ru [FUN]... 3 Обычные сервера WoW от Milko
Rareportal.com
Хочешь разместить тут рекламу бесплатно?

[ Главная страница ] [ Новые сообщения · Участники · Правила форума · Поиск · RSS ]
  • Страница 1 из 1
  • 1
Форум » TrinityCore » Ядра TrinityCore » Создание ядра (Учимся делать сами)
Создание ядра (Учимся делать сами)
STALKER Дата: Пятница, 02.03.2012, 16:35 | Сообщение # 1 Offline





Гл. Администратор

Сообщений: 326

Репутация: 300 +

Статус: 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 логин пароль
Заходим, радуемся.
 
Форум » TrinityCore » Ядра TrinityCore » Создание ядра (Учимся делать сами)
  • Страница 1 из 1
  • 1
Поиск: