Jump to content
Sign in to follow this  
Grumpy Old Man

Read Weapons from Cfg and sort them according to "firepower"?

Recommended Posts

Hey folks,

I'm trying to read all weapons (rifles, pistols) from the CfgWeapons and sort them depending on the caliber, optics etc., into different "firepower" arrays.

The goal is to make at least 3 arrays ascending from "low firepower" (5.56mm rifles without RCO/MRCO/ARCO) up to "high firepower" (7.62mm rifles with DMS/SOS/LRPS), you get the idea.

Using this script it would be possible to dynamically use addon weapons depending on their "firepower" (for low to high threat engagements) without any further efforts.

Where I'm currently struggling is how to determine the caliber of a weapon (is there a config value that I'm missing?) and if it has any optics mounted (so that "arifle_Mk20_F" and "arifle_Mk20_MRCO_F" won't end up in the same "firepower" array).

Any ideas?

Cheers

Share this post


Link to post
Share on other sites

A weapons caliber isn't controlled by the weapons config per say, more or less the weapon should have an entry for it's magazine which is where you will get the ballistics aspect (Fetch Weapon magazine->Fetch Ammo type->blah blah blah). It's been awhile since I have looked at the configs for magazines / Ammo so I'm not sure which one will have what you want but just start digging through them.

Share this post


Link to post
Share on other sites

Seems that caliber is an abstract value that doesn't have anything to do with the actual caliber, just like you said.

I can just try to filter for the hit value now, no idea if this is gonna work out.

That's what I got so far:

_filtered = [];

_cfg = (configFile >> "CfgWeapons");

for "_i" from 0 to ((count _cfg)-1) do {

if (isClass ((_cfg select _i) )) then {

	_cfgName = configName (_cfg select _i);
	_getmagazines = getarray (configfile >> "CfgWeapons" >> _cfgName >> "magazines");
	_gettype = getnumber (configfile >> "CfgWeapons" >> _cfgName >> "type");

	if ((_gettype <= 4 AND _gettype > 0) AND (getNumber ((_cfg select _i) >> "scope") == 2) AND (count _getmagazines > 0)) then {

		_magazine = _getmagazines select 0;
		_ammo = gettext (configfile >> "CfgMagazines" >> _magazine >> "ammo");
		_hitvalue = getnumber (configfile >> "CfgAmmo" >> _ammo >> "hit");

		_filtered set [_i, _cfgName];

	};
};
};

GOM_list_allweapons = _filtered;
hint str _filtered;
copytoclipboard str _filtered;

For some weird reason it's throwing a lot of <null> element into the array, all other elements consist of only equippable weapons just as intended.

Now to find a way to filter for attachments/hit value.

Share this post


Link to post
Share on other sites

this is some code i worked on some time ago to add prices based on a few things, power is one of them.

hope it helps, this is only for rifles

// Rifles
_count =  count (configFile >> "CfgWeapons");
for "_x" from 0 to (_count-1) do
{
 _item=((configFile >> "CfgWeapons") select _x);
 if (isClass _item) then
 {
   if (getnumber (_item >> "scope") == 2) then  // public
   {
     if (count(getarray (_item >> "magazines")) !=0 ) then  //WeaponHardMounted
     {    	
       if (getnumber (_item >> "type") == 1) then  //WeaponSlotPrimary
       {
       	_price = 0;
       	_displayName = getText (_item >> "displayName");
       	_magname = (getArray(_item >> "magazines"))select 0;
       	_magnames = (getArray(_item >> "magazines"));
       	_linkedOptics = (getText(_item >> "LinkedItems" >> "LinkedItemsOptic" >> "item" ));
       	_linkedMuzzle = (getText(_item >> "LinkedItems" >> "LinkedItemsMuzzle" >> "item" ));        	
       	_linkedAccs = (getText(_item >> "LinkedItems" >> "LinkedItemsAcc" >> "item" ));


       	if(_linkedOptics != "")then
       	{
       		{if(_x == _linkedOptics)exitwith{_price = _price + ((SQU_accessoriesCfg select _foreachIndex)select 0)}}forEach SQU_accessories;
       	};
       	if(_linkedMuzzle != "")then
       	{
       		{if(_x == _linkedMuzzle)exitwith{_price = _price + ((SQU_accessoriesCfg select _foreachIndex)select 0)}}forEach SQU_accessories;
       	};
       	if(_linkedAccs != "")then
       	{
       		{if(_x == _linkedAccs)exitwith{_price = _price + ((SQU_accessoriesCfg select _foreachIndex)select 0)}}forEach SQU_accessories;
       	};        	        	     	



       	{
       		_ammo = getText(configFile >> "CfgMagazines" >> _x >> "ammo");
       	 _price = _price + (getNumber(_item >> "WeaponSlotsInfo" >> "mass") + (getNumber(configFile >> "cfgAmmo" >> _ammo >> "hit") + getNumber(configFile >> "cfgAmmo" >> _ammo >> "indirecthit")) * (count(getArray(_item >> "muzzles"))));
       	}foreach _magnames;

       	SQU_Rifles = SQU_Rifles + [configName _item];
         SQU_RiflesCfg = SQU_RiflesCfg + [[_price,configName _item]];
       };
     };			
 	};
};
};

Edited by Squeeze

Share this post


Link to post
Share on other sites

Thanks for sharing, Squeeze, good insight on the LinkedItems entry, will be of use!

Cheers

---------- Post added at 09:06 ---------- Previous post was at 08:33 ----------

Got it sorted finally, gonna implement a further filter for scopes and attachments later this weekend.

Working script:

//This script will filter all weapons including AddOn weapons to improve custom loadout handling
//All weapons are stored in the GOM_list_allweapons array:
//
//Handguns: GOM_list_allweapons select 0;
//Low damage rifles: (GOM_list_allweapons select 1) select 0;
//Medium damage rifles: (GOM_list_allweapons select 1) select 1;
//High damage rifles: (GOM_list_allweapons select 1) select 2;
//Non-locking Launchers: (GOM_list_allweapons select 2) select 0;
//Locking Launchers: (GOM_list_allweapons select 2) select 1;

_pistols = [];
_lowrifles = [];
_medrifles = [];
_highrifles = [];
_lowlaunchers = [];
_highlaunchers = [];

_cfg = (configFile >> "CfgWeapons");

for "_i" from 0 to ((count _cfg)-1) do {

if (isClass ((_cfg select _i) )) then {

	_cfgName = configName (_cfg select _i);
	_getmagazines = getarray (configfile >> "CfgWeapons" >> _cfgName >> "magazines");
	_gettype = getnumber (configfile >> "CfgWeapons" >> _cfgName >> "type");
	_check = (configfile >> "CfgWeapons" >> _cfgName >> "type");

	if ((_gettype <= 4 AND _gettype > 0) AND (getNumber ((_cfg select _i) >> "scope") == 2) AND (count _getmagazines != 0)) then {

		_magazine = _getmagazines select 0;
		_ammo = gettext (configfile >> "CfgMagazines" >> _magazine >> "ammo");
		_hitvalue = getnumber (configfile >> "CfgAmmo" >> _ammo >> "hit");

		if (_gettype == 2) then {


			_pistols set [count _pistols, _cfgName];

		};

		if (_gettype == 1) then {

			if (_hitvalue < 10) then {

				_lowrifles set [count _lowrifles, _cfgName];

			};

			if (_hitvalue >= 10 AND _hitvalue < 12) then {

				_medrifles set [count _medrifles, _cfgName];

			};

			if (_hitvalue >= 12) then {

				_highrifles set [count _highrifles, _cfgName];

			};

		};

		_getlock = getnumber (configfile >> "CfgWeapons" >> _cfgName >> "canLock");

		if (_gettype == 4 AND _getlock < 2) then {

			_lowlaunchers set [count _lowlaunchers, _cfgName];

		};

		if (_gettype == 4 AND _getlock == 2) then {

			_highlaunchers set [count _highlaunchers, _cfgName];

		};
	};
};
};

GOM_list_allweapons = [_pistols,[_lowrifles,_medrifles,_highrifles],[_lowlaunchers,_highlaunchers]];

true

How the array looks like with vanilla A3 weapons:

[
//handguns:
["hgun_ACPC2_F","hgun_ACPC2_snds_F","hgun_P07_F","hgun_P07_snds_F","hgun_Pistol_heavy_01_F","hgun_Pistol_heavy_01_snds_F","hgun_Pistol_heavy_01_MRD_F","hgun_Pistol_heavy_02_F","hgun_Pistol_heavy_02_Yorris_F","hgun_Rook40_F","hgun_Rook40_snds_F","hgun_Pistol_Signal_F"],

[
//low damage rifles:
["arifle_Mk20_F","arifle_Mk20_plain_F","arifle_Mk20C_F","arifle_Mk20C_plain_F","arifle_Mk20_GL_F","arifle_Mk20_GL_plain_F","arifle_Mk20C_ACO_F","arifle_Mk20C_ACO_pointer_F","arifle_Mk20_pointer_F","arifle_Mk20_Holo_F","arifle_Mk20_ACO_F","arifle_Mk20_ACO_pointer_F","arifle_Mk20_MRCO_F","arifle_Mk20_MRCO_plain_F","arifle_Mk20_MRCO_pointer_F","arifle_Mk20_GL_MRCO_pointer_F","arifle_Mk20_GL_ACO_F","arifle_SDAR_F","arifle_TRG21_F","arifle_TRG20_F","arifle_TRG21_GL_F","arifle_TRG20_Holo_F","arifle_TRG20_ACO_pointer_F","arifle_TRG20_ACO_Flash_F","arifle_TRG20_ACO_F","arifle_TRG21_ACO_pointer_F","arifle_TRG21_ARCO_pointer_F","arifle_TRG21_MRCO_F","arifle_TRG21_GL_MRCO_F","arifle_TRG21_GL_ACO_pointer_F","hgun_PDW2000_F","hgun_PDW2000_snds_F","hgun_PDW2000_Holo_F","hgun_PDW2000_Holo_snds_F","SMG_01_F","SMG_01_Holo_F","SMG_01_Holo_pointer_snds_F","SMG_01_ACO_F","SMG_02_F","SMG_02_ACO_F","SMG_02_ARCO_pointg_F"],

//medium damage rifles:
["LMG_Mk200_F","LMG_Mk200_MRCO_F","LMG_Mk200_pointer_F","arifle_Katiba_F","arifle_Katiba_C_F","arifle_Katiba_GL_F","arifle_Katiba_C_ACO_pointer_F","arifle_Katiba_C_ACO_F","arifle_Katiba_ACO_F","arifle_Katiba_ACO_pointer_F","arifle_Katiba_ARCO_F","arifle_Katiba_ARCO_pointer_F","arifle_Katiba_GL_ACO_F","arifle_Katiba_GL_ARCO_pointer_F","arifle_Katiba_GL_ACO_pointer_F","arifle_Katiba_GL_Nstalker_pointer_F","arifle_Katiba_GL_ACO_pointer_snds_F","arifle_Katiba_C_ACO_pointer_snds_F","arifle_Katiba_ACO_pointer_snds_F","arifle_Katiba_ARCO_pointer_snds_F","arifle_MXC_F","arifle_MX_F","arifle_MX_GL_F","arifle_MX_SW_F","arifle_MXM_F","arifle_MX_pointer_F","arifle_MX_Holo_pointer_F","arifle_MX_Hamr_pointer_F","arifle_MX_ACO_pointer_F","arifle_MX_ACO_F","arifle_MX_GL_ACO_F","arifle_MX_GL_ACO_pointer_F","arifle_MX_GL_Hamr_pointer_F","arifle_MXC_Holo_F","arifle_MXC_Holo_pointer_F","arifle_MX_SW_pointer_F","arifle_MX_SW_Hamr_pointer_F","arifle_MXM_Hamr_pointer_F","arifle_MXC_ACO_F","arifle_MXC_Holo_pointer_snds_F","arifle_MXC_SOS_point_snds_F","arifle_MXC_ACO_pointer_snds_F","arifle_MXC_ACO_pointer_F","arifle_MX_ACO_pointer_snds_F","arifle_MX_RCO_pointer_snds_F","arifle_MX_GL_Holo_pointer_snds_F","arifle_MXM_SOS_pointer_F","arifle_MXM_RCO_pointer_snds_F","arifle_MXM_DMS_F","arifle_MXC_Black_F","arifle_MX_Black_F","arifle_MX_GL_Black_F","arifle_MX_SW_Black_F","arifle_MXM_Black_F","arifle_MX_GL_Black_Hamr_pointer_F","arifle_MX_Black_Hamr_pointer_F","arifle_MX_SW_Black_Hamr_pointer_F"],

//high damage rifles:
["srifle_DMR_01_F","srifle_DMR_01_ACO_F","srifle_DMR_01_MRCO_F","srifle_DMR_01_SOS_F","srifle_DMR_01_DMS_F","srifle_DMR_01_DMS_snds_F","srifle_DMR_01_ARCO_F","srifle_EBR_F","srifle_EBR_ACO_F","srifle_EBR_MRCO_pointer_F","srifle_EBR_ARCO_pointer_F","srifle_EBR_SOS_F","srifle_EBR_ARCO_pointer_snds_F","srifle_EBR_DMS_F","srifle_EBR_Hamr_pointer_F","srifle_EBR_DMS_pointer_snds_F","srifle_GM6_F","srifle_GM6_SOS_F","srifle_GM6_LRPS_F","srifle_LRR_F","srifle_LRR_SOS_F","srifle_LRR_LRPS_F","LMG_Zafir_F","LMG_Zafir_pointer_F"]
],

[
//launchers without lock:
["launch_RPG32_F"],
//launchers with lock
["launch_NLAW_F","launch_B_Titan_F","launch_I_Titan_F","launch_O_Titan_F","launch_B_Titan_short_F","launch_I_Titan_short_F","launch_O_Titan_short_F"]
]
]

And here's the array with 3 random weapon AddOns loaded:

[
//handguns
["hgun_ACPC2_F","hgun_ACPC2_snds_F","hgun_P07_F","hgun_P07_snds_F","hgun_Pistol_heavy_01_F","hgun_Pistol_heavy_01_snds_F","hgun_Pistol_heavy_01_MRD_F","hgun_Pistol_heavy_02_F","hgun_Pistol_heavy_02_Yorris_F","hgun_Rook40_F","hgun_Rook40_snds_F","hgun_Pistol_Signal_F"],

[
//low damage rifles:
["arifle_Mk20_F","arifle_Mk20_plain_F","arifle_Mk20C_F","arifle_Mk20C_plain_F","arifle_Mk20_GL_F","arifle_Mk20_GL_plain_F","arifle_Mk20C_ACO_F","arifle_Mk20C_ACO_pointer_F","arifle_Mk20_pointer_F","arifle_Mk20_Holo_F","arifle_Mk20_ACO_F","arifle_Mk20_ACO_pointer_F","arifle_Mk20_MRCO_F","arifle_Mk20_MRCO_plain_F","arifle_Mk20_MRCO_pointer_F","arifle_Mk20_GL_MRCO_pointer_F","arifle_Mk20_GL_ACO_F","arifle_SDAR_F","arifle_TRG21_F","arifle_TRG20_F","arifle_TRG21_GL_F","arifle_TRG20_Holo_F","arifle_TRG20_ACO_pointer_F","arifle_TRG20_ACO_Flash_F","arifle_TRG20_ACO_F","arifle_TRG21_ACO_pointer_F","arifle_TRG21_ARCO_pointer_F","arifle_TRG21_MRCO_F","arifle_TRG21_GL_MRCO_F","arifle_TRG21_GL_ACO_pointer_F","hgun_PDW2000_F","hgun_PDW2000_snds_F","hgun_PDW2000_Holo_F","hgun_PDW2000_Holo_snds_F","SMG_01_F","SMG_01_Holo_F","SMG_01_Holo_pointer_snds_F","SMG_01_ACO_F","SMG_02_F","SMG_02_ACO_F","SMG_02_ARCO_pointg_F","sgun_AA12_F","sgun_AA12_ACO_IR","BTC_m4a3","BTC_m4a3_gl","BTC_m16a4","BTC_m16a4_gl","BTC_mk16","BTC_mk16_gl","BTC_m249"],

//medium damage rifles:
["LMG_Mk200_F","LMG_Mk200_MRCO_F","LMG_Mk200_pointer_F","arifle_Katiba_F","arifle_Katiba_C_F","arifle_Katiba_GL_F","arifle_Katiba_C_ACO_pointer_F","arifle_Katiba_C_ACO_F","arifle_Katiba_ACO_F","arifle_Katiba_ACO_pointer_F","arifle_Katiba_ARCO_F","arifle_Katiba_ARCO_pointer_F","arifle_Katiba_GL_ACO_F","arifle_Katiba_GL_ARCO_pointer_F","arifle_Katiba_GL_ACO_pointer_F","arifle_Katiba_GL_Nstalker_pointer_F","arifle_Katiba_GL_ACO_pointer_snds_F","arifle_Katiba_C_ACO_pointer_snds_F","arifle_Katiba_ACO_pointer_snds_F","arifle_Katiba_ARCO_pointer_snds_F","arifle_MXC_F","arifle_MX_F","arifle_MX_GL_F","arifle_MX_SW_F","arifle_MXM_F","arifle_MX_pointer_F","arifle_MX_Holo_pointer_F","arifle_MX_Hamr_pointer_F","arifle_MX_ACO_pointer_F","arifle_MX_ACO_F","arifle_MX_GL_ACO_F","arifle_MX_GL_ACO_pointer_F","arifle_MX_GL_Hamr_pointer_F","arifle_MXC_Holo_F","arifle_MXC_Holo_pointer_F","arifle_MX_SW_pointer_F","arifle_MX_SW_Hamr_pointer_F","arifle_MXM_Hamr_pointer_F","arifle_MXC_ACO_F","arifle_MXC_Holo_pointer_snds_F","arifle_MXC_SOS_point_snds_F","arifle_MXC_ACO_pointer_snds_F","arifle_MXC_ACO_pointer_F","arifle_MX_ACO_pointer_snds_F","arifle_MX_RCO_pointer_snds_F","arifle_MX_GL_Holo_pointer_snds_F","arifle_MXM_SOS_pointer_F","arifle_MXM_RCO_pointer_snds_F","arifle_MXM_DMS_F","arifle_MXC_Black_F","arifle_MX_Black_F","arifle_MX_GL_Black_F","arifle_MX_SW_Black_F","arifle_MXM_Black_F","arifle_MX_GL_Black_Hamr_pointer_F","arifle_MX_Black_Hamr_pointer_F","arifle_MX_SW_Black_Hamr_pointer_F"],

//high damage rifles:
["srifle_DMR_01_F","srifle_DMR_01_ACO_F","srifle_DMR_01_MRCO_F","srifle_DMR_01_SOS_F","srifle_DMR_01_DMS_F","srifle_DMR_01_DMS_snds_F","srifle_DMR_01_ARCO_F","srifle_EBR_F","srifle_EBR_ACO_F","srifle_EBR_MRCO_pointer_F","srifle_EBR_ARCO_pointer_F","srifle_EBR_SOS_F","srifle_EBR_ARCO_pointer_snds_F","srifle_EBR_DMS_F","srifle_EBR_Hamr_pointer_F","srifle_EBR_DMS_pointer_snds_F","srifle_GM6_F","srifle_GM6_SOS_F","srifle_GM6_LRPS_F","srifle_LRR_F","srifle_LRR_SOS_F","srifle_LRR_LRPS_F","LMG_Zafir_F","LMG_Zafir_pointer_F","srifle_BISAK107GL_F","srifle_BISAK107_F","srifle_BISAK47S_F","srifle_BISAK74GLVOG_F","srifle_BISAK74_F","srifle_BISAK74GL_F","srifle_BISAKM_F","srifle_BISAKS74_F","srifle_BISAKS74Cobra_F","srifle_BISAKS74u_F","srifle_BISRPK74_F","BTC_mk17","BTC_mk17_gl","BTC_m14","BTC_dmr","BTC_m107","BTC_m240","BTC_mk48"]

],

[
//launchers without lock:
["launch_RPG32_F","BTC_smaw","BTC_maaws","BTC_m136"],
//launchers with lock:
["launch_NLAW_F","launch_B_Titan_F","launch_I_Titan_F","launch_O_Titan_F","launch_B_Titan_short_F","launch_I_Titan_short_F","launch_O_Titan_short_F","BTC_stinger"] 
]

]

Edited by Grumpy Old Man
  • Like 1

Share this post


Link to post
Share on other sites

This is awesome work Grumpy, thanks for sharing it :)

I had a similar idea in mind but in the end wrote a script to export arrays for me to copy paste into my scripts and then cut out the stuff like templates and hidden weapons.

On a similar note, do you happen to know how to check if a weapon supports 40mm grenade rounds?

Edit: Best I came up with was as follows, but I'd worry that addon weapons might get muddled up in that.

if ((count (getArray (configfile >> "CfgWeapons" >> _primary >> "muzzles"))) > 1) then {true}

Edited by SilentSpike

Share this post


Link to post
Share on other sites

I was doing the same approach as you for custom loadouts, with future weapon additions and user made content this would surely be a nightmare to fix, hence the idea for this script.

Gonna add checks and filters for optics, attachments and UGL later this weekend, and also trying to find a way to exclude vanilla weapons/addon weapons from being added to the array, will open another thread for release ;)

Edited by Grumpy Old Man

Share this post


Link to post
Share on other sites

"Caliber" is actually not in cfgmagazines, it's in cfgammo, and it is not the same as the actual caliber of the ammunition. It actually adjusts how well a projectile penetrates materials. I think the 6.5mm is used as reference and has caliber 1.0 while 7.62 has 1.6. Two types of ammunition of the same caliber may have widely different cfg value for "caliber". For example, armor piercing projectiles will be much higher "caliber" compared to mild steel core ammo, even though they are the same caliber. "Caliber" should in my opinion have been named "penetration" or something like that, becouse that is actually what is is.

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
Sign in to follow this  

×