Перейти к содержимому


Фотография

Вопросы по скриптингу

Arma3 как плотформа для созда Скритпы

  • Авторизуйтесь для ответа в теме
Сообщений в теме: 1486

#1441 OFFLINE   TopDen

TopDen

    Мл. лейтенант

  • Пользователи
  • 803 сообщений
  • Откуда:Москва
  • Отряд:[АТР] АРМАТОП

Отправлено 27 December 2020 - 04:35

Парни, подскажите есть ли команды и простой скрипт, чтобы запретить игрокам заходить на сервер с разными "шмотачными" настройками в профиле (точнее снять с них все). например с очками или противогазом или еще как. Т е игрок в профиле это одевает на своего персонажа и на любом серваке заходит с этими предметами (прогружается в игру)


  • 0

#1442 OFFLINE   Schatten

Schatten

    Капитан

  • Пользователи
  • 1834 сообщений

Отправлено 27 December 2020 - 15:50

Пожалуйста Войдите или Зарегистрируйтесь чтобы увидеть скрытое содержание

.


  • 1

#1443 OFFLINE   forummailandlogin

forummailandlogin

    Ефрейтор

  • Пользователи
  • 41 сообщений

Отправлено 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.77К   0 Количество загрузок:

Фото 2. Запуск миссии из выделенного. Сервер и клиент на одной машине.

Прикрепленный файл  DSC_0097.JPG   83.07К   0 Количество загрузок:

На всякий случай pbo.

Прикрепленный файл  CTI@32pNM8t01r.Altis.pbo   14.08К   0 Количество загрузок:

Прошу указать на ошибку.


Сообщение отредактировал forummailandlogin: 18 October 2021 - 11:29

  • 0

#1444 OFFLINE   forummailandlogin

forummailandlogin

    Ефрейтор

  • Пользователи
  • 41 сообщений

Отправлено 18 October 2021 - 22:32

Опытным путём выяснил, что конструкция типа:

TownsMade = false;

if (ThisIsServer) then {
	TownsMade = true;
	publicVariable "TownsMade";
};

не обновляет переменную "TownsMade" на клиенте, а если убрать предустановку:"TownsMade = false;" - то переменная обновляется.
Как так и как быть?


Сообщение отредактировал forummailandlogin: 18 October 2021 - 23:17

  • 0

#1445 OFFLINE   Schatten

Schatten

    Капитан

  • Пользователи
  • 1834 сообщений

Отправлено 18 October 2021 - 23:48

forummailandlogin, проблема в том, что файл Init_Towns.sqf для клиентов выглядит так:

TownsMade = false;

if (!isDedicated) then  {
    waitUntil {!isNil "TownsMade"};

    ...
};

То есть TownsMade сразу же инициализируется, поэтому происходит выход из waitUntil, хотя сервер всё ещё может не закончить инициализацию.
Чтобы решить, например, инициализируй переменную TownsMade непосредственно перед передачей её клиентам.


Сообщение отредактировал Schatten: 18 October 2021 - 23:55

  • 0

#1446 OFFLINE   forummailandlogin

forummailandlogin

    Ефрейтор

  • Пользователи
  • 41 сообщений

Отправлено 19 October 2021 - 13:51

Schatten, спасибо за наводку. Проблема не в том, что она инициализирована заранее, а в том, что я не правильно интерпретировал 

waitUntil {!isNil "TownsMade"};

Функция isNil проверяет само существование, а не значение.

Но массив триггеров "TownTriggers" по-прежнему не существует на клиенте - будем дальше разбираться.


Сообщение отредактировал forummailandlogin: 19 October 2021 - 15:28

  • 0

#1447 OFFLINE   driver.906

driver.906

    Ефрейтор

  • Пользователи
  • 62 сообщений
  • Откуда:grozny

Отправлено 19 October 2021 - 20:42

Подскажите пожалуйста! Ставлю камувляж-расскрасску на авто через  this setObjectTexture [0, "camo.jpg"]; но после респавна техники моя раскрасски сбрасывается. Подскажите команду чтобы камуфляж оставался на технике после респавна


  • 0

#1448 OFFLINE   forummailandlogin

forummailandlogin

    Ефрейтор

  • Пользователи
  • 41 сообщений

Отправлено 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 добавил - мало ли что, но нет задержки обмена данными тут не причём.


Сообщение отредактировал forummailandlogin: 20 October 2021 - 12:36

  • 0

#1449 OFFLINE   Schatten

Schatten

    Капитан

  • Пользователи
  • 1834 сообщений

Отправлено 20 October 2021 - 14:34

driver.906, надо после содания тачки заново текстуру устанавливать.

forummailandlogin,

if (isServer) then {
    NM_Towns = [...];

    publicVariable "NM_Towns";
};

if (!isServer && hasInterface) then {
    waitUntil { !(isNil "NM_Towns") };
};

  • 0

#1450 OFFLINE   forummailandlogin

forummailandlogin

    Ефрейтор

  • Пользователи
  • 41 сообщений

Отправлено 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" присутствуют.


Сообщение отредактировал forummailandlogin: 20 October 2021 - 14:47

  • 0

#1451 OFFLINE   Schatten

Schatten

    Капитан

  • Пользователи
  • 1834 сообщений

Отправлено 20 October 2021 - 15:32

Теперь на клиенте и оригинал "NM_Towns" и копия "NM_Massive" присутствуют.

Ну так зачем тебе две одинаковые переменные? Убери NM_Massive, а NM_Towns перенеси внутрь if.


  • 0

#1452 OFFLINE   forummailandlogin

forummailandlogin

    Ефрейтор

  • Пользователи
  • 41 сообщений

Отправлено 20 October 2021 - 16:30

Schatten, смыл был не в одинаковости, а том, что бы какой либо обновлённый сервером массив/переменная был виден на клиенте. Просто столкнулся на массиве триггеров.

Получается весьма странная особенность:

GLOBAL=1;

Сервер{
GLOBAL++;
Даст GLOBAL=2;
publicVariable GLOBAL;
}

Клиент {
Ждём приёма.
GLOBAL++;
Даст GLOBAL=2; А должен быть = 3.
}

Получается, что объявленная вне скобок {} глобальная переменная локальна для каждого клиента. Да её можно править, но предастся с помощью "publicVariable" всё равно значение, что было дано ей при инициализации.


Сообщение отредактировал forummailandlogin: 20 October 2021 - 16:31

  • 0

#1453 OFFLINE   Schatten

Schatten

    Капитан

  • Пользователи
  • 1834 сообщений

Отправлено 20 October 2021 - 16:35

Даст GLOBAL=2; А должен быть = 3.

Нет, не должен быть -- GLOBAL++ сработает до того, как сервер передаст GLOBAL.

 

Получается, что объявленная вне скобок {} глобальная переменная локальна для каждого клиента.

Верно.


  • 0

#1454 OFFLINE   forummailandlogin

forummailandlogin

    Ефрейтор

  • Пользователи
  • 41 сообщений

Отправлено 20 October 2021 - 17:23


Нет, не должен быть -- GLOBAL++ сработает до того, как сервер передаст GLOBAL.
По тому я и написал "ждём приёма". Дождались, и только потом ++.
  • 0

#1455 OFFLINE   Schatten

Schatten

    Капитан

  • Пользователи
  • 1834 сообщений

Отправлено 20 October 2021 - 17:50

По тому я и написал "ждём приёма".

Ты про что-то такое:

waitUntil { !(isNil "GLOBAL") };

? Если да, то в твоём случае так работать не будет.


  • 0

#1456 OFFLINE   forummailandlogin

forummailandlogin

    Ефрейтор

  • Пользователи
  • 41 сообщений

Отправлено 20 October 2021 - 20:49

Schatten,ну да работать не будет GLOBAL существует с самого начала.

Я имел ввиду ожидание вообще (не важно какое), главное что бы инкремент на клиенте произошёл заведомо позже чем передача с сервера.


  • 0

#1457 OFFLINE   forummailandlogin

forummailandlogin

    Ефрейтор

  • Пользователи
  • 41 сообщений

Отправлено 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.36К   0 Количество загрузок:


  • 0

#1458 OFFLINE   Ibragim

Ibragim

    Сержант

  • Пользователи
  • 161 сообщений

Отправлено 28 October 2021 - 21:39

Попробуй найти подходящую позицию с помощью этих команд:

Пожалуйста Войдите или Зарегистрируйтесь чтобы увидеть скрытое содержание

Пожалуйста Войдите или Зарегистрируйтесь чтобы увидеть скрытое содержание


  • 0

#1459 OFFLINE   forummailandlogin

forummailandlogin

    Ефрейтор

  • Пользователи
  • 41 сообщений

Отправлено 28 October 2021 - 22:36

Ibragim, от души благодарю за помощь. Выживаемость при создании значительно повысилась.


  • 1

#1460 OFFLINE   Ibragim

Ibragim

    Сержант

  • Пользователи
  • 161 сообщений

Отправлено 28 October 2021 - 22:40

Вообще посоветую свой метод: Найди ближайшую дорогу, ее позицию и поставь на ней. Еще лучше, если найдешь направление дороги и поставишь прямо по направлению.


  • 0




Яндекс.Метрика