]> de.git.xonotic.org Git - xonotic/xonotic-data.pk3dir.git/blobdiff - qcsrc/server/w_shotgun.qc
sound!
[xonotic/xonotic-data.pk3dir.git] / qcsrc / server / w_shotgun.qc
index 0b499f4832586cc8b5c03e6688d00c519a7adcd6..e126787713a1a2fde315f651ff45b670f752e8d9 100644 (file)
@@ -1,6 +1,7 @@
 #ifdef REGISTER_WEAPON
 REGISTER_WEAPON(SHOTGUN, w_shotgun, IT_SHELLS, 2, WEP_FLAG_NORMAL | WEP_TYPE_HITSCAN, BOT_PICKUP_RATING_LOW, "shotgun", "shotgun", "Shotgun");
 #else
+#ifdef SVQC
 void W_Shotgun_Attack (void)
 {
        float   sc;
@@ -88,6 +89,38 @@ void W_Shotgun_Attack2 (void)
        W_AttachToShotorg(flash, '5 0 0');
 }
 
+void shotgun_meleethink (void)
+{
+       makevectors(self.owner.v_angle);
+       vector angle;
+       angle = v_forward;
+
+       // broken? fix, needs to be easier to hit
+       //WarpZone_tracebox_antilag(self.owner, self.owner.origin + self.owner.view_ofs, self.owner.origin + self.owner.view_ofs + angle * cvar("g_balance_shotgun_secondary_melee_range") - (v_right + v_up) * cvar("g_balance_shotgun_secondary_melee_size"), self.owner.origin + self.owner.view_ofs + (v_right + v_up) * cvar("g_balance_shotgun_secondary_melee_size"), self.owner.origin + self.owner.view_ofs + angle * cvar("g_balance_shotgun_secondary_melee_range"), FALSE, self.owner, ANTILAG_LATENCY(self.owner));
+       WarpZone_traceline_antilag(self.owner, self.owner.origin + self.owner.view_ofs, self.owner.origin + self.owner.view_ofs + angle * cvar("g_balance_shotgun_secondary_melee_range"), FALSE, self.owner, ANTILAG_LATENCY(self.owner));
+
+       // apply the damage
+       if(trace_fraction < 1)
+       {
+               vector force;
+               force = angle * cvar("g_balance_shotgun_secondary_force");
+               Damage (trace_ent, self.owner, self.owner, cvar("g_balance_shotgun_secondary_damage"), WEP_SHOTGUN, self.owner.origin + self.owner.view_ofs, force);
+       }
+       remove(self);
+}
+
+void W_Shotgun_Attack3 (void)
+{
+       sound (self, CHAN_PROJECTILE, "weapons/shotgun_melee.wav", VOL_BASE, ATTN_NORM);
+       weapon_thinkf(WFRAME_FIRE2, cvar("g_balance_shotgun_secondary_animtime"), w_ready);
+
+       entity meleetemp;
+       meleetemp = spawn();
+       meleetemp.owner = self;
+       meleetemp.think = shotgun_meleethink;
+       meleetemp.nextthink = time + cvar("g_balance_shotgun_secondary_melee_delay");
+}
+
 // weapon frames
 void shotgun_fire2_03()
 {
@@ -120,8 +153,16 @@ float w_shotgun(float req)
                if (self.BUTTON_ATCK2 && cvar("g_balance_shotgun_secondary"))
                if (weapon_prepareattack(1, cvar("g_balance_shotgun_secondary_refire")))
                {
-                       W_Shotgun_Attack2();
-                       weapon_thinkf(WFRAME_FIRE2, cvar("g_balance_shotgun_secondary_animtime"), shotgun_fire2_02);
+                       if(cvar("g_balance_shotgun_secondary_melee"))
+                       {
+                               // force playback of the anim by switching to another anim (that we never play) here...
+                               weapon_thinkf(WFRAME_FIRE1, 0, W_Shotgun_Attack3);
+                       }
+                       else
+                       {
+                               W_Shotgun_Attack2();
+                               weapon_thinkf(WFRAME_FIRE2, cvar("g_balance_shotgun_secondary_animtime"), shotgun_fire2_02);
+                       }
                }
        }
        else if (req == WR_PRECACHE)
@@ -132,13 +173,45 @@ float w_shotgun(float req)
                precache_model ("models/weapons/h_shotgun.iqm");
                precache_sound ("misc/itempickup.wav");
                precache_sound ("weapons/shotgun_fire.wav");
+               precache_sound ("weapons/shotgun_melee.wav");
        }
        else if (req == WR_SETUP)
                weapon_setup(WEP_SHOTGUN);
        else if (req == WR_CHECKAMMO1)
                return self.ammo_shells >= cvar("g_balance_shotgun_primary_ammo");
        else if (req == WR_CHECKAMMO2)
+       {
+               if(cvar("g_balance_shotgun_secondary_melee"))
+                       return TRUE;
                return self.ammo_shells >= cvar("g_balance_shotgun_secondary_ammo") * 3;
+       }
+       return TRUE;
+};
+#endif
+#ifdef CSQC
+float w_shotgun(float req)
+{
+       if(req == WR_IMPACTEFFECT)
+       {
+               vector org2;
+               org2 = w_org + w_backoff * 2;
+               pointparticles(particleeffectnum("shotgun_impact"), org2, w_backoff * 1000, 1);
+               if(!w_issilent)
+               {
+                       if(w_random < 0.05)
+                               sound(self, CHAN_PROJECTILE, "weapons/ric1.wav", VOL_BASE, ATTN_NORM);
+                       else if(w_random < 0.1)
+                               sound(self, CHAN_PROJECTILE, "weapons/ric2.wav", VOL_BASE, ATTN_NORM);
+                       else if(w_random < 0.2)
+                               sound(self, CHAN_PROJECTILE, "weapons/ric3.wav", VOL_BASE, ATTN_NORM);
+               }
+       }
+       else if(req == WR_PRECACHE)
+       {
+               precache_sound("weapons/ric1.wav");
+               precache_sound("weapons/ric2.wav");
+               precache_sound("weapons/ric3.wav");
+       }
        else if (req == WR_SUICIDEMESSAGE)
                w_deathtypestring = "did the impossible";
        else if (req == WR_KILLMESSAGE)
@@ -146,5 +219,6 @@ float w_shotgun(float req)
                w_deathtypestring = "was gunned by"; // unchecked: SECONDARY
        }
        return TRUE;
-};
+}
+#endif
 #endif