Xonotic QuakeC
The free, fast arena FPS with crisp movement and a wide array of weapons
sv_buffs.qc
Go to the documentation of this file.
1#include "sv_buffs.qh"
2
7
8#include "buff/_mod.qh"
9
11{
12 entity player = WaypointSprite_getviewentity(client);
13 entity myowner = this.owner;
14 entity heldbuff = buff_FirstFromFlags(myowner);
15
16 if (!heldbuff)
17 return false;
18
19 if (myowner.alpha <= 0.5 && myowner.alpha != 0 && DIFF_TEAM(player, myowner))
20 return false;
21
22 if (MUTATOR_CALLHOOK(BuffModel_Customize, this, player))
23 return false;
24
25 if (player == myowner)
26 {
27 // somewhat hide the model, but keep the glow
28 this.effects = 0;
29 this.alpha = -1;
30 }
31 else
32 {
34 this.alpha = myowner.alpha;
35 }
36 return true;
37}
38
40{
41 this.nextthink = time;
42 entity player = this.owner;
43 if (player.alpha < 0 || player.buff_model != this)
44 {
45 if (player) // remnant from ChatBubbleThink, same question... WHY?!
46 player.buff_model = NULL;
47 delete(this);
48 return;
49 }
50
51 entity heldbuff = buff_FirstFromFlags(player);
52
53 if (!heldbuff)
54 {
55 this.effects = EF_NODRAW;
56 return;
57 }
58
59 this.color = heldbuff.m_color;
60 this.glowmod = heldbuff.m_color;
61 this.skin = heldbuff.m_skin;
62
63 this.effects = player.effects;
65 this.effects &= EFMASK_CHEAP; // eat performance
66
67 this.alpha = player.alpha;
68}
69
71{
72 if (player.buff_model)
73 delete(player.buff_model);
74 player.buff_model = NULL;
75}
76
78{
79 player.buff_model = new(buff_model);
80 setmodel(player.buff_model, MDL_BUFF);
81 setsize(player.buff_model, '0 0 -40', '0 0 40');
82 setattachment(player.buff_model, player, "");
83 setorigin(player.buff_model, '0 0 1' * (player.buff_model.maxs.z * 1));
84 player.buff_model.owner = player;
85 player.buff_model.exteriormodeltoclient = player;
86 player.buff_model.scale = 0.7;
87 player.buff_model.pflags = PFLAGS_FULLDYNAMIC;
88 player.buff_model.light_lev = 200;
89 setthink(player.buff_model, buffs_BuffModel_Think);
90 player.buff_model.nextthink = time;
91 setcefc(player.buff_model, buffs_BuffModel_Customize);
92}
93
95{
96 if (this.alpha < 0)
97 return;
98 // spawn a buff model entity if needed
99 if (!this.buff_model)
101}
102
103void buff_Effect(entity player, string eff)
104{
106 return;
107
108 if (time >= player.buff_effect_delay)
109 {
110 Send_Effect_(eff, player.origin + (player.mins + player.maxs) * 0.5, '0 0 0', 1);
111 player.buff_effect_delay = time + 0.05; // prevent spam
112 }
113}
114
115// buff item
117{
118 if (!this.owner.buff_active && !this.owner.buff_activetime || !this.owner.buffdef)
119 return false;
120
121 entity heldbuff = buff_FirstFromFlags(view); // TODO: cache this information so it isn't performing a loop every frame
122 if (heldbuff)
123 return CS_CVAR(view).cvar_cl_buffs_autoreplace == false || heldbuff != this.owner.buffdef;
124
125 return WaypointSprite_visible_for_player(this, player, view);
126}
127
129{
131 return;
132
133 entity buff = e.buffdef;
134 entity wp = WaypointSprite_Spawn(WP_Buff, 0, autocvar_g_buffs_waypoint_distance, e, '0 0 1' * e.maxs.z, NULL, e.team_forced, e, buff_waypoint, true, RADARICON_Buff);
135 wp.wp_extra = buff.m_id;
136 WaypointSprite_UpdateTeamRadar(e.buff_waypoint, RADARICON_Buff, e.glowmod);
137 e.buff_waypoint.waypointsprite_visible_for_player = buff_Waypoint_visible_for_player;
138}
139
140void buff_SetCooldown(entity this, float cd)
141{
142 cd = max(0, cd);
143
144 if (!this.buff_waypoint)
146 if (this.buff_waypoint)
148
149 this.buff_activetime = cd;
150 this.buff_active = !cd;
151}
152
154{
155 if (game_stopped)
156 return;
157
158 vector oldbufforigin = this.origin;
159 this.velocity = '0 0 200';
160
163 {
164 entity spot = SelectSpawnPoint(this, true);
165 setorigin(this, spot.origin);
166 this.velocity = (randomvec() * 100) + '0 0 200';
167 this.angles = spot.angles;
168 }
169
170 tracebox(this.origin, this.mins * 1.5, this.maxs * 1.5, this.origin, MOVE_NOMONSTERS, this);
171
172 setorigin(this, trace_endpos); // attempt to unstick
173
175
176 makevectors(this.angles);
177 this.angles = '0 0 0';
180
181 Send_Effect(EFFECT_ELECTRO_COMBO, oldbufforigin + ((this.mins + this.maxs) * 0.5), '0 0 0', 1);
182 Send_Effect(EFFECT_ELECTRO_COMBO, CENTER_OR_VIEWOFS(this), '0 0 0', 1);
183
185
186 sound(this, CH_TRIGGER, SND_KA_RESPAWN, VOL_BASE, ATTEN_NONE); // ATTEN_NONE (it's a sound intended to be heard anywhere)
187}
188
190{
191 if (game_stopped)
192 return;
193
195 {
196 buff_Respawn(this);
197 return;
198 }
199
200 if (!this.buff_active)
201 return;
202
203 if (MUTATOR_CALLHOOK(BuffTouch, this, toucher))
204 return;
205 toucher = M_ARGV(1, entity);
206
207 if (!IS_PLAYER(toucher))
208 return; // incase mutator changed toucher
209
210 if ((this.team_forced && toucher.team != this.team_forced)
211 || toucher.vehicle
212 || !this.buffdef // TODO: error out or maybe reset type if this occurs?
213 || time < toucher.buff_shield)
214 // can't touch this
215 return;
216
217 entity thebuff = this.buffdef;
219 int removal_type = STATUSEFFECT_REMOVE_NORMAL;
220
221 if (heldbuff)
222 {
223 if (CS_CVAR(toucher).cvar_cl_buffs_autoreplace && heldbuff != thebuff)
224 {
225 int buffid = heldbuff.m_id;
226 Send_Notification(NOTIF_ONE, toucher, MSG_INFO, INFO_ITEM_BUFF_LOST, toucher.netname, buffid);
228 Send_Notification(NOTIF_ALL_EXCEPT, toucher, MSG_INFO, INFO_ITEM_BUFF_LOST, toucher.netname, buffid);
229 //sound(toucher, CH_TRIGGER, SND_BUFF_LOST, VOL_BASE, ATTN_NORM);
230 removal_type = STATUSEFFECT_REMOVE_CLEAR;
231 }
232 else
233 return; // do nothing
234 }
235
236 this.owner = toucher;
237 this.buff_active = false;
238 this.lifetime = 0;
239 Send_Notification(NOTIF_ONE, toucher, MSG_MULTI, ITEM_BUFF_GOT, thebuff.m_id);
241 Send_Notification(NOTIF_ALL_EXCEPT, toucher, MSG_INFO, INFO_ITEM_BUFF, toucher.netname, thebuff.m_id);
242
243 Send_Effect(EFFECT_ITEM_PICKUP, CENTER_OR_VIEWOFS(this), '0 0 0', 1);
244 sound(toucher, CH_TRIGGER, SND_SHIELD_RESPAWN, VOL_BASE, ATTN_NORM);
245 float bufftime = (this.buffs_finished) ? this.buffs_finished : thebuff.m_time(thebuff);
246
247 buff_RemoveAll(toucher, removal_type); // remove previous buffs so that a new one may be added
248 if (!bufftime)
249 bufftime = 999;
250 StatusEffects_apply(thebuff, toucher, time + bufftime, 0);
251}
252
254{
255 if (!buff)
256 return false;
257 if (buff == BUFF_AMMO && ((start_items & IT_UNLIMITED_AMMO) || cvar("g_melee_only")))
258 return false;
259 if (buff == BUFF_VAMPIRE && cvar("g_vampire"))
260 return false;
261 return cvar(strcat("g_buffs_", buff.netname));
262}
263
265
267{
269 FOREACH(StatusEffects, it.instanceOfBuff && buff_Available(it),
270 {
271 // if it's already been chosen, give it a lower priority
272 float myseencount = (it.buff_seencount > 0) ? it.buff_seencount : 1; // no division by zero please!
273 RandomSelection_AddEnt(it, max(0.2, 1 / myseencount), 1);
274 });
276 if (!newbuff)
277 return;
278 ++newbuff.buff_seencount; // lower chances of seeing this buff again soon
279 ent.buffdef = newbuff;
280}
281
282void buff_RemoveAll(entity actor, int removal_type)
283{
284 if (!actor.statuseffects)
285 return;
286 FOREACH(StatusEffects, it.instanceOfBuff, it.m_remove(it, actor, removal_type));
287}
288
290{
291 if (!actor.statuseffects)
292 return NULL;
293 FOREACH(StatusEffects, it.instanceOfBuff && it.m_active(it, actor), return it);
294 return NULL;
295}
296
298{
301
302 if (this.buffdef != this.oldbuffs)
303 {
304 entity buff = this.buffdef;
305 this.color = buff.m_color;
306 this.glowmod = buff.m_color;
307 this.skin = buff.m_skin;
308
309 setmodel(this, MDL_BUFF);
310 setsize(this, ITEM_D_MINS, ITEM_L_MAXS);
311
312 if (this.buff_waypoint)
313 {
314 //WaypointSprite_Disown(this.buff_waypoint, 1);
317 if (this.buff_activetime)
319 }
320
321 this.oldbuffs = this.buffdef;
322 }
323
324 if (!game_stopped
327 {
329 this.buff_activetime_updated = true;
330 }
331
332 if (!this.buff_active && !this.buff_activetime)
333 if (!this.owner || STAT(FROZEN, this.owner) || IS_DEAD(this.owner)
334 || !this.owner.iscreature || this.owner.vehicle
335 || this.pickup_anyway > 0 || (this.pickup_anyway >= 0 && autocvar_g_buffs_pickup_anyway)
336 || this.buffdef != buff_FirstFromFlags(this.owner))
337 {
339 this.owner = NULL;
340 if (autocvar_g_buffs_randomize & (teamplay ? 2 : 1))
341 buff_NewType(this);
342
344 buff_Respawn(this);
345 }
346
347 if (this.buff_activetime
348 && !game_stopped
350 {
352
353 if (!this.buff_activetime)
354 {
355 this.buff_active = true;
356 sound(this, CH_TRIGGER, SND_STRENGTH_RESPAWN, VOL_BASE, ATTN_NORM);
357 Send_Effect(EFFECT_ITEM_RESPAWN, CENTER_OR_VIEWOFS(this), '0 0 0', 1);
358 }
359 }
360
361 if (this.buff_active)
362 {
363 if (this.team_forced && !this.buff_waypoint)
365
366 if (this.lifetime && time >= this.lifetime)
367 buff_Respawn(this);
368 }
369
370 this.nextthink = time;
371 //this.angles.y = time * 110.1;
372}
373
375{
376 if (this.targetname != "" && !(this.spawnflags & 16)) // q3compat
377 {
378 // buffs have no equivalent of Item_Show(this, -1)
379 this.effects = EF_NODRAW;
380 this.solid = SOLID_NOT; // u can't touch this
381 setorigin(this, this.origin); // unlink from the area grid
382 this.nextthink = 0;
383 if (this.buff_waypoint)
385 return;
386 }
387
388 if (autocvar_g_buffs_randomize & (teamplay ? 2 : 1))
389 buff_NewType(this);
390 this.owner = NULL;
393 if (this.buff_activetime)
395 this.buff_activetime_updated = false;
396
398 buff_Respawn(this);
399}
400
401bool buff_Customize(entity this, entity client)
402{
403 entity player = WaypointSprite_getviewentity(client);
404 if ((!this.buff_active || !this.buffdef) || (this.team_forced && player.team != this.team_forced))
405 {
406 this.alpha = 0.3;
407 if (this.effects & EF_FULLBRIGHT)
408 this.effects &= ~EF_FULLBRIGHT;
409 this.pflags = 0;
410 }
411 else
412 {
413 this.alpha = 1;
414 if (!(this.effects & EF_FULLBRIGHT))
415 this.effects |= EF_FULLBRIGHT;
416 this.light_lev = 220 + 36 * sin(time);
418 }
419 return true;
420}
421
423{
425 delete_fn(this);
426}
427
429{
430 if (!autocvar_g_buffs)
431 {
432 delete(this);
433 return;
434 }
435
436 entity buff = this.buffdef;
437
438 // item_buff_random provides a null type so force randomization in that case
439 // otherwise replace the buff type if it's unavailable and the option is enabled
440 if (!buff || (autocvar_g_buffs_replace_available && !buff_Available(buff)))
441 {
442 buff_NewType(this);
443 buff = this.buffdef;
444 }
445
446 // the buff type is still invalid or unavailable, simply delete the item
447 if (!buff || !buff_Available(buff))
448 {
449 delete(this);
450 return;
451 }
452
453 this.classname = "item_buff";
454 this.solid = SOLID_TRIGGER;
455 this.flags = FL_ITEM;
456 this.bot_pickup = true;
457 this.bot_pickupevalfunc = generic_pickupevalfunc;
458 this.bot_pickupbasevalue = 1000;
459 IL_PUSH(g_items, this);
460 setthink(this, buff_Think);
461 settouch(this, buff_Touch);
462 setmodel(this, MDL_BUFF);
463 setsize(this, ITEM_D_MINS, ITEM_L_MAXS);
464 this.reset = buff_Reset;
465 this.nextthink = time + 0.1;
466 this.gravity = 1;
468 this.scale = 1;
469 this.skin = buff.m_skin;
472 setcefc(this, buff_Customize);
473 //this.gravity = 100;
474 this.color = buff.m_color;
475 this.glowmod = buff.m_color;
477 this.buff_active = !this.buff_activetime;
479 this.dtor = buff_Delete;
480
481 if (!this.buffs_finished)
482 this.buffs_finished = this.count; // legacy support
483
484 if (this.spawnflags & 1)
485 this.noalign = true;
486 if (this.noalign)
487 set_movetype(this, MOVETYPE_NONE); // reset by random location
488
489 buff_Reset(this);
490}
491
492void buff_Init_Compat(entity ent, entity replacement)
493{
494 if (teamplay)
495 {
496 if (ent.spawnflags & 2)
497 ent.team_forced = NUM_TEAM_1;
498 else if (ent.spawnflags & 4)
499 ent.team_forced = NUM_TEAM_2;
500 }
501
502 ent.buffdef = replacement;
503
504 buff_Init(ent);
505}
506
508{
509 setorigin(ent, old.origin);
510 ent.angles = old.angles;
511 ent.noalign = ITEM_SHOULD_KEEP_POSITION(old);
512
513 buff_Init(ent);
514}
515
516METHOD(Buff, m_apply, void(StatusEffect this, entity actor, float eff_time, float eff_flags))
517{
518 if (IS_PLAYER(actor))
519 actor.effects |= EF_NOSHADOW; // does not play well with buff icon
520 SUPER(Buff).m_apply(this, actor, eff_time, eff_flags);
521}
522METHOD(Buff, m_remove, void(StatusEffect this, entity actor, int removal_type))
523{
524 bool was_active = actor.statuseffects && (actor.statuseffects.statuseffect_flags[this.m_id] & STATUSEFFECT_FLAG_ACTIVE);
525 if (was_active)
526 {
527 int buffid = this.m_id;
528 if (removal_type == STATUSEFFECT_REMOVE_TIMEOUT)
529 {
530 Send_Notification(NOTIF_ONE, actor, MSG_MULTI, ITEM_BUFF_DROP, buffid); // TODO: special timeout message?
531 sound(actor, CH_TRIGGER, SND_BUFF_LOST, VOL_BASE, ATTN_NORM);
532 }
533 else if (removal_type == STATUSEFFECT_REMOVE_NORMAL && !IS_INDEPENDENT_PLAYER(actor))
534 Send_Notification(NOTIF_ALL_EXCEPT, actor, MSG_INFO, INFO_ITEM_BUFF_LOST, actor.netname, buffid);
535 actor.buff_shield = time + max(0, autocvar_g_buffs_pickup_delay); // always put in a delay, even if small
536 }
537 if (IS_PLAYER(actor))
538 actor.effects &= ~EF_NOSHADOW;
539 SUPER(Buff).m_remove(this, actor, removal_type);
540}
541
542
543// mutator hooks
544MUTATOR_HOOKFUNCTION(buffs, Damage_Calculate)
545{
546 entity frag_attacker = M_ARGV(1, entity);
548 float frag_deathtype = M_ARGV(3, float);
549 float frag_damage = M_ARGV(4, float);
551
552 if (frag_deathtype == DEATH_BUFF_INFERNO.m_id
553 || frag_deathtype == DEATH_BUFF_VENGEANCE.m_id)
554 return; // no recurrence
555
556 if (StatusEffects_active(BUFF_RESISTANCE, frag_target))
558
559 if (StatusEffects_active(BUFF_MEDIC, frag_target)
560 && GetResource(frag_target, RES_HEALTH) - frag_damage <= 0
561 && !ITEM_DAMAGE_NEEDKILL(frag_deathtype)
562 && frag_attacker)
564
565 if (StatusEffects_active(BUFF_JUMP, frag_target))
567
568 if (StatusEffects_active(BUFF_VENGEANCE, frag_target)
569 && frag_attacker && frag_attacker != frag_target
570 && !ITEM_DAMAGE_NEEDKILL(frag_deathtype))
571 {
572 entity dmgent = new_pure(dmgent);
573
575 dmgent.enemy = frag_attacker;
576 dmgent.owner = frag_target;
578 dmgent.nextthink = time + 0.1;
579 }
580
581 if (StatusEffects_active(BUFF_BASH, frag_target))
583
584 if (StatusEffects_active(BUFF_BASH, frag_attacker))
586
587 if (StatusEffects_active(BUFF_DISABILITY, frag_attacker))
589
590 if (StatusEffects_active(BUFF_INFERNO, frag_target))
591 {
592 if (frag_deathtype == DEATH_FIRE.m_id)
593 frag_damage = 0;
594 if (frag_deathtype == DEATH_LAVA.m_id)
595 frag_damage *= 0.5; // TODO: cvarize?
596 }
597
598 if (frag_attacker != frag_target)
599 {
600 if (StatusEffects_active(BUFF_LUCK, frag_attacker))
602
603 if (StatusEffects_active(BUFF_INFERNO, frag_attacker))
604 {
606 Fire_AddDamage(frag_target, frag_attacker, buff_Inferno_CalculateDamage(frag_damage), btime, DEATH_BUFF_INFERNO.m_id);
607 }
608 }
609
610 M_ARGV(4, float) = frag_damage;
612}
613
615{
617 return;
618
619 entity player = M_ARGV(0, entity);
620
621 entity heldbuff = buff_FirstFromFlags(player);
622 if (heldbuff)
623 {
624 int buffid = heldbuff.m_id;
625 Send_Notification(NOTIF_ONE, player, MSG_MULTI, ITEM_BUFF_DROP, buffid);
626 if (!IS_INDEPENDENT_PLAYER(player))
627 Send_Notification(NOTIF_ALL_EXCEPT, player, MSG_INFO, INFO_ITEM_BUFF_LOST, player.netname, buffid);
628
630 player.buff_shield = time + max(0, autocvar_g_buffs_pickup_delay);
631 sound(player, CH_TRIGGER, SND_BUFF_LOST, VOL_BASE, ATTN_NORM);
632 return true;
633 }
634}
635
637{
639 return false;
640}
641MUTATOR_HOOKFUNCTION(buffs, MakePlayerObserver)
642{
643 entity player = M_ARGV(0, entity);
644 return buffs_RemovePlayer(player);
645}
647{
648 entity player = M_ARGV(0, entity);
649 return buffs_RemovePlayer(player);
650}
651
652MUTATOR_HOOKFUNCTION(buffs, FilterItem)
653{
654 if (autocvar_g_buffs < 0)
655 return false; // no auto replacing of entities in this mode
656
657 entity item = M_ARGV(0, entity);
658
659 if (autocvar_g_buffs_replace_powerups && item.itemdef.instanceOfPowerup)
660 {
661 entity e = spawn();
662 buff_SpawnReplacement(e, item);
663 return true;
664 }
665
666 return false;
667}
668
670{
671 entity player = M_ARGV(0, entity);
672
673 if (game_stopped || IS_DEAD(player) || !IS_PLAYER(player))
674 return;
675
676 // NOTE: this is kept here to ensure crouches are picked up each player movement frame
677 if (StatusEffects_active(BUFF_FLIGHT, player))
678 {
679 if (!PHYS_INPUT_BUTTON_CROUCH(player))
680 player.buff_flight_crouchheld = false;
681 else if (!player.buff_flight_crouchheld)
682 {
683 player.buff_flight_crouchheld = true;
684 player.gravity *= -1;
685 }
686 }
687
688 if (IS_PLAYER(player))
690}
691
692MUTATOR_HOOKFUNCTION(buffs, BuildMutatorsString)
693{
694 if (autocvar_g_buffs > 0) // only report as a mutator if they're enabled
695 M_ARGV(0, string) = strcat(M_ARGV(0, string), ":Buffs");
696}
697
698MUTATOR_HOOKFUNCTION(buffs, BuildMutatorsPrettyString)
699{
700 if (autocvar_g_buffs > 0)
701 M_ARGV(0, string) = strcat(M_ARGV(0, string), ", Buffs");
702}
703
705{
707 if (find(NULL, classname, "item_buff") == NULL)
708 for (int i = 0; i < autocvar_g_buffs_spawn_count; ++i)
709 {
710 entity e = spawn();
711 e.spawnflags |= 64; // always randomize
712 e.velocity = randomvec() * 250; // this gets reset anyway if random location works
713 buff_Init(e);
714 }
715}
716
718{
719 // if buffs are above 0, allow random spawning
720 if (autocvar_g_buffs > 0 && autocvar_g_buffs_spawn_count > 0)
722}
float bot_pickup
Definition api.qh:43
const int CBC_ORDER_FIRST
Definition base.qh:10
#define MUTATOR_CALLHOOK(id,...)
Definition base.qh:143
#define MUTATOR_HOOKFUNCTION(...)
Definition base.qh:335
#define MUTATOR_RETURNVALUE
Definition base.qh:328
vector buff_Bash_AttackerCalculateForce(vector frag_force, entity frag_target, entity frag_attacker)
Definition bash.qc:10
vector buff_Bash_TargetCalculateForce(vector frag_force, entity frag_target, entity frag_attacker)
Definition bash.qc:4
float bot_pickupbasevalue
Definition bot.qh:68
int team_forced
Definition buffs.qh:59
entity buffdef
Definition buffs.qh:58
var entity(vector mins, vector maxs,.entity tofield) findbox_tofield_OrFallback
float GetResource(entity e, Resource res_type)
Returns the current amount of resource the given entity has.
Definition buffs.qh:17
float lifetime
Definition powerups.qc:23
float count
Definition powerups.qc:22
float alpha
Definition items.qc:13
float gravity
Definition items.qh:17
entity owner
Definition main.qh:87
int spawnflags
Definition ammo.qh:15
float buffs_finished
Definition item.qh:95
const int IT_UNLIMITED_AMMO
Definition item.qh:23
const vector ITEM_L_MAXS
Definition item.qh:84
const vector ITEM_D_MINS
Definition item.qh:82
#define setmodel(this, m)
Definition model.qh:26
#define M_ARGV(x, type)
Definition events.qh:17
#define PHYS_INPUT_BUTTON_CROUCH(s)
Definition player.qh:156
#define IS_DEAD(s)
Definition player.qh:244
#define IS_PLAYER(s)
Definition player.qh:242
float game_starttime
Definition stats.qh:82
float game_stopped
Definition stats.qh:81
const int INITPRIO_FINDTARGET
Definition constants.qh:96
#define EFMASK_CHEAP
Definition constants.qh:107
const int FL_ITEM
Definition constants.qh:77
string classname
float Q3SURFACEFLAG_SKY
float flags
float DPCONTENTS_SKY
const float MOVE_NOMONSTERS
const float EF_STARDUST
const float SOLID_TRIGGER
float DPCONTENTS_DONOTENTER
float DPCONTENTS_SOLID
float frametime
float DPCONTENTS_CORPSE
vector mins
vector velocity
float DPCONTENTS_BODY
const float EF_FULLBRIGHT
const float SOLID_NOT
float effects
float DPCONTENTS_PLAYERCLIP
float DPCONTENTS_SLIME
float time
vector trace_endpos
vector maxs
float nextthink
vector origin
float DPCONTENTS_LAVA
float solid
const float ATTN_NORM
const float EF_NOSHADOW
const float EF_NODRAW
float dphitcontentsmask
const float PFLAGS_FULLDYNAMIC
#define spawn
vector glowmod
float Fire_AddDamage(entity e, entity o, float d, float t, float dt)
Definition damage.qc:965
void buff_Disability_ApplyStunned(entity frag_target, entity frag_attacker)
Definition disability.qc:4
float pflags
float EF_LOWPRECISION
float light_lev
Definition dynlight.qc:13
vector color
Definition dynlight.qc:15
int m_id
Definition effect.qh:19
void Send_Effect_(string eff_name, vector eff_loc, vector eff_vel, int eff_cnt)
Definition all.qc:125
void Send_Effect(entity eff, vector eff_loc, vector eff_vel, int eff_cnt)
Definition all.qc:120
ent angles
Definition ent_cs.qc:146
skin
Definition ent_cs.qc:168
float buff_Inferno_CalculateTime(float dmg)
Definition inferno.qc:4
float buff_Inferno_CalculateDamage(float frag_damage)
Definition inferno.qc:13
ERASEABLE entity IL_PUSH(IntrusiveList this, entity it)
Push to tail.
#define ITEM_SHOULD_KEEP_POSITION(item)
Returns whether item should keep its position or be dropped to the ground.
Definition spawning.qh:52
#define FOREACH(list, cond, body)
Definition iter.qh:19
float buff_Jump_ChangeDamage(float frag_damage, float frag_deathtype)
Definition jump.qc:4
#define PlayerPreThink
Definition _all.inc:258
#define ClientDisconnect
Definition _all.inc:246
#define STAT(...)
Definition stats.qh:94
float buff_Luck_CalculateDamage(float frag_damage)
Definition luck.qc:4
float buff_Medic_CalculateSurviveDamage(float frag_damage, float health)
Definition medic.qc:16
float cvar(string name)
entity find(entity start,.string field, string match)
vector randomvec(void)
float sin(float f)
float max(float f,...)
void set_movetype(entity this, int mt)
Definition movetypes.qc:4
const int MOVETYPE_NONE
Definition movetypes.qh:133
const int MOVETYPE_TOSS
Definition movetypes.qh:139
@ STATUSEFFECT_REMOVE_CLEAR
Effect is being forcibly removed without calling any additional mechanics.
Definition all.qh:30
@ STATUSEFFECT_REMOVE_NORMAL
Effect is being removed by a function, calls regular removal mechanics.
Definition all.qh:28
@ STATUSEFFECT_REMOVE_TIMEOUT
Definition all.qh:29
@ STATUSEFFECT_FLAG_ACTIVE
Definition all.qh:22
strcat(_("^F4Countdown stopped!"), "\n^BG", _("Teams are too unbalanced."))
void Send_Notification(NOTIF broadcast, entity client, MSG net_type, Notification net_name,...count)
Definition all.qc:1500
#define SUPER(cname)
Definition oo.qh:236
#define new_pure(class)
purely logical entities (not linked to the area grid)
Definition oo.qh:66
#define METHOD(cname, name, prototype)
Definition oo.qh:274
#define NULL
Definition post.qh:14
#define makevectors
Definition post.qh:21
float scale
Definition projectile.qc:14
ERASEABLE void RandomSelection_Init()
Definition random.qc:4
#define RandomSelection_AddEnt(e, weight, priority)
Definition random.qh:14
entity RandomSelection_chosen_ent
Definition random.qh:5
float buff_Resistance_CalculateDamage(float frag_damage)
Definition resistance.qc:4
#define round_handler_IsActive()
#define round_handler_IsRoundStarted()
#define setthink(e, f)
vector
Definition self.qh:96
#define setcefc(e, f)
entity entity toucher
Definition self.qh:76
#define settouch(e, f)
Definition self.qh:77
void PlayerUseKey(entity this)
Definition client.qc:2607
#define IS_INDEPENDENT_PLAYER(e)
Definition client.qh:312
float generic_pickupevalfunc(entity player, entity item)
Definition items.qc:885
IntrusiveList g_items
Definition items.qh:119
#define ITEM_TOUCH_NEEDKILL()
Definition items.qh:122
#define ITEM_DAMAGE_NEEDKILL(dt)
Definition items.qh:123
bool noalign
Definition items.qh:37
entity SelectSpawnPoint(entity this, bool anypoint)
const int CH_TRIGGER
Definition sound.qh:12
const float VOL_BASE
Definition sound.qh:36
const float ATTEN_NONE
Definition sound.qh:27
#define sound(e, c, s, v, a)
Definition sound.qh:52
#define CS_CVAR(this)
Definition state.qh:51
bool StatusEffects_active(StatusEffect this, entity actor)
void StatusEffects_apply(StatusEffect this, entity actor, float eff_time, int eff_flags)
void buff_Think(entity this)
Definition sv_buffs.qc:297
void buffs_BuffModel_Think(entity this)
Definition sv_buffs.qc:39
void buff_Delete(entity this)
Definition sv_buffs.qc:422
void buff_NewType(entity ent)
Definition sv_buffs.qc:266
void buffs_Initialize()
Definition sv_buffs.qc:717
void buff_Init(entity this)
Definition sv_buffs.qc:428
void buff_SpawnReplacement(entity ent, entity old)
Definition sv_buffs.qc:507
void buff_Effect(entity player, string eff)
Definition sv_buffs.qc:103
bool buffs_RemovePlayer(entity player)
Definition sv_buffs.qc:636
bool buffs_BuffModel_Customize(entity this, entity client)
Definition sv_buffs.qc:10
entity buff_FirstFromFlags(entity actor)
Definition sv_buffs.qc:289
int buff_seencount
Definition sv_buffs.qc:264
bool buff_Waypoint_visible_for_player(entity this, entity player, entity view)
Definition sv_buffs.qc:116
float buff_Available(entity buff)
Definition sv_buffs.qc:253
void buffs_DelayedInit(entity this)
Definition sv_buffs.qc:704
void buff_SetCooldown(entity this, float cd)
Definition sv_buffs.qc:140
void buff_RemoveAll(entity actor, int removal_type)
Definition sv_buffs.qc:282
void buff_Init_Compat(entity ent, entity replacement)
Definition sv_buffs.qc:492
void buff_Reset(entity this)
Definition sv_buffs.qc:374
bool buff_Customize(entity this, entity client)
Definition sv_buffs.qc:401
void buffs_BuffModel_Spawn(entity player)
Definition sv_buffs.qc:77
void buff_Respawn(entity this)
Definition sv_buffs.qc:153
void buff_Touch(entity this, entity toucher)
Definition sv_buffs.qc:189
void buffs_BuffModel_Remove(entity player)
Definition sv_buffs.qc:70
void buff_Waypoint_Spawn(entity e)
Definition sv_buffs.qc:128
void buffs_BuffModel_Update(entity this)
Definition sv_buffs.qc:94
float autocvar_g_buffs_cooldown_activate
Definition sv_buffs.qh:31
float buff_activetime
Definition sv_buffs.qh:39
entity buff_model
Definition sv_buffs.qh:44
int autocvar_g_buffs_randomize
Definition sv_buffs.qh:23
entity oldbuffs
Definition sv_buffs.qh:42
bool buff_activetime_updated
Definition sv_buffs.qh:40
int autocvar_g_buffs_random_location_attempts
Definition sv_buffs.qh:26
bool autocvar_g_buffs_pickup_anyway
Definition sv_buffs.qh:21
entity buff_waypoint
Definition sv_buffs.qh:41
bool autocvar_g_buffs_replace_available
Definition sv_buffs.qh:29
bool autocvar_g_buffs_effects
Definition sv_buffs.qh:19
int autocvar_g_buffs_spawn_count
Definition sv_buffs.qh:27
float autocvar_g_buffs_cooldown_respawn
Definition sv_buffs.qh:32
bool autocvar_g_buffs_random_location
Definition sv_buffs.qh:25
float autocvar_g_buffs_pickup_delay
Definition sv_buffs.qh:22
bool buff_active
Definition sv_buffs.qh:38
bool autocvar_g_buffs_replace_powerups
Definition sv_buffs.qh:28
float autocvar_g_buffs_waypoint_distance
Definition sv_buffs.qh:20
bool autocvar_g_buffs_drop
Definition sv_buffs.qh:30
float autocvar_g_buffs_random_lifetime
Definition sv_buffs.qh:24
float frag_damage
Definition sv_ctf.qc:2315
vector frag_force
Definition sv_ctf.qc:2316
entity frag_target
Definition sv_ctf.qc:2314
var void delete_fn(entity e)
const int NUM_TEAM_2
Definition teams.qh:14
bool teamplay
Definition teams.qh:59
#define DIFF_TEAM(a, b)
Definition teams.qh:242
const int NUM_TEAM_1
Definition teams.qh:13
string targetname
Definition triggers.qh:56
#define CENTER_OR_VIEWOFS(ent)
Definition utils.qh:31
void buff_Vengeance_DelayedDamage(entity this)
Definition vengeance.qc:4
float buff_Vengeance_CalculateDamage(float frag_damage)
Definition vengeance.qc:12
void WaypointSprite_Kill(entity wp)
void WaypointSprite_UpdateTeamRadar(entity e, entity icon, vector col)
void WaypointSprite_Ping(entity e)
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)
bool WaypointSprite_visible_for_player(entity this, entity player, entity view)
entity WaypointSprite_getviewentity(entity e)
void WaypointSprite_UpdateBuildFinished(entity e, float f)
float MoveToRandomMapLocation(entity e, float goodcontents, float badcontents, float badsurfaceflags, float attempts, float maxaboveground, float minviewdistance)
Definition world.qc:1251
void InitializeEntity(entity e, void(entity this) func, int order)
Definition world.qc:2229
int start_items
Definition world.qh:83