Rus. server

01/20/2010 01:10 FunkU#1306
Скачал архив с форума, запустил бота из архива, задал мобов, нажал кнопочку Старт и бот успешно убил ещё штук 7 росянок... Интересно, у кого-то кроме меня самого, то что я сотворил, вообще заработало? ) Может мне снится? )

Вообще я мало разбираюсь в инжектах, но тут на форуме как минимум ещё у 2 человек инжекты из автоита работали.
01/20/2010 01:23 Sirioga#1307
Quote:
Originally Posted by FunkU View Post
Хм... У меня мой бот на автоите и работает нормально. Я ж написал, что проверил. Росянок 7 бот убил. ) А какая у тебя система?
xp sp2, и скорее всего то что ты написал ток у тебя и работает)
01/20/2010 01:31 FunkU#1308
Я не писал, а модифицировал. ) Проверил на своём ноуте бота - тоже работает. Система везде XP SP3, но сборки разные. Могу на Висте ещё проверить попозже... Мне интересно, а какие ещё программы на автоите с инжектами ты пытался запускать?
01/20/2010 01:43 Sirioga#1309
Quote:
Originally Posted by FunkU View Post
Я не писал, а модифицировал. )
Я не имел ввиду весь mhs а только часть кода.
01/20/2010 02:12 Novohyd#1310
смени
MOV_EDI(Dec($TID))
PUSH_EDI()
на
PUSH(Dec($TID))
еще может быть причина вылета
mhs тупо пытается выделить моба по ид независимо от того есть он на месте или нет и если моб в таргете значит присутствует и можно его килл
сначала надо проверить наличие моба а потом уж таргет делать
01/20/2010 02:32 FunkU#1311
Novohyd
Да, это понятно. Мой собственный бот проверяет наличие моба. А в MHS это вставить довольно трудоёмко будет. Я просто хотел сделать рабочий на новой версии MHS. ) Но пока он работает только у меня. Кстати ты же вроде сделал рабочий инжект на автоите, да? Он тоже только у тебя работает?
01/20/2010 06:32 dj_al#1312
По карте. Если кто хочет ту картинку целиком сразу грузить - лучше забудьте про эту великолепную идею. :)
Я тут посчитал. Её размеры в jpg - около 10 Мб. Но в памяти же она развернётся в обычный BitMap, давайте прикинем размер его. :)
Разрешение картинки: 8192х9215 - итого 75 489 280 пикселей. На каждый пиксель 3 байта, а скорее всего 4 из-за выравнивания. Итого 300 Мб памяти на то чтобы загрузить данную картинку в память. :)
Можно конечно её сильно уменьшить, но тогда расположение бота можно угадать лишь ОЧЕНЬ приблизительно.
На мой взгляд - лучше уж грузить частями карту, так же как это реализованно в самом клиенте. Там одновременно максимум 4 куска может быть.
01/20/2010 07:29 Novohyd#1313
Quote:
Originally Posted by FunkU View Post
Novohyd
Да, это понятно. Мой собственный бот проверяет наличие моба. А в MHS это вставить довольно трудоёмко будет. Я просто хотел сделать рабочий на новой версии MHS. ) Но пока он работает только у меня. Кстати ты же вроде сделал рабочий инжект на автоите, да? Он тоже только у тебя работает?
Инжект тот-же. только вместо записи ид в регистр и push регистр у меня сразу push ид

вот функция выбирающая первого по порядку присутствующего моба из MHS-ного конфиг-файла. выдергивал целиком так что может малость подправить придется
возвращает i найденного моба.
[Only registered and activated users can see links. Click Here To Register...]
01/20/2010 08:45 dwar#1314
Alexhomp
совсем забыл добавить: попытки поиска адреса .. ни к чему не приведут...

Поправка:
[BA] + $1C + $8 + $60 + $4 + $0 :: Current location (char)
01/20/2010 08:51 FunkU#1315
Novohyd
Попробовал заменить, как ты сказал и дать человеку, у которого бот не работал и он всё равно не заработал. Может это связано с разными версиями каких-то библиотек?
01/20/2010 09:43 Novohyd#1316
я давал этого бота по знакомым - работает совершенно без сбоев
01/20/2010 10:49 Alexhomp#1317
Quote:
Originally Posted by dwar View Post
Alexhomp
совсем забыл добавить: попытки поиска адреса и смещений для получения текстового значения названия текущей локации, ни к чему не приведут, т.к. данная строка носит чисто информативных характер, и формируется при прорисовки интерфейса. Можно, конечно же, дальше влезть в код и найти процедуру, отвечающую за это, но, есть ли смысл?
Спасибо что навёл на нужную дорогу. Буду учить asm)))

Хотя можно еще попробовать поискать ID территории. Надеюсь получится)))
01/20/2010 17:09 AlexGD#1318
Давненько я что-то тут не был )))

Тут по рюкзаку спрашивали... Код из моей тулзы. Состояние Alpha, но чу где брать и как - понятно.

Code:
InventoryAddress = C1C
InventoryQuestAddress = C24


// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
// ~~~ Unified type for holding bounds (maybe need to be extended?)
// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
type
  TaBounds = record
    Curr: Cardinal;
    Max : Cardinal;
  end;

// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
// ~~~ TODO type for holding item properties
// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
type
  TaItem = record
    ID                  : Integer;
    Quantity            : TaBounds;
    Position            : Integer;
    Price               : Cardinal;
    NameAddress         : Cardinal;
    Name                : WideString;
    GearLevelRequirement: Cardinal;
    StrRequirement      : Cardinal;
    AgiRequirement      : Cardinal;
    ItemLevelRequirement: Cardinal;
    ConRequirement      : Cardinal;
    IntRequirement      : Cardinal;
    Durability          : TaBounds;
  end;

type
  TaItemsArray = array of TaItem;

var
  aItems  : array [0..100000] of TaItem;

// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
// ~~~ unifyied getItem function
// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
function TaPWT.getItem(aProcessID: Cardinal; aPointer: DWORD): TaItem;
var
  S: WideString;
begin
  Result.ID := getDWORD(aProcessID, aPointer + $8);
  if Result.ID < 100000 then
  begin
    Result.Quantity.Curr := getDWORD(aProcessID, aPointer + $10);
    S := getSTRING(aProcessID, getDWORD(aProcessID, aPointer + $40), 1024);
    S := MidStr(S, 8, Length(S));
    S := LeftStr(S, Pos('\', S) - 1);
    if Pos('(', S) > 0 then
      S := LeftStr(S, Pos('(', S) - 2);
    Result.Name := S;
  end
  else
    Result.ID := 0;
end;

// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
// ~~~ function to get BackPack list
// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
function TaPWT.GetBackpack(aProcessID: Cardinal):TaItemsArray;
var
  aItem: TaItem;
  tempA: TaItemsArray;
  p1, p2, p3, p4: DWORD;
  i, n: integer;
  IniFileItemsT: TIniFile;
begin
  IniFileItemsT  := TIniFile.Create(ExtractFilePath(Application.ExeName) + 'aPWToolsItems.ini');
  n := 0;
  p1 := getDWORD(aProcessID, getDWORD(aProcessID, getDWORD(aProcessID, aBaseAddress) + $1C) + $20);
  p2 := getDWORD(aProcessID, p1 + aPlayerOffsets.InventoryAddress);
  p3 := getDWORD(aProcessID, p2 + $0C);
  SetLength(tempA, getDWORD(aProcessID, p2 + $10));
  for i := 0 to Length(tempA) - 1 do
  begin
    p4 := getDWORD(aProcessID, p3 + (I * 4));
    aItem := getItem(aProcessID, p4);
    if aItem.ID <> 0 then
    begin
      if (aItems[aItem.ID].Name = '') and (aItem.Name <> '')  then
      begin
        IniFileItemsT.WriteString('Items',  IntToStr(aItem.ID), aItem.Name);
        aItems[aItem.ID].Name := aItem.Name;
      end;
      aItems[aItem.ID].ID := aItem.ID;
      aItems[aItem.ID].Quantity.Curr := aItem.Quantity.Curr;
      tempA[n] := aItems[aItem.ID];
      tempA[n].Position := i;
      Inc(n);
    end;
  end;
  SetLength(Result, n);
  for i := 0 to n - 1 do
    Result[i] := tempA[i];
  IniFileItemsT.Free;
end;
01/21/2010 11:50 PsiSnake#1319
Народ, кто нибудь в курсе, есть ли возможность видеть точное кол-во хп у боссов, допустим в хх? Если есть, то как это возможно сделать?
01/21/2010 18:42 AlexGD#1320
Code:
procedure TMan.ReadMonInfo(aSetup:Tstringlist);
var
  TempDist:single;
  I:integer;
begin
  TempDist:=strtoint(aSetup.values['AttackSize']);
  //ReadProcessMemory(ProcessID, Pointer($00931C6C),@W2I_ENVIRON_BASE_ADDR,4,Num);
  //ReadProcessMemory(ProcessID, Pointer(W2I_ENVIRON_BASE_ADDR +  $8), @W2I_ENVIRON_BASE_ADDR, 4, Num);//µГµЅЦЬО§»·ѕіµШЦ·
  ReadProcessMemory(ProcessID, Pointer(W2I_ENVIRON_BASE_ADDR + $24), @W2I_MONSTER_BASE_ADDR, 4, Num); //µГµЅ№ЦОп »щµШЦ·
  ReadProcessMemory(ProcessID, Pointer(W2I_MONSTER_BASE_ADDR + $14), @W2I_MONSTER_COUNT, 4, Num); //ЦЬО§№ЦОпКэБї
  ReadProcessMemory(ProcessID, Pointer(W2I_MONSTER_BASE_ADDR + $24), @W2I_MONSTER_MAXCOUNT, 4, Num); //№ЦОпКэЧйµДЧоґуЦµ (MAX =769)
  ReadProcessMemory(ProcessID, Pointer(W2I_MONSTER_BASE_ADDR + $18), @W2I_MONSTER_ADDR, 4, Num);  //№ЦОпБР±нµДКЧµШЦ·
  For i:= 0 to W2I_MONSTER_MAXCOUNT-1 do begin  //768
    ReadProcessMemory(ProcessID, Pointer(W2I_MONSTER_ADDR+i*4),@W2I_ENV_MONSTER_ADDR,4,Num); //ПаУ¦О»ЦГ№ЦОпµШЦ· //¶БИЎ№ЦОпЖ«ТЖ
    if W2I_ENV_MONSTER_ADDR>0 then  begin
      ReadProcessMemory(ProcessID, Pointer(W2I_ENV_MONSTER_ADDR+$4),@W2I_ENV_MONSTER_OBJ,4,Num);//¶БИЎ№ЦОпРЕПўЦёХл
      ReadProcessMemory(ProcessID, Pointer(W2I_ENV_MONSTER_OBJ+$238),@W2I_ENV_MONSTER_NAME1,4,Num);
      ReadProcessMemory(ProcessID, Pointer(W2I_ENV_MONSTER_NAME1),@W2I_ENV_MONSTER_NAME,16,Num);
      ReadProcessMemory(ProcessID, Pointer(W2I_ENV_MONSTER_OBJ+$11c),@W2I_ENV_MONSTER_ID,4,Num); //CALLУГµД№ЦОпID
      ReadProcessMemory(ProcessID, Pointer(W2I_ENV_MONSTER_OBJ+$25c),@W2I_ENV_MONSTER_DIST,4,Num);//№ЦОпѕаАл
      ReadProcessMemory(ProcessID, Pointer(W2I_ENV_MONSTER_OBJ+$b4),@W2I_ENV_MONSTER_TYPE,4,Num);//№ЦОпАаРН
      ReadProcessMemory(ProcessID, Pointer(W2I_ENV_MONSTER_OBJ+$12c),@W2I_ENV_MONSTER_CURHP,4,Num);
      ReadProcessMemory(ProcessID, Pointer(W2I_ENV_MONSTER_OBJ+$15c),@W2I_ENV_MONSTER_MAXHP,4,Num);
      ReadProcessMemory(ProcessID, Pointer(W2I_ENV_MONSTER_OBJ+$3c),@W2I_ENV_MONSTER_X,4,Num);
      ReadProcessMemory(ProcessID, Pointer(W2I_ENV_MONSTER_OBJ+$40),@W2I_ENV_MONSTER_Z,4,Num);
      ReadProcessMemory(ProcessID, Pointer(W2I_ENV_MONSTER_OBJ+$44),@W2I_ENV_MONSTER_Y,4,Num);
      //ReadProcessMemory(ProcessID, pointer(W2I_ENV_MONSTER_OBJ+$294),@W2I_ENV_MONSTER_STATUS1,4,num);//№ЦОпЧґМ¬
      //ReadProcessMemory(ProcessID, pointer(W2I_ENV_MONSTER_OBJ+$2a0),@W2I_ENV_MONSTER_STATUS2,4,num);//№ЦОпЧґМ¬ 2
      case  W2I_ENV_MONSTER_TYPE of
      6:begin //№ЦОп        //ХвЦЦsingleАаРНµШ±ИЅП КЗ·сУР±ШТЄЧЄ»»ОЄint РНµДЈїЈїЈїЈїЈїЈїЈїЈїЈїЈїЈїЈї
        if (tempDist >= W2I_ENV_MONSTER_DIST)  then begin   //»сИЎЧоЅьµД №ЦОпРЕПў
          if strtobool(aSetup.Values['CanAttackMon']) then begin  //Ц»ґтЦё¶ЁµД№ЦОпЖф¶Ї
            if strtobool(aSetup.Values['NoRobet']) then begin // І»ЗА№ЦЖф¶Ї
              if W2I_ENV_MONSTER_CURHP<>W2I_ENV_MONSTER_MAXHP then continue
              else begin
                if pos(W2I_ENV_MONSTER_NAME,aSetup.Values['CanAttackList'])>0 then  begin
                  TempDist:=W2I_ENV_MONSTER_DIST;
                  Monster.Name :=W2I_ENV_MONSTER_NAME;
                  Monster.MonID :=W2I_ENV_MONSTER_ID;
                  Monster.Distant :=W2I_ENV_MONSTER_DIST;
                  Monster.MonPoX :=W2I_ENV_MONSTER_X;
                  Monster.MonPoY :=W2I_ENV_MONSTER_Y;
                  Monster.MonPoZ :=W2I_ENV_MONSTER_Z;
                end;
              end;
            end;
          end
          else begin  //ґтЛщУРµД№Ц when CanAttackMon = false
            TempDist:=W2I_ENV_MONSTER_DIST;
            Monster.Name :=W2I_ENV_MONSTER_NAME;
            Monster.MonID :=W2I_ENV_MONSTER_ID;
            Monster.Distant :=W2I_ENV_MONSTER_DIST;
            //Monster.MonStatus :=W2I_ENV_MONSTER_STATUS2;
            Monster.MonPoX :=W2I_ENV_MONSTER_X;
            Monster.MonPoY :=W2I_ENV_MONSTER_Y;
            Monster.MonPoZ :=W2I_ENV_MONSTER_Z;
          end;
        end;
      end;
      7:begin //КЗNPC
        //
      end;
      9:begin //КЗіиОп
        //
      end;
      end; //end case
    end;
  end;
end;
Тут инфы более чем достаточно...