From 4fc947807fe0060906d6df776e5175f42c32d2c7 Mon Sep 17 00:00:00 2001 From: s1lentq Date: Mon, 12 Dec 2016 21:28:21 +0700 Subject: [PATCH] Refactoring Fix crash on SV_SingleClipMoveToEntity, added safe check for pointer model --- publish.gradle | 2 +- rehlds/common/qlimits.h | 6 +- rehlds/engine/client.h | 6 +- rehlds/engine/com_custom.cpp | 4 +- rehlds/engine/delta.cpp | 4 +- rehlds/engine/host.cpp | 2 +- rehlds/engine/host.h | 2 +- rehlds/engine/model.cpp | 22 +++++- rehlds/engine/model_rehlds.h | 2 + rehlds/engine/pmovetst.cpp | 13 ++-- rehlds/engine/pr_cmds.cpp | 124 +++++++++++++++--------------- rehlds/engine/server.h | 30 +++----- rehlds/engine/sv_main.cpp | 45 ++++++----- rehlds/engine/sv_move.cpp | 16 ++-- rehlds/engine/sv_upld.cpp | 13 ++-- rehlds/engine/sv_user.cpp | 3 +- rehlds/engine/sys_dll.cpp | 2 +- rehlds/engine/sys_dll.h | 2 +- rehlds/engine/world.cpp | 86 ++++++++++----------- rehlds/public/commonmacros.h | 6 +- rehlds/public/rehlds/crc32c.h | 12 +-- rehlds/public/rehlds/hookchains.h | 2 +- rehlds/public/rehlds/model.h | 1 + rehlds/public/rehlds/osconfig.h | 2 + rehlds/public/rehlds/studio.h | 7 +- rehlds/rehlds/platform.cpp | 2 +- rehlds/rehlds/platform.h | 2 +- 27 files changed, 220 insertions(+), 198 deletions(-) diff --git a/publish.gradle b/publish.gradle index ffd3165..d5fbdf3 100644 --- a/publish.gradle +++ b/publish.gradle @@ -51,7 +51,7 @@ task publishPrepareFiles { copy { from 'rehlds/public' into 'publish/publishRoot/hlsdk/public' - include 'interface.h', 'interface.cpp', 'FileSystem.h' + exclude '**/rehlds/*', '**/tier0/*' } copy { from 'rehlds/public/rehlds' diff --git a/rehlds/common/qlimits.h b/rehlds/common/qlimits.h index 3fad403..c19e670 100644 --- a/rehlds/common/qlimits.h +++ b/rehlds/common/qlimits.h @@ -25,15 +25,19 @@ #define MAX_LIGHTSTYLE_INDEX_BITS 6 #define MAX_LIGHTSTYLES (1<initialCRC = 0; } } + +model_t *Mod_Handle(int modelindex) +{ +#ifdef REHLDS_FIXES + if (modelindex <= 0 || modelindex >= MAX_MODELS) { + Sys_Error(__FUNCTION__ ": bad modelindex #%i\n", modelindex); + } +#endif + + return g_psv.models[modelindex]; +} + +modtype_t Mod_GetType(int modelindex) +{ + model_t *mod = Mod_Handle(modelindex); + if (!mod) { + return mod_bad; + } + + return mod->type; +} diff --git a/rehlds/engine/model_rehlds.h b/rehlds/engine/model_rehlds.h index 39816ad..57e17c5 100644 --- a/rehlds/engine/model_rehlds.h +++ b/rehlds/engine/model_rehlds.h @@ -114,3 +114,5 @@ void Mod_LoadSpriteModel(model_t *mod, void *buffer); NOXREF void Mod_UnloadSpriteTextures(model_t *pModel); void Mod_Print(void); NOXREF void Mod_ChangeGame(void); +model_t *Mod_Handle(int modelindex); +modtype_t Mod_GetType(int modelindex); diff --git a/rehlds/engine/pmovetst.cpp b/rehlds/engine/pmovetst.cpp index fd31e7b..2946767 100644 --- a/rehlds/engine/pmovetst.cpp +++ b/rehlds/engine/pmovetst.cpp @@ -277,7 +277,10 @@ int _PM_TestPlayerPosition(vec_t *pos, pmtrace_t *ptrace, int(*pfnIgnore)(physen for (int i = 0; i < pmove->numphysent; i++) { physent_t *pe = &pmove->physents[i]; - if (pfnIgnore && pfnIgnore(pe) || pe->model && !pe->solid && pe->skin) + if (pfnIgnore && pfnIgnore(pe)) + continue; + + if (pe->model && pe->solid == SOLID_NOT && pe->skin != 0) continue; offset[0] = pe->origin[0]; @@ -291,7 +294,7 @@ int _PM_TestPlayerPosition(vec_t *pos, pmtrace_t *ptrace, int(*pfnIgnore)(physen } else { - if (pe->studiomodel && pe->studiomodel->type == mod_studio && ((pe->studiomodel->flags & 0x200) || pmove->usehull == 2)) + if (pe->studiomodel && pe->studiomodel->type == mod_studio && ((pe->studiomodel->flags & STUDIO_TRACE_HITBOX) || pmove->usehull == 2)) { hull = PM_HullForStudioModel(pe->studiomodel, offset, pe->frame, pe->sequence, pe->angles, pe->origin, pe->controller, pe->blending, &numhulls); } @@ -309,7 +312,7 @@ int _PM_TestPlayerPosition(vec_t *pos, pmtrace_t *ptrace, int(*pfnIgnore)(physen test[0] = pos[0] - offset[0]; test[1] = pos[1] - offset[1]; test[2] = pos[2] - offset[2]; - if (pe->solid == 4 && (pe->angles[0] != 0.0 || pe->angles[1] != 0.0 || pe->angles[2] != 0.0)) + if (pe->solid == SOLID_BSP && (pe->angles[0] != 0.0 || pe->angles[1] != 0.0 || pe->angles[2] != 0.0)) { vec3_t forward, right, up; AngleVectors(pe->angles, forward, right, up); @@ -324,14 +327,14 @@ int _PM_TestPlayerPosition(vec_t *pos, pmtrace_t *ptrace, int(*pfnIgnore)(physen for (int j = 0; j < numhulls; j++) { g_contentsresult = PM_HullPointContents(&hull[j], hull[j].firstclipnode, test); - if (g_contentsresult == -2) + if (g_contentsresult == CONTENTS_SOLID) return i; } } else { g_contentsresult = PM_HullPointContents(hull, hull->firstclipnode, test); - if (g_contentsresult == -2) + if (g_contentsresult == CONTENTS_SOLID) return i; } } diff --git a/rehlds/engine/pr_cmds.cpp b/rehlds/engine/pr_cmds.cpp index 7e24280..bb84ac3 100644 --- a/rehlds/engine/pr_cmds.cpp +++ b/rehlds/engine/pr_cmds.cpp @@ -127,7 +127,7 @@ void EXT_FUNC PF_setmodel_I(edict_t *e, const char *m) int i = 0; #ifdef REHLDS_CHECKS - for (; *check && i < HL_MODEL_MAX; i++, check++) + for (; *check && i < MAX_MODELS; i++, check++) #else for (; *check; i++, check++) #endif @@ -287,7 +287,7 @@ void EXT_FUNC PF_ambientsound_I(edict_t *entity, float *pos, const char *samp, f } else { - for (i = 0; i < HL_SOUND_MAX; i++) + for (i = 0; i < MAX_SOUNDS; i++) { if (g_psv.sound_precache[i] && !Q_stricmp(g_psv.sound_precache[i], samp)) { @@ -296,7 +296,7 @@ void EXT_FUNC PF_ambientsound_I(edict_t *entity, float *pos, const char *samp, f } } - if (i == HL_SOUND_MAX) + if (i == MAX_SOUNDS) { Con_Printf("no precache: %s\n", samp); return; @@ -1023,19 +1023,19 @@ int EXT_FUNC PF_precache_sound_I(const char *s) int i; if (!s) - Host_Error("PF_precache_sound_I: NULL pointer"); + Host_Error(__FUNCTION__ ": NULL pointer"); if (PR_IsEmptyString(s)) - Host_Error("PF_precache_sound_I: Bad string '%s'", s); + Host_Error(__FUNCTION__ ": Bad string '%s'", s); if (s[0] == '!') - Host_Error("PF_precache_sound_I: '%s' do not precache sentence names!", s); + Host_Error(__FUNCTION__ ": '%s' do not precache sentence names!", s); if (g_psv.state == ss_loading) { g_psv.sound_precache_hashedlookup_built = 0; - for (i = 0; i < HL_SOUND_MAX; i++) + for (i = 0; i < MAX_SOUNDS; i++) { if (!g_psv.sound_precache[i]) { @@ -1053,42 +1053,42 @@ int EXT_FUNC PF_precache_sound_I(const char *s) } Host_Error( - "PF_precache_sound_I: Sound '%s' failed to precache because the item count is over the %d limit.\nReduce the number of brush models and/or regular models in the map to correct this.", - s, - HL_SOUND_MAX); + __FUNCTION__ ": Sound '%s' failed to precache because the item count is over the %d limit.\nReduce the number of brush models and/or regular models in the map to correct this.", + s, MAX_SOUNDS); } else { // precaching not enabled. check if already exists. - for (i = 0; i < HL_SOUND_MAX; i++) + for (i = 0; i < MAX_SOUNDS; i++) { if (g_psv.sound_precache[i] && !Q_stricmp(g_psv.sound_precache[i], s)) return i; } - Host_Error("PF_precache_sound_I: '%s' Precache can only be done in spawn functions", s); + Host_Error(__FUNCTION__ ": '%s' Precache can only be done in spawn functions", s); } - return -1; // unreach + // unreach + return -1; } unsigned short EXT_FUNC EV_Precache(int type, const char *psz) { if (!psz) - Host_Error("EV_Precache: NULL pointer"); + Host_Error(__FUNCTION__ ": NULL pointer"); if (PR_IsEmptyString(psz)) - Host_Error("EV_Precache: Bad string '%s'", psz); + Host_Error(__FUNCTION__ ": Bad string '%s'", psz); if (g_psv.state == ss_loading) { - for (int i = 1; i < HL_EVENT_MAX; i++) + for (int i = 1; i < MAX_EVENTS; i++) { struct event_s* ev = &g_psv.event_precache[i]; if (!ev->filename) { if (type != 1) - Host_Error("EV_Precache: only file type 1 supported currently\n"); + Host_Error(__FUNCTION__ ": only file type 1 supported currently\n"); char szpath[MAX_PATH]; Q_snprintf(szpath, sizeof(szpath), "%s", psz); @@ -1097,7 +1097,7 @@ unsigned short EXT_FUNC EV_Precache(int type, const char *psz) int scriptSize = 0; char* evScript = (char*) COM_LoadFile(szpath, 5, &scriptSize); if (!evScript) - Host_Error("EV_Precache: file %s missing from server\n", psz); + Host_Error(__FUNCTION__ ": file %s missing from server\n", psz); #ifdef REHLDS_FIXES // Many modders don't know that the resource names passed to precache functions must be a static strings. // Also some metamod modules can be unloaded during the server running. @@ -1117,18 +1117,18 @@ unsigned short EXT_FUNC EV_Precache(int type, const char *psz) if (!Q_stricmp(ev->filename, psz)) return i; } - Host_Error("EV_Precache: '%s' overflow", psz); + Host_Error(__FUNCTION__ ": '%s' overflow", psz); } else { - for (int i = 1; i < HL_EVENT_MAX; i++) + for (int i = 1; i < MAX_EVENTS; i++) { struct event_s* ev = &g_psv.event_precache[i]; if (!Q_stricmp(ev->filename, psz)) return i; } - Host_Error("EV_Precache: '%s' Precache can only be done in spawn functions", psz); + Host_Error(__FUNCTION__ ": '%s' Precache can only be done in spawn functions", psz); } } @@ -1219,15 +1219,15 @@ void EXT_FUNC EV_Playback(int flags, const edict_t *pInvoker, unsigned short eve eargs.bparam1 = bparam1; eargs.bparam2 = bparam2; - if (eventindex < 1u || eventindex >= HL_EVENT_MAX) + if (eventindex < 1u || eventindex >= MAX_EVENTS) { - Con_DPrintf("EV_Playback: index out of range %i\n", eventindex); + Con_DPrintf(__FUNCTION__ ": index out of range %i\n", eventindex); return; } if (!g_psv.event_precache[eventindex].pszScript) { - Con_DPrintf("EV_Playback: no event for index %i\n", eventindex); + Con_DPrintf(__FUNCTION__ ": no event for index %i\n", eventindex); return; } @@ -1358,7 +1358,7 @@ void EXT_FUNC EV_SV_Playback(int flags, int clientindex, unsigned short eventind return; if (clientindex < 0 || clientindex >= g_psvs.maxclients) - Host_Error("EV_SV_Playback: Client index %i out of range\n", clientindex); + Host_Error(__FUNCTION__ ": Client index %i out of range\n", clientindex); edict_t *pEdict = g_psvs.clients[clientindex].edict; EV_Playback(flags,pEdict, eventindex, delay, origin, angles, fparam1, fparam2, iparam1, iparam2, bparam1, bparam2); @@ -1376,7 +1376,7 @@ int SV_LookupModelIndex(const char *name) return node->val; } #else // REHLDS_OPT_PEDANTIC - for (int i = 0; i < HL_MODEL_MAX; i++) + for (int i = 0; i < MAX_MODELS; i++) { if (!g_psv.model_precache[i]) break; @@ -1394,10 +1394,10 @@ int EXT_FUNC PF_precache_model_I(const char *s) { int iOptional = 0; if (!s) - Host_Error("PF_precache_model_I: NULL pointer"); + Host_Error(__FUNCTION__ ": NULL pointer"); if (PR_IsEmptyString(s)) - Host_Error("PF_precache_model_I: Bad string '%s'", s); + Host_Error(__FUNCTION__ ": Bad string '%s'", s); if (*s == '!') { @@ -1407,7 +1407,7 @@ int EXT_FUNC PF_precache_model_I(const char *s) if (g_psv.state == ss_loading) { - for (int i = 0; i < HL_MODEL_MAX; i++) + for (int i = 0; i < MAX_MODELS; i++) { if (!g_psv.model_precache[i]) { @@ -1422,14 +1422,14 @@ int EXT_FUNC PF_precache_model_I(const char *s) g_rehlds_sv.modelsMap.put(g_psv.model_precache[i], i); #endif //REHLDS_OPT_PEDANTIC - g_psv.models[i] = Mod_ForName(s, 1, 1); + g_psv.models[i] = Mod_ForName(s, TRUE, TRUE); if (!iOptional) - g_psv.model_precache_flags[i] |= 1u; + g_psv.model_precache_flags[i] |= RES_FATALIFMISSING; return i; } - //use case-sensitive names to increase performance + // use case-sensitive names to increase performance #ifdef REHLDS_FIXES if (!Q_strcmp(g_psv.model_precache[i], s)) return i; @@ -1439,15 +1439,14 @@ int EXT_FUNC PF_precache_model_I(const char *s) #endif } Host_Error( - "PF_precache_model_I: Model '%s' failed to precache because the item count is over the %d limit.\nReduce the number of brush models and/or regular models in the map to correct this.", - s, - 512); + __FUNCTION__ ": Model '%s' failed to precache because the item count is over the %d limit.\nReduce the number of brush models and/or regular models in the map to correct this.", + s, MAX_MODELS); } else { - for (int i = 0; i < HL_MODEL_MAX; i++) + for (int i = 0; i < MAX_MODELS; i++) { - //use case-sensitive names to increase performance + // use case-sensitive names to increase performance #ifdef REHLDS_FIXES if (!Q_strcmp(g_psv.model_precache[i], s)) return i; @@ -1456,19 +1455,21 @@ int EXT_FUNC PF_precache_model_I(const char *s) return i; #endif } - Host_Error("PF_precache_model_I: '%s' Precache can only be done in spawn functions", s); + Host_Error(__FUNCTION__ ": '%s' Precache can only be done in spawn functions", s); } } #ifdef REHLDS_FIXES int EXT_FUNC PF_precache_generic_I(char *s) -// TODO: Call to Con_Printf is replaced with Host_Error in 6153 { if (!s) - Host_Error("PF_precache_generic_I: NULL pointer"); + Host_Error(__FUNCTION__ ": NULL pointer"); if (PR_IsEmptyString(s)) - Host_Error("PF_precache_generic_I: Bad string '%s'", s); + { + // TODO: Call to Con_Printf is replaced with Host_Error in 6153 + Host_Error(__FUNCTION__ ": Bad string '%s'", s); + } char resName[MAX_QPATH]; Q_strncpy(resName, s, sizeof(resName)); @@ -1492,14 +1493,15 @@ int EXT_FUNC PF_precache_generic_I(char *s) } if (g_psv.state != ss_loading) - Host_Error("PF_precache_generic_I: '%s' Precache can only be done in spawn functions", resName); + Host_Error(__FUNCTION__ ": '%s' Precache can only be done in spawn functions", resName); if (resCount >= ARRAYSIZE(g_rehlds_sv.precachedGenericResourceNames)) + { Host_Error( - "PF_precache_generic_I: Generic item '%s' failed to precache because the item count is over the %d limit.\n\ + __FUNCTION__ ": Generic item '%s' failed to precache because the item count is over the %d limit.\n\ Reduce the number of brush models and/or regular models in the map to correct this.", - resName, - ARRAYSIZE(g_rehlds_sv.precachedGenericResourceNames)); + resName, ARRAYSIZE(g_rehlds_sv.precachedGenericResourceNames)); + } Q_strcpy(g_rehlds_sv.precachedGenericResourceNames[resCount], resName); @@ -1507,17 +1509,19 @@ Reduce the number of brush models and/or regular models in the map to correct th } #else // REHLDS_FIXES int EXT_FUNC PF_precache_generic_I(char *s) -// TODO: Call to Con_Printf is replaced with Host_Error in 6153 { if (!s) - Host_Error("PF_precache_generic_I: NULL pointer"); + Host_Error(__FUNCTION__ ": NULL pointer"); if (PR_IsEmptyString(s)) - Host_Error("PF_precache_generic_I: Bad string '%s'", s); + { + // TODO: Call to Con_Printf is replaced with Host_Error in 6153 + Host_Error(__FUNCTION__ ": Bad string '%s'", s); + } if (g_psv.state == ss_loading) { - for (int i = 0; i < HL_GENERIC_MAX; i++) + for (int i = 0; i < MAX_GENERIC; i++) { if (!g_psv.generic_precache[i]) { @@ -1529,18 +1533,18 @@ int EXT_FUNC PF_precache_generic_I(char *s) return i; } Host_Error( - "PF_precache_generic_I: Generic item '%s' failed to precache because the item count is over the %d limit.\nReduce the number of brush models and/or regular models in the map to correct this.", - s, - HL_GENERIC_MAX); + __FUNCTION__ ": Generic item '%s' failed to precache because the item count is over the %d limit.\nReduce the number of brush models and/or regular models in the map to correct this.", + s, MAX_GENERIC + ); } else { - for (int i = 0; i < HL_GENERIC_MAX; i++) + for (int i = 0; i < MAX_GENERIC; i++) { if (!Q_stricmp(g_psv.generic_precache[i], s)) return i; } - Host_Error("PF_precache_generic_I: '%s' Precache can only be done in spawn functions", s); + Host_Error(__FUNCTION__ ": '%s' Precache can only be done in spawn functions", s); } } #endif // REHLDS_FIXES @@ -1975,13 +1979,13 @@ edict_t* EXT_FUNC PF_CreateFakeClient_I(const char *netname) Q_strncpy(fakeclient->name, netname, sizeof(fakeclient->name) - 1); fakeclient->name[sizeof(fakeclient->name) - 1] = 0; - fakeclient->active = 1; - fakeclient->spawned = 1; - fakeclient->fully_connected = 1; - fakeclient->connected = 1; - fakeclient->fakeclient = 1; + fakeclient->active = TRUE; + fakeclient->spawned = TRUE; + fakeclient->fully_connected = TRUE; + fakeclient->connected = TRUE; + fakeclient->fakeclient = TRUE; fakeclient->userid = g_userid++; - fakeclient->uploading = 0; + fakeclient->uploading = FALSE; fakeclient->edict = ent; ent->v.netname = (size_t)fakeclient->name - (size_t)pr_strings; ent->v.pContainingEntity = ent; diff --git a/rehlds/engine/server.h b/rehlds/engine/server.h index aaf0904..b46e2f3 100644 --- a/rehlds/engine/server.h +++ b/rehlds/engine/server.h @@ -37,7 +37,6 @@ // TODO: I think this defines must be in /common/ #define NUM_EDICTS 900 #define MAX_NAME 32 -#define MAX_PACKET_ENTITIES 256 #include "custom_int.h" #include "crc.h" @@ -86,13 +85,6 @@ #define RESOURCE_MAX_COUNT (1 << RESOURCE_INDEX_BITS) #endif // REHLDS_FIXES -#define HL_SOUND_MAX 512 -#define HL_SOUND_HASHLOOKUP_SIZE (HL_SOUND_MAX * 2 - 1) - -#define HL_MODEL_MAX 512 -#define HL_GENERIC_MAX 512 -#define HL_EVENT_MAX 256 - typedef enum redirect_e { RD_NONE = 0, @@ -127,15 +119,15 @@ typedef struct server_s int num_resources; consistency_t consistency_list[MAX_CONSISTENCY_LIST]; int num_consistency; - const char *model_precache[HL_MODEL_MAX]; - struct model_s *models[HL_MODEL_MAX]; - unsigned char model_precache_flags[HL_MODEL_MAX]; - struct event_s event_precache[HL_EVENT_MAX]; - const char *sound_precache[HL_SOUND_MAX]; - short int sound_precache_hashedlookup[HL_SOUND_HASHLOOKUP_SIZE]; + const char *model_precache[MAX_MODELS]; + struct model_s *models[MAX_MODELS]; + unsigned char model_precache_flags[MAX_MODELS]; + struct event_s event_precache[MAX_EVENTS]; + const char *sound_precache[MAX_SOUNDS]; + short int sound_precache_hashedlookup[MAX_SOUNDS_HASHLOOKUP_SIZE]; qboolean sound_precache_hashedlookup_built; - const char *generic_precache[HL_GENERIC_MAX]; - char generic_precache_names[HL_GENERIC_MAX][64]; + const char *generic_precache[MAX_GENERIC]; + char generic_precache_names[MAX_GENERIC][64]; int num_generic_names; char *lightstyles[MAX_LIGHTSTYLES]; int num_edicts; @@ -158,11 +150,11 @@ typedef struct server_s struct rehlds_server_t { - //map for sv.model_precache (for faster resolving of model index by its name) + // map for sv.model_precache (for faster resolving of model index by its name) #if defined(REHLDS_FIXES) - CStringKeyStaticMap modelsMap; //case-sensitive keys for better performance + CStringKeyStaticMap modelsMap; // case-sensitive keys for better performance #elif defined(REHLDS_OPT_PEDANTIC) - CICaseStringKeyStaticMap modelsMap; //use case-insensitive keys to conform original engine's behavior + CICaseStringKeyStaticMap modelsMap; // use case-insensitive keys to conform original engine's behavior #endif #ifdef REHLDS_FIXES diff --git a/rehlds/engine/sv_main.cpp b/rehlds/engine/sv_main.cpp index 12bb525..7a6716d 100644 --- a/rehlds/engine/sv_main.cpp +++ b/rehlds/engine/sv_main.cpp @@ -692,12 +692,12 @@ void SV_FindModelNumbers(void) { sv_playermodel = -1; - for (int i = 0; i < HL_MODEL_MAX; i++) + for (int i = 0; i < MAX_MODELS; i++) { if (!g_psv.model_precache[i]) break; - //use case-sensitive names to increase performance + // use case-sensitive names to increase performance #ifdef REHLDS_FIXES if (!Q_stricmp(g_psv.model_precache[i], "models/player.mdl")) sv_playermodel = i; @@ -869,7 +869,7 @@ int EXT_FUNC SV_LookupSoundIndex(const char *sample) { if (g_psv.state == ss_loading) { - for (index = 1; index < HL_SOUND_MAX && g_psv.sound_precache[index]; index++) // TODO: why from 1? + for (index = 1; index < MAX_SOUNDS && g_psv.sound_precache[index]; index++) // TODO: why from 1? { if (!Q_stricmp(sample, g_psv.sound_precache[index])) return index; @@ -887,7 +887,7 @@ int EXT_FUNC SV_LookupSoundIndex(const char *sample) return g_psv.sound_precache_hashedlookup[index]; index++; - if (index >= HL_SOUND_HASHLOOKUP_SIZE) + if (index >= MAX_SOUNDS_HASHLOOKUP_SIZE) index = 0; if (index == starting_index) return 0; @@ -899,7 +899,7 @@ void SV_BuildHashedSoundLookupTable(void) { Q_memset(g_psv.sound_precache_hashedlookup, 0, sizeof(g_psv.sound_precache_hashedlookup)); - for (int sound_num = 0; sound_num < HL_SOUND_MAX; sound_num++) + for (int sound_num = 0; sound_num < MAX_SOUNDS; sound_num++) { if (!g_psv.sound_precache[sound_num]) break; @@ -912,14 +912,14 @@ void SV_BuildHashedSoundLookupTable(void) void SV_AddSampleToHashedLookupTable(const char *pszSample, int iSampleIndex) { - int starting_index = SV_HashString(pszSample, HL_SOUND_HASHLOOKUP_SIZE); + int starting_index = SV_HashString(pszSample, MAX_SOUNDS_HASHLOOKUP_SIZE); int index = starting_index; while (g_psv.sound_precache_hashedlookup[index]) { index++; hashstrings_collisions++; - if (index >= HL_SOUND_HASHLOOKUP_SIZE) + if (index >= MAX_SOUNDS_HASHLOOKUP_SIZE) index = 0; if (index == starting_index) @@ -1413,8 +1413,8 @@ void SV_WriteSpawn(sizebuf_t *msg) #ifdef REHLDS_FIXES // do it before PutInServer to allow mods send messages from forward - SZ_Clear( &host_client->netchan.message ); - SZ_Clear( &host_client->datagram ); + SZ_Clear(&host_client->netchan.message); + SZ_Clear(&host_client->datagram); #endif // REHLDS_FIXES if (g_psv.loadgame) @@ -1492,13 +1492,13 @@ void SV_WriteSpawn(sizebuf_t *msg) MSG_WriteByte(msg, svc_signonnum); MSG_WriteByte(msg, 1); - host_client->connecttime = 0.0; - host_client->ignorecmdtime = 0.0; - host_client->cmdtime = 0.0; - host_client->active = TRUE; - host_client->spawned = TRUE; - host_client->connected = TRUE; - host_client->fully_connected = FALSE; + host_client->connecttime = 0.0; + host_client->ignorecmdtime = 0.0; + host_client->cmdtime = 0.0; + host_client->active = TRUE; + host_client->spawned = TRUE; + host_client->connected = TRUE; + host_client->fully_connected = FALSE; #ifdef REHLDS_FIXES g_GameClients[host_client - g_psvs.clients]->SetSpawnedOnce(true); @@ -4976,7 +4976,7 @@ int SV_ModelIndex(const char *name) return node->val; } #else - for (int i = 0; i < HL_MODEL_MAX; i++) + for (int i = 0; i < MAX_MODELS; i++) { if (!g_psv.model_precache[i]) break; @@ -5196,7 +5196,7 @@ void SV_CreateResourceList(void) } #else // REHLDS_FIXES #ifdef REHLDS_CHECKS - for (i = 1, s = &g_psv.generic_precache[1]; i < HL_GENERIC_MAX && *s != NULL; i++, s++) + for (i = 1, s = &g_psv.generic_precache[1]; i < MAX_GENERIC && *s != NULL; i++, s++) #else // REHLDS_CHECKS for (i = 1, s = &g_psv.generic_precache[1]; *s != NULL; i++, s++) #endif // REHLDS_CHECKS @@ -5211,7 +5211,7 @@ void SV_CreateResourceList(void) #endif // REHLDS_FIXES #ifdef REHLDS_CHECKS - for (i = 1, s = &g_psv.sound_precache[1]; i < HL_SOUND_MAX && *s != NULL; i++, s++) + for (i = 1, s = &g_psv.sound_precache[1]; i < MAX_SOUNDS && *s != NULL; i++, s++) #else // REHLDS_CHECKS for (i = 1, s = &g_psv.sound_precache[1]; *s != NULL; i++, s++) #endif // REHLDS_CHECKS @@ -5233,7 +5233,7 @@ void SV_CreateResourceList(void) } } #ifdef REHLDS_CHECKS - for (i = 1, s = &g_psv.model_precache[1]; i < HL_MODEL_MAX && *s != NULL; i++, s++) + for (i = 1, s = &g_psv.model_precache[1]; i < MAX_MODELS && *s != NULL; i++, s++) #else // REHLDS_CHECKS for (i = 1, s = &g_psv.model_precache[1]; *s != NULL; i++, s++) #endif // REHLDS_CHECKS @@ -5248,7 +5248,7 @@ void SV_CreateResourceList(void) for (i = 0; i < sv_decalnamecount; i++) SV_AddResource(t_decal, sv_decalnames[i].name, Draw_DecalSize(i), 0, i); - for (i = 1; i < HL_EVENT_MAX; i++) + for (i = 1; i < MAX_EVENTS; i++) { ep = &g_psv.event_precache[i]; if (!ep->filename) @@ -5262,7 +5262,7 @@ void SV_ClearCaches(void) { int i; event_t *ep; - for (i = 1; i < HL_EVENT_MAX; i++) + for (i = 1; i < MAX_EVENTS; i++) { ep = &g_psv.event_precache[i]; if (ep->filename == NULL) @@ -5488,7 +5488,6 @@ NOXREF void SV_ReconnectAllClients(void) SV_DropClient(client, FALSE, message); } } - } void SetCStrikeFlags(void) diff --git a/rehlds/engine/sv_move.cpp b/rehlds/engine/sv_move.cpp index fee1306..c4646cf 100644 --- a/rehlds/engine/sv_move.cpp +++ b/rehlds/engine/sv_move.cpp @@ -36,24 +36,24 @@ static int c_yes = 0; static int c_no = 0; -#else //HOOK_ENGINE +#else // HOOK_ENGINE int c_yes; int c_no; -#endif //HOOK_ENGINE +#endif // HOOK_ENGINE qboolean SV_CheckBottom(edict_t *ent) { vec3_t mins; vec3_t maxs; vec3_t start; - vec3_t stop; // 29 - trace_t trace; // 30 - int x; // 31 - int y; // 31 - float mid; // 32 - float bottom; // 32 + vec3_t stop; + trace_t trace; + int x; + int y; + float mid; + float bottom; qboolean monsterClip = (ent->v.flags & FL_MONSTERCLIP) ? 1 : 0; _VectorAdd(ent->v.origin, ent->v.mins, mins); diff --git a/rehlds/engine/sv_upld.cpp b/rehlds/engine/sv_upld.cpp index 1ca5889..351e615 100644 --- a/rehlds/engine/sv_upld.cpp +++ b/rehlds/engine/sv_upld.cpp @@ -426,10 +426,10 @@ void SV_ParseResourceList(client_t *pSenderClient) resource->nDownloadSize > 1024 * 1024 * 1024) // FIXME: Are they gone crazy??! { #ifdef REHLDS_FIXES - SV_ClearResourceLists( host_client ); + SV_ClearResourceLists(host_client); #else // REHLDS_FIXES - SV_ClearResourceList( &host_client->resourcesneeded ); - SV_ClearResourceList( &host_client->resourcesonhand ); + SV_ClearResourceList(&host_client->resourcesneeded); + SV_ClearResourceList(&host_client->resourcesonhand); #endif // REHLDS_FIXES return; } @@ -488,14 +488,13 @@ void SV_ParseResourceList(client_t *pSenderClient) Con_DPrintf("----------------------\n"); int bytestodownload = SV_EstimateNeededResources(); - if (bytestodownload > sv_max_upload.value * 1024 * 1024) { #ifdef REHLDS_FIXES - SV_ClearResourceLists( host_client ); + SV_ClearResourceLists(host_client); #else // REHLDS_FIXES - SV_ClearResourceList( &host_client->resourcesneeded ); - SV_ClearResourceList( &host_client->resourcesonhand ); + SV_ClearResourceList(&host_client->resourcesneeded); + SV_ClearResourceList(&host_client->resourcesonhand); #endif //REHLDS_FIXES return; } diff --git a/rehlds/engine/sv_user.cpp b/rehlds/engine/sv_user.cpp index bbc8ef8..4aef345 100644 --- a/rehlds/engine/sv_user.cpp +++ b/rehlds/engine/sv_user.cpp @@ -1533,7 +1533,6 @@ void SV_ParseMove(client_t *pSenderClient) if (!g_psv.active || !(host_client->active || host_client->spawned)) return; - if (msg_badread) { Con_Printf("Client %s:%s sent a bogus command packet\n", host_client->name, NET_AdrToString(host_client->netchan.remote_address)); @@ -1807,7 +1806,7 @@ void SV_SendEnts_f(void) { if (host_client->connected) { - host_client->fully_connected = 1; + host_client->fully_connected = TRUE; #ifdef REHLDS_FIXES // See SV_CheckFile function diff --git a/rehlds/engine/sys_dll.cpp b/rehlds/engine/sys_dll.cpp index f507bce..0615f1d 100644 --- a/rehlds/engine/sys_dll.cpp +++ b/rehlds/engine/sys_dll.cpp @@ -428,7 +428,7 @@ NOBODY void Sys_DebugOutStraight(const char *pStr); //{ //} -void __declspec(noreturn) Sys_Error(const char *error, ...) +void NORETURN Sys_Error(const char *error, ...) { va_list argptr; char text[1024]; diff --git a/rehlds/engine/sys_dll.h b/rehlds/engine/sys_dll.h index 1d9e368..f4fddb9 100644 --- a/rehlds/engine/sys_dll.h +++ b/rehlds/engine/sys_dll.h @@ -160,7 +160,7 @@ NOBODY void MaskExceptions(void); NOBODY void Sys_Init(void); NOXREF void Sys_Sleep(int msec); NOBODY void Sys_DebugOutStraight(const char *pStr); -NOBODY void __declspec(noreturn) Sys_Error(const char *error, ...); +NOBODY void NORETURN Sys_Error(const char *error, ...); NOXREF void Sys_Warning(const char *pszWarning, ...); void Sys_Printf(const char *fmt, ...); void Sys_Quit(void); diff --git a/rehlds/engine/world.cpp b/rehlds/engine/world.cpp index e5229c3..0ee80ee 100644 --- a/rehlds/engine/world.cpp +++ b/rehlds/engine/world.cpp @@ -160,11 +160,8 @@ struct hull_s *SV_HullForBsp(edict_t *ent, const vec_t *mins, const vec_t *maxs, model_t *model; hull_t *hull; - model = g_psv.models[ent->v.modelindex]; - if (!model) - Sys_Error("Hit a %s with no model (%s)", &pr_strings[ent->v.classname], &pr_strings[ent->v.model]); - - if (model->type) + model = Mod_Handle(ent->v.modelindex); + if (!model || model->type != mod_brush) Sys_Error("Hit a %s with no model (%s)", &pr_strings[ent->v.classname], &pr_strings[ent->v.model]); float xSize = maxs[0] - mins[0]; @@ -310,7 +307,6 @@ void SV_UnlinkEdict(edict_t *ent) void SV_TouchLinks(edict_t *ent, areanode_t *node) { edict_t *touch; - model_t *pModel; link_t *next; for (link_t *l = node->trigger_edicts.next; l != &node->trigger_edicts; l = next) @@ -347,9 +343,7 @@ void SV_TouchLinks(edict_t *ent, areanode_t *node) && ent->v.absmax[1] >= touch->v.absmin[1] && ent->v.absmax[2] >= touch->v.absmin[2]) { - pModel = g_psv.models[touch->v.modelindex]; - - if (pModel && pModel->type == mod_brush) + if (Mod_GetType(touch->v.modelindex) == mod_brush) { vec3_t offset; hull_t *hull = SV_HullForBsp(touch, ent->v.mins, ent->v.maxs, offset); @@ -560,40 +554,39 @@ void SV_LinkEdict(edict_t *ent, qboolean touch_triggers) if (ent->v.solid == SOLID_NOT && ent->v.skin >= -1) return; - if (ent->v.solid != SOLID_BSP || g_psv.models[ent->v.modelindex] || Q_strlen(&pr_strings[ent->v.model])) - { - node = sv_areanodes; - while (1) - { - if (node->axis == -1) - break; - - if (ent->v.absmin[node->axis] <= node->dist) - { - if (ent->v.absmax[node->axis] >= node->dist) - break; - node = node->children[1]; - } - else - { - node = node->children[0]; - } - } - - InsertLinkBefore(&ent->area, (ent->v.solid == SOLID_TRIGGER) ? &node->trigger_edicts : &node->solid_edicts); - if (touch_triggers) - { - if (!iTouchLinkSemaphore) - { - iTouchLinkSemaphore = 1; - SV_TouchLinks(ent, sv_areanodes); - iTouchLinkSemaphore = 0; - } - } - } - else + if (ent->v.solid == SOLID_BSP && !Mod_Handle(ent->v.modelindex) && Q_strlen(&pr_strings[ent->v.model]) <= 0) { Con_DPrintf("Inserted %s with no model\n", &pr_strings[ent->v.classname]); + return; + } + + node = sv_areanodes; + while (1) + { + if (node->axis == -1) + break; + + if (ent->v.absmin[node->axis] <= node->dist) + { + if (ent->v.absmax[node->axis] >= node->dist) + break; + node = node->children[1]; + } + else + { + node = node->children[0]; + } + } + + InsertLinkBefore(&ent->area, (ent->v.solid == SOLID_TRIGGER) ? &node->trigger_edicts : &node->solid_edicts); + if (touch_triggers) + { + if (!iTouchLinkSemaphore) + { + iTouchLinkSemaphore = 1; + SV_TouchLinks(ent, sv_areanodes); + iTouchLinkSemaphore = 0; + } } } @@ -625,7 +618,6 @@ int SV_LinkContents(areanode_t *node, const vec_t *pos) link_t *l; link_t *next; edict_t *touch; - model_t *pModel; hull_t *hull; vec3_t localPosition; vec3_t offset; @@ -654,9 +646,8 @@ int SV_LinkContents(areanode_t *node, const vec_t *pos) continue; } } - pModel = g_psv.models[touch->v.modelindex]; - if (pModel - && !pModel->type + + if (Mod_GetType(touch->v.modelindex) == mod_brush && pos[0] <= (double)touch->v.absmax[0] && pos[1] <= (double)touch->v.absmax[1] && pos[2] <= (double)touch->v.absmax[2] @@ -1051,7 +1042,12 @@ void SV_SingleClipMoveToEntity(edict_t *ent, const vec_t *start, const vec_t *mi trace->endpos[0] = end[0]; trace->endpos[1] = end[1]; trace->endpos[2] = end[2]; + +#ifdef REHLDS_FIXES + if (Mod_GetType(ent->v.modelindex) == mod_studio) +#else if (g_psv.models[ent->v.modelindex]->type == mod_studio) +#endif // REHLDS_FIXES { hull = SV_HullForStudioModel(ent, mins, maxs, offset, &numhulls); } diff --git a/rehlds/public/commonmacros.h b/rehlds/public/commonmacros.h index d6a6aec..288d00d 100644 --- a/rehlds/public/commonmacros.h +++ b/rehlds/public/commonmacros.h @@ -23,8 +23,8 @@ #define ARRAYSIZE(p) (sizeof(p)/sizeof(p[0])) // Keeps clutter down a bit, when using a float as a bit-vector -#define SETBITS(flBitVector, bits) ((flBitVector) = (int)(flBitVector) | (bits)) -#define CLEARBITS(flBitVector, bits) ((flBitVector) = (int)(flBitVector) & ~(bits)) -#define FBitSet(flBitVector, bit) ((flBitVector) & (bit)) +#define SetBits(flBitVector, bits) ((flBitVector) = (int)(flBitVector) | (bits)) +#define ClearBits(flBitVector, bits) ((flBitVector) = (int)(flBitVector) & ~(bits)) +#define FBitSet(flBitVector, bit) ((int)(flBitVector) & (bit)) #endif // COMMONMACROS_H diff --git a/rehlds/public/rehlds/crc32c.h b/rehlds/public/rehlds/crc32c.h index d3a78a3..55bed92 100644 --- a/rehlds/public/rehlds/crc32c.h +++ b/rehlds/public/rehlds/crc32c.h @@ -10,12 +10,12 @@ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with this program; if not, see . -*/ -#pragma once -#include "archtypes.h" - -extern uint32 crc32c_t8_nosse(uint32 iCRC, uint8 u8); -extern uint32 crc32c_t8_sse(uint32 iCRC, uint8 u8); +*/ +#pragma once +#include "archtypes.h" + +extern uint32 crc32c_t8_nosse(uint32 iCRC, uint8 u8); +extern uint32 crc32c_t8_sse(uint32 iCRC, uint8 u8); extern uint32 crc32c_t_nosse(uint32 iCRC, const uint8 *buf, int len); extern uint32 crc32c_t_sse(uint32 iCRC, const uint8 *buf, unsigned int len); extern uint32 crc32c_t(uint32 iCRC, const uint8 *buf, unsigned int len); diff --git a/rehlds/public/rehlds/hookchains.h b/rehlds/public/rehlds/hookchains.h index df79110..a31109d 100644 --- a/rehlds/public/rehlds/hookchains.h +++ b/rehlds/public/rehlds/hookchains.h @@ -50,7 +50,7 @@ public: // Specifies priorities for hooks call order in the chain. // For equal priorities first registered hook will be called first. -enum HookChainPriority : int +enum HookChainPriority { HC_PRIORITY_UNINTERRUPTABLE = 255, // Hook will be called before other hooks. HC_PRIORITY_HIGH = 192, // Hook will be called before hooks with default priority. diff --git a/rehlds/public/rehlds/model.h b/rehlds/public/rehlds/model.h index beee2db..7837482 100644 --- a/rehlds/public/rehlds/model.h +++ b/rehlds/public/rehlds/model.h @@ -292,6 +292,7 @@ typedef struct aliashdr_s typedef enum modtype_e { + mod_bad = -1, mod_brush, mod_sprite, mod_alias, diff --git a/rehlds/public/rehlds/osconfig.h b/rehlds/public/rehlds/osconfig.h index e6e95b1..cf6a551 100644 --- a/rehlds/public/rehlds/osconfig.h +++ b/rehlds/public/rehlds/osconfig.h @@ -103,6 +103,7 @@ #define HIDDEN #define NOINLINE __declspec(noinline) #define ALIGN16 __declspec(align(16)) + #define NORETURN __declspec(noreturn) #define FORCE_STACK_ALIGN //inline bool SOCKET_FIONBIO(SOCKET s, int m) { return (ioctlsocket(s, FIONBIO, (u_long*)&m) == 0); } @@ -148,6 +149,7 @@ #define HIDDEN __attribute__((visibility("hidden"))) #define NOINLINE __attribute__((noinline)) #define ALIGN16 __attribute__((aligned(16))) + #define NORETURN __attribute__((noreturn)) #define FORCE_STACK_ALIGN __attribute__((force_align_arg_pointer)) //inline bool SOCKET_FIONBIO(SOCKET s, int m) { return (ioctl(s, FIONBIO, (int*)&m) == 0); } diff --git a/rehlds/public/rehlds/studio.h b/rehlds/public/rehlds/studio.h index 5c0ec15..940f5f9 100644 --- a/rehlds/public/rehlds/studio.h +++ b/rehlds/public/rehlds/studio.h @@ -310,10 +310,13 @@ typedef struct } mstudiotrivert_t; #endif +#define STUDIO_DYNAMIC_LIGHT 0x0100 // dynamically get lighting from floor or ceil (flying monsters) +#define STUDIO_TRACE_HITBOX 0x0200 // always use hitbox trace instead of bbox + // lighting options #define STUDIO_NF_FLATSHADE 0x0001 #define STUDIO_NF_CHROME 0x0002 -#define STUDIO_NF_FULLBRIGHT 0x0004 +#define STUDIO_NF_FULLBRIGHT 0x0004 #define STUDIO_NF_NOMIPS 0x0008 #define STUDIO_NF_ALPHA 0x0010 #define STUDIO_NF_ADDITIVE 0x0020 @@ -321,7 +324,7 @@ typedef struct // motion flags #define STUDIO_X 0x0001 -#define STUDIO_Y 0x0002 +#define STUDIO_Y 0x0002 #define STUDIO_Z 0x0004 #define STUDIO_XR 0x0008 #define STUDIO_YR 0x0010 diff --git a/rehlds/rehlds/platform.cpp b/rehlds/rehlds/platform.cpp index 19b10ed..f59f479 100644 --- a/rehlds/rehlds/platform.cpp +++ b/rehlds/rehlds/platform.cpp @@ -198,7 +198,7 @@ void CSimplePlatform::SteamAPI_UnregisterCallback(CCallbackBase *pCallback) ::SteamAPI_UnregisterCallback(pCallback); } -void __declspec(noreturn) rehlds_syserror(const char* fmt, ...) { +void NORETURN rehlds_syserror(const char* fmt, ...) { va_list argptr; static char string[8192]; diff --git a/rehlds/rehlds/platform.h b/rehlds/rehlds/platform.h index 0655ad6..14c4d3a 100644 --- a/rehlds/rehlds/platform.h +++ b/rehlds/rehlds/platform.h @@ -122,4 +122,4 @@ public: static void set(IReHLDSPlatform* p); }; -extern void __declspec(noreturn) rehlds_syserror(const char* fmt, ...); +extern void NORETURN rehlds_syserror(const char* fmt, ...);