Correct misleading message
[pmprecache.git] / dllapi.cpp
index ca708792a65a08f9f70d9e247607c0ea7d14a6cb..942fc91d11d03840fbe42b52dbcaaf11ffed954e 100644 (file)
@@ -32,8 +32,6 @@
  *
  */
 
-#include <unistd.h>
-
 #include <extdll.h>
 
 #include <dllapi.h>
@@ -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);