X-Git-Url: http://de.git.xonotic.org/?a=blobdiff_plain;f=qcsrc%2Fserver%2Fcl_weapons.qc;h=e605a0637cbd98b18c5420d7a744388ae829e228;hb=1ce451290a21e3e2ce094eb3c87116fb786723bd;hp=540e3f84acbba076156d31ddbe8cb20f54a6339f;hpb=19b6e4fe0563a322e4f2295d4c535933a9834f09;p=xonotic%2Fxonotic-data.pk3dir.git diff --git a/qcsrc/server/cl_weapons.qc b/qcsrc/server/cl_weapons.qc index 540e3f84a..e605a0637 100644 --- a/qcsrc/server/cl_weapons.qc +++ b/qcsrc/server/cl_weapons.qc @@ -1,8 +1,6 @@ -void W_Reload() +void W_TriggerReload() { - if(self.switchweapon == self.weapon) - if(self.weaponentity.state == WS_READY) - weapon_action(self.weapon, WR_RELOAD); + weapon_action(self.weapon, WR_RELOAD); } // switch between weapons @@ -17,7 +15,7 @@ void W_SwitchWeapon(float imp) } else { - W_Reload(); + W_TriggerReload(); } }; @@ -123,7 +121,7 @@ void W_NextWeapon(float list) if(list == 0) W_CycleWeapon(weaponorder_byid, -1); else if(list == 1) - W_CycleWeapon(weaponorder_byimpulse, -1); + W_CycleWeapon(self.weaponorder_byimpulse, -1); else if(list == 2) W_CycleWeapon(self.cvar_cl_weaponpriority, -1); } @@ -134,23 +132,11 @@ void W_PreviousWeapon(float list) if(list == 0) W_CycleWeapon(weaponorder_byid, +1); else if(list == 1) - W_CycleWeapon(weaponorder_byimpulse, +1); + W_CycleWeapon(self.weaponorder_byimpulse, +1); else if(list == 2) W_CycleWeapon(self.cvar_cl_weaponpriority, +1); } -string W_FixWeaponOrder_AllowIncomplete(string order) -{ - return W_FixWeaponOrder(order, 0); -} - -string W_FixWeaponOrder_ForceComplete(string order) -{ - if(order == "") - order = W_NumberWeaponOrder(cvar_string("cl_weaponpriority")); - return W_FixWeaponOrder(order, 1); -} - float w_getbestweapon(entity e) { return W_GetCycleWeapon(e, e.cvar_cl_weaponpriority, 0, -1, FALSE, TRUE); @@ -235,6 +221,13 @@ string W_ThrowNewWeapon(entity own, float wpn, float doreduce, vector org, vecto wep.ammofield = thisammo; own.ammofield -= thisammo; 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) + { + own.ammofield += self.weapon_load[self.weapon]; + self.weapon_load[self.weapon] = -1; // schedule the weapon for reloading + } } } s = substring(s, 5, -1); @@ -248,6 +241,20 @@ string W_ThrowNewWeapon(entity own, float wpn, float doreduce, vector org, vecto float W_IsWeaponThrowable(float w) { float wb, wa; + + if (!autocvar_g_pickup_items) + return 0; + if (g_weaponarena) + return 0; + if (g_lms) + return 0; + if (g_ca) + return 0; + if (g_cts) + return 0; + if (g_nexball && w == WEP_GRENADE_LAUNCHER) + return 0; + wb = W_WeaponBit(w); if(!wb) return 0; @@ -277,24 +284,14 @@ void W_ThrowWeapon(vector velo, vector delta, float doreduce) return; // just in case if(MUTATOR_CALLHOOK(ForbidThrowCurrentWeapon)) return; - if (g_weaponarena) + if(!autocvar_g_weapon_throwable) return; - if (g_lms) - return; - if (g_nexball && w == WEP_GRENADE_LAUNCHER) - return; - if (!cvar("g_pickup_items")) - return; - if (g_ca) - return; - if(!cvar("g_weapon_throwable")) + if(autocvar_g_weapon_stay == 1) return; - if(cvar("g_weapon_stay") == 1) + if(self.weaponentity.state != WS_READY) return; if(!W_IsWeaponThrowable(w)) return; - if(self.deadflag == DEAD_NO && self.weaponentity.state != WS_READY) - return; wb = W_WeaponBit(w); if(self.weapons & wb != wb) @@ -305,13 +302,10 @@ void W_ThrowWeapon(vector velo, vector delta, float doreduce) a = W_ThrowNewWeapon(self, w, doreduce, self.origin + delta, velo); if not(a) return; - if(self.health >= 1) - { - if(a == "") - sprint(self, strcat("You dropped the ^2", W_Name(w), "\n")); - else - sprint(self, strcat("You dropped the ^2", W_Name(w), " with ", a, "\n")); - } + if(a == "") + sprint(self, strcat("You dropped the ^2", W_Name(w), "\n")); + else + sprint(self, strcat("You dropped the ^2", W_Name(w), " with ", a, "\n")); }; // Bringed back weapon frame @@ -322,7 +316,10 @@ void W_WeaponFrame() if (frametime) self.weapon_frametime = frametime; - if(((arena_roundbased || g_ca) && time < warmup) || ((time < game_starttime) && !cvar("sv_ready_restart_after_countdown"))) + if(((arena_roundbased || g_ca || g_freezetag) && time < warmup) || ((time < game_starttime) && !autocvar_sv_ready_restart_after_countdown)) + return; + + if(self.freezetag_frozen == 1) return; if (!self.weaponentity || self.health < 1) @@ -350,9 +347,21 @@ void W_WeaponFrame() setanim(self, self.anim_draw, FALSE, TRUE, TRUE); self.weaponentity.state = WS_RAISE; weapon_action(self.switchweapon, WR_SETUP); + + // set our clip load to the load of the weapon we switched to, if it's reloadable + entity e; + 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_size = cvar(strcat("g_balance_", e.netname, "_reload_ammo")); + } + else + self.clip_load = self.clip_size = 0; + // VorteX: add player model weapon select frame here // setcustomframe(PlayerWeaponRaise); - weapon_thinkf(WFRAME_IDLE, cvar("g_balance_weaponswitchdelay"), w_ready); + weapon_thinkf(WFRAME_IDLE, autocvar_g_balance_weaponswitchdelay, w_ready); weapon_boblayer1(PLAYER_WEAPONSELECTION_SPEED, '0 0 0'); } else if (self.weaponentity.state == WS_READY) @@ -365,7 +374,7 @@ void W_WeaponFrame() sound (self, CHAN_WEAPON2, "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, cvar("g_balance_weaponswitchdelay"), w_clear); + weapon_thinkf(WFRAME_DONTCHANGE, autocvar_g_balance_weaponswitchdelay, w_clear); weapon_boblayer1(PLAYER_WEAPONSELECTION_SPEED, PLAYER_WEAPONSELECTION_RANGE); #ifndef INDEPENDENT_ATTACK_FINISHED } @@ -398,6 +407,7 @@ void W_WeaponFrame() 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); } if (time + self.weapon_frametime * 0.5 >= self.weapon_nextthink)