Скрипт запускается на каждом клиенте и при заходе игроков в массиве где есть список зданий в которых уже заспавнен лут для других игроков он пуст и лут спавнится еще раз в зданиях уже имеющие лут. помогите исправить эту ошибку. Также есть скрипт который очищает этот массив, запуск его происходит на стороне сервера, нужно это все как то синхронизировать.
Спавн лута в мультиплеере.
Лучший Ответ 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
со всей карты с установленным таймером
И на кой хрен таймеры вешать?
Скрипт удаления мусора один из самых примитивных скриптов.
- Получили все объекты на карте(холдеры, сломанную технику, что то еще)
- В цикле пробежались по всем объектам, и для каждого проверили дистанцию до игроков
- Если вблизи мусора нет игрока(на дистанции Х метров) - удалили.
- Усыпили поток на минуту.(раз в минуту пробегаться по объектам - более чем достаточно, можно даже реже).












