Jump to content

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

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

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

Recommended Posts

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

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

 

Share this post


Link to post
Share on other sites

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

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

Share this post


Link to post
Share on other sites

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

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

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

Edited by swatSTEAM

Share this post


Link to post
Share on other sites

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

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

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

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

 

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

Share this post


Link to post
Share on other sites

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

Share this post


Link to post
Share on other sites

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

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

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

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
Sign in to follow this  

  • Recently Browsing   0 members

    No registered users viewing this page.

×

Important Information

We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.