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

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

1 год назад
При нажатии на check в редакторе пишет, что "Function FightUnitExp not definied, line 1". Но раз в ванилле работает, то видимо просто забью.
В ответ пользователю CetusSantis
Аватар пользователя
1 год назад
Скопируйте и вставьте прям вот так в главный скрипт карты (не скрипт юнита, не боевой скрипт):

function FightUnitExp(hero, unit)
 while IsObjectExists(hero) == not nil and IsObjectExists(unit) == not nil do
  sleep(5)
 end 
 if IsObjectExists(unit) == nil then
  ChangeHeroStat(hero, 0, 999999999)
 end
end
Trigger(OBJECT_TOUCH_TRIGGER, "UnitExp", "FightUnitExp")

и проверьте в игре
В ответ пользователю Долгий
1 год назад
Все получилось! И с модом тоже работает! Огромное спасибо!

Добавлено через 22 часа 28 минут
Один момент, а если я хочу таких юнитов несколько поставить на карту? То им всем нужны свои имена и своя функция? Я пробовал просто поставить ещё одного юнита с таким же именем, но скрипт срабатывает лишь при убийстве первого.
В ответ пользователю CetusSantis
Аватар пользователя
1 год назад
CetusSantis
Все получилось! И с модом тоже работает! Огромное спасибо!

Добавлено через 22 часа 28 минут
Один момент, а если я хочу таких юнитов несколько поставить на карту? То им всем нужны свои имена и своя функция? Я пробовал просто поставить ещё одного юнита с таким же именем, но скрипт срабатывает лишь при убийстве первого.

параметр Name должен быть уникальным для каждого объекта. 

Если функционал после победы всегда одинаков (дать герою 999999999 опыта), то достаточно пронумеровать name всех юнитов (UnitExp1, UnitExp2, UnitExp3 и т. д.) и линию с триггером Trigger(OBJECT_TOUCH_TRIGGER, "UnitExp", "FightUnitExp") посадить в цикл for

for i = 1,5 do --5 для 5 объектов
 Trigger(OBJECT_TOUCH_TRIGGER, "UnitExp"..i , "FightUnitExp")
end

теперь на каждом объекте с именем UnitExp от 1 до 5 будет триггер при дотрагивании, запускающий функцию  FightUnitExp
Аватар пользователя
1 год назад

Всем здравствуйте. Появился вопрос по скрипту ( на скрине). Уже не знаю что сделать, чтобы он заработал, триггер его не активирует

Вложение 73917

И возможно сделать такой скрипт, который бы автоматически пропускал ход в первый день у игрока 2? Не нашел ничего подобного в мануалах, поэтому пошел путем изменения числа MP игрока 2

Подскажите, пожалуйста

Вложения 1
1 файл • Общий размер: 12,4 KB
В ответ пользователю Dogenator
Аватар пользователя
1 год назад
Dogenator

Всем здравствуйте. Появился вопрос по скрипту ( на скрине). Уже не знаю что сделать, чтобы он заработал, триггер его не активирует

Вложение 73917

И возможно сделать такой скрипт, который бы автоматически пропускал ход в первый день у игрока 2? Не нашел ничего подобного в мануалах, поэтому пошел путем изменения числа MP игрока 2

Подскажите, пожалуйста

Так, собственно, какую ошибку выдаёт? Или ошибок нет? Добавьте отладочную печать в ф-ию нового дня, посмотрите, что выводят GetTownRace(...). Также просьба не по скрипту — прикреплять код не в виде скриншота, а в виде текста, оформленного блоком кода:
function MyFunc(var)
-- Немного lua-кода
print("Hello, ", var);
end

Можно из скрипта включить читы и скипнуть ход:

consoleCmd("enable_cheats")
consoleCmd("eot")

Более простой способ — отобрать очки передвижения у героя:

ChangeHeroStat("Герой", HERO_STAT_MOVE_POINTS, -GetHeroStat("герой", HERO_STAT_MOVE_POINTS)
В ответ пользователю }{0TT@6bI4
Аватар пользователя
1 год назад

Еще не до конца разобрался со всеми возможностями форума и как вставлять сюда части кода... Прошу простить

Ошибок в синтаксисе нет, но тем не менее, не работает. 

Сделал так, как вы сказали, а именно добавил отладочную печать, но в консоли ничего не выходит.

Насчет способа с читами и пропуском хода, читы вроде бы не работают в сетевой игре(А карта именно для сетевой), поэтому этот вариант не подходит
Подставил отладочную печать в функцию первого дня:

function first_day ()
if GetDate (0) == 1 then -----Проверка дня недели (понедельник)
startThread (day_1);
print("hello,");
elseif GetDate (0) == 3 then -----Проверка дня недели (среда)
startThread (day_3rd);
end;
end;

Весь скрипт:

function first_day ()
if GetDate (0) == 1 then -----Проверка дня недели (понедельник)
startThread (day_1);
print("hello,");
elseif GetDate (0) == 3 then -----Проверка дня недели (среда)
startThread (day_3rd);
end;
end;

function day_1 ()
ChangeHeroStat ('Brem', 7, -999999999); -----Убираем мувы у игрока 2
end;

function day_3rd ()
if GetTownRace ('player_1') == 1 then -----Проверка фракции города игрока 1
sleep(5);
startThread (zaclyatye_1);
end;
if GetTownRace ('player_2') == 1 then -----Проверка фракции города игрока 2
sleep(5);
startThread (zaclyatye_2);
end;
end;

function zaclyatye_1 ()
if GetTownRace ('player_2') == 0 then SetObjectPosition('zaclyatye_humy_1', 125, 15);
elseif GetTownRace ('player_2') == 1 then SetObjectPos('zaclyatye_elfy_1_1', 125, 15);
elseif GetTownRace ('player_2') == 2 then SetObjectPos('zaclyatye_magi_1', 125, 15);
elseif GetTownRace ('player_2') == 3 then SetObjectPos('zaclyatye_liga_1', 125, 15);
elseif GetTownRace ('player_2') == 4 then SetObjectPos('zaclyatye_nekry_1', 125, 15);
elseif GetTownRace ('player_2') == 5 then SetObjectPos('zaclyatye_demony_1', 125, 15);
elseif GetTownRace ('player_2') == 6 then SetObjectPos('zaclyatye_gnomy_1', 125, 15);
elseif GetTownRace ('player_2') == 7 then SetObjectPos('zaclyatye_orki_1', 125, 15);
end;
end;

function zaclyatye_2 ()
if GetTownRace ('player_1') == 0 then SetObjectPosition('zaclyatye_humy_1', 8, 122);
elseif GetTownRace ('player_1') == 1 then SetObjectPos('zaclyatye_elfy_1_2', 8, 122);
elseif GetTownRace ('player_1') == 2 then SetObjectPos('zaclyatye_magi_1', 8, 122);
elseif GetTownRace ('player_1') == 3 then SetObjectPos('zaclyatye_liga_1', 8, 122);
elseif GetTownRace ('player_1') == 4 then SetObjectPos('zaclyatye_nekry_1', 8, 122);
elseif GetTownRace ('player_1') == 5 then SetObjectPos('zaclyatye_demony_1', 8, 122);
elseif GetTownRace ('player_1') == 6 then SetObjectPos('zaclyatye_gnomy_1', 8, 122);
elseif GetTownRace ('player_1') == 7 then SetObjectPos('zaclyatye_orki_1', 8, 122);
end;
end;

Trigger(NEW_DAY_TRIGGER, 'first_day' );

И еще появился вопрос, вот у меня есть два скрипта, которые зависят от Trigger(NEW_DAY_TRIGGER) , но как я вычитал, что при использовании двух функций под один и тот же тригер отменяет вторую функцию. То есть у меня есть ...

function Spawn_army()
....
....
....
Trigger(NEW_DAY_TRIGGER, 'Spawn_army' );

Каким образом можно запустить 2 скрипта так, чтобы они начинались в один день? На примере, в среду - спавн армии в караванах и перенос пака существ на координаты игрока(Эльфу для выставления заклятых)

Аватар пользователя
1 год назад
Dogenator, на оба вопроса я отвечал в своём ЧаВо.
1. Скрипт начинает выполнение в начале первого дня и поэтому триггер NEW_DAY_TRIGGER не сработает для первого хода, он в этот момент ещё не установлен. Можно просто добавить в конце всего скрипта вызов функции вручную first_day().
2. Когда проверяется день недели, можно же вызвать не одну функцию, а несколько:
function first_day ()
if GetDate (0) == 3 then -----Проверка дня недели (среда)
function_1();
function_2();
end;
end;
3. И бонусом: то, что вы вызываете все функции в новом потоке через startThread(day_1) конечно в данном случае работать будет, но если вы не уверены зачем именно вы это делаете, а просто где-то подсмотрели, то это потенциально источник багов, например если будет код наподобие:
startThread(function_1) -- какой-то код
startThread(function_2) -- другой код, который предполагает что код из function_1 уже выполнен
то оно работать не будет (или ещё хуже, будет работать не всегда), так как эти две функции фактически запускаются параллельно и нельзя определённо сказать какая из них будет выполнена первой. Можно просто делать так:
function_1();
function_2();
В ответ пользователю Jack_of_shadows
Аватар пользователя
1 год назад
Jack, спасибо вам за ответ. Прочитал ваш документ, много полезной информации.

Касаемо пункта 2, я не совсем понял, что вы подразумеваете под «function_1” и “function_2”… Название самих функций? Или это функции, подобные function first_day , но для проверки других дней?

Насчет пункта 3, часть кода я взял из другой карты , где все работает в том виде, в каком я изначально пытался его копировать в свою карту. Но у меня это не работает.

И насчет последнего пункта, не совсем понял, что вы имеете ввиду.

Я уже попробовал сделать вызов функции через триггер прикосновения к объекту, но это тоже не дало результата.

Уже не знаю что и делать, в теории вроде бы понятно, а на деле как «обезьяна с гранатой»
В ответ пользователю Dogenator
Аватар пользователя
1 год назад
Dogenator
Касаемо пункта 2, я не совсем понял, что вы подразумеваете под «function_1” и “function_2”… Название самих функций? Или это функции, подобные function first_day , но для проверки других дней?
Названия функций, просто для примера. Скажем, возникло у вас желание сделать два события для одного триггера:
function first_day ()
...
end;
Trigger(NEW_DAY_TRIGGER, 'first_day' );

function Spawn_army()
....
end;
Trigger(NEW_DAY_TRIGGER, 'Spawn_army' );

Второй триггер перезапишет первый, работать не будет. Аналог этой конструкции:

function NewDayTrigger()
first_day();
Spawn_army();
end
Trigger(NEW_DAY_TRIGGER, 'NewDayTrigger' );

То есть чтобы исполнить функцию не надо обязательно Trigger'ы, startThread'ы и прочее, просто пишешь название функции и скобочки. В любом месте, в любых количествах. Ваши функции ничем не отличаются от встроенных функций, типа того же print().

Если что-то не работает, надо последовательно дебажить. Наверное, случай, с которым сталкивались все - нафигачил кода, допустил в нём ошибку в синтаксисе, ну там название функции вместо print() написал pint(), почти и не заметно. Движок игры просто выполняет скрипт карты строчка за строчкой - дошёл до неправильного названия функции, не понял что это такое, вылетел. Всё, скрипт больше не выполняется. Вы не поняли в чём дело, начали другой код какой-нибудь пробовать писать, а он тоже не работает. Можно сломать мозг думая что вы делаете не так, а на самом деле выполнение скрипта до вашего нового кода ни разу даже не доходило, крашилось раньше. Поэтому и очень важно ставить везде print'ы, чтобы понимать какой участок кода выполнился, какой нет. Я вам гарантирую, что если скопировать из ЧаВо конкретный кусок кода и вставить в карту (и не ошибиться в названиях объектов и файлов), то точно будет работать.

 

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


На скрине видно, что function day_3rd обрывается с момента:
if GetTownRace ('player_1') == 1 then
sleep(5);
zaclyatye_1 ()
end;
if GetTownRace ('player_2') == 1 then
sleep(5);
zaclyatye_2 ()
end;
end;

То есть, эта часть почему то не работает в моем коде. В чем может быть причина? И для чего используется функция sleep в данном скрипте?

И да, я сделал как вы сказали, а именно:

function new_day_trigger()
Spawn_army()
day_3rd()
end

Trigger(NEW_DAY_TRIGGER, 'new_day_trigger' );

Это сработало для меня, осталось решить проблему с function day_3rd. Может у вас есть какие то идеи?

Вложения 1
1 файл • Общий размер: 256,4 KB
Аватар пользователя
1 год назад
Dogenator, очевидно, нужно проверить корректность функции GetTownRace:
1. Имя городов точно 'player_1' и 'player_2'?
2. Раса которая вам нужна точно имеет идентификатор 1? А что именно возвращает данная функция? По документации вроде как RaceID, где 1 это RACE_RANDOM_TYPE, но сам я не использовал её, точно не уверен. Вообще юзать числа вместо понятных идентификаторов это путь к отладочному аду. Можно написать в консоли print(GetTownRace ('player_1')) и посмотреть что она реально вернула.

sleep() в данном скрипте используется без надобности. Два основных случая его применения, это:
1. Почти все функции работающие с объектами карты (с монстрами, строениями, героями и т.д.) исполняются условно говоря не мгновенно. Например вы хотите повесить обработчик касания на вражеского героя. Для этого надо обязательно выключить стандартный обработчик и только потом повесить свой, таковы правила игры. Но если написать:
SetObjectEnabled(hero, nil); -- выключение стандартного триггера касания героя
Trigger(HERO_TOUCH_TRIGGER, hero, func); -- установка своего триггера касания
То работать не будет, так как SetObjectEnabled(hero, nil); выполняется не мгновенно и не успеет выполниться до триггера (это упрощённое объяснение, причины конечно чуть другие). Так вот, в таких случаях всегда надо использовать sleep():
SetObjectEnabled(hero, nil); -- выключение стандартного триггера касания героя
sleep(1); -- минимальная задержка, обычно 1 хватает
Trigger(HERO_TOUCH_TRIGGER, hero, func); -- установка своего триггера касания
2. И конечно когда делаются всякие анимации, эффекты, всплывающие сообщения на карте, с помощью sleep() выставляются для них задержки.
В ответ пользователю Jack_of_shadows
Аватар пользователя
1 год назад
Действительно, я перепроверил в редакторе карт названия городов и оказалось, что они называются не 'player_1' , а 'castle1'. Из за этого все не работало. Хотя я изначально думал, что эта функция зависит от принадлежности игрока к замку (PlayerID)
По итогу я вписал названия в замки, и, о чудо, существа появляются на следующий день, скрипт заработал как нужно.

Спасибо большое вам за помощь и полезную информацию, вы действительно мне помогли😅
Аватар пользователя
1 год назад
Если что, 'player_1' это строка, PLAYER_1 это числовая переменная, и есть чувствительность к регистру, то есть PLAYER_1 не равнозначен player_1 и они оба не равнозначны 'player_1'.
Аватар пользователя
1 год назад

Всем здравствуйте!

Возникла такая проблема:

Установил скрипт по смене дня-ночи, все работает, но...

При смене дневного освещения на ночное - становится недоступно меню героев, причем только для игрока №1

В чем может быть проблема?

Вот код:

curr_light = 'day'

function DayNight()
if curr_light == 'day' then
SetAmbientLight(GROUND, 'NIGHT', 1, 5.0)
curr_light = 'night'
else
SetAmbientLight(GROUND, 'DAY', 1, 5.0)
curr_light = 'day'
end
end

Статистика

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

Сейчас на сайте 3 пользователей 1284 гостей