> > > > >
Private Message

Private Message 0.8

Нет прав для скачивания
Сообщения
524
Рейтинг
747
#21
2) Если первое замечание исправить, то 3й пункт в меню не нужен, так как эта функция выполняется по первому замечанию.
Лучше выводить меню игроков в обычном порядке (стандарт по id). На 3 намного удобнее, не нужно заходить в отдельное меню чтобы там уже выбирать этого игрока, имхо.
 
 
Сообщения
77
Рейтинг
38
#22
w0w, ну тогда хорошо бы добавить и еще от кого получил.
 
 
Сообщения
524
Рейтинг
747
#23
Stas, я тоже думал о том что возможно стоит сделать 4 пункт - последний кто написал, а 3 пункт - последний кому сам написал, тогда возможно будет очень хорошо.
 
 
Сообщения
51
Рейтинг
19
#25
Автор,можно ли добавить поддержку транслита?
 
 
Сообщения
524
Рейтинг
747
#28
Limbooc, с архивом всё в порядке, скорее всего что-то с архиватором не в порядке. Вообще в идеале нужно загружать .zip архив.
 
 
Сообщения
56
Рейтинг
5
#29
Denzer, Сейчас скачал локальный компилятор под 1.8.3 все гуд сделалось. буду на сервере обновлять все под 1.9 и компилятор.
25 Дек 2018
А вот вопрос. можно сделать так чтоб админы видели все сообщения?
25 Дек 2018
Denzer, а можно сделать чтоб админы видели все сообщения?
 
 
Сообщения
90
Рейтинг
104
#30
denbtr, конечно можно, но для чего? Личные сообщения как бы и намекают, что они "личные".
Код:
/* Private Message (https://dev-cs.ru/resources/545/)
* Credits:
* QooQa
* w0w
* [email protected]
*/
#include <amxmodx>

#pragma semicolon 1

#define PLUGIN_NAME "Private Message"
#define PLUGIN_VERSION "0.6"
#define PLUGIN_AUTHOR "Denzer"

// EN: Prefix in chat
// RU: Префикс в чат
new const PREFIX[] = "[^4PM^1]";

// EN: List of commands to cancel
// RU: Список команд для отмены
new const BLOCK_CMD[] =
{
    "cancel",
    "otmena",
    "отмена"
};

new g_szLogFile[PLATFORM_MAX_PATH];
new const g_szLogFileName[] = "private_message";

new g_iType;
new bool: g_bBlock;
new Float: g_fDelay;
new g_sAccess[24];
new bool: g_bLogging;
new g_iPlayer[MAX_PLAYERS + 1];
new bool: g_bChatBlocked;
new bool: g_bLastReceiver[MAX_PLAYERS + 1];
new bool: g_bHookSay[MAX_PLAYERS + 1];
new bool: g_bType[MAX_PLAYERS + 1];
new bool: g_bPlayerBlocked[MAX_PLAYERS + 1][MAX_PLAYERS + 1];
new Float: g_fChattingDelay[MAX_PLAYERS + 1];

public plugin_init()
{
    register_plugin(PLUGIN_NAME, PLUGIN_VERSION, PLUGIN_AUTHOR);

    new pCvar;
    pCvar = create_cvar("pm_type", "1", FCVAR_NONE, "All can write messages each other, 2 - messages can write only: alive to alive, deat for dead, 3 - only to teammates", true, 1.0, true, 3.0);
    bind_pcvar_num(pCvar, g_iType);

    pCvar = create_cvar("pm_block", "1", FCVAR_NONE, "Allows admin to block PM-system", true, 0.0, true, 1.0);
    g_bBlock = bool:get_pcvar_num(pCvar);

    pCvar = create_cvar("pm_delay", "2.5", FCVAR_NONE, "Time between messages", true, 0.0, true, 10.0);
    bind_pcvar_float(pCvar, g_fDelay);

    pCvar = create_cvar("pm_access", "m", FCVAR_NONE, "Access flag to function of chat blocking");
    bind_pcvar_string(pCvar, g_sAccess, charsmax(g_sAccess));

    pCvar = create_cvar("pm_logging", "1", FCVAR_NONE, "Message logging", true, 0.0, true, 1.0);
    g_bLogging = bool:get_pcvar_num(pCvar);

    AutoExecConfig(true, "private_message");

    register_clcmd("pm", "cmd_Say");
    register_clcmd("say /pm", "cmd_Main");

    for(new i = 0; i < sizeof(BLOCK_CMD); i++)
        register_saycmd(BLOCK_CMD[i], "cmd_HookSay");

    register_clcmd("say", "cmd_SayChat");
    register_clcmd("say_team", "cmd_SayChat");
    if(g_bBlock)
    {
        register_clcmd("say /pmblock", "cmd_ChatBlocked");
        register_clcmd("pmblock", "cmd_ChatBlocked");\
    }
}

public client_putinserver(id)
{
    g_bHookSay[id] = false;
    g_bType[id] = false;
}

public cmd_Say(id)
{
    new iPlayer = g_iPlayer[id];
    if(!is_user_connected(iPlayer))
       return PLUGIN_HANDLED;

    new sMsg[140], iPlayers[MAX_PLAYERS], iNum;
    read_args(sMsg, charsmax(sMsg));
    remove_quotes(sMsg);
    get_players(iPlayers, iNum, "ch");

    client_print_color(id, print_team_default, "^1[Вы написали игроку ^4%n^1]: ^4%s", iPlayer, sMsg);
    client_print_color(iPlayer, print_team_default, "^1[Сообщение от ^4%n^1]: ^4%s", id, sMsg);

    for(new i; i < iNum; i++)
    {
        new index = iPlayers[i];
        if(get_user_flags(index) & read_flags(g_sAccess))
            client_print_color(index, print_team_default, "%s [Игрок ^4%n^1 написал игроку ^4%n^1]: %s", id, iPlayer, sMsg);
    }

    if(g_bLogging)
    {
        new szDir[128]; get_localinfo("amxx_logs", szDir, charsmax(szDir));
        formatex(g_szLogFile, charsmax(g_szLogFile), "%s/%s.log", szDir, g_szLogFileName);
        log_to_file(g_szLogFile, "%n написал игроку %n сообщение: %s", id, iPlayer, sMsg);
    }

    g_bLastReceiver[id] = true;

    g_fChattingDelay[id] = get_gametime() + g_fDelay;
    return PLUGIN_HANDLED;
}

public cmd_HookSay(id)
{
    if(!g_bHookSay[id])
        return PLUGIN_HANDLED;
   
    g_bHookSay[id] = false;
    client_print_color(id, print_team_default, "%s ^1Вы отменили сообщение!", PREFIX);
    return PLUGIN_HANDLED;
}

public cmd_SayChat(id)
{  
    new sMsg[140], iPlayers[MAX_PLAYERS], iNum;
    new iPlayer = g_iPlayer[id];
    read_args(sMsg, charsmax(sMsg));
    remove_quotes(sMsg);
    get_players(iPlayers, iNum, "ch");

    if(!is_user_connected(iPlayer))
        return PLUGIN_CONTINUE;

    if(g_bType[id] && g_bHookSay[id])
    {
        g_bHookSay[id] = false;
        g_bLastReceiver[id] = true;
        g_fChattingDelay[id] = get_gametime() + g_fDelay;
        client_print_color(id, print_team_default, "^1[Вы написали игроку ^4%n^1]: ^4%s", iPlayer, sMsg);
        client_print_color(iPlayer, print_team_default, "^1[Сообщение от ^4%n^1]: ^4%s", id, sMsg);

        for(new i; i < iNum; i++)
        {
            new index = iPlayers[i];
            if(get_user_flags(index) & read_flags(g_sAccess))
                client_print_color(index, print_team_default, "%s [Игрок ^4%n^1 написал игроку ^4%n^1]: %s", id, iPlayer, sMsg);
        }

        if(g_bLogging)
        {
            new szDir[128]; get_localinfo("amxx_logs", szDir, charsmax(szDir));
            formatex(g_szLogFile, charsmax(g_szLogFile), "%s/%s.log", szDir, g_szLogFileName);
            log_to_file(g_szLogFile, "%n написал игроку %n сообщение: %s", id, iPlayer, sMsg);
        }

        return PLUGIN_HANDLED;
    }
    return PLUGIN_CONTINUE;
}

public cmd_ChatBlocked(id)
{      
    if(~get_user_flags(id) & read_flags(g_sAccess))
        return PLUGIN_HANDLED;
   
    g_bChatBlocked = !g_bChatBlocked;
    client_print_color(0, print_team_default, "%s ^1Администратор ^4%n^1 %sблокировал ^1личные сообщения!", PREFIX, id, g_bChatBlocked ? "за" : "раз" );
    return PLUGIN_CONTINUE;
}

public cmd_Main(id)
{
    new menu = menu_create("\rЛичные сообщения", "MainHandler");

    new iPlayer = g_iPlayer[id], szReceiver[64];
    formatex(szReceiver, charsmax(szReceiver), "Последний получатель: \y%n", iPlayer);

    menu_additem(menu, "Написать сообщение");
    menu_additem(menu, "Заблокировать получателя");
   
    menu_additem(menu, g_bLastReceiver[id] ? szReceiver : "Последний получатель: \d#");

    menu_additem(menu, g_bType[id] ? "Тип отправления: \yчатом" : "Тип отправления: \ymessagemode");

    menu_setprop(menu, MPROP_NEXTNAME, "Далее");
    menu_setprop(menu, MPROP_BACKNAME, "Назад");
    menu_setprop(menu, MPROP_EXITNAME, "Выход");
    menu_display(id, menu, 0);

    return PLUGIN_HANDLED;
}

public MainHandler(id, menu, item)
{
    new iPlayer = g_iPlayer[id];
    if(g_bChatBlocked)
    {
        client_print_color(id, print_team_default, "%s ^1Личные сообщения заблокированы!", PREFIX);
        return PLUGIN_HANDLED;
    }
   
    switch(item)
    {
        case 0:
            cmd_PM(id);
        case 1:
            cmd_Block(id);
        case 2:
        {
            if(g_fChattingDelay[id] > get_gametime())
            {
                client_print_color(id, print_team_default, "%s ^1Прекратите спамить!", PREFIX);
                return PLUGIN_HANDLED;
            }

            if(g_bPlayerBlocked[iPlayer][id])
            {
                client_print_color(iPlayer, print_team_default, "%s Игрок вас заблокировал!", PREFIX);
                return PLUGIN_HANDLED;
            }

            if(g_bType[id] && g_bLastReceiver[id])
            {
                g_bHookSay[id] = true;
                client_print_color(id, print_team_default, "%s ^1Откройте чат и напишите сообщение, для отмены напишите ^4/cancel", PREFIX);
            }
            else if(!g_bType[id] && g_bLastReceiver[id])
            {
                g_bHookSay[id] = false;
                client_cmd(id, "messagemode pm");
            }
            else if(!g_bLastReceiver[id])
                cmd_Main(id);
        }
        case 3:
        {
            g_bType[id] = !g_bType[id];
            cmd_Main(id);
        }
    }
    menu_destroy(menu);
    return PLUGIN_HANDLED;
}

public cmd_PM(id)
{
    new menu = menu_create("\rНаписать сообщение:", "PMHandler");
    new iPlayers[MAX_PLAYERS], iNum, szPlayer[10], iPlayer, szName[MAX_NAME_LENGTH];

    get_players(iPlayers, iNum, "ch");

    for (new i; i < iNum; i++)
    {
        iPlayer = iPlayers[i];

        formatex(szName, charsmax(szName), "%n", iPlayer);

        if(id == iPlayer)
            continue;

        num_to_str(iPlayer, szPlayer, charsmax(szPlayer));

        switch(g_iType)
        {
            case 1: menu_additem(menu, szName, szPlayer);
            case 2:
            {
                if(is_user_alive(id) == is_user_alive(iPlayer) || !is_user_alive(id) == !is_user_alive(iPlayer))
                    menu_additem(menu, szName, szPlayer);
            }
            case 3:
            {
                if(get_user_team(id) == get_user_team(iPlayer))
                    menu_additem(menu, szName, szPlayer);
            }
        }
    }

    menu_setprop(menu, MPROP_NEXTNAME, "Далее");
    menu_setprop(menu, MPROP_BACKNAME, "Назад");
    menu_setprop(menu, MPROP_EXITNAME, "Выход");
    menu_display(id, menu, 0);
    return PLUGIN_CONTINUE;
}

public PMHandler(id, menu, item)
{
    if(item == MENU_EXIT)
    {
        menu_destroy(menu);
        return PLUGIN_HANDLED;
    }

    new s_Data[6], s_Name[64], i_Access, i_Callback;
    menu_item_getinfo(menu, item, i_Access, s_Data, charsmax(s_Data), s_Name, charsmax(s_Name), i_Callback);

    new tempid = str_to_num(s_Data);
    new iPlayer = g_iPlayer[id] = tempid;

    if(g_fChattingDelay[id] > get_gametime())
    {
        client_print_color(id, print_team_default, "%s ^1Прекратите спамить!", PREFIX);
        return PLUGIN_HANDLED;
    }

    if(g_bPlayerBlocked[iPlayer][id])
    {
        client_print_color(iPlayer, print_team_default, "%s Игрок вас заблокировал!", PREFIX);
        return PLUGIN_HANDLED;
    }
   
    if(g_bType[id])
    {
        client_print_color(id, print_team_default, "%s ^1Откройте чат и напишите сообщение, для отмены напишите ^4/cancel", PREFIX);
        g_bHookSay[id] = true;
    }
    else
        client_cmd(id, "messagemode pm");

    g_bLastReceiver[id] = false;
   
    menu_destroy(menu);
    return PLUGIN_HANDLED;
}

public cmd_Block(id)
{
    new menu = menu_create("\rЗаблокировать игрока:", "BlockHandler");
    new iPlayers[MAX_PLAYERS], iNum, szPlayer[10], iPlayer, szBlocked[64], szName[MAX_NAME_LENGTH];

    get_players(iPlayers, iNum, "ch");

    for (new i; i < iNum; i++)
    {
        iPlayer = iPlayers[i];
        formatex(szName, charsmax(szName), "%n", iPlayer);
        formatex(szBlocked, charsmax(szBlocked), "%n (\rзаблокирован\w)", iPlayer);

        if(id == iPlayer)
            continue;

        num_to_str(iPlayer, szPlayer, charsmax(szPlayer));

        if(g_bPlayerBlocked[id][iPlayer])
            menu_additem(menu, szBlocked, szPlayer);
        else
            menu_additem(menu, szName, szPlayer);
    }

    menu_setprop(menu, MPROP_NEXTNAME, "Далее");
    menu_setprop(menu, MPROP_BACKNAME, "Назад");
    menu_setprop(menu, MPROP_EXITNAME, "Выход");
    menu_display(id, menu, 0);
    return PLUGIN_CONTINUE;
}

public BlockHandler(id, menu, item)
{
    if(item == MENU_EXIT)
    {
        menu_destroy(menu);
        return PLUGIN_HANDLED;
    }

    new s_Data[6], s_Name[64], i_Access, i_Callback;
    menu_item_getinfo(menu, item, i_Access, s_Data, charsmax(s_Data), s_Name, charsmax(s_Name), i_Callback);

    new tempid = str_to_num(s_Data);
    new iPlayer = g_iPlayer[id] = tempid;

    g_bPlayerBlocked[id][iPlayer] = !g_bPlayerBlocked[id][iPlayer];
    cmd_Block(id);

    menu_destroy(menu);
    return PLUGIN_HANDLED;
}

// mx?!
stock register_saycmd(const szSayCmd[], szFunc[])
{
    new const szPrefix[][] = { "say /", "say_team /", "say .", "say_team ." };

    for(new i, szTemp[MAX_NAME_LENGTH]; i < sizeof(szPrefix); i++)
    {
        formatex(szTemp, charsmax(szTemp), "%s%s", szPrefix[i], szSayCmd);
        register_clcmd(szTemp, szFunc);
    }
}
Проверяйте. Флаг доступа указывается в кваре.
 
Последнее редактирование:
 
Сообщения
56
Рейтинг
5
#31
Denzer, Хорошо проверю спасибо. Это для того чтоб люди не мониторили и не сообщали кому то информацию по игроку.
 
 
Сообщения
90
Рейтинг
104
#32
denbtr, для этого есть квар:
Код:
// EN: 1 - All can write messages each other, 2 - messages can write only: alive to alive, deat for dead, 3 - only to teammates
// RU: 1 - Все могут друг другу писать сообщения, 2 - сообщения могут писать только живые - живым, мертвые - мертвым, 3 - сообщения могут писать только своим тиммейтам
pm_type "1"
 
 
Сообщения
56
Рейтинг
5
#33
я просмотрев понял что это флаг m который может блочить чат[email protected],
25 Дек 2018
denbtr, для этого есть квар:
Код:
// EN: 1 - All can write messages each other, 2 - messages can write only: alive to alive, deat for dead, 3 - only to teammates
// RU: 1 - Все могут друг другу писать сообщения, 2 - сообщения могут писать только живые - живым, мертвые - мертвым, 3 - сообщения могут писать только своим тиммейтам
pm_type "1"
А вот этого я не заметил сразу.
25 Дек 2018
прошу прощения я бы тогда не стал глупые вопросы задавать))
26 Дек 2018
denbtr, Слушай поставил плагин но не видно сообщения других. стоят все флаги.
 
 
Сообщения
90
Рейтинг
104
#34
denbtr,
Код:
-    for(new i; i < iNum; i++)
-    {
-        new index = iPlayers[i];
-        if(get_user_flags(index) & read_flags(g_sAccess))
-            client_print_color(index, print_team_default, "%s [Игрок ^4%n^1 написал игроку ^4%n^1]: %s", id, iPlayer, sMsg);
-    }

+    for(new i; i < iNum; i++)
+    {
+        new index = iPlayers[i];
+        if(get_user_flags(index) & read_flags(g_sAccess))
+            client_print_color(index, print_team_default, "[Игрок ^4%n^1 написал игроку ^4%n^1]: %s", id, iPlayer, sMsg);
+    }
 
 
Сообщения
90
Рейтинг
104
#36

Вложения

Последнее редактирование:
5  

Похожие темы

> > > > >