X-Git-Url: https://git.xonotic.org/?a=blobdiff_plain;f=qcsrc%2Fserver%2Fimpulse.qc;h=56ea478ae2624ed9e766e77e2a8a318412d6a106;hb=fc16e8523c1394347fcdd558775d9d8984ab4ec1;hp=5a6321772f57cba774037377d1e3415dcf58878d;hpb=9b861bac57c7fb0872b7facb80c32917be810b95;p=xonotic%2Fxonotic-data.pk3dir.git diff --git a/qcsrc/server/impulse.qc b/qcsrc/server/impulse.qc index 5a6321772..56ea478ae 100644 --- a/qcsrc/server/impulse.qc +++ b/qcsrc/server/impulse.qc @@ -64,6 +64,8 @@ { \ .entity weaponentity = weaponentities[wepslot]; \ W_NextWeaponOnImpulse(this, slot, weaponentity); \ + if(wepslot == 0 && autocvar_g_weaponswitch_debug != 1) \ + break; \ } \ } X(1) @@ -95,7 +97,9 @@ X(0) for(int wepslot = 0; wepslot < MAX_WEAPONSLOTS; ++wepslot) \ { \ .entity weaponentity = weaponentities[wepslot]; \ - W_CycleWeapon(this, this.cvar_cl_weaponpriorities[slot], dir, weaponentity); \ + W_CycleWeapon(this, CS(this).cvar_cl_weaponpriorities[slot], dir, weaponentity); \ + if(wepslot == 0 && autocvar_g_weaponswitch_debug != 1) \ + break; \ } \ } X(0, prev) @@ -147,6 +151,8 @@ X(9, next) { \ .entity weaponentity = weaponentities[slot]; \ W_SwitchWeapon(this, Weapons_from(WEP_FIRST + i), weaponentity); \ + if(slot == 0 && autocvar_g_weaponswitch_debug != 1) \ + break; \ } \ } X(0) @@ -187,6 +193,9 @@ IMPULSE(weapon_next_byid) { .entity weaponentity = weaponentities[slot]; W_NextWeapon(this, 0, weaponentity); + + if(slot == 0 && autocvar_g_weaponswitch_debug != 1) + break; } } @@ -202,6 +211,9 @@ IMPULSE(weapon_prev_byid) { .entity weaponentity = weaponentities[slot]; W_PreviousWeapon(this, 0, weaponentity); + + if(slot == 0 && autocvar_g_weaponswitch_debug != 1) + break; } } @@ -217,6 +229,9 @@ IMPULSE(weapon_next_bygroup) { .entity weaponentity = weaponentities[slot]; W_NextWeapon(this, 1, weaponentity); + + if(slot == 0 && autocvar_g_weaponswitch_debug != 1) + break; } } @@ -232,6 +247,9 @@ IMPULSE(weapon_prev_bygroup) { .entity weaponentity = weaponentities[slot]; W_PreviousWeapon(this, 1, weaponentity); + + if(slot == 0 && autocvar_g_weaponswitch_debug != 1) + break; } } @@ -247,6 +265,9 @@ IMPULSE(weapon_next_bypriority) { .entity weaponentity = weaponentities[slot]; W_NextWeapon(this, 2, weaponentity); + + if(slot == 0 && autocvar_g_weaponswitch_debug != 1) + break; } } @@ -262,6 +283,9 @@ IMPULSE(weapon_prev_bypriority) { .entity weaponentity = weaponentities[slot]; W_PreviousWeapon(this, 2, weaponentity); + + if(slot == 0 && autocvar_g_weaponswitch_debug != 1) + break; } } @@ -273,6 +297,9 @@ IMPULSE(weapon_last) { .entity weaponentity = weaponentities[slot]; W_LastWeapon(this, weaponentity); + + if(slot == 0 && autocvar_g_weaponswitch_debug != 1) + break; } } @@ -284,6 +311,9 @@ IMPULSE(weapon_best) { .entity weaponentity = weaponentities[slot]; W_SwitchWeapon(this, w_getbestweapon(this, weaponentity), weaponentity); + + if(slot == 0 && autocvar_g_weaponswitch_debug != 1) + break; } } @@ -295,6 +325,9 @@ IMPULSE(weapon_drop) { .entity weaponentity = weaponentities[slot]; W_ThrowWeapon(this, weaponentity, W_CalculateProjectileVelocity(this, this.velocity, v_forward * 750, false), '0 0 0', true); + + if(slot == 0 && autocvar_g_weaponswitch_debug != 1) + break; } } @@ -309,16 +342,19 @@ IMPULSE(weapon_reload) .entity weaponentity = weaponentities[slot]; Weapon w = this.(weaponentity).m_weapon; w.wr_reload(w, actor, weaponentity); + + if(slot == 0 && autocvar_g_weaponswitch_debug != 1) + break; } } void ImpulseCommands(entity this) { - if (gameover) return; + if (game_stopped) return; - int imp = this.impulse; + int imp = CS(this).impulse; if (!imp) return; - this.impulse = 0; + CS(this).impulse = 0; if (MinigameImpulse(this, imp)) return; @@ -515,6 +551,9 @@ IMPULSE(waypoint_clear_personal) { delete(this.personal); this.personal = NULL; + + if((g_cts || g_race) && autocvar_g_allow_checkpoints) + ClientKill(this); } sprint(this, "personal waypoint cleared\n"); } @@ -526,25 +565,120 @@ IMPULSE(waypoint_clear) { delete(this.personal); this.personal = NULL; + if((g_cts || g_race) && autocvar_g_allow_checkpoints) + ClientKill(this); } sprint(this, "all waypoints cleared\n"); } +vector waypoint_getSymmetricalOrigin(vector org, int ctf_flags) +{ + vector new_org = org; + if (fabs(autocvar_g_waypointeditor_symmetrical) == 1) + { + vector map_center = havocbot_middlepoint; + if (autocvar_g_waypointeditor_symmetrical == -1) + map_center = autocvar_g_waypointeditor_symmetrical_origin; + + new_org = Rotate(org - map_center, 360 * DEG2RAD / ctf_flags) + map_center; + } + else if (fabs(autocvar_g_waypointeditor_symmetrical) == 2) + { + float m = havocbot_symmetryaxis_equation.x; + float q = havocbot_symmetryaxis_equation.y; + if (autocvar_g_waypointeditor_symmetrical == -2) + { + m = autocvar_g_waypointeditor_symmetrical_axis.x; + q = autocvar_g_waypointeditor_symmetrical_axis.y; + } + + new_org.x = (1 / (1 + m*m)) * ((1 - m*m) * org.x + 2 * m * org.y - 2 * m * q); + new_org.y = (1 / (1 + m*m)) * (2 * m * org.x + (m*m - 1) * org.y + 2 * q); + } + new_org.z = org.z; + return new_org; +} + IMPULSE(navwaypoint_spawn) { if (!autocvar_g_waypointeditor) return; - waypoint_schedulerelink(waypoint_spawn(this.origin, this.origin, 0)); - bprint(strcat("Waypoint spawned at ", vtos(this.origin), "\n")); + entity e; + vector org = this.origin; + int ctf_flags = havocbot_symmetryaxis_equation.z; + bool sym = ((autocvar_g_waypointeditor_symmetrical > 0 && ctf_flags >= 2) + || (autocvar_g_waypointeditor_symmetrical < 0)); + int order = ctf_flags; + if(autocvar_g_waypointeditor_symmetrical_order >= 2) + { + order = autocvar_g_waypointeditor_symmetrical_order; + ctf_flags = order; + } + + LABEL(add_wp); + e = waypoint_spawn(org, org, 0); + waypoint_schedulerelink(e); + bprint(strcat("Waypoint spawned at ", vtos(org), "\n")); + if(sym) + { + org = waypoint_getSymmetricalOrigin(e.origin, ctf_flags); + if (vdist(org - this.origin, >, 32)) + { + if(order > 2) + order--; + else + sym = false; + goto add_wp; + } + } } IMPULSE(navwaypoint_remove) { if (!autocvar_g_waypointeditor) return; entity e = navigation_findnearestwaypoint(this, false); + int ctf_flags = havocbot_symmetryaxis_equation.z; + bool sym = ((autocvar_g_waypointeditor_symmetrical > 0 && ctf_flags >= 2) + || (autocvar_g_waypointeditor_symmetrical < 0)); + int order = ctf_flags; + if(autocvar_g_waypointeditor_symmetrical_order >= 2) + { + order = autocvar_g_waypointeditor_symmetrical_order; + ctf_flags = order; + } + + LABEL(remove_wp); if (!e) return; if (e.wpflags & WAYPOINTFLAG_GENERATED) return; + + if (e.wphardwired) + { + LOG_INFO("^1Warning: ^7Removal of hardwired waypoints is not allowed in the editor. Please remove links from/to this waypoint (", vtos(e.origin), ") by hand from maps/", mapname, ".waypoints.hardwired"); + return; + } + + entity wp_sym = NULL; + if (sym) + { + vector org = waypoint_getSymmetricalOrigin(e.origin, ctf_flags); + IL_EACH(g_waypoints, !(it.wpflags & WAYPOINTFLAG_GENERATED), { + if(vdist(org - it.origin, <, 3)) + { + wp_sym = it; + break; + } + }); + } bprint(strcat("Waypoint removed at ", vtos(e.origin), "\n")); waypoint_remove(e); + if (sym && wp_sym) + { + e = wp_sym; + if(order > 2) + order--; + else + sym = false; + goto remove_wp; + } } IMPULSE(navwaypoint_relink) @@ -576,33 +710,33 @@ IMPULSE(navwaypoint_unreachable) m = 0; IL_EACH(g_waypoints, it.wpcost >= 10000000, { - LOG_INFO("unreachable: ", etos(it), " ", vtos(it.origin), "\n"); + LOG_INFO("unreachable: ", etos(it), " ", vtos(it.origin)); it.colormod_z = 8; it.effects |= EF_NODEPTHTEST | EF_BLUE; ++j; ++m; }); - if (j) LOG_INFOF("%d waypoints cannot be reached from here in any way (marked with blue light)\n", j); + if (j) LOG_INFOF("%d waypoints cannot be reached from here in any way (marked with blue light)", j); navigation_markroutes_inverted(e2); j = 0; IL_EACH(g_waypoints, it.wpcost >= 10000000, { - LOG_INFO("cannot reach me: ", etos(it), " ", vtos(it.origin), "\n"); + LOG_INFO("cannot reach me: ", etos(it), " ", vtos(it.origin)); it.colormod_x = 8; if (!(it.effects & EF_NODEPTHTEST)) // not already reported before ++m; it.effects |= EF_NODEPTHTEST | EF_RED; ++j; }); - if (j) LOG_INFOF("%d waypoints cannot walk to here in any way (marked with red light)\n", j); - if (m) LOG_INFOF("%d waypoints have been marked total\n", m); + if (j) LOG_INFOF("%d waypoints cannot walk to here in any way (marked with red light)", j); + if (m) LOG_INFOF("%d waypoints have been marked total", m); j = 0; IL_EACH(g_spawnpoints, true, { vector org = it.origin; - tracebox(it.origin, STAT(PL_MIN, NULL), STAT(PL_MAX, NULL), it.origin - '0 0 512', MOVE_NOMONSTERS, NULL); + tracebox(it.origin, PL_MIN_CONST, PL_MAX_CONST, it.origin - '0 0 512', MOVE_NOMONSTERS, NULL); setorigin(it, trace_endpos); if (navigation_findnearestwaypoint(it, false)) { @@ -613,7 +747,7 @@ IMPULSE(navwaypoint_unreachable) else { setorigin(it, org); - LOG_INFO("spawn without waypoint: ", etos(it), " ", vtos(it.origin), "\n"); + LOG_INFO("spawn without waypoint: ", etos(it), " ", vtos(it.origin)); it.effects |= EF_NODEPTHTEST; _setmodel(it, this.model); it.frame = this.frame; @@ -623,7 +757,7 @@ IMPULSE(navwaypoint_unreachable) ++j; } }); - if (j) LOG_INFOF("%d spawnpoints have no nearest waypoint (marked by player model)\n", j); + if (j) LOG_INFOF("%d spawnpoints have no nearest waypoint (marked by player model)", j); j = 0; IL_EACH(g_items, true, @@ -634,21 +768,21 @@ IMPULSE(navwaypoint_unreachable) IL_EACH(g_items, true, { if (navigation_findnearestwaypoint(it, false)) continue; - LOG_INFO("item without waypoint: ", etos(it), " ", vtos(it.origin), "\n"); + LOG_INFO("item without waypoint: ", etos(it), " ", vtos(it.origin)); it.effects |= EF_NODEPTHTEST | EF_RED; it.colormod_x = 8; ++j; }); - if (j) LOG_INFOF("%d items have no nearest waypoint and cannot be walked away from (marked with red light)\n", j); + if (j) LOG_INFOF("%d items have no nearest waypoint and cannot be walked away from (marked with red light)", j); j = 0; IL_EACH(g_items, true, { if (navigation_findnearestwaypoint(it, true)) continue; - LOG_INFO("item without waypoint: ", etos(it), " ", vtos(it.origin), "\n"); + LOG_INFO("item without waypoint: ", etos(it), " ", vtos(it.origin)); it.effects |= EF_NODEPTHTEST | EF_BLUE; it.colormod_z = 8; ++j; }); - if (j) LOG_INFOF("%d items have no nearest waypoint and cannot be walked to (marked with blue light)\n", j); + if (j) LOG_INFOF("%d items have no nearest waypoint and cannot be walked to (marked with blue light)", j); }