Page 2 of 2

Posted: 2007-09-10 00:53:01
by Destruction
Это снова я :) Теперь я со скриншотами, хотя с ними я уже вроде был.. В этот раз я реализовал раскладывание скриншотов по папочкам, для наибольшего удобства.

Code: Select all

; Функция создаёт выбранную директорию, если такая ещё не существует
; Проверка на существовании осуществляется через пустой файл 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: Select all

; Определение текущей даты
; 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: Select all

; 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, т.к. привык, новичкам будет непросто освоить). Но это собственно говоря сами.

Posted: 2008-01-04 21:56:18
by Mihail
Иногда возникает проблема чистки реестра от значений EasyUO, но поскольку в инжекте такая возможность не предусмотрена приходится придумывать из раздела "сделай сам".. утилитка (зеркало) для удаления заданных ключей ИзиУО - кидаем в C:\WINDOWS\system32 и запускаем из инжекта:

Code: Select all

uo.exec("launch rmEasyUO 100") ; где 100 имя ключа

Posted: 2008-01-07 04:13:54
by Mihail
иногда в инжекте не хватает возможности передвигать курсор мыши на заданные координаты, эта улилитка вам в этом поможет.
Скачиваем, кидаем в папку C:\WINDOWS\system32, далее в инжекте

Code: Select all

uo.exec("launch SetCursorPos 555,444") ; где 555 - координата X, 444 - Y соответственно
ВНИМАНИЕ!!! для корректной работы необходимо указывать АБСОЛЮТНЫЕ координаты (на вкладке скриптового модуля в инжекте определяются относительные), абсолютные координаты можно узнать в UOPilot'е

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

Posted: 2008-01-07 15:54:45
by Mihail
утилита для определения абсолютных координат
как всегда кидаем в папку c:\windows\system32
Программа при запуске копирует текущие координаты мыши в буфер обмена и вырубается

Code: Select all

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

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

вставляем скрипт

Code: Select all

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

Code: Select all

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

Posted: 2008-01-07 16:50:06
by Mihail
утилита для копирования вашего текста в буфер обмена

Code: Select all

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

Code: Select all

sub uoCopy(Text)
uo.exec("launch ClipboardSetText " + Text)
end sub
пример что с этим можно сделать:

аналог uo.info, только с мелкими доработками, в числе которых автоматическое копирование в буфер типа предмета

Code: Select all

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

Posted: 2008-01-07 21:21:58
by Mihail
Написал улучшенный Drag
Как всегда кидаем в system32
И внимательно читаем как использовать.

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

Code: Select all

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

Code: Select all

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

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

Code: Select all

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

Code: Select all

uo.exec("launch OpenLink C:\")
send mail (mailto:123@123.com) etc.

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

Posted: 2008-01-09 01:02:48
by Mihail
утилитка для запуска приложений на заданном процессоре\ядре процессора (зеркало)
Если надо запустить определенное приложение на определенном ядре многоядерного процессора.
Кидаем в c:\windows\system32

синтаксис использования:

Code: Select all

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

Code: Select all

uo.exec("launch DualCore_Launcher D:\GAMES\UO\client.exe,1")
Чтобы рулить двухъядерными процессорами: 1 - первое ядро, 2 - второе, 3 - оба
Так же не стоит забывать что не должно быть пробелов в пути к запускаемому файлу..

Posted: 2008-02-15 01:32:22
by Destruction
Сортировка массива по алфавиту.

Code: Select all

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: Select all

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

Posted: 2008-05-03 22:34:09
by Scripts Writer
I'm wrote:

Code: Select all

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: Select all

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

Posted: 2008-09-27 23:55:41
by Millerbeer
I'm wrote:Время и дата в нормальном формате (inside) by Mihail

Code: Select all

sub main()
uo.print(date(uo.date(),'.'))
uo.print(time(uo.time(),':'))
end sub
где jor - это время\дата в формате числа, а n - нужный вам разделитесь.

Code: Select all

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: Select all

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: Select all

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
вот так нормально время показывает

Re: Function not found + полезности

Posted: 2010-02-06 12:33:34
by Beyonder
Работа с наборами (Set).
Отличаются от массивов тем, что намного быстрее выполняет функции add и delete (практически моментально) и хранит только уникальные значения.

Code: Select all

### 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: Select all

### 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: Select all

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

Re: Function not found + полезности

Posted: 2010-07-10 09:59:01
by Beyonder
Улучшенный вариант explode-а, заполняет частями массив.

Code: Select all

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

Re:

Posted: 2011-01-26 14:19:11
by Blood Slayer
Destruction wrote:Ещё пачка свеженаписанных полезностей с использованием недавно найденной фичи (описал в разделе FAQ).

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

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

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

Регистронезависимый поиск работает значительно медленее, используйте только при острой необходимости!

Code: Select all

; 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: Select all

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 Выдай исходники, будем внедрять все "важные" функции внутрь

Re: Function not found + полезности

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

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