]> git.rm.cloudns.org Git - xonotic/xonotic-data.pk3dir.git/commitdiff
Experimenting with new float-in-water handling techniques
authorSamual Lenks <samual@xonotic.org>
Fri, 31 Aug 2012 06:15:30 +0000 (02:15 -0400)
committerSamual Lenks <samual@xonotic.org>
Fri, 31 Aug 2012 06:15:30 +0000 (02:15 -0400)
qcsrc/server/mutators/gamemode_ctf.qc
qcsrc/server/mutators/gamemode_ctf.qh

index 31b19f46d73c5415cdd0f790a3086475a56ccc41..b0529a1a93011dd267f88d2d2baaed14dbb477c5 100644 (file)
@@ -607,7 +607,7 @@ void ctf_FlagThink()
        // declarations
        entity tmp_entity;
 
-       self.nextthink = time + FLAG_THINKRATE; // only 5 fps, more is unnecessary.
+       self.nextthink = time;// + FLAG_THINKRATE; // only 5 fps, more is unnecessary.
 
        // captureshield
        if(self == ctf_worldflaglist) // only for the first flag
@@ -650,9 +650,39 @@ void ctf_FlagThink()
                
                case FLAG_DROPPED:
                {
-                       if(autocvar_g_ctf_flag_dropped_floatinwater && (self.flags & FL_INWATER))
-                               self.velocity_z = autocvar_g_ctf_flag_dropped_floatinwater;
-               
+                       if(autocvar_g_ctf_flag_dropped_floatinwater)// && (self.flags & FL_INWATER))
+                       {
+                               //self.velocity = self.velocity * 0.5;
+                               //self.velocity_z = autocvar_g_ctf_flag_dropped_floatinwater;
+                       //}
+                               if(self.water_foundsurface)
+                               {
+                                       if(self.flags & FL_INWATER) { self.origin_z = self.water_height; }
+                                       else { CTF_CLEARWATERVARS(self); }
+                               }
+                               else
+                               {
+                                       if(self.flags & FL_INWATER)
+                                       {
+                                               if(self.was_in_water && self.was_in_air)
+                                               {
+                                                       self.water_foundsurface = TRUE;
+                                                       self.water_height = self.origin_z;
+                                               }
+                                               else
+                                               {
+                                                       self.was_in_water = TRUE;
+                                                       self.velocity_z = autocvar_g_ctf_flag_dropped_floatinwater;
+                                               }
+                                       }
+                                       else
+                                       {
+                                               if(self.was_in_water) { self.was_in_air = TRUE; }
+                                               else { CTF_CLEARWATERVARS(self); }
+                                       }       
+                               }
+                       }
+                       
                        if(autocvar_g_ctf_flag_return_dropped)
                        {
                                if((vlen(self.origin - self.ctf_spawnorigin) <= autocvar_g_ctf_flag_return_dropped) || (autocvar_g_ctf_flag_return_dropped == -1))
index 376be568c15de8a0bad5a618c168bdf6f0742e72..6c00fab8c2ddb35472c9e0f62b51f2c0b05ee662 100644 (file)
@@ -98,6 +98,13 @@ float ctf_captimerecord; // record time for capturing the flag
 .entity pass_target;
 .float throw_antispam;
 
+// water floating properties
+#define CTF_CLEARWATERVARS(ent) (ent.water_foundsurface = ent.water_height = ent.was_in_water = ent.was_in_air = FALSE)
+.float water_foundsurface;
+.float water_height;
+.float was_in_water;
+.float was_in_air;
+
 // CaptureShield: If the player is too bad to be allowed to capture, shield them from taking the flag.
 .float ctf_captureshielded; // set to 1 if the player is too bad to be allowed to capture
 float ctf_captureshield_min_negscore; // punish at -20 points