X-Git-Url: http://git.megabrutal.com/?p=pmprecache.git;a=blobdiff_plain;f=dllapi.cpp;h=942fc91d11d03840fbe42b52dbcaaf11ffed954e;hp=ca708792a65a08f9f70d9e247607c0ea7d14a6cb;hb=HEAD;hpb=4c13d5a18a1a52e17f22add88e8dcd13f6b702b6 diff --git a/dllapi.cpp b/dllapi.cpp index ca70879..942fc91 100644 --- a/dllapi.cpp +++ b/dllapi.cpp @@ -32,8 +32,6 @@ * */ -#include - #include #include @@ -52,18 +50,24 @@ int gmsgSayText; #define MAXLENGTH_PLAYERNAME 64 #define MAXLENGTH_MODELNAME 64 #define MAXLENGTH_MODELPATH 256 +typedef struct { + char model[MAXLENGTH_MODELPATH]; + char bmp[MAXLENGTH_MODELPATH]; + char tmdl[MAXLENGTH_MODELPATH]; +} precache_paths; + typedef struct { char playername[MAXLENGTH_PLAYERNAME]; char modelname[MAXLENGTH_MODELNAME]; - char modelpath[MAXLENGTH_MODELPATH]; + precache_paths paths; } precache_entry; #define MAX_PRECACHE_COUNT 32 precache_entry precache_list[MAX_PRECACHE_COUNT]; unsigned short int precache_count = 0; -bool playerModelFileExists(const char* path) { - return access(path, R_OK) == 0; +bool fileExists(char* path) { + return g_engfuncs.pfnGetFileSize(path) != -1; } bool addPrecacheEntry(const char* playername, const char* model) { @@ -73,11 +77,27 @@ bool addPrecacheEntry(const char* playername, const char* model) { if ((i == precache_count) && (i < MAX_PRECACHE_COUNT) && (streq != 0)) { strncpy(precache_list[i].playername, playername, MAXLENGTH_PLAYERNAME - 1); strncpy(precache_list[i].modelname, model, MAXLENGTH_MODELNAME - 1); - snprintf(precache_list[i].modelpath, MAXLENGTH_MODELPATH, "models/player/%s/%s.mdl", model, model); + // Ensure null-termination precache_list[i].playername[MAXLENGTH_PLAYERNAME - 1] = 0; precache_list[i].modelname[MAXLENGTH_MODELNAME - 1] = 0; + + snprintf(precache_list[i].paths.model, MAXLENGTH_MODELPATH, "models/player/%s/%s.mdl", model, model); + snprintf(precache_list[i].paths.bmp, MAXLENGTH_MODELPATH, "models/player/%s/%s.bmp", model, model); + snprintf(precache_list[i].paths.tmdl, MAXLENGTH_MODELPATH, "models/player/%s/%st.mdl", model, model); + + // Check if BMP exists + if (!fileExists(precache_list[i].paths.bmp)) + precache_list[i].paths.bmp[0] = 0; + + // Check if t.mdl exists, also try alternative path + if (!fileExists(precache_list[i].paths.tmdl)) { + snprintf(precache_list[i].paths.tmdl, MAXLENGTH_MODELPATH, "models/player/%s/%sT.mdl", model, model); + if (!fileExists(precache_list[i].paths.tmdl)) + precache_list[i].paths.tmdl[0] = 0; + } + precache_count++; - LOG_MESSAGE(PLID, "Precache entry %d: playername=\"%s\" modelname=\"%s\" modelpath=\"%s\"", i, precache_list[i].playername, precache_list[i].modelname, precache_list[i].modelpath); + LOG_MESSAGE(PLID, "Precache entry %d: playername=\"%s\" modelname=\"%s\" paths.model=\"%s\" paths.bmp=\"%s\" paths.tmdl=\"%s\"", i, precache_list[i].playername, precache_list[i].modelname, precache_list[i].paths.model, precache_list[i].paths.bmp, precache_list[i].paths.tmdl); return true; } else @@ -88,15 +108,15 @@ void ClientPutInServer( edict_t *pEntity ) { const char* playername = STRING(pEntity->v.netname); char* modelname = g_engfuncs.pfnInfoKeyValue( g_engfuncs.pfnGetInfoKeyBuffer( pEntity ), "model" ); char modelfile[256]; - snprintf(modelfile, sizeof(modelfile), "%s/models/player/%s/%s.mdl", &gGamedir[0], modelname, modelname); + snprintf(modelfile, sizeof(modelfile), "models/player/%s/%s.mdl", modelname, modelname); LOG_MESSAGE(PLID, "Player %s is using model %s", playername, modelname); - if (playerModelFileExists( modelfile )) { + if (fileExists( modelfile )) { LOG_MESSAGE(PLID, "Model %s is present on server", modelname); SAY(pEntity, "Your model is present on the server, it will be precached for the next round!"); if (addPrecacheEntry( playername, modelname )) LOG_MESSAGE(PLID, "Added model %s to precache list", modelname); else - LOG_MESSAGE(PLID, "Model %s will not be precached - reduntant or precache list is full", modelname); + LOG_MESSAGE(PLID, "Model %s is not added - reduntant or precache list is full", modelname); } else { LOG_MESSAGE(PLID, "Unable to precache due to FILE MISSING: %s!", modelfile); @@ -106,11 +126,33 @@ void ClientPutInServer( edict_t *pEntity ) { } void ServerActivate(edict_t *pEdictList, int edictCount, int clientMax) { + bool hasBMP, hasTMDL; LOG_MESSAGE(PLID, "Precaching %d player models", precache_count); for (int i = 0; i < precache_count; i++) { - LOG_MESSAGE(PLID, "Precaching model: %s (contributed by %s)", precache_list[i].modelname, precache_list[i].playername); - LOG_MESSAGE(PLID, "modelpath = %s", precache_list[i].modelpath); - g_engfuncs.pfnPrecacheModel( precache_list[i].modelpath ); + hasBMP = strlen(precache_list[i].paths.bmp) != 0; + hasTMDL = strlen(precache_list[i].paths.tmdl) != 0; + + const char* indicator; + if (hasBMP && hasTMDL) + indicator = "(with bmp+tmdl)"; + else if (hasBMP) + indicator = "(with bmp)"; + else if (hasTMDL) + indicator = "(with tmdl)"; + else + indicator = "(without bmp)"; + + LOG_MESSAGE(PLID, "Precaching model %s: %s (contributed by %s)", + indicator, + precache_list[i].modelname, precache_list[i].playername); + + g_engfuncs.pfnPrecacheModel(precache_list[i].paths.model); + + if (hasBMP) + g_engfuncs.pfnPrecacheGeneric(precache_list[i].paths.bmp); + + if (hasTMDL) + g_engfuncs.pfnPrecacheGeneric(precache_list[i].paths.tmdl); } precache_count = 0; RETURN_META(MRES_HANDLED);