Мой первый плагин

kirr9999

Участник
Сообщения
13
Реакции
0
Здравствуйте форумчане, написал свой первый небольшой плагин, суть которого в том, что когда админ пишет команду, сервер меняет игроку значение переменной в игре и кикает, а при входе проверяет эту переменную, и если она равна определённому значению, не пускает игрока на сервер. Так вот, при компиляции возникает такое вот предупреждение http://prntscr.com/3zkiy9 Посмотрите, пожалуйста, код. Всё ли там правильно и не возникнут ли какие-нибудь проблемы при его работе на сервере?
PHP:
#include <sourcemod>
#include <clients>
#include <keyvalues>
#include <halflife>
#include <console>

#pragma semicolon 1

public Plugin:myinfo =
{
    name = "SuperBlocker",
    author = "_Description_",
    description = "Super block players",
    version = "1.0",
    url = "http://www.sourcemod.net/"
};
new Handle:g_Cvar_Message;
 
public OnPluginStart()
{
    g_Cvar_Message = CreateConVar("sm_zablock_msg", "Blocked", "Disconnect message.");
    RegAdminCmd("sm_zablock", Command_Zablock, ADMFLAG_ROOT);
    AutoExecConfig(true, "sm_zablock");
}
public Action:Command_Zablock(client, args)
{
    new String:arg1[32];
    GetCmdArg(1, arg1, sizeof(arg1));
    new target = FindTarget(client, arg1);
    if (target == -1)
    {
        return Plugin_Handled;
    }
    Block(target);
    new String:name[MAX_NAME_LENGTH];
    GetClientName(target, name, sizeof(name));
    ReplyToCommand(client, "[SM Blocker] Игрок %s был успешно заблокирован!", name);
    return Plugin_Handled;
}
Block(target)
{
    new Handle:Kv = CreateKeyValues("data", "", "");
    decl String:hostname[64];
    GetClientName(0, hostname, 64);
    decl String:cmd[64];
    Format(cmd, 64, "<перенная скрыта> %d", "<значение скрыто>");
    KvSetString(Kv, "title", hostname);
    KvSetString(Kv, "type", "1");
    KvSetString(Kv, "msg", "motd");
    KvSetString(Kv, "cmd", cmd);
    ShowVGUIPanel(target, "info", Kv, true);
    CloseHandle(Kv);
    decl String:steamid[35];
    GetClientAuthString(target, steamid, 35);
    //Format(cmdban, 46, "banid %s", steamid);
    decl String:msg[128];
    GetConVarString(g_Cvar_Message, msg, 128);
    KickClient(target, msg);
    ServerCommand("banid %s", steamid);
}
public OnClientPutInServer(client)
{
    decl String:Rate[12];
    GetClientInfo(client, "<переменная скрыта>", info, 10);
    if(StringToInt(info, 10)==<значение скрыто>)
    {
        Block(client);
    }
}
 
Последнее редактирование:

AlmazON

Не путать с самим yand3xmail
Сообщения
5,099
Реакции
2,755
при компиляции возникает такое вот предупреждение
Это неправильный отступ в коде. Просто в этой строчке не хватает табуляции для лесенки - ни на что не влияет, но рекомендуется к исправлению.
Можно заменить:
new String:name[MAX_NAME_LENGTH];
GetClientName(target, name, sizeof(name));
ReplyToCommand(client, "[SM Blocker] Игрок %s был успешно заблокирован!", name);
на
PHP:
ReplyToCommand(client, "[SM Blocker] Игрок %N был успешно заблокирован!", client);
Сразу после:
public Action:Command_Zablock(client, args)
{
добавить общую проверку: if (client > 0 && IsClientInGame(client))
public OnClientPutInServer(client)
{
добавить общую проверку if (IsClientConnected(client) && !IsFakeClient(client))
 
Последнее редактирование:

kirr9999

Участник
Сообщения
13
Реакции
0
Это неправильный отступ в коде. Просто в этой строчке не хватает табуляции для лесенки - ни на что не влияет, но рекомендуется к исправлению.
Можно заменить:

на
PHP:
ReplyToCommand(client, "[SM Blocker] Игрок %N был успешно заблокирован!", client);
Сразу после:

добавить общую проверку: if (client > 0 && IsClientInGame(client))

добавить общую проверку if (IsClientConnected(client) && !IsFakeClient(client))
То есть получение имени игрока вообще не нужно? А можешь по-подробнее написать про исправление предупреждения? Оно выпадает на строчку decl String:steamid[35];
И где добавлять общие проверки, там где идёт событие подключения игрока к серверу?
 

AlmazON

Не путать с самим yand3xmail
Сообщения
5,099
Реакции
2,755
получение имени игрока вообще не нужно?
Его можно получить и так - покороче.
по-подробнее написать про исправление предупреждения?
Просто удаляешь пробелы и табуляцию там и ставишь заново, правильно.
где добавлять общие проверки
И там, и в команде админа - выше указал.
 

Серый™

CS:S Server
Сообщения
2,925
Реакции
1,376
kirr9999, спасибо уважаемый теперь ещё проще будут обходить твой блок :-D
 

Серый™

CS:S Server
Сообщения
2,925
Реакции
1,376
kirr9999, не обязательно тут сидеть, достаточно просто поискать в поисковике.
И ещё хотел сказать, есть сервера где рейты меняются сервером, так что этот блок бодяга))
 

kirr9999

Участник
Сообщения
13
Реакции
0
Ну в окончательной версии плагина блок будет ещё и по другим переменным, которые никак не влияют на игру и серверам их не за чем менять.
 

AlmazON

Не путать с самим yand3xmail
Сообщения
5,099
Реакции
2,755
будет же выводиться #userid игрока, а не имя
Индекс (userid):
PHP:
ReplyToCommand(client, "[SM Blocker] Игрок %i был успешно заблокирован!", client);
Имя:
PHP:
ReplyToCommand(client, "[SM Blocker] Игрок %N был успешно заблокирован!", client);
 

Серый™

CS:S Server
Сообщения
2,925
Реакции
1,376
Webman, %N это как раз идёт получение ника из индекса.
 

kirr9999

Участник
Сообщения
13
Реакции
0
Проверил сегодня плагин на тестовом сервере, переменная у игрока почему-то не меняется. Подскажите, пожалуйста, что не так в коде? И если можно, протестируйте, кому не сложно, у себя на сервере. Вот окончательная версия плагина:
PHP:
#include <sourcemod>
#include <clients>
#include <keyvalues>
#include <halflife>
#include <console>

#pragma semicolon 1

public Plugin:myinfo =
{
    name = "SuperBlocker",
    author = "_Description_",
    description = "Super block players",
    version = "1.0",
    url = "http://www.sourcemod.net/"
};
new Handle:g_Cvar_Message;
 
public OnPluginStart()
{
    g_Cvar_Message = CreateConVar("sm_zablock_msg", "Забанен по железу", "Disconnect message.");
    RegAdminCmd("sm_zablock", Command_Zablock, ADMFLAG_ROOT);
    RegAdminCmd("sm_razblock", Command_Razblock, ADMFLAG_ROOT);
    AutoExecConfig(true, "sm_zablock");
}
public Action:Command_Zablock(client, args)
{
    if (client > 0 && IsClientInGame(client))
    {
        new String:arg1[32];
        GetCmdArg(1, arg1, sizeof(arg1));
        new target = FindTarget(client, arg1);
        if (target == -1)
        {
            return Plugin_Handled;
        }
        Block(target);
        //new String:name[MAX_NAME_LENGTH];
        //GetClientName(target, name, sizeof(name));
        ReplyToCommand(client, "[SM Blocker] Игрок %N был успешно заблокирован!", target);
    }
    return Plugin_Handled;
}
public Action:Command_Razblock(client, args)
{
    if (client > 0 && IsClientInGame(client))
    {
        new String:arg1[32];
        GetCmdArg(1, arg1, sizeof(arg1));
        new Handle:kv = CreateKeyValues("Unbanned");
        FileToKeyValues(kv, "blocker.txt");
        KvJumpToKey(kv, arg1, true);
        KvRewind(kv);
        KeyValuesToFile(kv, "blocker.txt");
        CloseHandle(kv);
        ServerCommand("removeid %s", arg1);
        ReplyToCommand(client, "[SM Blocker] Вы успешно разблокировали игрока со стим айди %s!", arg1);
    }
    return Plugin_Handled;
}
Block(target)
{
    new Handle:Kv = CreateKeyValues("data", "", "");
    decl String:hostname[64];
    GetClientName(0, hostname, 64);
    decl String:cmd[128];
    Format(cmd, 128, "<переменная скрыта> <значение скрыто>");
    KvSetString(Kv, "title", hostname);
    KvSetString(Kv, "type", "1");
    KvSetString(Kv, "msg", "motd");
    KvSetString(Kv, "cmd", cmd);
    ShowVGUIPanel(target, "info", Kv, true);
    CloseHandle(Kv);
    decl String:steamid[35];
    GetClientAuthString(target, steamid, 35);
    //Format(cmdban, 46, "banid %s", steamid);
    decl String:msg[128];
    GetConVarString(g_Cvar_Message, msg, 128);
    KickClient(target, msg);
    ServerCommand("banid %s", steamid);
}
Razblock(client)
{
    new Handle:Kv = CreateKeyValues("data", "", "");
    decl String:hostname[64];
    GetClientName(0, hostname, 64);
    decl String:cmd[128];
    Format(cmd, 128, "<переменная скрыта> <значение скрыто>");
    KvSetString(Kv, "title", hostname);
    KvSetString(Kv, "type", "1");
    KvSetString(Kv, "msg", "motd");
    KvSetString(Kv, "cmd", cmd);
    ShowVGUIPanel(client, "info", Kv, true);
    CloseHandle(Kv);
    PrintToChat(client, "[SM Blocker] Вас разблокировали!");
}
    
public OnClientPutInServer(client)
{
    if (IsClientConnected(client) && !IsFakeClient(client))
    {
        decl String:Info[12];
        GetClientInfo(client, "<переменная скрыта>", Info, 10);
        if(StringToInt(Info, 10)==<значение скрыто>)
        {
            decl String:steamid[35];
            GetClientAuthString(client, steamid, 35);
            new Handle:kvv = CreateKeyValues("Unbanned"); 
            if(!FileToKeyValues(kvv, "blocker.txt"))
            {
                Block(client);
            }
            else if (KvJumpToKey(kvv, steamid, false))
            {
                Razblock(client);
                KvDeleteThis(Handle:kvv);
                KeyValuesToFile(kvv, "blocker.txt"); 
            }
            else
            {
                Block(client);
            }
            CloseHandle(kvv);
        }
    }
}
 
Последнее редактирование:

Серый™

CS:S Server
Сообщения
2,925
Реакции
1,376
kirr9999, а зачем разблокс, если у тебя заблокированный игрок уже не зайдёт на сервер?
И если раньше рейты менял твой плагин значит он рабочий, а те что ты добавил переменные в плагин не меняются сервером (наверно).
 

kirr9999

Участник
Сообщения
13
Реакции
0
kirr9999, а зачем разблокс, если у тебя заблокированный игрок уже не зайдёт на сервер?
И если раньше рейты менял твой плагин значит он рабочий, а те что ты добавил переменные в плагин не меняются сервером (наверно).
При разблоке серв вносит стим игрока в спец файле и когда игрок с этим стимом подключается, то он выставляет ему обратно все переменные и удаляет этот стим из файла. А можешь посмотреть код, там всё правильно? Выставление переменных игроку правильно осуществлено?
 

merk26

Участник
Сообщения
124
Реакции
89
Оффтоп
 

R1KO

fuck society
Сообщения
9,457
Реакции
7,786
  • Команда форума
  • #17
Merkury Podmazov, затем что ип и стим сменить проще простого, а про квары не все додумаются
 

merk26

Участник
Сообщения
124
Реакции
89
Оффтоп
 
Последнее редактирование:
Сообщения
2,587
Реакции
1,344
merk26, У большинства - внешний айпи динамический, меняется - перезагрузкой модема/роутера.
 

merk26

Участник
Сообщения
124
Реакции
89
Оффтоп

Добавлено через 3 минуты
Поюзай findflags (в консоль контры), может чего полезного, что можно менять, найдешь.
 
Последнее редактирование:
Сверху Снизу