Скрипты - Страница 264 - Форум HeroesWorld-а

Быстрая навигация по основным разделам форума:
Турниры
КАРТЫ
Heroes 6
Heroes 5
Heroes 4
Heroes 3
Heroes 2
Heroes 1
Might&Magic

Герои Меча и Магии 5 - Картостроительство (Редактор карт) В этом разделе можно обсуждать все что касается редактора карт для Heroes of Might and Magic V. Так же здесь обсуждаем картостроительство.

Ответ
Страница 264 из 267
 
Опции темы
#3946
Старый 14.10.2024, 23:37
  #3946
^
CetusSantis
📖
Регистрация: 13.10.2024
Сообщения: 5
Регистрация: 13.10.2024
Сообщения: 5
По умолчанию
Re: Скрипты

При нажатии на check в редакторе пишет, что "Function FightUnitExp not definied, line 1". Но раз в ванилле работает, то видимо просто забью.
CetusSantis вне форума
Ответить с цитированием
#3947
Старый 14.10.2024, 23:42
  #3947
^
Долгий
 
Аватар для Долгий
📖
Регистрация: 23.04.2019
Сообщения: 109
Регистрация: 23.04.2019
Сообщения: 109
По умолчанию
Re: Скрипты

Скопируйте и вставьте прям вот так в главный скрипт карты (не скрипт юнита, не боевой скрипт):

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")

и проверьте в игре
Долгий вне форума
Ответить с цитированием
#3948
Старый 15.10.2024, 22:18
  #3948
^
CetusSantis
📖
Регистрация: 13.10.2024
Сообщения: 5
Регистрация: 13.10.2024
Сообщения: 5
По умолчанию
Re: Скрипты

Все получилось! И с модом тоже работает! Огромное спасибо!

Добавлено через 22 часа 28 минут
Один момент, а если я хочу таких юнитов несколько поставить на карту? То им всем нужны свои имена и своя функция? Я пробовал просто поставить ещё одного юнита с таким же именем, но скрипт срабатывает лишь при убийстве первого.
CetusSantis вне форума
Ответить с цитированием
#3949
Старый 15.10.2024, 23:56
  #3949
^
Долгий
 
Аватар для Долгий
📖
Регистрация: 23.04.2019
Сообщения: 109
Регистрация: 23.04.2019
Сообщения: 109
По умолчанию
Re: Скрипты

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
Долгий вне форума
Ответить с цитированием
#3950
Старый 04.12.2024, 02:43
  #3950
^
Dogenator
 
Аватар для Dogenator
📖
Регистрация: 06.06.2024
Сообщения: 58
Регистрация: 06.06.2024
Сообщения: 58
По умолчанию
Re: Скрипты

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

Вложение 73917

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

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

Миниатюры
Нажмите на изображение для увеличения
Название:  2024-12-04_01-38-39.png
Просмотров: 27
Размер:	58.6 Кбайт
ID:	73917  
Dogenator вне форума
Ответить с цитированием
#3951
Старый 04.12.2024, 10:03
  #3951
^
}{0TT@6bI4
 
Аватар для }{0TT@6bI4
📖
Регистрация: 05.09.2019
Адрес: Серебряные Города, Аль-Сафир
Сообщения: 2056
Выставка наград
Регистрация: 05.09.2019
Адрес: Серебряные Города, Аль-Сафир
Сообщения: 2056
Выставка наград
По умолчанию
Re: Скрипты

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
_________________
Группа картостроителей
Там ответы на вопросы, руководства, гайды и прочее
Discord-сервер "Герои 5: S.T.A.L.K.E.R"
Сервер по модификации "Герои 5: S.T.A.L.K.E.R"
_________________
С уважением, }{0TT@6bI4
_________________
Группа картостроителей
Там ответы на вопросы, руководства, гайды и прочее
Discord-сервер "Герои 5: S.T.A.L.K.E.R"
Сервер по модификации "Герои 5: S.T.A.L.K.E.R"
_________________
}{0TT@6bI4 вне форума
Ответить с цитированием
#3952
Старый 04.12.2024, 18:31
  #3952
^
Dogenator
 
Аватар для Dogenator
📖
Регистрация: 06.06.2024
Сообщения: 58
Регистрация: 06.06.2024
Сообщения: 58
По умолчанию
Re: Скрипты

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

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

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

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

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 скрипта так, чтобы они начинались в один день? На примере, в среду - спавн армии в караванах и перенос пака существ на координаты игрока(Эльфу для выставления заклятых)

Dogenator вне форума
Ответить с цитированием
#3953
Старый 05.12.2024, 06:07
  #3953
^
Jack_of_shadows
 
Аватар для Jack_of_shadows
📖
Регистрация: 08.09.2013
Сообщения: 551
Выставка наград
Регистрация: 08.09.2013
Сообщения: 551
Выставка наград
По умолчанию
Re: Скрипты

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();
__________________
РПГ-сценарий для HoMM5: Путь героя

ЧаВо по созданию карт для HoMM5: ЧаВо
РПГ-сценарий для HoMM5: Путь героя

ЧаВо по созданию карт для HoMM5: ЧаВо
Jack_of_shadows вне форума
Ответить с цитированием
#3954
Старый 05.12.2024, 19:40
  #3954
^
Dogenator
 
Аватар для Dogenator
📖
Регистрация: 06.06.2024
Сообщения: 58
Регистрация: 06.06.2024
Сообщения: 58
По умолчанию
Re: Скрипты

Jack, спасибо вам за ответ. Прочитал ваш документ, много полезной информации.

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

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

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

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

Уже не знаю что и делать, в теории вроде бы понятно, а на деле как «обезьяна с гранатой»
Dogenator вне форума
Ответить с цитированием
#3955
Старый 06.12.2024, 07:02
  #3955
^
Jack_of_shadows
 
Аватар для Jack_of_shadows
📖
Регистрация: 08.09.2013
Сообщения: 551
Выставка наград
Регистрация: 08.09.2013
Сообщения: 551
Выставка наград
По умолчанию
Re: Скрипты

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'ы, чтобы понимать какой участок кода выполнился, какой нет. Я вам гарантирую, что если скопировать из ЧаВо конкретный кусок кода и вставить в карту (и не ошибиться в названиях объектов и файлов), то точно будет работать.

 

__________________
РПГ-сценарий для HoMM5: Путь героя

ЧаВо по созданию карт для HoMM5: ЧаВо
РПГ-сценарий для HoMM5: Путь героя

ЧаВо по созданию карт для HoMM5: ЧаВо
Jack_of_shadows вне форума
Ответить с цитированием
#3956
Старый 06.12.2024, 16:00
  #3956
^
Dogenator
 
Аватар для Dogenator
📖
Регистрация: 06.06.2024
Сообщения: 58
Регистрация: 06.06.2024
Сообщения: 58
По умолчанию
Re: Скрипты

Сделал так, как вы сказали и вот что получилось:
Сделав отладочную печать, выяснилось, что часть этого кода просто не работает само по себе, хотя ошибок никаких нет. 
Нажмите на изображение для увеличения
Название: 2024-12-06_14-45-50.png
Просмотров: 13
Размер:	406.5 Кбайт
ID:	73946

На скрине видно, что 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. Может у вас есть какие то идеи?

Dogenator вне форума
Ответить с цитированием
#3957
Старый 06.12.2024, 17:16
  #3957
^
Jack_of_shadows
 
Аватар для Jack_of_shadows
📖
Регистрация: 08.09.2013
Сообщения: 551
Выставка наград
Регистрация: 08.09.2013
Сообщения: 551
Выставка наград
По умолчанию
Re: Скрипты

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() выставляются для них задержки.
__________________
РПГ-сценарий для HoMM5: Путь героя

ЧаВо по созданию карт для HoMM5: ЧаВо
РПГ-сценарий для HoMM5: Путь героя

ЧаВо по созданию карт для HoMM5: ЧаВо
Jack_of_shadows вне форума
Ответить с цитированием
#3958
Старый 06.12.2024, 18:23
  #3958
^
Dogenator
 
Аватар для Dogenator
📖
Регистрация: 06.06.2024
Сообщения: 58
Регистрация: 06.06.2024
Сообщения: 58
По умолчанию
Re: Скрипты

Действительно, я перепроверил в редакторе карт названия городов и оказалось, что они называются не 'player_1' , а 'castle1'. Из за этого все не работало. Хотя я изначально думал, что эта функция зависит от принадлежности игрока к замку (PlayerID)
По итогу я вписал названия в замки, и, о чудо, существа появляются на следующий день, скрипт заработал как нужно.

Спасибо большое вам за помощь и полезную информацию, вы действительно мне помогли😅
Dogenator вне форума
Ответить с цитированием
#3959
Старый 06.12.2024, 19:37
  #3959
^
Jack_of_shadows
 
Аватар для Jack_of_shadows
📖
Регистрация: 08.09.2013
Сообщения: 551
Выставка наград
Регистрация: 08.09.2013
Сообщения: 551
Выставка наград
По умолчанию
Re: Скрипты

Если что, 'player_1' это строка, PLAYER_1 это числовая переменная, и есть чувствительность к регистру, то есть PLAYER_1 не равнозначен player_1 и они оба не равнозначны 'player_1'.
__________________
РПГ-сценарий для HoMM5: Путь героя

ЧаВо по созданию карт для HoMM5: ЧаВо
РПГ-сценарий для HoMM5: Путь героя

ЧаВо по созданию карт для HoMM5: ЧаВо
Jack_of_shadows вне форума
Ответить с цитированием
#3960
Старый 28.12.2024, 15:51
  #3960
^
Dogenator
 
Аватар для Dogenator
📖
Регистрация: 06.06.2024
Сообщения: 58
Регистрация: 06.06.2024
Сообщения: 58
По умолчанию
Re: Скрипты

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

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

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

При смене дневного освещения на ночное - становится недоступно меню героев, причем только для игрока №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
Dogenator вне форума
Ответить с цитированием
Ответ
Страница 264 из 267


Опции темы



Часовой пояс GMT +4, время: 07:02.


vBulletin v3.5.0, Copyright ©2000-2026, Jelsoft Enterprises Ltd. (Русский)

Яндекс цитирование    Top.Mail.Ru