PDA

Просмотр полной версии : Перемещение чара


Cucumber
21.10.2007, 17:19
Как происходит перемещение персонажа в игре? Как я понял нам потребуется 4 пакета(UserInfo(0x04),MoveBackwardToLocation(0x01) ,MoveToLocation(0x01),ValidatePosition(0x48)) чтобы двигаться.
1) из UserInfo(0x04) берем x,y,id,RunSpeed,MovementSpeedMultiplier.
2) Если хотим сдвинутся то посылаем MoveBackwardToLocation, где первые x, y, z куда хотим и вторые откуда. Сразу непонятно откуда берется z так как клиент явно не берет эту координату из UserInfo, а посылает какуюто свою. Да и как угадывать z точки в которую хотим попасть?
3)Если мы отправили MoveBackwardToLocation то нам должен придти MoveToLocation. Если там наш id то запоминаем первые x, y, z (куда идем) и вторые (откуда).
4)Теперь зная откуда и куда нам надо идти начинаем отсылать ValidatePosition. 1-ый такой пакет отсылаем сразу как только получили MoveToLocation, а остальные с некоторым интервалом(1200ms, хмм он постоянный для каждого сервера?). Зная скорость(round(int(RunSpeed*MovementSpeedMultiplie r))) и время(1.2s) можем расчитывать x,y где мы будем. Сново непонятно откуда брать z, Heading, Data. Как только добежали до нужной нам точки отсылаем последние наши координаты и запоминаем их чтобы при следующем перемещении отослать их.

dmitry501
21.10.2007, 20:07
В С4 на ValidatePosition вроде приходит ответ, а вот начинач с С5 нет. Поэтому и боты дергаются.... Как правильно реализовать алгоритм в С4 и в С5 я не знаю :(
Когда то на форуме АЧ был разговор на эту тему Saurona c Zyb-ом, но под модераторским хайдом :) никто не видел, чем он там кончился....
Речь как раз шла об алгоритмах перемещения. А вопрос очень интересный, в плане разработки своего бота.
Может xkor и исследовал этот вопрос? И знает алгоритмы из С4 и С5? В своем боте он же как-то перемещается?

xkor
21.10.2007, 20:57
Может xkor и исследовал этот вопрос? И знает алгоритмы из С4 и С5? В своем боте он же как-то перемещается?
в моём боте алгоритм простой: скорость*время=путь
но вот проблемка что при такой формуле все отстают %), константу на которую надо умножать чтоб неотставали пока неподбирал...

Cucumber
21.10.2007, 21:26
xkor, а откуда брал эти параметры: z, Heading, Data?

dmitry501
21.10.2007, 22:10
Может xkor и исследовал этот вопрос? И знает алгоритмы из С4 и С5? В своем боте он же как-то перемещается?
в моём боте алгоритм простой: скорость*время=путь
но вот проблемка что при такой формуле все отстают %), константу на которую надо умножать чтоб неотставали пока неподбирал...
Про формулу пути я помню. В школе проходил :)
Я имею ввиду практически как происходит? Последовательность пакетов? И различия между С4 и С5.

xkor
21.10.2007, 23:59
xkor, а откуда брал эти параметры: z, Heading, Data?
z из параметров чара которые либо приходили от серва либо немного изменялись при хотьбе в боте
Heading от тудаже
Data хз что такое и в каком пакете ты нашел...
Я имею ввиду практически как происходит? Последовательность пакетов? И различия между С4 и С5.
последовательность как в первом посте а С5 я несмотрел...

Cucumber
23.10.2007, 12:52
А как посчитать Heading? Что-то мои расчеты никак не совпадут с клиентскими. Наверно там надо както хитро округлять.

dmitry501
23.10.2007, 15:46
что такое heading?
и как ты его считаешь?

Cucumber
23.10.2007, 19:58
На скока я понял heading это угол поворота персонажа в игре, а расчитывал по полярным координатам.
http://ru.wikipedia.org/wiki/%D0%9F%D0% ... 0%B0%D1%82 (http://ru.wikipedia.org/wiki/%D0%9F%D0%BE%D0%BB%D1%8F%D1%80%D0%BD%D0%B0%D1%8F_% D1%81%D0%B8%D1%81%D1%82%D0%B5%D0%BC%D0%B0_%D0%BA%D 0%BE%D0%BE%D1%80%D0%B4%D0%B8%D0%BD%D0%B0%D1%82)
Вот тока нафига серверу этот угол... При большом желании он и сам его вычислит :)

xkor
24.10.2007, 00:35
А как посчитать Heading? Что-то мои расчеты никак не совпадут с клиентскими. Наверно там надо както хитро округлять.
я его никак несчитал)))

Cucumber
24.10.2007, 00:53
xkor, а при движении в пакет ValidatePosition(0x48) что кладешь? Там вроде требуется...

xkor
24.10.2007, 11:39
xkor, а при движении в пакет ValidatePosition(0x48) что кладешь? Там вроде требуется...
старый h туда пихаю который от серва приходил)

Cucumber
24.10.2007, 17:31
Получается что у тебя чар может двигаться в одну сторону, а смотреть в другую. Типо приставные шаги или бег спиной вперед :)
Вообще наверно серверу пофиг на этот параметр, но с точки зрения палевности он может сыграть свою роль.

05.11.2007, 03:57
Получается что у тебя чар может двигаться в одну сторону, а смотреть в другую. Типо приставные шаги или бег спиной вперед :)
собственно он и у клиента так может без проблем, в ц1 я вовсю отплясывал майкла джексона - достаточно было сделать любой socialaction во время следования за другим чаром, потом пофиксили, но опять же только на стороне клиента.
Вообще наверно серверу пофиг на этот параметр, но с точки зрения палевности он может сыграть свою роль.
и серверу пох, и админам пох, всем пох.
используется только во время просчёта абилок и т.п. (ведь по тебе можно ударить и когда ты бежишь, верно?)
Насчёт координаты Z - вообще приходит от серва, он просчитывает соприкосновения той плоскости, на которой ты стоишь с соседнями, паффайндинг. Можно задать свою, только это уже действительно палевно, но в ц3.5 так можно было летать с 1 на 13 волкером в ТОЙ сквозь потолок....клиент тоже так умел, но только вниз xDDD
(вы думали почему клиент падал ? он посылал серваку что идёт на первый этаж просто)

Cucumber
05.11.2007, 15:06
и серверу пох, и админам пох, всем пох.
используется только во время просчёта абилок и т.п. (ведь по тебе можно ударить и когда ты бежишь, верно?)
ну так сервер наверно сам просчитывает куда ты смотришь, а не использует то что ты ему пришлешь.
Насчёт координаты Z - вообще приходит от серва, он просчитывает соприкосновения той плоскости, на которой ты стоишь с соседнями, паффайндинг. Можно задать свою, только это уже действительно палевно, но в ц3.5 так можно было летать с 1 на 13 волкером в ТОЙ сквозь потолок....клиент тоже так умел, но только вниз xDDD
После входа в игру клиент берет тока x,y сервера, а z генерирует свою...

06.11.2007, 22:54
ну так сервер наверно сам просчитывает куда ты смотришь, а не использует то что ты ему пришлешь.
По умолчанию все смотрят на восток (вроде).
Далее уже зависит от обстоятельств. Кстати клиент как правило не верно отображает угол поворота чаров.


После входа в игру клиент берет тока x,y сервера, а z генерирует свою...
После захода да. А ты нажми потом куданибудь.

Cucumber
07.11.2007, 00:45
Далее уже зависит от обстоятельств. Кстати клиент как правило не верно отображает угол поворота чаров. С чего это ты взял что клиент не верно отображает угол поворота?
После захода да. А ты нажми потом куданибудь. Так если я бот то мне надо самому придумать координату z. Причем для точки в которой стою можно взять z с сервера, а вот для точки в которую шлепать надо придумать.

07.11.2007, 21:46
С чего это ты взял что клиент не верно отображает угол поворота?
Да вроде это уже давно всем известно о.О
проверь если хочешь))
Так то он более менее сносно показывает, но если мясо какоенить - как правило криво.

Так если я бот то мне надо самому придумать координату z. Причем для точки в которой стою можно взять z с сервера, а вот для точки в которую шлепать надо придумать.
Нет, бот не отсылает Z серверу вообще, т.к. у него нет геодаты. Z обрабатывает сервер и потом тебе присылает. Клиент тоже не всегда отсылвает свою, возможно клиент вообще отсылает свою только при особых условиях - виверна, вода. Кстати именно по этой причине ботом не спустится в каты а клиент так забавно летал с 11 на 1 этаж в ц3.5

07.11.2007, 21:48
Вспомнился кстати хелпер - единственный бот с геодатой. Он строил миникарту "налету" из файлов геодаты клиента.

Cucumber
07.11.2007, 22:43
Z обрабатывает сервер и потом тебе присылает.Первая z за табой, а потом уже сервер пришлет истинную z.
Клиент тоже не всегда отсылвает свою, возможно клиент вообще отсылает свою только при особых условиях - виверна, вода. А помоему шлет ее как милинький, z входит в состав пакета и отсылать ее надо.

xkor
08.11.2007, 00:40
Вспомнился кстати хелпер - единственный бот с геодатой. Он строил миникарту "налету" из файлов геодаты клиента.
у него вообщето геодаты небыло и строил он чернобелую плоскую миникарту...

08.11.2007, 01:32
Первая z за табой, а потом уже сервер пришлет истинную z.
А помоему шлет ее как милинький, z входит в состав пакета и отсылать ее надо.
а ты отлови да посмотри ЧТО он шлёт xDDD

у него вообщето геодаты небыло и строил он чернобелую плоскую миникарту...
Ты уверен ? Однако им можно было потонуть в отличии от волкера да и файлы геодаты клиента я думаю он не просто так спрашивал)
Да и вспомни какое мясо в ТОЙ из миникарты - он все этажи прорабатывал, которые в локации были, как и клиент, про волкера в ТОЙ я умолчу скромно.

dmitry501
08.11.2007, 06:39
Бот шлет координату Z.
Никакой геодаты в хелпере нет. Неужели ты думаешь что она весит 100кб?

Пишете всякую куйню, хоть бы проврили прежде чем постить.

08.11.2007, 23:23
Бот шлет координату Z.
Да ну ? и какую ? и какая она в итоге когда он туда приходит ?))))

Никакой геодаты в хелпере нет. Неужели ты думаешь что она весит 100кб?
Пла, ты деревяшко ? Он берёт её из файлов клиента и превращает в упрощённую сис-му, т.к. строит не 3д а изометрическую карту.

Пишете всякую куйню, хоть бы проврили прежде чем постить.
Чья-бы корова мычала.

dmitry501
09.11.2007, 03:57
Воинственное невежество.
Или по-другому баран упрямый. Открой l2phx и посмотри, шлет ли бот координату Z
А по фразе "и какая она в итоге когда он туда приходит ?))))" понятно что ты вообще нифига по теме не сечешь. Для сверки ккординат есть ValidatePosition.
Фраза "Пла, ты деревяшко ? Он берёт её из файлов клиента и превращает в упрощённую сис-му, т.к. строит не 3д а изометрическую карту." вообще убила. Ты думаешь геодата это карта?
Ну вообщем не пиши больше , отвечать не буду.

xkor
09.11.2007, 17:39
Фраза "Пла, ты деревяшко ? Он берёт её из файлов клиента и превращает в упрощённую сис-му, т.к. строит не 3д а изометрическую карту." вообще убила. Ты думаешь геодата это карта?
ну кстати хелпер карту из геодаты генерил...

11.11.2007, 09:07
Открой l2phx и посмотри, шлет ли бот координату Z
Ты её значение смотрел ?))
Ты посмотри внимательно что он шлёт при передвижении по неровной местности, по воде и ступенькам, думаю удивишься)

ValidatePosition
ахренеть ты гений о.О
А я думал у меня клиент телепортируется, когда я в 2 окна играю и одно на привязке за другим о.О думал магия или ГМ на бота проверяет О.о а оно вон оказывается как всё просто...
А если серьёзно - ты даже не понял сути вопроса.

Ты думаешь геодата это карта?
Ты хоть знаешь что такое геодата ?)
Это точки привязки обьектов, из которых строится ландшафт. А теперь посмотри что строит хелпер (L2helper, бот такой есть, с твоих слов ясно что ты его не использовал). Фактически он рендерит в изометрии 3д карту, по точкам привязки. Ога, этим самым. И ему ничего не мешало при этом сохранять и использовать значения координаты Z, когда это было необходимо, взятой напрямую из клиента. (это обьясняет его способность тонуть и нормальное передвижение по лестницам)

Ну вообщем не пиши больше , отвечать не буду.
:cry:
ну вот так, сначала золотые горы, круиз вокруг моря обещают, а потом - не пиши мне больше !
Все вы одинаковы !
(шутка если кто и на этот раз не понял)

11.11.2007, 09:10
Похоже что начиная с 10.7.1 волкер содержит некоторое подобие геодаты, а не только рисунок который в Timage грузится. Однако что это - хрен его знает, и работает оно хреново. взято оно явно не из клиента. Ну или очень криво интепритированно.

xkor
11.11.2007, 13:16
Похоже что начиная с 10.7.1 волкер содержит некоторое подобие геодаты, а не только рисунок который в Timage грузится. Однако что это - хрен его знает, и работает оно хреново. взято оно явно не из клиента. Ну или очень криво интепритированно.
на основании чего вывод такой сделал?)

12.11.2007, 19:22
на основании чего вывод такой сделал?)
Вроде бегать по ступенькам и неровным поверхностям начал нормально и некий паффайндинг появился. Я сначала подумал что это на стороне сервера - вроде нет, у него паффайндинг намного меньшего радиуса и (!) путь полученный от сервера имеет большие отступы от углов - т.е. боты иногда застревают на поворотах, за клиентом такое замечал реже. Интересно, что там в .dat файлах карт у него...я думал только рисунки (во всяком случае в 10.4.9 были только они), но сейчас не уверен.

12.11.2007, 19:34
Хотя возможно всё проще - 10.7.1 бот изначально работающий на ц4. Возможно это связано с этим, т.к. сейчас на ии стоит полноценное ц4 ядро.

OlegDX
22.11.2007, 13:02
Скрипт преследования таргета на растояни (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.



И не нужно раздувать из ничего тему :(

Cucumber
22.11.2007, 18:08
Ни слова не нашел в этом скрипте о ValidatePostion($48)...

BotLegacy
23.11.2007, 14:03
Ни слова не нашел в этом скрипте о ValidatePostion($48)...
Скрипт о движении вообще, а не о нашем диалоге о вечном) Так что я например и не искал)

OlegDX
23.11.2007, 14:53
а никто и неговорил что серверу даная команда критична ,
Эта команда просто проверить дествительно ли ты там де должен быть

Короче всё ясно тя не перемещение чара итересовало а непонятно что :( :fool:

Aniks
17.12.2007, 13:49
Пишут тут чтоб неоткрывать новую тему. Тем более это вопрос косвенно относится к перемешению.
Хочу сделать карту наподобии той, что у xkorа в боте. Т.е. есть карта в формате картинок 900*900. Собственно хотел посоветоваться как лучше реализовать.

Я себе это так представляю: по своим координатам высчитываешь активный квадрат. Делаешь bitmap, туда загружаешь его и три ближайших (т.е. четыре всего, так как чар может находится на границе квадратов). Потом копируешь нужную область себе на форму - все готово.

Вопрос такой: по какой формуле расчитать из координат активный квадрат и положение в нём? Если не секрет, поделитесь пожалуйста!

xkor
18.12.2007, 21:43
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;

Grinch
13.02.2008, 22:39
вы хоть раз пытались вытянуть экран через потолок в катах :) и шлёпнуть на землю там :) я часто так делаю и смотрю что происходит с пакетами чар начинает движение по х у а вот по 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)

15.02.2008, 02:13
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;

xkor
15.02.2008, 22:59
мм а почему в градусах и чем плохи отрицательные значения?, мне так бы больше понравилосьfunction HeadingToRadian(Heading: integer): Double;
begin
Result:=(heading - 32768) / 32768 * pi;
end;

16.02.2008, 04:25
Эта функция для отображения в лог (неудобно читать Heading 4.25185018102681230867 rad :D), для расчетов я тоже юзал радианную меру.

xkor
16.02.2008, 14:36
кстати зачем вычитание?, у меня в боте прекрасно пашет такfunction HeadingToRadian(Heading: integer): Double;
begin
Result:=heading / 32768 * pi;
end;

17.02.2008, 00:49
у меня отсчет угла с запада, а 0 (хеадингов :D) показывает на восток.

xkor
17.02.2008, 02:12
странный у тя отсчёт...