Точки с запятой можете вообще не ставить.
function GarrisonBlock()
while 1 do
if GetObjectOwner("Fortress_2")==GetObjectOwner("Dungeon_1") then
SetObjectEnabled("Garnizon_1", 1, GetObjectOwner("Dungeon_1"))
while not IsObjectEnabled("Garnizon_1") do sleep(1) end
end
for i=1,8 do
if GetPlayerState(i)==PLAYER_ACTIVE and i~=GetObjectOwner("Dungeon_1") and i~=GetObjectOwner("Fortress_2") and IsObjectEnabled("Garnizon_1") then
SetObjectEnabled("Garnizon_1", nil, i)
end;
end;
sleep(1)
end;
end;
startThread(GarrisonBlock)
Я не туда второй sleep(1) поставил, поэтому цикл вращался без слипа, и при невыполнении условия зависала игра.