-float trace_dphitcontents;
-.float dphitcontentsmask;
-
void WarpZone_Accumulator_Clear(entity acc)
{
acc.warpzone_transform = '0 0 0';
}
void WarpZone_Accumulator_Add(entity acc, entity wz)
{
- vector t, st;
- t = AnglesTransform_Multiply(wz.warpzone_transform, acc.warpzone_transform);
- st = AnglesTransform_Multiply_GetPostShift(wz.warpzone_transform, wz.warpzone_shift, acc.warpzone_transform, acc.warpzone_shift);
- acc.warpzone_transform = t;
- acc.warpzone_shift = st;
+ WarpZone_Accumulator_AddTransform(acc, wz.warpzone_transform, wz.warpzone_shift);
+}
+void WarpZone_Accumulator_AddInverseTransform(entity acc, vector t, vector s)
+{
+ vector tt, ss;
+ tt = AnglesTransform_Invert(t);
+ ss = AnglesTransform_PrePostShift_GetPostShift(s, tt, '0 0 0');
+ WarpZone_Accumulator_AddTransform(acc, tt, ss);
+ // yes, this probably can be done simpler... but this way is "obvious" :)
+}
+void WarpZone_Accumulator_AddInverse(entity acc, entity wz)
+{
+ WarpZone_Accumulator_AddInverseTransform(acc, wz.warpzone_transform, wz.warpzone_shift);
}
.vector(vector, vector) camera_transform;
-var float autocvar_cl_warpzone_usetrace = 1;
+float autocvar_cl_warpzone_usetrace = 1;
vector WarpZone_camera_transform(vector org, vector ang)
{
vector vf, vr, vu;
return 0;
}
#endif
- if not(trace_ent)
+ if (!trace_ent)
return 0;
if (trace_ent == WarpZoneLib_BoxTouchesBrush_ent)
return 1;
sol = -1;
frac = 0;
i = 16;
- for(;;)
+ for(0;;)
{
if(--i < 1)
{
o0 = e.origin;
v0 = e.velocity;
+ g = cvar("sv_gravity") * e.gravity;
WarpZone_trace_forent = forent;
WarpZone_trace_firstzone = world;
e.velocity = WarpZone_TransformVelocity(wz, e.velocity);
}
WarpZone_MakeAllSolid();
- g = cvar("sv_gravity") * e.gravity;
i = 16;
- for(;;)
+ for(0;;)
{
if(--i < 1)
{
boxparticles(WarpZone_TrailParticles_trace_callback_eff, WarpZone_TrailParticles_trace_callback_own, from, endpos, WarpZone_TrailParticles_trace_callback_own.velocity, WarpZone_TrailParticles_trace_callback_own.velocity, WarpZone_TrailParticles_trace_callback_f, WarpZone_TrailParticles_trace_callback_flags);
}
-void WarpZone_TrailParticles_WithMultiplier(entity own, float eff, vector org, vector end, float f, float boxflags)
+void WarpZone_TrailParticles_WithMultiplier(entity own, float eff, vector org, vector end, float f, int boxflags)
{
WarpZone_TrailParticles_trace_callback_own = own;
WarpZone_TrailParticles_trace_callback_eff = eff;
WarpZone_TrailParticles_trace_callback_f = f;
- WarpZone_TrailParticles_trace_callback_flags = boxflags;
+ WarpZone_TrailParticles_trace_callback_flags = boxflags | PARTICLES_DRAWASTRAIL;
WarpZone_TraceBox_ThroughZone(org, '0 0 0', '0 0 0', end, MOVE_NOMONSTERS, world, world, WarpZone_TrailParticles_WithMultiplier_trace_callback);
}
#endif
{
#ifdef KEEP_ROLL
float roll;
- roll = ang_z;
+ roll = ang.z;
ang_z = 0;
#endif
ang = AnglesTransform_ApplyToVAngles(wz.warpzone_transform, ang);
#ifdef KEEP_ROLL
- ang = AnglesTransform_Normalize(ang, TRUE);
+ ang = AnglesTransform_Normalize(ang, true);
ang = AnglesTransform_CancelRoll(ang);
ang_z = roll;
#else
- ang = AnglesTransform_Normalize(ang, FALSE);
+ ang = AnglesTransform_Normalize(ang, false);
#endif
return ang;
{
float roll;
- roll = ang_z;
+ roll = ang.z;
ang_z = 0;
ang = AnglesTransform_ApplyToVAngles(AnglesTransform_Invert(wz.warpzone_transform), ang);
- ang = AnglesTransform_Normalize(ang, TRUE);
+ ang = AnglesTransform_Normalize(ang, true);
ang = AnglesTransform_CancelRoll(ang);
ang_z = roll;
vector WarpZoneLib_NearestPointOnBox(vector mi, vector ma, vector org)
{
vector nearest;
- nearest_x = bound(mi_x, org_x, ma_x);
- nearest_y = bound(mi_y, org_y, ma_y);
- nearest_z = bound(mi_z, org_z, ma_z);
+ nearest_x = bound(mi.x, org.x, ma.x);
+ nearest_y = bound(mi.y, org.y, ma.y);
+ nearest_z = bound(mi.z, org.z, ma.z);
return nearest;
}
if(self.owner.WarpZone_refsys != self)
remove(self);
}
-void WarpZone_RefSys_Add(entity me, entity wz)
+void WarpZone_RefSys_CheckCreate(entity me)
{
if(me.WarpZone_refsys.owner != me)
{
me.WarpZone_refsys.nextthink = time + 1;
WarpZone_Accumulator_Clear(me.WarpZone_refsys);
}
- if(wz)
- WarpZone_Accumulator_Add(me.WarpZone_refsys, wz);
+}
+void WarpZone_RefSys_Clear(entity me)
+{
+ if(me.WarpZone_refsys)
+ {
+ remove(me.WarpZone_refsys);
+ me.WarpZone_refsys = world;
+ }
+}
+void WarpZone_RefSys_AddTransform(entity me, vector t, vector s)
+{
+ if(t != '0 0 0' || s != '0 0 0')
+ {
+ WarpZone_RefSys_CheckCreate(me);
+ WarpZone_Accumulator_AddTransform(me.WarpZone_refsys, t, s);
+ }
+}
+void WarpZone_RefSys_Add(entity me, entity wz)
+{
+ WarpZone_RefSys_AddTransform(me, wz.warpzone_transform, wz.warpzone_shift);
+}
+void WarpZone_RefSys_AddInverseTransform(entity me, vector t, vector s)
+{
+ if(t != '0 0 0' || s != '0 0 0')
+ {
+ WarpZone_RefSys_CheckCreate(me);
+ WarpZone_Accumulator_AddInverseTransform(me.WarpZone_refsys, t, s);
+ }
+}
+void WarpZone_RefSys_AddInverse(entity me, entity wz)
+{
+ WarpZone_RefSys_AddInverseTransform(me, wz.warpzone_transform, wz.warpzone_shift);
}
.vector WarpZone_refsys_incremental_shift;
.vector WarpZone_refsys_incremental_transform;
void WarpZone_RefSys_AddIncrementally(entity me, entity ref)
{
- vector t, s;
+ //vector t, s;
if(me.WarpZone_refsys_incremental_transform == ref.WarpZone_refsys.warpzone_transform)
if(me.WarpZone_refsys_incremental_shift == ref.WarpZone_refsys.warpzone_shift)
return;
- if(me.WarpZone_refsys.owner != me)
- {
- me.WarpZone_refsys = spawn();
- me.WarpZone_refsys.classname = "warpzone_refsys";
- me.WarpZone_refsys.owner = me;
- me.WarpZone_refsys.think = WarpZone_RefSys_GC;
- me.WarpZone_refsys.nextthink = time + 1;
- WarpZone_Accumulator_Clear(me.WarpZone_refsys);
- }
- t = AnglesTransform_Invert(me.WarpZone_refsys_incremental_transform);
- s = AnglesTransform_PrePostShift_GetPostShift(me.WarpZone_refsys_incremental_shift, t, '0 0 0');
- WarpZone_Accumulator_AddTransform(me.WarpZone_refsys, t, s);
+ WarpZone_Accumulator_AddInverseTransform(me.WarpZone_refsys, me.WarpZone_refsys_incremental_transform, me.WarpZone_refsys_incremental_shift);
WarpZone_Accumulator_Add(me.WarpZone_refsys, ref.WarpZone_refsys);
me.WarpZone_refsys_incremental_shift = ref.WarpZone_refsys.warpzone_shift;
me.WarpZone_refsys_incremental_transform = ref.WarpZone_refsys.warpzone_transform;
ang = WarpZone_TransformVAngles(to.WarpZone_refsys, ang);
return ang;
}
+void WarpZone_RefSys_Copy(entity me, entity from)
+{
+ if(from.WarpZone_refsys)
+ {
+ WarpZone_RefSys_CheckCreate(me);
+ me.WarpZone_refsys.warpzone_shift = from.WarpZone_refsys.warpzone_shift;
+ me.WarpZone_refsys.warpzone_transform = from.WarpZone_refsys.warpzone_transform;
+ }
+ else
+ WarpZone_RefSys_Clear(me);
+}
entity WarpZone_RefSys_SpawnSameRefSys(entity me)
{
entity e;
e = spawn();
- if(me.WarpZone_refsys)
- {
- e.WarpZone_refsys = spawn();
- e.WarpZone_refsys.classname = "warpzone_refsys";
- e.WarpZone_refsys.owner = e;
- e.WarpZone_refsys.think = WarpZone_RefSys_GC;
- e.WarpZone_refsys.nextthink = time + 1;
- e.WarpZone_refsys.warpzone_shift = me.WarpZone_refsys.warpzone_shift;
- e.WarpZone_refsys.warpzone_transform = me.WarpZone_refsys.warpzone_transform;
- }
+ WarpZone_RefSys_Copy(e, me);
return e;
}