569 lines
17 KiB
C
569 lines
17 KiB
C
//-----------------------------------------------------------------------------
|
|
//
|
|
// $Logfile:: /Quake 2 Engine/Sin/code/game/game.h $
|
|
// $Revision:: 52 $
|
|
// $Author:: Markd $
|
|
// $Date:: 1/27/99 10:02p $
|
|
//
|
|
// Copyright (C) 1998 by Ritual Entertainment, Inc.
|
|
// All rights reserved.
|
|
//
|
|
// This source is may not be distributed and/or modified without
|
|
// expressly written permission by Ritual Entertainment, Inc.
|
|
//
|
|
// $Log:: /Quake 2 Engine/Sin/code/game/game.h $
|
|
//
|
|
// 52 1/27/99 10:02p Markd
|
|
// Merged 2015 source into main code base
|
|
//
|
|
// 51 12/18/98 11:05p Jimdose
|
|
// added definitions of server side stuff to get rid of qcommon.h includes
|
|
//
|
|
// 50 11/11/98 10:04p Jimdose
|
|
// Removed comment
|
|
//
|
|
// 49 11/11/98 10:02p Jimdose
|
|
// added SVF_MONSTERCLIP and SVF_PLAYERCLIP
|
|
//
|
|
// 48 10/20/98 9:46p Jimdose
|
|
// made CalcCRC take a const char *
|
|
//
|
|
// 47 10/20/98 9:39p Jimdose
|
|
// Added CalcCRC
|
|
// Upped GAME_API_VERSION
|
|
//
|
|
// 46 10/16/98 1:56a Jimdose
|
|
// Added autosave to WriteLevel function
|
|
// Increased GAME_API_VERSION
|
|
//
|
|
// 45 10/10/98 5:58p Aldie
|
|
// More quantumdestab fixes
|
|
//
|
|
// 44 10/08/98 7:42p Jimdose
|
|
// Added ServerCommand
|
|
//
|
|
// 43 9/08/98 7:09p Jimdose
|
|
// added printf to game_import_t
|
|
//
|
|
// 42 9/07/98 8:29p Markd
|
|
// Added fullmins fullmaxs and fullradius
|
|
//
|
|
// 41 9/05/98 11:55a Markd
|
|
// Upped game api version
|
|
//
|
|
// 40 9/01/98 7:47p Aldie
|
|
// Added itemname to inventory stuff
|
|
//
|
|
// 39 8/31/98 7:45p Aldie
|
|
// Updated surface data structure and removed surfinfo field
|
|
//
|
|
// 38 8/29/98 9:51p Jimdose
|
|
// made netconsole_s, netconbuffer_s, and netsurface_s visible to game dll to
|
|
// get rid of it in g_local.h
|
|
//
|
|
// 37 8/29/98 2:53p Aldie
|
|
// Added status meter for loading levels.
|
|
//
|
|
// 36 8/28/98 3:46p Markd
|
|
// Added centroid to edict_s
|
|
//
|
|
// 35 8/25/98 7:55p Markd
|
|
// Added SVF_ONLYPARENT flag
|
|
//
|
|
// 34 8/18/98 11:08p Markd
|
|
// Added new Alias System
|
|
//
|
|
// 33 8/02/98 9:00p Markd
|
|
// Merged code 3.17
|
|
//
|
|
// 32 7/17/98 7:58p Markd
|
|
// Added radius to fulltrace, also added SVF_USEBBOX
|
|
//
|
|
// 31 6/27/98 6:40p Markd
|
|
// Added SoundLength
|
|
//
|
|
// 30 6/20/98 7:50p Markd
|
|
// Added BoneGroupName function
|
|
//
|
|
// 29 6/15/98 10:06p Jimdose
|
|
// added gi.fulltrace
|
|
//
|
|
// 28 6/15/98 7:57p Markd
|
|
// Put in Group_Flags
|
|
//
|
|
// 27 6/08/98 7:23p Aldie
|
|
// Added some surface in the game import
|
|
//
|
|
// 26 5/26/98 8:42p Markd
|
|
// Added NumGroups to interface
|
|
//
|
|
// 25 5/24/98 4:48p Jimdose
|
|
// Made char *'s const
|
|
//
|
|
// 24 5/24/98 2:46p Markd
|
|
// Made char *'s into const char *'s
|
|
//
|
|
// 23 5/23/98 12:53p Aldie
|
|
// Updated surfaces networking.
|
|
//
|
|
// 22 5/20/98 11:12a Markd
|
|
// removed char * dependency
|
|
//
|
|
// 21 5/13/98 4:47p Aldie
|
|
// Update damage surfaces
|
|
//
|
|
// 20 5/09/98 8:01p Jimdose
|
|
// added GameDir, PlayerDir, and CreatePath to the import list for the dll
|
|
//
|
|
// 19 5/05/98 2:44p Aldie
|
|
// Added server side surface states
|
|
//
|
|
// 18 4/30/98 4:48p Aldie
|
|
// Server side console states
|
|
//
|
|
// 17 4/28/98 7:00p Aldie
|
|
// Added sever side console buffer
|
|
//
|
|
// 16 4/27/98 3:20p Jimdose
|
|
// Added DebugLines
|
|
//
|
|
// 15 4/27/98 1:51p Aldie
|
|
// Added server side console states.
|
|
//
|
|
// 14 4/09/98 1:40p Markd
|
|
// Added SVF_SHOOTABLE
|
|
//
|
|
// 13 4/07/98 8:01p Markd
|
|
// Changed all SINMDL commands to non-SINMDL prefix
|
|
//
|
|
// 12 3/30/98 6:12p Markd
|
|
// Added Alias commands
|
|
//
|
|
// 11 3/29/98 8:33p Markd
|
|
// Changed nature of InitCmds and FrameCommands
|
|
//
|
|
// 10 3/27/98 7:00p Markd
|
|
// Changed Bone functions a bit
|
|
//
|
|
// 9 3/25/98 1:22p Markd
|
|
//
|
|
// 8 3/24/98 9:59a Markd
|
|
// Added new bone, and group stuff for models
|
|
//
|
|
// 7 3/18/98 8:01p Markd
|
|
// Accidentally made fadetime an int instead of a float
|
|
//
|
|
// 6 3/18/98 7:15p Markd
|
|
// Changed sound code stuff
|
|
//
|
|
// 5 3/05/98 6:44p Markd
|
|
// Added SINMDL stuff
|
|
//
|
|
// 4 2/03/98 11:08a Jimdose
|
|
// Converted to work with Sin progs
|
|
// Could use a little clean up.
|
|
//
|
|
// 3 12/30/97 6:04p Jimdose
|
|
// Added header text
|
|
//
|
|
// DESCRIPTION:
|
|
// game dll information visible to server
|
|
//
|
|
|
|
#ifndef __GAME_H__
|
|
#define __GAME_H__
|
|
|
|
#ifdef __cplusplus
|
|
extern "C" {
|
|
#endif
|
|
|
|
#define GAME_API_VERSION 13
|
|
|
|
// edict->svflags
|
|
#define FRAMETIME 0.1
|
|
|
|
#define SVF_NOCLIENT 0x00000001 // don't send entity to clients, even if it has effects
|
|
#define SVF_DEADMONSTER 0x00000002 // treat as CONTENTS_DEADMONSTER for collision
|
|
#define SVF_MONSTER 0x00000004 // treat as CONTENTS_MONSTER for collision
|
|
#define SVF_SHOOTABLE 0x00000008 // treat as CONTENTS_SHOOTABLE for collision
|
|
#define SVF_USEBBOX 0x00000010 // do not perform perfect collision use the bbox instead
|
|
#define SVF_ONLYPARENT 0x00000020 // only send this entity to its parent
|
|
#define SVF_HIDEOWNER 0x00000040 // hide the owner of the client
|
|
#define SVF_MONSTERCLIP 0x00000080 // treat as CONTENTS_MONSTERCLIP for collision
|
|
#define SVF_PLAYERCLIP 0x00000100 // treat as CONTENTS_PLAYERCLIP for collision
|
|
// 2015 code
|
|
#define SVF_NOTOWNER 0x00000200 // don't draw for owner
|
|
|
|
// edict->solid values
|
|
|
|
typedef enum
|
|
{
|
|
SOLID_NOT, // no interaction with other objects
|
|
SOLID_TRIGGER, // only touch when inside, after moving
|
|
SOLID_BBOX, // touch on edge
|
|
SOLID_BSP // bsp clip, touch on edge
|
|
} solid_t;
|
|
|
|
//===============================================================
|
|
|
|
// link_t is only used for entity area links now
|
|
typedef struct link_s
|
|
{
|
|
struct link_s *prev, *next;
|
|
} link_t;
|
|
|
|
#define MAX_ENT_CLUSTERS 16
|
|
|
|
typedef struct edict_s edict_t;
|
|
typedef struct gclient_s gclient_t;
|
|
typedef struct netconsole_s netconsole_t;
|
|
typedef struct netconbuffer_s netconbuffer_t;
|
|
typedef struct netsurface_s netsurface_t;
|
|
|
|
#ifndef QCOMMON
|
|
|
|
// If this is modified in qcommon.h, it must be reflected here.
|
|
#define MAX_MSGLEN 1400 // max length of a message
|
|
|
|
// If this is modified in qcommon.h, it must be reflected here.
|
|
enum svc_ops_e
|
|
{
|
|
svc_bad,
|
|
svc_muzzleflash,
|
|
svc_muzzleflash2,
|
|
svc_temp_entity,
|
|
svc_layout,
|
|
svc_inventory,
|
|
svc_console_command
|
|
};
|
|
|
|
#endif
|
|
|
|
#ifndef GAME_INCLUDE
|
|
|
|
typedef struct gclient_s
|
|
{
|
|
player_state_t ps; // communicated by server to clients
|
|
int ping;
|
|
// the game dll can add anything it wants after
|
|
// this point in the structure
|
|
} gclient_t;
|
|
|
|
struct edict_s
|
|
{
|
|
entity_state_t s;
|
|
struct gclient_s *client;
|
|
qboolean inuse;
|
|
int linkcount;
|
|
|
|
// FIXME: move these fields to a server private sv_entity_t
|
|
link_t area; // linked to a division node or leaf
|
|
|
|
int num_clusters; // if -1, use headnode instead
|
|
int clusternums[MAX_ENT_CLUSTERS];
|
|
int headnode; // unused if num_clusters != -1
|
|
int areanum, areanum2;
|
|
|
|
//================================
|
|
|
|
int svflags; // SVF_NOCLIENT, SVF_DEADMONSTER, SVF_MONSTER, etc
|
|
vec3_t mins, maxs;
|
|
vec3_t absmin, absmax, size;
|
|
vec3_t fullmins, fullmaxs;
|
|
float fullradius;
|
|
vec3_t centroid;
|
|
solid_t solid;
|
|
int clipmask;
|
|
edict_t *owner;
|
|
|
|
// the game dll can add anything it wants after
|
|
// this point in the structure
|
|
};
|
|
|
|
#endif // GAME_INCLUDE
|
|
|
|
struct netconsole_s
|
|
{
|
|
console_state_t s;
|
|
qboolean inuse;
|
|
};
|
|
|
|
struct netconbuffer_s
|
|
{
|
|
console_buffer_state_t s;
|
|
};
|
|
|
|
struct netsurface_s
|
|
{
|
|
surface_state_t s;
|
|
qboolean inuse;
|
|
};
|
|
|
|
//===============================================================
|
|
|
|
//
|
|
// functions provided by the main engine
|
|
//
|
|
typedef struct
|
|
{
|
|
// special messages
|
|
void (*bprintf) (int printlevel, const char *fmt, ...);
|
|
void (*dprintf) (const char *fmt, ...);
|
|
void (*printf) (const char *fmt, ...);
|
|
void (*cprintf) (edict_t *ent, int printlevel, const char *fmt, ...);
|
|
void (*centerprintf) (edict_t *ent, const char *fmt, ...);
|
|
void (*sound) (edict_t *ent, int channel, int soundindex, float volume, float attenuation, float timeofs, float pitch, float fadetime, int flags);
|
|
void (*positioned_sound) (vec3_t origin, edict_t *ent, int channel, int soundinedex, float volume, float attenuation, float timeofs, float pitch, float fadetime, int flags);
|
|
|
|
// config strings hold all the index strings, the lightstyles,
|
|
// and misc data like the sky definition and cdtrack.
|
|
// All of the current configstrings are sent to clients when
|
|
// they connect, and changes are sent to all connected clients.
|
|
void (*configstring) (int num, const char *string);
|
|
|
|
void (*error) (const char *fmt, ...);
|
|
|
|
// new names can only be added during spawning
|
|
// existing names can be looked up at any time
|
|
int (*modelindex) (const char *name);
|
|
int (*soundindex) (const char *name);
|
|
int (*imageindex) (const char *name);
|
|
int (*itemindex) (const char *name);
|
|
|
|
void (*setmodel) (edict_t *ent, const char *name);
|
|
|
|
// collision detection against world and bboxes of a-models
|
|
trace_t (*trace) (vec3_t start, vec3_t mins, vec3_t maxs, vec3_t end, edict_t *passent, int contentmask);
|
|
|
|
// for full ray intersection tests against a-model polys and world
|
|
trace_t (*fulltrace) (vec3_t start, vec3_t mins, vec3_t maxs, vec3_t end, float radius, edict_t *passent, int contentmask);
|
|
|
|
int (*pointcontents) (vec3_t point);
|
|
qboolean (*inPVS) (vec3_t p1, vec3_t p2);
|
|
qboolean (*inPHS) (vec3_t p1, vec3_t p2);
|
|
void (*SetAreaPortalState) (int portalnum, qboolean open);
|
|
qboolean (*AreasConnected) (int area1, int area2);
|
|
|
|
// an entity will never be sent to a client or used for collision
|
|
// if it is not passed to linkentity. If the size, position, or
|
|
// solidity changes, it must be relinked.
|
|
void (*linkentity) (edict_t *ent);
|
|
void (*unlinkentity) (edict_t *ent); // call before removing an interactive edict
|
|
int (*BoxEdicts) (vec3_t mins, vec3_t maxs, edict_t **list, int maxcount, int areatype);
|
|
void (*Pmove) (pmove_t *pmove); // player movement code common with client prediction
|
|
|
|
// network messaging
|
|
void (*multicast) (vec3_t origin, multicast_t to);
|
|
void (*unicast) (edict_t *ent, qboolean reliable);
|
|
void (*WriteChar) (int c);
|
|
void (*WriteByte) (int c);
|
|
void (*WriteShort) (int c);
|
|
void (*WriteLong) (int c);
|
|
void (*WriteFloat) (float f);
|
|
void (*WriteString) (const char *s);
|
|
void (*WritePosition) (vec3_t pos); // some fractional bits
|
|
void (*WriteDir) (vec3_t pos); // single byte encoded, very coarse
|
|
void (*WriteAngle) (float f);
|
|
|
|
// managed memory allocation
|
|
void *(*TagMalloc) (int size, int tag);
|
|
void (*TagFree) (void *block);
|
|
void (*FreeTags) (int tag);
|
|
|
|
// console variable interaction
|
|
cvar_t *(*cvar) (const char *var_name, const char *value, int flags);
|
|
cvar_t *(*cvar_set) (const char *var_name, const char *value);
|
|
cvar_t *(*cvar_forceset) (const char *var_name, const char *value);
|
|
|
|
// ClientCommand and coneole command parameter checking
|
|
int (*argc) (void);
|
|
const char *(*argv) (int n);
|
|
const char *(*args) (void);
|
|
|
|
// add commands to the server console as if they were typed in
|
|
// for map changing, etc
|
|
void (*AddCommandString) (const char *text);
|
|
|
|
void (*DebugGraph) (float value, int color);
|
|
|
|
int (*LoadFile) ( const char *path, void **buffer, int tag);
|
|
const char *(*GameDir)( void );
|
|
const char *(*PlayerDir)( void );
|
|
void (*CreatePath)(const char *path);
|
|
float (*SoundLength) ( const char *path );
|
|
|
|
|
|
//
|
|
// Model support
|
|
//
|
|
qboolean (*IsModel) ( int index );
|
|
|
|
//
|
|
// MODEL UTILITY FUNCTIONS
|
|
//
|
|
|
|
// DEF SPECIFIC STUFF
|
|
int (*NumAnims) ( int modelindex );
|
|
int (*NumSkins) ( int modelindex );
|
|
int (*NumGroups) ( int modelindex );
|
|
sinmdl_cmd_t * (*InitCommands) ( int modelindex );
|
|
void (*CalculateBounds) ( int modelindex, float scale, vec3_t mins, vec3_t maxs );
|
|
|
|
// ANIM SPECIFIC STUFF
|
|
const char * (*Anim_NameForNum) ( int modelindex, int animnum );
|
|
int (*Anim_NumForName) ( int modelindex, const char * name );
|
|
int (*Anim_Random) ( int modelindex, const char * name );
|
|
int (*Anim_NumFrames) ( int modelindex, int animnum );
|
|
float (*Anim_Time) ( int modelindex, int animnum );
|
|
void (*Anim_Delta) ( int modelindex, int animnum, vec3_t delta );
|
|
|
|
// FRAME SPECIFIC STUFF
|
|
sinmdl_cmd_t * (*Frame_Commands) ( int modelindex, int animnum, int framenum );
|
|
void (*Frame_Delta) ( int modelindex, int animnum, int framenum, vec3_t delta );
|
|
float (*Frame_Time) ( int modelindex, int animnum, int framenum );
|
|
|
|
// SKIN SPECIFIC STUFF
|
|
const char * (*Skin_NameForNum) ( int modelindex, int skinnum );
|
|
int (*Skin_NumForName) ( int modelindex, const char * name );
|
|
|
|
// GROUP SPECIFIC STUFF
|
|
int (*Group_NameToNum) ( int modelindex, const char * name );
|
|
const char * (*Group_NumToName) ( int modelindex, int num );
|
|
float (*Group_DamageMultiplier) ( int modelindex, int num );
|
|
int (*Group_Flags) ( int modelindex, int num );
|
|
|
|
// BONE SPECIFIC STUFF
|
|
qboolean (*GetBoneInfo)
|
|
(
|
|
int modelindex,
|
|
const char * bonename,
|
|
int * groupindex,
|
|
int * tri_num,
|
|
vec3_t orientation
|
|
);
|
|
|
|
const char * (*GetBoneGroupName)
|
|
(
|
|
int modelindex,
|
|
const char * bonename
|
|
);
|
|
|
|
qboolean (*GetBoneTransform)
|
|
(
|
|
int modelindex,
|
|
int groupindex,
|
|
int tri_num,
|
|
vec3_t orientation,
|
|
int anim,
|
|
int frame,
|
|
float scale,
|
|
vec3_t trans[3],
|
|
vec3_t pos
|
|
);
|
|
|
|
//
|
|
// ALIAS SYSTEM
|
|
//
|
|
qboolean (*Alias_Add)( int modelindex, const char * alias, const char * name, float weight );
|
|
const char * (*Alias_FindRandom)( int modelindex, const char * alias );
|
|
void (*Alias_Dump)( int modelindex );
|
|
void (*Alias_Clear)( int modelindex );
|
|
|
|
//
|
|
// GLOBAL ALIAS SYSTEM
|
|
//
|
|
qboolean (*GlobalAlias_Add)( const char * alias, const char * name, float weight );
|
|
const char * (*GlobalAlias_FindRandom)( const char * alias );
|
|
void (*GlobalAlias_Dump)( void );
|
|
void (*GlobalAlias_Clear)( void );
|
|
|
|
unsigned short ( *CalcCRC )( const char *start, int count );
|
|
|
|
//
|
|
// SURFACES
|
|
//
|
|
int (*Surf_NumSurfaces)( void );
|
|
csurface_t * (*Surf_Surfaces)( void );
|
|
|
|
void (*IncrementStatusCount)( int i );
|
|
debugline_t **DebugLines;
|
|
int *numDebugLines;
|
|
} game_import_t;
|
|
|
|
//
|
|
// functions exported by the game subsystem
|
|
//
|
|
typedef struct
|
|
{
|
|
int apiversion;
|
|
|
|
// the init function will only be called when a game starts,
|
|
// not each time a level is loaded. Persistant data for clients
|
|
// and the server can be allocated in init
|
|
void (*Init) (void);
|
|
void (*Shutdown) (void);
|
|
|
|
// each new level entered will cause a call to SpawnEntities
|
|
void (*SpawnEntities) (const char *mapname, const char *entstring, const char *spawnpoint);
|
|
|
|
// Read/Write Game is for storing persistant cross level information
|
|
// about the world state and the clients.
|
|
// WriteGame is called every time a level is exited.
|
|
// ReadGame is called on a loadgame.
|
|
void (*WriteGame) (const char *filename, qboolean autosave);
|
|
void (*ReadGame) (const char *filename);
|
|
|
|
// ReadLevel is called after the default map information has been
|
|
// loaded with SpawnEntities, so any stored client spawn spots will
|
|
// be used when the clients reconnect.
|
|
void (*WriteLevel) (const char *filename, qboolean autosave );
|
|
void (*ReadLevel) (const char *filename);
|
|
|
|
qboolean (*ClientConnect) (edict_t *ent, const char *userinfo );
|
|
void (*ClientBegin) (edict_t *ent, qboolean loadgame);
|
|
void (*ClientUserinfoChanged) (edict_t *ent, const char *userinfo);
|
|
void (*ClientDisconnect) (edict_t *ent);
|
|
void (*ClientCommand) (edict_t *ent);
|
|
void (*ClientThink) (edict_t *ent, usercmd_t *cmd);
|
|
|
|
void (*RunFrame) (void);
|
|
|
|
// ServerCommand will be called when an "sv <command>" command is issued on the
|
|
// server console.
|
|
// The game can issue gi.argc() / gi.argv() commands to get the rest
|
|
// of the parameters
|
|
void (*ServerCommand) (void);
|
|
|
|
void (*CreateSurfaces) (csurface_t *surfaces, int count);
|
|
|
|
//
|
|
// global variables shared between game and server
|
|
//
|
|
|
|
// The edict array is allocated in the game dll so it
|
|
// can vary in size from one game to another.
|
|
//
|
|
// The size will be fixed when ge->Init() is called
|
|
struct edict_s *edicts;
|
|
int edict_size;
|
|
int num_edicts; // current number, <= max_edicts
|
|
int max_edicts;
|
|
struct netconsole_s *consoles;
|
|
int console_size;
|
|
int num_consoles;
|
|
int max_consoles;
|
|
struct netconbuffer_s *conbuffers;
|
|
int conbuffer_size;
|
|
struct netsurface_s *surfaces;
|
|
int surface_size;
|
|
int max_surfaces;
|
|
int num_surfaces;
|
|
} game_export_t;
|
|
|
|
game_export_t *GetGameApi (game_import_t *import);
|
|
|
|
#ifdef __cplusplus
|
|
}
|
|
#endif
|
|
|
|
#endif
|