Сейчас не могу проверить.
У меня вызвали сомнения вот эти строчки:
local x,y,p = 0;
if IsObjectExists("Olhar") == true then
x,y,p = GetObjectPosition("Olhar");
end;
if GetHeroTown("Olhar") ~= nil then
p = 1;
end;
1. local x, y, p = 0;
-- эквивалентно --
local x = 0
local y = nil
local p = nil
-- а не --
local x = 0
local y = 0
local p = 0
2. В функции, которая вызывается только для живого героя проверяется его наличие, причём нетривиальным (IsHeroAlive) способом. Зачем?
3. Не используется функция, которая даёт имя города вместо имени героя, если тот в городе, что может привести GetObjectPosition к ошибке.
P.S. Смотрел по 76-й сборке.