Xonotic QuakeC
The free, fast arena FPS with crisp movement and a wide array of weapons
minelayer.qh File Reference
This graph shows which files directly or indirectly include this file:

Go to the source code of this file.

Classes

class  MineLayer

Macros

#define X(BEGIN, P, END, class, prefix)

Functions

 MODEL (MINELAYER_ITEM, W_Model("g_minelayer.md3"))
 MODEL (MINELAYER_MINE, "models/mine.md3")
 MODEL (MINELAYER_MUZZLEFLASH, "models/flash.md3")
 MODEL (MINELAYER_VIEW, W_Model("h_minelayer.iqm"))
 MODEL (MINELAYER_WORLD, W_Model("v_minelayer.md3"))
 REGISTER_WEAPON (MINE_LAYER, NEW(MineLayer))
 SOUND (MINE_DET, W_Sound("mine_det"))
 SOUND (MINE_EXP, W_Sound("mine_exp"))
 SOUND (MINE_FIRE, W_Sound("mine_fire"))
 SOUND (MINE_STICK, W_Sound("mine_stick"))
 SOUND (MINE_TRIGGER, W_Sound("mine_trigger"))
 STATIC_INIT (g_mines)
void W_MineLayer_Think (entity this)

Variables

IntrusiveList g_mines
float mine_explodeanyway
float mine_time
float minelayer_detonate

Macro Definition Documentation

◆ X

#define X ( BEGIN,
P,
END,
class,
prefix )

Definition at line 36 of file minelayer.qh.

36#define X(BEGIN, P, END, class, prefix) \
37 BEGIN(class) \
38 P(class, prefix, ammo, float, NONE) \
39 P(class, prefix, animtime, float, NONE) \
40 P(class, prefix, damageforcescale, float, NONE) \
41 P(class, prefix, damage, float, NONE) \
42 P(class, prefix, detonatedelay, float, NONE) \
43 P(class, prefix, edgedamage, float, NONE) \
44 P(class, prefix, force, float, NONE) \
45 P(class, prefix, health, float, NONE) \
46 P(class, prefix, lifetime, float, NONE) \
47 P(class, prefix, lifetime_countdown, float, NONE) \
48 P(class, prefix, limit, float, NONE) \
49 P(class, prefix, pickup_ammo, float, NONE) \
50 P(class, prefix, protection, float, NONE) \
51 P(class, prefix, proximity_radius, float, NONE) \
52 P(class, prefix, proximity_time_core, float, NONE) \
53 P(class, prefix, proximity_time_edge, float, NONE) \
54 P(class, prefix, radius, float, NONE) \
55 P(class, prefix, refire, float, NONE) \
56 P(class, prefix, reload_ammo, float, NONE) \
57 P(class, prefix, reload_time, float, NONE) \
58 P(class, prefix, remote_damage, float, NONE) \
59 P(class, prefix, remote_edgedamage, float, NONE) \
60 P(class, prefix, remote_force, float, NONE) \
61 P(class, prefix, remote_radius, float, NONE) \
62 P(class, prefix, speed, float, NONE) \
63 P(class, prefix, switchdelay_drop, float, NONE) \
64 P(class, prefix, switchdelay_raise, float, NONE) \
65 P(class, prefix, weaponreplace, string, NONE) \
66 P(class, prefix, weaponstartoverride, float, NONE) \
67 P(class, prefix, weaponstart, float, NONE) \
68 P(class, prefix, weaponthrowable, float, NONE) \
69 END()

Function Documentation

◆ MODEL() [1/5]

MODEL ( MINELAYER_ITEM ,
W_Model("g_minelayer.md3")  )

◆ MODEL() [2/5]

MODEL ( MINELAYER_MINE ,
"models/mine.md3"  )

◆ MODEL() [3/5]

MODEL ( MINELAYER_MUZZLEFLASH ,
"models/flash.md3"  )

◆ MODEL() [4/5]

MODEL ( MINELAYER_VIEW ,
W_Model("h_minelayer.iqm")  )

◆ MODEL() [5/5]

MODEL ( MINELAYER_WORLD ,
W_Model("v_minelayer.md3")  )

◆ REGISTER_WEAPON()

REGISTER_WEAPON ( MINE_LAYER ,
NEW(MineLayer)  )

◆ SOUND() [1/5]

SOUND ( MINE_DET ,
W_Sound("mine_det")  )

◆ SOUND() [2/5]

SOUND ( MINE_EXP ,
W_Sound("mine_exp")  )

◆ SOUND() [3/5]

SOUND ( MINE_FIRE ,
W_Sound("mine_fire")  )

◆ SOUND() [4/5]

SOUND ( MINE_STICK ,
W_Sound("mine_stick")  )

◆ SOUND() [5/5]

SOUND ( MINE_TRIGGER ,
W_Sound("mine_trigger")  )

◆ STATIC_INIT()

STATIC_INIT ( g_mines )

Definition at line 84 of file minelayer.qh.

84{ g_mines = IL_NEW(); }
#define IL_NEW()
IntrusiveList g_mines
Definition minelayer.qh:83

References g_mines, and IL_NEW.

◆ W_MineLayer_Think()

void W_MineLayer_Think ( entity this)

Definition at line 178 of file minelayer.qc.

179{
180 entity head;
181
182 this.nextthink = time;
183
185 {
186 if(LostMovetypeFollow(this))
187 {
190 }
191 }
192
193 // our lifetime has expired, it's time to die - mine_time just allows us to play a sound for this
194 // TODO: replace this mine_trigger.wav sound with a real countdown
195 if((time > this.cnt) && (!this.mine_time) && (this.cnt > 0))
196 {
197 if(WEP_CVAR(WEP_MINE_LAYER, lifetime_countdown) > 0)
198 spamsound(this, CH_SHOTS, SND_MINE_TRIGGER, VOL_BASE, ATTN_NORM);
199 this.mine_time = time + WEP_CVAR(WEP_MINE_LAYER, lifetime_countdown);
200 this.mine_explodeanyway = 1; // make the mine super aggressive -- Samual: Rather, make it not care if a teammate is near.
201 }
202
203 // a player's mines shall explode if they disconnect or die
204 if(!IS_PLAYER(this.realowner) || IS_DEAD(this.realowner) || STAT(FROZEN, this.realowner))
205 {
208 return;
209 }
210
211 // set the mine for detonation when a foe gets close enough
212 float time_core = WEP_CVAR(WEP_MINE_LAYER, proximity_time_core);
213 float time_edge = WEP_CVAR(WEP_MINE_LAYER, proximity_time_edge);
214 float proxrad = WEP_CVAR(WEP_MINE_LAYER, proximity_radius);
215 head = WarpZone_FindRadius(this.origin, proxrad, false);
216 while(head)
217 {
218 if(IS_PLAYER(head) && !IS_DEAD(head) && !STAT(FROZEN, head) && !IS_INDEPENDENT_PLAYER(head))
219 if(DIFF_TEAM(head, this.realowner)) // don't trigger for teammates
220 {
221 if(!this.mine_time) // don't repeat the sound
222 spamsound(this, CH_SHOTS, SND_MINE_TRIGGER, VOL_BASE, ATTN_NORM);
223 // scale from time_edge to time_core based on how close the player is to the mine
224 float new_mine_time = time + time_core;
225 if(time_edge != time_core)
226 new_mine_time += (time_edge - time_core) * vlen(head.WarpZone_findradius_dist) / proxrad;
227 if((!this.mine_time) || this.mine_time > new_mine_time) // choose the earliest explosion time
228 this.mine_time = new_mine_time;
229 }
230 head = head.chain;
231 }
232
233 // explode if it's time to
234 if(this.mine_time && time >= this.mine_time)
235 {
237 return;
238 }
239
240 // remote detonation
241 .entity weaponentity = this.weaponentity_fld;
242 if(this.realowner.(weaponentity).m_weapon == WEP_MINE_LAYER)
243 if(!IS_DEAD(this.realowner))
244 if(this.minelayer_detonate)
245 {
247 return;
248 }
249
250 // if it was detached by damage but landed during the bounce time, reenable gravity so it will touch and reattach
251 if (this.move_movetype == MOVETYPE_BOUNCE && IS_ONGROUND(this))
252 UNSET_ONGROUND(this);
253}
var entity(vector mins, vector maxs,.entity tofield) findbox_tofield_OrFallback
float cnt
Definition powerups.qc:24
#define IS_DEAD(s)
Definition player.qh:245
#define IS_PLAYER(s)
Definition player.qh:243
void UnsetMovetypeFollow(entity ent)
Definition util.qc:2053
int LostMovetypeFollow(entity ent)
Definition util.qc:2063
float time
float nextthink
vector origin
const float ATTN_NORM
const int HITTYPE_BOUNCE
Definition all.qh:31
#define STAT(...)
Definition stats.qh:82
entity WarpZone_FindRadius(vector org, float rad, bool needlineofsight)
Definition common.qc:686
float vlen(vector v)
void W_MineLayer_ProximityExplode(entity this)
Definition minelayer.qc:149
void W_MineLayer_Explode(entity this, entity directhitentity)
Definition minelayer.qc:58
void W_MineLayer_RemoteExplode(entity this)
Definition minelayer.qc:120
float minelayer_detonate
Definition minelayer.qh:80
float mine_explodeanyway
Definition minelayer.qh:80
float mine_time
Definition minelayer.qh:81
void set_movetype(entity this, int mt)
Definition movetypes.qc:4
const int MOVETYPE_NONE
Definition movetypes.qh:129
const int MOVETYPE_FOLLOW
Definition movetypes.qh:141
float move_movetype
Definition movetypes.qh:76
#define UNSET_ONGROUND(s)
Definition movetypes.qh:18
const int MOVETYPE_BOUNCE
Definition movetypes.qh:139
#define IS_ONGROUND(s)
Definition movetypes.qh:16
#define NULL
Definition post.qh:14
#define IS_INDEPENDENT_PLAYER(e)
Definition client.qh:312
int projectiledeathtype
Definition common.qh:21
const float VOL_BASE
Definition sound.qh:36
const int CH_SHOTS
Definition sound.qh:14
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
#define DIFF_TEAM(a, b)
Definition teams.qh:242
entity realowner
#define WEP_CVAR(wep, name)
Definition all.qh:321
entity weaponentity_fld

References ATTN_NORM, CH_SHOTS, cnt, DIFF_TEAM, entity(), HITTYPE_BOUNCE, IS_DEAD, IS_INDEPENDENT_PLAYER, IS_ONGROUND, IS_PLAYER, LostMovetypeFollow(), mine_explodeanyway, mine_time, minelayer_detonate, move_movetype, MOVETYPE_BOUNCE, MOVETYPE_FOLLOW, MOVETYPE_NONE, nextthink, NULL, origin, projectiledeathtype, realowner, set_movetype(), spamsound(), STAT, time, UNSET_ONGROUND, UnsetMovetypeFollow(), vlen(), VOL_BASE, W_MineLayer_Explode(), W_MineLayer_ProximityExplode(), W_MineLayer_RemoteExplode(), WarpZone_FindRadius(), weaponentity_fld, and WEP_CVAR.

Referenced by W_MineLayer_Attack(), and W_MineLayer_Stick().

Variable Documentation

◆ g_mines

◆ mine_explodeanyway

float mine_explodeanyway

Definition at line 80 of file minelayer.qh.

Referenced by W_MineLayer_ProximityExplode(), and W_MineLayer_Think().

◆ mine_time

float mine_time

Definition at line 81 of file minelayer.qh.

Referenced by W_MineLayer_ProximityExplode(), W_MineLayer_Stick(), and W_MineLayer_Think().

◆ minelayer_detonate

float minelayer_detonate

Definition at line 80 of file minelayer.qh.

Referenced by W_MineLayer_Think().