3 #include <server/defs.qh>
4 #include <server/miscfunctions.qh>
6 #include "command/common.qh"
7 #include "../common/state.qh"
8 #include "../lib/warpzone/common.qh"
9 #include "../common/mapobjects/subs.qh"
15 A version of traceline that must be used by SOLID_SLIDEBOX things that want to hit SOLID_CORPSE things with a trace attack
16 Additionally it moves players back into the past before the trace and restores them afterward.
19 void tracebox_antilag_force_wz (entity source, vector v1, vector mi, vector ma, vector v2, float nomonst, entity forent, float lag, float wz)
21 // check whether antilagged traces are enabled
24 if (!IS_REAL_CLIENT(forent))
25 lag = 0; // only antilag for clients
27 // change shooter to SOLID_BBOX so the shot can hit corpses
28 int oldsolid = source.dphitcontentsmask;
30 source.dphitcontentsmask = DPCONTENTS_SOLID | DPCONTENTS_BODY | DPCONTENTS_CORPSE;
33 antilag_takeback_all(forent, lag);
37 WarpZone_TraceBox (v1, mi, ma, v2, nomonst, forent);
39 tracebox (v1, mi, ma, v2, nomonst, forent);
41 // restore players to current positions
43 antilag_restore_all(forent);
45 // restore shooter solid type
47 source.dphitcontentsmask = oldsolid;
49 void traceline_antilag_force (entity source, vector v1, vector v2, float nomonst, entity forent, float lag)
51 tracebox_antilag_force_wz(source, v1, '0 0 0', '0 0 0', v2, nomonst, forent, lag, false);
53 void traceline_antilag (entity source, vector v1, vector v2, float nomonst, entity forent, float lag)
55 bool noantilag = ((IS_CLIENT(source)) ? CS(source).cvar_cl_noantilag : false);
56 if (autocvar_g_antilag != 2 || noantilag)
58 traceline_antilag_force(source, v1, v2, nomonst, forent, lag);
60 void tracebox_antilag (entity source, vector v1, vector mi, vector ma, vector v2, float nomonst, entity forent, float lag)
62 bool noantilag = ((IS_CLIENT(source)) ? CS(source).cvar_cl_noantilag : false);
63 if (autocvar_g_antilag != 2 || noantilag)
65 tracebox_antilag_force_wz(source, v1, mi, ma, v2, nomonst, forent, lag, false);
67 void WarpZone_traceline_antilag_force (entity source, vector v1, vector v2, float nomonst, entity forent, float lag)
69 tracebox_antilag_force_wz(source, v1, '0 0 0', '0 0 0', v2, nomonst, forent, lag, true);
71 void WarpZone_traceline_antilag (entity source, vector v1, vector v2, float nomonst, entity forent, float lag)
73 bool noantilag = ((IS_CLIENT(source)) ? CS(source).cvar_cl_noantilag : false);
74 if (autocvar_g_antilag != 2 || noantilag)
76 WarpZone_traceline_antilag_force(source, v1, v2, nomonst, forent, lag);
78 void WarpZone_tracebox_antilag (entity source, vector v1, vector mi, vector ma, vector v2, float nomonst, entity forent, float lag)
80 bool noantilag = ((IS_CLIENT(source)) ? CS(source).cvar_cl_noantilag : false);
81 if (autocvar_g_antilag != 2 || noantilag)
83 tracebox_antilag_force_wz(source, v1, mi, ma, v2, nomonst, forent, lag, true);
86 float tracebox_inverted (vector v1, vector mi, vector ma, vector v2, float nomonsters, entity forent, float stopatentity, entity ignorestopatentity) // returns the number of traces done, for benchmarking
92 //nudge = 2 * cvar("collision_impactnudge"); // why not?
95 dir = normalize(v2 - v1);
97 pos = v1 + dir * nudge;
104 if(pos * dir >= v2 * dir)
112 tracebox(pos, mi, ma, v2, nomonsters, forent);
117 LOG_TRACE("HOLY SHIT! When tracing from ", vtos(v1), " to ", vtos(v2));
118 LOG_TRACE(" Nudging gets us nowhere at ", vtos(pos));
119 LOG_TRACE(" trace_endpos is ", vtos(trace_endpos));
120 LOG_TRACE(" trace distance is ", ftos(vlen(pos - trace_endpos)));
123 stopentity = trace_ent;
127 // we started inside solid.
128 // then trace from endpos to pos
130 tracebox(t, mi, ma, pos, nomonsters, forent);
134 // t is still inside solid? bad
135 // force advance, then, and retry
136 pos = t + dir * nudge;
138 // but if we hit an entity, stop RIGHT before it
139 if(stopatentity && stopentity && stopentity != ignorestopatentity)
141 trace_ent = stopentity;
143 trace_fraction = ((trace_endpos - v1) * dir) / ((v2 - v1) * dir);
149 // we actually LEFT solid!
150 trace_fraction = ((trace_endpos - v1) * dir) / ((v2 - v1) * dir);
156 // pos is outside solid?!? but why?!? never mind, just return it.
158 trace_fraction = ((trace_endpos - v1) * dir) / ((v2 - v1) * dir);
164 void traceline_inverted (vector v1, vector v2, float nomonsters, entity forent, float stopatentity, entity ignorestopatentity)
166 tracebox_inverted(v1, '0 0 0', '0 0 0', v2, nomonsters, forent, stopatentity, ignorestopatentity);
173 Returns a point at least 12 units away from walls
174 (useful for explosion animations, although the blast is performed where it really happened)
178 vector findbetterlocation (vector org, float mindist)
180 vector vec = mindist * '1 0 0';
184 traceline (org, org + vec, true, NULL);
186 if (trace_fraction < 1)
188 vector loc = trace_endpos;
189 traceline (loc, loc + vec, true, NULL);
190 if (trace_fraction >= 1)