+#if defined(CSQC)
+#elif defined(MENUQC)
+#elif defined(SVQC)
+ #include "../dpdefs/progsdefs.qh"
+ #include "../dpdefs/dpextensions.qh"
+ #include "common.qh"
+ #include "server.qh"
+ #include "../common/constants.qh"
+ #include "../common/util.qh"
+ #include "../server/constants.qh"
+ #include "../server/defs.qh"
+ #include "../server/command/common.qh"
+#endif
+
#ifdef WARPZONELIB_KEEPDEBUG
#define WARPZONELIB_REMOVEHACK
#endif
setorigin (player, to); // NOTE: this also aborts the move, when this is called by touch
player.oldorigin = to; // for DP's unsticking
player.angles = to_angles;
- player.fixangle = TRUE;
+ player.fixangle = true;
player.velocity = to_velocity;
BITXOR_ASSIGN(player.effects, EF_TELEPORT_BIT);
WarpZone_PostTeleportPlayer_Callback(player);
}
-float WarpZone_Teleported_Send(entity to, float sf)
+bool WarpZone_Teleported_Send(entity to, int sf)
{
WriteByte(MSG_ENTITY, ENT_CLIENT_WARPZONE_TELEPORTED);
- WriteCoord(MSG_ENTITY, self.angles_x);
- WriteCoord(MSG_ENTITY, self.angles_y);
- WriteCoord(MSG_ENTITY, self.angles_z);
- return TRUE;
+ WriteCoord(MSG_ENTITY, self.angles.x);
+ WriteCoord(MSG_ENTITY, self.angles.y);
+ WriteCoord(MSG_ENTITY, self.angles.z);
+ return true;
}
float WarpZone_Teleport(entity wz, entity player, float f0, float f1)
if(IS_PLAYER(player))
{
// instead of fixangle, send the transform to the client for smoother operation
- player.fixangle = FALSE;
+ player.fixangle = false;
entity ts = spawn();
setmodel(ts, "null");
}
}
-float WarpZone_Send(entity to, float sendflags)
+bool WarpZone_Send(entity to, int sendflags)
{
- float f;
WriteByte(MSG_ENTITY, ENT_CLIENT_WARPZONE);
// we must send this flag for clientside to match properly too
- f = 0;
+ int f = 0;
if(self.warpzone_isboxy)
BITSET_ASSIGN(f, 1);
if(self.warpzone_fadestart)
// we need THESE to render the warpzone (and cull properly)...
if(f & 4)
{
- WriteCoord(MSG_ENTITY, self.origin_x);
- WriteCoord(MSG_ENTITY, self.origin_y);
- WriteCoord(MSG_ENTITY, self.origin_z);
+ WriteCoord(MSG_ENTITY, self.origin.x);
+ WriteCoord(MSG_ENTITY, self.origin.y);
+ WriteCoord(MSG_ENTITY, self.origin.z);
}
WriteShort(MSG_ENTITY, self.modelindex);
- WriteCoord(MSG_ENTITY, self.mins_x);
- WriteCoord(MSG_ENTITY, self.mins_y);
- WriteCoord(MSG_ENTITY, self.mins_z);
- WriteCoord(MSG_ENTITY, self.maxs_x);
- WriteCoord(MSG_ENTITY, self.maxs_y);
- WriteCoord(MSG_ENTITY, self.maxs_z);
+ WriteCoord(MSG_ENTITY, self.mins.x);
+ WriteCoord(MSG_ENTITY, self.mins.y);
+ WriteCoord(MSG_ENTITY, self.mins.z);
+ WriteCoord(MSG_ENTITY, self.maxs.x);
+ WriteCoord(MSG_ENTITY, self.maxs.y);
+ WriteCoord(MSG_ENTITY, self.maxs.z);
WriteByte(MSG_ENTITY, bound(1, self.scale * 16, 255));
// we need THESE to calculate the proper transform
- WriteCoord(MSG_ENTITY, self.warpzone_origin_x);
- WriteCoord(MSG_ENTITY, self.warpzone_origin_y);
- WriteCoord(MSG_ENTITY, self.warpzone_origin_z);
- WriteCoord(MSG_ENTITY, self.warpzone_angles_x);
- WriteCoord(MSG_ENTITY, self.warpzone_angles_y);
- WriteCoord(MSG_ENTITY, self.warpzone_angles_z);
- WriteCoord(MSG_ENTITY, self.warpzone_targetorigin_x);
- WriteCoord(MSG_ENTITY, self.warpzone_targetorigin_y);
- WriteCoord(MSG_ENTITY, self.warpzone_targetorigin_z);
- WriteCoord(MSG_ENTITY, self.warpzone_targetangles_x);
- WriteCoord(MSG_ENTITY, self.warpzone_targetangles_y);
- WriteCoord(MSG_ENTITY, self.warpzone_targetangles_z);
+ WriteCoord(MSG_ENTITY, self.warpzone_origin.x);
+ WriteCoord(MSG_ENTITY, self.warpzone_origin.y);
+ WriteCoord(MSG_ENTITY, self.warpzone_origin.z);
+ WriteCoord(MSG_ENTITY, self.warpzone_angles.x);
+ WriteCoord(MSG_ENTITY, self.warpzone_angles.y);
+ WriteCoord(MSG_ENTITY, self.warpzone_angles.z);
+ WriteCoord(MSG_ENTITY, self.warpzone_targetorigin.x);
+ WriteCoord(MSG_ENTITY, self.warpzone_targetorigin.y);
+ WriteCoord(MSG_ENTITY, self.warpzone_targetorigin.z);
+ WriteCoord(MSG_ENTITY, self.warpzone_targetangles.x);
+ WriteCoord(MSG_ENTITY, self.warpzone_targetangles.y);
+ WriteCoord(MSG_ENTITY, self.warpzone_targetangles.z);
if(f & 2)
{
WriteShort(MSG_ENTITY, self.warpzone_fadeend);
}
- return TRUE;
+ return true;
}
-float WarpZone_Camera_Send(entity to, float sendflags)
+bool WarpZone_Camera_Send(entity to, int sendflags)
{
- float f = 0;
+ int f = 0;
WriteByte(MSG_ENTITY, ENT_CLIENT_WARPZONE_CAMERA);
if(self.warpzone_fadestart)
// we need THESE to render the warpzone (and cull properly)...
if(f & 4)
{
- WriteCoord(MSG_ENTITY, self.origin_x);
- WriteCoord(MSG_ENTITY, self.origin_y);
- WriteCoord(MSG_ENTITY, self.origin_z);
+ WriteCoord(MSG_ENTITY, self.origin.x);
+ WriteCoord(MSG_ENTITY, self.origin.y);
+ WriteCoord(MSG_ENTITY, self.origin.z);
}
WriteShort(MSG_ENTITY, self.modelindex);
- WriteCoord(MSG_ENTITY, self.mins_x);
- WriteCoord(MSG_ENTITY, self.mins_y);
- WriteCoord(MSG_ENTITY, self.mins_z);
- WriteCoord(MSG_ENTITY, self.maxs_x);
- WriteCoord(MSG_ENTITY, self.maxs_y);
- WriteCoord(MSG_ENTITY, self.maxs_z);
+ WriteCoord(MSG_ENTITY, self.mins.x);
+ WriteCoord(MSG_ENTITY, self.mins.y);
+ WriteCoord(MSG_ENTITY, self.mins.z);
+ WriteCoord(MSG_ENTITY, self.maxs.x);
+ WriteCoord(MSG_ENTITY, self.maxs.y);
+ WriteCoord(MSG_ENTITY, self.maxs.z);
WriteByte(MSG_ENTITY, bound(1, self.scale * 16, 255));
// we need THESE to calculate the proper transform
- WriteCoord(MSG_ENTITY, self.enemy.origin_x);
- WriteCoord(MSG_ENTITY, self.enemy.origin_y);
- WriteCoord(MSG_ENTITY, self.enemy.origin_z);
- WriteCoord(MSG_ENTITY, self.enemy.angles_x);
- WriteCoord(MSG_ENTITY, self.enemy.angles_y);
- WriteCoord(MSG_ENTITY, self.enemy.angles_z);
+ WriteCoord(MSG_ENTITY, self.enemy.origin.x);
+ WriteCoord(MSG_ENTITY, self.enemy.origin.y);
+ WriteCoord(MSG_ENTITY, self.enemy.origin.z);
+ WriteCoord(MSG_ENTITY, self.enemy.angles.x);
+ WriteCoord(MSG_ENTITY, self.enemy.angles.y);
+ WriteCoord(MSG_ENTITY, self.enemy.angles.z);
if(f & 2)
{
WriteShort(MSG_ENTITY, self.warpzone_fadeend);
}
- return TRUE;
+ return true;
}
#ifdef WARPZONELIB_KEEPDEBUG
float WarpZone_Projectile_Touch()
{
if(other.classname == "trigger_warpzone")
- return TRUE;
+ return true;
// no further impacts if we teleported this frame!
// this is because even if we did teleport, the engine still may raise
// but if this is called from TouchAreaGrid of the projectile moving,
// then this won't do
if(time == self.warpzone_teleport_time)
- return TRUE;
+ return true;
#ifdef WARPZONELIB_KEEPDEBUG
// this SEEMS to not happen at the moment, but if it did, it would be more reliable
#endif
if(WarpZone_Projectile_Touch_ImpactFilter_Callback())
- return TRUE;
+ return true;
- return FALSE;
+ return false;
}
void WarpZone_InitStep_FindOriginTarget()
{
vector org, ang, norm, point;
float area;
- vector tri, a, b, c, p, q, n;
+ vector tri, a, b, c, n;
float i_s, i_t, n_t;
string tex;
for(i_t = 0; i_t < n_t; ++i_t)
{
tri = getsurfacetriangle(self, i_s, i_t);
- a = getsurfacepoint(self, i_s, tri_x);
- b = getsurfacepoint(self, i_s, tri_y);
- c = getsurfacepoint(self, i_s, tri_z);
- p = b - a;
- q = c - a;
- n = '1 0 0' * (q_y * p_z - q_z * p_y)
- + '0 1 0' * (q_z * p_x - q_x * p_z)
- + '0 0 1' * (q_x * p_y - q_y * p_x);
+ a = getsurfacepoint(self, i_s, tri.x);
+ b = getsurfacepoint(self, i_s, tri.y);
+ c = getsurfacepoint(self, i_s, tri.z);
+ n = cross(c - a, b - a);
area = area + vlen(n);
norm = norm + n;
point = point + vlen(n) * (a + b + c);
norm = normalize(norm);
}
-#ifdef GMQCC
ang = '0 0 0';
-#endif
if(self.aiment)
{
org = self.aiment.origin;
norm = -1 * norm;
}
ang = vectoangles2(norm, v_up); // keep rotation, but turn exactly against plane
- ang_x = -ang_x;
+ ang.x = -ang.x;
if(norm * v_forward < 0.99)
print("trigger_warpzone near ", vtos(self.aiment.origin), " has been turned to match plane orientation (", vtos(self.aiment.angles), " -> ", vtos(ang), "\n");
if(vlen(org - self.aiment.origin) > 0.5)
{
org = point;
ang = vectoangles(norm);
- ang_x = -ang_x;
+ ang.x = -ang.x;
}
else
error("cannot infer origin/angles for this warpzone, please use a killtarget or a trigger_warpzone_position");
}
float warpzone_initialized;
-entity warpzone_first;
+//entity warpzone_first;
entity warpzone_position_first;
entity warpzone_camera_first;
.entity warpzone_next;
if(IS_NOT_A_CLIENT(e))
{
if(warpzone_warpzones_exist)
- for(; (e = nextent(e)); )
+ for (; (e = nextent(e)); )
WarpZone_StoreProjectileData(e);
break;
}
{
#ifndef WARPZONE_DONT_FIX_VANGLE
if(IS_REAL_CLIENT(self))
- if(self.v_angle_z <= 360) // if not already adjusted
+ if(self.v_angle.z <= 360) // if not already adjusted
if(time - self.ping * 0.001 < self.warpzone_teleport_time)
{
self.v_angle = WarpZone_TransformVAngles(self.warpzone_teleport_zone, self.v_angle);