#include "../antilag.qh"
#include <common/constants.qh>
+#include <common/net_linked.qh>
#include <common/util.qh>
-#include <common/weapons/all.qh>
+#include <common/weapons/_all.qh>
#include <common/state.qh>
#include <lib/warpzone/common.qh>
vector end;
dir = normalize(dir + randomvec() * spread);
- end = start + dir * MAX_SHOT_DISTANCE;
+ end = start + dir * max_shot_distance;
fireBullet_last_hit = NULL;
float solid_penetration_left = 1;
start = trace_endpos;
entity hit = trace_ent;
+ // traced up to max_shot_distance and didn't hit anything at all
+ if (trace_fraction == 1.0)
+ break;
+
// When hitting sky, stop.
- if (pointcontents(start) == CONTENT_SKY)
+ if (trace_dphitq3surfaceflags & Q3SURFACEFLAG_SKY)
break;
// can't use noimpact, as we need to pass through walls
}
}
- if (is_weapclip)
+ if (is_weapclip && !autocvar_g_ballistics_penetrate_clips)
break;
// go through solid!
// fraction_used_of_what_is_left = dist_taken / maxdist
// solid_penetration_left = solid_penetration_left - solid_penetration_left * fraction_used_of_what_is_left
solid_penetration_left *= 1 - dist_taken / maxdist;
+ solid_penetration_left = max(solid_penetration_left, 0);
// Only show effect when going through a player (invisible otherwise)
if (hit && (hit.solid != SOLID_BSP))