1 void W_Grenade_Explode (void)
4 org2 = findbetterlocation (self.origin, 12);
5 pointparticles(particleeffectnum("grenade_explode"), org2, '0 0 0', 1);
6 sound (self, CHAN_PROJECTILE, "weapons/grenade_impact.wav", VOL_BASE, ATTN_NORM);
8 self.event_damage = SUB_Null;
9 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"), WEP_GRENADE_LAUNCHER);
14 void W_Grenade_Explode2 (void)
17 org2 = findbetterlocation (self.origin, 12);
18 pointparticles(particleeffectnum("grenade_explode"), org2, '0 0 0', 1);
19 sound (self, CHAN_PROJECTILE, "weapons/grenade_impact.wav", VOL_BASE, ATTN_NORM);
21 self.event_damage = SUB_Null;
22 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"), WEP_GRENADE_LAUNCHER);
27 void W_Grenade_Touch1 (void)
29 if (trace_dphitq3surfaceflags & Q3SURFACEFLAG_NOIMPACT)
37 void W_Grenade_Touch2 (void)
39 if (trace_dphitq3surfaceflags & Q3SURFACEFLAG_NOIMPACT)
44 if (other.takedamage == DAMAGE_AIM)
51 sound (self, CHAN_PROJECTILE, "weapons/grenade_bounce1.wav", VOL_BASE, ATTN_NORM);
53 sound (self, CHAN_PROJECTILE, "weapons/grenade_bounce2.wav", VOL_BASE, ATTN_NORM);
55 sound (self, CHAN_PROJECTILE, "weapons/grenade_bounce3.wav", VOL_BASE, ATTN_NORM);
57 sound (self, CHAN_PROJECTILE, "weapons/grenade_bounce4.wav", VOL_BASE, ATTN_NORM);
59 sound (self, CHAN_PROJECTILE, "weapons/grenade_bounce5.wav", VOL_BASE, ATTN_NORM);
61 sound (self, CHAN_PROJECTILE, "weapons/grenade_bounce6.wav", VOL_BASE, ATTN_NORM);
65 void W_Grenade_Damage (entity inflictor, entity attacker, float damage, float deathtype, vector hitloc, vector force)
67 self.health = self.health - damage;
70 self.owner = attacker;
75 void W_Grenade_Attack (void)
79 if not(self.items & IT_UNLIMITED_AMMO)
80 self.ammo_rockets = self.ammo_rockets - cvar("g_balance_grenadelauncher_primary_ammo");
81 W_SetupShot (self, '25 6 -8', FALSE, 4, "weapons/grenade_fire.wav");
82 //W_SetupShot (self, '25 8 -8', FALSE, 4, "weapons/grenade_fire.wav"); // TODO: move model to the right a little
84 pointparticles(particleeffectnum("grenadelauncher_muzzleflash"), w_shotorg, w_shotdir * 1000, 1);
88 gren.classname = "grenade";
89 gren.bot_dodge = TRUE;
90 gren.bot_dodgerating = cvar("g_balance_grenadelauncher_primary_damage");
91 gren.movetype = MOVETYPE_BOUNCE;
92 gren.solid = SOLID_BBOX;
93 gren.effects = EF_LOWPRECISION;
94 gren.modelflags = MF_GRENADE;
95 setmodel(gren, "models/grenademodel.md3"); // precision set above
96 setsize(gren, '0 0 0', '0 0 0');
97 setorigin(gren, w_shotorg);
99 gren.nextthink = time + cvar("g_balance_grenadelauncher_primary_lifetime");
100 gren.think = W_Grenade_Explode;
101 gren.touch = W_Grenade_Touch1;
102 gren.velocity = w_shotdir * cvar("g_balance_grenadelauncher_primary_speed") + v_up * cvar("g_balance_grenadelauncher_primary_speed_up");
103 W_SetupProjectileVelocity(gren);
104 gren.avelocity_x = random () * -500 - 500;
106 gren.angles = vectoangles (gren.velocity);
107 gren.flags = FL_PROJECTILE;
110 void W_Grenade_Attack2 (void)
114 if not(self.items & IT_UNLIMITED_AMMO)
115 self.ammo_rockets = self.ammo_rockets - cvar("g_balance_grenadelauncher_secondary_ammo");
116 W_SetupShot (self, '25 6 -8', FALSE, 4, "weapons/grenade_fire.wav");
117 //W_SetupShot (self, '25 8 -8', FALSE, 4, "weapons/grenade_fire.wav"); // TODO: move model to the right a little
119 pointparticles(particleeffectnum("grenadelauncher_muzzleflash"), w_shotorg, w_shotdir * 1000, 1);
123 gren.classname = "grenade";
124 gren.bot_dodge = TRUE;
125 gren.bot_dodgerating = cvar("g_balance_grenadelauncher_secondary_damage");
126 gren.movetype = MOVETYPE_BOUNCE;
127 gren.solid = SOLID_BBOX;
128 gren.effects = EF_LOWPRECISION;
129 gren.modelflags = MF_GRENADE;
130 setmodel(gren, "models/grenademodel.md3"); // precision set above
131 setsize(gren, '0 0 -3', '0 0 -3');
132 setorigin(gren, w_shotorg);
134 gren.nextthink = time + cvar("g_balance_grenadelauncher_secondary_lifetime");
135 gren.think = W_Grenade_Explode2;
136 gren.touch = W_Grenade_Touch2;
137 gren.takedamage = DAMAGE_YES;
138 gren.health = cvar("g_balance_grenadelauncher_secondary_health");
139 gren.damageforcescale = 4;
140 gren.event_damage = W_Grenade_Damage;
141 gren.velocity = w_shotdir * cvar("g_balance_grenadelauncher_secondary_speed") + v_up * cvar("g_balance_grenadelauncher_secondary_speed_up");
142 W_SetupProjectileVelocity(gren);
143 gren.avelocity = '100 150 100';
145 gren.angles = vectoangles (gren.velocity);
146 gren.flags = FL_PROJECTILE;
149 void spawnfunc_weapon_grenadelauncher (void)
151 weapon_defaultspawnfunc(WEP_GRENADE_LAUNCHER);
154 .float bot_secondary_grenademooth;
155 float w_glauncher(float req)
159 self.BUTTON_ATCK = FALSE;
160 self.BUTTON_ATCK2 = FALSE;
161 if (self.bot_secondary_grenademooth == 0)
163 if(bot_aim(cvar("g_balance_grenadelauncher_primary_speed"), cvar("g_balance_grenadelauncher_primary_speed_up"), cvar("g_balance_grenadelauncher_primary_lifetime"), TRUE))
165 self.BUTTON_ATCK = TRUE;
166 if(random() < 0.01) self.bot_secondary_grenademooth = 1;
171 if(bot_aim(cvar("g_balance_grenadelauncher_secondary_speed"), cvar("g_balance_grenadelauncher_secondary_speed_up"), cvar("g_balance_grenadelauncher_secondary_lifetime"), TRUE))
173 self.BUTTON_ATCK2 = TRUE;
174 if(random() < 0.02) self.bot_secondary_grenademooth = 0;
178 else if (req == WR_THINK)
180 if (self.BUTTON_ATCK)
181 if (weapon_prepareattack(0, cvar("g_balance_grenadelauncher_primary_refire")))
184 weapon_thinkf(WFRAME_FIRE1, cvar("g_balance_grenadelauncher_primary_animtime"), w_ready);
186 if (self.BUTTON_ATCK2)
187 if (weapon_prepareattack(1, cvar("g_balance_grenadelauncher_secondary_refire")))
190 weapon_thinkf(WFRAME_FIRE2, cvar("g_balance_grenadelauncher_secondary_animtime"), w_ready);
193 else if (req == WR_PRECACHE)
195 precache_model ("models/grenademodel.md3");
196 precache_model ("models/weapons/g_gl.md3");
197 precache_model ("models/weapons/v_gl.md3");
198 precache_model ("models/weapons/w_gl.zym");
199 precache_sound ("weapons/grenade_bounce1.wav");
200 precache_sound ("weapons/grenade_bounce2.wav");
201 precache_sound ("weapons/grenade_bounce3.wav");
202 precache_sound ("weapons/grenade_bounce4.wav");
203 precache_sound ("weapons/grenade_bounce5.wav");
204 precache_sound ("weapons/grenade_bounce6.wav");
205 precache_sound ("weapons/grenade_fire.wav");
206 precache_sound ("weapons/grenade_impact.wav");
208 else if (req == WR_SETUP)
209 weapon_setup(WEP_GRENADE_LAUNCHER);
210 else if (req == WR_CHECKAMMO1)
211 return self.ammo_rockets >= cvar("g_balance_grenadelauncher_primary_ammo");
212 else if (req == WR_CHECKAMMO2)
213 return self.ammo_rockets >= cvar("g_balance_grenadelauncher_secondary_ammo");
214 else if (req == WR_SUICIDEMESSAGE)
215 w_deathtypestring = "detonated";
216 else if (req == WR_KILLMESSAGE)
217 w_deathtypestring = "was blasted by";