Xonotic QuakeC
The free, fast arena FPS with crisp movement and a wide array of weapons
mortar.qc File Reference
#include "mortar.qh"
#include <common/items/item/ammo.qh>
Include dependency graph for mortar.qc:
This graph shows which files directly or indirectly include this file:

Go to the source code of this file.

Functions

void W_Mortar_Attack (Weapon thiswep, entity actor,.entity weaponentity)
void W_Mortar_Attack2 (Weapon thiswep, entity actor,.entity weaponentity)
void W_Mortar_Grenade_Damage (entity this, entity inflictor, entity attacker, float damage, int deathtype,.entity weaponentity, vector hitloc, vector force)
void W_Mortar_Grenade_Explode (entity this, entity directhitentity)
void W_Mortar_Grenade_Explode2 (entity this, entity directhitentity)
void W_Mortar_Grenade_Explode2_use (entity this, entity actor, entity trigger)
void W_Mortar_Grenade_Explode_use (entity this, entity actor, entity trigger)
void W_Mortar_Grenade_Think1 (entity this)
void W_Mortar_Grenade_Touch1 (entity this, entity toucher)
void W_Mortar_Grenade_Touch2 (entity this, entity toucher)

Variables

bool bot_secondary_grenademooth

Function Documentation

◆ W_Mortar_Attack()

void W_Mortar_Attack ( Weapon thiswep,
entity actor,
.entity weaponentity )

Definition at line 161 of file mortar.qc.

162{
163 W_DecreaseAmmo(thiswep, actor, WEP_CVAR_PRI(WEP_MORTAR, ammo), weaponentity);
164
165 W_SetupShot_ProjectileSize(actor, weaponentity, '-3 -3 -3', '3 3 3', false, 4, SND_MORTAR_FIRE, CH_WEAPON_A, WEP_CVAR_PRI(WEP_MORTAR, damage), thiswep.m_id);
166 w_shotdir = v_forward; // no TrueAim for grenades please
167
168 W_MuzzleFlash(thiswep, actor, weaponentity, w_shotorg, w_shotdir);
169
170 entity gren = new(grenade);
171 gren.owner = gren.realowner = actor;
172 gren.bot_dodge = true;
173 gren.bot_dodgerating = WEP_CVAR_PRI(WEP_MORTAR, damage);
175 gren.bouncefactor = WEP_CVAR(WEP_MORTAR, bouncefactor);
176 gren.bouncestop = WEP_CVAR(WEP_MORTAR, bouncestop);
178 gren.projectiledeathtype = thiswep.m_id;
179 gren.weaponentity_fld = weaponentity;
180 setorigin(gren, w_shotorg);
181 setsize(gren, '-3 -3 -3', '3 3 3');
182
183 gren.cnt = time + WEP_CVAR_PRI(WEP_MORTAR, lifetime);
184 gren.nextthink = time;
188
189 gren.takedamage = DAMAGE_YES;
190 SetResourceExplicit(gren, RES_HEALTH, WEP_CVAR_PRI(WEP_MORTAR, health));
191 gren.damageforcescale = WEP_CVAR_PRI(WEP_MORTAR, damageforcescale);
192 gren.event_damage = W_Mortar_Grenade_Damage;
193 gren.damagedbycontents = true;
195 gren.missile_flags = MIF_SPLASH | MIF_ARC;
196 W_SetupProjVelocity_UP_PRI(gren, WEP_MORTAR);
197
198 gren.angles = vectoangles(gren.velocity);
199 gren.flags = FL_PROJECTILE;
200 IL_PUSH(g_projectiles, gren);
201 IL_PUSH(g_bot_dodge, gren);
202
203 if (WEP_CVAR_PRI(WEP_MORTAR, type) == 0
204 || WEP_CVAR_PRI(WEP_MORTAR, type) == 2)
205 CSQCProjectile(gren, true, PROJECTILE_GRENADE, true);
206 else
208
209 MUTATOR_CALLHOOK(EditProjectile, actor, gren);
210}
IntrusiveList g_bot_dodge
Definition api.qh:150
#define MUTATOR_CALLHOOK(id,...)
Definition base.qh:143
var entity(vector mins, vector maxs,.entity tofield) findbox_tofield_OrFallback
bool SetResourceExplicit(entity e, Resource res_type, float amount)
Sets the resource amount of an entity without calling any hooks.
int m_id
Definition weapon.qh:43
float lifetime
Definition powerups.qc:23
const int FL_PROJECTILE
Definition constants.qh:85
float time
vector v_forward
void CSQCProjectile(entity e, float clientanimate, int type, float docull)
IntrusiveList g_damagedbycontents
Definition damage.qh:143
float damageforcescale
ERASEABLE entity IL_PUSH(IntrusiveList this, entity it)
Push to tail.
vector vectoangles(vector v)
void W_Mortar_Grenade_Damage(entity this, entity inflictor, entity attacker, float damage, int deathtype,.entity weaponentity, vector hitloc, vector force)
Definition mortar.qc:71
void W_Mortar_Grenade_Explode_use(entity this, entity actor, entity trigger)
Definition mortar.qc:33
void W_Mortar_Grenade_Think1(entity this)
Definition mortar.qc:83
void W_Mortar_Grenade_Touch1(entity this, entity toucher)
Definition mortar.qc:96
void set_movetype(entity this, int mt)
Definition movetypes.qc:4
float bouncefactor
Definition movetypes.qh:47
float bouncestop
Definition movetypes.qh:46
const int MOVETYPE_BOUNCE
Definition movetypes.qh:139
const int PROJECTILE_GRENADE_BOUNCING
Definition projectiles.qh:9
const int PROJECTILE_GRENADE
Definition projectiles.qh:8
float health
Legacy fields for the resources. To be removed.
Definition resources.qh:9
#define setthink(e, f)
#define settouch(e, f)
Definition self.qh:73
const int MIF_SPLASH
Definition common.qh:46
IntrusiveList g_projectiles
Definition common.qh:58
const int MIF_ARC
Definition common.qh:47
#define PROJECTILE_MAKETRIGGER(e)
Definition common.qh:34
const int CH_WEAPON_A
Definition sound.qh:7
const int DAMAGE_YES
Definition subs.qh:80
float ammo
Definition sv_turrets.qh:43
#define W_SetupProjVelocity_UP_PRI(ent, wep)
Definition tracing.qh:54
vector w_shotdir
Definition tracing.qh:20
#define W_SetupShot_ProjectileSize(ent, wepent, mi, ma, antilag, recoil, snd, chan, maxdamage, deathtype)
Definition tracing.qh:30
vector w_shotorg
Definition tracing.qh:19
void W_MuzzleFlash(Weapon thiswep, entity actor,.entity weaponentity, vector shotorg, vector shotdir)
Definition all.qc:715
#define WEP_CVAR_PRI(wep, name)
Definition all.qh:338
#define WEP_CVAR(wep, name)
Definition all.qh:337
void W_DecreaseAmmo(Weapon wep, entity actor, float ammo_use,.entity weaponentity)

References ammo, bouncefactor, bouncestop, CH_WEAPON_A, CSQCProjectile(), DAMAGE_YES, damageforcescale, entity(), FL_PROJECTILE, g_bot_dodge, g_damagedbycontents, g_projectiles, health, IL_PUSH(), lifetime, Weapon::m_id, MIF_ARC, MIF_SPLASH, MOVETYPE_BOUNCE, MUTATOR_CALLHOOK, PROJECTILE_GRENADE, PROJECTILE_GRENADE_BOUNCING, PROJECTILE_MAKETRIGGER, set_movetype(), SetResourceExplicit(), setthink, settouch, time, v_forward, vectoangles(), W_DecreaseAmmo(), W_Mortar_Grenade_Damage(), W_Mortar_Grenade_Explode_use(), W_Mortar_Grenade_Think1(), W_Mortar_Grenade_Touch1(), W_MuzzleFlash(), W_SetupProjVelocity_UP_PRI, W_SetupShot_ProjectileSize, w_shotdir, w_shotorg, WEP_CVAR, and WEP_CVAR_PRI.

◆ W_Mortar_Attack2()

void W_Mortar_Attack2 ( Weapon thiswep,
entity actor,
.entity weaponentity )

Definition at line 212 of file mortar.qc.

213{
214 W_DecreaseAmmo(thiswep, actor, WEP_CVAR_SEC(WEP_MORTAR, ammo), weaponentity);
215
216 W_SetupShot_ProjectileSize(actor, weaponentity, '-3 -3 -3', '3 3 3', false, 4, SND_MORTAR_FIRE, CH_WEAPON_A, WEP_CVAR_SEC(WEP_MORTAR, damage), thiswep.m_id | HITTYPE_SECONDARY);
217 w_shotdir = v_forward; // no TrueAim for grenades please
218
219 W_MuzzleFlash(thiswep, actor, weaponentity, w_shotorg, w_shotdir);
220
221 entity gren = new(grenade);
222 gren.owner = gren.realowner = actor;
223 gren.bot_dodge = true;
224 gren.bot_dodgerating = WEP_CVAR_SEC(WEP_MORTAR, damage);
226 gren.bouncefactor = WEP_CVAR(WEP_MORTAR, bouncefactor);
227 gren.bouncestop = WEP_CVAR(WEP_MORTAR, bouncestop);
229 gren.projectiledeathtype = thiswep.m_id | HITTYPE_SECONDARY;
230 gren.weaponentity_fld = weaponentity;
231 setorigin(gren, w_shotorg);
232 setsize(gren, '-3 -3 -3', '3 3 3');
233
234 gren.nextthink = time + WEP_CVAR_SEC(WEP_MORTAR, lifetime);
238
239 gren.takedamage = DAMAGE_YES;
240 SetResourceExplicit(gren, RES_HEALTH, WEP_CVAR_SEC(WEP_MORTAR, health));
241 gren.damageforcescale = WEP_CVAR_SEC(WEP_MORTAR, damageforcescale);
242 gren.event_damage = W_Mortar_Grenade_Damage;
243 gren.damagedbycontents = true;
245 gren.missile_flags = MIF_SPLASH | MIF_ARC;
246 W_SetupProjVelocity_UP_SEC(gren, WEP_MORTAR);
247
248 gren.angles = vectoangles(gren.velocity);
249 gren.flags = FL_PROJECTILE;
250 IL_PUSH(g_projectiles, gren);
251 IL_PUSH(g_bot_dodge, gren);
252
253 if (WEP_CVAR_SEC(WEP_MORTAR, type) == 0 || WEP_CVAR_SEC(WEP_MORTAR, type) == 2)
254 CSQCProjectile(gren, true, PROJECTILE_GRENADE, true);
255 else
257
258 MUTATOR_CALLHOOK(EditProjectile, actor, gren);
259}
const int HITTYPE_SECONDARY
Definition all.qh:29
void W_Mortar_Grenade_Touch2(entity this, entity toucher)
Definition mortar.qc:127
void W_Mortar_Grenade_Explode2_use(entity this, entity actor, entity trigger)
Definition mortar.qc:66
void adaptor_think2use_hittype_splash(entity this)
Definition common.qc:106
#define W_SetupProjVelocity_UP_SEC(ent, wep)
Definition tracing.qh:56
#define WEP_CVAR_SEC(wep, name)
Definition all.qh:339

References adaptor_think2use_hittype_splash(), ammo, bouncefactor, bouncestop, CH_WEAPON_A, CSQCProjectile(), DAMAGE_YES, damageforcescale, entity(), FL_PROJECTILE, g_bot_dodge, g_damagedbycontents, g_projectiles, health, HITTYPE_SECONDARY, IL_PUSH(), lifetime, Weapon::m_id, MIF_ARC, MIF_SPLASH, MOVETYPE_BOUNCE, MUTATOR_CALLHOOK, PROJECTILE_GRENADE, PROJECTILE_GRENADE_BOUNCING, PROJECTILE_MAKETRIGGER, set_movetype(), SetResourceExplicit(), setthink, settouch, time, v_forward, vectoangles(), W_DecreaseAmmo(), W_Mortar_Grenade_Damage(), W_Mortar_Grenade_Explode2_use(), W_Mortar_Grenade_Touch2(), W_MuzzleFlash(), W_SetupProjVelocity_UP_SEC, W_SetupShot_ProjectileSize, w_shotdir, w_shotorg, WEP_CVAR, and WEP_CVAR_SEC.

◆ W_Mortar_Grenade_Damage()

void W_Mortar_Grenade_Damage ( entity this,
entity inflictor,
entity attacker,
float damage,
int deathtype,
.entity weaponentity,
vector hitloc,
vector force )

Definition at line 71 of file mortar.qc.

72{
73 if (GetResource(this, RES_HEALTH) <= 0)
74 return;
75 if (!W_CheckProjectileDamage(inflictor.realowner, this.realowner, deathtype, -1)) // no exceptions
76 return; // g_projectiles_damage says to halt
77
78 TakeResource(this, RES_HEALTH, damage);
79 if (GetResource(this, RES_HEALTH) <= 0)
80 W_PrepareExplosionByDamage(this, attacker, adaptor_think2use);
81}
float GetResource(entity e, Resource res_type)
Returns the current amount of resource the given entity has.
void TakeResource(entity receiver, Resource res_type, float amount)
Takes an entity some resource.
float W_CheckProjectileDamage(entity inflictor, entity projowner, int deathtype, float exception)
Definition common.qc:45
void W_PrepareExplosionByDamage(entity this, entity attacker, void(entity this) explode)
Definition common.qc:87

References entity(), GetResource(), TakeResource(), vector, W_CheckProjectileDamage(), and W_PrepareExplosionByDamage().

Referenced by W_Mortar_Attack(), and W_Mortar_Attack2().

◆ W_Mortar_Grenade_Explode()

void W_Mortar_Grenade_Explode ( entity this,
entity directhitentity )

Definition at line 5 of file mortar.qc.

6{
7 if (directhitentity.takedamage == DAMAGE_AIM
8 && IS_PLAYER(directhitentity) && DIFF_TEAM(this.realowner, directhitentity) && !IS_DEAD(directhitentity)
9 && IsFlying(directhitentity))
10 Send_Notification(NOTIF_ONE, this.realowner, MSG_ANNCE, ANNCE_ACHIEVEMENT_AIRSHOT);
11
12 this.event_damage = func_null;
13 this.takedamage = DAMAGE_NO;
14
15 if (this.move_movetype == MOVETYPE_NONE)
16 this.velocity = this.movedir; // .velocity must be != '0 0 0' for particle fx and decal to work
17
18 RadiusDamage(this, this.realowner,
19 WEP_CVAR_PRI(WEP_MORTAR, damage),
20 WEP_CVAR_PRI(WEP_MORTAR, edgedamage),
21 WEP_CVAR_PRI(WEP_MORTAR, radius),
22 NULL,
23 NULL,
24 WEP_CVAR_PRI(WEP_MORTAR, force),
27 directhitentity
28 );
29
30 delete(this);
31}
float radius
Definition impulse.qh:11
bool IsFlying(entity this)
Definition player.qc:843
#define IS_DEAD(s)
Definition player.qh:244
#define IS_PLAYER(s)
Definition player.qh:242
vector velocity
float RadiusDamage(entity inflictor, entity attacker, float coredamage, float edgedamage, float rad, entity cantbe, entity mustbe, float forceintensity, int deathtype,.entity weaponentity, entity directhitentity)
Definition damage.qc:943
vector movedir
Definition viewloc.qh:18
const int MOVETYPE_NONE
Definition movetypes.qh:129
float move_movetype
Definition movetypes.qh:76
var void func_null()
void Send_Notification(NOTIF broadcast, entity client, MSG net_type, Notification net_name,...count)
Definition all.qc:1573
#define NULL
Definition post.qh:14
int projectiledeathtype
Definition common.qh:21
const int DAMAGE_NO
Definition subs.qh:79
const int DAMAGE_AIM
Definition subs.qh:81
float takedamage
Definition subs.qh:78
#define DIFF_TEAM(a, b)
Definition teams.qh:242
entity realowner
entity weaponentity_fld

References DAMAGE_AIM, DAMAGE_NO, DIFF_TEAM, entity(), func_null(), IS_DEAD, IS_PLAYER, IsFlying(), move_movetype, movedir, MOVETYPE_NONE, NULL, projectiledeathtype, radius, RadiusDamage(), realowner, Send_Notification(), takedamage, velocity, weaponentity_fld, and WEP_CVAR_PRI.

Referenced by W_Mortar_Grenade_Explode_use(), and W_Mortar_Grenade_Think1().

◆ W_Mortar_Grenade_Explode2()

void W_Mortar_Grenade_Explode2 ( entity this,
entity directhitentity )

Definition at line 38 of file mortar.qc.

39{
40 if (directhitentity.takedamage == DAMAGE_AIM
41 && IS_PLAYER(directhitentity) && DIFF_TEAM(this.realowner, directhitentity) && !IS_DEAD(directhitentity)
42 && IsFlying(directhitentity))
43 Send_Notification(NOTIF_ONE, this.realowner, MSG_ANNCE, ANNCE_ACHIEVEMENT_AIRSHOT);
44
45 this.event_damage = func_null;
46 this.takedamage = DAMAGE_NO;
47
48 if (this.move_movetype == MOVETYPE_NONE)
49 this.velocity = this.movedir; // .velocity must be != '0 0 0' for particle fx and decal to work
50
51 RadiusDamage(this, this.realowner,
52 WEP_CVAR_SEC(WEP_MORTAR, damage),
53 WEP_CVAR_SEC(WEP_MORTAR, edgedamage),
54 WEP_CVAR_SEC(WEP_MORTAR, radius),
55 NULL,
56 NULL,
57 WEP_CVAR_SEC(WEP_MORTAR, force),
60 directhitentity
61 );
62
63 delete(this);
64}

References DAMAGE_AIM, DAMAGE_NO, DIFF_TEAM, entity(), func_null(), IS_DEAD, IS_PLAYER, IsFlying(), move_movetype, movedir, MOVETYPE_NONE, NULL, projectiledeathtype, radius, RadiusDamage(), realowner, Send_Notification(), takedamage, velocity, weaponentity_fld, and WEP_CVAR_SEC.

Referenced by W_Mortar_Grenade_Explode2_use().

◆ W_Mortar_Grenade_Explode2_use()

void W_Mortar_Grenade_Explode2_use ( entity this,
entity actor,
entity trigger )

Definition at line 66 of file mortar.qc.

67{
68 W_Mortar_Grenade_Explode2(this, trigger);
69}
void W_Mortar_Grenade_Explode2(entity this, entity directhitentity)
Definition mortar.qc:38

References entity(), and W_Mortar_Grenade_Explode2().

Referenced by W_Mortar_Attack2().

◆ W_Mortar_Grenade_Explode_use()

void W_Mortar_Grenade_Explode_use ( entity this,
entity actor,
entity trigger )

Definition at line 33 of file mortar.qc.

34{
35 W_Mortar_Grenade_Explode(this, trigger);
36}
void W_Mortar_Grenade_Explode(entity this, entity directhitentity)
Definition mortar.qc:5

References entity(), and W_Mortar_Grenade_Explode().

Referenced by W_Mortar_Attack().

◆ W_Mortar_Grenade_Think1()

void W_Mortar_Grenade_Think1 ( entity this)

Definition at line 83 of file mortar.qc.

84{
85 this.nextthink = time;
86 if (time > this.cnt)
87 {
90 return;
91 }
92 if (this.gl_detonate_later && this.gl_bouncecnt >= WEP_CVAR_PRI(WEP_MORTAR, remote_minbouncecnt))
94}
float cnt
Definition powerups.qc:24
float nextthink
const int HITTYPE_BOUNCE
Definition all.qh:31
float gl_bouncecnt
Definition mortar.qh:81
float gl_detonate_later
Definition mortar.qh:80

References cnt, entity(), gl_bouncecnt, gl_detonate_later, HITTYPE_BOUNCE, nextthink, NULL, projectiledeathtype, time, W_Mortar_Grenade_Explode(), and WEP_CVAR_PRI.

Referenced by W_Mortar_Attack().

◆ W_Mortar_Grenade_Touch1()

void W_Mortar_Grenade_Touch1 ( entity this,
entity toucher )

Definition at line 96 of file mortar.qc.

97{
99 if (toucher.takedamage == DAMAGE_AIM || WEP_CVAR_PRI(WEP_MORTAR, type) == 0) // always explode when hitting a player, or if normal mortar projectile
100 this.use(this, NULL, toucher);
101 else if (WEP_CVAR_PRI(WEP_MORTAR, type) == 1) // bounce
102 {
104 Send_Effect(EFFECT_HAGAR_BOUNCE, this.origin, this.velocity, 1);
106 ++this.gl_bouncecnt;
107 }
108 else if (WEP_CVAR_PRI(WEP_MORTAR, type) == 2
109 && (!toucher || (toucher.takedamage != DAMAGE_AIM && toucher.move_movetype == MOVETYPE_NONE))) // stick
110 {
111 spamsound(this, CH_SHOTS, SND_MORTAR_STICK, VOL_BASE, ATTN_NORM);
112
113 // let it stick whereever it is
114 this.movedir = this.velocity; // save to this temporary field, will be restored on explosion
115 this.velocity = '0 0 0';
116 set_movetype(this, MOVETYPE_NONE); // also disables gravity
117 this.gravity = 0; // nope, it does NOT! maybe a bug in CSQC code? TODO
119
120 // do not respond to any more touches
121 this.solid = SOLID_NOT;
122
123 this.nextthink = min(this.nextthink, time + WEP_CVAR_PRI(WEP_MORTAR, lifetime_stick));
124 }
125}
float gravity
Definition items.qh:17
const float SOLID_NOT
vector origin
const float ATTN_NORM
#define use
void UpdateCSQCProjectile(entity e)
void Send_Effect(entity eff, vector eff_loc, vector eff_vel, int eff_cnt)
Definition all.qc:120
solid
Definition ent_cs.qc:165
float min(float f,...)
entity entity toucher
Definition self.qh:72
#define PROJECTILE_TOUCH(e, t)
Definition common.qh:28
const float VOL_BASE
Definition sound.qh:36
const int CH_SHOTS
Definition sound.qh:14
Sound SND_GRENADE_BOUNCE_RANDOM()
Definition all.inc:17
float spamsound(entity e, int chan, Sound samp, float vol, float _atten)
use this one if you might be causing spam (e.g.
Definition all.qc:124

References ATTN_NORM, CH_SHOTS, DAMAGE_AIM, entity(), gl_bouncecnt, gravity, HITTYPE_BOUNCE, min(), movedir, MOVETYPE_NONE, nextthink, NULL, origin, PROJECTILE_TOUCH, projectiledeathtype, Send_Effect(), set_movetype(), SND_GRENADE_BOUNCE_RANDOM(), solid, SOLID_NOT, spamsound(), time, toucher, UpdateCSQCProjectile(), use, velocity, VOL_BASE, and WEP_CVAR_PRI.

Referenced by W_Mortar_Attack().

◆ W_Mortar_Grenade_Touch2()

void W_Mortar_Grenade_Touch2 ( entity this,
entity toucher )

Definition at line 127 of file mortar.qc.

128{
130 if (toucher.takedamage == DAMAGE_AIM || WEP_CVAR_SEC(WEP_MORTAR, type) == 0) // always explode when hitting a player, or if normal mortar projectile
131 this.use(this, NULL, toucher);
132 else if (WEP_CVAR_SEC(WEP_MORTAR, type) == 1) // bounce
133 {
135 Send_Effect(EFFECT_HAGAR_BOUNCE, this.origin, this.velocity, 1);
137 ++this.gl_bouncecnt;
138
139 if (WEP_CVAR_SEC(WEP_MORTAR, lifetime_bounce) && this.gl_bouncecnt == 1)
140 this.nextthink = time + WEP_CVAR_SEC(WEP_MORTAR, lifetime_bounce);
141 }
142 else if (WEP_CVAR_SEC(WEP_MORTAR, type) == 2
143 && (!toucher || (toucher.takedamage != DAMAGE_AIM && toucher.move_movetype == MOVETYPE_NONE))) // stick
144 {
145 spamsound(this, CH_SHOTS, SND_MORTAR_STICK, VOL_BASE, ATTN_NORM);
146
147 // let it stick whereever it is
148 this.movedir = this.velocity; // save to this temporary field, will be restored on explosion
149 this.velocity = '0 0 0';
150 set_movetype(this, MOVETYPE_NONE); // also disables gravity
151 this.gravity = 0; // nope, it does NOT! maybe a bug in CSQC code? TODO
153
154 // do not respond to any more touches
155 this.solid = SOLID_NOT;
156
157 this.nextthink = min(this.nextthink, time + WEP_CVAR_SEC(WEP_MORTAR, lifetime_stick));
158 }
159}

References ATTN_NORM, CH_SHOTS, DAMAGE_AIM, entity(), gl_bouncecnt, gravity, HITTYPE_BOUNCE, min(), movedir, MOVETYPE_NONE, nextthink, NULL, origin, PROJECTILE_TOUCH, projectiledeathtype, Send_Effect(), set_movetype(), SND_GRENADE_BOUNCE_RANDOM(), solid, SOLID_NOT, spamsound(), time, toucher, UpdateCSQCProjectile(), use, velocity, VOL_BASE, and WEP_CVAR_SEC.

Referenced by W_Mortar_Attack2().

Variable Documentation

◆ bot_secondary_grenademooth

bool bot_secondary_grenademooth

Definition at line 261 of file mortar.qc.