Цитата:
Сообщение от xkor
mira, ты наверно не учитываешь что скорость это не только параметр speed из пакета с описание чара или нпц, speed надо ещё умножить на speedmultipler из того же пакета)
|
ясен пень что спид у меня это спид из пакета умноженый на мультиплер)
Добавлено через 21 минуту
Цитата:
Сообщение от supernewbie
ах да, точна..
vx=(dx / (dist / speed)) / 1000
|
щас попробую этот метод расчета
Добавлено через 17 минут
болт. тоже самое тока + еще твинк мечетса
щас у меня так:
Код:
procedure L2GetNewPos(pobj:PL2CreatureData;var v: TL2Vector);
var
sdiff:SINGLE;
ticks:DWORD;
begin
ticks:=GetTickCount; // текущее время
// если текущее время больше время заврежения бега то считаем
// что мы дошли и возвращаем конечную координату
if pobj.endmovetime<=ticks then begin
pobj.inMovef:=false;
v:=pobj.endpoint;
exit;
end;
//вычисляем коэффицент из того время что отведено и того что прошло
sdiff:=abs((pobj.endmovetime-ticks)/pobj.movetime);
//на всяк смотрим чтоб оно не вышло за пределы
if sdiff>1.0 then sdiff:=1.0;
//вычисляем координату интерполируя конечную и начальную точки
L2VectorInterpolate(pobj.startpos,pobj.endpoint,sdiff,v);
end;
Добавлено через 7 часов 4 минуты
Код:
procedure L2VectorInterpolate(const v1,v2: TL2Vector; v:single; var vout:TL2Vector);
begin
vout.x:=trunc((v*(v1.x-v2.x)) + v2.x);
vout.y:=trunc((v*(v1.y-v2.y)) + v2.y);
vout.z:=trunc((v*(v1.z-v2.z)) + v2.z);
end;
Добавлено через 22 минуты
следование
Код:
function TL2Controller.fsTraceObjectNew(var v: variant): variant;
var
v1,v2:TL2Vector;
targetID : integer;
dist:integer;
tvnew : TL2Vector;
tmypoint : TD3DVector;
x2,y2,z2:integer;
mX,mY,mZ:integer;
sina,cosa : single;
mdist : integer;
begin
result:=boolean(false);
if WaitForSingleObject(TL2C.hevent,200)<>WAIT_TIMEOUT then exit;
if assigned(nhandler.mychar)then if nhandler.mychar.isDead then exit;
if isInBadEffect then exit;
if nhandler.mychar=nil then begin
//IDirect3DDevice9H(idev_).StrWrite('current char not accessible');
exit;
end;
targetID:=v[0];
if targetID=0 then begin
IDirect3DDevice9H(idev_).StrWrite('Empty trace target',$FF5555);
exit;
end;
if not nhandler.GetObjectPos(v1,targetID)then begin
IDirect3DDevice9H(idev_).StrWrite('trace target not accessible',$FF5555);
exit;
end;
if L2IsInMove(nhandler.mychar)and not(boolean(v[1])) then begin
v1.z:=0;
if L2VectorDist(v1,PrevTraceCoord)<50 then exit; // NEWKE
//nhandler.unlock; // none pos update
//exit;
end;
if not nhandler.GetObjectPos(v2,nhandler.GetMyID)then begin
IDirect3DDevice9H(idev_).StrWrite('mychar not accessible',$FF5555);
exit;
end;
x2:=(v1.x-v2.x);
y2:=(v1.y-v2.y);
Z2:=(v1.Z-v2.Z);
mX:=1;mY:=1;mZ:=1;
if (x2<0) then begin mX:=-1; x2:=x2*(-1);end;
if (y2<0) then begin mY:=-1; y2:=y2*(-1);end;
if (z2<0) then begin mZ:=-1; z2:=z2*(-1);end;
dist:=trunc(L2VectorDist(v1,v2));
if dist<v[2] then begin // distantion is small
exit;
end;
cosa:=(x2)/dist;
sina:=(y2)/dist;
mdist:= dist-100;
//if dist<100 then mdist:=1;
tvnew.x:=trunc(mdist*cosa);
tvnew.y:=trunc(mdist*sina);
tvnew.x:=v2.x+(tvnew.x * mX);
tvnew.y:=v2.y+(tvnew.y * mY);
tvnew.z:=v2.z;
//tvnew.x:=tvnew.x+(Random(20)-10);
// tvnew.y:=tvnew.y+(Random(20)-10);
dist:=trunc(L2VectorDist(v1,tvnew));
if dist<100 then exit;
nhandler.MoveBackwardToLocation(tvnew.x,tvnew.y,tvnew.z);
PrevTraceCoord.x:=v1.x;
PrevTraceCoord.y:=v1.y;
PrevTraceCoord.z:=0;
//IDirect3DDevice9H(idev_).StrWrite('trace by dist : '+inttostr(dist));
result:=boolean(true);
end;