Написание плагинов

7pElllHuK

Участник
Сообщения
1,416
Реакции
465
Уберите пожалуйста с плагина.

HookEventEx("player_changename" HookUserMessage(GetUserMessageId("TextMsg")

В чем суть плагина:

Убирает стандартные сообщения
Держи, убрал то что ты просил + перевел плагин на новый синтаксис. (upd. Исправил ошибки)
 

Вложения

  • CleanChat.sp
    1.4 КБ · Просмотры: 10
Последнее редактирование:

Palonez

бб братки
Сообщения
3,035
Реакции
1,837
Держи, убрал то что ты просил + перевел плагин на новый синтаксис.
Не все перевел
1698400179694.png
 
Последнее редактирование:

Palonez

бб братки
Сообщения
3,035
Реакции
1,837
Уже понял, не подумал) Сейчас исправлю. Исправил
Да и вообще до такого вида можно свернуть спокойно:
C++:
public Plugin myinfo =
{
    name = "Clean Chat",
    author = "Monomizer",
    version = "1.1",
};

public void OnPluginStart()
{
    HookEvent("player_connect", EVT, EventHookMode_Pre);
    HookEvent("player_disconnect", EVT, EventHookMode_Pre);
    HookEvent("server_cvar", EVT, EventHookMode_Pre);
    HookEvent("player_team", EVT, EventHookMode_Pre);
}

public Action EVT(Event hEvent, const char[] sName, bool dontBroadcast)
{
    if(!dontBroadcast)
    {
        SetEventBroadcast(hEvent, true);
        if(sName[7] == 'd') PrintToChatAll("\x04БОГ: \x03%N \x01пидорг ушёл от нас.", GetClientOfUserId(GetEventInt(hEvent, "userid")));
        return Plugin_Changed;
    }
    return Plugin_Continue;
}
К тому же ты не добавил в конце каждого экшена ретурн, который нужен, чтобы не было варнов
 
Последнее редактирование:

Nekro

Терра инкогнита
Сообщения
4,026
Реакции
2,260
Да и вообще до такого вида можно свернуть спокойно:
C++:
#include <sdkhooks>

public Plugin myinfo =
{
    name = "Clean Chat",
    author = "Monomizer",
    version = "1.1",
};

public void OnPluginStart()
{
    HookEvent("player_connect", EVT, EventHookMode_Pre);
    HookEvent("player_disconnect", EVT, EventHookMode_Pre);
    HookEvent("server_cvar", EVT, EventHookMode_Pre);
    HookEvent("player_team", EVT, EventHookMode_Pre);
}

public Action EVT(Event hEvent, const char[] sName, bool dontBroadcast)
{
    if(!dontBroadcast)
    {
        SetEventBroadcast(hEvent, true);
        if(sName[7] == 'd') PrintToChatAll("\x04БОГ: \x03%N \x01пидорг ушёл от нас.", GetClientOfUserId(GetEventInt(hEvent, "userid")));
        return Plugin_Changed;
    }
    return Plugin_Continue;
}
К тому же ты не добавил в конце каждого экшена ретурн, который нужен, чтобы не было варнов
А хукс зачем, он там вроде не используется?
 

Grey83

не пишу плагины с весны 2022
Сообщения
8,521
Реакции
4,980
@7pElllHuK, for(int i = 1; i <= MaxClients; i++) if(IsClientInGame(i) && !IsFakeClient(i)) bAdmin[i] = !!(iFlags & GetUserFlagBits(i));
 

Grey83

не пишу плагины с весны 2022
Сообщения
8,521
Реакции
4,980
Если нужно, чтобы при пустом значении квара считало всех админами, тогда так: bAdmin[i] = !iFlags || iFlags & GetUserFlagBits(i));
 

7pElllHuK

Участник
Сообщения
1,416
Реакции
465
Всем добрый вечер, подскажите пожалуйста, как исправить ошибку не ломая вывод текста
[SM] Exception reported: Client index 0 is invalid
Код:
char sNameDP[32];
int iMaxDP = 0;

for (int i = 1; i <= MaxClients; i++)
{
    if (IsClientInGame(i))
    {
        if (g_iKills[i] > g_iKills[iMaxDP]) iMaxDP = i;
        else if ((g_iDamage[i] > g_iDamage[iMaxDP]) && (g_iKills[i] == g_iKills[iMaxDP])) iMaxDP = i;
    }
    
    if (!IsValidClient(i)) continue;
    if (!IsPlayerAlive(i)) continue;

    GetClientName(iMaxDP, sNameDP, sizeof(sNameDP));
    
    if (IsClientInGame(i) && !IsFakeClient(i))
    {
        int iTeam2 = GetClientTeam(iMaxDP);
        
        if (iWinner == 2)
        {
            if (g_C4[1] > 0) CPrintToChatAll("%t %t", "Prefix", "MVP_Bomb_Planted", g_Name_Bomb_Planted);
            else if (iTeam2 == 2) CPrintToChatAll("%t %t", "Prefix", "MVP_Top_Killer", sNameDP);
            else if (iTeam2 == 3)CPrintToChatAll("%t %t", "Prefix_CT", "MVP_Top_Killer_CT", sNameDP);
        }
        
        if (iWinner == 3)
        {
            if (g_C4[2] > 0) CPrintToChatAll("%t %t", "Prefix_CT", "MVP_Bomb_Defused", g_Name_Defused);
            else if (iTeam2 == 3) CPrintToChatAll("%t %t", "Prefix_CT", "MVP_Top_Killer_CT", sNameDP);
            else if (iTeam2 == 2) CPrintToChatAll("%t %t", "Prefix", "MVP_Top_Killer", sNameDP);
        }
    }
}

Error log указывает на выделенную в коде строку. Если я добавляю проверку: if (0 < iClient <= MaxClients) то текст просто не выводится игрокам, а мне нужно чтоб он выводился но не было ошибки (Сейчас текст отлично выводится и все работает как надо, но вылазит эта ошибка)
 

DarkerZ

Участник
Сообщения
395
Реакции
175
Всем добрый вечер, подскажите пожалуйста, как исправить ошибку не ломая вывод текста
[SM] Exception reported: Client index 0 is invalid
Код:
char sNameDP[32];
int iMaxDP = 0;

for (int i = 1; i <= MaxClients; i++)
{
    if (IsClientInGame(i))
    {
        if (g_iKills[i] > g_iKills[iMaxDP]) iMaxDP = i;
        else if ((g_iDamage[i] > g_iDamage[iMaxDP]) && (g_iKills[i] == g_iKills[iMaxDP])) iMaxDP = i;
    }
   
    if (!IsValidClient(i)) continue;
    if (!IsPlayerAlive(i)) continue;

    GetClientName(iMaxDP, sNameDP, sizeof(sNameDP));
   
    if (IsClientInGame(i) && !IsFakeClient(i))
    {
        int iTeam2 = GetClientTeam(iMaxDP);
       
        if (iWinner == 2)
        {
            if (g_C4[1] > 0) CPrintToChatAll("%t %t", "Prefix", "MVP_Bomb_Planted", g_Name_Bomb_Planted);
            else if (iTeam2 == 2) CPrintToChatAll("%t %t", "Prefix", "MVP_Top_Killer", sNameDP);
            else if (iTeam2 == 3)CPrintToChatAll("%t %t", "Prefix_CT", "MVP_Top_Killer_CT", sNameDP);
        }
       
        if (iWinner == 3)
        {
            if (g_C4[2] > 0) CPrintToChatAll("%t %t", "Prefix_CT", "MVP_Bomb_Defused", g_Name_Defused);
            else if (iTeam2 == 3) CPrintToChatAll("%t %t", "Prefix_CT", "MVP_Top_Killer_CT", sNameDP);
            else if (iTeam2 == 2) CPrintToChatAll("%t %t", "Prefix", "MVP_Top_Killer", sNameDP);
        }
    }
}

Error log указывает на выделенную в коде строку. Если я добавляю проверку: if (0 < iClient <= MaxClients) то текст просто не выводится игрокам, а мне нужно чтоб он выводился но не было ошибки (Сейчас текст отлично выводится и все работает как надо, но вылазит эта ошибка)
int iMaxDP = 1;
Если у всех счёт 0 или отрицательный, у тебя iMaxDP остаётся 0, т.е. сервер
 

Grey83

не пишу плагины с весны 2022
Сообщения
8,521
Реакции
4,980
как исправить ошибку
тебе там ещё много исправлять нужно
И вывод нужно в отдельном цикле, если выбирать кому слать.

А вообще у тебя должно было быть примерно так:
C-подобный:
{
    if(iWinner == 2 && g_C4[1] > 0)
        CPrintToChatAll("%t %t", "Prefix", "MVP_Bomb_Planted", g_Name_Bomb_Planted);
    else if(iWinner == 3 && g_C4[2] > 0)
        CPrintToChatAll("%t %t", "Prefix_CT", "MVP_Bomb_Defused", g_Name_Defused);
    else if(iWinner > 1)
    {
        int iMaxDP;
        g_iKills[0] = 0;
        for(int i = 1; i <= MaxClients; i++) if(IsClientInGame(i))
        {
            if (g_iKills[i] > ) iMaxDP = i;
            else if (g_iKills[i] == g_iKills[iMaxDP] && g_iDamage[i] > g_iDamage[iMaxDP]) iMaxDP = i;
        }
        if(iMaxDP)
        {
            char sNameDP[MAX_NAME_LENGTH];
            GetClientName(iMaxDP, sNameDP, sizeof(sNameDP));
            if(iTeam2 == 3)
                CPrintToChatAll("%t %t", "Prefix_CT", "MVP_Top_Killer_CT", sNameDP);
            else if(iTeam2 == 2)
                CPrintToChatAll("%t %t", "Prefix", "MVP_Top_Killer", sNameDP);
        }
    }
}
Ну и вместо использования строковой переменной ты можешь пересылать индекс игрока, а в переводе использовать "#format" "{1:N}"
 

7pElllHuK

Участник
Сообщения
1,416
Реакции
465
int iMaxDP = 1;
Если у всех счёт 0 или отрицательный, у тебя iMaxDP остаётся 0, т.е. сервер
ПРобовал, тогда отображается информация не корректно. выводит игрока который в спекторах как МВП, хотя он не играл
Сообщения автоматически склеены:

тебе там ещё много исправлять нужно
И вывод нужно в отдельном цикле, если выбирать кому слать.

А вообще у тебя должно было быть примерно так:
C-подобный:
{
    if(iWinner == 2 && g_C4[1] > 0)
        CPrintToChatAll("%t %t", "Prefix", "MVP_Bomb_Planted", g_Name_Bomb_Planted);
    else if(iWinner == 3 && g_C4[2] > 0)
        CPrintToChatAll("%t %t", "Prefix_CT", "MVP_Bomb_Defused", g_Name_Defused);
    else if(iWinner > 1)
    {
        int iMaxDP;
        g_iKills[0] = 0;
        for(int i = 1; i <= MaxClients; i++) if(IsClientInGame(i))
        {
            if (g_iKills[i] > ) iMaxDP = i;
            else if (g_iKills[i] == g_iKills[iMaxDP] && g_iDamage[i] > g_iDamage[iMaxDP]) iMaxDP = i;
        }
        if(iMaxDP)
        {
            char sNameDP[MAX_NAME_LENGTH];
            GetClientName(iMaxDP, sNameDP, sizeof(sNameDP));
            if(iTeam2 == 3)
                CPrintToChatAll("%t %t", "Prefix_CT", "MVP_Top_Killer_CT", sNameDP);
            else if(iTeam2 == 2)
                CPrintToChatAll("%t %t", "Prefix", "MVP_Top_Killer", sNameDP);
        }
    }
}
Ну и вместо использования строковой переменной ты можешь пересылать индекс игрока, а в переводе использовать "#format" "{1:N}"
Понял, спасибо большое, чуть позже проверю, отпишусь
Сообщения автоматически склеены:

тебе там ещё много исправлять нужно
И вывод нужно в отдельном цикле, если выбирать кому слать.

А вообще у тебя должно было быть примерно так:
C-подобный:
{
    if(iWinner == 2 && g_C4[1] > 0)
        CPrintToChatAll("%t %t", "Prefix", "MVP_Bomb_Planted", g_Name_Bomb_Planted);
    else if(iWinner == 3 && g_C4[2] > 0)
        CPrintToChatAll("%t %t", "Prefix_CT", "MVP_Bomb_Defused", g_Name_Defused);
    else if(iWinner > 1)
    {
        int iMaxDP;
        g_iKills[0] = 0;
        for(int i = 1; i <= MaxClients; i++) if(IsClientInGame(i))
        {
            if (g_iKills[i] > ) iMaxDP = i;
            else if (g_iKills[i] == g_iKills[iMaxDP] && g_iDamage[i] > g_iDamage[iMaxDP]) iMaxDP = i;
        }
        if(iMaxDP)
        {
            char sNameDP[MAX_NAME_LENGTH];
            GetClientName(iMaxDP, sNameDP, sizeof(sNameDP));
            if(iTeam2 == 3)
                CPrintToChatAll("%t %t", "Prefix_CT", "MVP_Top_Killer_CT", sNameDP);
            else if(iTeam2 == 2)
                CPrintToChatAll("%t %t", "Prefix", "MVP_Top_Killer", sNameDP);
        }
    }
}
Ну и вместо использования строковой переменной ты можешь пересылать индекс игрока, а в переводе использовать "#format" "{1:N}"
Можете дать пожалуйста пример как пересылать индекс игрока? Я не совсем понимаю как это сделать
 
Последнее редактирование:
Сверху Снизу