 |
Совершить прыжок - Общение разработчиков - Программирование для Perfect World, общение и обсуждене разработок |
31.12.2011, 02:28
|
#1
|
|
|
|
Разведчик
|
 Регистрация: 18.12.2011
 Сообщений: 1
 Популярность: 10
 Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
|
Совершить прыжок
Искал, но нигде не нашёл: каким пакетом (или вообще каким образом) можно заставить персонажа совершить прыжок?) В частности интересует перепрыгивание бордюров в некоторых местах 3й главы ХХ.
|
|
|
31.12.2011, 04:16
|
#2
|
|
|
|
Разведчик
|
 Регистрация: 07.02.2011
 Сообщений: 38
 Популярность: 143
 Сказал(а) спасибо: 5
Поблагодарили 20 раз(а) в 11 сообщениях
|
Re: Совершить прыжок
Я, конечно, не уверен, не заморачивался по этому поводу... но думаю, и КО со мной думаю согласится, JumpCall должен подойти для этой цели )) тока вот адреса в 4 утра мне искать влом)
|
|
|
31.12.2011, 14:24
|
#3
|
|
|
|
Старший сержант
|
 Регистрация: 12.06.2010
 Сообщений: 186
 Популярность: 1746
 Сказал(а) спасибо: 27
Поблагодарили 64 раз(а) в 59 сообщениях
|
Re: Совершить прыжок
пакет ? фууу, тут проще инжектом.. к примеру этим
________________
Почти забросил раздел Pw скажем спасибо TBX1n и Для просмотра ссылок или изображений в подписях, у Вас должно быть не менее 10 сообщение(ий). Сейчас у Вас 0 сообщение(ий).
Для просмотра ссылок или изображений в подписях, у Вас должно быть не менее 10 сообщение(ий). Сейчас у Вас 0 сообщение(ий).
|
Цитата: |
Для просмотра ссылок или изображений в подписях, у Вас должно быть не менее 10 сообщение(ий). Сейчас у Вас 0 сообщение(ий).
|
|
|
Для просмотра ссылок или изображений в подписях, у Вас должно быть не менее 10 сообщение(ий). Сейчас у Вас 0 сообщение(ий).
|
Сообщение от TBX1n |
Для просмотра ссылок или изображений в подписях, у Вас должно быть не менее 10 сообщение(ий). Сейчас у Вас 0 сообщение(ий).
|
|
|
Для просмотра ссылок или изображений в подписях, у Вас должно быть не менее 10 сообщение(ий). Сейчас у Вас 0 сообщение(ий).
|
|
|
|
|
|
|
Скука новый админ
|
|
Для просмотра ссылок или изображений в подписях, у Вас должно быть не менее 10 сообщение(ий). Сейчас у Вас 0 сообщение(ий).
|
|
Для просмотра ссылок или изображений в подписях, у Вас должно быть не менее 10 сообщение(ий). Сейчас у Вас 0 сообщение(ий).
|
|
Для просмотра ссылок или изображений в подписях, у Вас должно быть не менее 10 сообщение(ий). Сейчас у Вас 0 сообщение(ий).
|
|
|
09.01.2012, 18:23
|
#4
|
|
|
|
Разведчик
|
 Регистрация: 17.10.2011
 Сообщений: 5
 Популярность: 12
 Сказал(а) спасибо: 0
Поблагодарили 3 раз(а) в 3 сообщениях
|
Re: Совершить прыжок
Через пакеты и тем более через 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);
|
|
|
11.01.2012, 01:09
|
#5
|
|
|
|
Разведчик
|
 Регистрация: 09.06.2010
 Сообщений: 4
 Популярность: 119
 Сказал(а) спасибо: 0
Поблагодарили 1 раз в 1 сообщении
|
Re: Совершить прыжок
Мегазадрот, привет.
Я к сожалению не силен в С/С++, поэтому понять что происходит тут:
((fnJump)0x00459d60)(*(LPVOID *)(*(LPBYTE *)GAME_ADDRESS + 0x34), *Param);
хоть убей не могу.
Но могу сказать точно - такого массированного заталкивания в стек и записи в память как в JumpCall тут нет.
Вполне логично, что прыжок параметров не требует и передавать в "родную" процедуру нужно минимум инфы.
Можешь написать Delphi вариант твоего JumpCall'а?
|
|
|
12.01.2012, 00:17
|
#6
|
|
|
|
Разведчик
|
 Регистрация: 17.10.2011
 Сообщений: 5
 Популярность: 12
 Сказал(а) спасибо: 0
Поблагодарили 3 раз(а) в 3 сообщениях
|
Re: Совершить прыжок
Привет, Jump, на который ты указал, он похоже реализован на использовании структуры Action (по слухам: указатель на нее съехал на 0x1050). Хотя могу и ошибаться, никогда не интересовался этой структурой...
Я же использую совсем другую функцию, но в результате цепочки вызовов все сведется к использованию все того же Action. ........Как-то так.........
В делфи - не силен))) на ассемблере моя функция выглядит как-то так:
mov ecx,[GA];
mov ecx,[ecx + 0x34];
push Reserved;
call 0x00459d60;
ret
Первый параметр функции передается в ecx (thiscall патамучта)))), второй параметр внутри функции никак не используется поэнтому и назван Reserved.
Последний раз редактировалось Мегазадрот; 12.01.2012 в 01:17.
|
|
|
12.01.2012, 02:00
|
#7
|
|
|
|
Разведчик
|
 Регистрация: 09.06.2010
 Сообщений: 4
 Популярность: 119
 Сказал(а) спасибо: 0
Поблагодарили 1 раз в 1 сообщении
|
Re: Совершить прыжок
И снова огромное спасибо!
Вот такой прыжок:
Код:
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
Может быть стоит тут заменить его на этот вариант?
Последний раз редактировалось Docent2001; 12.01.2012 в 02:01.
Причина: не поставил CODE
|
|
|
21.01.2012, 12:25
|
#8
|
|
|
|
Сержант
|
 Регистрация: 11.12.2010
 Сообщений: 110
 Популярность: 541
 Сказал(а) спасибо: 5
Поблагодарили 66 раз(а) в 39 сообщениях
|
Re: Совершить прыжок
Ребята, что в этом коде неправильно? Описал в 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 описать не удаётся - пишет какой-то бред. Работаю в билдере
Проблему решил: __thiscall не поддерживается в C++ Builder. Подобные функции описать прототипами не удастся.
Последний раз редактировалось BritishColonist; 22.01.2012 в 11:12.
|
|
|
Ваши права в разделе
|
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения
HTML код Выкл.
|
|
|
Заявление об ответственности / Список мошенников
Часовой пояс GMT +4, время: 03:41.
|
 |