#include <amxmodx>
#pragma semicolon 1
new const szPluginInfo[][] = {"GFonRank", "1.0", "ApXuTekToR"};
#define MAX_AWARDS 512
enum _:DATA {
FLAGS[32],
MSG[256]
};
enum _:Cvar {
Debug_Log,
Float:Time_Give,
Check_Night_Mode,
Name_Award[64],
Ignor_Flags[16],
Debug_Logs
}
new g_arrAwardData[MAX_AWARDS][DATA], g_iDataSize = 1, Check_Plugin, g_pCvars[Cvar];
new bool:Use_GameCMS_API;
// ~~~~ Native's ~~~~
native get_user_stats(index, stats[STATSX_MAX_STATS], bodyhits[MAX_BODYHITS]);
native csstats_get_user_stats(id, stats[22]);
native get_user_stats_sql(index, stats[8], bodyhits[8]);
native cmsstats_get_user_stats(id, stats[8],bodyhits[8]);
native cmsapi_set_user_flags(index, const szFlags[], iTime = -1, const szServiceName[] = "", bSilentCheck = false, bAuthorize = true);
// ~~~~ Native's ~~~~
public plugin_natives()
set_native_filter("native_filter");
public native_filter(const name[], index, trap)
return trap ? PLUGIN_CONTINUE : PLUGIN_HANDLED;
public plugin_init() {
register_plugin(szPluginInfo[0], szPluginInfo[1], szPluginInfo[2]);
register_cvar("GFonRank_Check_Night_Mode", "0" );
register_cvar("GFonRank_Name_Award", "Флаги за TOP" );
register_cvar("GFonRank_Ignor_Flags", "t" );
register_cvar("GFonRank_Debug_Log", "0" );
register_cvar("GFonRank_Time_Give", "5.0" );
register_cvar("GFonRank_Debug_Logs", "1" );
}
public plugin_precache() {
new cfgFilePath[PLATFORM_MAX_PATH];
new const fileName[64] = "/SevCorp/Give_Flags/GFonRank_Configuration.cfg";
get_localinfo("amxx_configsdir", cfgFilePath, charsmax(cfgFilePath));
add(cfgFilePath, charsmax(cfgFilePath), fileName);
if(file_exists(cfgFilePath)) {
server_cmd("exec %s", cfgFilePath);
server_exec();
} else {
server_print("[%s] File '%s' not found. Plugin Stoped", szPluginInfo[0], cfgFilePath);
set_fail_state("[%s] File '%s' not found. Plugin Stoped", szPluginInfo[0], cfgFilePath);
}
set_task(1.0, "initCvars");
}
public plugin_cfg() {
new szPath[MAX_NAME_LENGTH*2];
get_localinfo("amxx_configsdir", szPath, charsmax(szPath));
add(szPath, charsmax(szPath), "/SevCorp/Give_Flags/GFonRank_Awards.ini");
new iFile = fopen(szPath, "rt");
if(!iFile) {
new szError[96];
formatex(szError, charsmax(szError), "File '%s' not found OR incorrect structure!", szPath);
set_fail_state(szError);
}
new szBuffer[MAX_AWARDS];
while(!feof(iFile)){
fgets(iFile, szBuffer, charsmax(szBuffer));
trim(szBuffer);
if(!szBuffer[0] || szBuffer[0] == ';')
continue;
if(parse(szBuffer,
g_arrAwardData[g_iDataSize][FLAGS], charsmax(g_arrAwardData[][FLAGS]),
g_arrAwardData[g_iDataSize][MSG], charsmax(g_arrAwardData[][MSG])
) == 2) g_iDataSize++;
}
fclose(iFile);
if(is_plugin_loaded("StatsX") != -1) {
Check_Plugin = 1;
if(g_pCvars[Debug_Logs] == 2) plugin_print(false, "[GFonRank] Расчет статистики ведется через стандартный StatsX");
}
else if(is_plugin_loaded("CSStatsX SQL") != -1) {
Check_Plugin = 2;
if(g_pCvars[Debug_Logs] == 2) plugin_print(false, "[GFonRank] Расчет статистики ведется через CSStatsX SQL");
}
else if(is_plugin_loaded("[183] CsStats MySQL") != -1) {
Check_Plugin = 3;
if(g_pCvars[Debug_Logs] == 2) plugin_print(false, "[GFonRank] Расчет статистики ведется через [183] CsStats MySQL");
}
else if(is_plugin_loaded("CMSStats_MySQL") != -1) {
Check_Plugin = 4;
if(g_pCvars[Debug_Logs] == 2) plugin_print(false, "[GFonRank] Расчет статистики ведется через CMSStats_MySQL");
}
else plugin_print(true, "[GFonRank] Система статистики не запущена.");
if(is_plugin_loaded("GameCMS_API") != -1) {
Use_GameCMS_API = true;
if(g_pCvars[Debug_Logs] == 2) plugin_print(false, "[GFonRank] Синхронизация с GameCMS API Успешна!");
} else {
if(g_pCvars[Debug_Logs] == 2) plugin_print(false, "[GFonRank] GameCMS API не запущена! Флаги выдаются в стандартном режиме!");
}
}
public initCvars() {
get_cvar_string("GFonRank_Name_Award", g_pCvars[Name_Award], charsmax(g_pCvars[Name_Award]));
get_cvar_string("GFonRank_Ignor_Flags", g_pCvars[Ignor_Flags], charsmax(g_pCvars[Ignor_Flags]));
g_pCvars[Check_Night_Mode] = get_cvar_num("GFonRank_Check_Night_Mode");
g_pCvars[Debug_Log] = get_cvar_num("GFonRank_Debug_Log");
g_pCvars[Time_Give] = get_cvar_float("GFonRank_Time_Give");
g_pCvars[Debug_Logs] = get_cvar_num("GFonRank_Debug_Logs");
}
public client_putinserver(id) {
if(!is_user_connected(id)) {
return;
}
if(g_pCvars[Ignor_Flags]) {
if(checkAccess(id, g_pCvars[Ignor_Flags]))
return;
}
set_task(g_pCvars[Time_Give], "client_give_awards", id);
}
public client_give_awards(id) {
if(!is_user_connected(id))
return;
if(g_pCvars[Ignor_Flags]) {
if(checkAccess(id, g_pCvars[Ignor_Flags]))
return;
}
new szName[32];
get_user_name(id, szName, charsmax(szName));
new iRank;
switch(Check_Plugin) {
case 1: {
new szStats[8];
iRank = get_user_stats(id, szStats, szStats);
}
case 2: {
new szStats[8];
iRank = get_user_stats_sql(id, szStats, szStats);
}
case 3: {
new szStats[22];
iRank = csstats_get_user_stats(id, szStats);
}
case 4: {
new szStats[8];
iRank = cmsstats_get_user_stats(id, szStats, szStats);
}
}
if(g_pCvars[Debug_Logs] == 2) plugin_print(false, "[GFonRank] Зашел игрок: | Name: %s | Rank: %d", szName, iRank);
if(iRank <= g_iDataSize && iRank > 0) {
new szName[32];
get_user_name(id, szName, charsmax(szName));
if(Use_GameCMS_API) {
cmsapi_set_user_flags(id, g_arrAwardData[iRank][FLAGS], -1, g_pCvars[Name_Award], false, true);
if(g_pCvars[Debug_Log])
if(g_pCvars[Debug_Logs] == 1 || g_pCvars[Debug_Logs] == 2)
plugin_print(false, "[GFonRank] GameCMS_API ON | User: %s | Flags: %s | Award: %s | Rank: %d", szName, g_arrAwardData[iRank][FLAGS], g_pCvars[Name_Award], iRank);
} else {
new g_iAccess;
g_iAccess = get_user_flags(id);
set_user_flags(id, g_iAccess | read_flags(g_arrAwardData[iRank][FLAGS]));
if(g_pCvars[Debug_Log])
if(g_pCvars[Debug_Logs] == 1 || g_pCvars[Debug_Logs] == 2)
plugin_print(false, "[GFonRank] GameCMS API OFF | User: %s | Flags: %s | Rank: %d", szName, g_arrAwardData[iRank][FLAGS], iRank);
}
replace_all(g_arrAwardData[iRank][MSG], charsmax(g_arrAwardData[][MSG]), "!n", "^1");
replace_all(g_arrAwardData[iRank][MSG], charsmax(g_arrAwardData[][MSG]), "!t", "^3");
replace_all(g_arrAwardData[iRank][MSG], charsmax(g_arrAwardData[][MSG]), "!g", "^4");
replace_all(g_arrAwardData[iRank][MSG], charsmax(g_arrAwardData[][MSG]), "%name%", szName);
client_print_color(id, 0, "%s", g_arrAwardData[iRank][MSG]);
}
}
checkAccess(id, const flags[]) {
return (get_user_flags(id) & read_flags(flags));
}
plugin_print(bool:bBlock, const szMessage[], any:...) {
new szMsg[128];
vformat(szMsg, charsmax(szMsg), szMessage, 3);
switch(bBlock) {
case false: log_to_file("GFonRank.log", szMsg);
case true: set_fail_state(szMsg);
}
}