Ну блин скоко воды а зачем ....... знает (сотрите)
Скрипт преследования таргета на растояни (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.
Пишут тут чтоб неоткрывать новую тему. Тем более это вопрос косвенно относится к перемешению.
Хочу сделать карту наподобии той, что у xkorа в боте. Т.е. есть карта в формате картинок 900*900. Собственно хотел посоветоваться как лучше реализовать.
Я себе это так представляю: по своим координатам высчитываешь активный квадрат. Делаешь bitmap, туда загружаешь его и три ближайших (т.е. четыре всего, так как чар может находится на границе квадратов). Потом копируешь нужную область себе на форму - все готово.
Вопрос такой: по какой формуле расчитать из координат активный квадрат и положение в нём? Если не секрет, поделитесь пожалуйста!
const
// размер одного блока карты:
blockSize=32768; // что равно сдвигу в лево на 15 бит
var
xbn,ybn,x,y,bx,by,xb,yb: integer;
begin
// зависимость номера блока от координат:
xbn:=(x div blockSize - x shr 31) + 20;
ybn:=(y div blockSize - y shr 31) + 18;
// расчет координат блока:
bx:=(x div blockSize - x shr 31) * blockSize;
by:=(y div blockSize - y shr 31) * blockSize;
// расчет координат внутри блока:
xb:=x - bx;
yb:=y - by;
end;
__________________
Я здесь практически не появляюсь!, Skype - ikskor
вы хоть раз пытались вытянуть экран через потолок в катах :) и шлёпнуть на землю там :) я часто так делаю и смотрю что происходит с пакетами чар начинает движение по х у а вот по Z сервер правит сам, но клиент отображает
бежим на крышу здания $01
d X: -88418
d Y: 141365
d Z: -3554
d OriginX: -87890
d OriginY: 142498
d OriginZ: -3647
от клиента последний пакет бега $48
d X: -88243
d Y: 141761
d Z: -3647
d Heading: 43873
d Data: 0
от сервера $48
h ObjectID: 0x48601D89
d CurX: -88246
d CurY: 141756
d CurZ: -3640
d DestX: -88221
d DestY: 141814
d DestZ: -3640
и в чём разница кто то видит клиент всегда не правельно видит координаты вероятно кривая геодата, но хз
Добавлено спустя 36 минут 28 секунд:
а и кстате тут закономерность есть сделал так взял пакет от клиента и местами поменял координаты ходьбы :)
в итоге получил что направление бега вперёт равно 16385 назад 49152 в сумме если в 16чную перевести FF FF +2 баг округления в большую корейцы :)
Добавлено спустя 6 часов 55 минут 46 секунд:
зы есть предположение что Z сервер нам шлёт сам куча непонятных пакетов осталось покрайней мере в моём пакет ини и идут же клиенту и клиент их обрабатывает наверное возможно и Z вычисляет :)
Добавлено спустя 55 минут 43 секунды:
ЗЫ тестил движение из клиента по пакетам, есть идея, но мне паляна нужна в гору пустая :) без мобов и народу нет чистоты эксперимента а скрипт писать влом :) закономерность походу есть геодата клиента расходится с сервером в любом случаее т.е. клиент походу сам коректирует место положение перса появляются просто от клиента промежуточные точки, а перс двигется дальше и что б вычислить Z в макете надо взять угол наклона между промежуточными точкми.
НО это моё наблюдения критика уместна :) 8)
function HeadingToDegree(Heading: integer): Extended;
begin
Result:=(heading - 32768) / (32768/pi)*(180 / pi);
if Result<=0 then Result:=Result+360;
end;
Ну или если упростить:
function HeadingToDegree(Heading: integer): Extended;
begin
Result:=((heading - 32768) / 32768)*180;
if Result<=0 then Result:=Result+360;
end;
Последний раз редактировалось NLObP, 09.08.2009 в 19:20.