krukovis, слишком толсто же ;D
Лучше имитировать нажатие на предмет (инжектом, а не отправкой клавиш).
Если вопрос в том, существует ли альтернатива, то ответ я только что дал выше, а если требуется конкретная реализация, то лично мне в данный момент лень. : D
Так я и говорю про инжект нажатия горячей клавиши. Можно кстати инжект клика мышки в нужных координатах сделать. Но искать для нового клиента мне так же лень. Но если знаешь что это есть - то есть смысл искать.
________________
-------------------------------------------- PerfectAutoLogin v 7.4 - Совершенный автологин для Perfect World [RUOFF, PWI, Фришек 1.4.4 - 1.4.5]
-------------------------------------------- [for 1.4.6] PW Patcher 12.0 - Патч на Горны, Красный (да и любой) чат, Анфриз, Бесконечный зум, Моментальный разгон на полете для RUOFF, PWI и прочих 1.4.6 и фришек 1.4.4, 1.4.5.
-------------------------------------------- InGamePatcher 1.2 - патчер для серверов 1.4.5 и 1.4.4 работающий с включенной игрой.
--------------------------------------------
procedure TalkToNPCCall(aPParams:PParams);Stdcall;
var NPCID:DWORD;
BaseAddress,CallAddress:Pointer;
begin
BaseAddress:=ptr($00A571E0);
NPCID:=aPParams^.Param1;
CallAddress:=ptr($00630B60);
asm
pushad
mov edx, dword ptr [BaseAddress]
mov ecx, dword ptr [edx+$20] // тут не 34, а 20, это не PersStruct
push NPCID
add ecx, $EC //тут так и есть EC
call CallAddress
popad
end;
end;
Код:
procedure PacketCall(aPParams:PParams); stdcall;
var
CallAddress,pPacket:pointer;
Len:DWord;
begin
CallAddress:=Pointer($0063DB70);
Len:=aPParams^.Param1;
pPacket:=@aPParams^.Packet;
asm
pushad
mov ecx, dword ptr [PW_BASE_ADDRESS]
mov ecx, dword ptr [ecx+$20] // тут не 34, а 20, это не PersStruct
push Len
push pPacket
call CallAddress
popad
end;
end;
Цитата:
Сообщение от Meg(0)
и где должно находится значение NPCID?
Код:
procedure TalkToNPC(NPCID:Cardinal); // <-сюда передаётся как параметр
var aParams:TParams;
v:HWND;
begin
aParams.Param1:=NPCID:;
InjectFunc(v,@TalkToNPCCall,@aParams,SizeOf(aParams));
end;
Добавлено через 7 минут
Цитата:
Сообщение от ktulx
Существует подобная альтернатива использованию итема из инвентаря? То есть, без привязки к номеру ячейки.
Создать функцию, которая получает в качестве параметра только ID, сканирует инвентарь на наличие этого ID берёт номр ячейки, в которой нашёлся данный предмет и вызывает инжект уже с указанием ID и найденным номером ячейки. У меня бот так банки пьёт, из любой ячейки, лишь бы они были в инвентаре.
________________
╔═╗
║ ˑ ˑ ╬ ╬
╚═╝
Последний раз редактировалось dwa83; 29.05.2012 в 16:13.
Причина: Добавлено сообщение
dwa83, дорогой, оформи топик по человечески, пожалуйста. Основное -
Код:
теги code
________________
-------------------------------------------- PerfectAutoLogin v 7.4 - Совершенный автологин для Perfect World [RUOFF, PWI, Фришек 1.4.4 - 1.4.5]
-------------------------------------------- [for 1.4.6] PW Patcher 12.0 - Патч на Горны, Красный (да и любой) чат, Анфриз, Бесконечный зум, Моментальный разгон на полете для RUOFF, PWI и прочих 1.4.6 и фришек 1.4.4, 1.4.5.
-------------------------------------------- InGamePatcher 1.2 - патчер для серверов 1.4.5 и 1.4.4 работающий с включенной игрой.
--------------------------------------------
dwa83, дорогой, оформи топик по человечески, пожалуйста. Основное -
Извиняюсь..
Добавлено через 8 минут
Цитата:
Сообщение от Meg(0)
а от кудого передаётся?
Ну как откудого? Либог Из переменной, в которой хранится ID нужного NPC либо напрямик писать ID. Вот пожую ещё немного:
Допустим нам нужно открыть диалоговое окно с ближайшим от нас НПС, мы проверяем массив окружающих мобов/нпс, находим среди них ближайшего НПС(по расстоянию до него) и считываем его ID. Далее вызываем функцию, параметром которой и является найденный нами ID, и при условии, что мы стоим на расстоянии, позволяющем открыть диалог, диалог откроется.
Либо если мы уже посмотрели по базе ID конкретного нужного нам NPC, то подводим бота к нему на положенное расстояние и вызываем функцию с уже заранее известным ID, например:
Код:
TalkToNPC(1234); // здесь 1234 - это ид конкретного NPC (не путать ID с WID)
________________
╔═╗
║ ˑ ˑ ╬ ╬
╚═╝
Последний раз редактировалось dwa83; 29.05.2012 в 16:22.
Причина: Добавлено сообщение
Возможно меня не вполне правильно поняли, или я недопонял ответы ) Внесу больше конкретики:
Читаю инвентарь в массив записей с двумя полями: ID и ИМЯ. Как мне лучше/удобнее/ресурсоэкономичнее реализовать использование итема из инвентаря? Единственное, что мне пришло в голову - добавить в массив записей третье поле, куда будет записываться номер ячейки и затем подставлять этот номер и ID в пакет. Но возникает одно "но": а если вдруг итем был перемещён? Либо, скажем, у меня в инвентаре 150 микстур бодрости, 100 в первой ячейке и 50 во второй. В выпадающем списке формы я выбираю предмет по названию, а в пакет подставляется соответствующий ID и номер ячейки. Микстуры в первой/второй ячейке заканчиваются, и пакет уже будет недействителен. Следовательно, мне нужно хотя бы раз в несколько секунд перечитывать инвентарь, верно? Насколько неправильным будет такое решение? ))
Ах да, забыл добавить. Не хочу делать вызов по горячей клавише ) это несколько не труъ.
Спасибо.
Последний раз редактировалось ktulx; 29.05.2012 в 17:17.
Следовательно, мне нужно хотя бы раз в несколько секунд перечитывать инвентарь, верно?
Инвентарь нужно считывать перед тем, как ты собираешься что то использовать. Перебор в 32 значения - это совершенно не ресурсоемкая задача. Да и вообще сильно не заморачивайся по поводу затрат ресурсов. Учитывая отклик от сервера в 500 мс, задержки в твоих циклах должны быть равны примерно 1000 мс (+-200 мс). А выполнение операций (циклов и прочего) занимает примерно 20 мс. Поэтому твоя программа будет работать примерно 10% времени и 90% времени будет просто находится в паузе.
________________
-------------------------------------------- PerfectAutoLogin v 7.4 - Совершенный автологин для Perfect World [RUOFF, PWI, Фришек 1.4.4 - 1.4.5]
-------------------------------------------- [for 1.4.6] PW Patcher 12.0 - Патч на Горны, Красный (да и любой) чат, Анфриз, Бесконечный зум, Моментальный разгон на полете для RUOFF, PWI и прочих 1.4.6 и фришек 1.4.4, 1.4.5.
-------------------------------------------- InGamePatcher 1.2 - патчер для серверов 1.4.5 и 1.4.4 работающий с включенной игрой.
--------------------------------------------
Что вообще скажешь о механизме, который я описал? "Нормально"?
Механизм должен быть такой, как мне кажется:
1)Ты выбираешь название предмета из списка в инвентаре, а программа запоминает его ID, без привязки к номеру ячейки.
2) Программа считывает в массив данные о предметах в инвентаре. Где ключ - № ячейки, а значение - ID.
3) Далее ты ищешь первую ячейку в которой у тебя лежит нужный предмет. Ищешь по значению (ID). Поиск по значению как раз и выдает номер ячейки. В Delphi же ключи считаются от нуля, на сколько я знаю. И у тебя ячейки идут от нуля.
4) Далее ты отправляешь пакет на использование нужного тебе предмета определив № ячейки и зная ID.
________________
-------------------------------------------- PerfectAutoLogin v 7.4 - Совершенный автологин для Perfect World [RUOFF, PWI, Фришек 1.4.4 - 1.4.5]
-------------------------------------------- [for 1.4.6] PW Patcher 12.0 - Патч на Горны, Красный (да и любой) чат, Анфриз, Бесконечный зум, Моментальный разгон на полете для RUOFF, PWI и прочих 1.4.6 и фришек 1.4.4, 1.4.5.
-------------------------------------------- InGamePatcher 1.2 - патчер для серверов 1.4.5 и 1.4.4 работающий с включенной игрой.
--------------------------------------------
Не ВИД а ИД, было всё правильно - $438 приходило сюда из параметра PParams.
Цитата:
Сообщение от Meg(0)
mov ecx, dword ptr [edx+$34]
ну не 34 тут а 20, я ведь писал
Цитата:
Сообщение от Meg(0)
TalkToNPC($438);
всё правильно, но почему здесь именно значение $438 и почему именно в шестнадцатиричной форме? Перевожу в десятичное, получаю 1080, лезу в базу ПВ, нахожу непонятно какого НПС без имени и без толкового описания([Ссылки могут видеть только зарегистрированные пользователи. ]). Это чей ИД?
Добавлено через 41 минуту ktulx, а откуда вы хотите вообще брать ID? Считать из списка предметов, которые в данный момент находятся в инвентаре или знать ID-ы предметов заранее?
Я себе сделал без заморочек.
В проге сделал массив такого типа
ID банок для 0 левела
ID банок для 5 левела
ID банок для 12 левела
ID банок для 20 левела
...
Разместил на форме заранее заполненный комбо-бокс, в котором выбирается левел используемых банок.
Уровень банок 0
Уровень банок 5
Уровень банок 12
Уровень банок 20
...
Далее в зависимости от того какая строка в комбо-боксе выбрана, берётся из массива нужный ID и ищется ячейка в которой лежит предмет с таким ID, смотрится её номер, и вызывается инжект с известным номером и известным ID. Если нужного предмета не нашлось, бот летит покупать банки.
Раньше было так: бралось первое значение из массива, сканировался инвентарь от конца до начала(чтобы использовались сначала последние ячейки и банки наименьшего левела) на наличие первого ID, если находили, использовался этот предмет. Если не находили, то брали второй ID из массива и опять сканировали инвентарь от конца к началу, если вообще нет ни одной банки ни для какого левела, то летели закупаться.
________________
╔═╗
║ ˑ ˑ ╬ ╬
╚═╝
Последний раз редактировалось dwa83; 31.05.2012 в 16:28.
Причина: Добавлено сообщение
dwa83, не заметил,что не исправил 34 на 20,вот сейчас так сделал
Код:
TalkToNPC($4445);
тоже никакой реакции,добавил сюда поиск окна,вдруг он ранее нахождение окна не считывает,поставил так,тоже ничего не происходит..(
Код:
procedure TalkToNPC(NPCID:Cardinal);
var aParams:TParams;
v:HWND;
begin
v:=FindWindow(nil,Pchar('Perfect World));
if v <> 0
then
begin
aParams.Param1:=NPCID;
InjectFunc(v,@TalkToNPCCall,@aParams,1);
end;
end;
Код:
NPCID:=aPParams^.Param1;
Последний раз редактировалось Meg(0); 31.05.2012 в 23:41.
Откуда вы берёте 4445? если из базы то этому ID соответствует торговец ЕСЛИ ЧИСЛО В ДЕСЯТИЧНОМ ВИДЕ, в шестнадцатиричном соответствует опять же непонятному НПС. Уберите знак "$".
А вы туда хэндл окна суёте, да и процесс не открыли перед инжектом.
Добавлено через 4 часа 0 минут
Цитата:
Сообщение от krukovis
Написал функцию закрытия любого окна:
Функция на VB.Net с использованием ASM'а. Ниже на Delphi.
Код:
''' <summary> Закрытие окна </summary> актуально на 01.02.2012
Public Sub CloseWindow(ByVal windowOffset As Integer)
Dim intProcID As Integer = PW_WINDOW.ProcessId
Dim CallAddress As Integer = &H616EA0
Dim asm As New ASM()
asm.Pushad()
asm.Mov_EAX(BaseAddress)
asm.Mov_EAX_DWORD_Ptr_EAX()
asm.Mov_EAX_DWORD_Ptr_EAX_Add(&H1C)
asm.Mov_EAX_DWORD_Ptr_EAX_Add(&H18)
asm.Mov_EAX_DWORD_Ptr_EAX_Add(&H8)
asm.Mov_EAX_DWORD_Ptr_EAX_Add(windowOffset)
asm.Push_EAX()
asm.Push68(&HACC3BC) 'Btn_Close
asm.Mov_EBP(CallAddress)
asm.Call_EBP()
asm.Popad()
asm.Ret()
asm.RunAsm(intProcID, 0)
End Sub
Принимает в качестве параметра смещение окна
Код:
0x2B8 Действия
0x2C0 Игроки и группы
0x2C4 Служба поддержки
0x314 Характеристики персонажа
0x32C Ремонт
0x36C Призыв духа
0x3E8 Помощь
0x40C Инвентарь и Окно Торговли и Ремонта
0x428 Диалог с NPC
0x438 Домашние животные
0x458 Окно алхимика
0x468 Панель 1-9
0x470 Горячие клавиши
0x4B0 Настройки
0x4C4 Умения
0x50C Системная панель
0x51C Задания
Добавлено через 25 минут
Вот на Delphi - если найдете синтаксические ошибки - скажите - поправлю. Delphi не установлен, писал в блокноте.
________________
-------------------------------------------- PerfectAutoLogin v 7.4 - Совершенный автологин для Perfect World [RUOFF, PWI, Фришек 1.4.4 - 1.4.5]
-------------------------------------------- [for 1.4.6] PW Patcher 12.0 - Патч на Горны, Красный (да и любой) чат, Анфриз, Бесконечный зум, Моментальный разгон на полете для RUOFF, PWI и прочих 1.4.6 и фришек 1.4.4, 1.4.5.
-------------------------------------------- InGamePatcher 1.2 - патчер для серверов 1.4.5 и 1.4.4 работающий с включенной игрой.
--------------------------------------------
Откуда вы берёте 4445? если из базы то этому ID соответствует торговец ЕСЛИ ЧИСЛО В ДЕСЯТИЧНОМ ВИДЕ, в шестнадцатиричном соответствует опять же непонятному НПС.
да,это ID из базы,торговец...перевожу в шестнадцатиричный,получается 115D,без $ не работает,ошибку показывает
сделал вот так...но тоже ничего не происходит
Код:
procedure TalkToNPCCall(aPParams:PParams);Stdcall;
var NPCID:DWORD;
BaseAddress,CallAddress:Pointer;
begin
BaseAddress:=ptr($00A571E0);
NPCID:=aPParams^.Param1;//$801044b2; //aPParams^.Param1;//$801045de;
CallAddress:=ptr($00630B60);
asm
pushad
mov edx, dword ptr [BaseAddress]
mov ecx, dword ptr [edx+$20]
push NPCID
add ecx, $EC
call CallAddress
popad
end;
end;
procedure TalkToNPC(NPCID:Cardinal);
var aParams:TParams;
v:HWND;
Pid,hProcess:DWord;
begin
v:=FindWindow(nil,Pchar('Perfect World'));
if v <> 0
then
begin
GetWindowThreadProcessId(v,@PId);
hProcess:=OpenProcess(PROCESS_ALL_ACCESS,False,PId);
aParams.Param1:=NPCID;
InjectFunc(PId,@TalkToNPCCall,@aParams,1);
end;
end;
procedure TForm1.Button6Click(Sender: TObject);
begin
TalkToNPC($115D);
end;
end.
Последний раз редактировалось Meg(0); 13.06.2012 в 10:13.