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

babka68

Участник
Сообщения
2,124
Реакции
956
В чём плюсы и минусы одного глобального буфера против куча локальных?
Насколько я помню(когда то читал),что глобальный он используется везде,до конца кода так скажем,а локальные используются только там,где их создали и не более(видимость в созданном блоке)
А вообще вот) [SourcePawn] Урок 1 - Основы языка (Часть 1)
1604129217799.png
 
Последнее редактирование:

iLoco

Пишу плагины за печеньки 🍪🍪🍪
Сообщения
2,265
Реакции
1,323
Насколько я помню(когда то читал),что глобальный он используется везде,до конца кода так скажем,а локальные используются только там,где их создали и не более(видимость в созданном блоке)
А вообще вот) [SourcePawn] Урок 1 - Основы языка (Часть 1)
Посмотреть вложение 66392
Про иерархию я знаю, что они работают только в их блоке и "дочерних" блоках, только некоторое уточнение, их не видно выше них самих, то-есть если создался где-то внизу, а вызывается выше, то кинет еррор
1604132437276.png
1604132546574.png
 

Faya™

Жуестер
Сообщения
867
Реакции
457
Про иерархию я знаю, что они работают только в их блоке и "дочерних" блоках, только некоторое уточнение, их не видно выше них самих, то-есть если создался где-то внизу, а вызывается выше, то кинет еррор
Посмотреть вложение 66394 Посмотреть вложение 66395
Естественно, компилятор читает сверху вниз файл
 

babka68

Участник
Сообщения
2,124
Реакции
956
Всем привет,подскажите,как сделать так,что бы данный плагин работал только для админов?

C-подобный:
#pragma semicolon 1

public Plugin myinfo =
{
    name = "all chat",
    author = "Frenzzy",
    description = "Relays chat messages to all players",
    version = "1.1",
    url = "http://forums.alliedmods.net/showthread.php?p=1593727",
};


/* Convars */
Handle
        g_hCvarAllTalk = INVALID_HANDLE,
        g_hCvarMode = INVALID_HANDLE,
        g_hCvarTeam = INVALID_HANDLE;

/* Chat Message */
char
        g_msgAuthor,
        g_msgType[64],
        g_msgName[64],
        g_msgText[512];
       
bool
        g_msgIsChat,
        g_msgIsTeammate,
        g_msgTarget[MAXPLAYERS + 1];

public void OnPluginStart()
{
    // Events.
    UserMsg SayText2 = GetUserMessageId("SayText2");
   
    if (SayText2 == INVALID_MESSAGE_ID)
    {
        SetFailState("This game doesn't support SayText2 user messages.");
    }
   
    HookUserMessage(SayText2, Hook_UserMessage);
    HookEvent("player_say", Event_PlayerSay);
   
    g_hCvarAllTalk = FindConVar("sv_alltalk");
    g_hCvarMode = CreateConVar("sm_allchat_mode", "2", "Relays chat messages to all players? 0 = No, 1 = Yes, 2 = If AllTalk On", _, true, 0.0, true, 2.0);
    g_hCvarTeam = CreateConVar("sm_allchat_team", "2", "Who can see say_team messages? 0 = Default, 1 = All teammates, 2 = All players", _, true, 0.0, true, 2.0);
   
    // Commands.
    AddCommandListener(Command_Say, "say");
    AddCommandListener(Command_Say, "say_team");
}

public Action Hook_UserMessage(UserMsg:msg_id, Handle bf, const players[], playersNum, bool reliable, bool init)
{
    g_msgAuthor = BfReadByte(bf);
    g_msgIsChat = bool:BfReadByte(bf);
   
    BfReadString(bf, g_msgType, sizeof(g_msgType), false);
    BfReadString(bf, g_msgName, sizeof(g_msgName), false);
    BfReadString(bf, g_msgText, sizeof(g_msgText), false);
   
    for (new i = 0; i < playersNum; i++)
    {
        g_msgTarget[players[i]] = false;
    }
}

public Action Event_PlayerSay(Handle event, const char[] name, bool dontBroadcast)
{
    int mode = GetConVarInt(g_hCvarMode);
   
    if (mode < 1)
    {
        return;
    }
   
    if (mode > 1 && g_hCvarAllTalk != INVALID_HANDLE && !GetConVarBool(g_hCvarAllTalk))
    {
        return;
    }
   
    if (GetClientOfUserId(GetEventInt(event, "userid")) != g_msgAuthor)
    {
        return;
    }
   
    mode = GetConVarInt(g_hCvarTeam);
   
    if (g_msgIsTeammate && mode < 1)
    {
        return;
    }
   
    decl players[MaxClients];
    int playersNum = 0;
   
    if (g_msgIsTeammate && mode == 1 && g_msgAuthor > 0)
    {
        int team = GetClientTeam(g_msgAuthor);
       
        for (new client = 1; client <= MaxClients; client++)
        {
            if (IsClientInGame(client) && g_msgTarget[client] && GetClientTeam(client) == team)
            {
                players[playersNum++] = client;
            }
           
            g_msgTarget[client] = false;
        }
    }
    else
    {
        for (new client = 1; client <= MaxClients; client++)
        {
            if (IsClientInGame(client) && g_msgTarget[client])
            {
                players[playersNum++] = client;
            }
           
            g_msgTarget[client] = false;
        }
    }
   
    if (playersNum == 0)
    {
        return;
    }
   
    Handle SayText2 = StartMessage("SayText2", players, playersNum, USERMSG_RELIABLE | USERMSG_BLOCKHOOKS);
   
    if (SayText2 != INVALID_HANDLE)
    {
        BfWriteByte(SayText2, g_msgAuthor);
        BfWriteByte(SayText2, g_msgIsChat);
        BfWriteString(SayText2, g_msgType);
        BfWriteString(SayText2, g_msgName);
        BfWriteString(SayText2, g_msgText);
        EndMessage();
    }
}

public Action Command_Say(client, const char[] command, argc)
{
    for (new target = 1; target <= MaxClients; target++)
    {
        g_msgTarget[target] = true;
    }
   
    if (StrEqual(command, "say_team", false))
    {
        g_msgIsTeammate = true;
    }
    else
    {
        g_msgIsTeammate = false;
    }
   
    return Plugin_Continue;
}
 
Последнее редактирование:

Doker0909

Участник
Сообщения
105
Реакции
3
CSS v34
sm 1.9+
я ещё не до конца сформулировал идею в своем "генераторе идей" (мозгу), но примерную идею постараюсь передать:
возможно ли на этой "дырявой" 34-ке создать бан, который будет банить по железу, по настоящему железу, а не конфигу. Так , чтоб только переустановка винды (ну или очень приочень сложные манипуляции) помогали обойти этот бан... типа, чтоб этот бан создавал уникальный идентификатор клиента не на основе игры, а на основе железки, то есть компьютера, с которого зашёл этот клиент и если происходит бан, то он регистрируется где-то в реестрах или подобной "глубине" компьютера и переустановка игры не помогает разбаниться.
есть ли смысл писать заказ и обсуждать подобный бан?)
буду очень благодарен за развернутые ответы, очень желательно в ЛС. Спасибо!
 

Madness aka null138

Участник
Сообщения
713
Реакции
734
CSS v34
sm 1.9+
я ещё не до конца сформулировал идею в своем "генераторе идей" (мозгу), но примерную идею постараюсь передать:
возможно ли на этой "дырявой" 34-ке создать бан, который будет банить по железу, по настоящему железу, а не конфигу. Так , чтоб только переустановка винды (ну или очень приочень сложные манипуляции) помогали обойти этот бан... типа, чтоб этот бан создавал уникальный идентификатор клиента не на основе игры, а на основе железки, то есть компьютера, с которого зашёл этот клиент и если происходит бан, то он регистрируется где-то в реестрах или подобной "глубине" компьютера и переустановка игры не помогает разбаниться.
есть ли смысл писать заказ и обсуждать подобный бан?)
буду очень благодарен за развернутые ответы, очень желательно в ЛС. Спасибо!
разве что по куки IE(если до сих пор можно без js запустить его). для этого одного плагина не будет достаточно, нужен веб часть.
 

iLoco

Пишу плагины за печеньки 🍪🍪🍪
Сообщения
2,265
Реакции
1,323
Всем привет,подскажите,как сделать так,что бы данный плагин работал только для админов?

C-подобный:
#pragma semicolon 1

public Plugin myinfo =
{
    name = "all chat",
    author = "Frenzzy",
    description = "Relays chat messages to all players",
    version = "1.1",
    url = "http://forums.alliedmods.net/showthread.php?p=1593727",
};


/* Convars */
Handle
        g_hCvarAllTalk = INVALID_HANDLE,
        g_hCvarMode = INVALID_HANDLE,
        g_hCvarTeam = INVALID_HANDLE;

/* Chat Message */
char
        g_msgAuthor,
        g_msgType[64],
        g_msgName[64],
        g_msgText[512];
      
bool
        g_msgIsChat,
        g_msgIsTeammate,
        g_msgTarget[MAXPLAYERS + 1];

public void OnPluginStart()
{
    // Events.
    UserMsg SayText2 = GetUserMessageId("SayText2");
  
    if (SayText2 == INVALID_MESSAGE_ID)
    {
        SetFailState("This game doesn't support SayText2 user messages.");
    }
  
    HookUserMessage(SayText2, Hook_UserMessage);
    HookEvent("player_say", Event_PlayerSay);
  
    g_hCvarAllTalk = FindConVar("sv_alltalk");
    g_hCvarMode = CreateConVar("sm_allchat_mode", "2", "Relays chat messages to all players? 0 = No, 1 = Yes, 2 = If AllTalk On", _, true, 0.0, true, 2.0);
    g_hCvarTeam = CreateConVar("sm_allchat_team", "2", "Who can see say_team messages? 0 = Default, 1 = All teammates, 2 = All players", _, true, 0.0, true, 2.0);
  
    // Commands.
    AddCommandListener(Command_Say, "say");
    AddCommandListener(Command_Say, "say_team");
}

public Action Hook_UserMessage(UserMsg:msg_id, Handle bf, const players[], playersNum, bool reliable, bool init)
{
    g_msgAuthor = BfReadByte(bf);
    g_msgIsChat = bool:BfReadByte(bf);
  
    BfReadString(bf, g_msgType, sizeof(g_msgType), false);
    BfReadString(bf, g_msgName, sizeof(g_msgName), false);
    BfReadString(bf, g_msgText, sizeof(g_msgText), false);
  
    for (new i = 0; i < playersNum; i++)
    {
        g_msgTarget[players[i]] = false;
    }
}

public Action Event_PlayerSay(Handle event, const char[] name, bool dontBroadcast)
{
    int mode = GetConVarInt(g_hCvarMode);
  
    if (mode < 1)
    {
        return;
    }
  
    if (mode > 1 && g_hCvarAllTalk != INVALID_HANDLE && !GetConVarBool(g_hCvarAllTalk))
    {
        return;
    }
  
    if (GetClientOfUserId(GetEventInt(event, "userid")) != g_msgAuthor)
    {
        return;
    }
  
    mode = GetConVarInt(g_hCvarTeam);
  
    if (g_msgIsTeammate && mode < 1)
    {
        return;
    }
  
    decl players[MaxClients];
    int playersNum = 0;
  
    if (g_msgIsTeammate && mode == 1 && g_msgAuthor > 0)
    {
        int team = GetClientTeam(g_msgAuthor);
      
        for (new client = 1; client <= MaxClients; client++)
        {
            if (IsClientInGame(client) && g_msgTarget[client] && GetClientTeam(client) == team)
            {
                players[playersNum++] = client;
            }
          
            g_msgTarget[client] = false;
        }
    }
    else
    {
        for (new client = 1; client <= MaxClients; client++)
        {
            if (IsClientInGame(client) && g_msgTarget[client])
            {
                players[playersNum++] = client;
            }
          
            g_msgTarget[client] = false;
        }
    }
  
    if (playersNum == 0)
    {
        return;
    }
  
    Handle SayText2 = StartMessage("SayText2", players, playersNum, USERMSG_RELIABLE | USERMSG_BLOCKHOOKS);
  
    if (SayText2 != INVALID_HANDLE)
    {
        BfWriteByte(SayText2, g_msgAuthor);
        BfWriteByte(SayText2, g_msgIsChat);
        BfWriteString(SayText2, g_msgType);
        BfWriteString(SayText2, g_msgName);
        BfWriteString(SayText2, g_msgText);
        EndMessage();
    }
}

public Action Command_Say(client, const char[] command, argc)
{
    for (new target = 1; target <= MaxClients; target++)
    {
        g_msgTarget[target] = true;
    }
  
    if (StrEqual(command, "say_team", false))
    {
        g_msgIsTeammate = true;
    }
    else
    {
        g_msgIsTeammate = false;
    }
  
    return Plugin_Continue;
}
Без указания флага:
#pragma semicolon 1
#include <sourcemod>

public Plugin myinfo =
{
    name = "all chat",
    author = "Frenzzy",
    description = "Relays chat messages to all players",
    version = "1.1",
    url = "http://forums.alliedmods.net/showthread.php?p=1593727",
};

/* Convars */
Handle
        g_hCvarAllTalk = INVALID_HANDLE,
        g_hCvarMode = INVALID_HANDLE,
        g_hCvarTeam = INVALID_HANDLE;

/* Chat Message */
char
        g_msgAuthor,
        g_msgType[64],
        g_msgName[64],
        g_msgText[512];
      
bool
        g_msgIsChat,
        g_msgIsTeammate,
        g_msgTarget[MAXPLAYERS + 1];

public void OnPluginStart()
{
    // Events.
    UserMsg SayText2 = GetUserMessageId("SayText2");
  
    if (SayText2 == INVALID_MESSAGE_ID)
        SetFailState("This game doesn't support SayText2 user messages.");
  
    HookUserMessage(SayText2, Hook_UserMessage);
    HookEvent("player_say", Event_PlayerSay);
  
    g_hCvarAllTalk = FindConVar("sv_alltalk");
    g_hCvarMode = CreateConVar("sm_allchat_mode", "2", "Relays chat messages to all players? 0 = No, 1 = Yes, 2 = If AllTalk On", _, true, 0.0, true, 2.0);
    g_hCvarTeam = CreateConVar("sm_allchat_team", "2", "Who can see say_team messages? 0 = Default, 1 = All teammates, 2 = All players", _, true, 0.0, true, 2.0);
  
    // Commands.
    AddCommandListener(Command_Say, "say");
    AddCommandListener(Command_Say, "say_team");
}

public Action Hook_UserMessage(UserMsg:msg_id, Handle bf, const players[], playersNum, bool reliable, bool init)
{
    g_msgAuthor = BfReadByte(bf);
    g_msgIsChat = bool:BfReadByte(bf);
  
    BfReadString(bf, g_msgType, sizeof(g_msgType), false);
    BfReadString(bf, g_msgName, sizeof(g_msgName), false);
    BfReadString(bf, g_msgText, sizeof(g_msgText), false);
  
    for (new i = 0; i < playersNum; i++)
    {
        if(GetUserAdmin(players[i]) == INVALID_ADMIN_ID)
            continue;

        g_msgTarget[players[i]] = false;
    }
}

public Action Event_PlayerSay(Handle event, const char[] name, bool dontBroadcast)
{
    int mode = GetConVarInt(g_hCvarMode);
  
    if (mode < 1 || (mode > 1 && g_hCvarAllTalk != INVALID_HANDLE && !GetConVarBool(g_hCvarAllTalk)) || GetClientOfUserId(GetEventInt(event, "userid")) != g_msgAuthor)
        return;
  
    mode = GetConVarInt(g_hCvarTeam);
  
    if (g_msgIsTeammate && mode < 1)
        return;
  
    decl players[MaxClients];
    int playersNum = 0;
  
    if (g_msgIsTeammate && mode == 1 && g_msgAuthor > 0)
    {
        int team = GetClientTeam(g_msgAuthor);
      
        for (new client = 1; client <= MaxClients; client++)
        {
            if(GetUserAdmin(client) == INVALID_ADMIN_ID)
                continue;

            if (IsClientInGame(client) && g_msgTarget[client] && GetClientTeam(client) == team)
                players[playersNum++] = client;
          
            g_msgTarget[client] = false;
        }
    }
    else
    {
        for (new client = 1; client <= MaxClients; client++)
        {
            if(GetUserAdmin(client) == INVALID_ADMIN_ID)
                continue;

            if (IsClientInGame(client) && g_msgTarget[client])
                players[playersNum++] = client;
          
            g_msgTarget[client] = false;
        }
    }
  
    if (playersNum == 0)
        return;
  
    Handle SayText2 = StartMessage("SayText2", players, playersNum, USERMSG_RELIABLE | USERMSG_BLOCKHOOKS);
  
    if (SayText2 != INVALID_HANDLE)
    {
        BfWriteByte(SayText2, g_msgAuthor);
        BfWriteByte(SayText2, g_msgIsChat);
        BfWriteString(SayText2, g_msgType);
        BfWriteString(SayText2, g_msgName);
        BfWriteString(SayText2, g_msgText);
        EndMessage();
    }
}

public Action Command_Say(client, const char[] command, argc)
{
    if(GetUserAdmin(client) == INVALID_ADMIN_ID)
        return Plugin_Continue;

    for (new target = 1; target <= MaxClients; target++)
        g_msgTarget[target] = true;
  
    if (StrEqual(command, "say_team", false))
        g_msgIsTeammate = true;
    else
        g_msgIsTeammate = false;

    return Plugin_Continue;
}

С указанием флага:
#pragma semicolon 1
#include <sourcemod>

#define ADMIN_FLAG      "z"     // Админ флаги

public Plugin myinfo =
{
    name = "all chat",
    author = "Frenzzy",
    description = "Relays chat messages to all players",
    version = "1.1",
    url = "http://forums.alliedmods.net/showthread.php?p=1593727",
};

/* Convars */
Handle
        g_hCvarAllTalk = INVALID_HANDLE,
        g_hCvarMode = INVALID_HANDLE,
        g_hCvarTeam = INVALID_HANDLE;

/* Chat Message */
char
        g_msgAuthor,
        g_msgType[64],
        g_msgName[64],
        g_msgText[512];
      
bool
        g_msgIsChat,
        g_msgIsTeammate,
        g_msgTarget[MAXPLAYERS + 1];
    
int adminFlagsBits;

public void OnPluginStart()
{
    adminFlagsBits = ReadFlagString(ADMIN_FLAG);
    // Events.
    UserMsg SayText2 = GetUserMessageId("SayText2");
  
    if (SayText2 == INVALID_MESSAGE_ID)
        SetFailState("This game doesn't support SayText2 user messages.");
  
    HookUserMessage(SayText2, Hook_UserMessage);
    HookEvent("player_say", Event_PlayerSay);
  
    g_hCvarAllTalk = FindConVar("sv_alltalk");
    g_hCvarMode = CreateConVar("sm_allchat_mode", "2", "Relays chat messages to all players? 0 = No, 1 = Yes, 2 = If AllTalk On", _, true, 0.0, true, 2.0);
    g_hCvarTeam = CreateConVar("sm_allchat_team", "2", "Who can see say_team messages? 0 = Default, 1 = All teammates, 2 = All players", _, true, 0.0, true, 2.0);
  
    // Commands.
    AddCommandListener(Command_Say, "say");
    AddCommandListener(Command_Say, "say_team");
}

public Action Hook_UserMessage(UserMsg:msg_id, Handle bf, const players[], playersNum, bool reliable, bool init)
{
    g_msgAuthor = BfReadByte(bf);
    g_msgIsChat = bool:BfReadByte(bf);
  
    BfReadString(bf, g_msgType, sizeof(g_msgType), false);
    BfReadString(bf, g_msgName, sizeof(g_msgName), false);
    BfReadString(bf, g_msgText, sizeof(g_msgText), false);
  
    for (new i = 0; i < playersNum; i++)
    {
        if(!(GetUserFlagBits(players[i]) & adminFlagsBits))
            continue;

        g_msgTarget[players[i]] = false;
    }
}

public Action Event_PlayerSay(Handle event, const char[] name, bool dontBroadcast)
{
    int mode = GetConVarInt(g_hCvarMode);
  
    if (mode < 1 || (mode > 1 && g_hCvarAllTalk != INVALID_HANDLE && !GetConVarBool(g_hCvarAllTalk)) || GetClientOfUserId(GetEventInt(event, "userid")) != g_msgAuthor)
        return;
  
    mode = GetConVarInt(g_hCvarTeam);
  
    if (g_msgIsTeammate && mode < 1)
        return;
  
    decl players[MaxClients];
    int playersNum = 0;
  
    if (g_msgIsTeammate && mode == 1 && g_msgAuthor > 0)
    {
        int team = GetClientTeam(g_msgAuthor);
      
        for (new client = 1; client <= MaxClients; client++)
        {
            if(!(GetUserFlagBits(client) & adminFlagsBits))
                continue;

            if (IsClientInGame(client) && g_msgTarget[client] && GetClientTeam(client) == team)
                players[playersNum++] = client;
          
            g_msgTarget[client] = false;
        }
    }
    else
    {
        for (new client = 1; client <= MaxClients; client++)
        {
            if(!(GetUserFlagBits(client) & adminFlagsBits))
                continue;

            if (IsClientInGame(client) && g_msgTarget[client])
                players[playersNum++] = client;
          
            g_msgTarget[client] = false;
        }
    }
  
    if (playersNum == 0)
        return;
  
    Handle SayText2 = StartMessage("SayText2", players, playersNum, USERMSG_RELIABLE | USERMSG_BLOCKHOOKS);
  
    if (SayText2 != INVALID_HANDLE)
    {
        BfWriteByte(SayText2, g_msgAuthor);
        BfWriteByte(SayText2, g_msgIsChat);
        BfWriteString(SayText2, g_msgType);
        BfWriteString(SayText2, g_msgName);
        BfWriteString(SayText2, g_msgText);
        EndMessage();
    }
}

public Action Command_Say(client, const char[] command, argc)
{
    if(!(GetUserFlagBits(client) & adminFlagsBits))
        return Plugin_Continue;

    for (new target = 1; target <= MaxClients; target++)
        g_msgTarget[target] = true;
  
    if (StrEqual(command, "say_team", false))
        g_msgIsTeammate = true;
    else
        g_msgIsTeammate = false;

    return Plugin_Continue;
}
 

babka68

Участник
Сообщения
2,124
Реакции
956
Без указания флага:
#pragma semicolon 1
#include <sourcemod>

public Plugin myinfo =
{
    name = "all chat",
    author = "Frenzzy",
    description = "Relays chat messages to all players",
    version = "1.1",
    url = "http://forums.alliedmods.net/showthread.php?p=1593727",
};

/* Convars */
Handle
        g_hCvarAllTalk = INVALID_HANDLE,
        g_hCvarMode = INVALID_HANDLE,
        g_hCvarTeam = INVALID_HANDLE;

/* Chat Message */
char
        g_msgAuthor,
        g_msgType[64],
        g_msgName[64],
        g_msgText[512];
     
bool
        g_msgIsChat,
        g_msgIsTeammate,
        g_msgTarget[MAXPLAYERS + 1];

public void OnPluginStart()
{
    // Events.
    UserMsg SayText2 = GetUserMessageId("SayText2");
 
    if (SayText2 == INVALID_MESSAGE_ID)
        SetFailState("This game doesn't support SayText2 user messages.");
 
    HookUserMessage(SayText2, Hook_UserMessage);
    HookEvent("player_say", Event_PlayerSay);
 
    g_hCvarAllTalk = FindConVar("sv_alltalk");
    g_hCvarMode = CreateConVar("sm_allchat_mode", "2", "Relays chat messages to all players? 0 = No, 1 = Yes, 2 = If AllTalk On", _, true, 0.0, true, 2.0);
    g_hCvarTeam = CreateConVar("sm_allchat_team", "2", "Who can see say_team messages? 0 = Default, 1 = All teammates, 2 = All players", _, true, 0.0, true, 2.0);
 
    // Commands.
    AddCommandListener(Command_Say, "say");
    AddCommandListener(Command_Say, "say_team");
}

public Action Hook_UserMessage(UserMsg:msg_id, Handle bf, const players[], playersNum, bool reliable, bool init)
{
    g_msgAuthor = BfReadByte(bf);
    g_msgIsChat = bool:BfReadByte(bf);
 
    BfReadString(bf, g_msgType, sizeof(g_msgType), false);
    BfReadString(bf, g_msgName, sizeof(g_msgName), false);
    BfReadString(bf, g_msgText, sizeof(g_msgText), false);
 
    for (new i = 0; i < playersNum; i++)
    {
        if(GetUserAdmin(players[i]) == INVALID_ADMIN_ID)
            continue;

        g_msgTarget[players[i]] = false;
    }
}

public Action Event_PlayerSay(Handle event, const char[] name, bool dontBroadcast)
{
    int mode = GetConVarInt(g_hCvarMode);
 
    if (mode < 1 || (mode > 1 && g_hCvarAllTalk != INVALID_HANDLE && !GetConVarBool(g_hCvarAllTalk)) || GetClientOfUserId(GetEventInt(event, "userid")) != g_msgAuthor)
        return;
 
    mode = GetConVarInt(g_hCvarTeam);
 
    if (g_msgIsTeammate && mode < 1)
        return;
 
    decl players[MaxClients];
    int playersNum = 0;
 
    if (g_msgIsTeammate && mode == 1 && g_msgAuthor > 0)
    {
        int team = GetClientTeam(g_msgAuthor);
     
        for (new client = 1; client <= MaxClients; client++)
        {
            if(GetUserAdmin(client) == INVALID_ADMIN_ID)
                continue;

            if (IsClientInGame(client) && g_msgTarget[client] && GetClientTeam(client) == team)
                players[playersNum++] = client;
         
            g_msgTarget[client] = false;
        }
    }
    else
    {
        for (new client = 1; client <= MaxClients; client++)
        {
            if(GetUserAdmin(client) == INVALID_ADMIN_ID)
                continue;

            if (IsClientInGame(client) && g_msgTarget[client])
                players[playersNum++] = client;
         
            g_msgTarget[client] = false;
        }
    }
 
    if (playersNum == 0)
        return;
 
    Handle SayText2 = StartMessage("SayText2", players, playersNum, USERMSG_RELIABLE | USERMSG_BLOCKHOOKS);
 
    if (SayText2 != INVALID_HANDLE)
    {
        BfWriteByte(SayText2, g_msgAuthor);
        BfWriteByte(SayText2, g_msgIsChat);
        BfWriteString(SayText2, g_msgType);
        BfWriteString(SayText2, g_msgName);
        BfWriteString(SayText2, g_msgText);
        EndMessage();
    }
}

public Action Command_Say(client, const char[] command, argc)
{
    if(GetUserAdmin(client) == INVALID_ADMIN_ID)
        return Plugin_Continue;

    for (new target = 1; target <= MaxClients; target++)
        g_msgTarget[target] = true;
 
    if (StrEqual(command, "say_team", false))
        g_msgIsTeammate = true;
    else
        g_msgIsTeammate = false;

    return Plugin_Continue;
}

С указанием флага:
#pragma semicolon 1
#include <sourcemod>

#define ADMIN_FLAG      "z"     // Админ флаги

public Plugin myinfo =
{
    name = "all chat",
    author = "Frenzzy",
    description = "Relays chat messages to all players",
    version = "1.1",
    url = "http://forums.alliedmods.net/showthread.php?p=1593727",
};

/* Convars */
Handle
        g_hCvarAllTalk = INVALID_HANDLE,
        g_hCvarMode = INVALID_HANDLE,
        g_hCvarTeam = INVALID_HANDLE;

/* Chat Message */
char
        g_msgAuthor,
        g_msgType[64],
        g_msgName[64],
        g_msgText[512];
     
bool
        g_msgIsChat,
        g_msgIsTeammate,
        g_msgTarget[MAXPLAYERS + 1];
   
int adminFlagsBits;

public void OnPluginStart()
{
    adminFlagsBits = ReadFlagString(ADMIN_FLAG);
    // Events.
    UserMsg SayText2 = GetUserMessageId("SayText2");
 
    if (SayText2 == INVALID_MESSAGE_ID)
        SetFailState("This game doesn't support SayText2 user messages.");
 
    HookUserMessage(SayText2, Hook_UserMessage);
    HookEvent("player_say", Event_PlayerSay);
 
    g_hCvarAllTalk = FindConVar("sv_alltalk");
    g_hCvarMode = CreateConVar("sm_allchat_mode", "2", "Relays chat messages to all players? 0 = No, 1 = Yes, 2 = If AllTalk On", _, true, 0.0, true, 2.0);
    g_hCvarTeam = CreateConVar("sm_allchat_team", "2", "Who can see say_team messages? 0 = Default, 1 = All teammates, 2 = All players", _, true, 0.0, true, 2.0);
 
    // Commands.
    AddCommandListener(Command_Say, "say");
    AddCommandListener(Command_Say, "say_team");
}

public Action Hook_UserMessage(UserMsg:msg_id, Handle bf, const players[], playersNum, bool reliable, bool init)
{
    g_msgAuthor = BfReadByte(bf);
    g_msgIsChat = bool:BfReadByte(bf);
 
    BfReadString(bf, g_msgType, sizeof(g_msgType), false);
    BfReadString(bf, g_msgName, sizeof(g_msgName), false);
    BfReadString(bf, g_msgText, sizeof(g_msgText), false);
 
    for (new i = 0; i < playersNum; i++)
    {
        if(!(GetUserFlagBits(players[i]) & adminFlagsBits))
            continue;

        g_msgTarget[players[i]] = false;
    }
}

public Action Event_PlayerSay(Handle event, const char[] name, bool dontBroadcast)
{
    int mode = GetConVarInt(g_hCvarMode);
 
    if (mode < 1 || (mode > 1 && g_hCvarAllTalk != INVALID_HANDLE && !GetConVarBool(g_hCvarAllTalk)) || GetClientOfUserId(GetEventInt(event, "userid")) != g_msgAuthor)
        return;
 
    mode = GetConVarInt(g_hCvarTeam);
 
    if (g_msgIsTeammate && mode < 1)
        return;
 
    decl players[MaxClients];
    int playersNum = 0;
 
    if (g_msgIsTeammate && mode == 1 && g_msgAuthor > 0)
    {
        int team = GetClientTeam(g_msgAuthor);
     
        for (new client = 1; client <= MaxClients; client++)
        {
            if(!(GetUserFlagBits(client) & adminFlagsBits))
                continue;

            if (IsClientInGame(client) && g_msgTarget[client] && GetClientTeam(client) == team)
                players[playersNum++] = client;
         
            g_msgTarget[client] = false;
        }
    }
    else
    {
        for (new client = 1; client <= MaxClients; client++)
        {
            if(!(GetUserFlagBits(client) & adminFlagsBits))
                continue;

            if (IsClientInGame(client) && g_msgTarget[client])
                players[playersNum++] = client;
         
            g_msgTarget[client] = false;
        }
    }
 
    if (playersNum == 0)
        return;
 
    Handle SayText2 = StartMessage("SayText2", players, playersNum, USERMSG_RELIABLE | USERMSG_BLOCKHOOKS);
 
    if (SayText2 != INVALID_HANDLE)
    {
        BfWriteByte(SayText2, g_msgAuthor);
        BfWriteByte(SayText2, g_msgIsChat);
        BfWriteString(SayText2, g_msgType);
        BfWriteString(SayText2, g_msgName);
        BfWriteString(SayText2, g_msgText);
        EndMessage();
    }
}

public Action Command_Say(client, const char[] command, argc)
{
    if(!(GetUserFlagBits(client) & adminFlagsBits))
        return Plugin_Continue;

    for (new target = 1; target <= MaxClients; target++)
        g_msgTarget[target] = true;
 
    if (StrEqual(command, "say_team", false))
        g_msgIsTeammate = true;
    else
        g_msgIsTeammate = false;

    return Plugin_Continue;
}
Сейчас попробуем
Сообщения автоматически склеены:

@iLoco,
Не работает вообще

C-подобный:
L 11/01/2020 - 17:50:49: Info (map "de_dust2") (file "/game/cstrike/addons/sourcemod/logs/errors_20201101.log")
L 11/01/2020 - 17:50:49: [SM] Exception reported: Client 5 is not connected
L 11/01/2020 - 17:50:49: [SM] Blaming: all_chat.smx
L 11/01/2020 - 17:50:49: [SM] Call stack trace:
L 11/01/2020 - 17:50:49: [SM]   [0] GetUserFlagBits
L 11/01/2020 - 17:50:49: [SM]   [1] Line 108, C:\Program Files\SPEDIT\sourcepawn\scripts\all_chat.sp::Event_PlayerSay
 
Последнее редактирование:

StormX

Участник
Сообщения
891
Реакции
302
CSS v34
sm 1.9+
я ещё не до конца сформулировал идею в своем "генераторе идей" (мозгу), но примерную идею постараюсь передать:
возможно ли на этой "дырявой" 34-ке создать бан, который будет банить по железу, по настоящему железу, а не конфигу. Так , чтоб только переустановка винды (ну или очень приочень сложные манипуляции) помогали обойти этот бан... типа, чтоб этот бан создавал уникальный идентификатор клиента не на основе игры, а на основе железки, то есть компьютера, с которого зашёл этот клиент и если происходит бан, то он регистрируется где-то в реестрах или подобной "глубине" компьютера и переустановка игры не помогает разбаниться.
есть ли смысл писать заказ и обсуждать подобный бан?)
буду очень благодарен за развернутые ответы, очень желательно в ЛС. Спасибо!

Без подгрузки клиенту dll мало вероятно, что можно сделать такой бан.
А за подгрузку клиенту подобных файлов сервер получает вечный БАН на бустах.
 

gazik003

Участник
Сообщения
34
Реакции
1
кто может написать плагин который не дает убивать игрока в спину с одного удара ножом, пкм чтоб наносилось не 100 урона допустим a 50
 
Последнее редактирование:

FokS

Участник
Сообщения
422
Реакции
52
кто может написать плагин который не дает убивать игрока в спину с одного удара ножом, пкм чтоб наносилось не 100 урона допустим a 50
Попробуй, когда-то очень давно находил его.
 

Вложения

  • knife_block.smx
    3.2 КБ · Просмотры: 4
  • knife_block.sp
    628 байт · Просмотры: 11

🟡differend🟢

Что хочу - то и делаю
Сообщения
975
Реакции
661
Можно как-то сделать 2, 3 и более команд? Просто не понимаю что нужно сделать.
 

Вложения

  • TEST.sp
    422 байт · Просмотры: 15

Nekro

Терра инкогнита
Сообщения
4,025
Реакции
2,260
Можно как-то сделать 2, 3 и более команд? Просто не понимаю что нужно сделать.

C-подобный:
public void OnPluginStart()
{
    RegConsoleCmd("sm_admin", cmd, "При написании этой команды выведет в чат сообщение");    /// первая команда
    
    RegConsoleCmd("sm_admin2", cmd2, "При написании этой команды выведет в чат сообщение");    /// вторая команда
}

public Action cmd(int client, int args)    //первая
{
    if(!client)
        return;

    PrintToChat(client, "У вас нет доступа к админ меню");
    PrintToChat(client, "Для приобретения админ привелегии пишем в скайп Василий Иннокентьевич");
}

public Action cmd2(int client, int args)    //вторая
{
    if(!client)
        return;

    PrintToChat(client, "У вас нет доступа к админ меню");
    PrintToChat(client, "Для приобретения админ привелегии пишем в скайп Василий Иннокентьевич");
}
 

-=HellFire=-

Kernel panic - not syncing: Fatal exception
Сообщения
1,394
Реакции
585
нет, не работает :(
Полный запрет удара, ниже вон прислали на 50 урона.
C-подобный:
public Action OnPlayerRunCmd(int client, int &buttons, int &impulse, float vel[3], float angles[3], int &weapon, int &subtype, int &cmdnum, int &tickcount, int &seed, int mouse[2])
{
    if (IsPlayerAlive(client))
    {
        if (buttons & IN_ATTACK2)
        {
            static char class[32];
            GetClientWeapon(client, class, sizeof(class));
            if(StrContains(class, "knife") != -1 || StrContains(class, "bayonet") != -1)
            {
                buttons &= ~IN_ATTACK2;
                buttons |= IN_ATTACK;
                return Plugin_Changed;
            }
        }
    }
    return Plugin_Continue;
}
 
Последнее редактирование:

Madness aka null138

Участник
Сообщения
713
Реакции
734
C++:
#include <sourcemod>
#include <sdktools>
#include <sdkhooks>

public void OnClientPutInServer(int client)
{
    SDKHook(client, SDKHook_OnTakeDamage, OnTakeDamage);
}

public Action OnTakeDamage(int client, int &attacker, int &inflictor, float &damage, int &damagetype, int &weapon, float damageForce[3], float damagePosition[3])
{
    char wpn[18];
    GetEntityClassname(weapon, wpn, 18);
    
    if(damage > 50.0 && wpn[8] == 'k' && wpn[9] == 'n')
    {
        damage = 50.0;
        return Plugin_Changed;
    }
    return Plugin_Continue;
}
 

gazik003

Участник
Сообщения
34
Реакции
1
Полный запрет удара, ниже вон прислали на 50 урона.
C-подобный:
public Action OnPlayerRunCmd(int client, int &buttons, int &impulse, float vel[3], float angles[3], int &weapon, int &subtype, int &cmdnum, int &tickcount, int &seed, int mouse[2])
{
    if (IsPlayerAlive(client))
    {
        if (buttons & IN_ATTACK2)
        {
            static char class[32];
            GetClientWeapon(client, class, sizeof(class));
            if(StrContains(class, "knife") != -1 || StrContains(class, "bayonet") != -1)
            {
                buttons &= ~IN_ATTACK2;
                buttons |= IN_ATTACK;
                return Plugin_Changed;
            }
        }
    }
    return Plugin_Continue;
}
не работает, ни тот что внизу ни у тебя
 
Последнее редактирование:
Сверху Снизу