DualArms - Two Primary Weapons

83 posts in this topic

Dual Arms

This is mod that allows use of two primary weapons, one in your main slot one in your launcher slot.

You can download the mod from here:

Now on A3Launcher! Thanks Maca!

There are some important overrides that need to be made to make this work with Exile, out of the box it has iffy results and sometimes the eventhandlers would overwrite each other I will provide instructions how to combine my eventHandlers with Exiles. Once the overrides work, then this will work great, just like it would in singleplayer.


Current bug: See the second weapon in the trader with an error image. Will take a look tomorrow solving this so you will not be able to see them in the trader.

Current feature: will stand up if you swap weapons while crouching/prone. This acts like exiles autorun.





Step 1:

Paste the following into your description.ext - its very important because you need to override my hook file to disable the eventhandlers!! Otherwise it will break.

#include "custom\dual_arms\CfgSecondaryWeapons.hpp"

Inside CfgSecondaryWeapons you can turn addactions on and off, drop weapons on death on and off, block weapons as well as override any of my script files.

In mission.sqm please add "secondary_weapons" to addons to require players to have the mod, plus the server needs it as well. Like this:


You will need to launch the @DualArms mod with your server.


Step 2:

The following overrides need to be made


On line 170 (original files)

The code needs to be modified to:

			//Dual Arms Start
				private _dialog = uiNameSpace getVariable ["RscDisplayInventory", displayNull];

				if (secondaryWeapon player != "") then
					if (((secondaryWeapon player) splitString "_") select ((count ((secondaryWeapon player) splitString "_"))-1) == "secondary") then 
						if(!(SecondaryWeaponsSwapping) && (_dialog isEqualTo displayNull)) then
							(primaryWeapon player) spawn SecondaryWeapons_events_swapSecondaryWeapon;
					} else {
						if (secondaryWeapon player != currentWeapon player) then
							player selectWeapon (secondaryWeapon player);
				} else {
					if (primaryWeapon player != "") then 
						if(!(SecondaryWeaponsSwapping) && (_dialog isEqualTo displayNull)) then
							(primaryWeapon player) spawn SecondaryWeapons_events_addSecondaryWeapon;
				//Dual Arms End


after like 16:

//Dual Arms
call SecondaryWeapons_events_onInventoryClosed;


Most important override!!


Replace with a new line of private variables:

private ["_cancelEvent", "_container", "_secondaryContainer", "_throw", "_dialog", "_BG", "_slot", "_prim", "_posSlot", "_posBtn", "_buttonDown", "_buttonUp", "_cover", "_pic", "_icoB", "_ico", "_SecondaryWeaponItems"]; 

Then after the last throw for the old chest and before ExileClientInventoryOpened = true; 



//*************Dual Arms Start
	if (SecondaryWeaponsSwapping) then 
		throw true;
	InventoryOpened = true;

	_dialog = uiNameSpace getVariable ["RscDisplayInventory", displayNull];

	_BG = _dialog displayCtrl 1247;
	_slot = _dialog displayCtrl 611;
	_prim = _dialog displayCtrl 610;
	SecondaryWeaponsAccSlotInfo set [0, ctrlPosition (_dialog displayCtrl 626)];
	SecondaryWeaponsMagazineSlotInfo set [0, ctrlPosition (_dialog displayCtrl 627)];
	SecondaryWeaponsMuzzleSlotInfo set [0, ctrlPosition (_dialog displayCtrl 624)];
	SecondaryWeaponsOpticSlotInfo set [0, ctrlPosition (_dialog displayCtrl 625)];
	SecondaryWeaponsUnderSlotInfo set [0, ctrlPosition (_dialog displayCtrl 642)];

	_posSlot = ctrlPosition _slot;
	SecondaryWeaponsInventoryPosition = _posSlot;
	_posBtn = ctrlPosition _prim;
	_buttonDown = _dialog ctrlCreate ["RscActivePictureDown", 1337];
	_buttonDown ctrlSetPosition [((_posBtn select 0) + (_posBtn select 2) - 0.03), (_posBtn select 1),(_posBtn select 2)/12,(_posBtn select 3)];
	_buttonDown ctrlCommit 0;
	_buttonUp = _dialog ctrlCreate ["RscActivePictureUp", 6969];
	_buttonUp ctrlSetPosition [((_posSlot select 0) + (_posSlot select 2) - 0.03), (_posSlot select 1),(_posSlot select 2)/12,(_posSlot select 3)];
	_buttonUp ctrlEnable (SecondaryWeaponsClassName != "");
	_buttonUp ctrlCommit 0;

	if (((secondaryWeapon player) !="") && {((secondaryWeapon player) splitString "_") select ((count ((secondaryWeapon player) splitString "_"))-1) == "secondary"}) then 
		SecondaryWeaponsClassName = (secondaryWeapon player);
		_cover = _dialog ctrlCreate ["RscText", 1530];

		_cover ctrlSetPosition _posSlot;
		_cover ctrlSetBackgroundColor [0.7,0.7,0.7,0.1];
		_cover ctrlCommit 0;
		_pic = _dialog ctrlCreate ["RscPictureKeepAspect", 1531];

		_pic ctrlSetPosition _posSlot;
		_pic ctrlSetText (getText(configFile >> "cfgWeapons" >> (secondaryWeapon player) >> "img"));
		_pic ctrlCommit 0;	

			_x ctrlSetPosition [0,0,0,0];
			_x ctrlSetScale 0;
			_x ctrlCommit 0;
		} forEach [_slot,_BG];

			(_dialog displayCtrl (_x select 1)) ctrlSetPosition [0,0,0,0];
			(_dialog displayCtrl (_x select 1)) ctrlSetScale 0;
			(_dialog displayCtrl (_x select 1)) ctrlCommit 0;
			(_dialog displayCtrl (_x select 2)) ctrlSetPosition [0,0,0,0];
			(_dialog displayCtrl (_x select 2)) ctrlSetScale 0;
			(_dialog displayCtrl (_x select 2)) ctrlCommit 0;
			_icoB = _dialog ctrlCreate ["RscText", ((_x select 1)*4)];

			_icoB ctrlSetPosition (_x select 0);
			_icoB ctrlSetBackgroundColor [0.7,0.7,0.7,0.1];
			_icoB ctrlCommit 0;
			_ico = _dialog ctrlCreate ["RscPictureKeepAspect", ((_x select 2)*4)];

			_ico ctrlSetPosition (_x select 0);
			_ico ctrlSetText (_x select 4);
			_ico ctrlCommit 0;
		} forEach [SecondaryWeaponsAccSlotInfo,SecondaryWeaponsMagazineSlotInfo,SecondaryWeaponsMuzzleSlotInfo,SecondaryWeaponsOpticSlotInfo,SecondaryWeaponsUnderSlotInfo];

		_SecondaryWeaponItems = false call SecondaryWeapons_util_Ammo;

		if(((_SecondaryWeaponItems select 0) select 1) != "") then
			((_SecondaryWeaponItems select 0) select 1) call SecondaryWeapons_gui_muzzleSlot;
		if(count SecondaryWeaponsWeaponInfo > 0 && !((SecondaryWeaponsWeaponInfo select 0) isEqualTo "ARRAY")) then
			(SecondaryWeaponsWeaponInfo select 0) call SecondaryWeapons_gui_accSlot;
		if(((_SecondaryWeaponItems select 0) select 2) != "") then
			((_SecondaryWeaponItems select 0) select 2) call SecondaryWeapons_gui_opticSlot;
		if(((_SecondaryWeaponItems select 0) select 3) != "") then
			((_SecondaryWeaponItems select 0) select 3) call SecondaryWeapons_gui_underSlot;
		if(count (_SecondaryWeaponItems select 1) > 0) then
			(_SecondaryWeaponItems select 1) call SecondaryWeapons_gui_magazineSlot;
		SecondaryWeaponsClassName = "";
	//*************Dual Arms End



After line 41 - not inside the brackets add:

//Dual Arms
_this call SecondaryWeapons_events_onKilled;


After line 15 and before the if statement I added:

//Dual Arms
_this call SecondaryWeapons_events_onTake;


Step 1:

Handling a disconnecting player, for Exile you will need to modify/make an override for ExileServer_system_network_event_onHandleDisconnect.sqf

You will need the following bit of code to save the users pointer attachment (IR Laser/Flashlight etc and UGL Ammo (HE Rounds etc))

//Dual Arms Start

		_SWInfo = _unit getVariable ["SecondaryWeaponsWeaponInfo", []];
		if(count _SWInfo > 0) then
			_uniform = uniformContainer _unit;
			_vest = vestContainer _unit;
			_backpack = backpackContainer _unit;
			_containers = [_uniform, _vest, _backpack];
				_item = _x;
				_className = "";
				_array = false;
				_added = false;
				if(typeName _item isEqualTo "ARRAY") then
					_array = true;
					_className = _x select 0;
				} else {
					_className = _x;
					if (!(isNull _x)) then 
						if (_x canAdd [_className, 1]) exitWith 
							if(_array) then
								_unit addMagazine [_className, _item select 1];
							} else {
								_className = [_className, 0, -10] call BIS_fnc_trimString;
								_unit addItem _className;
							_added = true;
					if (_added) exitWith {};
				} forEach _containers;
			} forEach _SWInfo;
		//Dual Arms End



see override on github to not display secondary weapons in trader menus.


Please see this github for an example mission edits:

Download again is here:

Please post if you have any questions or mods to be added, they will be added in batches.

The current list of supported mods is:

NIArms :
Project Infinite :
Exile Mod :
ADR-97 Weapon Pack :
Operation: TREBUCHET :
Cup Weapons :
NATO_Rus_Weapons :
Specialist Military Arms (SMA) :
The_Unsung_Vietnam_War_Mod :
FFAA Mod :
2035: Russian Armed Forces :
FHQ Firearms :
BWMod :
SFP: Swedish Forces Pack :
3CB BAF Weapons :
Faces of war :
Arma 3 Aegis (Beta) :


  • Like 20

Share this post

Link to post
Share on other sites

Accidentally used like age-old ExileClient_gui_hud_event_onKeyUp.sqf - the current one is now properly on fix if you grabbed files early or didn't patch my edits in with yours the correct file is now in use :)

  • Like 2

Share this post

Link to post
Share on other sites
1 hour ago, [HG]RaVeN103 said:

Nice addon,:rock:

How about a weight limit? Max mass 200? Maybe it's a bit overpowered to wear 2 heavy Mg's:D

Would be easy enough, all my files are overrideable! ;) 


Updated original post to fix a dupe method with the keybind.. if you already grabbed files please make the proper fixes found in the github or original post!

Share this post

Link to post
Share on other sites

Looks like someone was inspired by Tapkob .. nice mod! Kudos! Now lets wait till its in main branch since client sided modification is needed, which you cant ask of any admins of hi-pop to tell their children

Edited by parsec
  • Like 1

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

  • Recently Browsing   0 members

    No registered users viewing this page.