Русское сообщество по скриптингу

AES bonus flags

Все вопросы по скриптингу для AMXX, помощь в редактировании плагинов.

Модераторы: Subb98, liFe iS GoOD

Правила форума
1. Запрещено материться и оскорблять других участников форума.
2. Запрещен флуд, оффтоп, дабл постинг во всех разделах форума, кроме раздела "Болтовня".
3. Запрещено взламывать сайт/форум или наносить любой вред проекту.
4. Запрещено рекламировать другие ресурсы.
5. Запрещено создавать темы без информативного названия. Название темы должно отображать ее смысл.

В данном разделе форума разрешено создавать темы, касающие только скриптинга для AMX Mod X.

Правила при создании новой темы:
1. При вставке кода плагина необходимо использовать тег [code=php].
2. Любые изображения должны быть загружены, как вложения к вашему сообщению.
3. При описании проблемы или запросе на помощь в редактировании плагина обязательно выкладывайте исходник sma плагина.

AES bonus flags

Сообщение Максим_SerJanT » 15 окт 2021, 21:48

Привет. Уже долго мучаюсь с проблемой: В плагине AES есть бонусы /anew, туда поставил плагин на выдачу флага на определённый срок. Плагин работает, очки снимаются, но флаг не прописывается. Сколько кипиша было, не как не удалось исправить...
Помогите, пожалуйста.
Вот исходник бонус системы:
Код: Выделить всё
// *************************************************************************************//
// Плагин загружен с  www.neugomon.ru                                                   //
// Автор: Neygomon  [ https://neugomon.ru/members/1/ ]                                  //
// Официальная тема поддержки: https://neugomon.ru/threads/2648/                        //
// При копировании материала ссылка на сайт www.neugomon.ru ОБЯЗАТЕЛЬНА!                //
// *************************************************************************************//

/* 
*    AES: Bonus System                  v. 0.5
*    by serfreeman1337        http://gf.hldm.org/
*/


#include <amxmodx>

#if AMXX_VERSION_NUM < 183
    #include <colorchat>
    
    
#define print_team_default DontChange
    #define print_team_grey Grey
    #define print_team_red Red
    #define print_team_blue Blue
    
    
#define MAX_NAME_LENGTH    32
    #define MAX_PLAYERS 32
    
    
#define client_disconnected client_disconnect
#endif

#include <amxmisc>
#include <aes_v>
#include <hamsandwich>
#include <fun>

#define PLUGIN "AES: Bonus System"
#define VERSION "0.5 Vega"
#define AUTHOR "serfreeman1337"

// мы передали тебе массив в массив
// чтобы ты мог работать с массивом пока работаешь  с массивом

enum _:itemTypeStruct 
{
    ITEM_GIVE = 1,
    ITEM_CALL,
    ITEM_MENU,
    ITEM_FORWARD
}

enum _:
{
    BONUS_ITEM_SPAWN,
    BONUS_ITEM_MENU,
    BONUS_MENUS
}

#define LIMIT_POINTS (1<<1)
#define    LIMIT_EXP (1<<2)
#define LIMIT_LEVEL (1<<3)
#define LIMIT_ROUND (1<<4)
#define LIMIT_TIME (1<<5)

enum _:itemFieldsStruct 
{
    IB_TYPE,
    IB_NAME[64],
    IB_ITEM[30],
    IB_PLUGIN_ID,
    IB_FUNCTION_ID,
    Array:IB_LEVELS,
    Array:IB_CHANCE,
    bool:IB_SUMCHANCE,
    
    IB_POINTS
,
    Float:IB_EXP,
    IB_LEVEL,
    IB_ROUND,
    Float:IB_TIME,
    IB_FLAGS[30],
    IB_DAYS,
}

enum _:menuFieldsStruct {
    MENU_TITLE[64],
    MENU_SAYCMD[30],
    MENU_CONCMD[30],
    Array: MENU_LIST
}

// Мастер массивов 80 лвл

new Array:g_SpawnBonusItems
new Array
:g_PointsBonusItems
new Array
:g_BonusMenus
new Trie
:g_MenuCommandsValid

//

new g_SpawnBonusCount
new g_PointsBonusCount

// some random stuff
new bool:isLocked,iaNewForward
new bool
:player_already_spawned[MAX_PLAYERS + 1]
new Float:player_spawn_time[MAX_PLAYERS + 1]

// Менюшки
new itemName[128],itemInfo[10]
new Trie:callCmds

// cvars

enum _:cvars_num 
{
    CVAR_BONUS_ENABLED,
    CVAR_BONUS_SPAWN,
}

new cvar[cvars_num]
new items_CB

new iRound

public plugin_init
(){
    register_plugin(PLUGIN, VERSION, AUTHOR)
    
    
//
    // Вкл/выкл системы бонусов
    //
    cvar[CVAR_BONUS_ENABLED] = register_cvar("aes_bonus_enable","1",FCVAR_SERVER)
    
    
//
    // Выдача бонусов на спавне
    //    0 - нет бонусов на спавне
    //    1 - выдавать всегда
    //    2 - выдать только один раз за раунд
    cvar[CVAR_BONUS_SPAWN] = register_cvar("aes_bonus_spawn","1")
    
    register_srvcmd
("aes_lockmap","Check_LockMap")
    register_dictionary("aes.txt")
    
    iaNewForward 
= CreateMultiForward("aes_on_anew_command",ET_STOP,FP_CELL)
    
    RegisterHam
(Ham_Spawn,"player","On_Player_Spawn",true)
}

// слишком мощный код
public plugin_cfg()
{
    items_CB = menu_makecallback("Format_ItemsCallback")
    
    new fPath
[256],len
    len 
+= get_configsdir(fPath,charsmax(fPath))
    len += formatex(fPath[len],charsmax(fPath) - len,"/aes/bonus.ini",fPath)
    
    
// читаем файл конфигурации
    new f = fopen(fPath,"r")
    
    if
(!f){
        log_amx("[ERROR] configuration file not found")
        set_fail_state("configuration file not found")
        
        return
    
}
    
    new buffer
[1024],cfgBlock = -1,itemType,key[32],value[sizeof buffer - sizeof key],keyId,line
    new itemData
[itemFieldsStruct],menuData[menuFieldsStruct] 
    
    
// карта ключей параметров
    enum _:{
        KEY_NAME = 1,
        KEY_LEVELMAP,
        KEY_ITEM,
        KEY_CHANCE,
        KEY_PLUGIN,
        KEY_FUNCTION,
        KEY_POINTS,
        KEY_SUMLEVELS,
        
        KEY_MENU_TITLE
,
        KEY_MENU_SAY,
        KEY_MENU_CONSOLE,
        KEY_MENU_ITEMS,
        
        KEY_EXP
,
        KEY_LEVEL,
        KEY_ROUND,
        KEY_TIME,
        
        KEY_FLAGS
,
        KEY_DAYS
    
}
    
    new Trie
:keyMap = TrieCreate()
    
    TrieSetCell
(keyMap,"name",KEY_NAME)
    TrieSetCell(keyMap,"levels",KEY_LEVELMAP)
    TrieSetCell(keyMap,"item",KEY_ITEM)
    TrieSetCell(keyMap,"plugin",KEY_PLUGIN)
    TrieSetCell(keyMap,"function",KEY_FUNCTION)
    TrieSetCell(keyMap,"points",KEY_POINTS)
    TrieSetCell(keyMap,"chance",KEY_CHANCE)
    TrieSetCell(keyMap,"sumlevels",KEY_SUMLEVELS)
    
    TrieSetCell
(keyMap,"title",KEY_MENU_TITLE)
    TrieSetCell(keyMap,"say",KEY_MENU_SAY)
    TrieSetCell(keyMap,"console",KEY_MENU_CONSOLE)
    TrieSetCell(keyMap,"list",KEY_MENU_ITEMS)
    
    TrieSetCell
(keyMap,"exp",KEY_EXP)
    TrieSetCell(keyMap,"level",KEY_LEVEL)
    TrieSetCell(keyMap,"round",KEY_ROUND)
    TrieSetCell(keyMap,"time",KEY_TIME)
    
    TrieSetCell
(keyMap,"flags",KEY_FLAGS)
    TrieSetCell(keyMap,"days",KEY_DAYS)
    
    
//
    // Я НИХУЯ НЕ ПОНИМАЮ ЧТО Я ТУТ НАПИСАЛ
    //
    
    
// читаем содержимое файла конфигурации
    while(!feof(f))
    {
        fgets(f,buffer,charsmax(buffer))
        trim(buffer)
        
        line 
++
        
        if
(!buffer[0] || buffer[0] == ';')
            continue
            
        if
(buffer[0] == '['){    // проверяем какой блок конфигурации сейчас читаем
            switch(cfgBlock){
                case BONUS_ITEM_SPAWN,BONUS_ITEM_MENU: 
                
{
                    if(RegisterBonusItem(itemData,cfgBlock,line))
                        arrayset(itemData,0,itemFieldsStruct)
                }
                case BONUS_MENUS: 
                
{
                    if(RegisterMenuItem(menuData,line) >= 0)
                        arrayset(menuData,0,menuFieldsStruct)
                }
            }
            
            if
(strcmp(buffer,"[spawn]") == 0)        // бонусы на спавне
                cfgBlock = BONUS_ITEM_SPAWN
            else if
(strcmp(buffer,"[items]") == 0)    // бонусы в меню
                cfgBlock = BONUS_ITEM_MENU
            else if
(strcmp(buffer,"[menu]") == 0)    // менюшки    
                cfgBlock = BONUS_MENUS
    
            continue
        
}
    
        
// парсинг предметов
        if(cfgBlock == -1)
            continue
            
        if
(buffer[0] == '<'){    // новый бонус
            if(cfgBlock != BONUS_MENUS){
                if(RegisterBonusItem(itemData,cfgBlock,line))
                    arrayset(itemData,0,itemFieldsStruct)
            
                if
(strcmp(buffer,"<give>") == 0)    // узнаем тип бонуса
                    itemType = ITEM_GIVE
                else if
(strcmp(buffer,"<call>") == 0)
                    itemType = ITEM_CALL
                else
{
                    itemType = -1
                    continue
                
}
                
                itemData
[IB_TYPE] = itemType
            
}else{ // менюшки
                if(RegisterMenuItem(menuData,line) >= 0)
                    arrayset(menuData,0,menuFieldsStruct)
                
                if
(strcmp(buffer,"<menu>") == 0)
                    itemType = ITEM_MENU
                else
                    itemType 
= -1
            
}
                    
            continue
        
}
        
        if
(!itemType)
            continue
        
        
// парсим ключи
        #if AMXX_VERSION_NUM >= 183
            strtok2(buffer,key,charsmax(key),value,charsmax(value),'=',TRIM_FULL)
        #else
            strtok(buffer,key,charsmax(key),value,charsmax(value),'=',1)
            replace(value,charsmax(value),"= ","")
        #endif    
        
        if
(!TrieGetCell(keyMap,key,keyId) || (cfgBlock == BONUS_MENUS && keyId < KEY_MENU_TITLE)){ // узнаем ID ключа
            log_amx("[WARNING] unknown key ^"%s^" on line %d",
                key,line)
                
            continue
        
}
        
        
// парсинг значений ключей
        switch(keyId){
            //
            // Бонус предметы
            //
            
            
// название бонуса
            case KEY_NAME: copy(itemData[IB_NAME],charsmax(itemData[IB_NAME]),value)
            // бонусы по уровням
            case KEY_LEVELMAP: itemData[IB_LEVELS] = _:parse_levels(value)
            // предмет для конструкции <give>
            case KEY_ITEM: copy(itemData[IB_ITEM],charsmax(itemData[IB_ITEM]),value)
            // шанс бонуса
            case KEY_CHANCE: itemData[IB_CHANCE] = _:parse_levels(value)
            // id плагина для конструкции <call>
            case KEY_PLUGIN:{
                itemData[IB_PLUGIN_ID] = find_plugin_byfile(value)
                
                if
(itemData[IB_PLUGIN_ID] == INVALID_PLUGIN_ID){
                    log_amx("[ERROR] can't find plugin ^"%s^" on line %d",value,line)
                    
                    
// убираем этот бонус из меню
                    itemData[IB_TYPE] = -1
                    itemType 
= -1
                
}
            }
            // id функции для конструкции <call>
            case KEY_FUNCTION:{
                if(itemData[IB_PLUGIN_ID] == -1){ // плагин не найден
                    log_amx("[ERROR] plugin not found on line %d",line)
                    
                    itemData
[IB_TYPE] = -1
                    itemType 
= -1
                
}else{
                    itemData[IB_FUNCTION_ID] = get_func_id(value,itemData[IB_PLUGIN_ID])
                    
                    if
(itemData[IB_FUNCTION_ID] == -1){ // проверка на валидность функции
                        log_amx("[ERROR] can't find function ^"%s^" on line %d",value,line)
                        
                        itemData
[IB_TYPE] = -1
                        itemType 
= -1
                    
}
                }
            }
            // кол-во очков для этого бонуса в меню
            case KEY_POINTS: itemData[IB_POINTS] = str_to_num(value)
            // сумирование шанса за все уровни
            case KEY_SUMLEVELS: itemData[IB_SUMCHANCE] = str_to_num(value) ? false : true
            
            
//
            // Меню
            //
            
            
// название меню
            case KEY_MENU_TITLE: copy(menuData[MENU_TITLE],charsmax(menuData[MENU_TITLE]),value)
            // команда в чат для вызова меню
            case KEY_MENU_SAY: copy(menuData[MENU_SAYCMD],charsmax(menuData[MENU_SAYCMD]),value)
            // команда в консоли для вызова этого меню
            case KEY_MENU_CONSOLE: copy(menuData[MENU_CONCMD],charsmax(menuData[MENU_CONCMD]),value)
            // список предметов в меню
            case KEY_MENU_ITEMS: menuData[MENU_LIST] = _:parse_levels(value)
            
            case KEY_EXP
: itemData[IB_EXP] = _:str_to_float(value)
            case KEY_LEVEL: itemData[IB_LEVEL] = str_to_num(value)
            case KEY_ROUND: itemData[IB_ROUND] = str_to_num(value)
            case KEY_TIME: itemData[IB_TIME]  = _:str_to_float(value)
            
            case KEY_FLAGS
: copy(itemData[IB_FLAGS], charsmax(itemData[IB_FLAGS]), value);
            case KEY_DAYS: itemData[IB_DAYS] = str_to_num(value);
        }
    }
    
    switch
(cfgBlock){    // разбираем последний предмет, если есть
        case BONUS_ITEM_SPAWN,BONUS_ITEM_MENU: 
            if
(RegisterBonusItem(itemData,cfgBlock,line))
                arrayset(itemData,0,itemFieldsStruct)
        case BONUS_MENUS: {
            if(RegisterMenuItem(menuData,line) >= 0)
                arrayset(menuData,0,menuFieldsStruct)
        }
    }
    
    TrieDestroy
(keyMap)
    
    
// бонусы на спавне
    if(g_SpawnBonusItems)
    { 
        g_SpawnBonusCount 
= ArraySize(g_SpawnBonusItems)
    }
    
    if
(g_PointsBonusItems){
        g_PointsBonusCount = ArraySize(g_PointsBonusItems)
        
        
// регистрация бонус менюшек
        if(g_PointsBonusCount){
            if(g_BonusMenus){
                for(new i,length = ArraySize(g_BonusMenus) ; i < length ; i++){
                    ArrayGetArray(g_BonusMenus,i,menuData)
                    
                    if
(!callCmds)
                        callCmds = TrieCreate()
                    
                    if
(menuData[MENU_SAYCMD][0]){
                        if(!TrieKeyExists(callCmds,menuData[MENU_SAYCMD])){
                            new sayCmd[128]
                            formatex(sayCmd,charsmax(sayCmd),"say %s",menuData[MENU_SAYCMD])
                            register_clcmd(sayCmd,"Forward_CallCommand")
                            
                            TrieSetCell
(callCmds,menuData[MENU_SAYCMD],i)
                        }else{
                            log_amx("WARNING! ^"%s^" say command already in use on line %d!",menuData[MENU_CONCMD],line)
                        }
                    }
                    
                    if
(menuData[MENU_CONCMD][0]){
                        if(!TrieKeyExists(callCmds,menuData[MENU_CONCMD])){
                            register_clcmd(menuData[MENU_CONCMD],"Forward_CallCommand")
                            TrieSetCell(callCmds,menuData[MENU_CONCMD],i)
                        }else
                            log_amx("WARNING ^"%s^" console command already in use on line %d!",menuData[MENU_CONCMD],line)
                    }
                }
            }else{    // дефолтное меню /anew
                register_clcmd("say /anew","Forward_CallCommand")
                register_clcmd("anew","Forward_CallCommand")
            }
        }
    }
    
    if
(get_pcvar_num(cvar[CVAR_BONUS_SPAWN]) == 2)
    {
        if(cstrike_running())
        {
            register_logevent("ResetSpawn",2,"1=Round_End")
            register_logevent("RoundStart",2,"0=World triggered","1=Round_Start")
            register_logevent("RoundRestart",2,"0=World triggered","1=Game_Commencing")
            register_event("TextMsg","RoundRestart","a","2&#Game_will_restart_in")
        }
    }
}

public RoundRestart()
{
    iRound = 0
}

public RoundStart()
{
    iRound ++
}

public Check_LockMap()
{
    new getmap[32],map[32]
    read_args(getmap,charsmax(getmap))
    remove_quotes(getmap)
    
    get_mapname
(map,charsmax(map))
    
    if
(!strcmp(getmap,map))
    {
        isLocked = true
        
        set_pcvar_num
(cvar[CVAR_BONUS_ENABLED],0)
    }
}

public client_disconnected(id)
{
    player_already_spawned[id] = false
}

//
// Обработчик консольных команд
//
public Forward_ConsoleCommand(id){
    if(!g_BonusMenus)
        return Format_BonusMenu(id,-1)
    
    new consoleCmd
[128]
    read_argv(0,consoleCmd,127)
    
    new cmdId
    
    
// проверяем что сообщение содержит команду и узнаем её ID
    if(!TrieGetCell(g_MenuCommandsValid,consoleCmd,cmdId))
        return PLUGIN_HANDLED
        
    Format_BonusMenu
(id,cmdId)
        
    return PLUGIN_HANDLED
}

//
// Обработчик say комманд
//
public Forward_CallCommand(id){
    if(!g_BonusMenus)
        return Format_BonusMenu(id,-1)
    
    new cmd
[128]
    read_args(cmd,charsmax(cmd))
    
    if
(!cmd[0])
        read_argv(0,cmd,charsmax(cmd))
    
    trim
(cmd)
    remove_quotes(cmd)
    
    new cmdId
    
    if
(!TrieGetCell(callCmds,cmd,cmdId))
        return PLUGIN_CONTINUE
    
    Format_BonusMenu
(id,cmdId)
        
    return PLUGIN_CONTINUE
}

//
// Форматирование менюшек
//
public Format_BonusMenu(id,cmdId){
    if(isLocked){    // проверка возможности использования бонусов на этой карте
        client_print_color(id,0,"%L %L",id,"AES_TAG",id,"AES_ANEW_BLOCKED")
        
        return PLUGIN_CONTINUE
    
}
    
    new player_bonus 
= aes_get_player_bonus(id)
    
    new player_bonus_str
[10]
    num_to_str(player_bonus,player_bonus_str,charsmax(player_bonus_str))
    
    if
(player_bonus <= 0){ // еще какая-то проверка
        client_print_color(id,0,"%L %L",id,"AES_TAG",id,"AES_ANEW_NOT")
        
        return PLUGIN_CONTINUE
    
}
    
    new ret
    ExecuteForward
(iaNewForward,ret,id)
    
    if
(ret == PLUGIN_HANDLED) // блок вызова в другом плагине
        return PLUGIN_HANDLED
    
    new m
,itemData[itemFieldsStruct]
    
    if
(cmdId == -1){ // строим дефолтное меню anew со списком всех предметов
        formatex(itemName,charsmax(itemName),"%L %L",id,"AES_TAG_MENU",id,"AES_BONUS_MENU",player_bonus)
        m = menu_create(itemName,"aNew_MenuHandler")
        
        for
(new i ; i < g_PointsBonusCount ; i++){
            ArrayGetArray(g_PointsBonusItems,i,itemData)
            
            num_to_str
(i,itemInfo,charsmax(itemInfo))
            aes_get_item_name(itemData[IB_NAME],itemName,charsmax(itemName),id)
            
            menu_additem
(m,itemName,itemInfo,.callback = items_CB)
        }
    }else{
        new menuData[menuFieldsStruct],itemIndex
        ArrayGetArray
(g_BonusMenus,cmdId,menuData)

        new len = formatex(itemName,charsmax(itemName),"%L ",id,"AES_TAG_MENU")
        len += aes_get_item_name(menuData[MENU_TITLE],itemName[len],charsmax(itemName) - len,id)
        
        replace_all
(itemName,charsmax(itemName),"\n","^n")
        replace_all(itemName,charsmax(itemName),"<p>",player_bonus_str)
        
        m 
= menu_create(itemName,"aNew_MenuHandler")
        
        for
(new i,length = ArraySize(menuData[MENU_LIST]) ; i < length ; i++){
            itemIndex = ArrayGetCell(menuData[MENU_LIST],i) - 1
            
            if
(!(<=itemIndex < g_PointsBonusCount)) // что ты мне подсунул, блеать
                continue
                
            ArrayGetArray
(g_PointsBonusItems,i,itemData)
            num_to_str(i,itemInfo,charsmax(itemInfo))
            aes_get_item_name(itemData[IB_NAME],itemName,charsmax(itemName),id)
            
            menu_additem
(m,itemName,itemInfo,.callback = items_CB)
        }
    }
    
    
    if
(!= -1)
    {
        F_Format_NavButtons(id,m)
        menu_display(id,m)
    }
    
    return PLUGIN_CONTINUE
}

//
// Хандлер итемов в меню
//
public Format_ItemsCallback(id,menu,item)
{
    new info[10],item_name[256],dummy
    menu_item_getinfo
(menu,item,dummy,info,charsmax(info),item_name,charsmax(item_name),dummy)
    
    new itemData
[itemFieldsStruct]
    ArrayGetArray(g_PointsBonusItems,str_to_num(info),itemData)
    
    new limit_fields 
= Bonus_CheckLimits(id,itemData)
    
    for
(new i = 1; i <= 5 ; i++)
    {
        if(limit_fields & (1<<i))
        {
            new tmpLang[128],lang_key[16]
            formatex(lang_key,charsmax(lang_key),"AES_ANEW_INFO%d",i)
                
            formatex
(tmpLang,charsmax(tmpLang)," %L",id,lang_key,itemData[IB_POINTS + (- 1)])
            add(item_name,charsmax(item_name),tmpLang)
    
            menu_item_setname
(menu,item,item_name)
            
            return ITEM_DISABLED
        
}
    }
    
    return ITEM_ENABLED
}

//
// Проверяем ограничения на бонусы
//
Bonus_CheckLimits(id,itemData[itemFieldsStruct])
{
    new limit_fields = 0
    
    
// проверяем доступность по бонусам
    if(itemData[IB_POINTS])
    {
        new player_bonus = aes_get_player_bonus(id)
        
        if
(itemData[IB_POINTS] > player_bonus)
        {
            limit_fields |= LIMIT_POINTS
        
}
    }
    
    
// проверяем доступность по обыту
    if(itemData[IB_EXP])
    {
        new Float:player_exp = aes_get_player_exp(id)
    
        if
(itemData[IB_EXP] > player_exp)
        {
            limit_fields |= LIMIT_EXP
        
}
    }
    
    
// проверяем доступность по уровню
    if(itemData[IB_LEVEL])
    {
        new player_level = aes_get_player_level(id) + 1
    
        if
(itemData[IB_LEVEL] > player_level)
        {
            limit_fields |= LIMIT_LEVEL
        
}
    }
    
    
// проверяем доступность по раунду
    if(itemData[IB_ROUND])
    {
        if(itemData[IB_ROUND] > iRound)
        {
            limit_fields |= LIMIT_ROUND
        
}
    }
    
    
// проверяем на доступность по времени
    if(itemData[IB_TIME])
    {
        if(itemData[IB_TIME] < (get_gametime() - player_spawn_time[id]))
        {
            limit_fields |= LIMIT_TIME
        
}
    }
    
    return limit_fields
}

public F_Format_NavButtons(id,menu){
    new tmpLang[20]
    
    formatex
(tmpLang,charsmax(tmpLang),"%L",id,"BACK")
    menu_setprop(menu,MPROP_BACKNAME,tmpLang)
    
    formatex
(tmpLang,charsmax(tmpLang),"%L",id,"EXIT")
    menu_setprop(menu,MPROP_EXITNAME,tmpLang)
    
    formatex
(tmpLang,charsmax(tmpLang),"%L",id,"MORE")
    menu_setprop(menu,MPROP_NEXTNAME,tmpLang)
}

//
// Хандлер бонус меню
//
public aNew_MenuHandler(id,m,item){
    if(item == MENU_EXIT)
    {
        menu_destroy(m)
        return PLUGIN_HANDLED
    
}
    
    if
(Format_ItemsCallback(id,m,item) != ITEM_ENABLED)
    {
        menu_destroy(m)
        return PLUGIN_HANDLED
    
}
    
    menu_item_getinfo
(m,item,itemName[0],itemInfo,charsmax(itemInfo),itemName,1,itemName[0])
    new itemKey = str_to_num(itemInfo)
    
    menu_destroy
(m)
    
    new itemData
[itemFieldsStruct]
    ArrayGetArray(g_PointsBonusItems,itemKey,itemData)
    
    if
(GiveBonus(itemData,id))
    {
        aes_add_player_bonus_f(id,-itemData[IB_POINTS])
        
        aes_get_item_name
(itemData[IB_NAME],itemName,charsmax(itemName),id)
        strip_menu_codes(itemName,charsmax(itemName))
        
        client_print_color
(id,0,"%L %L",id,"AES_TAG",id,"AES_ANEW_GIVE",itemName,itemData[IB_POINTS])
    }
    
    return PLUGIN_HANDLED
}

//
// Назначение бонус предметов
//    itemData- данные бонуса
//    id - игрок
//    count - кол-во бонусов
//    psh - пшш парень, значение в функцию передать не хочешь?
//
GiveBonus(itemData[itemFieldsStruct],id,count = 1,psh = 0){
    switch(itemData[IB_TYPE])
    {
        case ITEM_GIVE:
        {
            for(new i ; i < count ; i++)
            {
                if(!give_item(id,itemData[IB_ITEM]))
                {
                    client_print_color(id,print_team_default,"%L %L",id,"AES_TAG",id,"AES_ANEW_CALL_PROBLEM")
                    return false
                
}
            }
        }
        case ITEM_CALL:
        {
            if(callfunc_begin_i(itemData[IB_FUNCTION_ID],itemData[IB_PLUGIN_ID]))
            {
                callfunc_push_int(id)

                if(itemData[IB_FLAGS][0])
                {
                    callfunc_push_str(itemData[IB_FLAGS]);
                    if(itemData[IB_DAYS])
                        callfunc_push_int(itemData[IB_DAYS]);
                }        
                else    callfunc_push_int
(count);
                if(psh)
                    callfunc_push_int(psh);                
                
                return callfunc_end
();
            }
            else
            
{
                client_print_color(id,print_team_default,"%L %L",id,"AES_TAG",id,"AES_ANEW_CALL_PROBLEM")
                return false
            
}
        }
    }
    
    return true
}

//
// Очищение строки от символов меню
//
strip_menu_codes(itemName[],len)
{
    replace_all(itemName,len,"\r","")
    replace_all(itemName,len,"\y","")
    replace_all(itemName,len,"\R","")
    replace_all(itemName,len,"\w","")
}

//
// Выдача бонусов на спавнеы
//
public On_Player_Spawn(id)
{
    Bonus_OnSpawn(id)
        
    return HAM_IGNORED
}

public Bonus_OnSpawn(id)
{
    if(isLocked || !get_pcvar_num(cvar[CVAR_BONUS_ENABLED]) || !is_user_alive(id))
        return false
    
    player_spawn_time
[id] = get_gametime()
        
    new player_level 
= aes_get_player_level(id)
        
    switch
(get_pcvar_num(cvar[CVAR_BONUS_SPAWN]))
    {
        case 0: return HAM_IGNORED
        case 2
: // запоминаем спавн игрока
        { 
            
// игрок уже заспавнился
            if(player_already_spawned[id])
            {
                return HAM_IGNORED
            
}
            
            player_already_spawned
[id] = true
        
}
    }
    
    new itemData
[itemFieldsStruct],actLevel = -1
    new levelValue
    
    new Array
:assigned_bonuses
        
    
// проверяем бонусы на спавне
    for(new i;< g_SpawnBonusCount ; ++i)
    {
        arrayset(itemData,0,itemFieldsStruct)
        ArrayGetArray(g_SpawnBonusItems,i,itemData)
        
        if
(Bonus_CheckLimits(id,itemData))
        {
            continue
        
}
        
        
// считаем шанс выдачи бонуса
        if(itemData[IB_CHANCE])
        {
            new chanceValue
            
            if
(player_level >= ArraySize(itemData[IB_CHANCE])) // :D
                actLevel = ArraySize(itemData[IB_CHANCE]) - 1
            else
                actLevel 
= player_level
            
            if
(itemData[IB_SUMCHANCE]){
                for(new z ; z <= actLevel ; z++)    // складываем общий шанс за все уровни
                    chanceValue += ArrayGetCell(itemData[IB_CHANCE],i)
            }else{
                if(actLevel < 0)
                    continue
            
                chanceValue 
= ArrayGetCell(itemData[IB_CHANCE],actLevel)
            }
            // проверяем что это наш шанс
            if(chanceValue * 10 < random_num(0,1000))
            {
                continue    // извини братюнь, в другой раз
            }
        }
        
        
// узнаем значение бонуса для определенного уровня
        if(itemData[IB_LEVELS])
        {
            if(player_level >= ArraySize(itemData[IB_LEVELS])) // :D
                actLevel = ArraySize(itemData[IB_LEVELS]) - 1
            else
                actLevel 
= player_level
            
            if
(itemData[IB_SUMCHANCE])
            {
                for(new i ; i <= actLevel ; i++)    // складываем значения за все уровни
                    levelValue += ArrayGetCell(itemData[IB_LEVELS],i)
            }
            else
            
{
                if(actLevel < 0)
                {
                    continue
                
}
                
                levelValue 
= ArrayGetCell(itemData[IB_LEVELS],actLevel)
            }
        }
        
        if
(levelValue > 0)
        {
            // выдаем бонус
            if(GiveBonus(itemData,id,levelValue))
            {
                if(!assigned_bonuses)
                {
                    assigned_bonuses = ArrayCreate(sizeof itemData[IB_NAME])
                }
                
                ArrayPushString
(assigned_bonuses,itemData[IB_NAME])
            }
        }
    }
    
    if
(assigned_bonuses)
    {
        new bonus_info[192],len
        
        len 
= formatex(bonus_info,charsmax(bonus_info),"%L %L ",id,"AES_TAG",
            id,"AES_ANEW_INFO6")
            
        for
(new i,length = ArraySize(assigned_bonuses) ; i < length ; i++)
        {
            ArrayGetString(assigned_bonuses,i,itemData[IB_NAME],charsmax(itemData[IB_NAME]))
            
            if
(> 0)
            {
                len += formatex(bonus_info[len],charsmax(bonus_info) - len,", ")
            }
            
            len 
+= formatex(bonus_info[len],charsmax(bonus_info) - len,"^4")
            len += aes_get_item_name(itemData[IB_NAME],bonus_info[len],charsmax(bonus_info) - len,id)
            len += formatex(bonus_info[len],charsmax(bonus_info) - len,"^1")
        }
        
        ArrayDestroy
(assigned_bonuses)
        
        client_print_color
(id,print_team_default,bonus_info)
    }
    
    return true
}

public Array:parse_levels(levelString[]){
    new Array:which = ArrayCreate(1)
    
    new stPos
,ePos,rawPoint[20]
    
    
// parse levels entry
    do {
        ePos = strfind(levelString[stPos]," ")
        
        formatex
(rawPoint,ePos,levelString[stPos])
        ArrayPushCell(which,str_to_num(rawPoint))
        
        stPos 
+= ePos + 1
    
} while (ePos != -1)
    
    return which
}

public aes_get_item_name(itemString[],out[],len,id)
{
    new l
    
    if
(strfind(itemString,"LANG_") == 0)// формирование по словарю
    { 
        replace
(itemString,strlen(itemString),"LANG_","")
        
        l 
= formatex(out,len,"%L",id,itemString)
    }
    else
    
{
        l = copy(out,len,itemString)
    }
    
    return l
}

//
// Регистрация бонус предмета
//    itemData - данные
//    cfgBlock - конфигурационный блок
//    line - линия
//
public RegisterBonusItem(itemData[itemFieldsStruct],cfgBlock,line){
    if(itemData[IB_TYPE]){    // записываем параметры предедущего бонуса
        new bool:isOk = true
                
        
// проверки на валидность
        switch(itemData[IB_TYPE]){
            case ITEM_GIVE:{
                if(!itemData[IB_ITEM][0]){
                    log_amx("[ERROR] give item not set on line %d",line)
                    isOk = false
                
}
            }
        }
                
        if
(isOk){
            new Array:itemArray
            
            switch
(cfgBlock){
                case BONUS_ITEM_SPAWN: {
                    if(!g_SpawnBonusItems)
                        g_SpawnBonusItems = ArrayCreate(itemFieldsStruct)
                        
                    itemArray 
= g_SpawnBonusItems
                
}
                case BONUS_ITEM_MENU: {
                    if(!g_PointsBonusItems)
                        g_PointsBonusItems = ArrayCreate(itemFieldsStruct)
                                
                    itemArray 
= g_PointsBonusItems
                
}
            }
                    
            if
(itemArray)
                ArrayPushArray(itemArray,itemData)
        }
        
        return true
    
}
    
    return false
}

public RegisterMenuItem(menuData[menuFieldsStruct],line){
    if(!menuData[MENU_SAYCMD][0] && !menuData[MENU_CONCMD][0])
        return -1
    
    if
(!g_BonusMenus)
        g_BonusMenus = ArrayCreate(menuFieldsStruct)
        
    ArrayPushArray
(g_BonusMenus,menuData)
    
    return ArraySize
(g_BonusMenus) - 1
}

public ResetSpawn()
{
    arrayset(player_already_spawned,false,sizeof player_already_spawned)
    arrayset(_:player_spawn_time,0,sizeof player_spawn_time)
}
 

Вот исходник бонус флага:
Код: Выделить всё
#include <amxmodx>
#include <sqlx>
#if AMXX_VERSION_NUM < 183
    #include <colorchat>
#endif

forward amxbans_sql_initialized(Handle:sqlTuple, const dbPrefix[]);
forward fbans_sql_connected(Handle:sqlTuple);
forward lite_bans_sql_init(Handle:sqlTuple);

enum (+=1) {
    NONE = 0,
    AMX,
    FB,
    LB
}

enum _:qState     { AddOne, AddTwo }

new g_System = NONE;
new Handle:g_DBTuple;
new g_TableAdmins[100], g_TableSAdmins[100], g_TableSInfo[100], g_ServerIp[25];
new g_szQuery[1024], g_Data[2];

public plugin_init()
{
#define PNAME "AES Bonus: Flags"
#define PVERSION "0.2"
#define PAUTHOR "Sonyx"
    register_plugin(PNAME, PVERSION, PAUTHOR);
}

public amxbans_sql_initialized(Handle:sqlTuple, const dbPrefix[])
{
    if (g_System != NONE) {
        return PLUGIN_CONTINUE;
    }

    g_DBTuple = sqlTuple;
    g_System = AMX;    

    formatex
(g_TableAdmins, charsmax(g_TableAdmins), "%s_amxadmins", dbPrefix);
    formatex(g_TableSInfo, charsmax(g_TableSInfo), "%s_serverinfo", dbPrefix);
    formatex(g_TableSAdmins, charsmax(g_TableSAdmins), "%s_admins_servers", dbPrefix);
    
    get_cvar_string
("amxbans_server_address", g_ServerIp, charsmax(g_ServerIp));
    if (!g_ServerIp[0]) {
        get_user_ip(0, g_ServerIp, charsmax(g_ServerIp), 0);
    }

    return PLUGIN_CONTINUE;
}

public lite_bans_sql_init(Handle:sqlTuple)
{
    new dbPrefix[64];

    if (g_System != NONE) {
        return PLUGIN_CONTINUE;
    }

    g_DBTuple = sqlTuple;
    g_System = LB;    

    get_cvar_string
("lb_sql_pref", dbPrefix, charsmax(dbPrefix));

    formatex(g_TableAdmins, charsmax(g_TableAdmins), "%s_amxadmins", dbPrefix);
    formatex(g_TableSInfo, charsmax(g_TableSInfo), "%s_serverinfo", dbPrefix);
    formatex(g_TableSAdmins, charsmax(g_TableSAdmins), "%s_admins_servers", dbPrefix);
    
    get_cvar_string
("lb_server_ip", g_ServerIp, charsmax(g_ServerIp));
    if (!g_ServerIp[0]) {
        get_user_ip(0, g_ServerIp, charsmax(g_ServerIp), 0);
    }

    return PLUGIN_CONTINUE;
}

public fbans_sql_connected(Handle:sqlTuple)
{
    new i_Ip[16], i_Port[8];
    if (g_System != NONE) {
        return PLUGIN_CONTINUE;
    }

    g_DBTuple = sqlTuple;
    g_System = FB;
    if (!get_cvar_string("amx_amxadmins_table", g_TableAdmins, charsmax(g_TableAdmins)))
        g_TableAdmins = "amx_amxadmins";
    if (!get_cvar_string("amx_admins_table", g_TableSAdmins, charsmax(g_TableSAdmins)))
        g_TableSAdmins = "amx_admins_servers";
    get_cvar_string("fb_servers_table", g_TableSInfo, charsmax(g_TableSInfo));
    get_cvar_string("fb_server_ip", i_Ip, charsmax(i_Ip));
    get_cvar_string("fb_server_port", i_Port, charsmax(i_Port));

    formatex(g_ServerIp, charsmax(g_ServerIp), "%s:%s", i_Ip, i_Port);

    return PLUGIN_CONTINUE;
}

public SQL_Handler(failstate, Handle:query, err[], errcode, dt[], datasize)
{
    switch(failstate)
    {
        case TQUERY_CONNECT_FAILED, TQUERY_QUERY_FAILED:
        {
            log_amx("[SQL ERROR #%d][Query State %d] %s", errcode, dt[0], err);
            SQL_FreeHandle(query);
            return;
        }
    }

    switch(dt[0])
    {
        case AddOne:
        {
            g_Data[0] = AddTwo;
            new szAuth[25], iID = SQL_GetInsertId(query);
            get_user_authid(dt[1], szAuth, charsmax(szAuth));
            formatex(g_szQuery, charsmax(g_szQuery), "INSERT INTO %s (admin_id, server_id, custom_flags, use_static_bantime) VALUES ('%d', (SELECT id FROM %s WHERE address = '%s'), '', 'no')", g_TableSAdmins, iID, g_TableSInfo, g_ServerIp);
            SQL_ThreadQuery(g_DBTuple, "SQL_Handler", g_szQuery, g_Data, sizeof(g_Data));
        }
        case AddTwo:
        {
            SQL_FreeHandle(query);
            server_cmd("amx_reloadadmins");
        }
    }
}

public pointBonus_GiveFlags(id, flags[], days)
{
    if(!flags[0] || !days)
        return 0;
    if (g_System == NONE)
    {
        client_print_color(id, id, "^4[AES] ^3Отсутствует подключение к Базе!");
        return 0;
    }
    if (get_user_flags(id) & read_flags(flags))
    {
        client_print_color(id, id, "^4[AES] ^3У вас уже есть данная привилегия!");
        return 0;
    }
    new szAuth[25], szName[32], szPlayerEnd;

    get_user_authid(id, szAuth, charsmax(szAuth));
    get_user_name(id, szName, charsmax(szName));
    szPlayerEnd = get_systime() + days * 86400;
    
    g_Data
[0] = AddOne;
    g_Data[1] = id;

    formatex(g_szQuery, charsmax(g_szQuery), "INSERT INTO %s (username, access, flags, steamid, nickname, ashow, created, expired, days) VALUES ('%s', '%s', 'ce', '%s', '%s', '0', UNIX_TIMESTAMP(NOW()), '%d', '%d')", g_TableAdmins, szAuth, flags, szAuth, szName, szPlayerEnd, days);
    SQL_ThreadQuery(g_DBTuple, "SQL_Handler", g_szQuery, g_Data, sizeof(g_Data));
    
    return 1
;
Аватара пользователя
Максим_SerJanT
 
Сообщения: 74
Зарегистрирован: 16 авг 2017, 01:32
Благодарил (а): 7 раз.
Поблагодарили: 1 раз.

Вернуться в Скриптинг

Кто сейчас на конференции

Сейчас этот форум просматривают: Google [Bot] и гости: 3