|
You last visited: Today at 15:42
Advertisement
Rus. server
Discussion on Rus. server within the Perfect World forum part of the MMORPGs category.
01/20/2010, 01:10
|
#1306
|
elite*gold: 0
Join Date: Jan 2009
Posts: 69
Received Thanks: 13
|
Скачал архив с форума, запустил бота из архива, задал мобов, нажал кнопочку Старт и бот успешно убил ещё штук 7 росянок... Интересно, у кого-то кроме меня самого, то что я сотворил, вообще заработало? ) Может мне снится? )
Вообще я мало разбираюсь в инжектах, но тут на форуме как минимум ещё у 2 человек инжекты из автоита работали.
|
|
|
01/20/2010, 01:23
|
#1307
|
elite*gold: 0
Join Date: Oct 2009
Posts: 5
Received Thanks: 0
|
Quote:
Originally Posted by FunkU
Хм... У меня мой бот на автоите и работает нормально. Я ж написал, что проверил. Росянок 7 бот убил. ) А какая у тебя система?
|
xp sp2, и скорее всего то что ты написал ток у тебя и работает)
|
|
|
01/20/2010, 01:31
|
#1308
|
elite*gold: 0
Join Date: Jan 2009
Posts: 69
Received Thanks: 13
|
Я не писал, а модифицировал. ) Проверил на своём ноуте бота - тоже работает. Система везде XP SP3, но сборки разные. Могу на Висте ещё проверить попозже... Мне интересно, а какие ещё программы на автоите с инжектами ты пытался запускать?
|
|
|
01/20/2010, 01:43
|
#1309
|
elite*gold: 0
Join Date: Oct 2009
Posts: 5
Received Thanks: 0
|
Quote:
Originally Posted by FunkU
Я не писал, а модифицировал. )
|
Я не имел ввиду весь mhs а только часть кода.
|
|
|
01/20/2010, 02:12
|
#1310
|
elite*gold: 0
Join Date: Nov 2009
Posts: 69
Received Thanks: 5
|
смени
MOV_EDI(Dec($TID))
PUSH_EDI()
на
PUSH(Dec($TID))
еще может быть причина вылета
mhs тупо пытается выделить моба по ид независимо от того есть он на месте или нет и если моб в таргете значит присутствует и можно его килл
сначала надо проверить наличие моба а потом уж таргет делать
|
|
|
01/20/2010, 02:32
|
#1311
|
elite*gold: 0
Join Date: Jan 2009
Posts: 69
Received Thanks: 13
|
Novohyd
Да, это понятно. Мой собственный бот проверяет наличие моба. А в MHS это вставить довольно трудоёмко будет. Я просто хотел сделать рабочий на новой версии MHS. ) Но пока он работает только у меня. Кстати ты же вроде сделал рабочий инжект на автоите, да? Он тоже только у тебя работает?
|
|
|
01/20/2010, 06:32
|
#1312
|
elite*gold: 0
Join Date: Jul 2008
Posts: 43
Received Thanks: 16
|
По карте. Если кто хочет ту картинку целиком сразу грузить - лучше забудьте про эту великолепную идею. ![Smile](images/smilies/smile.gif)
Я тут посчитал. Её размеры в jpg - около 10 Мб. Но в памяти же она развернётся в обычный BitMap, давайте прикинем размер его. ![Smile](images/smilies/smile.gif)
Разрешение картинки: 8192х9215 - итого 75 489 280 пикселей. На каждый пиксель 3 байта, а скорее всего 4 из-за выравнивания. Итого 300 Мб памяти на то чтобы загрузить данную картинку в память. ![Smile](images/smilies/smile.gif)
Можно конечно её сильно уменьшить, но тогда расположение бота можно угадать лишь ОЧЕНЬ приблизительно.
На мой взгляд - лучше уж грузить частями карту, так же как это реализованно в самом клиенте. Там одновременно максимум 4 куска может быть.
|
|
|
01/20/2010, 07:29
|
#1313
|
elite*gold: 0
Join Date: Nov 2009
Posts: 69
Received Thanks: 5
|
Quote:
Originally Posted by FunkU
Novohyd
Да, это понятно. Мой собственный бот проверяет наличие моба. А в MHS это вставить довольно трудоёмко будет. Я просто хотел сделать рабочий на новой версии MHS. ) Но пока он работает только у меня. Кстати ты же вроде сделал рабочий инжект на автоите, да? Он тоже только у тебя работает?
|
Инжект тот-же. только вместо записи ид в регистр и push регистр у меня сразу push ид
вот функция выбирающая первого по порядку присутствующего моба из MHS-ного конфиг-файла. выдергивал целиком так что может малость подправить придется
возвращает i найденного моба.
|
|
|
01/20/2010, 08:45
|
#1314
|
elite*gold: 0
Join Date: Apr 2009
Posts: 237
Received Thanks: 403
|
Alexhomp
совсем забыл добавить: попытки поиска адреса .. ни к чему не приведут...
Поправка:
[BA] + $1C + $8 + $60 + $4 + $0 :: Current location (char)
|
|
|
01/20/2010, 08:51
|
#1315
|
elite*gold: 0
Join Date: Jan 2009
Posts: 69
Received Thanks: 13
|
Novohyd
Попробовал заменить, как ты сказал и дать человеку, у которого бот не работал и он всё равно не заработал. Может это связано с разными версиями каких-то библиотек?
|
|
|
01/20/2010, 09:43
|
#1316
|
elite*gold: 0
Join Date: Nov 2009
Posts: 69
Received Thanks: 5
|
я давал этого бота по знакомым - работает совершенно без сбоев
|
|
|
01/20/2010, 10:49
|
#1317
|
elite*gold: 0
Join Date: Nov 2009
Posts: 8
Received Thanks: 0
|
Quote:
Originally Posted by dwar
Alexhomp
совсем забыл добавить: попытки поиска адреса и смещений для получения текстового значения названия текущей локации, ни к чему не приведут, т.к. данная строка носит чисто информативных характер, и формируется при прорисовки интерфейса. Можно, конечно же, дальше влезть в код и найти процедуру, отвечающую за это, но, есть ли смысл?
|
Спасибо что навёл на нужную дорогу. Буду учить asm)))
Хотя можно еще попробовать поискать ID территории. Надеюсь получится)))
|
|
|
01/20/2010, 17:09
|
#1318
|
elite*gold: 0
Join Date: Jan 2009
Posts: 137
Received Thanks: 19
|
Давненько я что-то тут не был )))
Тут по рюкзаку спрашивали... Код из моей тулзы. Состояние 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
|
#1319
|
elite*gold: 0
Join Date: Mar 2009
Posts: 1
Received Thanks: 0
|
Народ, кто нибудь в курсе, есть ли возможность видеть точное кол-во хп у боссов, допустим в хх? Если есть, то как это возможно сделать?
|
|
|
01/21/2010, 18:42
|
#1320
|
elite*gold: 0
Join Date: Jan 2009
Posts: 137
Received Thanks: 19
|
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;
Тут инфы более чем достаточно...
|
|
|
All times are GMT +2. The time now is 15:42.
|
|