mirror of
https://github.com/acemod/ACE3.git
synced 2024-08-30 18:23:18 +00:00
Merge branch 'master' into disarmingTest
This commit is contained in:
commit
e8112ada71
@ -1,16 +1,16 @@
|
||||
/*
|
||||
* Author: commy2
|
||||
*
|
||||
* Check if the unit can interact.
|
||||
*
|
||||
* Arguments:
|
||||
* 0: The player. (Object)
|
||||
* 1: The interaction target. objNull to ignore. (Object)
|
||||
* 2: Exceptions. What general conditions are to skip? (Array)
|
||||
* 0: The player. <OBJECT>
|
||||
* 1: The interaction target. objNull to ignore. <OBJECT>
|
||||
* 2: Exceptions. What general conditions are to skip? <ARRAY> (Optional)
|
||||
*
|
||||
* Return Value:
|
||||
* Unit can interact?
|
||||
*
|
||||
* Public: No
|
||||
*/
|
||||
#include "script_component.hpp"
|
||||
|
||||
@ -18,7 +18,11 @@ private ["_unit", "_target", "_exceptions"];
|
||||
|
||||
_unit = _this select 0;
|
||||
_target = _this select 1;
|
||||
_exceptions = _this select 2;
|
||||
_exceptions = if (count _this > 2) then {
|
||||
_this select 2;
|
||||
} else {
|
||||
[];
|
||||
};
|
||||
|
||||
_exceptions = [_exceptions, {toLower _this}] call FUNC(map);
|
||||
|
||||
|
@ -48,5 +48,8 @@ if (_type in _initializedClasses) exitWith {};
|
||||
_initializedClasses pushBack _type;
|
||||
GVAR(initializedClasses_carry) = _initializedClasses;
|
||||
|
||||
[_type, 0, ["ACE_MainActions", QGVAR(carry)], localize "STR_ACE_Dragging_Carry", "", "", {[_player, _target] call FUNC(carryObject)}, {[_player, _target] call FUNC(canCarry)}, 2] call EFUNC(interact_menu,addClassAction);
|
||||
[_type, 0, ["ACE_MainActions", QGVAR(drop_carry)], localize "STR_ACE_Dragging_Drop", "", "", {[_player, _target] call FUNC(dropObject_carry)}, {[_player, _target] call FUNC(canDrop_carry)}, 2] call EFUNC(interact_menu,addClassAction);
|
||||
_carryAction = [QGVAR(drag), localize "STR_ACE_Dragging_Carry", "", {[_player, _target] call FUNC(carryObject)}, {[_player, _target] call FUNC(canCarry)}] call EFUNC(interact_menu,createAction);
|
||||
_dropAction = [QGVAR(drop), localize "STR_ACE_Dragging_Drop", "", {[_player, _target] call FUNC(dropObject_carry)}, {[_player, _target] call FUNC(canDrop_carry)}] call EFUNC(interact_menu,createAction);
|
||||
|
||||
[_type, 0, ["ACE_MainActions"], _carryAction] call EFUNC(interact_menu,addActionToClass);
|
||||
[_type, 0, ["ACE_MainActions"], _dropAction] call EFUNC(interact_menu,addActionToClass);
|
||||
|
@ -48,5 +48,8 @@ if (_type in _initializedClasses) exitWith {};
|
||||
_initializedClasses pushBack _type;
|
||||
GVAR(initializedClasses) = _initializedClasses;
|
||||
|
||||
[_type, 0, ["ACE_MainActions", QGVAR(drag)], localize "STR_ACE_Dragging_Drag", "", "", {[_player, _target] call FUNC(startDrag)}, {[_player, _target] call FUNC(canDrag)}, 2] call EFUNC(interact_menu,addClassAction);
|
||||
[_type, 0, ["ACE_MainActions", QGVAR(drop)], localize "STR_ACE_Dragging_Drop", "", "", {[_player, _target] call FUNC(dropObject)}, {[_player, _target] call FUNC(canDrop)}, 2] call EFUNC(interact_menu,addClassAction);
|
||||
_dragAction = [QGVAR(drag), localize "STR_ACE_Dragging_Drag", "", {[_player, _target] call FUNC(startDrag)}, {[_player, _target] call FUNC(canDrag)}] call EFUNC(interact_menu,createAction);
|
||||
_dropAction = [QGVAR(drop), localize "STR_ACE_Dragging_Drop", "", {[_player, _target] call FUNC(dropObject)}, {[_player, _target] call FUNC(canDrop)}] call EFUNC(interact_menu,createAction);
|
||||
|
||||
[_type, 0, ["ACE_MainActions"], _dragAction] call EFUNC(interact_menu,addActionToClass);
|
||||
[_type, 0, ["ACE_MainActions"], _dropAction] call EFUNC(interact_menu,addActionToClass);
|
||||
|
@ -1 +1 @@
|
||||
z\ace\addons\hearing
|
||||
z\ace\addons\gforces
|
||||
|
@ -2,21 +2,25 @@
|
||||
|
||||
ADDON = false;
|
||||
|
||||
PREP(addAction);
|
||||
PREP(addClassAction);
|
||||
PREP(addActionToClass);
|
||||
PREP(addActionToObject);
|
||||
PREP(compileMenu);
|
||||
PREP(compileMenuSelfAction);
|
||||
PREP(collectActiveActionTree);
|
||||
PREP(createAction);
|
||||
PREP(findActionNode);
|
||||
PREP(isSubPath);
|
||||
PREP(keyDown);
|
||||
PREP(keyDownSelfAction);
|
||||
PREP(keyUp);
|
||||
PREP(keyUpSelfAction);
|
||||
PREP(removeAction);
|
||||
PREP(removeClassAction);
|
||||
PREP(removeActionFromClass);
|
||||
PREP(removeActionFromObject);
|
||||
PREP(render);
|
||||
PREP(renderIcon);
|
||||
PREP(renderBaseMenu);
|
||||
PREP(renderIcon);
|
||||
PREP(renderMenu);
|
||||
PREP(splitPath);
|
||||
|
||||
GVAR(keyDown) = false;
|
||||
GVAR(keyDownSelfAction) = false;
|
||||
|
@ -1,59 +0,0 @@
|
||||
/*
|
||||
* Author: commy2, NouberNou and CAA-Picard
|
||||
* Add an ACE action to an object, under a certain config path
|
||||
* Note: This function is NOT global.
|
||||
*
|
||||
* Argument:
|
||||
* 0: Object the action should be assigned to <OBJECT>
|
||||
* 1: Type of action, 0 for actions, 1 for self-actions <NUMBER>
|
||||
* 2: Full path of the new action <ARRAY>
|
||||
* 3: Name of the action shown in the menu <STRING>
|
||||
* 4: Icon <STRING>
|
||||
* 5: Position (Position or Selection Name) <POSITION> or <STRING>
|
||||
* 6: Statement <CODE>
|
||||
* 7: Condition <CODE>
|
||||
* 8: Distance <NUMBER>
|
||||
* 9: Other parameters <ARRAY> (Optional)
|
||||
*
|
||||
* Return value:
|
||||
* The entry full path, which can be used to remove the entry, or add children entries <ARRAY>.
|
||||
*
|
||||
* Example:
|
||||
* [cursorTarget,0,["ACE_TapShoulderRight","VulcanPinch"],"Vulcan Pinch","",[0,0,0],{_target setDamage 1;},{true},100] call ace_interact_menu_fnc_addAction;
|
||||
*
|
||||
* Public: No
|
||||
*/
|
||||
#include "script_component.hpp"
|
||||
|
||||
EXPLODE_9_PVT(_this,_object,_typeNum,_fullPath,_displayName,_icon,_position,_statement,_condition,_distance);
|
||||
|
||||
private ["_varName","_actions","_params","_entry"];
|
||||
|
||||
_varName = [QGVAR(actions),QGVAR(selfActions)] select _typeNum;
|
||||
_actions = _object getVariable [_varName, []];
|
||||
if((count _actions) == 0) then {
|
||||
_object setVariable [_varName, _actions];
|
||||
};
|
||||
|
||||
_params = [false,false,false,false];
|
||||
if (count _this > 9) then {
|
||||
_params = _this select 9;
|
||||
};
|
||||
|
||||
_entry = [
|
||||
[
|
||||
_displayName,
|
||||
_icon,
|
||||
_position,
|
||||
_statement,
|
||||
_condition,
|
||||
_distance,
|
||||
_params,
|
||||
+ _fullPath
|
||||
],
|
||||
[]
|
||||
];
|
||||
|
||||
_actions pushBack _entry;
|
||||
|
||||
_fullPath
|
45
addons/interact_menu/functions/fnc_addActionToClass.sqf
Normal file
45
addons/interact_menu/functions/fnc_addActionToClass.sqf
Normal file
@ -0,0 +1,45 @@
|
||||
/*
|
||||
* Author: CAA-Picard
|
||||
* Insert an ACE action to a class, under a certain path
|
||||
* Note: This function is NOT global.
|
||||
*
|
||||
* Argument:
|
||||
* 0: TypeOf of the class <STRING>
|
||||
* 1: Type of action, 0 for actions, 1 for self-actions <NUMBER>
|
||||
* 2: Parent path of the new action <ARRAY>
|
||||
* 3: Action <ARRAY>
|
||||
*
|
||||
* Return value:
|
||||
* The entry full path, which can be used to remove the entry, or add children entries <ARRAY>.
|
||||
*
|
||||
* Example:
|
||||
* [typeOf cursorTarget, 0, ["ACE_TapShoulderRight"],VulcanPinchAction] call ace_interact_menu_fnc_addActionToClass;
|
||||
*
|
||||
* Public: No
|
||||
*/
|
||||
#include "script_component.hpp"
|
||||
|
||||
EXPLODE_4_PVT(_this,_objectType,_typeNum,_parentPath,_action);
|
||||
|
||||
// Ensure the config menu was compiled first
|
||||
if (_typeNum == 0) then {
|
||||
[_objectType] call FUNC(compileMenu);
|
||||
} else {
|
||||
[_objectType] call FUNC(compileMenuSelfAction);
|
||||
};
|
||||
|
||||
private ["_varName","_actionTrees", "_parentNode"];
|
||||
_varName = format [[QGVAR(Act_%1), QGVAR(SelfAct_%1)] select _typeNum, _objectType];
|
||||
_actionTrees = missionNamespace getVariable [_varName, []];
|
||||
if((count _actionTrees) == 0) then {
|
||||
missionNamespace setVariable [_varName, _actionTrees];
|
||||
};
|
||||
|
||||
_parentNode = [_actionTrees, _parentPath] call FUNC(findActionNode);
|
||||
if (isNil {_parentNode}) exitWith {};
|
||||
|
||||
// Add action node as children of the correct node of action tree
|
||||
(_parentNode select 1) pushBack [_action,[]];
|
||||
|
||||
// Return the full path
|
||||
(+ _parentPath) pushBack (_action select 0)
|
35
addons/interact_menu/functions/fnc_addActionToObject.sqf
Normal file
35
addons/interact_menu/functions/fnc_addActionToObject.sqf
Normal file
@ -0,0 +1,35 @@
|
||||
/*
|
||||
* Author: CAA-Picard
|
||||
* Insert an ACE action to an object, under a certain config path
|
||||
* Note: This function is NOT global.
|
||||
*
|
||||
* Argument:
|
||||
* 0: Object the action should be assigned to <OBJECT>
|
||||
* 1: Type of action, 0 for actions, 1 for self-actions <NUMBER>
|
||||
* 2: Parent path of the new action <ARRAY>
|
||||
* 3: Action <ARRAY>
|
||||
*
|
||||
* Return value:
|
||||
* The entry full path, which can be used to remove the entry, or add children entries <ARRAY>.
|
||||
*
|
||||
* Example:
|
||||
* [typeOf cursorTarget, 0, ["ACE_TapShoulderRight"],VulcanPinchAction] call ace_interact_menu_fnc_addActionToClass;
|
||||
*
|
||||
* Public: No
|
||||
*/
|
||||
#include "script_component.hpp"
|
||||
|
||||
EXPLODE_4_PVT(_this,_object,_typeNum,_parentPath,_action);
|
||||
|
||||
private ["_varName","_actionList"];
|
||||
_varName = [QGVAR(actions),QGVAR(selfActions)] select _typeNum;
|
||||
_actionList = _object getVariable [_varName, []];
|
||||
if((count _actionList) == 0) then {
|
||||
_object setVariable [_varName, _actionList];
|
||||
};
|
||||
|
||||
// Add action and parent path to the list of object actions
|
||||
_actionList pushBack [_action, +_parentPath];
|
||||
|
||||
// Return the full path
|
||||
(+ _parentPath) pushBack (_action select 0)
|
@ -1,94 +0,0 @@
|
||||
/*
|
||||
* Author: CAA-Picard
|
||||
* Add an ACE action to a class, under a certain path
|
||||
* Note: This function is NOT global.
|
||||
*
|
||||
* Argument:
|
||||
* 0: TypeOf of the class <STRING>
|
||||
* 1: Type of action, 0 for actions, 1 for self-actions <NUMBER>
|
||||
* 2: Full path of the new action <ARRAY>
|
||||
* 3: Name of the action shown in the menu <STRING>
|
||||
* 4: Icon <STRING>
|
||||
* 5: Position (Position or Selection Name) <POSITION> or <STRING>
|
||||
* 6: Statement <CODE>
|
||||
* 7: Condition <CODE>
|
||||
* 8: Distance <NUMBER>
|
||||
* 9: Other parameters <ARRAY> (Optional)
|
||||
*
|
||||
* Return value:
|
||||
* The entry full path, which can be used to remove the entry, or add children entries <ARRAY>.
|
||||
*
|
||||
* Example:
|
||||
* [typeOf cursorTarget, 0,["ACE_TapShoulderRight","VulcanPinch"],"Vulcan Pinch","",[0,0,0],{_target setDamage 1;},{true},100] call ace_interact_menu_fnc_addClassAction;
|
||||
*
|
||||
* Public: No
|
||||
*/
|
||||
#include "script_component.hpp"
|
||||
|
||||
EXPLODE_9_PVT(_this,_objectType,_typeNum,_fullPath,_displayName,_icon,_position,_statement,_condition,_distance);
|
||||
|
||||
// Ensure the config menu was compiled first
|
||||
if (_typeNum == 0) then {
|
||||
[_objectType] call FUNC(compileMenu);
|
||||
} else {
|
||||
[_objectType] call FUNC(compileMenuSelfAction);
|
||||
};
|
||||
|
||||
private ["_varName","_actions","_params","_entry", "_parentLevel", "_foundParentLevel", "_fnc_findFolder"];
|
||||
|
||||
_varName = format [[QGVAR(Act_%1), QGVAR(SelfAct_%1)] select _typeNum, _objectType];
|
||||
_actions = missionNamespace getVariable [_varName, []];
|
||||
if((count _actions) == 0) then {
|
||||
missionNamespace setVariable [_varName, _actions];
|
||||
};
|
||||
|
||||
_params = [false,false,false,false];
|
||||
if (count _this > 9) then {
|
||||
_params = _this select 9;
|
||||
};
|
||||
|
||||
// Search the class action trees and find where to insert the entry
|
||||
_parentLevel = _actions;
|
||||
_foundParentLevel = false;
|
||||
|
||||
_fnc_findFolder = {
|
||||
EXPLODE_3_PVT(_this,_fullPath,_level,_classActions);
|
||||
|
||||
if (count _fullPath == _level + 1) then {
|
||||
_parentLevel = _classActions;
|
||||
_foundParentLevel = true;
|
||||
};
|
||||
|
||||
if (_foundParentLevel) exitWith {};
|
||||
|
||||
{
|
||||
EXPLODE_2_PVT(_x,_actionData,_actionChildren);
|
||||
if (((_actionData select 7) select _level) isEqualTo (_fullPath select _level)) exitWith {
|
||||
// The action should go somewhere in here
|
||||
[_fullPath, _level + 1, _actionChildren] call _fnc_findFolder;
|
||||
};
|
||||
} forEach _classActions;
|
||||
};
|
||||
|
||||
[_fullPath, 0, _actions] call _fnc_findFolder;
|
||||
|
||||
// Exit if there's no entry point to insert this action
|
||||
if (!_foundParentLevel) exitWith {};
|
||||
|
||||
_entry = [
|
||||
[
|
||||
_displayName,
|
||||
_icon,
|
||||
_position,
|
||||
_statement,
|
||||
_condition,
|
||||
_distance,
|
||||
_params,
|
||||
+ _fullPath
|
||||
],
|
||||
[]
|
||||
];
|
||||
|
||||
_parentLevel pushBack _entry;
|
||||
|
||||
_fullPath
|
@ -5,6 +5,7 @@
|
||||
* Argument:
|
||||
* 0: Object <OBJECT>
|
||||
* 1: Original action tree <ARRAY>
|
||||
* 2: Parent path <ARRAY>
|
||||
*
|
||||
* Return value:
|
||||
* Active children <ARRAY>
|
||||
@ -13,24 +14,39 @@
|
||||
*/
|
||||
#include "script_component.hpp"
|
||||
|
||||
EXPLODE_2_PVT(_this,_object,_origAction);
|
||||
EXPLODE_3_PVT(_this,_object,_origAction,_parentPath);
|
||||
EXPLODE_2_PVT(_origAction,_origActionData,_origActionChildren);
|
||||
|
||||
private ["_resultingAction","_target","_player","_activeChildren","_action","_actionData","_x"];
|
||||
private ["_target","_player","_fullPath","_activeChildren","_dynamicChildren","_action","_actionData","_x"];
|
||||
|
||||
_target = _object;
|
||||
_player = ACE_player;
|
||||
|
||||
// Return nothing if the action itself is not active
|
||||
if !([_target, ACE_player] call (_origActionData select 4)) exitWith {
|
||||
if !([_target, ACE_player, _origActionData select 6] call (_origActionData select 4)) exitWith {
|
||||
[]
|
||||
};
|
||||
|
||||
_fullPath = +_parentPath;
|
||||
_fullPath pushBack (_origActionData select 0);
|
||||
_activeChildren = [];
|
||||
|
||||
// If there's a statement to dynamically insert children then execute it
|
||||
if !({} isEqualTo (_origActionData select 5)) then {
|
||||
_dynamicChildren = [_target, ACE_player, _origActionData select 6] call (_origActionData select 5);
|
||||
|
||||
// Collect dynamic children class actions
|
||||
{
|
||||
_action = [_x select 2, _x, _fullPath] call FUNC(collectActiveActionTree);
|
||||
if ((count _action) > 0) then {
|
||||
_activeChildren pushBack _action;
|
||||
};
|
||||
} forEach _dynamicChildren;
|
||||
};
|
||||
|
||||
// Collect children class actions
|
||||
{
|
||||
_action = [_object, _x] call FUNC(collectActiveActionTree);
|
||||
_action = [_object, _x, _fullPath] call FUNC(collectActiveActionTree);
|
||||
if ((count _action) > 0) then {
|
||||
_activeChildren pushBack _action;
|
||||
};
|
||||
@ -38,26 +54,15 @@ _activeChildren = [];
|
||||
|
||||
// Collect children object actions
|
||||
{
|
||||
_action = _x;
|
||||
_actionData = _action select 0;
|
||||
EXPLODE_2_PVT(_x,_actionData,_pPath);
|
||||
|
||||
// Check if the action is children of the original action
|
||||
if ((count (_actionData select 7)) == (count (_origActionData select 7) + 1)) then {
|
||||
if (count _pPath == count _fullPath &&
|
||||
{_pPath isEqualTo _fullPath}) then {
|
||||
|
||||
// Compare parent path to see if it's a suitable child
|
||||
private "_isChild";
|
||||
_isChild = true;
|
||||
{
|
||||
if !(_x isEqualTo ((_actionData select 7) select _forEachIndex)) exitWith {
|
||||
_isChild = false;
|
||||
};
|
||||
} forEach (_origActionData select 7);
|
||||
|
||||
if (_isChild) then {
|
||||
_action = [_object, _action] call FUNC(collectActiveActionTree);
|
||||
if ((count _action) > 0) then {
|
||||
_activeChildren pushBack _action;
|
||||
};
|
||||
_action = [_object, _action, _fullPath] call FUNC(collectActiveActionTree);
|
||||
if ((count _action) > 0) then {
|
||||
_activeChildren pushBack _action;
|
||||
};
|
||||
};
|
||||
} forEach GVAR(objectActions);
|
||||
@ -69,4 +74,5 @@ if ((count _activeChildren) == 0 && ((_origActionData select 3) isEqualTo {})) e
|
||||
[]
|
||||
};
|
||||
|
||||
[_origActionData, _activeChildren]
|
||||
|
||||
[_origActionData, _activeChildren, _object]
|
||||
|
@ -27,8 +27,8 @@ if !(isNil {missionNamespace getVariable [_actionsVarName, nil]}) exitWith {};
|
||||
private "_recurseFnc";
|
||||
_recurseFnc = {
|
||||
private ["_actions", "_displayName", "_distance", "_icon", "_statement", "_selection", "_condition", "_showDisabled",
|
||||
"_enableInside", "_canCollapse", "_runOnHover", "_children", "_entry", "_entryCfg", "_fullPath"];
|
||||
EXPLODE_2_PVT(_this,_actionsCfg,_parentPath);
|
||||
"_enableInside", "_canCollapse", "_runOnHover", "_children", "_entry", "_entryCfg", "_insertChildren"];
|
||||
EXPLODE_1_PVT(_this,_actionsCfg);
|
||||
_actions = [];
|
||||
|
||||
for "_i" from 0 to (count _actionsCfg) - 1 do {
|
||||
@ -48,27 +48,28 @@ _recurseFnc = {
|
||||
// Add canInteract (including exceptions) and canInteractWith to condition
|
||||
_condition = _condition + format [QUOTE( && {[ARR_3(ACE_player, _target, %1)] call EFUNC(common,canInteractWith)} ), getArray (_entryCfg >> "exceptions")];
|
||||
|
||||
_insertChildren = compile (getText (_entryCfg >> "insertChildren"));
|
||||
|
||||
_showDisabled = (getNumber (_entryCfg >> "showDisabled")) > 0;
|
||||
_enableInside = (getNumber (_entryCfg >> "enableInside")) > 0;
|
||||
_canCollapse = (getNumber (_entryCfg >> "canCollapse")) > 0;
|
||||
_runOnHover = (getNumber (_entryCfg >> "runOnHover")) > 0;
|
||||
|
||||
_fullPath = (+ _parentPath);
|
||||
_fullPath pushBack (configName _entryCfg);
|
||||
|
||||
_condition = compile _condition;
|
||||
_children = [_entryCfg, _fullPath] call _recurseFnc;
|
||||
_children = [_entryCfg] call _recurseFnc;
|
||||
|
||||
_entry = [
|
||||
[
|
||||
configName _entryCfg,
|
||||
_displayName,
|
||||
_icon,
|
||||
_selection,
|
||||
_statement,
|
||||
_condition,
|
||||
_insertChildren,
|
||||
[],
|
||||
_selection,
|
||||
_distance,
|
||||
[_showDisabled,_enableInside,_canCollapse,_runOnHover],
|
||||
_fullPath
|
||||
[_showDisabled,_enableInside,_canCollapse,_runOnHover]
|
||||
],
|
||||
_children
|
||||
];
|
||||
@ -81,20 +82,22 @@ _recurseFnc = {
|
||||
private "_actionsCfg";
|
||||
_actionsCfg = configFile >> "CfgVehicles" >> _objectType >> "ACE_Actions";
|
||||
|
||||
missionNamespace setVariable [_actionsVarName, [_actionsCfg, []] call _recurseFnc];
|
||||
missionNamespace setVariable [_actionsVarName, [_actionsCfg] call _recurseFnc];
|
||||
|
||||
/*
|
||||
[
|
||||
[
|
||||
[
|
||||
"MyAction",
|
||||
"My Action",
|
||||
"\a3\ui_f\data\IGUI\Cfg\Actions\eject_ca.paa",
|
||||
[0,0,0],
|
||||
{ (_this select 0) setVelocity [0,0,10]; },
|
||||
{ true },
|
||||
{},
|
||||
[],
|
||||
[0,0,0],
|
||||
1,
|
||||
[false,false,false]
|
||||
["ACE_MainActions","TeamManagement","MyAction"]
|
||||
],
|
||||
[children actions]
|
||||
]
|
||||
|
@ -27,8 +27,8 @@ if !(isNil {missionNamespace getVariable [_actionsVarName, nil]}) exitWith {};
|
||||
private "_recurseFnc";
|
||||
_recurseFnc = {
|
||||
private ["_actions", "_displayName", "_distance", "_icon", "_statement", "_selection", "_condition", "_showDisabled",
|
||||
"_enableInside", "_canCollapse", "_runOnHover", "_children", "_entry", "_entryCfg", "_fullPath"];
|
||||
EXPLODE_2_PVT(_this,_actionsCfg,_parentPath);
|
||||
"_enableInside", "_canCollapse", "_runOnHover", "_children", "_entry", "_entryCfg", "_insertChildren"];
|
||||
EXPLODE_1_PVT(_this,_actionsCfg);
|
||||
_actions = [];
|
||||
|
||||
for "_i" from 0 to (count _actionsCfg) - 1 do {
|
||||
@ -45,27 +45,28 @@ _recurseFnc = {
|
||||
// Add canInteract (including exceptions) and canInteractWith to condition
|
||||
_condition = _condition + format [QUOTE( && {[ARR_3(ACE_player, objNull, %1)] call EFUNC(common,canInteractWith)} ), getArray (_entryCfg >> "exceptions")];
|
||||
|
||||
_insertChildren = compile (getText (_entryCfg >> "insertChildren"));
|
||||
|
||||
_showDisabled = (getNumber (_entryCfg >> "showDisabled")) > 0;
|
||||
_enableInside = (getNumber (_entryCfg >> "enableInside")) > 0;
|
||||
_canCollapse = (getNumber (_entryCfg >> "canCollapse")) > 0;
|
||||
_runOnHover = (getNumber (_entryCfg >> "runOnHover")) > 0;
|
||||
|
||||
_fullPath = (+ _parentPath);
|
||||
_fullPath pushBack (configName _entryCfg);
|
||||
|
||||
_condition = compile _condition;
|
||||
_children = [_entryCfg, _fullPath] call _recurseFnc;
|
||||
_children = [_entryCfg] call _recurseFnc;
|
||||
|
||||
_entry = [
|
||||
[
|
||||
configName _entryCfg,
|
||||
_displayName,
|
||||
_icon,
|
||||
[0,0,0],
|
||||
_statement,
|
||||
_condition,
|
||||
_insertChildren,
|
||||
[],
|
||||
[0,0,0],
|
||||
10, //distace
|
||||
[_showDisabled,_enableInside,_canCollapse,_runOnHover],
|
||||
_fullPath
|
||||
[_showDisabled,_enableInside,_canCollapse,_runOnHover]
|
||||
],
|
||||
_children
|
||||
];
|
||||
@ -82,16 +83,18 @@ _actionsCfg = configFile >> "CfgVehicles" >> _objectType >> "ACE_SelfActions";
|
||||
_actions = [
|
||||
[
|
||||
[
|
||||
"ACE_SelfActions",
|
||||
"Self Actions",
|
||||
"\a3\ui_f\data\IGUI\Cfg\Actions\eject_ca.paa",
|
||||
{},
|
||||
{ true },
|
||||
{},
|
||||
[],
|
||||
"Spine3",
|
||||
{ true },
|
||||
{ true },
|
||||
10,
|
||||
[false,true,false],
|
||||
["ACE_SelfActions"]
|
||||
[false,true,false]
|
||||
],
|
||||
[_actionsCfg, ["ACE_SelfActions"]] call _recurseFnc
|
||||
[_actionsCfg] call _recurseFnc
|
||||
]
|
||||
];
|
||||
|
||||
|
74
addons/interact_menu/functions/fnc_createAction.sqf
Normal file
74
addons/interact_menu/functions/fnc_createAction.sqf
Normal file
@ -0,0 +1,74 @@
|
||||
/*
|
||||
* Author: CAA-Picard
|
||||
* Creates an isolated ACE action
|
||||
* Note: This function is NOT global.
|
||||
*
|
||||
* Argument:
|
||||
* 0: Action name <STRING>
|
||||
* 1: Name of the action shown in the menu <STRING>
|
||||
* 2: Icon <STRING>
|
||||
* 3: Statement <CODE>
|
||||
* 4: Condition <CODE>
|
||||
* 5: Insert children code <CODE> (Optional)
|
||||
* 6: Action parameters <ANY> (Optional)
|
||||
* 7: Position (Position or Selection Name) <POSITION> or <STRING> (Optional)
|
||||
* 8: Distance <NUMBER> (Optional)
|
||||
* 9: Other parameters <ARRAY> (Optional)
|
||||
*
|
||||
* Return value:
|
||||
* Action <ARRAY>
|
||||
*
|
||||
* Example:
|
||||
* [VulcanPinch","Vulcan Pinch",{_target setDamage 1;},{true},{},[parameters], [0,0,0], 100] call ace_interact_menu_fnc_createAction;
|
||||
*
|
||||
* Public: No
|
||||
*/
|
||||
#include "script_component.hpp"
|
||||
|
||||
EXPLODE_5_PVT(_this,_actionName,_displayName,_icon,_statement,_condition);
|
||||
|
||||
private ["_insertChildren","_customParams","_position","_distance","_params"];
|
||||
|
||||
_insertChildren = if (count _this > 5) then {
|
||||
_this select 5
|
||||
} else {
|
||||
{}
|
||||
};
|
||||
|
||||
_customParams = if (count _this > 6) then {
|
||||
_this select 6
|
||||
} else {
|
||||
[]
|
||||
};
|
||||
|
||||
_position = if (count _this > 7) then {
|
||||
_this select 7
|
||||
} else {
|
||||
[0,0,0]
|
||||
};
|
||||
|
||||
_distance = if (count _this > 8) then {
|
||||
_this select 8
|
||||
} else {
|
||||
2
|
||||
};
|
||||
|
||||
_params = if (count _this > 9) then {
|
||||
_this select 9
|
||||
} else {
|
||||
[false,false,false,false]
|
||||
};
|
||||
|
||||
[
|
||||
_actionName,
|
||||
_displayName,
|
||||
_icon,
|
||||
_statement,
|
||||
_condition,
|
||||
|
||||
_insertChildren,
|
||||
_customParams,
|
||||
_position,
|
||||
_distance,
|
||||
_params
|
||||
]
|
56
addons/interact_menu/functions/fnc_findActionNode.sqf
Normal file
56
addons/interact_menu/functions/fnc_findActionNode.sqf
Normal file
@ -0,0 +1,56 @@
|
||||
/*
|
||||
* Author: CAA-Picard
|
||||
* Return action point from path
|
||||
* Note: This function is NOT global.
|
||||
*
|
||||
* Argument:
|
||||
* 0: List of Action Tree <ARRAY>
|
||||
* 1: Path <ARRAY>
|
||||
*
|
||||
* Return value:
|
||||
* Action node <ARRAY>.
|
||||
*
|
||||
* Example:
|
||||
* [_actionTree, ["ACE_TapShoulderRight","VulcanPinchAction"]] call ace_interact_menu_fnc_findActionNode;
|
||||
*
|
||||
* Public: No
|
||||
*/
|
||||
#include "script_component.hpp"
|
||||
|
||||
EXPLODE_2_PVT(_this,_actionTreeList,_parentPath);
|
||||
|
||||
private ["_parentNode", "_foundParentNode", "_fnc_findFolder"];
|
||||
|
||||
// Hack to make this work on the root node too
|
||||
if (count _parentPath == 0) exitWith {
|
||||
[[],_actionTreeList]
|
||||
};
|
||||
|
||||
// Search the class action trees and find where to insert the entry
|
||||
_parentNode = [[],_actionTreeList];
|
||||
_foundParentNode = false;
|
||||
|
||||
_fnc_findFolder = {
|
||||
EXPLODE_3_PVT(_this,_parentPath,_level,_actionNode);
|
||||
|
||||
{
|
||||
EXPLODE_2_PVT(_x,_actionData,_actionChildren);
|
||||
if ((_actionData select 0) isEqualTo (_parentPath select _level)) exitWith {
|
||||
|
||||
if (count _parentPath == _level + 1) exitWith {
|
||||
_parentNode = _x;
|
||||
_foundParentNode = true;
|
||||
};
|
||||
|
||||
// The action should go somewhere in here
|
||||
[_parentPath, _level + 1, _x] call _fnc_findFolder;
|
||||
};
|
||||
} forEach (_actionNode select 1);
|
||||
};
|
||||
|
||||
[_parentPath, 0, [[],_actionTreeList]] call _fnc_findFolder;
|
||||
|
||||
// Exit if there's no entry point to insert this action
|
||||
if (!_foundParentNode) exitWith {};
|
||||
|
||||
_parentNode
|
29
addons/interact_menu/functions/fnc_isSubPath.sqf
Normal file
29
addons/interact_menu/functions/fnc_isSubPath.sqf
Normal file
@ -0,0 +1,29 @@
|
||||
/*
|
||||
* Author: CAA-Picard
|
||||
* Check if the first path is a subpath of the other
|
||||
*
|
||||
* Argument:
|
||||
* 0: LongPath <ARRAY>
|
||||
* 1: ShortPath <STRING>
|
||||
*
|
||||
* Return value:
|
||||
* Bool
|
||||
*
|
||||
* Public: No
|
||||
*/
|
||||
#include "script_component.hpp"
|
||||
|
||||
EXPLODE_2_PVT(_this,_longPath,_shortPath);
|
||||
|
||||
private ["_isSubPath","_i"];
|
||||
_isSubPath = true;
|
||||
|
||||
if (count _shortPath > count _longPath) exitWith {false};
|
||||
|
||||
for [{_i = 0},{_i < (count _shortPath) - 1},{_i = _i + 1}] do {
|
||||
if !((_longPath select _i) isEqualTo (_shortPath select _i)) exitWith {
|
||||
_isSubPath = false;
|
||||
};
|
||||
};
|
||||
|
||||
_isSubPath
|
@ -16,7 +16,7 @@ if(GVAR(actionSelected)) then {
|
||||
this = GVAR(selectedTarget);
|
||||
_player = ACE_Player;
|
||||
_target = GVAR(selectedTarget);
|
||||
[GVAR(selectedTarget), ACE_player] call GVAR(selectedStatement);
|
||||
[GVAR(selectedTarget), ACE_player, (GVAR(selectedAction) select 0) select 6] call GVAR(selectedStatement);
|
||||
};
|
||||
|
||||
if (GVAR(keyDown)) then {
|
||||
|
@ -20,7 +20,7 @@ if(GVAR(actionSelected)) then {
|
||||
this = GVAR(selectedTarget);
|
||||
_player = ACE_Player;
|
||||
_target = GVAR(selectedTarget);
|
||||
[GVAR(selectedTarget), ACE_player] call GVAR(selectedStatement);
|
||||
[GVAR(selectedTarget), ACE_player, (GVAR(selectedAction) select 0) select 6] call GVAR(selectedStatement);
|
||||
};
|
||||
|
||||
if (GVAR(keyDownSelfAction)) then {
|
||||
|
39
addons/interact_menu/functions/fnc_removeActionFromClass.sqf
Normal file
39
addons/interact_menu/functions/fnc_removeActionFromClass.sqf
Normal file
@ -0,0 +1,39 @@
|
||||
/*
|
||||
* Author: CAA-Picard
|
||||
* Removes an action from a class
|
||||
*
|
||||
* Argument:
|
||||
* 0: TypeOf of the class <STRING>
|
||||
* 1: Type of action, 0 for actions, 1 for self-actions <NUMBER>
|
||||
* 2: Full path of the new action <ARRAY>
|
||||
*
|
||||
* Return value:
|
||||
* None
|
||||
*
|
||||
* Example:
|
||||
* [typeOf cursorTarget, 0,["ACE_TapShoulderRight","VulcanPinch"]] call ace_interact_menu_fnc_removeActionFromClass;
|
||||
*
|
||||
* Public: No
|
||||
*/
|
||||
#include "script_component.hpp"
|
||||
|
||||
EXPLODE_3_PVT(_this,_objectType,_typeNum,_fullPath);
|
||||
|
||||
private ["_res","_varName","_actionTrees"];
|
||||
_res = _fullPath call FUNC(splitPath);
|
||||
EXPLODE_2_PVT(_res,_parentPath,_actionName);
|
||||
|
||||
_varName = format [[QGVAR(Act_%1), QGVAR(SelfAct_%1)] select _typeNum, _objectType];
|
||||
_actionTrees = missionNamespace getVariable [_varName, []];
|
||||
|
||||
_parentNode = [_actionTrees, _parentPath] call FUNC(findActionNode);
|
||||
if (isNil {_parentNode}) exitWith {};
|
||||
|
||||
// Iterate through children of the father
|
||||
{
|
||||
if (((_x select 0) select 0) == _actionName) exitWith {
|
||||
(_parentNode select 1) deleteAt _forEachIndex;
|
||||
};
|
||||
} forEach (_parentNode select 1);
|
||||
|
||||
_parentLevel deleteAt _actionIndex;
|
@ -1,30 +1,33 @@
|
||||
/*
|
||||
* Author: commy2, NouberNou and CAA-Picard
|
||||
* Remove an action from an object
|
||||
*
|
||||
* Argument:
|
||||
* 0: Object the action is assigned to <OBJECT>
|
||||
* 1: Type of action, 0 for actions, 1 for self-actions <NUMBER>
|
||||
* 2: Full path of the action to remove <ARRAY>
|
||||
*
|
||||
* Return value:
|
||||
* None
|
||||
*
|
||||
* Example:
|
||||
* [cursorTarget,0,["ACE_TapShoulderRight","VulcanPinch"]] call ace_interact_menu_fnc_removeAction;
|
||||
*
|
||||
* Public: No
|
||||
*/
|
||||
#include "script_component.hpp"
|
||||
|
||||
EXPLODE_3_PVT(_this,_object,_typeNum,_fullPath);
|
||||
|
||||
private ["_varName","_actions"];
|
||||
_varName = [QGVAR(actions),QGVAR(selfActions)] select _typeNum;
|
||||
_actions = _object getVariable [_varName, []];
|
||||
|
||||
{
|
||||
if (((_x select 0) select 7) isEqualTo _fullPath) exitWith {
|
||||
_actions deleteAt _forEachIndex;
|
||||
};
|
||||
} forEach _actions;
|
||||
/*
|
||||
* Author: commy2, NouberNou and CAA-Picard
|
||||
* Removes an action from an object
|
||||
*
|
||||
* Argument:
|
||||
* 0: Object the action is assigned to <OBJECT>
|
||||
* 1: Type of action, 0 for actions, 1 for self-actions <NUMBER>
|
||||
* 2: Full path of the action to remove <ARRAY>
|
||||
*
|
||||
* Return value:
|
||||
* None
|
||||
*
|
||||
* Example:
|
||||
* [cursorTarget,0,["ACE_TapShoulderRight","VulcanPinch"]] call ace_interact_menu_fnc_removeActionFromObject;
|
||||
*
|
||||
* Public: No
|
||||
*/
|
||||
#include "script_component.hpp"
|
||||
|
||||
EXPLODE_3_PVT(_this,_object,_typeNum,_fullPath);
|
||||
|
||||
private ["_res","_varName","_actionList"];
|
||||
_res = _fullPath call FUNC(splitPath);
|
||||
EXPLODE_2_PVT(_res,_parentPath,_actionName);
|
||||
|
||||
_varName = [QGVAR(actions),QGVAR(selfActions)] select _typeNum;
|
||||
_actionList = _object getVariable [_varName, []];
|
||||
{
|
||||
if (((_x select 0) select 0) isEqualTo _actionName &&
|
||||
{(_x select 1) isEqualTo _parentPath}) exitWith {
|
||||
_actionList deleteAt _forEachIndex;
|
||||
};
|
||||
} forEach _actionList;
|
@ -1,72 +0,0 @@
|
||||
/*
|
||||
* Author: CAA-Picard
|
||||
* Removes a class action from a class
|
||||
* Note: This function is NOT global.
|
||||
*
|
||||
* Argument:
|
||||
* 0: TypeOf of the class <STRING>
|
||||
* 1: Type of action, 0 for actions, 1 for self-actions <NUMBER>
|
||||
* 2: Full path of the new action <ARRAY>
|
||||
*
|
||||
* Return value:
|
||||
* None
|
||||
*
|
||||
* Example:
|
||||
* [typeOf cursorTarget, 0,["ACE_TapShoulderRight","VulcanPinch"]] call ace_interact_menu_fnc_removeClassAction;
|
||||
*
|
||||
* Public: No
|
||||
*/
|
||||
#include "script_component.hpp"
|
||||
|
||||
EXPLODE_3_PVT(_this,_objectType,_typeNum,_fullPath);
|
||||
|
||||
private ["_varName","_actions","_parentLevel", "_actionIndex", "_foundAction", "_fnc_findFolder"];
|
||||
|
||||
_varName = format [[QGVAR(Act_%1), QGVAR(SelfAct_%1)] select _typeNum, _objectType];
|
||||
_actions = missionNamespace getVariable [_varName, []];
|
||||
|
||||
// Search the class action trees and find where to insert the entry
|
||||
_parentLevel = _actions;
|
||||
_actionIndex = -1;
|
||||
_foundAction = false;
|
||||
|
||||
_fnc_findFolder = {
|
||||
EXPLODE_3_PVT(_this,_fullPath,_level,_classActions);
|
||||
|
||||
if (count _fullPath == _level + 1) then {
|
||||
_parentLevel = _classActions;
|
||||
};
|
||||
|
||||
{
|
||||
EXPLODE_2_PVT(_x,_actionData,_actionChildren);
|
||||
if (((_actionData select 7) select _level) isEqualTo (_fullPath select _level)) exitWith {
|
||||
if (_level + 1 == count _fullPath) exitWith {
|
||||
_actionIndex = _forEachIndex;
|
||||
_foundAction = true;
|
||||
};
|
||||
[_fullPath, _level + 1, _actionChildren] call _fnc_findFolder;
|
||||
};
|
||||
if (_foundAction) exitWith {};
|
||||
} forEach _classActions;
|
||||
};
|
||||
|
||||
[_fullPath, 0, _actions] call _fnc_findFolder;
|
||||
|
||||
// Exit if the action was not found
|
||||
if (!_foundAction) exitWith {};
|
||||
|
||||
_entry = [
|
||||
[
|
||||
_displayName,
|
||||
_icon,
|
||||
_position,
|
||||
_statement,
|
||||
_condition,
|
||||
_distance,
|
||||
_params,
|
||||
+ _fullPath
|
||||
],
|
||||
[]
|
||||
];
|
||||
|
||||
_parentLevel deleteAt _actionIndex;
|
@ -41,17 +41,17 @@ if (GVAR(keyDown)) then {
|
||||
|
||||
// Iterate through object actions, find base level actions and render them if appropiate
|
||||
_actionsVarName = format [QGVAR(Act_%1), typeOf _target];
|
||||
GVAR(objectActions) = _target getVariable [QGVAR(actions), []];
|
||||
GVAR(objectActionList) = _target getVariable [QGVAR(actions), []];
|
||||
{
|
||||
_action = _x;
|
||||
// Only render them directly if they are base level actions
|
||||
if (count ((_action select 0) select 7) == 1) then {
|
||||
if (count (_x select 1) == 0) then {
|
||||
// Try to render the menu
|
||||
_action = [_x,[]];
|
||||
if ([_target, _action] call FUNC(renderBaseMenu)) then {
|
||||
_numInteractions = _numInteractions + 1;
|
||||
};
|
||||
};
|
||||
} forEach GVAR(objectActions);
|
||||
} forEach GVAR(objectActionList);
|
||||
|
||||
// Iterate through base level class actions and render them if appropiate
|
||||
_classActions = missionNamespace getVariable [_actionsVarName, []];
|
||||
@ -80,7 +80,7 @@ if (GVAR(keyDown)) then {
|
||||
|
||||
// Iterate through object actions, find base level actions and render them if appropiate
|
||||
_actionsVarName = format [QGVAR(SelfAct_%1), typeOf _target];
|
||||
GVAR(objectActions) = _target getVariable [QGVAR(selfActions), []];
|
||||
GVAR(objectActionList) = _target getVariable [QGVAR(selfActions), []];
|
||||
/*
|
||||
{
|
||||
_action = _x;
|
||||
@ -88,7 +88,7 @@ if (GVAR(keyDown)) then {
|
||||
if (count (_action select 7) == 1) then {
|
||||
[_target, _action, 0, [180, 360]] call FUNC(renderMenu);
|
||||
};
|
||||
} forEach GVAR(objectActions);
|
||||
} forEach GVAR(objectActionList);
|
||||
*/
|
||||
|
||||
// Iterate through base level class actions and render them if appropiate
|
||||
@ -142,8 +142,8 @@ if(GVAR(keyDown) || GVAR(keyDownSelfAction)) then {
|
||||
drawIcon3D ["\a3\ui_f\data\IGUI\Cfg\Cursors\selectover_ca.paa", [1,0,0,.75], _pos, 0.6*SafeZoneW, 0.6*SafeZoneW, GVAR(rotationAngle), "", 0.5, 0.025, "TahomaB"];
|
||||
_foundTarget = true;
|
||||
GVAR(actionSelected) = true;
|
||||
GVAR(selectedTarget) = (_closest select 0) select 0;
|
||||
GVAR(selectedAction) = (_closest select 0) select 1;
|
||||
GVAR(selectedTarget) = (GVAR(selectedAction)) select 2;
|
||||
GVAR(selectedStatement) = ((GVAR(selectedAction)) select 0) select 3;
|
||||
|
||||
_misMatch = false;
|
||||
@ -153,30 +153,34 @@ if(GVAR(keyDown) || GVAR(keyDownSelfAction)) then {
|
||||
_misMatch = true;
|
||||
} else {
|
||||
{
|
||||
if(_x != (_hoverPath select _forEachIndex)) exitWith {
|
||||
if !(_x isEqualTo (_hoverPath select _forEachIndex)) exitWith {
|
||||
_misMatch = true;
|
||||
};
|
||||
} forEach GVAR(lastPath);
|
||||
};
|
||||
|
||||
if(_misMatch) then {
|
||||
GVAR(lastPath) = _hoverPath;
|
||||
if(_misMatch && {diag_tickTime-GVAR(expandedTime) > 0.25}) then {
|
||||
GVAR(startHoverTime) = diag_tickTime;
|
||||
GVAR(lastPath) = _hoverPath;
|
||||
GVAR(expanded) = false;
|
||||
} else {
|
||||
if(!GVAR(expanded) && diag_tickTime-GVAR(startHoverTime) > 0.25) then {
|
||||
GVAR(expanded) = true;
|
||||
GVAR(expandedTime) = diag_tickTime;
|
||||
|
||||
// Start the expanding menu animation only if the user is not going up the menu
|
||||
if !([GVAR(menuDepthPath),GVAR(lastPath)] call FUNC(isSubPath)) then {
|
||||
GVAR(expandedTime) = diag_tickTime;
|
||||
};
|
||||
GVAR(menuDepthPath) = +GVAR(lastPath);
|
||||
|
||||
// Execute the current action if it's run on hover
|
||||
private "_runOnHover";
|
||||
_runOnHover = ((GVAR(selectedAction) select 0) select 6) select 3;
|
||||
_runOnHover = ((GVAR(selectedAction) select 0) select 9) select 3;
|
||||
if (_runOnHover) then {
|
||||
this = GVAR(selectedTarget);
|
||||
_player = ACE_Player;
|
||||
_target = GVAR(selectedTarget);
|
||||
[GVAR(selectedTarget), ACE_player] call GVAR(selectedStatement);
|
||||
[GVAR(selectedTarget), ACE_player, (GVAR(selectedAction) select 0) select 6] call GVAR(selectedStatement);
|
||||
};
|
||||
};
|
||||
};
|
||||
|
@ -4,7 +4,7 @@
|
||||
*
|
||||
* Argument:
|
||||
* 0: Object <OBJECT>
|
||||
* 1: Action data <ARRAY>
|
||||
* 1: Action node <ARRAY>
|
||||
* 2: 3D position <ARRAY> (Optional)
|
||||
*
|
||||
* Return value:
|
||||
@ -16,25 +16,25 @@
|
||||
|
||||
private ["_distance","_pos","_weaponDir","_ref","_cameraPos","_sPos","_activeActionTree"];
|
||||
|
||||
EXPLODE_2_PVT(_this,_object,_baseAction);
|
||||
EXPLODE_1_PVT(_baseAction,_actionData);
|
||||
EXPLODE_2_PVT(_this,_object,_baseActionNode);
|
||||
EXPLODE_1_PVT(_baseActionNode,_actionData);
|
||||
|
||||
_distance = _actionData select 5;
|
||||
_distance = _actionData select 8;
|
||||
|
||||
// Obtain a 3D position for the action
|
||||
if((count _this) > 2) then {
|
||||
_pos = _this select 2;
|
||||
} else {
|
||||
if(typeName (_actionData select 2) == "ARRAY") then {
|
||||
_pos = _object modelToWorld (_actionData select 2);
|
||||
if(typeName (_actionData select 7) == "ARRAY") then {
|
||||
_pos = _object modelToWorld (_actionData select 7);
|
||||
} else {
|
||||
if ((_actionData select 2) == "weapon") then {
|
||||
if ((_actionData select 7) == "weapon") then {
|
||||
// Craft a suitable position for weapon interaction
|
||||
_weaponDir = _object weaponDirection currentWeapon _object;
|
||||
_ref = _weaponDir call EFUNC(common,createOrthonormalReference);
|
||||
_pos = (_object modelToWorld (_object selectionPosition "righthand")) vectorAdd ((_ref select 2) vectorMultiply 0.1);
|
||||
} else {
|
||||
_pos = _object modelToWorld (_object selectionPosition (_actionData select 2));
|
||||
_pos = _object modelToWorld (_object selectionPosition (_actionData select 7));
|
||||
};
|
||||
};
|
||||
// Compensate for movement during the frame to get rid of jittering
|
||||
@ -59,19 +59,29 @@ if ((_sPos select 1) < safeZoneY || (_sPos select 1) > safeZoneY + safeZon
|
||||
|
||||
// Collect active tree
|
||||
private "_uid";
|
||||
_uid = format [QGVAR(ATCache_%1), (_actionData select 7) select 0];
|
||||
_uid = format [QGVAR(ATCache_%1), _actionData select 0];
|
||||
_activeActionTree = [
|
||||
[_object, _baseAction],
|
||||
[_object, _baseActionNode, []],
|
||||
DFUNC(collectActiveActionTree),
|
||||
_object, _uid, 0.2
|
||||
] call EFUNC(common,cachedCall);
|
||||
|
||||
|
||||
/*
|
||||
diag_log "Printing: _activeActionTree";
|
||||
_fnc_print = {
|
||||
EXPLODE_2_PVT(_this,_level,_node);
|
||||
EXPLODE_3_PVT(_node,_actionData,_children,_object);
|
||||
diag_log text format ["Level %1 -> %2 on %3", _level, _actionData select 0, _object];
|
||||
{
|
||||
[_level + 1, _x] call _fnc_print;
|
||||
} forEach _children;
|
||||
};
|
||||
[0, _activeActionTree] call _fnc_print;
|
||||
*/
|
||||
// Check if there's something left for rendering
|
||||
if (count _activeActionTree == 0) exitWith {false};
|
||||
|
||||
//EXPLODE_2_PVT(_activeActionTree,_actionData,_actionChildren);
|
||||
|
||||
[_object, _activeActionTree, _pos, [180,360]] call FUNC(renderMenu);
|
||||
[[], _activeActionTree, _pos, [180,360]] call FUNC(renderMenu);
|
||||
|
||||
true
|
||||
|
@ -3,7 +3,7 @@
|
||||
* Render an interaction menu and it's children recursively
|
||||
*
|
||||
* Argument:
|
||||
* 0: Object <OBJECT>
|
||||
* 0: Parent path <ARRAY>
|
||||
* 1: Action data <ARRAY>
|
||||
* 2: 3D position <ARRAY>
|
||||
* 3: Angle range available for rendering <ARRAY>
|
||||
@ -17,14 +17,15 @@
|
||||
|
||||
private ["_menuInSelectedPath", "_path", "_menuDepth", "_currentRenderDepth", "_x", "_offset", "_newPos", "_forEachIndex"];
|
||||
|
||||
EXPLODE_4_PVT(_this,_object,_action,_pos,_angles);
|
||||
EXPLODE_2_PVT(_action,_actionData,_activeChildren);
|
||||
EXPLODE_4_PVT(_this,_parentPath,_action,_pos,_angles);
|
||||
EXPLODE_3_PVT(_action,_actionData,_activeChildren,_actionObject);
|
||||
EXPLODE_2_PVT(_angles,_centerAngle,_maxAngleSpan);
|
||||
|
||||
_menuDepth = (count GVAR(menuDepthPath));
|
||||
|
||||
// Store path to action
|
||||
_path = [_object] + (_actionData select 7);
|
||||
_path = +_parentPath;
|
||||
_path pushBack [_actionData select 0,_actionObject];
|
||||
|
||||
// Check if the menu is on the selected path
|
||||
_menuInSelectedPath = true;
|
||||
@ -32,7 +33,7 @@ _menuInSelectedPath = true;
|
||||
if (_forEachIndex >= (count GVAR(menuDepthPath))) exitWith {
|
||||
_menuInSelectedPath = false;
|
||||
};
|
||||
if (_x != (GVAR(menuDepthPath) select _forEachIndex)) exitWith {
|
||||
if !(_x isEqualTo (GVAR(menuDepthPath) select _forEachIndex)) exitWith {
|
||||
_menuInSelectedPath = false;
|
||||
};
|
||||
} forEach _path;
|
||||
@ -47,7 +48,7 @@ if(!_menuInSelectedPath) then { //_menuDepth > 0 &&
|
||||
_color = format ["#%1FFFFFF", [255 * 0.75] call EFUNC(common,toHex)];
|
||||
};
|
||||
};
|
||||
[_actionData select 0, _color, _pos, 1, 1, 0, _actionData select 1, 0.5, 0.025, "TahomaB"] call FUNC(renderIcon);
|
||||
[_actionData select 1, _color, _pos, 1, 1, 0, _actionData select 2, 0.5, 0.025, "TahomaB"] call FUNC(renderIcon);
|
||||
|
||||
// Add the action to current options
|
||||
GVAR(currentOptions) pushBack [_this, _pos, _path];
|
||||
@ -83,7 +84,7 @@ if (_menuInSelectedPath && (_menuDepth == count _path)) then {
|
||||
|
||||
_angle = _centerAngle - _angleSpan / 2;
|
||||
{
|
||||
_target = _object;
|
||||
_target = _actionObject;
|
||||
_player = ACE_player;
|
||||
|
||||
_offset = ((GVAR(refSystem) select 1) vectorMultiply (-_scale * cos _angle)) vectorAdd
|
||||
@ -92,7 +93,7 @@ _angle = _centerAngle - _angleSpan / 2;
|
||||
|
||||
//drawLine3D [_pos, _newPos, [1,0,0,0.8]];
|
||||
|
||||
[_object, _x, _newPos, [_angle, 140]] call FUNC(renderMenu);
|
||||
[_path, _x, _newPos, [_angle, 140]] call FUNC(renderMenu);
|
||||
|
||||
if (_angleSpan == 360) then {
|
||||
_angle = _angle + _angleSpan / (count _activeChildren);
|
||||
|
27
addons/interact_menu/functions/fnc_splitPath.sqf
Normal file
27
addons/interact_menu/functions/fnc_splitPath.sqf
Normal file
@ -0,0 +1,27 @@
|
||||
/*
|
||||
* Author: CAA-Picard
|
||||
* Take full path and split it between parent path and action name
|
||||
*
|
||||
* Argument:
|
||||
* Full path of the action to remove <ARRAY>
|
||||
*
|
||||
* Return value:
|
||||
* 0: Parent path <ARRAY>
|
||||
* 1: Action name <STRING>
|
||||
*
|
||||
* Public: No
|
||||
*/
|
||||
#include "script_component.hpp"
|
||||
|
||||
private ["_parentPath","_actionName"];
|
||||
_parentPath = [];
|
||||
for [{_i = 0},{_i < (count _this) - 1},{_i = _i + 1}] do {
|
||||
_parentPath pushBack (_this select _i);
|
||||
};
|
||||
_actionName = if (count _this > 0) then {
|
||||
_this select ((count _this) - 1);
|
||||
} else {
|
||||
""
|
||||
};
|
||||
|
||||
[_parentPath, _actionName]
|
@ -412,7 +412,14 @@ class CfgVehicles {
|
||||
condition = "true";
|
||||
};
|
||||
};
|
||||
class ACE_SelfActions {};
|
||||
class ACE_SelfActions {
|
||||
class ACE_Passengers {
|
||||
displayName = "$STR_ACE_Interaction_Passengers";
|
||||
condition = "true";
|
||||
statement = "";
|
||||
insertChildren = QUOTE(_this call FUNC(addPassengersActions));
|
||||
};
|
||||
};
|
||||
};
|
||||
class Tank: LandVehicle {
|
||||
class ACE_Actions {
|
||||
@ -423,7 +430,14 @@ class CfgVehicles {
|
||||
condition = "true";
|
||||
};
|
||||
};
|
||||
class ACE_SelfActions {};
|
||||
class ACE_SelfActions {
|
||||
class ACE_Passengers {
|
||||
displayName = "$STR_ACE_Interaction_Passengers";
|
||||
condition = "true";
|
||||
statement = "";
|
||||
insertChildren = QUOTE(_this call FUNC(addPassengersActions));
|
||||
};
|
||||
};
|
||||
};
|
||||
|
||||
class Air;
|
||||
@ -436,7 +450,14 @@ class CfgVehicles {
|
||||
condition = "true";
|
||||
};
|
||||
};
|
||||
class ACE_SelfActions {};
|
||||
class ACE_SelfActions {
|
||||
class ACE_Passengers {
|
||||
displayName = "$STR_ACE_Interaction_Passengers";
|
||||
condition = "true";
|
||||
statement = "";
|
||||
insertChildren = QUOTE(_this call FUNC(addPassengersActions));
|
||||
};
|
||||
};
|
||||
};
|
||||
class Plane: Air {
|
||||
class ACE_Actions {
|
||||
@ -447,7 +468,14 @@ class CfgVehicles {
|
||||
condition = "true";
|
||||
};
|
||||
};
|
||||
class ACE_SelfActions {};
|
||||
class ACE_SelfActions {
|
||||
class ACE_Passengers {
|
||||
displayName = "$STR_ACE_Interaction_Passengers";
|
||||
condition = "true";
|
||||
statement = "";
|
||||
insertChildren = QUOTE(_this call FUNC(addPassengersActions));
|
||||
};
|
||||
};
|
||||
};
|
||||
|
||||
class Ship;
|
||||
@ -469,7 +497,14 @@ class CfgVehicles {
|
||||
};
|
||||
};
|
||||
};
|
||||
class ACE_SelfActions {};
|
||||
class ACE_SelfActions {
|
||||
class ACE_Passengers {
|
||||
displayName = "$STR_ACE_Interaction_Passengers";
|
||||
condition = "true";
|
||||
statement = "";
|
||||
insertChildren = QUOTE(_this call FUNC(addPassengersActions));
|
||||
};
|
||||
};
|
||||
};
|
||||
|
||||
class StaticWeapon: LandVehicle {
|
||||
@ -481,7 +516,14 @@ class CfgVehicles {
|
||||
condition = "true";
|
||||
};
|
||||
};
|
||||
class ACE_SelfActions {};
|
||||
class ACE_SelfActions {
|
||||
class ACE_Passengers {
|
||||
displayName = "$STR_ACE_Interaction_Passengers";
|
||||
condition = "true";
|
||||
statement = "";
|
||||
insertChildren = QUOTE(_this call FUNC(addPassengersActions));
|
||||
};
|
||||
};
|
||||
};
|
||||
|
||||
class StaticMortar;
|
||||
@ -494,7 +536,14 @@ class CfgVehicles {
|
||||
condition = "true";
|
||||
};
|
||||
};
|
||||
class ACE_SelfActions {};
|
||||
class ACE_SelfActions {
|
||||
class ACE_Passengers {
|
||||
displayName = "$STR_ACE_Interaction_Passengers";
|
||||
condition = "true";
|
||||
statement = "";
|
||||
insertChildren = QUOTE(_this call FUNC(addPassengersActions));
|
||||
};
|
||||
};
|
||||
};
|
||||
|
||||
class thingX;
|
||||
|
@ -2,6 +2,8 @@
|
||||
|
||||
ADDON = false;
|
||||
|
||||
PREP(addPassengerActions);
|
||||
PREP(addPassengersActions);
|
||||
PREP(addSelectableItem);
|
||||
PREP(applyButtons);
|
||||
PREP(canInteractWithCivilian);
|
||||
|
@ -5,7 +5,7 @@ class CfgPatches {
|
||||
units[] = {};
|
||||
weapons[] = {};
|
||||
requiredVersion = REQUIRED_VERSION;
|
||||
requiredAddons[] = {"ace_common"};
|
||||
requiredAddons[] = {"ace_interact_menu"};
|
||||
author[] = {"commy2", "KoffeinFlummi", "CAA-Picard", "bux578"};
|
||||
authorUrl = "https://github.com/commy2/";
|
||||
VERSION_CONFIG;
|
||||
|
32
addons/interaction/functions/fnc_addPassengerActions.sqf
Normal file
32
addons/interaction/functions/fnc_addPassengerActions.sqf
Normal file
@ -0,0 +1,32 @@
|
||||
/*
|
||||
* Author: CAA-Picard
|
||||
* Mount unit actions inside passenger submenu
|
||||
* Note: This function is NOT global.
|
||||
*
|
||||
* Argument:
|
||||
* 0: Vehicle <OBJECT>
|
||||
* 1: Player <OBJECT>
|
||||
* 3: Parameters <ARRAY>
|
||||
*
|
||||
* Return value:
|
||||
* Children actions <ARRAY>
|
||||
*
|
||||
* Public: No
|
||||
*/
|
||||
#include "script_component.hpp"
|
||||
|
||||
EXPLODE_3_PVT(_this,_vehicle,_player,_parameters);
|
||||
|
||||
diag_log "addPassengerActions";
|
||||
|
||||
private ["_unit","_actions"];
|
||||
_unit = _parameters select 0;
|
||||
|
||||
_varName = format [QEGVAR(interact_menu,Act_%1), typeOf _unit];
|
||||
_actionTrees = missionNamespace getVariable [_varName, []];
|
||||
|
||||
_actions = [];
|
||||
// Mount unit MainActions menu
|
||||
_actions pushBack [(_actionTrees select 0) select 0, (_actionTrees select 0) select 1, _unit];
|
||||
|
||||
_actions
|
43
addons/interaction/functions/fnc_addPassengersActions.sqf
Normal file
43
addons/interaction/functions/fnc_addPassengersActions.sqf
Normal file
@ -0,0 +1,43 @@
|
||||
/*
|
||||
* Author: CAA-Picard
|
||||
* Create one action per passenger
|
||||
* Note: This function is NOT global.
|
||||
*
|
||||
* Argument:
|
||||
* 0: Vehicle <OBJECT>
|
||||
* 1: Player <OBJECT>
|
||||
* 3: Parameters <ARRAY>
|
||||
*
|
||||
* Return value:
|
||||
* Children actions <ARRAY>
|
||||
*
|
||||
* Public: No
|
||||
*/
|
||||
#include "script_component.hpp"
|
||||
|
||||
EXPLODE_3_PVT(_this,_vehicle,_player,_parameters);
|
||||
|
||||
private ["_actions"];
|
||||
_actions = [];
|
||||
|
||||
{
|
||||
_unit = _x;
|
||||
if (_x != _player) then {
|
||||
_actions pushBack
|
||||
[
|
||||
[
|
||||
str(_unit),
|
||||
[_unit, true] call EFUNC(common,getName),
|
||||
"",
|
||||
{systemChat "selected passenger"},
|
||||
{true},
|
||||
{_this call FUNC(addPassengerActions);},
|
||||
[_unit]
|
||||
] call EFUNC(interact_menu,createAction),
|
||||
[],
|
||||
_unit
|
||||
];
|
||||
};
|
||||
} forEach crew _vehicle;
|
||||
|
||||
_actions
|
@ -5,7 +5,7 @@ EXPLODE_3_PVT(_this,_tapper,_target,_shoulderNum);
|
||||
|
||||
if (_target != ACE_player) exitWith {
|
||||
addCamShake [4, 0.5, 5];
|
||||
ACE_player playActionNow 'gestureAdvance';
|
||||
ACE_player playActionNow "PutDown";
|
||||
if !(local _target) then {
|
||||
[[_tapper, _target, _shoulderNum], QUOTE(DFUNC(tapShoulder)), _target] call EFUNC(common,execRemoteFnc);
|
||||
};
|
||||
|
@ -650,5 +650,8 @@
|
||||
<Polish>Interakcja</Polish>
|
||||
<Spanish>Interactuar</Spanish>
|
||||
</Key>
|
||||
<Key ID="STR_ACE_Interaction_Passengers">
|
||||
<English>Passengers >></English>
|
||||
</Key>
|
||||
</Package>
|
||||
</Project>
|
||||
|
@ -1,10 +1,9 @@
|
||||
|
||||
class ACE_Medical_Actions {
|
||||
class Basic {
|
||||
// @todo: localization
|
||||
class Bandage {
|
||||
displayName = "Bandage";
|
||||
displayNameProgress = "Bandaging ...";
|
||||
displayName = "$STR_ACE_Medical_Bandage";
|
||||
displayNameProgress = "$STR_ACE_Medical_Bandaging";
|
||||
|
||||
treatmentLocations[] = {"All"};
|
||||
requiredMedic = 0;
|
||||
@ -25,25 +24,25 @@ class ACE_Medical_Actions {
|
||||
animationCallerSelfProne = "AinvPpneMstpSlayW[wpn]Dnon_medic";
|
||||
};
|
||||
class Morphine: Bandage {
|
||||
displayName = "Morphine";
|
||||
displayNameProgress = "Injecting Morphine ...";
|
||||
displayName = "$STR_ACE_Medical_Inject_Morphine";
|
||||
displayNameProgress = "$STR_ACE_Medical_Injecting_Morphine";
|
||||
treatmentTime = 2;
|
||||
items[] = {QGVAR(morphine)};
|
||||
callbackSuccess = QUOTE(DFUNC(treatmentBasic_morphine));
|
||||
animationCaller = "AinvPknlMstpSnonWnonDnon_medic1";
|
||||
};
|
||||
class Epipen: Bandage {
|
||||
displayName = "Epinephrine";
|
||||
displayNameProgress = "Injecting Epinephrine ...";
|
||||
class Epinephrine: Bandage {
|
||||
displayName = "$STR_ACE_Medical_Inject_Epinephrine";
|
||||
displayNameProgress = "$STR_ACE_Medical_Injecting_Epinephrine";
|
||||
requiredMedic = 1;
|
||||
treatmentTime = 3;
|
||||
items[] = {QGVAR(epipen)};
|
||||
items[] = {QGVAR(epinephrine)};
|
||||
callbackSuccess = QUOTE(DFUNC(treatmentBasic_epipen));
|
||||
animationCaller = "AinvPknlMstpSnonWnonDnon_medic1";
|
||||
};
|
||||
class Bloodbag: Bandage {
|
||||
displayName = "Blood Bag";
|
||||
displayNameProgress = "Transfusing Blood ...";
|
||||
class BloodIV: Bandage {
|
||||
displayName = "$STR_ACE_Medical_Transfuse_Blood";
|
||||
displayNameProgress = "$STR_ACE_Medical_Transfusing_Blood";
|
||||
requiredMedic = 1;
|
||||
treatmentTime = 20;
|
||||
items[] = {{QGVAR(bloodIV), QGVAR(bloodIV_500), QGVAR(bloodIV_250)}};
|
||||
|
@ -350,8 +350,8 @@ class CfgVehicles {
|
||||
runOnHover = 1;
|
||||
statement = QUOTE([ARR_3(_target, true, 0)] call DFUNC(displayPatientInformation));
|
||||
|
||||
class Bandage_Head {
|
||||
displayName = "Bandage Head";
|
||||
class Bandage {
|
||||
displayName = "$STR_ACE_Medical_Bandage_HitHead";
|
||||
distance = 2.0;
|
||||
condition = QUOTE([ARR_4(_player, _target, 'head', 'Bandage')] call DFUNC(canTreat));
|
||||
statement = QUOTE([ARR_4(_player, _target, 'head', 'Bandage')] call DFUNC(treatment));
|
||||
@ -413,8 +413,9 @@ class CfgVehicles {
|
||||
priority = 2;
|
||||
hotkey = "M";
|
||||
enableInside = 1;
|
||||
class Bandage_Torso {
|
||||
displayName = "Bandage Torso";
|
||||
|
||||
class Bandage {
|
||||
displayName = "$STR_ACE_Medical_Bandage_HitBody";
|
||||
distance = 2.0;
|
||||
condition = QUOTE([ARR_4(_player, _target, 'body', 'Bandage')] call DFUNC(canTreat));
|
||||
statement = QUOTE([ARR_4(_player, _target, 'body', 'Bandage')] call DFUNC(treatment));
|
||||
@ -451,7 +452,7 @@ class CfgVehicles {
|
||||
statement = QUOTE([ARR_4(_player, _target, 'body', 'QuikClot')] call DFUNC(treatment));
|
||||
};
|
||||
class Morphine: fieldDressing {
|
||||
displayName = "Morphine";
|
||||
displayName = "$STR_ACE_Medical_Inject_Morphine";
|
||||
condition = QUOTE([ARR_4(_player, _target, 'body', 'Morphine')] call DFUNC(canTreat));
|
||||
statement = QUOTE([ARR_4(_player, _target, 'body', 'Morphine')] call DFUNC(treatment));
|
||||
};
|
||||
@ -461,7 +462,7 @@ class CfgVehicles {
|
||||
statement = QUOTE([ARR_4(_player, _target, 'body', 'Atropine')] call DFUNC(treatment));
|
||||
};
|
||||
class Epinephrine: Morphine {
|
||||
displayName = "Epinephrine";
|
||||
displayName = "$STR_ACE_Medical_Inject_Epinephrine";
|
||||
condition = QUOTE([ARR_4(_player, _target, 'body', 'Epinephrine')] call DFUNC(canTreat));
|
||||
statement = QUOTE([ARR_4(_player, _target, 'body', 'Epinephrine')] call DFUNC(treatment));
|
||||
};
|
||||
@ -486,8 +487,8 @@ class CfgVehicles {
|
||||
runOnHover = 1;
|
||||
statement = QUOTE([ARR_3(_target, true, 2)] call DFUNC(displayPatientInformation));
|
||||
|
||||
class Bandage_LeftArm {
|
||||
displayName = "Bandage Left Arm";
|
||||
class Bandage {
|
||||
displayName = "$STR_ACE_Medical_Bandage_HitLeftArm";
|
||||
distance = 2.0;
|
||||
condition = QUOTE([ARR_4(_player, _target, 'hand_l', 'Bandage')] call DFUNC(canTreat));
|
||||
statement = QUOTE([ARR_4(_player, _target, 'hand_l', 'Bandage')] call DFUNC(treatment));
|
||||
@ -529,7 +530,7 @@ class CfgVehicles {
|
||||
statement = QUOTE([ARR_4(_player, _target, 'hand_l', 'Tourniquet')] call DFUNC(treatment));
|
||||
};
|
||||
class Morphine: fieldDressing {
|
||||
displayName = "Morphine";
|
||||
displayName = "$STR_ACE_Medical_Inject_Morphine";
|
||||
condition = QUOTE([ARR_4(_player, _target, 'hand_l', 'Morphine')] call DFUNC(canTreat));
|
||||
statement = QUOTE([ARR_4(_player, _target, 'hand_l', 'Morphine')] call DFUNC(treatment));
|
||||
};
|
||||
@ -539,7 +540,7 @@ class CfgVehicles {
|
||||
statement = QUOTE([ARR_4(_player, _target, 'hand_l', 'Atropine')] call DFUNC(treatment));
|
||||
};
|
||||
class Epinephrine: Morphine {
|
||||
displayName = "Epinephrine";
|
||||
displayName = "$STR_ACE_Medical_Inject_Epinephrine";
|
||||
condition = QUOTE([ARR_4(_player, _target, 'hand_l', 'Epinephrine')] call DFUNC(canTreat));
|
||||
statement = QUOTE([ARR_4(_player, _target, 'hand_l', 'Epinephrine')] call DFUNC(treatment));
|
||||
};
|
||||
@ -607,8 +608,8 @@ class CfgVehicles {
|
||||
class ACE_ArmRight {
|
||||
runOnHover = 1;
|
||||
statement = QUOTE([ARR_3(_target, true, 3)] call DFUNC(displayPatientInformation));
|
||||
class Bandage_RightArm {
|
||||
displayName = "Bandage Right Arm";
|
||||
class Bandage {
|
||||
displayName = "$STR_ACE_Medical_Bandage_HitRightArm";
|
||||
distance = 2.0;
|
||||
condition = QUOTE([ARR_4(_player, _target, 'hand_r', 'Bandage')] call DFUNC(canTreat));
|
||||
statement = QUOTE([ARR_4(_player, _target, 'hand_r', 'Bandage')] call DFUNC(treatment));
|
||||
@ -650,7 +651,7 @@ class CfgVehicles {
|
||||
statement = QUOTE([ARR_4(_player, _target, 'hand_r', 'Tourniquet')] call DFUNC(treatment));
|
||||
};
|
||||
class Morphine: fieldDressing {
|
||||
displayName = "Morphine";
|
||||
displayName = "$STR_ACE_Medical_Inject_Morphine";
|
||||
condition = QUOTE([ARR_4(_player, _target, 'hand_r', 'Morphine')] call DFUNC(canTreat));
|
||||
statement = QUOTE([ARR_4(_player, _target, 'hand_r', 'Morphine')] call DFUNC(treatment));
|
||||
};
|
||||
@ -660,7 +661,7 @@ class CfgVehicles {
|
||||
statement = QUOTE([ARR_4(_player, _target, 'hand_r', 'Atropine')] call DFUNC(treatment));
|
||||
};
|
||||
class Epinephrine: Morphine {
|
||||
displayName = "Epinephrine";
|
||||
displayName = "$STR_ACE_Medical_Inject_Epinephrine";
|
||||
condition = QUOTE([ARR_4(_player, _target, 'hand_r', 'Epinephrine')] call DFUNC(canTreat));
|
||||
statement = QUOTE([ARR_4(_player, _target, 'hand_r', 'Epinephrine')] call DFUNC(treatment));
|
||||
};
|
||||
@ -729,8 +730,8 @@ class CfgVehicles {
|
||||
class ACE_LegLeft {
|
||||
runOnHover = 1;
|
||||
statement = QUOTE([ARR_3(_target, true, 4)] call DFUNC(displayPatientInformation));
|
||||
class Bandage_LeftLeg {
|
||||
displayName = "Bandage Left Leg";
|
||||
class Bandage {
|
||||
displayName = "$STR_ACE_Medical_Bandage_HitLeftLeg";
|
||||
distance = 2.0;
|
||||
condition = QUOTE([ARR_4(_player, _target, 'leg_l', 'Bandage')] call DFUNC(canTreat));
|
||||
statement = QUOTE([ARR_4(_player, _target, 'leg_l', 'Bandage')] call DFUNC(treatment));
|
||||
@ -773,7 +774,7 @@ class CfgVehicles {
|
||||
statement = QUOTE([ARR_4(_player, _target, 'leg_l', 'Tourniquet')] call DFUNC(treatment));
|
||||
};
|
||||
class Morphine: fieldDressing {
|
||||
displayName = "Morphine";
|
||||
displayName = "$STR_ACE_Medical_Inject_Morphine";
|
||||
condition = QUOTE([ARR_4(_player, _target, 'leg_l', 'Morphine')] call DFUNC(canTreat));
|
||||
statement = QUOTE([ARR_4(_player, _target, 'leg_l', 'Morphine')] call DFUNC(treatment));
|
||||
};
|
||||
@ -783,7 +784,7 @@ class CfgVehicles {
|
||||
statement = QUOTE([ARR_4(_player, _target, 'leg_l', 'Atropine')] call DFUNC(treatment));
|
||||
};
|
||||
class Epinephrine: Morphine {
|
||||
displayName = "Epinephrine";
|
||||
displayName = "$STR_ACE_Medical_Inject_Epinephrine";
|
||||
condition = QUOTE([ARR_4(_player, _target, 'leg_l', 'Epinephrine')] call DFUNC(canTreat));
|
||||
statement = QUOTE([ARR_4(_player, _target, 'leg_l', 'Epinephrine')] call DFUNC(treatment));
|
||||
};
|
||||
@ -841,8 +842,8 @@ class CfgVehicles {
|
||||
class ACE_LegRight {
|
||||
runOnHover = 1;
|
||||
statement = QUOTE([ARR_3(_target, true, 5)] call DFUNC(displayPatientInformation));
|
||||
class Bandage_RightLeg {
|
||||
displayName = "Bandage Right Leg";
|
||||
class Bandage {
|
||||
displayName = "$STR_ACE_Medical_Bandage_HitRightLeg";
|
||||
distance = 2.0;
|
||||
condition = QUOTE([ARR_4(_player, _target, 'leg_r', 'Bandage')] call DFUNC(canTreat));
|
||||
statement = QUOTE([ARR_4(_player, _target, 'leg_r', 'Bandage')] call DFUNC(treatment));
|
||||
@ -885,7 +886,7 @@ class CfgVehicles {
|
||||
statement = QUOTE([ARR_4(_player, _target, 'leg_r', 'Tourniquet')] call DFUNC(treatment));
|
||||
};
|
||||
class Morphine: fieldDressing {
|
||||
displayName = "Morphine";
|
||||
displayName = "$STR_ACE_Medical_Inject_Morphine";
|
||||
condition = QUOTE([ARR_4(_player, _target, 'leg_r', 'Morphine')] call DFUNC(canTreat));
|
||||
statement = QUOTE([ARR_4(_player, _target, 'leg_r', 'Morphine')] call DFUNC(treatment));
|
||||
};
|
||||
@ -895,7 +896,7 @@ class CfgVehicles {
|
||||
statement = QUOTE([ARR_4(_player, _target, 'leg_r', 'Atropine')] call DFUNC(treatment));
|
||||
};
|
||||
class Epinephrine: Morphine {
|
||||
displayName = "Epinephrine";
|
||||
displayName = "$STR_ACE_Medical_Inject_Epinephrine";
|
||||
condition = QUOTE([ARR_4(_player, _target, 'leg_r', 'Epinephrine')] call DFUNC(canTreat));
|
||||
statement = QUOTE([ARR_4(_player, _target, 'leg_r', 'Epinephrine')] call DFUNC(treatment));
|
||||
};
|
||||
|
@ -1,25 +1,25 @@
|
||||
|
||||
class CfgWeapons {
|
||||
class ItemCore;
|
||||
class InventoryItem_Base_F;
|
||||
class InventoryFirstAidKitItem_Base_F;
|
||||
class MedikitItem;
|
||||
|
||||
// ITEMS
|
||||
class FirstAidKit: ItemCore {
|
||||
type = 0;
|
||||
class ItemInfo: InventoryFirstAidKitItem_Base_F {
|
||||
mass = 4;
|
||||
type = 201;
|
||||
class ItemCore;
|
||||
class InventoryItem_Base_F;
|
||||
class InventoryFirstAidKitItem_Base_F;
|
||||
class MedikitItem;
|
||||
|
||||
// ITEMS
|
||||
class FirstAidKit: ItemCore {
|
||||
type = 0;
|
||||
class ItemInfo: InventoryFirstAidKitItem_Base_F {
|
||||
mass = 4;
|
||||
type = 201;
|
||||
};
|
||||
};
|
||||
};
|
||||
class Medikit: ItemCore {
|
||||
type = 0;
|
||||
class ItemInfo: MedikitItem {
|
||||
mass = 60;
|
||||
type = 201;
|
||||
class Medikit: ItemCore {
|
||||
type = 0;
|
||||
class ItemInfo: MedikitItem {
|
||||
mass = 60;
|
||||
type = 201;
|
||||
};
|
||||
};
|
||||
};
|
||||
|
||||
// @todo localize
|
||||
class ACE_ItemCore;
|
||||
|
@ -217,7 +217,7 @@ if (isNil QGVAR(level)) then {
|
||||
}, 0, []] call CBA_fnc_addPerFrameHandler;
|
||||
|
||||
// broadcast injuries to JIP clients in a MP session
|
||||
if (isMultiplayer) then {
|
||||
if (isMultiplayer and GVAR(level) >= 2) then {
|
||||
[QGVAR(onPlayerConnected), "onPlayerConnected", {
|
||||
if (isNil QGVAR(InjuredCollection)) then {
|
||||
GVAR(InjuredCollection) = [];
|
||||
|
@ -39,19 +39,16 @@ if (count _items > 0 && {!([_caller, _target, _items] call FUNC(hasItems))}) exi
|
||||
_locations = getArray (_config >> "treatmentLocations");
|
||||
|
||||
_return = true;
|
||||
if (isText (_config >> "Condition")) then {
|
||||
_condition = getText(_config >> "condition");
|
||||
if (_condition != "") then {
|
||||
if (isnil _condition) then {
|
||||
_condition = compile _condition;
|
||||
} else {
|
||||
_condition = missionNamespace getvariable _condition;
|
||||
};
|
||||
if (typeName _condition == "BOOL") then {
|
||||
_return = _condition;
|
||||
} else {
|
||||
_return = [_caller, _target, _selectionName, _className] call _condition;
|
||||
};
|
||||
if (getText (_config >> "condition") != "") then {
|
||||
if (isnil _condition) then {
|
||||
_condition = compile _condition;
|
||||
} else {
|
||||
_condition = missionNamespace getvariable _condition;
|
||||
};
|
||||
if (typeName _condition == "BOOL") then {
|
||||
_return = _condition;
|
||||
} else {
|
||||
_return = [_caller, _target, _selectionName, _className] call _condition;
|
||||
};
|
||||
};
|
||||
if (!_return) exitwith {false};
|
||||
|
@ -75,9 +75,17 @@ if (_show) then {
|
||||
};
|
||||
}foreach _openWounds;
|
||||
} else {
|
||||
// TODO handle basic medical colors for body part selections here
|
||||
|
||||
{
|
||||
_selectionBloodLoss set [_forEachIndex, _target getHitPointDamage _x];
|
||||
|
||||
if (_target getHitPointDamage _x > 0.1) then {
|
||||
// @todo localize
|
||||
_allInjuryTexts pushBack format ["%1 %2",
|
||||
["Lightly wounded", "Heavily wounded"] select (_target getHitPointDamage _x > 0.5),
|
||||
["head", "torso", "left arm", "right arm", "left leg", "right leg"] select _forEachIndex
|
||||
];
|
||||
};
|
||||
} forEach ["HitHead", "HitBody", "HitLeftArm", "HitRightArm", "HitLeftLeg", "HitRightLeg"];
|
||||
};
|
||||
|
||||
// Handle the body image coloring
|
||||
|
@ -112,8 +112,20 @@ if (_selection == "") then {
|
||||
};
|
||||
|
||||
|
||||
// Assign orphan structural damage to torso;
|
||||
// @todo
|
||||
// Assign orphan structural damage to torso
|
||||
[{
|
||||
private ["_unit", "_damagesum"];
|
||||
_unit = _this select 0;
|
||||
_damagesum = (_unit getHitPointDamage "HitHead") +
|
||||
(_unit getHitPointDamage "HitBody") +
|
||||
(_unit getHitPointDamage "HitLeftArm") +
|
||||
(_unit getHitPointDamage "HitRightArm") +
|
||||
(_unit getHitPointDamage "HitLeftLeg") +
|
||||
(_unit getHitPointDamage "HitRightLeg");
|
||||
if (_damagesum < 0.06 and damage _unit > 0.06 and alive _unit) then {
|
||||
_unit setHitPointDamage ["HitBody", damage _unit];
|
||||
};
|
||||
}, [_unit], 2, 0.1] call EFUNC(common,waitAndExecute);
|
||||
|
||||
|
||||
if (_selection == "") then {
|
||||
@ -137,7 +149,7 @@ if (_legdamage >= LEGDAMAGETRESHOLD1) then {
|
||||
} else {
|
||||
if (_unit getHitPointDamage "HitLegs" != 0) then {_unit setHitPointDamage ["HitLegs", 0]};
|
||||
};
|
||||
// @ŧodo: force prone for completely fucked up legs.
|
||||
// @todo: force prone for completely fucked up legs.
|
||||
|
||||
|
||||
// Arm Damage
|
||||
@ -171,9 +183,8 @@ if (_selection == "" and
|
||||
_damageReturn < 1 and
|
||||
!(_unit getVariable [QGVAR(isUnconscious), False]
|
||||
)) then {
|
||||
// random chance to kill AI instead of knocking them out
|
||||
if (_unit getVariable [QGVAR(allowUnconscious), ([_unit] call EFUNC(common,isPlayer)) or random 1 > 0.5]) then {
|
||||
hint "unconscious"; // @todo
|
||||
if (_unit getVariable [QGVAR(allowUnconscious), ([_unit] call EFUNC(common,isPlayer)) or random 1 > 0.3]) then {
|
||||
[_unit, true] call FUNC(setUnconscious);
|
||||
} else {
|
||||
_damageReturn = 1;
|
||||
};
|
||||
|
@ -16,6 +16,11 @@
|
||||
private ["_unit", "_heartRate","_bloodPressure","_bloodVolume","_painStatus", "_lastTimeValuesSynced", "_syncValues"];
|
||||
_unit = _this select 0;
|
||||
|
||||
_interval = time - (_unit getVariable [QGVAR(lastMomentVitalsHandled), 0]);
|
||||
_unit setVariable [QGVAR(lastMomentVitalsHandled), time];
|
||||
|
||||
if (_interval == 0) exitWith {};
|
||||
|
||||
_lastTimeValuesSynced = _unit getvariable [QGVAR(lastMomentValuesSynced), 0];
|
||||
_syncValues = time - _lastTimeValuesSynced >= (10 + floor(random(10)));
|
||||
if (_syncValues) then {
|
||||
@ -60,24 +65,47 @@ if (_painStatus > 0) then {
|
||||
};
|
||||
};
|
||||
|
||||
if (GVAR(level) == 1) then {
|
||||
// reduce pain
|
||||
if (_unit getVariable [QGVAR(pain), 0] > 0) then {
|
||||
_unit setVariable [QGVAR(pain), ((_unit getVariable QGVAR(pain)) - 0.001 * _interval) max 0, _syncValues];
|
||||
};
|
||||
|
||||
if (_bloodVolume < 30) exitwith {
|
||||
[_unit] call FUNC(setDead);
|
||||
};
|
||||
// reduce painkillers
|
||||
if (_unit getVariable [QGVAR(morphine), 0] > 0) then {
|
||||
_unit setVariable [QGVAR(morphine), ((_unit getVariable QGVAR(morphine)) - 0.0015 * _interval) max 0, _syncValues];
|
||||
};
|
||||
|
||||
if ([_unit] call EFUNC(common,isAwake)) then {
|
||||
if (_bloodVolume < 60) then {
|
||||
if (random(1) > 0.9) then {
|
||||
[_unit] call FUNC(setUnconscious);
|
||||
// bleeding
|
||||
_blood = _unit getVariable [QGVAR(bloodVolume), 100];
|
||||
_blood = (_blood - 0.4 * (damage _unit) * _interval) max 0;
|
||||
if (_blood != (_unit getVariable [QGVAR(bloodVolume), 100])) then {
|
||||
_unit setVariable [QGVAR(bloodVolume), _blood, _syncValues];
|
||||
if (_blood <= 35 and !(_unit getVariable [QGVAR(isUnconscious), false])) then {
|
||||
[_unit, true] call FUNC(setUnconscious);
|
||||
};
|
||||
if (_blood == 0) then {
|
||||
[_unit] call FUNC(setDead);
|
||||
};
|
||||
};
|
||||
};
|
||||
|
||||
// handle advanced medical, with vitals
|
||||
if (GVAR(level) >= 2) then {
|
||||
if (_bloodVolume < 30) exitwith {
|
||||
[_unit] call FUNC(setDead);
|
||||
};
|
||||
|
||||
if ([_unit] call EFUNC(common,isAwake)) then {
|
||||
if (_bloodVolume < 60) then {
|
||||
if (random(1) > 0.9) then {
|
||||
[_unit] call FUNC(setUnconscious);
|
||||
};
|
||||
};
|
||||
};
|
||||
|
||||
// Set the vitals
|
||||
_heartRate = (_unit getvariable [QGVAR(heartRate), 0]) + ([_unit] call FUNC(getHeartRateChange));
|
||||
_heartRate = (_unit getvariable [QGVAR(heartRate), 0]) + ([_unit] call FUNC(getHeartRateChange)) * _interval;
|
||||
_unit setvariable [QGVAR(heartRate), _heartRate, _syncValues];
|
||||
|
||||
_bloodPressure = [_unit] call FUNC(getBloodPressure);
|
||||
@ -88,12 +116,12 @@ if (GVAR(level) >= 2) then {
|
||||
_airwayStatus = _unit getvariable [QGVAR(airwayStatus), 100];
|
||||
if (((_unit getvariable [QGVAR(airwayOccluded), false]) || (_unit getvariable [QGVAR(airwayCollapsed), false])) && !((_unit getvariable [QGVAR(airwaySecured), false]))) then {
|
||||
if (_airwayStatus >= 0.5) then {
|
||||
_unit setvariable [QGVAR(airwayStatus), _airwayStatus - 0.5, _syncValues];
|
||||
_unit setvariable [QGVAR(airwayStatus), _airwayStatus - 0.5 * _interval, _syncValues];
|
||||
};
|
||||
} else {
|
||||
if !((_unit getvariable [QGVAR(airwayOccluded), false]) || (_unit getvariable [QGVAR(airwayCollapsed), false])) then {
|
||||
if (_airwayStatus < 100) then {
|
||||
_unit setvariable [QGVAR(airwayStatus), (_airwayStatus + 1.5) min 100, _syncValues];
|
||||
_unit setvariable [QGVAR(airwayStatus), (_airwayStatus + 1.5 * _interval) min 100, _syncValues];
|
||||
};
|
||||
};
|
||||
};
|
||||
@ -108,7 +136,7 @@ if (GVAR(level) >= 2) then {
|
||||
// Check vitals for medical status
|
||||
// TODO check for in revive state instead of variable
|
||||
// TODO Implement cardiac arrest.
|
||||
_bloodPressureL = _bloodPressure select 0;
|
||||
_bloodPressureL = _bloodPressure select 0;
|
||||
_bloodPressureH = _bloodPressure select 1;
|
||||
|
||||
if (!(_unit getvariable [QGVAR(inCardiacArrest),false])) then {
|
||||
|
23
addons/medical/functions/fnc_isInMedicalVehicle.sqf
Normal file
23
addons/medical/functions/fnc_isInMedicalVehicle.sqf
Normal file
@ -0,0 +1,23 @@
|
||||
/*
|
||||
* Author: KoffeinFlummi
|
||||
* Checks if a unit is in a medical vehicle.
|
||||
*
|
||||
* Arguments:
|
||||
* 0: unit to be checked <OBJECT>
|
||||
*
|
||||
* Return Value:
|
||||
* Is unit in medical vehicle? <BOOL>
|
||||
*
|
||||
* Public: Yes
|
||||
*/
|
||||
|
||||
private ["_unit", "_vehicle"];
|
||||
|
||||
_unit = _this select 0;
|
||||
_vehicle = vehicle _unit;
|
||||
|
||||
if (_unit == _vehicle) exitWith {false};
|
||||
if (_unit in [driver _vehicle, gunner _vehicle, commander _vehicle]) exitWith {false};
|
||||
|
||||
// @todo: variable names standard?
|
||||
_vehicle getVariable [QGVAR(isMedic), getNumber (configFile >> "CfgVehicles" >> typeOf _vehicle >> "attendant") == 1]
|
@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Author: Glowbal
|
||||
* Author: Glowbal, KoffeinFlummi
|
||||
* Check if a unit is any medical class
|
||||
*
|
||||
* Arguments:
|
||||
@ -18,18 +18,7 @@ private ["_unit","_class","_return"];
|
||||
_unit = _this select 0;
|
||||
_medicN = if (count _this > 1) then {_this select 1} else {1};
|
||||
|
||||
_return = false;
|
||||
if (GVAR(medicSetting) >= 1) then {
|
||||
_class = _unit getvariable [QGVAR(medicClass), 0];
|
||||
if (GVAR(medicSetting) == 1) then {
|
||||
_return = _class > 0;
|
||||
} else {
|
||||
if (_class >= _medicN) then {
|
||||
_return = true;
|
||||
};
|
||||
};
|
||||
} else {
|
||||
_return = true;
|
||||
};
|
||||
_class = _unit getVariable [QGVAR(medicClass),
|
||||
getNumber (configFile >> "CfgVehicles" >> typeOf _unit >> "attendant")];
|
||||
|
||||
_return;
|
||||
_class >= _medicN min GVAR(medicSetting)
|
||||
|
@ -1,6 +1,6 @@
|
||||
/*
|
||||
* Author: KoffeinFlummi
|
||||
* My very own setHitPointDamage since BIS's one is buggy when affecting a remote unit.
|
||||
* My very own setHitPointDamage since BIS' one is buggy when affecting a remote unit.
|
||||
* It also doesn't change the overall damage. This does.
|
||||
*
|
||||
* Arguments:
|
||||
@ -16,6 +16,10 @@
|
||||
*/
|
||||
|
||||
#include "script_component.hpp"
|
||||
#define LEGDAMAGETRESHOLD1 1
|
||||
#define LEGDAMAGETRESHOLD2 1.7
|
||||
#define ARMDAMAGETRESHOLD1 1
|
||||
#define ARMDAMAGETRESHOLD2 1.7
|
||||
|
||||
private ["_unit", "_selection", "_damage", "_selections", "_damages", "_damageOld", "_damageSumOld", "_damageNew", "_damageSumNew", "_damageFinal"];
|
||||
|
||||
@ -76,3 +80,22 @@ _unit setDamage _damageNew;
|
||||
_damageFinal = (_damages select _forEachIndex);
|
||||
_unit setHitPointDamage [_x, _damageFinal];
|
||||
} forEach _selections;
|
||||
|
||||
// Leg Damage
|
||||
_legdamage = (_unit getHitPointDamage "HitLeftLeg") + (_unit getHitPointDamage "HitRightLeg");
|
||||
if (_legdamage >= LEGDAMAGETRESHOLD1) then {
|
||||
if (_unit getHitPointDamage "HitLegs" != 1) then {_unit setHitPointDamage ["HitLegs", 1]};
|
||||
} else {
|
||||
if (_unit getHitPointDamage "HitLegs" != 0) then {_unit setHitPointDamage ["HitLegs", 0]};
|
||||
};
|
||||
// @ŧodo: force prone for completely fucked up legs.
|
||||
|
||||
|
||||
// Arm Damage
|
||||
_armdamage = (_unit getHitPointDamage "HitLeftArm") + (_unit getHitPointDamage "HitRightArm");
|
||||
if (_armdamage >= ARMDAMAGETRESHOLD1) then {
|
||||
if (_unit getHitPointDamage "HitHands" != 1) then {_unit setHitPointDamage ["HitHands", 1]};
|
||||
} else {
|
||||
if (_unit getHitPointDamage "HitHands" != 0) then {_unit setHitPointDamage ["HitHands", 0]};
|
||||
};
|
||||
// @todo: Drop weapon for full damage.
|
||||
|
@ -35,6 +35,12 @@ if (!local _unit) exitwith {
|
||||
_unit setvariable ["ACE_isUnconscious", true, true];
|
||||
_unit setUnconscious true;
|
||||
|
||||
// @todo: mute player?
|
||||
if (_unit == ACE_player) then {
|
||||
if (visibleMap) then {openMap false};
|
||||
closeDialog 0;
|
||||
};
|
||||
|
||||
// If a unit has the launcher out, it will sometimes start selecting the primairy weapon while unconscious,
|
||||
// therefor we force it to select the primairy weapon before going unconscious
|
||||
if ((vehicle _unit) isKindOf "StaticWeapon") then {
|
||||
|
@ -32,6 +32,4 @@ if (_selection == "all") then {
|
||||
|
||||
_damage = ((_target getHitPointDamage _point) - BANDAGEHEAL) max 0;
|
||||
[_target, _point, _damage] call FUNC(setHitPointDamage);
|
||||
|
||||
// @todo: leg/arm damage - in setHitPointDamage?
|
||||
};
|
||||
|
@ -15,7 +15,6 @@
|
||||
*/
|
||||
|
||||
#include "script_component.hpp"
|
||||
#define BLOODBAGHEAL 70
|
||||
|
||||
private ["_caller", "_target","_className"];
|
||||
_caller = _this select 0;
|
||||
|
@ -23,11 +23,9 @@ _target = _this select 1;
|
||||
_className = _this select 3;
|
||||
|
||||
// reduce pain, pain sensitivity
|
||||
_morphine = (_target getVariable [QGVAR(morphine), 0] + MORPHINEHEAL) min 1;
|
||||
_morphine = ((_target getVariable [QGVAR(morphine), 0]) + MORPHINEHEAL) min 1;
|
||||
_target setVariable [QGVAR(morphine), _morphine, true];
|
||||
_pain = ((_target getVariable [QGVAR(pain), 0]) - MORPHINEHEAL) max 0;
|
||||
_target setVariable [QGVAR(pain), _pain, true];
|
||||
|
||||
// @todo overdose
|
||||
|
||||
// @todo pain, painkiller reduction
|
||||
|
@ -1,73 +1,243 @@
|
||||
<?xml version="1.0"encoding="UTF-8"?>
|
||||
<Project name="ACE">
|
||||
<Package name="Medical">
|
||||
<Container name="Basic">
|
||||
<Key ID="STR_ACE_Medical_Inject_Morphine">
|
||||
<English>Inject Morphine</English>
|
||||
<German>Morphin injizieren</German>
|
||||
<Spanish>Inyectar Morfina</Spanish>
|
||||
<Polish>Wstrzyknij morfinę</Polish>
|
||||
<Czech>Aplikovat Morfin</Czech>
|
||||
<Russian>Ввести морфин</Russian>
|
||||
<French>Morphine</French>
|
||||
<Hungarian>Morfium</Hungarian>
|
||||
<Portuguese>Injetar Morfina</Portuguese>
|
||||
<Italian>Inietta Morfina</Italian>
|
||||
</Key>
|
||||
<Key ID="STR_ACE_Medical_Inject_Epinephrine">
|
||||
<English>Inject Epinephrine</English>
|
||||
<German>Epinephrine injizieren</German>
|
||||
<Spanish>Inyectar Epinefrina</Spanish>
|
||||
<Polish>Wtrzyknij adrenalinę</Polish>
|
||||
<Czech>Aplikovat Adrenalin</Czech>
|
||||
<Russian>Ввести андреналил</Russian>
|
||||
<French>Adrénaline</French>
|
||||
<Hungarian>Adrenalin</Hungarian>
|
||||
<Portuguese>Injetar Epinefrina</Portuguese>
|
||||
<Italian>Inietta Epinefrina</Italian>
|
||||
</Key>
|
||||
<Key ID="STR_ACE_Medical_Transfuse_Blood">
|
||||
<English>Transfuse Blood</English>
|
||||
<German>Bluttransfusion</German>
|
||||
<Spanish>Transfundir sangre</Spanish>
|
||||
<Polish>Przetocz krew</Polish>
|
||||
<Czech>Transfúze krve</Czech>
|
||||
<Russian>Перелить кровь</Russian>
|
||||
<French>Transfusion</French>
|
||||
<Hungarian>Infúzió</Hungarian>
|
||||
<Portuguese>Transfundir Sangue</Portuguese>
|
||||
<Italian>Effettua Trasfusione</Italian>
|
||||
</Key>
|
||||
<Key ID="STR_ACE_Medical_Bandage">
|
||||
<English>Bandage</English>
|
||||
<German>Verbinden</German>
|
||||
<Spanish>Venda</Spanish>
|
||||
<Polish>Bandaż</Polish>
|
||||
<Czech>Obvázat</Czech>
|
||||
<French>Pansement</French>
|
||||
<Italian>Benda</Italian>
|
||||
<Hungarian>Kötözés</Hungarian>
|
||||
<Portuguese>Atadura</Portuguese>
|
||||
<Russian>Перевязать</Russian>
|
||||
</Key>
|
||||
<Key ID="STR_ACE_Medical_Bandage_HitHead">
|
||||
<English>Bandage Head</English>
|
||||
<German>Kopf verbinden</German>
|
||||
<Spanish>Vendar la cabeza</Spanish>
|
||||
<Polish>Bandażuj głowę</Polish>
|
||||
<Czech>Obvázat hlavu</Czech>
|
||||
<Russian>Перевязать голову</Russian>
|
||||
<French>Pansement Tête</French>
|
||||
<Hungarian>Fej kötözése</Hungarian>
|
||||
<Portuguese>Atar Cabeça</Portuguese>
|
||||
<Italian>Benda la testa</Italian>
|
||||
</Key>
|
||||
<Key ID="STR_ACE_Medical_Bandage_HitBody">
|
||||
<English>Bandage Torso</English>
|
||||
<German>Torso verbinden</German>
|
||||
<Spanish>Vendar el torso</Spanish>
|
||||
<Polish>Bandażuj tors</Polish>
|
||||
<Czech>Obvázat hruď</Czech>
|
||||
<Russian>Перевязать торс</Russian>
|
||||
<French>Pansement Torse</French>
|
||||
<Hungarian>Felsőtest kötözése</Hungarian>
|
||||
<Portuguese>Atar Tronco</Portuguese>
|
||||
<Italian>Benda il torso</Italian>
|
||||
</Key>
|
||||
<Key ID="STR_ACE_Medical_Bandage_HitLeftArm">
|
||||
<English>Bandage Left Arm</English>
|
||||
<German>Arm links verbinden</German>
|
||||
<Spanish>Vendar el brazo izquierdo</Spanish>
|
||||
<Polish>Bandażuj lewe ramię</Polish>
|
||||
<Czech>Obvázat levou ruku</Czech>
|
||||
<Russian>Перевязать левую руку</Russian>
|
||||
<French>Pansement Bras Gauche</French>
|
||||
<Hungarian>Bal kar kötözése</Hungarian>
|
||||
<Portuguese>Atar Braço Esquerdo</Portuguese>
|
||||
<Italian>Benda il braccio sinistro</Italian>
|
||||
</Key>
|
||||
<Key ID="STR_ACE_Medical_Bandage_HitRightArm">
|
||||
<English>Bandage Right Arm</English>
|
||||
<German>Arm rechts verbinden</German>
|
||||
<Spanish>Vendar el brazo derecho</Spanish>
|
||||
<Polish>Bandażuj prawe ramię</Polish>
|
||||
<Czech>Obvázat pravou ruku</Czech>
|
||||
<Russian>Перевязать правую руку</Russian>
|
||||
<French>Pansement Bras Droit</French>
|
||||
<Hungarian>Jobb kar kötözése</Hungarian>
|
||||
<Portuguese>Atar Braço Direito</Portuguese>
|
||||
<Italian>Benda il braccio destro</Italian>
|
||||
</Key>
|
||||
<Key ID="STR_ACE_Medical_Bandage_HitLeftLeg">
|
||||
<English>Bandage Left Leg</English>
|
||||
<German>Bein links verbinden</German>
|
||||
<Spanish>Vendar la pierna izquierda</Spanish>
|
||||
<Polish>Bandażuj lewą nogę</Polish>
|
||||
<Czech>Obvázat levou nohu</Czech>
|
||||
<Russian>Перевязать левую ногу</Russian>
|
||||
<French>Pansement Jambe Gauche</French>
|
||||
<Hungarian>Bal láb kötözése</Hungarian>
|
||||
<Portuguese>Atar Perna Esquerda</Portuguese>
|
||||
<Italian>Benda la gamba sinistra</Italian>
|
||||
</Key>
|
||||
<Key ID="STR_ACE_Medical_Bandage_HitRightLeg">
|
||||
<English>Bandage Right Leg</English>
|
||||
<German>Bein rechts verbinden</German>
|
||||
<Spanish>Vendar la pierna derecha</Spanish>
|
||||
<Polish>Bandażuj prawą nogę</Polish>
|
||||
<Czech>Obvázat pravou nohu</Czech>
|
||||
<Russian>Перевязать правую ногу</Russian>
|
||||
<French>Pansement Jambe Droite</French>
|
||||
<Hungarian>Jobb láb kötözése</Hungarian>
|
||||
<Portuguese>Atar Perna Direita</Portuguese>
|
||||
<Italian>Benda la gamba destra</Italian>
|
||||
</Key>
|
||||
<Key ID="STR_ACE_Medical_Injecting_Morphine">
|
||||
<English>Injecting Morphine ...</English>
|
||||
<German>Morphin injizieren ...</German>
|
||||
<Spanish>Inyectando Morfina ...</Spanish>
|
||||
<Polish>Wstrzykiwanie morfiny ...</Polish>
|
||||
<Czech>Aplikuju Morfin ...</Czech>
|
||||
<Russian>Введение морфина...</Russian>
|
||||
<French>Injection de Morphine...</French>
|
||||
<Hungarian>Morfium beadása...</Hungarian>
|
||||
<Portuguese>Injetando Morfina ...</Portuguese>
|
||||
<Italian>Inietto la morfina ...</Italian>
|
||||
</Key>
|
||||
<Key ID="STR_ACE_Medical_Injecting_Epinephrine">
|
||||
<English>Injecting Epinephrine ...</English>
|
||||
<German>Epinephrine injizieren ...</German>
|
||||
<Spanish>Inyectando Epinefrina ...</Spanish>
|
||||
<Polish>Wstrzykiwanie adrenaliny ...</Polish>
|
||||
<Czech>Aplikuju Adrenalin ...</Czech>
|
||||
<Russian>Введение андреналина</Russian>
|
||||
<French>Injection d'Adrénaline ...</French>
|
||||
<Hungarian>Adrenalin beadása...</Hungarian>
|
||||
<Portuguese>Injetando Epinefrina ...</Portuguese>
|
||||
<Italian>Inietto l'epinefrina ...</Italian>
|
||||
</Key>
|
||||
<Key ID="STR_ACE_Medical_Transfusing_Blood">
|
||||
<English>Transfusing Blood ...</English>
|
||||
<German>Bluttransfusion ...</German>
|
||||
<Spanish>Realizando transfusión ...</Spanish>
|
||||
<Polish>Przetaczanie krwi ...</Polish>
|
||||
<Czech>Probíhá transfúze krve ...</Czech>
|
||||
<Russian>Переливание крови...</Russian>
|
||||
<French>Transfusion Sanguine ...</French>
|
||||
<Hungarian>Infúzió...</Hungarian>
|
||||
<Portuguese>Transfundindo Sangue ...</Portuguese>
|
||||
<Italian>Effettuo la trasfusione ...</Italian>
|
||||
</Key>
|
||||
<Key ID="STR_ACE_Medical_Bandaging">
|
||||
<English>Bandaging ...</English>
|
||||
<German>Verbinden ...</German>
|
||||
<Spanish>Vendando ...</Spanish>
|
||||
<Polish>Bandażowanie ...</Polish>
|
||||
<Czech>Obvazuji ...</Czech>
|
||||
<French>Pansement ...</French>
|
||||
<Italian>Sto applicando la benda ...</Italian>
|
||||
<Hungarian>Bekötözés...</Hungarian>
|
||||
<Portuguese>Atando ...</Portuguese>
|
||||
<Russian>Перевязывание....</Russian>
|
||||
</Key>
|
||||
</Container>
|
||||
<Container name="UI">
|
||||
<Key ID="STR_ACE_MEDICAL_TRIAGE_STATUS_MINOR">
|
||||
<Original>Minor</Original>
|
||||
<English>Minor</English>
|
||||
</Key>
|
||||
<Key ID="STR_ACE_MEDICAL_TRIAGE_STATUS_DELAYED">
|
||||
<Original>Delayed</Original>
|
||||
<English>Delayed</English>
|
||||
</Key>
|
||||
<Key ID="STR_ACE_MEDICAL_TRIAGE_STATUS_IMMEDIATE">
|
||||
<Original>Immediate</Original>
|
||||
<English>Immediate</English>
|
||||
</Key>
|
||||
<Key ID="STR_ACE_MEDICAL_TRIAGE_STATUS_DECEASED">
|
||||
<Original>Deceased</Original>
|
||||
<English>Deceased</English>
|
||||
</Key>
|
||||
<Key ID="STR_ACE_MEDICAL_TRIAGE_STATUS_NONE">
|
||||
<Original>None</Original>
|
||||
<English>None</English>
|
||||
</Key>
|
||||
<Key ID="STR_ACE_MEDICAL_NORMAL_BREATHING">
|
||||
<Original>Normal breathing</Original>
|
||||
<English>Normal breathing</English>
|
||||
<Russian>Дыхание в норме</Russian>
|
||||
<Spanish>Respiración normal</Spanish>
|
||||
<French>Respiration Normale</French>
|
||||
<Polish>Normalny oddech</Polish>
|
||||
</Key>
|
||||
<Key ID="STR_ACE_MEDICAL_NO_BREATHING">
|
||||
<Original>No breathing</Original>
|
||||
<English>No breathing</English>
|
||||
<Russian>Дыхания нет</Russian>
|
||||
<Spanish>No respira</Spanish>
|
||||
<French>Apnée</French>
|
||||
<Polish>Brak oddechu</Polish>
|
||||
</Key>
|
||||
<Key ID="STR_ACE_MEDICAL_DIFFICULT_BREATHING">
|
||||
<Original>Difficult breathing</Original>
|
||||
<English>Difficult breathing</English>
|
||||
<Russian>Дыхание затруднено</Russian>
|
||||
<Spanish>Dificultad para respirar</Spanish>
|
||||
<French>Difficultée Respiratoire</French>
|
||||
<Polish>Trudności z oddychaniem</Polish>
|
||||
</Key>
|
||||
<Key ID="STR_ACE_MEDICAL_ALMOST_NO_BREATHING">
|
||||
<Original>Almost no breathing</Original>
|
||||
<English>Almost no breathing</English>
|
||||
<Russian>Дыхания почти нет</Russian>
|
||||
<Spanish>Casi sin respirar</Spanish>
|
||||
<French>Respiration Faible</French>
|
||||
<Polish>Prawie brak oddechu</Polish>
|
||||
</Key>
|
||||
<Key ID="STR_ACE_MEDICAL_STATUS_BLEEDING">
|
||||
<Original>Bleeding</Original>
|
||||
<English>Bleeding</English>
|
||||
<Russian>Кровотечение</Russian>
|
||||
<Spanish>Sangrando</Spanish>
|
||||
<French>Seignement</French>
|
||||
<Polish>Krwawienie zewnętrzne</Polish>
|
||||
</Key>
|
||||
<Key ID="STR_ACE_MEDICAL_STATUS_PAIN">
|
||||
<Original>In Pain</Original>
|
||||
<English>In Pain</English>
|
||||
<Russian>Испытывает боль</Russian>
|
||||
<Spanish>Con Dolor</Spanish>
|
||||
<French>A De La Douleur</French>
|
||||
<Polish>W bólu</Polish>
|
||||
</Key>
|
||||
<Key ID="STR_ACE_MEDICAL_STATUS_LOST_BLOOD">
|
||||
<Original>Lost a lot of Blood</Original>
|
||||
<English>Lost a lot of Blood</English>
|
||||
<Russian>Большая кровопотеря</Russian>
|
||||
<Spanish>Mucha Sangre perdida</Spanish>
|
||||
<French>A Perdu Bcp de Sang</French>
|
||||
<Polish>Stracił dużo krwi</Polish>
|
||||
</Key>
|
||||
<Key ID="STR_ACE_MEDICAL_STATUS_TOURNIQUET_APPLIED">
|
||||
<Original>Tourniquet [CAT]</Original>
|
||||
<English>Tourniquet [CAT]</English>
|
||||
<Russian>Жгут</Russian>
|
||||
<Spanish>Torniquete [CAT]</Spanish>
|
||||
<French>Garot [CAT]</French>
|
||||
@ -76,487 +246,486 @@
|
||||
</Container>
|
||||
<Container name="CfgWeapons">
|
||||
<Key ID="STR_ACE_MEDICAL_BANDAGE_BASIC_DISPLAY">
|
||||
<Original>Bandage (Basic)</Original>
|
||||
<English>Bandage (Basic)</English>
|
||||
<Russian>Повязка (обычная)</Russian>
|
||||
<Spanish>Vendaje (Básico)</Spanish>
|
||||
<French>Bandage (Standard)</French>
|
||||
<Polish>Bandaż (jałowy)</Polish>
|
||||
</Key>
|
||||
<Key ID="STR_ACE_MEDICAL_BANDAGE_BASIC_DESC_SHORT">
|
||||
<Original>Used to cover a wound</Original>
|
||||
<English>Used to cover a wound</English>
|
||||
<Russian>Для перевязки ран</Russian>
|
||||
<Spanish>Utilizado para cubrir una herida</Spanish>
|
||||
<French>Utilisé Pour Couvrir Une Blessure</French>
|
||||
<Polish>Używany w celu przykrycia i ochrony miejsca zranienia</Polish>
|
||||
</Key>
|
||||
<Key ID="STR_ACE_MEDICAL_BANDAGE_BASIC_DESC_USE">
|
||||
<Original>A dressing, that is a particular material used to cover a wound, which is applied over the wound once bleeding has been stemmed.</Original>
|
||||
<English>A dressing, that is a particular material used to cover a wound, which is applied over the wound once bleeding has been stemmed.</English>
|
||||
<Russian>Повязка, накладываемая поверх раны после остановки кровотечения.</Russian>
|
||||
<Spanish>Un apósito, material específico utilizado para cubrir una herida, se aplica sobre la herida una vez ha dejado de sangrar.</Spanish>
|
||||
<French>C'est un bandage, qui est fait d'un matériel spécial utiliser pour couvrir une blessure, qui peut etre appliquer des que le seignement as ete stopper.</French>
|
||||
<Polish>Opatrunek materiałowy, używany do przykrywania ran, zakładany na ranę po zatamowaniu krwawienia.</Polish>
|
||||
</Key>
|
||||
<Key ID="STR_ACE_MEDICAL_PACKING_BANDAGE_DISPLAY">
|
||||
<Original>Packing Bandage</Original>
|
||||
<English>Packing Bandage</English>
|
||||
<Russian>Тампонирующая повязка</Russian>
|
||||
<Spanish>Vendaje Compresivo</Spanish>
|
||||
<French>Bandage Mèche</French>
|
||||
<Polish>Bandaż (uciskowy)</Polish>
|
||||
</Key>
|
||||
<Key ID="STR_ACE_MEDICAL_PACKING_BANDAGE_DESC_SHORT">
|
||||
<Original>Used to pack medium to large wounds and stem the bleeding</Original>
|
||||
<English>Used to pack medium to large wounds and stem the bleeding</English>
|
||||
<Russian>Для тампонирования ран среднего и большого размера и остановки кровотечения.</Russian>
|
||||
<Spanish>Se utiliza para vendar heridas medianas y grandes y detener el sangrado</Spanish>
|
||||
<French>Utiliser pour remplire la cavité créé dans une blessure moyenne et grande.</French>
|
||||
<Polish>Używany w celu opatrywania średnich i dużych ran oraz tamowania krwawienia.</Polish>
|
||||
</Key>
|
||||
<Key ID="STR_ACE_MEDICAL_PACKING_BANDAGE_DESC_USE">
|
||||
<Original>A bandage used to pack the wound to stem bleeding and facilitate wound healing. Packing a wound is an option in large polytrauma injuries.</Original>
|
||||
<English>A bandage used to pack the wound to stem bleeding and facilitate wound healing. Packing a wound is an option in large polytrauma injuries.</English>
|
||||
<Russian>Повязка для тампонирования раны, остановки кровотечения и лучшего заживления. При тяжелых сочетанных ранениях возможно тампонирование раны.</Russian>
|
||||
<Spanish>Se utiliza para detener la hemorragia de una herida y favorecer su cicatrización. Se usa en grandes lesiones o politraumatismos.</Spanish>
|
||||
<French>Un bandage servent a etre inseré dans les blessure pour éponger le seignement et faciliter la guerrison. Ce bandage est une option pour soigner les lession de politrauma.</French>
|
||||
<Polish>Opatrunek stosowany w celu zatrzymania krwawienia i osłony większych ran.</Polish>
|
||||
</Key>
|
||||
<Key ID="STR_ACE_MEDICAL_BANDAGE_ELASTIC_DISPLAY">
|
||||
<Original>Bandage (Elastic)</Original>
|
||||
<English>Bandage (Elastic)</English>
|
||||
<Russian>Повязка (давящая)</Russian>
|
||||
<Spanish>Vendaje (Elástico)</Spanish>
|
||||
<French>Bandage (Élastique)</French>
|
||||
<Polish>Bandaż (elastyczny)</Polish>
|
||||
</Key>
|
||||
<Key ID="STR_ACE_MEDICAL_BANDAGE_ELASTIC_DESC_SHORT">
|
||||
<Original>Bandage kit, Elastic</Original>
|
||||
<English>Bandage kit, Elastic</English>
|
||||
<Russian>Давящая повязка</Russian>
|
||||
<Spanish>Vendaje (Elástico)</Spanish>
|
||||
<French>Bandage Compressif Élastique</French>
|
||||
<Polish>Zestaw bandaży elastycznych.</Polish>
|
||||
</Key>
|
||||
<Key ID="STR_ACE_MEDICAL_BANDAGE_ELASTIC_DESC_USE">
|
||||
<Original></Original>
|
||||
<English></English>
|
||||
<Russian></Russian>
|
||||
<French>Ce bandage peut etre utiliser pour compresser la plaie afin de ralentire le seignement et assurer la tenue du bandage lors de mouvment.</French>
|
||||
<Polish>Elastyczna opaska podtrzymująca opatrunek oraz usztywniająca okolice stawów.</Polish>
|
||||
<Spanish>Brinda una compresión uniforme y ofrece soporte extra a una zona lesionada</Spanish>
|
||||
</Key>
|
||||
<Key ID="STR_ACE_MEDICAL_TOURNIQUET_DISPLAY">
|
||||
<Original>Tourniquet (CAT)</Original>
|
||||
<English>Tourniquet (CAT)</English>
|
||||
<Russian>Жгут</Russian>
|
||||
<Spanish>Torniquete (CAT)</Spanish>
|
||||
<French>Garot (CAT)</French>
|
||||
<Polish>Staza (typ. CAT)</Polish>
|
||||
</Key>
|
||||
<Key ID="STR_ACE_MEDICAL_TOURNIQUET_DESC_SHORT">
|
||||
<Original>Slows down blood loss when bleeding</Original>
|
||||
<English>Slows down blood loss when bleeding</English>
|
||||
<Russian>Уменьшает кровопотерю при кровотечении.</Russian>
|
||||
<Spanish>Reduce la velocidad de pérdida de sangre</Spanish>
|
||||
<French>Ralentit le seignement</French>
|
||||
<Polish>Zmniejsza ubytek krwi z kończyn w przypadku krwawienia.</Polish>
|
||||
</Key>
|
||||
<Key ID="STR_ACE_MEDICAL_TOURNIQUET_DESC_USE">
|
||||
<Original>A constricting device used to compress venous and arterial circulation in effect inhibiting or slowing blood flow and therefore decreasing loss of blood.</Original>
|
||||
<English>A constricting device used to compress venous and arterial circulation in effect inhibiting or slowing blood flow and therefore decreasing loss of blood.</English>
|
||||
<Russian>Жгут используется для прижатия сосудов, приводящего к остановке или значительному уменьшению кровотечения и сокращению кровопотери.</Russian>
|
||||
<Spanish>Dispositivo utilizado para eliminar el pulso distal y de ese modo controlar la pérdida de sangre</Spanish>
|
||||
<French>Un appareil servent a compresser les artères et veines afin de reduire la perte de sang.</French>
|
||||
<Polish>Opaska zaciskowa CAT służy do tamowanie krwotoków w sytuacji zranienia kończyn z masywnym krwawieniem tętniczym lub żylnym.</Polish>
|
||||
</Key>
|
||||
<Key ID="STR_ACE_MEDICAL_MORPHINE_DISPLAY">
|
||||
<Original>Morphine auto-injector</Original>
|
||||
<English>Morphine auto-injector</English>
|
||||
<Russian>Морфин в автоматическом шприце</Russian>
|
||||
<Spanish>Morfina auto-inyectable</Spanish>
|
||||
<French>Auto-injecteur de Morphine</French>
|
||||
<Polish>Autostrzykawka z morfiną</Polish>
|
||||
</Key>
|
||||
<Key ID="STR_ACE_MEDICAL_MORPHINE_DESC_SHORT">
|
||||
<Original>Used to combat moderate to severe pain experiences</Original>
|
||||
<English>Used to combat moderate to severe pain experiences</English>
|
||||
<Russian>Для снятия средних и сильных болевых ощущений.</Russian>
|
||||
<Spanish>Usado para combatir los estados dolorosos moderados a severos</Spanish>
|
||||
<French>Utiliser pour contrer les douleurs modéré à severes.</French>
|
||||
<Polish>Morfina. Ma silne działanie przeciwbólowe.</Polish>
|
||||
</Key>
|
||||
<Key ID="STR_ACE_MEDICAL_MORPHINE_DESC_USE">
|
||||
<Original>An analgesic used to combat moderate to severe pain experiences.</Original>
|
||||
<English>An analgesic used to combat moderate to severe pain experiences.</English>
|
||||
<Russian>Анальгетик для снятия средних и сильных болевых ощущений.</Russian>
|
||||
<Spanish>Analgésico usado para combatir los estados dolorosos de moderado a severo.</Spanish>
|
||||
<French>Un Analgésique puissant servant a contrer les douleur modéré a severe.</French>
|
||||
<Polish>Organiczny związek chemiczny z grupy alkaloidów. Ma silne działanie przeciwbólowe.</Polish>
|
||||
</Key>
|
||||
<Key ID="STR_ACE_MEDICAL_ATROPINE_DISPLAY">
|
||||
<Original>Atropin auto-injector</Original>
|
||||
<English>Atropin auto-injector</English>
|
||||
<Russian>Атропин в автоматическом шприце</Russian>
|
||||
<Spanish>Atropina auto-inyectable</Spanish>
|
||||
<French>Auto-injecteur d'Atropine</French>
|
||||
<Polish>Autostrzykawka AtroPen</Polish>
|
||||
</Key>
|
||||
<Key ID="STR_ACE_MEDICAL_ATROPINE_DESC_SHORT">
|
||||
<Original>Used in NBC scenarios</Original>
|
||||
<English>Used in NBC scenarios</English>
|
||||
<Russian>Применяется для защиты от ОМП</Russian>
|
||||
<Spanish>Usado en escenarios NBQ</Spanish>
|
||||
<French>Utiliser en cas d'attaque CBRN</French>
|
||||
<Polish>Atropina. Stosowana jako lek rozkurczowy i środek rozszerzający źrenice.</Polish>
|
||||
</Key>
|
||||
<Key ID="STR_ACE_MEDICAL_ATROPINE_DESC_USE">
|
||||
<Original>A drug used by the Military in NBC scenarios.</Original>
|
||||
<English>A drug used by the Military in NBC scenarios.</English>
|
||||
<Russian>Препарат, используемый в войсках для защиты от оружия массового поражения.</Russian>
|
||||
<Spanish>Medicamento usado por Militares en escenarios NBQ</Spanish>
|
||||
<French>Médicament utilisé par l'armée en cas d'attaque CBRN</French>
|
||||
<Polish>Atropina. Stosowana jako lek rozkurczowy i środek rozszerzający źrenice. Środek stosowany w przypadku zagrożeń NBC.</Polish>
|
||||
</Key>
|
||||
<Key ID="STR_ACE_MEDICAL_EPINEPHRINE_DISPLAY">
|
||||
<Original>Epinephrine auto-injector</Original>
|
||||
<English>Epinephrine auto-injector</English>
|
||||
<Russian>Адреналин в автоматическом шприце</Russian>
|
||||
<Spanish>Epinefrina auto-inyectable</Spanish>
|
||||
<French>Auto-injecteur d'épinéphrine</French>
|
||||
<Polish>Autostrzykawka EpiPen</Polish>
|
||||
</Key>
|
||||
<Key ID="STR_ACE_MEDICAL_EPINEPHRINE_DESC_SHORT">
|
||||
<Original>Increase heart rate and counter effects given by allergic reactions</Original>
|
||||
<English>Increase heart rate and counter effects given by allergic reactions</English>
|
||||
<Russian>Стимулирует работу сердца и купирует аллергические реакции.</Russian>
|
||||
<Spanish>Aumenta la frecuencia cardiaca y contraresta los efectos de las reacciones alérgicas</Spanish>
|
||||
<French>Augmente la Fréquance cadiaque et contré les effet d'une reaction Anaphylactique</French>
|
||||
<Polish>Adrenalina. Zwiększa puls i przeciwdziała efektom wywołanym przez reakcje alergiczne</Polish>
|
||||
</Key>
|
||||
<Key ID="STR_ACE_MEDICAL_EPINEPHRINE_DESC_USE">
|
||||
<Original>A drug that works on a sympathetic response to dilate the bronchi, increase heart rate and counter such effects given by allergic reactions (anaphylaxis). Used in sudden cardiac arrest scenarios with decreasing positive outcomes.</Original>
|
||||
<English>A drug that works on a sympathetic response to dilate the bronchi, increase heart rate and counter such effects given by allergic reactions (anaphylaxis). Used in sudden cardiac arrest scenarios with decreasing positive outcomes.</English>
|
||||
<Russian>Препарат, вызывающий симпатическую реакцию, приводящую к расширению бронхов, увеличению частоты сердечных сокращений и купированию аллергических реакций (анафилактического шока). Применяется при остановке сердца с уменьшением вероятности благоприятного исхода.</Russian>
|
||||
<Spanish>Medicamento que dilata los bronquios, aumenta la frecuencia cardiaca y contrarresta los efectos de las reacciones alérgicas (anafilaxis). Se utiliza en caso de paros cardiacos repentinos.</Spanish>
|
||||
<French>Un medicament qui fonctione sur le systeme sympatique créan une dilatation des bronches, augmente la fréquance cardiaque et contre les effet d'une reaction alergique (anaphylaxie). Utiliser lors d'arret cardio-respiratoire pour augmenté les chances retrouver un ryhtme.</French>
|
||||
<Polish>EpiPen z adrenaliną ma działanie sympatykomimetyczne, tj. pobudza receptory alfa- i beta-adrenergiczne. Pobudzenie układu współczulnego prowadzi do zwiększenia częstotliwości pracy serca, zwiększenia pojemności wyrzutowej serca i przyśpieszenia krążenia wieńcowego. Pobudzenie oskrzelowych receptorów beta-adrenergicznych wywołuje rozkurcz mięśni gładkich oskrzeli, co w efekcie zmniejsza towarzyszące oddychaniu świsty i duszności.</Polish>
|
||||
</Key>
|
||||
<Key ID="STR_ACE_MEDICAL_PLASMA_IV">
|
||||
<Original>Plasma IV (1000ml)</Original>
|
||||
<English>Plasma IV (1000ml)</English>
|
||||
<Russian>Плазма для в/в вливания (1000 мл)</Russian>
|
||||
<Spanish>Plasma Intravenoso (1000ml)</Spanish>
|
||||
<French>Plasma Sanguin IV (1000ml)</French>
|
||||
<Polish>Osocze IV (1000ml)</Polish>
|
||||
</Key>
|
||||
<Key ID="STR_ACE_MEDICAL_PLASMA_IV_DESC_SHORT">
|
||||
<Original>A volume-expanding blood supplement.</Original>
|
||||
<English>A volume-expanding blood supplement.</English>
|
||||
<Russian>Дополнительный препарат, применяемый при возмещении объема крови.</Russian>
|
||||
<Spanish>Suplemento para expandir el volumen sanguíneo.</Spanish>
|
||||
<French>Supplement visant a remplacer les volume sanguin</French>
|
||||
<Polish>Składnik krwi, używany do zwiększenia jej objętości.</Polish>
|
||||
</Key>
|
||||
<Key ID="STR_ACE_MEDICAL_PLASMA_IV_DESC_USE">
|
||||
<Original>A volume-expanding blood supplement.</Original>
|
||||
<English>A volume-expanding blood supplement.</English>
|
||||
<Russian>Дополнительный препарат, применяемый при возмещении объема крови.</Russian>
|
||||
<Spanish>Suplemento para expandir el volumen sanguíneo.</Spanish>
|
||||
<French>Supplement visant a remplacer le volume sanguin et remplace les plaquettes.</French>
|
||||
<Polish>Składnik krwi, używany do zwiększenia jej objętości.</Polish>
|
||||
</Key>
|
||||
<Key ID="STR_ACE_MEDICAL_PLASMA_IV_500">
|
||||
<Original>Plasma IV (500ml)</Original>
|
||||
<English>Plasma IV (500ml)</English>
|
||||
<Russian>Плазма для в/в вливания (500 мл)</Russian>
|
||||
<Spanish>Plasma Intravenoso (500ml)</Spanish>
|
||||
<French>Plasma Sanguin IV (500ml)</French>
|
||||
<Polish>Osocze IV (500ml)</Polish>
|
||||
</Key>
|
||||
<Key ID="STR_ACE_MEDICAL_PLASMA_IV_250">
|
||||
<Original>Plasma IV (250ml)</Original>
|
||||
<English>Plasma IV (250ml)</English>
|
||||
<Russian>Плазма для в/в вливания (250 мл)</Russian>
|
||||
<Spanish>Plasma Intravenoso (250ml)</Spanish>
|
||||
<French>Plasma Sanguin (250ml)</French>
|
||||
<Polish>Osocze IV (250ml)</Polish>
|
||||
</Key>
|
||||
<Key ID="STR_ACE_MEDICAL_BLOOD_IV">
|
||||
<Original>Blood IV (1000ml)</Original>
|
||||
<English>Blood IV (1000ml)</English>
|
||||
<Russian>Кровь для переливания (1000 мл)</Russian>
|
||||
<Spanish>Sangre Intravenosa (1000ml)</Spanish>
|
||||
<French>Cullot Sanguin IV (1000ml)</French>
|
||||
<Polish>Krew IV (1000ml)</Polish>
|
||||
</Key>
|
||||
<Key ID="STR_ACE_MEDICAL_BLOOD_IV_DESC_SHORT">
|
||||
<Original>Blood IV, for restoring a patients blood (keep cold)</Original>
|
||||
<English>Blood IV, for restoring a patients blood (keep cold)</English>
|
||||
<Russian>Пакет крови для возмещения объема потерянной крови (хранить в холодильнике)</Russian>
|
||||
<Spanish>Sangre Intravenosa, para restarurar el volumen sanguíneo (mantener frío)</Spanish>
|
||||
<French>Cullot Sanguin IV, pour remplacer le volume sanguin (garder Réfrigeré)</French>
|
||||
<Polish>Krew IV, używana do uzupełnienia krwi u pacjenta, trzymać w warunkach chłodniczych</Polish>
|
||||
</Key>
|
||||
<Key ID="STR_ACE_MEDICAL_BLOOD_IV_DESC_USE">
|
||||
<Original>O Negative infusion blood used in strict and rare events to replenish blood supply usually conducted in the transport phase of medical care.</Original>
|
||||
<English>O Negative infusion blood used in strict and rare events to replenish blood supply usually conducted in the transport phase of medical care.</English>
|
||||
<Russian>Кровь I группы, резус-отрицательная, применяется по жизненным показаниям для возмещения объема потерянной крови на догоспитальном этапе оказания медицинской помощи.</Russian>
|
||||
<French>Cullot Sanguin O- ,utiliser seulement lors de perte sanguine majeur afin de remplacer le volume sanguin perdu. Habituelment utiliser lors du transport ou dans un etablisement de soin. </French>
|
||||
<Polish>Krew 0 Rh-, używana w rzadkich i szczególnych przypadkach do uzupełnienia krwi u pacjenta, zazwyczaj w trakcie fazie transportu rannej osoby do szpitala.</Polish>
|
||||
<Spanish>Utilice sólo durante gran pérdida de sangre para reemplazar el volumen de sangre perdido. Uso habitual durante el transporte de heridos.</Spanish>
|
||||
</Key>
|
||||
<Key ID="STR_ACE_MEDICAL_BLOOD_IV_500">
|
||||
<Original>Blood IV (500ml)</Original>
|
||||
<English>Blood IV (500ml)</English>
|
||||
<Russian>Кровь для переливания (500 мл)</Russian>
|
||||
<Spanish>Sangre Intravenosa (500ml)</Spanish>
|
||||
<French>Cullot Sanguin IV (500ml)</French>
|
||||
<Polish>Krew IV (500ml)</Polish>
|
||||
</Key>
|
||||
<Key ID="STR_ACE_MEDICAL_BLOOD_IV_250">
|
||||
<Original>Blood IV (250ml)</Original>
|
||||
<English>Blood IV (250ml)</English>
|
||||
<Russian>Кровь для переливания (250 мл)</Russian>
|
||||
<Spanish>Sangre Intravenosa (250ml)</Spanish>
|
||||
<French>Cullot Sanguin IV (250ml)</French>
|
||||
<Polish>Krew IV (250ml)</Polish>
|
||||
</Key>
|
||||
<Key ID="STR_ACE_MEDICAL_SALINE_IV">
|
||||
<Original>Saline IV (1000ml)</Original>
|
||||
<English>Saline IV (1000ml)</English>
|
||||
<Russian>Физраствор для в/в вливания (1000 мл)</Russian>
|
||||
<Spanish>Solución Salina Intravenosa (1000ml)</Spanish>
|
||||
<French>solution Saline 0.9% IV (1000ml)</French>
|
||||
<Polish>Solanka 0,9% IV (1000ml)</Polish>
|
||||
</Key>
|
||||
<Key ID="STR_ACE_MEDICAL_SALINE_IV_DESC_SHORT">
|
||||
<Original>Saline IV, for restoring a patients blood</Original>
|
||||
<English>Saline IV, for restoring a patients blood</English>
|
||||
<Russian>Пакет физраствора для возмещения объема потерянной крови</Russian>
|
||||
<Spanish>Solución Salina Intravenosa, para restaurar el volumen sanguíneo</Spanish>
|
||||
<French>Solution Saline 0.9% IV, pour retablir temporairement la tention arteriel</French>
|
||||
<Polish>Solanka 0,9%, podawana dożylnie (IV), używana w celu uzupełnienia krwi u pacjenta</Polish>
|
||||
</Key>
|
||||
<Key ID="STR_ACE_MEDICAL_SALINE_IV_DESC_USE">
|
||||
<Original>A medical volume-replenishing agent introduced into the blood system through an IV infusion.</Original>
|
||||
<English>A medical volume-replenishing agent introduced into the blood system through an IV infusion.</English>
|
||||
<Russian>Пакет физиологического раствора для возмещения объема потерянной крови путем внутривенного вливания.</Russian>
|
||||
<Spanish>Suero fisiológico inoculado al torrente sanguíneo de forma intravenosa.</Spanish>
|
||||
<French> Un remplacment temporaire pour rétablir la tention artériel lors de perte sanguine, étant ajouter par intraveineuse</French>
|
||||
<Polish>Używany w medycynie w formie płynu infuzyjnego jako środek nawadniający i uzupełniający niedobór elektrolitów, podawany dożylnie (IV).</Polish>
|
||||
</Key>
|
||||
<Key ID="STR_ACE_MEDICAL_SALINE_IV_500">
|
||||
<Original>Saline IV (500ml)</Original>
|
||||
<English>Saline IV (500ml)</English>
|
||||
<Russian>Физраствор для в/в вливания (500 мл)</Russian>
|
||||
<Spanish>Solución Salina Intravenosa (500ml)</Spanish>
|
||||
<French>Solution Saline 0.9% IV (500ml)</French>
|
||||
<Polish>Solanka 0,9% IV (500ml)</Polish>
|
||||
</Key>
|
||||
<Key ID="STR_ACE_MEDICAL_SALINE_IV_250">
|
||||
<Original>Saline IV (250ml)</Original>
|
||||
<English>Saline IV (250ml)</English>
|
||||
<Russian>Физраствор для в/в вливания (250 мл)</Russian>
|
||||
<Spanish>Solución Salina Intravenosa (250ml)</Spanish>
|
||||
<French>Solution Saline 0.9% IV (250ml)</French>
|
||||
<Polish>Solanka 0,9% IV (250ml)</Polish>
|
||||
</Key>
|
||||
<Key ID="STR_ACE_MEDICAL_QUIKCLOT_DISPLAY">
|
||||
<Original>Basic Field Dressing (QuikClot)</Original>
|
||||
<English>Basic Field Dressing (QuikClot)</English>
|
||||
<Russian>Первичный перевязочный пакет (QuikClot)</Russian>
|
||||
<Spanish>Vendaje Básico (Coagulante)</Spanish>
|
||||
<French>Bandage Regulier (Coagulant)</French>
|
||||
<Polish>Opatrunek QuikClot</Polish>
|
||||
</Key>
|
||||
<Key ID="STR_ACE_MEDICAL_QUIKCLOT_DESC_SHORT">
|
||||
<Original>QuikClot bandage</Original>
|
||||
<English>QuikClot bandage</English>
|
||||
<Russian>Гемостатический пакет QuikClot</Russian>
|
||||
<Spanish>Venda Coagulante</Spanish>
|
||||
<French>Bandage coagulant</French>
|
||||
<Polish>Podstawowy opatrunek stosowany na rany</Polish>
|
||||
</Key>
|
||||
<Key ID="STR_ACE_MEDICAL_QUIKCLOT_DESC_USE">
|
||||
<Original></Original>
|
||||
<English></English>
|
||||
<Russian></Russian>
|
||||
<French>Un bandage servant a coaguler les seignements mineur à moyen.</French>
|
||||
<Polish>Proszkowy opatrunek adsorbcyjny przeznaczony do tamowania zagrażających życiu krwawień średniej i dużej intensywności.</Polish>
|
||||
<Spanish>Vendaje Hemostático con coagulante que detiene el sangrado.</Spanish>
|
||||
</Key>
|
||||
<Key ID="STR_ACE_MEDICAL_AID_KIT_DISPLAY">
|
||||
<Original>Personal Aid Kit</Original>
|
||||
<English>Personal Aid Kit</English>
|
||||
<Russian>Аптечка</Russian>
|
||||
<Spanish>Kit de Soporte Vital Avanzado</Spanish>
|
||||
<French>Équipement de support Vitale</French>
|
||||
<Polish>Apteczka osobista</Polish>
|
||||
</Key>
|
||||
<Key ID="STR_ACE_MEDICAL_AID_KIT_DESC_SHORT">
|
||||
<Original>Includes various treatment kit needed for stitching or advanced treatment</Original>
|
||||
<English>Includes various treatment kit needed for stitching or advanced treatment</English>
|
||||
<Russian>Содержит различные материалы и инструменты для зашивания ран и оказания специальной медпомощи.</Russian>
|
||||
<Spanish>Incluye material médico para tratamientos avanzados</Spanish>
|
||||
<French>Inclue du matériel medical pour les traitement avancé, tel les point de suture.</French>
|
||||
<Polish>Zestaw środków medycznych do opatrywania ran i dodatkowego leczenia po-urazowego</Polish>
|
||||
</Key>
|
||||
<Key ID="STR_ACE_MEDICAL_AID_KIT_DESC_USE">
|
||||
<Original></Original>
|
||||
<English></English>
|
||||
<Russian></Russian>
|
||||
<French></French>
|
||||
<Spanish></Spanish>
|
||||
</Key>
|
||||
<Key ID="STR_ACE_MEDICAL_SURGICALKIT_DISPLAY">
|
||||
<Original>Surgical Kit</Original>
|
||||
<English>Surgical Kit</English>
|
||||
<Russian>Хирургический набор</Russian>
|
||||
<Spanish>Kit Quirúrgico</Spanish>
|
||||
</Key>
|
||||
<Key ID="STR_ACE_MEDICAL_SURGICALKIT_DESC_SHORT">
|
||||
<Original>Surgical Kit for in field advanced medical treatment</Original>
|
||||
<English>Surgical Kit for in field advanced medical treatment</English>
|
||||
<Russian>Набор для хирургической помощи в полевых условиях</Russian>
|
||||
<Spanish>Kit Quirúrgico para el tratamiento avanzado en el campo de batalla</Spanish>
|
||||
</Key>
|
||||
<Key ID="STR_ACE_MEDICAL_SURGICALKIT_DESC_USE">
|
||||
<Original>Surgical Kit for in field advanced medical treatment</Original>
|
||||
<English>Surgical Kit for in field advanced medical treatment</English>
|
||||
<Russian>Набор для хирургической помощи в полевых условиях</Russian>
|
||||
<Spanish>Kit Quirúrgico para el tratamiento avanzado en el campo de batalla</Spanish>
|
||||
</Key>
|
||||
<Key ID="STR_ACE_MEDICAL_BODYBAG_DISPLAY">
|
||||
<Original>Bodybag</Original>
|
||||
<English>Bodybag</English>
|
||||
<Russian>Мешок для трупов</Russian>
|
||||
<Spanish>Bolsa para cadáveres</Spanish>
|
||||
</Key>
|
||||
<Key ID="STR_ACE_MEDICAL_BODYBAG_DESC_SHORT">
|
||||
<Original>A bodybag for dead bodies</Original>
|
||||
<English>A bodybag for dead bodies</English>
|
||||
<Russian>Мешок для упаковки трупов</Russian>
|
||||
<Spanish>Bolsa para cadáveres</Spanish>
|
||||
</Key>
|
||||
<Key ID="STR_ACE_MEDICAL_BODYBAG_DESC_USE">
|
||||
<Original>A bodybag for dead bodies</Original>
|
||||
<English>A bodybag for dead bodies</English>
|
||||
<Russian>Мешок для упаковки трупов</Russian>
|
||||
<Spanish>Bolsa para cadáveres</Spanish>
|
||||
</Key>
|
||||
</Container>
|
||||
<Container name="Actions">
|
||||
<Key ID="STR_ACE_MEDICAL_CHECK_BLOODPRESSURE">
|
||||
<Original>Blood Pressure</Original>
|
||||
<English>Blood Pressure</English>
|
||||
<Russian>Артериальное давление</Russian>
|
||||
<Spanish>Presión Arterial</Spanish>
|
||||
</Key>
|
||||
<Key ID="STR_ACE_MEDICAL_CHECK_BLOODPRESSURE_CONTENT">
|
||||
<Original>Checking Blood Pressure..</Original>
|
||||
<English>Checking Blood Pressure..</English>
|
||||
<Russian>Проверка артериального давления...</Russian>
|
||||
<Spanish>Comprobando Presión Arterial...</Spanish>
|
||||
</Key>
|
||||
<Key ID="STR_ACE_MEDICAL_CHECK_BLOODPRESSURE_CHECKED_MEDIC">
|
||||
<Original>You checked %1</Original>
|
||||
<English>You checked %1</English>
|
||||
<Russian>Вы осмотрели раненого %1</Russian>
|
||||
<Spanish>Examinando a %1</Spanish>
|
||||
</Key>
|
||||
<Key ID="STR_ACE_MEDICAL_CHECK_BLOODPRESSURE_OUTPUT_1">
|
||||
<Original>You find a blood pressure of %2/%3</Original>
|
||||
<English>You find a blood pressure of %2/%3</English>
|
||||
<Russian>Артериальное давление %2/%3</Russian>
|
||||
<Spanish>La Presión Arterial es %2/%3</Spanish>
|
||||
</Key>
|
||||
<Key ID="STR_ACE_MEDICAL_CHECK_BLOODPRESSURE_OUTPUT_2">
|
||||
<Original>You find a low blood pressure</Original>
|
||||
<English>You find a low blood pressure</English>
|
||||
<Russian>Давление низкое</Russian>
|
||||
<Spanish>La Presión Arterial es baja</Spanish>
|
||||
</Key>
|
||||
<Key ID="STR_ACE_MEDICAL_CHECK_BLOODPRESSURE_OUTPUT_3">
|
||||
<Original>You find a normal blood pressure</Original>
|
||||
<English>You find a normal blood pressure</English>
|
||||
<Russian>Давление нормальное</Russian>
|
||||
<Spanish>La Presión Arterial es normal</Spanish>
|
||||
</Key>
|
||||
<Key ID="STR_ACE_MEDICAL_CHECK_BLOODPRESSURE_OUTPUT_4">
|
||||
<Original>You find a high blood pressure</Original>
|
||||
<English>You find a high blood pressure</English>
|
||||
<Russian>Давление высокое</Russian>
|
||||
<Spanish>La Presión Arterial es alta</Spanish>
|
||||
</Key>
|
||||
<Key ID="STR_ACE_MEDICAL_CHECK_BLOODPRESSURE_OUTPUT_5">
|
||||
<Original>You find no blood pressure</Original>
|
||||
<English>You find no blood pressure</English>
|
||||
<Russian>Давления нет</Russian>
|
||||
<Spanish>No hay Presión Arterial</Spanish>
|
||||
</Key>
|
||||
<Key ID="STR_ACE_MEDICAL_CHECK_BLOODPRESSURE_OUTPUT_6">
|
||||
<Original>You fail to find a blood pressure</Original>
|
||||
<English>You fail to find a blood pressure</English>
|
||||
<Russian>Артериальное давление не определяется</Russian>
|
||||
<Spanish>No puedes encontrar Presión Arterial</Spanish>
|
||||
</Key>
|
||||
<Key ID="STR_ACE_MEDICAL_CHECK_PULSE">
|
||||
<Original>Pulse</Original>
|
||||
<English>Pulse</English>
|
||||
<Russian>Пульс</Russian>
|
||||
<Spanish>Pulso</Spanish>
|
||||
</Key>
|
||||
<Key ID="STR_ACE_MEDICAL_CHECK_PULSE_CONTENT">
|
||||
<Original>Checking Heart Rate..</Original>
|
||||
<English>Checking Heart Rate..</English>
|
||||
<Russian>Проверка пульса...</Russian>
|
||||
<Spanish>Comprobando Pulso...</Spanish>
|
||||
</Key>
|
||||
<Key ID="STR_ACE_MEDICAL_CHECK_PULSE_CHECKED_MEDIC">
|
||||
<Original>You checked %1</Original>
|
||||
<English>You checked %1</English>
|
||||
<Russian>Вы осмотрели раненого %1</Russian>
|
||||
<Spanish>Examinando a %1</Spanish>
|
||||
</Key>
|
||||
<Key ID="STR_ACE_MEDICAL_CHECK_PULSE_OUTPUT_1">
|
||||
<Original>You find a Heart Rate of %2</Original>
|
||||
<English>You find a Heart Rate of %2</English>
|
||||
<Russian>Пульс %2 уд./мин.</Russian>
|
||||
<Spanish>El Pulso es %2</Spanish>
|
||||
</Key>
|
||||
<Key ID="STR_ACE_MEDICAL_CHECK_PULSE_OUTPUT_2">
|
||||
<Original>You find a weak Heart Rate</Original>
|
||||
<English>You find a weak Heart Rate</English>
|
||||
<Russian>Пульс слабый</Russian>
|
||||
<Spanish>El Pulso es débil</Spanish>
|
||||
</Key>
|
||||
<Key ID="STR_ACE_MEDICAL_CHECK_PULSE_OUTPUT_3">
|
||||
<Original>You find a strong Heart Rate</Original>
|
||||
<English>You find a strong Heart Rate</English>
|
||||
<Russian>Пульс учащенный</Russian>
|
||||
<Spanish>El Pulso está acelerado</Spanish>
|
||||
</Key>
|
||||
<Key ID="STR_ACE_MEDICAL_CHECK_PULSE_OUTPUT_4">
|
||||
<Original>You find a normal Heart Rate</Original>
|
||||
<English>You find a normal Heart Rate</English>
|
||||
<Russian>Пульс в норме</Russian>
|
||||
<Spanish>El Pulso es bueno</Spanish>
|
||||
</Key>
|
||||
<Key ID="STR_ACE_MEDICAL_CHECK_PULSE_OUTPUT_5">
|
||||
<Original>You find no Heart Rate</Original>
|
||||
<English>You find no Heart Rate</English>
|
||||
<Russian>Пульс не прощупывается</Russian>
|
||||
<Spanish>No tiene Pulso</Spanish>
|
||||
</Key>
|
||||
<Key ID="STR_ACE_MEDICAL_CHECK_RESPONSE">
|
||||
<Original>Response</Original>
|
||||
<English>Response</English>
|
||||
<Russian>Реакция</Russian>
|
||||
<Spanish>Reacciona</Spanish>
|
||||
</Key>
|
||||
<Key ID="STR_ACE_MEDICAL_CHECK_RESPONSE_CONTENT">
|
||||
<Original>You check response of patient</Original>
|
||||
<English>You check response of patient</English>
|
||||
<Russian>Вы проверяете реакцию раненого</Russian>
|
||||
<Spanish>Compruebas si el paciente reacciona</Spanish>
|
||||
</Key>
|
||||
<Key ID="STR_ACE_MEDICAL_CHECK_REPONSE_RESPONSIVE">
|
||||
<Original>%1 is responsive</Original>
|
||||
<English>%1 is responsive</English>
|
||||
<Russian>%1 реагирует на раздражители</Russian>
|
||||
<Spanish>%1 ha reaccionado</Spanish>
|
||||
|
||||
</Key>
|
||||
<Key ID="STR_ACE_MEDICAL_CHECK_REPONSE_UNRESPONSIVE">
|
||||
<Original>%1 is not responsive</Original>
|
||||
<English>%1 is not responsive</English>
|
||||
<Russian>%1 не реагирует</Russian>
|
||||
<Spanish>%1 no reacciona</Spanish>
|
||||
</Key>
|
||||
<Key ID="STR_ACE_MEDICAL_CHECK_REPONSE_YOU_CHECKED">
|
||||
<Original>You checked %1</Original>
|
||||
<English>You checked %1</English>
|
||||
<Russian>Вы осмотрели раненого %1</Russian>
|
||||
<Spanish>Examinas a %1</Spanish>
|
||||
</Key>
|
||||
<Key ID="STR_ACE_MEDICAL_BANDAGING">
|
||||
<Original>Bandaging</Original>
|
||||
<English>Bandaging</English>
|
||||
<Russian>Перевязка...</Russian>
|
||||
<Spanish>Vendando</Spanish>
|
||||
</Key>
|
||||
<Key ID="STR_ACE_MEDICAL_BANDAGED">
|
||||
<Original>Bandaged</Original>
|
||||
<English>Bandaged</English>
|
||||
<Russian>Повязка наложена</Russian>
|
||||
<Spanish>Vendado</Spanish>
|
||||
</Key>
|
||||
<Key ID="STR_ACE_MEDICAL_APPLY_BANDAGE">
|
||||
<Original>You bandage %1 (%2)</Original>
|
||||
<English>You bandage %1 (%2)</English>
|
||||
<Russian>Вы перевязали раненого %1 (%2)</Russian>
|
||||
<Spanish>Aplicas vendaje a %1 en %2</Spanish>
|
||||
</Key>
|
||||
<Key ID="STR_ACE_MEDICAL_IS_BANDAGING_YOU">
|
||||
<Original>%1 is bandaging you</Original>
|
||||
<English>%1 is bandaging you</English>
|
||||
<Russian>%1 перевязывает вас</Russian>
|
||||
<Spanish>%1 te está vendando</Spanish>
|
||||
</Key>
|
||||
<Key ID="STR_ACE_MEDICAL_START_STITCHING_INJURIES">
|
||||
<Original>You start stitching injures from %1 (%2)</Original>
|
||||
<English>You start stitching injures from %1 (%2)</English>
|
||||
<Russian>Вы зашиваете ранения от %1 (%2)</Russian>
|
||||
<Spanish>Estás suturando heridas de %1 en %2</Spanish>
|
||||
</Key>
|
||||
<Key ID="STR_ACE_MEDICAL_STITCHING">
|
||||
<Original>Stitching</Original>
|
||||
<English>Stitching</English>
|
||||
<Russian>Наложение швов</Russian>
|
||||
<Spanish>Suturando</Spanish>
|
||||
</Key>
|
||||
<Key ID="STR_ACE_MEDICAL_YOU_TREAT_AIRWAY">
|
||||
<Original>You treat the airway of %1</Original>
|
||||
<English>You treat the airway of %1</English>
|
||||
<Russian>Вы интубируете раненого %1</Russian>
|
||||
<Spanish>Estás intubando a %1</Spanish>
|
||||
</Key>
|
||||
<Key ID="STR_ACE_MEDICAL_AIRWAY">
|
||||
<Original>Airway</Original>
|
||||
<English>Airway</English>
|
||||
<Russian>Дыхательные пути</Russian>
|
||||
<Spanish>Vías Aéreas</Spanish>
|
||||
</Key>
|
||||
<Key ID="STR_ACE_MEDICAL_IS_TREATING_YOUR_AIRWAY">
|
||||
<Original>%1 is treating your airway</Original>
|
||||
<English>%1 is treating your airway</English>
|
||||
<Russian>%1 проводит вам интубацию</Russian>
|
||||
<Spanish>%1 te está intubando</Spanish>
|
||||
</Key>
|
||||
</Container>
|
||||
|
||||
</Package>
|
||||
</Project>
|
||||
</Project>
|
||||
|
@ -31,6 +31,10 @@ if (count _this > 1) then {
|
||||
};
|
||||
};
|
||||
|
||||
_unit playActionNow "Gear";
|
||||
if (_unit == _target) then {
|
||||
_unit playActionNow "Gear";
|
||||
} else {
|
||||
_unit playActionNow "PutDown";
|
||||
};
|
||||
|
||||
[FUNC(displayAmmo), [_target], 1, 0.1] call EFUNC(common,waitAndExecute);
|
||||
|
@ -3,3 +3,15 @@ class Extended_PreInit_EventHandlers {
|
||||
init = QUOTE(call COMPILE_FILE(XEH_preInit));
|
||||
};
|
||||
};
|
||||
class Extended_PostInit_EventHandlers {
|
||||
class ADDON {
|
||||
init = QUOTE(call COMPILE_FILE(XEH_postInit));
|
||||
};
|
||||
};
|
||||
class Extended_InventoryOpened_EventHandlers {
|
||||
class CAManBase {
|
||||
class ADDON {
|
||||
clientInventoryOpened = QUOTE(_this call FUNC(onOpenInventory););
|
||||
};
|
||||
};
|
||||
};
|
||||
|
@ -1,9 +1,10 @@
|
||||
class CfgMagazines {
|
||||
class CA_Magazine;
|
||||
class ACE_key_customKeyMagazine: CA_Magazine {
|
||||
picture = QUOTE(PATHTOF(ui\keyBlack.paa));
|
||||
displayName = "ACE Vehicle Key"; //!!!CANNONT be localized!!!, because it is used as part of the magazineDetail string
|
||||
descriptionShort = "$STR_ACE_Vehicle_Item_Custom_Description";
|
||||
count = 1;
|
||||
};
|
||||
class CA_Magazine;
|
||||
class ACE_key_customKeyMagazine: CA_Magazine {
|
||||
picture = QUOTE(PATHTOF(ui\keyBlack.paa));
|
||||
displayName = "ACE Vehicle Key"; //!!!CANNOT be localized!!!: because it is used as part of the magazineDetail string
|
||||
descriptionShort = "$STR_ACE_Vehicle_Item_Custom_Description";
|
||||
count = 1;
|
||||
mass = 0;
|
||||
};
|
||||
};
|
||||
|
@ -1,102 +1,107 @@
|
||||
#define MACRO_LOCK_ACTIONS \
|
||||
class ACE_MainActions { \
|
||||
class ACE_unlockVehicle { \
|
||||
displayName = "$STR_ACE_Vehicle_Action_UnLock"; \
|
||||
distance = 4; \
|
||||
condition = QUOTE(([ARR_2(_player, _target)] call FUNC(hasKeyForVehicle)) && {(locked _target) in [ARR_2(2,3)]}); \
|
||||
statement = QUOTE([ARR_3('SetVehicleLock', [_target], [ARR_2(_target,false)])] call EFUNC(common,targetEvent)); \
|
||||
showDisabled = 0; \
|
||||
priority = 0.3; \
|
||||
icon = QUOTE(PATHTOF(ui\key_menuIcon_ca.paa)); \
|
||||
}; \
|
||||
class ACE_lockVehicle { \
|
||||
displayName = "$STR_ACE_Vehicle_Action_Lock"; \
|
||||
distance = 4; \
|
||||
condition = QUOTE(([ARR_2(_player, _target)] call FUNC(hasKeyForVehicle)) && {(locked _target) in [ARR_2(0,1)]}); \
|
||||
statement = QUOTE([ARR_3('SetVehicleLock', [_target], [ARR_2(_target,true)])] call EFUNC(common,targetEvent)); \
|
||||
showDisabled = 0; \
|
||||
priority = 0.2; \
|
||||
icon = QUOTE(PATHTOF(ui\key_menuIcon_ca.paa)); \
|
||||
}; \
|
||||
class ACE_lockpickVehicle { \
|
||||
displayName = "$STR_ACE_Vehicle_Action_Lockpick"; \
|
||||
distance = 4; \
|
||||
condition = QUOTE([ARR_3(_player, _target, 'canLockpick')] call FUNC(lockpick)); \
|
||||
statement = QUOTE([ARR_3(_player, _target, 'startLockpick')] call FUNC(lockpick)); \
|
||||
showDisabled = 0; \
|
||||
priority = 0.1; \
|
||||
}; \
|
||||
};
|
||||
class ACE_MainActions { \
|
||||
class ACE_unlockVehicle { \
|
||||
displayName = "$STR_ACE_Vehicle_Action_UnLock"; \
|
||||
distance = 4; \
|
||||
condition = QUOTE(([ARR_2(_player, _target)] call FUNC(hasKeyForVehicle)) && {(locked _target) in [ARR_2(2,3)]}); \
|
||||
statement = QUOTE([ARR_3('VehicleLock_SetVehicleLock', [_target], [ARR_2(_target,false)])] call EFUNC(common,targetEvent)); \
|
||||
showDisabled = 0; \
|
||||
priority = 0.3; \
|
||||
icon = QUOTE(PATHTOF(ui\key_menuIcon_ca.paa)); \
|
||||
}; \
|
||||
class ACE_lockVehicle { \
|
||||
displayName = "$STR_ACE_Vehicle_Action_Lock"; \
|
||||
distance = 4; \
|
||||
condition = QUOTE(([ARR_2(_player, _target)] call FUNC(hasKeyForVehicle)) && {(locked _target) in [ARR_2(0,1)]}); \
|
||||
statement = QUOTE([ARR_3('VehicleLock_SetVehicleLock', [_target], [ARR_2(_target,true)])] call EFUNC(common,targetEvent)); \
|
||||
showDisabled = 0; \
|
||||
priority = 0.2; \
|
||||
icon = QUOTE(PATHTOF(ui\key_menuIcon_ca.paa)); \
|
||||
}; \
|
||||
class ACE_lockpickVehicle { \
|
||||
displayName = "$STR_ACE_Vehicle_Action_Lockpick"; \
|
||||
distance = 4; \
|
||||
condition = QUOTE([ARR_3(_player, _target, 'canLockpick')] call FUNC(lockpick)); \
|
||||
statement = QUOTE([ARR_3(_player, _target, 'startLockpick')] call FUNC(lockpick)); \
|
||||
showDisabled = 0; \
|
||||
priority = 0.1; \
|
||||
}; \
|
||||
};
|
||||
|
||||
class CfgVehicles {
|
||||
class LandVehicle;
|
||||
class Car: LandVehicle {
|
||||
class ACE_Actions {
|
||||
MACRO_LOCK_ACTIONS
|
||||
};
|
||||
};
|
||||
class Tank: LandVehicle {
|
||||
class ACE_Actions {
|
||||
MACRO_LOCK_ACTIONS
|
||||
};
|
||||
};
|
||||
class Air;
|
||||
class Helicopter: Air {
|
||||
class ACE_Actions {
|
||||
MACRO_LOCK_ACTIONS
|
||||
};
|
||||
};
|
||||
|
||||
class Logic;
|
||||
class Module_F: Logic {
|
||||
class ArgumentsBaseUnits {};
|
||||
class ModuleDescription {};
|
||||
};
|
||||
class ACE_VehicleLock_ModuleSetup: Module_F {
|
||||
author = "$STR_ACE_Common_ACETeam";
|
||||
category = "ACE";
|
||||
displayName = "Vehicle Lock Setup";
|
||||
function = "ACE_VehicleLock_fnc_moduleInit";
|
||||
scope = 2;
|
||||
isGlobal = 1;
|
||||
icon = QUOTE(PATHTOF(ui\IconLock_ca.paa));
|
||||
functionPriority = 0;
|
||||
class Arguments {
|
||||
class SetLockState {
|
||||
displayName = "Set Lock State"; // Argument label
|
||||
description = "Set lock state for all vehicles on map at start"; // Tooltip description
|
||||
typeName = "NUMBER"; // Value type, can be "NUMBER", "STRING" or "BOOL"
|
||||
class values {
|
||||
class None {name = "As Is"; value = 0; default = 1;};
|
||||
class Side {name = "Locked"; value = 1;};
|
||||
class Unique {name = "Unlocked"; value = 2;};
|
||||
class LandVehicle;
|
||||
class Car: LandVehicle {
|
||||
class ACE_Actions {
|
||||
MACRO_LOCK_ACTIONS
|
||||
};
|
||||
};
|
||||
class LockpickStrength {
|
||||
displayName = "Global Lockpick Strength";
|
||||
description = "Global Time to lockpick (in seconds). Default: 10";
|
||||
typeName = "NUMBER"; // Value type, can be "NUMBER", "STRING" or "BOOL"
|
||||
defaultValue = "10"; // Default text filled in the input box
|
||||
};
|
||||
};
|
||||
class ModuleDescription: ModuleDescription {
|
||||
description = "Settings for lockpick strength and initial vehicle lock state. Removes ambiguous lock states.<br/>Source: vehiclelock.pbo";
|
||||
class Tank: LandVehicle {
|
||||
class ACE_Actions {
|
||||
MACRO_LOCK_ACTIONS
|
||||
};
|
||||
};
|
||||
class Air;
|
||||
class Helicopter: Air {
|
||||
class ACE_Actions {
|
||||
MACRO_LOCK_ACTIONS
|
||||
};
|
||||
};
|
||||
};
|
||||
|
||||
class ACE_VehicleLock_ModuleSyncedAssign: Module_F {
|
||||
author = "$STR_ACE_Common_ACETeam";
|
||||
category = "ACE";
|
||||
displayName = "Vehicle Key Assign";
|
||||
function = "ACE_VehicleLock_fnc_moduleSync";
|
||||
scope = 2;
|
||||
isGlobal = 1;
|
||||
icon = QUOTE(PATHTOF(ui\IconLock_ca.paa));
|
||||
functionPriority = 0;
|
||||
class Arguments {};
|
||||
class ModuleDescription: ModuleDescription {
|
||||
description = "Sync with vehicles and players. Will handout custom keys to players for every synced vehicle. Only valid for objects present at mission start.<br/>Source: vehiclelock.pbo";
|
||||
sync[] = {"AnyPlayer", "AnyVehicle"};
|
||||
class Logic;
|
||||
class Module_F: Logic {
|
||||
class ModuleDescription {};
|
||||
};
|
||||
class ACE_VehicleLock_ModuleSetup: Module_F {
|
||||
author = "$STR_ACE_Common_ACETeam";
|
||||
category = "ACE";
|
||||
displayName = "Vehicle Lock Setup";
|
||||
function = QUOTE(DFUNC(moduleInit));
|
||||
scope = 2;
|
||||
isGlobal = 0;
|
||||
icon = QUOTE(PATHTOF(ui\IconLock_ca.paa));
|
||||
functionPriority = 0;
|
||||
class Arguments {
|
||||
class LockVehicleInventory {
|
||||
displayName = "Lock Vehicle Inventory";
|
||||
description = "Locks the inventory of locked vehicles";
|
||||
typeName = "BOOL";
|
||||
defaultValue = 0;
|
||||
};
|
||||
class SetLockState {
|
||||
displayName = "Set Lock State"; // Argument label
|
||||
description = "Set lock state for all vehicles on map at start"; // Tooltip description
|
||||
typeName = "NUMBER"; // Value type, can be "NUMBER", "STRING" or "BOOL"
|
||||
class values {
|
||||
class None {name = "As Is"; value = 0; default = 1;};
|
||||
class Side {name = "Locked"; value = 1;};
|
||||
class Unique {name = "Unlocked"; value = 2;};
|
||||
};
|
||||
};
|
||||
class DefaultLockpickStrength {
|
||||
displayName = "Default Lockpick Strength";
|
||||
description = "Default Time to lockpick (in seconds). Default: 10";
|
||||
typeName = "NUMBER"; // Value type, can be "NUMBER", "STRING" or "BOOL"
|
||||
defaultValue = "10"; // Default text filled in the input box
|
||||
};
|
||||
};
|
||||
class ModuleDescription: ModuleDescription {
|
||||
description = "Settings for lockpick strength and initial vehicle lock state. Removes ambiguous lock states.<br/>Source: vehiclelock.pbo";
|
||||
};
|
||||
};
|
||||
|
||||
class ACE_VehicleLock_ModuleSyncedAssign: Module_F {
|
||||
author = "$STR_ACE_Common_ACETeam";
|
||||
category = "ACE";
|
||||
displayName = "Vehicle Key Assign";
|
||||
function = QUOTE(DFUNC(moduleSync));
|
||||
scope = 2;
|
||||
isGlobal = 0;
|
||||
icon = QUOTE(PATHTOF(ui\IconLock_ca.paa));
|
||||
functionPriority = 0;
|
||||
class Arguments {};
|
||||
class ModuleDescription: ModuleDescription {
|
||||
description = "Sync with vehicles and players. Will handout custom keys to players for every synced vehicle. Only valid for objects present at mission start.<br/>Source: vehiclelock.pbo";
|
||||
sync[] = {"AnyPlayer", "AnyVehicle"};
|
||||
};
|
||||
};
|
||||
};
|
||||
};
|
||||
|
@ -1,41 +1,41 @@
|
||||
class CfgWeapons {
|
||||
class InventoryItem_Base_F;
|
||||
class ACE_ItemCore;
|
||||
class InventoryItem_Base_F;
|
||||
class ACE_ItemCore;
|
||||
|
||||
class ACE_key_master: ACE_ItemCore {
|
||||
author = "$STR_ACE_Common_ACETeam";
|
||||
displayName = "Vehicle Key: Master";
|
||||
descriptionShort = "$STR_ACE_Vehicle_Item_Master_Description";
|
||||
model = "\A3\weapons_F\ammo\mag_univ.p3d";
|
||||
picture = QUOTE(PATHTOF(ui\keyBlack.paa));
|
||||
scope = 2;
|
||||
class ItemInfo: InventoryItem_Base_F {
|
||||
mass = 0.1;
|
||||
};
|
||||
};
|
||||
class ACE_key_lockpick: ACE_key_master {
|
||||
displayName = "Lockpick";
|
||||
descriptionShort = "$STR_ACE_Vehicle_Item_Lockpick_Description";
|
||||
picture = QUOTE(PATHTOF(ui\lockpick.paa));
|
||||
};
|
||||
class ACE_key_west: ACE_key_master {
|
||||
displayName = "Vehicle Key: West";
|
||||
descriptionShort = "$STR_ACE_Vehicle_Item_West_Description";
|
||||
picture = QUOTE(PATHTOF(ui\keyBlue.paa));
|
||||
};
|
||||
class ACE_key_east: ACE_key_master {
|
||||
displayName = "Vehicle Key: East";
|
||||
descriptionShort = "$STR_ACE_Vehicle_Item_East_Description";
|
||||
picture = QUOTE(PATHTOF(ui\keyRed.paa));
|
||||
};
|
||||
class ACE_key_indp: ACE_key_master {
|
||||
displayName = "Vehicle Key: Independent";
|
||||
descriptionShort = "$STR_ACE_Vehicle_Item_Indp_Description";
|
||||
picture = QUOTE(PATHTOF(ui\keyPurple.paa));
|
||||
};
|
||||
class ACE_key_civ: ACE_key_master {
|
||||
displayName = "Vehicle Key: Civilian";
|
||||
descriptionShort = "$STR_ACE_Vehicle_Item_Civ_Description";
|
||||
picture = QUOTE(PATHTOF(ui\keyGreen.paa));
|
||||
};
|
||||
class ACE_key_master: ACE_ItemCore {
|
||||
author = "$STR_ACE_Common_ACETeam";
|
||||
displayName = "Vehicle Key: Master";
|
||||
descriptionShort = "$STR_ACE_Vehicle_Item_Master_Description";
|
||||
model = "\A3\weapons_F\ammo\mag_univ.p3d";
|
||||
picture = QUOTE(PATHTOF(ui\keyBlack.paa));
|
||||
scope = 2;
|
||||
class ItemInfo: InventoryItem_Base_F {
|
||||
mass = 0;
|
||||
};
|
||||
};
|
||||
class ACE_key_lockpick: ACE_key_master {
|
||||
displayName = "Lockpick";
|
||||
descriptionShort = "$STR_ACE_Vehicle_Item_Lockpick_Description";
|
||||
picture = QUOTE(PATHTOF(ui\lockpick.paa));
|
||||
};
|
||||
class ACE_key_west: ACE_key_master {
|
||||
displayName = "Vehicle Key: West";
|
||||
descriptionShort = "$STR_ACE_Vehicle_Item_West_Description";
|
||||
picture = QUOTE(PATHTOF(ui\keyBlue.paa));
|
||||
};
|
||||
class ACE_key_east: ACE_key_master {
|
||||
displayName = "Vehicle Key: East";
|
||||
descriptionShort = "$STR_ACE_Vehicle_Item_East_Description";
|
||||
picture = QUOTE(PATHTOF(ui\keyRed.paa));
|
||||
};
|
||||
class ACE_key_indp: ACE_key_master {
|
||||
displayName = "Vehicle Key: Independent";
|
||||
descriptionShort = "$STR_ACE_Vehicle_Item_Indp_Description";
|
||||
picture = QUOTE(PATHTOF(ui\keyPurple.paa));
|
||||
};
|
||||
class ACE_key_civ: ACE_key_master {
|
||||
displayName = "Vehicle Key: Civilian";
|
||||
descriptionShort = "$STR_ACE_Vehicle_Item_Civ_Description";
|
||||
picture = QUOTE(PATHTOF(ui\keyGreen.paa));
|
||||
};
|
||||
};
|
||||
|
5
addons/vehiclelock/XEH_postInit.sqf
Normal file
5
addons/vehiclelock/XEH_postInit.sqf
Normal file
@ -0,0 +1,5 @@
|
||||
#include "script_component.hpp"
|
||||
|
||||
//Add Event Handlers
|
||||
["VehicleLock_SetupCustomKey", {_this call FUNC(serverSetupCustomKeyEH)}] call EFUNC(common,addEventHandler);
|
||||
["VehicleLock_SetVehicleLock", {_this call FUNC(setVehicleLockEH)}] call EFUNC(common,addEventHandler);
|
@ -8,11 +8,8 @@ PREP(hasKeyForVehicle);
|
||||
PREP(lockpick);
|
||||
PREP(moduleInit);
|
||||
PREP(moduleSync);
|
||||
PREP(onOpenInventory);
|
||||
PREP(serverSetupCustomKeyEH);
|
||||
PREP(setVehicleLockEH);
|
||||
|
||||
//Add Event Handlers
|
||||
["SetupCustomKey", {_this call FUNC(serverSetupCustomKeyEH)}] call EFUNC(common,addEventHandler);
|
||||
["SetVehicleLock", {_this call FUNC(setVehicleLockEH)}] call EFUNC(common,addEventHandler);
|
||||
|
||||
ADDON = true;
|
||||
|
@ -17,6 +17,10 @@ class ACE_Settings {
|
||||
value = 10;
|
||||
typeName = "SCALAR";
|
||||
};
|
||||
class GVAR(LockVehicleInventory) {
|
||||
value = 0;
|
||||
typeName = "BOOL";
|
||||
};
|
||||
};
|
||||
|
||||
#include "CfgEventHandlers.hpp"
|
||||
|
@ -1,45 +1,40 @@
|
||||
/*
|
||||
Name: ACE_VehicleLock_fnc_addKeyForVehicle
|
||||
|
||||
Author: Pabst Mirror
|
||||
|
||||
Description:
|
||||
Adds a key to a unit that will open a vehicle
|
||||
|
||||
Parameters:
|
||||
0: OBJECT - unit
|
||||
1: OBJECT - vehicle
|
||||
2: BOOL - custom key (true: custom key (magazine) - false: side key (item))
|
||||
|
||||
Returns:
|
||||
Nothing
|
||||
|
||||
Example:
|
||||
[bob, car1, true] call ACE_VehicleLock_fnc_addKeyForVehicle;
|
||||
*/
|
||||
|
||||
* Author: PabstMirror
|
||||
* Adds a key to a unit that will open a vehicle
|
||||
* Note: has global effects for Unit (will add items to remote unit)
|
||||
*
|
||||
* Arguments:
|
||||
* 0: Unit <OBJECT>
|
||||
* 1: Vehicle <OBJECT>
|
||||
* 2: custom key (true: custom key (magazine) - false: side key (item)) <BOOL>
|
||||
*
|
||||
* Return Value:
|
||||
* None
|
||||
*
|
||||
* Example:
|
||||
* [ACE_player, car, true] call ACE_VehicleLock_fnc_addKeyForVehicle
|
||||
*
|
||||
* Public: Yes
|
||||
*/
|
||||
#include "script_component.hpp"
|
||||
|
||||
private ["_unit","_veh","_useCustom","_previousMags","_newMags","_keyMagazine","_keyName"];
|
||||
private ["_previousMags","_newMags","_keyMagazine","_keyName"];
|
||||
|
||||
_unit = [_this, 0, objNull, [objNull]] call bis_fnc_param;
|
||||
_veh = [_this, 1, objNull, [objNull]] call bis_fnc_param;
|
||||
_useCustom = [_this, 2, false, [false]] call bis_fnc_param;
|
||||
PARAMS_3(_unit,_veh,_useCustom);
|
||||
|
||||
if (isNull _unit) exitWith {["addKeyForVehicleClient: null unit"] call BIS_fnc_error;};
|
||||
if (isNull _veh) exitWith {["addKeyForVehicleClient: null vehicle"] call BIS_fnc_error;};
|
||||
if (isNull _unit) exitWith {ERROR("null unit");};
|
||||
if (isNull _veh) exitWith {ERROR("null vehicle");};
|
||||
|
||||
if (_useCustom) then {
|
||||
_previousMags = magazinesDetail _unit;
|
||||
_unit addMagazine ["ACE_key_customKeyMagazine", 1];
|
||||
_newMags = (magazinesDetail _unit) - _previousMags;
|
||||
if ((count _newMags) == 0) exitWith {
|
||||
["ACE_VehicleLock_fnc_addKeyForVehicle: failed to add magazine (inventory full?)"] call BIS_fnc_error;
|
||||
};
|
||||
_keyMagazine = _newMags select 0;
|
||||
TRACE_2("setting up key on server",_veh,_keyMagazine);
|
||||
["SetupCustomKey", [_veh, _keyMagazine]] call EFUNC(common,serverEvent);
|
||||
_previousMags = magazinesDetail _unit;
|
||||
_unit addMagazine ["ACE_key_customKeyMagazine", 1]; //addMagazine array has global effects
|
||||
_newMags = (magazinesDetail _unit) - _previousMags;
|
||||
if ((count _newMags) == 0) exitWith {ERROR("failed to add magazine (inventory full?)");};
|
||||
_keyMagazine = _newMags select 0;
|
||||
TRACE_2("setting up key on server",_veh,_keyMagazine);
|
||||
//Have the server run add the key to the vehicle's key array:
|
||||
["VehicleLock_SetupCustomKey", [_veh, _keyMagazine]] call EFUNC(common,serverEvent);
|
||||
} else {
|
||||
_keyName = [_veh] call FUNC(getVehicleSideKey);
|
||||
_unit addItem _keyName;
|
||||
_keyName = [_veh] call FUNC(getVehicleSideKey);
|
||||
_unit addItem _keyName; //addItem has global effects
|
||||
};
|
||||
|
@ -1,27 +1,25 @@
|
||||
/*
|
||||
Name: ACE_VehicleLock_fnc_getVehicleSideKey
|
||||
|
||||
Author: Pabst Mirror
|
||||
|
||||
Description:
|
||||
Returns the side specifc key for a vehicle
|
||||
|
||||
Parameters:
|
||||
0: OBJECT - vehicle
|
||||
|
||||
Returns:
|
||||
STRING - Key Classname
|
||||
|
||||
Example:
|
||||
[tank1] call ACE_VehicleLock_fnc_getVehicleSideKey;
|
||||
*/
|
||||
|
||||
* Author: PabstMirror
|
||||
* Returns the side specifc key for a vehicle
|
||||
*
|
||||
* Arguments:
|
||||
* 0: Vehicle <OBJECT>
|
||||
*
|
||||
* Return Value:
|
||||
* The vehicle's side key classname <STRING>
|
||||
*
|
||||
* Example:
|
||||
* [tank1] call ACE_VehicleLock_fnc_getVehicleSideKey;
|
||||
*
|
||||
* Public: No
|
||||
*/
|
||||
#include "script_component.hpp"
|
||||
|
||||
private ["_veh","_vehConfigSide","_vehSide","_returnValue"];
|
||||
private ["_vehConfigSide","_vehSide","_returnValue"];
|
||||
|
||||
_veh = [_this, 0, objNull, [objNull]] call bis_fnc_param;
|
||||
if (isNull _veh) exitWith {["ACE_VehicleLock_fnc_getVehicleSideKey: null vehicle"] call BIS_fnc_error; ""};
|
||||
PARAMS_1(_veh);
|
||||
|
||||
if (isNull _veh) exitWith {ERROR("null vehicle"); "error"};
|
||||
|
||||
_vehConfigSide = [_veh, true] call BIS_fnc_objectSide;
|
||||
_vehSide = _veh getVariable [QGVAR(lockSide), _vehConfigSide];
|
||||
@ -32,7 +30,7 @@ switch (_vehSide) do {
|
||||
case (west): {_returnValue = "ACE_key_west"};
|
||||
case (east): {_returnValue = "ACE_key_east"};
|
||||
case (resistance): {_returnValue = "ACE_key_indp"};
|
||||
case (civilian): {_returnValue = "ACE_key_civ"};
|
||||
default {_returnValue = "ACE_key_civ"};
|
||||
};
|
||||
|
||||
_returnValue
|
||||
|
@ -1,31 +1,27 @@
|
||||
/*
|
||||
Name: ACE_VehicleLock_fnc_hasKeyForVehicle
|
||||
|
||||
Author: Pabst Mirror
|
||||
|
||||
Description:
|
||||
Returns if user has a valid key for the vehicle
|
||||
|
||||
Parameters:
|
||||
0: OBJECT - unit
|
||||
1: OBJECT - vehicle
|
||||
|
||||
Returns:
|
||||
BOOL - unit has key for vehicle
|
||||
|
||||
Example:
|
||||
[bob, car] call ACE_VehicleLock_fnc_hasKeyForVehicle;
|
||||
*/
|
||||
|
||||
* Author: PabstMirror
|
||||
* Returns if user has a valid key for the vehicle
|
||||
*
|
||||
* Arguments:
|
||||
* 0: Unit <OBJECT>
|
||||
* 1: Vehicle <OBJECT>
|
||||
*
|
||||
* Return Value:
|
||||
* unit has key for vehicle <BOOL>
|
||||
*
|
||||
* Example:
|
||||
* [bob, car] call ACE_VehicleLock_fnc_hasKeyForVehicle;
|
||||
*
|
||||
* Public: No
|
||||
*/
|
||||
#include "script_component.hpp"
|
||||
|
||||
private ["_unit","_veh","_returnValue","_sideKeyName","_customKeys"];
|
||||
private ["_returnValue","_sideKeyName","_customKeys"];
|
||||
|
||||
_unit = [_this, 0, objNull, [objNull]] call bis_fnc_param;
|
||||
_veh = [_this, 1, objNull, [objNull]] call bis_fnc_param;
|
||||
PARAMS_2(_unit,_veh);
|
||||
|
||||
if (isNull _unit) exitWith {["ACE_VehicleLock_fnc_hasKeyForVehicle: null unit"] call BIS_fnc_error; false};
|
||||
if (isNull _veh) exitWith {["ACE_VehicleLock_fnc_hasKeyForVehicle: null vehicle"] call BIS_fnc_error; false};
|
||||
if (isNull _unit) exitWith {ERROR("null unit"); false};
|
||||
if (isNull _veh) exitWith {ERROR("null vehicle"); false};
|
||||
|
||||
_returnValue = false;
|
||||
|
||||
@ -39,7 +35,7 @@ if (_sideKeyName in (items _unit)) then {_returnValue = true};
|
||||
//Check custom keys
|
||||
_customKeys = _veh getVariable [QGVAR(customKeys), []];
|
||||
{
|
||||
if (_x in (magazinesDetail _unit)) then {_returnValue = true;};
|
||||
if (_x in (magazinesDetail _unit)) then {_returnValue = true;};
|
||||
} forEach _customKeys;
|
||||
|
||||
_returnValue
|
||||
|
@ -1,79 +1,66 @@
|
||||
/*
|
||||
Name: ACE_VehicleLock_fnc_lockpick
|
||||
|
||||
Author: Pabst Mirror
|
||||
|
||||
Description:
|
||||
Handles lockpick functionality from action menu.
|
||||
|
||||
Parameters:
|
||||
0: OBJECT - unit
|
||||
1: OBJECT - vehicle
|
||||
2: STRING - function type
|
||||
"canLockpick": returns BOOL if lockpick is possible
|
||||
"startLockpick": starts the process
|
||||
"finishLockpick": on completions, opens the lock
|
||||
|
||||
Returns:
|
||||
BOOL
|
||||
|
||||
Example:
|
||||
[ACE_player, ACE_Interaction_Target, 'canLockpick'] call ACE_VehicleLock_fnc_lockpick
|
||||
*/
|
||||
|
||||
* Author: PabstMirror
|
||||
* Handles lockpick functionality. Three different functions:
|
||||
* "canLockpick": returns BOOL if lockpick is possible
|
||||
* "startLockpick": starts the process
|
||||
* "finishLockpick": on completions, opens the lock
|
||||
*
|
||||
* Arguments:
|
||||
* 0: Unit (player) <OBJECT>
|
||||
* 1: Vehicle <OBJECT>
|
||||
* 2: Function Type <OBJECT>
|
||||
*
|
||||
* Return Value:
|
||||
* "canLockpick" <BOOL>
|
||||
*
|
||||
* Example:
|
||||
* [ACE_player, ACE_Interaction_Target, 'canLockpick'] call ACE_VehicleLock_fnc_lockpick
|
||||
*
|
||||
* Public: No
|
||||
*/
|
||||
#include "script_component.hpp"
|
||||
|
||||
private ["_unit","_veh","_funcType","_vehLockpickStrenth","_returnValue", "_condition"];
|
||||
private ["_vehLockpickStrenth","_condition","_returnValue"];
|
||||
|
||||
_unit = [_this, 0, objNull, [objNull]] call bis_fnc_param;
|
||||
_veh = [_this, 1, objNull, [objNull]] call bis_fnc_param;
|
||||
_funcType = [_this, 2, "", [""]] call bis_fnc_param;
|
||||
PARAMS_3(_unit,_veh,_funcType);
|
||||
|
||||
if (isNull _unit) exitWith {
|
||||
["ACE_VehicleLock_fnc_lockpick: null unit"] call BIS_fnc_error;
|
||||
false
|
||||
};
|
||||
if (isNull _veh) exitWith {
|
||||
["ACE_VehicleLock_fnc_lockpick: null vehicle"] call BIS_fnc_error;
|
||||
false
|
||||
};
|
||||
if (isNull _unit) exitWith {ERROR("null unit"); false};
|
||||
if (isNull _veh) exitWith {ERROR("null vehicle"); false};
|
||||
|
||||
//need lockpick item
|
||||
if (!("ACE_key_lockpick" in (items _unit))) exitWith {
|
||||
false
|
||||
};
|
||||
if (!("ACE_key_lockpick" in (items _unit))) exitWith {false};
|
||||
|
||||
_vehLockpickStrenth = _veh getVariable[QGVAR(lockpickStrength), GVAR(DefaultLockpickStrength)];
|
||||
if (typeName _vehLockpickStrenth != "SCALAR") exitWith {
|
||||
["ACE_VehicleLock_fnc_lockpick: 'ACE_vehicleLock_LockpickStrength' invalid: (%1)", _veh] call BIS_fnc_error;
|
||||
false
|
||||
};
|
||||
if (typeName _vehLockpickStrenth != "SCALAR") exitWith {ERROR("ACE_vehicleLock_LockpickStrength invalid"); false};
|
||||
|
||||
//-1 indicates unpickable lock
|
||||
if (_vehLockpickStrenth < 0) exitWith {
|
||||
false
|
||||
if (_vehLockpickStrenth < 0) exitWith {false};
|
||||
|
||||
//Condition check for progressBar
|
||||
_condition = {
|
||||
PARAMS_1(_args);
|
||||
EXPLODE_2_PVT(_args,_unit,_veh);
|
||||
((_unit distance _veh) < 5) && {(speed _veh) < 0.1}
|
||||
};
|
||||
|
||||
if (!([[_unit, _veh]] call _condition)) exitWith {false};
|
||||
|
||||
_returnValue = false;
|
||||
|
||||
switch (true) do {
|
||||
case (_funcType == "canLockpick"): {
|
||||
_returnValue = true;
|
||||
};
|
||||
case (_funcType == "startLockpick"): {
|
||||
_condition = {
|
||||
PARAMS_1(_args);
|
||||
EXPLODE_2_PVT(_args,_unit,_veh);
|
||||
([_unit, objNull, []] call EFUNC(common,canInteractWith)) && ((_unit distance _veh) < 5) && ((speed _veh) < 1)
|
||||
_returnValue = true;
|
||||
};
|
||||
case (_funcType == "startLockpick"): {
|
||||
[_vehLockpickStrenth, [_unit, _veh, "finishLockpick"], {(_this select 0) call FUNC(lockpick)}, {}, (localize "STR_ACE_Vehicle_Action_LockpickInUse"), _condition] call EFUNC(common,progressBar);
|
||||
_returnValue = true;
|
||||
};
|
||||
[_vehLockpickStrenth, [_unit, _veh, "finishLockpick"], {(_this select 0) call FUNC(lockpick)}, {}, (localize "STR_ACE_Vehicle_Action_LockpickInUse"), _condition] call EFUNC(common,progressBar);
|
||||
};
|
||||
case (_funcType == "finishLockpick"): {
|
||||
["SetVehicleLock", [_veh], [_veh, false]] call EFUNC(common,targetEvent);
|
||||
};
|
||||
default {
|
||||
["ACE_VehicleLock_fnc_lockpick: bad function type"] call BIS_fnc_error;
|
||||
};
|
||||
["VehicleLock_SetVehicleLock", [_veh], [_veh, false]] call EFUNC(common,targetEvent);
|
||||
_returnValue = true;
|
||||
};
|
||||
default {
|
||||
ERROR("bad function type");
|
||||
};
|
||||
};
|
||||
|
||||
_returnValue;
|
||||
_returnValue
|
||||
|
@ -1,22 +1,20 @@
|
||||
/*
|
||||
Name: ACE_VehicleLock_fnc_moduleInit
|
||||
|
||||
Author: Pabst Mirror
|
||||
|
||||
Description:
|
||||
Function for setup module. Sets default lockpick strength, auto handout keys, and default lock state.
|
||||
|
||||
Parameters:
|
||||
0: OBJECT - logic
|
||||
1: ignored
|
||||
2: BOOL - Module Activated
|
||||
Returns:
|
||||
Nothing
|
||||
|
||||
Example:
|
||||
called from module
|
||||
*/
|
||||
|
||||
* Author: PabstMirror
|
||||
* Function for setup module. Sets default lockpick strength and default lock state.
|
||||
*
|
||||
* Arguments:
|
||||
* 0: The Module Logic Object <OBJECT>
|
||||
* 1: synced objects <ARRAY>
|
||||
* 2: Activated <BOOL>
|
||||
*
|
||||
* Return Value:
|
||||
* None
|
||||
*
|
||||
* Example:
|
||||
* [fromModule] call ACE_VehicleLock_fnc_hasKeyForVehicle;
|
||||
*
|
||||
* Public: No
|
||||
*/
|
||||
#include "script_component.hpp"
|
||||
|
||||
private ["_sideKeysAssignment", "_setLockState", "_lock"];
|
||||
@ -24,28 +22,28 @@ private ["_sideKeysAssignment", "_setLockState", "_lock"];
|
||||
PARAMS_3(_logic,_syncedUnits,_activated);
|
||||
|
||||
if (!_activated) exitWith {WARNING("Vehicle Lock Init Module - placed but not active");};
|
||||
if (!isServer) exitWith {};
|
||||
|
||||
//Set the GVAR for default lockpick strength
|
||||
[_logic, QGVAR(DefaultLockpickStrength), "DefaultLockpickStrength"] call EFUNC(common,readSettingFromModule);
|
||||
[_logic, QGVAR(LockVehicleInventory), "LockVehicleInventory"] call EFUNC(common,readSettingFromModule);
|
||||
|
||||
_sideKeysAssignment = _logic getVariable["SideKeysAssignment", 0];
|
||||
_setLockState = _logic getVariable["SetLockState", 0];
|
||||
|
||||
if (isServer) then {
|
||||
[_logic, QGVAR(DefaultLockpickStrength), "LockpickStrength"] call EFUNC(common,readSettingFromModule);
|
||||
};
|
||||
|
||||
//Run at mission start (anyone besides JIPs)
|
||||
if (isServer || {player == player}) then {
|
||||
{
|
||||
if ((local _x) && {(_x isKindOf "Car") || (_x isKindOf "Tank") || (_x isKindOf "Helicopter")}) then {
|
||||
//set lock state (eliminates the ambigious 1-"Default" and 3-"Locked for Player" states)
|
||||
_lock = switch (_setLockState) do {
|
||||
case (0): {(locked _x) in [2, 3]};
|
||||
case (1):{true};
|
||||
case (2):{false};
|
||||
};
|
||||
if (((_lock) && {(locked _x) != 2}) || {(!_lock) && {(locked _x) != 0}}) then {
|
||||
TRACE_3("Setting Lock State", _lock, (typeOf _x), _x);
|
||||
["SetVehicleLock", [_x, _lock]] call EFUNC(common,localEvent);
|
||||
};
|
||||
};
|
||||
} forEach vehicles;
|
||||
};
|
||||
[{
|
||||
PARAMS_1(_setLockState);
|
||||
{
|
||||
if ((_x isKindOf "Car") || {_x isKindOf "Tank"} || {_x isKindOf "Helicopter"}) then {
|
||||
//set lock state (eliminates the ambigious 1-"Default" and 3-"Locked for Player" states)
|
||||
_lock = switch (_setLockState) do {
|
||||
case (0): {(locked _x) in [2, 3]};
|
||||
case (1):{true};
|
||||
case (2):{false};
|
||||
};
|
||||
if (((_lock) && {(locked _x) != 2}) || {(!_lock) && {(locked _x) != 0}}) then {
|
||||
TRACE_3("Setting Lock State", _lock, (typeOf _x), _x);
|
||||
["VehicleLock_SetVehicleLock", [_x], [_x, _lock]] call EFUNC(common,targetEvent);
|
||||
};
|
||||
};
|
||||
} forEach vehicles;
|
||||
//Delay call until mission start (so everyone has the eventHandler's installed)
|
||||
}, [_setLockState], 0.25, 0.25] call EFUNC(common,waitAndExecute);
|
||||
|
@ -1,22 +1,20 @@
|
||||
/*
|
||||
Name: ACE_VehicleLock_fnc_moduleSync
|
||||
|
||||
Author: Pabst Mirror
|
||||
|
||||
Description:
|
||||
Function for sync module. Assigns keys for all synced vehicles to any players that are synced.
|
||||
|
||||
Parameters:
|
||||
0: OBJECT - logic
|
||||
1: ARRAY - synced objects (only objects at mission start, so JIP without AI won't be present)
|
||||
|
||||
Returns:
|
||||
Nothing
|
||||
|
||||
Example:
|
||||
called from module
|
||||
*/
|
||||
|
||||
* Author: PabstMirror
|
||||
* Function for sync module. Assigns keys for all synced vehicles to any players that are synced.
|
||||
*
|
||||
* Arguments:
|
||||
* 0: The Module Logic Object <OBJECT>
|
||||
* 1: synced objects <ARRAY>
|
||||
* 2: Activated <BOOL>
|
||||
*
|
||||
* Return Value:
|
||||
* None
|
||||
*
|
||||
* Example:
|
||||
* [fromModule] call ACE_VehicleLock_fnc_moduleSync;
|
||||
*
|
||||
* Public: No
|
||||
*/
|
||||
#include "script_component.hpp"
|
||||
|
||||
PARAMS_3(_logic,_syncedObjects,_activated);
|
||||
@ -24,29 +22,28 @@ PARAMS_3(_logic,_syncedObjects,_activated);
|
||||
if !(_activated) exitWith {WARNING("Vehicle Lock Sync Module - placed but not active");};
|
||||
if (!isServer) exitWith {};
|
||||
|
||||
_addKeyAfterGearAssign = {
|
||||
private ["_syncedObjects", "_listOfVehicles"];
|
||||
_syncedObjects = _this select 0;
|
||||
_listOfVehicles = [];
|
||||
{
|
||||
if ((_x isKindOf "Car") || (_x isKindOf "Tank") || (_x isKindOf "Helicopter")) then {
|
||||
_listOfVehicles pushBack _x;
|
||||
[{
|
||||
private ["_listOfVehicles"];
|
||||
PARAMS_1(_syncedObjects);
|
||||
_listOfVehicles = [];
|
||||
{
|
||||
if ((_x isKindOf "Car") || (_x isKindOf "Tank") || (_x isKindOf "Helicopter")) then {
|
||||
_listOfVehicles pushBack _x;
|
||||
};
|
||||
} forEach _syncedObjects;
|
||||
|
||||
if ((count _listOfVehicles) == 0) exitWith { //Verbose error for mission makers (only shows on server)
|
||||
["ACE_VehicleLock_fnc_moduleSync: no vehicles synced"] call BIS_fnc_error;
|
||||
};
|
||||
} forEach _syncedObjects;
|
||||
|
||||
if ((count _listOfVehicles) == 0) exitWith { //Verbose error for mission makers
|
||||
["ACE_VehicleLock_fnc_moduleSync: no vehicles synced"] call BIS_fnc_error;
|
||||
};
|
||||
{
|
||||
_unit = _x;
|
||||
if (_unit isKindOf "CAManBase") then {
|
||||
{
|
||||
[_unit, _x, true] call FUNC(addKeyForVehicle);
|
||||
} forEach _listOfVehicles;
|
||||
};
|
||||
} forEach _syncedObjects;
|
||||
|
||||
{
|
||||
_unit = _x;
|
||||
if (_unit isKindOf "CAManBase") then {
|
||||
{
|
||||
[_unit, _x, true] call FUNC(addKeyForVehicle);
|
||||
} forEach _listOfVehicles;
|
||||
};
|
||||
} forEach _syncedObjects;
|
||||
};
|
||||
|
||||
//Wait to add keys until various gear assigns have finished (~5 seconds)
|
||||
[_addKeyAfterGearAssign, [_syncedObjects], 5, 1] call EFUNC(common,waitAndExecute);
|
||||
//Wait to add keys until various gear assigns have finished (~5 seconds)
|
||||
}, [_syncedObjects], 5, 1] call EFUNC(common,waitAndExecute);
|
||||
|
40
addons/vehiclelock/functions/fnc_onOpenInventory.sqf
Normal file
40
addons/vehiclelock/functions/fnc_onOpenInventory.sqf
Normal file
@ -0,0 +1,40 @@
|
||||
/*
|
||||
* Author: PabstMirror
|
||||
* Handles the inventory opening.
|
||||
*
|
||||
* Arguments:
|
||||
* 0: Unit <OBJECT>
|
||||
* 1: Container <OBJECT>
|
||||
*
|
||||
* Return Value:
|
||||
* Handeled <BOOL>
|
||||
*
|
||||
* Example:
|
||||
* [player, car] call ACE_VehicleLock_fnc_onOpenInventory;
|
||||
*
|
||||
* Public: No
|
||||
*/
|
||||
#include "script_component.hpp"
|
||||
|
||||
PARAMS_2(_unit,_container);
|
||||
|
||||
//Only check for player:
|
||||
if (_unit != ace_player) exitWith {false};
|
||||
|
||||
_handeled = false;
|
||||
|
||||
if (GVAR(LockVehicleInventory) && //if setting not enabled
|
||||
{(vehicle ace_player) == ace_player} && //Player dismounted
|
||||
{(_container isKindOf "Car") || (_container isKindOf "Tank") || (_container isKindOf "Helicopter")} && //container is a lockable veh
|
||||
{(locked _container) in [2,3]} && //Vehicle is locked
|
||||
{!([ace_player, _container] call FUNC(hasKeyForVehicle))} //player doesn't have key
|
||||
) then {
|
||||
//Give feedback that vehicle is locked
|
||||
playSound "ACE_Sound_Click";
|
||||
//don't open the vehicles inventory
|
||||
_handeled = true;
|
||||
//Just opens a dummy groundContainer
|
||||
ACE_player action ["Gear", objNull];
|
||||
};
|
||||
|
||||
_handeled
|
@ -1,22 +1,19 @@
|
||||
/*
|
||||
Name: ACE_VehicleLock_fnc_serverSetupCustomKeyEH
|
||||
|
||||
Author: Pabst Mirror
|
||||
|
||||
Description:
|
||||
Adds a key (magazineDetail name) to approved keys for a vehicle
|
||||
|
||||
Parameters:
|
||||
0: OBJECT - vehicle
|
||||
1: STRING - Magazine Name
|
||||
|
||||
Returns:
|
||||
Nothing
|
||||
|
||||
Example:
|
||||
[tank1, "someMagainze [id xx:yy]"] call ACE_VehicleLock_fnc_serverSetupCustomKeyEH;
|
||||
*/
|
||||
|
||||
/*
|
||||
* Author: PabstMirror
|
||||
* On the server: Adds a key (magazineDetail name) to approved keys for a vehicle.
|
||||
*
|
||||
* Arguments:
|
||||
* 0: Vehicle <OBJECT>
|
||||
* 1: Magazine Name <STRING>
|
||||
*
|
||||
* Return Value:
|
||||
* None
|
||||
*
|
||||
* Example:
|
||||
* [tank1, "someMagainze [id xx:yy]"] call ACE_VehicleLock_fnc_serverSetupCustomKeyEH
|
||||
*
|
||||
* Public: Yes
|
||||
*/
|
||||
#include "script_component.hpp"
|
||||
|
||||
private ["_currentKeys"];
|
||||
@ -24,6 +21,7 @@ private ["_currentKeys"];
|
||||
PARAMS_2(_veh,_key);
|
||||
|
||||
if (!isServer) exitWith {ERROR("only run on server");};
|
||||
if (isNull _veh) exitWith {ERROR("null vehicle");};
|
||||
if (_key == "") exitWith {ERROR("empty key string");};
|
||||
|
||||
_currentKeys = _veh getVariable [QGVAR(customKeys), []];
|
||||
|
@ -1,33 +1,25 @@
|
||||
/*
|
||||
Name: ACE_VehicleLock_fnc_setVehicleLockEH
|
||||
|
||||
Author: Pabst Mirror
|
||||
|
||||
Description:
|
||||
Sets a vehicle lock state because of a "SetVehicleLock" event
|
||||
|
||||
Parameters:
|
||||
0: OBJECT - vehicle
|
||||
1: BOOL - new lock state
|
||||
|
||||
Returns:
|
||||
Nothing
|
||||
|
||||
Example:
|
||||
[tank1, false] call ACE_VehicleLock_fnc_setVehicleLockEH;
|
||||
*/
|
||||
|
||||
* Author: PabstMirror
|
||||
* Sets a vehicle lock state because of a "VehicleLock_SetVehicleLock" event
|
||||
*
|
||||
* Arguments:
|
||||
* 0: Vehicle <OBJECT>
|
||||
* 1: New lock state <BOOL>
|
||||
*
|
||||
* Return Value:
|
||||
* None
|
||||
*
|
||||
* Example:
|
||||
* [tank1, false] call ACE_VehicleLock_fnc_setVehicleLockEH;
|
||||
*
|
||||
* Public: Yes
|
||||
*/
|
||||
#include "script_component.hpp"
|
||||
|
||||
private ["_veh","_isLocked","_lockNumber"];
|
||||
private ["_lockNumber"];
|
||||
|
||||
_veh = [_this, 0, objNull, [objNull]] call bis_fnc_param;
|
||||
_isLocked = [_this, 1, false, [false]] call bis_fnc_param;
|
||||
PARAMS_2(_veh,_isLocked);
|
||||
|
||||
_lockNumber = if (_isLocked) then {2} else {0};
|
||||
|
||||
TRACE_2("Setting Lock State", _veh, _lockNumber);
|
||||
|
||||
_veh lock _lockNumber;
|
||||
|
||||
// _veh setVariable ["ACE_LockedInventory", _isLocked, true]; //todo inventory lock
|
||||
|
@ -5,8 +5,8 @@ Adds keys as an item, to lock and unlock vehicles.
|
||||
Primary target would be role play or TVT, but has uses in all game types, even co-ops (e.g.: DAC AI will steal unlocked vehicles)
|
||||
|
||||
Two key modes (can be used together):
|
||||
Simple Side based keys (e.g. "ACE_key_west" works on any hunter)
|
||||
Custom keys (one key will only open a specific vehicle and nothing else)
|
||||
* Simple Side based keys (e.g. "ACE_key_west" works on any [WEST] vehicle like the M-ATV//hunter)
|
||||
* Custom keys (one key will only open a specific vehicle and nothing else)
|
||||
|
||||
#### Items Added:
|
||||
|
||||
@ -18,24 +18,20 @@ Custom keys (one key will only open a specific vehicle and nothing else)
|
||||
`ACE_key_civ`
|
||||
|
||||
#### Magazine added:
|
||||
`ACE_key_customKeyMagazine` (should never be manualy added, needs to be 'programed' to work on a vehicle)
|
||||
`ACE_key_customKeyMagazine` (should never be manualy added, needs to be "programed" to work on a vehicle, see `ACE_VehicleLock_fnc_addKeyForVehicle`)
|
||||
|
||||
## For Mission Makers:
|
||||
|
||||
#### Modules:
|
||||
* Vehicle Lock Setup - Settings for lockpick strength and initial vehicle lock state.
|
||||
* Vehicle Key Assign - Sync with vehicles and players. Will handout custom keys to players for every synced vehicle.
|
||||
|
||||
#### Global Variable:
|
||||
* `ACE_VehicleLock_DefaultLockpickStrength` - Time in seconds to lock pick globaly, can also set per-vehicle (-1 would disable)
|
||||
* Vehicle Lock Setup - Settings for locking inventory of locked vehicles, default lockpick time, and initial vehicle lock state.
|
||||
* Vehicle Key Assign - Sync with vehicles and players. Will handout custom keys to players for every synced vehicle. Will NOT work for JIP units.
|
||||
|
||||
#### Vehicle setVariables:
|
||||
* `ACE_VehicleLock_lockSide` - SIDE: overrides a vehicle's side, allows indfor to use little-bird's with indp keys
|
||||
* `ACE_vehicleLock_lockpickStrength` - NUMBER: secons, determines how long lockpicking with take, overrides ACE_VehicleLock_DefaultLockpickStrength
|
||||
* `ACE_VehicleLock_customKeys` - ARRAY: array of strings of magazinesDetails, use the following function to modify
|
||||
|
||||
`[bob, car1, true] call ACE_VehicleLock_fnc_addKeyForVehicle;`
|
||||
will add a `ACE_magazine_customKey` to bob and program it to work on car1
|
||||
#### Public Functions:
|
||||
`[bob, car1, true] call ACE_VehicleLock_fnc_addKeyForVehicle;` - will add a `ACE_magazine_customKey` to bob and program it to work on car1
|
||||
|
||||
## Maintainers
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user