13 acc.warpzone_transform =
'0 0 0';
14 acc.warpzone_shift =
'0 0 0';
20 acc.warpzone_transform = tr;
21 acc.warpzone_shift = st;
23#define WarpZone_Accumulator_Add(acc, wz) \
24 WarpZone_Accumulator_AddTransform(acc, (wz).warpzone_transform, (wz).warpzone_shift)
32#define WarpZone_Accumulator_AddInverse(acc, wz) \
33 WarpZone_Accumulator_AddInverseTransform(acc, (wz).warpzone_transform, (wz).warpzone_shift)
60 e.warpzone_origin = my_org;
61 e.warpzone_targetorigin = other_org;
62 e.warpzone_angles = my_ang;
63 e.warpzone_targetangles = other_ang;
66 e.warpzone_forward = forward;
68 e.warpzone_targetforward = forward;
87 e.warpzone_origin = my_org;
88 e.warpzone_angles = my_ang;
98 LOG_TRACE(
"hit a network ent, cannot continue WarpZoneLib_BoxTouchesBrush");
112 setorigin(se, se.origin);
115 setorigin(se, se.origin);
125 if (!e.modelindex || e.warpzone_isboxy)
131 ig.dphitcontentsmask |= 128;
137 setorigin(e, e.origin);
143 setorigin(e, e.origin);
147 ig.dphitcontentsmask &= ~128;
178#define WarpZone_Trace_AddTransform(wz) \
179 WarpZone_Accumulator_Add(WarpZone_trace_transform, wz)
190 bool nearby_warpzones =
false;
196 #define CHOOSE_AXIS(axis) \
197 if (org.axis < end.axis) { boxmin.axis += org.axis; boxmax.axis += end.axis; } \
198 else { boxmin.axis += end.axis; boxmax.axis += org.axis; }
209 nearby_warpzones = true;
213 if (!nearby_warpzones)
232 float nomonsters_adjusted;
240 nomonsters_adjusted = nomonsters;
254 if (zone && wz != zone)
274 LOG_TRACE(
"Too many warpzones in sequence, aborting trace.");
287 if (
trace_ent.classname !=
"trigger_warpzone")
312 if (zone && wz != zone)
352 e.velocity.z -= dt * g;
368 if (zone && wz != zone)
387 LOG_TRACE(
"Too many warpzones in sequence, aborting trace.");
397 e.velocity.z -= dt * g;
400 if (
trace_ent.classname !=
"trigger_warpzone")
405 LOG_TRACE(
"I transformed into the same zone again, wtf, aborting the trace");
413 if (zone && wz != zone)
421 e.velocity = -e.velocity;
426 e.velocity = -e.velocity;
480 return (p - wz.warpzone_origin) * wz.warpzone_forward;
485 return (p - wz.warpzone_targetorigin) * wz.warpzone_targetforward;
561#define WarpZoneLib_NearestPointOnBox(mi, ma, org) NearestPointOnBoundingBox(mi, ma, org)
575 string s = e.classname;
578 case "warpzone_refsys":
580 case "exteriorweaponentity":
581 case "sprite_waypoint":
585 case "chatbubbleentity":
596 return (cb && !cb(e));
620 bool is_warpzone = (it.classname ==
"trigger_warpzone");
622 && WarpZoneLib_BadEntity(it, _WarpZone_FindRadius_cond_cb))
624 it.WarpZone_findradius_hit = WarpZone_FindRadius_Hit_BAD;
625 it.WarpZone_findradius_next = _WarpZone_FindRadius_badents_first;
627 _WarpZone_FindRadius_badents_first = it;
641 it.WarpZone_findradius_nearest = p;
642 it.WarpZone_findradius_dist = org0 - p;
647 it.WarpZone_findradius_next = wz;
650 it.enemy.WarpZone_findradius_dist =
'0 0 0';
655 it.warpzone_transform = transform;
656 it.warpzone_shift = shift;
665 for (
entity e = wz; e; e = e.WarpZone_findradius_next)
673 rad -
max(8,
vlen(org_new - org0_new)),
682 bool nearby_warpzones =
false;
691 nearby_warpzones = true;
697 if (nearby_warpzones)
712 traceline(
org, p, nomonsters, it);
719 it.WarpZone_findradius_nearest = p;
720 it.WarpZone_findradius_dist =
org - p;
739 if (me.WarpZone_refsys.owner == me)
741 me.WarpZone_refsys =
new(warpzone_refsys);
742 me.WarpZone_refsys.owner = me;
747 if (!me.WarpZone_refsys)
749 delete(me.WarpZone_refsys);
750 me.WarpZone_refsys =
NULL;
754 if (t ==
'0 0 0' && s ==
'0 0 0')
761 if (t ==
'0 0 0' && s ==
'0 0 0')
771 if (me.WarpZone_refsys_incremental_transform == ref.WarpZone_refsys.warpzone_transform
772 && me.WarpZone_refsys_incremental_shift == ref.WarpZone_refsys.warpzone_shift)
776 me.WarpZone_refsys_incremental_shift = ref.WarpZone_refsys.warpzone_shift;
777 me.WarpZone_refsys_incremental_transform = ref.WarpZone_refsys.warpzone_transform;
781 me.WarpZone_refsys_incremental_shift = ref.WarpZone_refsys.warpzone_shift;
782 me.WarpZone_refsys_incremental_transform = ref.WarpZone_refsys.warpzone_transform;
789 if (from.WarpZone_refsys)
791 if (to.WarpZone_refsys)
798 if (from.WarpZone_refsys)
800 if (to.WarpZone_refsys)
807 if (from.WarpZone_refsys)
809 if (to.WarpZone_refsys)
816 if (from.WarpZone_refsys)
818 if (to.WarpZone_refsys)
826 if (from.WarpZone_refsys)
829 me.WarpZone_refsys.warpzone_shift = from.WarpZone_refsys.warpzone_shift;
830 me.WarpZone_refsys.warpzone_transform = from.WarpZone_refsys.warpzone_transform;
866 const float eps = 1/16;
867 tracebox(e.origin, e.mins -
'1 1 1' * eps, e.maxs +
'1 1 1' * eps, e.origin + by,
MOVE_WORLDONLY, e);
896 setorigin(e, e.origin);
var entity(vector mins, vector maxs,.entity tofield) findbox_tofield_OrFallback
const float MOVE_NOMONSTERS
float trace_dphitcontents
const float SOLID_TRIGGER
float trace_networkentity
float PARTICLES_DRAWASTRAIL
#define IL_EACH(this, cond, body)
#define FOREACH_LIST(list, next, cond, body)
#define FOREACH_ENTITY_RADIUS(org, dist, cond, body)
#define WarpZoneLib_NearestPointOnBox(mi, ma, org)
void WarpZone_RefSys_AddInverseTransform(entity me, vector t, vector s)
void WarpZone_SetUp(entity e, vector my_org, vector my_ang, vector other_org, vector other_ang)
entity WarpZone_SearchInRadius(vector org, float rad, float nomonsters, WarpZone_FindRadius_cond_callback_t cb)
Modified findradius aware of warpzones, that only includes entities that meet the "cb" criteria.
vector WarpZone_Camera_camera_transform(entity this, vector org, vector ang)
entity WarpZone_findradius_next
void WarpZone_TraceToss_ThroughZone(entity e, entity forent, entity zone, WarpZone_trace_callback_t cb)
Traces tossing e, shifting & transforming each time it goes through a warpzone.
void WarpZone_RefSys_Clear(entity me)
vector WarpZone_RefSys_TransformVelocity(entity from, entity to, vector vel)
Transform velocity vel in from's reference into to's reference.
entity WarpZone_Find(vector mi, vector ma)
float WarpZoneLib_BoxTouchesBrush(vector mi, vector ma, entity e, entity ig)
vector WarpZone_UnTransformVAngles(entity wz, vector ang)
Transforms v_angle ang backwards through warpzone wz, as the inverse of WarpZone_TransformVAngles.
float WarpZoneLib_BoxTouchesBrush_Recurse(vector mi, vector ma, entity e, entity ig)
const int WarpZone_FindRadius_Hit_GOOD
bool WarpZoneLib_ExactTrigger_Touch(entity this, entity toucher, bool touchfunc)
void WarpZone_Accumulator_Clear(entity acc)
void WarpZone_Trace_InitTransform()
void WarpZone_Camera_SetUp(entity e, vector my_org, vector my_ang)
void WarpZone_Accumulator_AddTransform(entity acc, vector t, vector s)
#define WarpZone_Trace_AddTransform(wz)
#define WarpZone_Accumulator_Add(acc, wz)
vector WarpZone_refsys_incremental_transform
vector WarpZone_UnTransformOrigin(entity wz, vector org)
Transforms origin org backwards through warpzone wz, as the inverse of WarpZone_TransformOrigin.
void WarpZone_TraceBox_ThroughZone(vector org, vector mi, vector ma, vector end, float nomonsters, entity forent, entity zone, WarpZone_trace_callback_t cb)
Traces a box from org to end, shifting & transforming each time it goes through a warpzone.
vector WarpZone_TransformVAngles(entity wz, vector ang)
Transforms v_angle ang across warpzone wz.
const int WarpZone_FindRadius_Hit_BAD
vector WarpZone_TransformOrigin(entity wz, vector org)
Transforms origin org across warpzone wz.
void WarpZone_TrailParticles_WithMultiplier(entity own, float eff, vector org, vector end, float f, int boxflags)
void WarpZone_RefSys_CheckCreate(entity me)
ACCUMULATE void ONREMOVE(entity this)
void WarpZone_RefSys_BeginAddingIncrementally(entity me, entity ref)
float WarpZone_TrailParticles_trace_callback_flags
void WarpZone_TrailParticles(entity own, float eff, vector org, vector end)
float WarpZone_TargetPlaneDist(entity wz, vector p)
void WarpZone_MakeAllOther()
entity WarpZone_TrailParticles_trace_callback_own
void WarpZone_RefSys_AddIncrementally(entity me, entity ref)
entity WarpZone_RefSys_SpawnSameRefSys(entity me)
Spawns an entity in the same warpzone reference as me, and sets up its reference.
float WarpZone_PlaneDist(entity wz, vector p)
vector WarpZone_UnTransformAngles(entity wz, vector ang)
Transforms angle ang backwards through warpzone wz, as the inverse of WarpZone_TransformAngles.
void _WarpZone_FindRadius_Recurse(vector org, float rad, vector org0, vector transform, vector shift)
vector WarpZone_refsys_incremental_shift
void WarpZone_RefSys_AddTransform(entity me, vector t, vector s)
void WarpZone_MakeAllSolid()
entity _WarpZone_FindRadius_badents_first
vector WarpZone_camera_transform(entity this, vector org, vector ang)
void WarpZone_TrailParticles_WithMultiplier_trace_callback(vector from, vector endpos, vector to)
vector WarpZone_TransformAngles(entity wz, vector ang)
Transforms angle v across warpzone wz.
vector WarpZone_RefSys_TransformOrigin(entity from, entity to, vector org)
Transform origin org in from's reference into to's reference.
float WarpZone_TrailParticles_trace_callback_f
void WarpZone_RefSys_Copy(entity me, entity from)
Copies the warpzone reference of from onto me.
int WarpZone_findradius_hit
vector WarpZone_UnTransformVelocity(entity wz, vector vel)
Transforms angle vel backwards through warpzone wz, as the inverse of WarpZone_TransformVelocity.
vector WarpZone_TransformVelocity(entity wz, vector vel)
Transforms velocity v across warpzone wz.
void WarpZone_Accumulator_AddInverseTransform(entity acc, vector t, vector s)
bool WarpZoneLib_BadEntity(entity e, WarpZone_FindRadius_cond_callback_t cb)
Blacklist of entities that WarpZone_FindRadius doesn't care about.
entity _WarpZone_FindRadius_goodents_first
void WarpZone_TrailParticles_trace_callback(vector from, vector endpos, vector to)
var WarpZone_FindRadius_cond_callback_t _WarpZone_FindRadius_cond_cb
#define CHOOSE_AXIS(axis)
void WarpZoneLib_MoveOutOfSolid_Expand(entity e, vector by)
float _WarpZone_FindRadius_nomonsters
float WarpZone_TrailParticles_trace_callback_eff
vector WarpZone_RefSys_TransformVAngles(entity from, entity to, vector ang)
Transform v_angle ang in from's reference into to's reference.
const int WarpZone_FindRadius_Hit_UNSEEN
vector WarpZone_RefSys_TransformAngles(entity from, entity to, vector ang)
Transform angle ang in from's reference into to's reference.
int WarpZoneLib_MoveOutOfSolid(entity e)
entity WarpZone_trace_firstzone
First warpzone hit by a trace (can differ from the requested zone in case of _ThroughZone,...
#define BITSET_ASSIGN(a, b)
#define WarpZone_TraceLine_ThroughZone(org, end, nomonsters, forent, zone, cb)
vector warpzone_targetorigin
void(vector start, vector hit, vector end) WarpZone_trace_callback_t
#define BITCLR_ASSIGN(a, b)
entity WarpZone_trace_lastzone
First warpzone hit by a trace (can differ from the requested zone in case of _ThroughZone,...
WarpZone_trace_callback_t te_csqc_trace_callback
vector WarpZone_tracetoss_velocity
Ending velocity of a tracetoss (post-transform).
entity WarpZone_trace_transform
Transform accumulator during a trace.
IntrusiveList g_warpzones
float warpzone_warpzones_exist
float WarpZone_tracetoss_time
Duration of toss (approximate).
bool(entity e) WarpZone_FindRadius_cond_callback_t
var void te_csqc_trace_callback_func(vector start, vector hit)
entity WarpZone_trace_forent
Temp, callback is allowed to change it.
#define new_pure(class)
purely logical entities (not linked to the area grid)
#define setcamera_transform(e, f)
#define startsWith(haystack, needle)
if(frag_attacker.flagcarried)
#define vdist(v, cmp, f)
Vector distance comparison, avoids sqrt().
ERASEABLE vector NearestPointOnBoundingBox(vector mi, vector ma, vector org)
ERASEABLE float boxesoverlap(vector m1, vector m2, vector m3, vector m4)
Requires that m2>m1 in all coordinates, and that m4>m3.