From: Rudolf Polzer Date: Mon, 31 Oct 2011 07:31:49 +0000 (+0100) Subject: warpzones: always make sure origin is changed X-Git-Tag: xonotic-v0.6.0~35^2~73 X-Git-Url: https://git.rm.cloudns.org/?a=commitdiff_plain;h=1480d4eeea351f1ac2bc9580d2456f6c62e7f13c;p=xonotic%2Fxonotic-data.pk3dir.git warpzones: always make sure origin is changed --- diff --git a/qcsrc/warpzonelib/server.qc b/qcsrc/warpzonelib/server.qc index a2f92c88d..e662bf41f 100644 --- a/qcsrc/warpzonelib/server.qc +++ b/qcsrc/warpzonelib/server.qc @@ -44,35 +44,6 @@ float WarpZone_Teleported_Send(entity to, float sf) 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; @@ -111,12 +82,34 @@ float WarpZone_Teleport(entity wz, entity player, float f0, float f1) o1 = o1 - v1 * (d / dv); } - // put him inside solid + if(o1 == o0) + o1_z = nextafter(o1_z, world.maxs_z); + + // 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));