self = oldself;
self.enemy = world;
- // if using bezier curves and turning is enabled, the train will turn toward the next point while waiting
- if(!self.train_wait_turning)
- if(self.spawnflags & 1 && self.bezier_turn && self.wait >= 0)
+ // if turning is enabled, the train will turn toward the next point while waiting
+ if(self.platmovetype_turn && !self.train_wait_turning)
{
- entity targ;
+ entity targ, cp;
vector org;
targ = find(world, targetname, self.target);
- org = normalize(targ.origin);
- SUB_CalcAngleMove(org, TSPEED_TIME, self.ltime - time + self.wait, train_wait);
- self.train_wait_turning = TRUE;
- return;
+ if((self.spawnflags & 1) && targ.curvetarget)
+ cp = find(world, targetname, targ.curvetarget);
+ else
+ cp = world;
+
+ if(cp) // bezier curves movement
+ org = cp.origin - (self.origin + self.mins); // use the origin of the control point of the next path_corner
+ else // linear movement
+ org = targ.origin - (self.origin + self.mins); // use the origin of the next path_corner
+ org_z = -org_z;
+ org = vectoangles(org);
+
+ if(self.wait >= 0) // slow turning
+ {
+ SUB_CalcAngleMove(org, TSPEED_TIME, self.ltime - time + self.wait, train_wait);
+ self.train_wait_turning = TRUE;
+ return;
+ }
+ else // instant turning
+ self.angles = org;
}
if(self.noise != "")
self.target = targ.target;
if (self.spawnflags & 1)
{
- cp = find(world, target, targ.targetname); // get the previous corner first
- cp = find(world, targetname, cp.curve); // now get its second target (the control point)
- if(cp.targetname == "")
- cp_org = targ.origin - self.mins; // no control point found, assume a straight line to the destination
+ if(targ.curvetarget)
+ {
+ cp = find(world, targetname, targ.curvetarget); // get its second target (the control point)
+ cp_org = cp.origin - self.mins; // no control point found, assume a straight line to the destination
+ }
else
- cp_org = cp.origin - self.mins;
+ cp = world; // no cp
}
if (!self.target)
objerror("train_next: no next target");
if (targ.speed)
{
- if (self.spawnflags & 1)
+ if (cp)
SUB_CalcMove_Bezier(cp_org, targ.origin - self.mins, TSPEED_LINEAR, targ.speed, train_wait);
else
SUB_CalcMove(targ.origin - self.mins, TSPEED_LINEAR, targ.speed, train_wait);
}
else
{
- if (self.spawnflags & 1)
+ if (cp)
SUB_CalcMove_Bezier(cp_org, targ.origin - self.mins, TSPEED_LINEAR, self.speed, train_wait);
else
SUB_CalcMove(targ.origin - self.mins, TSPEED_LINEAR, self.speed, train_wait);
if (!self.speed)
self.speed = 100;
if (self.spawnflags & 2)
- self.bezier_turn = TRUE;
+ self.platmovetype_turn = TRUE;
if not(InitMovingBrushTrigger())
return;