PDA

Просмотр полной версии : Совершить прыжок


сhersаnyа
31.12.2011, 01:28
Искал, но нигде не нашёл: каким пакетом (или вообще каким образом) можно заставить персонажа совершить прыжок?) В частности интересует перепрыгивание бордюров в некоторых местах 3й главы ХХ.

HellD
31.12.2011, 03:16
Я, конечно, не уверен, не заморачивался по этому поводу... но думаю, и КО со мной думаю согласится, JumpCall ([Ссылки могут видеть только зарегистрированные и активированные пользователи]) должен подойти для этой цели )) тока вот адреса в 4 утра мне искать влом)

Skuka.95
31.12.2011, 13:24
каким пакетом
пакет ? фууу, тут проще инжектом.. к примеру этим
JumpCall

Мегазадрот
09.01.2012, 17:23
Через пакеты и тем более через GUI лучше прыжок/движение не делать. Лучше всего вызвать фукцию самого клиента расположенную по адресу 0x00459d60. Вот как это делается у меня.




//То, что выполняется в памяти процесса клиента игры.

typedef void (__thiscall * fnJump)(LPVOID Char, DWORD Reserved);

VOID JumpInject(DWORD * Param)
{
((fnJump)0x00459d60)(*(LPVOID *)(*(LPBYTE *)GAME_ADDRESS + 0x34), *Param);
}

//То, что я вызываю у себя в боте что бы чар прыгнул.

BOOL CCharBot::Jump(DWORD Reserved)
{
return Inject(JumpInject, 2048, NULL, &Reserved, sizeof(Reserved));
}


Функция Inject имеет следующий прототип:

BOOL CCharBot::Inject(LPCVOID CodePointer, SIZE_T CodeSize, LPDWORD ExitCodePointer, LPCVOID DataPointer, SIZE_T DataSize);

Docent2001
11.01.2012, 00:09
Мегазадрот, привет.

Я к сожалению не силен в С/С++, поэтому понять что происходит тут:
((fnJump)0x00459d60)(*(LPVOID *)(*(LPBYTE *)GAME_ADDRESS + 0x34), *Param);
хоть убей не могу.

Но могу сказать точно - такого массированного заталкивания в стек и записи в память как в JumpCall тут ([Ссылки могут видеть только зарегистрированные и активированные пользователи]) нет.

Вполне логично, что прыжок параметров не требует и передавать в "родную" процедуру нужно минимум инфы.

Можешь написать Delphi вариант твоего JumpCall'а?

Мегазадрот
11.01.2012, 23:17
Привет, Jump, на который ты указал, он похоже реализован на использовании структуры Action (по слухам: указатель на нее съехал на 0x1050). Хотя могу и ошибаться, никогда не интересовался этой структурой...

Я же использую совсем другую функцию, но в результате цепочки вызовов все сведется к использованию все того же Action. ........Как-то так.........

В делфи - не силен))) на ассемблере моя функция выглядит как-то так:

mov ecx,[GA];
mov ecx,[ecx + 0x34];
push Reserved;
call 0x00459d60;
ret

Первый параметр функции передается в ecx (thiscall патамучта)))), второй параметр внутри функции никак не используется поэнтому и назван Reserved.

Docent2001
12.01.2012, 01:00
И снова огромное спасибо!

Вот такой прыжок:

procedure JumpCall(); stdcall;
var CallAddress:pointer;
begin
CallAddress:=Pointer($459В60);
asm
pushad
mov ecx, dword ptr [GameAddress]
mov ecx, dword ptr [ecx+$34]
push $FFFFFFFF
call CallAddress
popad
end;
end;

Работает отлично. Гораздо проще описанного Dinmaite

Может быть стоит тут ([Ссылки могут видеть только зарегистрированные и активированные пользователи]) заменить его на этот вариант?

BritishColonist
21.01.2012, 11:25
Ребята, что в этом коде неправильно? Описал в DLL прототип и вызываю:

void (__cdecl* fnJump)(DWORD playerStruct,DWORD reserved);

...

void InitClientFunctions() // это вызывается после создания CPlayer
{
fnJump = (void(__cdecl*)(DWORD,DWORD))0x00459D60;
}


class CPlayer
{
public:
...

void LoadStruct();
void Jump();
};

void CPlayer::LoadStruct() // получение PlayerStruct
{
while (!*(BYTE*)OnlineFlag) {
Sleep(100);
}

__asm {
mov eax,dword ptr ds:[BA]
mov eax,dword ptr ds:[eax+0x1C]
mov eax,dword ptr ds:[eax+0x34]
mov PlayerStruct,eax
}
}

void CPlayer::Jump()
{
fnJump(PlayerStruct,-1); // собственно вызов функции
}

При вызове функции просто происходит вылет - предложение вЕнды отправить отчёт.

P.S. Как __thiscall описать не удаётся - пишет какой-то бред. Работаю в билдере :D



Проблему решил: __thiscall не поддерживается в C++ Builder. Подобные функции описать прототипами не удастся.