procedure Walk(aHandle:dword;x,y,z:single;WalkMode:dword);
var aParams: TParams;
begin
aParams.Param1:=WalkMode;
aParams.x:=x;
aParams.y:=y;
aParams.z:=z;
InjectFunc(aHandle,@WalkCall,@aParams,SizeOf(aPara ms));
end;
Вызываю так (перс взлетает на высоту +20, должен быть на крыльях).
Может кому и пригодится.
procedure PristWalkUp;
var x,y,z:single;
bc,temp:dword;
begin
readprocessmemory(hProcess1,ptr(game_add),@temp,si zeof(temp),bc);
readprocessmemory(hProcess1,ptr(temp+OfPersPtr),@t emp,sizeof(temp),bc);
readprocessmemory(hProcess1,ptr(temp+OfPersX),@x,s izeof(x),bc);
form1.sEdit1.Text:=formatfloat('0.0000',x);
readprocessmemory(hProcess1,ptr(temp+OfPersY),@y,s izeof(y),bc);
form1.sEdit2.Text:=formatfloat('0.0000',y);
readprocessmemory(hProcess1,ptr(temp+OfPersZ),@z,s izeof(z),bc);
form1.sEdit3.Text:=formatfloat('0.0000',z);
walk(hProcess1,x,y,z+20,1);
end;
Meg(0)
24.05.2012, 17:11
почему персонаж делает вид,что бежит,но остаётся на своём месте??procedure WalkCall(aPParams:PParams);Stdcall;
var CallAddress1,CallAddress2,CallAddress3:Pointer;
x,y,z:single;
flying:DWORD;
begin
CallAddress1:=Pointer($00494620);
CallAddress2:=Pointer($00498290);
CallAddress3:=Pointer($00494EC0);
x:=aPParams^.x;
y:=aPParams^.y;
z:=aPParams^.z;
flying:=aPParams^.Param1;
asm
pushad
mov eax, dword ptr [PW_GAMERUN_ADDR]
mov esi, dword ptr [eax+$34]
mov ecx, dword ptr [esi+$10BC]
push 1
call CallAddress1
mov edi, eax
lea eax, dword ptr [esp+$18]
push eax
push flying
mov ecx, edi
call CallAddress2
mov ecx, dword ptr [esi+$10BC]
push 0
push 1
push edi
push 1
call CallAddress3
mov eax, dword ptr [PW_GAMERUN_ADDR]
mov eax, dword ptr [eax+$34]
mov eax, dword ptr [eax+$10BC]
mov eax, dword ptr [eax+$30]
mov ecx, dword ptr [eax+$4]
mov eax, x
mov dword ptr[ecx+$20], eax
mov eax, z
mov dword ptr[ecx+$24], eax
mov eax, y
mov dword ptr[ecx+$28], eax
popad
end;
end;
у меня ж в коде просто передвижение к координатам вписаным,хоть в полёте хоть на земле,он имитирует полёт или бег,но остаётся на своём прежнем месте
vogel
24.05.2012, 22:39
Имитировать полёт нельзя - это не оргазм. Нужно чётко передавать флаг - на крыльях/под водой перс или стоит на земле.
Это важно, потому что в воде/в воздухе движение по Z - свободно, при движении по земле, клиент сам "прибивает" твою Z координату к нужному уровню высоты, соответственно передав своё Z в этм случае движения не будет.
Добавлено через 2 минуты
lea eax, dword ptr [esp+$18]
Не удивляйтесь потом, если у вас клиент будет внезапно выбивать...
Почему будет выбивать - спросите у гугла зачем используется регистр esp. =)))
Meg(0)
24.05.2012, 23:00
он как раз ИМИТИРУЕТ бежит просто на месте или летит на месте...
vogel
24.05.2012, 23:14
Ещё раз ВНИМАТЕЛЬНО прочитай мой пост - там написано почему такое происходит.
Meg(0)
24.05.2012, 23:28
я убрал Z всёравно тоже самое происходит
vogel
25.05.2012, 02:31
Какое слово в фразе "Нужно чётко передавать флаг - на крыльях/под водой перс или стоит на земле" тебе не понятно ?
krysun
25.05.2012, 03:20
При вызове walk(hProcess1,x,y,z+20,1);
1 - Лететь (если на крыльях)
0 - Плыть, бежать (если стоит на ногах, или в воде)
Kitsune
25.05.2012, 09:54
Какое слово в фразе "Нужно чётко передавать флаг - на крыльях/под водой перс или стоит на земле" тебе не понятно ?
Там все предложение непонятное /dgs
P.S. Они ведь читать не умеют, то что хочешь донести надо выделять очень жирным шрифтом и подсвечивать обязательно, и то не факт, что заметят /dgs
Meg(0)
25.05.2012, 23:36
krysun, я поставил "1" и он у меня и в полёте и на земле работает))