There is a much simpler way if you don't want to use the reserve - the function "MakeHeroInteractWithObject( heroName, objectName )". Enter the script names of your own and the desired enemy hero, and then your hero essentially touches the enemy one, thereby triggering combat. If the target enemy hero is in a town, then in objectName you need to specify the script name of the town they are in (or simply run SiegeTown(heroName, townName, arenaName = "")). If the town doesn't have a script name, then you need to "kick" the hero out of the town via SetObjectPosition(). Now, if you need a specific Combat Script to be triggered during all this, then in the Shared of the main (your) hero, specify the path to the script that will run at every one of their skirmishes, and write conditions so that the script only executes its code if we meet a certain hero, for example (I took this code from my own map, which handles the meeting of specific heroes, like when my hero attacks/is attacked by certain heroes):
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
endThat's how it is)