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

Admin Gag: проблема пункта  [Решено]

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

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

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

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

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

Admin Gag: проблема пункта

Сообщение jjey1 » 19 фев 2017, 23:32

Здравствуйте уважаемые скриптеры.
Такая проблема доделал мальца плагин (кривовато, но как умею) amx_admingag
Так вот в кратце:

Код: Выделить всё
#define GAG_IMMUNITY   ADMIN_IMMUNITY - Имунитет от обычных админов
#define GAG_IMMUNITYY   ADMIN_RCON - Имунитет от всех админов (супер админов)
#define GAG_ACCESS      ADMIN_KICK - Доступ для обычных админов
#define GAG_ACCESS_IMMUNITY ADMIN_LEVEL_H - Супер админ ( может мутить обычных админов ) 

Появилась проблема:
1 страница то что два ника не очень пугает... не страшно



2 страница и третья когда 7+7=14 +1 =15 = 15 человек на сервере то под цифрой 8-мь появляется еще игрок... так что сократить тогда меню до 6 человек в списке? = но это самый банальный способ)
еще буду благодарен если исправите мою кривизну (отсебячину)

Код: Выделить всё
#include <amxmodx>
#include <amxmisc>
#include <fakemeta>
#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
#endif

#define PLUGIN      "Admin Gag"
#define VERSION      "1.0sf1"
#define AUTHOR      "AndrewZ"

#define GAG_IMMUNITY   ADMIN_IMMUNITY
#define GAG_IMMUNITYY   ADMIN_RCON
#define GAG_ACCESS      ADMIN_KICK
#define GAG_ACCESS_IMMUNITY ADMIN_LEVEL_H
#define MAX_PLAYERS   32

#define TID         88897

const MAX_SAVED = 64

new g_user_menu_page
[ MAX_PLAYERS + 1 ],
g_user_menu_players[ MAX_PLAYERS + 1 ][ MAX_PLAYERS ],
g_user_time[ MAX_PLAYERS + 1 ]

new g_user_gagged[ MAX_PLAYERS + 1 ]

new g_times[] = { 5, 10, 20, 30 }

new db_steamid[MAX_SAVED][32] 
new db_gag
[MAX_SAVED] 
new db_slot_i

new g_SorryWait
[33]

public plugin_init()
{
    register_plugin( PLUGIN, VERSION, AUTHOR )

    register_forward( FM_Voice_SetClientListening, "fwd_voice_setclientlistening" )

    register_clcmd( "amx_gagmenu", "show_gag_main_menu" )

    register_clcmd( "say", "hook_say" )
    register_clcmd( "say_team", "hook_say" )

    register_menu( "gag_players_menu", 1023, "handler_gag_players_menu" )
}

public client_putinserver( id )
{
    g_SorryWait[id] = 0
    load_gag
(id)
}

public client_disconnect( id ) 
{
    save_gag(id)
    _remove_user_gag( id )
}

_remove_user_gag( id ){
    g_user_time[ id ] = 0
    g_user_gagged
[ id ] = 0

    if
( task_exists( TID + id ) )
    remove_task( TID + id )
}

public fwd_voice_setclientlistening( receiver, sender, listen ) 
{
    if( receiver != sender )
    {
        if( g_user_gagged[ sender ] )
        {
            engfunc( EngFunc_SetClientListening, receiver, sender, 0 )
            return FMRES_SUPERCEDE
        
}
    }

    return FMRES_IGNORED
}

public hook_say( id ) {
    if( g_user_gagged[ id ] ) {
        new said[ 8 ]
        read_args( said, 7 )

        if( contain( said, "/sorka" ) != -&& (!g_SorryWait[id] || get_systime() - g_SorryWait[id] > 30))
        {
            for( new i = 1; i <= MAX_PLAYERS; i ++ )
            {
                if( is_user_connected( i ) && get_user_flags( i ) & ( GAG_ACCESS | GAG_ACCESS_IMMUNITY ) )
                {
                    new name[ 32 ]; get_user_name( id, name, 31 )
                    client_print_color( i, print_team_blue, "^3[GAG]^1 ^4%s^1 извиняется и просит снять с него молчанку.", name )
                }
            }

            g_SorryWait[id] = get_systime()
            client_print_color( id, print_team_blue, "^3[GAG]^1 Вам запрещено писать в чат. ^3Вас заткнул админ" )
            return PLUGIN_HANDLED
        
} else 
        
{
            client_print_color( id, print_team_red, "^3[GAG]^1 Вам запрещено писать в чат. ^3Вас заткнул админ" )
            return PLUGIN_HANDLED
        
}
    }
    return PLUGIN_CONTINUE
}

public show_gag_main_menu( id, page ){
    if( ! ( get_user_flags( id ) & ( GAG_ACCESS | GAG_ACCESS_IMMUNITY ) ) )
    return PLUGIN_HANDLED

    if
( page < 0 )
    return PLUGIN_HANDLED

    new players
[ 32 ], num
    get_players
( players, num, "h" )

    new i = min( page * 7, num )
    new start = i - ( i % 7 )
    new end = min( start + 7, num )
    page = start / 7

    g_user_menu_page
[ id ] = page
    g_user_menu_players
[ id ] = players

    new menu
[ 512 ]
    new len = formatex( menu, 511, "\yЗаткнуть игрока\R%d/%d^n^n", page + 1, ( ( num - 1 ) / 7 ) + 1 )
    new keys = MENU_KEY_0 + MENU_KEY_8

    new item

    for
( i = start; i < end; i ++ )
    {
        new name[ 32 ]
        new g_id = players[ i ]

        get_user_name( g_id, name, 31 )

        if( id == g_id )
        len += formatex( menu[ len ], 511 - len, "\d%d. \y%s^n", ++ item, name )
        
        if
( ( get_user_flags( g_id ) & GAG_IMMUNITYY ) )
            len += formatex( menu[ len ], 511 - len, "\d%d. %s \r*^n", ++ item, name )
            
        else
            
{
        if( ( get_user_flags( g_id ) & GAG_IMMUNITY ) && ! ( get_user_flags( id ) & GAG_ACCESS_IMMUNITY ) )
            len += formatex( menu[ len ], 511 - len, "\d%d. %s \r*^n", ++ item, name )

            else {
            keys |= ( 1 << item )
                if( g_user_gagged[ g_id ] )
                len += formatex( menu[ len ], 511 - len, "\w%d. \w%s \r[ЗАТКНУТ]^n", ++ item, name )
                else
                len 
+= formatex( menu[ len ], 511 - len, "\w%d. \w%s^n", ++ item, name )
                }
            }
    }

       // dont over index arrays? net, ne sliwal
       len += formatex( menu[ len ], 511 - len, "^n\w8. Время: \y%d минут^n", 
       g_times
[ 
       g_user_time
[ id ]
       ]
       )

       if( end < num )
       {   
           keys 
|= MENU_KEY_9
           formatex
( menu[ len ], 511 - len, "^n\w9. Далее^n0. %s", page ? "Назад" : "Выход" )
      } else  formatex( menu[ len ], 511 - len, "^n\w0. %s", page ? "Назад" : "Выход" )
       show_menu( id, keys, menu, -1, "gag_players_menu" )
    return PLUGIN_HANDLED
}

public handler_gag_players_menu( id, key )
{
    switch( key )
    {
        case 0..6:
        {
            new g_id = g_user_menu_players[ id ][ g_user_menu_page[ id ] * 7 + key ]

            if( is_user_connected( g_id ) )
            {
                new user_flags = get_user_flags( g_id );
                new admin_flags = get_user_flags( id );
                if( !( user_flags & GAG_IMMUNITY ) || ( admin_flags & GAG_ACCESS_IMMUNITY ) )
                {
                    new name[ 32 ]; get_user_name( id, name, 31 )
                    new g_name[ 32 ]; get_user_name( g_id, g_name, 31 )

                    if( !g_user_gagged[ g_id ] )
                    {
                        new time = g_times[
                        g_user_time[ id ]
                        ]

                        g_user_gagged[ g_id ] = 1
                        client_print_color
( 0, print_team_red, "^3[GAG]^1 ^4%s^1 заткнул ^4%s^1 на ^3%d^1 минут.", name, g_name, time )
                        set_task( float( time ) * 60.0, "task_ungag", g_id + TID )
                    }
                    else
                    
{
                        _remove_user_gag( g_id )
                        client_print_color( 0, print_team_blue, "^3[GAG]^1 ^4%s^1 снял молчанку с ^4%s^1.", name, g_name )
                    }
                }

                else client_print_color( id, print_team_blue, "^3[GAG] ^1Этот игрок имеет иммунитет." )
            }

            else client_print_color( id, print_team_blue, "^3[GAG] ^1Этот игрок отключился от сервера." )

            show_gag_main_menu( id,  g_user_menu_page[ id ] )
        }

        case 7: {
            g_user_time[id] ++

            if(g_user_time[id] >= sizeof g_times)
            g_user_time[id] = 0

            show_gag_main_menu
(id,g_user_menu_page[id])
        }
        case 8: show_gag_main_menu( id, ++ g_user_menu_page[ id ] )
        case 9: show_gag_main_menu( id, -- g_user_menu_page[ id ] )
    }
}

public task_ungag( task_id )
{
    new id = task_id - TID

    _remove_user_gag
( id )

    new name[ 32 ]; get_user_name( id, name, 31 )
    client_print_color( 0, print_team_blue, "^3[GAG] ^1C игрока ^4%s^1 снята молчанка.", name )
}

save_gag(id){
    new g_steamid[32]
    get_user_authid(id, g_steamid, charsmax(g_steamid))
    if (db_steamid[id][0] && !equal(g_steamid, db_steamid[id]))
    {
        if (db_slot_i >= sizeof db_steamid)
        db_slot_i = get_maxplayers()+1

        copy
(db_steamid[db_slot_i], charsmax(db_steamid[]), db_steamid[id])
        db_gag[db_slot_i] = db_gag[id]
        db_slot_i++
    }

    copy(db_steamid[id], charsmax(db_steamid[]), g_steamid)
    db_gag[id] = g_user_gagged[id]
}

load_gag(id){
    new g_steamid[32]
    get_user_authid(id, g_steamid, charsmax(g_steamid))

    static i
    for 
(= 0; i < sizeof db_steamid; i++)
    {
        if (equal(g_steamid, db_steamid[i]))
        {
            g_user_gagged[id] = db_gag[i]
            return;
        }
    }
skype: tatoxa80
Аватара пользователя
jjey1
 
Сообщения: 199
Зарегистрирован: 08 мар 2016, 18:32
Забанен
Благодарил (а): 39 раз.
Поблагодарили: 9 раз.
Опыт программирования: Около 3 месяцев
Языки программирования: Counter-Strike 1.6

Re: Admin Gag: проблема пункта  [Решено]

Сообщение jjey1 » 23 фев 2017, 19:25

Спасибо всем :-D вы так часто помогаете что я уже даже не знаю в чем смысл этого форума)
Проблему решил :-D

Удаляем это:
Код: Выделить всё

        
if( id == g_id )
        
len += formatexmenulen ], 511 len"\d%d. \y%s^n", ++ itemname )
 

Исправляем ниже Это:
Код: Выделить всё

 
if( ( get_user_flagsg_id ) & GAG_IMMUNITYY ) )
            
len += formatexmenulen ], 511 len"\d%d. %s \r*^n", ++ itemname )
            
        else
            {
        if( ( 
get_user_flagsg_id ) & GAG_IMMUNITY ) && ! ( get_user_flagsid ) & GAG_ACCESS_IMMUNITY ) )
            
len += formatexmenulen ], 511 len"\d%d. %s \r*^n", ++ itemname )
 

---->
На это
Код: Выделить всё

        
if( id == g_id || ( get_user_flagsg_id ) & GAG_IMMUNITYY ) )
            
len += formatexmenulen ], 511 len"\d%d. %s \r*^n", ++ itemname )
            
        else
            {
        if( 
id == g_id || ( get_user_flagsg_id ) & GAG_IMMUNITY ) && ! ( get_user_flagsid ) & GAG_ACCESS_IMMUNITY ) )
            
len += formatexmenulen ], 511 len"\d%d. %s \r*^n", ++ itemname )
 


Погрешности при компиляции остались но плагин работает как положено)
P:S Я не скриптер я только умею понимать как устроен код (немного)
skype: tatoxa80
Аватара пользователя
jjey1
 
Сообщения: 199
Зарегистрирован: 08 мар 2016, 18:32
Забанен
Благодарил (а): 39 раз.
Поблагодарили: 9 раз.
Опыт программирования: Около 3 месяцев
Языки программирования: Counter-Strike 1.6

Re: Admin Gag: проблема пункта

Сообщение NEoMASTERR » 23 фев 2017, 19:46

jjey1 писал(а):Проблему решил :-D

Рады были помочь :-)
Аватара пользователя
NEoMASTERR
 
Сообщения: 832
Зарегистрирован: 05 янв 2015, 16:38
Благодарил (а): 43 раз.
Поблагодарили: 188 раз.
Опыт программирования: Около года
Языки программирования: Counter-Strike 1.6

Re: Admin Gag: проблема пункта

Сообщение Pafos » 24 фев 2017, 01:46

jjey1, если бы не мы , то как решил бы проблему? Не нужно благодарить :-)
Аватара пользователя
Pafos
 
Сообщения: 574
Зарегистрирован: 07 апр 2014, 18:03
Откуда: pfnClientConnect
Забанен
Благодарил (а): 129 раз.
Поблагодарили: 97 раз.
Опыт программирования: Больше трех лет
Языки программирования: Pawn


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

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

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 5