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

float bot_secondary_grenademooth

Function Documentation

◆ W_Mortar_Attack()

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

Definition at line 150 of file mortar.qc.

151{
152 W_DecreaseAmmo(thiswep, actor, WEP_CVAR_PRI(WEP_MORTAR, ammo), weaponentity);
153
154 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);
155 w_shotdir = v_forward; // no TrueAim for grenades please
156
157 W_MuzzleFlash(thiswep, actor, weaponentity, w_shotorg, w_shotdir);
158
159 entity gren = new(grenade);
160 gren.owner = gren.realowner = actor;
161 gren.bot_dodge = true;
162 gren.bot_dodgerating = WEP_CVAR_PRI(WEP_MORTAR, damage);
164 gren.bouncefactor = WEP_CVAR(WEP_MORTAR, bouncefactor);
165 gren.bouncestop = WEP_CVAR(WEP_MORTAR, bouncestop);
167 gren.projectiledeathtype = thiswep.m_id;
168 gren.weaponentity_fld = weaponentity;
169 setorigin(gren, w_shotorg);
170 setsize(gren, '-3 -3 -3', '3 3 3');
171
172 gren.cnt = time + WEP_CVAR_PRI(WEP_MORTAR, lifetime);
173 gren.nextthink = time;
177
178 gren.takedamage = DAMAGE_YES;
179 SetResourceExplicit(gren, RES_HEALTH, WEP_CVAR_PRI(WEP_MORTAR, health));
180 gren.damageforcescale = WEP_CVAR_PRI(WEP_MORTAR, damageforcescale);
181 gren.event_damage = W_Mortar_Grenade_Damage;
182 gren.damagedbycontents = true;
184 gren.missile_flags = MIF_SPLASH | MIF_ARC;
185 W_SetupProjVelocity_UP_PRI(gren, WEP_MORTAR);
186
187 gren.angles = vectoangles(gren.velocity);
188 gren.flags = FL_PROJECTILE;
189 IL_PUSH(g_projectiles, gren);
190 IL_PUSH(g_bot_dodge, gren);
191
192 if(WEP_CVAR_PRI(WEP_MORTAR, type) == 0 || WEP_CVAR_PRI(WEP_MORTAR, type) == 2)
193 CSQCProjectile(gren, true, PROJECTILE_GRENADE, true);
194 else
196
197 MUTATOR_CALLHOOK(EditProjectile, actor, gren);
198}
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:45
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:135
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:55
void W_Mortar_Grenade_Explode_use(entity this, entity actor, entity trigger)
Definition mortar.qc:25
void W_Mortar_Grenade_Think1(entity this)
Definition mortar.qc:69
void W_Mortar_Grenade_Touch1(entity this, entity toucher)
Definition mortar.qc:82
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:728
#define WEP_CVAR_PRI(wep, name)
Definition all.qh:322
#define WEP_CVAR(wep, name)
Definition all.qh:321
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 200 of file mortar.qc.

201{
202 entity gren;
203
204 W_DecreaseAmmo(thiswep, actor, WEP_CVAR_SEC(WEP_MORTAR, ammo), weaponentity);
205
206 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);
207 w_shotdir = v_forward; // no TrueAim for grenades please
208
209 W_MuzzleFlash(thiswep, actor, weaponentity, w_shotorg, w_shotdir);
210
211 gren = new(grenade);
212 gren.owner = gren.realowner = actor;
213 gren.bot_dodge = true;
214 gren.bot_dodgerating = WEP_CVAR_SEC(WEP_MORTAR, damage);
216 gren.bouncefactor = WEP_CVAR(WEP_MORTAR, bouncefactor);
217 gren.bouncestop = WEP_CVAR(WEP_MORTAR, bouncestop);
219 gren.projectiledeathtype = thiswep.m_id | HITTYPE_SECONDARY;
220 gren.weaponentity_fld = weaponentity;
221 setorigin(gren, w_shotorg);
222 setsize(gren, '-3 -3 -3', '3 3 3');
223
224 gren.nextthink = time + WEP_CVAR_SEC(WEP_MORTAR, lifetime);
228
229 gren.takedamage = DAMAGE_YES;
230 SetResourceExplicit(gren, RES_HEALTH, WEP_CVAR_SEC(WEP_MORTAR, health));
231 gren.damageforcescale = WEP_CVAR_SEC(WEP_MORTAR, damageforcescale);
232 gren.event_damage = W_Mortar_Grenade_Damage;
233 gren.damagedbycontents = true;
235 gren.missile_flags = MIF_SPLASH | MIF_ARC;
236 W_SetupProjVelocity_UP_SEC(gren, WEP_MORTAR);
237
238 gren.angles = vectoangles(gren.velocity);
239 gren.flags = FL_PROJECTILE;
240 IL_PUSH(g_projectiles, gren);
241 IL_PUSH(g_bot_dodge, gren);
242
243 if(WEP_CVAR_SEC(WEP_MORTAR, type) == 0 || WEP_CVAR_SEC(WEP_MORTAR, type) == 2)
244 CSQCProjectile(gren, true, PROJECTILE_GRENADE, true);
245 else
247
248 MUTATOR_CALLHOOK(EditProjectile, actor, gren);
249}
const int HITTYPE_SECONDARY
Definition all.qh:29
void W_Mortar_Grenade_Touch2(entity this, entity toucher)
Definition mortar.qc:114
void W_Mortar_Grenade_Explode2_use(entity this, entity actor, entity trigger)
Definition mortar.qc:50
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:323

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 55 of file mortar.qc.

56{
57 if(GetResource(this, RES_HEALTH) <= 0)
58 return;
59
60 if(!W_CheckProjectileDamage(inflictor.realowner, this.realowner, deathtype, -1)) // no exceptions
61 return; // g_projectiles_damage says to halt
62
63 TakeResource(this, RES_HEALTH, damage);
64
65 if(GetResource(this, RES_HEALTH) <= 0)
66 W_PrepareExplosionByDamage(this, attacker, adaptor_think2use);
67}
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 if(IS_PLAYER(directhitentity))
9 if(DIFF_TEAM(this.realowner, directhitentity))
10 if(!IS_DEAD(directhitentity))
11 if(IsFlying(directhitentity))
12 Send_Notification(NOTIF_ONE, this.realowner, MSG_ANNCE, ANNCE_ACHIEVEMENT_AIRSHOT);
13
14 this.event_damage = func_null;
15 this.takedamage = DAMAGE_NO;
16
18 this.velocity = this.movedir; // .velocity must be != '0 0 0' for particle fx and decal to work
19
20 RadiusDamage(this, this.realowner, WEP_CVAR_PRI(WEP_MORTAR, damage), WEP_CVAR_PRI(WEP_MORTAR, edgedamage), WEP_CVAR_PRI(WEP_MORTAR, radius), NULL, NULL, WEP_CVAR_PRI(WEP_MORTAR, force), this.projectiledeathtype, this.weaponentity_fld, directhitentity);
21
22 delete(this);
23}
float radius
Definition impulse.qh:11
bool IsFlying(entity this)
Definition player.qc:836
#define IS_DEAD(s)
Definition player.qh:245
#define IS_PLAYER(s)
Definition player.qh:243
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:981
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 30 of file mortar.qc.

31{
32 if(directhitentity.takedamage == DAMAGE_AIM)
33 if(IS_PLAYER(directhitentity))
34 if(DIFF_TEAM(this.realowner, directhitentity))
35 if(!IS_DEAD(directhitentity))
36 if(IsFlying(directhitentity))
37 Send_Notification(NOTIF_ONE, this.realowner, MSG_ANNCE, ANNCE_ACHIEVEMENT_AIRSHOT);
38
39 this.event_damage = func_null;
40 this.takedamage = DAMAGE_NO;
41
43 this.velocity = this.movedir; // .velocity must be != '0 0 0' for particle fx and decal to work
44
45 RadiusDamage(this, this.realowner, WEP_CVAR_SEC(WEP_MORTAR, damage), WEP_CVAR_SEC(WEP_MORTAR, edgedamage), WEP_CVAR_SEC(WEP_MORTAR, radius), NULL, NULL, WEP_CVAR_SEC(WEP_MORTAR, force), this.projectiledeathtype, this.weaponentity_fld, directhitentity);
46
47 delete(this);
48}

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 50 of file mortar.qc.

51{
52 W_Mortar_Grenade_Explode2(this, trigger);
53}
void W_Mortar_Grenade_Explode2(entity this, entity directhitentity)
Definition mortar.qc:30

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 25 of file mortar.qc.

26{
27 W_Mortar_Grenade_Explode(this, trigger);
28}
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 69 of file mortar.qc.

70{
71 this.nextthink = time;
72 if(time > this.cnt)
73 {
76 return;
77 }
78 if(this.gl_detonate_later && this.gl_bouncecnt >= WEP_CVAR_PRI(WEP_MORTAR, remote_minbouncecnt))
80}
float cnt
Definition powerups.qc:24
float nextthink
const int HITTYPE_BOUNCE
Definition all.qh:31
float gl_bouncecnt
Definition mortar.qh:77
float gl_detonate_later
Definition mortar.qh:76

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 82 of file mortar.qc.

83{
85 if(toucher.takedamage == DAMAGE_AIM || WEP_CVAR_PRI(WEP_MORTAR, type) == 0) // always explode when hitting a player, or if normal mortar projectile
86 {
87 this.use(this, NULL, toucher);
88 }
89 else if(WEP_CVAR_PRI(WEP_MORTAR, type) == 1) // bounce
90 {
92 Send_Effect(EFFECT_HAGAR_BOUNCE, this.origin, this.velocity, 1);
94 this.gl_bouncecnt += 1;
95 }
96 else if(WEP_CVAR_PRI(WEP_MORTAR, type) == 2 && (!toucher || (toucher.takedamage != DAMAGE_AIM && toucher.move_movetype == MOVETYPE_NONE))) // stick
97 {
98 spamsound(this, CH_SHOTS, SND_MORTAR_STICK, VOL_BASE, ATTN_NORM);
99
100 // let it stick whereever it is
101 this.movedir = this.velocity; // save to this temporary field, will be restored on explosion
102 this.velocity = '0 0 0';
103 set_movetype(this, MOVETYPE_NONE); // also disables gravity
104 this.gravity = 0; // nope, it does NOT! maybe a bug in CSQC code? TODO
106
107 // do not respond to any more touches
108 this.solid = SOLID_NOT;
109
110 this.nextthink = min(this.nextthink, time + WEP_CVAR_PRI(WEP_MORTAR, lifetime_stick));
111 }
112}
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:124
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 114 of file mortar.qc.

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

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

float bot_secondary_grenademooth

Definition at line 251 of file mortar.qc.