/**
История изменений:
0.1b (31.07.2022) by b0t.
- Тестовый релиз;
0.3b (02.08.2022) by b0t.
- Добавлен файл для временного хранения покупок OffLine;
*/
new const VERSION[] = "0.3b";
#include <amxmodx>
#include <nvault>
#tryinclude <aes_v>
#tryinclude <zombieplague>
#tryinclude <army_ranks_ultimate>
//Дебаг вывод. Отключить в финальной версии;
//#define DEBUG
//Вести логировании покупок и выдачи предметов;
//Закомментировать если не требуется;
#define WRITE_LOG
//Сообщение после успешной покупки
//Выводится будет только в том случае, если в момент покупки предмета игрок был на сервере!
#define BUY_MESSAGE "^4[^3SHOP^4] ^1Спасибо за покупку^4!"
//ARU -> (Army Ranks Ultimate);
//AES -> (Advanced Experience System);
/**
Доступные ключи для команды:
anew_aes -- Выдача очков anew (AES);
anew_aru -- Выдача очков anew (ARU);
exp_aru -- Выдача опыта (ARU);
exp_aes -- Выдача опыта (AES);
ammo_zp -- Выдача AMMO 'ZombiePlague';
*/
const TASK_ID__CHECK_DELAY = 0xA44F32;
new const g_szNvaultDataName[] = "RconShop_Offline"; //Имя БД для временного хранения данных о покупках;
new const g_szLog_Buy_FileName[] = "RconShop_Buy_Log.txt"; //Имя файла с данными о покупках;
new const g_szLog_Set_FileName[] = "RconShop_Set_Log.txt"; //Имя файла с данными о выдаче покупки;
new
Array:g_szArray__ItemData,
g_iNvaultData = INVALID_HANDLE;
public plugin_init() {
register_plugin("Rcon Shop",VERSION,"b0t.");
register_srvcmd("rs_add","Func__HookServerCmd");
g_szArray__ItemData = ArrayCreate(256);
}
public plugin_cfg() {
g_iNvaultData = nvault_open(g_szNvaultDataName);
if(g_iNvaultData == INVALID_HANDLE)
set_fail_state("[RCON_SHOP] Error open data file %s",g_szNvaultDataName);
}
public Func__HookServerCmd() {
new szUserSteam[64],szItemType[64],szValue[64];
read_argv(1,szUserSteam,charsmax(szUserSteam));
read_argv(2,szItemType,charsmax(szItemType));
read_argv(3,szValue,charsmax(szValue));
#if defined WRITE_LOG
log_to_file(g_szLog_Buy_FileName,"STEAM: %s | ITEM: %s | VALUE: %i",szUserSteam,szItemType,str_to_num(szValue));
#endif
new pPlayer = find_player_ex(FindPlayer_MatchAuthId,szUserSteam);
#if defined DEBUG
server_print(" ");
server_print("[RCON_SHOP]");
server_print("Стим игрока: %s",szUserSteam);
server_print("Тип товара: %s",szItemType);
server_print("Значение: %i",iValue);
server_print("[RCON_SHOP]");
server_print(" ");
#endif
if(!is_user_connected(pPlayer)) {
Func__SaveData(szUserSteam,szItemType,str_to_num(szValue));
return PLUGIN_CONTINUE;
}
Func__SetItem(pPlayer,szItemType,str_to_num(szValue));
#if defined BUY_MESSAGE
client_print_color(pPlayer,print_team_default,BUY_MESSAGE);
#endif
return PLUGIN_CONTINUE;
}
public client_putinserver(id) {
if(!is_user_bot(id) && !is_user_hltv(id))
set_task(1.0,"TaskFunc__CheckDelay",id+TASK_ID__CHECK_DELAY);
}
public TaskFunc__CheckDelay(id) {
id -= TASK_ID__CHECK_DELAY;
if(!is_user_connected(id))
return;
Func__ReadData(id);
}
public Func__SetItem(const id,const szItem[],const iValue) {
if(equali(szItem,"anew_aes"))
aes_add_player_bonus_f(id,iValue);
else if(equali(szItem,"anes_aru"))
ar_add_user_anew(-1,id,iValue);
else if(equali(szItem,"exp_aes"))
aes_add_player_exp_f(id,float(iValue));
else if(equali(szItem,"exp_aru"))
ar_set_user_addxp(id,iValue);
else if(equali(szItem,"ammo_zp"))
zp_set_user_ammo_packs(id,zp_get_user_ammo_packs(id)+iValue);
#if defined WRITE_LOG
new szUserSteam[64];
get_user_authid(id,szUserSteam,charsmax(szUserSteam));
log_to_file(g_szLog_Set_FileName,"STEAM: %s | ITEM: %s | VALUE: %i",szUserSteam,szItem,iValue);
#endif
}
public Func__SaveData(const szUserSteam[],const szItem[],const iValue) {
new szData[256];
if(nvault_get(g_iNvaultData,szUserSteam,szData,charsmax(szData)))
add(szData,charsmax(szData),fmt("|%s&%i",szItem,iValue));
else
formatex(szData,charsmax(szData),"%s&%i",szItem,iValue);
nvault_set(g_iNvaultData,szUserSteam,szData);
}
public Func__ReadData(const id) {
new szUserSteam[64];
get_user_authid(id,szUserSteam,charsmax(szUserSteam));
new szData[256];
if(!nvault_get(g_iNvaultData,szUserSteam,szData,charsmax(szData)))
return PLUGIN_HANDLED;
new szItem[64],szValue[64];
if(contain(szData,"|") != -1) {
ArrayClear(g_szArray__ItemData);
UTIL__RecordMessageInArray(g_szArray__ItemData,szData,'|');
for(new iItem;iItem<ArraySize(g_szArray__ItemData);iItem++) {
ArrayGetString(g_szArray__ItemData,iItem,szData,charsmax(szData));
strtok(szData,szItem,charsmax(szItem),szValue,charsmax(szValue),'&');
trim(szItem);
trim(szValue);
Func__SetItem(id,szItem,str_to_num(szValue));
}
}
else {
strtok(szData,szItem,charsmax(szItem),szValue,charsmax(szValue),'&');
trim(szItem);
trim(szValue);
Func__SetItem(id,szItem,str_to_num(szValue));
}
nvault_remove(g_iNvaultData,szUserSteam);
return PLUGIN_HANDLED;
}
stock UTIL__RecordMessageInArray(Array:ArrayData,const szMessage[],const szSimbol = ' ',const bool:bCell = false) {
new szLeft[256],szRight[256];
strtok(szMessage,szLeft,charsmax(szLeft),szRight,charsmax(szRight),szSimbol);
if(bCell)
ArrayPushCell(ArrayData,str_to_num(szLeft));
else
ArrayPushString(ArrayData,szLeft);
while(szRight[0] != EOS && strtok(szRight,szLeft,charsmax(szLeft),szRight,charsmax(szRight),szSimbol)) {
if(bCell)
ArrayPushCell(ArrayData,str_to_num(szLeft));
else
ArrayPushString(ArrayData,szLeft);
}
}
public plugin_natives() {
set_native_filter("Func__NativeFilter");
}
public Func__NativeFilter() {
return PLUGIN_HANDLED;
}