Перейти к содержимому


Фотография

Спавн лута в мультиплеере.


Лучший Ответ NoNameUltima , 15 June 2018 - 19:24

dan,

В скрипте спавна объектов, ПЕРЕД спавном, добавь проверку -

if !(_house getVariable ["house_loot_spawn", false]) then

{

тут спавн

_house setVariable ["house_loot_spawn", true, true];//после спавна вешаем на объект броадкаст переменную, что лут для этого здания заспавнен

};

 

В скрипте очистки, после удаления лута добавить -

_house setVariable ["house_loot_spawn", false, true];

 

_house - указатель на объект для которого спавнится\удаляется лут

Перейти к сообщению


  • Авторизуйтесь для ответа в теме
Сообщений в теме: 11

#1 OFFLINE   dan

dan

    Рядовой

  • Пользователи
  • 9 сообщений

Отправлено 15 June 2018 - 14:45

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

Прикрепленные файлы

  • Прикрепленный файл  spawnLoot2.sqf   24.8К   18 Количество загрузок:
  • Прикрепленный файл  trupi.sqf   2.07К   6 Количество загрузок:

  • 0

#2 OFFLINE   NoNameUltima

NoNameUltima

    Сержант

  • Пользователи
  • 189 сообщений
  • Откуда:SPB

Отправлено 15 June 2018 - 19:24   Лучший Ответ

dan,

В скрипте спавна объектов, ПЕРЕД спавном, добавь проверку -

if !(_house getVariable ["house_loot_spawn", false]) then

{

тут спавн

_house setVariable ["house_loot_spawn", true, true];//после спавна вешаем на объект броадкаст переменную, что лут для этого здания заспавнен

};

 

В скрипте очистки, после удаления лута добавить -

_house setVariable ["house_loot_spawn", false, true];

 

_house - указатель на объект для которого спавнится\удаляется лут


Сообщение отредактировал NoNameUltima: 15 June 2018 - 19:25

  • 0

#3 OFFLINE   dan

dan

    Рядовой

  • Пользователи
  • 9 сообщений

Отправлено 15 June 2018 - 19:58

dan,

В скрипте спавна объектов, ПЕРЕД спавном, добавь проверку -

if !(_house getVariable ["house_loot_spawn", false]) then

{

тут спавн

_house setVariable ["house_loot_spawn", true, true];//после спавна вешаем на объект броадкаст переменную, что лут для этого здания заспавнен

};

 

В скрипте очистки, после удаления лута добавить -

_house setVariable ["house_loot_spawn", false, true];

 

_house - указатель на объект для которого спавнится\удаляется лут

спасибо! попробую.


  • 0

#4 OFFLINE   SteelRat

SteelRat

    Полковник

  • Пользователи
  • 3241 сообщений
  • Откуда:РФ

Отправлено 15 June 2018 - 21:05

Либо спавн лута отдайте серверу, а не клиентам.

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

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

Тем более если позиции для лута уже предопределены.

 

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

И даже тут не стоит отдавать всё на откуп клиентам.

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


  • 0

#5 OFFLINE   NoNameUltima

NoNameUltima

    Сержант

  • Пользователи
  • 189 сообщений
  • Откуда:SPB

Отправлено 15 June 2018 - 21:21


Либо спавн лута отдайте серверу, а не клиентам.

Если у тебя сервер занимается удалением лута(а судя по всему так и есть), то лут спавнится глобально, тогда и спавн действительно перенеси на сервер, внутрь какого нить цикла, который перебирает игроков, и ищет близлежащие здания к ним, и там уже определяет был спавн, или нет, в таком случае броадкаст не нужен, можешь на сервере вешать на объект переменную - заспавнен лут для данного объекта или нет.

Другое дело если лут был бы локальным для клиента... но это скорее для SP.......


  • 0

#6 OFFLINE   SteelRat

SteelRat

    Полковник

  • Пользователи
  • 3241 сообщений
  • Откуда:РФ

Отправлено 15 June 2018 - 21:26

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


Сообщение отредактировал SteelRat: 15 June 2018 - 21:27

  • 0

#7 OFFLINE   NoNameUltima

NoNameUltima

    Сержант

  • Пользователи
  • 189 сообщений
  • Откуда:SPB

Отправлено 15 June 2018 - 21:56

/*
	Ultima_Server_Procedure_Buildings_Loot_Manager.sqf
	
*/
Private ["_diag", "_building_to_player_distance_for_spawn", "_buildings_lootable", "_map_center", "_map_radius", "_spawn_loot_for_building", "_delete_loot_for_building", "_buildings", "_building", "_delete"];
_diag					=	true;		//	Вести диагностику.
_building_to_player_distance_for_spawn	=	100;		//	Дистанция от объекта до игрока для создания лута(и для удаления, если на данной дистанции, нет игроков).
_buildings_lootable			=	["house"];	//	Массив объектов, для которых работает спавн.
_map_center				=	(getMarkerPos "center");
_map_radius				=	(_map_center select 0) + 5000;
//	процедура создания лута.
_spawn_loot_for_building		=
	{
		Private ["_obj"];
		_obj	=	(_this select 0);
		//	Тут как то спавним лут для _obj
	};
//	Процедура удаления лута.
_delete_loot_for_building		=
	{
		Private ["_obj"];
		_obj	=	(_this select 0);
		//	Тут как то удаляем лут для _obj	
	};
while {true} do
	{
		{
			_buildings	=	nearestObjects [_x, _buildings_lootable, _building_to_player_distance_for_spawn];
			{
				if !(_x getVariable ["Ultima_Server_Boolean_Building_Loot_Spawn", false]) then
					{
						_x setVariable ["Ultima_Server_Boolean_Building_Loot_Spawn", true];
						[_x] spawn _spawn_loot_for_building;
						if (_diag) then
							{diag_log(format["[#Ultima]: [Создание лута для объекта]: %1", _x]);};
					};
			} forEach _buildings;
		} forEach (allPlayers - entities "HeadlessClient_F");		
		_buildings	=	nearestObjects [_map_center, _buildings_lootable, _map_radius];
		{
                       if (_x getVariable ["Ultima_Server_Boolean_Building_Loot_Spawn", true]) then
                       {
			_building	=	_x;
			_delete		=	true;
			{
				if ( (_x distance _building) < _building_to_player_distance_for_spawn ) exitWith
					{_delete	=	false;};
			} forEach (allPlayers - entities "HeadlessClient_F");
			if (_delete) then
				{
					_x setVariable ["Ultima_Server_Boolean_Building_Loot_Spawn", false];
					[_building] spawn _delete_loot_for_building;
					if (_diag) then
						{diag_log(format["[#Ultima]: [Удаление лута для объекта]: %1", _building]);};
				};
                        };
		} forEach _buildings;
	};

Я бы как тотак накидал. Ну еще по хорошему необходимо:

1. вместо "house" вписать классы зданий, и создать дополнительно, вменяемую таблицу лута для зданий.

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


Сообщение отредактировал NoNameUltima: 15 June 2018 - 22:08

  • 1

#8 OFFLINE   dan

dan

    Рядовой

  • Пользователи
  • 9 сообщений

Отправлено 15 June 2018 - 23:33

Я не настолько прошареный в этом). Я этот скрипт та неделю писал а тут...


  • 0

#9 OFFLINE   dan

dan

    Рядовой

  • Пользователи
  • 9 сообщений

Отправлено 16 June 2018 - 02:07

 


Либо спавн лута отдайте серверу, а не клиентам.

 

 

Если у тебя сервер занимается удалением лута(а судя по всему так и есть), то лут спавнится глобально, тогда и спавн действительно перенеси на сервер, внутрь какого нить цикла, который перебирает игроков, и ищет близлежащие здания к ним, и там уже определяет был спавн, или нет, в таком случае броадкаст не нужен, можешь на сервере вешать на объект переменную - заспавнен лут для данного объекта или нет.

Другое дело если лут был бы локальным для клиента... но это скорее для SP.......

 

Я хочу чтобы скрипт работал как в SP так и MP, в одиночной он работает нормально а как для сервера его переделать я незнаю. В скрипте очистки там удаляются все трупы, сломаная техника, GroundWeaponHolder со всей карты с установленным таймером, я хотел туда же затолкать и массив зданий в которых есть лут но так как скрипт очистки запускается на в initServer.sqf он не видит этот массив и соответственно не удаляется _house setVariable ["house_loot_spawn", false, true];

Прикрепленные файлы

  • Прикрепленный файл  trupi.sqf   2.09К   1 Количество загрузок:
  • Прикрепленный файл  spawnLoot2.sqf   24.76К   0 Количество загрузок:

  • 0

#10 OFFLINE   SteelRat

SteelRat

    Полковник

  • Пользователи
  • 3241 сообщений
  • Откуда:РФ

Отправлено 16 June 2018 - 10:13

Вся фишка в том, что когда вы в сингле, то вы и сервер и клиент в одном флаконе.

То есть, сделанное под мультик, будет работать и в сингле.

Если будете употреблять вместо

isDedicated

это

if (isServer) then {
    ляля тополя...
};

 

Я не настолько прошареный в этом). Я этот скрипт та неделю писал а тут...

Хотите или нет, придётся расшаривать.

Вы как бы не просто маркер на карту хотите накидать).


  • 0

#11 OFFLINE   NoNameUltima

NoNameUltima

    Сержант

  • Пользователи
  • 189 сообщений
  • Откуда:SPB

Отправлено 16 June 2018 - 11:45


но так как скрипт очистки запускается на в initServer.sqf он не видит этот массив и соответственно не удаляется _house setVariable ["house_loot_spawn", false, true];

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

 

 

 


Хотите или нет, придётся расшаривать.

Скорее - прошариваться)))


Сообщение отредактировал NoNameUltima: 16 June 2018 - 11:46

  • 0

#12 OFFLINE   NoNameUltima

NoNameUltima

    Сержант

  • Пользователи
  • 189 сообщений
  • Откуда:SPB

Отправлено 16 June 2018 - 11:50


со всей карты с установленным таймером

И на кой хрен таймеры вешать?

Скрипт удаления мусора один из самых примитивных скриптов.

  • Получили все объекты на карте(холдеры, сломанную технику, что то еще)
  • В цикле пробежались по всем объектам, и для каждого проверили дистанцию до игроков
  • Если вблизи мусора нет игрока(на дистанции Х метров) - удалили.
  • Усыпили поток на минуту.(раз в минуту пробегаться по объектам - более чем достаточно, можно даже реже).

  • 0




Яндекс.Метрика