Перейти к содержанию
Авторизация  
StDIABLO

Магия в работе скриптов :)

Рекомендуемые сообщения

Доброй вечер всем.

 

Собственно есть скрипт А, который формирует массив.

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. 

 

Есть идеи почему такое возможно? Или как это избежать?

 

Заранее спасибо

 
 
 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Немного добавил  дебаг кода

Самое начало 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. но я не могу понять почему так. Направьте на путь истинный если знаете или сталкивались с подобным.

 

 

 

 

post-1837-0-41261300-1425815103.jpg

post-1837-0-81372100-1425815234.jpg

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Почему A и B не в одном потоке выполняешь?

Уверен, что первый ящик не из-за этого удаляется:

if ((base distance _x) < 5) then {qrstatus2 = qrstatus1 - [_x]} else {

Попробуй в sence вместо _this select 3 юзать глобальную qrstatus2

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Почему 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)
Изменено пользователем StDIABLO

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Что надо сделать чтобы при старте игры мне написало world (сейчас постоянно пишет hello)

Если ты это делаешь в ините или в файле, который вызывается через execVM, то поставить sleep 0.1 перед hint

Изменено пользователем swatSTEAM

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Как я и догодывался, что проблема не в коде, а в понимании того как этот код в a2 работает

 

суть проблемы в том что  код

if (vehiclevarname player == "qt1") then {
smellHandler = player addAction ["test", "sense.sqf",qrstatus2,-1,false,true,"","Cooldown < 1"];
}; 

выполняется в коде 1 раз, и вычистление qrstatus2 происходит именно во время выполнения кода, как бы я не старался менять qrstatus2 после кода выше - выполняться акшен будет только со старым значением.

 

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

 

Сделал как ты хотел - в сенс меняю входной массив и все пашет отлично

 

Спасибо за помощь. 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

На самом деле, обычные переменные точно передаются по значению, а вот массивы должны передаваться по адресу. Обычно. Но это зависит от настроения самой Армы больше. Я вообще к тому, что:
 

arr1 = [1,2,3];
arr2 = arr1;
arr1 = arr1 - [3];
hint str arr1; //[1,2]
hint str arr2; //[1,2]

И это правильно.

Но _this видимо копернула значение, вместо адреса. Это очень глупо и неправильно, да.

Изменено пользователем swatSTEAM

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Для публикации сообщений создайте учётную запись или авторизуйтесь

Вы должны быть пользователем, чтобы оставить комментарий

Создать учетную запись

Зарегистрируйте новую учётную запись в нашем сообществе. Это очень просто!

Регистрация нового пользователя

Войти

Уже есть аккаунт? Войти в систему.

Войти
Авторизация  

  • Последние посетители   0 пользователей онлайн

    Ни одного зарегистрированного пользователя не просматривает данную страницу

×

Важная информация

Мы разместили cookie-файлы на ваше устройство, чтобы помочь сделать этот сайт лучше. Вы можете изменить свои настройки cookie-файлов, или продолжить без изменения настроек.