Небольшие вопросы по написанию плагинов.

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

  1. Sniper0770

    Sniper0770

    Сообщения:
    51
    Симпатии:
    1
    Например функция: public Action:CS_OnBuyCommand, зачем нужна приставка Action ?
    И ещё, в каких случаях нужно в конце работы функции писать return Plugin_Handled или return Plugin_Continue ?
     
  2. September

    September

    Сообщения:
    1.194
    Симпатии:
    165
  3. 8Ahnenerbe8

    8Ahnenerbe8

    Сообщения:
    102
    Симпатии:
    11
  4. gibs

    gibs Фитиль народного волненья

    Сообщения:
    542
    Симпатии:
    139
    Action - это тип, который должна возвращать функция.
    public Action:CS_OnBuyCommand - это прототип форварда. Какое возвращаемое значение за что отвечает описано в документации к функции.
    По сути Action - это тайпдеф int
     
  5. AlmazON

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

    Сообщения:
    4.593
    Симпатии:
    1.999
    Action означает, что действие можно либо запретить:
    Либо сделать что-то:
    И разрешить его дальнейшее выполнение:
    Также, иногда можно изменить какие-то параметры события, поставив:
    PHP:
    return Plugin_Changed;
     
  6. Sniper0770

    Sniper0770

    Сообщения:
    51
    Симпатии:
    1
    Спасибо всем, и еще мне нужно сравнить две строки и, чтобы срабатывало, если текст оной строки где-то полностью встречается в другой, например ("ak47" встречается в "megakillak47")
     
  7. AlmazON

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

    Сообщения:
    4.593
    Симпатии:
    1.999
    PHP:
    if (StrContains("megakillak47""ak47") != -1//Найдено совпадение в строке.
     
  8. Sniper0770

    Sniper0770

    Сообщения:
    51
    Симпатии:
    1
    Ещё, если не сложно, помогите сделать проверку строки (условие) - чтобы в ней были только цифры и англ. буквы (это будет пароль).
     
  9. Reiko1231

    Reiko1231 AlexTheRegent

    Сообщения:
    238
    Симпатии:
    569
    На скорую руку:
    Код:
    bool:IsValidString(const String:sString[])
    {
        new iLength = strlen(sString);
        for ( new i = 0; i < iLength; ++i ) {
            if ( !((sString[i] >= 'a' && sString[i] <= 'z') || (sString[i] >= 'A' && sString[i] <= 'Z') || (sString[i] >= '0' && sString[i] <= '9')) ) {
                return false;
            }
        }
        return true;
    }
     
    White Wolf нравится это.
  10. Sniper0770

    Sniper0770

    Сообщения:
    51
    Симпатии:
    1
    Таков вопрос: допустим, мне нужна строка с 7 первыми символами, остальные значения не имеют, но при заполнении этой строки, может быть и 100..., так вот, если я сделаю String[8], она запишет первые 7 знаков, остальные обрежет, ошибок вроде нет, правильно это или нет ? и еще, в некоторых функциях пишут "sizeof(String) - 1", к чему этот -1 ?
     
  11. Someone

    Someone

    Сообщения:
    136
    Симпатии:
    44
    Можешь кинуть эту функцию ? Интересно стало.
     
  12. Sniper0770

    Sniper0770

    Сообщения:
    51
    Симпатии:
    1
    GetCmdArgString(Said, sizeof(Said) - 1); - из плагина resetscore
     
  13. selax

    selax

    Сообщения:
    1.044
    Симпатии:
    211
    Конкретно в вашем случае - не знаю, мне кажется он там не нужен. А так - sizeof() возвращает количество элементов в массиве (размер), чтобы получить номер последнего надо отнять единицу.
     
  14. Reiko1231

    Reiko1231 AlexTheRegent

    Сообщения:
    238
    Симпатии:
    569
    Поскольку строка это по сути массив чисел, программа не знает, сколько символов ей выводить. На строку может быть выделено 512 символов, а занято будет меньше символов. Для этой цели конец строки всегда отмечается символом конца строки "\0". Если вы не поставите его в конце, то на экран выведется ваша строка и последующий "мусор" из памяти. Все функции работы со строками в SourceMod это учитывают и поэтому передавать максимальную длину нужно как sizeof(), иначе вы зарезервируете один символ под конец строки, и ещё один SourceMod.
     
  15. R1KO

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

    Сообщения:
    6.006
    Симпатии:
    2.994
    PHP:
    szBuffer[7] = 0;
    Либо = '\0';
    Почему написано в посте выше.
    А если просто нужно только сравнивать то strncmp можно юзать
     
    White Wolf нравится это.
  16. AlmazON

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

    Сообщения:
    4.593
    Симпатии:
    1.999
    Хороший вариант, так и делаю. Это при условии, что остальная часть строки действительно не имеет значения, т.е., даже при 100% совпадении:
    Строка weapon_ совпадает: мы знаем, что полученный объект - это оружие, но какое - нам не важно.
    Некоторые скриптеры неверно считают, что так они получают ровно столько, сколько влезает в строку. На самом деле, так они не используют весь массив целиком (нулевой символ всё равно подставляется функцией в конце автоматом).
     
  17. Sniper0770

    Sniper0770

    Сообщения:
    51
    Симпатии:
    1
    Пересматривал исходник sourcebans 1.4.10 и вот вопрос возник:
    PHP:
    } else if(strcmp("Unban"keyfalse) == 0)
    {
       if(
    StringToInt(value) == 0)
       {
          
    CommandDisable |= DISABLE_UNBAN;
       }
    }
    че вот это за бред "|=" ?
    и еще
    PHP:
    if(!GetAdminFlag(aidAdmin_Ban))
    {
      
    ThrowNativeError(2"Ban Error: Player does not have BAN flag.");
      return 
    0;
    }
    почему return 0, а ни просто return
     
    Последнее редактирование модератором: 1 сен 2016
  18. CrazyHackGUT

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

    Сообщения:
    903
    Симпатии:
    556
    Добавляется int-флаг DISABLE_UNBAN в CommandDisable

    Нативный вызов (если я правильно понял) должен что-то вернуть (здесь всё зависит от нескольких факторов). При использовании return вместо return 0, он ничего не возвращает. И здесь компилятор может создать варн.
     
  19. R1KO

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

    Сообщения:
    6.006
    Симпатии:
    2.994
    Почитай о битовых операциях

    А ретурн 0 потому что так требует тип функции (инт)

    А просто ретурн используется для немедленного выхода из ф-и
     
  20. Sniper0770

    Sniper0770

    Сообщения:
    51
    Симпатии:
    1
    с FormatTime разобрался, а вот функции создавать не умею:
    PHP:
    GetBanIP(const String:IP[])
    {
        if(
    iBanType == 1)
       {
          
    FormatEx(bIPsizeof(bIP), IP);
       }
       else if(
    iBanType 1)
       {
          
    decl String:IPArray[3][8];
          
    ExplodeString(IP"."IPArray38);
          switch(
    iBanType)
          {
             case 
    2:
             {
                
    FormatEx(bIPsizeof(bIP), "%s.%s.%s.0"IPArray[0], IPArray[1], IPArray[2]);
             }
              case 
    3:
             {
                
    FormatEx(bIPsizeof(bIP), "%s.%s.0.0"IPArray[0], IPArray[1]);
             }
          }
       }
    }
    мне надо, чтобы при вызове GetBanIP(String:IP) вернуло строку bIP, ну и записало ее куда то. Аналогично, как GetClientName(client, String:name[], maxlen).
     
    Последнее редактирование: 10 окт 2016