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


Фотография

Проверка снаряжения по белому списку


Лучший Ответ dos622 , 12 July 2016 - 09:40

можно.

Я делал примерно так:

{
if !(_x in _b) then {

_num= _a find _x; //ищем элемент в нутри массива а
_a deleteAt _num; //удаляем элемент из массива

//если нужно заменить то:
_a set [_num,"MyBigGun"];

};

} forEach _a;

отцов сильно прошу не пинать, рано, сплю еще:)

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


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

#1 OFFLINE   wolf2285

wolf2285

    Ефрейтор

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

Отправлено 11 July 2016 - 23:29

_A=["тест1",[["rhs_uniform_mflora_patchless",[]],["",[]],["",[]],"","","",["rhs_weap_akms",["rhs_acc_dtk1l","rhs_acc_2dpZenit","",""],"rhs_30Rnd_762x39mm"],["",["","","",""],""],["",["","","",""],""],[],["Default","ACE_NoVoice",""]],"тест2",[["rhs_uniform_mflora_patchless",["rhs_30Rnd_762x39mm"]],["",[]],["",[]],"","","",["rhs_weap_ak103_2",["rhs_acc_dtk","rhs_acc_2dpZenit","rhs_acc_ekp1",""],"rhs_30Rnd_762x39mm"],["",["","","",""],""],["",["","","",""],""],[],["Default","ACE_NoVoice",""]]];
_B=["rhs_uniform_mflora_patchless","rhs_weap_akms"];

Добрый день подскажите пожалуйста.Есть массив _А это сохранение виртуального арсенала в данном случае Тест1 и Тест2 .Возможно ли как то сравнить оружие и униформу с сохранения  с массивом _В?И в случае несовпадения оружия например  удалить из массива сохранение или  заменить несовпадающее оружие или униформу на заранее созданный шаблон.Или просто удалить оружие из этого сохранения.На выше приведенных примерах например нет совпадения оружия со списком _В в сохранении ТЕСТ2.


Сообщение отредактировал wolf2285: 11 July 2016 - 23:34

  • 0

#2 OFFLINE   dos622

dos622

    Ст. Прапорщик

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

Отправлено 12 July 2016 - 09:40   Лучший Ответ

можно.

Я делал примерно так:

{
if !(_x in _b) then {

_num= _a find _x; //ищем элемент в нутри массива а
_a deleteAt _num; //удаляем элемент из массива

//если нужно заменить то:
_a set [_num,"MyBigGun"];

};

} forEach _a;

отцов сильно прошу не пинать, рано, сплю еще:)


  • 0

#3 OFFLINE   wolf2285

wolf2285

    Ефрейтор

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

Отправлено 15 July 2016 - 11:42

можно.

Я делал примерно так:

{
if !(_x in _b) then {

_num= _a find _x; //ищем элемент в нутри массива а
_a deleteAt _num; //удаляем элемент из массива

//если нужно заменить то:
_a set [_num,"MyBigGun"];

};

} forEach _a;

отцов сильно прошу не пинать, рано, сплю еще :)

спасибо за подсказку работает.правда пришлось немного дописать чтобы конкретно с таким массивом работало. 


Сообщение отредактировал wolf2285: 15 July 2016 - 11:43

  • 0

#4 OFFLINE   wolf2285

wolf2285

    Ефрейтор

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

Отправлено 18 July 2016 - 15:29

добрый день по этому вопросу получилась вот такая вот петрушка

w2_black_weap = [список запрещенного оружия];
_saved_loadouts_x = profileNamespace getVariable "bis_fnc_saveInventory_data";//получаем массив сохранений арсенала в виде массива _a в первом посте
_result = count _saved_loadouts_x;
_res2=_result/2;
	
	_select=-1;
	_select_u=-1;
	_select_r=-1;

for "_i" from 1 to _res2 do {
_select=_select+2;

{

if (_x in w2_black_weap) then {

_num= ((_saved_loadouts_x select _select) select 6) find _x; //ищем элемент в нутри массива а

((_saved_loadouts_x select _select) select 6)set [_num,"rhs_weap_akms"];

};

} forEach ((_saved_loadouts_x select _select) select 6);

};
//uniform
for "_i" from 1 to _res2 do {
_select_u=_select_u+2;

{

if (_x in w2_black_weap) then {

_num2= ((_saved_loadouts_x select _select_u) select 0) find _x; //ищем элемент в нутри массива а

((_saved_loadouts_x select _select_u) select 0)set [_num2,"rhs_uniform_vdv_flora"];

};

} forEach ((_saved_loadouts_x select _select_u) select 0);

};
//###################RPG###################################
for "_i" from 1 to _res2 do {
_select_r=_select_r+2;

{

if (_x in w2_black_weap) then {

_num_rpg= ((_saved_loadouts_x select _select_r) select 7) find _x; //ищем элемент в нутри массива а

((_saved_loadouts_x select _select_r) select 7)set [_num_rpg,"rhs_weap_rpg7"];

};

} forEach ((_saved_loadouts_x select _select_r) select 7);

};
//####конец##################
_saved_loadouts_x

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


  • 0

#5 OFFLINE   SteelRat

SteelRat

    Полковник

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

Отправлено 18 July 2016 - 16:54

Не в этом скрипте, а где то в другом месте у вас сохраняется новое состояние инвентаря в profileNamespace

 

Если причина не в этом, попробуйте так

_saved_loadouts_x = [] + (profileNamespace getVariable "bis_fnc_saveInventory_data");//получаем массив сохранений арсенала в виде массива _a в первом посте

дело в том, что этой командой

profileNamespace getVariable "bis_fnc_saveInventory_data"

вы получаете не новый массив, а ссылку на массив, и внося изменения в переменную _saved_loadouts_x, вы вносите изменения в сохранённые данные.

Это не диагноз, а в большой степени предположение.


Сообщение отредактировал SteelRat: 18 July 2016 - 17:12

  • 0

#6 OFFLINE   wolf2285

wolf2285

    Ефрейтор

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

Отправлено 18 July 2016 - 17:25

Не в этом скрипте, а где то в другом месте у вас сохраняется новое состояние инвентаря в profileNamespace

 

Если причина не в этом, попробуйте так

_saved_loadouts_x = [] + (profileNamespace getVariable "bis_fnc_saveInventory_data");//получаем массив сохранений арсенала в виде массива _a в первом посте

дело в том, что этой командой

profileNamespace getVariable "bis_fnc_saveInventory_data"

вы получаете не новый массив, а ссылку на массив, и внося изменения в переменную _saved_loadouts_x, вы вносите изменения в сохранённые данные.

Это не диагноз, а в большой степени предположение.

Ну дело именно в этом коде.Я специально создал пустую миссию только с этим скриптом.Поставил арсенал.Создал сохранения.И после отработки скрипта все сохранения переписались.Значит дело именно в этом коде.

_saved_loadouts_x = [] + (profileNamespace getVariable "bis_fnc_saveInventory_data"); 

Не прокатывает. Все равно зараза переписывает.


Сообщение отредактировал wolf2285: 18 July 2016 - 18:00

  • 0

#7 OFFLINE   dos622

dos622

    Ст. Прапорщик

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

Отправлено 18 July 2016 - 18:31

//если нужно заменить то:
_a set [_num,"MyBigGun"];

возможно я не догоняю, но вот именно set и должен заменять значения в массиве.


  • 0

#8 OFFLINE   wolf2285

wolf2285

    Ефрейтор

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

Отправлено 18 July 2016 - 18:55

//если нужно заменить то:
_a set [_num,"MyBigGun"];

возможно я не догоняю, но вот именно set и должен заменять значения в массиве.

 

С этим проблем нет.Все работает как надо.Код выполняет свою функцию.Здесь получается загружается массив с сохранениями из виртуального арсенала  _saved_loadouts_x.Редактируется если надо с помощью кода выше.т.е удаляется запрещенное оружие ,одежда,рпг и заменяется на шаблонное.И уже отредактированные сохранения выводятся в GUI.т.е игрок не сможет загрузить ванильную имба пушку из сохранения.Это все работает.Но вместе с тем в самом виртуальном арсенале все сохранения тоже переписываются.Если игрок зайдет ко мне в миссию и откроет арсенал то все имеющиеся сохранения оружия у него перепишутся.Ванильное оружие заменится в данном случае на от RHS.


Сообщение отредактировал wolf2285: 18 July 2016 - 19:01

  • 0

#9 OFFLINE   SteelRat

SteelRat

    Полковник

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

Отправлено 18 July 2016 - 22:17

Тогда придётся не редактировать этот оригинальный массив, а использовать из него только данные.

_saved_loadouts_x = profileNamespace getVariable "bis_fnc_saveInventory_data"; 

Придётся не много переписать скрипт под такой подход

_saved_loadouts = profileNamespace getVariable "bis_fnc_saveInventory_data";
_new_loadouts = [];

то есть, скопировать данные из массива _saved_loadouts в массив _new_loadouts, по пути редактируя данные.

и отдавать из скрипта массив _new_loadouts.


Сообщение отредактировал SteelRat: 18 July 2016 - 22:26

  • 0

#10 OFFLINE   SteelRat

SteelRat

    Полковник

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

Отправлено 18 July 2016 - 22:28

Как вариант, а не может ли GUI сохранять изменения в профиль?

Что за GUI кстати?


  • 0

#11 OFFLINE   wolf2285

wolf2285

    Ефрейтор

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

Отправлено 18 July 2016 - 22:48

Как вариант, а не может ли GUI сохранять изменения в профиль?

Что за GUI кстати?

Дело именно в этом коде.Я специально создал пустую миссию отдельную только с этим скриптом чтобы проверить.Поставил арсенал виртуальный.Открываю арсенал все сохранения в норме.Запускаю через консоль отладки этот скрипт.Захожу в арсенал и сохранения уже переписаны.

GUI вот такое.чтобы быстро загрузить сохраненное снаряжение не открывая арсенала.

Прикрепленные файлы


Сообщение отредактировал wolf2285: 18 July 2016 - 22:50

  • 0

#12 OFFLINE   SteelRat

SteelRat

    Полковник

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

Отправлено 19 July 2016 - 01:12

 

Открываю арсенал все сохранения в норме.Запускаю через консоль отладки этот скрипт.Захожу в арсенал и сохранения уже переписаны.

 

Как бы предположение подтверждается

 

дело в том, что этой командой

profileNamespace getVariable "bis_fnc_saveInventory_data"

вы получаете не новый массив, а ссылку на массив, и внося изменения в переменную _saved_loadouts_x, вы вносите изменения в сохранённые данные.

то есть, изменяя массив _save_loadouts_x вы изменяете "bis_fnc_saveInventory_data"

кстати, профильные данные изменяются на всегда или только на текущую сессию, то есть, если после этого рестартнуть миссию профиль сохраняет свой оригинальный вид?

 

лекарство я уже предложил, надо пробовать)

https://arma3.ru/for...spisku/?p=67149


  • 0

#13 OFFLINE   SteelRat

SteelRat

    Полковник

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

Отправлено 19 July 2016 - 01:22

ЗЫ

Какую функцию используете для загрузки выбранного набора в перса?


ЗЫ_2

Блин, здесь что то другое.

Дайте тестовую миссию.


  • 0

#14 OFFLINE   wolf2285

wolf2285

    Ефрейтор

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

Отправлено 19 July 2016 - 02:15

ЗЫ

Какую функцию используете для загрузки выбранного набора в перса?


ЗЫ_2

Блин, здесь что то другое.

Дайте тестовую миссию.

Вот тест миссия.Сначала в арсенале создать сохранения и потом запустить скрипт.требуется рхс.Скрипт рассчитан чтобы осталось оружие РХС РФ.Если не хотите чтобы ваши сохранения затерло сделайте копию файла    .vars.Arma3Profile чтобы восстановить потом.По поводу лекарства буду пробовать.

Прикрепленные файлы


Сообщение отредактировал wolf2285: 19 July 2016 - 02:20

  • 0

#15 OFFLINE   SteelRat

SteelRat

    Полковник

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

Отправлено 19 July 2016 - 03:30

 

Если не хотите чтобы ваши сохранения затерло

Я не хочу больше с РХС запариваться), которым я не пользуюсь)


  • 0

#16 OFFLINE   SteelRat

SteelRat

    Полковник

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

Отправлено 19 July 2016 - 03:35

осталось не озвученным

 

Какую функцию используете для загрузки выбранного набора в перса?


  • 0

#17 OFFLINE   SteelRat

SteelRat

    Полковник

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

Отправлено 19 July 2016 - 03:54

на заметку, вот так, кому то другому, будет намного легче осмыслить от чье жопы яйца, не ленитесь логично визуально структурировать блоки кода в скриптах

private [ "_saved_loadouts_x", "_result", "_res2"];
//_saved_loadouts_x = _this select 0;
hint "старт";

_saved_loadouts_x = profileNamespace getVariable "bis_fnc_saveInventory_data";
_result = count _saved_loadouts_x;
_res2=_result/2;
	
_select=-1;
_select_u=-1;
_select_r=-1;

hint "оружие";
for "_i" from 1 to _res2 do {
	_select = _select + 2;

	{
		if (_x in w2_black_weap) then {
			_num = ((_saved_loadouts_x select _select) select 6) find _x;
			((_saved_loadouts_x select _select) select 6) set [_num, "rhs_weap_akms"];
		};
	} forEach ((_saved_loadouts_x select _select) select 6);
};

//uniform
hint "униформа";
for "_i" from 1 to _res2 do {
	_select_u = _select_u + 2;

	{
		if (_x in w2_black_weap) then {
			_num2= ((_saved_loadouts_x select _select_u) select 0) find _x;
			((_saved_loadouts_x select _select_u) select 0) set [_num2, "rhs_uniform_vdv_flora"];
		};
	} forEach ((_saved_loadouts_x select _select_u) select 0);

};

//###################RPG###################################
hint "рпг";
for "_i" from 1 to _res2 do {
	_select_r=_select_r+2;

	{
		if (_x in w2_black_weap) then {
			_num_rpg= ((_saved_loadouts_x select _select_r) select 7) find _x;
			((_saved_loadouts_x select _select_r) select 7) set [_num_rpg,"rhs_weap_rpg7"];
		};
	} forEach ((_saved_loadouts_x select _select_r) select 7);

};

//####конец рпг##################
_saved_loadouts_x

Сообщение отредактировал SteelRat: 19 July 2016 - 03:55

  • 0

#18 OFFLINE   SteelRat

SteelRat

    Полковник

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

Отправлено 19 July 2016 - 04:07

Для меня это на грани откровения, однако)

Но похоже эта конструкция модифицирует профильную переменную

_saved_loadouts_x = profileNamespace getVariable "bis_fnc_saveInventory_data";
...
((_saved_loadouts_x select _select) select 6) set [_index, "class_name"];

но это не должно вносить изменения в сам файл где хранятся профильные переменные, что бы перезаписать файл нужно применить команду на сохранение изменений в файле профиля.

 

Получается так что после отработки скрипта меняется состояние профильной переменной только в памяти, при повторном запуске миссии, будут считаны сохранённые данные из файла, которые должны быть такими какими были на момент сохранения в арсенале.

 

Как то так.


  • 0

#19 OFFLINE   wolf2285

wolf2285

    Ефрейтор

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

Отправлено 19 July 2016 - 04:10

 

на заметку, вот так, кому то другому, будет намного легче осмыслить от чье жопы яйца, не ленитесь логично визуально структурировать блоки кода в скриптах

private [ "_saved_loadouts_x", "_result", "_res2"];
//_saved_loadouts_x = _this select 0;
hint "старт";

_saved_loadouts_x = profileNamespace getVariable "bis_fnc_saveInventory_data";
_result = count _saved_loadouts_x;
_res2=_result/2;
	
_select=-1;
_select_u=-1;
_select_r=-1;

hint "оружие";
for "_i" from 1 to _res2 do {
	_select = _select + 2;

	{
		if (_x in w2_black_weap) then {
			_num = ((_saved_loadouts_x select _select) select 6) find _x;
			((_saved_loadouts_x select _select) select 6) set [_num, "rhs_weap_akms"];
		};
	} forEach ((_saved_loadouts_x select _select) select 6);
};

//uniform
hint "униформа";
for "_i" from 1 to _res2 do {
	_select_u = _select_u + 2;

	{
		if (_x in w2_black_weap) then {
			_num2= ((_saved_loadouts_x select _select_u) select 0) find _x;
			((_saved_loadouts_x select _select_u) select 0) set [_num2, "rhs_uniform_vdv_flora"];
		};
	} forEach ((_saved_loadouts_x select _select_u) select 0);

};

//###################RPG###################################
hint "рпг";
for "_i" from 1 to _res2 do {
	_select_r=_select_r+2;

	{
		if (_x in w2_black_weap) then {
			_num_rpg= ((_saved_loadouts_x select _select_r) select 7) find _x;
			((_saved_loadouts_x select _select_r) select 7) set [_num_rpg,"rhs_weap_rpg7"];
		};
	} forEach ((_saved_loadouts_x select _select_r) select 7);

};

//####конец рпг##################
_saved_loadouts_x

Возьму на заметку.В данный момент я редактирую уже готовую миссию.Вот скрипт где варится  вся каша.

private [ "_loadouts_data", "_saved_loadouts", "_counter", "_loadplayers", "_playerselected", "_namestr", "_nextplayer" ];

load_loadout = 0;
edit_loadout = 0;
respawn_loadout = 0;
load_from_player = -1;
exit_on_load = 0;
createDialog "liberation_arsenal";

_saved_loadouts = profileNamespace getVariable "bis_fnc_saveInventory_data";
_loadouts_data = [];
_counter = 0;
if ( !isNil "_saved_loadouts" ) then {
	{
		if ( _counter % 2 == 0 ) then {
			_loadouts_data pushback _x;
		};
		_counter = _counter + 1;
	} foreach _saved_loadouts;
};

waitUntil { dialog };

if ( count _loadouts_data > 0 ) then {

	{ lbAdd [201, _x]; } foreach _loadouts_data ;

	if ( lbSize 201 > 0 ) then {
		ctrlEnable [ 202, true ];
		lbSetCurSel [ 201, 0 ];
	} else {
		ctrlEnable [ 202, false ];
	};

} else {
	ctrlEnable [ 202, false ];
};

_loadplayers = [];
{
	if ( !(name _x in [ "HC1", "HC2", "HC3" ]) )  then {
		_loadplayers pushback [ name _x, _x ];
	};
} foreach ( allPlayers - [ player ] );

if ( count _loadplayers > 0 ) then {

	{
		_nextplayer = _x select 1;
		_namestr = "";
		if(count (squadParams _nextplayer) != 0) then {
			_namestr = "[" + ((squadParams _nextplayer select 0) select 0) + "] ";
		};
		_namestr = _namestr + name _nextplayer;

		lbAdd [ 203, _namestr ];
		lbSetCurSel [ 203, 0 ];
	} foreach _loadplayers;

} else {
	ctrlEnable [ 203, false ];
	ctrlEnable [ 204, false ];
};

((findDisplay 5251) displayCtrl 201) ctrlAddEventHandler [ "mouseButtonDblClick" , { exit_on_load = 1; load_loadout = 1; } ];

while { dialog && (alive player) && edit_loadout == 0 } do {

	if ( load_loadout > 0 ) then {
		private _loaded_loadout = _loadouts_data select (lbCurSel 201);
		[player, [profileNamespace, _loaded_loadout]] call bis_fnc_loadInventory;
		[ player ] call F_correctLaserBatteries;
		hint format [ localize "STR_HINT_LOADOUT_LOADED", _loaded_loadout];
		if ( exit_on_load == 1 ) then {
			closeDialog 0;
		};
		load_loadout = 0;
	};

	if ( respawn_loadout > 0 ) then {
		GRLIB_respawn_loadout = [ player, ["repetitive"] ] call F_getLoadout;
		hint localize "STR_MAKE_RESPAWN_LOADOUT_HINT";
		respawn_loadout = 0;
	};

	if ( load_from_player >= 0 ) then {
		_playerselected = ( _loadplayers select load_from_player ) select 1;
		if ( alive _playerselected ) then {
			[ player,  [ _playerselected, ["repetitive"] ] call F_getLoadout ] call F_setLoadout;
			hint format [ localize "STR_LOAD_PLAYER_LOADOUT_HINT", name _playerselected ];
		};
		load_from_player = 0;
	};

	sleep 0.1;
};

if ( edit_loadout > 0 ) then {
	closeDialog 0;
	waitUntil { !dialog };
	[ "Open", false ] spawn BIS_fnc_arsenal;
};

Я в принципе нашел другой способ попроще)) при закрытии арсенала или GUI вытаскивается снаряжение из игрока сортируется и закладывается назад.там проще немного.Но насчет этого попарюсь еще для саморазвития.


Сообщение отредактировал wolf2285: 19 July 2016 - 04:19

  • 0

#20 OFFLINE   dos622

dos622

    Ст. Прапорщик

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

Отправлено 19 July 2016 - 10:27

ну, вообще решение конечно через то самое место, но...

можно попробывать так:

взят Id игрока, и присвоить ему масив шмота по дефолту, допустим так:

_uid = getPlayerUID player;
_saved_loadouts_x = profileNamespace getVariable "bis_fnc_saveInventory_data";
_inv=[_uid,_saved_loadouts_x];

и работать с переменной _inv она будет уникальна для каждого игрока.

Далее, чтобы данные инвентаря сохранялись для каждого игрока отдельно, их нужно куда то сохранять. логично будет сохранения делать на сервере.

Создаем на сервере глобальную переменную:

 

if (isServer) then {
MegaInvData=[];
};
if (isServer) then {
ServerSaveInvPlayer={
_inv= _this select 0;
MegaInvData pushBack _int;
//забыл тут проверку нужно воткнуть, нет ли уже UID игрока внутри массива, если нет то пушбак, если есть то заменить старый.
};

"SaveInvPlayer" addPublicVariableEventHandler {(_this select 1) call ServerSaveInvPlayer};
};

if (!isDedicated) then {
SaveInvPlayer= [_inv];
publicVariableServer "SaveInvPlayer";
};

ну и запилить тоже самое только для загрузки инвентаря игроку. соответственно сделать проверку, есть ли его уид в "MegaInvData". если нет, то новый инвентарь, если есть то брать из MegaInvData.

 

Э.. кажется, меня кудато не туда понесло:)) забейте:))


Сообщение отредактировал dos622: 19 July 2016 - 10:27

  • 0




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