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

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

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

Ответ
Страница 242 из 242
 
Опции темы
#3616
Старый 16.05.2022, 16:41
  #3616
^
Jewily
 
Аватар для Jewily
📖
Регистрация: 25.09.2016
Сообщения: 104
Jewily#4267
Регистрация: 25.09.2016
Сообщения: 104
Jewily#4267
По умолчанию
Re: Скрипты

МартаЕщё вопрос. Как отследить результаты боя с нейтральными монстрами?
Мне нужен скрипт для героев 1го игрока, который проверял бы, что такие-то монстры после боя сдохли или живы, и в зависимости от результата позволял бы уничтожить, скажем, REGION_ENTER_AND_STOP_TRIGGER, или оставить.
Это я стражей для телепортов пытаюсь сделать, - и, учитывая что у меня этих телепортов уже немеряно, писать на каждого нейтрала отдельный квест - это слишком игру загрузит.

Если делать внезапный бой, то как мне после 

function guard_Tilgatal_battle_F(heroname)
local player = GetObjectOwner(heroname)
if(player == 1) then
StartCombat(heroname, nil, 3, 80, 12, 158, 5, 142, 12, nil, nil, nil);

зафиксировать результаты боя?

А если эти монстры стоят на карте, я вообще не знаю, куда там скрипт цеплять.
К самим монстрам? Непонятно, что писать.

Я пыталась что-то намутить с COMBAT_RESULTS_TRIGGER, но плохо понимаю, как это работает, и совсем не понимаю, можно ли это применять к монстрам, а не к героям.

Сначала про StartCombat. Если вы напишите StartCombat(heroname, nil, 3, 80, 12, 158, 5, 142, 12, nil, "combatCallback" , nil, nil),
функция combatCallback(heroname,result) получит в себя имя героя и результат. если result  будет nil - герой проиграл, not nil - герой выиграл. Соответственно из этих данных можете состряпать условия.

Теперь по поводу рандомного боя. Вы регистрирует триггер Trigger( COMBAT_RESULTS_TRIGGER, "MyCombatResultsHandler" )
В функцию MyCombatResultsHandler(combatIndex) после любой драки прилетит уникальный индекс сражения - число, в общем-то, которое характеризует конкрентое сражение.
В ней вы проверяете if( GetSavedCombatResult(combatIndex) == COMBAT_RESULT_WIN) -- Это значит, что сражение завершилось чьей-то победой.
Затем проверяем if(GetSavedCombatArmyPlayer(combatIndex,0) == PLAYER_NONE and GetSavedCombatArmyPlayer(combatIndex,1) == 1). GetSavedCombatArmyPlayer(combatIndex,1/0) - функция которая возвращает номер игрока, либо проигравшего либо победившего. В случае когда второй параметр 0 - это проигравший, если передать 1 - будет победитель.
Если все вышеперечисленные проверки прошли - значит вы определили, что с нейтралами дрался ваш первый игрок, и победил.
Теперь о том, как же сделать проверку на конкретных убитых монстров. Для начала им нужно дать скриптовое имя в редакторе, думаю как - знаете.
Затем два пути: один сложный, рассчитаный на большие карты с большим количеством таких вот монстров на проверку, его вам понять будет трудно, хотя он является правильным с точки зрения программирования и логики. Другой - попроще.
Идём по пути "попроще", в целях экономии времени. В начале файла карты делаем переменных n штук, на каждый отряд для проверки , например :
ALIVE_GUARD_1 = not nil
ALIVE_GUARD_2 = not nil
...
ALIVE_GUARD_N = not nil

затем,банально, пишите кучу проверок следующего вида :

if(ALIVE_GUARD_N == not nil) then
  if(IsObjectExists("GUARD_N") == nil) then -- Если прошло, значит ваш страж помер.
    ALIVE_GUARD_N = nil -- Обязательно говорим, чтобы больше не проверялось условие.
    ... -- Делаем тут ваши всякие действия.
  end
end

 

Примерно такая технология. Готовых скриптов на эту тему не имею, так что разбирайтесь
Чтобы не потеряться в именах стражей, можете сделать вместо того списка переменных какую-то удобную таблицу,
если разбираетесь. Если нет - то объяснять, опять же, достаточно долго, и это описано в руководстве.
__________________




Не уходи безропотно во тьму,
Будь яростней пред ночью всех ночей,
Не дай погаснуть свету своему!

Хоть мудрый знает – не осилишь тьму
Во мгле словами не зажжёшь лучей –
Не уходи безропотно во тьму.




                                                                                       




Не уходи безропотно во тьму,
Будь яростней пред ночью всех ночей,
Не дай погаснуть свету своему!

Хоть мудрый знает – не осилишь тьму
Во мгле словами не зажжёшь лучей –
Не уходи безропотно во тьму.




                                                                                       
Jewily сейчас на форуме
Ответить с цитированием
#3617
Старый Вчера, 23:41
  #3617
^
Марта
📖
Регистрация: 31.01.2020
Сообщения: 41
Регистрация: 31.01.2020
Сообщения: 41
По умолчанию
Re: Скрипты

Господа, сорри, два дня не была на этом форуме, но я всё ещё здесь, и всё ещё нуждаюсь в помощи).
У меня такой вопрос.

Есть REGION_ENTER_AND_STOP_TRIGGER, который перемещает объекты в зависимости от того, принадлежат ли ближайшие к ним замки первому игроку.
Возможно ли в эту функцию записать несколько замков, или надо на каждый отдельный объект и замок рисовать отдельный регион?

То есть, я пишу:

function Beacon_Tilgatal_F ()
 if GetObjectOwner("Dungeon_1") == 1 then
  SetObjectPosition("Port_Tilgatal", 81, 133, 0);
  sleep(1);
  print("замок Тилгатал наш");
  sleep(1);
else
 SetObjectPosition("Port_Tilgatal", 127, 142, 1);
 sleep(1);
 print("замок Тилгатал не наш");
 sleep(1);
 end;
 end;

Trigger(REGION_ENTER_AND_STOP_TRIGGER, "Beacon_Tilgatal_trigger", "Beacon_Tilgatal_F");

И тут всё в порядке, объект перемещается куда надо.

Но возможно ли к этому же триггеру, в этой же функции, прикрутить другие замки и объекты? Как такое сделать?
То есть, к первому отрывку прикрутить вот этот,


  if GetObjectOwner("Dungeon_2") == 1 then
  SetObjectPosition("Port_Halad", 63, 104, 0);
  sleep(1);
  print("замок Халад наш");
  sleep(1);
else
 SetObjectPosition("Port_Halad", 127, 142, 1);
 sleep(1);
 print("замок Халад не наш");
 sleep(1);

И вот этот?

  if GetObjectOwner("Dungeon_3") == 1 then
  SetObjectPosition("Port_Torost", 104, 105, 0);
  sleep(1);
  print("замок Торост наш");
  sleep(1);
else
 SetObjectPosition("Port_Torost", 127, 142, 1);
 sleep(1);
 print("замок Торост не наш");                                                                                                                                                                                         sleep(1);                                                                                                                                                                                                                                                             
     ЗЫ  Jewily, насилу-то я разобралась с внезапными нападениями, спасибо вам большое. С монстрами на карте - пока не поняла, но сейчас мне хватает и регионов.
Марта вне форума
Ответить с цитированием
#3618
Старый Сегодня, 08:22
  #3618
^
Азгалор
📖
Регистрация: 24.04.2016
Сообщения: 89
Регистрация: 24.04.2016
Сообщения: 89
По умолчанию
Re: Скрипты

Марта, if ( GetObjectOwner("Dungeon_1") == 1 ) and ( GetObjectOwner("Dungeon_2") == 1 ) then 

Для примера

Азгалор вне форума
Ответить с цитированием
#3619
Старый Сегодня, 11:55
  #3619
^
Марта
📖
Регистрация: 31.01.2020
Сообщения: 41
Регистрация: 31.01.2020
Сообщения: 41
По умолчанию
Re: Скрипты

Азгалор, нет, это не подходит, скопом замки и объекты прописывать нельзя.
Разные объекты Port связаны с разными замками.
Первый и третий замок могут принадлежать первому игроку, а второй замок - кому-то ещё. 
Мне не нужна проверка на присоединение всех замков разом, - мне, как раз, нужен такой скрипт, чтобы хозяева у замков могли бы быть разными, и при этом менялись бы позиции объектов.

Добавлено через 49 минут
Хотелось бы как-то так:

function Beacon_Tilgatal_F ()
 if (GetObjectOwner("Dungeon_1") == 1) then
  SetObjectPosition("Port_Tilgatal", 81, 133, 0);
  sleep(1);
  print("наш замок Тилгатал");
  sleep(1);

else
if (GetObjectOwner("Dungeon_1") == 2)
 or (GetObjectOwner("Dungeon_1") == 3)
 or (GetObjectOwner("Dungeon_1") == 4)
 or (GetObjectOwner("Dungeon_1") == 5)
 or (GetObjectOwner("Dungeon_1") == 6)
 or (GetObjectOwner("Dungeon_1") == 7)
 or (GetObjectOwner("Dungeon_1") == 8)
 or (GetObjectOwner("Dungeon_1") == 0) then
  SetObjectPosition("Port_Tilgatal", 125, 142, 1);
  sleep(1);
  print("не наш замок Тилгатал");
  sleep(1);

 else
  print("сюда надо как-то прицепить второй замок");
 sleep(1);
 end;
  end;
   end;

   Trigger(REGION_ENTER_AND_STOP_TRIGGER, "Beacon_Tilgatal_trigger", "Beacon_Tilgatal_F");

Только это ни хрена не работает).
Марта вне форума
Ответить с цитированием
#3620
Старый Сегодня, 12:07
  #3620
^
Азгалор
📖
Регистрация: 24.04.2016
Сообщения: 89
Регистрация: 24.04.2016
Сообщения: 89
По умолчанию
Re: Скрипты

Марта, извиняюсь, не доглядел что именно Вам необходимо... Да, конечно можно. К первой функции прикручиваем дополнительные проверки, т.е:

function Beacon_Tilgatal_F ()
 if GetObjectOwner("Dungeon_1") == 1 then
  SetObjectPosition("Port_Tilgatal", 81, 133, 0);
  sleep(1);
  print("замок Тилгатал наш");
  sleep(1);
else
 SetObjectPosition("Port_Tilgatal", 127, 142, 1);
 sleep(1);
 print("замок Тилгатал не наш");
 sleep(1);
 end;
  if GetObjectOwner("Dungeon_2") == 1 then
  SetObjectPosition("Port_Halad", 63, 104, 0);
  sleep(1);
  print("замок Халад наш");
  sleep(1);
else
 SetObjectPosition("Port_Halad", 127, 142, 1);
 sleep(1);
 print("замок Халад не наш");
 sleep(1);
end;
  if GetObjectOwner("Dungeon_3") == 1 then
  SetObjectPosition("Port_Torost", 104, 105, 0);
  sleep(1);
  print("замок Торост наш");
  sleep(1);
else
 SetObjectPosition("Port_Torost", 127, 142, 1);
 sleep(1);
 print("замок Торост не наш");                                                                                                                                                                                         
sleep(1);
end;
end;

 

Мартаif (GetObjectOwner("Dungeon_1") == 2)
 or (GetObjectOwner("Dungeon_1") == 3)
 or (GetObjectOwner("Dungeon_1") == 4)
 or (GetObjectOwner("Dungeon_1") == 5)
 or (GetObjectOwner("Dungeon_1") == 6)
 or (GetObjectOwner("Dungeon_1") == 7)
 or (GetObjectOwner("Dungeon_1") == 8)
 or (GetObjectOwner("Dungeon_1") == 0) then

Эту проверку на принадлежности к игрокам можно сократить до такого(т.к. Вам нужно чтобы только один игрок владел замками):

if (GetObjectOwner("Dungeon_1") ~= 1) then --Если замок не принадлежит первому игроку то тут наши полномочия всё
Азгалор вне форума
Ответить с цитированием
#3621
Старый Сегодня, 15:25
  #3621
^
Марта
📖
Регистрация: 31.01.2020
Сообщения: 41
Регистрация: 31.01.2020
Сообщения: 41
По умолчанию
Re: Скрипты

Увы, опять не пашет. Перемещает только первый объект Port_Tilgatal, и в случае когда замок принадлежит первому игроку, и в случае, когда его захватывает враг.
А остальные два объекта не перемещает, и принтов не пишет.

За сокращение спасибо, я так и знала, что что-то такое должно быть вместо моего индийского кода).

Добавлено через 1 час 58 минут
Ессс, вот оно, просветление-то! Вот так - работают все три.

function Beacon_Tilgatal_F ()
 if GetObjectOwner("Dungeon_1") == 1 then
  SetObjectPosition("Port_Tilgatal", 81, 132, 0);
  sleep(1);
  print("замок Тилгатал наш");
  sleep(1);
elseif (GetObjectOwner("Dungeon_1") ~= 1) then
 SetObjectPosition("Port_Tilgatal", 125, 142, 1);
 sleep(1);
 print("замок Тилгатал не наш");
 sleep(1);
 end;

if GetObjectOwner("Dungeon_2") == 1 then
  SetObjectPosition("Port_Halad", 63, 104, 0);
  sleep(1);
  print("замок Халад наш");
  sleep(1);
elseif (GetObjectOwner("Dungeon_2") ~= 1) then
 SetObjectPosition("Port_Halad", 126, 141, 1);
 sleep(1);
 print("замок Халад не наш");
 sleep(1);
end;

if GetObjectOwner("Dungeon_3") == 1 then
  SetObjectPosition("Port_Torost", 104, 105, 0);
  sleep(1);
  print("замок Торост наш");
  sleep(1);
elseif (GetObjectOwner("Dungeon_3") ~= 1) then
 SetObjectPosition("Port_Torost", 126, 143, 1);
 sleep(1);
 print("замок Торост не наш");
sleep(1);
end;
end;

Trigger(REGION_ENTER_AND_STOP_TRIGGER, "Beacon_Tilgatal_trigger", "Beacon_Tilgatal_F");

Спасибо, Азгалор, без вас до меня бы точно не дошло.
Марта вне форума
Ответить с цитированием
#3622
Старый Сегодня, 16:29
  #3622
^
Азгалор
📖
Регистрация: 24.04.2016
Сообщения: 89
Регистрация: 24.04.2016
Сообщения: 89
По умолчанию
Re: Скрипты

Марта, хорошо что у Вас получилось прийти к нужному результату) Хотя странно, ведь мной написанный код работал. Потестировал на карте на существах - телепортировались в разные точки в зависимости от принадлежности городов, и print'ы срабатывали...
Азгалор вне форума
Ответить с цитированием
Ответ
Страница 242 из 242


Опции темы



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


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

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