]> de.git.xonotic.org Git - xonotic/xonotic-data.pk3dir.git/blobdiff - qcsrc/client/movetypes.qc
Fix compile.
[xonotic/xonotic-data.pk3dir.git] / qcsrc / client / movetypes.qc
index 402e44cac83210d5a10485cfbf47845f9bbde998..a4122d261f175961a4b52ae55a1c21418b3141f6 100644 (file)
@@ -10,13 +10,77 @@ void _Movetype_CheckVelocity() // SV_CheckVelocity
 {
 }
 
-float _Movetype_CheckWater() // SV_CheckWater
+float _Movetype_CheckWater(entity ent) // SV_CheckWater
 {
-       return FALSE;
+       float supercontents;
+       float nativecontents;
+       vector point;
+
+       point = ent.move_origin;
+       point_z += (ent.mins_z + 1);
+
+       nativecontents = pointcontents(point);
+
+       if(ent.move_watertype)
+       if(ent.move_watertype != nativecontents)
+       {
+               //print(sprintf("_Movetype_CheckWater(): Original: '%d', New: '%d'\n", ent.move_watertype, nativecontents));
+               if(ent.contentstransition)
+                       ent.contentstransition(ent.move_watertype, nativecontents);
+       }
+
+       ent.move_waterlevel = 0;
+       ent.move_watertype = CONTENT_EMPTY;
+
+       supercontents = Mod_Q1BSP_SuperContentsFromNativeContents(nativecontents);
+       if(supercontents & DPCONTENTS_LIQUIDSMASK)
+       {
+               ent.move_watertype = nativecontents;
+               ent.move_waterlevel = 1;
+               point_y = (ent.origin_y + ((ent.mins_z + ent.maxs_y) * 0.5));
+               if(Mod_Q1BSP_SuperContentsFromNativeContents(pointcontents(point)) & DPCONTENTS_LIQUIDSMASK)
+               {
+                       ent.move_waterlevel = 2;
+                       point_y = ent.origin_y + ent.view_ofs_y;
+                       if(Mod_Q1BSP_SuperContentsFromNativeContents(pointcontents(point)) & DPCONTENTS_LIQUIDSMASK)
+                               ent.move_waterlevel = 3;
+               }
+       }
+
+       return (ent.move_waterlevel > 1);
 }
 
-void _Movetype_CheckWaterTransition() // SV_CheckWaterTransition
+void _Movetype_CheckWaterTransition(entity ent) // SV_CheckWaterTransition
 {
+       float contents = pointcontents(ent.move_origin);
+       
+       if(!ent.move_watertype)
+       {
+               // just spawned here
+               if(!autocvar_cl_gameplayfix_fixedcheckwatertransition)
+               {
+                       ent.move_watertype = contents;
+                       ent.move_waterlevel = 1;
+                       return;
+               }
+       }
+       else if(ent.move_watertype != contents)
+       {
+               //print(sprintf("_Movetype_CheckWaterTransition(): Origin: %s, Direct: '%d', Original: '%d', New: '%d'\n", vtos(ent.move_origin), pointcontents(ent.move_origin), ent.move_watertype, contents));
+               if(ent.contentstransition)
+                       ent.contentstransition(ent.move_watertype, contents);
+       }
+
+       if(contents <= CONTENT_WATER)
+       {
+               ent.move_watertype = contents;
+               ent.move_waterlevel = 1;
+       }
+       else
+       {
+               ent.move_watertype = CONTENT_EMPTY;
+               ent.move_waterlevel = (autocvar_cl_gameplayfix_fixedcheckwatertransition ? 0 : contents);
+       }
 }
 
 void _Movetype_Impact(entity oth) // SV_Impact
@@ -342,7 +406,7 @@ void _Movetype_Physics_Toss(float dt) // SV_Physics_Toss
                        self.move_velocity_z -= 0.5 * dt * getstatf(STAT_MOVEVARS_GRAVITY);
        }
 
-       _Movetype_CheckWaterTransition();
+       _Movetype_CheckWaterTransition(self);
 }
 
 void _Movetype_Physics_Frame(float movedt)
@@ -360,7 +424,7 @@ void _Movetype_Physics_Frame(float movedt)
                        error("SV_Physics_Follow not implemented");
                        break;
                case MOVETYPE_NOCLIP:
-                       _Movetype_CheckWater();
+                       _Movetype_CheckWater(self);
                        self.move_origin = self.move_origin + ticrate * self.move_velocity;
                        self.move_angles = self.move_angles + ticrate * self.move_avelocity;
                        _Movetype_LinkEdict(FALSE);