Перейти к публикации
Поиск в
  • Дополнительно...
Искать результаты, содержащие...
Искать результаты в...
  • Нужна помощь?

    Создайте тему в соответствующем разделе
    Не нужно писать всё в чат!
  • Загляните на торговую площадку

    Там вы можете купить
    всё что касается игровых серверов
  • Не хотите бан?

    Пожалуйста, ознакомьтесь с нашими правилами
    Не нарушайте порядок!
  • Продаёте или покупаете?

    Пользуйтесь услугами гаранта
    Мы сделаем вашу сделку безопасной
123new

DayZ Standalone v0.62.142963 Server Files + рабочий респавн персонажа и лута

Рекомендованные сообщения

16 часов назад, BorizzK сказал:

123new Все сделал точно так как ты написал - вынес файл в папку миссии и изменил путь в init_newBody.sqf

Сам попробуй

 

некогда тестить пока

 

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


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

+ начал думать на тему - перед заданием координат спавна (выбора координат) нового игрока, не полохо было бы проверить, а нет ли кого рядом, и, если есть, то повторить выбор еще раз, что бы новый игрок не спавнился рядом с другим игроком

так то реально сделать по аналогу принципа с авто, что уже сделано. Только опять же рискуем отсеять все координаты, в итоге ни одна не выберется и краш.

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


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

Кстати, возник еще один вопрос

Есть ли возможность получать на стороне сервера содержимое чата и/или сообщений игроков в чате?

 

 

не встречал таких возможностей. Впрочем, а нахрена, если чат по дефолту логируется с dart + bec или хотя бы в логах adm ?

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


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

 

123new 

4 минуты назад, 123new сказал:

так то реально сделать по аналогу принципа с авто, что уже сделано. Только опять же рискуем отсеять все координаты, в итоге ни одна не выберется и краш.

При наличии 70-100 точек спавна и макс кол-ве игроков до 60?

 

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

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


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

123new 

4 минуты назад, 123new сказал:

не встречал таких возможностей. Впрочем, а нахрена, если чат по дефолту логируется с dart + bec или хотя бы в логах adm ?

 

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

 

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


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

 

123new 

При наличии 70-100 точек спавна и макс кол-ве игроков до 60?

 

ну если эти точки спавна в 15 метрах друг от друга будут, то вполне вероятно и такое

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


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

123new 

 

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

 

увы, но весь чат в игре обрабатывается на энскрипте + самим кодом exe файла игры (кто хочет убедиться найдите исходники 45 патча и сами изучите). Скриптовых возможностей в играх богемии такого рода не встречал. Соответственно единственный вариант - создать свой чат взамен того что есть в игре поумолчанию, и уже в нем назначать действия. В отсутствие возможности создать диалоговое окно средствами sqf это весьма проблемотично.

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


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

В общем, обновил сборку в теме и информацию в первом сообщении темы скорректировал.

В сборке обновил:

1. Система сохранений стоит обновленная от benwood (ранее выкладывал тестовую миссию сервеар с ней, это она)

2. Добавлен мой переписанный скрипт по спавну и респавну машин (выше вчера выкладывал)

3. Добавлены скрипты и наработки от BorizzK в отдельной папке (не активированы, по некоторым добавил описание в них)

4. Добавлены 2 мелких скрипта о выводе в чат информации о кол-ве игроков в чат и объявлений в чат (MOTD). Настройки внутри самих скриптов. (спасибо BorizzK )

5. Добавлена возможность отключать систему сохранения персонажей на сервере (будет удобно для PVP серверов)

6. Немного переписана система миссии сервера, теперь вместо scripts/init.sqf в наличии scripts/compiles.sqf + убраны неиспользуемые скрипты и папки, за исключением новых приложенных.

7. BEC в папке !Other_from_server заменен на один, проверенный, в котором объявления  в чат и рестарты работают.

 

старая миссия сервера запакована в архив old_dayz_Auto.ChernarusPlus и приложена в сборке.

 

если кому надо, отдельно прикладываю миссию сервера со своей обновленной сборки: http://rgho.st/8PXQyvxCf

 

 

Вот это круто

DZ_TIME_DELETE_DEAD_PLAYER = 1800; :smile:

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


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

BorizzK чтоб залутать успевалии))

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


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

Делюсь сегодняшними изысканиями (+ внес изменения):

 

1.

Сделал в начале входа в dbLoadPlayer.sqf от 123new отключение звука и затемнение экрана. Теперь как при родном входе на оф серверах.

 

В начале файла

      0 fadeSound 0.0;
      0 fadeSpeech 0.0;
      0 fadeRadio 0.0;

понизить звук до 0.0 в течение 0 секунд

+ затемнение экрана setEVUser 5;

 

Затем по завершению цикла ожидания

      1 fadeSound 1;
      1 fadeSpeech 1;
      1 fadeRadio 1;

повысить звук до 1 в течение 1 секунд

и убираем затемнение setEVUser 0;

 

 (время  в течение которого меняем звук до нужно уровня относительно текущего - команда  - уровень звука от 0 до 1 )

 

_clientNew =
{
	private "_agent";

	_uid 		= getClientUID _id;
	_savedChar 	= _uid call fnc_dbFindInProfile;
	_isAlive 	= _savedChar select 0;
	_pos 		= _savedChar select 2;
	
	//Fade screen and sounds for client.
	[_id] spawnForClient {
			0 fadeSound 0.0;
			0 fadeSpeech 0.0;
			0 fadeRadio 0.0; 
			setEVUser -5;
	};
	
	diag_log format["CONNECTION: _id: %1 _uid: %2 _name: %3",_id,_uid,_name];
	
	if (DZ_Enable_Login_Disconnect_Messages) then
	{
		{
			[_x, format["Player %1 connected to server",_name], "colorStatusChannel"] call fnc_playerMessage;
		} foreach players;
	};

	if (DZ_TIME_WAITING_SPAWN_PLAYER > 0) then 
	{
			[_id,DZ_TIME_WAITING_SPAWN_PLAYER] spawnForClient {
			
					sTIMER = _this select 1;
					
					null = [] spawn {while {sTIMER > -1} do {setEVUser -5}};
					
					disableUserInput true;
					
					while {sTIMER > -1} do {
						titleText[format["Spawning in %1 seconds... Please wait...",sTIMER],"BLACK",10e10];
						sTIMER = sTIMER - 1;
						sleep 1;	
					};

					disableUserInput false;	

					titleText["Spawning...","PLAIN",10e10];
					//unfading sound
					1 fadeSound 1;
					1 fadeSpeech 1;
					1 fadeRadio 1; 
					//Force to unfade screen
					setEVUser 0;
				};
	};
	
	//CUSTOM
	if (!isNil "DZ_PLAYER_SAVE") then {
			if (DZ_PLAYER_SAVE) then {
				if (_isAlive) then {
					diag_log format["CONNECTION: Player save enabled by DZ_PLAYER_SAVE. Try to load saved profile."];
					[_id,_uid,_pos] call fnc_previousPlayer;
				} else {
					diag_log format["CONNECTION: Player save enabled by DZ_PLAYER_SAVE. Create new player becouse no saved profiles."];
					[_id,_uid] call fnc_newPlayer;
				};
			} else {
				diag_log format["CONNECTION: Player save disabled by DZ_PLAYER_SAVE. Create new player."];
				[_id,_uid] call fnc_newPlayer;
			};
	} else {
			if (_isAlive) then {[_id,_uid,_pos] call fnc_previousPlayer} else {[_id,_uid] call fnc_newPlayer};
	};

	//find agent
	{
		if ((name _x) == _name) then
		{
			_agent = _x;
		};
	} foreach players;

	diag_log format["CONNECTION: FOR PLAYER WITH UID %1 AND NAME %2 PROCEDURE CONNECT IS FINISHED! AGENT IS: %3",_uid,_name,_agent];
};

_clientRespawn = 
{

	_uid 	= getClientUID _id;
	
	diag_log format["RESPAWN: PLAYER WITH UID %1 PRESS RESPAWN BUTTON!",_uid];

	_vm = [_id,_uid,DZ_TIME_WAITING_RESPAWN_PLAYER] spawn 
	{
		_id 	= _this select 0; 
		_uid 	= _this select 1;
		_timer 	= _this select 2;

		_uid call fnc_dbDestroyProfile;

		connectedPlayers set [(connectedPlayers find _id), 0];
		
		if (_timer > 0) then {
			while {_timer > -1} do {
				[_id,_timer] spawnForClient {titleText[format["Respawning in %1 seconds... Please wait...",(_this select 1)],"PLAIN",10e10];};
				_timer = _timer - 1;
				sleep 1;
			};
		};
		
		sleep 1;
		
		//[_id] spawnForClient {titleText["Respawning...","BLACK",1];};
		[_id] spawnForClient {titleText["Respawning...","PLAIN",1];};
		
		[_id,_uid] call fnc_newPlayer;
		
		diag_log format["RESPAWN: PLAYER WITH UID %1 FINISH RESPAWN PLAYER!",_uid];
	};
	
};

_disconnectPlayer =
{
	_uid = getClientUID _id;
	diag_log format["DISCONNECT: PLAYER %2 WITH UID %1 PRESS DISCONNECT!",_uid,_name];
	_killed = [0,_uid,_agent] call dbSavePlayer;
	if (DZ_PLAYER_SAVE) then {
		if ( !_killed ) then {
			[1,_uid,_agent] call dbSavePlayer;
		};
	};
	
	_vm = [_agent,_id,_name,_queueTime,_killed,_uid,DZ_Enable_Login_Disconnect_Messages,DZ_TIME_EXIT_AGENT] spawn 
	{
		private ["_agent","_id","_uid","Enable_Login_Disconnect_Messages","TIME_EXIT_AGENT"];
		_agent = _this select 0;
		_id = _this select 1; 
		_name = _this select 2;
		_queueTime = _this select 3;
		_killed = _this select 4;
		_uid = _this select 5;
		Enable_Login_Disconnect_Messages = _this select 6;
		TIME_EXIT_AGENT = _this select 7;
		//_isDummy = _agent getVariable ["isDummy",false];
		
		if (Enable_Login_Disconnect_Messages) then
		{
			{
				[_x, format["Player %1 disconnected from server",_name], "colorStatusChannel"] call fnc_playerMessage;
			} foreach players;
		};
	
		diag_log format ["DISCONNECT: Player %1 name %2 UID %3 disconnected from server. Agent player exist in server and wait save if players save enabled!", _agent, _name, _uid];

		diag_log format ["SCHEDULER: Removing disconnecting clientId %1, name %2", _id, _name];		
		_freedPos = connectedPlayers find _id;

		if (_freedPos >= 0) then
		{
			connectedPlayers set [_freedPos,0];
			diag_log format ["SCHEDULER: Updated 'connected players' array %1", connectedPlayers];
		};

		if (isNull _agent) then
		{
			diag_log format ["SCHEDULER: Agent is null - disconnecting clientId %1, name %2", _id, _name];
		};		
				
		if (!isNull _agent) then
		{
			if (vehicle _agent != _agent) then
			{
				moveOut _agent;
			};
			sleep 1;
			_agent playAction "SitDown";
			if (TIME_EXIT_AGENT > 0) then {
				sleep TIME_EXIT_AGENT;
			};

			if (DZ_PLAYER_SAVE) then {
				_killed = [0,_uid,_agent] call dbSavePlayer;
				if ( !_killed ) then {
					[1,_uid,_agent] call dbSavePlayer;
				};
				if ((lifeState _agent == "ALIVE") and (not captive _agent)) then
				{
					_agent call dbSavePlayerPrep;
					_result = [_uid, _agent] call fnc_dbSaveToProfile;
					diag_log format ["DISCONNECT: Player %1 name %2 UID %3 SAVED server when him disconnect!", _agent, _name, _uid];	
				};
			} else {
				_uid call fnc_dbDestroyProfile;
				diag_log format ["DISCONNECT: Player %1 name %2 UID %3 ERASED when him disconnect!", _agent, _name, _uid];	
			};
		};
		
		if (!isNull _agent) then
		{
			endDisconnectPlayer [ _agent, _uid ];
		};
	};
};

	onPlayerConnecting _clientNew;
	onClientRespawn _clientRespawn;
	onPlayerDisconnected _disconnectPlayer;

 

2. Отображение происходящего после гибели (вместо черного экрана). В идеале это можно сделать в brain_player_client.fsm, но при выносе его в файл миссии он не работает

посему сделал так, и, получилось

 

в конце event_playerKilled.sqf (внес поправку - убрал setEVUser -5 в конце, тк если клиент зареспавнится быстрей чем отработает код, то может экран стать черным после респавна - код же до сих пор будет выполняться на клиенте)

[owner _agent,DZ_TIME_DELETE_DEAD_PLAYER] spawnForClient {
	titleText ["YOU ARE DEAD!","PLAIN",10];
	sleep 1;
	setEVUser -4;
	sleep 0.5;
	setEVUser -3;
	sleep 0.5;
	setEVUser -2;
	sleep 0.5;
	setEVUser -1;
	sleep 0.5;
	setEVUser 0;
	sleep 0.5;
	setEVUser 0;
	sleep 0.5;
	setEVUser 0;
};

 

Циклом заморачиваться не стал, лень было. Сделал тупо.

+ Нужно еще поиграться задержками.

Сначала экран конечно темнеет, но затем снова всё становится видно и можно наблюдать происходящее, как тебя лутают итд итп, пока не нажмешь respawn или exit или не истечет время удаления агента/трупа.

 

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

 

 

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

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


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

Внес изменения в предыдущий пост.

 

Нет ли у кого идей как:

 

1. Вызвать принудительный респавн (как нажатие кнопки RESPAWN клиентом)

2. Вызвать принудительный дисконнект (как нажатие кнопки EXIT клиентом)

 

???

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


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

BorizzK 2 легко делается отправкой комманды exitgame на клиентскую сторону игрока

респавн подразумеваю проще сделать биндом процедуры респавна на какую-нибудь функцию и автоматическим вызовом ее в событии смерти игрока.

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


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

123new 

exitgame - выполняется на клиенте или на сервере с указанием id/uid/agent клиента?

втупую exitgame делать опасно - рискуем выгнать из игры действующего игрока....

нужно проверять есть ли у игрока агент или нет (как?)- вдруг он зареспавнился... его id на сервере остается же прежним, пока он не вышел сам и не зашел заново (тогда его контекст сбрасывается, что на сервере, что на клиенте и создается заново)

То же и вызов респавна. Нужно проверить, не зареспавнился ли игрок самостоятельно (через кнопку), а то опять же рискуем зареспавнить действующего игрока в разгаре сражения.

 

 

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

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


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

123new 

exitgame - выполняется на клиенте или на сервере с указанием id/uid/agent клиента?

втупую exitgame делать опасно - рискуем выгнать из игры действующего игрока....

нужно проверять есть ли у игрока агент или нет (как?)- вдруг он зареспавнился... его id на сервере остается же прежним, пока он не вышел сам и не зашел заново (тогда его контекст сбрасывается, что на сервере, что на клиенте и создается заново)

То же и вызов респавна. Нужно проверить, не зареспавнился ли игрок самостоятельно (через кнопку), а то опять же рискуем зареспавнить действующего игрока в разгаре сражения.

 

 

пример

_id spawnForClient
{ 
  _wait = 10;
  while {_wait > 0} do
  {
  	titleText [format["Game has been closed after %1 secs.",_wait],"BLACK FADED"];
    _wait = _wait - 1;
    sleep 1;
  };
exitGame;
};

если сначала будешь проверять наличие agent на сервере (после смерти и event_player_killed сам agent как правило уже не управляется и  не принадлежит к id игрока), и в случае надобности выполнишь этот код, то должно получиться.

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

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


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

123new Смысл проверки таков

Вот выполнили мы этот код, а клиент уже переспавнился, те с сервера не вышел, привязался к новому агенту - это не гуд - мы выгоним с сервера игрока который снова играет.

В этом коде нужно проверить не переспавнился ли игрок.

Если не переспавнился до удаления агента, осуществить выход, тк после удаления агента кнопка респавн уже не работает и возможен только выход. Вот тогда и выгонять с сервера или принудительно респавнить - id же на сервере остается тот же до отключения/выхода.

 

Меня вот это заинтересовало в event_playerKilled.sqf

respawningPlayer = _agent getVariable["respawningPlayer",false];

 

Далее

После всех обработок в event_playerKilled.sqf

ниже

 

null = [_agent,DZ_TIME_DELETE_DEAD_PLAYER] spawn {
    sleep (_this select 1);
    deletevehicle (_this select 0);
 diag_log format ["Dead agent %1 player is deleted in timestamp %2!",(_this select 0), time];
};
 

Задержка до удаления агента

После удаления агента кнопка респавн уже не работает

 

 

 

 

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

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


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

BorizzK так в чем проблема? В процедуре создания игрока либо в событии смерти добавь Variable какой-нить контрольный да проверяй его. Например, дату отработки события записывай. на agent в случае смерти.

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


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

123new переменную какую? когда агент есть, можно присвоить переменную в его окружении и ее проверить, а когда агента нет?

Я думаю, насчет проверки типа

if (!isAlive)

if (!isDedicated)

итп...

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


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

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

 

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


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

123new Но если он не отключался, то _id остается прежний и код который выполнялся на клиенте, если не завершил работу (цикл там или ожидание), так и продолжает выполняться и если игрок переспавнится сам раньше, то вызов принудительного переспавна вызовет проблемы

 

определим процедуру переспавна в init

forceRespawnClinet = { compile ....... итд итп путь к sqf'ке}

для принудительного переспавна она будет принимать в качестве параметра _id клиента

 

_id определена раньше в event_playerKilled.sqf

переменная в init DZ_TIME_DELETE_DEAD_PLAYER = 30

 

null = [_agent,DZ_TIME_DELETE_DEAD_PLAYER] spawn {
    sleep (_this select 1);
    deletevehicle (_this select 0);
 diag_log format ["Dead agent %1 player is deleted in timestamp %2!",(_this select 0), time];

_id call forceRespawnClinet;
};

 

ждем 30 сек и грохаем агента

и сразу вызываем переспавн

НО!

Если клиент уже переспавнился сам? и у него такой же _id, то будет еще один переспавн этого же клиента, в тот момент когда он входит, воююет и тд итп

 

А если он вышел и вошел другой и у него _id такой же?

 

Вывод:

Перед вызовом _id call forceRespawnClinet; необходимо

1 Проверить - нет ли на сервере игрока с _id и uid и живым агентом, агента которого мы грохнули выше и если есть (значит переспавнился сам или вошел и получил такой же id) то процедуру не вызывать...

 

_id известен

UID получаем _CUID = getClientUID _id;

 

А вот как организовать проверку я теряюсь...

 

 

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

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


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

123new Но если он не отключался, то _id остается прежний и код который выполнялся на клиенте, если не завершил работу (цикл там или ожидание), так и продолжает выполняться и если игрок переспавнится сам раньше, то вызов принудительного переспавна вызовет проблемы

 

 

id в любом случае останется прежний у игрока до его момента переподключения и вне зависимости от нажатия на респавн.

А чтобы игрок вручную не жал переспавн ему опцию надо отключить тупо. Вот как только хз, не изучал.

Цитата

Вывод:

Перед вызовом _id call forceRespawnClinet; необходимо

1 Проверить - нет ли на сервере игрока с _id и uid и живым агентом, агента которого мы грохнули выше и если есть (значит переспавнился сам) то процедуру не вызывать...

 

Предположительно это можно сделать так

 

_id известен

UID получаем _CUID = getClientUID _id;

 

А вот как организовать проверку я теряюсь...

как раз перед вызовом респавна в блоке самого респавна проверку эту сделать можно, та же if (IsNul _agent) в помощь и GetPlayerUID в сравнение с GetVariable["UID",0] (задается каждому активному agent игрока и в случае смерти отвязывается)

 

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


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

123new 

if (IsNul _agent) - смысл? если респавн вручную доступен по уничтожению агента, при этом он перестанет работать при респавне из ванкунсии (агент-то уже есть), потому и проверку надо делать только в случае смерти.

И ручное отключение respawn делать не хотелось бы.

 

Нужно просто проверить после удаления агента - есть ли на сервере игрок с таким же id и uid и живым агентом (переспавнился) и не запущена ли уже другая процедура респавна для этого _id

 

 

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

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


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

123new 

if (IsNul _agent) - смысл? если респавн вручную доступен по уничтожению агента, при этом он перестанет работать при респавне из ванкунсии (агент-то уже есть), потому и проверку надо делать только в случае смерти.

 

не понимаю смысла вообще. В случае смерти у нас уже agent отвязан от id игрока
 

 

30 минут назад, BorizzK сказал:

Нужно просто проверить после удаления агента - есть ли на сервере игрок с таким же id и uid и живым агентом (переспавнился) и не запущена ли уже другая процедура респавна для этого _id

ну проверять "есть ли на сервере игрок с таким же id и uid" смысла нету, т.к. если он не отсоединился, а нажал респавн, он полюбому остался с теми же id и uid. И более того, в случае если автоматический респавн в случае смерти будет, id и uid в любом случае будут у него.
 

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


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

123new Это все нужно для того, что в конце event_playerKilled.sqf будет анимация смерти (камера сверху на убийцу или убитого (если застрелился и тп) на время ожидания удаления агента), после того как агент будет удален, клиенту будет отправлено сначала затемнение экрана, затем вызван принудительный респавн, если клиент не отключился.

Но, клиент должен иметь возможность нажать респавн самостоятельно, что бы не ждать завершения анимации.

И, если клиент сам нажал респавн, то если принудительно вызвать респавн для этого же _id, то игрок отреспавнится еще раз, те возникает коллизия.

потому и нужна проверка именно перед принудительным респавном - если на сервере игрок с таким же id и uid и живым агентом

можно конечно ее огранизовать и в процедуре принудительного респавна, но вот как?

 

далее надо получить агента по uid или id и проверить не запущена ли другая процедура респавна для этого _id  (вдруг по времени совпадет)

и если ничего не совпало респавнить...

 

Как мне сдалть такое? :

Если на сервере есть игрок с известным _id и _uid и живым агентом или для игрка с _id  и _uid запущена процедура респавна, то процедуру респавна не выполняем.

 

И вопрос про проверку пустоты массива

Если рядом в радиусе 5м никого нет  - _listMan = _pos nearObjects ["Man",5];

То в _listMan попадает []

_pos = _posArr select (floor random (count _posArr));
while {!isNil "_listMan"} do {
	_listMan = _pos nearObjects ["Man",5];
	_pos = _posArr select (floor random (count _posArr));
	diag_log format["INFO SPAWN SYSTEM: Change coordinates %1 for player %2, becouse players are nearby: %3.",_pos,_uid,_listMan];
};

Правильно?

 

 

 

 

 

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

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


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

BorizzK по вопросу - верно. По поводу:
 

Цитата

И, если клиент сам нажал респавн, то если принудительно вызвать респавн для этого же _id, то игрок отреспавнится еще раз, те возникает коллизия.

перед респавном в event_player_killed и в событии респавна проверку воткнуть по типу переменной на стороне клиента игры и true-false. И в случае если респавн уже вызван, повторно его не даст вызвать проверка по данной переменной.

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


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

123new обнаружил, что инициировать респавн необходимо на стороне клиента онли, те инициатива должна исходить от него

Те

[] spawnforplayer {

Тут команда нажатия кнопки потипу exitgame

}:

 

И только тогда у клиента сбрасывается сессия и на сервере происходит событие onRespawn по которому вызывается функция в dbloadplayer

 

Вызов процедуры респавна как в dbLoadPlayer ни к чему не приводит ни так ни эдак

 

 

 

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

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


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

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

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

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

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

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

Войти

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

Войти сейчас

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

    • Автор: Troy1
      Всем привет. пишу мод и столкнулся с проблемой в реализации.
      Суть: Пытаюсь сделать проверку, если игрок стоит прям у окна или у дверного проёма он должен получать урон.
      Делал вот так.
      int wallHits = 0; float d = 2.2; // Дистанция до стены. Если стена дальше — считаем, что там окно или проем. // 8 направлений "снежинкой" для проверки стен вокруг игрока // Используем Vector(x, y, z) для точности ref array<vector> checkDirs = { Vector(d,0,0), Vector(-d,0,0), Vector(0,0,d), Vector(0,0,-d), Vector(d,0,d), Vector(-d,0,-d), Vector(d,0,-d), Vector(-d,0,d) }; foreach (vector dir : checkDirs) { // Пускаем горизонтальные лучи от позиции игрока (from) if (DayZPhysics.RayCastBullet(from, from + dir, collisionLayerMask, this, hitObject, hitPosition, hitNormal, hitFraction)) { // ПРОВЕРКА: Это должна быть вертикальная стена (Y нормали < 0.5) // Чтобы не засчитать низкий потолок за стену if (Math.AbsFloat(hitNormal[1]) < 0.5) { wallHits++; } } } // УСЛОВИЕ БЕЗОПАСНОСТИ: // В комнате wallHits будет 6-8. У окна или в проеме — 1-4. if (wallHits < 5) { hasSafeCeiling = false; // Слишком открытое пространство (окно/дверь) } Пытался менять дистанции, но всё ровно не как не хочет работать.
      Что я делаю не так, или я вообще делаю не то?
      Мне нужно проверять игрока, в укрытии он или нет.
      С высотой я разобрался, а вот с боковыми лучами у меня траблы и не во всех помещениях работает как нужно.
      В некоторых помещениях вообще не работает, удаляешь строки проверки, начинает работать и то по высоте.
      Просто забегаешь по навес и игрок под защитой, так не должно быть.
      Помогите пожалуйста  решить задачу.
    • Автор: Troy1
      Всем привет. Суть в чём, пишу мод на событие и когда происходит событие, параллельно должна меняться скорость ветра, не могу понять как заставить скрипт управлять силой ветра. Понижать силу ветра получилось сделать, а вот повышать не как. Только после перезагрузки сервера сила ветра задаётся в нужном значение.
      Как сделать, что бы по вызову функции менялась сила ветра в большую или в меньшую сторону?
      protected void SetWind(float wind, float time) { if (!g_Game) return; Weather m_Weather = g_Game.GetWeather(); if (!m_Weather) return; m_Weather.SetWindMaximumSpeed(wind); m_Weather.SetWind(Vector(1/Math.Sqrt(3), 1/Math.Sqrt(3), 1/Math.Sqrt(3)) * wind); m_Weather.SetWindSpeed(wind); m_Weather.SetWindFunctionParams(1.0, 1.0, -1); } Это скрипт на понижение силы ветра.
      Работает понижение силы ветра в том случае, если до этого сила ветра была выше.
      Пример:
      Изначально на сервере сила ветра = 20 m/s А нужно понизить до 10 m/s
      Только в этом случае сработает скрипт который я приложил выше.
      Помогите пожалуйста решить этот вопрос.
      За ранние благодарю.
    • Автор: Troy1
      Пока ждал помощи, решил вопрос!
      Тема закрыта!!!
    • Автор: magliner
      Привет ! Ну вот моя история с вопросом в конце.. Я фанат Дэйз ванилы черноруси, заколебало сидеть на бездушных серверах со слабой админкой и терять лут от софтеров, решил создать под свои скромные запросы около ванильный сервер.. Нашел хорошего исполнителя, быстро и четко запустили отладили и ВОТ я имею СВОЙ сервер.. клас! вечер восторга и изучения
      Пожалуйста, Войдите или Зарегистрируйтесь, чтобы увидеть это: Вложение.

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

×
×
  • Создать...

Важная информация

Используя этот сайт, вы автоматически обязуетесь соблюдать наши Правила и Политика конфиденциальности.
Чтобы сделать этот веб-сайт лучше, мы разместили cookies на вашем устройстве. Вы можете изменить свои настройки cookies, в противном случае мы будем считать, что вы согласны с этим.

Поддержка