Что нового
  • Что бы вступить в ряды "Принятый кодер" Вам нужно:
    Написать 10 полезных сообщений или тем и Получить 10 симпатий.
    Для того кто не хочет терять время,может пожертвовать средства для поддержки сервеса, и вступить в ряды VIP на месяц, дополнительная информация в лс.

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

  • Гость, Что бы Вы хотели увидеть на нашем Форуме? Изложить свои идеи и пожелания по улучшению форума Вы можете поделиться с нами здесь. ----> Перейдите сюда
  • Все пользователи не прошедшие проверку электронной почты будут заблокированы. Все вопросы с разблокировкой обращайтесь по адресу электронной почте : info@guardianelinks.com . Не пришло сообщение о проверке или о сбросе также сообщите нам.

Lineage II Автоматический выбор монстра в Lineage 2

Lomanu4

Команда форума
Администратор
Регистрация
1 Мар 2015
Сообщения
2,110
Баллы
155
Пример кода (поиск монстров с помощью Cheat Engine):
Код:
uses
  Windows, SysUtils, TlHelp32;

// ... (Функции GetHealthPointer, ReadHealth, WriteHealth из предыдущих примеров)

function FindMonsters(ProcessID: DWORD): TList;
var
  hProcess: THandle;
  mbi: MEMORY_BASIC_INFORMATION;
  BaseAddress, EndAddress: Pointer;
  Buffer: array of Byte;
  BytesRead: SIZE_T;
  i: Integer;
  Monsters: TList;
begin
  Result := TList.Create;
  hProcess := OpenProcess(PROCESS_VM_READ, False, ProcessID);
  if hProcess <> 0 then
  begin
    BaseAddress := nil;
    EndAddress := Pointer($7FFFFFFF);
    while Cardinal(BaseAddress) < Cardinal(EndAddress) do
    begin
      if VirtualQueryEx(hProcess, BaseAddress, mbi, SizeOf(mbi)) = SizeOf(mbi) then
      begin
        if (mbi.State = MEM_COMMIT) and (mbi.Protect = PAGE_READWRITE) then
        begin
          SetLength(Buffer, mbi.RegionSize);
          if ReadProcessMemory(hProcess, mbi.BaseAddress, @Buffer[0], mbi.RegionSize, BytesRead) then
          begin
            for i := 0 to mbi.RegionSize - SizeOf(TMonster) do
            begin
              // Проверка, является ли текущая область памяти структурой монстра
              if (Buffer[i] = $8B) and (Buffer[i + 1] = $08) then
              begin
                // Создание экземпляра структуры монстра
                var Monster: TMonster = TMonster.Create;
                // Заполнение структуры данными из памяти
                Move(Buffer[i], Monster, SizeOf(TMonster));
                // Добавление монстра в список
                Result.Add(Monster);
              end;
            end;
          end;
        end;
        BaseAddress := Pointer(Cardinal(mbi.BaseAddress) + mbi.RegionSize);
      end;
    end;
    CloseHandle(hProcess);
  end
  else
    RaiseLastOSError;
end;

procedure TForm1.Button1Click(Sender: TObject);
var
  Monsters: TList;
  Monster: TMonster;
begin
  Monsters := FindMonsters(GetCurrentProcessId);

  // Выбираем подходящего монстра
  for Monster in Monsters do
  begin
    // ... (логика выбора монстра)
    // ... (управление персонажем для атаки)
  end;
end;
 
Вверх