Есть способ гораздо проще, если тебе не хочется пользоваться резервом - функция "MakeHeroInteractWithObject( heroName, objectName )". Вводишь скриптовые имена своего и нужного вражеского героя, и тогда твой герой как бы касается вражеского, тем самым запуская комбат. Если целевой вражеский герой сидит в городе, то в objectName нужно указывать скриптовое имя города, в котором он сидит(Ну или же запускать SiegeTown(heroName, townName, arenaName = "")). Если у города нет скриптового имени, то тогда нужно "пнуть" героя из города через SetObjectPosition(). Ну а если нужно, чтобы при этом всём запускался какой-то Combat Script, то тогда в Shared главного(своего) героя прописываешь путь к скрипту, который будет запускаться при каждой его стычке, и впиши условия, по которым скрипт начнет отрабатывать код только если мы встретимся с определенным героем, например(код взял со своей карты, который отрабатывает на встречу нужных героев, типа мой герой нападет/атакован определенными героями):
function CheckHero()
if (GetDefenderHero() and GetHeroName(GetDefenderHero()) == "Duncan") or (GetAttackerHero() and GetHeroName(GetAttackerHero()) == "Duncan") then
if (GetDefenderHero() and GetHeroName(GetDefenderHero()) == "Freyda") or (GetAttackerHero() and GetHeroName(GetAttackerHero()) == "Freyda") then
print("Рубль будет? Мне на яхту не хватает")
end
end
Такие дела)