Модератор форума: GUNNER161, Panikaha |
Форум РЕДАКТОР - ArmA 3 Скрипты Мебель и прочий интерьер в А3 (Создаем шаблоны для заполнения домов мебелью) |
Мебель и прочий интерьер в А3 |
› Четверг
› 09.10.2014
› 22:00
› Сообщение #
Не секрет, что в А3 бисы, увлекшись установкой открывающихся дверей почти для всех зданий, совершенно позабыли о том, чтобы эти самые здания заставить мебелью (либо банально поленились). Как выяснилось, отсутствие начинки режет глаз не только мне, поэтому попробуем исправить эту оплошность.
Конечно, все дома мебелировать не надо, для начала достаточно тех, которые будут участвовать в сюжете (жилой\командный модуль на базе, дом с документами, которые нужно найти, дом, где скрывается выживший\преступник и тд). Есть мнение запереть двери у всех остальных, но мне это кажется слишком жестоким:), хотя попробовать можно, но сделать это случайным образом. Итак, самый простой способ - расстановка в редакторе - и самый неудобный, поскольку многих объектов там просто нет, а близко поставленные предметы создают дикое нагромождение. Ковыряя стоковую кампанию, я обнаружил, что бисы ставят свои объекты скриптами. Преимущества - скрипт запускается в нужный момент (по приближению игрока) а значит, минимизируется лишнее на данный момент количество объектов; можно поставить любой объект зная его класснейм; можно с любой точностью позиционировать и вертеть установленные объекты. Вариант 1. Расставлять объекты по абсолютным координатам в виде _chair1=createVehicle ["Land_ChairPlastic_F", [11724.8,11832,0.2], [], 0, "CAN_COLLIDE"]; _chair1 setDir 180; Понятно, что это годится только для определенного здания, расположенного в своем, уникальном месте. Вариант 2. Использовать координаты относительно какого-либо установленного в редакторе объекта, который будет передаваться в скрипт как аргумент (а значит, и его абсолютные координаты) //вызов: _script=[mebel1] execVM "furnuture.sqf" _ob=_this select 0; _posX=getposATL _ob select 0; _posY=getposATL _ob select 1; _posZ=getposATL _ob select 2; _cooler=createVehicle ["Land_WaterCooler_01_old_F", [_posX+1.71, _posY-1.87, _posZ], [], 0, "CAN_COLLIDE"]; _cooler setDir 44; Уже лучше; при сдвиге эталонного объекта на другое место точно так же сдвинутся и все привязанные к нему остальные. Однако это возможно только при определенной (первоначальной) ориентации эталона; при его вращении привязанные останутся на своих местах. Иными словами, это годится только для зданий с одним азимутом. Вариант 3. По типу В2, но в качестве относительных координат используется modelToWorld _deg=getdir _ob; //добавлена переменная азимута эталонного объекта ..... doc=createVehicle ["Land_Document_01_F", _ob modelToWorld [-8.06,-1.17,1.2], [], 0, "CAN_COLLIDE"]; doc setDir 20+_deg; Почти оптимально: при повороте объекта все привязанные также двигаются и поворачиваются; получается некий аналог attachTo. Причем в качестве эталона можно использовать не объект в доме (стол), а сам дом (пока только установленный в редакторе или скриптом и имеющий собственное имя) Как мне видится в идеале: Мебель в домах появляется при приближении игрока (скажем, < 100м) и исчезает при его удалении (>100), по такому же принципу, как сделаны некоторые аддоны с амбиентом (TPW к примеру). Но для начала нужно научиться мебелировать любой дом, уже стоящий на карте. Для этого каким-то образом его надо выделить, узнать класснейм и азимут, а затем применить к нему скрипт с мебелью (часть скрипта, соответствующую его КН). До этого я пока не дошел. А теперь некоторые хитрости, позволяющие убыстрить расстановку объектов.
Код _ms=[]; _xx=(getposATL player select 0)-(getposATL mebel1 select 0); _yy=(getposATL player select 1)-(getposATL mebel1 select 1); _zz=(getposATL player select 2)-(getposATL mebel1 select 2); _deg=getdir player; {_ms set[count _ms, _x]} foreach [_xx,_yy,_zz,_deg]; copytoclipboard (str (_ms)); В любом случае калибровка "на местности" проводится с помощью компаса и глазомера опытным путем. Дополнительно прилагаю файл в doc, содержащий некоторые объекты из А3 (мебель, инструмент, груз, дома, обломки и тп) в формате "описание-класснейм-картинка". Делал для себя, поэтому там только то, что мне было нужно. Давайте добавим в А3 красивую реальность! |
› Четверг
› 09.10.2014
› 23:07
› Сообщение #
|
› Четверг
› 09.10.2014
› 23:47
› Сообщение #
|
› Воскресенье
› 12.10.2014
› 00:49
› Сообщение #
Результаты радуют.
Начинил всяким барахлом бункер типа жилого модуля (КН - Land_Cargo_House_V1_F) Вот пример для редактора По радио-альфа впереди игрока появляется этот бункер с рандомным азимутом В принципе реально распространить это на уже установленные такие же, но главный вопрос, который я не осилил - как задать имя для элемента из массива, чтобы затем с этим именем запустить скрипт. PS Надеюсь, решено. Создаем\вычисляем массив нужных зданий в радиусе игрока и к каждому элементу применяем скрипт. PPS Ссылка на тестовую миссию обновлена; ближайшие к игроку бункеры мебелируются, до кучи введен рандомный выбор пары плакатов в бараках Для начинки выборочных бункеров данного типа используем: Существенный минус: при вычислении каждого [0,0,0] nearestObject _x наблюдается секундный фриз. Возможно, есть другой способ определения? Добавлено (12.10.2014, 00:49) задаются только нужные ИД, но имеем небольшие фризы в каждом цикле. Второй с использованием маркеров Маркеры ставятся на нужные строения. Фризов нет, но сами маркеры могут загромоздить карту. adw8613, с дверями разобрался. Закрыта любая, на которую упадет взор (буквально:) Но боты открывать смогут.. Малость проапгрейдил. Запуск: _lockdoor=[["1779507","1779503"]] execVM "lock_door.sqf"; //массив исключений по ИД - где не нужно запирать Сам скрипт: Тормозит или нет - не знаю, надо проверять на загруженной миссии Сообщение отредактировал andrucio - Суббота, 11.10.2014, 16:42
|
› Воскресенье
› 12.10.2014
› 04:49
› Сообщение #
другого способа нет, но координаты стартовой точки [0,0,0] - лучше заменить на поближе. получается что сканер перебирает все объекты от указанной точки постепенно удаляясь ((( используй такой способ _ms=[[[100,232,0],1779503],[[322,53,0],1779506],[[885,3382,0],1779507]]; //координаты И ИД объектов { _bunker=(_x select 0) nearestObject (_x select 1); Сообщение отредактировал Slon - Воскресенье, 12.10.2014, 04:53
|
› Воскресенье
› 12.10.2014
› 13:56
› Сообщение #
Неприятная новость: вычисление первоначального массива объектов типа "housebase" по всему Алтису дает полный фриз экрана на 20сек. Никто не делает миссии на весь остров сразу. Может, имеет смысл запускать вычисление по каждому населенному пункту (зоне) отдельно, когда в пределы триггера входит игрок. И удалять весь интерьер в пределах зоны, откуда игрок уходит? Я не случайно начал говорить о запертых дверях. Если технически это возможно, то мебель расставляется, допустим, в каждом десятом доме в населенных пунктах (указываются их номера как условие), а в остальных домах запираются двери. Как приемлемый вариант пойдет, но может, стоит внести возможность добавлять исключения - те дома, где мебель заранее расставлена. Блин, увлекшись аддонами, забыл все то немногое, что о скриптах знал. Теперь приходится разбираться с 0. |
› Воскресенье
› 12.10.2014
› 17:53
› Сообщение #
Slon, а я-то думал, что за магические цифры [0,0,0].. как-то не доходило, что это координаты нуля (вернее, принцип действия nearestObject
100,232,0 - а откуда такие цифры? просто от балды? Может, тогда использовать центр карты? тем более, если объектов будет много.. _size = (getnumber (configfile >> "cfgworlds" >> worldname >> "mapSize"))/2; _center = [_size,_size,0]; ... _ms=[_center,["1779503","1779506"]]; Для универсальности.. а если задавать вручную, то указывать ближайший маркер Может, имеет смысл запускать вычисление по каждому населенному пункту (зоне) отдельно, когда в пределы триггера входит игрок. И удалять весь интерьер в пределах зоны, откуда игрок уходит? В принципе, на пустой карте тормозов не наблюдается - в зоне Кавалы с радиусом 1000 насчиталось 1400 объектов "housebase". Для вычисления массивов можно запустить параллельный процесс, хоть в самом начале. но может, стоит внести возможность добавлять исключения - те дома, где мебель заранее расставлена. В общем, мне видится два варианта. Первый, трудоемкий при создании массива, но более безгеморройный в плане скриптов, ибо они почти готовы. Записываются выборочные ИД домов в общей зоне сюжета (скажем, около сотни) и подзона мебелируется при вхождении игрока в нее и очищается при выходе. Двери закрыты везде, исключая эти ИД. Универсальности не будет. Второй - на автомате. Основано на том, что ИД "housebase" у всех одинаковые (на острове). Провести предварительное формирование файла с массивом (а лучше даже нескольких, по типам - Land_i_House_Small_01_V1_F насчитано 600шт) - это все разовая работа. И уже по ним начинять каждый пятый или десятый в подзонах. Но! Пока не представляю как удалять все барахло в домах - может, созданное в скрипте как-то объединить в массив с именем house+ID и при удалении от дома килять массив с содержимым. Кстати, если с удалением получится, нарисовывается и третий вариант, еще проще, поскольку массив небольшой (около полусотни): мебелировать абсолютно все дома в радиусе 100м от игрока. Тогда и двери можно не запирать. Блин, мысли уже разбегаются ЗЫ Ага, с удалением что-то вырисовалось в самом конце конкретного скрипта с мебелью Interior=position _ob nearObjects 20; //цифру можно определить опытным путем для каждого типа а потом просто {deletevehicle _x} foreach Interior; но имя переменной должно быть Interior+ID (сам ИД уже записан) пока не знаю как Сообщение отредактировал andrucio - Воскресенье, 12.10.2014, 18:49
|
› Воскресенье
› 12.10.2014
› 19:02
› Сообщение #
а потом просто {deletevehicle _x} foreach Interior; но имя переменной должно быть Interior+ID (сам ИД уже записан) пока не знаю как Все созданные объекты (мебель) одного здания запиши в массив, а масив сохрани в ЭТОМ объекте _dom setVariable ["Mabel", _mass]; тогда удаляться будет так {deletevehicle _x} foreach (_dom getVariable "Mabel"); |
› Воскресенье
› 12.10.2014
› 22:14
› Сообщение #
Slon, благодарю за наводку на setVariable. Но дело в том, что зданий будет много, а удаление мебели, привязанной к зданию, будет скорее всего в другом скрипте. Потому и хочу к имени добавить ИД.
В общем, получилось так: _id=[_ob] call fnc_id; // функция выцепляет ИД объекта missionNamespace setVariable [ format["mebel_%1",_id], position _ob nearObjects 10]; sleep 2; _s=[_id] execVM "del.sqf"; //для проверки вызывается второй скрипт del: _id=_this select 0; {deletevehicle _x} foreach (missionNamespace getVariable ("mebel_"+_id)); Я склоняюсь все же к третьему варианту - мебелировать все дома в радиусе игрока, а при уходе начинку удалять. Не надо париться с триггерами-зонами. Раз в 5с вычислять массив "housebase" и заставлять полученное с исключением тех, что уже заселены, а те mebel_id что вне массива - удалять. position _ob nearObjects 10 оказался не очень удобен.. в этом радиусе удаляются все объекты, в том числе установленные в редакторе и попавшие в круг смерти:). Видимо, придется создавать массив в скрипте меблировки, дописывая в него каждый установленный объект типа так: _mebel=[]; _table1 = createVehicle............ _mebel set [count _mebel, _table1]; Сообщение отредактировал andrucio - Воскресенье, 12.10.2014, 22:59
|
› Среда
› 15.10.2014
› 19:59
› Сообщение #
Для оперирования с массивами домов при движении игрока думаю использовать следующую схему:
Вычисление нужных частей получилось как-то уж очень просто, хотя полевые испытания дали правильный результат: _housesnew=["1779503","1779507","1779501","1779506"]; _housesold=["1779503","1779506","1779507","1779505","1779308","1779802"]; _housesdiff=_housesnew - _housesold;// только новые элементы ["1779501"] _housesdiff1=_housesold - _housesnew;// только старые элементы ["1779505","1779308","1779802"] _housesdiff2=_housesnew - _housesdiff;// общие ["1779503","1779507","1779506"] hint format["new: %1 \nold: %2 \ncommon %3", _housesdiff, _housesdiff1, _housesdiff2]; Корректно ли так обходиться с массивами? Тогда для каждого элемента _housesdiff3 (=_housesdiff+_housesdiff1+_housesdiff2): если новый - ставим мебель если старый - удаляем если общий - пропускаем Добавлено (15.10.2014, 19:59) --------------------------------------------- Итак.. бета-версия скрипта мебелирования. Миссия для редактора - тынц. Что имеем: пока только одно здание типа маленького жилого модуля для военных. В некоем радиусе от игрока заставляется мебелью из соответствующего скрипта, вне радиуса очищается. Естественно, с учетом перемещений. Можно указывать исключения (по ИД) - эти здания предназначены для ручной расстановки и трогаться не будут. Все остальные (в том числе те, для которых пока нет мебельных скриптов) запираются, причем и тут можно указывать исключения - если по сюжету понадобится удобная позиция для снайпинга, а дом не мебелирован. Описание аргументов есть в init.sqf В миссии- примере не начиняется здание рядом с огнетушителем - оно в исключениях. Также в исключениях от дверезапирания пустое здание управления военными грузами с плоской крышей. Для удобства присутствуют радио-триггеры с vehinfo и телепортом по карте. В каждом цикле хинтом выводится количество расставленных объектов (для отлавливания возможной утечки по количеству) Замечания - при быстром перемещении иногда двери не запираются. Думаю, дело в маленьком радиусе обработки - для теста выставлено в 20, за время цикла с паузой 5 игрок успевает выбежать из зоны. В дальнейшем увеличится до 100-150 с паузой до 10. adw8613, насчет ветхих домов.. те, которые класса "ruins", дверей и так не имеют. Но в исключения я ввел один (можно добавить больше) класс - в mebel_core.sqf По карте на запад от игрока ближайший небольшой н.п. - там этот дом присутствует, в редакторе называется "каменный дом небольшой". Двери открываются, и внутри пусто. Я не знаю, стоит ли разблокировать двери после ухода из зоны.. Игроку это по-барабану, а ботам тем более - они в легкую открывают запертые. Лишние ресурсы при обработке. И да.. столяр-краснодеревщик и дизайнер в одном лице принимает заявки на обустройство домов Сам планирую начинить управление военными грузами (Land_Cargo_HQ_V1_F), небольшой дом типа Land_i_Addon_02_V1_F, ангар а-ля промышленный навес (Land_i_Shed_Ind_F).. а там видно будет. Госпиталь и большие офисные здания не буду, это практически единичные дома, да и здоровенные. На каждый дом будет приходиться 10-20 предметов; текущий имеет 47 - это много. Прикрепления:
1150713.jpg
(29.8 Kb)
Сообщение отредактировал andrucio - Среда, 15.10.2014, 20:08
|
› Среда
› 15.10.2014
› 21:19
› Сообщение #
Итак, мои впечатления.
1. Сначала маленький баг: мужик, спящий в модуле, к которому юнит изначально повернут лицом, утонул в кровати. Мне кажется, они там вообще не нужны. В миссии чудно будет - после долгого боя захватил объект, врываешься в здание, а там какой-то хмырь массу давит. 2. По плакатам - нужны ли плакаты с надписями? Если это американская или греческая база, то плакаты смотрятся странно. Мне кажется, по стенам надо развесить что-то интернациональное, подходящее для любой стороны. Или делать разные скрипты - отдельно для красных, синих и зеленых. 3. Модуль, возле которого стоит огнетушитель, пустой. Ошибка или так и было задумано? 4. Когда отходишь от модулей, интерьер исчезает, подходишь - появляется. Как-то странно то выглядит. Возможно сделать, чтобы при выходе юнита из здания, дверь автоматически закрывалась? 5. Дверь заперта. Как и было задумано, строения без интерьера закрыты. 6. Мне кажется, для снижения тормозов, обставлять стоит не более 30-40 % строений. |
› Среда
› 15.10.2014
› 23:09
› Сообщение #
1. Хмырь удалится. Текущая начинка - это тестовая и, так сказать, максимальная.. у себя такой буду ставить вручную (не пропадать же работе:) - это как бы штучные объекты, например, барак, в который вернулся игрок после трудов. Тем более хмыря все равно надо переодевать в правильную фракцию.
Я уже сказал, в модуле 47 объектов, для рабочей версии надо сократить вполовину. 2. Сокращение и плакатов касается, оставлю календарь с теткой и второй напротив. Какой - не знаю, нейтральных вариантов придумать не могу, но надо чтонить военное. 3. Да, задумано, я ж написал, что он в эксклюде. 4. При большом радиусе действия появления\исчезания не заметишь, ибо крайние дома далеко будут. Здесь для наглядности радиус 20, да и кресло снаружи для того же, в рабочей его не будет. С автозакрыванием дверей, боюсь, лишняя нагрузка будет.. это ведь только начало, а объектов прибавится много. По рэндому можно будет освещение сделать (в темных внутри домах) 6. Тормоза будут тестироваться по-любому. По мере создания скриптов с начинкой будут добавляться меблированные дома, там и видно будет (1-2 вечера на дом занимает при наличии времени, так что это дело долгое). Здесь просто место такое, куча одинаковых бункеров. Но опять же, в миссиях, если такое встретится, некоторые можно в исключения добавить, причем только в зоне сюжета. Думаю, пусть они и открытыми остаются. Насчет 40-50% подумаю, пока в голову приходит только один вариант: внести рэндом перед выполнением скрипта с начинкой _flag = [true,true,true,false] call bis_fnc_selectRandom; if (_flag) then {... вероятность около 75%. Но, если уйти, а потом вернуться, заставленный дом может оказаться пустым и наоборот. Обнаружился еще один неприятный момент: установленные скриптом здания имеют каждый раз новый ИД, и рискуют заполниться мебелью на общих основаниях. Надо думать, как можно их идентифицировать, чтобы исключить из обработки (идеально - добавлять на горячую в _excludeID). Наверно, как-то через setVariable.. Здания, установленные редактором, вроде бы лишены этого. Сообщение отредактировал andrucio - Четверг, 16.10.2014, 12:57
|
› Четверг
› 16.10.2014
› 09:33
› Сообщение #
У меня такой вопрос, как быть с обьектами уже имеющими меблировку?
Пехота ВСРФ 2 - Специальные подразделения МВД РФ : http://arma.at.ua/forum/95-10085-1
|
› Суббота
› 18.10.2014
› 23:44
› Сообщение #
ludawan, пока все изменения касаются только маленького бункера (картинка - в посте выше), остальное не трогается. Если такой объект имеет вручную установленную мебель, то его (его ИД) надо внести в исключения, указываемые в аргументах запуска скрипта. ИД здания можно найти, включив соответствующий режим в редакторе.
Плюс, если используется запирание дверей (true), этот же ИД надо внести и во второй массив. Добавлено (18.10.2014, 23:44) --------------------------------------------- Работа продолжается. Добавлена мебель в двухэтажный кирпичный дом и три одноэтажных (около 25 объектов в каждом, в большом - 35). Большинство имеют признак enablesimulation false, надеюсь, это снизит нагрузку на систему. Около половины объектов выбираются рэндомно из конфига (сгруппированых по принадлежности - медицина, еда, инструменты и тд). Исправлен малый военный бункер - снижено до 25 кол-во объектов, также введен рэндом (в частности, на столе можно найти всякую хрень из раздела Items, в том числе прицел TWS:) Свет внутри тоже рэндомный, плюс яркость его зависит от времени суток (для вновь появляющихся домов) Расширен (до 30) массив настенных картинок - помимо теток добавлены репродукции известных картин; сами картинки в некоторой степени выбираются по критерию "дом богаче-беднее". https://yadi.sk/d/XTwbmQM0c3de8 Опробовано, но пока не добавлено закрывание дверей при выходе из зоны (то есть анимация: все открытые игроком двери закрываются) - не знаю, надо ли такое.. Остается открытым вопрос, что делать с домами, устанавливаемыми скриптом - как их внести в эксклюд. Сообщение отредактировал andrucio - Суббота, 18.10.2014, 23:57
|
› Суббота
› 18.10.2014
› 23:58
› Сообщение #
Остается открытым вопрос, что делать с домами, устанавливаемыми скриптом - как их внести в эксклюд Т.е. ты имеешь ввиду дома, которые добавит сам автор миссии? Не знаю, возможно ли это реализовать, но с позиций логики представляется разумным ввести резервные имена - исключения, т.е. дома с такими именами скриптом обставляться не будут. Тогда автору миссии достаточно назвать свой дом в ините именем-исключением и вуаля. |
| |||
Чат сайта |