*
*/
-#include <unistd.h>
-
#include <extdll.h>
#include <dllapi.h>
#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) {
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
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);
}
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);