summaryrefslogtreecommitdiff
path: root/source/g_public.h
diff options
context:
space:
mode:
authorAndrey Nazarov <skuller@skuller.net>2007-08-14 20:18:08 +0000
committerAndrey Nazarov <skuller@skuller.net>2007-08-14 20:18:08 +0000
commitf294db4ccf45f6274e65260dd6f9a2c5faa94313 (patch)
treee8cf1ba2bfe9c8417eec17faf912442f52fc4ef2 /source/g_public.h
Initial import of the new Q2PRO tree.
Diffstat (limited to 'source/g_public.h')
-rw-r--r--source/g_public.h243
1 files changed, 243 insertions, 0 deletions
diff --git a/source/g_public.h b/source/g_public.h
new file mode 100644
index 0000000..e8b3b8b
--- /dev/null
+++ b/source/g_public.h
@@ -0,0 +1,243 @@
+/*
+Copyright (C) 1997-2001 Id Software, Inc.
+
+This program is free software; you can redistribute it and/or
+modify it under the terms of the GNU General Public License
+as published by the Free Software Foundation; either version 2
+of the License, or (at your option) any later version.
+
+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, write to the Free Software
+Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+
+*/
+
+// game.h -- game dll information visible to server
+
+#define GAME_API_VERSION 3
+
+// edict->svflags
+
+#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
+
+// 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;
+
+
+#ifndef GAME_INCLUDE
+
+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
+ int clientNum;
+};
+
+
+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;
+ 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
+
+//===============================================================
+
+//
+// functions provided by the main engine
+//
+typedef struct
+{
+ // special messages
+ void (*bprintf) (int printlevel, const char *fmt, ...);
+ void (*dprintf) (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);
+ void (*positioned_sound) (vec3_t origin, edict_t *ent, int channel, int soundinedex, float volume, float attenuation, float timeofs);
+
+ // 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 (* q_noreturn error) (const char *fmt, ...);
+
+ // the *index functions create configstrings and some internal server state
+ int (*modelindex) (const char *name);
+ int (*soundindex) (const char *name);
+ int (*imageindex) (const char *name);
+
+ void (*setmodel) (edict_t *ent, const char *name);
+
+ // collision detection
+ trace_t (*trace) (vec3_t start, vec3_t mins, vec3_t maxs, vec3_t end, 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) (const vec3_t pos); // some fractional bits
+ void (*WriteDir) (const vec3_t pos); // single byte encoded, very coarse
+ void (*WriteAngle) (float f);
+
+ // managed memory allocation
+ void *(*TagMalloc) (int size, memtag_t tag);
+ void (*TagFree) (void *block);
+ void (*FreeTags) (memtag_t 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 ServerCommand parameter access
+ int (*argc) (void);
+ char *(*argv) (int n);
+ char *(*args) (void); // concatenation of all argv >= 1
+
+ // 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);
+} 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) (char *mapname, char *entstring, 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) (char *filename, qboolean autosave);
+ void (*ReadGame) (char *filename);
+
+ // ReadLevel is called after the default map information has been
+ // loaded with SpawnEntities
+ void (*WriteLevel) (char *filename);
+ void (*ReadLevel) (char *filename);
+
+ qboolean (*ClientConnect) (edict_t *ent, char *userinfo);
+ void (*ClientBegin) (edict_t *ent);
+ void (*ClientUserinfoChanged) (edict_t *ent, 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);
+
+ //
+ // 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;
+} game_export_t;
+
+#define CLIENT_EXT_NUMBER 1
+
+// extended API
+typedef struct gameAPI_s {
+ int client_ext;
+} gameAPI_t;
+