Yoko
http://forum.yoko.com.ua/

Function not found + полезности
http://forum.yoko.com.ua/viewtopic.php?f=20&t=7379
Page 2 of 2

Author:  Destruction [ 2007-09-10 00:53:01 ]
Post subject: 

Это снова я :) Теперь я со скриншотами, хотя с ними я уже вроде был.. В этот раз я реализовал раскладывание скриншотов по папочкам, для наибольшего удобства.

Code:
; Функция создаёт выбранную директорию, если такая ещё не существует
; Проверка на существовании осуществляется через пустой файл is_dir.
; (c) 2007, Destruction.
Sub mkdir( dir )
   if not right( dir, 1 ) == "/" && not right( dir, 1 ) == "\" then
      dir = dir + "/"
   endif
   var f = file( dir + "is_dir" )
   if not f.open() then
      uo.launch( "cmd", '/c mkdir "' + dir + '"' )
      wait( 500 )
      f.create()
   endif
   f.close()
endsub

Вроде неплохо извернулся учитывая неумение инжы работать с папками как таковыми.. Из минусов - я не помню как писать такое под вин98.

Далее - две функции для определения даты / времени, вариант от mihail мне не понравился как минимум замещением стандартной ф-ции date на его:
Code:
; Определение текущей даты
; n - разделитель
; Destruction
Sub getDate( n )
   var d = str( uo.date() )
   if strlen( d ) == 5 then
      d = "0" + d
   endif
   return right( d, 2 ) + n + mid( d, 2, 2 ) + n + left( d, 2 )
endsub

; Определение текущего моммента времени
; n - разделитель
; Destruction
Sub getTime( n )
   var t = str( uo.time() )
   if strlen( t ) == 5 then
      t = "0" + t
   endif
   return left( t, 2 ) + n + mid( t, 2, 2 ) + n + right( t, 2 )
endsub


Ну и непосредственно ф-ция создания скриншота, для которой все вышенаписанное писалось:
Code:
; Destruction
var sc_dir = "./sc/" ; Папка для складывания скриншотов.
Sub snap()
   var filetype = "BMP" ; в каком формате сохранять скриншоты
   var filename = sc_dir
   mkdir( filename )
   filename = filename + uo.getInfo( "shard" ) + "/"
   mkdir( filename )
   filename = filename + uo.getInfo( "character" ) + "/"
   mkdir( filename )
   filename = filename + getDate( "." ) + " " + getTime( "-" )
   uo.snap( filetype, filename + "." + filetype )
endsub


Примечание: при первом запуске на персонаже / шарде будет небольшая задержка перед созданием первого скриншота.

PS: Injection пока не умеет сохранять скриншоты в JPG, а у меня в БМП они весят по 5мб, поэтому всем у кого проблемы с местом могу посоветовать заглянуть в гугл: http://www.google.ru/search?hl=ru&q=com ... verter&lr= и использовать для последущей конвертации одну из найденных программ (я использую ImageMagick, т.к. привык, новичкам будет непросто освоить). Но это собственно говоря сами.

Author:  Mihail [ 2008-01-04 21:56:18 ]
Post subject: 

Иногда возникает проблема чистки реестра от значений EasyUO, но поскольку в инжекте такая возможность не предусмотрена приходится придумывать из раздела "сделай сам".. утилитка (зеркало) для удаления заданных ключей ИзиУО - кидаем в C:\WINDOWS\system32 и запускаем из инжекта:
Code:
uo.exec("launch rmEasyUO 100") ; где 100 имя ключа

Author:  Mihail [ 2008-01-07 04:13:54 ]
Post subject: 

иногда в инжекте не хватает возможности передвигать курсор мыши на заданные координаты, эта улилитка вам в этом поможет.
Скачиваем, кидаем в папку C:\WINDOWS\system32, далее в инжекте


Code:
uo.exec("launch SetCursorPos 555,444") ; где 555 - координата X, 444 - Y соответственно


ВНИМАНИЕ!!! для корректной работы необходимо указывать АБСОЛЮТНЫЕ координаты (на вкладке скриптового модуля в инжекте определяются относительные), абсолютные координаты можно узнать в UOPilot'е

----
update абсолютные координаты можно так же определять утилиткой в след. посте

Author:  Mihail [ 2008-01-07 15:54:45 ]
Post subject: 

утилита для определения абсолютных координат
как всегда кидаем в папку c:\windows\system32
Программа при запуске копирует текущие координаты мыши в буфер обмена и вырубается

Code:
uo.exec("launch GetCursorPos") ; пример использования функции получения абсолютных координат 

далее в скрипте Ctrl+V :)

----
Использование:

вставляем скрипт
Code:
sub uoCopyCursorPos()
; копируем координаты куосра в буфер обмена
uo.exec("launch GetCursorPos")
end sub

далее делаем хоткей
Code:
exec uoCopyCursorPos

наводим мышь куда нужно и запускаем с хоткея, затем в скрипте нажимаем "Paste" или Ctrl+V

Author:  Mihail [ 2008-01-07 16:50:06 ]
Post subject: 

утилита для копирования вашего текста в буфер обмена

Code:
uo.exec("launch ClipboardSetText йа_криведко") ; пример использования копирования текста в буфер обмена - внимание НЕЛЬЗЯ ИСПОЛЬЗОВАТЬ ПРОБЕЛЫ


использование в инжекте:
Code:
sub uoCopy(Text)
uo.exec("launch ClipboardSetText " + Text)
end sub


пример что с этим можно сделать:

аналог uo.info, только с мелкими доработками, в числе которых автоматическое копирование в буфер типа предмета
Code:
sub uoInfo()
  var o, layer
  uo.addobject('object for information')
  while uo.targeting()
    wait(100)
  wend
  o = uo.getserial('object for information')
  layer = uo.getlayer(o)
  if layer=='*' then
    layer='0'
  end if
  uo.click(o)
  checklag()
  uo.textclose()
  uo.exec("set toptext 1")
  uo.textopen()
  uo.exec("set toptext 0")
  uo.textprint('ID='+o+' Type='+uo.getgraphic(o)+' Name='+uo.getname(o))
  uo.textprint('Quantity: '+str(uo.getquantity(o))+' Color: '+uo.getcolor(o)+' Layer: '+layer)
  uo.textprint('X='+str(uo.getx(o))+' Y='+str(uo.gety(o))+' Z='+str(uo.getz(o))+' C='+uo.containerof(o))
  uo.textprint()
  uoCopy(uo.getgraphic(o))
end if
end sub

Author:  Mihail [ 2008-01-07 21:21:58 ]
Post subject: 

Написал улучшенный Drag
Как всегда кидаем в system32
И внимательно читаем как использовать.

uo.exec("launch uoDrag x,y,x1,y1,delay,steps")
x,y - координаты отправной точки (не забывает - абсолютные)
x1,y1 - координаты точки прибытия
так же опционально (не обязательно) можно задать:
delay* - задержка после перетаскивания курсора перед "отпусканием" кнопки мыши
steps - если нужно чтобы мышка перетаскивалась медленно, то задав этот параметр программа просчитает промежуточные точки остановки (вы задаете количество точек - чем больше, тем медленнее) - точки рассчитываются по кратчайшему расстоянию - тоесть по прямой.
* в случае, когда задан параметр steps, delay - это время ожидания после каждой точки - оптимально 10-500

Code:
uo.exec("launch uoDrag 280,740,880,350,100,10")

если надо быстро переместить, то
Code:
uo.exec("launch uoDrag 280,740,880,350,20")

Не рекоммендую совсем убирать задержку (хотя технически это можно) т.к. предмет\гамп и т.д. может просто не успеть "захватиться"
Так же не забываем, что никаких пробелов в передаваемых параматрах быть не должно.. (на случай если кто невзирая на мою определялку координат будет всеравно вставлять их из пилота - он ставит пробел после запятой :) )
И проверок от дурака тоже не много :) так что если кому вдруг придет в голову указать 2 соседних пикселя и поставить интервал в 100 шагов, то 98 шагов курсор будет стоять на месте.. и все в таком духе..

Author:  Mihail [ 2008-01-08 00:01:08 ]
Post subject: 

утилитка для открытия гиперссылок (в том числе и локальных)
Как всегда кидаем в C:\Windows\system32
Далее запускаем из инжекта, передавая в качестве параметров адрес ссылки. Работает аналогично проводнику.

Code:
uo.exec("launch OpenLink http://uo.com")

Code:
uo.exec("launch OpenLink C:\")

send mail (mailto:123@123.com) etc.

и помните - никаких пробелов в параметрах

Author:  Mihail [ 2008-01-09 01:02:48 ]
Post subject: 

утилитка для запуска приложений на заданном процессоре\ядре процессора (зеркало)
Если надо запустить определенное приложение на определенном ядре многоядерного процессора.
Кидаем в c:\windows\system32

синтаксис использования:
Code:
[путь к запускаемому приложению],[номер ядра]

Code:
uo.exec("launch DualCore_Launcher D:\GAMES\UO\client.exe,1")

Чтобы рулить двухъядерными процессорами: 1 - первое ядро, 2 - второе, 3 - оба
Так же не стоит забывать что не должно быть пробелов в пути к запускаемому файлу..

Author:  Destruction [ 2008-02-15 01:32:22 ]
Post subject: 

Сортировка массива по алфавиту.

Code:
Sub sort( arr, len )
   var i, j, r, temp
   for i = 1 to len -1
      j = i
      while j > 0
         r = getAlphaWord( arr[ j ], arr[ j - 1 ] )
         if r == 1 then
            temp = arr[ j ]
            arr[ j ] = arr[ j - 1 ]
            arr[ j - 1 ] = temp
            j = j - 1
         else
            j = 0
         endif
      wend
   next
EndSub

Sub getAlphaWord( word1, word2 )
   var i, r, len = strlen( word1 )
   if strlen( word1 ) > strlen( word2 ) then
      len = strlen( word2 )
   endif
   for i = 0 to len -1
      r = getAlphaSym( word1[ i ], word2[ i ] )
      if not r == 0 then
         return r
      endif
   next
   if strlen( word2 ) > strlen( word1 ) then
      return 1
   endif
   if strlen( word1 ) > strlen( word2 ) then
      return 2
   endif
   return 0
   
EndSub

Sub getAlphaSym( sym1, sym2 )
   var i, alpha = "0123456789"
   alpha = alpha + "ABCDEFGHIJKLMNOPQRSTUVWXYZ"
   alpha = alpha + "abcdefghijklmnopqrstuvwxyz"
   alpha = alpha + "АБВГДЕЁЖЗИЙКЛМНОПРСТУФХЦЧШЩЪЫЬЭЮЯ"
   alpha = alpha + "абвгдеёжзийклмнопрстуфхцчшщъыьэюя"
   if sym1 == sym2 then
      return 0
   endif
   for i = 0 to strlen( alpha ) -1
      if alpha[ i ] == sym1 then
         return 1
      endif
      if alpha[ i ] == sym2 then
         return 2
      endif
   next
   return 0
EndSub


Пример использования:
Code:
sub main()
   var i, len = 3
   DIM arr[val( str( len ) )]
   arr[0] = "Abc";
   arr[1] = "123"
   arr[2] = "1230"
   sort( arr, len )
   for i = 0 to len -1
      uo.print( arr[ i ] )
   next
end sub

Author:  Scripts Writer [ 2008-05-03 22:34:09 ]
Post subject: 

I'm wrote:
Code:
sub time(jor,n)
#Mihail
var i, t=''
var ser=str(jor)
for i=0 to len(ser)-2 step 2
t=t+mid(ser,i,2)+n
next
t=left(t,len(ser)+2)
return t
end sub

Code:
sub time(jor,n) 
#Mihail
var ser=str(jor),t=''
  if len(ser)==5 then
    ser='0'+ser
  else
    if len(ser)==4 then
      ser='00'+ser
    end if
  end if
  t=left(ser,2)+n+mid(ser,2,2)+n+right(ser,2)
  return t
end sub

Author:  Millerbeer [ 2008-09-27 23:55:41 ]
Post subject: 

I'm wrote:
Время и дата в нормальном формате (inside) by Mihail
Code:
sub main()
uo.print(date(uo.date(),'.'))
uo.print(time(uo.time(),':'))
end sub


где jor - это время\дата в формате числа, а n - нужный вам разделитесь.
Code:
sub date(jor,n)
#Mihail
var ser=str(jor), t=''
if len(ser)==5 then
ser='0'+ser
end if
t=right(ser,2)+n+mid(ser,2,2)+n+left(ser,2)
return t
end sub


Code:
sub time(jor,n)
#Mihail
var i, t=''
var ser=str(jor)
for i=0 to len(ser)-2 step 2
t=t+mid(ser,i,2)+n
next
t=left(t,len(ser)+2)
return t
end sub
в функцию time надо тоже воткнуть проверку на длину строки 5 и дописку нуля вначале, без неё часы с полуночи до10 утра не ходят :D

Code:
sub time(jor,n)
   var i, t=''
   var ser=str(jor)
   if len(ser)==4 then
      ser='00'+ser
   else if len(ser)==5 then
      ser='0'+ser
   endif
   for i=0 to len(ser)-2 step 2
      t=t+mid(ser,i,2)+n
   next
   t=left(t,len(ser)+2)
   return t
end sub


вот так нормально время показывает

Author:  Beyonder [ 2010-02-06 12:33:34 ]
Post subject:  Re: Function not found + полезности

Работа с наборами (Set).
Отличаются от массивов тем, что намного быстрее выполняет функции add и delete (практически моментально) и хранит только уникальные значения.

Code:
### SETS
Sub purgeSet(setName)
   var len = getSetLen(setName)
   var i
   
   if (len == 0) then
      return
   endif
   
   for i=0 to len-1
      setSetValue(setName,i,0)
   next
   setSetLen(setName,0)
endsub

Sub dumpSet(setName)
   UO.TextOpen()
    UO.TextPrint("Printing set <"+setName+"> contents:");
   
   var i
   var len = getSetLen(setName)
   var value
   for i=0 to len-1
      value = getSetValue(setName,i)
      value = "["+str(i)+"] = "+value
      UO.Print(value)
      UO.TextPrint(value)
   next
endsub

Sub addSetValue(setName, value)
   var pos = getSetIndexOf(setName, value)
   
   if (pos >= 0) then
      return pos
   endif
   
   var len = getSetLen(setName)   
   setSetValue(setName,len,value)
   setSetLen(setName,len+1)
   
   return len
endsub

Sub setSetValue(setName, index, value)
   UO.SetGlobal('set_'+setName+'_'+str(index), value)
endsub

Sub getSetValue(setName, index)
   return UO.GetGlobal('set_'+setName+'_'+str(index))
endsub

Sub getSetIndexOf(setName, value)
   var len = getSetLen(setName)
   var i = 0
   var curValue
   
   if (len == 0) then
      return -1
   endif
   
   for i = len-1 to 0 step -1
      curValue = getSetValue(setName,i)
      if (curValue == value OR curValue == str(value)) then
         return i
      endif
   next
   
   return -1
endsub

Sub getSetLen(setName)
   return val(UO.GetGlobal('set_'+setName+'_cnt'))
endsub

Sub setSetLen(setName, length)
   UO.SetGlobal('set_'+setName+'_cnt',length)
endsub

Sub delSetIndex(setName, index)
   var len = getSetLen(setName)
   setSetValue(setName, index, getSetValue(setName, len-1))
   setSetLen(setName,len-1)
endsub

Sub delSetValue(setName, value)
   delSetIndex(setName, getSetIndexOf(setName, value))
endsub


К примеру я применил его в скрипте на списки игноров:
У меня часто бывает что два скрипта должны игнорить разные вещи, при этом иногда их резетить. К примеру скрипт на подсчёт точного количества шмоток в указанном контейнере должен игнорировать найденные шмотки, а потом их все резетить. Но он может зарезетить переменные другого скрипта, что есть плохо. Поэтому можно использовать это:

Code:
### IGNORE LISTS
Sub addToIgnoreList(listName, object)
   var obj = UO.GetSerial(object)   
   if (obj == 0 OR obj == -1) then
      return
   endif
   addSetValue(listName,obj)
   UO.Ignore(obj,'on')
endsub

Sub delFromIgnoreList(listName, object)
   var obj = UO.GetSerial(object)   
   if (obj == 0 OR obj == -1) then
      return
   endif
   delSetValue(listName,obj)
   UO.Ignore(obj,'off')
endsub

Sub resetIgnoreList(listName)
   var i
   var len = getSetLen(listName)
   var obj
   
   if (len == 0) then
      return
   endif
   
   for i=0 to len-1
      obj = getSetValue(listName,i)
      UO.Ignore(obj,'off')
      setSetValue(listName,i,0)
   next
   setSetLen(listName,0)
endsub


Пример использования:

Code:
sub testIgnoreList()
   var i
   for i = 0 to 5
      UO.FindType(-1)
      addToIgnoreList('list1','finditem')
      UO.FindType(-1)
      addToIgnoreList('list2','finditem')
   next
   
   UO.FindType(-1)
   UO.Print('Found items after ignore: '+str(UO.FindCount()))
   
   resetIgnoreList('list1')
   UO.FindType(-1)
   UO.Print('Found items after reset1: '+str(UO.FindCount()))
   
   resetIgnoreList('list2')
   UO.FindType(-1)
   UO.Print('Found items after reset2: '+str(UO.FindCount()))
endsub

Author:  Beyonder [ 2010-07-10 09:59:01 ]
Post subject:  Re: Function not found + полезности

Улучшенный вариант explode-а, заполняет частями массив.

Code:
Sub explodeToArr( string, pattern, arr, arrlength )
   var i, counter = 0, entry = 0
   for i=0 to strlen( string ) -strlen( pattern )
      if mid( string, i, strlen( pattern ) ) == pattern then
         counter = counter + 1
         if counter <= arrlength then
            arr[counter-1] = mid( string, entry, i-entry )
         else
            return counter - 1
         endif
         entry = i + strlen( pattern )
      endif
   next
   if (counter == 0) then
      arr[counter] = mid( string, entry, strlen(string)-entry )
      return counter+1
   else
      return counter
   endif
endsub

Author:  Blood Slayer [ 2011-01-26 14:19:11 ]
Post subject:  Re:

Destruction wrote:
Ещё пачка свеженаписанных полезностей с использованием недавно найденной фичи (описал в разделе FAQ).

Полезности используют друг-друга, так, что с ошбками вроде "Function not found" - не приставать -)

Итак, функция первая -) Проверяет - есть ли в переданном массиве переменная. Если нет - возвращает -1, если есть - порядковый номер элемента массива.

Если вместо массива передать строку, а вместо строки - один символ, то функция вернёт первое вхождение символа в строке.

Регистронезависимый поиск работает значительно медленее, используйте только при острой необходимости!
Code:
; int inArray( string, array, bool, int )
; str - какую строку искать
; arr - массив, в котором искать
; nocase - true, чтобы не учитывался регистр при поиске.
; arr_len - длинна переданного массива
Sub inArray( str, arr, nocase, arr_len )
   var i
   if nocase then
      str = StrToLower( str )
   endif
   for i=0 to arr_len-1
      if nocase then
         if StrToLower( arr[i] ) == str then
            return i
         endif
      else
         if arr[i] == str then
            return i
         endif
      endif
   next
   return -1
endsub


Собственно ещё две функции - StrToUpper и StrToLower, соответсвенно переводят переданную строку в верхний или нижний регистр.
Работают медленно, поэтому в режиме реального времени - не получится. Может пригодится для разовых преобразований.

Функции UpperWords и LowerWords возвращают массивы с русскими и англискими буквами соответствующего регистра. Чтобы всё сработало корректно - в функцию необходимо передать массив размером не менее 59 элементов (смотри функции StrToLower и StrToUpper).
Code:
sub StrToLower( str )
   var num, i, j
   DIM lower[59]
   lower = LowerWords( lower )
   DIM upper[59]
   upper = UpperWords( upper )
   for i=0 to strlen( str )-1
      num = inArray( str[i], upper, 0, 59)
      if num > -1 then
         str = left( str, i ) + lower[ num ] + right( str, strlen( str ) -i -1 )
      endif
   next
   return str
endsub

sub StrToUpper( str )
   var num, i, j
   DIM lower[59]
   lower = LowerWords( lower )
   DIM upper[59]
   upper = UpperWords( upper )
   for i=0 to strlen( str )-1
      num = inArray( str[i], lower, 0, 59)
      if num > -1 then
         str = left( str, i ) + upper[ num ] + right( str, strlen( str ) -i -1 )
      endif
   next
   return str
endsub

Sub LowerWords(words)
   words[0] = "q"
   words[1] = "w"
   words[2] = "e"
   words[3] = "r"
   words[4] = "t"
   words[5] = "y"
   words[6] = "u"
   words[7] = "i"
   words[8] = "o"
   words[9] = "p"
   words[10] = "a"
   words[11] = "s"
   words[12] = "d"
   words[13] = "f"
   words[14] = "g"
   words[15] = "h"
   words[16] = "j"
   words[17] = "k"
   words[18] = "l"
   words[19] = "z"
   words[20] = "x"
   words[21] = "c"
   words[22] = "v"
   words[23] = "b"
   words[24] = "n"
   words[25] = "m"
   words[26] = "й"
   words[27] = "ц"
   words[28] = "у"
   words[29] = "к"
   words[30] = "е"
   words[31] = "н"
   words[32] = "г"
   words[33] = "ш"
   words[34] = "щ"
   words[35] = "з"
   words[36] = "х"
   words[37] = "ъ"
   words[38] = "ф"
   words[39] = "ы"
   words[40] = "в"
   words[41] = "а"
   words[42] = "п"
   words[43] = "р"
   words[44] = "о"
   words[45] = "л"
   words[46] = "д"
   words[47] = "ж"
   words[48] = "э"
   words[49] = "я"
   words[50] = "ч"
   words[51] = "с"
   words[52] = "м"
   words[53] = "и"
   words[54] = "т"
   words[55] = "ь"
   words[56] = "б"
   words[57] = "ю"
   words[58] = "ё"
   return words
endsub

Sub UpperWords(words)
   words[0] = "Q"
   words[1] = "W"
   words[2] = "E"
   words[3] = "R"
   words[4] = "T"
   words[5] = "Y"
   words[6] = "U"
   words[7] = "I"
   words[8] = "O"
   words[9] = "P"
   words[10] = "A"
   words[11] = "S"
   words[12] = "D"
   words[13] = "F"
   words[14] = "G"
   words[15] = "H"
   words[16] = "J"
   words[17] = "K"
   words[18] = "L"
   words[19] = "Z"
   words[20] = "X"
   words[21] = "C"
   words[22] = "V"
   words[23] = "B"
   words[24] = "N"
   words[25] = "M"
   words[26] = "Й"
   words[27] = "Ц"
   words[28] = "У"
   words[29] = "К"
   words[30] = "Е"
   words[31] = "Н"
   words[32] = "Г"
   words[33] = "Ш"
   words[34] = "Щ"
   words[35] = "З"
   words[36] = "Х"
   words[37] = "Ъ"
   words[38] = "Ф"
   words[39] = "Ы"
   words[40] = "В"
   words[41] = "А"
   words[42] = "П"
   words[43] = "Р"
   words[44] = "О"
   words[45] = "Л"
   words[46] = "Д"
   words[47] = "Ж"
   words[48] = "Э"
   words[49] = "Я"
   words[50] = "Ч"
   words[51] = "С"
   words[52] = "М"
   words[53] = "И"
   words[54] = "Т"
   words[55] = "Ь"
   words[56] = "Б"
   words[57] = "Ю"
   words[58] = "Ё"
   return words
endsub

Вот это вообще меня убило, решил переписать инжект. To Yoko Выдай исходники, будем внедрять все "важные" функции внутрь

Author:  Mirage [ 2011-01-26 16:06:29 ]
Post subject:  Re: Function not found + полезности

ИМХО если выкинуть исходники то погибнет то немногое что еще хоть как то шевелится. Шарды с онлайном >300 можно пересчитать по пальцам. В основной масса от 2 (админ-игрок) до 30. А если все про инжект будет доступно всем то будет читинг и коррупция... Хотя это мое мнение.

PS давно бы уже надо было выложить сурсы последнего инжекта - году в 2008 новый улучшенный инжект был бы готов.

Page 2 of 2 All times are UTC+02:00
Powered by phpBB® Forum Software © phpBB Limited
https://www.phpbb.com/