|
You last visited: Today at 00:09
Advertisement
Rus. server
Discussion on Rus. server within the Perfect World forum part of the MMORPGs category.
11/29/2009, 17:52
|
#706
|
elite*gold: 0
Join Date: May 2009
Posts: 66
Received Thanks: 6
|
наконецто сдвинулось дело...серьезно, вот чужой код могу подправить, а вот свой написать видно мозги пропил в молодости....спасибо Dwar (как ты там иероглифы смог прочитать чтобы зарегистрироваться?), щас буду ковыряться в исходниках, задавать вопросы, даже разрешаю мне рассказать о преимуществе троичной системы исчисления над двоичной в вычислительной технике, лишь бы отвечали на вопросы....
P.S а я тута сидел -  - у вьетнамских товарищей...
P.P.S. короче грустно.. посидел, поковырялся... это тоже самое что по подшипнику представить себе облик машины... куски кода.. откуда они , куда их лепить, что за переменные ? там люди (да как и здесь) не дураки, по куску кода нихрена не поймешь, ни куда его вставить , ни откуда он....
|
|
|
11/29/2009, 19:08
|
#707
|
elite*gold: 0
Join Date: Jun 2008
Posts: 142
Received Thanks: 13
|
прикольна, чуваки научились отсылать пакетики ручками
|
|
|
11/29/2009, 19:31
|
#708
|
elite*gold: 0
Join Date: Nov 2009
Posts: 69
Received Thanks: 5
|
Реализовал респ в ближайший город через щелк мышой. Работало стабильно .... пока несколько окон не запустил. И вот тут траблы. Хоть отсылаю мышу в нужное окно и отсчет координат мауса перевожу относительно окна, если открыто несколько окон, мыша жмет в первом попавшемся(. Подскажите плиз, есть ли возможность без мауса и инжекта(ну не силен я в нем)...(точней вообще никак в нем) активировать Ближайший город
Делаю так:
AutoItSetOption ( "MouseCoordMode", 0 )
WinActivate ( $APP_TITLE )
WinWaitActive($APP_TITLE)
Do
MouseClick("left", IniRead("MHS-Bot-PW-Custom.ini", "AutoResp", "PosDieMouseCoordX", "100"), IniRead("MHS-Bot-PW-Custom.ini", "AutoResp", "PosDieMouseCoordY", "5") )
sleep( IniRead("MHS-Bot-PW-Custom.ini", "AutoResp", "ZaderjkaAutoRespa", "10") * 1000 )
Until PersInfo("hp") > 0
AutoItSetOption ( "MouseCoordMode", 1 )
параметры в файле - запомненные коорды мауса на кнопке
Сам авторесп реализовал как движение по точкам. Может идея кому пригодится. В настройках бота сделал ввод координат по которым двигаться - подлетажем к точке - жмем кнопу - сохраняется в ини- файл и т.д. Сам респ - кнопа ближ город, пишем в таргет 0, летим по точкам, нр, пет.. . При таком способе валхак при ресе не требуется вообще
|
|
|
11/29/2009, 19:51
|
#709
|
elite*gold: 0
Join Date: Nov 2009
Posts: 96
Received Thanks: 31
|
; В начале программы:
Global $mTP ; Тип (9 - питомец, 7 - NPS, 6 - моб)
Global $_mTP[2] ;
Global $OFS_mTP[7] ;
$OFS_mTP[1] = 8 ;
$OFS_mTP[2] = 36 ;
$OFS_mTP[3] = 24 ;
$OFS_mTP[4] = $i * 4 ;
$OFS_mTP[5] = 4 ;
$OFS_mTP[6] = 180 ;
; В циклах "FOR $I = ...." программы:
$OFS_mTP[4] = $I
$_mTP = _MemoryPointerRead($BASE, $PROCESS, $OFS_mTP)
$mTP = $_mTP[1]
Кто помудрее подскажет, как сие покомфортабельнее изложить, например: $mTP = ...... $I*4 ..... 180
|
|
|
11/29/2009, 19:59
|
#710
|
elite*gold: 0
Join Date: Nov 2009
Posts: 96
Received Thanks: 31
|
По поводу Этого Вьетнамского исходника (чи Китайского) -
Граммотно конечно, но что-то они там дистанцию до моба вычисляют по векторам, ведь лежит значение дистанции в памяти ..
=> [BA] + 8 + 36 + 24 + (i * 4) + 4 + 608
Только ее потом скорректировать = Int($_mDIS[1] / 10.0)
|
|
|
11/29/2009, 20:27
|
#711
|
elite*gold: 0
Join Date: Nov 2009
Posts: 96
Received Thanks: 31
|
а китайцы придумали, выходит они круче наших -
$X = int(_MemoryREAD((_MemoryREAD(_MemoryREAD($BASE, $PROCESS) + 32, $PROCESS)) + 60, $PROCESS, "float") / 10 + 401)
это полюбому убыстряет вычисления, а значит и скорость, которой так не хватает с применением AtoIt
|
|
|
11/29/2009, 21:58
|
#712
|
elite*gold: 0
Join Date: Nov 2009
Posts: 96
Received Thanks: 31
|
По здравому размышлению получается "Революция" во всей кутерме с смещениями,
думаю что так будет грамотнее - не зря нам функцию _MemoryRead придумали ..
В начале проги Бота объявляем:
(это все будет читаться один единственный раз при запуске программы.)
Global $PROCESSID = WinGetProcess("Element Client")
Global $PROCESS = _MemoryOpen($PROCESSID)
Global $BASE = 9925052
Global $PERS = _MemoryREAD(_MemoryREAD($BASE, $PROCESS) + 32, $PROCESS) ; BASE + 32 - Начало области данных Перса
Global $HP ; Жизнь Перса
.....
Global $X ; Координата X
.....
и тогда - когда нам нужно будем читать:
$HP = _MemoryREAD($PERS + 1124, $PROCESS)
....
$X = int(_MemoryREAD($PERS + 60, $PROCESS, "float") / 10 + 401)
...
Может кто не согласен, но все что написал - проверил на 100% работает
Еще удобнее будет если в начале программы указать все смещения вида -
Global $_HP = $PERS + 1124
....
Global $_X = $PERS + 60
....
Тогда строка чтения какого-то параметра персонажа будет выглядеть -
$HP = _MemoryREAD($_HP, $PROCESS)
не надо делать спец функции типа GetHP() - это только увеличит время выполнения кода
..... Может я конечно и повторяю то что известно Вам, но думаю, что для многих - наш форум может показаться еще сложнее Китайского, если мы не будем граматно и по полочкам все расставлять.
|
|
|
11/29/2009, 22:24
|
#713
|
elite*gold: 0
Join Date: Aug 2009
Posts: 70
Received Thanks: 18
|
Ну вот, хоть кто то перешел на МемориРеад. Кстати, это не революция -  я давал кусок на точно таком же принципе. Экономия во времени хоть и не огромная, но при переборе тех же мобов заметная.
+1
Кстати, про полочки - неплохо кому нибудь завести собственную ветку и переносить в шапку все найденные решения. Я думал это сделать, но потом себя отговорил - сейчас мне нечего делать, вот и флужу, да ботом занимаюсь, а если будет некогда - я же это все заброшу... А как сейчас, то получается, что есть многие решения - но они разбросаны среди кучи спама и не у каждого есть время и желание все прочитать.
|
|
|
11/29/2009, 22:42
|
#714
|
elite*gold: 0
Join Date: Sep 2009
Posts: 9
Received Thanks: 1
|
dwar, а можно на рапиде без премиума?
То, что выложено  . Или кто-нибудь перезалейте.
|
|
|
11/29/2009, 22:51
|
#715
|
elite*gold: 0
Join Date: May 2009
Posts: 66
Received Thanks: 6
|
я категорически за ! отдельные работоспособные кусочки кода, написанные грамотными людьми с подробным объяснением ! и ведь из этого можно будет реально чтото собрать ! блочек с описанием таргет+перемещение к таргету когда хп таргета в ноль превратится, перемещение отдельно, флай отдельно, активация нпс с эмуляцией действий, клац и из этих кубиков сложил что угодно! плюс стандартизация переменных вобще внесут ясность в чтение любого кода. а еще выдернуть алгоритм поиска смещений из ntKid и реализовать его под поиск ВСЕХ переменных та то я пргнозирую что все ветки форума elitepvpers.com глохнут и все резко начинают учить русский язык
|
|
|
11/29/2009, 22:55
|
#716
|
elite*gold: 0
Join Date: Nov 2009
Posts: 96
Received Thanks: 31
|
Перебор данных Мобов в памяти - это одна из самых важных тем для приближения Бота к исскуственному Интилекту (для приближения ..) Об этом не раз писалось на форуме, признаться я сам немного и для себя почерпнул информации, нк на то он и Форум. .. Хотел-бы развернуть этот процесс и алгоритм в подробном коде на AtoIt, алгоритм все-равно остается алгоритмом и он будет работать на других языках программирования - все зависит от приемов его использования. Кто не согласен или может внести поправки - очень будет хорошо .. люди разберутся .. надо нам как-то Россию-Матушку от Kитaйцeв спасать ..))
Сейчас буду готовить статью с своими рабочими примерами (100% рабочие)
|
|
|
11/29/2009, 23:26
|
#717
|
elite*gold: 0
Join Date: May 2009
Posts: 66
Received Thanks: 6
|
та что тут говорить, у меня сон как рукой убрало, наконец то разумный человек говорит разумные вещи - главное чтоб задор не пропал. Все в ожидании !
|
|
|
11/29/2009, 23:36
|
#718
|
elite*gold: 0
Join Date: Nov 2009
Posts: 96
Received Thanks: 31
|
Реализованный мной алгоритм определения самого подходящего Монстра ..
.. Сначала Бот заводите на место боя куда вы считаете нужным .
Включаете Сканирование,
после вывода информации об окружающей обстановке
запускаете Локатор. (уже не один раз как Сканер, а в цикле работы Бота для каждой атаки ..)
Далее хотябы MHS-совская процедура Боя .. (для пробы)
; МОНСТР ---------------------------------------------------------------------------
; [BA] + 8 + 36 + 24 + (i * 4) + 4 + (i = от 0 до 796)
Global $i = 0 ; для циклов сканирования ..
Global $mTP ; Тип (9 - питомец, 7 - NPS, 6 - моб)
Global $_mTP[2] ;
Global $OFS_mTP[7] ;
$OFS_mTP[1] = 8 ;
$OFS_mTP[2] = 36 ;
$OFS_mTP[3] = 24 ;
$OFS_mTP[4] = $i * 4 ;
$OFS_mTP[5] = 4 ;
$OFS_mTP[6] = 180 ;
Global $mID ; - ID номер
Global $_mID[2] ;
Global $OFS_mID[7] ;
$OFS_mID[1] = 8 ;
$OFS_mID[2] = 36 ;
$OFS_mID[3] = 24 ;
$OFS_mID[4] = $i * 4 ;
$OFS_mID[5] = 4 ;
$OFS_mID[6] = 284 ;
Global $mLEV ; - Уровень
Global $_mLEV[2] ;
Global $OFS_mLEV[7] ;
$OFS_mLEV[1] = 8 ;
$OFS_mLEV[2] = 36 ;
$OFS_mLEV[3] = 24 ;
$OFS_mLEV[4] = $i * 4 ;
$OFS_mLEV[5] = 4 ;
$OFS_mLEV[6] = 292 ;
Global $mF ; Занятость - если > 0 - Занят, если = 0 - Свободен
Global $_mF[2] ;
Global $OFS_mF[7] ;
$OFS_mF[1] = 8 ;
$OFS_mF[2] = 36 ;
$OFS_mF[3] = 24 ;
$OFS_mF[4] = $i * 4 ;
$OFS_mF[5] = 4 ;
$OFS_mF[6] = 708 ;
Global $mDIS ; Дисстанция до моба
Global $_mDIS[2] ;
Global $OFS_mDIS[7] ;
$OFS_mDIS[1] = 8 ;
$OFS_mDIS[2] = 36 ;
$OFS_mDIS[3] = 24 ;
$OFS_mDIS[4] = $i * 4 ;
$OFS_mDIS[5] = 4 ;
$OFS_mDIS[6] = 608 ;
Global $mZ ; - Z
Global $_mZ[2] ; DWORD
Global $OFS_mZ[7] ; OFFSET
$OFS_mZ[1] = 8 ;
$OFS_mZ[2] = 36 ;
$OFS_mZ[3] = 24 ;
$OFS_mZ[4] = $i * 4 ;
$OFS_mZ[5] = 4 ;
$OFS_mZ[6] = 64 ;
;-----------------------------------------------------------------------------------
Func Scaner()
$tp6=0 ; Монстров
$tp7=0 ; NPS
$tp9=0 ; Питомцев
For $I = 768 To 0 Step -1 ; цикл от 768 до 0 по одному
$OFS_mID[4] = $I * 4 ; читаем ID
$_mID = _MemoryPointerRead($BASE, $PROCESS, $OFS_mID)
$mID = Hex($_mID[1])
If $mID Then ; если кто-то найден в локации
$OFS_mTP[4] = $I * 4 ; читаем Тип
$_mTP = _MemoryPointerRead($BASE, $PROCESS, $OFS_mTP)
$mTP = $_mTP[1]
If $mTP == 6 Then
$tp6 = $tp6+1
EndIf
If $mTP == 7 Then
$tp7 = $tp7+1
EndIf
If $mTP == 9 Then
$tp9 = $tp9+1
EndIf
EndIf
Next
GUICtrlSetData($LAB_LOC1, "Вокруг: Монстров - "& $tp6 &" NPS - "& $tp7 &" Питомцев - "& $tp9)
SoundPlay("radar.wav", 0)
$dismin = 20 ; Наименьшее расстояние до цели ; на ск. единиц координат самый дальний монстр
For $I = $Imax To $Imin Step -1 ; цикл от 768 до 0
$OFS_mID[4] = $I * 4 ; читаем ID
$_mID = _MemoryPointerRead($BASE, $PROCESS, $OFS_mID)
$mID = Hex($_mID[1])
If $mID Then ; если кто-то найден в локации
$OFS_mTP[4] = $I * 4 ; читаем Тип
$_mTP = _MemoryPointerRead($BASE, $PROCESS, $OFS_mTP)
$mTP = $_mTP[1]
If $mTP == 6 Then ; если это Монстр
$OFS_mLEV[4] = $I * 4 ; читаем Уровень
$_mLEV = _MemoryPointerRead($BASE, $PROCESS, $OFS_mLEV)
$mLEV = $_mLEV[1]
IF $mLEV < $LEV And ($LEV - $mLEV) <= 14 Then ; если Монстр ниже по уровню Перса или подходит по настройкам Бота
$OFS_mZ[4] = $I * 4 ; читаем Z - координата
$_mZ = _MemoryPointerRead($BASE, $PROCESS, $OFS_mZ, "float")
$mZ = Int($_mZ[1] / 10.0)
IF Abs($mZ - $Z) < 4 Then ; если Монстр не выше или не ниже Перса на 4 пункта по оси Z (отселектирование воздушных мобов)
$OFS_mDIS[4] = $I * 4 ; читаем Дистанция
$_mDIS = _MemoryPointerRead($BASE, $PROCESS, $OFS_mDIS, "float") ; / 10
$mDIS = Int($_mDIS[1] / 10.0)
If $mDIS < $dismin Then ; если раст. до моба < запомненного и он на земле (для варианта без ПОЛЕТА !!!)
$Imin = $I - 20 ; устанавливаем диапазон списка целей в локации +/- 20 монстров
$Imax = $I + 20 ; .. можно всместо 20 поставить $dismin а ее указать в настройках как регион действий
if $Imin < 0 Then
$Imin = 1
EndIf
if $Imax > 768 Then
$Imax = 768
EndIf
ExitLoop
EndIf
EndIf
EndIf
EndIf
EndIf
Next
GUICtrlSetData($LAB_LOC2, "Диапазон целей : "& $Imin &" - "& $Imax)
EndFunc ;-------------------------------------------------------------------------------------------
Func Locator()
; Выбор монстра в локации
Do
$dismin = 20 ; Наименьшее расстояние до цели ; на ск. единиц координат самый дальний монстр можно указать в панели настроек Бота
$FI = 0
For $I = $Imax To $Imin Step -1 ; уже мгновенный цикл в диапазоне от $Imin - $Imax из функции Scaner()
$OFS_mID[4] = $I * 4 ; читаем ID
$_mID = _MemoryPointerRead($BASE, $PROCESS, $OFS_mID)
$mID = Hex($_mID[1])
If $mID Then ; если кто-то найден в локации
$OFS_mTP[4] = $I * 4 ; читаем Тип
$_mTP = _MemoryPointerRead($BASE, $PROCESS, $OFS_mTP)
$mTP = $_mTP[1]
If $mTP == 6 Then ; если это Монстр
$OFS_mLEV[4] = $I * 4 ; читаем Уровень
$_mLEV = _MemoryPointerRead($BASE, $PROCESS, $OFS_mLEV)
$mLEV = $_mLEV[1]
IF $mLEV < $LEV And ($LEV - $mLEV) <= 14 Then ; если Монстр ниже по уровню Перса или подходит по настройкам Бота
$OFS_mZ[4] = $I * 4 ; читаем Z - координату (для того чтоб не путать цели с воздушными)
$_mZ = _MemoryPointerRead($BASE, $PROCESS, $OFS_mZ, "float")
$mZ = Int($_mZ[1] / 10.0)
IF Abs($mZ - $Z) < 4 Then ; если Монстр не выше или не ниже Перса на 4 пункта по оси Z
$OFS_mDIS[4] = $I * 4 ; читаем Дистанцияю
$_mDIS = _MemoryPointerRead($BASE, $PROCESS, $OFS_mDIS, "float") ; / 10
$mDIS = Int($_mDIS[1] / 10.0)
If $mDIS < $dismin Then ; если раст. до моба < запомненного и он на земле (для варианта без ПОЛЕТА !!!)
$dismin = $mDIS ; перезапомнить меньшее растояние
$PRIORID = $mID ; перезапомнить ID моба
$FI = $I ; запомним номер моба в цикле или его место в памяти данных
;ConsoleWrite("mTP: " & $mTP & " mID: " & $mID & " mLEV: " & $mLEV & " mPOS: " & $mX & " " & $mY & " " & $mZ & " mDIS: " & $mDIS & @CRLF)
EndIf
EndIf
EndIf
EndIf
EndIf
Next
$OFS_mF[4] = $FI * 4 ; читаем Занятость моба
$_mF = _MemoryPointerRead($BASE, $PROCESS, $OFS_mF)
$mF = $_mF[1]
Until Not $mF ; выполнять цикл пока ближайший монстр будет никем не занят (если в настройках нет галочки - Помогать др. Игрокам)
_MemoryPointerWrite($BASE, $PROCESS, $OFS_AT, "0x" & $PRIORID) ; записать ID в адрес цели
$TARGET_STATE = _MemoryPointerRead($BASE, $PROCESS, $OFS_AT) ; прочитать состояние цели
; Цель найдена и она в Прицеле - далее подпрограмма атаки с применением умений
EndFunc
|
|
|
11/29/2009, 23:41
|
#719
|
elite*gold: 0
Join Date: Nov 2009
Posts: 96
Received Thanks: 31
|
Scaner() запускать один раз перед боем, Locator после каждого убиенного ..))
Желательно листинг читать с форматированием TAB - а то на форуме все в один столбик ..
|
|
|
11/30/2009, 00:14
|
#720
|
elite*gold: 0
Join Date: Nov 2009
Posts: 96
Received Thanks: 31
|
Может кто-нить знает как наземные и воздушные цели отличать, а то если на бугре каком буш и с петом пчелой - пет полетит вверх Фонарики мочить ..)) но там можно регулировать Z высоту ..
|
|
|
All times are GMT +1. The time now is 00:11.
|
|