Private Message

Private Message 1.1

Нет прав для скачивания

w0w

Сообщения
981
Реакции
1.898
2) Если первое замечание исправить, то 3й пункт в меню не нужен, так как эта функция выполняется по первому замечанию.
Лучше выводить меню игроков в обычном порядке (стандарт по id). На 3 намного удобнее, не нужно заходить в отдельное меню чтобы там уже выбирать этого игрока, имхо.
 
Сообщения
85
Реакции
41
w0w, ну тогда хорошо бы добавить и еще от кого получил.
 

w0w

Сообщения
981
Реакции
1.898
Stas, я тоже думал о том что возможно стоит сделать 4 пункт - последний кто написал, а 3 пункт - последний кому сам написал, тогда возможно будет очень хорошо.
 
Сообщения
129
Реакции
45
Предупреждения
5
Автор,можно ли добавить поддержку транслита?
 
Сообщения
35
Реакции
15
Предупреждения
5
Denzer, Архив поврежден, прошу перезалить
 

w0w

Сообщения
981
Реакции
1.898
Limbooc, с архивом всё в порядке, скорее всего что-то с архиватором не в порядке. Вообще в идеале нужно загружать .zip архив.
 
Сообщения
111
Реакции
8
Предупреждения
8
Denzer, Сейчас скачал локальный компилятор под 1.8.3 все гуд сделалось. буду на сервере обновлять все под 1.9 и компилятор.
25 Дек 2018
А вот вопрос. можно сделать так чтоб админы видели все сообщения?
25 Дек 2018
Denzer, а можно сделать чтоб админы видели все сообщения?
 
Сообщения
120
Реакции
131
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);
    }
}
Проверяйте. Флаг доступа указывается в кваре.
 
Последнее редактирование:
Сообщения
111
Реакции
8
Предупреждения
8
Denzer, Хорошо проверю спасибо. Это для того чтоб люди не мониторили и не сообщали кому то информацию по игроку.
 
Сообщения
120
Реакции
131
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"
 
Сообщения
111
Реакции
8
Предупреждения
8
я просмотрев понял что это флаг 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, Слушай поставил плагин но не видно сообщения других. стоят все флаги.
 
Сообщения
120
Реакции
131
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);
+    }
 
Сообщения
120
Реакции
131

Вложения

Последнее редактирование:
Сообщения
331
Реакции
174
не пойму как это происходит, то ли игроки тупят....
 

Вложения

Сообщения
120
Реакции
131
present, скачайте заново и скомпилируйте плагин. Просто был маленький недочёт, решил не делать обновление до новой версии, а просто перезалил версию 0.8.
 
Сообщения
303
Реакции
313
Предупреждения
16
Denzer, спасибо что сделал приватные сообщения не приватными!
 

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

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