classfield(Casing) .int state;
classfield(Casing) .float cnt;
+// this is only needed because LimitedChildrenRubble() takes a func pointer
void Casing_Delete(entity this)
{
delete(this);
if (this.alpha < ALPHA_MIN_VISIBLE)
{
- Casing_Delete(this);
+ delete(this);
this.drawmask = 0;
return;
}
+ trace_startsolid = 0; // due to cl_casings_ticrate, traces are not always performed
Movetype_Physics_MatchTicrate(this, autocvar_cl_casings_ticrate, autocvar_cl_casings_sloppy);
//if (wasfreed(this))
// return; // deleted by touch function
+
+ // prevent glitchy casings when the gun model is poking into a wall
+ // doing this here is cheaper than doing it on the server as the client performs the trace anyway
+ if (trace_startsolid)
+ {
+ delete(this);
+ this.drawmask = 0;
+ return;
+ }
}
SOUND(BRASS1, W_Sound("brass1"));
{
if (trace_dphitq3surfaceflags & Q3SURFACEFLAG_NOIMPACT)
{
- Casing_Delete(this);
+ delete(this);
return;
}
break;
}
- setsize(casing, '0 0 -1', '0 0 -1');
-
LimitedChildrenRubble(CasingsNGibs, "casing", autocvar_cl_casings_maxcount, Casing_Delete, NULL);
}