Показать сообщение отдельно
Старый 22.01.2011, 02:29   #6
Местный
 
Регистрация: 10.08.2010
Сообщений: 634
Сказал Спасибо: 22
Имеет 95 спасибок в 70 сообщенях
mira пока неопределено
По умолчанию

Цитата:
Сообщение от 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;
__________________
читернуть бы ништяг

Последний раз редактировалось mira, 22.01.2011 в 02:29. Причина: Добавлено сообщение
mira вне форума   Ответить с цитированием