админ чат

Статус
В этой теме нельзя размещать новые ответы.
Сообщения
137
Реакции
9
Помог
3 раз(а)
Здравствуйте тема такая. вообщем хотел сделать отдельный чат админов на клавишу u(стандарт для своей команды сообщение) но вот загвоздка
Код:
public HandlerSayTeam(id) return FormatMsg(id, true);
этот код и этот
Код:
register_clcmd("say_team", "HandlerSayTeam");
отвечают за это. но я не понял как поставить ограничения. вообще беда. пытался сделать на
Код:
public HandlerSayTeam(id) return FormatMsg(get_user_flags(id) & ADMIN_CHAT, true);
но не получилось. много попыток предпринимал даже amx_chat вставлял вкоманды но там не меню писать а консольная команда ужас. вот код без переделок
Код:
#include <amxmodx>

/*
    Спасибо PRoSToTeM@ за новый способ транслитерации
*/

#define TAGS                // Теги в чате Гл. Админ | Админ | VIP  [ По умолчанию включен ]
#if defined TAGS
#define LT_PREFIXES        // Свои префиксы. Файл addons/amxmodx/configs/lt_prefixes.ini [ По умолчанию выключен ]
#endif
#define STEAM                // Тег стим игрока [ По умолчанию выключен ]
#define GREEN_MSG            // Зеленый цвет чата админов и випов [ По умолчанию выключен ]
#define AES                // Поддержка системы армейских званий - AES ( http://c-s.net.ua/forum/topic56564.html ) [ По умолчанию выключен ]
#define DEF_RUS            // Русский язык по умолчанию [ По умолчанию английский ]
#define GL_ADMIN     ADMIN_RCON    // Флаг доступа для тега "Гл. Админ" в чате
#define ADMIN         ADMIN_BAN    // Флаг доступа для тега "Админ" в чате
#define VIP        ADMIN_LEVEL_H    // Флаг доступа для тега "VIP" в чате
//#define ANTIFLOOD            // Замена стандартного плагина antiflood.amxx [ По умолчанию выключен ]
#define AD_TIME        0.75        // Время между сообщениями, когда сработает антифлуд система
#define ADMIN_ALLCHAT            // Показывать весь чат админам [ По умолчанию включен ]
//#define DEFAULT_CS_CHAT        // Cтандартный чат кс  [ По умолчанию выключен ]
                        //Живые общаются только с живыми, мертвые с мертвыми. Админ видит весь чат если ADMIN_ALLCHAT
#if defined AES
enum _:
{
    AES_ST_EXP,
    AES_ST_LEVEL,
    AES_ST_BONUSES,
    AES_ST_NEXTEXP,
    AES_ST_END
};
native aes_get_player_stats(id, data[4]);
native aes_get_level_name(lvlnum, level[], len, idLang = 0);

public plugin_natives()
    set_native_filter("native_filter");
    
public native_filter(const name[], index, trap)
    return !trap ? PLUGIN_HANDLED : PLUGIN_CONTINUE;
#endif   

new const g_chConvert[94 * 2 char] =
{
    0x2100D0AD, 0x2300D0B6, 0x25003F00, 0xD18D2800, 0x29002A00, 0x2B00D0B1, 0x2D00D18E, 0x2E003000,
    0x31003200, 0x33003400, 0x35003600, 0x37003800, 0x3900D096, 0xD0B6D091, 0x3D00D0AE, 0x2C002200,
    0xD0A4D098, 0xD0A1D092, 0xD0A3D090, 0xD09FD0A0, 0xD0A8D09E, 0xD09BD094, 0xD0ACD0A2, 0xD0A9D097,
    0xD099D09A, 0xD0ABD095, 0xD093D09C, 0xD0A6D0A7, 0xD09DD0AF, 0xD1855C00, 0xD18A3A00, 0x5F00D191,
    0xD184D0B8, 0xD181D0B2, 0xD183D0B0, 0xD0BFD180, 0xD188D0BE, 0xD0BBD0B4, 0xD18CD182, 0xD189D0B7,
    0xD0B9D0BA, 0xD18BD0B5, 0xD0B3D0BC, 0xD186D187, 0xD0BDD18F, 0xD0A52F00, 0xD0AAD081
};

new bool:g_bUseRus[33];
#if defined STEAM
new bool:g_bIsSteam[33];
#endif
#if defined LT_PREFIXES
enum _:DATA
{
    TYPE[2],
    AUTH[32],
    PREFIX[64]
};
new Array:g_aData, g_PlayerData[DATA];
new g_szPrefix[33][64];
#endif

#define    GetBit(%1,%2)        (%1 & (1 << (%2 & 31)))
#define    SetBit(%1,%2)        %1 |= (1 << (%2 & 31))
#define    ResetBit(%1,%2)        %1 &= ~(1 << (%2 & 31))
#if defined ADMIN_ALLCHAT
new g_bitAdmin;
#endif
new g_bitAlive;

public plugin_init()
{
#define VERSION "2.8"
    register_plugin("Lite Translit", VERSION, "neygomon");
    register_cvar("lt_version", VERSION, FCVAR_SERVER | FCVAR_SPONLY);
    
    register_clcmd("say /rus", "LangCtrlRus");
    register_clcmd("say /eng", "LangCtrlEng");
    
    register_clcmd("say", "HandlerSay");
    register_clcmd("say_team", "HandlerSayTeam");
    
    register_event("ResetHUD", "eResetHUD", "be");
    register_event("DeathMsg", "eDeathMsg", "a", "1>0");
}

#if defined LT_PREFIXES
public plugin_cfg()
{
    g_aData = ArrayCreate(DATA);

    new buff[256], fp = fopen("addons/amxmodx/configs/lt_prefixes.ini", "rt");
    if(!fp) return set_fail_state("File ^"addons/amxmodx/configs/lt_prefixes.ini^" not found");

    while(!feof(fp))
    {
        fgets(fp, buff, charsmax(buff));
        if(buff[0] && buff[0] != ';' && parse(buff, g_PlayerData[TYPE], charsmax(g_PlayerData[TYPE]), g_PlayerData[AUTH], charsmax(g_PlayerData[AUTH]), g_PlayerData[PREFIX], charsmax(g_PlayerData[PREFIX])))
            ArrayPushArray(g_aData, g_PlayerData);
    }
    return fclose(fp);
}
#endif
public client_putinserver(id)
{
#if defined LT_PREFIXES
    SearchClient(id);
#endif   
#if defined DEF_RUS
    g_bUseRus[id] = true;
#else
    g_bUseRus[id] = false;
#endif
#if defined STEAM
    g_bIsSteam[id] = is_user_steam(id) ? true : false;
#endif
#if defined ADMIN_ALLCHAT
    if(get_user_flags(id) & ADMIN_CHAT) SetBit(g_bitAdmin, id);
    else ResetBit(g_bitAdmin, id);
#endif
}

public client_disconnect(id)     ResetBit(g_bitAlive, id);
public eResetHUD(id)         SetBit(g_bitAlive, id);
public eDeathMsg()         ResetBit(g_bitAlive, read_data(2));   

public HandlerSay(id) return FormatMsg(id, false);
public HandlerSayTeam(id) return FormatMsg(id, true);

public LangCtrlRus(id)
{
    if(g_bUseRus[id])
        client_print(id, print_chat, "*** [LT] Русский язык УЖЕ включен! ***");
    else
    {
        client_print(id, print_chat, "*** [LT] Русский язык активирован! ***");
        g_bUseRus[id] = true;
        client_cmd(id, "spk buttons/blip1.wav");
    }
}

public LangCtrlEng(id)
{
    if(!g_bUseRus[id])
        client_print(id, print_chat, "*** [LT] Английский язык УЖЕ включен! ***");
    else
    {
        client_print(id, print_chat, "*** [LT] Английский язык активирован! ***");
        g_bUseRus[id] = false;
        client_cmd(id, "spk buttons/blip1.wav");
    }
}

FormatMsg(id, bool:IsTeam)
{
#define MAX_BYTES 180
    static sMessage[MAX_BYTES], sConvertStr[charsmax(sMessage) * 2 + 1];
    read_args(sMessage, charsmax(sMessage));
    remove_quotes(sMessage);

    if(sMessage[0] == EOS || sMessage[0] == '/')
        return PLUGIN_HANDLED_MAIN;
#if defined ANTIFLOOD
    static Float:fTimeFlood[33], Float:fGameTime, iFloodWarn[33];
        
    if(fTimeFlood[id] > (fGameTime = get_gametime()))
    {
        if(++iFloodWarn[id] > 2)
        {           
            client_print(id, print_chat, "*** [LT] Прекратите флудить! ***");
            fTimeFlood[id] = fGameTime + AD_TIME + 3.0;
            return PLUGIN_HANDLED;
        }
    }
    else if(iFloodWarn[id]) iFloodWarn[id]--;
    fTimeFlood[id] = fGameTime + AD_TIME;
#endif
    static iLen, sTags[MAX_BYTES], idTeam, sTeam[16];
    idTeam  = get_user_team(id, sTeam, charsmax(sTeam));

    switch(idTeam)
    {
        case 1: iLen = formatex(sTags, charsmax(sTags), "%s%s ", GetBit(g_bitAlive, id) ? "^1" : "^1*^3Мертвый^1* ", IsTeam ? "^1[^3TT^1]" : "");
        case 2: iLen = formatex(sTags, charsmax(sTags), "%s%s ", GetBit(g_bitAlive, id) ? "^1" : "^1*^3Мертвый^1* ", IsTeam ? "^1[^3CT^1]" : "");
        default:iLen = formatex(sTags, charsmax(sTags), "^1*^3Spec^1* ");
    }
#if defined GREEN_MSG || (defined TAGS && !defined LT_PREFIXES)
    static IsAccess; IsAccess = CheckFlags(id);
#endif   
#if defined AES
    static AESLvl[33][64], aStats[AES_ST_END];
    aes_get_player_stats(id, aStats); aes_get_level_name(aStats[AES_ST_LEVEL], AESLvl[id], charsmax(AESLvl[]), LANG_SERVER);
    iLen += formatex(sTags[iLen], charsmax(sTags) - iLen, "^4[%s] ", AESLvl[id]);
#endif
#if defined STEAM
    if(g_bIsSteam[id])
        iLen += formatex(sTags[iLen], charsmax(sTags) - iLen, "^1[^4Steam^1] ");
#endif
#if defined TAGS   
    #if defined LT_PREFIXES
    if(g_szPrefix[id][0])
    {
        replace_all(g_szPrefix[id], charsmax(g_szPrefix[]), "!n", "^1");
        replace_all(g_szPrefix[id], charsmax(g_szPrefix[]), "!t", "^3");
        replace_all(g_szPrefix[id], charsmax(g_szPrefix[]), "!g", "^4");
        iLen += formatex(sTags[iLen], charsmax(sTags) - iLen, "%s ", g_szPrefix[id]);
    }   
    #else
    static const szAdminPrefix[][] = { "", "^1[^4Гл. Админ^1] ", "^1[^4Админ^1] ", "^1[^4VIP^1] " };
    iLen += formatex(sTags[iLen], charsmax(sTags) - iLen, "%s", szAdminPrefix[IsAccess]);
    #endif
#endif   
#if defined GREEN_MSG
    switch(IsAccess)
    {
        case 0: iLen += formatex(sTags[iLen], charsmax(sTags) - iLen, "^3%%s1^1 :  %%s2");
        default:iLen += formatex(sTags[iLen], charsmax(sTags) - iLen, "^3%%s1^1 :  ^4%%s2");
    }
#else
    iLen += formatex(sTags[iLen], charsmax(sTags) - iLen, "^3%%s1^1 :  %%s2");
#endif
    if(g_bUseRus[id])
    {
        new nLen;
        for(new n; sMessage[n] != EOS; n++)
        {
            if('!' <= sMessage[n] <= '~')
            {
                sConvertStr[nLen++] = g_chConvert{(sMessage[n] - '!') * 2};
                if(g_chConvert{(sMessage[n] - '!') * 2 + 1} != EOS)
                    sConvertStr[nLen++] = g_chConvert{(sMessage[n] - '!') * 2 + 1};
            }
            else sConvertStr[nLen++] = sMessage[n];
        }
        sConvertStr[nLen] = EOS;
    }
    else sConvertStr = sMessage;
    
    static iByteLimit; iByteLimit = MAX_BYTES;
    while(iLen + strlen(sConvertStr) > MAX_BYTES) sConvertStr[iByteLimit -= 10] = 0;
    
    static players[32], pcount; get_players(players, pcount, "c");
    switch(IsTeam)
    {
        case true:
        {
            for(new i; i < pcount; i++)
            {
#if defined ADMIN_ALLCHAT               
                if(GetBit(g_bitAdmin, players[i]) || (GetBit(g_bitAlive, id) == GetBit(g_bitAlive, players[i]) && idTeam == get_user_team(players[i])))
#else
                if(GetBit(g_bitAlive, id) == GetBit(g_bitAlive, players[i]) && idTeam == get_user_team(players[i]))
#endif
                    PrintChat(players[i], id, sTags, sConvertStr);
            }                               
        }
        case false:
        {   
            for(new i; i < pcount; i++)
#if defined DEFAULT_CS_CHAT           
    #if defined ADMIN_ALLCHAT           
                if(GetBit(g_bitAdmin, players[i]) || GetBit(g_bitAlive, id) == GetBit(g_bitAlive, players[i]))
    #else
                if(GetBit(g_bitAlive, id) == GetBit(g_bitAlive, players[i]))
    #endif               
                    PrintChat(players[i], id, sTags, sConvertStr);
#else
                PrintChat(players[i], id, sTags, sConvertStr);
#endif   
        }
    }
    static sAuthId[25], sName[32];
    get_user_name(id, sName, charsmax(sName));
    get_user_authid(id, sAuthId, charsmax(sAuthId));
    log_message("^"%s<%d><%s><%s>^" %s ^"%s^"", sName, get_user_userid(id), sAuthId, sTeam, IsTeam ? "say_team" : "say" , sConvertStr);   
    return PLUGIN_HANDLED;
}

PrintChat(iReceiver, iSender, const sTags[], const sMessage[])
{
    message_begin(MSG_ONE, 76, .player=iReceiver);
    write_byte(iSender);
    write_string(sTags);
    write_string("");
    write_string(sMessage);
    message_end();
}

stock SearchClient(const id)
{
    for(new i; i < ArraySize(g_aData); i++)
    {
        ArrayGetArray(g_aData, i, g_PlayerData);
        switch(g_PlayerData[TYPE])
        {
            case 'f':
            {
                if(get_user_flags(id) & read_flags(g_PlayerData[AUTH]))
                    return copy(g_szPrefix[id], charsmax(g_szPrefix[]), g_PlayerData[PREFIX]);
            }   
            case 'i':
            {
                static sIP[16]; get_user_ip(id, sIP, charsmax(sIP), 1);
                if(!strcmp(g_PlayerData[AUTH], sIP))
                    return copy(g_szPrefix[id], charsmax(g_szPrefix[]), g_PlayerData[PREFIX]);
            }       
            case 's':
            {
                static sAuthid[25]; get_user_authid(id, sAuthid, charsmax(sAuthid));
                if(!strcmp(g_PlayerData[AUTH], sAuthid))
                    return copy(g_szPrefix[id], charsmax(g_szPrefix[]), g_PlayerData[PREFIX]);
            }       
        }
    }
    return g_szPrefix[id][0] = 0;
}

stock CheckFlags(id)
{
    static iFlags; iFlags = get_user_flags(id);
    if(iFlags & GL_ADMIN)     return 1;
    else if(iFlags & ADMIN) return 2;
    else if(iFlags & VIP)     return 3;
    return 0;
}

stock bool:is_user_steam(id)
{
    static dp_pointer;
    if(dp_pointer || (dp_pointer = get_cvar_pointer("dp_r_id_provider")))
    {
        server_cmd("dp_clientinfo %d", id);
        server_exec();
        return (get_pcvar_num(dp_pointer) == 2) ? true : false;
    }
    return false;
}
 
Сообщения
18
Реакции
21
Это ведь уже реализовано. в стандартном плагине adminchat
Для того, чтобы написать в чат админов надо начать писать сообщение в чат команды с @
Пример (команда в консоль): say_team "@ Player 123 - wh"
В этот же чат могут писать игроки, чтобы обратиться к администраторам напрямую

Я правильно понял твою проблему?
 
Сообщения
137
Реакции
9
Помог
3 раз(а)
Affl, Нет не совсем. я бы хотел чтобы внизу как и стандартный чат было. и на кнопку u. А стандартный показывает худ сообщение.
 
Сообщения
11
Реакции
22
denbtr, ну примерно так, но ты еще сам посмотри его и исправь как тебе нужно. Конечно же не тестировал, но вроде бы должно работать.
Код:
#include <amxmodx>

public plugin_init()
{
    register_clcmd( "say_team", "hook_sayteam" ) // хукаем сей тим
}


public hook_sayteam( id )
{
    if( !( get_user_flags( id ) & ADMIN_CHAT ) ) // если нет флага то и не надо ничего
        return PLUGIN_CONTINUE
   
    new szMessage[ 192 ] //массив для записи текста

    read_args( szMessage, charsmax( szMessage ) ) //читаем что пишут
    remove_quotes( szMessage )//убираем кавычки, не помню мб и не надо
   
    if( strlen( szMessage ) > 1 ) // если длина сообщения больше 1
    {
        format( szMessage, charsmax( szMessage ), "^1(^4Admins^1) ^4%n^1 : %s", id, szMessage[ 1 ] ) //формируем сообщение
       
        for( new i = 1; i <= MAX_PLAYERS; i ++ )
        { // цикл по игрокам
            if( is_user_connected( i ) && ( get_user_flags( i ) & ADMIN_CHAT ) ) // если коннектед и с флагом
            {
                client_print_color( i, print_team_default, szMessage )  // отправляем сообщение
            }
        }
       
        return PLUGIN_HANDLED // ну и блокируем обычное сообщение грубо говоря
    }
   
    return PLUGIN_CONTINUE
}
 
Сообщения
11
Реакции
22
Denzer, упс, опечатка. Это я вырезал со своего чата, у меня там первый символ "!" триггерил админ чат..
 
Сообщения
18
Реакции
21
denbtr либо лыжи не едут, либо твой пост сложно понять. Можешь переформулировать?
 
Сообщения
11
Реакции
22
Affl, ну это не особо важно, опечатка, говорю же..
Но если тебе настолько любопытно – тут человек просит на say_team, а у меня уже был подобный плагин, только в нём нужно было написать !text чтобы сообщение отправилось админам. Я просто его немного поменял. Ну и т.к первый (0) символ был "!", то я просто пропускал его, и начинал с 1....... )
А отредактировать и исправить уже не могу
 
Сообщения
137
Реакции
9
Помог
3 раз(а)
Да я подкоректировал немного вставил в кодд. и вроде нормально пишет админам. но правда не проверял еще точно видят ли живые люди(не когда было) но появилось то что я заметил. что после этого стало вместо знака вопроса запятая. а заместо точки ю
27 Ноя 2018
AndrewZ, спасибо за начало кода
27 Ноя 2018
Affl, say_team писать не игрокам своей команды а админам на сервере. точно также как и игрокам.
 
Сообщения
11
Реакции
22
Affl, лол почему-то подумал шо ты мне пишешь, а зачем уведомление было :thinking:
 
Сообщения
137
Реакции
9
Помог
3 раз(а)
И как сделать чтоб английский не переводило на русский
27 Ноя 2018
AndrewZ, с вопросами поможешь))
27 Ноя 2018
вообщем понял вроде . я ввожу в плагин colorchat инклуид и он сам начинает переводить и менять символы
27 Ноя 2018
а может не из за него
27 Ноя 2018
ну вообщем решил проблему если кому интаресно. создал отдельный плагин и его поставил приоритетом над чатом. и вуаля все как и должно быть.
 
Сообщения
400
Реакции
147
Помог
11 раз(а)
denbtr, создал отдельный плагин(какой(исходник?!) и поставил его приоритетом над чатом - немного не понятно. :dntknw: :scratch_one-s_head:
 
Сообщения
137
Реакции
9
Помог
3 раз(а)
Izmayl7, Ну просто поставил выше чата. вообщем сделал отдельный плагин на админ чат. и поставил его выше чем используеться сейчас. кому интересно кину код.
 

Вложения

Статус
В этой теме нельзя размещать новые ответы.

Пользователи, просматривающие эту тему

Сейчас на форуме нет ни одного пользователя.
Сверху Снизу