]> icculus.org git repositories - divverent/nexuiz.git/blob - data/qcsrc/server/w_campingrifle.qc
updated ballistics code and data, matches physics better now
[divverent/nexuiz.git] / data / qcsrc / server / w_campingrifle.qc
1 //Camping rifle Primary mode: manually operated bolt*, Secondary: full automatic** --MikeeUSA--
2 //* Manually operating the bolt means that all the power of the gas is used to propell the bullet. In this mode the bolt is prevented from moving backwards in response to the firing of the bullet.
3 //** In fully automatic mode some of the gas is used to extract and reload the next cartrige, thus there is less power and range.
4
5 .float campingrifle_bulletcounter;
6
7 void W_Campingrifle_Reload()
8 {
9         if (self.campingrifle_bulletcounter <= 0)
10                 return;
11         
12         sound (self, CHAN_WEAPON2, "weapons/campingrifle_reload.wav", VOL_BASE, ATTN_NORM);
13         ATTACK_FINISHED(self) = time + cvar("g_balance_campingrifle_reloadtime");
14         self.campingrifle_bulletcounter = 0;
15 }
16
17 void W_Campingrifle_CheckReload()
18 {
19         if (self.campingrifle_bulletcounter >= cvar("g_balance_campingrifle_magazinecapacity"))
20                 W_Campingrifle_Reload();
21 }
22
23 void W_CampingRifle_FireBullet(float pSpread, float pDamage, float pHeadshotAddedDamage, float pForce, float pSpeed, float pLifetime, float pAmmo, float deathtype, float pBulletConstant)
24 {
25         if not(self.items & IT_UNLIMITED_WEAPON_AMMO)
26                 self.ammo_nails -= pAmmo;
27
28         W_SetupShot (self, '25 8 -8', FALSE, 2, "weapons/campingrifle_fire.wav");
29         pointparticles(particleeffectnum("shotgun_muzzleflash"), w_shotorg, w_shotdir * 2000, 1);
30
31         fireBallisticBullet(w_shotorg, v_forward /* no TrueAim, so shooting through solid is easier */, pSpread, pSpeed, pLifetime, pDamage, pHeadshotAddedDamage / pDamage, pForce, deathtype, EF_RED, 1, pBulletConstant);
32
33         if (cvar("g_casings") >= 2)
34                 SpawnCasing (w_shotorg + v_forward * 10, ((random () * 50 + 50) * v_right) - (v_forward * (random () * 25 + 25)) - ((random () * 5 - 70) * v_up), 2, vectoangles(v_forward),'0 250 0', 100, 3);
35         
36         self.campingrifle_bulletcounter = self.campingrifle_bulletcounter + 1;
37         W_Campingrifle_CheckReload();
38 }
39
40 void W_Campingrifle_Attack()
41 {
42         W_CampingRifle_FireBullet(cvar("g_balance_campingrifle_primary_spread"), cvar("g_balance_campingrifle_primary_damage"), cvar("g_balance_campingrifle_primary_headshotaddeddamage"), cvar("g_balance_campingrifle_primary_force"), cvar("g_balance_campingrifle_primary_speed"), cvar("g_balance_campingrifle_primary_lifetime"), cvar("g_balance_campingrifle_primary_ammo"), WEP_CAMPINGRIFLE, cvar("g_balance_campingrifle_primary_bulletconstant"));
43 }
44
45 void W_Campingrifle_Attack2()
46 {
47         W_CampingRifle_FireBullet(cvar("g_balance_campingrifle_secondary_spread"), cvar("g_balance_campingrifle_secondary_damage"), cvar("g_balance_campingrifle_secondary_headshotaddeddamage"), cvar("g_balance_campingrifle_secondary_force"), cvar("g_balance_campingrifle_secondary_speed"), cvar("g_balance_campingrifle_secondary_lifetime"), cvar("g_balance_campingrifle_secondary_ammo"), WEP_CAMPINGRIFLE | HITTYPE_SECONDARY, cvar("g_balance_campingrifle_secondary_bulletconstant"));
48 }
49
50 void spawnfunc_weapon_campingrifle (void)
51 {
52         weapon_defaultspawnfunc(WEP_CAMPINGRIFLE);
53 }
54
55 .float bot_secondary_campingriflemooth;
56 float w_campingrifle(float req)
57 {
58         if (req == WR_AIM)
59         {
60                 self.BUTTON_ATCK=FALSE;
61                 self.BUTTON_ATCK2=FALSE;
62                 if(vlen(self.origin-self.enemy.origin) > 1000)
63                         self.bot_secondary_campingriflemooth = 0;
64                 if(self.bot_secondary_campingriflemooth == 0)
65                 {
66                         if(bot_aim(cvar("g_balance_campingrifle_primary_speed"), 0, cvar("g_balance_campingrifle_primary_lifetime"), TRUE))
67                         {
68                                 self.BUTTON_ATCK = TRUE;
69                                 if(random() < 0.01) self.bot_secondary_campingriflemooth = 1;
70                         }
71                 }
72                 else
73                 {
74                         if(bot_aim(cvar("g_balance_campingrifle_secondary_speed"), 0, cvar("g_balance_campingrifle_secondary_lifetime"), TRUE))
75                         {
76                                 self.BUTTON_ATCK2 = TRUE;
77                                 if(random() < 0.03) self.bot_secondary_campingriflemooth = 0;
78                         }
79                 }
80         }
81         else if (req == WR_THINK)
82         {
83                 if (self.BUTTON_ATCK)
84                 if (weapon_prepareattack(0, cvar("g_balance_campingrifle_primary_refire")))
85                 {
86                         W_Campingrifle_Attack();
87                         weapon_thinkf(WFRAME_FIRE1, cvar("g_balance_campingrifle_primary_animtime"), w_ready);
88                 }
89                 if (self.BUTTON_ATCK2)
90                 if (weapon_prepareattack(1, cvar("g_balance_campingrifle_secondary_refire")))
91                 {
92                         W_Campingrifle_Attack2();
93                         weapon_thinkf(WFRAME_FIRE1, cvar("g_balance_campingrifle_secondary_animtime"), w_ready);
94                 }
95         }
96         else if (req == WR_PRECACHE)
97         {               
98                 precache_model ("models/tracer.mdl");
99                 precache_model ("models/weapons/g_campingrifle.md3");
100                 precache_model ("models/weapons/v_campingrifle.md3");
101                 precache_model ("models/weapons/w_campingrifle.zym");
102                 precache_sound ("weapons/campingrifle_reload.wav");
103                 precache_sound ("weapons/ric1.wav");
104                 precache_sound ("weapons/ric2.wav");
105                 precache_sound ("weapons/ric3.wav");
106                 precache_sound ("weapons/campingrifle_fire.wav");
107                 if (cvar("g_casings") >= 2)
108                 {
109                         precache_sound ("weapons/brass1.wav");
110                         precache_sound ("weapons/brass2.wav");
111                         precache_sound ("weapons/brass3.wav");
112                         precache_model ("models/casing_bronze.mdl");
113                 }
114         }
115         else if (req == WR_SETUP)
116         {
117                 weapon_setup(WEP_CAMPINGRIFLE);
118                 W_Campingrifle_Reload();
119         }
120         else if (req == WR_CHECKAMMO1)
121                 return self.ammo_nails >= cvar("g_balance_campingrifle_primary_ammo");
122         else if (req == WR_CHECKAMMO2)
123                 return self.ammo_nails >= cvar("g_balance_campingrifle_secondary_ammo");
124         else if (req == WR_SUICIDEMESSAGE)
125         {
126                 if(w_deathtype & HITTYPE_SECONDARY)
127                         w_deathtypestring = "shot himself automatically";
128                 else
129                         w_deathtypestring = "sniped himself somehow";
130         }
131         else if (req == WR_KILLMESSAGE)
132         {
133                 if(w_deathtype & HITTYPE_SECONDARY)
134                 {
135                         if(w_deathtype & HITTYPE_BOUNCE)
136                                 w_deathtypestring = "failed to hide from #'s bullet hail";
137                         else
138                                 w_deathtypestring = "died in #'s bullet hail";
139                 }
140                 else
141                 {
142                         if(w_deathtype & HITTYPE_BOUNCE)
143                         {
144                                 // TODO special headshot message here too?
145                                 w_deathtypestring = "failed to hide from #'s rifle";
146                         }
147                         else
148                         {
149                                 if(w_deathtype & HITTYPE_HEADSHOT)
150                                         w_deathtypestring = "got hit in the head by #";
151                                 else
152                                         w_deathtypestring = "was sniped by #";
153                         }
154                 }
155         }
156         return TRUE;
157 };