Сайт Антареса Сайт Антареса Форум Антарес
> >

Здравствуйте, гость ( Вход | Регистрация )


 
Ответить в эту темуОткрыть новую тему
> > Полезности + Function not found - решение здесь, © Destruction >
pikachu
сообщение 20.11.2006, 18:42
Сообщение #1


Ступивший на тропу
Group Icon

Группа: Пользователи
Сообщений: 770
Регистрация: 4.3.2006
Из: Москва, ЗАО
Пользователь №: 2 884
Спасибо сказали: 15 раз(а)
Класс: Человек



оригинальный текст всецелостно принадлежит господину Destruction.
ссылка на оригинал - yoko forum.

--


Собственно заели меня вопросы насчёт Function not found - решил собрать все пользовательские функции вместе.

Т.к. искать я не любитель - выкладывать буду свои (вернее еще поищу у Edred'а), не сочтите за лицемерие - шлите свои в ПМ, если они как минимум не хуже - выложу рядом.
Если кого забыл - тоже в ПМ, топик закрытый - обсуждению не подлежит, т.к. кому оно надо - знает (поймёт) как эти функции использовать, а кто не поймёт - тому и не надо.

CheckLag()
Код
Sub checklag()
deljournal("ackpack")
uo.click("backpack")
repeat
wait(50)
until uo.injournal("ackpack")
endsub

Задача этой функции - пауза. Пауза будет длиться, пока сервер не ответит на последний заданный ему вопрос.
Основные преимущества этой функции над некоторыми аналогами:
1. Функция не удаляет весь журнал Injection.
2. Функция учитывает, что backpack может писаться как с маленькой буквы, так и с большой. С большой встречал, если не ошибаюсь - на Антаресе.
3. Функция не делает лишнего удаления журнала Injection (а следовательно лишней паузы) после ответа от сервера - встречаются и такие индивидумы.

DelJournal()
Код
Sub deljournal(msg)
while uo.injournal(msg)
uo.setjournalline(uo.injournal(msg)-1,"")
wend
endsub

Задача этой функции - удалить все строки из журнала Injection, где встречается заданный отрывок текста. Преимуществ над аналогами не имеет.

Аналог функции deljournal: DeleteJournal
Код
Sub DeleteJournal(msg)
   var nom = UO.InJournal(msg)
   If nom>0 Then
      UO.SetJournalLine(Nom - 1," -- replaced -- ")  
      DeleteJournal(msg)
   EndIf
endsub

Незнаю, хорошо ли в данном случае использовать рекурсию, судить не мне.

GetWord
Код
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


GetDistance
Код
; Функция 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


Abs
Код
Sub abs(num)
if num < 0 then
return -num
endif
return num
endsub

Сокращения от англиского Absolute - функция возвращает положительное значение переданного числа.

GetResource
Код
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()
Код
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  


GetQuote
Код
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()
Код
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

Функция вернёт пробелы, их количество будет равно переданному числу.

GetDir
Код
; Функция 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

Где-то был аналог от меня, покороче - но он потерялся.

PERP
Код
; Функция 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, ArrLen
Код
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
Улучшенная система поиска вещей.
Смотрим тут: http://forum.yoko.com.ua/viewtopic.php?p=40604#40604

Math functions
Организация простых математических функций вроде модуля или квадратного корня:
Смотрим тут: http://forum.yoko.com.ua/viewtopic.php?t=7388&highlight=

Des.Mfgi.*
Усовершенствованная работа с коммандой mfgi.
Смотрим тут: http://forum.yoko.com.ua/viewtopic.php?p=45275

Сообщение отредактировал pikachu - 19.7.2007, 6:31
Пользователь в офлайнеКарточкаОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения
 

Ответить в эту темуОткрыть новую тему
> >
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 

- Текстовая версия Сейчас: 17.11.2018, 8:30
Design: Fisana  © 2005-2006 IBR Team