2 .float portar_grenade_id;
6 void W_Grenade_Explode (void)
9 org2 = findbetterlocation (self.origin, 12);
10 pointparticles(particleeffectnum("grenade_explode"), org2, '0 0 0', 1);
11 sound (self, CHAN_PROJECTILE, "weapons/grenade_impact.wav", VOL_BASE, ATTN_NORM);
13 self.event_damage = SUB_Null;
14 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);
19 void W_Grenade_Explode2 (void)
22 org2 = findbetterlocation (self.origin, 12);
23 pointparticles(particleeffectnum("grenade_explode"), org2, '0 0 0', 1);
24 sound (self, CHAN_PROJECTILE, "weapons/grenade_impact.wav", VOL_BASE, ATTN_NORM);
26 self.event_damage = SUB_Null;
27 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);
32 void W_Grenade_Touch1 (void)
34 if (trace_dphitq3surfaceflags & Q3SURFACEFLAG_NOIMPACT)
42 void W_Grenade_Touch2 (void)
44 if (trace_dphitq3surfaceflags & Q3SURFACEFLAG_NOIMPACT)
49 if (other.takedamage == DAMAGE_AIM)
56 sound (self, CHAN_PROJECTILE, "weapons/grenade_bounce1.wav", VOL_BASE, ATTN_NORM);
58 sound (self, CHAN_PROJECTILE, "weapons/grenade_bounce2.wav", VOL_BASE, ATTN_NORM);
60 sound (self, CHAN_PROJECTILE, "weapons/grenade_bounce3.wav", VOL_BASE, ATTN_NORM);
62 sound (self, CHAN_PROJECTILE, "weapons/grenade_bounce4.wav", VOL_BASE, ATTN_NORM);
64 sound (self, CHAN_PROJECTILE, "weapons/grenade_bounce5.wav", VOL_BASE, ATTN_NORM);
66 sound (self, CHAN_PROJECTILE, "weapons/grenade_bounce6.wav", VOL_BASE, ATTN_NORM);
70 void W_Grenade_Damage (entity inflictor, entity attacker, float damage, float deathtype, vector hitloc, vector force)
72 self.health = self.health - damage;
75 self.owner = attacker;
80 void W_Grenade_Explode (void)
84 void W_Grenade_Touch1 (void)
86 print(vtos(trace_plane_normal), "\n");
87 if(self.portar_grenade_id == 0)
89 self.portar_grenade_id = time;
90 if(!Portal_SpawnInPortalAtTrace(self.owner, self.velocity, self.portar_grenade_id))
95 Portal_SpawnOutPortalAtTrace(self.owner, self.velocity, self.portar_grenade_id);
101 void W_Grenade_Attack (void)
105 if (cvar("g_use_ammunition"))
106 self.ammo_rockets = self.ammo_rockets - cvar("g_balance_grenadelauncher_primary_ammo");
108 W_SetupShot (self, '25 6 -8', FALSE, 4, "weapons/grenade_fire.wav");
110 W_SetupShot (self, '0 0 0', FALSE, 4, "weapons/grenade_fire.wav");
112 //W_SetupShot (self, '25 8 -8', FALSE, 4, "weapons/grenade_fire.wav"); // TODO: move model to the right a little
114 pointparticles(particleeffectnum("grenadelauncher_muzzleflash"), w_shotorg, w_shotdir * 1000, 1);
118 gren.classname = "grenade";
119 gren.bot_dodge = TRUE;
120 gren.bot_dodgerating = cvar("g_balance_grenadelauncher_primary_damage");
122 gren.movetype = MOVETYPE_BOUNCE;
124 gren.movetype = MOVETYPE_BOUNCEMISSILE;
126 gren.solid = SOLID_BBOX;
127 gren.effects = EF_LOWPRECISION;
128 gren.modelflags = MF_GRENADE;
129 setmodel(gren, "models/grenademodel.md3"); // precision set above
130 setsize(gren, '0 0 0', '0 0 0');
131 setorigin(gren, w_shotorg);
133 gren.nextthink = time + cvar("g_balance_grenadelauncher_primary_lifetime");
134 gren.think = W_Grenade_Explode;
135 gren.touch = W_Grenade_Touch1;
137 gren.velocity = w_shotdir * cvar("g_balance_grenadelauncher_primary_speed") + v_up * cvar("g_balance_grenadelauncher_primary_speed_up");
139 gren.velocity = w_shotdir * cvar("g_balance_grenadelauncher_primary_speed");
141 W_SetupProjectileVelocity(gren);
142 gren.avelocity_x = random () * -500 - 500;
144 gren.angles = vectoangles (gren.velocity);
145 gren.flags = FL_PROJECTILE;
148 void W_Grenade_Attack2 (void)
153 if (cvar("g_use_ammunition"))
154 self.ammo_rockets = self.ammo_rockets - cvar("g_balance_grenadelauncher_secondary_ammo");
155 W_SetupShot (self, '25 6 -8', FALSE, 4, "weapons/grenade_fire.wav");
156 //W_SetupShot (self, '25 8 -8', FALSE, 4, "weapons/grenade_fire.wav"); // TODO: move model to the right a little
158 pointparticles(particleeffectnum("grenadelauncher_muzzleflash"), w_shotorg, w_shotdir * 1000, 1);
162 gren.classname = "grenade";
163 gren.bot_dodge = TRUE;
164 gren.bot_dodgerating = cvar("g_balance_grenadelauncher_secondary_damage");
165 gren.movetype = MOVETYPE_BOUNCE;
166 gren.solid = SOLID_BBOX;
167 gren.effects = EF_LOWPRECISION;
168 gren.modelflags = MF_GRENADE;
169 setmodel(gren, "models/grenademodel.md3"); // precision set above
170 setsize(gren, '0 0 -3', '0 0 -3');
171 setorigin(gren, w_shotorg);
173 gren.nextthink = time + cvar("g_balance_grenadelauncher_secondary_lifetime");
174 gren.think = W_Grenade_Explode2;
175 gren.touch = W_Grenade_Touch2;
176 gren.takedamage = DAMAGE_YES;
178 gren.damageforcescale = 4;
179 gren.event_damage = W_Grenade_Damage;
180 gren.velocity = w_shotdir * cvar("g_balance_grenadelauncher_secondary_speed") + v_up * cvar("g_balance_grenadelauncher_secondary_speed_up");
181 W_SetupProjectileVelocity(gren);
182 gren.avelocity = '100 150 100';
184 gren.angles = vectoangles (gren.velocity);
185 gren.flags = FL_PROJECTILE;
187 // nothing yet (maybe find the last one and detonate it?)
191 void spawnfunc_weapon_grenadelauncher (void)
193 weapon_defaultspawnfunc(WEP_GRENADE_LAUNCHER, 5000);
196 .float bot_secondary_grenademooth;
197 float w_glauncher(float req)
201 self.BUTTON_ATCK = FALSE;
202 self.BUTTON_ATCK2 = FALSE;
203 if (self.bot_secondary_grenademooth == 0)
205 if(bot_aim(cvar("g_balance_grenadelauncher_primary_speed"), cvar("g_balance_grenadelauncher_primary_speed_up"), cvar("g_balance_grenadelauncher_primary_lifetime"), TRUE))
207 self.BUTTON_ATCK = TRUE;
208 if(random() < 0.01) self.bot_secondary_grenademooth = 1;
213 if(bot_aim(cvar("g_balance_grenadelauncher_secondary_speed"), cvar("g_balance_grenadelauncher_secondary_speed_up"), cvar("g_balance_grenadelauncher_secondary_lifetime"), TRUE))
215 self.BUTTON_ATCK2 = TRUE;
216 if(random() < 0.02) self.bot_secondary_grenademooth = 0;
220 else if (req == WR_THINK)
222 if (self.BUTTON_ATCK)
223 if (weapon_prepareattack(0, cvar("g_balance_grenadelauncher_primary_refire")))
226 weapon_thinkf(WFRAME_FIRE1, cvar("g_balance_grenadelauncher_primary_animtime"), w_ready);
228 if (self.BUTTON_ATCK2)
229 if (weapon_prepareattack(1, cvar("g_balance_grenadelauncher_secondary_refire")))
232 weapon_thinkf(WFRAME_FIRE2, cvar("g_balance_grenadelauncher_secondary_animtime"), w_ready);
235 else if (req == WR_PRECACHE)
237 precache_model ("models/grenademodel.md3");
238 precache_model ("models/weapons/g_gl.md3");
239 precache_model ("models/weapons/v_gl.md3");
240 precache_model ("models/weapons/w_gl.zym");
241 precache_sound ("weapons/grenade_bounce1.wav");
242 precache_sound ("weapons/grenade_bounce2.wav");
243 precache_sound ("weapons/grenade_bounce3.wav");
244 precache_sound ("weapons/grenade_bounce4.wav");
245 precache_sound ("weapons/grenade_bounce5.wav");
246 precache_sound ("weapons/grenade_bounce6.wav");
247 precache_sound ("weapons/grenade_fire.wav");
248 precache_sound ("weapons/grenade_impact.wav");
250 else if (req == WR_SETUP)
251 weapon_setup(WEP_GRENADE_LAUNCHER);
252 else if (req == WR_CHECKAMMO1)
253 return self.ammo_rockets >= cvar("g_balance_grenadelauncher_primary_ammo");
254 else if (req == WR_CHECKAMMO2)
255 return self.ammo_rockets >= cvar("g_balance_grenadelauncher_secondary_ammo");
256 else if (req == WR_SUICIDEMESSAGE)
257 w_deathtypestring = "detonated";
258 else if (req == WR_KILLMESSAGE)
259 w_deathtypestring = "was blasted by";
260 else if (req == WR_SPAWNFUNC)
261 spawnfunc_weapon_grenadelauncher();