В этом топике только полезные скрипты, все обсуждения тут:
viewtopic.php?t=9869 !!!
Собственно заели меня вопросы насчёт Function not found - решил собрать все пользовательские функции вместе.
Т.к. искать я не любитель - выкладывать буду свои (вернее еще поищу у Edred'а), не сочтите за лицемерие - шлите свои в ПМ, если они как минимум не хуже - выложу рядом.
Если кого забыл - тоже в ПМ, топик закрытый - обсуждению не подлежит, т.к. кому оно надо - знает (поймёт) как эти функции использовать, а кто не поймёт - тому и не надо.
CheckLag()
Code:
Sub checklag()
deljournal("ackpack")
uo.click("backpack")
repeat
wait(50)
until uo.injournal("ackpack")
endsub
Задача этой функции - пауза. Пауза будет длиться, пока сервер не ответит на последний заданный ему вопрос.
Основные преимущества этой функции над некоторыми аналогами:
1. Функция не удаляет весь журнал Injection.
2. Функция учитывает, что backpack может писаться как с маленькой буквы, так и с большой. С большой встречал, если не ошибаюсь - на Антаресе.
3. Функция не делает лишнего удаления журнала Injection (а следовательно лишней паузы) после ответа от сервера - встречаются и такие индивидумы.
DelJournal()Code:
Sub deljournal(msg)
while uo.injournal(msg)
uo.setjournalline(uo.injournal(msg)-1,"")
wend
endsub
Задача этой функции - удалить все строки из журнала Injection, где встречается заданный отрывок текста. Преимуществ над аналогами не имеет.
Аналог функции deljournal:
DeleteJournalCode:
Sub DeleteJournal(msg)
var nom = UO.InJournal(msg)
If nom>0 Then
UO.SetJournalLine(Nom - 1," -- replaced -- ")
DeleteJournal(msg)
EndIf
endsub
Незнаю, хорошо ли в данном случае использовать рекурсию, судить не мне.
GetWordCode:
Sub GetWord( st, nom )
; (c) Edred
; Возвращает слово из строки str за номером num
; если такого слова нет - возвращаем ''
;
; Разделителем слов считаем пробел. Несколько пробелов подряд считаются за один.
; Функция сделана без рекурсии специально для считывания слов из сверхдлинных строк!
;
VAR tmpst, i, dlin, kol = 0, start = 0
dlin = len( st )
For i=0 To dlin - 1
If mid( st, i, 1 ) == ' ' OR i == dlin - 1 Then
kol = kol + 1
If kol == nom Then
; это первый пробел после нужного нам слова
tmpst = mid( st, start, i - start )
return tmpst
Else
While mid( st, i, 1 ) == ' '
i = i + 1
Wend
If kol == nom - 1 Then
start = i
Endif
Endif
Endif
Next
tmpst = ''
return tmpst
endsub
GetDistanceCode:
; Функция GetDistance возвращает расстояние до координат
; (как UO.GetDistance - до объекта)
;
; Почему так - потому что учим математику :)
;
Sub GetDistance( X, Y )
VAR A, B, C
A = abs( X - UO.GetX() )
B = abs( Y - UO.GetY() )
If A > B Then
C = A
Else
C = B
EndIf
Return C
endsub
AbsCode:
Sub abs(num)
if num < 0 then
return -num
endif
return num
endsub
Сокращения от англиского Absolute - функция возвращает положительное значение переданного числа.
GetResourceCode:
Sub GetResource( typ, kolvo, cont )
; Берем из указанного контейнера указанное количество ресурса по типу
; Возвращаем 0 если ресурс не найден и 1 если все ок.
UO.FindType( typ, '-1', cont ) ; Ищем ресурс в контейнере
If UO.FindCount() == 0 Then
UO.Print("Resource not found, script terminated")
return 0
Endif
UO.Grab( Str( Kolvo ), 'finditem' ) ; Кладем ресурсы в пак
Wait(500)
CheckLag()
return 1
endsub
FindSymb()Code:
Sub FindSymb( symb, st )
; найти первое вхождение символа в строке. Не найдено - вернем 0
VAR dlin = len( st ) - 1
VAR i
For i = 0 To dlin
If st[i] == symb Then
return i + 1
endif
Next
i = 0
return i
endsub
GetQuoteCode:
Sub GetQuote( st, num )
; Вырезает и возвращает num-подстроку строки st, ограниченную с обоих
; сторон кавычками без самих кавычек. Возвращаем пустую строку если ошибка
VAR s = 0, i = 0, rt = ''
VAR quot = '"'
s = FindSymb( quot, st )
If s > 0 Then
i = i + 1
st = right( st, len(st) - s )
s = FindSymb( quot, st )
If s == 0 Then
return ''
Endif
If i == num Then
; нашли начало нужной строки
st = left( st, s - 1 )
return st
Else
st = right( st, len(st) - s )
rt = GetQuote( st, num - 1 )
If rt == '' Then
return ''
Else
return rt
Endif
Endif
Endif
return ''
endsub
WriteSpace()Code:
Sub WriteSpace( nom )
VAR str1, i
str1 = ''
If nom < 1 Then
return str1
endif
for i = 1 to nom
str1 = str1 + ' '
next
return str1
endsub
Функция вернёт пробелы, их количество будет равно переданному числу.
GetDirCode:
; Функция GetDir возвращает направление, по которому надо идти
; к координате
;
Sub GetDir( myx, myy, ox, oy )
VAR I, J
J = 0
VAR X = ox - myx
VAR Y = oy - myy
I = GetQDir( Abs(X), Abs(Y) )
If X >= 0 Then
If Y >= 0 Then
If I == 1 Then
J = -2
Else
If I == 2 Then
J = -1
Else
If I == 3 Then
J = 4
EndIf
EndIf
EndIf
Else
If I == 1 Then
J = 2
Else
If I == 2 Then
J = 3
Else
If I == 3 Then
J = 4
EndIf
EndIf
EndIf
EndIf
Else
If Y >= 0 Then
If I == 1 Then
J = -2
Else
If I == 2 Then
J = -3
Else
If I == 3 Then
J = -4
EndIf
EndIf
EndIf
Else
If I == 1 Then
J = 2
Else
If I == 2 Then
J = 1
Else
If I == 3 Then
J = -4
EndIf
EndIf
EndIf
EndIf
EndIf
RETURN J
endsub
;
; =============== GETQDIR ===
;
;
Sub GetQDir( x, y )
VAR Ep = Val( UO.GetGlobal( 'KoefEp' ) )
VAR J = 0
If X == 0 Then
J = 1
Else
If ( Y / X ) < Ep Then
J = 3
Else
If ( X / Y ) < Ep Then
J = 1
Else
J = 2
EndIf
EndIf
EndIf
RETURN J
endsub
Где-то был аналог от меня, покороче - но он потерялся.
PERPCode:
; Функция Perp возвращает направление, перпендикулярное введённому
;
Sub Perp( Dir )
VAR D = Dir
If Dir == 1 Then
D = 3
EndIf
If Dir == 2 Then
D = 4
EndIf
If Dir == 3 Then
D = -1
EndIf
If Dir == 4 Then
D = -2
EndIf
If Dir == -1 Then
D = -3
EndIf
If Dir == -2 Then
D = -4
EndIf
If Dir == -3 Then
D = 1
EndIf
If Dir == -4 Then
D = 2
EndIf
RETURN D
endsub
SetArray, RegArray, IncArray, GetArray, ArrCleanValue, DelArr, ArrLenCode:
Sub ArrCleanValue(val,cl)
; Чистка значения из псевдо-массива
; str 1. "Массив" для чистки
; str 2. Символ(ы) для стирания
var i=0
while MID(val, i, strlen(cl)) == cl
i = i + strlen(cl)
wend
return MID(val, i, strlen(val)-i)
endsub
Sub RegArray(num,len)
; Создание псевдо-массива
; val 1. Количество элементов
; val 2. Длинна элемента (пустота заполняется нуликами, можно еще чем-нить заполнять, мне нулики было удобно).
var arr=""
var add=""
while strlen(add) < len
add = add + "0"
wend
while strlen(arr) < num*len
arr = arr + add
wend
return arr
endsub
Sub DelArr(arr,len,num)
; удаление значения из псевдо-массива (получается смещение)
; str 1. "Массив"
; int 2. Длинна элемента
; int 3. Номер элемента
var tmp1 = MID(arr,0,len*num)
var tmp2 = MID(arr,len*num+len,strlen(arr)-len*num-len)
return tmp1+tmp2
endsub
Sub ArrLen(arr,len)
; Возвращает количество элементов псевдо-массива
; str 1. "Массив"
; int 2. Длинна значения
return strlen(arr)/len
endsub
Sub SetArray(val,string,num,len)
; Запись в псевдо-массив
; str 1. Записываемое значение
; str 2. "Массив"
; val 3. Номер элемента
; val 4. Длинна элемента "массива"
if len < strlen(val) then
uo.print("Value to long!")
return false
endif
while strlen(val) < len
val = "0"+val
wend
return MID(string,0,num*len) + val + MID(string,num*len+len,strlen(string)-num*len-len)
endsub
Sub GetArray(str,num,len)
; Получения значения массива
; str 1. "Массив"
; val 2. Номер элемента
; val 3. Длинна элемента "массива"
; var ret = ArrCleanValue(MID(str,num*len,len),"0")
if NOT strlen(ret) Then
return "0"
endif
return ret
endsub
Sub IncArray(str,num,len)
; Создаст в конце num элементов
; str 1. "Массив"
; val 2. Количество добавляемых элементов
; val 3. Длинна элемента "массива".
; var i,j
for i=1 to num
for j=1 to len
str = str+"0"
next
next
return str
endsub
Набор скриптов для работы с псевдомассивами. Суть в том, что обычно надо создать глобальный массив и хранить там Type'ы или ID'ы, а они как известно имеют фиксированную длинну, собственно функции помогут для обращения с такими массивами.
Может быть полезным, только если понять, зачем я это писал.
FindItem, FindType, FindCount
Улучшенная система поиска вещей.
Смотрим тут:
viewtopic.php?p=40604#40604
Math functions
Организация простых математических функций вроде модуля или квадратного корня:
Смотрим тут:
viewtopic.php?t=7388&highlight=
Des.Mfgi.*
Усовершенствованная работа с коммандой mfgi.
Смотрим тут:
viewtopic.php?p=45275
Идея Destruction'а (function not found), расширение I'm'A (полезности)