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

Меню с доступом только админу  [Решено]

Все вопросы по работе и настройке AMXX и его плагинов.

Модератор: liFe iS GoOD

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

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

Меню с доступом только админу

Сообщение Печенька » 16 апр 2017, 19:56

Ребят подскажите пожалуйста в плагине доступ к меню по флагу администратора [A]
но почему то меню открывается любым игроком?
Код: Выделить всё
#include <amxmodx>
#include <amxmisc>
#include <fakemeta_util>
#include <hamsandwich>
#include <dhudmessage>
#include <WPMGPrintChatColor>

#define PLUGIN "Checkpoints"
#define VERSION "0.7"
#define AUTHOR "Psycrow"

#define MODEL_CP        "models/n21_deathrun/checkpoints/cp.mdl"
#define SOUND_CP        "n21_deathrun/checkpoint2.wav"

#define CLASSNAME_CP        "checkpoint"

#define DHUD_POSITION         0, 255, 0, -1.0, 0.8, 2, 1.05, 1.05, 0.05, 3.0

#if cellbits == 32
    #define OFFSET_CSMONEY 115
#else
    #define OFFSET_CSMONEY 140
#endif

new
    g_msgMoney,
    g_infoTarget,
    g_maxPlayers,
    bool: g_save_cpl,                //Изменения в расположении чекпоинтов
    bool: g_registration,                //Ничего не регистрировать если чекпоинтов нет
    bool: is_round_end,                //Блокирует сбор чекпоинтов после окончания раунда
    cp_count,                    //Кол-во чекпоинтов
    g_cp_pass[33],                    //Последний пройденный чекпоинт игроком
    g_finished[33],                    //Кто на каком месте пришел к финишу.
    g_fin_pos,                    //Последнее занятое место

    Array:g_cp_id,                    //Индексы чекпоинтов
    Array:g_cp_origin_x,
    Array:g_cp_origin_y,
    Array:g_cp_origin_z

public plugin_precache
()
{
    precache_model(MODEL_CP)
    precache_sound(SOUND_CP)
}

public plugin_init()
{
    register_plugin(PLUGIN, VERSION, AUTHOR)
        
    register_cvar
("cv_checkpoint_money","1") // Выдавать ли деньги?
    register_cvar("cv_checkpoint_teleport","1") // Возрождать ли у чекпоинта?
    register_cvar("cv_checkpoint_money_give","300") // Сколько выдавать денег на прохождение обычных чекпоинтов
    register_cvar("cv_checkpoint_money_koef","1") // Умножать ли награду за пройденный чекпоинт на номер чекпоинта?
    register_cvar("cv_checkpoint_money_last_first","6000") // Сколько выдавать денег за пройденный последний чекпоинт на первом месте
    register_cvar("cv_checkpoint_money_last_second","4000") // На втором месте
    register_cvar("cv_checkpoint_money_last_third","3500") // На третьем месте
    register_cvar("cv_checkpoint_money_max","16000") // Лимит денег
    
    register_clcmd
("say /checkpoint", "checkpoint_menu", ADMIN_IMMUNITY)
    register_clcmd("say_team /checkpoint", "checkpoint_menu", ADMIN_IMMUNITY)
            
    g_infoTarget 
= engfunc(EngFunc_AllocString, "info_target")
}

public plugin_cfg()
{
    new map[32]
    get_mapname(map, charsmax(map))
    formatex(map, charsmax(map),"%s.ini",map)
    
    new cfgDir
[64], iDir, iFile[128]
    get_configsdir(cfgDir, charsmax(cfgDir))
    formatex(cfgDir, charsmax(cfgDir), "%s/next21_checkpoints", cfgDir)
    
    iDir 
= open_dir(cfgDir, iFile, charsmax(iFile))
    
    if
(iDir)
    {
        while(next_file(iDir, iFile, charsmax(iFile)))
        {
            if (iFile[0] == '.')
                continue
                
            if
(equal(map, iFile))
            {
                format(iFile, 128, "%s/%s", cfgDir, iFile)
                get_checkpoints(iFile)
                break
            
}
        }
    }
    else server_print("[%s] Checkpoints was not loaded", PLUGIN)    
}

public fw_PlayerSpawn(id)
    teleport(id)

public fw_RoundStart()
{
    is_round_end = false
    g_fin_pos 
= 0
    
    static i
    for
(= 1; i <= g_maxPlayers; i++)
    {
        g_finished[i] = 0
        g_cp_pass
[i] = -1
    
}
}

public fw_RoundEnd()
{
    
    
//Тут можно вставить тройку победителей, используя g_finished[id]
    
    is_round_end 
= true
}

public fw_TouchCheckpoint(ent, id)
{
    
    if
(is_round_end || !is_user_alive(id) || !pev_valid(ent))
        return
                    
    if
(g_cp_pass[id] == cp_count-1)
        return
        
    static className
[32]
    pev(ent, pev_classname, className, 31)
    if(!equal(className, CLASSNAME_CP))
        return
 
    static i
    for
(= g_cp_pass[id] + 1; i < cp_count; i++)
    {
        if(ent == ArrayGetCell(g_cp_id, i))    
        
{        
            client_cmd
(id, "spk %s", SOUND_CP)
            g_cp_pass[id] = i
            
            set_dhudmessage
(DHUD_POSITION)
            static reward
            
            if
(== cp_count - 1)
            {
                g_fin_pos++
                show_dhudmessage(id, "Р’С‹ РїСЂРѕС€Р»Рё С‡РµСЂРµР· РїРѕСЃР»РµРґРЅРёР№ С‡РµРєРїРѕРёРЅС‚ Рё С„инишировали РЅР°^n %d РјРµСЃС‚Рµ", g_fin_pos)
                static player_name[32] 
                get_user_name
(id, player_name, 31)     
                PrintChatColor
(0, PRINT_COLOR_PLAYERTEAM, "!g[%s] !tИгрок !g%s !tпришел Рє С„инишу РЅР° !g%d !tместе", PLUGIN, player_name, g_fin_pos) 
                
                switch
(g_fin_pos)
                {
                    case 1: reward = get_cvar_num("cv_checkpoint_money_last_first")
                    case 2: reward = get_cvar_num("cv_checkpoint_money_last_second")
                    case 3: reward = get_cvar_num("cv_checkpoint_money_last_third")
                    default: 
                    
{
                        reward = get_cvar_num("cv_checkpoint_money_give")
                        if(get_cvar_num("cv_checkpoint_money_koef"))
                            reward *= i + 1
                    
}
                }
                
                g_finished
[id] = g_fin_pos
            
}
            else
            
{
                reward = get_cvar_num("cv_checkpoint_money_give")
                if(get_cvar_num("cv_checkpoint_money_koef"))
                    reward *= i + 1
                show_dhudmessage
(id, "Р’С‹ РїСЂРѕС€Р»Рё С‡РµСЂРµР· С‡РµРєРїРѕРёРЅС‚ %d",+ 1)
            }
            
            if
(get_cvar_num("cv_checkpoint_money"))
            {
                static curr_money, max_money
                curr_money 
= get_pdata_int(id, OFFSET_CSMONEY)
                max_money = get_cvar_num("cv_checkpoint_money_max")
    
                if
(curr_money + reward > max_money)
                    reward = max_money - curr_money
            
                set_pdata_int
(id, OFFSET_CSMONEY, curr_money + reward)
            
                message_begin
(MSG_ONE, g_msgMoney, _, id)
                write_long(curr_money + reward)
                write_byte(1)
                message_end()
            
                PrintChatColor
(id, PRINT_COLOR_PLAYERTEAM, "!g[%s] !tР’С‹ РїРѕР»СѓС‡Р°РµС‚Рµ !g%d$", PLUGIN, reward) 
            
}
        }
    }
}

public checkpoint_menu(id)
{
    new menu_name[80]
    format(menu_name, 79, "\rРасстановка С‡РµРєРїРѕРёРЅС‚РѕРІ^n\dТекущий С‡РµРєРїРѕРёРЅС‚: %d", cp_count + 1)

    new i_menu = menu_create(menu_name, "menu_handler")
    
    menu_additem
(i_menu, "\wУстановить Р§РµРєРїРѕРёРЅС‚", "1", 0)
    
    if
(!cp_count)
    {
        menu_additem(i_menu, "\dУдалить РїСЂРµРґС‹РґСѓС‰РёР№ Р§РµРєРїРѕРёРЅС‚", "2", 0)
        menu_additem(i_menu, "\dУдалить РІСЃРµ Р§РµРєРїРѕРёРЅС‚С‹", "3", 0)
    }
    else 
    
{
        menu_additem(i_menu, "\wУдалить РїСЂРµРґС‹РґСѓС‰РёР№ Р§РµРєРїРѕРёРЅС‚", "2", 0)
        menu_additem(i_menu, "\wУдалить РІСЃРµ Р§РµРєРїРѕРёРЅС‚С‹", "3", 0)
    }
    
    if
(!g_save_cpl)
        menu_additem(i_menu, "\dСохранить РёР·РјРµРЅРµРЅРёСЏ", "4", 0)
    else menu_additem(i_menu, "\wСохранить РёР·РјРµРЅРµРЅРёСЏ", "4", 0)

    menu_setprop(i_menu, MPROP_EXIT, MEXIT_ALL)
    menu_setprop(i_menu, MPROP_EXITNAME, "\yВыход")
    menu_display(id, i_menu, 0)
        
    return PLUGIN_HANDLED
}

public menu_handler(id, menu, item)
{
    if(item == MENU_EXIT)
    {
        menu_destroy(menu)
        return PLUGIN_HANDLED
    
}
    
    switch
(item)
    {
        case 0:
        {        
            new Float
:fOrigin[3]
            fm_get_aim_origin(id, fOrigin)
            fOrigin[2] += 60.0
            
            if
(create_checkpoint(fOrigin))
                g_save_cpl = true
                
            menu_destroy
(menu)
            checkpoint_menu(id)
        }
        case 1:
        {
            if(!cp_count)
            {
                PrintChatColor(id, PRINT_COLOR_PLAYERTEAM, "!g[%s] !tРќР° РєР°СЂС‚Рµ РЅРµС‚ Р§РµРєРїРѕРёРЅС‚РѕРІ", PLUGIN) 
                
                menu_destroy
(menu)
                checkpoint_menu(id)
                
                return PLUGIN_HANDLED
            
}
            
            g_save_cpl 
= true
            PrintChatColor
(id, PRINT_COLOR_PLAYERTEAM, "!g[%s] !tЧекпоинт СѓРґР°Р»РµРЅ", PLUGIN)
            
            cp_count
--
            engfunc(EngFunc_RemoveEntity, ArrayGetCell(g_cp_id, cp_count))
            ArrayDeleteItem(g_cp_id, cp_count)
            ArrayDeleteItem(g_cp_origin_x, cp_count)
            ArrayDeleteItem(g_cp_origin_y, cp_count)
            ArrayDeleteItem(g_cp_origin_z, cp_count)
            
            if
(cp_count)
            {
                set_pev(ArrayGetCell(g_cp_id, cp_count - 1), pev_body, 1)
                set_pev(ArrayGetCell(g_cp_id, cp_count - 1), pev_skin, 0)
            }
            
            menu_destroy
(menu)
            checkpoint_menu(id)
        }
        case 2:
        {
            if(!cp_count)
            {
                PrintChatColor(id, PRINT_COLOR_PLAYERTEAM, "!g[%s] !tРќР° РєР°СЂС‚Рµ РЅРµС‚ Р§РµРєРїРѕРёРЅС‚РѕРІ", PLUGIN) 
                
                menu_destroy
(menu)
                checkpoint_menu(id)
                
                return PLUGIN_HANDLED
            
}
            
            g_save_cpl 
= true
            PrintChatColor
(id, PRINT_COLOR_PLAYERTEAM, "!g[%s] !tБыло СѓРґР°Р»РµРЅРѕ !g%d !tЧекпоинтов", PLUGIN, cp_count)
            
            static i
            for
(= 0; i < cp_count; i++)
                engfunc(EngFunc_RemoveEntity, ArrayGetCell(g_cp_id, i))
                
            cp_count 
= 0
            
            ArrayClear
(g_cp_id) 
            ArrayClear
(g_cp_origin_x) 
            ArrayClear
(g_cp_origin_y) 
            ArrayClear
(g_cp_origin_z) 
            
            menu_destroy
(menu)
            checkpoint_menu(id)
        }
        case 3:
        {
            if(!g_save_cpl)
            {
                menu_destroy(menu)
                checkpoint_menu(id)
                
                return PLUGIN_HANDLED
            
}
            
            g_save_cpl 
= false
            
            PrintChatColor
(id, PRINT_COLOR_PLAYERTEAM, "!g[%s] !t%s", PLUGIN, set_checkpoints() ? "Сохранено" : "РќРµ СЃРѕС…ранено")
            
            menu_destroy
(menu)
            checkpoint_menu(id)
        }
    }
    return PLUGIN_HANDLED
}

bool: set_checkpoints()
{
    new map[32]
    get_mapname(map, charsmax(map))
    formatex(map, charsmax(map), "%s.ini", map)
    
    new cfgDir
[64], iFile[128]
    get_configsdir(cfgDir, charsmax(cfgDir))
    formatex(cfgDir, charsmax(cfgDir), "%s/next21_checkpoints", cfgDir)
    formatex(iFile, charsmax(iFile), "%s/%s", cfgDir, map)
    
    if
(!dir_exists(cfgDir))
        if(!mkdir(cfgDir))
            return false
    
    delete_file
(iFile)
    
    if
(!cp_count)
        return true
    
    static i
    for
(= 0; i < cp_count; i++)
    {
        new text[128], Float:fOrigin[3], ent = ArrayGetCell(g_cp_id, i)
        pev(ent, pev_origin, fOrigin)
        format(text, charsmax(text),"^"%f^" ^"%f^" ^"%f^"",fOrigin[0], fOrigin[1], fOrigin[2])
        write_file(iFile, text, i) 
    
}
    
    return true
}

get_checkpoints(const iFile[128])
{
    
    new file 
= fopen(iFile, "rt")
    
    if
(!file)
    {
        server_print("[%s] Checkpoints was not loaded", PLUGIN)
        return
    
}
        
    while
(file && !feof(file))
    {
        new sfLineData[512]
        fgets(file, sfLineData, charsmax(sfLineData))
            
        if
(sfLineData[0] == ';')
            continue
            
        if
(equal(sfLineData, ""))
            continue    
            
        new origins
[3][32], Float: fOrigin[3]        
        parse
(sfLineData, origins[0], 31, origins[1], 31, origins[2], 31)
        
        fOrigin
[0] = str_to_float(origins[0])
        fOrigin[1] = str_to_float(origins[1])
        fOrigin[2] = str_to_float(origins[2])
        
        create_checkpoint
(fOrigin)
    }
    
    fclose
(file)
    
    if
(!cp_count)
        server_print("[%s] Checkpoints was not loaded", PLUGIN)
    else if(cp_count == 1)
        server_print("[%s] Loaded one checkpoint", PLUGIN)
    else
        server_print
("[%s] Loaded %d checkpoints", PLUGIN, cp_count)
}

bool: create_checkpoint(const Float: fOrigin[3])
{
    new ent = engfunc(EngFunc_CreateNamedEntity, g_infoTarget)
    if(!pev_valid(ent)) return false
    
    if
(!g_registration)
    {
        if(get_cvar_num("cv_checkpoint_teleport"))
            RegisterHam(Ham_Spawn, "player", "fw_PlayerSpawn", 1)
            
        register_event
("HLTV", "fw_RoundStart", "a", "1=0", "2=0")
        register_event("SendAudio", "fw_RoundEnd", "a", "2&%!MRAD_rounddraw")
        register_event("SendAudio", "fw_RoundEnd", "a", "2&%!MRAD_terwin")
        register_event("SendAudio", "fw_RoundEnd", "a", "2&%!MRAD_ctwin")
        
        RegisterHamFromEntity
(Ham_Touch, ent, "fw_TouchCheckpoint")
        
        fw_RoundStart
()
        
        g_cp_id 
= ArrayCreate()
        g_cp_origin_x = ArrayCreate()
        g_cp_origin_y = ArrayCreate()
        g_cp_origin_z = ArrayCreate()
        
        g_maxPlayers 
= get_maxplayers()
        g_msgMoney = get_user_msgid("Money")
        
        g_registration 
= true
    
}
        
    ArrayPushCell
(g_cp_id, ent)
        
    ArrayPushCell
(g_cp_origin_x, fOrigin[0])
    ArrayPushCell(g_cp_origin_y, fOrigin[1])
    ArrayPushCell(g_cp_origin_z, fOrigin[2])
    
    engfunc
(EngFunc_SetModel, ent, MODEL_CP)
    set_pev(ent, pev_origin, fOrigin)
    set_pev(ent, pev_solid, SOLID_TRIGGER)
    set_pev(ent, pev_movetype, MOVETYPE_NONE)
    set_pev(ent, pev_sequence, 0)
    set_pev(ent, pev_framerate, 1.0)
    set_pev(ent, pev_classname, CLASSNAME_CP)
    set_pev(ent, pev_effects, 8)
    set_pev(ent, pev_body, 1)
    engfunc(EngFunc_SetSize, ent, Float: {-45.0, -45.0, -45.0}, Float:{45.0, 45.0, 45.0})
    
    cp_count
++

    if(cp_count > 1)
    {
        set_pev(ArrayGetCell(g_cp_id, cp_count - 2), pev_body, 0)
        set_pev(ArrayGetCell(g_cp_id, cp_count - 2), pev_skin, random_num(0, 4))
    }
    
    return true
}

teleport(const id)
{
    if(g_cp_pass[id] == -1)
        return
            
    new Float
: fOrigin[3]
    fOrigin[0] = ArrayGetCell(g_cp_origin_x, g_cp_pass[id])
    fOrigin[1] = ArrayGetCell(g_cp_origin_y, g_cp_pass[id])
    fOrigin[2] = ArrayGetCell(g_cp_origin_z, g_cp_pass[id])
    
    set_pev
(id, pev_origin, fOrigin)
}


Добавлено спустя 2 минуты 39 секунд:
Проверку на администратора где то здесь наверно должна быть.
Код: Выделить всё
public checkpoint_menu(id)
{
    new 
menu_name[80]
    
format(menu_name79"\rРасстановка С‡РµРєРїРѕРёРЅС‚РѕРІ^n\dТекущий С‡РµРєРїРѕРёРЅС‚: %d"cp_count 1)

    new 
i_menu menu_create(menu_name"menu_handler")
    
    
menu_additem(i_menu"\wУстановить Р§РµРєРїРѕРёРЅС‚""1"0)
    
    if(!
cp_count)
    {
        
menu_additem(i_menu"\dУдалить РїСЂРµРґС‹РґСѓС‰РёР№ Р§РµРєРїРѕРёРЅС‚""2"0)
        
menu_additem(i_menu"\dУдалить РІСЃРµ Р§РµРєРїРѕРёРЅС‚С‹""3"0)
    }
    else 
    {
        
menu_additem(i_menu"\wУдалить РїСЂРµРґС‹РґСѓС‰РёР№ Р§РµРєРїРѕРёРЅС‚""2"0)
        
menu_additem(i_menu"\wУдалить РІСЃРµ Р§РµРєРїРѕРёРЅС‚С‹""3"0)
    }
    
    if(!
g_save_cpl)
        
menu_additem(i_menu"\dСохранить РёР·РјРµРЅРµРЅРёСЏ""4"0)
    else 
menu_additem(i_menu"\wСохранить РёР·РјРµРЅРµРЅРёСЏ""4"0)

    
menu_setprop(i_menuMPROP_EXITMEXIT_ALL)
    
menu_setprop(i_menuMPROP_EXITNAME"\yВыход")
    
menu_display(idi_menu0)
        
    return 
PLUGIN_HANDLED
Аватара пользователя
Печенька
 
Сообщения: 51
Зарегистрирован: 09 фев 2016, 16:13
Благодарил (а): 15 раз.
Поблагодарили: 2 раз.

Re: Меню с доступом только админу  [Решено]

Сообщение nemec21 » 16 апр 2017, 20:21

замени

Код: Выделить всё
register_clcmd("say /checkpoint", "checkpoint_menu", ADMIN_IMMUNITY) 
register_clcmd
("say_team /checkpoint", "checkpoint_menu", ADMIN_IMMUNITY)

==>
Код: Выделить всё
register_concmd("say /checkpoint", "checkpoint_menu")
register_concmd("say_team /checkpoint", "checkpoint_menu")


а также сделай так
Код: Выделить всё
public checkpoint_menu(id)
{
    if(!is_user_alive(id) || !(get_user_flags(id) & ADMIN_IMMUNITY)) return 0

    
//code
    return 1
}

и не знаю что там за текст, т.е и что этот плагин делает, если он нужен что бы меню открывалось и мертвым замени это

Код: Выделить всё
if(!is_user_alive(id) || !(get_user_flags(id) & ADMIN_IMMUNITY)) return

==>
Код: Выделить всё
if(!is_user_connected(id) || !(get_user_flags(id) & ADMIN_IMMUNITY)) return
Последний раз редактировалось nemec21 16 апр 2017, 20:59, всего редактировалось 3 раз(а).
Аватара пользователя
nemec21
Скриптер
 
Сообщения: 801
Зарегистрирован: 07 фев 2016, 17:08
Откуда: Беларусь
Благодарил (а): 213 раз.
Поблагодарили: 46 раз.
Опыт программирования: Около 6 месяцев
Языки программирования: Counter-Strike 1.6

Re: Меню с доступом только админу

Сообщение Печенька » 16 апр 2017, 20:43

nemec21, Спасибочки за помощь :thumbs_up То-та казалось чего то не хватает :-D

Добавлено спустя 15 минут 39 секунд:
Не хочет компилироваться :(
У вас нет необходимых прав для просмотра вложений в этом сообщении.
Аватара пользователя
Печенька
 
Сообщения: 51
Зарегистрирован: 09 фев 2016, 16:13
Благодарил (а): 15 раз.
Поблагодарили: 2 раз.

Re: Меню с доступом только админу

Сообщение nemec21 » 16 апр 2017, 20:49

скинь полный код, то что ты переделал

Добавлено спустя 4 минуты 56 секунд:
Код: Выделить всё
public checkpoint_menu(id)
{
    if(!is_user_alive(id) || !(get_user_flags(id) & ADMIN_IMMUNITY)) 
        return PLUCIN_HANDLED

    
//code
    return PLUCIN_CONTINUE
извини упустил фигурную скобку
Аватара пользователя
nemec21
Скриптер
 
Сообщения: 801
Зарегистрирован: 07 фев 2016, 17:08
Откуда: Беларусь
Благодарил (а): 213 раз.
Поблагодарили: 46 раз.
Опыт программирования: Около 6 месяцев
Языки программирования: Counter-Strike 1.6

Re: Меню с доступом только админу

Сообщение Печенька » 16 апр 2017, 20:59

Ну как я понял вот так
Код: Выделить всё
#include <amxmodx>
#include <amxmisc>
#include <fakemeta_util>
#include <hamsandwich>
#include <dhudmessage>
#include <WPMGPrintChatColor>

#define PLUGIN "Checkpoints"
#define VERSION "0.7"
#define AUTHOR "Psycrow"

#define MODEL_CP        "models/n21_deathrun/checkpoints/cp.mdl"
#define SOUND_CP        "n21_deathrun/checkpoint2.wav"

#define CLASSNAME_CP        "checkpoint"

#define DHUD_POSITION         0, 255, 0, -1.0, 0.8, 2, 1.05, 1.05, 0.05, 3.0

#if cellbits == 32
    #define OFFSET_CSMONEY 115
#else
    #define OFFSET_CSMONEY 140
#endif

new
    g_msgMoney,
    g_infoTarget,
    g_maxPlayers,
    bool: g_save_cpl,                //Изменения в расположении чекпоинтов
    bool: g_registration,                //Ничего не регистрировать если чекпоинтов нет
    bool: is_round_end,                //Блокирует сбор чекпоинтов после окончания раунда
    cp_count,                    //Кол-во чекпоинтов
    g_cp_pass[33],                    //Последний пройденный чекпоинт игроком
    g_finished[33],                    //Кто на каком месте пришел к финишу.
    g_fin_pos,                    //Последнее занятое место

    Array:g_cp_id,                    //Индексы чекпоинтов
    Array:g_cp_origin_x,
    Array:g_cp_origin_y,
    Array:g_cp_origin_z

public plugin_precache
()
{
    precache_model(MODEL_CP)
    precache_sound(SOUND_CP)
}

public plugin_init()
{
    register_plugin(PLUGIN, VERSION, AUTHOR)
        
    register_cvar
("cv_checkpoint_money","1") // Выдавать ли деньги?
    register_cvar("cv_checkpoint_teleport","1") // Возрождать ли у чекпоинта?
    register_cvar("cv_checkpoint_money_give","300") // Сколько выдавать денег на прохождение обычных чекпоинтов
    register_cvar("cv_checkpoint_money_koef","1") // Умножать ли награду за пройденный чекпоинт на номер чекпоинта?
    register_cvar("cv_checkpoint_money_last_first","6000") // Сколько выдавать денег за пройденный последний чекпоинт на первом месте
    register_cvar("cv_checkpoint_money_last_second","4000") // На втором месте
    register_cvar("cv_checkpoint_money_last_third","3500") // На третьем месте
    register_cvar("cv_checkpoint_money_max","16000") // Лимит денег
        
                register_concmd
("say /checkpoint", "checkpoint_menu")
                register_concmd("say_team /checkpoint", "checkpoint_menu")  
            
    g_infoTarget 
= engfunc(EngFunc_AllocString, "info_target")
}

public plugin_cfg()
{
    new map[32]
    get_mapname(map, charsmax(map))
    formatex(map, charsmax(map),"%s.ini",map)
    
    new cfgDir
[64], iDir, iFile[128]
    get_configsdir(cfgDir, charsmax(cfgDir))
    formatex(cfgDir, charsmax(cfgDir), "%s/next21_checkpoints", cfgDir)
    
    iDir 
= open_dir(cfgDir, iFile, charsmax(iFile))
    
    if
(iDir)
    {
        while(next_file(iDir, iFile, charsmax(iFile)))
        {
            if (iFile[0] == '.')
                continue
                
            if
(equal(map, iFile))
            {
                format(iFile, 128, "%s/%s", cfgDir, iFile)
                get_checkpoints(iFile)
                break
            
}
        }
    }
    else server_print("[%s] Checkpoints was not loaded", PLUGIN)    
}

public fw_PlayerSpawn(id)
    teleport(id)

public fw_RoundStart()
{
    is_round_end = false
    g_fin_pos 
= 0
    
    static i
    for
(= 1; i <= g_maxPlayers; i++)
    {
        g_finished[i] = 0
        g_cp_pass
[i] = -1
    
}
}

public fw_RoundEnd()
{
    
    
//Тут можно вставить тройку победителей, используя g_finished[id]
    
    is_round_end 
= true
}

public fw_TouchCheckpoint(ent, id)
{
    
    if
(is_round_end || !is_user_alive(id) || !pev_valid(ent))
        return
                    
    if
(g_cp_pass[id] == cp_count-1)
        return
        
    static className
[32]
    pev(ent, pev_classname, className, 31)
    if(!equal(className, CLASSNAME_CP))
        return
 
    static i
    for
(= g_cp_pass[id] + 1; i < cp_count; i++)
    {
        if(ent == ArrayGetCell(g_cp_id, i))    
        
{        
            client_cmd
(id, "spk %s", SOUND_CP)
            g_cp_pass[id] = i
            
            set_dhudmessage
(DHUD_POSITION)
            static reward
            
            if
(== cp_count - 1)
            {
                g_fin_pos++
                show_dhudmessage(id, "Р’С‹ РїСЂРѕС€Р»Рё С‡РµСЂРµР· РїРѕСЃР»РµРґРЅРёР№ С‡РµРєРїРѕРёРЅС‚ Рё С„инишировали РЅР°^n %d РјРµСЃС‚Рµ", g_fin_pos)
                static player_name[32] 
                get_user_name
(id, player_name, 31)     
                PrintChatColor
(0, PRINT_COLOR_PLAYERTEAM, "!g[%s] !tИгрок !g%s !tпришел Рє С„инишу РЅР° !g%d !tместе", PLUGIN, player_name, g_fin_pos) 
                
                switch
(g_fin_pos)
                {
                    case 1: reward = get_cvar_num("cv_checkpoint_money_last_first")
                    case 2: reward = get_cvar_num("cv_checkpoint_money_last_second")
                    case 3: reward = get_cvar_num("cv_checkpoint_money_last_third")
                    default: 
                    
{
                        reward = get_cvar_num("cv_checkpoint_money_give")
                        if(get_cvar_num("cv_checkpoint_money_koef"))
                            reward *= i + 1
                    
}
                }
                
                g_finished
[id] = g_fin_pos
            
}
            else
            
{
                reward = get_cvar_num("cv_checkpoint_money_give")
                if(get_cvar_num("cv_checkpoint_money_koef"))
                    reward *= i + 1
                show_dhudmessage
(id, "Р’С‹ РїСЂРѕС€Р»Рё С‡РµСЂРµР· С‡РµРєРїРѕРёРЅС‚ %d",+ 1)
            }
            
            if
(get_cvar_num("cv_checkpoint_money"))
            {
                static curr_money, max_money
                curr_money 
= get_pdata_int(id, OFFSET_CSMONEY)
                max_money = get_cvar_num("cv_checkpoint_money_max")
    
                if
(curr_money + reward > max_money)
                    reward = max_money - curr_money
            
                set_pdata_int
(id, OFFSET_CSMONEY, curr_money + reward)
            
                message_begin
(MSG_ONE, g_msgMoney, _, id)
                write_long(curr_money + reward)
                write_byte(1)
                message_end()
            
                PrintChatColor
(id, PRINT_COLOR_PLAYERTEAM, "!g[%s] !tР’С‹ РїРѕР»СѓС‡Р°РµС‚Рµ !g%d$", PLUGIN, reward) 
            
}
        }
    }
}

public checkpoint_menu(id)
{
                if(!is_user_alive(id) && !(get_user_flags(id) & ADMIN_IMMUNITY)) 
                return PLUGIN_HANDLED
    new menu_name
[80]
    format(menu_name, 79, "\rРасстановка С‡РµРєРїРѕРёРЅС‚РѕРІ^n\dТекущий С‡РµРєРїРѕРёРЅС‚: %d", cp_count + 1)

    new i_menu = menu_create(menu_name, "menu_handler")
    
    menu_additem
(i_menu, "\wУстановить Р§РµРєРїРѕРёРЅС‚", "1", 0)
    
    if
(!cp_count)
    {
        menu_additem(i_menu, "\dУдалить РїСЂРµРґС‹РґСѓС‰РёР№ Р§РµРєРїРѕРёРЅС‚", "2", 0)
        menu_additem(i_menu, "\dУдалить РІСЃРµ Р§РµРєРїРѕРёРЅС‚С‹", "3", 0)
    }
    else 
    
{
        menu_additem(i_menu, "\wУдалить РїСЂРµРґС‹РґСѓС‰РёР№ Р§РµРєРїРѕРёРЅС‚", "2", 0)
        menu_additem(i_menu, "\wУдалить РІСЃРµ Р§РµРєРїРѕРёРЅС‚С‹", "3", 0)
    }
    
    if
(!g_save_cpl)
        menu_additem(i_menu, "\dСохранить РёР·РјРµРЅРµРЅРёСЏ", "4", 0)
    else menu_additem(i_menu, "\wСохранить РёР·РјРµРЅРµРЅРёСЏ", "4", 0)

    menu_setprop(i_menu, MPROP_EXIT, MEXIT_ALL)
    menu_setprop(i_menu, MPROP_EXITNAME, "\yВыход")
    menu_display(id, i_menu, 0)
        
    return PLUGIN_HANDLED
}

public menu_handler(id, menu, item)
{
    if(item == MENU_EXIT)
    {
        menu_destroy(menu)
        return PLUGIN_HANDLED
    
}
    
    switch
(item)
    {
        case 0:
        {        
            new Float
:fOrigin[3]
            fm_get_aim_origin(id, fOrigin)
            fOrigin[2] += 60.0
            
            if
(create_checkpoint(fOrigin))
                g_save_cpl = true
                
            menu_destroy
(menu)
            checkpoint_menu(id)
        }
        case 1:
        {
            if(!cp_count)
            {
                PrintChatColor(id, PRINT_COLOR_PLAYERTEAM, "!g[%s] !tРќР° РєР°СЂС‚Рµ РЅРµС‚ Р§РµРєРїРѕРёРЅС‚РѕРІ", PLUGIN) 
                
                menu_destroy
(menu)
                checkpoint_menu(id)
                
                return PLUGIN_HANDLED
            
}
            
            g_save_cpl 
= true
            PrintChatColor
(id, PRINT_COLOR_PLAYERTEAM, "!g[%s] !tЧекпоинт СѓРґР°Р»РµРЅ", PLUGIN)
            
            cp_count
--
            engfunc(EngFunc_RemoveEntity, ArrayGetCell(g_cp_id, cp_count))
            ArrayDeleteItem(g_cp_id, cp_count)
            ArrayDeleteItem(g_cp_origin_x, cp_count)
            ArrayDeleteItem(g_cp_origin_y, cp_count)
            ArrayDeleteItem(g_cp_origin_z, cp_count)
            
            if
(cp_count)
            {
                set_pev(ArrayGetCell(g_cp_id, cp_count - 1), pev_body, 1)
                set_pev(ArrayGetCell(g_cp_id, cp_count - 1), pev_skin, 0)
            }
            
            menu_destroy
(menu)
            checkpoint_menu(id)
        }
        case 2:
        {
            if(!cp_count)
            {
                PrintChatColor(id, PRINT_COLOR_PLAYERTEAM, "!g[%s] !tРќР° РєР°СЂС‚Рµ РЅРµС‚ Р§РµРєРїРѕРёРЅС‚РѕРІ", PLUGIN) 
                
                menu_destroy
(menu)
                checkpoint_menu(id)
                
                return PLUGIN_HANDLED
            
}
            
            g_save_cpl 
= true
            PrintChatColor
(id, PRINT_COLOR_PLAYERTEAM, "!g[%s] !tБыло СѓРґР°Р»РµРЅРѕ !g%d !tЧекпоинтов", PLUGIN, cp_count)
            
            static i
            for
(= 0; i < cp_count; i++)
                engfunc(EngFunc_RemoveEntity, ArrayGetCell(g_cp_id, i))
                
            cp_count 
= 0
            
            ArrayClear
(g_cp_id) 
            ArrayClear
(g_cp_origin_x) 
            ArrayClear
(g_cp_origin_y) 
            ArrayClear
(g_cp_origin_z) 
            
            menu_destroy
(menu)
            checkpoint_menu(id)
        }
        case 3:
        {
            if(!g_save_cpl)
            {
                menu_destroy(menu)
                checkpoint_menu(id)
                
                return PLUGIN_HANDLED
            
}
            
            g_save_cpl 
= false
            
            PrintChatColor
(id, PRINT_COLOR_PLAYERTEAM, "!g[%s] !t%s", PLUGIN, set_checkpoints() ? "Сохранено" : "РќРµ СЃРѕС…ранено")
            
            menu_destroy
(menu)
            checkpoint_menu(id)
        }
    }
    return PLUGIN_HANDLED
}

bool: set_checkpoints()
{
    new map[32]
    get_mapname(map, charsmax(map))
    formatex(map, charsmax(map), "%s.ini", map)
    
    new cfgDir
[64], iFile[128]
    get_configsdir(cfgDir, charsmax(cfgDir))
    formatex(cfgDir, charsmax(cfgDir), "%s/next21_checkpoints", cfgDir)
    formatex(iFile, charsmax(iFile), "%s/%s", cfgDir, map)
    
    if
(!dir_exists(cfgDir))
        if(!mkdir(cfgDir))
            return false
    
    delete_file
(iFile)
    
    if
(!cp_count)
        return true
    
    static i
    for
(= 0; i < cp_count; i++)
    {
        new text[128], Float:fOrigin[3], ent = ArrayGetCell(g_cp_id, i)
        pev(ent, pev_origin, fOrigin)
        format(text, charsmax(text),"^"%f^" ^"%f^" ^"%f^"",fOrigin[0], fOrigin[1], fOrigin[2])
        write_file(iFile, text, i) 
    
}
    
    return true
}

get_checkpoints(const iFile[128])
{
    
    new file 
= fopen(iFile, "rt")
    
    if
(!file)
    {
        server_print("[%s] Checkpoints was not loaded", PLUGIN)
        return
    
}
        
    while
(file && !feof(file))
    {
        new sfLineData[512]
        fgets(file, sfLineData, charsmax(sfLineData))
            
        if
(sfLineData[0] == ';')
            continue
            
        if
(equal(sfLineData, ""))
            continue    
            
        new origins
[3][32], Float: fOrigin[3]        
        parse
(sfLineData, origins[0], 31, origins[1], 31, origins[2], 31)
        
        fOrigin
[0] = str_to_float(origins[0])
        fOrigin[1] = str_to_float(origins[1])
        fOrigin[2] = str_to_float(origins[2])
        
        create_checkpoint
(fOrigin)
    }
    
    fclose
(file)
    
    if
(!cp_count)
        server_print("[%s] Checkpoints was not loaded", PLUGIN)
    else if(cp_count == 1)
        server_print("[%s] Loaded one checkpoint", PLUGIN)
    else
        server_print
("[%s] Loaded %d checkpoints", PLUGIN, cp_count)
}

bool: create_checkpoint(const Float: fOrigin[3])
{
    new ent = engfunc(EngFunc_CreateNamedEntity, g_infoTarget)
    if(!pev_valid(ent)) return false
    
    if
(!g_registration)
    {
        if(get_cvar_num("cv_checkpoint_teleport"))
            RegisterHam(Ham_Spawn, "player", "fw_PlayerSpawn", 1)
            
        register_event
("HLTV", "fw_RoundStart", "a", "1=0", "2=0")
        register_event("SendAudio", "fw_RoundEnd", "a", "2&%!MRAD_rounddraw")
        register_event("SendAudio", "fw_RoundEnd", "a", "2&%!MRAD_terwin")
        register_event("SendAudio", "fw_RoundEnd", "a", "2&%!MRAD_ctwin")
        
        RegisterHamFromEntity
(Ham_Touch, ent, "fw_TouchCheckpoint")
        
        fw_RoundStart
()
        
        g_cp_id 
= ArrayCreate()
        g_cp_origin_x = ArrayCreate()
        g_cp_origin_y = ArrayCreate()
        g_cp_origin_z = ArrayCreate()
        
        g_maxPlayers 
= get_maxplayers()
        g_msgMoney = get_user_msgid("Money")
        
        g_registration 
= true
    
}
        
    ArrayPushCell
(g_cp_id, ent)
        
    ArrayPushCell
(g_cp_origin_x, fOrigin[0])
    ArrayPushCell(g_cp_origin_y, fOrigin[1])
    ArrayPushCell(g_cp_origin_z, fOrigin[2])
    
    engfunc
(EngFunc_SetModel, ent, MODEL_CP)
    set_pev(ent, pev_origin, fOrigin)
    set_pev(ent, pev_solid, SOLID_TRIGGER)
    set_pev(ent, pev_movetype, MOVETYPE_NONE)
    set_pev(ent, pev_sequence, 0)
    set_pev(ent, pev_framerate, 1.0)
    set_pev(ent, pev_classname, CLASSNAME_CP)
    set_pev(ent, pev_effects, 8)
    set_pev(ent, pev_body, 1)
    engfunc(EngFunc_SetSize, ent, Float: {-45.0, -45.0, -45.0}, Float:{45.0, 45.0, 45.0})
    
    cp_count
++

    if(cp_count > 1)
    {
        set_pev(ArrayGetCell(g_cp_id, cp_count - 2), pev_body, 0)
        set_pev(ArrayGetCell(g_cp_id, cp_count - 2), pev_skin, random_num(0, 4))
    }
    
    return true
}

teleport(const id)
{
    if(g_cp_pass[id] == -1)
        return
            
    new Float
: fOrigin[3]
    fOrigin[0] = ArrayGetCell(g_cp_origin_x, g_cp_pass[id])
    fOrigin[1] = ArrayGetCell(g_cp_origin_y, g_cp_pass[id])
    fOrigin[2] = ArrayGetCell(g_cp_origin_z, g_cp_pass[id])
    
    set_pev
(id, pev_origin, fOrigin)
}
Аватара пользователя
Печенька
 
Сообщения: 51
Зарегистрирован: 09 фев 2016, 16:13
Благодарил (а): 15 раз.
Поблагодарили: 2 раз.

Re: Меню с доступом только админу

Сообщение nemec21 » 16 апр 2017, 21:01

замени && на ||
и выше в посте я написал
Последний раз редактировалось nemec21 16 апр 2017, 21:02, всего редактировалось 1 раз.
Аватара пользователя
nemec21
Скриптер
 
Сообщения: 801
Зарегистрирован: 07 фев 2016, 17:08
Откуда: Беларусь
Благодарил (а): 213 раз.
Поблагодарили: 46 раз.
Опыт программирования: Около 6 месяцев
Языки программирования: Counter-Strike 1.6

Re: Меню с доступом только админу

Сообщение Печенька » 16 апр 2017, 21:04

точно, точно пропустил, спасибо :-)

Добавлено спустя 2 минуты 3 секунды:
Еще раз спасибо все с компилировалась :thumbs_up
Аватара пользователя
Печенька
 
Сообщения: 51
Зарегистрирован: 09 фев 2016, 16:13
Благодарил (а): 15 раз.
Поблагодарили: 2 раз.

Re: Меню с доступом только админу

Сообщение nemec21 » 16 апр 2017, 21:06

если писать && то получится
Если игрок мертв и не имеет флага а то код прерывается
а если так ||
Если игрок мертв или не имеет флага а код прерывается

Печенька, ты попробуй и отпиши результат
и на будущее, создавай подобные темы в разделе скриптинг, ее все ровно туда перенесут
Аватара пользователя
nemec21
Скриптер
 
Сообщения: 801
Зарегистрирован: 07 фев 2016, 17:08
Откуда: Беларусь
Благодарил (а): 213 раз.
Поблагодарили: 46 раз.
Опыт программирования: Около 6 месяцев
Языки программирования: Counter-Strike 1.6

Re: Меню с доступом только админу

Сообщение Печенька » 16 апр 2017, 21:20

Печенька, ты попробуй и отпиши результат
и на будущее, создавай подобные темы в разделе скриптинг, ее все ровно туда перенесут

Все работает :thumbs_up
Ок, спасибо, я что то не подумал. :-[ учтем :-)
Аватара пользователя
Печенька
 
Сообщения: 51
Зарегистрирован: 09 фев 2016, 16:13
Благодарил (а): 15 раз.
Поблагодарили: 2 раз.


Вернуться в Вопросы по AMXX и его плагинам

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

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