Xonotic QuakeC
The free, fast arena FPS with crisp movement and a wide array of weapons
common.qh File Reference
This graph shows which files directly or indirectly include this file:

Go to the source code of this file.

Macros

#define BITCLR(a, b)
#define BITCLR_ASSIGN(a, b)
#define BITSET(a, b)
#define BITSET_ASSIGN(a, b)
#define BITXOR(a, b)
#define BITXOR_ASSIGN(a, b)
#define EXACTTRIGGER_INIT   WarpZoneLib_ExactTrigger_Init(this, true)
#define EXACTTRIGGER_TOUCH(e, t)
#define MOVE_NOTHING   -1
#define move_out_of_solid(e)

Typedefs

using WarpZone_trace_callback_t = void(vector start, vector hit, vector end)

Functions

 STATIC_INIT (g_warpzones)
void WarpZone_Camera_SetUp (entity e, vector my_org, vector my_ang)
entity WarpZone_Find (vector mi, vector ma)
entity WarpZone_FindRadius (vector org, float radius, float needlineofsight)
void WarpZone_MakeAllOther ()
void WarpZone_MakeAllSolid ()
float WarpZone_PlaneDist (entity wz, vector v)
void WarpZone_RefSys_Add (entity me, entity wz)
void WarpZone_RefSys_AddIncrementally (entity me, entity ref)
void WarpZone_RefSys_AddInverse (entity me, entity wz)
void WarpZone_RefSys_AddInverseTransform (entity me, vector t, vector s)
void WarpZone_RefSys_AddTransform (entity me, vector t, vector s)
void WarpZone_RefSys_BeginAddingIncrementally (entity me, entity ref)
void WarpZone_RefSys_Clear (entity me)
void WarpZone_RefSys_Copy (entity me, entity from)
entity WarpZone_RefSys_SpawnSameRefSys (entity me)
vector WarpZone_RefSys_TransformAngles (entity from, entity to, vector ang)
vector WarpZone_RefSys_TransformOrigin (entity from, entity to, vector org)
vector WarpZone_RefSys_TransformVAngles (entity from, entity to, vector ang)
vector WarpZone_RefSys_TransformVelocity (entity from, entity to, vector vel)
void WarpZone_SetUp (entity e, vector my_org, vector my_ang, vector other_org, vector other_ang)
float WarpZone_TargetPlaneDist (entity wz, vector v)
void WarpZone_TraceBox (vector org, vector min, vector max, vector end, float nomonsters, entity forent)
void WarpZone_TraceBox_ThroughZone (vector org, vector min, vector max, vector end, float nomonsters, entity forent, entity zone, WarpZone_trace_callback_t cb)
void WarpZone_TraceLine (vector org, vector end, float nomonsters, entity forent)
void WarpZone_TraceToss (entity e, entity forent)
void WarpZone_TraceToss_ThroughZone (entity e, entity forent, entity zone, WarpZone_trace_callback_t cb)
void WarpZone_TrailParticles (entity own, float eff, vector org, vector end)
void WarpZone_TrailParticles_WithMultiplier (entity own, float eff, vector org, vector end, float f, float boxflags)
vector WarpZone_TransformAngles (entity wz, vector v)
vector WarpZone_TransformOrigin (entity wz, vector v)
vector WarpZone_TransformVAngles (entity wz, vector v)
vector WarpZone_TransformVelocity (entity wz, vector v)
vector WarpZone_UnTransformAngles (entity wz, vector v)
vector WarpZone_UnTransformOrigin (entity wz, vector v)
vector WarpZone_UnTransformVAngles (entity wz, vector v)
vector WarpZone_UnTransformVelocity (entity wz, vector v)
float WarpZoneLib_BoxTouchesBrush (vector mi, vector ma, entity e, entity ig)
bool WarpZoneLib_ExactTrigger_Touch (entity this, entity toucher, bool touchfunc)
int WarpZoneLib_MoveOutOfSolid (entity e)
vector WarpZoneLib_NearestPointOnBox (vector mi, vector ma, vector org)

Variables

IntrusiveList g_warpzones
vector warpzone_angles
float warpzone_cameras_exist
float warpzone_fadeend
float warpzone_fadestart
vector WarpZone_findradius_dist
vector WarpZone_findradius_findorigin
float WarpZone_findradius_findradius
vector WarpZone_findradius_nearest
vector warpzone_forward
float warpzone_isboxy
vector warpzone_origin
vector warpzone_shift
vector warpzone_targetangles
vector warpzone_targetforward
vector warpzone_targetorigin
var WarpZone_trace_callback_t WarpZone_trace_callback_t_null
entity WarpZone_trace_firstzone
entity WarpZone_trace_forent
entity WarpZone_trace_lastzone
entity WarpZone_trace_transform
float WarpZone_tracetoss_time
vector WarpZone_tracetoss_velocity
vector warpzone_transform
float warpzone_warpzones_exist

Macro Definition Documentation

◆ BITCLR

#define BITCLR ( a,
b )
Value:
((a) & ~(b))

Definition at line 95 of file common.qh.

◆ BITCLR_ASSIGN

#define BITCLR_ASSIGN ( a,
b )
Value:
((a) &= ~(b))

Definition at line 104 of file common.qh.

Referenced by WarpZone_TeleportPlayer(), and WarpZone_TraceBox_ThroughZone().

◆ BITSET

#define BITSET ( a,
b )
Value:
((a) | (b))

Definition at line 98 of file common.qh.

◆ BITSET_ASSIGN

◆ BITXOR

#define BITXOR ( a,
b )
Value:
(((a) ^ (b))

Definition at line 101 of file common.qh.

◆ BITXOR_ASSIGN

#define BITXOR_ASSIGN ( a,
b )
Value:
((a) ^= (b))

Definition at line 110 of file common.qh.

Referenced by anim_set(), animdecide_setframes(), CheatCommand(), TeleportPlayer(), and WarpZone_TeleportPlayer().

◆ EXACTTRIGGER_INIT

◆ EXACTTRIGGER_TOUCH

◆ MOVE_NOTHING

#define MOVE_NOTHING   -1

Definition at line 36 of file common.qh.

Referenced by Draw_GrapplingHook(), VaporizerBeam_Draw(), and WarpZone_TraceBox_ThroughZone().

◆ move_out_of_solid

#define move_out_of_solid ( e)

Typedef Documentation

◆ WarpZone_trace_callback_t

Definition at line 38 of file common.qh.

Function Documentation

◆ STATIC_INIT()

STATIC_INIT ( g_warpzones )

Definition at line 7 of file common.qh.

8{
10}
#define IL_NEW()
IntrusiveList g_warpzones
Definition common.qh:6

References g_warpzones, and IL_NEW.

◆ WarpZone_Camera_SetUp()

void WarpZone_Camera_SetUp ( entity e,
vector my_org,
vector my_ang )

Definition at line 89 of file common.qc.

90{
91 e.warpzone_origin = my_org;
92 e.warpzone_angles = my_ang;
94}
vector WarpZone_Camera_camera_transform(entity this, vector org, vector ang)
Definition common.qc:76
#define setcamera_transform(e, f)
Definition self.qh:97

References entity(), setcamera_transform, vector, and WarpZone_Camera_camera_transform().

Referenced by NET_HANDLE(), WarpZoneCamera_InitStep_FindTarget(), and WarpZoneCamera_Think().

◆ WarpZone_Find()

entity WarpZone_Find ( vector mi,
vector ma )

Definition at line 158 of file common.qc.

159{
160 // if we are near any warpzone planes - MOVE AWAY (work around nearclip)
162 return NULL;
163 IL_EACH(g_warpzones, WarpZoneLib_BoxTouchesBrush(mi, ma, it, NULL), return it);
164 return NULL;
165}
#define IL_EACH(this, cond, body)
float WarpZoneLib_BoxTouchesBrush(vector mi, vector ma, entity e, entity ig)
Definition common.qc:126
float warpzone_warpzones_exist
Definition common.qh:12
#define NULL
Definition post.qh:14

References entity(), g_warpzones, IL_EACH, NULL, vector, warpzone_warpzones_exist, and WarpZoneLib_BoxTouchesBrush().

Referenced by WarpZone_FixNearClip(), WarpZone_FixPMove(), WarpZone_FixView(), WarpZone_StartFrame(), WarpZone_TraceBox_ThroughZone(), and WarpZone_TraceToss_ThroughZone().

◆ WarpZone_FindRadius()

entity WarpZone_FindRadius ( vector org,
float radius,
float needlineofsight )

References ang, entity(), org, radius, and vector.

◆ WarpZone_MakeAllOther()

void WarpZone_MakeAllOther ( )

Definition at line 174 of file common.qc.

175{
177 return;
178 IL_EACH(g_warpzones, true, it.solid = SOLID_TRIGGER);
179}
const float SOLID_TRIGGER

References g_warpzones, IL_EACH, SOLID_TRIGGER, and warpzone_warpzones_exist.

Referenced by WarpZone_TraceBox_ThroughZone(), and WarpZone_TraceToss_ThroughZone().

◆ WarpZone_MakeAllSolid()

void WarpZone_MakeAllSolid ( )

Definition at line 167 of file common.qc.

168{
170 return;
171 IL_EACH(g_warpzones, true, it.solid = SOLID_BSP);
172}
const float SOLID_BSP

References g_warpzones, IL_EACH, SOLID_BSP, and warpzone_warpzones_exist.

Referenced by WarpZone_TraceBox_ThroughZone(), and WarpZone_TraceToss_ThroughZone().

◆ WarpZone_PlaneDist()

float WarpZone_PlaneDist ( entity wz,
vector v )

Definition at line 476 of file common.qc.

477{
478 return (v - wz.warpzone_origin) * wz.warpzone_forward;
479}

References entity(), and vector.

Referenced by WarpZone_FixNearClip(), WarpZone_StartFrame(), and WarpZone_Touch().

◆ WarpZone_RefSys_Add()

void WarpZone_RefSys_Add ( entity me,
entity wz )

Definition at line 705 of file common.qc.

706{
707 WarpZone_RefSys_AddTransform(me, wz.warpzone_transform, wz.warpzone_shift);
708}
void WarpZone_RefSys_AddTransform(entity me, vector t, vector s)
Definition common.qc:697

References entity(), and WarpZone_RefSys_AddTransform().

Referenced by WarpZone_Teleport().

◆ WarpZone_RefSys_AddIncrementally()

void WarpZone_RefSys_AddIncrementally ( entity me,
entity ref )

Definition at line 723 of file common.qc.

724{
725 //vector t, s;
726 if (me.WarpZone_refsys_incremental_transform == ref.WarpZone_refsys.warpzone_transform)
727 if (me.WarpZone_refsys_incremental_shift == ref.WarpZone_refsys.warpzone_shift)
728 return;
729 WarpZone_Accumulator_AddInverseTransform(me.WarpZone_refsys, me.WarpZone_refsys_incremental_transform, me.WarpZone_refsys_incremental_shift);
730 WarpZone_Accumulator_Add(me.WarpZone_refsys, ref.WarpZone_refsys);
731 me.WarpZone_refsys_incremental_shift = ref.WarpZone_refsys.warpzone_shift;
732 me.WarpZone_refsys_incremental_transform = ref.WarpZone_refsys.warpzone_transform;
733}
void WarpZone_Accumulator_AddInverseTransform(entity acc, vector t, vector s)
Definition common.qc:27
void WarpZone_Accumulator_Add(entity acc, entity wz)
Definition common.qc:23

References entity(), WarpZone_Accumulator_Add(), and WarpZone_Accumulator_AddInverseTransform().

Referenced by GrapplingHookThink().

◆ WarpZone_RefSys_AddInverse()

void WarpZone_RefSys_AddInverse ( entity me,
entity wz )

Definition at line 717 of file common.qc.

718{
719 WarpZone_RefSys_AddInverseTransform(me, wz.warpzone_transform, wz.warpzone_shift);
720}
void WarpZone_RefSys_AddInverseTransform(entity me, vector t, vector s)
Definition common.qc:709

References entity(), and WarpZone_RefSys_AddInverseTransform().

Referenced by ctf_Handle_Throw(), and Monster_Enemy_Check().

◆ WarpZone_RefSys_AddInverseTransform()

void WarpZone_RefSys_AddInverseTransform ( entity me,
vector t,
vector s )

Definition at line 709 of file common.qc.

710{
711 if (t != '0 0 0' || s != '0 0 0')
712 {
714 WarpZone_Accumulator_AddInverseTransform(me.WarpZone_refsys, t, s);
715 }
716}
void WarpZone_RefSys_CheckCreate(entity me)
Definition common.qc:678

References entity(), vector, WarpZone_Accumulator_AddInverseTransform(), and WarpZone_RefSys_CheckCreate().

Referenced by WarpZone_RefSys_AddInverse().

◆ WarpZone_RefSys_AddTransform()

void WarpZone_RefSys_AddTransform ( entity me,
vector t,
vector s )

Definition at line 697 of file common.qc.

698{
699 if (t != '0 0 0' || s != '0 0 0')
700 {
702 WarpZone_Accumulator_AddTransform(me.WarpZone_refsys, t, s);
703 }
704}
void WarpZone_Accumulator_AddTransform(entity acc, vector t, vector s)
Definition common.qc:16

References entity(), vector, WarpZone_Accumulator_AddTransform(), and WarpZone_RefSys_CheckCreate().

Referenced by WarpZone_RefSys_Add().

◆ WarpZone_RefSys_BeginAddingIncrementally()

void WarpZone_RefSys_BeginAddingIncrementally ( entity me,
entity ref )

Definition at line 734 of file common.qc.

735{
736 me.WarpZone_refsys_incremental_shift = ref.WarpZone_refsys.warpzone_shift;
737 me.WarpZone_refsys_incremental_transform = ref.WarpZone_refsys.warpzone_transform;
738}

References entity().

Referenced by GrapplingHookTouch().

◆ WarpZone_RefSys_Clear()

void WarpZone_RefSys_Clear ( entity me)

Definition at line 689 of file common.qc.

690{
691 if (me.WarpZone_refsys)
692 {
693 delete(me.WarpZone_refsys);
694 me.WarpZone_refsys = NULL;
695 }
696}

References entity(), and NULL.

Referenced by WarpZone_RefSys_Copy().

◆ WarpZone_RefSys_Copy()

void WarpZone_RefSys_Copy ( entity me,
entity from )

Definition at line 771 of file common.qc.

772{
773 if (from.WarpZone_refsys)
774 {
776 me.WarpZone_refsys.warpzone_shift = from.WarpZone_refsys.warpzone_shift;
777 me.WarpZone_refsys.warpzone_transform = from.WarpZone_refsys.warpzone_transform;
778 }
779 else
781}
void WarpZone_RefSys_Clear(entity me)
Definition common.qc:689

References entity(), WarpZone_RefSys_CheckCreate(), and WarpZone_RefSys_Clear().

Referenced by ctf_Handle_Throw(), Monster_Enemy_Check(), and WarpZone_RefSys_SpawnSameRefSys().

◆ WarpZone_RefSys_SpawnSameRefSys()

entity WarpZone_RefSys_SpawnSameRefSys ( entity me)

Definition at line 782 of file common.qc.

783{
784 entity e = spawn();
786 return e;
787}
var entity(vector mins, vector maxs,.entity tofield) findbox_tofield_OrFallback
#define spawn
void WarpZone_RefSys_Copy(entity me, entity from)
Definition common.qc:771

References entity(), spawn, and WarpZone_RefSys_Copy().

Referenced by FireGrapplingHook(), W_Devastator_Attack(), and W_MineLayer_Attack().

◆ WarpZone_RefSys_TransformAngles()

vector WarpZone_RefSys_TransformAngles ( entity from,
entity to,
vector ang )

Definition at line 755 of file common.qc.

756{
757 if (from.WarpZone_refsys)
758 ang = WarpZone_UnTransformAngles(from.WarpZone_refsys, ang);
759 if (to.WarpZone_refsys)
760 ang = WarpZone_TransformAngles(to.WarpZone_refsys, ang);
761 return ang;
762}
vector WarpZone_TransformAngles(entity wz, vector v)
Definition common.qc:496
vector WarpZone_UnTransformAngles(entity wz, vector v)
Definition common.qc:529
vector vector ang
Definition self.qh:96

References ang, entity(), vector, WarpZone_TransformAngles(), and WarpZone_UnTransformAngles().

◆ WarpZone_RefSys_TransformOrigin()

vector WarpZone_RefSys_TransformOrigin ( entity from,
entity to,
vector org )

Definition at line 739 of file common.qc.

740{
741 if (from.WarpZone_refsys)
742 org = WarpZone_UnTransformOrigin(from.WarpZone_refsys, org);
743 if (to.WarpZone_refsys)
744 org = WarpZone_TransformOrigin(to.WarpZone_refsys, org);
745 return org;
746}
vector WarpZone_UnTransformOrigin(entity wz, vector v)
Definition common.qc:519
vector WarpZone_TransformOrigin(entity wz, vector v)
Definition common.qc:486
vector org
Definition self.qh:96

References entity(), org, vector, WarpZone_TransformOrigin(), and WarpZone_UnTransformOrigin().

Referenced by ctf_FlagThink(), ctf_Handle_Throw(), GrapplingHookThink(), Monster_Enemy_Check(), Monster_Move_Target(), W_Crylink_LinkJoin(), and W_Devastator_Think().

◆ WarpZone_RefSys_TransformVAngles()

vector WarpZone_RefSys_TransformVAngles ( entity from,
entity to,
vector ang )

Definition at line 763 of file common.qc.

764{
765 if (from.WarpZone_refsys)
766 ang = WarpZone_UnTransformVAngles(from.WarpZone_refsys, ang);
767 if (to.WarpZone_refsys)
768 ang = WarpZone_TransformVAngles(to.WarpZone_refsys, ang);
769 return ang;
770}
vector WarpZone_UnTransformVAngles(entity wz, vector ang)
Definition common.qc:534
vector WarpZone_TransformVAngles(entity wz, vector ang)
Definition common.qc:501

References ang, entity(), vector, WarpZone_TransformVAngles(), and WarpZone_UnTransformVAngles().

◆ WarpZone_RefSys_TransformVelocity()

vector WarpZone_RefSys_TransformVelocity ( entity from,
entity to,
vector vel )

Definition at line 747 of file common.qc.

748{
749 if (from.WarpZone_refsys)
750 vel = WarpZone_UnTransformVelocity(from.WarpZone_refsys, vel);
751 if (to.WarpZone_refsys)
752 vel = WarpZone_TransformVelocity(to.WarpZone_refsys, vel);
753 return vel;
754}
vector WarpZone_UnTransformVelocity(entity wz, vector v)
Definition common.qc:524
vector WarpZone_TransformVelocity(entity wz, vector v)
Definition common.qc:491

References entity(), vector, WarpZone_TransformVelocity(), and WarpZone_UnTransformVelocity().

Referenced by GrapplingHookThink(), W_Crylink_LinkJoin(), and W_Devastator_Think().

◆ WarpZone_SetUp()

void WarpZone_SetUp ( entity e,
vector my_org,
vector my_ang,
vector other_org,
vector other_ang )

Definition at line 60 of file common.qc.

61{
62 e.warpzone_transform = AnglesTransform_RightDivide(other_ang, AnglesTransform_TurnDirectionFR(my_ang));
63 e.warpzone_shift = AnglesTransform_PrePostShift_GetPostShift(my_org, e.warpzone_transform, other_org);
64 e.warpzone_origin = my_org;
65 e.warpzone_targetorigin = other_org;
66 e.warpzone_angles = my_ang;
67 e.warpzone_targetangles = other_ang;
68 vector forward, right, up;
69 FIXED_MAKE_VECTORS(my_ang, forward, right, up);
70 e.warpzone_forward = forward;
71 FIXED_MAKE_VECTORS(other_ang, forward, right, up);
72 e.warpzone_targetforward = forward;
74}
vector AnglesTransform_TurnDirectionFR(vector transform)
vector AnglesTransform_RightDivide(vector to_transform, vector from_transform)
vector AnglesTransform_PrePostShift_GetPostShift(vector sf, vector t, vector st)
#define FIXED_MAKE_VECTORS(angles, forward, right, up)
vector WarpZone_camera_transform(entity this, vector org, vector ang)
Definition common.qc:39
vector
Definition self.qh:96

References AnglesTransform_PrePostShift_GetPostShift(), AnglesTransform_RightDivide(), AnglesTransform_TurnDirectionFR(), entity(), FIXED_MAKE_VECTORS, setcamera_transform, vector, and WarpZone_camera_transform().

Referenced by NET_HANDLE(), and WarpZone_InitStep_FinalizeTransform().

◆ WarpZone_TargetPlaneDist()

float WarpZone_TargetPlaneDist ( entity wz,
vector v )

Definition at line 481 of file common.qc.

482{
483 return (v - wz.warpzone_targetorigin) * wz.warpzone_targetforward;
484}

References entity(), and vector.

Referenced by WarpZone_Teleport().

◆ WarpZone_TraceBox()

void WarpZone_TraceBox ( vector org,
vector min,
vector max,
vector end,
float nomonsters,
entity forent )

Definition at line 323 of file common.qc.

324{
325 WarpZone_TraceBox_ThroughZone(org, mi, ma, end, nomonsters, forent, NULL, WarpZone_trace_callback_t_null);
326}
void WarpZone_TraceBox_ThroughZone(vector org, vector mi, vector ma, vector end, float nomonsters, entity forent, entity zone, WarpZone_trace_callback_t cb)
Definition common.qc:192
var WarpZone_trace_callback_t WarpZone_trace_callback_t_null
Definition common.qh:39

References entity(), NULL, org, vector, WarpZone_trace_callback_t_null, and WarpZone_TraceBox_ThroughZone().

Referenced by CommonCommand_editmob(), tracebox_antilag_force_wz(), View_EventChase(), and WarpZone_TraceLine().

◆ WarpZone_TraceBox_ThroughZone()

void WarpZone_TraceBox_ThroughZone ( vector org,
vector min,
vector max,
vector end,
float nomonsters,
entity forent,
entity zone,
WarpZone_trace_callback_t cb )

Definition at line 192 of file common.qc.

193{
194 float nomonsters_adjusted;
195 float frac, sol, i;
196 float contentshack;
197
198 WarpZone_trace_forent = forent;
203 {
204 if (nomonsters == MOVE_NOTHING)
205 {
206 trace_endpos = end;
207 trace_fraction = 1;
208 if (cb)
209 cb(org, trace_endpos, end);
210 return;
211 }
212 else
213 {
214 tracebox(org, mi, ma, end, nomonsters, WarpZone_trace_forent);
215 if (cb)
216 cb(org, trace_endpos, end);
217 return;
218 }
219 }
220
221 vector vf = v_forward;
222 vector vr = v_right;
223 vector vu = v_up;
224
225 switch (nomonsters)
226 {
227 case MOVE_WORLDONLY:
228 case MOVE_NOTHING:
229 nomonsters_adjusted = MOVE_NOMONSTERS;
230 break;
231 default:
232 nomonsters_adjusted = nomonsters;
233 break;
234 }
235 if ((contentshack = (WarpZone_trace_forent.dphitcontentsmask && !(WarpZone_trace_forent.dphitcontentsmask & DPCONTENTS_SOLID))))
237
238 // if starting in warpzone, first transform
239 entity wz = WarpZone_Find(org + mi, org + ma);
240 if (wz)
241 {
244 if (zone && wz != zone)
245 {
246 // we are in ANOTHER warpzone. This is bad. Make a zero length trace and return.
247 sol = 1;
248 trace_fraction = 0;
250 goto fail;
251 }
254 end = WarpZone_TransformOrigin(wz, end);
255 }
257 sol = -1;
258 frac = 0;
259 i = 16;
260 for (;;)
261 {
262 if (--i < 1)
263 {
264 LOG_TRACE("Too many warpzones in sequence, aborting trace.");
265 trace_ent = NULL;
266 break;
267 }
268 tracebox(org, mi, ma, end, nomonsters_adjusted, WarpZone_trace_forent);
269 if (cb)
270 cb(org, trace_endpos, end);
271 if (sol < 0)
272 sol = trace_startsolid;
273
274 frac = trace_fraction = frac + (1 - frac) * trace_fraction;
275 if (trace_fraction >= 1)
276 break;
277 if (trace_ent.classname != "trigger_warpzone")
278 {
279 if (nomonsters == MOVE_NOTHING
280 || (nomonsters == MOVE_WORLDONLY && trace_ent)
281 || (contentshack && (trace_dphitcontents & WarpZone_trace_forent.dphitcontentsmask) == DPCONTENTS_SOLID))
282 {
283 // continue the trace, ignoring this hit (we only care for warpzones)
284 org = trace_endpos + normalize(end - org);
285 continue;
286 // we cannot do an inverted trace here, as we do care for further warpzones inside that "solid" to be found
287 // otherwise, players could block entrances that way
288 }
289 break;
290 }
291 /*if (trace_ent == wz)
292 {
293 // FIXME can this check be removed? Do we really need it?
294 LOG_TRACE("I transformed into the same zone again, wtf, aborting the trace");
295 trace_ent = NULL;
296 break;
297 }*/
298 wz = trace_ent;
302 if (zone && wz != zone)
303 break;
305 // we hit a warpzone... so, let's perform the trace after the warp again
307 end = WarpZone_TransformOrigin(wz, end);
308
309 // we got warped, so let's step back a bit
310 tracebox(org, mi, ma, org + normalize(org - end) * 32, nomonsters_adjusted, WarpZone_trace_forent);
312 }
314LABEL(fail)
315 if (contentshack)
317 trace_startsolid = sol;
318 v_forward = vf;
319 v_right = vr;
320 v_up = vu;
321}
#define LABEL(id)
Definition compiler.qh:34
vector v_up
const float MOVE_NOMONSTERS
float trace_dphitcontents
entity trace_ent
float DPCONTENTS_SOLID
vector v_right
vector trace_endpos
float trace_startsolid
float MOVE_WORLDONLY
vector v_forward
float trace_fraction
entity WarpZone_Find(vector mi, vector ma)
Definition common.qc:158
void WarpZone_Trace_InitTransform()
Definition common.qc:181
void WarpZone_MakeAllOther()
Definition common.qc:174
void WarpZone_MakeAllSolid()
Definition common.qc:167
void WarpZone_Trace_AddTransform(entity wz)
Definition common.qc:187
entity WarpZone_trace_firstzone
Definition common.qh:41
#define BITSET_ASSIGN(a, b)
Definition common.qh:107
#define BITCLR_ASSIGN(a, b)
Definition common.qh:104
entity WarpZone_trace_lastzone
Definition common.qh:42
#define MOVE_NOTHING
Definition common.qh:36
entity WarpZone_trace_forent
Definition common.qh:37
#define LOG_TRACE(...)
Definition log.qh:74
vector normalize(vector v)

References BITCLR_ASSIGN, BITSET_ASSIGN, DPCONTENTS_SOLID, entity(), LABEL, LOG_TRACE, MOVE_NOMONSTERS, MOVE_NOTHING, MOVE_WORLDONLY, normalize(), NULL, org, trace_dphitcontents, trace_endpos, trace_ent, trace_fraction, trace_startsolid, v_forward, v_right, v_up, vector, WarpZone_Find(), WarpZone_MakeAllOther(), WarpZone_MakeAllSolid(), WarpZone_Trace_AddTransform(), WarpZone_trace_firstzone, WarpZone_trace_forent, WarpZone_Trace_InitTransform(), WarpZone_trace_lastzone, WarpZone_TransformOrigin(), and warpzone_warpzones_exist.

Referenced by Draw_ArcBeam(), Draw_GrapplingHook(), fireBullet_falloff(), VaporizerBeam_Draw(), WarpZone_TraceBox(), WarpZone_TrailParticles(), and WarpZone_TrailParticles_WithMultiplier().

◆ WarpZone_TraceLine()

void WarpZone_TraceLine ( vector org,
vector end,
float nomonsters,
entity forent )

Definition at line 328 of file common.qc.

329{
330 WarpZone_TraceBox(org, '0 0 0', '0 0 0', end, nomonsters, forent);
331}
void WarpZone_TraceBox(vector org, vector mi, vector ma, vector end, float nomonsters, entity forent)
Definition common.qc:323

References entity(), org, vector, and WarpZone_TraceBox().

Referenced by CommonCommand_editmob(), ctf_CalculatePassVelocity(), ctf_FlagThink(), Draw_ArcBeam(), HUD_Crosshair(), Monster_Enemy_Check(), RadiusDamageForSource(), sandbox_ObjectSpawn(), View_EventChase(), W_Electro_TriggerCombo(), and W_SetupShot_Dir_ProjectileSize_Range().

◆ WarpZone_TraceToss()

void WarpZone_TraceToss ( entity e,
entity forent )

Definition at line 439 of file common.qc.

440{
442}
void WarpZone_TraceToss_ThroughZone(entity e, entity forent, entity zone, WarpZone_trace_callback_t cb)
Definition common.qc:333

References entity(), NULL, WarpZone_trace_callback_t_null, and WarpZone_TraceToss_ThroughZone().

◆ WarpZone_TraceToss_ThroughZone()

void WarpZone_TraceToss_ThroughZone ( entity e,
entity forent,
entity zone,
WarpZone_trace_callback_t cb )

Definition at line 333 of file common.qc.

334{
335 vector o0 = e.origin;
336 vector v0 = e.velocity;
337 float g = PHYS_GRAVITY(NULL) * e.gravity;
338 float dt, i;
339
340 WarpZone_trace_forent = forent;
346 {
347 tracetoss(e, WarpZone_trace_forent);
348 if (cb)
349 cb(e.origin, trace_endpos, trace_endpos);
350 dt = vlen(e.origin - o0) / vlen(e.velocity);
352 e.velocity_z -= dt * g;
353 WarpZone_tracetoss_velocity = e.velocity;
354 e.velocity = v0;
355 return;
356 }
357
358 vector vf = v_forward;
359 vector vr = v_right;
360 vector vu = v_up;
361
362 // if starting in warpzone, first transform
363 entity wz = WarpZone_Find(e.origin + e.mins, e.origin + e.maxs);
364 if (wz)
365 {
368 if (zone && wz != zone)
369 {
370 // we are in ANOTHER warpzone. This is bad. Make a zero length trace and return.
371
373 trace_endpos = o0;
374 goto fail;
375 }
377 vector org = WarpZone_TransformOrigin(wz, e.origin);
378 setorigin(e, org);
379 e.velocity = WarpZone_TransformVelocity(wz, e.velocity);
380 }
382 i = 16;
383 for (;;)
384 {
385 if (--i < 1)
386 {
387 LOG_TRACE("Too many warpzones in sequence, aborting trace.");
388 trace_ent = NULL;
389 break;
390 }
391 tracetoss(e, WarpZone_trace_forent);
392 if (cb)
393 cb(e.origin, trace_endpos, trace_endpos);
394 dt = vlen(trace_endpos - e.origin) / vlen(e.velocity);
396 e.origin = trace_endpos;
397 e.velocity_z -= dt * g;
398 if (trace_fraction >= 1)
399 break;
400 if (trace_ent.classname != "trigger_warpzone")
401 break;
402 if (trace_ent == wz)
403 {
404 // FIXME can this check be removed? Do we really need it?
405 LOG_TRACE("I transformed into the same zone again, wtf, aborting the trace");
406 trace_ent = NULL;
407 break;
408 }
409 wz = trace_ent;
413 if (zone && wz != zone)
414 break;
416 // we hit a warpzone... so, let's perform the trace after the warp again
417 e.origin = WarpZone_TransformOrigin(wz, e.origin);
418 e.velocity = WarpZone_TransformVelocity(wz, e.velocity);
419
420 // we got warped, so let's step back a bit
421 e.velocity = -e.velocity;
422 tracetoss(e, WarpZone_trace_forent);
423 dt = vlen(trace_endpos - e.origin) / vlen(e.velocity);
425 e.origin = trace_endpos;
426 e.velocity = -e.velocity;
427 }
429LABEL(fail)
430 WarpZone_tracetoss_velocity = e.velocity;
431 v_forward = vf;
432 v_right = vr;
433 v_up = vu;
434 // restore old entity data (caller just uses trace_endpos, WarpZone_tracetoss_velocity and the transform)
435 e.velocity = v0;
436 e.origin = o0;
437}
vector WarpZone_tracetoss_velocity
Definition common.qh:43
float WarpZone_tracetoss_time
Definition common.qh:44
float vlen(vector v)
#define PHYS_GRAVITY(s)
Definition movetypes.qh:53

References entity(), LABEL, LOG_TRACE, NULL, org, PHYS_GRAVITY, trace_endpos, trace_ent, trace_fraction, v_forward, v_right, v_up, vector, vlen(), WarpZone_Find(), WarpZone_MakeAllOther(), WarpZone_MakeAllSolid(), WarpZone_Trace_AddTransform(), WarpZone_trace_firstzone, WarpZone_trace_forent, WarpZone_Trace_InitTransform(), WarpZone_trace_lastzone, WarpZone_tracetoss_time, WarpZone_tracetoss_velocity, WarpZone_TransformOrigin(), WarpZone_TransformVelocity(), and warpzone_warpzones_exist.

Referenced by WarpZone_TraceToss().

◆ WarpZone_TrailParticles()

void WarpZone_TrailParticles ( entity own,
float eff,
vector org,
vector end )

◆ WarpZone_TrailParticles_WithMultiplier()

void WarpZone_TrailParticles_WithMultiplier ( entity own,
float eff,
vector org,
vector end,
float f,
float boxflags )

References entity(), org, and vector.

◆ WarpZone_TransformAngles()

vector WarpZone_TransformAngles ( entity wz,
vector v )

Definition at line 496 of file common.qc.

497{
498 return AnglesTransform_ApplyToAngles(wz.warpzone_transform, v);
499}
vector AnglesTransform_ApplyToAngles(vector transform, vector v)

References AnglesTransform_ApplyToAngles(), entity(), and vector.

Referenced by WarpZone_RefSys_TransformAngles(), and WarpZone_Teleport().

◆ WarpZone_TransformOrigin()

vector WarpZone_TransformOrigin ( entity wz,
vector v )

◆ WarpZone_TransformVAngles()

vector WarpZone_TransformVAngles ( entity wz,
vector v )

Definition at line 501 of file common.qc.

502{
503#ifdef KEEP_ROLL
504 float roll = ang.z;
505 ang.z = 0;
506#endif
507
508 ang = AnglesTransform_ApplyToVAngles(wz.warpzone_transform, ang);
509#ifdef KEEP_ROLL
512 ang.z = roll;
513#else
515#endif
516 return ang;
517}
vector AnglesTransform_ApplyToVAngles(vector transform, vector v)
vector AnglesTransform_CancelRoll(vector t)
vector AnglesTransform_Normalize(vector t, float minimize_roll)

References ang, AnglesTransform_ApplyToVAngles(), AnglesTransform_CancelRoll(), AnglesTransform_Normalize(), entity(), and vector.

Referenced by NET_HANDLE(), View_EventChase(), WarpZone_FixPMove(), WarpZone_FixView(), WarpZone_PlayerPhysics_FixVAngle(), WarpZone_RefSys_TransformVAngles(), and WarpZone_Teleport().

◆ WarpZone_TransformVelocity()

◆ WarpZone_UnTransformAngles()

vector WarpZone_UnTransformAngles ( entity wz,
vector v )

Definition at line 529 of file common.qc.

530{
531 return AnglesTransform_ApplyToAngles(AnglesTransform_Invert(wz.warpzone_transform), v);
532}
vector AnglesTransform_Invert(vector transform)

References AnglesTransform_ApplyToAngles(), AnglesTransform_Invert(), entity(), and vector.

Referenced by WarpZone_RefSys_TransformAngles().

◆ WarpZone_UnTransformOrigin()

◆ WarpZone_UnTransformVAngles()

vector WarpZone_UnTransformVAngles ( entity wz,
vector v )

Definition at line 534 of file common.qc.

535{
536#ifdef KEEP_ROLL
537 float roll = ang.z;
538 ang.z = 0;
539#endif
540
542#ifdef KEEP_ROLL
545 ang.z = roll;
546#else
548#endif
549 return ang;
550}

References ang, AnglesTransform_ApplyToVAngles(), AnglesTransform_CancelRoll(), AnglesTransform_Invert(), AnglesTransform_Normalize(), entity(), and vector.

Referenced by WarpZone_RefSys_TransformVAngles().

◆ WarpZone_UnTransformVelocity()

vector WarpZone_UnTransformVelocity ( entity wz,
vector v )

Definition at line 524 of file common.qc.

525{
526 return AnglesTransform_Apply(AnglesTransform_Invert(wz.warpzone_transform), v);
527}

References AnglesTransform_Apply(), AnglesTransform_Invert(), entity(), and vector.

Referenced by WarpZone_RefSys_TransformVelocity().

◆ WarpZoneLib_BoxTouchesBrush()

float WarpZoneLib_BoxTouchesBrush ( vector mi,
vector ma,
entity e,
entity ig )

Definition at line 126 of file common.qc.

127{
128 // bones_was_here: TODO: when findbox_OrFallback() is available, use it to
129 // optimise this into a single non-recursive function that only calls tracebox once
130
131 if (!e.modelindex || e.warpzone_isboxy)
132 return 1;
133
134 // work around trigger_hurt on geit3ctf1 not being detected by tracebox
135 // bones_was_here: FIXME: WHY do these triggers only have supercontents == 128 ?!
136 if (Q3COMPAT_COMMON && ig != world)
137 ig.dphitcontentsmask |= 128;
138
139 float s = e.solid;
140 if (e.solid != SOLID_BSP)
141 {
142 e.solid = SOLID_BSP;
143 setorigin(e, e.origin); // update linking
144 }
145 float f = WarpZoneLib_BoxTouchesBrush_Recurse(mi, ma, e, ig);
146 if (e.solid != s) // if we needed to change .solid temporarily
147 {
148 e.solid = s; // restore it
149 setorigin(e, e.origin); // update linking
150 }
151
152 if (Q3COMPAT_COMMON && ig != world)
153 ig.dphitcontentsmask &= ~128;
154
155 return f;
156}
#define Q3COMPAT_COMMON
Definition stats.qh:370
float WarpZoneLib_BoxTouchesBrush_Recurse(vector mi, vector ma, entity e, entity ig)
Definition common.qc:98
#define world
Definition post.qh:15

References entity(), Q3COMPAT_COMMON, SOLID_BSP, vector, WarpZoneLib_BoxTouchesBrush_Recurse(), and world.

Referenced by havocbot_moveto(), Teleport_Find(), WarpZone_Find(), and WarpZoneLib_ExactTrigger_Touch().

◆ WarpZoneLib_ExactTrigger_Touch()

bool WarpZoneLib_ExactTrigger_Touch ( entity this,
entity toucher,
bool touchfunc )

Definition at line 789 of file common.qc.

790{
791 vector emin = toucher.absmin, emax = toucher.absmax;
792 if (!Q3COMPAT_COMMON)
793 {
794 // Xonotic and Nexuiz maps assume triggers will be activated by adjacent players
795 // prior to sv_legacy_bbox_expand 0 DP always did this for SVQC and never for CSQC
796 emin -= '1 1 1';
797 emax += '1 1 1';
798 }
799
800 // if called from a touch func, we can assume the boxes do overlap
801 if (!touchfunc && !boxesoverlap(emin, emax, this.absmin, this.absmax)) // quick
802 return false;
803
804 return WarpZoneLib_BoxTouchesBrush(emin, emax, this, toucher); // accurate
805}
vector absmax
vector absmin
entity entity toucher
Definition self.qh:76
ERASEABLE float boxesoverlap(vector m1, vector m2, vector m3, vector m4)
Requires that m2>m1 in all coordinates, and that m4>m3.
Definition vector.qh:72

References absmax, absmin, boxesoverlap(), entity(), Q3COMPAT_COMMON, toucher, vector, and WarpZoneLib_BoxTouchesBrush().

Referenced by conveyor_think(), func_ladder_think(), SV_PlayerPhysics(), swamp_think(), viewloc_think(), and WarpZone_StartFrame().

◆ WarpZoneLib_MoveOutOfSolid()

int WarpZoneLib_MoveOutOfSolid ( entity e)

Definition at line 822 of file common.qc.

823{
824 vector o = e.origin;
825 traceline(o, o, MOVE_WORLDONLY, e);
827 return 0; // too stuck, giving up
828
829 tracebox(o, e.mins, e.maxs, o, MOVE_WORLDONLY, e);
830 if (!trace_startsolid)
831 return -1; // wasn't stuck
832
833 vector m0 = e.mins;
834 vector m1 = e.maxs;
835 e.mins = '0 0 0';
836 e.maxs = '0 0 0';
837 WarpZoneLib_MoveOutOfSolid_Expand(e, eX * m0.x); e.mins_x = m0.x;
838 WarpZoneLib_MoveOutOfSolid_Expand(e, eX * m1.x); e.maxs_x = m1.x;
839 WarpZoneLib_MoveOutOfSolid_Expand(e, eY * m0.y); e.mins_y = m0.y;
840 WarpZoneLib_MoveOutOfSolid_Expand(e, eY * m1.y); e.maxs_y = m1.y;
841 WarpZoneLib_MoveOutOfSolid_Expand(e, eZ * m0.z); e.mins_z = m0.z;
842 WarpZoneLib_MoveOutOfSolid_Expand(e, eZ * m1.z); e.maxs_z = m1.z;
843 setorigin(e, e.origin);
844
845 tracebox(e.origin, e.mins, e.maxs, e.origin, MOVE_WORLDONLY, e);
847 {
848 setorigin(e, o);
849 return 0; // can't fix
850 }
851
852 return 1; // was stuck but is fixed now
853}
void WarpZoneLib_MoveOutOfSolid_Expand(entity e, vector by)
Definition common.qc:808
const vector eY
Definition vector.qh:44
const vector eZ
Definition vector.qh:45
const vector eX
Definition vector.qh:43

References entity(), eX, eY, eZ, MOVE_WORLDONLY, trace_startsolid, vector, and WarpZoneLib_MoveOutOfSolid_Expand().

Referenced by CheckEngineExtensions(), and WarpZone_Teleport().

◆ WarpZoneLib_NearestPointOnBox()

vector WarpZoneLib_NearestPointOnBox ( vector mi,
vector ma,
vector org )

Definition at line 552 of file common.qc.

553{
554 vector nearest;
555 nearest.x = bound(mi.x, org.x, ma.x);
556 nearest.y = bound(mi.y, org.y, ma.y);
557 nearest.z = bound(mi.z, org.z, ma.z);
558 return nearest;
559}
float bound(float min, float value, float max)

References bound(), org, and vector.

Referenced by WarpZone_FindRadius_Recurse().

Variable Documentation

◆ g_warpzones

◆ warpzone_angles

◆ warpzone_cameras_exist

float warpzone_cameras_exist

Definition at line 13 of file common.qh.

Referenced by NET_HANDLE(), and WarpZoneCamera_InitStep_FindTarget().

◆ warpzone_fadeend

◆ warpzone_fadestart

◆ WarpZone_findradius_dist

vector WarpZone_findradius_dist

Definition at line 55 of file common.qh.

◆ WarpZone_findradius_findorigin

vector WarpZone_findradius_findorigin

Definition at line 58 of file common.qh.

◆ WarpZone_findradius_findradius

float WarpZone_findradius_findradius

Definition at line 59 of file common.qh.

◆ WarpZone_findradius_nearest

vector WarpZone_findradius_nearest

Definition at line 56 of file common.qh.

◆ warpzone_forward

vector warpzone_forward

Definition at line 19 of file common.qh.

◆ warpzone_isboxy

float warpzone_isboxy

◆ warpzone_origin

◆ warpzone_shift

vector warpzone_shift

Definition at line 16 of file common.qh.

◆ warpzone_targetangles

vector warpzone_targetangles

Definition at line 21 of file common.qh.

Referenced by WarpZone_Send().

◆ warpzone_targetforward

vector warpzone_targetforward

Definition at line 22 of file common.qh.

◆ warpzone_targetorigin

vector warpzone_targetorigin

Definition at line 20 of file common.qh.

Referenced by WarpZone_camera_transform(), and WarpZone_Send().

◆ WarpZone_trace_callback_t_null

var WarpZone_trace_callback_t WarpZone_trace_callback_t_null

Definition at line 39 of file common.qh.

Referenced by WarpZone_TraceBox(), and WarpZone_TraceToss().

◆ WarpZone_trace_firstzone

entity WarpZone_trace_firstzone

◆ WarpZone_trace_forent

◆ WarpZone_trace_lastzone

entity WarpZone_trace_lastzone

Definition at line 42 of file common.qh.

Referenced by WarpZone_TraceBox_ThroughZone(), and WarpZone_TraceToss_ThroughZone().

◆ WarpZone_trace_transform

◆ WarpZone_tracetoss_time

float WarpZone_tracetoss_time

Definition at line 44 of file common.qh.

Referenced by WarpZone_TraceToss_ThroughZone().

◆ WarpZone_tracetoss_velocity

vector WarpZone_tracetoss_velocity

Definition at line 43 of file common.qh.

Referenced by WarpZone_TraceToss_ThroughZone().

◆ warpzone_transform

vector warpzone_transform

Definition at line 23 of file common.qh.

Referenced by NET_HANDLE().

◆ warpzone_warpzones_exist