X-Git-Url: http://git.megabrutal.com/?p=pmprecache.git;a=blobdiff_plain;f=dllapi.cpp;h=942fc91d11d03840fbe42b52dbcaaf11ffed954e;hp=acc2906f7fbdf14bc4760285ef06b3c4ed3d5467;hb=HEAD;hpb=8afb616994d88d658168baed26693e174886ecbe diff --git a/dllapi.cpp b/dllapi.cpp index acc2906..942fc91 100644 --- a/dllapi.cpp +++ b/dllapi.cpp @@ -32,8 +32,6 @@ * */ -#include - #include #include @@ -55,6 +53,7 @@ int gmsgSayText; typedef struct { char model[MAXLENGTH_MODELPATH]; char bmp[MAXLENGTH_MODELPATH]; + char tmdl[MAXLENGTH_MODELPATH]; } precache_paths; typedef struct { @@ -67,10 +66,8 @@ typedef struct { precache_entry precache_list[MAX_PRECACHE_COUNT]; unsigned short int precache_count = 0; -bool fileExists(const char* path) { - char fullpath[256]; - snprintf(fullpath, sizeof(fullpath), "%s/%s", &gGamedir[0], path); - return access(fullpath, R_OK) == 0; +bool fileExists(char* path) { + return g_engfuncs.pfnGetFileSize(path) != -1; } bool addPrecacheEntry(const char* playername, const char* model) { @@ -86,9 +83,21 @@ bool addPrecacheEntry(const char* playername, const char* model) { 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\" paths.model=\"%s\" paths.bmp=\"%s\"", i, precache_list[i].playername, precache_list[i].modelname, precache_list[i].paths.model, precache_list[i].paths.bmp); + 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 @@ -107,7 +116,7 @@ void ClientPutInServer( edict_t *pEntity ) { 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); @@ -117,16 +126,33 @@ void ClientPutInServer( edict_t *pEntity ) { } void ServerActivate(edict_t *pEdictList, int edictCount, int clientMax) { - bool hasBMP; + bool hasBMP, hasTMDL; LOG_MESSAGE(PLID, "Precaching %d player models", precache_count); for (int i = 0; i < precache_count; i++) { - hasBMP = fileExists(precache_list[i].paths.bmp); + 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)", - hasBMP ? "(with bmp)" : "(without bmp)", + 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);