Найти в Дзене

Учимся писать скрипты в героях 5

Сегодня мы научимся писать скрипты. Поэтому нам важно иметь программу HoMM5MapScriptsEditorhttps://disk.yandex.ru/d/tXqYC-4qga_8Mw. Дело в том, что редактор скриптов в редакторе багованный и вылетает, поэтому без программы не обойтись, к тому же она банально удобнее.

Для начала заходим в Map Properties

Далее во вкладку Script и нажимаем Edit Script

-2

Далее пишем любое слово, фразу, не важно. И нажимаем ок

-3

Теперь заходим в редактор скриптов и удаляем надпись

-4

Итак, допустим мы хотим следующую ситуацию: герой взаимодействует с камнем, тот не дает бафф, а посылает героя. Потом герой подходит к энтам и они ему поясняют за лес.

-5

Начнем с камня.

Нам нужно, чтобы камень не давал бафф, тут нам поможет такая строчка как
SetObjectEnabled ("скриптовое имя камня", false);

Команда SetObjectEnabled отвечает за работу основной фунции объекта
false обозначает выключено, то есть функция объекта не работает
Теперь нужно дать имя камню

Выделяем камень, нажимаем Map Properties Three, появляется меню слева, заходим в строчку Name и даем камню имя stas

-6

Получается, нам нужно написать следующее:

SetObjectEnabled ("stas", false);

Теперь нужно заставить камень говорить, для этого создаем функцию

function kamen()

слово function открывает саму функцию, далее идет название которое выбирается нами, например kamen, далее обязательно (), просто особенности скриптового языка, без скобок не всегда работает.

Теперь нам нужно дать задачу функции, то есть, что она будет делать, в нашем случае мы хотим, чтобы от объекта отлетало сообщение, для этого нужно создать это самое сообщение. Открываем редактор текста, и даем название сообщению. Затем пишем сам текст в новом окне. Не забываем сохранять.

-7
-8
-9

Теперь нам надо дать задачу функции, то есть то, ради чего она и создавалась, для этого нам подходит скрипт ShowFlyingSign, записывается этот скрипт так:

ShowFlyingSign("/Maps/SingleMissions/название сценария данное на моменте создания/название данное сообщению.txt", "имя объекта, от которого отлетает сообщение" , для кого видно сообщение, время полета сообщения);

В месте для обозначения игроков, которым показывается сообщение проще всего поставить -1, что означает показ всем игрокам. В нашем случае этот скрипт будет выглядеть следующим образом:

ShowFlyingSign("/Maps/SingleMissions/test/mess_stas.txt", "stas" , -1, 5);

То есть адрес сообщения, имя камня, игрок которому направлено сообщение и время, пусть будет 5 секунд.

Теперь нам надо дать причину функции сработать, то есть триггер.
Триггер, который работает при касании объекта выглядит так:
OBJECT_TOUCH_TRIGGER

Сама строчка с триггером записывается со слова Trigger, после которой уже идет сам триггер в скобках. то есть: Trigger(OBJECT_TOUCH_TRIGGER, "имя объекта с которым надо взаимодействовать", nil(чтобы триггер обнулялся после первого раза, то есть не повторялся бесконечно);

То есть полностью наш триггер выглядит так:

Trigger(OBJECT_TOUCH_TRIGGER, "stas", nil);

Теперь просто заканчиваем функцию строчкой end;

И так как мы обнулили функцию стоит дополнить внизу строчкой, иначе игра не поймет к какой функции триггер. kamen название функции, которую провоцирует данный триггер

Trigger(OBJECT_TOUCH_TRIGGER, "stas", "kamen");

Итого мы имеет следующий скрипт:

SetObjectEnabled ("stas", false);
function kamen()
ShowFlyingSign("/Maps/SingleMissions/test/mess_stas.txt", "stas" , -1, 5);
Trigger(OBJECT_TOUCH_TRIGGER, "stas", nil);
end;
Trigger(OBJECT_TOUCH_TRIGGER, "stas", "kamen");
-10

Теперь сделаем так, чтобы при приближении к энтам они начинали говорить

-11

Создаем функцию

function les()

Берем скрипт MessageBox, который вызывает текстовое окно. В нем требуется только указать адрес.

MessageBox ("/Maps/SingleMissions/test/mess_ent.txt");

Теперь нам надо создать триггер, область заходя в которую игрок получит в лицо сообщение.

Заходим в Tool Panel > Regions > New region. Рамочкой обводим область которая нам нужна. Даем ей название les_ruk.

Пишем триггер, который заставляет героя остановится и после этого выполняет функцию, не забываем обнулить функцию как прошлый раз, чтобы она не повторялась.
Trigger(REGION_ENTER_AND_STOP_TRIGGER, "les_ruk", nil);

end;

Trigger(REGION_ENTER_AND_STOP_TRIGGER, "les_ruk", "les");

Итого мы имеем:

SetObjectEnabled ("stas", false);
function kamen()
ShowFlyingSign("/Maps/SingleMissions/test/mess_stas.txt", "stas" , -1, 5);
Trigger(OBJECT_TOUCH_TRIGGER, "stas", nil);
end;
Trigger(OBJECT_TOUCH_TRIGGER, "stas", "kamen");
function les()
MessageBox ("/Maps/SingleMissions/test/mess_ent.txt");
Trigger(REGION_ENTER_AND_STOP_TRIGGER, "les_ruk", nil);
end;
Trigger(REGION_ENTER_AND_STOP_TRIGGER, "les_ruk", "les");
-12

Перед тем, как выйти из редактора скриптов выйдите из редактора карт и еще раз сохраните все файлы, иначе они могут не сохранится.

А теперь фиксируем результат

Для более детального и подробного изучения скриптов рекомендую обратится к следующему архивчику: https://disk.yandex.ru/d/eBO2nK2aX9aDcw

Автор статьи https://vk.com/kapystageniy