Эх, проще всё-таки регионом. Создаёте его сразу за гарнизоном. Потом пишите такой скрипт:
EnableHeroAI('Duncan',false);
function garrison(hero)
if hero=='Giovanni' then
SetObjectOwner('Duncan',PLAYER_1);
end;
Trigger(REGION_ENTER_AND_STOP_TRIGGER, 'reg', nil);
end;
Trigger(REGION_ENTER_AND_STOP_TRIGGER, 'reg', 'garrison', nil);
Здесь Giovanni - скриптовое имя вашего героя, а Duncan - героя, который должен присоединиться. Регион советую назвать reg, чтобы потом не путаться. Скрипт проверен на работоспособность (см. скриншоты).