Парни, подскажите есть ли команды и простой скрипт, чтобы запретить игрокам заходить на сервер с разными "шмотачными" настройками в профиле (точнее снять с них все). например с очками или противогазом или еще как. Т е игрок в профиле это одевает на своего персонажа и на любом серваке заходит с этими предметами (прогружается в игру)
#1441 OFFLINE
Posted 27 December 2020 - 04:35
#1442 OFFLINE
Posted 27 December 2020 - 15:50
.
#1443 OFFLINE
Posted 18 October 2021 - 11:22
Вопреки здравой логике. Ни "TownsMade" ни "TownTriggers" не обновляются на клиенте если запуск миссии происходит на выделенном сервере. И как следствие не происходит настройка триггеров на клиентах. На хост-сервере всё работает.
Файл Init.sqf.
// // Только хост-сервер. Но может быть и игроком. ThisIsHostedServer = if (isServer && !isDedicated) then {true} else {false}; // Любой сервер. (выделенный или хост). ThisIsServer = if (isDedicated || ThisIsHostedServer) then {true} else {false}; // Только выделенный сервер. ThisIsDedicated = if (isDedicated) then {true} else {false}; // Какой либо клиент. Безголовый в том числе. ThisIsClient = if !(isDedicated || isServer) then {true} else {false}; // Только безголовый клиент. ThisIsHeadless = if !(hasInterface || isServer) then {true} else {false}; // Только подключившийся игрок. ThisIsPlayer = if (hasInterface && !isServer) then {true} else {false}; //--- Constants init execVM "Common\Init\Init_CommonConstants.sqf"; //--- Towns init execVM "Common\Init\Init_Towns.sqf";
Файл Init_Towns.sqf.
// Города принимающие участие в игре. // Координаты точек, где размещать флаги: // Ореокастро, Негадес, Кавала, Абдера, Айос-Дионисиос, Зарос Towns = [[4587, 21382], [4908, 16154], [3645, 13115], [9455, 20255], [9418, 15978], [8962, 11975]]; QuantityTowns = count Towns; // Маркеры и триггеры городов. Соответствуют расположению в двумерном массиве Towns. Flagpoles = []; // Массив флагштоков. //FlagsOnMap = []; // Массив Флагов на карте. //ElipsesOnMap = []; // Массив кругов вокруг флагов на карте. TownTriggers = []; // Массив триггреров. TownOwners = []; // Массив владельцев городов. k = 0; packet = [player, 2, 3]; TownsMade = false; // Глобальная переменная сигнализирующая, что на сервере созданы флаги, маркеры, триггеры. //=================================================================================================// //=================================================================================================// //=================================================================================================// // Выполняется только на сервере. if (ThisIsServer) then { // Создаём флагштоки, маркеры флаг и круг на карте, и триггеры вокруг флагов. { _script = [_forEachIndex] spawn { params ["_index"]; // Создаем пустой флагшток. _this = createVehicle ["FlagPole_F",(Towns select _index),[],0,"NONE"]; Flagpoles pushback _this; // Создаем маркер (флаг) на карте на позиции флагштока. _this = createMarker [format ["markerF_%1", _index],(Towns select _index)]; // FlagsOnMap pushback _this; _this setMarkerType "mil_flag"; _this setMarkerShape "ICON"; // Создаем маркер (элипс) на карте на позиции флагштока. _this = createMarker [format ["markerE_%1", _index],(Towns select _index)]; // ElipsesOnMap pushback _this; _this setMarkerSize [5, 5]; _this setMarkerShape "ELLIPSE"; _this setMarkerBrush "DiagGrid"; _this setMarkerColor "ColorGUER"; // Создаем триггер активации таймера захвата города на позиции флагштока. _this = createTrigger ["EmptyDetector",(Towns select _index),true]; TownTriggers pushback _this; }; waitUntil {scriptDone _script}; }forEach Towns; publicVariable "TownTriggers"; TownsMade = true; publicVariable "TownsMade"; // Обработчик событий: Широковещательная рассылка. // Формат аргумента события addPublicVariableEventHandler: // select 0 - Строка, имя полученой переменной. // select 1 - Любое, значение полученой переменной. // select 2 - Объект. // Не будет срабатывать на машине, которая выполнила широковещательную рассылку с помощью команды publicVariable. "packet" addPublicVariableEventHandler { _nubmer1 = (_this select 1 select 0); _number2 = (_this select 1 select 1); _number3 = (_this select 1 select 2); _z = ""; // Меняем цвет и принадлежность флага в городе. if (_number3 == EAST) then { _z = "\A3\Data_F\Flags\flag_red_CO.paa"; } else { if (_number3 == WEST) then { _z = "\A3\Data_F\Flags\flag_blue_CO.paa"; } else { _z = "\A3\Data_F\Flags\flag_green_CO.paa"; }; }; hint format ['%1,%2,%3', _nubmer1,_number2,_number3]; player globalChat "Hello world!"; _flag = (Flagpoles select _number2); _null = [_flag, _z, _number3] spawn { params ["_obj", "_color", "_side"]; _obj setFlagTexture _color; _obj setFlagSide _side; }; // diag_log _this; }; }; //=================================================================================================// //=================================================================================================// //=================================================================================================// mass = []; // Массив тех кто находится в области действия триггера в момент его активации. // Выполняется на клиенте. if (!isDedicated) then { waitUntil {!isNil "TownsMade"}; { _script = [_forEachIndex] spawn { params ["_index"]; // Настраиваем триггеры активации таймера захвата города на позиции флагштока на клиентах. (TownTriggers select _index) setTriggerActivation ["ANY","PRESENT",true]; (TownTriggers select _index) setTriggerArea [5,5,0,false]; (TownTriggers select _index) setTriggerTimeout [5,5,5, true]; (TownTriggers select _index) setTriggerStatements [ " this", // Получаем экземпляр активированного триггера. // Получаем массив объектов в зоне действия активированного триггера. // Получаем сторону что активировала триггер. // Отправляем номер города, что поменял владельца. Формат: Событие, Номер города, Сторона получившая контроль над городом. " _a = thisTrigger; _b = TownTriggers find _a; _c = thisList select 0; {mass pushback thisList} forEach thisList; _d = side _c; packet set [0, Town_Change_Control]; packet set [1, _b]; packet set [2, _d]; publicVariableServer 'packet';", " hint 'trigger off'" ]; }; waitUntil {scriptDone _script}; }forEach TownTriggers; // "packet" addPublicVariableEventHandler { // _thesum = (packet select 1); // hint str _thesum; // }; }; //=================================================================================================// //=================================================================================================// //=================================================================================================//
Фото 1. Запуск миссии из редактора. Т.е. клиент он же хост-сервер. Сервер и клиент на одной машине.
DSC_0098.JPG 99.77KB 0 downloads
Фото 2. Запуск миссии из выделенного. Сервер и клиент на одной машине.
DSC_0097.JPG 83.07KB 0 downloads
На всякий случай pbo.
CTI@32pNM8t01r.Altis.pbo 14.08KB 0 downloads
Прошу указать на ошибку.
Edited by forummailandlogin, 18 October 2021 - 11:29.
#1444 OFFLINE
Posted 18 October 2021 - 22:32
Опытным путём выяснил, что конструкция типа:
TownsMade = false; if (ThisIsServer) then { TownsMade = true; publicVariable "TownsMade"; };
не обновляет переменную "TownsMade" на клиенте, а если убрать предустановку:"TownsMade = false;" - то переменная обновляется.
Как так и как быть?
Edited by forummailandlogin, 18 October 2021 - 23:17.
#1445 OFFLINE
Posted 18 October 2021 - 23:48
forummailandlogin, проблема в том, что файл Init_Towns.sqf для клиентов выглядит так:
TownsMade = false; if (!isDedicated) then { waitUntil {!isNil "TownsMade"}; ... };
То есть TownsMade сразу же инициализируется, поэтому происходит выход из waitUntil, хотя сервер всё ещё может не закончить инициализацию.
Чтобы решить, например, инициализируй переменную TownsMade непосредственно перед передачей её клиентам.
Edited by Schatten, 18 October 2021 - 23:55.
#1446 OFFLINE
Posted 19 October 2021 - 13:51
Schatten, спасибо за наводку. Проблема не в том, что она инициализирована заранее, а в том, что я не правильно интерпретировал
waitUntil {!isNil "TownsMade"};
Функция isNil проверяет само существование, а не значение.
Но массив триггеров "TownTriggers" по-прежнему не существует на клиенте - будем дальше разбираться.
Edited by forummailandlogin, 19 October 2021 - 15:28.
#1447 OFFLINE
Posted 19 October 2021 - 20:42
Подскажите пожалуйста! Ставлю камувляж-расскрасску на авто через this setObjectTexture [0, "camo.jpg"]; но после респавна техники моя раскрасски сбрасывается. Подскажите команду чтобы камуфляж оставался на технике после респавна
#1448 OFFLINE
Posted 20 October 2021 - 12:33
Ну ни как не пойму. Как передать копию массива на клиент?
NM_Towns = [[4587, 21382], [4908, 16154], [3645, 13115], [9455, 20255], [9418, 15978], [8962, 11975]]; NM_Massive = []; if (isServer) then { _string1 = str format ["isServer Города %1", NM_Towns]; player globalChat _string1; // Копируем массив. { NM_Massive pushback _x; }forEach NM_Towns; publicVariable "NM_Massive"; NM_TownsMade = true; publicVariable "NM_TownsMade"; sleep 5; _string1 = str format ["isServer Массив %1", NM_Massive]; player globalChat _string1; }; if (not isServer && hasInterface) then { waitUntil {!isNil "NM_TownsMade"}; _string1 = str format ["not isServer Города %1", NM_Towns]; player globalChat _string1; sleep 5; _string1 = str format ["not isServer Массив %1", NM_Massive]; player globalChat _string1; };
Клиент видит лишь пустой массив "NM_Massive = [];" Уже и sleep добавил - мало ли что, но нет задержки обмена данными тут не причём.
Edited by forummailandlogin, 20 October 2021 - 12:36.
#1449 OFFLINE
Posted 20 October 2021 - 14:34
driver.906, надо после содания тачки заново текстуру устанавливать.
if (isServer) then { NM_Towns = [...]; publicVariable "NM_Towns"; }; if (!isServer && hasInterface) then { waitUntil { !(isNil "NM_Towns") }; };
#1450 OFFLINE
Posted 20 October 2021 - 14:44
Schatten, да, только что и сам дошёл. Если глобальная переменная объявлена вне блока сервера, то обновляй её не обновляй - не важно, для клиента она так и останется как была при объявлении.
т.е. вот так:
NM_Towns = [[4587, 21382], [4908, 16154], [3645, 13115], [9455, 20255], [9418, 15978], [8962, 11975]]; if (isServer) then { NM_Massive = []; // Копируем массив. { NM_Massive pushback _x; }forEach NM_Towns; publicVariable "NM_Massive"; NM_TownsMade = true; publicVariable "NM_TownsMade"; }; if (not isServer && hasInterface) then { waitUntil {!isNil "NM_TownsMade"}; _string1 = str format ["not isServer Города %1", NM_Towns]; player globalChat _string1; _string1 = str format ["not isServer Массив %1", NM_Massive]; player globalChat _string1; };
Теперь на клиенте и оригинал "NM_Towns" и копия "NM_Massive" присутствуют.
Edited by forummailandlogin, 20 October 2021 - 14:47.
#1451 OFFLINE
Posted 20 October 2021 - 15:32
Теперь на клиенте и оригинал "NM_Towns" и копия "NM_Massive" присутствуют.
Ну так зачем тебе две одинаковые переменные? Убери NM_Massive, а NM_Towns перенеси внутрь if.
#1452 OFFLINE
Posted 20 October 2021 - 16:30
Schatten, смыл был не в одинаковости, а том, что бы какой либо обновлённый сервером массив/переменная был виден на клиенте. Просто столкнулся на массиве триггеров.
Получается весьма странная особенность:
GLOBAL=1; Сервер{ GLOBAL++; Даст GLOBAL=2; publicVariable GLOBAL; } Клиент { Ждём приёма. GLOBAL++; Даст GLOBAL=2; А должен быть = 3. }
Получается, что объявленная вне скобок {} глобальная переменная локальна для каждого клиента. Да её можно править, но предастся с помощью "publicVariable" всё равно значение, что было дано ей при инициализации.
Edited by forummailandlogin, 20 October 2021 - 16:31.
#1453 OFFLINE
Posted 20 October 2021 - 16:35
Даст GLOBAL=2; А должен быть = 3.
Нет, не должен быть -- GLOBAL++ сработает до того, как сервер передаст GLOBAL.
Получается, что объявленная вне скобок {} глобальная переменная локальна для каждого клиента.
Верно.
#1454 OFFLINE
Posted 20 October 2021 - 17:23
По тому я и написал "ждём приёма". Дождались, и только потом ++.
Нет, не должен быть -- GLOBAL++ сработает до того, как сервер передаст GLOBAL.
#1455 OFFLINE
Posted 20 October 2021 - 17:50
По тому я и написал "ждём приёма".
Ты про что-то такое:
waitUntil { !(isNil "GLOBAL") };
? Если да, то в твоём случае так работать не будет.
#1457 OFFLINE
Posted 28 October 2021 - 21:05
Создаю технику в радиусе 200 метров:
// Создаём технику, заселяем экипаж, присоединяем к текущей группе. [_unit,_grp,_Position,_Radius] spawn { params ["_unit","_grp","_Position","_Radius"]; _veh = createVehicle [_unit, _Position, [], _Radius, "NONE"]; _veh setVariable ["BIS_enableRandomization", false]; createVehicleCrew _veh; crew _veh join _grp; _veh setVehicleLock "LOCKED"; };
Согласно описанию на "createVehicle", то ищется свободная позиция. Но всё равно находится техника появляющаяся в структурах и по сему взрывается.
Есть ли какой обходной путь решения данной проблемы?
post-44771-0-38088200-1635436031.jpg 107.36KB 0 downloads
#1458 OFFLINE
Posted 28 October 2021 - 21:39
Попробуй найти подходящую позицию с помощью этих команд:
#1460 OFFLINE
Posted 28 October 2021 - 22:40
Вообще посоветую свой метод: Найди ближайшую дорогу, ее позицию и поставь на ней. Еще лучше, если найдешь направление дороги и поставишь прямо по направлению.