Jump to content


Photo

Вопросы по скриптингу

Arma3 как плотформа для созда Скритпы

  • Please log in to reply
1486 replies to this topic

#561 OFFLINE   vlad333000

vlad333000

    Полковник

  • Пользователи
  • 3224 posts
  • Откуда:Кострома

Posted 05 February 2017 - 15:34

aleksgoy, без сторонних аддонов (Нужно расширение для екзешника армы) нельзя реализовать проверку на наличие файла, без показы ошибки, можно с ошибкой как loadFile "<file>" - пустая строка - файла нету или пустой

Edited by vlad333000, 05 February 2017 - 15:35.

  • 1

#562 OFFLINE   aleksgoy

aleksgoy

    Рядовой

  • Пользователи
  • 17 posts

Posted 05 February 2017 - 15:40

Ну это файл у меня и сделан в виде аддона в папке Arma и подключен. Выглядит так: @arma3server\Addons\server.pbo и в init вызывается call compile preprocessFile. Разве нельзя его ни как определить. Или хоть примерно как это делается...


  • 0

#563 OFFLINE   aleksgoy

aleksgoy

    Рядовой

  • Пользователи
  • 17 posts

Posted 05 February 2017 - 15:46

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

Типа, if adminsUID = "758...." = (true) то миссия запускается, а если false, то был бы, к примеру, BIS_fnc_endMission


  • 0

#564 OFFLINE   vlad333000

vlad333000

    Полковник

  • Пользователи
  • 3224 posts
  • Откуда:Кострома

Posted 05 February 2017 - 16:34

aleksgoy, в арме впринципе нету команды на проверку файла! ТЫ его либо загружаешь и там какая ошибка вылезет... либо не загружаешь
Вообще вы бредом занимаетесь со своими "не сп**дить"

Edited by vlad333000, 05 February 2017 - 16:35.

  • 0

#565 OFFLINE   aleksgoy

aleksgoy

    Рядовой

  • Пользователи
  • 17 posts

Posted 05 February 2017 - 16:49

Хмм! Подковал..НУ просто должны же быть хоть какие-то авторские права. Если я, к примеру, потратил кучу времени на русификацию и модификацию миссии, обидно  будет выставлять ее публично, чтобы каждый ее запускал потом и все будут играть на его серваке, а на твой не будут заходить и будешь ты в одинокого играть...У меня просто так было, и поэтому я хочу такую ситуацию взять под контроль.

К примеру, делается же как-то серверная и клиентская части миссии. Но это сложновато...Поэтому хотя бы так.

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


  • 0

#566 OFFLINE   vlad333000

vlad333000

    Полковник

  • Пользователи
  • 3224 posts
  • Откуда:Кострома

Posted 05 February 2017 - 17:08

aleksgoy, у сервера нету UID, скипрты завязанные на ID можно будет отредактировать так как нужно, нужно делать именно серверную часть извддона, который будет сам дапускаться и выполнять действия нужные на сервере
  • 0

#567 OFFLINE   aleksgoy

aleksgoy

    Рядовой

  • Пользователи
  • 17 posts

Posted 05 February 2017 - 17:28

Это я и так понимаю. Просто я не умею писать скрыпты с нуля. Я научился только читать их и понимать о чем идет речь и что от чего зависит...Я пишу скрипты на примере других похожих, и тем самым могу дополнить их чем-нибудь. Или могу соединить несколько скриптов в один. Нужен просто примерный экземпляр скрипта...

Ну и на этом спасибо...Буду думать дальше.


  • 0

#568 OFFLINE   SteelRat

SteelRat

    Полковник

  • Пользователи
  • 3241 posts
  • Откуда:РФ

Posted 05 February 2017 - 18:08

Ну это файл у меня и сделан в виде аддона в папке Arma и подключен. Выглядит так: @arma3server\Addons\server.pbo и в init вызывается call compile preprocessFile. Разве нельзя его ни как определить. Или хоть примерно как это делается...

В конфигурационном файле любого аддона должен присутствовать класс

class CfgPatches {
	class VWE_Aftermath {
		author="$STR_VWE";
		name="Arma 3 VWE - Aftermath";
		url="http://www.arma3.com";
		units[] = {};
		weapons[] = {};
		requiredVersion = 0.1;
		requiredAddons[] = {};
	};
};

Из чего следует, можно произвести проверку на наличие нужного подключенного аддона

if (isClass(configfile >> "CfgPatches" >> "VWE_Aftermath")) then {
    // аддон подключен
} else {
    // аддон не подключен
};

Далее вызов не существующей функции, скрипта или обращение к несуществующей переменной вызывает ошибку, это так же можно использовать в качестве условия для проверки.

_code = "";

try //begin of try-catch block 
{
   //block, that can throw exception
   //пытаемся получить содержимое файла

   _code = preprocessFileLineNumbers "myFunction.sqf";

   //если файл существует исполняется строка кода следующая ниже,
   //отсутствие файла принимается как ошибка и управление передаётся в блок кода
   //следующий за оператором catch
   call compile _code;
} 
catch
{
  //block, that process an exception. Exception is described in _exception variable
  // блок кода исполняемый при отсутствии требуемого файла с кодом
  
};

Следует иметь ввиду нюанс, эта конструкция операторов работает не совсем так, как в других скриптовых и не скриптовых языках программирования, как всегда, это работает по чешски). Следует обратить внимание на комментарий в описании к команде.

Пожалуйста Войдите или Зарегистрируйтесь чтобы увидеть скрытое содержание


Edited by SteelRat, 05 February 2017 - 18:17.

  • 0

#569 OFFLINE   aleksgoy

aleksgoy

    Рядовой

  • Пользователи
  • 17 posts

Posted 05 February 2017 - 20:56

Большое спасибо!!! Очень полезная подсказка...

 

У меня еще вопрос. А будет ли работать эта команд. Сам от балды написал. На данный момент нет возможности проверить на другом UID.

Если вместо AdminUID = _a ставлю AdminUID = _b, то срабатывает.

 

AdminUID = ["76561199685902505"];
private ["_a", "_b"];
_a = true;
_b = false;
 
AdminUID = _a;
 
if (not AdminUID) then
{
titleText ["Вы не являетесь владельцем данной модификации", "BLACK OUT", 3];
sleep 5;
"LOSER" call BIS_fnc_endMission;
};

  • 0

#570 OFFLINE   aleksgoy

aleksgoy

    Рядовой

  • Пользователи
  • 17 posts

Posted 06 February 2017 - 01:40

 

Ну это файл у меня и сделан в виде аддона в папке Arma и подключен. Выглядит так: @arma3server\Addons\server.pbo и в init вызывается call compile preprocessFile. Разве нельзя его ни как определить. Или хоть примерно как это делается...

В конфигурационном файле любого аддона должен присутствовать класс

class CfgPatches {
	class VWE_Aftermath {
		author="$STR_VWE";
		name="Arma 3 VWE - Aftermath";
		url="http://www.arma3.com";
		units[] = {};
		weapons[] = {};
		requiredVersion = 0.1;
		requiredAddons[] = {};
	};
};

Из чего следует, можно произвести проверку на наличие нужного подключенного аддона

if (isClass(configfile >> "CfgPatches" >> "VWE_Aftermath")) then {
    // аддон подключен
} else {
    // аддон не подключен
};

Далее вызов не существующей функции, скрипта или обращение к несуществующей переменной вызывает ошибку, это так же можно использовать в качестве условия для проверки.

_code = "";

try //begin of try-catch block 
{
   //block, that can throw exception
   //пытаемся получить содержимое файла

   _code = preprocessFileLineNumbers "myFunction.sqf";

   //если файл существует исполняется строка кода следующая ниже,
   //отсутствие файла принимается как ошибка и управление передаётся в блок кода
   //следующий за оператором catch
   call compile _code;
} 
catch
{
  //block, that process an exception. Exception is described in _exception variable
  // блок кода исполняемый при отсутствии требуемого файла с кодом
  
};

Следует иметь ввиду нюанс, эта конструкция операторов работает не совсем так, как в других скриптовых и не скриптовых языках программирования, как всегда, это работает по чешски). Следует обратить внимание на комментарий в описании к команде.

Пожалуйста Войдите или Зарегистрируйтесь чтобы увидеть скрытое содержание

 

Что-то не срабатывает у меня. Попытался проверить на примере проверки правильности функции:

Может что не так сделал...(_function2 - это намерено ошибка, чтобы выполнялся код в блоке catch

 

private ["_function"];
 
_function = {
_var = _var + 1;
};
_var = 10;
 
try
{
 
_code = _function2;
 
call _code;
}
catch
{
titleText ["ПРИВЕТ", "BLACK OUT", 3];
sleep 5;
"LOSER" call BIS_fnc_endMission;
};

  • 0

#571 OFFLINE   Schatten

Schatten

    Капитан

  • Пользователи
  • 1844 posts

Posted 06 February 2017 - 03:53

private ["_function"];
 
_function = {
_var = _var + 1;
};
_var = 10;
 
try
{
 
_code = _function2;
 
call _code;
}
catch
{
titleText ["ПРИВЕТ", "BLACK OUT", 3];
sleep 5;
"LOSER" call BIS_fnc_endMission;
};

А здесь нет ошибки, поэтому код в блоке catch не выполнится.


  • 0

#572 OFFLINE   aleksgoy

aleksgoy

    Рядовой

  • Пользователи
  • 17 posts

Posted 06 February 2017 - 04:19

 

private ["_function"];
 
_function = {
_var = _var + 1;
};
_var = 10;
 
try
{
 
_code = _function2;
 
call _code;
}
catch
{
titleText ["ПРИВЕТ", "BLACK OUT", 3];
sleep 5;
"LOSER" call BIS_fnc_endMission;
};

А здесь нет ошибки, поэтому код в блоке catch не выполнится.

 

А как так то нет ошибки. code у меня равно функции 2, а в начале просто функция...Ну или тогда как вообще сделать ошибку  чтобы catch выполнился.!? 


  • 0

#573 OFFLINE   Schatten

Schatten

    Капитан

  • Пользователи
  • 1844 posts

Posted 06 February 2017 - 04:29

А как так то нет ошибки. code у меня равно функции 2, а в начале просто функция...

Виноват, ошибка есть.
 

Ну или тогда как вообще сделать ошибку чтобы catch выполнился.!?

Например, с помощью

Пожалуйста Войдите или Зарегистрируйтесь чтобы увидеть скрытое содержание

.


  • 0

#574 OFFLINE   aleksgoy

aleksgoy

    Рядовой

  • Пользователи
  • 17 posts

Posted 06 February 2017 - 06:27

Вопрос такой!

К примеру есть некий скрипт funcs и он до конца не загрузился. Как написать команду так, что если эта переменная не загрузилась, то выполнить какое-либо действие. типа как-то так:

if (funcs не запустился) then  

{

выполнить какое-либо действие

};


  • 0

#575 OFFLINE   Ilias

Ilias

    Прапорщик

  • Пользователи
  • 512 posts

Posted 06 February 2017 - 07:04

 

//func

//content;
true
//end;

//;

_st=true
if call func then{_st=false};
if _st then{
//no;
}

или 

if isnil |любая переменная по созданию которой можете определить| then{
//нет;
}else{
//да;
}

или

if(missionnamespace getvariable[ '|переменная|' , |что вернётся если её нет| ]isequalto |что вернётся если её нет|)then{
//нет;
}else{};

или

if(missionnamespace getvariable[ '|переменная|' , |что вернётся если её нет| ]isequalto |что бы она значила|)then{
//да;
}else{};

Edited by Ilias, 06 February 2017 - 07:21.

  • 0

#576 OFFLINE   aleksgoy

aleksgoy

    Рядовой

  • Пользователи
  • 17 posts

Posted 06 February 2017 - 07:35

 

 

//func

//content;
true
//end;

//;

_st=true
if call func then{_st=false};
if _st then{
//no;
}

или 

if isnil |любая переменная по созданию которой можете определить| then{
//нет;
}else{
//да;
}

или

if(missionnamespace getvariable[ '|переменная|' , |что вернётся если её нет| ]isequalto |что вернётся если её нет|)then{
//нет;
}else{};

или

if(missionnamespace getvariable[ '|переменная|' , |что вернётся если её нет| ]isequalto |что бы она значила|)then{
//да;
}else{};

 

Ого! Как-то сложновато и не совсем понятно...

А попроще никак нельзя

Я рассчитывал на что-то вроде if (true) exitWith{}; - т.е если запустился, то все ок .дальше все работает.

if (false) exitWith {"LOSER" call BIS_fnc_endMission} - если не запустился, то выход.

Ну просто с false я так понял команды нет, т.к.. она не срабатывает...


  • 0

#577 OFFLINE   Ilias

Ilias

    Прапорщик

  • Пользователи
  • 512 posts

Posted 06 February 2017 - 07:40

 

как выглядит func (файл | func={}..) ?

и как выполняете (execvm | call compile preprocessfilelinenumbers | call | spawn) ?

(напишу прямо, под вашу ситуацию)


Edited by Ilias, 06 February 2017 - 07:51.

  • 0

#578 OFFLINE   aleksgoy

aleksgoy

    Рядовой

  • Пользователи
  • 17 posts

Posted 06 February 2017 - 07:49

В принципе, могу объяснить по точнее...

У меня идет файл funcs, там как бы много много всего в виде compile preprocessfile...и тд. И в конце serverInitDone = true,  publicveriable  "serverInitDone";

А в другом файле initplayerlocal  прописано waitUntil {(!isNil "serverInitDone")};

Так вот, если funcs не прогрузился (т.к. я вписал код в нем, чтобы он завис на середине), то waitUntil {(!isNil "serverInitDone")}; - не исполняется, не пишет, что server init complite  и в самой миссии все пусто, просто ходишь туда сюда и все, никакие скрипты не срабатывают....

Вот мне и надо сделать так, чтобы serverinitdone не висел, а сделать выход....

 

По логике как-то так примерно:

If (serverinitdone не загрузился) then { call BIS_fnc_endMission};


  • 0

#579 OFFLINE   Ilias

Ilias

    Прапорщик

  • Пользователи
  • 512 posts

Posted 06 February 2017 - 08:04

В принципе, могу объяснить по точнее...

У меня идет файл funcs, там как бы много много всего в виде compile preprocessfile...и тд. И в конце serverInitDone = true,  publicveriable  "serverInitDone";

А в другом файле initplayerlocal  прописано waitUntil {(!isNil "serverInitDone")};

Так вот, если funcs не прогрузился (т.к. я вписал код в нем, чтобы он завис на середине), то waitUntil {(!isNil "serverInitDone")}; - не исполняется, не пишет, что server init complite  и в самой миссии все пусто, просто ходишь туда сюда и все, никакие скрипты не срабатывают....

Вот мне и надо сделать так, чтобы serverinitdone не висел, а сделать выход....

 

По логике как-то так примерно:

If (serverinitdone не загрузился) then { call BIS_fnc_endMission};

 

(true = |да| ; false = |нет| ; )

каждый скрипт (, файл) выполняется одной строкой (по очереди выполняя (читая) команды),

waituntil{ |_| }; задерживает строку пока |_| не будет == true если хотите проверить true или false пишите

if |_| then{ |здесь что сделать если true| }else{ |если false| }

(будьте уверены что то что должно произойти перед проверкой (выполнение funcs) произойдёт до проверки)

 

для вашей ситуации:

файл funcs не выполняется сам по себе, найдите

call compile preprocessfilelinenumbers'..\funcs.sqf';

или

execvm'..\funcs.sqf';

дальше относительно того где это находится

 

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


Edited by Ilias, 06 February 2017 - 08:11.

  • 0

#580 OFFLINE   aleksgoy

aleksgoy

    Рядовой

  • Пользователи
  • 17 posts

Posted 06 February 2017 - 08:19

Не знаю, написал так, но что-то не идет:
 
 
if ("serverInitDone") then
{
waitUntil {(!isNil "serverInitDone")};
 
} else
{
"LOSER" call BIS_fnc_endMission;
};

  • 0




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