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

Go to the source code of this file.

Macros

#define _DOES_MSG(mode)
#define _DOES_PERSEC_MSG(mode)
#define _IT_DOES_MSG()
#define _IT_SHOOTS_MSG()
#define _SHOOTS_MSG(mode)
#define _SHOOTS_UPTO_MSG(mode)
#define COLORED_DAMAGE(dmg)
#define DPS_MUL(mode)
#define DPS_ONE(mode)
#define IT_DOES()
#define IT_SHOOTS()
#define pri_str   _("primary")
#define sec_str   _("secondary")
#define THE_PRIMARY_DOES()
#define THE_PRIMARY_DOES_PERSEC()
#define THE_PRIMARY_SHOOTS()
#define THE_PRIMARY_SHOOTS_UPTO()
#define THE_SECONDARY_DOES()
#define THE_SECONDARY_DOES_PERSEC()
#define THE_SECONDARY_SHOOTS()
#define THE_SECONDARY_SHOOTS_UPTO()
#define WEAPONS_ALL_C

Functions

WepSet _WepSet_FromWeapon (int a)
void CL_WeaponEntity_SetModel (entity this, string name, bool _anim)
 supported formats:
entity GetAmmoItem (Resource ammotype)
entity GetAmmoResource (Ammo ammotype)
int GetAmmoStat (Resource ammotype)
 NET_HANDLE (w_whereis, bool)
 NET_HANDLE (wframe, bool isNew)
WepSet ReadWepSet ()
 REPLICATE (cvar_cl_accuracy_data_receive, bool, "cl_accuracy_data_receive")
 REPLICATE (cvar_cl_accuracy_data_share, bool, "cl_accuracy_data_share")
 REPLICATE (cvar_cl_gunalign, int, "cl_gunalign")
 REPLICATE (cvar_cl_weapon_switch_fallback_to_impulse, bool, "cl_weapon_switch_fallback_to_impulse")
 REPLICATE (cvar_cl_weapon_switch_reload, bool, "cl_weapon_switch_reload")
 REPLICATE (cvar_cl_weaponimpulsemode, int, "cl_weaponimpulsemode")
 REPLICATE (cvar_cl_weaponpriorities[0], string, "cl_weaponpriority0", W_FixWeaponOrder_AllowIncomplete)
 REPLICATE (cvar_cl_weaponpriorities[1], string, "cl_weaponpriority1", W_FixWeaponOrder_AllowIncomplete)
 REPLICATE (cvar_cl_weaponpriorities[2], string, "cl_weaponpriority2", W_FixWeaponOrder_AllowIncomplete)
 REPLICATE (cvar_cl_weaponpriorities[3], string, "cl_weaponpriority3", W_FixWeaponOrder_AllowIncomplete)
 REPLICATE (cvar_cl_weaponpriorities[4], string, "cl_weaponpriority4", W_FixWeaponOrder_AllowIncomplete)
 REPLICATE (cvar_cl_weaponpriorities[5], string, "cl_weaponpriority5", W_FixWeaponOrder_AllowIncomplete)
 REPLICATE (cvar_cl_weaponpriorities[6], string, "cl_weaponpriority6", W_FixWeaponOrder_AllowIncomplete)
 REPLICATE (cvar_cl_weaponpriorities[7], string, "cl_weaponpriority7", W_FixWeaponOrder_AllowIncomplete)
 REPLICATE (cvar_cl_weaponpriorities[8], string, "cl_weaponpriority8", W_FixWeaponOrder_AllowIncomplete)
 REPLICATE (cvar_cl_weaponpriorities[9], string, "cl_weaponpriority9", W_FixWeaponOrder_AllowIncomplete)
 REPLICATE (cvar_cl_weaponpriority, string, "cl_weaponpriority", W_FixWeaponOrder_ForceComplete_AndBuildImpulseList)
vector shotorg_adjust (vector vecs, bool y_is_right, bool visual, int algn)
vector shotorg_adjustfromclient (vector vecs, float y_is_right, float algn)
string W_FixWeaponOrder (string order, float complete)
string W_FixWeaponOrder_AllowIncomplete (entity this, string order)
string W_FixWeaponOrder_BuildImpulseList (string o)
float W_FixWeaponOrder_BuildImpulseList_cmp (int i, int j, entity pass)
void W_FixWeaponOrder_BuildImpulseList_swap (int i, int j, entity pass)
string W_FixWeaponOrder_ForceComplete (string order)
string W_FixWeaponOrder_ForceComplete_AndBuildImpulseList (entity this, string wo)
string W_Guide_DPS (string name, string pri, string sec)
string W_Guide_DPS_bothMultishot (string name, string pri, string sec)
string W_Guide_DPS_onlyOne (string name, string fire)
string W_Guide_DPS_onlyOne_andDirectHit (string name, string fire)
string W_Guide_DPS_onlyOne_unnamed (string name)
string W_Guide_DPS_onlyOne_unnamed_andDirectHit (string name)
string W_Guide_DPS_onlyOneMultishot (string name, string fire, string shots, string refire2)
string W_Guide_DPS_onlySecondary (string name, string sec)
string W_Guide_DPS_primaryDPS (string name, string pri, string sec)
string W_Guide_DPS_primaryMultishot (string name, string pri, string sec, string shots, string refire2)
string W_Guide_DPS_secondaryMultishot (string name, string pri, string sec, string shots, string refire2, bool sec_variable)
string W_Guide_DPS_secondaryMultishotWithCombo (string name, string pri, string sec, string shots, string refire2, string combo, bool sec_variable)
string W_Guide_Keybinds (Weapon wep)
string W_Model (string w_mdl)
void W_MuzzleFlash (Weapon thiswep, entity actor,.entity weaponentity, vector shotorg, vector shotdir)
void W_MuzzleFlash_Model (entity wepent, entity muzzlemodel)
void W_MuzzleFlash_Model_AttachToShotorg (entity actor,.entity weaponentity, entity flash, vector offset)
void W_MuzzleFlash_Model_Think (entity this)
string W_NameWeaponOrder (string order)
string W_NameWeaponOrder_MapFunc (string s)
string W_NumberWeaponOrder (string order)
string W_NumberWeaponOrder_MapFunc (string s)
WepSet W_RandomWeapons (entity e, WepSet remaining, int n)
string W_Sound (string w_snd)
void Weapon_whereis (Weapon this, entity cl)
WepSet WepSet_GetFromStat ()
WepSet WepSet_GetFromStat_InMap ()
void wframe_send (entity actor, entity weaponentity, int wepframe, float attackrate, bool restartanim)
void WriteWepSet (float dst, WepSet w)

Variables

float W_FixWeaponOrder_BuildImpulseList_buf [REGISTRY_MAX(Weapons)]
string W_FixWeaponOrder_BuildImpulseList_order

Macro Definition Documentation

◆ _DOES_MSG

#define _DOES_MSG ( mode)
Value:
strcat("\n* ", sprintf(_("The %s does %s damage"), mode##str, COLORED_DAMAGE(mode##dmg_s)), " ", DPS_ONE(mode))
strcat(_("^F4Countdown stopped!"), "\n^BG", _("Teams are too unbalanced."))
#define COLORED_DAMAGE(dmg)
Definition all.qc:873
#define DPS_ONE(mode)
Definition all.qc:875

Definition at line 882 of file all.qc.

◆ _DOES_PERSEC_MSG

#define _DOES_PERSEC_MSG ( mode)
Value:
strcat("\n* ", sprintf(_("The %s does %s damage per second"), mode##str, COLORED_DAMAGE(mode##dmg_s)))

Definition at line 883 of file all.qc.

◆ _IT_DOES_MSG

#define _IT_DOES_MSG ( )
Value:
strcat("\n* ", sprintf(_("It does %s damage"), COLORED_DAMAGE(dmg_s)), " ", DPS_ONE())

Definition at line 880 of file all.qc.

◆ _IT_SHOOTS_MSG

#define _IT_SHOOTS_MSG ( )
Value:
strcat("\n* ", sprintf(_("It shoots %s shots doing %s damage each"), shots_s, COLORED_DAMAGE(dmg_s)), " ", DPS_MUL())
#define DPS_MUL(mode)
Definition all.qc:876

Definition at line 881 of file all.qc.

◆ _SHOOTS_MSG

#define _SHOOTS_MSG ( mode)
Value:
strcat("\n* ", sprintf(_("The %s shoots %s shots doing %s damage each"), mode##str, mode##shots_s, COLORED_DAMAGE(mode##dmg_s)), " ", DPS_MUL(mode))

Definition at line 884 of file all.qc.

◆ _SHOOTS_UPTO_MSG

#define _SHOOTS_UPTO_MSG ( mode)
Value:
strcat("\n* ", sprintf(_("The %s shoots up to %s shots doing %s damage each"), mode##str, mode##shots_s, COLORED_DAMAGE(mode##dmg_s)), " ", DPS_MUL(mode))

Definition at line 885 of file all.qc.

◆ COLORED_DAMAGE

#define COLORED_DAMAGE ( dmg)
Value:
strcat("^9", dmg, "^7")
float dmg
Definition breakable.qc:12

Definition at line 873 of file all.qc.

Referenced by W_Guide_DPS_onlyOne_unnamed_andDirectHit(), and W_Guide_DPS_secondaryMultishotWithCombo().

◆ DPS_MUL

#define DPS_MUL ( mode)
Value:
sprintf(_("(DPS: %.2f)"), mode##rft <= 0 ? 1337 : stof(mode##dmg_s) / mode##rft * stof(mode##shots_s))
float stof(string val,...)

Definition at line 876 of file all.qc.

◆ DPS_ONE

#define DPS_ONE ( mode)
Value:
sprintf(_("(DPS: %.2f)"), mode##rft <= 0 ? 1337 : stof(mode##dmg_s) / mode##rft)

Definition at line 875 of file all.qc.

◆ IT_DOES

#define IT_DOES ( )
Value:
#define _IT_DOES_MSG()
Definition all.qc:880

Definition at line 888 of file all.qc.

Referenced by W_Guide_DPS_onlyOne_unnamed(), and W_Guide_DPS_onlyOne_unnamed_andDirectHit().

◆ IT_SHOOTS

#define IT_SHOOTS ( )
Value:
#define _IT_SHOOTS_MSG()
Definition all.qc:881

Definition at line 889 of file all.qc.

Referenced by W_Guide_DPS_onlyOneMultishot().

◆ pri_str

#define pri_str   _("primary")

Definition at line 878 of file all.qc.

◆ sec_str

#define sec_str   _("secondary")

Definition at line 879 of file all.qc.

◆ THE_PRIMARY_DOES

#define THE_PRIMARY_DOES ( )
Value:
_DOES_MSG(pri_)
#define _DOES_MSG(mode)
Definition all.qc:882

Definition at line 890 of file all.qc.

Referenced by W_Guide_DPS(), W_Guide_DPS_secondaryMultishot(), and W_Guide_DPS_secondaryMultishotWithCombo().

◆ THE_PRIMARY_DOES_PERSEC

#define THE_PRIMARY_DOES_PERSEC ( )
Value:
#define _DOES_PERSEC_MSG(mode)
Definition all.qc:883

Definition at line 893 of file all.qc.

Referenced by W_Guide_DPS_primaryDPS().

◆ THE_PRIMARY_SHOOTS

#define THE_PRIMARY_SHOOTS ( )
Value:
#define _SHOOTS_MSG(mode)
Definition all.qc:884

Definition at line 891 of file all.qc.

Referenced by W_Guide_DPS_bothMultishot(), and W_Guide_DPS_primaryMultishot().

◆ THE_PRIMARY_SHOOTS_UPTO

#define THE_PRIMARY_SHOOTS_UPTO ( )
Value:
#define _SHOOTS_UPTO_MSG(mode)
Definition all.qc:885

Definition at line 892 of file all.qc.

◆ THE_SECONDARY_DOES

#define THE_SECONDARY_DOES ( )

◆ THE_SECONDARY_DOES_PERSEC

#define THE_SECONDARY_DOES_PERSEC ( )
Value:

Definition at line 897 of file all.qc.

◆ THE_SECONDARY_SHOOTS

#define THE_SECONDARY_SHOOTS ( )

◆ THE_SECONDARY_SHOOTS_UPTO

#define THE_SECONDARY_SHOOTS_UPTO ( )
Value:

Definition at line 896 of file all.qc.

Referenced by W_Guide_DPS_secondaryMultishot(), and W_Guide_DPS_secondaryMultishotWithCombo().

◆ WEAPONS_ALL_C

#define WEAPONS_ALL_C

Definition at line 3 of file all.qc.

Function Documentation

◆ _WepSet_FromWeapon()

WepSet _WepSet_FromWeapon ( int a)

Definition at line 53 of file all.qc.

54{
55 a -= WEP_FIRST;
56 if (REGISTRY_MAX(Weapons) > 24)
57 if (a >= 24)
58 {
59 a -= 24;
60 if (REGISTRY_MAX(Weapons) > 48)
61 if (a >= 24)
62 {
63 a -= 24;
64 return '0 0 1' * BIT(a);
65 }
66 return '0 1 0' * BIT(a);
67 }
68 return '1 0 0' * BIT(a);
69}
#define BIT(n)
Only ever assign into the first 24 bits in QC (so max is BIT(23)).
Definition bits.qh:8
Weapons
Definition guide.qh:113
#define REGISTRY_MAX(id)
Definition registry.qh:17
const int WEP_FIRST
Definition all.qh:326

References BIT, REGISTRY_MAX, Weapons, and WEP_FIRST.

Referenced by STATIC_INIT().

◆ CL_WeaponEntity_SetModel()

void CL_WeaponEntity_SetModel ( entity this,
string name,
bool _anim )

supported formats:

  1. simple animated model, muzzle flash handling on h_ model: h_tuba.dpm, h_tuba.dpm.framegroups - invisible model controlling the animation tags: shot = muzzle end (shot origin, also used for muzzle flashes) shell = casings ejection point (must be on the right hand side of the gun) weapon = attachment for v_tuba.md3 v_tuba.md3 - first and third person model g_tuba.md3 - pickup model
  2. simple animated model, muzzle flash handling on v_ model: h_tuba.dpm, h_tuba.dpm.framegroups - invisible model controlling the animation tags: weapon = attachment for v_tuba.md3 v_tuba.md3 - first and third person model tags: shot = muzzle end (shot origin, also used for muzzle flashes) shell = casings ejection point (must be on the right hand side of the gun) g_tuba.md3 - pickup model
  3. fully animated model, muzzle flash handling on h_ model: h_tuba.dpm, h_tuba.dpm.framegroups - animated first person model tags: shot = muzzle end (shot origin, also used for muzzle flashes) shell = casings ejection point (must be on the right hand side of the gun) handle = corresponding to the origin of v_tuba.md3 (used for muzzle flashes) v_tuba.md3 - third person model g_tuba.md3 - pickup model
  4. fully animated model, muzzle flash handling on v_ model: h_tuba.dpm, h_tuba.dpm.framegroups - animated first person model tags: shot = muzzle end (shot origin) shell = casings ejection point (must be on the right hand side of the gun) v_tuba.md3 - third person model tags: shot = muzzle end (for muzzle flashes) g_tuba.md3 - pickup model

writes: this.origin, this.angles this.weaponchild this.movedir, this.view_ofs, this.movedir_aligned this.spawnorigin (SVQC only) attachment stuff anim stuff to free: call again with "" remove the ent

Definition at line 347 of file all.qc.

348{
349 if (name == "")
350 {
351 vector oldmin = this.mins, oldmax = this.maxs;
352 setmodel(this, MDL_Null);
353 setsize(this, oldmin, oldmax);
354 if (this.weaponchild) delete(this.weaponchild);
355 this.weaponchild = NULL;
356 this.movedir = '0 0 0';
357#ifdef SVQC
358 this.spawnorigin = '0 0 0';
359#endif
360 this.oldorigin = '0 0 0';
361 this.anim_fire1 = '0 1 0.01';
362 this.anim_fire2 = '0 1 0.01';
363 this.anim_idle = '0 1 0.01';
364 this.anim_reload = '0 1 0.01';
365 }
366 else
367 {
368 // if there is a child entity, hide it until we're sure we use it
369 if (this.weaponchild) this.weaponchild.model = "";
370 _setmodel(this, W_Model(strcat("v_", name, ".md3")));
371 int v_shot_idx; // used later
372 (v_shot_idx = gettagindex(this, "shot")) || (v_shot_idx = gettagindex(this, "tag_shot"));
373
374 _setmodel(this, W_Model(strcat("h_", name, ".iqm")));
375 // preset some defaults that work great for renamed zym files (which don't need an animinfo)
376 this.anim_fire1 = animfixfps(this, '0 1 0.01', '0 0 0');
377 this.anim_fire2 = animfixfps(this, '1 1 0.01', '0 0 0');
378 this.anim_idle = animfixfps(this, '2 1 0.01', '0 0 0');
379 this.anim_reload = animfixfps(this, '3 1 0.01', '0 0 0');
380
381 // if we have a "weapon" tag, let's attach the v_ model to it ("invisible hand" style model)
382 // if we don't, this is a "real" animated model
383 string t;
384 if ((t = "weapon", gettagindex(this, t)) || (t = "tag_weapon", gettagindex(this, t)))
385 {
386 if (!this.weaponchild)
387 {
388 this.weaponchild = new(weaponchild);
389#ifdef CSQC
390 this.weaponchild.drawmask = MASK_NORMAL;
391 this.weaponchild.renderflags |= RF_VIEWMODEL;
392#endif
393 }
394 _setmodel(this.weaponchild, W_Model(strcat("v_", name, ".md3")));
395 setsize(this.weaponchild, '0 0 0', '0 0 0');
396 setattachment(this.weaponchild, this, t);
397 }
398 else
399 {
400 if (this.weaponchild) delete(this.weaponchild);
401 this.weaponchild = NULL;
402 }
403
404 setsize(this, '0 0 0', '0 0 0');
405 setorigin(this, '0 0 0');
406 this.angles = '0 0 0';
407 this.frame = 0;
408#ifdef SVQC
410#else
412#endif
413 if (v_shot_idx) // v_ model attached to invisible h_ model
414 {
415 this.movedir = gettaginfo(this.weaponchild, v_shot_idx);
416 }
417 else
418 {
419 int idx;
420 if ((idx = gettagindex(this, "shot")) || (idx = gettagindex(this, "tag_shot")))
421 {
422 this.movedir = gettaginfo(this, idx);
423 }
424 else
425 {
426 LOG_WARNF("weapon model %s does not support the 'shot' tag, will display shots TOTALLY wrong",
427 this.model);
428 this.movedir = '0 0 0';
429 }
430 }
431#ifdef SVQC
432 {
433 int idx = 0;
434 // v_ model attached to invisible h_ model
435 if (this.weaponchild
436 && ((idx = gettagindex(this.weaponchild, "shell")) || (idx = gettagindex(this.weaponchild, "tag_shell"))))
437 {
438 this.spawnorigin = gettaginfo(this.weaponchild, idx);
439 }
440 else if ((idx = gettagindex(this, "shell")) || (idx = gettagindex(this, "tag_shell")))
441 {
442 this.spawnorigin = gettaginfo(this, idx);
443 }
444 else
445 {
446 LOG_WARNF("weapon model %s does not support the 'shell' tag, will display casings wrong",
447 this.model);
448 this.spawnorigin = this.movedir;
449 }
450 }
451#endif
452 if (v_shot_idx)
453 {
454 this.oldorigin = '0 0 0'; // use regular attachment
455 }
456 else
457 {
458 int idx;
459 if (this.weaponchild)
460 (idx = gettagindex(this, "weapon")) || (idx = gettagindex(this, "tag_weapon"));
461 else
462 (idx = gettagindex(this, "handle")) || (idx = gettagindex(this, "tag_handle"));
463 if (idx)
464 {
465 this.oldorigin = this.movedir - gettaginfo(this, idx);
466 }
467 else
468 {
469 LOG_WARNF(
470 "weapon model %s does not support the 'handle' tag "
471 "and neither does the v_ model support the 'shot' tag, "
472 "will display muzzle flashes TOTALLY wrong\n",
473 this.model);
474 this.oldorigin = '0 0 0'; // there is no way to recover from this
475 }
476 }
477
478#ifdef SVQC
479 this.viewmodelforclient = this.owner;
480#else
482#endif
483 }
484
485 this.view_ofs = '0 0 0';
486 this.movedir_aligned = this.movedir;
487
488 if (this.movedir.x >= 0)
489 {
490 //int algn = STAT(GUNALIGN, this.owner);
491 int algn = W_GunAlign(this, STAT(GUNALIGN, this.owner));
492 #ifdef SVQC
493 this.m_gunalign = algn;
494 #endif
495 vector v = this.movedir;
496 this.movedir = shotorg_adjust(v, false, false, algn);
497 this.movedir_aligned = shotorg_adjust(v, false, true, algn);
498 this.view_ofs = this.movedir_aligned - v;
499 }
500
501 // shotorg_adjust can give negative .x from shootfromfixedorigin
502 // recheck .x here due to it
503 if (this.movedir.x >= 0)
504 {
505 int compressed_shotorg = compressShotOrigin(this.movedir);
506 // make them match perfectly
507 #ifdef SVQC
508 // null during init
509 if (this.owner) STAT(SHOTORG, this.owner) = compressed_shotorg;
510 #endif
511 this.movedir = decompressShotOrigin(compressed_shotorg);
512 }
513 else
514 {
515 // don't support negative x shotorgs
516 this.movedir = '0 0 0';
517
518 // reset _aligned here too even though as a side effect
519 // g_shootfromfixedorigin can make it reset
520 // it'd be only slightly better if it was checked individually
521 this.movedir_aligned = '0 0 0';
522
523 #ifdef SVQC
524 // null during init
525 if (this.owner) STAT(SHOTORG, this.owner) = 0;
526 #endif
527 }
528
529#ifdef SVQC
530 this.spawnorigin += this.view_ofs; // offset the casings origin by the same amount
531#endif
532
533 // check if an instant weapon switch occurred
534 setorigin(this, this.view_ofs);
535 if (!_anim) return;
536 // reset animstate now
537 this.wframe = WFRAME_IDLE;
538 setanim(this, this.anim_idle, true, false, true);
539}
#define setanim(...)
Definition anim.qh:45
float frame
primary framegroup animation (strength = 1 - lerpfrac - lerpfrac3 - lerpfrac4)
Definition anim.qh:6
int W_GunAlign(entity this, int preferred_align)
entity owner
Definition main.qh:87
float renderflags
Definition main.qh:111
#define setmodel(this, m)
Definition model.qh:26
float compressShotOrigin(vector v)
Definition util.qc:1248
vector decompressShotOrigin(int f)
Definition util.qc:1275
const float MASK_NORMAL
vector mins
const float RF_VIEWMODEL
vector maxs
vector oldorigin
entity viewmodelforclient
#define gettagindex
ent angles
Definition ent_cs.qc:121
model
Definition ent_cs.qc:139
#define STAT(...)
Definition stats.qh:82
#define LOG_WARNF(...)
Definition log.qh:62
vector movedir
Definition viewloc.qh:18
string name
Definition menu.qh:30
vector animfixfps(entity e, vector a, vector b)
Definition util.qc:1808
#define NULL
Definition post.qh:14
#define gettaginfo
Definition post.qh:32
vector view_ofs
Definition progsdefs.qc:151
vector
Definition self.qh:92
string W_Model(string w_mdl)
Definition all.qc:232
vector shotorg_adjust(vector vecs, bool y_is_right, bool visual, int algn)
Definition all.qc:262
int m_gunalign
Definition all.qh:385
vector movedir_aligned
Definition all.qh:394
vector anim_reload
Definition all.qh:400
vector anim_fire2
Definition all.qh:398
vector anim_idle
Definition all.qh:399
entity weaponchild
Definition all.qh:376
vector anim_fire1
Definition all.qh:397
WFRAME wframe
Definition all.qh:414
vector spawnorigin
Definition all.qh:391

References angles, anim_fire1, anim_fire2, anim_idle, anim_reload, animfixfps(), compressShotOrigin(), decompressShotOrigin(), entity(), frame, gettagindex, gettaginfo, LOG_WARNF, m_gunalign, MASK_NORMAL, maxs, mins, model, movedir, movedir_aligned, name, NULL, oldorigin, owner, renderflags, RF_VIEWMODEL, setanim, setmodel, shotorg_adjust(), spawnorigin, STAT, strcat(), vector, view_ofs, viewmodelforclient, W_GunAlign(), W_Model(), weaponchild, and wframe.

Referenced by CL_Weapon_GetShotOrg(), CL_Weaponentity_Think(), and viewmodel_draw().

◆ GetAmmoItem()

entity GetAmmoItem ( Resource ammotype)

Definition at line 189 of file all.qc.

190{
191 FOREACH(Items, it.netname == ammotype.netname,
192 {
193 return it;
194 });
195 LOG_WARNF("Invalid ammo type %d ", ammotype.m_id);
196 return NULL;
197}
string netname
Definition resources.qh:27
#define FOREACH(list, cond, body)
Definition iter.qh:19

References entity(), FOREACH, LOG_WARNF, Resource::netname, and NULL.

Referenced by ammo_pickupevalfunc().

◆ GetAmmoResource()

entity GetAmmoResource ( Ammo ammotype)

Definition at line 199 of file all.qc.

200{
201 FOREACH(Resources, it.netname == ammotype.netname,
202 {
203 return it;
204 });
205 LOG_WARNF("Invalid ammo type %d ", ammotype.m_id);
206 return NULL;
207}
int m_id
Definition item.qh:127

References entity(), FOREACH, LOG_WARNF, GameItem::m_id, and NULL.

◆ GetAmmoStat()

int GetAmmoStat ( Resource ammotype)

Definition at line 210 of file all.qc.

211{
212 // TODO: handle networking via resources
213 switch (ammotype)
214 {
215 case RES_SHELLS: return STAT_SHELLS;
216 case RES_BULLETS: return STAT_NAILS;
217 case RES_ROCKETS: return STAT_ROCKETS;
218 case RES_CELLS: return STAT_CELLS;
219 case RES_FUEL: return STAT_FUEL.m_id;
220 default: return -1;
221 }
222}
const float STAT_CELLS
const float STAT_ROCKETS
const float STAT_SHELLS
const float STAT_NAILS

References STAT_CELLS, STAT_NAILS, STAT_ROCKETS, and STAT_SHELLS.

Referenced by DrawAmmoItem(), and Weapons_Draw().

◆ NET_HANDLE() [1/2]

NET_HANDLE ( w_whereis ,
bool  )

Definition at line 606 of file all.qc.

607{
609 if (wpn != WEP_Null) Weapon_whereis(wpn, sender);
610 return true;
611}
fields which are explicitly/manually set are marked with "M", fields set automatically are marked wit...
Definition weapon.qh:44
#define ReadRegistered(r)
Definition net.qh:298
void Weapon_whereis(Weapon this, entity cl)
Definition selection.qc:26

References ReadRegistered, Weapon_whereis(), and Weapons.

◆ NET_HANDLE() [2/2]

NET_HANDLE ( wframe ,
bool isNew )

Definition at line 546 of file all.qc.

547{
548 WFRAME fr = ReadByte();
549 float t = ReadFloat();
550 int slot = ReadByte();
551 bool restartanim = ReadByte();
552 entity wepent = viewmodels[slot];
553 if(fr == WFRAME_IDLE)
554 wepent.animstate_looping = false; // we don't need to enforce idle animation
555 else
556 {
557 vector a = '0 0 0';
558 switch(fr)
559 {
560 default:
561 case WFRAME_IDLE: a = wepent.anim_idle; break;
562 case WFRAME_FIRE1: a = wepent.anim_fire1; break;
563 case WFRAME_FIRE2: a = wepent.anim_fire2; break;
564 case WFRAME_RELOAD: a = wepent.anim_reload; break;
565 }
566 a.z *= t;
567 anim_set(wepent, a, !restartanim, restartanim, restartanim);
568 }
569 wepent.state = ReadByte();
570 wepent.weapon_nextthink = ReadFloat();
571 switch (wepent.state)
572 {
573 case WS_RAISE:
574 wepent.weapon_switchdelay = wepent.switchweapon.switchdelay_raise;
575 break;
576 case WS_DROP:
577 wepent.weapon_switchdelay = wepent.activeweapon.switchdelay_drop;
578 break;
579 default:
580 wepent.weapon_switchdelay = 0;
581 break;
582 }
583 return true;
584}
void anim_set(entity e, vector anim, bool looping, bool override, bool restart)
Definition anim.qc:6
var entity(vector mins, vector maxs,.entity tofield) findbox_tofield_OrFallback
#define ReadFloat()
Definition net.qh:366
int ReadByte()
entity viewmodels[MAX_WEAPONSLOTS]
Definition view.qh:108
const int WS_RAISE
raise frame
Definition weapon.qh:35
const int WS_DROP
deselecting frame
Definition weapon.qh:37

References anim_set(), entity(), ReadByte(), ReadFloat, vector, viewmodels, wframe, WS_DROP, and WS_RAISE.

◆ ReadWepSet()

WepSet ReadWepSet ( )

Definition at line 87 of file all.qc.

88 {
89 if (REGISTRY_MAX(Weapons) > 48) return ReadInt72_t();
90 if (REGISTRY_MAX(Weapons) > 24) return ReadInt48_t();
91 return ReadInt24_t() * '1 0 0';
92 }
int ReadInt24_t()
Definition net.qh:355
#define ReadInt48_t()
Definition net.qh:361
#define ReadInt72_t()
Definition net.qh:362

References ReadInt24_t(), ReadInt48_t, ReadInt72_t, REGISTRY_MAX, and Weapons.

◆ REPLICATE() [1/17]

REPLICATE ( cvar_cl_accuracy_data_receive ,
bool ,
"cl_accuracy_data_receive"  )

◆ REPLICATE() [2/17]

REPLICATE ( cvar_cl_accuracy_data_share ,
bool ,
"cl_accuracy_data_share"  )

◆ REPLICATE() [3/17]

REPLICATE ( cvar_cl_gunalign ,
int ,
"cl_gunalign"  )

◆ REPLICATE() [4/17]

REPLICATE ( cvar_cl_weapon_switch_fallback_to_impulse ,
bool ,
"cl_weapon_switch_fallback_to_impulse"  )

◆ REPLICATE() [5/17]

REPLICATE ( cvar_cl_weapon_switch_reload ,
bool ,
"cl_weapon_switch_reload"  )

◆ REPLICATE() [6/17]

REPLICATE ( cvar_cl_weaponimpulsemode ,
int ,
"cl_weaponimpulsemode"  )

◆ REPLICATE() [7/17]

REPLICATE ( cvar_cl_weaponpriorities [0],
string ,
"cl_weaponpriority0" ,
W_FixWeaponOrder_AllowIncomplete  )

◆ REPLICATE() [8/17]

REPLICATE ( cvar_cl_weaponpriorities [1],
string ,
"cl_weaponpriority1" ,
W_FixWeaponOrder_AllowIncomplete  )

◆ REPLICATE() [9/17]

REPLICATE ( cvar_cl_weaponpriorities [2],
string ,
"cl_weaponpriority2" ,
W_FixWeaponOrder_AllowIncomplete  )

◆ REPLICATE() [10/17]

REPLICATE ( cvar_cl_weaponpriorities [3],
string ,
"cl_weaponpriority3" ,
W_FixWeaponOrder_AllowIncomplete  )

◆ REPLICATE() [11/17]

REPLICATE ( cvar_cl_weaponpriorities [4],
string ,
"cl_weaponpriority4" ,
W_FixWeaponOrder_AllowIncomplete  )

◆ REPLICATE() [12/17]

REPLICATE ( cvar_cl_weaponpriorities [5],
string ,
"cl_weaponpriority5" ,
W_FixWeaponOrder_AllowIncomplete  )

◆ REPLICATE() [13/17]

REPLICATE ( cvar_cl_weaponpriorities [6],
string ,
"cl_weaponpriority6" ,
W_FixWeaponOrder_AllowIncomplete  )

◆ REPLICATE() [14/17]

REPLICATE ( cvar_cl_weaponpriorities [7],
string ,
"cl_weaponpriority7" ,
W_FixWeaponOrder_AllowIncomplete  )

◆ REPLICATE() [15/17]

REPLICATE ( cvar_cl_weaponpriorities [8],
string ,
"cl_weaponpriority8" ,
W_FixWeaponOrder_AllowIncomplete  )

◆ REPLICATE() [16/17]

REPLICATE ( cvar_cl_weaponpriorities [9],
string ,
"cl_weaponpriority9" ,
W_FixWeaponOrder_AllowIncomplete  )

◆ REPLICATE() [17/17]

REPLICATE ( cvar_cl_weaponpriority ,
string ,
"cl_weaponpriority" ,
W_FixWeaponOrder_ForceComplete_AndBuildImpulseList  )

◆ shotorg_adjust()

vector shotorg_adjust ( vector vecs,
bool y_is_right,
bool visual,
int algn )

Definition at line 262 of file all.qc.

263{
264 string s;
265 if (visual)
266 {
267 vecs = shotorg_adjustfromclient(vecs, y_is_right, algn);
268 }
269 else if (STAT(SHOOTFROMEYE))
270 {
271 vecs.y = vecs.z = 0;
272 }
273 else if (STAT(SHOOTFROMCENTER))
274 {
275 vecs.y = 0;
276 vecs.z -= 2;
277 }
278 else if ((s = G_SHOOTFROMFIXEDORIGIN) != "")
279 {
280 vector v = stov(s);
281 if (y_is_right) v.y = -v.y;
282 if (v.x != 0) vecs.x = v.x;
283 vecs.y = v.y;
284 vecs.z = v.z;
285 }
286 else // just do the same as top
287 {
288 vecs = shotorg_adjustfromclient(vecs, y_is_right, algn);
289 }
290
291 return vecs;
292}
vector stov(string s)
vector shotorg_adjustfromclient(vector vecs, float y_is_right, float algn)
Definition all.qc:240
#define G_SHOOTFROMFIXEDORIGIN
Definition all.qh:418

References G_SHOOTFROMFIXEDORIGIN, shotorg_adjustfromclient(), STAT, stov(), and vector.

Referenced by CL_WeaponEntity_SetModel(), and PRECACHE().

◆ shotorg_adjustfromclient()

vector shotorg_adjustfromclient ( vector vecs,
float y_is_right,
float algn )

Definition at line 240 of file all.qc.

241{
242 switch (algn)
243 {
244 default:
245 case 3:
246 // right alignment
247 break;
248 case 4:
249 // left
250 vecs.y = -vecs.y;
251 break;
252 case 1:
253 case 2:
254 // center
255 vecs.y = 0;
256 vecs.z -= 2;
257 break;
258 }
259 return vecs;
260}

References vector.

Referenced by shotorg_adjust().

◆ W_FixWeaponOrder()

string W_FixWeaponOrder ( string order,
float complete )

Definition at line 95 of file all.qc.

96{
98}
string fixPriorityList(string order, float from, float to, float subtract, float complete)
Definition util.qc:600
#define WEP_LAST
Definition all.qh:327
#define WEP_IMPULSE_BEGIN
Definition all.qh:334

References fixPriorityList(), WEP_FIRST, WEP_IMPULSE_BEGIN, and WEP_LAST.

Referenced by LocalCommand_sendcvar(), W_FixWeaponOrder_AllowIncomplete(), W_FixWeaponOrder_ForceComplete(), and XonoticWeaponsList_draw().

◆ W_FixWeaponOrder_AllowIncomplete()

string W_FixWeaponOrder_AllowIncomplete ( entity this,
string order )

Definition at line 161 of file all.qc.

162{
163 return W_FixWeaponOrder(order, 0);
164}
string W_FixWeaponOrder(string order, float complete)
Definition all.qc:95

References entity(), and W_FixWeaponOrder().

Referenced by REPLICATE(), REPLICATE(), REPLICATE(), REPLICATE(), REPLICATE(), REPLICATE(), REPLICATE(), REPLICATE(), REPLICATE(), and REPLICATE().

◆ W_FixWeaponOrder_BuildImpulseList()

string W_FixWeaponOrder_BuildImpulseList ( string o)

Definition at line 146 of file all.qc.

147{
148 int i;
150 for (i = WEP_FIRST; i <= WEP_LAST; ++i)
153 NULL);
154 o = "";
155 for (i = WEP_FIRST; i <= WEP_LAST; ++i)
158 return substring(o, 1, -1);
159}
string substring(string s, float start, float length)
string ftos(float f)
string string_null
Definition nil.qh:9
ERASEABLE void heapsort(int n, swapfunc_t swap, comparefunc_t cmp, entity pass)
Definition sort.qh:9
void W_FixWeaponOrder_BuildImpulseList_swap(int i, int j, entity pass)
Definition all.qc:127
float W_FixWeaponOrder_BuildImpulseList_buf[REGISTRY_MAX(Weapons)]
Definition all.qc:125
float W_FixWeaponOrder_BuildImpulseList_cmp(int i, int j, entity pass)
Definition all.qc:134
string W_FixWeaponOrder_BuildImpulseList_order
Definition all.qc:126

References ftos(), heapsort(), NULL, strcat(), string_null, substring(), W_FixWeaponOrder_BuildImpulseList_buf, W_FixWeaponOrder_BuildImpulseList_cmp(), W_FixWeaponOrder_BuildImpulseList_order, W_FixWeaponOrder_BuildImpulseList_swap(), WEP_FIRST, and WEP_LAST.

Referenced by HUD_Weapons(), and W_FixWeaponOrder_ForceComplete_AndBuildImpulseList().

◆ W_FixWeaponOrder_BuildImpulseList_cmp()

float W_FixWeaponOrder_BuildImpulseList_cmp ( int i,
int j,
entity pass )

Definition at line 134 of file all.qc.

135{
137 Weapon e1 = REGISTRY_GET(Weapons, si);
139 Weapon e2 = REGISTRY_GET(Weapons, sj);
140 int d = (e1.impulse + 9) % 10 - (e2.impulse + 9) % 10;
141 if (d != 0) return -d; // high impulse first!
143 return strstrofs(s, sprintf(" %d ", si), 0)
144 - strstrofs(s, sprintf(" %d ", sj), 0); // low char index first!
145}
int impulse
M: impulse : weapon impulse.
Definition weapon.qh:53
#define strstrofs
#define REGISTRY_GET(id, i)
Definition registry.qh:43

References entity(), Weapon::impulse, pass, REGISTRY_GET, strcat(), strstrofs, W_FixWeaponOrder_BuildImpulseList_buf, W_FixWeaponOrder_BuildImpulseList_order, and Weapons.

Referenced by W_FixWeaponOrder_BuildImpulseList().

◆ W_FixWeaponOrder_BuildImpulseList_swap()

void W_FixWeaponOrder_BuildImpulseList_swap ( int i,
int j,
entity pass )

◆ W_FixWeaponOrder_ForceComplete()

string W_FixWeaponOrder_ForceComplete ( string order)

Definition at line 166 of file all.qc.

167{
168 if (order == "") order = W_NumberWeaponOrder(cvar_defstring("cl_weaponpriority"));
169 return W_FixWeaponOrder(order, 1);
170}
const string cvar_defstring(string name)
string W_NumberWeaponOrder(string order)
Definition all.qc:120

References cvar_defstring(), W_FixWeaponOrder(), and W_NumberWeaponOrder().

Referenced by HUD_Weapons(), and W_FixWeaponOrder_ForceComplete_AndBuildImpulseList().

◆ W_FixWeaponOrder_ForceComplete_AndBuildImpulseList()

string W_FixWeaponOrder_ForceComplete_AndBuildImpulseList ( entity this,
string wo )

Definition at line 802 of file all.qc.

803{
804 string o = W_FixWeaponOrder_ForceComplete(wo);
806 return o;
807}
string weaponorder_byimpulse
Definition client.qh:62
#define CS_CVAR(this)
Definition state.qh:51
#define strcpy(this, s)
Definition string.qh:52
string W_FixWeaponOrder_ForceComplete(string order)
Definition all.qc:166
string W_FixWeaponOrder_BuildImpulseList(string o)
Definition all.qc:146

References CS_CVAR, entity(), strcpy, W_FixWeaponOrder_BuildImpulseList(), W_FixWeaponOrder_ForceComplete(), and weaponorder_byimpulse.

Referenced by REPLICATE().

◆ W_Guide_DPS()

string W_Guide_DPS ( string name,
string pri,
string sec )

Definition at line 930 of file all.qc.

931{
932 // TODO: rename all wep primary cvars to g_balance_*_primary_*, vice versa for secondary.
933 // Example exception: g_balance_arc_beam_* (primary)
934 const string wepbal_s = strcat("g_balance_", name, "_");
935 const string pri_dmg_s = cvar_defstring(strcat(wepbal_s, pri, "_damage"));
936 const float pri_rft = stof(cvar_defstring(strcat(wepbal_s, pri, "_refire")));
937 const string sec_dmg_s = cvar_defstring(strcat(wepbal_s, sec, "_damage"));
938 const float sec_rft = stof(cvar_defstring(strcat(wepbal_s, sec, "_refire")));
939 return strcat(_("Default damage stats:"),
942 );
943}
#define THE_SECONDARY_DOES()
Definition all.qc:894
#define THE_PRIMARY_DOES()
Definition all.qc:890

References cvar_defstring(), name, stof(), strcat(), THE_PRIMARY_DOES, and THE_SECONDARY_DOES.

◆ W_Guide_DPS_bothMultishot()

string W_Guide_DPS_bothMultishot ( string name,
string pri,
string sec )

Definition at line 944 of file all.qc.

945{
946 const string wepbal_s = strcat("g_balance_", name, "_");
947 const string pri_dmg_s = cvar_defstring(strcat(wepbal_s, pri, "_damage"));
948 const float pri_rft = stof(cvar_defstring(strcat(wepbal_s, pri, "_refire")));
949 const string pri_shots_s = cvar_defstring(strcat(wepbal_s, pri, "_shots"));
950 const string sec_dmg_s = cvar_defstring(strcat(wepbal_s, sec, "_damage"));
951 const float sec_rft = stof(cvar_defstring(strcat(wepbal_s, sec, "_refire")));
952 const string sec_shots_s = cvar_defstring(strcat(wepbal_s, sec, "_shots"));
953 return strcat(_("Default damage stats:"),
956 );
957}
#define THE_PRIMARY_SHOOTS()
Definition all.qc:891
#define THE_SECONDARY_SHOOTS()
Definition all.qc:895

References cvar_defstring(), name, stof(), strcat(), THE_PRIMARY_SHOOTS, and THE_SECONDARY_SHOOTS.

◆ W_Guide_DPS_onlyOne()

string W_Guide_DPS_onlyOne ( string name,
string fire )

Definition at line 926 of file all.qc.

927{
928 return W_Guide_DPS_onlyOne_unnamed(strcat(name, "_", fire));
929}
string W_Guide_DPS_onlyOne_unnamed(string name)
Definition all.qc:913

References name, strcat(), and W_Guide_DPS_onlyOne_unnamed().

◆ W_Guide_DPS_onlyOne_andDirectHit()

string W_Guide_DPS_onlyOne_andDirectHit ( string name,
string fire )

Definition at line 922 of file all.qc.

923{
925}
string W_Guide_DPS_onlyOne_unnamed_andDirectHit(string name)
Definition all.qc:901

References name, strcat(), and W_Guide_DPS_onlyOne_unnamed_andDirectHit().

◆ W_Guide_DPS_onlyOne_unnamed()

string W_Guide_DPS_onlyOne_unnamed ( string name)

Definition at line 913 of file all.qc.

914{
915 const string wepbal_s = strcat("g_balance_", name);
916 const string dmg_s = cvar_defstring(strcat(wepbal_s, "_damage"));
917 const float rft = stof(cvar_defstring(strcat(wepbal_s, "_refire")));
918 return strcat(_("Default damage stats:"),
919 IT_DOES()
920 );
921}
#define IT_DOES()
Definition all.qc:888

References cvar_defstring(), IT_DOES, name, stof(), and strcat().

Referenced by W_Guide_DPS_onlyOne().

◆ W_Guide_DPS_onlyOne_unnamed_andDirectHit()

string W_Guide_DPS_onlyOne_unnamed_andDirectHit ( string name)

Definition at line 901 of file all.qc.

902{
903 const string wepbal_s = strcat("g_balance_", name);
904 const string dmg_s = cvar_defstring(strcat(wepbal_s, "_damage"));
905 const float rft = stof(cvar_defstring(strcat(wepbal_s, "_refire")));
906 const string dmg2_s = cvar_defstring(strcat(wepbal_s, "_damage2"));
907 const string dir_dps = sprintf(_("(DPS: %.2f)"), rft <= 0 ? 1337 : stof(dmg2_s) / rft);
908 return strcat(_("Default damage stats:"),
909 IT_DOES(),
910 strcat("\n* ", sprintf(_("A direct hit does %s damage"), COLORED_DAMAGE(dmg2_s)), " ", dir_dps)
911 );
912}

References COLORED_DAMAGE, cvar_defstring(), IT_DOES, name, stof(), and strcat().

Referenced by W_Guide_DPS_onlyOne_andDirectHit().

◆ W_Guide_DPS_onlyOneMultishot()

string W_Guide_DPS_onlyOneMultishot ( string name,
string fire,
string shots,
string refire2 )

Definition at line 1001 of file all.qc.

1002{
1003 const string wepbal_s = strcat("g_balance_", name, "_");
1004 const string dmg_s = cvar_defstring(strcat(wepbal_s, fire, "_damage"));
1005 float rft = stof(cvar_defstring(strcat(wepbal_s, fire, "_refire")));
1006 const string shots_s = cvar_defstring(strcat(wepbal_s, shots));
1007 const float num_shots = stof(shots_s);
1008 if (refire2 != "")
1009 rft = (num_shots - 1) * rft + stof(cvar_defstring(strcat(wepbal_s, refire2)));
1010 return strcat(_("Default damage stats:"),
1011 IT_SHOOTS()
1012 );
1013}
#define IT_SHOOTS()
Definition all.qc:889

References cvar_defstring(), IT_SHOOTS, name, stof(), and strcat().

◆ W_Guide_DPS_onlySecondary()

string W_Guide_DPS_onlySecondary ( string name,
string sec )

Definition at line 958 of file all.qc.

959{
960 const string wepbal_s = strcat("g_balance_", name, "_");
961 const string sec_dmg_s = cvar_defstring(strcat(wepbal_s, sec, "_damage"));
962 const float sec_rft = stof(cvar_defstring(strcat(wepbal_s, sec, "_refire")));
963 return strcat(_("Default damage stats:"),
965 );
966}

References cvar_defstring(), name, stof(), strcat(), and THE_SECONDARY_DOES.

◆ W_Guide_DPS_primaryDPS()

string W_Guide_DPS_primaryDPS ( string name,
string pri,
string sec )

Definition at line 1040 of file all.qc.

1041{
1042 const string wepbal_s = strcat("g_balance_", name, "_");
1043 const string pri_dmg_s = cvar_defstring(strcat(wepbal_s, pri, "_damage")); // actually damage per second
1044 const string sec_dmg_s = cvar_defstring(strcat(wepbal_s, sec, "_damage"));
1045 const float sec_rft = stof(cvar_defstring(strcat(wepbal_s, sec, "_refire")));
1046 return strcat(_("Default damage stats:"),
1049 );
1050}
#define THE_PRIMARY_DOES_PERSEC()
Definition all.qc:893

References cvar_defstring(), name, stof(), strcat(), THE_PRIMARY_DOES_PERSEC, and THE_SECONDARY_DOES.

◆ W_Guide_DPS_primaryMultishot()

string W_Guide_DPS_primaryMultishot ( string name,
string pri,
string sec,
string shots,
string refire2 )

Definition at line 985 of file all.qc.

986{
987 const string wepbal_s = strcat("g_balance_", name, "_");
988 const string pri_dmg_s = cvar_defstring(strcat(wepbal_s, pri, "_damage"));
989 float pri_rft = stof(cvar_defstring(strcat(wepbal_s, pri, "_refire")));
990 const string pri_shots_s = cvar_defstring(strcat(wepbal_s, shots));
991 const string sec_dmg_s = cvar_defstring(strcat(wepbal_s, sec, "_damage"));
992 const float sec_rft = stof(cvar_defstring(strcat(wepbal_s, sec, "_refire")));
993 const float num_shots = stof(pri_shots_s);
994 if (refire2 != "")
995 pri_rft = (num_shots - 1) * pri_rft + stof(cvar_defstring(strcat(wepbal_s, refire2)));
996 return strcat(_("Default damage stats:"),
999 );
1000}

References cvar_defstring(), name, stof(), strcat(), THE_PRIMARY_SHOOTS, and THE_SECONDARY_DOES.

◆ W_Guide_DPS_secondaryMultishot()

string W_Guide_DPS_secondaryMultishot ( string name,
string pri,
string sec,
string shots,
string refire2,
bool sec_variable )

Definition at line 967 of file all.qc.

968{
969 const string wepbal_s = strcat("g_balance_", name, "_");
970 const string pri_dmg_s = cvar_defstring(strcat(wepbal_s, pri, "_damage"));
971 const float pri_rft = stof(cvar_defstring(strcat(wepbal_s, pri, "_refire")));
972 string sec_dmg_s = cvar_defstring(strcat(wepbal_s, sec, "_damage"));
973 float sec_rft = stof(cvar_defstring(strcat(wepbal_s, sec, "_refire")));
974 const string sec_shots_s = cvar_defstring(strcat(wepbal_s, shots));
975 if (sec_dmg_s == "")
976 sec_dmg_s = pri_dmg_s;
977 const float num_shots = stof(sec_shots_s);
978 if (refire2 != "")
979 sec_rft = (num_shots - 1) * sec_rft + stof(cvar_defstring(strcat(wepbal_s, refire2)));
980 return strcat(_("Default damage stats:"),
983 );
984}
#define THE_SECONDARY_SHOOTS_UPTO()
Definition all.qc:896

References cvar_defstring(), name, stof(), strcat(), THE_PRIMARY_DOES, THE_SECONDARY_SHOOTS, and THE_SECONDARY_SHOOTS_UPTO.

◆ W_Guide_DPS_secondaryMultishotWithCombo()

string W_Guide_DPS_secondaryMultishotWithCombo ( string name,
string pri,
string sec,
string shots,
string refire2,
string combo,
bool sec_variable )

Definition at line 1014 of file all.qc.

1015{
1016 const string wepbal_s = strcat("g_balance_", name, "_");
1017 const string pri_dmg_s = cvar_defstring(strcat(wepbal_s, pri, "_damage"));
1018 const float pri_rft = stof(cvar_defstring(strcat(wepbal_s, pri, "_refire")));
1019 const string sec_dmg_s = cvar_defstring(strcat(wepbal_s, sec, "_damage"));
1020 float sec_rft = stof(cvar_defstring(strcat(wepbal_s, sec, "_refire")));
1021 const string sec_shots_s = cvar_defstring(strcat(wepbal_s, shots));
1022 const string cmb_dmg_s = cvar_defstring(strcat(wepbal_s, combo, "_damage"));
1023 const float num_shots = stof(sec_shots_s);
1024 float combo_t = max(pri_rft, sec_rft);
1025 if (refire2 != "")
1026 {
1027 const float sec_rft2 = sec_rft;
1028 sec_rft = stof(cvar_defstring(strcat(wepbal_s, refire2)));
1029 combo_t = max(combo_t, num_shots * sec_rft + sec_rft2);
1030 sec_rft = (num_shots - 1) * sec_rft + sec_rft2;
1031 }
1032 const string DPS_combo = sprintf(_("(total DPS: %.2f)"),
1033 combo_t <= 0 ? 1337 : (stof(pri_dmg_s) + stof(sec_dmg_s) * num_shots + stof(cmb_dmg_s)) / combo_t);
1034 return strcat(_("Default damage stats:"),
1036 (sec_variable ? THE_SECONDARY_SHOOTS_UPTO() : THE_SECONDARY_SHOOTS()),
1037 strcat("\n* ", sprintf(_("The combo adds an extra %s damage"), COLORED_DAMAGE(cmb_dmg_s)), " ", DPS_combo)
1038 );
1039}
float max(float f,...)

References COLORED_DAMAGE, cvar_defstring(), max(), name, stof(), strcat(), THE_PRIMARY_DOES, THE_SECONDARY_SHOOTS, and THE_SECONDARY_SHOOTS_UPTO.

◆ W_Guide_Keybinds()

string W_Guide_Keybinds ( Weapon wep)

Definition at line 836 of file all.qc.

837{
838 string command, key, keys = "";
839 int n, j;
840 float k;
841 const bool joy_active = cvar("joy_active");
842
843 for (int cmd_type = 0; cmd_type < 2; ++cmd_type)
844 {
845 command = cmd_type
846 ? strcat("weapon_", wep.netname)
847 : strcat("weapon_group_", itos(wep.impulse));
848 n = tokenize(findkeysforcommand(command, 0)); // uses '...' strings
849
850 for (j = 0; j < n; ++j)
851 {
852 k = stof(argv(j));
853 if (k == -1)
854 continue;
855 key = keynumtostring(k);
856 if (!joy_active && startsWith(key, "JOY"))
857 continue;
858
859 key = translate_key(key);
860 if (keys == "")
861 keys = strcat("^3", key);
862 else
863 keys = strcat(keys, "^7, ^3", key);
864 }
865 }
866
867 if (keys == "")
868 return _("This weapon has not been bound directly."); // code may miss some weird bind configs, so say "directly"
869 return sprintf(_("You have bound this weapon to: %s."), strcat(keys, "^7"));
870}
string netname
M: refname : reference name name.
Definition weapon.qh:79
string translate_key(string key)
Definition util.qc:1512
#define itos(i)
Definition int.qh:6
float cvar(string name)
string keynumtostring(float keynum)
float tokenize(string s)
string argv(float n)
float impulse
Definition progsdefs.qc:158
#define startsWith(haystack, needle)
Definition string.qh:236

References argv(), cvar(), Weapon::impulse, itos, keynumtostring(), Weapon::netname, startsWith, stof(), strcat(), tokenize(), and translate_key().

◆ W_Model()

string W_Model ( string w_mdl)

Definition at line 232 of file all.qc.

233{
234 string output = strcat("models/weapons/", w_mdl);
235 MUTATOR_CALLHOOK(WeaponModel, w_mdl, output);
236 return M_ARGV(1, string);
237}
#define MUTATOR_CALLHOOK(id,...)
Definition base.qh:143
#define M_ARGV(x, type)
Definition events.qh:17

References M_ARGV, MUTATOR_CALLHOOK, and strcat().

Referenced by CL_ExteriorWeaponentity_Think(), and CL_WeaponEntity_SetModel().

◆ W_MuzzleFlash()

void W_MuzzleFlash ( Weapon thiswep,
entity actor,
.entity weaponentity,
vector shotorg,
vector shotdir )

Definition at line 728 of file all.qc.

729{
730 // don't show an exterior muzzle effect for the off-hand
731 if(weaponslot(weaponentity) == 0)
732 {
733 Send_Effect_Except(thiswep.m_muzzleeffect, shotorg, shotdir * 1000, 1, '0 0 0', '0 0 0', actor);
734
735 if(thiswep.m_muzzlemodel != MDL_Null)
736 {
737 W_MuzzleFlash_Model(actor.exteriorweaponentity, thiswep.m_muzzlemodel);
738 W_MuzzleFlash_Model_AttachToShotorg(actor, weaponentity, actor.exteriorweaponentity.muzzle_flash, '5 0 0');
739 }
740 }
741
742 FOREACH_CLIENT(it == actor || (IS_SPEC(it) && it.enemy == actor),
743 {
744 if(!IS_REAL_CLIENT(it))
745 continue;
746 int channel = MSG_ONE;
747 msg_entity = it;
748 WriteHeader(channel, w_muzzleflash);
749 WriteByte(channel, thiswep.m_id);
750 WriteByte(channel, weaponslot(weaponentity));
751 WriteVector(channel, shotorg);
752 });
753}
vector shotorg
Definition aim.qh:10
vector shotdir
Definition aim.qh:11
entity m_muzzlemodel
M: flash model MDL_id_MUZZLEFLASH.
Definition weapon.qh:66
void Send_Effect_Except(entity eff, vector eff_loc, vector eff_vel, int eff_cnt, vector eff_col_min, vector eff_col_max, entity ignore)
Definition all.qc:105
#define IS_SPEC(v)
Definition utils.qh:10
#define FOREACH_CLIENT(cond, body)
Definition utils.qh:50
void W_MuzzleFlash_Model(entity wepent, entity muzzlemodel)
Definition all.qc:703
void W_MuzzleFlash_Model_AttachToShotorg(entity actor,.entity weaponentity, entity flash, vector offset)
Definition all.qc:655
int weaponslot(.entity weaponentity)
Definition weapon.qh:19

References entity(), FOREACH_CLIENT, IS_SPEC, Weapon::m_muzzlemodel, Send_Effect_Except(), shotdir, shotorg, vector, W_MuzzleFlash_Model(), W_MuzzleFlash_Model_AttachToShotorg(), and weaponslot().

Referenced by FireGrapplingHook(), W_Arc_Attack_Bolt(), W_Blaster_Attack(), W_Crylink_Attack(), W_Crylink_Attack2(), W_Devastator_Attack(), W_Electro_Attack_Bolt(), W_Electro_Attack_Orb(), W_Fireball_Attack1(), W_Fireball_Attack2(), W_Hagar_Attack(), W_Hagar_Attack2(), W_Hagar_Attack2_Load_Release(), W_HLAC_Attack(), W_HLAC_Attack2(), W_MachineGun_Attack(), W_MachineGun_Attack_Auto(), W_MachineGun_Attack_Burst(), W_MineLayer_Attack(), W_Mortar_Attack(), W_Mortar_Attack2(), W_OverkillHeavyMachineGun_Attack_Auto(), W_OverkillMachineGun_Attack_Auto(), W_OverkillRocketPropelledChainsaw_Attack(), W_Rifle_FireBullet(), W_RocketMinsta_Attack(), W_Seeker_Fire_Flac(), W_Seeker_Fire_Missile(), W_Shotgun_Attack(), W_Vaporizer_Attack(), and W_Vortex_Attack().

◆ W_MuzzleFlash_Model()

void W_MuzzleFlash_Model ( entity wepent,
entity muzzlemodel )

Definition at line 703 of file all.qc.

704{
705 if(wepent.muzzle_flash == NULL)
706 wepent.muzzle_flash = spawn();
707
708 entity flash = wepent.muzzle_flash;
709 setmodel(flash, muzzlemodel); // precision set below
710
711 flash.scale = 0.75;
713 flash.nextthink = time + 0.02;
714 flash.frame = 2;
715 flash.alpha = 0.75;
716 flash.angles_z = random() * 180;
717 flash.effects = EF_ADDITIVE | EF_FULLBRIGHT;
718 flash.owner = flash.realowner = wepent;
719
720#ifdef CSQC
721 flash.drawmask = MASK_NORMAL;
722#endif
723}
const float EF_ADDITIVE
const float EF_FULLBRIGHT
float time
#define spawn
float random(void)
#define setthink(e, f)
void W_MuzzleFlash_Model_Think(entity this)
Definition all.qc:687

References EF_ADDITIVE, EF_FULLBRIGHT, entity(), MASK_NORMAL, NULL, random(), setmodel, setthink, spawn, time, and W_MuzzleFlash_Model_Think().

Referenced by W_MuzzleFlash().

◆ W_MuzzleFlash_Model_AttachToShotorg()

void W_MuzzleFlash_Model_AttachToShotorg ( entity actor,
.entity weaponentity,
entity flash,
vector offset )

Definition at line 655 of file all.qc.

656{
657 flash.owner = actor;
658 flash.angles_z = random() * 360;
659
660 entity view = actor.(weaponentity);
661 entity exterior = actor.exteriorweaponentity;
662
663 if (view.oldorigin.x > 0)
664 {
665 setattachment(flash, exterior, "");
666 setorigin(flash, view.oldorigin + offset);
667 }
668 else
669 {
670 if (gettagindex(exterior, "shot")) setattachment(flash, exterior, "shot");
671 else setattachment(flash, exterior, "tag_shot");
672 setorigin(flash, offset);
673 }
674}

References entity(), gettagindex, random(), and vector.

Referenced by W_MuzzleFlash().

◆ W_MuzzleFlash_Model_Think()

void W_MuzzleFlash_Model_Think ( entity this)

Definition at line 687 of file all.qc.

688{
689 this.frame += 2;
690 this.scale *= 0.5;
691 this.alpha -= 0.25;
692 this.nextthink = time + 0.05;
693
694 if(this.alpha <= 0)
695 {
696 setthink(this, SUB_Remove);
697 this.nextthink = time;
698 this.realowner.muzzle_flash = NULL;
699 return;
700 }
701}
float alpha
Definition items.qc:13
float nextthink
void SUB_Remove(entity this)
Remove entity.
Definition defer.qh:13
float scale
Definition projectile.qc:14
entity realowner

References alpha, entity(), frame, nextthink, NULL, realowner, scale, setthink, SUB_Remove(), and time.

Referenced by W_MuzzleFlash_Model().

◆ W_NameWeaponOrder()

string W_NameWeaponOrder ( string order)

Definition at line 110 of file all.qc.

111{
113}
string mapPriorityList(string order, string(string) mapfunc)
Definition util.qc:642
string W_NameWeaponOrder_MapFunc(string s)
Definition all.qc:99

References mapPriorityList(), and W_NameWeaponOrder_MapFunc().

Referenced by XonoticWeaponsList_draw().

◆ W_NameWeaponOrder_MapFunc()

string W_NameWeaponOrder_MapFunc ( string s)

Definition at line 99 of file all.qc.

100{
101 int i = stof(s);
102 if (s == "0" || i)
103 {
104 entity wi = REGISTRY_GET(Weapons, i);
105 if (wi != WEP_Null) return wi.netname;
106 }
107 return s;
108}

References entity(), REGISTRY_GET, stof(), and Weapons.

Referenced by W_NameWeaponOrder().

◆ W_NumberWeaponOrder()

string W_NumberWeaponOrder ( string order)

◆ W_NumberWeaponOrder_MapFunc()

string W_NumberWeaponOrder_MapFunc ( string s)

Definition at line 114 of file all.qc.

115{
116 if (s == "0" || stof(s)) return s;
117 FOREACH(Weapons, it != WEP_Null && (it.netname == s || it.m_deprecated_netname == s), return ftos(i));
118 return s;
119}

References FOREACH, ftos(), stof(), and Weapons.

Referenced by W_NumberWeaponOrder().

◆ W_RandomWeapons()

WepSet W_RandomWeapons ( entity e,
WepSet remaining,
int n )

Definition at line 172 of file all.qc.

173{
174 WepSet result = '0 0 0';
175 for (int j = 0; j < n; ++j)
176 {
178 FOREACH(Weapons, it != WEP_Null, {
179 if (remaining & (it.m_wepset))
180 RandomSelection_AddEnt(it, 1, 1);
181 });
184 remaining &= ~WepSet_FromWeapon(w);
185 }
186 return result;
187}
entity result
Definition promise.qc:43
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
#define WepSet_FromWeapon(it)
Definition all.qh:46
vector WepSet
Definition weapon.qh:14

References entity(), FOREACH, RandomSelection_AddEnt, RandomSelection_chosen_ent, RandomSelection_Init(), result, Weapons, and WepSet_FromWeapon.

Referenced by MUTATOR_HOOKFUNCTION(), and MUTATOR_HOOKFUNCTION().

◆ W_Sound()

string W_Sound ( string w_snd)

Definition at line 225 of file all.qc.

226{
227 string output = strcat("weapons/", w_snd);
228 MUTATOR_CALLHOOK(WeaponSound, w_snd, output);
229 return M_ARGV(1, string);
230}

References M_ARGV, MUTATOR_CALLHOOK, and strcat().

◆ Weapon_whereis()

void Weapon_whereis ( Weapon this,
entity cl )

Definition at line 26 of file selection.qc.

27{
28 if (!autocvar_g_showweaponspawns) return;
29 IL_EACH(g_items, it.weapon == this.m_id && (!it.team || (it.ItemStatus & ITS_AVAILABLE)),
30 {
31 if (ITEM_IS_LOOT(it) && (autocvar_g_showweaponspawns < 2))
32 {
33 continue;
34 }
36 WP_Weapon,
37 -2, 0,
38 NULL, it.origin + ('0 0 1' * it.maxs.z) * 1.2,
39 cl, 0,
40 NULL, enemy,
41 0,
42 RADARICON_NONE
43 );
44 wp.wp_extra = this.m_id;
45 });
46}
const int ITS_AVAILABLE
Definition item.qh:65
#define IL_EACH(this, cond, body)
int autocvar_g_showweaponspawns
Definition selection.qh:6
IntrusiveList g_items
Definition items.qh:125
entity enemy
Definition sv_ctf.qh:153
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)

References autocvar_g_showweaponspawns, enemy, entity(), g_items, IL_EACH, ITS_AVAILABLE, NULL, and WaypointSprite_Spawn().

Referenced by client_hasweapon(), and NET_HANDLE().

◆ WepSet_GetFromStat()

WepSet WepSet_GetFromStat ( )

Definition at line 79 of file all.qc.

80 {
81 return STAT(WEAPONS);
82 }

References STAT.

Referenced by HUD_Weapons(), MUTATOR_HOOKFUNCTION(), and Scoreboard_AccuracyStats_Draw().

◆ WepSet_GetFromStat_InMap()

WepSet WepSet_GetFromStat_InMap ( )

Definition at line 83 of file all.qc.

84 {
85 return STAT(WEAPONSINMAP);
86 }

References STAT.

Referenced by Scoreboard_AccuracyStats_Draw().

◆ wframe_send()

void wframe_send ( entity actor,
entity weaponentity,
int wepframe,
float attackrate,
bool restartanim )

Definition at line 588 of file all.qc.

589{
590 if (!IS_REAL_CLIENT(actor)) return;
591 int channel = MSG_ONE;
592 msg_entity = actor;
593 WriteHeader(channel, wframe);
594 WriteByte(channel, wepframe);
595 WriteFloat(channel, attackrate);
596 WriteByte(channel, weaponslot(weaponentity.weaponentity_fld));
597 WriteByte(channel, restartanim);
598 WriteByte(channel, weaponentity.state);
599 WriteFloat(channel, weaponentity.weapon_nextthink);
600}
#define WriteHeader(to, id)
Definition net.qh:221
float MSG_ONE
Definition menudefs.qc:56
void WriteByte(float data, float dest, float desto)
entity msg_entity
Definition progsdefs.qc:63
#define IS_REAL_CLIENT(v)
Definition utils.qh:17

References entity(), IS_REAL_CLIENT, msg_entity, MSG_ONE, weaponslot(), wframe, WriteByte(), and WriteHeader.

Referenced by weapon_thinkf().

◆ WriteWepSet()

void WriteWepSet ( float dst,
WepSet w )

Definition at line 71 of file all.qc.

72 {
73 if (REGISTRY_MAX(Weapons) > 48) WriteInt72_t(dst, w);
74 else if (REGISTRY_MAX(Weapons) > 24) WriteInt48_t(dst, w);
75 else WriteInt24_t(dst, w.x);
76 }

References REGISTRY_MAX, and Weapons.

Variable Documentation

◆ W_FixWeaponOrder_BuildImpulseList_buf

float W_FixWeaponOrder_BuildImpulseList_buf[REGISTRY_MAX(Weapons)]

◆ W_FixWeaponOrder_BuildImpulseList_order

string W_FixWeaponOrder_BuildImpulseList_order