Стандартный алгоритм передвижения предметов AIUpdateTrain работает уж очень топорно, создал свой скрипт передвижения, который позволяет передвигаться между точками по кратчайшему расстоянию под произвольным углом. Добавляем в ai.gs
Код:
func AIUpdateCart( idx )
{
if(idx==-1) return;
if(ObjGet(idx,O_DISABLE)) return;
if(!IsUpdate(ObjGet(idx,O_DELAY))) return;
if(ObjGet(idx,O_STATUS)!=1) return;
id2 = ObjGet(idx,O_TARGET);
if(id2==0) return;
idx2 = ObjFind(id2);
if(idx2==-1) return;
speed = ObjGet(idx2,O_WAYPOINTSPEED); //скорость по Вектору(гипотенуза)
flip = ObjGet(idx2,O_WAYPOINTFLIP);
x2 = ObjGet(idx2,O_X); //координата X места назначения
y2 = ObjGet(idx2,O_Y); // координата Y
x = ObjGet(idx,O_X); //координата X места отправления
y = ObjGet(idx,O_Y); // Y
ObjSet(idx,O_FLIP,flip);
dx = (float)x2 - (float)x ; // длина по X
dy = (float)y2 - (float)y ; // длина по Y
dx2 = dx*dx;
dy2 = dy*dy;
dsum=(float)dx2+(float)dy2;
dz =gs_sqrt((float)dsum);
cosinusa = dx/dz;
sinusa = dy/dz;
speedx = (float)cosinusa*(float)speed;
speedx = gs_round(speedx);
speedy = (float)sinusa*(float)speed;
speedy = gs_round(speedy);
flip = ObjGet(idx2,O_WAYPOINTFLIP);
x2 = ObjGet(idx2,O_X); //координата X места назначения
y2 = ObjGet(idx2,O_Y); // координата Y
x = ObjGet(idx,O_X); //координата X места отправления
y = ObjGet(idx,O_Y); // Y
ObjSet(idx,O_FLIP,flip);
if(x<x2) { x+=((int)speedx); if(x>x2) x=x2; }
if(x>x2) { x+=((int)speedx); if(x<x2) x=x2; }
if(y<y2) { y+=((int)speedy); if(y>y2) y=y2; }
if(y>y2) { y+=((int)speedy); if(y<y2) y=y2; }
if(x==x2 && y==y2) // reached waypoint, change target
{
target = ObjGet(idx2,O_TARGET);
ObjSet(idx,O_TARGET,target);
}
ObjSet(idx,O_X,x);
ObjSet(idx,O_Y,y);
}