From: Mario Date: Sat, 29 Nov 2014 04:57:25 +0000 (+1100) Subject: Add an option to use alternate (Nexuiz) secondary shotgun triple attack X-Git-Tag: xonotic-v0.8.0~122^2~19 X-Git-Url: https://git.rm.cloudns.org/?a=commitdiff_plain;h=467556ba4b2f26a5885f581ecad81959cfafe8b1;p=xonotic%2Fxonotic-data.pk3dir.git Add an option to use alternate (Nexuiz) secondary shotgun triple attack --- diff --git a/bal-wep-nexuiz25.cfg b/bal-wep-nexuiz25.cfg index e6e1aac18..003f3d5fb 100644 --- a/bal-wep-nexuiz25.cfg +++ b/bal-wep-nexuiz25.cfg @@ -42,7 +42,7 @@ set g_balance_shotgun_primary_solidpenetration 3.8 set g_balance_shotgun_primary_spread 0.07 set g_balance_shotgun_reload_ammo 0 set g_balance_shotgun_reload_time 2 -set g_balance_shotgun_secondary 1 +set g_balance_shotgun_secondary 2 set g_balance_shotgun_secondary_animtime 1 set g_balance_shotgun_secondary_damage 80 set g_balance_shotgun_secondary_force 200 @@ -56,6 +56,8 @@ set g_balance_shotgun_secondary_melee_swing_up 30 set g_balance_shotgun_secondary_melee_time 0.15 set g_balance_shotgun_secondary_melee_traces 10 set g_balance_shotgun_secondary_refire 1.25 +set g_balance_shotgun_secondary_alt_animtime 0.2 +set g_balance_shotgun_secondary_alt_refire 1.2 set g_balance_shotgun_switchdelay_drop 0.15 set g_balance_shotgun_switchdelay_raise 0.15 set g_balance_shotgun_weaponreplace "" diff --git a/bal-wep-samual.cfg b/bal-wep-samual.cfg index bd0a051ab..2ec59d610 100644 --- a/bal-wep-samual.cfg +++ b/bal-wep-samual.cfg @@ -750,6 +750,8 @@ set g_balance_shotgun_secondary_melee_swing_up 30 set g_balance_shotgun_secondary_melee_time 0.15 set g_balance_shotgun_secondary_melee_traces 10 set g_balance_shotgun_secondary_refire 1.25 +set g_balance_shotgun_secondary_alt_animtime 0.2 +set g_balance_shotgun_secondary_alt_refire 1.2 set g_balance_shotgun_switchdelay_drop 0.2 set g_balance_shotgun_switchdelay_raise 0.2 set g_balance_shotgun_weaponreplace "" diff --git a/bal-wep-xdf.cfg b/bal-wep-xdf.cfg index 38f85857c..ef8035ea7 100644 --- a/bal-wep-xdf.cfg +++ b/bal-wep-xdf.cfg @@ -56,6 +56,8 @@ set g_balance_shotgun_secondary_melee_swing_up 30 set g_balance_shotgun_secondary_melee_time 0.15 set g_balance_shotgun_secondary_melee_traces 10 set g_balance_shotgun_secondary_refire 1.25 +set g_balance_shotgun_secondary_alt_animtime 0.2 +set g_balance_shotgun_secondary_alt_refire 1.2 set g_balance_shotgun_switchdelay_drop 0 set g_balance_shotgun_switchdelay_raise 0 set g_balance_shotgun_weaponreplace "" diff --git a/bal-wep-xonotic.cfg b/bal-wep-xonotic.cfg index 87b9f3b7b..5db82f51e 100644 --- a/bal-wep-xonotic.cfg +++ b/bal-wep-xonotic.cfg @@ -56,6 +56,8 @@ set g_balance_shotgun_secondary_melee_swing_up 30 set g_balance_shotgun_secondary_melee_time 0.15 set g_balance_shotgun_secondary_melee_traces 10 set g_balance_shotgun_secondary_refire 1.25 +set g_balance_shotgun_secondary_alt_animtime 0.2 +set g_balance_shotgun_secondary_alt_refire 1.2 set g_balance_shotgun_switchdelay_drop 0.2 set g_balance_shotgun_switchdelay_raise 0.2 set g_balance_shotgun_weaponreplace "" diff --git a/bal-wep-xpm.cfg b/bal-wep-xpm.cfg index 87b9f3b7b..5db82f51e 100644 --- a/bal-wep-xpm.cfg +++ b/bal-wep-xpm.cfg @@ -56,6 +56,8 @@ set g_balance_shotgun_secondary_melee_swing_up 30 set g_balance_shotgun_secondary_melee_time 0.15 set g_balance_shotgun_secondary_melee_traces 10 set g_balance_shotgun_secondary_refire 1.25 +set g_balance_shotgun_secondary_alt_animtime 0.2 +set g_balance_shotgun_secondary_alt_refire 1.2 set g_balance_shotgun_switchdelay_drop 0.2 set g_balance_shotgun_switchdelay_raise 0.2 set g_balance_shotgun_weaponreplace "" diff --git a/qcsrc/common/weapons/w_shotgun.qc b/qcsrc/common/weapons/w_shotgun.qc index 88c604c0a..3cf527d39 100644 --- a/qcsrc/common/weapons/w_shotgun.qc +++ b/qcsrc/common/weapons/w_shotgun.qc @@ -4,7 +4,7 @@ REGISTER_WEAPON( /* function */ W_Shotgun, /* ammotype */ ammo_shells, /* impulse */ 2, -/* flags */ WEP_FLAG_RELOADABLE | WEP_TYPE_HITSCAN, +/* flags */ WEP_FLAG_NORMAL | WEP_FLAG_RELOADABLE | WEP_TYPE_HITSCAN, /* rating */ BOT_PICKUP_RATING_LOW, /* color */ '0.5 0.25 0', /* modelname */ "shotgun", @@ -35,6 +35,8 @@ REGISTER_WEAPON( w_cvar(id, sn, SEC, melee_multihit) \ w_cvar(id, sn, SEC, melee_delay) \ w_cvar(id, sn, SEC, melee_range) \ + w_cvar(id, sn, SEC, alt_animtime) \ + w_cvar(id, sn, SEC, alt_refire) \ w_prop(id, sn, float, reloading_ammo, reload_ammo) \ w_prop(id, sn, float, reloading_time, reload_time) \ w_prop(id, sn, float, switchdelay_raise, switchdelay_raise) \ @@ -51,14 +53,14 @@ SHOTGUN_SETTINGS(WEP_ADD_CVAR, WEP_ADD_PROP) #ifdef SVQC void spawnfunc_weapon_shotgun(void) { weapon_defaultspawnfunc(WEP_SHOTGUN); } -void W_Shotgun_Attack(void) +void W_Shotgun_Attack(float isprimary) { float sc; entity flash; W_DecreaseAmmo(WEP_CVAR_PRI(shotgun, ammo)); - W_SetupShot(self, TRUE, 5, "weapons/shotgun_fire.wav", CH_WEAPON_A, WEP_CVAR_PRI(shotgun, damage) * WEP_CVAR_PRI(shotgun, bullets)); + W_SetupShot(self, TRUE, 5, "weapons/shotgun_fire.wav", ((isprimary) ? CH_WEAPON_A : CH_WEAPON_SINGLE), WEP_CVAR_PRI(shotgun, damage) * WEP_CVAR_PRI(shotgun, bullets)); for(sc = 0;sc < WEP_CVAR_PRI(shotgun, bullets);sc = sc + 1) fireBullet(w_shotorg, w_shotdir, WEP_CVAR_PRI(shotgun, spread), WEP_CVAR_PRI(shotgun, solidpenetration), WEP_CVAR_PRI(shotgun, damage), WEP_CVAR_PRI(shotgun, force), WEP_SHOTGUN, 0); @@ -189,6 +191,35 @@ void W_Shotgun_Attack2(void) W_SetupShot_Range(self, TRUE, 0, "", 0, WEP_CVAR_SEC(shotgun, damage), WEP_CVAR_SEC(shotgun, melee_range)); } +// alternate secondary weapon frames +void W_Shotgun_Attack3_Frame2() +{ + if (!WEP_ACTION(self.weapon, WR_CHECKAMMO2)) + if (!(self.items & IT_UNLIMITED_WEAPON_AMMO)) + { + W_SwitchWeapon_Force(self, w_getbestweapon(self)); + w_ready(); + return; + } + + sound(self, CH_WEAPON_SINGLE, "misc/null.wav", VOL_BASE, ATTN_NORM); // kill previous sound + W_Shotgun_Attack(TRUE); // actually is secondary, but we trick the last shot into playing full reload sound + weapon_thinkf(WFRAME_FIRE1, WEP_CVAR_SEC(shotgun, alt_animtime), w_ready); +} +void W_Shotgun_Attack3_Frame1() +{ + if (!WEP_ACTION(self.weapon, WR_CHECKAMMO2)) + if (!(self.items & IT_UNLIMITED_WEAPON_AMMO)) + { + W_SwitchWeapon_Force(self, w_getbestweapon(self)); + w_ready(); + return; + } + + W_Shotgun_Attack(FALSE); + weapon_thinkf(WFRAME_FIRE1, WEP_CVAR_SEC(shotgun, alt_animtime), W_Shotgun_Attack3_Frame2); +} + .float shotgun_primarytime; float W_Shotgun(float req) @@ -210,7 +241,7 @@ float W_Shotgun(float req) if(WEP_CVAR(shotgun, reload_ammo) && self.clip_load < WEP_CVAR_PRI(shotgun, ammo)) // forced reload { // don't force reload an empty shotgun if its melee attack is active - if(!WEP_CVAR(shotgun, secondary)) + if(WEP_CVAR(shotgun, secondary) < 2) WEP_ACTION(self.weapon, WR_RELOAD); } else @@ -221,16 +252,28 @@ float W_Shotgun(float req) { if(weapon_prepareattack(0, WEP_CVAR_PRI(shotgun, animtime))) { - W_Shotgun_Attack(); + W_Shotgun_Attack(TRUE); self.shotgun_primarytime = time + WEP_CVAR_PRI(shotgun, refire) * W_WeaponRateFactor(); weapon_thinkf(WFRAME_FIRE1, WEP_CVAR_PRI(shotgun, animtime), w_ready); } } } + else if(self.BUTTON_ATCK2 && WEP_CVAR(shotgun, secondary) == 2) + { + if(time >= self.shotgun_primarytime) // handle refire separately so the secondary can be fired straight after a primary + { + if(weapon_prepareattack(0, WEP_CVAR_SEC(shotgun, alt_animtime))) + { + W_Shotgun_Attack(FALSE); + self.shotgun_primarytime = time + WEP_CVAR_SEC(shotgun, alt_refire) * W_WeaponRateFactor(); + weapon_thinkf(WFRAME_FIRE1, WEP_CVAR_SEC(shotgun, alt_animtime), W_Shotgun_Attack3_Frame1); + } + } + } } if(self.clip_load >= 0) // we are not currently reloading if(!self.crouch) // no crouchmelee please - if(WEP_CVAR(shotgun, secondary)) + if(WEP_CVAR(shotgun, secondary) == 1) if((self.BUTTON_ATCK && self.WEP_AMMO(SHOTGUN) <= 0 && !(self.items & IT_UNLIMITED_WEAPON_AMMO)) || self.BUTTON_ATCK2) if(weapon_prepareattack(1, WEP_CVAR_SEC(shotgun, refire))) { @@ -265,9 +308,17 @@ float W_Shotgun(float req) } case WR_CHECKAMMO2: { - if(WEP_CVAR(shotgun, secondary)) - return TRUE; // melee does not use ammo - return FALSE; // secondary unavailable + switch(WEP_CVAR(shotgun, secondary)) + { + case 1: return TRUE; // melee does not use ammo + case 2: // secondary triple shot + { + ammo_amount = self.WEP_AMMO(SHOTGUN) >= WEP_CVAR_PRI(shotgun, ammo); + ammo_amount += self.(weapon_load[WEP_SHOTGUN]) >= WEP_CVAR_PRI(shotgun, ammo); + return ammo_amount; + } + default: return FALSE; // secondary unavailable + } } case WR_CONFIG: { diff --git a/qcsrc/server/weapons/weaponsystem.qc b/qcsrc/server/weapons/weaponsystem.qc index d42450741..df3380116 100644 --- a/qcsrc/server/weapons/weaponsystem.qc +++ b/qcsrc/server/weapons/weaponsystem.qc @@ -459,7 +459,7 @@ float weapon_prepareattack_checkammo(float secondary) return FALSE; if(self.weapon == WEP_SHOTGUN) - if(!secondary && WEP_CVAR(shotgun, secondary)) + if(!secondary && WEP_CVAR(shotgun, secondary) == 1) return FALSE; // no clicking, just allow if(self.weapon == self.switchweapon && time - self.prevdryfire > 1) // only play once BEFORE starting to switch weapons