Просмотр полной версии : [Вопрос] Время в игре / gettime ()
Вечер в хату, скриптёры :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) Эмм, глобально:
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
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 мск )
Как быть?
mxDate ошибочно определяет время, я портировал функции gmtime и mktime из ОС Minix в Pawn, пользуйся ими: https://github.com/Open-GTO/time_t
P.S. gettime() возвращает UTC время.
Это, тему можно закрыть, спасибо
Powered by vBulletin® Version 4.2.0 Copyright © 2024 vBulletin Solutions, Inc. All rights reserved. Перевод: zCarot