Code:
#include <amxmodx>
#include <amxmisc>
#include <nvault>
#define INI_FILENAME "myskins.ini"
#define VAULT_FILENAME "myskins"
enum enumSkinInformation {
_NAME[32],
_FILENAME[128]
}
new Trie:ghSkinInformation;
new Array:ghAllSkins;
new Array:ghPlayerSkins[33];
new ghSkinsVault;
new ghPlayerVault;
public plugin_init() {
register_plugin("Test Plugin 1", "1.0", "[ --{-@ ]");
}
stock AddSkinToPlayer(id, SkinID, SaveToVault = 1) {
if ( PlayerHasSkin(id, SkinID) )
return 0;
if ( ! IsSkinIDValid(SkinID) )
return 0;
ArrayPushCell(ghPlayerSkins[id], SkinID);
if ( SaveToVault )
SavePlayerSkinsToVault(id);
return 1;
}
stock PlayerHasSkin(id, SkinID) {
new NumSkins = ArraySize(ghPlayerSkins[id]);
for ( new i ; i < NumSkins ; i++ ) {
if ( ArrayGetCell(ghPlayerSkins[id], i) == SkinID )
return 1;
}
return 0;
}
stock SavePlayerSkinsToVault(id) {
new szSteamID[32];
get_user_authid(id, szSteamID, charsmax(szSteamID));
new szTemp[512], len;
new NumSkins = ArraySize(ghPlayerSkins[id]);
for ( new i ; i < NumSkins ; i++ )
len += formatex(szTemp[len], charsmax(szTemp) - len, "%d ", ArrayGetCell(ghPlayerSkins[id], i));
nvault_set(ghPlayerVault, szSteamID, szTemp);
}
stock IsSkinIDValid(SkinID) {
new szKey[32];
num_to_str(SkinID, szKey, charsmax(szKey));
return TrieKeyExists(ghSkinInformation, szKey);
}
stock GetSkinInfo(SkinID, SkinInformation[enumSkinInformation]) {
new szKey[32];
num_to_str(SkinID, szKey, charsmax(szKey));
if ( ! TrieKeyExists(ghSkinInformation, szKey) )
return 0;
TrieGetArray(ghSkinInformation, szKey, SkinInformation, enumSkinInformation);
return 1;
}
public client_authorized(id) {
new szData[512], szTemp[32], szSteamID[32];
ghPlayerSkins[id] = ArrayCreate();
get_user_authid(id, szSteamID, charsmax(szSteamID));
nvault_get(ghPlayerVault, szSteamID, szData, charsmax(szData));
if ( ! szData[0] )
return;
do {
strbreak(szData, szTemp, charsmax(szTemp), szData, charsmax(szData));
ArrayPushCell(ghPlayerSkins[id], str_to_num(szTemp));
} while ( szData[0] );
}
public client_disconnect(id)
ArrayDestroy(ghPlayerSkins[id]);
public plugin_precache() {
new szFilename[128];
get_configsdir(szFilename, charsmax(szFilename));
add(szFilename, charsmax(szFilename), "/");
add(szFilename, charsmax(szFilename), INI_FILENAME);
new hFile = fopen(szFilename, "rt");
if ( ! hFile )
CreateNewIni(szFilename);
ghSkinInformation = TrieCreate()
ghAllSkins = ArrayCreate();
new szData[512], szKey[32], tempID;
new tempSkinInformation[enumSkinInformation];
while ( !feof(hFile) ) {
fgets(hFile, szData, charsmax(szData));
trim(szData);
if ( szData[0] == ';' || ( szData[0] == '/' && szData[1] == '/' ) )
continue;
parse(szData, tempSkinInformation[_FILENAME], charsmax(tempSkinInformation[_FILENAME]), tempSkinInformation[_NAME], charsmax(tempSkinInformation[_NAME]));
if ( ! file_exists(tempSkinInformation[_FILENAME]) ) {
server_print("I can't find the file ^"%s^".", tempSkinInformation[_FILENAME]);
continue;
}
tempID = GetSkinUniqueID(tempSkinInformation[_FILENAME]);
ArrayPushCell(ghAllSkins, tempID)
num_to_str(tempID, szKey, charsmax(szKey));
TrieSetArray(ghSkinInformation, szKey, tempSkinInformation, enumSkinInformation);
precache_model(tempSkinInformation[_FILENAME]);
}
fclose(hFile);
if ( ! ArraySize(ghAllSkins) )
ExitPluginWithError("I can't find any valid skins in the ini file.");
}
public plugin_end() {
ArrayDestroy(ghAllSkins);
TrieDestroy(ghSkinInformation);
nvault_close(ghSkinsVault);
nvault_close(ghPlayerVault);
}
CreateNewIni(szFilename[]) {
new hFile = fopen(szFilename, "wt");
if ( ! hFile )
ExitPluginWithError("I have failed to create the ini file.");
fprintf(hFile, "; Default format of file...");
fclose(hFile);
ExitPluginWithError("My ini file is empty.");
}
GetSkinUniqueID(szSkinFilename[]) {
if ( ! ghSkinsVault )
ghSkinsVault = nvault_open(VAULT_FILENAME);
static NextUniqueID;
new szTemp[32];
if ( ! NextUniqueID ) {
NextUniqueID = nvault_get(ghSkinsVault, "COUNTER");
if ( ! NextUniqueID ) {
nvault_set(ghSkinsVault, "COUNTER", "1");
NextUniqueID = 1;
}
}
new Result = nvault_get(ghSkinsVault, szSkinFilename);
if ( ! Result ) {
num_to_str(NextUniqueID, szTemp, charsmax(szTemp));
nvault_set(ghSkinsVault, szSkinFilename, szTemp);
NextUniqueID++;
num_to_str(NextUniqueID, szTemp, charsmax(szTemp));
nvault_set(ghSkinsVault, "COUNTER", szTemp);
return NextUniqueID - 1;
}
return Result;
}
ExitPluginWithError(fmt[], ...) {
new buffer[128];
vformat(buffer, charsmax(buffer), fmt, 1);
set_fail_state(buffer);
}