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


Фотография

скрипт просмотра карты


Лучший Ответ nIkRon , 21 June 2019 - 21:54

1. Вы пытаетесь получить _x после выполнения вызова через spawn, там его попросту не может быть. 
2. Что-бы получить данные в [] spawn {код}; их нужно вставить в массив перед "spawn" >> "[_player, _playerName] spawn {код};"
 

(findDisplay 46) displayAddEventHandler ["KeyDown",{
	private _keyCode = _this select 1;
	if (_keyCode in (actionKeys "showMap") && { !("ItemMap" in (assignedItems player))}) exitWith
	{
		private _playersNearby = (getPosATL player) nearObjects ["Man",5];
		private _result = false;
                private _playerWithMap = objNull;

		{
			if ((isPlayer _x) && { ("ItemMap" in (assignedItems _x)) }) exitWith {_result = true; _playerWithMap = _x;};
		} forEach _playersNearby;

		if (_result) then
		{
			hint format ["Вы смотрите карту %1", (name _playerWithMap)];
			[] spawn
			{
				player addItem "ItemMap";
				player assignItem "ItemMap";
				openMap true;
				waitUntil { !(visibleMap) };
				player unassignItem "ItemMap";
				player removeItem "ItemMap";
			};
		};
	};
}];	

Если вам нужно было что-бы работало только с игроками, то выше переделанный вариант, прошлый работал и с ботами.

Перейти к сообщению


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

#1 OFFLINE   TopDen

TopDen

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

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

Отправлено 21 June 2019 - 03:05

Привет всем живым) Ищу скрипт\мод на возможность одному игроку (у которого нет карты) стоя рядом с другим игроком (у которого карта есть) смотреть карту от него. Может у кого-то есть что-то подобное? Спасибо.


  • 0

#2 OFFLINE   nIkRon

nIkRon

    Сержант

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

Отправлено 21 June 2019 - 12:25

Первый вариант: Добавляете EH на кнопку карты, в нем собираете игроков в N радиусе, проверяете их на наличие карты, и если есть карта, добавляете карту игроку, после чего запускаете waituntil с visibleMap и после того как он её закрывает, удаляете её.
 
Второй вариант: Добавляете EH на кнопку карты, в нем собираете игроков в N радиусе, проверяете их на наличие карты, и если есть карта, создаете диалог с RscMapControl, при этом скипая армовскую карту в EH.

Сообщение отредактировал nIkRon: 21 June 2019 - 12:25

  • 0

#3 OFFLINE   TopDen

TopDen

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

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

Отправлено 21 June 2019 - 13:03

nIkRon, у вас есть готовый вариант?


  • 0

#4 OFFLINE   nIkRon

nIkRon

    Сержант

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

Отправлено 21 June 2019 - 15:24

(findDisplay 46) displayAddEventHandler ["KeyDown",{
	private _keyCode = _this select 1;
	if (_keyCode in (actionKeys "showMap")) exitWith
	{
		private _playersNearby = (getPosATL player) nearObjects ["Man",5];
		private _result = false;

		{
			if ("ItemMap" in (assignedItems _x)) exitWith {_result = true};
		} forEach _playersNearby;

		if (_result) then
		{
			[] spawn
			{
				player addItem "ItemMap";
				player assignItem "ItemMap";
				openMap true;
				waitUntil { !(visibleMap) };
				player unassignItem "ItemMap";
				player removeItem "ItemMap";
			};
		};
		_result
	};
}];	

  • 0

#5 OFFLINE   TopDen

TopDen

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

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

Отправлено 21 June 2019 - 16:12

Спасибо. Есть нубский вопрос.

- в редакторе через дебаг-консоль работает. попытался запустить в init.sqf как скрипт [] execvm "map.sqf"; - не работает.
добавил строку while {true} do {ваш скрипт}; - работает и выключить карту можно только через esc и я так понимаю что проверка идет постоянно. Можно как-то его запускать "только в нужный момент"? Или как правильно запустить ваш скрипт?

 

2. карта удаляется у любого у кого она есть после ее открытия\закрытия.?? (а предполагалось что она удалиться у того, у кого ее и не было и кто ее смотрел от другого игрока)
 


Сообщение отредактировал TopDen: 21 June 2019 - 16:29

  • 0

#6 OFFLINE   nIkRon

nIkRon

    Сержант

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

Отправлено 21 June 2019 - 20:23

TopDen, 1. Вы исполняете его, когда 46 дисплей еще не загрузился, поэтому он и не работает, добавьте перед исполнением это:

waitUntil {sleep 0.5; !isNull (findDisplay 46)};

И лучше поместите не в init.sqf, а в скрипт где у вас происходит "загрузка" персонажа. Ну или на крайняк в initPlayerLocal.sqf

А этим действием: while {true} do {ваш скрипт}; вы запустили его ОВЕР много раз.

2. Да, не подумал об этом, вот исправление:

(findDisplay 46) displayAddEventHandler ["KeyDown",{
	private _keyCode = _this select 1;
	if (_keyCode in (actionKeys "showMap") && { !("ItemMap" in (assignedItems player))}) exitWith
	{
		private _playersNearby = (getPosATL player) nearObjects ["Man",5];
		private _result = false;

		{
			if ("ItemMap" in (assignedItems _x)) exitWith {_result = true};
		} forEach _playersNearby;

		if (_result) then
		{
			[] spawn
			{
				player addItem "ItemMap";
				player assignItem "ItemMap";
				openMap true;
				waitUntil { !(visibleMap) };
				player unassignItem "ItemMap";
				player removeItem "ItemMap";
			};
		};
	};
}];	

Карта закрывается и через свою кнопку, проблем с этим нет(проверил). И что вы имеете ввиду "Можно как-то его запускать "только в нужный момент""


Если вы хотите запускать его допустим только когда игрок в триггере(просто к примеру), тогда делаете так:
mapEventHandler = скрипт; //Когда нужно включить
(findDisplay 46) displayRemoveEventHandler ["keyDown",mapEventHandler]; //Когда нужно выключить его


Сообщение отредактировал nIkRon: 21 June 2019 - 20:19

  • 1

#7 OFFLINE   TopDen

TopDen

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

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

Отправлено 21 June 2019 - 21:26

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

		if (_result) then
		{
			[] spawn
			{
                         params ["_х"];
				player addItem "ItemMap";
				player assignItem "ItemMap";
				openMap true;
                        hint format ["Вы смотрите карту %1", name _х];
				waitUntil { !(visibleMap) };
				player unassignItem "ItemMap";
				player removeItem "ItemMap";
			};
		};

  • 0

#8 OFFLINE   nIkRon

nIkRon

    Сержант

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

Отправлено 21 June 2019 - 21:54   Лучший Ответ

1. Вы пытаетесь получить _x после выполнения вызова через spawn, там его попросту не может быть. 
2. Что-бы получить данные в [] spawn {код}; их нужно вставить в массив перед "spawn" >> "[_player, _playerName] spawn {код};"
 

(findDisplay 46) displayAddEventHandler ["KeyDown",{
	private _keyCode = _this select 1;
	if (_keyCode in (actionKeys "showMap") && { !("ItemMap" in (assignedItems player))}) exitWith
	{
		private _playersNearby = (getPosATL player) nearObjects ["Man",5];
		private _result = false;
                private _playerWithMap = objNull;

		{
			if ((isPlayer _x) && { ("ItemMap" in (assignedItems _x)) }) exitWith {_result = true; _playerWithMap = _x;};
		} forEach _playersNearby;

		if (_result) then
		{
			hint format ["Вы смотрите карту %1", (name _playerWithMap)];
			[] spawn
			{
				player addItem "ItemMap";
				player assignItem "ItemMap";
				openMap true;
				waitUntil { !(visibleMap) };
				player unassignItem "ItemMap";
				player removeItem "ItemMap";
			};
		};
	};
}];	

Если вам нужно было что-бы работало только с игроками, то выше переделанный вариант, прошлый работал и с ботами.


Сообщение отредактировал nIkRon: 21 June 2019 - 21:56

  • 1

#9 OFFLINE   TopDen

TopDen

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

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

Отправлено 25 August 2019 - 14:51

Здравствуйте добрые парни опять) возник наверно нубский вопрос, но не могу понять... вышенаписанный скрипт работает в дебаг-консоли если запустить локально.
а если в initplayerlocal.sqf пишу  []execvm "myscript.sqf";  с вышеизложенным скриптом, то не работает. ни ошибок ни чего. В чем может быть проблема?

( и в init.sqf не работает, и в initserver.sqf тоже не работает)


  • 0

#10 OFFLINE   Schatten

Schatten

    Капитан

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

Отправлено 25 August 2019 - 15:12

TopDen, измени myscript.sqf:

_display = displayNull;

waitUntil {
    _display = findDisplay 46;

    !(isNull _display)
};

_display displayAddEventHandler...

  • 0

#11 OFFLINE   nIkRon

nIkRon

    Сержант

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

Отправлено 25 August 2019 - 15:57

TopDenhttps://arma3.ru/for...rty/#entry82554 вы ведь уже задавали этот вопрос, ответ был в первом пункте, нужно быть немножко внимательнее.


  • 1

#12 OFFLINE   TopDen

TopDen

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

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

Отправлено 25 August 2019 - 20:57

nIkRon,  старею. прости пожалуйста)


  • 0




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