Скрипт запускается на каждом клиенте и при заходе игроков в массиве где есть список зданий в которых уже заспавнен лут для других игроков он пуст и лут спавнится еще раз в зданиях уже имеющие лут. помогите исправить эту ошибку. Также есть скрипт который очищает этот массив, запуск его происходит на стороне сервера, нужно это все как то синхронизировать.
Спавн лута в мультиплеере.
Лучший Ответ 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 - указатель на объект для которого спавнится\удаляется лут
Перейти к сообщению#1 OFFLINE
Отправлено 15 June 2018 - 14:45
#2 OFFLINE
Отправлено 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
#3 OFFLINE
Отправлено 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 - указатель на объект для которого спавнится\удаляется лут
спасибо! попробую.
#4 OFFLINE
Отправлено 15 June 2018 - 21:05
Либо спавн лута отдайте серверу, а не клиентам.
Это не сыграет сколько либо серьёзной роли в плане производительности, ибо хоть клиенты спавнят, хоть сервер, всё это нужно в любом случае синхронизировать, и избежать всякого сетевого трафика не избежать при любом варианте спавна.
И отдать серверу даже имеет больше смысла, ибо это на много упростит саму реализацию задачи, и не потребует от сервера каких то весомых ресурсов.
Тем более если позиции для лута уже предопределены.
Другое дело если спавн лута всегда случаен. В таком случае нужно будет производить расчёты по определению позиций для спавна, делать выборки что спавнить и на каких координатах.
И даже тут не стоит отдавать всё на откуп клиентам.
Достаточно будет заставить клиентов рассчитать позиции спавна, сделать выборку предметов для спавна, и эти данные уже отдать серверу.
#5 OFFLINE
Отправлено 15 June 2018 - 21:21
Либо спавн лута отдайте серверу, а не клиентам.
Если у тебя сервер занимается удалением лута(а судя по всему так и есть), то лут спавнится глобально, тогда и спавн действительно перенеси на сервер, внутрь какого нить цикла, который перебирает игроков, и ищет близлежащие здания к ним, и там уже определяет был спавн, или нет, в таком случае броадкаст не нужен, можешь на сервере вешать на объект переменную - заспавнен лут для данного объекта или нет.
Другое дело если лут был бы локальным для клиента... но это скорее для SP.......
#6 OFFLINE
Отправлено 15 June 2018 - 21:26
Ну так раз есть цикл очистки, то скомбинировать спавн и очистку в один цикл, вполне вписывается в концепцию, и я бы сказал сам бог велел).
Сообщение отредактировал SteelRat: 15 June 2018 - 21:27
#7 OFFLINE
Отправлено 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
#8 OFFLINE
Отправлено 15 June 2018 - 23:33
Я не настолько прошареный в этом). Я этот скрипт та неделю писал а тут...
#9 OFFLINE
Отправлено 16 June 2018 - 02:07
Либо спавн лута отдайте серверу, а не клиентам.
Если у тебя сервер занимается удалением лута(а судя по всему так и есть), то лут спавнится глобально, тогда и спавн действительно перенеси на сервер, внутрь какого нить цикла, который перебирает игроков, и ищет близлежащие здания к ним, и там уже определяет был спавн, или нет, в таком случае броадкаст не нужен, можешь на сервере вешать на объект переменную - заспавнен лут для данного объекта или нет.
Другое дело если лут был бы локальным для клиента... но это скорее для SP.......
Я хочу чтобы скрипт работал как в SP так и MP, в одиночной он работает нормально а как для сервера его переделать я незнаю. В скрипте очистки там удаляются все трупы, сломаная техника, GroundWeaponHolder со всей карты с установленным таймером, я хотел туда же затолкать и массив зданий в которых есть лут но так как скрипт очистки запускается на в initServer.sqf он не видит этот массив и соответственно не удаляется _house setVariable ["house_loot_spawn", false, true];
Прикрепленные файлы
#10 OFFLINE
Отправлено 16 June 2018 - 10:13
Вся фишка в том, что когда вы в сингле, то вы и сервер и клиент в одном флаконе.
То есть, сделанное под мультик, будет работать и в сингле.
Если будете употреблять вместо
isDedicated
это
if (isServer) then { ляля тополя... };
Я не настолько прошареный в этом). Я этот скрипт та неделю писал а тут...
Хотите или нет, придётся расшаривать.
Вы как бы не просто маркер на карту хотите накидать).
#11 OFFLINE
Отправлено 16 June 2018 - 11:45
но так как скрипт очистки запускается на в initServer.sqf он не видит этот массив и соответственно не удаляется _house setVariable ["house_loot_spawn", false, true];
какой массив не видит?, кто не видит?, при чем тут удаление и флаг что лут не заспавнен?
Хотите или нет, придётся расшаривать.
Скорее - прошариваться)))
Сообщение отредактировал NoNameUltima: 16 June 2018 - 11:46
#12 OFFLINE
Отправлено 16 June 2018 - 11:50
со всей карты с установленным таймером
И на кой хрен таймеры вешать?
Скрипт удаления мусора один из самых примитивных скриптов.
- Получили все объекты на карте(холдеры, сломанную технику, что то еще)
- В цикле пробежались по всем объектам, и для каждого проверили дистанцию до игроков
- Если вблизи мусора нет игрока(на дистанции Х метров) - удалили.
- Усыпили поток на минуту.(раз в минуту пробегаться по объектам - более чем достаточно, можно даже реже).