]> git.xonotic.org Git - xonotic/xonotic-data.pk3dir.git/blobdiff - qcsrc/server/t_plats.qc
Modify rotation origins with self.mins. This commit fixes the last part of the new...
[xonotic/xonotic-data.pk3dir.git] / qcsrc / server / t_plats.qc
index bf8ee01eec5644f212e2b3271754a45714ea9258..440e16c5c5193a617ce317f2779d60222d4cba83 100644 (file)
@@ -182,19 +182,42 @@ void plat_reset()
        }
 }
 
-void spawnfunc_path_corner()
+.float platmovetype_start_default, platmovetype_end_default;
+float set_platmovetype(entity e, string s)
 {
-       if(self.platmovetype && self.platmovetype != "")
+       // sets platmovetype_start and platmovetype_end based on a string consisting of two values
+
+       float n;
+       n = tokenize_console(s);
+       if(n > 0)
+               e.platmovetype_start = stof(argv(0));
+       else
+               e.platmovetype_start = 0;
+
+       if(n > 1)
+               e.platmovetype_end = stof(argv(1));
+       else
+               e.platmovetype_end = e.platmovetype_start;
+
+       if(n > 2)
+               if(argv(2) == "force")
+                       return TRUE; // no checking, return immediately
+
+       if(!cubic_speedfunc_is_sane(e.platmovetype_start, e.platmovetype_end))
        {
-               // setup values for overriding train movement
-               // if a second value does not exist, both start and end speeds are the single value specified
-               float n;
-               n = tokenize_console(self.platmovetype);
-               self.platmovetype_start = stof(argv(0));
-               self.platmovetype_end = stof(argv(0));
-               if(n > 1)
-                       self.platmovetype_end = stof(argv(1));
+               objerror("Invalid platform move type; platform would go in reverse, which is not allowed.");
+               return FALSE;
        }
+
+       return TRUE;
+}
+
+void spawnfunc_path_corner()
+{
+       // setup values for overriding train movement
+       // if a second value does not exist, both start and end speeds are the single value specified
+       if(!set_platmovetype(self, self.platmovetype))
+               return;
 }
 void spawnfunc_func_plat()
 {
@@ -275,17 +298,32 @@ void train_wait()
        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 != "")
@@ -312,12 +350,13 @@ void train_next()
        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");
@@ -325,23 +364,29 @@ void train_next()
        if (!self.wait)
                self.wait = 0.1;
 
-       if(targ.platmovetype_start || targ.platmovetype_end)
+       if(targ.platmovetype)
        {
-               // override train movement type
+               // this path_corner contains a movetype overrider, apply it
                self.platmovetype_start = targ.platmovetype_start;
                self.platmovetype_end = targ.platmovetype_end;
        }
+       else
+       {
+               // this path_corner doesn't contain a movetype overrider, use the train's defaults
+               self.platmovetype_start = self.platmovetype_start_default;
+               self.platmovetype_end = self.platmovetype_end_default;
+       }
 
        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);
@@ -378,7 +423,7 @@ void spawnfunc_func_train()
        if (!self.speed)
                self.speed = 100;
        if (self.spawnflags & 2)
-               self.bezier_turn = TRUE;
+               self.platmovetype_turn = TRUE;
 
        if not(InitMovingBrushTrigger())
                return;
@@ -396,6 +441,11 @@ void spawnfunc_func_train()
                self.dmgtime = 0.25;
        self.dmgtime2 = time;
 
+       if(!set_platmovetype(self, self.platmovetype))
+               return;
+       self.platmovetype_start_default = self.platmovetype_start;
+       self.platmovetype_end_default = self.platmovetype_end;
+
        // TODO make a reset function for this one
 }