Скрипт управления танком, сидя за командиром или стрелком

Автор скрипта: DrSova (участник нашего Discord)

init.sqf

AdvancedControl = [tank]; //список техники, которыми можно управлять

Dr_fnc_SpawnMyDriverPlease = {
    _tank = param [0,objNull];
    _role = param [1,""];
    _unit = _tank getVariable ["driverbot",objNull]; //чекаем наличие бота за водителем
    if ((isNull _tank) || (_role isEqualTo "")) exitWith {}; //проверка, что все переменные передались правильно
    if ((_tank in AdvancedControl) && (isNull _unit) && ((_role isEqualTo "commander") || (_role isEqualTo "gunner"))) then { //проверяем, что танк в заранее заданном списке, бот-водитель отсутствует, и что роль игрока стрелок или командир
        _unit = (group player) createUnit [(typeOf player), [0,0,0], [], 0, "NONE"]; // создаем бота
        _unit moveInDriver _tank; //помещаем за водителя
        _unit hideObjectGlobal true; //на всякий случай прячем его
        _unit allowDamage false; //убираем дамаг
        _tank lockDriver true; // убираем возможность сесть за водителя
        _tank setVariable ["driverbot",_unit,true]; //запомнинаем бота
    };
};

player addEventHandler ["GetInMan",{ //хендлер посадки игрока в технику
    _tank = _this select 2; 
    _role = _this select 1;
    [_tank,_role] spawn Dr_fnc_SpawnMyDriverPlease;
}];
player addEventHandler ["GetOutMan",{ //хендлер высадки игрока из техники
   _tank = _this select 2;
   _role = _this select 1;
   _unit = _tank getVariable ["driverbot",objNull]; //чекаем наличие бота за водителем
   if (!(isNull _unit) && (_tank in AdvancedControl) && ((_role isEqualTo "commander") || (_role isEqualTo "gunner"))) then { //проверяем, что бот-водитель существует, что танк в заранее заданном списке и что роль игрока стрелок или командир
      [_unit] join grpNull; //отсоединяем бота от группы игрока, чтобы не спамило в логи после его удаления
      deleteVehicle _unit; //удаляем бота
      _tank lockDriver false; //открываем водительское место
   };
   _gunner = gunner _tank; //возвращаем стрелка танка
   _commander = commander _tank; //возвращаем командира танка
   if ((isPlayer _gunner) && (_role isEqualTo "commander")) then {
      [_tank,_role] remoteExec ["Dr_fnc_SpawnMyDriverPlease",_gunner]; //скрипт спавна водителя у стрелка
   };
   if ((isPlayer _commander) && (_role isEqualTo "gunner")) then {
      [_tank,_role] remoteExec ["Dr_fnc_SpawnMyDriverPlease",_commander];// скрипт спавна водителя у командира
   };
}];

description.ext

#define F(NAME,TARGET) class NAME { \
    allowedTargets = TARGET; \
};

#define ANYONE 0
#define CLIENT 1
#define SERVER 2

class cfgRemoteExec {
    class Functions {
        mode = 1;
        jip = 0;
        F(Dr_fnc_SpawnMyDriverPlease,CLIENT)
    };
};

Известные проблемы:

  •  При пересадке внутри техники, управление не включается. Для этого надо выйти и войти обратно.