X-Git-Url: http://git.xonotic.org/?a=blobdiff_plain;f=qcsrc%2Fserver%2Ft_plats.qc;h=de1243ecbba0ee11ae8c9658ff5310a9b2c5a115;hb=c4e5adb4a6ca7e6af370ec3b8a955eba0920868f;hp=ae4f035e10c44e7c20cd0d59d5dcc2b9b64e999f;hpb=3d28f108af7733517b35fa6bdf9a182404d82482;p=xonotic%2Fxonotic-data.pk3dir.git diff --git a/qcsrc/server/t_plats.qc b/qcsrc/server/t_plats.qc index ae4f035e1..de1243ecb 100644 --- a/qcsrc/server/t_plats.qc +++ b/qcsrc/server/t_plats.qc @@ -88,14 +88,14 @@ void plat_go_down() { sound (self, CH_TRIGGER_SINGLE, self.noise, VOL_BASE, ATTN_NORM); self.state = 3; - SUB_CalcMove (self.pos2, self.speed, plat_hit_bottom); + SUB_CalcMove (self.pos2, TSPEED_LINEAR, self.speed, plat_hit_bottom); } void plat_go_up() { sound (self, CH_TRIGGER_SINGLE, self.noise, VOL_BASE, ATTN_NORM); self.state = 4; - SUB_CalcMove (self.pos1, self.speed, plat_hit_top); + SUB_CalcMove (self.pos1, TSPEED_LINEAR, self.speed, plat_hit_top); } void plat_center_touch() @@ -251,15 +251,36 @@ void spawnfunc_func_plat() plat_spawn_inside_trigger (); // the "start moving" trigger } - +.float train_wait_turning; void() train_next; void train_wait() { + entity oldself; + oldself = self; + self = self.enemy; + SUB_UseTargets(); + 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) + { + entity targ; + vector org; + targ = find(world, targetname, self.target); + org = vectoangles(targ.origin); + SUB_CalcAngleMove(org, TSPEED_TIME, self.ltime - time + self.wait, train_wait); + self.train_wait_turning = TRUE; + return; + } + if(self.noise != "") stopsoundto(MSG_BROADCAST, self, CH_TRIGGER_SINGLE); // send this as unreliable only, as the train will resume operation shortly anyway - if(self.wait < 0) + if(self.wait < 0 || self.train_wait_turning) // no waiting or we already waited while turning { + self.train_wait_turning = FALSE; train_next(); } else @@ -267,31 +288,23 @@ void train_wait() self.think = train_next; self.nextthink = self.ltime + self.wait; } - - entity oldself; - oldself = self; - self = self.enemy; - SUB_UseTargets(); - self = oldself; - self.enemy = world; } void train_next() { entity targ, cp; + vector cp_org; + targ = find(world, targetname, self.target); self.target = targ.target; if (self.spawnflags & 1) { cp = find(world, target, targ.targetname); // get the previous corner first - cp = find(world, targetname, cp.target2); // now get its second target - if(cp.targetname == "") // none found - { - // when using bezier curves, you must have a control point for each corner in the train's path - if(autocvar_developer) - dprint("Warning: func_train using beizer curves reached a path_corner without a control point. Please add a target2 for each path_corner used by this train!\n"); - cp = targ; // assume a straight line to the destination as fallback - } + 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 + else + cp_org = cp.origin - self.mins; } if (!self.target) objerror("train_next: no next target"); @@ -302,16 +315,16 @@ void train_next() if (targ.speed) { if (self.spawnflags & 1) - SUB_CalcMove_Bezier(cp.origin, targ.origin - self.mins, targ.speed, train_wait); + SUB_CalcMove_Bezier(cp_org, targ.origin - self.mins, TSPEED_LINEAR, targ.speed, train_wait); else - SUB_CalcMove(targ.origin - self.mins, targ.speed, train_wait); + SUB_CalcMove(targ.origin - self.mins, TSPEED_LINEAR, targ.speed, train_wait); } else { if (self.spawnflags & 1) - SUB_CalcMove_Bezier(cp.origin, targ.origin - self.mins, self.speed, train_wait); + SUB_CalcMove_Bezier(cp_org, targ.origin - self.mins, TSPEED_LINEAR, self.speed, train_wait); else - SUB_CalcMove(targ.origin - self.mins, self.speed, train_wait); + SUB_CalcMove(targ.origin - self.mins, TSPEED_LINEAR, self.speed, train_wait); } if(self.noise != "") @@ -344,6 +357,8 @@ void spawnfunc_func_train() objerror("func_train without a target"); if (!self.speed) self.speed = 100; + if (self.spawnflags & 2) + self.bezier_turn = TRUE; if not(InitMovingBrushTrigger()) return; @@ -623,7 +638,7 @@ void button_done() void button_return() { self.state = STATE_DOWN; - SUB_CalcMove (self.pos1, self.speed, button_done); + SUB_CalcMove (self.pos1, TSPEED_LINEAR, self.speed, button_done); self.frame = 0; // use normal textures if (self.health) self.takedamage = DAMAGE_YES; // can be shot again @@ -648,7 +663,7 @@ void button_fire() sound (self, CH_TRIGGER, self.noise, VOL_BASE, ATTN_NORM); self.state = STATE_UP; - SUB_CalcMove (self.pos2, self.speed, button_wait); + SUB_CalcMove (self.pos2, TSPEED_LINEAR, self.speed, button_wait); } void button_reset() @@ -888,7 +903,7 @@ void door_go_down() } self.state = STATE_DOWN; - SUB_CalcMove (self.pos1, self.speed, door_hit_bottom); + SUB_CalcMove (self.pos1, TSPEED_LINEAR, self.speed, door_hit_bottom); } void door_go_up() @@ -905,7 +920,7 @@ void door_go_up() if (self.noise2 != "") sound (self, CH_TRIGGER_SINGLE, self.noise2, VOL_BASE, ATTN_NORM); self.state = STATE_UP; - SUB_CalcMove (self.pos2, self.speed, door_hit_top); + SUB_CalcMove (self.pos2, TSPEED_LINEAR, self.speed, door_hit_top); string oldmessage; oldmessage = self.message; @@ -1190,7 +1205,7 @@ void door_rotating_go_down() } self.state = STATE_DOWN; - SUB_CalcAngleMove (self.pos1, self.speed, door_rotating_hit_bottom); + SUB_CalcAngleMove (self.pos1, TSPEED_LINEAR, self.speed, door_rotating_hit_bottom); } void door_rotating_go_up() @@ -1206,7 +1221,7 @@ void door_rotating_go_up() if (self.noise2 != "") sound (self, CH_TRIGGER_SINGLE, self.noise2, VOL_BASE, ATTN_NORM); self.state = STATE_UP; - SUB_CalcAngleMove (self.pos2, self.speed, door_rotating_hit_top); + SUB_CalcAngleMove (self.pos2, TSPEED_LINEAR, self.speed, door_rotating_hit_top); string oldmessage; oldmessage = self.message; @@ -1670,7 +1685,7 @@ void fd_secret_use() self.dest1 = self.origin + v_right * (self.t_width * temp); self.dest2 = self.dest1 + v_forward * self.t_length; - SUB_CalcMove(self.dest1, self.speed, fd_secret_move1); + SUB_CalcMove(self.dest1, TSPEED_LINEAR, self.speed, fd_secret_move1); if (self.noise2 != "") sound(self, CH_TRIGGER_SINGLE, self.noise2, VOL_BASE, ATTN_NORM); } @@ -1689,7 +1704,7 @@ void fd_secret_move2() { if (self.noise2 != "") sound(self, CH_TRIGGER_SINGLE, self.noise2, VOL_BASE, ATTN_NORM); - SUB_CalcMove(self.dest2, self.speed, fd_secret_move3); + SUB_CalcMove(self.dest2, TSPEED_LINEAR, self.speed, fd_secret_move3); } // Wait here until time to go back... @@ -1709,7 +1724,7 @@ void fd_secret_move4() { if (self.noise2 != "") sound(self, CH_TRIGGER_SINGLE, self.noise2, VOL_BASE, ATTN_NORM); - SUB_CalcMove(self.dest1, self.speed, fd_secret_move5); + SUB_CalcMove(self.dest1, TSPEED_LINEAR, self.speed, fd_secret_move5); } // Wait 1 second... @@ -1725,7 +1740,7 @@ void fd_secret_move6() { if (self.noise2 != "") sound(self, CH_TRIGGER_SINGLE, self.noise2, VOL_BASE, ATTN_NORM); - SUB_CalcMove(self.oldorigin, self.speed, fd_secret_done); + SUB_CalcMove(self.oldorigin, TSPEED_LINEAR, self.speed, fd_secret_done); } void fd_secret_done()