]> git.rm.cloudns.org Git - xonotic/xonotic-data.pk3dir.git/commitdiff
Fix exit from vehicle warping you back to spot you enterd it
authorJakob MG <jakob_mg@hotmail.com>
Mon, 6 Jun 2011 14:08:08 +0000 (16:08 +0200)
committerJakob MG <jakob_mg@hotmail.com>
Mon, 6 Jun 2011 14:08:08 +0000 (16:08 +0200)
qcsrc/server/cl_client.qc
qcsrc/server/vehicles/racer.qc
qcsrc/server/vehicles/raptor.qc
qcsrc/server/vehicles/spiderbot.qc
qcsrc/server/vehicles/vehicles.qc

index 9fe89d42adb3b8d773448de295a9cbd9308adcae..053233b0c160aacc7de1517cfcd9365c07664799 100644 (file)
@@ -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;
index 8f7db6d8701414b24816b2266899563b3c9be437..2378b3f57238e3edf948238b93967099b1624009 100644 (file)
@@ -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;
 }
 
index c7c384f19d2416d8a3d66c224f408bd788c2a419..1a9a33633332787864e7da5e69ee4903ac0a7341 100644 (file)
@@ -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;
 }
 
index e0eb6ff47809a3456a449233b3afddb932225996..19cc720dbbcbb9a4f6d27aa0a9ce33f55d538e97 100644 (file)
@@ -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;
 }
 
index fc82e8058226c9981dfacd29a517fef2fbdf3dce..b0dd05e7929a08db5df7a9402ec0c9d98349d10d 100644 (file)
@@ -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;