Что нового

Проверка на включение модулей, требуется помощь

hikki

Продвинутый
Сообщения
233
Репутация
99
Извиняюсь за косноязычие, попробую описать проблему.
Проблема с проверкой на состояние оружия например, стреляет оно или нет. Если есть цель в локе, то проверка простая, смотрим соседние пиксели с оружием и достаточно точно узнаем состояние. А вот в случае если нет цели в локе и нажать, например, на F1 то модуль начнет просто моргать, изменений соседних пикселов не будет.
Хелп!!! как отловить это моргание, очень мешает жить.
 

Belfigor

Модератор
Локальный модератор
Сообщения
3 551
Репутация
930
Re: Проверка на включение модулей, требуется помощь.

Если ты про то состояние модулей когда они просто мигают не подсвечиваясь, то пиксельгет калор в переменную в центр модуля, потом либо псерч либо пгк снова туда же и сравнить данные, если данные = то значит модуль не активен, если не равны то значит модуль мигает. (Для точности проверки повторить раз 5-6 с интервалом в 500-100 мс)
 
Автор
H

hikki

Продвинутый
Сообщения
233
Репутация
99
Re: Проверка на включение модулей, требуется помощь.

Спасибо за идею, несколько пиксельгетколор с промежутком в 200мс работают. Пока ни одного случайно убитого врека.
 

Belfigor

Модератор
Локальный модератор
Сообщения
3 551
Репутация
930
Re: Проверка на включение модулей, требуется помощь.

Не за что, подулись кодом, мне как раз в ближайшие дни придется писать эту штуку, да и другим полезной оказаться может
 
Автор
H

hikki

Продвинутый
Сообщения
233
Репутация
99
Re: Проверка на включение модулей, требуется помощь.

$F_key_x,$F_key_ch_y это координаты середины модуля F1

Код:
Func weap_ch_disable()
	$at1_1=PixelGetColor($F_key_x,$F_key_ch_y)
	$at2_1=PixelGetColor($F_key_x+51,$F_key_ch_y)
	$at3_1=PixelGetColor($F_key_x+2*51,$F_key_ch_y)
	$at4_1=PixelGetColor($F_key_x+3*51,$F_key_ch_y)
Sleep(200)
	$at1_2=PixelGetColor($F_key_x,$F_key_ch_y)
	$at2_2=PixelGetColor($F_key_x+51,$F_key_ch_y)
	$at3_2=PixelGetColor($F_key_x+2*51,$F_key_ch_y)
	$at4_2=PixelGetColor($F_key_x+3*51,$F_key_ch_y)
Sleep(200)
	$at1_3=PixelGetColor($F_key_x,$F_key_ch_y)
	$at2_3=PixelGetColor($F_key_x+51,$F_key_ch_y)
	$at3_3=PixelGetColor($F_key_x+2*51,$F_key_ch_y)
	$at4_3=PixelGetColor($F_key_x+3*51,$F_key_ch_y)
Sleep(200)
	$at1_4=PixelGetColor($F_key_x,$F_key_ch_y)
	$at2_4=PixelGetColor($F_key_x+51,$F_key_ch_y)
	$at3_4=PixelGetColor($F_key_x+2*51,$F_key_ch_y)
	$at4_4=PixelGetColor($F_key_x+3*51,$F_key_ch_y)
Sleep(200)
	$at1_5=PixelGetColor($F_key_x,$F_key_ch_y)
	$at2_5=PixelGetColor($F_key_x+51,$F_key_ch_y)
	$at3_5=PixelGetColor($F_key_x+2*51,$F_key_ch_y)
	$at4_5=PixelGetColor($F_key_x+3*51,$F_key_ch_y)

If $at1_1<>$at1_2 Or $at1_1<>$at1_3 Or $at1_1<>$at1_4 Or $at1_1<> $at1_5 Then Send("{F1}")
If $at2_1<>$at2_2 Or $at2_1<>$at2_3 Or $at2_1<>$at2_4 Or $at2_1<> $at2_5 Then Send("{F2}")
If $at3_1<>$at3_2 Or $at3_1<>$at3_3 Or $at3_1<>$at3_4 Or $at3_1<> $at3_5 Then Send("{F3}")
If $at4_1<>$at4_2 Or $at4_1<>$at4_3 Or $at4_1<>$at4_4 Or $at4_1<> $at4_5 Then Send("{F4}")
EndFunc


у меня оружие с F1 по F4, если кому надо другие кнопки тот по этому примеру сделает
 

Lexx98

Продвинутый
Сообщения
272
Репутация
73
Re: Проверка на включение модулей, требуется помощь.

Имхо, достаточно 3-х замеров. 5 - это уже перебор.
 
Автор
H

hikki

Продвинутый
Сообщения
233
Репутация
99
Re: Проверка на включение модулей, требуется помощь.

не былоб в игре лагов - яб двумя ограничилсябы)))) :blum: но мы живем в реальном мире, поэтому вот таквоткакто.
 
H

hunter80

Гость
Re: Проверка на включение модулей, требуется помощь.

А как насчет глюка в момент перезарядки? перезарядка точно также отображается...
 

Belfigor

Модератор
Локальный модератор
Сообщения
3 551
Репутация
930
Re: Проверка на включение модулей, требуется помощь.

Когда идет последний выстрел мы видим что ползет полоска вокруг модуля. Когда началась перезарядка мы видим что полоска исчезла ==>> Модуль выключился. В чём проблема? о_О
 

Lexx98

Продвинутый
Сообщения
272
Репутация
73
Re: Проверка на включение модулей, требуется помощь.

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

Про последний выстрел вообще во всей теме не было ни слова.
 

Belfigor

Модератор
Локальный модератор
Сообщения
3 551
Репутация
930
Re: Проверка на включение модулей, требуется помощь.

Ниразу такого не было о_О. Может потому что у нас миллион проверок на каждое действие? Там ведь перед тем как клацать можно четко проверить что станет с целью в ближайшие несколько секунд после нажатия.
 
Автор
H

hikki

Продвинутый
Сообщения
233
Репутация
99
Re: Проверка на включение модулей, требуется помощь.

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

Lexx98

Продвинутый
Сообщения
272
Репутация
73
Re: Проверка на включение модулей, требуется помощь.

Код:
;;;;;;;;;;;;;
; Функция проверки активности лазеров при отсутствии цели, идея hikki,
; реализация Lexx98
; Параметры: $lasercnt - количество слотов с оружием (всё воооружение
; считается установленным на кнопки F1 и далее сколько нужно).
; $laserpos - позиция первого лазера, по умолчанию 1 = F1
;;;;;;;;;;;;;
; Внутри функции $checkcnt - количество сверок. Каждая после паузы 0,2 сек.
;;;;;;;;;;;;;
; hikki: $F_key_x, $F_key_ch_y это координаты середины модуля F1.
; Дополнение Lexx98: имхо не стоит брать именно середину, лучше взять ниже, 
; там где фон всегда чёрный от widescreen-а, но чтобы точка на 3 пиксела
; правее всё ещё была в иконке.
;;;;;;;;;;;;;
Func L_weap_ch_disable($lasercnt, $laserpos=1)
Local $laserarr[$lasercnt], $laserarr1[$lasercnt], $nowlasercolor, $nowlasercolor1, $i, $j, $checkcnt=4

for $i=0 to $lasercnt-1
 $laserarr[$i]=PixelGetColor($F_key_x+$i*51,$F_key_ch_y)
 $laserarr1[$i]=PixelGetColor($F_key_x+3+$i*51,$F_key_ch_y)
Next

for $j=1 to $checkcnt
 Sleep(200) 
 for $i=0 to $lasercnt-1
  $nowlasercolor=PixelGetColor($F_key_x+$i*51,$F_key_ch_y)
  $nowlasercolor1=PixelGetColor($F_key_x+3+$i*51,$F_key_ch_y)
  if $laserarr[$i]<>$nowlasercolor and $laserarr1[$i]<>$nowlasercolor1 then
   Send("{F"&$i&"}")
  endif
  $laserarr[$i]=$nowlasercolor
  $laserarr1[$i]=$nowlasercolor1
 Next
Next
EndFunc


Помимо уменьшения количества строк кода, введена двойная проверка - проверяется не одна точка, а две - вторая на 3 пиксела правее. В принципе её можно брать не только чуть правее, но и чуть ниже.
Либо для возврата к первоначальной идее hikki достаточно убрать все упоминания о переменных $laserarr1 и $nowlasercolor1

Внимание. Поскольку у меня в боте нет подобных проверок, писалось просто на интуиции и не проверялось на работоспособность. Ошибок в логике по идее быть не должно. Но возможны незамеченные ошибки в коде, при выявлении таковых просьба проинформировать, чтобы я мог исправить.
 
Автор
H

hikki

Продвинутый
Сообщения
233
Репутация
99
Re: Проверка на включение модулей, требуется помощь.

На вскидку нашел нестыковочку, кнопка может быть нажата несколько раз, изза вот этого кусочка
Код:
$laserarr[$i]=$nowlasercolor
$laserarr1[$i]=$nowlasercolor1


но в принципе интересно, отложу в сторонку и присмотрюсь
 

Lexx98

Продвинутый
Сообщения
272
Репутация
73
Re: Проверка на включение модулей, требуется помощь.

Нет там несостыковок :smile:
Если убрать упоминания о переменных $nowlasercolor1 и $laserarr2, то получится чисто твоя идея с проверкой одной точки. Это просто проверяет две точки. Вдруг там бракет залез, а оно подумает что включено и "выключит". А так, две точки, если обе поменялись - значит действительно непорядок. Конечно не 100% надёжность, но выше чем по одной точке.
Ну а без бракетов и вообще ничего не мешает, и по одной точке будет практически 100%.
 

dozzz33

ГаЛюЦиНоГеНнЫй ГрЫп
Сообщения
23
Репутация
2
Re: Проверка на включение модулей, требуется помощь.

эмм а зачем такая проверка?
проще проверить цель есть => стреляем => неактивировалось? повтор стрельбы
и как бы все равно моргает или нет :smile: стрелять будет 8)

первый бот написан на AC Tool поэтому скрипт оттуда :D за Autoit только сегодня взялся :whistle:
Код:
Procedure fire
    IsBlack 674, 128 \\если цель незалочена
      Delay 1000
      exit                \\выход
    Else
      Delay 500
      LoadRGB 782, 689 \\если залочена
      if {rgbgreen} = 0 \\если несветится зеленым... всмысле оружие несветится а не цель =)
        keys {f3}         \\огонь! =)
        keys {f4}
      end
    End
  END
 

Belfigor

Модератор
Локальный модератор
Сообщения
3 551
Репутация
930
Re: Проверка на включение модулей, требуется помощь.

Цель уже сдохла, а модуль все еще дорабатывает свой цикл, тут и приходит на помощь проверка говорящая работает модуль или нет. Да и вобще полезно везде где нужно дожидаться конца работы модуля.
 

Lexx98

Продвинутый
Сообщения
272
Репутация
73
Re: Проверка на включение модулей, требуется помощь.

Belfigor не угадал. На первой странице всё расписано, зачем.
У человека лаги. Вот цель умерла, лаг - скрипт этого не заметил и нажал на включение лазера. Но цели нет - лазер просто мигает. Далее скрипт видит врек и хочет его почистить, выделяет его в овервью - опа, наводка - залп, врека нет. Вот это состояние "предварительного включения" оружия при отсутствии целей и проверяется.
 

Belfigor

Модератор
Локальный модератор
Сообщения
3 551
Репутация
930
Re: Проверка на включение модулей, требуется помощь.

Ну тоже вариант, просто не в состоянии был вчитываться, а так, имхо нужно чтобы бот распознавал максимум информации с экрана, даже то что на первый взгляд может казаться не значительным, может спасти ему жизнь :smile:
 

Archy26

EVE DEVE eve bot development group
Сообщения
60
Репутация
42
Re: Проверка на включение модулей, требуется помощь.

Belfigor сказал(а):
Ну тоже вариант, просто не в состоянии был вчитываться, а так, имхо нужно чтобы бот распознавал максимум информации с экрана, даже то что на первый взгляд может казаться не значительным, может спасти ему жизнь :smile:
2All:
Белфигор прав.
Путём большого количества слитых кораблей, суммарных недель жопочасов тестов, и прочего, мы пришли к выводу, что бот должен видеть всю инфу с экрана.
т.е. Локал, HUD, селектел итем (и расстояние в нём), овервью, модули, состояние залоченых объектов, и т.д.
В неэкстремальных ситуациях это расширит возможности бота. В экстемальных ситуациях - может спасти жизнь (Корабль или яйцо).
Не ленитесь писать "думалки". Не ленитесь собрать в кучу показания всех датчиков, и рассматривать их комбинации. Не ленитесь посмотреть какая комбинация появляется в какой ситуации...
Последняя "думалка" для нашего с Белфигором мегабота обладала 2.9к строк в области "думалки", где в тексте кода присутствуют только If\then конструкции и значения переменных возвращаемых функциями-датчиками.
ДУМАЙТЕ!
Чем больше вы думаете НАД ботом, тем лучше он будет у вас работать.
 
Верх