Jump to content
Search In
  • More options...
Find results that contain...
Find results in...
  • Need help?

    Create a topic in the appropriate section
    Don't write everything in the chat!
  • Take a look at the marketplace

    There you can buy
    everything related to game servers
  • Don't want a ban?

    Please read our rules
    Don't disturb the order!
  • Sell or buy?

    Use services of the guarantor
    We will make your deal safe
dimquea

Получение реального времени + реальное время до рестарта.

Recommended Posts

 

Иногда может понадобиться использовать реальное время в скриптах. Но если в HiveExt.ini стоит static или тем более был внеплановый рестарт, получить его нереально.

 

Предлагаю вашему вниманию простой способ.

 

1) Открываем HiveExt.ini, если у вас не Type = Local, заменяем.

 

Открываем server_functions.sqf, ищем функцию server_timeSync.

2) В функции server_timeSync перед:

setDate _date;

добавляем:

_date set [3, 13];

где 13 время которое стояло в HiveExt.ini.

 

Теперь запросом:

_key = "CHILD:307:" call server_hiveReadWrite;

мы получим массив с реальной датой и верменем вида [год,месяц,день,час,минута].

 

Теперь реальное время до рестарта.

1) В самый конец server_functions.sqf добавляем:

private ["_key","_date","_rTime"];
_key = "CHILD:307:" call server_hiveReadWrite;
if((_key select 0) == "PASS") then {_date = _key select 1;_rTime = (((_date select 3)*60)+(_date select 4));};
{if(_rTime > _x)exitWith{_rTime=(240-(_rTime - _x));}}count[1260,1020,780,540,300,60];
rTime = _rTime;

где 240 время между рестартами, а [1260,1020,780,540,300,60] массив представляющий из себя время от полуночи до каждого рестарта. В моём случае время между рестартами 4 часа, а первый рестарт в 1:00.

 

2) В конец server_playerLogin.sqf добавляем:

(owner _playerObj) publicVariableClient "rTime";

 

Теперь на клиенте можно использовать rTime, в ней и будет находиться время до рестарта.

 
 
Особая благодарность F507DMT.
Edited by dimquea (see edit history)

Share this post


Link to post
Share on other sites



Ухх! Вообще красавчик! +++ Тебе)

Share this post


Link to post
Share on other sites

Share this post


Link to post
Share on other sites

Как я понял можно в дебаг мониторе прикрутить или в своем худе так ?

Share this post


Link to post
Share on other sites
 

Как я понял можно в дебаг мониторе прикрутить или в своем худе так ?

для этого и делалось.

Share this post


Link to post
Share on other sites

а чем шедулер не устроил для рестарта?

Share this post


Link to post
Share on other sites

а чем шедулер не устроил для рестарта?

ТЫ описание читай для чего это.

Share this post


Link to post
Share on other sites

 

а чем шедулер не устроил для рестарта?

Ты вообще читаешь описание? Там как бы ясно сказано, что игрок будет видеть всегда сколько времени до рестарта осталось, шедулер свою работу сделает, ТВ об этом не волнуйся

Share this post


Link to post
Share on other sites

 

Ты вообще читаешь описание? Там как бы ясно сказано, что игрок будет видеть всегда сколько времени до рестарта осталось, шедулер свою работу сделает, ТВ об этом не волнуйся

время до рестарта один из вариантов использования.

Share this post


Link to post
Share on other sites

Кто придумал как использовать данную вешь на дебаг мониторе имея статичную цифру которая не меняется в следующих ситуациях: игрок умер-перезашел, игрок просто перезашел, игрок покинул игру-через час вернулся-цифра та что была на старте серва?

Share this post


Link to post
Share on other sites

Кто придумал как использовать данную вешь на дебаг мониторе имея статичную цифру которая не меняется в следующих ситуациях: игрок умер-перезашел, игрок просто перезашел, игрок покинул игру-через час вернулся-цифра та что была на старте серва?

у тебя в дебаг мониторе что то типо:

_time = ((240-serverTime)/60)

меняешь 240 на rTime и всё.

вермя вычисляется один раз, при старте сервера. кладётся в rTime и больше с ней ничего не происходит. она только передаётся каждому клиенту при подключении.

Edited by dimquea (see edit history)

Share this post


Link to post
Share on other sites

сделал так:

_time = (round(rTimes-(serverTime)/60));

врет на 2 минуты.

реально же получить более менее точное время с погрешностью 5 сек? учитывая время потраченное на ожидание ответа от сервера

2 старт серва, врет уже на 4 минуты

Edited by svalom (see edit history)

Share this post


Link to post
Share on other sites
"PVDZE_CallBack" addPublicVariableEventHandler {
	private ["_action","_playerObj"];
	_action = ((_this select 1) select 0);
	_playerObj = ((_this select 1) select 1);
	if(_action == '98247') then {
		_results = call compile ('LogWrite' callExtension 'time');
		//_results = call compile ('extDB2' callExtension '9:TIME:4');
		_dates = _results select 0;
		_rMin = (((_dates select 0)*60)+(_dates select 1));
		_rSec = (((_rMin)*60)+(_dates select 2));
		{
			if(_rSec > _x) exitWith{
				_rSec=(10800-(_rSec - _x));
			};
		}count[75600,64800,54000,43200,32400,21600,10800,0];
		rTimes = _rSec;
		(owner _playerObj) publicVariableClient "rTimes";
	};
};
// server_functions.sqf

дебаг

if (isnil "locdb") then { locdb = 0; };
if (locdb == 0) then{
	locdb = 1;
	_SP_ddos=serverTime; // засекам аптайм сервера
	_SP_start = diag_tickTime; // засекаем время выполнения запроса на сервер
	PVDZE_CallBack = ['98247',player]; publicVariableServer 'PVDZE_CallBack'; // собственно запрос
	waitUntil {!isNil 'rTimes'}; // ожидаем ответ от сервера
	rTimes=((rTimes)-((diag_tickTime)-(_SP_start))); // получили ответ, вычитаем время потраченное на запрос
	_SP_start=nil; // уже не нужна
	while {locdb == 1} do 
	{
		_SP_ddas=((serverTime)-(_SP_ddos)); // вычитаем засеченный аптайм из текущего
		_SP_ddas=(rTimes-(_SP_ddas)); // выясняем сколько времени осталось
		_SP_ddas=floor(_SP_ddas/60)+1; // преобразуем секунды в минуты
		hintSilent parseText format ["<t size='2'>До рестарта %1 мин</t>",_SP_ddas]; // дебаг. 
		sleep 1;
	};
}else{
	hintSilent '';
	locdb = 0;
};
// на локалке без погрешностей, тютелька в тютельку по сек стрелке.
// собственно для этого нужна сторонняя библиотека для получения времени с секундами, тк стандартный hiveext возвращает только минуту CHILD:307:[2015,7,2,21,43]
Edited by svalom (see edit history)

Share this post


Link to post
Share on other sites

Что получается, при загрузке дебага спрашуем серв на количество оставшихся секунд до рестарта. Получив ответ преобразуем его, используя serverTime как более менее адекватную функцию для замера временного промежутка, выдаем то что получилось на дебаг, попутно блокируем/ закрываем инвертарь (closeDialog 0), насильно синхронизируем клиента с сервером за минуту до рестарта ) либо просто шлем endMission 'END1' ) 

Share this post


Link to post
Share on other sites

Серверный скрипт:

Private ["_restarts", "_date", "_hour", "_minute", "_minuteToRestart", "_hourToRestart", "_renew"];
_restarts = [2,6,10,14,18,22]; // Часы рестартов, от меньшего к большему!
_renew    = 61;
while {true} do
    {
        _date            = "ultima_kickall" callExtension "1";
        _date            = toArray _date;
        _minute          = parseNumber(toString(_date select 3) + toString(_date select 4));
        if (_renew != _minute) then
            {
               _renew           = _minute;
               _hour            = parseNumber(toString(_date select 0) + toString(_date select 1));
               _minuteToRestart = 60 - _minute;
               _hourToRestart   = -1;
              {
                  if (_x > _hour) exitWith
                      {_hourToRestart = _x - _hour;};
              } forEach _restarts;
              if (_hourToRestart == -1) then
                  {_hourToRestart = (_restart select 0) + 23 - _hour;};
              missionNamespace setVariable ["RestatrTime", str(_hourToRestart) + ":" + str(_minuteToRestart)];
            };
       uiSleep 30;
    };

Где то на клиенте, в диалоге, или в дебаг мониторе:

_restartTime = missionNamespace getVariable "RestatrTime"; 

...Выводим _restartTime

Edited by NoNameUltima (see edit history)

Share this post


Link to post
Share on other sites

Я, конечно, понимаю, NONAMEULTIMA - хорошо владеешь языками программирования, всё такое... Но многие далеки от этого. И времени/желания на изучение не имеют. Нельзя ли подробнее, как подключить этот серверный скрипт? А то, что на твоём сайте, что тут - без разъяснений.

Это понятно, что создать *.sqf, скопировать в него код, подключить в server_functions.sqf (?), но как - не ясно.

Share this post


Link to post
Share on other sites

Я, конечно, понимаю, NONAMEULTIMA - хорошо владеешь языками программирования, всё такое... Но многие далеки от этого. И времени/желания на изучение не имеют. Нельзя ли подробнее, как подключить этот серверный скрипт? А то, что на твоём сайте, что тут - без разъяснений.

Это понятно, что создать *.sqf, скопировать в него код, подключить в server_functions.sqf (?), но как - не ясно.

Эмм... ничего что есть готовая тема с его DLL и скриптом для рестартов? Принцип тут будет тот же, но с другой SQF. DLL та же.

 

http://rnrportal.ru/forum/index.php?/topic/178-%D0%BA%D0%B8%D0%BA-%D0%B2%D1%81%D0%B5%D1%85-%D0%B8%D0%B3%D1%80%D0%BE%D0%BA%D0%BE%D0%B2-%D1%81-%D1%81%D0%B5%D1%80%D0%B2%D0%B5%D1%80%D0%B0-%D0%B2-%D0%B7%D0%B0%D0%B4%D0%B0%D0%BD%D0%BD%D0%BE%D0%B5-%D0%B2%D1%80%D0%B5%D0%BC%D1%8F/

 

Методы подключения файлов: exeVM, preprocessFile. У меня же отдельный init создан в серверной части и там все переподключено. Крч перемалол все по своему.

Share this post


Link to post
Share on other sites

Я, конечно, понимаю, NONAMEULTIMA - хорошо владеешь языками программирования, всё такое... Но многие далеки от этого. И времени/желания на изучение не имеют. Нельзя ли подробнее, как подключить этот серверный скрипт? А то, что на твоём сайте, что тут - без разъяснений.

Это понятно, что создать *.sqf, скопировать в него код, подключить в server_functions.sqf (?), но как - не ясно.

 

Private ["_restarts", "_date", "_hour", "_minute", "_minuteToRestart", "_hourToRestart", "_renew", "_time"];
_restarts    =    [2, 6, 10, 14, 18, 22];    // Часы рестартов, от меньшего к большему!
_renew        =    61;
while {true} do
    {
        _date    =    "ultima_kickall" callExtension "1";
        _date    =    toArray _date;
        _minute  =    parseNumber(toString[(_date select 3)] + toString[(_date select 4)]);
        if (_renew != _minute) then
            {
                if (_minute    !=    0) then
                    {_minuteToRestart    =    60 - _minute;}
                else
                    {_minuteToRestart    =    0;};
                if (_minuteToRestart < 10) then
                    {_minuteToRestart    =    "0" + str(_minuteToRestart)}
                else
                    {_minuteToRestart    =    str(_minuteToRestart)};
                _renew           =    _minute;
                _hour            =    parseNumber(toString[(_date select 0)] + toString[(_date select 1)]);
                _hourToRestart   =    -1;
                {
                    if (_x > _hour) exitWith
                        {_hourToRestart    =    (_x - _hour - 1);};
                } forEach _restarts;
                if (_hourToRestart == -1) then
                    {_hourToRestart    =    (_restarts select 0) + 23 - _hour;};
                if (_minute == 0) then
                    {_hourToRestart    =    _hourToRestart + 1};
                _hourToRestart    =    "0" + str(_hourToRestart);
                _time    =    (_hourToRestart + ":" + _minuteToRestart);
                {
                    _x setVariable ["Ultima_Time", _time, true];
                } forEach playableUnits;
            };
        uiSleep 30;
    };
 

подключать -

 

execVM "имя_скрипта.sqf";

В миссии у игрока(или в дебаг мониторе) получать значение времени так:

 

_time_to_restart = player getVariable ["Ultima_Time", "00:00"];

 

в переменной _time_to_restart будет реальное время до рестарта.

 

P.S. ну и не забываем скачать саму dll

ссылка дана выше.

Edited by NoNameUltima (see edit history)

Share this post


Link to post
Share on other sites

 

execVM "имя_скрипта.sqf";

Вот теперь всё предельно ясно, даже для чайника) Спасибо

Но и небольшой вопрос ещё. Полночь прописать в _restarts, как 0 или 24? Или разницы нет?

Edited by Alexandr116ru (see edit history)

Share this post


Link to post
Share on other sites

Вот теперь всё предельно ясно, даже для чайника) Спасибо

Но и небольшой вопрос ещё. Полночь прописать в _restarts, как 0 или 24? Или разницы нет?

0

Share this post


Link to post
Share on other sites

Офигительно!  :geek: 
Можно ж сделать так что бы нужные тебе вещи включались в нужное тебе время!
Например при помощи скрипта [MOST WANTED] Самый разыскиваемый сделать для игроков такую традицию как, например, игра в кошки-мышки на 6 часов вечера. То бишь при помощи определённых вещей поднять онлайн в нужное вам время ежедневно  :blink:  :good: 
Плюс  :cool:

Share this post


Link to post
Share on other sites

Офигительно!  :geek: 

Можно ж сделать так что бы нужные тебе вещи включались в нужное тебе время!

Например при помощи скрипта [MOST WANTED] Самый разыскиваемый сделать для игроков такую традицию как, например, игра в кошки-мышки на 6 часов вечера. То бишь при помощи определённых вещей поднять онлайн в нужное вам время ежедневно  :blink:  :good: 

Плюс  :cool:

Для этого достаточно так -

 

 _date    =    "ultima_kickall" callExtension "1";

 

 

в _date будет дата и время с компа.

Share this post


Link to post
Share on other sites

Для этого достаточно так -

 

 _date    =    "ultima_kickall" callExtension "1";

 

 

в _date будет дата и время с компа.

Уже читал тему на твоём сайте. Да  :good:

Share this post


Link to post
Share on other sites

Как сделать что бы с рестартом была вероятность в процентном соотношении включения ночи или же дня после рестарта?

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now

  • Similar Content

    • By Makliion
      Всем добрый вечер..
      У меня такой вопрос где найти или заказать скрипт для обыска зомбей & игроков 
      что-бы каждую вещь снимать через действие а не тупо через таб
      Шлем отдельно
      Рюкзак отдельно
      ну и на все остальные слоты
      искал долго не нашёл ничего
      есть мод на обыск но он просто открывает  инвентарь и все 
       
    • By Troy1
      Всем привет. Подскжите ну или помогите пожалуйста решить вопрос.
      Вопрос звучит так. На сервере есть трейдер зоны и базы игроков. 
      Если в течение определённого времени, на пример 1 - 2 часа с машиной не кто не взаимодействует и машина не находится в зоне трейдера или на теретории базы, то машина отлетает в гараж или на штраф стоянку.
      На сервере используется TraderPlus.
       
      Есть такие решения у кого?
      За ранние благодарю.
    • By Troy1
      Всем привет. Подскжите ну или помогите пожалуйста решить вопрос.
      Вопрос звучит так. Нужно сделать так, что бы на всей карте был запрет на строительство. 
      Если нужно построить например базу с палатками, то нужно установить верстак или флаг, который установит зону для строительства с радиусом примерно 20-25 метров от центра и желательно что бы зона была квадратной.
      Есть такие решения у кого?
      За ранние благодарю.
    • By BR0wi
      Подскажите где найти людей, которые делаю моды на заказ. К кому вообще обращаться? Или что бы реализовать свои идеи нужно самому "год" сидеть и изучать все механики модинга?
    • By CubeIn
      Приветствую господа, хочу создать новый проект, уникальный, но для этого нужен маппер.
      Я оставлю здесь свой дискрод, напишите в лс, кто готов взяться за крупный проект.
      4me#4542
  • Our picks

×
×
  • Create New...

Important Information

By using this site, you automaticly agree to our Guidelines and Privacy Policy.
We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.