PDA

Просмотр полной версии : [Помогите!] Вопрос по созданию бота.


сhersаnyа
18.12.2011, 13:07
Я использую C# и клиент PvPpw. Чтение информации о самом игроке получилось сделать достаточно легко, используя библиотеку MemFunctions (откуда-то скачанную) и информацию с [Ссылки могут видеть только зарегистрированные и активированные пользователи]Адреса-и-оффсеты.292/. Там также есть оффсеты для окружающих мобов, нпс и т.п., но я никак не могу понять, каким образом это представлено в памяти. Если можно, приведите пожалуйста пример, как получить какую-нибудь информацию из хеш-таблицы по ближайшим мобам, например.

И ещё вопрос - как выделить (поместить в таргет) какого-нибудь моба? Нигде не нашёл примеров с этим.
P.S.: да, я знаю, что есть готовые боты и проще использовать их, но написать что-то своё интереснее =)

Skuka.95
18.12.2011, 14:34
сам пишу на делфи, так что толком помочь немогу (наверно) но загляни сюда [Ссылки могут видеть только зарегистрированные и активированные пользователи] может поможет)

FreePVP)))
18.12.2011, 16:00
У меня загрузка списка мобов происходит вот так:
// Доступ к элементам списка осуществляется так:
// GA +20 +380 +088 +I*4 (I In [0..N])
// где N = кол-во игроков рядов

// Открываем память процесса для чтения / записи
MemoryManager.OpenProcess(selectedWindow1.ProcessI d);
// Получаем кол-во моб, которое рядом с нами
// GA +20 +380 +14
//var nearPlayersCount = MemoryManager.ChainReadInt32(GameRun, 0x1c, 0x24, 0x14);
var nearMobCount = MemoryManager.ChainReadInt32(GameRun, 0x1c, 0x24, 0x14);
// Записываем результат
// Получаем указатель, на начало списка
// GA +20 + 380 +88
//var pointer = MemoryManager.ChainReadInt32(GameRun, 0x1c, 0x20, 0x88);
var pointer = MemoryManager.ChainReadInt32(GameRun, 0x1c, 0x24, 20 * 4);

// Начинаем пробегать по списку мобов
for (var i = 0; i < nearMobCount; i++)
{
// Получаем указатель, на начало структуры из списка игроков
var mobBase = MemoryManager.ReadInt32(pointer + i * 0x4);
// Проверяем существует ли запись
if (mobBase != 0)
{
// Получаем данные из структуры, которые нам нужны
var mobType = MemoryManager.ReadInt32(mobBase + 0xB4);
//if (mobType == 6)
{
var mobId = MemoryManager.ReadInt32(mobBase + 0x120);
var mobName = MemoryManager.ChainReadString(mobBase + 0x254, 32, 0x0);
var mobLevel = MemoryManager.ReadInt32(mobBase + 0x124);
lvMobs.Items.Add(mobName).SubItems.AddRange(new string[] { mobLevel.ToString(), mobId.ToString() });
// Записываем полученные данные
//MesBox(mobName);
}
}

}
// Закрываем дескриптор процесса
MemoryManager.CloseProcess();
Для таргета надо послать пакет клиенту (659450 Send pack func)
Пакет я строю так:
public static byte[] Target(byte[] id)
{
byte[] ret = new byte[] { 0x02, 0x00 };
ret = Bytes.WriteBytes(ret, id);
Injects.text = Bytes.ToString(ret);
return ret;
}

сhersаnyа
18.12.2011, 17:32
FreePVP))), спасибо, как доберусь домой обязательно попробую :) Со списком мобов вроде всё понятно, а по поводу таргета можно немного пояснить? Что такое byte[] id, что именно возвращает функция, ну и что делает Injects.text = ...?

FreePVP)))
18.12.2011, 19:28
Посмотрите PW Development Framework ([Ссылки могут видеть только зарегистрированные и активированные пользователи])
Там есть пример

сhersаnyа
19.12.2011, 12:24
FreePVP))), посмотрел PWFramework (и другое), но не совсем понял, какой именно id нужно передавать в пакете для выделения моба (и для других пакетов, где нужен какой-нибудь id, тоже не понятно). Пакеты, которые не требуют дополнительных данных, работают нормально, а для этих никак не могу понять, где брать id. mobId, который из var mobId = MemoryManager.ReadInt32(mobBase + 0x120), это вроде бы не то, т.к. он у всех мобов одного вида одинаков...

FreePVP)))
19.12.2011, 13:27
А надо передавать World ID
Я получаю WID моба так:
var mobWID = MemoryManager.Read4Bytes(mobBase + 0x11C);
В MemoryManager надо дописать:
public static byte[] Read4Bytes(Int32 address)
{
int read; var buffer = new byte[4];

WinApi.ReadProcessMemory(OpenProcessHandle, address, buffer, buffer.Length, out read);

return buffer;
}

Добавлено через 4 минуты
Injects.text я не помню, зачем использовал
А функция возвращает массив байт
Вот так более правильно:

public static byte[] Target(byte[] id)
{
ret = Bytes.WriteBytes(new byte[] { 0x02, 0x00 }, id);
return ret;
}