Добро пожаловать на Pro Pawn - Портал о PAWN-скриптинге.
Страница 5 из 9 ПерваяПервая ... 3 4 5 6 7 ... ПоследняяПоследняя
Показано с 41 по 50 из 87
  1. #41
    Аватар для PawnoNoob
    Пользователь

    Статус
    Оффлайн
    Регистрация
    31.03.2016
    Сообщений
    257
    Репутация:
    3 ±
    Ну вот, допустим я создал этот сток для обновления аккаунта:
    PHP код:
    stock uacc()
    {
        foreach(
    Playeri)
        {
            if(
    pinfo[i][mut] > 0)
            {
                
    pinfo[i][mut]--;
                if(
    pinfo[i][mut] <= 0)
                {
                    
    pinfo[i][mut] = 0;
                    
    SendClientMessage(playeridцвет"бана чата больше нет.");
                }
            }
        }

    p.s. в моём коде всё чики-пуки, для примера написал без копирования из кода (нет таких mut, pinfo и т.д., но это никого не волнует, ну мало ли скажете "фу ну и код")
    1. Всё ли нормально в самом стэке? Могут ли наблюдаться проблемы в будущем?
    2. Так как я изучаю программирование на конкретных примерах (используя другие моды, находящиеся в открытом доступе, ну и задавая совсем глупые вопросы Вам) и я, ради интереса, решил "заценить" систему обновления аккаунтов в разных модах:
    - В одном моде после слов "stock uacc ()" в скобочках пишется "playerid" и нету циклов (foreach, i; i<MAX_PLAYERS и т.д.)
    - В другом моде после слов "stock uacc ()" в скобочках ничего не пишется, но при этом используется цикл (new i; i < MAX_PLAYERS; i++).
    Сам вопрос: что вообще нужно писать в скобочках, если используется foreach?
    3. Нужно ли использовать функцию (или как это правильно назвать) "continue;" после SendClientMessage для пропуска итерации?
    Последний раз редактировалось PawnoNoob; 07.04.2016 в 15:23. Причина: невнимательность при написании :D добавил 3 пункт

  2. #42
    Аватар для TheMallard
    Пользователь

    Статус
    Оффлайн
    Регистрация
    08.12.2015
    Адрес
    San Fierro
    Сообщений
    217
    Репутация:
    39 ±
    1. Со стэком все будет в порядке, если будете экономными, в данном коде ему даже ничего не грозит.
    2. foreach(new i : Player)

    P.S. Рекомендую к прочтению - http://pro-pawn.ru/showthread.php?8347

  3. Пользователь сказал cпасибо:
    PawnoNoob (08.04.2016)
  4. #43
    Аватар для PawnoNoob
    Пользователь

    Статус
    Оффлайн
    Регистрация
    31.03.2016
    Сообщений
    257
    Репутация:
    3 ±
    В общем, решил сделать таймер обновления аккаунта, но не тут-то было. Как я уже говорил, я изучаю программирование на конкретных примерах, но иногда я сталкиваюсь с такими моментами, где мне почти ничего не знакомо и я не знаю, за что отвечает та или иная функция. Так вот, вернёмся к самому таймеру. В одном из модов мне удалось найти более-менее адекватный таймер с высчитыванием времени, но я не знаю, что за что отвечает:
    PHP код:
    public Timer_Unix()
    {
        if(
    timers_unix > -1)
        {
            
    unix gettime(tmphourtmpminutetmpsecond);
            
            if(
    unix_hour <= unix)
            {
                
    Hour();
                
    unix_hour unix+3600;
            }
            else if(
    unix_min <= unix)
            {
                
    Minutes();
                
    unix_min unix+60;
            }
            else if(
    unix_sec <= unix)
            {
                
    Second();
                
    unix_sec unix+1;
            }
        }
        return 
    1;

    И переменные:
    PHP код:
    new timers_unix = -1;
    new 
    unixunix_hourunix_minunix_sec;
    new 
    tmphourtmpminutetmpsecond
    Я предполагаю, что gettime - получение времени компьютера (или сервера), unix_hour(_min, _sec) - час, минута, секунда.
    Посмотрев по коду ещё можно узнать, что hour - это система зарплаты, которая выдаётся раз в час, minutes - обновление складов, вывод сообщения раз в n-минут, а second - обновление аккаунта (которое, кстати, я сейчас и пытаюсь сделать).
    А что дают остальные функции? Ну, unix+1 - раз в секунду, а остальное что означает?

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

    Статус
    Оффлайн
    Регистрация
    04.01.2015
    Адрес
    Гомель, Беларусь
    Сообщений
    548
    Репутация:
    158 ±
    Цитата Сообщение от PawnoNoob Посмотреть сообщение
    В общем, решил сделать таймер обновления аккаунта, но не тут-то было. Как я уже говорил, я изучаю программирование на конкретных примерах, но иногда я сталкиваюсь с такими моментами, где мне почти ничего не знакомо и я не знаю, за что отвечает та или иная функция. Так вот, вернёмся к самому таймеру. В одном из модов мне удалось найти более-менее адекватный таймер с высчитыванием времени, но я не знаю, что за что отвечает:
    PHP код:
    public Timer_Unix()
    {
        if(
    timers_unix > -1)
        {
            
    unix gettime(tmphourtmpminutetmpsecond);
            
            if(
    unix_hour <= unix)
            {
                
    Hour();
                
    unix_hour unix+3600;
            }
            else if(
    unix_min <= unix)
            {
                
    Minutes();
                
    unix_min unix+60;
            }
            else if(
    unix_sec <= unix)
            {
                
    Second();
                
    unix_sec unix+1;
            }
        }
        return 
    1;

    И переменные:
    PHP код:
    new timers_unix = -1;
    new 
    unixunix_hourunix_minunix_sec;
    new 
    tmphourtmpminutetmpsecond
    Я предполагаю, что gettime - получение времени компьютера (или сервера), unix_hour(_min, _sec) - час, минута, секунда.
    Посмотрев по коду ещё можно узнать, что hour - это система зарплаты, которая выдаётся раз в час, minutes - обновление складов, вывод сообщения раз в n-минут, а second - обновление аккаунта (которое, кстати, я сейчас и пытаюсь сделать).
    А что дают остальные функции? Ну, unix+1 - раз в секунду, а остальное что означает?
    Придумано довольно умно. Таймер, предполагаю, вызывается каждую секунду.

    Собственно, объясню по частям:
    PHP код:
    new timers_unix = -1;
    new 
    unixunix_hourunix_minunix_sec;
    new 
    tmphourtmpminutetmpsecond
    Тут объявляются переменные для таймера. timers_unix будет, судя по коду дальше, хранить ид таймера. unix_(hour/min/sec) нужны для постоянного хранения прошедшего времени. Под прошедшим временем понимается unix time (это число секунд, прошедших с 1 января 1970 года если не ошибаюсь). Переменные tmp(hour/minute/second) как-бы (по идее автора наверное) нужны только для заполнения аргументов для функции "gettime", которая вызывается в таймере, но по сути они не нужны, ибо для узнавания только unix-time'а можно просто вызвать "gettime" без параметров вообще.

    PHP код:
    public Timer_Unix()
    {
        if(
    timers_unix > -1//
        

    Здесь какая-то нужная проверка, скорее всего при запуске таймера "Timer_Unix" переменной "timers_unix" присваивается ид этого таймера. А т.к. эта переменная по умолчанию -1, то код не будет выполняться, если таймер не запущен (т.е. если public Timer_Unix() был вызван не таймером). В общем дальше.

    PHP код:
    unix gettime(tmphourtmpminutetmpsecond); 
    Тут мы записываем этот unix-time в переменную unix, чтобы далее...

    PHP код:
    if(unix_hour <= unix)
            {
                
    Hour();
                
    unix_hour unix+3600;
            } 
    сверять её с переменными, которым, если условие выполнится (а первый раз оно в любом случае выполнится), будет присвоено значение текущего количества секунд + час в эквиваленте секунд (а 1 час это как раз и есть 3600 секунд)

    PHP код:
    else if(unix_min <= unix)
            {
                
    Minutes();
                
    unix_min unix+60;
            } 
    Либо минута в эквиваленте секунд (а это как раз 60)

    PHP код:
    else if(unix_sec <= unix)
            {
                
    Second();
                
    unix_sec unix+1;
            } 
    Либо просто плюс одна секунда.

    Делается это для того, чтобы не заводить отдельные таймеры на одну секунду, одну минуту и один час, а просто в секундном таймере узнавать "новый" unix-time, сверять его с прошедшими часами (в эквиваленте секунд), и если час прошёл, т.е. значение текущего unix-time'а достигло значения того, который мы поставили ("unix_hour = unix+3600;"), значит вызываем события, которые должны быть раз в один час (подразумевая, что эти события есть "Hour()"). Аналогично с минутами и с секундами.

    Может не так и понятно объяснил, но надеюсь, дойдёт)
    Последний раз редактировалось Nexius_Tailer; 07.04.2016 в 20:15.

  6. Пользователь сказал cпасибо:
    PawnoNoob (07.04.2016)
  7. #45
    Аватар для PawnoNoob
    Пользователь

    Статус
    Оффлайн
    Регистрация
    31.03.2016
    Сообщений
    257
    Репутация:
    3 ±
    А что такое "DeAMX"? Как эту функцию использовать и нужна ли она вообще?

  8. #46
    Аватар для Desulaid
    лесоруб продакшен

    Статус
    Оффлайн
    Регистрация
    15.03.2015
    Адрес
    Slobodskoy
    Сообщений
    667
    Репутация:
    236 ±
    Цитата Сообщение от PawnoNoob Посмотреть сообщение
    А что такое "DeAMX"? Как эту функцию использовать и нужна ли она вообще?
    Когда есть это, меня ничего не интересует другое :)

  9. Пользователь сказал cпасибо:
    PawnoNoob (07.04.2016)
  10. #47
    Аватар для PawnoNoob
    Пользователь

    Статус
    Оффлайн
    Регистрация
    31.03.2016
    Сообщений
    257
    Репутация:
    3 ±
    Цитата Сообщение от Anton Styazhkin Посмотреть сообщение
    Когда есть это, меня ничего не интересует другое :)
    А-а-а, значит эта штуковина мне не очень-то и нужна. Почему? Потому что я ещё учусь программированию и "пишу" (:D) мод не для открытия сервера, а просто так, для обучения и для интереса. Глянуть, что да как.

    Всё же осталось несколько вопросов касательно кода:
    Вопрос номер один:
    Ну вот, допустим я создал этот сток для обновления аккаунта (не такой некрасивый, а грамотный, всё красиво оформлено, нет никаких mut, uacc и т.д.):
    PHP код:
    stock uacc()
    {
        foreach(
    Playeri)
        {
            if(
    pinfo[i][mut] > 0)
            {
                
    pinfo[i][mut]--;
                if(
    pinfo[i][mut] <= 0)
                {
                    
    pinfo[i][mut] = 0;
                    
    SendClientMessage(playeridцвет"бана чата больше нет.");
                }
            }
        }

    Нужно ли использовать функцию (или как это правильно назвать) "continue;" после SendClientMessage для пропуска итерации?
    Вопрос номер два: (цитирую)
    Так как я изучаю программирование на конкретных примерах (используя другие моды, находящиеся в открытом доступе, ну и задавая совсем глупые вопросы Вам) и я, ради интереса, решил "заценить" систему обновления аккаунтов в разных модах:
    - В одном моде после слов "stock uacc ()" в скобочках пишется "playerid" и нету циклов (foreach, i; i<MAX_PLAYERS и т.д.)
    - В другом моде после слов "stock uacc ()" в скобочках ничего не пишется, но при этом используется цикл (new i; i < MAX_PLAYERS; i++).
    Сам вопрос: что вообще нужно писать в скобочках, если используется foreach?

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

    Статус
    Оффлайн
    Регистрация
    06.04.2013
    Адрес
    Novokuznetsk, Russia
    Сообщений
    2,192
    Репутация:
    2590 ±
    Цитата Сообщение от PawnoNoob Посмотреть сообщение
    Нужно ли использовать функцию (или как это правильно назвать) "continue;" после SendClientMessage для пропуска итерации?
    Это называется оператором.
    Вообще, я бы не советовал вам заострять внимание на расстановке continue, т.к., ИМХО, она относится к низкоуровневым оптимизациям, для правильного применения которых нужно разбираться в том, какой код генерируется в .amx из вашего исходного кода на Pawn.
    Индивидуально в ЛС по скриптингу не помогаю. Задавайте все свои вопросы здесь (click).

  12. Пользователь сказал cпасибо:
    PawnoNoob (07.04.2016)
  13. #49
    Аватар для PawnoNoob
    Пользователь

    Статус
    Оффлайн
    Регистрация
    31.03.2016
    Сообщений
    257
    Репутация:
    3 ±
    Решил "прогнать" ещё раз систему регистрации, вводя максимальные значения для данных:
    Адрес электронной почты - 34 символа.
    Пароль - 14 символов.
    Если ввести в диалоговом окне для ввода адреса электронной почты 32 символа, то в базе данных аккаунт сохранится с почтой "1", а если ввести 33 и более символа, то аккаунт вообще не сохранится.

    Использую плагин regex с дефайном из официальной темы:
    PHP код:
    #define IsValidEmail(%1) \
        
    regex_match(%1"[a-zA-Z0-9_\\.]+@([a-zA-Z0-9\\-]+\\.)+[a-zA-Z]{2,4}"
    Код из моего мода:
    PHP код:
        case 5:
            {
                if(!
    IsValidEmail(inputtext))
                {
                    
    SendClientMessage(playeridцвет"введён неверный адрес электронной почты.");
                    
    // здесь вызывается stock диалогового окна ввода адреса электронной почты.
                
    }
                else
                {
                    
    // здесь код создания аккаунта с вводом адреса электронной почты.
                
    }
            } 
    Для длины запроса выделено 149 (MAX_PLAYER_NAME+91+34) символов, а сам запрос выглядит так:
    PHP код:
    INSERT INTO `accounts` (`ник`, `пароль`, `адрес электронной почты `) VALUES ('%s''%s''%s'// выдуманные, не настоящие названия столбцов. 
    И кстати, если ввести 32 и менее символов, то аккаунт зарегистрируется с введённым адресом электронной почты и при этом нормально сохранится.

    И, конечно же, строчка из лога MySQL (совсем забыл про неё :) ):
    PHP код:
    (error #1064) You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near ''здесь ввведённый адрес эл. почты' at line 1 
    Последний раз редактировалось PawnoNoob; 07.04.2016 в 23:16. Причина: Добавил строку из лога

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

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

  15. Пользователь сказал cпасибо:
    PawnoNoob (08.04.2016)
 

 
Страница 5 из 9 ПерваяПервая ... 3 4 5 6 7 ... ПоследняяПоследняя

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

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

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

Ваши права

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