X-Git-Url: http://de.git.xonotic.org/?a=blobdiff_plain;f=qcsrc%2Fserver%2Fcl_weapons.qc;h=4a333934ae84a5ddc83f4281e2f7406daff1ef9a;hb=e5cec7ef408853cad605faadb3a1ee0a4b5a5a9d;hp=7b0bbce3c8ff83ab2b4314ab087b252f5a10b30f;hpb=e485fd25f90166cbd4a258456a7bd66540536608;p=xonotic%2Fxonotic-data.pk3dir.git diff --git a/qcsrc/server/cl_weapons.qc b/qcsrc/server/cl_weapons.qc index 7b0bbce3c..4a333934a 100644 --- a/qcsrc/server/cl_weapons.qc +++ b/qcsrc/server/cl_weapons.qc @@ -137,6 +137,15 @@ void W_PreviousWeapon(float list) W_CycleWeapon(self.cvar_cl_weaponpriority, +1); } +// previously used if exists and has ammo, (second) best otherwise +void W_LastWeapon() +{ + if(client_hasweapon(self, self.cnt, TRUE, FALSE)) + W_SwitchWeapon(self.cnt); + else + W_SwitchToOtherWeapon(self); +} + float w_getbestweapon(entity e) { return W_GetCycleWeapon(e, e.cvar_cl_weaponpriority, 0, -1, FALSE, TRUE); @@ -197,6 +206,7 @@ string W_ThrowNewWeapon(entity own, float wpn, float doreduce, vector org, vecto self = oldself; if(startitem_failed) return string_null; + wep.glowmod = own.weaponentity_glowmod; wep.think = thrown_wep_think; wep.nextthink = time + 0.5; return ""; @@ -223,15 +233,16 @@ string W_ThrowNewWeapon(entity own, float wpn, float doreduce, vector org, vecto s = strcat(s, " and ", ftos(thisammo), " ", Item_CounterFieldName(j)); // if our weapon is loaded, give its load back to the player - if(self.weapon_load[self.weapon] > 0) + if(self.(weapon_load[self.weapon]) > 0) { - own.ammofield += self.weapon_load[self.weapon]; - self.weapon_load[self.weapon] = -1; // schedule the weapon for reloading + own.ammofield += self.(weapon_load[self.weapon]); + self.(weapon_load[self.weapon]) = -1; // schedule the weapon for reloading } } } s = substring(s, 5, -1); } + wep.glowmod = own.weaponentity_glowmod; wep.think = thrown_wep_think; wep.nextthink = time + 0.5; return s; @@ -319,7 +330,7 @@ void W_WeaponFrame() if(((arena_roundbased || g_ca || g_freezetag) && time < warmup) || ((time < game_starttime) && !autocvar_sv_ready_restart_after_countdown)) return; - if(g_freezetag && self.freezetag_frozen == 1) + if(self.freezetag_frozen == 1) return; if (!self.weaponentity || self.health < 1) @@ -328,6 +339,7 @@ void W_WeaponFrame() if(!self.switchweapon) { self.weapon = 0; + self.switchingweapon = 0; self.weaponentity.state = WS_CLEAR; self.weaponname = ""; self.items &~= IT_AMMO; @@ -344,7 +356,10 @@ void W_WeaponFrame() { if (self.weaponentity.state == WS_CLEAR) { - setanim(self, self.anim_draw, FALSE, TRUE, TRUE); + // end switching! + self.switchingweapon = self.switchweapon; + + //setanim(self, self.anim_draw, FALSE, TRUE, TRUE); self.weaponentity.state = WS_RAISE; weapon_action(self.switchweapon, WR_SETUP); @@ -353,7 +368,7 @@ void W_WeaponFrame() e = get_weaponinfo(self.switchweapon); if(e.spawnflags & WEP_FLAG_RELOADABLE && cvar(strcat("g_balance_", e.netname, "_reload_ammo"))) // prevent accessing undefined cvars { - self.clip_load = self.weapon_load[self.switchweapon]; + self.clip_load = self.(weapon_load[self.switchweapon]); self.clip_size = cvar(strcat("g_balance_", e.netname, "_reload_ammo")); } else @@ -364,14 +379,21 @@ void W_WeaponFrame() weapon_thinkf(WFRAME_IDLE, autocvar_g_balance_weaponswitchdelay, w_ready); weapon_boblayer1(PLAYER_WEAPONSELECTION_SPEED, '0 0 0'); } + else if (self.weaponentity.state == WS_DROP) + { + // in dropping phase we can switch at any time + self.switchingweapon = self.switchweapon; + } else if (self.weaponentity.state == WS_READY) { + // start switching! + self.switchingweapon = self.switchweapon; + #ifndef INDEPENDENT_ATTACK_FINISHED if(ATTACK_FINISHED(self) <= time + self.weapon_frametime * 0.5) { #endif - // UGLY WORKAROUND: play this on CHAN_WEAPON2 so it can't cut off fire sounds - sound (self, CHAN_WEAPON2, "weapons/weapon_switch.wav", VOL_BASE, ATTN_NORM); + sound (self, CH_WEAPON_SINGLE, "weapons/weapon_switch.wav", VOL_BASE, ATTN_NORM); self.weaponentity.state = WS_DROP; // set up weapon switch think in the future, and start drop anim weapon_thinkf(WFRAME_DONTCHANGE, autocvar_g_balance_weaponswitchdelay, w_clear); @@ -399,17 +421,20 @@ void W_WeaponFrame() c = c + 1; if(wb && ((self.weapons & wb) == 0)) { - W_SwitchWeapon_Force(self, w_getbestweapon(self)); + if(self.weapon == self.switchweapon) + W_SwitchWeapon_Force(self, w_getbestweapon(self)); wb = 0; } + + v_forward = fo; + v_right = ri; + v_up = up; + if(wb) - { - v_forward = fo; - v_right = ri; - v_up = up; - self.weaponentity_glowmod = '0 0 0'; // reset glowmod, weapon think function only *might* set it weapon_action(self.weapon, WR_THINK); - } + else + weapon_action(self.weapon, WR_GONETHINK); + if (time + self.weapon_frametime * 0.5 >= self.weapon_nextthink) { if(self.weapon_think)