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

Sniper0770

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

gibs

Фитиль народного волненья
Сообщения
722
Реакции
407
Мошенник
Action - это тип, который должна возвращать функция.
public Action:CS_OnBuyCommand - это прототип форварда. Какое возвращаемое значение за что отвечает описано в документации к функции.
По сути Action - это тайпдеф int
 

AlmazON

Не путать с самим yand3xmail
Сообщения
5,099
Реакции
2,755
зачем нужна приставка Action
Action означает, что действие можно либо запретить:
Либо сделать что-то:
перед каким-то событием
И разрешить его дальнейшее выполнение:
Также, иногда можно изменить какие-то параметры события, поставив:
PHP:
return Plugin_Changed;
 

Sniper0770

Участник
Сообщения
58
Реакции
6
Спасибо всем, и еще мне нужно сравнить две строки и, чтобы срабатывало, если текст оной строки где-то полностью встречается в другой, например ("ak47" встречается в "megakillak47")
 

Sniper0770

Участник
Сообщения
58
Реакции
6
Ещё, если не сложно, помогите сделать проверку строки (условие) - чтобы в ней были только цифры и англ. буквы (это будет пароль).
 

Reiko1231

AlexTheRegent
Сообщения
508
Реакции
1,335
На скорую руку:
C-подобный:
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;
}
 

Sniper0770

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

selax

Добрая душа
Сообщения
1,172
Реакции
521
Конкретно в вашем случае - не знаю, мне кажется он там не нужен. А так - sizeof() возвращает количество элементов в массиве (размер), чтобы получить номер последнего надо отнять единицу.
 

Reiko1231

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

R1KO

fuck society
Сообщения
9,457
Реакции
7,786
  • Команда форума
  • #15
Таков вопрос: допустим, мне нужна строка с 7 первыми символами, остальные значения не имеют, но при заполнении этой строки, может быть и 100..., так вот, если я сделаю String[8], она запишет первые 7 знаков, остальные обрежет, ошибок вроде нет, правильно это или нет ?
PHP:
szBuffer[7] = 0;
Либо = '\0';
Почему написано в посте выше.
А если просто нужно только сравнивать то strncmp можно юзать
 

AlmazON

Не путать с самим yand3xmail
Сообщения
5,099
Реакции
2,755
правильно это или нет ?
Хороший вариант, так и делаю. Это при условии, что остальная часть строки действительно не имеет значения, т.е., даже при 100% совпадении:
Строка weapon_ совпадает: мы знаем, что полученный объект - это оружие, но какое - нам не важно.
в некоторых функциях пишут "sizeof(String) - 1", к чему этот -1 ?
Некоторые скриптеры неверно считают, что так они получают ровно столько, сколько влезает в строку. На самом деле, так они не используют весь массив целиком (нулевой символ всё равно подставляется функцией в конце автоматом).
 

Sniper0770

Участник
Сообщения
58
Реакции
6
Пересматривал исходник sourcebans 1.4.10 и вот вопрос возник:
PHP:
} else if(strcmp("Unban", key, false) == 0)
{
   if(StringToInt(value) == 0)
   {
      CommandDisable |= DISABLE_UNBAN;
   }
}
че вот это за бред "|=" ?
и еще
PHP:
if(!GetAdminFlag(aid, Admin_Ban))
{
  ThrowNativeError(2, "Ban Error: Player does not have BAN flag.");
  return 0;
}
почему return 0, а ни просто return
 
Последнее редактирование модератором:

Kruzya

Участник
Сообщения
12,970
Реакции
10,914
  • Команда форума
  • #18
че вот это за бред "|=" ?
Добавляется int-флаг DISABLE_UNBAN в CommandDisable

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

R1KO

fuck society
Сообщения
9,457
Реакции
7,786
  • Команда форума
  • #19
Пересматривал исходник sourcebans 1.4.10 и вот вопрос возник:
} else if(strcmp("Unban", key, false) == 0)
{
if(StringToInt(value) == 0)
{
CommandDisable |= DISABLE_UNBAN;
}
}
че вот это за бред "|=" ?
и еще
if(!GetAdminFlag(aid, Admin_Ban))
{
ThrowNativeError(2, "Ban Error: Player does not have BAN flag.");
return 0;
}
почему return 0, а ни просто return
Почитай о битовых операциях

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

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

Sniper0770

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