Что нового

Darkfall online функция автолута (поиск предметов по пикселям и курсору)

RomaChe

Новичок
Сообщения
18
Репутация
1
Игра Darkfall online. В игре нет кнопки взять все (это из за особенностей игры, пвп ориентированная, фулл лут). Пишу автолут, определяю цвет точки и стараюсь понять что это бекграунд или предмет который можно слутить. Ставлю курсор в левом верхнем углу окна лута и запускаю процедуру
Код:
$pos = MouseGetPos()
$Xpos = $pos[0] 
$Ypos = $pos[1]
For $j = $Ypos To $Ypos + 170 Step 2
 For $i = $Xpos To $Xpos + 230 Step 2
  $Color = PixelGetColor($i, $j)
  $hColor = Hex($Color,6)
  $r = StringMid($hColor, 1, 2)
  $g = StringMid($hColor, 3, 2)
  $b = StringMid($hColor, 5, 2)
  $decR = Dec($r)  
  $decG = Dec($g)  
  $decB = Dec($b) 
   If $decR - $decG > 19 or  $decR - $decB > 19 or $decG - $decR > 19 or         $decG - $decB > 19 or $decB - $decR > 19 or  $decB - $decG > 19 Then
   MouseClickDrag("left", $i, $j, 950 , 700)
   EndIf
 Next
Next

Отделяю наиболее красные, синие и зеленые пиксели от остальных, но предметы не всегда такие яркие, а бекграунд бывает более яркий, через бекграунд просвечивают доспехи которые бывают цветные, трава и т.п.
-----------------------------------------------------
Прошу подкинуть идею как еще можно отделять пиксели бекграунда от пикселей предметов
 

Belfigor

Модератор
Локальный модератор
Сообщения
3 590
Репутация
938
Re: Поиск предметов в окне лута

Предупреждение За нарушение правил форума (пункт В.11):
Любые отрывки AutoIt кода необходимо заключать в тег [autoit]
(подробнее), а обычный код соответственно в тег [code]
(подробнее). Также большие выдержки текста помещайте под тег [spoiler]
(подробнее), там где это поддерживается естественно. Как в случае с названием темы, также короткое и эргономичное сообщение привлекает больше внимания, и шансы на получение конкретного ответа увеличиваются.


С уважением, Модератор раздела.
 

rusreg79

Продвинутый
Сообщения
159
Репутация
57
Re: Поиск предметов в окне лута

А при наведении мышки на предмет, иконка курсора меняется?

Ответ нашел на ютубе... курсор меняется на предмете. Значить можно различать предмет по изменению Id курсора

Код:
#include <WinAPI.au3>

$Cursor = _WinAPI_GetCursorInfo()
 
Автор
R

RomaChe

Новичок
Сообщения
18
Репутация
1
Да курсор меняется, но если делать только по курсору то будет слишком медленно, к тому же он меняется немного с запаздыванием, то есть если водить мышкой то он поменяется на руку и нужно немного вернутся назад
Сейчас делаю что бы первичный поиск был по пикселям, а затем уже проверка на курсор. Но все таки находит много лишнего
 

rusreg79

Продвинутый
Сообщения
159
Репутация
57
На скринах каждый предмет пронумерован белыми цифрами... ищи тогда белый цвет цифр и бликов, самое яркое, с бекграундом точно не спутаешь.
 

rusreg79

Продвинутый
Сообщения
159
Репутация
57
и в место PixelGetColor используй поиск PixelSearch, гораздо быстрее будет.
 
Автор
R

RomaChe

Новичок
Сообщения
18
Репутация
1
rusreg79 сказал(а):
На скринах каждый предмет пронумерован белыми цифрами... ищи тогда белый цвет цифр и бликов, самое яркое, с бекграундом точно не спутаешь.
Это не пронумерованы, это количество предметов, оно указывается только для "стековых" предметов (голда, стрелы, расходные материалы), "нестековые" (оружие, инвентарь) без цифр.
Тем не менее идея хорошая, стековые предметы наиболее ценные и можно их забирать в первую очередь, спасибо!
 
Автор
R

RomaChe

Новичок
Сообщения
18
Репутация
1
Идея с цифрами отпадает, иногда цифры довольно далеко от самого предмета и наведение на цифру не меняет вид курсора и соответственно перетаскивание не работает.
Пока самый лучший вариант так и не изменился: первичный поиск по пикселям, вторичный по виду курсора.
Все еще ищу совета как отделять предметы от бекграунда. Кроме
Код:
If $decR - $decG > 19 or  $decR - $decB > 19 or $decG - $decR > 19 or         $decG - $decB > 19 or $decB - $decR > 19 or  $decB - $decG > 19 Then

ничего в голову не приходит, может кто видел похожие темы о работе с цветом?
----------------------------------------------
Перенесите тему в боты для игр, плз
 

IIIaMaH

Новичок
Сообщения
15
Репутация
0
Вот пример автолута для ДФ в автохоткее.
Принцип работы:
клик правой кнопки мыши с зажатым альтом - точка куда тащить предмет,
клик левой кнопки мыши с зажатым альтом по предмету - собственно перетаскивание.
IniFile := "I:\Skripts\loot.txt" путь к пустому тхт файлу в который будут писаться координаты куда тащить
###############
Собственно сори за пример, так как это не то что ты просил.
С автоитом только начал разбираться - как напишу выложу.
###############
В свое время был автолут который таскал самостоятельно из могилок но АВы сделали случайную привязку открывающегося окна могилки, поэтому попробуй привязать на хоткей указатель на угол окошка и вторым действием перетаскивание из заранее заданной области, еще 1 камешек АВы ввели проверку на скорость перетаскивания так что когда очень быстро лутишь возникает ситуация когда часть лута возвращается в исходное положение.

WinWait, Darkfall Online,
IfWinNotActive, Darkfall Online, , WinActivate, Darkfall Online,
WinWaitActive, Darkfall Online,
IniFile := "I:\Skripts\loot.txt" ;Внимание в корневом коталоге (у меня D:\loot.txt) создать файл loot.txt обязательно пропишите путь до loot.txt
FileGetSize, size, %IniFile%
if (size = "") {
MsgBox Setting up
IniWrite, 1300, %IniFile%, Loot, :rofl:est ; --- destination x pos
IniWrite, 700, %IniFile%, Loot, ydest ; --- destination y pos
} else {
IniRead, :rofl:est, %IniFile%, Loot, :rofl:est ; --- destination x pos
IniRead, ydest, %IniFile%, Loot, ydest ; --- destination y pos
}
CoordMode, Pixel



$!Lbutton:: ;quick loot -------------------------

MouseGetPos, x1, y1
MouseClickDrag, left, x1, y1, :rofl:est, ydest, 1 ;0 is mouse speed, 0 is instant
MouseMove, x1, y1, 1 ;0 is mouse speed, 0 is instant

return

$!Rbutton:: ;loot destination ------------------------->

MouseGetPos, :rofl:est, ydest
IniWrite, %:rofl:est%, %IniFile%, Loot, :rofl:est
IniWrite, %ydest%, %IniFile%, Loot, ydest

return
 
Верх