Jump to content
Sign in to follow this  
StDIABLO

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

Recommended Posts

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

 

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

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. 

 

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

 

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

 
 
 

Share this post


Link to post
Share on other sites

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

Самое начало 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

Share this post


Link to post
Share on other sites

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

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

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

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

Share this post


Link to post
Share on other sites

Почему 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)
Edited by StDIABLO

Share this post


Link to post
Share on other sites

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

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

Edited by swatSTEAM

Share this post


Link to post
Share on other sites

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

 

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

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

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

 

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

 

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

 

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

Share this post


Link to post
Share on other sites

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

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

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

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

Edited by swatSTEAM

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
Sign in to follow this  

  • Recently Browsing   0 members

    No registered users viewing this page.

×

Important Information

We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.