Делаем предмету (ноутбук, папка документов и тд.) возможность поднять

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

Для себя я нашел два варианта решения такой задачи: с помощью скрипта и с помощью мода. Первый проще и быстрее, но не лишен багов, да и вообще способ «костыльный». В любом случае, мы разберем оба варианта.

Первый:

Создаем в редакторе ноутбук (например «Land_Laptop_F») и называем его notebook. В инициализации ему пишем:

this addAction ["Взять ноутбук",{(_this # 0) execVM "notebook.sqf";}];

Теперь у ноутбук появилась кнопочка «Взять ноутбук», нажав на которую будет вызываться скрипт notebook.sqf.
В корне миссии создаем этот самый файл notebook.sqf и в него пишем следующее:
1. Удаляем ноутбук, затем добавляем нам в униформу ХИС (химический источник света). Я выбрал желтый.

deleteVehicle _this;
player addItemToUniform "Chemlight_yellow";

2. Добавляем функцию, которая будет заменять данные этого ХИСа.

fnc_changeItem = {
  waitUntil {!isNull findDisplay 602}; //ждем пока откроется дисплей инвентаря

  _uniform = (findDisplay 602) displayCtrl 633; //создаем переменную для control 633. Это список вещей униформы
  _size = lbSize _uniform; //узнаем сколько вещей в униформе
  _index = -1; //создаем переменную с индексом
  for "_i" from 0 to (_size - 1) do { //создаем цикл для проверки всех вещей униформы, чтобы найти наш ХИС
    if ((lbData [633,_i]) == "Chemlight_yellow") exitWith { //если ХИС найден, присваиваем его индекс переменной _index
      _index = _i;
    };
  };

  _uniform lbSetText [_index,"Ноутбук"]; //Меняем текст 
  _uniform lbSetTooltip [_index,"Ноутбук очень приочень важный"]; //Описание не меняется. В чем причина я так и не разобрался
  _uniform lbSetPicture [_index,"D:\noutbook.paa"]; //меняем картинку на ту, которая нам нужна
  _uniform lbSetColor [_index,[1,0,0,1]]; //и даже меняем цвет текста, чтобы игрок точно знал, что штука эта важная ))
};

3. Добавляем хендлер на открытие инвентаря, который и будет вызывать нашу функцию.

pEHopen = player addEventHandler ["InventoryOpened", {
  [] spawn fnc_changeItem;
}];

На этом все. На скриншоте видно, как это работает, а так же видно, какие есть баги. Всплывающая подсказка (tooltip) не меняет текст, так и не понял почему. При выкидывании ноутбука в списке слева он выглядит, как ХИС. Конечно, можно отслеживать это и менять текст и картинку и там. Так же, при выкидывании ноутбука, на земле появляется не ноутбук, а тот же ХИС. Нужно отслеживать и этот момент, менять хис на ноутбук и снова добавлять ему экшн на поднятие, а плееру, который выкинул ноут, не забыть удалить хендлер, чтобы, если он поднимет где-то желтый ХИС, этот хис не перекрашивался в ноутбук.

 

Второй способ:

Второй способ мне нравится больше, хоть я не занимаюсь модами, да и не разбираюсь в этом, но постарался понять, как же сделать правильный ноутбук для инвентаря.

В папке с армой создаем папку с любым названием, например @new_item. Это будет папка с нашим модом. В этой папке создаем еще одну папку — addons. В ней еще одну с любым названием, у меня это bt_notebook. В ней создаем файл config.cpp и две папки: images и models.

В папке images должна лежать картинка в формате .paa. Эта картинка является иконкой, которая будет отображаться в инвентаре.

В папке models должна лежать 3d модель в формате .p3d. Это модель ноутбука в моем случае. Я не делаю 3d модели (пока что, по крайней мере :)), поэтому взял модель ноутбука из самой Армы. Можно было указать прямой путь до модели, но я решил скопировать для наглядности, чтобы Вы потом могли без проблем ее заменить на свою.

Теперь пишем конфиг. Описание конфига будет скудное, так как, повторюсь, я не мододел и в этом не разбираюсь.

class CfgPatches
{
    class bt_notebook //название класса должно быть такое же как у папки, которая лежит в папке addons
    {
        units[]={};
        weapons[]={};
        requiredVersion=1;
        author[]={"BlackTok"};
    };
};
class CfgMagazines
{
    class CA_Magazine;
    class bt_notebook_F: CA_Magazine
    {
        displayName = "NoteBook BT";
        scope=2;
        author = "BlackTok";
        picture = "\bt_notebook\images\noutbook.paa"; //путь до картинки
        model = "\bt_notebook\models\Laptop_F"; //путь до модели
        icon = "iconObject_circle";
        descriptionShort = "Описание";
    };
};

В результате при добавлении ноутбука в инвентарь:

player addItemToUniform "bt_notebook_F";

Если нам нужно его отспаунить на земле — то пишем так:

_objpick = createVehicle ["groundweaponHolder",[7080.58,7310.69,0],[], 0, "can_collide"] ; 
_objpick additemcargoGlobal ["bt_notebook_F", 1];

 

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

Мод в собранном виде: скачать

Если же что-то непонятно, то можно спросить / уточнить в нашем Discord канале