Сообщения от Скрипты
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")
и проверьте в игре
Добавлено через 22 часа 28 минут
Один момент, а если я хочу таких юнитов несколько поставить на карту? То им всем нужны свои имена и своя функция? Я пробовал просто поставить ещё одного юнита с таким же именем, но скрипт срабатывает лишь при убийстве первого.
Все получилось! И с модом тоже работает! Огромное спасибо!
Добавлено через 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
Всем здравствуйте. Появился вопрос по скрипту ( на скрине). Уже не знаю что сделать, чтобы он заработал, триггер его не активирует
И возможно сделать такой скрипт, который бы автоматически пропускал ход в первый день у игрока 2? Не нашел ничего подобного в мануалах, поэтому пошел путем изменения числа MP игрока 2
Подскажите, пожалуйста
Всем здравствуйте. Появился вопрос по скрипту ( на скрине). Уже не знаю что сделать, чтобы он заработал, триггер его не активирует
И возможно сделать такой скрипт, который бы автоматически пропускал ход в первый день у игрока 2? Не нашел ничего подобного в мануалах, поэтому пошел путем изменения числа MP игрока 2
Подскажите, пожалуйста
function MyFunc(var)
-- Немного lua-кода
print("Hello, ", var);
endМожно из скрипта включить читы и скипнуть ход:
consoleCmd("enable_cheats")
consoleCmd("eot")Более простой способ — отобрать очки передвижения у героя:
ChangeHeroStat("Герой", HERO_STAT_MOVE_POINTS, -GetHeroStat("герой", HERO_STAT_MOVE_POINTS)
Еще не до конца разобрался со всеми возможностями форума и как вставлять сюда части кода... Прошу простить
Ошибок в синтаксисе нет, но тем не менее, не работает.
Сделал так, как вы сказали, а именно добавил отладочную печать, но в консоли ничего не выходит.
Насчет способа с читами и пропуском хода, читы вроде бы не работают в сетевой игре(А карта именно для сетевой), поэтому этот вариант не подходит
Подставил отладочную печать в функцию первого дня:
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. Скрипт начинает выполнение в начале первого дня и поэтому триггер 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();
Касаемо пункта 2, я не совсем понял, что вы подразумеваете под «function_1” и “function_2”… Название самих функций? Или это функции, подобные function first_day , но для проверки других дней?
Насчет пункта 3, часть кода я взял из другой карты , где все работает в том виде, в каком я изначально пытался его копировать в свою карту. Но у меня это не работает.
И насчет последнего пункта, не совсем понял, что вы имеете ввиду.
Я уже попробовал сделать вызов функции через триггер прикосновения к объекту, но это тоже не дало результата.
Уже не знаю что и делать, в теории вроде бы понятно, а на деле как «обезьяна с гранатой»
Касаемо пункта 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'ы, чтобы понимать какой участок кода выполнился, какой нет. Я вам гарантирую, что если скопировать из ЧаВо конкретный кусок кода и вставить в карту (и не ошибиться в названиях объектов и файлов), то точно будет работать.
Сделав отладочную печать, выяснилось, что часть этого кода просто не работает само по себе, хотя ошибок никаких нет.
На скрине видно, что 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. Имя городов точно '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() выставляются для них задержки.
По итогу я вписал названия в замки, и, о чудо, существа появляются на следующий день, скрипт заработал как нужно.
Спасибо большое вам за помощь и полезную информацию, вы действительно мне помогли😅
Всем здравствуйте!
Возникла такая проблема:
Установил скрипт по смене дня-ночи, все работает, но...
При смене дневного освещения на ночное - становится недоступно меню героев, причем только для игрока №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