Добро пожаловать на Pro Pawn - Портал о PAWN-скриптинге.
Показано с 1 по 6 из 6
  1. #1
    Аватар для Роуди.
    Пользователь

    Статус
    Оффлайн
    Регистрация
    31.07.2015
    Сообщений
    154
    Репутация:
    17 ±

    Время в игре / gettime ()

    Вечер в хату, скриптёры :D

    Два вопроса возникли у меня вдруг, один насчет время проведенное в игре ( Реализация у меня есть, но какая-то она костыльная ) и про gettime() , которое возвращает UNIX время.


    1. Время в игре я получаю так: Создаю 3 глобальный переменые, которая отвечает за часы & минуты & секунды. Затем, в 1 секундном таймере прибавляю к second_in_game +1 и когда переменая будет равнятся нулю, то обнуляю ее и приплюсовываю minute_in_game, так же и с часом.
    Если кто не понял, то прилагаю код.
    PHP код:
        seconds_in_game ++;
        
        if(
    seconds_in_game >= 59)
        {
            
    minute_in_game ++;
            
    seconds_in_game 0;
        }
        if(
    minute_in_game >= 59)
        {
            
    hour_in_game ++;
            
    minute_in_game 0;
        } 
    Можно что-то проще придумать?

    2. Второй вопрос заключается в том, что gettime() возвращает не точное время ( Примерно -10 от моего настоящего времени, запускаю на локалке )

    сегоднящнее число получаю таким образом
    PHP код:
    gettime()-366 
    , затем конвертирую через инклуд mxdate и получаю точное число & месяц & год, но время - нет.
    По этому мне пришлось приплюсовывать недостающие часы gettime()+39600, но боюсь если поставлю мод на хостинг будет определять не точное время, подтвердятся мои опасения?

    Заранее спасибо за внимание.
    Последний раз редактировалось Роуди.; 07.01.2016 в 17:34.

  2. #2
    Аватар для DeimoS
    Модератор?

    Статус
    Оффлайн
    Регистрация
    27.01.2014
    Адрес
    Восточный Мордор
    Сообщений
    5,588
    Репутация:
    1984 ±
    1) Эмм, глобально:
    PHP код:
    new time_in_game[MAX_PLAYERS];//Как я понимаю, подсчёт времени для игроков идёт 
    В OnPlayerConnect или при авторизации:
    PHP код:
    time_in_game[playerid] = gettime(); 
    И пример вывода времени:
    PHP код:
    printf("Игрок с ID %d провёл в игре %d секунд"playeridgettime()-time_in_game[playerid]); 
    Ну а написать конвертер, который из секунд получит время, я думаю, не составит труда.

     Ну а если составит, то вот, например:
    PHP код:
    stock ConvertSeconds(conv_time, &conv_hour, &conv_minute,&conv_second)
    {
        if(
    conv_time <= 60)
        {
            
    conv_hour 0;
            
    conv_minute 0;
            
    conv_second conv_time;
        }
        else if(
    conv_time 60 && conv_time 3600)
        {
            
    conv_hour 0;
            
    conv_minute conv_time 60;
            
    conv_second floatround(conv_time 60floatround_tozero);
        }
        else if(
    conv_time == 3600){ conv_hour 1conv_minute 0conv_second 0; }
        else if(
    conv_time 3600)
        {
            new 
    conv_minute_int;
            
    conv_hour conv_time 3600;
            
    minutes_int floatround(conv_time 3600floatround_tozero);
            
    conv_minute conv_minute_int 60;
            
    conv_second floatround(conv_minute_int 60floatround_tozero);
        }
        return 
    1;

    Использование:
    PHP код:
    new hour_in_game,
        
    minute_in_game,
        
    seconds_in_game;

    ConvertSeconds(gettime()-time_in_game[playerid], hour_in_gameminute_in_gameseconds_in_game);
    printf("Игрок с ID %d провёл в игре %d часов, %d минут и %d секунд"playeridhour_in_gameminute_in_gameseconds_in_game); 


     Ну и вариант на pVar, который я давно писал для одного из пользователей форума
    В начало мода
    PHP код:
    #define ShowTimeOfPlayerInGame(%0,%1,%2,%3) ConvertSeconds(gettime() - GetPVarInt(%0, "Time Of Player In Game"), %1, %2, %3) 
    В OnPlayerConnect
    PHP код:
    SetPVarInt(playerid"Time Of Player In Game"gettime()); 
    После новую функцию для конвертации секунд в формат "час/минута/секунда"
    PHP код:
    stock ConvertSeconds(conv_time, &conv_hour, &conv_minute,&conv_second)
    {
        if(
    conv_time <= 60)
        {
            
    conv_hour 0;
            
    conv_minute 0;
            
    conv_second conv_time;
        }
        else if(
    conv_time 60 && conv_time 3600)
        {
            
    conv_hour 0;
            
    conv_minute conv_time 60;
            
    conv_second floatround(conv_time 60floatround_tozero);
        }
        else if(
    conv_time == 3600){ conv_hour 1conv_minute 0conv_second 0; }
        else if(
    conv_time 3600)
        {
            new 
    conv_minute_int;
            
    conv_hour conv_time 3600;
            
    minutes_int floatround(conv_time 3600floatround_tozero);
            
    conv_minute conv_minute_int 60;
            
    conv_second floatround(conv_minute_int 60floatround_tozero);
        }
        return 
    1;

    И пример вывода времени:
    PHP код:
    new hour_in_game,
        
    minute_in_game,
        
    seconds_in_game;

    ShowTimeOfPlayerInGame(playeridhour_in_gameminute_in_gameseconds_in_game);
    printf("Игрок с ID %d провёл в игре %d часов, %d минут и %d секунд"playeridhour_in_gameminute_in_gameseconds_in_game); 


    2) Не совсем понял чего Вы хотите... Зачем отнимать 366 от gettime и потом опять что-то приплюсовывать? О_о gettime и так должен возвращать нормальное время. На компьютере время установлено верное? Функция gettime снимает показания именно с настроек машины, на которой запущен сервер
    Связаться со мной в VK можно через личные сообщения этой группы
    Заказы не принимаю

    Широко известно, что идеи стоят 0.8333 цента каждая (исходя из рыночной цены 10 центов за дюжину).
    Великих идей полно, на них нет спроса.
    Воплощение идеи в законченную игру требует долгой работы,
    таланта, терпения и креативности, не говоря уж о затратах денег, времени и ресурсов.
    Предложить идею просто, воплотить – вот в чём проблема

    Steve Pavlina

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

    Статус
    Оффлайн
    Регистрация
    30.12.2015
    Сообщений
    24
    Репутация:
    2 ±
    Цитата Сообщение от Роуди. Посмотреть сообщение
    Вечер в хату, скриптёры :D

    Два вопроса возникли у меня вдруг, один насчет время проведенное в игре ( Реализация у меня есть, но какая-то она костыльная ) и про gettime() , которое возвращает UNIX время.


    1. Время в игре я получаю так: Создаю 3 глобальный переменые, которая отвечает за часы & минуты & секунды. Затем, в 1 секундном таймере прибавляю к second_in_game +1 и когда переменая будет равнятся нулю, то обнуляю ее и приплюсовываю minute_in_game, так же и с часом.
    Если кто не понял, то прилагаю код.
    PHP код:
        seconds_in_game ++;
        
        if(
    seconds_in_game >= 59)
        {
            
    minute_in_game ++;
            
    seconds_in_game 0;
        }
        if(
    minute_in_game >= 59)
        {
            
    hour_in_game ++;
            
    minute_in_game 0;
        } 
    Можно что-то проще придумать?

    2. Второй вопрос заключается в том, что gettime() возвращает не точное время ( Примерно -10 от моего настоящего времени, запускаю на локалке )

    сегоднящнее число получаю таким образом
    PHP код:
    gettime()-366 
    , затем конвертирую через инклуд mxdate и получаю точное число & месяц & год, но время - нет.
    По этому мне пришлось приплюсовывать недостающие часы gettime()+39600, но боюсь если поставлю мод на хостинг будет определять не точное время, подтвердятся мои опасения?

    Заранее спасибо за внимание.
    1. Можно просто записывать секунды проведенные в игре.Ну а далее с помощью конвертера их преобразовывать
    2. Функция gettime() возвращает unix время Вашего компьютера.

    На хостинге с этим действительно могут быть проблемы
    PHP код:
    gettime() - 366 
    Решить проблему можно очень просто: синхронизация времени с сервером microsoft

  4. #4
    Аватар для Роуди.
    Пользователь

    Статус
    Оффлайн
    Регистрация
    31.07.2015
    Сообщений
    154
    Репутация:
    17 ±
    Цитата Сообщение от DeimoS Посмотреть сообщение
    1) Эмм, глобально:
    PHP код:
    new time_in_game[MAX_PLAYERS];//Как я понимаю, подсчёт времени для игроков идёт 
    В OnPlayerConnect или при авторизации:
    PHP код:
    time_in_game[playerid] = gettime(); 
    И пример вывода времени:
    PHP код:
    printf("Игрок с ID %d провёл в игре %d секунд"playeridgettime()-time_in_game[playerid]); 
    Ну а написать конвертер, который из секунд получит время, я думаю, не составит труда.

     Ну а если составит, то вот, например:
    PHP код:
    stock ConvertSeconds(conv_time, &conv_hour, &conv_minute,&conv_second)
    {
        if(
    conv_time <= 60)
        {
            
    conv_hour 0;
            
    conv_minute 0;
            
    conv_second conv_time;
        }
        else if(
    conv_time 60 && conv_time 3600)
        {
            
    conv_hour 0;
            
    conv_minute conv_time 60;
            
    conv_second floatround(conv_time 60floatround_tozero);
        }
        else if(
    conv_time == 3600){ conv_hour 1conv_minute 0conv_second 0; }
        else if(
    conv_time 3600)
        {
            new 
    conv_minute_int;
            
    conv_hour conv_time 3600;
            
    minutes_int floatround(conv_time 3600floatround_tozero);
            
    conv_minute conv_minute_int 60;
            
    conv_second floatround(conv_minute_int 60floatround_tozero);
        }
        return 
    1;

    Использование:
    PHP код:
    new hour_in_game,
        
    minute_in_game,
        
    seconds_in_game;

    ConvertSeconds(gettime()-time_in_game[playerid], hour_in_gameminute_in_gameseconds_in_game);
    printf("Игрок с ID %d провёл в игре %d часов, %d минут и %d секунд"playeridhour_in_gameminute_in_gameseconds_in_game); 


     Ну и вариант на pVar, который я давно писал для одного из пользователей форума
    В начало мода
    PHP код:
    #define ShowTimeOfPlayerInGame(%0,%1,%2,%3) ConvertSeconds(gettime() - GetPVarInt(%0, "Time Of Player In Game"), %1, %2, %3) 
    В OnPlayerConnect
    PHP код:
    SetPVarInt(playerid"Time Of Player In Game"gettime()); 
    После новую функцию для конвертации секунд в формат "час/минута/секунда"
    PHP код:
    stock ConvertSeconds(conv_time, &conv_hour, &conv_minute,&conv_second)
    {
        if(
    conv_time <= 60)
        {
            
    conv_hour 0;
            
    conv_minute 0;
            
    conv_second conv_time;
        }
        else if(
    conv_time 60 && conv_time 3600)
        {
            
    conv_hour 0;
            
    conv_minute conv_time 60;
            
    conv_second floatround(conv_time 60floatround_tozero);
        }
        else if(
    conv_time == 3600){ conv_hour 1conv_minute 0conv_second 0; }
        else if(
    conv_time 3600)
        {
            new 
    conv_minute_int;
            
    conv_hour conv_time 3600;
            
    minutes_int floatround(conv_time 3600floatround_tozero);
            
    conv_minute conv_minute_int 60;
            
    conv_second floatround(conv_minute_int 60floatround_tozero);
        }
        return 
    1;

    И пример вывода времени:
    PHP код:
    new hour_in_game,
        
    minute_in_game,
        
    seconds_in_game;

    ShowTimeOfPlayerInGame(playeridhour_in_gameminute_in_gameseconds_in_game);
    printf("Игрок с ID %d провёл в игре %d часов, %d минут и %d секунд"playeridhour_in_gameminute_in_gameseconds_in_game); 


    2) Не совсем понял чего Вы хотите... Зачем отнимать 366 от gettime и потом опять что-то приплюсовывать? О_о gettime и так должен возвращать нормальное время. На компьютере время установлено верное? Функция gettime снимает показания именно с настроек машины, на которой запущен сервер
    логи выдают 2016-01-07 07:01:16, а у меня на компьютере 18:04( -1 мск )
    Как быть?
    Последний раз редактировалось Роуди.; 07.01.2016 в 18:06.

  5. #5
    Аватар для ziggi
    Проверенный

    Статус
    Оффлайн
    Регистрация
    14.05.2015
    Сообщений
    1,181
    Репутация:
    790 ±
    mxDate ошибочно определяет время, я портировал функции gmtime и mktime из ОС Minix в Pawn, пользуйся ими: https://github.com/Open-GTO/time_t
    P.S. gettime() возвращает UTC время.

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

    Статус
    Оффлайн
    Регистрация
    31.07.2015
    Сообщений
    154
    Репутация:
    17 ±
    Это, тему можно закрыть, спасибо

 

 

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

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

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

Ваши права

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