quakec/source/client/defs/fte.qc

2588 lines
187 KiB
C++
Raw Normal View History

2022-02-08 18:42:28 +00:00
/*
2024-01-10 21:33:06 +00:00
This file was generated by FTE Quake 6306M, dated Aug 24 2022.
2022-02-08 18:42:28 +00:00
This file can be regenerated by issuing the following command:
2024-01-10 21:33:06 +00:00
pr_dumpplatform -O csdefs -Tcs -Ffte
(Use the -help arg for a list of available args)
2022-02-08 18:42:28 +00:00
*/
#pragma noref 1
//#pragma flag enable logicops
2024-01-10 21:33:06 +00:00
#pragma warning error Q101 /*too many parms. The vanilla qcc didn't validate properly, hence why fteqcc normally treats it as a warning.*/
#pragma warning error Q105 /*too few parms. The vanilla qcc didn't validate properly, hence why fteqcc normally treats it as a warning.*/
#pragma warning error Q106 /*assignment to constant/lvalue. Define them as var if you want to initialise something.*/
#pragma warning error Q208 /*system crc unknown. Compatibility goes out of the window if you disable this.*/
#pragma warning enable F301 /*non-utf-8 strings. Think of the foreigners! Also think of text editors that insist on screwing up your char encodings.*/
#pragma warning enable F302 /*uninitialised locals. They usually default to 0 in qc (except in recursive functions), but its still probably a bug*/
#pragma target FTE
#define FTEDEP DEP
2022-02-08 18:42:28 +00:00
#ifndef CSQC
2024-01-10 21:33:06 +00:00
#define CSQC
#endif
#define DEP_CSQC DEP
#ifndef DEP
#define DEP __deprecated //predefine this if you want to avoid our deprecation warnings.
#endif
#ifndef FTEDEP
#define FTEDEP(reason) //for symbols deprecated in FTE that may still be useful/required for other engines
2022-02-08 18:42:28 +00:00
#endif
#define BX_COLOREDTEXT
#define DP_CON_SET /* The 'set' console command exists, and can be used to create/set cvars. */
#define DP_CON_SETA /* The 'seta' console command exists, like the 'set' command, but also marks the cvar for archiving, allowing it to be written into the user's config. Use this command in your default.cfg file. */
2024-01-10 21:33:06 +00:00
#define DP_CSQC_ROTATEMOVES
2022-02-08 18:42:28 +00:00
#define DP_EF_ADDITIVE
2024-01-10 21:33:06 +00:00
#define DP_ENT_ALPHA
2022-02-08 18:42:28 +00:00
#define DP_EF_BLUE
#define DP_EF_FULLBRIGHT
#define DP_EF_NODEPTHTEST
#define DP_EF_NODRAW
#define DP_EF_NOGUNBOB
#define DP_EF_NOSHADOW
#define DP_EF_RED
2024-01-10 21:33:06 +00:00
#define DP_ENT_COLORMOD
2022-02-08 18:42:28 +00:00
#define DP_ENT_CUSTOMCOLORMAP
#define DP_ENT_EXTERIORMODELTOCLIENT
2024-01-10 21:33:06 +00:00
#define DP_ENT_SCALE
2022-02-08 18:42:28 +00:00
#define DP_ENT_TRAILEFFECTNUM /* self.traileffectnum=particleeffectnum("myeffectname"); can be used to attach a particle trail to the given server entity. This is equivelent to calling trailparticles each frame. */
#define DP_ENT_VIEWMODEL
#define DP_GECKO_SUPPORT
2024-01-10 21:33:06 +00:00
#define DP_GFX_FONTS
#define DP_GFX_QUAKE3MODELTAGS
2022-02-08 18:42:28 +00:00
#define DP_GFX_SKINFILES
#define DP_GFX_SKYBOX
2024-01-10 21:33:06 +00:00
#define DP_HALFLIFE_MAP
2022-02-08 18:42:28 +00:00
#define DP_HALFLIFE_MAP_CVAR
#define DP_INPUTBUTTONS
#define DP_LIGHTSTYLE_STATICVALUE
#define DP_LITSUPPORT
#define DP_MONSTERWALK /* MOVETYPE_WALK is valid on non-player entities. Note that only players receive acceleration etc in line with none/bounce/fly/noclip movetypes on the player, thus you will have to provide your own accelerations (incluing gravity) yourself. */
#define DP_MOVETYPEBOUNCEMISSILE
#define DP_MOVETYPEFOLLOW
#define DP_QC_ASINACOSATANATAN2TAN
#define DP_QC_CHANGEPITCH
#define DP_QC_COPYENTITY
#define DP_QC_CRC16
#define DP_QC_CVAR_DEFSTRING
#define DP_QC_CVAR_STRING
#define DP_QC_CVAR_TYPE
2024-01-10 21:33:06 +00:00
#define DP_QC_DIGEST_SHA256
2022-02-08 18:42:28 +00:00
#define DP_QC_EDICT_NUM
#define DP_QC_ENTITYDATA
#define DP_QC_ETOS
#define DP_QC_FINDCHAIN
#define DP_QC_FINDCHAINFLOAT
#define DP_QC_FINDFLAGS
#define DP_QC_FINDCHAINFLAGS
#define DP_QC_FINDFLOAT
#define DP_QC_FS_SEARCH
2024-01-10 21:33:06 +00:00
#define DP_QC_FS_SEARCH_PACKFILE
#define DP_QC_GETLIGHT
2022-02-08 18:42:28 +00:00
#define DP_QC_GETSURFACE
#define DP_QC_GETSURFACEPOINTATTRIBUTE
2024-01-10 21:33:06 +00:00
#define DP_QC_GETTAGINFO
#define DP_QC_I18N /* Specifies that the engine uses $MODULE.dat.$LANG.po files that translates the dotranslate_* globals on load - these are usually created via the _("foo") qcc intrinsic. */
2022-02-08 18:42:28 +00:00
#define DP_QC_MINMAXBOUND
#define DP_QC_MULTIPLETEMPSTRINGS /* Superseded by DP_QC_UNLIMITEDTEMPSTRINGS. Functions that return a temporary string will not overwrite/destroy previous temporary strings until at least 16 strings are returned (or control returns to the engine). */
#define DP_QC_RANDOMVEC
#define DP_QC_RENDER_SCENE /* clearscene+addentity+setviewprop+renderscene+setmodel are available to menuqc. WARNING: DP advertises this extension without actually supporting it, FTE does actually support it. */
#define DP_QC_SINCOSSQRTPOW
#define DP_QC_SPRINTF /* Provides the sprintf builtin, which allows for rich formatting along the lines of C's function with the same name. Not to be confused with QC's sprint builtin. */
#define DP_QC_STRFTIME
#define DP_QC_STRING_CASE_FUNCTIONS
#define DP_QC_STRINGBUFFERS
#define DP_QC_STRINGCOLORFUNCTIONS
#define DP_QC_STRREPLACE
#define DP_QC_TOKENIZEBYSEPARATOR
#define DP_QC_TRACEBOX
#define DP_QC_TRACETOSS
#define DP_QC_TRACE_MOVETYPE_HITMODEL
#define DP_QC_TRACE_MOVETYPE_WORLDONLY
#define DP_QC_TRACE_MOVETYPES
#define DP_QC_UNLIMITEDTEMPSTRINGS /* Supersedes DP_QC_MULTIPLETEMPSTRINGS, superseded by FTE_QC_PERSISTENTTEMPSTRINGS. Specifies that all temp strings will be valid at least until the QCVM returns. */
#define DP_QC_URI_ESCAPE
#define DP_QC_URI_GET
#define DP_QC_URI_POST
#define DP_QC_VECTOANGLES_WITH_ROLL
#define DP_QC_VECTORVECTORS
#define DP_QC_WHICHPACK
#define DP_QUAKE2_MODEL
#define DP_QUAKE2_SPRITE
2024-01-10 21:33:06 +00:00
#define DP_QUAKE3_MAP
2022-02-08 18:42:28 +00:00
#define DP_QUAKE3_MODEL
#define DP_REGISTERCVAR
#define DP_SND_SOUND7_WIP2
#define DP_SND_STEREOWAV
#define DP_SND_OGGVORBIS
#define DP_SOLIDCORPSE
#define DP_SPRITE32
#define DP_SV_BOTCLIENT
2024-01-10 21:33:06 +00:00
#define DP_SV_CLIENTCAMERA /* Works like svc_setview except also handles pvs. */
2022-02-08 18:42:28 +00:00
#define DP_SV_CLIENTCOLORS /* Provided only for compatibility with DP. */
#define DP_SV_CLIENTNAME /* Provided only for compatibility with DP. */
2024-01-10 21:33:06 +00:00
#define DP_SV_CUSTOMIZEENTITYFORCLIENT /* Deprecated feature for compat with DP. Can be slow, incompatible with splitscreen, usually malfunctions with mvds. */
2022-02-08 18:42:28 +00:00
#define DP_SV_DRAWONLYTOCLIENT
#define DP_SV_DROPCLIENT /* Equivelent to quakeworld's stuffcmd(self,"disconnect\n"); hack */
#define DP_SV_EFFECT
#define DP_SV_EXTERIORMODELFORCLIENT
#define DP_SV_NODRAWTOCLIENT
#define DP_SV_PLAYERPHYSICS /* Allows reworking parts of NQ player physics. USE AT OWN RISK - this necessitates NQ physics and is thus guarenteed to break prediction. */
#define DP_SV_POINTSOUND
#define DP_SV_PRECACHEANYTIME /* Specifies that the various precache builtins can be called at any time. WARNING: precaches are sent reliably while sound events, modelindexes, and particle events are not. This can mean sounds and particles might not work the first time around, or models may take a while to appear (after the reliables are received and the model is loaded from disk). Always attempt to precache a little in advance in order to reduce these issues (preferably at the start of the map...) */
2024-01-10 21:33:06 +00:00
#define DP_SV_PRINT /* Says that the print builtin can be used from nqssqc (as well as just csqc), bypassing the developer cvar issues. */
#define DP_SV_ROTATINGBMODEL /* Engines that support this support avelocity on MOVETYPE_PUSH entities, pushing entities out of the way as needed. */
2022-02-08 18:42:28 +00:00
#define DP_SV_SETCOLOR
2024-01-10 21:33:06 +00:00
#define DP_SV_SHUTDOWN
2022-02-08 18:42:28 +00:00
#define DP_SV_SPAWNFUNC_PREFIX
#define DP_SV_WRITEPICTURE
#define DP_SV_WRITEUNTERMINATEDSTRING
#define DP_TE_BLOOD
#define DP_TE_CUSTOMFLASH
#define DP_TE_EXPLOSIONRGB
#define DP_TE_PARTICLECUBE
#define DP_TE_PARTICLERAIN
#define DP_TE_PARTICLESNOW
#define DP_TE_SMALLFLASH
#define DP_TE_SPARK
#define DP_TE_STANDARDEFFECTBUILTINS
#define DP_VIEWZOOM
#define EXT_BITSHIFT
2024-01-10 21:33:06 +00:00
#define EXT_CSQC
#define EXT_CSQC_SHARED
2022-02-08 18:42:28 +00:00
#define EXT_DIMENSION_VISIBILITY
#define EXT_DIMENSION_PHYSICS
#define EXT_DIMENSION_GHOST
#define FRIK_FILE
#define FTE_CALLTIMEOFDAY /* Replication of mvdsv functionality (call calltimeofday to cause 'timeofday' to be called, with arguments that can be saved off to a global). Generally strftime is simpler to use. */
#define FTE_CSQC_ALTCONSOLES /* The engine tracks multiple consoles. These may or may not be directly visible to the user. */
#define FTE_CSQC_BASEFRAME /* Specifies that .basebone, .baseframe2, .baselerpfrac, baseframe1time, etc exist in csqc. These fields affect all bones in the entity's model with a lower index than the .basebone field, allowing you to give separate control to the legs of a skeletal model, without affecting the torso animations. */
#define FTE_CSQC_HALFLIFE_MODELS
#define FTE_CSQC_SERVERBROWSER /* Provides builtins to query the engine's serverbrowser servers list from ssqc. Note that these builtins are always available in menuqc. */
#define FTE_CSQC_SKELETONOBJECTS /* Provides container objects for skeletal bone data, which can be modified on a per bone basis if needed. This allows you to dynamically generate animations (or just blend them with greater customisation) instead of being limited to a single animation or two. */
#define FTE_CSQC_RAWIMAGES /* Provides raw rgba image access to csqc. With this, the csprogs can read textures into qc-accessible memory, modify it, and then upload it to the renderer. */
#define FTE_CSQC_RENDERTARGETS /* VF_RT_DESTCOLOUR exists and can be used to redirect any rendering to a texture instead of the screen. */
#define FTE_CSQC_REVERB /* Specifies that the mod can create custom reverb effects. Whether they will actually be used or not depends upon the sound driver. */
#define FTE_CSQC_WINDOWCAPTION /* Provides csqc with the ability to change the window caption as displayed when running windowed or in the task bar when switched out. */
#define FTE_ENT_SKIN_CONTENTS /* self.skin = CONTENTS_WATER; makes a brush entity into water. use -16 for a ladder. */
#define FTE_ENT_UNIQUESPAWNID
#define FTE_EXTENDEDTEXTCODES
#define FTE_FORCESHADER /* Allows csqc to override shaders on models with an explicitly named replacement. Also allows you to define shaders with a fallback if it does not exist on disk. */
#define FTE_FORCEINFOKEY /* Provides an easy way to change a user's userinfo from the server. */
#define FTE_GFX_QUAKE3SHADERS /* specifies that the engine has full support for vanilla quake3 shaders */
#define FTE_GFX_REMAPSHADER /* With the raw power of stuffcmds, the r_remapshader console command is exposed! This mystical command can be used to remap any shader to another. Remapped shaders that specify $diffuse etc in some form will inherit the textures implied by the surface. */
2024-01-10 21:33:06 +00:00
#define FTE_GFX_IQM_HITMESH /* Supports hitmesh iqm extensions. Also supports geomsets and embedded events. */
#define FTE_GFX_MODELEVENTS /* Provides a query for per-animation events in model files, including from progs/foo.mdl.events files. */
2022-02-08 18:42:28 +00:00
#define FTE_ISBACKBUFFERED /* Allows you to check if a client has too many reliable messages pending. */
#define FTE_MEMALLOC /* Allows dynamically allocating memory. Use pointers to access this memory. Memory will not be saved into saved games. */
#define FTE_MEDIA_CIN /* playfilm command supports q2 cin files. */
#define FTE_MEDIA_ROQ /* playfilm command supports q3 roq files. */
#define FTE_MULTIPROGS /* Multiple progs.dat files can be loaded inside the same qcvm. Insert new ones with addprogs inside the 'init' function, and use externvalue+externset to rewrite globals (and hook functions) to link them together. Note that the result is generally not very clean unless you carefully design for it beforehand. */
#define FTE_MULTITHREADED /* Faux multithreading, allowing multiple contexts to run in sequence. */
#define FTE_MVD_PLAYERSTATS /* In csqc, getplayerstat can be used to query any player's stats when playing back MVDs. isdemo will return 2 in this case. */
2024-01-10 21:33:06 +00:00
#define FTE_PART_SCRIPT /* Specifies that the r_particledesc cvar can be used to select a list of particle effects to load from particles/foo.cfg, the format of which is documented elsewhere. */
2022-02-08 18:42:28 +00:00
#define FTE_PART_NAMESPACES /* Specifies that the engine can use foo.bar to load effect foo from particle description bar. When used via ssqc, this should cause the client to download whatever effects as needed. */
#define FTE_PART_NAMESPACE_EFFECTINFO /* Specifies that effectinfo.bar can load effects from effectinfo.txt for DP compatibility. */
2024-01-10 21:33:06 +00:00
#define FTE_PEXT_SETVIEW /* NQ's svc_setview works correctly even in quakeworld */
#define FTE_PEXT_LIGHTSTYLECOL
#define FTE_PEXT_VIEW2
#define FTE_PEXT_FATNESS
#define FTE_PEXT_TE_BULLET
#define FTE_PEXT_FLOATCOORDS
#define FTE_PEXT_Q2BSP /* Specifies that the client supports q2bsps. */
#define FTE_PEXT_Q3BSP /* Specifies that the client supports q3bsps. */
#define FTE_HEXEN2
#define FTE_PEXT_SPAWNSTATIC
#define FTE_PEXT_CUSTOMTENTS
#define FTE_PEXT_256PACKETENTITIES /* Specifies that the client is not limited to vanilla's limit of only 64 ents visible at once. */
2022-02-08 18:42:28 +00:00
#define FTE_QC_BASEFRAME /* Specifies that .basebone and .baseframe exist in ssqc. These fields affect all bones in the entity's model with a lower index than the .basebone field, allowing you to give separate control to the legs of a skeletal model, without affecting the torso animations, from ssqc. */
#define FTE_QC_FILE_BINARY /* Extends FRIK_FILE with binary read+write, as well as allowing seeking. Requires pointers. */
#define FTE_QC_CHANGELEVEL_HUB /* Adds an extra argument to changelevel which is carried over to the next map in the 'spawnspot' global. Maps will be saved+reloaded until the extra argument is omitted again, purging all saved maps. Saved games will contain a copy of each preserved map. parm1-parm64 globals can be used, giving more space to transfer more player data. */
#define FTE_QC_CHECKCOMMAND /* Provides a way to test if a console command exists, and whether its a command/alias/cvar. Does not say anything about the expected meanings of any arguments or values. */
#define FTE_QC_CHECKPVS
#define FTE_QC_CROSSPRODUCT
2024-01-10 21:33:06 +00:00
#define FTE_QC_CUSTOMSKINS /* The engine supports the use of q3 skins, as well as the use of such skin 'files' to specify rich top+bottom colours, qw skins, geomsets, or texture composition even on non-players.. */
#define FTE_QC_DIGEST_SHA1 /* The digest_hex builtin supports 160-bit sha1 hashes. */
#define FTE_QC_DIGEST_SHA224 /* The digest_hex builtin supports 224-bit sha2 hashes. */
#define FTE_QC_DIGEST_SHA384 /* The digest_hex builtin supports 384-bit sha2 hashes. */
#define FTE_QC_DIGEST_SHA512 /* The digest_hex builtin supports 512-bit sha2 hashes. */
2022-02-08 18:42:28 +00:00
#define FTE_QC_FS_SEARCH_SIZEMTIME
#define FTE_QC_HARDWARECURSORS /* setcursormode exists in both csqc+menuqc, and accepts additional arguments to specify a cursor image to use when this module has focus. If the image exceeds hardware limits (or hardware cursors are unsupported), it will be emulated using regular draws - this at least still avoids conflicting cursors as only one will ever be used, even if console+menu+csqc are all overlayed. */
#define FTE_QC_HASHTABLES /* Provides efficient string-based lookups. */
#define FTE_QC_INFOKEY /* QuakeWorld's infokey builtin works, and reports at least name+topcolor+bottomcolor+ping(in ms)+ip(unmasked, but not always ipv4)+team(aka bottomcolor in nq). Does not require actual localinfo/serverinfo/userinfo, but they're _highly_ recommended to any engines with csqc */
#define FTE_QC_INTCONV /* Provides string<>int conversions, including hex representations. */
#define FTE_QC_MATCHCLIENTNAME
#define FTE_QC_MULTICAST /* QuakeWorld's multicast builtin works along with MSG_MULTICAST, but also with unicast support. */
#define FTE_QC_PAUSED
#define FTE_QC_PERSISTENTTEMPSTRINGS /* Supersedes DP_QC_MULTIPLETEMPSTRINGS. Temp strings are garbage collected automatically, and do not expire while they're still in use. This makes strzone redundant. */
#define FTE_QC_RAGDOLL_WIP
#define FTE_QC_SENDPACKET /* Allows the use of out-of-band udp packets to/from other hosts. Includes the SV_ParseConnectionlessPacket event. */
#define FTE_QC_STUFFCMDFLAGS /* Variation on regular stuffcmd that gives control over how spectators/mvds should be treated. */
#define FTE_QC_TRACETRIGGER
#define FTE_QUAKE2_CLIENT /* This engine is able to act as a quake2 client */
#define FTE_QUAKE2_SERVER /* This engine is able to act as a quake2 server */
#define FTE_QUAKE3_CLIENT /* This engine is able to act as a quake3 client */
#define FTE_QUAKE3_SERVER /* This engine is able to act as a quake3 server */
2024-01-10 21:33:06 +00:00
#define FTE_SOLID_BSPTRIGGER /* Allows for mappers to use shaped triggers instead of being limited to axially aligned triggers. */
2022-02-08 18:42:28 +00:00
#define FTE_SOLID_LADDER /* Allows a simple trigger to remove effects of gravity (solid 20). obsolete. will prolly be removed at some point as it is not networked properly. Use FTE_ENT_SKIN_CONTENTS */
2024-01-10 21:33:06 +00:00
#define FTE_SPLITSCREEN /* Client supports splitscreen, controlled via cl_splitscreen. Servers require allow_splitscreen 1 if splitscreen is to be used over the internet. Mods that use csqc will need to be aware for this to work properly. per-client networking may be problematic. */
2022-02-08 18:42:28 +00:00
#define FTE_SQL /* Provides sql* builtins which can be used for sql database access */
#define FTE_SQL_SQLITE /* SQL functionality is able to utilise sqlite databases */
#define FTE_STRINGS /* Extra builtins (and additional behaviour) to make string manipulation easier */
#define FTE_SV_POINTPARTICLES /* Specifies that particleeffectnum, pointparticles, and trailparticles exist in ssqc as well as csqc. particleeffectnum acts as a precache, allowing ssqc values to be networked up with csqc for use. Use in combination with FTE_PART_SCRIPT+FTE_PART_NAMESPACES to use custom effects. This extension is functionally identical to the DP version, but avoids any misplaced assumptions about the format of the client's particle descriptions. */
#define FTE_SV_REENTER
#define FTE_TE_STANDARDEFFECTBUILTINS /* Provides builtins to replace writebytes, with a QW compatible twist. */
#define FTE_TERRAIN_MAP /* This engine supports .hmp files, as well as terrain embedded within bsp files. */
#define FTE_RAW_MAP /* This engine supports directly loading .map files, as well as realtime editing of the various brushes. */
2024-01-10 21:33:06 +00:00
#define FTE_INFOBLOBS /* Removes the length limits on user/server/local info strings, and allows embedded nulls and other otherwise-reserved characters. This can be used to network avatar images and the like, or other binary data. */
#define FTE_VRINPUTS /* input_weapon, input_left_*, input_right_*, input_head_* work, both in csqc (as inputs with suitable plugin/hardware support) and ssqc (available in PlayerPreThink). */
2022-02-08 18:42:28 +00:00
#define KRIMZON_SV_PARSECLIENTCOMMAND /* SSQC's SV_ParseClientCommand function is able to handle client 'cmd' commands. The tokenizing parts also work in csqc. */
#define NEH_CMD_PLAY2
#define NEH_RESTOREGAME
#define QSG_CVARSTRING
#define QW_ENGINE
#define QWE_MVD_RECORD /* You can use the easyrecord command to record MVD demos serverside. */
#define TEI_MD3_MODEL
2024-01-10 21:33:06 +00:00
#define TEI_SHOWLMP2
2022-02-08 18:42:28 +00:00
#define TENEBRAE_GFX_DLIGHTS /* Allows ssqc to attach rtlights to entities with various special properties. */
#define ZQ_MOVETYPE_FLY /* MOVETYPE_FLY works on players. */
#define ZQ_MOVETYPE_NOCLIP /* MOVETYPE_NOCLIP works on players. */
#define ZQ_MOVETYPE_NONE /* MOVETYPE_NONE works on players. */
#define ZQ_VWEP
#define ZQ_QC_STRINGS /* The strings-only subset of FRIK_FILE is supported. */
#ifdef _ACCESSORS
accessor strbuf : float;
accessor searchhandle : float;
accessor hashtable : float;
accessor infostring : string;
accessor filestream : float;
accessor filestream : float;
#else
#define strbuf float
#define searchhandle float
#define hashtable float
#define infostring string
#define filestream float
#endif
entity self; /* The magic me */
entity other; /* Valid in touch functions, this is the entity that we touched. */
entity world; /* The null entity. Hurrah. Readonly after map spawn time. */
float time; /* The current game time. Stops when paused. */
float cltime; /* A local timer that ticks relative to local time regardless of latency, packetloss, or pause. */
float frametime; /* The time since the last physics/render/input frame. */
float player_localentnum; /* This is entity number the player is seeing from/spectating, or the player themself, can change mid-map. */
float player_localnum; /* The 0-based player index, valid for getplayerkeyvalue calls. */
float maxclients; /* Maximum number of player slots on the server. */
float clientcommandframe; /* This is the input-frame sequence. frames < clientcommandframe have been sent to the server. frame==clientcommandframe is still being generated and can still change. */
float servercommandframe; /* This is the input-frame that was last acknowledged by the server. Input frames greater than this should be applied to the player's entity. */
string mapname; /* The short name of the map. */
float intermission;
2024-01-10 21:33:06 +00:00
vector v_forward;
vector v_up;
vector v_right;
2022-02-08 18:42:28 +00:00
vector view_angles; /* +x=DOWN */
2024-01-10 21:33:06 +00:00
float trace_allsolid;
float trace_startsolid;
float trace_fraction;
vector trace_endpos;
vector trace_plane_normal;
2022-02-08 18:42:28 +00:00
float trace_plane_dist;
entity trace_ent;
float trace_inopen;
float trace_inwater;
float input_timelength;
vector input_angles; /* +x=DOWN */
vector input_movevalues;
float input_buttons;
float input_impulse;
void end_sys_globals;
.float modelindex; /* This is the model precache index for the model that was set on the entity, instead of having to look up the model according to the .model field. Use setmodel to change it. */
.vector absmin; /* Set by the engine when the entity is relinked (by setorigin, setsize, or setmodel). This is in world coordinates. */
.vector absmax; /* Set by the engine when the entity is relinked (by setorigin, setsize, or setmodel). This is in world coordinates. */
.float entnum; /* The entity number as its known on the server. */
.float drawmask; /* Acts as a filter in the addentities call. */
.float() predraw; /* Called by addentities after the filter and before the entity is actually drawn. Do your interpolation and animation in here. Should return one of the PREDRAW_* constants. */
.float movetype; /* Describes how the entity moves. One of the MOVETYPE_ constants. */
.float solid; /* Describes whether the entity is solid or not, and any special properties infered by that. Must be one of the SOLID_ constants */
.vector origin; /* The current location of the entity in world space. Inline bsp entities (ie: ones placed by a mapper) will typically have a value of '0 0 0' in their neutral pose, as the geometry is offset from that. It is the reference point of the entity rather than the center of its geometry, for non-bsp models, this is often not a significant distinction. */
.vector oldorigin; /* This is often used on players to reset the player back to where they were last frame if they somehow got stuck inside something due to fpu precision. Never change a player's oldorigin field to inside a solid, because that might cause them to become pemanently stuck. */
.vector velocity; /* The direction and speed that the entity is moving in world space. */
.vector angles; /* The eular angles the entity is facing in, in pitch, yaw, roll order. Due to a legacy bug, mdl/iqm/etc formats use +x=UP, bsp/spr/etc formats use +x=DOWN. */
.vector avelocity; /* The amount the entity's angles change by per second. Note that this is direct eular angles, and thus the angular change is non-linear and often just looks buggy if you're changing more than one angle at a time. */
.float pmove_flags;
.string classname; /* Identifies the class/type of the entity. Useful for debugging, also used for loading, but its value is not otherwise significant to the engine, this leaves the mod free to set it to whatever it wants and randomly test strings for values in whatever inefficient way it chooses fit. */
.float renderflags;
.string model; /* The model name that was set via setmodel, in theory. Often, this is cleared to null to prevent the engine from being seen by clients while not changing modelindex. This behaviour allows inline models to remain solid yet be invisible. */
.float frame; /* The current frame the entity is meant to be displayed in. In CSQC, note the lerpfrac and frame2 fields as well. if it specifies a framegroup, the framegroup will autoanimate in ssqc, but not in csqc. */
.float frame1time; /* The absolute time into the animation/framegroup specified by .frame. */
.float frame2; /* The alternative frame. Visible only when lerpfrac is set to 1. */
.float frame2time; /* The absolute time into the animation/framegroup specified by .frame2. */
.float lerpfrac; /* If 0, use frame1 only. If 1, use frame2 only. Mix them together for values between. */
.float skin; /* The skin index to use. on a bsp entity, setting this to 1 will switch to the 'activated' texture instead. A negative value will be understood as a replacement contents value, so setting it to CONTENTS_WATER will make a movable pool of water. */
.float effects; /* Lots of random flags that change random effects. See EF_* constants. */
.vector mins; /* The minimum extent of the model (ie: the bottom-left coordinate relative to the entity's origin). Change via setsize. May also be changed by setmodel. */
.vector maxs; /* like mins, but in the other direction. */
.vector size; /* maxs-mins. Updated when the entity is relinked (by setorigin, setsize, setmodel) */
.void() touch;
.void() think;
.void() blocked;
.float nextthink; /* The time at which the entity is next scheduled to fire its think event. For MOVETYPE_PUSH entities, this is relative to that entity's ltime field, for all other entities it is relative to the time gloal. */
.entity chain;
.entity enemy;
.float flags;
.float colormap;
.entity owner;
void end_sys_fields;
2024-01-10 21:33:06 +00:00
float input_sequence; /* This is the client-generated input sequence number. 0 for unsequenced movements. */
float input_servertime; /* Server's timestamp of the client's interpolation state. */
2022-02-08 18:42:28 +00:00
int trace_endcontents;
int trace_surfaceflags;
int trace_brush_id;
int trace_brush_faceid;
int trace_surface_id; /* 1-based. 0 if not known. */
int trace_bone_id; /* 1-based. 0 if not known. typically needs MOVE_HITMODEL. */
int trace_triangle_id; /* 1-based. 0 if not known. */
2024-01-10 21:33:06 +00:00
float trace_networkentity; /* Repots which ssqc entnum was hit when a csqc traceline impacts an ssqc-based brush entity. */
vector pmove_org; /* Reports the origin of the engineside player (after prediction). Does not work when the player is a csqc-owned entity. */
vector pmove_vel; /* Reports the velocity of the engineside player (after prediction). Does not work when the player is a csqc-owned entity. */
float pmove_onground; /* Reports the onground state of the engineside player (after prediction). Does not work when the player is a csqc-owned entity. */
2022-02-08 18:42:28 +00:00
vector global_gravitydir = '0 0 -1'; /* The direction gravity should act in if not otherwise specified per entity. */
int serverid; /* The unique id of this server within the server cluster. */
2024-01-10 21:33:06 +00:00
.string message; /* Allows the csqc to read the map description from the server. */
2022-02-08 18:42:28 +00:00
.vector punchangle;
2024-01-10 21:33:06 +00:00
.float gravity; /* Multiplier applied in addition to sv_gravity (not absolute units), to control the gravity affecting this entity specifically. */
2022-02-08 18:42:28 +00:00
.float hull; /* Overrides the hull used by the entity for walkmove/movetogoal and not traceline/tracebox. */
.entity movechain; /* This is a linked list of entities which will be moved whenever this entity moves, logically they are attached to this entity. */
.void() chainmoved; /* Called when the entity is moved as a result of being part of another entity's .movechain */
.void(float old, float new) contentstransition; /* This function is called when the entity moves between water and air. If specified, default splash sounds will be disabled allowing you to provide your own. */
2024-01-10 21:33:06 +00:00
.float dimension_solid; /* This is the bitmask of dimensions which the entity is solid within. This is not networked, instead csqc traces impacting ssqc entities assumes the ssqc entity to have a dimension_solid of 1. */
2022-02-08 18:42:28 +00:00
.float dimension_hit; /* This is the bitmask of dimensions which the entity will be blocked by. If other.dimension_solid & self.dimension_hit, our traces will impact and not proceed. If its false, the traces will NOT impact, allowing self to pass straight through. */
2024-01-10 21:33:06 +00:00
.int hitcontentsmaski; /* Traces performed for this entity will impact against surfaces that match this contents mask (CONTENTBITS_* constants). */
__deprecated("Does not support mod-specific contents.") .float dphitcontentsmask; /* Some crappy field that inefficiently requires translating to the native contents flags. Ditch the 'dp', do it properly. */
2022-02-08 18:42:28 +00:00
.float scale; /* Multiplier that resizes the entity. 1 is normal sized, 2 is double sized. scale 0 is remapped to 1. In SSQC, this is limited to 1/16th precision, with a maximum just shy of 16. */
.float fatness; /* How many QuakeUnits to push the entity's verticies along their normals by. */
.float alpha; /* The transparency of the entity. 1 means opaque, 0.0001 means virtually invisible. 0 is remapped to 1, for compatibility. */
.float modelflags; /* Used to override the flags set in the entity's model. Should be set according to the MF_ constants. Use effects|=EF_NOMODELFLAGS to ignore the model's flags completely. The traileffectnum field is more versatile. */
.float basebone; /* The base* frame animations are equivelent to their non-base versions, except that they only affect bone numbers below the 'basebone' value. This means that the base* animation can affect the legs of a skeletal model independantly of the normal animation fields affecting the torso area. For more complex animation than this, use skeletal objects. */
.float baseframe; /* See basebone */
.void() customphysics; /* Called once each physics frame, overriding the entity's .movetype field and associated logic. You'll probably want to use tracebox to move it through the world. Be sure to call .think as appropriate. */
2024-01-10 21:33:06 +00:00
.entity tag_entity; /* Specifies which entity this entity's origin+angles is 'attached' to. */
.float tag_index; /* Specifies the tag or bone on the parent entity that we're attached to. If this is -1 then the entity is instead a q3-like camera portal, with the tag_entity saying the entity to display for. If tag_entity is world then this is a q3-like portal surface marker with a separate camera (with a tag_entity referring to the portal surface). */
2022-02-08 18:42:28 +00:00
.float skeletonindex; /* This object serves as a container for the skeletal bone states used to override the animation data. */
2024-01-10 21:33:06 +00:00
.vector colormod; /* Provides a colour tint for the entity (does not affect fullbrights). */
.vector glowmod; /* Scaler for an entity's fullbright textures. */
2022-02-08 18:42:28 +00:00
.vector gravitydir; /* Specifies the direction in which gravity acts. Must be normalised. '0 0 0' also means down. Use '0 0 1' if you want the player to be able to run on ceilings. */
2024-01-10 21:33:06 +00:00
.vector(vector org, vector ang) camera_transform; /* A callback that provides portal transform information for portal surfaces attached to this entity. Also used to open up pvs in ssqc. */
2022-02-08 18:42:28 +00:00
.float geomtype;
.float friction;
.float erp;
.float jointtype;
.float mass;
.float bouncefactor;
.float bouncestop;
.float idealpitch;
.float pitch_speed;
.float drawflags; /* Various flags that affect lighting values and scaling. Typically set to 96 in quake for proper compatibility with DP_QC_SCALE. */
.float abslight; /* Allows overriding light levels. Use drawflags to state that this field should actually be used. */
.vector color; /* This affects the colour of realtime lights that were enabled via the pflags field. */
.float light_lev; /* This is the radius of an entity's light. This is not normally used by the engine, but is used for realtime lights (ones that are enabled with the pflags field). */
.float style; /* Used by the light util to decide how an entity's light should animate. On an entity with pflags set, this also affects realtime lights. */
.float pflags; /* Realtime lighting flags */
.float frame3; /* Some people just don't understand how to use framegroups... */
2024-01-10 21:33:06 +00:00
.float frame3time; /* .frame3 equivelent of frame1time. */
.float lerpfrac3; /* Weight of .frame3 - .frame's weight is automatically calculated as 1-(lerpfrac+lerpfrac3+lerpfrac4), as a result these fields should NEVER add to above 1. */
2022-02-08 18:42:28 +00:00
.float frame4;
2024-01-10 21:33:06 +00:00
.float frame4time; /* .frame4 equivelent of frame1time. */
2022-02-08 18:42:28 +00:00
.float lerpfrac4;
.float forceshader; /* Contains a shader handle used to replace all surfaces upon the entity. */
.float baseframe2; /* See basebone */
.float baseframe1time; /* See basebone */
.float baseframe2time; /* See basebone */
.float baselerpfrac; /* See basebone */
.float bonecontrol1; /* Halflife model format bone controller. On player models, this typically affects the spine's yaw. */
.float bonecontrol2; /* Halflife model format bone controller. On player models, this typically affects the spine's yaw. */
.float bonecontrol3; /* Halflife model format bone controller. On player models, this typically affects the spine's yaw. */
.float bonecontrol4; /* Halflife model format bone controller. On player models, this typically affects the spine's yaw. */
.float bonecontrol5; /* Halflife model format bone controller. This typically affects the mouth. */
2024-01-10 21:33:06 +00:00
.float subblendfrac; /* Weird animation value specific to halflife models. On player models, this typically affects the spine's pitch, or yaw, or... */
.float subblend2frac; /* Weird animation value specific to halflife models. I've no idea what this does, probably nothing for most models. */
2022-02-08 18:42:28 +00:00
.float basesubblendfrac; /* See basebone */
2024-01-10 21:33:06 +00:00
.float basesubblend2frac; /* See basebone */
void(float reqid, float responsecode, string resourcebody, int resourcebytes) URI_Get_Callback; /* Called as an eventual result of the uri_get builtin. */
2022-02-08 18:42:28 +00:00
void(float apilevel, string enginename, float engineversion) CSQC_Init; /* Called at startup. enginename and engineversion are arbitary hints and can take any form. enginename should be consistant between revisions, but this cannot truely be relied upon. */
2024-01-10 21:33:06 +00:00
void() CSQC_WorldLoaded; /* Called after the server's model+sound precaches have been executed. Gives a chance for the qc to read the entity lump from the bsp (via getentitytoken). */
2022-02-08 18:42:28 +00:00
void() CSQC_Shutdown; /* Specifies that the csqc is going down. Save your persistant settings here. */
void(float vwidth, float vheight, float notmenu) CSQC_UpdateView; /* Called every single video frame. The CSQC is responsible for rendering the entire screen. */
void(float vwidth, float vheight, float notmenu) CSQC_UpdateViewLoading; /* Alternative to CSQC_UpdateView, called when the engine thinks there should be a loading screen. If present, will inhibit the engine's normal loading screen, deferring to qc to draw it. */
2024-01-10 21:33:06 +00:00
void(vector viewsize, float scoresshown) CSQC_DrawHud; /* Part of simple csqc, called after drawing the 3d view whenever CSQC_UpdateView is not defined. */
void(vector viewsize, float scoresshown) CSQC_DrawScores; /* Part of simple csqc, called after CSQC_DrawHud whenever CSQC_UpdateView is not defined, and when there are no menus/console active. */
2022-02-08 18:42:28 +00:00
void(string msg) CSQC_Parse_StuffCmd; /* Gives the CSQC a chance to intercept stuffcmds. Use the tokenize builtin to parse the message. Unrecognised commands would normally be localcmded, but its probably better to drop unrecognised stuffcmds completely. */
float(string msg) CSQC_Parse_CenterPrint; /* Gives the CSQC a chance to intercept centerprints. Return true if you wish the engine to otherwise ignore the centerprint. */
float(float save, float take, vector inflictororg) CSQC_Parse_Damage; /* Called as a result of player.dmg_save or player.dmg_take being set on the server.
Return true to completely inhibit the engine's colour shift and damage rolls, allowing you to do your own thing.
You can use punch_roll += (normalize(inflictororg-player.origin)*v_right)*(take+save)*autocvar_v_kickroll; as a modifier for the roll angle should the player be hit from the side, and slowly fade it away over time. */
void(string printmsg, float printlvl) CSQC_Parse_Print; /* Gives the CSQC a chance to intercept sprint/bprint builtin calls. CSQC should filter by the client's current msg setting and then pass the message on to the print command, or handle them itself. */
void() CSQC_Parse_Event; /* Called when the client receives an SVC_CGAMEPACKET. The csqc should read the data or call the error builtin if it does not recognise the message. */
float(float evtype, float scanx, float chary, float devid) CSQC_InputEvent; /* Called whenever a key is pressed, the mouse is moved, etc. evtype will be one of the IE_* constants. The other arguments vary depending on the evtype. Key presses are not guarenteed to have both scan and unichar values set at the same time. */
__used void() CSQC_Input_Frame; /* Called just before each time clientcommandframe is updated. You can edit the input_* globals in order to apply your own player inputs within csqc, which may allow you a convienient way to pass certain info to ssqc. */
void(string rendererdescription) CSQC_RendererRestarted; /* Called by the engine after the video was restarted. This serves to notify the CSQC that any render targets that it may have cached were purged, and will need to be regenerated. */
float(string cmd) CSQC_ConsoleCommand; /* Called if the user uses any console command registed via registercommand. */
float(string text, string info) CSQC_ConsoleLink; /* Called if the user clicks a ^[text\infokey\infovalue^] link. Use infoget to read/check each supported key. Return true if you wish the engine to not attempt to handle the link itself.
WARNING: link text can potentially come from other players, so be careful about what you allow to be changed. */
void(float entnum) CSQC_Ent_Spawn; /* Clumsily defined function for compat with DP. Should call spawn, set that ent's entnum field, and return the entity inside the 'self' global which will then be used for fllowing Ent_Updates. MUST NOT PARSE ANY NETWORK DATA (which makes it kinda useless). */
void(float isnew) CSQC_Ent_Update; /* Parses the data sent by ssqc's various SendEntity functions (must use the exact same reads as the ssqc used writes - to debug this rule more easily, you may wish to use sv_csqcdebug). 'self' provides context between frames, and self.entnum should normally report which ssqc entity . Be aware that interpolation will need to happen separately. */
void() CSQC_Ent_Remove;
float(float entnum, float channel, string soundname, float vol, float attenuation, vector pos, float pitchmod, float flags) CSQC_Event_Sound;
float() CSQC_Parse_TempEntity; /* Please don't use this. Use CSQC_Parse_Event and multicasts instead.
The use of serverside protocol translation to handle QW vs NQ protocols mean that you're likely to end up reading slightly different data. Which is bad.
Return true to say that you fully handled the tempentity. Return false to have the client attempt to rewind the network stream and parse the message itself. */
void(string cmdtext) GameCommand;
string(string uri, string method, string postdata, __in string requestheaders, __inout string responseheaders) Cef_GeneratePage; /* Provides an entrypoint to generate pages for the CEF plugin from within QC. Headers are
-separated key/value pairs (use tokenizebyseparator). */
void(float prevprogs) init; /* Part of FTE_MULTIPROGS. Called as soon as a progs is loaded, called at a time when entities are not valid. This is the only time when it is safe to call addprogs without field assignment. As it is also called as part of addprogs, this also gives you a chance to hook functions in modules that are already loaded (via externget+externget). */
void() initents; /* Part of FTE_MULTIPROGS. Called after fields have been finalized. This is the first point at which it is safe to call spawn(), and is called before any entity fields have been parsed. You can use this entrypoint to send notifications to other modules. */
__used var float physics_mode = 2; /* 0: original csqc - physics are not run
1: DP-compat. Thinks occur, but not true movetypes.
2: movetypes occur just as they do in ssqc. */
float gamespeed; /* Set by the engine, this is the value of the sv_gamespeed cvar */
float numclientseats; /* This is the number of splitscreen clients currently running on this client. */
var vector drawfontscale = '1 1 0'; /* Specifies a scaler for all text rendering. There are other ways to implement this. */
float drawfont; /* Allows you to choose exactly which font is to be used to draw text. Fonts can be registered/allocated with the loadfont builtin. */
const float FONT_DEFAULT = 0;
2024-01-10 21:33:06 +00:00
float deathmatch; /* ssqc global */
float coop; /* ssqc global */
int trace_endcontentsi; /* ssqc global */
int trace_surfaceflagsi; /* ssqc global */
string trace_surfacename; /* ssqc global */
float cycle_wrapped; /* ssqc global */
float dimension_default; /* ssqc global */
unsigned int input_weapon; /* ssqc global */
float input_lightlevel; /* ssqc global */
vector input_cursor_screen; /* ssqc global */
vector input_cursor_trace_start; /* ssqc global */
vector input_cursor_trace_endpos; /* ssqc global */
float input_cursor_entitynumber; /* ssqc global */
unsigned int input_head_status; /* ssqc global */
vector input_head_origin; /* ssqc global */
vector input_head_angles; /* ssqc global */
vector input_head_velocity; /* ssqc global */
vector input_head_avelocity; /* ssqc global */
unsigned int input_head_weapon; /* ssqc global */
unsigned int input_left_status; /* ssqc global */
vector input_left_origin; /* ssqc global */
vector input_left_angles; /* ssqc global */
vector input_left_velocity; /* ssqc global */
vector input_left_avelocity; /* ssqc global */
unsigned int input_left_weapon; /* ssqc global */
unsigned int input_right_status; /* ssqc global */
vector input_right_origin; /* ssqc global */
vector input_right_angles; /* ssqc global */
vector input_right_velocity; /* ssqc global */
vector input_right_avelocity; /* ssqc global */
unsigned int input_right_weapon; /* ssqc global */
string trace_dphittexturename; /* ssqc global */
float(vector angles, float isdelta) CSQC_Parse_SetAngles;
void(float playernum) CSQC_PlayerInfoChanged;
void() CSQC_ServerInfoChanged;
DEP("use CSQC_Event_Sound") float(float channel, string soundname, vector pos, float vol, float attenuation, float flags) CSQC_ServerSound;
void(int entidx, string newentdata) CSQC_MapEntityEdited;
float clframetime;
float servertime;
float serverprevtime;
float serverdeltatime;
DEP("Does not support mod-specific contents.") float trace_dpstartcontents;
DEP("Does not support mod-specific contents.") float trace_dphitcontents;
DEP("Does not support mod-specific surface flags") float trace_dphitq3surfaceflags;
DEP("Does not support all mod-specific surface flags.") float trace_surfaceflagsf;
DEP("Does not support all mod-specific contents.") float trace_endcontentsf;
float intermission_time;
vector pmove_mins;
vector pmove_maxs;
float pmove_jump_held;
float pmove_waterjumptime;
float input_clienttime;
float autocvar_vid_conwidth;
float autocvar_vid_conheight;
2022-02-08 18:42:28 +00:00
const float TRUE = 1;
const float FALSE = 0; /* File not found... */
2024-01-10 21:33:06 +00:00
const float M_PI = 3.14159; /* Mathematica Pi constant. */
2022-02-08 18:42:28 +00:00
const float MOVETYPE_NONE = 0;
const float MOVETYPE_WALK = 3;
const float MOVETYPE_STEP = 4;
const float MOVETYPE_FLY = 5;
const float MOVETYPE_TOSS = 6;
const float MOVETYPE_PUSH = 7;
const float MOVETYPE_NOCLIP = 8;
const float MOVETYPE_FLYMISSILE = 9;
const float MOVETYPE_BOUNCE = 10;
const float MOVETYPE_BOUNCEMISSILE = 11;
const float MOVETYPE_FOLLOW = 12;
const float MOVETYPE_6DOF = 30; /* A glorified MOVETYPE_FLY. Players using this movetype will get some flightsim-like physics, with fully independant rotations (order-dependant transforms). */
const float MOVETYPE_WALLWALK = 31; /* Players using this movetype will be able to orient themselves to walls, and then run up them. */
const float MOVETYPE_PHYSICS = 32; /* Enable the use of ODE physics upon this entity. */
const float SOLID_NOT = 0;
const float SOLID_TRIGGER = 1;
const float SOLID_BBOX = 2;
const float SOLID_SLIDEBOX = 3;
const float SOLID_BSP = 4; /* Does not collide against other SOLID_BSP entities. Normally paired with MOVETYPE_PUSH. */
2024-01-10 21:33:06 +00:00
const float SOLID_CORPSE = 5; /* Non-solid to SOLID_SLIDEBOX or other SOLID_CORPSE entities. For hitscan weapons to hit corpses, change the player's .hitcontentsmaski value to include CONTENTBIT_CORPSE, perform the traceline, then revert the player's .solid value. */
__deprecated("Obsoleted by .skin=CONTENTS_LADDER") const float SOLID_LADDER = 20; /* Obsolete and may be removed at some point. Use skin=CONTENT_LADDER and solid_bsp or solid_trigger instead. */
2022-02-08 18:42:28 +00:00
const float SOLID_PORTAL = 21; /* CSG subtraction volume combined with entity transformations on impact. */
2024-01-10 21:33:06 +00:00
const float SOLID_BSPTRIGGER = 22; /* For complex-shaped trigger volumes, instead of being a pure aabb. */
2022-02-08 18:42:28 +00:00
const float SOLID_PHYSICS_BOX = 32;
const float SOLID_PHYSICS_SPHERE = 33;
const float SOLID_PHYSICS_CAPSULE = 34;
const float SOLID_PHYSICS_TRIMESH = 35;
const float SOLID_PHYSICS_CYLINDER = 36;
const float GEOMTYPE_NONE = -1;
const float GEOMTYPE_SOLID = 0;
const float GEOMTYPE_BOX = 1;
const float GEOMTYPE_SPHERE = 2;
const float GEOMTYPE_CAPSULE = 3;
const float GEOMTYPE_TRIMESH = 4;
const float GEOMTYPE_CYLINDER = 5;
const float GEOMTYPE_CAPSULE_X = 6;
const float GEOMTYPE_CAPSULE_Y = 7;
const float GEOMTYPE_CAPSULE_Z = 8;
const float GEOMTYPE_CYLINDER_X = 9;
const float GEOMTYPE_CYLINDER_Y = 10;
const float GEOMTYPE_CYLINDER_Z = 11;
const float JOINTTYPE_FIXED = -1;
const float JOINTTYPE_POINT = 1;
const float JOINTTYPE_HINGE = 2;
const float JOINTTYPE_SLIDER = 3;
const float JOINTTYPE_UNIVERSAL = 4;
const float JOINTTYPE_HINGE2 = 5;
const float GE_MAXENTS = -1; /* Valid for getentity, ignores the entity argument. Returns the maximum number of entities which may be valid, to avoid having to poll 65k when only 100 are used. */
const float GE_ACTIVE = 0; /* Valid for getentity. Returns whether this entity is known to the client or not. */
const float GE_ORIGIN = 1; /* Valid for getentity. Returns the interpolated .origin. */
const float GE_FORWARD = 2; /* Valid for getentity. Returns the interpolated forward vector. */
const float GE_RIGHT = 3; /* Valid for getentity. Returns the entity's right vector. */
const float GE_UP = 4; /* Valid for getentity. Returns the entity's up vector. */
const float GE_SCALE = 5; /* Valid for getentity. Returns the entity .scale. */
const float GE_ORIGINANDVECTORS = 6; /* Valid for getentity. Returns interpolated .origin, but also sets v_forward, v_right, and v_up accordingly. Use vectoangles(v_forward,v_up) to determine the angles. */
const float GE_ALPHA = 7; /* Valid for getentity. Returns the entity alpha. */
const float GE_COLORMOD = 8; /* Valid for getentity. Returns the colormod vector. */
const float GE_PANTSCOLOR = 9; /* Valid for getentity. Returns the entity's lower color (from .colormap), as a palette range value. */
const float GE_SHIRTCOLOR = 10; /* Valid for getentity. Returns the entity's lower color (from .colormap), as a palette range value. */
const float GE_SKIN = 11; /* Valid for getentity. Returns the entity's .skin index. */
const float GE_MINS = 12; /* Valid for getentity. Guesses the entity's .min vector. */
const float GE_MAXS = 13; /* Valid for getentity. Guesses the entity's .max vector. */
const float GE_ABSMIN = 14; /* Valid for getentity. Guesses the entity's .absmin vector. */
const float GE_ABSMAX = 15; /* Valid for getentity. Guesses the entity's .absmax vector. */
const float GE_MODELINDEX = 200; /* Valid for getentity. Guesses the entity's .modelindex float. */
const float GE_MODELINDEX2 = 201; /* Valid for getentity. Guesses the entity's .vw_index float. */
const float GE_EFFECTS = 202; /* Valid for getentity. Guesses the entity's .effects float. */
const float GE_FRAME = 203; /* Valid for getentity. Guesses the entity's .frame float. */
const float GE_ANGLES = 204; /* Valid for getentity. Guesses the entity's .angles vector. */
const float GE_FATNESS = 205; /* Valid for getentity. Guesses the entity's .fatness float. */
const float GE_DRAWFLAGS = 206; /* Valid for getentity. Guesses the entity's .drawflags float. */
const float GE_ABSLIGHT = 207; /* Valid for getentity. Guesses the entity's .abslight float. */
const float GE_GLOWMOD = 208; /* Valid for getentity. Guesses the entity's .glowmod vector. */
const float GE_GLOWSIZE = 209; /* Valid for getentity. Guesses the entity's .glowsize float. */
const float GE_GLOWCOLOUR = 210; /* Valid for getentity. Guesses the entity's .glowcolor float. */
const float GE_RTSTYLE = 211; /* Valid for getentity. Guesses the entity's .style float. */
const float GE_RTPFLAGS = 212; /* Valid for getentity. Guesses the entity's .pflags float. */
const float GE_RTCOLOUR = 213; /* Valid for getentity. Guesses the entity's .color vector. */
const float GE_RTRADIUS = 214; /* Valid for getentity. Guesses the entity's .light_lev float. */
const float GE_TAGENTITY = 215; /* Valid for getentity. Guesses the entity's .tag_entity float. */
const float GE_TAGINDEX = 216; /* Valid for getentity. Guesses the entity's .tag_index float. */
const float GE_GRAVITYDIR = 217; /* Valid for getentity. Guesses the entity's .gravitydir vector. */
const float GE_TRAILEFFECTNUM = 218; /* Valid for getentity. Guesses the entity's .traileffectnum float. */
const float CONTENT_EMPTY = -1;
const float CONTENT_SOLID = -2;
const float CONTENT_WATER = -3;
const float CONTENT_SLIME = -4;
const float CONTENT_LAVA = -5;
const float CONTENT_SKY = -6;
const float CONTENT_LADDER = -16; /* If this value is assigned to a solid_bsp's .skin field, the entity will become a ladder volume. */
const int CONTENTBIT_NONE = 0x00000000i;
const int CONTENTBIT_SOLID = 0x00000001i;
const int CONTENTBIT_LAVA = 0x00000008i;
const int CONTENTBIT_SLIME = 0x00000010i;
const int CONTENTBIT_WATER = 0x00000020i;
2024-01-10 21:33:06 +00:00
const int CONTENTBIT_FTELADDER = 0x00004000i; /* Content bit used for .skin=CONTENT_LADDER entities. */
2022-02-08 18:42:28 +00:00
const int CONTENTBIT_PLAYERCLIP = 0x00010000i;
const int CONTENTBIT_MONSTERCLIP = 0x00020000i;
2024-01-10 21:33:06 +00:00
const int CONTENTBIT_BODY = 0x02000000i; /* Content bit that indicates collisions against SOLID_BBOX/SOLID_SLIDEBOX entities. */
const int CONTENTBIT_CORPSE = 0x04000000i; /* Content bit that indicates collisions against SOLID_CORPSE entities. */
const int CONTENTBIT_Q2LADDER = 0x20000000i; /* Content bit specific to q2bsp (conflicts with q3bsp contents so use with caution). */
const int CONTENTBIT_SKY = 0x80000000i; /* Content bit somewhat specific to q1bsp (aliases to NODROP in q3bsp), but you should probably check surfaceflags&SURF_SKY as well for q2+q3bsp too. */
2022-02-08 18:42:28 +00:00
const int CONTENTBITS_POINTSOLID = CONTENTBIT_SOLID|0x00000002i|CONTENTBIT_BODY; /* Bits that traceline would normally consider solid */
const int CONTENTBITS_BOXSOLID = CONTENTBIT_SOLID|0x00000002i|CONTENTBIT_BODY|CONTENTBIT_PLAYERCLIP; /* Bits that tracebox would normally consider solid */
const int CONTENTBITS_FLUID = CONTENTBIT_WATER|CONTENTBIT_SLIME|CONTENTBIT_LAVA|CONTENTBIT_SKY;
2024-01-10 21:33:06 +00:00
const float SPA_POSITION = 0; /* These SPA_* constants are to specify which attribute is returned by the getsurfacepointattribute builtin */
const float SPA_S_AXIS = 1;
const float SPA_T_AXIS = 2;
const float SPA_R_AXIS = 3; /* aka: SPA_NORMAL */
const float SPA_TEXCOORDS0 = 4;
const float SPA_LIGHTMAP0_TEXCOORDS = 5;
const float SPA_LIGHTMAP0_COLOR = 6;
2022-02-08 18:42:28 +00:00
const float CHAN_AUTO = 0; /* The automatic channel, play as many sounds on this channel as you want, and they'll all play, however the other channels will replace each other. */
const float CHAN_WEAPON = 1;
const float CHAN_VOICE = 2;
const float CHAN_ITEM = 3;
const float CHAN_BODY = 4;
const float SOUNDFLAG_ABSVOLUME = 16; /* The sample's volume is not scaled by the volume cvar. Use with caution */
const float SOUNDFLAG_FORCELOOP = 2; /* The sound will restart once it reaches the end of the sample. */
const float SOUNDFLAG_NOSPACIALISE = 4; /* The different audio channels are played at the same volume regardless of which way the player is facing, without needing to use 0 attenuation. */
const float SOUNDFLAG_NOREVERB = 32; /* Disables the use of underwater/reverb effects on this sound effect. */
const float SOUNDFLAG_FOLLOW = 64; /* The sound's origin will updated to follow the emitting entity. */
2024-01-10 21:33:06 +00:00
const float SOUNDFLAG_NOREPLACE = 128; /* Sounds started with this flag will be ignored when there's already a sound playing on that same ent-channel. */
2022-02-08 18:42:28 +00:00
const float ATTN_NONE = 0; /* Sounds with this attenuation can be heard throughout the map */
const float ATTN_NORM = 1; /* Standard attenuation */
const float ATTN_IDLE = 2; /* Extra attenuation so that sounds don't travel too far. */
const float ATTN_STATIC = 3; /* Even more attenuation to avoid torches drowing out everything else throughout the map. */
2024-01-10 21:33:06 +00:00
const float TE_SPIKE = 0;
const float TE_SUPERSPIKE = 1;
const float TE_GUNSHOT = 2;
const float TE_EXPLOSION = 3;
const float TE_TAREXPLOSION = 4;
const float TE_LIGHTNING1 = 5;
const float TE_LIGHTNING2 = 6;
const float TE_WIZSPIKE = 7;
const float TE_KNIGHTSPIKE = 8;
const float TE_LIGHTNING3 = 9;
const float TE_LAVASPLASH = 10;
const float TE_TELEPORT = 11;
const float TE_BLOOD = 12;
const float TE_LIGHTNINGBLOOD = 13;
2022-02-08 18:42:28 +00:00
const string INFOKEY_P_PING = "ping"; /* The player's ping time, in milliseconds. */
const string INFOKEY_P_NAME = "name"; /* The player's name. */
const string INFOKEY_P_SPECTATOR = "*spectator"; /* Whether the player is a spectator or not. */
const string INFOKEY_P_TOPCOLOR = "topcolor"; /* The player's upper/shirt colour (palette index). */
const string INFOKEY_P_BOTTOMCOLOR = "bottomcolor"; /* The player's lower/pants/trouser colour (palette index). */
const string INFOKEY_P_TOPCOLOR_RGB = "topcolor_rgb"; /* The player's upper/shirt colour as an rgb value in a format usable with stov. */
const string INFOKEY_P_BOTTOMCOLOR_RGB = "bottomcolor_rgb"; /* The player's lower/pants/trouser colour as an rgb value in a format usable with stov. */
const string INFOKEY_P_MUTED = "ignored"; /* 0: we can see the result of the player's say/say_team commands. 1: we see no say/say_team messages from this player. Use the ignore command to toggle this value. */
const string INFOKEY_P_VOIP_MUTED = "vignored"; /* 0: we can hear this player when they speak (assuming voip is generally enabled). 1: we ignore everything this player says. Use cl_voip_mute to change the values. */
const string INFOKEY_P_ENTERTIME = "entertime"; /* Reads the timestamp at which the player entered the game, in terms of csqc's time global. */
const string INFOKEY_P_FRAGS = "frags"; /* Reads a player's frag count. */
const string INFOKEY_P_PACKETLOSS = "pl"; /* Reads a player's packetloss, as a percentage. */
const string INFOKEY_P_VOIPSPEAKING = "voipspeaking"; /* Boolean value that says whether the given player is currently sending voice information. */
const string INFOKEY_P_VOIPLOUDNESS = "voiploudness"; /* Only valid for the local player. Gives a value between 0 and 1 to indicate to the user how loud their mic is. */
const string SERVERKEY_IP = "ip"; /* The address of the server we connected to. */
const string SERVERKEY_SERVERNAME = "servername"; /* The hostname that was last passed to the connect command. */
const string SERVERKEY_CONSTATE = "constate"; /* The current connection state. Will be set to one of: disconnected (menu-only mode), active (gamestate received and loaded), connecting(connecting, downloading, or precaching content, aka: loading screen). */
const string SERVERKEY_TRANSFERRING = "transferring"; /* Set to the hostname of the server that we are attempting to connect or transfer to. */
const string SERVERKEY_LOADSTATE = "loadstate"; /* loadstage, loading image name, current step, max steps
Stages are: 1=connecting, 2=serverside, 3=clientside
Key will be empty if we are not loading. */
const string SERVERKEY_PAUSESTATE = "pausestate"; /* 1 if the server claimed to be paused. 0 otherwise */
const string SERVERKEY_DLSTATE = "dlstate"; /* The progress of any current downloads. Empty string if no download is active, otherwise a tokenizable string containing this info:
files-remaining, total-size, unknown-sizes-flag, file-localname, file-remotename, file-percent, file-rate, file-received-bytes, file-total-bytes
If the current file info is omitted, then we are waiting for a download to start. */
const string SERVERKEY_PROTOCOL = "protocol"; /* The protocol we are connected to the server with. */
const string SERVERKEY_MAXPLAYERS = "maxplayers"; /* The number of player/spectator slots allocated on the server. */
const float FL_FLY = 1;
const float FL_SWIM = 2;
const float FL_CLIENT = 8;
const float FL_INWATER = 16;
const float FL_MONSTER = 32;
const float FL_ITEM = 256;
const float FL_ONGROUND = 512;
const float FL_PARTIALGROUND = 1024;
const float FL_WATERJUMP = 2048;
const float FL_FINDABLE_NONSOLID = 16384; /* Allows this entity to be found with findradius */
const float MOVE_NORMAL = 0;
const float MOVE_NOMONSTERS = 1; /* The trace will ignore all non-solid_bsp entities. */
const float MOVE_MISSILE = 2; /* The trace will use a bbox size of +/- 15 against entities with FL_MONSTER set. */
2024-01-10 21:33:06 +00:00
const float MOVE_WORLDONLY = 3; /* The trace will ignore everything but the worldmodel. This is useful for to prevent the q3bsp pvs+culling issues that come with spectator modes leaving the world . */
2022-02-08 18:42:28 +00:00
const float MOVE_HITMODEL = 4; /* Traces will impact the actual mesh of the model instead of merely their bounding box. Should generally only be used for tracelines. Note that this flag is unreliable as an object can animate through projectiles. The bounding box MUST be set to completely encompass the entity or those extra areas will be non-solid (leaving a hole for things to go through). */
const float MOVE_TRIGGERS = 16; /* This trace type will impact only triggers. It will ignore non-solid entities. */
const float MOVE_EVERYTHING = 32; /* This type of trace will hit solids and triggers alike. Even non-solid entities. */
const float MOVE_ENTCHAIN = 128; /* Returns a list of entities impacted via the trace_ent.chain field */
const float MOVE_OTHERONLY = 256; /* Traces that use this trace type will collide against *only* the entity specified via the 'other' global, and will ignore all owner/solid_not/dimension etc rules, they will still adhere to contents and bsp/bbox rules though. */
2024-01-10 21:33:06 +00:00
const float CVAR_TYPEFLAG_EXISTS = 1; /* Cvar name actually exists. */
const float CVAR_TYPEFLAG_SAVED = 2; /* Cvar is flaged for archival (might need cfg_save to actually save). */
const float CVAR_TYPEFLAG_PRIVATE = 4; /* QC is not allowed to read. */
const float CVAR_TYPEFLAG_ENGINE = 8; /* Cvar was created by the engine itself (not user/mod created). */
const float CVAR_TYPEFLAG_HASDESCRIPTION = 16; /* cvar_description will return something (hopefully) useful. */
const float CVAR_TYPEFLAG_READONLY = 32; /* cvar may not be changed by qc. */
2022-02-08 18:42:28 +00:00
const float RESTYPE_MODEL = 0; /* RESTYPE_* constants are used as arguments with the resourcestatus builtin. */
const float RESTYPE_SOUND = 1; /* precache_sound */
const float RESTYPE_PARTICLE = 2; /* particleeffectnum */
const float RESTYPE_PIC = 3; /* precache_pic. Status results are an amalgomation of the textures used by the named shader. */
const float RESTYPE_SKIN = 4; /* setcustomskin */
const float RESTYPE_TEXTURE = 5; /* Individual textures within shaders. These are not directly usable, but may be named as part of a skin file, or a shader. */
const float RESSTATE_NOTKNOWN = 0; /* RESSTATE_* constants are return values from the resourcestatus builtin. The engine doesn't know about the resource if it is in this state. This means you will need to precache it. Attempting to use it anyway may result in warnings, errors, or silently succeed, depending on engine version and resource type. */
const float RESSTATE_NOTLOADED = 1; /* The resource was precached, but has been flushed and there has not been an attempt to reload it. If you use the resource normally, chances are it'll be loaded but at the cost of a stall. */
const float RESSTATE_LOADING = 2; /* Resources in this this state are queued for loading, and will be loaded at the engine's convienience. If you attempt to query the resource now, the engine will stall until the result is available. sounds in this state may be delayed, while models/pics/shaders may be invisible. */
const float RESSTATE_FAILED = 3; /* Resources in this state are unusable/could not be loaded. You will get placeholders or dummy results. Queries will not stall the engine. The engine may display placeholder content. */
const float RESSTATE_LOADED = 4; /* Resources in this state are finally usable, everything will work okay. Hurrah. Queries will not stall the engine. */
const float EF_BRIGHTFIELD = 1;
const float EF_MUZZLEFLASH = 2;
const float EF_BRIGHTLIGHT = 4;
const float EF_DIMLIGHT = 8;
2024-01-10 21:33:06 +00:00
const float EF_NODRAW = 16; /* Disables drawing of the model. Does NOT work on QW players. */
const float EF_ADDITIVE = 32; /* The entity will be drawn with an additive blend. This is NOT supported on players in any quakeworld engine. */
2022-02-08 18:42:28 +00:00
const float EF_BLUE = 64; /* A blue glow */
const float EF_RED = 128; /* A red glow */
const float EF_GREEN = 262144; /* A green glow */
const float EF_FULLBRIGHT = 512; /* This entity will ignore lighting */
const float EF_NOSHADOW = 4096; /* This entity will not cast shadows */
const float EF_NODEPTHTEST = 8192; /* This entity will be drawn over the top of other things that are closer. */
const float MF_ROCKET = 1;
const float MF_GRENADE = 2;
const float MF_GIB = 4; /* Regular blood trail */
const float MF_ROTATE = 8;
const float MF_TRACER = 16; /* AKA: green scrag trail */
const float MF_ZOMGIB = 32; /* Dark blood trail */
const float MF_TRACER2 = 64; /* AKA: hellknight projectile trail */
const float MF_TRACER3 = 128; /* AKA: purple vore trail */
const float PFLAGS_NOSHADOW = 1; /* Associated RT lights attached will not cast shadows, making them significantly faster to draw. */
const float PFLAGS_CORONA = 2; /* Enables support of coronas on the associated rtlights. */
const float EV_STRING = 1;
const float EV_FLOAT = 2;
const float EV_VECTOR = 3;
const float EV_ENTITY = 4;
const float EV_FIELD = 5;
const float EV_FUNCTION = 6;
const float EV_POINTER = 7;
const float EV_INTEGER = 8;
2024-01-10 21:33:06 +00:00
const float EV_UINT = 9;
const float EV_INT64 = 10;
const float EV_UINT64 = 11;
const float EV_DOUBLE = 12;
2022-02-08 18:42:28 +00:00
hashtable gamestate; /* Special hash table index for hash_add and hash_get. Entries in this table will persist over map changes (and doesn't need to be created/deleted). */
const float HASH_REPLACE = 256; /* Used with hash_add. Attempts to remove the old value instead of adding two values for a single key. */
const float HASH_ADD = 512; /* Used with hash_add. The new entry will be inserted in addition to the existing entry. */
const float STAT_HEALTH = 0; /* Player's health. */
const float STAT_WEAPONMODELI = 2; /* This is the modelindex of the current viewmodel (renamed from the original name 'STAT_WEAPON' due to confusions). */
const float STAT_AMMO = 3; /* player.currentammo */
const float STAT_ARMOR = 4;
const float STAT_WEAPONFRAME = 5;
const float STAT_SHELLS = 6;
const float STAT_NAILS = 7;
const float STAT_ROCKETS = 8;
const float STAT_CELLS = 9;
const float STAT_ACTIVEWEAPON = 10; /* player.weapon */
const float STAT_TOTALSECRETS = 11;
const float STAT_TOTALMONSTERS = 12;
const float STAT_FOUNDSECRETS = 13;
const float STAT_KILLEDMONSTERS = 14;
const float STAT_ITEMS = 15; /* self.items | (self.items2<<23). In order to decode this stat properly, you need to use getstatbits(STAT_ITEMS,0,23) to read self.items, and getstatbits(STAT_ITEMS,23,11) to read self.items2 or getstatbits(STAT_ITEMS,28,4) to read the visible part of serverflags, whichever is applicable. */
const float STAT_VIEWHEIGHT = 16; /* player.view_ofs_z */
const float STAT_VIEW2 = 20; /* This stat contains the number of the entity in the server's .view2 field. */
const float STAT_VIEWZOOM = 21; /* Scales fov and sensitiity. Part of DP_VIEWZOOM. */
const float STAT_USER = 32; /* Custom user stats start here (lower values are reserved for engine use). */
2024-01-10 21:33:06 +00:00
const float PRECACHE_PIC_FROMWAD = 1; /* Attempt to load it from the legacy gfx.wad file (usually its better to just use a gfx/ prefix instead). */
const float PRECACHE_PIC_NOCLAMP = 4; /* Texture coords for the pic will not be clamped nor padded nor atlased. */
const float PRECACHE_PIC_DOWNLOAD = 256; /* If no image could be loaded then attempt to download one from the server. This flag can cause the function to block until completion. (Slow!) */
const float PRECACHE_PIC_TEST = 512; /* The precache will block until the image is fully loaded, returning a null string on failure. (Slow!) */
2022-02-08 18:42:28 +00:00
const float VF_MIN = 1; /* The top-left of the 3d viewport in screenspace. The VF_ values are used via the setviewprop/getviewprop builtins. */
const float VF_MIN_X = 2;
const float VF_MIN_Y = 3;
const float VF_SIZE = 4; /* The width+height of the 3d viewport in screenspace. */
const float VF_SIZE_X = 5;
const float VF_SIZE_Y = 6;
const float VF_VIEWPORT = 7; /* vector+vector. Two argument shortcut for VF_MIN and VF_SIZE */
const float VF_FOV = 8; /* sets both fovx and fovy. consider using afov instead. */
2024-01-10 21:33:06 +00:00
const float VF_FOV_X = 9; /* horizontal field of view. does not consider aspect at all. */
const float VF_FOV_Y = 10; /* vertical field of view. does not consider aspect at all. */
2022-02-08 18:42:28 +00:00
const float VF_ORIGIN = 11; /* The origin of the view. Not of the player. */
const float VF_ORIGIN_X = 12;
const float VF_ORIGIN_Y = 13;
const float VF_ORIGIN_Z = 14;
const float VF_ANGLES = 15; /* The angles the view will be drawn at. Not the angle the client reports to the server. */
const float VF_ANGLES_X = 16;
const float VF_ANGLES_Y = 17;
const float VF_ANGLES_Z = 18;
const float VF_DRAWWORLD = 19; /* boolean. If set to 1, the engine will draw the world and static/persistant rtlights. If 0, the world will be skipped and everything will be fullbright. */
const float VF_DRAWENGINESBAR = 20; /* boolean. If set to 1, the sbar will be drawn, and viewsize will be honoured automatically. */
const float VF_DRAWCROSSHAIR = 21; /* boolean. If set to 1, the engine will draw its default crosshair. */
const float VF_MINDIST = 23; /* The distance of the near clip plane from the view position. Should generally not be <=0, as this would introduce NANs. */
const float VF_MAXDIST = 24; /* The distance of the far clip plane from the view position. If 0, will be considered infinite. */
const float VF_CL_VIEWANGLES = 33;
const float VF_CL_VIEWANGLES_X = 34;
const float VF_CL_VIEWANGLES_Y = 35;
const float VF_CL_VIEWANGLES_Z = 36;
const float VF_PERSPECTIVE = 200; /* 1: regular rendering. Fov specifies the angle. 0: isometric-style. Fov specifies the number of Quake Units each side of the viewport, and mindist restrictions are removed, pvs culling should be disabled. */
#define VF_LPLAYER VF_ACTIVESEAT
const float VF_ACTIVESEAT = 202; /* The 'seat' number, used when running splitscreen. */
const float VF_AFOV = 203; /* Aproximate fov. Matches the 'fov' cvar. The engine handles the aspect ratio for you. */
const float VF_SCREENVSIZE = 204; /* Provides a reliable way to retrieve the current virtual screen size (even if the screen is automatically scaled to retain aspect). */
const float VF_SCREENPSIZE = 205; /* Provides a reliable way to retrieve the current physical screen size (cvars need vid_restart for them to take effect). */
const float VF_VIEWENTITY = 206; /* Changes the RF_EXTERNALMODEL flag on entities to match the new selection, and removes entities flaged with RF_VIEWENTITY. Requires cunning use of .entnum and typically requires calling addentities(MASK_VIEWMODEL) too. */
const float VF_RT_DESTCOLOUR = 212; /* The texture name to write colour info into, this includes both 3d and 2d drawing.
2024-01-10 21:33:06 +00:00
Additional arguments are: format (IMGFMT_*), sizexy.
2022-02-08 18:42:28 +00:00
Written to by both 3d and 2d rendering.
Note that any rendertarget textures may be destroyed on video mode changes or so. Shaders can name render targets by prefixing texture names with '$rt:', or $sourcecolour. */
2024-01-10 21:33:06 +00:00
const float VF_RT_DESTCOLOUR1 = 213; /* Like VF_RT_DESTCOLOUR, for multiple render targets. */
const float VF_RT_DESTCOLOUR2 = 214; /* Like VF_RT_DESTCOLOUR, for multiple render targets. */
const float VF_RT_DESTCOLOUR3 = 215; /* Like VF_RT_DESTCOLOUR, for multiple render targets. */
2022-02-08 18:42:28 +00:00
const float VF_RT_SOURCECOLOUR = 209; /* The texture name to use with shaders that specify a $sourcecolour map. */
2024-01-10 21:33:06 +00:00
const float VF_RT_DEPTH = 210; /* The texture name to use as a depth buffer. Also used for shaders that specify $sourcedepth. 1-based. Additional arguments are: format (IMGFMT_D*), sizexy. */
2022-02-08 18:42:28 +00:00
const float VF_RT_RIPPLE = 211; /* The texture name to use as a ripplemap (target for shaders with 'sort ripple'). Also used for shaders that specify $ripplemap. 1-based. Additional arguments are: format, sizexy. */
const float VF_ENVMAP = 220; /* The cubemap name to use as a fallback for $reflectcube, if a shader was unable to load one. Note that this doesn't automatically change shader permutations or anything. */
2024-01-10 21:33:06 +00:00
const float VF_USERDATA = 221; /* Pointer (and byte size) to an array of vec4s. This data is then globally visible to all glsl via the w_user uniform. */
const float VF_SKYROOM_CAMERA = 222; /* Controls the camera position of the skyroom (which will be drawn underneath transparent sky surfaces). This should move slightly with the real camera, but not so much that the skycamera enters walls. Requires a skyshader with a blend mode on the first pass (or no passes). */
const float VF_PROJECTIONOFFSET = 224; /* vec2 horizontal+vertical offset for the projection matrix, for weird off-centre rendering. */
const float DRAWFLAG_NORMAL = 0; /* Args for drawpic/drawfill/beginpolygon. Not to be confused with the hexen2-compatibility feature. */
const float DRAWFLAG_ADD = 1; /* Forces additive blending, overriding any shader settings. */
const float DRAWFLAG_MODULATE = 2; /* Forces alpha blending, overriding any shader settings. */
const float DRAWFLAG_2D = 4; /* For use with beginpolygon. The polygon will be drawn to the 2d screen, instead of being added to the 3d scene. */
const float DRAWFLAG_TWOSIDED = 1024; /* For use with beginpolygon. The polygon will be two-sided without any backface culling. */
const float DRAWFLAG_LINES = 2048; /* For use with beginpolygon. The surface verticies should be interpreted as a line loop, instead of a triangle fan. */
const float IMGFMT_R8G8B8A8 = 1; /* Typical 32bit rgba pixel format. */
const float IMGFMT_R16G16B16A16F = 2; /* Half-Float pixel format. Requires gl3 support. */
const float IMGFMT_R32G32B32A32F = 3; /* Regular Float pixel format. Requires gl3 support. */
const float IMGFMT_D16 = 4; /* 16-bit depth pixel format. Must not be used with VF_RT_DESTCOLOUR*. */
const float IMGFMT_D24 = 5; /* 24-bit depth pixel format. Must not be used with VF_RT_DESTCOLOUR*. */
const float IMGFMT_D32 = 6; /* 32-bit depth pixel format. Must not be used with VF_RT_DESTCOLOUR*. */
const float IMGFMT_R8 = 7; /* Single channel red-only 8bit pixel format. */
const float IMGFMT_R16F = 8; /* Single channel red-only Half-Float pixel format. Requires gl3 support. */
const float IMGFMT_R32F = 9; /* Single channel red-only Float pixel format. Requires gl3 support. */
const float IMGFMT_A2B10G10R10 = 10; /* Packed 32-bit packed 10-bit colour pixel format. Requires gl3 support. */
const float IMGFMT_R5G6B5 = 11; /* Packed 16-bit colour pixel format. */
const float IMGFMT_R4G4B4A4 = 12; /* Packed 16-bit colour pixel format, with alpha */
const float IMGFMT_R8G8 = 13; /* 16-bit two-channel pixel format. */
const float IMGFMT_R32G32B32F = 14; /* A pixel format that matches QC's vector type. */
2022-02-08 18:42:28 +00:00
const float RF_VIEWMODEL = 1; /* Specifies that the entity is a view model, and that its origin is relative to the current view position. These entities are also subject to viewweapon bob. */
const float RF_EXTERNALMODEL = 2; /* Specifies that this entity should be displayed in mirrors (and may still cast shadows), but will not otherwise be visible. */
const float RF_DEPTHHACK = 4; /* Hacks the depth values such that the entity uses depth values as if it were closer to the screen. This is useful when combined with viewmodels to avoid weapons poking in to walls. */
const float RF_ADDITIVE = 8; /* Shaders from this entity will temporarily be hacked to use an additive blend mode instead of their normal blend mode. */
const float RF_USEAXIS = 16; /* The entity will be oriented according to the current v_forward+v_right+v_up vector values instead of the entity's .angles field. */
const float RF_NOSHADOW = 32; /* This entity will not cast shadows. Often useful on view models. */
const float RF_FRAMETIMESARESTARTTIMES = 64; /* Specifies that the frame1time, frame2time field are timestamps (denoting the start of the animation) rather than time into the animation. */
2024-01-10 21:33:06 +00:00
const float RF_FIRSTPERSON = 1024; /* This is basically the opposite of RF_EXTERNALMODEL. Don't draw in third-person or mirrors. */
2022-02-08 18:42:28 +00:00
const float IE_KEYDOWN = 0; /* Specifies that a key was pressed. Second argument is the scan code. Third argument is the unicode (printable) char value. Fourth argument denotes which keyboard(or mouse, if its a mouse 'scan' key) the event came from. Note that some systems may completely separate scan codes and unicode values, with a 0 value for the unspecified argument. */
const float IE_KEYUP = 1; /* Specifies that a key was released. Arguments are the same as IE_KEYDOWN. On some systems, this may be fired instantly after IE_KEYDOWN was fired. */
2024-01-10 21:33:06 +00:00
const float IE_MOUSEDELTA = 2; /* Specifies that a mouse was moved (touch screens and tablets typically give IE_MOUSEABS events instead, use in_windowed_mouse 0 to test code to cope with either). Second argument is the X displacement, third argument is the Y displacement. Fourth argument is which mouse or touch event triggered the event. */
2022-02-08 18:42:28 +00:00
const float IE_MOUSEABS = 3; /* Specifies that a mouse cursor or touch event was moved to a specific location relative to the virtual screen space. Second argument is the new X position, third argument is the new Y position. Fourth argument is which mouse or touch event triggered the event. */
const float IE_ACCELEROMETER = 4;
const float IE_FOCUS = 5; /* Specifies that input focus was given. parama says mouse focus, paramb says keyboard focus. If either are -1, then it is unchanged. */
const float IE_JOYAXIS = 6; /* Specifies that what value a joystick/controller axis currently specifies. x=axis, y=value. Will be called multiple times, once for each axis of each active controller. */
const float IE_GYROSCOPE = 7;
2024-01-10 21:33:06 +00:00
const float GGDI_GAMEDIR = 0; /* Used with getgamedirinfo to query the mod's public gamedir. There is often other info that cannot be expressed with just a gamedir name, resulting in dupes or other weirdness. */
const float GGDI_DESCRIPTION = 1; /* The human-readable title of the mod. Empty when no data is known (ie: the gamedir just contains some maps). */
const float GGDI_OVERRIDES = 2; /* A list of settings overrides. */
const float GGDI_LOADCOMMAND = 3; /* The console command needed to actually load the mod. */
const float GGDI_ICON = 4; /* The mod's Icon path, ready for drawpic. */
const float GGDI_GAMEDIRLIST = 5; /* A semi-colon delimited list of gamedirs that the mod's content can be loaded through. */
2022-02-08 18:42:28 +00:00
const float FILE_READ = 0; /* The file may be read via fgets to read a single line at a time. */
const float FILE_APPEND = 1; /* Like FILE_WRITE, but writing starts at the end of the file. */
const float FILE_WRITE = 2; /* fputs will be used to write to the file. */
const float FILE_READNL = 4; /* Like FILE_READ, except newlines are not special. fgets reads the entire file into a tempstring. */
const float FILE_MMAP_READ = 5; /* The file will be loaded into memory. fgets returns a pointer to the first byte (and will always return the same value for this file). Cast this to your datatype. */
const float FILE_MMAP_RW = 6; /* Like FILE_MMAP_READ, except any changes to the data will be written back to disk once the file is closed. */
const float MASK_ENGINE = 1; /* Valid as an argument for addentities. If specified, all non-csqc entities will be added to the scene. */
const float MASK_VIEWMODEL = 2; /* Valid as an argument for addentities. If specified, the regular engine viewmodel will be added to the scene. */
const float PREDRAW_AUTOADD = 0; /* Valid as a return value from the predraw function. Returning this will cause the engine to automatically invoke addentity(self) for you. */
const float PREDRAW_NEXT = 1; /* Valid as a return value from the predraw function. Returning this will simply move on to the next entity without the autoadd behaviour, so can be used for particle/invisible/special entites, or entities that were explicitly drawn with addentity. */
const float LFIELD_ORIGIN = 0;
const float LFIELD_COLOUR = 1;
const float LFIELD_RADIUS = 2;
const float LFIELD_FLAGS = 3;
const float LFIELD_STYLE = 4;
const float LFIELD_ANGLES = 5;
const float LFIELD_FOV = 6;
const float LFIELD_CORONA = 7;
const float LFIELD_CORONASCALE = 8;
const float LFIELD_CUBEMAPNAME = 9;
const float LFIELD_AMBIENTSCALE = 10;
const float LFIELD_DIFFUSESCALE = 11;
const float LFIELD_SPECULARSCALE = 12;
const float LFIELD_ROTATION = 13;
const float LFIELD_DIETIME = 14;
const float LFIELD_RGBDECAY = 15;
const float LFIELD_RADIUSDECAY = 16;
2024-01-10 21:33:06 +00:00
const float LFIELD_STYLESTRING = 17;
const float LFIELD_NEARCLIP = 18;
const float LFIELD_OWNER = 19;
2022-02-08 18:42:28 +00:00
const float LFLAG_NORMALMODE = 1;
const float LFLAG_REALTIMEMODE = 2;
const float LFLAG_LIGHTMAP = 4;
const float LFLAG_FLASHBLEND = 8;
const float LFLAG_NOSHADOWS = 256;
const float LFLAG_SHADOWMAP = 512;
const float LFLAG_CREPUSCULAR = 1024;
2024-01-10 21:33:06 +00:00
const float LFLAG_ORTHOSUN = 2048;
2022-02-08 18:42:28 +00:00
const float TEREDIT_RELOAD = 0;
const float TEREDIT_SAVE = 1;
const float TEREDIT_SETHOLE = 2;
const float TEREDIT_HEIGHT_SET = 3;
const float TEREDIT_HEIGHT_SMOOTH = 4;
const float TEREDIT_HEIGHT_SPREAD = 5;
const float TEREDIT_HEIGHT_RAISE = 6;
const float TEREDIT_HEIGHT_FLATTEN = 18;
const float TEREDIT_HEIGHT_LOWER = 7;
const float TEREDIT_TEX_KILL = 8;
const float TEREDIT_TEX_GET = 9;
const float TEREDIT_TEX_BLEND = 10;
const float TEREDIT_TEX_UNIFY = 11;
const float TEREDIT_TEX_NOISE = 12;
const float TEREDIT_TEX_BLUR = 13;
const float TEREDIT_TEX_REPLACE = 19;
const float TEREDIT_TEX_SETMASK = 25;
const float TEREDIT_WATER_SET = 14;
const float TEREDIT_MESH_ADD = 15;
const float TEREDIT_MESH_KILL = 16;
const float TEREDIT_TINT = 17;
const float TEREDIT_RESET_SECT = 20;
const float TEREDIT_RELOAD_SECT = 21;
const float TEREDIT_ENT_GET = 26;
const float TEREDIT_ENT_SET = 27;
const float TEREDIT_ENT_ADD = 28;
const float TEREDIT_ENT_COUNT = 29;
const float SLIST_HOSTCACHEVIEWCOUNT = 0;
const float SLIST_HOSTCACHETOTALCOUNT = 1;
const float SLIST_MASTERQUERYCOUNT = 2;
const float SLIST_MASTERREPLYCOUNT = 3;
const float SLIST_SERVERQUERYCOUNT = 4;
const float SLIST_SERVERREPLYCOUNT = 5;
const float SLIST_SORTFIELD = 6;
const float SLIST_SORTDESCENDING = 7;
const float SLIST_TEST_CONTAINS = 0;
const float SLIST_TEST_NOTCONTAIN = 1;
const float SLIST_TEST_LESSEQUAL = 2;
const float SLIST_TEST_LESS = 3;
const float SLIST_TEST_EQUAL = 4;
const float SLIST_TEST_GREATER = 5;
const float SLIST_TEST_GREATEREQUAL = 6;
const float SLIST_TEST_NOTEQUAL = 7;
const float SLIST_TEST_STARTSWITH = 8;
const float SLIST_TEST_NOTSTARTSWITH = 9;
void(vector vang) makevectors = #1; /*
Takes an angle vector (pitch,yaw,roll) (+x=DOWN). Writes its results into v_forward, v_right, v_up vectors. */
void(entity e, vector o) setorigin = #2; /*
Changes e's origin to be equal to o. Also relinks collision state (as well as setting absmin+absmax), which is required after changing .solid */
void(entity e, string m) setmodel = #3; /*
Looks up m in the model precache list, and sets both e.model and e.modelindex to match. BSP models will set e.mins and e.maxs accordingly, other models depend upon the value of sv_gameplayfix_setmodelrealbox - for compatibility you should always call setsize after all pickups or non-bsp models. Also relinks collision state. */
void(entity e, vector min, vector max) setsize = #4; /*
Sets the e's mins and maxs fields. Also relinks collision state, which sets absmin and absmax too. */
2024-01-10 21:33:06 +00:00
void() breakpoint = #6; /*
Trigger a debugging event. FTE will break into the qc debugger. Other engines may crash with a debug execption. */
2022-02-08 18:42:28 +00:00
float() random = #7; /*
Returns a random value between 0 and 1. Be warned, this builtin can return 1 in most engines, which can break arrays. */
void(entity e, float chan, string samp, float vol, float atten, optional float speedpct, optional float flags, optional float timeofs) sound = #8; /*
Starts a sound centered upon the given entity.
chan is the entity sound channel to use, channel 0 will allow you to mix many samples at once, others will replace the old sample
'samp' must have been precached first
if specified, 'speedpct' should normally be around 100 (or =0), 200 for double speed or 50 for half speed.
If flags is specified, the reliable flag in the channels argument is used for additional channels. Flags should be made from SOUNDFLAG_* constants
timeofs should be negative in order to provide a delay before the sound actually starts. */
vector(vector v) normalize = #9; /*
Shorten or lengthen a direction vector such that it is only one quake unit long. */
void(string e) error = #10; /*
Ends the game with an easily readable error message. */
void(string e) objerror = #11; /*
Displays a non-fatal easily readable error message concerning the self entity, including a field dump. self will be removed! */
float(vector v) vlen = #12; /*
Returns the square root of the dotproduct of a vector with itself. Or in other words the length of a distance vector, in quake units. */
float(vector v, optional entity reference) vectoyaw = #13; /*
Given a direction vector, returns the yaw angle in which that direction vector points. If an entity is passed, the yaw angle will be relative to that entity's gravity direction. */
entity() spawn = #14; /*
Adds a brand new entity into the world! Hurrah, you're now a parent! */
void(entity e) remove = #15; /*
2024-01-10 21:33:06 +00:00
Destroys the given entity and clears some limited fields (including model, modelindex, solid, classname). Any references to the entity following the call are an error. After half a second the entity will be reused, in the interim you can unfortunatly still read its fields to see if the reference is no longer valid. */
void(entity e) removeinstant = #0:removeinstant; /*
Same thing as the regular remove builtin, but bypasses the half-second rule. The entity slot may be reused instantly. Be CERTAIN that you have no lingering references, because if they're followed they will end up poking an entirely different type of entity! So only use this where you're sure its safe. */
2022-02-08 18:42:28 +00:00
void(vector v1, vector v2, float flags, entity ent) traceline = #16; /*
Traces a thin line through the world from v1 towards v2.
Will not collide with ent, ent.owner, or any entity who's owner field refers to ent.
The passed entity will also be used to determine whether to use a capsule trace, the contents that the trace should impact, and a couple of other extra fields that define the trace.
There are no side effects beyond the trace_* globals being written.
flags&MOVE_NOMONSTERS will not impact on non-bsp entities.
flags&MOVE_MISSILE will impact with increased size.
flags&MOVE_HITMODEL will impact upon model meshes, instead of their bounding boxes.
flags&MOVE_TRIGGERS will also stop on triggers
flags&MOVE_EVERYTHING will stop if it hits anything, even non-solid entities.
flags&MOVE_LAGGED will backdate entity positions for the purposes of this builtin according to the indicated player ent's latency, to provide lag compensation. */
entity(entity start, .string fld, string match) find = #18; /*
Scan for the next entity with a given field set to the given 'match' value. start should be either world, or the previous entity that was found. Returns world on failure/if there are no more.
If you have many many entities then you may find that hashtables will give more performance (but requires extra upkeep). */
2024-01-10 21:33:06 +00:00
entity*(.__variant fld, __variant match, int type=EV_STRING, __out int count) find_list = #0:find_list; /*
Scan for the next entity with a given field set to the given 'match' value. start should be either world, or the previous entity that was found. Returns world on failure/if there are no more.
If you have many many entities then you may find that hashtables will give more performance (but requires extra upkeep). */
2022-02-08 18:42:28 +00:00
string(string s) precache_sound = #19; /*
Precaches a sound, making it known to clients and loading it from disk. This builtin (strongly) should be called during spawn functions. This builtin must be called for the sound before the sound builtin is called, or it might not even be heard. */
string(string s) precache_model = #20; /*
Precaches a model, making it known to clients and loading it from disk if it has a .bsp extension. This builtin (strongly) should be called during spawn functions. This must be called for each model name before setmodel may use that model name.
Modelindicies precached in SSQC will always be positive. CSQC precaches will be negative if they are not also on the server. */
entity(vector org, float rad, optional .entity chainfield) findradius = #22; /*
2024-01-10 21:33:06 +00:00
Finds all entities within a distance of the 'org' specified. One entity is returned directly, while other entities are returned via that entity's .chain field. Use findradius_list for an updated alternative without reenterancy issues. */
entity*(vector org, float rad, __out int foundcount, int sort=0) findradius_list = #0:findradius_list; /*
Finds all entities linked with a bbox within a distance of the 'org' specified, returning the list as a temp-array (world signifies the end). Unlike findradius, sv_gameplayfix_blowupfallenzombies is ignored (use FL_FINDABLE_NONSOLID instead), while sv_gameplayfix_findradiusdistancetobox and dpcompat_findradiusarealinks are force-enabled. The resulting buffer will automatically be cleaned up by the engine and does not need to be freed. */
2022-02-08 18:42:28 +00:00
void(string s, ...) dprint = #25; /*
NQ: Prints the given message on the server's console, but only if the developer cvar is set. Arguments will be concatenated into a single message. */
void(string s, ...) dprint = #25; /*
QW: Unconditionally prints the given message on the server's console. Arguments will be concatenated into a single message. */
string(float val) ftos = #26; /*
Returns a tempstring containing a representation of the given float. Precision depends upon engine. */
string(vector val) vtos = #27; /*
Returns a tempstring containing a representation of the given vector. Precision depends upon engine. */
void() coredump = #28; /*
Writes out a coredump. This contains stack, globals, and field info for all ents. This can be handy for debugging. */
void() traceon = #29; /*
Enables tracing. This may be spammy, slow, and stuff. Set debugger 1 in order to use fte's qc debugger. */
void() traceoff = #30; /*
Disables tracing again. */
void(entity e) eprint = #31; /*
Debugging builtin that prints all fields of the given entity to the console. */
float(float yaw, float dist, optional float settraceglobals) walkmove = #32; /*
Attempt to walk the entity at a given angle for a given distance.
if settraceglobals is set, the trace_* globals will be set, showing the results of the movement.
This function will trigger touch events. */
float() droptofloor = #34; /*
Instantly moves the entity downwards until it hits the ground. If the entity is in solid or would need to drop more than 'pr_droptofloorunits' quake units, its position will be considered invalid and the builtin will abort, returning FALSE, otherwise TRUE. */
void(float lightstyle, string stylestring, optional vector rgb) lightstyle = #35; /*
Specifies an auto-animating string that specifies the light intensity for entities using that lightstyle.
a is off, z is fully lit. Should be lower case only.
rgb will recolour all lights using that lightstyle. */
float(float) rint = #36; /*
Rounds the given float up or down to the closest integeral value. X.5 rounds away from 0 */
float(float) floor = #37; /*
Rounds the given float downwards, even when negative. */
float(float) ceil = #38; /*
Rounds the given float upwards, even when negative. */
float(entity ent) checkbottom = #40; /*
Expensive checks to ensure that the entity is actually sitting on something solid, returns true if it is. */
float(vector pos) pointcontents = #41; /*
2024-01-10 21:33:06 +00:00
Checks the given point to see what is there. Returns one of the CONTENTS_* constants. Just because a point is empty does not mean that the player can stand there due to the size of the player - use tracebox for such tests. */
__uint(vector pos, optional float worldonly=1) pointcontentsmask = #0:pointcontentsmask; /*
Checks the given point to see what is there. Returns a mask of the CONTENTBIT_* constants. Just because a point is empty does not mean that the player can stand there due to the size of the player - use tracebox for such tests. */
2022-02-08 18:42:28 +00:00
float(float) fabs = #43; /*
Removes the sign of the float, making it positive if it is negative. */
float(string) cvar = #45; /*
Returns the numeric value of the named cvar */
void(string, ...) localcmd = #46; /*
Adds the string to the console command queue. Commands will not be executed immediately, but rather at the start of the following frame. */
entity(entity) nextent = #47; /*
Returns the following entity. Skips over removed entities. Returns world when passed the last valid entity. */
void(vector pos, vector dir, float colour, float count) particle = #48; /*
Spawn 'count' particles around 'pos' moving in the direction 'dir', with a palette colour index between 'colour' and 'colour+8'. */
#define ChangeYaw changeyaw
void() changeyaw = #49; /*
Changes the self.angles_y field towards self.ideal_yaw by up to self.yaw_speed. */
vector(vector fwd, optional vector up) vectoangles = #51; /*
Returns the angles (+x=UP) required to orient an entity to look in the given direction. The 'up' argument is required if you wish to set a roll angle, otherwise it will be limited to just monster-style turning. */
float(float angle) sin = #60; /* Part of DP_QC_SINCOSSQRTPOW
Forgive me father, for I have trigonometry homework. */
float(float angle) cos = #61; /* Part of DP_QC_SINCOSSQRTPOW*/
float(float value) sqrt = #62; /* Part of DP_QC_SINCOSSQRTPOW*/
void(entity ent) changepitch = #63; /* Part of DP_QC_CHANGEPITCH*/
void(entity ent, entity ignore) tracetoss = #64;
string(entity ent) etos = #65; /* Part of DP_QC_ETOS*/
void(float step) movetogoal = #67; /*
Runs lots and lots of fancy logic in order to try to step the entity the specified distance towards its goalentity. */
string(string s) precache_file = #68; /*
This builtin does nothing. It was used only as a hint for pak generation. */
void(entity e) makestatic = #69; /*
Sends a copy of the entity's renderable fields to all clients, and REMOVES the entity, preventing further changes. This means it will be unmutable and non-solid. */
void(string cvarname, string valuetoset) cvar_set = #72; /*
2024-01-10 21:33:06 +00:00
Instantly sets a cvar to the given string value. Warning: the resulting string includes apostrophies surrounding the result. You may wish to use sprintf instead. */
2022-02-08 18:42:28 +00:00
void (vector pos, string samp, float vol, float atten) ambientsound = #74;
string(string str) precache_model2 = #75;
string(string str) precache_sound2 = #76;
string(string str) precache_file2 = #77;
string(entity e, string key) infokey = #80; /* Part of FTE_QC_INFOKEY, QW_ENGINE
If e is world, returns the field 'key' from either the serverinfo or the localinfo. If e is a player, returns the value of 'key' from the player's userinfo string. There are a few special exceptions, like 'ip' which is not technically part of the userinfo. */
float(string) stof = #81; /* Part of FRIK_FILE, FTE_QC_INFOKEY, FTE_STRINGS, QW_ENGINE, ZQ_QC_STRINGS*/
string(float style, optional __out vector rgb) getlightstyle = #0:getlightstyle; /*
Obtains the light style string for the given style. */
vector(float style) getlightstylergb = #0:getlightstylergb; /*
Obtains the current rgb value of the specified light style. In csqc, this is correct with regard to the current frame, while ssqc gives no guarentees about time and ignores client cvars. Note: use getlight if you want the actual light value at a point. */
void(vector start, vector mins, vector maxs, vector end, float nomonsters, entity ent) tracebox = #90; /* Part of DP_QC_TRACEBOX
Exactly like traceline, but a box instead of a uselessly thin point. Acceptable sizes are limited by bsp format, q1bsp has strict acceptable size values. */
vector() randomvec = #91; /* Part of DP_QC_RANDOMVEC
Returns a vector with random values. Each axis is independantly a value between -1 and 1 inclusive. */
2024-01-10 21:33:06 +00:00
vector(vector org) getlight = #92; /* Part of DP_QC_GETLIGHT*/
2022-02-08 18:42:28 +00:00
float(string cvarname, string defaultvalue) registercvar = #93; /* Part of DP_REGISTERCVAR
Creates a new cvar on the fly. If it does not already exist, it will be given the specified value. If it does exist, this is a no-op.
This builtin has the limitation that it does not apply to configs or commandlines. Such configs will need to use the set or seta command causing this builtin to be a noop.
In engines that support it, you will generally find the autocvar feature easier and more efficient to use. */
float(float a, float b, ...) min = #94; /* Part of DP_QC_MINMAXBOUND
Returns the lowest value of its arguments. */
float(float a, float b, ...) max = #95; /* Part of DP_QC_MINMAXBOUND
Returns the highest value of its arguments. */
float(float minimum, float val, float maximum) bound = #96; /* Part of DP_QC_MINMAXBOUND
Returns val, unless minimum is higher, or maximum is less. */
float(float value, float exp) pow = #97; /* Part of DP_QC_SINCOSSQRTPOW*/
float(float v, optional float base) logarithm = #0:logarithm; /*
Determines the logarithm of the input value according to the specified base. This can be used to calculate how much something was shifted by. */
#define findentity findfloat
entity(entity start, .__variant fld, __variant match) findfloat = #98; /* Part of DP_QC_FINDFLOAT
Equivelent to the find builtin, but instead of comparing strings contents, this builtin compares the raw values. This builtin requires multiple calls in order to scan all entities - set start to the previous call's return value.
world is returned when there are no more entities. */
float(string extname) checkextension = #99; /*
Checks for an extension by its name (eg: checkextension("FRIK_FILE") says that its okay to go ahead and use strcat).
Use cvar("pr_checkextension") to see if this builtin exists. */
float(__variant funcref) checkbuiltin = #0:checkbuiltin; /*
Checks to see if the specified builtin is supported/mapped. This is intended as a way to check for #0 functions, allowing for simple single-builtin functions. Warning, if two different engines map different builtins to the same number, then this function will not tell you which will be called, only that it won't crash (the exception being #0, which are remapped as available). */
float(float value) anglemod = #102;
2024-01-10 21:33:06 +00:00
float(float newangle, float oldangle) anglesub = #0:anglesub; /*
Returns newangle-oldangle, except returning the shortest route around a circle so yields a result between -180 and +180. */
2022-02-08 18:42:28 +00:00
filestream(string filename, float mode, optional float mmapminsize) fopen = #110; /* Part of FRIK_FILE
Opens a file, typically prefixed with "data/", for either read or write access. */
void(filestream fhandle) fclose = #111; /* Part of FRIK_FILE*/
string(filestream fhandle) fgets = #112; /* Part of FRIK_FILE
Reads a single line out of the file. The new line character is not returned as part of the string. Returns the null string on EOF (use if not(string) to easily test for this, which distinguishes it from the empty string which is returned if the line being read is blank */
void(filestream fhandle, string s, optional string s2, optional string s3, optional string s4, optional string s5, optional string s6, optional string s7) fputs = #113; /* Part of FRIK_FILE
Writes the given string(s) into the file. For compatibility with fgets, you should ensure that the string is terminated with a \n - this will not otherwise be done for you. It is up to the engine whether dos or unix line endings are actually written. */
int(filestream fhandle, void *ptr, int size) fread = #0:fread; /* Part of FTE_QC_FILE_BINARY
Reads binary data out of the file. Returns truncated lengths if the read exceeds the length of the file. */
int(filestream fhandle, void *ptr, int size) fwrite = #0:fwrite; /* Part of FTE_QC_FILE_BINARY
Writes binary data out of the file. */
#define ftell fseek //c compat
int(filestream fhandle, optional int newoffset) fseek = #0:fseek; /* Part of FTE_QC_FILE_BINARY
Changes the current position of the file, if specified. Returns prior position, in bytes. */
int(filestream fhandle, optional int newsize) fsize = #0:fsize; /* Part of FTE_QC_FILE_BINARY
Reports the total size of the file, in bytes. Can also be used to truncate/extend the file */
float(string s) strlen = #114; /* Part of FRIK_FILE, FTE_STRINGS, ZQ_QC_STRINGS*/
string(string s1, optional string s2, optional string s3, optional string s4, optional string s5, optional string s6, optional string s7, optional string s8) strcat = #115; /* Part of FRIK_FILE, FTE_STRINGS, ZQ_QC_STRINGS*/
string(string s, float start, float length) substring = #116; /* Part of FRIK_FILE, FTE_STRINGS, ZQ_QC_STRINGS*/
vector(string s) stov = #117; /* Part of FRIK_FILE, FTE_STRINGS, ZQ_QC_STRINGS*/
2024-01-10 21:33:06 +00:00
FTEDEP("Redundant") string(string s, ...) strzone = #118; /* Part of FRIK_FILE, FTE_STRINGS, ZQ_QC_STRINGS
2022-02-08 18:42:28 +00:00
Create a semi-permanent copy of a string that only becomes invalid once strunzone is called on the string (instead of when the engine assumes your string has left scope). This builtin has become redundant in FTEQW due to the FTE_QC_PERSISTENTTEMPSTRINGS extension and is now functionally identical to strcat for compatibility with old engines+mods. */
2024-01-10 21:33:06 +00:00
FTEDEP("Redundant") void(string s) strunzone = #119; /* Part of FRIK_FILE, FTE_STRINGS, ZQ_QC_STRINGS
2022-02-08 18:42:28 +00:00
Destroys a string that was allocated by strunzone. Further references to the string MAY crash the game. In FTE, this function became redundant and now does nothing. */
2024-01-10 21:33:06 +00:00
void*(int bytes) createbuffer = #0:createbuffer; /*
Returns a temporary buffer that can be written to / read from. The buffer will be garbage collected and thus cannot be explicitly freed. Tempstrings and buffer references must not be stored into the buffer as the garbage collector will not scan these. */
2022-02-08 18:42:28 +00:00
void(string soundname, optional float channel, optional float volume) localsound = #177; /*
Plays a sound... locally... probably best not to call this from ssqc. Also disables reverb. */
float(string modelname, optional float queryonly) getmodelindex = #200; /*
Acts as an alternative to precache_model(foo);setmodel(bar, foo); return bar.modelindex;
If queryonly is set and the model was not previously precached, the builtin will return 0 without needlessly precaching the model. */
2024-01-10 21:33:06 +00:00
float(string soundname, optional float queryonly) getsoundindex = #0:getsoundindex; /*
Provides a way to query if a sound is already precached or not. The return value can also be checked for <=255 to see if it'll work over any network protocol. The sound index can also be used for writebyte hacks, but this is discouraged - use SOUNDFLAG_UNICAST instead. */
2022-02-08 18:42:28 +00:00
__variant(float prnum, string funcname, ...) externcall = #201; /* Part of FTE_MULTIPROGS
Directly call a function in a different/same progs by its name.
prnum=0 is the 'default' or 'main' progs.
prnum=-1 means current progs.
prnum=-2 will scan through the active progs and will use the first it finds. */
float(string progsname) addprogs = #202; /* Part of FTE_MULTIPROGS
Loads an additional .dat file into the current qcvm. The returned handle can be used with any of the externcall/externset/externvalue builtins.
There are cvars that allow progs to be loaded automatically. */
__variant(float prnum, string varname) externvalue = #203; /* Part of FTE_MULTIPROGS
Reads a global in the named progs by the name of that global.
prnum=0 is the 'default' or 'main' progs.
prnum=-1 means current progs.
prnum=-2 will scan through the active progs and will use the first it finds. */
void(float prnum, __variant newval, string varname) externset = #204; /* Part of FTE_MULTIPROGS
Sets a global in the named progs by name.
prnum=0 is the 'default' or 'main' progs.
prnum=-1 means current progs.
prnum=-2 will scan through the active progs and will use the first it finds. */
void(entity portal, float state) openportal = #207; /*
Opens or closes the portals associated with a door or some such on q2 or q3 maps. On Q2BSPs, the entity should be the 'func_areaportal' entity - its style field will say which portal to open. On Q3BSPs, the entity is the door itself, the portal will be determined by the two areas found from a preceding setorigin call. */
void(optional __variant ret) abort = #211; /* Part of FTE_MULTITHREADED
QC execution is aborted. Parent QC functions on the stack will be skipped, effectively this forces all QC functions to 'return ret' until execution returns to the engine. If ret is ommited, it is assumed to be 0. */
void(vector org, vector dmin, vector dmax, float colour, float effect, float count) particle2 = #215; /* Part of FTE_HEXEN2*/
void(vector org, vector box, float colour, float effect, float count) particle3 = #216; /* Part of FTE_HEXEN2*/
void(vector org, float radius, float colour, float effect, float count) particle4 = #217; /* Part of FTE_HEXEN2*/
float(float number, float quantity) bitshift = #218; /* Part of EXT_BITSHIFT*/
void(vector pos) te_lightningblood = #219; /* Part of FTE_TE_STANDARDEFFECTBUILTINS*/
float(string s1, string sub, optional float startidx) strstrofs = #221; /* Part of FTE_STRINGS
Returns the 0-based offset of sub within the s1 string, or -1 if sub is not in s1.
If startidx is set, this builtin will ignore matches before that 0-based offset. */
float(string str, float index) str2chr = #222; /* Part of FTE_STRINGS
Retrieves the character value at offset 'index'. */
string(float chr, ...) chr2str = #223; /* Part of FTE_STRINGS
The input floats are considered character values, and are concatenated. */
string(float ccase, float redalpha, float redchars, string str, ...) strconv = #224; /* Part of FTE_STRINGS
Converts quake chars in the input string amongst different representations.
ccase specifies the new case for letters.
0: not changed.
1: forced to lower case.
2: forced to upper case.
redalpha and redchars switch between colour ranges.
0: no change.
1: Forced white.
2: Forced red.
3: Forced gold(low) (numbers only).
4: Forced gold (high) (numbers only).
5+6: Forced to white and red alternately.
You should not use this builtin in combination with UTF-8. */
string(float pad, string str1, ...) strpad = #225; /* Part of FTE_STRINGS
Pads the string with spaces, to ensure its a specific length (so long as a fixed-width font is used, anyway). If pad is negative, the spaces are added on the left. If positive the padding is on the right. */
2024-01-10 21:33:06 +00:00
infostring(infostring old, string key, string value) infoadd = #226; /* Part of FTE_STRINGS
2022-02-08 18:42:28 +00:00
Returns a new tempstring infostring with the named value changed (or added if it was previously unspecified). Key and value may not contain the \ character. */
string(infostring info, string key) infoget = #227; /* Part of FTE_STRINGS
Reads a named value from an infostring. The returned value is a tempstring */
#define strcmp strncmp
float(string s1, string s2, optional float len, optional float s1ofs, optional float s2ofs) strncmp = #228; /* Part of FTE_STRINGS
Compares up to 'len' chars in the two strings. s1ofs allows you to treat s2 as a substring to compare against, or should be 0.
Returns 0 if the two strings are equal, a negative value if s1 appears numerically lower, and positive if s1 appears numerically higher. */
float(string s1, string s2) strcasecmp = #229; /* Part of FTE_STRINGS
Compares the two strings without case sensitivity.
Returns 0 if they are equal. The sign of the return value may be significant, but should not be depended upon. */
float(string s1, string s2, float len, optional float s1ofs, optional float s2ofs) strncasecmp = #230; /* Part of FTE_STRINGS
Compares up to 'len' chars in the two strings without case sensitivity. s1ofs allows you to treat s2 as a substring to compare against, or should be 0.
Returns 0 if they are equal. The sign of the return value may be significant, but should not be depended upon. */
string(string s) strtrim = #0:strtrim; /*
Trims the whitespace from the start+end of the string. */
2024-01-10 21:33:06 +00:00
__deprecated("Use strftime.") void() calltimeofday = #231; /* Part of FTE_CALLTIMEOFDAY
2022-02-08 18:42:28 +00:00
Asks the engine to instantly call the qc's 'timeofday' function, before returning. For compatibility with mvdsv.
timeofday should have the prototype: void(float secs, float mins, float hour, float day, float mon, float year, string strvalue)
The strftime builtin is more versatile and less weird. */
void(vector angle) rotatevectorsbyangle = #235; /*
rotates the v_forward,v_right,v_up matrix by the specified angles. */
void(vector fwd, vector right, vector up) rotatevectorsbyvectors = #236;
float(float mdlindex, string skinname) skinforname = #237;
float(string shadername, optional string defaultshader, ...) shaderforname = #238; /* Part of FTE_FORCESHADER
Caches the named shader and returns a handle to it.
If the shader could not be loaded from disk (missing file or ruleset_allow_shaders 0), it will be created from the 'defaultshader' string if specified, or a 'skin shader' default will be used.
defaultshader if not empty should include the outer {} that you would ordinarily find in a shader. */
2024-01-10 21:33:06 +00:00
void(string shadername, string replacement, float timeoffset) remapshader = #0:remapshader; /*
All surfaces drawn with the specified shader will instead be drawn using the specified replacement shader. Shaders can be remapped to something else later by using the same source shadername. This is mostly useful for worldmodel surfaces (eg showing which team is currently winning). Entities should generally use setcustomskin or forceshader instead. Remaps will be forgotten on vid_reload, but can be reapplied via CSQC_RendererRestarted. */
2022-02-08 18:42:28 +00:00
void(vector org, optional float count) te_bloodqw = #239; /* Part of FTE_TE_STANDARDEFFECTBUILTINS*/
float(vector viewpos, entity entity) checkpvs = #240; /* Part of FTE_QC_CHECKPVS*/
2024-01-10 21:33:06 +00:00
float(string destaddress, string content) sendpacket = #242; /* Part of FTE_QC_SENDPACKET
Sends a UDP packet to the specified destination. Note that the payload will be prefixed with four 255 bytes as a sort of security feature. */
2022-02-08 18:42:28 +00:00
vector(entity ent, float tagnum) rotatevectorsbytag = #244;
float(float dividend, float divisor) mod = #245;
2024-01-10 21:33:06 +00:00
typedef struct json_s *json_t;
accessor jsonnode : json_t;
jsonnode(string) json_parse = #0:json_parse; /*
Parses the given JSON string. */
void(jsonnode) json_free = #0:json_free; /*
Frees a json tree and all of its children. Must only be called on the root node. */
enum json_type_e : int
{
JSON_TYPE_STRING,
JSON_TYPE_NUMBER,
JSON_TYPE_OBJECT,
JSON_TYPE_ARRAY,
JSON_TYPE_TRUE,
JSON_TYPE_FALSE,
JSON_TYPE_NULL
};
json_type_e(jsonnode node) json_get_value_type = #0:json_get_value_type; /*
Get type of a JSON value. */
int(jsonnode node) json_get_integer = #0:json_get_integer; /*
Get an integer from a json node. */
float(jsonnode node) json_get_float = #0:json_get_float; /*
Get a float from a json node. */
string(jsonnode node) json_get_string = #0:json_get_string; /*
Get a string from a value. Returns a null string if its not a string type. */
jsonnode(jsonnode node, string) json_find_object_child = #0:json_find_object_child; /*
Find a child of a json object by name. Returns NULL if the handle couldn't be found. */
int(jsonnode node) json_get_length = #0:json_get_length; /*
Get the length of a json array or object. Returns 0 if its not an array. */
jsonnode(jsonnode node, int childindex) json_get_child_at_index = #0:json_get_child_at_index; /*
Get the nth child of a json array or object. Returns NULL if the index is out of range. */
string(jsonnode node) json_get_name = #0:json_get_name; /*
Gets the object's name (useful if you're using json_get_child_at_index to walk an object's children for whatever reason). */
string(string javascript) js_run_script = #0:js_run_script; /*
Runs the provided javascript snippet. This builtin functions only in emscripten builds, returning a null string on other systems (or if the script evaluates to null). */
2022-02-08 18:42:28 +00:00
int(string) stoi = #259; /* Part of FTE_QC_INTCONV
Converts the given string into a true integer. Base 8, 10, or 16 is determined based upon the format of the string. */
string(int) itos = #260; /* Part of FTE_QC_INTCONV
Converts the passed true integer into a base10 string. */
int(string) stoh = #261; /* Part of FTE_QC_INTCONV
Reads a base-16 string (with or without 0x prefix) as an integer. Bugs out if given a base 8 or base 10 string. :P */
string(int) htos = #262; /* Part of FTE_QC_INTCONV
Formats an integer as a base16 string, with leading 0s and no prefix. Always returns 8 characters. */
int(float) ftoi = #0:ftoi; /* Part of FTE_QC_INTCONV
Converts the given float into a true integer without depending on extended qcvm instructions. */
2024-01-10 21:33:06 +00:00
float(int, optional float shift, float mask=24) itof = #0:itof; /* Part of FTE_QC_INTCONV
Converts the given true integer into a float without depending on extended qcvm instructions. If shift and mask are specified then only specific parts of the integer will be cast to float. */
2022-02-08 18:42:28 +00:00
float(float modlindex, optional float useabstransforms) skel_create = #263; /* Part of FTE_CSQC_SKELETONOBJECTS
Allocates a new uninitiaised skeletal object, with enough bone info to animate the given model.
eg: self.skeletonobject = skel_create(self.modelindex); */
float(float skel, entity ent, float modelindex, float retainfrac, float firstbone, float lastbone, optional float addfrac) skel_build = #264; /* Part of FTE_CSQC_SKELETONOBJECTS
Animation data (according to the entity's frame info) is pulled from the specified model and blended into the specified skeletal object.
If retainfrac is set to 0 on the first call and 1 on the others, you can blend multiple animations together according to the addfrac value. The final weight should be 1. Other values will result in scaling and/or other weirdness. You can use firstbone and lastbone to update only part of the skeletal object, to allow legs to animate separately from torso, use 0 for both arguments to specify all, as bones are 1-based. */
2024-01-10 21:33:06 +00:00
typedef struct
{
int sourcemodelindex; /*frame data will be imported from this model, bones must be compatible*/
int reserved;
int firstbone;
int lastbone;
float prescale; /*0 destroys existing data, 1 retains it*/
float scale[4]; /*you'll need to do lerpfrac manually*/
int animation[4];
float animationtime[4];
/*halflife models*/
float subblend[2];
float controllers[5];
} skelblend_t;
float(float skel, int numblends, skelblend_t *weights, int structsize) skel_build_ptr = #0:skel_build_ptr; /*
Like skel_build, but slightly simpler. */
2022-02-08 18:42:28 +00:00
float(float skel) skel_get_numbones = #265; /* Part of FTE_CSQC_SKELETONOBJECTS
Retrives the number of bones in the model. The valid range is 1<=bone<=numbones. */
string(float skel, float bonenum) skel_get_bonename = #266; /* Part of FTE_CSQC_SKELETONOBJECTS
Retrieves the name of the specified bone. Mostly only for debugging. */
float(float skel, float bonenum) skel_get_boneparent = #267; /* Part of FTE_CSQC_SKELETONOBJECTS
Retrieves which bone this bone's position is relative to. Bone 0 refers to the entity's position rather than an actual bone */
float(float skel, string tagname) skel_find_bone = #268; /* Part of FTE_CSQC_SKELETONOBJECTS
Finds a bone by its name, from the model that was used to create the skeletal object. */
vector(float skel, float bonenum) skel_get_bonerel = #269; /* Part of FTE_CSQC_SKELETONOBJECTS
Gets the bone position and orientation relative to the bone's parent. Return value is the offset, and v_forward, v_right, v_up contain the orientation. */
vector(float skel, float bonenum) skel_get_boneabs = #270; /* Part of FTE_CSQC_SKELETONOBJECTS
Gets the bone position and orientation relative to the entity. Return value is the offset, and v_forward, v_right, v_up contain the orientation.
Use gettaginfo for world coord+orientation. */
void(float skel, float bonenum, vector org, optional vector fwd, optional vector right, optional vector up) skel_set_bone = #271; /* Part of FTE_CSQC_SKELETONOBJECTS
Sets a bone position relative to its parent. If the orientation arguments are not specified, v_forward+v_right+v_up are used instead. */
2024-01-10 21:33:06 +00:00
void(float skel, float bonenum, vector org, optional vector fwd, optional vector right, optional vector up) skel_premul_bone = #272; /* Part of FTE_CSQC_SKELETONOBJECTS
2022-02-08 18:42:28 +00:00
Transforms a single bone by a matrix. You can use makevectors to generate a rotation matrix from an angle. */
2024-01-10 21:33:06 +00:00
void(float skel, float startbone, float endbone, vector org, optional vector fwd, optional vector right, optional vector up) skel_premul_bones = #273; /* Part of FTE_CSQC_SKELETONOBJECTS
2022-02-08 18:42:28 +00:00
Transforms an entire consecutive range of bones by a matrix. You can use makevectors to generate a rotation matrix from an angle, but you'll probably want to divide the angle by the number of bones. */
2024-01-10 21:33:06 +00:00
void(float skel, float bonenum, vector org, optional vector fwd, optional vector right, optional vector up) skel_postmul_bone = #0:skel_postmul_bone; /*
Transforms a single bone by a matrix. You can use makevectors to generate a rotation matrix from an angle. */
2022-02-08 18:42:28 +00:00
void(float skeldst, float skelsrc, float startbone, float entbone) skel_copybones = #274; /* Part of FTE_CSQC_SKELETONOBJECTS
Copy bone data from one skeleton directly into another. */
void(float skel) skel_delete = #275; /* Part of FTE_CSQC_SKELETONOBJECTS
Deletes a skeletal object. The actual delete is delayed, allowing the skeletal object to be deleted in an entity's predraw function yet still be valid by the time the addentity+renderscene builtins need it. Also uninstanciates any ragdoll currently in effect on the skeletal object. */
float(float modidx, string framename) frameforname = #276; /* Part of FTE_CSQC_SKELETONOBJECTS
Looks up a framegroup from a model by name, avoiding the need for hardcoding. Returns -1 on error. */
float(float modidx, float framenum) frameduration = #277; /* Part of FTE_CSQC_SKELETONOBJECTS
Retrieves the duration (in seconds) of the specified framegroup. */
2024-01-10 21:33:06 +00:00
float(float modidx, int actionid) frameforaction = #0:frameforaction; /*
Returns a random frame/animation for the specified mod-defined action, or -1 if no animations have the specified action. */
void(float modidx, float framenum, __inout float basetime, float targettime, void(float timestamp, int code, string data) callback) processmodelevents = #0:processmodelevents; /* Part of FTE_GFX_MODELEVENTS
2022-02-08 18:42:28 +00:00
Calls a callback for each event that has been reached. Basetime is set to targettime. */
2024-01-10 21:33:06 +00:00
float(float modidx, float framenum, __inout float basetime, float targettime, __out int code, __out string data) getnextmodelevent = #0:getnextmodelevent; /* Part of FTE_GFX_MODELEVENTS
2022-02-08 18:42:28 +00:00
Reports the next event within a model's animation. Returns a boolean if an event was found between basetime and targettime. Writes to basetime,code,data arguments (if an event was found, basetime is set to the event's time, otherwise to targettime).
WARNING: this builtin cannot deal with multiple events with the same timestamp (only the first will be reported). */
2024-01-10 21:33:06 +00:00
float(float modidx, float framenum, int eventidx, __out float timestamp, __out int code, __out string data) getmodeleventidx = #0:getmodeleventidx; /* Part of FTE_GFX_MODELEVENTS
2022-02-08 18:42:28 +00:00
Reports an indexed event within a model's animation. Writes to timestamp,code,data arguments on success. Returns false if the animation/event/model was out of range/invalid. Does not consider looping animations (retry from index 0 if it fails and you know that its a looping animation). This builtin is more annoying to use than getnextmodelevent, but can be made to deal with multiple events with the exact same timestamp. */
#define dotproduct(v1,v2) ((vector)(v1)*(vector)(v2))
vector(vector v1, vector v2) crossproduct = #0:crossproduct; /* Part of FTE_QC_CROSSPRODUCT
Small helper function to calculate the crossproduct of two vectors. */
float(entity pusher, vector move, vector amove) pushmove = #0:pushmove;
2024-01-10 21:33:06 +00:00
__variant(float action, optional vector pos, optional float radius, optional float quant, ...) terrain_edit = #278; /* Part of FTE_TERRAIN_MAP
2022-02-08 18:42:28 +00:00
Realtime terrain editing. Actions are the TEREDIT_ constants. */
typedef struct
{
string shadername;
vector planenormal;
float planedist;
vector sdir;
float sbias;
vector tdir;
float tbias;
} brushface_t;
int(float modelidx, int brushid, brushface_t *out_faces, int maxfaces, int *out_contents) brush_get = #0:brush_get; /* Part of FTE_RAW_MAP
Queries a brush's information. You must pre-allocate the face array for the builtin to write to. Return value is the number of faces retrieved, 0 on error. */
int(float modelidx, brushface_t *in_faces, int numfaces, int contents, optional int brushid) brush_create = #0:brush_create; /* Part of FTE_RAW_MAP
Inserts a new brush into the model. Return value is the new brush's id. */
void(float modelidx, int brushid) brush_delete = #0:brush_delete; /* Part of FTE_RAW_MAP
Destroys the specified brush. */
float(float modelid, int brushid, int faceid, float selectedstate) brush_selected = #0:brush_selected; /* Part of FTE_RAW_MAP
Allows you to easily set transient visual properties of a brush. returns old value. selectedstate=-1 changes nothing (called for its return value). */
int(float modelid, int brushid, int faceid, vector *points, int maxpoints) brush_getfacepoints = #0:brush_getfacepoints; /* Part of FTE_RAW_MAP
Returns the list of verticies surrounding the given face. If face is 0, returns the center of the brush (if space for 1 point) or the mins+maxs (if space for 2 points). */
int(int faceid, brushface_t *in_faces, int numfaces, vector *points, int maxpoints) brush_calcfacepoints = #0:brush_calcfacepoints; /* Part of FTE_RAW_MAP
Determines the points of the specified face, if the specified brush were to actually be created. */
int(float modelid, vector *planes, float *dists, int numplanes, int *out_brushes, int *out_faces, int maxresults) brush_findinvolume = #0:brush_findinvolume; /* Part of FTE_RAW_MAP
Allows you to easily obtain a list of brushes+faces within the given bounding region. If out_faces is not null, the same brush might be listed twice. */
2024-01-10 21:33:06 +00:00
typedef struct
{
string shadername;
int contents;
int cpwidth;
int cpheight;
int tesswidth;
int tessheight;
vector texinfo;/*scalex,y,rot*/
} patchinfo_t;
typedef struct
{
vector xyz;
vector rgb; float a;
float s, t;
} patchvert_t;
#define patch_delete(modelidx,patchidx) brush_delete(modelidx,patchidx)
int(float modelidx, int patchid, patchvert_t *out_controlverts, int maxcp, patchinfo_t *out_info) patch_getcp = #0:patch_getcp; /*
Queries a patch's information. You must pre-allocate the face array for the builtin to write to. Return value is the total number of control verts that were retrieved, 0 on error. */
int(float modelidx, int patchid, patchvert_t *out_verts, int maxverts, __out patchinfo_t out_info) patch_getmesh = #0:patch_getmesh; /*
Queries a patch's information. You must pre-allocate the face array for the builtin to write to. Return value is the total number of control verts that were retrieved, 0 on error. */
int(float modelidx, int oldpatchid, patchvert_t *in_controlverts, patchinfo_t in_info) patch_create = #0:patch_create; /*
Inserts a new patch into the model. Return value is the new patch's id. */
typedef struct
{
vector dest;
int linkflags;
float radius;
} nodeslist_t;
void(entity ent, vector dest, int denylinkflags, void(entity ent, vector dest, int numnodes, nodeslist_t *nodelist) callback) route_calculate = #0:route_calculate; /*
Begin calculating a route. The callback function will be called once the route has finished being calculated. The route must be memfreed once it is no longer needed. The route must be followed in reverse order (ie: the first node that must be reached is at index numnodes-1). If no route is available then the callback will be called with no nodes. */
2022-02-08 18:42:28 +00:00
void(optional entity ent, optional vector neworigin) touchtriggers = #279; /*
Triggers a touch events between self and every SOLID_TRIGGER entity that it is in contact with. This should typically just be the triggers touch functions. Also optionally updates the origin of the moved entity. */
2024-01-10 21:33:06 +00:00
float(entity skelent, string dollcmd, float animskel) skel_ragupdate = #281; /* Part of FTE_QC_RAGDOLL_WIP
2022-02-08 18:42:28 +00:00
Updates the skeletal object attached to the entity according to its origin and other properties.
if animskel is non-zero, the ragdoll will animate towards the bone state in the animskel skeletal object, otherwise they will pick up the model's base pose which may not give nice results.
If dollcmd is not set, the ragdoll will update (this should be done each frame).
If the doll is updated without having a valid doll, the model's default .doll will be instanciated.
commands:
doll foo.doll : sets up the entity to use the named doll file
dollstring TEXT : uses the doll file directly embedded within qc, with that extra prefix.
cleardoll : uninstanciates the doll without destroying the skeletal object.
animate 0.5 : specifies the strength of the ragdoll as a whole
animatebody somebody 0.5 : specifies the strength of the ragdoll on a specific body (0 will disable ragdoll animations on that body).
enablejoint somejoint 1 : enables (or disables) a joint. Disabling joints will allow the doll to shatter. */
2024-01-10 21:33:06 +00:00
float*(float skel) skel_mmap = #282; /* Part of FTE_QC_RAGDOLL_WIP
2022-02-08 18:42:28 +00:00
Map the bones in VM memory. They can then be accessed via pointers. Each bone is 12 floats, the four vectors interleaved (sadly). */
2024-01-10 21:33:06 +00:00
void(entity ent, float bonenum, vector org, optional vector angorfwd, optional vector right, optional vector up) skel_set_bone_world = #283; /* Part of FTE_QC_RAGDOLL_WIP
2022-02-08 18:42:28 +00:00
Sets the world position of a bone within the given entity's attached skeletal object. The world position is dependant upon the owning entity's position. If no orientation argument is specified, v_forward+v_right+v_up are used for the orientation instead. If 1 is specified, it is understood as angles. If 3 are specified, they are the forawrd/right/up vectors to use. */
string(float modidx, float framenum) frametoname = #284;
string(float modidx, float skin) skintoname = #285;
float(float resourcetype, float tryload, string resourcename) resourcestatus = #286; /*
resourcetype must be one of the RESTYPE_ constants. Returns one of the RESSTATE_ constants. Tryload 0 is a query only. Tryload 1 will attempt to reload the content if it was flushed. */
hashtable(float tabsize, optional float defaulttype) hash_createtab = #287; /* Part of FTE_QC_HASHTABLES
2024-01-10 21:33:06 +00:00
Creates a hash table object.
The tabsize argument is a performance hint and should generally be set to something similar to the number of entries expected, typically a power of two assumption. Too high simply wastes memory, too low results in extra string compares but no actual bugs.
defaulttype must be one of the EV_* values, if specified.
The hash table with index 0 is a game-persistant table and will NEVER be returned by this builtin (except as an error return). */
2022-02-08 18:42:28 +00:00
void(hashtable table) hash_destroytab = #288; /* Part of FTE_QC_HASHTABLES
Destroys a hash table object. */
void(hashtable table, string name, __variant value, optional float typeandflags) hash_add = #289; /* Part of FTE_QC_HASHTABLES
Adds the given key with the given value to the table.
2024-01-10 21:33:06 +00:00
If flags&HASH_REPLACE, the old value will be removed, otherwise if flags&HASH_ADD then a duplicate entry will be added with a second value (can be obtained via hash_get's index argument).
The type argument describes how the value should be stored in saved games, as well as providing constraints with the hash_get function. While you can claim that all variables are just vectors, being more precise can result in less issues with tempstrings or saved games - be sure to be explicit with EV_STRING where appropriate because tempstrings may be reclaimed before the get (especially with saved games or table 0). */
2022-02-08 18:42:28 +00:00
__variant(hashtable table, string name, optional __variant deflt, optional float requiretype, optional float index) hash_get = #290; /* Part of FTE_QC_HASHTABLES
2024-01-10 21:33:06 +00:00
Looks up the specified key name in the hash table. Returns deflt if the key was not found.
If requiretype is specified then the function will only consider entries of the matching type (allowing you to store both flags+strings under a single name without getting confused).
If index is specified then the function will ignore the first N entries with the same key (applicable only with entries added using HASH_ADD, not HASH_REPLACE), allowing you to store multiple entries. Keep querying higher indexes starting from 0 until it returns the deflt value.
You will usually need to cast the result of this function to a real datatype. */
2022-02-08 18:42:28 +00:00
__variant(hashtable table, string name) hash_delete = #291; /* Part of FTE_QC_HASHTABLES
removes the named key. returns the value of the object that was destroyed, or 0 on error. */
string(hashtable table, float idx) hash_getkey = #292; /* Part of FTE_QC_HASHTABLES
gets some random key name. add+delete can change return values of this, so don't blindly increment the key index if you're removing all. */
float(string name) checkcommand = #294; /* Part of FTE_QC_CHECKCOMMAND
Checks to see if the supplied name is a valid command, cvar, or alias. Returns 0 if it does not exist. */
string(string s) argescape = #295; /*
Marks up a string so that it can be reliably tokenized as a single argument later. */
float(float mdlidx) modelframecount = #0:modelframecount; /*
Retrieves the number of frames in the specified model. */
void() clearscene = #300; /*
Forgets all rentities, polygons, and temporary dlights. Resets all view properties to their default values. */
void(float mask) addentities = #301; /*
Walks through all entities effectively doing this:
if (ent.drawmask&mask){ if (!ent.predaw()) addentity(ent); }
If mask&MASK_DELTA, non-csqc entities, particles, and related effects will also be added to the rentity list.
If mask&MASK_STDVIEWMODEL then the default view model will also be added. */
void(entity ent) addentity = #302; /*
Copies the entity fields into a new rentity for later rendering via addscene. */
2024-01-10 21:33:06 +00:00
void(entity ent, vector lightdir, vector lightavg, vector lightrange, int reserved1=0,void*reserved2=0) addentity_lighting = #0:addentity_lighting; /*
Copies the entity fields into a new rentity for later rendering via addscene, but with explicit lighting info. */
2022-02-08 18:42:28 +00:00
void(entity ent) removeentity = #0:removeentity; /*
Undoes all addentities added to the scene from the given entity, without removing ALL entities (useful for splitscreen/etc, readd modified versions as desired). */
typedef float vec2[2];
typedef float vec3[3];
typedef float vec4[4];
typedef struct trisoup_simple_vert_s {vec3 xyz;vec2 st;vec4 rgba;} trisoup_simple_vert_t;
void(string texturename, int flags, struct trisoup_simple_vert_s *verts, int *indexes, int numindexes) addtrisoup_simple = #0:addtrisoup_simple; /*
Adds the specified trisoup into the scene as additional geometry. This permits caching geometry to reduce builtin spam. Indexes are a triangle list (so eg quads will need 6 indicies to form two triangles). NOTE: this is not going to be a speedup over polygons if you're still generating lots of new data every frame. */
#define setviewprop setproperty
float(float property, ...) setproperty = #303; /*
Allows you to override default view properties like viewport, fov, and whether the engine hud will be drawn. Different VF_ values have slightly different arguments, some are vectors, some floats. */
void() renderscene = #304; /*
Draws all entities, polygons, and particles on the rentity list (which were added via addentities or addentity), using the various view properties set via setproperty. There is no ordering dependancy.
The scene must generally be cleared again before more entities are added, as entities will persist even over to the next frame.
You may call this builtin multiple times per frame, but should only be called from CSQC_UpdateView. */
float(vector org, float radius, vector lightcolours, optional float style, optional string cubemapname, optional float pflags) dynamiclight_add = #305; /*
Adds a temporary dlight, ready to be drawn via addscene. Cubemap orientation will be read from v_forward/v_right/v_up. */
void(string texturename, optional float flags, optional float is2d) R_BeginPolygon = #306; /*
Specifies the shader to use for the following polygons, along with optional flags.
If is2d, the polygon will be drawn as soon as the EndPolygon call is made, rather than waiting for renderscene. This allows complex 2d effects. */
void(vector org, vector texcoords, vector rgb, float alpha) R_PolygonVertex = #307; /*
Specifies a polygon vertex with its various properties. */
void() R_EndPolygon = #308; /*
2024-01-10 21:33:06 +00:00
Ends the current polygon. At least 3 verticies must have been specified. You do not need to call beginpolygon again if you wish to draw another polygon with the same shader. */
void(float radius, vector texcoordbias) R_EndPolygonRibbon = #0:R_EndPolygonRibbon; /*
Ends the current primitive and duplicates each vertex sideways into a ribbon. The texcoordbias will be added to each duplicated vertex allowing for regular 2d textures. At least 2 verticies must have been specified. You do not need to call beginpolygon again if you wish to draw another polygon with the same shader. */
2022-02-08 18:42:28 +00:00
#define getviewprop getproperty
__variant(float property) getproperty = #309; /*
Retrieve a currently-set (typically view) property, allowing you to read the current viewport or other things. Due to cheat protection, certain values may be unretrievable. */
vector (vector v) unproject = #310; /*
Transform a 2d screen-space point (with depth) into a 3d world-space point, according the various origin+angle+fov etc settings set via setproperty. */
vector (vector v) project = #311; /*
Transform a 3d world-space point into a 2d screen-space point, according the various origin+angle+fov etc settings set via setproperty. */
2024-01-10 21:33:06 +00:00
float(vector pos, vector size, float alignflags, string text) drawtextfield = #0:drawtextfield; /*
Draws a multi-line block of text, including word wrapping and alignment. alignflags bits are RTLB, typically 3. Returns the total number of lines. */
2022-02-08 18:42:28 +00:00
void(float width, vector pos1, vector pos2, vector rgb, float alpha, optional float drawflag) drawline = #315; /*
Draws a 2d line between the two 2d points. */
float(string name) iscachedpic = #316; /*
Checks to see if the image is currently loaded. Engines might lie, or cache between maps. */
2024-01-10 21:33:06 +00:00
string(string name, optional float flags) precache_pic = #317; /*
Forces the engine to load the named image. Flags are a bitmask of the PRECACHE_PIC_* flags. */
2022-02-08 18:42:28 +00:00
2024-01-10 21:33:06 +00:00
void(string imagename, int width, int height, void *pixeldata, optional int datasize, optional int format) r_uploadimage = #0:r_uploadimage; /* Part of FTE_CSQC_RAWIMAGES
Updates a texture with the specified rgba data (uploading it to the gpu). Will be created if needed. If datasize is specified then the image is decoded (eg .ktx or .dds data) instead of being raw R8G8B8A data. You'll typically want shaderforname to also generate a shader to use the texture. */
2022-02-08 18:42:28 +00:00
2024-01-10 21:33:06 +00:00
int*(string filename, __out int width, __out int height, __out int format) r_readimage = #0:r_readimage; /* Part of FTE_CSQC_RAWIMAGES
Reads and decodes an image from disk, providing raw R8G8B8A8 pixel data. Should not be used for dds or ktx etc formats. Returns __NULL__ if the image could not be read for any reason. Use memfree to free the data once you're done with it. */
2022-02-08 18:42:28 +00:00
#define draw_getimagesize drawgetimagesize
vector(string picname) drawgetimagesize = #318; /*
2024-01-10 21:33:06 +00:00
Returns the dimensions of the named image. Images specified with .lmp should give the original .lmp's dimensions even if texture replacements use a different resolution. WARNING: this function may be slow if used without or directly after its initial precache_pic. */
2022-02-08 18:42:28 +00:00
void(string name) freepic = #319; /*
Tells the engine that the image is no longer needed. The image will appear to be new the next time its needed. */
2024-01-10 21:33:06 +00:00
string(string modelname, int frame, float frametime) spriteframe = #0:spriteframe; /*
Obtains a suitable shader name to draw a sprite's shader via drawpic/R_BeginPolygon/etc, instead of needing to create a scene. */
float(vector position, float character, vector size='8 8', vector rgb='1 1 1', float alpha=1, optional float drawflag=0) drawcharacter = #320; /*
2022-02-08 18:42:28 +00:00
Draw the given quake character at the given position.
If flag&4, the function will consider the char to be a unicode char instead (or display as a ? if outside the 32-127 range).
size should normally be something like '8 8 0'.
rgb should normally be '1 1 1'
alpha normally 1.
Software engines may assume the named defaults.
Note that ALL text may be rescaled on the X axis due to variable width fonts. The X axis may even be ignored completely. */
float(vector position, string text, vector size, vector rgb, float alpha, optional float drawflag) drawrawstring = #321; /*
Draws the specified string without using any markup at all, even in engines that support it.
If UTF-8 is globally enabled in the engine, then that encoding is used (without additional markup), otherwise it is raw quake chars.
Software engines may assume a size of '8 8 0', rgb='1 1 1', alpha=1, flag&3=0, but it is not an error to draw out of the screen. */
2024-01-10 21:33:06 +00:00
float(vector position, string pic, vector size, vector rgb='1 1 1', float alpha=1, optional float drawflag=0) drawpic = #322; /*
2022-02-08 18:42:28 +00:00
Draws an shader within the given 2d screen box. Software engines may omit support for rgb+alpha, but must support rescaling, and must clip to the screen without crashing. */
float(vector position, vector size, vector rgb, float alpha, optional float drawflag) drawfill = #323; /*
Draws a solid block over the given 2d box, with given colour, alpha, and blend mode (specified via flags).
flags&3=0 simple blend.
flags&3=1 additive blend */
void(float x, float y, float width, float height) drawsetcliparea = #324; /*
Specifies a 2d clipping region (aka: scissor test). 2d draw calls will all be clipped to this 2d box, the area outside will not be modified by any 2d draw call (even 2d polygons). */
void(void) drawresetcliparea = #325; /*
Reverts the scissor/clip area to the whole screen. */
2024-01-10 21:33:06 +00:00
float(vector position, string text, vector size='8 8', vector rgb='1 1 1', float alpha=1, float drawflag=0) drawstring = #326; /*
2022-02-08 18:42:28 +00:00
Draws a string, interpreting markup and recolouring as appropriate. */
2024-01-10 21:33:06 +00:00
float(string text, float usecolours, vector fontsize='8 8') stringwidth = #327; /*
2022-02-08 18:42:28 +00:00
Calculates the width of the screen in virtual pixels. If usecolours is 1, markup that does not affect the string width will be ignored. Will always be decoded as UTF-8 if UTF-8 is globally enabled.
If the char size is not specified, '8 8 0' will be assumed. */
void(vector pos, vector sz, string pic, vector srcpos, vector srcsz, vector rgb, float alpha, optional float drawflag) drawsubpic = #328; /*
Draws a rescaled subsection of an image to the screen. */
void(vector pivot, vector mins, vector maxs, string pic, vector rgb, float alpha, float angle) drawrotpic = #0:drawrotpic; /*
Draws an image rotating at the pivot. To rotate in the center, use mins+maxs of half the size with mins negated. Angle is in degrees. */
void(vector pivot, vector mins, vector maxs, string pic, vector txmin, vector txsize, vector rgb, vector alphaandangles) drawrotsubpic = #0:drawrotsubpic; /*
Overcomplicated draw function for over complicated people. Positions follow drawrotpic, while texture coords follow drawsubpic. Due to argument count limitations in builtins, the alpha value and angles are combined into separate fields of a vector (tip: use fteqcc's [alpha, angle] feature. */
#define getstati_punf(stnum) (float)(__variant)getstati(stnum)
int(float stnum) getstati = #330; /*
2024-01-10 21:33:06 +00:00
Retrieves the full precision of a stat registered as EV_INTEGER. */
2022-02-08 18:42:28 +00:00
#define getstatbits getstatf
float(float stnum, optional float firstbit, optional float bitcount) getstatf = #331; /*
2024-01-10 21:33:06 +00:00
Retrieves the numerical value of the given EV_FLOAT stat. If firstbit and bitcount are specified, then this builtin acts as getstati combined with itof, and which should be used for STAT_ITEMS (but not other stats). */
2022-02-08 18:42:28 +00:00
string(float stnum) getstats = #332; /*
Retrieves the value of the given EV_STRING stat, as a tempstring.
Older engines may use 4 consecutive integer stats, with a limit of 15 chars (yes, really. 15.), but FTE Quake uses a separate namespace for string stats and has a much higher length limit. */
__variant(float playernum, float statnum, float stattype) getplayerstat = #0:getplayerstat; /*
2024-01-10 21:33:06 +00:00
Retrieves a specific player's stat, matching the type specified on the server. This builtin is primarily intended for mvd playback where ALL players are known. Return value matches the specified EV_ stattype. For EV_ENTITY, world will be returned if the entity is not in the pvs, use type-punning with EV_INTEGER to get the entity number if you just want to see if its set. STAT_ITEMS should be queried as an EV_INTEGER on account of runes and items2 being packed into the upper bits. */
2022-02-08 18:42:28 +00:00
void(entity e, float mdlindex) setmodelindex = #333; /*
Sets a model by precache index instead of by name. Otherwise identical to setmodel. */
string(float mdlindex) modelnameforindex = #334; /*
2024-01-10 21:33:06 +00:00
Retrieves the name of the model based upon a precache index. This can be used to reduce csqc network traffic by enabling model matching (with getmodelindex). */
string(float sndindex) soundnameforindex = #0:soundnameforindex; /*
Retrieves the name of the sound based upon a precache index. This can be used to reduce csqc network traffic by enabling sound matching (with getsoundindex). */
2022-02-08 18:42:28 +00:00
float(string effectname) particleeffectnum = #335; /* Part of DP_ENT_TRAILEFFECTNUM, FTE_SV_POINTPARTICLES
Precaches the named particle effect. If your effect name is of the form 'foo.bar' then particles/foo.cfg will be loaded by the client if foo.bar was not already defined.
Different engines will have different particle systems, this specifies the QC API only. */
void(float effectnum, entity ent, vector start, vector end) trailparticles = #336; /* Part of FTE_SV_POINTPARTICLES
Draws the given effect between the two named points. If ent is not world, distances will be cached in the entity in order to avoid framerate dependancies. The entity is not otherwise used. */
void(float effectnum, vector origin, optional vector dir, optional float count) pointparticles = #337; /* Part of FTE_SV_POINTPARTICLES
Spawn a load of particles from the given effect at the given point traveling or aiming along the direction specified. The number of particles are scaled by the count argument.
For regular particles, the dir vector is multiplied by the 'veladd' property (while orgadd will push the particles along it). Decals will use it as a hint to align to the correct surface. In both cases, it should normally be a unit vector, but other lengths will still work. If it has length 0 then FTE will assume downwards. */
void(string s, ...) cprint = #338; /*
Print into the center of the screen just as ssqc's centerprint would appear. */
void(string s, ...) print = #339; /* Part of DP_SV_PRINT
Unconditionally print on the local system's console, even in ssqc (doesn't care about the value of the developer cvar). */
string(float keynum) keynumtostring = #340; /*
Returns a hunam-readable name for the given keycode, as a tempstring. */
float(string keyname) stringtokeynum = #341; /*
Looks up the key name in the same way that the bind command would, returning the keycode for that key. */
string(float keynum) getkeybind = #342; /*
Returns the current binding for the given key (returning only the command executed when no modifiers are pressed). */
void(float usecursor, optional string cursorimage, optional vector hotspot, optional float scale) setcursormode = #343; /*
Pass TRUE if you want the engine to release the mouse cursor (absolute input events + touchscreen mode). Pass FALSE if you want the engine to grab the cursor (relative input events + standard looking). If the image name is specified, the engine will use that image for a cursor (use an empty string to clear it again), in a way that will not conflict with the console. Images specified this way will be hardware accelerated, if supported by the platform/port. */
float(float effective) getcursormode = #0:getcursormode; /*
Reports the cursor mode this module previously attempted to use. If 'effective' is true, reports the cursor mode currently active (if was overriden by a different module which has precidence, for instance, or if there is only a touchscreen and no mouse). */
vector() getmousepos = #344; /*
2024-01-10 21:33:06 +00:00
Nasty convoluted DP extension. Typically returns deltas instead of positions. Use CSQC_InputEvent instead for such things in csqc mods. */
void(vector newpos) setmousepos = #0:setmousepos; /*
Warps the mouse cursor to the given location. Should normally only be done following setcursormode(TRUE,...). The warp MAY be visible through *_InputEvent, but normally be seen as an IE_ABSMOUSE event anyway. Not all systems support cursor warping (or even cursors), so this is a hint only and you should not depend upon it. */
2022-02-08 18:42:28 +00:00
float(float inputsequencenum) getinputstate = #345; /*
Looks up an input frame from the log, setting the input_* globals accordingly.
The sequence number range used for prediction should normally be servercommandframe < sequence <= clientcommandframe.
The sequence equal to clientcommandframe will change between input frames. */
void(float sens) setsensitivityscaler = #346; /*
Temporarily scales the player's mouse sensitivity based upon something like zoom, avoiding potential cvar saving and thus corruption. */
void(entity ent) runstandardplayerphysics = #347; /*
Perform the engine's standard player movement prediction upon the given entity using the input_* globals to describe movement. */
string(float playernum, string keyname) getplayerkeyvalue = #348; /*
Look up a player's userinfo, to discover things like their name, topcolor, bottomcolor, skin, team, *ver.
Also includes scoreboard info like frags, ping, pl, userid, entertime, as well as voipspeaking and voiploudness. */
float(float playernum, string keyname, optional float assumevalue) getplayerkeyfloat = #0:getplayerkeyfloat; /*
Cheaper version of getplayerkeyvalue that avoids the need for so many tempstrings. */
2024-01-10 21:33:06 +00:00
int(float playernum, string keyname, optional void *outptr, int size) getplayerkeyblob = #0:getplayerkeyblob; /* Part of FTE_INFOBLOBS
Obtains a copy of the full data blob. Will write up to size bytes but return the full size. Does not null terminate (but memalloc(ret+1) will, if you want to cast the buffer to a string), and the blob may contain embedded nulls. Ignores all special keys, returning only what is actually there. */
void(float seat, string keyname, string newvalue) setlocaluserinfo = #0:setlocaluserinfo; /*
Change a userinfo key for the specified local player seat, equivelent to the setinfo console command. The server will normally forward the setting to other clients. */
string(float seat, string keyname) getlocaluserinfo = #0:getlocaluserinfo; /*
Reads a local userinfo key for the specified local player seat. This is not quite the same as getplayerkeyvalue, due to latency and possible serverside filtering. */
void(float seat, string keyname, void *outptr, int size) setlocaluserinfoblob = #0:setlocaluserinfoblob; /* Part of FTE_INFOBLOBS
Sets the userinfo key to a blob that may contain nulls etc. Keys with a leading underscore will be visible to only the server (for user-specific binary settings). */
int(float seat, string keyname, void *outptr, int maxsize) getlocaluserinfoblob = #0:getlocaluserinfoblob; /* Part of FTE_INFOBLOBS
Obtains a copy of the full data blob. Will write up to size bytes but return the full size. Does not null terminate (but memalloc(ret+1) will, if you want to cast the buffer to a string), and the blob may contain embedded nulls. Ignores all special keys, returning only what is actually there. */
2022-02-08 18:42:28 +00:00
float() isdemo = #349; /*
2024-01-10 21:33:06 +00:00
Returns if the client is currently playing a demo or not. Returns 2 when playing an mvd (where other player's stats can be queried, or the pov can be changed freely). */
2022-02-08 18:42:28 +00:00
float() isserver = #350; /*
2024-01-10 21:33:06 +00:00
Returns non-zero whenever the local console can directly affect the server (ie: listen servers or single-player). Compat note: DP returns 0 for single-player. */
2022-02-08 18:42:28 +00:00
void(vector origin, vector forward, vector right, vector up, optional float reverbtype) SetListener = #351; /*
Sets the position of the view, as far as the audio subsystem is concerned. This should be called once per CSQC_UpdateView as it will otherwise revert to default. For reverbtype, see setup_reverb or treat as 'underwater'. */
typedef struct {
float flDensity;
float flDiffusion;
float flGain;
float flGainHF;
float flGainLF;
float flDecayTime;
float flDecayHFRatio;
float flDecayLFRatio;
float flReflectionsGain;
float flReflectionsDelay;
vector flReflectionsPan;
float flLateReverbGain;
float flLateReverbDelay;
vector flLateReverbPan;
float flEchoTime;
float flEchoDepth;
float flModulationTime;
float flModulationDepth;
float flAirAbsorptionGainHF;
float flHFReference;
float flLFReference;
float flRoomRolloffFactor;
int iDecayHFLimit;
} reverbinfo_t;
void(float reverbslot, reverbinfo_t *reverbinfo, int sizeofreverinfo_t) setup_reverb = #0:setup_reverb; /* Part of FTE_CSQC_REVERB
Reconfigures a reverb slot for weird effects. Slot 0 is reserved for no effects. Slot 1 is reserved for underwater effects. Reserved slots will be reinitialised on snd_restart, but can otherwise be changed. These reverb slots can be activated with SetListener. Note that reverb will currently only work when using OpenAL. */
void(string cmdname) registercommand = #352; /*
Register the given console command, for easy console use.
2024-01-10 21:33:06 +00:00
Console commands that are later used will invoke CSQC_ConsoleCommand/m_consolecommand/ConsoleCmd according to module. */
2022-02-08 18:42:28 +00:00
float(entity ent) wasfreed = #353; /*
2024-01-10 21:33:06 +00:00
Quickly check to see if the entity is currently free. This function is only valid during the half-second non-reuse window, after that it may give bad results. Try one second to make it more robust. */
2022-02-08 18:42:28 +00:00
string(string key) serverkey = #354; /*
2024-01-10 21:33:06 +00:00
Look up a key in the server's public serverinfo string. If the key contains binary data then it will be truncated at the first null. */
2022-02-08 18:42:28 +00:00
float(string key, optional float assumevalue) serverkeyfloat = #0:serverkeyfloat; /*
Version of serverkey that returns the value as a float (which avoids tempstrings). */
2024-01-10 21:33:06 +00:00
int(string key, optional void *ptr, int maxsize) serverkeyblob = #0:serverkeyblob; /* Part of FTE_INFOBLOBS
Version of serverkey that returns data as a blob (ie: binary data that may contain nulls). Returns the full blob size, even if truncated (pass maxsize=0 to query required storage). */
2022-02-08 18:42:28 +00:00
string(optional string resetstring) getentitytoken = #355; /*
Grab the next token in the map's entity lump.
If resetstring is not specified, the next token will be returned with no other sideeffects.
If empty, will reset from the map before returning the first token, probably {.
If not empty, will tokenize from that string instead.
Always returns tempstrings. */
2024-01-10 21:33:06 +00:00
float(string s) findfont = #356; /* Part of DP_GFX_FONTS
2022-02-08 18:42:28 +00:00
Looks up a named font slot. Matches the actual font name as a last resort. */
2024-01-10 21:33:06 +00:00
float(string fontname, string fontmaps, string sizes, float slot, optional float fix_scale, optional float fix_voffset) loadfont = #357; /* Part of DP_GFX_FONTS
too convoluted for me to even try to explain correct usage. Try drawfont = loadfont("", "cour", "16", -1, 0, 0); to switch to the courier font (optimised for 16 virtual pixels high) ('cour' requires mscorefonts installed in linux). Additionally you can add "outline=1" as an extra token in the sizes string, to have more readable outlined fonts. */
2022-02-08 18:42:28 +00:00
void(string evname, string evargs, ...) sendevent = #359; /*
2024-01-10 21:33:06 +00:00
Invoke CSEv_evname_evargs in ssqc. evargs must be a string of initials refering to the types of the arguments to pass. v=vector, e=entity(.entnum field is sent), f=float, i=int. 6 arguments max - you can get more if you pack your floats into vectors. */
float() readbyte = #360; /*
Reads an unsigned 8-bit value, pair with WriteByte. */
float() readchar = #361; /*
Reads a signed 8-bit value. Paired with WriteChar. */
float() readshort = #362; /*
Reads a signed 16-bit value. Paired with WriteShort. */
float() readlong = #363; /*
Reads a signed 32-bit value. Paired with WriteLong or WriteInt. */
float() readcoord = #364; /*
Reads a value matching the unspecified precision written ONLY by WriteCoord. */
float() readangle = #365; /*
Reads a value matching the unspecified precision written ONLY by WriteAngle. */
string() readstring = #366; /*
Reads a null-terminated string. */
float() readfloat = #367; /*
Reads a float without any truncation nor conversions. Data MUST have originally been written with WriteFloat. */
__double() readdouble = #0:readdouble; /*
Reads a double-precision float without any truncation nor conversions. Data MUST have originally been written with WriteDouble. */
int() readint = #0:readint; /*
Reads a 32bit int without any conversions to float, otherwise interchangable with readlong. */
__int64() readint64 = #0:readint64; /*
Reads a 64bit signed int. Paired with WriteInt64. */
__uint64() readuint64 = #0:readuint64; /*
Reads a 64bit unsigned int. Paired with WriteUInt64. */
float() readentitynum = #368; /*
Reads the serverside index of an entity, paired with WriteEntity. There may be nothing else known about the entity yet, so the result typically needs to be saved as-is and re-looked up each frame. This can be done via getentity(NUM, GE_*) for non-csqc ents, or findentity(world,entnum,NUM) - both of which can fail due to latency. */
2022-02-08 18:42:28 +00:00
float(string modelname, float(float isnew) updatecallback, float flags) deltalisten = #371; /*
Specifies a per-modelindex callback to listen for engine-networking entity updates. Such entities are automatically interpolated by the engine (unless flags specifies not to).
The various standard entity fields will be overwritten each frame before the updatecallback function is called. */
2024-01-10 21:33:06 +00:00
float(vector org, float radius, vector rgb) dynamiclight_spawnstatic = #0:dynamiclight_spawnstatic; /*
Creates a static persistent light at the given position with the specified colour. Additional properties must be set via dynamiclight_set. */
2022-02-08 18:42:28 +00:00
__variant(float lno, float fld) dynamiclight_get = #372; /*
Retrieves a property from the given dynamic/rt light. Return type depends upon the light field requested. */
void(float lno, float fld, __variant value) dynamiclight_set = #373; /*
Changes a property on the given dynamic/rt light. Value type depends upon the light field to be changed. */
string(float efnum, float body) particleeffectquery = #374; /*
Retrieves either the name or the body of the effect with the given number. The effect body is regenerated from internal state, and can be changed before being reapplied via the localcmd builtin. */
void(string shadername, vector origin, vector up, vector side, vector rgb, float alpha) adddecal = #375; /*
Adds a temporary clipped decal shader to the scene, centered at the given point with given orientation. Will be drawn by the next renderscene call, and freed by the next clearscene call. */
2024-01-10 21:33:06 +00:00
void(entity e, string skinfilename, optional string skindata) setcustomskin = #376; /* Part of FTE_QC_CUSTOMSKINS
Sets an entity's skin overrides to a new skin object. Releases the entities old skin (refcounted). */
float(string skinfilename, optional string skindata) loadcustomskin = #377; /* Part of FTE_QC_CUSTOMSKINS
Creates a new skin object and returns it. These are custom per-entity surface->shader lookups. The skinfilename/data should be in .skin format:
surfacename,shadername - makes the named surface use the named shader (legacy format for compat with q3)
replace "surfacename" "shadername" - non-legacy equivalent.
2022-02-08 18:42:28 +00:00
qwskin "foo" - use an unmodified quakeworld player skin (including crop+repalette rules)
q1lower 0xff0000 - specify an override for the entity's lower colour, in this case to red
q1upper 0x0000ff - specify an override for the entity's lower colour, in this case to blue
compose "surfacename" "shader" "imagename@x,y:w,h$s,t,s2,t2?r,g,b,a" - compose a skin texture from multiple images.
The texture is determined to be sufficient to hold the first named image, additional images can be named as extra tokens on the same line.
2024-01-10 21:33:06 +00:00
Use a + at the end of the line to continue reading image tokens from the next line also, the named shader must use 'map $diffuse' to read the composed texture (compatible with the defaultskin shader). Must be matched with a releasecustomskin call later, and is pointless without applycustomskin. */
void(entity e, float skinobj) applycustomskin = #378; /* Part of FTE_QC_CUSTOMSKINS
Updates the entity's custom skin (refcounted). */
void(float skinobj) releasecustomskin = #379; /* Part of FTE_QC_CUSTOMSKINS
Lets the engine know that the skin will no longer be needed. Thanks to refcounting any ents with the skin already applied will retain their skin until later changed. It is valid to destroy a skin just after applying it to an ent in the same function that it was created in, as the skin will only be destroyed once its refcount rops to 0. */
void(float devid, float amp_low, float amp_high, float duration) gp_rumble = #0:gp_rumble; /*
Sends a single rumble event to the game-pad specified in devid. Every time you call this, the previous effect is cancelled out. */
void(float devid, float left, float right, float duration) gp_rumbletriggers = #0:gp_rumbletriggers; /*
Makes the analog triggers rumble of the specified game-pad, like gp_rumble() one call cancels out the previous one on the device. */
void(float devid, vector color) gp_setledcolor = #0:gp_setledcolor; /*
Updates the game-pad LED color. */
void(float devid, /*const*/ void *data, int size) gp_settriggerfx = #0:gp_settriggerfx; /*
Sends a specific effect packet to the controller. On the PlayStation 5's DualSense that can adjust the tension on the analog triggers. */
2022-02-08 18:42:28 +00:00
__variant*(int size) memalloc = #384; /* Part of FTE_MEMALLOC
Allocate an arbitary block of memory */
void(__variant *ptr) memfree = #385; /* Part of FTE_MEMALLOC
Frees a block of memory that was allocated with memfree */
void(__variant *dst, __variant *src, int size) memcpy = #386; /* Part of FTE_MEMALLOC
Copys memory from one location to another */
void(__variant *dst, int val, int size) memfill8 = #387; /* Part of FTE_MEMALLOC
Sets an entire block of memory to a specified value. Pretty much always 0. */
__variant(__variant *dst, float ofs) memgetval = #388; /*
Looks up the 32bit value stored at a pointer-with-offset. */
void(__variant *dst, float ofs, __variant val) memsetval = #389; /*
Changes the 32bit value stored at the specified pointer-with-offset. */
__variant*(__variant *base, float ofs) memptradd = #390; /*
Perform some pointer maths. Woo. */
float(string s) memstrsize = #0:memstrsize; /*
strlen, except ignores utf-8 */
string(string conname, string field, optional string newvalue) con_getset = #391; /* Part of FTE_CSQC_ALTCONSOLES
Reads or sets a property from a console object. The old value is returned. Iterrate through consoles with the 'next' field. Valid properties: title, name, next, unseen, markup, forceutf8, close, clear, hidden, linecount */
void(string conname, string messagefmt, ...) con_printf = #392; /* Part of FTE_CSQC_ALTCONSOLES
Prints onto a named console. */
void(string conname, vector pos, vector size, float fontsize) con_draw = #393; /* Part of FTE_CSQC_ALTCONSOLES
Draws the named console. */
float(string conname, float inevtype, float parama, float paramb, float paramc) con_input = #394; /* Part of FTE_CSQC_ALTCONSOLES
Forwards input events to the named console. Mouse updates should be absolute only. */
void(string newcaption) setwindowcaption = #0:setwindowcaption; /* Part of FTE_CSQC_WINDOWCAPTION
Replaces the title of the game window, as seen when task switching or just running in windowed mode. */
float() cvars_haveunsaved = #0:cvars_haveunsaved; /*
Returns true if any archived cvar has an unsaved value. */
float(entity e, float nowreadonly) entityprotection = #0:entityprotection; /*
Changes the protection on the specified entity to protect it from further edits from QC. The return value is the previous setting. Note that this can be used to unprotect the world, but doing so long term is not advised as you will no longer be able to detect invalid entity references. Also, world is not networked, so results might not be seen by clients (or in other words, world.avelocity_y=64 is a bad idea). */
2024-01-10 21:33:06 +00:00
string(vector pos) getlocationname = #0:getlocationname; /*
Looks up the specified position in the current map's .loc file and reports the nearest marked name. */
void(int cliptype, string text) clipboard_set = #0:clipboard_set; /*
Changes the system clipboard to the specified text. */
2022-02-08 18:42:28 +00:00
entity(entity from, optional entity to) copyentity = #400; /* Part of DP_QC_COPYENTITY
Copies all fields from one entity to another. */
entity(.string field, string match, optional .entity chainfield) findchain = #402; /* Part of DP_QC_FINDCHAIN*/
entity(.float fld, float match, optional .entity chainfield) findchainfloat = #403; /* Part of DP_QC_FINDCHAINFLOAT*/
void(vector org, string modelname, float startframe, float endframe, float framerate) effect = #404; /* Part of DP_SV_EFFECT
Spawns a self-animating sprite */
void(vector org, vector dir, float count) te_blood = #405; /* Part of DP_TE_BLOOD*/
void(vector mincorner, vector maxcorner, float explosionspeed, float howmany) te_bloodshower = #406; /* Part of _DP_TE_BLOODSHOWER*/
void(vector org, vector color) te_explosionrgb = #407; /* Part of DP_TE_EXPLOSIONRGB*/
void(vector mincorner, vector maxcorner, vector vel, float howmany, float color, float gravityflag, float randomveljitter) te_particlecube = #408; /* Part of DP_TE_PARTICLECUBE*/
void(vector mincorner, vector maxcorner, vector vel, float howmany, float color) te_particlerain = #409; /* Part of DP_TE_PARTICLERAIN*/
void(vector mincorner, vector maxcorner, vector vel, float howmany, float color) te_particlesnow = #410; /* Part of DP_TE_PARTICLESNOW*/
void(vector org, vector vel, float howmany) te_spark = #411; /* Part of DP_TE_SPARK*/
void(vector org) te_gunshotquad = #412; /* Part of _DP_TE_QUADEFFECTS1*/
void(vector org) te_spikequad = #413; /* Part of _DP_TE_QUADEFFECTS1*/
void(vector org) te_superspikequad = #414; /* Part of _DP_TE_QUADEFFECTS1*/
void(vector org) te_explosionquad = #415; /* Part of _DP_TE_QUADEFFECTS1*/
void(vector org) te_smallflash = #416; /* Part of DP_TE_SMALLFLASH*/
void(vector org, float radius, float lifetime, vector color) te_customflash = #417; /* Part of DP_TE_CUSTOMFLASH*/
void(vector org, optional float count) te_gunshot = #418; /* Part of DP_TE_STANDARDEFFECTBUILTINS, FTE_TE_STANDARDEFFECTBUILTINS*/
void(vector org) te_spike = #419; /* Part of DP_TE_STANDARDEFFECTBUILTINS, FTE_TE_STANDARDEFFECTBUILTINS*/
void(vector org) te_superspike = #420; /* Part of DP_TE_STANDARDEFFECTBUILTINS, FTE_TE_STANDARDEFFECTBUILTINS*/
void(vector org) te_explosion = #421; /* Part of DP_TE_STANDARDEFFECTBUILTINS, FTE_TE_STANDARDEFFECTBUILTINS*/
void(vector org) te_tarexplosion = #422; /* Part of DP_TE_STANDARDEFFECTBUILTINS, FTE_TE_STANDARDEFFECTBUILTINS*/
void(vector org) te_wizspike = #423; /* Part of DP_TE_STANDARDEFFECTBUILTINS, FTE_TE_STANDARDEFFECTBUILTINS*/
void(vector org) te_knightspike = #424; /* Part of DP_TE_STANDARDEFFECTBUILTINS, FTE_TE_STANDARDEFFECTBUILTINS*/
void(vector org) te_lavasplash = #425; /* Part of DP_TE_STANDARDEFFECTBUILTINS, FTE_TE_STANDARDEFFECTBUILTINS*/
void(vector org) te_teleport = #426; /* Part of DP_TE_STANDARDEFFECTBUILTINS, FTE_TE_STANDARDEFFECTBUILTINS*/
void(vector org, float color, float colorlength) te_explosion2 = #427; /* Part of DP_TE_STANDARDEFFECTBUILTINS*/
void(entity own, vector start, vector end) te_lightning1 = #428; /* Part of DP_TE_STANDARDEFFECTBUILTINS, FTE_TE_STANDARDEFFECTBUILTINS*/
void(entity own, vector start, vector end) te_lightning2 = #429; /* Part of DP_TE_STANDARDEFFECTBUILTINS, FTE_TE_STANDARDEFFECTBUILTINS*/
void(entity own, vector start, vector end) te_lightning3 = #430; /* Part of DP_TE_STANDARDEFFECTBUILTINS, FTE_TE_STANDARDEFFECTBUILTINS*/
void(entity own, vector start, vector end) te_beam = #431; /* Part of DP_TE_STANDARDEFFECTBUILTINS*/
void(vector dir) vectorvectors = #432; /* Part of DP_QC_VECTORVECTORS*/
void(vector org) te_plasmaburn = #433; /* Part of _DP_TE_PLASMABURN*/
float(entity e, float s) getsurfacenumpoints = #434; /* Part of DP_QC_GETSURFACE*/
vector(entity e, float s, float n) getsurfacepoint = #435; /* Part of DP_QC_GETSURFACE*/
vector(entity e, float s) getsurfacenormal = #436; /* Part of DP_QC_GETSURFACE*/
string(entity e, float s) getsurfacetexture = #437; /* Part of DP_QC_GETSURFACE*/
float(entity e, vector p) getsurfacenearpoint = #438; /* Part of DP_QC_GETSURFACE*/
vector(entity e, float s, vector p) getsurfaceclippedpoint = #439; /* Part of DP_QC_GETSURFACE*/
float(string s) tokenize = #441; /* Part of KRIMZON_SV_PARSECLIENTCOMMAND*/
string(float n) argv = #442; /* Part of KRIMZON_SV_PARSECLIENTCOMMAND*/
void(entity e, entity tagentity, string tagname) setattachment = #443; /* Part of DP_GFX_QUAKE3MODELTAGS*/
2024-01-10 21:33:06 +00:00
searchhandle(string pattern, enumflags:float{SB_CASEINSENSITIVE=1<<0,SB_FULLPACKAGEPATH=1<<1,SB_ALLOWDUPES=1<<2,SB_FORCESEARCH=1<<3} flags, float quiet, optional string filterpackage) search_begin = #444; /* Part of DP_QC_FS_SEARCH, DP_QC_FS_SEARCH_PACKFILE
initiate a filesystem scan based upon filenames. Be sure to call search_end on the returned handle. SB_FULLPACKAGEPATH interprets the filterpackage arg as a full package path to avoid gamedir ambiguity, equivelent to whichpack's WP_FULLPACKAGEPATH flag. SB_ALLOWDUPES allows returning multiple entries with the same name (but different package, useful with search_fopen). SB_FORCESEARCH requires use of the filterpackage and SB_FULLPACKAGEPATH flag, initiating searches from gamedirs/packages which are not currently active. */
2022-02-08 18:42:28 +00:00
2024-01-10 21:33:06 +00:00
void(searchhandle handle) search_end = #445; /* Part of DP_QC_FS_SEARCH, DP_QC_FS_SEARCH_PACKFILE*/
float(searchhandle handle) search_getsize = #446; /* Part of DP_QC_FS_SEARCH, DP_QC_FS_SEARCH_PACKFILE
2022-02-08 18:42:28 +00:00
Retrieves the number of files that were found. */
2024-01-10 21:33:06 +00:00
string(searchhandle handle, float num) search_getfilename = #447; /* Part of DP_QC_FS_SEARCH, DP_QC_FS_SEARCH_PACKFILE
2022-02-08 18:42:28 +00:00
Retrieves name of one of the files that was found by the initial search. */
float(searchhandle handle, float num) search_getfilesize = #0:search_getfilesize; /* Part of FTE_QC_FS_SEARCH_SIZEMTIME
Retrieves the size of one of the files that was found by the initial search. */
string(searchhandle handle, float num) search_getfilemtime = #0:search_getfilemtime; /* Part of FTE_QC_FS_SEARCH_SIZEMTIME
Retrieves modification time of one of the files. */
2024-01-10 21:33:06 +00:00
string(searchhandle handle, float num) search_getpackagename = #0:search_getpackagename; /*
Retrieves the name of the package containing the file. Search with SB_FULLPACKAGEPATH to see gamedir/package info */
filestream(searchhandle handle, float num) search_fopen = #0:search_fopen; /*
Opens the file directly, without getting confused about entries from other packages. Read access only. */
2022-02-08 18:42:28 +00:00
string(string cvarname) cvar_string = #448; /* Part of DP_QC_CVAR_STRING*/
entity(entity start, .float fld, float match) findflags = #449; /* Part of DP_QC_FINDFLAGS*/
entity(.float fld, float match, optional .entity chainfield) findchainflags = #450; /* Part of DP_QC_FINDCHAINFLAGS*/
2024-01-10 21:33:06 +00:00
float(entity ent, string tagname) gettagindex = #451; /* Part of DP_QC_GETTAGINFO*/
vector(entity ent, float tagindex) gettaginfo = #452; /* Part of DP_QC_GETTAGINFO
2022-02-08 18:42:28 +00:00
Obtains the current worldspace position+orientation of the bone or tag from the given entity. The return value is the world coord, v_forward, v_right, v_up are also set according to the bone/tag's orientation. */
void(vector org, vector vel, float howmany) te_flamejet = #457; /* Part of _DP_TE_FLAMEJET*/
entity(float entnum) edict_num = #459; /* Part of DP_QC_EDICT_NUM*/
strbuf() buf_create = #460; /* Part of DP_QC_STRINGBUFFERS*/
void(strbuf bufhandle) buf_del = #461; /* Part of DP_QC_STRINGBUFFERS*/
float(strbuf bufhandle) buf_getsize = #462; /* Part of DP_QC_STRINGBUFFERS*/
void(strbuf bufhandle_from, strbuf bufhandle_to) buf_copy = #463; /* Part of DP_QC_STRINGBUFFERS*/
void(strbuf bufhandle, float sortprefixlen, float backward) buf_sort = #464; /* Part of DP_QC_STRINGBUFFERS*/
string(strbuf bufhandle, string glue) buf_implode = #465; /* Part of DP_QC_STRINGBUFFERS*/
string(strbuf bufhandle, float string_index) bufstr_get = #466; /* Part of DP_QC_STRINGBUFFERS*/
void(strbuf bufhandle, float string_index, string str) bufstr_set = #467; /* Part of DP_QC_STRINGBUFFERS*/
float(strbuf bufhandle, string str, float ordered) bufstr_add = #468; /* Part of DP_QC_STRINGBUFFERS*/
void(strbuf bufhandle, float string_index) bufstr_free = #469; /* Part of DP_QC_STRINGBUFFERS*/
float(float s) asin = #471; /* Part of DP_QC_ASINACOSATANATAN2TAN*/
float(float c) acos = #472; /* Part of DP_QC_ASINACOSATANATAN2TAN*/
float(float t) atan = #473; /* Part of DP_QC_ASINACOSATANATAN2TAN*/
float(float c, float s) atan2 = #474; /* Part of DP_QC_ASINACOSATANATAN2TAN*/
float(float a) tan = #475; /* Part of DP_QC_ASINACOSATANATAN2TAN
Forgive me father, for I have a sunbed and I'm not afraid to use it. */
float(string s) strlennocol = #476; /* Part of DP_QC_STRINGCOLORFUNCTIONS
Returns the number of characters in the string after any colour codes or other markup has been parsed. */
string(string s) strdecolorize = #477; /* Part of DP_QC_STRINGCOLORFUNCTIONS
Flattens any markup/colours, removing them from the string. */
string(float uselocaltime, string format, ...) strftime = #478; /* Part of DP_QC_STRFTIME*/
2024-01-10 21:33:06 +00:00
float(string s, string separator1, ...) tokenizebyseparator = #479; /* Part of DP_QC_TOKENIZEBYSEPARATOR
Splits up the string using only the specified delimiters/separators. Multiple delimiters can be given, they are each considered equivelent (though should start with the longest if you want to do weird subseparator stuff).
The resulting tokens can be queried via argv (and argv_start|end_index builtins, if you want to determine which of the separators was present between two tokens).
Note that while an input string containing JUST a separator will return 2, a string with no delimiter will return 1, while (in FTE) an empty string will ALWAYS return 0. */
2022-02-08 18:42:28 +00:00
string(string s) strtolower = #480; /* Part of DP_QC_STRING_CASE_FUNCTIONS*/
string(string s) strtoupper = #481; /* Part of DP_QC_STRING_CASE_FUNCTIONS*/
string(string s) cvar_defstring = #482; /* Part of DP_QC_CVAR_DEFSTRING*/
void(vector origin, string sample, float volume, float attenuation) pointsound = #483; /* Part of DP_SV_POINTSOUND*/
string(string search, string replace, string subject) strreplace = #484; /* Part of DP_QC_STRREPLACE*/
string(string search, string replace, string subject) strireplace = #485; /* Part of DP_QC_STRREPLACE*/
vector(entity e, float s, float n, float a) getsurfacepointattribute = #486; /* Part of DP_QC_GETSURFACEPOINTATTRIBUTE*/
float(string name, optional string initialURI) gecko_create = #487; /* Part of DP_GECKO_SUPPORT
Create a new 'browser tab' shader with the specified name that can then be drawn via drawpic (shader should not already exist - including from map/model textures or disk). In order to function correctly, this builtin depends upon external plugins being available. Use gecko_navigate to navigate it to a page of your choosing. */
void(string name) gecko_destroy = #488; /* Part of DP_GECKO_SUPPORT
Destroy a shader. */
void(string name, string URI) gecko_navigate = #489; /* Part of DP_GECKO_SUPPORT
Sends a command to the media decoder attached to the specified shader. In the case of a browser decoder, this changes the url that the browser displays. 'cmd:[un]focus' will tell the decoder that it has focus. */
float(string name, float key, float eventtype, optional float charcode) gecko_keyevent = #490; /* Part of DP_GECKO_SUPPORT
Send a key event to a media decoder. This applies only to interactive decoders like browsers. */
void(string name, float x, float y) gecko_mousemove = #491; /* Part of DP_GECKO_SUPPORT
Sets a media decoder shader's mouse position. Values should be 0-1. */
void(string name, float w, float h) gecko_resize = #492; /* Part of DP_GECKO_SUPPORT
Request to resize a media decoder. */
vector(string name) gecko_get_texture_extent = #493; /* Part of DP_GECKO_SUPPORT
Retrieves a media decoder current image pixel sizes. */
string(string shadname, string propname) gecko_getproperty = #0:gecko_getproperty; /*
Queries the media decoder (especially browser ones) for decoder-specific properties. The cef plugin recognises url, title, status. */
float(string file, string id) cin_open = #0:cin_open;
void(string id) cin_close = #0:cin_close;
void(string id, float newstate) cin_setstate = #0:cin_setstate;
float(string id) cin_getstate = #0:cin_getstate;
void(string file) cin_restart = #0:cin_restart;
2024-01-10 21:33:06 +00:00
__deprecated("Use digest_hex") float(float caseinsensitive, string s, ...) crc16 = #494; /* Part of DP_QC_CRC16*/
2022-02-08 18:42:28 +00:00
float(string name) cvar_type = #495; /* Part of DP_QC_CVAR_TYPE*/
float() numentityfields = #496; /* Part of DP_QC_ENTITYDATA
Gives the number of named entity fields. Note that this is not the size of an entity, but rather just the number of unique names (ie: vectors use 4 names rather than 3). */
float(string fieldname) findentityfield = #0:findentityfield; /*
Find a field index by name. */
typedef .__variant field_t;
field_t(float fieldnum) entityfieldref = #0:entityfieldref; /*
Returns a field value that can be directly used to read entity fields. Be sure to validate the type with entityfieldtype before using. */
string(float fieldnum) entityfieldname = #497; /* Part of DP_QC_ENTITYDATA
Retrieves the name of the given entity field. */
float(float fieldnum) entityfieldtype = #498; /* Part of DP_QC_ENTITYDATA
Provides information about the type of the field specified by the field num. Returns one of the EV_ values. */
string(float fieldnum, entity ent) getentityfieldstring = #499; /* Part of DP_QC_ENTITYDATA*/
float(float fieldnum, entity ent, string s) putentityfieldstring = #500; /* Part of DP_QC_ENTITYDATA*/
string() ReadPicture = #501; /*
Reads a picture that was written by ReadPicture, and returns a name that can be used in drawpic and other 2d drawing functions. In FTE, this acts as a readstring-with-downloadcheck - the image will appear normally once it has been downloaded, but its size may be incorrect until then. */
void(float effectindex, entity own, vector org_from, vector org_to, vector dir_from, vector dir_to, float countmultiplier, optional float flags) boxparticles = #502;
2024-01-10 21:33:06 +00:00
string(string filename, optional enumflags:float{WP_REFERENCEPACKAGE,WP_FULLPACKAGEPATH} flags) whichpack = #503; /* Part of DP_QC_WHICHPACK
Returns the pak file name that contains the file specified. progs/player.mdl will generally return something like 'pak0.pak'. If WP_REFERENCE, clients will automatically be told that the returned package should be pre-downloaded and used, even if allow_download_refpackages is not set. */
2022-02-08 18:42:28 +00:00
__variant(float entnum, float fieldnum) getentity = #504; /*
Looks up fields from non-csqc-visible entities. The entity will need to be within the player's pvs. fieldnum should be one of the GE_ constants. */
2024-01-10 21:33:06 +00:00
string(string in) uri_escape = #510; /* Part of DP_QC_URI_ESCAPE
Uses percent-encoding to encode any bytes in the input string which are not ascii alphanumeric, period, hyphen, or underscore. All other bytes will expand to eg '%20' for a single space char. This encoding scheme is compatible with http and other uris. */
string(string in) uri_unescape = #511; /* Part of DP_QC_URI_ESCAPE
Undo any percent-encoding in the input string, hopefully resulting in the same original sequence of bytes (and thus chars too). */
2022-02-08 18:42:28 +00:00
float(entity ent) num_for_edict = #512;
#define uri_post uri_get
float(string uril, float id, optional string postmimetype, optional string postdata) uri_get = #513; /* Part of DP_QC_URI_GET, DP_QC_URI_POST
uri_get() gets content from an URL and calls a callback "uri_get_callback" with it set as string; an unique ID of the transfer is returned
returns 1 on success, and then calls the callback with the ID, 0 or the HTTP status code, and the received data in a string
For a POST request, you will typically want the postmimetype set to application/x-www-form-urlencoded.
For a GET request, omit the mime+data entirely.
Consult your webserver/php/etc documentation for best-practise. */
float(string str) tokenize_console = #514; /*
Tokenize a string exactly as the console's tokenizer would do so. The regular tokenize builtin became bastardized for convienient string parsing, which resulted in a large disparity that can be exploited to bypass checks implemented in a naive SV_ParseClientCommand function, therefore you can use this builtin to make sure it exactly matches. */
float(float idx) argv_start_index = #515; /*
Returns the character index that the tokenized arg started at. */
float(float idx) argv_end_index = #516; /*
Returns the character index that the tokenized arg stopped at. */
void(strbuf strbuf, string pattern, string antipattern) buf_cvarlist = #517;
string(string cvarname) cvar_description = #518; /*
Retrieves the description of a cvar, which might be useful for tooltips or help files. This may still not be useful. */
float(optional float timetype) gettime = #519;
2024-01-10 21:33:06 +00:00
DEP string(float keynum) keynumtostring_omgwtf = #520;
string(string command, optional float bindmap) findkeysforcommand = #521; /*
2022-02-08 18:42:28 +00:00
Returns a list of keycodes that perform the given console command in a format that can only be parsed via tokenize (NOT tokenize_console). This only and always returns two values - if only one key is actually bound, -1 will be returned. The bindmap argument is listed for compatibility with dp-specific defs, but is ignored in FTE. */
string(string command, optional float bindmap) findkeysforcommandex = #0:findkeysforcommandex; /*
Returns a list of key bindings in keyname format instead of keynums. Use tokenize to parse. This list may contain modifiers. May return large numbers of keys. */
void(string s) loadfromdata = #529; /*
Reads a set of entities from the given string. This string should have the same format as a .ent file or a saved game. Entities will be spawned as required. If you need to see the entities that were created, you should use parseentitydata instead. */
void(string s) loadfromfile = #530; /*
Reads a set of entities from the named file. This file should have the same format as a .ent file or a saved game. Entities will be spawned as required. If you need to see the entities that were created, you should use parseentitydata instead. */
2024-01-10 21:33:06 +00:00
void(float pause) setpause = #531; /*
Sets whether the server should or should not be paused. This does not affect auto-paused things like when the console is down. */
float(float v, optional float base) log = #532; /*
2022-02-08 18:42:28 +00:00
Determines the logarithm of the input value according to the specified base. This can be used to calculate how much something was shifted by. */
float(entity e, float channel, string newsample, float volume, float attenuation, float pitchpct, float flags, float timeoffset) soundupdate = #0:soundupdate; /*
Changes the properties of the current sound being played on the given entity channel. newsample may be empty, and will be ignored in this case. timeoffset is relative to the current position (subtract the result of getsoundtime for absolute positions). Negative volume can be used to stop the sound. Return value is a fractional value based upon the number of audio devices that could be updated - test against TRUE rather than non-zero. */
float(entity e, float channel) getsoundtime = #533; /*
Returns the current playback time of the sample on the given entity's channel. Beware CHAN_AUTO (in csqc, channels are not limited by network protocol). */
2024-01-10 21:33:06 +00:00
float(entity e, float channel) getchannellevel = #0:getchannellevel; /*
Reports how load the sound's sample is at its current offset. */
2022-02-08 18:42:28 +00:00
float(string sample) soundlength = #534; /*
Provides a way to query the duration of a sound sample, allowing you to set up a timer to chain samples. */
float(string filename, strbuf bufhandle) buf_loadfile = #535; /*
Appends the named file into a string buffer (which must have been created in advance). The return value merely says whether the file was readable. */
float(filestream filehandle, strbuf bufhandle, optional float startpos, optional float numstrings) buf_writefile = #536; /*
Writes the contents of a string buffer onto the end of the supplied filehandle (you must have already used fopen). Additional optional arguments permit you to constrain the writes to a subsection of the stringbuffer. */
2024-01-10 21:33:06 +00:00
float(float bufhandle, string match, float matchrule, float startpos, float step) bufstr_find = #537; /*
Looks for the first occurence of the specified string in the buffer, returning its index or -1 on failure. */
2022-02-08 18:42:28 +00:00
void(entity e, float physics_enabled) physics_enable = #540; /*
Enable or disable the physics attached to a MOVETYPE_PHYSICS entity. Entities which have been disabled in this way will stop taking so much cpu time. */
void(entity e, vector force, vector relative_ofs) physics_addforce = #541; /*
Apply some impulse directional force upon a MOVETYPE_PHYSICS entity. */
void(entity e, vector torque) physics_addtorque = #542; /*
Apply some impulse rotational force upon a MOVETYPE_PHYSICS entity. */
void(float trg) setmousetarget = #603;
float() getmousetarget = #604;
void(.../*, string funcname*/) callfunction = #605; /*
Invokes the named function. The function name is always passed as the last parameter and must always be present. The others are passed to the named function as-is */
void(filestream fh, entity e) writetofile = #606; /*
Writes an entity's fields to the named frik_file file handle. */
float(string s) isfunction = #607; /*
Returns true if the named function exists and can be called with the callfunction builtin. */
vector(float vidmode, optional float forfullscreen) getresolution = #608; /*
Supposed to query the driver for supported video modes. FTE does not query drivers in this way, nor would it trust drivers anyway. */
2024-01-10 21:33:06 +00:00
DEP string(float keynum) keynumtostring_menu = #609;
2022-02-08 18:42:28 +00:00
float(float type) gethostcachevalue = #611; /* Part of FTE_CSQC_SERVERBROWSER*/
string(float type, float hostnr) gethostcachestring = #612; /* Part of FTE_CSQC_SERVERBROWSER*/
float(entity e, string s, optional float offset) parseentitydata = #613; /*
Reads a single entity's fields into an already-spawned entity. s should contain field pairs like in a saved game: {"foo1" "bar" "foo2" "5"}. Returns <=0 on failure, otherwise returns the offset in the string that was read to. */
string(entity e) generateentitydata = #0:generateentitydata; /*
Dumps the entities fields into a string which can later be parsed with parseentitydata. */
float(string key) stringtokeynum_menu = #614;
void() resethostcachemasks = #615; /* Part of FTE_CSQC_SERVERBROWSER*/
void(float mask, float fld, string str, float op) sethostcachemaskstring = #616; /* Part of FTE_CSQC_SERVERBROWSER*/
void(float mask, float fld, float num, float op) sethostcachemasknumber = #617; /* Part of FTE_CSQC_SERVERBROWSER*/
void() resorthostcache = #618; /* Part of FTE_CSQC_SERVERBROWSER*/
void(float fld, float descending) sethostcachesort = #619; /* Part of FTE_CSQC_SERVERBROWSER*/
2024-01-10 21:33:06 +00:00
void(optional float dopurge) refreshhostcache = #620; /* Part of FTE_CSQC_SERVERBROWSER*/
2022-02-08 18:42:28 +00:00
float(float fld, float hostnr) gethostcachenumber = #621; /* Part of FTE_CSQC_SERVERBROWSER*/
float(string key) gethostcacheindexforkey = #622; /* Part of FTE_CSQC_SERVERBROWSER*/
void(string key) addwantedhostcachekey = #623; /* Part of FTE_CSQC_SERVERBROWSER*/
string() getextresponse = #624; /* Part of FTE_CSQC_SERVERBROWSER*/
string(string dnsname, optional float defport) netaddress_resolve = #625;
2024-01-10 21:33:06 +00:00
string(float n, float prop) getgamedirinfo = #626; /*
Queries properties about an indexed gamedir (or -1 for the current gamedir). Returns null strings when out of bounds. Use the GDDI_* constants for the prop arg. */
string(int n, int prop) getpackagemanagerinfo = #0:getpackagemanagerinfo; /*
Queries information about a package from the engine's package manager subsystem. Actions can be taken via the pkg console command. */
string(string fmt, ...) sprintf = #627; /* Part of DP_QC_SPRINTF
'prints' to a formatted temp-string. Mostly acts as in C, however %d assumes floats (fteqcc has arg checking. Use it.).
type conversions: l=arg is an int, h=arg is a float, and will work as a prefix for any float or int representation.
float representations: d=decimal, e,E=exponent-notation, f,F=floating-point notation, g,G=terse float, c=char code, x,X=hex
other representations: i=int, s=string, S=quoted and marked-up string, v=vector, p=pointer
so %ld will accept an int arg, while %hi will expect a float arg.
entities, fields, and functions will generally need to be printed as ints with %i. */
2022-02-08 18:42:28 +00:00
float(entity e, float s) getsurfacenumtriangles = #628;
vector(entity e, float s, float n) getsurfacetriangle = #629;
2024-01-10 21:33:06 +00:00
float(float key, string bind, optional float bindmap, optional float modifier) setkeybind = #630;
2022-02-08 18:42:28 +00:00
vector() getbindmaps = #631;
float(vector bm) setbindmaps = #632;
string(string digest, string data, ...) digest_hex = #639;
2024-01-10 21:33:06 +00:00
string(string digest, void *data, int length) digest_ptr = #0:digest_ptr; /*
Calculates the digest of a single contiguous block of memory (including nulls) using the specified hash function. */
float(string src, string dst) fcopy = #650; /*
Equivelent to fopen+fread+fwrite+fclose from QC (ie: reads from $gamedir/data/ or $gamedir, but always writes to $gamedir/data/ ) */
float(string src, string dst) frename = #651; /*
Renames the file, returning 0 on success. Both paths are relative to the data/ subdir. */
float(string fname) fremove = #652; /*
Deletes the named file - path is relative to data/ subdir, like fopen's FILE_WRITE. Returns 0 on success. */
float(string fname) fexists = #653; /*
Returns true if it exists inside the default writable path. Use whichpack for greater portability. */
float(string path) rmtree = #654; /*
Dangerous, but sandboxed to data/ */
2022-02-08 18:42:28 +00:00
#if defined(CSQC) || defined(MENU)
2024-01-10 21:33:06 +00:00
const float K_TAB = 9;
const float K_ENTER = 13;
const float K_ESCAPE = 27;
const float K_SPACE = 32;
const float K_BACKSPACE = 127;
const float K_UPARROW = 128;
const float K_DOWNARROW = 129;
const float K_LEFTARROW = 130;
const float K_RIGHTARROW = 131;
const float K_LALT = 132;
const float K_RALT = -280;
const float K_LCTRL = 133;
const float K_RCTRL = -281;
const float K_LSHIFT = 134;
const float K_RSHIFT = -282;
const float K_F1 = 135;
const float K_F2 = 136;
const float K_F3 = 137;
const float K_F4 = 138;
const float K_F5 = 139;
const float K_F6 = 140;
const float K_F7 = 141;
const float K_F8 = 142;
const float K_F9 = 143;
const float K_F10 = 144;
const float K_F11 = 145;
const float K_F12 = 146;
const float K_INS = 147;
const float K_DEL = 148;
const float K_PGDN = 149;
const float K_PGUP = 150;
const float K_HOME = 151;
const float K_END = 152;
const float K_KP_HOME = 164;
const float K_KP_UPARROW = 165;
const float K_KP_PGUP = 166;
const float K_KP_LEFTARROW = 161;
const float K_KP_5 = 162;
const float K_KP_RIGHTARROW = 163;
const float K_KP_END = 158;
const float K_KP_DOWNARROW = 159;
const float K_KP_PGDN = 160;
const float K_KP_ENTER = 172;
const float K_KP_INS = 157;
const float K_KP_DEL = 167;
const float K_KP_SLASH = 168;
const float K_KP_MINUS = 170;
const float K_KP_PLUS = 171;
const float K_KP_NUMLOCK = 154;
const float K_KP_STAR = 169;
const float K_KP_EQUALS = 173;
const float K_MOUSE1 = 512;
const float K_MOUSE2 = 513;
const float K_MOUSE3 = 514;
const float K_MOUSE4 = 517;
const float K_MOUSE5 = 518;
const float K_MOUSE6 = 519;
const float K_MOUSE7 = 520;
const float K_MOUSE8 = 521;
const float K_MOUSE9 = 522;
const float K_MOUSE10 = 523;
const float K_MWHEELUP = 515;
const float K_MWHEELDOWN = 516;
const float K_LWIN = -274;
const float K_RWIN = -275;
const float K_APP = -276;
const float K_SEARCH = -277;
const float K_POWER = -130;
const float K_VOLUP = -278;
const float K_VOLDOWN = -279;
const float K_JOY1 = 768;
const float K_JOY2 = 769;
const float K_JOY3 = 770;
const float K_JOY4 = 771;
const float K_JOY5 = 772;
const float K_JOY6 = 773;
const float K_JOY7 = 774;
const float K_JOY8 = 775;
const float K_JOY9 = 776;
const float K_JOY10 = 777;
const float K_JOY11 = 778;
const float K_JOY12 = 779;
const float K_JOY13 = 780;
const float K_JOY14 = 781;
const float K_JOY15 = 782;
const float K_JOY16 = 783;
const float K_JOY17 = 784;
const float K_JOY18 = 785;
const float K_JOY19 = 786;
const float K_JOY20 = 787;
const float K_JOY21 = 788;
const float K_JOY22 = 789;
const float K_JOY23 = 790;
const float K_JOY24 = 791;
const float K_JOY25 = 792;
const float K_JOY26 = 793;
const float K_JOY27 = 794;
const float K_JOY28 = 795;
const float K_JOY29 = 796;
const float K_JOY30 = 797;
const float K_JOY31 = 798;
const float K_JOY32 = 799;
const float K_AUX1 = 800;
const float K_AUX2 = 801;
const float K_AUX3 = 802;
const float K_AUX4 = 803;
const float K_AUX5 = 804;
const float K_AUX6 = 805;
const float K_AUX7 = 806;
const float K_AUX8 = 807;
const float K_AUX9 = 808;
const float K_AUX10 = 809;
const float K_AUX11 = 810;
const float K_AUX12 = 811;
const float K_AUX13 = 812;
const float K_AUX14 = 813;
const float K_AUX15 = 814;
const float K_AUX16 = 815;
const float K_PAUSE = 153;
const float K_PRINTSCREEN = 174;
const float K_CAPSLOCK = 155;
const float K_SCROLLLOCK = 156;
const float K_SEMICOLON = 59;
const float K_PLUS = 43;
const float K_MINUS = 45;
const float K_APOSTROPHE = 39;
const float K_QUOTES = 34;
const float K_TILDE = 126;
const float K_BACKQUOTE = 96;
const float K_BACKSLASH = 92;
const float K_GP_A = 826;
const float K_GP_B = 827;
const float K_GP_X = 828;
const float K_GP_Y = 829;
const float K_GP_LSHOULDER = 824;
const float K_GP_RSHOULDER = 825;
const float K_GP_LTRIGGER = 830;
const float K_GP_RTRIGGER = 831;
const float K_GP_BACK = 821;
const float K_GP_START = 820;
const float K_GP_LTHUMB = 822;
const float K_GP_RTHUMB = 823;
const float K_GP_DPAD_UP = 816;
const float K_GP_DPAD_DOWN = 817;
const float K_GP_DPAD_LEFT = 818;
const float K_GP_DPAD_RIGHT = 819;
const float K_GP_GUIDE = -238;
const float K_GP_SHARE = -248;
const float K_GP_PADDLE1 = -249;
const float K_GP_PADDLE2 = -250;
const float K_GP_PADDLE3 = -251;
const float K_GP_PADDLE4 = -252;
const float K_GP_TOUCHPAD = -253;
const float K_GP_UNKNOWN = -264;
const float K_GP_LTHUMB_UP = 832;
const float K_GP_LTHUMB_DOWN = 833;
const float K_GP_LTHUMB_LEFT = 834;
const float K_GP_LTHUMB_RIGHT = 835;
const float K_GP_RTHUMB_UP = 836;
const float K_GP_RTHUMB_DOWN = 837;
const float K_GP_RTHUMB_LEFT = 838;
const float K_GP_RTHUMB_RIGHT = 839;
2022-02-08 18:42:28 +00:00
#endif
#ifdef _ACCESSORS
accessor strbuf : float
{
inline get float asfloat[float idx] = {return stof(bufstr_get(this, idx));};
inline set float asfloat[float idx] = {bufstr_set(this, idx, ftos(value));};
get string[float] = bufstr_get;
set string[float] = bufstr_set;
get float length = buf_getsize;
};
accessor searchhandle : float
{
get string[float] = search_getfilename;
get float length = search_getsize;
};
accessor hashtable : float
{
inline get vector v[string key] = {return hash_get(this, key, '0 0 0', EV_VECTOR);};
inline set vector v[string key] = {hash_add(this, key, value, HASH_REPLACE|EV_VECTOR);};
inline get string s[string key] = {return hash_get(this, key, "", EV_STRING);};
inline set string s[string key] = {hash_add(this, key, value, HASH_REPLACE|EV_STRING);};
inline get float f[string key] = {return hash_get(this, key, 0.0, EV_FLOAT);};
inline set float f[string key] = {hash_add(this, key, value, HASH_REPLACE|EV_FLOAT);};
inline get __variant[string key] = {return hash_get(this, key, __NULL__);};
inline set __variant[string key] = {hash_add(this, key, value, HASH_REPLACE);};
};
accessor infostring : string
{
get string[string] = infoget;
2024-01-10 21:33:06 +00:00
inline set& string[string fld] = {this = infoadd(this, fld, value);};
2022-02-08 18:42:28 +00:00
};
accessor filestream : float
{
get string = fgets;
inline set string = {fputs(this,value);};
};
#endif
2024-01-10 21:33:06 +00:00
accessor jsonnode : json_t
{
inline get json_type_e type = json_get_value_type;
inline get string s = json_get_string;
inline get float f = json_get_float;
inline get __int i = json_get_integer;
inline get __int length = json_get_length;
inline get jsonnode a[__int key] = json_get_child_at_index;
inline get jsonnode[string key] = json_find_object_child;
inline get string name = json_get_name;
};
#undef DEP_CSQC
#undef FTEDEP
#undef DEP
2022-02-08 18:42:28 +00:00
#pragma noref 0