Скрипт преследования таргета на растояни (H)
//////////////ОlegDX by USES.txt//////////////////////////////////////////////////////
Код:
//*****************************************************************
Procedure MoveXYZ(X1,Y1,Z1,X2,Y2,Z2:Integer);
Begin
IF (X1=X2)and(Y1=Y2)and(Z1=Z2) Then Exit;
buf:=#$01;
WriteD(X1);WriteD(Y1);WriteD(Z1);
WriteD(X2);WriteD(Y2);WriteD(Z2);
WriteD(01);
SendToServer
End;
//******************************************************************************
// /---|H|---\
// [ >>>|1|_______________|3|___________|2|>> ]
Function GetMoveXYZ(X1,Y1,Z1,X2,Y2,Z2,H:Integer; var X,Y,Z:Integer):Boolean;
var AB:Double;
Begin
Result:=False;
AB:=Sqrt(sqr(X2-X1)+sqr(Y2-Y1)+sqr(Z2-Z1));
IF abs(AB)<=H THEN EXIT;
X:=X2-round(((X2-X1)*H)/AB);
Y:=Y2-round(((Y2-Y1)*H)/AB);
Z:=Z2-round(((Z2-Z1)*H)/AB);
Result:=True;
End;
//******************************************************************************
Код:
///////////////////////////////////////////////////////////////////////////////////////////
Uses '.\Scripts\OlegDX by USES.txt';
Const ID=0;Xnow=1;Ynow=2;Znow=3;Xold=4;Yold=5;Zold=6;
var TargetID: Integer;
MyObject: array[0..7] of Integer; //ID,X,Y,Z,Xd,Yd,Zd
MyTarget: array[0..7] of Integer; //ID,X,Y,Z,Xd,Yd,Zd
//*** Вызывается при включении скрипта *****************************************
procedure Init;
begin
MyObject[ID]:=0;
MyTarget[ID]:=0;
end;
//*** Вызывается при выключении скрипта ****************************************
procedure Free;
begin
//
end;
//*** Oсновная часть скрипта вызывается при приходе каждого пакета *************
Var PosIndex,ObjectID,X,Y,Z,W:Integer;
MesageStrg:String;
MesageType:Integer;
begin
if FromServer Then Begin
case pck[1] of
#$03:Begin //CharInfo
PosIndex:=2;
X:=ReadD(PosIndex);
Y:=ReadD(PosIndex);
Z:=ReadD(PosIndex);
W:=ReadD(PosIndex);
ObjectID:=ReadD(PosIndex);
If ObjectID = MyTarget[ID] Then Begin
SendMSGClient('CharInfo MyTarget');
MyTarget[Xold]:=X; MyTarget[Xnow]:=MyTarget[Xold];
MyTarget[Yold]:=Y; MyTarget[Xnow]:=MyTarget[Yold];
MyTarget[Zold]:=Z; MyTarget[Xnow]:=MyTarget[Zold];
MyTarget[ ID]:=ObjectID;
End;
End;
#$04:Begin //UsrInfo
SendMSGClient('UsrInfo');
PosIndex:=2;
MyObject[Xold]:=ReadD(PosIndex); MyObject[Xnow]:=MyObject[Xold];
MyObject[Yold]:=ReadD(PosIndex); MyObject[Xnow]:=MyObject[Yold];
MyObject[Zold]:=ReadD(PosIndex); MyObject[Xnow]:=MyObject[Zold];
W:=ReadD(PosIndex);
MyObject[ ID]:=ReadD(PosIndex);
End;
#$01:Begin //MoveToLocation
PosIndex:=2; ObjectID:=ReadD(PosIndex);
If ObjectID = MyObject[ID] Then Begin
//SendMSGClient('MoveToLocation MyObject');
MyObject[ ID]:=ObjectID;
MyObject[Xnow]:=ReadD(PosIndex);
MyObject[Ynow]:=ReadD(PosIndex);
MyObject[Znow]:=ReadD(PosIndex);
MyObject[Xold]:=ReadD(PosIndex);
MyObject[Yold]:=ReadD(PosIndex);
MyObject[Zold]:=ReadD(PosIndex);
End Else
If ObjectID = MyTarget[ID] Then Begin
SendMSGClient('MoveToLocation MyTarget');
MyTarget[ ID]:=ObjectID;
MyTarget[Xnow]:=ReadD(PosIndex);
MyTarget[Ynow]:=ReadD(PosIndex);
MyTarget[Znow]:=ReadD(PosIndex);
MyTarget[Xold]:=ReadD(PosIndex);
MyTarget[Yold]:=ReadD(PosIndex);
MyTarget[Zold]:=ReadD(PosIndex);
IF (MyObject[ID]<>0)and GetMoveXYZ(
//MyTarget[Xold],MyTarget[Yold],MyTarget[Zold],
MyObject[Xnow],MyObject[Ynow],MyObject[Znow],
MyTarget[Xnow],MyTarget[Ynow],MyTarget[Znow],130,
MyObject[Xnow],MyObject[Ynow],MyObject[Znow])
THEN Begin
SendMSGClient('GetMoveXYZ MyTarget');
MoveXYZ(MyObject[Xnow],MyObject[Ynow],MyObject[Znow],
MyObject[Xold],MyObject[Yold],MyObject[Zold]);
END;
End Else;
End;
end;
End Else
IF FromClient Then begin
Case pck[1] of
//-------------------------------------------------------------------------
#$04: TargetID:=ReadD(02);
//-------------------------------------------------------------------------
#$38:Begin
PosIndex:=02;
MesageStrg:=ReadS(PosIndex);
MesageType:=ReadD(PosIndex);
Case MesageType of
0:Begin //Обычный чат
End;
1:Begin //Крик чат
End;
8:Begin //торговый чат
End;
3:Begin //Пати чат
If (Length(MesageStrg)=1) and ((MesageStrg[1]='L')or(MesageStrg[1]='l')) Then begin
pck:='';
MyTarget[ID]:=TargetID;
End Else
If (Length(MesageStrg)=1) and ((MesageStrg[1]='M')or(MesageStrg[1]='m')) Then begin
pck:='';
MyTarget[ID]:=0;
End Else
End;
Else End;
End;
//-------------------------------------------------------------------------
end;
//-------------------------------------------------------------------------
End Else;
end.
И не нужно раздувать из ничего тему :(