Здравствуйте, гость ( Вход | Регистрация )

> Автохилер ВоВ 2.4.3, скрипт для хилинга 1-5 юнитов в пати. Хочется добиться работы с readme
Alfer
сообщение 23.9.2016, 17:12
Сообщение #1


**

Neophyte
Сообщений: 17
Регистрация: 23.9.2016
Группа: Пользователи
Наличность: 0
Пользователь №: 18.128
Возраст: 32



Итак есть интерес нарисовать хилера.

Формально от 1 до 5 разных окон запущенного клиента из одной и той же папки.
Система Win7 x64.
Клиент "WoW 2.4.3 build 8606 Jul 10 2008"

Для начала беру 2 окна.
Для двух окон родился код через поиск цвета точки, что неудобно.
Код

// перед запуском скрипта прописать макросы для лечения фокуса и DD выбрать в фокус.
set #hanldewinheal 1644826 // указать хендл окна хилера
set #hanldewinDD 596864 // указать хендл окна DD
set $hppoint1 "40, 155 57344" // DD тут ткнуть Ктрл+А для указания точки срабатывания начала лечения игрока. Где-то 70-75% ХП
set $hppoint2 "39, 182 52480" // Heal тут ткнуть Ктрл+А для указания точки срабатывания начала лечения хилера. Где-то 50-70% ХП
set #tw1 0
set #gcd 1500
set #hp1 1234
set workwindow #hanldewinDD
readmem #hp1 0x24543D1C R
log #hp1
wait 40s
:check
set windowpos [1 715 [494 325 [#hanldewinheal]]]
set windowpos [69 288 [1208 753 [#hanldewinDD]]]
set workwindow #hanldewinDD
while ($hppoint1) and ($hppoint2)
if_not ($hppoint1)
goto heal_1
end_if
if_not ($hppoint2)
goto heal_2
end_if
end_while
:heal_1
set workwindow #hanldewinheal
set timer
send {num_4} #gcd
send {num_5} #gcd
set workwindow #hanldewinDD
if_not ($hppoint2)
goto heal_2
end_if
set workwindow #hanldewinDD
if ($hppoint1)
goto check
end_if
set workwindow #hanldewinheal
send {num_4} #gcd
set workwindow #hanldewinDD
if ($hppoint1)
goto check
end_if
set workwindow #hanldewinheal
send {num_4} #gcd
set workwindow #hanldewinDD
if_not ($hppoint2)
goto heal_2
end_if
set workwindow #hanldewinDD
if ($hppoint1)
goto check
end_if
set workwindow #hanldewinDD
while_not ($hppoint1)
set workwindow #hanldewinheal
send {num_6} 2000
set workwindow #hanldewinDD
if_not ($hppoint2)
goto heal_2
end_if
set workwindow #hanldewinheal
send {num_0}
if timer > 11000
set workwindow #hanldewinDD
if ($hppoint1)
goto check
end_if
goto heal_1
end_if
end_while
goto check
:heal_2
set workwindow #hanldewinheal
set timer
send {num_7} #gcd
send {num_8} #gcd
set workwindow #hanldewinDD
if_not ($hppoint1)
goto heal_1
end_if
set workwindow #hanldewinDD
if ($hppoint2)
goto check
end_if
set workwindow #hanldewinheal
send {num_7} #gcd
set workwindow #hanldewinDD
if ($hppoint2)
goto check
end_if
set workwindow #hanldewinheal
send {num_7} #gcd
set workwindow #hanldewinDD
if_not ($hppoint1)
goto heal_1
end_if
set workwindow #hanldewinDD
if ($hppoint1)
goto check
end_if
set workwindow #hanldewinDD
while_not ($hppoint2)
set workwindow #hanldewinheal
send {num_9} 2000
set workwindow #hanldewinDD
if_not ($hppoint1)
goto heal_1
end_if
set workwindow #hanldewinheal
send {num_0}
if timer > 11000
set workwindow #hanldewinDD
if ($hppoint2)
goto check
end_if
goto heal_2
end_if
end_while
goto check


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

Основной алгоритм предполагается такой
пока ((ДД_ХП_актуал)\(ДД_ХП_макс) > 0.75) И ((Хил_ХП_актуал)\(Хил_ХП_МАХ) > 0.75) ждать
Иначе проверяем чьё меньше и отправляемся в процедуру его отхила.
процедура отхила ДД
процедура отхила Хила

Через ArtMoney нашёл 4 адреса(ДД хп макс и актуал, и Хил ХП макс и актуал )
Но это значение не читается в переменную
set workwindow #hanldewinDD
readmem #hp1 0x<Адресартмани> D (а Артмани тип целое 4 байта)
log #hp1
Но переменная выдает ошибку. (-1) при выводе переменной в лог

Перепробовал все возможные варианты типа данных и типа переменной всегда ошибка (-1)

Что не так подскажите куда копать в работе с памятью wow.
перечитал длинную тему про оффсеты, слазил на буржуйский форум не нашёл готовой цепочки офсетов для ХП своего и членов пати\рейда, и не нашёл механизма поиска этой цепочки. Но ведь если АртМани находит адрес памяти значит как минимум из этого адреса можно получить цифру в переменную, а вот не отдает. Подскажите куда копать ?
Пользователь в офлайнеDelete PostОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения
 
Ответить в эту темуОткрыть новую тему
Ответов
Alfer
сообщение 28.9.2016, 12:30
Сообщение #2


**

Neophyte
Сообщений: 17
Регистрация: 23.9.2016
Группа: Пользователи
Наличность: 0
Пользователь №: 18.128
Возраст: 32



Вот так заработало так как надо.

Скрипт

Код

// перед запуском скрипта прописать макросы для лечения фокуса и лечимый объект выбрать в фокус.
set #base_adress 0x00e29d28 // базовый, где хранится адрес ячейки начала структуры чара.
set #offset_maxHP 0x26b0 // смещение для поиска максимального значения ХП выбранного окна
set #hanldewinheal 1254942   // указать хендл окна хилера
set #hanldewinDD 26416278 // указать хендл окна ДД
set #gcd 1500
:0
set #part_hp_heal 100
set #part_hp_dd 100
set workwindow #hanldewinheal
readmem #first_adress #base_adress D
set #adress_maxHP_Heal #first_adress + #offset_maxHP //вычисляем адрес максимального значения ХП Хилера
set #adress_actHP_Heal #adress_maxHP_Heal - 0x18 //вычисляем адрес актуального значения ХП Хиера
set workwindow #hanldewinDD
readmem #first_adress #base_adress D
set #adress_maxHP_DD #first_adress + #offset_maxHP //вычисляем адрес максимального значения ХП ДДшника
set #adress_actHP_DD #adress_maxHP_DD - 0x18 //вычисляем адрес актуального значения ХП ДДшника
call hpdd_check #hanldewinDD #adress_maxHP_DD #adress_actHP_DD #part_hp_dd
call hpheal_check #hanldewinheal #adress_maxHP_Heal #adress_actHP_Heal #part_hp_heal
set #heal_mark 2
if  (#part_hp_dd <= 75) or (#part_hp_heal <= 75)
    if #part_hp_dd < #part_hp_heal
       set #heal_mark 0
    else
       set #heal_mark 1
    end_if
end_if
switch #heal_mark
case 0:
    gosub Heal_D
    break
case 1:
    gosub Heal_H
    break
case 2:
    break
end_switch
goto 0
Proc hpdd_check #hanldewinDD #adress_maxHP_DD #adress_actHP_DD #part_hp_dd
     set #temp_workwindow workwindow
     set #cs current_script
     set workwindow #hanldewinDD
     readmem #hpDD_m #adress_maxHP_DD D
     readmem #hpDD_a #adress_actHP_DD D
     set #hp1 #hpDD_a * 100 / #hpDD_m
     set $result #hp1
     set #part_hp_dd.#cs #hp1
     set workwindow #temp_workwindow
end_proc
Proc hpheal_check #hanldewinheal #adress_maxHP_Heal #adress_actHP_Heal #part_hp_heal
     set #temp_workwindow workwindow
     set #cs current_script
     set workwindow #hanldewinheal
     readmem #hpheal_m #adress_maxHP_Heal D
     readmem #hpheal_a #adress_actHP_Heal D
     set #hp2 #hpheal_a * 100 / #hpheal_m
     set $result #hp2
     set #part_hp_heal.#cs #hp2
     set workwindow #temp_workwindow
end_proc
end_script
:Heal_D
set workwindow #hanldewinheal
send {num_4} #gcd
set timer
send {num_5} #gcd
call hpdd_check #hanldewinDD #adress_maxHP_DD #adress_actHP_DD #part_hp_dd
if #part_hp_dd >= 75
    return
end_if
send {num_4} #gcd
call hpheal_check #hanldewinheal #adress_maxHP_Heal #adress_actHP_Heal #part_hp_heal
if #part_hp_heal < 75
    gosub Heal_H
end_if
send {num_4} #gcd
call hpdd_check #hanldewinDD #adress_maxHP_DD #adress_actHP_DD #part_hp_dd
if #part_hp_dd >= 75
    return
end_if
call hpheal_check #hanldewinheal #adress_maxHP_Heal #adress_actHP_Heal #part_hp_heal
if #part_hp_heal < 75
    gosub Heal_H
end_if
while timer < 9000
    send_down {DOWN}
    send_up {DOWN}
    send {num_6} 2100
    send {num_0}
    call hpdd_check #hanldewinDD #adress_maxHP_DD #adress_actHP_DD #part_hp_dd
    if #part_hp_dd >= 75
        return
    end_if
end_while
return
:Heal_H
set workwindow #hanldewinheal
send {num_7} #gcd
set timer
send {num_8} #gcd
call hpheal_check #hanldewinheal #adress_maxHP_Heal #adress_actHP_Heal #part_hp_heal
if #part_hp_heal >= 75
    return
end_if
send {num_7} #gcd
call hpdd_check #hanldewinDD #adress_maxHP_DD #adress_actHP_DD #part_hp_dd
if #part_hp_dd < 75
    gosub Heal_D
end_if
send {num_7} #gcd
call hpheal_check #hanldewinheal #adress_maxHP_Heal #adress_actHP_Heal #part_hp_heal
if #part_hp_heal >= 75
    return
end_if
call hpdd_check #hanldewinDD #adress_maxHP_DD #adress_actHP_DD #part_hp_dd
if #part_hp_dd < 75
    gosub Heal_D
end_if
while timer < 9000
    send_down {DOWN}
    send_up {DOWN}
    send {num_9} 2100
    send {num_0}
    call hpheal_check #hanldewinheal #adress_maxHP_Heal #adress_actHP_Heal #part_hp_heal
    if #part_hp_heal >= 75
        return
    end_if
end_while
return



Теперь попытаюсь еще отследить прерывание каста при нанесении хилу дмг.
Пользователь в офлайнеDelete PostОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения

Сообщений в этой теме
Alfer   Автохилер ВоВ 2.4.3   23.9.2016, 17:12
DarkMaster   Как раз сейчас обсуждаем с кнайтом проблему чтения...   23.9.2016, 22:06
Cockney   Чем пилот в этом плане отличается от c++?. апи то ...   24.9.2016, 0:56
DarkMaster   Апи чего? Чтения памяти другого процесса? Это не а...   24.9.2016, 12:30
Cockney   Хорошо, перефразирую. Чтение памяти вов чем-то отл...   24.9.2016, 14:57
Alfer   Можете подсказать как искать цепочки оффсетов ? И...   24.9.2016, 15:25
DarkMaster   артмани/читинжи. Либо сайтец по вову есть в виде ф...   24.9.2016, 15:27
DarkMaster   Как оказалось да. Нужны некоторые дополнительные ...   24.9.2016, 15:57
Cockney   Как оказалось да. Нужны некоторые дополнительные ...   24.9.2016, 17:17
Alfer   А еще вопрос. есть базовый адрес приложения (wow.e...   24.9.2016, 16:20
DarkMaster   Что есть базовый адрес? Адрес начала модуля? Может...   24.9.2016, 16:50
DarkMaster   В общак писать не буду схему реализации. Ни к чему...   24.9.2016, 19:45
DarkMaster   Ночная сборка b18 полный фикс.   24.9.2016, 20:14
Alfer   Спасибо, теперь память читается. А что, пилот с не...   25.9.2016, 20:13
cirus   Через плагин работает. https://forum.uokit.com/in...   25.9.2016, 20:25
Alfer   Это как ? Т.е. может нормально работать, а может...   25.9.2016, 21:07
cirus   if 10 = 10.0 log !!! end_if Услови...   25.9.2016, 21:44
Alfer   Да я их использовать и хочу. Только что-то после...   25.9.2016, 21:56
cirus   Походу баг. Можно сделать так: if #hp2 > #hph...   25.9.2016, 23:44
Alfer   Что-то не могу победить изменение переменной скрип...   26.9.2016, 16:15
Alfer   и еще вопросик. if #mark = 1 send {num_4} #gc...   26.9.2016, 16:30
Alfer   Пока что получилось победить через Свитч. По не на...   26.9.2016, 18:09
cirus   Сколько времени хил откатывается? Зачем делить хп...   27.9.2016, 3:01
Alfer   Хде ж вы раньше были ?! ;) Перечитал мануал ...   27.9.2016, 9:35
DarkMaster   хп в процентах имхо правильно. По остальному коду ...   27.9.2016, 9:43
cirus   Это останавливает скрипт на 3 секунды. Если в это...   27.9.2016, 11:39
Alfer   Не знаю знакомы ли Вы с механикой вов, но есть т...   27.9.2016, 12:15
cirus   Не играл. Как по мне, то в большинстве случаев п...   27.9.2016, 12:43
DarkMaster   Это бывает актуально, т.к. создает своего рода AP...   27.9.2016, 17:52
DarkMaster   Хотите сделать красиво? Соберите все хендлы окон ...   28.9.2016, 18:51
Alfer   Идея интересная, но была бы актуальна, если бы не ...   29.9.2016, 10:05
Alfer   Растащил по двум скриптам. Работает быстрее, но пе...   29.9.2016, 12:12
DarkMaster   всегда работаю на нуле. Там где нужно сами проста...   29.9.2016, 14:43
DarkMaster   Как-то не заметил данный пост. Если еще актуально...   3.10.2016, 16:36
Cockney   Дать возможность резервировать пользовательские пе...   3.10.2016, 17:22
DarkMaster   что есть резервированная пользовательская переменн...   3.10.2016, 19:16
Cockney   Тоже самое что ты и написал. При запуске пилота вы...   3.10.2016, 23:25
DarkMaster   ок. Допустим. Какие приемущества над call при тако...   4.10.2016, 9:57


Ответить в эту темуОткрыть новую тему
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 

- Текстовая версия | Версия для КПК Сейчас: 5.7.2025, 9:23
Designed by Nickostyle