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

Тема в разделе "Программирование / Скриптинг", создана пользователем kirr9999, 5 июл 2014.

  1. kirr9999

    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_ZablockADMFLAG_ROOT);
        
    AutoExecConfig(true"sm_zablock");
    }
    public 
    Action:Command_Zablock(clientargs)
    {
        new 
    String:arg1[32];
        
    GetCmdArg(1arg1sizeof(arg1));
        new 
    target FindTarget(clientarg1);
        if (
    target == -1)
        {
            return 
    Plugin_Handled;
        }
        
    Block(target);
        new 
    String:name[MAX_NAME_LENGTH];
        
    GetClientName(targetnamesizeof(name));
        
    ReplyToCommand(client"[SM Blocker] Игрок %s был успешно заблокирован!"name);
        return 
    Plugin_Handled;
    }
    Block(target)
    {
        new 
    Handle:Kv CreateKeyValues("data""""");
        
    decl String:hostname[64];
        
    GetClientName(0hostname64);
        
    decl String:cmd[64];
        
    Format(cmd64"<перенная скрыта> %d""<значение скрыто>");
        
    KvSetString(Kv"title"hostname);
        
    KvSetString(Kv"type""1");
        
    KvSetString(Kv"msg""motd");
        
    KvSetString(Kv"cmd"cmd);
        
    ShowVGUIPanel(target"info"Kvtrue);
        
    CloseHandle(Kv);
        
    decl String:steamid[35];
        
    GetClientAuthString(targetsteamid35);
        
    //Format(cmdban, 46, "banid %s", steamid);
        
    decl String:msg[128];
        
    GetConVarString(g_Cvar_Messagemsg128);
        
    KickClient(targetmsg);
        
    ServerCommand("banid %s"steamid);
    }
    public 
    OnClientPutInServer(client)
    {
        
    decl String:Rate[12];
        
    GetClientInfo(client"<переменная скрыта>"info10);
        if(
    StringToInt(info10)==<значение скрыто>)
        {
            
    Block(client);
        }
    }
     
    Последнее редактирование: 5 июл 2014
  2. AlmazON

    AlmazON деревянный © yand3xmail

    Сообщения:
    4.512
    Симпатии:
    1.964
    Это неправильный отступ в коде. Просто в этой строчке не хватает табуляции для лесенки - ни на что не влияет, но рекомендуется к исправлению.
    Можно заменить:
    на
    PHP:
    ReplyToCommand(client"[SM Blocker] Игрок %N был успешно заблокирован!"client);
    Сразу после:
    добавить общую проверку: if (client > 0 && IsClientInGame(client))
    добавить общую проверку if (IsClientConnected(client) && !IsFakeClient(client))
     
    Последнее редактирование: 5 июл 2014
    kirr9999 нравится это.
  3. kirr9999

    kirr9999

    Сообщения:
    13
    Симпатии:
    0
    То есть получение имени игрока вообще не нужно? А можешь по-подробнее написать про исправление предупреждения? Оно выпадает на строчку decl String:steamid[35];
    И где добавлять общие проверки, там где идёт событие подключения игрока к серверу?
     
  4. AlmazON

    AlmazON деревянный © yand3xmail

    Сообщения:
    4.512
    Симпатии:
    1.964
    Его можно получить и так - покороче.
    Просто удаляешь пробелы и табуляцию там и ставишь заново, правильно.
    И там, и в команде админа - выше указал.
     
    kirr9999 нравится это.
  5. Серый™

    Серый™ CS:S Server

    Сообщения:
    2.563
    Симпатии:
    1.149
    kirr9999, спасибо уважаемый теперь ещё проще будут обходить твой блок :-D
     
  6. kirr9999

    kirr9999

    Сообщения:
    13
    Симпатии:
    0
    Думаю, тем кто сидит на этом форуме в данном разделе, будет итак не сложно догадаться, как обойти такой блок))
     
  7. Серый™

    Серый™ CS:S Server

    Сообщения:
    2.563
    Симпатии:
    1.149
    kirr9999, не обязательно тут сидеть, достаточно просто поискать в поисковике.
    И ещё хотел сказать, есть сервера где рейты меняются сервером, так что этот блок бодяга))
     
  8. AlmazON

    AlmazON деревянный © yand3xmail

    Сообщения:
    4.512
    Симпатии:
    1.964
    Того же мнения. Если читер часто меняет сервера (а так и есть), то его конфиг давно изменится сервером.
     
  9. kirr9999

    kirr9999

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

    Webman Developer

    Сообщения:
    702
    Симпатии:
    182
    В таком случаи будет же выводиться #userid игрока, а не имя. Когда выводится имя, гораздо понятнее - кому применено действие и т.д.
     
  11. AlmazON

    AlmazON деревянный © yand3xmail

    Сообщения:
    4.512
    Симпатии:
    1.964
    Индекс (userid):
    PHP:
    ReplyToCommand(client"[SM Blocker] Игрок %i был успешно заблокирован!"client);
    Имя:
    PHP:
    ReplyToCommand(client"[SM Blocker] Игрок %N был успешно заблокирован!"client);
     
    Webman нравится это.
  12. Серый™

    Серый™ CS:S Server

    Сообщения:
    2.563
    Симпатии:
    1.149
    Webman, %N это как раз идёт получение ника из индекса.
     
    Webman нравится это.
  13. kirr9999

    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_ZablockADMFLAG_ROOT);
        
    RegAdminCmd("sm_razblock"Command_RazblockADMFLAG_ROOT);
        
    AutoExecConfig(true"sm_zablock");
    }
    public 
    Action:Command_Zablock(clientargs)
    {
        if (
    client && IsClientInGame(client))
        {
            new 
    String:arg1[32];
            
    GetCmdArg(1arg1sizeof(arg1));
            new 
    target FindTarget(clientarg1);
            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(clientargs)
    {
        if (
    client && IsClientInGame(client))
        {
            new 
    String:arg1[32];
            
    GetCmdArg(1arg1sizeof(arg1));
            new 
    Handle:kv CreateKeyValues("Unbanned");
            
    FileToKeyValues(kv"blocker.txt");
            
    KvJumpToKey(kvarg1true);
            
    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(0hostname64);
        
    decl String:cmd[128];
        
    Format(cmd128"<переменная скрыта> <значение скрыто>");
        
    KvSetString(Kv"title"hostname);
        
    KvSetString(Kv"type""1");
        
    KvSetString(Kv"msg""motd");
        
    KvSetString(Kv"cmd"cmd);
        
    ShowVGUIPanel(target"info"Kvtrue);
        
    CloseHandle(Kv);
        
    decl String:steamid[35];
        
    GetClientAuthString(targetsteamid35);
        
    //Format(cmdban, 46, "banid %s", steamid);
        
    decl String:msg[128];
        
    GetConVarString(g_Cvar_Messagemsg128);
        
    KickClient(targetmsg);
        
    ServerCommand("banid %s"steamid);
    }
    Razblock(client)
    {
        new 
    Handle:Kv CreateKeyValues("data""""");
        
    decl String:hostname[64];
        
    GetClientName(0hostname64);
        
    decl String:cmd[128];
        
    Format(cmd128"<переменная скрыта> <значение скрыто>");
        
    KvSetString(Kv"title"hostname);
        
    KvSetString(Kv"type""1");
        
    KvSetString(Kv"msg""motd");
        
    KvSetString(Kv"cmd"cmd);
        
    ShowVGUIPanel(client"info"Kvtrue);
        
    CloseHandle(Kv);
        
    PrintToChat(client"[SM Blocker] Вас разблокировали!");
    }
        
    public 
    OnClientPutInServer(client)
    {
        if (
    IsClientConnected(client) && !IsFakeClient(client))
        {
            
    decl String:Info[12];
            
    GetClientInfo(client"<переменная скрыта>"Info10);
            if(
    StringToInt(Info10)==<значение скрыто>)
            {
                
    decl String:steamid[35];
                
    GetClientAuthString(clientsteamid35);
                new 
    Handle:kvv CreateKeyValues("Unbanned"); 
                if(!
    FileToKeyValues(kvv"blocker.txt"))
                {
                    
    Block(client);
                }
                else if (
    KvJumpToKey(kvvsteamidfalse))
                {
                    
    Razblock(client);
                    
    KvDeleteThis(Handle:kvv);
                    
    KeyValuesToFile(kvv"blocker.txt"); 
                }
                else
                {
                    
    Block(client);
                }
                
    CloseHandle(kvv);
            }
        }
    }
     
    Последнее редактирование: 7 июл 2014
  14. Серый™

    Серый™ CS:S Server

    Сообщения:
    2.563
    Симпатии:
    1.149
    kirr9999, а зачем разблокс, если у тебя заблокированный игрок уже не зайдёт на сервер?
    И если раньше рейты менял твой плагин значит он рабочий, а те что ты добавил переменные в плагин не меняются сервером (наверно).
     
  15. kirr9999

    kirr9999

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

    merk26

    Сообщения:
    110
    Симпатии:
    65
    Оффтоп
     
  17. R1KO

    R1KO Супер-модератор

    Сообщения:
    5.973
    Симпатии:
    2.980
    Merkury Podmazov, затем что ип и стим сменить проще простого, а про квары не все додумаются
     
  18. merk26

    merk26

    Сообщения:
    110
    Симпатии:
    65
    Оффтоп
     
    Последнее редактирование: 7 июл 2014
  19. ☆★☆БАТЯ☆★☆™

    ☆★☆БАТЯ☆★☆™

    Сообщения:
    2.585
    Симпатии:
    1.341
    merk26, У большинства - внешний айпи динамический, меняется - перезагрузкой модема/роутера.
     
  20. merk26

    merk26

    Сообщения:
    110
    Симпатии:
    65
    Оффтоп

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