Объяснение кода в плагине

Тема в разделе "Программирование / Скриптинг", создана пользователем nuPAT, 11 сен 2016.

  1. nuPAT

    nuPAT

    Сообщения:
    113
    Симпатии:
    2
    Всем привет. Извиняюсь, если создал не там тему. Хочу понять код в этом плагине (не надо писать, что тут все легко - я не разбираюсь практически никак.) Хочу понять какой флаг нужен, чтобы работал иммунитет. По описанию понял, что плагин работает, если у игрока есть уровень иммунитета (99:z к примеру). Хочу понять как выдать иммунитет игроку не наделяя его админ правами. Можно ли выдать игроку например уровень 5 но не выдавая ему флаги a,b и т.д?

    Код:
    #pragma semicolon 1
    
    #include <sourcemod>
    
    public Plugin:myinfo =
    {
        name = "Basic Kickvote Immunity",
        author = "psychoninc",
        description = "Causes player kick votes to obey SM immunity levels",
        version = "1.2",
        url = "http://nicholashastings.com"
    };
    
    stock min(a, b) { return (((a) < (b)) ? (a) : (b)); }
    
    public OnPluginStart()
    {
        AddCommandListener(callvote, "callvote");
    }
    
    public Action:callvote(client, const String:cmd[], argc)
    {
        // kick vote from client, "callvote %s \"%d %s\"\n;"
        if (argc < 2)
            return Plugin_Handled;
    
        decl String:votereason[16];
        GetCmdArg(1, votereason, sizeof(votereason));
    
        if (!!strcmp(votereason, "kick", false))
            return Plugin_Handled;
    
        decl String:therest[256];
        GetCmdArg(2, therest, sizeof(therest));
    
        new userid = 0;
        new spacepos = FindCharInString(therest, ' ');
        if (spacepos > -1)
        {
            decl String:temp[12];
            strcopy(temp, min(spacepos+1, sizeof(temp)), therest);
            userid = StringToInt(temp);
        }
        else
        {
            userid = StringToInt(therest);
        }
    
        new target = GetClientOfUserId(userid);
        if (target < 1)
            return Plugin_Continue;
    
        new AdminId:clientAdmin = GetUserAdmin(client);
        new AdminId:targetAdmin = GetUserAdmin(target);
    
        if (clientAdmin == INVALID_ADMIN_ID && targetAdmin == INVALID_ADMIN_ID)
            return Plugin_Continue;
    
        if (CanAdminTarget(clientAdmin, targetAdmin))
            return Plugin_Continue;
    
        PrintToChat(client, "\x07ERROR\x01: Вы не можете забанить - \x04\"%N\"", target);
    
        return Plugin_Handled;
    }
     
  2. CrazyHackGUT

    CrazyHackGUT Меня здесь нет

    Сообщения:
    893
    Симпатии:
    551
    Никакой. Плагин просто проверяет наличие идентификатора админа.

    Можно.

    Пример с admins_simple.ini:
    Код:
    "STEAM_0:0:55665612"    "5"
    Или с admins.cfg:
    PHP:
    "Admins"
    {
        
    "Крузефаг"
        
    {
            
    "auth"            "steam"
            "identity"        "STEAM_0:0:55665612"
            "immunity"        "5"
        
    }
    }
     
    nuPAT нравится это.
  3. nuPAT

    nuPAT

    Сообщения:
    113
    Симпатии:
    2
    Подскажи еще одно: могут ли игроки с иммунитетом банить друг друга? Сработает ли защита в этом случае? Я говорю о бане через стандартное голосование из меню игры (от которого и призван защитить этот плагин)
     
  4. CrazyHackGUT

    CrazyHackGUT Меня здесь нет

    Сообщения:
    893
    Симпатии:
    551
    @nuPAT, если иммунитет инициатора голосования за "бан" равен или меньше иммунитета тому, которому он пытается прописать "бан", то вполне да, начнётся голосование.
     
    nuPAT нравится это.
  5. nuPAT

    nuPAT

    Сообщения:
    113
    Симпатии:
    2
    Вот фигня. А можешь доделать плагин, если знания позволяют, чтобы они тоже не могли банить друг друга (при равном иммунитете)?

    От этого будет зависеть? Не знаешь?

    // Sets how SourceMod should check immunity levels when administrators target
    // each other.
    // 0: Ignore immunity levels (except for specific group immunities).
    // 1: Protect from admins of lower access only.
    // 2: Protect from admins of equal to or lower access.
    // 3: Same as 2, except admins with no immunity can affect each other.
    // --
    // Default: 1
    sm_immunity_mode 1
     
  6. diller110

    diller110

    Сообщения:
    138
    Симпатии:
    48
    Да, будет зависеть. При sm_immunity_mode 1 голосовать против равного не получиться.
    if (CanAdminTarget(clientAdmin, targetAdmin))
    return Plugin_Continue;
     
  7. CrazyHackGUT

    CrazyHackGUT Меня здесь нет

    Сообщения:
    893
    Симпатии:
    551
    @nuPAT, будет. Поменяй значение переменной sm_immunity_mode на 2, и два админа с равными иммунитетами не смогут "накинуться" друг на друга с голосованиями за кик\бан.
     
    nuPAT нравится это.