BorizzK

Задержка/таймаут при входе игрока на сервер

19 сообщений в этой теме

Нашел где и как она задается

 

Файл MissionServer.c

 

Функция

void OnPreloadEvent(PlayerIdentity identity, out bool useDB, out vector pos, out float yaw, out int queueTime)

 

Вызывается по эвенту PreloadEventTypeID: - при подключении игрока и постановке его в очередь

 

Она возвращает queueTime в которой и будут те самые 15 сек

Тк он возвращается пустой, сервер использует значение по умолчанию

Если внутри функции изменить значение

queueTime = 5;

то будет нужное Вам время

 

Соответственно переопределяем эту функцию в init.c или Вашем файле миссии в моде (или нет)

 

	override void OnPreloadEvent(PlayerIdentity identity, out bool useDB, out vector pos, out float yaw, out int queueTime)
	{
		if (GetHive())
		{
			// Preload data on client by character from database
			useDB = true;
			queueTime = 1; //Делаем 1 сек
		}
		else
		{
			// Preload data on client without database //Вот это я не понял зачем
			useDB = false;
			pos = "1189.3 0.0 5392.48";
			yaw = 0;
			queueTime = 1; //Делаем 1 сек
		}
	}

Делаем 1 сек

 

Вуаля...

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
Забронировать это рекламное место


Я у себя сделал просто

в server.cfg создал параметр по аналогии respawnTime

spawnTime = 5;

 

И в переопределенной функции OnPreloadEvent его читаю и присваиваю queueTime

if (GetGame().ServerConfigGetInt("spawnTime"))

{

      queueTime = GetGame().ServerConfigGetInt("spawnTime");

}

 

Изменено пользователем BorizzK (история изменений)

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
В 19.12.2018 в 19:35, BorizzK сказал:

Я у себя сделал просто

в server.cfg создал параметр по аналогии respawnTime

spawnTime = 5;

 

И в переопределенной функции OnPreloadEvent его читаю и присваиваю queueTime

if (GetGame().ServerConfigGetInt("spawnTime"))

{

      queueTime = GetGame().ServerConfigGetInt("spawnTime");

}

 

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

Неужели нельзя полноценно написать ? 

1) в serverDZ.cfg вписываем это :

respawnTime = 1;

spawnTime = 1;

2) идем по пути DayZServer\mpmissions\dayzOffline.chernarusplus открываем файл init.c находим такой то раздел и вписываем то то ( я бы написал но сам нихера не понял,

( куда это вписать?)

if (GetGame().ServerConfigGetInt("spawnTime"))

{

      queueTime = GetGame().ServerConfigGetInt("spawnTime");

}

3) а здесь можно уже расписать как работает скрипт и свои умозаключения! 

Спасибо гайд супер , два часа пляски с бубном обеспечены!

Изменено пользователем Altair (история изменений)

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

А можно просто не ломать себе голову и поправит цифарку в xml-файле
Безымянный.png

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

123new 

Я еще исходил из того что можно менять время на лету из моей админки

Допиливаю ее

Выложу в ближайшее время

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
В ‎19‎.‎12‎.‎2018 в 12:35, BorizzK сказал:

Я у себя сделал просто

в server.cfg создал параметр по аналогии respawnTime

spawnTime = 5;

 

И в переопределенной функции OnPreloadEvent его читаю и присваиваю queueTime

if (GetGame().ServerConfigGetInt("spawnTime"))

{

      queueTime = GetGame().ServerConfigGetInt("spawnTime");

}

 

Извиняюсь а можно поподробнее как это сделать А то мои познания в скриптинге равны нулю

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

PJIIOxa 

 

В init.c в классе миссии
который class CustomMission : MissionServer

 

вот в нем добавил функцию (она переопределяет штатную)

 

	override void OnPreloadEvent(PlayerIdentity identity, out bool useDB, out vector pos, out float yaw, out int queueTime)
	{
		//Читаем spqwn time из конфига сервера
        if (GetGame().ServerConfigGetInt("spawnTime") > 0)
		{
			queueTime = GetGame().ServerConfigGetInt("spawnTime");
		}

		if (GetHive())
		{
			// Preload data on client by character from database
			useDB = true;
		}
		else
		{
			// Preload data on client without database //Вот это я не понял зачем
			useDB = false;
			pos = "1189.3 0.0 5392.48";
			yaw = 0;
		}
	}

и в конфиге сервера добавляем параметр spawnTime
типа

spawnTime = 5;

 

Теперь при входе в функции будет считан параметр из конфига и установлено время указанное в конфиге

 

если установить 0 то время queueTime сервер установит в дефолт - 15 сек
потому я сделал проверку GetGame().ServerConfigGetInt("spawnTime") > 0

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

вот сделал проще скопировать папку scripts в дирикторию сервера, файл модифийированный не заменяет оригинальный файл missionServer_modded.c

 

Пожалуйста, Войдите или Зарегистрируйтесь, чтобы увидеть это: Вложение.

Изменено пользователем PJIIOxa (история изменений)

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

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

Я имею в виду есть ли практический смысл это делать, кроме сокращения времени ожидания для игрока? 15 секунд - ну не такой уж срок, чтоб только ради этого морочиться?..

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

VIRrusR ну пока вы ждете 15 секунд ваш персонаж уже находится в игре и стоит ждет пока вы дождетесь отсчета в это время вас могут еб…...ть

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

VIRrusR От дюперства задержка при выходе
Да и не работает вроде как дюперство сейчас

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
6 минут назад, BorizzK сказал:

VIRrusR От дюперства задержка при выходе
Да и не работает вроде как дюперство сейчас

работает, при неплановых рестартах и крашах сервера из-за разницы в сохранениях карты сервера и игроков

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
1 час назад, BorizzK сказал:

123new Но через входы-выходы не работает

само собой, так как помимо таймаута этого перс еще в бд лочится выходящий, и тебя чисто физически не пустит сама бд

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Создайте аккаунт или войдите в него для комментирования

Вы должны быть пользователем, чтобы оставить комментарий

Создать аккаунт

Зарегистрируйтесь для получения аккаунта. Это просто!


Зарегистрировать аккаунт

Войти

Уже зарегистрированы? Войдите здесь.


Войти сейчас

  • Похожие публикации

    • Автор: zra47
      Такая вот проблемка,2 комп подключен к роутеру wifi .пробросы портов делал что он ещё хочет не понимаю . Напрямую в локальной сети видит сервер.
    • Автор: BorizzK
      Есть игрок
      Есть его координаты X и Y
      Нужно получить координаты точки X1 и X2 на расстоянии 2м слева от игрока
       
      ...
      Угол (из GetOrientation()) мы знаем
       
      Те банально надо получить координаты точки на окружности зная угол, радиус и координаты центра окружности
       
      мне видится следующее решение
       
      float dist = 2;
      float A = player.GetOrientation()[0] - 45;
      float x1 = dist * Math.Cos(A);
      float y1 = dist * Math.Sin(A);
       
      vector finpos = Vector(player.GetPosition()[0] + x1, player.GetPosition()[1], player.GetPosition()[2] + y1);
       
      или я не прав?
       
      может в Math enscript'а есть готовая функция?
       
       
      Спасибо!
       
       
       
    • Автор: 123new
      Нам понадобится:
      1. Сервер DayZ Standalone (см. тему вот эту)
      2. Notepad++: бесплатно на оф. сайте
      3. Немного времени и настойчивости (обычно бывает в комплекте и так)
       
      И так, начинаем:
      1. Открываем блокнотом mpmissions\dayzOffline.chernarusplus\init.c
      P.S. Имя папки dayzOffline.chernarusplus у вас может отличаться, будьте внимательны
      2. В начале файла добавляем:
      static int time_repeat_info_players = 10; //in seconds static string file_name_info_players = "$profile:PlayersLogFile.txt"; static void WriteFile(string file_name, string text) { private FileHandle fhandle; if ( !FileExist(file_name) ) { fhandle = OpenFile(file_name, FileMode.WRITE); } else { fhandle = OpenFile(file_name, FileMode.APPEND); } if ( fhandle == 0 ) { Print("[#Запись_в_файл]: Не удалось открыть файл для записи: " + file_name); Print("[#Запись_в_файл]: [Запись]: " + text); return; } FPrintln(fhandle, text); CloseFile(fhandle); } static void WritePlayersInfo() { array<Man> players = new array<Man>; Man player; Man player_test; GetGame().GetPlayers( players ); if (players.Count() > 0) { if ( FileExist(file_name_info_players) ) { DeleteFile(file_name_info_players); } for ( int i = 0; i < players.Count(); ++i ) { player_test = players.Get(i); if( player_test ) { PlayerIdentity p_identity = player_test.GetIdentity(); private string coord_pl = player_test.GetPosition().ToString(); private string Name_P = p_identity.GetName(); private string UID_P = p_identity.GetPlainId(); WriteFile(file_name_info_players, "User name: " + Name_P + " UID: " + UID_P + " Coords: " + coord_pl); } } } else { if ( FileExist(file_name_info_players) ) { DeleteFile(file_name_info_players); } } } Где 'PlayersLogFile.txt' меняем на нужное вам имя файла, а в 'time_repeat_info_players' настраиваем время повтора проверки списка игроков для перезаписи файла
      3. Находим в файле блок 'void main()' и в его конце перед закрывающей '}', поумолчанию это строка
      weather.SetWindFunctionParams(0.1, 0.3, 50); добавляем ниже строку:
      GetGame().GetCallQueue(CALL_CATEGORY_GAMEPLAY).CallLater(WritePlayersInfo, (time_repeat_info_players * 1000), true); 4. Готово, если не допустили ошибок, при наличии хотя бы 1 игрока на сервере ваш файл с данными по игрокам будет присутствовать и заполняться информацией, а в случае их отсутствия удаляться.
    • Автор: BorizzK
      Вобщем в процессе работы сервера происходят рандомные динамические события и вместе с ними на карте спавнятся некоторые обьекты
      Если время их жизни истекает и настает время нового события и в радиусе видимости нет игроков обьекты удаляются с карты
      Но
      Если выключение корректно (запланированный рестарт например), вызов функции удаления происходит из деструктора класса
      Все отрабатывает
      Ошибок нет
      Но после рестарта некоторые обьекты на месте
      Тогда я замутил функцию-задержку с проверкой
       
      float TimeWait(Object object, float timeW) { float cTick = GetGame().GetTickTime() + timeW; while(object || GetGame().GetTickTime() < cTick ) { if ( GetGame().GetTickTime() >= cTick ) break; } return GetGame().GetTickTime(); } и вызываю ее
       
      if (object) tW = TimeWait(object, timeW); задержка реально происходит - делал ее 60 секунда да же
      НО! обьекты эти после рестарта опять на месте
       
      Пока придумал костыль - сохраняю в профиль сервера при каждом спавне координаты и тайпнеймы заспавленных обьектов и при запуске в конструкторе проверяю это место и грохаю обьекты по тайпнеймам - места безлюдные и открытые, лагерей и тп там быть не может - потому в принципе ничего лишнего туда попасть не может
      к тому же это полезно в случае крашей
       
      и все же
      почему обьекты не удаляются при завершении работы сервера?
       
    • Автор: SpiritWolf
      Подскажите, может, кто сталкивался с проблемой, когда используешь суицид, персонаж ресается в том же месте, с тем же лутом.
      При этом после нажатия суицида, персонаж перемещается за карту, а после релога дюпается в месте смерти.
       
      P.S Вот такую ошибочку после суицида в логе сервера выдает:
       
      20:17:58 Error in expression <died set [count dayz_died, _playerID];
      _newObject setVariable ["bodyName",_play>
      20:17:58   Error position: <_newObject setVariable ["bodyName",_play>
      20:17:58   Error Undefined variable in expression: _newobject
      20:17:58 File z\addons\dayz_server\compile\server_playerDied.sqf, line 29