From: Jakob MG Date: Mon, 6 Jun 2011 14:08:08 +0000 (+0200) Subject: Fix exit from vehicle warping you back to spot you enterd it X-Git-Tag: xonotic-v0.5.0~199^2~11^2~37 X-Git-Url: https://git.rm.cloudns.org/?a=commitdiff_plain;h=ba70b09b56e7cf370a584fb759baabf077701f3b;p=xonotic%2Fxonotic-data.pk3dir.git Fix exit from vehicle warping you back to spot you enterd it --- diff --git a/qcsrc/server/cl_client.qc b/qcsrc/server/cl_client.qc index 9fe89d42a..053233b0c 100644 --- a/qcsrc/server/cl_client.qc +++ b/qcsrc/server/cl_client.qc @@ -2359,7 +2359,7 @@ void SpectateCopy(entity spectatee) { self.dmg_save = spectatee.dmg_save; self.dmg_inflictor = spectatee.dmg_inflictor; self.angles = spectatee.v_angle; - self.fixangle = TRUE; + //self.fixangle = TRUE; setorigin(self, spectatee.origin); setsize(self, spectatee.mins, spectatee.maxs); SetZoomState(spectatee.zoomstate); @@ -2373,7 +2373,7 @@ void SpectateCopy(entity spectatee) { { setorigin(self, spectatee.origin); self.velocity = spectatee.vehicle.velocity; - self.v_angle += spectatee.vehicle.angles; + //self.v_angle += spectatee.vehicle.angles; //self.v_angle_x *= -1; self.vehicle_health = spectatee.vehicle_health; self.vehicle_shield = spectatee.vehicle_shield; diff --git a/qcsrc/server/vehicles/racer.qc b/qcsrc/server/vehicles/racer.qc index 8f7db6d87..2378b3f57 100644 --- a/qcsrc/server/vehicles/racer.qc +++ b/qcsrc/server/vehicles/racer.qc @@ -549,6 +549,8 @@ void racer_enter() void racer_exit(float eject) { + vector spot; + self.think = racer_think; self.nextthink = time; self.movetype = MOVETYPE_TOSS; @@ -559,14 +561,18 @@ void racer_exit(float eject) makevectors(self.angles); if(eject) { - setorigin(self.owner, self.origin + v_forward * 100 + v_up * 32); + spot = self.origin + v_forward * 100 + '0 0 64'; + spot = vehicles_findgoodexit(spot); + setorigin(self.owner , spot); self.owner.velocity = (v_up + v_forward * 0.25) * 750; } else { - setorigin(self.owner, self.origin - v_forward * 100 + v_up * 32); - self.owner.velocity = v_forward * -150; + spot = self.origin - v_forward * 200 + '0 0 64'; + spot = vehicles_findgoodexit(spot); + setorigin(self.owner , spot); } + self.owner = world; } diff --git a/qcsrc/server/vehicles/raptor.qc b/qcsrc/server/vehicles/raptor.qc index c7c384f19..1a9a33633 100644 --- a/qcsrc/server/vehicles/raptor.qc +++ b/qcsrc/server/vehicles/raptor.qc @@ -237,6 +237,7 @@ void raptor_land() void raptor_exit(float eject) { + vector spot; self.tur_head.exteriormodeltoclient = world; if(self.deadflag == DEAD_NO) @@ -251,12 +252,18 @@ void raptor_exit(float eject) makevectors(self.angles); if(eject) { - setorigin(self.owner,self.origin + v_forward * 100 + '0 0 64'); + spot = self.origin + v_forward * 100 + '0 0 64'; + spot = vehicles_findgoodexit(spot); + setorigin(self.owner , spot); self.owner.velocity = (v_up + v_forward * 0.25) * 750; } else - setorigin(self.owner,self.origin - v_forward * 200 + '0 0 64'); - + { + spot = self.origin - v_forward * 200 + '0 0 64'; + spot = vehicles_findgoodexit(spot); + setorigin(self.owner , spot); + } + self.owner = world; } diff --git a/qcsrc/server/vehicles/spiderbot.qc b/qcsrc/server/vehicles/spiderbot.qc index e0eb6ff47..19cc720db 100644 --- a/qcsrc/server/vehicles/spiderbot.qc +++ b/qcsrc/server/vehicles/spiderbot.qc @@ -317,7 +317,6 @@ float spiderbot_frame() sound (self, CHAN_VOICE, "vehicles/spiderbot_walk.wav", VOL_BASE, ATTN_NORM); //dprint("spiderbot_walk:", ftos(soundlength("vehicles/spiderbot_walk.wav")), "\n"); } - } else if(player.movement_y != 0) { @@ -450,7 +449,8 @@ void spiderbot_enter() void spiderbot_exit(float eject) { entity e; - + vector spot; + e = findchain(classname,"spiderbot_rocket"); while(e) { @@ -474,12 +474,18 @@ void spiderbot_exit(float eject) makevectors(self.angles); if(eject) { - setorigin(self.owner ,self.origin + v_forward * 100 + '0 0 64'); + spot = self.origin + v_forward * 100 + '0 0 64'; + spot = vehicles_findgoodexit(spot); + setorigin(self.owner , spot); self.owner.velocity = (v_up + v_forward * 0.25) * 750; } else - setorigin(self.owner, self.origin - v_forward * 200 + '0 0 64'); - + { + spot = self.origin - v_forward * 200 + '0 0 64'; + spot = vehicles_findgoodexit(spot); + setorigin(self.owner , spot); + } + self.owner = world; } diff --git a/qcsrc/server/vehicles/vehicles.qc b/qcsrc/server/vehicles/vehicles.qc index fc82e8058..b0dd05e79 100644 --- a/qcsrc/server/vehicles/vehicles.qc +++ b/qcsrc/server/vehicles/vehicles.qc @@ -495,6 +495,54 @@ void vehicles_enter() self.vehicle_enter(); } +vector vehicles_findgoodexit(vector prefer_spot) +{ + vector exitspot; + float mysize; + + tracebox(self.origin + '0 0 32', PL_MIN, PL_MAX, prefer_spot, MOVE_NORMAL, self.owner); + if(trace_fraction == 1.0 && !trace_startsolid && !trace_allsolid) + return prefer_spot; + + mysize = vlen(self.maxs - self.mins); + float i; + vector v, v2; + v2 = 0.5 * (self.absmin + self.absmax); + for(i = 0; i < 100; ++i) + { + v = randomvec(); + v_z = 0; + v = v2 + normalize(v) * mysize; + tracebox(v2, PL_MIN, PL_MAX, v, MOVE_NORMAL, self.owner); + if(trace_fraction == 1.0 && !trace_startsolid && !trace_allsolid) + return v; + } + + /* + exitspot = (self.origin + '0 0 48') + v_forward * mysize; + tracebox(self.origin + '0 0 32', PL_MIN, PL_MAX, exitspot, MOVE_NORMAL, self.owner); + if(trace_fraction == 1.0 && !trace_startsolid && !trace_allsolid) + return exitspot; + + exitspot = (self.origin + '0 0 48') - v_forward * mysize; + tracebox(self.origin + '0 0 32', PL_MIN, PL_MAX, exitspot, MOVE_NORMAL, self.owner); + if(trace_fraction == 1.0 && !trace_startsolid && !trace_allsolid) + return exitspot; + + exitspot = (self.origin + '0 0 48') + v_right * mysize; + tracebox(self.origin + '0 0 32', PL_MIN, PL_MAX, exitspot, MOVE_NORMAL, self.owner); + if(trace_fraction == 1.0 && !trace_startsolid && !trace_allsolid) + return exitspot; + + exitspot = (self.origin + '0 0 48') - v_right * mysize; + tracebox(self.origin + '0 0 32', PL_MIN, PL_MAX, exitspot, MOVE_NORMAL, self.owner); + if(trace_fraction == 1.0 && !trace_startsolid && !trace_allsolid) + return exitspot; + */ + + return self.origin; +} + void vehicles_exit(float eject) { self.flags |= FL_NOTARGET;