Merge pull request #2390 from BaerMitUmlaut/pass-magazine

Added interaction to quickly pass a magazine
This commit is contained in:
Thomas Kooi 2015-11-25 14:04:07 +01:00
commit 08c5374a99
6 changed files with 142 additions and 0 deletions

View File

@ -4,4 +4,11 @@ class ACE_Settings {
value = 1;
typeName = "BOOL";
};
class GVAR(enableMagazinePassing) {
value = 1;
typeName = "BOOL";
isClientSettable = 1;
displayName = CSTRING(PassMagazineSetting);
category = ECSTRING(interact_menu,Category_InteractionMenu);
};
};

View File

@ -36,6 +36,32 @@ class CfgVehicles {
icon = "\a3\ui_f\data\IGUI\Cfg\Actions\eject_ca.paa";
selection = "pelvis";
class ACE_PassMagazine {
displayName = CSTRING(PassMagazine);
condition = "";
statement = "";
showDisabled = 0;
priority = 3.3;
icon = "\a3\ui_f\data\gui\Rsc\RscDisplayArsenal\cargomag_ca.paa";
class ACE_PassMagazinePrimary {
displayName = CSTRING(PassMagazinePrimary);
condition = QUOTE([ARR_3(_player,_target,primaryWeapon _target)] call FUNC(canPassMagazine));
statement = QUOTE([ARR_3(_player,_target,primaryWeapon _target)] call FUNC(passMagazine));
showDisabled = 0;
priority = 3;
icon = "\a3\ui_f\data\gui\Rsc\RscDisplayArsenal\primaryweapon_ca.paa";
};
class ACE_PassMagazineHandgun {
displayName = CSTRING(PassMagazineHandgun);
condition = QUOTE([ARR_3(_player,_target,handgunWeapon _target)] call FUNC(canPassMagazine));
statement = QUOTE([ARR_3(_player,_target,handgunWeapon _target)] call FUNC(passMagazine));
showDisabled = 0;
priority = 1;
icon = "\a3\ui_f\data\gui\Rsc\RscDisplayArsenal\handgun_ca.paa";
};
};
class ACE_TeamManagement {
displayName = CSTRING(TeamManagement);
condition = QUOTE([ARR_2(_player,_target)] call DFUNC(canJoinTeam) && {GVAR(EnableTeamManagement)});

View File

@ -20,6 +20,8 @@ PREP(sendAway);
PREP(canJoinGroup);
PREP(canJoinTeam);
PREP(joinTeam);
PREP(canPassMagazine);
PREP(passMagazine);
PREP(canBecomeLeader);
PREP(doBecomeLeader);
PREP(canTapShoulder);

View File

@ -0,0 +1,30 @@
/*
* Author: BaerMitUmlaut
* Checks if unit has a spare magazine for the specified weapon.
*
* Arguments:
* 0: Unit that passes the magazine <OBJECT>
* 1: Unit to pass the magazine to <OBJECT>
* 2: Weapon classname <STRING>
*
* Return Value:
* Unit can pass magazine <BOOL>
*
* Example:
* [_player, _target, "arifle_MX_F"] call ace_interaction_fnc_canPassMagazine
*
* Public: No
*/
#include "script_component.hpp"
params ["_player", "_target", "_weapon"];
private ["_compatibleMags"];
if (!GVAR(enableMagazinePassing)) exitWith {false};
_compatibleMags = getArray (configfile >> "CfgWeapons" >> _weapon >> "magazines");
{
_x params ["_className", "", "_loaded"];
if ((_className in _compatibleMags) && {!_loaded} && {_target canAdd _className}) exitWith {true};
false
} foreach (magazinesAmmoFull _player);

View File

@ -0,0 +1,57 @@
/*
* Author: BaerMitUmlaut
* Pass spare magazine for the specified weapon.
*
* Arguments:
* 0: Unit that passes the magazine <OBJECT>
* 1: Unit to pass the magazine to <OBJECT>
* 2: Weapon classname <STRING>
*
* Return Value:
* None
*
* Example:
* [_player, _target, "arifle_MX_F"] call ace_interaction_fnc_magToPassazine
*
* Public: No
*/
#include "script_component.hpp"
params ["_player", "_target", "_weapon"];
private ["_compatibleMags", "_filteredMags", "_magToPass", "_magToPassIndex", "_playerName", "_magToPassDisplayName"];
_compatibleMags = getArray (configfile >> "CfgWeapons" >> _weapon >> "magazines");
_filteredMags = [magazinesAmmoFull _player, {
params ["_className", "", "_loaded"];
_className in _compatibleMags && !_loaded
}] call EFUNC(common,filter);
//select magazine with most ammo
_magToPass = _filteredMags select 0;
_magToPassIndex = 0;
{
_x params ["_className", "_ammoCount"];
if ((_ammoCount > (_magToPass select 1)) && (_target canAdd _className)) then {
_magToPass = _x;
_magToPassIndex = _forEachIndex;
};
} foreach _filteredMags;
//remove all magazines and add them again, except the one to be passed
//needed because of missing commands, see http://feedback.arma3.com/view.php?id=12782
_magToPass params ["_magToPassClassName", "_magToPassAmmoCount"];
_player removeMagazines _magToPassClassName;
{
_x params ["_className", "_ammoCount"];
if ((_className == _magToPassClassName) && (_forEachIndex != _magToPassIndex)) then {
_player addMagazine [_className, _ammoCount];
};
} foreach _filteredMags;
_player playActionNow "PutDown";
_target addMagazine [_magToPassClassName, _magToPassAmmoCount];
_playerName = [_player] call EFUNC(common,getName);
_magToPassDisplayName = getText (configFile >> "CfgMagazines" >> _magToPassClassName >> "displayName");
["displayTextStructured", [_target], [[LSTRING(PassMagazineHint), _playerName, _magToPassDisplayName], 1.5, _target]] call EFUNC(common,targetEvent);

View File

@ -823,5 +823,25 @@
<Portuguese>O módulo de gestão de equipe é composto por: a atribuição de cores para os membros da equipe, comando das equipes, juntando-se / deixando equipes.</Portuguese>
<Russian>Управление группами позволяет назначать цвета членам групп, брать командование, вступать в группы или покидать их.</Russian>
</Key>
<Key ID="STR_ACE_Interaction_PassMagazine">
<English>Pass magazine</English>
<German>Magazin geben</German>
</Key>
<Key ID="STR_ACE_Interaction_PassMagazinePrimary">
<English>Primary magazine</English>
<German>Gewehrmagazin</German>
</Key>
<Key ID="STR_ACE_Interaction_PassMagazineHandgun">
<English>Pistol magazine</English>
<German>Pistolenmagazin</German>
</Key>
<Key ID="STR_ACE_Interaction_PassMagazineHint">
<English>%1 passed you a %2 magazine.</English>
<German>%1 hat dir ein %2 Magazin gegeben.</German>
</Key>
<Key ID="STR_ACE_Interaction_PassMagazineSetting">
<English>Show "pass magazine" interaction</English>
<German>Zeige "Magazine geben" Interaktion</German>
</Key>
</Package>
</Project>