/**
История изменений:
0.0.1b (23.12.2023) by b0t.
- Релиз;
0.0.2b (29.12.2023) by b0t.
- Небольшая оптимизация кода;
- Добавлены пункты:
* Сбросить настройки;
* Отключить;
0.1.2 (10.08.2026) by b0t.
- Оптимизация/Рефакторинг кода;
- Исправлена ошибка в функции "отключения" изменений в освещении;
- Исправлена критическая ошибка в сохранении выбранных параметров;
Благодарность: Czech за идеи по оптимизации;
*/
new const VERSION[] = "0.1.2";
#include <amxmodx>
#include <nvault>
#pragma semicolon 1
#define SECONDS_IN_DAY 86400
#define INVALID_ACCESS (1<<31)
#define OFF_LIGHT -1
enum _:CvarsStruct {
ClCmd_OpenMenu[128],
StartLightKey[5],
StorageTime_In_Day
};
new const g_szNvault_DataBase_Name[] = "LightKey";
new
pCvar[CvarsStruct],
g_iNvault_DataBase = INVALID_HANDLE;
new const g_szLightKey[] = "abcdefghijklmnopqrstuvwxyz";
new
g_iStartKey;
new
p_iLightKey[33],
p_szAuthId[33][64];
public plugin_init() {
register_plugin("Light Style",VERSION,"b0t.");
CreateMultiLang();
register_dictionary("LightStyle.txt");
}
public plugin_cfg() {
CreateCvars();
AutoExecConfig(.autoCreate = true, .name = "LightStyle");
register_clcmd(pCvar[ClCmd_OpenMenu],"Show__LightMenu");
register_clcmd(fmt("say /%s",pCvar[ClCmd_OpenMenu]),"Show__LightMenu");
register_clcmd(fmt("say_team /%s",pCvar[ClCmd_OpenMenu]),"Show__LightMenu");
if(strcmp(pCvar[StartLightKey],"OFF") == 0)
g_iStartKey = OFF_LIGHT;
else {
for(new i;i<=charsmax(g_szLightKey);i++) {
if(g_szLightKey[i] == pCvar[StartLightKey][0]) {
g_iStartKey = i;
break;
}
}
}
g_iNvault_DataBase = nvault_open(g_szNvault_DataBase_Name);
if(g_iNvault_DataBase == INVALID_HANDLE) {
set_fail_state("Error open nVault base: %s",g_szNvault_DataBase_Name);
}
nvault_prune(g_iNvault_DataBase,0,get_systime() - (SECONDS_IN_DAY*pCvar[StorageTime_In_Day]));
}
public Show__LightMenu(const id) {
if(!is_user_connected(id))
return PLUGIN_HANDLED;
new szMenuName[256];
switch(p_iLightKey[id]) {
case OFF_LIGHT: formatex(szMenuName,charsmax(szMenuName),"%l","LS_MENU_NAME_OFF_LIGHT");
default: {
new szKey[2];
szKey[0] = g_szLightKey[p_iLightKey[id]];
szKey[1] = EOS;
formatex(szMenuName,charsmax(szMenuName),"%l","LS_MENU_NAME",szKey);
}
}
new iMenu = menu_create(szMenuName,"LightMenu__Handler");
menu_additem(iMenu,fmt("%l","LS_LIGHT_DOWN"));
menu_additem(iMenu,fmt("%l","LS_LIGHT_UP"));
menu_additem(iMenu,fmt("%l","LS_LIGHT_REMOVE"), .paccess = p_iLightKey[id] == g_iStartKey ? INVALID_ACCESS : ADMIN_ALL);
menu_additem(iMenu,fmt("%l","LS_LIGHT_OFF"), .paccess = p_iLightKey[id] == OFF_LIGHT ? INVALID_ACCESS : ADMIN_ALL);
menu_setprop(iMenu,MPROP_EXITNAME,fmt("%l","LS_MENU_EXIT_NAME"));
menu_setprop(iMenu,MPROP_NUMBER_COLOR,fmt("%l","LS_MENU_NUMBER_COLOR"));
menu_display(id,iMenu);
return PLUGIN_HANDLED;
}
public LightMenu__Handler(const id,const iMenu,const iItem) {
menu_destroy(iMenu);
if(iItem == MENU_EXIT)
return PLUGIN_HANDLED;
switch(iItem) {
case 0: {
p_iLightKey[id] = (--p_iLightKey[id]) % charsmax(g_szLightKey);
}
case 1: {
p_iLightKey[id] = (++p_iLightKey[id]) % charsmax(g_szLightKey);
}
case 2: p_iLightKey[id] = g_iStartKey;
case 3: p_iLightKey[id] = OFF_LIGHT;
}
nvault_set(g_iNvault_DataBase,p_szAuthId[id],fmt("%i",p_iLightKey[id]));
UTIL__SetLightStyle(id);
Show__LightMenu(id);
return PLUGIN_HANDLED;
}
public client_putinserver(id) {
get_user_authid(id,p_szAuthId[id],charsmax(p_szAuthId[]));
new szValue[10];
if(nvault_get(g_iNvault_DataBase,p_szAuthId[id],szValue,charsmax(szValue))) {
p_iLightKey[id] = str_to_num(szValue);
}
else {
p_iLightKey[id] = g_iStartKey;
}
UTIL__SetLightStyle(id);
}
public CreateCvars() {
bind_pcvar_string(
create_cvar(
.name = "lm_cl_cmd_open_menu",
.string = "light",
.description = "Команда для открытия меню"
),
pCvar[ClCmd_OpenMenu],charsmax(pCvar[ClCmd_OpenMenu])
);
bind_pcvar_string(
create_cvar(
.name = "lm_start_light_key",
.string = "m",
.description = "Стартовое значение^nOFF - Не задавать стандартное значение"
),
pCvar[StartLightKey],charsmax(pCvar[StartLightKey])
);
bind_pcvar_num(
create_cvar(
.name = "lm_storage_time_in_day",
.string = "30",
.description = "Время хранения записей в днях"
),
pCvar[StorageTime_In_Day]
);
}
public CreateMultiLang() {
new szData[512];
formatex(szData,charsmax(szData),"addons/amxmodx/data/lang/LightStyle.txt");
if(file_exists(szData))
return;
write_file(szData,"[ru]");
write_file(szData,"");
write_file(szData,"LS_MENU_NAME = \wНастройка освещения^^nКлюч: \r%s");
write_file(szData,"LS_MENU_NAME_OFF_LIGHT = \wНастройка освещения^^nКлюч: \r#");
write_file(szData,"");
write_file(szData,"LS_LIGHT_UP = Ярче^^n");
write_file(szData,"LS_LIGHT_DOWN = Темнее");
write_file(szData,"LS_LIGHT_REMOVE = Сбросить настройки");
write_file(szData,"LS_LIGHT_OFF = Отключить");
write_file(szData,"");
write_file(szData,"LS_MENU_EXIT_NAME = Выход");
write_file(szData,"");
write_file(szData,"LS_MENU_NUMBER_COLOR = \y");
write_file(szData,"");
write_file(szData,"");
write_file(szData,"[en]");
write_file(szData,"");
write_file(szData,"LS_MENU_NAME = \wНастройка освещения^^nКлюч: \r%s");
write_file(szData,"LS_MENU_NAME_OFF_LIGHT = \wНастройка освещения^^nКлюч: \r#");
write_file(szData,"");
write_file(szData,"LS_LIGHT_UP = Ярче^^n");
write_file(szData,"LS_LIGHT_DOWN = Темнее");
write_file(szData,"LS_LIGHT_REMOVE = Сбросить настройки");
write_file(szData,"LS_LIGHT_OFF = Отключить");
write_file(szData,"");
write_file(szData,"LS_MENU_EXIT_NAME = Выход");
write_file(szData,"");
write_file(szData,"LS_MENU_NUMBER_COLOR = \y");
}
public plugin_end() {
if(g_iNvault_DataBase != INVALID_HANDLE) {
nvault_close(g_iNvault_DataBase);
}
}
stock UTIL__SetLightStyle(const id) {
new szKey[2];
if(p_iLightKey[id] != OFF_LIGHT) {
szKey[0] = g_szLightKey[p_iLightKey[id]];
szKey[1] = EOS;
}
message_begin(MSG_ONE_UNRELIABLE,SVC_LIGHTSTYLE, .player = id); {
write_byte(0);
if(p_iLightKey[id] != OFF_LIGHT)
write_string(szKey);
else
write_string("");
}
message_end();
}