Cleanse the touch functions of the other evil
[xonotic/xonotic-data.pk3dir.git] / qcsrc / lib / warpzone / common.qh
1 #ifndef LIB_WARPZONE_COMMON_H
2 #define LIB_WARPZONE_COMMON_H
3
4 // uncomment this if your mod uses the roll angle in fixangle
5 // #define KEEP_ROLL
6
7 float warpzone_warpzones_exist;
8 float warpzone_cameras_exist;
9
10 .float warpzone_isboxy;
11 .vector warpzone_shift;
12 .vector warpzone_origin;
13 .vector warpzone_angles;
14 .vector warpzone_forward;
15 .vector warpzone_targetorigin;
16 .vector warpzone_targetangles;
17 .vector warpzone_targetforward;
18 .vector warpzone_transform;
19 .float warpzone_fadestart;
20 .float warpzone_fadeend;
21 void WarpZone_SetUp(entity e, vector my_org, vector my_ang, vector other_org, vector other_ang);
22 void WarpZone_Camera_SetUp(entity e, vector my_org, vector my_ang);
23
24 float WarpZoneLib_BoxTouchesBrush(vector mi, vector ma, entity e, entity ig);
25 vector WarpZoneLib_NearestPointOnBox(vector mi, vector ma, vector org);
26
27 entity WarpZone_Find(vector mi, vector ma);
28 void WarpZone_MakeAllSolid();
29 void WarpZone_MakeAllOther();
30
31 #define MOVE_NOTHING -1
32 entity WarpZone_trace_forent; // temp, callback is allowed to change it
33 USING(WarpZone_trace_callback_t, void(vector start, vector hit, vector end)); // called on every elementary trace
34 var WarpZone_trace_callback_t WarpZone_trace_callback_t_null;
35 entity WarpZone_trace_transform; // transform accumulator during a trace
36 entity WarpZone_trace_firstzone; // first warpzone hit by a trace (can differ from the requested zone in case of _ThroughZone, the trace is aborted then)
37 entity WarpZone_trace_lastzone; // first warpzone hit by a trace (can differ from the requested zone in case of _ThroughZone, the trace is aborted then)
38 vector WarpZone_tracetoss_velocity; // ending velocity of a tracetoss (post-transform)
39 float WarpZone_tracetoss_time; // duration of toss (approximate)
40 void WarpZone_TraceBox(vector org, vector min, vector max, vector end, float nomonsters, entity forent);
41 void WarpZone_TraceBox_ThroughZone(vector org, vector min, vector max, vector end, float nomonsters, entity forent, entity zone, WarpZone_trace_callback_t cb);
42 void WarpZone_TraceLine(vector org, vector end, float nomonsters, entity forent);
43 void WarpZone_TraceToss(entity e, entity forent);
44 void WarpZone_TraceToss_ThroughZone(entity e, entity forent, entity zone, WarpZone_trace_callback_t cb);
45 void WarpZone_TrailParticles(entity own, float eff, vector org, vector end);
46 #ifdef CSQC
47 void WarpZone_TrailParticles_WithMultiplier(entity own, float eff, vector org, vector end, float f, float boxflags);
48 #endif
49
50 .vector WarpZone_findradius_dist;
51 .vector WarpZone_findradius_nearest;
52 // also set: warpzone parameters, so WarpZone_TransformOrigin can transform vectors from blast's to victim's system
53 .vector WarpZone_findradius_findorigin;
54 .float WarpZone_findradius_findradius;
55 entity WarpZone_FindRadius(vector org, float radius, float needlineofsight);
56
57 float WarpZone_PlaneDist(entity wz, vector v);
58 float WarpZone_TargetPlaneDist(entity wz, vector v);
59 vector WarpZone_TransformOrigin(entity wz, vector v);
60 vector WarpZone_TransformVelocity(entity wz, vector v);
61 vector WarpZone_TransformAngles(entity wz, vector v);
62 vector WarpZone_TransformVAngles(entity wz, vector v);
63 vector WarpZone_UnTransformOrigin(entity wz, vector v);
64 vector WarpZone_UnTransformVelocity(entity wz, vector v);
65 vector WarpZone_UnTransformAngles(entity wz, vector v);
66 vector WarpZone_UnTransformVAngles(entity wz, vector v);
67
68 // reference systems (chained warpzone transforms)
69 void WarpZone_RefSys_Clear(entity me); // R := id
70 void WarpZone_RefSys_Add(entity me, entity wz); // me.R := wz me.R
71 void WarpZone_RefSys_AddInverse(entity me, entity wz); // me.R := wz^-1 me.R
72 void WarpZone_RefSys_AddTransform(entity me, vector t, vector s); // me.R := [t s] me.R
73 void WarpZone_RefSys_AddInverseTransform(entity me, vector t, vector s); // me.R := [t s]^-1 me.R
74
75 // makes this reference system track ref's changes
76 // NOTE: this is ONLY sensible if WarpZone_RefSys_Add is no longer called on "me" while doing this
77 // To achieve this, make sure no touch events on warpzone are raised by this entity
78 // or set a movetype that causes no warpzoning (e.g. MOVETYPE_NONE, MOVETYPE_FOLLOW)
79 void WarpZone_RefSys_AddIncrementally(entity me, entity ref); // me.R := ref.R me.Rref^-1 me.R; me.Rref := ref.R
80 void WarpZone_RefSys_BeginAddingIncrementally(entity me, entity ref); // me.Rref := ref.R
81
82 vector WarpZone_RefSys_TransformOrigin(entity from, entity to, vector org); // return to.R from.R^-1 org
83 vector WarpZone_RefSys_TransformVelocity(entity from, entity to, vector vel); // return to.R from.R^-1 vel
84 vector WarpZone_RefSys_TransformAngles(entity from, entity to, vector ang); // return to.R from.R^-1 ang
85 vector WarpZone_RefSys_TransformVAngles(entity from, entity to, vector ang); // return to.R from.R^-1 ang
86 void WarpZone_RefSys_Copy(entity me, entity from); // to.R := from.R
87 entity WarpZone_RefSys_SpawnSameRefSys(entity me); // spawn().R = me.R
88
89 #ifndef BITCLR
90 # define BITCLR(a,b) ((a) - ((a) & (b)))
91 #endif
92 #ifndef BITSET
93 # define BITSET(a,b) ((a) | (b))
94 #endif
95 #ifndef BITXOR
96 # define BITXOR(a,b) (((a) | (b)) - ((a) & (b)))
97 #endif
98 #ifndef BITCLR_ASSIGN
99 # define BITCLR_ASSIGN(a,b) ((a) = (a) - ((a) & (b)))
100 #endif
101 #ifndef BITSET_ASSIGN
102 # define BITSET_ASSIGN(a,b) ((a) |= (b))
103 #endif
104 #ifndef BITXOR_ASSIGN
105 # define BITXOR_ASSIGN(a,b) ((a) = ((a) | (b)) - ((a) & (b)))
106 #endif
107 float WarpZoneLib_MoveOutOfSolid(entity e);
108 #define move_out_of_solid(e) WarpZoneLib_MoveOutOfSolid(e)
109
110 float WarpZoneLib_ExactTrigger_Touch(entity this, entity toucher);
111 void WarpZoneLib_ExactTrigger_Init(entity this);
112
113 // WARNING: this kills the trace globals
114 #define EXACTTRIGGER_TOUCH(e,t) if(WarpZoneLib_ExactTrigger_Touch((e), (t))) return
115 #define EXACTTRIGGER_INIT  WarpZoneLib_ExactTrigger_Init(this)
116 #endif