123new
Вот пример применения в event_playerKilled.sqf
тк этот скрипт вызывается от 1 до 3х раз, то нежелательно, что бы часть кода которая ниже выдачи сообщения всем юзверям и в лог об убийстве выполнялась более 1 раза
Просто потому что - убийство профиля вызовется 2-3 раза, процесс ожидания и удаления агента будет болтаться в памяти сервера в 2х-3х экземплярах
А если в конце мы добавили вызов экрана смерти, вызов автопереспавна - они могут наложиться (я с этим уже столкнулся неск раз)
Использовать глобальные нельзя, тк это повлияет на всех клиентов
Можно использовать переменные привязанные к агенту - тогда просто вместо profileNamespace пишем _agent
Но если сервер грохнет агента, то тогда и переменная пропадет
потому сразу после сообщуг
... код 1 ...
_eventKilledClient = profileNamespace getVariable ["eventKilledClient",false];
if (_eventKilledClient) exitWith {};
profileNamespace setVariable ["eventKilledClient",true];
... код 2...
в итоге код 1 будет выполнен сколько серверной душе угодно
а код 2 только 1 раз
Точно так же я решил проверку при автореспавне - в процедуре автореспавна проверяется не запущен ли респавн вручную, и, если запущен, то бросаем это занятие )). На всяк случай сделал аналогичную проверку в процедуре вызываемой на сервере по нажатию клиентом кнопки respawn,
в процедуре _clientRespawn которая в dbLoadPlayer.sqf в самом начале
_clientRespawnAuto = profileNamespace getVariable ["ClientRespawnAuto",false];
if (_clientRespawnAuto) exitWith {
diag_log format["RESPAWN: Client %1 with UID %2 alredy automatically respawn!",_id, _uid];
profileNamespace setVariable ["ClientRespawn",false];
};
profileNamespace setVariable ["ClientRespawn",true];
в скрипте который организует автореспавн (та же процедура _clientRespawn, только ее содержимое вынесено в отдельный файл (forcedRespawnCustom.sqf) и обьявлено в compilse.sqf как forcedRespawnCustom и эта процедура вызывается после задержки в конце event_playerKilled.sqf) _id туда передается в качестве параметра - [_id] call forcedRespawnCustom; [тк я не уверен, что _id будет там содержать корректный _id] можно конечно передать _id и через profileNamespace.
_id = _this select 0;
if (isNil "_id") exitWith {diag_log format["FORCECLIENTRESPAWN: _id == isNil, Exit!"]};
_uid = getClientUID _id;
if (isNil "_uid") exitWith {diag_log format["FORCECLIENTRESPAWN: _uid == isNil, Exit!"]};
_clientRespawn = profileNamespace getVariable ["ClientRespawn",false];
if (_clientRespawn) exitWith {
diag_log format["FORCECLIENTRESPAWN: Client %1 with UID %2 alredy manual respawn!",_id, _uid];
profileNamespace setVariable ["ClientRespawnAuto",false];
};
profileNamespace setVariable ["ClientRespawnAuto",true];
заодно зупулил переменную в код который отправляется и запускается на клиенте и которую так же проверяю в том же коде
но это на предмет если потребуется затемнения детскрина
так же добавил доппроверкку_ClientRespawn непосредственно перед вызовом процедуры автореспавна
сегодня все дообкатаю, проверю (надеюсь приятели помогут протестить, тк одному норм убийство и респавн нескольких игроков не проверить) и выложу сами скрипты с каментами внутри