Как определить, что объект принадлежит к субкатегории "Артиллерия" в редакторе?

Вопрос по назначению объекта
#1
OFFLINE
Отправлено 28 April 2019 - 00:58
#2
OFFLINE
Отправлено 28 April 2019 - 03:22
#3
OFFLINE
Отправлено 28 April 2019 - 21:47
Наваял:
#4
OFFLINE
Отправлено 28 April 2019 - 23:44
Да никак, подход индивидуальный к каждому моду, если мододел не стал изобретать велосипед, то ваш код и на его объекты сработает, из рекомендаций:Как быть с модами? Кто подскажет?
Добавить через ИЛИ проверку vehicleClass (Deprecated, но старые и некоторые новые моды до сих пор использует это)
Заменить isEqualTo для сравнения имен категорий на ==, потому что первый чувствителен к регистру символов (а вам не известно в каком регистре написал мододел для своих объектов)
Будьте проще:private _vehicleOriginal = [];
{_vehicleOriginal pushBack configName _x} forEach _cfgOriginal;
_data = _data apply { configName _x; };
Сообщение отредактировал vlad333000: 28 April 2019 - 23:45
#5
OFFLINE
Отправлено 29 April 2019 - 02:12
Возможно ли как-то обыграть displayName?
#6
OFFLINE
Отправлено 29 April 2019 - 03:36
1. Нужен перевод на все языки, поддерживаемые игрой (Игрок может включить любой язык; выделенный сервер и безголовые клиенты всегда по-умолчанию включают английский язык)
2. Возможно, придумать несколько вариации названия (Если таковые имеются в разных языках)
PS В теории еще можно посмотреть на иерархию классов и, если вся артиллерия наследует от одного/пары классов, то использовать это условие, но проверять мне не хочется
Сообщение отредактировал vlad333000: 29 April 2019 - 03:39
#7
OFFLINE
Отправлено 30 April 2019 - 18:41
vlad333000, проверять не нужно: объект типа "Zamak MRL" имеет класс "I_Truck_02_MRL_F", который является дочерним от "Car", а объект типа "2S9 Sochor" имеет класс "O_MBT_02_arty_F" - потомок "Tank".
Как я понял (возможно ошибочно), принадлежность типа (класса) объекта к субкатегории "Артиллерия" в редакторе определяется в записи конфигурации объекта:
private _object = имя объекта; // объект private _type = typeOf _object; // класс объекта private _Subcategory = getText (configFile >> "CfgVehicles" >> _type >> "editorSubcategory"); // субкатегория объекта
Для субкатегории "Артиллерия" в оригинальной ArmA 3 принято значение "EdSubcat_Artillery". T.е. если в конфиге объекта значение субкатегории ("editorSubctegory") указано "EdSubcat_Artillery", то движок игры будет рассматривать этот объект как объект из раздела "Артиллерия". И не важно к каком дереву иерархии принадлежит класс объекта. Название субкатегории в редакторе, вероятно, указывается в displayName, которое наверное уже и переводится на основные языки для видимости во вкладке редактора.
Что касается модов, то значение субкатегории ("editorSubctegory") указывается мододелом произвольно. Но, в тексте названия слово "artillery" как правило присутствует. Во всяком случае для RHS это - "rhs_EdSubcat_artillery".
Другими словами, если в названии субкатегории убрать лишние знаки и каждое полученное слово облечь в строку и эти слова объединить в массив (все эти вещи можно вытворить командой splitString), то в полученном массиве можно отыскать строку "Artillery" или "artillery".
private _text = _Subcategory splitString "_";
Для "EdSubcat_Artillery" - результат: _text = ["EdSubcat","Artillery"].
Для "rhs_EdSubcat_artillery" - результат: _text = ["rhs","EdSubcat","artillery"].
Ну а теперь:
private _logic = (("Artillery" in _text) OR ("artillery" in _text));
Вот это _logic и есть ответ на вопрос "Принадлежит ли объект к субкатегории "Артиллерия"? ".
#8
OFFLINE
Отправлено 02 May 2019 - 02:42
Кстати, есть вариант для определения назначения объекта в виде функции Object call BIS_fnc_objectType.
Возвращает массив данных в виде: ["категория", "тип"]. Например:
private _obj = myBMP; myBMP call BIS_fnc_objectType; // результат: ["Vehicle","TrackedAPC"]
Варианты:
Soldier (Солдат)
- AT
- Civilian
- Diver
- Infantry
- Medic
- MG
- Officer
- Pilot
- Sniper
- SpecialForces
- UAVPilot
Vehicle (Техника)
- Car (авто)
- Helicopter (вертолет)
- Motorcycle (мотоцикл)
- Plane (самолет)
- Ship (корабль)
- StaticWeapon (статическое оружие)
- Submarine (субмарина)
- TrackedAPC (БМП)
- Tank (танк)
- WheeledAPC (БТР)
Logic (Логика)
- Logic
- Module
Object (Объект)
- Ammobox (ящик с патронами)
- Animal (животное)
- Backpack (рюкзак)
- Camera (камера)
- Church (церковь)
- Effect (эффект)
- Fire (огонь)
- Flag (флаг)
- Helipad
- House (дом)
- Marker (маркер)
- Mine (мина)
- Parachute
- Seagull
- Sound (звук)
- Target (цель)
- Thing (вещь)
- Trigger (триггер)
- UnknownObject (неизвестный объект)
- VASI
- Wreck (руины)
Правда этот вариант не предусматривает типа артиллерия.
Есть еще один вариант.
В оригинальной Арме (без модов) принадлежность объекта к к-л субкатегории указывается в названии класса.
Например: I_MRAP_03_F.
При разложении названия с помощью splitString "_" получаем массив: ["I","MRAP","03","F"].
В этом массиве второй элемент (select 1) имеет вид "MRAP" (mine resistant ambush protected) - миноустойчивый засадозащищенный (дословно).
Для ("B_APC_Wheeled_01_cannon_F" splitString "_") select 1; APC (armoured personnel carrier) - бронированный перевозчик персонала
Для ("B_MBT_01_arty_F" splitString "_") select 1; MBT (main battle tank) - основной боевой танк.
Для ("I_Truck_02_MRL_F" splitString "_") select 1; Truck - грузовик.
Т.е. (class splitString "_") select 1 - указывает на название базы техники (бывает select 2)
А вот select 3 указывает уже на башню: для ("B_MBT_01_arty_F" splitString "_") select 3; - это "arty" (артиллерия).
Для ("B_MBT_01_mrls_F" splitString "_") select 3; - это "mrls" (Multiple Launch Rocket System) - РСЗО.