X-Git-Url: http://git.xonotic.org/?a=blobdiff_plain;f=qcsrc%2Fserver%2Fcl_weapons.qc;h=34f17a613a7f438f566b6d47859463f50729ac4b;hb=9d9cf783d3ac428fbbe95553c8f5c7e113d888bb;hp=fac0d73aa2cbf09b30f36ed949e7bb97a9d26085;hpb=dbdc35464a18f62bf550a20eddac9ec16b0eacee;p=xonotic%2Fxonotic-data.pk3dir.git diff --git a/qcsrc/server/cl_weapons.qc b/qcsrc/server/cl_weapons.qc index fac0d73aa..34f17a613 100644 --- a/qcsrc/server/cl_weapons.qc +++ b/qcsrc/server/cl_weapons.qc @@ -158,21 +158,6 @@ float weapon_action(float wpn, float wrequest) return (get_weaponinfo(wpn)).weapon_func(wrequest); } -string W_Name(float weaponid) -{ - return (get_weaponinfo(weaponid)).message; -} - -float W_WeaponBit(float wpn) -{ - return (get_weaponinfo(wpn)).weapons; -} - -float W_AmmoItemCode(float wpn) -{ - return (get_weaponinfo(wpn)).items & IT_AMMO; -} - .float savenextthink; void thrown_wep_think() { @@ -203,7 +188,7 @@ string W_ThrowNewWeapon(entity own, float wpn, float doreduce, vector org, vecto wep.flags |= FL_TOSSED; wep.colormap = own.colormap; - if(W_WeaponBit(wpn) & WEPBIT_SUPERWEAPONS) + if(WEPSET_CONTAINS_AW(WEPBIT_SUPERWEAPONS, wpn)) { if(own.items & IT_UNLIMITED_SUPERWEAPONS) { @@ -213,8 +198,9 @@ string W_ThrowNewWeapon(entity own, float wpn, float doreduce, vector org, vecto { float superweapons = 1; for(i = WEP_FIRST; i <= WEP_LAST; ++i) - if(own.weapons & WEPBIT_SUPERWEAPONS & W_WeaponBit(i)) - ++superweapons; + if(WEPSET_CONTAINS_AW(WEPBIT_SUPERWEAPONS, i)) + if(WEPSET_CONTAINS_EW(own, i)) + ++superweapons; if(superweapons <= 1) { wep.superweapons_finished = own.superweapons_finished; @@ -262,7 +248,6 @@ string W_ThrowNewWeapon(entity own, float wpn, float doreduce, vector org, vecto if(wa & j) { ammofield = Item_CounterField(j); - wep.ammofield = 0; // if our weapon is loaded, give its load back to the player if(self.(weapon_load[self.weapon]) > 0) @@ -270,6 +255,8 @@ string W_ThrowNewWeapon(entity own, float wpn, float doreduce, vector org, vecto own.ammofield += self.(weapon_load[self.weapon]); self.(weapon_load[self.weapon]) = -1; // schedule the weapon for reloading } + + wep.ammofield = 0; } } } @@ -280,10 +267,6 @@ string W_ThrowNewWeapon(entity own, float wpn, float doreduce, vector org, vecto if(wa & j) { ammofield = Item_CounterField(j); - thisammo = min(own.ammofield, wep.ammofield); - 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) @@ -291,6 +274,11 @@ string W_ThrowNewWeapon(entity own, float wpn, float doreduce, vector org, vecto own.ammofield += self.(weapon_load[self.weapon]); self.(weapon_load[self.weapon]) = -1; // schedule the weapon for reloading } + + thisammo = min(own.ammofield, wep.ammofield); + wep.ammofield = thisammo; + own.ammofield -= thisammo; + s = strcat(s, " and ", ftos(thisammo), " ", Item_CounterFieldName(j)); } } s = substring(s, 5, -1); @@ -300,32 +288,28 @@ string W_ThrowNewWeapon(entity own, float wpn, float doreduce, vector org, vecto wep.savenextthink = wep.nextthink; wep.nextthink = min(wep.nextthink, time + 0.5); wep.pickup_anyway = TRUE; // these are ALWAYS pickable + return s; } } float W_IsWeaponThrowable(float w) { - float wb, wa; + float 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_PORTO) - return 0; - - wb = W_WeaponBit(w); - if(!wb) + if (g_nexball && w == WEP_GRENADE_LAUNCHER) return 0; + if(w == 0) + return 0; + wa = W_AmmoItemCode(w); - if(start_weapons & wb) + if(WEPSET_CONTAINS_AW(start_weapons, w)) { // start weapons that take no ammo can't be dropped (this prevents dropping the laser, as long as it continues to use no ammo) if(start_items & IT_UNLIMITED_WEAPON_AMMO) @@ -340,7 +324,7 @@ float W_IsWeaponThrowable(float w) // toss current weapon void W_ThrowWeapon(vector velo, vector delta, float doreduce) { - float w, wb; + float w; string a; w = self.weapon; @@ -355,22 +339,30 @@ void W_ThrowWeapon(vector velo, vector delta, float doreduce) if(!W_IsWeaponThrowable(w)) return; - wb = W_WeaponBit(w); - if(self.weapons & wb != wb) + if(!WEPSET_CONTAINS_EW(self, w)) return; + WEPSET_ANDNOT_EW(self, w); - self.weapons &~= wb; W_SwitchWeapon_Force(self, w_getbestweapon(self)); a = W_ThrowNewWeapon(self, w, doreduce, self.origin + delta, velo); - if not(a) - return; - 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 not(a) return; + Send_Notification(NOTIF_ONE, self, MSG_MULTI, ITEM_WEAPON_DROP, a, w); +} + +float forbidWeaponUse() +{ + if(time < game_starttime && !autocvar_sv_ready_restart_after_countdown) + return 1; + if(round_handler_IsActive() && !round_handler_IsRoundStarted()) + return 1; + if(self.player_blocked) + return 1; + if(self.freezetag_frozen) + return 1; + return 0; } -// Bringed back weapon frame void W_WeaponFrame() { vector fo, ri, up; @@ -378,15 +370,16 @@ void W_WeaponFrame() if (frametime) self.weapon_frametime = frametime; - 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) return; // Dead player can't use weapons and injure impulse commands + if(forbidWeaponUse()) + if(self.weaponentity.state != WS_CLEAR) + { + w_ready(); + return; + } + if(!self.switchweapon) { self.weapon = 0; @@ -410,24 +403,25 @@ void W_WeaponFrame() // end switching! self.switchingweapon = self.switchweapon; + entity newwep = get_weaponinfo(self.switchweapon); + //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 + if(newwep.spawnflags & WEP_FLAG_RELOADABLE && cvar(strcat("g_balance_", newwep.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")); + self.clip_size = cvar(strcat("g_balance_", newwep.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, autocvar_g_balance_weaponswitchdelay, w_ready); + weapon_thinkf(WFRAME_IDLE, cvar(sprintf("g_balance_%s_switchdelay_raise", newwep.netname)), w_ready); + //print(sprintf("W_WeaponFrame(): cvar: %s, value: %f\n", sprintf("g_balance_%s_switchdelay_raise", newwep.netname), cvar(sprintf("g_balance_%s_switchdelay_raise", newwep.netname)))); weapon_boblayer1(PLAYER_WEAPONSELECTION_SPEED, '0 0 0'); } else if (self.weaponentity.state == WS_DROP) @@ -440,6 +434,8 @@ void W_WeaponFrame() // start switching! self.switchingweapon = self.switchweapon; + entity oldwep = get_weaponinfo(self.weapon); + #ifndef INDEPENDENT_ATTACK_FINISHED if(ATTACK_FINISHED(self) <= time + self.weapon_frametime * 0.5) { @@ -447,7 +443,8 @@ void W_WeaponFrame() 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); + weapon_thinkf(WFRAME_DONTCHANGE, cvar(sprintf("g_balance_%s_switchdelay_drop", oldwep.netname)), w_clear); + //print(sprintf("W_WeaponFrame(): cvar: %s, value: %f\n", sprintf("g_balance_%s_switchdelay_drop", oldwep.netname), cvar(sprintf("g_balance_%s_switchdelay_drop", oldwep.netname)))); weapon_boblayer1(PLAYER_WEAPONSELECTION_SPEED, PLAYER_WEAPONSELECTION_RANGE); #ifndef INDEPENDENT_ATTACK_FINISHED } @@ -459,8 +456,8 @@ void W_WeaponFrame() //if (self.button0) // print(ftos(frametime), " ", ftos(time), " >= ", ftos(ATTACK_FINISHED(self)), " >= ", ftos(self.weapon_nextthink), "\n"); - float wb; - wb = W_WeaponBit(self.weapon); + float w; + w = self.weapon; // call the think code which may fire the weapon // and do so multiple times to resolve framerate dependency issues if the @@ -470,18 +467,18 @@ void W_WeaponFrame() while (c < W_TICSPERFRAME) { c = c + 1; - if(wb && ((self.weapons & wb) == 0)) + if(w && !WEPSET_CONTAINS_EW(self, w)) { if(self.weapon == self.switchweapon) W_SwitchWeapon_Force(self, w_getbestweapon(self)); - wb = 0; + w = 0; } v_forward = fo; v_right = ri; v_up = up; - if(wb) + if(w) weapon_action(self.weapon, WR_THINK); else weapon_action(self.weapon, WR_GONETHINK); @@ -521,3 +518,20 @@ void W_WeaponFrame() self.currentammo = 1; #endif } + +string W_Apply_Weaponreplace(string in) +{ + float n = tokenize_console(in); + string out = ""; + float i; + for(i = 0; i < n; ++i) + { + string s = argv(i); + string r = cvar_string(strcat("g_weaponreplace_", s)); + if(r == "") + out = strcat(out, " ", s); + else if(r != "0") + out = strcat(out, " ", r); + } + return substring(out, 1, -1); +}