Перейти к содержанию

Добро пожаловать на проект
Weekly Open Games

Weekly Open Games — это проект для людей, которым интересен хардкорный тип игры. Мы стараемся максимально эффективно использовать структуру, слабые и сильные стороны, а также технику и вооружение различных сторон конфликта, но не ставим перед собой цель провести 100% сбалансированного боестолкновения. Командная игра, командное взаимодействие — фундамент нашего проекта.
О проекте WOG Как начать играть Правила серверов
Авторизация  
DreadMoroz

Динамическая подгрузка нужных скриптов

Рекомендуемые сообщения

Юнитпроцессор в вогомиссиях люто бесит необходимостью лезть в него для добавления/удаления фракций

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. Насколько безопасно приведенное выше решение с точки зрения быстродействия, утечек памяти и прочих подводных граблей?

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

@DreadMoroz, из серпа можно достать приблизительно такую тему, там можно хранить любое кол-во файлов с любыми названиями, они выбираются инитом в юните. 

Может быть ошибаюсь. но вроде также работать должно. 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Велосипед. Ботам отключить мозги забыл.

lib\unit\gear\ - зачем три папки, когда можно одну?

И что имется ввиду под способом динамичной загрузки?

Изменено пользователем swatSTEAM

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

можно одну, можно стопицот. не суть. это просто кому какая структура удобнее.

а суть в том, что не нужно руками подключать файлы, в данном примере это файлы снаряги.

просто бросаешь файл в папку, а потом юзаешь [_unit, "ins_taki", "BASE"] call UnitGear;

и не надо лазить ни в какой юнитпроцессор, чтобы добавить #include "TRALALA.sqf" и switch _faction do {     case "TRALALA"

 

выбор снаряги - это просто пример.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

@DreadMoroz, если ты только про подключение, то это в серпе есть, нужно только посмотреть будет ли работать у нас, потому что в те времена, когда я пытался это юзать у меня не работало, но вехпроцессор работал 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

@ToxaSM, действительно, в серпе по тому же принципу сделано, только там компилится процессор на каждом юните.

в моем варианте просто однажды скомпиленое хранится и вызывается.

х3, даст ли это какую то пользу

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Для публикации сообщений создайте учётную запись или авторизуйтесь

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

Создать учетную запись

Зарегистрируйте новую учётную запись в нашем сообществе. Это очень просто!

Регистрация нового пользователя

Войти

Уже есть аккаунт? Войти в систему.

Войти
Авторизация  

  • Последние посетители   0 пользователей онлайн

    Ни одного зарегистрированного пользователя не просматривает данную страницу

×

Важная информация

Мы разместили cookie-файлы на ваше устройство, чтобы помочь сделать этот сайт лучше. Вы можете изменить свои настройки cookie-файлов, или продолжить без изменения настроек.