From ada51453cec9dd61d141894e6fee7ddb9f9687b1 Mon Sep 17 00:00:00 2001 From: Martin Taibr Date: Mon, 12 Nov 2018 00:31:03 +0100 Subject: [PATCH] FIXED_MAKE_VECTORS --- .../sv_spawn_near_teammate.qc | 35 ++++++++++++------- qcsrc/lib/warpzone/anglestransform.qh | 3 ++ 2 files changed, 26 insertions(+), 12 deletions(-) diff --git a/qcsrc/common/mutators/mutator/spawn_near_teammate/sv_spawn_near_teammate.qc b/qcsrc/common/mutators/mutator/spawn_near_teammate/sv_spawn_near_teammate.qc index fdcc4beee..9d6e67b24 100644 --- a/qcsrc/common/mutators/mutator/spawn_near_teammate/sv_spawn_near_teammate.qc +++ b/qcsrc/common/mutators/mutator/spawn_near_teammate/sv_spawn_near_teammate.qc @@ -103,10 +103,20 @@ MUTATOR_HOOKFUNCTION(spawn_near_teammate, PlayerSpawn) vector horiz_vel = vec2(it.velocity); // when walking slowly sideways, we assume the player wants a clear shot ahead - spawn behind him according to where he's looking // when running fast, spawn behind him according to his direction of movement to prevent colliding with the newly spawned player + vector forward = '0 0 0'; + vector right = '0 0 0'; + vector up = '0 0 0'; + // TODO ^ test this if (vdist(horiz_vel, >, autocvar_sv_maxspeed + 50)) - fixedmakevectors(vectoangles(horiz_vel)); + { + //fixedmakevectors(vectoangles(horiz_vel)); + FIXED_MAKE_VECTORS(vectoangles(horiz_vel), forward, right, up); + } else - fixedmakevectors(it.angles); // .angles is the angle of the model - usually/always 0 pitch + { + //fixedmakevectors(it.angles); // .angles is the angle of the model - usually/always 0 pitch + FIXED_MAKE_VECTORS(it.angles, forward, right, up); + } // test different spots close to mate - trace upwards so it works on uneven surfaces // don't spawn in front of player or directly behind to avoid players shooting each other @@ -117,22 +127,22 @@ MUTATOR_HOOKFUNCTION(spawn_near_teammate, PlayerSpawn) switch(i) { case 0: - tracebox(it.origin, STAT(PL_MIN, player), STAT(PL_MAX, player), it.origin - v_forward * 64 + v_right * 128 + v_up * 64, MOVE_NOMONSTERS, it); + tracebox(it.origin, STAT(PL_MIN, player), STAT(PL_MAX, player), it.origin - forward * 64 + right * 128 + up * 64, MOVE_NOMONSTERS, it); break; case 1: - tracebox(it.origin, STAT(PL_MIN, player), STAT(PL_MAX, player), it.origin - v_forward * 64 - v_right * 128 + v_up * 64, MOVE_NOMONSTERS, it); + tracebox(it.origin, STAT(PL_MIN, player), STAT(PL_MAX, player), it.origin - forward * 64 - right * 128 + up * 64, MOVE_NOMONSTERS, it); break; case 2: - tracebox(it.origin, STAT(PL_MIN, player), STAT(PL_MAX, player), it.origin + v_right * 192 + v_up * 64, MOVE_NOMONSTERS, it); + tracebox(it.origin, STAT(PL_MIN, player), STAT(PL_MAX, player), it.origin + right * 192 + up * 64, MOVE_NOMONSTERS, it); break; case 3: - tracebox(it.origin, STAT(PL_MIN, player), STAT(PL_MAX, player), it.origin - v_right * 192 + v_up * 64, MOVE_NOMONSTERS, it); + tracebox(it.origin, STAT(PL_MIN, player), STAT(PL_MAX, player), it.origin - right * 192 + up * 64, MOVE_NOMONSTERS, it); break; case 4: - tracebox(it.origin, STAT(PL_MIN, player), STAT(PL_MAX, player), it.origin - v_forward * 128 + v_right * 64 + v_up * 64, MOVE_NOMONSTERS, it); + tracebox(it.origin, STAT(PL_MIN, player), STAT(PL_MAX, player), it.origin - forward * 128 + right * 64 + up * 64, MOVE_NOMONSTERS, it); break; case 5: - tracebox(it.origin, STAT(PL_MIN, player), STAT(PL_MAX, player), it.origin - v_forward * 128 - v_right * 64 + v_up * 64, MOVE_NOMONSTERS, it); + tracebox(it.origin, STAT(PL_MIN, player), STAT(PL_MAX, player), it.origin - forward * 128 - right * 64 + up * 64, MOVE_NOMONSTERS, it); break; } @@ -142,7 +152,7 @@ MUTATOR_HOOKFUNCTION(spawn_near_teammate, PlayerSpawn) // 400 is about the height of a typical laser jump (in overkill) // not traceline because we need space for the whole player, not just his origin - tracebox(horizontal_trace_endpos, STAT(PL_MIN, player), STAT(PL_MAX, player), horizontal_trace_endpos - '0 0 400', MOVE_NORMAL, it); + tracebox(horizontal_trace_endpos, STAT(PL_MIN, player), STAT(PL_MAX, player), horizontal_trace_endpos - 400 * up, MOVE_NORMAL, it); vector vectical_trace_endpos = trace_endpos; //te_lightning1(NULL, horizontal_trace_endpos, vectical_trace_endpos); if (trace_startsolid) goto skip; // inside another player @@ -152,8 +162,9 @@ MUTATOR_HOOKFUNCTION(spawn_near_teammate, PlayerSpawn) if (tracebox_hits_trigger_hurt(horizontal_trace_endpos, STAT(PL_MIN, player), STAT(PL_MAX, player), vectical_trace_endpos)) goto skip; // make sure the spawned player will have floor ahead (or at least a wall - he shouldn't fall as soon as he starts moving) - vector floor_test_start = vectical_trace_endpos + v_up * STAT(PL_MAX, player).z + v_forward * STAT(PL_MAX, player).x; // top front of player's bbox - highest point we know is not inside solid - traceline(floor_test_start, floor_test_start + v_forward * 100 - v_up * 128, MOVE_NOMONSTERS, it); + // top front of player's bbox - highest point we know is not inside solid + vector floor_test_start = vectical_trace_endpos + up * STAT(PL_MAX, player).z + forward * STAT(PL_MAX, player).x; + traceline(floor_test_start, floor_test_start + forward * 100 - up * 128, MOVE_NOMONSTERS, it); //te_beam(NULL, floor_test_start, trace_endpos); if (trace_fraction == 1.0) goto skip; @@ -171,7 +182,7 @@ MUTATOR_HOOKFUNCTION(spawn_near_teammate, PlayerSpawn) // here, we know we found a good spot RandomSelection_Add(it, 0, string_null, vectical_trace_endpos, 1, 1); - //te_lightning1(NULL, vectical_trace_endpos, vectical_trace_endpos + v_forward * 10); + //te_lightning1(NULL, vectical_trace_endpos, vectical_trace_endpos + forward * 10); LABEL(skip) if (i % 2 == 1 && RandomSelection_chosen_ent) diff --git a/qcsrc/lib/warpzone/anglestransform.qh b/qcsrc/lib/warpzone/anglestransform.qh index b287651a1..709fdf0f2 100644 --- a/qcsrc/lib/warpzone/anglestransform.qh +++ b/qcsrc/lib/warpzone/anglestransform.qh @@ -6,6 +6,8 @@ #if POSITIVE_PITCH_IS_DOWN #define fixedmakevectors makevectors + #define FIXED_MAKE_VECTORS MAKE_VECTORS + #define FIXED_MAKE_VECTORS_NEW MAKE_VECTORS_NEW noref vector _fixedvectoangles; #define fixedvectoangles(a) (_fixedvectoangles = vectoangles(a), _fixedvectoangles.x *= -1, _fixedvectoangles) noref vector _fixedvectoangles2; @@ -17,6 +19,7 @@ a.x = -a.x; makevectors(a); } + // TODO deglobalize #define fixedvectoangles2 vectoangles2 #define fixedvectoangles vectoangles #endif -- 2.39.2