Динамическая пауза, зависящая от какого либо события:
задаем константу времени
использует труп
гоняем паузу пока серийник трупа не будет равен серийнику последнего открытого контейнера, последний открытый контейнер будет не нулевым, или дистанция до трупа не будет превышать дистанцию доступную для открытия трупа, или не пройдет несколько секунды времени.
Code:
timemove=UO.Timer()
uo.useobject(corpse)
repeat
wait(lootwait)
until (UO.GetSerial(corpse)<>uo.GetSerial('lastcontainer') && uo.GetSerial('lastcontainer')<>'0xFFFFFFFF') || Uo.GetDistance(corpse) <= LootDist || timemove+10>UO.Timer()
Если сравнить с простыми wait(100) или wait(500) то в первом случае моя пауза независима от лага а 100 может и не сработать, а во втором случае моя пауза сработает быстрее чем 500 мсек.
Защита от повторного запуска:
Code:
sub Rez_Cleaver()
UO.Set('quiet','1')
if val(uo.getGlobal('running'))==1 then ; эти
uo.setGlobal('running',2) ; три
REZall('0x0EC2','0x0000')
uo.setGlobal('running',1) ; строчки
endif
UO.Set('quiet','0')
end sub
где то там выше задается глобальная переменная равная 1. Скрипт запустится только если она равна 1 и сразу переключит её на 2. Повторный запуск проверит переменную и выключит повторно запущенный скрипт. Когда скрипт успешно завершит свою работу переменная опять станет равной 1 и скрипт будет доступен для запуска.
Это нужно например в ситуации когда лежит 2 тела и ты случайно нажимаешь 2 раза на лут. 2 скрипта начнут одновременно пытаться облутить оба тела, один скрипт ищет в первом теле, в этот момент второй скрипт пытается переместить предмет из второго тела, ID найденных предметов разные но переместить то нужно.... Инжект крашит клиент от таких оборотов. Защита от повторного запуска исключит подобные ситуации.
ЗЫ это просто примеры, реализовать подобные штуки можно несколькими способами. Какие то изящнее какие то функциональнее. Важно то что включая подобное в свои скрипты человек уменьшает вероятность вылетания клиента.