diff --git a/debug.bat b/debug.bat index 67134f72..4349fe9f 100644 --- a/debug.bat +++ b/debug.bat @@ -67,5 +67,5 @@ if exist vsound\vsound.plg del /f /q vsound\vsound.plg echo Build succeeded! echo Please wait. Xash is now loading cd D:\Xash3D\ -quake.exe -game tmpQuArK -log -debug -dev 5 +map qctest +quake.exe -game tmpQuArK -log -debug -dev 3 +map qctest :done \ No newline at end of file diff --git a/engine/client/cl_input.c b/engine/client/cl_input.c index f07808a5..f906e7d3 100644 --- a/engine/client/cl_input.c +++ b/engine/client/cl_input.c @@ -354,15 +354,15 @@ CL_CmdButtons */ void CL_CmdButtons( usercmd_t *cmd ) { - if ( in_attack.state & 3 ) + if( in_attack.state & 3 ) cmd->buttons |= IN_ATTACK; in_attack.state &= ~2; - if ( in_attack2.state & 3 ) + if( in_attack2.state & 3 ) cmd->buttons |= IN_ATTACK2; in_attack2.state &= ~2; - if (in_use.state & 3) + if( in_use.state & 3 ) cmd->buttons |= IN_USE; in_use.state &= ~2; diff --git a/engine/client/cl_parse.c b/engine/client/cl_parse.c index e64cea6c..672becaf 100644 --- a/engine/client/cl_parse.c +++ b/engine/client/cl_parse.c @@ -287,6 +287,7 @@ void CL_ParseConfigString( sizebuf_t *msg ) else if( i >= CS_USER_MESSAGES && i < CS_USER_MESSAGES+MAX_USER_MESSAGES ) { // FIXME: register user message here + // Msg("PrepUserMessage: %s[svc_%i]\n", cl.configstrings[i], i - CS_USER_MESSAGES ); } else if( i >= CS_CLASSNAMES && i < CS_CLASSNAMES+MAX_CLASSNAMES ) { diff --git a/engine/host.c b/engine/host.c index 5bf258e9..458fcd4d 100644 --- a/engine/host.c +++ b/engine/host.c @@ -630,7 +630,7 @@ void Host_Init( int argc, char **argv) Cmd_AddCommand ("crash", Host_Crash_f, "a way to force a bus error for development reasons"); } - host_cheats = Cvar_Get( "host_cheats", "1", CVAR_SYSTEMINFO, "allow cheat variables to enable" ); + host_cheats = Cvar_Get( "sv_cheats", "1", CVAR_SYSTEMINFO, "allow cheat variables to enable" ); host_maxfps = Cvar_Get( "host_maxfps", "100", CVAR_ARCHIVE, "host fps upper limit" ); host_frametime = Cvar_Get("host_frametime", "0.1", CVAR_SERVERINFO, "host frametime (only for test!)" ); host_maxclients = Cvar_Get("host_maxclients", "1", CVAR_SERVERINFO|CVAR_LATCH, "server maxplayers limit" ); diff --git a/engine/server/server.h b/engine/server/server.h index b1f0092d..eec5799b 100644 --- a/engine/server/server.h +++ b/engine/server/server.h @@ -26,7 +26,7 @@ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. #include "svgame_api.h" //============================================================================= -#define NUM_FOR_EDICT(e) ((int)((edict_t *)(e) - svg.edicts)) +#define NUM_FOR_EDICT(e) ((int)((edict_t *)(e) - game.edicts)) #define EDICT_NUM( num ) _EDICT_NUM( num, __FILE__, __LINE__ ) #define AREA_SOLID 1 @@ -200,7 +200,12 @@ typedef struct int msg_sizes[MAX_USER_MESSAGES]; // user messages bounds checker int msg_leftsize; // left in bytes int msg_index; // for debug messages - edict_t *edicts; + + union + { + edict_t *edicts; // acess by edict number + void *vp; // acess by offset in bytes + }; // library exports table word *ordinals; @@ -208,6 +213,8 @@ typedef struct char *names[MAX_SYSPATH]; // max 1024 exports supported int num_ordinals; // actual exports count dword funcBase; // base offset + + int hStringTable; // stringtable handle } game_static_t; typedef struct @@ -247,7 +254,7 @@ typedef struct extern netadr_t master_adr[MAX_MASTERS]; // address of the master server extern const char *ed_name[]; extern server_static_t svs; // persistant server info -extern game_static_t svg; // persistant game info +extern game_static_t game; // persistant game info extern server_t sv; // local server extern cvar_t *sv_paused; @@ -365,7 +372,7 @@ void SV_Error (char *error, ...); // bool SV_LoadProgs( const char *name ); void SV_UnloadProgs( void ); -void SV_InitEdict (edict_t *e); +void SV_InitEdict( edict_t *pEdict ); void SV_ConfigString (int index, const char *val); void SV_SetModel (edict_t *ent, const char *name); void SV_CreatePhysBody( edict_t *ent ); @@ -375,18 +382,20 @@ void SV_CopyTraceToGlobal( trace_t *trace ); void SV_CopyTraceResult( TraceResult *out, trace_t trace ); float SV_AngleMod( float ideal, float current, float speed ); void SV_SpawnEntities( const char *mapname, script_t *entities ); +string_t pfnAllocString( const char *szValue ); +const char *pfnGetString( string_t iString ); _inline edict_t *_EDICT_NUM( int n, const char * file, const int line ) { if((n >= 0) && (n < svs.globals->maxEntities)) - return svg.edicts + n; + return game.edicts + n; Host_Error( "EDICT_NUM: bad number %i (called at %s:%i)\n", n, file, line ); return NULL; } // for constant strings -#define STRING( offset ) (const char *)( svs.globals->pStringBase + (int)offset ) -#define MAKE_STRING(str) ((int)str - (int)STRING( 0 )) +#define STRING( offset ) pfnGetString( offset ) +#define MAKE_STRING(str) pfnAllocString( str ) // // sv_studio.c @@ -401,7 +410,6 @@ bool SV_CreateMeshBuffer( edict_t *in, cmodel_t *out ); // void SV_StartParticle( const float *org, const float *dir, int color, int count ); edict_t *SV_AllocEdict( void ); -void SV_InitEdict( edict_t *pEdict ); void SV_FreeEdict( edict_t *pEdict ); bool SV_ClientConnect (edict_t *ent, char *userinfo); void SV_TouchTriggers (edict_t *ent); diff --git a/engine/server/sv_client.c b/engine/server/sv_client.c index 0fab710f..a44651ee 100644 --- a/engine/server/sv_client.c +++ b/engine/server/sv_client.c @@ -481,7 +481,6 @@ void SV_PutClientInServer( edict_t *ent ) edict_t *viewmodel; int i; - Com_Assert( 1 ); index = NUM_FOR_EDICT( ent ) - 1; client = ent->pvEngineData->client; @@ -504,10 +503,7 @@ void SV_PutClientInServer( edict_t *ent ) VectorCopy( ent->v.angles, viewmodel->v.angles ); viewmodel->v.model = ent->v.viewmodel; viewmodel->v.movetype = MOVETYPE_FOLLOW; - - // make cross links for consistency viewmodel->v.aiment = ent; - ent->v.aiment = viewmodel; } else { diff --git a/engine/server/sv_edict.h b/engine/server/sv_edict.h deleted file mode 100644 index e4e1ce0f..00000000 --- a/engine/server/sv_edict.h +++ /dev/null @@ -1,158 +0,0 @@ -//======================================================================= -// Copyright XashXT Group 2008 © -// sv_edict.h - server prvm edict -//======================================================================= -#ifndef SV_EDICT_H -#define SV_EDICT_H - -struct sv_globalvars_s -{ - int pad[34]; - int pev; - int other; - int world; - float time; - float frametime; - float serverflags; - string_t mapname; - string_t startspot; - vec3_t spotoffset; - float deathmatch; - float teamplay; - float coop; - float total_secrets; - float found_secrets; - float total_monsters; - float killed_monsters; - vec3_t v_forward; - vec3_t v_right; - vec3_t v_up; - float trace_allsolid; - float trace_startsolid; - float trace_fraction; - float trace_plane_dist; - vec3_t trace_endpos; - vec3_t trace_plane_normal; - float trace_contents; - float trace_hitgroup; - float trace_flags; - int trace_ent; - func_t StartFrame; - func_t EndFrame; - func_t PlayerPreThink; - func_t PlayerPostThink; - func_t ClientConnect; - func_t ClientCommand; - func_t ClientDisconnect; - func_t PutClientInServer; - func_t KeyValue; - func_t ClientUserInfoChanged; - func_t EmitSound; -}; - -struct sv_entvars_s -{ - string_t classname; - string_t globalname; - int chain; - func_t precache; - func_t activate; - func_t blocked; - func_t touch; - func_t think; - func_t use; - vec3_t origin; - vec3_t angles; - float modelindex; - vec3_t old_origin; - vec3_t old_angles; - vec3_t velocity; - vec3_t avelocity; - vec3_t m_pcentre[3]; - vec3_t m_pmatrix[3]; - vec3_t movedir; - vec3_t force; - vec3_t torque; - vec3_t post_origin; - vec3_t post_angles; - vec3_t origin_offset; - vec3_t absmin; - vec3_t absmax; - vec3_t mins; - vec3_t maxs; - vec3_t size; - float mass; - float solid; - float scale; - float contents; - float movetype; - float waterlevel; - float watertype; - float ltime; - string_t model; - float skin; - float body; - float frame; - float speed; - float sequence; - float animtime; - float framerate; - float effects; - float renderfx; - float rendermode; - float renderamt; - vec3_t rendercolor; - float gaitsequence; - float colormap; - float style; - float flags; - float aiflags; - float spawnflags; - float controller[16]; - float blending[16]; - vec3_t v_angle; - vec3_t view_ofs; - float fixangle; - vec3_t punchangle; - float button0; - float button1; - float button2; - float impulse; - float weapon; - float items; - float currentammo; - float v_sequence; - float v_frame; - string_t v_model; - float v_body; - float v_skin; - float p_sequence; - float p_frame; - string_t p_model; - float p_body; - float p_skin; - string_t loopsound; - float loopsndvol; - float loopsndattn; - int owner; - int enemy; - int aiment; - int goalentity; - float teleport_time; - float ideal_yaw; - float yaw_speed; - float m_flGroundSpeed; - float m_flFrameRate; - float m_flWeaponFrameRate; - int groundentity; - float takedamage; - float nextthink; - float gravity; - float health; - float frags; - float team; -}; - -#define PROG_CRC_SERVER 8505 - -#endif//SV_EDICT_H \ No newline at end of file diff --git a/engine/server/sv_frame.c b/engine/server/sv_frame.c index 7b34061b..9abf2b07 100644 --- a/engine/server/sv_frame.c +++ b/engine/server/sv_frame.c @@ -67,7 +67,6 @@ void SV_UpdateEntityState( edict_t *ent ) ent->pvEngineData->s.renderamt = ent->v.renderamt; // alpha value ent->pvEngineData->s.model.framerate = ent->v.framerate; ent->pvEngineData->s.model.animtime = (int)(1000.0 * ent->v.animtime) * 0.001; // sequence time - ent->pvEngineData->s.aiment = NUM_FOR_EDICT( ent->v.aiment ); // viewmodel parent ent->pvEngineData->s.model.scale = ent->v.scale; // shared client and render flags VectorCopy( ent->v.rendercolor, ent->pvEngineData->s.rendercolor ); @@ -92,11 +91,14 @@ void SV_UpdateEntityState( edict_t *ent ) if( ent->pvEngineData->s.ed_type == ED_VIEWMODEL ) { + if( !ent->v.aiment ) return; // no aiment + // copy v_model state from client to viemodel entity client = ent->v.aiment; // update both arrays, because viewmodel are hidden for qc-coders ent->v.modelindex = SV_ModelIndex( STRING( client->v.viewmodel )); + ent->pvEngineData->s.aiment = NUM_FOR_EDICT( client ); // viewmodel parent ent->pvEngineData->s.model.index = ent->v.modelindex; ent->pvEngineData->s.model.frame = ent->v.frame = client->v.weaponframe; ent->pvEngineData->s.model.body = ent->v.body = client->v.weaponbody; @@ -264,6 +266,7 @@ static void SV_AddEntitiesToPacket( vec3_t origin, client_frame_t *frame, sv_ent for( e = 1; e < svs.globals->numEntities; e++ ) { ent = EDICT_NUM( e ); + if( ent->free ) continue; force = false; // clear forceflag // completely ignore dormant entity diff --git a/engine/server/sv_game.c b/engine/server/sv_game.c index 1c4ddccd..db425f7a 100644 --- a/engine/server/sv_game.c +++ b/engine/server/sv_game.c @@ -27,18 +27,18 @@ void Sys_FreeNameFuncGlobals( void ) { int i; - if( svg.ordinals ) Mem_Free( svg.ordinals ); - if( svg.funcs) Mem_Free( svg.funcs); + if( game.ordinals ) Mem_Free( game.ordinals ); + if( game.funcs) Mem_Free( game.funcs); - for( i = 0; i < svg.num_ordinals; i++ ) + for( i = 0; i < game.num_ordinals; i++ ) { - if( svg.names[i] ) - Mem_Free( svg.names[i] ); + if( game.names[i] ) + Mem_Free( game.names[i] ); } - svg.num_ordinals = 0; - svg.ordinals = NULL; - svg.funcs = NULL; + game.num_ordinals = 0; + game.ordinals = NULL; + game.funcs = NULL; } char *Sys_GetMSVCName( const char *in_name ) @@ -51,13 +51,13 @@ char *Sys_GetMSVCName( const char *in_name ) { int len = pos - in_name; - out_name = copystring( in_name + 1 ); // strip off the leading '?' - out_name[len-1] = 0; // terminate string at the "@@" + // strip off the leading '?' + out_name = com.stralloc( svs.private, in_name + 1, __FILE__, __LINE__ ); + out_name[len-1] = 0; // terminate string at the "@@" return out_name; } } - - return copystring( in_name ); + return com.stralloc( svs.private, in_name, __FILE__, __LINE__ ); } bool Sys_LoadSymbols( const char *filename ) @@ -79,8 +79,8 @@ bool Sys_LoadSymbols( const char *filename ) dword *p_Names = NULL; int i, index; - for( i = 0; i < svg.num_ordinals; i++ ) - svg.names[i] = NULL; + for( i = 0; i < game.num_ordinals; i++ ) + game.names[i] = NULL; f = FS_Open( filename, "rb" ); if( !f ) @@ -189,9 +189,9 @@ bool Sys_LoadSymbols( const char *filename ) return false; } - svg.num_ordinals = export_directory.NumberOfNames; // also number of ordinals + game.num_ordinals = export_directory.NumberOfNames; // also number of ordinals - if( svg.num_ordinals > MAX_SYSPATH ) + if( game.num_ordinals > MAX_SYSPATH ) { MsgDev( D_ERROR, "Sys_LoadSymbols: %s too many exports\n", filename ); FS_Close( f ); @@ -207,9 +207,9 @@ bool Sys_LoadSymbols( const char *filename ) return false; } - svg.ordinals = Z_Malloc( svg.num_ordinals * sizeof( word )); + game.ordinals = Z_Malloc( game.num_ordinals * sizeof( word )); - if( FS_Read( f, svg.ordinals, svg.num_ordinals * sizeof( word )) != (svg.num_ordinals * sizeof( word ))) + if( FS_Read( f, game.ordinals, game.num_ordinals * sizeof( word )) != (game.num_ordinals * sizeof( word ))) { Sys_FreeNameFuncGlobals(); MsgDev( D_ERROR, "Sys_LoadSymbols: %s error during reading ordinals table\n", filename ); @@ -225,9 +225,9 @@ bool Sys_LoadSymbols( const char *filename ) return false; } - svg.funcs = Z_Malloc( svg.num_ordinals * sizeof( dword )); + game.funcs = Z_Malloc( game.num_ordinals * sizeof( dword )); - if( FS_Read( f, svg.funcs, svg.num_ordinals * sizeof( dword )) != (svg.num_ordinals * sizeof( dword ))) + if( FS_Read( f, game.funcs, game.num_ordinals * sizeof( dword )) != (game.num_ordinals * sizeof( dword ))) { Sys_FreeNameFuncGlobals(); MsgDev( D_ERROR, "Sys_LoadSymbols: %s error during reading export address section\n", filename ); @@ -245,9 +245,9 @@ bool Sys_LoadSymbols( const char *filename ) return false; } - p_Names = Z_Malloc( svg.num_ordinals * sizeof( dword )); + p_Names = Z_Malloc( game.num_ordinals * sizeof( dword )); - if( FS_Read( f, p_Names, svg.num_ordinals * sizeof( dword )) != (svg.num_ordinals * sizeof( dword ))) + if( FS_Read( f, p_Names, game.num_ordinals * sizeof( dword )) != (game.num_ordinals * sizeof( dword ))) { Sys_FreeNameFuncGlobals(); if( p_Names ) Mem_Free( p_Names ); @@ -256,7 +256,7 @@ bool Sys_LoadSymbols( const char *filename ) return false; } - for( i = 0; i < svg.num_ordinals; i++ ) + for( i = 0; i < game.num_ordinals; i++ ) { name_offset = p_Names[i] - edata_delta; @@ -265,13 +265,13 @@ bool Sys_LoadSymbols( const char *filename ) if( FS_Seek( f, name_offset, SEEK_SET ) != -1 ) { Sys_FsGetString( f, function_name ); - svg.names[i] = Sys_GetMSVCName( function_name ); + game.names[i] = Sys_GetMSVCName( function_name ); } else break; } } - if( i != svg.num_ordinals ) + if( i != game.num_ordinals ) { Sys_FreeNameFuncGlobals(); if( p_Names ) Mem_Free( p_Names ); @@ -281,15 +281,15 @@ bool Sys_LoadSymbols( const char *filename ) } FS_Close( f ); - for( i = 0; i < svg.num_ordinals; i++ ) + for( i = 0; i < game.num_ordinals; i++ ) { - if( com.strcmp( "GiveFnptrsToDll", svg.names[i] )) + if( !com.strcmp( "GiveFnptrsToDll", game.names[i] )) { void *fn_offset; - index = svg.ordinals[i]; + index = game.ordinals[i]; fn_offset = (void *)Sys_GetProcAddress( svs.game, "GiveFnptrsToDll" ); - svg.funcBase = (dword)(fn_offset) - svg.funcs[index]; + game.funcBase = (dword)(fn_offset) - game.funcs[index]; break; } } @@ -622,6 +622,7 @@ bool SV_EntitiesIn( bool mode, vec3_t v1, vec3_t v2 ) void SV_InitEdict( edict_t *pEdict ) { Com_Assert( pEdict == NULL ); + Com_Assert( pEdict->pvServerData != NULL ); pEdict->v.pContainingEntity = pEdict; // make cross-links for consistency pEdict->pvEngineData = (ed_priv_t *)Mem_Alloc( svs.mempool, sizeof( ed_priv_t )); @@ -632,6 +633,9 @@ void SV_InitEdict( edict_t *pEdict ) void SV_FreeEdict( edict_t *pEdict ) { + Com_Assert( pEdict == NULL ); + Com_Assert( pEdict->free ); + // unlink from world SV_UnlinkEdict( pEdict ); pe->RemoveBody( pEdict->pvEngineData->physbody ); @@ -1019,7 +1023,7 @@ pfnSetModel */ void pfnSetModel( edict_t *e, const char *m ) { - if( e == svg.edicts ) + if( e == game.edicts ) { MsgDev( D_WARN, "SV_SetModel: can't modify world entity\n" ); return; @@ -1088,7 +1092,7 @@ void pfnSetSize( edict_t *e, const float *rgflMin, const float *rgflMax ) MsgDev( D_ERROR, "SV_SetSize: entity not exist\n" ); return; } - else if( e == svg.edicts ) + else if( e == game.edicts ) { MsgDev( D_ERROR, "SV_SetSize: can't modify world entity\n" ); return; @@ -1211,7 +1215,7 @@ void pfnChangeYaw( edict_t* ent ) { float current; - if( ent == svg.edicts ) + if( ent == game.edicts ) { MsgDev( D_WARN, "SV_ChangeYaw: can't modify world entity\n" ); return; @@ -1236,7 +1240,7 @@ void pfnChangePitch( edict_t* ent ) { float current; - if( ent == svg.edicts ) + if( ent == game.edicts ) { MsgDev( D_WARN, "SV_ChangePitch: can't modify world entity\n" ); return; @@ -1263,7 +1267,9 @@ edict_t* pfnFindEntityByString( edict_t *pStartEdict, const char *pszField, cons const char *t; edict_t *ed; - e = NUM_FOR_EDICT( pStartEdict ); + if( !pStartEdict ) + e = NUM_FOR_EDICT( game.edicts ); + else e = NUM_FOR_EDICT( pStartEdict ); if( !pszValue ) pszValue = ""; if( !com.strcmp( pszField, "classname" )) @@ -1289,7 +1295,7 @@ edict_t* pfnFindEntityByString( edict_t *pStartEdict, const char *pszField, cons if( !com.strcmp( t, pszValue )) return ed; } - return svg.edicts; + return game.edicts; } /* @@ -1300,7 +1306,7 @@ pfnGetEntityIllum */ int pfnGetEntityIllum( edict_t* pEnt ) { - if( pEnt == svg.edicts ) + if( pEnt == game.edicts ) { MsgDev( D_WARN, "SV_GetEntityIllum: can't get light level at world entity\n" ); return 0; @@ -1325,11 +1331,12 @@ edict_t* pfnFindEntityInSphere( edict_t *pStartEdict, const float *org, float ra edict_t *ent, *chain; float radSquare; vec3_t eorg; - int e; + int e = 0; radSquare = rad * rad; chain = pStartEdict; - e = NUM_FOR_EDICT( pStartEdict ); + if( pStartEdict ) + e = NUM_FOR_EDICT( pStartEdict ); for( e++; e < svs.globals->numEntities; e++ ) { @@ -1367,7 +1374,7 @@ edict_t* pfnFindClientInPVS( edict_t *pEdict ) for( i = 1; i < numents; i++ ) { - pClient = svg.edicts + i; + pClient = game.edicts + i; if( pClient->free ) continue; if( SV_EntitiesIn( DVIS_PVS, pEdict->v.origin, pClient->v.origin )) { @@ -1396,7 +1403,7 @@ edict_t* pfnFindClientInPHS( edict_t *pEdict ) for( i = 1; i < numents; i++ ) { - pClient = svg.edicts + i; + pClient = game.edicts + i; if( pClient->free ) continue; if( SV_EntitiesIn( DVIS_PHS, pClient->v.origin, pEdict->v.origin )) { @@ -1424,7 +1431,7 @@ edict_t* pfnEntitiesInPVS( edict_t *pplayer ) for( i = svs.globals->maxClients; i < numents; i++ ) { - pEdict = svg.edicts + i; + pEdict = game.edicts + i; if( pEdict->free ) continue; if( SV_EntitiesIn( DVIS_PVS, pEdict->v.origin, pplayer->v.origin )) { @@ -1452,7 +1459,7 @@ edict_t* pfnEntitiesInPHS( edict_t *pplayer ) for( i = svs.globals->maxClients; i < numents; i++ ) { - pEdict = svg.edicts + i; + pEdict = game.edicts + i; if( pEdict->free ) continue; if( SV_EntitiesIn( DVIS_PHS, pEdict->v.origin, pplayer->v.origin )) { @@ -1511,7 +1518,7 @@ void pfnRemoveEntity( edict_t* e ) // never free client or world entity if( NUM_FOR_EDICT( e ) < svs.globals->maxClients ) { - MsgDev( D_ERROR, "SV_RemoveEntity: can't delete %s\n", (e == svg.edicts) ? "world" : "client" ); + MsgDev( D_ERROR, "SV_RemoveEntity: can't delete %s\n", (e == game.edicts) ? "world" : "client" ); return; } SV_FreeEdict( e ); @@ -1534,7 +1541,6 @@ edict_t* pfnCreateNamedEntity( string_t className ) pszClassName = STRING( className ); // also register classname to send for client - Com_Assert( pszClassName == NULL || !pszClassName[0] ); ed->pvEngineData->s.classname = SV_ClassIndex( pszClassName ); return ed; @@ -1576,7 +1582,7 @@ int pfnDropToFloor( edict_t* e ) trace_t trace; // ignore world silently - if( e == svg.edicts ) return false; + if( e == game.edicts ) return false; if( e->free ) { MsgDev( D_ERROR, "SV_DropToFloor: can't modify free entity\n" ); @@ -1654,7 +1660,7 @@ int pfnWalkMove( edict_t *ent, float yaw, float dist, int iMode ) vec3_t move; // ignore world silently - if( ent == svg.edicts ) return false; + if( ent == game.edicts ) return false; if( ent->free ) { MsgDev( D_WARN, "SV_DropToFloor: can't modify free entity\n" ); @@ -1678,7 +1684,7 @@ pfnSetOrigin void pfnSetOrigin( edict_t *e, const float *rgflOrigin ) { // ignore world silently - if( e == svg.edicts ) return; + if( e == game.edicts ) return; if( e->free ) { MsgDev( D_ERROR, "SV_SetOrigin: can't modify free entity\n" ); @@ -1701,7 +1707,7 @@ pfnSetAngles */ void pfnSetAngles( edict_t *e, const float *rgflAngles ) { - if( e == svg.edicts ) return; + if( e == game.edicts ) return; if( e->free ) { MsgDev( D_ERROR, "SV_SetAngles: can't modify free entity\n" ); @@ -1768,7 +1774,7 @@ void pfnTraceToss( edict_t* pent, edict_t* pentToIgnore, TraceResult *ptr ) { trace_t trace; - if( pent == svg.edicts ) return; + if( pent == game.edicts ) return; trace = SV_TraceToss( pent, pentToIgnore ); SV_CopyTraceResult( ptr, trace ); } @@ -1854,7 +1860,7 @@ void pfnGetAimVector( edict_t* ent, float speed, float *rgflReturn ) fNoFriendlyFire = Cvar_VariableValue( "mp_friendlyfire" ); VectorCopy( svs.globals->v_forward, rgflReturn ); // assume failure if it returns early - if( ent == svg.edicts ) return; + if( ent == game.edicts ) return; if( ent->free ) { MsgDev( D_ERROR, "SV_GetAimVector: can't aiming at free entity\n" ); @@ -1880,7 +1886,7 @@ void pfnGetAimVector( edict_t* ent, float speed, float *rgflReturn ) bestdist = 0.5f; bestent = NULL; - check = svg.edicts + 1; // start at first client + check = game.edicts + 1; // start at first client for( i = 1; i < svs.globals->numEntities; i++, check++ ) { if( check->v.takedamage != DAMAGE_AIM ) continue; @@ -2024,14 +2030,14 @@ void pfnMessageBegin( int msg_dest, int msg_type, const float *pOrigin, edict_t { // some users can send message with engine index // reduce number to avoid overflow problems or cheating - svg.msg_index = bound( svc_bad, msg_type, svc_nop ); + game.msg_index = bound( svc_bad, msg_type, svc_nop ); - MSG_Begin( svg.msg_index ); + MSG_Begin( game.msg_index ); // save message destination if( pOrigin ) VectorCopy( pOrigin, svs.msg_org ); else VectorClear( svs.msg_org ); - svg.msg_leftsize = svg.msg_sizes[msg_type]; + game.msg_leftsize = game.msg_sizes[msg_type]; svs.msg_dest = msg_dest; svs.msg_ent = ed; } @@ -2044,11 +2050,13 @@ pfnMessageEnd */ void pfnMessageEnd( void ) { - if( svg.msg_leftsize != 0xFFFF && svg.msg_leftsize != 0 ) + return;// + + if( game.msg_leftsize != 0xFFFF && game.msg_leftsize != 0 ) { - const char *name = sv.configstrings[CS_USER_MESSAGES + svg.msg_index]; - int size = svg.msg_sizes[svg.msg_index]; - int realsize = size - svg.msg_leftsize; + const char *name = sv.configstrings[CS_USER_MESSAGES + game.msg_index]; + int size = game.msg_sizes[game.msg_index]; + int realsize = size - game.msg_leftsize; MsgDev( D_ERROR, "SV_Message: %s expected %i bytes, it written %i\n", name, size, realsize ); MSG_Clear( &sv.multicast ); @@ -2068,7 +2076,7 @@ pfnWriteByte void pfnWriteByte( int iValue ) { MSG_WriteByte( &sv.multicast, (int)iValue ); - if( svg.msg_leftsize != 0xFFFF ) svg.msg_leftsize--; + if( game.msg_leftsize != 0xFFFF ) game.msg_leftsize--; } /* @@ -2080,7 +2088,7 @@ pfnWriteChar void pfnWriteChar( int iValue ) { MSG_WriteChar( &sv.multicast, (int)iValue ); - if( svg.msg_leftsize != 0xFFFF ) svg.msg_leftsize--; + if( game.msg_leftsize != 0xFFFF ) game.msg_leftsize--; } /* @@ -2092,7 +2100,7 @@ pfnWriteShort void pfnWriteShort( int iValue ) { MSG_WriteShort( &sv.multicast, (int)iValue ); - if( svg.msg_leftsize != 0xFFFF ) svg.msg_leftsize -= 2; + if( game.msg_leftsize != 0xFFFF ) game.msg_leftsize -= 2; } /* @@ -2104,7 +2112,7 @@ pfnWriteLong void pfnWriteLong( int iValue ) { MSG_WriteLong( &sv.multicast, (int)iValue ); - if( svg.msg_leftsize != 0xFFFF ) svg.msg_leftsize -= 4; + if( game.msg_leftsize != 0xFFFF ) game.msg_leftsize -= 4; } /* @@ -2116,7 +2124,7 @@ pfnWriteAngle void pfnWriteAngle( float flValue ) { MSG_WriteAngle32( &sv.multicast, flValue ); - if( svg.msg_leftsize != 0xFFFF ) svg.msg_leftsize -= 4; + if( game.msg_leftsize != 0xFFFF ) game.msg_leftsize -= 4; } /* @@ -2128,7 +2136,7 @@ pfnWriteCoord void pfnWriteCoord( float flValue ) { MSG_WriteCoord32( &sv.multicast, flValue ); - if( svg.msg_leftsize != 0xFFFF ) svg.msg_leftsize -= 4; + if( game.msg_leftsize != 0xFFFF ) game.msg_leftsize -= 4; } /* @@ -2146,8 +2154,8 @@ void pfnWriteString( const char *sz ) total_size = sv.multicast.cursize - cur_size; // some messages with constant strings can be marked as known sized - if( svg.msg_leftsize != 0xFFFF ) - svg.msg_leftsize -= total_size; + if( game.msg_leftsize != 0xFFFF ) + game.msg_leftsize -= total_size; } /* @@ -2161,7 +2169,7 @@ void pfnWriteEntity( int iValue ) if( iValue < 0 || iValue > svs.globals->numEntities ) Host_Error( "MSG_WriteEntity: invalid entnumber %d\n", iValue ); MSG_WriteShort( &sv.multicast, iValue ); - if( svg.msg_leftsize != 0xFFFF ) svg.msg_leftsize -= 2; + if( game.msg_leftsize != 0xFFFF ) game.msg_leftsize -= 2; } /* @@ -2247,15 +2255,15 @@ pfnPvAllocEntPrivateData */ void *pfnPvAllocEntPrivateData( edict_t *pEdict, long cb ) { - Msg("Edict: %s alloc %s\n", STRING( pEdict->v.classname ), memprint( cb )); + Com_Assert( pEdict == NULL ); // to avoid multiple alloc - pEdict->pvServerData = (void *)Mem_Alloc( svs.private, cb ); + pEdict->pvServerData = (void *)Mem_Realloc( svs.private, pEdict->pvServerData, cb ); return pEdict->pvServerData; } -/* +/* ============= pfnFreeEntPrivateData @@ -2263,7 +2271,8 @@ pfnFreeEntPrivateData */ void pfnFreeEntPrivateData( edict_t *pEdict ) { - if( pEdict->pvServerData ) Mem_Free( pEdict->pvServerData ); + if( pEdict->pvServerData ) + Mem_Free( pEdict->pvServerData ); pEdict->pvServerData = NULL; // freed } @@ -2271,41 +2280,44 @@ void pfnFreeEntPrivateData( edict_t *pEdict ) ============= pfnAllocString -FIXME: make work ============= */ string_t pfnAllocString( const char *szValue ) { - string_t str; - - str = ED_NewString( szValue, svs.stringpool ) - svs.globals->pStringBase; - - Msg("AllocString: %s\n", STRING( str )); - return str; + return StringTable_SetString( game.hStringTable, szValue ); } +/* +============= +pfnGetString + +============= +*/ +const char *pfnGetString( string_t iString ) +{ + return StringTable_GetString( game.hStringTable, iString ); +} + /* ============= pfnPEntityOfEntOffset -FIXME: this is correct ? ============= */ edict_t* pfnPEntityOfEntOffset( int iEntOffset ) { - return svg.edicts + iEntOffset; + return (&((edict_t*)game.vp)[iEntOffset]); } /* ============= pfnEntOffsetOfPEntity -FIXME: this is correct ? ============= */ int pfnEntOffsetOfPEntity( const edict_t *pEdict ) { - return pEdict - svg.edicts; + return ((byte *)pEdict - (byte *)game.vp); } /* @@ -2316,7 +2328,7 @@ pfnIndexOfEdict */ int pfnIndexOfEdict( const edict_t *pEdict ) { - return pEdict - svg.edicts; + return NUM_FOR_EDICT( pEdict ); } /* @@ -2327,7 +2339,7 @@ pfnPEntityOfEntIndex */ edict_t* pfnPEntityOfEntIndex( int iEntIndex ) { - return svg.edicts + iEntIndex; + return EDICT_NUM( iEntIndex ); } /* @@ -2339,9 +2351,14 @@ slow linear brute force */ edict_t* pfnFindEntityByVars( entvars_t* pvars ) { - edict_t *e = svg.edicts; + edict_t *e = game.edicts; int i; + Msg("FindEntity by VARS()\n" ); + + // HACKHACK + if( pvars ) return pvars->pContainingEntity; + for( i = 0; i < svs.globals->numEntities; i++, e++ ) { if( e->free ) continue; @@ -2381,8 +2398,8 @@ int pfnRegUserMsg( const char *pszName, int iSize ) msg_index = SV_UserMessageIndex( pszName ); if( iSize == -1 ) - svg.msg_sizes[msg_index] = 0xFFFF; - else svg.msg_sizes[msg_index] = iSize; + game.msg_sizes[msg_index] = 0xFFFF; + else game.msg_sizes[msg_index] = iSize; return msg_index; } @@ -2419,12 +2436,12 @@ dword pfnFunctionFromName( const char *pName ) { int i, index; - for( i = 0; i < svg.num_ordinals; i++ ) + for( i = 0; i < game.num_ordinals; i++ ) { - if( !com.strcmp( pName, svg.names[i] )) + if( !com.strcmp( pName, game.names[i] )) { - index = svg.ordinals[i]; - return svg.funcs[index] + svg.funcBase; + index = game.ordinals[i]; + return game.funcs[index] + game.funcBase; } } @@ -2442,13 +2459,14 @@ const char *pfnNameForFunction( dword function ) { int i, index; - for( i = 0; i < svg.num_ordinals; i++ ) + for( i = 0; i < game.num_ordinals; i++ ) { - index = svg.ordinals[i]; + index = game.ordinals[i]; - if((function - svg.funcBase) == svg.funcs[index] ) - return svg.names[i]; + if((function - game.funcBase) == game.funcs[index] ) + return game.names[i]; } + // couldn't find the function address to return name return NULL; } @@ -2516,7 +2534,7 @@ changes area portal state */ void pfnAreaPortal( edict_t *pEdict, bool enable ) { - if( pEdict == svg.edicts ) return; + if( pEdict == game.edicts ) return; if( pEdict->free ) { MsgDev( D_ERROR, "SV_AreaPortal: can't modify free entity\n" ); @@ -2939,6 +2957,7 @@ static enginefuncs_t gEngfuncs = pfnPvAllocEntPrivateData, pfnFreeEntPrivateData, pfnAllocString, + pfnGetString, pfnPEntityOfEntOffset, pfnEntOffsetOfPEntity, pfnIndexOfEdict, @@ -2979,7 +2998,8 @@ static enginefuncs_t gEngfuncs = pfnSetClientKeyValue, pfnSetSkybox, pfnPlayMusic, - pfnDropClient + pfnDropClient, + Host_Error }; /* @@ -3095,14 +3115,11 @@ void SV_LoadFromFile( script_t *entities ) if( !SV_ParseEdict( entities, ent )) continue; - Msg("SpawnEntity: %s\n", STRING( ent->v.classname )); if( svs.dllFuncs.pfnSpawn( ent ) == -1 ) died++; else spawned++; } MsgDev( D_INFO, "%i entities inhibited\n", inhibited ); - - Com_Assert( 1 ); } /* @@ -3120,8 +3137,8 @@ void SV_SpawnEntities( const char *mapname, script_t *entities ) MsgDev( D_NOTE, "SV_SpawnEntities()\n" ); - ent = svg.edicts; - Mem_Set( &ent->v, 0, sizeof( entvars_t )); + ent = EDICT_NUM( 0 ); + SV_InitEdict( ent ); ent->v.model = pfnAllocString( sv.configstrings[CS_MODELS] ); ent->v.modelindex = 1; // world model ent->v.solid = SOLID_BSP; @@ -3142,14 +3159,15 @@ void SV_SpawnEntities( const char *mapname, script_t *entities ) ent = EDICT_NUM( i + 1 ); SV_InitEdict( ent ); ent->pvEngineData->client = svs.clients + i; + svs.globals->numClients++; } - Msg("Total %i entities spawned\n", svs.globals->numEntities ); } void SV_UnloadProgs( void ) { Sys_FreeNameFuncGlobals(); + StringTable_Delete( game.hStringTable ); if( svs.game && svs.game->link ) { @@ -3212,13 +3230,15 @@ bool SV_LoadProgs( const char *name ) return false; } - // get pointer as really static object - svs.globals->pStringBase = (const char *)GiveFnptrsToDll; + // 65535 unique strings should be enough ... + game.hStringTable = StringTable_Create( "Game Strings", 0x10000 ); + StringTable_SetString( game.hStringTable, "" ); // make NULL string svs.globals->maxEntities = host.max_edicts; svs.globals->maxClients = Host_MaxClients(); - svg.edicts = Mem_Alloc( svs.mempool, sizeof( edict_t ) * svs.globals->maxEntities ); - svs.globals->numClients = svs.globals->numEntities = 0; - for( i = 0, e = svg.edicts; i < svs.globals->maxEntities; i++, e++ ) + game.edicts = Mem_Alloc( svs.mempool, sizeof( edict_t ) * svs.globals->maxEntities ); + svs.globals->numEntities = svs.globals->maxClients + 1; // clients + world + svs.globals->numClients = 0; + for( i = 0, e = game.edicts; i < svs.globals->maxEntities; i++, e++ ) e->free = true; // mark all edicts as freed // initialize game diff --git a/engine/server/sv_init.c b/engine/server/sv_init.c index d7d66364..5c0abcfc 100644 --- a/engine/server/sv_init.c +++ b/engine/server/sv_init.c @@ -22,7 +22,7 @@ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. #include "server.h" server_static_t svs; // persistant server info -game_static_t svg; // persistant game info +game_static_t game; // persistant game info server_t sv; // local server /* @@ -209,6 +209,8 @@ void SV_SpawnServer( const char *server, const char *savename ) if( sv.loadgame ) SV_ReadLevelFile( savename ); else SV_SpawnEntities( sv.name, pe->GetEntityScript()); + svs.dllFuncs.pfnServerActivate( game.edicts, svs.globals->numEntities, svs.globals->maxClients ); + // run two frames to allow everything to settle for( i = 0; i < 2; i++ ) { diff --git a/engine/server/sv_move.c b/engine/server/sv_move.c index 2067f4e7..a16e9ee2 100644 --- a/engine/server/sv_move.c +++ b/engine/server/sv_move.c @@ -106,11 +106,11 @@ bool SV_movestep( edict_t *ent, vec3_t move, bool relink, bool noenemy, bool set for( i = 0; i < 2; i++ ) { VectorAdd( ent->v.origin, move, neworg ); - if( noenemy ) enemy = svg.edicts; + if( noenemy ) enemy = EDICT_NUM( 0 ); else { enemy = ent->v.enemy; - if( i == 0 && enemy != svg.edicts ) + if( i == 0 && enemy != EDICT_NUM( 0 )) { dz = ent->v.origin[2] - ent->v.enemy->v.origin[2]; if( dz > 40 ) neworg[2] -= 8; @@ -129,7 +129,7 @@ bool SV_movestep( edict_t *ent, vec3_t move, bool relink, bool noenemy, bool set if( relink ) SV_LinkEdict( ent ); return true; } - if( enemy == svg.edicts ) break; + if( enemy == EDICT_NUM( 0 )) break; } return false; } @@ -349,7 +349,7 @@ bool SV_MoveToGoal( edict_t *ent, edict_t *goal, float dist ) } // if the next step hits the enemy, return immediately - if( ent->v.enemy != svg.edicts && SV_CloseEnough( ent, goal, dist )) + if( ent->v.enemy != EDICT_NUM( 0 ) && SV_CloseEnough( ent, goal, dist )) return false; // bump around... diff --git a/engine/server/sv_phys.c b/engine/server/sv_phys.c index e7bdbafa..04d05e1e 100644 --- a/engine/server/sv_phys.c +++ b/engine/server/sv_phys.c @@ -82,7 +82,7 @@ trace_t SV_Trace( const vec3_t start, const vec3_t mins, const vec3_t maxs, cons pe->ClipToWorld( &cliptrace, sv.worldmodel, clipstart, clipmins, clipmaxs, clipend, contentsmask ); cliptrace.startstuck = cliptrace.startsolid; if( cliptrace.startsolid || cliptrace.fraction < 1 ) - cliptrace.ent = svg.edicts; + cliptrace.ent = NULL; if( type == MOVE_WORLDONLY ) return cliptrace; @@ -106,12 +106,12 @@ trace_t SV_Trace( const vec3_t start, const vec3_t mins, const vec3_t maxs, cons clipboxmaxs[i] = max(clipstart[i], cliptrace.endpos[i]) + max(hullmaxs[i], clipmaxs2[i]) + 1; } - // if the passedict is world, make it NULL (to avoid two checks each time) - if( passedict == svg.edicts ) passedict = NULL; // figure out whether this is a point trace for comparisons pointtrace = VectorCompare(clipmins, clipmaxs); // precalculate passedict's owner edict pointer for comparisons - traceowner = passedict ? passedict->v.owner : svg.edicts; + if( passedict && passedict->v.owner ) + traceowner = passedict->v.owner; + else traceowner = NULL; // clip to entities // because this uses SV_AreaEdicts, we know all entity boxes overlap @@ -139,7 +139,7 @@ trace_t SV_Trace( const vec3_t start, const vec3_t mins, const vec3_t maxs, cons // don't clip owner against owned entities if( passedict == touch->v.owner ) continue; // don't clip points against points (they can't collide) - if( pointtrace && VectorCompare( touch->v.mins, touch->v.maxs ) && (type != MOVE_MISSILE || !((int)touch->v.flags & FL_MONSTER))) + if( pointtrace && VectorCompare( touch->v.mins, touch->v.maxs ) && (type != MOVE_MISSILE || !(touch->v.flags & FL_MONSTER))) continue; } @@ -147,7 +147,7 @@ trace_t SV_Trace( const vec3_t start, const vec3_t mins, const vec3_t maxs, cons // might interact, so do an exact clip model = NULL; - if((int)touch->v.solid == SOLID_BSP || type == MOVE_HITMODEL ) + if( touch->v.solid == SOLID_BSP || type == MOVE_HITMODEL ) { uint modelindex = (uint)touch->v.modelindex; // if the modelindex is 0, it shouldn't be SOLID_BSP! @@ -251,7 +251,7 @@ void SV_CheckAllEnts( void ) edict_t *check; // see if any solid entities are inside the final position - check = svg.edicts + 1; + check = EDICT_NUM( 1 ); for( e = 1; e < svs.globals->numEntities; e++, check++ ) { if( check->free ) continue; @@ -478,7 +478,7 @@ int SV_FlyMove( edict_t *ent, float time, float *stepnormal, int contentsmask ) if( !trace.ent ) { MsgDev( D_WARN, "SV_FlyMove: trace.ent == NULL\n" ); - trace.ent = svg.edicts; + trace.ent = EDICT_NUM( 0 ); } impact = !(ent->v.flags & FL_ONGROUND) || ent->v.groundentity != trace.ent; @@ -899,7 +899,7 @@ void SV_Physics_Pusher( edict_t *ent ) oldltime = ent->v.ltime; thinktime = ent->v.nextthink; - if( thinktime < ent->v.ltime + sv.frametime) + if( thinktime < ent->v.ltime + sv.frametime ) { movetime = thinktime - ent->v.ltime; if( movetime < 0 ) movetime = 0; @@ -1316,7 +1316,7 @@ void SV_Physics_Toss( edict_t *ent ) // if ent was supported by a brush model on previous frame, // and groundentity is now freed, set groundentity to 0 (world) // which leaves it suspended in the air - ent->v.groundentity = svg.edicts; + ent->v.groundentity = EDICT_NUM( 0 ); return; } } @@ -1368,7 +1368,7 @@ void SV_Physics_Toss( edict_t *ent ) { ent->v.flags |= FL_ONGROUND; ent->v.groundentity = trace.ent; - if( trace.ent->v.solid == SOLID_BSP ) + if( trace.ent && trace.ent->v.solid == SOLID_BSP ) ent->pvEngineData->suspended = true; VectorClear( ent->v.velocity ); VectorClear( ent->v.avelocity ); @@ -1542,7 +1542,7 @@ void SV_Physics_None( edict_t *ent ) static void SV_Physics_Entity( edict_t *ent ) { - switch((int)ent->v.movetype) + switch( ent->v.movetype ) { case MOVETYPE_PUSH: SV_Physics_Pusher( ent ); @@ -1763,8 +1763,11 @@ void SV_Physics( void ) } // at end of frame kill all entities which supposed to it - for( i = svs.globals->maxClients; i < svs.globals->numEntities; i++ ) + for( i = svs.globals->maxClients + 1; i < svs.globals->numEntities; i++ ) { + ent = EDICT_NUM( i ); + if( ent->free ) continue; + if( ent->v.flags & FL_KILLME ) SV_FreeEdict( EDICT_NUM( i )); } @@ -1772,8 +1775,6 @@ void SV_Physics( void ) svs.globals->time = sv.time; // svs.dllFuncs.pfnEndFrame(); - Msg("NumEnts %d\n", svs.globals->numEntities - 1 ); - // decrement svs.globals->numEntities if the highest number entities died for( ; EDICT_NUM( svs.globals->numEntities - 1)->free; svs.globals->numEntities-- ); diff --git a/engine/server/sv_progs.c b/engine/server/sv_progs.c index 71eb84f5..93af77ff 100644 --- a/engine/server/sv_progs.c +++ b/engine/server/sv_progs.c @@ -15,9 +15,9 @@ void SV_BeginIncreaseEdicts( void ) edict_t *ent; // links don't survive the transition, so unlink everything - for( i = 0, ent = svg.edicts; i < svs.globals->maxEntities; i++, ent++ ) + for( i = 0, ent = EDICT_NUM( 0 ); i < svs.globals->maxEntities; i++, ent++ ) { - if( !ent->free ) SV_UnlinkEdict( svg.edicts + i ); // free old entity + if( !ent->free ) SV_UnlinkEdict( EDICT_NUM( i )); // free old entity Mem_Set( &ent->pvEngineData->clusternums, 0, sizeof( ent->pvEngineData->clusternums )); } SV_ClearWorld(); @@ -28,7 +28,7 @@ void SV_EndIncreaseEdicts(void) int i; edict_t *ent; - for( i = 0, ent = svg.edicts; i < svs.globals->maxEntities; i++, ent++ ) + for( i = 0, ent = EDICT_NUM( 0 ); i < svs.globals->maxEntities; i++, ent++ ) { // link every entity except world if( !ent->free ) SV_LinkEdict(ent); diff --git a/engine/server/sv_world.c b/engine/server/sv_world.c index 10bf4497..7acd371b 100644 --- a/engine/server/sv_world.c +++ b/engine/server/sv_world.c @@ -176,11 +176,11 @@ sorting edict by type */ void SV_ClassifyEdict( edict_t *ent ) { - ed_priv_t *sv_ent; + ed_priv_t *sv_ent; const char *classname; sv_ent = ent->pvEngineData; - if( sv_ent->s.ed_type != ED_SPAWNED ) + if( !sv_ent || sv_ent->s.ed_type != ED_SPAWNED ) return; // null state ? @@ -268,7 +268,7 @@ void SV_LinkEdict( edict_t *ent ) sv_ent = ent->pvEngineData; if( sv_ent->area.prev ) SV_UnlinkEdict( ent ); // unlink from old position - if( ent == svg.edicts ) return; // don't add the world + if( ent == EDICT_NUM( 0 )) return; // don't add the world if( ent->free ) return; // trying to classify unclassified edicts diff --git a/launch/cvar.c b/launch/cvar.c index a94244de..c44037df 100644 --- a/launch/cvar.c +++ b/launch/cvar.c @@ -314,7 +314,7 @@ cvar_t *Cvar_Set2 (const char *var_name, const char *value, bool force) var->modificationCount++; return var; } - if((var->flags & CVAR_CHEAT) && !Cvar_VariableInteger("host_cheats")) + if((var->flags & CVAR_CHEAT) && !Cvar_VariableInteger( "sv_cheats" )) { MsgDev( D_INFO, "%s is cheat protected.\n", var_name ); return var; diff --git a/launch/export.c b/launch/export.c index 35328883..a8827643 100644 --- a/launch/export.c +++ b/launch/export.c @@ -12,7 +12,7 @@ Base Entry Point */ DLLEXPORT int CreateAPI( char *hostname, bool console ) { - // memeber name + // member name com_strncpy( Sys.progname, hostname, sizeof(Sys.progname)); Sys.hooked_out = console; // set mode diff --git a/launch/utils.c b/launch/utils.c index 96f5121c..e2fbb077 100644 --- a/launch/utils.c +++ b/launch/utils.c @@ -260,7 +260,7 @@ bool StringTable_CheckString( int handle, string_t str ) if(!StringTable_CheckHandle( handle )) return false; - if( str < 0 || str > dstring[handle]->numstrings ) + if( str < 0 || str >= dstring[handle]->numstrings ) { MsgDev( D_ERROR, "StringTable_CheckString: invalid string index %i\n", str ); return false; @@ -316,7 +316,7 @@ string_t StringTable_SetString( int handle, const char *string ) for( i = 0; i < dstring[handle]->numstrings; i++ ) { - if(!com.stricmp( string, StringTable_GetString( handle, i ))) + if(!com.strcmp( string, StringTable_GetString( handle, i ))) return i; // already existing } diff --git a/public/svgame_api.h b/public/svgame_api.h index 37cceb15..dfa8b9a0 100644 --- a/public/svgame_api.h +++ b/public/svgame_api.h @@ -40,9 +40,9 @@ enum // NOTE: engine trace struct not matched with svgame trace typedef struct { - bool fAllSolid; // if true, plane is not valid - bool fStartSolid; // if true, the initial point was in a solid area - bool fStartStuck; // if true, trace started from solid entity + BOOL fAllSolid; // if true, plane is not valid + BOOL fStartSolid; // if true, the initial point was in a solid area + BOOL fStartStuck; // if true, trace started from solid entity float flFraction; // time completed, 1.0 = didn't hit anything vec3_t vecEndPos; // final position int iStartContents; // start pos conetnts @@ -124,6 +124,7 @@ typedef struct enginefuncs_s void* (*pfnPvAllocEntPrivateData)( edict_t *pEdict, long cb ); void (*pfnFreeEntPrivateData)( edict_t *pEdict ); string_t (*pfnAllocString)( const char *szValue ); + const char *(*pfnGetString)( string_t iString ); edict_t* (*pfnPEntityOfEntOffset)( int iEntOffset ); int (*pfnEntOffsetOfPEntity)( const edict_t *pEdict ); int (*pfnIndexOfEdict)( const edict_t *pEdict ); @@ -137,7 +138,7 @@ typedef struct enginefuncs_s const char *(*pfnNameForFunction)( dword function ); void (*pfnClientPrintf)( edict_t* pEdict, int ptype, const char *szMsg ); void (*pfnServerPrint)( const char *szMsg ); - void (*pfnAreaPortal)( edict_t *pEdict, bool enable ); + void (*pfnAreaPortal)( edict_t *pEdict, BOOL enable ); const char *(*pfnCmd_Args)( void ); const char *(*pfnCmd_Argv)( int argc ); int (*pfnCmd_Argc)( void ); @@ -167,6 +168,7 @@ typedef struct enginefuncs_s void (*pfnSetSkybox)( const char *name ); void (*pfnPlayMusic)( const char *trackname, int flags ); // background track void (*pfnDropClient)( int clientIndex ); // used for kick cheaters from server + void (*pfnHostError)( const char *szFmt, ... ); // invoke host error } enginefuncs_t; // passed to pfnKeyValue diff --git a/public/svprog_def.h b/public/svprog_def.h index 631811b5..65d16ca0 100644 --- a/public/svprog_def.h +++ b/public/svprog_def.h @@ -16,9 +16,9 @@ typedef struct globalvars_s string_t startspot; vec3_t spotOffset; // landmark offset - bool deathmatch; - bool coop; - bool teamplay; + BOOL deathmatch; + BOOL coop; + BOOL teamplay; int serverflags; int maxClients; @@ -30,9 +30,9 @@ typedef struct globalvars_s vec3_t v_right; vec3_t v_up; - bool trace_allsolid; - bool trace_startsolid; - bool trace_startstuck; + BOOL trace_allsolid; + BOOL trace_startsolid; + BOOL trace_startstuck; float trace_fraction; vec3_t trace_endpos; vec3_t trace_plane_normal; @@ -48,7 +48,6 @@ typedef struct globalvars_s int total_monsters; int killed_monsters; // number of monsters killed - const char *pStringBase; // stringtable base offset void *pSaveData; // savedata base offset } globalvars_t; @@ -190,7 +189,7 @@ typedef struct entvars_s struct edict_s { - bool free; + BOOL free; float freetime; // sv.time when the object was freed int serialnumber; diff --git a/sv_dll/server.plg b/sv_dll/server.plg index 35b71426..5c839804 100644 --- a/sv_dll/server.plg +++ b/sv_dll/server.plg @@ -6,6 +6,89 @@ --------------------Configuration: server - Win32 Debug--------------------

Command Lines

+Creating temporary file "C:\DOCUME~1\ÀÄÌÈÍÈ~1.9CC\LOCALS~1\Temp\RSP3B0.tmp" with contents +[ +/nologo /MDd /W3 /Gm /Gi /GX /ZI /Od /I "./" /I "./ents" /I "./game" /I "./global" /I "./monsters" /I "../public" /D "WIN32" /D "_DEBUG" /D "_WINDOWS" /FR"..\temp\server\!debug/" /Fo"..\temp\server\!debug/" /Fd"..\temp\server\!debug/" /FD /c +"D:\Xash3D\src_main\sv_dll\global\client.cpp" +] +Creating command line "cl.exe @"C:\DOCUME~1\ÀÄÌÈÍÈ~1.9CC\LOCALS~1\Temp\RSP3B0.tmp"" +Creating temporary file "C:\DOCUME~1\ÀÄÌÈÍÈ~1.9CC\LOCALS~1\Temp\RSP3B1.tmp" with contents +[ +msvcrtd.lib /nologo /subsystem:windows /dll /incremental:yes /pdb:"..\temp\server\!debug/server.pdb" /debug /machine:I386 /nodefaultlib:"libc.lib" /def:".\server.def" /out:"..\temp\server\!debug/server.dll" /implib:"..\temp\server\!debug/server.lib" /pdbtype:sept +"\Xash3D\src_main\temp\server\!debug\ai_sound.obj" +"\Xash3D\src_main\temp\server\!debug\animating.obj" +"\Xash3D\src_main\temp\server\!debug\animation.obj" +"\Xash3D\src_main\temp\server\!debug\apache.obj" +"\Xash3D\src_main\temp\server\!debug\barnacle.obj" +"\Xash3D\src_main\temp\server\!debug\barney.obj" +"\Xash3D\src_main\temp\server\!debug\basebrush.obj" +"\Xash3D\src_main\temp\server\!debug\baseentity.obj" +"\Xash3D\src_main\temp\server\!debug\basefunc.obj" +"\Xash3D\src_main\temp\server\!debug\basefx.obj" +"\Xash3D\src_main\temp\server\!debug\baseinfo.obj" +"\Xash3D\src_main\temp\server\!debug\baseitem.obj" +"\Xash3D\src_main\temp\server\!debug\baselogic.obj" +"\Xash3D\src_main\temp\server\!debug\basemonster.obj" +"\Xash3D\src_main\temp\server\!debug\basemover.obj" +"\Xash3D\src_main\temp\server\!debug\baseother.obj" +"\Xash3D\src_main\temp\server\!debug\basepath.obj" +"\Xash3D\src_main\temp\server\!debug\baserockets.obj" +"\Xash3D\src_main\temp\server\!debug\basetank.obj" +"\Xash3D\src_main\temp\server\!debug\basetrigger.obj" +"\Xash3D\src_main\temp\server\!debug\baseutil.obj" +"\Xash3D\src_main\temp\server\!debug\baseweapon.obj" +"\Xash3D\src_main\temp\server\!debug\baseworld.obj" +"\Xash3D\src_main\temp\server\!debug\client.obj" +"\Xash3D\src_main\temp\server\!debug\combat.obj" +"\Xash3D\src_main\temp\server\!debug\decals.obj" +"\Xash3D\src_main\temp\server\!debug\defaultai.obj" +"\Xash3D\src_main\temp\server\!debug\dll_int.obj" +"\Xash3D\src_main\temp\server\!debug\flyingmonster.obj" +"\Xash3D\src_main\temp\server\!debug\game.obj" +"\Xash3D\src_main\temp\server\!debug\gamerules.obj" +"\Xash3D\src_main\temp\server\!debug\generic.obj" +"\Xash3D\src_main\temp\server\!debug\globals.obj" +"\Xash3D\src_main\temp\server\!debug\gman.obj" +"\Xash3D\src_main\temp\server\!debug\hassassin.obj" +"\Xash3D\src_main\temp\server\!debug\headcrab.obj" +"\Xash3D\src_main\temp\server\!debug\hgrunt.obj" +"\Xash3D\src_main\temp\server\!debug\leech.obj" +"\Xash3D\src_main\temp\server\!debug\legacy.obj" +"\Xash3D\src_main\temp\server\!debug\lights.obj" +"\Xash3D\src_main\temp\server\!debug\multiplay_gamerules.obj" +"\Xash3D\src_main\temp\server\!debug\nodes.obj" +"\Xash3D\src_main\temp\server\!debug\osprey.obj" +"\Xash3D\src_main\temp\server\!debug\parent.obj" +"\Xash3D\src_main\temp\server\!debug\player.obj" +"\Xash3D\src_main\temp\server\!debug\rat.obj" +"\Xash3D\src_main\temp\server\!debug\roach.obj" +"\Xash3D\src_main\temp\server\!debug\saverestore.obj" +"\Xash3D\src_main\temp\server\!debug\scientist.obj" +"\Xash3D\src_main\temp\server\!debug\scripted.obj" +"\Xash3D\src_main\temp\server\!debug\sfx.obj" +"\Xash3D\src_main\temp\server\!debug\singleplay_gamerules.obj" +"\Xash3D\src_main\temp\server\!debug\sound.obj" +"\Xash3D\src_main\temp\server\!debug\squadmonster.obj" +"\Xash3D\src_main\temp\server\!debug\talkmonster.obj" +"\Xash3D\src_main\temp\server\!debug\teamplay_gamerules.obj" +"\Xash3D\src_main\temp\server\!debug\turret.obj" +"\Xash3D\src_main\temp\server\!debug\utils.obj" +"\Xash3D\src_main\temp\server\!debug\weapon_generic.obj" +"\Xash3D\src_main\temp\server\!debug\zombie.obj" +] +Creating command line "link.exe @"C:\DOCUME~1\ÀÄÌÈÍÈ~1.9CC\LOCALS~1\Temp\RSP3B1.tmp"" +Creating temporary file "C:\DOCUME~1\ÀÄÌÈÍÈ~1.9CC\LOCALS~1\Temp\RSP3B2.bat" with contents +[ +@echo off +copy \Xash3D\src_main\temp\server\!debug\server.dll "D:\Xash3D\tmpQuArK\bin\server.dll" +] +Creating command line ""C:\DOCUME~1\ÀÄÌÈÍÈ~1.9CC\LOCALS~1\Temp\RSP3B2.bat"" +Compiling... +client.cpp +Linking... +

Output Window

+Performing Custom Build Step on \Xash3D\src_main\temp\server\!debug\server.dll +‘ª®¯¨à®¢ ­® ä ©«®¢: 1. diff --git a/todo.log b/todo.log index c1622b4a..3205e038 100644 --- a/todo.log +++ b/todo.log @@ -18,7 +18,9 @@ fopen Beta 13.12.08 -0. ïîäêëþ÷èòü sv_dll ê ïðîåêòó +0. ïîäêëþ÷èòü sv_dll ê ïðîåêòó OK +1. âêëþ÷èòü Think OK +2. rename bool to BOOL entity_state_t íåâèäèìà äëÿ ïîëüçîâàòåëÿ