1 .vector warpzone_origin;
2 .vector warpzone_transform;
5 vector WarpZoneLib_BoxTouchesBrush_mins;
6 vector WarpZoneLib_BoxTouchesBrush_maxs;
7 entity WarpZoneLib_BoxTouchesBrush_ent;
8 entity WarpZoneLib_BoxTouchesBrush_ignore;
9 float WarpZoneLib_BoxTouchesBrush_Recurse()
15 tracebox('0 0 0', WarpZoneLib_BoxTouchesBrush_mins, WarpZoneLib_BoxTouchesBrush_maxs, '0 0 0', MOVE_NOMONSTERS, WarpZoneLib_BoxTouchesBrush_ignore);
17 if (trace_networkentity)
19 dprint("hit a network ent, cannot continue WarpZoneLib_BoxTouchesBrush\n");
20 // we cannot continue, as a player blocks us...
27 if (trace_ent == WarpZoneLib_BoxTouchesBrush_ent)
35 f = WarpZoneLib_BoxTouchesBrush_Recurse();
41 float WarpZoneLib_BoxTouchesBrush(vector mi, vector ma, entity e, entity ig)
50 WarpZoneLib_BoxTouchesBrush_mins = mi;
51 WarpZoneLib_BoxTouchesBrush_maxs = ma;
52 WarpZoneLib_BoxTouchesBrush_ent = e;
53 WarpZoneLib_BoxTouchesBrush_ignore = ig;
54 f = WarpZoneLib_BoxTouchesBrush_Recurse();
60 entity WarpZone_Find(vector mi, vector ma)
62 // if we are near any warpzone planes - MOVE AWAY (work around nearclip)
64 for(e = world; (e = find(e, classname, "trigger_warpzone")); )
65 if(WarpZoneLib_BoxTouchesBrush(mi, ma, e, world))
70 void WarpZone_MakeAllSolid()
73 for(e = world; (e = find(e, classname, "trigger_warpzone")); )
77 void WarpZone_MakeAllOther()
80 for(e = world; (e = find(e, classname, "trigger_warpzone")); )
81 e.solid = SOLID_TRIGGER;
84 void WarpZone_TraceBox(vector org, vector mi, vector ma, vector end, float nomonsters, entity forent)
92 WarpZone_MakeAllSolid();
99 tracebox(org, mi, ma, end, nomonsters, forent);
100 if(WarpZone_trace_callback)
101 WarpZone_trace_callback();
103 sol = trace_startsolid;
104 if(trace_fraction >= 1)
106 frac = trace_fraction = frac + (1 - frac) * trace_fraction;
107 if(trace_ent.classname != "trigger_warpzone")
109 // we hit a warpzone... so, let's perform the trace after the warp again
110 org = WarpZone_TransformOrigin(trace_ent, trace_endpos);
111 end = WarpZone_TransformOrigin(trace_ent, end);
113 WarpZone_MakeAllOther();
114 trace_startsolid = sol;
115 WarpZone_trace_endpos = o0 + (e0 - o0) * trace_fraction;
121 void WarpZone_TraceLine(vector org, vector end, float nomonsters, entity forent)
123 WarpZone_TraceBox(org, '0 0 0', '0 0 0', end, nomonsters, forent);
126 void WarpZone_TraceToss(entity e, entity forent)
129 vector vf, vr, vu, v0, o0;
133 WarpZone_MakeAllSolid();
134 g = cvar("sv_gravity") * e.gravity;
135 WarpZone_tracetoss_time = 0;
140 tracetoss(e, forent);
141 if(WarpZone_trace_callback)
142 WarpZone_trace_callback();
143 e.origin = trace_endpos;
144 dt = vlen(e.origin - o0) / vlen(e.velocity);
145 WarpZone_tracetoss_time += dt;
146 e.velocity_z -= WarpZone_tracetoss_time * g;
147 if(trace_fraction >= 1)
149 if(trace_ent.classname != "trigger_warpzone")
151 // we hit a warpzone... so, let's perform the trace after the warp again
152 e.origin = WarpZone_TransformOrigin(trace_ent, e.origin);
153 e.velocity = WarpZone_TransformVelocity(trace_ent, e.velocity);
155 WarpZone_MakeAllOther();
159 WarpZone_tracetoss_velocity = e.velocity;
162 WarpZone_trace_endpos = e.origin + e.velocity * WarpZone_tracetoss_time;
163 WarpZone_trace_endpos_z -= 0.5 * g * WarpZone_tracetoss_time * WarpZone_tracetoss_time;
166 void WarpZone_TrailParticles(entity own, float eff, vector org, vector end)
173 WarpZone_MakeAllSolid();
177 traceline(org, end, MOVE_NOMONSTERS, world);
178 //print(vtos(org), " to ", vtos(trace_endpos), "\n");
179 trailparticles(own, eff, org, trace_endpos);
180 if(trace_fraction >= 1)
182 if(trace_ent.classname != "trigger_warpzone")
184 // we hit a warpzone... so, let's perform the trace after the warp again
185 org = WarpZone_TransformOrigin(trace_ent, trace_endpos);
186 end = WarpZone_TransformOrigin(trace_ent, end);
188 WarpZone_MakeAllOther();
194 vector WarpZone_TransformOrigin(entity wz, vector v)
196 return wz.enemy.warpzone_origin + AnglesTransform_Apply(wz.warpzone_transform, v - wz.warpzone_origin);
199 vector WarpZone_TransformVelocity(entity wz, vector v)
201 return AnglesTransform_Apply(wz.warpzone_transform, v);
204 vector WarpZone_TransformAngles(entity wz, vector v)
206 return AnglesTransform_ApplyToAngles(wz.warpzone_transform, v);
209 vector WarpZone_TransformVAngles(entity wz, vector ang)
216 ang = AnglesTransform_ApplyToVAngles(wz.warpzone_transform, ang);
217 ang = AnglesTransform_Normalize(ang, TRUE);
218 ang = AnglesTransform_CancelRoll(ang);