Перейти к содержанию

Сообщения от Скрипты

В ответ пользователю OrnsteinDragonslayer
Аватар пользователя
8 лет назад
OrnsteinDragonslayer
Я к тому, что этот СетОбжектив реализовывать как отдельную функцию, или можно и в эту пихнуть?
Прям сюда пихай
Кампания в разработке:
Название не придумал
Выполнено 5%
Аватар пользователя
8 лет назад
Вопрос такой. Хочу сделать, чтобы герой команды 1 (ИИ) патрулировал определенный путь. Я знаю, что подобное было на 1ой карте 3ей кампании (где Маркел должен не попадаться на патрули магов), но я посмотрел скрипты те и это какой то кошмар для меня, как новичка в скриптинге. Таков вопрос: можно ли как то упростить скрипт патруля магов из этой миссии? И там есть так же строка с радиусом обнаружения, при котором, видимо если маркел будет в радиусе, враж. герой будет его преследовать. Но в моей карте есть проблема здесь. Допустим я всё выставлю как надо, но герой патрульный из команды 1 будет проходить рядом с городом команды 2 (враждебной). Он захватит же захватит город и скрипт сломается? Заранее спасибо за ответы.
Автор карт:
Долина расхитителей
Выбор мира
Аватар пользователя
8 лет назад
такой вопрос. у меня есть несколько одинаковых обьектов, с привязанными к ним триггерами. я написал функцию, которая может работать с любым из них и принимает номер обьекта. вызываю ее триггером касания типа: Trigger(OBJECT_TOUCH_TRIGGER, 'имя обьекта', 'функция(номер обьекта)'). Это работает, но при каждом срабатывании пишет в консоль ошибку: attempts to call a nil value. стоит ли игнорировать эту ошибку, ведь, по факту, все работает как задумывалось или она таки на что-то влияет?

UPD. Немного поэксперементировал, получилось так. Если написать что-то вроде:

str = 'функция(параметр)'
...
Trigger(OBJECT_TOUCH_TRIGGER, 'имя обьекта', 'parse(str)')

то ошибки в консоли не будет. Правда, не до конца понимаю как это работает и стоит ли так делать...
Нет войне.
Аватар пользователя
8 лет назад
Вот фрагмент из моей карты:
Trigger(OBJECT_TOUCH_TRIGGER, "monum1", "monumtext");
Trigger(OBJECT_TOUCH_TRIGGER, "monum2", "monumtext");
Trigger(OBJECT_TOUCH_TRIGGER, "monum3", "monumtext");
Trigger(OBJECT_TOUCH_TRIGGER, "monum4", "monumtext");

function monumtext (hero, obj)
if obj == 'monum1' then
MessageBox(mpath.. 'monum1.txt');
elseif obj == 'monum2' then
MessageBox(mpath.. 'monum2.txt');
elseif obj == 'monum3' then
MessageBox(mpath.. 'monum3.txt');
elseif obj == 'monum4' then
MessageBox(mpath.. 'monum4.txt');
end;
end;
Триггер object_touch в любом случае передает 2 параметра в функцию (неважно используете вы их или нет): имя притронувшегося героя и имя объекта к которому притронулись. Т.е. надо писать Trigger(OBJECT_TOUCH_TRIGGER, 'имя объекта', 'функция'), без каких-либо параметров в скобках
Аватар пользователя
8 лет назад
спасибо, лучше не буду придумывать костылей, а то мало ли что...
Нет войне.
Аватар пользователя
8 лет назад
Такой вопрос по триггерам. У меня есть 2 региона, которые активируют разные события. Вот герой встал в 1 регион и сделалась штука, но как теперь удалить возможность активации события второго региона? Костыль типа "заблокировать второй регион для игрока" не может быть реализован.
Автор карт:
Долина расхитителей
Выбор мира
Аватар пользователя
8 лет назад
Обнулить триггер второго региона. Trigger(ТИП_ТРИГГЕРА, 'имя региона', nil)
Нет войне.
Аватар пользователя
8 лет назад
Такой вопрос. Делаю задание, где нужно уничтожить опред. героя(Орсона). Но хочу предоставить игроку выбор, поэтому идёт развилка, а значит 2 функции, "принятия" задания или его "отказа". Отказ работает, а вот выполнение не очень. Может я где ошибся? Посмотрите, пжалста. А, да. Консоль вроде не матерится ни на что. Просто ничего не происходит. Хотя триггер верный вроде стоит.
function SuppGlutt ()
SetObjectiveState("Qnecro", OBJECTIVE_COMPLETED);
RemoveObject("Isher");
SetObjectOwner("gorodZemlya", 1);
ChangeHeroStat("RedHeavenHero04", STAT_EXPERIENCE, 15000);
ChangeHeroStat("RedHeavenHero04", STAT_MORALE, 1);
ChangeHeroStat("RedHeavenHero04", STAT_LUCK, 1);
Trigger (PLAYER_REMOVE_HERO_TRIGGER, "Straker", nil);
end;

Trigger (PLAYER_REMOVE_HERO_TRIGGER, "Straker", "SuppGlutt");
Автор карт:
Долина расхитителей
Выбор мира
Аватар пользователя
8 лет назад
REMOVE_HERO_TRIGGER немного по другому работает.
Trigger(PLAYER_REMOVE_HERO_TRIGGER, номер игрока, 'функция, в которую будут переданы имена потерянного героя и его победителя(или nil)')

т.е, должно быть как-то так:
function SuppGlutt (looser, winner)
if(looser == "Straker") then
SetObjectiveState("Qnecro", OBJECTIVE_COMPLETED);
RemoveObject("Isher");
SetObjectOwner("gorodZemlya", 1);
ChangeHeroStat("RedHeavenHero04", STAT_EXPERIENCE, 15000);
ChangeHeroStat("RedHeavenHero04", STAT_MORALE, 1);
ChangeHeroStat("RedHeavenHero04", STAT_LUCK, 1);
Trigger (PLAYER_REMOVE_HERO_TRIGGER, номер, nil);
end;
end;

Trigger (PLAYER_REMOVE_HERO_TRIGGER, номер игрока, которому принадлежит нужный герой, "SuppGlutt")
Нет войне.
Аватар пользователя
8 лет назад
Вопрос про треды. Я про них мало, что знаю, но здесь они мне видимо нужны, потому прошу помощи.
Существуют несколько особенных нейтралов. После того, как они будут уничтожены, должен срабатывать триггер(наверное), мол приходит резервный герой.
Как это осуществляется?
И второй вопрос не по тредам: может ли один триггер активировать несколько функций? Как это написать?
Например, будет ли работать такой триггер - Trigger(REGION_ENTER_AND_STOP_TRIGGER , "dialog", "Dialog1", "функция2", "функция3", "функция228"); ?
Автор карт:
Долина расхитителей
Выбор мира
В ответ пользователю OrnsteinDragonslayer
Аватар пользователя
8 лет назад
OrnsteinDragonslayer
Вопрос про треды. Я про них мало, что знаю, но здесь они мне видимо нужны, потому прошу помощи.
Существуют несколько особенных нейтралов. После того, как они будут уничтожены, должен срабатывать триггер(наверное), мол приходит резервный герой.
Как это осуществляется?

Примерно так:
function fun()
while (1) do
sleep(2);
if (Exists('neutral1') == nil) and (Exists('neutral2') == nil) then
fun2();
break
end;
end;
end;

startThread(fun);

Функция fun в цикле проверяет содержатся ли объекты neutral 1 и 2, как только они исчезают выполняется функция fun2(). startThread можно написать сразу после загрузки карты, или когда вам это будет нужно (например, при получении квеста на нейтралов).
OrnsteinDragonslayer

И второй вопрос не по тредам: может ли один триггер активировать несколько функций? Как это написать?
Например, будет ли работать такой триггер - Trigger(REGION_ENTER_AND_STOP_TRIGGER , "dialog", "Dialog1", "функция2", "функция3", "функция228"); ?

Быть может как-то и можно, я бы запустил их по цепочке:

Trigger(REGION_ENTER_AND_STOP_TRIGGER , "dialog", "Dialog1")

function Dialog1 ()
...
функция2();
end;

function функция2 ()
...
функция3();
end;

и т.д.
Аватар пользователя
8 лет назад
Быть может как-то и можно, я бы запустил их по цепочке:
Более традиционный подход такой:
Trigger(REGION_ENTER_AND_STOP_TRIGGER , "dialog", "Dialog1")

function Dialog1 ()
функция1();
функция2();
функция3();
end
РПГ-сценарий для HoMM5: Путь героя
ЧаВо по созданию карт для HoMM5: ЧаВо
В ответ пользователю Jack_of_shadows
Аватар пользователя
8 лет назад
если кто-нибудь знает можете подсказать как в боевой скрипт перенести уровень героя:confused: :
function start()
if уровень героя нападающего >=1
каст одного закла
if уровень героя нападающего >=10
каст одного закла
if уровень героя нападающего >=20
каст одного закла
end:rolleyes:
В ответ пользователю LetoX
Аватар пользователя
8 лет назад
LetoX
если кто-нибудь знает можете подсказать как в боевой скрипт перенести уровень героя:confused: :
function start()
if уровень героя нападающего >=1
каст одного закла
if уровень героя нападающего >=10
каст одного закла
if уровень героя нападающего >=20
каст одного закла
end:rolleyes:

через глобальную переменную:
x = GetHeroLevel('имя нужно героя')
SetGameVar('Level', x)

в комбат скрипте получить ее значение:
function Start()
HeroLevel = GetGameVar('Level') + 0
if(HeroLevel >= 1) then
...
и т.д
Нет войне.
Аватар пользователя
8 лет назад
Вот написал функцию по совету:
function cherti ()
while (1) do
sleep(2);
if (Exists('chert1') == nil) and (Exists('chert2') == nil) and (Exists('chert3') == nil) and (Exists('chert4') == nil) and (Exists('chert5') == nil) and (Exists('chert6') == nil) and (Exists('chert7') == nil) and (Exists('chert8') == nil) then
Quelaag ();
break
end;
end;
end;

startThread("cherti");

function Quelaag ()
DeployReserveHero( "Oddrema", 60, 36, GROUND );
end;

Но после уничтожения всех чертей ничего не происходит. Подскажите, где ошибка?

Добавлено через 23 минуты
И еще. Возможно ли создать скрытую взаимосвязь между квестами? Попробую придумать простой пример:
Квест - уничтожить враж. героя
Вторичный квест - уничтожить нейтрала.

Когда подходишь к враж. герою, то проигрывается диалог №1, но если ты уничтожил нейтралов, то будет диалог №2.
Так же если просто сразиться с враж. героем, то в его армии будет 5 фениксов.
А если победил нейтралов, то будет 250 волков и надет какой-нибудь артефакт.
Возможно ли реализовать подобные штуки?
Автор карт:
Долина расхитителей
Выбор мира

Статистика

Приветствуем новейшего участника: recijeb

Сейчас на сайте 8 пользователей 1202 гостей