/* =========================================================================== Copyright (C) 1999 - 2005, Id Software, Inc. Copyright (C) 2000 - 2013, Raven Software, Inc. Copyright (C) 2001 - 2013, Activision, Inc. Copyright (C) 2005 - 2015, ioquake3 contributors Copyright (C) 2013 - 2015, OpenJK contributors This file is part of the OpenJK source code. OpenJK is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License version 2 as published by the Free Software Foundation. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, see . =========================================================================== */ #pragma once // q_shared.h -- included first by ALL program modules. // A user mod should never modify this file #define PRODUCT_NAME "openjk" #define CLIENT_WINDOW_TITLE "OpenJK (MP)" #define CLIENT_CONSOLE_TITLE "OpenJK Console (MP)" #define HOMEPATH_NAME_UNIX "openjk" #define HOMEPATH_NAME_WIN "OpenJK" #define HOMEPATH_NAME_MACOSX HOMEPATH_NAME_WIN #define BASEGAME "base" #define OPENJKGAME "OpenJK" //NOTENOTE: Only change this to re-point ICARUS to a new script directory #define Q3_SCRIPT_DIR "scripts" #define MAX_TEAMNAME 32 #define MAX_MASTER_SERVERS 5 // number of supported master servers #define BASE_COMPAT // some unused and leftover code has been stripped out, but this breaks compatibility // between base<->modbase clients and servers (mismatching events, powerups, etc) // leave this defined to ensure compatibility #include "qcommon/q_math.h" #include "qcommon/q_color.h" #include "qcommon/q_string.h" #include "qcommon/disablewarnings.h" #include "game/teams.h" //npc team stuff #define MAX_WORLD_COORD ( 64 * 1024 ) #define MIN_WORLD_COORD ( -64 * 1024 ) #define WORLD_SIZE ( MAX_WORLD_COORD - MIN_WORLD_COORD ) //Pointer safety utilities #define VALID( a ) ( a != NULL ) #define VALIDATE( a ) ( assert( a ) ) #define VALIDATEV( a ) if ( a == NULL ) { assert(0); return; } #define VALIDATEB( a ) if ( a == NULL ) { assert(0); return qfalse; } #define VALIDATEP( a ) if ( a == NULL ) { assert(0); return NULL; } #define VALIDSTRING( a ) ( ( a != NULL ) && ( a[0] != '\0' ) ) #define VALIDENT( e ) ( ( e != NULL ) && ( (e)->inuse ) ) #define ARRAY_LEN( x ) ( sizeof( x ) / sizeof( *(x) ) ) #define STRING( a ) #a #define XSTRING( a ) STRING( a ) /* #define G2_EHNANCEMENTS #ifdef G2_EHNANCEMENTS //these two will probably explode if they're defined independent of one another. //rww - RAGDOLL_BEGIN #define JK2_RAGDOLL //rww - RAGDOLL_END //rww - Bone cache for multiplayer base. #define MP_BONECACHE #endif */ #ifndef FINAL_BUILD // may want to enable timing and leak checking again. requires G2API changes. // #define G2_PERFORMANCE_ANALYSIS // #define _FULL_G2_LEAK_CHECKING // extern int g_Ghoul2Allocations; // extern int g_G2ServerAlloc; // extern int g_G2ClientAlloc; // extern int g_G2AllocServer; #endif #include #include #include #include #include #include #include #include #include #include #include #include //Ignore __attribute__ on non-gcc platforms #if !defined(__GNUC__) && !defined(__attribute__) #define __attribute__(x) #endif #if defined(__GNUC__) #define UNUSED_VAR __attribute__((unused)) #else #define UNUSED_VAR #endif #if (defined _MSC_VER) #define Q_EXPORT __declspec(dllexport) #elif (defined __SUNPRO_C) #define Q_EXPORT __global #elif ((__GNUC__ >= 3) && (!__EMX__) && (!sun)) #define Q_EXPORT __attribute__((visibility("default"))) #else #define Q_EXPORT #endif // this is the define for determining if we have an asm version of a C function #if (defined(_M_IX86) || defined(__i386__)) && !defined(__sun__) #define id386 1 #else #define id386 0 #endif #if (defined(powerc) || defined(powerpc) || defined(ppc) || defined(__ppc) || defined(__ppc__)) && !defined(C_ONLY) #define idppc 1 #else #define idppc 0 #endif #include "qcommon/q_platform.h" typedef union fileBuffer_u { void *v; char *c; byte *b; } fileBuffer_t; typedef int32_t qhandle_t, thandle_t, fxHandle_t, sfxHandle_t, fileHandle_t, clipHandle_t; #define NULL_HANDLE ((qhandle_t)0) #define NULL_SOUND ((sfxHandle_t)0) #define NULL_FX ((fxHandle_t)0) #define NULL_SFX ((sfxHandle_t)0) #define NULL_FILE ((fileHandle_t)0) #define NULL_CLIP ((clipHandle_t)0) #define PAD(base, alignment) (((base)+(alignment)-1) & ~((alignment)-1)) #define PADLEN(base, alignment) (PAD((base), (alignment)) - (base)) #define PADP(base, alignment) ((void *) PAD((intptr_t) (base), (alignment))) #ifdef __GNUC__ #define QALIGN(x) __attribute__((aligned(x))) #else #define QALIGN(x) #endif #ifndef NULL #define NULL ((void *)0) #endif #define INT_ID( a, b, c, d ) (uint32_t)((((a) & 0xff) << 24) | (((b) & 0xff) << 16) | (((c) & 0xff) << 8) | ((d) & 0xff)) // the game guarantees that no string from the network will ever // exceed MAX_STRING_CHARS #define MAX_STRING_CHARS 1024 // max length of a string passed to Cmd_TokenizeString #define MAX_STRING_TOKENS 1024 // max tokens resulting from Cmd_TokenizeString #define MAX_TOKEN_CHARS 1024 // max length of an individual token #define MAX_INFO_STRING 1024 #define MAX_INFO_KEY 1024 #define MAX_INFO_VALUE 1024 #define BIG_INFO_STRING 8192 // used for system info key only #define BIG_INFO_KEY 8192 #define BIG_INFO_VALUE 8192 #define NET_ADDRSTRMAXLEN 48 // maximum length of an IPv6 address string including trailing '\0' // moved these from ui_local.h so we can access them everywhere #define MAX_ADDRESSLENGTH 256//64 #define MAX_HOSTNAMELENGTH 256//22 #define MAX_MAPNAMELENGTH 256//16 #define MAX_STATUSLENGTH 256//64 #define MAX_QPATH 64 // max length of a quake game pathname #ifdef PATH_MAX #define MAX_OSPATH PATH_MAX #else #define MAX_OSPATH 256 // max length of a filesystem pathname #endif #define MAX_NAME_LENGTH 32 // max length of a client name #define MAX_NETNAME 36 #define MAX_SAY_TEXT 150 // paramters for command buffer stuffing typedef enum { EXEC_NOW, // don't return until completed, a VM should NEVER use this, // because some commands might cause the VM to be unloaded... EXEC_INSERT, // insert at current position, but don't run yet EXEC_APPEND // add to end of the command buffer (normal case) } cbufExec_t; // // these aren't needed by any of the VMs. put in another header? // #define MAX_MAP_AREA_BYTES 32 // bit vector of area visibility #define LS_STYLES_START 0 #define LS_NUM_STYLES 32 #define LS_SWITCH_START (LS_STYLES_START+LS_NUM_STYLES) #define LS_NUM_SWITCH 32 #if !defined MAX_LIGHT_STYLES #define MAX_LIGHT_STYLES 64 #endif //For system-wide prints enum WL_e { WL_ERROR=1, WL_WARNING, WL_VERBOSE, WL_DEBUG }; extern float forceSpeedLevels[4]; // print levels from renderer (FIXME: set up for game / cgame?) typedef enum { PRINT_ALL, PRINT_DEVELOPER, // only print when "developer 1" PRINT_WARNING, PRINT_ERROR } printParm_t; #ifdef ERR_FATAL #undef ERR_FATAL // this is be defined in malloc.h #endif // parameters to the main Error routine typedef enum { ERR_FATAL, // exit the entire game with a popup window ERR_DROP, // print to console and disconnect from game ERR_SERVERDISCONNECT, // don't kill server ERR_DISCONNECT, // client disconnected from the server ERR_NEED_CD // pop up the need-cd dialog } errorParm_t; // font rendering values used by ui and cgame /*#define PROP_GAP_WIDTH 3 #define PROP_SPACE_WIDTH 8 #define PROP_HEIGHT 27 #define PROP_SMALL_SIZE_SCALE 0.75*/ #define PROP_GAP_WIDTH 2 // 3 #define PROP_SPACE_WIDTH 4 #define PROP_HEIGHT 16 #define PROP_TINY_SIZE_SCALE 1 #define PROP_SMALL_SIZE_SCALE 1 #define PROP_BIG_SIZE_SCALE 1 #define PROP_GIANT_SIZE_SCALE 2 #define PROP_TINY_HEIGHT 10 #define PROP_GAP_TINY_WIDTH 1 #define PROP_SPACE_TINY_WIDTH 3 #define PROP_BIG_HEIGHT 24 #define PROP_GAP_BIG_WIDTH 3 #define PROP_SPACE_BIG_WIDTH 6 #define BLINK_DIVISOR 200 #define PULSE_DIVISOR 75 #define UI_LEFT 0x00000000 // default #define UI_CENTER 0x00000001 #define UI_RIGHT 0x00000002 #define UI_FORMATMASK 0x00000007 #define UI_SMALLFONT 0x00000010 #define UI_BIGFONT 0x00000020 // default #define UI_DROPSHADOW 0x00000800 #define UI_BLINK 0x00001000 #define UI_INVERSE 0x00002000 #define UI_PULSE 0x00004000 #if defined(_DEBUG) && !defined(BSPC) #define HUNK_DEBUG #endif typedef enum { h_high, h_low, h_dontcare } ha_pref; void *Hunk_Alloc( int size, ha_pref preference ); #define Com_Memset memset #define Com_Memcpy memcpy #define CIN_system 1 #define CIN_loop 2 #define CIN_hold 4 #define CIN_silent 8 #define CIN_shader 16 typedef enum { BLK_NO, BLK_TIGHT, // Block only attacks and shots around the saber itself, a bbox of around 12x12x12 BLK_WIDE // Block all attacks in an area around the player in a rough arc of 180 degrees } saberBlockType_t; typedef enum { BLOCKED_NONE, BLOCKED_BOUNCE_MOVE, BLOCKED_PARRY_BROKEN, BLOCKED_ATK_BOUNCE, BLOCKED_UPPER_RIGHT, BLOCKED_UPPER_LEFT, BLOCKED_LOWER_RIGHT, BLOCKED_LOWER_LEFT, BLOCKED_TOP, BLOCKED_UPPER_RIGHT_PROJ, BLOCKED_UPPER_LEFT_PROJ, BLOCKED_LOWER_RIGHT_PROJ, BLOCKED_LOWER_LEFT_PROJ, BLOCKED_TOP_PROJ } saberBlockedType_t; typedef enum { SABER_RED, SABER_ORANGE, SABER_YELLOW, SABER_GREEN, SABER_BLUE, SABER_PURPLE, NUM_SABER_COLORS } saber_colors_t; typedef enum { FP_FIRST = 0,//marker FP_HEAL = 0,//instant FP_LEVITATION,//hold/duration FP_SPEED,//duration FP_PUSH,//hold/duration FP_PULL,//hold/duration FP_TELEPATHY,//instant FP_GRIP,//hold/duration FP_LIGHTNING,//hold/duration FP_RAGE,//duration FP_PROTECT, FP_ABSORB, FP_TEAM_HEAL, FP_TEAM_FORCE, FP_DRAIN, FP_SEE, FP_SABER_OFFENSE, FP_SABER_DEFENSE, FP_SABERTHROW, NUM_FORCE_POWERS } forcePowers_t; typedef enum forcePowerLevels_e { FORCE_LEVEL_0, FORCE_LEVEL_1, FORCE_LEVEL_2, FORCE_LEVEL_3, NUM_FORCE_POWER_LEVELS } forcePowerLevels_t; #define FORCE_LEVEL_4 (FORCE_LEVEL_3+1) #define FORCE_LEVEL_5 (FORCE_LEVEL_4+1) //rww - a C-ified structure version of the class which fires off callbacks and gives arguments to update ragdoll status. enum sharedERagPhase { RP_START_DEATH_ANIM, RP_END_DEATH_ANIM, RP_DEATH_COLLISION, RP_CORPSE_SHOT, RP_GET_PELVIS_OFFSET, // this actually does nothing but set the pelvisAnglesOffset, and pelvisPositionOffset RP_SET_PELVIS_OFFSET, // this actually does nothing but set the pelvisAnglesOffset, and pelvisPositionOffset RP_DISABLE_EFFECTORS // this removes effectors given by the effectorsToTurnOff member }; enum sharedERagEffector { RE_MODEL_ROOT= 0x00000001, //"model_root" RE_PELVIS= 0x00000002, //"pelvis" RE_LOWER_LUMBAR= 0x00000004, //"lower_lumbar" RE_UPPER_LUMBAR= 0x00000008, //"upper_lumbar" RE_THORACIC= 0x00000010, //"thoracic" RE_CRANIUM= 0x00000020, //"cranium" RE_RHUMEROUS= 0x00000040, //"rhumerus" RE_LHUMEROUS= 0x00000080, //"lhumerus" RE_RRADIUS= 0x00000100, //"rradius" RE_LRADIUS= 0x00000200, //"lradius" RE_RFEMURYZ= 0x00000400, //"rfemurYZ" RE_LFEMURYZ= 0x00000800, //"lfemurYZ" RE_RTIBIA= 0x00001000, //"rtibia" RE_LTIBIA= 0x00002000, //"ltibia" RE_RHAND= 0x00004000, //"rhand" RE_LHAND= 0x00008000, //"lhand" RE_RTARSAL= 0x00010000, //"rtarsal" RE_LTARSAL= 0x00020000, //"ltarsal" RE_RTALUS= 0x00040000, //"rtalus" RE_LTALUS= 0x00080000, //"ltalus" RE_RRADIUSX= 0x00100000, //"rradiusX" RE_LRADIUSX= 0x00200000, //"lradiusX" RE_RFEMURX= 0x00400000, //"rfemurX" RE_LFEMURX= 0x00800000, //"lfemurX" RE_CEYEBROW= 0x01000000 //"ceyebrow" }; typedef struct sharedRagDollParams_s { vec3_t angles; vec3_t position; vec3_t scale; vec3_t pelvisAnglesOffset; // always set on return, an argument for RP_SET_PELVIS_OFFSET vec3_t pelvisPositionOffset; // always set on return, an argument for RP_SET_PELVIS_OFFSET float fImpactStrength; //should be applicable when RagPhase is RP_DEATH_COLLISION float fShotStrength; //should be applicable for setting velocity of corpse on shot (probably only on RP_CORPSE_SHOT) int me; //index of entity giving this update //rww - we have convenient animation/frame access in the game, so just send this info over from there. int startFrame; int endFrame; int collisionType; // 1 = from a fall, 0 from effectors, this will be going away soon, hence no enum qboolean CallRagDollBegin; // a return value, means that we are now begininng ragdoll and the NPC stuff needs to happen int RagPhase; // effector control, used for RP_DISABLE_EFFECTORS call int effectorsToTurnOff; // set this to an | of the above flags for a RP_DISABLE_EFFECTORS } sharedRagDollParams_t; //And one for updating during model animation. typedef struct sharedRagDollUpdateParams_s { vec3_t angles; vec3_t position; vec3_t scale; vec3_t velocity; int me; int settleFrame; } sharedRagDollUpdateParams_t; //rww - update parms for ik bone stuff typedef struct sharedIKMoveParams_s { char boneName[512]; //name of bone vec3_t desiredOrigin; //world coordinate that this bone should be attempting to reach vec3_t origin; //world coordinate of the entity who owns the g2 instance that owns the bone float movementSpeed; //how fast the bone should move toward the destination } sharedIKMoveParams_t; typedef struct sharedSetBoneIKStateParams_s { vec3_t pcjMins; //ik joint limit vec3_t pcjMaxs; //ik joint limit vec3_t origin; //origin of caller vec3_t angles; //angles of caller vec3_t scale; //scale of caller float radius; //bone rad int blendTime; //bone blend time int pcjOverrides; //override ik bone flags int startFrame; //base pose start int endFrame; //base pose end qboolean forceAnimOnBone; //normally if the bone has specified start/end frames already it will leave it alone.. if this is true, then the animation will be restarted on the bone with the specified frames anyway. } sharedSetBoneIKStateParams_t; enum sharedEIKMoveState { IKS_NONE = 0, IKS_DYNAMIC }; //material stuff needs to be shared typedef enum //# material_e { MAT_METAL = 0, // scorched blue-grey metal MAT_GLASS, // not a real chunk type, just plays an effect with glass sprites MAT_ELECTRICAL, // sparks only MAT_ELEC_METAL, // sparks/electrical type metal MAT_DRK_STONE, // brown MAT_LT_STONE, // tan MAT_GLASS_METAL,// glass sprites and METAl chunk MAT_METAL2, // electrical metal type MAT_NONE, // no chunks MAT_GREY_STONE, // grey MAT_METAL3, // METAL and METAL2 chunks MAT_CRATE1, // yellow multi-colored crate chunks MAT_GRATE1, // grate chunks MAT_ROPE, // for yavin trial...no chunks, just wispy bits MAT_CRATE2, // read multi-colored crate chunks MAT_WHITE_METAL,// white angular chunks MAT_SNOWY_ROCK, // gray & brown chunks NUM_MATERIALS } material_t; //rww - bot stuff that needs to be shared #define MAX_WPARRAY_SIZE 4096 #define MAX_NEIGHBOR_SIZE 32 #define MAX_NEIGHBOR_LINK_DISTANCE 128 #define MAX_NEIGHBOR_FORCEJUMP_LINK_DISTANCE 400 #define DEFAULT_GRID_SPACING 400 typedef struct wpneighbor_s { int num; int forceJumpTo; } wpneighbor_t; typedef struct wpobject_s { vec3_t origin; int inuse; int index; float weight; float disttonext; int flags; int associated_entity; int forceJumpTo; int neighbornum; wpneighbor_t neighbors[MAX_NEIGHBOR_SIZE]; } wpobject_t; // all drawing is done to a 640*480 virtual screen size // and will be automatically scaled to the real resolution #define SCREEN_WIDTH 640 #define SCREEN_HEIGHT 480 #define TINYCHAR_WIDTH (SMALLCHAR_WIDTH) #define TINYCHAR_HEIGHT (SMALLCHAR_HEIGHT/2) #define SMALLCHAR_WIDTH 8 #define SMALLCHAR_HEIGHT 16 #define BIGCHAR_WIDTH 16 #define BIGCHAR_HEIGHT 16 #define GIANTCHAR_WIDTH 32 #define GIANTCHAR_HEIGHT 48 //============================================= char *COM_SkipPath( char *pathname ); const char *COM_GetExtension( const char *name ); void COM_StripExtension( const char *in, char *out, int destsize ); qboolean COM_CompareExtension(const char *in, const char *ext); void COM_DefaultExtension( char *path, int maxSize, const char *extension ); void COM_BeginParseSession( const char *name ); int COM_GetCurrentParseLine( void ); const char *SkipWhitespace( const char *data, qboolean *hasNewLines ); char *COM_Parse( const char **data_p ); char *COM_ParseExt( const char **data_p, qboolean allowLineBreak ); int COM_Compress( char *data_p ); void COM_ParseError( char *format, ... ); void COM_ParseWarning( char *format, ... ); qboolean COM_ParseString( const char **data, const char **s ); qboolean COM_ParseInt( const char **data, int *i ); qboolean COM_ParseFloat( const char **data, float *f ); qboolean COM_ParseVec4( const char **buffer, vec4_t *c); //int COM_ParseInfos( char *buf, int max, char infos[][MAX_INFO_STRING] ); #define MAX_TOKENLENGTH 1024 #ifndef TT_STRING //token types #define TT_STRING 1 // string #define TT_LITERAL 2 // literal #define TT_NUMBER 3 // number #define TT_NAME 4 // name #define TT_PUNCTUATION 5 // punctuation #endif typedef struct pc_token_s { int type; int subtype; int intvalue; float floatvalue; char string[MAX_TOKENLENGTH]; } pc_token_t; // data is an in/out parm, returns a parsed out token void COM_MatchToken( const char**buf_p, char *match ); qboolean SkipBracedSection (const char **program, int depth); void SkipRestOfLine ( const char **data ); void Parse1DMatrix (const char **buf_p, int x, float *m); void Parse2DMatrix (const char **buf_p, int y, int x, float *m); void Parse3DMatrix (const char **buf_p, int z, int y, int x, float *m); int Com_HexStrToInt( const char *str ); int QDECL Com_sprintf (char *dest, int size, const char *fmt, ...); char *Com_SkipTokens( char *s, int numTokens, char *sep ); char *Com_SkipCharset( char *s, char *sep ); void Com_RandomBytes( byte *string, int len ); // mode parm for FS_FOpenFile typedef enum { FS_READ, FS_WRITE, FS_APPEND, FS_APPEND_SYNC } fsMode_t; typedef enum { FS_SEEK_CUR, FS_SEEK_END, FS_SEEK_SET } fsOrigin_t; //============================================= // 64-bit integers for global rankings interface // implemented as a struct for qvm compatibility typedef struct qint64_s { byte b0; byte b1; byte b2; byte b3; byte b4; byte b5; byte b6; byte b7; } qint64; int FloatAsInt( float f ); char * QDECL va(const char *format, ...); #define TRUNCATE_LENGTH 64 void Com_TruncateLongString( char *buffer, const char *s ); //============================================= // // key / value info strings // char *Info_ValueForKey( const char *s, const char *key ); void Info_RemoveKey( char *s, const char *key ); void Info_RemoveKey_Big( char *s, const char *key ); void Info_SetValueForKey( char *s, const char *key, const char *value ); void Info_SetValueForKey_Big( char *s, const char *key, const char *value ); qboolean Info_Validate( const char *s ); qboolean Info_NextPair( const char **s, char *key, char *value ); // this is only here so the functions in q_shared.c and bg_*.c can link #if defined( _GAME ) || defined( _CGAME ) || defined( UI_BUILD ) extern NORETURN_PTR void (*Com_Error)( int level, const char *error, ... ); extern void (*Com_Printf)( const char *msg, ... ); #else void NORETURN QDECL Com_Error( int level, const char *error, ... ); void QDECL Com_Printf( const char *msg, ... ); #endif /* ========================================================== CVARS (console variables) Many variables can be used for cheating purposes, so when cheats is zero, force all unspecified variables to their cefault values. ========================================================== */ #define CVAR_NONE (0x00000000u) #define CVAR_ARCHIVE (0x00000001u) // set to cause it to be saved to configuration file. used for system variables, // not for player specific configurations #define CVAR_USERINFO (0x00000002u) // sent to server on connect or change #define CVAR_SERVERINFO (0x00000004u) // sent in response to front end requests #define CVAR_SYSTEMINFO (0x00000008u) // these cvars will be duplicated on all clients #define CVAR_INIT (0x00000010u) // don't allow change from console at all, but can be set from the command line #define CVAR_LATCH (0x00000020u) // will only change when C code next does a Cvar_Get(), so it can't be changed // without proper initialization. modified will be set, even though the value // hasn't changed yet #define CVAR_ROM (0x00000040u) // display only, cannot be set by user at all (can be set by code) #define CVAR_USER_CREATED (0x00000080u) // created by a set command #define CVAR_TEMP (0x00000100u) // can be set even when cheats are disabled, but is not archived #define CVAR_CHEAT (0x00000200u) // can not be changed if cheats are disabled #define CVAR_NORESTART (0x00000400u) // do not clear when a cvar_restart is issued #define CVAR_INTERNAL (0x00000800u) // cvar won't be displayed, ever (for passwords and such) #define CVAR_PARENTAL (0x00001000u) // lets cvar system know that parental stuff needs to be updated #define CVAR_SERVER_CREATED (0x00002000u) // cvar was created by a server the client connected to. #define CVAR_VM_CREATED (0x00004000u) // cvar was created exclusively in one of the VMs. #define CVAR_PROTECTED (0x00008000u) // prevent modifying this var from VMs or the server #define CVAR_NODEFAULT (0x00010000u) // do not write to config if matching with default value #define CVAR_ARCHIVE_ND (CVAR_ARCHIVE | CVAR_NODEFAULT) // These flags are only returned by the Cvar_Flags() function #define CVAR_MODIFIED (0x40000000u) // Cvar was modified #define CVAR_NONEXISTENT (0x80000000u) // Cvar doesn't exist. // nothing outside the Cvar_*() functions should modify these fields! typedef struct cvar_s { char *name; char *description; char *string; char *resetString; // cvar_restart will reset to this value char *latchedString; // for CVAR_LATCH vars uint32_t flags; qboolean modified; // set each time the cvar is changed int modificationCount; // incremented each time the cvar is changed float value; // atof( string ) int integer; // atoi( string ) qboolean validate; qboolean integral; float min, max; struct cvar_s *next, *prev; struct cvar_s *hashNext, *hashPrev; int hashIndex; } cvar_t; #define MAX_CVAR_VALUE_STRING 256 typedef int cvarHandle_t; // the modules that run in the virtual machine can't access the cvar_t directly, // so they must ask for structured updates typedef struct vmCvar_s { cvarHandle_t handle; int modificationCount; float value; int integer; char string[MAX_CVAR_VALUE_STRING]; } vmCvar_t; /* ============================================================== COLLISION DETECTION ============================================================== */ #include "game/surfaceflags.h" // shared with the q3map utility /* Ghoul2 Insert Start */ typedef struct CollisionRecord_s { float mDistance; int mEntityNum; int mModelIndex; int mPolyIndex; int mSurfaceIndex; vec3_t mCollisionPosition; vec3_t mCollisionNormal; int mFlags; int mMaterial; int mLocation; float mBarycentricI; // two barycentic coodinates for the hit point float mBarycentricJ; // K = 1-I-J } CollisionRecord_t; #define MAX_G2_COLLISIONS 16 typedef CollisionRecord_t G2Trace_t[MAX_G2_COLLISIONS]; // map that describes all of the parts of ghoul2 models that got hit /* Ghoul2 Insert End */ // a trace is returned when a box is swept through the world typedef struct trace_s { byte allsolid; // if true, plane is not valid byte startsolid; // if true, the initial point was in a solid area short entityNum; // entity the contacted sirface is a part of float fraction; // time completed, 1.0 = didn't hit anything vec3_t endpos; // final position cplane_t plane; // surface normal at impact, transformed to world space int surfaceFlags; // surface hit int contents; // contents on other side of surface hit /* Ghoul2 Insert Start */ //rww - removed this for now, it's just wasting space in the trace structure. // CollisionRecord_t G2CollisionMap[MAX_G2_COLLISIONS]; // map that describes all of the parts of ghoul2 models that got hit /* Ghoul2 Insert End */ } trace_t; // trace->entityNum can also be 0 to (MAX_GENTITIES-1) // or ENTITYNUM_NONE, ENTITYNUM_WORLD // markfragments are returned by CM_MarkFragments() typedef struct markFragment_s { int firstPoint; int numPoints; } markFragment_t; typedef struct orientation_s { vec3_t origin; matrix3_t axis; } orientation_t; //===================================================================== // in order from highest priority to lowest // if none of the catchers are active, bound key strings will be executed #define KEYCATCH_CONSOLE 0x0001 #define KEYCATCH_UI 0x0002 #define KEYCATCH_MESSAGE 0x0004 #define KEYCATCH_CGAME 0x0008 // sound channels // channel 0 never willingly overrides // other channels will allways override a playing sound on that channel typedef enum { CHAN_AUTO, //## %s !!"W:\game\base\!!sound\*.wav;*.mp3" # Auto-picks an empty channel to play sound on CHAN_LOCAL, //## %s !!"W:\game\base\!!sound\*.wav;*.mp3" # menu sounds, etc CHAN_WEAPON,//## %s !!"W:\game\base\!!sound\*.wav;*.mp3" CHAN_VOICE, //## %s !!"W:\game\base\!!sound\voice\*.wav;*.mp3" # Voice sounds cause mouth animation CHAN_VOICE_ATTEN, //## %s !!"W:\game\base\!!sound\voice\*.wav;*.mp3" # Causes mouth animation but still use normal sound falloff CHAN_ITEM, //## %s !!"W:\game\base\!!sound\*.wav;*.mp3" CHAN_BODY, //## %s !!"W:\game\base\!!sound\*.wav;*.mp3" CHAN_AMBIENT,//## %s !!"W:\game\base\!!sound\*.wav;*.mp3" # added for ambient sounds CHAN_LOCAL_SOUND, //## %s !!"W:\game\base\!!sound\*.wav;*.mp3" #chat messages, etc CHAN_ANNOUNCER, //## %s !!"W:\game\base\!!sound\*.wav;*.mp3" #announcer voices, etc CHAN_LESS_ATTEN, //## %s !!"W:\game\base\!!sound\*.wav;*.mp3" #attenuates similar to chan_voice, but uses empty channel auto-pick behaviour CHAN_MENU1, //## %s !!"W:\game\base\!!sound\*.wav;*.mp3" #menu stuff, etc CHAN_VOICE_GLOBAL, //## %s !!"W:\game\base\!!sound\voice\*.wav;*.mp3" # Causes mouth animation and is broadcast, like announcer CHAN_MUSIC, //## %s !!"W:\game\base\!!sound\*.wav;*.mp3" #music played as a looping sound - added by BTO (VV) } soundChannel_t; /* ======================================================================== ELEMENTS COMMUNICATED ACROSS THE NET ======================================================================== */ #define ANGLE2SHORT(x) ((int)((x)*65536/360) & 65535) #define SHORT2ANGLE(x) ((x)*(360.0/65536)) #define SNAPFLAG_RATE_DELAYED 1 #define SNAPFLAG_NOT_ACTIVE 2 // snapshot used during connection and for zombies #define SNAPFLAG_SERVERCOUNT 4 // toggled every map_restart so transitions can be detected // // per-level limits // #define MAX_CLIENTS 32 // absolute limit #define MAX_RADAR_ENTITIES MAX_GENTITIES #define MAX_TERRAINS 1//32 //rwwRMG: inserted #define MAX_LOCATIONS 64 #define GENTITYNUM_BITS 10 // don't need to send any more #define MAX_GENTITIES (1< level.time then client is in someone's grip int forceGripCripple; //if != 0 then make it so this client can't move quickly (he's being gripped) int forceGripUseTime; //can't use if > level.time float forceGripSoundTime; float forceGripStarted; //level.time when the grip was activated int forceHealTime; int forceHealAmount; //This hurts me somewhat to do, but there's no other real way to allow completely "dynamic" mindtricking. int forceMindtrickTargetIndex; //0-15 int forceMindtrickTargetIndex2; //16-32 int forceMindtrickTargetIndex3; //33-48 int forceMindtrickTargetIndex4; //49-64 int forceRageRecoveryTime; int forceDrainEntNum; float forceDrainTime; int forceDoInit; int forceSide; int forceRank; int forceDeactivateAll; int killSoundEntIndex[TRACK_CHANNEL_MAX]; //this goes here so it doesn't get wiped over respawn qboolean sentryDeployed; int saberAnimLevelBase;//sigh... int saberAnimLevel; int saberDrawAnimLevel; int suicides; int privateDuelTime; } forcedata_t; typedef enum { SENTRY_NOROOM = 1, SENTRY_ALREADYPLACED, SHIELD_NOROOM, SEEKER_ALREADYDEPLOYED } itemUseFail_t; // bit field limits #define MAX_STATS 16 #define MAX_PERSISTANT 16 #define MAX_POWERUPS 16 #define MAX_WEAPONS 19 #define MAX_AMMO_TRANSMIT 16 // This is needed because the ammo array is 19 but only 16 sized array is networked #define MAX_AMMO MAX_WEAPONS #define MAX_PS_EVENTS 2 #define PS_PMOVEFRAMECOUNTBITS 6 #define FORCE_LIGHTSIDE 1 #define FORCE_DARKSIDE 2 #define MAX_FORCE_RANK 7 #define FALL_FADE_TIME 3000 //#define _ONEBIT_COMBO //Crazy optimization attempt to take all those 1 bit values and shove them into a single //send. May help us not have to send so many 1/0 bits to acknowledge modified values. -rww #define _OPTIMIZED_VEHICLE_NETWORKING //Instead of sending 2 full playerStates for the pilot and the vehicle, send a smaller, //specialized pilot playerState and vehicle playerState. Also removes some vehicle //fields from the normal playerState -mcg // playerState_t is the information needed by both the client and server // to predict player motion and actions // nothing outside of pmove should modify these, or some degree of prediction error // will occur // you can't add anything to this without modifying the code in msg.c // playerState_t is a full superset of entityState_t as it is used by players, // so if a playerState_t is transmitted, the entityState_t can be fully derived // from it. typedef struct playerState_s { int commandTime; // cmd->serverTime of last executed command int pm_type; int bobCycle; // for view bobbing and footstep generation int pm_flags; // ducked, jump_held, etc int pm_time; vec3_t origin; vec3_t velocity; vec3_t moveDir; //NOT sent over the net - nor should it be. int weaponTime; int weaponChargeTime; int weaponChargeSubtractTime; int gravity; float speed; int basespeed; //used in prediction to know base server g_speed value when modifying speed between updates int delta_angles[3]; // add to command angles to get view direction // changed by spawns, rotating objects, and teleporters int slopeRecalcTime; //this is NOT sent across the net and is maintained seperately on game and cgame in pmove code. int useTime; int groundEntityNum;// ENTITYNUM_NONE = in air int legsTimer; // don't change low priority animations until this runs out int legsAnim; int torsoTimer; // don't change low priority animations until this runs out int torsoAnim; qboolean legsFlip; //set to opposite when the same anim needs restarting, sent over in only 1 bit. Cleaner and makes porting easier than having that god forsaken ANIM_TOGGLEBIT. qboolean torsoFlip; int movementDir; // a number 0 to 7 that represents the reletive angle // of movement to the view angle (axial and diagonals) // when at rest, the value will remain unchanged // used to twist the legs during strafing int eFlags; // copied to entityState_t->eFlags int eFlags2; // copied to entityState_t->eFlags2, EF2_??? used much less frequently int eventSequence; // pmove generated events int events[MAX_PS_EVENTS]; int eventParms[MAX_PS_EVENTS]; int externalEvent; // events set on player from another source int externalEventParm; int externalEventTime; int clientNum; // ranges from 0 to MAX_CLIENTS-1 int weapon; // copied to entityState_t->weapon int weaponstate; vec3_t viewangles; // for fixed views int viewheight; // damage feedback int damageEvent; // when it changes, latch the other parms int damageYaw; int damagePitch; int damageCount; int damageType; int painTime; // used for both game and client side to process the pain twitch - NOT sent across the network int painDirection; // NOT sent across the network float yawAngle; // NOT sent across the network qboolean yawing; // NOT sent across the network float pitchAngle; // NOT sent across the network qboolean pitching; // NOT sent across the network int stats[MAX_STATS]; int persistant[MAX_PERSISTANT]; // stats that aren't cleared on death int powerups[MAX_POWERUPS]; // level.time that the powerup runs out int ammo[MAX_AMMO]; int generic1; int loopSound; int jumppad_ent; // jumppad entity hit this frame // not communicated over the net at all int ping; // server to game info for scoreboard int pmove_framecount; // FIXME: don't transmit over the network int jumppad_frame; int entityEventSequence; int lastOnGround; //last time you were on the ground qboolean saberInFlight; int saberMove; int saberBlocking; int saberBlocked; int saberLockTime; int saberLockEnemy; int saberLockFrame; //since we don't actually have the ability to get the current anim frame int saberLockHits; //every x number of buttons hits, allow one push forward in a saber lock (server only) int saberLockHitCheckTime; //so we don't allow more than 1 push per server frame int saberLockHitIncrementTime; //so we don't add a hit per attack button press more than once per server frame qboolean saberLockAdvance; //do an advance (sent across net as 1 bit) int saberEntityNum; float saberEntityDist; int saberEntityState; int saberThrowDelay; qboolean saberCanThrow; int saberDidThrowTime; int saberDamageDebounceTime; int saberHitWallSoundDebounceTime; int saberEventFlags; int rocketLockIndex; float rocketLastValidTime; float rocketLockTime; float rocketTargetTime; int emplacedIndex; float emplacedTime; qboolean isJediMaster; qboolean forceRestricted; qboolean trueJedi; qboolean trueNonJedi; int saberIndex; int genericEnemyIndex; float droneFireTime; float droneExistTime; int activeForcePass; qboolean hasDetPackPlanted; //better than taking up an eFlag isn't it? float holocronsCarried[NUM_FORCE_POWERS]; int holocronCantTouch; float holocronCantTouchTime; //for keeping track of the last holocron that just popped out of me (if any) int holocronBits; int electrifyTime; int saberAttackSequence; int saberIdleWound; int saberAttackWound; int saberBlockTime; int otherKiller; int otherKillerTime; int otherKillerDebounceTime; forcedata_t fd; qboolean forceJumpFlip; int forceHandExtend; int forceHandExtendTime; int forceRageDrainTime; int forceDodgeAnim; qboolean quickerGetup; int groundTime; // time when first left ground int footstepTime; int otherSoundTime; float otherSoundLen; int forceGripMoveInterval; int forceGripChangeMovetype; int forceKickFlip; int duelIndex; int duelTime; qboolean duelInProgress; int saberAttackChainCount; int saberHolstered; int forceAllowDeactivateTime; // zoom key int zoomMode; // 0 - not zoomed, 1 - disruptor weapon int zoomTime; qboolean zoomLocked; float zoomFov; int zoomLockTime; int fallingToDeath; int useDelay; qboolean inAirAnim; vec3_t lastHitLoc; int heldByClient; //can only be a client index - this client should be holding onto my arm using IK stuff. int ragAttach; //attach to ent while ragging int iModelScale; int brokenLimbs; //for looking at an entity's origin (NPCs and players) qboolean hasLookTarget; int lookTarget; int customRGBA[4]; int standheight; int crouchheight; //If non-0, this is the index of the vehicle a player/NPC is riding. int m_iVehicleNum; //lovely hack for keeping vehicle orientation in sync with prediction vec3_t vehOrientation; qboolean vehBoarding; int vehSurfaces; //vehicle turnaround stuff (need this in ps so it doesn't jerk too much in prediction) int vehTurnaroundIndex; int vehTurnaroundTime; //vehicle has weapons linked qboolean vehWeaponsLinked; //when hyperspacing, you just go forward really fast for HYPERSPACE_TIME int hyperSpaceTime; vec3_t hyperSpaceAngles; //hacking when > time int hackingTime; //actual hack amount - only for the proper percentage display when //drawing progress bar (is there a less bandwidth-eating way to do //this without a lot of hassle?) int hackingBaseTime; //keeps track of jetpack fuel int jetpackFuel; //keeps track of cloak fuel int cloakFuel; //rww - spare values specifically for use by mod authors. //See psf_overrides.txt if you want to increase the send //amount of any of these above 1 bit. int userInt1; int userInt2; int userInt3; float userFloat1; float userFloat2; float userFloat3; vec3_t userVec1; vec3_t userVec2; #ifdef _ONEBIT_COMBO int deltaOneBits; int deltaNumBits; #endif } playerState_t; typedef struct siegePers_s { qboolean beatingTime; int lastTeam; int lastTime; } siegePers_t; //==================================================================== // // usercmd_t->button bits, many of which are generated by the client system, // so they aren't game/cgame only definitions // #define BUTTON_ATTACK 1 #define BUTTON_TALK 2 // displays talk balloon and disables actions #define BUTTON_USE_HOLDABLE 4 #define BUTTON_GESTURE 8 #define BUTTON_WALKING 16 // walking can't just be infered from MOVE_RUN // because a key pressed late in the frame will // only generate a small move value for that frame // walking will use different animations and // won't generate footsteps #define BUTTON_USE 32 // the ol' use key returns! #define BUTTON_FORCEGRIP 64 // #define BUTTON_ALT_ATTACK 128 #define BUTTON_ANY 256 // any key whatsoever #define BUTTON_FORCEPOWER 512 // use the "active" force power #define BUTTON_FORCE_LIGHTNING 1024 #define BUTTON_FORCE_DRAIN 2048 // Here's an interesting bit. The bots in TA used buttons to do additional gestures. // I ripped them out because I didn't want too many buttons given the fact that I was already adding some for JK2. // We can always add some back in if we want though. /* #define BUTTON_AFFIRMATIVE 32 #define BUTTON_NEGATIVE 64 #define BUTTON_GETFLAG 128 #define BUTTON_GUARDBASE 256 #define BUTTON_PATROL 512 #define BUTTON_FOLLOWME 1024 */ #define MOVE_RUN 120 // if forwardmove or rightmove are >= MOVE_RUN, // then BUTTON_WALKING should be set typedef enum { GENCMD_SABERSWITCH = 1, GENCMD_ENGAGE_DUEL, GENCMD_FORCE_HEAL, GENCMD_FORCE_SPEED, GENCMD_FORCE_THROW, GENCMD_FORCE_PULL, GENCMD_FORCE_DISTRACT, GENCMD_FORCE_RAGE, GENCMD_FORCE_PROTECT, GENCMD_FORCE_ABSORB, GENCMD_FORCE_HEALOTHER, GENCMD_FORCE_FORCEPOWEROTHER, GENCMD_FORCE_SEEING, GENCMD_USE_SEEKER, GENCMD_USE_FIELD, GENCMD_USE_BACTA, GENCMD_USE_ELECTROBINOCULARS, GENCMD_ZOOM, GENCMD_USE_SENTRY, GENCMD_USE_JETPACK, GENCMD_USE_BACTABIG, GENCMD_USE_HEALTHDISP, GENCMD_USE_AMMODISP, GENCMD_USE_EWEB, GENCMD_USE_CLOAK, GENCMD_SABERATTACKCYCLE, GENCMD_TAUNT, GENCMD_BOW, GENCMD_MEDITATE, GENCMD_FLOURISH, GENCMD_GLOAT } genCmds_t; // usercmd_t is sent to the server each client frame typedef struct usercmd_s { int serverTime; int angles[3]; int buttons; byte weapon; // weapon byte forcesel; byte invensel; byte generic_cmd; signed char forwardmove, rightmove, upmove; } usercmd_t; //=================================================================== //rww - unsightly hack to allow us to make an FX call that takes a horrible amount of args typedef struct addpolyArgStruct_s { vec3_t p[4]; vec2_t ev[4]; int numVerts; vec3_t vel; vec3_t accel; float alpha1; float alpha2; float alphaParm; vec3_t rgb1; vec3_t rgb2; float rgbParm; vec3_t rotationDelta; float bounce; int motionDelay; int killTime; qhandle_t shader; int flags; } addpolyArgStruct_t; typedef struct addbezierArgStruct_s { vec3_t start; vec3_t end; vec3_t control1; vec3_t control1Vel; vec3_t control2; vec3_t control2Vel; float size1; float size2; float sizeParm; float alpha1; float alpha2; float alphaParm; vec3_t sRGB; vec3_t eRGB; float rgbParm; int killTime; qhandle_t shader; int flags; } addbezierArgStruct_t; typedef struct addspriteArgStruct_s { vec3_t origin; vec3_t vel; vec3_t accel; float scale; float dscale; float sAlpha; float eAlpha; float rotation; float bounce; int life; qhandle_t shader; int flags; } addspriteArgStruct_t; typedef struct effectTrailVertStruct_s { vec3_t origin; // very specifc case, we can modulate the color and the alpha vec3_t rgb; vec3_t destrgb; vec3_t curRGB; float alpha; float destAlpha; float curAlpha; // this is a very specific case thing...allow interpolating the st coords so we can map the texture // properly as this segement progresses through it's life float ST[2]; float destST[2]; float curST[2]; } effectTrailVertStruct_t; typedef struct effectTrailArgStruct_s { effectTrailVertStruct_t mVerts[4]; qhandle_t mShader; int mSetFlags; int mKillTime; } effectTrailArgStruct_t; typedef struct addElectricityArgStruct_s { vec3_t start; vec3_t end; float size1; float size2; float sizeParm; float alpha1; float alpha2; float alphaParm; vec3_t sRGB; vec3_t eRGB; float rgbParm; float chaos; int killTime; qhandle_t shader; int flags; } addElectricityArgStruct_t; // if entityState->solid == SOLID_BMODEL, modelindex is an inline model number #define SOLID_BMODEL 0xffffff typedef enum { TR_STATIONARY, TR_INTERPOLATE, // non-parametric, but interpolate between snapshots TR_LINEAR, TR_LINEAR_STOP, TR_NONLINEAR_STOP, TR_SINE, // value = base + sin( time / duration ) * delta TR_GRAVITY } trType_t; typedef struct trajectory_s { trType_t trType; int trTime; int trDuration; // if non 0, trTime + trDuration = stop time vec3_t trBase; vec3_t trDelta; // velocity, etc } trajectory_t; // entityState_t is the information conveyed from the server // in an update message about entities that the client will // need to render in some way // Different eTypes may use the information in different ways // The messages are delta compressed, so it doesn't really matter if // the structure size is fairly large typedef struct entityState_s { int number; // entity index int eType; // entityType_t int eFlags; int eFlags2; // EF2_??? used much less frequently trajectory_t pos; // for calculating position trajectory_t apos; // for calculating angles int time; int time2; vec3_t origin; vec3_t origin2; vec3_t angles; vec3_t angles2; //rww - these were originally because we shared g2 info client and server side. Now they //just get used as generic values everywhere. int bolt1; int bolt2; //rww - this is necessary for determining player visibility during a jedi mindtrick int trickedentindex; //0-15 int trickedentindex2; //16-32 int trickedentindex3; //33-48 int trickedentindex4; //49-64 float speed; int fireflag; int genericenemyindex; int activeForcePass; int emplacedOwner; int otherEntityNum; // shotgun sources, etc int otherEntityNum2; int groundEntityNum; // ENTITYNUM_NONE = in air int constantLight; // r + (g<<8) + (b<<16) + (intensity<<24) int loopSound; // constantly loop this sound qboolean loopIsSoundset; //qtrue if the loopSound index is actually a soundset index int soundSetIndex; int modelGhoul2; int g2radius; int modelindex; int modelindex2; int clientNum; // 0 to (MAX_CLIENTS - 1), for players and corpses int frame; qboolean saberInFlight; int saberEntityNum; int saberMove; int forcePowersActive; int saberHolstered;//sent in only only 2 bits - should be 0, 1 or 2 qboolean isJediMaster; qboolean isPortalEnt; //this needs to be seperate for all entities I guess, which is why I couldn't reuse another value. int solid; // for client side prediction, trap_linkentity sets this properly int event; // impulse events -- muzzle flashes, footsteps, etc int eventParm; // so crosshair knows what it's looking at int owner; int teamowner; qboolean shouldtarget; // for players int powerups; // bit flags int weapon; // determines weapon and flash model, etc int legsAnim; int torsoAnim; qboolean legsFlip; //set to opposite when the same anim needs restarting, sent over in only 1 bit. Cleaner and makes porting easier than having that god forsaken ANIM_TOGGLEBIT. qboolean torsoFlip; int forceFrame; //if non-zero, force the anim frame int generic1; int heldByClient; //can only be a client index - this client should be holding onto my arm using IK stuff. int ragAttach; //attach to ent while ragging int iModelScale; //rww - transfer a percentage of the normal scale in a single int instead of 3 x-y-z scale values int brokenLimbs; int boltToPlayer; //set to index of a real client+1 to bolt the ent to that client. Must be a real client, NOT an NPC. //for looking at an entity's origin (NPCs and players) qboolean hasLookTarget; int lookTarget; int customRGBA[4]; //I didn't want to do this, but I.. have no choice. However, we aren't setting this for all ents or anything, //only ones we want health knowledge about on cgame (like siege objective breakables) -rww int health; int maxhealth; //so I know how to draw the stupid health bar //NPC-SPECIFIC FIELDS //------------------------------------------------------------ int npcSaber1; int npcSaber2; //index values for each type of sound, gets the folder the sounds //are in. I wish there were a better way to do this, int csSounds_Std; int csSounds_Combat; int csSounds_Extra; int csSounds_Jedi; int surfacesOn; //a bitflag of corresponding surfaces from a lookup table. These surfaces will be forced on. int surfacesOff; //same as above, but forced off instead. //Allow up to 4 PCJ lookup values to be stored here. //The resolve to configstrings which contain the name of the //desired bone. int boneIndex1; int boneIndex2; int boneIndex3; int boneIndex4; //packed with x, y, z orientations for bone angles int boneOrient; //I.. feel bad for doing this, but NPCs really just need to //be able to control this sort of thing from the server sometimes. //At least it's at the end so this stuff is never going to get sent //over for anything that isn't an NPC. vec3_t boneAngles1; //angles of boneIndex1 vec3_t boneAngles2; //angles of boneIndex2 vec3_t boneAngles3; //angles of boneIndex3 vec3_t boneAngles4; //angles of boneIndex4 int NPC_class; //we need to see what it is on the client for a few effects. //If non-0, this is the index of the vehicle a player/NPC is riding. int m_iVehicleNum; //rww - spare values specifically for use by mod authors. //See netf_overrides.txt if you want to increase the send //amount of any of these above 1 bit. int userInt1; int userInt2; int userInt3; float userFloat1; float userFloat2; float userFloat3; vec3_t userVec1; vec3_t userVec2; } entityState_t; typedef enum { CA_UNINITIALIZED, CA_DISCONNECTED, // not talking to a server CA_AUTHORIZING, // not used any more, was checking cd key CA_CONNECTING, // sending request packets to the server CA_CHALLENGING, // sending challenge packets to the server CA_CONNECTED, // netchan_t established, getting gamestate CA_LOADING, // only during cgame initialization, never during main loop CA_PRIMED, // got gamestate, waiting for first frame CA_ACTIVE, // game views should be displayed CA_CINEMATIC // playing a cinematic or a static pic, not connected to a server } connstate_t; #define Square(x) ((x)*(x)) // real time //============================================= typedef struct qtime_s { int tm_sec; /* seconds after the minute - [0,59] */ int tm_min; /* minutes after the hour - [0,59] */ int tm_hour; /* hours since midnight - [0,23] */ int tm_mday; /* day of the month - [1,31] */ int tm_mon; /* months since January - [0,11] */ int tm_year; /* years since 1900 */ int tm_wday; /* days since Sunday - [0,6] */ int tm_yday; /* days since January 1 - [0,365] */ int tm_isdst; /* daylight savings time flag */ } qtime_t; // server browser sources #define AS_LOCAL 0 #define AS_GLOBAL 1 #define AS_FAVORITES 2 #define AS_MPLAYER 3 // (Obsolete) // cinematic states typedef enum { FMV_IDLE, FMV_PLAY, // play FMV_EOF, // all other conditions, i.e. stop/EOF/abort FMV_ID_BLT, FMV_ID_IDLE, FMV_LOOPED, FMV_ID_WAIT } e_status; #define MAX_GLOBAL_SERVERS 2048 #define MAX_OTHER_SERVERS 128 #define MAX_PINGREQUESTS 32 #define MAX_SERVERSTATUSREQUESTS 16 #define SAY_ALL 0 #define SAY_TEAM 1 #define SAY_TELL 2 /* Ghoul2 Insert Start */ typedef struct mdxaBone_s { float matrix[3][4]; } mdxaBone_t; // For ghoul2 axis use typedef enum Eorientations { ORIGIN = 0, POSITIVE_X, POSITIVE_Z, POSITIVE_Y, NEGATIVE_X, NEGATIVE_Z, NEGATIVE_Y } orientations_t; /* Ghoul2 Insert End */ // define the new memory tags for the zone, used by all modules now // #define TAGDEF(blah) TAG_ ## blah typedef enum { #include "qcommon/tags.h" } memtag; typedef unsigned memtag_t; //rww - conveniently toggle "gore" code, for model decals and stuff. #define _G2_GORE typedef struct SSkinGoreData_s { vec3_t angles; vec3_t position; int currentTime; int entNum; vec3_t rayDirection; // in world space vec3_t hitLocation; // in world space vec3_t scale; float SSize; // size of splotch in the S texture direction in world units float TSize; // size of splotch in the T texture direction in world units float theta; // angle to rotate the splotch // growing stuff int growDuration; // time over which we want this to scale up, set to -1 for no scaling float goreScaleStartFraction; // fraction of the final size at which we want the gore to initially appear qboolean frontFaces; qboolean backFaces; qboolean baseModelOnly; int lifeTime; // effect expires after this amount of time int fadeOutTime; //specify the duration of fading, from the lifeTime (e.g. 3000 will start fading 3 seconds before removal and be faded entirely by removal) int shrinkOutTime; // unimplemented float alphaModulate; // unimplemented vec3_t tint; // unimplemented float impactStrength; // unimplemented int shader; // shader handle int myIndex; // used internally qboolean fadeRGB; //specify fade method to modify RGB (by default, the alpha is set instead) } SSkinGoreData; /* ======================================================================== String ID Tables ======================================================================== */ #define ENUM2STRING(arg) { #arg, arg } typedef struct stringID_table_s { const char *name; int id; } stringID_table_t; int GetIDForString ( stringID_table_t *table, const char *string ); const char *GetStringForID( stringID_table_t *table, int id ); // stuff to help out during development process, force reloading/uncacheing of certain filetypes... // typedef enum { eForceReload_NOTHING, // eForceReload_BSP, // not used in MP codebase eForceReload_MODELS, eForceReload_ALL } ForceReload_e; enum { FONT_NONE, FONT_SMALL=1, FONT_MEDIUM, FONT_LARGE, FONT_SMALL2 }; void NET_AddrToString( char *out, size_t size, void *addr ); qboolean Q_InBitflags( const uint32_t *bits, int index, uint32_t bitsPerByte ); void Q_AddToBitflags( uint32_t *bits, int index, uint32_t bitsPerByte ); void Q_RemoveFromBitflags( uint32_t *bits, int index, uint32_t bitsPerByte ); typedef int( *cmpFunc_t )(const void *a, const void *b); void *Q_LinearSearch( const void *key, const void *ptr, size_t count, size_t size, cmpFunc_t cmp );