Скрипт должен расчитывать и рисовать путь, который он узнает из пакета MoveToLocation, выбрасывая вещи.
x21 - х начала пути.
x11 - х конца пути.
по аналогии устроены другие переменные.
GetTimeFromPath - получение длинны пути.
dropitem - выброс вещи, который шлется на клиент.
delphi Код:
procedure PaintMyWay(x11,y11,z11,x21,y21,z21:integer); // объявление процедурыbegin// начало 1if((Round(GetTimeFromPath(x21,y21,z21,x11,y11,z11,'path'))div10)=0)then// не равняется ли длинна пути 0?begin//начало 2exit; // если да - выходим дабы избежать вылетаend; // конец 2 // если же длинна нашего пути не равна 0 то//Описание 1: вычесляем разницу между координатами, вычитаем из нее длинну пути
dx1:=(x21 - x11)divRound(Round(GetTimeFromPath(x21,y21,z21,x11,y11,z11,'path'))div10); // Описание 1 для x
dy1:=(y21 - y11)divRound(Round(GetTimeFromPath(x21,y21,z21,x11,y11,z11,'path'))div10); // Описание 1 для y
dz1:=(z21 - z11)divRound(Round(GetTimeFromPath(x21,y21,z21,x11,y11,z11,'path'))div10); // Описание 1 для zwhile(dx1>0)or(dx1<0)or(dy1>0)or(dy1<0)or(dz1>0)or(dz1<0)do// начинаем цикл, который выполняется при// условии что разница между разностью начальной и конечной координат x y z не равна 0.begin// начало 3
x11:=x11+dx1; // прибавляем к начальному x разницу
y11:=y11+dy1; // прибавляем к начальному y разницу
z11:=z11+dz1; // прибавляем к начальному z разницу
dropItem(x11,y11,z11); // выкидываем вещь в эти координатыif((Round(GetTimeFromPath(x21,y21,z21,x11,y11,z11,'path'))div10)=0)then//проверяем новые координаты, не равен ли путь с них 0?begin//начало 4exit; //если это так то выходим дабы избежать ошибкиend; //конец 4
dx1:=(x21 - x11)divRound(Round(GetTimeFromPath(x21,y21,z21,x11,y11,z11,'path'))div10); // Описание 1 для x
dy1:=(y21 - y11)divRound(Round(GetTimeFromPath(x21,y21,z21,x11,y11,z11,'path'))div10);// Описание 1 для y
dz1:=(z21 - z11)divRound(Round(GetTimeFromPath(x21,y21,z21,x11,y11,z11,'path'))div10); // Описание 1 для zend; // конец 3end; // конец 1
В чем заключается ПРОБЛЕМА - при непонятно каких обстоятельствах, рисованый путь искривляется.
__________________ Начало.
Последний раз редактировалось supernewbie, 20.09.2010 в 20:36.
Причина: Добавлено сообщение
//здесь опционально, вместо 100 надо (методом тыка) выставить другое значение, чтоб рисовалось с нормальной скоростью
vx:=dx/100;
vy:=dy/100;
vz:=dz/100;
4) Далее по таймеру кидаем итем на землю увеличивая координаты на vx, vy, vz пока не достигнем конечной точки. Координаты понятное дело округлять до целого.
ЗЫ: зачем эти линии?
__________________
В любом из нас спит гений. И с каждым днем все крепче.
Переходим на протокол нового поколения jabber
Последний раз редактировалось J-Fobos, 20.09.2010 в 22:16.
фобос, ты че-то не то написал)
во-первых просто делить на сто это получится если линия маленькая - промежутки мелкие, если длинная - промежутки большие
А у меня промежутки зависят от длинны пути.
и вообще это нихрена не то что я просил, линия получается КРИВОЙ. Надо понять почему...
Добавлено через 19 минут
delphi Код:
const
Name='1';
var
Path,ID,itemid:integer;
Speed,MoveMul: double;
dx,dy,dz:integer;
dx1,dy1,dz1:integer;
timer:TTimer;
i:integer;
procedure Init; //Вызывается при включении скриптаbegin
timer:=TTimer.Create(nil);
timer.OnTimer:=@Prishel;
timer.enabled:=false;
end;
procedure Free; //Вызывается при выключении скриптаbegin
timer.free;
end;
procedure Say(msg:string);
begin
buf:=#$4A;
WriteD(0);
WriteD(3);
WriteS('Инфо');
WriteS(msg);
SendToClientEx(Name);
end;
procedure Prishel(Sender: TObject);
begin
ClearPath;
timer.enabled:=false;
end;
procedure ClearPath;
beginfor i:=0to itemid do DeleteObject(i);
itemid:=0;
end;
procedure DeleteObject(l:integer);
begin
buf:=#$08;
WriteD(l);
SendToClientEx(Name);
end;
function MyRound(r:double) : double;
begin
result:=Round(r*10)/10;
end;
procedure dropItem(x1,y1,z1:integer);
begin
buf:=#$16;
WriteD(id);
WriteD(itemid);
WriteD(57);
WriteD(x1);
WriteD(y1);
WriteD(z1);
WriteD(0);
WriteQ(0);
WriteD(0);
SendToClientEx(Name);
Inc(itemid);
end;
procedure PaintMyWay(x11,y11,z11,x21,y21,z21:integer);
beginif((Round(GetTimeFromPath(x21,y21,z21,x11,y11,z11,'path'))div10)=0)thenbeginexit;
end;
dx1:=(x21 - x11)divRound(Round(GetTimeFromPath(x21,y21,z21,x11,y11,z11,'path'))div10);
dy1:=(y21 - y11)divRound(Round(GetTimeFromPath(x21,y21,z21,x11,y11,z11,'path'))div10);
dz1:=(z21 - z11)divRound(Round(GetTimeFromPath(x21,y21,z21,x11,y11,z11,'path'))div10);
while(dx1>0)or(dx1<0)or(dy1>0)or(dy1<0)or(dz1>0)or(dz1<0)dobegin
x11:=x11+dx1;
y11:=y11+dy1;
z11:=z11+dz1;
dropItem(x11,y11,z11);
if((Round(GetTimeFromPath(x21,y21,z21,x11,y11,z11,'path'))div10)=0)thenbeginexit;
end;
dx1:=(x21 - x11)divRound(Round(GetTimeFromPath(x21,y21,z21,x11,y11,z11,'path'))div10);
dy1:=(y21 - y11)divRound(Round(GetTimeFromPath(x21,y21,z21,x11,y11,z11,'path'))div10);
dz1:=(z21 - z11)divRound(Round(GetTimeFromPath(x21,y21,z21,x11,y11,z11,'path'))div10);
end;
end;
function GetTimeFromPath(x1,y1,z1,x2,y2,z2:integer;keyword:string) : double;
beginif(keyword='time')then result:=Round((sqrt(((x2-x1)*(x2-x1))+((y2-y1)*(y2-y1))+((z2-z1)*(z2-z1)))) / Speed);
if(keyword='path')then result:=Round((sqrt(((x2-x1)*(x2-x1))+((y2-y1)*(y2-y1))+((z2-z1)*(z2-z1)))));
end;
//основная часть скрипта//вызывается при приходе каждого пакета если скрипт включенbeginif FromServer and(ConnectName=Name)and(pck[1]=#$2F)and(ReadD(2)=ID)thenbegin
timer.enabled:=false;
ClearPath;
//Say('Твой путь равен '+vartostr(GetTimeFromPath(ReadD(14),ReadD(18),ReadD(22),ReadD(2),ReadD(6),ReadD(10)))+'.');
Say('Вы пройдете этот путь за '+vartostr(GetTimeFromPath(ReadD(18),ReadD(22),ReadD(26),ReadD(6),ReadD(10),ReadD(14),'time'))+' секунд.');
PaintMyWay(ReadD(18),ReadD(22),ReadD(26),ReadD(6),ReadD(10),ReadD(14));
timer.interval:=(Round(GetTimeFromPath(ReadD(18),ReadD(22),ReadD(26),ReadD(6),ReadD(10),ReadD(14),'time')))*1000;
timer.enabled:=true;
end;
if FromServer and(ConnectName=Name)and(pck[1]=#$32)thenbegin
ID:=ReadD(18);
Speed:=(ReadD(470+(length(ReadS(22))*2+2)))*(ReadF(502+(length(ReadS(22))*2+2)));
end;
end.
Добавлено через 47 секунд
вот фул код смотри
__________________ Начало.
Последний раз редактировалось supernewbie, 20.09.2010 в 23:00.
Причина: Добавлено сообщение
Врубаюсь)) Ты чужих ботов уводить от места кача собираешься))
Ты учитывай, что в игре есть такая вещь как "вы не можете бросить так далеко", длинных дистанций у тебя не будет и мой алгоритм вполне подходит.
__________________
В любом из нас спит гений. И с каждым днем все крепче.