DreadMoroz 327 Жалоба Опубликовано 15 октября, 2014 Юнитпроцессор в вогомиссиях люто бесит необходимостью лезть в него для добавления/удаления фракций switch _faction do { case "USR" : {[_unit, _loadout] call _USR_processor}; case "USMC" : {[_unit, _loadout] call _USMC_processor}; case "INS" : {[_unit, _loadout] call _INS_processor}; default {diag_log format ["Undefined unit faction : %1",_faction]}; }; добавлять туда все фракции и хранить все их конфиги в equipment - это тоже тупо. в связи с этим захотелось замутить какую-то более универсальную механизму и получилась вот такая вот загогулина. Компиляем указанный скрипт в качестве функции и записываем в указанную переменную неймспейса миссии. Тягаем при необходимости такую переменную и вызываем как функцию. LazyLoad.sqf private ["_functionName", "_path", "_functionVariable"]; _functionName = _this select 0; _path = _this select 1; _functionVariable = missionNamespace getVariable _functionName; if (isNil "_functionVariable") then { _function = compile preprocessFileLineNumbers _path; missionNamespace setVariable [_functionName, _function]; }; UnitGear.sqf private ["_unit", "_sideName", "_gearName", "_gearFullName", "_gearPath", "_gearFunction"]; _unit = _this select 0; _sideName = _this select 1; _gearName = _this select 2; _gearFullName = format["DREAD_UNIT_GEAR_%1", _gearName]; _gearPath = format["lib\unit\gear\%1\%2.sqf", _sideName, _gearName]; [_gearFullName, _gearPath] call LazyLoad; _gearFunction = missionNamespace getVariable _gearFullName; if (isNil "_gearFunction") then { diag_log format["Function %1 is not loaded", _gearFullName]; } else { [_unit] call _gearFunction; }; Пример использования: init.sqf LazyLoad = compile preprocessFileLineNumbers "lib\util\LazyLoad.sqf"; UnitGear = compile preprocessFileLineNumbers "lib\unit\UnitGear.sqf"; В любом нужном месте: [player, "blufor_usmc", "BASE"] call UnitGear; [player, "blufor_usmc", "TL"] call UnitGear; .... [_unit, "ins_taki", "BASE"] call UnitGear; [_unit, "ins_taki", "TL"] call UnitGear; конфиги соответственно лежат в lib\unit\gear\blufor_usmc\BASE.sqf lib\unit\gear\blufor_usmc\TL.sqf lib\unit\gear\ins_taki\BASE.sqf lib\unit\gear\ins_taki\TL.sqf Для добавления фракции нужно просто добавить папку в gear, а в нее сложить конфиги для нужных слотов. BASE.sqf private ["_unit"]; _unit = _this select 0; removeAllWeapons _unit; removeAllItems _unit; removeBackpack _unit; _unit addWeapon "ItemWatch"; _unit addWeapon "ItemMap"; TL.sqf private ["_unit"]; _unit = _this select 0; _unit addWeapon "ACE_AKM"; _unit addMagazine "ACE_30Rnd_762x39_T_AK47"; А теперь собссно вопросы. 1. Не велосипед ли это с квадратными колесами и может уже давно есть проверенный временем способ динамической подгрузки скриптов, классов и т.п? 2. Насколько безопасно приведенное выше решение с точки зрения быстродействия, утечек памяти и прочих подводных граблей? 1 Dock отреагировал на это Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты
ToxaSM 3 122 Жалоба Опубликовано 15 октября, 2014 @DreadMoroz, из серпа можно достать приблизительно такую тему, там можно хранить любое кол-во файлов с любыми названиями, они выбираются инитом в юните. Может быть ошибаюсь. но вроде также работать должно. Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты
swatSTEAM 737 Жалоба Опубликовано 15 октября, 2014 (изменено) Велосипед. Ботам отключить мозги забыл. lib\unit\gear\ - зачем три папки, когда можно одну? И что имется ввиду под способом динамичной загрузки? Изменено 15 октября, 2014 пользователем swatSTEAM 1 Kurbat отреагировал на это Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты
DreadMoroz 327 Жалоба Опубликовано 15 октября, 2014 можно одну, можно стопицот. не суть. это просто кому какая структура удобнее. а суть в том, что не нужно руками подключать файлы, в данном примере это файлы снаряги. просто бросаешь файл в папку, а потом юзаешь [_unit, "ins_taki", "BASE"] call UnitGear; и не надо лазить ни в какой юнитпроцессор, чтобы добавить #include "TRALALA.sqf" и switch _faction do { case "TRALALA" выбор снаряги - это просто пример. Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты
ToxaSM 3 122 Жалоба Опубликовано 15 октября, 2014 @DreadMoroz, если ты только про подключение, то это в серпе есть, нужно только посмотреть будет ли работать у нас, потому что в те времена, когда я пытался это юзать у меня не работало, но вехпроцессор работал Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты
DreadMoroz 327 Жалоба Опубликовано 15 октября, 2014 @ToxaSM, действительно, в серпе по тому же принципу сделано, только там компилится процессор на каждом юните. в моем варианте просто однажды скомпиленое хранится и вызывается. х3, даст ли это какую то пользу Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты