Код:
/* Plugin generated by AMXX-Studio */
#include <amxmodx>
#include <amxmisc>
#define MAX_WARN 4
#define NAME_LEN 31
#define ACCESS read_flags("a")
new const USERS[] = "addons/amxmodx/configs/users.ini"
new Array: g_admins;
enum _:Q_Data {
Q_Name[32],
Q_Warn
}
new bool:g_type[33]
public plugin_init() {
register_concmd("adminwarn", "CmdMainMenu")
g_admins = ArrayCreate(Q_Data);
ReadUsersIni();
}
public plugin_end() ArrayDestroy(g_admins);
public CmdMainMenu(id) {
if(~get_user_flags(id) & ACCESS) return;
new menu = menu_create("\yAdminWarn\r::\w Main Menu", "HandlerMainMenu")
menu_additem(menu, "Give warn", "1", 0)
menu_additem(menu, "Delete warn", "2", 0)
menu_display(id,menu,0)
}
public HandlerMainMenu(id, menu, item) {
if(item == MENU_EXIT) return menu_destroy(menu)
static s_Data[12], s_Name[2], i_Access, i_Callback
menu_item_getinfo(menu, item, i_Access, s_Data, charsmax(s_Data), s_Name, charsmax(s_Name), i_Callback)
switch(str_to_num(s_Data)) {
case 1: g_type[id] = true;
case 2: g_type[id] = false;
}
CmdMenu(id)
return menu_destroy(menu)
}
public CmdMenu(id) {
if(~get_user_flags(id) & ACCESS) return;
new menu = menu_create("\yAdminWarn\r::\w Main Menu", "HandlerMenu")
static len; len = ArraySize(g_admins)
static data[Q_Data], temp[64], str[2]
for(new j = 0;j< len;j++) {
ArrayGetArray(g_admins, j, data)
num_to_str(j+1, str, charsmax(str))
formatex(temp,sizeof(temp) - 1,"%s%s \r[\y%d\d/\w%d\r]", data[Q_Warn] == MAX_WARN ? "\d" : "\w", data[Q_Name], data[Q_Warn], MAX_WARN)
menu_additem(menu, temp, str, 0)
}
menu_display(id, menu, 0)
}
public HandlerMenu(id, menu, item) {
if(item == MENU_EXIT) return menu_destroy(menu)
static s_Data[12], s_Name[2], i_Access, i_Callback
menu_item_getinfo(menu, item, i_Access, s_Data, charsmax(s_Data), s_Name, charsmax(s_Name), i_Callback)
new key = str_to_num(s_Data), data[Q_Data];
ArrayGetArray(g_admins, key -1, data);
if(g_type[id]) {
data[Q_Warn] = min(MAX_WARN, data[Q_Warn]+1);
ArraySetArray(g_admins, key-1, data);
if(data[Q_Warn] == MAX_WARN) {
client_print_color(id, RED, "^1[^3AdminWarn^1] Admin^4 %s ^1delete in ^3users.ini",data[Q_Name])
RemoveAdmin(data[Q_Name]);
ReadUsersIni()
new index = get_user_index(data[Q_Name])
if(index > 0) {
client_print_color(index, RED, "^1[^3AdminWarn^1] Delete admin");
server_cmd("kick #%d ^"Admin Remove^"", get_user_userid(index))
}
set_task(0.5, "CmdMenu", id)
return menu_destroy(menu)
}
new index = get_user_index(data[Q_Name])
if(index > 0) client_print_color(index, RED, "^1[^3AdminWarn^1] Add warn ^4%d^1/^3%d ^1warn", data[Q_Warn],MAX_WARN)
AddWarning(data[Q_Name], data[Q_Warn])
} else {
if(!data[Q_Warn]) {
CmdMenu(id);
return menu_destroy(menu)
}
data[Q_Warn] = max(0, data[Q_Warn]-1);
ArraySetArray(g_admins, key-1, data);
if(MAX_WARN == data[Q_Warn]) {
client_print_color(id, RED, "^1[^3AdminWarn^1] Вас добавили снова в список админов.")
AddAdminS(data[Q_Name]);
ReadUsersIni()
new index = get_user_index(data[Q_Name])
if(index > 0) client_print_color(index, RED, "^1[^3AdminWarn^1] С вас сняли предупреждения, предупреждений: ^4%d^1/^3%d ^1warn", data[Q_Warn],MAX_WARN)
set_task(0.5, "CmdMenu", id)
return menu_destroy(menu)
}
RemoveWarning(data[Q_Name], data[Q_Warn])
new index = get_user_index(data[Q_Name])
if(index > 0) client_print_color(index, RED, "^1[^3AdminWarn^1] Delete WARN!^1 ^4%d^1/^3%d ^1warn", data[Q_Warn],MAX_WARN)
}
set_task(0.25, "CmdMenu", id)
return menu_destroy(menu)
}
stock AddWarning( key[], warn) {
new vault = fopen(USERS, "rt");
new _data[128], _key[64], _other[3];
new line = 0, bool:re = false;
while(!feof(vault)) {
fgets(vault, _data, sizeof(_data) - 1);
parse(_data, _key, sizeof(_key) - 1, _other, sizeof(_other) - 1);
if(equal(_key, key) && !re) {
new keys = -1, form[16], text[128];
formatex(form, 15, "^"%d^"", warn-1);
keys = containi(_data, form)
replace(_data, charsmax(_data), "^n", "")
if(keys != -1) {
replace(_data, charsmax(_data), form, "")
formatex(text, charsmax(text), "%s^"%d^"", _data, warn);
write_file(USERS, text, line);
break;
} else {
formatex(text, charsmax(text), "%s^"%d^"", _data, warn);
write_file(USERS, text, line);
}
re = true;
}
line++;
}
fclose(vault);
}
stock RemoveWarning( key[], warn) {
new vault = fopen(USERS, "rt");
new _data[128], _key[64], _other[3];
new line = 0, bool:re = false;
while(!feof(vault)) {
fgets(vault, _data, sizeof(_data) - 1);
parse(_data, _key, sizeof(_key) - 1, _other, sizeof(_other) - 1);
if( equal(_key, key) && !re) {
new keys = -1, form[16], text[128];
formatex(form, 15, "^"%d^"",warn+1);
keys = containi(_data, form)
replace(_data, charsmax(_data), "^n", "")
if(keys != -1) {
replace(_data, charsmax(_data), form, "")
formatex(text, charsmax(text), "%s^"%d^"", _data, warn);
write_file(USERS, text, line);
break;
}
re = true;
}
line++;
}
fclose(vault);
}
stock RemoveWarningAdminS(const key[]) {
new vault = fopen(USERS, "rt");
new _data[128], _key[64], _other[3];
new line = 0, bool:re = false;
while(!feof(vault)) {
fgets(vault, _data, sizeof(_data) - 1);
parse(_data, _key, sizeof(_key) - 1, _other, sizeof(_other) - 1);
if( equal(_key, key) && !re) {
static text[128];
formatex(text, charsmax(text), "%s", _data)
write_file(USERS, text, line);
re = true;
}
line++;
}
fclose(vault);
server_cmd("amx_reloadadmins")
}
stock RemoveAdmin(const key[]) {
new vault = fopen(USERS, "rt");
new _data[128], _key[64], _other[3];
new line = 0, bool:re = false;
while(!feof(vault)) {
fgets(vault, _data, sizeof(_data) - 1);
parse(_data, _key, sizeof(_key) - 1, _other, sizeof(_other) - 1);
if( equal(_key, key) && !re) {
static text[128];
formatex(text, charsmax(text), ";%s", _data)
write_file(USERS, text, line);
re = true;
}
line++;
}
fclose(vault);
server_cmd("amx_reloadadmins")
}
stock AddAdminS(const key[]) {
new vault = fopen(USERS, "rt");
new _data[128], _key[64], _other[3];
new line = 0, bool:re = false;
while(!feof(vault)) {
fgets(vault, _data, sizeof(_data) - 1);
parse(_data, _key, sizeof(_key) - 1, _other, sizeof(_other) - 1);
if( equal(_key, key) && !re) {
static text[128];
formatex(text, charsmax(text), "%s", _data)
write_file(USERS, text, line);
re = true;
}
line++;
}
fclose(vault);
server_cmd("amx_reloadadmins")
}
stock ReadUsersIni() {
ArrayClear(g_admins);
new f = fopen(USERS,"r");
if(!f) return;
static filedata[256], data[Q_Data], szDummy[1];
while (!feof(f)) {
fgets(f, filedata, charsmax(filedata))
trim(filedata);
if(!(filedata[0] !=0 && (filedata[0] == ';' && filedata[1] == '^"') || filedata[0] == '^"')) continue
strbreak(filedata, data[Q_Name], NAME_LEN, filedata, charsmax(filedata))
for(new i; i<4;i++) strbreak(filedata, szDummy, charsmax(szDummy), filedata, charsmax(filedata))
if(strlen(filedata) > 0 ) {
remove_quotes(filedata);
data[Q_Warn] = str_to_num(filedata);
} else data[Q_Warn] = 0;
ArrayPushArray(g_admins, data);
}
}