Что нового

[Автоматизация] AION самый легкий бот

asperin

Новичок
Сообщения
5
Репутация
0
Тут возник вопрос, как правельно оформить функции, их цикличность и проверку условий с помощью пиксельколор.
Процесс...
выделение ближайшего юнита происходит нажатием клавиши TAB, при этом в середине верха экрана появляется отображение имени моба и его здоровья в виде "красной" полоски жизней. Атаке на моба можно переместить на панел быстрого доступа. При его смерти шкала убывает в ноль и становится "коричневой". Также как и атаку, есть возможность переноса функции сбора вещей, с моба, на панел быстрого доступа. После забора всего лута, труп исчезает.
Алгоритм примерно такой:
Проверка по пиксельгету цвета:
• при цвете пикселя не красного и не коричневого, нажимает ТАВ
• через 2 секунды возвращается к проверке ( в случае если никого не выделил)
• при красном цвете, жмет атаку ( send ("1") )
• через 2 секунды возвращается к проверке
• при коричневом цвете, жмет лут ( send ("2") )
• через 2 секунды возвращается к проверке
Промежуток между проверками около 2х секунд. И нужна цикличность.

ps: у меня получлось только сделать обычный цикл с посылом клавиш через интервал ) но как то это не очень, постоянно сбивается, а вот нормальный скрипт не получается, я с 'if' пробовал.
pss: координаты пикселя 760, 51 , цвет пока возможности нет написать поэтому если кто поможет... оформите как "красный" и "коричневый" =)
 

Belfigor

Модератор
Локальный модератор
Сообщения
3 589
Репутация
936
Код:
While 1
	Select
		Case GetKillStatus() = 0 
			SetKillStatus(NPCTest())
		Case GetKillStatus() = 11 
			SetKillStatus(TargetNPC())	
		Case GetKillStatus() = 21 
			SetKillStatus(GetNPCStatus()) 
		Case GetKillStatus() = 31 
			SetKillStatus(UseWeapon()) 
		Case GetKillStatus() = 32 
			SetKillStatus(Loot()) 
		Case GetKillStatus() = 41 
			SetKillStatus(WaitKillEnd()) 
		Case Else
			MsgBox(0,"",GetKillStatus()&"-е условие не описано в распределительном цикле")
			Exit
	EndSelect
WEnd
			
Func SetKillStatus($status)
  $MyBotStatus = $status
EndFunc

Func GetKillStatus()
  Return ($MyBotStatus)
EndFunc			
			
Func NPCTest()
	$col = PixelGetColor(x,y) 
	If $col <> "красный" Or $col <> "коричневый" Then
		Return 11
	EndIf
	Return 0
EndFunc

Func TargetNPC()
	Send("{TAB}")
	Return 21
EndFunc

Func GetNPCStatus()
	$col = PixelGetColor(x,y)
	If $col = "красный" Then Return 31
	If $col = "коричневый" Then Return 32
	Return "неписи нету"
EndFunc

Func UseWeapon()
	Send("1")
	Return 41
EndFunc

Func WaitKillEnd()
	Do
		Sleep(1000)
	Until PixelGetColor(x,y) = "красный"
	Return 21
EndFunc

Func Loot()
	Send("2")
	Return 0
EndFunc

Примерно так, писалось на колене и не тестировалось, поэтому на истину в последней инстанции не претендует
 
Автор
A

asperin

Новичок
Сообщения
5
Репутация
0
ERROR: $MyBotStatus: undeclared global variable.
Return ($MyBotStatus)
______________________________________________
ERROR: syntax error
$col = PixelGetColor(x,
______________________________________________


Я накасячил ? :(

Код:
Opt("WinWaitDelay",100)
Opt("WinTitleMatchMode",4)
Opt("WinDetectHiddenText",1)
Opt("MouseCoordMode",0)
WinWait("AION Client","")
If Not WinActive("AION Client","") Then WinActivate("AION Client","")
WinWaitActive("AION Client","")

;591.44
While 1
    Select
        Case GetKillStatus() = 0
            SetKillStatus(NPCTest())
        Case GetKillStatus() = 11
            SetKillStatus(TargetNPC())
        Case GetKillStatus() = 21
            SetKillStatus(GetNPCStatus())
        Case GetKillStatus() = 31
            SetKillStatus(UseWeapon())
        Case GetKillStatus() = 32
            SetKillStatus(Loot())
        Case GetKillStatus() = 41
            SetKillStatus(WaitKillEnd())
        Case Else
            MsgBox(0,"",GetKillStatus()&"-е условие не описано в распределительном цикле")
            Exit
    EndSelect
WEnd

Func SetKillStatus($status)
  $MyBotStatus = $status
EndFunc

Func GetKillStatus()
  Return ($MyBotStatus)
EndFunc

Func NPCTest()
    $col = PixelGetColor(591,44)
    If $col <> "0xC61D1D" Or $col <> "0x38372D" Then
        Return 11
    EndIf
    Return 0
EndFunc

Func TargetNPC()
    Send("{TAB}") 
    Return 21
EndFunc

Func GetNPCStatus()
    $col = PixelGetColor(591,44)
    If $col = "0xC61D1D" Then Return 31
    If $col = "0x38372D" Then Return 32
    Return "неписи нету"
EndFunc

Func UseWeapon()
    Send("1")
    Return 41
EndFunc

Func WaitKillEnd()
    Do
        Sleep(1000)
    Until PixelGetColor(591,44) = "0xC61D1D"
    Return 21
EndFunc

Func Loot()
    Send("2")
    Return 0
EndFunc
 

Belfigor

Модератор
Локальный модератор
Сообщения
3 589
Репутация
936
Это только шаблон, я его даж не запускал и не тестил, так набросал, переработай его под себя :smile:
Ну и добавь в начало скрипта Global $MyBotStatus = 0, $status
 

vovsla

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

Адлибом постоянно мониторим ХП персонажа и при необходимости пьём хилки

Do
берём в цель
Until есть цель

атакуем

проверка подвижности персонажа, т.к. он может где-то застрять
функция для выхода из застревания (для стандартных ситуаций)

если перс движется и его хп падает, скорее всего он зацепил агра, нужно остановится и его убить

если ХП моба начало падать, то

Do
атака
Until смерть моба

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

также нужно выделить время на убийство моба т.к. возможно ХП моба падает из за того, что его бьёт кто-то другой, а ваш перс застрял, и если моб убъёт второго игрока, то бот встанет насовсем или до восполнения ХП моба (зависит от проги)

а во время сбора дропа очень хорошо последить за ХП, может перса уже бьёт социальный моб...

а если никто не атакует, то нужно оценить стоит ли атаковать следующего моба с таким количеством ХП или маны, если нет, то сесть для более быстрого восстановления

а сидя смотреть не напал ли агрессивный моб

вот как-то так, а самое главное нужно сделать ведение лога, так гораздо проще понять в каком именно месте нужно что-то изменить и как, вот функция записи в лог, время пишет в столбик, так проще смотреть...
Код:
Func LogWrite($Text)
FileWrite("!AutoLog.txt", $Text)
$LongOfString=55
$LongOfString=$LongOfString-StringLen($Text)
Do
FileWrite("!AutoLog.txt", " ")
$LongOfString=$LongOfString-1
Until $LongOfString=0
FileWrite("!AutoLog.txt", @HOUR&":"&@MIN&":"&@SEC)
FileWrite("!AutoLog.txt", @CRLF)
EndFunc
 

Belfigor

Модератор
Локальный модератор
Сообщения
3 589
Репутация
936
Vovsla сказал(а):
лично моё мнение - когда нет опыта в написании подобного рода вещей для разминки лучше сделать автологин в игру, начни с простого...
а таким простым кодом ничего не выдет, т.к. нужно учитывать не только ХП моба и бить его или нет, нужно:
Именно, когда нет или же просто мало опыта в написании такого рода вещей лучше воздержаться от преподношения сомнительного рода советов, ибо написание автологина - это даже не практика. А то что ты там выше - назвал простым кодом - есть шаблон ии, самостоятельно принимающий решения исходя из сложившейся ситуации следующий заданному порядку действий, никто не спорит что он работает в данный момент только в одном направлении, но увы его автор в глаза не видел AION и просто привел пример исходя из того о чем просил тредстартер. Если есть код лучше - в студию, умным текстом на тему "как же на самом деле должен вести себя бот" и я завалить могу. Даешь конструктивную критику с выставлением на показ своих убер аналогов

P.S. Предложенное тобою - лишь навороченная вермишель и то описанная лишь словами + предложение потратить столь ценный пусть и аналог второго потока в пустую. Представь нашему взору настоящего бота ;)
 

Archy26

EVE DEVE eve bot development group
Сообщения
60
Репутация
42
Vovsla сказал(а):
а таким простым кодом ничего не выдет, т.к. нужно учитывать не только ХП моба и бить его или нет, нужно:
ЛОЛШТО?
Кхм... А не соизволит ли уважаемый, перечитать первый пост?
Ага? Простой бот. Человек подробно описал алгоритм. Человек попросил код ему написать, по этому алгоритму, чтобы он мог в структуре потом разобраться и свою вермишель навермишелить.
А теперь, внимание вопрос: а приведённый код вы внимательно прочли?
И ещё вопрос: А вы заметили, что код точно соответствует озвученому алгоритму?
P.S.: Белфигор +1. Господин Vovsla, в отдельную тему с алгоритмом, и туда же код бота. Это будет много конструктивнее.
 

vovsla

Осваивающий
Сообщения
553
Репутация
26
Под простым кодом я имел ввиду программу в целом. У меня появились сомнения, может ли бот как таковой быть простым(лёгким)... Хотя сложность бота зависит от сложностей и многообразия в игре, и учитывая то, что я тоже не видел AION, я поспешил с выводом.
Кстати, если используется Opt("MouseCoordMode",0), то логичнее было бы использовать и Opt("PixelCoordMode", 0)
 

kloklo

Новичок
Сообщения
2
Репутация
0
чето ето неправильно работает у меня несобирает( буду думать у автора нормльно работает?

Func LogWrite($Text)
FileWrite("!AutoLog.txt", $Text)
$LongOfString=55
$LongOfString=$LongOfString-StringLen($Text)
Do
FileWrite("!AutoLog.txt", " ")
$LongOfString=$LongOfString-1
Until $LongOfString=0
FileWrite("!AutoLog.txt", @HOUR&":"&@MIN&":"&@SEC)
FileWrite("!AutoLog.txt", @CRLF)
EndFunc

как это прикрутить? чтобы в лог писал и где указывать путь к логу?
 

vovsla

Осваивающий
Сообщения
553
Репутация
26
путь указывается в строке FileWrite("!AutoLog.txt", $Text), т.к. указан просто файл, лог будет рядом со скриптом

пример как это работает:
Код:
LogWrite("этот текст будет записываться в лог")

Func LogWrite($Text)
FileWrite("!AutoLog.txt", $Text)
$LongOfString=55
$LongOfString=$LongOfString-StringLen($Text)
Do
FileWrite("!AutoLog.txt", " ")
$LongOfString=$LongOfString-1
Until $LongOfString=0
FileWrite("!AutoLog.txt", @HOUR&":"&@MIN&":"&@SEC)
FileWrite("!AutoLog.txt", @CRLF)
EndFunc

функцию можно запихнуть в самый конец, чтобы она не мешалась
 

kloklo

Новичок
Сообщения
2
Репутация
0
спасибо за ответ
а можно как то на примере выше изложенного скрипта
буду оч благодарен)
просто я новичок в этом деле и чето никак не пойму как зделать так чтоб писалось что делает прога а проблема есть, збивается скрипт работает а ниче неделает гдето останавливается и зацикливается хотелось бы узнать где)
 
Автор
A

asperin

Новичок
Сообщения
5
Репутация
0
Работал =) но что то с глюками, все время об че нибудь да запинается :(
 

xamd

AION bot developer
Сообщения
66
Репутация
24
Чтобы использовать пиксельных ботов необязательно обходить фрост.
Фрост блокирует доступ к пакетам и памяти приложения(скрывая его из видимых процессов)


Добавлено:
Сообщение автоматически объединено:

Прикрепляю свой незаконченный вариант с таким ботом.
Он недописан, т.к. отказался от использования пикселей из-за ряда определенных причин(как пример: окно должно быть всё время развернуто, иначе pixelsearch не сработает)

Моё творение должно нормально работать при разрешении экрана 1280*1024 и размером интерфейса либо 1.0, либо 0.9, не помню.

Надеюсь, чем-то помог.
 
Верх