sm-zombiereloaded-3/src/zr/models.inc

179 lines
5.7 KiB
PHP
Raw Normal View History

/*
* ============================================================================
*
2008-10-04 22:59:11 +02:00
* Zombie:Reloaded
*
* File: models.inc
* Type: Core
* Description: Model validation.
*
* ============================================================================
2008-10-04 22:59:11 +02:00
*/
/**
* Maximum folder depth a model file can be located.
*/
#define MODELS_PATH_MAX_DEPTH 8
2008-10-04 22:59:11 +02:00
/**
* Maximum string length of a folder a model file is located under.
*/
#define MODELS_PATH_DIR_MAX_LENGTH 32
2008-10-04 22:59:11 +02:00
/**
* Array that stores a list of validated models.
*
* @redir config.inc
*/
/**
* Prepare all model/download data.
*/
ModelsLoad()
{
// Get models file path.
decl String:pathmodels[PLATFORM_MAX_PATH];
new bool:exists = ConfigGetCvarFilePath(CVAR_CONFIG_PATH_MODELS, pathmodels);
// Register config info.
ConfigRegisterConfig(ConfigModels, false, GetFunctionByName(GetMyHandle(), "ModelsOnConfigReload"), _, pathmodels, CONFIG_FILE_ALIAS_MODELS);
2008-10-04 22:59:11 +02:00
// If file doesn't exist, then log and stop.
if (!exists)
2008-10-04 22:59:11 +02:00
{
// Log failure and stop plugin.
LogPrintToLog(LOG_FORMAT_TYPE_FATALERROR, "Models", "Config Validation", "Fatal Error: Missing models file: \"%s\"", pathmodels);
2008-10-04 22:59:11 +02:00
}
// If model array exists, then destroy it.
if (arrayModelsList != INVALID_HANDLE)
2008-10-04 22:59:11 +02:00
{
CloseHandle(arrayModelsList);
2008-10-04 22:59:11 +02:00
}
arrayModelsList = ConfigLinesToArray(pathmodels);
2008-10-04 22:59:11 +02:00
// If array couldn't be created, then fail.
if (arrayModelsList == INVALID_HANDLE)
2008-10-04 22:59:11 +02:00
{
LogPrintToLog(LOG_FORMAT_TYPE_FATALERROR, "Models", "Config Validation", "Fatal Error: Error parsing \"%s\"", pathmodels);
2008-10-04 22:59:11 +02:00
}
new modelcount;
new modelvalidcount;
new modelfilecount;
2008-10-04 22:59:11 +02:00
decl String:modelbase[PLATFORM_MAX_PATH];
decl String:modelpath[PLATFORM_MAX_PATH];
decl String:modelname[MODELS_PATH_DIR_MAX_LENGTH];
decl String:modelfile[MODELS_PATH_DIR_MAX_LENGTH];
decl String:modeldiskname[MODELS_PATH_DIR_MAX_LENGTH];
decl String:modelfullpath[PLATFORM_MAX_PATH];
new String:baseexploded[MODELS_PATH_MAX_DEPTH][MODELS_PATH_DIR_MAX_LENGTH];
2008-10-04 22:59:11 +02:00
new FileType:type;
2008-10-04 22:59:11 +02:00
new models = modelcount = GetArraySize(arrayModelsList);
// x = model array index.
for (new x = 0; x < models; x++)
2008-10-04 22:59:11 +02:00
{
// Get base model path (rawline in models.txt)
GetArrayString(arrayModelsList, x, modelbase, sizeof(modelbase));
// Explode path into pieces. (separated by "/")
new strings = ExplodeString(modelbase, "/", baseexploded, MODELS_PATH_MAX_DEPTH, MODELS_PATH_DIR_MAX_LENGTH);
// Get model file name.
strcopy(modelname, sizeof(modelname), baseexploded[strings - 1]);
// Get the path to the file.
// Works by truncating original path by the length of the file name.
strcopy(modelpath, strlen(modelbase) - strlen(modelname), modelbase);
// Open dir containing model files.
new Handle:modeldir = OpenDirectory(modelpath);
// Reset model file count.
modelfilecount = 0;
while (ReadDirEntry(modeldir, modelfile, sizeof(modelfile), type))
{
// If entry isn't a file, then stop.
if (type != FileType_File)
{
continue;
}
// Find break point index in the string to get model name.
// Add one because it seems to break on the character before.
new breakpoint = FindCharInString(modelfile, '.') + 1;
strcopy(modeldiskname, breakpoint, modelfile);
// If this file doesn't match, then stop.
if (!StrEqual(modelname, modeldiskname, false))
{
continue;
}
// Format a full path string.
strcopy(modelfullpath, sizeof(modelfullpath), modelpath);
Format(modelfullpath, sizeof(modelfullpath), "%s/%s", modelfullpath, modelfile);
// Precache model file and add to downloads table.
PrecacheModel(modelfullpath);
AddFileToDownloadsTable(modelfullpath);
// Increment modelfilecount
modelfilecount++;
}
// Increment modelvalidcount if model files are valid.
if (modelfilecount)
{
modelvalidcount++;
}
else
2008-10-04 22:59:11 +02:00
{
// Remove client from array.
RemoveFromArray(arrayModelsList, x);
// Subtract one from count.
models--;
// Backtrack one index, because we deleted it out from under the loop.
x--;
// Log missing model files.
LogPrintToLog(LOG_FORMAT_TYPE_ERROR, "Models", "Config Validation", "Missing model files on server (%s)", modelbase);
2008-10-04 22:59:11 +02:00
}
}
// Log model validation info.
LogPrintToLog(LOG_FORMAT_TYPE_NORMAL, "Models", "Config Validation", "Total: %d | Successful: %d | Unsuccessful: %d", modelcount, modelvalidcount, modelcount - modelvalidcount);
// If none of the model paths are valid, then log and fail.
if (!modelvalidcount)
{
LogPrintToLog(LOG_FORMAT_TYPE_FATALERROR, "Models", "Config Validation", "Fatal Error: No usable model paths in %s", pathmodels);
}
// Set config data.
ConfigSetConfigLoaded(ConfigModels, true);
ConfigSetConfigHandle(ConfigModels, arrayModelsList);
2008-10-04 22:59:11 +02:00
}
/**
* Called when configs are being reloaded.
*
* @param config The config being reloaded. (only if 'all' is false)
*/
public ModelsOnConfigReload(ConfigFile:config)
2008-10-04 22:59:11 +02:00
{
// Reload model config.
if (config == ConfigModels)
2008-10-04 22:59:11 +02:00
{
ModelsLoad();
2008-10-04 22:59:11 +02:00
}
}