Добро пожаловать на Pro Pawn - Портал о PAWN-скриптинге.
Страница 1 из 4 1 2 3 ... ПоследняяПоследняя
Показано с 1 по 10 из 39
  1. #1
    Аватар для Daniel_Cortez
    "Это не хак, это фича"

    Статус
    Оффлайн
    Регистрация
    06.04.2013
    Адрес
    Novokuznetsk, Russia
    Сообщений
    2,192
    Репутация:
    2589 ±

    IsRPNick - проверка на RP-ник

    Функция была сделана давно на основе варианта от frog163, но была изменена для повышения быстродействия и, в конце концов, стала почти не похожа на оригинал.
    1. stock bool:IsRPNick(const name[])
    2. { // http://pro-pawn.ru/showthread.php?7528
    3. static i, __;
    4. if ('A' <= name[0] <= 'Z' && 'a' <= name[1] <= 'z')
    5. {
    6. for (i = 1, __ = 0;;)
    7. {
    8. switch (name[++i])
    9. {
    10. case 'a'..'z':
    11. continue;
    12. case '_':
    13. if (__++, 'A' <= name[++i] <= 'Z' && 'a' <= name[++i] <= 'z')
    14. continue;
    15. else
    16. break;
    17. case '\0':
    18. return (i >= 4 && __ == 1);
    19. default:
    20. return false;
    21. }
    22. }
    23. }
    24. return false;
    25. }

    Также есть улучшенная реализация с использованием оператора emit. Работает в ~1.6 (~2.1 с JIT) раза быстрее обычной реализации, но требует версию компилятора 3.10.5+.
      Открыть/закрыть
    1. stock bool:IsRPNick(const name[])
    2. { // http://pro-pawn.ru/showthread.php?7528
    3. static num_underscores, ptr;
    4. emit
    5. {
    6. load.s.pri name
    7. load.i
    8. const.alt 'A'
    9. jsless ret_false
    10. const.alt 'Z'
    11. jsgrtr ret_false
    12. load.s.pri name
    13. add.c (cellbits / charbits)
    14. load.i
    15. const.alt 'a'
    16. jsless ret_false
    17. const.alt 'z'
    18. jsgrtr ret_false
    19. zero num_underscores
    20. load.s.pri name
    21. add.c (cellbits / charbits * 2)
    22. jump loop_entry
    23. loop:
    24. load.pri ptr
    25. add.c (cellbits / charbits)
    26. loop_entry:
    27. stor.pri ptr
    28. load.i
    29. const.alt 'a'
    30. jsless is_underscore
    31. const.alt 'z'
    32. jsleq loop
    33. is_underscore:
    34. const.alt '_'
    35. jneq is_term
    36. inc num_underscores
    37. load.pri ptr
    38. add.c (cellbits / charbits)
    39. load.i
    40. const.alt 'A'
    41. jsless ret_false
    42. const.alt 'Z'
    43. jsgrtr ret_false
    44. load.pri ptr
    45. add.c (cellbits / charbits * 2)
    46. stor.pri ptr
    47. load.i
    48. const.alt 'a'
    49. jsless ret_false
    50. const.alt 'z'
    51. jsleq loop
    52. jump ret_false
    53. is_term:
    54. jnz ret_false
    55. load.pri ptr
    56. load.s.alt name
    57. sub
    58. const.alt (cellbits / charbits * 4)
    59. jsless ret_false
    60. load.pri num_underscores
    61. const.alt 1
    62. eq
    63. retn
    64. ret_false:
    65. }
    66. return false;
    67. }


    Пример использования:
    1. public OnPlayerConnect(playerid)
    2. {
    3. new name[MAX_PLAYER_NAME+1];
    4. GetPlayerName(playerid, name, sizeof(name));
    5. if (!IsRPNick(name))
    6. {
    7. SendClientMessage(playerid, 0xC04000FF, "Вы были кикнуты за non-RP ник.");
    8. return Kick(playerid);
    9. }
    10. return 1;
    11. }


    Автор оригинала: frog163
    Доработка: Daniel_Cortez
    Последний раз редактировалось Daniel_Cortez; 17.07.2018 в 18:15. Причина: upd(2)
    Индивидуально в ЛС по скриптингу не помогаю. Задавайте все свои вопросы здесь (click).

  2. 9 пользователя(ей) сказали cпасибо:
    franked (17.02.2016) Geebrox (16.07.2018) Jeff_Monson (03.03.2014) L0ndl3m (02.03.2014) Osetin (02.03.2014) oukibt (01.07.2020) Salvacore (02.03.2014) Skuba_Lo (31.03.2014) vovandolg (09.03.2016)
  3. #2
    Аватар для Salvacore
    Инжунер-погромист

    Статус
    Оффлайн
    Регистрация
    10.05.2013
    Адрес
    Аҧсуа бызшәа
    Сообщений
    2,271
    Репутация:
    418 ±
    Отлично,забираю.

  4. #3
    Аватар для Jeff_Monson
    Пользователь

    Статус
    Оффлайн
    Регистрация
    20.10.2013
    Сообщений
    40
    Репутация:
    1 ±
    Тупой вопрос, а как его использовать?

  5. #4
    Аватар для Jeff_Monson
    Пользователь

    Статус
    Оффлайн
    Регистрация
    20.10.2013
    Сообщений
    40
    Репутация:
    1 ±
    PHP код:
    for(;;++i
    Вроде будет ругаться

    - - - Добавлено - - -

    PHP код:
    new.pwn(7461) : error 010invalid function or declaration 
    return _:((__ != 0) && (len >= 2));

  6. #5
    Аватар для Jeff_Monson
    Пользователь

    Статус
    Оффлайн
    Регистрация
    20.10.2013
    Сообщений
    40
    Репутация:
    1 ±
    Есть кто исправит?

  7. #6
    Аватар для Daniel_Cortez
    "Это не хак, это фича"

    Статус
    Оффлайн
    Регистрация
    06.04.2013
    Адрес
    Novokuznetsk, Russia
    Сообщений
    2,192
    Репутация:
    2589 ±
    Цитата Сообщение от Jeff_Monson Посмотреть сообщение
    PHP код:
    for(;;++i
    Вроде будет ругаться
    Вряд ли. В цикле предусмотрен выход (используется break).

    Цитата Сообщение от Jeff_Monson Посмотреть сообщение
    PHP код:
    new.pwn(7461) : error 010invalid function or declaration 
    return _:((__ != 0) && (len >= 2));
    Уверен, что нигде в своём моде фигурную скобку не пропустил? Я вчера пробовал воспроизвести ошибку на нескольких модах - всё компилируется без проблем.

    В крайнем случае можете исправить строку
    PHP код:
    return _:((__ != 0) && (len >= 2)); 
    на такой вариант:
    PHP код:
    return (__ != 0) && (len >= 2); 
    Индивидуально в ЛС по скриптингу не помогаю. Задавайте все свои вопросы здесь (click).

  8. #7
    Аватар для Jeff_Monson
    Пользователь

    Статус
    Оффлайн
    Регистрация
    20.10.2013
    Сообщений
    40
    Репутация:
    1 ±
    PHP код:
    stock CheckName(playername[])
    {
        new 
    firstname[10],lastname[10];
        if(
    sscanf(playername,"p<_>s[10]s[10]",firstname,lastname)) return 0;
        if(
    strlen(firstname) < 3) return 0;
        if(
    strlen(lastname) < 3) return 0;
        if(!(
    'A' <= firstname[0] <= 'Z')) return 0;
        if(!(
    'A' <= lastname[0] <= 'Z')) return 0;
        for(new 
    0strlen(lastname); i++)
        {
            if(
    == 0) continue;
            if(
    strlen(firstname))
            {
                if(!(
    'a' <= lastname[i] <= 'z')) return 0;
            }
            if(
    strlen(lastname))
            {
                if(!(
    'a' <= lastname[i] <= 'z')) return 0;
            }
        }
        return 
    1;

    Как вы думаете код нормальный?

  9. #8
    Аватар для Gressie
    Пользователь

    Статус
    Оффлайн
    Регистрация
    03.05.2013
    Сообщений
    258
    Репутация:
    6 ±
    Она ловит все нонрп ники?

  10. #9
    Аватар для Salvacore
    Инжунер-погромист

    Статус
    Оффлайн
    Регистрация
    10.05.2013
    Адрес
    Аҧсуа бызшәа
    Сообщений
    2,271
    Репутация:
    418 ±
    Цитата Сообщение от Maks5 Посмотреть сообщение
    Она ловит все нонрп ники?
    Пробуй.
    Никто не мешает :)

  11. #10
    Аватар для vovandolg
    Пользователь

    Статус
    Оффлайн
    Регистрация
    17.11.2015
    Адрес
    Stavropol
    Сообщений
    1,369
    Репутация:
    113 ±
    А как сделать чтобы под англ и под русские сразу шло?
    [Anticheat]___Invisible Fly Hack
    [Anticheat]____Weapon/Ammo Hack
    [Function]______ResetPlayerWeaponSlot
    [Function]_______FIX_SetPlayerAmmo
    [ServerMod]______TDM | Zombie Apokalypse

 

 
Страница 1 из 4 1 2 3 ... ПоследняяПоследняя

Информация о теме

Пользователи, просматривающие эту тему

Эту тему просматривают: 1 (пользователей: 0 , гостей: 1)

Метки этой темы

Ваши права

  • Вы не можете создавать новые темы
  • Вы не можете отвечать в темах
  • Вы не можете прикреплять вложения
  • Вы не можете редактировать свои сообщения
  •