Небольшой экскурс. hero — это переменная. Чтобы в неё было что-то записано, нужно туда что-то записать! Это делается ручным объявлением переменной или же игра своими действиями запишет в локальную что-то. Для этого в подтриггерную функцию указываются аргументы (список указан в мануале разработчиков у функции Trigger). То есть
function Test(hero)
if hero == "..." then
end
end
Trigger(OBJECT_TOUCH_TRIGGER, ...).
В вашем случае код нужно поменять так:
function OPIT(hero)
number = GetCurrentPlayer() --Рекомендую заменить на number=GetObjectOwner(hero)
local Gold = GetPlayerResource(number,6) --Переменную лучше держать локальную
if Gold >= 6000 then
QuestionBoxForPlayers(number,"Maps/Multiplayer/JoyPatriot/Teks/Vopros.txt", "yes([["..hero.."]])", "no")
else MessageBoxForPlayers(number,"Maps/Multiplayer/JoyPatriot/Teks/OP.txt", nil)
end
end
function yes(hero)
number = GetCurrentPlayer() --То же самое. Лучше number=GetObjectOwner(hero)
local Gold = GetPlayerResource(number) --Ничего страшного в повторении операции нет, хотя можно и лучше сделать; но главное — исключена ошибка с перезаписью чего-то в переменную Gold
SetPlayerResource(number,6,Gold-6000)
LevelUpHero(hero)
return parse '' --Убираем машинную ошибку, которая ни на что не влияет. Иначе в консоль будет спамиться предупреждение
end
SetObjectEnabled("OP",nil);
Trigger(OBJECT_TOUCH_TRIGGER,"OP","OPIT");
P.s. Переменным рекомендую давать осмысленный названия. И объектам тоже. Например, "ExperienceStone" и "ExperienceStoneTouch", соответственно...