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, vector f_diff, entity m_target)
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 325 of file seeker.qc.

326{
327 entity closest_target = NULL;
328
329 IL_EACH(g_seeker_trackers, it.classname == "tag_tracker" && it.realowner == actor,
330 {
331 if (closest_target)
332 {
333 if (vlen2(actor.origin - it.tag_target.origin) < vlen2(actor.origin - closest_target.origin))
334 closest_target = it.tag_target;
335 }
336 else
337 closest_target = it.tag_target;
338 });
339
340 if (closest_target)
341 {
342 traceline(actor.origin + actor.view_ofs, closest_target.origin, MOVE_NOMONSTERS, actor);
343 if (!closest_target || (trace_fraction < 1 && trace_ent != closest_target))
344 closest_target = NULL;
345 }
346
347 W_Seeker_Fire_Missile(thiswep, actor, weaponentity, '0 0 0', closest_target);
348}
var entity(vector mins, vector maxs,.entity tofield) findbox_tofield_OrFallback
const float MOVE_NOMONSTERS
entity trace_ent
float trace_fraction
#define IL_EACH(this, cond, body)
#define NULL
Definition post.qh:14
void W_Seeker_Fire_Missile(Weapon thiswep, entity actor,.entity weaponentity, vector f_diff, entity m_target)
Definition seeker.qc:165
IntrusiveList g_seeker_trackers
Definition seeker.qh:126

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

◆ W_Seeker_Fire_Flac()

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

Definition at line 253 of file seeker.qc.

254{
255 W_DecreaseAmmo(thiswep, actor, WEP_CVAR(WEP_SEEKER, flac_ammo), weaponentity);
256
257 vector f_diff;
258 switch (actor.(weaponentity).bulletcounter % 4)
259 {
260 case 0:
261 f_diff = '-1.25 -3.75 0';
262 break;
263 case 1:
264 f_diff = '+1.25 -3.75 0';
265 break;
266 case 2:
267 f_diff = '-1.25 +3.75 0';
268 break;
269 case 3:
270 default:
271 f_diff = '+1.25 +3.75 0';
272 break;
273 }
274 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);
275 w_shotorg += f_diff;
276
277 // uses hagar effects!
278 W_MuzzleFlash(WEP_HAGAR, actor, weaponentity, w_shotorg, w_shotdir);
279
280 entity missile;
281 missile = new(missile);
282 missile.owner = missile.realowner = actor;
283 missile.bot_dodge = true;
284 missile.bot_dodgerating = WEP_CVAR(WEP_SEEKER, flac_damage);
286 missile.use = W_Seeker_Flac_Explode_use;
288 missile.nextthink = time + WEP_CVAR(WEP_SEEKER, flac_lifetime) + WEP_CVAR(WEP_SEEKER, flac_lifetime_rand);
289 set_movetype(missile, MOVETYPE_FLY);
290 missile.projectiledeathtype = thiswep.m_id | HITTYPE_SECONDARY;
291 missile.weaponentity_fld = weaponentity;
292 missile.flags = FL_PROJECTILE;
293 IL_PUSH(g_projectiles, missile);
294 IL_PUSH(g_bot_dodge, missile);
295 missile.missile_flags = MIF_SPLASH;
296
297 // csqc projectiles
298 //missile.angles = vectoangles(missile.velocity);
299 //missile.scale = 0.4; // BUG: the model is too big
300
301 PROJECTILE_MAKETRIGGER(missile);
302 setorigin(missile, w_shotorg);
303 setsize(missile, '-2 -2 -2', '2 2 2');
304
305 W_SetupProjVelocity_UP_PRE(missile, WEP_SEEKER, flac_);
306 CSQCProjectile(missile, true, PROJECTILE_FLAC, true);
307
308 MUTATOR_CALLHOOK(EditProjectile, actor, missile);
309}
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:76
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.
void set_movetype(entity this, int mt)
Definition movetypes.qc:4
const int MOVETYPE_FLY
Definition movetypes.qh:138
const int PROJECTILE_FLAC
void W_Seeker_Flac_Explode_use(entity this, entity actor, entity trigger)
Definition seeker.qc:248
void W_Seeker_Flac_Touch(entity this, entity toucher)
Definition seeker.qc:241
#define setthink(e, f)
vector
Definition self.qh:96
#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:46
IntrusiveList g_projectiles
Definition common.qh:58
#define PROJECTILE_MAKETRIGGER(e)
Definition common.qh:34
const int CH_WEAPON_A
Definition sound.qh:7
vector w_shotdir
Definition tracing.qh:20
#define W_SetupProjVelocity_UP_PRE(ent, wep, prefix)
Definition tracing.qh:52
#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, MOVETYPE_FLY, MUTATOR_CALLHOOK, PROJECTILE_FLAC, PROJECTILE_MAKETRIGGER, 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_ProjectileSize, w_shotdir, w_shotorg, and WEP_CVAR.

◆ W_Seeker_Fire_Missile()

void W_Seeker_Fire_Missile ( Weapon thiswep,
entity actor,
.entity weaponentity,
vector f_diff,
entity m_target )

Definition at line 165 of file seeker.qc.

166{
167 W_DecreaseAmmo(thiswep, actor, WEP_CVAR(WEP_SEEKER, missile_ammo), weaponentity);
168
169 makevectors(actor.v_angle);
170 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));
171 w_shotorg += f_diff;
172 W_MuzzleFlash(thiswep, actor, weaponentity, w_shotorg, w_shotdir);
173
174 //actor.detornator = false;
175
176 entity missile = new(seeker_missile);
177 missile.owner = missile.realowner = actor;
178 missile.bot_dodge = true;
179 missile.bot_dodgerating = WEP_CVAR(WEP_SEEKER, missile_damage);
180
183 missile.event_damage = W_Seeker_Missile_Damage;
184 missile.nextthink = time; // + 0.2; // + cvar("g_balance_seeker_missile_activate_delay");
185 missile.cnt = time + WEP_CVAR(WEP_SEEKER, missile_lifetime);
186 missile.enemy = m_target;
187 missile.scale = 2;
188 missile.takedamage = DAMAGE_YES;
189 missile.weaponentity_fld = weaponentity;
190 SetResourceExplicit(missile, RES_HEALTH, WEP_CVAR(WEP_SEEKER, missile_health));
191 missile.damageforcescale = WEP_CVAR(WEP_SEEKER, missile_damageforcescale);
192 missile.damagedbycontents = true;
194 //missile.think = W_Seeker_Missile_Animate; // csqc projectiles.
195
196 if (missile.enemy != NULL)
197 missile.projectiledeathtype = thiswep.m_id | HITTYPE_SECONDARY;
198 else
199 missile.projectiledeathtype = thiswep.m_id;
200
201 PROJECTILE_MAKETRIGGER(missile);
202 setorigin(missile, w_shotorg);
203 setsize(missile, '-4 -4 -4', '4 4 4');
205 missile.flags = FL_PROJECTILE;
206 IL_PUSH(g_projectiles, missile);
207 IL_PUSH(g_bot_dodge, missile);
208 missile.missile_flags = MIF_SPLASH | MIF_GUIDED_TAG;
209
210 W_SetupProjVelocity_UP_PRE(missile, WEP_SEEKER, missile_);
211
212 missile.angles = vectoangles(missile.velocity);
213
214 CSQCProjectile(missile, false, PROJECTILE_SEEKER, true);
215
216 MUTATOR_CALLHOOK(EditProjectile, actor, missile);
217}
IntrusiveList g_damagedbycontents
Definition damage.qh:143
SetResourceExplicit(ent, RES_ARMOR, ReadByte() *DEC_FACTOR)) ENTCS_PROP(NAME
vector vectoangles(vector v)
const int MOVETYPE_FLYMISSILE
Definition movetypes.qh:142
#define makevectors
Definition post.qh:21
const int PROJECTILE_SEEKER
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:126
const int MIF_GUIDED_TAG
Definition common.qh:53
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, MOVETYPE_FLYMISSILE, MUTATOR_CALLHOOK, NULL, PROJECTILE_MAKETRIGGER, PROJECTILE_SEEKER, 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_ProjectileSize, w_shotdir, w_shotorg, 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 491 of file seeker.qc.

492{
493 W_DecreaseAmmo(thiswep, actor, WEP_CVAR(WEP_SEEKER, tag_ammo), weaponentity);
494
495 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);
496
497 entity missile = new(seeker_tag);
498 missile.weaponentity_fld = weaponentity;
499 missile.owner = missile.realowner = actor;
500 missile.bot_dodge = true;
501 missile.bot_dodgerating = 50;
503 setthink(missile, SUB_Remove);
504 missile.nextthink = time + WEP_CVAR(WEP_SEEKER, tag_lifetime);
505 set_movetype(missile, MOVETYPE_FLY);
506
507 missile.takedamage = DAMAGE_YES;
508 missile.event_damage = W_Seeker_Tag_Damage;
509 SetResourceExplicit(missile, RES_HEALTH, WEP_CVAR(WEP_SEEKER, tag_health));
510 missile.damageforcescale = WEP_CVAR(WEP_SEEKER, tag_damageforcescale);
511
512 PROJECTILE_MAKETRIGGER(missile);
513 setorigin(missile, w_shotorg);
514 setsize(missile, '-2 -2 -2', '2 2 2');
515
516 missile.flags = FL_PROJECTILE;
517 IL_PUSH(g_projectiles, missile);
518 IL_PUSH(g_bot_dodge, missile);
519 //missile.missile_flags = MIF_..?;
520
521 set_movetype(missile, MOVETYPE_FLY);
522 W_SetupProjVelocity_PRE(missile, WEP_SEEKER, tag_);
523 missile.angles = vectoangles(missile.velocity);
524
525 CSQCProjectile(missile, true, PROJECTILE_TAG, false); // has sound
526
527 MUTATOR_CALLHOOK(EditProjectile, actor, missile);
528}
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_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:421
void W_Seeker_Tag_Touch(entity this, entity toucher)
Definition seeker.qc:430
#define W_SetupProjVelocity_PRE(ent, wep, prefix)
Definition tracing.qh:65

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_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, and WEP_CVAR.

◆ W_Seeker_Flac_Explode()

void W_Seeker_Flac_Explode ( entity this,
entity directhitentity )

Definition at line 222 of file seeker.qc.

223{
224 this.event_damage = func_null;
225
226 RadiusDamage(this, this.realowner,
227 WEP_CVAR(WEP_SEEKER, flac_damage),
228 WEP_CVAR(WEP_SEEKER, flac_edgedamage),
229 WEP_CVAR(WEP_SEEKER, flac_radius),
230 NULL,
231 NULL,
232 WEP_CVAR(WEP_SEEKER, flac_force),
234 this.weaponentity_fld,
235 directhitentity
236 );
237
238 delete(this);
239}
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:934
var void func_null()
int projectiledeathtype
Definition common.qh:21
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 248 of file seeker.qc.

249{
250 W_Seeker_Flac_Explode(this, trigger);
251}
void W_Seeker_Flac_Explode(entity this, entity directhitentity)
Definition seeker.qc:222

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 241 of file seeker.qc.

242{
244
246}
entity entity toucher
Definition self.qh:76
#define PROJECTILE_TOUCH(e, t)
Definition common.qh:28

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 126 of file seeker.qc.

127{
128 if (GetResource(this, RES_HEALTH) <= 0)
129 return;
130 if (!W_CheckProjectileDamage(inflictor.realowner, this.realowner, deathtype, -1)) // no exceptions
131 return; // g_projectiles_damage says to halt
132
133 if (this.realowner == attacker)
134 TakeResource(this, RES_HEALTH, (damage * 0.25));
135 else
136 TakeResource(this, RES_HEALTH, damage);
137
138 if (GetResource(this, RES_HEALTH) <= 0)
140}
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 spd = vlen(this.velocity);
47 spd = bound(
48 spd - WEP_CVAR(WEP_SEEKER, missile_decel) * frametime,
49 WEP_CVAR(WEP_SEEKER, missile_speed_max),
50 spd + WEP_CVAR(WEP_SEEKER, missile_accel) * frametime
51 );
52
53 if (this.enemy != NULL
54 && (this.enemy.takedamage != DAMAGE_AIM || IS_DEAD(this.enemy)))
55 this.enemy = NULL;
56
57 float dist;
58 if (this.enemy != NULL)
59 {
60 vector eorg = 0.5 * (this.enemy.absmin + this.enemy.absmax);
61 vector desireddir = normalize(eorg - this.origin);
62 vector olddir = normalize(this.velocity); // get my current direction
63 dist = vlen(eorg - this.origin);
64
65 // Do evasive maneuvers for world objects? ( this should be a cpu hog. :P )
66 if (WEP_CVAR(WEP_SEEKER, missile_smart) && dist > WEP_CVAR(WEP_SEEKER, missile_smart_mindist))
67 {
68 // Is it a better idea (shorter distance) to trace to the target itself?
69 if (vdist(this.origin + olddir * this.wait, <, dist))
70 traceline(this.origin, this.origin + olddir * this.wait, false, this);
71 else
72 traceline(this.origin, eorg, false, this);
73
74 // Setup adaptive tracelength
75 this.wait = bound(WEP_CVAR(WEP_SEEKER, missile_smart_trace_min), vlen(this.origin - trace_endpos), WEP_CVAR(WEP_SEEKER, missile_smart_trace_max));
76
77 // Calc how important it is that we turn and add this to the desierd (enemy) dir.
78 desireddir = normalize(((trace_plane_normal * (1 - trace_fraction)) + (desireddir * trace_fraction)) * 0.5);
79 }
80
81 vector newdir = normalize(olddir + desireddir * WEP_CVAR(WEP_SEEKER, missile_turnrate)); // take the average of the 2 directions; not the best method but simple & easy
82 this.velocity = newdir * spd; // make me fly in the new direction at my flight speed
83 }
84 else
85 dist = 0;
86
87 // Proxy
88 if (WEP_CVAR(WEP_SEEKER, missile_proxy))
89 {
90 if (dist <= WEP_CVAR(WEP_SEEKER, missile_proxy_maxrange))
91 {
92 if (this.cvar_cl_autoswitch == 0)
93 this.cvar_cl_autoswitch = time + WEP_CVAR(WEP_SEEKER, missile_proxy_delay);
94 else
95 {
96 if (this.cvar_cl_autoswitch <= time)
97 {
99 this.cvar_cl_autoswitch = 0;
100 }
101 }
102 }
103 else
104 {
105 if (this.cvar_cl_autoswitch != 0)
106 this.cvar_cl_autoswitch = 0;
107 }
108 }
110
111 if (IS_DEAD(this.enemy))
112 {
113 this.enemy = NULL;
114 this.cnt = time + 1 + (random() * 4);
115 this.nextthink = this.cnt;
116 return;
117 }
118
119 //this.angles = vectoangles(this.velocity); // turn model in the new flight direction
120 this.nextthink = time;// + 0.05; // csqc projectiles
122}
float cnt
Definition powerups.qc:24
float wait
Definition items.qc:17
#define IS_DEAD(s)
Definition player.qh:244
float frametime
vector velocity
vector trace_endpos
float nextthink
vector origin
vector trace_plane_normal
void UpdateCSQCProjectile(entity e)
const int HITTYPE_SPLASH
automatically set by RadiusDamage
Definition all.qh:32
float bound(float min, float value, float max)
float random(void)
float vlen(vector v)
vector normalize(vector v)
const int DAMAGE_AIM
Definition subs.qh:81
entity enemy
Definition sv_ctf.qh:152
#define vdist(v, cmp, f)
Vector distance comparison, avoids sqrt().
Definition vector.qh:8

References bound(), cnt, DAMAGE_AIM, enemy, entity(), frametime, HITTYPE_SPLASH, IS_DEAD, nextthink, normalize(), NULL, origin, projectiledeathtype, random(), time, trace_endpos, trace_fraction, trace_plane_normal, UpdateCSQCProjectile(), vdist, vector, velocity, vlen(), W_Seeker_Missile_Explode(), wait, 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 421 of file seeker.qc.

422{
423 if (GetResource(this, RES_HEALTH) <= 0)
424 return;
425 TakeResource(this, RES_HEALTH, damage);
426 if (GetResource(this, RES_HEALTH) <= 0)
428}
void W_Seeker_Tag_Explode(entity this)
Definition seeker.qc:412

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 412 of file seeker.qc.

413{
414 //if (other == this.realowner)
415 // return;
416 Damage_DamageInfo(this.origin, 0, 0, 0, this.velocity, WEP_SEEKER.m_id | HITTYPE_BOUNCE, 0, this);
417
418 delete(this);
419}
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 430 of file seeker.qc.

431{
433
434 vector dir;
435 dir = normalize(this.realowner.origin - this.origin);
436 vector org2 = findbetterlocation(this.origin, 8);
437
438 te_knightspike(org2);
439
440 this.event_damage = func_null;
441 Damage_DamageInfo(this.origin, 0, 0, 0, this.velocity, WEP_SEEKER.m_id | HITTYPE_BOUNCE | HITTYPE_SECONDARY, toucher.species, this);
442
443 if (toucher.takedamage == DAMAGE_AIM && !IS_DEAD(toucher))
444 {
445 // check to see if this person is already tagged by me
446 .entity weaponentity = this.weaponentity_fld;
447 entity tag = W_Seeker_Tagged_Info(this.realowner, weaponentity, toucher);
448
449 if (tag != NULL)
450 {
451 if (toucher.wps_tag_tracker && WEP_CVAR(WEP_SEEKER, type) == 1) // don't attach another waypointsprite without killing the old one first
452 WaypointSprite_Kill(toucher.wps_tag_tracker);
453 tag.tag_time = time;
454 }
455 else
456 {
457 //sprint(this.realowner, strcat("You just tagged ^2", toucher.netname, "^7 with a tracking device!\n"));
458 entity e = new(tag_tracker);
459 e.weaponentity_fld = this.weaponentity_fld;
460 e.cnt = WEP_CVAR(WEP_SEEKER, missile_count);
461 e.owner = this.owner;
462 e.realowner = this.realowner;
464
465 if (WEP_CVAR(WEP_SEEKER, type) == 1)
466 {
467 e.tag_target = toucher;
468 e.tag_time = time;
470 }
471 else
472 {
473 e.enemy = toucher;
475 }
476
477 e.nextthink = time;
478 }
479
480 if (WEP_CVAR(WEP_SEEKER, type) == 1)
481 {
482 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);
484 }
485 }
486
487 delete(this);
488 return;
489}
entity owner
Definition main.qh:87
vector findbetterlocation(vector org, float mindist)
Definition util.qc:116
void W_Seeker_Vollycontroller_Think(entity this)
Definition seeker.qc:350
entity W_Seeker_Tagged_Info(entity isowner,.entity weaponentity, entity istarget)
Definition seeker.qc:314
void W_Seeker_Tracker_Think(entity this)
Definition seeker.qc:390
entity wps_tag_tracker
Definition seeker.qh:123
int dir
Definition impulse.qc:89
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(), dir, entity(), findbetterlocation(), func_null(), g_seeker_trackers, HITTYPE_BOUNCE, HITTYPE_SECONDARY, IL_PUSH(), IS_DEAD, normalize(), NULL, origin, owner, PROJECTILE_TOUCH, realowner, setthink, SPRITERULE_DEFAULT, time, toucher, vector, velocity, W_Seeker_Tagged_Info(), W_Seeker_Tracker_Think(), W_Seeker_Vollycontroller_Think(), 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 314 of file seeker.qc.

315{
316 IL_EACH(g_seeker_trackers, it.classname == "tag_tracker" && it.realowner == isowner,
317 {
318 if (it.tag_target == istarget && it.weaponentity_fld == weaponentity)
319 return it;
320 });
321
322 return NULL;
323}

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 390 of file seeker.qc.

391{
392 .entity weaponentity = this.weaponentity_fld;
393 // commit suicide if: You die OR target dies OR you switch away from the seeker OR commit suicide if lifetime is up
394 if (IS_DEAD(this.realowner) || IS_DEAD(this.tag_target) || this.realowner.(weaponentity).m_switchweapon != WEP_SEEKER
395 || (time > this.tag_time + WEP_CVAR(WEP_SEEKER, tag_tracker_lifetime)))
396 {
397 if (this)
398 {
399 WaypointSprite_Kill(this.tag_target.wps_tag_tracker);
400 delete(this);
401 }
402 return;
403 }
404
405 // Update the think method information
406 this.nextthink = time;
407}
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 350 of file seeker.qc.

351{
352 --this.cnt;
353
354 Weapon thiswep = WEP_SEEKER;
355 .entity weaponentity = this.weaponentity_fld;
356 if ((!(this.realowner.items & IT_UNLIMITED_AMMO) && GetResource(this.realowner, thiswep.ammo_type) < WEP_CVAR(WEP_SEEKER, missile_ammo))
357 || this.cnt <= -1 || IS_DEAD(this.realowner) || this.realowner.(weaponentity).m_switchweapon != thiswep)
358 {
359 delete(this);
360 return;
361 }
362
363 this.nextthink = time + WEP_CVAR(WEP_SEEKER, missile_delay) * W_WeaponRateFactor(this.realowner);
364
365 entity own = this.realowner;
366
367 entity oldenemy = own.enemy;
368 own.enemy = this.enemy;
369
370 switch (own.cnt % 4)
371 {
372 case 0:
373 W_Seeker_Fire_Missile(thiswep, own, weaponentity, '-1.25 -3.75 0', own.enemy); // TODO
374 break;
375 case 1:
376 W_Seeker_Fire_Missile(thiswep, own, weaponentity, '+1.25 -3.75 0', own.enemy); // TODO
377 break;
378 case 2:
379 W_Seeker_Fire_Missile(thiswep, own, weaponentity, '-1.25 +3.75 0', own.enemy); // TODO
380 break;
381 case 3:
382 default:
383 W_Seeker_Fire_Missile(thiswep, own, weaponentity, '+1.25 +3.75 0', own.enemy); // TODO
384 break;
385 }
386
387 own.enemy = oldenemy;
388}
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().