X-Git-Url: http://de.git.xonotic.org/?p=xonotic%2Fxonotic-data.pk3dir.git;a=blobdiff_plain;f=qcsrc%2Fserver%2Fimpulse.qc;h=aa18dab2ba07aba5eb4b1f686a5b04057d9c4f8b;hp=9b36010fec98015253b4e4a92d38054f1d13fed4;hb=42c08e5c16159929187a67150750bce1770b6355;hpb=451e02a2857d8c671f6dcf6a0639ea7c609b3ba9 diff --git a/qcsrc/server/impulse.qc b/qcsrc/server/impulse.qc index 9b36010fec..aa18dab2ba 100644 --- a/qcsrc/server/impulse.qc +++ b/qcsrc/server/impulse.qc @@ -60,7 +60,13 @@ this.impulse = IMP_weapon_group_##slot.impulse; \ return; \ } \ - W_NextWeaponOnImpulse(this, slot); \ + for(int wepslot = 0; wepslot < MAX_WEAPONSLOTS; ++wepslot) \ + { \ + .entity weaponentity = weaponentities[wepslot]; \ + W_NextWeaponOnImpulse(this, slot, weaponentity); \ + if(wepslot == 0 && autocvar_g_weaponswitch_debug != 1) \ + break; \ + } \ } X(1) X(2) @@ -88,7 +94,13 @@ X(0) noref int prev = -1; \ noref int best = 0; \ noref int next = +1; \ - W_CycleWeapon(this, this.cvar_cl_weaponpriorities[slot], dir); \ + for(int wepslot = 0; wepslot < MAX_WEAPONSLOTS; ++wepslot) \ + { \ + .entity weaponentity = weaponentities[wepslot]; \ + W_CycleWeapon(this, this.cvar_cl_weaponpriorities[slot], dir, weaponentity); \ + if(wepslot == 0 && autocvar_g_weaponswitch_debug != 1) \ + break; \ + } \ } X(0, prev) X(1, prev) @@ -135,7 +147,13 @@ X(9, next) this.impulse = IMP_weapon_byid_##i.impulse; \ return; \ } \ - W_SwitchWeapon(this, Weapons_from(WEP_FIRST + i)); \ + for(int slot = 0; slot < MAX_WEAPONSLOTS; ++slot) \ + { \ + .entity weaponentity = weaponentities[slot]; \ + W_SwitchWeapon(this, Weapons_from(WEP_FIRST + i), weaponentity); \ + if(slot == 0 && autocvar_g_weaponswitch_debug != 1) \ + break; \ + } \ } X(0) X(1) @@ -171,7 +189,14 @@ IMPULSE(weapon_next_byid) this.impulse = IMP_weapon_next_byid.impulse; return; } - W_NextWeapon(this, 0); + for(int slot = 0; slot < MAX_WEAPONSLOTS; ++slot) + { + .entity weaponentity = weaponentities[slot]; + W_NextWeapon(this, 0, weaponentity); + + if(slot == 0 && autocvar_g_weaponswitch_debug != 1) + break; + } } IMPULSE(weapon_prev_byid) @@ -182,7 +207,14 @@ IMPULSE(weapon_prev_byid) this.impulse = IMP_weapon_prev_byid.impulse; return; } - W_PreviousWeapon(this, 0); + for(int slot = 0; slot < MAX_WEAPONSLOTS; ++slot) + { + .entity weaponentity = weaponentities[slot]; + W_PreviousWeapon(this, 0, weaponentity); + + if(slot == 0 && autocvar_g_weaponswitch_debug != 1) + break; + } } IMPULSE(weapon_next_bygroup) @@ -193,7 +225,14 @@ IMPULSE(weapon_next_bygroup) this.impulse = IMP_weapon_next_bygroup.impulse; return; } - W_NextWeapon(this, 1); + for(int slot = 0; slot < MAX_WEAPONSLOTS; ++slot) + { + .entity weaponentity = weaponentities[slot]; + W_NextWeapon(this, 1, weaponentity); + + if(slot == 0 && autocvar_g_weaponswitch_debug != 1) + break; + } } IMPULSE(weapon_prev_bygroup) @@ -204,7 +243,14 @@ IMPULSE(weapon_prev_bygroup) this.impulse = IMP_weapon_prev_bygroup.impulse; return; } - W_PreviousWeapon(this, 1); + for(int slot = 0; slot < MAX_WEAPONSLOTS; ++slot) + { + .entity weaponentity = weaponentities[slot]; + W_PreviousWeapon(this, 1, weaponentity); + + if(slot == 0 && autocvar_g_weaponswitch_debug != 1) + break; + } } IMPULSE(weapon_next_bypriority) @@ -215,7 +261,14 @@ IMPULSE(weapon_next_bypriority) this.impulse = IMP_weapon_next_bypriority.impulse; return; } - W_NextWeapon(this, 2); + for(int slot = 0; slot < MAX_WEAPONSLOTS; ++slot) + { + .entity weaponentity = weaponentities[slot]; + W_NextWeapon(this, 2, weaponentity); + + if(slot == 0 && autocvar_g_weaponswitch_debug != 1) + break; + } } IMPULSE(weapon_prev_bypriority) @@ -226,28 +279,56 @@ IMPULSE(weapon_prev_bypriority) this.impulse = IMP_weapon_prev_bypriority.impulse; return; } - W_PreviousWeapon(this, 2); + for(int slot = 0; slot < MAX_WEAPONSLOTS; ++slot) + { + .entity weaponentity = weaponentities[slot]; + W_PreviousWeapon(this, 2, weaponentity); + + if(slot == 0 && autocvar_g_weaponswitch_debug != 1) + break; + } } IMPULSE(weapon_last) { if (this.vehicle) return; if (IS_DEAD(this)) return; - W_LastWeapon(this); + for(int slot = 0; slot < MAX_WEAPONSLOTS; ++slot) + { + .entity weaponentity = weaponentities[slot]; + W_LastWeapon(this, weaponentity); + + if(slot == 0 && autocvar_g_weaponswitch_debug != 1) + break; + } } IMPULSE(weapon_best) { if (this.vehicle) return; if (IS_DEAD(this)) return; - W_SwitchWeapon(this, w_getbestweapon(this)); + for(int slot = 0; slot < MAX_WEAPONSLOTS; ++slot) + { + .entity weaponentity = weaponentities[slot]; + W_SwitchWeapon(this, w_getbestweapon(this, weaponentity), weaponentity); + + if(slot == 0 && autocvar_g_weaponswitch_debug != 1) + break; + } } IMPULSE(weapon_drop) { if (this.vehicle) return; if (IS_DEAD(this)) return; - W_ThrowWeapon(this, weaponentities[0], W_CalculateProjectileVelocity(this, this.velocity, v_forward * 750, false), '0 0 0', true); + for(int slot = 0; slot < MAX_WEAPONSLOTS; ++slot) + { + .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; + } } IMPULSE(weapon_reload) @@ -255,18 +336,21 @@ IMPULSE(weapon_reload) if (this.vehicle) return; if (IS_DEAD(this)) return; if (forbidWeaponUse(this)) return; - Weapon w = PS(this).m_weapon; entity actor = this; for(int slot = 0; slot < MAX_WEAPONSLOTS; ++slot) { .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; if (!imp) return; @@ -467,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"); } @@ -478,25 +565,118 @@ 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_symmetryaxys_equation.x; + float q = havocbot_symmetryaxys_equation.y; + if (autocvar_g_waypointeditor_symmetrical == -2) + { + m = autocvar_g_waypointeditor_symmetrical_axys.x; + q = autocvar_g_waypointeditor_symmetrical_axys.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; + bool sym = boolean(autocvar_g_waypointeditor_symmetrical); + int ctf_flags = havocbot_symmetryaxys_equation.z; + 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); + bool sym = boolean(autocvar_g_waypointeditor_symmetrical); + int ctf_flags = havocbot_symmetryaxys_equation.z; + 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\n"); + return; + } + + entity wp_sym = NULL; + if (sym) + { + vector org = waypoint_getSymmetricalOrigin(e.origin, ctf_flags); + FOREACH_ENTITY_CLASS("waypoint", !(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)