From 0a6c730a97f389411e2e7fa711463b9d9f15712f Mon Sep 17 00:00:00 2001 From: g-cont Date: Mon, 4 Nov 2013 00:00:00 +0400 Subject: [PATCH] 04 Nov 2013 --- change.log | 32 ++++++++++++++++++++ common/com_model.h | 6 ++-- common/render_api.h | 62 +++++++++++++++++++++++++++++---------- dlls/apache.cpp | 2 +- engine/client/cl_game.c | 2 +- engine/client/cl_tent.c | 9 ++++-- engine/client/client.h | 1 - engine/client/gl_local.h | 20 +------------ engine/client/gl_rmain.c | 42 ++++++++++++++++++++++---- engine/client/gl_studio.c | 19 +++++++----- engine/common/build.c | 4 +-- engine/common/common.h | 1 + engine/common/host.c | 3 ++ engine/common/mod_local.h | 3 ++ engine/common/model.c | 37 ++++++++++++++++------- engine/server/sv_game.c | 5 ++-- 16 files changed, 177 insertions(+), 71 deletions(-) diff --git a/change.log b/change.log index dd8e7164..71caf7b1 100644 --- a/change.log +++ b/change.log @@ -1,3 +1,35 @@ +build 2463 + +Engine: reorganize data in texture_t. Release one variable for mod-makers +Engine: change decal_t structure get compatibility with GoldSrc +Engine: expanded mextrasurf_t reserved fields up 32 +Engine: update player_info_t (added customization_t like in SDK 2.3) +Engine: increase local_state_t->weapondata up 64 slots +Engine: update IVoiceTweak interface +Engine: new lightstyle system with local time and custom interpolation +Engine: fix bug with lightstyle save\restore (only first 64 symbols of pattern was saved) +Engine: update r_efx_api_t interface +Engine: update engine_studio_api_t, remove uncompatible function StudioGetTexture, added three new (thats came from CS:CZ) +Engine: added ref_overview to support custom overview implementation +Engine: render interface is outdated now. New render interface has version 30 (too much changed) +Engine: update triangleapi_t interface +Engine: update cl_dll interface (also added support for signle export that called 'F') +Engine: a lttle update for enginefuncs_t (server interface) +Client: fixed crash on shutdown when custom renderer uses AVI-files +Engine: applaying scale for decals on brushmodels or world geometry +Engine: update model_state_t thats keep info about studiomodels for studio decals. Include body and skin +Engine: get support for custom studiocache on static and tempents +Engine: write R_Srpite_WallPuff from pEfxAPI +Client: fix bug with beam sorting (solid beams was drawing in translucent pass) +Render: add special flag for decals thats indicated local space (any decal after first shoot) +Render: apply emboss filter on studiomodel textures +Render: rewrite client event system for studiomodels. Get more predictable results +Network: write existing decals and static entities into new demo +Network: protocol was changed to 48 +ImageLib: fix old bug with save non-aligned 8-bit bmp files +Server: fix bug with reloading hl.dll when map was changed every time +Server: a client part of save-file is outdated. New version is 0.68 + build 2402 Engine: added new feature flag for compensate stupid quake bug diff --git a/common/com_model.h b/common/com_model.h index 36312db8..bf8d1141 100644 --- a/common/com_model.h +++ b/common/com_model.h @@ -77,9 +77,9 @@ typedef struct texture_s int anim_min, anim_max; // time for this frame min <=time< max struct texture_s *anim_next; // in the animation sequence struct texture_s *alternate_anims; // bmodels in frame 1 use these - int fb_texturenum; // auto-luma texturenum - int dt_texturenum; // detail-texture binding - unsigned int unused[2]; // reserved + unsigned short fb_texturenum; // auto-luma texturenum + unsigned short dt_texturenum; // detail-texture binding + unsigned int unused[3]; // reserved } texture_t; typedef struct diff --git a/common/render_api.h b/common/render_api.h index 92734963..620e81e4 100644 --- a/common/render_api.h +++ b/common/render_api.h @@ -27,7 +27,7 @@ GNU General Public License for more details. // move misc functions at end of the interface // added new export for clearing studio decals -#define CL_RENDER_INTERFACE_VERSION 28 +#define CL_RENDER_INTERFACE_VERSION 30 #define MAX_STUDIO_DECALS 4096 // + unused space of BSP decals #define SURF_INFO( surf, mod ) ((mextrasurf_t *)mod->cache.data + (surf - mod->surfaces)) @@ -43,18 +43,19 @@ GNU General Public License for more details. #define PARM_TEX_LIGHTMAP 7 // second arg as number 0 - 128 #define PARM_SKY_SPHERE 8 // sky is quake sphere ? #define PARM_WORLD_VERSION 9 // return the version of bsp -#define PARM_WIDESCREEN 10 -#define PARM_FULLSCREEN 11 -#define PARM_SCREEN_WIDTH 12 -#define PARM_SCREEN_HEIGHT 13 -#define PARM_MAP_HAS_MIRRORS 14 // current map has mirorrs -#define PARM_CLIENT_INGAME 15 -#define PARM_MAX_ENTITIES 16 -#define PARM_TEX_TARGET 17 -#define PARM_TEX_TEXNUM 18 -#define PARM_TEX_FLAGS 19 -#define PARM_FEATURES 20 // same as movevars->features -#define PARM_ACTIVE_TMU 21 // for debug +#define PARM_WORLD_LOADING 10 // usefully in callback GL_LoadTexture to determine world or external bmodel +#define PARM_WIDESCREEN 11 +#define PARM_FULLSCREEN 12 +#define PARM_SCREEN_WIDTH 13 +#define PARM_SCREEN_HEIGHT 14 +#define PARM_MAP_HAS_MIRRORS 15 // current map has mirorrs +#define PARM_CLIENT_INGAME 16 +#define PARM_MAX_ENTITIES 17 +#define PARM_TEX_TARGET 18 +#define PARM_TEX_TEXNUM 19 +#define PARM_TEX_FLAGS 20 +#define PARM_FEATURES 21 // same as movevars->features +#define PARM_ACTIVE_TMU 22 // for debug enum { @@ -67,6 +68,25 @@ enum SKYBOX_DOWN, }; +typedef enum +{ + TEX_INVALID = 0, // free slot + TEX_SYSTEM, // generated by engine + TEX_NOMIP, // hud pics, menu etc + TEX_BRUSH, // a map texture + TEX_SPRITE, // sprite frames + TEX_STUDIO, // studio skins + TEX_LIGHTMAP, // lightmap textures + TEX_DECAL, // decals + TEX_VGUI, // vgui fonts or images + TEX_CUBEMAP, // cubemap textures (sky) + TEX_DETAIL, // detail textures + TEX_REMAP, // local copy of remap texture + TEX_SCREENCOPY, // keep screen copy e.g. for mirror + TEX_CUSTOM, // user created texture + TEX_DEPTHMAP // shadowmap texture +} texType_t; + typedef enum { TF_NEAREST = (1<<0), // disable texfilter @@ -97,6 +117,12 @@ typedef enum typedef struct beam_s BEAM; typedef struct particle_s particle_t; +typedef struct wadlist_s +{ + char wadnames[256][32]; + int count; +} wadlist_t; + // 12 bytes here typedef struct modelstate_s { @@ -146,8 +172,9 @@ typedef struct render_api_s // Texture tools int (*GL_FindTexture)( const char *name ); const char* (*GL_TextureName)( unsigned int texnum ); - int (*GL_LoadTexture)( const char *name, const byte *buf, size_t size, int flags ); + int (*GL_LoadTexture)( const char *name, const byte *buf, size_t size, int flags, void *filter ); int (*GL_CreateTexture)( const char *name, int width, int height, const void *buffer, int flags ); + void (*GL_SetTextureType)( unsigned int texnum, unsigned int type ); void (*GL_FreeTexture)( unsigned int texnum ); // Decals manipulating (draw & remove) @@ -183,9 +210,12 @@ typedef struct render_api_s int (*SPR_LoadExt)( const char *szPicName, unsigned int texFlags ); // extended version of SPR_Load struct mstudiotex_s *( *StudioGetTexture )( struct cl_entity_s *e ); const struct ref_overview_s *( *GetOverviewParms )( void ); + void (*R_InitQuakeSky)( struct mip_s *mt, struct texture_s *tx ); + void *(*R_FindTexFilter)( const char *texname ); // only for internal use by imagelib. No acess to private fields void (*S_FadeMusicVolume)( float fadePercent ); // fade background track (0-100 percents) void (*SetRandomSeed)( long lSeed ); // set custom seed for RANDOM_FLOAT\RANDOM_LONG for predictable random -// ONLY ADD NEW FUNCTIONS TO THE END OF THIS STRUCT. INTERFACE VERSION IS FROZEN AT 28 + wadlist_t *(*COM_GetWadsList)( void ); // returns a wadlist for the given map +// ONLY ADD NEW FUNCTIONS TO THE END OF THIS STRUCT. INTERFACE VERSION IS FROZEN AT 30 } render_api_t; // render callbacks @@ -208,6 +238,8 @@ typedef struct render_interface_s qboolean (*R_SpeedsMessage)( char *out, size_t size ); // replace with built-in R_DrawCubemapView for make skyshots or envshots qboolean (*R_DrawCubemapView)( const float *origin, const float *angles, int size ); + // custom texture loader for worldmodel and bsp-models (as a part of implementation Quake3 shader system) + qboolean (*GL_LoadTextures)( const void *in, model_t *out, int *sky1, int *sky2 ); } render_interface_t; #endif//RENDER_API_H \ No newline at end of file diff --git a/dlls/apache.cpp b/dlls/apache.cpp index a28d5655..2b8d4edd 100644 --- a/dlls/apache.cpp +++ b/dlls/apache.cpp @@ -35,7 +35,7 @@ class CApache : public CBaseMonster void Spawn( void ); void Precache( void ); - int Classify( void ) { return m_iClass ? m_iClass : CLASS_HUMAN_MILITARY; }; + int Classify( void ) { return CLASS_HUMAN_MILITARY; }; int BloodColor( void ) { return DONT_BLEED; } void Killed( entvars_t *pevAttacker, int iGib ); void GibMonster( void ); diff --git a/engine/client/cl_game.c b/engine/client/cl_game.c index 23d40454..905c297a 100644 --- a/engine/client/cl_game.c +++ b/engine/client/cl_game.c @@ -3214,7 +3214,7 @@ TriForParams */ void TriFogParams( float flDensity, int iFogSkybox ) { - // FIXME: implement + // TODO: implement } /* diff --git a/engine/client/cl_tent.c b/engine/client/cl_tent.c index 3a219453..bd8affd4 100644 --- a/engine/client/cl_tent.c +++ b/engine/client/cl_tent.c @@ -1782,8 +1782,13 @@ Create a wallpuff */ void CL_Sprite_WallPuff( TEMPENTITY *pTemp, float scale ) { - // UNDONE: g-cont. i'm dont know what this doing - Msg( "CL_Sprite_WallPuff: %g\n", scale ); + if( !pTemp ) return; + + pTemp->entity.curstate.renderamt = 255; + pTemp->entity.curstate.rendermode = kRenderTransAlpha; + pTemp->entity.angles[ROLL] = Com_RandomLong( 0, 359 ); + pTemp->entity.curstate.scale = scale; + pTemp->die = cl.time + 0.01f; } /* diff --git a/engine/client/client.h b/engine/client/client.h index 50b8d38b..d33549fa 100644 --- a/engine/client/client.h +++ b/engine/client/client.h @@ -614,7 +614,6 @@ _inline cl_entity_t *CL_EDICT_NUM( int n ) // // cl_parse.c // -extern const char *svc_strings[256]; void CL_ParseServerMessage( sizebuf_t *msg ); void CL_ParseTempEntity( sizebuf_t *msg ); qboolean CL_DispatchUserMessage( const char *pszName, int iSize, void *pbuf ); diff --git a/engine/client/gl_local.h b/engine/client/gl_local.h index 975992f6..d1123789 100644 --- a/engine/client/gl_local.h +++ b/engine/client/gl_local.h @@ -56,25 +56,6 @@ extern byte *r_temppool; #define TF_IMAGE (TF_UNCOMPRESSED|TF_NOPICMIP|TF_NOMIPMAP|TF_CLAMP) #define TF_DECAL (TF_CLAMP|TF_UNCOMPRESSED) -typedef enum -{ - TEX_INVALID = 0, // free slot - TEX_SYSTEM, // generated by engine - TEX_NOMIP, // hud pics, menu etc - TEX_BRUSH, // a map texture - TEX_SPRITE, // sprite frames - TEX_STUDIO, // studio skins - TEX_LIGHTMAP, // lightmap textures - TEX_DECAL, // decals - TEX_VGUI, // vgui fonts or images - TEX_CUBEMAP, // cubemap textures (sky) - TEX_DETAIL, // detail textures - TEX_REMAP, // local copy of remap texture - TEX_SCREENCOPY, // keep screen copy e.g. for mirror - TEX_CUSTOM, // user created texture - TEX_DEPTHMAP // shadowmap texture -} texType_t; - typedef struct gltexture_s { char name[128]; // game path, including extension @@ -361,6 +342,7 @@ void R_ClearScene( void ); void R_LoadIdentity( void ); void R_RenderScene( const ref_params_t *fd ); void R_DrawCubemapView( const vec3_t origin, const vec3_t angles, int size ); +qboolean GL_LoadTextures( const void *in, model_t *out ); void R_TranslateForEntity( cl_entity_t *e ); void R_RotateForEntity( cl_entity_t *e ); int R_ComputeFxBlend( cl_entity_t *e ); diff --git a/engine/client/gl_rmain.c b/engine/client/gl_rmain.c index 9fc11550..ccfd9771 100644 --- a/engine/client/gl_rmain.c +++ b/engine/client/gl_rmain.c @@ -1389,6 +1389,33 @@ void R_DrawCubemapView( const vec3_t origin, const vec3_t angles, int size ) r_oldviewleaf = r_viewleaf = NULL; // force markleafs next frame } +/* +=============== +GL_LoadTextures + +override standart function +for extended RenderAPI +=============== +*/ +qboolean GL_LoadTextures( const void *in, model_t *out ) +{ + qboolean result = false; + + if( clgame.drawFuncs.GL_LoadTextures != NULL ) + { + world.use_worldpool = true; + + result = clgame.drawFuncs.GL_LoadTextures( in, out, &tr.solidskyTexture, &tr.alphaskyTexture ); + + if( result && tr.solidskyTexture && tr.alphaskyTexture ) + world.sky_sphere = true; + + world.use_worldpool = false; + } + + return result; +} + static int GL_RenderGetParm( int parm, int arg ) { gltexture_t *glt; @@ -1418,7 +1445,11 @@ static int GL_RenderGetParm( int parm, int arg ) case PARM_SKY_SPHERE: return world.sky_sphere; case PARM_WORLD_VERSION: + if( cls.state != ca_active ) + return bmodel_version; return world.version; + case PARM_WORLD_LOADING: + return world.loading; case PARM_WIDESCREEN: return glState.wideScreen; case PARM_FULLSCREEN: @@ -1559,11 +1590,6 @@ static const char *GL_TextureName( unsigned int texnum ) return R_GetTexture( texnum )->name; } -static int GL_LoadTextureNoFilter( const char *name, const byte *buf, size_t size, int flags ) -{ - return GL_LoadTexture( name, buf, size, flags, NULL ); -} - static const ref_overview_t *GL_GetOverviewParms( void ) { return &clgame.overView; @@ -1585,8 +1611,9 @@ static render_api_t gRenderAPI = R_StoreEfrags, GL_FindTexture, GL_TextureName, - GL_LoadTextureNoFilter, + GL_LoadTexture, GL_CreateTexture, + GL_SetTextureType, GL_FreeTexture, DrawSingleDecal, R_DecalSetupVerts, @@ -1614,8 +1641,11 @@ static render_api_t gRenderAPI = pfnSPR_LoadExt, R_StudioGetTexture, GL_GetOverviewParms, + R_InitSky, + R_FindTexFilter, S_FadeMusicVolume, Com_SetRandomSeed, + Mod_WadList, }; /* diff --git a/engine/client/gl_studio.c b/engine/client/gl_studio.c index 02e4fc62..1b88eb33 100644 --- a/engine/client/gl_studio.c +++ b/engine/client/gl_studio.c @@ -3361,11 +3361,12 @@ load model texture with unique name */ static void R_StudioLoadTexture( model_t *mod, studiohdr_t *phdr, mstudiotexture_t *ptexture ) { - size_t size; - int flags = 0; - qboolean load_external = false; - char texname[128], name[128], mdlname[128]; - texture_t *tx = NULL; + size_t size; + int flags = 0; + qboolean load_external = false; + char texname[128], name[128], mdlname[128]; + imgfilter_t *filter = NULL; + texture_t *tx = NULL; if( ptexture->flags & STUDIO_NF_TRANSPARENT ) flags |= (TF_CLAMP|TF_NOMIPMAP); @@ -3422,6 +3423,10 @@ static void R_StudioLoadTexture( model_t *mod, studiohdr_t *phdr, mstudiotexture FS_FileBase( ptexture->name, name ); FS_StripExtension( mdlname ); + // loading texture filter for studiomodel + if( !( ptexture->flags & STUDIO_NF_COLORMAP )) + filter = R_FindTexFilter( va( "%s.mdl/%s", mdlname, name )); // grab texture filter + // NOTE: colormaps must have the palette for properly work. Ignore it. if( mod_allow_materials != NULL && mod_allow_materials->integer && !( ptexture->flags & STUDIO_NF_COLORMAP )) { @@ -3430,7 +3435,7 @@ static void R_StudioLoadTexture( model_t *mod, studiohdr_t *phdr, mstudiotexture Q_snprintf( texname, sizeof( texname ), "materials/%s/%s.tga", mdlname, name ); if( FS_FileExists( texname, false )) - gl_texturenum = GL_LoadTexture( texname, NULL, 0, flags, NULL ); + gl_texturenum = GL_LoadTexture( texname, NULL, 0, flags, filter ); if( gl_texturenum ) { @@ -3447,7 +3452,7 @@ static void R_StudioLoadTexture( model_t *mod, studiohdr_t *phdr, mstudiotexture // build the texname Q_snprintf( texname, sizeof( texname ), "#%s/%s.mdl", mdlname, name ); - ptexture->index = GL_LoadTexture( texname, (byte *)ptexture, size, flags, NULL ); + ptexture->index = GL_LoadTexture( texname, (byte *)ptexture, size, flags, filter ); } else MsgDev( D_NOTE, "loading HQ: %s\n", texname ); diff --git a/engine/common/build.c b/engine/common/build.c index e9be7615..29dbfa51 100644 --- a/engine/common/build.c +++ b/engine/common/build.c @@ -23,7 +23,7 @@ static char mond[12] = { 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 }; int Q_buildnum( void ) { // do not touch this! Only author of Xash3D can increase buildnumbers! -#if 1 +#if 0 int m = 0, d = 0, y = 0; static int b = 0; @@ -48,6 +48,6 @@ int Q_buildnum( void ) return b; #else - return 2411; + return 2463; #endif } \ No newline at end of file diff --git a/engine/common/common.h b/engine/common/common.h index b8314dce..83c3f6a1 100644 --- a/engine/common/common.h +++ b/engine/common/common.h @@ -850,6 +850,7 @@ typedef struct autocomplete_list_s } autocomplete_list_t; extern autocomplete_list_t cmd_list[]; +extern const char *svc_strings[256]; // soundlib shared exports qboolean S_Init( void ); diff --git a/engine/common/host.c b/engine/common/host.c index e2989fc4..7de471da 100644 --- a/engine/common/host.c +++ b/engine/common/host.c @@ -90,6 +90,9 @@ void Host_PrintEngineFeatures( void ) if( host.features & ENGINE_LARGE_LIGHTMAPS ) MsgDev( D_AICONSOLE, "^3EXT:^7 Large lightmaps enabled\n" ); + + if( host.features & ENGINE_COMPENSATE_QUAKE_BUG ) + MsgDev( D_AICONSOLE, "^3EXT:^7 Compensate quake bug enabled\n" ); } /* diff --git a/engine/common/mod_local.h b/engine/common/mod_local.h index 4d689cfd..eda1e48f 100644 --- a/engine/common/mod_local.h +++ b/engine/common/mod_local.h @@ -75,6 +75,7 @@ typedef struct qboolean has_mirrors; // one or more brush models contain reflective textures int lm_sample_size; // defaulting to 16 (BSP31 uses 8) int block_size; // lightmap blocksize + qboolean use_worldpool; // Mod_Calloc temporare change from com_studiocache to use loadmodel->mempool vec3_t mins; // real accuracy world bounds vec3_t maxs; @@ -85,6 +86,7 @@ extern world_static_t world; extern byte *com_studiocache; extern model_t *loadmodel; extern convar_t *mod_studiocache; +extern int bmodel_version; // only actual during loading // // model.c @@ -117,6 +119,7 @@ byte *Mod_CompressVis( const byte *in, size_t *size ); byte *Mod_DecompressVis( const byte *in ); modtype_t Mod_GetType( int handle ); model_t *Mod_Handle( int handle ); +struct wadlist_s *Mod_WadList( void ); // // mod_studio.c diff --git a/engine/common/model.c b/engine/common/model.c index c8449717..78e70169 100644 --- a/engine/common/model.c +++ b/engine/common/model.c @@ -36,8 +36,7 @@ int bmodel_version; // global stuff to detect bsp version char modelname[64]; // short model name (without path and ext) convar_t *mod_studiocache; convar_t *mod_allow_materials; -static char mod_wadnames[128][32]; // 128 wad names stored -static int mod_numwads; +static wadlist_t wadlist; model_t *loadmodel; model_t *worldmodel; @@ -533,6 +532,7 @@ void Mod_ClearAll( void ) Mod_FreeModel( &cm_models[i] ); Q_memset( cm_models, 0, sizeof( cm_models )); + world.use_worldpool = false; // reset by Host_Error cm_nummodels = 0; } @@ -643,6 +643,10 @@ static void Mod_LoadTextures( const dlump_t *l ) in = (void *)(mod_base + l->fileofs); + // texture loading is overrided? + if( GL_LoadTextures( in, loadmodel )) + return; + loadmodel->numtextures = in->nummiptex; loadmodel->textures = (texture_t **)Mem_Alloc( loadmodel->mempool, loadmodel->numtextures * sizeof( texture_t* )); @@ -784,9 +788,9 @@ load_wad_textures: qboolean fullpath_loaded = false; // check wads in reverse order - for( j = mod_numwads - 1; j >= 0; j-- ) + for( j = wadlist.count - 1; j >= 0; j-- ) { - char *texpath = va( "%s.wad/%s", mod_wadnames[j], texname ); + char *texpath = va( "%s.wad/%s", wadlist.wadnames[j], texname ); if( FS_FileExists( texpath, false )) { @@ -855,9 +859,9 @@ load_wad_textures: if( !load_external_luma ) { // check wads in reverse order - for( j = mod_numwads - 1; j >= 0; j-- ) + for( j = wadlist.count - 1; j >= 0; j-- ) { - char *texpath = va( "%s.wad/%s.mip", mod_wadnames[j], tx->name ); + char *texpath = va( "%s.wad/%s.mip", wadlist.wadnames[j], tx->name ); if( FS_FileExists( texpath, false )) { @@ -2166,7 +2170,7 @@ static void Mod_LoadEntities( const dlump_t *l ) world.entdatasize = l->filelen; pfile = (char *)loadmodel->entities; - mod_numwads = 0; + wadlist.count = 0; // parse all the wads for loading textures in right ordering while(( pfile = COM_ParseFile( pfile, token )) != NULL ) @@ -2201,9 +2205,9 @@ static void Mod_LoadEntities( const dlump_t *l ) char *end = Q_strchr( path, ';' ); if( !end ) break; Q_strncpy( wadpath, path, (end - path) + 1 ); - FS_FileBase( wadpath, mod_wadnames[mod_numwads++] ); + FS_FileBase( wadpath, wadlist.wadnames[wadlist.count++] ); path += (end - path) + 1; // move pointer - if( mod_numwads >= 128 ) break; // too many wads... + if( wadlist.count >= 256 ) break; // too many wads... } } else if( !Q_stricmp( keyname, "mapversion" )) @@ -3071,10 +3075,16 @@ Mod_Calloc */ void *Mod_Calloc( int number, size_t size ) { - cache_user_t *cu; + cache_user_t *cu; + byte *pool; + + // IEngineStudio->Mem_Calloc may be used for loading worldtextures + if( world.use_worldpool ) + pool = loadmodel->mempool; + else pool = com_studiocache; if( number <= 0 || size <= 0 ) return NULL; - cu = (cache_user_t *)Mem_Alloc( com_studiocache, sizeof( cache_user_t ) + number * size ); + cu = (cache_user_t *)Mem_Alloc( pool, sizeof( cache_user_t ) + number * size ); cu->data = (void *)cu; // make sure what cu->data is not NULL return cu; @@ -3172,4 +3182,9 @@ model_t *Mod_Handle( int handle ) return NULL; } return com_models[handle]; +} + +wadlist_t *Mod_WadList( void ) +{ + return &wadlist; } \ No newline at end of file diff --git a/engine/server/sv_game.c b/engine/server/sv_game.c index 7109971c..7c3ffb72 100644 --- a/engine/server/sv_game.c +++ b/engine/server/sv_game.c @@ -2457,12 +2457,10 @@ void pfnMessageBegin( int msg_dest, int msg_num, const float *pOrigin, edict_t * { svgame.msg_name = NULL; svgame.msg_index = -msg_num; // this is a system message + svgame.msg_name = svc_strings[msg_num]; if( msg_num == svc_temp_entity ) - { - svgame.msg_name = "TempEntity"; iSize = -1; // temp entity have variable size - } else iSize = 0; } else @@ -2516,6 +2514,7 @@ void pfnMessageEnd( void ) float *org = NULL; if( svgame.msg_name ) name = svgame.msg_name; + if( !svgame.msg_started ) Host_Error( "MessageEnd: called with no active message\n" ); svgame.msg_started = false;