+#ifdef WARPZONELIB_KEEPDEBUG
+#define WARPZONELIB_REMOVEHACK
+#endif
+
// for think function
.vector warpzone_save_origin;
.vector warpzone_save_angles;
void WarpZone_TeleportPlayer(entity teleporter, entity player, vector to, vector to_angles, vector to_velocity)
{
- setorigin (player, to);
+ 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;
return TRUE;
}
-#define WARPZONE_TELEPORT_FIXSOLID(ret) \
- do \
- { \
- setorigin(player, o1 - player.view_ofs); \
- if(WarpZoneLib_MoveOutOfSolid(player)) \
- { \
- o1 = player.origin + player.view_ofs; \
- setorigin(player, o0 - player.view_ofs); \
- } \
- else \
- { \
- print("would have to put player in solid, won't do that\n"); \
- setorigin(player, o0 - player.view_ofs); \
- return (ret); \
- } \
- } \
- while(0)
-#define WARPZONE_TELEPORT_DOTELEPORT() \
- do \
- { \
- WarpZone_RefSys_Add(player, wz); \
- WarpZone_TeleportPlayer(wz, player, o1 - player.view_ofs, a1, v1); \
- WarpZone_StoreProjectileData(player); \
- player.warpzone_teleport_time = time; \
- player.warpzone_teleport_finishtime = time; \
- player.warpzone_teleport_zone = wz; \
- } \
- while(0)
-
float WarpZone_Teleport(entity wz, entity player, float f0, float f1)
{
vector o0, a0, v0, o1, a1, v1, o10;
o1 = o1 - v1 * (d / dv);
}
- // put him inside solid
+ // put him out of solid
tracebox(o1 - player.view_ofs, player.mins, player.maxs, o1 - player.view_ofs, MOVE_NOMONSTERS, player);
if(trace_startsolid)
- WARPZONE_TELEPORT_FIXSOLID(0);
+ {
+ setorigin(player, o1 - player.view_ofs);
+ if(WarpZoneLib_MoveOutOfSolid(player))
+ {
+ o1 = player.origin + player.view_ofs;
+ setorigin(player, o0 - player.view_ofs);
+ }
+ else
+ {
+ print("would have to put player in solid, won't do that\n");
+ setorigin(player, o0 - player.view_ofs);
+ return 0;
+ }
+ }
- WARPZONE_TELEPORT_DOTELEPORT();
+ // do the teleport
+ WarpZone_RefSys_Add(player, wz);
+ WarpZone_TeleportPlayer(wz, player, o1 - player.view_ofs, a1, v1);
+ WarpZone_StoreProjectileData(player);
+ player.warpzone_teleport_time = time;
+ player.warpzone_teleport_finishtime = time;
+ player.warpzone_teleport_zone = wz;
// prevent further teleports back
float dt = (o1 - o10) * v1 * (1 / (v1 * v1));
float WarpZone_Camera_Send(entity to, float sendflags)
{
- float f;
+ float f = 0;
WriteByte(MSG_ENTITY, ENT_CLIENT_WARPZONE_CAMERA);
if(self.warpzone_fadestart)
return TRUE;
}
+#ifdef WARPZONELIB_KEEPDEBUG
float WarpZone_CheckProjectileImpact(entity player)
{
vector o0, v0;
if(!wz)
return 0;
+#ifdef WARPZONELIB_REMOVEHACK
+ print("impactfilter found something - and it no longer gets handled correctly - please tell divVerent whether anything behaves broken now\n");
+#else
print("impactfilter found something - and it even gets handled correctly - please tell divVerent that this code apparently gets triggered again\n");
+#endif
print("Entity type: ", player.classname, "\n");
print("Origin: ", vtos(player.origin), "\n");
print("Velocity: ", vtos(player.velocity), "\n");
+#ifdef WARPZONELIB_REMOVEHACK
+ return 0;
+#else
// retry previous move
setorigin(player, player.warpzone_oldorigin);
player.velocity = player.warpzone_oldvelocity;
}
return +1;
+#endif
}
+#endif
+
float WarpZone_Projectile_Touch()
{
- float f;
if(other.classname == "trigger_warpzone")
return TRUE;
// no further impacts if we teleported this frame!
+ // this is because even if we did teleport, the engine still may raise
+ // touch events for the previous location
+ // engine now aborts moves on teleport, so this SHOULD not happen any more
+ // but if this is called from TouchAreaGrid of the projectile moving,
+ // then this won't do
if(time == self.warpzone_teleport_time)
return TRUE;
+#ifdef WARPZONELIB_KEEPDEBUG
// this SEEMS to not happen at the moment, but if it did, it would be more reliable
{
float save_dpstartcontents;
save_ent = trace_ent;
save_inopen = trace_inopen;
save_inwater = trace_inwater;
+ float f;
if((f = WarpZone_CheckProjectileImpact(self)) != 0)
return (f > 0);
trace_dpstartcontents = save_dpstartcontents;
trace_inopen = save_inopen;
trace_inwater = save_inwater;
}
+#endif
if(WarpZone_Projectile_Touch_ImpactFilter_Callback())
return TRUE;
print("Position target of trigger_warpzone near ", vtos(self.aiment.origin), " points into trigger_warpzone. BEWARE.\n");
norm = -1 * norm;
}
- ang = vectoangles(norm, v_up); // keep rotation, but turn exactly against plane
+ ang = vectoangles2(norm, v_up); // keep rotation, but turn exactly against plane
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");