Моддинг World of Warcraft. Создание собственного класса. Часть 1.

Nyll

New member
Продвинутый пользователь
Регистрация
19.06.2020
Сообщения
55
Реакции
76
Баллы
0
Возраст
32
Местоположение
USA
Всем привет! Я решил временно не дописывать 3 часть по созданию кастомного логин скрина, а решил написать что-то интересное. В данной статье мы научимся создавать собственный класс и добавлять его в клиент и на сервер. Ну что же, приступим!

Шаг 1. Редактирование ChrClasses.dbc

Первый файл, который необходимо изменить, является ChrClasses.dbc. В нём хранится информация о всех существующих классах, которые доступны персонажу. Если на данном этапе Вы уже не понимаете откуда его взять, то вам необходимо ознакомиться с данными 2-мя статьями: статья 1 и статья 2. Данный dbc файл извлекаем из patch-ruRU-3.MPQ. (где ruRU - это код локали, языка который вы используете).

Открываем MyDBCEditor или WDBX Editor и добавляем в него patch-ruRU-3.MPQ

КолонкаполеТипОписание
0IDInteger
1UnknownIntegerОхотник, Шаман и Разбойник получили 1, Рыцарь Смерти 9; другие 0
2PowerTypeInteger0 = Мана, 1 = Ярость, 2 = Фокус, 3 = Энергия, 4 = Счастье, 6 = Руны
3m_petNameTokenStringТип питомца. Чернокнижник - 101 (ДЕМОН), а все остальные классы - 1 (ПЭТ).
4-20NameLoc
21-37Name_femaleLoc
38-54Name_maleLoc
55fileNameStringКАПС, английский
56spellClassSetIntegerSee below.
57FlagsIntegerSee below.
58CameraiRefIDИспользуется для вступительного ролика. Только у рыцаря смерти 165, у остальных 0
59required_expansionInteger0=WoW, 1=TBC, 2=Wotlk

Дополнительная информация доступна здесь: DB/ChrClasses - wowdev

Теперь же давайте добавим строку со своим классом. Я назову свой класс "Бард". Я решил, что у него будет энергия как у разбойников и друидов в форме кошки. Так же добавил склонение, у женских персонажей отныне будет "Бардка"

1662969408480.png

1662969435612.png

1662969452413.png

1662969520136.png

Обратите внимание, что Filename обязательно через CAPSLOCK! В верхней таблице об этом упомянуто.

Шаг 2. Редактирование CharBaseInfo.dbc

Данный файл определяет доступность классов для разных рас. Данный файл извлекаем из locale-ruRU.MPQ.
Я хочу сделать, чтобы за новый класс могли играть только люди. Чтобы это сделать необходимо указать RaceID = 1, ClassID = 12 (равняется номеру строки из первого шага).
Вы сразу задаёте вопрос, а как узнать ID? К счастью, WinWoolF опубликовал для вас на данном форуме информацию об этом.
Список ID всех классов в World of Warcraft (информация по поводу классов относится к более новым аддонам, мы делаем на базе WoTLK, и тут нет само собой Охотника на демонов)
Список ID всех рас в World of Warcraft

1662970138671.png


Дополнительная информация доступна здесь: DB/CharBaseInfo - wowdev

Шаг 3. Добавление изменённых DBC на сервер

Мы внесли изменения в DBC, нам нужно сообщить об этих изменениях не только клиенту, но и серверу! Так что копируем наши изменённые CharBaseInfo.dbc и ChrClasses.dbc и с заменой закидываем в dbc нашего сервера TrinityCore.

1662970712120.png


Загружаем именно в ruRU или другой язык, который вы редактировали.

Далее запускаем локальный сервер, заходим в игру и пробуем создать персонажа

На данном этапе вы можете столкнуться со следующей ошибкой "To many classes! Update MAX_CLASSES_PER_RACE"

68747470733a2f2f692e696d6775722e636f6d2f506d5457534a512e706e67.png


Исправим эту ошибку в шаге ниже, чтобы всё было более структурированно.

Шаг 4. Добавление иконки с новым классом в меню создания персонажа

Чтобы решить эту проблему, нам нужно добавить новую кнопку для нового класса в Interface\GlueXML\CharacterCreate.xml. Нам также нужно изменить файл CharacterCreate.lua в том же каталоге, чтобы добавить texcoord смещение для «BARD» и увеличить переменную MAX_CLASSES_PER_RACE. Также добавьте все строки, необходимые барду, в GlueStrings.lua, также в каталоге GlueXML. Вы можете найти «WARRIOR» и скопировать все эти строки, переименовав их.

Также необходимо изменить Interface\GLUES\CHARACTERCREATE\UI-CHARACTERCREATE-CLASSES.blp, чтобы добавить новый значок. Это то, на что направлено смещение texcoord.

Извлекаем Interface из patch-ruRU-2.MPQ + patch-ruRU-3.MPQ и начинаем редактировать вышеупомянутые файлы

Особых знаний Lua или ещё чего-либо здесь не нужно, достаточно базового английского и повторения за мной. Открываем первым делом Interface\GlueXML\CharacterCreate.lua и видим здесь следующую картину:

Код:
CLASS_ICON_TCOORDS = {
    ["WARRIOR"]    = {0, 0.25, 0, 0.25},
    ["MAGE"]    = {0.25, 0.49609375, 0, 0.25},
    ["ROGUE"]    = {0.49609375, 0.7421875, 0, 0.25},
    ["DRUID"]    = {0.7421875, 0.98828125, 0, 0.25},
    ["HUNTER"]    = {0, 0.25, 0.25, 0.5},
    ["SHAMAN"]    = {0.25, 0.49609375, 0.25, 0.5},
    ["PRIEST"]    = {0.49609375, 0.7421875, 0.25, 0.5},
    ["WARLOCK"]    = {0.7421875, 0.98828125, 0.25, 0.5},
    ["PALADIN"]    = {0, 0.25, 0.5, 0.75},
    ["DEATHKNIGHT"]    = {0.25, 0.49609375, 0.5, 0.75},
};

И добавим сюда ["BARD"] = {0.25, 0.49609375, 0.5, 0.75},, чтобы получилось вот так:

1662972337588.png


Так же нам необходимо увеличить значение константы
MAX_CLASSES_PER_RACE, по умолчанию значение равняется 10. Меняем на 11 на 3-й строке
8bJtu3e.png


Теперь нам необходимо добавить саму иконку с нашим новым классом в меню. Открываем Interface\GlueXML\CharacterCreate.xml. В данном файле находим на 587 строке следующую строчку: <Button name="CharCreateRandomizeButton" inherits="GlueButtonSmallTemplate" text="RANDOMIZE">
И сразу перед этой строкой добавим следующий код:
Код:
<CheckButton name="CharacterCreateClassButton11" inherits="CharacterCreateClassButtonTemplate" id="11">
            <Anchors>
                         <Anchor point="RIGHT" relativeTo="CharacterCreateClassButton10" relativePoint="RIGHT" x="45" y="0"/>
              </Anchors>
</CheckButton>

Если вы всё сделали правильно, то у вас получится вот так:

RdQ6FSq.png


Далее нам необходимо добавить информацию о новом классе в файл Interface\GlueXML\GlueStrings.lua. В данном файле на 311 строке находим
CLASS_INFO_WARRIOR4 = "- Пользуется яростью как ресурсом.";
Сразу после данной строки добавляем следующий код:

Код:
CLASS_INFO_BARD0 = "- Роль: Бард";
CLASS_INFO_BARD1 = "- Легкая броня (ткань)";
CLASS_INFO_BARD2 = "- Наносит магический уровень с помощью посоха.";
CLASS_INFO_BARD3 = "- Акцент на проклятиях, вытягивании сил и эффектах, наносящих периодический урон.";
CLASS_INFO_BARD4 = "- Использует энергию в качестве ресурса.";
CLASS_BARD = "Барды - описание класса";
CLASS_BARD_FEMALE = "Барды - описание класса";

То есть я по сути скопировал весь код связанный с варами и изменил под себя. Выглядит это следующим образом:

f1Hscbo.png


Это ещё не всё. Необходимо так же выводить ошибку, в случае если та или иная раса не может играть за Барда.
Снова выполняем поиск по файлу и находим строку WARRIOR_DISABLED на 861-й строке файла. Сразу после добавим следующий код:
Код:
BARD_DISABLED = "Бард\nЭтот класс доступен другим расам.";
Ну и для наглядности как обычно прикреплю скриншот:
qZ49koH.png


Я предоставлю ссылки на файлы в самом конце статьи, но по сути здесь всё сводится к добавлению информации о новом классе.

Теперь мы можем видеть наш класс на экране создания персонажа.

Шаг 5. Стартовая локация нового класса и базовые характеристики.

Теперь необходимо добавить основные данные базы данных на стороне сервера. Сделаем это мы с помощью простого SQL-запроса, который содержит в себе базовые характеристики класса и координаты в данном случае Элвиннского леса.

SQL:
INSERT INTO playercreateinfo (race, class, map, zone, position_x, position_y, position_z, orientation) VALUES (1, 12, 0, 12, -8949.95, -132.493, 83.5312, 0);
INSERT INTO player_levelstats (race, class, LEVEL, str, agi, sta, inte, spi) VALUES (1, 12, 1, 17, 20, 21, 23, 25);
INSERT INTO player_classlevelstats (class, LEVEL, basehp, basemana) VALUES (12, 1, 20, 0);

После выполнения этих 3 простейших SQL-запросов наш персонаж с классом Бард появится в Элвиннском лесу.

НО! Даже если сейчас попробовать создать персонажа с нашим новым классом мы получим ошибку "Account {здесь ID аккаунта} tried to create a character named '{здесь имя персонажа}' with an invalid race/classes pair"

Шаг 6. Добавление нового класса в ядро TrinityCore.


Дело в том, что наш TrinityCore не знает о таком классе и нам нужно добавить код для обработки нового класса. К счастью, это довольно просто. Для начала нужно открыть файл SharedDefines.h, который лежит в директории src/server/shared. Добавим сразу на 140 строке запятую и после неё добавим следующую строчку: CLASS_BARD = 12, // TITLE Bard, чтобы получилось вот так:

Ru8GUtI.png


Так же на 145-й строке нужно изменить значение константы MAX_CLASSES с 11 до 12.
f5XutBq.png


Далее чуть ниже необходимо заменить код:

C++:
#define CLASSMASK_ALL_PLAYABLE \
    ((1<<(CLASS_WARRIOR-1))|(1<<(CLASS_PALADIN-1))|(1<<(CLASS_HUNTER-1))| \
    (1<<(CLASS_ROGUE-1))  |(1<<(CLASS_PRIEST-1)) |(1<<(CLASS_SHAMAN-1))| \
    (1<<(CLASS_MAGE-1))   |(1<<(CLASS_WARLOCK-1))|(1<<(CLASS_DRUID-1)) | \
    (1<<(CLASS_DEATH_KNIGHT-1)))

На следующий код:

C++:
#define CLASSMASK_ALL_PLAYABLE \
    ((1<<(CLASS_WARRIOR-1))|(1<<(CLASS_PALADIN-1))|(1<<(CLASS_HUNTER-1))| \
    (1<<(CLASS_ROGUE-1))  |(1<<(CLASS_PRIEST-1)) |(1<<(CLASS_SHAMAN-1))| \
    (1<<(CLASS_MAGE-1))   |(1<<(CLASS_WARLOCK-1))|(1<<(CLASS_DRUID-1)) | \
    (1<<(CLASS_DEATH_KNIGHT-1))|(1<<(CLASS_BARD-1)))

Должно получиться вот так:

ZocDuIu.png


Не забудьте перекомпилировать ядро TrinityCore, чтобы изменения вступили в силу!

Теперь мы можем войти в игру новым классом, но когда вы откроете ветку талантов или окно персонажа, то у вас крашнется (вылетит) клиент. Это потому, что нам не хватает данных gt DBC для нового класса.

Шаг 7. Автоматические добавление данных о новом классе в DBC сервера.

Stoneharry написал небольшую программу для автоматического добавления этих данных в файлы DBC. Выполнение этого вручную было бы медленной утомительной задачей и большой шанс допустить ошибку. Сама программа будет прикреплена в архиве в самом низу.

Открываем PlayerClassStatDBCUtil, а в ней открываем файл Program.cs через Microsoft Visual Studio, в моём случае Microsoft Visual Studio 2019 и видим следующую картину:
YkQMjyc.png


Необходимо заменить D:/WoW Resources/2019_TrinityCore/DBC Temp/ на наш путь. В моём случае это C:\WoWMod\Server\Core\bin\Release\Data\dbc. Только обратите внимание, что здесь нужно использовать обычные слэши в пути, а не обратные. То есть должно быть так: C:/WoWMod/Server/Core/bin/Release/Data/dbc. В правой части находится путь до экспорта. Я буду использовать C:/WoWMod/Server/Core/bin/Release/Data/dbc/Export

Так же не забудьте в переменной указать свой путь и путь для экспорта:

JsTRBgj.png


Теперь нам необходимо запустить программу следующим образом:

1662980890405.png


Если у вас не запускается программа с ошибкой, которая связана с версией .NET Framework, откройте файл PlayerClassStatDBCUtil.csproj и Microsoft Visual Studio предложит вам скачать необходимую версию.

X1owD0y.png


SkillLineAbilityDBCUtil по сути всё тоже самое.

После того как мы перекомпилировали ядро нашего сервера, можем заходить в игру и убедиться в том, что теперь клиент не вылетает и всё хорошо.

Скачать иконку для меню создания персонажа и софт от stoneharry: Яндекс

На такой прекрасной ноте мы закончим, продолжение следует...
 

Вложения

  • 1662969422542.png
    1662969422542.png
    102,4 КБ · Просмотры: 43
Последнее редактирование:
Верх Низ