player.fixangle = TRUE;
player.velocity = to_velocity;
- if(player.effects & EF_TELEPORT_BIT)
- player.effects &~= EF_TELEPORT_BIT;
- else
- player.effects |= EF_TELEPORT_BIT;
+ BITXOR_ASSIGN(player.effects, EF_TELEPORT_BIT);
if(player.classname == "player")
- player.flags &~= FL_ONGROUND;
+ BITCLR_ASSIGN(player.flags, FL_ONGROUND);
WarpZone_PostTeleportPlayer_Callback(player);
}
+float WarpZone_Teleported_Send(entity to, float 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;
+}
+
float WarpZone_Teleport(entity player)
{
vector o0, a0, v0, o1, a1, v1;
WarpZone_StoreProjectileData(player);
player.warpzone_teleport_time = time;
player.warpzone_teleport_zone = self;
+#ifndef WARPZONE_USE_FIXANGLE
+ // instead of fixangle, send the transform to the client for smoother operation
+ player.fixangle = FALSE;
+
+ entity ts = spawn();
+ setmodel(ts, "null");
+ ts.SendEntity = WarpZone_Teleported_Send;
+ ts.SendFlags = 0xFFFFFF;
+ ts.drawonlytoclient = player;
+ ts.think = SUB_Remove;
+ ts.nextthink = time + 1;
+ ts.owner = player;
+ ts.enemy = self;
+ ts.effects = EF_NODEPTHTEST;
+ ts.classname = "warpzone_teleported";
+ ts.angles = self.warpzone_transform;
+#endif
return 1;
}
// we must send this flag for clientside to match properly too
f = 0;
if(self.warpzone_isboxy)
- f |= 1;
+ BITSET_ASSIGN(f, 1);
if(self.warpzone_fadestart)
- f |= 2;
+ BITSET_ASSIGN(f, 2);
if(self.origin != '0 0 0')
- f |= 4;
+ BITSET_ASSIGN(f, 4);
WriteByte(MSG_ENTITY, f);
// we need THESE to render the warpzone (and cull properly)...
WriteByte(MSG_ENTITY, ENT_CLIENT_WARPZONE_CAMERA);
if(self.warpzone_fadestart)
- f |= 2;
+ BITSET_ASSIGN(f, 2);
if(self.origin != '0 0 0')
- f |= 4;
+ BITSET_ASSIGN(f, 4);
WriteByte(MSG_ENTITY, f);
// we need THESE to render the warpzone (and cull properly)...
tex = getsurfacetexture(self, i_s);
if not(tex)
break; // this is beyond the last one
- if(tex == "textures/common/trigger")
+ if(tex == "textures/common/trigger" || tex == "trigger")
continue;
n_t = getsurfacenumtriangles(self, i_s);
for(i_t = 0; i_t < n_t; ++i_t)
setsize(self, self.mins, self.maxs);
self.SendEntity = WarpZone_Send;
self.SendFlags = 0xFFFFFF;
- self.effects |= EF_NODEPTHTEST;
+ BITSET_ASSIGN(self.effects, EF_NODEPTHTEST);
self.warpzone_next = warpzone_first;
warpzone_first = self;
}
void WarpZone_PlayerPhysics_FixVAngle(void)
{
-#ifdef WARPZONE_FIX_VANGLE
- if(self.v_angle_z <= 360)
+#ifndef WARPZONE_DONT_FIX_VANGLE
if(clienttype(self) == CLIENTTYPE_REAL)
+ 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);