Есть вариант проще.
function GarrisonBlock()
while 1 do
if GetObjectOwner("Замок2")==GetObjectOwner("Замок1") then --Ваше условие истинно, только если оба замка принадлежат одному игроку
SetObjectEnabled("Гарнизон", 1, GetObjectOwner("Замок1")) --Разблокируем гарнизон владельцу обоих замков
while not IsObjectEnabled("Гарнизон") do sleep(1) end
end
for i=1,8 do
if GetPlayerState(i)==PLAYER_ACTIVE and i~=GetObjectOwner("Замок1") and i~=GetObjectOwner("Замок2") and IsObjectEnabled("Гарнизон") then --Если игрок активен и не владелец обоих замков, но гарнизон ему разблокирован, то
SetObjectEnabled("Гарнизон", nil, i) --Заблокировать гарнизон ему
end
end
sleep(1)
end
startThread(GarrisonBlock)
Да, скрипт не очень красивый, можно было бы и имена в переменные загнать, чтобы не писать 5 раз, а еще лучше в аргументы функции, можно еще использовать триггер смены владельца замка и проверку на старте карты, чтоб лишний цикл не крутился.