Иконка ресурса

Rcon Shop 0.3b

Нет прав для скачивания
Установка
  1. Откройте .sma и настройте его по своему вкусу (строки 20;24;28)
  2. Скомпилируйте плагин (инструкция)
  3. Скопируйте скомпилированный .amxx в директорию /amxmodx/plugins/
  4. Пропишите .amxx в файле /amxmodx/configs/plugins.ini
  5. Смените карту или перезапустите сервер.
Исходный код
Код:
/**
    История изменений:
        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;
}
Настройки
Код:
//Дебаг вывод. Отключить в финальной версии;
//#define DEBUG

//Вести логировании покупок и выдачи предметов;
//Закомментировать если не требуется;
#define WRITE_LOG

//Сообщение после успешной покупки
//Выводится будет только в том случае, если в момент покупки предмета игрок был на сервере!
#define BUY_MESSAGE     "^4[^3SHOP^4] ^1Спасибо за покупку^4!"
Сверху Снизу