StDIABLO 506 Жалоба Опубликовано 7 марта, 2015 Доброй вечер всем. Собственно есть скрипт А, который формирует массив. 0 spawn { if (isServer) then { while {true} do { { if !(alive _x) then {qalive = qalive - [_x]}; _xq=_x; _qstat=false; _vehtemp=0; { if (_xq in (_x call ACE_fnc_listCargo)) then {_qstat=true;_vehtemp=_x}; } foreach allmissionobjects "LandVehicle"; if (!_qstat) then {qrstatus1 set [_forEachIndex,_x]}; if (_qstat) then {qrstatus1 set [_forEachIndex,_vehtemp]}; } foreach qalive; sleep 5; }; }; }; Есть скрипт Б который немного модифицирует массив от первого скрипта 0 spawn { if (isServer) then { while {true} do { { if !(alive _x) then {qrstatus1 = qrstatus1 - [_x]}; if ((base distance _x) < 5) then {qrstatus2 = qrstatus1 - [_x]} else { if !(_x in qrstatus1) then {qrstatus2 = qrstatus1 + [_x]};};//если на базе исключаем //if ({qrstatus1 find _x}==-1) } foreach qrstatus1; //qrstatus2=qrstatus1; sleep 5; }; }; }; В игре лежат 4 ящика q1,q2,q3,q4, я беру любой ящик (к примеру q4) отношу его к base нажимаю hint str qrstatus2 вижу q1,q2,q3 - вроде бы нормально но, есть еще код if (vehiclevarname player == "qt1") then { smellHandler = player addAction ["test", "sense.sqf",qrstatus2,-1,false,true,"","Cooldown < 1"]; }; я пробую выполнить код (в принципе простой поиск ближайших ящиков из массива, он настроен и работает) но мне в ответ дает что самый ближайший объект q4, он конечно ближайший, но не находится в qrstatus2 и должен игнорироваться мной... но все равно меня ведут на q4. Есть идеи почему такое возможно? Или как это избежать? Заранее спасибо Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты
StDIABLO 506 Жалоба Опубликовано 8 марта, 2015 Немного добавил дебаг кода Самое начало init.sqf qalive= [q1,q2,q3,q4]; //живые ящики qrstatus1=[q1,q2,q3,q4]; //ящики после первой итерации qrstatus2=[q1,q2,q3,q4]; //ящики после второй итерации в самом начале миссии qalive= qrstatus1=qrstatus2 и это нормально. потом их статус может измениться к примеру qalive= [q1,q2,q4]; //3тий ящик уничтожен qrstatus1=[u_1,u_2,q4]; //Ящики q1 и q2 в машинах u_1 и u_2, q4 стоит на земле (предположим рядом с базой) qrstatus2=[u_1,u_2]; //ящики которые надо искать (q4 искать не надо т.к он стоит на базе) ну и собственно qrstatus2 передается в sense.sqf, там он: private ["_banana", "_bananaRange", "_dirTobanana"]; //Cooldown = 0; hint str (_this select 3); // дебаг, проверяю что пришло sleep 5; _cnt = (count (_this select 3) - 1); _dist=[]; for "_k" from 0 to _cnt do { _dist set [_k,(player distance ((_this select 3) select _k))]; }; hint str _dist; _min = 90000; //найти ближайший ящик или машину for "_i" from 0 to _cnt do { _min = _min min (_dist select _i); }; _banana = _this select 3 select (_dist find _min); if (player distance _banana < 5000) then { вроде все норм, но во время выполнения скрипта sense.sqf почему то передается неправильный qrstatus2. но я не могу понять почему так. Направьте на путь истинный если знаете или сталкивались с подобным. Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты
swatSTEAM 737 Жалоба Опубликовано 9 марта, 2015 Почему A и B не в одном потоке выполняешь? Уверен, что первый ящик не из-за этого удаляется: if ((base distance _x) < 5) then {qrstatus2 = qrstatus1 - [_x]} else { Попробуй в sence вместо _this select 3 юзать глобальную qrstatus2 Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты
StDIABLO 506 Жалоба Опубликовано 9 марта, 2015 (изменено) Почему A и B не в одном потоке выполняешь? Да я уже немного переписал код :) понял ошибки сейчас это выглядит вот так, вроде бы лишнее убрал Cooldown = 0; qalive= [q1,q2,q3,q4]; qrstatus1=[]; qrs_ru=[]; qrs_us=[]; 0 spawn { if (isServer) then { while {true} do { qrstatus1=[]; qrs_ru=[]; qrs_us=[]; { if !(alive _x) then {qalive = qalive - [_x]}; _xq=_x; _qstat=false; _vehtemp=0; { if (_xq in (_x call ACE_fnc_listCargo)) then {_qstat=true;_vehtemp=_x}; } foreach allmissionobjects "LandVehicle"; if (_qstat) then {qrstatus1 set [_forEachIndex,_vehtemp]} else {qrstatus1 set [_forEachIndex,_x]}; } foreach qalive; publicVariable "qrstatus1"; { if ((shron_ru distance _x) < 5) then {qrs_ru = qrs_ru - [_x]} else {qrs_ru = qrs_ru + [_x]};//если на базе ru исключаем if ((shron_us distance _x) < 5) then {qrs_us = qrs_us - [_x]} else {qrs_us = qrs_us + [_x]};//если на базе us исключаем } foreach qrstatus1; publicVariable "qrs_ru"; publicVariable "qrs_us"; sleep 5; }; }; }; if (vehiclevarname player == "qt1") then { smellHandler = player addAction ["Найти", "sense.sqf",qrs_ru,-1,false,true,"","Cooldown < 1"]; }; мне просто интересно при этом коде почему у меня на входе скрипта приходит пустой массив (как будто qrs_ru вообще не меняется в коде) , а не то что мне надо. почему не хочу вписывать глобальную переменную в sense.sqf : У меня 2 стороны, а скрипт в принципе одинаковый, за исключением входных параметров (массива из нужных q1,q2,q3,q4.... Уверен, что первый ящик не из-за этого удаляется Уверен, что первый ящик не из-за этого удаляется: В том то и дело что все удаляется правильно, на первой картинке правильный qrstatus2 на второй qrstatus2 когда произошел вызов функции. и там должен быть именно массив с первой картинки (по моей логике). ==================================== Окей упрощаем задачку hellomsg="hello"; 0 spawn { hellomsg="world"; }; hint hellomsg; Что надо сделать чтобы при старте игры мне написало world (сейчас постоянно пишет hello) Изменено 9 марта, 2015 пользователем StDIABLO Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты
swatSTEAM 737 Жалоба Опубликовано 10 марта, 2015 (изменено) Что надо сделать чтобы при старте игры мне написало world (сейчас постоянно пишет hello) Если ты это делаешь в ините или в файле, который вызывается через execVM, то поставить sleep 0.1 перед hint Изменено 10 марта, 2015 пользователем swatSTEAM Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты
StDIABLO 506 Жалоба Опубликовано 11 марта, 2015 Как я и догодывался, что проблема не в коде, а в понимании того как этот код в a2 работает суть проблемы в том что код if (vehiclevarname player == "qt1") then { smellHandler = player addAction ["test", "sense.sqf",qrstatus2,-1,false,true,"","Cooldown < 1"]; }; выполняется в коде 1 раз, и вычистление qrstatus2 происходит именно во время выполнения кода, как бы я не старался менять qrstatus2 после кода выше - выполняться акшен будет только со старым значением. Я по наивности считал что там не переменные в явном виде, а указатель на нее. Сделал как ты хотел - в сенс меняю входной массив и все пашет отлично Спасибо за помощь. Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты
swatSTEAM 737 Жалоба Опубликовано 11 марта, 2015 (изменено) На самом деле, обычные переменные точно передаются по значению, а вот массивы должны передаваться по адресу. Обычно. Но это зависит от настроения самой Армы больше. Я вообще к тому, что: arr1 = [1,2,3]; arr2 = arr1; arr1 = arr1 - [3]; hint str arr1; //[1,2] hint str arr2; //[1,2] И это правильно. Но _this видимо копернула значение, вместо адреса. Это очень глупо и неправильно, да. Изменено 11 марта, 2015 пользователем swatSTEAM 1 StDIABLO отреагировал на это Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты