#elif defined(MENUQC)
#elif defined(SVQC)
#include <common/constants.qh>
- #include <common/triggers/subs.qh>
+ #include <common/net_linked.qh>
+ #include <common/mapobjects/subs.qh>
#include <common/util.qh>
- #include <server/command/_mod.qh>
#include <server/constants.qh>
#include <server/defs.qh>
+ #include <server/utils.qh>
#endif
#ifdef WARPZONELIB_KEEPDEBUG
void WarpZone_TeleportPlayer(entity teleporter, entity player, vector to, vector to_angles, vector to_velocity)
{
+#ifdef SVQC
+ player.lastteleport_origin = player.origin;
+ player.lastteleporttime = time;
+#endif
setorigin(player, to); // NOTE: this also aborts the move, when this is called by touch
+ player.angles = to_angles;
#ifdef SVQC
player.oldorigin = to; // for DP's unsticking
player.fixangle = true;
+ if (IS_BOT_CLIENT(player))
+ {
+ // FIXME find a way to smooth view's angles change for bots too
+ player.v_angle = player.angles;
+ bot_aim_reset(player);
+ }
#endif
- player.angles = to_angles;
player.velocity = to_velocity;
BITXOR_ASSIGN(player.effects, EF_TELEPORT_BIT);
bool WarpZone_Teleported_Send(entity this, entity to, int sf)
{
WriteHeader(MSG_ENTITY, ENT_CLIENT_WARPZONE_TELEPORTED);
- WriteCoord(MSG_ENTITY, this.angles.x);
- WriteCoord(MSG_ENTITY, this.angles.y);
- WriteCoord(MSG_ENTITY, this.angles.z);
+ WriteVector(MSG_ENTITY, this.angles);
return true;
}
#endif
}
else
{
- LOG_INFO("would have to put player in solid, won't do that\n");
+ LOG_INFO("would have to put player in solid, won't do that");
setorigin(player, o0 - player.view_ofs);
return 0;
}
return;
// FIXME needs a better check to know what is safe to teleport and what not
- if((toucher.move_movetype == MOVETYPE_NONE && toucher.move_movetype == MOVETYPE_NONE) || toucher.move_movetype == MOVETYPE_FOLLOW || toucher.move_movetype == MOVETYPE_FOLLOW || toucher.tag_entity
-#ifdef CSQC
- || tag_networkentity
-#endif
- )
+ if(toucher.move_movetype == MOVETYPE_NONE || toucher.move_movetype == MOVETYPE_FOLLOW || toucher.tag_entity)
return;
if(WarpZoneLib_ExactTrigger_Touch(this, toucher))
return 0;
#ifdef WARPZONELIB_REMOVEHACK
- LOG_INFO("impactfilter found something - and it no longer gets handled correctly - please tell divVerent whether anything behaves broken now\n");
+ LOG_INFO("impactfilter found something - and it no longer gets handled correctly - please tell divVerent whether anything behaves broken now");
#else
- LOG_INFO("impactfilter found something - and it even gets handled correctly - please tell divVerent that this code apparently gets triggered again\n");
+ LOG_INFO("impactfilter found something - and it even gets handled correctly - please tell divVerent that this code apparently gets triggered again");
#endif
- LOG_INFO("Entity type: ", player.classname, "\n");
- LOG_INFO("Origin: ", vtos(player.origin), "\n");
- LOG_INFO("Velocity: ", vtos(player.velocity), "\n");
+ LOG_INFO("Entity type: ", player.classname);
+ LOG_INFO("Origin: ", vtos(player.origin));
+ LOG_INFO("Velocity: ", vtos(player.velocity));
#ifdef WARPZONELIB_REMOVEHACK
return 0;
point = point * (1 / (3 * area));
if(vdist(norm, <, 0.99))
{
- LOG_INFO("trigger_warpzone near ", vtos(this.aiment.origin), " is nonplanar. BEWARE.\n");
+ LOG_INFO("trigger_warpzone near ", vtos(this.aiment.origin), " is nonplanar. BEWARE.");
area = 0; // no autofixing in this case
}
norm = normalize(norm);
makevectors(ang);
if(norm * v_forward < 0)
{
- LOG_INFO("Position target of trigger_warpzone near ", vtos(this.aiment.origin), " points into trigger_warpzone. BEWARE.\n");
+ LOG_INFO("Position target of trigger_warpzone near ", vtos(this.aiment.origin), " points into trigger_warpzone. BEWARE.");
norm = -1 * norm;
}
ang = vectoangles2(norm, v_up); // keep rotation, but turn exactly against plane
ang.x = -ang.x;
if(norm * v_forward < 0.99)
- LOG_INFO("trigger_warpzone near ", vtos(this.aiment.origin), " has been turned to match plane orientation (", vtos(this.aiment.angles), " -> ", vtos(ang), "\n");
+ LOG_INFO("trigger_warpzone near ", vtos(this.aiment.origin), " has been turned to match plane orientation (", vtos(this.aiment.angles), " -> ", vtos(ang));
if(vdist(org - this.aiment.origin, >, 0.5))
- LOG_INFO("trigger_warpzone near ", vtos(this.aiment.origin), " has been moved to match the plane (", vtos(this.aiment.origin), " -> ", vtos(org), ").\n");
+ LOG_INFO("trigger_warpzone near ", vtos(this.aiment.origin), " has been moved to match the plane (", vtos(this.aiment.origin), " -> ", vtos(org), ").");
}
}
else if(area > 0)
WarpZone_StoreProjectileData(it);
});
}
-
+
FOREACH_CLIENT(true,
{
#ifndef WARPZONE_DONT_FIX_VANGLE
if(IS_REAL_CLIENT(this))
if(this.v_angle.z <= 360) // if not already adjusted
- if(time - this.ping * 0.001 < this.warpzone_teleport_time)
+ if(time - CS(this).ping * 0.001 < this.warpzone_teleport_time)
{
this.v_angle = WarpZone_TransformVAngles(this.warpzone_teleport_zone, this.v_angle);
this.v_angle_z += 720; // mark as adjusted