X-Git-Url: http://git.xonotic.org/?a=blobdiff_plain;f=qcsrc%2Fserver%2Fimpulse.qc;h=f066615f326b270e81b4e98b8161aeb4312c689a;hb=969dc49d01d650a812706aba16c765af488605d0;hp=8a17ef6a1dd44abfca2b064b20434285a5df1054;hpb=a692581c23cc689f1f695dd04b6b2a2b27a567f0;p=xonotic%2Fxonotic-data.pk3dir.git diff --git a/qcsrc/server/impulse.qc b/qcsrc/server/impulse.qc index 8a17ef6a1..f066615f3 100644 --- a/qcsrc/server/impulse.qc +++ b/qcsrc/server/impulse.qc @@ -4,11 +4,14 @@ #include "weapons/throwing.qh" #include "command/common.qh" #include "cheats.qh" +#include "client.qh" #include "clientkill.qh" #include "weapons/selection.qh" #include "weapons/tracing.qh" #include "weapons/weaponsystem.qh" +#include + #include #include "../common/minigames/sv_minigames.qh" @@ -51,19 +54,19 @@ // weapon switching impulses -#define X(slot) \ - IMPULSE(weapon_group_##slot) \ +#define X(i) \ + IMPULSE(weapon_group_##i) \ { \ if (IS_DEAD(this)) \ { \ - this.impulse = IMP_weapon_group_##slot.impulse; \ + this.impulse = IMP_weapon_group_##i.impulse; \ return; \ } \ - for(int wepslot = 0; wepslot < MAX_WEAPONSLOTS; ++wepslot) \ + for(int slot = 0; slot < MAX_WEAPONSLOTS; ++slot) \ { \ - .entity weaponentity = weaponentities[wepslot]; \ - W_NextWeaponOnImpulse(this, slot, weaponentity); \ - if(wepslot == 0 && autocvar_g_weaponswitch_debug != 1) \ + .entity weaponentity = weaponentities[slot]; \ + W_NextWeaponOnImpulse(this, i, weaponentity); \ + if(autocvar_g_weaponswitch_debug != 1) \ break; \ } \ } @@ -81,23 +84,23 @@ X(0) // custom order weapon cycling -#define X(slot, dir) \ - IMPULSE(weapon_priority_##slot##_##dir) \ +#define X(i, dir) \ + IMPULSE(weapon_priority_##i##_##dir) \ { \ if (this.vehicle) return; \ if (IS_DEAD(this)) \ { \ - this.impulse = IMP_weapon_priority_##slot##_##dir.impulse; \ + this.impulse = IMP_weapon_priority_##i##_##dir.impulse; \ return; \ } \ noref int prev = -1; \ noref int best = 0; \ noref int next = +1; \ - for(int wepslot = 0; wepslot < MAX_WEAPONSLOTS; ++wepslot) \ + for(int slot = 0; slot < MAX_WEAPONSLOTS; ++slot) \ { \ - .entity weaponentity = weaponentities[wepslot]; \ - W_CycleWeapon(this, CS(this).cvar_cl_weaponpriorities[slot], dir, weaponentity); \ - if(wepslot == 0 && autocvar_g_weaponswitch_debug != 1) \ + .entity weaponentity = weaponentities[slot]; \ + W_CycleWeapon(this, CS(this).cvar_cl_weaponpriorities[i], dir, weaponentity); \ + if(autocvar_g_weaponswitch_debug != 1) \ break; \ } \ } @@ -149,8 +152,8 @@ X(9, next) for(int slot = 0; slot < MAX_WEAPONSLOTS; ++slot) \ { \ .entity weaponentity = weaponentities[slot]; \ - W_SwitchWeapon_TryOthers(this, Weapons_from(WEP_FIRST + i), weaponentity); \ - if(slot == 0 && autocvar_g_weaponswitch_debug != 1) \ + W_SwitchWeapon_TryOthers(this, REGISTRY_GET(Weapons, WEP_FIRST + i), weaponentity); \ + if(autocvar_g_weaponswitch_debug != 1) \ break; \ } \ } @@ -193,7 +196,7 @@ IMPULSE(weapon_next_byid) .entity weaponentity = weaponentities[slot]; W_NextWeapon(this, 0, weaponentity); - if(slot == 0 && autocvar_g_weaponswitch_debug != 1) + if(autocvar_g_weaponswitch_debug != 1) break; } } @@ -211,7 +214,7 @@ IMPULSE(weapon_prev_byid) .entity weaponentity = weaponentities[slot]; W_PreviousWeapon(this, 0, weaponentity); - if(slot == 0 && autocvar_g_weaponswitch_debug != 1) + if(autocvar_g_weaponswitch_debug != 1) break; } } @@ -229,7 +232,7 @@ IMPULSE(weapon_next_bygroup) .entity weaponentity = weaponentities[slot]; W_NextWeapon(this, 1, weaponentity); - if(slot == 0 && autocvar_g_weaponswitch_debug != 1) + if(autocvar_g_weaponswitch_debug != 1) break; } } @@ -247,7 +250,7 @@ IMPULSE(weapon_prev_bygroup) .entity weaponentity = weaponentities[slot]; W_PreviousWeapon(this, 1, weaponentity); - if(slot == 0 && autocvar_g_weaponswitch_debug != 1) + if(autocvar_g_weaponswitch_debug != 1) break; } } @@ -265,7 +268,7 @@ IMPULSE(weapon_next_bypriority) .entity weaponentity = weaponentities[slot]; W_NextWeapon(this, 2, weaponentity); - if(slot == 0 && autocvar_g_weaponswitch_debug != 1) + if(autocvar_g_weaponswitch_debug != 1) break; } } @@ -283,7 +286,7 @@ IMPULSE(weapon_prev_bypriority) .entity weaponentity = weaponentities[slot]; W_PreviousWeapon(this, 2, weaponentity); - if(slot == 0 && autocvar_g_weaponswitch_debug != 1) + if(autocvar_g_weaponswitch_debug != 1) break; } } @@ -297,7 +300,7 @@ IMPULSE(weapon_last) .entity weaponentity = weaponentities[slot]; W_LastWeapon(this, weaponentity); - if(slot == 0 && autocvar_g_weaponswitch_debug != 1) + if(autocvar_g_weaponswitch_debug != 1) break; } } @@ -311,7 +314,7 @@ IMPULSE(weapon_best) .entity weaponentity = weaponentities[slot]; W_SwitchWeapon(this, w_getbestweapon(this, weaponentity), weaponentity); - if(slot == 0 && autocvar_g_weaponswitch_debug != 1) + if(autocvar_g_weaponswitch_debug != 1) break; } } @@ -320,13 +323,19 @@ IMPULSE(weapon_drop) { if (this.vehicle) return; if (IS_DEAD(this)) return; + bool is_dualwielding = W_DualWielding(this); 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; + vector md = this.(weaponentity).movedir; + vector vecs = ((md.x > 0) ? md : '0 0 0'); + vector dv = v_right * -vecs.y; + if(!is_dualwielding) + dv = '0 0 0'; // don't override! + W_ThrowWeapon(this, weaponentity, W_CalculateProjectileVelocity(this, this.velocity, v_forward * 750, false), dv, true); + + if(autocvar_g_weaponswitch_debug == 2) + break; // in this mode, the off-hand weapon is selected based on the primary weapon, don't drop it twice! } } @@ -334,7 +343,7 @@ IMPULSE(weapon_reload) { if (this.vehicle) return; if (IS_DEAD(this)) return; - if (forbidWeaponUse(this)) return; + if (weaponLocked(this)) return; entity actor = this; for(int slot = 0; slot < MAX_WEAPONSLOTS; ++slot) { @@ -343,7 +352,7 @@ IMPULSE(weapon_reload) w.wr_reload(w, actor, weaponentity); // allow reloading all active slots? - //if(slot == 0 && autocvar_g_weaponswitch_debug != 1) + //if(autocvar_g_weaponswitch_debug != 1) //break; } } @@ -507,7 +516,7 @@ IMPULSE(waypoint_here_here) IMPULSE(waypoint_here_crosshair) { - WarpZone_crosshair_trace(this); + WarpZone_crosshair_trace_plusvisibletriggers(this); entity wp = WaypointSprite_DeployFixed(WP_Here, false, this, trace_endpos, RADARICON_HERE); if (wp) WaypointSprite_Ping(wp); sprint(this, "HERE spawned at crosshair\n");