Модератор форума: Slon |
Форум » РЕДАКТОР - ArmA 2 » Скрипты » Вопросы по скриптописанию (Тонкости написания скриптов) |
Вопросы по скриптописанию |
› Вторник
› 04.11.2014
› 12:08
› Сообщение #
Slon, Есть вообще аддоны с шрифтами?
|
› Четверг
› 06.11.2014
› 22:38
› Сообщение #
Привет всем. Пытаюсь написать следующий сценарий:
на карте модуль гражданских, хочу выбрать юнит в тригере функцией BIS_fnc_selectRandom, дальше проверка на класс что это "MEN", и если этот юнит рядом с машиной mycar то он должен в нее сесть. И надо чтобы это все дело могло опять вызываться, и выбиралось все опять. я написал, но работает не всегда и хреново, не знаю почему, подскажите где ошибка? вызов через через триггер, условие cselect, активация cstart= [thistrigger]execVM "civ.sqf" _epicenter = _this select 0; _list=list _epicenter; _civ = _list call BIS_fnc_selectRandom; waitUntil {_civ iskindof "Man"}; if (_civ iskindof "Man") then { _civ setVehicleVarName "civ"; call compile format ["%1 = _civ", "civ"]; publicVariable "civ"; "mrk1" setMarkerPos (getPos civ); [] execVM "civ2.sqf"; hint "человек на карте"; }; civ2.sqf waitUntil {civ distance mycar<15}; civ assignAsCargo mycar; civ moveInCargo mycar; mycar lock true; cselect = false; |
› Пятница
› 07.11.2014
› 02:29
› Сообщение #
bilibin,
_epicenter = _this select 0; _list=list _epicenter; _civ = _list call BIS_fnc_selectRandom; waitUntil {_civ iskindof "Man"}; //? ты ждешь пока _сiv будет произодным классом от Man зачем? А что если в списке юнитов окажется танк? if (_civ iskindof "Man") then { _civ setVehicleVarName "civ"; call compile format ["%1 = _civ", "civ"]; publicVariable "civ"; "mrk1" setMarkerPos (getPos civ); [] execVM "civ2.sqf"; hint "человек на карте"; }; civ2.sqf waitUntil {sleep 0.1; civ distance mycar<15}; // если условие может не выполнятся долго, исользуй паузы чтобы процессор не захлебнулся в проверках (проверка условия в этой конструкции порой по несколько раз за кадр) civ assignAsCargo mycar; civ moveInCargo mycar; mycar lock true; cselect = false; Добавлено (06.11.2014, 23:53) Код call compile format ["%1 = _civ", "civ"]; publicVariable "civ"; [] execVM "civ2.sqf"; Нужен только для выполнения этого кода: Код civ assignAsCargo mycar; civ moveInCargo mycar; mycar lock true; cselect = false; То это лишний код Судя по описанию, скрипт нужен только для серверной части, а значит использовать publicVariable не к чему Достаточно написать так: Код _civ assignAsCargo mycar; _civ moveInCargo mycar; mycar lock true; cselect = false; Добавлено (07.11.2014, 00:20) Цитата И надо чтобы это все дело могло опять вызываться, и выбиралось все опять. Запутал ты меня вызов через через триггер, условие cselect, активация cstart= [thistrigger]execVM "civ.sqf" civ.sqf Код _epicenter = _this select 0; _list=list _epicenter; while{true}do{ _civ = _list call BIS_fnc_selectRandom; if (_civ iskindof "Man" && _civ distance mycar < 15) then { _civ assignAsCargo mycar; _civ moveInCargo mycar; mycar lock true; //Возможно он не сможет попасть в машину потому что она закрыта cselect = false; "mrk1" setMarkerPos (getPos _civ); hint "человек на карте"; }; sleep 1; }; Добавлено (07.11.2014, 00:24) Добавлено (07.11.2014, 00:38) Добавлено (07.11.2014, 00:51) Код _epicenter = _this select 0; _list=list _epicenter; while{cselect}do{ _civ = _list call BIS_fnc_selectRandom; if (_civ iskindof "Man" && _civ distance mycar < 15) then { _civ assignAsCargo mycar; _civ moveInCargo mycar; mycar lock true; //Возможно он не сможет попасть в машину потому что она закрыта cselect = false; "mrk1" setMarkerPos (getPos _civ); hint "человек на карте"; }; sleep 1; }; Добавлено (07.11.2014, 02:29)
Cтруктуры данных важнее кода!
Список команд | Список оружия | Список техники | Список юнитов | Список объектов Armstalker Online |
› Пятница
› 07.11.2014
› 12:28
› Сообщение #
ZoRRo, впечатлен таким развернутым, подробным ответом, благодарю.
Я использую JTD Civilian mod (тут более свежий), он работает вместе с модулем гражданских, но по своей системе, там уже реализовано использование транспорта ботами, и, как плюс, гораздо производительнее бисовского; вообще, рекомендую. Цитата А что если в списке юнитов окажется танк? Как ни странно, я проверял это и выбирался только "Man", вопреки моей недопиленной конструкции. Цитата а значит использовать publicVariable не к чему Я решил присвоить имя боту, чтобы использовать его в других местах, потому что не разобрался с передачей переменной глобального свойства. Цитата Не удивительно, ведь внешний скрипт вызываемый для юнита и пытающийся определяющий его действия, действия которого определяет модуль не может не вызывать конфликтов. Воистину так. Бот садится в мою машину и как только я останавливаюсь он выходит из нее, но потом опять входит. Я, верно запамятовал обозначить то, для чего мне это. Мне нужен случайный выбор гражданского (т.е. чтобы я не мог предположить каким подклассом он будет), и когда я к нему подъеду он бы сел в мою машину, далее довезти его до маркера, он вышел, и так все по новой. И когда по новой, условие цикла cselect вызывалось радио триггером. Я подумал, раз скрипт конфликтует с модулем, можно ли динамически создать клона бота с такими же параметрами что и выбранный BIS_fnc_selectRandom'ом бот? И тогда уже назначать ему действия, а то в первоночальном скрипте бот не понимает что от него хотят, модуль требует одного, скрипт другого. т.е. что-то типо такого, как с ошибками? сейчас компа нет под рукой(( Добавлено (07.11.2014, 12:13) Добавлено (07.11.2014, 12:28) P.S А вообще можно в блок then кидать назначения?
|
› Пятница
› 07.11.2014
› 13:24
› Сообщение #
bilibin,
Цитата Как ни странно, я проверял это и выбирался только "Man", вопреки моей недопиленной конструкции. Посмотри вот эту тему, нужно понимать "как это работает", а не "работает и ладно") Цитата Я решил присвоить имя боту, чтобы использовать его в других местах, потому что не разобрался с передачей переменной глобального свойства. Глобальные переменные они на то и глобальные, что доступны из любого скрипта, а команда publicVariable занимается отправкой переменной на все компьютеры. Чтобы лучше иметь представление о языке почитай Arma2 Справочное руководство встроенного языка Цитата Воистину так. Бот садится в мою машину и как только я останавливаюсь он выходит из нее, но потом опять входит. Потому что он привязан к машине командой assignAsCargo, нужно использовать команду unassignVehicle для того чтобы отвязать Цитата Мне нужен случайный выбор гражданского (т.е. чтобы я не мог предположить каким подклассом он будет), и когда я к нему подъеду он бы сел в мою машину, далее довезти его до маркера, он вышел, и так все по новой. И когда по новой, условие цикла cselect вызывалось радио триггером. Я подумал, раз скрипт конфликтует с модулем, можно ли динамически создать клона бота с такими же параметрами что и выбранный BIS_fnc_selectRandom'ом бот? И тогда уже назначать ему действия, а то в первоночальном скрипте бот не понимает что от него хотят, модуль требует одного, скрипт другого. Можно создавать, и в твоем случае думаю даже нужно: список всех классов юнитов у меня в подписи, создай массив, туда запиши имена нужных классов и используй команду BIS_fnc_selectRandom чтобы выбрать рандомного юнита. Для того чтобы создать юнита используй команду createUnit
Cтруктуры данных важнее кода!
Список команд | Список оружия | Список техники | Список юнитов | Список объектов Armstalker Online |
› Пятница
› 07.11.2014
› 15:04
› Сообщение #
Прочитал, но не пойму как выбрать юнита которого создал createUnit'ом
|
› Пятница
› 07.11.2014
› 15:09
› Сообщение #
bilibin, команда createUnit возвращает его. Вот пример:
_unit = group player createUnit ["SoldierWB", Position player, [], 0, "FORM"];
Cтруктуры данных важнее кода!
Список команд | Список оружия | Список техники | Список юнитов | Список объектов Armstalker Online |
› Пятница
› 07.11.2014
› 15:10
› Сообщение #
создавай так
https://community.bistudio.com/wiki/createUnit_array _unit = group player createUnit ["SoldierWB", Position player, [], 0, "FORM"]; |
› Пятница
› 07.11.2014
› 15:39
› Сообщение #
спасибо, работает. только условие _clone distance mycar<15 не выполняется чтобы бот залез в машину, его в if или в waitUntil лучше кинуть?
|
› Пятница
› 07.11.2014
› 15:40
› Сообщение #
bilibin, напиши полностью скрипт который получился
Cтруктуры данных важнее кода!
Список команд | Список оружия | Список техники | Список юнитов | Список объектов Armstalker Online |
› Пятница
› 07.11.2014
› 15:49
› Сообщение #
Все условие выполняется, вот рабочий вариант
Код _epicenter = _this select 0; _list=list _epicenter; _p=0; while {cselect} do { _civ = _list call BIS_fnc_selectRandom; while {(_civ iskindof "Man") and (_p<1)} do { _type = typeOf _civ; _pos = (getPos _civ); _clone = group player createUnit [_type, _pos, [], 0, "FORM"]; _clone disableAI "MOVE"; sleep 0.2; "mrk1" setMarkerPos (getPos _clone); hint "клон создался"; sleep 0.5; _p=_p+1; waitUntil {_clone distance mycar < 15}; _clone enableAI "MOVE"; _clone moveInCargo mycar; cselect = false; hint "человек на карте"; }; }; }; ZoRRo, я не стал массивы с классами писать, бисрэндом отлично выбирает, и клон создается, ошибок нет. Может мне показалось, но вроде арма сильно нагрузилась. Может где не там слип поставил, поправьте. |
› Пятница
› 07.11.2014
› 16:28
› Сообщение #
waitUntil{условие}, проверяет условиеи если оно истинно, продолжает выполнение скрипта
if{условие}then{код}, проверяет условие в режиме "здесь и сейчас" и если оно истинно - выполняет код while{условие}do{код}, (пока условие делай код), т.е выполняет код постоянно, пока условие истинно Посмотри у тебя здесь два цикла вложенные друг в друга, от того и нагрузка. sleep имеет смысл ставить по окончанию иттерации, чтобы постоянно не крутился, внутри кода конечно тоже можно, но если это время настолько малое, что не заметно для человека то не надо, это только замедлит выполнение скрипта а пользы никакой Иницализировать переменные имеет смысл только если к ним обращаться будешь более 1го раза, в твоем примере это лишь память занимает, и делает код хуже читаемым Для чего тебе _clone disableAI "MOVE" и _clone enableAI "MOVE" я не понял И смысла в _p я не увидил. Вот посмотри что получилось: Код _epicenter = _this select 0; _list=list _epicenter; while {cselect} do { _civ = _list call BIS_fnc_selectRandom; if(_civ iskindof "Man") then { _clone = group player createUnit [typeOf _civ, getPos _civ, [], 0, "FORM"]; _clone moveInCargo mycar; "mrk1" setMarkerPos (getPos _clone); hint "клон создался"; waitUntil {sleep 0.1; _clone distance mycar < 15}; cselect = false; hint "человек на карте"; }; }; }; Добавлено (07.11.2014, 16:21) Добавлено (07.11.2014, 16:28)
Cтруктуры данных важнее кода!
Список команд | Список оружия | Список техники | Список юнитов | Список объектов Armstalker Online |
› Пятница
› 07.11.2014
› 17:12
› Сообщение #
ZoRRo, спасибо, и отдельное за пояснение блоков,нормально объяснил, а то у меня тот chm по OFP не открылся
Цитата Для чего тебе _clone disableAI "MOVE" и _clone enableAI "MOVE" я не понял И смысла в _p я не увидил. Потому что _clone сразу ко мне в группу вступает и бежит ко мне, а мне надо чтобы он стоял пока я к нему ехал. _p я остановил цикл, а то каждую секунду новые юниты создавались, а после добавления _p цикл завершался при создании одного юнита, т.е. при одном выполнении этого цикла, как мне и надо. Добавлено (07.11.2014, 17:12) |
› Суббота
› 08.11.2014
› 01:03
› Сообщение #
bilibin, чтобы открылся файл, при открытии сними галку "Всегда спрашивать при открытии этого файла", не знаю с чем связано, конвертировал его я из исходников (html страниц). Первый раз такое делал мож где накосячил.
То что стоит юнит - незнаю, так-то должен бежать в строй) Еще как вариант можно создать группу для него ( или в начале миссии (init.sqf) создать группу и записать её в глобальную переменную - использовать её для всех вновь создаваемых юнитов, которых будешь катать ): _group = createGroup civilian; А потом, уже когда подъезжаешь присоединять к себе: [_unit] join player С группами есть один подводный камень: В арме есть ограничение на количество групп - 144 для каждой стороны. Если лимит привышен, группа просто не создастся при этом ошибки никакой не будет. Если даже в группе никого не осталось, она автоматически не удаляется (в арма 3 это исправили) Удалять можно только пустые группы, команда deleteGroup
Cтруктуры данных важнее кода!
Список команд | Список оружия | Список техники | Список юнитов | Список объектов Armstalker Online |
› Суббота
› 08.11.2014
› 14:01
› Сообщение #
ZoRRo, так и сделаю.
Цитата То что стоит юнит - незнаю, так-то должен бежать в строй) Да, это поначалу он стоял. Потом следующий раз как проверил - бежал ко мне. Но я реально лучше группу создам, чтобы disableAI не писать. Про группы я помню, когда эксперимент по размножению ботов проводил) |
| |||
Чат сайта |