{
}
-float _Movetype_CheckWater() // SV_CheckWater
+float Mod_Q1BSP_SuperContentsFromNativeContents(float nativecontents)
{
- return FALSE;
+ switch(nativecontents)
+ {
+ case CONTENT_EMPTY:
+ return 0;
+ case CONTENT_SOLID:
+ return DPCONTENTS_SOLID | DPCONTENTS_OPAQUE;
+ case CONTENT_WATER:
+ return DPCONTENTS_WATER;
+ case CONTENT_SLIME:
+ return DPCONTENTS_SLIME;
+ case CONTENT_LAVA:
+ return DPCONTENTS_LAVA | DPCONTENTS_NODROP;
+ case CONTENT_SKY:
+ return DPCONTENTS_SKY | DPCONTENTS_NODROP | DPCONTENTS_OPAQUE; // to match behaviour of Q3 maps, let sky count as opaque
+ }
+ return 0;
+}
+
+float Mod_Q1BSP_NativeContentsFromSuperContents(float supercontents)
+{
+ if(supercontents & (DPCONTENTS_SOLID | DPCONTENTS_BODY))
+ return CONTENT_SOLID;
+ if(supercontents & DPCONTENTS_SKY)
+ return CONTENT_SKY;
+ if(supercontents & DPCONTENTS_LAVA)
+ return CONTENT_LAVA;
+ if(supercontents & DPCONTENTS_SLIME)
+ return CONTENT_SLIME;
+ if(supercontents & DPCONTENTS_WATER)
+ return CONTENT_WATER;
+ return CONTENT_EMPTY;
+}
+
+float _Movetype_CheckWater(entity ent) // SV_CheckWater
+{
+ 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_sv_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_sv_gameplayfix_fixedcheckwatertransition ? 0 : contents);
+ }
}
void _Movetype_Impact(entity oth) // SV_Impact
self.move_velocity_z -= 0.5 * dt * getstatf(STAT_MOVEVARS_GRAVITY);
}
- _Movetype_CheckWaterTransition();
+ _Movetype_CheckWaterTransition(self);
}
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);