OFPEC Forum

Editors Depot - Mission Editing and Scripting => Arma2 - Editing/Scripting General => Topic started by: Zipper5 on 22 Aug 2009, 19:57:14

Title: Weapons check
Post by: Zipper5 on 22 Aug 2009, 19:57:14
Heh, soon as one problem is solved, another pops up. That's mission making in a nutshell...

Anyways, here's my next issue: I've found many people miss the Gear selections provided by the mission maker when testing or just simply playing the mission. For this mission, Gear selection is quite important. What I am trying to do is check the default loadout (the loadout I've given him) of the player against what he has when the mission starts. If there's no difference, a hint will be displayed notifying him about it and it will add all of the Gear selection to the vehicle he starts off in.

Now, here's how I've attempted to approach the issue, which does not work:

Code: [Select]
_mags = magazines player;
_weaps = weapons player;

_startMags = [
"30Rnd_556x45_Stanag",
"30Rnd_556x45_Stanag",
"30Rnd_556x45_Stanag",
"30Rnd_556x45_Stanag",
"30Rnd_556x45_Stanag",
"30Rnd_556x45_Stanag",
"HandGrenade_West",
"HandGrenade_West",
"SmokeShell",
"SmokeShell",
"1Rnd_HE_M203",
"1Rnd_HE_M203",
"FlareRed_M203",
"FlareGreen_M203",
"15Rnd_9x19_M9",
"15Rnd_9x19_M9",
"15Rnd_9x19_M9",
"15Rnd_9x19_M9"
];

_startWeaps = [
"M4A1_HWS_GL_camo",
"M9",
"Binocular",
"NVGoggles"
];

if {_mags = _startMags} then
{
if {_weaps = _startWeaps} then
{
hint "Since your weapon loadout has remained the same, presumably you missed the available gear selection. For this reason, it has been added to this helicopter.\nIt is accessable by selecting Gear in your Action Menu.";
Gear selection follows...
};
};

So, judging from that, by what means should I be approaching this issue to get it to work?
Thanks guys, and sorry for the trouble. :D

Edit: Noticed a typo, fixed it, but it still doesn't work anyways.
Title: Re: Weapons check
Post by: Mandoble on 22 Aug 2009, 20:33:56
Use == instead of = in comparisons, = is just for assignments.
Title: Re: Weapons check
Post by: Zipper5 on 22 Aug 2009, 21:18:42
Ah ok, fixed that. Thanks Mandoble. Unfortunately, the issue still persists. I get the following error message:

Code: [Select]
Error if: type code, expected Bool

*link to script*, line 39
(null)

(null)
Title: Re: Weapons check
Post by: Deadfast on 22 Aug 2009, 21:38:34
You're wrapping conditions in curly brackets, use round ones ;)


Code: [Select]
_mags = magazines player;
_weaps = weapons player;

_startMags = [
"30Rnd_556x45_Stanag",
"30Rnd_556x45_Stanag",
"30Rnd_556x45_Stanag",
"30Rnd_556x45_Stanag",
"30Rnd_556x45_Stanag",
"30Rnd_556x45_Stanag",
"HandGrenade_West",
"HandGrenade_West",
"SmokeShell",
"SmokeShell",
"1Rnd_HE_M203",
"1Rnd_HE_M203",
"FlareRed_M203",
"FlareGreen_M203",
"15Rnd_9x19_M9",
"15Rnd_9x19_M9",
"15Rnd_9x19_M9",
"15Rnd_9x19_M9"
];

_startWeaps = [
"M4A1_HWS_GL_camo",
"M9",
"Binocular",
"NVGoggles"
];

if (_mags == _startMags) then
{
if (_weaps == _startWeaps) then
{
hint "Since your weapon loadout has remained the same, presumably you missed the available gear selection. For this reason, it has been added to this helicopter.\nIt is accessable by selecting Gear in your Action Menu.";
//Gear selection follows...
};
};
Title: Re: Weapons check
Post by: Zipper5 on 22 Aug 2009, 22:31:08
Heh, ok. Thanks Deadfast. Jeeze, all these SQF syntax errors. You can tell I'm only just starting to learn how to script in SQF...

Unfortunately, that still throws up an error, though it's a different one this time:

Code: [Select]
(null)
(null)


entry,Display (dialog),Control,Team member,Task,Location

*link to script*, line 39

 :confused:

Edit: This is what the current script looks like:

Code: [Select]
_mags = magazines player;
_weaps = weapons player;
_veh = vehicle player;

_startMags = [
"30Rnd_556x45_Stanag",
"30Rnd_556x45_Stanag",
"30Rnd_556x45_Stanag",
"30Rnd_556x45_Stanag",
"30Rnd_556x45_Stanag",
"30Rnd_556x45_Stanag",
"HandGrenade_West",
"HandGrenade_West",
"SmokeShell",
"SmokeShell",
"1Rnd_HE_M203",
"1Rnd_HE_M203",
"FlareRed_M203",
"FlareGreen_M203",
"15Rnd_9x19_M9",
"15Rnd_9x19_M9",
"15Rnd_9x19_M9",
"15Rnd_9x19_M9"
];

_startWeaps = [
"M4A1_HWS_GL_camo",
"M9",
"Binocular",
"NVGoggles"
];

sleep 2;

if (_mags == _startMags) then
{
if (_weaps == _startWeaps) then
{
hint "Since your weapon loadout has remained the same, presumably you missed the available gear selection. For this reason, it has been added to the helicopter.\n\nIt is accessable by selecting Gear in your Action Menu.\n\nYou can also change your squad members' loadouts by going to the Map screen, selecting Units, highlighting the member whose gear you wish to change, and selecting Gear.";

_veh addWeaponCargo ["M4A1_AIM", 4];
_veh addWeaponCargo ["M4A1_RCO_GL", 2];
_veh addWeaponCargo ["M4A1_HWS_GL", 2];
_veh addWeaponCargo ["M4SPR", 1];
_veh addWeaponCargo ["DMR", 1];
_veh addWeaponCargo ["MP5A5", 2];
_veh addWeaponCargo ["MP5SD", 2];
_veh addWeaponCargo ["M249", 2];
_veh addWeaponCargo ["M9", 5];
_veh addWeaponCargo ["M9SD", 2];
_veh addWeaponCargo ["M136", 2];
_veh addWeaponCargo ["Stinger", 2];
_veh addWeaponCargo ["Binocular", 4];
_veh addWeaponCargo ["NVGoggles", 4];

_veh addMagazineCargo ["30Rnd_556x45_Stanag", 54];
_veh addMagazineCargo ["20Rnd_762x51_DMR", 12];
_veh addMagazineCargo ["30Rnd_9x19_MP5", 12];
_veh addMagazineCargo ["30Rnd_9x19_MP5SD", 12];
_veh addMagazineCargo ["200Rnd_556x45_M249", 8];
_veh addMagazineCargo ["15Rnd_9x19_M9", 40];
_veh addMagazineCargo ["15Rnd_9x19_M9SD", 16];
_veh addMagazineCargo ["M136", 2];
_veh addMagazineCargo ["Stinger", 2];
_veh addMagazineCargo ["HandGrenade_West", 30];
_veh addMagazineCargo ["SmokeShell", 30];
_veh addMagazineCargo ["PipeBomb", 12];
};
};

waitUntil {!(w1 in wh1) && !(w2 in wh1) && !(w3 in wh1) && !(w4 in wh1)};

clearWeaponCargo wh1;
clearMagazineCargo wh1;

exit
Title: Re: Weapons check
Post by: Deadfast on 23 Aug 2009, 00:13:25
Ah yeah, just realized you were comparing arrays. Unfortunately you can't do that like this, you need to compare every single array component with a respective counterpart.


Here's a function I made for this purpose:
Code: [Select]
_arrayCompare =
{
private ["_array1", "_array2", "_i", "_return"];

_array1 = _this select 0;
_array2 = _this select 1;

_return = true;
if ( (count _array1) != (count _array2) ) then
{
_return = false;
}
else
{
_i = 0;
while {_i < (count _array1) && _return} do
{
if ( (typeName (_array1 select _i)) != (typeName (_array2 select _i)) ) then
{
_return = false;
}
else
{
if (typeName (_array1 select _i) == "ARRAY") then
{
if (!([_array1 select _i, _array2 select _i] call _arrayCompare)) then
{
_return = false;
};
}
else
{
if ((_array1 select _i) != (_array2 select _i)) then
{
_return = false;
};
};
};
_i = _i + 1;
};
};

_return
};

Returns true if arrays match, false if not.


BTW, get rid of that exit at the end of the script, SQF scripts always end themselves with the end of the file ;)




This is how your script should look like:
Code: [Select]
_arrayCompare =
{
private ["_array1", "_array2", "_i", "_return"];

_array1 = _this select 0;
_array2 = _this select 1;

_return = true;
if ( (count _array1) != (count _array2) ) then
{
_return = false;
}
else
{
_i = 0;
while {_i < (count _array1) && _return} do
{
if ( (typeName (_array1 select _i)) != (typeName (_array2 select _i)) ) then
{
_return = false;
}
else
{
if (typeName (_array1 select _i) == "ARRAY") then
{
if (!([_array1 select _i, _array2 select _i] call _arrayCompare)) then
{
_return = false;
};
}
else
{
if ((_array1 select _i) != (_array2 select _i)) then
{
_return = false;
};
};
};
_i = _i + 1;
};
};

_return
};

_mags = magazines player;
_weaps = weapons player;
_veh = vehicle player;

_startMags = [
"30Rnd_556x45_Stanag",
"30Rnd_556x45_Stanag",
"30Rnd_556x45_Stanag",
"30Rnd_556x45_Stanag",
"30Rnd_556x45_Stanag",
"30Rnd_556x45_Stanag",
"HandGrenade_West",
"HandGrenade_West",
"SmokeShell",
"SmokeShell",
"1Rnd_HE_M203",
"1Rnd_HE_M203",
"FlareRed_M203",
"FlareGreen_M203",
"15Rnd_9x19_M9",
"15Rnd_9x19_M9",
"15Rnd_9x19_M9",
"15Rnd_9x19_M9"
];

_startWeaps = [
"M4A1_HWS_GL_camo",
"M9",
"Binocular",
"NVGoggles"
];

sleep 2;

if ([_mags, _startMags] call _arrayCompare && [_weaps, _startWeaps] call _arrayCompare) then
{
hint "Since your weapon loadout has remained the same, presumably you missed the available gear selection. For this reason, it has been added to the helicopter.\n\nIt is accessable by selecting Gear in your Action Menu.\n\nYou can also change your squad members' loadouts by going to the Map screen, selecting Units, highlighting the member whose gear you wish to change, and selecting Gear.";

_veh addWeaponCargo ["M4A1_AIM", 4];
_veh addWeaponCargo ["M4A1_RCO_GL", 2];
_veh addWeaponCargo ["M4A1_HWS_GL", 2];
_veh addWeaponCargo ["M4SPR", 1];
_veh addWeaponCargo ["DMR", 1];
_veh addWeaponCargo ["MP5A5", 2];
_veh addWeaponCargo ["MP5SD", 2];
_veh addWeaponCargo ["M249", 2];
_veh addWeaponCargo ["M9", 5];
_veh addWeaponCargo ["M9SD", 2];
_veh addWeaponCargo ["M136", 2];
_veh addWeaponCargo ["Stinger", 2];
_veh addWeaponCargo ["Binocular", 4];
_veh addWeaponCargo ["NVGoggles", 4];

_veh addMagazineCargo ["30Rnd_556x45_Stanag", 54];
_veh addMagazineCargo ["20Rnd_762x51_DMR", 12];
_veh addMagazineCargo ["30Rnd_9x19_MP5", 12];
_veh addMagazineCargo ["30Rnd_9x19_MP5SD", 12];
_veh addMagazineCargo ["200Rnd_556x45_M249", 8];
_veh addMagazineCargo ["15Rnd_9x19_M9", 40];
_veh addMagazineCargo ["15Rnd_9x19_M9SD", 16];
_veh addMagazineCargo ["M136", 2];
_veh addMagazineCargo ["Stinger", 2];
_veh addMagazineCargo ["HandGrenade_West", 30];
_veh addMagazineCargo ["SmokeShell", 30];
_veh addMagazineCargo ["PipeBomb", 12];
};

waitUntil {!(w1 in wh1) && !(w2 in wh1) && !(w3 in wh1) && !(w4 in wh1)};

clearWeaponCargo wh1;
clearMagazineCargo wh1;


EDIT: Updated the function so it now can work with nested arrays too, merged the 2 IFs
EDIT2: Fixed the function
Title: Re: Weapons check
Post by: Zipper5 on 23 Aug 2009, 09:43:43
Thanks for that Deadfast. However, now I get an error about _array1 not being defined.
Title: Re: Weapons check
Post by: Deadfast on 23 Aug 2009, 11:44:27
Haha, no wonder, somehow I managed to leave out the defining part of the function, modifying my previous post.

Done and sorry about that :D