Цитата
Как?Всмысле? Друг хостует, одежда меняется скриптом.Хост ничего сделать не может же
В мультике всё не много по другому чем сингле, позже примерчик кину как.
Я здесь, продолжим. И так.
Создайте в папке миссии папку под названием "functions", в этой папке создайте файл "fn_addUniformCore.sqf ", и скопируйте в этот файл этот код
/*
Смена униформы юнита, при инициализации клиента на сервере
Вызывать функцию из файла init.sqf миссии, перед загрузкой инвентаря, если такое будет требоваться.
Вызов:
if !(isDedicated) then {
// Если функция не инициализирована, инициализируем
if (isNil "PTm_fnc_addUniformCore") then {PTm_fnc_addUniformCore = compile preprocessFileLineNumbers "functions\fn_addUniformCore.sqf"};
// Отправляем данные на сервер
_isChange = [player, "класс униформы"] call PTm_fnc_addUniformCore;
// debug info
if !(_isChange) then { diag_log format ["AddUniformCore: %1, %2", player, "something went wrong"]};
};
Импровизировал: SteelRat
*/
_unit = _this select 0;
_uniformClass = _this select 1;
_code = {if (isServer) then {(_this select 0) addUniform (_this select 1)}};
// Функция BIS_fnc_MP существует для взаимодействия сервера с клиентами и наоборот, а так же между клиентами, на БИКЕ есть описание как ей пользоваться.
// Отправляем данные и исполняемый код на сервер
[[[_unit, _uniformClass], _code],"BIS_fnc_spawn",false,false] spawn BIS_fnc_MP;
_timer = time + 60;
// Приостонавливаем исполнение кода, до тех пор пока на клиенте не сменится униформа, то есть ожидаем синхронизации.
// Это необходимо, если вы собираетесь перетряхнуть и инвентарь юнита, что бы всё прошло корректно, ожидаем.
WaitUntil {sleep 0.2; (((uniform _unit) == _uniformClass) or (time > _timer))};
if ((uniform _unit) == _uniformClass) then {
true
} else {
false
};
В чём здесь фишка? Вот в чём. Когда вы меняете униформу через инвентарь, движок Армы инициализирует синхронизацию этого действа между вами , сервером и остальными клиентами, и тут всё ОК.
Но если вы меняете униформу кодом, то эффект остаётся локальным для вас, синхронизация этого акта не происходит.
Что делает код выше, он отправляет на сервер код смены униформы юниту, сервер естествено послушно это исполняет, но на какой то момент эффект остаётся локальным для сервера, и через какоето время сервер замечает недоразумение, это по его мнению), что у него, сервера, на юните одна униформа, а у клиента на юните другая, а так как сервер считает, и вполне обосновано, что его, сервера, понты круче, инициализирует синхронизацию относительно своих данных, что нам и нужно.
Попрошу вас принять это как руководство к действию, а не конечный продукт), собственно у меня на выделенном сервере, код выше работает.
Сообщение отредактировал SteelRat: 04 June 2014 - 18:47