X-Git-Url: http://de.git.xonotic.org/?p=xonotic%2Fxonotic-data.pk3dir.git;a=blobdiff_plain;f=qcsrc%2Fserver%2Fimpulse.qc;h=a7f9554294fc40ad246505743f4721a6b194b199;hp=c797c577101bab19df58bb5fdb9985293034e02f;hb=3ea922dd69aea306c1fb733a1adab7d3b9e9ec85;hpb=b0210c08a287ad4631e16ddf3a83a0b0c546283f diff --git a/qcsrc/server/impulse.qc b/qcsrc/server/impulse.qc index c797c57710..a7f9554294 100644 --- a/qcsrc/server/impulse.qc +++ b/qcsrc/server/impulse.qc @@ -14,7 +14,7 @@ #include "../common/minigames/sv_minigames.qh" -#include "../common/weapons/all.qh" +#include #include "../common/vehicles/sv_vehicles.qh" #include "../common/mutators/mutator/waypoints/waypointsprites.qh" @@ -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,6 +565,8 @@ 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"); } @@ -495,6 +584,13 @@ IMPULSE(navwaypoint_remove) entity e = navigation_findnearestwaypoint(this, false); 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; + } + bprint(strcat("Waypoint removed at ", vtos(e.origin), "\n")); waypoint_remove(e); } @@ -551,10 +647,10 @@ IMPULSE(navwaypoint_unreachable) if (m) LOG_INFOF("%d waypoints have been marked total\n", m); j = 0; - FOREACH_ENTITY_CLASS("info_player_deathmatch", true, + 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)) { @@ -578,12 +674,12 @@ IMPULSE(navwaypoint_unreachable) if (j) LOG_INFOF("%d spawnpoints have no nearest waypoint (marked by player model)\n", j); j = 0; - FOREACH_ENTITY_FLAGS(flags, FL_ITEM, + IL_EACH(g_items, true, { it.effects &= ~(EF_NODEPTHTEST | EF_RED | EF_BLUE); it.colormod = '0.5 0.5 0.5'; }); - FOREACH_ENTITY_FLAGS(flags, FL_ITEM, + IL_EACH(g_items, true, { if (navigation_findnearestwaypoint(it, false)) continue; LOG_INFO("item without waypoint: ", etos(it), " ", vtos(it.origin), "\n"); @@ -594,7 +690,7 @@ IMPULSE(navwaypoint_unreachable) if (j) LOG_INFOF("%d items have no nearest waypoint and cannot be walked away from (marked with red light)\n", j); j = 0; - FOREACH_ENTITY_FLAGS(flags, FL_ITEM, + IL_EACH(g_items, true, { if (navigation_findnearestwaypoint(it, true)) continue; LOG_INFO("item without waypoint: ", etos(it), " ", vtos(it.origin), "\n");