PDA

Просмотр полной версии : [Вопрос] Время в игре / gettime ()



Роуди.
07.01.2016, 17:30
Вечер в хату, скриптёры :D

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


1. Время в игре я получаю так: Создаю 3 глобальный переменые, которая отвечает за часы & минуты & секунды. Затем, в 1 секундном таймере прибавляю к second_in_game +1 и когда переменая будет равнятся нулю, то обнуляю ее и приплюсовываю minute_in_game, так же и с часом.
Если кто не понял, то прилагаю код.

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 от моего настоящего времени, запускаю на локалке )

сегоднящнее число получаю таким образом

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

Заранее спасибо за внимание.

DeimoS
07.01.2016, 17:50
1) Эмм, глобально:

new time_in_game[MAX_PLAYERS];//Как я понимаю, подсчёт времени для игроков идёт
В OnPlayerConnect или при авторизации:

time_in_game[playerid] = gettime();
И пример вывода времени:

printf("Игрок с ID %d провёл в игре %d секунд", playerid, gettime()-time_in_game[playerid]);
Ну а написать конвертер, который из секунд получит время, я думаю, не составит труда.


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 % 60, floatround_tozero);
}
else if(conv_time == 3600){ conv_hour = 1; conv_minute = 0; conv_second = 0; }
else if(conv_time > 3600)
{
new conv_minute_int;
conv_hour = conv_time / 3600;
minutes_int = floatround(conv_time % 3600, floatround_tozero);
conv_minute = conv_minute_int / 60;
conv_second = floatround(conv_minute_int % 60, floatround_tozero);
}
return 1;
}

Использование:

new hour_in_game,
minute_in_game,
seconds_in_game;

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

В начало мода

#define ShowTimeOfPlayerInGame(%0,%1,%2,%3) ConvertSeconds(gettime() - GetPVarInt(%0, "Time Of Player In Game"), %1, %2, %3)
В OnPlayerConnect

SetPVarInt(playerid, "Time Of Player In Game", gettime());
После новую функцию для конвертации секунд в формат "час/минута/секунда"

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 % 60, floatround_tozero);
}
else if(conv_time == 3600){ conv_hour = 1; conv_minute = 0; conv_second = 0; }
else if(conv_time > 3600)
{
new conv_minute_int;
conv_hour = conv_time / 3600;
minutes_int = floatround(conv_time % 3600, floatround_tozero);
conv_minute = conv_minute_int / 60;
conv_second = floatround(conv_minute_int % 60, floatround_tozero);
}
return 1;
}

И пример вывода времени:

new hour_in_game,
minute_in_game,
seconds_in_game;

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

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

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

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


1. Время в игре я получаю так: Создаю 3 глобальный переменые, которая отвечает за часы & минуты & секунды. Затем, в 1 секундном таймере прибавляю к second_in_game +1 и когда переменая будет равнятся нулю, то обнуляю ее и приплюсовываю minute_in_game, так же и с часом.
Если кто не понял, то прилагаю код.

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 от моего настоящего времени, запускаю на локалке )

сегоднящнее число получаю таким образом

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

Заранее спасибо за внимание.

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

На хостинге с этим действительно могут быть проблемы

gettime() - 366
Решить проблему можно очень просто: синхронизация времени с сервером microsoft

Роуди.
07.01.2016, 18:04
1) Эмм, глобально:

new time_in_game[MAX_PLAYERS];//Как я понимаю, подсчёт времени для игроков идёт
В OnPlayerConnect или при авторизации:

time_in_game[playerid] = gettime();
И пример вывода времени:

printf("Игрок с ID %d провёл в игре %d секунд", playerid, gettime()-time_in_game[playerid]);
Ну а написать конвертер, который из секунд получит время, я думаю, не составит труда.


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 % 60, floatround_tozero);
}
else if(conv_time == 3600){ conv_hour = 1; conv_minute = 0; conv_second = 0; }
else if(conv_time > 3600)
{
new conv_minute_int;
conv_hour = conv_time / 3600;
minutes_int = floatround(conv_time % 3600, floatround_tozero);
conv_minute = conv_minute_int / 60;
conv_second = floatround(conv_minute_int % 60, floatround_tozero);
}
return 1;
}

Использование:

new hour_in_game,
minute_in_game,
seconds_in_game;

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

В начало мода

#define ShowTimeOfPlayerInGame(%0,%1,%2,%3) ConvertSeconds(gettime() - GetPVarInt(%0, "Time Of Player In Game"), %1, %2, %3)
В OnPlayerConnect

SetPVarInt(playerid, "Time Of Player In Game", gettime());
После новую функцию для конвертации секунд в формат "час/минута/секунда"

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 % 60, floatround_tozero);
}
else if(conv_time == 3600){ conv_hour = 1; conv_minute = 0; conv_second = 0; }
else if(conv_time > 3600)
{
new conv_minute_int;
conv_hour = conv_time / 3600;
minutes_int = floatround(conv_time % 3600, floatround_tozero);
conv_minute = conv_minute_int / 60;
conv_second = floatround(conv_minute_int % 60, floatround_tozero);
}
return 1;
}

И пример вывода времени:

new hour_in_game,
minute_in_game,
seconds_in_game;

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

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

логи выдают 2016-01-07 07:01:16, а у меня на компьютере 18:04( -1 мск )
Как быть?

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

Роуди.
09.01.2016, 23:53
Это, тему можно закрыть, спасибо