Форум HeroesWorld-а - Показать сообщение отдельно - Скрипты
Тема: Скрипты
Показать сообщение отдельно
#3616
Старый 16.05.2022, 16:41
  #3616
^
Jewily
 
Аватар для Jewily
📖
Регистрация: 25.09.2016
Сообщения: 136
Jewily#4267
Регистрация: 25.09.2016
Сообщения: 136
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 вне форума
Ответить с цитированием