2004-08-23 00:15:46 +00:00
/*
Copyright ( C ) 1996 - 1997 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
2011-05-29 04:26:29 +00:00
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE .
2004-08-23 00:15:46 +00:00
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 .
*/
// world.h
typedef struct plane_s
{
vec3_t normal ;
float dist ;
} plane_t ;
typedef struct csurface_s
{
char name [ 16 ] ;
int flags ;
int value ;
} q2csurface_t ;
typedef struct cplane_s
{
vec3_t normal ;
float dist ;
qbyte type ; // for fast side tests
qbyte signbits ; // signx + (signy<<1) + (signz<<1)
qbyte pad [ 2 ] ;
} cplane_t ;
/*
typedef struct trace_s
{
qboolean allsolid ; // if true, plane is not valid
qboolean startsolid ; // if true, the initial point was in a solid area
qboolean inopen , inwater ;
float fraction ; // time completed, 1.0 = didn't hit anything
vec3_t endpos ; // final position
plane_t plane ; // surface normal at impact
edict_t * ent ; // entity the surface is on
} trace_t ;
*/
//these two structures must match (except for extra qw members)
typedef struct trace_s
{
//DON'T ADD ANYTHING BETWEEN THIS LINE
//q2 game dll code will memcpy the lot from trace_t to q2trace_t.
qboolean allsolid ; // if true, plane is not valid
qboolean startsolid ; // if true, the initial point was in a solid area
float fraction ; // time completed, 1.0 = didn't hit anything
vec3_t endpos ; // final position
cplane_t plane ; // surface normal at impact
2011-12-05 15:23:40 +00:00
q2csurface_t * surface ; // q2-compat surface hit
2004-08-23 00:15:46 +00:00
int contents ; // contents on other side of surface hit
2009-03-03 01:52:30 +00:00
void * ent ; // not set by CM_*() functions
2004-08-23 00:15:46 +00:00
//AND THIS LINE
int entnum ;
qboolean inopen , inwater ;
} trace_t ;
typedef struct q2trace_s
{
qboolean allsolid ; // if true, plane is not valid
qboolean startsolid ; // if true, the initial point was in a solid area
float fraction ; // time completed, 1.0 = didn't hit anything
vec3_t endpos ; // final position
cplane_t plane ; // surface normal at impact
q2csurface_t * surface ; // surface hit
int contents ; // contents on other side of surface hit
2009-11-04 21:16:50 +00:00
void * ent ; // not set by CM_*() functions
2004-08-23 00:15:46 +00:00
} q2trace_t ;
2011-12-23 03:12:29 +00:00
// edict->flags
# define FL_FLY (1<<0)
# define FL_SWIM (1<<1)
//#define FL_GLIMPSE (1<<2)
# define FL_CLIENT (1<<3)
# define FL_INWATER (1<<4)
# define FL_MONSTER (1<<5)
# define FL_GODMODE (1<<6)
# define FL_NOTARGET (1<<7)
# define FL_ITEM (1<<8)
# define FL_ONGROUND (1<<9)
# define FL_PARTIALGROUND (1<<10) // not all corners are valid
# define FL_WATERJUMP (1<<11) // player jumping out of water
// FL_JUMPRELEASED //12
//13
# define FL_FINDABLE_NONSOLID (1<<14) //a cpqwsv feature
# define FL_MOVECHAIN_ANGLE (1<<15) // hexen2 - when in a move chain, will update the angle
2012-01-17 07:57:46 +00:00
# define FLQW_LAGGEDMOVE (1<<16)
# define FLH2_HUNTFACE (1<<16)
# define FLH2_NOZ (1<<17)
2011-12-23 03:12:29 +00:00
//18
//19
2012-01-17 07:57:46 +00:00
# define FL_HUBSAVERESET (1<<20) //hexen2, ent is reverted to original state on map changes.
2011-12-23 03:12:29 +00:00
# define FL_CLASS_DEPENDENT (1<<21) //hexen2
2004-08-23 00:15:46 +00:00
# define MOVE_NORMAL 0
# define MOVE_NOMONSTERS 1
# define MOVE_MISSILE 2
# define MOVE_HITMODEL 4
2005-10-01 03:09:17 +00:00
# define MOVE_RESERVED 8 //so we are less likly to get into tricky situations when we want to steal annother future DP extension.
# define MOVE_TRIGGERS 16 //triggers must be marked with FINDABLE_NONSOLID (an alternative to solid-corpse)
2011-07-30 14:14:56 +00:00
# define MOVE_EVERYTHING 32 //can return triggers and non-solid items if they're marked with FINDABLE_NONSOLID (works even if the items are not properly linked)
2009-11-04 21:16:50 +00:00
# define MOVE_LAGGED 64 //trace touches current last-known-state, instead of actual ents (just affects players for now)
2011-09-03 03:49:43 +00:00
# define MOVE_ENTCHAIN 128 //chain of impacted ents, otherwise result shows only world
2004-08-23 00:15:46 +00:00
typedef struct areanode_s
{
int axis ; // -1 = leaf node
float dist ;
struct areanode_s * children [ 2 ] ;
2011-06-29 18:39:11 +00:00
link_t edicts ;
2004-08-23 00:15:46 +00:00
} areanode_t ;
# define AREA_DEPTH 4
# define AREA_NODES 32 //pow(2, AREA_DEPTH+1)
2009-11-17 00:15:44 +00:00
# define EDICT_FROM_AREA(l) STRUCT_FROM_LINK(l,wedict_t,area)
2009-11-04 21:16:50 +00:00
typedef struct wedict_s wedict_t ;
2011-09-03 03:49:43 +00:00
# define PROG_TO_WEDICT (wedict_t*)PROG_TO_EDICT
# define WEDICT_NUM (wedict_t *)EDICT_NUM
2011-12-23 03:12:29 +00:00
# define G_WEDICT (wedict_t *)G_EDICT
2004-08-23 00:15:46 +00:00
2009-11-04 21:16:50 +00:00
typedef struct
{
qboolean present ;
vec3_t laggedpos ;
} laggedentinfo_t ;
2010-07-11 02:22:39 +00:00
struct world_s
{
2009-11-07 13:29:15 +00:00
void ( * Event_Touch ) ( struct world_s * w , wedict_t * s , wedict_t * o ) ;
2011-09-03 03:49:43 +00:00
void ( * Event_Think ) ( struct world_s * w , wedict_t * s ) ;
void ( * Event_Sound ) ( wedict_t * entity , int channel , char * sample , int volume , float attenuation , int pitchadj ) ;
2011-10-27 16:16:29 +00:00
model_t * ( * Get_CModel ) ( struct world_s * w , int modelindex ) ;
void ( * Get_FrameState ) ( struct world_s * w , wedict_t * s , framestate_t * fstate ) ;
2009-11-07 13:29:15 +00:00
2009-11-04 21:16:50 +00:00
unsigned int max_edicts ; //limiting factor... 1024 fields*4*MAX_EDICTS == a heck of a lot.
unsigned int num_edicts ; // increases towards MAX_EDICTS
2011-05-29 04:26:29 +00:00
/*FTE_DEPRECATED*/ unsigned int edict_size ; //still used in copyentity
2010-07-11 02:22:39 +00:00
wedict_t * edicts ; // can NOT be array indexed.
2009-11-04 21:16:50 +00:00
struct progfuncs_s * progs ;
2011-12-23 03:12:29 +00:00
qboolean usesolidcorpse ; //to disable SOLID_CORPSE when running hexen2 due to conflict.
2009-11-04 21:16:50 +00:00
model_t * worldmodel ;
areanode_t areanodes [ AREA_NODES ] ;
int numareanodes ;
2011-12-23 03:12:29 +00:00
double physicstime ; // the last time global physics were run
2011-10-29 19:01:33 +00:00
unsigned int framenum ;
2009-11-04 21:16:50 +00:00
int lastcheck ; // used by PF_checkclient
double lastchecktime ; // for monster ai
2011-12-23 03:12:29 +00:00
/*antilag*/
2009-11-13 17:48:11 +00:00
float lagentsfrac ;
2009-11-04 21:16:50 +00:00
laggedentinfo_t * lagents ;
unsigned int maxlagents ;
2011-12-23 03:12:29 +00:00
/*qc globals*/
2011-09-03 03:49:43 +00:00
struct {
int * self ;
int * other ;
int * newmis ;
float * time ;
float * frametime ;
float * force_retouch ;
2011-10-27 16:16:29 +00:00
float * physics_mode ;
float * v_forward ;
float * v_right ;
float * v_up ;
2011-09-03 03:49:43 +00:00
} g ;
2009-11-04 21:16:50 +00:00
# ifdef USEODE
worldode_t ode ;
# endif
} ;
typedef struct world_s world_t ;
2004-08-23 00:15:46 +00:00
2009-11-05 01:22:27 +00:00
# ifdef USEODE
2011-09-03 03:49:43 +00:00
void World_ODE_RemoveFromEntity ( world_t * world , wedict_t * ed ) ;
void World_ODE_RemoveJointFromEntity ( world_t * world , wedict_t * ed ) ;
void World_ODE_Frame ( world_t * world , double frametime , double gravity ) ;
void World_ODE_Init ( void ) ;
void World_ODE_Start ( world_t * world ) ;
void World_ODE_End ( world_t * world ) ;
void World_ODE_Shutdown ( void ) ;
2009-11-05 01:22:27 +00:00
# endif
2009-11-04 21:16:50 +00:00
void World_ClearWorld ( world_t * w ) ;
2004-08-23 00:15:46 +00:00
// called after the world model has been loaded, before linking any entities
2009-11-04 21:16:50 +00:00
void World_UnlinkEdict ( wedict_t * ent ) ;
2004-08-23 00:15:46 +00:00
// call before removing an entity, and before trying to move one,
// so it doesn't clip against itself
// flags ent->v.modified
2009-11-04 21:16:50 +00:00
void World_LinkEdict ( world_t * w , wedict_t * ent , qboolean touch_triggers ) ;
2004-08-23 00:15:46 +00:00
// Needs to be called any time an entity changes origin, mins, maxs, or solid
// flags ent->v.modified
// sets ent->v.absmin and ent->v.absmax
// if touchtriggers, calls prog functions for the intersected triggers
2009-11-04 21:16:50 +00:00
void World_TouchLinks ( world_t * w , wedict_t * ent , areanode_t * node ) ;
int World_PointContents ( world_t * w , vec3_t p ) ;
2004-08-23 00:15:46 +00:00
// returns the CONTENTS_* value from the world at the given point.
// does not check any entities at all
2009-11-04 21:16:50 +00:00
wedict_t * World_TestEntityPosition ( world_t * w , wedict_t * ent ) ;
2004-08-23 00:15:46 +00:00
2009-11-04 21:16:50 +00:00
/*
World_Move :
mins and maxs are reletive
if the entire move stays in a solid volume , trace . allsolid will be set
2004-08-23 00:15:46 +00:00
2009-11-04 21:16:50 +00:00
if the starting point is in a solid , it will be allowed to move out
to an open area
2004-08-23 00:15:46 +00:00
2009-11-04 21:16:50 +00:00
nomonsters is used for line of sight or edge testing , where mosnters
shouldn ' t be considered solid objects
2004-08-23 00:15:46 +00:00
2009-11-04 21:16:50 +00:00
passedict is explicitly excluded from clipping checks ( normally NULL )
*/
trace_t World_Move ( world_t * w , vec3_t start , vec3_t mins , vec3_t maxs , vec3_t end , int type , wedict_t * passedict ) ;
2004-08-23 00:15:46 +00:00
2009-11-04 21:16:50 +00:00
# ifdef Q2SERVER
typedef struct q2edict_s q2edict_t ;
2004-08-23 00:15:46 +00:00
2009-11-04 21:16:50 +00:00
void VARGS WorldQ2_LinkEdict ( world_t * w , q2edict_t * ent ) ;
void VARGS WorldQ2_UnlinkEdict ( world_t * w , q2edict_t * ent ) ;
int VARGS WorldQ2_AreaEdicts ( world_t * w , vec3_t mins , vec3_t maxs , q2edict_t * * list ,
int maxcount , int areatype ) ;
2012-01-17 07:57:46 +00:00
trace_t WorldQ2_Move ( world_t * w , vec3_t start , vec3_t mins , vec3_t maxs , vec3_t end , int hitcontentsmask , q2edict_t * passedict ) ;
2004-11-29 01:21:00 +00:00
2009-11-04 21:16:50 +00:00
unsigned int Q2BSP_FatPVS ( model_t * mod , vec3_t org , qbyte * buffer , unsigned int buffersize , qboolean add ) ;
2010-07-11 02:22:39 +00:00
qboolean Q2BSP_EdictInFatPVS ( model_t * mod , struct pvscache_s * ent , qbyte * pvs ) ;
void Q2BSP_FindTouchedLeafs ( model_t * mod , struct pvscache_s * ent , float * mins , float * maxs ) ;
2009-11-04 21:16:50 +00:00
# endif
2009-11-17 00:15:44 +00:00
/*sv_move.c*/
qboolean World_CheckBottom ( world_t * world , wedict_t * ent ) ;
2010-11-21 03:39:12 +00:00
qboolean World_movestep ( world_t * world , wedict_t * ent , vec3_t move , qboolean relink , qboolean noenemy , void ( * set_move_trace ) ( trace_t * trace , struct globalvars_s * pr_globals ) , struct globalvars_s * set_trace_globs ) ;
2009-11-17 00:15:44 +00:00
qboolean World_MoveToGoal ( world_t * world , wedict_t * ent , float dist ) ;