Моддинг World of Warcraft. Первый модуль на TSWoW

Nyll

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

Создание модуля

Запустите редактор VSCode в каталоге TSWoW и убедитесь в терминале, что у вас есть все пакеты командой npm i, затем запустите TSWoW (npm run start).

После запуска TSWoW введите команду create module mymodule --datascripts --assets --livescripts. Это создаст новый каталог с именем mymodule в папке modules.
1663144632727.png


Сборка Data скриптов

Мы видим, что TSWoW уже создал для нас основные каталоги модов. Если мы посмотрим на папку datascripts, то увидим, что нас ждет файл datascripts.ts.
1663144706005.png

Это основная точка входа для ваших data скриптов и вы не должны ее переименовывать. Вы можете создать любое другое количество data скриптов в этом и любых подкаталогах, и другие файлы сценариев не должны быть импортированы этим файлом для работы.

Чтобы создать сценарий данных, который у нас есть, введите команду build data --readonly в терминал TSWoW. Вы должны увидеть вывод, подобный следующему:

1663144941748.png


Поскольку мы передали параметр --readonly, данные для этой сборки фактически не записывались, и сервер/клиент не перезагружались.

Сборка клиента

Замените содержимое файла datascripts.ts следующим:
Код:
import { std } from 'wow/wotlk';

// Загрузим класс воина
const WARRIOR_CLASS = std.Classes.load(1)

// Изменит русское название класса "Воин" на "Нулл" (обратите внимание, что если вы используете русскую локализацию, то значение "Nyll" ниже необходимо писать кириллицей, то есть "Нулл")
WARRIOR_CLASS.Name.enGB.set('Nyll');

// Изменение описание создания персонажа
WARRIOR_CLASS.UI.Description.set('Nyll 1n-game.ru');

Теперь, когда наш data скрипт действительно что-то делает, мы можем попробовать его с помощью команды build data --client-only. Поскольку мы меняем только имя, нам нужно только собрать клиентские данные, чтобы изменить их. Вы должны увидеть вывод, подобный следующему:

1663145347159.png

Вы также должны заметить, что TSWoW перезапустил клиент для вас в фоновом режиме. Если мы войдем в меню создания персонажа, мы увидим, что мы действительно изменили имя Воина на Nyll.

dJFsbr6.png


f7RqQHo.png


Сборка сервера

Давайте попробуем внести в игру более значимое изменение, изменив силу воина. Добавьте в файл сценария следующее:

Код:
// Изменит показатель силы для всех уровней
std.Classes.load('WARRIOR').Stats.Strength.set(x=>99);

Для этого изменения будет недостаточно просто перестроить клиент, потому что сила — это расчет на стороне сервера. Это относится к любым изменениям, кроме эстетических. Чтобы перестроить и клиент, и сервер, необходимо запустить команду build data. Вы должны заметить, что и клиент, и сервер перезагрузятся. Войдите снова как воин и проверьте характеристику силы.

B5eM9aA.png

Генерация идентификаторов и строковых идентификаторов

Каждый вид сущности в World of Warcraft, от предметов до квестов и классов, имеет числовой идентификатор, который делает его уникальным среди своего типа. Например, Дробитель имеет числовой идентификатор типа существа 448, и никакое другое существо не имеет такого идентификатора. Если что-то еще в игре имеет ссылку на тип существа, а ссылка на 448, это ссылка на Дробителя. Идентификаторы разных типов могут перекрываться, например, идентификатор типа существа 36 относится к Уборочному голему, а идентификатор предмета 36 — к Иссеченная палица.

Числовые идентификаторы сложны, потому что мы должны вручную убедиться, что они не конфликтуют друг с другом. В TSWoW мы автоматически генерируем множество числовых идентификаторов без каких-либо дополнительных входных данных, но иногда нам нужно, чтобы идентификаторы были постоянными каждый раз, когда мы собираем наш модуль, поскольку числовые идентификаторы используются сервером для отслеживания таких вещей, как элементы, который надел игрок или сколько раз он убил конкретное существо. Было бы нехорошо, если бы ваш героический фиолетовый меч был заменен на серый предмет только потому, что сгенерированный идентификатор изменился.

Чтобы решить эту проблему, мы используем строковые идентификаторы при создании объектов для автоматического создания уникального числового идентификатора, который останется постоянным, даже если мы создадим наш модуль несколько раз. Чтобы избежать коллизий, мы разделяем строковые идентификаторы на две части: часть «идентификатор мода», описывающую модуль, создавший сущность, и часть «идентификатор сущности», которая должна однозначно идентифицировать сущность в нашем моде.

Например, если у нас есть модуль под названием «tswow-tutorial» и элемент под названием «Бейсбол», он будет иметь идентификатор мода «tswow-tutorial» и идентификатор сущности «бейсбол». Мы должны писать все наши строковые идентификаторы только в нижнем регистре и использовать дефисы (-) между словами, как и в именах модулей. Если бы в другом моде также был элемент под названием «Бейсбол», он не столкнулся бы с нашим идентификатором, поскольку у них был бы полный идентификатор «ихмод: бейсбол», а у нашего был бы «нашмод: бейсбол».

Создание сущности

Чтобы проиллюстрировать генерацию идентификатора со строковыми идентификаторами, мы создадим простой меч на основе Громовой Ярости (идентификатор предмета = 19019). Создайте файл Sword.ts в каталоге ваших модов и напишите следующий код:
Код:
mport { std } from 'wow/wotlk'

const THUNDERFURY_2 = std.Items
    .create(
        // Идентификатор модуля, замените на имя вашего модуля
        'my-module',
        // Идентификатор объекта должен быть уникальным в 'my-module'
        'thunderfury-2',
        // Числовой идентификатор оригинального предмета
        19019
    )
THUNDERFURY_2.Name.enGB.set('Thunderfury 2');

Здесь мы снабжаем функции создания аргументами «my-module», «thunderfury-2» и 19019 . Если мы будем следовать автодополнению, мы увидим, что имена параметров — «mod», «id» и «parent». , соответственно. Всякий раз, когда функция в TSWoW запрашивает параметр «mod» и «id», вы можете быть уверены, что она запрашивает ваш текущий модуль и новый уникальный идентификатор объекта. Третий аргумент в этом примере, parent, представляет собой числовой идентификатор элемента, который мы хотим скопировать.

Строковые идентификаторы: используются только один раз

В TSWoW мы используем строковые идентификаторы mod/id только при создании объекта в первый раз и больше никогда. Вместо этого мы используем сгенерированный числовой идентификатор. Чтобы увидеть, какой идентификатор был сгенерирован для нашего нового элемента, добавьте следующий код в конец файла Sword.ts:

console.log(THUNDERFURY_2.ID);

Когда вы создадите этот скрипт, вы должны увидеть, что он выводит довольно большое число. Если мы когда-нибудь захотим сослаться на этот меч где-либо еще в наших data скриптах, мы сошлемся на THUNDERFURY_2.ID. Если мы хотим использовать этот идентификатор в другом файле кода, мы можем просто изменить строку объявления на export const THUNDERFURY_2 = std.Items и импортировать его из этого файла.

Чтобы дать себе предмет в игре, вы можете использовать команду .additem id, где id — числовой идентификатор предмета, который вы хотите. Попробуйте придумать, как подарить себе Thunderfury 2 ;)

На этой прекрасной ноте мы завершаем данное руководство. В следующей части мы создадим собственный класс.
 
Последнее редактирование:
Верх Низ