From: Samual Lenks Date: Mon, 1 Jul 2013 08:42:11 +0000 (-0400) Subject: Merge cl_weapons code into main X-Git-Tag: xonotic-v0.8.0~152^2~347 X-Git-Url: https://git.rm.cloudns.org/?a=commitdiff_plain;h=c9b87496eed58e4a95615d62dabf0ee2ef999fd2;p=xonotic%2Fxonotic-data.pk3dir.git Merge cl_weapons code into main --- diff --git a/qcsrc/server/weapons/cl_weapons.qc b/qcsrc/server/weapons/cl_weapons.qc deleted file mode 100644 index abb8f3af1..000000000 --- a/qcsrc/server/weapons/cl_weapons.qc +++ /dev/null @@ -1,165 +0,0 @@ -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; -} - -void W_WeaponFrame() -{ - vector fo, ri, up; - - if (frametime) - self.weapon_frametime = frametime; - - 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; - self.switchingweapon = 0; - self.weaponentity.state = WS_CLEAR; - self.weaponname = ""; - self.items &~= IT_AMMO; - return; - } - - makevectors(self.v_angle); - fo = v_forward; // save them in case the weapon think functions change it - ri = v_right; - up = v_up; - - // Change weapon - if (self.weapon != self.switchweapon) - { - if (self.weaponentity.state == WS_CLEAR) - { - // end switching! - self.switchingweapon = self.switchweapon; - entity newwep = get_weaponinfo(self.switchweapon); - - self.items &~= IT_AMMO; - self.items = self.items | (newwep.items & IT_AMMO); - - // the two weapon entities will notice this has changed and update their models - self.weapon = self.switchweapon; - self.weaponname = newwep.mdl; - self.bulletcounter = 0; // WEAPONTODO - WEP_ACTION(self.switchweapon, WR_SETUP); - self.weaponentity.state = WS_RAISE; - - // set our clip load to the load of the weapon we switched to, if it's reloadable - 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_", 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, newwep.switchdelay_raise, 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) - { - // 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; - - entity oldwep = get_weaponinfo(self.weapon); - -#ifndef INDEPENDENT_ATTACK_FINISHED - if(ATTACK_FINISHED(self) <= time + self.weapon_frametime * 0.5) - { -#endif - 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, oldwep.switchdelay_drop, 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 - } -#endif - } - } - - // LordHavoc: network timing test code - //if (self.button0) - // print(ftos(frametime), " ", ftos(time), " >= ", ftos(ATTACK_FINISHED(self)), " >= ", ftos(self.weapon_nextthink), "\n"); - - 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 - // server framerate is very low and the weapon fire rate very high - float c; - c = 0; - while (c < W_TICSPERFRAME) - { - c = c + 1; - if(w && !WEPSET_CONTAINS_EW(self, w)) - { - if(self.weapon == self.switchweapon) - W_SwitchWeapon_Force(self, w_getbestweapon(self)); - w = 0; - } - - v_forward = fo; - v_right = ri; - v_up = up; - - if(w) - WEP_ACTION(self.weapon, WR_THINK); - else - WEP_ACTION(self.weapon, WR_GONETHINK); - - if (time + self.weapon_frametime * 0.5 >= self.weapon_nextthink) - { - if(self.weapon_think) - { - v_forward = fo; - v_right = ri; - v_up = up; - self.weapon_think(); - } - else - bprint("\{1}^1ERROR: undefined weapon think function for ", self.netname, "\n"); - } - } - -#if 0 - if (self.items & IT_CELLS) - self.currentammo = self.ammo_cells; - else if (self.items & IT_ROCKETS) - self.currentammo = self.ammo_rockets; - else if (self.items & IT_NAILS) - self.currentammo = self.ammo_nails; - else if (self.items & IT_SHELLS) - self.currentammo = self.ammo_shells; - else - self.currentammo = 1; -#endif -} diff --git a/qcsrc/server/weapons/cl_weapons.qh b/qcsrc/server/weapons/cl_weapons.qh deleted file mode 100644 index bd60f4b01..000000000 --- a/qcsrc/server/weapons/cl_weapons.qh +++ /dev/null @@ -1,4 +0,0 @@ -float weaponswapping; -float internalteam; - -void weapon_defaultspawnfunc(float wpn); diff --git a/qcsrc/server/weapons/main.qc b/qcsrc/server/weapons/main.qc index be5eca13b..68c78aa9b 100644 --- a/qcsrc/server/weapons/main.qc +++ b/qcsrc/server/weapons/main.qc @@ -777,6 +777,172 @@ void weapon_thinkf(float fr, float t, void() func) } } +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; +} + +void W_WeaponFrame() +{ + vector fo, ri, up; + + if (frametime) + self.weapon_frametime = frametime; + + 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; + self.switchingweapon = 0; + self.weaponentity.state = WS_CLEAR; + self.weaponname = ""; + self.items &~= IT_AMMO; + return; + } + + makevectors(self.v_angle); + fo = v_forward; // save them in case the weapon think functions change it + ri = v_right; + up = v_up; + + // Change weapon + if (self.weapon != self.switchweapon) + { + if (self.weaponentity.state == WS_CLEAR) + { + // end switching! + self.switchingweapon = self.switchweapon; + entity newwep = get_weaponinfo(self.switchweapon); + + self.items &~= IT_AMMO; + self.items = self.items | (newwep.items & IT_AMMO); + + // the two weapon entities will notice this has changed and update their models + self.weapon = self.switchweapon; + self.weaponname = newwep.mdl; + self.bulletcounter = 0; // WEAPONTODO + WEP_ACTION(self.switchweapon, WR_SETUP); + self.weaponentity.state = WS_RAISE; + + // set our clip load to the load of the weapon we switched to, if it's reloadable + 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_", 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, newwep.switchdelay_raise, 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) + { + // 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; + + entity oldwep = get_weaponinfo(self.weapon); + +#ifndef INDEPENDENT_ATTACK_FINISHED + if(ATTACK_FINISHED(self) <= time + self.weapon_frametime * 0.5) + { +#endif + 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, oldwep.switchdelay_drop, 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 + } +#endif + } + } + + // LordHavoc: network timing test code + //if (self.button0) + // print(ftos(frametime), " ", ftos(time), " >= ", ftos(ATTACK_FINISHED(self)), " >= ", ftos(self.weapon_nextthink), "\n"); + + 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 + // server framerate is very low and the weapon fire rate very high + float c; + c = 0; + while (c < W_TICSPERFRAME) + { + c = c + 1; + if(w && !WEPSET_CONTAINS_EW(self, w)) + { + if(self.weapon == self.switchweapon) + W_SwitchWeapon_Force(self, w_getbestweapon(self)); + w = 0; + } + + v_forward = fo; + v_right = ri; + v_up = up; + + if(w) + WEP_ACTION(self.weapon, WR_THINK); + else + WEP_ACTION(self.weapon, WR_GONETHINK); + + if (time + self.weapon_frametime * 0.5 >= self.weapon_nextthink) + { + if(self.weapon_think) + { + v_forward = fo; + v_right = ri; + v_up = up; + self.weapon_think(); + } + else + bprint("\{1}^1ERROR: undefined weapon think function for ", self.netname, "\n"); + } + } + +#if 0 + if (self.items & IT_CELLS) + self.currentammo = self.ammo_cells; + else if (self.items & IT_ROCKETS) + self.currentammo = self.ammo_rockets; + else if (self.items & IT_NAILS) + self.currentammo = self.ammo_nails; + else if (self.items & IT_SHELLS) + self.currentammo = self.ammo_shells; + else + self.currentammo = 1; +#endif +} + void weapon_boblayer1(float spd, vector org) { // VorteX: haste can be added here diff --git a/qcsrc/server/weapons/main.qh b/qcsrc/server/weapons/main.qh new file mode 100644 index 000000000..bd60f4b01 --- /dev/null +++ b/qcsrc/server/weapons/main.qh @@ -0,0 +1,4 @@ +float weaponswapping; +float internalteam; + +void weapon_defaultspawnfunc(float wpn);