From fda4f60a9e9513b4db34b95e2998d8e7ab8482da Mon Sep 17 00:00:00 2001 From: PabstMirror Date: Mon, 13 Apr 2015 22:19:38 -0500 Subject: [PATCH 01/86] House UserAction Prototype --- addons/interact_menu/XEH_clientInit.sqf | 3 + addons/interact_menu/XEH_preInit.sqf | 1 + .../functions/fnc_addHouseActions.sqf | 119 ++++++++++++++++++ 3 files changed, 123 insertions(+) create mode 100644 addons/interact_menu/functions/fnc_addHouseActions.sqf diff --git a/addons/interact_menu/XEH_clientInit.sqf b/addons/interact_menu/XEH_clientInit.sqf index bcb2d5aa8e..60fce6f4da 100644 --- a/addons/interact_menu/XEH_clientInit.sqf +++ b/addons/interact_menu/XEH_clientInit.sqf @@ -6,6 +6,9 @@ if (!hasInterface) exitWith {}; // Install the render EH on the main display addMissionEventHandler ["Draw3D", DFUNC(render)]; +//Add Actions to Houses: +["interactMenuOpened", {_this call FUNC(addHouseActions)}] call EFUNC(common,addEventHandler); + // This spawn is probably worth keeping, as pfh don't work natively on the briefing screen and IDK how reliable the hack we implemented for them is. // The thread dies as soon as the mission start, so it's not really compiting for scheduler space. [] spawn { diff --git a/addons/interact_menu/XEH_preInit.sqf b/addons/interact_menu/XEH_preInit.sqf index c15f8d388d..dc9b539e6f 100644 --- a/addons/interact_menu/XEH_preInit.sqf +++ b/addons/interact_menu/XEH_preInit.sqf @@ -4,6 +4,7 @@ ADDON = false; PREP(addActionToClass); PREP(addActionToObject); +PREP(addHouseActions); PREP(compileMenu); PREP(compileMenuSelfAction); PREP(collectActiveActionTree); diff --git a/addons/interact_menu/functions/fnc_addHouseActions.sqf b/addons/interact_menu/functions/fnc_addHouseActions.sqf new file mode 100644 index 0000000000..eff00fd90b --- /dev/null +++ b/addons/interact_menu/functions/fnc_addHouseActions.sqf @@ -0,0 +1,119 @@ +/* + * Author: PabstMirror + * When interact_menu starts rendering (from "interact_keyDown" event) + * + * Arguments: + * Interact Menu Type (0 - world, 1 - self) + * + * Return Value: + * Nothing + * + * Example: + * [0] call ace_logistics_wirecutter_fnc_interactEH + * + * Public: Yes + */ +#include "script_component.hpp" + +PARAMS_1(_interactionType); + +//Ignore self-interaction menu +if (_interactionType != 0) exitWith {}; + +//for performance only do stuff it they have a wirecutter item +//(if they somehow get one durring keydown they'll just have to reopen) +// if (!("ACE_wirecutter" in (items ace_player))) exitWith {}; + +systemChat "starting"; + +[{ + private ["_fncStatement", "_attachedFence", "_fncCondition", "_helper"]; + PARAMS_2(_args,_pfID); + EXPLODE_3_PVT(_args,_setPosition,_addedHelpers,_housesScaned); + + if (!EGVAR(interact_menu,keyDown)) then { + {deleteVehicle _x;} forEach _addedHelpers; + [_pfID] call CBA_fnc_removePerFrameHandler; + } else { + // Prevent Rare Error when ending mission with interact key down: + if (isNull ace_player) exitWith {}; + + //If player moved >5 meters from last pos, then rescan + if (((getPosASL ace_player) distance _setPosition) < 5) exitWith {}; + + _fncStatement = { + PARAMS_3(_dummyTarget,_player,_attachedFence); + [_player, _attachedFence] call FUNC(cutDownFence); + }; + _fncCondition = { + PARAMS_3(_dummyTarget,_player,_attachedFence); + ((!isNull _attachedFence) && {(damage _attachedFence) < 1} && {("ACE_wirecutter" in (items _player))}) + }; + + + { + _theHouse = _x; + if (!(_theHouse in _housesScaned)) then { + _housesScaned pushBack _x; + if ((typeOf _theHouse) != "") then { + _configPath = (configFile >> "CfgVehicles" >> (typeOf _theHouse)); + if (isClass (_configPath >> "UserActions")) then { + _houseHelpers = []; + + + systemChat format ["Looking At %1 [%2]", _theHouse, (typeOf _theHouse)]; + { + _displayName = getText (_x >> "displayName"); + _position = getText (_x >> "position"); + _condition = getText (_x >> "condition"); + _statement = getText (_x >> "statement"); + + _helperObject = objNull; + _actionOffset = [0,0,0]; + { + EXPLODE_3_PVT(_x,_memPoint,_object,_count); + if (_memPoint == _position) exitWith { + _helperObject = _object; + _offset = [0,0,(_count * 0.1)]; + _x set [2, (_count + 1)]; + }; + } forEach _houseHelpers; + + if (isNull _helperObject) then { + _helperObject = "Sign_Sphere25cm_F" createVehicleLocal (getpos _theHouse); + _houseHelpers pushBack [_position, _helperObject, 1]; + _helperPos = _theHouse modelToWorld (_theHouse selectionPosition _position); + //double check ASL/ATL bullshit + _helperObject setPos _helperPos; + _helperObject hideObject true; + _addedHelpers pushBack _helperObject; + diag_log text format ["Making New Helper %1", [_helperObject, _helperPos, _theHouse]]; + }; + + _fncStatement = { + PARAMS_3(_target,_player,_variable); + EXPLODE_3_PVT(_variable,_theHouse,_statement,_condition); + this = _theHouse; //this feels dirty + call _statement; + }; + _fncCondition = { + PARAMS_3(_target,_player,_variable); + EXPLODE_3_PVT(_variable,_theHouse,_statement,_condition); + this = _theHouse; //this feels dirty + call _condition; + }; + + _variable = [_theHouse, compile _statement, compile _condition]; + + _action = [(configName _x), _displayName, "", _fncStatement, _fncCondition, {}, _variable, _actionOffset, 5] call EFUNC(interact_menu,createAction); + [_helperObject, 0, [],_action] call EFUNC(interact_menu,addActionToObject); + + } foreach configproperties [(_configPath >> "UserActions")]; + }; + }; + }; + } forEach nearestObjects [ace_player, ["Static"], 25]; + + _args set [0, (getPosASL ace_player)]; + }; +}, 0.1, [((getPosASL ace_player) vectorAdd [-100,0,0]), [], []]] call CBA_fnc_addPerFrameHandler; From e84c5f4bb33718b507ae7c54414120ad9f1dc0e0 Mon Sep 17 00:00:00 2001 From: PabstMirror Date: Mon, 13 Apr 2015 22:26:38 -0500 Subject: [PATCH 02/86] Radius Distance --- .../functions/fnc_addHouseActions.sqf | 15 ++++++++++++--- 1 file changed, 12 insertions(+), 3 deletions(-) diff --git a/addons/interact_menu/functions/fnc_addHouseActions.sqf b/addons/interact_menu/functions/fnc_addHouseActions.sqf index eff00fd90b..ec596eb5e6 100644 --- a/addons/interact_menu/functions/fnc_addHouseActions.sqf +++ b/addons/interact_menu/functions/fnc_addHouseActions.sqf @@ -61,13 +61,22 @@ systemChat "starting"; _houseHelpers = []; - systemChat format ["Looking At %1 [%2]", _theHouse, (typeOf _theHouse)]; + // systemChat format ["Looking At %1 [%2]", _theHouse, (typeOf _theHouse)]; { _displayName = getText (_x >> "displayName"); _position = getText (_x >> "position"); _condition = getText (_x >> "condition"); _statement = getText (_x >> "statement"); + _maxDistance = getNumber (_x >> "radius"); + if (_displayName == "") then {_displayName = (configName _x);}; + // if (_position == "") then {_condition = "true";}; //???? + if (_condition == "") then {_condition = "true";}; + // if (_statement == "") then {_condition = "true";}; + // if (_maxDistance < 0.1) then {_condition = "true";}; + + _maxDistance = _maxDistance + 0.25; //fudge it up a little + _helperObject = objNull; _actionOffset = [0,0,0]; { @@ -87,7 +96,7 @@ systemChat "starting"; _helperObject setPos _helperPos; _helperObject hideObject true; _addedHelpers pushBack _helperObject; - diag_log text format ["Making New Helper %1", [_helperObject, _helperPos, _theHouse]]; + // diag_log text format ["Making New Helper %1", [_helperObject, _helperPos, _theHouse]]; }; _fncStatement = { @@ -105,7 +114,7 @@ systemChat "starting"; _variable = [_theHouse, compile _statement, compile _condition]; - _action = [(configName _x), _displayName, "", _fncStatement, _fncCondition, {}, _variable, _actionOffset, 5] call EFUNC(interact_menu,createAction); + _action = [(configName _x), _displayName, "", _fncStatement, _fncCondition, {}, _variable, _actionOffset, _maxDistance] call EFUNC(interact_menu,createAction); [_helperObject, 0, [],_action] call EFUNC(interact_menu,addActionToObject); } foreach configproperties [(_configPath >> "UserActions")]; From 5c994765ef0c820fca7285c8944c53b06a607105 Mon Sep 17 00:00:00 2001 From: PabstMirror Date: Mon, 13 Apr 2015 22:39:00 -0500 Subject: [PATCH 03/86] Cleanup --- .../functions/fnc_addHouseActions.sqf | 66 ++++++++----------- 1 file changed, 26 insertions(+), 40 deletions(-) diff --git a/addons/interact_menu/functions/fnc_addHouseActions.sqf b/addons/interact_menu/functions/fnc_addHouseActions.sqf index ec596eb5e6..95037ae21b 100644 --- a/addons/interact_menu/functions/fnc_addHouseActions.sqf +++ b/addons/interact_menu/functions/fnc_addHouseActions.sqf @@ -9,7 +9,7 @@ * Nothing * * Example: - * [0] call ace_logistics_wirecutter_fnc_interactEH + * [0] call ace_interact_menu_fnc_addHouseActions * * Public: Yes */ @@ -17,17 +17,13 @@ PARAMS_1(_interactionType); -//Ignore self-interaction menu +//Ignore self-interaction menu: if (_interactionType != 0) exitWith {}; - -//for performance only do stuff it they have a wirecutter item -//(if they somehow get one durring keydown they'll just have to reopen) -// if (!("ACE_wirecutter" in (items ace_player))) exitWith {}; - -systemChat "starting"; +//Ignore when mounted: +if ((vehicle ACE_player) != ACE_player) exitWith {}; [{ - private ["_fncStatement", "_attachedFence", "_fncCondition", "_helper"]; + private ["_fncStatement", "_player", "_fncCondition", "_variable", "_theHouse", "_statement", "_condition", "_configPath", "_houseHelpers", "_displayName", "_position", "_maxDistance", "_helperObject", "_actionOffset", "_memPoint", "_object", "_count", "_helperPos", "_action"]; PARAMS_2(_args,_pfID); EXPLODE_3_PVT(_args,_setPosition,_addedHelpers,_housesScaned); @@ -42,15 +38,18 @@ systemChat "starting"; if (((getPosASL ace_player) distance _setPosition) < 5) exitWith {}; _fncStatement = { - PARAMS_3(_dummyTarget,_player,_attachedFence); - [_player, _attachedFence] call FUNC(cutDownFence); + PARAMS_3(_target,_player,_variable); + EXPLODE_3_PVT(_variable,_theHouse,_statement,_condition); + this = _theHouse; //this feels dirty + call _statement; }; _fncCondition = { - PARAMS_3(_dummyTarget,_player,_attachedFence); - ((!isNull _attachedFence) && {(damage _attachedFence) < 1} && {("ACE_wirecutter" in (items _player))}) + PARAMS_3(_target,_player,_variable); + EXPLODE_3_PVT(_variable,_theHouse,_statement,_condition); + this = _theHouse; //this feels dirty + call _condition; }; - { _theHouse = _x; if (!(_theHouse in _housesScaned)) then { @@ -60,8 +59,6 @@ systemChat "starting"; if (isClass (_configPath >> "UserActions")) then { _houseHelpers = []; - - // systemChat format ["Looking At %1 [%2]", _theHouse, (typeOf _theHouse)]; { _displayName = getText (_x >> "displayName"); _position = getText (_x >> "position"); @@ -70,20 +67,23 @@ systemChat "starting"; _maxDistance = getNumber (_x >> "radius"); if (_displayName == "") then {_displayName = (configName _x);}; - // if (_position == "") then {_condition = "true";}; //???? + if (_position == "") then {ERROR("Bad Position");}; if (_condition == "") then {_condition = "true";}; - // if (_statement == "") then {_condition = "true";}; - // if (_maxDistance < 0.1) then {_condition = "true";}; + if (_statement == "") then {ERROR("No Statement");}; - _maxDistance = _maxDistance + 0.25; //fudge it up a little - + _statement = compile _statement; + _condition = compile _condition; + _maxDistance = _maxDistance + 1; //increase range slightly + + //Find a helper object, if one exists on the selection position _helperObject = objNull; _actionOffset = [0,0,0]; { EXPLODE_3_PVT(_x,_memPoint,_object,_count); if (_memPoint == _position) exitWith { _helperObject = _object; - _offset = [0,0,(_count * 0.1)]; + //make sure actions dont' overlap (although they are usualy mutually exclusive) + _actionOffset = [0,0,(_count * 0.1)]; _x set [2, (_count + 1)]; }; } forEach _houseHelpers; @@ -96,32 +96,18 @@ systemChat "starting"; _helperObject setPos _helperPos; _helperObject hideObject true; _addedHelpers pushBack _helperObject; - // diag_log text format ["Making New Helper %1", [_helperObject, _helperPos, _theHouse]]; + TRACE_3("Making New Helper %1",_helperObject,_helperPos,_theHouse); }; - _fncStatement = { - PARAMS_3(_target,_player,_variable); - EXPLODE_3_PVT(_variable,_theHouse,_statement,_condition); - this = _theHouse; //this feels dirty - call _statement; - }; - _fncCondition = { - PARAMS_3(_target,_player,_variable); - EXPLODE_3_PVT(_variable,_theHouse,_statement,_condition); - this = _theHouse; //this feels dirty - call _condition; - }; - - _variable = [_theHouse, compile _statement, compile _condition]; - - _action = [(configName _x), _displayName, "", _fncStatement, _fncCondition, {}, _variable, _actionOffset, _maxDistance] call EFUNC(interact_menu,createAction); + _action = [(configName _x), _displayName, "", _fncStatement, _fncCondition, {}, [_theHouse, _statement, _condition], _actionOffset, _maxDistance] call EFUNC(interact_menu,createAction); [_helperObject, 0, [],_action] call EFUNC(interact_menu,addActionToObject); } foreach configproperties [(_configPath >> "UserActions")]; }; }; }; - } forEach nearestObjects [ace_player, ["Static"], 25]; + //Need to scan fairly far, because houses are big. You can be 25m from center of building but right next to a door. + } forEach nearestObjects [ace_player, ["Static"], 30]; _args set [0, (getPosASL ace_player)]; }; From c6b4a57ee2d938f9bee2e1a39a2bc54bd93a0a91 Mon Sep 17 00:00:00 2001 From: PabstMirror Date: Mon, 13 Apr 2015 23:11:18 -0500 Subject: [PATCH 04/86] Pull Icon from config --- .../functions/fnc_addHouseActions.sqf | 31 ++++++++++++++++--- 1 file changed, 26 insertions(+), 5 deletions(-) diff --git a/addons/interact_menu/functions/fnc_addHouseActions.sqf b/addons/interact_menu/functions/fnc_addHouseActions.sqf index 95037ae21b..9d3bc1bfc6 100644 --- a/addons/interact_menu/functions/fnc_addHouseActions.sqf +++ b/addons/interact_menu/functions/fnc_addHouseActions.sqf @@ -1,6 +1,7 @@ /* * Author: PabstMirror - * When interact_menu starts rendering (from "interact_keyDown" event) + * Scans for nearby "Static" objects (buildings) and adds the UserActions to them. + * Called when interact_menu starts rendering (from "interact_keyDown" event) * * Arguments: * Interact Menu Type (0 - world, 1 - self) @@ -23,7 +24,7 @@ if (_interactionType != 0) exitWith {}; if ((vehicle ACE_player) != ACE_player) exitWith {}; [{ - private ["_fncStatement", "_player", "_fncCondition", "_variable", "_theHouse", "_statement", "_condition", "_configPath", "_houseHelpers", "_displayName", "_position", "_maxDistance", "_helperObject", "_actionOffset", "_memPoint", "_object", "_count", "_helperPos", "_action"]; + private ["_fncStatement", "_player", "_fncCondition", "_variable", "_theHouse", "_statement", "_condition", "_configPath", "_houseHelpers", "_displayName", "_displayNameDefault", "_iconImage", "_position", "_maxDistance", "_helperObject", "_actionOffset", "_memPoint", "_object", "_count", "_helperPos", "_action"]; PARAMS_2(_args,_pfID); EXPLODE_3_PVT(_args,_setPosition,_addedHelpers,_housesScaned); @@ -61,6 +62,7 @@ if ((vehicle ACE_player) != ACE_player) exitWith {}; { _displayName = getText (_x >> "displayName"); + _displayNameDefault = getText (_x >> "displayNameDefault"); _position = getText (_x >> "position"); _condition = getText (_x >> "condition"); _statement = getText (_x >> "statement"); @@ -73,7 +75,26 @@ if ((vehicle ACE_player) != ACE_player) exitWith {}; _statement = compile _statement; _condition = compile _condition; - _maxDistance = _maxDistance + 1; //increase range slightly + _maxDistance = _maxDistance + 0.1; //increase range slightly + _iconImage = ""; + + if (_displayNameDefault != "") then { + //something like: ""; + + //find the end [.paa'] + _endIndex = _displayNameDefault find ".paa'"; + if (_endIndex == -1) exitWith {}; + _startIndex = _endIndex - 1; + _endIndex = _endIndex + 4; + //work backwards to find the starting ['] + while {(_startIndex > 0) && {_iconImage == ""}} do { + if ((_displayNameDefault select [_startIndex, 1]) == "'") then { + _startIndex = _startIndex + 1; + _iconImage = _displayNameDefault select [_startIndex, (_endIndex - _startIndex)]; + }; + _startIndex = _startIndex - 1; + }; + }; //Find a helper object, if one exists on the selection position _helperObject = objNull; @@ -82,7 +103,7 @@ if ((vehicle ACE_player) != ACE_player) exitWith {}; EXPLODE_3_PVT(_x,_memPoint,_object,_count); if (_memPoint == _position) exitWith { _helperObject = _object; - //make sure actions dont' overlap (although they are usualy mutually exclusive) + //make sure actions don't overlap (although they are usualy mutually exclusive) _actionOffset = [0,0,(_count * 0.1)]; _x set [2, (_count + 1)]; }; @@ -99,7 +120,7 @@ if ((vehicle ACE_player) != ACE_player) exitWith {}; TRACE_3("Making New Helper %1",_helperObject,_helperPos,_theHouse); }; - _action = [(configName _x), _displayName, "", _fncStatement, _fncCondition, {}, [_theHouse, _statement, _condition], _actionOffset, _maxDistance] call EFUNC(interact_menu,createAction); + _action = [(configName _x), _displayName, _iconImage, _fncStatement, _fncCondition, {}, [_theHouse, _statement, _condition], _actionOffset, _maxDistance] call EFUNC(interact_menu,createAction); [_helperObject, 0, [],_action] call EFUNC(interact_menu,addActionToObject); } foreach configproperties [(_configPath >> "UserActions")]; From 85beb72a3a6700a6d0cae67f4b0adcaaf1e169f0 Mon Sep 17 00:00:00 2001 From: PabstMirror Date: Mon, 13 Apr 2015 23:27:03 -0500 Subject: [PATCH 05/86] ASL Stuff --- addons/interact_menu/functions/fnc_addHouseActions.sqf | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/addons/interact_menu/functions/fnc_addHouseActions.sqf b/addons/interact_menu/functions/fnc_addHouseActions.sqf index 9d3bc1bfc6..1ed4eddedf 100644 --- a/addons/interact_menu/functions/fnc_addHouseActions.sqf +++ b/addons/interact_menu/functions/fnc_addHouseActions.sqf @@ -104,7 +104,7 @@ if ((vehicle ACE_player) != ACE_player) exitWith {}; if (_memPoint == _position) exitWith { _helperObject = _object; //make sure actions don't overlap (although they are usualy mutually exclusive) - _actionOffset = [0,0,(_count * 0.1)]; + _actionOffset = [0,0,(_count * 0.05)]; _x set [2, (_count + 1)]; }; } forEach _houseHelpers; @@ -113,8 +113,12 @@ if ((vehicle ACE_player) != ACE_player) exitWith {}; _helperObject = "Sign_Sphere25cm_F" createVehicleLocal (getpos _theHouse); _houseHelpers pushBack [_position, _helperObject, 1]; _helperPos = _theHouse modelToWorld (_theHouse selectionPosition _position); - //double check ASL/ATL bullshit - _helperObject setPos _helperPos; + //ASL/ATL bullshit: + if (surfaceIsWater _helperPos) then { + _helperObject setPosAslw _helperPos; + } else { + _helperObject setPos _helperPos; + }; _helperObject hideObject true; _addedHelpers pushBack _helperObject; TRACE_3("Making New Helper %1",_helperObject,_helperPos,_theHouse); From 1f13d229a8385b0d0ea6dde62bccb64a1300b774 Mon Sep 17 00:00:00 2001 From: PabstMirror Date: Wed, 15 Apr 2015 00:13:23 -0500 Subject: [PATCH 06/86] Stagger creating actions over time --- .../functions/fnc_addHouseActions.sqf | 206 ++++++++++-------- 1 file changed, 110 insertions(+), 96 deletions(-) diff --git a/addons/interact_menu/functions/fnc_addHouseActions.sqf b/addons/interact_menu/functions/fnc_addHouseActions.sqf index 1ed4eddedf..1e454ba258 100644 --- a/addons/interact_menu/functions/fnc_addHouseActions.sqf +++ b/addons/interact_menu/functions/fnc_addHouseActions.sqf @@ -24,9 +24,9 @@ if (_interactionType != 0) exitWith {}; if ((vehicle ACE_player) != ACE_player) exitWith {}; [{ - private ["_fncStatement", "_player", "_fncCondition", "_variable", "_theHouse", "_statement", "_condition", "_configPath", "_houseHelpers", "_displayName", "_displayNameDefault", "_iconImage", "_position", "_maxDistance", "_helperObject", "_actionOffset", "_memPoint", "_object", "_count", "_helperPos", "_action"]; + private ["_fncStatement", "_player", "_fncCondition", "_variable", "_theHouse", "_statement", "_condition", "_configPath", "_displayName", "_displayNameDefault", "_iconImage", "_position", "_maxDistance", "_helperObject", "_actionOffset", "_memPoint", "_object", "_count", "_helperPos", "_action"]; PARAMS_2(_args,_pfID); - EXPLODE_3_PVT(_args,_setPosition,_addedHelpers,_housesScaned); + EXPLODE_4_PVT(_args,_setPosition,_addedHelpers,_housesScaned,_houseBeingScaned); if (!EGVAR(interact_menu,keyDown)) then { {deleteVehicle _x;} forEach _addedHelpers; @@ -38,102 +38,116 @@ if ((vehicle ACE_player) != ACE_player) exitWith {}; //If player moved >5 meters from last pos, then rescan if (((getPosASL ace_player) distance _setPosition) < 5) exitWith {}; - _fncStatement = { - PARAMS_3(_target,_player,_variable); - EXPLODE_3_PVT(_variable,_theHouse,_statement,_condition); - this = _theHouse; //this feels dirty - call _statement; - }; - _fncCondition = { - PARAMS_3(_target,_player,_variable); - EXPLODE_3_PVT(_variable,_theHouse,_statement,_condition); - this = _theHouse; //this feels dirty - call _condition; - }; - - { - _theHouse = _x; - if (!(_theHouse in _housesScaned)) then { - _housesScaned pushBack _x; - if ((typeOf _theHouse) != "") then { - _configPath = (configFile >> "CfgVehicles" >> (typeOf _theHouse)); - if (isClass (_configPath >> "UserActions")) then { - _houseHelpers = []; - - { - _displayName = getText (_x >> "displayName"); - _displayNameDefault = getText (_x >> "displayNameDefault"); - _position = getText (_x >> "position"); - _condition = getText (_x >> "condition"); - _statement = getText (_x >> "statement"); - _maxDistance = getNumber (_x >> "radius"); - - if (_displayName == "") then {_displayName = (configName _x);}; - if (_position == "") then {ERROR("Bad Position");}; - if (_condition == "") then {_condition = "true";}; - if (_statement == "") then {ERROR("No Statement");}; - - _statement = compile _statement; - _condition = compile _condition; - _maxDistance = _maxDistance + 0.1; //increase range slightly - _iconImage = ""; - - if (_displayNameDefault != "") then { - //something like: ""; - - //find the end [.paa'] - _endIndex = _displayNameDefault find ".paa'"; - if (_endIndex == -1) exitWith {}; - _startIndex = _endIndex - 1; - _endIndex = _endIndex + 4; - //work backwards to find the starting ['] - while {(_startIndex > 0) && {_iconImage == ""}} do { - if ((_displayNameDefault select [_startIndex, 1]) == "'") then { - _startIndex = _startIndex + 1; - _iconImage = _displayNameDefault select [_startIndex, (_endIndex - _startIndex)]; - }; - _startIndex = _startIndex - 1; - }; - }; - - //Find a helper object, if one exists on the selection position - _helperObject = objNull; - _actionOffset = [0,0,0]; - { - EXPLODE_3_PVT(_x,_memPoint,_object,_count); - if (_memPoint == _position) exitWith { - _helperObject = _object; - //make sure actions don't overlap (although they are usualy mutually exclusive) - _actionOffset = [0,0,(_count * 0.05)]; - _x set [2, (_count + 1)]; - }; - } forEach _houseHelpers; - - if (isNull _helperObject) then { - _helperObject = "Sign_Sphere25cm_F" createVehicleLocal (getpos _theHouse); - _houseHelpers pushBack [_position, _helperObject, 1]; - _helperPos = _theHouse modelToWorld (_theHouse selectionPosition _position); - //ASL/ATL bullshit: - if (surfaceIsWater _helperPos) then { - _helperObject setPosAslw _helperPos; - } else { - _helperObject setPos _helperPos; - }; - _helperObject hideObject true; - _addedHelpers pushBack _helperObject; - TRACE_3("Making New Helper %1",_helperObject,_helperPos,_theHouse); - }; - - _action = [(configName _x), _displayName, _iconImage, _fncStatement, _fncCondition, {}, [_theHouse, _statement, _condition], _actionOffset, _maxDistance] call EFUNC(interact_menu,createAction); - [_helperObject, 0, [],_action] call EFUNC(interact_menu,addActionToObject); - - } foreach configproperties [(_configPath >> "UserActions")]; + // systemChat str _houseBeingScaned; + + if (_houseBeingScaned isEqualTo []) then { + _houseWasScaned = false; + { + _theHouse = _x; + if (!(_theHouse in _housesScaned)) exitWith { + _houseWasScaned = true; + _housesScaned pushBack _x; + if ((typeOf _theHouse) != "") then { + _configPath = (configFile >> "CfgVehicles" >> (typeOf _theHouse)); + if (isClass (_configPath >> "UserActions")) then { + _args set [3, [_theHouse, 0, []]]; + }; }; }; + // Need to scan fairly far, because houses are big. You can be 25m from center of building but right next to a door. + } forEach nearestObjects [ace_player, ["Static"], 30]; + if (!_houseWasScaned) then { + _args set [0, (getPosASL ace_player)]; }; - //Need to scan fairly far, because houses are big. You can be 25m from center of building but right next to a door. - } forEach nearestObjects [ace_player, ["Static"], 30]; + } else { + EXPLODE_3_PVT(_houseBeingScaned,_theHouse,_index,_houseHelpers); + _configPath = configFile >> "CfgVehicles" >> (typeOf _theHouse) >> "UserActions"; + if (_index < ((count _configPath) - 1)) then { + _actionPath = _configPath select _index; - _args set [0, (getPosASL ace_player)]; + _fncStatement = { + PARAMS_3(_target,_player,_variable); + EXPLODE_3_PVT(_variable,_theHouse,_statement,_condition); + this = _theHouse; //this feels dirty + call _statement; + }; + _fncCondition = { + PARAMS_3(_target,_player,_variable); + EXPLODE_3_PVT(_variable,_theHouse,_statement,_condition); + this = _theHouse; //this feels dirty + call _condition; + }; + + _displayName = getText (_actionPath >> "displayName"); + _displayNameDefault = getText (_actionPath >> "displayNameDefault"); + _position = getText (_actionPath >> "position"); + _condition = getText (_actionPath >> "condition"); + _statement = getText (_actionPath >> "statement"); + _maxDistance = getNumber (_actionPath >> "radius"); + + if (_displayName == "") then {_displayName = (configName _x);}; + if (_position == "") then {ERROR("Bad Position");}; + if (_condition == "") then {_condition = "true";}; + if (_statement == "") then {ERROR("No Statement");}; + + _statement = compile _statement; + _condition = compile _condition; + _maxDistance = _maxDistance + 0.1; //increase range slightly + _iconImage = ""; + + if (_displayNameDefault != "") then { + //something like: ""; + //find the end [.paa'] + _endIndex = _displayNameDefault find ".paa'"; + if (_endIndex == -1) exitWith {}; + _startIndex = _endIndex - 1; + _endIndex = _endIndex + 4; + //work backwards to find the starting ['] + while {(_startIndex > 0) && {_iconImage == ""}} do { + if ((_displayNameDefault select [_startIndex, 1]) == "'") then { + _startIndex = _startIndex + 1; + _iconImage = _displayNameDefault select [_startIndex, (_endIndex - _startIndex)]; + }; + _startIndex = _startIndex - 1; + }; + }; + + //Find a helper object, if one exists on the selection position + _helperObject = objNull; + _actionOffset = [0,0,0]; + { + EXPLODE_3_PVT(_x,_memPoint,_object,_count); + if (_memPoint == _position) exitWith { + _helperObject = _object; + //make sure actions don't overlap (although they are usualy mutually exclusive) + _actionOffset = [0,0,(_count * 0.05)]; + _x set [2, (_count + 1)]; + }; + } forEach _houseHelpers; + + if (isNull _helperObject) then { + _helperObject = "Sign_Sphere25cm_F" createVehicleLocal (getpos _theHouse); + _houseHelpers pushBack [_position, _helperObject, 1]; + _helperPos = _theHouse modelToWorld (_theHouse selectionPosition _position); + //ASL/ATL bullshit: + if (surfaceIsWater _helperPos) then { + _helperObject setPosAslw _helperPos; + } else { + _helperObject setPos _helperPos; + }; + _helperObject hideObject true; + _addedHelpers pushBack _helperObject; + TRACE_3("Making New Helper %1",_helperObject,_helperPos,_theHouse); + }; + + _action = [(configName _actionPath), _displayName, _iconImage, _fncStatement, _fncCondition, {}, [_theHouse, _statement, _condition], _actionOffset, _maxDistance] call EFUNC(interact_menu,createAction); + [_helperObject, 0, [],_action] call EFUNC(interact_menu,addActionToObject); + + _index = _index + 1; + _args set [3, [_theHouse, _index, _houseHelpers]]; + } else { + _args set [3, []]; + }; + }; }; -}, 0.1, [((getPosASL ace_player) vectorAdd [-100,0,0]), [], []]] call CBA_fnc_addPerFrameHandler; +}, 0, [((getPosASL ace_player) vectorAdd [-100,0,0]), [], [], []]] call CBA_fnc_addPerFrameHandler; From d2fdeb5e96d02b98614e5bce5c25ef6646739fa2 Mon Sep 17 00:00:00 2001 From: PabstMirror Date: Sat, 2 May 2015 00:13:09 -0500 Subject: [PATCH 07/86] Allow Skipping LOS Check (Because of doors) --- addons/interact_menu/functions/fnc_compileMenu.sqf | 2 +- addons/interact_menu/functions/fnc_compileMenuSelfAction.sqf | 2 +- addons/interact_menu/functions/fnc_createAction.sqf | 2 +- addons/interact_menu/functions/fnc_renderBaseMenu.sqf | 2 +- 4 files changed, 4 insertions(+), 4 deletions(-) diff --git a/addons/interact_menu/functions/fnc_compileMenu.sqf b/addons/interact_menu/functions/fnc_compileMenu.sqf index 7b995375b7..5b136a0298 100644 --- a/addons/interact_menu/functions/fnc_compileMenu.sqf +++ b/addons/interact_menu/functions/fnc_compileMenu.sqf @@ -83,7 +83,7 @@ _recurseFnc = { [], _position, _distance, - [_showDisabled,_enableInside,_canCollapse,_runOnHover], + [_showDisabled,_enableInside,_canCollapse,_runOnHover, false], _modifierFunction ], _children diff --git a/addons/interact_menu/functions/fnc_compileMenuSelfAction.sqf b/addons/interact_menu/functions/fnc_compileMenuSelfAction.sqf index e767c3525d..0f8b6302e9 100644 --- a/addons/interact_menu/functions/fnc_compileMenuSelfAction.sqf +++ b/addons/interact_menu/functions/fnc_compileMenuSelfAction.sqf @@ -67,7 +67,7 @@ _recurseFnc = { {}, [0,0,0], 10, //distace - [_showDisabled,_enableInside,_canCollapse,_runOnHover], + [_showDisabled,_enableInside,_canCollapse,_runOnHover, true], _modifierFunction ], _children diff --git a/addons/interact_menu/functions/fnc_createAction.sqf b/addons/interact_menu/functions/fnc_createAction.sqf index b26cb186f3..6845683044 100644 --- a/addons/interact_menu/functions/fnc_createAction.sqf +++ b/addons/interact_menu/functions/fnc_createAction.sqf @@ -68,7 +68,7 @@ _distance = if (count _this > 8) then { _params = if (count _this > 9) then { _this select 9 } else { - [false,false,false,false] + [false,false,false,false,false] }; _modifierFunction = if (count _this > 10) then { diff --git a/addons/interact_menu/functions/fnc_renderBaseMenu.sqf b/addons/interact_menu/functions/fnc_renderBaseMenu.sqf index 4daa4a5c90..cfc969bd8a 100644 --- a/addons/interact_menu/functions/fnc_renderBaseMenu.sqf +++ b/addons/interact_menu/functions/fnc_renderBaseMenu.sqf @@ -44,7 +44,7 @@ if (GVAR(openedMenuType) == 0 && vehicle ACE_player == ACE_player && if (_actualDistance > _distance) exitWith {true}; - if (_actualDistance > 1.0) exitWith { + if ((_actualDistance > 1.0) && {!((_actionData select 9) select 4)}) exitWith { // If distance to action is greater than 1.0 m, check LOS _line = [_headPos call EFUNC(common,positionToASL), _pos call EFUNC(common,positionToASL), _object, ACE_player]; lineIntersects _line From d4225e03d2e642379129c0e4354cf4b9578eae3e Mon Sep 17 00:00:00 2001 From: PabstMirror Date: Sat, 2 May 2015 23:13:35 -0500 Subject: [PATCH 08/86] Split into functions (for future caching) --- addons/interact_menu/XEH_clientInit.sqf | 2 +- addons/interact_menu/XEH_preInit.sqf | 7 +- .../functions/fnc_addHouseActions.sqf | 153 ------------------ .../fnc_userActions_addHouseActions.sqf | 101 ++++++++++++ .../fnc_userActions_getHouseActions.sqf | 90 +++++++++++ 5 files changed, 198 insertions(+), 155 deletions(-) delete mode 100644 addons/interact_menu/functions/fnc_addHouseActions.sqf create mode 100644 addons/interact_menu/functions/fnc_userActions_addHouseActions.sqf create mode 100644 addons/interact_menu/functions/fnc_userActions_getHouseActions.sqf diff --git a/addons/interact_menu/XEH_clientInit.sqf b/addons/interact_menu/XEH_clientInit.sqf index 8639483537..d59c6e912f 100644 --- a/addons/interact_menu/XEH_clientInit.sqf +++ b/addons/interact_menu/XEH_clientInit.sqf @@ -18,7 +18,7 @@ GVAR(ParsedTextCached) = []; addMissionEventHandler ["Draw3D", DFUNC(render)]; //Add Actions to Houses: -["interactMenuOpened", {_this call FUNC(addHouseActions)}] call EFUNC(common,addEventHandler); +["interactMenuOpened", {_this call FUNC(userActions_addHouseActions)}] call EFUNC(common,addEventHandler); // This spawn is probably worth keeping, as pfh don't work natively on the briefing screen and IDK how reliable the hack we implemented for them is. // The thread dies as soon as the mission start, so it's not really compiting for scheduler space. diff --git a/addons/interact_menu/XEH_preInit.sqf b/addons/interact_menu/XEH_preInit.sqf index 937904b471..9f12774567 100644 --- a/addons/interact_menu/XEH_preInit.sqf +++ b/addons/interact_menu/XEH_preInit.sqf @@ -4,7 +4,6 @@ ADDON = false; PREP(addActionToClass); PREP(addActionToObject); -PREP(addHouseActions); PREP(compileMenu); PREP(compileMenuSelfAction); PREP(collectActiveActionTree); @@ -26,6 +25,12 @@ PREP(renderSelector); PREP(setupTextColors); PREP(splitPath); + +PREP(userActions_addHouseActions); +PREP(userActions_getHouseActions); + + + GVAR(keyDown) = false; GVAR(keyDownSelfAction) = false; GVAR(keyDownTime) = 0; diff --git a/addons/interact_menu/functions/fnc_addHouseActions.sqf b/addons/interact_menu/functions/fnc_addHouseActions.sqf deleted file mode 100644 index 1e454ba258..0000000000 --- a/addons/interact_menu/functions/fnc_addHouseActions.sqf +++ /dev/null @@ -1,153 +0,0 @@ -/* - * Author: PabstMirror - * Scans for nearby "Static" objects (buildings) and adds the UserActions to them. - * Called when interact_menu starts rendering (from "interact_keyDown" event) - * - * Arguments: - * Interact Menu Type (0 - world, 1 - self) - * - * Return Value: - * Nothing - * - * Example: - * [0] call ace_interact_menu_fnc_addHouseActions - * - * Public: Yes - */ -#include "script_component.hpp" - -PARAMS_1(_interactionType); - -//Ignore self-interaction menu: -if (_interactionType != 0) exitWith {}; -//Ignore when mounted: -if ((vehicle ACE_player) != ACE_player) exitWith {}; - -[{ - private ["_fncStatement", "_player", "_fncCondition", "_variable", "_theHouse", "_statement", "_condition", "_configPath", "_displayName", "_displayNameDefault", "_iconImage", "_position", "_maxDistance", "_helperObject", "_actionOffset", "_memPoint", "_object", "_count", "_helperPos", "_action"]; - PARAMS_2(_args,_pfID); - EXPLODE_4_PVT(_args,_setPosition,_addedHelpers,_housesScaned,_houseBeingScaned); - - if (!EGVAR(interact_menu,keyDown)) then { - {deleteVehicle _x;} forEach _addedHelpers; - [_pfID] call CBA_fnc_removePerFrameHandler; - } else { - // Prevent Rare Error when ending mission with interact key down: - if (isNull ace_player) exitWith {}; - - //If player moved >5 meters from last pos, then rescan - if (((getPosASL ace_player) distance _setPosition) < 5) exitWith {}; - - // systemChat str _houseBeingScaned; - - if (_houseBeingScaned isEqualTo []) then { - _houseWasScaned = false; - { - _theHouse = _x; - if (!(_theHouse in _housesScaned)) exitWith { - _houseWasScaned = true; - _housesScaned pushBack _x; - if ((typeOf _theHouse) != "") then { - _configPath = (configFile >> "CfgVehicles" >> (typeOf _theHouse)); - if (isClass (_configPath >> "UserActions")) then { - _args set [3, [_theHouse, 0, []]]; - }; - }; - }; - // Need to scan fairly far, because houses are big. You can be 25m from center of building but right next to a door. - } forEach nearestObjects [ace_player, ["Static"], 30]; - if (!_houseWasScaned) then { - _args set [0, (getPosASL ace_player)]; - }; - } else { - EXPLODE_3_PVT(_houseBeingScaned,_theHouse,_index,_houseHelpers); - _configPath = configFile >> "CfgVehicles" >> (typeOf _theHouse) >> "UserActions"; - if (_index < ((count _configPath) - 1)) then { - _actionPath = _configPath select _index; - - _fncStatement = { - PARAMS_3(_target,_player,_variable); - EXPLODE_3_PVT(_variable,_theHouse,_statement,_condition); - this = _theHouse; //this feels dirty - call _statement; - }; - _fncCondition = { - PARAMS_3(_target,_player,_variable); - EXPLODE_3_PVT(_variable,_theHouse,_statement,_condition); - this = _theHouse; //this feels dirty - call _condition; - }; - - _displayName = getText (_actionPath >> "displayName"); - _displayNameDefault = getText (_actionPath >> "displayNameDefault"); - _position = getText (_actionPath >> "position"); - _condition = getText (_actionPath >> "condition"); - _statement = getText (_actionPath >> "statement"); - _maxDistance = getNumber (_actionPath >> "radius"); - - if (_displayName == "") then {_displayName = (configName _x);}; - if (_position == "") then {ERROR("Bad Position");}; - if (_condition == "") then {_condition = "true";}; - if (_statement == "") then {ERROR("No Statement");}; - - _statement = compile _statement; - _condition = compile _condition; - _maxDistance = _maxDistance + 0.1; //increase range slightly - _iconImage = ""; - - if (_displayNameDefault != "") then { - //something like: ""; - //find the end [.paa'] - _endIndex = _displayNameDefault find ".paa'"; - if (_endIndex == -1) exitWith {}; - _startIndex = _endIndex - 1; - _endIndex = _endIndex + 4; - //work backwards to find the starting ['] - while {(_startIndex > 0) && {_iconImage == ""}} do { - if ((_displayNameDefault select [_startIndex, 1]) == "'") then { - _startIndex = _startIndex + 1; - _iconImage = _displayNameDefault select [_startIndex, (_endIndex - _startIndex)]; - }; - _startIndex = _startIndex - 1; - }; - }; - - //Find a helper object, if one exists on the selection position - _helperObject = objNull; - _actionOffset = [0,0,0]; - { - EXPLODE_3_PVT(_x,_memPoint,_object,_count); - if (_memPoint == _position) exitWith { - _helperObject = _object; - //make sure actions don't overlap (although they are usualy mutually exclusive) - _actionOffset = [0,0,(_count * 0.05)]; - _x set [2, (_count + 1)]; - }; - } forEach _houseHelpers; - - if (isNull _helperObject) then { - _helperObject = "Sign_Sphere25cm_F" createVehicleLocal (getpos _theHouse); - _houseHelpers pushBack [_position, _helperObject, 1]; - _helperPos = _theHouse modelToWorld (_theHouse selectionPosition _position); - //ASL/ATL bullshit: - if (surfaceIsWater _helperPos) then { - _helperObject setPosAslw _helperPos; - } else { - _helperObject setPos _helperPos; - }; - _helperObject hideObject true; - _addedHelpers pushBack _helperObject; - TRACE_3("Making New Helper %1",_helperObject,_helperPos,_theHouse); - }; - - _action = [(configName _actionPath), _displayName, _iconImage, _fncStatement, _fncCondition, {}, [_theHouse, _statement, _condition], _actionOffset, _maxDistance] call EFUNC(interact_menu,createAction); - [_helperObject, 0, [],_action] call EFUNC(interact_menu,addActionToObject); - - _index = _index + 1; - _args set [3, [_theHouse, _index, _houseHelpers]]; - } else { - _args set [3, []]; - }; - }; - }; -}, 0, [((getPosASL ace_player) vectorAdd [-100,0,0]), [], [], []]] call CBA_fnc_addPerFrameHandler; diff --git a/addons/interact_menu/functions/fnc_userActions_addHouseActions.sqf b/addons/interact_menu/functions/fnc_userActions_addHouseActions.sqf new file mode 100644 index 0000000000..c53c5caa34 --- /dev/null +++ b/addons/interact_menu/functions/fnc_userActions_addHouseActions.sqf @@ -0,0 +1,101 @@ +/* + * Author: PabstMirror + * Scans for nearby "Static" objects (buildings) and adds the UserActions to them. + * Called when interact_menu starts rendering (from "interact_keyDown" event) + * + * Arguments: + * 0: Interact Menu Type (0 - world, 1 - self) + * + * Return Value: + * Nothing + * + * Example: + * [0] call ace_interact_menu_fnc_addHouseActions + * + * Public: Yes + */ +#include "script_component.hpp" + +PARAMS_1(_interactionType); + +//Ignore self-interaction menu: +if (_interactionType != 0) exitWith {}; +//Ignore when mounted: +if ((vehicle ACE_player) != ACE_player) exitWith {}; + +systemChat format ["starting %1", diag_tickTime]; + +[{ + private ["_fncStatement", "_player", "_fncCondition", "_variable", "_theHouse", "_statement", "_condition", "_configPath", "_displayName", "_displayNameDefault", "_iconImage", "_position", "_maxDistance", "_helperObject", "_actionOffset", "_memPoint", "_object", "_count", "_helperPos", "_action"]; + PARAMS_2(_args,_pfID); + EXPLODE_4_PVT(_args,_setPosition,_addedHelpers,_housesScaned,_houseBeingScaned); + + if (!EGVAR(interact_menu,keyDown)) then { + {deleteVehicle _x;} forEach _addedHelpers; + [_pfID] call CBA_fnc_removePerFrameHandler; + } else { + // Prevent Rare Error when ending mission with interact key down: + if (isNull ace_player) exitWith {}; + + //If player moved >5 meters from last pos, then rescan + if (((getPosASL ace_player) distance _setPosition) < 5) exitWith {}; + + //Make the common case fast (looking at a door): + if ((!isNull cursorTarget) && {cursorTarget isKindOf "Static"} && {!(cursorTarget in _housesScaned)}) then { + _houseBeingScaned = cursorTarget; + _housesScaned pushBack _houseBeingScaned; + }; + + if (isNull _houseBeingScaned) then { + _houseWasScaned = false; + _nearBuidlings = nearestObjects [ace_player, ["Static"], 30]; + { + _theHouse = _x; + if (!(_theHouse in _housesScaned)) exitWith { + _houseWasScaned = true; + _housesScaned pushBack _x; + if ((typeOf _theHouse) != "") then { + _configPath = (configFile >> "CfgVehicles" >> (typeOf _theHouse)); + if (isClass (_configPath >> "UserActions")) then { + _args set [3, _theHouse]; + }; + }; + }; + // Need to scan fairly far, because houses are big. You can be 25m from center of building but right next to a door. + } forEach _nearBuidlings; + + //If we finished scanning everything, update position + if (!_houseWasScaned) then { + systemChat format ["Pos Updated (stable): %1", diag_tickTime]; + _args set [0, (getPosASL ace_player)]; + }; + } else { + _actionSet = [(typeOf _houseBeingScaned)] call FUNC(userActions_getHouseActions); + EXPLODE_2_PVT(_actionSet,_memPoints,_memPointsActions); + + // systemChat format ["Add Actions for [%1] (%2)", _houseBeingScaned, (count _memPoints)]; + { + _helperObject = "Sign_Sphere25cm_F" createVehicleLocal (getpos _houseBeingScaned); + _addedHelpers pushBack _helperObject; + + _helperObject setVariable [QGVAR(building), _houseBeingScaned]; + + //ASL/ATL bullshit (note: attachTo doesn't work on buildings) + _helperPos = _houseBeingScaned modelToWorld (_houseBeingScaned selectionPosition _x); + if (surfaceIsWater _helperPos) then { + _helperObject setPosAslw _helperPos; + } else { + _helperObject setPos _helperPos; + }; + _helperObject hideObject true; + TRACE_3("Making New Helper",_helperObject,_x,_houseBeingScaned); + { + [_helperObject, 0, [], _x] call EFUNC(interact_menu,addActionToObject); + } forEach (_memPointsActions select _forEachIndex); + + } forEach _memPoints; + + _args set [3, objNull]; + }; + }; +}, 0, [((getPosASL ace_player) vectorAdd [-100,0,0]), [], [], objNull]] call CBA_fnc_addPerFrameHandler; diff --git a/addons/interact_menu/functions/fnc_userActions_getHouseActions.sqf b/addons/interact_menu/functions/fnc_userActions_getHouseActions.sqf new file mode 100644 index 0000000000..4b9977d590 --- /dev/null +++ b/addons/interact_menu/functions/fnc_userActions_getHouseActions.sqf @@ -0,0 +1,90 @@ +/* + * Author: PabstMirror + * Scans for nearby "Static" objects (buildings) and adds the UserActions to them. + * Called when interact_menu starts rendering (from "interact_keyDown" event) + * + * Arguments: + * 0: Building Classname + * + * Return Value: + * [[Array of MemPoints], [Array Of Actions]] + * + * Public: Yes + */ + #include "script_component.hpp" + + +PARAMS_1(_typeOfBuilding); + +_memPoints = []; +_memPointsActions = []; + +_configPath = configFile >> "CfgVehicles" >> _typeOfBuilding >> "UserActions"; + +_fncStatement = { + PARAMS_3(_target,_player,_variable); + EXPLODE_2_PVT(_variable,_actionStatement,_actionCondition); + this = _target getVariable [QGVAR(building), objNull]; + call _actionStatement; +}; +_fncCondition = { + PARAMS_3(_target,_player,_variable); + EXPLODE_2_PVT(_variable,_actionStatement,_actionCondition); + this = _target getVariable [QGVAR(building), objNull]; + call _actionCondition; +}; + +for "_index" from 0 to ((count _configPath) - 1) do { + _actionPath = _configPath select _index; + + _actionDisplayName = getText (_actionPath >> "displayName"); + _actionDisplayNameDefault = getText (_actionPath >> "displayNameDefault"); + _actionPosition = getText (_actionPath >> "position"); + _actionCondition = getText (_actionPath >> "condition"); + _actionStatement = getText (_actionPath >> "statement"); + _actionMaxDistance = getNumber (_actionPath >> "radius"); + + if (_actionDisplayName == "") then {_actionDisplayName = (configName _x);}; + if (_actionPosition == "") then {ERROR("Bad Position");}; + if (_actionCondition == "") then {_actionCondition = "true";}; + if (_actionStatement == "") then {ERROR("No Statement");}; + + _actionStatement = compile _actionStatement; + _actionCondition = compile _actionCondition; + _actionMaxDistance = _actionMaxDistance + 0.5; //increase range slightly + _iconImage = ""; + + //todo: extension? (~75% of time doing this string shit!) + if (_actionDisplayNameDefault != "") then { + //something like: ""; + //find the end [.paa'] + _endIndex = _actionDisplayNameDefault find ".paa'"; + if (_endIndex == -1) exitWith {}; + _startIndex = _endIndex - 1; + _endIndex = _endIndex + 4; + //work backwards to find the starting ['] + while {(_startIndex > 0) && {_iconImage == ""}} do { + if ((_actionDisplayNameDefault select [_startIndex, 1]) == "'") then { + _startIndex = _startIndex + 1; + _iconImage = _actionDisplayNameDefault select [_startIndex, (_endIndex - _startIndex)]; + }; + _startIndex = _startIndex - 1; + }; + }; + + _memPointIndex = _memPoints find _actionPosition; + _actionOffset = [0,0,0]; + if (_memPointIndex == -1) then { + _memPointIndex = count _memPoints; + _memPoints pushBack _actionPosition; + _memPointsActions pushBack []; + } else { + _actionOffset set [2, 0.05 * (count (_memPointsActions select _memPointIndex))]; + }; + + _action = [(configName _actionPath), _actionDisplayName, _iconImage, _fncStatement, _fncCondition, {}, [_actionStatement, _actionCondition], _actionOffset, _actionMaxDistance, [false,false,false,false,true]] call EFUNC(interact_menu,createAction); + (_memPointsActions select _memPointIndex) pushBack _action; + +}; + +[_memPoints, _memPointsActions] From 5147f9f584d7400b07f6a71aa39ecdb4dcfcd25e Mon Sep 17 00:00:00 2001 From: PabstMirror Date: Sun, 3 May 2015 00:33:20 -0500 Subject: [PATCH 09/86] Ladder Actions --- .../fnc_userActions_addHouseActions.sqf | 14 ++-- .../fnc_userActions_getHouseActions.sqf | 77 +++++++++++++++---- 2 files changed, 71 insertions(+), 20 deletions(-) diff --git a/addons/interact_menu/functions/fnc_userActions_addHouseActions.sqf b/addons/interact_menu/functions/fnc_userActions_addHouseActions.sqf index c53c5caa34..363e71e8d1 100644 --- a/addons/interact_menu/functions/fnc_userActions_addHouseActions.sqf +++ b/addons/interact_menu/functions/fnc_userActions_addHouseActions.sqf @@ -40,12 +40,14 @@ systemChat format ["starting %1", diag_tickTime]; //If player moved >5 meters from last pos, then rescan if (((getPosASL ace_player) distance _setPosition) < 5) exitWith {}; - //Make the common case fast (looking at a door): + //Make the common case fast (looking at a door): if ((!isNull cursorTarget) && {cursorTarget isKindOf "Static"} && {!(cursorTarget in _housesScaned)}) then { - _houseBeingScaned = cursorTarget; _housesScaned pushBack _houseBeingScaned; + if ((isClass (_configPath >> "UserActions")) || {(count (getArray (configFile >> "CfgVehicles" >> (typeOf _theHouse) >> "ladders"))) > 0}) then { + _houseBeingScaned = cursorTarget; + }; }; - + if (isNull _houseBeingScaned) then { _houseWasScaned = false; _nearBuidlings = nearestObjects [ace_player, ["Static"], 30]; @@ -56,7 +58,7 @@ systemChat format ["starting %1", diag_tickTime]; _housesScaned pushBack _x; if ((typeOf _theHouse) != "") then { _configPath = (configFile >> "CfgVehicles" >> (typeOf _theHouse)); - if (isClass (_configPath >> "UserActions")) then { + if ((isClass (_configPath >> "UserActions")) || {(count (getArray (configFile >> "CfgVehicles" >> (typeOf _theHouse) >> "ladders"))) > 0}) then { _args set [3, _theHouse]; }; }; @@ -85,9 +87,9 @@ systemChat format ["starting %1", diag_tickTime]; if (surfaceIsWater _helperPos) then { _helperObject setPosAslw _helperPos; } else { - _helperObject setPos _helperPos; + _helperObject setPosAtl _helperPos; }; - _helperObject hideObject true; + // _helperObject hideObject true; TRACE_3("Making New Helper",_helperObject,_x,_houseBeingScaned); { [_helperObject, 0, [], _x] call EFUNC(interact_menu,addActionToObject); diff --git a/addons/interact_menu/functions/fnc_userActions_getHouseActions.sqf b/addons/interact_menu/functions/fnc_userActions_getHouseActions.sqf index 4b9977d590..093d50751f 100644 --- a/addons/interact_menu/functions/fnc_userActions_getHouseActions.sqf +++ b/addons/interact_menu/functions/fnc_userActions_getHouseActions.sqf @@ -11,7 +11,7 @@ * * Public: Yes */ - #include "script_component.hpp" +#include "script_component.hpp" PARAMS_1(_typeOfBuilding); @@ -19,21 +19,35 @@ PARAMS_1(_typeOfBuilding); _memPoints = []; _memPointsActions = []; -_configPath = configFile >> "CfgVehicles" >> _typeOfBuilding >> "UserActions"; +//Get the offset for a memory point: +_fnc_getMemPointOffset = { + PARAMS_1(_memoryPoint); + _memPointIndex = _memPoints find _memoryPoint; + _actionOffset = [0,0,0]; + if (_memPointIndex == -1) then { + _memPoints pushBack _memoryPoint; + _memPointsActions pushBack []; + } else { + _actionOffset set [2, 0.05 * (count (_memPointsActions select _memPointIndex))]; + }; + _actionOffset +}; -_fncStatement = { +// Add UserActions for the building: +_fnc_userAction_Statement = { PARAMS_3(_target,_player,_variable); EXPLODE_2_PVT(_variable,_actionStatement,_actionCondition); this = _target getVariable [QGVAR(building), objNull]; call _actionStatement; }; -_fncCondition = { +_fnc_userAction_Condition = { PARAMS_3(_target,_player,_variable); EXPLODE_2_PVT(_variable,_actionStatement,_actionCondition); this = _target getVariable [QGVAR(building), objNull]; call _actionCondition; }; +_configPath = configFile >> "CfgVehicles" >> _typeOfBuilding >> "UserActions"; for "_index" from 0 to ((count _configPath) - 1) do { _actionPath = _configPath select _index; @@ -72,19 +86,54 @@ for "_index" from 0 to ((count _configPath) - 1) do { }; }; + _actionOffset = [_actionPosition] call _fnc_getMemPointOffset; _memPointIndex = _memPoints find _actionPosition; - _actionOffset = [0,0,0]; - if (_memPointIndex == -1) then { - _memPointIndex = count _memPoints; - _memPoints pushBack _actionPosition; - _memPointsActions pushBack []; - } else { - _actionOffset set [2, 0.05 * (count (_memPointsActions select _memPointIndex))]; - }; - _action = [(configName _actionPath), _actionDisplayName, _iconImage, _fncStatement, _fncCondition, {}, [_actionStatement, _actionCondition], _actionOffset, _actionMaxDistance, [false,false,false,false,true]] call EFUNC(interact_menu,createAction); + _action = [(configName _actionPath), _actionDisplayName, _iconImage, _fnc_userAction_Statement, _fnc_userAction_Condition, {}, [_actionStatement, _actionCondition], _actionOffset, _actionMaxDistance, [false,false,false,false,true]] call EFUNC(interact_menu,createAction); (_memPointsActions select _memPointIndex) pushBack _action; - }; +// Add Ladder Actions for the building: +_fnc_ladder_ladderUp = { + PARAMS_3(_target,_player,_variable); + EXPLODE_1_PVT(_variable,_ladderIndex); + _building = _target getVariable [QGVAR(building), objNull]; + ACE_player action ["LadderUp", _building, _ladderIndex, 0]; +}; +_fnc_ladder_ladderDown = { + PARAMS_3(_target,_player,_variable); + EXPLODE_1_PVT(_variable,_ladderIndex); + _building = _target getVariable [QGVAR(building), objNull]; + ACE_player action ["LadderUp", _building, (_variable select 0), 1]; +}; + +_ladders = getArray (configFile >> "CfgVehicles" >> _typeOfBuilding >> "ladders"); +{ + + + EXPLODE_2_PVT(_x,_ladderBottomMemPoint,_ladderTopMemPoint); + + _actionMaxDistance = 2; + + _actionDisplayName = "Climb Ladder Up"; + _iconImage = "\A3\ui_f\data\igui\cfg\actions\ladderup_ca.paa"; + //Ladder Up Action: + _actionOffset = [_ladderBottomMemPoint] call _fnc_getMemPointOffset; + _actionOffset = _actionOffset vectorAdd [0,0,1]; + _memPointIndex = _memPoints find _ladderBottomMemPoint; + _action = [format ["LadderUp_%1", _forEachIndex], _actionDisplayName, _iconImage, _fnc_ladder_ladderUp, {true}, {}, [_forEachIndex], _actionOffset, _actionMaxDistance, [false,false,false,false,true]] call EFUNC(interact_menu,createAction); + (_memPointsActions select _memPointIndex) pushBack _action; + + _actionDisplayName = "Climb Ladder Down"; + _iconImage = "\A3\ui_f\data\igui\cfg\actions\ladderdown_ca.paa"; + //Ladder Down Action: + _actionOffset = [_ladderTopMemPoint] call _fnc_getMemPointOffset; + _actionOffset = _actionOffset vectorAdd [0,0,1]; + _memPointIndex = _memPoints find _ladderTopMemPoint; + _action = [format ["LadderDown_%1", _forEachIndex], _actionDisplayName, _iconImage, _fnc_ladder_ladderDown, {true}, {}, [_forEachIndex], _actionOffset, _actionMaxDistance, [false,false,false,false,true]] call EFUNC(interact_menu,createAction); + (_memPointsActions select _memPointIndex) pushBack _action; + +} forEach _ladders; + + [_memPoints, _memPointsActions] From 5c556647abd03a6318fcd354f5ed3f36d4e0acad Mon Sep 17 00:00:00 2001 From: PabstMirror Date: Sun, 3 May 2015 02:06:49 -0500 Subject: [PATCH 10/86] Some Cleanup --- .../fnc_userActions_addHouseActions.sqf | 22 +++++++--------- .../fnc_userActions_getHouseActions.sqf | 26 ++++++++++--------- 2 files changed, 23 insertions(+), 25 deletions(-) diff --git a/addons/interact_menu/functions/fnc_userActions_addHouseActions.sqf b/addons/interact_menu/functions/fnc_userActions_addHouseActions.sqf index 363e71e8d1..f02f333cb5 100644 --- a/addons/interact_menu/functions/fnc_userActions_addHouseActions.sqf +++ b/addons/interact_menu/functions/fnc_userActions_addHouseActions.sqf @@ -26,7 +26,7 @@ if ((vehicle ACE_player) != ACE_player) exitWith {}; systemChat format ["starting %1", diag_tickTime]; [{ - private ["_fncStatement", "_player", "_fncCondition", "_variable", "_theHouse", "_statement", "_condition", "_configPath", "_displayName", "_displayNameDefault", "_iconImage", "_position", "_maxDistance", "_helperObject", "_actionOffset", "_memPoint", "_object", "_count", "_helperPos", "_action"]; + private["_helperObject", "_helperPos", "_houseWasScaned", "_nearBuidlings", "_theHouse"]; PARAMS_2(_args,_pfID); EXPLODE_4_PVT(_args,_setPosition,_addedHelpers,_housesScaned,_houseBeingScaned); @@ -40,10 +40,10 @@ systemChat format ["starting %1", diag_tickTime]; //If player moved >5 meters from last pos, then rescan if (((getPosASL ace_player) distance _setPosition) < 5) exitWith {}; - //Make the common case fast (looking at a door): + //Make the common case fast (cursorTarget is looking at a door): if ((!isNull cursorTarget) && {cursorTarget isKindOf "Static"} && {!(cursorTarget in _housesScaned)}) then { - _housesScaned pushBack _houseBeingScaned; - if ((isClass (_configPath >> "UserActions")) || {(count (getArray (configFile >> "CfgVehicles" >> (typeOf _theHouse) >> "ladders"))) > 0}) then { + _housesScaned pushBack cursorTarget; + if (((count (configFile >> "CfgVehicles" >> (typeOf cursorTarget) >> "UserActions")) > 0) || {(count (getArray (configFile >> "CfgVehicles" >> (typeOf cursorTarget) >> "ladders"))) > 0}) then { _houseBeingScaned = cursorTarget; }; }; @@ -57,8 +57,7 @@ systemChat format ["starting %1", diag_tickTime]; _houseWasScaned = true; _housesScaned pushBack _x; if ((typeOf _theHouse) != "") then { - _configPath = (configFile >> "CfgVehicles" >> (typeOf _theHouse)); - if ((isClass (_configPath >> "UserActions")) || {(count (getArray (configFile >> "CfgVehicles" >> (typeOf _theHouse) >> "ladders"))) > 0}) then { + if (((count (configFile >> "CfgVehicles" >> (typeOf _theHouse) >> "UserActions")) > 0) || {(count (getArray (configFile >> "CfgVehicles" >> (typeOf _theHouse) >> "ladders"))) > 0}) then { _args set [3, _theHouse]; }; }; @@ -68,7 +67,7 @@ systemChat format ["starting %1", diag_tickTime]; //If we finished scanning everything, update position if (!_houseWasScaned) then { - systemChat format ["Pos Updated (stable): %1", diag_tickTime]; + systemChat format ["Pos Updated (stable): %1 [count %2]", diag_tickTime, (count _addedHelpers)]; _args set [0, (getPosASL ace_player)]; }; } else { @@ -84,12 +83,9 @@ systemChat format ["starting %1", diag_tickTime]; //ASL/ATL bullshit (note: attachTo doesn't work on buildings) _helperPos = _houseBeingScaned modelToWorld (_houseBeingScaned selectionPosition _x); - if (surfaceIsWater _helperPos) then { - _helperObject setPosAslw _helperPos; - } else { - _helperObject setPosAtl _helperPos; - }; - // _helperObject hideObject true; + _helperObject setPosASL (_helperPos call EFUNC(common,positionToASL)); + + _helperObject hideObject true; TRACE_3("Making New Helper",_helperObject,_x,_houseBeingScaned); { [_helperObject, 0, [], _x] call EFUNC(interact_menu,addActionToObject); diff --git a/addons/interact_menu/functions/fnc_userActions_getHouseActions.sqf b/addons/interact_menu/functions/fnc_userActions_getHouseActions.sqf index 093d50751f..2915b15e50 100644 --- a/addons/interact_menu/functions/fnc_userActions_getHouseActions.sqf +++ b/addons/interact_menu/functions/fnc_userActions_getHouseActions.sqf @@ -1,7 +1,6 @@ /* * Author: PabstMirror - * Scans for nearby "Static" objects (buildings) and adds the UserActions to them. - * Called when interact_menu starts rendering (from "interact_keyDown" event) + * Scans the buidling type for UserActions and Ladder mount points. * * Arguments: * 0: Building Classname @@ -13,9 +12,10 @@ */ #include "script_component.hpp" - PARAMS_1(_typeOfBuilding); +private["_action", "_actionDisplayName", "_actionDisplayNameDefault", "_actionMaxDistance", "_actionOffset", "_actionPath", "_actionPosition", "_building", "_configPath", "_endIndex", "_iconImage", "_index", "_ladders", "_memPointIndex", "_memPoints", "_memPointsActions", "_startIndex"]; + _memPoints = []; _memPointsActions = []; @@ -98,39 +98,41 @@ _fnc_ladder_ladderUp = { PARAMS_3(_target,_player,_variable); EXPLODE_1_PVT(_variable,_ladderIndex); _building = _target getVariable [QGVAR(building), objNull]; - ACE_player action ["LadderUp", _building, _ladderIndex, 0]; + _player action ["LadderUp", _building, _ladderIndex, 0]; }; _fnc_ladder_ladderDown = { PARAMS_3(_target,_player,_variable); EXPLODE_1_PVT(_variable,_ladderIndex); _building = _target getVariable [QGVAR(building), objNull]; - ACE_player action ["LadderUp", _building, (_variable select 0), 1]; + _player action ["LadderUp", _building, (_variable select 0), 1]; +}; + +_fnc_ladder_conditional = { //Don't show actions if on a ladder + ((getNumber (configFile >> "CfgMovesMaleSdr" >> "States" >> (animationState _player) >> "onLadder")) == 0) }; _ladders = getArray (configFile >> "CfgVehicles" >> _typeOfBuilding >> "ladders"); { - - EXPLODE_2_PVT(_x,_ladderBottomMemPoint,_ladderTopMemPoint); _actionMaxDistance = 2; - _actionDisplayName = "Climb Ladder Up"; + _actionDisplayName = localize "str_action_ladderup"; _iconImage = "\A3\ui_f\data\igui\cfg\actions\ladderup_ca.paa"; //Ladder Up Action: _actionOffset = [_ladderBottomMemPoint] call _fnc_getMemPointOffset; _actionOffset = _actionOffset vectorAdd [0,0,1]; _memPointIndex = _memPoints find _ladderBottomMemPoint; - _action = [format ["LadderUp_%1", _forEachIndex], _actionDisplayName, _iconImage, _fnc_ladder_ladderUp, {true}, {}, [_forEachIndex], _actionOffset, _actionMaxDistance, [false,false,false,false,true]] call EFUNC(interact_menu,createAction); + _action = [format ["LadderUp_%1", _forEachIndex], _actionDisplayName, _iconImage, _fnc_ladder_ladderUp, _fnc_ladder_conditional, {}, [_forEachIndex], _actionOffset, _actionMaxDistance, [false,false,false,false,true]] call EFUNC(interact_menu,createAction); (_memPointsActions select _memPointIndex) pushBack _action; - _actionDisplayName = "Climb Ladder Down"; + _actionDisplayName = localize "str_action_ladderdown"; _iconImage = "\A3\ui_f\data\igui\cfg\actions\ladderdown_ca.paa"; //Ladder Down Action: _actionOffset = [_ladderTopMemPoint] call _fnc_getMemPointOffset; - _actionOffset = _actionOffset vectorAdd [0,0,1]; + _actionOffset = _actionOffset vectorAdd [0,0,0.25]; _memPointIndex = _memPoints find _ladderTopMemPoint; - _action = [format ["LadderDown_%1", _forEachIndex], _actionDisplayName, _iconImage, _fnc_ladder_ladderDown, {true}, {}, [_forEachIndex], _actionOffset, _actionMaxDistance, [false,false,false,false,true]] call EFUNC(interact_menu,createAction); + _action = [format ["LadderDown_%1", _forEachIndex], _actionDisplayName, _iconImage, _fnc_ladder_ladderDown, _fnc_ladder_conditional, {}, [_forEachIndex], _actionOffset, _actionMaxDistance, [false,false,false,false,true]] call EFUNC(interact_menu,createAction); (_memPointsActions select _memPointIndex) pushBack _action; } forEach _ladders; From bdc967d3a90237661960fb38e7e0c289757118c2 Mon Sep 17 00:00:00 2001 From: PabstMirror Date: Sun, 3 May 2015 13:44:02 -0500 Subject: [PATCH 11/86] Extension to parse text for image path --- ace_parse_imagepath.dll | Bin 0 -> 79872 bytes .../fnc_userActions_getHouseActions.sqf | 8 ++- extensions/CMakeLists.txt | 1 + extensions/parse_imagepath/CMakeLists.txt | 11 ++++ .../parse_imagepath/ace_parse_imagepath.cpp | 52 ++++++++++++++++++ 5 files changed, 69 insertions(+), 3 deletions(-) create mode 100644 ace_parse_imagepath.dll create mode 100644 extensions/parse_imagepath/CMakeLists.txt create mode 100644 extensions/parse_imagepath/ace_parse_imagepath.cpp diff --git a/ace_parse_imagepath.dll b/ace_parse_imagepath.dll new file mode 100644 index 0000000000000000000000000000000000000000..22bf816f3bb990ca0a6a6cc053d1df94b1ea762b GIT binary patch literal 79872 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

93(?pdF?12NGl1cHogfxt2=P5WhOlZu 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 eDo0"; //find the end [.paa'] @@ -84,8 +84,10 @@ for "_index" from 0 to ((count _configPath) - 1) do { }; _startIndex = _startIndex - 1; }; - }; - + }; */ + _iconImage = "ace_parse_imagepath" callExtension _actionDisplayNameDefault; + + _actionOffset = [_actionPosition] call _fnc_getMemPointOffset; _memPointIndex = _memPoints find _actionPosition; diff --git a/extensions/CMakeLists.txt b/extensions/CMakeLists.txt index 835cd30fd6..7ffee69dee 100644 --- a/extensions/CMakeLists.txt +++ b/extensions/CMakeLists.txt @@ -57,5 +57,6 @@ set(GLOBAL_SOURCES ${GLOBAL_RC}) add_subdirectory(fcs) add_subdirectory(break_line) add_subdirectory(advanced_ballistics) +add_subdirectory(parse_imagepath) message("Build Type: ${CMAKE_BUILD_TYPE}") \ No newline at end of file diff --git a/extensions/parse_imagepath/CMakeLists.txt b/extensions/parse_imagepath/CMakeLists.txt new file mode 100644 index 0000000000..67e0003752 --- /dev/null +++ b/extensions/parse_imagepath/CMakeLists.txt @@ -0,0 +1,11 @@ +set(ACE_EXTENSION_NAME "ace_parse_imagepath") + +file(GLOB SOURCES *.h *.hpp *.c *.cpp) +add_library( ${ACE_EXTENSION_NAME} SHARED ${GLOBAL_SOURCES} ${SOURCES}) +add_dependencies(${ACE_EXTENSION_NAME} ace_common) +SET_TARGET_PROPERTIES(${ACE_EXTENSION_NAME} PROPERTIES PREFIX "") + +if(CMAKE_COMPILER_IS_GNUCXX) + set_target_properties(${ACE_EXTENSION_NAME} PROPERTIES LINK_SEARCH_START_STATIC 1) + set_target_properties(${ACE_EXTENSION_NAME} PROPERTIES LINK_SEARCH_END_STATIC 1) +endif() \ No newline at end of file diff --git a/extensions/parse_imagepath/ace_parse_imagepath.cpp b/extensions/parse_imagepath/ace_parse_imagepath.cpp new file mode 100644 index 0000000000..86d41ca495 --- /dev/null +++ b/extensions/parse_imagepath/ace_parse_imagepath.cpp @@ -0,0 +1,52 @@ +/* + * ace_parse_imagepath.cpp + * Author: PabstMirror + * Gets raw image path from structured text input. + * + * Takes: + * Structured text that usualy has an image: + * Example: ""; + * + * Returns: + * Just the image path or "" if none + */ + +#include "ace_common.h" + +#include +#include + +extern "C" { + __declspec (dllexport) void __stdcall RVExtension(char *output, int outputSize, const char *function); +}; + +std::string getImagePathFromStructuredText(const std::string & input) { + std::string returnValue = ""; + std::size_t endIndex = input.find(".paa"); + std::size_t startIndex = endIndex - 1; + if ((endIndex != std::string::npos) && (endIndex > 1)) { + endIndex = endIndex + 4; + while ((startIndex > 0) && (returnValue == "")) { + if ((input[startIndex]) == '\'') { + returnValue = input.substr((startIndex + 1), (endIndex - startIndex - 1)); + }; + startIndex = startIndex - 1; + }; + }; + return returnValue; +} + +// i like to live dangerously. jk, fix strncpy sometime pls. +#pragma warning( push ) +#pragma warning( disable : 4996 ) + +void __stdcall RVExtension(char *output, int outputSize, const char *function) { + if (!strcmp(function, "version")) { + strncpy(output, ACE_FULL_VERSION_STR, outputSize); + } else { + strncpy(output, getImagePathFromStructuredText(function).c_str(), outputSize); + output[outputSize - 1] = '\0'; + } +} + +#pragma warning( pop ) From 6c5d72640c35bc1d978e95b6451a867f25d9a9ef Mon Sep 17 00:00:00 2001 From: PabstMirror Date: Mon, 4 May 2015 14:06:33 -0500 Subject: [PATCH 12/86] Caching, Optimzations --- addons/interact_menu/XEH_clientInit.sqf | 3 + .../fnc_userActions_addHouseActions.sqf | 72 +++++++++---------- .../fnc_userActions_getHouseActions.sqf | 13 +++- 3 files changed, 47 insertions(+), 41 deletions(-) diff --git a/addons/interact_menu/XEH_clientInit.sqf b/addons/interact_menu/XEH_clientInit.sqf index d59c6e912f..64b20dbb74 100644 --- a/addons/interact_menu/XEH_clientInit.sqf +++ b/addons/interact_menu/XEH_clientInit.sqf @@ -3,6 +3,9 @@ if (!hasInterface) exitWith {}; +GVAR(cachedBuildingTypes) = []; +GVAR(cachedBuildingActionPairs) = []; + GVAR(ParsedTextCached) = []; //Setup text/shadow/size/color settings matrix diff --git a/addons/interact_menu/functions/fnc_userActions_addHouseActions.sqf b/addons/interact_menu/functions/fnc_userActions_addHouseActions.sqf index f02f333cb5..deb7c839ca 100644 --- a/addons/interact_menu/functions/fnc_userActions_addHouseActions.sqf +++ b/addons/interact_menu/functions/fnc_userActions_addHouseActions.sqf @@ -23,12 +23,10 @@ if (_interactionType != 0) exitWith {}; //Ignore when mounted: if ((vehicle ACE_player) != ACE_player) exitWith {}; -systemChat format ["starting %1", diag_tickTime]; - [{ - private["_helperObject", "_helperPos", "_houseWasScaned", "_nearBuidlings", "_theHouse"]; + private ["_nearBuidlings", "_typeOfHouse", "_houseBeingScaned", "_actionSet", "_memPoints", "_memPointsActions", "_helperPos", "_helperObject"]; PARAMS_2(_args,_pfID); - EXPLODE_4_PVT(_args,_setPosition,_addedHelpers,_housesScaned,_houseBeingScaned); + EXPLODE_4_PVT(_args,_setPosition,_addedHelpers,_housesScaned,_housesToScanForActions); if (!EGVAR(interact_menu,keyDown)) then { {deleteVehicle _x;} forEach _addedHelpers; @@ -37,63 +35,61 @@ systemChat format ["starting %1", diag_tickTime]; // Prevent Rare Error when ending mission with interact key down: if (isNull ace_player) exitWith {}; - //If player moved >5 meters from last pos, then rescan - if (((getPosASL ace_player) distance _setPosition) < 5) exitWith {}; - //Make the common case fast (cursorTarget is looking at a door): if ((!isNull cursorTarget) && {cursorTarget isKindOf "Static"} && {!(cursorTarget in _housesScaned)}) then { - _housesScaned pushBack cursorTarget; if (((count (configFile >> "CfgVehicles" >> (typeOf cursorTarget) >> "UserActions")) > 0) || {(count (getArray (configFile >> "CfgVehicles" >> (typeOf cursorTarget) >> "ladders"))) > 0}) then { - _houseBeingScaned = cursorTarget; + _housesToScanForActions = [cursorTarget]; + } else { + _housesScaned pushBack cursorTarget; }; }; - if (isNull _houseBeingScaned) then { - _houseWasScaned = false; + //For performance, we only do 1 thing per frame, + //-either do a wide scan and search for houses with actions + //-or scan one house at a time and add the actions for that house + + if (_housesToScanForActions isEqualTo []) then { + //If player moved >2 meters from last pos, then rescan + if (((getPosASL ace_player) distance _setPosition) < 2) exitWith {}; + _nearBuidlings = nearestObjects [ace_player, ["Static"], 30]; { - _theHouse = _x; - if (!(_theHouse in _housesScaned)) exitWith { - _houseWasScaned = true; + _typeOfHouse = typeOf _x; + if (((count (configFile >> "CfgVehicles" >> _typeOfHouse >> "UserActions")) == 0) && {(count (getArray (configFile >> "CfgVehicles" >> _typeOfHouse >> "ladders"))) == 0}) then { _housesScaned pushBack _x; - if ((typeOf _theHouse) != "") then { - if (((count (configFile >> "CfgVehicles" >> (typeOf _theHouse) >> "UserActions")) > 0) || {(count (getArray (configFile >> "CfgVehicles" >> (typeOf _theHouse) >> "ladders"))) > 0}) then { - _args set [3, _theHouse]; - }; - }; + } else { + _housesToScanForActions pushBack _x; }; - // Need to scan fairly far, because houses are big. You can be 25m from center of building but right next to a door. - } forEach _nearBuidlings; + } forEach (_nearBuidlings - _housesScaned); - //If we finished scanning everything, update position - if (!_houseWasScaned) then { - systemChat format ["Pos Updated (stable): %1 [count %2]", diag_tickTime, (count _addedHelpers)]; - _args set [0, (getPosASL ace_player)]; - }; + _args set [0, (getPosASL ace_player)]; } else { - _actionSet = [(typeOf _houseBeingScaned)] call FUNC(userActions_getHouseActions); + _houseBeingScaned = _housesToScanForActions deleteAt 0; + _typeOfHouse = typeOf _houseBeingScaned; + //Skip this house for now if we are outside of it's radius + //(we have to scan far out for the big houses, but we don't want to waste time adding actions on every little shack) + if ((_houseBeingScaned != cursorTarget) && {((ACE_player distance _houseBeingScaned) - ((sizeOf _typeOfHouse) / 2)) > 4}) exitWith {}; + + _housesScaned pushBack _houseBeingScaned; + + _actionSet = [_typeOfHouse] call FUNC(userActions_getHouseActions); EXPLODE_2_PVT(_actionSet,_memPoints,_memPointsActions); - // systemChat format ["Add Actions for [%1] (%2)", _houseBeingScaned, (count _memPoints)]; + systemChat format ["Add Actions for [%1] (count %2) @ %3", _typeOfHouse, (count _memPoints), diag_tickTime]; { - _helperObject = "Sign_Sphere25cm_F" createVehicleLocal (getpos _houseBeingScaned); + _helperPos = (_houseBeingScaned modelToWorld (_houseBeingScaned selectionPosition _x)) call EFUNC(common,positionToASL); + _helperObject = "Sign_Sphere25cm_F" createVehicleLocal _helperPos; _addedHelpers pushBack _helperObject; - _helperObject setVariable [QGVAR(building), _houseBeingScaned]; - - //ASL/ATL bullshit (note: attachTo doesn't work on buildings) - _helperPos = _houseBeingScaned modelToWorld (_houseBeingScaned selectionPosition _x); - _helperObject setPosASL (_helperPos call EFUNC(common,positionToASL)); - + _helperObject setPosASL _helperPos; _helperObject hideObject true; TRACE_3("Making New Helper",_helperObject,_x,_houseBeingScaned); + { [_helperObject, 0, [], _x] call EFUNC(interact_menu,addActionToObject); } forEach (_memPointsActions select _forEachIndex); } forEach _memPoints; - - _args set [3, objNull]; }; }; -}, 0, [((getPosASL ace_player) vectorAdd [-100,0,0]), [], [], objNull]] call CBA_fnc_addPerFrameHandler; +}, 0, [((getPosASL ace_player) vectorAdd [-100,0,0]), [], [], []]] call CBA_fnc_addPerFrameHandler; diff --git a/addons/interact_menu/functions/fnc_userActions_getHouseActions.sqf b/addons/interact_menu/functions/fnc_userActions_getHouseActions.sqf index 7986e4dd5e..acc350059b 100644 --- a/addons/interact_menu/functions/fnc_userActions_getHouseActions.sqf +++ b/addons/interact_menu/functions/fnc_userActions_getHouseActions.sqf @@ -16,6 +16,9 @@ PARAMS_1(_typeOfBuilding); private["_action", "_actionDisplayName", "_actionDisplayNameDefault", "_actionMaxDistance", "_actionOffset", "_actionPath", "_actionPosition", "_building", "_configPath", "_endIndex", "_iconImage", "_index", "_ladders", "_memPointIndex", "_memPoints", "_memPointsActions", "_startIndex"]; +_searchIndex = GVAR(cachedBuildingTypes) find _typeOfBuilding; +if (_searchIndex != -1) exitWith {GVAR(cachedBuildingActionPairs) select _searchIndex}; + _memPoints = []; _memPointsActions = []; @@ -65,10 +68,10 @@ for "_index" from 0 to ((count _configPath) - 1) do { _actionStatement = compile _actionStatement; _actionCondition = compile _actionCondition; - _actionMaxDistance = _actionMaxDistance + 0.5; //increase range slightly + _actionMaxDistance = _actionMaxDistance + 0.1; //increase range slightly _iconImage = ""; -/* //todo: extension? (~75% of time doing this string shit!) + /* if (_actionDisplayNameDefault != "") then { //something like: ""; //find the end [.paa'] @@ -85,8 +88,9 @@ for "_index" from 0 to ((count _configPath) - 1) do { _startIndex = _startIndex - 1; }; }; */ + //extension ~4x as fast: _iconImage = "ace_parse_imagepath" callExtension _actionDisplayNameDefault; - + _actionOffset = [_actionPosition] call _fnc_getMemPointOffset; _memPointIndex = _memPoints find _actionPosition; @@ -139,5 +143,8 @@ _ladders = getArray (configFile >> "CfgVehicles" >> _typeOfBuilding >> "ladders" } forEach _ladders; +GVAR(cachedBuildingTypes) pushBack _typeOfBuilding; +GVAR(cachedBuildingActionPairs) pushBack [_memPoints, _memPointsActions]; + [_memPoints, _memPointsActions] From e78c2fd6767c0713da44dacb6f28d3bb5295f20e Mon Sep 17 00:00:00 2001 From: PabstMirror Date: Sun, 17 May 2015 04:05:43 -0500 Subject: [PATCH 13/86] Extension framework changes --- ace_parse_imagepath.dll | Bin 79872 -> 80896 bytes addons/interact_menu/config.cpp | 2 +- extensions/parse_imagepath/CMakeLists.txt | 7 ++++--- .../parse_imagepath/ace_parse_imagepath.cpp | 4 +++- 4 files changed, 8 insertions(+), 5 deletions(-) diff --git a/ace_parse_imagepath.dll b/ace_parse_imagepath.dll index 22bf816f3bb990ca0a6a6cc053d1df94b1ea762b..33264959a89442ab3525565164ae539d80e3ef45 100644 GIT binary patch delta 13124 zcmd^_k6#?s-S6il%a0HUn*`#9K-eV2kc7mA-DOuG>_#D?VzMeGB*h2@;wB-0uvl!- zMM;!MqS!&fii$$}(3VW4ekDRV7OMVs!8#G4zANrB%UVMy2lb$Ne|AN&Z_Uqh<>6~wPht>? z!ci2RTC`xp#;dXB{n=&h(t^U`0}4l=fFmhd7}xpwf+-<})lQ97yrWKN{+BjNXlw5X zu6=8FZF%5BAC5(K{@rhCVfe73_4EfQiZfs4&d6NlusXfyV=>(Mx1ch*=)5~PT7*$r z`|ERx;whc+dJk(3E6%iG^{J4Zl#hob$Rk}9Y9)1qzDN2*_zGP&P0ouB(!M)tCwABV zXs=E?b%FY=hzqJ zJN}RI99bS2J=gwfSzfzcbG*0Que)(ry|}bRM5_-h+p@IFCbWtx;BbKF#y~|m@7JZi zy38rM)R^U&qF%jsd6bPlJb$6=#rhPXJ>Kiq7<;em%4m_6r)8m{)TEDB7tAQt+hkV@ zd|jn*VLWDyqExT%Qh&8PRYZ3Nhb@-Vt_#17^ho$R(kH^NTJ?^c^_jU@pFKOzyK?AV z(dyaoo$khMLVF^lUZ&x7GL1SZQ*(_>w;dxrcrv`hhmckuqN;rGtMp-gg%4X?py>&} zHc*?cv^4psX=#S1(gR!CrG0#qU^(yS;lzX@lou)7qHSr#Jnz>?x=5q+p7(3=70an= zo68;6WFP5O&R4aouddig`2J~yOLVLIuKJ1SQG;{_&NNxKGpvW%@eFQLl)cA$U7Cd6 zD|?&+>T|l)RO->`#ejNAcQw~Uv$B3kH&q`McgjGl+BU3yf92K)*}D3JXs-O*1J%>s zaxPc0qFh<*>{0)=@>kI#6nn#ChKOFL%zJilGw$u{9wXn^?NQ&2SSwDdpG6qNq`Gz0 zc;qDh{oknl)17_Q>t$Z)yM6cTjZs4TYGahTHFCYb%r-}5NL(u7c_M625#jf^kAD8&S zb>9(IHRbwd5vyLhK9cS}y?)=~3yRj6A`|-s^{zCt&vr;V>w@}1n$>4JrCoSI{X^O{ zKD$!dRTtFA^i-c+FYTraYC-yJd7HF5Xg_CnOS|`idU4Jkl=koib@`42U;8m>doHMs z9oreqVtW66AOsy%$pC1?#@?k_6Xwkgb`ArU@xuus<#cQKfNu%e-NW(r1LMg9Tt%zQcGrU%w4 z$$rCXNmkg^va;vfa-BJlt7v~VB+WuhuUR(rB>1w!>JPJwoYUp3{bICp+a1p>h{#T- z^r4Tv-VV{{8?>kBbJh$^j7Oc?bK>?KS-ggan%A65*7(T@v(L4}=Q80s;VbZb#@u+# zR-Z$e|#gCG%)8TJh$ikOI%iW-T4IR`*;38WUD9kx05E`^$6)}cikT` z%{k8t5NoiaFxxt>pFwrx#%-0w4sUn~7eUVD?pm|qy7}=kM){ZVVo-mW8?kJziObi7 zo4sPKdLg&MWTIWIf2~q$KrwpizxRgnu6r6uz#Pjzpw<8ZJuMSVE$B{vgrXWxq* zvuK}%oS?aDTRovYb<5;o#p9kPw%2FSi^BD;p8mXi*?B){ash~=CdP9mu6p{j|L&fa z?(pjAnQ|TuQ(rY;j8zZJD6XK+mb-%%u5rk2%aRr|69fYz&0gF2 z>w<0}GCCi<=jjEaOY=hb?uR> z7LRkGYh=P2kapx|pIs+y)`0KM*^Sa>4Vav>o2AVfu%mFNuYQ}fSp!}u+~c!5q}@HP zilYzs>;Y*HjjJb)-o(g;k6z8C|JTu|=r+bzKDNJur;RtfgLydK+Y)>I>>^#gK3269 z?Gy&}k)oSOe_ND98eIIKC{$~U*AZYpDbBVUs7XuRCKFj#;Gn;Jbm3giK#n z|8TF(E`6S)_qa#P1Aiu~d$!COvI~!X&X7HLmSf!6=Xq>`xabY+I~?ciUfY>hdc6p` ztZ0K5E<6&Vysy4o_H&V?7P)k!kGj^A{@8U!Rvtf zrCg_(?&{Bj%SXJvik{~_khejh8d8yvQo)p;&wZIE8Kb>;CuJBWOshM;^hTmox17UW|7^Q`|W!)tTqGge9|pd*9os$ zQuQF|->c%p-_*#5UZv{DL#fvr==a0}W7nn!Rz_cIdQC<|dAw(eTjqquXEBRmhlBT@ zC?7wcK7-rq3FrR2(*B}sS>0=IF{pbVjwRS0et4}}Hs>^F*AibO+%8`V_8kAD;+|x) zY*BVs?YY{|nX$88|05$z+G_^&;=|i%zp8pyxUWWZ?b+%NY-gwakGx6waf9lvzGb!~ z^6MoZRA1ygUOg7&FX#D1r+WF=UvUf`kIs^p(3S0*|5{B4QGa8tJ@~9Aq)oV1_`F_I zhi95Mn!W7NTnoMF<6qSM>Qa4K@5tLs`iq5~wnu6g232yEsTYVvO;^b?T-f(L5RnlEm zY1pWg%ROhrsq`6#Z+zLFLgTRkRRhjx4J`-cpk-*`_v;Cl~{HB`-$@6zx4Prg9v{?0kl z9jbhvP*qz%J*TR;64d9^IMuKITA@>I^*T|dX0yxJsZZCh+oTiPZf-GNDXL`M(BmCJ zigGH%ktDQdR^j*jV6md?ssF*ytf<~4>f}?EjOysqEn;2g(uOU9!Py#bUPIM`p|RomSw>aO za=l@eW_zgmqsFL3VZK`3TCMuq#=L81%SL3oF<*W!$KU(j!O-ltq;C@6M?O1ti(|I@ zWBfnN4ONdk6D_oA?K3+>sQSBSHr_hhQ~2yrv(6q2-TlT#p>GT+2Sb1HhEhGvd)g(x zZYuSi`H(yG%C3W<%Y2nT3f(_MKBR-PGrX!PS4`4u4(-hR?n1$=I-WID}fYIW12q>GXM*NFR`9}Us0RGrPm!N+7U?B3(jdd+p} zADeF#D^>H0yW;5OLk-XO^XX$@vd5QB+%h_s|4?qL&Zm#cj&SK$svR$`rrB>^ypD9) zOKDcw_@dmxrH>h8{#Ubkpa1M^K1TZg)0ZEWQAyR9mFnX!wbF&L<)DaBzuO}3*uj?P z{x5gzUTVDCnn#-Qy+dMU=l8$I`|!%npML-2#UiG&?Wd0|jFN9oip%1A%@3>|pS~0s z^HFG=Cgx2deM;T+%G+Y9bKPm90DHPKg@{sHf98nf6TpX>O0TyzD<<&Nb-}eaO&A9} z0oh(}_mI9*d*&a)y-99<6lDcpV>Y2wv=6z^W2hOOK|^R9eS(5E2qgl=AuGy2`_X;q z5%e-Tg9gwAG=~0$lvtrGLz~cbXdiMrNghP?=!fVP^ah$2qqqO**(!8VkZ|1qn^m%iY3h)22T0#C+Une^p>57tG zT3TFGP+U&U(nBui(E`_@1N!2Ug3>R$Q z7=Zrn`}N-{C@t0(m+Fh%U-Y9dEhsB5bR8A}L{Z!!$uKyJ*;RFoSF z3k&YyWDXUTxk}3q_)g}Af+7Y|$k_8al&e^ur$10!T3TKrOJz?C3r~K5Jen*n(&xEc z1xHI<(kiHM7aU*)_3}&QRyl3Ar{Az!xv}WJyuw5I`n&@N3d+i4#iIpBi%ajHKXr%j zm)3s#hVHf$%s_f7`bT0=Z|9o}6IN^JI(;*KQJDX)@Hp&SvFDqcS z`G0o48FtzIWz2)vs@h=1RE7aTC>t9h@*@oo3<*P=;Zer;8JgwSS0DcawllvQ8l zPtMEBF^pp0xkk~(M5>>@wswj9CMG|Yjy&koYH|NQ0#@y@4j9v+#`y% z6}6*o)Q^VHD4IaiNV&*OgTjy=*|`Vepb4c&8>OKPl!+WD3uU8xOGg+wUU%Y9=H}UuIiY+Gmq57# zsDOU32KvJ~$Y*1v5y};`87_itknNw+0p-Hk4f#N!^uiE00GGfaD1TEJfpVE2gS?O` zZV#DdWG3NqI1R&~@`<9AuN{FR|+og>u(vfRWG&qo5tGh8Zv#I-nkA z!!1rq6}%eOzzwhtZiJ0+6KsZ?VH=Et9dHZmhS$Jemv%J^Rn!|;beJq(9& za0RqN9ZZ8Op#w(19JmTPVI*|HC|Cto!;>%?Hcqnu=*hI=SOYuYTG#{E!2uWphv9lS z2Cs$_a08r%8=>aEhzY2Ln_(o3gRyW6w8Lv)CQN|Y&;;}U%dKeTFEJ%J5@98@z#3?U z_3&EQ43l6xOorVs74}0L9D;T@3b#WKydF-$G#LD;qD_Z7xC6$(8=%2W=0-9p@Fti6 zZ-!Yg6XwF5un_Ko70>~X!P{UR+zp%H9@qx=!ERUp2jCGn0t=xBJ_M(rU?FiU|01Z! z$n`D&24gRRIv50FU@$a5x$>mIW{_DxXsx!$9C77zu-5 zEKG(bSsu%PWI1%ma+m|%B90Ns0_c(junGzT_o?*5M(KyG(r@B6m44VG{cu3~t<0FT z;h3~jm@#R?X=&S;F)udMN~SSTud+cKl)*@)Ba@LzI=Ek>I@Ez!Zzk^fo2T%zR z+Mj`7*bjAZ6uM)`$VY+!4#E`pbC>}KpnL|&XH*vUv#<~zfhG9mL+=>&0qA7FybdaL z*vx~{1RsEH@H8x;T)y`7V)OFh+XZOk%{qufK6^&sqp*&Oa+@%Y%{=Qp&VFq>!$5*n*{0c`dY=?#L zO;`cH1CPNounztLHo-2~1~0%aI0Sp)&2SL*!V&m3?BIZl;5hbg;Uv5SXW;MU!!dA? z(7px3;D16rJPYICFtox}mO2 z-RH>2eaSjFfI~jD<$go%M~1NrVI#KOw~S#sWjSXQ1ShaFq1=DS_nT?#GAMUyi=ie+ zXzQUCeh)^%mtict1)73{Tl)$bJB}VG_YtWu6T1e={fOM?WMj*jl3TxEn2#;@BXYwd zH%2AcE*Oi=GNe>u{{+^+eQ=0&A+R2M7i^~&bL-1B8x0>=k9mT#)`srtj^kbJoxdDrZQ`i;I$_XVwWwFpc3?}7fc_|sW zbF#r;3QoXCcsrCkw*(lAeLt+jUJp&!_rMzL7-+{n2s7d1uowSkn2miD=EG{};5gf0 z3HBq)|(HGc1Sg@D3<9)yrTv_S3K*X2BuY02TUK4o0z0 zK^@0QgdXe%VIbvU^8TN~u^WdLM>tf1`EgMKHbNad31i_4&f{B$5(R5JOk}CTm@a&--T81PN;Au zMsO1QTTpJU?XVI1F&K+&g>BeX(13j{?81HsX3%dW?8V*>2VoI(;CDxn8NqQE)Y8xl z$FVD+lL~q`iG4TB#$F9)uybJ`^-Yp|W`7>);kRKk^)^5&_92)Ci=hK9gt_n!uw;qY zpsgcQiQ`3B1AhwZ;SXUm+yUE{bUys|pD$k=DSS(}{5J#*cLj*>2E!^5aIigDXiNB_ zK}Fx6Ag#i#ne)l=xgtgW&M)(JG{24X)lsi|UOx-)4PX!Z`fB*~LJ_@XUa@R4KoiZX zuez5_!m#zICZZuiBckKy70V``WR{e9KHr33m!P?3hyP8pK)$;)f2~;ucJEis&d|&~ zuZlccEX^k8`Q+RvavISW<&yGm{@l!OBg^dcW1VXwZ8_=;>})hUKePP_d&60cxN7VC zy0X5L_BHd`%ZX~lZbeMg^L`>)M4o=#PZ-4_{wb0y4qn~xslQkkjwySPfAXmE4BDa^ z5(31!1*=6vUKC-#retXd-^FFKldx@d!(##Bz*4fZiNcRA{j=`R1H|T~n9`l{l{+a= zJgS>>55w6`W)Ey{*d8dBH%tVI53bS+?OH!|r94hMc{!FI*pM3_!Www|Z46m6I|>7A zTYY+KkXW&B(-;3Pvy^{%DVuyDCw3t!K?-;NV=)ayA>x`f(wzIt;j?z&5Vz<&--DYP zUJntg{(t|>fBN@J#74iCu?6DkFtL6?lrI)mp0{CXcUeASt-&^keNa=Nb^70 zHlZ*SiDHlmWuPoX18puWL=~t8HKBIYi-yrC8b{Me&sP}vB}NX~{vjvOux1r^2zOzi zT#?Izt}y7oG6CkfYcjA(R0+Qleq=6bxFt%QzR|@md;c%F=l-UzW$#4&f2)RDRtu|} zAME6FO#W~upS}9TeyIq+YZg@FbtP;Zw zZ$-0~4mbQ|7D0Luy>ebV*Zn00cO5D^SUlV2I=$E+hEE^Xi^PQ?7R9RMD+S5{#jNBv z{CJ(X=4-AG*NMBn=DH(BToWFzBq~`-0{9O=$`Yi*NLCcV3*fL@nwTxND zEgs8+WzsTbnYPR@l^ScHHQ4IbTEnb5Yot|gjj_gBab>6 zv#mMSTx&l65Vp`-Vs%+7td-U(>oIGM^`y1VT5mPjtTwwX&6Z)yv^i{9wrpFDE#Ky} z71~N{E?b4I(pF_VX{)z2+L~<5wpLr4t=-mP>#})l6W7=#ZBw>s+l-CC86#$802wrf zKtr%WYX~#w43P%CA;u7Eh%*=rCd28Gc%EzS{Di^;S3+gNv4oQe^$AT0tqJW3T?su2 z{Rx8!!wI7a;|UW9QwcK(8e_0A%ou5mF~%89#uQ_kG1Hi3%rWL03ym&grSX{Yq_N)E zWNbCI8@r4>#(v|Vao9L&95+rFr;Ia3jVag^W{Nb$nBq((Q;I3glxfN`E#c=_Dc0WNIZ0x=cN$e!^gw5EwU2aQSCU8gsBYi~xw?;+xDV<}`DrIm?`5ZfG-# zxCQN^;et_&yK9Vf#zteavCY_F>^Alq2aH3;5#yNAW1KWj8x>QaNo&%X^rl#o!DKbr zO&KPKDch85a+*p^6{adv4T0EbYBsf*I!xWBUV?FmKpgW0;WPmlXx5r_1Ys-zXf@l- z8D@t$+nj55noG%-PZtSL$Mq>LnIQejeMQdLq- zQgc#AQdd%c(m>K+(s0s5(oB+)%tyRrU9vveZB5Qd&P>ip&P~owb|#l3*CaP4Hzl_x zcO-WucPIBIk0g7NCz5B9`AU+aPcfvJQqoc~QZiEiSJr%t3!rB0{Lq-xwY zolS3xwHa(CUnFM{w{^Z4?Y8yW25f`2A=`*;LWZcG?GTUw8tV&4hauaLV{jQN4E2Ua zLz`jHFk%=p1jlPxQS`nQ#l(u@WHqUauaECw1sRH;jMpX@5*!I733Uk_2}21HlL=a* a!RRoS5R#2VzzA1eN5EN4r?rWqU;J-$N~5^| delta 12309 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 G(*GBMcab{) diff --git a/addons/interact_menu/config.cpp b/addons/interact_menu/config.cpp index c1da3392e9..8909c3d685 100644 --- a/addons/interact_menu/config.cpp +++ b/addons/interact_menu/config.cpp @@ -21,5 +21,5 @@ class CfgPatches { #include "ACE_Settings.hpp" class ACE_Extensions { - extensions[] += {"ace_break_line"}; + extensions[] += {"ace_break_line", "ace_parse_imagepath"}; }; diff --git a/extensions/parse_imagepath/CMakeLists.txt b/extensions/parse_imagepath/CMakeLists.txt index 67e0003752..e38a4bb506 100644 --- a/extensions/parse_imagepath/CMakeLists.txt +++ b/extensions/parse_imagepath/CMakeLists.txt @@ -1,9 +1,10 @@ set(ACE_EXTENSION_NAME "ace_parse_imagepath") file(GLOB SOURCES *.h *.hpp *.c *.cpp) -add_library( ${ACE_EXTENSION_NAME} SHARED ${GLOBAL_SOURCES} ${SOURCES}) -add_dependencies(${ACE_EXTENSION_NAME} ace_common) -SET_TARGET_PROPERTIES(${ACE_EXTENSION_NAME} PROPERTIES PREFIX "") +add_library( ${ACE_EXTENSION_NAME} SHARED ${SOURCES} ${GLOBAL_SOURCES}) +target_link_libraries(${ACE_EXTENSION_NAME} ace_common) +set_target_properties(${ACE_EXTENSION_NAME} PROPERTIES PREFIX "") +set_target_properties(${ACE_EXTENSION_NAME} PROPERTIES FOLDER Extensions) if(CMAKE_COMPILER_IS_GNUCXX) set_target_properties(${ACE_EXTENSION_NAME} PROPERTIES LINK_SEARCH_START_STATIC 1) diff --git a/extensions/parse_imagepath/ace_parse_imagepath.cpp b/extensions/parse_imagepath/ace_parse_imagepath.cpp index 86d41ca495..051535e473 100644 --- a/extensions/parse_imagepath/ace_parse_imagepath.cpp +++ b/extensions/parse_imagepath/ace_parse_imagepath.cpp @@ -11,7 +11,7 @@ * Just the image path or "" if none */ -#include "ace_common.h" +#include "shared.hpp" #include #include @@ -41,12 +41,14 @@ std::string getImagePathFromStructuredText(const std::string & input) { #pragma warning( disable : 4996 ) void __stdcall RVExtension(char *output, int outputSize, const char *function) { + ZERO_OUTPUT(); if (!strcmp(function, "version")) { strncpy(output, ACE_FULL_VERSION_STR, outputSize); } else { strncpy(output, getImagePathFromStructuredText(function).c_str(), outputSize); output[outputSize - 1] = '\0'; } + EXTENSION_RETURN(); } #pragma warning( pop ) From b0bfb7dd43e786369ebb5e87b38230f5dc0a4de1 Mon Sep 17 00:00:00 2001 From: PabstMirror Date: Fri, 29 May 2015 13:00:04 -0500 Subject: [PATCH 14/86] Fix Ladders - Add User Setting --- addons/interact_menu/ACE_Settings.hpp | 11 +++++-- .../fnc_userActions_addHouseActions.sqf | 4 ++- .../fnc_userActions_getHouseActions.sqf | 33 ++++++------------- addons/interact_menu/stringtable.xml | 6 ++++ 4 files changed, 28 insertions(+), 26 deletions(-) diff --git a/addons/interact_menu/ACE_Settings.hpp b/addons/interact_menu/ACE_Settings.hpp index 19347b0d6d..e30260a0c5 100644 --- a/addons/interact_menu/ACE_Settings.hpp +++ b/addons/interact_menu/ACE_Settings.hpp @@ -4,7 +4,7 @@ class ACE_Settings { typeName = "BOOL"; isClientSettable = 1; displayName = "$STR_ACE_Interact_Menu_AlwaysUseCursorSelfInteraction"; - }; + }; class GVAR(cursorKeepCentered) { value = 0; typeName = "BOOL"; @@ -54,7 +54,7 @@ class ACE_Settings { isClientSettable = 1; displayName = "$STR_ACE_Interact_textSize"; values[] = {"$str_very_small", "$str_small", "$str_medium", "$str_large", "$str_very_large"}; - }; + }; class GVAR(shadowSetting) { value = 2; typeName = "SCALAR"; @@ -69,4 +69,11 @@ class ACE_Settings { isClientSettable = 1; displayName = "$STR_ACE_Interact_Menu_ActionOnKeyRelease"; }; + class GVAR(addBuildingActions) { + value = 0; + typeName = "BOOL"; + isClientSettable = 1; + displayName = "$STR_ACE_Interact_Menu_addBuildingActions"; + description = "$STR_ACE_Interact_Menu_addBuildingActionsDescription"; + }; }; diff --git a/addons/interact_menu/functions/fnc_userActions_addHouseActions.sqf b/addons/interact_menu/functions/fnc_userActions_addHouseActions.sqf index deb7c839ca..9143db0d4d 100644 --- a/addons/interact_menu/functions/fnc_userActions_addHouseActions.sqf +++ b/addons/interact_menu/functions/fnc_userActions_addHouseActions.sqf @@ -18,6 +18,8 @@ PARAMS_1(_interactionType); +//Ignore if not enabled: +if (!GVAR(addBuildingActions)) exitWith {}; //Ignore self-interaction menu: if (_interactionType != 0) exitWith {}; //Ignore when mounted: @@ -75,7 +77,7 @@ if ((vehicle ACE_player) != ACE_player) exitWith {}; _actionSet = [_typeOfHouse] call FUNC(userActions_getHouseActions); EXPLODE_2_PVT(_actionSet,_memPoints,_memPointsActions); - systemChat format ["Add Actions for [%1] (count %2) @ %3", _typeOfHouse, (count _memPoints), diag_tickTime]; + // systemChat format ["Add Actions for [%1] (count %2) @ %3", _typeOfHouse, (count _memPoints), diag_tickTime]; { _helperPos = (_houseBeingScaned modelToWorld (_houseBeingScaned selectionPosition _x)) call EFUNC(common,positionToASL); _helperObject = "Sign_Sphere25cm_F" createVehicleLocal _helperPos; diff --git a/addons/interact_menu/functions/fnc_userActions_getHouseActions.sqf b/addons/interact_menu/functions/fnc_userActions_getHouseActions.sqf index acc350059b..0b3d4347c7 100644 --- a/addons/interact_menu/functions/fnc_userActions_getHouseActions.sqf +++ b/addons/interact_menu/functions/fnc_userActions_getHouseActions.sqf @@ -31,7 +31,7 @@ _fnc_getMemPointOffset = { _memPoints pushBack _memoryPoint; _memPointsActions pushBack []; } else { - _actionOffset set [2, 0.05 * (count (_memPointsActions select _memPointIndex))]; + _actionOffset set [2, 0.0254 * (count (_memPointsActions select _memPointIndex))]; }; _actionOffset }; @@ -47,6 +47,7 @@ _fnc_userAction_Condition = { PARAMS_3(_target,_player,_variable); EXPLODE_2_PVT(_variable,_actionStatement,_actionCondition); this = _target getVariable [QGVAR(building), objNull]; + if (isNull this) exitWith {false}; call _actionCondition; }; @@ -71,27 +72,9 @@ for "_index" from 0 to ((count _configPath) - 1) do { _actionMaxDistance = _actionMaxDistance + 0.1; //increase range slightly _iconImage = ""; - /* - if (_actionDisplayNameDefault != "") then { - //something like: ""; - //find the end [.paa'] - _endIndex = _actionDisplayNameDefault find ".paa'"; - if (_endIndex == -1) exitWith {}; - _startIndex = _endIndex - 1; - _endIndex = _endIndex + 4; - //work backwards to find the starting ['] - while {(_startIndex > 0) && {_iconImage == ""}} do { - if ((_actionDisplayNameDefault select [_startIndex, 1]) == "'") then { - _startIndex = _startIndex + 1; - _iconImage = _actionDisplayNameDefault select [_startIndex, (_endIndex - _startIndex)]; - }; - _startIndex = _startIndex - 1; - }; - }; */ //extension ~4x as fast: _iconImage = "ace_parse_imagepath" callExtension _actionDisplayNameDefault; - _actionOffset = [_actionPosition] call _fnc_getMemPointOffset; _memPointIndex = _memPoints find _actionPosition; @@ -104,24 +87,28 @@ _fnc_ladder_ladderUp = { PARAMS_3(_target,_player,_variable); EXPLODE_1_PVT(_variable,_ladderIndex); _building = _target getVariable [QGVAR(building), objNull]; + TRACE_3("Ladder Action - UP",_player,_building,_ladderIndex); _player action ["LadderUp", _building, _ladderIndex, 0]; }; _fnc_ladder_ladderDown = { PARAMS_3(_target,_player,_variable); EXPLODE_1_PVT(_variable,_ladderIndex); _building = _target getVariable [QGVAR(building), objNull]; - _player action ["LadderUp", _building, (_variable select 0), 1]; + TRACE_3("Ladder Action - Down",_player,_building,_ladderIndex); + _player action ["LadderDown", _building, _ladderIndex, 1]; }; -_fnc_ladder_conditional = { //Don't show actions if on a ladder - ((getNumber (configFile >> "CfgMovesMaleSdr" >> "States" >> (animationState _player) >> "onLadder")) == 0) +_fnc_ladder_conditional = { + PARAMS_2(_target,_player); + //(Check distance < 2) and (Don't show actions if on a ladder) + ((_target distance _player) < 2) && {((getNumber (configFile >> "CfgMovesMaleSdr" >> "States" >> (animationState _player) >> "onLadder")) == 0)} }; _ladders = getArray (configFile >> "CfgVehicles" >> _typeOfBuilding >> "ladders"); { EXPLODE_2_PVT(_x,_ladderBottomMemPoint,_ladderTopMemPoint); - _actionMaxDistance = 2; + _actionMaxDistance = 3; //interact_menu will check head -> target's offset; leave this high and do a precice distance check in condition _actionDisplayName = localize "str_action_ladderup"; _iconImage = "\A3\ui_f\data\igui\cfg\actions\ladderup_ca.paa"; diff --git a/addons/interact_menu/stringtable.xml b/addons/interact_menu/stringtable.xml index 8f60fa6879..0d2e602834 100644 --- a/addons/interact_menu/stringtable.xml +++ b/addons/interact_menu/stringtable.xml @@ -217,5 +217,11 @@ Körvonal Contorno + + Show actions for buildings + + + Adds interaction actions for opening doors and mounting ladders on buildings. + From 25f613b7125b8e3b1cec25fd6002e26ad929e607 Mon Sep 17 00:00:00 2001 From: SilentSpike Date: Thu, 4 Jun 2015 23:11:35 +0100 Subject: [PATCH 15/86] Initial implementation of static zeus menu --- addons/interact_menu/ACE_ZeusActions.hpp | 43 +++++++++ addons/interact_menu/XEH_clientInit.sqf | 8 ++ addons/interact_menu/XEH_preInit.sqf | 4 + addons/interact_menu/config.cpp | 2 + .../functions/fnc_compileMenuZeus.sqf | 94 +++++++++++++++++++ .../interact_menu/functions/fnc_keyDown.sqf | 3 +- .../functions/fnc_renderActionPoints.sqf | 42 +++++++-- .../functions/fnc_renderBaseMenu.sqf | 2 +- 8 files changed, 187 insertions(+), 11 deletions(-) create mode 100644 addons/interact_menu/ACE_ZeusActions.hpp create mode 100644 addons/interact_menu/functions/fnc_compileMenuZeus.sqf diff --git a/addons/interact_menu/ACE_ZeusActions.hpp b/addons/interact_menu/ACE_ZeusActions.hpp new file mode 100644 index 0000000000..ea5be4505c --- /dev/null +++ b/addons/interact_menu/ACE_ZeusActions.hpp @@ -0,0 +1,43 @@ +class ACE_ZeusActions { + class ZeusUnits { + displayName = "Units"; + icon = "\A3\UI_F_Curator\Data\Displays\RscDisplayCurator\modeunits_ca.paa"; + }; + class ZeusGroups { + displayName = "Groups"; + icon = "\A3\UI_F_Curator\Data\Displays\RscDisplayCurator\modegroups_ca.paa"; + + class behaviour { + displayName = "Behaviour"; + + class aware { + displayName = "Aware"; + icon = "\A3\UI_F_Curator\Data\RscCommon\RscAttributeBehaviour\aware_ca.paa"; + statement = "{ _x setBehaviour 'AWARE'; } forEach (curatorSelected select 1);"; + }; + class combat { + displayName = "Combat"; + icon = "\A3\UI_F_Curator\Data\RscCommon\RscAttributeBehaviour\combat_ca.paa"; + statement = "{ _x setBehaviour 'COMBAT'; } forEach (curatorSelected select 1);"; + }; + class safe { + displayName = "Safe"; + icon = "\A3\UI_F_Curator\Data\RscCommon\RscAttributeBehaviour\safe_ca.paa"; + statement = "{ _x setBehaviour 'SAFE'; } forEach (curatorSelected select 1);"; + }; + class stealth { + displayName = "Stealth"; + icon = "\A3\UI_F_Curator\Data\RscCommon\RscAttributeBehaviour\stealth_ca.paa"; + statement = "{ _x setBehaviour 'STEALTH'; } forEach (curatorSelected select 1);"; + }; + }; + }; + class ZeusWaypoints { + displayName = "Waypoints"; + icon = "\A3\UI_F_Curator\Data\CfgCurator\waypoint_ca.paa"; + }; + class ZeusMarkers { + displayName = "Markers"; + icon = "\A3\UI_F_Curator\Data\Displays\RscDisplayCurator\modemarkers_ca.paa"; + }; +}; diff --git a/addons/interact_menu/XEH_clientInit.sqf b/addons/interact_menu/XEH_clientInit.sqf index f6c712a668..99e9ad1a2a 100644 --- a/addons/interact_menu/XEH_clientInit.sqf +++ b/addons/interact_menu/XEH_clientInit.sqf @@ -72,3 +72,11 @@ addMissionEventHandler ["Draw3D", DFUNC(render)]; if (GVAR(menuBackground)==1) then {[QGVAR(menuBackground), false] call EFUNC(common,blurScreen);}; if (GVAR(menuBackground)==2) then {(uiNamespace getVariable [QGVAR(menuBackground), displayNull]) closeDisplay 0;}; }] call EFUNC(common,addEventHandler); + +// Let key work with zeus open (not perfect, enables all added hotkeys in zeus interface rather than only menu) +["zeusDisplayChanged",{ + if (_this select 1) then { + (finddisplay 312) displayAddEventHandler ["KeyUp", {[_this,'keyup'] call CBA_events_fnc_keyHandler}]; + (finddisplay 312) displayAddEventHandler ["KeyDown", {[_this,'keydown'] call CBA_events_fnc_keyHandler}]; + }; +}] call EFUNC(common,addEventHandler); diff --git a/addons/interact_menu/XEH_preInit.sqf b/addons/interact_menu/XEH_preInit.sqf index 1620349468..1539f8e2aa 100644 --- a/addons/interact_menu/XEH_preInit.sqf +++ b/addons/interact_menu/XEH_preInit.sqf @@ -6,6 +6,7 @@ PREP(addActionToClass); PREP(addActionToObject); PREP(compileMenu); PREP(compileMenuSelfAction); +PREP(compileMenuZeus); PREP(collectActiveActionTree); PREP(createAction); PREP(ctrlSetParsedTextCached); @@ -75,4 +76,7 @@ GVAR(lastTimeSearchedActions) = -1000; ["CAManBase"] call FUNC(compileMenu); ["CAManBase"] call FUNC(compileMenuSelfAction); +// Init zeus menu +[] call FUNC(compileMenuZeus); + ADDON = true; diff --git a/addons/interact_menu/config.cpp b/addons/interact_menu/config.cpp index c1da3392e9..9ec0b75ebd 100644 --- a/addons/interact_menu/config.cpp +++ b/addons/interact_menu/config.cpp @@ -23,3 +23,5 @@ class CfgPatches { class ACE_Extensions { extensions[] += {"ace_break_line"}; }; + +#include "ACE_ZeusActions.hpp" diff --git a/addons/interact_menu/functions/fnc_compileMenuZeus.sqf b/addons/interact_menu/functions/fnc_compileMenuZeus.sqf new file mode 100644 index 0000000000..9dc212ac40 --- /dev/null +++ b/addons/interact_menu/functions/fnc_compileMenuZeus.sqf @@ -0,0 +1,94 @@ +/* + * Author: SilentSpike + * Compile the zeus action menu (only to be done once) + * + * Argument: + * nil + * + * Return value: + * None + * + * Public: No + */ +#include "script_component.hpp"; + +// Exit if the action menu is already compiled for zeus +if !(isNil {missionNamespace getVariable [QGVAR(ZeusActions), nil]}) exitWith {}; + +private "_recurseFnc"; +_recurseFnc = { + private ["_actions", "_displayName", "_icon", "_statement", "_condition", "_showDisabled", + "_enableInside", "_canCollapse", "_runOnHover", "_children", "_entry", "_entryCfg", "_insertChildren", "_modifierFunction"]; + EXPLODE_1_PVT(_this,_actionsCfg); + _actions = []; + + { + _entryCfg = _x; + if(isClass _entryCfg) then { + _displayName = getText (_entryCfg >> "displayName"); + + _icon = getText (_entryCfg >> "icon"); + _statement = compile (getText (_entryCfg >> "statement")); + + _condition = getText (_entryCfg >> "condition"); + if (_condition == "") then {_condition = "true"}; + + _insertChildren = compile (getText (_entryCfg >> "insertChildren")); + _modifierFunction = compile (getText (_entryCfg >> "modifierFunction")); + + _showDisabled = (getNumber (_entryCfg >> "showDisabled")) > 0; + _enableInside = (getNumber (_entryCfg >> "enableInside")) > 0; + _canCollapse = (getNumber (_entryCfg >> "canCollapse")) > 0; + _runOnHover = true; + if (isText (_entryCfg >> "runOnHover")) then { + _runOnHover = compile getText (_entryCfg >> "runOnHover"); + } else { + _runOnHover = (getNumber (_entryCfg >> "runOnHover")) > 0; + }; + + _condition = compile _condition; + _children = [_entryCfg] call _recurseFnc; + + _entry = [ + [ + configName _entryCfg, + _displayName, + _icon, + _statement, + _condition, + _insertChildren, + {}, + [0,0,0], + 10, //distace + [_showDisabled,_enableInside,_canCollapse,_runOnHover], + _modifierFunction + ], + _children + ]; + _actions pushBack _entry; + }; + } forEach (configProperties [_actionsCfg, "isClass _x", true]); + _actions +}; + +private ["_actionsCfg"]; +_actionsCfg = configFile >> "ACE_ZeusActions"; + +// Create a master action to base zeus actions on +GVAR(ZeusActions) = [ + [ + [ + "ACE_ZeusActions", + localize LSTRING(ZeusActionsRoot), + "\A3\Ui_F_Curator\Data\Logos\arma3_zeus_icon_ca.paa", + {true}, + {true}, + {}, + {}, + {[0,0,0]}, + 10, + [false,true,false] + ], + [_actionsCfg] call _recurseFnc + ] +]; diff --git a/addons/interact_menu/functions/fnc_keyDown.sqf b/addons/interact_menu/functions/fnc_keyDown.sqf index 50e911c878..2928953c81 100644 --- a/addons/interact_menu/functions/fnc_keyDown.sqf +++ b/addons/interact_menu/functions/fnc_keyDown.sqf @@ -34,6 +34,7 @@ GVAR(ParsedTextCached) = []; GVAR(useCursorMenu) = (vehicle ACE_player != ACE_player) || visibleMap || + (!isNull curatorCamera) || {(_menuType == 1) && {(isWeaponDeployed ACE_player) || GVAR(AlwaysUseCursorSelfInteraction) || {cameraView == "GUNNER"}}} || {(_menuType == 0) && GVAR(AlwaysUseCursorInteraction)}; @@ -46,7 +47,7 @@ for "_i" from 0 to (count GVAR(iconCtrls))-1 do { GVAR(iconCtrls) resize GVAR(iconCount); if (GVAR(useCursorMenu)) then { - (findDisplay 46) createDisplay QGVAR(cursorMenu); //"RscCinemaBorder";// + (findDisplay ([312,46] select (isNull curatorCamera))) createDisplay QGVAR(cursorMenu); //"RscCinemaBorder";// (finddisplay 91919) displayAddEventHandler ["KeyUp", {[_this,'keyup'] call CBA_events_fnc_keyHandler}]; (finddisplay 91919) displayAddEventHandler ["KeyDown", {[_this,'keydown'] call CBA_events_fnc_keyHandler}]; // The dialog sets: diff --git a/addons/interact_menu/functions/fnc_renderActionPoints.sqf b/addons/interact_menu/functions/fnc_renderActionPoints.sqf index 707c3a3349..ca4bdbc037 100644 --- a/addons/interact_menu/functions/fnc_renderActionPoints.sqf +++ b/addons/interact_menu/functions/fnc_renderActionPoints.sqf @@ -118,24 +118,48 @@ _fnc_renderSelfActions = { } forEach _classActions; }; +_fnc_renderZeusActions = { + _target = _this; + + // Iterate through zeus actions, find base level actions and render them if appropiate + _pos = if !(GVAR(useCursorMenu)) then { + _virtualPoint = (((positionCameraToWorld [0, 0, 0]) call EFUNC(common,positionToASL)) vectorAdd GVAR(selfMenuOffset)) call EFUNC(common,ASLToPosition); + _wavesAtOrigin = [(positionCameraToWorld [0, 0, 0])] call EFUNC(common,waveHeightAt); + _wavesAtVirtualPoint = [_virtualPoint] call EFUNC(common,waveHeightAt); + _virtualPoint set [2, ((_virtualPoint select 2) - _wavesAtOrigin + _wavesAtVirtualPoint)]; + _virtualPoint + } else { + [0.5, 0.5] + }; + + { + _action = _x; + [_target, _action, _pos] call FUNC(renderBaseMenu); + } forEach GVAR(ZeusActions); +}; + GVAR(collectedActionPoints) resize 0; // Render nearby actions, unit self actions or vehicle self actions as appropiate if (GVAR(openedMenuType) == 0) then { - - if (vehicle ACE_player == ACE_player) then { - if (ACE_diagTime > GVAR(lastTimeSearchedActions) + 0.20) then { - // Once every 0.2 secs, collect nearby objects active and visible action points and render them - call _fnc_renderNearbyActions; + if (isNull curatorCamera) then { + if (vehicle ACE_player == ACE_player) then { + if (ACE_diagTime > GVAR(lastTimeSearchedActions) + 0.20) then { + // Once every 0.2 secs, collect nearby objects active and visible action points and render them + call _fnc_renderNearbyActions; + } else { + // The rest of the frames just draw the same action points rendered the last frame + call _fnc_renderLastFrameActions; + }; } else { - // The rest of the frames just draw the same action points rendered the last frame - call _fnc_renderLastFrameActions; + // Render vehicle self actions when in vehicle + (vehicle ACE_player) call _fnc_renderSelfActions; }; } else { - (vehicle ACE_player) call _fnc_renderSelfActions; + // Render zeus actions when zeus open + (getAssignedCuratorLogic player) call _fnc_renderZeusActions; }; - } else { ACE_player call _fnc_renderSelfActions; }; diff --git a/addons/interact_menu/functions/fnc_renderBaseMenu.sqf b/addons/interact_menu/functions/fnc_renderBaseMenu.sqf index 5ee698b547..a844930a7c 100644 --- a/addons/interact_menu/functions/fnc_renderBaseMenu.sqf +++ b/addons/interact_menu/functions/fnc_renderBaseMenu.sqf @@ -36,7 +36,7 @@ _pos = if((count _this) > 2) then { }; // For non-self actions, exit if the action is too far away or ocluded -if (GVAR(openedMenuType) == 0 && vehicle ACE_player == ACE_player && +if (GVAR(openedMenuType) == 0 && (vehicle ACE_player == ACE_player) && (isNull curatorCamera) && { private ["_headPos","_actualDistance"]; _headPos = ACE_player modelToWorldVisual (ACE_player selectionPosition "pilot"); From 8a4b4a7e0c71500ea625d5bffac4f962e898fd4f Mon Sep 17 00:00:00 2001 From: SilentSpike Date: Fri, 5 Jun 2015 18:37:29 +0100 Subject: [PATCH 16/86] Added a bunch of basic actions --- addons/interact_menu/ACE_ZeusActions.hpp | 256 +++++++++++++++++++++-- addons/interact_menu/stringtable.xml | 3 + 2 files changed, 244 insertions(+), 15 deletions(-) diff --git a/addons/interact_menu/ACE_ZeusActions.hpp b/addons/interact_menu/ACE_ZeusActions.hpp index ea5be4505c..0c9eae8566 100644 --- a/addons/interact_menu/ACE_ZeusActions.hpp +++ b/addons/interact_menu/ACE_ZeusActions.hpp @@ -1,43 +1,269 @@ class ACE_ZeusActions { + // _target = curatorLogic + // curatorSelected = [objects,groups,waypoints,markers] + class ZeusUnits { - displayName = "Units"; - icon = "\A3\UI_F_Curator\Data\Displays\RscDisplayCurator\modeunits_ca.paa"; + displayName = "$STR_A3_RscDisplayCurator_ModeUnits_tooltip"; + icon = "\A3\UI_F_Curator\Data\Displays\RscDisplayCurator\modeUnits_ca.paa"; + + class remoteControl { + displayName = "$STR_A3_CfgVehicles_ModuleRemoteControl_F"; + icon = "\A3\Modules_F_Curator\Data\portraitRemoteControl_ca.paa"; + statement = "_unit = objNull; { if ((side _x in [east,west,resistance,civilian]) && !(isPlayer _x)) exitWith { _unit = _x; }; } forEach (curatorSelected select 0); bis_fnc_curatorObjectPlaced_mouseOver = ['OBJECT',_unit]; (group _target) createUnit ['ModuleRemoteControl_F',[0,0,0],[],0,''];"; + }; + class stance { + displayName = "$STR_A3_RscAttributeUnitPos_Title"; + + class limited { + displayName = "$STR_A3_RscAttributeUnitPos_Down_tooltip"; + icon = "\A3\UI_F\Data\IGUI\RscIngameUI\RscUnitInfo\SI_prone_ca.paa"; + statement = "{_x setUnitPos 'DOWN';} forEach (curatorSelected select 0);"; + }; + class normal { + displayName = "$STR_A3_RscAttributeUnitPos_Crouch_tooltip"; + icon = "\A3\UI_F\Data\IGUI\RscIngameUI\RscUnitInfo\SI_crouch_ca.paa"; + statement = "{_x setUnitPos 'MIDDLE';} forEach (curatorSelected select 0);"; + }; + class full { + displayName = "$STR_A3_RscAttributeUnitPos_Up_tooltip"; + icon = "\A3\UI_F\Data\IGUI\RscIngameUI\RscUnitInfo\SI_stand_ca.paa"; + statement = "{_x setUnitPos 'UP';} forEach (curatorSelected select 0);"; + }; + class auto { + displayName = "$STR_A3_RscAttributeUnitPos_Auto_tooltip"; + icon = "\A3\UI_F_Curator\Data\default_ca.paa"; + statement = "{_x setUnitPos 'AUTO';} forEach (curatorSelected select 0);"; + }; + }; }; class ZeusGroups { - displayName = "Groups"; - icon = "\A3\UI_F_Curator\Data\Displays\RscDisplayCurator\modegroups_ca.paa"; + displayName = "$STR_A3_RscDisplayCurator_ModeGroups_tooltip"; + icon = "\A3\UI_F_Curator\Data\Displays\RscDisplayCurator\modeGroups_ca.paa"; class behaviour { - displayName = "Behaviour"; + displayName = "$STR_disp_arcwp_semaphore"; + class careless { + displayName = "$STR_careless"; + statement = "{ _x setBehaviour 'CARELESS'; } forEach (curatorSelected select 1);"; + }; + class safe { + displayName = "$STR_safe"; + icon = "\A3\UI_F_Curator\Data\RscCommon\RscAttributeBehaviour\safe_ca.paa"; + statement = "{ _x setBehaviour 'SAFE'; } forEach (curatorSelected select 1);"; + }; class aware { - displayName = "Aware"; + displayName = "$STR_aware"; icon = "\A3\UI_F_Curator\Data\RscCommon\RscAttributeBehaviour\aware_ca.paa"; statement = "{ _x setBehaviour 'AWARE'; } forEach (curatorSelected select 1);"; }; class combat { - displayName = "Combat"; + displayName = "$STR_combat"; icon = "\A3\UI_F_Curator\Data\RscCommon\RscAttributeBehaviour\combat_ca.paa"; statement = "{ _x setBehaviour 'COMBAT'; } forEach (curatorSelected select 1);"; }; - class safe { - displayName = "Safe"; - icon = "\A3\UI_F_Curator\Data\RscCommon\RscAttributeBehaviour\safe_ca.paa"; - statement = "{ _x setBehaviour 'SAFE'; } forEach (curatorSelected select 1);"; - }; class stealth { - displayName = "Stealth"; + displayName = "$STR_stealth"; icon = "\A3\UI_F_Curator\Data\RscCommon\RscAttributeBehaviour\stealth_ca.paa"; statement = "{ _x setBehaviour 'STEALTH'; } forEach (curatorSelected select 1);"; }; }; + class speed { + displayName = "$STR_disp_arcwp_speed"; + + class limited { + displayName = "$STR_speed_limited"; + icon = "\A3\UI_F_Curator\Data\RscCommon\RscAttributeSpeedMode\limited_ca.paa"; + statement = "{_x setSpeedMode 'LIMITED';} forEach (curatorSelected select 1);"; + }; + class normal { + displayName = "$STR_speed_normal"; + icon = "\A3\UI_F_Curator\Data\RscCommon\RscAttributeSpeedMode\normal_ca.paa"; + statement = "{_x setSpeedMode 'NORMAL';} forEach (curatorSelected select 1);"; + }; + class full { + displayName = "$STR_speed_full"; + icon = "\A3\UI_F_Curator\Data\RscCommon\RscAttributeSpeedMode\full_ca.paa"; + statement = "{_x setSpeedMode 'FULL';} forEach (curatorSelected select 1);"; + }; + }; + class stance { + displayName = "$STR_A3_RscAttributeUnitPos_Title"; + + class limited { + displayName = "$STR_A3_RscAttributeUnitPos_Down_tooltip"; + icon = "\A3\UI_F\Data\IGUI\RscIngameUI\RscUnitInfo\SI_prone_ca.paa"; + statement = "{ {_x setUnitPos 'DOWN'} forEach (units _x); } forEach (curatorSelected select 1);"; + }; + class normal { + displayName = "$STR_A3_RscAttributeUnitPos_Crouch_tooltip"; + icon = "\A3\UI_F\Data\IGUI\RscIngameUI\RscUnitInfo\SI_crouch_ca.paa"; + statement = "{ {_x setUnitPos 'MIDDLE'} forEach (units _x); } forEach (curatorSelected select 1);"; + }; + class full { + displayName = "$STR_A3_RscAttributeUnitPos_Up_tooltip"; + icon = "\A3\UI_F\Data\IGUI\RscIngameUI\RscUnitInfo\SI_stand_ca.paa"; + statement = "{ {_x setUnitPos 'UP'} forEach (units _x); } forEach (curatorSelected select 1);"; + }; + class auto { + displayName = "$STR_A3_RscAttributeUnitPos_Auto_tooltip"; + icon = "\A3\UI_F_Curator\Data\default_ca.paa"; + statement = "{ {_x setUnitPos 'AUTO'} forEach (units _x); } forEach (curatorSelected select 1);"; + }; + }; + class formation { + displayName = "$STR_disp_arcwp_form"; + + class wedge { + displayName = "$STR_wedge"; + icon="\A3\UI_F_Curator\Data\RscCommon\RscAttributeFormation\wedge_ca.paa"; + statement = "{_x setFormation 'WEDGE';} forEach (curatorSelected select 1);"; + }; + class vee { + displayName = "$STR_vee"; + icon="\A3\UI_F_Curator\Data\RscCommon\RscAttributeFormation\vee_ca.paa"; + statement = "{_x setFormation 'VEE';} forEach (curatorSelected select 1);"; + }; + class line { + displayName = "$STR_line"; + icon="\A3\UI_F_Curator\Data\RscCommon\RscAttributeFormation\line_ca.paa"; + statement = "{_x setFormation 'LINE';} forEach (curatorSelected select 1);"; + }; + class column { + displayName = "$STR_column"; + icon="\A3\UI_F_Curator\Data\RscCommon\RscAttributeFormation\column_ca.paa"; + statement = "{_x setFormation 'COLUMN';} forEach (curatorSelected select 1);"; + }; + class file { + displayName = "$STR_file"; + icon = "\A3\UI_F_Curator\Data\RscCommon\RscAttributeFormation\file_ca.paa"; + statement = "{_x setFormation 'FILE';} forEach (curatorSelected select 1);"; + }; + class stag_column { + displayName = "$STR_staggered"; + icon="\A3\UI_F_Curator\Data\RscCommon\RscAttributeFormation\stag_column_ca.paa"; + statement = "{_x setFormation 'STAG COLUMN';} forEach (curatorSelected select 1);"; + }; + class ech_left { + displayName = "$STR_echl"; + icon="\A3\UI_F_Curator\Data\RscCommon\RscAttributeFormation\ech_left_ca.paa"; + statement = "{_x setFormation 'ECH LEFT';} forEach (curatorSelected select 1);"; + }; + class ech_right { + displayName = "$STR_echr"; + icon="\A3\UI_F_Curator\Data\RscCommon\RscAttributeFormation\ech_right_ca.paa"; + statement = "{_x setFormation 'ECH RIGHT';} forEach (curatorSelected select 1);"; + }; + class diamond { + displayName = "$STR_diamond"; + icon="\A3\UI_F_Curator\Data\RscCommon\RscAttributeFormation\diamond_ca.paa"; + statement = "{_x setFormation 'DIAMOND';} forEach (curatorSelected select 1);"; + }; + }; }; class ZeusWaypoints { displayName = "Waypoints"; icon = "\A3\UI_F_Curator\Data\CfgCurator\waypoint_ca.paa"; + + class behaviour { + displayName = "$STR_disp_arcwp_semaphore"; + + class careless { + displayName = "$STR_careless"; + statement = "{ _x setWaypointBehaviour 'CARELESS'; } forEach (curatorSelected select 2);"; + }; + class safe { + displayName = "$STR_safe"; + icon = "\A3\UI_F_Curator\Data\RscCommon\RscAttributeBehaviour\safe_ca.paa"; + statement = "{ _x setWaypointBehaviour 'SAFE'; } forEach (curatorSelected select 2);"; + }; + class aware { + displayName = "$STR_aware"; + icon = "\A3\UI_F_Curator\Data\RscCommon\RscAttributeBehaviour\aware_ca.paa"; + statement = "{ _x setWaypointBehaviour 'AWARE'; } forEach (curatorSelected select 2);"; + }; + class combat { + displayName = "$STR_combat"; + icon = "\A3\UI_F_Curator\Data\RscCommon\RscAttributeBehaviour\combat_ca.paa"; + statement = "{ _x setWaypointBehaviour 'COMBAT'; } forEach (curatorSelected select 2);"; + }; + class stealth { + displayName = "$STR_stealth"; + icon = "\A3\UI_F_Curator\Data\RscCommon\RscAttributeBehaviour\stealth_ca.paa"; + statement = "{ _x setWaypointBehaviour 'STEALTH'; } forEach (curatorSelected select 2);"; + }; + }; + class speed { + displayName = "$STR_disp_arcwp_speed"; + + class limited { + displayName = "$STR_speed_limited"; + icon = "\A3\UI_F_Curator\Data\RscCommon\RscAttributeSpeedMode\limited_ca.paa"; + statement = "{ _x setWaypointSpeed 'LIMITED'; } forEach (curatorSelected select 2);"; + }; + class normal { + displayName = "$STR_speed_normal"; + icon = "\A3\UI_F_Curator\Data\RscCommon\RscAttributeSpeedMode\normal_ca.paa"; + statement = "{ _x setWaypointSpeed 'NORMAL'; } forEach (curatorSelected select 2);"; + }; + class full { + displayName = "$STR_speed_full"; + icon = "\A3\UI_F_Curator\Data\RscCommon\RscAttributeSpeedMode\full_ca.paa"; + statement = "{ _x setWaypointSpeed 'FULL'; } forEach (curatorSelected select 2);"; + }; + }; + class formation { + displayName = "$STR_disp_arcwp_form"; + + class wedge { + displayName = "$STR_wedge"; + icon="\A3\UI_F_Curator\Data\RscCommon\RscAttributeFormation\wedge_ca.paa"; + statement = "{_x setWaypointFormation 'WEDGE';} forEach (curatorSelected select 1);"; + }; + class vee { + displayName = "$STR_vee"; + icon="\A3\UI_F_Curator\Data\RscCommon\RscAttributeFormation\vee_ca.paa"; + statement = "{_x setWaypointFormation 'VEE';} forEach (curatorSelected select 1);"; + }; + class line { + displayName = "$STR_line"; + icon="\A3\UI_F_Curator\Data\RscCommon\RscAttributeFormation\line_ca.paa"; + statement = "{_x setWaypointFormation 'LINE';} forEach (curatorSelected select 1);"; + }; + class column { + displayName = "$STR_column"; + icon="\A3\UI_F_Curator\Data\RscCommon\RscAttributeFormation\column_ca.paa"; + statement = "{_x setWaypointFormation 'COLUMN';} forEach (curatorSelected select 1);"; + }; + class file { + displayName = "$STR_file"; + icon = "\A3\UI_F_Curator\Data\RscCommon\RscAttributeFormation\file_ca.paa"; + statement = "{_x setWaypointFormation 'FILE';} forEach (curatorSelected select 1);"; + }; + class stag_column { + displayName = "$STR_staggered"; + icon="\A3\UI_F_Curator\Data\RscCommon\RscAttributeFormation\stag_column_ca.paa"; + statement = "{_x setWaypointFormation 'STAG COLUMN';} forEach (curatorSelected select 1);"; + }; + class ech_left { + displayName = "$STR_echl"; + icon="\A3\UI_F_Curator\Data\RscCommon\RscAttributeFormation\ech_left_ca.paa"; + statement = "{_x setWaypointFormation 'ECH LEFT';} forEach (curatorSelected select 1);"; + }; + class ech_right { + displayName = "$STR_echr"; + icon="\A3\UI_F_Curator\Data\RscCommon\RscAttributeFormation\ech_right_ca.paa"; + statement = "{_x setWaypointFormation 'ECH RIGHT';} forEach (curatorSelected select 1);"; + }; + class diamond { + displayName = "$STR_diamond"; + icon="\A3\UI_F_Curator\Data\RscCommon\RscAttributeFormation\diamond_ca.paa"; + statement = "{_x setWaypointFormation 'DIAMOND';} forEach (curatorSelected select 1);"; + }; + }; }; class ZeusMarkers { - displayName = "Markers"; - icon = "\A3\UI_F_Curator\Data\Displays\RscDisplayCurator\modemarkers_ca.paa"; + displayName = "$STR_A3_RscDisplayCurator_ModeMarkers_tooltip"; + icon = "\A3\UI_F_Curator\Data\Displays\RscDisplayCurator\modeMarkers_ca.paa"; }; }; diff --git a/addons/interact_menu/stringtable.xml b/addons/interact_menu/stringtable.xml index 880edc3c71..f589a8c1da 100644 --- a/addons/interact_menu/stringtable.xml +++ b/addons/interact_menu/stringtable.xml @@ -85,6 +85,9 @@ Interazioni con veicoli Ações de Veículos + + Zeus Actions + Interaction - Text Max Interakcja - Tekst max From 5cc6abd49a25565c1ee9747f370c0a6949780a29 Mon Sep 17 00:00:00 2001 From: SilentSpike Date: Sat, 6 Jun 2015 16:20:22 +0100 Subject: [PATCH 17/86] Open menu over zeus inerface --- addons/interact_menu/functions/fnc_keyDown.sqf | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/addons/interact_menu/functions/fnc_keyDown.sqf b/addons/interact_menu/functions/fnc_keyDown.sqf index 2928953c81..cef1239278 100644 --- a/addons/interact_menu/functions/fnc_keyDown.sqf +++ b/addons/interact_menu/functions/fnc_keyDown.sqf @@ -47,7 +47,12 @@ for "_i" from 0 to (count GVAR(iconCtrls))-1 do { GVAR(iconCtrls) resize GVAR(iconCount); if (GVAR(useCursorMenu)) then { - (findDisplay ([312,46] select (isNull curatorCamera))) createDisplay QGVAR(cursorMenu); //"RscCinemaBorder";// + // Don't close zeus interface if open + if (isNull curatorCamera) then { + (findDisplay 46) createDisplay QGVAR(cursorMenu); //"RscCinemaBorder";// + } else { + createDialog QGVAR(cursorMenu); + }; (finddisplay 91919) displayAddEventHandler ["KeyUp", {[_this,'keyup'] call CBA_events_fnc_keyHandler}]; (finddisplay 91919) displayAddEventHandler ["KeyDown", {[_this,'keydown'] call CBA_events_fnc_keyHandler}]; // The dialog sets: From 822dd11ec617afbf71332b23f7faeba0e9b7a84b Mon Sep 17 00:00:00 2001 From: SilentSpike Date: Sat, 6 Jun 2015 17:33:13 +0100 Subject: [PATCH 18/86] Moved base ACE_ZeusActions to ace_interaction --- addons/interact_menu/config.cpp | 2 -- .../ACE_ZeusActions.hpp | 27 +++++++++---------- addons/interaction/config.cpp | 1 + addons/interaction/stringtable.xml | 12 +++++++++ 4 files changed, 26 insertions(+), 16 deletions(-) rename addons/{interact_menu => interaction}/ACE_ZeusActions.hpp (96%) diff --git a/addons/interact_menu/config.cpp b/addons/interact_menu/config.cpp index 9ec0b75ebd..c1da3392e9 100644 --- a/addons/interact_menu/config.cpp +++ b/addons/interact_menu/config.cpp @@ -23,5 +23,3 @@ class CfgPatches { class ACE_Extensions { extensions[] += {"ace_break_line"}; }; - -#include "ACE_ZeusActions.hpp" diff --git a/addons/interact_menu/ACE_ZeusActions.hpp b/addons/interaction/ACE_ZeusActions.hpp similarity index 96% rename from addons/interact_menu/ACE_ZeusActions.hpp rename to addons/interaction/ACE_ZeusActions.hpp index 0c9eae8566..913e7a7c85 100644 --- a/addons/interact_menu/ACE_ZeusActions.hpp +++ b/addons/interaction/ACE_ZeusActions.hpp @@ -1,16 +1,10 @@ class ACE_ZeusActions { // _target = curatorLogic // curatorSelected = [objects,groups,waypoints,markers] - class ZeusUnits { displayName = "$STR_A3_RscDisplayCurator_ModeUnits_tooltip"; icon = "\A3\UI_F_Curator\Data\Displays\RscDisplayCurator\modeUnits_ca.paa"; - class remoteControl { - displayName = "$STR_A3_CfgVehicles_ModuleRemoteControl_F"; - icon = "\A3\Modules_F_Curator\Data\portraitRemoteControl_ca.paa"; - statement = "_unit = objNull; { if ((side _x in [east,west,resistance,civilian]) && !(isPlayer _x)) exitWith { _unit = _x; }; } forEach (curatorSelected select 0); bis_fnc_curatorObjectPlaced_mouseOver = ['OBJECT',_unit]; (group _target) createUnit ['ModuleRemoteControl_F',[0,0,0],[],0,''];"; - }; class stance { displayName = "$STR_A3_RscAttributeUnitPos_Title"; @@ -35,16 +29,21 @@ class ACE_ZeusActions { statement = "{_x setUnitPos 'AUTO';} forEach (curatorSelected select 0);"; }; }; + class remoteControl { + displayName = "$STR_A3_CfgVehicles_ModuleRemoteControl_F"; + icon = "\A3\Modules_F_Curator\Data\portraitRemoteControl_ca.paa"; + statement = "_unit = objNull; { if ((side _x in [east,west,resistance,civilian]) && !(isPlayer _x)) exitWith { _unit = _x; }; } forEach (curatorSelected select 0); bis_fnc_curatorObjectPlaced_mouseOver = ['OBJECT',_unit]; (group _target) createUnit ['ModuleRemoteControl_F',[0,0,0],[],0,''];"; + }; }; class ZeusGroups { displayName = "$STR_A3_RscDisplayCurator_ModeGroups_tooltip"; icon = "\A3\UI_F_Curator\Data\Displays\RscDisplayCurator\modeGroups_ca.paa"; class behaviour { - displayName = "$STR_disp_arcwp_semaphore"; + displayName = CSTRING(Zeus_Behaviour); class careless { - displayName = "$STR_careless"; + displayName = CSTRING(Zeus_Behaviour_careless); statement = "{ _x setBehaviour 'CARELESS'; } forEach (curatorSelected select 1);"; }; class safe { @@ -69,7 +68,7 @@ class ACE_ZeusActions { }; }; class speed { - displayName = "$STR_disp_arcwp_speed"; + displayName = CSTRING(Zeus_Speed); class limited { displayName = "$STR_speed_limited"; @@ -112,7 +111,7 @@ class ACE_ZeusActions { }; }; class formation { - displayName = "$STR_disp_arcwp_form"; + displayName = CSTRING(Zeus_Formation); class wedge { displayName = "$STR_wedge"; @@ -166,10 +165,10 @@ class ACE_ZeusActions { icon = "\A3\UI_F_Curator\Data\CfgCurator\waypoint_ca.paa"; class behaviour { - displayName = "$STR_disp_arcwp_semaphore"; + displayName = CSTRING(Zeus_Behaviour); class careless { - displayName = "$STR_careless"; + displayName = CSTRING(Zeus_Behaviour_careless); statement = "{ _x setWaypointBehaviour 'CARELESS'; } forEach (curatorSelected select 2);"; }; class safe { @@ -194,7 +193,7 @@ class ACE_ZeusActions { }; }; class speed { - displayName = "$STR_disp_arcwp_speed"; + displayName = CSTRING(Zeus_Speed); class limited { displayName = "$STR_speed_limited"; @@ -213,7 +212,7 @@ class ACE_ZeusActions { }; }; class formation { - displayName = "$STR_disp_arcwp_form"; + displayName = CSTRING(Zeus_Formation); class wedge { displayName = "$STR_wedge"; diff --git a/addons/interaction/config.cpp b/addons/interaction/config.cpp index 7a68b2c12a..0afb2fc0fe 100644 --- a/addons/interaction/config.cpp +++ b/addons/interaction/config.cpp @@ -16,3 +16,4 @@ class CfgPatches { #include "CfgVehicles.hpp" #include "Menu_Config.hpp" #include "ACE_Settings.hpp" +#include "ACE_ZeusActions.hpp" diff --git a/addons/interaction/stringtable.xml b/addons/interaction/stringtable.xml index a1dad1a8e0..b06d0b1e9c 100644 --- a/addons/interaction/stringtable.xml +++ b/addons/interaction/stringtable.xml @@ -816,5 +816,17 @@ Na zarządzanie drużyną składa się: przydział kolorów dla członków drużyny, przejmowanie dowodzenia, dołączanie/opuszczanie drużyn. Die Gruppenverwaltung erlaubt die Zuweisung von Farben für Einheiten, die Kommandierung und das Beitreten/Verlassen einer Gruppe. + + Behaviour + + + Careless + + + Formation + + + Speed Mode + From 85a281d5869ab7f512de9bf9bfea4ef2b143b415 Mon Sep 17 00:00:00 2001 From: SilentSpike Date: Sat, 6 Jun 2015 17:41:24 +0100 Subject: [PATCH 19/86] Fixed random missing english string --- addons/interaction/stringtable.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/addons/interaction/stringtable.xml b/addons/interaction/stringtable.xml index b06d0b1e9c..9e743d2cb4 100644 --- a/addons/interaction/stringtable.xml +++ b/addons/interaction/stringtable.xml @@ -812,7 +812,7 @@ Sollen Spieler das Gruppenverwaltungsmenü verwenden dürfen? Standard: Ja - + Team management allows color allocation for team members, taking team command and joining/leaving teams. Na zarządzanie drużyną składa się: przydział kolorów dla członków drużyny, przejmowanie dowodzenia, dołączanie/opuszczanie drużyn. Die Gruppenverwaltung erlaubt die Zuweisung von Farben für Einheiten, die Kommandierung und das Beitreten/Verlassen einer Gruppe. From cb1b0c6262ccb2d4ae8800381163165d5c3f1c51 Mon Sep 17 00:00:00 2001 From: SilentSpike Date: Sun, 7 Jun 2015 20:21:51 +0100 Subject: [PATCH 20/86] Added zeus exception for interaction conditions --- addons/interact_menu/XEH_clientInit.sqf | 4 ---- addons/interact_menu/functions/fnc_keyDown.sqf | 5 +++++ 2 files changed, 5 insertions(+), 4 deletions(-) diff --git a/addons/interact_menu/XEH_clientInit.sqf b/addons/interact_menu/XEH_clientInit.sqf index 99e9ad1a2a..02bc94688c 100644 --- a/addons/interact_menu/XEH_clientInit.sqf +++ b/addons/interact_menu/XEH_clientInit.sqf @@ -30,8 +30,6 @@ addMissionEventHandler ["Draw3D", DFUNC(render)]; ["ACE3 Common", QGVAR(InteractKey), (localize LSTRING(InteractKey)), { - // Conditions: canInteract - if !([ACE_player, objNull, ["isNotInside","isNotDragging", "isNotCarrying", "isNotSwimming", "notOnMap", "isNotEscorting", "isNotSurrendering"]] call EFUNC(common,canInteractWith)) exitWith {false}; // Statement [0] call FUNC(keyDown) },{[0,false] call FUNC(keyUp)}, @@ -39,8 +37,6 @@ addMissionEventHandler ["Draw3D", DFUNC(render)]; ["ACE3 Common", QGVAR(SelfInteractKey), (localize LSTRING(SelfInteractKey)), { - // Conditions: canInteract - if !([ACE_player, objNull, ["isNotInside","isNotDragging", "isNotCarrying", "isNotSwimming", "notOnMap", "isNotEscorting", "isNotSurrendering"]] call EFUNC(common,canInteractWith)) exitWith {false}; // Statement [1] call FUNC(keyDown) },{[1,false] call FUNC(keyUp)}, diff --git a/addons/interact_menu/functions/fnc_keyDown.sqf b/addons/interact_menu/functions/fnc_keyDown.sqf index cef1239278..6533f0785f 100644 --- a/addons/interact_menu/functions/fnc_keyDown.sqf +++ b/addons/interact_menu/functions/fnc_keyDown.sqf @@ -16,6 +16,11 @@ EXPLODE_1_PVT(_this,_menuType); if (GVAR(openedMenuType) == _menuType) exitWith {true}; +// Conditions: canInteract (these don't apply to zeus) +if ((isNull curatorCamera) && { + !([ACE_player, objNull, ["isNotInside","isNotDragging", "isNotCarrying", "isNotSwimming", "notOnMap", "isNotEscorting", "isNotSurrendering"]] call EFUNC(common,canInteractWith)) +}) exitWith {false}; + while {dialog} do { closeDialog 0; }; From 246d303943c30ec4203c3076be571c814795f314 Mon Sep 17 00:00:00 2001 From: SilentSpike Date: Mon, 8 Jun 2015 13:00:03 +0100 Subject: [PATCH 21/86] menuClosed event before variable clearing --- addons/interact_menu/functions/fnc_keyUp.sqf | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/addons/interact_menu/functions/fnc_keyUp.sqf b/addons/interact_menu/functions/fnc_keyUp.sqf index 6f1d00276f..02e2d4db01 100644 --- a/addons/interact_menu/functions/fnc_keyUp.sqf +++ b/addons/interact_menu/functions/fnc_keyUp.sqf @@ -46,6 +46,8 @@ if(GVAR(actionSelected)) then { }; }; +["interactMenuClosed", [GVAR(openedMenuType)]] call EFUNC(common,localEvent); + GVAR(keyDown) = false; GVAR(keyDownSelfAction) = false; GVAR(openedMenuType) = -1; @@ -54,6 +56,4 @@ GVAR(expanded) = false; GVAR(lastPath) = []; GVAR(menuDepthPath) = []; -["interactMenuClosed", [GVAR(openedMenuType)]] call EFUNC(common,localEvent); - true From f19320419512e617566e7588775b5aa2a4c596f0 Mon Sep 17 00:00:00 2001 From: SilentSpike Date: Mon, 8 Jun 2015 13:12:27 +0100 Subject: [PATCH 22/86] Simplify the renderZeus code --- .../functions/fnc_renderActionPoints.sqf | 15 +-------------- 1 file changed, 1 insertion(+), 14 deletions(-) diff --git a/addons/interact_menu/functions/fnc_renderActionPoints.sqf b/addons/interact_menu/functions/fnc_renderActionPoints.sqf index ca4bdbc037..8ca7f8aa33 100644 --- a/addons/interact_menu/functions/fnc_renderActionPoints.sqf +++ b/addons/interact_menu/functions/fnc_renderActionPoints.sqf @@ -119,22 +119,9 @@ _fnc_renderSelfActions = { }; _fnc_renderZeusActions = { - _target = _this; - - // Iterate through zeus actions, find base level actions and render them if appropiate - _pos = if !(GVAR(useCursorMenu)) then { - _virtualPoint = (((positionCameraToWorld [0, 0, 0]) call EFUNC(common,positionToASL)) vectorAdd GVAR(selfMenuOffset)) call EFUNC(common,ASLToPosition); - _wavesAtOrigin = [(positionCameraToWorld [0, 0, 0])] call EFUNC(common,waveHeightAt); - _wavesAtVirtualPoint = [_virtualPoint] call EFUNC(common,waveHeightAt); - _virtualPoint set [2, ((_virtualPoint select 2) - _wavesAtOrigin + _wavesAtVirtualPoint)]; - _virtualPoint - } else { - [0.5, 0.5] - }; - { _action = _x; - [_target, _action, _pos] call FUNC(renderBaseMenu); + [_this, _action, [0.5, 0.5]] call FUNC(renderBaseMenu); } forEach GVAR(ZeusActions); }; From 805c0e1c68b4c0fce0a2803f641f347350ba7d97 Mon Sep 17 00:00:00 2001 From: SzwedzikPL Date: Fri, 12 Jun 2015 19:48:28 +0200 Subject: [PATCH 23/86] Open action for boxes --- addons/interaction/CfgVehicles.hpp | 7 +++++++ addons/interaction/stringtable.xml | 5 +++++ 2 files changed, 12 insertions(+) diff --git a/addons/interaction/CfgVehicles.hpp b/addons/interaction/CfgVehicles.hpp index f83fd26344..ff736923fa 100644 --- a/addons/interaction/CfgVehicles.hpp +++ b/addons/interaction/CfgVehicles.hpp @@ -557,6 +557,13 @@ class CfgVehicles { selection = ""; distance = 2; condition = "true"; + class ACE_OpenBox { + displayName = CSTRING(OpenBox); + condition = QUOTE(alive _target); + statement = QUOTE(_player action [ARR_2(QUOTE(QUOTE(Gear)), _target)]); + showDisabled = 0; + priority = -1; + }; }; }; class ACE_SelfActions {}; diff --git a/addons/interaction/stringtable.xml b/addons/interaction/stringtable.xml index a1dad1a8e0..d3b1a2bb61 100644 --- a/addons/interaction/stringtable.xml +++ b/addons/interaction/stringtable.xml @@ -793,6 +793,10 @@ Passeggeri Passageiros + + Open + Otwórz + Interaction System System interakcji @@ -816,5 +820,6 @@ Na zarządzanie drużyną składa się: przydział kolorów dla członków drużyny, przejmowanie dowodzenia, dołączanie/opuszczanie drużyn. Die Gruppenverwaltung erlaubt die Zuweisung von Farben für Einheiten, die Kommandierung und das Beitreten/Verlassen einer Gruppe. + From 19d3cd168ccd574bfea705e23b7c1849783881f4 Mon Sep 17 00:00:00 2001 From: SzwedzikPL Date: Fri, 12 Jun 2015 19:54:45 +0200 Subject: [PATCH 24/86] del extra space --- addons/interaction/stringtable.xml | 1 - 1 file changed, 1 deletion(-) diff --git a/addons/interaction/stringtable.xml b/addons/interaction/stringtable.xml index d3b1a2bb61..0c1f8e69be 100644 --- a/addons/interaction/stringtable.xml +++ b/addons/interaction/stringtable.xml @@ -820,6 +820,5 @@ Na zarządzanie drużyną składa się: przydział kolorów dla członków drużyny, przejmowanie dowodzenia, dołączanie/opuszczanie drużyn. Die Gruppenverwaltung erlaubt die Zuweisung von Farben für Einheiten, die Kommandierung und das Beitreten/Verlassen einer Gruppe. - From 300a33ea0a6191a3c45e27124331112557610fc0 Mon Sep 17 00:00:00 2001 From: Glowbal Date: Fri, 19 Jun 2015 22:53:25 +0200 Subject: [PATCH 25/86] Initial work --- addons/medical/functions/fnc_handleDamage.sqf | 18 +++++++++++------- 1 file changed, 11 insertions(+), 7 deletions(-) diff --git a/addons/medical/functions/fnc_handleDamage.sqf b/addons/medical/functions/fnc_handleDamage.sqf index ab6e6f2a68..75a0e70c41 100644 --- a/addons/medical/functions/fnc_handleDamage.sqf +++ b/addons/medical/functions/fnc_handleDamage.sqf @@ -80,9 +80,11 @@ if (GVAR(level) < 2) then { } else { _damageReturn = _damageReturn min 0.89; }; + }; [_unit] call FUNC(addToInjuredCollection); +_unit setHit [_selection, _damageReturn]; if (_unit getVariable [QGVAR(preventInstaDeath), GVAR(preventInstaDeath)]) exitWith { if (vehicle _unit != _unit and {damage (vehicle _unit) >= 1}) then { @@ -98,8 +100,8 @@ if (_unit getVariable [QGVAR(preventInstaDeath), GVAR(preventInstaDeath)]) exitW if (_damageReturn >= 0.9 && {_selection in ["", "head", "body"]}) exitWith { if (_unit getvariable ["ACE_isUnconscious", false]) exitwith { - [_unit] call FUNC(setDead); - 0.89 + if ([_unit] call FUNC(setDead)) exitwith {1}; + 0; }; if (_delayedUnconsicous) then { [{ @@ -110,9 +112,9 @@ if (_unit getVariable [QGVAR(preventInstaDeath), GVAR(preventInstaDeath)]) exitW [_this select 0, true] call FUNC(setUnconscious); }, [_unit]] call EFUNC(common,execNextFrame); }; - 0.89 + 0; }; - _damageReturn min 0.89; + 0; }; if (((_unit getVariable [QGVAR(enableRevive), GVAR(enableRevive)]) > 0) && {_damageReturn >= 0.9} && {_selection in ["", "head", "body"]}) exitWith { @@ -120,8 +122,10 @@ if (((_unit getVariable [QGVAR(enableRevive), GVAR(enableRevive)]) > 0) && {_dam [_unit] call EFUNC(common,unloadPerson); }; [_unit] call FUNC(setDead); - - 0.89 + 0; }; -_damageReturn +if (_damageReturn < 1) exitwith { + 0; +}; +1; From 5887c59c05082981ad3292fff5fe47898f0a5930 Mon Sep 17 00:00:00 2001 From: Glowbal Date: Fri, 19 Jun 2015 23:03:31 +0200 Subject: [PATCH 26/86] Made fix properly for advanced medical --- addons/medical/functions/fnc_handleDamage.sqf | 17 ++++++----------- .../functions/fnc_handleDamage_advanced.sqf | 2 -- .../functions/fnc_handleDamage_caching.sqf | 5 +++++ 3 files changed, 11 insertions(+), 13 deletions(-) diff --git a/addons/medical/functions/fnc_handleDamage.sqf b/addons/medical/functions/fnc_handleDamage.sqf index 75a0e70c41..aad69ee2fa 100644 --- a/addons/medical/functions/fnc_handleDamage.sqf +++ b/addons/medical/functions/fnc_handleDamage.sqf @@ -84,8 +84,6 @@ if (GVAR(level) < 2) then { }; [_unit] call FUNC(addToInjuredCollection); -_unit setHit [_selection, _damageReturn]; - if (_unit getVariable [QGVAR(preventInstaDeath), GVAR(preventInstaDeath)]) exitWith { if (vehicle _unit != _unit and {damage (vehicle _unit) >= 1}) then { [_unit] call EFUNC(common,unloadPerson); @@ -100,8 +98,8 @@ if (_unit getVariable [QGVAR(preventInstaDeath), GVAR(preventInstaDeath)]) exitW if (_damageReturn >= 0.9 && {_selection in ["", "head", "body"]}) exitWith { if (_unit getvariable ["ACE_isUnconscious", false]) exitwith { - if ([_unit] call FUNC(setDead)) exitwith {1}; - 0; + [_unit] call FUNC(setDead); + 0.89; }; if (_delayedUnconsicous) then { [{ @@ -112,9 +110,9 @@ if (_unit getVariable [QGVAR(preventInstaDeath), GVAR(preventInstaDeath)]) exitW [_this select 0, true] call FUNC(setUnconscious); }, [_unit]] call EFUNC(common,execNextFrame); }; - 0; + 0.89; }; - 0; + 0.89; }; if (((_unit getVariable [QGVAR(enableRevive), GVAR(enableRevive)]) > 0) && {_damageReturn >= 0.9} && {_selection in ["", "head", "body"]}) exitWith { @@ -122,10 +120,7 @@ if (((_unit getVariable [QGVAR(enableRevive), GVAR(enableRevive)]) > 0) && {_dam [_unit] call EFUNC(common,unloadPerson); }; [_unit] call FUNC(setDead); - 0; + 0.89; }; -if (_damageReturn < 1) exitwith { - 0; -}; -1; +_damageReturn; diff --git a/addons/medical/functions/fnc_handleDamage_advanced.sqf b/addons/medical/functions/fnc_handleDamage_advanced.sqf index 9da0d065ed..e617738a90 100644 --- a/addons/medical/functions/fnc_handleDamage_advanced.sqf +++ b/addons/medical/functions/fnc_handleDamage_advanced.sqf @@ -39,8 +39,6 @@ _damageBodyParts = _unit getvariable [QGVAR(bodyPartStatus), [0,0,0,0,0,0]]; _damageBodyParts set [_part, (_damageBodyParts select _part) + _newDamage]; _unit setvariable [QGVAR(bodyPartStatus), _damageBodyParts, true]; -[_unit] call FUNC(handleDamage_advancedSetDamage); - _typeOfDamage = [_typeOfProjectile] call FUNC(getTypeOfDamage); [_unit, _selectionName, _newDamage, _typeOfProjectile, _typeOfDamage] call FUNC(handleDamage_assignWounds); diff --git a/addons/medical/functions/fnc_handleDamage_caching.sqf b/addons/medical/functions/fnc_handleDamage_caching.sqf index 9760770d71..99816ee274 100644 --- a/addons/medical/functions/fnc_handleDamage_caching.sqf +++ b/addons/medical/functions/fnc_handleDamage_caching.sqf @@ -81,12 +81,17 @@ if (diag_frameno > (_unit getVariable [QGVAR(frameNo_damageCaching), -3]) + 2) t _args = _this select 0; if (diag_frameno > (_args select 1) + 2) then { + (_args select 0) setDamage 0; + _cache_params = (_args select 0) getVariable [QGVAR(cachedHandleDamageParams), []]; _cache_damages = (_args select 0) getVariable QGVAR(cachedDamages); { _params = _x + [_cache_damages select _foreachIndex]; _params call FUNC(handleDamage_advanced); }foreach _cache_params; + + [(_args select 0)] call FUNC(handleDamage_advancedSetDamage); + [(_this select 1)] call cba_fnc_removePerFrameHandler; }; }, 0, [_unit, diag_frameno] ] call CBA_fnc_addPerFrameHandler; From c3e2d1bf9cb541810f1514569b1f3600164d1bfd Mon Sep 17 00:00:00 2001 From: Glowbal Date: Sat, 20 Jun 2015 12:23:40 +0200 Subject: [PATCH 27/86] Removed always unconscious for basic medical --- addons/medical/functions/fnc_getUnconsciousCondition.sqf | 1 - 1 file changed, 1 deletion(-) diff --git a/addons/medical/functions/fnc_getUnconsciousCondition.sqf b/addons/medical/functions/fnc_getUnconsciousCondition.sqf index 83955f7bd1..19d3bdec1d 100644 --- a/addons/medical/functions/fnc_getUnconsciousCondition.sqf +++ b/addons/medical/functions/fnc_getUnconsciousCondition.sqf @@ -16,7 +16,6 @@ private ["_unit","_return"]; _unit = _this select 0; -if (GVAR(level) == 1) exitwith {true}; if (isnil QGVAR(unconsciousConditions)) then { GVAR(unconsciousConditions) = []; }; From 3f5a050745d1f1204ceb3436bca7fa50478f7d99 Mon Sep 17 00:00:00 2001 From: Glowbal Date: Sat, 20 Jun 2015 12:38:12 +0200 Subject: [PATCH 28/86] Fixed #1693 --- .../functions/fnc_handleBandageOpening.sqf | 33 ++++++++----------- 1 file changed, 13 insertions(+), 20 deletions(-) diff --git a/addons/medical/functions/fnc_handleBandageOpening.sqf b/addons/medical/functions/fnc_handleBandageOpening.sqf index a92bf9029c..a86077cb3b 100644 --- a/addons/medical/functions/fnc_handleBandageOpening.sqf +++ b/addons/medical/functions/fnc_handleBandageOpening.sqf @@ -58,10 +58,10 @@ if (isClass (_config >> _className)) then { _bandagedWounds = _target getvariable [QGVAR(bandagedWounds), []]; _exist = false; -_injuryId = _injury select 0; +_injuryType = _injury select 1; _bandagedInjury = []; { - if ((_x select 0) == _injuryId) exitwith { + if ((_x select 1) == _injuryType && (_x select 2) == (_injury select 2)) exitwith { _exist = true; _existingInjury = _x; _existingInjury set [3, (_existingInjury select 3) + _impact]; @@ -73,16 +73,11 @@ _bandagedInjury = []; if !(_exist) then { // [ID, classID, bodypart, percentage treated, bloodloss rate] - _bandagedInjury = [_injuryId, _injury select 1, _injury select 2, _impact, _injury select 4]; + _bandagedInjury = [_injury select 0, _injury select 1, _injury select 2, _impact, _injury select 4]; _bandagedWounds pushback _bandagedInjury; }; -_target setvariable [QGVAR(bandagedWounds), _bandagedWounds, !USE_WOUND_EVENT_SYNC]; - -if (USE_WOUND_EVENT_SYNC) then { - // sync _bandagedInjury - -}; +_target setvariable [QGVAR(bandagedWounds), _bandagedWounds, true]; // Check if we are ever going to reopen this if (random(1) <= _reopeningChance) then { @@ -95,22 +90,19 @@ if (random(1) <= _reopeningChance) then { _injuryIndex = _this select 3; _injury = _this select 4; - if (alive _target) then { + //if (alive _target) then { _openWounds = _target getvariable [QGVAR(openWounds), []]; if ((count _openWounds)-1 < _injuryIndex) exitwith {}; _selectedInjury = _openWounds select _injuryIndex; - if (_selectedInjury select 0 == _injury select 0) then { // matching the IDs + if (_selectedInjury select 1 == _injury select 1 && (_selectedInjury select 2) == (_injury select 2)) then { // matching the IDs _selectedInjury set [3, (_selectedInjury select 3) + _impact]; _openWounds set [_injuryIndex, _selectedInjury]; - _target setvariable [QGVAR(openWounds), _openWounds, !USE_WOUND_EVENT_SYNC]; - if (USE_WOUND_EVENT_SYNC) then { - ["medical_propagateWound", [_target, _selectedInjury]] call EFUNC(common,globalEvent); - }; + _bandagedWounds = _target getvariable [QGVAR(bandagedWounds), []]; _exist = false; - _injuryId = _injury select 0; + _injuryId = _injury select 1; { - if ((_x select 0) == _injuryId) exitwith { + if ((_x select 1) == _injuryId && (_x select 2) == (_injury select 2)) exitwith { _exist = true; _existingInjury = _x; _existingInjury set [3, ((_existingInjury select 3) - _impact) max 0]; @@ -119,10 +111,11 @@ if (random(1) <= _reopeningChance) then { }foreach _bandagedWounds; if (_exist) then { - _target setvariable [QGVAR(bandagedWounds), _bandagedWounds, !USE_WOUND_EVENT_SYNC]; + _target setvariable [QGVAR(bandagedWounds), _bandagedWounds, true]; + _target setvariable [QGVAR(openWounds), _openWounds, true]; }; }; // Otherwise something went wrong, we we don't reopen them.. - }; - }, [_target, _impact, _part, _injuryIndex, _injury], _delay, 0] call EFUNC(common,waitAndExecute); + //}; + }, [_target, _impact, _part, _injuryIndex, +_injury], _delay, 0] call EFUNC(common,waitAndExecute); }; From 9795647d9ce079d1c5d38be4130078b54bd38404 Mon Sep 17 00:00:00 2001 From: Glowbal Date: Sat, 20 Jun 2015 12:44:29 +0200 Subject: [PATCH 29/86] While in revive state, ensure vitals are never above 0 for adv medical --- addons/medical/functions/fnc_setDead.sqf | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/addons/medical/functions/fnc_setDead.sqf b/addons/medical/functions/fnc_setDead.sqf index fe18ac581f..831a1fa6a0 100644 --- a/addons/medical/functions/fnc_setDead.sqf +++ b/addons/medical/functions/fnc_setDead.sqf @@ -66,6 +66,11 @@ if (((_reviveVal == 1 && {[_unit] call EFUNC(common,isPlayer)} || _reviveVal == _unit setvariable [QGVAR(reviveStartTime), nil]; [(_this select 1)] call cba_fnc_removePerFrameHandler; }; + if (GVAR(level) >= 2) then { + if (_unit getvariable [QGVAR(heartRate), 60] > 0) then { + _unit setvariable [QGVAR(heartRate), 0]; + }; + }; }, 1, [_unit] ] call CBA_fnc_addPerFrameHandler; false; }; From 385baf133138d492f6c8ceeb9089619e2c6fe275 Mon Sep 17 00:00:00 2001 From: Glowbal Date: Sat, 20 Jun 2015 12:44:52 +0200 Subject: [PATCH 30/86] Using CPR while in revive state will extend the life timer --- .../functions/fnc_treatmentAdvanced_CPRLocal.sqf | 12 +++++------- 1 file changed, 5 insertions(+), 7 deletions(-) diff --git a/addons/medical/functions/fnc_treatmentAdvanced_CPRLocal.sqf b/addons/medical/functions/fnc_treatmentAdvanced_CPRLocal.sqf index 4bb14e1139..61723319a5 100644 --- a/addons/medical/functions/fnc_treatmentAdvanced_CPRLocal.sqf +++ b/addons/medical/functions/fnc_treatmentAdvanced_CPRLocal.sqf @@ -14,17 +14,15 @@ #include "script_component.hpp" -private ["_caller","_target", "_n"]; +private ["_caller","_target", "_reviveStartTime"]; _caller = _this select 0; _target = _this select 1; -_n = _target getvariable [QEGVAR(common,ENABLE_REVIVE_COUNTER),0]; -if (_n > 0) then { - _n = _n - random(20); - if (_n < 0) then { - _n = 0; +if (_target getvariable [QGVAR(inReviveState), false]) exitwith { + _reviveStartTime = _target getvariable [QGVAR(reviveStartTime),0]; + if (_reviveStartTime > 0) then { + _target setvariable [QGVAR(reviveStartTime), (_reviveStartTime + random(20)) min ACE_time]; }; - _target setvariable [QEGVAR(common,ENABLE_REVIVE_COUNTER), _n]; }; if (random(1)>= 0.6) exitwith { From ea0be1f56342ee634a20e590e131df656f60f544 Mon Sep 17 00:00:00 2001 From: Glowbal Date: Sat, 20 Jun 2015 12:46:26 +0200 Subject: [PATCH 31/86] Only execute the local handling of CPR when in a valid state --- addons/medical/functions/fnc_treatmentAdvanced_CPR.sqf | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/addons/medical/functions/fnc_treatmentAdvanced_CPR.sqf b/addons/medical/functions/fnc_treatmentAdvanced_CPR.sqf index 0a49420783..e732920661 100644 --- a/addons/medical/functions/fnc_treatmentAdvanced_CPR.sqf +++ b/addons/medical/functions/fnc_treatmentAdvanced_CPR.sqf @@ -23,7 +23,7 @@ _selectionName = _this select 2; _className = _this select 3; _items = _this select 4; -// TODO replace by event system instead -[[_caller, _target], QUOTE(DFUNC(treatmentAdvanced_CPRLocal)), _target] call EFUNC(common,execRemoteFnc); /* TODO Replace by event system */ - +if (_target getvariable [QGVAR(inCardiacArrest), false] || _target getvariable [QGVAR(inReviveState), false]) then { + [[_caller, _target], QUOTE(DFUNC(treatmentAdvanced_CPRLocal)), _target] call EFUNC(common,execRemoteFnc); /* TODO Replace by event system */ +}; true; From c4283404e82c1159284519102472137b6cda13ea Mon Sep 17 00:00:00 2001 From: Glowbal Date: Sat, 20 Jun 2015 12:51:01 +0200 Subject: [PATCH 32/86] Changed CPR to be available for all unconscious units Including dead --- addons/medical/ACE_Medical_Treatments.hpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/addons/medical/ACE_Medical_Treatments.hpp b/addons/medical/ACE_Medical_Treatments.hpp index 8eacf39006..3576d89295 100644 --- a/addons/medical/ACE_Medical_Treatments.hpp +++ b/addons/medical/ACE_Medical_Treatments.hpp @@ -266,10 +266,10 @@ class ACE_Medical_Actions { requiredMedic = 0; treatmentTime = 15; items[] = {}; - condition = "((_this select 1) getvariable ['ACE_medical_inCardiacArrest', false])"; + condition = "!([(_this select 1)] call ace_common_fnc_isAwake)"; callbackSuccess = QUOTE(DFUNC(treatmentAdvanced_CPR)); callbackFailure = ""; - callbackProgress = "(((_this select 0) select 1) getvariable ['ACE_medical_inCardiacArrest', false])"; + callbackProgress = "!([((_this select 0) select 1)] call ace_common_fnc_isAwake)"; animationPatient = ""; animationPatientUnconscious = "AinjPpneMstpSnonWrflDnon_rolltoback"; animationCaller = "AinvPknlMstpSlayWnonDnon_medic"; From 9e00fc479bab52b14527c64eb31733f2201a8d19 Mon Sep 17 00:00:00 2001 From: Glowbal Date: Sat, 20 Jun 2015 12:51:42 +0200 Subject: [PATCH 33/86] CPR local is now also only executed when the target is still alive. Otherwise it's quite useless --- addons/medical/functions/fnc_treatmentAdvanced_CPR.sqf | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/addons/medical/functions/fnc_treatmentAdvanced_CPR.sqf b/addons/medical/functions/fnc_treatmentAdvanced_CPR.sqf index e732920661..ade74a6ccb 100644 --- a/addons/medical/functions/fnc_treatmentAdvanced_CPR.sqf +++ b/addons/medical/functions/fnc_treatmentAdvanced_CPR.sqf @@ -23,7 +23,7 @@ _selectionName = _this select 2; _className = _this select 3; _items = _this select 4; -if (_target getvariable [QGVAR(inCardiacArrest), false] || _target getvariable [QGVAR(inReviveState), false]) then { +if (alive _target && {(_target getvariable [QGVAR(inCardiacArrest), false] || _target getvariable [QGVAR(inReviveState), false])}) then { [[_caller, _target], QUOTE(DFUNC(treatmentAdvanced_CPRLocal)), _target] call EFUNC(common,execRemoteFnc); /* TODO Replace by event system */ }; true; From e153e47bb2d6624723fea4056317c8219e7c9eb1 Mon Sep 17 00:00:00 2001 From: Glowbal Date: Sat, 20 Jun 2015 12:54:00 +0200 Subject: [PATCH 34/86] Disabled litter on treatment failure. #1403 We give back the items, so litter does not make sense at the moment. In the future we need to expand this with conditions for success/failure. --- addons/medical/functions/fnc_treatment_failure.sqf | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/addons/medical/functions/fnc_treatment_failure.sqf b/addons/medical/functions/fnc_treatment_failure.sqf index 19352e5441..53fd03d2f3 100644 --- a/addons/medical/functions/fnc_treatment_failure.sqf +++ b/addons/medical/functions/fnc_treatment_failure.sqf @@ -60,4 +60,4 @@ if (isNil _callback) then { _args call _callback; -_args call FUNC(createLitter); +// _args call FUNC(createLitter); From d8353f532509d242e794e33af6c85d6e25b31094 Mon Sep 17 00:00:00 2001 From: Pashe Date: Sat, 20 Jun 2015 12:49:33 -0500 Subject: [PATCH 35/86] Fill gaps in ball tracer config --- optionals/tracers/CfgAmmo.hpp | 360 ++++++++++++++-------------------- 1 file changed, 151 insertions(+), 209 deletions(-) diff --git a/optionals/tracers/CfgAmmo.hpp b/optionals/tracers/CfgAmmo.hpp index 7155087627..a432be3286 100644 --- a/optionals/tracers/CfgAmmo.hpp +++ b/optionals/tracers/CfgAmmo.hpp @@ -1,217 +1,159 @@ class CfgAmmo { - class B_556x45_Ball; - class B_556x45_Ball_Tracer_Red : B_556x45_Ball { - model = PATHTOF(ace_TracerRed2.p3d); - }; - class B_556x45_Ball_Tracer_Green : B_556x45_Ball { - model = PATHTOF(ace_TracerGreen2.p3d); - }; - class B_556x45_Ball_Tracer_Yellow : B_556x45_Ball { - model = PATHTOF(ace_TracerYellow2.p3d); - }; - class ACE_545x39_Ball_7T3M : B_556x45_Ball_Tracer_Green { - model = PATHTOF(ace_TracerGreen2.p3d); - }; - class B_65x39_Case; - class B_65x39_Case_green: B_65x39_Case { - model = PATHTOF(ace_TracerGreen2.p3d); - }; - class B_65x39_Case_yellow: B_65x39_Case { - model = PATHTOF(ace_TracerYellow2.p3d); - }; - class B_65x39_Caseless; - class B_65x39_Caseless_green: B_65x39_Caseless { - model = PATHTOF(ace_TracerGreen2.p3d); - }; - class B_65x39_Caseless_yellow: B_65x39_Caseless { - model = PATHTOF(ace_TracerYellow2.p3d); - }; - class B_762x51_Ball; - class B_762x51_Tracer_Red: B_762x51_Ball { - model = PATHTOF(ace_TracerRed2.p3d); - }; - class B_762x51_Tracer_Green: B_762x51_Ball { - model = PATHTOF(ace_TracerGreen2.p3d); - }; - class B_762x51_Tracer_Yellow: B_762x51_Ball { - model = PATHTOF(ace_TracerYellow2.p3d); - }; - class B_762x54_Ball; - class B_762x54_Tracer_Red: B_762x54_Ball { - model = PATHTOF(ace_TracerRed2.p3d); - }; - class B_762x54_Tracer_Green: B_762x54_Ball { - model = PATHTOF(ace_TracerGreen2.p3d); - }; - class B_762x54_Tracer_Yellow: B_762x54_Ball { - model = PATHTOF(ace_TracerYellow2.p3d); - }; - class ACE_762x54_Ball_7T2 : B_762x54_Tracer_Green { - model = PATHTOF(ace_TracerGreen2.p3d); - }; - class ACE_762x39_Ball_57N231P : B_762x54_Tracer_Green { - model = PATHTOF(ace_TracerGreen2.p3d); - }; - class B_9x21_Ball; - class B_9x21_Ball_Tracer_Green: B_9x21_Ball { - model = PATHTOF(ace_TracerGreen2.p3d); - }; - class B_127x99_Ball; - class B_127x99_Ball_Tracer_Red: B_127x99_Ball { - model = PATHTOF(ace_TracerRed2.p3d); - }; - class B_127x99_Ball_Tracer_Green: B_127x99_Ball { - model = PATHTOF(ace_TracerGreen2.p3d); - }; - class B_127x99_Ball_Tracer_Yellow: B_127x99_Ball { - model = PATHTOF(ace_TracerYellow2.p3d); - }; - class B_127x99_SLAP; - class B_127x99_SLAP_Tracer_Red: B_127x99_SLAP { - model = PATHTOF(ace_TracerRed2.p3d); - }; - class B_127x99_SLAP_Tracer_Green: B_127x99_SLAP { - model = PATHTOF(ace_TracerGreen2.p3d); - }; - class B_127x99_SLAP_Tracer_Yellow: B_127x99_SLAP { - model = PATHTOF(ace_TracerYellow2.p3d); - }; - class B_30mm_HE; - class B_30mm_HE_Tracer_Red: B_30mm_HE { - model = PATHTOF(tracer_red_2.p3d); - }; - class B_30mm_HE_Tracer_Green: B_30mm_HE { - model = PATHTOF(tracer_green_2.p3d); - }; - class B_30mm_HE_Tracer_Yellow: B_30mm_HE { - model = PATHTOF(tracer_yellow_2.p3d); - }; - class B_40mm_GPR; - class B_40mm_GPR_Tracer_Red: B_40mm_GPR { - model = PATHTOF(tracer_red_2.p3d); - }; - class B_40mm_GPR_Tracer_Green: B_40mm_GPR { - model = PATHTOF(tracer_green_2.p3d); - }; - class B_40mm_GPR_Tracer_Yellow: B_40mm_GPR { - model = PATHTOF(tracer_yellow_2.p3d); - }; - class B_20mm; - class B_20mm_Tracer_Red: B_20mm { - model = PATHTOF(tracer_red_2.p3d); - }; - class B_30mm_AP; - class B_30mm_AP_Tracer_Red: B_30mm_AP { - model = PATHTOF(tracer_red_2.p3d); - }; - class B_30mm_AP_Tracer_Green: B_30mm_AP { - model = PATHTOF(tracer_green_2.p3d); - }; - class B_30mm_AP_Tracer_Yellow: B_30mm_AP { - model = PATHTOF(tracer_yellow_2.p3d); - }; - class B_30mm_APFSDS; - class B_30mm_APFSDS_Tracer_Red: B_30mm_APFSDS { - model = PATHTOF(tracer_red_2.p3d); - }; - class B_30mm_APFSDS_Tracer_Green: B_30mm_APFSDS { - model = PATHTOF(tracer_green_2.p3d); - }; - class B_30mm_APFSDS_Tracer_Yellow: B_30mm_APFSDS { - model = PATHTOF(tracer_yellow_2.p3d); - }; - class B_35mm_AA; - class B_35mm_AA_Tracer_Red: B_35mm_AA { - model = PATHTOF(tracer_red_2.p3d); - }; - class B_35mm_AA_Tracer_Green: B_35mm_AA { - model = PATHTOF(tracer_green_2.p3d); - }; - class B_35mm_AA_Tracer_Yellow: B_35mm_AA { - model = PATHTOF(tracer_yellow_2.p3d); - }; - class Sh_120mm_HE; - class Sh_120mm_HE_Tracer_Red: Sh_120mm_HE { - model = PATHTOF(ace_shell_tracer_red.p3d); - }; - class Sh_120mm_HE_Tracer_Green: Sh_120mm_HE { - model = PATHTOF(ace_shell_tracer_green.p3d); - }; - class Sh_120mm_HE_Tracer_Yellow: Sh_120mm_HE { - model = PATHTOF(ace_shell_tracer_yellow.p3d); - }; - class Sh_120mm_APFSDS; - class Sh_120mm_APFSDS_Tracer_Red: Sh_120mm_APFSDS { - model = PATHTOF(ace_shell_tracer_red.p3d); - }; - class Sh_120mm_APFSDS_Tracer_Green: Sh_120mm_APFSDS { - model = PATHTOF(ace_shell_tracer_green.p3d); - }; - class Sh_120mm_APFSDS_Tracer_Yellow: Sh_120mm_APFSDS { - model = PATHTOF(ace_shell_tracer_yellow.p3d); - }; + class BulletBase; + class ShellBase; class SubmunitionBullet; - class B_762x51_Minigun_Tracer_Red: SubmunitionBullet { - model = PATHTOF(ace_TracerRed2.p3d); - }; - class B_762x51_Minigun_Tracer_Yellow: B_762x51_Minigun_Tracer_Red { - model = PATHTOF(ace_TracerYellow2.p3d); - }; - class B_762x51_Minigun_Tracer_Red_splash: B_762x51_Ball { - model = PATHTOF(ace_TracerRed2.p3d); - }; - class B_762x51_Minigun_Tracer_Yellow_splash: B_762x51_Minigun_Tracer_Red_splash { - model = PATHTOF(ace_TracerYellow2.p3d); - }; + + //No idea + class B_56x15_dual: BulletBase {model = PATHTOF(ace_TracerRed2.p3d);}; //Replaces \A3\Weapons_f\Data\bullettracer\tracer_white + + //Pistol + class B_9x21_Ball: BulletBase {model = PATHTOF(ace_TracerRed2.p3d);}; //Replaces \A3\Weapons_f\Data\bullettracer\tracer_white + class B_9x21_Ball_Tracer_Green: B_9x21_Ball {model = PATHTOF(ace_TracerGreen2.p3d);}; //Replaces \A3\Weapons_f\Data\bullettracer\tracer_green + + class B_45ACP_Ball: BulletBase {model = PATHTOF(ace_TracerRed2.p3d);}; //Replaces \A3\Weapons_f\Data\bullettracer\tracer_red + class B_45ACP_Ball_Green: B_45ACP_Ball {model = PATHTOF(ace_TracerGreen2.p3d);}; //Replaces \A3\Weapons_f\Data\bullettracer\tracer_green + class B_45ACP_Ball_Yellow: B_45ACP_Ball {model = PATHTOF(ace_TracerYellow2.p3d);}; //Replaces \A3\Weapons_f\Data\bullettracer\tracer_yellow + + //Assault rifle + class B_556x45_Ball: BulletBase {model = PATHTOF(ace_TracerYellow2.p3d);}; //Replaces \A3\Weapons_f\Data\bullettracer\tracer_yellow + class B_556x45_Ball_Tracer_Red: B_556x45_Ball {model = PATHTOF(ace_TracerRed2.p3d);}; //Replaces \A3\Weapons_f\Data\bullettracer\tracer_red + class B_556x45_Ball_Tracer_Green: B_556x45_Ball {model = PATHTOF(ace_TracerGreen2.p3d);}; //Replaces \A3\Weapons_f\Data\bullettracer\tracer_green + class B_556x45_Ball_Tracer_Yellow: B_556x45_Ball {model = PATHTOF(ace_TracerYellow2.p3d);}; //Replaces \A3\Weapons_f\Data\bullettracer\tracer_yellow + + class B_65x39_Caseless: BulletBase {model = PATHTOF(ace_TracerRed2.p3d);}; //Replaces \A3\Weapons_f\Data\bullettracer\tracer_red + class B_65x39_Caseless_green: B_65x39_Caseless {model = PATHTOF(ace_TracerGreen2.p3d);}; //Replaces \A3\Weapons_f\Data\bullettracer\tracer_green + class B_65x39_Caseless_yellow: B_65x39_Caseless {model = PATHTOF(ace_TracerYellow2.p3d);}; //Replaces \A3\Weapons_f\Data\bullettracer\tracer_yellow + + class B_65x39_Case; + class B_65x39_Case_green: B_65x39_Case {model = PATHTOF(ace_TracerGreen2.p3d);}; //Replaces \A3\Weapons_f\Data\bullettracer\tracer_green + class B_65x39_Case_yellow: B_65x39_Case {model = PATHTOF(ace_TracerYellow2.p3d);}; //Replaces \A3\Weapons_f\Data\bullettracer\tracer_yellow + + class B_65x39_Minigun_Caseless: SubmunitionBullet {model = PATHTOF(ace_TracerRed2.p3d);}; //Replaces \A3\Weapons_f\Data\bullettracer\tracer_red + class B_65x39_Minigun_Caseless_Red_splash; + class B_65x39_Minigun_Caseless_Yellow_splash: B_65x39_Minigun_Caseless_Red_splash {model = PATHTOF(ace_TracerYellow2.p3d);}; //Replaces \A3\Weapons_f\Data\bullettracer\tracer_yellow + class B_65x39_Minigun_Caseless_Green_splash: B_65x39_Minigun_Caseless_Red_splash {model = PATHTOF(ace_TracerGreen2.p3d);}; //Replaces \A3\Weapons_f\Data\bullettracer\tracer_green + + //Battle rifle + class B_762x51_Ball: BulletBase {model = PATHTOF(ace_TracerRed2.p3d);}; //Replaces \A3\Weapons_f\Data\bullettracer\tracer_white + class B_762x51_Tracer_Red: B_762x51_Ball {model = PATHTOF(ace_TracerRed2.p3d);}; //Replaces \A3\Weapons_f\Data\bullettracer\tracer_red + class B_762x51_Tracer_Green: B_762x51_Ball {model = PATHTOF(ace_TracerGreen2.p3d);}; //Replaces \A3\Weapons_f\Data\bullettracer\tracer_green + class B_762x51_Tracer_Yellow: B_762x51_Ball {model = PATHTOF(ace_TracerYellow2.p3d);}; //Replaces \A3\Weapons_f\Data\bullettracer\tracer_yellow + + class B_762x51_Minigun_Tracer_Red: SubmunitionBullet {model = PATHTOF(ace_TracerRed2.p3d);}; //Replaces \A3\Weapons_f\Data\bullettracer\tracer_red + class B_762x51_Minigun_Tracer_Red_splash: B_762x51_Ball {model = PATHTOF(ace_TracerRed2.p3d);}; //Replaces \A3\Weapons_f\Data\bullettracer\tracer_red + + class B_762x51_Minigun_Tracer_Yellow: B_762x51_Minigun_Tracer_Red {model = PATHTOF(ace_TracerYellow2.p3d);}; //Replaces \A3\Weapons_f\Data\bullettracer\tracer_yellow + class B_762x51_Minigun_Tracer_Yellow_splash: B_762x51_Minigun_Tracer_Red_splash {model = PATHTOF(ace_TracerYellow2.p3d);}; //Replaces \A3\Weapons_f\Data\bullettracer\tracer_yellow + + class B_762x54_Ball; + class B_762x54_Tracer_Red: B_762x54_Ball {model = PATHTOF(ace_TracerRed2.p3d);}; //Replaces \A3\Weapons_f\Data\bullettracer\tracer_red + class B_762x54_Tracer_Green: B_762x54_Ball {model = PATHTOF(ace_TracerGreen2.p3d);}; //Replaces \A3\Weapons_f\Data\bullettracer\tracer_green + class B_762x54_Tracer_Yellow: B_762x54_Ball {model = PATHTOF(ace_TracerYellow2.p3d);}; //Replaces \A3\Weapons_f\Data\bullettracer\tracer_yellow + + //Sniper rifle + class B_127x99_Ball: BulletBase {model = PATHTOF(ace_TracerRed2.p3d);}; //Replaces \A3\Weapons_f\Data\bullettracer\tracer_white + class B_127x99_Ball_Tracer_Red: B_127x99_Ball {model = PATHTOF(ace_TracerRed2.p3d);}; //Replaces \A3\Weapons_f\Data\bullettracer\tracer_red + class B_127x99_Ball_Tracer_Green: B_127x99_Ball {model = PATHTOF(ace_TracerGreen2.p3d);}; //Replaces \A3\Weapons_f\Data\bullettracer\tracer_green + class B_127x99_Ball_Tracer_Yellow: B_127x99_Ball {model = PATHTOF(ace_TracerYellow2.p3d);}; //Replaces \A3\Weapons_f\Data\bullettracer\tracer_yellow + + class B_127x99_SLAP; + class B_127x99_SLAP_Tracer_Red: B_127x99_SLAP {model = PATHTOF(ace_TracerRed2.p3d);}; //Replaces \A3\Weapons_f\Data\bullettracer\tracer_red + class B_127x99_SLAP_Tracer_Green: B_127x99_SLAP {model = PATHTOF(ace_TracerGreen2.p3d);}; //Replaces \A3\Weapons_f\Data\bullettracer\tracer_green + class B_127x99_SLAP_Tracer_Yellow: B_127x99_SLAP {model = PATHTOF(ace_TracerYellow2.p3d);}; //Replaces \A3\Weapons_f\Data\bullettracer\tracer_yellow + + class B_408_Ball: BulletBase {model = PATHTOF(ace_TracerGreen2.p3d);}; //Replaces \A3\Weapons_f\Data\bullettracer\tracer_green + class B_127x33_Ball: BulletBase {model = PATHTOF(ace_TracerGreen2.p3d);}; //Replaces \A3\Weapons_f\Data\bullettracer\tracer_green + + class B_127x108_Ball: BulletBase {model = PATHTOF(ace_TracerGreen2.p3d);}; //Replaces \A3\Weapons_f\Data\bullettracer\tracer_green + + class B_338_Ball: BulletBase {model = PATHTOF(ace_TracerRed2.p3d);}; //Replaces \A3\Weapons_f\Data\bullettracer\tracer_red + + class B_338_NM_Ball: BulletBase {model = PATHTOF(ace_TracerRed2.p3d);}; //Replaces \A3\Weapons_f\Data\bullettracer\tracer_red + + class B_127x54_Ball: BulletBase {model = PATHTOF(ace_TracerGreen2.p3d);}; //Replaces \A3\Weapons_f\Data\bullettracer\tracer_green + + class B_93x64_Ball: BulletBase {model = PATHTOF(ace_TracerGreen2.p3d);}; //Replaces \A3\Weapons_f\Data\bullettracer\tracer_green + + //Autocannon + class B_19mm_HE: BulletBase {model = PATHTOF(ace_TracerRed2.p3d);}; //Replaces \A3\Weapons_f\Data\bullettracer\tracer_white + + class B_30mm_HE; + class B_30mm_HE_Tracer_Red: B_30mm_HE {model = PATHTOF(ace_TracerRed2.p3d);}; //Replaces \A3\Weapons_f\Data\bullettracer\tracer_red + class B_30mm_HE_Tracer_Green: B_30mm_HE {model = PATHTOF(ace_TracerGreen2.p3d);}; //Replaces \A3\Weapons_f\Data\bullettracer\tracer_green + class B_30mm_HE_Tracer_Yellow: B_30mm_HE {model = PATHTOF(ace_TracerYellow2.p3d);}; //Replaces \A3\Weapons_f\Data\bullettracer\tracer_yellow + + class B_30mm_MP; + class B_30mm_MP_Tracer_Red: B_30mm_MP {model = PATHTOF(ace_TracerRed2.p3d);}; //Replaces \A3\Weapons_f\Data\bullettracer\tracer_red + class B_30mm_MP_Tracer_Green: B_30mm_MP {model = PATHTOF(ace_TracerGreen2.p3d);}; //Replaces \A3\Weapons_f\Data\bullettracer\tracer_green + class B_30mm_MP_Tracer_Yellow: B_30mm_MP {model = PATHTOF(ace_TracerYellow2.p3d);}; //Replaces \A3\Weapons_f\Data\bullettracer\tracer_yellow + + class B_40mm_GPR; + class B_40mm_GPR_Tracer_Red: B_40mm_GPR {model = PATHTOF(ace_TracerRed2.p3d);}; //Replaces \A3\Weapons_f\Data\bullettracer\tracer_red + class B_40mm_GPR_Tracer_Green: B_40mm_GPR {model = PATHTOF(ace_TracerGreen2.p3d);}; //Replaces \A3\Weapons_f\Data\bullettracer\tracer_green + class B_40mm_GPR_Tracer_Yellow: B_40mm_GPR {model = PATHTOF(ace_TracerYellow2.p3d);}; //Replaces \A3\Weapons_f\Data\bullettracer\tracer_yellow + + class B_20mm: BulletBase {model = PATHTOF(ace_TracerRed2.p3d);}; //Replaces \A3\Weapons_f\Data\bullettracer\tracer_red + class B_20mm_Tracer_Red: B_20mm {model = PATHTOF(ace_TracerRed2.p3d);}; //Replaces \A3\Weapons_f\Data\bullettracer\tracer_red + + class B_25mm: BulletBase {model = PATHTOF(ace_TracerRed2.p3d);}; //Replaces \A3\Weapons_f\Data\bullettracer\tracer_white + + class B_30mm_AP: BulletBase {model = PATHTOF(ace_TracerRed2.p3d);}; //Replaces \A3\Weapons_f\Data\bullettracer\tracer_white + class B_30mm_AP_Tracer_Red: B_30mm_AP {model = PATHTOF(ace_TracerRed2.p3d);}; //Replaces \A3\Weapons_f\Data\bullettracer\tracer_red + class B_30mm_AP_Tracer_Green: B_30mm_AP {model = PATHTOF(ace_TracerGreen2.p3d);}; //Replaces \A3\Weapons_f\Data\bullettracer\tracer_green + class B_30mm_AP_Tracer_Yellow: B_30mm_AP {model = PATHTOF(ace_TracerYellow2.p3d);}; //Replaces \A3\Weapons_f\Data\bullettracer\tracer_yellow + + class B_30mm_APFSDS; + class B_30mm_APFSDS_Tracer_Red: B_30mm_APFSDS {model = PATHTOF(ace_TracerRed2.p3d);}; //Replaces \A3\Weapons_f\Data\bullettracer\tracer_red + class B_30mm_APFSDS_Tracer_Green: B_30mm_APFSDS {model = PATHTOF(ace_TracerGreen2.p3d);}; //Replaces \A3\Weapons_f\Data\bullettracer\tracer_green + class B_30mm_APFSDS_Tracer_Yellow: B_30mm_APFSDS {model = PATHTOF(ace_TracerYellow2.p3d);}; //Replaces \A3\Weapons_f\Data\bullettracer\tracer_yellow + + class B_40mm_APFSDS; + class B_40mm_APFSDS_Tracer_Red: B_40mm_APFSDS {model = PATHTOF(ace_TracerRed2.p3d);}; //Replaces \A3\Weapons_f\Data\bullettracer\tracer_red + class B_40mm_APFSDS_Tracer_Green: B_40mm_APFSDS {model = PATHTOF(ace_TracerGreen2.p3d);}; //Replaces \A3\Weapons_f\Data\bullettracer\tracer_green + class B_40mm_APFSDS_Tracer_Yellow: B_40mm_APFSDS {model = PATHTOF(ace_TracerYellow2.p3d);}; //Replaces \A3\Weapons_f\Data\bullettracer\tracer_yellow + + class B_35mm_AA: BulletBase {model = PATHTOF(ace_TracerRed2.p3d);}; //Replaces \A3\Weapons_f\Data\bullettracer\tracer_white + class B_35mm_AA_Tracer_Red: B_35mm_AA {model = PATHTOF(ace_TracerRed2.p3d);}; //Replaces \A3\Weapons_f\Data\bullettracer\tracer_red + class B_35mm_AA_Tracer_Green: B_35mm_AA {model = PATHTOF(ace_TracerGreen2.p3d);}; //Replaces \A3\Weapons_f\Data\bullettracer\tracer_green + class B_35mm_AA_Tracer_Yellow: B_35mm_AA {model = PATHTOF(ace_TracerYellow2.p3d);}; //Replaces \A3\Weapons_f\Data\bullettracer\tracer_yellow + + class Gatling_30mm_HE_Plane_CAS_01_F: BulletBase {model = PATHTOF(ace_TracerRed2.p3d);}; //Replaces \A3\Weapons_f\Data\bullettracer\tracer_red.p3d + class Cannon_30mm_HE_Plane_CAS_02_F: Gatling_30mm_HE_Plane_CAS_01_F {model = PATHTOF(ace_TracerGreen2.p3d);}; //Replaces \A3\Weapons_f\Data\bullettracer\tracer_green.p3d + + //Cannon + class Sh_120mm_HE: ShellBase {model = PATHTOF(ace_shell_tracer_red.p3d);}; //Replaces \A3\Weapons_f\Data\bullettracer\shell_tracer_white + class Sh_120mm_HE_Tracer_Red: Sh_120mm_HE {model = PATHTOF(ace_shell_tracer_red.p3d);}; //Replaces \A3\Weapons_f\Data\bullettracer\shell_tracer_red + class Sh_120mm_HE_Tracer_Green: Sh_120mm_HE {model = PATHTOF(ace_shell_tracer_green.p3d);}; //Replaces \A3\Weapons_f\Data\bullettracer\shell_tracer_green + class Sh_120mm_HE_Tracer_Yellow: Sh_120mm_HE {model = PATHTOF(ace_shell_tracer_yellow.p3d);}; //Replaces \A3\Weapons_f\Data\bullettracer\shell_tracer_yellow + + class Sh_120mm_APFSDS: ShellBase {model = PATHTOF(ace_shell_tracer_red.p3d);}; //Replaces \A3\Weapons_f\Data\bullettracer\shell_tracer_white + class Sh_120mm_APFSDS_Tracer_Red: Sh_120mm_APFSDS {model = PATHTOF(ace_shell_tracer_red.p3d);}; //Replaces \A3\Weapons_f\Data\bullettracer\shell_tracer_red + class Sh_120mm_APFSDS_Tracer_Green: Sh_120mm_APFSDS {model = PATHTOF(ace_shell_tracer_green.p3d);}; //Replaces \A3\Weapons_f\Data\bullettracer\shell_tracer_green + class Sh_120mm_APFSDS_Tracer_Yellow: Sh_120mm_APFSDS {model = PATHTOF(ace_shell_tracer_yellow.p3d);}; //Replaces \A3\Weapons_f\Data\bullettracer\shell_tracer_yellow + class Sh_125mm_APFSDS; - class Sh_125mm_APFSDS_T_Red: Sh_125mm_APFSDS { - model = PATHTOF(ace_shell_tracer_red.p3d); - }; - class Sh_125mm_APFSDS_T_Green: Sh_125mm_APFSDS { - model = PATHTOF(ace_shell_tracer_green.p3d); - }; - class Sh_125mm_APFSDS_T_Yellow: Sh_125mm_APFSDS { - model = PATHTOF(ace_shell_tracer_yellow.p3d); - }; + class Sh_125mm_APFSDS_T_Red: Sh_125mm_APFSDS {model = PATHTOF(ace_shell_tracer_red.p3d);}; //Replaces \A3\Weapons_f\Data\bullettracer\shell_tracer_red + class Sh_125mm_APFSDS_T_Green: Sh_125mm_APFSDS {model = PATHTOF(ace_shell_tracer_green.p3d);}; //Replaces \A3\Weapons_f\Data\bullettracer\shell_tracer_green + class Sh_125mm_APFSDS_T_Yellow: Sh_125mm_APFSDS {model = PATHTOF(ace_shell_tracer_yellow.p3d);}; //Replaces \A3\Weapons_f\Data\bullettracer\shell_tracer_yellow + class Sh_125mm_HE; - class Sh_125mm_HE_T_Red: Sh_125mm_HE { - model = PATHTOF(ace_shell_tracer_red.p3d); - }; - class Sh_125mm_HE_T_Green: Sh_125mm_HE { - model = PATHTOF(ace_shell_tracer_green.p3d); - }; - class Sh_125mm_HE_T_Yellow: Sh_125mm_HE { - model = PATHTOF(ace_shell_tracer_yellow.p3d); - }; + class Sh_125mm_HE_T_Red: Sh_125mm_HE {model = PATHTOF(ace_shell_tracer_red.p3d);}; //Replaces \A3\Weapons_f\Data\bullettracer\shell_tracer_red + class Sh_125mm_HE_T_Green: Sh_125mm_HE {model = PATHTOF(ace_shell_tracer_green.p3d);}; //Replaces \A3\Weapons_f\Data\bullettracer\shell_tracer_green + class Sh_125mm_HE_T_Yellow: Sh_125mm_HE {model = PATHTOF(ace_shell_tracer_yellow.p3d);}; //Replaces \A3\Weapons_f\Data\bullettracer\shell_tracer_yellow + class Sh_125mm_HEAT; - class Sh_125mm_HEAT_T_Red: Sh_125mm_HEAT { - model = PATHTOF(ace_shell_tracer_red.p3d); - }; - class Sh_125mm_HEAT_T_Green: Sh_125mm_HEAT { - model = PATHTOF(ace_shell_tracer_green.p3d); - }; - class Sh_125mm_HEAT_T_Yellow: Sh_125mm_HEAT { - model = PATHTOF(ace_shell_tracer_yellow.p3d); - }; + class Sh_125mm_HEAT_T_Red: Sh_125mm_HEAT {model = PATHTOF(ace_shell_tracer_red.p3d);}; //Replaces \A3\Weapons_f\Data\bullettracer\shell_tracer_red + class Sh_125mm_HEAT_T_Green: Sh_125mm_HEAT {model = PATHTOF(ace_shell_tracer_green.p3d);}; //Replaces \A3\Weapons_f\Data\bullettracer\shell_tracer_green + class Sh_125mm_HEAT_T_Yellow: Sh_125mm_HEAT {model = PATHTOF(ace_shell_tracer_yellow.p3d);}; //Replaces \A3\Weapons_f\Data\bullettracer\shell_tracer_yellow + class Sh_105mm_APFSDS; - class Sh_105mm_APFSDS_T_Red: Sh_105mm_APFSDS { - model = PATHTOF(ace_shell_tracer_red.p3d); - }; - class Sh_105mm_APFSDS_T_Green: Sh_105mm_APFSDS { - model = PATHTOF(ace_shell_tracer_green.p3d); - }; - class Sh_105mm_APFSDS_T_Yellow: Sh_105mm_APFSDS { - model = PATHTOF(ace_shell_tracer_yellow.p3d); - }; + class Sh_105mm_APFSDS_T_Red: Sh_105mm_APFSDS {model = PATHTOF(ace_shell_tracer_red.p3d);}; //Replaces \A3\Weapons_f\Data\bullettracer\shell_tracer_red + class Sh_105mm_APFSDS_T_Green: Sh_105mm_APFSDS {model = PATHTOF(ace_shell_tracer_green.p3d);}; //Replaces \A3\Weapons_f\Data\bullettracer\shell_tracer_green + class Sh_105mm_APFSDS_T_Yellow: Sh_105mm_APFSDS {model = PATHTOF(ace_shell_tracer_yellow.p3d);}; //Replaces \A3\Weapons_f\Data\bullettracer\shell_tracer_yellow + class Sh_105mm_HEAT_MP; - class Sh_105mm_HEAT_MP_T_Red: Sh_105mm_HEAT_MP { - model = PATHTOF(ace_shell_tracer_red.p3d); - }; - class Sh_105mm_HEAT_MP_T_Green: Sh_105mm_HEAT_MP { - model = PATHTOF(ace_shell_tracer_green.p3d); - }; - class Sh_105mm_HEAT_MP_T_Yellow: Sh_105mm_HEAT_MP { - model = PATHTOF(ace_shell_tracer_yellow.p3d); - }; -}; + class Sh_105mm_HEAT_MP_T_Red: Sh_105mm_HEAT_MP {model = PATHTOF(ace_shell_tracer_red.p3d);}; //Replaces \A3\Weapons_f\Data\bullettracer\shell_tracer_red + class Sh_105mm_HEAT_MP_T_Green: Sh_105mm_HEAT_MP {model = PATHTOF(ace_shell_tracer_green.p3d);}; //Replaces \A3\Weapons_f\Data\bullettracer\shell_tracer_green + class Sh_105mm_HEAT_MP_T_Yellow: Sh_105mm_HEAT_MP {model = PATHTOF(ace_shell_tracer_yellow.p3d);}; //Replaces \A3\Weapons_f\Data\bullettracer\shell_tracer_yellow +}; \ No newline at end of file From e4f89a96b793ec75ef80416ec481ec6cc24d9b34 Mon Sep 17 00:00:00 2001 From: SilentSpike Date: Tue, 23 Jun 2015 14:27:49 +0100 Subject: [PATCH 36/86] CheckPBO should ensure client isn't running any addons the server isn't --- addons/common/XEH_postInit.sqf | 2 +- addons/common/functions/fnc_checkFiles.sqf | 27 ++++++++++++++----- addons/common/functions/fnc_checkPBOs.sqf | 4 +-- .../common/functions/fnc_moduleCheckPBOs.sqf | 4 ++- 4 files changed, 27 insertions(+), 10 deletions(-) diff --git a/addons/common/XEH_postInit.sqf b/addons/common/XEH_postInit.sqf index 3796a4fdc8..970d1f7a58 100644 --- a/addons/common/XEH_postInit.sqf +++ b/addons/common/XEH_postInit.sqf @@ -6,7 +6,7 @@ //Singe PFEH to handle execNextFrame and waitAndExec: [{ private ["_entry"]; - + //Handle the waitAndExec array: while {((count GVAR(waitAndExecArray)) > 0) && {((GVAR(waitAndExecArray) select 0) select 0) <= ACE_Time}} do { _entry = GVAR(waitAndExecArray) deleteAt 0; diff --git a/addons/common/functions/fnc_checkFiles.sqf b/addons/common/functions/fnc_checkFiles.sqf index 631329ecee..1783588b76 100644 --- a/addons/common/functions/fnc_checkFiles.sqf +++ b/addons/common/functions/fnc_checkFiles.sqf @@ -56,20 +56,23 @@ _addons = [_addons, {_this find "ace_" == 0}] call FUNC(filter); } forEach getArray (configFile >> "ACE_Extensions" >> "extensions"); /////////////// -// check server version +// check server version/addons /////////////// if (isMultiplayer) then { if (isServer) then { // send servers version of ACE to all clients GVAR(ServerVersion) = _version; + GVAR(ServerAddons) = _addons; publicVariable QGVAR(ServerVersion); + publicVariable QGVAR(ServerAddons); } else { - // clients have to wait for the variable + // clients have to wait for the variables [{ - if (isNil QGVAR(ServerVersion)) exitWith {}; + if (isNil QGVAR(ServerVersion) || isNil QGVAR(ServerAddons)) exitWith {}; - private "_version"; - _version = _this select 0; + private ["_version","_addons"]; + _version = (_this select 0) select 0; + _addons = (_this select 0) select 1; if (_version != GVAR(ServerVersion)) then { private "_errorMsg"; @@ -82,7 +85,19 @@ if (isMultiplayer) then { }; }; + { + if !(_x in GVAR(ServerAddons)) then { + _errorMsg = format ["Client/Server Addon Mismatch. Client has extra addon: %1.",_x]; + + diag_log text format ["[ACE] ERROR: %1", _errorMsg]; + + if (hasInterface) then {diag_log str "1"; + ["[ACE] ERROR", _errorMsg, {findDisplay 46 closeDisplay 0}] call FUNC(errorMessage); + }; + }; + } forEach _addons; + [_this select 1] call CBA_fnc_removePerFrameHandler; - }, 1, _version] call CBA_fnc_addPerFrameHandler; + }, 1, [_version,_addons]] call CBA_fnc_addPerFrameHandler; }; }; diff --git a/addons/common/functions/fnc_checkPBOs.sqf b/addons/common/functions/fnc_checkPBOs.sqf index 4733f1a81f..ac6d8fb270 100644 --- a/addons/common/functions/fnc_checkPBOs.sqf +++ b/addons/common/functions/fnc_checkPBOs.sqf @@ -8,8 +8,8 @@ * 0: Warn once * 1: Warn permanently * 2: Kick - * 1: Check all PBOs? (Optional - default: "[]") - * 2: Whitelist (Optinal - default: false) + * 1: Check all PBOs? (Optional - default: false) + * 2: Whitelist (Optinal - default: "[]") * * Return value: * None diff --git a/addons/common/functions/fnc_moduleCheckPBOs.sqf b/addons/common/functions/fnc_moduleCheckPBOs.sqf index 9543b3a5c9..c75324c9a3 100644 --- a/addons/common/functions/fnc_moduleCheckPBOs.sqf +++ b/addons/common/functions/fnc_moduleCheckPBOs.sqf @@ -3,7 +3,9 @@ * Initializes the check-PBOs module. * * Arguments: - * Whatever the module provides. (I dunno.) + * 0: The module logic + * 1: units + * 2: activated * * Return Value: * None From c76972f0c255425b2b31d5271d249e84b9638e93 Mon Sep 17 00:00:00 2001 From: Fadi Date: Thu, 25 Jun 2015 09:17:36 -0500 Subject: [PATCH 37/86] Enabling ACE reloading on the RHS RPG-7 --- optionals/compat_rhs_afrf3/CfgWeapons.hpp | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/optionals/compat_rhs_afrf3/CfgWeapons.hpp b/optionals/compat_rhs_afrf3/CfgWeapons.hpp index bf5020dfc2..4c3e2e425e 100644 --- a/optionals/compat_rhs_afrf3/CfgWeapons.hpp +++ b/optionals/compat_rhs_afrf3/CfgWeapons.hpp @@ -65,4 +65,8 @@ class CfgWeapons ACE_ScopeAdjust_VerticalIncrement = 0.0; ACE_ScopeAdjust_HorizontalIncrement = 0.5; }; + class Launcher_Base_F; + class rhs_weap_rpg7: Launcher_Base_F { + ace_reloadlaunchers_enabled = 1; + }; }; \ No newline at end of file From 1234d8dd49cf7e31670660072f45ff3357064ffa Mon Sep 17 00:00:00 2001 From: Fadi Date: Thu, 25 Jun 2015 09:19:36 -0500 Subject: [PATCH 38/86] Setting ACE_isBelt for RHS magazine classes --- optionals/compat_rhs_afrf3/CfgMagazines.hpp | 17 +++++++++++ optionals/compat_rhs_usf3/CfgMagazines.hpp | 31 +++++++++++++++++++++ 2 files changed, 48 insertions(+) create mode 100644 optionals/compat_rhs_afrf3/CfgMagazines.hpp create mode 100644 optionals/compat_rhs_usf3/CfgMagazines.hpp diff --git a/optionals/compat_rhs_afrf3/CfgMagazines.hpp b/optionals/compat_rhs_afrf3/CfgMagazines.hpp new file mode 100644 index 0000000000..6acd70844a --- /dev/null +++ b/optionals/compat_rhs_afrf3/CfgMagazines.hpp @@ -0,0 +1,17 @@ +class cfgMagazines { + class VehicleMagazine; + class rhs_30Rnd_545x39_AK; + + class rhs_100Rnd_762x54mmR: rhs_30Rnd_545x39_AK { + ace_isbelt = 1; + }; + class rhs_100Rnd_762x54mmR_green: rhs_100Rnd_762x54mmR { + ace_isbelt = 1; + }; + class rhs_mag_127x108mm_50 : VehicleMagazine { + ace_isbelt = 1; + }; + class rhs_mag_127x108mm_150 : rhs_mag_127x108mm_50 { + ace_isbelt = 0; + }; +}; \ No newline at end of file diff --git a/optionals/compat_rhs_usf3/CfgMagazines.hpp b/optionals/compat_rhs_usf3/CfgMagazines.hpp new file mode 100644 index 0000000000..f067cd6eee --- /dev/null +++ b/optionals/compat_rhs_usf3/CfgMagazines.hpp @@ -0,0 +1,31 @@ +class cfgMagazines { + class CA_Magazine; + class VehicleMagazine; + class rhs_mag_30Rnd_556x45_M855A1_Stanag; + class rhs_mag_30Rnd_556x45_M200_Stanag; + + class rhsusf_100Rnd_556x45_soft_pouch: rhs_mag_30Rnd_556x45_M855A1_Stanag { + ace_isbelt = 1; + }; + class rhsusf_100Rnd_556x45_M200_soft_pouch: rhs_mag_30Rnd_556x45_M200_Stanag { + ace_isbelt = 1; + }; + class rhsusf_200Rnd_556x45_soft_pouch: rhsusf_100Rnd_556x45_soft_pouch { + ace_isbelt = 1; + }; + class rhsusf_100Rnd_762x51: CA_Magazine { + ace_isbelt = 1; + }; + class rhsusf_100Rnd_762x51_m80a1epr: rhsusf_100Rnd_762x51 { + ace_isbelt = 1; + }; + class rhsusf_100Rnd_762x51_m993: rhsusf_100Rnd_762x51 { + ace_isbelt = 1; + }; + class rhs_mag_100rnd_127x99_mag: VehicleMagazine { + ace_isbelt = 1; + }; + class RHS_48Rnd_40mm_MK19: VehicleMagazine { + ace_isbelt = 1; + }; +}; \ No newline at end of file From d96a421717af034fe5d7813d5b2b3837ab97ceb8 Mon Sep 17 00:00:00 2001 From: Fadi Date: Thu, 25 Jun 2015 09:20:16 -0500 Subject: [PATCH 39/86] Disabling ACE FCS on RHS vehicles to prevent conflict with their own hardcoded vehicle FCS --- optionals/compat_rhs_afrf3/CfgVehicles.hpp | 156 +++++++++++++++++++++ optionals/compat_rhs_afrf3/config.cpp | 2 + optionals/compat_rhs_usf3/CfgVehicles.hpp | 32 +++++ optionals/compat_rhs_usf3/config.cpp | 2 + 4 files changed, 192 insertions(+) create mode 100644 optionals/compat_rhs_afrf3/CfgVehicles.hpp create mode 100644 optionals/compat_rhs_usf3/CfgVehicles.hpp diff --git a/optionals/compat_rhs_afrf3/CfgVehicles.hpp b/optionals/compat_rhs_afrf3/CfgVehicles.hpp new file mode 100644 index 0000000000..e9c71f4da7 --- /dev/null +++ b/optionals/compat_rhs_afrf3/CfgVehicles.hpp @@ -0,0 +1,156 @@ +class cfgVehicles { + class LandVehicle; + class Tank: LandVehicle { + class NewTurret; + }; + class Tank_F: Tank { + class Turrets { + class MainTurret: NewTurret { + class Turrets { + class CommanderOptics; + }; + }; + }; + }; + class Car; + class Car_F: Car { + class ViewPilot; + class NewTurret; + }; + class Wheeled_APC_F: Car_F { + class NewTurret; + class Turrets { + class MainTurret: NewTurret + { + class ViewOptics; + }; + }; + class CommanderOptics; + }; + class rhs_bmd_base: Tank_F { + class Turrets: Turrets { + class CommanderOptics: NewTurret { + ace_fcs_Enabled = 0; + }; + class MainTurret: MainTurret { + ace_fcs_Enabled = 0; + }; + class GPMGTurret1: NewTurret { + ace_fcs_Enabled = 0; + }; + }; + }; + class rhs_bmp1tank_base: Tank_F { + class Turrets: Turrets { + class MainTurret: MainTurret { + ace_fcs_Enabled = 0; + }; + class Com_BMP1: NewTurret { + ace_fcs_Enabled = 0; + }; + }; + }; + class rhs_bmp_base: rhs_bmp1tank_base {}; + class rhs_bmp1_vdv: rhs_bmp_base {}; + class rhs_bmp2e_vdv : rhs_bmp1_vdv { + class Turrets: Turrets { + class MainTurret: MainTurret { + class Turrets: Turrets { + class CommanderOptics : CommanderOptics { + ace_fcs_Enabled = 0; + }; + }; + }; + }; + }; + class rhs_bmp3tank_base: Tank_F { + class Turrets: Turrets { + class MainTurret: MainTurret { + ace_fcs_Enabled = 0; + class Turrets: Turrets { + class CommanderOptics: CommanderOptics { + ace_fcs_Enabled = 0; + }; + }; + }; + class GPMGTurret1: NewTurret { + ace_fcs_Enabled = 0; + }; + }; + }; + class rhs_btr_base: Wheeled_APC_F { + class Turrets: Turrets { + class MainTurret: MainTurret { + ace_fcs_Enabled = 0; + }; + class CommanderOptics: CommanderOptics { + ace_fcs_Enabled = 0; + }; + }; + }; + class rhs_a3spruttank_base: Tank_F { + class Turrets: Turrets { + class MainTurret: MainTurret { + ace_fcs_Enabled = 0; + class Turrets: Turrets { + class CommanderOptics: CommanderOptics + { + ace_fcs_Enabled = 0; + }; + }; + }; + class GPMGTurret1: NewTurret { + ace_fcs_Enabled = 0; + }; + }; + }; + class rhs_a3t72tank_base: Tank_F { + class Turrets: Turrets { + class MainTurret: MainTurret { + ace_fcs_Enabled = 0; + class Turrets: Turrets { + class CommanderOptics: CommanderOptics { + ace_fcs_Enabled = 0; + }; + class CommanderMG: CommanderOptics { + ace_fcs_Enabled = 0; + }; + }; + }; + }; + }; + class rhs_t72bd_tv: rhs_a3t72tank_base {}; + class rhs_t90_tv: rhs_t72bd_tv { + class Turrets: Turrets { + class MainTurret: MainTurret { + ace_fcs_Enabled = 0; + class Turrets: Turrets { + class CommanderOptics: CommanderOptics { + ace_fcs_Enabled = 0; + }; + }; + }; + }; + }; + class rhs_tank_base: Tank_F { + class Turrets: Turrets { + class MainTurret: MainTurret { + ace_fcs_Enabled = 0; + class Turrets: Turrets { + class CommanderOptics: CommanderOptics { + ace_fcs_Enabled = 0; + }; + class CommanderMG: CommanderOptics { + ace_fcs_Enabled = 0; + }; + }; + }; + }; + }; + + class rhs_infantry_msv_base; + class rhs_pilot_base : rhs_infantry_msv_base + { + ace_gforcecoef = 0.55; + }; +}; \ No newline at end of file diff --git a/optionals/compat_rhs_afrf3/config.cpp b/optionals/compat_rhs_afrf3/config.cpp index 8b7f9d5ca4..5e88ad2830 100644 --- a/optionals/compat_rhs_afrf3/config.cpp +++ b/optionals/compat_rhs_afrf3/config.cpp @@ -12,4 +12,6 @@ class CfgPatches { }; #include "CfgAmmo.hpp" +#include "CfgMagazines.hpp" #include "CfgWeapons.hpp" +#include "CfgVehicles.hpp" \ No newline at end of file diff --git a/optionals/compat_rhs_usf3/CfgVehicles.hpp b/optionals/compat_rhs_usf3/CfgVehicles.hpp new file mode 100644 index 0000000000..2be7a8076e --- /dev/null +++ b/optionals/compat_rhs_usf3/CfgVehicles.hpp @@ -0,0 +1,32 @@ +class cfgVehicles { + class LandVehicle; + class Tank: LandVehicle { + class NewTurret; + }; + class Tank_F: Tank { + class Turrets { + class MainTurret: NewTurret { + class Turrets { + class CommanderOptics; + }; + }; + }; + }; + + class MBT_01_base_F: Tank_F {}; + class rhsusf_m1a1tank_base: MBT_01_base_F { + class Turrets: Turrets { + class MainTurret: MainTurret { + ace_fcs_Enabled = 0; + class Turrets: Turrets { + class CommanderOptics: CommanderOptics { + ace_fcs_Enabled = 0; + }; + class Loader: CommanderOptics { + ace_fcs_Enabled = 0; + }; + }; + }; + }; + }; +}; \ No newline at end of file diff --git a/optionals/compat_rhs_usf3/config.cpp b/optionals/compat_rhs_usf3/config.cpp index bc4d264697..9a13565ccf 100644 --- a/optionals/compat_rhs_usf3/config.cpp +++ b/optionals/compat_rhs_usf3/config.cpp @@ -12,4 +12,6 @@ class CfgPatches { }; #include "CfgAmmo.hpp" +#include "CfgMagazines.hpp" #include "CfgWeapons.hpp" +#include "CfgVehicles.hpp" \ No newline at end of file From c44f86432c9243a187342814fa919942625538b7 Mon Sep 17 00:00:00 2001 From: nic547 <32dominic.ri@gmail.com> Date: Thu, 25 Jun 2015 23:17:44 +0200 Subject: [PATCH 40/86] BWA3 compat: HuntIR Added HuntIR to AG40-2 --- optionals/compat_bwa3/CfgWeapons.hpp | 14 +++++++++++++- 1 file changed, 13 insertions(+), 1 deletion(-) diff --git a/optionals/compat_bwa3/CfgWeapons.hpp b/optionals/compat_bwa3/CfgWeapons.hpp index 731396ed73..c0acea9912 100644 --- a/optionals/compat_bwa3/CfgWeapons.hpp +++ b/optionals/compat_bwa3/CfgWeapons.hpp @@ -2,6 +2,7 @@ class CfgWeapons { class Pistol_Base_F; class Rifle_Base_F; class Rifle_Long_Base_F; + class UGL_F; class BWA3_P8: Pistol_Base_F { ACE_barrelTwist=248.92; ACE_barrelLength=108; @@ -30,6 +31,13 @@ class CfgWeapons { ACE_barrelTwist=304.8; ACE_barrelLength=406; }; + class BWA3_G27_AG: BWA3_G27 { + class AG40: UGL_F { + magazines[] += { + "ACE_HuntIR_M203" + }; + }; + }; class BWA3_MG4: Rifle_Long_Base_F { ACE_barrelTwist=177.8; ACE_barrelLength=480; @@ -42,7 +50,11 @@ class CfgWeapons { ACE_barrelTwist=381.0; ACE_barrelLength=736.7; }; - + class AG40: UGL_F { + magazines[] += { + "ACE_HuntIR_M203" + }; + }; class optic_Hamr; class InventoryOpticsItem_Base_F; From f4a51d57ef1453e35c11881012b7b69e862f1bfa Mon Sep 17 00:00:00 2001 From: ToasterBR Date: Sat, 27 Jun 2015 15:48:39 -0300 Subject: [PATCH 41/86] Translation to Brazilian Portuguese (PT-BR) Made all remaining translations, including new ones like the sitting module, for example. --- addons/advanced_ballistics/stringtable.xml | 24 +++++ addons/ballistics/stringtable.xml | 1 + addons/captives/stringtable.xml | 8 ++ addons/common/stringtable.xml | 16 ++++ addons/concertina_wire/stringtable.xml | 4 + addons/explosives/stringtable.xml | 10 +- addons/frag/stringtable.xml | 10 ++ addons/hearing/stringtable.xml | 4 + addons/huntir/stringtable.xml | 16 ++++ addons/interact_menu/stringtable.xml | 4 + addons/interaction/stringtable.xml | 4 + addons/map/stringtable.xml | 18 ++++ addons/medical/stringtable.xml | 104 ++++++++++++++++++++- addons/microdagr/stringtable.xml | 7 ++ addons/missileguidance/stringtable.xml | 3 + addons/missionmodules/stringtable.xml | 17 ++++ addons/mk6mortar/stringtable.xml | 8 ++ addons/mx2a/stringtable.xml | 2 + addons/nametags/stringtable.xml | 27 ++++++ addons/optionsmenu/stringtable.xml | 15 +++ addons/rangecard/stringtable.xml | 7 ++ addons/respawn/stringtable.xml | 12 +++ addons/sandbag/stringtable.xml | 12 +++ addons/sitting/stringtable.xml | 5 + addons/spottingscope/stringtable.xml | 3 + addons/switchunits/stringtable.xml | 16 +++- addons/tacticalladder/stringtable.xml | 6 ++ addons/tripod/stringtable.xml | 6 ++ addons/vehiclelock/stringtable.xml | 13 +++ addons/viewdistance/stringtable.xml | 25 +++++ addons/weather/stringtable.xml | 14 +++ addons/winddeflection/stringtable.xml | 10 ++ addons/yardage450/stringtable.xml | 3 + addons/zeus/stringtable.xml | 21 ++++- 34 files changed, 450 insertions(+), 5 deletions(-) diff --git a/addons/advanced_ballistics/stringtable.xml b/addons/advanced_ballistics/stringtable.xml index eed6e20be3..8ba88dee2b 100644 --- a/addons/advanced_ballistics/stringtable.xml +++ b/addons/advanced_ballistics/stringtable.xml @@ -31,6 +31,7 @@ Balística avanzada Erweiterte Ballistik Pokročilá balistika + Balística avançada Advanced Ballistics @@ -38,6 +39,7 @@ Balística avanzada Erweiterte Ballistik Pokročilá balistika + Balística avançada Enables advanced ballistics @@ -45,6 +47,7 @@ Activa la balística avanzada Aktiviert die erweiterte Ballistik Aktivuje pokročilou balistiku + Ativa balística avançada Enabled For Snipers @@ -52,6 +55,7 @@ Akt. dla snajperów Für Scharfschützen aktiviert Povoleno pro odstřelovače + Ativar para caçadores Enables advanced ballistics for non local snipers (when using high power optics) @@ -59,6 +63,7 @@ Aktywuje zaawansowaną balistykę dla nielokalnych snajperów (kiedy używają optyki) Aktiviert die erweiterte Ballistik für nicht lokale Scharfschützen (bei Benutzung von Optiken mit starker Vergrößerung) Aktivuje pokročilou balistiku pro nelokální odstřelovače (když používá výkonnou optiku) + Ativa balística avançada para caçadores não locais (quando usando miras telescópicas) Enabled For Group Members @@ -66,6 +71,7 @@ Akt. dla czł. grupy Für Gruppenmitglieder aktiviert Povoleno pro členy skupiny + Ativada para membros do grupo Enables advanced ballistics for non local group members @@ -73,6 +79,7 @@ Aktywuje zaawansowaną balistykę dla nielokalnych członków grupy Aktiviert die erweiterte Ballistik für nicht lokale Gruppenmitglieder Aktivuje pokročilou balistiku pro nelokální členy skupiny + Ativa balística avançada para membros de grupo não locais Enabled For Everyone @@ -80,6 +87,7 @@ Akt. dla wszystkich Für jeden aktiviert Povoleno pro všechny + Ativada para todos Enables advanced ballistics for all non local players (enabling this may degrade performance during heavy firefights in multiplayer) @@ -87,6 +95,7 @@ Aktywuje zaawansowaną balistykę dla wszystkich nielokalnych graczy (aktywacja tej opcji może spodowować spory spadek wydajności podczas ciężkiej wymiany ognia) Aktiviert die erweiterte Ballistik für alle nicht lokalen Spieler (das Aktivieren dieser Funktion kann zur Beeinträchtigung des Spielerlebnisses im Multiplayer führen) Aktivovat pokročilou balistiku pro všechny nelokální hráče (aktivace této možnosti způsobuje pokles snímu za sekundu během těžké přestřelky v multiplayeru) + Ativa balística avançada para todos os jogadores não locais (ativando isso pode degradar a performance durante troca de tiros intensas no multiplayer) Always Enabled For Group Members @@ -94,6 +103,7 @@ Siempre activada para miembros de grupo Für Gruppenmitglieder immer aktiviert Vždy povoleno pro členy skupiny + Sempre ativada para membros do grupo Always enables advanced ballistics when a group member fires @@ -101,6 +111,7 @@ Activada la balística avanzada siempre cuando miembros de grupo disparan Aktiviert die erweiterte Ballistik immer, wenn ein Gruppenmitglied schießt Aktivuje pokročilou balistiku pro členy skupiny + Sempre ative balística avançada quando um membro do grupo disparar Disabled In FullAuto Mode @@ -108,6 +119,7 @@ Desactivada en modo automático Beim vollautomatischen Feuern deaktiviert Zakázáno v automatickém režimu střelby + Desabilitar no modo automático Disables the advanced ballistics during full auto fire @@ -115,6 +127,7 @@ Desactivada la balística avanzada durante el fuego automático Deaktiviert die erweiterte Ballistik beim vollautomatischen Feuern Zákáže pokročilou balistiku během střelby v režimu automat + Desabilitar a balística avançada durante fogo automático Enable Ammo Temperature Simulation @@ -122,6 +135,7 @@ Activar simulación de temperatura de munición Simulation der Munitionstemperatur aktivieren Povolit simulaci teploty munice + Ativar simulação de temperatura de munição Muzzle velocity varies with ammo temperature @@ -129,6 +143,7 @@ La velocidad de salida varía con la temperatura de la munición Munitionstemperatur hat Einfluss auf die Mündungsgeschwindigkeit Úsťová rychlost je závislá na teplotě munice + A velocidade de saída varia com a temperatura da munição Enable Barrel Length Simulation @@ -136,6 +151,7 @@ Habilitar la simulación de longitud del cañón Simulation der Lauflänge aktivieren Povolit simulaci délky hlavně + Ativar a simulação de comprimento do cano Muzzle velocity varies with barrel length @@ -143,6 +159,7 @@ La velocidad de salidal varía con la longitud del cañón Lauflänge beeinflusst Mündungsgeschwindigkeit Úsťová rychlost je závislá na délce hlavně + A velocidade de saída caria com o comprimento do cano Enable Bullet Trace Effect @@ -150,6 +167,7 @@ Activar el efecto trazador de la bala Geschossspureffekt aktivieren Povolit efekt trasírek + Ativa efeito traçante de projétil Enables a bullet trace effect to high caliber bullets (only visible when looking through high power optics) @@ -157,6 +175,7 @@ Activa el efecto trazador de la balas de gran calibre (solo visible cuando se mira a través de una mira telescópica) Aktiviere Geschossspureffekt für hohe Kaliber (bei Benutzung von Optiken mit starker Vergrößerung) Aktivuje efekt trasírek z vysokokaliberních zbraní (viditelné pouze skrze výkonnou optiku) + Ativa o efeito traçante de projétil para projéteis de alto calibre (somente visível quando observado por miras telescópicas) Simulation Interval @@ -164,6 +183,7 @@ Intervalo de simulación Simulationsintervall Interval simulace + Intervalo da simulação Defines the interval between every calculation step @@ -171,6 +191,7 @@ Define el intervalo entre cada cálculo Legt das Intervall zwischen den Berechnungsschritten fest Určuje interval mezi každým výpočtem + Define o intervalo entre cada cálculo Simulation Radius @@ -178,6 +199,7 @@ Radio de simulación Simulationsradius Rozsah simulace + Raio de simulação Defines the radius around the player (in meters) at which advanced ballistics are applied to projectiles @@ -185,11 +207,13 @@ Define el radio alrededor del jugador (en metros) en el cual se aplica la balística avanzada a los proyectiles Gibt den Radius (in Metern) um den Spieler an, bei dem die erweiterte Ballistik auf Geschosse angewendet wird Určuje oblast kolem hráče (v metrech), kde je pokročilá balistika použita na projektil + Define o raio ao redor do jogador (em metros) onde a balística avançada será aplicada aos projéteis Moduł ten pozwala aktywować zaawansowaną balistykę biorącą przy obliczeniach trajektorii lotu pocisku pod uwagę takie rzeczy jak temperatura powietrza, ciśnienie atmosferyczne, wilgotność powietrza, siły Coriolisa i Eotvosa, grawitację a także broń z jakiej wykonywany jest strzał oraz rodzaj amunicji. Wszystko to sprowadza się na bardzo dokładne odwzorowanie balistyki. Tento modul umožňuje aktivovat pokročilou balistiku, která vypočítává trajektorii kulky a bere do úvahy věci jako je teplota vzduchu, atmosférický tlak, vlhkost vzduchu, gravitaci, typ munice a zbraň, ze které je náboj vystřelen. To vše přispívá k velmi přesné balistice. + Este módulo permite que você ative cálculos de balística avançada, fazendo a trajetória do projétil levar em consideração coisas como temperatura do ar, pressão atmosférica, umidade, força de Coriolis, a gravidade, o modelo da arma no qual o disparo é realizado e o tipo de munição. Tudo isso acrescenta-se a um balística muito precisa. \ No newline at end of file diff --git a/addons/ballistics/stringtable.xml b/addons/ballistics/stringtable.xml index 171d7936b8..db44078980 100644 --- a/addons/ballistics/stringtable.xml +++ b/addons/ballistics/stringtable.xml @@ -1598,6 +1598,7 @@ [ACE] Caja de suministros de munición [ACE] Munitionskiste [ACE] Bedna s municí + [ACE] Caixa com suprimentos de munição \ No newline at end of file diff --git a/addons/captives/stringtable.xml b/addons/captives/stringtable.xml index 19ab9050a3..a65daba683 100644 --- a/addons/captives/stringtable.xml +++ b/addons/captives/stringtable.xml @@ -163,6 +163,7 @@ Hacer que la unidad se rinda Einheit kapitulieren lassen Vzdávající se jednotka + Fazer unidade se render Sync a unit to make them surrender.<br />Source: ace_captives @@ -170,42 +171,49 @@ Sincroniza una unidad para hacer que se rinda.<br />Fuente: ace_captives Einheit synchronisieren, um sie kapitulieren zu lassen.<br />Quelle: ace_captives Synchronizuj s jednotkou, která se má vzdát.<br />Zdroj: ace_captives + Sincroniza uma unidade para fazer com que ela se renda. <br/>Fonte: ace_captives Captives Settings Ustawienia więźniów Ajustes de prisioneros Nastavení zajatce + Ajustes de prisioneiros Controls settings for surrender and cable ties Moduł ten kontroluje ustawienia kapitulacji oraz opasek zaciskowych Ajustes de control para rendición y precintos Toto kontroluje nastavení kapitulace a pout + Controla as configurações de rendição e abraçadeiras Can handcuff own side Skuwanie sojuszników Se puede esposar el bando propio Může spoutat spolubojovníky + Pode algemar o próprio lado Can players cabletie units on their own side Czy gracze mogą skuwać sojuszników? Pueden los jugadores esposar unidades en su propio bando Mohou hráči spoutat jednotky na své straně + Os jogadores podem algemar unidades do seu lado Allow surrendering Pozwól kapitulować Permitir rendición Povolit vzdávání + Permite rendição Players can surrender after holstering their weapon Gracze mogą skapitulować po schowaniu swojej broni do kabury Los jugadores pueden rendirse después de enfundar su arma Hráč se může vzdát poté, co si skryje zbraň + Jogadores podem se render depois de guardar sua arma \ No newline at end of file diff --git a/addons/common/stringtable.xml b/addons/common/stringtable.xml index 7d0de1b584..353f3dea5e 100644 --- a/addons/common/stringtable.xml +++ b/addons/common/stringtable.xml @@ -476,6 +476,7 @@ Comprobar PBOs Überprüfe PBOs Zkontrolovat PBO + Verificar PBOs @@ -483,6 +484,7 @@ Este módulo verifica la integridad de los addons con los que iniciamos el simulador Dieses Modul überprüft ob jeder Spieler die richtigen PBO-Dateien hat. Zjistit addon který je v souladu se serverem + Este módulo verifica a integridade dos addons quando iniciamos a simulação Action @@ -490,6 +492,7 @@ Acción Aktion Akce + Ação What to do with people who do not have the right PBOs? @@ -497,6 +500,7 @@ ¿Qué hacer con la gente que no tiene correctamente los PBOs? Was soll mit Leuten passieren, die nicht die richtigen PBOs haben? Co udělat s lidmi, co nemají správné addony? + O que fazer com pessoas que não tem os PBOs corretos? Warn once @@ -504,6 +508,7 @@ Avisar una vez Einmal verwarnen Upozornit jednou + Avisar uma vez Warn (permanent) @@ -511,6 +516,7 @@ Avisar (permanente) Immer verwarnen Upozornit (permanentně) + Avisar (permanente) Kick @@ -518,6 +524,7 @@ Expulsar Kicken Vyhodit + Chutar Check all addons @@ -525,6 +532,7 @@ Comprobar todos los addons Alle Addons überprüfen Zkontrolovat všechny addony + Verificar todos addons Check all addons instead of only those of ACE? @@ -532,6 +540,7 @@ Comprobar todos los addons en vez de solo los del ACE Alle Addons anstatt nur ACE überprüfen? Zkontrolovat všechny addony namísto jen těch od ACE? + Verificar todos addons invés de só os do ACE? Whitelist @@ -539,6 +548,7 @@ Lista blanca Whitelist Seznam povolených + Lista branca What addons are allowed regardless? @@ -546,6 +556,7 @@ Qué addons están permitidos igualmente Welche Addons werden dennoch erlaubt? Jaké addony jsou povoleny? + Quais addons são permitidos de qualquer maneira? LSD Vehicles @@ -553,6 +564,7 @@ Vehículos LSD LSD-Fahrzeuge LSD vozidla + Veículos LSD Adds LSD effect to synchronized vehicle @@ -560,18 +572,22 @@ Añade el efecto LSD al vehículo sincronizado Fügt einen LSD-Effekt zum synchronisierten Fahrzeug hinzu Přidá LSD efekt pro synchronizované vozidla + Adiciona efeito LSD ao veículo sincronizado Toggle Handheld Device Seleccionar dispositivo de mano + Ativa dispositivo de mão Close Handheld Device Cerrar dispositivo de mano + Fecha dispositivo de mão Cycle Handheld Devices Cambiar dispositivos de mano + Troca dispositivos de mão \ No newline at end of file diff --git a/addons/concertina_wire/stringtable.xml b/addons/concertina_wire/stringtable.xml index 0583a9448d..4400866e87 100644 --- a/addons/concertina_wire/stringtable.xml +++ b/addons/concertina_wire/stringtable.xml @@ -11,6 +11,7 @@ Ostnatý drát Concertina wire Concertina wire + Arame farpado Concertina Wire Coil @@ -22,6 +23,7 @@ Smyčka ostnatého drátu Concertina wire coil Concertina wire coil + Bobina de arame farpado Dismount Concertina Wire @@ -33,6 +35,7 @@ Svinout ostnatý drát Dismount Concertina wire Dismount Concertina wire + Desmontar arame farpado Deploy Concertina Wire @@ -44,6 +47,7 @@ Rozvinout ostnatý drát Deploy Concertina wire Deploy Concertina wire + Colocar arame farpado \ No newline at end of file diff --git a/addons/explosives/stringtable.xml b/addons/explosives/stringtable.xml index abd6d83e26..3227da5dff 100644 --- a/addons/explosives/stringtable.xml +++ b/addons/explosives/stringtable.xml @@ -511,6 +511,7 @@ Sistema de explosivos Sprengstoffsystem Systém výbušnin + Sistema de explosivos Require specialists? @@ -518,6 +519,7 @@ ¿Requiere especialista? Benötigt Sprengstoffexperten? Vyžadovat specialistu? + Requer especialista? Require explosive specialists to disable explosives? Default: No @@ -525,6 +527,7 @@ Requiere especialista en explosivos para desactivar explosivos?. Por defecto: No Benötige Sprengstoffexperte um Sprengladungen zu entschärfen? Standard: Nein Vyžadovat specialistu na zneškodnění výbušniny? Výchozí: Ne + Requer especialista em explosivos para desativar explosivos? Padrão: Não Punish non-specialists? @@ -532,6 +535,7 @@ ¿Penalizar a los no especialistas? Bestrafe Nicht-Sprengstoffexperten? Potrestat, pokud není specialista? + Punir não especialistas? Increase the time it takes to complete actions for non-specialists? Default: Yes @@ -539,18 +543,22 @@ Aumenta el tiempo que lleva completar acciones para los no especialstas?. Por defecto: Si Entschärfungszeit für Nicht-Sprengstoffexperten erhöhen? Standard: Ja Zvýšit čas potřebný k dokončení akce pokud není specialista? Výchozí: Ano + Aumentar o tempo necessário para completar ações por não especialistas? Padrão: Sim Explode on defusal? + Explosão no desarmamento? Enable certain explosives to explode on defusal? Default: Yes + Ativa certos explosivos para detonar no desarmamento? Padrão: Sim Moduł ten pozwala dostosować opcje związane z ładunkami wybuchowymi, ich podkładaniem oraz rozbrajaniem. Dieses Modul erlaubt die Einstellungen für Sprengstoffe zu verändern. Tento modul umoňuje přizpůsobit nastavení týkajících se výbušnin. + Este módulo permite personalizar as definições relacionadas a explosivos. - + \ No newline at end of file diff --git a/addons/frag/stringtable.xml b/addons/frag/stringtable.xml index fb25760e94..9fdb89ba87 100644 --- a/addons/frag/stringtable.xml +++ b/addons/frag/stringtable.xml @@ -7,6 +7,7 @@ Simulación de fragmentación Splittersimulation Simulace fragmentace + Simulação de fragmentação Enable the ACE Fragmentation Simulation @@ -14,6 +15,7 @@ Aktywuje symulację fragmentacji ACE Aktiviere die ACE-Splittersimulation Povolit ACE simulaci fragmentace + Ativa a simulação de fragmentação do ACE Spalling Simulation @@ -21,6 +23,7 @@ Symulacja odprysków Explosionssimulation Simulace úlomků + Simulação de estilhaços Enable the ACE Spalling Simulation @@ -28,6 +31,7 @@ Aktywuje symulację odprysków ACE Aktiviere ACE-Explosionssimulation Povolit ACE simulaci úlomků + Ativa a simulação de estilhaços do ACE Maximum Projectiles Tracked @@ -35,6 +39,7 @@ Maks. liczba śledzonych pocisków Maximalzahl der verfolgten Projektile Maximální počet sledovaných projektilů + Máximo de projéteis rastreados This setting controls the maximum amount of projectiles the fragmentation and spalling system will track at any given time. If more projectiles are fired, they will not be tracked. Lower this setting if you do not want FPS drops at high-count projectile scenarios ( >200 rounds in the air at once) @@ -42,6 +47,7 @@ To ustawienie kontroluje maksymalną ilość pocisków, jakie fragmentacja i odpryski symulują w danym momencie. Jeżeli więcej pocisków będzie wystrzelonych, wtedy nie będą one śledzone. Zmniejsz tą opcję jeżeli nie chcesz odczuwać spadków FPS podczas ciężkiej wymiany ognia (więcej niż 200 pocisków w powietrzu na raz). Diese Einstellung steuert die maximale Anzahl an Projektilen, die das Splitter- und Explosionssystem gleichzeitig verfolgen wird. Wenn mehr Projektile abgefeuert werden, werden sie nicht verfolgt werden. Diese Einstellung zu verringern, kann FPS-Einbrüche bei Szenarien mit vielen Projektilen verhindern (>200 Objekte gleichzeitig in der Luft) Toto nastavení kontroluje maximální množství projektilů z fragmentace a úlomků, která jsou sledována v dané době. Pokud je vystřeleno více projektilů, tak nebudou sledovány. Snižte toto nastavení pokud si nepřejete propady FPS v situacích, kde je velké množství projektilů ( >200 nábojů najednou ve vzduchu) + Esta definição controla a quantidade máxima de projéteis que o sistema de fragmentação e estilhaçamento irá acompanhar em qualquer momento. Se mais projéteis são disparados, eles não serão rastreados. Diminua essa configuração se você não quiser que o FPS caia em cenários com alta contagem de projéteis (> 200 projéteis no ar ao mesmo tempo) Maximum Projectiles Per Frame @@ -49,6 +55,7 @@ Maximale Anzahl an Projektilen pro Frame Maks. liczba pocisków na klatkę Maximální počet projektilů ze jeden snímek + Projéteis máximos por quadro The number of spall track calculations to perform in any given frame. This helps spread the FPS impact of tracking spall rounds across multiple frames, limiting its impact even further. @@ -56,12 +63,14 @@ Gibt die Anzahl der Explosionverfolgungsberechnungen an, die gleichzeitig ausgeführt werden. Das kann dabei helfen den FPS-Einfluss abzuschwächen, wenn Teile über mehrere Frames hinweg verfolgt werden. El número de cálculos de esquirlas que se hará en cualquier cuadro. Esto ayuda a dispersar el impacto en FPS del seguimiento de esquirlas de balas a través de múltiples cuadros, lo que limita aún más su impacto. Počet úlomků v daném snímku. Toto pomáhá rozšířit FPS dopad sledovaného úlomku napříč více snímky, omezuje jeho vliv ještě více. + O número de cálculos por estilhaço rastreado para executar em qualquer quadro. Isso ajuda a distribuir o impacto no FPS do rastreamento de estilhaço em vários quadros, o que limita o seu impacto ainda mais. (SP Only) Frag/Spall Debug Tracing (Solo SP) Seguimiento de depuración de Fragmentación/Astillamiento (Tylko SP) Wizualny debug odł./odpr. (Pouze SP) Debug sledování Frag/Úlomků + (Somente SP) Depuração de fragmentação e estilhaços traçantes (SP Only) Requires a mission/editor restart. Enables visual tracing of fragmentation and spalling rounds in SP game mode only. @@ -69,6 +78,7 @@ (Tylko SP) Wymaga restartu misji/edytora. Aktywuje wizualne śledzenie odłamków oraz odprysków w trybie gry Single Player. (nur SP) Splitter-/Explosions-Debugging (Pouze SP) Vyžaduje restart mise/editoru. Aktivuje vizuální stopování fragmentace a úlomů pouze v režimu jednoho hráče. + (Somente SP) Requer um reinício de missão / editor. Habilita o rastreamento visual de projéteis de fragmentação e estilhaçamento apenas no modo de jogo SP. \ No newline at end of file diff --git a/addons/hearing/stringtable.xml b/addons/hearing/stringtable.xml index 35b847c5d1..dbd063b752 100644 --- a/addons/hearing/stringtable.xml +++ b/addons/hearing/stringtable.xml @@ -115,6 +115,7 @@ Audición Gehör Sluch + Audição Enable combat deafness? @@ -122,6 +123,7 @@ ¿Habilitar sordera de combate? Aktiviere Taubheit im Gefecht? Povolit ztrátu sluchu? + Ativar surdez em combate? Enable combat deafness? @@ -129,12 +131,14 @@ Habilita la sordera de combate Aktiviere Taubheit im Gefecht? Povolit ztrátu sluchu? + Ativar surdez em combate? Głuchota bojowa pojawia się w momentach, kiedy stoimy w pobliżu broni wielkokalibrowej bez ochrony słuchu, lub np. podczas ostrzału artyleryjskiego. Moduł ten pozwala na włączenie lub wyłączenie tego efektu. Dieses Modul aktiviert/deaktiviert die Taubheit im Gefecht. Wenn aktiviert, können Spieler ohne Gehörschutz taub werden, wenn eine Waffe in ihrer Nähe abgefeuert wird oder eine Explosion stattfindet. Ztráta sluchu je možná ve chvíly, kdy se v bezprostřední blízkosti střílí z velkorážní zbraně nebo při bombardování a osoba je bez ochrany sluchu (např. špunty). Tento modul umožňuje tuto věc povolit nebo zakázat. + Este módulo ativa / desativa surdez em combate. Quando ativado, os jogadores podem ficar surdos quando uma arma é disparada ao seu redor ou uma explosão ocorre sem proteção auditiva. \ No newline at end of file diff --git a/addons/huntir/stringtable.xml b/addons/huntir/stringtable.xml index 45c6b19392..79f9a778e1 100644 --- a/addons/huntir/stringtable.xml +++ b/addons/huntir/stringtable.xml @@ -11,6 +11,7 @@ Skrzynia HuntIR HuntIR Transport Box HuntIR Transport Box + Caixa de transporte do HuntIR HuntIR Round @@ -22,6 +23,7 @@ Nabój HuntIR Munition HuntIR HuntIR lövedék + Cartucho HuntIR HuntIR monitor @@ -33,6 +35,7 @@ Odbiornik HuntIR Ecran HuntIR HuntIR monitor + Monitor HuntIR Activate HuntIR monitor @@ -44,6 +47,7 @@ Włącz odbiornik HuntIR Allumer écran HuntIR HuntIR monitor aktiválása + Ativar monitor do HuntIR Camera: @@ -55,6 +59,7 @@ Kamera: Caméra: Kamera: + Câmera: Altitude: @@ -66,6 +71,7 @@ Wysokość: Altitude: Magasság: + Altitude: Recording Time: @@ -77,6 +83,7 @@ Czas nagrywania: Temps d'enregistrement: Felvételi idő: + Tempo de gravação: Press ESC to quit camera @@ -88,6 +95,7 @@ Wciśnij ESC by wyjść z widoku kamery Appuyer sur ESC pour quitter camera Nyomj ESC-ket a kamerából való kilépéshez + Pressione ESC para sair da câmera Help @@ -99,6 +107,7 @@ Pomoc Aide Súgó + Ajuda A/D - Cycle zoom @@ -110,6 +119,7 @@ A/D - powiększenie A/D - Changement zoom A/D - Nagyítás + A/D - Troca zoom W/S - Select camera @@ -121,6 +131,7 @@ W/S - wybór kamery W/S - Sélectionner caméra W/S - Kamera váltás + W/S - Seleciona câmera Left/Right - Rotate camera @@ -132,6 +143,7 @@ Lewo/Prawo - obrót kamery w poziomie Gauche/Droite - Rotation caméra Jobb/Bal - Kamera forgatás + Esquerda/Direita - Rotaciona câmera Up/Down - Elevate/lower camera @@ -143,6 +155,7 @@ Góra/Dół - obrót kamery w pionie Haut/Bas - Monter/descendre caméra Fel/Le - Kamera döntése/süllyesztése + Acima/Abaixo - Eleva/Abaixa a câmera N - Cycle IT modes @@ -154,6 +167,7 @@ N - wybór trybu IT N - Changement de modes IT N - Hőkép módok + N - Troca modo IT R - Reset camera @@ -165,6 +179,7 @@ R - resetuj kamerę R - Reset caméra R - Kamera visszaállítása + R - Redefine a câmera Esc - Exit help @@ -176,6 +191,7 @@ Esc - wyjście z ekranu Pomocy Esc - Sortir de l'aide Exit - Kilépés a súgóból + Esc - Sai do Ajuda \ No newline at end of file diff --git a/addons/interact_menu/stringtable.xml b/addons/interact_menu/stringtable.xml index 6737729092..eb89c9ae53 100644 --- a/addons/interact_menu/stringtable.xml +++ b/addons/interact_menu/stringtable.xml @@ -222,24 +222,28 @@ Tło menu interakcji Fondo del menú de interacción Pozadí menu interakce + Fundo do menu de interação Blur the background while the interaction menu is open. Rozmywa lub przyciemnia tło na czas otwarcia menu interakcji Desenfocar el fondo mientras el menú de interacción está abierto. Rozmazat obraz pokud je interakční menu otevřené. + Desfocar o fundo enquanto o menu de interação está aberto. Blur screen Rozmycie ekranu Pantalla de desenfoque Rozmazaný obraz + Desfoque de tela Black Przyciemnienie ekranu Negra Černý obraz + Preto \ No newline at end of file diff --git a/addons/interaction/stringtable.xml b/addons/interaction/stringtable.xml index c1a9d463e9..78ec7bcac3 100644 --- a/addons/interaction/stringtable.xml +++ b/addons/interaction/stringtable.xml @@ -799,6 +799,7 @@ Sistema de interacción Interaktionssystem Systém interakce + Sistema de interação Enable Team Management @@ -806,6 +807,7 @@ Habilitar gestión de equipos Aktiviere Gruppenverwaltung Povolit správu týmu + Habilitar gestão de equipes Should players be allowed to use the Team Management Menu? Default: Yes @@ -813,12 +815,14 @@ ¿Deben tener permitido los jugadores el uso del menu de gestión de equipos? Por defecto: Si Sollen Spieler das Gruppenverwaltungsmenü verwenden dürfen? Standard: Ja Mohou hráči použít menu správy týmu? Výchozí: Ano + Devem os jogadores ter permissão de usar o menu de gestão de equipes? Padrão: Sim Na zarządzanie drużyną składa się: przydział kolorów dla członków drużyny, przejmowanie dowodzenia, dołączanie/opuszczanie drużyn. Die Gruppenverwaltung erlaubt die Zuweisung von Farben für Einheiten, die Kommandierung und das Beitreten/Verlassen einer Gruppe. Správa týmu se skládá z: přidělení barev pro členy týmu, převzetí velení, připojení/odpojení. + O módulo de gestão de equipe é composto por: a atribuição de cores para os membros da equipe, comando das equipes, juntando-se / deixando equipes. \ No newline at end of file diff --git a/addons/map/stringtable.xml b/addons/map/stringtable.xml index 930baf7835..8e3ae52da5 100644 --- a/addons/map/stringtable.xml +++ b/addons/map/stringtable.xml @@ -7,6 +7,7 @@ Mapa Karte Mapa + Mapa Map illumination? @@ -14,6 +15,7 @@ ¿Iluminación de mapa? Kartenausleuchtung Osvětlení mapy + Iluminação do mapa? Calculate dynamic map illumination based on light conditions? @@ -21,6 +23,7 @@ Calcula la iluminación dinámica del mapa basandose en las condiciones de luz Berechne die Kartenauslichtung anhand des Umgebungslichts? Vypočítat dynamické osvětlení mapy na základně světelných podmínek? + Calcular a iluminação dinâmica do mapa de acordo com as condições de luz? Map shake? @@ -28,6 +31,7 @@ ¿Temblor de mapa? Kamerawackeln Třesení mapy? + Tremor de mapa? Make map shake when walking? @@ -35,6 +39,7 @@ Hace que el mapa tiemble cuando caminas Kamerawackeln beim Gehen? Umožnit třesení mapy za pochodu? + Tremer o mapa enquanto caminha? Limit map zoom? @@ -42,6 +47,7 @@ ¿Limitar el zoom de mapa? Kartenzoom einschränken Omezit přiblížení mapy? + Limitar zoom do mapa? Limit the amount of zoom available for the map? @@ -49,6 +55,7 @@ Limita la cantidad de zoom disponible para el mapa Zoomstufe der Karte einschränken? Omezit stupeň přiblížení pro mapu? + Limitar a quantidade de zoom disponível para o mapa? Show cursor coordinates? @@ -56,6 +63,7 @@ ¿Mostrar coordenadas de cursor? Zeige Cursor-Koordinaten? Zobrazit souřadnice u kurzoru? + Mostrar coordenadas no cursor? Show the grid coordinates on the mouse pointer? @@ -63,12 +71,14 @@ Muestra las coordenadas de la cuadricula en el puntero del ratón Gitter-Koordinaten auf dem Mauszeiger anzeigen? Zobrazit souřadnice u kurzoru v mapě? + Mostrar as coordenadas de grade no ponteiro do mouse? Moduł ten pozwala dostosować opcje widoku ekranu mapy. Dieses Modul erweitert die Kartenfunktionen. Tento modul umožňuje přizpůsobit mapu s obrazem. + Este módulo permite que você personalize a tela de mapa. Blue Force Tracking @@ -76,12 +86,15 @@ Seguimiento de fuerzas amigas Blue Force Tracking Blue Force Tracking + Rastreio de forças azuis BFT Enable + RFA ativo Enable Blue Force Tracking. Default: No + Ativa Rastreio de Forças Azuis. Padrão: Não Interval @@ -89,6 +102,7 @@ Intervalo Intervall Interval + Intervalo How often the markers should be refreshed (in seconds) @@ -96,6 +110,7 @@ Frecuencia de actualización de los marcadores (en segundos) Wie oft sollen die Markierungen aktualisiert werden (in Sekunden) Jak často budou značky aktualizovány (v sekundách) + Frequência em que os marcadores devem ser atualizados (em segundos) Hide AI groups? @@ -103,6 +118,7 @@ ¿Ocultar grupos de IA? KI-Gruppen verstecken? Skrýt AI skupiny? + Esconder grupos de IA? Hide markers for 'AI only' groups? @@ -110,12 +126,14 @@ Oculta las marcas de grupos 'solo IA' Verstecke Marker für "nur KI"-Gruppen? Skrýt značky pouze pro AI skupiny? + Esconder marcadores que pertencem ao grupo de IA? Pozwala śledzić na mapie pozycje sojuszniczych jednostek za pomocą markerów BFT. Dieses Modul ermöglicht es verbündete Einheiten mit dem BFT auf der Karte zu verfolgen. Umožňuje sledovat přátelské jednokty na mapě v rámci BFT. + Permite que você acompanhe as posições no mapa das unidades aliadas com marcadores RFA. \ No newline at end of file diff --git a/addons/medical/stringtable.xml b/addons/medical/stringtable.xml index 6fa58bb759..e2fee86715 100644 --- a/addons/medical/stringtable.xml +++ b/addons/medical/stringtable.xml @@ -1592,6 +1592,7 @@ Nada Keine Žádný + Nada Weak @@ -2211,6 +2212,7 @@ Bandażowanie usuwa ślady krwi Obvázání odstraňuje skvrny od krve El vendaje elimina las manchas de sangre + Bandagem remove manchas de sangue Pain is only temporarily suppressed @@ -2218,6 +2220,7 @@ Ból jest tymczasowo zwalczany Bolest je potlačena pouze dočasně El dolor se suprime solo temporalmente + Dor é suprimida somente temporáriamente Pain Effect Type @@ -2730,6 +2733,7 @@ Médico ACE ACE-Medicsystem ACE Zdravotnické + ACE Médico Medical Settings [ACE] @@ -2738,6 +2742,7 @@ Ajustes médicos [ACE] Medizinische Einstellungen [ACE] Lékařské nastavení [ACE] + Ajustes médicos [ACE] Medical Level @@ -2746,6 +2751,7 @@ Nivel médico Medizinisches Level Úroveň medického + Nível médico What is the medical simulation level? @@ -2754,6 +2760,7 @@ ¿Cuál es el nivel de simulación médica? Wie hoch soll das medizinische Simulationslevel sein? Jaká je úroveň lékařské simulace? + Qual o nível de simulação médica? Basic @@ -2762,6 +2769,7 @@ Básico Standard Základní + Básica Advanced @@ -2770,6 +2778,7 @@ Avanzado Erweitert Pokročilé + Avançada Medics setting @@ -2778,6 +2787,7 @@ Configuración médica Medizinische Einstellungen Úroveň zdravotníků + Configuração médica What is the level of detail prefered for medics? @@ -2785,6 +2795,7 @@ Jaki jest poziom detali medycznych wyświetlanych dla medyków? ¿Cuál es el nivel de detalle preferido para los médicos? Jaká úroveň detailů je preferována pro zdravotníky? + Qual o nível de detalhe preferido para os médicos? Disable medics @@ -2793,6 +2804,7 @@ Desactivar médicos Sanitäter deaktivieren Zakázat zdravotníky + Desativar médicos Enable Litter @@ -2801,6 +2813,7 @@ Activar restos médicos Abfälle aktivieren Povolit odpadky + Ativar lixo médico Enable litter being created upon treatment @@ -2809,6 +2822,7 @@ Activar los restos médicos que se crean en el tratamiento Aktiviere Abfälle, wenn eine Behandlung durchgeführt wurde Vytváří odpad zdravotnického materiálu pří léčení + Ativar lixo ser criado após tratamento Life time of litter objects @@ -2817,6 +2831,7 @@ Tiempo de vida de los restos médicos Dauer des angezeigten Abfalls Životnost pro odpadky + Tempo de vida dos objetos do lixo How long should litter objects stay? In seconds. -1 is forever. @@ -2825,6 +2840,7 @@ ¿Por cuánto tiempo deben permanecer los restos médicos? En segundos. -1 es para siempre. Wie lange sollen Abfälle am Boden liegen (in Sekunden)? -1 ist für immer. Za jak dlouho začnou odpadky mizet? V sekundách. -1 navždy. + Quanto tempo os objetos do lixo devem ficar? Em segundos. -1 é para sempre. Enable Screams @@ -2833,6 +2849,7 @@ Activar gritos Schreie aktivieren Povolit křik + Ativar gritos Enable screaming by injuried units @@ -2841,6 +2858,7 @@ Activar gritos para unidades heridas Aktiviere Schreie bei verletzten Einheiten Povolit křičení zraněných jednotek + Ativa gritos para unidades feridas Player Damage @@ -2849,6 +2867,7 @@ Daño de jugador Spielerschaden Poškození hráče + Dano do jogador What is the damage a player can take before being killed? @@ -2857,6 +2876,7 @@ ¿Cuál es el daño que un jugador puede sufrir antes de morir? Wie viel Schaden kann ein Spieler erleiden, bevor er getötet wird? Jaké poškození může hráč dostat než bude zabit? + Qal é o dano que um jogador pode sofrer antes de morrer? AI Damage @@ -2865,6 +2885,7 @@ Daño IA KI-Schaden Poškození AI + Dano da IA What is the damage an AI can take before being killed? @@ -2873,6 +2894,7 @@ ¿Cuál es el daño que la IA puede sufrir antes de morir? Wie viel Schaden kann eine KI erleiden, bis sie getötet wird? Jaké poškození může AI dostat než bude zabito? + Qual é o dano que uma IA pode sofrer antes de morrer? AI Unconsciousness @@ -2881,6 +2903,7 @@ Inconsciencia IA KI-Bewusstlosigkeit Bezvědomí AI + Inconsciência da IA Allow AI to go unconscious @@ -2889,30 +2912,35 @@ Permita a la IA caer inconsciente KI kann bewusstlos werden Umožňuje AI upadnout do bezvědomí + Permite IA ficar inconsciente Remote Controlled AI IA controlada remotamente + IA controlada remotamente Treat remote controlled units as AI not players? ¿Tratar unidades remotamente controladas como IA? + Tratar unidades remotamente controladas como IA? Disabled Отключено Wyłączone - Activado + Desactivado Deaktiviert Zakázáno + Desativado Enabled Включено Włączone - Desactivado + Activado Aktiviert Povoleno + Ativado Prevent instant death @@ -2921,6 +2949,7 @@ Prevenir muerte instantánea Verhindere direkten Tod Zabránit okamžité smrti + Previnir morte instantânea Have a unit move to unconscious instead of death @@ -2929,6 +2958,7 @@ Mover una unidad a inconsciente en vez de a muerta Lässt eine Einheit bewusstlos werden anstatt zu sterben Jednotka upadne do bezvědomí namísto smrti + Fazer a unidade ficar inconsciente invés de morrer Bleeding coefficient @@ -2937,6 +2967,7 @@ Coeficiente de sangrado Verblutungsmultiplikator Koeficient krvácení + Coeficiente de sangramento Coefficient to modify the bleeding speed @@ -2945,6 +2976,7 @@ Coeficiente para modificar la velocidad de sangrado Multiplikator um die Verblutungsgeschwindigkeit zu verändern Koeficient rychlosti krvácení + Coeficiente para modificar a velocidade do sangramento Pain coefficient @@ -2953,6 +2985,7 @@ Coeficiente de dolor Schmerzmultiplikator Koeficient bolesti + Coeficiente de dor Coefficient to modify the pain intensity @@ -2961,6 +2994,7 @@ Coeficiente para modificar la intensidad del dolor Multiplikator um den Schmerzintensität zu verändern Koeficient intenzity bolesti + Coeficiente para modificar a instensidade de dor Sync status @@ -2969,6 +3003,7 @@ Sincronizador estado Status synchronisieren Synchronizovat status + Sincronizar estado Keep unit status synced. Recommended on. @@ -2977,6 +3012,7 @@ Mantener el estado de la unidad sincronizado. Recomendado activado Status der Einheit synchron halten. Sollte aktiviert bleiben. Udržuje status jednotky synchronizovaný. Doporučeno zapnout. + Mater o estado da unidade sincronizado. Recomendado ativado. Provides a medical system for both players and AI. @@ -2985,6 +3021,7 @@ Proporciona un sistema médico para jugadores e IA. Aktiviert ein medizinisches System für Spieler und KI. Poskytuje zdravotní systém pro hráče a AI. + Proporciona o sistema médico para os jogadores e a IA. Advanced Medical Settings [ACE] @@ -2993,6 +3030,7 @@ Ajustes médicos avanzados [ACE] Erweiterte medizinische Einstellungen [ACE] Pokročilé zdravotnické nastavení [ACE] + Ajustes médicos avançados [ACE] Enabled for @@ -3001,6 +3039,7 @@ Hablitado para Aktiviert für Povoleno pro + Habilitado para Select what units the advanced medical system will be enabled for @@ -3009,6 +3048,7 @@ Seleccione para qué unidades será habilitado el sistema médico avanzado Wähle aus welche Einheiten das erweiterte medizinische System haben Vyberte, pro jaké jednotky bude pokročilý zdravotní systém povolen + Selecione quais unidades o sistema médico avançado será habilitado Players only @@ -3017,6 +3057,7 @@ Solo jugadores Nur Spieler Pouze hráči + Somente jogadores Players and AI @@ -3025,6 +3066,7 @@ Jugadors e IA Spieler und KI Hráči a AI + Jogadores e IA Enable Advanced wounds @@ -3033,6 +3075,7 @@ Activa heridas avanzadas Aktiviere erweiterte Wunden Povolit pokročilé zranění + Ativar ferimentos avançados Allow reopening of bandaged wounds? @@ -3041,6 +3084,7 @@ Permitir la reapertura de las heridas vendadas? Erlaube das Öffnen von bandagierten Wunden? Umožnit znovuotevření zavázané rány? + Permitr reabertura de ferimentos enfaixados? Vehicle Crashes @@ -3049,6 +3093,7 @@ Accidentes de vehículos Fahrzeugunfälle Poškození z kolize + Batidas de veículos Do units take damage from a vehicle crash? @@ -3057,6 +3102,7 @@ ¿Las unidades reciben daño de un accidente de tráfico? Bekommen Einheiten von Fahrzeugunfällen Schaden? Dostane jednotka poškození při autonehodě? + As unidades recebem dano de uma batida de veículo? Allow PAK @@ -3065,6 +3111,7 @@ Permitir EPA Erlaube Erstehilfekasten Povolit osobní lékárničky + Permitir Kit de Primeiros Socorros Who can use the PAK for full heal? @@ -3073,6 +3120,7 @@ ¿Quién puede utilizar el EPA para una cura completa? Wer kann den Erstehilfekasten für eine Endheilung verwenden? Kdo může použít osobní lékárničku pro plné vyléčení? + Quem pode usar o KPS para cura completa? Anyone @@ -3081,6 +3129,7 @@ Nadie Jeder Kdokoliv + Qualquer um Medics only @@ -3089,6 +3138,7 @@ Solo médicos Nur Sanitäter Pouze zdravotník + Somente médicos Doctors only @@ -3097,6 +3147,7 @@ Solo doctores Nur Ärzte Pouze doktor + Somente doutores Remove PAK on use @@ -3105,6 +3156,7 @@ Eliminar EPA después del uso Entferne Erstehilfekasten bei Verwendung Odebrat osobní lékárničku po použití + Remover o KPS depois do uso Should PAK be removed on usage? @@ -3113,6 +3165,7 @@ El EPA será eliminado después de usarlo Sollen Erstehilfekästen bei Verwendung entfernt werden? Má se osobní lékárnička odstranit po použití? + Deve o KPS ser removido depois do uso? Locations PAK @@ -3121,6 +3174,7 @@ Ubicacions del EPA Orte für Erstehilfekasten Lokace osobní lékárničky + Localizações do KPS Where can the personal aid kit be used? @@ -3129,6 +3183,7 @@ ¿Dónde se puede utilizar el equipo de primeros auxilios? Wo kann der Erstehilfekasten verwendet werden? Kde může být osobní lékárnička použita? + Onde o kit de primeiros socorros pode ser utilizado? Anywhere @@ -3137,6 +3192,7 @@ Donde sea Überall Kdekoliv + Qualquer lugar Medical vehicles @@ -3145,6 +3201,7 @@ Vehiculos médicos Medizinische Fahrzeuge Zdravotnická vozidla + Veículos médcos Medical facility @@ -3153,6 +3210,7 @@ Centro médico Medizinische Einrichtungen Zdravotnické zařízení + Instalação médica Vehicles & facility @@ -3161,6 +3219,7 @@ Vehículos y centros Fahrzeuge & Einrichtungen Vozidla a zařízení + Veículos e instalações Disabled @@ -3169,6 +3228,7 @@ Desactivado Deaktiviert Zakázáno + Desativado Allow Surgical kit (Adv) @@ -3177,6 +3237,7 @@ Permitir equipo quirúrgico (Avanzado) Erlaube Operationskasten Povolit chirurgickou soupravu (Pokr.) + Permite kit cirúrgico (avançado) Who can use the surgical kit? @@ -3185,6 +3246,7 @@ ¿Quién puede utilizar el equipo quirúrgico? Wer kann den Operationskasten verwenden? Kdo může použít chirurgickou soupravu? + Quem pode usar o kit cirúrgico? Remove Surgical kit (Adv) @@ -3193,6 +3255,7 @@ Eliminar equipo quirúrgico (Avanzado) Enrtferne Operationskasten (erweitert) Odebrat chirurgickou soupravu (Pokr.) + Remover kit cirúrgico (avançado) Should Surgical kit be removed on usage? @@ -3201,6 +3264,7 @@ Eliminar el equipo quirúrgico después del uso Entferne Operationskästen bei Verwendung? Odebrat chirurgickou soupravu po použití? + Deve o kit cirúrgico ser removido após o uso? Locations Surgical kit (Adv) @@ -3209,6 +3273,7 @@ Ubicaciones del equipo quirúrgico (Avanzado) Orte für Operationskästen (erweitert) Lokace chirurgické soupravy (Pokr.) + Localizações do kit cirúrgico (avançado) Where can the Surgical kit be used? @@ -3217,6 +3282,7 @@ Dónde se puede utilizar el equipo quirúrgico Wo kann der Operationskasten verwendet werden? Kde může být použita chirurgická souprava? + Onde o kit cirúrgico pode ser utilizado? Bloodstains @@ -3224,6 +3290,7 @@ Plamy krwi Skvrny od krve Manchas de sangre + Manchas de sangue Bandaging removes bloodstains @@ -3231,6 +3298,7 @@ Bandażowanie usuwa ślady krwi Obvázání odstraňuje skvrny od krve El vendaje elimina las manchas de sangre + Bandagem remove manchas de sangue Pain suppression @@ -3238,6 +3306,7 @@ Zwalczanie bólu Potlačení bolesti Supresión del dolor + Supressão de dor Pain is only temporarily suppressed, not removed @@ -3245,6 +3314,7 @@ Ból jest tylko tymczasowo zwalczany, nie jest usuwany trwale Bolest je potlačena, ale jen dočastně El dolor se suprime solo temporalmente, no se elimina. + Dor é somente temporáriamente suprimida, não removida Configure the treatment settings from ACE Medical @@ -3253,6 +3323,7 @@ Configure las opciones de tratamiento del ACE Médico Behandlungseinstellungen vom ACE-Medical konfigurieren Konfigurace nastavení léčby ze zdravotnické systému ACE + Configure as opções de tratamento do ACE Médico Revive Settings [ACE] @@ -3261,6 +3332,7 @@ Sistema de resucitado [ACE] Wiederbelebungseinstellungen [ACE] Nastavení oživení [ACE] + Sistema de reavivamento [ACE] Enable Revive @@ -3269,6 +3341,7 @@ Habilitar resucitado Erlaube Wiederbelebung Povolit oživení + Habilitar reavivamento Enable a basic revive system @@ -3277,6 +3350,7 @@ Habilitar un sistema básico de resucitado Aktiviere Standard-Wiederbelebungssystem Povolit základní systém oživení + Habilitar um sistema básico de reavivamento Max Revive time @@ -3285,6 +3359,7 @@ Tiempo máximo de resucitado Maximale Wiederbelebungszeit Maximální čas pro oživení + Tempo máximo de reavivamento Max amount of seconds a unit can spend in revive state @@ -3293,6 +3368,7 @@ Cantidad máxima de segundos que una unidad puede gastar en estado de resucitación Maximale Zeitspanne in Sekunden die eine Einheit im Wiederbelebungszustand verbringen kann Maximální doba v agónii v sekundách + Quantidade máxima de segundos que uma unidade pode gastar em um estado de reavivamento Max Revive lives @@ -3301,6 +3377,7 @@ Vidas máximas de resucitado Maximale Leben bei Wiederbelebung Maximální počet oživení + Vidas máximas do reavivado Max amount of lives a unit. 0 or -1 is disabled. @@ -3309,6 +3386,7 @@ Cantidad máxima de vidas por unidad. 0 o -1 es desactivado. Maximale Anzahl von Leben einer Einheit. 0 or -1 bedeutet deaktiviert. Maximální počet životu pro jednotku. 0 nebo -1 je zakázáno. + Quantidade máxima de vidas por unidade. 0 ou -1 é desativado. Provides a medical system for both players and AI. @@ -3317,6 +3395,7 @@ Proporciona un sistema médico para jugadores e IA. Aktiviert das Medicsystem für Spieler und KI. Poskytuje zdravotní systém pro hráče a AI. + Proporciona um sistema médico para jogadores e IA. Set Medic Class [ACE] @@ -3325,6 +3404,7 @@ Establecer case médica [ACE] Setze Sanitäterklassen [ACE] Určit třídu medika [ACE] + Definir classe médica [ACE] List @@ -3333,6 +3413,7 @@ Lista Liste Seznam + Lista List of unit names that will be classified as medic, separated by commas. @@ -3341,6 +3422,7 @@ Lista de los nombres de las unidades que se clasifican como médico, separados por comas. Liste von Namen, die als Sanitäter verwendet werden. Wird durch Kommas getrennt. Seznam osob které budou klasifikovány jako zdravotník, oddělené čárkami. + Lista dos nomes das unidades que se classificam como médicos, separados por vírgulas. Is Medic @@ -3349,6 +3431,7 @@ Es médico Ist Sanitäter Je zdravotník + É médico @@ -3356,6 +3439,7 @@ Dieses Modul legt fest welche Einheit ein Sanitäter ist. Tento modul určuje, která jednotka je zdravotník. + Este módulo determina qual unidade é um paramédico. None @@ -3364,6 +3448,7 @@ Nada Keine Žádný + Nada Regular medic @@ -3372,6 +3457,7 @@ Médico regular Normaler Sanitäter Řadový zdravotník + Médico regular Doctor (Only Advanced Medics) @@ -3380,6 +3466,7 @@ Doctor (Solo medicina avanzada) Arzt (nur erweiterte Sanitäter) Doktor (Pouze pokročilý zdravotníci) + Doutor (Somente médicos avançados) Assigns the ACE medic class to a unit @@ -3388,6 +3475,7 @@ Asigna la clase médico ACE a una unidad Weise die ACE-Sanitäterklasse einer Einheit zu Přiřadí ACE třídu zdravotníka do jednotky + Atribui a classe médica do ACE a uma unidade Set Medical Vehicle [ACE] @@ -3396,6 +3484,7 @@ Establecer vehículos médicos [ACE] Setze medizinisches Fahrzeug [ACE] Určit zdravotnické vozidlo [ACE] + Definir veículo médico [ACE] List @@ -3404,6 +3493,7 @@ Lista Liste Seznam + Lista List of vehicles that will be classified as medical vehicle, separated by commas. @@ -3412,6 +3502,7 @@ Lista de los vehículos que se clasifican como vehículo médicos, separados por comas. Liste ovn Fahrzeugen, die als medizinische Fahrzeuge verwendet werden. Wird durch Kommas getrennt. Seznam vozidel které budou klasifikovány jako zdravotnická vozidla, oddělené čárkami. + Lista de veículos que serão classificados como veículos médicos, separados por vírgulas. Is Medical Vehicle @@ -3420,6 +3511,7 @@ Es vehículo médico Ist medizinisches Fahrzeug Je zdravotnické vozidlo + É um veículo médico Whatever or not the objects in the list will be a medical vehicle. @@ -3428,6 +3520,7 @@ Cualquiera de la lista o fuera de ella será un vehículo médico. Leg fest ob das Objekt in der Liste ein medizinisches Fahrzeug ist. Ať už jsou nebo nejsou objekty v seznamu budou zdravotnická vozidla. + Se serão ou não os objetos dessa lista veículos médicos. Assigns the ACE medic class to a unit @@ -3436,6 +3529,7 @@ Asigna la clase médico ACE a una unidad Weist die ACE-Sanitäterklasse einer Einheit zu Přiřadí ACE třídu zdravotníka do jednotky + Atribui a classe médica ACE a uma unidade Set Medical Facility [ACE] @@ -3444,6 +3538,7 @@ Establece el centro médico [ACE] Setze medizinische Einrichtung [ACE] Určit zdravotnické zařízení [ACE] + Definir instalação médica [ACE] Is Medical Facility @@ -3452,6 +3547,7 @@ Es centro médico Ist eine medizinische Einrichtung Je zdravotnické zařízení + É uma instalação médica Registers an object as a medical facility @@ -3460,6 +3556,7 @@ Registra un objeto como un centro médico Definiert ein Objekt als medizinische Einrichtung Registruje objekt jako zdravotnické zařízení + Registra um objeto como instalacão médica Defines an object as a medical facility. This allows for more advanced treatments. Can be used on buildings and vehicles. @@ -3468,6 +3565,7 @@ Define un objeto como un centro médico. Esto permite tratamientos más avanzados. Se puede utilizar en edificios y vehículos. Definiert ein Objekt als medizinische Einrichtung. Das ermöglicht weitere Behandlungen. Kann bei Gebäuden und Fahrzeugen verwendet werden. Definuje objekt jako zdravotnické zařízení. To umožňuje více pokročilé léčení. Může být použito na budovy nebo na vozidla. + Define um objeto como instalação médica. Isso permite tratamentos mais avançados. Pode ser utilizado em edifícios e veículos. [ACE] Medical Supply Crate (Basic) @@ -3476,6 +3574,7 @@ [ACE] Caja de suministros médicos (Básica) [ACE] Medizinische Kiste (standard) [ACE] Zdravotnické zásoby (základní) + [ACE] Caixa com suprimentos médicos [ACE] Medical Supply Crate (Advanced) @@ -3484,6 +3583,7 @@ [ACE] Caja de suministros médicos (Avanzada) [ACE] Medizinische Kiste (erweitert) [ACE] Zdravotnické zásoby (pokročilé) + [ACE] Caixa com suprimentos médicos (Avançados) Yes diff --git a/addons/microdagr/stringtable.xml b/addons/microdagr/stringtable.xml index 4a933fc993..7d3ac64af5 100644 --- a/addons/microdagr/stringtable.xml +++ b/addons/microdagr/stringtable.xml @@ -306,12 +306,14 @@ Wypełnienie mapy MicroDAGR Relleno del mapa MicroDAGR MicroDAGR - Vyplnění mapy + Preenchimento de mapa do MicroDAGR MicroDAGR Map Fill Wypełnienie mapy MicroDAGR Relleno del mapa MicroDAGR MicroDAGR - Vyplnění mapy + Preenchimento de mapa do MicroDAGR How much map data is filled on MicroDAGR's @@ -319,6 +321,7 @@ Cuanta información está disponible en el mapa del MicroDAG Wie viel Daten auf einem MicroDAGR zu sehen sind Kolik informací je načteno do MicroDAGR? + Quanta informação é preenchida no mapa do MicroDAGR Full Satellite + Buildings @@ -326,6 +329,7 @@ Satelite completo + Edificios Satellitenbild + Gebäude Satelit + Budovy + Satélite completo + Edifícios Topographical + Roads @@ -333,6 +337,7 @@ Topografico + Carreteras Topografisch + Straßen Topografické + Cesty + Topográfico + Estradas None (Cannot use map view) @@ -340,6 +345,7 @@ Nada (No se puede el mapa) Keine (kann keine Kartenansicht verwenden) Žádný (Nelze použít zobrazení mapy) + Nada (Não pode usar a tela de mapa) Controls how much data is filled on the microDAGR items. Less data restricts the map view to show less on the minimap.<br />Source: microDAGR.pbo @@ -347,6 +353,7 @@ Controla la cantidad de información disponible en el microDAGR. Menos datos limitan la vista del mapa a mostrar menos en el minimapa.<br />Fuente: microDAGR.pbo Steuert wie viel Daten auf dem microDAGR zu sehen ist. Weniger Daten schränken die Kartenansicht ein, um mehr auf der Minimap zu sehen.<br />Quelle: microDAGR.pbo Tento modul umožňuje kontrolovat, kolik informací je obsaženo v MicroDAGR. Menší množství dat omezené zobrazením mapy ukazují méně věcí na minimapě.<br />Zdroj: microDAGR.pbo + Controla quantos dados são preenchidos nos itens microDAGR. Menos dados restringe a visualização de mapa para mostrar menos informações no minimapa<br/>Fonte: MicroDAGR.pbo \ No newline at end of file diff --git a/addons/missileguidance/stringtable.xml b/addons/missileguidance/stringtable.xml index 4c18c2f4c7..2845767f15 100644 --- a/addons/missileguidance/stringtable.xml +++ b/addons/missileguidance/stringtable.xml @@ -103,6 +103,7 @@ Desactivado Aus Vypnout + Desligado Player Only @@ -110,6 +111,7 @@ Solo jugador Nur Spieler Pouze hráči + Somente jogador Player and AI @@ -117,6 +119,7 @@ Jugador e IA Spieler und KI Hráči a AI + Jogador e IA \ No newline at end of file diff --git a/addons/missionmodules/stringtable.xml b/addons/missionmodules/stringtable.xml index 2cdd0ba8a6..b99285850d 100644 --- a/addons/missionmodules/stringtable.xml +++ b/addons/missionmodules/stringtable.xml @@ -7,6 +7,7 @@ Módulo de misiones ACE ACE-Missionsmodule ACE Moduly mise + Módulo de missões ACE Ambiance Sounds [ACE] @@ -14,6 +15,7 @@ [ACE] Sonidos ambiente Umgebungsgeräusche [ACE] Zvuky prostředí [ACE] + [ACE] Sons ambientes Sounds @@ -21,6 +23,7 @@ Sonidos Sounds Zvuky + Sons Class names of the ambiance sounds to be played. Seperated by ',' @@ -28,6 +31,7 @@ Class names de los sonidos ambiente que se reproducirán. Separados por ',' Klassennamen der Umgebungsgeräusche, die abgespielt werden sollen. Getrennt durch "," Class names zvuků prostředí, které budou přehrány. Oddělené ',' + Nomes de classe dos sons de ambiente para serem reproduzidos. Separados por "," Minimal Distance @@ -35,6 +39,7 @@ Distancia mínima Mindestabstand Minimální vzdálenost + Distância mínima Used for calculating a random position and sets the minimal distance between the players and the played sound file(s) @@ -42,6 +47,7 @@ Usado para calcular una posición aleatoria y establecer la distancia mínima entre los jugadores y los ficheros de sonido reproducidos Wird verwendet, um eine zufällige Position zu bestimmen und setzt den Mindestabstand zwischen Spielern und der/den abzuspielenden Sounddatei(en) fest Používá se pro výpočet náhodné pozice a určuje minimální vzdálenost mezi hráči a přehrávaným zvukem. + Usada para calcular uma posição aleatória e definir a distância mínima entre os jogadores e os arquivos de sons que estão sendo reproduzidos. Maximum Distance @@ -49,6 +55,7 @@ Distancia máxima Maximalabstand Maximální vzdálenost + Distância máxima Used for calculating a random position and sets the maximum distance between the players and the played sound file(s) @@ -56,6 +63,7 @@ Usado para calcular una posición aleatoria y establecer la distancia máxima entre los jugadores y los ficheros de sonido reproducidos Wird verwendet, um eine zufällige Position zu bestimmen und setzt den Maximalabstand zwischen Spielern und der/den abzuspielenden Sounddatei(en) fest Používá se pro výpočet náhodné pozice a určuje maximální vzdálenost mezi hráči a přehrávaným zvukem. + Usado para calcular uma posição aleatória e definir uma distância máxima entre os jogadores e os arquivos de sons que estão sendo reproduzidos. Minimal Delay @@ -63,6 +71,7 @@ Retraso mínimo Minimale Verzögerung Minimální prodleva + Atraso mínimo Minimal delay between sounds played @@ -70,6 +79,7 @@ Retraso mínimo entre los sonidos reproducidos Minimale Verzögerung zwischen abzuspielenden Sounds Minimální prodleva mezi přehrávanými zvuky + Atraso mínimo entre os sons reproduzidos Maximum Delay @@ -77,6 +87,7 @@ Retraso máximo Maximale Verzögerung Maximální prodleva + Atraso máximo Maximum delay between sounds played @@ -84,6 +95,7 @@ Retraso máximo entre los sonidos reproducidos Maximale Verzögerung zwischen abzuspielenden Sounds Maximální prodleva mezi přehrávanými zvuky + Atraso máximo entre os sons reproduzidos Follow Players @@ -91,6 +103,7 @@ Seguir jugadores Spielern folgen Následovat hráče + Seguir jogadores Follow players. If set to false, loop will play sounds only nearby logic position. @@ -98,6 +111,7 @@ Seguir jugadores. Si esta desabilitado (false), se reproducirán sonidos en bucle solo cerca de la posición lógica. Spielern folgen. Wenn auf falsch gesetzt, werden Sounds nur in der Nähe des Logikmoduls abgespielt. Následuj hráče. Pokud je FALSE, smyčka zvuku bude přehrávána na nejbližší pozici logiki. + Segue os jogadores. Se esta desabilitado (falso), o loop reproduzirá os sons somente perto de sua posição lógica. Volume @@ -105,6 +119,7 @@ Volumen Lautstärke Hlasitost + Volume The volume of the sounds played @@ -112,6 +127,7 @@ Volumen de los sonidos reproducidos Lautstärke der abzuspielenden Sounds Hlasitost přehrávaného zvuku + O volume em que os sons serão reproduzidos Ambiance sounds loop (synced across MP) @@ -119,6 +135,7 @@ Bucle de sonidos ambiente (sincronizados en MP) Umgebungsgeräusch-Schleife (im MP synchronisiert) Smyčka okkolního zvuku (synchronizováno v MP) + Loop de sons ambientes (sincronizados através do MP) \ No newline at end of file diff --git a/addons/mk6mortar/stringtable.xml b/addons/mk6mortar/stringtable.xml index e3a80bdee7..26ab485db2 100644 --- a/addons/mk6mortar/stringtable.xml +++ b/addons/mk6mortar/stringtable.xml @@ -55,6 +55,7 @@ Ajustes MK6 MK6-Einstellungen MK6 - Nastavení + Ajustes do MK6 Air Resistance @@ -62,6 +63,7 @@ Resistencia al aire Luftwiderstand Odpor vzduchu + Resistência do Ar For Player Shots, Model Air Resistance and Wind Effects @@ -69,6 +71,7 @@ Para disparos del jugador, modelo de resistencia al aire y efectos de viento Für Spielerschüsse, Luftwiderstand und Windeffekte Pro hráčovu střelbu, Model odporu vzduchu a povětrných podmínek + Para disparos do jogador, modelo de resistência de ar e efeitos de vento Allow MK6 Computer @@ -76,6 +79,7 @@ Habilitar ordenador del MK6 Erlaube MK6-Computer MK6 - Povolit počítač + Permitir computador do MK6 Show the Computer and Rangefinder (these NEED to be removed if you enable air resistance) @@ -83,6 +87,7 @@ Muestra el ordenador y el medidor de distancia (DEBEN ser quitados si se activa la resistecia al aire) Zeige den Computer und den Entfernungsmesser an (diese MÜSSEN entfernt werden, wenn der Luftwiderstand aktiviert ist) Zobrazit počítač a dálkoměr (toto MUSÍ být odstraněno pokud je zapnut odpor vzduchu) + Mostra o computador e o medidor de distância (estes DEVEM ser removidos se você habilitar resistência do ar) Allow MK6 Compass @@ -90,6 +95,7 @@ Habilitar brujula del MK6 Erlaube MK6-Kompass MK6 - Povolit kompas + Permitir bússula do MK6 Show the MK6 Digital Compass @@ -97,12 +103,14 @@ Muestra la brujula digital en el MK6 Zeige MK6-Digitaler-Kompass MK6 - Zobrazit digitální kompas + Mostra a bússula digital do MK6 Moduł ten pozwala dostosować ustawienia moździerza MK6. Dieses Modul erlaubt das Einstellen des MK6-Mörsers. Tento modul umožňuje nastavení minometu MK6. + Este módulo permite que você ajuste o morteiro MK6. \ No newline at end of file diff --git a/addons/mx2a/stringtable.xml b/addons/mx2a/stringtable.xml index 951a606a7a..88d6bef6b5 100644 --- a/addons/mx2a/stringtable.xml +++ b/addons/mx2a/stringtable.xml @@ -6,6 +6,7 @@ MX-2A MX-2A MX-2A + MX-2A Thermal imaging device @@ -13,6 +14,7 @@ Monokular termowizyjny Dispositivo de imagen térmica Termální dalekohled + Dispositivo de imagem térmica \ No newline at end of file diff --git a/addons/nametags/stringtable.xml b/addons/nametags/stringtable.xml index 2d2fb1a26c..8571b4c537 100644 --- a/addons/nametags/stringtable.xml +++ b/addons/nametags/stringtable.xml @@ -115,6 +115,7 @@ Etiquetas de nombre Namensanzeigen Jmenovky + Etiquetas de nome Player Names View Dist. @@ -122,6 +123,7 @@ Distancia de vision para nombres de jugadores Spielernamen-Distanz Vzdálenost zobrazení jména hráčů + Distância de visão dos nomes dos jogadores Distance in meters at which player names are shown. Default: 5 @@ -129,6 +131,7 @@ Distancia en metros a la que se muestran los nombres de los jugadores. Por defecto: 5 Distanz in Metern bei der Spielernamen angezeigt werden. Standard: 5 Vzdálenost v metrech pro zobrazení jména. Výchozí: 5 + Distância em metros que os nomes dos jogadores são mostrados. Padrão: 5 Show name tags for AI? @@ -136,6 +139,7 @@ ¿Mostrar nombres para la IA? Zeige Namensanzeigen für KI? Zobrazit jmenovky pro AI? + Mostrar nomes para IA? Show the name and rank tags for friendly AI units? Default: Do not force @@ -143,6 +147,7 @@ Muestra etiquetas de nombre y rango para las unidades IA amigas? Por defecto: No forzar Zeige den Namen und Rang für freundliche KI-Einheiten? Standard: nicht erwzingen Zobrazit jména a hodnosti pro spřátelené AI jednotky? Výchozí: Nevynucovat + Mostra o nome e patente para unidades IA aliadas? Padrão: Não forçar Do Not Force @@ -150,6 +155,7 @@ No forzar Nicht erzwingen Nevynucovat + Não forçar Force Hide @@ -157,6 +163,7 @@ Ocultar forzado Verstecken erzwingen Vynuceno skrýt + Ocultar forçado Force Show @@ -164,6 +171,7 @@ Mostrar forzado Anzeigen erzwingen Vynuceno zobrazit + Mostrar forçado Show crew info? @@ -171,6 +179,7 @@ ¿Mostrar información de la tripulación? Zeige Besatzungsinfo? Zobrazit informace o posádce? + Mostrar informação de tripulação? Show vehicle crew info, or by default allows players to choose it on their own. Default: Do Not Force @@ -178,6 +187,7 @@ Muestra información de la tripulación, o por defecto permite a los jugadores elegirlo. Por defecto: No forzar Zeige Fahrzeugbesatzungsinfo oder erlaube Spielern es auszuwählen. Standard: nicht erzwingen. Zobrazit informace o posádce, nebo nechat aby si hráč vybral sám. Výchozí: Nevynucovat + Mostrar informações de tripulação ou por padrão permitir a escolha dos jogadores. Padrão: Não forçar. Show for Vehicles @@ -185,6 +195,7 @@ Mostrar para vehiculos Zeige bei Fahrzeugen Zobrazit pro vozidla + Mostrar para veículos Show cursor NameTag for vehicle commander (only if client has name tags enabled)Default: No @@ -192,6 +203,7 @@ Muestra etiquetas de nombre en el cursor para el comandante del vehiculo (solo si el cliente tiene las etiquetas de nombre activadas) Por defecto: No Zeige Maus-Namensanzeigen für Fahrzeugkommandanten (nur wenn der Client Namensanzeigen aktiviert hat). Standard: Nein Zobrazit jmenovky pro velitele vozidla (pouze pokud má klient jmenovky povolené). Výchozí: Ne + Mostrar o nome no cursor para o comandante do veículo (somente se o cliente tiver etiquetas de nomes ativada). Padrão: Não This module allows you to customize settings and range of Name Tags. @@ -199,6 +211,7 @@ Dieses Modul erlaubt die Einstellungen der Anzeigenamen zu verändern. Este módulo permite personalizar la configuración y la distancia de las Etiquetas de nombre. Tento modul umožňuje si přizpůsobit nastavení a vzdálenost jmenovky. + Este módulo permite que você personalize as configurações e distâncias de etiquetas de nome. Disabled @@ -206,6 +219,7 @@ Desactivado Deaktiviert Zakázáno + Desativado Enabled @@ -213,6 +227,7 @@ Activado Aktiviert Povoleno + Ativado Only on Cursor @@ -220,6 +235,7 @@ Solo cursor Nur bei Maus Pouze na kurzor + Somente no cursor Only on Keypress @@ -227,6 +243,7 @@ Solo al pulsar tecla Nur bei Tastendruck Pouze na klávesu + Somente em tecla ativada Only on Cursor and Keypress @@ -234,24 +251,28 @@ En cursor y al pulsar tecla Nur Maus und Tastendruck Pouze na kurzor a klávesu + Somente em cursor ou tecla ativada Force Show Only on Cursor Wymuś pod kursorem Forzar mostrar solo en el cursor Vynuceno zobrazit pouze na kurzor + Forçar mostrar somente no cursor Force Show Only on Keypress Wymuś po wciśnięciu klawisza Forzar mostrar solo al pulsar tecla Vynuceno zobrazit pouze na klávesu + Forçar somente mostrar em tecla ativada Force Show Only on Cursor and Keypress Wymuś pod kursorem i po wciśnięciu klawisza Forzar mostrar en el cursor y al pulsar tecla Vynuceno zobrazit pouze na kurzor a klávesu + Forçar mostrar somente em cursor e tecla ativada Use Nametag settings @@ -259,6 +280,7 @@ Usar ajustes de etiquetas de nombre Verwende Namenanzeigen Použít nastavení jmenovky + Usar ajustes de etiquetas de nome Always Show All @@ -266,30 +288,35 @@ Mostrar siempre todo Immer alle zeigen Vždy zobrazit vše + Sempre mostrar tudo Show player names and set their activation. Default: Enabled Opcja ta pozwala dostosować sposób wyświetlania imion nad głowami graczy. Opcja "Tylko po wciśnięciu klawisza" wyświetla imiona tylko przytrzymania klawisza "Modyfikator" dostępnego w menu ustawień addonów -> ACE3. Mostrar nombres de los jugadores y establecer su activación. Predeterminado: Habilitado Zobrazit jména hráčů a nastavit jejich aktivaci. Výchozí: Povoleno + Mostrar os nomes dos jogadores e definir sua ativação. Padrão: Ativado Effect of sound waves above the heads of speaking players after holding the PTT key. This option works with TFAR and ACRE2. Opcja ta pozwala dostosować sposób wyświetlania efektu fal dźwiękowych nad głowami mówiących graczy, wyświetlanych po przytrzymaniu klawisza PTT. Opcja ta współpracuje z TFAR oraz ACRE2. Efecto de ondas sonoras encima de las cabezas de los jugadores que hablan después de mantener la tecla PTT. Esta opción funciona con TFAR y ACRE2. Efekt zvukových vln nad hlavami hráčů když mluví skrz PTT klávesu. Tato volba funguje s TFAR a ACRE2. + Efeito de ondas sonoras acima das cabeças dos jogadores que falam depois mantendo pressionada a tecla PTT. Esta opção funciona com TFAR e ACRE2. Nametags Size Rozmiar imion Tamaño de las Etiquetas de nombre Velikost jmenovky + Tamanho das etiquetas de nome Text and Icon Size Scaling Skalowanie tekstu oraz ikon Escala del texto y el icono Velikost textu a ikon + Escala de tamanho dos ícones e textos \ No newline at end of file diff --git a/addons/optionsmenu/stringtable.xml b/addons/optionsmenu/stringtable.xml index cbd9d642bf..7b4d88f61f 100644 --- a/addons/optionsmenu/stringtable.xml +++ b/addons/optionsmenu/stringtable.xml @@ -247,6 +247,7 @@ [ACE] Permitir exportar configuración Erlaube Config-Export [ACE] Povolit export natavení [ACE] + [ACE] Permitir exportação de configurações Allow @@ -254,6 +255,7 @@ Permitir Erlaube Povolit + Permitir Allow export of all settings to a server config formatted. @@ -261,6 +263,7 @@ Permitir la exportación de todos los ajustes de configuración a un servidor con formato. Erlaube alle Einstellungen in einer Server-Config zu exportieren. Povolit exportovat všechna nastavení do formátu server configu. + Permitir exportação de todas as configurações para uma configuração formatada de servidor. When allowed, you have access to the settings modification and export in SP. Clicking export will place the formated config on your clipboard. @@ -268,6 +271,7 @@ Cuando esta permitido, se tiene acceso a los ajustes de modificación y exportación en SP. Pulsar en exportar copiara la configuración al portapapeles. Wenn erlaubt, können die Einstellungsmodifikationen angezeigt und im SP exportiert werden. Wenn auf "Exportieren" geklickt wird, wird eine formatierte Config-Datei in der Zwischenablage abgespeichert. Pokud je povoleno, budete mít přístup k modifikaci nastavení a exportování v SP. Kliknutím na export umístníte formátovaný config do vaší schránky. + Quando permitido, você tem acesso à modificação de definições e exportação em SP. Clicando em exportação colocará a configuração formatada em sua área de transferência. Hide @@ -275,6 +279,7 @@ Ocultar Verstecken Skrýt + Ocultar Top right, downwards @@ -282,6 +287,7 @@ Arriba a la derecha, hacia abajo Open rechts, nach unten Vpravo nahoře, dolů + Superior direito, para baixo Top right, to the left @@ -289,6 +295,7 @@ Arriba a la derecha, hacia la izquierda Von rechts nach links Vpravo nahoře, do leva + Superior direito, à esquerda Top left, downwards @@ -296,6 +303,7 @@ Arriba a la izquierda, hacia abajo Von links, nach unten Vlevo nahoře, dolů + Superior esquerdo, para baixo Top left, to the right @@ -303,6 +311,7 @@ Arriba a la izquierda, hacia la derecha Oben links nach rechts Vlevo nahoře, do prava + Superior esquerdo, para a direita Top @@ -310,6 +319,7 @@ Arriba Oben Nahoře + Acima Bottom @@ -317,26 +327,31 @@ Abajo Unten Dole + Abaixo Debug To Clipboard Debuguj do schowka Depurar al portapapeles Debug do schránky + Depuração para área de transferência Sends debug information to RPT and clipboard. Wysyła informacje o debugowaniu do RPT oraz schowka. Envía información de depuración al RPT y el portapapeles. Pošle debug informace do RPT a schránky. + Envia informação de depuração para RPT e área de transferência. ACE News Noticias ACE + Notícias do ACE Show News on Main Menu Mostrar noticias en el menú principal + Mostrar notícias no menu principal \ No newline at end of file diff --git a/addons/rangecard/stringtable.xml b/addons/rangecard/stringtable.xml index 535059456e..cf013f2ae3 100644 --- a/addons/rangecard/stringtable.xml +++ b/addons/rangecard/stringtable.xml @@ -6,42 +6,49 @@ Tabela balistyczna Tarjeta de distancias Vzdálenostní tabulka + Tabela de distâncias 50 METER increments -- MRAD/MRAD (reticle/turrets) Co 50 metrów - MRAD/MRAD (siatka/pokrętło) Incrementos de 50 METROS -- MRAD/MRAD (retícula/torretas) Přidat 50 METRŮ -- MRAD/MRAD (síťka/věže) + Incrementos de 50 METROS - MRAD/MRAD (retícula/torres) Open Range Card Otwórz tabelę balistyczną Abrir tarjeta de distancias Otevřít vzdálenostní tabulku + Abrir tabela de distâncias Open Range Card Copy Otwórz kopię tabeli balistycznej Abrir copia de tarjeta de distancias Otevřít kopii vzdálenostní tabulky + Abrir cópia da tabela de distâncias Open Range Card Otwórz tabelę balistyczną Abrir tarjeta de distancias Otevřít vzdálenostní tabulku + Abrir tabela de distäncias Open Range Card Copy Otwórz kopię tabeli balistycznej Abrir copia de tarjeta de distancias Otevřít kopii vzdálenostní tabulky + Abrir cópia da tabela de distâncias Copy Range Card Skopiuj tabelę balistyczną Copiar tarjeta de distancias Kopírovat vzdálenostní tabulku + Copiar tabela de distäncias \ No newline at end of file diff --git a/addons/respawn/stringtable.xml b/addons/respawn/stringtable.xml index 40bb04f53a..4b649173f0 100644 --- a/addons/respawn/stringtable.xml +++ b/addons/respawn/stringtable.xml @@ -151,6 +151,7 @@ Sistema de reaparición Respawn-System Systém znovuzrození + Sistema de Renascimento Save Gear? @@ -158,6 +159,7 @@ ¿Guardar equipo? Ausrüstung speichern? Uložit výbavu? + Salvar equipamento? Respawn with the gear a soldier had just before his death? @@ -165,6 +167,7 @@ Reaparece con el equipo que el soldado tenía justo antes de morir Mit der Ausrüstung, die ein Soldat vor seinem Tod hatte, respawnen? Znovuubjevit s výbavou kterou měl voják před smrtí? + Renascer com o equipamento que um soldado tinha antes de sua morte? Remove bodies? @@ -172,6 +175,7 @@ ¿Eliminar cuerpos? Körper entfernen? Odstranit těla? + Remover corpos? Remove player bodies after disconnect? @@ -179,12 +183,14 @@ Elimina los cuerpos de los jugadores cuando se desconecten Entferne Spielerkörper nach dem Trennen einer Verbindung? Odstranit hráčova těla po odpojení? + Remover corpos dos jogadores depois de desconectar? Moduł ten pozwala dostosować ustawienia odrodzenia (respawnu). Dieses Modul erlaubt es die Respawn-Einstellungen anzupassen. Tento modul umožňuje nastavení znovuzrození (spawn). + Este módulo permite que você personalize as configurações do renascimento (Spawn). Friendly Fire Messages @@ -192,11 +198,13 @@ Mensajes de fuego amigo Freundbeschuss-Nachrichten Upozornění na přátelskou střelbu + Mensagens de fogo amigo Użycie tego modułu na misji spowoduje wyświetlenie wiadomości na czacie w przypadku, kiedy zostanie popełniony friendly fire - wyświetlona zostanie wtedy wiadomość kto kogo zabił. Zobrazí zprávu v chatu v případě, když budete střílet na vlastní jednotky. Ve zprávě se zobrazí kdo na koho střílel, popř. kdo koho zabil. + Usando este módulo em uma missão para exibir mensagens chat, no caso de quando você faz um fogo amigo - então a mensagem será exibida mostrando quem matou quem. Rallypoint System @@ -204,11 +212,13 @@ Sistema de punto de reunión Rallypoint-System Systém shromáždění + Sistema de ponto de encontro Moduł ten pozwala zastosować na misji "punkt zbiórki", do którego można szybko przeteleportować się z "bazy". Wymaga postawienia odpowiednich obiektów na mapie - bazy oraz flagi. Obydwa dostępne są w kategorii Puste -> ACE Odrodzenie. Tento modul umožňuje určit místo shromaždiště, kam se mohou jednokty rychle teleportovat ze "základny". Toto vyžaduje vhodné objekty v mapě - základna a vlajka. Oba dva můžete najít v kategorii Prázdné -> ACE Oživení. + Este módulo permite que você aplique em uma missão "pontos de encontro", que pode rapidamente se teletransportar para a "base". Ele requer colocar objetos apropriados no mapa - base e bandeiras. Ambos estão disponíveis na categoria em branco -> ACE Revival. Move Rallypoint @@ -216,6 +226,7 @@ Mover punto de reunión Bewege Rallypoint Přesun na shromaždiště + Mover para ponto de encontro ACE Respawn @@ -223,6 +234,7 @@ Reaparición ACE ACE-Respawn ACE Znovuzrození + ACE Respawn \ No newline at end of file diff --git a/addons/sandbag/stringtable.xml b/addons/sandbag/stringtable.xml index 034a6bfdbb..70dde0da56 100644 --- a/addons/sandbag/stringtable.xml +++ b/addons/sandbag/stringtable.xml @@ -11,6 +11,7 @@ Pytel s pískem Sacco di Sabbia Homokzsák + Saco de Areia Sandbag (empty) @@ -22,6 +23,7 @@ Pytel na písek (prázdný) Sacco di Sabbia (Vuoto) Homokzsák (üres) + Saco de Areia (vazio) Cannot build here @@ -33,6 +35,7 @@ Zde nelze postavit Impossibile costruire qui Nem teheted ide + Não pode contruir aqui Pick up Sandbag @@ -44,6 +47,7 @@ Zvednout pytel Prendi Sacco di Sabbia Homokzsák felvétele + Pegar saco de areia Carry Sandbag @@ -55,6 +59,7 @@ Nést pytel Trasporta Sacco di Sabbia Homokzsák cipelése + Carregar saco de areia End Carrying @@ -66,6 +71,7 @@ Položit Fine Trasporto Cipelés abbahagyása + Parar de carregar Drop Sandbag @@ -77,6 +83,7 @@ Odložit pytel Lascia Sacco di Sabbia Homokzsák eldobása + Derrubar saco de areia Confirm Deployment @@ -88,6 +95,7 @@ Potvrdit Položení Conferma Posizionamento Lerak + Confirmar implantação Cancel Deployment @@ -99,6 +107,7 @@ Zrušit Položení Cancella Posizionamento Visszavonás + Cancelar implantação Deploy Sandbag @@ -110,6 +119,7 @@ Umístit pytel Posiziona Sacco di Sabbia Homokzsák lerakása + Implantar saco de areia Sandbag Box @@ -121,6 +131,7 @@ Bedna na pytle s pískem Contenitore Sacchi di Sabbia Homokzsákos láda + Caixa de saco de areia Here is no sand @@ -132,6 +143,7 @@ Tady není písek Qui non cè Sabbia Itt nincs homok + Aqui não tem areia + Modifier, rotates diff --git a/addons/sitting/stringtable.xml b/addons/sitting/stringtable.xml index 16eb84c59f..5565da1e11 100644 --- a/addons/sitting/stringtable.xml +++ b/addons/sitting/stringtable.xml @@ -4,19 +4,24 @@ Sit Down Usiądź + Sentar Stand Up Wstań + Levantar Enable Sitting + Habilitar opção para sentar Sitting + Sentado This module allows you to disable the ability to sit on chairs and toilets. + Este módulo permite que você desabilite a capacidade de sentar-se em cadeiras e banheiros. \ No newline at end of file diff --git a/addons/spottingscope/stringtable.xml b/addons/spottingscope/stringtable.xml index 7fc7fdee58..8c5425dc2b 100644 --- a/addons/spottingscope/stringtable.xml +++ b/addons/spottingscope/stringtable.xml @@ -11,6 +11,7 @@ Zaměřovací Dalekohled Spotting Scope Megfigyelő távcső + Luneta de observador Pick up Spotting Scope @@ -22,6 +23,7 @@ Zvednout Zaměřovací dalekohled Raccogli spottingscope Mefgigy. távcső felvétele + Pegar luneta de observador Place Spotting Scope @@ -33,6 +35,7 @@ Položit Zaměřovací dalekohled Posiziona spottingscope Megfigy. távcső elhelyezése + Colocar luneta de observador \ No newline at end of file diff --git a/addons/switchunits/stringtable.xml b/addons/switchunits/stringtable.xml index 4656504545..b392b09ca7 100644 --- a/addons/switchunits/stringtable.xml +++ b/addons/switchunits/stringtable.xml @@ -23,7 +23,7 @@ Cette unité est trop proche des ennemis Ez az egység túl közel van az ellenséghez. Questa unità è troppo vicina al nemico. - Essa unidade está muito perta do inimigo. + Essa unidade está muito perto do inimigo. SwitchUnits System @@ -31,6 +31,7 @@ Sistema de cambio de unidad Einheiten-Switch-System? Systém výměny stran + Sistema de troca de unidades Switch to West? @@ -38,6 +39,7 @@ ¿Cambiar a Oeste? Nach BLUFOR wechseln? Přesunout k BLUFOR? + Trocar para Oeste? Allow switching to west units? @@ -45,6 +47,7 @@ ¿Permitir cambios a unidades del Oeste? Erlaube das Wechseln zu BLUFOR-Einheiten? Povolit přesun k BLUFOR? + Permitir troca de unidades para o Oeste? Switch to East? @@ -52,6 +55,7 @@ ¿Cambiar a Este? Nach OPFOR wechseln? Přesunout k OPFOR? + Trocar para Leste? Allow switching to east units? @@ -59,6 +63,7 @@ ¿Permitir cambios a unidades del Este? Erlaube das Wechseln zu OPFOR-Einheiten? Povolit přesun k OPFOR? + Permitir troca de unidades para o Leste? Switch to Independent? @@ -66,6 +71,7 @@ ¿Cambiar a Independiente? Nach INDFOR wechseln? Přesunout k INDFOR? + Trocar para Indenpendente Allow switching to independent units? @@ -73,6 +79,7 @@ ¿Permitir cambios a unidades Independientes? Erlaube das Wechseln zu INDFOR-Einheiten? Povolit přesun k INDFOR? + Permitir troca de unidades para o Indenpendente? Switch to Civilian? @@ -80,6 +87,7 @@ ¿Cambiar a Civil? Nach CIVILIAN wechseln? Přesunout k CIVILISTŮM? + Trocar para Civis? Allow switching to civilian units? @@ -87,6 +95,7 @@ ¿Permitir cambios a unidades Civiles Erlaube das Wechseln zu CIVILIAN-Einheiten? Povolit přesun k CIVILISTŮM? + Permitir troca de unidades para o Civil? Enable Safe Zone? @@ -94,6 +103,7 @@ ¿Habilitar zona segura? Aktiviere Sicherheitszone? Povolit bezpečné oblasti? + Habilitar zona segura? Enable a safe zone around enemy units? Players can't switch to units inside of the safe zone. @@ -101,6 +111,7 @@ Habilita una zona segura alrededor de las unidades enemigas. Los jugadores no pueden cambiar de unidad dentro de la zona segura. Aktiviere eine Sicherheitszone um feindliche Einheiten? Spieler können nicht zu Einheiten in der Sicherheitszone wechseln. Povolit bezpečnou zónu kolem nepřátelských jednotek? Hráči se nemohou změnit strany/jednotky uvnitř bezpečné zóny. + Habilitar uma zona segur ao redor das unidades inimigas? Jogadores não conseguirão trocar para unidades dentro dessa zona segura. Safe Zone Radius @@ -108,6 +119,7 @@ Radio de la zona segura Sicherheitszonenradius Oblast bezpečné zóny + Raio da zona segura The safe zone around players from a different team. Default: 200 @@ -115,11 +127,13 @@ La zona segura alrededor de los jugadores de distintos equipos. Por defecto: 200 Die Sicherheitszone um Spieler von einem anderen Team. Standard: 200 Bezpečná zóna kolem hráče z jiných týmu. Výchozí: 200 + A zona segura ao redor dos jogadores de diferentes equipes. Padrão: 200 Tento modul umožňuje přepínání mazi dostupnými stranami. + Este módulo permite mudar o lado à disposição dos jogadores. \ No newline at end of file diff --git a/addons/tacticalladder/stringtable.xml b/addons/tacticalladder/stringtable.xml index 962cc9e6ae..4342ac5408 100644 --- a/addons/tacticalladder/stringtable.xml +++ b/addons/tacticalladder/stringtable.xml @@ -11,6 +11,7 @@ Teleskopický žebřík Telescopic Ladder Telescopic Ladder + Escada telescópica Deploy ladder @@ -22,6 +23,7 @@ Rozložit žebřík Deploy ladder Deploy ladder + Implantar escada Drop ladder @@ -33,6 +35,7 @@ Položit žebřík Drop ladder Drop ladder + Derrubar escada Adjust ladder @@ -40,6 +43,7 @@ Reguluj drabinę Upravit žebřík Ajustar escalera + Ajustar escada Position ladder @@ -51,6 +55,7 @@ Umístit žebřík Position ladder Position ladder + Posicionar escada Pickup ladder @@ -62,6 +67,7 @@ Vzít žebřík Pickup ladder Pickup ladder + Pegar escada \ No newline at end of file diff --git a/addons/tripod/stringtable.xml b/addons/tripod/stringtable.xml index baf20b9854..254af3295f 100644 --- a/addons/tripod/stringtable.xml +++ b/addons/tripod/stringtable.xml @@ -11,6 +11,7 @@ SSWT souprava SSWT Kit SSWT Kit + Kit SSWT Place SSWT Kit @@ -22,30 +23,35 @@ Rozlož souprava SSWT Place SSWT Kit Place SSWT Kit + Colocar kit SSWT Pick up SSWT Kit Podnieś trójnóg snajperski Coger equipo SSWT Zvednout SSWT soupravu + Pegar kit SSWT Adjust SSWT Kit Reguluj trójnóg snajperski Ajustar equipo SSWT Regulovat SSWT soupravu + Ajustar kit SSWT Done Gotowe Hecho Hotovo + Feito + Modifier, adjust + Modyfikator, regulacja + Modificador, ajuste + Modifikátor, regulace + + Modificador, ajuste \ No newline at end of file diff --git a/addons/vehiclelock/stringtable.xml b/addons/vehiclelock/stringtable.xml index 23d8b380b9..89a64faf8a 100644 --- a/addons/vehiclelock/stringtable.xml +++ b/addons/vehiclelock/stringtable.xml @@ -139,6 +139,7 @@ Configuración del cierre del vehiculo Fahrzeugsperreinstellungen Nastavení zámku vozidla + Configuração de fechadura do veículo Lock Vehicle Inventory @@ -146,6 +147,7 @@ Bloquear inventario del vehículo Sperre Fahrzeuginventar Inventář zamčeného vozidla + Bloquear inventário do veículo Locks the inventory of locked vehicles @@ -153,6 +155,7 @@ Bloquea el inventario de los vehículos cerrados Sperrt das Inventar von gesperrten Fahrzeugen Zamknout inventář u zamčených vozidel + Bloqueia o inventário de veículos fechados Vehicle Starting Lock State @@ -160,6 +163,7 @@ Estado inicial del cierre en vehículos Fahrzeuge spawnen gesperrt Počáteční stav zámku vozidla + Estado inicial da fechadura dos veículos Set lock state for all vehicles (removes ambiguous lock states) @@ -167,6 +171,7 @@ Establece el estado de cierre para todos los vehículos (elimina estados de cierre ambiguos) Setze Sperrstatus für alle Fahrzeuge (entfernt unklare Sperrzustände) Nastavit stav zámku u všech vozidel (odstraňuje nejednoznačné stavy zámků) + Definir estados de fechadura para todos os veículos (remove estados de fechadura ambíguos) As Is @@ -174,6 +179,7 @@ Está Unverändert Jak je + Como está Locked @@ -181,6 +187,7 @@ Cerrado Gesperrt Zamčeno + Fechado Unlocked @@ -188,6 +195,7 @@ Abierto Offen Odemčeno + Aberto Default Lockpick Strength @@ -195,6 +203,7 @@ Durabilidad de la ganzua por defecto Standard-Pick-Stärke Výchozí síla páčidla + Durabilidade padrão da chave micha Default Time to lockpick (in seconds). Default: 10 @@ -202,6 +211,7 @@ Tiempo por defecto para forzar cerradura (en segundos). Por defecto: 10 Standardzeit um ein Schloss zu knacken (in Sekunden). Standard: 10 Čas k vypáčení zámku (v sekundách). Výchozí: 10 + Tempo padrão para forçar a fechadura (em segundos). Padrão: 10 Settings for lockpick strength and initial vehicle lock state. Removes ambiguous lock states.<br />Source: vehiclelock.pbo @@ -209,6 +219,7 @@ Ajustes de la durabilidad de la ganzua y el estado inicial del cierre de los vehículos. Elimina estados de cierre ambiguos.<br />Fuente: vehiclelock.pbo Einstellungen für Pick-Stärke und anfänglichen Fahrzeugsperrzustand. Entfernt unklare Sperrzustände.<br />Quelle: vehiclelock.pbo Nastavení síly vypáčení a počáteční stav zámku vozidla. Odstraňuje nejednoznačné stavy zámků.<br />Zdroj: vehiclelock.pbo + Definições para a durabilidade da chave micha e estado inicial da fechadura do veículo. Remove estados de fechadura ambíguas <br /> Fonte: Vehiclelock.pbo Vehicle Key Assign @@ -216,6 +227,7 @@ Asignacion de la llave del vehículo Fahrzeugschlüsselzuweisung Přidělení klíče k vozidlu + Atribuição de chave de veículo 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 @@ -223,6 +235,7 @@ Sincronizar con vehiculos y jugadores. Distribuirá llaves personalizadas a los jugadores para todos los vehículos sincronizados. Solo valido para objetos presentes al inicio de la mision.<br />Fuente: vehiclelock.pbo Synchronisiere mit Fahrzeugen und Spielern. Wird eigene Schlüssel an Spieler für jedes synchronisierte Fahrzeuge aushändigen. Nur gültig für am Missionsstart existierende Fahrzeuge.<br />Quelle: vehiclelock.pbo Synchronizuj s vozidly a hráči. Hráč dostane klíč ke každému synchonizovanému vozidlu. Platné pouze pro objekty přítomné na začátku mise.<br />Zdroj: vehiclelock.pbo + Sincronizar com veículos e jogadores. Irá distribuir chaves personalizadas para os jogadores para cada veículo sincronizado. Só é válido para objetos presentes no início da missão <br /> Fonte: vehiclelock.pbo \ No newline at end of file diff --git a/addons/viewdistance/stringtable.xml b/addons/viewdistance/stringtable.xml index 9cb7fcde2e..b8de5321c2 100644 --- a/addons/viewdistance/stringtable.xml +++ b/addons/viewdistance/stringtable.xml @@ -6,150 +6,175 @@ Ogranicznik zasięgu widzenia Limitador de distancia de visión Omezovač dohlednosti + Limitador de distância de visão Allows limiting maximum view distance that can be set by players. Pozwala ustawić maksymalny limit zasięgu widzenia. Permite limitar la distancia máxima de visión que se puede establecer por los jugadores. Umožňuje určit maximální dohlednost, kterou si může hráč nastavit + Permite limitar a distância máxima de visão que pode ser definida pelos jogadores. Enable ACE viewdistance Wł. zasięg widzenia ACE Habilitar distancia de visión ACE Povolit ACE dohlednost + Habilitar distância de visão ACE Enables ACE viewdistance Aktywuje możliwość zmiany zasięgu widzenia w menu ustawień ACE Habilita la distancia de visión ACE Povolit ACE dohlednost + Habilita a distância de visão ACE View Distance Limit Limit zas. widzenia Limite de distancia de visión Limit dohlednosti + Limite da distância de visão Sets the limit for how high clients can raise their view distance (up to 10000) Ustawia maksymalny limit zasięgu widzenia jaki mogą ustawić gracze (do 10000) Establece el límite de cuan alta pueden aumentar los clientes la distancia de visión (hasta 10.000) Stanoví limit jak daleko si může client zvýšit dohlednost (do 10000) + Estabelecer um limite de quão alto os clientes podem aumentar sua distância de visão (até 10000) Limit for client's view distance set here and can overridden by module Limit zasięgu widzenia jest ustawiany tutaj i może zostać nadpisany poprzez moduł Establecer aqui el límite para la distancia de visión de los clientes. Puede ser anulado por módulo Limit dohlednoti pro klienty se nastavuje zde a může být potlačeno pomocí modulu. + Permite limitar a distância de visão máxima que pode ser definida por jogadores. Pode ser substituído por módulo. Client View Distance (On Foot) Zasięg widzenia (piechota) Distancia de visión del cliente (A pie) Dohlednost (Pěšák) + Distância de visão do cliente (A pé) Changes in game view distance when the player is on foot. Zmienia zasięg widzenia kiedy gracz porusza się na piechotę. Cambia en juego la distancia de visión cuando el jugador va a pie. Změna dohlednosti pro hráče pokud jde po svých. + Muda a distância de visão do jogador dentro do jogo quando ele está a pé. Client View Distance (Land Vehicle) Zasięg widzenia (pojazdy naziemne) Distancia de visión del cliente (Vehículo terrestre) Dohlednost (Pozemní technika) + Distância de visão do cliente (Veículo terrestre) Changes in game view distance when the player is in a land vehicle. Zmienia zasięg widzenia kiedy gracz porusza się pojazdami naziemnymi. Cambia en juego la distancia de visión cuando el jugador va en un vehículo terrestre. Změna dohlednosti pro hráče pokud je v pozemní technice. + Muda a distância de visão do jogador dentro do jogo quando ele está dentro de um veículo terrestre. Client View Distance (Air Vehicle) Zasięg widzenia (pojazdy lotnicze) Distancia de visión del cliente (Vehículo aéreo) Dohlednost (Vzdušná technika) + Distância de visão do cliente (Veículo aéreo) Changes in game view distance when the player is in an air vehicle. Zmienia zasięg widzenia kiedy gracz porusza się pojazdami lotniczymi. Cambia en juego la distancia de visión cuando el jugador va en un vehículo aéreo. Změna dohlednosti pro hráče pokud je ve vzdušné technice. + Muda a distância de visão do jogador dentro do jogo quando ele está dentro de um veículo aéreo. Dynamic Object View Distance Dynamiczny zasięg rysowania obiektów Distancia de visión dinámica de objetos Dynamická dohlednost objektů + Distância de visão dinâmica dos objetos Sets the object view distance as a coefficient of the view distance. Zmienia zasięg rysowania obiektów jako mnożnik zasięgu widzenia. Establece la distancia de visión de objetos como un coeficiente de la distancia de visión. Nastaví objekt dohlednosti jako koeficient dohlednosti. + Estabelece a distância de visão dos objetos com um coeficiente da distância de visão. Off Wyłącz Apagada Vypnout + Desligado Very Low Bardzo niski Muy baja Velmi málo + Muito baixo Low Niski Baja Málo + Baixo Medium Średni Media Středně + Médio High Wysoki Alta Hodně + Alto Very High Bardzo wysoki Muy alta Velmi hodně + Muito alto View Distance: Zasięg widzenia: Distancia de visión: Dohlednost: + Distância de visão: Object View Distance is Zasięg widzenia obiektów wynosi La distancia de visión de objetos es: Dohlednost objektů je + Distância de visão do objeto é That option is invalid! The limit is Ta opcja jest nieprawidłowa! Limit wynosi Esta opción no es valida! El limite es Tato volba je neplatná! Limit je + Essa opção é inválida. O limte é Video Settings Ustawienia wideo Ajustes de vídeo Nastavení videa + Ajustes de vídeo \ No newline at end of file diff --git a/addons/weather/stringtable.xml b/addons/weather/stringtable.xml index 54069425a4..69e2d4a792 100644 --- a/addons/weather/stringtable.xml +++ b/addons/weather/stringtable.xml @@ -19,6 +19,7 @@ Clima Wetter Počasí + Clima Multiplayer synchronized ACE weather module @@ -26,6 +27,7 @@ Modulo climático del ACE sincronizado en multijugador ACE-Wettermodul (synchron im Multiplayer) Synchronizovat ACE počasí v multiplayeru + Módulo climático ACE para sincronismo multiplayer Weather propagation @@ -33,6 +35,7 @@ Propagación del clima Wetterübertragung Změny počasí + Propagação do clima Enables server side weather propagation @@ -40,6 +43,7 @@ Permite al servidor controlar la propagación del clima Aktiviere serverseitige Wetterübertragung Aktivuje změny počasí na straně serveru + Ativa propagação de clima via server ACE Weather @@ -47,6 +51,7 @@ Clima ACE ACE-Wetter ACE počasí + Clima ACE Overrides the default weather (editor, mission settings) with ACE weather (map based) @@ -54,6 +59,7 @@ Sobreescribe el sistema climático por defecto (editor, ajustes de mision) con clima del ACE (basado en el mapa) Überschreibt das Standardwetter (Editor, Missionseinstellungen) mit dem ACE-Wetter (kartenbasiert) Přepíše výchozí počasí (editor, nastavení mise) s ACE počasím (podle mapy) + Sobreescreve o clima padrão (editor, ajustes de missão) pelo sistema de clima ACE (baseado por mapa) Sync Rain @@ -61,6 +67,7 @@ Sincronizar lluvia Regen synchronisieren Synchronizuj déšť + Sincronizar chuva Synchronizes rain @@ -68,6 +75,7 @@ Sincroniza la lluvia Synchronisiert den Regen Synchronizace deště + Sincroniza a chuva Sync Wind @@ -75,6 +83,7 @@ Sincronizar viento Wind synchronisieren Synchronizuj vítr + Sincronizar vento Synchronizes wind @@ -82,6 +91,7 @@ Sincroniza el viento Synchronisiert den Wind Synchronizace větru + Sincroniza o vento Sync Misc @@ -89,6 +99,7 @@ Sincronizar otros Sonstiges synchronisieren Synchronizuj různé + Sincronizar outros Synchronizes lightnings, rainbow, fog, ... @@ -96,6 +107,7 @@ Sincroniza relampagos, arcoiris, niebla ... Synchronisiert Blitze, Regenbögen, Nebel, ... Synchronizace blesků, duhy, mlhy, ... + Sincroniza relâmpagos, arco-íris, neblina... Update Interval @@ -103,6 +115,7 @@ Intervalo de actualización Aktualisierungsintervall Interval aktualizace + Intervalo de atualização Defines the interval (seconds) between weather updates @@ -110,6 +123,7 @@ Defina el intervalo (en segundos) entre actualizacions de clima Definiert das Intervall (in Sekunden) zwischen Wetteraktualisierungen Určit interval (v sekundách) mezi aktualizacemi počasí + Defina o intervalo (em segundos) entre as atualizações de clima \ No newline at end of file diff --git a/addons/winddeflection/stringtable.xml b/addons/winddeflection/stringtable.xml index a361681e59..036456e35e 100644 --- a/addons/winddeflection/stringtable.xml +++ b/addons/winddeflection/stringtable.xml @@ -66,6 +66,7 @@ Wpływ wiatru Desviación por viento Účinky větru + Desvio de vento Wind Deflection @@ -73,6 +74,7 @@ Desviación por viento Windablenkung Účinky větru + Desvio de vento Enables wind deflection @@ -80,6 +82,7 @@ Activa la desviación por viento Aktiviert Windablenkung Umožňit vliv větru + Ativa o desvio de vento Vehicle Enabled @@ -87,6 +90,7 @@ Habilitada en vehículos Fahrzeuge aktiviert Vozidla povolena + Ativado em veículos Enables wind deflection for static/vehicle gunners @@ -94,6 +98,7 @@ Habilita la desviación por viento para artilleros estaticos/de vehículos Aktiviere Windablenkung für statische oder Fahrzeugschützen Umožnit vliv větru pro střelce z vozidla/statiky + Ativa o desvio de vento para atiradores de estáticas e veículos Simulation Interval @@ -101,6 +106,7 @@ Intervalo de simulación Simulationsintervall Interval simulace + Intervalo de simulação Defines the interval between every calculation step @@ -108,6 +114,7 @@ Define el intervalo entre cada calculo Definiert das Intervall zwischen jedem Berechnungsschritt Určuje interval mezi každým výpočtem + Define o intervalo entre cada cálculo Simulation Radius @@ -115,6 +122,7 @@ Radio de simulación Simulationsradius Oblast simulace + Radio da Simulação Defines the radius around the player (in meters) at which projectiles are wind deflected @@ -122,6 +130,7 @@ Define el radio alrededor del jugador (en metros) en el cual los proyectiles son desviados por el viento Gibt den Radius (in Metern) um den Spieler an, in dem Projektile vom Wind beeinflusst werden Definuje oblast kolem hráče (v metrech) v které je projektil ovlivněn větrem + Define o raio ao redor do jogador (em metros) em qual os projéteis são desviados pelo vento Wind influence on projectiles trajectory @@ -129,6 +138,7 @@ Influencia del viento en la trayectoria de proyectiles Windeinfluss auf die Geschossbahnen Vítr ovlivňuje trajektorii projektilu + Influência do vento na trajetória dos projéteis \ No newline at end of file diff --git a/addons/yardage450/stringtable.xml b/addons/yardage450/stringtable.xml index c7cb16b83b..971b3a4889 100644 --- a/addons/yardage450/stringtable.xml +++ b/addons/yardage450/stringtable.xml @@ -6,6 +6,7 @@ Yardage 450 Yardage 450 Yardage 450 + Yardage 450 Laser Rangefinder @@ -13,6 +14,7 @@ Dalmierz laserowy Telémetro láser Laserový dálkoměr + Medidor de Distância a laser Yardage 450 - Power Button @@ -20,6 +22,7 @@ Yardage 450 - Przycisk zasilania Yardage 450 - Botón de encendido Yardage 450 - Tlačítko napájení + Yardage 450 - Botão de energia \ No newline at end of file diff --git a/addons/zeus/stringtable.xml b/addons/zeus/stringtable.xml index 8ddde63cc8..80d08a3275 100644 --- a/addons/zeus/stringtable.xml +++ b/addons/zeus/stringtable.xml @@ -6,102 +6,119 @@ Ustawienia Zeusa Ajustes Zeus Nastavení Zeuse + Ajustes do Zeus Provides control over various aspects of Zeus. Pozwala kontrolować różne aspekty Zeusa. Proporciona control sobre diversos aspectos de Zeus. Poskytuje kontrolu na různými aspekty Zeuse. + Proporciona controle sobre diversos aspectos do Zeus. Ascension Messages Wiad. o nowym Zeusie Mensajes de ascensión Zpráva o novém Zeusovi + Mensagens de ascensão Display global popup messages when a player is assigned as Zeus. Wyświetlaj globalną wiadomość kiedy gracz zostanie przydzielony jako Zeus Mostrar mensajes emergentes globales cuando a un jugador se le asigna como Zeus. Zobrazit globální zprávu když je hráč přiřazen jako Zeus. + Mostra uma mensagem popup quando um jogador é atribuido ao Zeus. Zeus Eagle Orzeł Zeusa Águila Zeus Orel Zeuse + Águia do Zeus Spawn an eagle that follows the Zeus camera. Spawnuj orła, który podąrza za kamerą Zeusa. Generar un águila que sigue la cámara Zeus. Vytvoří orla, který následuje kameru Zeuse. + Cria uma águia que segue a câmera do Zeus Wind Sounds Dźwięki wiatru Sonidos de viento Zvuky větru + Sons de vento Play wind sounds when Zeus remote controls a unit. Odtwarzaj dźwięki wiatru kiedy Zeus zdalnie kontroluje jednostkę. Reproduce sonidos de viento cuando Zeus controle remotamente una unidad. Přehrát varování (vítr) když Zeus převezmě kontrolu nad jednotkou. + Reproduz sons de vento quando uma unidade é remotamente controlada pelo Zeus. Ordnance Warning Ostrz. o ostrzale arty. Advertencia de artefactos explosivos Varování před dělostřelectvem + Aviso de explosivos Play a radio warning when Zeus uses ordnance. Odtwarzaj wiadomość radiową kiedy Zeus używa artylerii. Reproduce un aviso de radio cuando Zeus utiliza artefactos explosivos. Přehrát varování (rádio) když Zeus použije dělostřelectvo. + Reproduz uma aviso via rádio quando o Zeus usa um explosivo. Reveal Mines Pokazuj miny Revelar minas Odhalit miny + Revelar minas Reveal mines to allies and place map markers. Pokazuj znaczniki min dla sojuszników i twórz markery na mapie w miejscu min. Revelar minas a aliados y establecer marcadores de mapa. Odhalí miny pro spojence a umístnit jejich značku na mapu. + Revelar minas para aliados e colocar marcadores no mapa. Reveal to Allies Pokaż dla sojuszników Revelar a aliados Odhalit pro spojence + Revelar para aliados Allies + Map Markers Sojusznicy + markery na mapie Aliados + Marcas de mapa Spojenci + Značky na mapě + Aliados + Marcadores no mapa Toggle Captive Przełącz więźnia Alternar cautivo Přepnout - Vězeň + Alternar prisioneiro Toggle Surrender Przełącz kapitulację Alternar rendición Přepnout - Vzdávání + Alternar rendição Toggle Unconscious Przełącz nieprzytomność Alternar inconsciencia Přepnout - Bezvědomí + Alternar inconsciência Unit must be alive @@ -132,13 +149,14 @@ Jednostka nie może być więźniem La unidad no debe estar cautiva Jednotka nemí být vězeň + Unidade não pode ser prisioneira Place on a unit Rien sous le curseur Es wurde nichts ausgewählt Nada bajo el ratón - Nada debaixo do mouse + Coloque em uma unidade Umístni na jednotku Nie ma nic pod kursorem Ничего не выделено @@ -150,6 +168,7 @@ Wymaga addonu, który nie jest obecny Requiere un addon que no está presente Vyžaduje addon, který není přítomen + Requer um addon que não está presente \ No newline at end of file From c45425a55938b033d8a15406a249ede328468a9f Mon Sep 17 00:00:00 2001 From: nic547 <32dominic.ri@gmail.com> Date: Sat, 27 Jun 2015 23:52:57 +0200 Subject: [PATCH 42/86] added frag compat for bwa3 dm51 --- optionals/compat_bwa3/CfgAmmo.hpp | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/optionals/compat_bwa3/CfgAmmo.hpp b/optionals/compat_bwa3/CfgAmmo.hpp index 599651ac10..c19e00819a 100644 --- a/optionals/compat_bwa3/CfgAmmo.hpp +++ b/optionals/compat_bwa3/CfgAmmo.hpp @@ -3,6 +3,7 @@ class CfgAmmo { class B_556x45_Ball_Tracer_Red; class B_762x51_Tracer_Red; class B_127x99_Ball_Tracer_Red; + class GrenadeHand; class BWA3_B_556x45_Ball: B_556x45_Ball_Tracer_Red { ACE_caliber=5.69; ACE_bulletLength=23.012; @@ -132,4 +133,10 @@ class CfgAmmo { ACE_muzzleVelocities[]={}; ACE_barrelLengths[]={}; }; + class BWA3_G_DM51A1: GrenadeHand { + ace_frag_metal = 296; + ace_frag_charge = 180; + ace_frag_gurney_c = 2930; // Gurney velocity constant for PETN + ace_frag_gurney_k = 1/2; // shape factor for a cylinder + }; }; \ No newline at end of file From 0e7c6a8e19a08296f5ba1c010457f673a1ed5590 Mon Sep 17 00:00:00 2001 From: Simon AM Date: Sun, 28 Jun 2015 10:18:53 +0200 Subject: [PATCH 43/86] Set Viewdistance to start on settingsInitialized --- addons/viewdistance/XEH_postInit.sqf | 51 +++++++++++++++------------- 1 file changed, 28 insertions(+), 23 deletions(-) diff --git a/addons/viewdistance/XEH_postInit.sqf b/addons/viewdistance/XEH_postInit.sqf index c49a197c26..da4227516c 100644 --- a/addons/viewdistance/XEH_postInit.sqf +++ b/addons/viewdistance/XEH_postInit.sqf @@ -2,28 +2,33 @@ if (!hasInterface) exitWith {}; -// Force the view distance down to the limit. -if (GVAR(enabled) && {viewDistance > GVAR(limitViewDistance)}) then { - setViewDistance GVAR(limitViewDistance); -}; - -// Adapt view distance when the player is created or changed according to whether client is on foot or vehicle. -["playerChanged",{ - [false] call FUNC(adaptViewDistance); -}] call ace_common_fnc_addEventHandler; - -// Set the EH which waits for any of the view distance settings to be changed, so that the effect is show immediately -["SettingChanged",{ - if ((_this select 0 == QGVAR(viewDistanceOnFoot)) || - (_this select 0 == QGVAR(viewDistanceLandVehicle)) || - (_this select 0 == QGVAR(viewDistanceAirVehicle)) || - (_this select 0 == QGVAR(objectViewDistanceCoeff))) then { - - [true] call FUNC(adaptViewDistance); +["SettingsInitialized", { + // if not enabled, then bugger off. + if !(GVAR(enabled) exitWith {}; + + // Force the view distance down to the limit. + if (viewDistance > GVAR(limitViewDistance)) then { + setViewDistance GVAR(limitViewDistance); }; -}] call ace_common_fnc_addEventHandler; + + // Adapt view distance when the player is created or changed according to whether client is on foot or vehicle. + ["playerChanged",{ + [false] call FUNC(adaptViewDistance); + }] call EFUNC(common,addEventHandler); + + // Set the EH which waits for any of the view distance settings to be changed, so that the effect is show immediately + ["SettingChanged",{ + if ((_this select 0 == QGVAR(viewDistanceOnFoot)) || + (_this select 0 == QGVAR(viewDistanceLandVehicle)) || + (_this select 0 == QGVAR(viewDistanceAirVehicle)) || + (_this select 0 == QGVAR(objectViewDistanceCoeff))) then { -// Set the EH which waits for a vehicle change to automatically swap to On Foot/In Land Vehicle/In Air Vehicle -["playerVehicleChanged",{ - [false] call FUNC(adaptViewDistance) -}] call ace_common_fnc_addEventHandler; \ No newline at end of file + [true] call FUNC(adaptViewDistance); + }; + }] call EFUNC(common,addEventHandler); + + // Set the EH which waits for a vehicle change to automatically swap between On Foot/In Land Vehicle/In Air Vehicle + ["playerVehicleChanged",{ + [false] call FUNC(adaptViewDistance) + }] call EFUNC(common,addEventHandler); +}] call EFUNC(common,addEventHandler);] \ No newline at end of file From 8bdf243ab93b0a96f2e38ff8e536ae6c95dde37b Mon Sep 17 00:00:00 2001 From: Simon AM Date: Sun, 28 Jun 2015 10:19:21 +0200 Subject: [PATCH 44/86] Removed extra ] --- addons/viewdistance/XEH_postInit.sqf | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/addons/viewdistance/XEH_postInit.sqf b/addons/viewdistance/XEH_postInit.sqf index da4227516c..66619a7589 100644 --- a/addons/viewdistance/XEH_postInit.sqf +++ b/addons/viewdistance/XEH_postInit.sqf @@ -31,4 +31,4 @@ if (!hasInterface) exitWith {}; ["playerVehicleChanged",{ [false] call FUNC(adaptViewDistance) }] call EFUNC(common,addEventHandler); -}] call EFUNC(common,addEventHandler);] \ No newline at end of file +}] call EFUNC(common,addEventHandler); \ No newline at end of file From 9e6ce52fb6c0017c048c97fbf70fa90fbbe59145 Mon Sep 17 00:00:00 2001 From: jonpas Date: Sun, 28 Jun 2015 21:25:01 +0200 Subject: [PATCH 45/86] Added check to addEarplugs if earplugs are used --- addons/hearing/functions/fnc_addEarPlugs.sqf | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/addons/hearing/functions/fnc_addEarPlugs.sqf b/addons/hearing/functions/fnc_addEarPlugs.sqf index 455de07fd9..8e4c5eafef 100644 --- a/addons/hearing/functions/fnc_addEarPlugs.sqf +++ b/addons/hearing/functions/fnc_addEarPlugs.sqf @@ -15,9 +15,12 @@ */ #include "script_component.hpp" -private ["_unit", "_launcher"]; +PARAMS_1(_unit); -_unit = _this select 0; +// Exit if soldier has earplugs already in (persistence scenarios) +if (FUNC(hasEarPlugsIn)) exitWith {}; + +private ["_launcher"]; // add earplugs if the soldier has a rocket launcher _launcher = secondaryWeapon _unit; From d36efb5a4a96216ce65caa6356581e99bd8942e2 Mon Sep 17 00:00:00 2001 From: nic547 <32dominic.ri@gmail.com> Date: Sun, 28 Jun 2015 22:15:54 +0200 Subject: [PATCH 46/86] compat_bwa3: added ACE_isBelt --- optionals/compat_bwa3/CfgMagazines.hpp | 9 +++++++++ optionals/compat_bwa3/config.cpp | 1 + 2 files changed, 10 insertions(+) create mode 100644 optionals/compat_bwa3/CfgMagazines.hpp diff --git a/optionals/compat_bwa3/CfgMagazines.hpp b/optionals/compat_bwa3/CfgMagazines.hpp new file mode 100644 index 0000000000..bf43af6426 --- /dev/null +++ b/optionals/compat_bwa3/CfgMagazines.hpp @@ -0,0 +1,9 @@ +class CfgMagazines { + class CA_Magazine; + class BWA3_200Rnd_556x45: CA_Magazine { + ACE_isBelt = 1; + }; + class BWA3_120Rnd_762x51: CA_Magazine { + ACE_isBelt = 1; + }; +}; \ No newline at end of file diff --git a/optionals/compat_bwa3/config.cpp b/optionals/compat_bwa3/config.cpp index e1ca37d121..efdebaf616 100644 --- a/optionals/compat_bwa3/config.cpp +++ b/optionals/compat_bwa3/config.cpp @@ -13,3 +13,4 @@ class CfgPatches { #include "CfgAmmo.hpp" #include "CfgWeapons.hpp" +#include "CfgMagazines.hpp" From 475e4673ebf40856106cf7f52724786668219601 Mon Sep 17 00:00:00 2001 From: jonpas Date: Sun, 28 Jun 2015 22:28:26 +0200 Subject: [PATCH 47/86] Fixed typo --- addons/hearing/functions/fnc_addEarPlugs.sqf | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/addons/hearing/functions/fnc_addEarPlugs.sqf b/addons/hearing/functions/fnc_addEarPlugs.sqf index 8e4c5eafef..07d35c3c6d 100644 --- a/addons/hearing/functions/fnc_addEarPlugs.sqf +++ b/addons/hearing/functions/fnc_addEarPlugs.sqf @@ -18,7 +18,7 @@ PARAMS_1(_unit); // Exit if soldier has earplugs already in (persistence scenarios) -if (FUNC(hasEarPlugsIn)) exitWith {}; +if ([_unit] call FUNC(hasEarPlugsIn)) exitWith {}; private ["_launcher"]; From 3dab207b6557f663267770ec544a6a5b093b1936 Mon Sep 17 00:00:00 2001 From: voiper Date: Sun, 28 Jun 2015 19:34:21 -0700 Subject: [PATCH 48/86] Add Spectator. --- addons/spectator/$PBOPREFIX$ | 1 + addons/spectator/ACE_Settings.hpp | 26 + addons/spectator/CfgEventHandlers.hpp | 11 + addons/spectator/CfgVehicles.hpp | 53 + addons/spectator/README.md | 10 + addons/spectator/UI.hpp | 640 ++++++++++ .../spectator/UI/Icon_Module_Spectator_ca.paa | Bin 0 -> 5625 bytes addons/spectator/XEH_postInit.sqf | 96 ++ addons/spectator/XEH_preInit.sqf | 31 + addons/spectator/config.cpp | 19 + addons/spectator/functions/fnc_camera.sqf | 1081 +++++++++++++++++ .../spectator/functions/fnc_cameraIntro.sqf | 28 + .../functions/fnc_canSpectateUnit.sqf | 30 + addons/spectator/functions/fnc_checkUnits.sqf | 37 + addons/spectator/functions/fnc_compass.sqf | 59 + addons/spectator/functions/fnc_crosshair.sqf | 29 + addons/spectator/functions/fnc_draw3D.sqf | 34 + .../spectator/functions/fnc_drawMines2D.sqf | 43 + .../spectator/functions/fnc_drawMines3D.sqf | 55 + .../spectator/functions/fnc_drawTracks2D.sqf | 56 + .../spectator/functions/fnc_drawUnits2D.sqf | 81 ++ .../spectator/functions/fnc_drawUnits3D.sqf | 97 ++ addons/spectator/functions/fnc_killed.sqf | 65 + addons/spectator/functions/fnc_map.sqf | 156 +++ .../functions/fnc_moduleSpectator.sqf | 28 + addons/spectator/functions/fnc_overlay.sqf | 106 ++ addons/spectator/functions/fnc_penPos.sqf | 33 + addons/spectator/functions/fnc_respawn.sqf | 25 + addons/spectator/functions/fnc_sideColour.sqf | 66 + addons/spectator/functions/fnc_status.sqf | 60 + addons/spectator/functions/fnc_trackUnits.sqf | 54 + addons/spectator/functions/fnc_unitInfo.sqf | 34 + addons/spectator/functions/fnc_unitSide.sqf | 39 + addons/spectator/functions/fnc_unitVar.sqf | 38 + .../spectator/functions/fnc_viewDistance.sqf | 47 + .../spectator/functions/script_component.hpp | 1 + addons/spectator/rsc_defines.hpp | 646 ++++++++++ addons/spectator/script_component.hpp | 12 + addons/spectator/stringtable.xml | 110 ++ 39 files changed, 4037 insertions(+) create mode 100644 addons/spectator/$PBOPREFIX$ create mode 100644 addons/spectator/ACE_Settings.hpp create mode 100644 addons/spectator/CfgEventHandlers.hpp create mode 100644 addons/spectator/CfgVehicles.hpp create mode 100644 addons/spectator/README.md create mode 100644 addons/spectator/UI.hpp create mode 100644 addons/spectator/UI/Icon_Module_Spectator_ca.paa create mode 100644 addons/spectator/XEH_postInit.sqf create mode 100644 addons/spectator/XEH_preInit.sqf create mode 100644 addons/spectator/config.cpp create mode 100644 addons/spectator/functions/fnc_camera.sqf create mode 100644 addons/spectator/functions/fnc_cameraIntro.sqf create mode 100644 addons/spectator/functions/fnc_canSpectateUnit.sqf create mode 100644 addons/spectator/functions/fnc_checkUnits.sqf create mode 100644 addons/spectator/functions/fnc_compass.sqf create mode 100644 addons/spectator/functions/fnc_crosshair.sqf create mode 100644 addons/spectator/functions/fnc_draw3D.sqf create mode 100644 addons/spectator/functions/fnc_drawMines2D.sqf create mode 100644 addons/spectator/functions/fnc_drawMines3D.sqf create mode 100644 addons/spectator/functions/fnc_drawTracks2D.sqf create mode 100644 addons/spectator/functions/fnc_drawUnits2D.sqf create mode 100644 addons/spectator/functions/fnc_drawUnits3D.sqf create mode 100644 addons/spectator/functions/fnc_killed.sqf create mode 100644 addons/spectator/functions/fnc_map.sqf create mode 100644 addons/spectator/functions/fnc_moduleSpectator.sqf create mode 100644 addons/spectator/functions/fnc_overlay.sqf create mode 100644 addons/spectator/functions/fnc_penPos.sqf create mode 100644 addons/spectator/functions/fnc_respawn.sqf create mode 100644 addons/spectator/functions/fnc_sideColour.sqf create mode 100644 addons/spectator/functions/fnc_status.sqf create mode 100644 addons/spectator/functions/fnc_trackUnits.sqf create mode 100644 addons/spectator/functions/fnc_unitInfo.sqf create mode 100644 addons/spectator/functions/fnc_unitSide.sqf create mode 100644 addons/spectator/functions/fnc_unitVar.sqf create mode 100644 addons/spectator/functions/fnc_viewDistance.sqf create mode 100644 addons/spectator/functions/script_component.hpp create mode 100644 addons/spectator/rsc_defines.hpp create mode 100644 addons/spectator/script_component.hpp create mode 100644 addons/spectator/stringtable.xml diff --git a/addons/spectator/$PBOPREFIX$ b/addons/spectator/$PBOPREFIX$ new file mode 100644 index 0000000000..42fe4034e9 --- /dev/null +++ b/addons/spectator/$PBOPREFIX$ @@ -0,0 +1 @@ +z\ace\addons\spectator \ No newline at end of file diff --git a/addons/spectator/ACE_Settings.hpp b/addons/spectator/ACE_Settings.hpp new file mode 100644 index 0000000000..88f4ebfad6 --- /dev/null +++ b/addons/spectator/ACE_Settings.hpp @@ -0,0 +1,26 @@ +class ACE_Settings { + class GVAR(enabled) { + value = 0; + typeName = "BOOL"; + }; + class GVAR(limitSide) { + value = 0; + typeName = "BOOL"; + }; + class GVAR(AI) { + value = 0; + typeName = "BOOL"; + }; + class GVAR(tracking) { + value = 0; + typeName = "BOOL"; + }; + class GVAR(modulePos) { + value = 0; + typeName = "BOOL"; + }; + class GVAR(endMission) { + value = 0; + typeName = "BOOL"; + }; +}; \ No newline at end of file diff --git a/addons/spectator/CfgEventHandlers.hpp b/addons/spectator/CfgEventHandlers.hpp new file mode 100644 index 0000000000..e75956f440 --- /dev/null +++ b/addons/spectator/CfgEventHandlers.hpp @@ -0,0 +1,11 @@ +class Extended_PreInit_EventHandlers { + class ADDON { + init = QUOTE(call COMPILE_FILE(XEH_preInit)); + }; +}; + +class Extended_PostInit_EventHandlers { + class ADDON { + init = QUOTE(call COMPILE_FILE(XEH_postInit)); + }; +}; diff --git a/addons/spectator/CfgVehicles.hpp b/addons/spectator/CfgVehicles.hpp new file mode 100644 index 0000000000..8faee1dca7 --- /dev/null +++ b/addons/spectator/CfgVehicles.hpp @@ -0,0 +1,53 @@ +class CfgVehicles { + class ACE_Module; + class ACE_ModuleSpectator: ACE_Module { + author = ECSTRING(common,ACETeam); + category = "ACE"; + displayName = CSTRING(Module_DisplayName); + function = QFUNC(moduleSpectator); + scope = 2; + isGlobal = 1; + icon = PATHTOF(UI\Icon_Module_Spectator_ca.paa); + class Arguments { + class SpectatorEnabled { + displayName = CSTRING(Enabled_DisplayName); + description = CSTRING(Enabled_Description); + typeName = "BOOL"; + defaultValue = 0; + }; + class SpectatorPlayerSide { + displayName = CSTRING(PlayerSide_DisplayName); + description = CSTRING(PlayerSide_Description); + typeName = "BOOL"; + defaultValue = 0; + }; + class SpectatorAI { + displayName = CSTRING(AI_DisplayName); + description = CSTRING(AI_Description); + typeName = "BOOL"; + defaultValue = 0; + }; + class SpectatorTracking { + displayName = CSTRING(Tracking_DisplayName); + description = CSTRING(Tracking_Description); + typeName = "BOOL"; + defaultValue = 0; + }; + class SpectatorPos { + displayName = CSTRING(Pos_DisplayName); + description = CSTRING(Pos_Description); + typeName = "BOOL"; + defaultValue = 0; + }; + class SpectatorEnd { + displayName = CSTRING(End_DisplayName); + description = CSTRING(End_Description); + typeName = "BOOL"; + defaultValue = 0; + }; + }; + class ModuleDescription { + description = CSTRING(Module_Description); + }; + }; +}; \ No newline at end of file diff --git a/addons/spectator/README.md b/addons/spectator/README.md new file mode 100644 index 0000000000..180f21c57c --- /dev/null +++ b/addons/spectator/README.md @@ -0,0 +1,10 @@ +ace_spectator +======= + +Spectator. Includes features from Splendid Cam, and much more. + +## Maintainers + +The people responsible for merging changes to this component or answering potential questions. + +- [voiper](https://github.com/voiperr) \ No newline at end of file diff --git a/addons/spectator/UI.hpp b/addons/spectator/UI.hpp new file mode 100644 index 0000000000..eec38066f9 --- /dev/null +++ b/addons/spectator/UI.hpp @@ -0,0 +1,640 @@ +#define PIXEL_X (safeZoneWAbs / (getResolution select 0)) +#define PIXEL_Y (safeZoneH / (getResolution select 1)) +#define XHAIR RESUNITS_X * 4 +#define COMPASS_W RESUNITS_X * 20 +#define COMPASS_H COMPASS_W / 15 +#define COMPASS_X RESCENTRE_X - COMPASS_W / 2 +#define HELP_W RESUNITS_X * 75 +#define HELP_H RESUNITS_Y * 75 + +class ace_spectator_overlay { + + idd = 12200; + enableSimulation = 1; + movingEnable = 1; + enableDisplay = 1; + onLoad = "uiNamespace setVariable ['ace_spectator_overlay', _this select 0]; ['Init', _this] call ace_spectator_fnc_overlay"; + + class controls { + + class Unitlist { + + access = 0; + idc = 0; + type = CT_TREE; + style = ST_LEFT; + default = 0; + blinkingPeriod = 0; + + x = QUOTE(safeZoneX); + y = QUOTE(safeZoneY + RESUNITS_X * 4/3); + w = QUOTE(RESUNITS_X * 30); + h = QUOTE(RESUNITS_Y * 50); + + colorBorder[] = {1,1,1,1}; + + colorBackground[] = {0.1,0.1,0.1,1}; + colorSelect[] = {1,0.5,0,1}; + colorMarked[] = {1,0.5,0,0.5}; + colorMarkedSelected[] = {1,0.5,0,1}; + + sizeEx = QUOTE(RESUNITS_Y * 2); + font = GUI_FONT_NORMAL; + shadow = 1; + colorText[] = {1,1,1,1}; + colorSelectText[] = {1,1,1,1}; + colorMarkedText[] = {1,1,1,1}; + + tooltip = ""; + tooltipColorShade[] = {0,0,0,1}; + tooltipColorText[] = {1,1,1,1}; + tooltipColorBox[] = {1,1,1,1}; + + multiselectEnabled = 0; + expandOnDoubleclick = 0; + hiddenTexture = "A3\ui_f\data\gui\rsccommon\rsctree\hiddenTexture_ca.paa"; + expandedTexture = "A3\ui_f\data\gui\rsccommon\rsctree\expandedTexture_ca.paa"; + maxHistoryDelay = 1; + + class ScrollBar { + width = 0; + height = 0; + scrollSpeed = 0.01; + + arrowEmpty = "\A3\ui_f\data\gui\cfg\scrollbar\arrowEmpty_ca.paa"; + arrowFull = "\A3\ui_f\data\gui\cfg\scrollbar\arrowFull_ca.paa"; + border = "\A3\ui_f\data\gui\cfg\scrollbar\border_ca.paa"; + thumb = "\A3\ui_f\data\gui\cfg\scrollbar\thumb_ca.paa"; + + color[] = {1,1,1,1}; + }; + + colorDisabled[] = {0,0,0,0}; + colorArrow[] = {0,0,0,0}; + + onDestroy = QUOTE(GVAR(mouseBusy) = false; false); + onMouseEnter = QUOTE(GVAR(mouseBusy) = true; false); + onMouseExit = QUOTE(GVAR(mouseBusy) = false; false); + + onTreeDblClick = "['Select', _this] call ace_spectator_fnc_overlay; false"; + }; + }; +}; + +class ace_spectator_vd { + idd = 12201; + enableSimulation = 1; + enableDisplay = 0; + movingEnable = 0; + + onLoad = "uiNamespace setVariable ['ace_spectator_vd', _this select 0]; ['Init', _this] call ace_spectator_fnc_viewDistance"; + + class Controls { + + class BG: vip_rsc_box { + x = QUOTE(safeZoneX + safeZoneW - RESUNITS_X * 30); + y = QUOTE(safeZoneY + COMPASS_H); + w = QUOTE(RESUNITS_X * 30); + h = QUOTE(COMPASS_H); + colorBackground[] = {0.1,0.1,0.1,1}; + onDestroy = QUOTE(GVAR(mouseBusy) = false; false); + }; + + class TitleFrame: vip_rsc_frame { + x = QUOTE(safeZoneX + safeZoneW - RESUNITS_X * 30); + y = QUOTE(safeZoneY + COMPASS_H); + w = QUOTE(RESUNITS_X * 8); + h = QUOTE(COMPASS_H); + shadow = 2; + colorText[]={1,1,1,1}; + }; + + class Title: vip_rsc_text { + style = ST_CENTER; + x = QUOTE(safeZoneX + safeZoneW - RESUNITS_X * 30); + y = QUOTE(safeZoneY + COMPASS_H); + w = QUOTE(RESUNITS_X * 8); + h = QUOTE(COMPASS_H); + sizeEx = QUOTE(RESUNITS_Y * 2); + font = GUI_FONT_NORMAL; + shadow = 2; + colorText[]={1,1,1,1}; + text = CSTRING(VD_Title); + }; + + class DistanceFrame: TitleFrame { + x = QUOTE(safeZoneX + safeZoneW - RESUNITS_X * 10.5); + w = QUOTE(RESUNITS_X * 5); + }; + + class Distance: Title { + idc = 1; + x = QUOTE(safeZoneX + safeZoneW - RESUNITS_X * 10.5); + w = QUOTE(RESUNITS_X * 5); + text = ""; + }; + + class ButtonExit: vip_rsc_button { + idc = 0; + style = ST_CENTER; + x = QUOTE(safeZoneX + safeZoneW - RESUNITS_X * 5); + y = QUOTE(safeZoneY + COMPASS_H); + w = QUOTE(RESUNITS_X * 5); + h = QUOTE(COMPASS_H); + + colorBackground[] = {1,1,1,1}; + sizeEx = QUOTE(RESUNITS_Y * 2); + font = GUI_FONT_NORMAL; + + text = CSTRING(VD_Button); + + onButtonClick = "closeDialog 0; false"; + onMouseButtonDown = QUOTE(GVAR(mouseBusy) = true; false); + onMouseButtonUp = QUOTE(GVAR(mouseBusy) = false; false); + }; + + class Slider { + idc = 2; + + type = CT_XSLIDER; + style = SL_HORZ; + shadow = 2; + + x = QUOTE(safeZoneX + safeZoneW - RESUNITS_X * 21.5); + y = QUOTE(safeZoneY + COMPASS_H); + w = QUOTE(RESUNITS_X * 9.5); + h = QUOTE(COMPASS_H); + color[] = {1,1,1,1}; + colorActive[] = {1,1,1,1}; + colorDisabled[] = {1,1,1,0.2}; + arrowEmpty = "\A3\ui_f\data\gui\cfg\slider\arrowEmpty_ca.paa"; + arrowFull = "\A3\ui_f\data\gui\cfg\slider\arrowFull_ca.paa"; + border = "\A3\ui_f\data\gui\cfg\slider\border_ca.paa"; + thumb = "\A3\ui_f\data\gui\cfg\slider\thumb_ca.paa"; + + text = ""; + onSliderPosChanged = "['Slider', _this] call ace_spectator_fnc_viewDistance"; + onMouseButtonDown = QUOTE(GVAR(mouseBusy) = true; false); + onMouseButtonUp = QUOTE(GVAR(mouseBusy) = false; false); + }; + }; +}; + +class ace_spectator_map { + + idd = 12202; + enableSimulation = 1; + enableDisplay = 0; + onLoad = "uiNameSpace setVariable ['ace_spectator_map', _this select 0]; ['Init', _this select 0] call ace_spectator_fnc_map"; + onUnload = "['Close', _this select 0] call ace_spectator_fnc_map"; + onKeyDown = "['KeyDown', _this] call ace_spectator_fnc_map"; + + class controls { + //changes stolen from ACE_map + class Map { + access = 0; + idc = 1; + type = CT_MAP_MAIN; + style = ST_PICTURE; + default = 0; + blinkingPeriod = 0; + + x = safeZoneXAbs; + y = safeZoneY; + w = safeZoneWAbs; + h = safeZoneH; + + sizeEx = GUI_GRID_CENTER_H; + font = GUI_FONT_NORMAL; + colorText[] = {0,0,0,1}; + text = "#(argb,8,8,3)color(1,1,1,1)"; + + moveOnEdges = 1; + + ptsPerSquareSea = 5; + ptsPerSquareTxt = 20; + ptsPerSquareCLn = 10; + ptsPerSquareExp = 10; + ptsPerSquareCost = 10; + + ptsPerSquareFor = 9; + ptsPerSquareForEdge = 9; + ptsPerSquareRoad = 6; + ptsPerSquareObj = 9; + + scaleMin = 0.001; + scaleMax = 1.0; + scaleDefault = 0.16; + + alphaFadeStartScale = 2; + alphaFadeEndScale = 2; + maxSatelliteAlpha = 0.5; + + colorBackground[] = {0.929412, 0.929412, 0.929412, 1.0}; + colorOutside[] = {0.929412, 0.929412, 0.929412, 1.0}; + colorSea[] = {0.4,0.6,0.8,0.5}; + colorForest[] = {0.6, 0.8, 0.2, 0.25}; + colorForestBorder[] = {0.6,0.8,0.4,1}; + colorRocks[] = {0.50, 0.50, 0.50, 0.50}; + colorRocksBorder[] = {0,0,0,1}; + colorLevels[] = {0.0, 0.0, 0.0, 1.0}; + colorMainCountlines[] = {0.858824, 0, 0,1}; + colorCountlines[] = {0.647059, 0.533333, 0.286275, 1}; + colorMainCountlinesWater[] = {0.5,0.6,0.7,0.6}; + colorCountlinesWater[] = {0.5,0.6,0.7,0.3}; + colorPowerLines[] = {0.1,0.1,0.1,1}; + colorRailWay[] = {0.8,0.2,0,1}; + colorNames[] = {1.1,0.1,1.1,0.9}; + colorInactive[] = {1,1,0,0.5}; + colorTracks[] = {0.2,0.13,0,1}; + colorTracksFill[] = {1,0.88,0.65,0.3}; + colorRoads[] = {0.2,0.13,0,1}; + colorRoadsFill[] = {1,0.88,0.65,1}; + colorMainRoads[] = {0.0,0.0,0.0,1}; + colorMainRoadsFill[] = {0.94,0.69,0.2,1}; + colorGrid[] = {0.05,0.1,0,0.6}; + colorGridMap[] = {0.05,0.1,0,0.4}; + + fontLabel="PuristaMedium"; + sizeExLabel="( ( ( ((safezoneW / safezoneH) min 1.2) / 1.2) / 25) * 0.8)"; + fontGrid="TahomaB"; + sizeExGrid = 0.032; + fontUnits="TahomaB"; + sizeExUnits="( ( ( ((safezoneW / safezoneH) min 1.2) / 1.2) / 25) * 0.8)"; + fontNames="EtelkaNarrowMediumPro"; + sizeExNames="( ( ( ((safezoneW / safezoneH) min 1.2) / 1.2) / 25) * 0.8) * 2"; + fontInfo="PuristaMedium"; + sizeExInfo="( ( ( ((safezoneW / safezoneH) min 1.2) / 1.2) / 25) * 0.8)"; + fontLevel="TahomaB"; + sizeExLevel=0.03; + showCountourInterval = 1; + + class Task { + icon = "#(argb,8,8,3)color(1,1,1,1)"; + color[] = {1,1,0,1}; + + iconCreated = "#(argb,8,8,3)color(1,1,1,1)"; + colorCreated[] = {0,0,0,1}; + + iconCanceled = "#(argb,8,8,3)color(1,1,1,1)"; + colorCanceled[] = {0,0,0,0.5}; + + iconDone = "#(argb,8,8,3)color(1,1,1,1)"; + colorDone[] = {0,1,0,1}; + + iconFailed = "#(argb,8,8,3)color(1,1,1,1)"; + colorFailed[] = {1,0,0,1}; + + size = 8; + importance = 1; + coefMin = 1; + coefMax = 1; + }; + class ActiveMarker { //includes icons spawned by drawIcon + color[] = {0,0,0,1}; + size = 2; + coefMin = 1; //make sure icon doesnt scale + }; + class Waypoint { + coefMax = 1; + coefMin = 4; + color[] = {0,0,0,1}; + icon = "#(argb,8,8,3)color(0,0,0,1)"; + importance = 1; + size = 2; + }; + class WaypointCompleted: Waypoint{}; + class CustomMark: Waypoint{}; + class Command: Waypoint{}; + class Bush { + icon = ""; + color[] = {0.450000, 0.640000, 0.330000, 0.0}; + size = 14; + importance = "0.2 * 14 * 0.05"; + coefMin = 0.250000; + coefMax = 4; + }; + class Rock: Waypoint{color[]={0.45,0.64,0.33,0.4}; importance="0.5 * 12 * 0.05";}; + class SmallTree { + icon = ""; + color[] = {0.450000, 0.640000, 0.330000, 0.0}; + size = 12; + importance = "0.6 * 12 * 0.05"; + coefMin = 0.250000; + coefMax = 4; + }; + class Tree { + icon = ""; + color[] = {0.450000, 0.640000, 0.330000, 0.0}; + size = 12; + importance = "0.9 * 16 * 0.05"; + coefMin = 0.250000; + coefMax = 4; + }; + class Legend { + x = SafeZoneX+SafeZoneW-.340; + y = SafeZoneY+SafeZoneH-.152; + font = "PuristaMedium"; + w = .340; + h = .152; + sizeEx = 0.039210; + colorBackground[] = {0.906000, 0.901000, 0.880000, 0.5}; + color[] = {0, 0, 0, 0.75}; + }; + class BusStop: Waypoint{}; + class FuelStation: Waypoint{}; + class Hospital: Waypoint{}; + class Church: Waypoint{}; + class Lighthouse: Waypoint{}; + class Power: Waypoint{}; + class PowerSolar: Waypoint{}; + class PowerWave: Waypoint{}; + class PowerWind: Waypoint{}; + class Quay: Waypoint{}; + class Transmitter: Waypoint{}; + class Watertower: Waypoint{}; + class Cross: Waypoint{}; + class Chapel: Waypoint{}; + class Shipwreck: Waypoint{}; + class Bunker: Waypoint{}; + class Fortress: Waypoint{}; + class Fountain: Waypoint{}; + class Ruin: Waypoint{}; + class Stack: Waypoint{}; + class Tourism: Waypoint{}; + class ViewTower: Waypoint{}; + }; + }; +}; + +class RscTitles { + class ace_spectator_crosshair { + + onLoad = "uiNamespace setVariable ['ace_spectator_crosshair', _this select 0]"; + + idd=-1; + movingEnable=0; + fadein=0; + fadeout=0; + duration=1e+011; + + class controls { + + class X: vip_rsc_picture { + idc = 0; + x = QUOTE(RESCENTRE_X - XHAIR / 2); + y = QUOTE(RESCENTRE_Y - XHAIR * 4/3 / 2); + w = QUOTE(XHAIR); + h = QUOTE(XHAIR * 4/3); + text = "\a3\ui_f\data\IGUI\Cfg\Cursors\select_target_ca.paa"; + colorText[] = {1,1,1,0.8}; + }; + }; + }; + + class ace_spectator_status { + + onLoad = "uiNamespace setVariable ['ace_spectator_status', _this select 0]; [_this select 0] call ace_spectator_fnc_status"; + idd = -1; + movingEnable=0; + fadein=0; + fadeout=0; + duration=1e+011; + + class controls { + + class BGRight: vip_rsc_box { + x = QUOTE(safeZoneX + safeZoneW - RESUNITS_X * 30); + y = QUOTE(safeZoneY); + w = QUOTE(RESUNITS_X * 30); + h = QUOTE(COMPASS_H); + colorBackground[] = {0.1,0.1,0.1,1}; + }; + + class BGLeft: BGRight { + x = QUOTE(safeZoneX); + }; + + class SpeedFrame: vip_rsc_frame { + x = QUOTE(safeZoneX + safeZoneW - RESUNITS_X * 5); + y = QUOTE(safeZoneY); + w = QUOTE(RESUNITS_X * 5); + h = QUOTE(COMPASS_H); + shadow = 2; + colorText[]={1,1,1,1}; + }; + + class Speed: vip_rsc_text { + idc = 0; + style = ST_CENTER; + x = QUOTE(safeZoneX + safeZoneW - RESUNITS_X * 5); + y = QUOTE(safeZoneY); + w = QUOTE(RESUNITS_X * 5); + h = QUOTE(COMPASS_H); + colorText[]={1,1,1,1}; + sizeEx = QUOTE(RESUNITS_Y * 2); + font = GUI_FONT_NORMAL; + text = ""; + }; + + class FovFrame: SpeedFrame { + x = QUOTE(safeZoneX + safeZoneW - RESUNITS_X * 10.5); + }; + + class Fov: Speed { + idc = 4; + x = QUOTE(safeZoneX + safeZoneW - RESUNITS_X * 10.5); + }; + + class TimeAccFrame: SpeedFrame { + x = QUOTE(safeZoneX + safeZoneW - RESUNITS_X * 21.5); + }; + + class TimeAcc: Speed { + idc = 5; + x = QUOTE(safeZoneX + safeZoneW - RESUNITS_X * 21.5); + }; + + class FocusFrame: SpeedFrame { + x = QUOTE(safeZoneX + safeZoneW - RESUNITS_X * 16); + }; + + class Focus: Speed { + idc = 6; + x = QUOTE(safeZoneX + safeZoneW - RESUNITS_X * 16); + }; + + class NameFrame: SpeedFrame { + x = QUOTE(safeZoneX); + w = QUOTE(RESUNITS_X * 24.5); + }; + + class Name: Speed { + idc = 1; + x = QUOTE(safeZoneX); + w = QUOTE(RESUNITS_X * 24.5); + }; + + class ModeFrame: SpeedFrame { + x = QUOTE(safeZoneX + RESUNITS_X * 25); + }; + + class Mode: Speed { + idc = 2; + x = QUOTE(safeZoneX + RESUNITS_X * 25); + }; + + class TimeFrame: SpeedFrame { + x = QUOTE(safeZoneX + safeZoneW - RESUNITS_X * 30); + w = QUOTE(RESUNITS_X * 8); + }; + + class Time: Speed { + idc = 3; + x = QUOTE(safeZoneX + safeZoneW - RESUNITS_X * 30); + w = QUOTE(RESUNITS_X * 8); + }; + }; + }; + + class ace_spectator_compass { + + onLoad = "uiNamespace setVariable ['ace_spectator_compass', _this select 0]"; + onUnload = ""; + idd=-1; + movingEnable=0; + fadein=0; + fadeout=0; + duration=1e+011; + + class controls { + + class BG: vip_rsc_box { + x = QUOTE(COMPASS_X); + y = QUOTE(safeZoneY); + w = QUOTE(COMPASS_W); + h = QUOTE(COMPASS_H); + colorBackground[] = {0.1,0.1,0.1,1}; + }; + + class 0_90: vip_rsc_picture { + idc = 1; + x = QUOTE(RESCENTRE_X); + y = QUOTE(safeZoneY); + w = QUOTE(COMPASS_W / 2); + h = QUOTE(COMPASS_H); + text = "A3\ui_f_curator\data\cfgIngameUI\compass\texture180_ca.paa"; + }; + + class 90_180: 0_90 { + idc = 2; + x = QUOTE(RESCENTRE_X + COMPASS_W / 2); + text = "A3\ui_f_curator\data\cfgIngameUI\compass\texture270_ca.paa"; + }; + + class 180_270: 0_90 { + idc = 3; + x = QUOTE(RESCENTRE_X + COMPASS_W); + text = "A3\ui_f_curator\data\cfgIngameUI\compass\texture0_ca.paa"; + }; + + class 270_0: 0_90 { + idc = 4; + x = QUOTE(RESCENTRE_X + COMPASS_W * 1.5); + text = "A3\ui_f_curator\data\cfgIngameUI\compass\texture90_ca.paa"; + }; + + class Post: vip_rsc_box { + x = QUOTE(COMPASS_X + COMPASS_W / 2); + y = QUOTE(safeZoneY); + w = QUOTE(PIXEL_X * 2); + h = QUOTE(COMPASS_H); + colorBackground[]={1,0,0,1}; + }; + + class LeftBlocker: vip_rsc_box { + x = QUOTE(COMPASS_X - COMPASS_W / 2); + y = QUOTE(safeZoneY); + w = QUOTE(COMPASS_W / 2); + h = QUOTE(COMPASS_H); + colorBackground[] = {0.1,0.1,0.1,1}; + }; + + class RightBlocker: LeftBlocker { + x = QUOTE(COMPASS_X + COMPASS_W); + }; + + class Frame: vip_rsc_frame { + x = QUOTE(COMPASS_X); + y = QUOTE(safeZoneY); + w = QUOTE(COMPASS_W); + h = QUOTE(COMPASS_H); + shadow=2; + colorText[]={1,1,1,1}; + }; + }; + }; + + class ace_spectator_help { + + onLoad = "uiNamespace setVariable ['ace_spectator_help', _this select 0]; ['Help', _this select 0] call ace_spectator_fnc_camera"; + idd = -1; + movingEnable=0; + fadein=0; + fadeout=0; + duration=1e+011; + + class controls { + + class BG: vip_rsc_box { + idc = -1; + x = QUOTE(RESCENTRE_X - HELP_W / 2); + y = QUOTE(RESCENTRE_Y - HELP_H / 2); + w = QUOTE(HELP_W); + h = QUOTE(HELP_H); + colorBackground[] = {0.1,0.1,0.1,1}; + }; + + class Title: vip_rsc_text { + idc = 0; + style = ST_CENTER; + x = QUOTE(RESCENTRE_X - RESUNITS_X * 25); + y = QUOTE(RESCENTRE_Y - (HELP_H / 2) + RESUNITS_Y * 3); + w = QUOTE(RESUNITS_X * 50); + h = QUOTE(RESUNITS_Y * 4); + colorText[]={1,1,1,1}; + sizeEx = QUOTE(RESUNITS_Y * 4); + font = GUI_FONT_NORMAL; + text = "ACE Spectator Controls"; + }; + + class LeftColumn1 { + idc = 1; + type = CT_STRUCTURED_TEXT; + style = ST_LEFT; + x = QUOTE(RESCENTRE_X - HELP_W / 2 + RESUNITS_X * 3); + y = QUOTE(RESCENTRE_Y - (HELP_H / 2) + RESUNITS_Y * 10); + w = QUOTE(RESUNITS_X * 16.75); + h = QUOTE(RESUNITS_Y * 63); + text = ""; + size = QUOTE(RESUNITS_Y * 2.5); + colorBackground[] = {0,0,0,0}; + }; + + class LeftColumn2: LeftColumn1 { + idc = 2; + x = QUOTE(RESCENTRE_X - HELP_W / 2 + RESUNITS_X * 19.75); + }; + + class RightColumn1: LeftColumn1 { + idc = 3; + x = QUOTE(RESCENTRE_X + HELP_W / 2 - RESUNITS_X * 3 - RESUNITS_X * 29.5); + }; + + class RightColumn2: LeftColumn1 { + idc = 4; + x = QUOTE(RESCENTRE_X + HELP_W / 2 - RESUNITS_X * 3 - RESUNITS_X * 11.75); + }; + }; + }; +}; \ No newline at end of file diff --git a/addons/spectator/UI/Icon_Module_Spectator_ca.paa b/addons/spectator/UI/Icon_Module_Spectator_ca.paa new file mode 100644 index 0000000000000000000000000000000000000000..a4d784cea69660dfe59e37c6e9f79acb4bbff8bb GIT binary patch literal 5625 zcmd^DUuauZ82@ffwiec|D@ozf>Fy*tl}^wLg~FgGb8Qo8x8QQeUVLZ;1+|qikUp7o zBBfGG)>bjtt}x#eMD~yeUm6fL2HEO^$i`%jP1&Pe2X2Gt_4l1~Pnz6xTSHqq^y@w8 z{pEb;`_A|0ob#Oo-QM14^0nS$(Et$@i^U;{k4O6%yCBBB(Y_wW1{&j|Jv~PR-qUDf z%|w$SqR+!bzoOMff&@`B6scjXkl)sem9&-5^~!Te)J5>HoCL_Fh73Q9gP?WG_uCKO zMq;O=K1wE&=*~pqQwlqd!#EJn1f@}4;!?a{7QXdO5=po@3Wt% z&cefb1jw)dakzSZu{s{Z-zWJ$#Y@;xn7d^^=bV4M>@556_xs~n#=550s`#r>(tf-O z_AiIb)64OCG*%3-LyZ93>CYjrAjs$Zm;OciSNXSs89=$WhImK;<@~(<)qJpApikz%)Q{y~ zrN4H4@OMrA`mgb`!^{1>v6xI=SvxInJ%($K&&JNjub-uFB$>Q^<5PP51x>qS_`rR) z$o2-+6vP1NDeqUq`Vt;-&2wor#Rk#29fQ zNA9kfNPOlHV~#($r!tY(&%%D9LlU>lMBaGzxt0EOCUUyvMaJFSZ;mW&->K}63O+%$ zm`oV2?dN*ThVf%q;p-}4vh2OQ8_Z9n$AQaudwH{E`dxIR(!In3X3`~Chm?UBjbcvkX#efe+N zi+6V8(enKIo-{1&KmWl~YV{g8|5D5Q+?}QMZQAbLt_u8M9`!+4|Hb)Y1%~lmJFX~s zV#C+Fl8b!_#J>E$VT&w2n9>WdKehCuXTFe_2HQN0vQ4M4x`tDl9d>t*=9kzjqv1t| z(%V0}VKm*~{!l0smi^wg%@U-qQ7NhMj+0(UEmi8LW%m*KF`lozGF%V2_F!A$W0(lL zQi$!LvA@0WB8$@Qe56$NIwaDm*?ewJ&PNEwxwqOpj9U))yE3{=#x103yk8#df5!6U zheB)N=lSUL!@W(;Zv{6pMy2KXE8I8j{+2tOd55EbVU#|PHS@(>x5nEff4{eEoP=Lq z6=oqI3r))?#}kE);Xe)!$}$F3tYH`8=Mn=Wvzpf~%pTkkxp+(CZ43L`FTelOFFZTk zN(IYevd}b7Ex0c`eDnF9L0L8%AUk{ET}&35 z=BWiYW_t!BA8P%<;N$c+W*cVn<8z+=l``dF`d7X7%enG3o@gT5!HW^ZKYJ0`6Bnjs zO(nl!+|MuX+4y`I(`ai&29_-gO6#EDtC}NUMc=srh>+x>#)hWTjK*_U5MB zRnmo-f6uieEpRF3inCbcM-7S(LbI%H9g#m#2YgbFhXRow4^aHot7<$lBac19s4Wo8uE{kG$WS6D1+Uf}6BuYU6M bFk`Ms1NehK#djCK8G8A%R%LCJM}qzZElRSR literal 0 HcmV?d00001 diff --git a/addons/spectator/XEH_postInit.sqf b/addons/spectator/XEH_postInit.sqf new file mode 100644 index 0000000000..b57d08ac7b --- /dev/null +++ b/addons/spectator/XEH_postInit.sqf @@ -0,0 +1,96 @@ +/* + Author: + voiper +*/ + +#include "script_component.hpp" + +["SettingsInitialized", { + if !GVAR(enabled) exitWith {}; + + //check if respawn is set up properly + _fail = if (getNumber (missionConfigFile >> "respawn") != 3 && getText (missionConfigFile >> "respawn") != "Base") then {true} else {false}; + if (_fail) exitWith { + _text = "[ACE_Spectator] ERROR: This mission does not have respawn set up properly. Add 'respawn=3' or 'respawn=""BASE""' to description.ext."; + systemChat _text; + diag_log text _text; + }; + + if GVAR(endMission) then { + [{ + if (player distance GVAR(penPos) < 200) then { + if ({isPlayer _x && alive _x && (_x distance GVAR(penPos)) > 200} count allUnits == 0) then { + [["endDeath", false], "BIS_fnc_endMission"] call BIS_fnc_MP; + [_this select 1] call CBA_fnc_removePerFrameHandler; + }; + }; + }, 2] call CBA_fnc_addPerFrameHandler; + }; + + if (isDedicated) exitWith {}; + + call FUNC(penPos); + + { + if (getMarkerPos _x isEqualTo [0,0,0]) then { + _marker = createMarkerLocal [_x, [0,0]]; + _marker setMarkerShapeLocal "ICON"; + }; + + _x setMarkerPosLocal GVAR(penPos); + } forEach ["respawn_west", "respawn_east", "respawn_guerrila", "respawn_civilian"]; + + GVAR(playerSide) = side (group player); + + if GVAR(tracking) then { + [FUNC(checkUnits), 2] call CBA_fnc_addPerFrameHandler; + [FUNC(trackUnits), 20] call CBA_fnc_addPerFrameHandler; + }; + + player addEventHandler ["Killed", { + [player] joinSilent grpNull; + if (isClass (configFile >> "CfgPatches" >> "ace_hearing")) then {EGVAR(hearing,disableVolumeUpdate) = true}; + _delay = getNumber (missionConfigFile >> "respawnDelay"); + _delay fadeSound 0; + 999999 cutText ["", "BLACK", _delay]; + }]; + + player addEventHandler ["Respawn", { + if (!isNil QGVAR(cam)) then {["Exit"] call FUNC(camera)}; + if (isClass (configFile >> "CfgPatches" >> "ace_hearing")) then {EGVAR(hearing,disableVolumeUpdate) = true}; + if (isClass (configFile >> "CfgPatches" >> "acre_sys_radio")) then {[true] call acre_api_fnc_setSpectator}; + if (isClass (configFile >> "CfgPatches" >> "task_force_radio")) then {[player, true] call TFAR_fnc_forceSpectator}; + + if !GVAR(modulePos) then { + _corpse = _this select 1; + if (!isNil "_corpse") then { + if (!isNull _corpse) then { + GVAR(startingPos) = getPosATL _corpse; + }; + }; + }; + + player addEventHandler ["HandleDamage", {0}]; + [player] joinSilent grpNull; + removeAllWeapons player; + removeAllItems player; + removeAllAssignedItems player; + removeUniform player; + removeVest player; + player linkItem "ItemMap"; + player linkItem "ItemRadio"; + hideObjectGlobal player; + + if (surfaceisWater GVAR(penPos)) then { + player forceAddUniform "U_B_Wetsuit"; + player addVest "V_RebreatherB"; + }; + + player setPosATL GVAR(penPos); + + 0 fadeSound 0; + 999999 cutText ["", "BLACK FADED", 0]; + ["Init", [true]] call FUNC(camera); + }]; + +}] call EFUNC(common,addEventHandler); \ No newline at end of file diff --git a/addons/spectator/XEH_preInit.sqf b/addons/spectator/XEH_preInit.sqf new file mode 100644 index 0000000000..41b24e8fcc --- /dev/null +++ b/addons/spectator/XEH_preInit.sqf @@ -0,0 +1,31 @@ +#include "script_component.hpp" + +ADDON = false; + +PREP(camera); +PREP(cameraIntro); +PREP(canSpectateUnit); +PREP(checkUnits); +PREP(compass); +PREP(crosshair); +PREP(draw3D); +PREP(drawMines2D); +PREP(drawMines3D); +PREP(drawTracks2D); +PREP(drawUnits2D); +PREP(drawUnits3D); +PREP(killed); +PREP(map); +PREP(moduleSpectator); +PREP(overlay); +PREP(penPos); +PREP(respawn); +PREP(sideColour); +PREP(status); +PREP(trackUnits); +PREP(unitInfo); +PREP(unitSide); +PREP(unitVar); +PREP(viewDistance); + +ADDON = true; \ No newline at end of file diff --git a/addons/spectator/config.cpp b/addons/spectator/config.cpp new file mode 100644 index 0000000000..89b0b814b5 --- /dev/null +++ b/addons/spectator/config.cpp @@ -0,0 +1,19 @@ +#include "script_component.hpp" + +class CfgPatches { + class ADDON { + units[] = {}; + weapons[] = {}; + requiredVersion = REQUIRED_VERSION; + requiredAddons[] = {"ace_common"}; + author[] = {"voiper"}; + authorUrl = "https://github.com/voiperr/"; + VERSION_CONFIG; + }; +}; + +#include "ACE_Settings.hpp" +#include "CfgEventHandlers.hpp" +#include "CfgVehicles.hpp" +#include "rsc_defines.hpp" +#include "UI.hpp" \ No newline at end of file diff --git a/addons/spectator/functions/fnc_camera.sqf b/addons/spectator/functions/fnc_camera.sqf new file mode 100644 index 0000000000..853720893d --- /dev/null +++ b/addons/spectator/functions/fnc_camera.sqf @@ -0,0 +1,1081 @@ +/* + Author: + voiper, derived in part from BIS_fnc_camera by Karel Moricky + + Description: + Spectator camera and UI. + + Arguments: + 0: Mode: "Init" is the only mission relevant one + 1: (optional): + 0: Whether player can escape from camera (true for MP spectator; false for SP photography) + + Example: + ["Init", [false]] call ace_spectator_fnc_camera; + + Return Value: + None + + Public: + No +*/ + +#include "script_component.hpp" +#include "\a3\editor_f\Data\Scripts\dikCodes.h" + +disableSerialization; +_mode = _this select 0; +_this = _this select 1; + +switch _mode do { + + case "Init": { + + GVAR(noEscape) = if (count _this > 0) then {_this select 0} else {false}; + + call FUNC(penPos); + + _camPos = if (!isNil QGVAR(startingPos)) then { + GVAR(startingPos) + } else { + getPos cameraOn + }; + + _camDir = if (!isNil QGVAR(startingDir)) then { + GVAR(startingDir) + } else { + 0 + }; + + _camPos set [2, (_camPos select 2) + 2]; + _cam = "camera" camCreate _camPos; + _cam setDir _camDir; + _cam cameraEffect ["internal", "back"]; + _cam camSetFocus [-1, -1]; + _cam camCommit 0; + showCinemaBorder false; + cameraEffectEnableHUD true; + setViewDistance 3000; + + //variables + GVAR(cam) = _cam; + GVAR(LMB) = false; + GVAR(RMB) = false; + GVAR(vector) = [_camDir, 0, 0]; + GVAR(fov) = 0.7; + GVAR(vision) = 0; + GVAR(moveScale) = 0.1; + GVAR(cameraOn) = true; + GVAR(focus) = [-1, -1]; + GVAR(lock) = [-1]; + GVAR(attach) = objNull; + GVAR(unit) = objNull; + GVAR(mouseBusy) = false; + GVAR(markers) = 3; + GVAR(accTime) = 1; + GVAR(third) = false; + + //define only if doesn't exist (to preserve saved spots from a previous camera) + if (isNil QGVAR(savedSpots)) then { + GVAR(savedSpots) = []; + for "_i" from 0 to 11 do {GVAR(savedSpots) set [_i, []]}; + }; + + if (isNil QGVAR(savedUnits)) then { + GVAR(savedUnits) = []; + for "_i" from 0 to 9 do {GVAR(savedUnits) set [_i, objNull]}; + }; + + GVAR(keys) = []; + _DIKcodes = true call BIS_fnc_keyCode; + _DIKlast = _DIKcodes select (count _DIKcodes - 1); + for "_i" from 0 to (_DIKlast - 1) do { + GVAR(keys) set [_i, false]; + }; + + _display = findDisplay 46; + + GVAR(ehDraw3D) = addMissionEventhandler ["Draw3D", {['Draw3D', _this] call FUNC(draw3D)}]; + addMissionEventHandler ["Ended", {if (!isNil QGVAR(cam)) then {["Exit"] call FUNC(camera)}}]; + GVAR(ehKeyDown) = _display displayAddEventHandler ["keyDown", {['KeyDown', _this] call FUNC(camera)}]; + GVAR(ehKeyUp) = _display displayAddEventHandler ["keyUp", {['KeyUp', _this] call FUNC(camera)}]; + GVAR(ehMouseButtonDown) = _display displayAddEventHandler ["mouseButtonDown", {['MouseButtonDown', _this] call FUNC(camera)}]; + GVAR(ehMouseButtonUp) = _display displayAddEventHandler ["mouseButtonUp", {['MouseButtonUp',_this] call FUNC(camera)}]; + GVAR(ehMouseZChanged) = _display displayAddEventHandler ["mouseZChanged", {['MouseZChanged',_this] call FUNC(camera)}]; + GVAR(ehMouseMoving) = _display displayAddEventHandler ["mouseMoving", {['Mouse',_this] call FUNC(camera)}]; + GVAR(ehMouseHolding) =_display displayAddEventHandler ["mouseHolding", {['Mouse',_this] call FUNC(camera)}]; + + //remove mission layer + _displayMission = call (uiNamespace getVariable "BIS_fnc_displayMission"); + _control = _displayMission displayCtrl 11400; + _control ctrlSetFade 1; + _control ctrlCommit 0; + + //kill layers + cutText ["", "Plain"]; + _layers = missionNamespace getVariable ["BIS_fnc_rscLayer_list", []]; + for "_i" from 1 to (count _layers - 1) step 2 do { + (_layers select _i) cutText ["", "Plain"]; + }; + + clearRadio; + + //crosshair + _layer = [QGVAR(crosshair)] call BIS_fnc_rscLayer; + _layer cutRsc [QGVAR(crosshair), "PLAIN", 2, true]; + + //compass + _layer = [QGVAR(compass)] call BIS_fnc_rscLayer; + _layer cutRsc [QGVAR(compass), "PLAIN", 2, true]; + + //status + _layer = [QGVAR(status)] call BIS_fnc_rscLayer; + _layer cutRsc [QGVAR(status), "PLAIN", 2, true]; + + //help + _layer = [QGVAR(help)] call BIS_fnc_rscLayer; + preloadTitleRsc [QGVAR(help), "PLAIN", 0, true]; + + if (isClass (configFile >> "CfgPatches" >> "ace_nametags")) then { + GVAR(tags) = [EGVAR(nametags,showPlayerNames), EGVAR(nametags,showNamesForAI)]; + EGVAR(nametags,showPlayerNames) = 0; + EGVAR(nametags,showNamesForAI) = false; + }; + + if (isClass (configFile >> "CfgPatches" >> "ace_interact_menu")) then { + [QGVAR(interactCondition), {false}] call EFUNC(common,addCanInteractWithCondition); + }; + + //add unit check, since if tracking were on it would already be present + if !GVAR(tracking) then { + [FUNC(checkUnits), 2] call CBA_fnc_addPerFrameHandler + }; + + [FUNC(cameraIntro), 1] call CBA_fnc_addPerFrameHandler; + }; + + ////////////////////////////////////////// + case "Mouse": { + _mapOn = uiNamespace getVariable QGVAR(map); + if (!isNull _mapOn) exitWith {}; + + _keys = GVAR(keys); + _cam = GVAR(cam); + _dir = GVAR(vector) select 0; + _pitch = GVAR(vector) select 1; + _bank = GVAR(vector) select 2; + _camPos = getPosASL _cam; + _coef = (GVAR(moveScale) * (((getPosATL _cam) select 2) / 2)) min 50 max 0.001; + + _move = { + _inPos = _this; + if !GVAR(cameraOn) exitWith {}; + if (_inPos select 2 > 20000) then {_inPos set [2, 20000]}; + _obj = GVAR(attach); + if !(isNull _obj) then { + if ((GVAR(lock) select 0) < 0) then { + _modelPos = _obj worldToModel (ASLtoATL _inPos); + _cam attachTo [_obj, _modelPos]; + }; + } else { + _cam setPosASL _inPos; + }; + }; + + if (GVAR(LMB) || GVAR(RMB)) then { + if GVAR(mouseBusy) exitWith {}; + _mX = (_this select 1) * (GVAR(accTime) max 0.05); + _mY = (_this select 2) * (GVAR(accTime) max 0.05); + + if GVAR(RMB) then { + + _dX = _mX; + _dY = -_mY; + + _camPos = [_camPos, _dY, getDir _cam] call BIS_fnc_relPos; + _camPos = [_camPos, _dX, getDir _cam + 90] call BIS_fnc_relPos; + + _camPos call _move; + + } else { + if (GVAR(lock) select 0 > -1) exitWith {}; + _dX = _mX / 50 * 180 * GVAR(fov); + _dY = -_mY / 50 * 180 * GVAR(fov); + + if (_keys select DIK_LSHIFT) then { + _pitch = (_pitch + _dY) max -180 min 180; + _bank = (_bank + _dX) max -181 min 181; + if (_bank <= -181) then {_bank = 180} else {if (_bank >= 181) then {_bank = -180}}; + } else { + _dir = _dir + _dX; + _pitch = (_pitch + _dY) max -90 min 90; + }; + GVAR(vector) = [_dir, _pitch, _bank]; + [_cam, GVAR(vector)] call BIS_fnc_setObjectRotation; + }; + }; + + _camMove = { + _dX = _this select 0; + _dY = _this select 1; + _dZ = _this select 2; + _pos = getPosASL _cam; + _moveDir = (getDir _cam) + _dX * 90; + _camPos = [ + (_pos select 0) + ((sin (_moveDir)) * _coef * _dY), + (_pos select 1) + ((cos (_moveDir)) * _coef * _dY), + (_pos select 2) + _dZ * _coef / 1.5 + ]; + //for some reason, at visual height = 0, cameras report 10cm higher than they actually are + _camPos set [2, (_camPos select 2) max (getTerrainHeightASL _camPos + 0.1)]; + + _camPos call _move; + }; + + _camRotate = { + if ((GVAR(lock) select 0) > -1) exitWith {}; + _dX = (_this select 0) * GVAR(fov) * _rotMod; + _dY = (_this select 1) * GVAR(fov) * _rotMod; + _pitch = ((GVAR(vector) select 1) + _dY) max -90 min 90; + _bank = GVAR(vector) select 2; + _dir = _dir + _dX; + GVAR(vector) = [_dir, _pitch, _bank]; + [_cam, GVAR(vector)] call BIS_fnc_setObjectRotation; + }; + + _camBank = { + if ((GVAR(lock) select 0) > -1) exitWith {}; + _dZ = (_this select 0) * _rotMod; + _pitch = GVAR(vector) select 1; + _bank = ((GVAR(vector) select 2) + _dZ) max -181 min 181; + if (_bank == -181) then {_bank = 180} else {if (_bank == 181) then {_bank = -180}}; + GVAR(vector) = [_dir, _pitch, _bank]; + [_cam, GVAR(vector)] call BIS_fnc_setObjectRotation; + }; + + _numPad0 = _keys select DIK_NUMPAD0; + _numPadDel = _keys select DIK_DECIMAL; + _rotMod = if (_numPad0 && !_numPadDel) then { + 5 + } else { + if (!_numPad0 && _numPadDel) then {0.1} else {1}; + }; + + if (_keys select DIK_W) then {[0,1,0] call _camMove}; + if (_keys select DIK_S) then {[0,-1,0] call _camMove}; + if (_keys select DIK_A) then {[-1,1,0] call _camMove}; + if (_keys select DIK_D) then {[1,1,0] call _camMove}; + + if (_keys select DIK_Q) then {[0,0,1] call _camMove}; + if (_keys select DIK_Z) then {[0,0,-1] call _camMove}; + + if (_keys select DIK_NUMPAD1) then {[-1,-1,0] call _camRotate}; + if (_keys select DIK_NUMPAD2) then {[+0,-1,0] call _camRotate}; + if (_keys select DIK_NUMPAD3) then {[+1,-1,0] call _camRotate}; + if (_keys select DIK_NUMPAD4) then {[-1,+0,0] call _camRotate}; + if (_keys select DIK_NUMPAD6) then {[+1,+0,0] call _camRotate}; + if (_keys select DIK_NUMPAD7) then {[-1,+1,0] call _camRotate}; + if (_keys select DIK_NUMPAD8) then {[+0,+1,0] call _camRotate}; + if (_keys select DIK_NUMPAD9) then {[+1,+1,0] call _camRotate}; + if (_keys select DIK_DIVIDE) then {[-1] call _camBank}; + if (_keys select DIK_MULTIPLY) then {[+1] call _camBank}; + + if (_keys select DIK_ADD) then { + GVAR(fov) = GVAR(fov) - (GVAR(fov) / 50 * _rotMod) max 0.01; + _cam camPrepareFOV GVAR(fov); + _cam camCommitPrepared 0; + }; + if (_keys select DIK_SUBTRACT) then { + GVAR(fov) = GVAR(fov) + (GVAR(fov) / 50 * _rotMod) min 2; + _cam camPrepareFOV GVAR(fov); + _cam camCommitPrepared 0; + }; + + if (_keys select DIK_NUMPADENTER) then { + GVAR(fov) = 0.7; + _cam camPrepareFOV GVAR(fov); + _cam camCommitPrepared 0; + }; + + if (_keys select DIK_MINUS) then { + _cur = GVAR(focus) select 0; + if (_cur < 0) then {_cur = 1}; + _cur = _cur - (_cur / 25) max 0.25; + GVAR(focus) = [_cur, 1.5]; + _cam camSetFocus GVAR(focus); + _cam camCommit 0; + }; + + if (_keys select DIK_EQUALS) then { + _cur = GVAR(focus) select 0; + if (_cur < 0) then {_cur = 1}; + _cur = _cur + (_cur / 25) min 5000; + GVAR(focus) = [_cur, 1.5]; + _cam camSetFocus GVAR(focus); + _cam camCommit 0; + }; + + if (_keys select DIK_LBRACKET)then { + if (!isMultiplayer) then { + _cur = GVAR(accTime); + _cur = _cur - (_cur / 25) max 0; + GVAR(accTime) = _cur; + setAccTime GVAR(accTime); + }; + }; + + if (_keys select DIK_RBRACKET)then { + if (!isMultiplayer) then { + _cur = GVAR(accTime); + _cur = _cur + (_cur / 25) min 4; + GVAR(accTime) = _cur; + setAccTime GVAR(accTime); + }; + }; + }; + + ////////////////////////////////////////// + case "MouseButtonDown": { + _mapOn = uiNamespace getVariable QGVAR(map); + if (!isNull _mapOn) exitWith {}; + + _button = _this select 1; + _mX = _this select 2; + _mY = _this select 3; + _shift = _this select 4; + _ctrl = _this select 5; + _alt = _this select 6; + + switch (_button) do { + case 0: {GVAR(LMB) = true}; + case 1: {GVAR(RMB) = true}; + }; + }; + + ////////////////////////////////////////// + case "MouseButtonUp": { + _mapOn = uiNamespace getVariable QGVAR(map); + if (!isNull _mapOn) exitWith {}; + + _button = _this select 1; + switch (_button) do { + case 0: {GVAR(LMB) = false}; + case 1: {GVAR(RMB) = false}; + }; + }; + + ////////////////////////////////////////// + case "MouseZChanged": { + _mapOn = uiNamespace getVariable QGVAR(map); + if (!isNull _mapOn) exitWith {}; + + _diff = _this select 1; + if (_diff > 0) then { + GVAR(moveScale) = GVAR(moveScale) + (GVAR(moveScale) / 10) min 1; + } else { + GVAR(moveScale) = GVAR(moveScale) - (GVAR(moveScale) / 10) max 0.001; + }; + }; + + ////////////////////////////////////////// + case "KeyDown": { + _key = _this select 1; + _shift = _this select 2; + _ctrl = _this select 3; + _alt = _this select 4; + _return = false; + + GVAR(keys) set [_key, true]; + + _cam = GVAR(cam); + _camOn = GVAR(cameraOn); + _unit = GVAR(unit); + _lock = GVAR(lock) select 0; + + _camPos = [getPos _cam, GVAR(vector), GVAR(fov), GVAR(focus)]; + + _camSaveSpot = { + _num = _this select 0; + if (!isNull GVAR(attach)) then { + _vector = _camPos select 1; + _dir = _vector select 0; + _vector set [0, _dir - (getDir GVAR(attach))]; + _camPos set [1, _vector]; + }; + GVAR(savedSpots) set [_num, _camPos]; + }; + + _camLoadSpot = { + _num = _this select 0; + _arr = GVAR(savedSpots) select _num; + if (count (_arr) > 0) then { + if (!_camOn) then { + ["Camera", ["Free"]] call FUNC(camera) + }; + call _detach; + _cam setPos (_arr select 0); + _vector = _arr select 1; + [_cam, _vector] call BIS_fnc_setObjectRotation; + _cam camPrepareFOV (_arr select 2); + _cam camPrepareFocus (_arr select 3); + _cam camCommitPrepared 0; + GVAR(vector) = _vector; + }; + }; + + _camSaveUnit = { + _num = _this select 0; + + if (!isNull _unit) then { + _alreadySaved = GVAR(savedUnits) find _unit; + if (_alreadySaved > -1) then { + GVAR(savedUnits) set [_alreadySaved, objNull]; + }; + GVAR(savedUnits) set [_num, _unit] + }; + }; + + _camLoadUnit = { + _num = _this select 0; + _unit = GVAR(savedUnits) select _num; + if (!isNull _unit) then { + if (_lock > -1) then { + ["Camera", ["Lock"]] call FUNC(camera) + }; + if (GVAR(unit) == _unit) then { + call _detach; + if (_camOn) then { + ["Camera", ["Third"]] call FUNC(camera); + } else { + ["Camera", ["SwitchUnit"]] call FUNC(camera); + }; + } else { + GVAR(unit) = _unit; + if ((GVAR(lock) select 0) > -1) then {["Camera", ["Lock"]] call FUNC(camera)}; + if (!_camOn) then { + call _detach; + ["Camera", ["SwitchUnit"]] call FUNC(camera); + }; + }; + }; + }; + + _detach = { + if (!isNull GVAR(attach)) then { + ["Camera", ["Attach"]] call FUNC(camera); + }; + }; + + switch (_key) do { + + case (DIK_F1): {if (_ctrl) then {[0] call _camSaveSpot} else {[0] call _camLoadSpot}; _return = true}; + case (DIK_F2): {if (_ctrl) then {[1] call _camSaveSpot} else {[1] call _camLoadSpot}; _return = true}; + case (DIK_F3): {if (_ctrl) then {[2] call _camSaveSpot} else {[2] call _camLoadSpot}; _return = true}; + case (DIK_F4): {if (_ctrl) then {[3] call _camSaveSpot} else {[3] call _camLoadSpot}; _return = true}; + case (DIK_F5): {if (_ctrl) then {[4] call _camSaveSpot} else {[4] call _camLoadSpot}; _return = true}; + case (DIK_F6): {if (_ctrl) then {[5] call _camSaveSpot} else {[5] call _camLoadSpot}; _return = true}; + case (DIK_F7): {if (_ctrl) then {[6] call _camSaveSpot} else {[6] call _camLoadSpot}; _return = true}; + case (DIK_F8): {if (_ctrl) then {[7] call _camSaveSpot} else {[7] call _camLoadSpot}; _return = true}; + case (DIK_F9): {if (_ctrl) then {[8] call _camSaveSpot} else {[8] call _camLoadSpot}; _return = true}; + case (DIK_F10): {if (_ctrl) then {[9] call _camSaveSpot} else {[9] call _camLoadSpot}; _return = true}; + case (DIK_F11): {if (_ctrl) then {[10] call _camSaveSpot} else {[10] call _camLoadSpot}; _return = true}; + case (DIK_F12): {if (_ctrl) then {[11] call _camSaveSpot} else {[11] call _camLoadSpot}; _return = true}; + + case (DIK_1): {if (_ctrl) then {[0] call _camSaveUnit} else {[0] call _camLoadUnit}; _return = true}; + case (DIK_2): {if (_ctrl) then {[1] call _camSaveUnit} else {[1] call _camLoadUnit}; _return = true}; + case (DIK_3): {if (_ctrl) then {[2] call _camSaveUnit} else {[2] call _camLoadUnit}; _return = true}; + case (DIK_4): {if (_ctrl) then {[3] call _camSaveUnit} else {[3] call _camLoadUnit}; _return = true}; + case (DIK_5): {if (_ctrl) then {[4] call _camSaveUnit} else {[4] call _camLoadUnit}; _return = true}; + case (DIK_6): {if (_ctrl) then {[5] call _camSaveUnit} else {[5] call _camLoadUnit}; _return = true}; + case (DIK_7): {if (_ctrl) then {[6] call _camSaveUnit} else {[6] call _camLoadUnit}; _return = true}; + case (DIK_8): {if (_ctrl) then {[7] call _camSaveUnit} else {[7] call _camLoadUnit}; _return = true}; + case (DIK_9): {if (_ctrl) then {[8] call _camSaveUnit} else {[8] call _camLoadUnit}; _return = true}; + case (DIK_0): {if (_ctrl) then {[9] call _camSaveUnit} else {[9] call _camLoadUnit}; _return = true}; + + case (DIK_NUMPAD5): { + _dir = getDir _cam; + if (!isNull GVAR(attach)) then {_dir = _dir - getDir GVAR(attach)}; + GVAR(vector) = [_dir, 0, 0]; + [_cam, GVAR(vector)] call BIS_fnc_setObjectRotation; + GVAR(fov) = 0.7; + _cam camPrepareFOV GVAR(fov); + _cam camCommitPrepared 0; + }; + + case (DIK_NUMPADENTER): {_return = true}; + + case (DIK_NUMPAD0): {_return = true}; + + case (DIK_DECIMAL): {_return = true}; + + case (DIK_BACKSPACE): { + GVAR(focus) = if (!_shift) then { + [-1, 1]; + } else { + [-1, -1]; + }; + _cam camPrepareFocus GVAR(focus); + _cam camCommitPrepared 0; + _return = true; + }; + + case (DIK_BACKSLASH): { + if (!isMultiplayer) then { + GVAR(accTime) = 1; + setAccTime GVAR(accTime); + }; + }; + + case (DIK_GRAVE): {_return = true}; + + case (DIK_SPACE): { + if (!_camOn) exitWith {}; + if (_ctrl) then { + ["Camera", ["Attach"]] call FUNC(camera); + } else { + ["Camera", ["Lock"]] call FUNC(camera); + }; + }; + + case (DIK_LEFT): { + ["Camera", ["NewUnit", -1]] call FUNC(camera) + }; + + case (DIK_RIGHT): { + ["Camera", ["NewUnit", 1]] call FUNC(camera) + }; + + case (DIK_UP): { + if (isNull GVAR(unit)) exitWith {}; + if (_lock > -1) then {["Camera", ["Lock"]] call FUNC(camera)}; + call _detach; + if (_camOn) then { + ["Camera", ["Third"]] call FUNC(camera); + } else { + if GVAR(third) then { + ["Camera", ["First"]] call FUNC(camera); + }; + }; + }; + + case (DIK_DOWN): { + if (isNull GVAR(unit)) exitWith {}; + if (_lock > -1) then {["Camera", ["Lock"]] call FUNC(camera)}; + call _detach; + if (!_camOn) then { + if !GVAR(third) then { + ["Camera", ["Third"]] call FUNC(camera); + } else { + ["Camera", ["Free"]] call FUNC(camera); + }; + }; + }; + + case (DIK_T): { + GVAR(markers) = GVAR(markers) + 1; + if (GVAR(markers) > 3) then {GVAR(markers) = 0}; + if (GVAR(markers) == 0) then {clearRadio}; + }; + + case (DIK_U): { + _map = uiNameSpace getVariable [QGVAR(map), findDisplay 12202]; + if (!isNull _map) exitWith {}; + + _overlay = uiNamespace getVariable [QGVAR(overlay), findDisplay 12200]; + if (isNull _overlay) then { + createDialog QGVAR(overlay); + } else { + closeDialog 0; + }; + }; + + case (DIK_X): { + _layer = [QGVAR(crosshair)] call BIS_fnc_rscLayer; + _xhair = uiNamespace getVariable QGVAR(crosshair); + if (isNull _xhair) then { + _layer cutRsc [QGVAR(crosshair), "PLAIN", 0, true]; + call FUNC(crosshair); + } else { + _layer cutText ["", "PLAIN"]; + }; + }; + + case (DIK_C): { + _layer = [QGVAR(compass)] call BIS_fnc_rscLayer; + if (isNull (uiNamespace getVariable QGVAR(compass))) then { + _layer cutRsc [QGVAR(compass), "PLAIN", 0, true]; + } else { + _layer cutText ["", "PLAIN"]; + }; + + _layer = [QGVAR(status)] call BIS_fnc_rscLayer; + if (isNull (uiNamespace getVariable QGVAR(status))) then { + _layer cutRsc [QGVAR(status), "PLAIN", 0, true]; + } else { + _layer cutText ["", "PLAIN"]; + }; + }; + + case (DIK_G): { + _vd = uiNamespace getVariable [QGVAR(vd), findDisplay 12201]; + if (isNull _vd) then { + createDialog QGVAR(vd); + } else { + closeDialog 0; + } + }; + + case (DIK_H): { + _layer = [QGVAR(help)] call BIS_fnc_rscLayer; + if (isNull (uiNamespace getVariable QGVAR(help))) then { + _layer cutRsc [QGVAR(help), "PLAIN", 0, true]; + } else { + _layer cutText ["", "PLAIN"]; + }; + }; + + case (DIK_M): { + _map = uiNameSpace getVariable [QGVAR(map), findDisplay 12202]; + if (isNull _map) then { + createDialog QGVAR(map); + } else { + closeDialog 0; + }; + }; + + case (DIK_N): { + GVAR(vision) = GVAR(vision) + 1; + if (GVAR(vision) > 4) then {GVAR(vision) = 0}; + switch GVAR(vision) do { + case 0: { + camUseNVG false; + false SetCamUseTi 0; + }; + case 1: { + camUseNVG true; + false SetCamUseTi 0; + }; + case 2: { + camUseNVG false; + true SetCamUseTi 0; + }; + case 3: { + camUseNVG false; + true SetCamUseTi 1; + }; + + case 4: { + camUseNVG false; + true SetCamUseTi 4; + }; + }; + }; + + case (DIK_ESCAPE): { + if !GVAR(noEscape) then { + _return = true; + _this spawn { + disableSerialization; + _display = _this select 0; + _message = ["Do you want to exit spectator?", "ACE Spectator", nil, true, _display] call BIS_fnc_guiMessage; + if (_message) then {["Exit"] call FUNC(camera)}; + }; + }; + }; + default {}; + }; + + _return + }; + + ////////////////////////////////////////// + case "KeyUp": { + GVAR(keys) set [_this select 1, false]; + }; + + ////////////////////////////////////////// + case "Camera": { + + _mode = _this select 0; + + _cam = GVAR(cam); + _camOn = GVAR(cameraOn); + _unit = GVAR(unit); + _lock = GVAR(lock) select 0; + + _findTarget = { + + _ret = []; + _screenPos = screenToWorld [0.5,0.5]; + _camPosASL = getPosASL _cam; + _camPosReal = getPos _cam; + _endPosASL = [_screenPos select 0, _screenPos select 1, getTerrainHeightASL _screenPos]; + _endPosReal = if (surfaceIsWater _endPosASL) then {_endPosASL} else {ASLtoATL _endPosASL}; + _objs = lineIntersectsWith [_camPosASL, _endPosASL, objNull, objNull, true]; + + if (count _objs > 0) then { //if vehicle/object found + _obj = _objs select (count _objs - 1); + _ret = _obj; + } else { //check for units near endpoint instead + _units = allUnits; + if (count _units > 0) then { + _nearestUnit = _units select 0; + {if (_endPosReal distance _x < _endPosReal distance _nearestUnit) then {_nearestUnit = _x}} forEach _units; + _intersect = [_nearestUnit, "FIRE"] intersect [_camPosReal, _endPosReal]; + if (count (_intersect) > 0) then { + _ret = _nearestUnit; + } else { //check for units near camera instead + _nearestUnit = _units select 0; + {if (_cam distance _x < _cam distance _nearestUnit) then {_nearestUnit = _x}} forEach _units; + _intersect = [_nearestUnit, "FIRE"] intersect [_camPosReal, _endPosReal]; + if (count _intersect > 0) then { + _ret = _nearestUnit; + } else { //if nothing else, point at ground position + _ret = _endPosReal; + }; + }; + }; + }; + _ret + }; + + switch (_mode) do { + + case "Free": { + GVAR(cameraOn) = true; + GVAR(third) = false; + detach _cam; + player switchCamera "Internal"; + _cam cameraEffect ["Internal", "Back"]; + cameraEffectEnableHUD true; + _dir = getDir _unit; + _pos = [_unit, -5, _dir] call BIS_fnc_relPos; + _pos set [2, ((getPos _unit) select 2) + 2]; + _cam setPos _pos; + GVAR(vector) set [0, _dir]; + [_cam, GVAR(vector)] call BIS_fnc_setObjectRotation; + }; + + case "First": { + if (_unit == player) exitWith {}; + GVAR(cameraOn) = false; + GVAR(third) = false; + _cam attachTo [vehicle _unit, [0,0.1,0]]; + _cam cameraEffect ["Terminate", "Back"]; + vehicle _unit switchCamera "Internal"; + }; + + case "Third": { + if (_unit == player) exitWith {}; + GVAR(third) = true; + GVAR(cameraOn) = false; + if (!difficultyEnabled "3rdPersonView") then { + player switchCamera "Internal"; + _cam cameraEffect ["Internal", "Back"]; + cameraEffectEnableHUD true; + if (vehicle _unit == _unit) then { + _cam attachTo [_unit, [0.1, -2.4, 0.6], "head"]; + } else { + _cam attachTo [vehicle _unit, [0, -7, 1.5]]; + }; + } else { + _cam attachTo [vehicle _unit, [0,0.1,0]]; + _cam cameraEffect ["Terminate", "Back"]; + vehicle _unit switchCamera "External"; + }; + }; + + case "NewUnit": { + + _increment = _this select 1; + _units = []; + { + if (alive _x) then {_units pushBack _x}; + } forEach GVAR(units); + + _count = count _units; + + if (_count > 0) then { + + _index = _units find _unit; + _index = _index + _increment; + if (_index < 0) then {_index = _count - 1}; + if (_index > (_count - 1)) then {_index = 0}; + + GVAR(unit) = _units select _index; + if (!_camOn) then {["Camera", ["SwitchUnit"]] call FUNC(camera)}; + }; + }; + + case "SwitchUnit": { + if !GVAR(third) then { + ["Camera", ["First"]] call FUNC(camera); + } else { + ["Camera", ["Third"]] call FUNC(camera); + }; + }; + + case "Lock": { + if (_lock < 0) then { + + _target = call _findTarget; + + if (typeName _target == "OBJECT") then { + GVAR(lock) = [1, _target]; + } else { + if (count _target > 0) then { + GVAR(lock) = [1, _target]; + }; + }; + + _cam camPrepareTarget (GVAR(lock) select 1); + _cam camCommitPrepared 0; + call FUNC(crosshair); + } else { + + _dir = getDir _cam; + _pitchBank = _cam call BIS_fnc_getPitchBank; + GVAR(lock) = [-1]; + _cam cameraEffect ["Terminate", "Back"]; + camDestroy _cam; + _cam = "camera" camCreate (_camPos select 0); + [_cam, _camPos select 1] call BIS_fnc_setObjectRotation; + _cam camPrepareFOV (_camPos select 2); + _cam camPrepareFocus GVAR(focus); + _cam camCommitPrepared 0; + _cam cameraEffect ["Internal", "Back"]; + cameraEffectEnableHUD true; + GVAR(cam) = _cam; + _obj = GVAR(attach); + if !(isNull _obj) then { + _modelPos = _obj worldToModel (_camPos select 0); + _cam attachTo [_obj, _modelPos]; + _dir = _dir - getDir _obj; + }; + GVAR(vector) = [_dir, _pitchBank select 0, 0]; + [_cam, GVAR(vector)] call BIS_fnc_setObjectRotation; + call FUNC(crosshair); + }; + }; + + case "Attach": { + _dir = getDir _cam; + _pitchBank = _cam call BIS_fnc_getPitchBank; + if (isNull GVAR(attach)) then { + _target = call _findTarget; + if (typeName _target == "OBJECT") then { + if (_target isKindOf "AllVehicles") then { + _dir = _dir - getDir _target; + _cam attachTo [_target]; + GVAR(attach) = _target; + call FUNC(crosshair); + }; + }; + } else { + detach _cam; + GVAR(attach) = objNull; + call FUNC(crosshair); + }; + GVAR(vector) = [_dir, _pitchBank select 0, _pitchBank select 1]; + [_cam, GVAR(vector)] call BIS_fnc_setObjectRotation; + }; + }; + + call FUNC(crosshair); + }; + + ////////////////////////////////////////// + case "Help": { + + _dialog = _this; + +_c1Action = parseText " +Camera:
+
+Move
+Pitch, Yaw
+Roll
+Slide
+Speed Multiplier
+Camera Mode
+Track Pos or Object
+Lock to Object
+Save Pos
+Recall Pos
+Optic Mode
+Focus
+Autofocus
+Disable Focus
+Pitch and Yaw
+Roll
+Pitch/Roll Reset
+Zoom
+Reset Zoom
+Pitch/Yaw/Roll/Zoom Fast
+Pitch/Yaw/Roll/Zoom Slow
+
+"; + +_c1Control = parseText " +
+
+W, A, S, D
+LMB + Mouse
+Shift + LMB + Mouse
+RMB + Mouse
+MouseWheel Up, Down
+Arrow Up, Down
+Space
+Ctrl + Space
+Ctrl + F1...F12
+F1...F12
+N
+Keyboard - and +
+Backspace
+Shift + Backspace
+Numpad 1...9
+Numpad / and *
+Numpad 5
+Numpad - and +
+Numpad Enter
+Numpad 0
+Numpad Decimal
+
+"; + +_c2Action = parseText " +Units:
+
+Cycle Unit
+Save Unit
+Recall Unit
+Unit List
+
+Display:
+
+Toggle Crosshair
+Toggle Status Bar
+View Distance Dialog
+Cycle Marker Mode
+Toggle Help
+
+"; + +_c2Control = parseText " +
+
+Arrow Left, Right
+Ctrl + 1...10
+1...10
+U
+
+
+
+X
+C
+G
+T
+H
+
+"; + +if (!isMultiplayer) then { + +_add1 = parseText " +
+Time:
+
+Faster, Slower
+Reset +
+"; + +_add2 = parseText " +
+
+
+[ and ]
+\
+
+"; + + _c2Action = composeText [_c2Action, _add1]; + _c2Control = composeText [_c2Control, _add2]; +}; + + (_dialog displayCtrl 1) ctrlSetStructuredText _c1Action; + (_dialog displayCtrl 2) ctrlSetStructuredText _c1Control; + (_dialog displayCtrl 3) ctrlSetStructuredText _c2Action; + (_dialog displayCtrl 4) ctrlSetStructuredText _c2Control; + }; + + ////////////////////////////////////////// + case "Exit": { + + if (isClass (configFile >> "CfgPatches" >> "ace_nametags")) then { + EGVAR(nametags,showPlayerNames) = GVAR(tags) select 0; + EGVAR(nametags,showNamesForAI) = GVAR(tags) select 1; + GVAR(tags) = nil; + }; + + if (isClass (configFile >> "CfgPatches" >> "ace_hearing")) then { + EGVAR(hearing,disableVolumeUpdate) = false; + }; + + if (isClass (configFile >> "CfgPatches" >> "ace_interact_menu")) then { + [QGVAR(interactCondition)] call EFUNC(common,removeCanInteractWithCondition); + }; + + GVAR(cam) cameraEffect ["terminate", "back"]; + camUseNVG false; + false SetCamUseTi 0; + camDestroy GVAR(cam); + clearRadio; + + GVAR(noEscape) = nil; + GVAR(cam) = nil; + GVAR(LMB) = nil; + GVAR(RMB) = nil; + GVAR(vector) = nil; + GVAR(fov) = nil; + GVAR(vision) = nil; + GVAR(moveScale) = nil; + GVAR(cameraOn) = nil; + GVAR(focus) = nil; + GVAR(lock) = nil; + GVAR(attach) = nil; + GVAR(unit) = nil; + GVAR(mouseBusy) = nil; + GVAR(markers) = nil; + GVAR(keys) = nil; + GVAR(accTime) = nil; + + _display = findDisplay 46; + + removeMissionEventHandler ["Draw3D", GVAR(ehDraw3D)]; + _display displayRemoveEventHandler ["keyDown", GVAR(ehKeyDown)]; + _display displayRemoveEventHandler ["keyUp", GVAR(ehKeyUp)]; + _display displayRemoveEventHandler ["mouseButtonDown", GVAR(ehMouseButtonDown)]; + _display displayRemoveEventHandler ["mouseButtonUp", GVAR(ehMouseButtonUp)]; + _display displayRemoveEventHandler ["mouseZChanged", GVAR(ehMouseZChanged)]; + _display displayRemoveEventHandler ["mouseMoving", GVAR(ehMouseMoving)]; + _display displayRemoveEventHandler ["mouseHolding", GVAR(ehMouseHolding)]; + GVAR(ehDraw3D) = nil; + GVAR(ehKeyDown) = nil; + GVAR(ehKeyUp) = nil; + GVAR(ehMouseButtonDown) = nil; + GVAR(ehMouseButtonUp) = nil; + GVAR(ehMouseZChanged) = nil; + GVAR(ehMouseMoving) = nil; + GVAR(ehMouseHolding) = nil; + + _layers = missionNamespace getVariable ["BIS_fnc_rscLayer_list", []]; + + for "_i" from 1 to (count _layers - 1) step 2 do { + (_layers select _i) cutText ["", "Plain"]; + }; + + if (!isMultiplayer) then {setAccTime 1}; + ACE_player switchCamera "Internal"; + }; +}; \ No newline at end of file diff --git a/addons/spectator/functions/fnc_cameraIntro.sqf b/addons/spectator/functions/fnc_cameraIntro.sqf new file mode 100644 index 0000000000..22bfa27d57 --- /dev/null +++ b/addons/spectator/functions/fnc_cameraIntro.sqf @@ -0,0 +1,28 @@ +/* + Author: + voiper + + Description: + Curtain, sound, and text intro when camera starts. + + Arguments: + None + + Example: + call ace_spectator_fnc_camIntro; + + Return Value: + None + + Public: + No +*/ + +#include "script_component.hpp" + +999999 cutText ["", "BLACK IN", 2]; +2 fadeSound 1; + +["Press H for spectator controls", 2] call EFUNC(common,displaytextstructured); + +[_this select 1] call CBA_fnc_removePerFrameHandler; \ No newline at end of file diff --git a/addons/spectator/functions/fnc_canSpectateUnit.sqf b/addons/spectator/functions/fnc_canSpectateUnit.sqf new file mode 100644 index 0000000000..1ce9f32d97 --- /dev/null +++ b/addons/spectator/functions/fnc_canSpectateUnit.sqf @@ -0,0 +1,30 @@ +/* + Author: + voiper + + Description: + Check if a unit is suitable to spectate. + + Arguments: + 0: Unit to check + + Example: + [unit] call ace_spectator_canSpectateUnit; + + Return Value: + Whether is suitable to spectate + + Public: + No +*/ + +#include "script_component.hpp" + +_unit = _this select 0; + +if (_unit distance GVAR(penPos) < 200) exitWith {false}; +if (_unit distance [0,0,0] < 100) exitWith {false}; +if (!GVAR(AI) && !isPlayer _unit) exitWith {false}; +if (GVAR(limitSide) && (([_unit] call FUNC(unitSide)) != GVAR(playerSide))) exitWith {false}; + +true \ No newline at end of file diff --git a/addons/spectator/functions/fnc_checkUnits.sqf b/addons/spectator/functions/fnc_checkUnits.sqf new file mode 100644 index 0000000000..5d62aeed12 --- /dev/null +++ b/addons/spectator/functions/fnc_checkUnits.sqf @@ -0,0 +1,37 @@ +/* + Author: + voiper + + Description: + Compile array of units to spectate. + + Arguments: + None. + + Example: + call ace_spectator_fnc_checkUnits; + + Return Value: + None + + Public: + No +*/ + +#include "script_component.hpp" + +_units = allUnits; +_units append allDead; +GVAR(units) = []; + +{ + _listed = _x getVariable [QGVAR(listed), false]; + if (!_listed) then { + [_x] call FUNC(unitVar); + _x addEventHandler ["Killed", {_this call FUNC(killed)}]; + _x addEventHandler ["Respawn", {_this call FUNC(respawn)}]; + _x setVariable [QGVAR(listed), true]; + }; + + if ([_x] call FUNC(canSpectateUnit)) then {GVAR(units) pushback _x}; +} forEach _units; \ No newline at end of file diff --git a/addons/spectator/functions/fnc_compass.sqf b/addons/spectator/functions/fnc_compass.sqf new file mode 100644 index 0000000000..4120cd996f --- /dev/null +++ b/addons/spectator/functions/fnc_compass.sqf @@ -0,0 +1,59 @@ +/* + Author: + voiper + + Description: + Orient and set compass. + + Arguments: + 0: Compass + + Example: + [display] call ace_spectator_fnc_compass; + + Return Value: + None + + Public: + No +*/ + +#include "script_component.hpp" + +#define RESUNITS_X safeZoneW / 100 +#define CENTRE safeZoneX + safeZoneW / 2 +#define COMPASS_W RESUNITS_X * 20 +#define COMPASS_X CENTRE - COMPASS_W / 2 +#define ARC_W COMPASS_W / 2 +#define DEGUNIT COMPASS_W / 180 + +_dialog = _this select 0; + +_Q1 = _dialog displayCtrl 1; +_Q2 = _dialog displayCtrl 2; +_Q3 = _dialog displayCtrl 3; +_Q4 = _dialog displayCtrl 4; +_qOrder = []; + +_dir = if GVAR(cameraOn) then {getDir GVAR(cam)} else {getDir GVAR(unit)}; +_angleFromCentre = _dir - floor(_dir / 90) * 90; +_leftEdgePos = _angleFromCentre * DEGUNIT; + +_positions = [ + [CENTRE - _leftEdgePos - ARC_W, safeZoneY], + [CENTRE - _leftEdgePos, safeZoneY], + [CENTRE - _leftEdgePos + ARC_W, safeZoneY], + [0, safeZoneY - 1] +]; + +_qOrder = switch (true) do { + case ((_dir >= 0) && (_dir < 90)): {[_Q4, _Q1, _Q2, _Q3]}; + case ((_dir >= 90) && (_dir < 180)): {[_Q1, _Q2, _Q3, _Q4]}; + case ((_dir >= 180) && (_dir < 270)): {[_Q2, _Q3, _Q4, _Q1]}; + case (_dir >= 270): {[_Q3, _Q4, _Q1, _Q2]}; +}; + +{ + _x ctrlSetPosition (_positions select _forEachIndex); + _x ctrlCommit 0; +} forEach _qOrder; \ No newline at end of file diff --git a/addons/spectator/functions/fnc_crosshair.sqf b/addons/spectator/functions/fnc_crosshair.sqf new file mode 100644 index 0000000000..80a12cd668 --- /dev/null +++ b/addons/spectator/functions/fnc_crosshair.sqf @@ -0,0 +1,29 @@ +/* + Author: + voiper + + Description: + Automatically set crosshair colour. + + Arguments: + None + + Example: + call ace_spectator_fnc_crosshair; + + Return Value: + None + + Public: + No +*/ + +#include "script_component.hpp" + +_xhair = uiNamespace getVariable QGVAR(crosshair); +if (!isNull _xhair) then { + _colour = if ((GVAR(lock) select 0) > -1) then {[1,0,0,0.8]} else { + if (!isNull GVAR(attach)) then {[1,1,0,0.8]} else {[1,1,1,0.8]}; + }; + (_xhair displayCtrl 0) ctrlSetTextColor _colour; +}; \ No newline at end of file diff --git a/addons/spectator/functions/fnc_draw3D.sqf b/addons/spectator/functions/fnc_draw3D.sqf new file mode 100644 index 0000000000..26eb319f73 --- /dev/null +++ b/addons/spectator/functions/fnc_draw3D.sqf @@ -0,0 +1,34 @@ +/* + Author: + voiper + + Description: + Draw3D EH for spectator. + + Arguments: + None + + Example: + call ace_spectator_fnc_draw3D; + + Return Value: + None + + Public: + No +*/ + +#include "script_component.hpp" + +_map = uiNameSpace getVariable QGVAR(map); +if (!isNull _map) exitWith {}; + +_compass = uiNamespace getVariable QGVAR(compass); +_status = uiNamespace getVariable QGVAR(status); +if (!isNull _compass) then {[_compass] call FUNC(compass)}; +if (!isNull _status) then {[_status] call FUNC(status)}; + +if (GVAR(markers) > 0) then { + call FUNC(drawMines3D); + call FUNC(drawUnits3D); +}; \ No newline at end of file diff --git a/addons/spectator/functions/fnc_drawMines2D.sqf b/addons/spectator/functions/fnc_drawMines2D.sqf new file mode 100644 index 0000000000..c77c589529 --- /dev/null +++ b/addons/spectator/functions/fnc_drawMines2D.sqf @@ -0,0 +1,43 @@ +/* + Author: + voiper + + Description: + Draw mines on spectator map. + + Arguments: + 0: Map control + 1: Zoom level + + Example: + [map, zoomlevel] call ace_spectator_fnc_drawMines2D; + + Return Value: + None + + Public: + No +*/ + +#include "script_component.hpp" + +#define SCALE 5 * safeZoneH / 100 +#define MIN 300 * SCALE +#define TEXTURE "\A3\ui_f\data\map\markers\military\triangle_CA.paa" + +_map = _this select 0; +_zoom = _this select 1; + +_size = SCALE / _zoom; +_textSize = ((1/4 * _size) max (SCALE / 2) min (SCALE / 1.5)) / 2; +_iconSize = (20 * _size) max SCALE min MIN; +_showText = (GVAR(markers) > 1); + +{ + _name = ""; + if (_showText) then { + _magName = getText (configFile >> "CfgAmmo" >> (typeOf _x) >> "defaultMagazine"); + _name = getText (configFile >> "CfgMagazines" >> _magName >> "displayName"); + }; + _map drawIcon [TEXTURE, [1,0.5,0,1], getPos _x, _iconSize, _iconSize, getDir _x, _name, 1, _textSize, "PuristaMedium"]; +} forEach allMines; \ No newline at end of file diff --git a/addons/spectator/functions/fnc_drawMines3D.sqf b/addons/spectator/functions/fnc_drawMines3D.sqf new file mode 100644 index 0000000000..7183db574f --- /dev/null +++ b/addons/spectator/functions/fnc_drawMines3D.sqf @@ -0,0 +1,55 @@ +/* + Author: + voiper + + Description: + Draw mines in 3D. + + Arguments: + None + + Example: + call ace_spectator_fnc_drawMines3D; + + Return Value: + None + + Public: + No +*/ + +#include "script_component.hpp" + +#define SCALE safeZoneH / 100 +#define TEXTMAX (1.5 * SCALE) +#define TEXTMIN 6 * SCALE +#define ICONMAX (30 * SCALE) +#define ICONMIN (120 * SCALE) +#define TEXTURE "\A3\ui_f\data\map\markers\military\triangle_CA.paa" + +_cam = GVAR(cam); +_showText = (GVAR(markers) > 1); + +{ + _pos = getPos _x; + _dist = (_cam distance _pos) + 0.1; + + if (_dist < 2000) then { + + _distScaled = SCALE / sqrt(_dist); + _iconScale = 300 * _distScaled; + //_iconSize = (20 * _size) max _scale min _min; + _iconSize = _iconScale max ICONMAX min ICONMIN; + _textSize = 0; + + if (_showText) then { + _textScale = 10 * _distScaled; + _textSize = _textScale max TEXTMAX min TEXTMIN; + }; + + _magName = getText (configFile >> "CfgAmmo" >> (typeOf _x) >> "defaultMagazine"); + _name = getText (configFile >> "CfgMagazines" >> _magName >> "displayName"); + + drawIcon3D [TEXTURE, [1,0.5,0,1], _pos, _iconSize, _iconSize, 0, _name, 1, _textSize, "PuristaMedium"]; + }; +} forEach allMines; \ No newline at end of file diff --git a/addons/spectator/functions/fnc_drawTracks2D.sqf b/addons/spectator/functions/fnc_drawTracks2D.sqf new file mode 100644 index 0000000000..32b6d58ae8 --- /dev/null +++ b/addons/spectator/functions/fnc_drawTracks2D.sqf @@ -0,0 +1,56 @@ +/* + Author: + voiper + + Description: + Draw unit tracks in spectator map. + + Arguments: + 0: Map control + 1: Zoom level + + Example: + [map, zoomlevel] call ace_spectator_fnc_drawTracks2D; + + Return Value: + None + + Public: + No +*/ + +#include "script_component.hpp" + +_map = _this select 0; +_zoom = _this select 1; + +{ + _unit = _x select 0; + + _info = [_unit] call FUNC(unitInfo); + _colour = _info select 2; + + if (_unit == GVAR(unit)) then {_colour = [1,1,0,_colour select 3]}; + + _positions = _x select 1; + _count = count _positions; + _step = floor (10 * _zoom) min 3 max 1; + _lastIndex = 0; + + if (_count > 1) then { + for "_i" from 0 to (_count - 1) step _step do {; + if (_i > 0 && _i < _count) then { + _pos1 = _positions select _i; + _pos2 = _positions select (_i - _step); + _lastIndex = _i; + _map drawLine [_pos1, _pos2, _colour]; + }; + }; + }; + + //((_count - _step + _count mod _step) max 0) + if (alive _unit) then { + _map drawLine [_positions select _lastIndex, getPosVisual _unit, _colour]; + }; + +} forEach GVAR(trackingArray); \ No newline at end of file diff --git a/addons/spectator/functions/fnc_drawUnits2D.sqf b/addons/spectator/functions/fnc_drawUnits2D.sqf new file mode 100644 index 0000000000..858b418c2f --- /dev/null +++ b/addons/spectator/functions/fnc_drawUnits2D.sqf @@ -0,0 +1,81 @@ +/* + Author: + voiper + + Description: + Draw unit icons on spectator map. + + Arguments: + 0: Map control + 1: Zoom level + + Example: + [map, zoomlevel] call ace_spectator_fnc_drawUnits2D; + + Return Value: + None + + Public: + No +*/ + +#include "script_component.hpp" + +#define SCALE 5 * safeZoneH / 100 +#define MIN 300 * SCALE + +_map = _this select 0; +_zoom = _this select 1; + +_topIcon = []; + +_size = SCALE / _zoom; +_showText = (GVAR(markers) > 1); +_textSize = (0.25 * _size) max (SCALE / 2) min (SCALE / 1.5); + +{ + _unit = _x; + _isTarget = (_unit == GVAR(unit)); + + if (true) then { + + _veh = vehicle _unit; + _inVeh = (_veh != _unit); + if (!_isTarget && _inVeh && !(_unit == ((crew _veh) select 0))) exitWith {}; + if (!_isTarget && _inVeh && (GVAR(unit) in (crew _veh))) exitWith {}; + + _obj = if (_inVeh) then {_veh} else {_unit}; + _pos = getPosVisual _obj; + _dir = getDir _obj; + + _info = [_unit] call FUNC(unitInfo); + _name = _info select 0; + _colour = _info select 2; + + _icon = getText (configFile >> "CfgVehicles" >> (typeOf _veh) >> "Icon"); + _iconSize = 0; + _iconText = ""; + + if (_inVeh) then { + _iconSize = (50 * _size) max SCALE min (MIN * 2); + if (_showText) then { + _iconText = "[" + (getText (configFile >> "CfgVehicles" >> (typeOf _veh) >> "displayName")) + "] " + _name; + }; + } else { + _iconSize = (50 * _size) max SCALE min MIN; + if (_showText) then { + _iconText = _name; + }; + }; + + if (_isTarget) exitWith { + _topIcon = [_icon, [1,1,0,1], _pos, _iconSize, _iconSize, _dir, _iconText, 1, _textSize, "PuristaBold", "RIGHT"]; + }; + + _map drawIcon [_icon, _colour, _pos, _iconSize, _iconSize, _dir, _iconText, 1, _textSize, "PuristaMedium", "RIGHT"] + }; +} forEach GVAR(units); + +if (count _topIcon > 0) then { + _map drawIcon _topIcon; +}; \ No newline at end of file diff --git a/addons/spectator/functions/fnc_drawUnits3D.sqf b/addons/spectator/functions/fnc_drawUnits3D.sqf new file mode 100644 index 0000000000..709e7d8fff --- /dev/null +++ b/addons/spectator/functions/fnc_drawUnits3D.sqf @@ -0,0 +1,97 @@ +/* + Author: + voiper + + Description: + Draw unit icons in 3D. + + Arguments: + None + + Example: + call ace_spectator_fnc_drawUnits3D; + + Return Value: + None + + Public: + No +*/ + +#include "script_component.hpp" + +#define SCALE safeZoneH / 100 +#define TEXTMAX (1.5 * SCALE) +#define TEXTMIN 6 * SCALE +#define ICONMAX (30 * SCALE) +#define ICONMIN (120 * SCALE) + +_cam = GVAR(cam); +_showText = (GVAR(markers) > 1); +_topIcon = []; + +{ + _unit = _x; + + if (true) then { + _veh = vehicle _unit; + _inVeh = (_veh != _unit); + _cmdr = if (_inVeh && (_unit == ((crew _veh) select 0))) then {true} else {false}; + + _obj = if (_inVeh && _cmdr) then {_veh} else {_unit}; + _pos = if (surfaceIsWater getPos _obj) then {getPosASLVisual _obj} else {getPosATLVisual _obj}; + _dist = (_cam distance _pos) + 0.1; + + _isTarget = (_unit == GVAR(unit)); + + //exit if too far + if (_dist > 2000 && !_isTarget) exitWith {}; + + //exit if target not on screen + if ((count (worldToScreen _pos) < 1) && !_isTarget) exitWith {}; + + _info = [_unit] call FUNC(unitInfo); + _name = _info select 0; + _colour = _info select 2; + + _pos set [2, (_pos select 2) + 3]; + _distScaled = SCALE / sqrt(_dist); + + _icon = ""; + _iconScale = 300 * _distScaled; + _iconSize = _iconScale max ICONMAX min ICONMIN; + + _text = if (_showText) then {_name} else {""}; + _textScale = 10 * _distScaled; + _textSize = _textScale max TEXTMAX min TEXTMIN; + + if (_inVeh) then { + if (_cmdr) then { + _icon = getText (configFile >> "CfgVehicles" >> (typeOf _veh) >> "Icon"); + _text = if (_showText) then { + "[" + (getText (configFile >> "CfgVehicles" >> (typeOf _veh) >> "displayName")) + "] " + _text + } else {""}; + _pos set [2, (_pos select 2) + 3]; + } else { + _iconSize = 0; + _textSize = if (_dist < 25) then {_textSize / 1.5} else {0}; + }; + } else { + _icon = getText (configFile >> "CfgVehicles" >> (typeOf _unit) >> "Icon"); + }; + + if (GVAR(markers) > 2) then { + _text = _text + " [" + str ceil(_dist) + "]"; + }; + + if (_isTarget) exitWith { + _topIcon = [_icon, [1,1,0,1], _pos, _iconSize, _iconSize, 0, _text, 2, _textSize, "PuristaBold", "CENTER", true]; + }; + + drawIcon3D [_icon, _colour, _pos, _iconSize, _iconSize, 0, _text, 2, _textSize, "PuristaMedium"]; + }; +} forEach GVAR(units); + +if ((count _topIcon > 0) && GVAR(cameraOn)) then { + drawIcon3D _topIcon; +}; \ No newline at end of file diff --git a/addons/spectator/functions/fnc_killed.sqf b/addons/spectator/functions/fnc_killed.sqf new file mode 100644 index 0000000000..4774476be4 --- /dev/null +++ b/addons/spectator/functions/fnc_killed.sqf @@ -0,0 +1,65 @@ +/* + Author: + voiper + + Description: + Killed EH for remote units. + + Arguments: + 0: Unit + 1: Killer + + Example: + [unit, killer] call ace_spectator_fnc_killed; + + Return Value: + None + + Public: + No +*/ + +#include "script_component.hpp" + +_unit = _this select 0; +_killer = _this select 1; + +if (isNil "_unit") exitWith {}; +if (isNil QGVAR(cam)) exitWith {}; +if (isNull _unit) exitWith {}; + +if (!isNull _killer) then { + if (GVAR(markers) > 2 && !difficultyEnabled "deathMessages") then { + _nameUnit = name _unit; + _nameKiller = name _killer; + + _text = if (_killer == _unit) then { + format ["%1 died", _nameUnit] + } else { + format ["%2 killed by %1", _nameUnit, _nameKiller] + }; + systemChat _text; + }; +}; + +if (_unit == GVAR(unit) && !GVAR(cameraOn)) then { + ["Camera", ["Free"]] call FUNC(camera); + GVAR(unit) = objNull; +}; + +_savedUnit = GVAR(savedUnits) find _unit; +if (_savedUnit > -1) then { + GVAR(savedUnits) set [_savedUnit, objNull]; +}; + +if (!isNil QGVAR(trackingArray)) then { + _pos = getPos _unit; + _pos resize 2; + _index = -1; + {if ((_x select 0) == _unit) then {_index = _forEachIndex}} forEach GVAR(trackingArray); + _unitArray = GVAR(trackingArray) select _index; + _tracks = _unitArray select 1; + _tracks pushBack _pos; + _unitArray set [1, _tracks]; + GVAR(trackingArray) set [_index, _unitArray]; +}; \ No newline at end of file diff --git a/addons/spectator/functions/fnc_map.sqf b/addons/spectator/functions/fnc_map.sqf new file mode 100644 index 0000000000..b58fa8ce2b --- /dev/null +++ b/addons/spectator/functions/fnc_map.sqf @@ -0,0 +1,156 @@ +/* + Author: + voiper + + Description: + Manage spectator map. + + Arguments: + 0: Mode + 1: Elements (depending on situation) + + Example: + ["Init", [map]] call ace_spectator_fnc_map; + + Return Value: + None + + Public: + No +*/ + +#include "script_component.hpp" +#include "\a3\editor_f\Data\Scripts\dikCodes.h" + +_mode = _this select 0; +_this = _this select 1; + +switch _mode do { + + case "Init": { + _map = _this displayCtrl 1; + + if (isNil QGVAR(mapPos)) then { + GVAR(mapPos) = [(GVAR(penPos) select 0) / 4, (GVAR(penPos) select 1) / 4]; + }; + + if (isNil QGVAR(mapZoom)) then { + GVAR(mapZoom) = 0.75; + }; + + _map ctrlMapAnimAdd [0, GVAR(mapZoom), GVAR(mapPos)]; + ctrlMapAnimCommit _map; + setMousePosition [0.5, 0.5]; + + _map ctrlAddEventHandler ["Draw", {['Draw', _this] call FUNC(map)}]; + _map ctrlAddEventHandler ["MouseButtonDblClick", {['Click', _this] call FUNC(map)}]; + }; + + case "Close": { + _map = _this displayCtrl 1; + GVAR(mapPos) = _map ctrlMapScreenToWorld [0.5,0.5]; + GVAR(mapZoom) = ctrlMapScale _map; + }; + + case "Draw": { + _map = _this select 0; + _zoom = ctrlMapScale _map; + + if (GVAR(markers) > 0) then { + if ((GVAR(markers) > 2) && GVAR(tracking)) then { + [_map, _zoom] call FUNC(drawTracks2D); + }; + [_map, _zoom] call FUNC(drawMines2D); + [_map, _zoom] call FUNC(drawUnits2D); + }; + + if (GVAR(cameraOn)) then { + _scale = 5 * safeZoneH / 100; + _map drawIcon ["\A3\ui_f\data\gui\Rsc\RscDisplayMissionEditor\iconcamera_ca.paa", [1,1,1,1], getPos GVAR(cam), 500 * _scale, 500 * _scale, getDir GVAR(cam), "", 0, 0, "PuristaMedium"]; + }; + }; + + case "Click": { + _map = _this select 0; + _button = _this select 1; + _shift = _this select 4; + _mapPos = _map ctrlMapScreenToWorld [_this select 2, _this select 3]; + + if (_shift) then { + if (GVAR(cameraOn)) then { + _dir = [getPos GVAR(cam), _mapPos] call BIS_fnc_dirTo; + GVAR(vector) set [0, _dir]; + [GVAR(cam), GVAR(vector)] call BIS_fnc_setObjectRotation; + }; + } else { + + _newUnit = objNull; + + _scale = ctrlMapScale _map; + _radius = _scale * 250; + _units = []; + + //find units near spot, ignoring height (necessary since nearestObjects takes height into account) + { + if (alive _x) then { + _pos = getPos _x; + _pos set [2, 0]; + if (_pos distance _mapPos <= _radius) then { + _units pushBack _x; + }; + }; + } forEach GVAR(units); + + //find closest unit to spot + if (count _units > 0) then { + _nearest = 0; + for "_i" from 1 to (count _units - 1) do { + if (((_units select _i) distance _mapPos) < ((_units select _nearest) distance _mapPos)) then { + _nearest = _i; + }; + }; + _newUnit = _units select _nearest; + }; + + if (!isNull _newUnit) then { + + if (vehicle _newUnit != _newUnit) then { + _crew = crew (vehicle _newUnit); + _newUnit = _crew select 0; + }; + + GVAR(unit) = _newUnit; + if (GVAR(cameraOn)) then { + ["Camera", ["Third"]] call FUNC(camera); + } else { + if (GVAR(third)) then { + ["Camera", ["Third"]] call FUNC(camera); + } else { + ["Camera", ["First"]] call FUNC(camera); + }; + }; + } else { + + if (!GVAR(cameraOn)) then { + ["Camera", ["Free"]] call FUNC(camera); + }; + _mapPos set [2, 10]; + GVAR(cam) setPosATL _mapPos; + }; + }; + }; + + case "KeyDown": { + _key = _this select 1; + _shift = _this select 2; + _ctrl = _this select 3; + _alt = _this select 4; + _return = false; + + switch (_key) do { + case (DIK_DELETE): {_return = true}; + }; + + _return + }; +}; \ No newline at end of file diff --git a/addons/spectator/functions/fnc_moduleSpectator.sqf b/addons/spectator/functions/fnc_moduleSpectator.sqf new file mode 100644 index 0000000000..a371327b23 --- /dev/null +++ b/addons/spectator/functions/fnc_moduleSpectator.sqf @@ -0,0 +1,28 @@ +/* + * Author: esteldunedain + * Initializes the addon module. + * + * Arguments: + * Whatever the module provides. + * + * Return Value: + * None + */ + +#include "script_component.hpp" + +PARAMS_3(_logic,_units,_activated); + +if !(_activated) exitWith {}; + +[_logic, QGVAR(enabled), "SpectatorEnabled"] call EFUNC(common,readSettingFromModule); +[_logic, QGVAR(limitSide), "SpectatorPlayerSide"] call EFUNC(common,readSettingFromModule); +[_logic, QGVAR(AI), "SpectatorAI"] call EFUNC(common,readSettingFromModule); +[_logic, QGVAR(tracking), "SpectatorTracking"] call EFUNC(common,readSettingFromModule); +[_logic, QGVAR(modulePos), "SpectatorPos"] call EFUNC(common,readSettingFromModule); +[_logic, QGVAR(endMission), "SpectatorEnd"] call EFUNC(common,readSettingFromModule); + +if GVAR(modulePos) then { + GVAR(startingPos) = getPosATL _logic; + GVAR(startingDir) = getDir _logic; +}; \ No newline at end of file diff --git a/addons/spectator/functions/fnc_overlay.sqf b/addons/spectator/functions/fnc_overlay.sqf new file mode 100644 index 0000000000..d998b9a3b2 --- /dev/null +++ b/addons/spectator/functions/fnc_overlay.sqf @@ -0,0 +1,106 @@ +/* + Author: + voiper + + Description: + Spectator unit list. + + Arguments: + 0: Specific function to use + 1: Function params + + Example: + ["Init", [display]] call ace_spectator_fnc_overlay; + + Return Value: + None + + Public: + No +*/ + +#include "script_component.hpp" + +_mode = _this select 0; +_this = _this select 1; + +switch _mode do { + + case "Init": { + + _display = _this select 0; + _ctrl = _display displayCtrl 0; + _count = _ctrl tvCount []; + for "_i" from 0 to _count do { + _ctrl tvDelete [_x]; + }; + + _ctrl tvAdd [[], "Blufor"]; + _ctrl tvAdd [[], "Opfor"]; + _ctrl tvAdd [[], "Independent"]; + _ctrl tvAdd [[], "Civilian"]; + + _unitList = []; + + { + _units = units _x; + private ["_groupNum"]; + { + if ((GVAR(units) find _x > -1) && alive _x) then { + _info = [_x] call FUNC(unitInfo); + _text = _info select 0; + _team = _info select 1; + _side = switch (_team) do { + case BLUFOR: {0}; + case OPFOR: {1}; + case INDEPENDENT: {2}; + case CIVILIAN: {3}; + }; + + _icon = getText (configFile >> "CfgVehicles" >> (typeOf _x) >> "Icon"); + _picture = "\a3\ui_f\data\map\VehicleIcons\" + _icon + "_ca.paa"; + _treeIndex = []; + _unitList pushBack _x; + + _savedUnit = GVAR(savedUnits) find _x; + if (_savedUnit > -1) then {_text = _text + " (#" + str (_savedUnit + 1) + ")"}; + + if (_forEachIndex == 0) then { + _groupNum = _ctrl tvAdd [[_side], _text]; + _treeIndex = [_side, _groupNum]; + } else { + _num = _ctrl tvAdd [[_side, _groupNum], _text]; + _treeIndex = [_side, _groupNum, _num]; + }; + + _ctrl tvSetPicture [_treeIndex, _picture]; + _ctrl tvSetData [_treeIndex, [_x] call FUNC(unitVar)]; + _unitList pushBack _treeIndex; + }; + } forEach _units; + } forEach allGroups; + + if (!isNull GVAR(unit)) then { + if (alive GVAR(unit)) then { + _treeIndex = _unitList select ((_unitList find GVAR(unit)) + 1); + _ctrl tvSetCurSel _treeIndex; + }; + }; + }; + + case "Select": { + + _ctrl = _this select 0; + _selection = _this select 1; + if (count _selection < 2) exitWith {}; + + _str = _ctrl tvData _selection; + _unit = missionNamespace getVariable _str; + GVAR(unit) = _unit; + if (GVAR(cameraOn)) then { + ["Camera", ["Third"]] call FUNC(camera); + } else { + ["Camera", ["SwitchUnit"]] call FUNC(camera); + }; + }; +}; \ No newline at end of file diff --git a/addons/spectator/functions/fnc_penPos.sqf b/addons/spectator/functions/fnc_penPos.sqf new file mode 100644 index 0000000000..a176d3e811 --- /dev/null +++ b/addons/spectator/functions/fnc_penPos.sqf @@ -0,0 +1,33 @@ +/* + Author: + voiper + + Description: + Determine spec pen position. + + Arguments: + None + + Example: + call ace_spectator_fnc_penPos; + + Return Value: + None + + Public: + No +*/ + +#include "script_component.hpp" + +_mapSize = (configFile >> "CfgWorlds" >> worldName >> "mapSize"); +_worldEdge = if (isNumber _mapSize) then {getNumber _mapSize} else {32768}; +_pos = [_worldEdge * 2, _worldEdge * 2]; + +if (surfaceisWater _pos) then { + _pos set [2, -1.4]; + GVAR(penPos) = ASLtoATL _pos; +} else { + _pos set [2, 0]; + GVAR(penPos) = _pos; +}; \ No newline at end of file diff --git a/addons/spectator/functions/fnc_respawn.sqf b/addons/spectator/functions/fnc_respawn.sqf new file mode 100644 index 0000000000..dba2f6a850 --- /dev/null +++ b/addons/spectator/functions/fnc_respawn.sqf @@ -0,0 +1,25 @@ +/* + Author: + voiper + + Description: + Respawn EH for remote clients. + + Arguments: + 0: Unit + + Example: + ["Init", [false]] call ace_spectator_fnc_camera; + + Return Value: + None + + Public: + No +*/ + +#include "script_component.hpp" + +_unit = _this select 0; +_unit setVariable [QGVAR(name), name _unit, true]; +//_unit setVariable [QGVAR(listed), false]; \ No newline at end of file diff --git a/addons/spectator/functions/fnc_sideColour.sqf b/addons/spectator/functions/fnc_sideColour.sqf new file mode 100644 index 0000000000..1262ae5b07 --- /dev/null +++ b/addons/spectator/functions/fnc_sideColour.sqf @@ -0,0 +1,66 @@ +/* + Author: + voiper + + Description: + Determine side colour for spectator GUI. + + Arguments: + 0: Side + + Example: + [0 call ace_spectator_fnc_sideColour; + + Return Value: + Colour + + Public: + No +*/ + +#include "script_component.hpp" +#define FACTOR 1.3 +#define GETCOLOUR(a,b) (profileNameSpace getVariable [QUOTE(a), b]) + +PARAMS_1(_side); + +_colour = switch _side do { + case BLUFOR: { + [ + GETCOLOUR('Map_BLUFOR_R', 0), + GETCOLOUR('Map_BLUFOR_G', 0.3), + GETCOLOUR('Map_BLUFOR_B', 0.6) + ] + }; + + case OPFOR: { + [ + GETCOLOUR('Map_OPFOR_R', 0.5), + GETCOLOUR('Map_OPFOR_G', 0), + GETCOLOUR('Map_OPFOR_B', 0) + ] + }; + + case INDEPENDENT: { + [ + GETCOLOUR('Map_Independent_R', 0), + GETCOLOUR('Map_Independent_G', 0.5), + GETCOLOUR('Map_Independent_B', 0) + ] + }; + + case CIVILIAN: { + [ + GETCOLOUR('Map_Civilian_R', 0.4), + GETCOLOUR('Map_Civilian_G', 0), + GETCOLOUR('Map_Civilian_B', 0.5) + ] + }; +}; + +_colour set [0, (_colour select 0) * FACTOR]; +_colour set [1, (_colour select 1) * FACTOR]; +_colour set [2, (_colour select 2) * FACTOR]; +_colour set [3, 1]; + +_colour \ No newline at end of file diff --git a/addons/spectator/functions/fnc_status.sqf b/addons/spectator/functions/fnc_status.sqf new file mode 100644 index 0000000000..4207ef9c00 --- /dev/null +++ b/addons/spectator/functions/fnc_status.sqf @@ -0,0 +1,60 @@ +/* + Author: + voiper + + Description: + Render status. + + Arguments: + 0: Status element + + Example: + [display] call ace_spectator_fnc_status; + + Return Value: + None + + Public: + No +*/ + +#include "script_component.hpp" + +_display = _this select 0; + +_speedText = (str ([GVAR(moveScale), 4] call BIS_fnc_cutDecimals)) + "v"; +(_display displayCtrl 0) ctrlSetText _speedText; + +_name = ""; +_colour = [1,1,1,1]; + +if (!isNull GVAR(unit)) then { + _info = [GVAR(unit)] call FUNC(unitInfo); + _name = _info select 0; + _side = _info select 1; + _colour = _info select 2; + _colour set [3, 1]; +}; +(_display displayCtrl 1) ctrlSetText _name; +(_display displayCtrl 1) ctrlSetTextColor _colour; + +_mode = if (GVAR(cameraOn)) then { + if (isNull GVAR(attach)) then {"FREE"} else {"ATTACH"}; +} else { + if (GVAR(third)) then {"THIRD"} else {"FIRST"}; +}; +(_display displayCtrl 2) ctrlSetText _mode; + +_timeText = [dayTime] call BIS_fnc_timeToString; +(_display displayCtrl 3) ctrlSetText _timeText; + +_fovText = (str ([GVAR(fov), 3] call BIS_fnc_cutDecimals)) + "a"; +(_display displayCtrl 4) ctrlSetText _fovText; + +_timeAccText = (str ([GVAR(accTime), 4] call BIS_fnc_cutDecimals)) + "x"; +(_display displayCtrl 5) ctrlSetText _timeAccText; + +_focusDist = [GVAR(focus) select 0, 1] call BIS_fnc_cutDecimals; +_focusBlur = GVAR(focus) select 1; +_focusText = if (_focusDist == -1 && _focusBlur == 1) then {"Auto"} else {if (_focusDist < 0) then {toString [8734]} else {str _focusDist + "m"}}; +(_display displayCtrl 6) ctrlSetText _focusText; \ No newline at end of file diff --git a/addons/spectator/functions/fnc_trackUnits.sqf b/addons/spectator/functions/fnc_trackUnits.sqf new file mode 100644 index 0000000000..28da75a554 --- /dev/null +++ b/addons/spectator/functions/fnc_trackUnits.sqf @@ -0,0 +1,54 @@ +/* + Author: + voiper + + Description: + Check and record tracking for all units. + + Arguments: + None + + Example: + call ace_spectator_fnc_trackUnits; + + Return Value: + None + + Public: + No +*/ + +#include "script_component.hpp" + +if (isNil QGVAR(trackingArray)) then { + GVAR(trackingArray) = []; +}; + +if (count GVAR(units) < 1) exitWith {}; + +{ + _unit = _x; + _pos = getPos _unit; + _pos resize 2; + + _index = -1; + + {if ((_x select 0) == _unit) then {_index = _forEachIndex}} forEach GVAR(trackingArray); + if (_index == -1) then { + GVAR(trackingArray) pushBack [_unit, [_pos]] + } else { + _unitArray = GVAR(trackingArray) select _index; + _trackingArray = _unitArray select 1; + _latestIndex = (count _trackingArray) - 1; + _latestPos = _trackingArray select _latestIndex; + _diffX = abs((_latestPos select 0) - (_pos select 0)); + _diffY = abs((_latestPos select 1) - (_pos select 1)); + + if !((_diffX < 20) && (_diffY < 20)) then { + _trackingArray pushBack _pos; + _unitArray set [1, _trackingArray]; + GVAR(trackingArray) set [_index, _unitArray]; + }; + }; + +} forEach GVAR(units); \ No newline at end of file diff --git a/addons/spectator/functions/fnc_unitInfo.sqf b/addons/spectator/functions/fnc_unitInfo.sqf new file mode 100644 index 0000000000..a377cabf31 --- /dev/null +++ b/addons/spectator/functions/fnc_unitInfo.sqf @@ -0,0 +1,34 @@ +/* + Author: + voiper + + Description: + Retrieve unit name, side, and colour. + + Arguments: + 0: Unit + + Example: + [player] call ace_spectator_fnc_unitInfo; + + Return Value: + Name , Side , Colour + + Public: + No +*/ + +#include "script_component.hpp" + +PARAMS_1(_unit); + +_name = [_unit] call EFUNC(common,getName); +_side = [_unit] call FUNC(unitSide); +_colour = [_side] call FUNC(sideColour); + +if (!alive _unit) then { + {_colour set [_forEachIndex, _x / 2.5]} forEach _colour; + _colour set [3, 0.8]; +}; + +[_name, _side, _colour] \ No newline at end of file diff --git a/addons/spectator/functions/fnc_unitSide.sqf b/addons/spectator/functions/fnc_unitSide.sqf new file mode 100644 index 0000000000..d33520d5ec --- /dev/null +++ b/addons/spectator/functions/fnc_unitSide.sqf @@ -0,0 +1,39 @@ +/* + Author: + voiper + + Description: + Retrieve unit's side, even after they join grpNull. + + Arguments: + 0: Unit to check + + Example: + [unit] call ace_spectator_unitSide; + + Return Value: + Side + + Public: + No +*/ + +#include "script_component.hpp" + +PARAMS_1(_unit); + +private ["_side"]; + +if (alive _unit) then { + _side = side (group _unit); +} else { + _sideNum = getNumber (configFile >> "CfgVehicles" >> (typeOf _unit) >> "side"); + _side = switch _sideNum do { + case 0: {OPFOR}; + case 1: {BLUFOR}; + case 2: {INDEPENDENT}; + case 3: {CIVILIAN}; + }; +}; + +_side \ No newline at end of file diff --git a/addons/spectator/functions/fnc_unitVar.sqf b/addons/spectator/functions/fnc_unitVar.sqf new file mode 100644 index 0000000000..6d072ae171 --- /dev/null +++ b/addons/spectator/functions/fnc_unitVar.sqf @@ -0,0 +1,38 @@ +/* + Author: Karel Moricky, modified by voiper + + Description: + Set or return an unique object variable (client only). + + Arguments: + 0: Unit + + Returns: + Variable +*/ + +#include "script_component.hpp" + +private ["_object","_var"]; + +_object = [_this, 0, objnull, [objnull]] call BIS_fnc_param; + +if (isNull _object) exitwith {""}; + +_var = _object getVariable [QGVAR(objectVar), ""]; + +if (_var == "") then { + _var = vehicleVarname _object; + + if (_var == "") then { + _var = [_this, 1, QGVAR(obj), [""]] call BIS_fnc_param; + _varID = [_var, 1] call BIS_fnc_counter; + _var = _var + str _varID; + }; + + _object setVariable [QGVAR(objectVar), _var]; + missionNamespace setVariable [_var, _object]; + _object setVehicleVarname _var; +}; + +_var \ No newline at end of file diff --git a/addons/spectator/functions/fnc_viewDistance.sqf b/addons/spectator/functions/fnc_viewDistance.sqf new file mode 100644 index 0000000000..4112ed2a62 --- /dev/null +++ b/addons/spectator/functions/fnc_viewDistance.sqf @@ -0,0 +1,47 @@ +/* + Author: + voiper + + Description: + View distance dialog. + + Arguments: + 0: Mode + 1: Arguemnts + + Example: + ["Init", [dialog]] call ace_spectator_fnc_viewDistance; + + Return Value: + None + + Public: + No +*/ + +#include "script_component.hpp" + +_mode = _this select 0; +_this = _this select 1; + +switch _mode do { + + case "Init": { + _dialog = _this select 0; + _dist = -1; + _text = _dialog displayCtrl 1; + _slider = _dialog displayCtrl 2; + _slider slidersetRange [1000,20000]; + _slider sliderSetSpeed [1000,1000,1000]; + _slider sliderSetPosition viewDistance; + _text ctrlSetText str viewDistance; + }; + + case "Slider": { + _dialog = ctrlParent (_this select 0); + _dist = _this select 1; + _text = _dialog displayCtrl 1; + setViewDistance _dist; + _text ctrlSetText str viewDistance; + }; +}; \ No newline at end of file diff --git a/addons/spectator/functions/script_component.hpp b/addons/spectator/functions/script_component.hpp new file mode 100644 index 0000000000..d5034cb39c --- /dev/null +++ b/addons/spectator/functions/script_component.hpp @@ -0,0 +1 @@ +#include "\z\ace\addons\spectator\script_component.hpp" \ No newline at end of file diff --git a/addons/spectator/rsc_defines.hpp b/addons/spectator/rsc_defines.hpp new file mode 100644 index 0000000000..e7cb7178c3 --- /dev/null +++ b/addons/spectator/rsc_defines.hpp @@ -0,0 +1,646 @@ +// Control types +#define CT_STATIC 0 +#define CT_BUTTON 1 +#define CT_EDIT 2 +#define CT_SLIDER 3 +#define CT_COMBO 4 +#define CT_LISTBOX 5 +#define CT_TOOLBOX 6 +#define CT_CHECKBOXES 7 +#define CT_PROGRESS 8 +#define CT_HTML 9 +#define CT_STATIC_SKEW 10 +#define CT_ACTIVETEXT 11 +#define CT_TREE 12 +#define CT_STRUCTURED_TEXT 13 +#define CT_CONTEXT_MENU 14 +#define CT_CONTROLS_GROUP 15 +#define CT_SHORTCUTBUTTON 16 +#define CT_HITZONES 17 +#define CT_XKEYDESC 40 +#define CT_XBUTTON 41 +#define CT_XLISTBOX 42 +#define CT_XSLIDER 43 +#define CT_XCOMBO 44 +#define CT_ANIMATED_TEXTURE 45 +#define CT_OBJECT 80 +#define CT_OBJECT_ZOOM 81 +#define CT_OBJECT_CONTAINER 82 +#define CT_OBJECT_CONT_ANIM 83 +#define CT_LINEBREAK 98 +#define CT_USER 99 +#define CT_MAP 100 +#define CT_MAP_MAIN 101 +#define CT_LISTNBOX 102 +#define CT_ITEMSLOT 103 +#define CT_CHECKBOX 77 + +// Static styles +#define ST_POS 0x0F +#define ST_HPOS 0x03 +#define ST_VPOS 0x0C +#define ST_LEFT 0x00 +#define ST_RIGHT 0x01 +#define ST_CENTER 0x02 +#define ST_DOWN 0x04 +#define ST_UP 0x08 +#define ST_VCENTER 0x0C + +#define ST_TYPE 0xF0 +#define ST_SINGLE 0x00 +#define ST_MULTI 0x10 +#define ST_TITLE_BAR 0x20 +#define ST_PICTURE 0x30 +#define ST_FRAME 0x40 +#define ST_BACKGROUND 0x50 +#define ST_GROUP_BOX 0x60 +#define ST_GROUP_BOX2 0x70 +#define ST_HUD_BACKGROUND 0x80 +#define ST_TILE_PICTURE 0x90 +#define ST_WITH_RECT 0xA0 +#define ST_LINE 0xB0 +#define ST_UPPERCASE 0xC0 +#define ST_LOWERCASE 0xD0 + +#define ST_SHADOW 0x100 +#define ST_NO_RECT 0x200 +#define ST_KEEP_ASPECT_RATIO 0x800 + +#define ST_TITLE ST_TITLE_BAR + ST_CENTER + +// Slider styles +#define SL_DIR 0x400 +#define SL_VERT 0 +#define SL_HORZ 0x400 + +#define SL_TEXTURES 0x10 + +// progress bar +#define ST_VERTICAL 0x01 +#define ST_HORIZONTAL 0 + +// Listbox styles +#define LB_TEXTURES 0x10 +#define LB_MULTI 0x20 + +// Tree styles +#define TR_SHOWROOT 1 +#define TR_AUTOCOLLAPSE 2 + +// MessageBox styles +#define MB_BUTTON_OK 1 +#define MB_BUTTON_CANCEL 2 +#define MB_BUTTON_USER 4 +#define MB_ERROR_DIALOG 8 + +// Fonts +#define GUI_FONT_NORMAL PuristaMedium +#define GUI_FONT_BOLD PuristaSemibold +#define GUI_FONT_THIN PuristaLight +#define GUI_FONT_MONO EtelkaMonospacePro +#define GUI_FONT_NARROW EtelkaNarrowMediumPro +#define GUI_FONT_CODE LucidaConsoleB +#define GUI_FONT_SYSTEM TahomaB + +//colours + +#define COLOUR_GUI_TEXT {"profilenamespace getvariable ['GUI_TITLETEXT_RGB_R',1]", "profilenamespace getvariable ['GUI_TITLETEXT_RGB_G',1]", "profilenamespace getvariable ['GUI_TITLETEXT_RGB_B',1]", "profilenamespace getvariable ['GUI_TITLETEXT_RGB_A',1]"} + +#define COLOUR_GUI_BG {"profilenamespace getvariable ['GUI_BCG_RGB_R',0.8]", "profilenamespace getvariable ['GUI_BCG_RGB_G',0.8]","profilenamespace getvariable ['GUI_BCG_RGB_B',0.8]","profilenamespace getvariable ['GUI_BCG_RGB_A',0.8]"} + +#define COLOUR_IGUI_TEXT {"profilenamespace getvariable ['IGUI_TEXT_RGB_R',1]", "profilenamespace getvariable ['IGUI_TEXT_RGB_G',1]", "profilenamespace getvariable ['IGUI_TEXT_RGB_B',1]", "profilenamespace getvariable ['IGUI_TEXT_RGB_A',1]"} + +#define COLOUR_IGUI_BG {"profilenamespace getvariable ['IGUI_BCG_RGB_R',0.8]", "profilenamespace getvariable ['IGUI_BCG_RGB_G',0.5]","profilenamespace getvariable ['IGUI_BCG_RGB_B',0]","profilenamespace getvariable ['IGUI_BCG_RGB_A',0.8]"} + +#define COLOUR_IGUI_WARN {"profilenamespace getvariable ['IGUI_TEXT_WARNING_R',0.8]", "profilenamespace getvariable ['IGUI_TEXT_WARNING_G',0.5]", "profilenamespace getvariable ['IGUI_TEXT_WARNING_B',0]", "profilenamespace getvariable ['IGUI_TEXT_WARNING_A',0.8]"} + +// Grids +#define GUI_GRID_CENTER_WAbs ((safezoneW / safezoneH) min 1.2) +#define GUI_GRID_CENTER_HAbs (GUI_GRID_CENTER_WAbs / 1.2) +#define GUI_GRID_CENTER_W (GUI_GRID_CENTER_WAbs / 40) +#define GUI_GRID_CENTER_H (GUI_GRID_CENTER_HAbs / 25) +#define GUI_GRID_CENTER_X (safezoneX + (safezoneW - GUI_GRID_CENTER_WAbs)/2) +#define GUI_GRID_CENTER_Y (safezoneY + (safezoneH - GUI_GRID_CENTER_HAbs)/2) + +#define RESUNITS_X (safeZoneW / 100) +#define RESUNITS_Y (safeZoneH / 100) +#define RESCENTRE_X safeZoneX + safeZoneW / 2 +#define RESCENTRE_Y safeZoneY + safeZoneH / 2 + +#define Q(s) #s + +class vip_rsc_picture { + + access = 0; + idc = -1; + type = CT_STATIC; + style = ST_PICTURE; + colorBackground[] = {0,0,0,0}; + colorText[] = {1,1,1,1}; + font = "TahomaB"; + sizeEx = 0; + lineSpacing = 0; + text = ""; + fixedWidth = 0; + shadow = 0; +}; + +class vip_rsc_text { + + access = 0; + idc = -1; + type = CT_STATIC; + style = ST_LEFT; + colorBackground[] = {0,0,0,0}; + colorText[] = {1,1,1,1}; + font = "PuristaMedium"; + sizeEx = 0.08; + lineSpacing = 1; + text = ""; + fixedWidth = 0; + moving = 0; +}; + +class vip_rsc_box { + + idc=-1; + type = CT_STATIC; + style = ST_CENTER; + text = ""; + font = "TahomaB"; + sizeEx = 0.04; + + colorBackground[] = {0,0,0,1}; + colorText[] = {1,1,1,1}; +}; + +class vip_rsc_button { + + access = 0; + type = CT_BUTTON; + style = ST_LEFT; + default = 0; + blinkingPeriod = 0; + + x = 0 * GUI_GRID_CENTER_W + GUI_GRID_CENTER_X; + y = 0 * GUI_GRID_CENTER_H + GUI_GRID_CENTER_Y; + w = 6 * GUI_GRID_CENTER_W; + h = 1 * GUI_GRID_CENTER_H; + + colorBackground[] = {0.8,0.8,0.8,1}; + colorBackgroundDisabled[] = {0.8,0.8,0.8, 0.25}; + colorBackgroundActive[] = {1,1,1,1}; + colorFocused[] = {0.8,0.8,0.8,1}; + + text = ""; + sizeEx = 1 * GUI_GRID_CENTER_H; + font = GUI_FONT_NORMAL; + shadow = 1; + colorText[] = {0,0,0,1}; + colorDisabled[] = {0,0,0,0.25}; + + borderSize = 0.0; + colorBorder[] = {1,1,1,1}; + + colorShadow[] = {0,0,0,0.0}; + offsetX = 0.0075; + offsetY = 0.01; + offsetPressedX = 0.000; + offsetPressedY = 0.00; + + period = 0; + periodFocus = 0; + periodOver = 0.5; + + soundClick[] = {"\A3\ui_f\data\sound\RscButton\soundClick",0.09,1}; + soundEnter[] = {"\A3\ui_f\data\sound\RscButton\soundEnter",0.09,1}; + soundPush[] = {"\A3\ui_f\data\sound\RscButton\soundPush",0.09,1}; + soundEscape[] = {"\A3\ui_f\data\sound\RscButton\soundEscape",0.09,1}; + + //onButtonClick = "false"; +}; + +class vip_rsc_listbox { + + access = 0; + idc = 25; + type = CT_COMBO; + style = ST_LEFT + LB_TEXTURES; + default = 0; + blinkingPeriod = 0; + + x = 12 * GUI_GRID_CENTER_W + GUI_GRID_CENTER_X; + y = 4 * GUI_GRID_CENTER_H + GUI_GRID_CENTER_Y; + w = 9 * GUI_GRID_CENTER_W; + h = 1 * GUI_GRID_CENTER_H; + + colorBackground[] = {0.2,0.2,0.2,1}; + colorSelectBackground[] = {1,0.5,0,1}; + + sizeEx = GUI_GRID_CENTER_H; + font = GUI_FONT_NORMAL; + shadow = 0; + colorText[] = {1,1,1,1}; + colorDisabled[] = {1,1,1,0.5}; + colorSelect[] = {1,1,1,1}; + + pictureColor[] = {1,0.5,0,1}; + pictureColorSelect[] = {1,1,1,1}; + pictureColorDisabled[] = {1,1,1,0.5}; + + arrowEmpty = "\A3\ui_f\data\GUI\RscCommon\rsccombo\arrow_combo_ca.paa"; + arrowFull = "\A3\ui_f\data\GUI\RscCommon\rsccombo\arrow_combo_active_ca.paa"; + + wholeHeight = 8 * GUI_GRID_CENTER_H; + maxHistoryDelay = 1; + + soundExpand[] = {"\A3\ui_f\data\sound\RscCombo\soundExpand",0.1,1}; + soundCollapse[] = {"\A3\ui_f\data\sound\RscCombo\soundCollapse",0.1,1}; + soundSelect[] = {"\A3\ui_f\data\sound\RscCombo\soundSelect",0.1,1}; + + class ComboScrollBar + { + width = 0; + height = 0; + scrollSpeed = 0.01; + + arrowEmpty = "\A3\ui_f\data\gui\cfg\scrollbar\arrowEmpty_ca.paa"; + arrowFull = "\A3\ui_f\data\gui\cfg\scrollbar\arrowFull_ca.paa"; + border = "\A3\ui_f\data\gui\cfg\scrollbar\border_ca.paa"; + thumb = "\A3\ui_f\data\gui\cfg\scrollbar\thumb_ca.paa"; + + color[] = {1,1,1,1}; + }; + + onLBSelChanged = ""; +}; + +class vip_rsc_frame { + type = 0; + idc = -1; + style=ST_FRAME; + shadow=2; + colorBackground[]={0,0,0,0}; + colorText[]={1,1,1,1}; + font="PuristaMedium"; + sizeEx=0.02; + text=""; +}; + +class vip_rsc_map { + moveOnEdges=1; + x="SafeZoneXAbs"; + y="SafeZoneY + 1.5 * ( ( ((safezoneW / safezoneH) min 1.2) / 1.2) / 25)"; + w="SafeZoneWAbs"; + h="SafeZoneH - 1.5 * ( ( ((safezoneW / safezoneH) min 1.2) / 1.2) / 25)"; + shadow=0; + ptsPerSquareSea=5; + ptsPerSquareTxt=20; + ptsPerSquareCLn=10; + ptsPerSquareExp=10; + ptsPerSquareCost=10; + ptsPerSquareFor=9; + ptsPerSquareForEdge=9; + ptsPerSquareRoad=6; + ptsPerSquareObj=9; + showCountourInterval=0; + scaleMin=0.001; + scaleMax=1; + scaleDefault=0.16; + maxSatelliteAlpha=0.85000002; + alphaFadeStartScale=2; + alphaFadeEndScale=2; + colorBackground[]={0.96899998,0.95700002,0.949,1}; + colorSea[]={0.46700001,0.63099998,0.85100001,0.5}; + colorForest[]={0.62400001,0.77999997,0.38800001,0.5}; + colorForestBorder[]={0,0,0,0}; + colorRocks[]={0,0,0,0.30000001}; + colorRocksBorder[]={0,0,0,0}; + colorLevels[]={0.28600001,0.177,0.093999997,0.5}; + colorMainCountlines[]={0.57200003,0.354,0.18799999,0.5}; + colorCountlines[]={0.57200003,0.354,0.18799999,0.25}; + colorMainCountlinesWater[]={0.491,0.57700002,0.70200002,0.60000002}; + colorCountlinesWater[]={0.491,0.57700002,0.70200002,0.30000001}; + colorPowerLines[]={0.1,0.1,0.1,1}; + colorRailWay[]={0.80000001,0.2,0,1}; + colorNames[]={0.1,0.1,0.1,0.89999998}; + colorInactive[]={1,1,1,0.5}; + colorOutside[]={0,0,0,1}; + colorTracks[]={0.83999997,0.75999999,0.64999998,0.15000001}; + colorTracksFill[]={0.83999997,0.75999999,0.64999998,1}; + colorRoads[]={0.69999999,0.69999999,0.69999999,1}; + colorRoadsFill[]={1,1,1,1}; + colorMainRoads[]={0.89999998,0.5,0.30000001,1}; + colorMainRoadsFill[]={1,0.60000002,0.40000001,1}; + colorGrid[]={0.1,0.1,0.1,0.60000002}; + colorGridMap[]={0.1,0.1,0.1,0.60000002}; + fontLabel="PuristaMedium"; + sizeExLabel="( ( ( ((safezoneW / safezoneH) min 1.2) / 1.2) / 25) * 0.8)"; + fontGrid="TahomaB"; + sizeExGrid=0.02; + fontUnits="TahomaB"; + sizeExUnits="( ( ( ((safezoneW / safezoneH) min 1.2) / 1.2) / 25) * 0.8)"; + fontNames="EtelkaNarrowMediumPro"; + sizeExNames="( ( ( ((safezoneW / safezoneH) min 1.2) / 1.2) / 25) * 0.8) * 2"; + fontInfo="PuristaMedium"; + sizeExInfo="( ( ( ((safezoneW / safezoneH) min 1.2) / 1.2) / 25) * 0.8)"; + fontLevel="TahomaB"; + sizeExLevel=0.02; + text="#(argb,8,8,3)color(1,1,1,1)"; + class Legend + { + x="SafeZoneX + ( ((safezoneW / safezoneH) min 1.2) / 40)"; + y="SafeZoneY + safezoneH - 4.5 * ( ( ((safezoneW / safezoneH) min 1.2) / 1.2) / 25)"; + w="10 * ( ((safezoneW / safezoneH) min 1.2) / 40)"; + h="3.5 * ( ( ((safezoneW / safezoneH) min 1.2) / 1.2) / 25)"; + font="PuristaMedium"; + sizeEx="( ( ( ((safezoneW / safezoneH) min 1.2) / 1.2) / 25) * 0.8)"; + colorBackground[]={1,1,1,0.5}; + color[]={0,0,0,1}; + }; + class Task + { + icon="\A3\ui_f\data\map\mapcontrol\taskIcon_CA.paa"; + iconCreated="\A3\ui_f\data\map\mapcontrol\taskIconCreated_CA.paa"; + iconCanceled="\A3\ui_f\data\map\mapcontrol\taskIconCanceled_CA.paa"; + iconDone="\A3\ui_f\data\map\mapcontrol\taskIconDone_CA.paa"; + iconFailed="\A3\ui_f\data\map\mapcontrol\taskIconFailed_CA.paa"; + color[]= + { + "(profilenamespace getvariable ['IGUI_TEXT_RGB_R',0])", + "(profilenamespace getvariable ['IGUI_TEXT_RGB_G',1])", + "(profilenamespace getvariable ['IGUI_TEXT_RGB_B',1])", + "(profilenamespace getvariable ['IGUI_TEXT_RGB_A',0.8])" + }; + colorCreated[]={1,1,1,1}; + colorCanceled[]={0.69999999,0.69999999,0.69999999,1}; + colorDone[]={0.69999999,1,0.30000001,1}; + colorFailed[]={1,0.30000001,0.2,1}; + size=27; + importance=1; + coefMin=1; + coefMax=1; + }; + class Waypoint + { + icon="\A3\ui_f\data\map\mapcontrol\waypoint_ca.paa"; + color[]={0,0,0,1}; + }; + class WaypointCompleted + { + icon="\A3\ui_f\data\map\mapcontrol\waypointCompleted_ca.paa"; + color[]={0,0,0,1}; + }; + class CustomMark + { + icon="\A3\ui_f\data\map\mapcontrol\custommark_ca.paa"; + size=24; + importance=1; + coefMin=1; + coefMax=1; + color[]={0,0,0,1}; + }; + class Command + { + icon="\A3\ui_f\data\map\mapcontrol\waypoint_ca.paa"; + size=18; + importance=1; + coefMin=1; + coefMax=1; + color[]={1,1,1,1}; + }; + class Bush + { + icon="\A3\ui_f\data\map\mapcontrol\bush_ca.paa"; + color[]={0.44999999,0.63999999,0.33000001,0.40000001}; + size="14/2"; + importance="0.2 * 14 * 0.05 * 0.05"; + coefMin=0.25; + coefMax=4; + }; + class Rock + { + icon="\A3\ui_f\data\map\mapcontrol\rock_ca.paa"; + color[]={0.1,0.1,0.1,0.80000001}; + size=12; + importance="0.5 * 12 * 0.05"; + coefMin=0.25; + coefMax=4; + }; + class SmallTree + { + icon="\A3\ui_f\data\map\mapcontrol\bush_ca.paa"; + color[]={0.44999999,0.63999999,0.33000001,0.40000001}; + size=12; + importance="0.6 * 12 * 0.05"; + coefMin=0.25; + coefMax=4; + }; + class Tree + { + icon="\A3\ui_f\data\map\mapcontrol\bush_ca.paa"; + color[]={0.44999999,0.63999999,0.33000001,0.40000001}; + size=12; + importance="0.9 * 16 * 0.05"; + coefMin=0.25; + coefMax=4; + }; + class busstop + { + icon="\A3\ui_f\data\map\mapcontrol\busstop_CA.paa"; + size=24; + importance=1; + coefMin=0.85000002; + coefMax=1; + color[]={1,1,1,1}; + }; + class fuelstation + { + icon="\A3\ui_f\data\map\mapcontrol\fuelstation_CA.paa"; + size=24; + importance=1; + coefMin=0.85000002; + coefMax=1; + color[]={1,1,1,1}; + }; + class hospital + { + icon="\A3\ui_f\data\map\mapcontrol\hospital_CA.paa"; + size=24; + importance=1; + coefMin=0.85000002; + coefMax=1; + color[]={1,1,1,1}; + }; + class church + { + icon="\A3\ui_f\data\map\mapcontrol\church_CA.paa"; + size=24; + importance=1; + coefMin=0.85000002; + coefMax=1; + color[]={1,1,1,1}; + }; + class lighthouse + { + icon="\A3\ui_f\data\map\mapcontrol\lighthouse_CA.paa"; + size=24; + importance=1; + coefMin=0.85000002; + coefMax=1; + color[]={1,1,1,1}; + }; + class power + { + icon="\A3\ui_f\data\map\mapcontrol\power_CA.paa"; + size=24; + importance=1; + coefMin=0.85000002; + coefMax=1; + color[]={1,1,1,1}; + }; + class powersolar + { + icon="\A3\ui_f\data\map\mapcontrol\powersolar_CA.paa"; + size=24; + importance=1; + coefMin=0.85000002; + coefMax=1; + color[]={1,1,1,1}; + }; + class powerwave + { + icon="\A3\ui_f\data\map\mapcontrol\powerwave_CA.paa"; + size=24; + importance=1; + coefMin=0.85000002; + coefMax=1; + color[]={1,1,1,1}; + }; + class powerwind + { + icon="\A3\ui_f\data\map\mapcontrol\powerwind_CA.paa"; + size=24; + importance=1; + coefMin=0.85000002; + coefMax=1; + color[]={1,1,1,1}; + }; + class quay + { + icon="\A3\ui_f\data\map\mapcontrol\quay_CA.paa"; + size=24; + importance=1; + coefMin=0.85000002; + coefMax=1; + color[]={1,1,1,1}; + }; + class transmitter + { + icon="\A3\ui_f\data\map\mapcontrol\transmitter_CA.paa"; + size=24; + importance=1; + coefMin=0.85000002; + coefMax=1; + color[]={1,1,1,1}; + }; + class watertower + { + icon="\A3\ui_f\data\map\mapcontrol\watertower_CA.paa"; + size=24; + importance=1; + coefMin=0.85000002; + coefMax=1; + color[]={1,1,1,1}; + }; + class Cross + { + icon="\A3\ui_f\data\map\mapcontrol\Cross_CA.paa"; + size=24; + importance=1; + coefMin=0.85000002; + coefMax=1; + color[]={0,0,0,1}; + }; + class Chapel + { + icon="\A3\ui_f\data\map\mapcontrol\Chapel_CA.paa"; + size=24; + importance=1; + coefMin=0.85000002; + coefMax=1; + color[]={0,0,0,1}; + }; + class Shipwreck + { + icon="\A3\ui_f\data\map\mapcontrol\Shipwreck_CA.paa"; + size=24; + importance=1; + coefMin=0.85000002; + coefMax=1; + color[]={0,0,0,1}; + }; + class Bunker + { + icon="\A3\ui_f\data\map\mapcontrol\bunker_ca.paa"; + size=14; + importance="1.5 * 14 * 0.05"; + coefMin=0.25; + coefMax=4; + color[]={0,0,0,1}; + }; + class Fortress + { + icon="\A3\ui_f\data\map\mapcontrol\bunker_ca.paa"; + size=16; + importance="2 * 16 * 0.05"; + coefMin=0.25; + coefMax=4; + color[]={0,0,0,1}; + }; + class Fountain + { + icon="\A3\ui_f\data\map\mapcontrol\fountain_ca.paa"; + size=11; + importance="1 * 12 * 0.05"; + coefMin=0.25; + coefMax=4; + color[]={0,0,0,1}; + }; + class Ruin + { + icon="\A3\ui_f\data\map\mapcontrol\ruin_ca.paa"; + size=16; + importance="1.2 * 16 * 0.05"; + coefMin=1; + coefMax=4; + color[]={0,0,0,1}; + }; + class Stack + { + icon="\A3\ui_f\data\map\mapcontrol\stack_ca.paa"; + size=20; + importance="2 * 16 * 0.05"; + coefMin=0.89999998; + coefMax=4; + color[]={0,0,0,1}; + }; + class Tourism + { + icon="\A3\ui_f\data\map\mapcontrol\tourism_ca.paa"; + size=16; + importance="1 * 16 * 0.05"; + coefMin=0.69999999; + coefMax=4; + color[]={0,0,0,1}; + }; + class ViewTower + { + icon="\A3\ui_f\data\map\mapcontrol\viewtower_ca.paa"; + size=16; + importance="2.5 * 16 * 0.05"; + coefMin=0.5; + coefMax=4; + color[]={0,0,0,1}; + }; +}; \ No newline at end of file diff --git a/addons/spectator/script_component.hpp b/addons/spectator/script_component.hpp new file mode 100644 index 0000000000..c445dc4cdd --- /dev/null +++ b/addons/spectator/script_component.hpp @@ -0,0 +1,12 @@ +#define COMPONENT spectator +#include "\z\ace\addons\main\script_mod.hpp" + +#ifdef DEBUG_ENABLED_SPECTATOR + #define DEBUG_MODE_FULL +#endif + +#ifdef DEBUG_SETTINGS_SPECTATOR + #define DEBUG_SETTINGS DEBUG_SETTINGS_SPECTATOR +#endif + +#include "\z\ace\addons\main\script_macros.hpp" \ No newline at end of file diff --git a/addons/spectator/stringtable.xml b/addons/spectator/stringtable.xml new file mode 100644 index 0000000000..72a29abe9c --- /dev/null +++ b/addons/spectator/stringtable.xml @@ -0,0 +1,110 @@ + + + + + Spectator + + + + + + + Enable Spectator + + + + + + + Begin spectating on player death? + + + + + + + Player Side Only + + + + + + + Only spectate units belonging to player's side? + + + + + + + Spectate AI + + + + + + + Allow spectating of AI units? + + + + + + + Track Units + + + + + + + Track units' movements throughout mission? + + + + + + + Start Position + + + + + + + Use this module as a starting position for spectator camera? + + + + + + + End Mission + + + + + + + End mission when all players dead (default BIS behaviour)? + + + + + + + View Distance + + + + + + + OK + + + + + + + \ No newline at end of file From 873936dc319dc44b2194dcf361e46981177b963e Mon Sep 17 00:00:00 2001 From: SilentSpike Date: Mon, 29 Jun 2015 14:15:46 +0100 Subject: [PATCH 49/86] Simplify addon checking code --- addons/common/functions/fnc_checkFiles.sqf | 15 +++++++-------- 1 file changed, 7 insertions(+), 8 deletions(-) diff --git a/addons/common/functions/fnc_checkFiles.sqf b/addons/common/functions/fnc_checkFiles.sqf index 1783588b76..647a1b00a6 100644 --- a/addons/common/functions/fnc_checkFiles.sqf +++ b/addons/common/functions/fnc_checkFiles.sqf @@ -85,17 +85,16 @@ if (isMultiplayer) then { }; }; - { - if !(_x in GVAR(ServerAddons)) then { - _errorMsg = format ["Client/Server Addon Mismatch. Client has extra addon: %1.",_x]; + _addons = _addons - GVAR(ServerAddons); + if !(_addons isEqualTo []) then { + _errorMsg = format ["Client/Server Addon Mismatch. Client has extra addons: %1.",_addons]; - diag_log text format ["[ACE] ERROR: %1", _errorMsg]; + diag_log text format ["[ACE] ERROR: %1", _errorMsg]; - if (hasInterface) then {diag_log str "1"; - ["[ACE] ERROR", _errorMsg, {findDisplay 46 closeDisplay 0}] call FUNC(errorMessage); - }; + if (hasInterface) then {diag_log str "1"; + ["[ACE] ERROR", _errorMsg, {findDisplay 46 closeDisplay 0}] call FUNC(errorMessage); }; - } forEach _addons; + }; [_this select 1] call CBA_fnc_removePerFrameHandler; }, 1, [_version,_addons]] call CBA_fnc_addPerFrameHandler; From 0d3601da47e8db8b08c0b905c245c13ab4605e9c Mon Sep 17 00:00:00 2001 From: voiper Date: Mon, 29 Jun 2015 09:51:19 -0700 Subject: [PATCH 50/86] Tiny fix to description. --- addons/spectator/functions/fnc_camera.sqf | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/addons/spectator/functions/fnc_camera.sqf b/addons/spectator/functions/fnc_camera.sqf index 853720893d..bc4cea88cc 100644 --- a/addons/spectator/functions/fnc_camera.sqf +++ b/addons/spectator/functions/fnc_camera.sqf @@ -8,7 +8,7 @@ Arguments: 0: Mode: "Init" is the only mission relevant one 1: (optional): - 0: Whether player can escape from camera (true for MP spectator; false for SP photography) + 0: Whether player can escape from camera (false for MP spectator; true for SP photography) Example: ["Init", [false]] call ace_spectator_fnc_camera; From 75e322e6ae25ab4c31dad1fa0d9f5ab4963f8c90 Mon Sep 17 00:00:00 2001 From: naizarak Date: Mon, 29 Jun 2015 12:23:32 -0700 Subject: [PATCH 51/86] Update fnc_addEarPlugs.sqf Do not automatically add earplugs to units if combat deafness is disabled. --- addons/hearing/functions/fnc_addEarPlugs.sqf | 2 ++ 1 file changed, 2 insertions(+) diff --git a/addons/hearing/functions/fnc_addEarPlugs.sqf b/addons/hearing/functions/fnc_addEarPlugs.sqf index 455de07fd9..5938bf3eb9 100644 --- a/addons/hearing/functions/fnc_addEarPlugs.sqf +++ b/addons/hearing/functions/fnc_addEarPlugs.sqf @@ -15,6 +15,8 @@ */ #include "script_component.hpp" +if (!GVAR(enableCombatDeafness)) exitWith {}; + private ["_unit", "_launcher"]; _unit = _this select 0; From 71609c70e667610fb752bf478e716a3d34825451 Mon Sep 17 00:00:00 2001 From: jonpas Date: Mon, 29 Jun 2015 22:21:07 +0200 Subject: [PATCH 52/86] Properly moved PNGs and shortened folder tree of extras/assets/icons, Added Thumbs.db to .gitignore --- .gitignore | 1 + .../Icon_Actions => Icon_Actions_png}/disarm.png | Bin .../icons/{ => Icon_Actions_png}/icon_microDAGR.png | Bin .../Icon_Module_Ambient_Sounds_ca.png | Bin .../Icon_Module_BFTracking_ca.png | Bin .../Icon_Module_CheckPBO_ca.png | Bin .../Icon_Module_Explosives_ca.png | Bin .../Icon_Module_FriendlyFire_ca.png | Bin .../Icon_Module_Hearing_ca.png | Bin .../Icon_Module_Interaction_ca.png | Bin .../Icon_Module_LSD_ca.png | Bin .../Icon_Module_Make_Unit_Surrender_ca.png | Bin .../Icon_Module_Map_ca.png | Bin .../Icon_Module_Medical_ca.png | Bin .../Icon_Module_NameTags_ca.png | Bin .../Icon_Module_Rallypoint_ca.png | Bin .../Icon_Module_Repair_ca.png | Bin .../Icon_Module_Respawn_ca.png | Bin .../Icon_Module_Sitting_ca.png} | Bin .../Icon_Module_SwitchUnits_ca.png | Bin .../Icon_Module_VehicleKey_ca.png | Bin .../Icon_Module_VehicleLock_ca.png | Bin .../Icon_Module_Wind_ca.png | Bin .../Icon_Module_Zeus_Captive_ca.png | Bin .../Icon_Module_Zeus_Settings_ca.png | Bin .../Icon_Module_Zeus_Surrender_ca.png | Bin .../Icon_Module_Zeus_Unconscious_ca.png | Bin .../Icon_Module_microDAGR_ca.png | Bin .../{png => Icon_Module_png}/Icon_Module_mk6_ca.png | Bin 29 files changed, 1 insertion(+) rename extras/assets/icons/{png/Icon_Actions => Icon_Actions_png}/disarm.png (100%) rename extras/assets/icons/{ => Icon_Actions_png}/icon_microDAGR.png (100%) rename extras/assets/icons/{png/Icon_Module => Icon_Module_png}/Icon_Module_Ambient_Sounds_ca.png (100%) rename extras/assets/icons/{png/Icon_Module => Icon_Module_png}/Icon_Module_BFTracking_ca.png (100%) rename extras/assets/icons/{png/Icon_Module => Icon_Module_png}/Icon_Module_CheckPBO_ca.png (100%) rename extras/assets/icons/{png/Icon_Module => Icon_Module_png}/Icon_Module_Explosives_ca.png (100%) rename extras/assets/icons/{png/Icon_Module => Icon_Module_png}/Icon_Module_FriendlyFire_ca.png (100%) rename extras/assets/icons/{png/Icon_Module => Icon_Module_png}/Icon_Module_Hearing_ca.png (100%) rename extras/assets/icons/{png/Icon_Module => Icon_Module_png}/Icon_Module_Interaction_ca.png (100%) rename extras/assets/icons/{png/Icon_Module => Icon_Module_png}/Icon_Module_LSD_ca.png (100%) rename extras/assets/icons/{png/Icon_Module => Icon_Module_png}/Icon_Module_Make_Unit_Surrender_ca.png (100%) rename extras/assets/icons/{png/Icon_Module => Icon_Module_png}/Icon_Module_Map_ca.png (100%) rename extras/assets/icons/{png/Icon_Module => Icon_Module_png}/Icon_Module_Medical_ca.png (100%) rename extras/assets/icons/{png/Icon_Module => Icon_Module_png}/Icon_Module_NameTags_ca.png (100%) rename extras/assets/icons/{png/Icon_Module => Icon_Module_png}/Icon_Module_Rallypoint_ca.png (100%) rename extras/assets/icons/{png/Icon_Module => Icon_Module_png}/Icon_Module_Repair_ca.png (100%) rename extras/assets/icons/{png/Icon_Module => Icon_Module_png}/Icon_Module_Respawn_ca.png (100%) rename extras/assets/icons/{png/Icon_Module/Icons_Module_Sitting_ca.png => Icon_Module_png/Icon_Module_Sitting_ca.png} (100%) rename extras/assets/icons/{png/Icon_Module => Icon_Module_png}/Icon_Module_SwitchUnits_ca.png (100%) rename extras/assets/icons/{png/Icon_Module => Icon_Module_png}/Icon_Module_VehicleKey_ca.png (100%) rename extras/assets/icons/{png/Icon_Module => Icon_Module_png}/Icon_Module_VehicleLock_ca.png (100%) rename extras/assets/icons/{png/Icon_Module => Icon_Module_png}/Icon_Module_Wind_ca.png (100%) rename extras/assets/icons/{png/Icon_Module => Icon_Module_png}/Icon_Module_Zeus_Captive_ca.png (100%) rename extras/assets/icons/{png/Icon_Module => Icon_Module_png}/Icon_Module_Zeus_Settings_ca.png (100%) rename extras/assets/icons/{png/Icon_Module => Icon_Module_png}/Icon_Module_Zeus_Surrender_ca.png (100%) rename extras/assets/icons/{png/Icon_Module => Icon_Module_png}/Icon_Module_Zeus_Unconscious_ca.png (100%) rename extras/assets/icons/{png/Icon_Module => Icon_Module_png}/Icon_Module_microDAGR_ca.png (100%) rename extras/assets/icons/{png => Icon_Module_png}/Icon_Module_mk6_ca.png (100%) diff --git a/.gitignore b/.gitignore index f05646fb8a..f312ddb55e 100644 --- a/.gitignore +++ b/.gitignore @@ -5,3 +5,4 @@ texHeaders.bin *.swp *.swo *.biprivatekey +Thumbs.db diff --git a/extras/assets/icons/png/Icon_Actions/disarm.png b/extras/assets/icons/Icon_Actions_png/disarm.png similarity index 100% rename from extras/assets/icons/png/Icon_Actions/disarm.png rename to extras/assets/icons/Icon_Actions_png/disarm.png diff --git a/extras/assets/icons/icon_microDAGR.png b/extras/assets/icons/Icon_Actions_png/icon_microDAGR.png similarity index 100% rename from extras/assets/icons/icon_microDAGR.png rename to extras/assets/icons/Icon_Actions_png/icon_microDAGR.png diff --git a/extras/assets/icons/png/Icon_Module/Icon_Module_Ambient_Sounds_ca.png b/extras/assets/icons/Icon_Module_png/Icon_Module_Ambient_Sounds_ca.png similarity index 100% rename from extras/assets/icons/png/Icon_Module/Icon_Module_Ambient_Sounds_ca.png rename to extras/assets/icons/Icon_Module_png/Icon_Module_Ambient_Sounds_ca.png diff --git a/extras/assets/icons/png/Icon_Module/Icon_Module_BFTracking_ca.png b/extras/assets/icons/Icon_Module_png/Icon_Module_BFTracking_ca.png similarity index 100% rename from extras/assets/icons/png/Icon_Module/Icon_Module_BFTracking_ca.png rename to extras/assets/icons/Icon_Module_png/Icon_Module_BFTracking_ca.png diff --git a/extras/assets/icons/png/Icon_Module/Icon_Module_CheckPBO_ca.png b/extras/assets/icons/Icon_Module_png/Icon_Module_CheckPBO_ca.png similarity index 100% rename from extras/assets/icons/png/Icon_Module/Icon_Module_CheckPBO_ca.png rename to extras/assets/icons/Icon_Module_png/Icon_Module_CheckPBO_ca.png diff --git a/extras/assets/icons/png/Icon_Module/Icon_Module_Explosives_ca.png b/extras/assets/icons/Icon_Module_png/Icon_Module_Explosives_ca.png similarity index 100% rename from extras/assets/icons/png/Icon_Module/Icon_Module_Explosives_ca.png rename to extras/assets/icons/Icon_Module_png/Icon_Module_Explosives_ca.png diff --git a/extras/assets/icons/png/Icon_Module/Icon_Module_FriendlyFire_ca.png b/extras/assets/icons/Icon_Module_png/Icon_Module_FriendlyFire_ca.png similarity index 100% rename from extras/assets/icons/png/Icon_Module/Icon_Module_FriendlyFire_ca.png rename to extras/assets/icons/Icon_Module_png/Icon_Module_FriendlyFire_ca.png diff --git a/extras/assets/icons/png/Icon_Module/Icon_Module_Hearing_ca.png b/extras/assets/icons/Icon_Module_png/Icon_Module_Hearing_ca.png similarity index 100% rename from extras/assets/icons/png/Icon_Module/Icon_Module_Hearing_ca.png rename to extras/assets/icons/Icon_Module_png/Icon_Module_Hearing_ca.png diff --git a/extras/assets/icons/png/Icon_Module/Icon_Module_Interaction_ca.png b/extras/assets/icons/Icon_Module_png/Icon_Module_Interaction_ca.png similarity index 100% rename from extras/assets/icons/png/Icon_Module/Icon_Module_Interaction_ca.png rename to extras/assets/icons/Icon_Module_png/Icon_Module_Interaction_ca.png diff --git a/extras/assets/icons/png/Icon_Module/Icon_Module_LSD_ca.png b/extras/assets/icons/Icon_Module_png/Icon_Module_LSD_ca.png similarity index 100% rename from extras/assets/icons/png/Icon_Module/Icon_Module_LSD_ca.png rename to extras/assets/icons/Icon_Module_png/Icon_Module_LSD_ca.png diff --git a/extras/assets/icons/png/Icon_Module/Icon_Module_Make_Unit_Surrender_ca.png b/extras/assets/icons/Icon_Module_png/Icon_Module_Make_Unit_Surrender_ca.png similarity index 100% rename from extras/assets/icons/png/Icon_Module/Icon_Module_Make_Unit_Surrender_ca.png rename to extras/assets/icons/Icon_Module_png/Icon_Module_Make_Unit_Surrender_ca.png diff --git a/extras/assets/icons/png/Icon_Module/Icon_Module_Map_ca.png b/extras/assets/icons/Icon_Module_png/Icon_Module_Map_ca.png similarity index 100% rename from extras/assets/icons/png/Icon_Module/Icon_Module_Map_ca.png rename to extras/assets/icons/Icon_Module_png/Icon_Module_Map_ca.png diff --git a/extras/assets/icons/png/Icon_Module/Icon_Module_Medical_ca.png b/extras/assets/icons/Icon_Module_png/Icon_Module_Medical_ca.png similarity index 100% rename from extras/assets/icons/png/Icon_Module/Icon_Module_Medical_ca.png rename to extras/assets/icons/Icon_Module_png/Icon_Module_Medical_ca.png diff --git a/extras/assets/icons/png/Icon_Module/Icon_Module_NameTags_ca.png b/extras/assets/icons/Icon_Module_png/Icon_Module_NameTags_ca.png similarity index 100% rename from extras/assets/icons/png/Icon_Module/Icon_Module_NameTags_ca.png rename to extras/assets/icons/Icon_Module_png/Icon_Module_NameTags_ca.png diff --git a/extras/assets/icons/png/Icon_Module/Icon_Module_Rallypoint_ca.png b/extras/assets/icons/Icon_Module_png/Icon_Module_Rallypoint_ca.png similarity index 100% rename from extras/assets/icons/png/Icon_Module/Icon_Module_Rallypoint_ca.png rename to extras/assets/icons/Icon_Module_png/Icon_Module_Rallypoint_ca.png diff --git a/extras/assets/icons/png/Icon_Module/Icon_Module_Repair_ca.png b/extras/assets/icons/Icon_Module_png/Icon_Module_Repair_ca.png similarity index 100% rename from extras/assets/icons/png/Icon_Module/Icon_Module_Repair_ca.png rename to extras/assets/icons/Icon_Module_png/Icon_Module_Repair_ca.png diff --git a/extras/assets/icons/png/Icon_Module/Icon_Module_Respawn_ca.png b/extras/assets/icons/Icon_Module_png/Icon_Module_Respawn_ca.png similarity index 100% rename from extras/assets/icons/png/Icon_Module/Icon_Module_Respawn_ca.png rename to extras/assets/icons/Icon_Module_png/Icon_Module_Respawn_ca.png diff --git a/extras/assets/icons/png/Icon_Module/Icons_Module_Sitting_ca.png b/extras/assets/icons/Icon_Module_png/Icon_Module_Sitting_ca.png similarity index 100% rename from extras/assets/icons/png/Icon_Module/Icons_Module_Sitting_ca.png rename to extras/assets/icons/Icon_Module_png/Icon_Module_Sitting_ca.png diff --git a/extras/assets/icons/png/Icon_Module/Icon_Module_SwitchUnits_ca.png b/extras/assets/icons/Icon_Module_png/Icon_Module_SwitchUnits_ca.png similarity index 100% rename from extras/assets/icons/png/Icon_Module/Icon_Module_SwitchUnits_ca.png rename to extras/assets/icons/Icon_Module_png/Icon_Module_SwitchUnits_ca.png diff --git a/extras/assets/icons/png/Icon_Module/Icon_Module_VehicleKey_ca.png b/extras/assets/icons/Icon_Module_png/Icon_Module_VehicleKey_ca.png similarity index 100% rename from extras/assets/icons/png/Icon_Module/Icon_Module_VehicleKey_ca.png rename to extras/assets/icons/Icon_Module_png/Icon_Module_VehicleKey_ca.png diff --git a/extras/assets/icons/png/Icon_Module/Icon_Module_VehicleLock_ca.png b/extras/assets/icons/Icon_Module_png/Icon_Module_VehicleLock_ca.png similarity index 100% rename from extras/assets/icons/png/Icon_Module/Icon_Module_VehicleLock_ca.png rename to extras/assets/icons/Icon_Module_png/Icon_Module_VehicleLock_ca.png diff --git a/extras/assets/icons/png/Icon_Module/Icon_Module_Wind_ca.png b/extras/assets/icons/Icon_Module_png/Icon_Module_Wind_ca.png similarity index 100% rename from extras/assets/icons/png/Icon_Module/Icon_Module_Wind_ca.png rename to extras/assets/icons/Icon_Module_png/Icon_Module_Wind_ca.png diff --git a/extras/assets/icons/png/Icon_Module/Icon_Module_Zeus_Captive_ca.png b/extras/assets/icons/Icon_Module_png/Icon_Module_Zeus_Captive_ca.png similarity index 100% rename from extras/assets/icons/png/Icon_Module/Icon_Module_Zeus_Captive_ca.png rename to extras/assets/icons/Icon_Module_png/Icon_Module_Zeus_Captive_ca.png diff --git a/extras/assets/icons/png/Icon_Module/Icon_Module_Zeus_Settings_ca.png b/extras/assets/icons/Icon_Module_png/Icon_Module_Zeus_Settings_ca.png similarity index 100% rename from extras/assets/icons/png/Icon_Module/Icon_Module_Zeus_Settings_ca.png rename to extras/assets/icons/Icon_Module_png/Icon_Module_Zeus_Settings_ca.png diff --git a/extras/assets/icons/png/Icon_Module/Icon_Module_Zeus_Surrender_ca.png b/extras/assets/icons/Icon_Module_png/Icon_Module_Zeus_Surrender_ca.png similarity index 100% rename from extras/assets/icons/png/Icon_Module/Icon_Module_Zeus_Surrender_ca.png rename to extras/assets/icons/Icon_Module_png/Icon_Module_Zeus_Surrender_ca.png diff --git a/extras/assets/icons/png/Icon_Module/Icon_Module_Zeus_Unconscious_ca.png b/extras/assets/icons/Icon_Module_png/Icon_Module_Zeus_Unconscious_ca.png similarity index 100% rename from extras/assets/icons/png/Icon_Module/Icon_Module_Zeus_Unconscious_ca.png rename to extras/assets/icons/Icon_Module_png/Icon_Module_Zeus_Unconscious_ca.png diff --git a/extras/assets/icons/png/Icon_Module/Icon_Module_microDAGR_ca.png b/extras/assets/icons/Icon_Module_png/Icon_Module_microDAGR_ca.png similarity index 100% rename from extras/assets/icons/png/Icon_Module/Icon_Module_microDAGR_ca.png rename to extras/assets/icons/Icon_Module_png/Icon_Module_microDAGR_ca.png diff --git a/extras/assets/icons/png/Icon_Module_mk6_ca.png b/extras/assets/icons/Icon_Module_png/Icon_Module_mk6_ca.png similarity index 100% rename from extras/assets/icons/png/Icon_Module_mk6_ca.png rename to extras/assets/icons/Icon_Module_png/Icon_Module_mk6_ca.png From c58ff8d31d17e66051e0f772a7a9fe7ae507cdbb Mon Sep 17 00:00:00 2001 From: PabstMirror Date: Wed, 1 Jul 2015 00:13:55 -0500 Subject: [PATCH 53/86] #1736 - Allow moving map while shake effect active --- addons/map/XEH_postInitClient.sqf | 23 +++++++++++++++++++++++ 1 file changed, 23 insertions(+) diff --git a/addons/map/XEH_postInitClient.sqf b/addons/map/XEH_postInitClient.sqf index a3f377544b..52c904b1ce 100644 --- a/addons/map/XEH_postInitClient.sqf +++ b/addons/map/XEH_postInitClient.sqf @@ -18,7 +18,30 @@ call FUNC(determineZoom); GVAR(lastStillTime) = ACE_time; GVAR(isShaking) = false; + //Allow panning the lastStillPosition while mapShake is active + GVAR(rightMouseButtonLastPos) = []; ((findDisplay 12) displayCtrl 51) ctrlAddEventHandler ["Draw", {[] call FUNC(updateMapEffects);}]; + ((findDisplay 12) displayCtrl 51) ctrlAddEventHandler ["MouseMoving", { + if (GVAR(isShaking) && {(count GVAR(rightMouseButtonLastPos)) == 2}) then { + private["_lastPos", "_newPos"]; + _lastPos = (_this select 0) ctrlMapScreenToWorld GVAR(rightMouseButtonLastPos); + _newPos = (_this select 0) ctrlMapScreenToWorld (_this select [1,2]); + GVAR(lastStillPosition) set [0, (GVAR(lastStillPosition) select 0) + (_lastPos select 0) - (_newPos select 0)]; + GVAR(lastStillPosition) set [1, (GVAR(lastStillPosition) select 1) + (_lastPos select 1) - (_newPos select 1)]; + GVAR(rightMouseButtonLastPos) = _this select [1,2]; + TRACE_3("Mouse Move",_lastPos,_newPos,GVAR(rightMouseButtonLastPos)); + }; + }]; + ((findDisplay 12) displayCtrl 51) ctrlAddEventHandler ["MouseButtonDown", { + if ((_this select 1) == 1) then { + GVAR(rightMouseButtonLastPos) = _this select [2,2]; + }; + }]; + ((findDisplay 12) displayCtrl 51) ctrlAddEventHandler ["MouseButtonUp", { + if ((_this select 1) == 1) then { + GVAR(rightMouseButtonLastPos) = []; + }; + }]; }; ["SettingsInitialized", { From 9c2009217b28fb9d20e46f98e57ad70fc1484365 Mon Sep 17 00:00:00 2001 From: Fadi Date: Wed, 1 Jul 2015 00:34:49 -0500 Subject: [PATCH 54/86] Correcting RHS class inheritence for ace_isbelt --- optionals/compat_rhs_afrf3/CfgMagazines.hpp | 8 ++++---- optionals/compat_rhs_usf3/CfgMagazines.hpp | 11 +---------- 2 files changed, 5 insertions(+), 14 deletions(-) diff --git a/optionals/compat_rhs_afrf3/CfgMagazines.hpp b/optionals/compat_rhs_afrf3/CfgMagazines.hpp index 6acd70844a..0e19056ae0 100644 --- a/optionals/compat_rhs_afrf3/CfgMagazines.hpp +++ b/optionals/compat_rhs_afrf3/CfgMagazines.hpp @@ -5,13 +5,13 @@ class cfgMagazines { class rhs_100Rnd_762x54mmR: rhs_30Rnd_545x39_AK { ace_isbelt = 1; }; - class rhs_100Rnd_762x54mmR_green: rhs_100Rnd_762x54mmR { + class rhs_mag_127x108mm_50: VehicleMagazine { ace_isbelt = 1; }; - class rhs_mag_127x108mm_50 : VehicleMagazine { - ace_isbelt = 1; + class rhs_mag_127x108mm_150: rhs_mag_127x108mm_50 { + ace_isbelt = 0; }; - class rhs_mag_127x108mm_150 : rhs_mag_127x108mm_50 { + class rhs_mag_127x108mm_1470 : rhs_mag_127x108mm_50 { ace_isbelt = 0; }; }; \ No newline at end of file diff --git a/optionals/compat_rhs_usf3/CfgMagazines.hpp b/optionals/compat_rhs_usf3/CfgMagazines.hpp index f067cd6eee..e067d1f293 100644 --- a/optionals/compat_rhs_usf3/CfgMagazines.hpp +++ b/optionals/compat_rhs_usf3/CfgMagazines.hpp @@ -10,16 +10,7 @@ class cfgMagazines { class rhsusf_100Rnd_556x45_M200_soft_pouch: rhs_mag_30Rnd_556x45_M200_Stanag { ace_isbelt = 1; }; - class rhsusf_200Rnd_556x45_soft_pouch: rhsusf_100Rnd_556x45_soft_pouch { - ace_isbelt = 1; - }; - class rhsusf_100Rnd_762x51: CA_Magazine { - ace_isbelt = 1; - }; - class rhsusf_100Rnd_762x51_m80a1epr: rhsusf_100Rnd_762x51 { - ace_isbelt = 1; - }; - class rhsusf_100Rnd_762x51_m993: rhsusf_100Rnd_762x51 { + class rhsusf_50Rnd_762x51: CA_Magazine { ace_isbelt = 1; }; class rhs_mag_100rnd_127x99_mag: VehicleMagazine { From acc8a08d529ba88ff62ea89ea288f586a9098d05 Mon Sep 17 00:00:00 2001 From: Fadi Date: Wed, 1 Jul 2015 00:36:46 -0500 Subject: [PATCH 55/86] Cleaning up unnessecary spaces --- optionals/compat_rhs_afrf3/CfgMagazines.hpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/optionals/compat_rhs_afrf3/CfgMagazines.hpp b/optionals/compat_rhs_afrf3/CfgMagazines.hpp index 0e19056ae0..92444a380b 100644 --- a/optionals/compat_rhs_afrf3/CfgMagazines.hpp +++ b/optionals/compat_rhs_afrf3/CfgMagazines.hpp @@ -8,7 +8,7 @@ class cfgMagazines { class rhs_mag_127x108mm_50: VehicleMagazine { ace_isbelt = 1; }; - class rhs_mag_127x108mm_150: rhs_mag_127x108mm_50 { + class rhs_mag_127x108mm_150: rhs_mag_127x108mm_50 { ace_isbelt = 0; }; class rhs_mag_127x108mm_1470 : rhs_mag_127x108mm_50 { From 7eb26c8710b4d3469b57bf1020666b1c9c6b7866 Mon Sep 17 00:00:00 2001 From: PabstMirror Date: Wed, 1 Jul 2015 01:27:06 -0500 Subject: [PATCH 56/86] #1699 - Rally point object names --- addons/respawn/CfgAddons.hpp | 2 +- addons/respawn/config.cpp | 2 +- addons/respawn/functions/fnc_moveRallypoint.sqf | 6 ++++-- 3 files changed, 6 insertions(+), 4 deletions(-) diff --git a/addons/respawn/CfgAddons.hpp b/addons/respawn/CfgAddons.hpp index 2793ac09da..111613615e 100644 --- a/addons/respawn/CfgAddons.hpp +++ b/addons/respawn/CfgAddons.hpp @@ -1,5 +1,5 @@ class CfgAddons { class GVAR(Rallypoints) { - list[] = { "ACE_Rallypoint_West", "ACE_Rallypoint_East", "ACE_Rallypoint_Independent", "ACE_RallypointExit_West", "ACE_RallypointExit_East", "ACE_RallypointExit_Independent" }; + list[] = {"ACE_Rallypoint_West", "ACE_Rallypoint_East", "ACE_Rallypoint_Independent", "ACE_Rallypoint_West_Base", "ACE_Rallypoint_East_Base", "ACE_Rallypoint_Independent_Base"}; }; }; diff --git a/addons/respawn/config.cpp b/addons/respawn/config.cpp index daed5e2ab0..4a23d1f650 100644 --- a/addons/respawn/config.cpp +++ b/addons/respawn/config.cpp @@ -3,7 +3,7 @@ class CfgPatches { class ADDON { units[] = {}; - weapons[] = { "ACE_Rallypoint_West", "ACE_Rallypoint_East", "ACE_Rallypoint_Independent", "ACE_RallypointExit_West", "ACE_RallypointExit_East", "ACE_RallypointExit_Independent" }; + weapons[] = {"ACE_Rallypoint_West", "ACE_Rallypoint_East", "ACE_Rallypoint_Independent", "ACE_Rallypoint_West_Base", "ACE_Rallypoint_East_Base", "ACE_Rallypoint_Independent_Base"}; requiredVersion = REQUIRED_VERSION; requiredAddons[] = { "ace_common" }; author[] = { "bux578", "commy2" }; diff --git a/addons/respawn/functions/fnc_moveRallypoint.sqf b/addons/respawn/functions/fnc_moveRallypoint.sqf index 5a0472cf5b..d512c23886 100644 --- a/addons/respawn/functions/fnc_moveRallypoint.sqf +++ b/addons/respawn/functions/fnc_moveRallypoint.sqf @@ -26,10 +26,12 @@ private ["_rallypoint", "_position"]; _rallypoint = [ objNull, missionNamespace getVariable ["ACE_Rallypoint_West", objNull], - missionNamespace getVariable ["ACE_RallypointExit_East", objNull], - missionNamespace getVariable ["ACE_RallypointExit_Independent", objNull] + missionNamespace getVariable ["ACE_Rallypoint_East", objNull], + missionNamespace getVariable ["ACE_Rallypoint_Independent", objNull] ] select ([west, east, independent] find _side) + 1; +TRACE_3("moving rally",_unit, _rallypoint, (typeOf _rallypoint)); + if (isNull _rallypoint) exitWith {}; _position = getPosATL _unit; From 57f88fe77a3053ddf1c78c1519efeafba75f0a46 Mon Sep 17 00:00:00 2001 From: PabstMirror Date: Wed, 1 Jul 2015 01:53:15 -0500 Subject: [PATCH 57/86] Ace_modules - Pass synced objects to functions --- addons/modules/XEH_postInit.sqf | 8 ++------ 1 file changed, 2 insertions(+), 6 deletions(-) diff --git a/addons/modules/XEH_postInit.sqf b/addons/modules/XEH_postInit.sqf index f7b652ab44..62d16f42ce 100644 --- a/addons/modules/XEH_postInit.sqf +++ b/addons/modules/XEH_postInit.sqf @@ -26,12 +26,8 @@ _function = missionNamespace getvariable _function; }; - if (_isGlobal) then { - [_logic, [], true] call _function; - } else { - if (isServer) then { - [_logic, [], true] call _function; - }; + if (_isGlobal || isServer) then { + [_logic, (synchronizedObjects _logic), true] call _function; }; if !(_isPersistent) then { From 319e50a9cc20214fe0911e040effd2ab5aff3c82 Mon Sep 17 00:00:00 2001 From: PabstMirror Date: Wed, 1 Jul 2015 12:39:49 -0500 Subject: [PATCH 58/86] Viewdistance - Fix `Error Missing )` --- addons/viewdistance/XEH_postInit.sqf | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/addons/viewdistance/XEH_postInit.sqf b/addons/viewdistance/XEH_postInit.sqf index 66619a7589..865e5527e5 100644 --- a/addons/viewdistance/XEH_postInit.sqf +++ b/addons/viewdistance/XEH_postInit.sqf @@ -4,7 +4,7 @@ if (!hasInterface) exitWith {}; ["SettingsInitialized", { // if not enabled, then bugger off. - if !(GVAR(enabled) exitWith {}; + if !(GVAR(enabled)) exitWith {}; // Force the view distance down to the limit. if (viewDistance > GVAR(limitViewDistance)) then { From d1187ad82ebbf3b71942b52262d04b7fe7b8eef8 Mon Sep 17 00:00:00 2001 From: Josuan Albin Date: Tue, 30 Jun 2015 16:04:00 +0200 Subject: [PATCH 59/86] Documentation pass 8 - Finished: MicroDAGR doc, note that the images can't be viewed properly on GitHub. - Coding guidelines are more readable now, added the STRING family of macros to it. - How to enable dragging / carrying added to dragging / carrying framework with a BIG disclaimer that the functions are not public and may change. - Shortcut updated to fit the convention established in the shortcut page. --- .../development/coding-guidelines.md | 137 ++++++++++------- documentation/feature/advanced_ballistics.md | 2 +- documentation/feature/aircraft.md | 2 +- documentation/feature/attach.md | 4 +- documentation/feature/captives.md | 2 +- documentation/feature/concertina_wire.md | 2 +- documentation/feature/disarming.md | 2 +- documentation/feature/dragging.md | 4 +- documentation/feature/explosives.md | 6 +- documentation/feature/fcs.md | 6 +- documentation/feature/hearing.md | 2 +- documentation/feature/huntIR.md | 4 +- documentation/feature/javelin.md | 4 +- documentation/feature/logistics_uavbattery.md | 2 +- documentation/feature/logistics_wirecutter.md | 2 +- documentation/feature/magazinerepack.md | 2 +- documentation/feature/maptools.md | 4 +- documentation/feature/microdagr.md | 142 ++++++++++++++++-- documentation/feature/missileguidance.md | 4 +- documentation/feature/mk6mortar.md | 4 +- documentation/feature/modules.md | 14 ++ documentation/feature/overheating.md | 4 +- documentation/feature/rangecard.md | 2 +- documentation/feature/reload.md | 2 +- documentation/feature/reloadlaunchers.md | 2 +- documentation/feature/respawn.md | 2 +- documentation/feature/safemode.md | 4 +- documentation/feature/sandbags.md | 2 +- documentation/feature/scopes.md | 16 +- documentation/feature/spotting_scope.md | 2 +- documentation/feature/tacticallader.md | 4 +- documentation/feature/tripod.md | 6 +- documentation/feature/vector.md | 22 +-- documentation/feature/vehicles.md | 4 + documentation/framework/carry-drag.md | 68 +++++++++ 35 files changed, 365 insertions(+), 126 deletions(-) create mode 100644 documentation/feature/modules.md diff --git a/documentation/development/coding-guidelines.md b/documentation/development/coding-guidelines.md index 89f0d91342..1ab53046ec 100644 --- a/documentation/development/coding-guidelines.md +++ b/documentation/development/coding-guidelines.md @@ -107,12 +107,12 @@ Every function should have a header of the following format: * Arguments: * 0: The first argument * 1: The second argument - * + * * Return Value: * The return value * * Example: - * _bool = ["something", player] call ace_common_fnc_imanexample + * ["something", player] call ace_common_fnc_imanexample * * Public: [Yes/No] */ @@ -124,33 +124,39 @@ Every function should have a header of the following format: ### 4.1 Module/PBO specific Macro Usage The family of `GVAR` macro's define global variable strings or constants for use within a module. Please use these to make sure we follow naming conventions across all modules and also prevent duplicate/overwriting between variables in different modules. The macro family expands as follows, for the example of the module 'balls': -* `GVAR(face)` is `ace_balls_face` -* `QGVAR(face)` is `"ace_balls_face"` -* `EGVAR(balls,face)` is `ace_balls_face` -* `EGVAR(leg,face)` is `ace_leg_face` -* `QEGVAR(leg,face)` is `"ace_leg_face"` - + +| Macros | is the same as | +| -------|---------| +| `GVAR(face)` | ace_balls_face | +|`QGVAR(face)` | ace_balls_face | +| `EGVAR(balls,face)` | ace_balls_face | +| `EGVAR(leg,face)` | ace_leg_face | +| `QEGVAR(leg,face)` | ace_leg_face | There also exists the FUNC family of Macros: -* `FUNC(face)` is `ace_balls_fnc_face` or the call trace wrapper for that function. -* `EFUNC(balls,face)` is `ace_balls_fnc_face` or the call trace wrapper for that function. -* `EFUNC(leg,face)` is `ace_leg_fnc_face` or the call trace wrapper for that function. -* `DFUNC(face)` is `ace_balls_fnc_face` and will ALWAYS be the function global variable. -* `DEFUNC(leg,face)` is `ace_leg_fnc_face` and will ALWAYS be the function global variable. -* `QFUNC(face)` is `"ace_balls_fnc_face"` -* `QEFUNC(leg,face)` is `"ace_leg_fnc_face"` +| Macros | is the same as | +| -------|---------| +|`FUNC(face)` | ace_balls_fnc_face or the call trace wrapper for that function.| +|`EFUNC(balls,face)` | ace_balls_fnc_face or the call trace wrapper for that function.| +|`EFUNC(leg,face) `| ace_leg_fnc_face or the call trace wrapper for that function.| +|`DFUNC(face)` | ace_balls_fnc_face and will ALWAYS be the function global variable.| +|`DEFUNC(leg,face)` | ace_leg_fnc_face and will ALWAYS be the function global variable.| +|`QFUNC(face)` | ace_balls_fnc_face | +|`QEFUNC(leg,face)` |ace_leg_fnc_face| The `FUNC` and `EFUNC` macros should NOT be used inside `QUOTE` macros if the intention is to get the function name or assumed to be the function variable due to call tracing (see below). If you need to 100% always be sure that you are getting the function name or variable use the `DFUNC` or `DEFUNC` macros. For example `QUOTE(FUNC(face)) == "ace_balls_fnc_face"` would be an illegal use of `FUNC` inside `QUOTE`. Using `FUNC` or `EFUNC` inside a `QUOTE` macro is fine if the intention is for it to be executed as a function. -#### 4.1.1 FUNC Macros, Call Tracing, and Non-ACE/Anonymous Functions +#### 4.1.1 FUNC Macros, Call Tracing, and Non-ACE3 /Anonymous Functions -ACE implements a basic call tracing system that can dump the call stack on errors or wherever you want. To do this the `FUNC` macros in debug mode will expand out to include metadata about the call including line numbers and files. This functionality is automatic with the use of calls via `FUNC` and `EFUNC`, but any calls to other functions need to use the following macros: +ACE3 implements a basic call tracing system that can dump the call stack on errors or wherever you want. To do this the `FUNC` macros in debug mode will expand out to include metadata about the call including line numbers and files. This functionality is automatic with the use of calls via `FUNC` and `EFUNC`, but any calls to other functions need to use the following macros: -* `CALLSTACK(functionName)` example: `[] call CALLSTACK(cba_fnc_someFunction)` -* `CALLSTACK_NAMED(function,functionName)` example: `[] call CALLSTACK_NAMED(_anonymousFunction,'My anonymous function!')` +| Macro | example | +| -------|---------| +|`CALLSTACK(functionName)` | `[] call CALLSTACK(cba_fnc_someFunction)` | +|`CALLSTACK_NAMED(function,functionName)` | `[] call CALLSTACK_NAMED(_anonymousFunction,'My anonymous function!')`| These macros will call these functions with the appropriate wrappers and enable call logging into them (but to no further calls inside obviously). @@ -162,44 +168,64 @@ These macros will call these functions with the appropriate wrappers and enable #### 4.2.1 setVariable, getVariable family macros -* `GETVAR(player,MyVarName,false)` - `player getVariable ["MyVarName", false]` -* `GETMVAR(MyVarName,objNull)` - `missionNamespace getVariable ["MyVarName", objNull]` -* `GETUVAR(MyVarName,displayNull)` - `uiNamespace getVariable ["MyVarName", displayNull]` -* `SETVAR(player,MyVarName,127)` - `player setVariable ["MyVarName", 127]` -* `SETPVAR(player,MyVarName,127)` - `player setVariable ["MyVarName", 127, true]` -* `SETMVAR(MyVarName,player)` - `missionNamespace setVariable ["MyVarName", player]` -* `SETUVAR(MyVarName,_control)` - `uiNamespace setVariable ["MyVarName", _control]` +| Macro | is the same as | +| -------|---------| +|`GETVAR(player,MyVarName,false)` | player getVariable ["MyVarName", false]| +|`GETMVAR(MyVarName,objNull)` | missionNamespace getVariable ["MyVarName", objNull]| +|`GETUVAR(MyVarName,displayNull)` | uiNamespace getVariable ["MyVarName", displayNull]| +|`SETVAR(player,MyVarName,127)` | player setVariable ["MyVarName", 127] SETPVAR(player,MyVarName,127) player setVariable ["MyVarName", 127, true] | +|`SETMVAR(MyVarName,player)` | missionNamespace setVariable ["MyVarName", player] | +|`SETUVAR(MyVarName,_control)` | uiNamespace setVariable ["MyVarName", _control] | + +#### 4.2.2 STRING family macros + +Note that you need the strings in module stringtable.xml in the correct format +`STR_ACE__`
+Example:
+`STR_Balls_Banana`
+ +Script strings: + +| Macro | is the same as | +| -------|---------| +| `LSTRING(banana)` | "STR_ACE_balls_banana"| +| `ELSTRING(balls,banana)` | "STR_ACE_balls_banana"| + + +Config Strings (require `$` as first character): + +| Macro | is the same as | +| -------|---------| +| `CSTRING(banana)` | "$STR_ACE_balls_banana" | +| `ECSTRING(balls,banana)` | "$STR_ACE_balls_banana" | ## 5. Event Handlers -Event handlers in ACE are implemented through our event system. They should be used to trigger or allow triggering of specific functionality. +Event handlers in ACE3 are implemented through our event system. They should be used to trigger or allow triggering of specific functionality. The commands are listed below. -* `[eventName, eventCodeBlock] call ace_common_fnc_addEventHandler` adds an event handler with the event name and returns the event handler id. -* `[eventName, args] call ace_common_fnc_globalEvent` calls an event with the listed args on all machines, the local machine, and the server. -* `[eventName, args] call ace_common_fnc_serverEvent` calls an event just on the server computer (dedicated or self-hosted). -* `[eventName, targetObject(s), args] call ace_common_fnc_targetEvent` calls an event just on the targeted object or list of objects. -* `[eventName, args] call ace_common_fnc_localEvent` calls an event just on the local machine, useful for inter-module events. +| Even Handler | use | +| -------|---------| +|`[eventName, eventCodeBlock] call ace_common_fnc_addEventHandler` | adds an event handler with the event name and returns the event handler id.| +| `[eventName, args] call ace_common_fnc_globalEvent` | calls an event with the listed args on all machines, the local machine, and the server. | +|`[eventName, args] call ace_common_fnc_serverEvent` | calls an event just on the server computer (dedicated or self-hosted).| +| `[eventName, targetObject(s), args] call ace_common_fnc_targetEvent` | calls an event just on the targeted object or list of objects.| +|`[eventName, args] call ace_common_fnc_localEvent` | calls an event just on the local machine, useful for inter-module events.| Events can be removed or cleared with the following commands. -* `[eventName, eventHandlerId] call ace_common_fnc_removeEventHandler` will remove a specific event handler of the event name, using the ID returned from `ace_common_fnc_addEventHandler`. -* `[eventName] call ace_common_fnc_removeAllEventHandlers` will remove all event handlers for that type of event. +| Even Handler | use | +| -------|---------| +|`[eventName, eventHandlerId] call ace_common_fnc_removeEventHandler` | will remove a specific event handler of the event name, using the ID returned from `ace_common_fnc_addEventHandler`.| +|`[eventName] call ace_common_fnc_removeAllEventHandlers` | will remove all event handlers for that type of event.| -More information on the [ACE Events System](https://github.com/KoffeinFlummi/ACE3/wiki/ACE-Events-System) page. +More information on the [ACE3 Events System](https://github.com/KoffeinFlummi/ACE3/wiki/ACE-Events-System) page. ## 6. Hashes -Hashes are a variable type that store key value pairs. They are not implemented natively in SQF, so there are a number of macros and functions for their usage in ACE. If you are unfamiliar with the idea, they are similar in function to `setVariable`/`getVariable` but do not require an object to use. +Hashes are a variable type that store key value pairs. They are not implemented natively in SQF, so there are a number of macros and functions for their usage in ACE3. If you are unfamiliar with the idea, they are similar in function to `setVariable`/`getVariable` but do not require an object to use. The following example is a simple usage using our macros which will be explained further below. @@ -217,11 +243,13 @@ if(HASH_HASKEY(_hash, "key")) then { A description of the above macros is below. -* `HASHCREATE` is used to create an empty hash. -* `HASH_SET(hash, key, val)` will set the hash key to that value, a key can be anything, even objects. -* `HASH_GET(hash, key)` will return the value of that key (or nil if it doesn't exist). -* `HASH_HASKEY(hash, key)` will return true/false if that key exists in the hash. -* `HASH_REM(hash, key)` will remove that hash key. +| Macro | use | +| -------|---------| +|`HASHCREATE` | used to create an empty hash.| +| `HASH_SET(hash, key, val)` | will set the hash key to that value, a key can be anything, even objects. | +|`HASH_GET(hash, key)` | will return the value of that key (or nil if it doesn't exist). | +| `HASH_HASKEY(hash, key)` | will return true/false if that key exists in the hash. | +| `HASH_REM(hash, key)` | will remove that hash key.| ### 6.1 Hashlists @@ -256,11 +284,14 @@ HASH_SET(_anotherHash, "anotherKey", "another value"); As you can see above working with hashlists are fairly simple, a more in depth explanation of the macros is below. -* `HASHLIST_CREATELIST(keys)` creates a new hashlist with the default keys, pass [] for no default keys. -* `HASHLIST_CREATEHASH(hashlist)` returns a blank hash template from a hashlist. -* `HASHLIST_PUSH(hashList, hash)` pushes a new hash onto the end of the list. -* `HASHLIST_SELECT(hashlist, index)` returns the hash at that index in the list. -* `HASHLIST_SET(hashlist, index, hash)` sets a specific index to that hash. + +| Macro | use | +| -------|---------| +|`HASHLIST_CREATELIST(keys)` | creates a new hashlist with the default keys, pass [] for no default keys.| +|`HASHLIST_CREATEHASH(hashlist)` | returns a blank hash template from a hashlist.| +|`HASHLIST_PUSH(hashList, hash)` | pushes a new hash onto the end of the list.| +|`HASHLIST_SELECT(hashlist, index)` | returns the hash at that index in the list. | +|`HASHLIST_SET(hashlist, index, hash)` | sets a specific index to that hash.| #### 6.1.1 A note on pass by reference and hashes diff --git a/documentation/feature/advanced_ballistics.md b/documentation/feature/advanced_ballistics.md index 70123a0320..1f38a9d18e 100644 --- a/documentation/feature/advanced_ballistics.md +++ b/documentation/feature/advanced_ballistics.md @@ -25,7 +25,7 @@ The Advanced Ballistics module improves internal and external ballistics. ## 2. Usage ### 2.1 Protractor -Press Ctrl+Shift+K while using a compatible weapon to toggle the protractor. The red line indicates the current inclination angle in degrees. The protractor will disappear if you lower or holster your weapon. +Press Ctrl+⇧ Shift+K while using a compatible weapon to toggle the protractor. The red line indicates the current inclination angle in degrees. The protractor will disappear if you lower or holster your weapon. ## 3. Dependencies `ace_ballistics`, `ace_weather`, `ace_modules` diff --git a/documentation/feature/aircraft.md b/documentation/feature/aircraft.md index 25f4e52cad..ead653641d 100644 --- a/documentation/feature/aircraft.md +++ b/documentation/feature/aircraft.md @@ -35,7 +35,7 @@ Adds a HUD to the AH-9 based on the Comanche's HUD. ## 2. Usage ### 2.1 Switching flare modes -Press CTRL+C to switch between flare firing modes (Arma 3 default key bind `countermeasure mode`) +Press Ctrl+C to switch between flare firing modes (Arma 3 default key bind `countermeasure mode`) ## 3. Dependencies diff --git a/documentation/feature/attach.md b/documentation/feature/attach.md index a248f8657f..fcf7f2ef77 100644 --- a/documentation/feature/attach.md +++ b/documentation/feature/attach.md @@ -17,14 +17,14 @@ Adds an attachable IR strobe, which is only visible using night vision devices a ## 2. Usage ### 2.1 Attaching to yourself -- Use Self Interact CTRL+⊞ Win (ACE3 default). +- Use Self Interact Ctrl+⊞ Win (ACE3 default). - Select `Equipment`. - Select `Attach item`. - Select which item you want to attach. - Repeat the process to detach. ### 2.2 Attaching to a vehicle -- Interact with the vehicle ⊞ Win (ACE3 default). +- Interact with the vehicle ⊞ Win (ACE3 default). - Select `Attach item`. - Select your item and follow the instructions on the screen. - Repeat the process to detach. diff --git a/documentation/feature/captives.md b/documentation/feature/captives.md index 33b7ec3739..6ff4623016 100644 --- a/documentation/feature/captives.md +++ b/documentation/feature/captives.md @@ -31,7 +31,7 @@ Allows players to surrender. It renders the unit unable to move and with the han ### 2.2 Escorting a captive - Interact with the captive ⊞ win. - Select the `Escort prisoner` option. -- To stop escorting, use the mousewheel and select `Release` or use Self Interaction CTRL+⊞ win and select `Release`. +- To stop escorting, use the mousewheel and select `Release` or use Self Interaction Ctrl+⊞ win and select `Release`. ### 2.3 Loading and unloading a captive into/from a vehicle - Escort the captive. diff --git a/documentation/feature/concertina_wire.md b/documentation/feature/concertina_wire.md index 0c0cdb3ab6..8fd8a58eb6 100644 --- a/documentation/feature/concertina_wire.md +++ b/documentation/feature/concertina_wire.md @@ -13,7 +13,7 @@ A concertina wire is a type of barbed wire formed in large coils that can be exp ## 2. Usage ### 2.1 Deploying the concertina wire -- Approach the concertina coil and select ⊞ Win (ACE3 default) +- Approach the concertina coil and select ⊞ Win (ACE3 default) - Select `Deploy concertina wire`. - Follow the instructions on screen. diff --git a/documentation/feature/disarming.md b/documentation/feature/disarming.md index 02b8dc2163..f635b94901 100644 --- a/documentation/feature/disarming.md +++ b/documentation/feature/disarming.md @@ -14,7 +14,7 @@ You can search the inventory and disarm captured or unconscious units. ## 2. Usage ### 2.1 Searching and disarming -- Interact with the captured or unconscious unit ⊞ Win (ACE3 default key bind `Interaction Key`). +- Interact with the captured or unconscious unit ⊞ Win (ACE3 default key bind `Interaction Key`). - Select `Open inventory`. - Drag & Drop the items you wish to remove from the unit. diff --git a/documentation/feature/dragging.md b/documentation/feature/dragging.md index e3fdf0b6fe..d23935034d 100644 --- a/documentation/feature/dragging.md +++ b/documentation/feature/dragging.md @@ -14,9 +14,9 @@ This adds the option to drag or carry units or objects. ### 2.1 Dragging / Carrying units and objects - You can only drag or carry an unconscious unit. -- Interact with the unit or object ⊞ Win (ACE3 default key bind `Interact Key`). +- Interact with the unit or object ⊞ Win (ACE3 default key bind `Interact Key`). - Select `Drag` or `Carry`. -- To release, use the mouse wheel and select `Release` or use Self Interaction CTRL+⊞ Win and select `Release`. +- To release, use the mouse wheel and select `Release` or use Self Interaction Ctrl+⊞ Win and select `Release`. ## 3. Dependencies diff --git a/documentation/feature/explosives.md b/documentation/feature/explosives.md index a88b9ae1b4..071252ffc0 100644 --- a/documentation/feature/explosives.md +++ b/documentation/feature/explosives.md @@ -20,18 +20,18 @@ Enables attaching explosives to vehicles. ## 2. Usage ### 2.1 Placing explosives -- Use self interaction CTRL+⊞ Win (ACE3 default key bind `Self Interaction Key`). +- Use self interaction Ctrl+⊞ Win (ACE3 default key bind `Self Interaction Key`). - Select `Explosives`. - Choose your explosive type and follow the instructions on the screen. ### 2.2 Arming and detonating explosives -- Interact with the explosive ⊞ Win (ACE3 default key bind `Interact Key`). +- Interact with the explosive ⊞ Win (ACE3 default key bind `Interact Key`). - Choose the arming method. - For clackers use Self Interaction `Explosives` → `Detonate` and choose the corresponding Firing Device. ### 2.3 Defusing explosives - A `Defusal Kit` is required. -- Interact with the explosive ⊞ Win. +- Interact with the explosive ⊞ Win. - Select `Disarm`. - You are safe to pick it up after the action has completed. diff --git a/documentation/feature/fcs.md b/documentation/feature/fcs.md index b66cad8522..713fba4dcf 100644 --- a/documentation/feature/fcs.md +++ b/documentation/feature/fcs.md @@ -21,13 +21,13 @@ Anti air cannons can now use airburst ammunition. It will explode on the FCS' ze ### 2.1 Engaging moving targets - Place the crosshair on the enemy vehicle. -- Press and hold TAB (ACE 3 default key bind `Lock Target [Hold]`) and follow the target for about 2 seconds. -- Release TAB. +- Press and hold Tab ↹ (ACE 3 default key bind `Lock Target [Hold]`) and follow the target for about 2 seconds. +- Release Tab ↹. - The optic is now adjusted sideways to ensure a hit. ### 2.2 Ranging stationary targets - Place the crosshair on the object to range. -- Tap TAB +- Tap Tab ↹ - The optic is now adjusted. *NOTE: GBU guidance is **DISABLED** as of ACE3 3.0.1* diff --git a/documentation/feature/hearing.md b/documentation/feature/hearing.md index 5389f0c3d5..5c3c7e3960 100644 --- a/documentation/feature/hearing.md +++ b/documentation/feature/hearing.md @@ -19,7 +19,7 @@ missile launchers will be equipped with those, but remember to put them in. ### 2.1 Equipping earplugs - For this you need the `Earplugs` item. -- Press the self interaction key CTRL + ⊞ Win (ACE3 default key bind `Self Interaction Key`). +- Press the self interaction key Ctrl + ⊞ Win (ACE3 default key bind `Self Interaction Key`). - Select `Equipment`. - Select `Earplugs in`. - Same method to remove them but the option is `Earplugs out`. diff --git a/documentation/feature/huntIR.md b/documentation/feature/huntIR.md index e4e690dac3..205b812e33 100644 --- a/documentation/feature/huntIR.md +++ b/documentation/feature/huntIR.md @@ -17,10 +17,10 @@ NOTE: the HuntIR round doesn't work with modded weapons without a compatibility - To be able to connect to the IR CMOS camera you'll need a `HuntIR monitor`. - Fire the HuntIR round as high as possible over the area you want to observe. - Open the `HuntIR monitor`. - - To open the `HuntIR monitor` self interact CTRL + ⊞ Win (ACE3 default) + - To open the `HuntIR monitor` self interact Ctrl + ⊞ Win (ACE3 default) - Select `Equipment`. - Select `Activate HuntIR monitor`. -- You now have control of the IR CMOS camera to close the monitor press ESC or ⊞ Win +- You now have control of the IR CMOS camera to close the monitor press ESC or ⊞ Win ### 2.2 IR CMOS camera controls diff --git a/documentation/feature/javelin.md b/documentation/feature/javelin.md index 8cf59c0a08..a4187a0b82 100644 --- a/documentation/feature/javelin.md +++ b/documentation/feature/javelin.md @@ -20,12 +20,12 @@ The Titan / Javelin now posses the ability to be used in top down attack or dire - For this feature you need to have a compatible launcher. - Fully zoom in with the launcher. - Switch to thermals N (Arma 3 default key bind `Night vision`). -- While keeping your aim steadily on target press and hold TAB (ACE3 default key bind `Lock Target [Hold]`). +- While keeping your aim steadily on target press and hold Tab ↹ (ACE3 default key bind `Lock Target [Hold]`). - When the sound changes and a cross appears on the screen the target is locked and you're able to fire. ### 2.2 Switching fire mode - For this feature you need to have a compatible launcher. -- When aiming with your launcher press CTRL + TAB. +- When aiming with your launcher press Ctrl + Tab ↹. - On the right side of the screen (for most launchers) you should see that `TOP`is now illumiated in green which means that your missile will be fired in top down mode. ## 3. Dependencies diff --git a/documentation/feature/logistics_uavbattery.md b/documentation/feature/logistics_uavbattery.md index 2920d4b7a4..367d161340 100644 --- a/documentation/feature/logistics_uavbattery.md +++ b/documentation/feature/logistics_uavbattery.md @@ -15,7 +15,7 @@ Adds an item `ACE_UAVBattery` that allows refuelling / recharging of the "Darter ### 2.1 Recharging the darter - For this you need a `UAV battery` and the UAV needs to be a quad-copter. -- Interact with the UAV ⊞ Win (ACE3 default key bind `Interact Key`) +- Interact with the UAV ⊞ Win (ACE3 default key bind `Interact Key`) - Select `Recharge` ## 3. Dependencies diff --git a/documentation/feature/logistics_wirecutter.md b/documentation/feature/logistics_wirecutter.md index 077e3b48cb..71eb6ac62f 100644 --- a/documentation/feature/logistics_wirecutter.md +++ b/documentation/feature/logistics_wirecutter.md @@ -16,7 +16,7 @@ Adds an item `ACE_wirecutter` that allows cutting of fences in Arma 3 and AllInA ### 2.1 Using the wirecutter - For this you need a `Wirecutter`. - Approach the fence you want to cut. -- Press the interaction key ⊞ Win (ACE3 default key bind `Interaction Key`). +- Press the interaction key ⊞ Win (ACE3 default key bind `Interaction Key`). - Find the interaction point and select `Cut Fence` (the only option). ## 3. Dependencies diff --git a/documentation/feature/magazinerepack.md b/documentation/feature/magazinerepack.md index 191f12d2b7..304f3e7f96 100644 --- a/documentation/feature/magazinerepack.md +++ b/documentation/feature/magazinerepack.md @@ -15,7 +15,7 @@ Adds the ability to repack magazines of the same type. ### 2.1 Repacking - For this you need multiple half empty mags of the same type. -- Press the self interaction button CTRL + ⊞ Win (ACE3 default key bind `Self Interaction Key`). +- Press the self interaction button Ctrl + ⊞ Win (ACE3 default key bind `Self Interaction Key`). - Select `Repack magazines`. - Select the type of magazines you want to repack. diff --git a/documentation/feature/maptools.md b/documentation/feature/maptools.md index a67412343f..1618721c82 100644 --- a/documentation/feature/maptools.md +++ b/documentation/feature/maptools.md @@ -22,10 +22,10 @@ If you are equipped with a vanilla GPS it will be shown on the map. (You don't n ### 2.1 Using map tools - For this you need to have `Map Tools`. - Open the map M (Arma 3 default key bind `Map`). -- Press the self interaction key CTRL + ⊞ Win (ACE3 default key bind `Self Interaction Key`). +- Press the self interaction key Ctrl + ⊞ Win (ACE3 default key bind `Self Interaction Key`). - Select `Map tools`. - Select the type of tools you want to use. -- Note that you can drag the Roamer (map tool) around with LMB and rotate it with CTRL + LMB. +- Note that you can drag the Roamer (map tool) around with LMB and rotate it with Ctrl + LMB. ### 2.2 Drawing lines - To draw lines `Map Tools` are not required. diff --git a/documentation/feature/microdagr.md b/documentation/feature/microdagr.md index 3ff9562293..2ed13875f2 100644 --- a/documentation/feature/microdagr.md +++ b/documentation/feature/microdagr.md @@ -1,26 +1,148 @@ --- layout: wiki title: MicroDAGR -description: +description: A GPS device and much more ! group: feature parent: wiki --- -## Overview +For an easier time reading don't forget that you can view all chapters on the right side of the page by clicking on Show/hide under table of content. -### Sub-feature 1 -Short description of sub-feature 1. +## 1. Overview -### Sub-feature 2 -Short description of sub-feature 2. +"Military operations rely on the position, +navigation and timing (PNT) data that GPS +can provide. In combat, the accuracy of +PNT data can mean the difference between +life and death. Non-military GPS receivers +simply aren’t good enough when lives are +on the line" (Extracted from the real life manual) + +that's where the MicroDAGR comes in, here's a list of it's features (in arma 3) : + +- Compass and headings. +- Date and hour synced to the mission. +- Elevation (above or below sea level) +- Current speed. +- GPS with topographic and satellite view. +- Creating, naming, deleting waypoints. +- Friendly identification (BLUFOR tracker need to be on) +- The MicroDAGR is also able to connect to your vector to retrieve data from it. + +## 2. Usage + +Please note that the numbers in 2.1 are going to be referred to as `1` `2` etc when explaining how to use the MicroDAGR + +### 2.1 Bringing the MicroDAGR + +- Self interact Ctrl+⊞ Win. +- Select `Equipment`. +- Select `configure MicroDAGR`. + +### 2.2 The MicroDAGR interface + + + +number | function | +------ | ----------------------------------------------------- | +`1` | Options menu and hour display. +`2` | Grid position `e` is west to east `n` is south to north. +`3` | Elevation above sea level in meters. +`4` & `11` | Compass heading. +`5` & `10` | Current speed. +`6` | Date (mission). +`7` | Main menu button. +`8` | Compass menu button. +`9` | Map menu button. +`12` | Compass +`13` | Player heading (your eyes). +`14` | Center the map on your position. +`15` | Map zoom. +`16` | Map dezoom +`17` | Your position. +`18` | Waypoint creation menu +`19` | Waypoint editing menu. +`20` | Connection menu. +`21` | Settings menu. + +### 2.3 Waypoints +#### 2.3.1 Adding waypoints +- There's three ways of adding a waypoint. + +- First way: Using the waypoint creation menu. + - Find the position you want to mark on the map. + - Get it's map grid. + - The grid is composed of 6 digits. + - The first three digits are read west to east. (Top of the map screen). + - The last three are read south to north. (Left side of the map screen). + - Go to the options menu (Click in `1` area, above the bar). + - Click on `Mark`(`18`). + - Enter the grid number. + - Press OK. + - Enter the desired name of the waypoint. + - Press OK. + +- Second way: Using the waypoint menu + - Find the position you want to mark on the map. + - Get it's map grid. + - The grid is composed of 6 digits. + - The first three digits are read west to east. (Top of the map screen). + - The last three are read south to north. (Left side of the map screen). + - Go to the options menu (Click in `1` area, above the bar). + - CLick on `Waypoints` (`19`). + - Click on `Add`. + - Enter the grid number. + - Press OK. + - Enter the name of the waypoint. + - Press OK. + +- Third way: Using the Map menu. + - Go to the map menu (click on `9`) + - double left click on the position where you want your waypoint. + - Enter the name of the waypoint. + - Press OK. + +#### 2.3.2 Setting a waypoint +- Go to the options menu (Click in `1` area, above the bar). +- CLick on `Waypoints` (`19`). +- Select the waypoint. +- Click on `SetWp`. -## Usage +- Once a waypoint is set: + - It's heading, elevation and distance are marked on the main menu. (`7`) + - It's heading, direction, grid position and name are marked in the compass menu (`8`) + - A marker appear at the waypoint grid location in the map menu (`9`) -Short overview of how to use the feature, e.g. menu options, key bindings, -instructions. May not apply to all modules. +#### 2.3.3 Deleting a waypoint +- Go to the options menu (Click in `1` area, above the bar). +- CLick on `Waypoints` (`19`). +- Select the waypoint. +- Click on `Delete`. + +### 2.4 Switching between mils and degrees +- Go to the options menu (Click in `1` area, above the bar). +- Click on `Settings` (`21`) +- Double left click on the unit next to `Angular unit:` + +### 2.5 Switching between topographical and satellite view + +- Go to the map menu (`9`) +- Click on the map menu button again (`9`) + +### 2.6 Retrieving data from the vector +- For this you obviously need a `vector 21`. +- Go to the options menu (Click in `1` area, above the bar). +- Click on `Connect to` (`20`). +- Pull out your `vector 21`. + - Press and hold both R and Tab ↹ until the red pointing circle appears. + - Sight the circle on the object and release both keys. +- The data on the main menu now have changed, you can now see the azimuth the range and the elevation of the point you sighted. +- Note that the compass menu also changed and now features the azimuth, compass bearing, distance and grid position of the point you sighted. + +Note that the results of the measure you took won't change until you do an other measure. -## Dependencies +## 3. Dependencies `ace_common` diff --git a/documentation/feature/missileguidance.md b/documentation/feature/missileguidance.md index 7dd4d6a304..7231741d1a 100644 --- a/documentation/feature/missileguidance.md +++ b/documentation/feature/missileguidance.md @@ -13,14 +13,14 @@ Adds the AMG framework, for more information about it refer to the [AMG framewor ## 2. Usage ### 2.1 Switching fire mode -- Press CTRL + TAB the LED's on the right of the UI will change. +- Press Ctrl + Tab ↹ the LED's on the right of the UI will change. - `TOP` for top down mode. - `DIR` for direct mode. ### 2.2 Locking - Fully zoom in by using NUMPAD + - Switch to thermals by pressing N the `FLTR` LED should light up. -- Aim at the target and hold TAB a crosshair will appear and the `SEEK` LED will light up. +- Aim at the target and hold Tab ↹ a crosshair will appear and the `SEEK` LED will light up. - Fire! ## 3. Dependencies diff --git a/documentation/feature/mk6mortar.md b/documentation/feature/mk6mortar.md index eb4b22caaf..90b6512ed5 100644 --- a/documentation/feature/mk6mortar.md +++ b/documentation/feature/mk6mortar.md @@ -18,7 +18,7 @@ ACE3 adds wind deflection for shells as well as a rangetable to accurately take ### 2.2 Working with the rangetable - To open the table: - - Self interact CTRL + ⊞ Win + - Self interact Ctrl + ⊞ Win - Select `equipment`. - Select `Open 82mm Rangetable`. @@ -34,7 +34,7 @@ ACE3 adds wind deflection for shells as well as a rangetable to accurately take - Once you finished your maths, it's time to aim, get the cross of the mortar on target, if you don't see it use a waypoint if possible. In our case ELEV is 1339-2 = 1337. - On the right side of the screen, while looking through the mk6 scope you should see ELV, we need to match this number with the one we found. - - To adjust the ELV use pageUP and pageDOWN. + - To adjust the ELV use Page Up and page Down. - Once the number you found and ELV are the same FIRE ! - On top of that you can calculate the time the shell will take to land by using the third row from the left, in our case the shell need to travel 2000m that's 20xthe number indicated. so 20x0,5 = 10s. diff --git a/documentation/feature/modules.md b/documentation/feature/modules.md new file mode 100644 index 0000000000..3d8f27136b --- /dev/null +++ b/documentation/feature/modules.md @@ -0,0 +1,14 @@ +--- +layout: wiki +title: modules +group: feature +parent: wiki +--- + +## 1. Overview + +This is taking care of module initialization **DO NOT REMOVE**. + +## 2. Dependencies + +`ace_main` reminder: **DO NOT REMOVE**. diff --git a/documentation/feature/overheating.md b/documentation/feature/overheating.md index dcbc4c1939..b97df663ce 100644 --- a/documentation/feature/overheating.md +++ b/documentation/feature/overheating.md @@ -25,12 +25,12 @@ Adds the ability to changes barrels on machine guns to compensate for those effe ### 2.2 Swapping barrels - For this you need a `Spare barrel` and a compatible weapon. -- Press self interaction CTRL + ⊞ Win (ACE3 default key bind `Self Interaction Key`). +- Press self interaction Ctrl + ⊞ Win (ACE3 default key bind `Self Interaction Key`). - Select `Equipment`. - Select `Swap barrel`. ### 2.3 Checking your barrel temperature -- Press self interaction CTRL + ⊞ Win. +- Press self interaction Ctrl + ⊞ Win. - Select `Equipment`. - Select `Check weapon temperature`. diff --git a/documentation/feature/rangecard.md b/documentation/feature/rangecard.md index b40e76cd49..6c588de45a 100644 --- a/documentation/feature/rangecard.md +++ b/documentation/feature/rangecard.md @@ -13,7 +13,7 @@ Add a range card that updates itself for your weapon and the type of ammo you're ## 2. Usage ### 2.1 Opening the range card -- Open the self interaction menu CTRL + ⊞ Win +- Open the self interaction menu Ctrl + ⊞ Win - Select `Equipment` - Select `Open Range Card` diff --git a/documentation/feature/reload.md b/documentation/feature/reload.md index 3cd4db1c8d..1d8637c290 100644 --- a/documentation/feature/reload.md +++ b/documentation/feature/reload.md @@ -14,7 +14,7 @@ Hides the actual round count of magazines and removes the icon when the current ## 2. Usage ### 2.1 Checking your ammo -- Press CTRL + R (ACE3 default key bind `Check Ammo`). +- Press Ctrl + R (ACE3 default key bind `Check Ammo`). ## 3. Dependencies diff --git a/documentation/feature/reloadlaunchers.md b/documentation/feature/reloadlaunchers.md index 773814a73e..3bfa739360 100644 --- a/documentation/feature/reloadlaunchers.md +++ b/documentation/feature/reloadlaunchers.md @@ -13,7 +13,7 @@ Add the ability to reload someone else's launcher. ### 2. Usage ### 2.1 Reloading someone else's launcher -- Press the interaction key ⊞ Win and aim at your buddy's launcher. +- Press the interaction key ⊞ Win and aim at your buddy's launcher. - Select `reload launcher`. - Select the type of ammo. diff --git a/documentation/feature/respawn.md b/documentation/feature/respawn.md index 753784b52b..08d3bf7feb 100644 --- a/documentation/feature/respawn.md +++ b/documentation/feature/respawn.md @@ -23,7 +23,7 @@ Adds rallypoints to all 3 sides to enable teleportation from base spawn to FOB's ### 2.1 Using rallypoints - For this to work pre-emptive preparations need to be made by the mission maker. - Approach the rallypoint flagpole -- Use the interaction key ⊞ Win (ACE3 default key bind `Interaction key`). +- Use the interaction key ⊞ Win (ACE3 default key bind `Interaction key`). - Select teleport to (base / rallypoint). diff --git a/documentation/feature/safemode.md b/documentation/feature/safemode.md index 9024ac973b..0bcf4435de 100644 --- a/documentation/feature/safemode.md +++ b/documentation/feature/safemode.md @@ -14,8 +14,8 @@ You can now use the safety mode of any weapon. Switching weapon modes takes the ## 2. Usage ### 2.1 Switching safety on / off -- To turn it on press CTRL + ` (QWERTY layout) (ACE3 default key bind `Safe Mode`). -- To turn it off press CTRL + ` (QWERTY layout) again or switch firing mode. +- To turn it on press Ctrl + ` (QWERTY layout) (ACE3 default key bind `Safe Mode`). +- To turn it off press Ctrl + ` (QWERTY layout) again or switch firing mode. ## 3. Dependencies diff --git a/documentation/feature/sandbags.md b/documentation/feature/sandbags.md index 5e0011b755..9c0c90b7e0 100644 --- a/documentation/feature/sandbags.md +++ b/documentation/feature/sandbags.md @@ -15,7 +15,7 @@ Note that those sandbags are affected by physics, a rocket will send them flying ### 2.1 Placing the sandbags - You'll need at least one `sandbag (empty)`. - You need to be over a grass area / sand area to be able to fill the sandbag. -- Self interact CTRL+⊞ Win (ACE3 default). +- Self interact Ctrl+⊞ Win (ACE3 default). - Select `Deploy sandbag`. - Follow the instruction on screen. diff --git a/documentation/feature/scopes.md b/documentation/feature/scopes.md index 9e70641f71..cfcee4a687 100644 --- a/documentation/feature/scopes.md +++ b/documentation/feature/scopes.md @@ -15,16 +15,16 @@ Allows snipers to adjust their scopes horizontally and vertically in mils. ### 2.1 Adjusting your scope vertically Please not that the following key combinations are ACE3 default key binds. -- Minor adjustment up pageUP. -- Minor adjustment down pageDOWN. -- Major adjustment up Shift + pageUP. -- Major adjustment down Shift + pageDOWN. +- Minor adjustment up Page Up. +- Minor adjustment down page Down. +- Major adjustment up ⇧ Shift + Page Up. +- Major adjustment down ⇧ Shift + page Down. ### 2.2 Adjusting your scope horizontally -- Minor adjustment right CTRL + pageUP. -- Minor adjustment left CTRL + pageDOWN. -- Major adjustment right CTRL + Shift + pageUP. -- Major adjustment left CTRL + Shift + pageDOWN. +- Minor adjustment right Ctrl + Page Up. +- Minor adjustment left Ctrl + page Down. +- Major adjustment right Ctrl + ⇧ Shift + Page Up. +- Major adjustment left Ctrl + ⇧ Shift + page Down. ## 3. Dependencies diff --git a/documentation/feature/spotting_scope.md b/documentation/feature/spotting_scope.md index ead45d540f..a2b9bdf19d 100644 --- a/documentation/feature/spotting_scope.md +++ b/documentation/feature/spotting_scope.md @@ -12,7 +12,7 @@ Adds a deployable spotting scope. ## 2. Usage ### 2.1 Deploying the spotting scope -- Self interact CTRL+⊞ Win (ACE3 default). +- Self interact Ctrl+⊞ Win (ACE3 default). - Select `Equipment`. - Select `Place spotting scope` (note that the scope will be at your feet). diff --git a/documentation/feature/tacticallader.md b/documentation/feature/tacticallader.md index f992236db6..9ed4b9459d 100644 --- a/documentation/feature/tacticallader.md +++ b/documentation/feature/tacticallader.md @@ -12,9 +12,9 @@ Adds a deployable ladder with adjustable height that you can transport on your b ## 2. Usage ### 2.1 Deploying the ladder -- Self interact CTRL+⊞ Win (ACE3 default). +- Self interact Ctrl+⊞ Win (ACE3 default). - Select `Deploy ladder`. -- You can adjust it's position and height by interacting with it ⊞ Win (ACE3 default) and following the instructions on screen. +- You can adjust it's position and height by interacting with it ⊞ Win (ACE3 default) and following the instructions on screen. ## 3. Dependencies diff --git a/documentation/feature/tripod.md b/documentation/feature/tripod.md index 4f57dc05a7..f6f49ba3d1 100644 --- a/documentation/feature/tripod.md +++ b/documentation/feature/tripod.md @@ -13,12 +13,12 @@ Adds a packable tripod deployable on the field. It features a flat part to deplo ### 2.1 deploying the tripod - Note that you need a `SSWT kit` in your inventory. -- Self interact CTRL+⊞ Win. +- Self interact Ctrl+⊞ Win. - Select `Equipment` - Select `Place SSWT kit`. -To adjust or pick up the tripod just interact with it ⊞ Win and select the desired action. +To adjust or pick up the tripod just interact with it ⊞ Win and select the desired action. ## 3. Dependencies -`ace_interaction` \ No newline at end of file +`ace_interaction` diff --git a/documentation/feature/vector.md b/documentation/feature/vector.md index 025012959a..4dbf4440a1 100644 --- a/documentation/feature/vector.md +++ b/documentation/feature/vector.md @@ -32,12 +32,12 @@ The Vector is controlled with 2 keys: the azimuth key and the range key; Ta #### 2.2 Azimuth Measuring Azimuth -- Press and hold the TAB until the azimuth is displayed. +- Press and hold the Tab ↹ until the azimuth is displayed. #### 2.3 Slope distance and Azimuth Measuring Slope distance and Azimuth -- Press and hold both R and TAB until the red pointing circle appears. +- Press and hold both R and Tab ↹ until the red pointing circle appears. - Sight the circle on the object and release both keys. #### 2.4 Horizontal distance and height difference @@ -49,35 +49,35 @@ The Vector is controlled with 2 keys: the azimuth key and the range key; Ta #### 2.5 Azimuth and Inclination Measuring Azimuth and Inclination -- Tap TAB once then press and hold it until the azimuth and inclination is displayed. +- Tap Tab ↹ once then press and hold it until the azimuth and inclination is displayed. #### 2.6 Distance between two points Measuring Distance between two points - Press and hold R until the red pointing circle appears. -- Sight the circle on the first object and tap TAB while further holding R. The first measurement is confirmed ("1-P" = first point). +- Sight the circle on the first object and tap Tab ↹ while further holding R. The first measurement is confirmed ("1-P" = first point). - Sight the second object and release R. #### 2.7 Horizontal and vertical distance between two points Measuring Horizontal and vertical distance between two points - Tap R once then press and hold it until the red pointing circle appears. -- Sight the circle on the object and tap TAB once. The first measurement is confirmed ("1-P" = first point). +- Sight the circle on the object and tap Tab ↹ once. The first measurement is confirmed ("1-P" = first point). - Sight the second object and release R. #### 2.8 Horizontal distance and azimuth between two points Measuring Horizontal distance and azimuth between two points -- Press and hold TAB until the azimuth appears. -- Sight the circle on the first object and tap R while further holding TAB. The first measurement is confirmed ("1-P" = first point). -- Sight the second object and release TAB. +- Press and hold Tab ↹ until the azimuth appears. +- Sight the circle on the first object and tap R while further holding Tab ↹. The first measurement is confirmed ("1-P" = first point). +- Sight the second object and release Tab ↹. ### 2.9 Fall of shot Measuring Fall of shot -- Tap TAB once then press and hold it until the azimuth appears. -- Sight the circle on the object and tap R while further holding TAB. The first measurement is confirmed ("1-P" = first point). -- Sight the Fall of shot and release TAB. The left digits display the left (`L`)/right (`r`) correction value in meter and the right digits display the longer (`A` = add)/shorter (`d` = drop) correction value in meter. If R is tapped the height correction values will be displayed (`UP` and `dn`). +- Tap Tab ↹ once then press and hold it until the azimuth appears. +- Sight the circle on the object and tap R while further holding Tab ↹. The first measurement is confirmed ("1-P" = first point). +- Sight the Fall of shot and release Tab ↹. The left digits display the left (`L`)/right (`r`) correction value in meter and the right digits display the longer (`A` = add)/shorter (`d` = drop) correction value in meter. If R is tapped the height correction values will be displayed (`UP` and `dn`). ## 3. Dependencies diff --git a/documentation/feature/vehicles.md b/documentation/feature/vehicles.md index 3f78b654b2..a58d314194 100644 --- a/documentation/feature/vehicles.md +++ b/documentation/feature/vehicles.md @@ -41,6 +41,10 @@ MBT main guns and mortars can no longer lock on enemies. The AT rounds of both n - To turn the engine on press 2. - To turn the engine off press 1. +### 2.2 Turning the speed limiter on / off +- To turn the speed limiter on press Del. +- To turn it off press Del again. + ## 3. Dependencies `ace_common` diff --git a/documentation/framework/carry-drag.md b/documentation/framework/carry-drag.md index 988797ba79..cfa4eb13af 100644 --- a/documentation/framework/carry-drag.md +++ b/documentation/framework/carry-drag.md @@ -26,3 +26,71 @@ class CfgVehicles { }; ``` +## 2. Functions + +**NOTE THAT THE FOLLOWING FUNCTIONS ARE NOT PUBLIC AND THUS MAY CHANGE IN THE FUTURE.**
+ + +Also note that if the item is too heavy you won't be able to carry / drag it, the mass is also affected by what's inside it.
+To bypass this empty the object and / or use setMass.
+ +### 2.1 Enabling / disabling dragging + +`ace_dragging_fnc_setDraggable.`
+Enable the object to be dragged.
+ +| Arguments | | +--------------| -------- | +0 | Any object (Object) +1: | true to enable dragging, false to disable (Bool) +2:| Position offset for attachTo command (Array, optional; default: [0,0,0]) +3: | Direction in degree to rotate the object after attachTo (Number, optional; default: 0) +Return value: NONE
+ +#### 2.1.1 example 1: +``` +[foo,true,[0,2,0],45] call ace_dragging_fnc_setDraggable +``` +| Arguments | | +--------------| -------- | +0:| foo (my object) +1:| true (dragging is enabled) +2:| `[0,2,0]` (0 meters sideways, 2 meters forward, 0 meters upwards) +3:| 45 (the object is rotated by 45°) + +#### 2.1.2 example 2 +``` +[bar,false,[3,-2,2],20] call ace_dragging_fnc_setDraggable +``` + +| Arguments | | +--------------| -------- | +0:| bar (object) +1:| false (dragging is disabled) +2:| 3 meters sideways, -2 meters backwards, 2 meters upwards +3:| the object is rotated by 20° + +### 2.2 Enabling / disabling carrying +`ace_dragging_fnc_setCarryable.`
+Enable the object to be carried.
+ +| Arguments | | +--------------| -------- | +0 | Any object (Object) +1:| true to enable carrying, false to disable (Bool) +2:| Position offset for attachTo command (Array, optional; default: [0,1,1]) +3:| Direction in degree to rotate the object after attachTo (Number, optional; default: 0) +Return value: NONE
+ + +#### 2.1.1 example 1: +``` +[foo,true,[0,3,1],10] call ace_dragging_fnc_setCarryable +``` +| Arguments | | +--------------| -------- | +0:| foo (my object) +1:| true (carrying is enabled) +2:| `[0,2,0]` (0 meters sideways, 3 meters forward, 1 meters upwards) +3:| 10 (the object is rotated by 10°) + From 6b4eeedbad046f0259950bab67aee133c6063479 Mon Sep 17 00:00:00 2001 From: SzwedzikPL Date: Wed, 1 Jul 2015 21:21:09 +0200 Subject: [PATCH 60/86] headgear influence on hearing --- addons/hearing/CfgWeapons.hpp | 35 +++++++++++++++++++ addons/hearing/config.cpp | 2 +- addons/hearing/functions/fnc_earRinging.sqf | 21 +++++++---- addons/hearing/functions/fnc_updateVolume.sqf | 9 +++++ .../development/ace3-config-entries.md | 2 ++ documentation/feature/hearing.md | 5 ++- 6 files changed, 66 insertions(+), 8 deletions(-) diff --git a/addons/hearing/CfgWeapons.hpp b/addons/hearing/CfgWeapons.hpp index 11ad91f658..adcdb2217b 100644 --- a/addons/hearing/CfgWeapons.hpp +++ b/addons/hearing/CfgWeapons.hpp @@ -12,4 +12,39 @@ class CfgWeapons { mass = 1; }; }; + + class H_HelmetB; + class H_HelmetCrew_B: H_HelmetB { + GVAR(protection) = 1; + GVAR(lowerVolume) = 0.80; + }; + class H_HelmetCrew_0: H_HelmetCrew_B {}; + class H_HelmetCrew_I: H_HelmetCrew_B {}; + + class H_CrewHelmetHeli_B: H_HelmetB { + GVAR(protection) = 0.75; + GVAR(lowerVolume) = 0.70; + }; + class H_CrewHelmetHeli_O: H_CrewHelmetHeli_B {}; + class H_CrewHelmetHeli_I: H_CrewHelmetHeli_B {}; + + class H_PilotHelmetHeli_B: H_HelmetB { + GVAR(protection) = 0.75; + GVAR(lowerVolume) = 0.70; + }; + class H_PilotHelmetHeli_O: H_PilotHelmetHeli_B {}; + class H_PilotHelmetHeli_I: H_PilotHelmetHeli_B {}; + + class H_PilotHelmetFighter_B: H_HelmetB { + GVAR(protection) = 1; + GVAR(lowerVolume) = 0.80; + }; + class H_PilotHelmetFighter_O: H_PilotHelmetFighter_B {}; + class H_PilotHelmetFighter_I: H_PilotHelmetFighter_B {}; + + class H_Cap_headphones: H_HelmetB { + GVAR(protection) = 0.5; + GVAR(lowerVolume) = 0.60; + }; + class H_Cap_marshal: H_Cap_headphones {}; }; diff --git a/addons/hearing/config.cpp b/addons/hearing/config.cpp index 1007b2095d..5d130e589a 100644 --- a/addons/hearing/config.cpp +++ b/addons/hearing/config.cpp @@ -5,7 +5,7 @@ class CfgPatches { units[] = {}; weapons[] = {"ACE_EarPlugs"}; requiredVersion = REQUIRED_VERSION; - requiredAddons[] = {"ace_interaction"}; + requiredAddons[] = {"ace_interaction", "A3_Characters_F", "A3_Characters_F_Kart"}; author[] = {"KoffeinFlummi", "esteldunedain", "HopeJ", "commy2", "Rocko", "Rommel", "Ruthberg"}; authorUrl = "https://github.com/KoffeinFlummi/"; VERSION_CONFIG; diff --git a/addons/hearing/functions/fnc_earRinging.sqf b/addons/hearing/functions/fnc_earRinging.sqf index 96482f5b79..74e2768c4c 100644 --- a/addons/hearing/functions/fnc_earRinging.sqf +++ b/addons/hearing/functions/fnc_earRinging.sqf @@ -27,6 +27,15 @@ if (_unit getVariable ["ACE_hasEarPlugsin", false]) then { _strength = _strength / 4; }; +//headgear hearing protection +if(headgear _unit != "") then { + private ["_protection"]; + _protection = (getNumber (configFile >> "CfgWeapons" >> (headgear _unit) >> QGVAR(protection))) min 1; + if(_protection > 0) then { + _strength = _strength * (1 - _protection); + }; +}; + _unit setVariable [QGVAR(dv), (_unit getVariable [QGVAR(dv), 0]) + _strength]; if (GVAR(earRingingPFH) != -1) exitWith {}; @@ -35,7 +44,7 @@ GVAR(earRingingPFH) = [{ EXPLODE_1_PVT(_this select 0,_unit); private ["_prior"]; _prior = (_unit getvariable [QGVAR(dv), 0]) min 20; - + if (!alive _unit || _prior <= 0) exitWith { _unit setVariable [QGVAR(dv), 0]; _unit setVariable [QGVAR(prior), 0]; @@ -47,7 +56,7 @@ GVAR(earRingingPFH) = [{ GVAR(earRingingPFH) = -1; [_this select 1] call cba_fnc_removePerFrameHandler; }; - + if (((_unit getvariable [QGVAR(dv), 0]) - (_unit getvariable [QGVAR(prior), 0])) > 2) then { if (ACE_time > GVAR(time3)) then { GVAR(beep2) = false; @@ -58,16 +67,16 @@ GVAR(earRingingPFH) = [{ GVAR(time3) = ACE_time + 5; }; }; - + _unit setvariable [QGVAR(prior), _prior]; GVAR(volume) = (1 - (_prior / 20)) max 0; - + if (_prior > 19.75) then { _unit setvariable [QGVAR(deaf), true]; } else { _unit setvariable [QGVAR(deaf), false]; }; - + if ((_unit getvariable [QGVAR(deaf), false]) && {ACE_time > GVAR(time4)}) then { playSound "ACE_Combat_Deafness"; GVAR(beep2) = true; @@ -77,7 +86,7 @@ GVAR(earRingingPFH) = [{ // Hearing takes longer to return to normal after it hits rock bottom _unit setvariable [QGVAR(dv), _prior - (0.5 * (GVAR(volume) max 0.1))]; - + if (_prior > 10) then { //check if the ringing is already being played if (ACE_time > GVAR(time2)) then { diff --git a/addons/hearing/functions/fnc_updateVolume.sqf b/addons/hearing/functions/fnc_updateVolume.sqf index cfec318dc0..5502f38bf4 100644 --- a/addons/hearing/functions/fnc_updateVolume.sqf +++ b/addons/hearing/functions/fnc_updateVolume.sqf @@ -46,6 +46,15 @@ if ([ACE_player] call FUNC(hasEarPlugsIn)) then { _volume = _volume min GVAR(EarplugsVolume); }; +// Headgear can reduce hearing +if(headgear ACE_player != "") then { + private ["_lowerVolume"]; + _lowerVolume = (getNumber (configFile >> "CfgWeapons" >> (headgear ACE_player) >> QGVAR(lowerVolume))) min 1; + if(_lowerVolume > 0) then { + _volume = _volume min (1 - _lowerVolume); + }; +}; + // Reduce volume if player is unconscious if (ACE_player getVariable ["ACE_isUnconscious", false]) then { _volume = _volume min GVAR(UnconsciousnessVolume); diff --git a/documentation/development/ace3-config-entries.md b/documentation/development/ace3-config-entries.md index d87ca4145e..1e28bec44d 100644 --- a/documentation/development/ace3-config-entries.md +++ b/documentation/development/ace3-config-entries.md @@ -63,6 +63,8 @@ ace_barrelLength ace_laserpointer ace_nextmodeclass ace_modedescription +ace_hearing_protection +ace_hearing_lowerVolume ``` diff --git a/documentation/feature/hearing.md b/documentation/feature/hearing.md index 5389f0c3d5..1328971de4 100644 --- a/documentation/feature/hearing.md +++ b/documentation/feature/hearing.md @@ -11,10 +11,13 @@ parent: wiki ### 1.1 Hearing damage simulation Introduces hearing damage caused by nearby explosions and large-caliber weapons. -### 1.2 Earplugs +### 1.2 Earplugs Adds earplugs to mitigate that effect. Soldiers with high caliber weapons or missile launchers will be equipped with those, but remember to put them in. +### 1.3 Helmets +Some types of helmets can mitigate hearing damage also (ie. crewman helmet, pilot helmet etc.). + ## 2. Usage ### 2.1 Equipping earplugs From 46e51f6788e79d6abaae36021609cd2acca8fb1e Mon Sep 17 00:00:00 2001 From: SzwedzikPL Date: Wed, 1 Jul 2015 22:25:19 +0200 Subject: [PATCH 61/86] rhs headgear compat --- optionals/compat_rhs_afrf3/CfgWeapons.hpp | 23 +++++++++++- optionals/compat_rhs_afrf3/config.cpp | 2 +- optionals/compat_rhs_usf3/CfgWeapons.hpp | 43 +++++++++++++++++++++-- optionals/compat_rhs_usf3/config.cpp | 2 +- 4 files changed, 65 insertions(+), 5 deletions(-) diff --git a/optionals/compat_rhs_afrf3/CfgWeapons.hpp b/optionals/compat_rhs_afrf3/CfgWeapons.hpp index 4c3e2e425e..0c3d3dfac4 100644 --- a/optionals/compat_rhs_afrf3/CfgWeapons.hpp +++ b/optionals/compat_rhs_afrf3/CfgWeapons.hpp @@ -57,7 +57,7 @@ class CfgWeapons ACE_barrelTwist=195.072; ACE_barrelLength=589.28; }; - + class rhs_acc_sniper_base; class rhs_acc_pso1m2: rhs_acc_sniper_base { ACE_ScopeAdjust_Vertical[] = { 0, 0 }; @@ -65,8 +65,29 @@ class CfgWeapons ACE_ScopeAdjust_VerticalIncrement = 0.0; ACE_ScopeAdjust_HorizontalIncrement = 0.5; }; + class Launcher_Base_F; class rhs_weap_rpg7: Launcher_Base_F { ace_reloadlaunchers_enabled = 1; }; + + class H_HelmetB; + class rhs_tsh4: H_HelmetB { + ace_hearing_protection = 1; + ace_hearing_lowerVolume = 0.80; + }; + class rhs_tsh4_ess: rhs_tsh4 {}; + class rhs_tsh4_bala: rhs_tsh4 {}; + class rhs_tsh4_ess_bala: rhs_tsh4 {}; + + class rhs_zsh7a: H_HelmetB { + ace_hearing_protection = 1; + ace_hearing_lowerVolume = 0.80; + }; + class rhs_zsh7a_mike: rhs_zsh7a {}; + + class rhs_gssh18: H_HelmetB { + ace_hearing_protection = 0.5; + ace_hearing_lowerVolume = 0.60; + }; }; \ No newline at end of file diff --git a/optionals/compat_rhs_afrf3/config.cpp b/optionals/compat_rhs_afrf3/config.cpp index 5e88ad2830..123f80b566 100644 --- a/optionals/compat_rhs_afrf3/config.cpp +++ b/optionals/compat_rhs_afrf3/config.cpp @@ -5,7 +5,7 @@ class CfgPatches { units[] = {}; weapons[] = {}; requiredVersion = REQUIRED_VERSION; - requiredAddons[] = {"rhs_c_weapons"}; + requiredAddons[] = {"rhs_c_weapons", "rhs_c_troops"}; author[]={"Ruthberg"}; VERSION_CONFIG; }; diff --git a/optionals/compat_rhs_usf3/CfgWeapons.hpp b/optionals/compat_rhs_usf3/CfgWeapons.hpp index e2e1efc00e..d5ab60f3eb 100644 --- a/optionals/compat_rhs_usf3/CfgWeapons.hpp +++ b/optionals/compat_rhs_usf3/CfgWeapons.hpp @@ -5,7 +5,7 @@ class CfgWeapons class Rifle_Base_F; class srifle_EBR_F; class launch_O_Titan_F; - + class rhs_weap_XM2010_Base_F: Rifle_Base_F { ACE_barrelTwist=254.0; ACE_barrelLength=609.6; @@ -51,11 +51,13 @@ class CfgWeapons ACE_twistDirection=0; ACE_barrelLength=508.0; }; + class hgun_ACPC2_F; class rhsusf_weap_m1911a1: hgun_ACPC2_F { ACE_barrelTwist=406.4; ACE_barrelLength=127.0; }; + class rhsusf_acc_sniper_base; class rhsusf_acc_LEUPOLDMK4: rhsusf_acc_sniper_base { ACE_ScopeAdjust_Vertical[] = { -4, 30 }; @@ -69,13 +71,50 @@ class CfgWeapons ACE_ScopeAdjust_VerticalIncrement = 0.1; ACE_ScopeAdjust_HorizontalIncrement = 0.1; }; + class rhs_weap_fgm148 : launch_O_Titan_F { ace_javelin_enabled = 1; weaponInfoType = "ACE_RscOptics_javelin"; modelOptics = "\z\ace\addons\javelin\data\reticle_titan.p3d"; - + canLock = 0; lockingTargetSound[] = {"",0,1}; lockedTargetSound[] = {"",0,1}; }; + + class rhsusf_opscore_01; + class rhsusf_cvc_helmet: rhsusf_opscore_01 { + ace_hearing_protection = 1; + ace_hearing_lowerVolume = 0.80; + }; + class rhsusf_cvc_green_helmet: rhsusf_cvc_helmet {}; + class rhsusf_cvc_ess: rhsusf_cvc_helmet {}; + class rhsusf_cvc_green_ess: rhsusf_cvc_ess {}; + + class H_PilotHelmetHeli_B; + class H_CrewHelmetHeli_B; + class rhsusf_hgu56p: H_PilotHelmetHeli_B + { + ace_hearing_protection = 0.75; + ace_hearing_lowerVolume = 0.70; + }; + class rhsusf_hgu56p_mask: H_CrewHelmetHeli_B + { + ace_hearing_protection = 0.75; + ace_hearing_lowerVolume = 0.70; + }; + + class H_HelmetB; + class RHS_jetpilot_usaf: H_HelmetB { + ace_hearing_protection = 1; + ace_hearing_lowerVolume = 0.80; + }; + + class rhsusf_ach_helmet_ocp; + class rhsusf_opscore_01: rhsusf_ach_helmet_ocp { + ace_hearing_protection = 0.50; + ace_hearing_lowerVolume = 0.60; + }; + class rhsusf_opscore_01_tan: rhsusf_opscore_01 {}; + class rhsusf_opscore_03_ocp: rhsusf_opscore_01 {}; }; diff --git a/optionals/compat_rhs_usf3/config.cpp b/optionals/compat_rhs_usf3/config.cpp index 9a13565ccf..3e9aee6ec7 100644 --- a/optionals/compat_rhs_usf3/config.cpp +++ b/optionals/compat_rhs_usf3/config.cpp @@ -5,7 +5,7 @@ class CfgPatches { units[] = {}; weapons[] = {}; requiredVersion = REQUIRED_VERSION; - requiredAddons[] = {"rhsusf_c_weapons"}; + requiredAddons[] = {"rhsusf_c_weapons", "rhsusf_c_troops"}; author[]={"Ruthberg"}; VERSION_CONFIG; }; From 89305473a236a477e136af2283b5c4f4517d7425 Mon Sep 17 00:00:00 2001 From: PabstMirror Date: Wed, 1 Jul 2015 15:50:14 -0500 Subject: [PATCH 62/86] Add performance note. --- addons/interact_menu/stringtable.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/addons/interact_menu/stringtable.xml b/addons/interact_menu/stringtable.xml index 1f9988d471..a521b3d9d5 100644 --- a/addons/interact_menu/stringtable.xml +++ b/addons/interact_menu/stringtable.xml @@ -252,7 +252,7 @@ Show actions for buildings - Adds interaction actions for opening doors and mounting ladders on buildings. + Adds interaction actions for opening doors and mounting ladders on buildings. (Note: There is a performance cost when opening interaction menu, especially in towns) From c2e4ee431f2d1336e2cd5174a846e6ff644ed5bf Mon Sep 17 00:00:00 2001 From: SzwedzikPL Date: Thu, 2 Jul 2015 13:56:56 +0200 Subject: [PATCH 63/86] no pain effect in zeus camera --- addons/medical/XEH_postInit.sqf | 86 +++++++++++++++++---------------- 1 file changed, 44 insertions(+), 42 deletions(-) diff --git a/addons/medical/XEH_postInit.sqf b/addons/medical/XEH_postInit.sqf index 0b51f57165..53ba7eee32 100644 --- a/addons/medical/XEH_postInit.sqf +++ b/addons/medical/XEH_postInit.sqf @@ -174,52 +174,54 @@ GVAR(lastHeartBeatSound) = ACE_time; if ((ACE_time > GVAR(lastHeartBeat) + _interval)) then { GVAR(lastHeartBeat) = ACE_time; - // Pain effect - _strength = (_pain - (ACE_player getvariable [QGVAR(painSuppress), 0])) max 0; - _strength = _strength * (ACE_player getVariable [QGVAR(painCoefficient), GVAR(painCoefficient)]); - if (GVAR(painEffectType) == 1) then { - GVAR(effectPainCC) ppEffectEnable false; - if (_pain > (ACE_player getvariable [QGVAR(painSuppress), 0]) && {alive ACE_player}) then { - _strength = _strength * 0.15; - GVAR(effectPainCA) ppEffectEnable true; - GVAR(effectPainCA) ppEffectAdjust [_strength, _strength, false]; - GVAR(effectPainCA) ppEffectCommit 0.01; - [{ - GVAR(effectPainCA) ppEffectAdjust [(_this select 0), (_this select 0), false]; - GVAR(effectPainCA) ppEffectCommit (_this select 1); - }, [_strength * 0.1, _interval * 0.2], _interval * 0.05, 0] call EFUNC(common,waitAndExecute); - [{ - GVAR(effectPainCA) ppEffectAdjust [(_this select 0), (_this select 0), false]; + // Pain effect, no pain effect in zeus camera + if (isNull (findDisplay 312)) then { + _strength = (_pain - (ACE_player getvariable [QGVAR(painSuppress), 0])) max 0; + _strength = _strength * (ACE_player getVariable [QGVAR(painCoefficient), GVAR(painCoefficient)]); + if (GVAR(painEffectType) == 1) then { + GVAR(effectPainCC) ppEffectEnable false; + if (_pain > (ACE_player getvariable [QGVAR(painSuppress), 0]) && {alive ACE_player}) then { + _strength = _strength * 0.15; + GVAR(effectPainCA) ppEffectEnable true; + GVAR(effectPainCA) ppEffectAdjust [_strength, _strength, false]; GVAR(effectPainCA) ppEffectCommit 0.01; - }, [_strength * 0.7], _interval * 0.3, 0] call EFUNC(common,waitAndExecute); - [{ - GVAR(effectPainCA) ppEffectAdjust [(_this select 0), (_this select 0), false]; - GVAR(effectPainCA) ppEffectCommit (_this select 1); - }, [_strength * 0.1, _interval * 0.55], _interval * 0.4, 0] call EFUNC(common,waitAndExecute); + [{ + GVAR(effectPainCA) ppEffectAdjust [(_this select 0), (_this select 0), false]; + GVAR(effectPainCA) ppEffectCommit (_this select 1); + }, [_strength * 0.1, _interval * 0.2], _interval * 0.05, 0] call EFUNC(common,waitAndExecute); + [{ + GVAR(effectPainCA) ppEffectAdjust [(_this select 0), (_this select 0), false]; + GVAR(effectPainCA) ppEffectCommit 0.01; + }, [_strength * 0.7], _interval * 0.3, 0] call EFUNC(common,waitAndExecute); + [{ + GVAR(effectPainCA) ppEffectAdjust [(_this select 0), (_this select 0), false]; + GVAR(effectPainCA) ppEffectCommit (_this select 1); + }, [_strength * 0.1, _interval * 0.55], _interval * 0.4, 0] call EFUNC(common,waitAndExecute); + } else { + GVAR(effectPainCA) ppEffectEnable false; + }; } else { GVAR(effectPainCA) ppEffectEnable false; - }; - } else { - GVAR(effectPainCA) ppEffectEnable false; - if (_pain > (ACE_player getvariable [QGVAR(painSuppress), 0]) && {alive ACE_player}) then { - _strength = _strength * 0.9; - GVAR(effectPainCC) ppEffectEnable true; - GVAR(effectPainCC) ppEffectAdjust [1,1,0, [1,1,1,1], [0,0,0,0], [1,1,1,1], [1 - _strength,1 - _strength,0,0,0,0.2,2]]; - GVAR(effectPainCC) ppEffectCommit 0.01; - [{ - GVAR(effectPainCC) ppEffectAdjust [1,1,0, [1,1,1,1], [0,0,0,0], [1,1,1,1], [1 - (_this select 0),1 - (_this select 0),0,0,0,0.2,2]]; - GVAR(effectPainCC) ppEffectCommit (_this select 1); - }, [_strength * 0.1, _interval * 0.2], _interval * 0.05, 0] call EFUNC(common,waitAndExecute); - [{ - GVAR(effectPainCC) ppEffectAdjust [1,1,0, [1,1,1,1], [0,0,0,0], [1,1,1,1], [1 - (_this select 0),1 - (_this select 0),0,0,0,0.2,2]]; + if (_pain > (ACE_player getvariable [QGVAR(painSuppress), 0]) && {alive ACE_player}) then { + _strength = _strength * 0.9; + GVAR(effectPainCC) ppEffectEnable true; + GVAR(effectPainCC) ppEffectAdjust [1,1,0, [1,1,1,1], [0,0,0,0], [1,1,1,1], [1 - _strength,1 - _strength,0,0,0,0.2,2]]; GVAR(effectPainCC) ppEffectCommit 0.01; - }, [_strength * 0.7], _interval * 0.3, 0] call EFUNC(common,waitAndExecute); - [{ - GVAR(effectPainCC) ppEffectAdjust [1,1,0, [1,1,1,1], [0,0,0,0], [1,1,1,1], [1 - (_this select 0),1 - (_this select 0),0,0,0,0.2,2]]; - GVAR(effectPainCC) ppEffectCommit (_this select 1); - }, [_strength * 0.1, _interval * 0.55], _interval * 0.4, 0] call EFUNC(common,waitAndExecute); - } else { - GVAR(effectPainCC) ppEffectEnable false; + [{ + GVAR(effectPainCC) ppEffectAdjust [1,1,0, [1,1,1,1], [0,0,0,0], [1,1,1,1], [1 - (_this select 0),1 - (_this select 0),0,0,0,0.2,2]]; + GVAR(effectPainCC) ppEffectCommit (_this select 1); + }, [_strength * 0.1, _interval * 0.2], _interval * 0.05, 0] call EFUNC(common,waitAndExecute); + [{ + GVAR(effectPainCC) ppEffectAdjust [1,1,0, [1,1,1,1], [0,0,0,0], [1,1,1,1], [1 - (_this select 0),1 - (_this select 0),0,0,0,0.2,2]]; + GVAR(effectPainCC) ppEffectCommit 0.01; + }, [_strength * 0.7], _interval * 0.3, 0] call EFUNC(common,waitAndExecute); + [{ + GVAR(effectPainCC) ppEffectAdjust [1,1,0, [1,1,1,1], [0,0,0,0], [1,1,1,1], [1 - (_this select 0),1 - (_this select 0),0,0,0,0.2,2]]; + GVAR(effectPainCC) ppEffectCommit (_this select 1); + }, [_strength * 0.1, _interval * 0.55], _interval * 0.4, 0] call EFUNC(common,waitAndExecute); + } else { + GVAR(effectPainCC) ppEffectEnable false; + }; }; }; }; From 13999fdd3195755dcdb2a02ea0897e67586c492c Mon Sep 17 00:00:00 2001 From: SzwedzikPL Date: Thu, 2 Jul 2015 19:36:34 +0200 Subject: [PATCH 64/86] finddisplay into curatorcamera --- addons/medical/XEH_postInit.sqf | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/addons/medical/XEH_postInit.sqf b/addons/medical/XEH_postInit.sqf index 53ba7eee32..f9f821eeb3 100644 --- a/addons/medical/XEH_postInit.sqf +++ b/addons/medical/XEH_postInit.sqf @@ -92,7 +92,7 @@ GVAR(effectTimeBlood) = ACE_time; [{ private["_bleeding", "_blood"]; // Zeus interface is open or player is dead; disable everything - if (!(isNull (findDisplay 312)) or !(alive ACE_player)) exitWith { + if (!(isNull curatorCamera) or !(alive ACE_player)) exitWith { GVAR(effectUnconsciousCC) ppEffectEnable false; GVAR(effectUnconsciousRB) ppEffectEnable false; GVAR(effectBlindingCC) ppEffectEnable false; @@ -175,7 +175,7 @@ GVAR(lastHeartBeatSound) = ACE_time; GVAR(lastHeartBeat) = ACE_time; // Pain effect, no pain effect in zeus camera - if (isNull (findDisplay 312)) then { + if (isNull curatorCamera) then { _strength = (_pain - (ACE_player getvariable [QGVAR(painSuppress), 0])) max 0; _strength = _strength * (ACE_player getVariable [QGVAR(painCoefficient), GVAR(painCoefficient)]); if (GVAR(painEffectType) == 1) then { From 70862c5de938faf30ea58ae39ead70fd4e7ce3ec Mon Sep 17 00:00:00 2001 From: gienkov Date: Thu, 2 Jul 2015 23:55:26 +0200 Subject: [PATCH 65/86] PL translation --- addons/common/stringtable.xml | 3 +++ addons/explosives/stringtable.xml | 2 ++ addons/interact_menu/stringtable.xml | 5 ++++- addons/interaction/stringtable.xml | 6 +++++- addons/map/stringtable.xml | 2 ++ addons/medical/stringtable.xml | 4 +++- addons/optionsmenu/stringtable.xml | 2 ++ addons/sitting/stringtable.xml | 3 +++ addons/spectator/stringtable.xml | 30 ++++++++++++++-------------- addons/switchunits/stringtable.xml | 2 +- 10 files changed, 40 insertions(+), 19 deletions(-) diff --git a/addons/common/stringtable.xml b/addons/common/stringtable.xml index 353f3dea5e..ccc94b361b 100644 --- a/addons/common/stringtable.xml +++ b/addons/common/stringtable.xml @@ -578,16 +578,19 @@ Toggle Handheld Device Seleccionar dispositivo de mano Ativa dispositivo de mão + Przełącz urządzenie podręczne Close Handheld Device Cerrar dispositivo de mano Fecha dispositivo de mão + Zamknij urządzenie podręczne Cycle Handheld Devices Cambiar dispositivos de mano Troca dispositivos de mão + Następne urządzenie podręczne \ No newline at end of file diff --git a/addons/explosives/stringtable.xml b/addons/explosives/stringtable.xml index 3227da5dff..40e436656b 100644 --- a/addons/explosives/stringtable.xml +++ b/addons/explosives/stringtable.xml @@ -548,10 +548,12 @@ Explode on defusal? Explosão no desarmamento? + Eksplozja przy rozbrajaniu? Enable certain explosives to explode on defusal? Default: Yes Ativa certos explosivos para detonar no desarmamento? Padrão: Sim + Spraw, aby niektóre ładunki wybuchowe eksplodowały przy próbie ich rozbrojenia? Domyślnie:Tak diff --git a/addons/interact_menu/stringtable.xml b/addons/interact_menu/stringtable.xml index a521b3d9d5..f87880e83c 100644 --- a/addons/interact_menu/stringtable.xml +++ b/addons/interact_menu/stringtable.xml @@ -87,6 +87,7 @@ Zeus Actions + Akcje Zeusa Interaction - Text Max @@ -250,9 +251,11 @@ Show actions for buildings + Pokazuj akcje dla budynków Adds interaction actions for opening doors and mounting ladders on buildings. (Note: There is a performance cost when opening interaction menu, especially in towns) + Dodaje opcje interakcji dla otwierania drzwi oraz wchodzenia po drabinach do budynków. Uwaga: Użycie tej opcji może spowodować spadek wydajności menu interakcji, szczególnie w dużych miastach. - + \ No newline at end of file diff --git a/addons/interaction/stringtable.xml b/addons/interaction/stringtable.xml index 609a8c6dae..2e99ed0cef 100644 --- a/addons/interaction/stringtable.xml +++ b/addons/interaction/stringtable.xml @@ -830,15 +830,19 @@ Behaviour + Zachowanie Careless + Beztroski Formation + Formacja Speed Mode + Prędkość - + \ No newline at end of file diff --git a/addons/map/stringtable.xml b/addons/map/stringtable.xml index 8e3ae52da5..89e7bf5571 100644 --- a/addons/map/stringtable.xml +++ b/addons/map/stringtable.xml @@ -91,10 +91,12 @@ BFT Enable RFA ativo + Aktywuj BFT Enable Blue Force Tracking. Default: No Ativa Rastreio de Forças Azuis. Padrão: Não + Aktywuj Blue Force Tracking. Domyślnie: Nie Interval diff --git a/addons/medical/stringtable.xml b/addons/medical/stringtable.xml index e2fee86715..e836ebf395 100644 --- a/addons/medical/stringtable.xml +++ b/addons/medical/stringtable.xml @@ -2918,11 +2918,13 @@ Remote Controlled AI IA controlada remotamente IA controlada remotamente + Zdalnie sterowane AI Treat remote controlled units as AI not players? ¿Tratar unidades remotamente controladas como IA? Tratar unidades remotamente controladas como IA? + Traktuj jednostki zdalnie sterowane (przez Zeusa) jako AI, nie jako graczy? Disabled @@ -3436,7 +3438,7 @@ - + Moduł ten pozwala przypisać klasę medyczną wybranym jednostkom. Dieses Modul legt fest welche Einheit ein Sanitäter ist. Tento modul určuje, která jednotka je zdravotník. Este módulo determina qual unidade é um paramédico. diff --git a/addons/optionsmenu/stringtable.xml b/addons/optionsmenu/stringtable.xml index 7b4d88f61f..3af9ca8b30 100644 --- a/addons/optionsmenu/stringtable.xml +++ b/addons/optionsmenu/stringtable.xml @@ -347,11 +347,13 @@ ACE News Noticias ACE Notícias do ACE + Wiadomości ACE Show News on Main Menu Mostrar noticias en el menú principal Mostrar notícias no menu principal + Pokazuj wiadomości ACE w menu głównym \ No newline at end of file diff --git a/addons/sitting/stringtable.xml b/addons/sitting/stringtable.xml index 5565da1e11..2287ba2ae8 100644 --- a/addons/sitting/stringtable.xml +++ b/addons/sitting/stringtable.xml @@ -14,14 +14,17 @@ Enable Sitting Habilitar opção para sentar + Aktywuj siadanie Sitting Sentado + Siadanie This module allows you to disable the ability to sit on chairs and toilets. Este módulo permite que você desabilite a capacidade de sentar-se em cadeiras e banheiros. + Moduł ten pozwala na włączenie lub wyłączenie możliwości siadania na krzesłach i toaletach. \ No newline at end of file diff --git a/addons/spectator/stringtable.xml b/addons/spectator/stringtable.xml index 72a29abe9c..368944c3d3 100644 --- a/addons/spectator/stringtable.xml +++ b/addons/spectator/stringtable.xml @@ -3,105 +3,105 @@ Spectator - + Obserwator Enable Spectator - + Aktywuj obserwatora Begin spectating on player death? - + Włącz obserwatora po śmierci gracza? Player Side Only - + Tylko strona gracza Only spectate units belonging to player's side? - + Pozwól obserwować jednostki będące tylko po stronie gracza? Spectate AI - + Obserwacja AI Allow spectating of AI units? - + Pozwól obserwować jednostki AI? Track Units - + Śledź jednostki Track units' movements throughout mission? - + Śledź ruch jednostek w trakcie misji? Start Position - + Pozycja startowa Use this module as a starting position for spectator camera? - + Użyj pozycji modułu jako pozycje startową dla kamery obserwatora? End Mission - + Zakończ misję End mission when all players dead (default BIS behaviour)? - + Zakończ misję kiedy wszyscy gracze będą martwi (domyślne zachowanie BIS)? View Distance - + Zasięg widzenia OK - + OK diff --git a/addons/switchunits/stringtable.xml b/addons/switchunits/stringtable.xml index b392b09ca7..2d0bc91314 100644 --- a/addons/switchunits/stringtable.xml +++ b/addons/switchunits/stringtable.xml @@ -131,7 +131,7 @@ - + Moduł ten pozwala na zmianę strony w trakcie gry. Tento modul umožňuje přepínání mazi dostupnými stranami. Este módulo permite mudar o lado à disposição dos jogadores. From d036639b46f2a55002ae273b4c18068a903fa7bf Mon Sep 17 00:00:00 2001 From: SilentSpike Date: Fri, 3 Jul 2015 02:14:58 +0100 Subject: [PATCH 66/86] Adding hideUnit functions to ace_common --- addons/common/XEH_postInit.sqf | 6 +++- addons/common/XEH_preInit.sqf | 2 ++ addons/common/functions/fnc_hideUnit.sqf | 34 ++++++++++++++++++++++ addons/common/functions/fnc_unhideUnit.sqf | 34 ++++++++++++++++++++++ 4 files changed, 75 insertions(+), 1 deletion(-) create mode 100644 addons/common/functions/fnc_hideUnit.sqf create mode 100644 addons/common/functions/fnc_unhideUnit.sqf diff --git a/addons/common/XEH_postInit.sqf b/addons/common/XEH_postInit.sqf index 3796a4fdc8..22513ec468 100644 --- a/addons/common/XEH_postInit.sqf +++ b/addons/common/XEH_postInit.sqf @@ -6,7 +6,7 @@ //Singe PFEH to handle execNextFrame and waitAndExec: [{ private ["_entry"]; - + //Handle the waitAndExec array: while {((count GVAR(waitAndExecArray)) > 0) && {((GVAR(waitAndExecArray) select 0) select 0) <= ACE_Time}} do { _entry = GVAR(waitAndExecArray) deleteAt 0; @@ -56,6 +56,10 @@ ["setFuel", {(_this select 0) setFuel (_this select 1)}] call FUNC(addEventhandler); ["setSpeaker", {(_this select 0) setSpeaker (_this select 1)}] call FUNC(addEventhandler); +if (isServer) then { + ["hideObjectGlobal", {(_this select 0) hideObjectGlobal (_this select 1)}] call FUNC(addEventHandler); +}; + // hack to get PFH to work in briefing [QGVAR(onBriefingPFH), "onEachFrame", { if (ACE_time > 0) exitWith { diff --git a/addons/common/XEH_preInit.sqf b/addons/common/XEH_preInit.sqf index 72e85e4b6b..54f374fcc2 100644 --- a/addons/common/XEH_preInit.sqf +++ b/addons/common/XEH_preInit.sqf @@ -102,6 +102,7 @@ PREP(goKneeling); PREP(hadamardProduct); PREP(hasItem); PREP(hasMagazine); +PREP(hideUnit); PREP(inheritsFrom); PREP(insertionSort); PREP(interpolateFromArray); @@ -179,6 +180,7 @@ PREP(toBin); PREP(toBitmask); PREP(toHex); PREP(toNumber); +PREP(unhideUnit); PREP(uniqueElementsOnly); PREP(unloadPerson); PREP(unloadPersonLocal); diff --git a/addons/common/functions/fnc_hideUnit.sqf b/addons/common/functions/fnc_hideUnit.sqf new file mode 100644 index 0000000000..b3cd6f7b77 --- /dev/null +++ b/addons/common/functions/fnc_hideUnit.sqf @@ -0,0 +1,34 @@ +/* + * Author: SilentSpike (based on muteUnit) + * Globally hides a unit. This allows the handling of more than one reason to hide an object globally. + * + * Arguments: + * 0: Unit + * 1: Reason to hide the unit + * + * Return Value: + * nil + * + * Example: + * [ACE_Player, "SpectatorMode"] call ace_common_fnc_hideUnit + * + * Public: No + */ + +#include "script_component.hpp" + +PARAMS_2(_unit,_reason); + +if (isNull _unit) exitWith {}; + +private "_setHiddenReasons"; +_setHiddenReasons = _unit getVariable [QGVAR(setHiddenReasons), []]; + +if !(_reason in _setHiddenReasons) then { + _setHiddenReasons pushBack _reason; + _unit setVariable [QGVAR(setHiddenReasons), _setHiddenReasons, true]; +}; + +if !(isObjectHidden _unit) then { + ["hideObjectGlobal",[_unit,true]] call FUNC(serverEvent); +}; diff --git a/addons/common/functions/fnc_unhideUnit.sqf b/addons/common/functions/fnc_unhideUnit.sqf new file mode 100644 index 0000000000..190be47664 --- /dev/null +++ b/addons/common/functions/fnc_unhideUnit.sqf @@ -0,0 +1,34 @@ +/* + * Author: SilentSpike (based on unmuteUnit) + * Globally unhides a unit. Only unhides if the last reason was removed. + * + * Arguments: + * 0: Unit + * 1: Reason to unhide the unit + * + * Return Value: + * nil + * + * Example: + * [ACE_Player, "SpectatorMode"] call ace_common_fnc_unhideUnit + * + * Public: No + */ + +#include "script_component.hpp" + +PARAMS_2(_unit,_reason); + +if (isNull _unit) exitWith {}; + +private "_setHiddenReasons"; +_setHiddenReasons = _unit getVariable [QGVAR(setHiddenReasons), []]; + +if (_reason in _setHiddenReasons) then { + _setHiddenReasons deleteAt (_setHiddenReasons find _reason); + _unit setVariable [QGVAR(setHiddenReasons), _setHiddenReasons, true]; +}; + +if (_setHiddenReasons isEqualTo []) then { + ["hideObjectGlobal",[_unit,false]] call FUNC(serverEvent); +}; From ca36b62356985d80683a5d10f6f2aad9df97da0b Mon Sep 17 00:00:00 2001 From: SilentSpike Date: Fri, 3 Jul 2015 13:11:55 +0100 Subject: [PATCH 67/86] Zeus interactions string cleanup --- addons/interaction/ACE_ZeusActions.hpp | 68 +++++++++++++------------- addons/interaction/stringtable.xml | 6 +-- 2 files changed, 35 insertions(+), 39 deletions(-) diff --git a/addons/interaction/ACE_ZeusActions.hpp b/addons/interaction/ACE_ZeusActions.hpp index 913e7a7c85..80626f6d43 100644 --- a/addons/interaction/ACE_ZeusActions.hpp +++ b/addons/interaction/ACE_ZeusActions.hpp @@ -43,26 +43,26 @@ class ACE_ZeusActions { displayName = CSTRING(Zeus_Behaviour); class careless { - displayName = CSTRING(Zeus_Behaviour_careless); + displayName = "$STR_Combat_Careless"; statement = "{ _x setBehaviour 'CARELESS'; } forEach (curatorSelected select 1);"; }; class safe { - displayName = "$STR_safe"; + displayName = "$STR_Combat_Safe"; icon = "\A3\UI_F_Curator\Data\RscCommon\RscAttributeBehaviour\safe_ca.paa"; statement = "{ _x setBehaviour 'SAFE'; } forEach (curatorSelected select 1);"; }; class aware { - displayName = "$STR_aware"; + displayName = "$STR_Combat_Aware"; icon = "\A3\UI_F_Curator\Data\RscCommon\RscAttributeBehaviour\aware_ca.paa"; statement = "{ _x setBehaviour 'AWARE'; } forEach (curatorSelected select 1);"; }; class combat { - displayName = "$STR_combat"; + displayName = "$STR_Combat_Combat"; icon = "\A3\UI_F_Curator\Data\RscCommon\RscAttributeBehaviour\combat_ca.paa"; statement = "{ _x setBehaviour 'COMBAT'; } forEach (curatorSelected select 1);"; }; class stealth { - displayName = "$STR_stealth"; + displayName = "$STR_Combat_Stealth"; icon = "\A3\UI_F_Curator\Data\RscCommon\RscAttributeBehaviour\stealth_ca.paa"; statement = "{ _x setBehaviour 'STEALTH'; } forEach (curatorSelected select 1);"; }; @@ -71,17 +71,17 @@ class ACE_ZeusActions { displayName = CSTRING(Zeus_Speed); class limited { - displayName = "$STR_speed_limited"; + displayName = "$STR_Speed_Limited"; icon = "\A3\UI_F_Curator\Data\RscCommon\RscAttributeSpeedMode\limited_ca.paa"; statement = "{_x setSpeedMode 'LIMITED';} forEach (curatorSelected select 1);"; }; class normal { - displayName = "$STR_speed_normal"; + displayName = "$STR_Speed_Normal"; icon = "\A3\UI_F_Curator\Data\RscCommon\RscAttributeSpeedMode\normal_ca.paa"; statement = "{_x setSpeedMode 'NORMAL';} forEach (curatorSelected select 1);"; }; class full { - displayName = "$STR_speed_full"; + displayName = "$STR_Speed_Full"; icon = "\A3\UI_F_Curator\Data\RscCommon\RscAttributeSpeedMode\full_ca.paa"; statement = "{_x setSpeedMode 'FULL';} forEach (curatorSelected select 1);"; }; @@ -114,47 +114,47 @@ class ACE_ZeusActions { displayName = CSTRING(Zeus_Formation); class wedge { - displayName = "$STR_wedge"; + displayName = "$STR_Wedge"; icon="\A3\UI_F_Curator\Data\RscCommon\RscAttributeFormation\wedge_ca.paa"; statement = "{_x setFormation 'WEDGE';} forEach (curatorSelected select 1);"; }; class vee { - displayName = "$STR_vee"; + displayName = "$STR_Vee"; icon="\A3\UI_F_Curator\Data\RscCommon\RscAttributeFormation\vee_ca.paa"; statement = "{_x setFormation 'VEE';} forEach (curatorSelected select 1);"; }; class line { - displayName = "$STR_line"; + displayName = "$STR_Line"; icon="\A3\UI_F_Curator\Data\RscCommon\RscAttributeFormation\line_ca.paa"; statement = "{_x setFormation 'LINE';} forEach (curatorSelected select 1);"; }; class column { - displayName = "$STR_column"; + displayName = "$STR_Column"; icon="\A3\UI_F_Curator\Data\RscCommon\RscAttributeFormation\column_ca.paa"; statement = "{_x setFormation 'COLUMN';} forEach (curatorSelected select 1);"; }; class file { - displayName = "$STR_file"; + displayName = "$STR_File"; icon = "\A3\UI_F_Curator\Data\RscCommon\RscAttributeFormation\file_ca.paa"; statement = "{_x setFormation 'FILE';} forEach (curatorSelected select 1);"; }; class stag_column { - displayName = "$STR_staggered"; + displayName = "$STR_Staggered"; icon="\A3\UI_F_Curator\Data\RscCommon\RscAttributeFormation\stag_column_ca.paa"; statement = "{_x setFormation 'STAG COLUMN';} forEach (curatorSelected select 1);"; }; class ech_left { - displayName = "$STR_echl"; + displayName = "$STR_EchL"; icon="\A3\UI_F_Curator\Data\RscCommon\RscAttributeFormation\ech_left_ca.paa"; statement = "{_x setFormation 'ECH LEFT';} forEach (curatorSelected select 1);"; }; class ech_right { - displayName = "$STR_echr"; + displayName = "$STR_EchR"; icon="\A3\UI_F_Curator\Data\RscCommon\RscAttributeFormation\ech_right_ca.paa"; statement = "{_x setFormation 'ECH RIGHT';} forEach (curatorSelected select 1);"; }; class diamond { - displayName = "$STR_diamond"; + displayName = "$STR_Diamond"; icon="\A3\UI_F_Curator\Data\RscCommon\RscAttributeFormation\diamond_ca.paa"; statement = "{_x setFormation 'DIAMOND';} forEach (curatorSelected select 1);"; }; @@ -168,26 +168,26 @@ class ACE_ZeusActions { displayName = CSTRING(Zeus_Behaviour); class careless { - displayName = CSTRING(Zeus_Behaviour_careless); + displayName = "$STR_Combat_Careless"; statement = "{ _x setWaypointBehaviour 'CARELESS'; } forEach (curatorSelected select 2);"; }; class safe { - displayName = "$STR_safe"; + displayName = "$STR_Combat_Safe"; icon = "\A3\UI_F_Curator\Data\RscCommon\RscAttributeBehaviour\safe_ca.paa"; statement = "{ _x setWaypointBehaviour 'SAFE'; } forEach (curatorSelected select 2);"; }; class aware { - displayName = "$STR_aware"; + displayName = "$STR_Combat_Aware"; icon = "\A3\UI_F_Curator\Data\RscCommon\RscAttributeBehaviour\aware_ca.paa"; statement = "{ _x setWaypointBehaviour 'AWARE'; } forEach (curatorSelected select 2);"; }; class combat { - displayName = "$STR_combat"; + displayName = "$STR_Combat_Combat"; icon = "\A3\UI_F_Curator\Data\RscCommon\RscAttributeBehaviour\combat_ca.paa"; statement = "{ _x setWaypointBehaviour 'COMBAT'; } forEach (curatorSelected select 2);"; }; class stealth { - displayName = "$STR_stealth"; + displayName = "$STR_Combat_Stealth"; icon = "\A3\UI_F_Curator\Data\RscCommon\RscAttributeBehaviour\stealth_ca.paa"; statement = "{ _x setWaypointBehaviour 'STEALTH'; } forEach (curatorSelected select 2);"; }; @@ -196,17 +196,17 @@ class ACE_ZeusActions { displayName = CSTRING(Zeus_Speed); class limited { - displayName = "$STR_speed_limited"; + displayName = "$STR_Speed_Limited"; icon = "\A3\UI_F_Curator\Data\RscCommon\RscAttributeSpeedMode\limited_ca.paa"; statement = "{ _x setWaypointSpeed 'LIMITED'; } forEach (curatorSelected select 2);"; }; class normal { - displayName = "$STR_speed_normal"; + displayName = "$STR_Speed_Normal"; icon = "\A3\UI_F_Curator\Data\RscCommon\RscAttributeSpeedMode\normal_ca.paa"; statement = "{ _x setWaypointSpeed 'NORMAL'; } forEach (curatorSelected select 2);"; }; class full { - displayName = "$STR_speed_full"; + displayName = "$STR_Speed_Full"; icon = "\A3\UI_F_Curator\Data\RscCommon\RscAttributeSpeedMode\full_ca.paa"; statement = "{ _x setWaypointSpeed 'FULL'; } forEach (curatorSelected select 2);"; }; @@ -215,47 +215,47 @@ class ACE_ZeusActions { displayName = CSTRING(Zeus_Formation); class wedge { - displayName = "$STR_wedge"; + displayName = "$STR_Wedge"; icon="\A3\UI_F_Curator\Data\RscCommon\RscAttributeFormation\wedge_ca.paa"; statement = "{_x setWaypointFormation 'WEDGE';} forEach (curatorSelected select 1);"; }; class vee { - displayName = "$STR_vee"; + displayName = "$STR_Vee"; icon="\A3\UI_F_Curator\Data\RscCommon\RscAttributeFormation\vee_ca.paa"; statement = "{_x setWaypointFormation 'VEE';} forEach (curatorSelected select 1);"; }; class line { - displayName = "$STR_line"; + displayName = "$STR_Line"; icon="\A3\UI_F_Curator\Data\RscCommon\RscAttributeFormation\line_ca.paa"; statement = "{_x setWaypointFormation 'LINE';} forEach (curatorSelected select 1);"; }; class column { - displayName = "$STR_column"; + displayName = "$STR_Column"; icon="\A3\UI_F_Curator\Data\RscCommon\RscAttributeFormation\column_ca.paa"; statement = "{_x setWaypointFormation 'COLUMN';} forEach (curatorSelected select 1);"; }; class file { - displayName = "$STR_file"; + displayName = "$STR_File"; icon = "\A3\UI_F_Curator\Data\RscCommon\RscAttributeFormation\file_ca.paa"; statement = "{_x setWaypointFormation 'FILE';} forEach (curatorSelected select 1);"; }; class stag_column { - displayName = "$STR_staggered"; + displayName = "$STR_Staggered"; icon="\A3\UI_F_Curator\Data\RscCommon\RscAttributeFormation\stag_column_ca.paa"; statement = "{_x setWaypointFormation 'STAG COLUMN';} forEach (curatorSelected select 1);"; }; class ech_left { - displayName = "$STR_echl"; + displayName = "$STR_EchL"; icon="\A3\UI_F_Curator\Data\RscCommon\RscAttributeFormation\ech_left_ca.paa"; statement = "{_x setWaypointFormation 'ECH LEFT';} forEach (curatorSelected select 1);"; }; class ech_right { - displayName = "$STR_echr"; + displayName = "$STR_EchR"; icon="\A3\UI_F_Curator\Data\RscCommon\RscAttributeFormation\ech_right_ca.paa"; statement = "{_x setWaypointFormation 'ECH RIGHT';} forEach (curatorSelected select 1);"; }; class diamond { - displayName = "$STR_diamond"; + displayName = "$STR_Diamond"; icon="\A3\UI_F_Curator\Data\RscCommon\RscAttributeFormation\diamond_ca.paa"; statement = "{_x setWaypointFormation 'DIAMOND';} forEach (curatorSelected select 1);"; }; diff --git a/addons/interaction/stringtable.xml b/addons/interaction/stringtable.xml index 2e99ed0cef..d173029444 100644 --- a/addons/interaction/stringtable.xml +++ b/addons/interaction/stringtable.xml @@ -832,10 +832,6 @@ Behaviour Zachowanie - - Careless - Beztroski - Formation Formacja @@ -845,4 +841,4 @@ Prędkość - \ No newline at end of file + From bbadc9242b08ee681ca89898bdcea40ffcac4a09 Mon Sep 17 00:00:00 2001 From: SilentSpike Date: Fri, 3 Jul 2015 14:21:21 +0100 Subject: [PATCH 68/86] Further zeus actions cleanup --- addons/interaction/ACE_ZeusActions.hpp | 50 +++++++------------------- addons/interaction/stringtable.xml | 12 ------- 2 files changed, 13 insertions(+), 49 deletions(-) diff --git a/addons/interaction/ACE_ZeusActions.hpp b/addons/interaction/ACE_ZeusActions.hpp index 80626f6d43..195a979955 100644 --- a/addons/interaction/ACE_ZeusActions.hpp +++ b/addons/interaction/ACE_ZeusActions.hpp @@ -8,23 +8,23 @@ class ACE_ZeusActions { class stance { displayName = "$STR_A3_RscAttributeUnitPos_Title"; - class limited { - displayName = "$STR_A3_RscAttributeUnitPos_Down_tooltip"; + class prone { + displayName = "$STR_Pos_Down"; icon = "\A3\UI_F\Data\IGUI\RscIngameUI\RscUnitInfo\SI_prone_ca.paa"; statement = "{_x setUnitPos 'DOWN';} forEach (curatorSelected select 0);"; }; - class normal { - displayName = "$STR_A3_RscAttributeUnitPos_Crouch_tooltip"; + class crouch { + displayName = "$STR_Pos_Crouch"; icon = "\A3\UI_F\Data\IGUI\RscIngameUI\RscUnitInfo\SI_crouch_ca.paa"; statement = "{_x setUnitPos 'MIDDLE';} forEach (curatorSelected select 0);"; }; - class full { - displayName = "$STR_A3_RscAttributeUnitPos_Up_tooltip"; + class stand { + displayName = "$STR_Pos_Up"; icon = "\A3\UI_F\Data\IGUI\RscIngameUI\RscUnitInfo\SI_stand_ca.paa"; statement = "{_x setUnitPos 'UP';} forEach (curatorSelected select 0);"; }; class auto { - displayName = "$STR_A3_RscAttributeUnitPos_Auto_tooltip"; + displayName = "$STR_Pos_Automatic"; icon = "\A3\UI_F_Curator\Data\default_ca.paa"; statement = "{_x setUnitPos 'AUTO';} forEach (curatorSelected select 0);"; }; @@ -40,7 +40,7 @@ class ACE_ZeusActions { icon = "\A3\UI_F_Curator\Data\Displays\RscDisplayCurator\modeGroups_ca.paa"; class behaviour { - displayName = CSTRING(Zeus_Behaviour); + displayName = "$STR_Combat_Mode"; class careless { displayName = "$STR_Combat_Careless"; @@ -68,7 +68,7 @@ class ACE_ZeusActions { }; }; class speed { - displayName = CSTRING(Zeus_Speed); + displayName = "$STR_HC_Menu_Speed"; class limited { displayName = "$STR_Speed_Limited"; @@ -86,32 +86,8 @@ class ACE_ZeusActions { statement = "{_x setSpeedMode 'FULL';} forEach (curatorSelected select 1);"; }; }; - class stance { - displayName = "$STR_A3_RscAttributeUnitPos_Title"; - - class limited { - displayName = "$STR_A3_RscAttributeUnitPos_Down_tooltip"; - icon = "\A3\UI_F\Data\IGUI\RscIngameUI\RscUnitInfo\SI_prone_ca.paa"; - statement = "{ {_x setUnitPos 'DOWN'} forEach (units _x); } forEach (curatorSelected select 1);"; - }; - class normal { - displayName = "$STR_A3_RscAttributeUnitPos_Crouch_tooltip"; - icon = "\A3\UI_F\Data\IGUI\RscIngameUI\RscUnitInfo\SI_crouch_ca.paa"; - statement = "{ {_x setUnitPos 'MIDDLE'} forEach (units _x); } forEach (curatorSelected select 1);"; - }; - class full { - displayName = "$STR_A3_RscAttributeUnitPos_Up_tooltip"; - icon = "\A3\UI_F\Data\IGUI\RscIngameUI\RscUnitInfo\SI_stand_ca.paa"; - statement = "{ {_x setUnitPos 'UP'} forEach (units _x); } forEach (curatorSelected select 1);"; - }; - class auto { - displayName = "$STR_A3_RscAttributeUnitPos_Auto_tooltip"; - icon = "\A3\UI_F_Curator\Data\default_ca.paa"; - statement = "{ {_x setUnitPos 'AUTO'} forEach (units _x); } forEach (curatorSelected select 1);"; - }; - }; class formation { - displayName = CSTRING(Zeus_Formation); + displayName = "$STR_Formation"; class wedge { displayName = "$STR_Wedge"; @@ -165,7 +141,7 @@ class ACE_ZeusActions { icon = "\A3\UI_F_Curator\Data\CfgCurator\waypoint_ca.paa"; class behaviour { - displayName = CSTRING(Zeus_Behaviour); + displayName = "$STR_Combat_Mode"; class careless { displayName = "$STR_Combat_Careless"; @@ -193,7 +169,7 @@ class ACE_ZeusActions { }; }; class speed { - displayName = CSTRING(Zeus_Speed); + displayName = "$STR_HC_Menu_Speed"; class limited { displayName = "$STR_Speed_Limited"; @@ -212,7 +188,7 @@ class ACE_ZeusActions { }; }; class formation { - displayName = CSTRING(Zeus_Formation); + displayName = "$STR_Formation"; class wedge { displayName = "$STR_Wedge"; diff --git a/addons/interaction/stringtable.xml b/addons/interaction/stringtable.xml index d173029444..962d55eca9 100644 --- a/addons/interaction/stringtable.xml +++ b/addons/interaction/stringtable.xml @@ -828,17 +828,5 @@ Správa týmu se skládá z: přidělení barev pro členy týmu, převzetí velení, připojení/odpojení. O módulo de gestão de equipe é composto por: a atribuição de cores para os membros da equipe, comando das equipes, juntando-se / deixando equipes. - - Behaviour - Zachowanie - - - Formation - Formacja - - - Speed Mode - Prędkość - From 9edf1b1adff27202d2b45285204e5c98b4266e27 Mon Sep 17 00:00:00 2001 From: Glowbal Date: Fri, 3 Jul 2015 22:16:18 +0200 Subject: [PATCH 69/86] Implemented use conditions for PAK and SurgicalKit It is now possible to only have a treatment action show up for stable (not bleeding) patients --- addons/medical/ACE_Medical_Treatments.hpp | 4 +++ addons/medical/ACE_Settings.hpp | 14 +++++++++ addons/medical/CfgVehicles.hpp | 18 +++++++++-- addons/medical/XEH_preInit.sqf | 1 + addons/medical/functions/fnc_canTreat.sqf | 11 +++++-- .../functions/fnc_isInStableCondition.sqf | 30 +++++++++++++++++++ .../fnc_moduleAdvancedMedicalSettings.sqf | 2 ++ addons/medical/functions/fnc_treatment.sqf | 15 +++++++--- addons/medical/stringtable.xml | 20 ++++++++++++- 9 files changed, 105 insertions(+), 10 deletions(-) create mode 100644 addons/medical/functions/fnc_isInStableCondition.sqf diff --git a/addons/medical/ACE_Medical_Treatments.hpp b/addons/medical/ACE_Medical_Treatments.hpp index 3576d89295..079ae40506 100644 --- a/addons/medical/ACE_Medical_Treatments.hpp +++ b/addons/medical/ACE_Medical_Treatments.hpp @@ -11,6 +11,7 @@ class ACE_Medical_Actions { treatmentTimeSelfCoef = 1; items[] = {{"ACE_fieldDressing", "ACE_packingBandage", "ACE_elasticBandage", "ACE_quikclot"}}; condition = ""; + patientStateCondition = 0; itemConsumed = 1; callbackSuccess = QUOTE(DFUNC(treatmentBasic_bandage)); @@ -107,6 +108,7 @@ class ACE_Medical_Actions { // Item required for the action. Leave empty for no item required. items[] = {"ACE_fieldDressing"}; condition = ""; + patientStateCondition = 0; // Callbacks callbackSuccess = QUOTE(DFUNC(treatmentAdvanced_bandage)); callbackFailure = ""; @@ -206,6 +208,7 @@ class ACE_Medical_Actions { items[] = {"ACE_surgicalKit"}; treatmentLocations[] = {QGVAR(useLocation_SurgicalKit)}; requiredMedic = QGVAR(medicSetting_SurgicalKit); + patientStateCondition = QGVAR(useCondition_SurgicalKit); treatmentTime = "(count ((_this select 1) getVariable ['ACE_Medical_bandagedWounds', []]) * 5)"; callbackSuccess = ""; callbackProgress = QUOTE(DFUNC(treatmentAdvanced_surgicalKit_onProgress)); @@ -219,6 +222,7 @@ class ACE_Medical_Actions { items[] = {"ACE_personalAidKit"}; treatmentLocations[] = {QGVAR(useLocation_PAK)}; requiredMedic = QGVAR(medicSetting_PAK); + patientStateCondition = QGVAR(useCondition_PAK); treatmentTime = QUOTE((_this select 1) call FUNC(treatmentAdvanced_fullHealTreatmentTime)); callbackSuccess = QUOTE(DFUNC(treatmentAdvanced_fullHeal)); itemConsumed = QGVAR(consumeItem_PAK); diff --git a/addons/medical/ACE_Settings.hpp b/addons/medical/ACE_Settings.hpp index 2b28e91882..fcaba03aa0 100644 --- a/addons/medical/ACE_Settings.hpp +++ b/addons/medical/ACE_Settings.hpp @@ -133,6 +133,20 @@ class ACE_Settings { value = 2; values[] = {"Anywhere", "Medical vehicles", "Medical facility", "vehicle & facility", "Disabled"}; }; + class GVAR(useCondition_PAK) { + displayName = CSTRING(AdvancedMedicalSettings_useCondition_PAK_DisplayName); + description = CSTRING(AdvancedMedicalSettings_useCondition_PAK_Description); + typeName = "SCALAR"; + value = 0; + values[] = {"Anytime", "Stable"}; + }; + class GVAR(useCondition_SurgicalKit) { + displayName = CSTRING(AdvancedMedicalSettings_useCondition_SurgicalKit_DisplayName); + description = CSTRING(AdvancedMedicalSettings_useCondition_SurgicalKit_Description); + typeName = "SCALAR"; + value = 0; + values[] = {"Anytime", "Stable"}; + }; class GVAR(keepLocalSettingsSynced) { typeName = "BOOL"; value = 1; diff --git a/addons/medical/CfgVehicles.hpp b/addons/medical/CfgVehicles.hpp index c8a4528ca5..0af23c9995 100644 --- a/addons/medical/CfgVehicles.hpp +++ b/addons/medical/CfgVehicles.hpp @@ -196,13 +196,21 @@ class CfgVehicles { class consumeItem_PAK { displayName = CSTRING(AdvancedMedicalSettings_consumeItem_PAK_DisplayName); description = CSTRING(AdvancedMedicalSettings_consumeItem_PAK_Description); - typeName = "NUMBER"; class values { class keep { name = CSTRING(No); value = 0; }; class remove { name = CSTRING(Yes); value = 1; default = 1; }; }; }; + class useCondition_PAK { + displayName = CSTRING(AdvancedMedicalSettings_useCondition_PAK_DisplayName); + description = CSTRING(AdvancedMedicalSettings_useCondition_PAK_Description); + typeName = "NUMBER"; + class values { + class AnyTime { name = CSTRING(AnyTime); value = 0; }; + class Stable { name = CSTRING(Stable); value = 1; default = 1; }; + }; + }; class useLocation_PAK { displayName = CSTRING(AdvancedMedicalSettings_useLocation_PAK_DisplayName); description = CSTRING(AdvancedMedicalSettings_useLocation_PAK_Description); @@ -227,15 +235,19 @@ class CfgVehicles { displayName = CSTRING(AdvancedMedicalSettings_useLocation_SurgicalKit_DisplayName); description = CSTRING(AdvancedMedicalSettings_useLocation_SurgicalKit_Description); }; + class useCondition_SurgicalKit: useCondition_PAK { + displayName = CSTRING(AdvancedMedicalSettings_useCondition_SurgicalKit_DisplayName); + description = CSTRING(AdvancedMedicalSettings_useCondition_SurgicalKit_Description); + }; class healHitPointAfterAdvBandage { displayName = CSTRING(AdvancedMedicalSettings_healHitPointAfterAdvBandage_DisplayName); - description = CSTRING(AdvancedMedicalSettings_healHitPointAfterAdvBandage_Description); + description = CSTRING(AdvancedMedicalSettings_healHitPointAfterAdvBandage_Description); typeName = "BOOL"; defaultValue = 0; }; class painIsOnlySuppressed { displayName = CSTRING(AdvancedMedicalSettings_painIsOnlySuppressed_DisplayName); - description = CSTRING(AdvancedMedicalSettings_painIsOnlySuppressed_Description); + description = CSTRING(AdvancedMedicalSettings_painIsOnlySuppressed_Description); typeName = "BOOL"; defaultValue = 1; }; diff --git a/addons/medical/XEH_preInit.sqf b/addons/medical/XEH_preInit.sqf index a932ee5c9d..b479383468 100644 --- a/addons/medical/XEH_preInit.sqf +++ b/addons/medical/XEH_preInit.sqf @@ -56,6 +56,7 @@ PREP(isInMedicalFacility); PREP(isInMedicalVehicle); PREP(isMedic); PREP(isMedicalVehicle); +PREP(isInStableCondition); PREP(itemCheck); PREP(modifyMedicalAction); PREP(onMedicationUsage); diff --git a/addons/medical/functions/fnc_canTreat.sqf b/addons/medical/functions/fnc_canTreat.sqf index 062a696fcd..4795ccc561 100644 --- a/addons/medical/functions/fnc_canTreat.sqf +++ b/addons/medical/functions/fnc_canTreat.sqf @@ -16,7 +16,7 @@ #include "script_component.hpp" -private ["_caller", "_target", "_selectionName", "_className", "_config", "_medicRequired", "_items", "_locations", "_return", "_condition"]; +private ["_caller", "_target", "_selectionName", "_className", "_config", "_medicRequired", "_items", "_locations", "_return", "_condition", "_patientStateCondition"]; _caller = _this select 0; _target = _this select 1; _selectionName = _this select 2; @@ -44,7 +44,6 @@ if !([_caller, _medicRequired] call FUNC(isMedic)) exitwith {false}; _items = getArray (_config >> "items"); if (count _items > 0 && {!([_caller, _target, _items] call FUNC(hasItems))}) exitwith {false}; -_locations = getArray (_config >> "treatmentLocations"); _return = true; if (getText (_config >> "condition") != "") then { @@ -62,6 +61,14 @@ if (getText (_config >> "condition") != "") then { }; if (!_return) exitwith {false}; +_patientStateCondition = if (isText(_config >> "patientStateCondition")) then { + missionNamespace getvariable [getText(_config >> "patientStateCondition"), 0] +} else { + getNumber(_config >> "patientStateCondition") +}; +if (_patientStateCondition == 1 && {!([_target] call FUNC(isInStableCondition))}) exitwith {false}; + +_locations = getArray (_config >> "treatmentLocations"); if ("All" in _locations) exitwith {true}; private [ "_medFacility", "_medVeh"]; diff --git a/addons/medical/functions/fnc_isInStableCondition.sqf b/addons/medical/functions/fnc_isInStableCondition.sqf new file mode 100644 index 0000000000..f7c22ed085 --- /dev/null +++ b/addons/medical/functions/fnc_isInStableCondition.sqf @@ -0,0 +1,30 @@ +/* +* Author: Glowbal +* Check if a unit is in a stable condition +* +* Arguments: +* 0: The patient +* +* Return Value: +* Is in stable condition +* +* Public: No +*/ + +#include "script_component.hpp" + +private ["_unit"]; +_unit = _this select 0; + +if (GVAR(level) <= 1) exitwith { + ([_unit] call FUNC(getBloodloss)) == 0; +}; + +_totalBloodLoss = 0; +_openWounds = _unit getvariable [QGVAR(openWounds), []]; +{ + // total bleeding ratio * percentage of injury left + _totalBloodLoss = _totalBloodLoss + ((_x select 4) * (_x select 3)); +}foreach _openWounds; + +(_totalBloodLoss == 0); diff --git a/addons/medical/functions/fnc_moduleAdvancedMedicalSettings.sqf b/addons/medical/functions/fnc_moduleAdvancedMedicalSettings.sqf index 5263044583..2960c65b9d 100644 --- a/addons/medical/functions/fnc_moduleAdvancedMedicalSettings.sqf +++ b/addons/medical/functions/fnc_moduleAdvancedMedicalSettings.sqf @@ -33,5 +33,7 @@ if !(_activated) exitWith {}; [_logic, QGVAR(consumeItem_SurgicalKit), "consumeItem_SurgicalKit"] call EFUNC(common,readSettingFromModule); [_logic, QGVAR(useLocation_PAK), "useLocation_PAK"] call EFUNC(common,readSettingFromModule); [_logic, QGVAR(useLocation_SurgicalKit), "useLocation_SurgicalKit"] call EFUNC(common,readSettingFromModule); +[_logic, QGVAR(useCondition_PAK), "useCondition_PAK"] call EFUNC(common,readSettingFromModule); +[_logic, QGVAR(useCondition_SurgicalKit), "useCondition_SurgicalKit"] call EFUNC(common,readSettingFromModule); [_logic, QGVAR(healHitPointAfterAdvBandage), "healHitPointAfterAdvBandage"] call EFUNC(common,readSettingFromModule); [_logic, QGVAR(painIsOnlySuppressed), "painIsOnlySuppressed"] call EFUNC(common,readSettingFromModule); diff --git a/addons/medical/functions/fnc_treatment.sqf b/addons/medical/functions/fnc_treatment.sqf index 06cea8dfe3..18f3406df2 100644 --- a/addons/medical/functions/fnc_treatment.sqf +++ b/addons/medical/functions/fnc_treatment.sqf @@ -16,7 +16,7 @@ #include "script_component.hpp" -private ["_caller", "_target", "_selectionName", "_className", "_config", "_medicRequired", "_items", "_locations", "_return", "_callbackProgress", "_treatmentTime", "_callerAnim", "_patientAnim", "_iconDisplayed", "_return", "_usersOfItems", "_consumeItems", "_condition", "_displayText", "_wpn", "_treatmentTimeConfig"]; +private ["_caller", "_target", "_selectionName", "_className", "_config", "_medicRequired", "_items", "_locations", "_return", "_callbackProgress", "_treatmentTime", "_callerAnim", "_patientAnim", "_iconDisplayed", "_return", "_usersOfItems", "_consumeItems", "_condition", "_displayText", "_wpn", "_treatmentTimeConfig", "_patientStateCondition"]; _caller = _this select 0; _target = _this select 1; _selectionName = _this select 2; @@ -53,9 +53,6 @@ if !([_caller, _medicRequired] call FUNC(isMedic)) exitwith {false}; _items = getArray (_config >> "items"); if (count _items > 0 && {!([_caller, _target, _items] call FUNC(hasItems))}) exitwith {false}; -// Check allowed locations -_locations = getArray (_config >> "treatmentLocations"); - _return = true; if (isText (_config >> "Condition")) then { _condition = getText(_config >> "condition"); @@ -74,6 +71,16 @@ if (isText (_config >> "Condition")) then { }; if (!_return) exitwith {false}; +_patientStateCondition = if (isText(_config >> "patientStateCondition")) then { + missionNamespace getvariable [getText(_config >> "patientStateCondition"), 0] +} else { + getNumber(_config >> "patientStateCondition") +}; +if (_patientStateCondition == 1 && {!([_target] call FUNC(isInStableCondition))}) exitwith {false}; + +// Check allowed locations +_locations = getArray (_config >> "treatmentLocations"); + if ("All" in _locations) then { _return = true; } else { diff --git a/addons/medical/stringtable.xml b/addons/medical/stringtable.xml index 6fa58bb759..b41cc05544 100644 --- a/addons/medical/stringtable.xml +++ b/addons/medical/stringtable.xml @@ -3123,13 +3123,19 @@ Lokace osobní lékárničky - Where can the personal aid kit be used? + Where can the Personal Aid Kit be used? Где может использоваться аптечка? Gdzie można korzystać z apteczek osobistych? ¿Dónde se puede utilizar el equipo de primeros auxilios? Wo kann der Erstehilfekasten verwendet werden? Kde může být osobní lékárnička použita? + + Condition PAK + + + When can the Personal Aid Kit be used? + Anywhere Где угодно @@ -3218,6 +3224,12 @@ Wo kann der Operationskasten verwendet werden? Kde může být použita chirurgická souprava? + + Condition Surgical kit (Adv) + + + When can the Surgical kit be used? + Bloodstains Blutflecken @@ -3509,5 +3521,11 @@ Não No + + Anytime + + + Stable + \ No newline at end of file From fd649aee38d05db789c7c4a171d7e455078e5717 Mon Sep 17 00:00:00 2001 From: Glowbal Date: Fri, 3 Jul 2015 22:17:31 +0200 Subject: [PATCH 70/86] Changed default value for surgical kit. Should be use anytime --- addons/medical/CfgVehicles.hpp | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/addons/medical/CfgVehicles.hpp b/addons/medical/CfgVehicles.hpp index 0af23c9995..66df5550fc 100644 --- a/addons/medical/CfgVehicles.hpp +++ b/addons/medical/CfgVehicles.hpp @@ -238,6 +238,10 @@ class CfgVehicles { class useCondition_SurgicalKit: useCondition_PAK { displayName = CSTRING(AdvancedMedicalSettings_useCondition_SurgicalKit_DisplayName); description = CSTRING(AdvancedMedicalSettings_useCondition_SurgicalKit_Description); + class values { + class AnyTime { name = CSTRING(AnyTime); value = 0; default = 1; }; + class Stable { name = CSTRING(Stable); value = 1; }; + }; }; class healHitPointAfterAdvBandage { displayName = CSTRING(AdvancedMedicalSettings_healHitPointAfterAdvBandage_DisplayName); From 89a9218e59d507d0a2715e1037cbb8221b09d0a9 Mon Sep 17 00:00:00 2001 From: ProfessorCZ Date: Sat, 4 Jul 2015 15:56:00 +0200 Subject: [PATCH 71/86] CZ Translation - Update --- addons/common/stringtable.xml | 3 +++ addons/explosives/stringtable.xml | 2 ++ addons/interact_menu/stringtable.xml | 3 +++ addons/interaction/stringtable.xml | 3 ++- addons/map/stringtable.xml | 2 ++ addons/medical/stringtable.xml | 10 +++++++++- addons/optionsmenu/stringtable.xml | 2 ++ addons/sitting/stringtable.xml | 5 +++++ addons/spectator/stringtable.xml | 30 ++++++++++++++-------------- 9 files changed, 43 insertions(+), 17 deletions(-) diff --git a/addons/common/stringtable.xml b/addons/common/stringtable.xml index ccc94b361b..28a40e382a 100644 --- a/addons/common/stringtable.xml +++ b/addons/common/stringtable.xml @@ -579,18 +579,21 @@ Seleccionar dispositivo de mano Ativa dispositivo de mão Przełącz urządzenie podręczne + Přepnout ruční zařízení Close Handheld Device Cerrar dispositivo de mano Fecha dispositivo de mão Zamknij urządzenie podręczne + Zavřít ruční zařízení Cycle Handheld Devices Cambiar dispositivos de mano Troca dispositivos de mão Następne urządzenie podręczne + Procházet ruční zařízení \ No newline at end of file diff --git a/addons/explosives/stringtable.xml b/addons/explosives/stringtable.xml index 40e436656b..a2c3612b24 100644 --- a/addons/explosives/stringtable.xml +++ b/addons/explosives/stringtable.xml @@ -549,11 +549,13 @@ Explode on defusal? Explosão no desarmamento? Eksplozja przy rozbrajaniu? + Explodovat při zneškodňování? Enable certain explosives to explode on defusal? Default: Yes Ativa certos explosivos para detonar no desarmamento? Padrão: Sim Spraw, aby niektóre ładunki wybuchowe eksplodowały przy próbie ich rozbrojenia? Domyślnie:Tak + Umožnit u některých výbušnin explozi při pokusu je zneškodnit? Výchozí: Ano diff --git a/addons/interact_menu/stringtable.xml b/addons/interact_menu/stringtable.xml index f87880e83c..4ab84e1c51 100644 --- a/addons/interact_menu/stringtable.xml +++ b/addons/interact_menu/stringtable.xml @@ -88,6 +88,7 @@ Zeus Actions Akcje Zeusa + Akce Zeuse Interaction - Text Max @@ -252,10 +253,12 @@ Show actions for buildings Pokazuj akcje dla budynków + Zobrazit akci pro budovy Adds interaction actions for opening doors and mounting ladders on buildings. (Note: There is a performance cost when opening interaction menu, especially in towns) Dodaje opcje interakcji dla otwierania drzwi oraz wchodzenia po drabinach do budynków. Uwaga: Użycie tej opcji może spowodować spadek wydajności menu interakcji, szczególnie w dużych miastach. + Přidá možnost interakce pro otevření dvěří a umistňovat žebříky na budovy. (Poznámka: Použití této možnosti snižuje výkon při otevírání pomocí interakčního menu, zejména ve velkých městech.) \ No newline at end of file diff --git a/addons/interaction/stringtable.xml b/addons/interaction/stringtable.xml index 962d55eca9..7b20dde7c0 100644 --- a/addons/interaction/stringtable.xml +++ b/addons/interaction/stringtable.xml @@ -796,6 +796,7 @@ Open Otwórz + Otevřít Interaction System @@ -829,4 +830,4 @@ O módulo de gestão de equipe é composto por: a atribuição de cores para os membros da equipe, comando das equipes, juntando-se / deixando equipes. - + \ No newline at end of file diff --git a/addons/map/stringtable.xml b/addons/map/stringtable.xml index 89e7bf5571..0f252d5b97 100644 --- a/addons/map/stringtable.xml +++ b/addons/map/stringtable.xml @@ -92,11 +92,13 @@ BFT Enable RFA ativo Aktywuj BFT + Povolit BFT Enable Blue Force Tracking. Default: No Ativa Rastreio de Forças Azuis. Padrão: Não Aktywuj Blue Force Tracking. Domyślnie: Nie + Povolit Blue Force Tracking. Výchozí: Ne Interval diff --git a/addons/medical/stringtable.xml b/addons/medical/stringtable.xml index b6278fb47e..35f989e8a1 100644 --- a/addons/medical/stringtable.xml +++ b/addons/medical/stringtable.xml @@ -2919,12 +2919,14 @@ IA controlada remotamente IA controlada remotamente Zdalnie sterowane AI + Vzdáleně ovládané AI Treat remote controlled units as AI not players? ¿Tratar unidades remotamente controladas como IA? Tratar unidades remotamente controladas como IA? Traktuj jednostki zdalnie sterowane (przez Zeusa) jako AI, nie jako graczy? + Ošetřit vzdáleně ovládané jednotky jako AI, ne jako hráče? Disabled @@ -3184,14 +3186,16 @@ Gdzie można korzystać z apteczek osobistych? ¿Dónde se puede utilizar el equipo de primeros auxilios? Wo kann der Erstehilfekasten verwendet werden? - Kde může být osobní lékárnička použita? + Kde může být použita osobní lékárnička? Onde o kit de primeiros socorros pode ser utilizado? Condition PAK + Podmínka osobní lékárničky When can the Personal Aid Kit be used? + Kde může být použita osobní lékárnička? Anywhere @@ -3294,9 +3298,11 @@ Condition Surgical kit (Adv) + Podmínka chirurgické soupravy (Pokr.) When can the Surgical kit be used? + Kde může být použita chirurgická souprava? Bloodstains @@ -3625,9 +3631,11 @@ Anytime + Kdykoli Stable + Stabilní \ No newline at end of file diff --git a/addons/optionsmenu/stringtable.xml b/addons/optionsmenu/stringtable.xml index 3af9ca8b30..d1b6199413 100644 --- a/addons/optionsmenu/stringtable.xml +++ b/addons/optionsmenu/stringtable.xml @@ -348,12 +348,14 @@ Noticias ACE Notícias do ACE Wiadomości ACE + ACE Novinky Show News on Main Menu Mostrar noticias en el menú principal Mostrar notícias no menu principal Pokazuj wiadomości ACE w menu głównym + Zobrazit novinky v hlavním menu \ No newline at end of file diff --git a/addons/sitting/stringtable.xml b/addons/sitting/stringtable.xml index 2287ba2ae8..cbf63d2117 100644 --- a/addons/sitting/stringtable.xml +++ b/addons/sitting/stringtable.xml @@ -5,26 +5,31 @@ Sit Down Usiądź Sentar + Sednout si Stand Up Wstań Levantar + Vstát Enable Sitting Habilitar opção para sentar Aktywuj siadanie + Povolit sezení Sitting Sentado Siadanie + Sedící This module allows you to disable the ability to sit on chairs and toilets. Este módulo permite que você desabilite a capacidade de sentar-se em cadeiras e banheiros. Moduł ten pozwala na włączenie lub wyłączenie możliwości siadania na krzesłach i toaletach. + Tento modul dovoluje zakázat možnost sedět na židlých a toaletách. \ No newline at end of file diff --git a/addons/spectator/stringtable.xml b/addons/spectator/stringtable.xml index 368944c3d3..10b6462678 100644 --- a/addons/spectator/stringtable.xml +++ b/addons/spectator/stringtable.xml @@ -6,105 +6,105 @@ Obserwator - + Pozorovatel Enable Spectator Aktywuj obserwatora - + Povolit pozorovatele Begin spectating on player death? Włącz obserwatora po śmierci gracza? - + Přepnout do pozorovatele po hráčově smrti? Player Side Only Tylko strona gracza - + Pouze strana hráče Only spectate units belonging to player's side? Pozwól obserwować jednostki będące tylko po stronie gracza? - + Pozorovat pouze jednotky patřící k hráčově straně? Spectate AI Obserwacja AI - + Pozorovat AI Allow spectating of AI units? Pozwól obserwować jednostki AI? - + Umožnit pozorovat AI jednotky? Track Units Śledź jednostki - + Sledovat jednotky Track units' movements throughout mission? Śledź ruch jednostek w trakcie misji? - + Sledovat pohyby jednotek napříč misí? Start Position Pozycja startowa - + Počáteční pozice Use this module as a starting position for spectator camera? Użyj pozycji modułu jako pozycje startową dla kamery obserwatora? - + Použít tento modul jako počáteční pozici pro pozorovací kameru? End Mission Zakończ misję - + Konec mise End mission when all players dead (default BIS behaviour)? Zakończ misję kiedy wszyscy gracze będą martwi (domyślne zachowanie BIS)? - + Ukončit misi když umřou všichni hráči (výchozí BIS chování)? View Distance Zasięg widzenia - + Dohlednost OK OK - + OK \ No newline at end of file From fcb638333719f95bf9a62ca82980fef242201a5a Mon Sep 17 00:00:00 2001 From: bux578 Date: Sat, 4 Jul 2015 16:19:53 +0200 Subject: [PATCH 72/86] remove some empty xml nodes --- addons/advanced_ballistics/stringtable.xml | 1 - addons/spectator/stringtable.xml | 30 ---------------------- 2 files changed, 31 deletions(-) diff --git a/addons/advanced_ballistics/stringtable.xml b/addons/advanced_ballistics/stringtable.xml index 8ba88dee2b..5c6dd58d6e 100644 --- a/addons/advanced_ballistics/stringtable.xml +++ b/addons/advanced_ballistics/stringtable.xml @@ -210,7 +210,6 @@ Define o raio ao redor do jogador (em metros) onde a balística avançada será aplicada aos projéteis - Moduł ten pozwala aktywować zaawansowaną balistykę biorącą przy obliczeniach trajektorii lotu pocisku pod uwagę takie rzeczy jak temperatura powietrza, ciśnienie atmosferyczne, wilgotność powietrza, siły Coriolisa i Eotvosa, grawitację a także broń z jakiej wykonywany jest strzał oraz rodzaj amunicji. Wszystko to sprowadza się na bardzo dokładne odwzorowanie balistyki. Tento modul umožňuje aktivovat pokročilou balistiku, která vypočítává trajektorii kulky a bere do úvahy věci jako je teplota vzduchu, atmosférický tlak, vlhkost vzduchu, gravitaci, typ munice a zbraň, ze které je náboj vystřelen. To vše přispívá k velmi přesné balistice. Este módulo permite que você ative cálculos de balística avançada, fazendo a trajetória do projétil levar em consideração coisas como temperatura do ar, pressão atmosférica, umidade, força de Coriolis, a gravidade, o modelo da arma no qual o disparo é realizado e o tipo de munição. Tudo isso acrescenta-se a um balística muito precisa. diff --git a/addons/spectator/stringtable.xml b/addons/spectator/stringtable.xml index 10b6462678..f271bfabf5 100644 --- a/addons/spectator/stringtable.xml +++ b/addons/spectator/stringtable.xml @@ -4,106 +4,76 @@ Spectator Obserwator - - Pozorovatel Enable Spectator Aktywuj obserwatora - - Povolit pozorovatele Begin spectating on player death? Włącz obserwatora po śmierci gracza? - - Přepnout do pozorovatele po hráčově smrti? Player Side Only Tylko strona gracza - - Pouze strana hráče Only spectate units belonging to player's side? Pozwól obserwować jednostki będące tylko po stronie gracza? - - Pozorovat pouze jednotky patřící k hráčově straně? Spectate AI Obserwacja AI - - Pozorovat AI Allow spectating of AI units? Pozwól obserwować jednostki AI? - - Umožnit pozorovat AI jednotky? Track Units Śledź jednostki - - Sledovat jednotky Track units' movements throughout mission? Śledź ruch jednostek w trakcie misji? - - Sledovat pohyby jednotek napříč misí? Start Position Pozycja startowa - - Počáteční pozice Use this module as a starting position for spectator camera? Użyj pozycji modułu jako pozycje startową dla kamery obserwatora? - - Použít tento modul jako počáteční pozici pro pozorovací kameru? End Mission Zakończ misję - - Konec mise End mission when all players dead (default BIS behaviour)? Zakończ misję kiedy wszyscy gracze będą martwi (domyślne zachowanie BIS)? - - Ukončit misi když umřou všichni hráči (výchozí BIS chování)? View Distance Zasięg widzenia - - Dohlednost OK OK - - OK From e56f022f5bf774c1231a705c5e21a83433fa80cc Mon Sep 17 00:00:00 2001 From: bux578 Date: Sat, 4 Jul 2015 16:21:59 +0200 Subject: [PATCH 73/86] Fix anchor link in documentation --- .../development/setting-up-the-development-environment.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/documentation/development/setting-up-the-development-environment.md b/documentation/development/setting-up-the-development-environment.md index 5264760785..e02760f96d 100644 --- a/documentation/development/setting-up-the-development-environment.md +++ b/documentation/development/setting-up-the-development-environment.md @@ -23,7 +23,7 @@ This page describes how you can setup your development environment for ACE3, all ## 2. Why so complicated? -If you have contributed to AGM you might be used to an easier build process, where there was even an .exe you could use for building. ACE3, however, makes use of CBA macros to simplify things and give the developer access to a better debug process, which requires a stricter build environment. Additionally, Mikero's tools are stricter and report more errors than AddonBuilder does. The structure of this development environment also allows for [file patching](#file-patching), which is very useful for debugging. +If you have contributed to AGM you might be used to an easier build process, where there was even an .exe you could use for building. ACE3, however, makes use of CBA macros to simplify things and give the developer access to a better debug process, which requires a stricter build environment. Additionally, Mikero's tools are stricter and report more errors than AddonBuilder does. The structure of this development environment also allows for [file patching](#7-file-patching), which is very useful for debugging. Not offering .exes for the Python scripts we use allows us to make easy changes without the hassle of compiling self-extracting exes all the time. From 19c16b1f59dfe2f583dcde60cce25e660f0795fa Mon Sep 17 00:00:00 2001 From: SilentSpike Date: Sat, 4 Jul 2015 17:40:23 +0100 Subject: [PATCH 74/86] Comment out dev branch command --- addons/common/functions/fnc_hideUnit.sqf | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/addons/common/functions/fnc_hideUnit.sqf b/addons/common/functions/fnc_hideUnit.sqf index b3cd6f7b77..94857335f4 100644 --- a/addons/common/functions/fnc_hideUnit.sqf +++ b/addons/common/functions/fnc_hideUnit.sqf @@ -29,6 +29,6 @@ if !(_reason in _setHiddenReasons) then { _unit setVariable [QGVAR(setHiddenReasons), _setHiddenReasons, true]; }; -if !(isObjectHidden _unit) then { +//if !(isObjectHidden _unit) then { (Uncomment when isObjectHidden hits stable branch) ["hideObjectGlobal",[_unit,true]] call FUNC(serverEvent); -}; +//}; From 815365fd2eb80831ded33c6002828382afc303d4 Mon Sep 17 00:00:00 2001 From: Joko Date: Sat, 4 Jul 2015 23:03:16 +0200 Subject: [PATCH 75/86] Small Performace Improvement in Nametags --- addons/nametags/functions/fnc_drawNameTagIcon.sqf | 2 +- addons/nametags/script_component.hpp | 12 ------------ 2 files changed, 1 insertion(+), 13 deletions(-) diff --git a/addons/nametags/functions/fnc_drawNameTagIcon.sqf b/addons/nametags/functions/fnc_drawNameTagIcon.sqf index 7b6bbda138..021a4e2a0b 100644 --- a/addons/nametags/functions/fnc_drawNameTagIcon.sqf +++ b/addons/nametags/functions/fnc_drawNameTagIcon.sqf @@ -35,7 +35,7 @@ if ((_iconType == ICON_NAME_SPEAK) || (_iconType == ICON_SPEAK)) then { _alpha = _alpha max 0.6;//Boost alpha when speaking } else { if (_iconType == ICON_NAME_RANK) then { - _icon = TEXTURES_RANKS select ((["PRIVATE", "CORPORAL", "SERGEANT", "LIEUTENANT", "CAPTAIN", "MAJOR", "COLONEL"] find (rank _target)) + 1); + _icon = format["\A3\Ui_f\data\GUI\Cfg\Ranks\%1_gs.paa",(toLower(rank _target))]; _size = 1; }; }; diff --git a/addons/nametags/script_component.hpp b/addons/nametags/script_component.hpp index da912b48c4..7bf0acbc4a 100644 --- a/addons/nametags/script_component.hpp +++ b/addons/nametags/script_component.hpp @@ -16,15 +16,3 @@ #define ICON_NAME_RANK 2 #define ICON_NAME_SPEAK 3 #define ICON_SPEAK 4 - -//todo?: custom rank icons?? -#define TEXTURES_RANKS [ \ - "", \ - "\A3\Ui_f\data\GUI\Cfg\Ranks\private_gs.paa", \ - "\A3\Ui_f\data\GUI\Cfg\Ranks\corporal_gs.paa", \ - "\A3\Ui_f\data\GUI\Cfg\Ranks\sergeant_gs.paa", \ - "\A3\Ui_f\data\GUI\Cfg\Ranks\lieutenant_gs.paa", \ - "\A3\Ui_f\data\GUI\Cfg\Ranks\captain_gs.paa", \ - "\A3\Ui_f\data\GUI\Cfg\Ranks\major_gs.paa", \ - "\A3\Ui_f\data\GUI\Cfg\Ranks\colonel_gs.paa" \ - ] \ No newline at end of file From 78529af60c9a7a3aa723efe5be447ab4fb22690e Mon Sep 17 00:00:00 2001 From: Ivan Navarro Cabello Date: Wed, 8 Jul 2015 20:57:46 +0200 Subject: [PATCH 76/86] Update spanish translation --- addons/concertina_wire/stringtable.xml | 8 +++---- addons/explosives/stringtable.xml | 3 ++- addons/huntir/stringtable.xml | 32 +++++++++++++------------- addons/interact_menu/stringtable.xml | 5 +++- addons/interaction/stringtable.xml | 2 ++ addons/map/stringtable.xml | 6 ++--- addons/medical/stringtable.xml | 8 +++++-- addons/sandbag/stringtable.xml | 24 +++++++++---------- addons/sitting/stringtable.xml | 5 ++++ addons/spectator/stringtable.xml | 15 ++++++++++++ addons/spottingscope/stringtable.xml | 6 ++--- 11 files changed, 72 insertions(+), 42 deletions(-) diff --git a/addons/concertina_wire/stringtable.xml b/addons/concertina_wire/stringtable.xml index 4400866e87..812de87e6c 100644 --- a/addons/concertina_wire/stringtable.xml +++ b/addons/concertina_wire/stringtable.xml @@ -6,7 +6,7 @@ NATO-Draht Проволочная спираль Drut kolczasty - Concertina wire + Alambre de espino Concertina wire Ostnatý drát Concertina wire @@ -18,7 +18,7 @@ NATO-Draht Rolle Проволочная спираль (моток) Zwój drutu kolczastego - Concertina wire coil + Bobina de alambre de espino Concertina wire coil Smyčka ostnatého drátu Concertina wire coil @@ -30,7 +30,7 @@ NATO-Draht abbauen Демонтировать проволочную спираль Zwiń drut kolczasty - Dismount Concertina wire + Desmontar alambre de espino Dismount Concertina wire Svinout ostnatý drát Dismount Concertina wire @@ -42,7 +42,7 @@ NATO-Draht verlegen Монтировать проволочную спираль Rozwiń drut kolczasty - Deploy Concertina wire + Desplegar alambre de espino Deploy Concertina wire Rozvinout ostnatý drát Deploy Concertina wire diff --git a/addons/explosives/stringtable.xml b/addons/explosives/stringtable.xml index a2c3612b24..7ab3c13fe0 100644 --- a/addons/explosives/stringtable.xml +++ b/addons/explosives/stringtable.xml @@ -550,15 +550,16 @@ Explosão no desarmamento? Eksplozja przy rozbrajaniu? Explodovat při zneškodňování? + Explotar al desactivar? Enable certain explosives to explode on defusal? Default: Yes Ativa certos explosivos para detonar no desarmamento? Padrão: Sim Spraw, aby niektóre ładunki wybuchowe eksplodowały przy próbie ich rozbrojenia? Domyślnie:Tak Umožnit u některých výbušnin explozi při pokusu je zneškodnit? Výchozí: Ano + ¿Habilitar ciertos explosivos para estallar al desactivar? Por defecto: Sí - Moduł ten pozwala dostosować opcje związane z ładunkami wybuchowymi, ich podkładaniem oraz rozbrajaniem. Dieses Modul erlaubt die Einstellungen für Sprengstoffe zu verändern. Tento modul umoňuje přizpůsobit nastavení týkajících se výbušnin. diff --git a/addons/huntir/stringtable.xml b/addons/huntir/stringtable.xml index 79f9a778e1..7e7767f349 100644 --- a/addons/huntir/stringtable.xml +++ b/addons/huntir/stringtable.xml @@ -4,7 +4,7 @@ HuntIR Transport Box HuntIR Transportkiste - HuntIR Transport Box + Caja de transporte de HuntIR Trasnportní bedna HuntIR Ящик с HuntIR HuntIR Transport Box @@ -16,7 +16,7 @@ HuntIR Round HuntIR Granate - HuntIR Round + Proyectil HuntIR HuntIR Round HuntIR снаряд HuntIR Round @@ -28,7 +28,7 @@ HuntIR monitor HuntIR Monitor - HuntIR monitor + Monitor HuntIR HuntIR monitor HuntIR монитор HuntIR monitor @@ -40,7 +40,7 @@ Activate HuntIR monitor HuntIR Monitor aktivieren - Activate HuntIR monitor + Activar monitor HuntIR Zapnout HuntIR monitor Включить HuntIR монитор Activate HuntIR monitor @@ -52,7 +52,7 @@ Camera: Kamera: - Camera: + Camara: Kamera: Камера: Camera: @@ -64,7 +64,7 @@ Altitude: Höhe: - Altitude: + Altitud: Výška: Высота: Altitude: @@ -76,7 +76,7 @@ Recording Time: Aufnahmezeit: - Recording Time: + Tiempo de grabación: Čas nahrávání: Время записи: Recording Time: @@ -88,7 +88,7 @@ Press ESC to quit camera Zum Verlassen ESC drücken - Press ESC to quit camera + Pulsar ESC para salir de la camara Stiskni ESC pro opustění kamery Нажмите ESC чтобы выйти из режима камеры Press ESC to quit camera @@ -100,7 +100,7 @@ Help Hilfe - Help + Ayuda Pomoc Помощь Help @@ -112,7 +112,7 @@ A/D - Cycle zoom A/D - Zoom - A/D - Cycle zoom + A/D - Cambiar zoom A/D - Změna přiblížení A/D - Приближение A/D - Cycle zoom @@ -124,7 +124,7 @@ W/S - Select camera W/S - Wähle Kamera - W/S - Select camera + W/S - Seleccionar camara W/S - Výběr kamery W/S - Выбрать камеру W/S - Select camera @@ -136,7 +136,7 @@ Left/Right - Rotate camera Links/Rechts - Rotiere Kamera - Left/Right - Rotate camera + Left/Right - Rotar camara Levá/Pravá - Rotace kamery Влево/Вправо - Вращать камеру Left/Right - Rotate camera @@ -148,7 +148,7 @@ Up/Down - Elevate/lower camera Hoch/Runter - Neige Kamera - Up/Down - Elevate/lower camera + Up/Down - Subir/bajar camara Nahoru/Dolu - Zvýšít/snížit úhel pohledu kamery Вверх/Вниз - Поднять/Опустить камеру Up/Down - Elevate/lower camera @@ -160,7 +160,7 @@ N - Cycle IT modes N - Sichtmodi - N - Cycle IT modes + N - Cambiar modos de IT N - Změna režimů kamery N - Режимы камеры N - Cycle IT modes @@ -172,7 +172,7 @@ R - Reset camera R - Reset - R - Reset camera + R - Reiniciar camara R - Reset kamery R - Сбросить настройки камеры R - Reset camera @@ -184,7 +184,7 @@ Esc - Exit help ESC - Hilfe verlassen - Esc - Exit help + Esc - Salit de ayuda Esc - Ukončit pomoc Esc - Выйти из помощи Esc - Exit help diff --git a/addons/interact_menu/stringtable.xml b/addons/interact_menu/stringtable.xml index 4ab84e1c51..5ab782803d 100644 --- a/addons/interact_menu/stringtable.xml +++ b/addons/interact_menu/stringtable.xml @@ -89,6 +89,7 @@ Zeus Actions Akcje Zeusa Akce Zeuse + Acciones Zeus Interaction - Text Max @@ -246,7 +247,7 @@ Black Przyciemnienie ekranu - Negra + Negro Černý obraz Preto @@ -254,11 +255,13 @@ Show actions for buildings Pokazuj akcje dla budynków Zobrazit akci pro budovy + Mostrar acciones para edificios Adds interaction actions for opening doors and mounting ladders on buildings. (Note: There is a performance cost when opening interaction menu, especially in towns) Dodaje opcje interakcji dla otwierania drzwi oraz wchodzenia po drabinach do budynków. Uwaga: Użycie tej opcji może spowodować spadek wydajności menu interakcji, szczególnie w dużych miastach. Přidá možnost interakce pro otevření dvěří a umistňovat žebříky na budovy. (Poznámka: Použití této možnosti snižuje výkon při otevírání pomocí interakčního menu, zejména ve velkých městech.) + Añade las acciones de interacción para la apertura de puertas y montaje de escaleras en los edificios. (Nota: Hay un coste de rendimiento al abrir el menú de interacción, especialmente en las ciudades) \ No newline at end of file diff --git a/addons/interaction/stringtable.xml b/addons/interaction/stringtable.xml index 7b20dde7c0..5bd3282872 100644 --- a/addons/interaction/stringtable.xml +++ b/addons/interaction/stringtable.xml @@ -797,6 +797,7 @@ Open Otwórz Otevřít + Abrir Interaction System @@ -828,6 +829,7 @@ Die Gruppenverwaltung erlaubt die Zuweisung von Farben für Einheiten, die Kommandierung und das Beitreten/Verlassen einer Gruppe. Správa týmu se skládá z: přidělení barev pro členy týmu, převzetí velení, připojení/odpojení. O módulo de gestão de equipe é composto por: a atribuição de cores para os membros da equipe, comando das equipes, juntando-se / deixando equipes. + La gestión del equipo permite la asignación de colores para los miembros del equipo, tomando el mando del equipo y uniendo/dejando equipos. \ No newline at end of file diff --git a/addons/map/stringtable.xml b/addons/map/stringtable.xml index 0f252d5b97..9b7627e66e 100644 --- a/addons/map/stringtable.xml +++ b/addons/map/stringtable.xml @@ -74,7 +74,6 @@ Mostrar as coordenadas de grade no ponteiro do mouse? - Moduł ten pozwala dostosować opcje widoku ekranu mapy. Dieses Modul erweitert die Kartenfunktionen. Tento modul umožňuje přizpůsobit mapu s obrazem. @@ -83,7 +82,7 @@ Blue Force Tracking Blue Force Tracking - Seguimiento de fuerzas amigas + Blue Force Tracking Blue Force Tracking Blue Force Tracking Rastreio de forças azuis @@ -93,12 +92,14 @@ RFA ativo Aktywuj BFT Povolit BFT + Activar BFT Enable Blue Force Tracking. Default: No Ativa Rastreio de Forças Azuis. Padrão: Não Aktywuj Blue Force Tracking. Domyślnie: Nie Povolit Blue Force Tracking. Výchozí: Ne + Activar Blue Force Tracking. Por defecto: No Interval @@ -133,7 +134,6 @@ Esconder marcadores que pertencem ao grupo de IA? - Pozwala śledzić na mapie pozycje sojuszniczych jednostek za pomocą markerów BFT. Dieses Modul ermöglicht es verbündete Einheiten mit dem BFT auf der Karte zu verfolgen. Umožňuje sledovat přátelské jednokty na mapě v rámci BFT. diff --git a/addons/medical/stringtable.xml b/addons/medical/stringtable.xml index 35f989e8a1..5ceb625f59 100644 --- a/addons/medical/stringtable.xml +++ b/addons/medical/stringtable.xml @@ -3192,10 +3192,12 @@ Condition PAK Podmínka osobní lékárničky + Condición EPA When can the Personal Aid Kit be used? Kde může být použita osobní lékárnička? + ¿Cuando se puede utilizar el Equipo de primeros auxilios? Anywhere @@ -3299,10 +3301,12 @@ Condition Surgical kit (Adv) Podmínka chirurgické soupravy (Pokr.) + Condición de equipo quirúrgico (Av) When can the Surgical kit be used? Kde může být použita chirurgická souprava? + ¿Cuando se puede utilizar el equipo quirúrgico? Bloodstains @@ -3454,8 +3458,6 @@ É médico - - Moduł ten pozwala przypisać klasę medyczną wybranym jednostkom. Dieses Modul legt fest welche Einheit ein Sanitäter ist. Tento modul určuje, která jednotka je zdravotník. @@ -3632,10 +3634,12 @@ Anytime Kdykoli + Siempre Stable Stabilní + Estable \ No newline at end of file diff --git a/addons/sandbag/stringtable.xml b/addons/sandbag/stringtable.xml index 70dde0da56..5576add969 100644 --- a/addons/sandbag/stringtable.xml +++ b/addons/sandbag/stringtable.xml @@ -6,7 +6,7 @@ Sandsack Мешок с песком Worek z piaskiem - Sandbag + Saco de arena Sac de sable Pytel s pískem Sacco di Sabbia @@ -18,7 +18,7 @@ Sandsack (leer) Мешок с песком (пустой) Worek na piasek - Sandbag (empty) + Saco de arena (vacio) Sac de sable (vide) Pytel na písek (prázdný) Sacco di Sabbia (Vuoto) @@ -30,7 +30,7 @@ Nicht möglich Установка на этом месте невозможна Nie można tu budować - Cannot build here + No se puede construir aqui Impossible de construire ici Zde nelze postavit Impossibile costruire qui @@ -42,7 +42,7 @@ Sandsack abbauen Взять мешок с песком Zabierz worek - Pick up sandbag + Coger saco de arena Prendre sac de sable Zvednout pytel Prendi Sacco di Sabbia @@ -54,7 +54,7 @@ Sandsack tragen Нести мешок с песком Przenieś worek - Carry sandbag + Portar saco de arena Porter sac de sable Nést pytel Trasporta Sacco di Sabbia @@ -66,7 +66,7 @@ Tragen beenden Завершить переноску Zostaw worek - End carrying + Dejar de portar Arreter de porter Položit Fine Trasporto @@ -78,7 +78,7 @@ Sandsack ablegen Положить мешок Upuść worek - Drop sandbag + Soltar saco de arena Lacher sac de sable Odložit pytel Lascia Sacco di Sabbia @@ -90,7 +90,7 @@ Aufbauen Подтвердить установку Potwierdź rozłożenie - Confirm Deployment + Confirmar despliegue Confirmer Déploiement Potvrdit Položení Conferma Posizionamento @@ -102,7 +102,7 @@ Abbrechen Отменить установку Anuluj rozłożenie - Cancel Deployment + Cancelar despliegue Annuler Déploiement Zrušit Položení Cancella Posizionamento @@ -114,7 +114,7 @@ Sandsack aufbauen Установить мешок с песком Rozłóż worek z piaskiem - Deploy sandbag + Desplegar saco de arena Deployer sac de sable Umístit pytel Posiziona Sacco di Sabbia @@ -126,7 +126,7 @@ Sandsack Kiste Ящик мешков с песком Skrzynia worków na piasek - Sandbag box + Caja de sacos de arena Caisse de sacs de sable Bedna na pytle s pískem Contenitore Sacchi di Sabbia @@ -138,7 +138,7 @@ Hier gibt es keinen Sand Здесь нет песка Tu nie ma piasku - Here is no sand + Aqui no hay arena Pas de sable ici Tady není písek Qui non cè Sabbia diff --git a/addons/sitting/stringtable.xml b/addons/sitting/stringtable.xml index cbf63d2117..443c34c360 100644 --- a/addons/sitting/stringtable.xml +++ b/addons/sitting/stringtable.xml @@ -6,30 +6,35 @@ Usiądź Sentar Sednout si + Sentarse Stand Up Wstań Levantar Vstát + Levantarse Enable Sitting Habilitar opção para sentar Aktywuj siadanie Povolit sezení + Acivar asiento Sitting Sentado Siadanie Sedící + Sentarse This module allows you to disable the ability to sit on chairs and toilets. Este módulo permite que você desabilite a capacidade de sentar-se em cadeiras e banheiros. Moduł ten pozwala na włączenie lub wyłączenie możliwości siadania na krzesłach i toaletach. Tento modul dovoluje zakázat možnost sedět na židlých a toaletách. + Este módulo te permite desactivar la capacidad de sentarte en sillas y aseos. \ No newline at end of file diff --git a/addons/spectator/stringtable.xml b/addons/spectator/stringtable.xml index f271bfabf5..5cd585108a 100644 --- a/addons/spectator/stringtable.xml +++ b/addons/spectator/stringtable.xml @@ -5,76 +5,91 @@ Spectator Obserwator Pozorovatel + Espectador Enable Spectator Aktywuj obserwatora Povolit pozorovatele + Activar espectador Begin spectating on player death? Włącz obserwatora po śmierci gracza? Přepnout do pozorovatele po hráčově smrti? + ¿Comenzar como espectador al morir el jugador? Player Side Only Tylko strona gracza Pouze strana hráče + Sólo bando del jugador Only spectate units belonging to player's side? Pozwól obserwować jednostki będące tylko po stronie gracza? Pozorovat pouze jednotky patřící k hráčově straně? + ¿Sólo observar unidades que pertenecen al bando del jugador? Spectate AI Obserwacja AI Pozorovat AI + Observar IA Allow spectating of AI units? Pozwól obserwować jednostki AI? Umožnit pozorovat AI jednotky? + ¿Permitir observar unidades de la IA? Track Units Śledź jednostki Sledovat jednotky + Seguir unidades Track units' movements throughout mission? Śledź ruch jednostek w trakcie misji? Sledovat pohyby jednotek napříč misí? + ¿Seguimiento de movimientos de unidades a lo largo de la misión? Start Position Pozycja startowa Počáteční pozice + Posición de inicio Use this module as a starting position for spectator camera? Użyj pozycji modułu jako pozycje startową dla kamery obserwatora? Použít tento modul jako počáteční pozici pro pozorovací kameru? + ¿Utiliza este módulo como una posición de inicio para la cámara de espectador? End Mission Zakończ misję Konec mise + Finalizar misión End mission when all players dead (default BIS behaviour)? Zakończ misję kiedy wszyscy gracze będą martwi (domyślne zachowanie BIS)? Ukončit misi když umřou všichni hráči (výchozí BIS chování)? + ¿Finalizar misión cuando todos los jugadores mueran (comportamiento por defecto de BIS)? View Distance Zasięg widzenia Dohlednost + Distancia de visión OK OK OK + Aceptar \ No newline at end of file diff --git a/addons/spottingscope/stringtable.xml b/addons/spottingscope/stringtable.xml index 8c5425dc2b..e20f0635ea 100644 --- a/addons/spottingscope/stringtable.xml +++ b/addons/spottingscope/stringtable.xml @@ -6,7 +6,7 @@ Teleskop Зрительная труба Teleskop - Spotting Scope + Telescopio Téléscope de visée Zaměřovací Dalekohled Spotting Scope @@ -18,7 +18,7 @@ Teleskop aufnehmen Поднять зрительная трубу Zabierz teleskop - Pick up Spotting Scope + Coger telescopio Prendre téléscope de visée Zvednout Zaměřovací dalekohled Raccogli spottingscope @@ -30,7 +30,7 @@ Teleskop aufstellen Установить зрительная трубу Ustaw teleskop - Place Spotting Scope + Colocar telescopio Placer téléscope de visée Položit Zaměřovací dalekohled Posiziona spottingscope From d3bed7aedbd8c6e8830bdc74dbf90136f2324451 Mon Sep 17 00:00:00 2001 From: Glowbal Date: Thu, 9 Jul 2015 13:02:48 +0200 Subject: [PATCH 77/86] fixed -1 to disable the revive timer does not work --- addons/medical/functions/fnc_setDead.sqf | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/addons/medical/functions/fnc_setDead.sqf b/addons/medical/functions/fnc_setDead.sqf index 831a1fa6a0..c29edcd5e3 100644 --- a/addons/medical/functions/fnc_setDead.sqf +++ b/addons/medical/functions/fnc_setDead.sqf @@ -49,7 +49,7 @@ if (((_reviveVal == 1 && {[_unit] call EFUNC(common,isPlayer)} || _reviveVal == _unit = _args select 0; _startTime = _unit getvariable [QGVAR(reviveStartTime), 0]; - if (ACE_time - _startTime > GVAR(maxReviveTime)) exitwith { + if (GVAR(maxReviveTime) > 0 && {ACE_time - _startTime > GVAR(maxReviveTime)}) exitwith { [(_this select 1)] call cba_fnc_removePerFrameHandler; _unit setvariable [QGVAR(inReviveState), nil, true]; _unit setvariable [QGVAR(reviveStartTime), nil]; From c0c07b3adab318bc053ac9c7c9f9cec0a82c5219 Mon Sep 17 00:00:00 2001 From: bux578 Date: Fri, 10 Jul 2015 10:19:28 +0200 Subject: [PATCH 78/86] fix typos in documentation --- documentation/feature/concertina_wire.md | 4 ++-- documentation/feature/modules.md | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/documentation/feature/concertina_wire.md b/documentation/feature/concertina_wire.md index 8fd8a58eb6..72c63ece5e 100644 --- a/documentation/feature/concertina_wire.md +++ b/documentation/feature/concertina_wire.md @@ -1,6 +1,6 @@ --- layout: wiki -title: concertina wire +title: Concertina Wire description: group: feature parent: wiki @@ -8,7 +8,7 @@ parent: wiki ## 1. Overview -A concertina wire is a type of barbed wire formed in large coils that can be expanded to form obstacles, in ACE3 any vehicle making contact with it get it's tires destroyed. +A concertina wire is a type of barbed wire formed in large coils that can be expanded to form obstacles, in ACE3 any vehicle making contact with it gets its tires destroyed. ## 2. Usage diff --git a/documentation/feature/modules.md b/documentation/feature/modules.md index 3d8f27136b..3b6bcef0b8 100644 --- a/documentation/feature/modules.md +++ b/documentation/feature/modules.md @@ -1,6 +1,6 @@ --- layout: wiki -title: modules +title: Modules group: feature parent: wiki --- @@ -11,4 +11,4 @@ This is taking care of module initialization **DO NOT REMOVE**. ## 2. Dependencies -`ace_main` reminder: **DO NOT REMOVE**. +`ace_main` From e437fbbacdadc0bba7b46d4f20b3c328336d0601 Mon Sep 17 00:00:00 2001 From: jonpas Date: Fri, 10 Jul 2015 22:42:40 +0200 Subject: [PATCH 79/86] Removed safety from binoculars/designators --- addons/safemode/XEH_postInit.sqf | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/addons/safemode/XEH_postInit.sqf b/addons/safemode/XEH_postInit.sqf index 7ab283f6b6..c7132dd76c 100644 --- a/addons/safemode/XEH_postInit.sqf +++ b/addons/safemode/XEH_postInit.sqf @@ -14,7 +14,7 @@ if (!hasInterface) exitWith {}; // Conditions: canInteract if !([ACE_player, objNull, ["isNotEscorting"]] call EFUNC(common,canInteractWith)) exitWith {false}; // Conditions: specific - if !([ACE_player] call EFUNC(common,canUseWeapon)) exitWith {false}; + if !([ACE_player] call EFUNC(common,canUseWeapon) && {currentWeapon ACE_player != binocular ACE_player}) exitWith {false}; // Statement [ACE_player, currentWeapon ACE_player, currentMuzzle ACE_player] call FUNC(lockSafety); From 4826fd5c1cf8150081057805bfc937af0b3a24d7 Mon Sep 17 00:00:00 2001 From: jonpas Date: Fri, 10 Jul 2015 22:52:04 +0200 Subject: [PATCH 80/86] Exit Ear Rining PFH when disabled during ringing --- addons/hearing/functions/fnc_earRinging.sqf | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/addons/hearing/functions/fnc_earRinging.sqf b/addons/hearing/functions/fnc_earRinging.sqf index 74e2768c4c..ce85ac2a22 100644 --- a/addons/hearing/functions/fnc_earRinging.sqf +++ b/addons/hearing/functions/fnc_earRinging.sqf @@ -45,7 +45,7 @@ GVAR(earRingingPFH) = [{ private ["_prior"]; _prior = (_unit getvariable [QGVAR(dv), 0]) min 20; - if (!alive _unit || _prior <= 0) exitWith { + if (!alive _unit || _prior <= 0 || GVAR(DisableEarRinging)) exitWith { _unit setVariable [QGVAR(dv), 0]; _unit setVariable [QGVAR(prior), 0]; GVAR(beep) = false; From ef180064236cb8326ce7eb98caba5f9bcc1b7394 Mon Sep 17 00:00:00 2001 From: jonpas Date: Fri, 10 Jul 2015 23:34:36 +0200 Subject: [PATCH 81/86] Tripod indentation to 4 spaces, removed empty first lines --- addons/tripod/CfgEventHandlers.hpp | 6 +++--- addons/tripod/CfgVehicles.hpp | 1 - addons/tripod/CfgWeapons.hpp | 1 - 3 files changed, 3 insertions(+), 5 deletions(-) diff --git a/addons/tripod/CfgEventHandlers.hpp b/addons/tripod/CfgEventHandlers.hpp index ed5027f094..d700ed4c85 100644 --- a/addons/tripod/CfgEventHandlers.hpp +++ b/addons/tripod/CfgEventHandlers.hpp @@ -1,7 +1,7 @@ class Extended_PreInit_EventHandlers { - class ADDON { - init = QUOTE( call COMPILE_FILE(XEH_preInit) ); - }; + class ADDON { + init = QUOTE( call COMPILE_FILE(XEH_preInit) ); + }; }; class Extended_PostInit_EventHandlers { diff --git a/addons/tripod/CfgVehicles.hpp b/addons/tripod/CfgVehicles.hpp index 714d2cafb1..cb1774cdf4 100644 --- a/addons/tripod/CfgVehicles.hpp +++ b/addons/tripod/CfgVehicles.hpp @@ -1,4 +1,3 @@ - class CfgVehicles { class Man; class CAManBase: Man { diff --git a/addons/tripod/CfgWeapons.hpp b/addons/tripod/CfgWeapons.hpp index cc7521f0f2..5ae0ee84d2 100644 --- a/addons/tripod/CfgWeapons.hpp +++ b/addons/tripod/CfgWeapons.hpp @@ -1,4 +1,3 @@ - class CfgWeapons { class ACE_ItemCore; class InventoryItem_Base_F; From c90c83831da308d8e35ee8e9bb47ca920f2679f8 Mon Sep 17 00:00:00 2001 From: jonpas Date: Fri, 10 Jul 2015 23:36:30 +0200 Subject: [PATCH 82/86] Removed Tripod PBOPREFIX newline --- addons/tripod/$PBOPREFIX$ | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/addons/tripod/$PBOPREFIX$ b/addons/tripod/$PBOPREFIX$ index a374eb7994..2a79aeafd9 100644 --- a/addons/tripod/$PBOPREFIX$ +++ b/addons/tripod/$PBOPREFIX$ @@ -1 +1 @@ -z\ace\addons\tripod +z\ace\addons\tripod \ No newline at end of file From 6de3df64743fc2fcebdef03457366d4cd3cfcc1b Mon Sep 17 00:00:00 2001 From: PabstMirror Date: Sat, 11 Jul 2015 12:42:19 -0500 Subject: [PATCH 83/86] Update README.md --- addons/backpacks/README.md | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/addons/backpacks/README.md b/addons/backpacks/README.md index 9c721428b1..6fa54a9897 100644 --- a/addons/backpacks/README.md +++ b/addons/backpacks/README.md @@ -1,8 +1,7 @@ -ace_lockbackpacks +ace_backpacks ================= -Introduces the ability to lock one's backpack. - +Adds indication when someone else opens your backpack (soundeffect / camShake). ## Maintainers From d4f70134e69e44c9f1b93295ccd528638fd3d8ea Mon Sep 17 00:00:00 2001 From: PabstMirror Date: Sun, 12 Jul 2015 10:25:00 -0500 Subject: [PATCH 84/86] medical/setUnconscious header --- addons/medical/functions/fnc_setUnconscious.sqf | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/addons/medical/functions/fnc_setUnconscious.sqf b/addons/medical/functions/fnc_setUnconscious.sqf index 3298c0a869..7e5cd8c1b7 100644 --- a/addons/medical/functions/fnc_setUnconscious.sqf +++ b/addons/medical/functions/fnc_setUnconscious.sqf @@ -6,10 +6,14 @@ * 0: The unit that will be put in an unconscious state * 1: Set unconsciouns * 2: Minimum unconscious ACE_time + * 3: Force AI Unconscious (skip random death chance) * * ReturnValue: * nil * + * Example: + * [bob, true] call ace_medical_fnc_setUnconscious; + * * Public: yes */ From 01ba50bbb294bd9e1a97ba01774fba3ef30a78f2 Mon Sep 17 00:00:00 2001 From: jonpas Date: Mon, 13 Jul 2015 22:12:54 +0200 Subject: [PATCH 85/86] Fixed ELSTRING macro typo --- addons/main/script_macros.hpp | 2 +- addons/reloadlaunchers/functions/fnc_load.sqf | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/addons/main/script_macros.hpp b/addons/main/script_macros.hpp index 1fb4a0b622..ae1e1cb685 100644 --- a/addons/main/script_macros.hpp +++ b/addons/main/script_macros.hpp @@ -25,7 +25,7 @@ #ifndef STRING_MACROS_GUARD #define STRING_MACROS_GUARD #define LSTRING(var1) QUOTE(TRIPLES(STR,ADDON,var1)) - #define LESTRING(var1,var2) QUOTE(TRIPLES(STR,DOUBLES(PREFIX,var1),var2)) + #define ELSTRING(var1,var2) QUOTE(TRIPLES(STR,DOUBLES(PREFIX,var1),var2)) #define CSTRING(var1) QUOTE(TRIPLES($STR,ADDON,var1)) #define ECSTRING(var1,var2) QUOTE(TRIPLES($STR,DOUBLES(PREFIX,var1),var2)) #endif diff --git a/addons/reloadlaunchers/functions/fnc_load.sqf b/addons/reloadlaunchers/functions/fnc_load.sqf index 745bb2a5cb..ce7b743df5 100644 --- a/addons/reloadlaunchers/functions/fnc_load.sqf +++ b/addons/reloadlaunchers/functions/fnc_load.sqf @@ -38,7 +38,7 @@ _onSuccess = { }; _onFailure = { - [localize LESTRING(common,ActionAborted)] call DEFUNC(common,displayTextStructured); + [localize ELSTRING(common,ActionAborted)] call DEFUNC(common,displayTextStructured); }; _condition = { From e1fb4db63a8bf880d3552272a506cf7187478687 Mon Sep 17 00:00:00 2001 From: jonpas Date: Wed, 15 Jul 2015 00:42:41 +0200 Subject: [PATCH 86/86] Fixed chairs inheritance in sitting --- addons/sitting/CfgVehicles.hpp | 80 +++++++++++++++++----------------- 1 file changed, 41 insertions(+), 39 deletions(-) diff --git a/addons/sitting/CfgVehicles.hpp b/addons/sitting/CfgVehicles.hpp index c915750d02..5fbcdab06e 100644 --- a/addons/sitting/CfgVehicles.hpp +++ b/addons/sitting/CfgVehicles.hpp @@ -63,7 +63,7 @@ class CfgVehicles { GVAR(sitRotation) = 10; }; // Camping Chair - class Land_CampingChair_V2_F: ThingX { + class Land_CampingChair_V2_F: ThingX { XEH_ENABLED; MACRO_SEAT_ACTION GVAR(canSit) = 1; @@ -71,44 +71,8 @@ class CfgVehicles { GVAR(sitPosition[]) = {0, -0.1, -0.45}; GVAR(sitRotation) = 45; }; - // Chair (Plastic) - class Land_ChairPlastic_F: ThingX { - XEH_ENABLED; - MACRO_SEAT_ACTION - GVAR(canSit) = 1; - GVAR(sitDirection) = 90; - GVAR(sitPosition[]) = {0, 0, -0.5}; - GVAR(sitRotation) = 5; - }; - // Chair (Wooden) - class Land_ChairWood_F: ThingX { - XEH_ENABLED; - MACRO_SEAT_ACTION - GVAR(canSit) = 1; - GVAR(sitDirection) = 180; - GVAR(sitPosition[]) = {0, -0.05, 0}; - GVAR(sitRotation) = 75; - }; - // Office Chair - class Land_OfficeChair_01_F: ThingX { - XEH_ENABLED; - MACRO_SEAT_ACTION - GVAR(canSit) = 1; - GVAR(sitDirection) = 180; - GVAR(sitPosition[]) = {0, 0, -0.6}; - GVAR(sitRotation) = 15; - }; - // Rattan Chair - class Land_RattanChair_01_F: ThingX { - XEH_ENABLED; - MACRO_SEAT_ACTION - GVAR(canSit) = 1; - GVAR(sitDirection) = 180; - GVAR(sitPosition[]) = {0, -0.1, -1}; // Z must be -1 due to chair's geometry (magic floating seat point) - GVAR(sitRotation) = 2; - }; // Field Toilet - class Land_FieldToilet_F: ThingX { + class Land_FieldToilet_F: ThingX { XEH_ENABLED; MACRO_SEAT_ACTION GVAR(canSit) = 1; @@ -117,7 +81,7 @@ class CfgVehicles { GVAR(sitRotation) = 10; }; // Toiletbox - class Land_ToiletBox_F: ThingX { + class Land_ToiletBox_F: ThingX { XEH_ENABLED; MACRO_SEAT_ACTION GVAR(canSit) = 1; @@ -125,4 +89,42 @@ class CfgVehicles { GVAR(sitPosition[]) = {0, 0.75, -1.1}; GVAR(sitRotation) = 10; }; + + class Furniture_base_F; + // Chair (Plastic) + class Land_ChairPlastic_F: Furniture_base_F { + XEH_ENABLED; + MACRO_SEAT_ACTION + GVAR(canSit) = 1; + GVAR(sitDirection) = 90; + GVAR(sitPosition[]) = {0, 0, -0.5}; + GVAR(sitRotation) = 5; + }; + // Chair (Wooden) + class Land_ChairWood_F: Furniture_base_F { + XEH_ENABLED; + MACRO_SEAT_ACTION + GVAR(canSit) = 1; + GVAR(sitDirection) = 180; + GVAR(sitPosition[]) = {0, -0.05, 0}; + GVAR(sitRotation) = 75; + }; + // Office Chair + class Land_OfficeChair_01_F: Furniture_base_F { + XEH_ENABLED; + MACRO_SEAT_ACTION + GVAR(canSit) = 1; + GVAR(sitDirection) = 180; + GVAR(sitPosition[]) = {0, 0, -0.6}; + GVAR(sitRotation) = 15; + }; + // Rattan Chair + class Land_RattanChair_01_F: Furniture_base_F { + XEH_ENABLED; + MACRO_SEAT_ACTION + GVAR(canSit) = 1; + GVAR(sitDirection) = 180; + GVAR(sitPosition[]) = {0, -0.1, -1}; // Z must be -1 due to chair's geometry (magic floating seat point) + GVAR(sitRotation) = 2; + }; };