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

Go to the source code of this file.

Functions

void W_Seeker_Attack (Weapon thiswep, entity actor,.entity weaponentity)
void W_Seeker_Fire_Flac (Weapon thiswep, entity actor,.entity weaponentity)
void W_Seeker_Fire_Missile (Weapon thiswep, entity actor,.entity weaponentity, entity m_target, int bullet_count)
void W_Seeker_Fire_Tag (Weapon thiswep, entity actor,.entity weaponentity)
void W_Seeker_Flac_Explode (entity this, entity directhitentity)
void W_Seeker_Flac_Explode_use (entity this, entity actor, entity trigger)
void W_Seeker_Flac_Touch (entity this, entity toucher)
void W_Seeker_Missile_Damage (entity this, entity inflictor, entity attacker, float damage, int deathtype,.entity weaponentity, vector hitloc, vector force)
void W_Seeker_Missile_Explode (entity this, entity directhitentity)
void W_Seeker_Missile_Explode_think (entity this)
void W_Seeker_Missile_Think (entity this)
void W_Seeker_Missile_Touch (entity this, entity toucher)
void W_Seeker_Tag_Damage (entity this, entity inflictor, entity attacker, float damage, int deathtype,.entity weaponentity, vector hitloc, vector force)
void W_Seeker_Tag_Explode (entity this)
void W_Seeker_Tag_Touch (entity this, entity toucher)
entity W_Seeker_Tagged_Info (entity isowner,.entity weaponentity, entity istarget)
void W_Seeker_Tracker_Think (entity this)
void W_Seeker_Vollycontroller_Think (entity this)

Function Documentation

◆ W_Seeker_Attack()

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

Definition at line 283 of file seeker.qc.

284{
285 entity closest = NULL;
286 vector it_trans_org;
287 float it_dist2, closest_dist2 = 0;
288 IL_EACH(g_seeker_trackers, it.classname == "tag_tracker" && it.realowner == actor,
289 {
290 // First check line of sight
291 it_trans_org = WarpZone_RefSys_TransformOrigin(it.tag_target, actor, it.tag_target.origin);
292 WarpZone_TraceLine(actor.origin + actor.view_ofs, it_trans_org, MOVE_NOMONSTERS, actor);
293 if (trace_fraction < 1 && trace_ent != it)
294 continue;
295
296 it_dist2 = vlen2(actor.origin - it_trans_org);
297 if (!closest || it_dist2 < closest_dist2) // new closest
298 {
299 closest_dist2 = it_dist2;
300 closest = it.tag_target;
301 }
302 });
303
304 W_Seeker_Fire_Missile(thiswep, actor, weaponentity, closest, -1);
305}
var entity(vector mins, vector maxs,.entity tofield) findbox_tofield_OrFallback
#define IL_EACH(this, cond, body)
#define NULL
Definition post.qh:14
void W_Seeker_Fire_Missile(Weapon thiswep, entity actor,.entity weaponentity, entity m_target, int bullet_count)
Definition seeker.qc:134
IntrusiveList g_seeker_trackers
Definition seeker.qh:126
vector
Definition self.qh:96

References entity(), g_seeker_trackers, IL_EACH, NULL, and vector.

◆ W_Seeker_Fire_Flac()

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

Definition at line 226 of file seeker.qc.

227{
228 W_DecreaseAmmo(thiswep, actor, WEP_CVAR(WEP_SEEKER, flac_ammo), weaponentity);
229
230 vector old_movedir = actor.(weaponentity).movedir;
231 actor.(weaponentity).movedir += W_SetupShot_GetAlternatingOffset(actor.(weaponentity).bulletcounter);
232 W_SetupShot_ProjectileSize(actor, weaponentity, '-2 -2 -2', '2 2 2', false, 2, SND_SEEKER_FLAC_FIRE, CH_WEAPON_A, WEP_CVAR(WEP_SEEKER, flac_damage), thiswep.m_id | HITTYPE_SECONDARY);
233 actor.(weaponentity).movedir = old_movedir;
234
235 // uses hagar effects!
236 W_MuzzleFlash(WEP_HAGAR, actor, weaponentity, w_shotorg, w_shotdir);
237
238 entity missile;
239 missile = new(missile);
240 missile.owner = missile.realowner = actor;
241 missile.bot_dodge = true;
242 missile.bot_dodgerating = WEP_CVAR(WEP_SEEKER, flac_damage);
244 missile.use = W_Seeker_Flac_Explode_use;
246 missile.nextthink = time + WEP_CVAR(WEP_SEEKER, flac_lifetime) + WEP_CVAR(WEP_SEEKER, flac_lifetime_rand);
247 set_movetype(missile, MOVETYPE_FLY);
248 missile.projectiledeathtype = thiswep.m_id | HITTYPE_SECONDARY;
249 missile.weaponentity_fld = weaponentity;
250 missile.flags = FL_PROJECTILE;
251 IL_PUSH(g_projectiles, missile);
252 IL_PUSH(g_bot_dodge, missile);
253 missile.missile_flags = MIF_SPLASH;
254
255 // csqc projectiles
256 //missile.angles = vectoangles(missile.velocity);
257 //missile.scale = 0.4; // BUG: the model is too big
258
259 PROJECTILE_MAKETRIGGER(missile);
260 setorigin(missile, w_shotorg);
261 setsize(missile, '-2 -2 -2', '2 2 2');
262
263 W_SetupProjVelocity_UP_PRE(missile, WEP_SEEKER, flac_);
264 CSQCProjectile(missile, true, PROJECTILE_SEEKER_FLAC, true);
265
266 MUTATOR_CALLHOOK(EditProjectile, actor, missile);
267}
IntrusiveList g_bot_dodge
Definition api.qh:150
#define MUTATOR_CALLHOOK(id,...)
Definition base.qh:143
int m_id
Definition weapon.qh:43
const int FL_PROJECTILE
Definition constants.qh:77
float time
void CSQCProjectile(entity e, float clientanimate, int type, float docull)
const int HITTYPE_SECONDARY
Definition all.qh:31
ERASEABLE entity IL_PUSH(IntrusiveList this, entity it)
Push to tail.
vector movedir
Definition viewloc.qh:18
void set_movetype(entity this, int mt)
Definition movetypes.qc:4
const int MOVETYPE_FLY
Definition movetypes.qh:138
const int PROJECTILE_SEEKER_FLAC
void W_Seeker_Flac_Explode_use(entity this, entity actor, entity trigger)
Definition seeker.qc:221
void W_Seeker_Flac_Touch(entity this, entity toucher)
Definition seeker.qc:214
#define setthink(e, f)
#define settouch(e, f)
Definition self.qh:77
void adaptor_think2use_hittype_splash(entity this)
Definition common.qc:106
const int MIF_SPLASH
Definition common.qh:58
IntrusiveList g_projectiles
Definition common.qh:70
#define PROJECTILE_MAKETRIGGER(e)
Definition common.qh:46
const int CH_WEAPON_A
Definition sound.qh:7
vector W_SetupShot_GetAlternatingOffset(int bullet_count)
Definition tracing.qc:166
vector w_shotdir
Definition tracing.qh:20
#define W_SetupProjVelocity_UP_PRE(ent, wep, prefix)
Definition tracing.qh:54
#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(wep, name)
Definition all.qh:337
void W_DecreaseAmmo(Weapon wep, entity actor, float ammo_use,.entity weaponentity)

References adaptor_think2use_hittype_splash(), CH_WEAPON_A, CSQCProjectile(), entity(), FL_PROJECTILE, g_bot_dodge, g_projectiles, HITTYPE_SECONDARY, IL_PUSH(), Weapon::m_id, MIF_SPLASH, movedir, MOVETYPE_FLY, MUTATOR_CALLHOOK, PROJECTILE_MAKETRIGGER, PROJECTILE_SEEKER_FLAC, set_movetype(), setthink, settouch, time, vector, W_DecreaseAmmo(), W_MuzzleFlash(), W_Seeker_Flac_Explode_use(), W_Seeker_Flac_Touch(), W_SetupProjVelocity_UP_PRE, W_SetupShot_GetAlternatingOffset(), W_SetupShot_ProjectileSize, w_shotdir, w_shotorg, and WEP_CVAR.

◆ W_Seeker_Fire_Missile()

void W_Seeker_Fire_Missile ( Weapon thiswep,
entity actor,
.entity weaponentity,
entity m_target,
int bullet_count )

Definition at line 134 of file seeker.qc.

135{
136 W_DecreaseAmmo(thiswep, actor, WEP_CVAR(WEP_SEEKER, missile_ammo), weaponentity);
137
138 makevectors(actor.v_angle);
139 vector old_movedir = actor.(weaponentity).movedir;
140 if (bullet_count > 0)
141 actor.(weaponentity).movedir += W_SetupShot_GetAlternatingOffset(bullet_count);
142 W_SetupShot_ProjectileSize(actor, weaponentity, '-4 -4 -4', '4 4 4', false, 2, SND_SEEKER_FIRE, CH_WEAPON_A, 0, ((m_target != NULL) ? thiswep.m_id | HITTYPE_SECONDARY : thiswep.m_id));
143 actor.(weaponentity).movedir = old_movedir;
144 W_MuzzleFlash(thiswep, actor, weaponentity, w_shotorg, w_shotdir);
145
146 //actor.detornator = false;
147
148 entity missile = new(seeker_missile);
149 WarpZone_RefSys_Copy(missile, actor);
150 missile.owner = missile.realowner = actor;
151 missile.bot_dodge = true;
152 missile.bot_dodgerating = WEP_CVAR(WEP_SEEKER, missile_damage);
153
156 missile.event_damage = W_Seeker_Missile_Damage;
157 missile.nextthink = time; // + 0.2; // + cvar("g_balance_seeker_missile_activate_delay");
158 missile.cnt = time + WEP_CVAR(WEP_SEEKER, missile_lifetime);
159 missile.enemy = m_target;
160 missile.scale = 2;
161 missile.takedamage = DAMAGE_YES;
162 missile.weaponentity_fld = weaponentity;
163 SetResourceExplicit(missile, RES_HEALTH, WEP_CVAR(WEP_SEEKER, missile_health));
164 missile.damageforcescale = WEP_CVAR(WEP_SEEKER, missile_damageforcescale);
165 missile.damagedbycontents = true;
167 //missile.think = W_Seeker_Missile_Animate; // csqc projectiles.
168
169 if (missile.enemy != NULL)
170 missile.projectiledeathtype = thiswep.m_id | HITTYPE_SECONDARY;
171 else
172 missile.projectiledeathtype = thiswep.m_id;
173
174 PROJECTILE_MAKETRIGGER(missile);
175 setorigin(missile, w_shotorg);
176 setsize(missile, '-4 -4 -4', '4 4 4');
178 missile.flags = FL_PROJECTILE;
179 IL_PUSH(g_projectiles, missile);
180 IL_PUSH(g_bot_dodge, missile);
181 missile.missile_flags = MIF_SPLASH | MIF_GUIDED_TAG;
182
183 W_SetupProjVelocity_UP_PRE(missile, WEP_SEEKER, missile_);
184
185 missile.angles = vectoangles(missile.velocity);
186
187 CSQCProjectile(missile, false, PROJECTILE_SEEKER_MISSILE, true);
188
189 MUTATOR_CALLHOOK(EditProjectile, actor, missile);
190}
IntrusiveList g_damagedbycontents
Definition damage.qh:143
SetResourceExplicit(ent, RES_ARMOR, ReadByte() *DEC_FACTOR)) ENTCS_PROP(NAME
void WarpZone_RefSys_Copy(entity me, entity from)
Copies the warpzone reference of from onto me.
Definition common.qc:824
vector vectoangles(vector v)
const int MOVETYPE_FLYMISSILE
Definition movetypes.qh:142
#define makevectors
Definition post.qh:21
const int PROJECTILE_SEEKER_MISSILE
void W_Seeker_Missile_Think(entity this)
Definition seeker.qc:38
void W_Seeker_Missile_Touch(entity this, entity toucher)
Definition seeker.qc:31
void W_Seeker_Missile_Damage(entity this, entity inflictor, entity attacker, float damage, int deathtype,.entity weaponentity, vector hitloc, vector force)
Definition seeker.qc:95
const int MIF_GUIDED_TAG
Definition common.qh:65
const int DAMAGE_YES
Definition subs.qh:80

References CH_WEAPON_A, CSQCProjectile(), DAMAGE_YES, entity(), FL_PROJECTILE, g_bot_dodge, g_damagedbycontents, g_projectiles, HITTYPE_SECONDARY, IL_PUSH(), Weapon::m_id, makevectors, MIF_GUIDED_TAG, MIF_SPLASH, movedir, MOVETYPE_FLYMISSILE, MUTATOR_CALLHOOK, NULL, PROJECTILE_MAKETRIGGER, PROJECTILE_SEEKER_MISSILE, set_movetype(), SetResourceExplicit(), setthink, settouch, time, vectoangles(), vector, W_DecreaseAmmo(), W_MuzzleFlash(), W_Seeker_Missile_Damage(), W_Seeker_Missile_Think(), W_Seeker_Missile_Touch(), W_SetupProjVelocity_UP_PRE, W_SetupShot_GetAlternatingOffset(), W_SetupShot_ProjectileSize, w_shotdir, w_shotorg, WarpZone_RefSys_Copy(), and WEP_CVAR.

Referenced by W_Seeker_Vollycontroller_Think().

◆ W_Seeker_Fire_Tag()

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

Definition at line 426 of file seeker.qc.

427{
428 W_DecreaseAmmo(thiswep, actor, WEP_CVAR(WEP_SEEKER, tag_ammo), weaponentity);
429
430 W_SetupShot_ProjectileSize(actor, weaponentity, '-2 -2 -2', '2 2 2', false, 2, SND_TAG_FIRE, CH_WEAPON_A, WEP_CVAR(WEP_SEEKER, missile_damage) * WEP_CVAR(WEP_SEEKER, missile_count), thiswep.m_id | HITTYPE_BOUNCE | HITTYPE_SECONDARY);
431
432 entity missile = new(seeker_tag);
433 WarpZone_RefSys_Copy(missile, actor);
434 missile.weaponentity_fld = weaponentity;
435 missile.owner = missile.realowner = actor;
436 missile.bot_dodge = true;
437 missile.bot_dodgerating = 50;
439 setthink(missile, SUB_Remove);
440 missile.nextthink = time + WEP_CVAR(WEP_SEEKER, tag_lifetime);
441 set_movetype(missile, MOVETYPE_FLY);
442
443 missile.takedamage = DAMAGE_YES;
444 missile.event_damage = W_Seeker_Tag_Damage;
445 SetResourceExplicit(missile, RES_HEALTH, WEP_CVAR(WEP_SEEKER, tag_health));
446 missile.damageforcescale = WEP_CVAR(WEP_SEEKER, tag_damageforcescale);
447
448 PROJECTILE_MAKETRIGGER(missile);
449 setorigin(missile, w_shotorg);
450 setsize(missile, '-2 -2 -2', '2 2 2');
451
452 missile.flags = FL_PROJECTILE;
453 IL_PUSH(g_projectiles, missile);
454 IL_PUSH(g_bot_dodge, missile);
455 //missile.missile_flags = MIF_..?;
456
457 set_movetype(missile, MOVETYPE_FLY);
458 W_SetupProjVelocity_PRE(missile, WEP_SEEKER, tag_);
459 missile.angles = vectoangles(missile.velocity);
460
461 CSQCProjectile(missile, true, PROJECTILE_SEEKER_TAG, false); // has sound
462
463 MUTATOR_CALLHOOK(EditProjectile, actor, missile);
464}
const int HITTYPE_BOUNCE
set manually after projectile has bounced
Definition all.qh:33
void SUB_Remove(entity this)
Remove entity.
Definition defer.qh:12
const int PROJECTILE_SEEKER_TAG
Definition projectiles.qh:5
void W_Seeker_Tag_Damage(entity this, entity inflictor, entity attacker, float damage, int deathtype,.entity weaponentity, vector hitloc, vector force)
Definition seeker.qc:361
void W_Seeker_Tag_Touch(entity this, entity toucher)
Definition seeker.qc:370
#define W_SetupProjVelocity_PRE(ent, wep, prefix)
Definition tracing.qh:67

References CH_WEAPON_A, CSQCProjectile(), DAMAGE_YES, entity(), FL_PROJECTILE, g_bot_dodge, g_projectiles, HITTYPE_BOUNCE, HITTYPE_SECONDARY, IL_PUSH(), Weapon::m_id, MOVETYPE_FLY, MUTATOR_CALLHOOK, PROJECTILE_MAKETRIGGER, PROJECTILE_SEEKER_TAG, set_movetype(), SetResourceExplicit(), setthink, settouch, SUB_Remove(), time, vectoangles(), W_DecreaseAmmo(), W_Seeker_Tag_Damage(), W_Seeker_Tag_Touch(), W_SetupProjVelocity_PRE, W_SetupShot_ProjectileSize, w_shotorg, WarpZone_RefSys_Copy(), and WEP_CVAR.

◆ W_Seeker_Flac_Explode()

void W_Seeker_Flac_Explode ( entity this,
entity directhitentity )

Definition at line 195 of file seeker.qc.

196{
197 this.event_damage = func_null;
198
199 RadiusDamage(this, this.realowner,
200 WEP_CVAR(WEP_SEEKER, flac_damage),
201 WEP_CVAR(WEP_SEEKER, flac_edgedamage),
202 WEP_CVAR(WEP_SEEKER, flac_radius),
203 NULL,
204 NULL,
205 WEP_CVAR(WEP_SEEKER, flac_force),
207 this.weaponentity_fld,
208 directhitentity
209 );
210
211 delete(this);
212}
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:937
var void func_null()
int projectiledeathtype
Definition common.qh:33
entity realowner
entity weaponentity_fld

References entity(), func_null(), NULL, projectiledeathtype, RadiusDamage(), realowner, weaponentity_fld, and WEP_CVAR.

Referenced by W_Seeker_Flac_Explode_use(), and W_Seeker_Flac_Touch().

◆ W_Seeker_Flac_Explode_use()

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

Definition at line 221 of file seeker.qc.

222{
223 W_Seeker_Flac_Explode(this, trigger);
224}
void W_Seeker_Flac_Explode(entity this, entity directhitentity)
Definition seeker.qc:195

References entity(), and W_Seeker_Flac_Explode().

Referenced by W_Seeker_Fire_Flac().

◆ W_Seeker_Flac_Touch()

void W_Seeker_Flac_Touch ( entity this,
entity toucher )

Definition at line 214 of file seeker.qc.

215{
217
219}
entity entity toucher
Definition self.qh:76
#define PROJECTILE_TOUCH(e, t)
Definition common.qh:40

References entity(), PROJECTILE_TOUCH, toucher, and W_Seeker_Flac_Explode().

Referenced by W_Seeker_Fire_Flac().

◆ W_Seeker_Missile_Damage()

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

Definition at line 95 of file seeker.qc.

96{
97 if (GetResource(this, RES_HEALTH) <= 0)
98 return;
99 if (!W_CheckProjectileDamage(inflictor.realowner, this.realowner, deathtype, -1)) // no exceptions
100 return; // g_projectiles_damage says to halt
101
102 if (this.realowner == attacker)
103 TakeResource(this, RES_HEALTH, (damage * 0.25));
104 else
105 TakeResource(this, RES_HEALTH, damage);
106
107 if (GetResource(this, RES_HEALTH) <= 0)
109}
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.
void W_Seeker_Missile_Explode_think(entity this)
Definition seeker.qc:26
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(), realowner, TakeResource(), vector, W_CheckProjectileDamage(), W_PrepareExplosionByDamage(), and W_Seeker_Missile_Explode_think().

Referenced by W_Seeker_Fire_Missile().

◆ W_Seeker_Missile_Explode()

void W_Seeker_Missile_Explode ( entity this,
entity directhitentity )

Definition at line 8 of file seeker.qc.

9{
10 this.event_damage = func_null;
11 RadiusDamage(this, this.realowner,
12 WEP_CVAR(WEP_SEEKER, missile_damage),
13 WEP_CVAR(WEP_SEEKER, missile_edgedamage),
14 WEP_CVAR(WEP_SEEKER, missile_radius),
15 NULL,
16 NULL,
17 WEP_CVAR(WEP_SEEKER, missile_force),
20 directhitentity
21 );
22
23 delete(this);
24}

References entity(), func_null(), NULL, projectiledeathtype, RadiusDamage(), realowner, weaponentity_fld, and WEP_CVAR.

Referenced by W_Seeker_Missile_Explode_think(), W_Seeker_Missile_Think(), and W_Seeker_Missile_Touch().

◆ W_Seeker_Missile_Explode_think()

void W_Seeker_Missile_Explode_think ( entity this)

Definition at line 26 of file seeker.qc.

27{
29}
void W_Seeker_Missile_Explode(entity this, entity directhitentity)
Definition seeker.qc:8

References entity(), NULL, and W_Seeker_Missile_Explode().

Referenced by W_Seeker_Missile_Damage().

◆ W_Seeker_Missile_Think()

void W_Seeker_Missile_Think ( entity this)

Definition at line 38 of file seeker.qc.

39{
40 if (time > this.cnt)
41 {
44 }
45
46 float dist = W_SeekOutEnemy(this,
47 WEP_CVAR(WEP_SEEKER, missile_decel),
48 WEP_CVAR(WEP_SEEKER, missile_accel),
49 WEP_CVAR(WEP_SEEKER, missile_speed_max),
50 WEP_CVAR(WEP_SEEKER, missile_turnrate),
51 WEP_CVAR(WEP_SEEKER, missile_smart),
52 WEP_CVAR(WEP_SEEKER, missile_smart_mindist),
53 WEP_CVAR(WEP_SEEKER, missile_smart_trace_min),
54 WEP_CVAR(WEP_SEEKER, missile_smart_trace_max));
55
56 // Proxy
57 if (WEP_CVAR(WEP_SEEKER, missile_proxy))
58 {
59 if (dist <= WEP_CVAR(WEP_SEEKER, missile_proxy_maxrange))
60 {
61 if (this.cvar_cl_autoswitch == 0)
62 this.cvar_cl_autoswitch = time + WEP_CVAR(WEP_SEEKER, missile_proxy_delay);
63 else
64 {
65 if (this.cvar_cl_autoswitch <= time)
66 {
68 this.cvar_cl_autoswitch = 0;
69 }
70 }
71 }
72 else
73 {
74 if (this.cvar_cl_autoswitch != 0)
75 this.cvar_cl_autoswitch = 0;
76 }
77 }
79
80 if (IS_DEAD(this.enemy))
81 {
82 this.enemy = NULL;
83 this.cnt = time + 1 + (random() * 4);
84 this.nextthink = this.cnt;
85 return;
86 }
87
88 //this.angles = vectoangles(this.velocity); // turn model in the new flight direction
89 this.nextthink = time;// + 0.05; // csqc projectiles
91}
float cnt
Definition powerups.qc:24
#define IS_DEAD(s)
Definition player.qh:244
float nextthink
void UpdateCSQCProjectile(entity e)
const int HITTYPE_SPLASH
automatically set by RadiusDamage
Definition all.qh:32
float random(void)
float W_SeekOutEnemy(entity this, float speed_decel, float speed_accel, float speed_max, float turn_rate, bool smart, float smart_mindist, float smart_trace_min, float smart_trace_max)
Automatically guides a projectile towards its enemy.
Definition common.qc:239
entity enemy
Definition sv_ctf.qh:152

References cnt, enemy, entity(), HITTYPE_SPLASH, IS_DEAD, nextthink, NULL, projectiledeathtype, random(), time, UpdateCSQCProjectile(), W_Seeker_Missile_Explode(), W_SeekOutEnemy(), and WEP_CVAR.

Referenced by W_Seeker_Fire_Missile().

◆ W_Seeker_Missile_Touch()

void W_Seeker_Missile_Touch ( entity this,
entity toucher )

Definition at line 31 of file seeker.qc.

32{
34
36}

References entity(), PROJECTILE_TOUCH, toucher, and W_Seeker_Missile_Explode().

Referenced by W_Seeker_Fire_Missile().

◆ W_Seeker_Tag_Damage()

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

Definition at line 361 of file seeker.qc.

362{
363 if (GetResource(this, RES_HEALTH) <= 0)
364 return;
365 TakeResource(this, RES_HEALTH, damage);
366 if (GetResource(this, RES_HEALTH) <= 0)
368}
void W_Seeker_Tag_Explode(entity this)
Definition seeker.qc:352

References entity(), GetResource(), TakeResource(), vector, and W_Seeker_Tag_Explode().

Referenced by W_Seeker_Fire_Tag().

◆ W_Seeker_Tag_Explode()

void W_Seeker_Tag_Explode ( entity this)

Definition at line 352 of file seeker.qc.

353{
354 //if (other == this.realowner)
355 // return;
356 Damage_DamageInfo(this.origin, 0, 0, 0, this.velocity, WEP_SEEKER.m_id | HITTYPE_BOUNCE, 0, this);
357
358 delete(this);
359}
vector velocity
vector origin
void Damage_DamageInfo(vector org, float coredamage, float edgedamage, float rad, vector force, int deathtype, float bloodtype, entity dmgowner)

References Damage_DamageInfo(), entity(), HITTYPE_BOUNCE, origin, and velocity.

Referenced by W_Seeker_Tag_Damage().

◆ W_Seeker_Tag_Touch()

void W_Seeker_Tag_Touch ( entity this,
entity toucher )

Definition at line 370 of file seeker.qc.

371{
373
374 this.event_damage = func_null;
375 Damage_DamageInfo(this.origin, 0, 0, 0, this.velocity, WEP_SEEKER.m_id | HITTYPE_BOUNCE | HITTYPE_SECONDARY, toucher.species, this);
376
377 if (toucher.takedamage == DAMAGE_AIM && !IS_DEAD(toucher))
378 {
379 // check to see if this person is already tagged by me
380 .entity weaponentity = this.weaponentity_fld;
381 entity tag = W_Seeker_Tagged_Info(this.realowner, weaponentity, toucher);
382
383 if (tag != NULL)
384 {
385 if (toucher.wps_tag_tracker && WEP_CVAR(WEP_SEEKER, type) == 1) // don't attach another waypointsprite without killing the old one first
386 WaypointSprite_Kill(toucher.wps_tag_tracker);
387 tag.tag_time = time;
388 }
389 else
390 {
391 //sprint(this.realowner, strcat("You just tagged ^2", toucher.netname, "^7 with a tracking device!\n"));
392 entity e = new(tag_tracker);
393 WarpZone_RefSys_Copy(toucher, this); // toucher is in the same reference as the tag, since the tag hit the toucher
394 e.weaponentity_fld = this.weaponentity_fld;
395 e.cnt = WEP_CVAR(WEP_SEEKER, missile_count);
396 e.owner = this.owner;
397 e.realowner = this.realowner;
399
400 if (WEP_CVAR(WEP_SEEKER, type) == 1)
401 {
402 e.tag_target = toucher;
403 e.tag_time = time;
405 }
406 else
407 {
408 e.enemy = toucher;
410 }
411
412 e.nextthink = time;
413 }
414
415 if (WEP_CVAR(WEP_SEEKER, type) == 1)
416 {
417 WaypointSprite_Spawn(WP_Seeker, WEP_CVAR(WEP_SEEKER, tag_tracker_lifetime), 0, toucher, '0 0 64', this.realowner, 0, toucher, wps_tag_tracker, true, RADARICON_TAGGED);
419 }
420 }
421
422 delete(this);
423 return;
424}
entity owner
Definition main.qh:87
void W_Seeker_Vollycontroller_Think(entity this)
Definition seeker.qc:307
entity W_Seeker_Tagged_Info(entity isowner,.entity weaponentity, entity istarget)
Definition seeker.qc:272
void W_Seeker_Tracker_Think(entity this)
Definition seeker.qc:330
entity wps_tag_tracker
Definition seeker.qh:123
const int DAMAGE_AIM
Definition subs.qh:81
void WaypointSprite_Kill(entity wp)
entity WaypointSprite_Spawn(entity spr, float _lifetime, float maxdistance, entity ref, vector ofs, entity showto, float t, entity own,.entity ownfield, float hideable, entity icon)
void WaypointSprite_UpdateRule(entity e, float t, float r)
const int SPRITERULE_DEFAULT

References DAMAGE_AIM, Damage_DamageInfo(), entity(), func_null(), g_seeker_trackers, HITTYPE_BOUNCE, HITTYPE_SECONDARY, IL_PUSH(), IS_DEAD, NULL, origin, owner, PROJECTILE_TOUCH, realowner, setthink, SPRITERULE_DEFAULT, time, toucher, velocity, W_Seeker_Tagged_Info(), W_Seeker_Tracker_Think(), W_Seeker_Vollycontroller_Think(), WarpZone_RefSys_Copy(), WaypointSprite_Kill(), WaypointSprite_Spawn(), WaypointSprite_UpdateRule(), weaponentity_fld, WEP_CVAR, and wps_tag_tracker.

Referenced by W_Seeker_Fire_Tag().

◆ W_Seeker_Tagged_Info()

entity W_Seeker_Tagged_Info ( entity isowner,
.entity weaponentity,
entity istarget )

Definition at line 272 of file seeker.qc.

273{
274 IL_EACH(g_seeker_trackers, it.classname == "tag_tracker" && it.realowner == isowner,
275 {
276 if (it.tag_target == istarget && it.weaponentity_fld == weaponentity)
277 return it;
278 });
279
280 return NULL;
281}

References entity(), g_seeker_trackers, IL_EACH, and NULL.

Referenced by W_Seeker_Tag_Touch().

◆ W_Seeker_Tracker_Think()

void W_Seeker_Tracker_Think ( entity this)

Definition at line 330 of file seeker.qc.

331{
332 .entity weaponentity = this.weaponentity_fld;
333 // commit suicide if: You die OR target dies OR you switch away from the seeker OR commit suicide if lifetime is up
334 if (IS_DEAD(this.realowner) || IS_DEAD(this.tag_target) || this.realowner.(weaponentity).m_switchweapon != WEP_SEEKER
335 || (time > this.tag_time + WEP_CVAR(WEP_SEEKER, tag_tracker_lifetime)))
336 {
337 if (this)
338 {
339 WaypointSprite_Kill(this.tag_target.wps_tag_tracker);
340 delete(this);
341 }
342 return;
343 }
344
345 // Update the think method information
346 this.nextthink = time;
347}
entity tag_target
Definition seeker.qh:123

References entity(), IS_DEAD, nextthink, realowner, tag_target, time, WaypointSprite_Kill(), weaponentity_fld, and WEP_CVAR.

Referenced by W_Seeker_Tag_Touch().

◆ W_Seeker_Vollycontroller_Think()

void W_Seeker_Vollycontroller_Think ( entity this)

Definition at line 307 of file seeker.qc.

308{
309 --this.cnt;
310
311 Weapon thiswep = WEP_SEEKER;
312 .entity weaponentity = this.weaponentity_fld;
313 if ((!(this.realowner.items & IT_UNLIMITED_AMMO) && GetResource(this.realowner, thiswep.ammo_type) < WEP_CVAR(WEP_SEEKER, missile_ammo))
314 || this.cnt <= -1 || IS_DEAD(this.realowner) || this.realowner.(weaponentity).m_switchweapon != thiswep)
315 {
316 delete(this);
317 return;
318 }
319
320 this.nextthink = time + WEP_CVAR(WEP_SEEKER, missile_delay) * W_WeaponRateFactor(this.realowner);
321
322 entity own = this.realowner;
323
324 entity oldenemy = own.enemy;
325 own.enemy = this.enemy;
326 W_Seeker_Fire_Missile(thiswep, own, weaponentity, own.enemy, own.cnt);
327 own.enemy = oldenemy;
328}
fields which are explicitly/manually set are marked with "M", fields set automatically are marked wit...
Definition weapon.qh:42
Resource ammo_type
M: ammotype : main ammo type.
Definition weapon.qh:56
const int IT_UNLIMITED_AMMO
Definition item.qh:23
float W_WeaponRateFactor(entity this)

References Weapon::ammo_type, cnt, enemy, entity(), GetResource(), IS_DEAD, IT_UNLIMITED_AMMO, nextthink, realowner, time, W_Seeker_Fire_Missile(), W_WeaponRateFactor(), weaponentity_fld, and WEP_CVAR.

Referenced by W_Seeker_Tag_Touch().