2 void W_Grenade_Explode (void)
5 org2 = findbetterlocation (self.origin, 12);
6 pointparticles(particleeffectnum("grenade_explode"), org2, '0 0 0', 1);
7 sound (self, CHAN_PROJECTILE, "weapons/grenade_impact.wav", VOL_BASE, ATTN_NORM);
9 self.event_damage = SUB_Null;
10 RadiusDamage (self, self.owner, cvar("g_balance_grenadelauncher_primary_damage"), cvar("g_balance_grenadelauncher_primary_edgedamage"), cvar("g_balance_grenadelauncher_primary_radius"), world, cvar("g_balance_grenadelauncher_primary_force"), IT_GRENADE_LAUNCHER);
15 void W_Grenade_Explode2 (void)
18 org2 = findbetterlocation (self.origin, 12);
19 pointparticles(particleeffectnum("grenade_explode"), org2, '0 0 0', 1);
20 sound (self, CHAN_PROJECTILE, "weapons/grenade_impact.wav", VOL_BASE, ATTN_NORM);
22 self.event_damage = SUB_Null;
23 RadiusDamage (self, self.owner, cvar("g_balance_grenadelauncher_secondary_damage"), cvar("g_balance_grenadelauncher_secondary_edgedamage"), cvar("g_balance_grenadelauncher_secondary_radius"), world, cvar("g_balance_grenadelauncher_secondary_force"), IT_GRENADE_LAUNCHER);
28 void W_Grenade_Touch1 (void)
30 if (trace_dphitq3surfaceflags & Q3SURFACEFLAG_NOIMPACT)
38 void W_Grenade_Touch2 (void)
40 if (trace_dphitq3surfaceflags & Q3SURFACEFLAG_NOIMPACT)
45 if (other.takedamage == DAMAGE_AIM)
52 sound (self, CHAN_PROJECTILE, "weapons/grenade_bounce1.wav", VOL_BASE, ATTN_NORM);
54 sound (self, CHAN_PROJECTILE, "weapons/grenade_bounce2.wav", VOL_BASE, ATTN_NORM);
56 sound (self, CHAN_PROJECTILE, "weapons/grenade_bounce3.wav", VOL_BASE, ATTN_NORM);
58 sound (self, CHAN_PROJECTILE, "weapons/grenade_bounce4.wav", VOL_BASE, ATTN_NORM);
60 sound (self, CHAN_PROJECTILE, "weapons/grenade_bounce5.wav", VOL_BASE, ATTN_NORM);
62 sound (self, CHAN_PROJECTILE, "weapons/grenade_bounce6.wav", VOL_BASE, ATTN_NORM);
66 void W_Grenade_Damage (entity inflictor, entity attacker, float damage, float deathtype, vector hitloc, vector force)
68 self.health = self.health - damage;
71 self.owner = attacker;
76 void W_Grenade_Attack (void)
80 if (cvar("g_use_ammunition"))
81 self.ammo_rockets = self.ammo_rockets - cvar("g_balance_grenadelauncher_primary_ammo");
82 W_SetupShot (self, '25 6 -8', FALSE, 4, "weapons/grenade_fire.wav");
83 //W_SetupShot (self, '25 8 -8', FALSE, 4, "weapons/grenade_fire.wav"); // TODO: move model to the right a little
85 pointparticles(particleeffectnum("grenadelauncher_muzzleflash"), w_shotorg, w_shotdir * 1000, 1);
89 gren.classname = "grenade";
90 gren.bot_dodge = TRUE;
91 gren.bot_dodgerating = cvar("g_balance_grenadelauncher_primary_damage");
92 gren.movetype = MOVETYPE_BOUNCE;
93 gren.solid = SOLID_BBOX;
94 gren.effects = EF_LOWPRECISION;
95 gren.modelflags = MF_GRENADE;
96 setmodel(gren, "models/grenademodel.md3"); // precision set above
97 setsize(gren, '0 0 0', '0 0 0');
98 setorigin(gren, w_shotorg);
100 gren.nextthink = time + cvar("g_balance_grenadelauncher_primary_lifetime");
101 gren.think = W_Grenade_Explode;
102 gren.touch = W_Grenade_Touch1;
103 gren.velocity = w_shotdir * cvar("g_balance_grenadelauncher_primary_speed") + v_up * cvar("g_balance_grenadelauncher_primary_speed_up");
104 W_SetupProjectileVelocity(gren);
105 gren.avelocity_x = random () * -500 - 500;
107 gren.angles = vectoangles (gren.velocity);
108 gren.flags = FL_PROJECTILE;
111 void W_Grenade_Attack2 (void)
115 if (cvar("g_use_ammunition"))
116 self.ammo_rockets = self.ammo_rockets - cvar("g_balance_grenadelauncher_secondary_ammo");
117 W_SetupShot (self, '25 6 -8', FALSE, 4, "weapons/grenade_fire.wav");
118 //W_SetupShot (self, '25 8 -8', FALSE, 4, "weapons/grenade_fire.wav"); // TODO: move model to the right a little
120 pointparticles(particleeffectnum("grenadelauncher_muzzleflash"), w_shotorg, w_shotdir * 1000, 1);
124 gren.classname = "grenade";
125 gren.bot_dodge = TRUE;
126 gren.bot_dodgerating = cvar("g_balance_grenadelauncher_secondary_damage");
127 gren.movetype = MOVETYPE_BOUNCE;
128 gren.solid = SOLID_BBOX;
129 gren.effects = EF_LOWPRECISION;
130 gren.modelflags = MF_GRENADE;
131 setmodel(gren, "models/grenademodel.md3"); // precision set above
132 setsize(gren, '0 0 -3', '0 0 -3');
133 setorigin(gren, w_shotorg);
135 gren.nextthink = time + cvar("g_balance_grenadelauncher_secondary_lifetime");
136 gren.think = W_Grenade_Explode2;
137 gren.touch = W_Grenade_Touch2;
138 gren.takedamage = DAMAGE_YES;
140 gren.damageforcescale = 4;
141 gren.event_damage = W_Grenade_Damage;
142 gren.velocity = w_shotdir * cvar("g_balance_grenadelauncher_secondary_speed") + v_up * cvar("g_balance_grenadelauncher_secondary_speed_up");
143 W_SetupProjectileVelocity(gren);
144 gren.avelocity = '100 150 100';
146 gren.angles = vectoangles (gren.velocity);
147 gren.flags = FL_PROJECTILE;
150 .float bot_secondary_grenademooth;
151 float w_glauncher(float req)
155 self.BUTTON_ATCK = FALSE;
156 self.BUTTON_ATCK2 = FALSE;
157 if (self.bot_secondary_grenademooth == 0)
159 if(bot_aim(cvar("g_balance_grenadelauncher_primary_speed"), cvar("g_balance_grenadelauncher_primary_speed_up"), cvar("g_balance_grenadelauncher_primary_lifetime"), TRUE))
161 self.BUTTON_ATCK = TRUE;
162 if(random() < 0.01) self.bot_secondary_grenademooth = 1;
167 if(bot_aim(cvar("g_balance_grenadelauncher_secondary_speed"), cvar("g_balance_grenadelauncher_secondary_speed_up"), cvar("g_balance_grenadelauncher_secondary_lifetime"), TRUE))
169 self.BUTTON_ATCK2 = TRUE;
170 if(random() < 0.02) self.bot_secondary_grenademooth = 0;
174 else if (req == WR_THINK)
176 if (self.BUTTON_ATCK)
177 if (weapon_prepareattack(0, cvar("g_balance_grenadelauncher_primary_refire")))
180 weapon_thinkf(WFRAME_FIRE1, cvar("g_balance_grenadelauncher_primary_animtime"), w_ready);
182 if (self.BUTTON_ATCK2)
183 if (weapon_prepareattack(1, cvar("g_balance_grenadelauncher_secondary_refire")))
186 weapon_thinkf(WFRAME_FIRE2, cvar("g_balance_grenadelauncher_secondary_animtime"), w_ready);
189 else if (req == WR_PRECACHE)
191 precache_model ("models/grenademodel.md3");
192 precache_model ("models/weapons/g_gl.md3");
193 precache_model ("models/weapons/v_gl.md3");
194 precache_model ("models/weapons/w_gl.zym");
195 precache_sound ("weapons/grenade_bounce1.wav");
196 precache_sound ("weapons/grenade_bounce2.wav");
197 precache_sound ("weapons/grenade_bounce3.wav");
198 precache_sound ("weapons/grenade_bounce4.wav");
199 precache_sound ("weapons/grenade_bounce5.wav");
200 precache_sound ("weapons/grenade_bounce6.wav");
201 precache_sound ("weapons/grenade_fire.wav");
202 precache_sound ("weapons/grenade_impact.wav");
204 else if (req == WR_SETUP)
205 weapon_setup(WEP_GRENADE_LAUNCHER, "gl", IT_ROCKETS);
206 else if (req == WR_CHECKAMMO1)
207 return self.ammo_rockets >= cvar("g_balance_grenadelauncher_primary_ammo");
208 else if (req == WR_CHECKAMMO2)
209 return self.ammo_rockets >= cvar("g_balance_grenadelauncher_secondary_ammo");
210 else if (req == WR_REGISTER)
211 weapon_register(WEP_GRENADE_LAUNCHER, min(cvar("g_balance_grenadelauncher_primary_ammo"), cvar("g_balance_grenadelauncher_secondary_ammo")));