Jump to content

Recommended Posts

MGI ENHANCED TURRET

 

Last update 09/05/2018

 

Hi all,

Here is a little script allowing AI gunners to fire HE shells on infantry.

I hoped Tank DLC will improve some AI features about targeting and ammo firing possibilities, but it seems not.

So, running this script makes gunners load some accurate shells to fire with cannon. It's complementary to MGs.

 

On the other hand, I tried to overwrite the targeting engine as far as the present BI one consider a team leader more dangerous than an AT soldier...

The result is disastrous, of course. I gave up with this idea. If it's easy to choose the best threat to be shot, it's impossible to override the engine to order the gunner to watch, aim, fire at the chosen target. Engine has its own life...  as usual, commands do nothing persistent (working) on that.

 

 

parameters:   none (at this time)

 

Script can be added in init.sqf or initServer.sqf


 

0=[] spawn {
  while {true} do {
    uiSleep 4;
    _allCannonVehicles = vehicles select {local _x && isNil {_x getVariable "admitVeh"} && !(_x isKindOf "WeaponHolderSimulated")
    && (getText (configfile >> "CfgVehicles" >> typeOf _x >> "editorSubcategory") in ["EdSubcat_APCs","EdSubcat_Tanks","EdSubcat_Artillery"])};
    
    {
      _x setVariable ["admitVeh",true,true];
      _x spawn {
        params [["_tk",objNull],["_tgt",objNull]];
        private _wpnTrt = _tk weaponsTurret [0];
        private _cannon = (_wpnTrt select {getText (configfile >> "CfgWeapons" >> _x >> "nameSound") == "cannon"}) select 0;
        if (isnil "_cannon") then {_cannon = ""};
        if (_cannon != "") then {
          _cannonMags = getArray (configFile >> "cfgweapons" >> _cannon >> "magazines");
          _cannonReloadTime = getNumber (configfile >> "CfgWeapons" >> _cannon >> "magazineReloadTime");
          _magsDetail = magazinesAmmo _tk;
          _magsDetail apply {
            _class = (configfile >> "CfgAmmo" >>getText (configfile >> "CfgMagazines" >> _x select 0 >> "ammo") >> "aiAmmoUsageFlags");
            _usage = if (istext _class) then [{(getText _class) splitString " + "},{[str(getNumber _class)]}];
            _x pushback _usage;_x
          };

        while {alive (_tk turretUnit [0])} do {
          _gunner = _tk turretUnit [0];
          if (!((_tk targets [true,700]) isEqualTo []) && !isPlayer _gunner) then {
            _tgts = (_tk targets [true,700]) apply {[_tk aimedAtTarget [_x],_x]};
            _tgts sort false;
            _tgt = _tgts select 0 select 1;
            _magsDetail = _magsDetail select {(_x select 1) > 0};
            if (((_tgt isKindOf "landVehicle") or (_tgt isKindOf "CAManBase" && diag_tickTime mod 30 <= 6)) && _tk currentWeaponTurret [0] != str _cannon) then {
                _tk selectWeaponTurret [_cannon,[0]]
            };
            call {
              if (_tgt isKindOf "landVehicle" && !(_tgt isKindOf "car")) exitWith {
                for "_i" from 0 to count _magsDetail -1 do {
                  if ("512" in (_magsDetail select _i select 2) && (_magsDetail select _i select 0) in _cannonMags) exitWith {
                    _tk loadMagazine [[0],_cannon,_magsDetail select _i select 0];
                  };
                };
              };
              if (secondaryWeapon _tgt != "" && diag_tickTime mod 30 <= 6) exitWith {
                for "_i" from 0 to count _magsDetail -1 do {
                  if ("64" in (_magsDetail select _i select 2) && (_magsDetail select _i select 0) in _cannonMags && !(_tk getVariable ["loaded64",false])) exitWith {
                      _tk loadMagazine [[0],_cannon,_magsDetail select _i select 0];
                  };
                };
              };
              if (_tgt isKindOf "landVehicle") exitWith {
                for "_i" from 0 to count _magsDetail -1 do {
                  if ("128" in (_magsDetail select _i select 2) && (_magsDetail select _i select 0) in _cannonMags) exitWith {
                    _tk loadMagazine [[0],_cannon,_magsDetail select _i select 0];
                  };
                };
              };
              if (_tgt isKindOf "CAManBase" && diag_tickTime mod 30 <= 6) exitWith {
                for "_i" from 0 to count _magsDetail -1 do {
                  if ("64" in (_magsDetail select _i select 2) && (_magsDetail select _i select 0) in _cannonMags) exitWith {
                    _tk loadMagazine [[0],_cannon,_magsDetail select _i select 0];
                  };
                };
              };
            };
              uiSleep _cannonReloadTime;
            } else {
              uiSleep 2;
            };
          };
        };
      };
    } forEach _allCannonVehicles;
  };
};

 

Feedback welcome.

  • Like 2
  • Thanks 1

Share this post


Link to post
Share on other sites

Hey @pierremgi !  Thanks for the script.  I too was surprised that Tanks DLC didn’t address some of the more fundamental areas of tank combat.  Tell me, would this be possible to put into a mod version so that it could apply to all tanks ?  If so it would be a wonderful addition to my ‘always on’ mods !

  • Like 1

Share this post


Link to post
Share on other sites

We can put this scripts into mod for private.

It works fine in official campaign on my environment 

Thanks for nice script! This should be function of official Arma 3.

Share this post


Link to post
Share on other sites

Please sign in to comment

You will be able to leave a comment after signing in



Sign In Now

×