From dd7e7463686ed731af9468726fbe7cc8716be089 Mon Sep 17 00:00:00 2001 From: Glowbal Date: Sat, 11 Apr 2015 19:52:30 +0200 Subject: [PATCH 001/104] formatting --- .../common/functions/fnc_disableUserInput.sqf | 142 ++++++++++-------- 1 file changed, 78 insertions(+), 64 deletions(-) diff --git a/addons/common/functions/fnc_disableUserInput.sqf b/addons/common/functions/fnc_disableUserInput.sqf index 57be44fe43c..a1486438b6d 100644 --- a/addons/common/functions/fnc_disableUserInput.sqf +++ b/addons/common/functions/fnc_disableUserInput.sqf @@ -1,14 +1,16 @@ /* * Author: commy2 - * * Disables key input. ESC can still be pressed to open the menu. * - * Argument: - * 0: True to disable key inputs, false to re-enable them (Bool) + * Arguments: + * 0: True to disable key inputs, false to re-enable them * * Return value: * Nothing + * + * Public: Yes */ + #include "script_component.hpp" private ["_state", "_dlg"]; @@ -16,76 +18,88 @@ private ["_state", "_dlg"]; _state = _this select 0; if (_state) then { - disableSerialization; + disableSerialization; - if (!isNull (uiNamespace getVariable [QGVAR(dlgDisableMouse), displayNull])) exitWith {}; - if ("ACE_DisableUserInput" in ([BIS_stackedEventHandlers_onEachFrame, {_this select 0}] call FUNC(map))) exitWith {}; + if (!isNull (uiNamespace getVariable [QGVAR(dlgDisableMouse), displayNull])) exitWith {}; + if ("ACE_DisableUserInput" in ([BIS_stackedEventHandlers_onEachFrame, {_this select 0}] call FUNC(map))) exitWith {}; - // end TFAR and ACRE2 radio transmissions - 0 spawn FUNC(endRadioTransmission); + // end TFAR and ACRE2 radio transmissions + call FUNC(endRadioTransmission); - // Close map - if (visibleMap && {!(player getVariable ["ACE_canSwitchUnits", false])}) then {openMap false}; - - closeDialog 0; - createDialog QGVAR(DisableMouse_Dialog); - - _dlg = uiNamespace getVariable QGVAR(dlgDisableMouse); + // Close map + if (visibleMap && {!(player getVariable ["ACE_canSwitchUnits", false])}) then { + openMap false; + }; - _dlg displayAddEventHandler ["KeyDown", { - _key = _this select 1; + closeDialog 0; + createDialog QGVAR(DisableMouse_Dialog); - if (_key == 1 && {alive player}) then { - createDialog (["RscDisplayInterrupt", "RscDisplayMPInterrupt"] select isMultiplayer); + _dlg = uiNamespace getVariable QGVAR(dlgDisableMouse); - disableSerialization; - _dlg = finddisplay 49; - _dlg displayAddEventHandler ["KeyDown", { + _dlg displayAddEventHandler ["KeyDown", { _key = _this select 1; - !(_key == 1) - }]; - - for "_index" from 100 to 2000 do { - (_dlg displayCtrl _index) ctrlEnable false; - }; - - _ctrl = _dlg displayctrl 103; - _ctrl ctrlSetEventHandler ["buttonClick", QUOTE(while {!isNull (uiNamespace getVariable [ARR_2(QUOTE(QGVAR(dlgDisableMouse)),displayNull)])} do {closeDialog 0}; failMission 'LOSER'; [false] call DFUNC(disableUserInput);)]; - _ctrl ctrlEnable true; - _ctrl ctrlSetText "ABORT"; - _ctrl ctrlSetTooltip "Abort."; - - _ctrl = _dlg displayctrl ([104, 1010] select isMultiplayer); - _ctrl ctrlSetEventHandler ["buttonClick", QUOTE(closeDialog 0; player setDamage 1; [false] call DFUNC(disableUserInput);)]; - _ctrl ctrlEnable (call {_config = missionConfigFile >> "respawnButton"; !isNumber _config || {getNumber _config == 1}}); - _ctrl ctrlSetText "RESPAWN"; - _ctrl ctrlSetTooltip "Respawn."; - }; - - if (_key in actionKeys "TeamSwitch" && {teamSwitchEnabled}) then {(uiNamespace getVariable [QGVAR(dlgDisableMouse), displayNull]) closeDisplay 0; teamSwitch};//_acc = accTime; teamSwitch; setAccTime _acc}; - if (_key in actionKeys "CuratorInterface" && {getAssignedCuratorLogic player in allCurators}) then {(uiNamespace getVariable [QGVAR(dlgDisableMouse), displayNull]) closeDisplay 0; openCuratorInterface}; - if (_key in actionKeys "ShowMap" && {player getVariable ["ACE_canSwitchUnits", false]}) then {(uiNamespace getVariable [QGVAR(dlgDisableMouse), displayNull]) closeDisplay 0; openMap true}; - - if (serverCommandAvailable "#missions" || {player getVariable ["ACE_isUnconscious", false] && {(call FUNC(player)) getVariable [QEGVAR(medical,AllowChatWhileUnconscious), missionNamespace getVariable [QEGVAR(medical,AllowChatWhileUnconscious), false]]}}) then { - if (!(_key in (actionKeys "DefaultAction" + actionKeys "Throw")) && {_key in (actionKeys "Chat" + actionKeys "PrevChannel" + actionKeys "NextChannel")}) then { - _key = 0; - }; - }; - _key > 0 - }]; - _dlg displayAddEventHandler ["KeyUp", {true}]; + if (_key == 1 && {alive player}) then { + createDialog (["RscDisplayInterrupt", "RscDisplayMPInterrupt"] select isMultiplayer); + + disableSerialization; + _dlg = finddisplay 49; + _dlg displayAddEventHandler ["KeyDown", { + _key = _this select 1; + !(_key == 1) + }]; + + for "_index" from 100 to 2000 do { + (_dlg displayCtrl _index) ctrlEnable false; + }; + + _ctrl = _dlg displayctrl 103; + _ctrl ctrlSetEventHandler ["buttonClick", QUOTE(while {!isNull (uiNamespace getVariable [ARR_2(QUOTE(QGVAR(dlgDisableMouse)),displayNull)])} do {closeDialog 0}; failMission 'LOSER'; [false] call DFUNC(disableUserInput);)]; + _ctrl ctrlEnable true; + _ctrl ctrlSetText "ABORT"; + _ctrl ctrlSetTooltip "Abort."; + + _ctrl = _dlg displayctrl ([104, 1010] select isMultiplayer); + _ctrl ctrlSetEventHandler ["buttonClick", QUOTE(closeDialog 0; player setDamage 1; [false] call DFUNC(disableUserInput);)]; + _ctrl ctrlEnable (call {_config = missionConfigFile >> "respawnButton"; !isNumber _config || {getNumber _config == 1}}); + _ctrl ctrlSetText "RESPAWN"; + _ctrl ctrlSetTooltip "Respawn."; + }; + + if (_key in actionKeys "TeamSwitch" && {teamSwitchEnabled}) then { + (uiNamespace getVariable [QGVAR(dlgDisableMouse), displayNull]) closeDisplay 0; teamSwitch + };//_acc = accTime; teamSwitch; setAccTime _acc}; + + if (_key in actionKeys "CuratorInterface" && {getAssignedCuratorLogic player in allCurators}) then { + (uiNamespace getVariable [QGVAR(dlgDisableMouse), displayNull]) closeDisplay 0; openCuratorInterface; + }; + + if (_key in actionKeys "ShowMap" && {player getVariable ["ACE_canSwitchUnits", false]}) then { + (uiNamespace getVariable [QGVAR(dlgDisableMouse), displayNull]) closeDisplay 0; openMap true + }; + + if (serverCommandAvailable "#missions" || {player getVariable ["ACE_isUnconscious", false] && {(call FUNC(player)) getVariable [QEGVAR(medical,AllowChatWhileUnconscious), missionNamespace getVariable [QEGVAR(medical,AllowChatWhileUnconscious), false]]}}) then { + if (!(_key in (actionKeys "DefaultAction" + actionKeys "Throw")) && {_key in (actionKeys "Chat" + actionKeys "PrevChannel" + actionKeys "NextChannel")}) then { + _key = 0; + }; + }; + + _key > 0 + }]; + + _dlg displayAddEventHandler ["KeyUp", {true}]; + + ["ACE_DisableUserInput", "onEachFrame", { + if (isNull (uiNamespace getVariable [QGVAR(dlgDisableMouse), displayNull]) && {!visibleMap && isNull findDisplay 49 && isNull findDisplay 312 && isNull findDisplay 632}) then { + ["ACE_DisableUserInput", "onEachFrame"] call BIS_fnc_removeStackedEventHandler; + [true] call FUNC(disableUserInput); + }; + }] call BIS_fnc_addStackedEventHandler; - ["ACE_DisableUserInput", "onEachFrame", { - if (isNull (uiNamespace getVariable [QGVAR(dlgDisableMouse), displayNull]) && {!visibleMap && isNull findDisplay 49 && isNull findDisplay 312 && isNull findDisplay 632}) then { - ["ACE_DisableUserInput", "onEachFrame"] call BIS_fnc_removeStackedEventHandler; - [true] call FUNC(disableUserInput); - }; - }] call BIS_fnc_addStackedEventHandler; } else { - if ("ACE_DisableUserInput" in ([BIS_stackedEventHandlers_onEachFrame, {_this select 0}] call FUNC(map))) then { - ["ACE_DisableUserInput", "onEachFrame"] call BIS_fnc_removeStackedEventHandler; - }; + if ("ACE_DisableUserInput" in ([BIS_stackedEventHandlers_onEachFrame, {_this select 0}] call FUNC(map))) then { + ["ACE_DisableUserInput", "onEachFrame"] call BIS_fnc_removeStackedEventHandler; + }; - (uiNamespace getVariable [QGVAR(dlgDisableMouse), displayNull]) closeDisplay 0; + (uiNamespace getVariable [QGVAR(dlgDisableMouse), displayNull]) closeDisplay 0; }; From 24765741ab3c9cacb0ad3e0aec9e6af4030311a8 Mon Sep 17 00:00:00 2001 From: Glowbal Date: Sat, 11 Apr 2015 20:05:22 +0200 Subject: [PATCH 002/104] Enabled setAccTime fix from commy --- addons/common/functions/fnc_disableUserInput.sqf | 13 +++++++++---- 1 file changed, 9 insertions(+), 4 deletions(-) diff --git a/addons/common/functions/fnc_disableUserInput.sqf b/addons/common/functions/fnc_disableUserInput.sqf index a1486438b6d..0b1275e9cf3 100644 --- a/addons/common/functions/fnc_disableUserInput.sqf +++ b/addons/common/functions/fnc_disableUserInput.sqf @@ -67,15 +67,20 @@ if (_state) then { }; if (_key in actionKeys "TeamSwitch" && {teamSwitchEnabled}) then { - (uiNamespace getVariable [QGVAR(dlgDisableMouse), displayNull]) closeDisplay 0; teamSwitch - };//_acc = accTime; teamSwitch; setAccTime _acc}; + (uiNamespace getVariable [QGVAR(dlgDisableMouse), displayNull]) closeDisplay 0; + _acc = accTime; + teamSwitch; + setAccTime _acc; + }; if (_key in actionKeys "CuratorInterface" && {getAssignedCuratorLogic player in allCurators}) then { - (uiNamespace getVariable [QGVAR(dlgDisableMouse), displayNull]) closeDisplay 0; openCuratorInterface; + (uiNamespace getVariable [QGVAR(dlgDisableMouse), displayNull]) closeDisplay 0; + openCuratorInterface; }; if (_key in actionKeys "ShowMap" && {player getVariable ["ACE_canSwitchUnits", false]}) then { - (uiNamespace getVariable [QGVAR(dlgDisableMouse), displayNull]) closeDisplay 0; openMap true + (uiNamespace getVariable [QGVAR(dlgDisableMouse), displayNull]) closeDisplay 0; + openMap true; }; if (serverCommandAvailable "#missions" || {player getVariable ["ACE_isUnconscious", false] && {(call FUNC(player)) getVariable [QEGVAR(medical,AllowChatWhileUnconscious), missionNamespace getVariable [QEGVAR(medical,AllowChatWhileUnconscious), false]]}}) then { From f57f7186c203f0e2f7faf4f30dc40aeea6e2a149 Mon Sep 17 00:00:00 2001 From: OnkelDisMaster Date: Sat, 11 Apr 2015 21:08:00 +0200 Subject: [PATCH 003/104] Config for compatiblity to ASDG Joint Rails Added the scopes and railitems to the according ASDG rails. --- optionals/asdg_comp/config.cpp | 42 ++++++++++++++++++++++++++++++++++ 1 file changed, 42 insertions(+) create mode 100644 optionals/asdg_comp/config.cpp diff --git a/optionals/asdg_comp/config.cpp b/optionals/asdg_comp/config.cpp new file mode 100644 index 00000000000..c82d5e06246 --- /dev/null +++ b/optionals/asdg_comp/config.cpp @@ -0,0 +1,42 @@ +#include "script_component.hpp" + +class CfgPatches +{ + class ADDON + { + units[] = {}; + weapons[] = {}; + requiredVersion = REQUIRED_VERSION; + requiredAddons[] = {"asdg_jointrails","ace_laserpointer","ace_optics"}; + author[]={"OnkelDisMaster"}; + authorUrl = "http://2.xn--gebirgsjgerkompanie-nwb.de/"; + VERSION_CONFIG; + }; +}; + +class asdg_SlotInfo; +class asdg_FrontSideRail: asdg_SlotInfo +{ + class compatibleItems + { + ACE_acc_pointer_red = 1; + ACE_acc_pointer_green = 1; + }; +}; + +class asdg_OpticRail; +class asdg_OpticRail1913: asdg_OpticRail +{ + class compatibleItems + { + ACE_optic_Hamr_2D = 1; + ACE_optic_Hamr_PIP = 1; + ACE_optic_Arco_2D = 1; + ACE_optic_Arco_PIP = 1; + ACE_optic_MRCO_2D = 1; + ACE_optic_SOS_2D = 1; + ACE_optic_SOS_PIP = 1; + ACE_optic_LRPS_2D = 1; + ACE_optic_LRPS_PIP = 1; + }; +}; From a18171547e231ad7f01bf5b2aa6ed4916203e7a7 Mon Sep 17 00:00:00 2001 From: OnkelDisMaster Date: Sat, 11 Apr 2015 21:11:06 +0200 Subject: [PATCH 004/104] script_component.hpp for asdg_comp Included in config.cpp of #485 --- optionals/asdg_comp/script_component.hpp | 5 +++++ 1 file changed, 5 insertions(+) create mode 100644 optionals/asdg_comp/script_component.hpp diff --git a/optionals/asdg_comp/script_component.hpp b/optionals/asdg_comp/script_component.hpp new file mode 100644 index 00000000000..e67bf3b9e4e --- /dev/null +++ b/optionals/asdg_comp/script_component.hpp @@ -0,0 +1,5 @@ +#define COMPONENT asdg_comp + +#include "\z\ace\addons\main\script_mod.hpp" + +#include "\z\ace\addons\main\script_macros.hpp" From 6899659f1c9fe5f055dd6207a852edd32a6d2952 Mon Sep 17 00:00:00 2001 From: OnkelDisMaster Date: Sat, 11 Apr 2015 21:19:37 +0200 Subject: [PATCH 005/104] Update config.cpp --- optionals/asdg_comp/config.cpp | 54 +++++++++++++++++----------------- 1 file changed, 27 insertions(+), 27 deletions(-) diff --git a/optionals/asdg_comp/config.cpp b/optionals/asdg_comp/config.cpp index c82d5e06246..1a51ba04320 100644 --- a/optionals/asdg_comp/config.cpp +++ b/optionals/asdg_comp/config.cpp @@ -2,41 +2,41 @@ class CfgPatches { - class ADDON - { - units[] = {}; - weapons[] = {}; - requiredVersion = REQUIRED_VERSION; - requiredAddons[] = {"asdg_jointrails","ace_laserpointer","ace_optics"}; - author[]={"OnkelDisMaster"}; - authorUrl = "http://2.xn--gebirgsjgerkompanie-nwb.de/"; - VERSION_CONFIG; - }; + class ADDON + { + units[] = {}; + weapons[] = {}; + requiredVersion = REQUIRED_VERSION; + requiredAddons[] = {"asdg_jointrails","ace_laserpointer","ace_optics"}; + author[]={"OnkelDisMaster"}; + authorUrl = "http://2.xn--gebirgsjgerkompanie-nwb.de/"; + VERSION_CONFIG; + }; }; class asdg_SlotInfo; class asdg_FrontSideRail: asdg_SlotInfo { - class compatibleItems - { - ACE_acc_pointer_red = 1; - ACE_acc_pointer_green = 1; - }; + class compatibleItems + { + ACE_acc_pointer_red = 1; + ACE_acc_pointer_green = 1; + }; }; class asdg_OpticRail; class asdg_OpticRail1913: asdg_OpticRail { - class compatibleItems - { - ACE_optic_Hamr_2D = 1; - ACE_optic_Hamr_PIP = 1; - ACE_optic_Arco_2D = 1; - ACE_optic_Arco_PIP = 1; - ACE_optic_MRCO_2D = 1; - ACE_optic_SOS_2D = 1; - ACE_optic_SOS_PIP = 1; - ACE_optic_LRPS_2D = 1; - ACE_optic_LRPS_PIP = 1; - }; + class compatibleItems + { + ACE_optic_Hamr_2D = 1; + ACE_optic_Hamr_PIP = 1; + ACE_optic_Arco_2D = 1; + ACE_optic_Arco_PIP = 1; + ACE_optic_MRCO_2D = 1; + ACE_optic_SOS_2D = 1; + ACE_optic_SOS_PIP = 1; + ACE_optic_LRPS_2D = 1; + ACE_optic_LRPS_PIP = 1; + }; }; From 876cec35df5b2f0a0859f4a460f2ffbc1ef09a9c Mon Sep 17 00:00:00 2001 From: OnkelDisMaster Date: Sat, 11 Apr 2015 21:20:59 +0200 Subject: [PATCH 006/104] Update config.cpp --- optionals/asdg_comp/config.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/optionals/asdg_comp/config.cpp b/optionals/asdg_comp/config.cpp index 1a51ba04320..d76a4da6540 100644 --- a/optionals/asdg_comp/config.cpp +++ b/optionals/asdg_comp/config.cpp @@ -31,7 +31,7 @@ class asdg_OpticRail1913: asdg_OpticRail { ACE_optic_Hamr_2D = 1; ACE_optic_Hamr_PIP = 1; - ACE_optic_Arco_2D = 1; + ACE_optic_Arco_2D = 1; ACE_optic_Arco_PIP = 1; ACE_optic_MRCO_2D = 1; ACE_optic_SOS_2D = 1; From 57bcb555e940730359c2c12fd5c79ffc1eaf5b29 Mon Sep 17 00:00:00 2001 From: OnkelDisMaster Date: Sat, 11 Apr 2015 21:22:07 +0200 Subject: [PATCH 007/104] Update config.cpp --- optionals/asdg_comp/config.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/optionals/asdg_comp/config.cpp b/optionals/asdg_comp/config.cpp index d76a4da6540..81115fc96fa 100644 --- a/optionals/asdg_comp/config.cpp +++ b/optionals/asdg_comp/config.cpp @@ -19,8 +19,8 @@ class asdg_FrontSideRail: asdg_SlotInfo { class compatibleItems { - ACE_acc_pointer_red = 1; - ACE_acc_pointer_green = 1; + ACE_acc_pointer_red = 1; + ACE_acc_pointer_green = 1; }; }; From 85acaa3ab8d4f31edd3cdfe0e7ef0bba2c472349 Mon Sep 17 00:00:00 2001 From: OnkelDisMaster Date: Sat, 11 Apr 2015 21:22:20 +0200 Subject: [PATCH 008/104] Update config.cpp --- optionals/asdg_comp/config.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/optionals/asdg_comp/config.cpp b/optionals/asdg_comp/config.cpp index 81115fc96fa..18ef70cb1c3 100644 --- a/optionals/asdg_comp/config.cpp +++ b/optionals/asdg_comp/config.cpp @@ -4,7 +4,7 @@ class CfgPatches { class ADDON { - units[] = {}; + units[] = {}; weapons[] = {}; requiredVersion = REQUIRED_VERSION; requiredAddons[] = {"asdg_jointrails","ace_laserpointer","ace_optics"}; From af255604ac098030613ab983a313e790dac2a02e Mon Sep 17 00:00:00 2001 From: Glowbal Date: Tue, 14 Apr 2015 21:17:36 +0200 Subject: [PATCH 009/104] Switched to event based sync system for open wounds --- addons/medical/XEH_postInit.sqf | 2 +- addons/medical/functions/fnc_handleDamage_wounds.sqf | 1 - .../medical/functions/fnc_onWoundUpdateRequest.sqf | 12 +++++------- addons/medical/functions/fnc_requestWoundSync.sqf | 4 ++-- addons/medical/script_component.hpp | 2 +- 5 files changed, 9 insertions(+), 12 deletions(-) diff --git a/addons/medical/XEH_postInit.sqf b/addons/medical/XEH_postInit.sqf index 1b0a38f1af4..37435117907 100644 --- a/addons/medical/XEH_postInit.sqf +++ b/addons/medical/XEH_postInit.sqf @@ -247,7 +247,7 @@ if (USE_WOUND_EVENT_SYNC) then { // We are only pulling the wounds for the units in the player group. Anything else will come when the unit interacts with them. { [_x, _newPlayer] call FUNC(requestWoundSync); - }foreach units group player; + }foreach units group _newPlayer; }; }] call EFUNC(common,addEventhandler); }; diff --git a/addons/medical/functions/fnc_handleDamage_wounds.sqf b/addons/medical/functions/fnc_handleDamage_wounds.sqf index 5933651e57e..b45a974166f 100644 --- a/addons/medical/functions/fnc_handleDamage_wounds.sqf +++ b/addons/medical/functions/fnc_handleDamage_wounds.sqf @@ -133,7 +133,6 @@ if (count _woundsCreated > 0) then { }; if (USE_WOUND_EVENT_SYNC) then { - // TODO Should this be done in a single broadcast? // Broadcast the new injuries across the net in parts. One broadcast per injury. Prevents having to broadcast one massive array of injuries. { ["medical_propagateWound", [_unit, _x]] call EFUNC(common,globalEvent); diff --git a/addons/medical/functions/fnc_onWoundUpdateRequest.sqf b/addons/medical/functions/fnc_onWoundUpdateRequest.sqf index c160e47ea03..ccbb373648b 100644 --- a/addons/medical/functions/fnc_onWoundUpdateRequest.sqf +++ b/addons/medical/functions/fnc_onWoundUpdateRequest.sqf @@ -1,11 +1,10 @@ /* * Author: Glowbal - * Enabled the vitals loop for a unit. + * Handles an wound update request. * * Arguments: * 0: The Unit - * 1: the last known ID - * 2: Origin object + * 1: Origin object * * ReturnValue: * @@ -14,12 +13,11 @@ */ #include "script_component.hpp" -private ["_unit", "_lastId", "_openWounds"]; +private ["_unit", "_openWounds"]; _unit = _this select 0; -_lastId = _this select 1; -_originOfrequest = _this select 2; +_originOfrequest = _this select 1; -if (local _unit) then { +if (local _unit && !(local _originOfrequest)) then { _openWounds = _unit getvariable [QGVAR(openWounds), []]; { ["medical_propagateWound", [_originOfrequest], [_unit, _x]] call EFUNC(common,targetEvent); diff --git a/addons/medical/functions/fnc_requestWoundSync.sqf b/addons/medical/functions/fnc_requestWoundSync.sqf index bf6f8819308..7144c49684f 100644 --- a/addons/medical/functions/fnc_requestWoundSync.sqf +++ b/addons/medical/functions/fnc_requestWoundSync.sqf @@ -14,11 +14,11 @@ #include "script_component.hpp" -private [ "_target", "_caller", "_openWounds","_lastId"]; +private [ "_target", "_caller", "_openWounds"]; _target = _this select 0; _caller = _this select 1; if (local _target || GVAR(level) < 2) exitwith {}; // if the target is local, we already got the most update to date information if (_target getvariable [QGVAR(isWoundSynced), false]) exitwith {}; _target setvariable [QGVAR(isWoundSynced), true]; -["medical_woundUpdateRequest", [_target], [_target, _lastId, _caller]] call EFUNC(common,targetEvent); +["medical_woundUpdateRequest", [_target], [_target, _caller]] call EFUNC(common,targetEvent); diff --git a/addons/medical/script_component.hpp b/addons/medical/script_component.hpp index 939a811a41e..bac6744bc17 100644 --- a/addons/medical/script_component.hpp +++ b/addons/medical/script_component.hpp @@ -11,4 +11,4 @@ #include "\z\ace\addons\main\script_macros.hpp" -#define USE_WOUND_EVENT_SYNC false +#define USE_WOUND_EVENT_SYNC true From 5eededd3e1a9808418cd3ca73797bfe47513bcba Mon Sep 17 00:00:00 2001 From: commy2 Date: Wed, 15 Apr 2015 15:01:07 +0200 Subject: [PATCH 010/104] Recoil overhaul initial commmit --- addons/recoil/$PBOPREFIX$ | 1 + addons/recoil/CfgRecoils.hpp | 240 +++++++++++++++++++++++++++++ addons/recoil/config.cpp | 15 ++ addons/recoil/script_component.hpp | 12 ++ 4 files changed, 268 insertions(+) create mode 100644 addons/recoil/$PBOPREFIX$ create mode 100644 addons/recoil/CfgRecoils.hpp create mode 100644 addons/recoil/config.cpp create mode 100644 addons/recoil/script_component.hpp diff --git a/addons/recoil/$PBOPREFIX$ b/addons/recoil/$PBOPREFIX$ new file mode 100644 index 00000000000..1ab9ffa5e1f --- /dev/null +++ b/addons/recoil/$PBOPREFIX$ @@ -0,0 +1 @@ +z\ace\addons\recoil \ No newline at end of file diff --git a/addons/recoil/CfgRecoils.hpp b/addons/recoil/CfgRecoils.hpp new file mode 100644 index 00000000000..27283e71f1a --- /dev/null +++ b/addons/recoil/CfgRecoils.hpp @@ -0,0 +1,240 @@ + +class CfgRecoils { + class Default { + muzzleOuter[] = {0,"0.4f","0.5f","0.6f"}; + muzzleInner[] = {0,"0.05f","0.2f","0.2f"}; + kickBack[] = {"0.05f",0.1}; + permanent = 0.1; + temporary = 0.01; + }; + + class recoil_default: Default { + muzzleOuter[] = {0.3,1,0.3,0.2}; + muzzleInner[] = {0,0,0.1,0.1}; + kickBack[] = {0.03,0.06}; + permanent = 0.1; + temporary = 0.01; + }; + + class recoil_mk20: recoil_default { + muzzleOuter[] = {0.2,0.6,0.2,0.2}; + kickBack[] = {0.01,0.03}; + temporary = 0.01; + }; + + class recoil_mk20c: recoil_default { + muzzleOuter[] = {0.2,0.8,0.3,0.2}; + kickBack[] = {0.02,0.04}; + temporary = 0.015; + }; + + class recoil_trg20: recoil_default { + muzzleOuter[] = {0.2,1,0.3,0.3}; + kickBack[] = {0.02,0.04}; + temporary = 0.015; + }; + + class recoil_trg21: recoil_default { + muzzleOuter[] = {0.2,0.8,0.3,0.2}; + kickBack[] = {0.01,0.03}; + temporary = 0.01; + }; + + class recoil_mx: recoil_default { + muzzleOuter[] = {0.3,1,0.4,0.3}; + kickBack[] = {0.02,0.04}; + temporary = 0.01; + }; + + class recoil_mxc: recoil_default { + muzzleOuter[] = {0.3,1.2,0.4,0.3}; + kickBack[] = {0.03,0.06}; + temporary = 0.015; + }; + + class recoil_sw: recoil_default { + muzzleOuter[] = {0.3,0.8,0.5,0.2}; + kickBack[] = {0.02,0.04}; + temporary = 0.005; + }; + + class recoil_mxm: recoil_default { + muzzleOuter[] = {0.3,0.8,0.4,0.3}; + kickBack[] = {0.02,0.04}; + temporary = 0.01; + }; + + class recoil_ktb: recoil_default { + muzzleOuter[] = {0.3,1,0.3,0.3}; + kickBack[] = {0.02,0.04}; + temporary = 0.01; + }; + + class recoil_ktbc: recoil_default { + muzzleOuter[] = {0.3,1.2,0.3,0.3}; + kickBack[] = {0.03,0.06}; + temporary = 0.015; + }; + + class recoil_smg_01: recoil_default { + muzzleOuter[] = {0.1,0.8,0.3,0.2}; + kickBack[] = {0.01,0.03}; + temporary = 0.015; + }; + + class recoil_smg_02: recoil_default { + muzzleOuter[] = {0.1,0.6,0.2,0.2}; + kickBack[] = {0.01,0.02}; + temporary = 0.01; + }; + + class recoil_pdw: recoil_default { + muzzleOuter[] = {0.2,1,0.3,0.3}; + kickBack[] = {0.02,0.04}; + temporary = 0.02; + }; + + class recoil_sdar: recoil_default { + muzzleOuter[] = {0.2,1,0.3,0.3}; + kickBack[] = {0.02,0.04}; + temporary = 0.01; + }; + + class recoil_pistol_p07: recoil_default { + muzzleOuter[] = {0.2,1,0.2,0.3}; + kickBack[] = {0.03,0.06}; + temporary = 0.03; + }; + + class recoil_pistol_rook40: recoil_default { + muzzleOuter[] = {0.2,1,0.2,0.3}; + kickBack[] = {0.03,0.06}; + temporary = 0.02; + }; + + class recoil_pistol_acpc2: recoil_default { + muzzleOuter[] = {0.2,1.5,0.2,0.3}; + kickBack[] = {0.04,0.08}; + temporary = 0.04; + }; + + class recoil_pistol_4five: recoil_default { + muzzleOuter[] = {0.2,1.5,0.2,0.3}; + kickBack[] = {0.04,0.08}; + temporary = 0.06; + }; + + class recoil_pistol_zubr: recoil_default { + muzzleOuter[] = {0.2,1.5,0.2,0.3}; + kickBack[] = {0.04,0.08}; + temporary = 0.08; + }; + + class recoil_pistol_signal: recoil_default { + muzzleOuter[] = {0.2,1.5,0.2,0.3}; + kickBack[] = {0.02,0.04}; + temporary = 0.02; + }; + + class recoil_rpg: recoil_default { + muzzleOuter[] = {2,3,1,0.5}; + kickBack[] = {0.08,0.1}; + temporary = 0.1; + }; + + class recoil_nlaw: recoil_default { + muzzleOuter[] = {2,3,1,0.5}; + kickBack[] = {0.06,0.08}; + temporary = 0.08; + }; + + class recoil_titan_long: recoil_default { + muzzleOuter[] = {2,3,1,0.5}; + kickBack[] = {0.1,0.12}; + temporary = 0.15; + }; + + class recoil_titan_short: recoil_default { + muzzleOuter[] = {2,3,1,0.5}; + kickBack[] = {0.1,0.12}; + temporary = 0.12; + }; + + class recoil_mk200: recoil_default { + muzzleOuter[] = {0.4,0.6,0.6,0.2}; + kickBack[] = {0.03,0.06}; + temporary = 0.005; + }; + + class recoil_zafir: recoil_default { + muzzleOuter[] = {0.5,1,0.7,0.3}; + kickBack[] = {0.02,0.08}; + temporary = 0.005; + }; + + class recoil_m320: recoil_default { + muzzleOuter[] = {1,3,0.5,0.6}; + kickBack[] = {0.08,0.1}; + temporary = 0.02; + }; + + class recoil_gm6: recoil_default { + muzzleOuter[] = {1.4,3.5,0.7,0.8}; + kickBack[] = {0.1,0.12}; + temporary = 0.025; + }; + + class recoil_ebr: recoil_default { + muzzleOuter[] = {0.4,1.5,0.6,0.4}; + kickBack[] = {0.04,0.07}; + temporary = 0.01; + }; + + class recoil_dmr_01: recoil_default { + muzzleOuter[] = {0.5,2,0.5,0.5}; + kickBack[] = {0.03,0.08}; + temporary = 0.015; + }; + + class recoil_dmr_02: recoil_default { + muzzleOuter[] = {0.5,2.5,0.6,0.5}; + kickBack[] = {0.06,0.08}; + temporary = 0.01; + }; + + class recoil_dmr_03: recoil_default { + muzzleOuter[] = {0.3,1.5,0.5,0.4}; + kickBack[] = {0.03,0.06}; + temporary = 0.005; + }; + + class recoil_dmr_04: recoil_default { + muzzleOuter[] = {0.4,1.5,0.5,0.4}; + kickBack[] = {0.02,0.04}; + temporary = 0.015; + }; + + class recoil_dmr_05: recoil_default { + muzzleOuter[] = {0.5,2.5,0.8,0.6}; + kickBack[] = {0.08,0.1}; + temporary = 0.01; + }; + + class recoil_dmr_06: recoil_default { + muzzleOuter[] = {0.5,2,0.7,0.5}; + kickBack[] = {0.05,0.1}; + temporary = 0.01; + }; + + class recoil_mmg_01: recoil_default { + muzzleOuter[] = {0.6,1.5,0.8,0.3}; + kickBack[] = {0.02,0.08}; + temporary = 0.005; + }; + + class recoil_mmg_02: recoil_default { + muzzleOuter[] = {0.5,1.5,0.6,0.4}; + kickBack[] = {0.04,0.08}; + temporary = 0.005; + }; +}; diff --git a/addons/recoil/config.cpp b/addons/recoil/config.cpp new file mode 100644 index 00000000000..1e2ce69fae1 --- /dev/null +++ b/addons/recoil/config.cpp @@ -0,0 +1,15 @@ +#include "script_component.hpp" + +class CfgPatches { + class ADDON { + units[] = {}; + weapons[] = {}; + requiredVersion = REQUIRED_VERSION; + requiredAddons[] = {"ace_common"}; + author[] = {"commy2"}; + authorUrl = ""; + VERSION_CONFIG; + }; +}; + +#include "CfgRecoils.hpp" diff --git a/addons/recoil/script_component.hpp b/addons/recoil/script_component.hpp new file mode 100644 index 00000000000..b5a74ec8ddd --- /dev/null +++ b/addons/recoil/script_component.hpp @@ -0,0 +1,12 @@ +#define COMPONENT recoil +#include "\z\ace\addons\main\script_mod.hpp" + +#ifdef DEBUG_ENABLED_RECOIL + #define DEBUG_MODE_FULL +#endif + +#ifdef DEBUG_ENABLED_RECOIL + #define DEBUG_SETTINGS DEBUG_ENABLED_RECOIL +#endif + +#include "\z\ace\addons\main\script_macros.hpp" \ No newline at end of file From c88479d54d49e169a0eaab2fb6f48b966b6ac833 Mon Sep 17 00:00:00 2001 From: Glowbal Date: Wed, 15 Apr 2015 19:45:42 +0200 Subject: [PATCH 011/104] staged work --- .../functions/fnc_handleBandageOpening.sqf | 16 +++++++++++++--- addons/medical/functions/fnc_init.sqf | 1 + .../fnc_treatmentAdvanced_bandageLocal.sqf | 3 ++- 3 files changed, 16 insertions(+), 4 deletions(-) diff --git a/addons/medical/functions/fnc_handleBandageOpening.sqf b/addons/medical/functions/fnc_handleBandageOpening.sqf index b4e40984ae8..21211c9c1b6 100644 --- a/addons/medical/functions/fnc_handleBandageOpening.sqf +++ b/addons/medical/functions/fnc_handleBandageOpening.sqf @@ -59,20 +59,30 @@ if (isClass (_config >> _className)) then { _bandagedWounds = _target getvariable [QGVAR(bandagedWounds), []]; _exist = false; _injuryId = _injury select 0; +_bandagedInjury = []; { if ((_x select 0) == _injuryId) exitwith { _exist = true; _existingInjury = _x; _existingInjury set [3, (_existingInjury select 3) + _impact]; _bandagedWounds set [_foreachIndex, _existingInjury]; + + _bandagedInjury = _existingInjury; }; }foreach _bandagedWounds; if !(_exist) then { // [ID, classID, bodypart, percentage treated, bloodloss rate] - _bandagedWounds pushback [_injuryId, _injury select 1, _injury select 2, _impact, _injury select 4]; + _bandagedInjury = [_injuryId, _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 { @@ -109,7 +119,7 @@ if (random(1) <= _reopeningChance) then { }foreach _bandagedWounds; if (_exist) then { - _target setvariable [QGVAR(bandagedWounds), _bandagedWounds, true]; + _target setvariable [QGVAR(bandagedWounds), _bandagedWounds, !USE_WOUND_EVENT_SYNC]; }; }; // Otherwise something went wrong, we we don't reopen them.. diff --git a/addons/medical/functions/fnc_init.sqf b/addons/medical/functions/fnc_init.sqf index ed8301b6b2a..fa6aa357c26 100644 --- a/addons/medical/functions/fnc_init.sqf +++ b/addons/medical/functions/fnc_init.sqf @@ -28,6 +28,7 @@ _unit setvariable [QGVAR(tourniquets), [0,0,0,0,0,0], true]; _unit setvariable [QGVAR(openWounds), [], true]; _unit setvariable [QGVAR(bandagedWounds), [], true]; _unit setVariable [QGVAR(internalWounds), [], true]; +_unit setvariable [QGVAR(lastUniqueWoundID), 1]; // vitals _unit setVariable [QGVAR(heartRate), 80]; diff --git a/addons/medical/functions/fnc_treatmentAdvanced_bandageLocal.sqf b/addons/medical/functions/fnc_treatmentAdvanced_bandageLocal.sqf index 217a69cd4d9..02626ff1fee 100644 --- a/addons/medical/functions/fnc_treatmentAdvanced_bandageLocal.sqf +++ b/addons/medical/functions/fnc_treatmentAdvanced_bandageLocal.sqf @@ -92,7 +92,8 @@ if (USE_WOUND_EVENT_SYNC) then { }; // Handle the reopening of bandaged wounds if (_impact > 0 && {GVAR(enableAdvancedWounds)}) then { - [_target, _impact, _part, _mostEffectiveSpot, _mostEffectiveInjury, _bandage] call FUNC(handleBandageOpening); +// TODO temp disabled until bandaged wounds are supported by event sync. +// [_target, _impact, _part, _mostEffectiveSpot, _mostEffectiveInjury, _bandage] call FUNC(handleBandageOpening); }; // If all wounds have been bandaged, we will reset all damage to 0, so the unit is not showing any blood on the model anymore. From 8fc2e96367d472f2eaa4fa4e8aac2ca3d5296688 Mon Sep 17 00:00:00 2001 From: Lex Rivera Date: Fri, 17 Apr 2015 14:49:43 +0300 Subject: [PATCH 012/104] [realisticnames] Adjust SPMG name, fix some russian --- addons/realisticnames/stringtable.xml | 38 +++++++++++++-------------- 1 file changed, 19 insertions(+), 19 deletions(-) diff --git a/addons/realisticnames/stringtable.xml b/addons/realisticnames/stringtable.xml index 2b02d7f5b7d..fe514290a3e 100644 --- a/addons/realisticnames/stringtable.xml +++ b/addons/realisticnames/stringtable.xml @@ -1650,32 +1650,32 @@ TODO: Navid 9.3 мм (бронза) - TODO: SPMG .338 - TODO: SPMG .338 - SPMG .338 - TODO: SPMG .338 - TODO: SPMG .338 + LWMMG .338 + LWMMG .338 + LWMMG .338 + LWMMG .338 + LWMMG .338 - TODO: SPMG .338 (MTP) - TODO: SPMG .338 (MTP) - SPMG .338 (MTP) - TODO: SPMG .338 (MTP) - TODO: SPMG .338 (MTP) + LWMMG .338 (MTP) + LWMMG .338 (MTP) + LWMMG .338 (MTP) + LWMMG .338 (MTP) + LWMMG .338 (MTP) - TODO: SPMG .338 (Black) - TODO: SPMG .338 (Black) - SPMG .338 (Noir) - TODO: SPMG .338 (Negro) - TODO: SPMG .338 (черный) + LWMMG .338 (Black) + LWMMG .338 (Black) + LWMMG .338 (Noir) + LWMMG .338 (Negro) + LWMMG .338 (Черный) - TODO: SPMG .338 (Sand) - TODO: SPMG .338 (Sand) + LWMMG .338 (Sand) + LWMMG .338 (Sand) SPMG .338 (Beige) - TODO: SPMG .338 (Arena) - TODO: SPMG .338 (песочный) + LWMMG .338 (Arena) + LWMMG .338 (Песочный) From 2ca20f740e1013b30a1a4a49e0d86a0b107dd80a Mon Sep 17 00:00:00 2001 From: Lex Rivera Date: Fri, 17 Apr 2015 14:53:55 +0300 Subject: [PATCH 013/104] [realisticnames] adjust M14 --- addons/realisticnames/stringtable.xml | 30 +++++++++++++-------------- 1 file changed, 15 insertions(+), 15 deletions(-) diff --git a/addons/realisticnames/stringtable.xml b/addons/realisticnames/stringtable.xml index fe514290a3e..34e6d34fdaa 100644 --- a/addons/realisticnames/stringtable.xml +++ b/addons/realisticnames/stringtable.xml @@ -1608,25 +1608,25 @@ TODO: Cyrus 9.3 мм (бронза) - TODO: Mk14 7.62 mm - TODO: Mk14 7.62 mm - Mk 14 7.62 mm - TODO: Mk14 7.62 mm - TODO: Mk14 7.62 мм + M14 7.62 mm + M14 7.62 mm + M14 7.62 mm + M14 7.62 mm + M14 7.62 мм - TODO: Mk14 7.62 mm (Camo) - TODO: Mk14 7.62 mm (Camo) - Mk 14 7.62 mm (Camo) - TODO: Mk14 7.62 mm (Camuflaje) - TODO: Mk14 7.62 мм (камо) + M14 7.62 mm (Camo) + M14 7.62 mm (Camo) + M14 7.62 mm (Camo) + M14 7.62 mm (Camuflaje) + M14 7.62 мм (Камо) - TODO: Mk14 7.62 mm (Olive) - TODO: Mk14 7.62 mm (Olive) - Mk 14 7.62 mm (Olive) - TODO: Mk14 7.62 mm (Oliva) - TODO: Mk14 7.62 мм (олива) + M14 7.62 mm (Olive) + M14 7.62 mm (Olive) + M14 7.62 mm (Olive) + M14 7.62 mm (Oliva) + M14 7.62 мм (Олива) TODO: Navid 9.3 mm From 163ac7bd4aca6e9544b1034470f84487a14171a7 Mon Sep 17 00:00:00 2001 From: Lex Rivera Date: Fri, 17 Apr 2015 15:28:30 +0300 Subject: [PATCH 014/104] [realisticnames] Adjust MK-I. Enable actual names --- addons/realisticnames/CfgWeapons.hpp | 11 +++-- addons/realisticnames/stringtable.xml | 70 +++++++++++++-------------- 2 files changed, 41 insertions(+), 40 deletions(-) diff --git a/addons/realisticnames/CfgWeapons.hpp b/addons/realisticnames/CfgWeapons.hpp index 56d9e3b7c89..3cbe03f4658 100644 --- a/addons/realisticnames/CfgWeapons.hpp +++ b/addons/realisticnames/CfgWeapons.hpp @@ -208,7 +208,7 @@ class CfgWeapons { class srifle_DMR_02_sniper_F: srifle_DMR_02_F { displayName = "$STR_ACE_RealisticNames_srifle_DMR_02_sniper"; //MAR-10 .338 (Sand)"; }; - + */ class DMR_03_base_F: Rifle_Long_Base_F { displayName = "$STR_ACE_RealisticNames_DMR_03"; //Mk-I EMR 7.62 mm"; }; @@ -236,7 +236,7 @@ class CfgWeapons { class srifle_DMR_03_spotter_F: srifle_DMR_03_F { displayName = "$STR_ACE_RealisticNames_srifle_DMR_03_spotter"; //NATO DMR (provisional) spotter"; }; - + /* class DMR_04_base_F: Rifle_Long_Base_F { displayName = "$STR_ACE_RealisticNames_DMR_04"; //ASP-1 Kir 12.7 mm"; }; @@ -264,7 +264,7 @@ class CfgWeapons { class srifle_DMR_05_tan_f: srifle_DMR_05_blk_F { displayName = "$STR_ACE_RealisticNames_srifle_DMR_05_tan"; //Cyrus 9.3 mm (Tan)"; }; - + */ class DMR_06_base_F: Rifle_Long_Base_F { displayName = "$STR_ACE_RealisticNames_DMR_06"; //Mk14 7.62 mm"; }; @@ -278,6 +278,7 @@ class CfgWeapons { }; // marksmen mgs + /* class MMG_01_base_F: Rifle_Long_Base_F { displayName = "$STR_ACE_RealisticNames_MMG_01"; //Navid 9.3 mm"; }; @@ -289,7 +290,7 @@ class CfgWeapons { class MMG_01_tan_F: MMG_01_hex_F { displayName = "$STR_ACE_RealisticNames_MMG_01_tan"; //Navid 9.3 mm (Tan)"; }; - + */ class MMG_02_base_F: Rifle_Long_Base_F { displayName = "$STR_ACE_RealisticNames_MMG_02"; //SPMG .338"; }; @@ -304,7 +305,7 @@ class CfgWeapons { class MMG_02_sand_F: MMG_02_camo_F { displayName = "$STR_ACE_RealisticNames_MMG_02_sand"; //SPMG .338 (Sand)"; - };*/ + }; // vehicle weapons diff --git a/addons/realisticnames/stringtable.xml b/addons/realisticnames/stringtable.xml index 34e6d34fdaa..1fcf116d1e5 100644 --- a/addons/realisticnames/stringtable.xml +++ b/addons/realisticnames/stringtable.xml @@ -1510,53 +1510,53 @@ TODO: MAR-10 .338 (песочный) - TODO: Mk-I EMR 7.62 mm - TODO: Mk-I EMR 7.62 mm - Mk-l EMR 7.62 mm - TODO: Mk-I EMR 7.62 mm - TODO: Mk-I EMR 7.62 мм + SG 556 7.62 mm + SG 556 7.62 mm + SG 556 7.62 mm + SG 556 7.62 mm + SG 556 7.62 мм - TODO: Mk-I EMR 7.62 mm (Black) - TODO: Mk-I EMR 7.62 mm (Black) - Mk-l EMR 7.62 mm (Noir) - TODO: Mk-I EMR 7.62 mm (Negro) - TODO: Mk-I EMR 7.62 мм (черный) + SG 556 7.62 mm (Black) + SG 556 7.62 mm (Black) + SG 556 7.62 mm (Noir) + SG 556 7.62 mm (Negro) + SG 556 7.62 мм (черный) - TODO: Mk-I EMR 7.62 mm (Khaki) - TODO: Mk-I EMR 7.62 mm (Khaki) - Mk-l EMR 7.62 mm (Kaki) - TODO: Mk-I EMR 7.62 mm (Caqui) - TODO: Mk-I EMR 7.62 мм (хаки) + SG 556 7.62 mm (Khaki) + SG 556 7.62 mm (Khaki) + SG 556 7.62 mm (Kaki) + SG 556 7.62 mm (Caqui) + SG 556 7.62 мм (хаки) - TODO: Mk-I EMR 7.62 mm (Sand) - TODO: Mk-I EMR 7.62 mm (Sand) - Mk-l EMR 7.62 mm (Beige) - TODO: Mk-I EMR 7.62 mm (Arena) - TODO: Mk-I EMR 7.62 мм (песочный) + SG 556 7.62 mm (Sand) + SG 556 7.62 mm (Sand) + SG 556 7.62 mm (Beige) + SG 556 7.62 mm (Arena) + SG 556 7.62 мм (песочный) - TODO: Mk-I EMR 7.62 mm (Camo) - TODO: Mk-I EMR 7.62 mm (Camo) - Mk-l EMR 7.62 mm (Camo) - TODO: Mk-I EMR 7.62 mm (Camuflaje) - TODO: Mk-I EMR 7.62 мм (камо) + SG 556 7.62 mm (Camo) + SG 556 7.62 mm (Camo) + SG 556 7.62 mm (Camo) + SG 556 7.62 mm (Camuflaje) + SG 556 7.62 мм (камо) - TODO: Mk-I EMR 7.62 mm (Woodland) - TODO: Mk-I EMR 7.62 mm (Woodland) - Mk-l EMR 7.62 mm (Woodland) - TODO: Mk-I EMR 7.62 mm (Bosque) - TODO: Mk-I EMR 7.62 мм (лесной) + SG 556 7.62 mm (Woodland) + SG 556 7.62 mm (Woodland) + SG 556 7.62 mm (Woodland) + SG 556 7.62 mm (Bosque) + SG 556 7.62 мм (лесной) - TODO: NATO DMR (provisional) spotter - TODO: NATO DMR (provisional) spotter - NATO DMR (provisoire) Observateur - TODO: NATO DMR (provisional) observador - TODO: NATO DMR (provisional) корректировщик + SG 556 7.62 mm (provisional) spotter + SG 556 7.62 mm (provisional) spotter + SG 556 7.62 mm (provisoire) Observateur + SG 556 7.62 mm (provisional) observador + SG 556 7.62 мм (provisional) корректировщик TODO: ASP-1 Kir 12.7 mm From c86be1266800b7683d0dcbb4dbfcf5a598d3111a Mon Sep 17 00:00:00 2001 From: Glowbal Date: Fri, 17 Apr 2015 20:24:05 +0200 Subject: [PATCH 015/104] fixes #599 --- addons/medical/functions/fnc_determineIfFatal.sqf | 6 +++--- addons/medical/functions/fnc_handleDamage.sqf | 6 ++++++ addons/medical/functions/fnc_setUnconscious.sqf | 7 ++++++- 3 files changed, 15 insertions(+), 4 deletions(-) diff --git a/addons/medical/functions/fnc_determineIfFatal.sqf b/addons/medical/functions/fnc_determineIfFatal.sqf index 6c90e54da36..aedcf161eec 100644 --- a/addons/medical/functions/fnc_determineIfFatal.sqf +++ b/addons/medical/functions/fnc_determineIfFatal.sqf @@ -21,10 +21,10 @@ if ((vehicle _unit != _unit) && {!alive (vehicle _unit)}) exitwith { true }; // Find the correct Damage threshold for unit. _damageThreshold = [1,1,1]; -if (isPlayer _unit) then { - //_damageThreshold =_unit getvariable[QGVAR(unitDamageThreshold), [GVAR(damageThreshold_Players), GVAR(damageThreshold_Players), GVAR(damageThreshold_Players) * 1.7]]; +if ([_unit] call EFUNC(common,IsPlayer)) then { + _damageThreshold =_unit getvariable[QGVAR(unitDamageThreshold), [GVAR(playerDamageThreshold), GVAR(playerDamageThreshold), GVAR(playerDamageThreshold) * 1.7]]; } else { - //_damageThreshold =_unit getvariable[QGVAR(unitDamageThreshold), [GVAR(damageThreshold_AI), GVAR(damageThreshold_AI), GVAR(damageThreshold_AI) * 1.7]]; + _damageThreshold =_unit getvariable[QGVAR(unitDamageThreshold), [GVAR(AIDamageThreshold), GVAR(AIDamageThreshold), GVAR(AIDamageThreshold) * 1.7]]; }; _damageBodyPart = ((_unit getvariable [QGVAR(bodyPartStatus),[0, 0, 0, 0, 0, 0]]) select _part) + _withDamage; diff --git a/addons/medical/functions/fnc_handleDamage.sqf b/addons/medical/functions/fnc_handleDamage.sqf index 1632a8f55b7..c80f0c63e88 100644 --- a/addons/medical/functions/fnc_handleDamage.sqf +++ b/addons/medical/functions/fnc_handleDamage.sqf @@ -36,6 +36,12 @@ if !(_selection in (GVAR(SELECTIONS) + [""])) exitWith {0}; _damageReturn = _damage; if (GVAR(level) < 2) then { + if ([_unit] call EFUNC(isPlayer)) then { + _this set [2, _damage / (GVAR(playerDamageThreshold) max 0.01)]; + } else { + _this set [2, _damage / (GVAR(AIDamageThreshold) max 0.01)]; + }; + _damageReturn = _this call FUNC(handleDamage_basic); }; diff --git a/addons/medical/functions/fnc_setUnconscious.sqf b/addons/medical/functions/fnc_setUnconscious.sqf index 89ab5ee3b37..7fcfa0d24b8 100644 --- a/addons/medical/functions/fnc_setUnconscious.sqf +++ b/addons/medical/functions/fnc_setUnconscious.sqf @@ -23,7 +23,7 @@ _set = if (count _this > 1) then {_this select 1} else {true}; _minWaitingTime = if (count _this > 2) then {_this select 2} else {DEFAULT_DELAY}; if !(_set) exitwith { - _unit setvariable ["ACE_isUnconscious", false,true]; + _unit setvariable ["ACE_isUnconscious", false, true]; }; if !(!(isNull _unit) && {(_unit isKindOf "CaManBase") && ([_unit] call EFUNC(common,isAwake))}) exitwith{}; @@ -40,6 +40,11 @@ if (_unit == ACE_player) then { closeDialog 0; }; +// if we have unconsciousness for AI disabled, we will kill the unit instead +if (!([_unit] call EFUNC(common,IsPlayer)) && (GVAR(enableUnsconsiousnessAI) == 0 || (GVAR(enableUnsconsiousnessAI) == 2 && random(1) <= 0.5))) exitwith { + [_unit, true] call FUNC(setDead); // force, to avoid getting into a loop in case revive is enabled. +}; + // If a unit has the launcher out, it will sometimes start selecting the primairy weapon while unconscious, // therefor we force it to select the primairy weapon before going unconscious if ((vehicle _unit) isKindOf "StaticWeapon") then { From 8b7e46c45f9421d2d87fefa19becf65e2c73aec0 Mon Sep 17 00:00:00 2001 From: Glowbal Date: Fri, 17 Apr 2015 20:26:28 +0200 Subject: [PATCH 016/104] fixes #656 --- addons/medical/functions/fnc_setUnconscious.sqf | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/addons/medical/functions/fnc_setUnconscious.sqf b/addons/medical/functions/fnc_setUnconscious.sqf index 7fcfa0d24b8..c6a0e80c9b8 100644 --- a/addons/medical/functions/fnc_setUnconscious.sqf +++ b/addons/medical/functions/fnc_setUnconscious.sqf @@ -91,6 +91,12 @@ _startingTime = time; _hasMovedOut = _args select 5; if (!alive _unit) exitwith { + [_unit, QGVAR(unconscious), false] call EFUNC(common,setCaptivityStatus); + [_unit, false] call EFUNC(common,disableAI); + _unit setUnitPos _originalPos; + _unit setUnconscious false; + ["medical_onUnconscious", [_unit, false]] call EFUNC(common,globalEvent); + [(_this select 1)] call cba_fnc_removePerFrameHandler; }; From 0234eedd54ac6d87203c1db89b85bbf3e4d8211f Mon Sep 17 00:00:00 2001 From: Glowbal Date: Fri, 17 Apr 2015 20:33:13 +0200 Subject: [PATCH 017/104] Changed, only drop unit is player goes unconscious, otherwise keep carrying/dragging unit --- .../dragging/functions/fnc_handleUnconscious.sqf | 14 ++++++-------- 1 file changed, 6 insertions(+), 8 deletions(-) diff --git a/addons/dragging/functions/fnc_handleUnconscious.sqf b/addons/dragging/functions/fnc_handleUnconscious.sqf index 41562756a2a..31c703f37b8 100644 --- a/addons/dragging/functions/fnc_handleUnconscious.sqf +++ b/addons/dragging/functions/fnc_handleUnconscious.sqf @@ -9,8 +9,6 @@ _isUnconscious = _this select 1; private "_player"; _player = ACE_player; -if ((_unit getHitPointDamage "HitLeftLeg") + (_unit getHitPointDamage "HitRightLeg") > 0.4) exitwith {}; - if (_player getVariable [QGVAR(isDragging), false]) then { private "_draggedObject"; @@ -22,9 +20,9 @@ if (_player getVariable [QGVAR(isDragging), false]) then { }; // handle waking up dragged unit - if (_unit == _draggedObject) then { - [_player, _draggedObject] call FUNC(dropObject); - }; + //if (_unit == _draggedObject) then { + // [_player, _draggedObject] call FUNC(dropObject); + //}; }; @@ -39,8 +37,8 @@ if (_player getVariable [QGVAR(isCarrying), false]) then { }; // handle waking up dragged unit - if (_unit == _carriedObject) then { - [_player, _carriedObject] call FUNC(dropObject_carry); - }; + //if (_unit == _carriedObject) then { + // [_player, _carriedObject] call FUNC(dropObject_carry); + //}; }; From 847ee7e2294312c1c48da0b0585388062241e642 Mon Sep 17 00:00:00 2001 From: Glowbal Date: Fri, 17 Apr 2015 20:38:02 +0200 Subject: [PATCH 018/104] Moved unconscious event, so it won't conflict in case the unit is still being carried --- addons/medical/functions/fnc_setUnconscious.sqf | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/addons/medical/functions/fnc_setUnconscious.sqf b/addons/medical/functions/fnc_setUnconscious.sqf index c6a0e80c9b8..63be3fe5a07 100644 --- a/addons/medical/functions/fnc_setUnconscious.sqf +++ b/addons/medical/functions/fnc_setUnconscious.sqf @@ -118,6 +118,7 @@ _startingTime = time; // TODO: what if the unit switched vehicle? [_unit, _oldAnimation, 2] call EFUNC(common,doAnimation); }; + ["medical_onUnconscious", [_unit, false]] call EFUNC(common,globalEvent); // EXIT PFH [(_this select 1)] call cba_fnc_removePerFrameHandler; }; @@ -133,7 +134,7 @@ _startingTime = time; _unit setUnitPos _originalPos; // This is not position but stance (DOWN, MIDDLE, UP) _unit setUnconscious false; - ["medical_onUnconscious", [_unit, false]] call EFUNC(common,globalEvent); + // ensure this statement runs only once _args set [5, true]; }; From b333e6e662c7e1e8389a1fe3fa169c5dc449d23b Mon Sep 17 00:00:00 2001 From: Glowbal Date: Fri, 17 Apr 2015 20:40:24 +0200 Subject: [PATCH 019/104] Keep units longer unconscious, instead of quickly fading in/out --- addons/medical/functions/fnc_handleUnitVitals.sqf | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/addons/medical/functions/fnc_handleUnitVitals.sqf b/addons/medical/functions/fnc_handleUnitVitals.sqf index 2b175d7ca20..411f64b49eb 100644 --- a/addons/medical/functions/fnc_handleUnitVitals.sqf +++ b/addons/medical/functions/fnc_handleUnitVitals.sqf @@ -94,7 +94,7 @@ if (GVAR(level) >= 2) then { if ([_unit] call EFUNC(common,isAwake)) then { if (_bloodVolume < 60) then { if (random(1) > 0.9) then { - [_unit] call FUNC(setUnconscious); + [_unit, true, 15 + random(20)] call FUNC(setUnconscious); }; }; }; @@ -136,7 +136,7 @@ if (GVAR(level) >= 2) then { if (!(_unit getvariable [QGVAR(inCardiacArrest),false])) then { if (_heartRate < 10 || _bloodPressureH < 30 || _bloodVolume < 20) then { - [_unit] call FUNC(setUnconscious); // safety check to ensure unconsciousness for units if they are not dead already. + [_unit, true, 10+ random(20)] call FUNC(setUnconscious); // safety check to ensure unconsciousness for units if they are not dead already. }; if (_bloodPressureH > 260) then { From 80139521bcc030eb21e8eda97edebe0d80d93249 Mon Sep 17 00:00:00 2001 From: Glowbal Date: Fri, 17 Apr 2015 20:49:24 +0200 Subject: [PATCH 020/104] fixes #691 --- addons/medical/functions/fnc_handleDamage.sqf | 2 +- addons/medical/functions/fnc_setUnconscious.sqf | 12 ++++++++++-- 2 files changed, 11 insertions(+), 3 deletions(-) diff --git a/addons/medical/functions/fnc_handleDamage.sqf b/addons/medical/functions/fnc_handleDamage.sqf index c80f0c63e88..876feae6375 100644 --- a/addons/medical/functions/fnc_handleDamage.sqf +++ b/addons/medical/functions/fnc_handleDamage.sqf @@ -36,7 +36,7 @@ if !(_selection in (GVAR(SELECTIONS) + [""])) exitWith {0}; _damageReturn = _damage; if (GVAR(level) < 2) then { - if ([_unit] call EFUNC(isPlayer)) then { + if ([_unit] call EFUNC(common,isPlayer)) then { _this set [2, _damage / (GVAR(playerDamageThreshold) max 0.01)]; } else { _this set [2, _damage / (GVAR(AIDamageThreshold) max 0.01)]; diff --git a/addons/medical/functions/fnc_setUnconscious.sqf b/addons/medical/functions/fnc_setUnconscious.sqf index 63be3fe5a07..99651fc0856 100644 --- a/addons/medical/functions/fnc_setUnconscious.sqf +++ b/addons/medical/functions/fnc_setUnconscious.sqf @@ -81,7 +81,7 @@ _unit setUnitPos "DOWN"; _startingTime = time; [{ - private ["_unit", "_vehicleOfUnit","_minWaitingTime", "_oldAnimation", "_captiveSwitch", "_hasMovedOut"]; + private ["_unit", "_vehicleOfUnit","_minWaitingTime", "_oldAnimation", "_captiveSwitch", "_hasMovedOut", "_parachuteCheck"]; _args = _this select 0; _unit = _args select 0; _oldAnimation = _args select 1; @@ -89,6 +89,7 @@ _startingTime = time; _startingTime = _args select 3; _minWaitingTime = _args select 4; _hasMovedOut = _args select 5; + _parachuteCheck = _args select 6; if (!alive _unit) exitwith { [_unit, QGVAR(unconscious), false] call EFUNC(common,setCaptivityStatus); @@ -140,6 +141,13 @@ _startingTime = time; }; }; + if (_parachuteCheck) then { + if !(vehicle _unit isKindOf "ParachuteBase") then { + [_unit, [_unit] call EFUNC(common,getDeathAnim), 1, true] call EFUNC(common,doAnimation); + _args set [6, false]; + }; + }; + // Ensure we are waiting at least a minimum period before checking if we can wake up the unit again, allows for temp knock outs if ((time - _startingTime) >= _minWaitingTime) exitwith { @@ -147,6 +155,6 @@ _startingTime = time; _unit setvariable ["ACE_isUnconscious", false, true]; }; }; -}, 0.1, [_unit,_animState, _originalPos, _startingTime, _minWaitingTime, false] ] call CBA_fnc_addPerFrameHandler; +}, 0.1, [_unit,_animState, _originalPos, _startingTime, _minWaitingTime, false, vehicle _unit isKindOf "ParachuteBase"] ] call CBA_fnc_addPerFrameHandler; ["medical_onUnconscious", [_unit, true]] call EFUNC(common,globalEvent); From 9b4435827ecfe5c29ac27ed1432880f784aaddfe Mon Sep 17 00:00:00 2001 From: Glowbal Date: Fri, 17 Apr 2015 20:51:57 +0200 Subject: [PATCH 021/104] Added setting for unconscious animations on treatment --- addons/medical/ACE_Settings.hpp | 4 ++++ addons/medical/functions/fnc_treatment.sqf | 2 +- 2 files changed, 5 insertions(+), 1 deletion(-) diff --git a/addons/medical/ACE_Settings.hpp b/addons/medical/ACE_Settings.hpp index 56e5a531ecc..0007352dda5 100644 --- a/addons/medical/ACE_Settings.hpp +++ b/addons/medical/ACE_Settings.hpp @@ -124,4 +124,8 @@ class ACE_Settings { values[] = {"$STR_ACE_Medical_painEffect_Flash", "$STR_ACE_Medical_painEffect_Chroma"}; isClientSettable = 1; }; + class GVAR(allowUnconsciousAnimationOnTreatment) { + typeName = "BOOL"; + value = 0; + }; }; diff --git a/addons/medical/functions/fnc_treatment.sqf b/addons/medical/functions/fnc_treatment.sqf index e010279be15..bb291d6c983 100644 --- a/addons/medical/functions/fnc_treatment.sqf +++ b/addons/medical/functions/fnc_treatment.sqf @@ -129,7 +129,7 @@ if (isNil _callbackProgress) then { // Patient Animation _patientAnim = getText (_config >> "animationPatient"); -if (_target getvariable ["ACE_isUnconscious", false]) then { +if (_target getvariable ["ACE_isUnconscious", false] && GVAR(allowUnconsciousAnimationOnTreatment)) then { if !(animationState _target in (getArray (_config >> "animationPatientUnconsciousExcludeOn"))) then { _patientAnim = getText (_config >> "animationPatientUnconscious"); }; From 8bfb76c9651cc4e34fea01cdaaaa8a9996691540 Mon Sep 17 00:00:00 2001 From: ViperMaul Date: Fri, 17 Apr 2015 12:05:49 -0700 Subject: [PATCH 022/104] #552 - Default: don't check external files --- tools/make.py | 13 ++++++++++++- 1 file changed, 12 insertions(+), 1 deletion(-) diff --git a/tools/make.py b/tools/make.py index 29cf3f19566..4af9341b6bd 100644 --- a/tools/make.py +++ b/tools/make.py @@ -321,6 +321,7 @@ def main(argv): test -- Copy result to Arma 3. release -- Make archive with . force -- Ignore cache and build all. +checkexternal -- Check External Files target -- Use rules in make.cfg under heading [] rather than default [Make] key -- Use key in working directory with to sign. If it does not @@ -378,6 +379,12 @@ def main(argv): quiet = True argv.remove("quiet") + if "checkexternal" in argv: + argv.remove("checkexternal") + check_external = True + else: + check_external = False + # Get the directory the make script is in. make_root = os.path.dirname(os.path.realpath(__file__)) make_root_parent = os.path.abspath(os.path.join(os.getcwd(), os.pardir)) @@ -658,8 +665,12 @@ def main(argv): cmd = [makepboTool, "-P","-A","-L","-N","-G", os.path.join(work_drive, prefix, module),os.path.join(module_root, release_dir, project,"Addons")] else: - cmd = [pboproject, "-P", os.path.join(work_drive, prefix, module), "+Engine=Arma3", "-S","+Noisy", "+X", "+Clean", "+Mod="+os.path.join(module_root, release_dir, project), "-Key"] + if check_external: + cmd = [pboproject, "-P", os.path.join(work_drive, prefix, module), "+Engine=Arma3", "-S","+Noisy", "+X", "+Clean", "+Mod="+os.path.join(module_root, release_dir, project), "-Key"] + else: + cmd = [pboproject, "-P", os.path.join(work_drive, prefix, module), "+Engine=Arma3", "-S","+Noisy", "-X", "+Clean", "+Mod="+os.path.join(module_root, release_dir, project), "-Key"] + print_yellow(cmd) color("grey") if quiet: devnull = open(os.devnull, 'w') From 31bc09a9a32d0135144cd029cb83a04d8ae75fba Mon Sep 17 00:00:00 2001 From: Glowbal Date: Fri, 17 Apr 2015 21:06:30 +0200 Subject: [PATCH 023/104] fixed AI standing up before being killed Doesn't matter if we enable AI again on dead units --- addons/common/functions/fnc_disableAI.sqf | 2 +- addons/medical/functions/fnc_setUnconscious.sqf | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/addons/common/functions/fnc_disableAI.sqf b/addons/common/functions/fnc_disableAI.sqf index 92ad35c0f9e..0e1985ecede 100644 --- a/addons/common/functions/fnc_disableAI.sqf +++ b/addons/common/functions/fnc_disableAI.sqf @@ -27,7 +27,7 @@ if ((local _unit) && {!([_unit] call EFUNC(common,isPlayer))}) then { _unit disableConversation true; } else { //Sanity check to make sure we don't enable unconsious AI - if (_unit getVariable ["ace_isunconscious", false]) exitWith {ERROR("Enabling AI for unconsious unit");}; + if (_unit getVariable ["ace_isunconscious", false] && alive _unit) exitWith {ERROR("Enabling AI for unconsious unit");}; _unit enableAI "MOVE"; _unit enableAI "TARGET"; _unit enableAI "AUTOTARGET"; diff --git a/addons/medical/functions/fnc_setUnconscious.sqf b/addons/medical/functions/fnc_setUnconscious.sqf index 99651fc0856..3ef4df4d3fe 100644 --- a/addons/medical/functions/fnc_setUnconscious.sqf +++ b/addons/medical/functions/fnc_setUnconscious.sqf @@ -94,7 +94,7 @@ _startingTime = time; if (!alive _unit) exitwith { [_unit, QGVAR(unconscious), false] call EFUNC(common,setCaptivityStatus); [_unit, false] call EFUNC(common,disableAI); - _unit setUnitPos _originalPos; + //_unit setUnitPos _originalPos; _unit setUnconscious false; ["medical_onUnconscious", [_unit, false]] call EFUNC(common,globalEvent); From eb731b116939cf81289dcff585ad87ea77119e62 Mon Sep 17 00:00:00 2001 From: Glowbal Date: Fri, 17 Apr 2015 21:07:09 +0200 Subject: [PATCH 024/104] fixes #653 --- addons/medical/functions/fnc_treatment.sqf | 2 ++ addons/medical/functions/fnc_treatment_failure.sqf | 9 ++++++++- addons/medical/functions/fnc_treatment_success.sqf | 9 ++++++++- 3 files changed, 18 insertions(+), 2 deletions(-) diff --git a/addons/medical/functions/fnc_treatment.sqf b/addons/medical/functions/fnc_treatment.sqf index bb291d6c983..df6cc173d0e 100644 --- a/addons/medical/functions/fnc_treatment.sqf +++ b/addons/medical/functions/fnc_treatment.sqf @@ -149,6 +149,8 @@ if (_caller == _target) then { _callerAnim = [getText (_config >> "animationCallerSelf"), getText (_config >> "animationCallerSelfProne")] select (stance _caller == "PRONE"); }; +_caller setvariable [QGVAR(selectedWeaponOnTreatment), currentWeapon _caller]; + // Cannot use secondairy weapon for animation if (currentWeapon _caller == secondaryWeapon _caller) then { _caller selectWeapon (primaryWeapon _caller); diff --git a/addons/medical/functions/fnc_treatment_failure.sqf b/addons/medical/functions/fnc_treatment_failure.sqf index d4f853374cb..fe8bafb0c7b 100644 --- a/addons/medical/functions/fnc_treatment_failure.sqf +++ b/addons/medical/functions/fnc_treatment_failure.sqf @@ -17,7 +17,7 @@ #include "script_component.hpp" -private ["_caller", "_target","_selectionName","_className","_config","_callback", "_usersOfItems"]; +private ["_caller", "_target","_selectionName","_className","_config","_callback", "_usersOfItems", "_weaponSelect"]; _args = _this select 0; _caller = _args select 0; @@ -34,6 +34,13 @@ if (vehicle _caller == _caller) then { }; _caller setvariable [QGVAR(treatmentPrevAnimCaller), nil]; +_weaponSelect = (_caller getvariable [QGVAR(selectedWeaponOnTreatment), ""]); +if (_weaponSelect != "") then { + _caller selectWeapon _weaponSelect; +} else { + _caller action ["SwitchWeapon", _caller, _caller, 99]; +}; + { (_x select 0) addItem (_x select 1); }foreach _usersOfItems; diff --git a/addons/medical/functions/fnc_treatment_success.sqf b/addons/medical/functions/fnc_treatment_success.sqf index 5910a4be862..6822f674c73 100644 --- a/addons/medical/functions/fnc_treatment_success.sqf +++ b/addons/medical/functions/fnc_treatment_success.sqf @@ -17,7 +17,7 @@ #include "script_component.hpp" -private ["_caller", "_target","_selectionName","_className","_config","_callback"]; +private ["_caller", "_target","_selectionName","_className","_config","_callback", "_weaponSelect"]; _args = _this select 0; _caller = _args select 0; _target = _args select 1; @@ -32,6 +32,13 @@ if (vehicle _caller == _caller) then { }; _caller setvariable [QGVAR(treatmentPrevAnimCaller), nil]; +_weaponSelect = (_caller getvariable [QGVAR(selectedWeaponOnTreatment), ""]); +if (_weaponSelect != "") then { + _caller selectWeapon _weaponSelect; +} else { + _caller action ["SwitchWeapon", _caller, _caller, 99]; +}; + // Record specific callback _config = (configFile >> "ACE_Medical_Actions" >> "Basic" >> _className); if (GVAR(level) >= 2) then { From e816907c503c88cedce17a26946cafb4901a458b Mon Sep 17 00:00:00 2001 From: ViperMaul Date: Fri, 17 Apr 2015 12:21:32 -0700 Subject: [PATCH 025/104] #552 - Tab clean up --- tools/make.py | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/tools/make.py b/tools/make.py index 4af9341b6bd..166d21c49d7 100644 --- a/tools/make.py +++ b/tools/make.py @@ -665,10 +665,10 @@ def main(argv): cmd = [makepboTool, "-P","-A","-L","-N","-G", os.path.join(work_drive, prefix, module),os.path.join(module_root, release_dir, project,"Addons")] else: - if check_external: - cmd = [pboproject, "-P", os.path.join(work_drive, prefix, module), "+Engine=Arma3", "-S","+Noisy", "+X", "+Clean", "+Mod="+os.path.join(module_root, release_dir, project), "-Key"] - else: - cmd = [pboproject, "-P", os.path.join(work_drive, prefix, module), "+Engine=Arma3", "-S","+Noisy", "-X", "+Clean", "+Mod="+os.path.join(module_root, release_dir, project), "-Key"] + if check_external: + cmd = [pboproject, "-P", os.path.join(work_drive, prefix, module), "+Engine=Arma3", "-S","+Noisy", "+X", "+Clean", "+Mod="+os.path.join(module_root, release_dir, project), "-Key"] + else: + cmd = [pboproject, "-P", os.path.join(work_drive, prefix, module), "+Engine=Arma3", "-S","+Noisy", "-X", "+Clean", "+Mod="+os.path.join(module_root, release_dir, project), "-Key"] print_yellow(cmd) color("grey") From 008c36ac763de4036389469d9edf405b81099d4c Mon Sep 17 00:00:00 2001 From: Glowbal Date: Fri, 17 Apr 2015 21:27:57 +0200 Subject: [PATCH 026/104] fixes #699 --- addons/medical/XEH_preInit.sqf | 1 + addons/medical/functions/fnc_handleLocal.sqf | 10 ++ .../medical/functions/fnc_setUnconscious.sqf | 77 +-------------- .../medical/functions/fnc_unconsciousPFH.sqf | 93 +++++++++++++++++++ 4 files changed, 105 insertions(+), 76 deletions(-) create mode 100644 addons/medical/functions/fnc_unconsciousPFH.sqf diff --git a/addons/medical/XEH_preInit.sqf b/addons/medical/XEH_preInit.sqf index f15b4ec109d..a54b6d0d8fd 100644 --- a/addons/medical/XEH_preInit.sqf +++ b/addons/medical/XEH_preInit.sqf @@ -97,6 +97,7 @@ PREP(moduleAssignMedicalFacility); PREP(moduleTreatmentConfiguration); PREP(copyDeadBody); PREP(requestWoundSync); +PREP(unconsciousPFH); GVAR(injuredUnitCollection) = []; GVAR(IVBags) = []; diff --git a/addons/medical/functions/fnc_handleLocal.sqf b/addons/medical/functions/fnc_handleLocal.sqf index 5d9c5865a48..5a6123d9f77 100644 --- a/addons/medical/functions/fnc_handleLocal.sqf +++ b/addons/medical/functions/fnc_handleLocal.sqf @@ -22,4 +22,14 @@ if (_local) then { if (_unit getvariable[QGVAR(addedToUnitLoop),false]) then { [_unit, true] call FUNC(addToInjuredCollection); }; + + if (count (_unit getvariable [QGVAR(unconsciousArguments), []]) >= 7) then { + private "_arguments"; + _arguments = (_unit getvariable [QGVAR(unconsciousArguments), []]); + _arguments set [ 3, time]; + + [DFUNC(unconsciousPFH), 0.1, _arguments ] call CBA_fnc_addPerFrameHandler; + + _unit setvariable [QGVAR(unconsciousArguments), nil, true]; + }; }; diff --git a/addons/medical/functions/fnc_setUnconscious.sqf b/addons/medical/functions/fnc_setUnconscious.sqf index 3ef4df4d3fe..ef9ccb246d4 100644 --- a/addons/medical/functions/fnc_setUnconscious.sqf +++ b/addons/medical/functions/fnc_setUnconscious.sqf @@ -80,81 +80,6 @@ _unit setUnitPos "DOWN"; _startingTime = time; -[{ - private ["_unit", "_vehicleOfUnit","_minWaitingTime", "_oldAnimation", "_captiveSwitch", "_hasMovedOut", "_parachuteCheck"]; - _args = _this select 0; - _unit = _args select 0; - _oldAnimation = _args select 1; - _originalPos = _args select 2; - _startingTime = _args select 3; - _minWaitingTime = _args select 4; - _hasMovedOut = _args select 5; - _parachuteCheck = _args select 6; - - if (!alive _unit) exitwith { - [_unit, QGVAR(unconscious), false] call EFUNC(common,setCaptivityStatus); - [_unit, false] call EFUNC(common,disableAI); - //_unit setUnitPos _originalPos; - _unit setUnconscious false; - ["medical_onUnconscious", [_unit, false]] call EFUNC(common,globalEvent); - - [(_this select 1)] call cba_fnc_removePerFrameHandler; - }; - - // In case the unit is no longer in an unconscious state, we are going to check if we can already reset the animation - if !(_unit getvariable ["ACE_isUnconscious",false]) exitwith { - - // TODO, handle this with carry instead, so we can remove the PFH here. - // Wait until the unit isn't being carried anymore, so we won't end up with wierd animations - if !(([_unit] call FUNC(isBeingCarried)) || ([_unit] call FUNC(isBeingDragged))) then { - if (vehicle _unit == _unit) then { - if (animationState _unit == "AinjPpneMstpSnonWrflDnon") then { - [_unit,"AinjPpneMstpSnonWrflDnon_rolltofront", 2] call EFUNC(common,doAnimation); - [_unit,"amovppnemstpsnonwnondnon", 1] call EFUNC(common,doAnimation); - } else { - [_unit,"amovppnemstpsnonwnondnon", 2] call EFUNC(common,doAnimation); - }; - } else { - // Switch to the units original animation, assuming - // TODO: what if the unit switched vehicle? - [_unit, _oldAnimation, 2] call EFUNC(common,doAnimation); - }; - ["medical_onUnconscious", [_unit, false]] call EFUNC(common,globalEvent); - // EXIT PFH - [(_this select 1)] call cba_fnc_removePerFrameHandler; - }; - if (!_hasMovedOut) then { - // Reset the unit back to the previous captive state. - [_unit, QGVAR(unconscious), false] call EFUNC(common,setCaptivityStatus); - - // Swhich the unit back to its original group - //Unconscious units shouldn't be put in another group #527: - // [_unit, false, "ACE_isUnconscious", side group _unit] call EFUNC(common,switchToGroupSide); - - [_unit, false] call EFUNC(common,disableAI); - _unit setUnitPos _originalPos; // This is not position but stance (DOWN, MIDDLE, UP) - - _unit setUnconscious false; - - // ensure this statement runs only once - _args set [5, true]; - }; - }; - - if (_parachuteCheck) then { - if !(vehicle _unit isKindOf "ParachuteBase") then { - [_unit, [_unit] call EFUNC(common,getDeathAnim), 1, true] call EFUNC(common,doAnimation); - _args set [6, false]; - }; - }; - - // Ensure we are waiting at least a minimum period before checking if we can wake up the unit again, allows for temp knock outs - if ((time - _startingTime) >= _minWaitingTime) exitwith { - - if (!([_unit] call FUNC(getUnconsciousCondition))) then { - _unit setvariable ["ACE_isUnconscious", false, true]; - }; - }; -}, 0.1, [_unit,_animState, _originalPos, _startingTime, _minWaitingTime, false, vehicle _unit isKindOf "ParachuteBase"] ] call CBA_fnc_addPerFrameHandler; +[DFUNC(unconsciousPFH), 0.1, [_unit,_animState, _originalPos, _startingTime, _minWaitingTime, false, vehicle _unit isKindOf "ParachuteBase"] ] call CBA_fnc_addPerFrameHandler; ["medical_onUnconscious", [_unit, true]] call EFUNC(common,globalEvent); diff --git a/addons/medical/functions/fnc_unconsciousPFH.sqf b/addons/medical/functions/fnc_unconsciousPFH.sqf new file mode 100644 index 00000000000..406d0278c1c --- /dev/null +++ b/addons/medical/functions/fnc_unconsciousPFH.sqf @@ -0,0 +1,93 @@ +/* + * Author: Glowbal + * PFH logic for unconscious state + * + * Arguments: + * 0: The unit that will be put in an unconscious state + * + * ReturnValue: + * nil + * + * Public: yes + */ + +#include "script_component.hpp" + +private ["_unit", "_vehicleOfUnit","_minWaitingTime", "_oldAnimation", "_captiveSwitch", "_hasMovedOut", "_parachuteCheck"]; +_args = _this select 0; +_unit = _args select 0; +_oldAnimation = _args select 1; +_originalPos = _args select 2; +_startingTime = _args select 3; +_minWaitingTime = _args select 4; +_hasMovedOut = _args select 5; +_parachuteCheck = _args select 6; + +if (!alive _unit) exitwith { + [_unit, QGVAR(unconscious), false] call EFUNC(common,setCaptivityStatus); + [_unit, false] call EFUNC(common,disableAI); + //_unit setUnitPos _originalPos; + _unit setUnconscious false; + ["medical_onUnconscious", [_unit, false]] call EFUNC(common,globalEvent); + + [(_this select 1)] call cba_fnc_removePerFrameHandler; +}; + +// In case the unit is no longer in an unconscious state, we are going to check if we can already reset the animation +if !(_unit getvariable ["ACE_isUnconscious",false]) exitwith { + // TODO, handle this with carry instead, so we can remove the PFH here. + // Wait until the unit isn't being carried anymore, so we won't end up with wierd animations + if !(([_unit] call FUNC(isBeingCarried)) || ([_unit] call FUNC(isBeingDragged))) then { + if (vehicle _unit == _unit) then { + if (animationState _unit == "AinjPpneMstpSnonWrflDnon") then { + [_unit,"AinjPpneMstpSnonWrflDnon_rolltofront", 2] call EFUNC(common,doAnimation); + [_unit,"amovppnemstpsnonwnondnon", 1] call EFUNC(common,doAnimation); + } else { + [_unit,"amovppnemstpsnonwnondnon", 2] call EFUNC(common,doAnimation); + }; + } else { + // Switch to the units original animation, assuming + // TODO: what if the unit switched vehicle? + [_unit, _oldAnimation, 2] call EFUNC(common,doAnimation); + }; + ["medical_onUnconscious", [_unit, false]] call EFUNC(common,globalEvent); + // EXIT PFH + [(_this select 1)] call cba_fnc_removePerFrameHandler; + }; + if (!_hasMovedOut) then { + // Reset the unit back to the previous captive state. + [_unit, QGVAR(unconscious), false] call EFUNC(common,setCaptivityStatus); + + // Swhich the unit back to its original group + //Unconscious units shouldn't be put in another group #527: + // [_unit, false, "ACE_isUnconscious", side group _unit] call EFUNC(common,switchToGroupSide); + + [_unit, false] call EFUNC(common,disableAI); + _unit setUnitPos _originalPos; // This is not position but stance (DOWN, MIDDLE, UP) + + _unit setUnconscious false; + + // ensure this statement runs only once + _args set [5, true]; + }; +}; + +if (_parachuteCheck) then { + if !(vehicle _unit isKindOf "ParachuteBase") then { + [_unit, [_unit] call EFUNC(common,getDeathAnim), 1, true] call EFUNC(common,doAnimation); + _args set [6, false]; + }; +}; + +if (!local _unit) exitwith { + _args set [ 4, _minWaitingTime - (time - _startingTime)]; + _unit setvariable [QGVAR(unconsciousArguments), _args, true]; + [(_this select 1)] call cba_fnc_removePerFrameHandler; +}; + +// Ensure we are waiting at least a minimum period before checking if we can wake up the unit again, allows for temp knock outs +if ((time - _startingTime) >= _minWaitingTime) exitwith { + if (!([_unit] call FUNC(getUnconsciousCondition))) then { + _unit setvariable ["ACE_isUnconscious", false, true]; + }; +}; From fa7bb5f9c64b51e2c5eb9e0a0598c2ea20334e07 Mon Sep 17 00:00:00 2001 From: Glowbal Date: Fri, 17 Apr 2015 21:28:47 +0200 Subject: [PATCH 027/104] Added unconscious state check --- addons/medical/functions/fnc_handleLocal.sqf | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/addons/medical/functions/fnc_handleLocal.sqf b/addons/medical/functions/fnc_handleLocal.sqf index 5a6123d9f77..98b390b51a5 100644 --- a/addons/medical/functions/fnc_handleLocal.sqf +++ b/addons/medical/functions/fnc_handleLocal.sqf @@ -23,7 +23,7 @@ if (_local) then { [_unit, true] call FUNC(addToInjuredCollection); }; - if (count (_unit getvariable [QGVAR(unconsciousArguments), []]) >= 7) then { + if ((_unit getvariable ["ACE_isUnconscious",false]) && {count (_unit getvariable [QGVAR(unconsciousArguments), []]) >= 7}) then { private "_arguments"; _arguments = (_unit getvariable [QGVAR(unconsciousArguments), []]); _arguments set [ 3, time]; From 0e858be1b17cdbe1a749887afe567f81bd441c63 Mon Sep 17 00:00:00 2001 From: Glowbal Date: Fri, 17 Apr 2015 22:00:07 +0200 Subject: [PATCH 028/104] Changed conditions for body parts are now always true. This way the medical information is always available, and should help a bit with performance as well. --- addons/medical/ACE_Medical_Actions.hpp | 6 ++++++ addons/medical/ACE_Medical_SelfActions.hpp | 7 +++++++ 2 files changed, 13 insertions(+) diff --git a/addons/medical/ACE_Medical_Actions.hpp b/addons/medical/ACE_Medical_Actions.hpp index 036dd5e9d94..3acc53cf05c 100644 --- a/addons/medical/ACE_Medical_Actions.hpp +++ b/addons/medical/ACE_Medical_Actions.hpp @@ -3,6 +3,7 @@ class ACE_Head { displayName = "$STR_ACE_Interaction_Head"; runOnHover = 1; statement = QUOTE([ARR_3(_target, true, 0)] call DFUNC(displayPatientInformation)); + condition = "true"; EXCEPTIONS icon = PATHTOF(UI\icons\medical_cross.paa); distance = MEDICAL_ACTION_DISTANCE; @@ -74,6 +75,7 @@ class ACE_Torso { displayName = "$STR_ACE_Interaction_Torso"; runOnHover = 1; statement = QUOTE([ARR_3(_target, true, 1)] call DFUNC(displayPatientInformation)); + condition = "true"; EXCEPTIONS icon = PATHTOF(UI\icons\medical_cross.paa); distance = MEDICAL_ACTION_DISTANCE; @@ -173,6 +175,7 @@ class ACE_ArmLeft { displayName = "$STR_ACE_Interaction_ArmLeft"; runOnHover = 1; statement = QUOTE([ARR_3(_target, true, 2)] call DFUNC(displayPatientInformation)); + condition = "true"; EXCEPTIONS icon = PATHTOF(UI\icons\medical_cross.paa); distance = MEDICAL_ACTION_DISTANCE; @@ -329,6 +332,7 @@ class ACE_ArmRight { displayName = "$STR_ACE_Interaction_ArmRight"; runOnHover = 1; statement = QUOTE([ARR_3(_target, true, 3)] call DFUNC(displayPatientInformation)); + condition = "true"; EXCEPTIONS icon = PATHTOF(UI\icons\medical_cross.paa); distance = MEDICAL_ACTION_DISTANCE; @@ -482,6 +486,7 @@ class ACE_LegLeft { displayName = "$STR_ACE_Interaction_LegLeft"; runOnHover = 1; statement = QUOTE([ARR_3(_target, true, 4)] call DFUNC(displayPatientInformation)); + condition = "true"; EXCEPTIONS icon = PATHTOF(UI\icons\medical_cross.paa); distance = MEDICAL_ACTION_DISTANCE; @@ -623,6 +628,7 @@ class ACE_LegRight { displayName = "$STR_ACE_Interaction_LegRight"; runOnHover = 1; statement = QUOTE([ARR_3(_target, true, 5)] call DFUNC(displayPatientInformation)); + condition = "true"; EXCEPTIONS icon = PATHTOF(UI\icons\medical_cross.paa); distance = MEDICAL_ACTION_DISTANCE; diff --git a/addons/medical/ACE_Medical_SelfActions.hpp b/addons/medical/ACE_Medical_SelfActions.hpp index c2a60898f4f..e31e99ad010 100644 --- a/addons/medical/ACE_Medical_SelfActions.hpp +++ b/addons/medical/ACE_Medical_SelfActions.hpp @@ -4,6 +4,7 @@ class Medical { hotkey = "M"; exceptions[] = {"isNotInside"}; statement = QUOTE([ARR_3(_target, true, 0)] call DFUNC(displayPatientInformation)); + condition = "true"; icon = PATHTOF(UI\icons\medical_cross.paa); class ACE_Head { @@ -11,6 +12,7 @@ class Medical { icon = PATHTOF(UI\icons\medical_cross.paa); exceptions[] = {"isNotInside"}; statement = QUOTE([ARR_3(_target, true, 0)] call DFUNC(displayPatientInformation)); + condition = "true"; runOnHover = 1; class Bandage { @@ -78,6 +80,7 @@ class Medical { runOnHover = 1; exceptions[] = {"isNotInside"}; statement = QUOTE([ARR_3(_target, true, 1)] call DFUNC(displayPatientInformation)); + condition = "true"; showDisabled = 1; priority = 2; hotkey = ""; @@ -146,6 +149,7 @@ class Medical { runOnHover = 1; exceptions[] = {"isNotInside"}; statement = QUOTE([ARR_3(_target, true, 2)] call DFUNC(displayPatientInformation)); + condition = "true"; icon = PATHTOF(UI\icons\medical_cross.paa); class Bandage { @@ -246,6 +250,7 @@ class Medical { runOnHover = 1; exceptions[] = {"isNotInside"}; statement = QUOTE([ARR_3(_target, true, 3)] call DFUNC(displayPatientInformation)); + condition = "true"; icon = PATHTOF(UI\icons\medical_cross.paa); class Bandage { @@ -342,6 +347,7 @@ class Medical { runOnHover = 1; exceptions[] = {"isNotInside"}; statement = QUOTE([ARR_3(_target, true, 4)] call DFUNC(displayPatientInformation)); + condition = "true"; icon = PATHTOF(UI\icons\medical_cross.paa); class Bandage { @@ -427,6 +433,7 @@ class Medical { runOnHover = 1; exceptions[] = {"isNotInside"}; statement = QUOTE([ARR_3(_target, true, 5)] call DFUNC(displayPatientInformation)); + condition = "true"; icon = PATHTOF(UI\icons\medical_cross.paa); class Bandage { From 6d18e484c148aa3e4e783e8ec6b2066e81b98b81 Mon Sep 17 00:00:00 2001 From: Glowbal Date: Fri, 17 Apr 2015 22:02:43 +0200 Subject: [PATCH 029/104] Cache condition for target instead of caller --- addons/medical/functions/fnc_canTreatCached.sqf | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/addons/medical/functions/fnc_canTreatCached.sqf b/addons/medical/functions/fnc_canTreatCached.sqf index 34d753b1192..b1dfaf7d124 100644 --- a/addons/medical/functions/fnc_canTreatCached.sqf +++ b/addons/medical/functions/fnc_canTreatCached.sqf @@ -19,4 +19,4 @@ #define MAX_DURATION_CACHE 2 // parameters, function, namespace, uid -[_this, DFUNC(canTreat), _this select 0, format[QGVAR(canTreat_%1_%2), _this select 2, _this select 3], MAX_DURATION_CACHE, "clearConditionCaches"] call EFUNC(common,cachedCall); +[_this, DFUNC(canTreat), _this select 1, format[QGVAR(canTreat_%1_%2), _this select 2, _this select 3], MAX_DURATION_CACHE, "clearConditionCaches"] call EFUNC(common,cachedCall); From f5effca21636f18ebbcaef1f48bbb5eac9d7f6b1 Mon Sep 17 00:00:00 2001 From: Glowbal Date: Fri, 17 Apr 2015 22:21:15 +0200 Subject: [PATCH 030/104] fixed handleDamage basic --- addons/medical/functions/fnc_handleDamage.sqf | 6 ------ addons/medical/functions/fnc_handleDamage_basic.sqf | 6 ++++++ 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/addons/medical/functions/fnc_handleDamage.sqf b/addons/medical/functions/fnc_handleDamage.sqf index 876feae6375..1632a8f55b7 100644 --- a/addons/medical/functions/fnc_handleDamage.sqf +++ b/addons/medical/functions/fnc_handleDamage.sqf @@ -36,12 +36,6 @@ if !(_selection in (GVAR(SELECTIONS) + [""])) exitWith {0}; _damageReturn = _damage; if (GVAR(level) < 2) then { - if ([_unit] call EFUNC(common,isPlayer)) then { - _this set [2, _damage / (GVAR(playerDamageThreshold) max 0.01)]; - } else { - _this set [2, _damage / (GVAR(AIDamageThreshold) max 0.01)]; - }; - _damageReturn = _this call FUNC(handleDamage_basic); }; diff --git a/addons/medical/functions/fnc_handleDamage_basic.sqf b/addons/medical/functions/fnc_handleDamage_basic.sqf index aa9c2f61df2..6e343b127a8 100644 --- a/addons/medical/functions/fnc_handleDamage_basic.sqf +++ b/addons/medical/functions/fnc_handleDamage_basic.sqf @@ -63,6 +63,12 @@ if (_selectionName in GVAR(SELECTIONS)) then { _newDamage = _damage - (_unit getHitPointDamage (GVAR(HITPOINTS) select (GVAR(SELECTIONS) find _selectionName))); }; +if ([_unit] call EFUNC(common,isPlayer)) then { + _newDamage = _newDamage / (GVAR(playerDamageThreshold) max 0.01); +} else { + _newDamage = _newDamage / (GVAR(AIDamageThreshold) max 0.01); +}; + _damage = _damage - _newDamage; From 9670267d2001cf7bd8aeb61f65546d250a2e3f63 Mon Sep 17 00:00:00 2001 From: Glowbal Date: Fri, 17 Apr 2015 22:21:54 +0200 Subject: [PATCH 031/104] Fixed wrong classnames for IV treatments --- addons/medical/ACE_Medical_Actions.hpp | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/addons/medical/ACE_Medical_Actions.hpp b/addons/medical/ACE_Medical_Actions.hpp index 3acc53cf05c..ed5670f8148 100644 --- a/addons/medical/ACE_Medical_Actions.hpp +++ b/addons/medical/ACE_Medical_Actions.hpp @@ -427,8 +427,8 @@ class ACE_ArmRight { }; class PlasmaIV: BloodIV { displayName = "$STR_ACE_MEDICAL_ACTIONS_Plasma4_1000"; - condition = QUOTE([ARR_4(_player, _target, 'hand_r', 'BloodIV')] call DFUNC(canTreatCached)); - statement = QUOTE([ARR_4(_player, _target, 'hand_r', 'BloodIV')] call DFUNC(treatment)); + condition = QUOTE([ARR_4(_player, _target, 'hand_r', 'PlasmaIV')] call DFUNC(canTreatCached)); + statement = QUOTE([ARR_4(_player, _target, 'hand_r', 'PlasmaIV')] call DFUNC(treatment)); EXCEPTIONS }; class PlasmaIV_500: PlasmaIV { @@ -583,8 +583,8 @@ class ACE_LegLeft { }; class PlasmaIV: BloodIV { displayName = "$STR_ACE_MEDICAL_ACTIONS_Plasma4_1000"; - condition = QUOTE([ARR_4(_player, _target, 'leg_l', 'BloodIV')] call DFUNC(canTreatCached)); - statement = QUOTE([ARR_4(_player, _target, 'leg_l', 'BloodIV')] call DFUNC(treatment)); + condition = QUOTE([ARR_4(_player, _target, 'leg_l', 'PlasmaIV')] call DFUNC(canTreatCached)); + statement = QUOTE([ARR_4(_player, _target, 'leg_l', 'PlasmaIV')] call DFUNC(treatment)); EXCEPTIONS }; class PlasmaIV_500: PlasmaIV { @@ -724,8 +724,8 @@ class ACE_LegRight { }; class PlasmaIV: BloodIV { displayName = "$STR_ACE_MEDICAL_ACTIONS_Plasma4_1000"; - condition = QUOTE([ARR_4(_player, _target, 'leg_r', 'BloodIV')] call DFUNC(canTreatCached)); - statement = QUOTE([ARR_4(_player, _target, 'leg_r', 'BloodIV')] call DFUNC(treatment)); + condition = QUOTE([ARR_4(_player, _target, 'leg_r', 'PlasmaIV')] call DFUNC(canTreatCached)); + statement = QUOTE([ARR_4(_player, _target, 'leg_r', 'PlasmaIV')] call DFUNC(treatment)); EXCEPTIONS }; class PlasmaIV_500: PlasmaIV { From cbc3584f9d6624f8e4bba525c0632d98b0d57e04 Mon Sep 17 00:00:00 2001 From: Glowbal Date: Fri, 17 Apr 2015 22:24:42 +0200 Subject: [PATCH 032/104] removed duplicate condition attribute --- addons/medical/ACE_Medical_SelfActions.hpp | 1 - 1 file changed, 1 deletion(-) diff --git a/addons/medical/ACE_Medical_SelfActions.hpp b/addons/medical/ACE_Medical_SelfActions.hpp index e31e99ad010..9c79503f3db 100644 --- a/addons/medical/ACE_Medical_SelfActions.hpp +++ b/addons/medical/ACE_Medical_SelfActions.hpp @@ -80,7 +80,6 @@ class Medical { runOnHover = 1; exceptions[] = {"isNotInside"}; statement = QUOTE([ARR_3(_target, true, 1)] call DFUNC(displayPatientInformation)); - condition = "true"; showDisabled = 1; priority = 2; hotkey = ""; From bc4d102d0890023f59bfea846bc4cdc85651f92b Mon Sep 17 00:00:00 2001 From: Glowbal Date: Fri, 17 Apr 2015 22:43:31 +0200 Subject: [PATCH 033/104] changed variable initialization - everything is now done local --- addons/medical/XEH_init.sqf | 5 +-- addons/medical/XEH_respawn.sqf | 3 +- addons/medical/functions/fnc_init.sqf | 49 ++++++++++++++------------- 3 files changed, 28 insertions(+), 29 deletions(-) diff --git a/addons/medical/XEH_init.sqf b/addons/medical/XEH_init.sqf index 2f840fe9509..f3fb2b1e935 100644 --- a/addons/medical/XEH_init.sqf +++ b/addons/medical/XEH_init.sqf @@ -4,7 +4,4 @@ private ["_unit"]; _unit = _this select 0; _unit addEventHandler ["HandleDamage", {_this call FUNC(handleDamage)}]; - -if (local _unit) then { - [_unit] call FUNC(init); -}; +[_unit] call FUNC(init); diff --git a/addons/medical/XEH_respawn.sqf b/addons/medical/XEH_respawn.sqf index b2101b1d4eb..5047f0026cc 100644 --- a/addons/medical/XEH_respawn.sqf +++ b/addons/medical/XEH_respawn.sqf @@ -6,8 +6,7 @@ _unit = _this select 0; if !(local _unit) exitWith {}; -diag_log "running respawn"; -[_unit] call FUNC(init); +[_unit, true] call FUNC(init); //Reset captive status for respawning unit if (!(_unit getVariable ["ACE_isUnconscious", false])) then { diff --git a/addons/medical/functions/fnc_init.sqf b/addons/medical/functions/fnc_init.sqf index fa6aa357c26..0147b99204d 100644 --- a/addons/medical/functions/fnc_init.sqf +++ b/addons/medical/functions/fnc_init.sqf @@ -13,21 +13,24 @@ #include "script_component.hpp" -private ["_unit", "_allUsedMedication", "_logs"]; +private ["_unit", "_allUsedMedication", "_logs", "_forceNew"]; _unit = _this select 0; +_forceNew = if (count _this > 1) then {_this select 1} else {false}; -_unit setVariable [QGVAR(pain), 0, true]; -_unit setVariable [QGVAR(morphine), 0, true]; -_unit setVariable [QGVAR(bloodVolume), 100, true]; +if (!(isnil {_unit getvariable QGVAR(triageLevel)}) && !_forceNew) exitwith {}; + +_unit setVariable [QGVAR(pain), 0]; +_unit setVariable [QGVAR(morphine), 0]; +_unit setVariable [QGVAR(bloodVolume), 100]; // tourniquets -_unit setvariable [QGVAR(tourniquets), [0,0,0,0,0,0], true]; +_unit setvariable [QGVAR(tourniquets), [0,0,0,0,0,0]]; // wounds and injuries -_unit setvariable [QGVAR(openWounds), [], true]; -_unit setvariable [QGVAR(bandagedWounds), [], true]; -_unit setVariable [QGVAR(internalWounds), [], true]; +_unit setvariable [QGVAR(openWounds), []]; +_unit setvariable [QGVAR(bandagedWounds), []]; +_unit setVariable [QGVAR(internalWounds), []]; _unit setvariable [QGVAR(lastUniqueWoundID), 1]; // vitals @@ -40,8 +43,8 @@ _unit setVariable [QGVAR(peripheralResistance), 100]; _unit setVariable [QGVAR(fractures), []]; // triage card and logs -_unit setvariable [QGVAR(triageLevel), 0, true]; -_unit setvariable [QGVAR(triageCard), [], true]; +_unit setvariable [QGVAR(triageLevel), 0]; +_unit setvariable [QGVAR(triageCard), []]; // IVs _unit setVariable [QGVAR(salineIVVolume), 0]; @@ -49,21 +52,21 @@ _unit setVariable [QGVAR(plasmaIVVolume), 0]; _unit setVariable [QGVAR(bloodIVVolume), 0]; // damage storage -_unit setvariable [QGVAR(bodyPartStatus), [0,0,0,0,0,0], true]; +_unit setvariable [QGVAR(bodyPartStatus), [0,0,0,0,0,0]]; // airway -_unit setvariable [QGVAR(airwayStatus), 100, true]; -_unit setVariable [QGVAR(airwayOccluded), false, true]; -_unit setvariable [QGVAR(airwayCollapsed), false, true]; +_unit setvariable [QGVAR(airwayStatus), 100]; +_unit setVariable [QGVAR(airwayOccluded), false]; +_unit setvariable [QGVAR(airwayCollapsed), false]; // generic medical admin -_unit setvariable [QGVAR(addedToUnitLoop), false, true]; -_unit setvariable [QGVAR(inCardiacArrest), false, true]; -_unit setVariable ["ACE_isUnconscious", false, true]; -_unit setvariable [QGVAR(hasLostBlood), false, true]; -_unit setvariable [QGVAR(isBleeding), false, true]; -_unit setvariable [QGVAR(hasPain), false, true]; -_unit setvariable [QGVAR(amountOfReviveLives), GVAR(amountOfReviveLives), true]; +_unit setvariable [QGVAR(addedToUnitLoop), false]; +_unit setvariable [QGVAR(inCardiacArrest), false]; +_unit setVariable ["ACE_isUnconscious", false]; +_unit setvariable [QGVAR(hasLostBlood), false]; +_unit setvariable [QGVAR(isBleeding), false]; +_unit setvariable [QGVAR(hasPain), false]; +_unit setvariable [QGVAR(amountOfReviveLives), GVAR(amountOfReviveLives)]; // medication _allUsedMedication = _unit getVariable [QGVAR(allUsedMedication), []]; @@ -74,9 +77,9 @@ _unit setVariable [QGVAR(allUsedMedication), []]; _logs = _unit getvariable [QGVAR(allLogs), []]; { - _unit setvariable [_x, nil, true]; + _unit setvariable [_x, nil]; } foreach _logs; -_unit setvariable [QGVAR(allLogs), [], true]; +_unit setvariable [QGVAR(allLogs), []]; // items [{ From d1a09ae7fc1429fe5d69d5d797110395b3aa51ea Mon Sep 17 00:00:00 2001 From: Glowbal Date: Fri, 17 Apr 2015 23:15:41 +0200 Subject: [PATCH 034/104] fixed vehicle crashes for adv --- addons/medical/functions/fnc_handleDamage.sqf | 6 ++++++ addons/medical/functions/fnc_handleDamage_advanced.sqf | 2 ++ addons/medical/functions/fnc_handleDamage_caching.sqf | 2 +- 3 files changed, 9 insertions(+), 1 deletion(-) diff --git a/addons/medical/functions/fnc_handleDamage.sqf b/addons/medical/functions/fnc_handleDamage.sqf index 1632a8f55b7..c13818bbcdc 100644 --- a/addons/medical/functions/fnc_handleDamage.sqf +++ b/addons/medical/functions/fnc_handleDamage.sqf @@ -57,6 +57,12 @@ if (GVAR(level) >= 2) then { _minLethalDamage = GVAR(minLethalDamages) select _typeIndex; }; + if (vehicle _unit != _unit && {!(vehicle _unit isKindOf "StaticWeapon")} && {isNull _source} && {_projectile == ""} && {_selection == ""}) then { + if (GVAR(enableVehicleCrashes)) then { + _selection = GVAR(SELECTIONS) select (floor(random(count GVAR(SELECTIONS)))); + }; + }; + if ((_minLethalDamage <= _newDamage) && {[_unit, [_selection] call FUNC(selectionNameToNumber), _newDamage] call FUNC(determineIfFatal)} && {_selection in ["", "head", "body"]}) then { if ([_unit] call FUNC(setDead)) then { _damageReturn = 1; diff --git a/addons/medical/functions/fnc_handleDamage_advanced.sqf b/addons/medical/functions/fnc_handleDamage_advanced.sqf index ba0eb8af24f..8bd0267d3fc 100644 --- a/addons/medical/functions/fnc_handleDamage_advanced.sqf +++ b/addons/medical/functions/fnc_handleDamage_advanced.sqf @@ -33,10 +33,12 @@ if (isNull _sourceOfDamage && {_typeOfProjectile == ""} && {vehicle _unit == _un }; _typeOfDamage = [_typeOfProjectile] call FUNC(getTypeOfDamage); _part = [_selectionName] call FUNC(selectionNameToNumber); +if (_part < 0) exitwith {}; _hitPoints = ["HitHead", "HitBody", "HitLeftArm", "HitRightArm", "HitLeftLeg", "HitRightLeg"]; // Sorting out the damage _damageBodyParts = _unit getvariable [QGVAR(bodyPartStatus), [0,0,0,0,0,0]]; + _damageBodyParts set [_part, (_damageBodyParts select _part) + _newDamage]; _unit setvariable [QGVAR(bodyPartStatus), _damageBodyParts, true]; diff --git a/addons/medical/functions/fnc_handleDamage_caching.sqf b/addons/medical/functions/fnc_handleDamage_caching.sqf index 98b2373c748..95d750843d6 100644 --- a/addons/medical/functions/fnc_handleDamage_caching.sqf +++ b/addons/medical/functions/fnc_handleDamage_caching.sqf @@ -38,7 +38,7 @@ if (_selectionName in _hitSelections) then { // Check for vehicle crash if (vehicle _unit != _unit && {!(vehicle _unit isKindOf "StaticWeapon")} && {isNull _source} && {_projectile == ""} && {_selectionName == ""}) then { - if (missionNamespace getvariable [QGVAR(allowVehicleCrashDamage), true]) then { + if (GVAR(enableVehicleCrashes)) then { _selectionName = _hitSelections select (floor(random(count _hitSelections))); _projectile = "vehiclecrash"; }; From 25d8c6c93e0670fba02cb58d0507925cb40fa405 Mon Sep 17 00:00:00 2001 From: commy2 Date: Fri, 17 Apr 2015 23:24:43 +0200 Subject: [PATCH 035/104] function to show error message box --- addons/common/XEH_preInit.sqf | 1 + addons/common/functions/fnc_errorMessage.sqf | 144 +++++++++++++++++++ 2 files changed, 145 insertions(+) create mode 100644 addons/common/functions/fnc_errorMessage.sqf diff --git a/addons/common/XEH_preInit.sqf b/addons/common/XEH_preInit.sqf index b5382d0b5ed..c484fd985e2 100644 --- a/addons/common/XEH_preInit.sqf +++ b/addons/common/XEH_preInit.sqf @@ -42,6 +42,7 @@ PREP(doAnimation); PREP(dropBackpack); PREP(endRadioTransmission); PREP(eraseCache); +PREP(errorMessage); PREP(execNextFrame); PREP(execPersistentFnc); PREP(execRemoteFnc); diff --git a/addons/common/functions/fnc_errorMessage.sqf b/addons/common/functions/fnc_errorMessage.sqf new file mode 100644 index 00000000000..46f2d2c9d47 --- /dev/null +++ b/addons/common/functions/fnc_errorMessage.sqf @@ -0,0 +1,144 @@ +/* + * Author: commy2, based on BIS_fnc_errorMsg and BIS_fnc_guiMessage by Karel Moricky (BI) + * Stops simulation and opens a textbox with error message. + * + * Arguments: + * 0: Error name + * + * Return Value: + * None + * + * Public: No + */ +#include "script_component.hpp" + +disableSerialization; +endLoadingScreen; + +private ["_textHeader", "_textMessage", "_onOK", "_onCancel"]; + +_textHeader = _this select 0; +_textMessage = _this select 1; +_onOK = ARR_SELECT(_this,2,{}); +_onCancel = ARR_SELECT(_this,3,{}); + +if (typeName _textMessage == "STRING") then { + _textMessage = parseText _textMessage; +}; + +(call BIS_fnc_displayMission) createDisplay "RscDisplayCommonMessagePause"; + +private ["_display", "_ctrlRscMessageBox", "_ctrlBcgCommonTop", "_ctrlBcgCommon", "_ctrlText", "_ctrlBackgroundButtonOK", "_ctrlBackgroundButtonMiddle", "_ctrlBackgroundButtonCancel", "_ctrlButtonOK", "_ctrlButtonCancel"]; + +_display = uiNamespace getVariable "RscDisplayCommonMessage_display"; +_ctrlRscMessageBox = _display displayCtrl 2351; +_ctrlBcgCommonTop = _display displayCtrl 235100; +_ctrlBcgCommon = _display displayCtrl 235101; +_ctrlText = _display displayCtrl 235102; +_ctrlBackgroundButtonOK = _display displayCtrl 235103; +_ctrlBackgroundButtonMiddle = _display displayCtrl 235104; +_ctrlBackgroundButtonCancel = _display displayCtrl 235105; +_ctrlButtonOK = _display displayCtrl 235106; +_ctrlButtonCancel = _display displayCtrl 235107; + +_ctrlBcgCommonTop ctrlSetText _textHeader; + +private ["_ctrlButtonOKPos", "_ctrlBcgCommonPos", "_bottomSpaceY", "_ctrlTextPos", "_marginX", "_marginY"]; + +_ctrlButtonOKPos = ctrlPosition _ctrlButtonOK; +_ctrlBcgCommonPos = ctrlPosition _ctrlBcgCommon; +_bottomSpaceY = (_ctrlButtonOKPos select 1) - ((_ctrlBcgCommonPos select 1) + (_ctrlBcgCommonPos select 3)); + +_ctrlTextPos = ctrlPosition _ctrlText; +_marginX = (_ctrlTextPos select 0) - (_ctrlBcgCommonPos select 0); +_marginY = (_ctrlTextPos select 1) - (_ctrlBcgCommonPos select 1); + +private ["_ctrlTextPosH", "_bottomPosY"]; + +_ctrlText ctrlSetStructuredText _textMessage; +_ctrlTextPosH = ctrlTextHeight _ctrlText; + +_ctrlBcgCommon ctrlSetPosition [ + _ctrlBcgCommonPos select 0, + _ctrlBcgCommonPos select 1, + _ctrlBcgCommonPos select 2, + _ctrlTextPosH + _marginY * 2 +]; +_ctrlBcgCommon ctrlCommit 0; + +_ctrlText ctrlSetPosition [ + (_ctrlBcgCommonPos select 0) + _marginX, + (_ctrlBcgCommonPos select 1) + _marginY, + (_ctrlBcgCommonPos select 2) - _marginX * 2, + _ctrlTextPosH +]; +_ctrlText ctrlCommit 0; + +_bottomPosY = (_ctrlBcgCommonPos select 1) + _ctrlTextPosH + (_marginY * 2) + _bottomSpaceY; + +{ + private "_xPos"; + _xPos = ctrlPosition _x; + + _xPos set [1, _bottomPosY]; + _x ctrlSetPosition _xPos; + _x ctrlCommit 0; +} foreach [ + _ctrlBackgroundButtonOK, + _ctrlBackgroundButtonMiddle, + _ctrlBackgroundButtonCancel, + _ctrlButtonOK, + _ctrlButtonCancel +]; + +private ["_ctrlRscMessageBoxPos", "_ctrlRscMessageBoxPosH"]; + +_ctrlRscMessageBoxPos = ctrlPosition _ctrlRscMessageBox; +_ctrlRscMessageBoxPosH = _bottomPosY + (_ctrlButtonOKPos select 3); + +_ctrlRscMessageBox ctrlSetPosition [ + 0.5 - (_ctrlBcgCommonPos select 2) / 2, + 0.5 - _ctrlRscMessageBoxPosH / 2, + (_ctrlBcgCommonPos select 2) + 0.5, + _ctrlRscMessageBoxPosH +]; + +_ctrlRscMessageBox ctrlEnable true; +_ctrlRscMessageBox ctrlCommit 0; + +if (_onOK isEqualTo {}) then { + _ctrlButtonOK ctrlEnable false; + _ctrlButtonOK ctrlSetFade 0; + _ctrlButtonOK ctrlSetText ""; + _ctrlButtonOK ctrlCommit 0; +} else { + _ctrlButtonOK ctrlEnable true; + _ctrlButtonOK ctrlSetFade 0; + _ctrlButtonOK ctrlSetText localize "STR_DISP_OK"; + _ctrlButtonOK ctrlCommit 0; + + ctrlSetFocus _ctrlButtonOK; +}; + +if (_onCancel isEqualTo {}) then { + _ctrlButtonCancel ctrlEnable false; + _ctrlButtonCancel ctrlSetFade 0; + _ctrlButtonCancel ctrlSetText ""; + _ctrlButtonCancel ctrlCommit 0; +} else { + _ctrlButtonCancel ctrlEnable true; + _ctrlButtonCancel ctrlSetFade 0; + _ctrlButtonCancel ctrlSetText localize "STR_DISP_CANCEL"; + _ctrlButtonCancel ctrlCommit 0; + + ctrlSetFocus _ctrlButtonCancel; +}; + +_ctrlButtonOK ctrlAddEventHandler ["buttonClick", {(ctrlParent (_this select 0)) closeDisplay 1; true}]; +_ctrlButtonCancel ctrlAddEventHandler ["buttonClick", {(ctrlParent (_this select 0)) closeDisplay 2; true}]; + +GVAR(errorOnOK) = _onOK; +GVAR(errorOnCancel) = _onCancel; + +_display displayAddEventHandler ["unload", {call ([{}, GVAR(errorOnOK), GVAR(errorOnCancel)] select (_this select 1))}]; +_display displayAddEventHandler ["keyDown", {_this select 1 == 1}]; From 3ec5acbdb0a72f04ae89485fd442485d64196fe1 Mon Sep 17 00:00:00 2001 From: commy2 Date: Sat, 18 Apr 2015 01:05:30 +0200 Subject: [PATCH 036/104] stuff --- addons/common/config.cpp | 8 ++++++++ addons/common/functions/fnc_errorMessage.sqf | 4 ++-- 2 files changed, 10 insertions(+), 2 deletions(-) diff --git a/addons/common/config.cpp b/addons/common/config.cpp index 769ba37de10..21d6a6facb2 100644 --- a/addons/common/config.cpp +++ b/addons/common/config.cpp @@ -152,3 +152,11 @@ class CfgUIGrids { }; }; }; + +/* +// check dll +class RscStandardDisplay; +class RscDisplayMain: RscStandardDisplay { + onLoad = QUOTE([ARR_4(""onLoad"",_this,""RscDisplayMain"",'GUI')] call (uinamespace getvariable 'BIS_fnc_initDisplay'); [ARR_5('header','tail',{0},{},_this select 0)] call COMPILE_FILE(functions\fnc_errorMessage)); +}; +*/ diff --git a/addons/common/functions/fnc_errorMessage.sqf b/addons/common/functions/fnc_errorMessage.sqf index 46f2d2c9d47..e0617729420 100644 --- a/addons/common/functions/fnc_errorMessage.sqf +++ b/addons/common/functions/fnc_errorMessage.sqf @@ -3,7 +3,7 @@ * Stops simulation and opens a textbox with error message. * * Arguments: - * 0: Error name + * ? * * Return Value: * None @@ -26,7 +26,7 @@ if (typeName _textMessage == "STRING") then { _textMessage = parseText _textMessage; }; -(call BIS_fnc_displayMission) createDisplay "RscDisplayCommonMessagePause"; +(ARR_SELECT(_this,4,call BIS_fnc_displayMission)) createDisplay "RscDisplayCommonMessagePause"; private ["_display", "_ctrlRscMessageBox", "_ctrlBcgCommonTop", "_ctrlBcgCommon", "_ctrlText", "_ctrlBackgroundButtonOK", "_ctrlBackgroundButtonMiddle", "_ctrlBackgroundButtonCancel", "_ctrlButtonOK", "_ctrlButtonCancel"]; From 708a2aa374567e84ab500eead2d5320a0ab7513f Mon Sep 17 00:00:00 2001 From: commy2 Date: Sat, 18 Apr 2015 01:44:53 +0200 Subject: [PATCH 037/104] check if ddls are present on mission start --- addons/common/XEH_postInit.sqf | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/addons/common/XEH_postInit.sqf b/addons/common/XEH_postInit.sqf index e470e91c95a..eda61c66ad1 100644 --- a/addons/common/XEH_postInit.sqf +++ b/addons/common/XEH_postInit.sqf @@ -188,3 +188,14 @@ GVAR(OldPlayerWeapon) = currentWeapon ACE_player; // Players can always interact with passengers of the same vehicle {!((_this select 0) isEqualTo (_this select 1)) && {vehicle (_this select 0) == vehicle (_this select 1)}} }] call FUNC(addCanInteractWithCondition); + +// check dlls +{ + if (_x callExtension "version" == "") then { + private "_errorMsg"; + _errorMsg = format ["Extension %1.dll not installed.", _x]; + + diag_log text format ["[ACE] ERROR: %1", _errorMsg]; + ["[ACE] ERROR", _errorMsg, {findDisplay 46 closeDisplay 0}] call FUNC(errorMessage); + }; +} forEach ["ace_breakLine", "ace_advanced_ballistics", "ace_fcs"]; From db4de5100d63d2c76d4753d483113efed30877a2 Mon Sep 17 00:00:00 2001 From: ViperMaul Date: Fri, 17 Apr 2015 20:23:39 -0700 Subject: [PATCH 038/104] #552 - Copy important files and extensions --- tools/make.py | 62 ++++++++++++++++++++++++++++++++++++++++++++++----- 1 file changed, 57 insertions(+), 5 deletions(-) diff --git a/tools/make.py b/tools/make.py index 166d21c49d7..380c29faa7a 100644 --- a/tools/make.py +++ b/tools/make.py @@ -284,6 +284,50 @@ def print_yellow(msg): print(msg) color("reset") + +def copy_important_files(source_dir,destination_dir): + + originalDir = os.getcwd() + importantFiles = ["mod.cpp", + "README.md", + "AUTHORS.txt", + "LICENSE", + "logo_ace3_ca.paa" + ] + + print_yellow ("source_dir: " + source_dir) + print_yellow("destination_dir: " + destination_dir) + + #copy importantFiles + try: + print_blue("Searching for important files in " + source_dir) + for file in importantFiles: + print_green("Copying file => " + os.path.join(source_dir,file)) + shutil.copyfile(os.path.join(source_dir,file),os.path.join(destination_dir,file)) + except: + print_error("COPYING IMPORTANT FILES.") + raise + + print("") + + #copy all extension dlls + try: + os.chdir(os.path.join(source_dir)) + print_blue("Searching for DLLs in " + os.getcwd()) + filenames = glob.glob("*.dll") + + if not filenames: + print ("Empty SET") + + for dll in filenames: + print_green("Copying dll => " + os.path.join(source_dir,dll)) + if os.path.isfile(dll): + shutil.copyfile(os.path.join(source_dir,dll),os.path.join(destination_dir,dll)) + except: + print_error("COPYING DLL FILES.") + raise + finally: + os.chdir(originalDir) ############################################################################### def main(argv): @@ -436,27 +480,36 @@ def main(argv): # Release/build directory, relative to script dir release_dir = cfg.get(make_target, "release_dir", fallback="release") - + # Project PBO file prefix (files are renamed to prefix_name.pbo) pbo_name_prefix = cfg.get(make_target, "pbo_name_prefix", fallback=None) # Project module Root module_root_parent = os.path.abspath(os.path.join(os.path.join(work_drive, prefix), os.pardir)) module_root = cfg.get(make_target, "module_root", fallback=os.path.join(make_root_parent, "addons")) + ace_optionals_root = os.path.join(module_root_parent, "optionals") print_green ("module_root: " + module_root) + if (os.path.isdir(module_root)): os.chdir(module_root) else: print_error ("Directory " + module_root + " does not exist.") sys.exit() + if (os.path.isdir(ace_optionals_root)): + print_green ("ace_optionals_root: " + ace_optionals_root) + else: + print_error ("Directory " + ace_optionals_root + " does not exist.") + sys.exit() + + print_green ("release_dir: " + release_dir) + copy_important_files(module_root_parent,os.path.join(release_dir, "@ace")) + except: raise print_error("Could not parse make.cfg.") sys.exit(1) - - # See if we have been given specific modules to build from command line. if len(argv) > 1 and not make_release: arg_modules = True @@ -501,7 +554,7 @@ def main(argv): # Get list of subdirs in make root. dirs = next(os.walk(module_root))[1] - + # Autodetect what directories to build. if module_autodetect and not arg_modules: modules = [] @@ -670,7 +723,6 @@ def main(argv): else: cmd = [pboproject, "-P", os.path.join(work_drive, prefix, module), "+Engine=Arma3", "-S","+Noisy", "-X", "+Clean", "+Mod="+os.path.join(module_root, release_dir, project), "-Key"] - print_yellow(cmd) color("grey") if quiet: devnull = open(os.devnull, 'w') From 22456a4301f89e45f1c4734f45922b3bd0ecd1e0 Mon Sep 17 00:00:00 2001 From: Glowbal Date: Sat, 18 Apr 2015 19:49:29 +0200 Subject: [PATCH 039/104] use pain instead --- addons/medical/functions/fnc_init.sqf | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/addons/medical/functions/fnc_init.sqf b/addons/medical/functions/fnc_init.sqf index 0147b99204d..a9e3625c2b7 100644 --- a/addons/medical/functions/fnc_init.sqf +++ b/addons/medical/functions/fnc_init.sqf @@ -18,7 +18,7 @@ private ["_unit", "_allUsedMedication", "_logs", "_forceNew"]; _unit = _this select 0; _forceNew = if (count _this > 1) then {_this select 1} else {false}; -if (!(isnil {_unit getvariable QGVAR(triageLevel)}) && !_forceNew) exitwith {}; +if (!(isnil {_unit getvariable QGVAR(pain)}) && !_forceNew) exitwith {}; _unit setVariable [QGVAR(pain), 0]; _unit setVariable [QGVAR(morphine), 0]; From 5558a6491d1ff25c644d3357c302d0598d1c08e0 Mon Sep 17 00:00:00 2001 From: commy2 Date: Sun, 19 Apr 2015 00:40:29 +0200 Subject: [PATCH 040/104] remove weapon select in favor of the new controls from bi --- addons/weaponselect/XEH_postInit.sqf | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/addons/weaponselect/XEH_postInit.sqf b/addons/weaponselect/XEH_postInit.sqf index 6dc648d54c4..ae6cfafb9d0 100644 --- a/addons/weaponselect/XEH_postInit.sqf +++ b/addons/weaponselect/XEH_postInit.sqf @@ -4,7 +4,7 @@ if !(hasInterface) exitWith {}; // Add keybinds -["ACE3", QGVAR(SelectPistol), localize "STR_ACE_WeaponSelect_SelectPistol", +/*["ACE3", QGVAR(SelectPistol), localize "STR_ACE_WeaponSelect_SelectPistol", { // Conditions: canInteract if !([ACE_player, ACE_player, ["isNotEscorting"]] call EFUNC(common,canInteractWith)) exitWith {false}; @@ -72,7 +72,7 @@ if !(hasInterface) exitWith {}; true }, {false}, -[6, [false, false, false]], false] call cba_fnc_addKeybind; //5 Key +[6, [false, false, false]], false] call cba_fnc_addKeybind; //5 Key*/ ["ACE3", QGVAR(SelectGrenadeFrag), localize "STR_ACE_WeaponSelect_SelectGrenadeFrag", { @@ -144,7 +144,7 @@ if !(hasInterface) exitWith {}; {false}, [2, [false, false, false]], false] call cba_fnc_addKeybind; //1 Key -["ACE3", QGVAR(SelectMainGun), localize "STR_ACE_WeaponSelect_SelectMainGun", +/*["ACE3", QGVAR(SelectMainGun), localize "STR_ACE_WeaponSelect_SelectMainGun", { // Conditions: canInteract if !([ACE_player, ACE_player, []] call EFUNC(common,canInteractWith)) exitWith {false}; @@ -184,7 +184,7 @@ if !(hasInterface) exitWith {}; true }, {false}, -[6, [false, false, false]], false] call cba_fnc_addKeybind; //5 Key +[6, [false, false, false]], false] call cba_fnc_addKeybind; //5 Key*/ ["ACE3", QGVAR(FireSmokeLauncher), localize "STR_ACE_WeaponSelect_FireSmokeLauncher", { From fe92110b4d7be5559f2f48a35076247e5a8cae53 Mon Sep 17 00:00:00 2001 From: ViperMaul Date: Sat, 18 Apr 2015 19:16:12 -0700 Subject: [PATCH 041/104] Make sure you build missing files. Even if cache says the source files has not changed. #735 --- tools/make.py | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/tools/make.py b/tools/make.py index 380c29faa7a..ce5b770383d 100644 --- a/tools/make.py +++ b/tools/make.py @@ -597,7 +597,8 @@ def main(argv): # For each module, prep files and then build. for module in modules: print_green("\nMaking " + module + "-"*max(1, (60-len(module)))) - + missing = False + # Cache check if module in cache: old_sha = cache[module] @@ -610,10 +611,15 @@ def main(argv): # Hash the module new_sha = get_directory_hash(os.path.join(module_root, module)) + + # Is the pbo file missing? + missing = not os.path.isfile(os.path.join(release_dir, project, "addons", "ace_{}.pbo".format(module))) + if missing: + print("ace_{}.pbo".format(module) + " is missing. Building...") # Check if it needs rebuilt # print ("Hash:", new_sha) - if old_sha == new_sha: + if old_sha == new_sha and not missing: if not force_build: print("Module has not changed.") # Skip everything else From 8a7b3a1b334de2ee6108d63865c47ff6ec7e44e9 Mon Sep 17 00:00:00 2001 From: Glowbal Date: Sun, 19 Apr 2015 13:08:28 +0200 Subject: [PATCH 042/104] Removed damage thresholds from basic medical --- addons/medical/functions/fnc_handleDamage_basic.sqf | 6 ------ 1 file changed, 6 deletions(-) diff --git a/addons/medical/functions/fnc_handleDamage_basic.sqf b/addons/medical/functions/fnc_handleDamage_basic.sqf index 6e343b127a8..aa9c2f61df2 100644 --- a/addons/medical/functions/fnc_handleDamage_basic.sqf +++ b/addons/medical/functions/fnc_handleDamage_basic.sqf @@ -63,12 +63,6 @@ if (_selectionName in GVAR(SELECTIONS)) then { _newDamage = _damage - (_unit getHitPointDamage (GVAR(HITPOINTS) select (GVAR(SELECTIONS) find _selectionName))); }; -if ([_unit] call EFUNC(common,isPlayer)) then { - _newDamage = _newDamage / (GVAR(playerDamageThreshold) max 0.01); -} else { - _newDamage = _newDamage / (GVAR(AIDamageThreshold) max 0.01); -}; - _damage = _damage - _newDamage; From f6bbeb6bd6778977aa66983845b096e84c390f76 Mon Sep 17 00:00:00 2001 From: Glowbal Date: Sun, 19 Apr 2015 17:28:47 +0200 Subject: [PATCH 043/104] switched back to old init method --- addons/medical/XEH_init.sqf | 5 ++- addons/medical/XEH_respawn.sqf | 2 +- addons/medical/functions/fnc_init.sqf | 51 +++++++++++++-------------- 3 files changed, 29 insertions(+), 29 deletions(-) diff --git a/addons/medical/XEH_init.sqf b/addons/medical/XEH_init.sqf index f3fb2b1e935..0ded7d471f0 100644 --- a/addons/medical/XEH_init.sqf +++ b/addons/medical/XEH_init.sqf @@ -4,4 +4,7 @@ private ["_unit"]; _unit = _this select 0; _unit addEventHandler ["HandleDamage", {_this call FUNC(handleDamage)}]; -[_unit] call FUNC(init); + +if (local _unit) then { + [_unit] call FUNC(init); +}; diff --git a/addons/medical/XEH_respawn.sqf b/addons/medical/XEH_respawn.sqf index 5047f0026cc..ac6cc2d6ef1 100644 --- a/addons/medical/XEH_respawn.sqf +++ b/addons/medical/XEH_respawn.sqf @@ -6,7 +6,7 @@ _unit = _this select 0; if !(local _unit) exitWith {}; -[_unit, true] call FUNC(init); +[_unit] call FUNC(init); //Reset captive status for respawning unit if (!(_unit getVariable ["ACE_isUnconscious", false])) then { diff --git a/addons/medical/functions/fnc_init.sqf b/addons/medical/functions/fnc_init.sqf index a9e3625c2b7..d01a63b3a57 100644 --- a/addons/medical/functions/fnc_init.sqf +++ b/addons/medical/functions/fnc_init.sqf @@ -16,22 +16,19 @@ private ["_unit", "_allUsedMedication", "_logs", "_forceNew"]; _unit = _this select 0; -_forceNew = if (count _this > 1) then {_this select 1} else {false}; -if (!(isnil {_unit getvariable QGVAR(pain)}) && !_forceNew) exitwith {}; - -_unit setVariable [QGVAR(pain), 0]; -_unit setVariable [QGVAR(morphine), 0]; -_unit setVariable [QGVAR(bloodVolume), 100]; +_unit setVariable [QGVAR(pain), 0, true]; +_unit setVariable [QGVAR(morphine), 0, true]; +_unit setVariable [QGVAR(bloodVolume), 100, true]; // tourniquets -_unit setvariable [QGVAR(tourniquets), [0,0,0,0,0,0]]; +_unit setvariable [QGVAR(tourniquets), [0,0,0,0,0,0], true]; // wounds and injuries -_unit setvariable [QGVAR(openWounds), []]; -_unit setvariable [QGVAR(bandagedWounds), []]; -_unit setVariable [QGVAR(internalWounds), []]; -_unit setvariable [QGVAR(lastUniqueWoundID), 1]; +_unit setvariable [QGVAR(openWounds), [], true]; +_unit setvariable [QGVAR(bandagedWounds), [], true]; +_unit setVariable [QGVAR(internalWounds), [], true]; +_unit setvariable [QGVAR(lastUniqueWoundID), 1, true]; // vitals _unit setVariable [QGVAR(heartRate), 80]; @@ -40,19 +37,19 @@ _unit setvariable [QGVAR(bloodPressure), [80, 120]]; _unit setVariable [QGVAR(peripheralResistance), 100]; // fractures -_unit setVariable [QGVAR(fractures), []]; +_unit setVariable [QGVAR(fractures), [], true]; // triage card and logs -_unit setvariable [QGVAR(triageLevel), 0]; -_unit setvariable [QGVAR(triageCard), []]; +_unit setvariable [QGVAR(triageLevel), 0, true]; +_unit setvariable [QGVAR(triageCard), [], true]; // IVs -_unit setVariable [QGVAR(salineIVVolume), 0]; -_unit setVariable [QGVAR(plasmaIVVolume), 0]; -_unit setVariable [QGVAR(bloodIVVolume), 0]; +_unit setVariable [QGVAR(salineIVVolume), 0, true]; +_unit setVariable [QGVAR(plasmaIVVolume), 0, true]; +_unit setVariable [QGVAR(bloodIVVolume), 0, true]; // damage storage -_unit setvariable [QGVAR(bodyPartStatus), [0,0,0,0,0,0]]; +_unit setvariable [QGVAR(bodyPartStatus), [0,0,0,0,0,0], true]; // airway _unit setvariable [QGVAR(airwayStatus), 100]; @@ -60,26 +57,26 @@ _unit setVariable [QGVAR(airwayOccluded), false]; _unit setvariable [QGVAR(airwayCollapsed), false]; // generic medical admin -_unit setvariable [QGVAR(addedToUnitLoop), false]; -_unit setvariable [QGVAR(inCardiacArrest), false]; -_unit setVariable ["ACE_isUnconscious", false]; -_unit setvariable [QGVAR(hasLostBlood), false]; -_unit setvariable [QGVAR(isBleeding), false]; -_unit setvariable [QGVAR(hasPain), false]; -_unit setvariable [QGVAR(amountOfReviveLives), GVAR(amountOfReviveLives)]; +_unit setvariable [QGVAR(addedToUnitLoop), false, true]; +_unit setvariable [QGVAR(inCardiacArrest), false, true]; +_unit setVariable ["ACE_isUnconscious", false, true]; +_unit setvariable [QGVAR(hasLostBlood), false, true]; +_unit setvariable [QGVAR(isBleeding), false, true]; +_unit setvariable [QGVAR(hasPain), false, true]; +_unit setvariable [QGVAR(amountOfReviveLives), GVAR(amountOfReviveLives), true]; // medication _allUsedMedication = _unit getVariable [QGVAR(allUsedMedication), []]; { _unit setvariable [_x select 0, nil]; } foreach _allUsedMedication; -_unit setVariable [QGVAR(allUsedMedication), []]; +_unit setVariable [QGVAR(allUsedMedication), [], true]; _logs = _unit getvariable [QGVAR(allLogs), []]; { _unit setvariable [_x, nil]; } foreach _logs; -_unit setvariable [QGVAR(allLogs), []]; +_unit setvariable [QGVAR(allLogs), [], true]; // items [{ From 17899db086726ce830e79abd4f3a363e512f53c1 Mon Sep 17 00:00:00 2001 From: Glowbal Date: Sun, 19 Apr 2015 19:49:56 +0200 Subject: [PATCH 044/104] added some missing privates --- addons/medical/functions/fnc_treatmentAdvanced_bandageLocal.sqf | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/addons/medical/functions/fnc_treatmentAdvanced_bandageLocal.sqf b/addons/medical/functions/fnc_treatmentAdvanced_bandageLocal.sqf index 02626ff1fee..29bc6dc4d36 100644 --- a/addons/medical/functions/fnc_treatmentAdvanced_bandageLocal.sqf +++ b/addons/medical/functions/fnc_treatmentAdvanced_bandageLocal.sqf @@ -15,7 +15,7 @@ #include "script_component.hpp" -private ["_target", "_bandage", "_part", "_selectionName", "_openWounds", "_config", "_effectiveness","_mostEffectiveInjury", "_mostEffectiveSpot", "_woundEffectivenss", "_mostEffectiveInjury", "_impact", "_exit"]; +private ["_target", "_bandage", "_part", "_selectionName", "_openWounds", "_config", "_effectiveness","_mostEffectiveInjury", "_mostEffectiveSpot", "_woundEffectivenss", "_mostEffectiveInjury", "_impact", "_exit", "_specificClass", "_classID", "_effectivenessFound"]; _target = _this select 0; _bandage = _this select 1; _selectionName = _this select 2; From ac201d334c70bb6a5201776dd4ce63dd9129ea52 Mon Sep 17 00:00:00 2001 From: ViperMaul Date: Sun, 19 Apr 2015 14:51:51 -0700 Subject: [PATCH 045/104] Added support for building server.pbo Added new optionals_root to make.cfg Updated version Added global variables. #552 --- tools/make.cfg | 5 ++++ tools/make.py | 67 ++++++++++++++++++++++++++++++++++++++++++-------- 2 files changed, 62 insertions(+), 10 deletions(-) diff --git a/tools/make.cfg b/tools/make.cfg index 1eb02b826f0..e89568d60ee 100644 --- a/tools/make.cfg +++ b/tools/make.cfg @@ -39,6 +39,11 @@ prefix = z\ace\addons # Default: \\addons module_root = P:\z\ace\addons +# Set the location where the optional addon source folders (i.e. P:\z\ace\optionals) +# Default: \\optionals +optionals_root = P:\z\ace\optionals + + # Directory where the built addon will be saved. # Default: release release_dir = P:\z\ace\release diff --git a/tools/make.py b/tools/make.py index ce5b770383d..ffa5f75e25b 100644 --- a/tools/make.py +++ b/tools/make.py @@ -30,7 +30,7 @@ ############################################################################### -__version__ = "0.3dev" +__version__ = "0.4" import sys @@ -54,6 +54,13 @@ if sys.platform == "win32": import winreg +######## GLOBALS ######### +work_drive = "" +module_root = "" +release_dir = "" +module_root_parent = "" +optionals_root = "" + ############################################################################### # http://akiscode.com/articles/sha-1directoryhash.shtml # Copyright (c) 2009 Stephen Akiki @@ -300,7 +307,7 @@ def copy_important_files(source_dir,destination_dir): #copy importantFiles try: - print_blue("Searching for important files in " + source_dir) + print_blue("\nSearching for important files in " + source_dir) for file in importantFiles: print_green("Copying file => " + os.path.join(source_dir,file)) shutil.copyfile(os.path.join(source_dir,file),os.path.join(destination_dir,file)) @@ -308,12 +315,10 @@ def copy_important_files(source_dir,destination_dir): print_error("COPYING IMPORTANT FILES.") raise - print("") - #copy all extension dlls try: os.chdir(os.path.join(source_dir)) - print_blue("Searching for DLLs in " + os.getcwd()) + print_blue("\nSearching for DLLs in " + os.getcwd()) filenames = glob.glob("*.dll") if not filenames: @@ -328,11 +333,42 @@ def copy_important_files(source_dir,destination_dir): raise finally: os.chdir(originalDir) + +def copy_optionals_for_building(mod): + src_directories = os.listdir(optionals_root) + print("") + try: + for dir_name in src_directories: + mod.append(dir_name) + if (dir_name == "userconfig"): + destination = os.path.join(work_drive,dir_name) + else: + destination = os.path.join(module_root,dir_name) + + print("Temporarily copying " + os.path.join(optionals_root,dir_name) + " => " + destination + " for building.") + shutil.rmtree(destination, True) + shutil.copytree(os.path.join(optionals_root,dir_name), destination) + except: + print_error("Copy Optionals Failed") + raise + +def cleanup_optionals(mod): + try: + for dir_name in mod: + if (dir_name == "userconfig"): + destination = os.path.join(work_drive,dir_name) + else: + destination = os.path.join(module_root,dir_name) + print("Cleaning " + destination) + shutil.rmtree(destination) + except: + print_error("Cleaning Optionals Failed") + raise ############################################################################### def main(argv): """Build an Arma addon suite in a directory from rules in a make.cfg file.""" - print_blue(("\nmake.py for Arma, v" + __version__)) + print_blue(("\nmake.py for Arma, modified for Advanced Combat Environment v" + __version__)) if sys.platform != "win32": print_error("Non-Windows platform (Cygwin?). Please re-run from cmd.") @@ -447,6 +483,12 @@ def main(argv): cfg = configparser.ConfigParser(); try: + global work_drive + global module_root + global release_dir + global module_root_parent + global optionals_root + cfg.read(os.path.join(make_root, "make.cfg")) # Project name (with @ symbol) @@ -487,7 +529,7 @@ def main(argv): # Project module Root module_root_parent = os.path.abspath(os.path.join(os.path.join(work_drive, prefix), os.pardir)) module_root = cfg.get(make_target, "module_root", fallback=os.path.join(make_root_parent, "addons")) - ace_optionals_root = os.path.join(module_root_parent, "optionals") + optionals_root = os.path.join(module_root_parent, "optionals") print_green ("module_root: " + module_root) if (os.path.isdir(module_root)): @@ -496,10 +538,10 @@ def main(argv): print_error ("Directory " + module_root + " does not exist.") sys.exit() - if (os.path.isdir(ace_optionals_root)): - print_green ("ace_optionals_root: " + ace_optionals_root) + if (os.path.isdir(optionals_root)): + print_green ("optionals_root: " + optionals_root) else: - print_error ("Directory " + ace_optionals_root + " does not exist.") + print_error ("Directory " + optionals_root + " does not exist.") sys.exit() print_green ("release_dir: " + release_dir) @@ -552,6 +594,10 @@ def main(argv): print ("No cache found.") cache = {} + #Temporarily copy optionals_root for building. They will be removed later. + optionals_modules = [] + copy_optionals_for_building(optionals_modules) + # Get list of subdirs in make root. dirs = next(os.walk(module_root))[1] @@ -910,6 +956,7 @@ def main(argv): except: print_error("Could not copy files. Is Arma 3 running?") + cleanup_optionals(optionals_modules) if __name__ == "__main__": main(sys.argv) input("Press Enter to continue...") From 9c11e47ef45ca29ffa3ef096120ebb8f87492491 Mon Sep 17 00:00:00 2001 From: ViperMaul Date: Sun, 19 Apr 2015 15:28:54 -0700 Subject: [PATCH 046/104] Missing changes that Git Extensions client left out #552 --- tools/make.py | 53 ++++++++++++++++++++++++++++++++++++++++++++------- 1 file changed, 46 insertions(+), 7 deletions(-) diff --git a/tools/make.py b/tools/make.py index ffa5f75e25b..f036bd0c83a 100644 --- a/tools/make.py +++ b/tools/make.py @@ -334,8 +334,30 @@ def copy_important_files(source_dir,destination_dir): finally: os.chdir(originalDir) -def copy_optionals_for_building(mod): +def copy_optionals_for_building(mod,pbos): src_directories = os.listdir(optionals_root) + current_dir = os.getcwd() + + print("") + try: + + #special server.pbo processing + files = glob.glob(os.path.join(release_dir, "@ace","optionals","*.pbo")) + for file in files: + file_name = os.path.basename(file) + print ("Adding the following file: " + file_name) + pbos.append(file_name) + pbo_path = os.path.join(release_dir, "@ace","optionals",file_name) + if (os.path.isfile(pbo_path)): + print("Moving " + pbo_path + " for processing.") + shutil.move(pbo_path, os.path.join(release_dir,"@ace","addons",file_name)) + + except: + print_error("Error in moving") + raise + finally: + os.chdir(current_dir) + print("") try: for dir_name in src_directories: @@ -344,23 +366,39 @@ def copy_optionals_for_building(mod): destination = os.path.join(work_drive,dir_name) else: destination = os.path.join(module_root,dir_name) - + print("Temporarily copying " + os.path.join(optionals_root,dir_name) + " => " + destination + " for building.") shutil.rmtree(destination, True) shutil.copytree(os.path.join(optionals_root,dir_name), destination) except: print_error("Copy Optionals Failed") raise + finally: + os.chdir(current_dir) -def cleanup_optionals(mod): - try: +def cleanup_optionals(mod,pbos): + print("") + try: for dir_name in mod: if (dir_name == "userconfig"): destination = os.path.join(work_drive,dir_name) else: destination = os.path.join(module_root,dir_name) + print("Cleaning " + destination) + + try: + file_name = "ace_{}.pbo".format(dir_name) + src_file_path = os.path.join(release_dir, "@ace","addons",file_name) + dst_file_path = os.path.join(release_dir, "@ace","optionals",file_name) + if (os.path.isfile(src_file_path)): + #print("Preserving " + file_name) + os.renames(src_file_path,dst_file_path) + except FileExistsError: + print_error(file_name + " already exists") + continue shutil.rmtree(destination) + except: print_error("Cleaning Optionals Failed") raise @@ -596,7 +634,8 @@ def main(argv): #Temporarily copy optionals_root for building. They will be removed later. optionals_modules = [] - copy_optionals_for_building(optionals_modules) + optional_files = [] + copy_optionals_for_building(optionals_modules,optional_files) # Get list of subdirs in make root. dirs = next(os.walk(module_root))[1] @@ -955,8 +994,8 @@ def main(argv): shutil.copytree(os.path.join(module_root, release_dir, project), os.path.join(a3_path, project)) except: print_error("Could not copy files. Is Arma 3 running?") - - cleanup_optionals(optionals_modules) + + cleanup_optionals(optionals_modules,optional_files) if __name__ == "__main__": main(sys.argv) input("Press Enter to continue...") From 5793175c1fe75cec868816c1b93c8d4fcbf0b8eb Mon Sep 17 00:00:00 2001 From: ViperMaul Date: Sun, 19 Apr 2015 16:00:34 -0700 Subject: [PATCH 047/104] Fixing issue when release directory is missing #552 --- tools/make.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/tools/make.py b/tools/make.py index f036bd0c83a..5146a666bba 100644 --- a/tools/make.py +++ b/tools/make.py @@ -583,7 +583,6 @@ def main(argv): sys.exit() print_green ("release_dir: " + release_dir) - copy_important_files(module_root_parent,os.path.join(release_dir, "@ace")) except: raise @@ -635,7 +634,7 @@ def main(argv): #Temporarily copy optionals_root for building. They will be removed later. optionals_modules = [] optional_files = [] - copy_optionals_for_building(optionals_modules,optional_files) + copy_optionals_for_building(optionals_modules,optional_files) # Get list of subdirs in make root. dirs = next(os.walk(module_root))[1] @@ -994,7 +993,8 @@ def main(argv): shutil.copytree(os.path.join(module_root, release_dir, project), os.path.join(a3_path, project)) except: print_error("Could not copy files. Is Arma 3 running?") - + + copy_important_files(module_root_parent,os.path.join(release_dir, "@ace")) cleanup_optionals(optionals_modules,optional_files) if __name__ == "__main__": main(sys.argv) From 6c00aef6e89972c4d89954aa0f067f6b315f58d9 Mon Sep 17 00:00:00 2001 From: commy2 Date: Mon, 20 Apr 2015 16:02:36 +0200 Subject: [PATCH 048/104] coeficients for recoil configs --- addons/recoil/CfgRecoils.hpp | 255 ++++++++++++++++++----------------- 1 file changed, 135 insertions(+), 120 deletions(-) diff --git a/addons/recoil/CfgRecoils.hpp b/addons/recoil/CfgRecoils.hpp index 27283e71f1a..eac31babe8b 100644 --- a/addons/recoil/CfgRecoils.hpp +++ b/addons/recoil/CfgRecoils.hpp @@ -1,240 +1,255 @@ +#define KICKBACK 1 + +#define MUZZLETEMP 1 +#define MUZZLEPERM 1 + +#define MUZZLECLIMB_POS 1 +#define MUZZLERIGHT_POS 1 + +#define MUZZLECLIMB_MAG 1 +#define MUZZLERIGHT_MAG 1 + class CfgRecoils { class Default { - muzzleOuter[] = {0,"0.4f","0.5f","0.6f"}; - muzzleInner[] = {0,"0.05f","0.2f","0.2f"}; - kickBack[] = {"0.05f",0.1}; - permanent = 0.1; - temporary = 0.01; + // doc: http://forums.bistudio.com/showthread.php?188999-Recoil-Overhaul-Feedback&s=dba8590ec07adb5ffa87f72d38dde6fc&p=2886744&viewfull=1#post2886744 + // {horizontal axis position, vertical axis position, horizontal magnitude, vertical magnitude} + muzzleOuter[] = {0*MUZZLERIGHT_POS,0.4*MUZZLECLIMB_POS,0.5*MUZZLERIGHT_MAG,0.6*MUZZLECLIMB_MAG}; + // restricted area inside the outer ellipse where the recoil cannot end + muzzleInner[] = {0,0.05,0.2,0.2}; + // minimum and maximum interval for backward force + kickBack[] = {0.05*KICKBACK,0.1*KICKBACK}; + permanent = 0.1*MUZZLEPERM; + temporary = 0.01*MUZZLETEMP; }; class recoil_default: Default { - muzzleOuter[] = {0.3,1,0.3,0.2}; + muzzleOuter[] = {0.3*MUZZLERIGHT_POS,1*MUZZLECLIMB_POS,0.3*MUZZLERIGHT_MAG,0.2*MUZZLECLIMB_MAG}; muzzleInner[] = {0,0,0.1,0.1}; - kickBack[] = {0.03,0.06}; - permanent = 0.1; - temporary = 0.01; + kickBack[] = {0.03*KICKBACK,0.06*KICKBACK}; + permanent = 0.1*MUZZLEPERM; + temporary = 0.01*MUZZLETEMP; }; class recoil_mk20: recoil_default { - muzzleOuter[] = {0.2,0.6,0.2,0.2}; - kickBack[] = {0.01,0.03}; - temporary = 0.01; + muzzleOuter[] = {0.2*MUZZLERIGHT_POS,0.6*MUZZLECLIMB_POS,0.2*MUZZLERIGHT_MAG,0.2*MUZZLECLIMB_MAG}; + kickBack[] = {0.01*KICKBACK,0.03*KICKBACK}; + temporary = 0.01*MUZZLETEMP; }; class recoil_mk20c: recoil_default { - muzzleOuter[] = {0.2,0.8,0.3,0.2}; - kickBack[] = {0.02,0.04}; - temporary = 0.015; + muzzleOuter[] = {0.2*MUZZLERIGHT_POS,0.8*MUZZLECLIMB_POS,0.3*MUZZLERIGHT_MAG,0.2*MUZZLECLIMB_MAG}; + kickBack[] = {0.02*KICKBACK,0.04*KICKBACK}; + temporary = 0.015*MUZZLETEMP; }; class recoil_trg20: recoil_default { - muzzleOuter[] = {0.2,1,0.3,0.3}; - kickBack[] = {0.02,0.04}; - temporary = 0.015; + muzzleOuter[] = {0.2*MUZZLERIGHT_POS,1*MUZZLECLIMB_POS,0.3*MUZZLERIGHT_MAG,0.3*MUZZLECLIMB_MAG}; + kickBack[] = {0.02*KICKBACK,0.04*KICKBACK}; + temporary = 0.015*MUZZLETEMP; }; class recoil_trg21: recoil_default { - muzzleOuter[] = {0.2,0.8,0.3,0.2}; - kickBack[] = {0.01,0.03}; - temporary = 0.01; + muzzleOuter[] = {0.2*MUZZLERIGHT_POS,0.8*MUZZLECLIMB_POS,0.3*MUZZLERIGHT_MAG,0.2*MUZZLECLIMB_MAG}; + kickBack[] = {0.01*KICKBACK,0.03*KICKBACK}; + temporary = 0.01*MUZZLETEMP; }; class recoil_mx: recoil_default { - muzzleOuter[] = {0.3,1,0.4,0.3}; - kickBack[] = {0.02,0.04}; - temporary = 0.01; + muzzleOuter[] = {0.3*MUZZLERIGHT_POS,1*MUZZLECLIMB_POS,0.4*MUZZLERIGHT_MAG,0.3*MUZZLECLIMB_MAG}; + kickBack[] = {0.02*KICKBACK,0.04*KICKBACK}; + temporary = 0.01*MUZZLETEMP; }; class recoil_mxc: recoil_default { - muzzleOuter[] = {0.3,1.2,0.4,0.3}; - kickBack[] = {0.03,0.06}; - temporary = 0.015; + muzzleOuter[] = {0.3*MUZZLERIGHT_POS,1.2*MUZZLECLIMB_POS,0.4*MUZZLERIGHT_MAG,0.3*MUZZLECLIMB_MAG}; + kickBack[] = {0.03*KICKBACK,0.06*KICKBACK}; + temporary = 0.015*MUZZLETEMP; }; class recoil_sw: recoil_default { - muzzleOuter[] = {0.3,0.8,0.5,0.2}; - kickBack[] = {0.02,0.04}; - temporary = 0.005; + muzzleOuter[] = {0.3*MUZZLERIGHT_POS,0.8*MUZZLECLIMB_POS,0.5*MUZZLERIGHT_MAG,0.2*MUZZLECLIMB_MAG}; + kickBack[] = {0.02*KICKBACK,0.04*KICKBACK}; + temporary = 0.005*MUZZLETEMP; }; class recoil_mxm: recoil_default { - muzzleOuter[] = {0.3,0.8,0.4,0.3}; - kickBack[] = {0.02,0.04}; - temporary = 0.01; + muzzleOuter[] = {0.3*MUZZLERIGHT_POS,0.8*MUZZLECLIMB_POS,0.4*MUZZLERIGHT_MAG,0.3*MUZZLECLIMB_MAG}; + kickBack[] = {0.02*KICKBACK,0.04*KICKBACK}; + temporary = 0.01*MUZZLETEMP; }; class recoil_ktb: recoil_default { - muzzleOuter[] = {0.3,1,0.3,0.3}; - kickBack[] = {0.02,0.04}; - temporary = 0.01; + muzzleOuter[] = {0.3*MUZZLERIGHT_POS,1*MUZZLECLIMB_POS,0.3*MUZZLERIGHT_MAG,0.3*MUZZLECLIMB_MAG}; + kickBack[] = {0.02*KICKBACK,0.04*KICKBACK}; + temporary = 0.01*MUZZLETEMP; }; class recoil_ktbc: recoil_default { - muzzleOuter[] = {0.3,1.2,0.3,0.3}; - kickBack[] = {0.03,0.06}; - temporary = 0.015; + muzzleOuter[] = {0.3*MUZZLERIGHT_POS,1.2*MUZZLECLIMB_POS,0.3*MUZZLERIGHT_MAG,0.3*MUZZLECLIMB_MAG}; + kickBack[] = {0.03*KICKBACK,0.06*KICKBACK}; + temporary = 0.015*MUZZLETEMP; }; class recoil_smg_01: recoil_default { - muzzleOuter[] = {0.1,0.8,0.3,0.2}; - kickBack[] = {0.01,0.03}; - temporary = 0.015; + muzzleOuter[] = {0.1*MUZZLERIGHT_POS,0.8*MUZZLECLIMB_POS,0.3*MUZZLERIGHT_MAG,0.2*MUZZLECLIMB_MAG}; + kickBack[] = {0.01*KICKBACK,0.03*KICKBACK}; + temporary = 0.015*MUZZLETEMP; }; class recoil_smg_02: recoil_default { - muzzleOuter[] = {0.1,0.6,0.2,0.2}; - kickBack[] = {0.01,0.02}; - temporary = 0.01; + muzzleOuter[] = {0.1*MUZZLERIGHT_POS,0.6*MUZZLECLIMB_POS,0.2*MUZZLERIGHT_MAG,0.2*MUZZLECLIMB_MAG}; + kickBack[] = {0.01*KICKBACK,0.02*KICKBACK}; + temporary = 0.01*MUZZLETEMP; }; class recoil_pdw: recoil_default { - muzzleOuter[] = {0.2,1,0.3,0.3}; - kickBack[] = {0.02,0.04}; - temporary = 0.02; + muzzleOuter[] = {0.2*MUZZLERIGHT_POS,1*MUZZLECLIMB_POS,0.3*MUZZLERIGHT_MAG,0.3*MUZZLECLIMB_MAG}; + kickBack[] = {0.02*KICKBACK,0.04*KICKBACK}; + temporary = 0.02*MUZZLETEMP; }; class recoil_sdar: recoil_default { - muzzleOuter[] = {0.2,1,0.3,0.3}; - kickBack[] = {0.02,0.04}; - temporary = 0.01; + muzzleOuter[] = {0.2*MUZZLERIGHT_POS,1*MUZZLECLIMB_POS,0.3*MUZZLERIGHT_MAG,0.3*MUZZLECLIMB_MAG}; + kickBack[] = {0.02*KICKBACK,0.04*KICKBACK}; + temporary = 0.01*MUZZLETEMP; }; class recoil_pistol_p07: recoil_default { - muzzleOuter[] = {0.2,1,0.2,0.3}; - kickBack[] = {0.03,0.06}; - temporary = 0.03; + muzzleOuter[] = {0.2*MUZZLERIGHT_POS,1*MUZZLECLIMB_POS,0.2*MUZZLERIGHT_MAG,0.3*MUZZLECLIMB_MAG}; + kickBack[] = {0.03*KICKBACK,0.06*KICKBACK}; + temporary = 0.03*MUZZLETEMP; }; class recoil_pistol_rook40: recoil_default { - muzzleOuter[] = {0.2,1,0.2,0.3}; - kickBack[] = {0.03,0.06}; - temporary = 0.02; + muzzleOuter[] = {0.2*MUZZLERIGHT_POS,1*MUZZLECLIMB_POS,0.2*MUZZLERIGHT_MAG,0.3*MUZZLECLIMB_MAG}; + kickBack[] = {0.03*KICKBACK,0.06*KICKBACK}; + temporary = 0.02*MUZZLETEMP; }; class recoil_pistol_acpc2: recoil_default { - muzzleOuter[] = {0.2,1.5,0.2,0.3}; - kickBack[] = {0.04,0.08}; - temporary = 0.04; + muzzleOuter[] = {0.2*MUZZLERIGHT_POS,1.5*MUZZLECLIMB_POS,0.2*MUZZLERIGHT_MAG,0.3*MUZZLECLIMB_MAG}; + kickBack[] = {0.04*KICKBACK,0.08*KICKBACK}; + temporary = 0.04*MUZZLETEMP; }; class recoil_pistol_4five: recoil_default { - muzzleOuter[] = {0.2,1.5,0.2,0.3}; - kickBack[] = {0.04,0.08}; - temporary = 0.06; + muzzleOuter[] = {0.2*MUZZLERIGHT_POS,1.5*MUZZLECLIMB_POS,0.2*MUZZLERIGHT_MAG,0.3*MUZZLECLIMB_MAG}; + kickBack[] = {0.04*KICKBACK,0.08*KICKBACK}; + temporary = 0.06*MUZZLETEMP; }; class recoil_pistol_zubr: recoil_default { - muzzleOuter[] = {0.2,1.5,0.2,0.3}; - kickBack[] = {0.04,0.08}; - temporary = 0.08; + muzzleOuter[] = {0.2*MUZZLERIGHT_POS,1.5*MUZZLECLIMB_POS,0.2*MUZZLERIGHT_MAG,0.3*MUZZLECLIMB_MAG}; + kickBack[] = {0.04*KICKBACK,0.08*KICKBACK}; + temporary = 0.08*MUZZLETEMP; }; class recoil_pistol_signal: recoil_default { - muzzleOuter[] = {0.2,1.5,0.2,0.3}; - kickBack[] = {0.02,0.04}; - temporary = 0.02; + muzzleOuter[] = {0.2*MUZZLERIGHT_POS,1.5*MUZZLECLIMB_POS,0.2*MUZZLERIGHT_MAG,0.3*MUZZLECLIMB_MAG}; + kickBack[] = {0.02*KICKBACK,0.04*KICKBACK}; + temporary = 0.02*MUZZLETEMP; }; class recoil_rpg: recoil_default { - muzzleOuter[] = {2,3,1,0.5}; - kickBack[] = {0.08,0.1}; - temporary = 0.1; + muzzleOuter[] = {2*MUZZLERIGHT_POS,3*MUZZLECLIMB_POS,1*MUZZLERIGHT_MAG,0.5*MUZZLECLIMB_MAG}; + kickBack[] = {0.08*KICKBACK,0.1*KICKBACK}; + temporary = 0.1*MUZZLETEMP; }; class recoil_nlaw: recoil_default { - muzzleOuter[] = {2,3,1,0.5}; - kickBack[] = {0.06,0.08}; - temporary = 0.08; + muzzleOuter[] = {2*MUZZLERIGHT_POS,3*MUZZLECLIMB_POS,1*MUZZLERIGHT_MAG,0.5*MUZZLECLIMB_MAG}; + kickBack[] = {0.06*KICKBACK,0.08*KICKBACK}; + temporary = 0.08*MUZZLETEMP; }; class recoil_titan_long: recoil_default { - muzzleOuter[] = {2,3,1,0.5}; - kickBack[] = {0.1,0.12}; - temporary = 0.15; + muzzleOuter[] = {2*MUZZLERIGHT_POS,3*MUZZLECLIMB_POS,1*MUZZLERIGHT_MAG,0.5*MUZZLECLIMB_MAG}; + kickBack[] = {0.1*KICKBACK,0.12*KICKBACK}; + temporary = 0.15*MUZZLETEMP; }; class recoil_titan_short: recoil_default { - muzzleOuter[] = {2,3,1,0.5}; - kickBack[] = {0.1,0.12}; - temporary = 0.12; + muzzleOuter[] = {2*MUZZLERIGHT_POS,3*MUZZLECLIMB_POS,1*MUZZLERIGHT_MAG,0.5*MUZZLECLIMB_MAG}; + kickBack[] = {0.1*KICKBACK,0.12*KICKBACK}; + temporary = 0.12*MUZZLETEMP; }; class recoil_mk200: recoil_default { - muzzleOuter[] = {0.4,0.6,0.6,0.2}; - kickBack[] = {0.03,0.06}; - temporary = 0.005; + muzzleOuter[] = {0.4*MUZZLERIGHT_POS,0.6*MUZZLECLIMB_POS,0.6*MUZZLERIGHT_MAG,0.2*MUZZLECLIMB_MAG}; + kickBack[] = {0.03*KICKBACK,0.06*KICKBACK}; + temporary = 0.005*MUZZLETEMP; }; class recoil_zafir: recoil_default { - muzzleOuter[] = {0.5,1,0.7,0.3}; - kickBack[] = {0.02,0.08}; - temporary = 0.005; + muzzleOuter[] = {0.5*MUZZLERIGHT_POS,1*MUZZLECLIMB_POS,0.7*MUZZLERIGHT_MAG,0.3*MUZZLECLIMB_MAG}; + kickBack[] = {0.02*KICKBACK,0.08*KICKBACK}; + temporary = 0.005*MUZZLETEMP; }; class recoil_m320: recoil_default { - muzzleOuter[] = {1,3,0.5,0.6}; - kickBack[] = {0.08,0.1}; - temporary = 0.02; + muzzleOuter[] = {1*MUZZLERIGHT_POS,3*MUZZLECLIMB_POS,0.5*MUZZLERIGHT_MAG,0.6*MUZZLECLIMB_MAG}; + kickBack[] = {0.08*KICKBACK,0.1*KICKBACK}; + temporary = 0.02*MUZZLETEMP; }; class recoil_gm6: recoil_default { - muzzleOuter[] = {1.4,3.5,0.7,0.8}; - kickBack[] = {0.1,0.12}; - temporary = 0.025; + muzzleOuter[] = {1.4*MUZZLERIGHT_POS,3.5*MUZZLECLIMB_POS,0.7*MUZZLERIGHT_MAG,0.8*MUZZLECLIMB_MAG}; + kickBack[] = {0.1*KICKBACK,0.12*KICKBACK}; + temporary = 0.025*MUZZLETEMP; }; class recoil_ebr: recoil_default { - muzzleOuter[] = {0.4,1.5,0.6,0.4}; - kickBack[] = {0.04,0.07}; - temporary = 0.01; + muzzleOuter[] = {0.4*MUZZLERIGHT_POS,1.5*MUZZLECLIMB_POS,0.6*MUZZLERIGHT_MAG,0.4*MUZZLECLIMB_MAG}; + kickBack[] = {0.04*KICKBACK,0.07*KICKBACK}; + temporary = 0.01*MUZZLETEMP; }; class recoil_dmr_01: recoil_default { - muzzleOuter[] = {0.5,2,0.5,0.5}; - kickBack[] = {0.03,0.08}; - temporary = 0.015; + muzzleOuter[] = {0.5*MUZZLERIGHT_POS,2*MUZZLECLIMB_POS,0.5*MUZZLERIGHT_MAG,0.5*MUZZLECLIMB_MAG}; + kickBack[] = {0.03*KICKBACK,0.08*KICKBACK}; + temporary = 0.015*MUZZLETEMP; }; class recoil_dmr_02: recoil_default { - muzzleOuter[] = {0.5,2.5,0.6,0.5}; - kickBack[] = {0.06,0.08}; - temporary = 0.01; + muzzleOuter[] = {0.5*MUZZLERIGHT_POS,2.5*MUZZLECLIMB_POS,0.6*MUZZLERIGHT_MAG,0.5*MUZZLECLIMB_MAG}; + kickBack[] = {0.06*KICKBACK,0.08*KICKBACK}; + temporary = 0.01*MUZZLETEMP; }; class recoil_dmr_03: recoil_default { - muzzleOuter[] = {0.3,1.5,0.5,0.4}; - kickBack[] = {0.03,0.06}; - temporary = 0.005; + muzzleOuter[] = {0.3*MUZZLERIGHT_POS,1.5*MUZZLECLIMB_POS,0.5*MUZZLERIGHT_MAG,0.4*MUZZLECLIMB_MAG}; + kickBack[] = {0.03*KICKBACK,0.06*KICKBACK}; + temporary = 0.005*MUZZLETEMP; }; class recoil_dmr_04: recoil_default { - muzzleOuter[] = {0.4,1.5,0.5,0.4}; - kickBack[] = {0.02,0.04}; - temporary = 0.015; + muzzleOuter[] = {0.4*MUZZLERIGHT_POS,1.5*MUZZLECLIMB_POS,0.5*MUZZLERIGHT_MAG,0.4*MUZZLECLIMB_MAG}; + kickBack[] = {0.02*KICKBACK,0.04*KICKBACK}; + temporary = 0.015*MUZZLETEMP; }; class recoil_dmr_05: recoil_default { - muzzleOuter[] = {0.5,2.5,0.8,0.6}; - kickBack[] = {0.08,0.1}; - temporary = 0.01; + muzzleOuter[] = {0.5*MUZZLERIGHT_POS,2.5*MUZZLECLIMB_POS,0.8*MUZZLERIGHT_MAG,0.6*MUZZLECLIMB_MAG}; + kickBack[] = {0.08*KICKBACK,0.1*KICKBACK}; + temporary = 0.01*MUZZLETEMP; }; class recoil_dmr_06: recoil_default { - muzzleOuter[] = {0.5,2,0.7,0.5}; - kickBack[] = {0.05,0.1}; - temporary = 0.01; + muzzleOuter[] = {0.5*MUZZLERIGHT_POS,2*MUZZLECLIMB_POS,0.7*MUZZLERIGHT_MAG,0.5*MUZZLECLIMB_MAG}; + kickBack[] = {0.05*KICKBACK,0.1*KICKBACK}; + temporary = 0.01*MUZZLETEMP; }; class recoil_mmg_01: recoil_default { - muzzleOuter[] = {0.6,1.5,0.8,0.3}; - kickBack[] = {0.02,0.08}; - temporary = 0.005; + muzzleOuter[] = {0.6*MUZZLERIGHT_POS,1.5*MUZZLECLIMB_POS,0.8*MUZZLERIGHT_MAG,0.3*MUZZLECLIMB_MAG}; + kickBack[] = {0.02*KICKBACK,0.08*KICKBACK}; + temporary = 0.005*MUZZLETEMP; }; class recoil_mmg_02: recoil_default { - muzzleOuter[] = {0.5,1.5,0.6,0.4}; - kickBack[] = {0.04,0.08}; - temporary = 0.005; + muzzleOuter[] = {0.5*MUZZLERIGHT_POS,1.5*MUZZLECLIMB_POS,0.6*MUZZLERIGHT_MAG,0.4*MUZZLECLIMB_MAG}; + kickBack[] = {0.04*KICKBACK,0.08*KICKBACK}; + temporary = 0.005*MUZZLETEMP; }; }; From 16c6a3ee78670aff369eed85ab769c93bba3966a Mon Sep 17 00:00:00 2001 From: commy2 Date: Mon, 20 Apr 2015 17:38:45 +0200 Subject: [PATCH 049/104] tweaking recoil --- addons/recoil/CfgRecoils.hpp | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/addons/recoil/CfgRecoils.hpp b/addons/recoil/CfgRecoils.hpp index eac31babe8b..56a28f1dc1c 100644 --- a/addons/recoil/CfgRecoils.hpp +++ b/addons/recoil/CfgRecoils.hpp @@ -1,11 +1,11 @@ -#define KICKBACK 1 +#define KICKBACK 1.6 #define MUZZLETEMP 1 -#define MUZZLEPERM 1 +#define MUZZLEPERM 0.1 #define MUZZLECLIMB_POS 1 -#define MUZZLERIGHT_POS 1 +#define MUZZLERIGHT_POS 0.4 #define MUZZLECLIMB_MAG 1 #define MUZZLERIGHT_MAG 1 From ea368511b7ed013dcd72dbefa8791c404de4f341 Mon Sep 17 00:00:00 2001 From: commy2 Date: Mon, 20 Apr 2015 18:48:58 +0200 Subject: [PATCH 050/104] ace extensions class for modularity --- addons/advanced_ballistics/config.cpp | 6 +++++- addons/common/XEH_postInit.sqf | 2 +- addons/common/config.cpp | 4 ++++ addons/common/script_component.hpp | 4 +--- addons/fcs/config.cpp | 4 ++++ addons/interact_menu/config.cpp | 4 ++++ 6 files changed, 19 insertions(+), 5 deletions(-) diff --git a/addons/advanced_ballistics/config.cpp b/addons/advanced_ballistics/config.cpp index 32f1406a07b..1a2187783bb 100644 --- a/addons/advanced_ballistics/config.cpp +++ b/addons/advanced_ballistics/config.cpp @@ -15,4 +15,8 @@ class CfgPatches { #include "CfgEventHandlers.hpp" #include "CfgVehicles.hpp" #include "RscTitles.hpp" -#include "ACE_Settings.hpp" \ No newline at end of file +#include "ACE_Settings.hpp" + +class ACE_Extensions { + extensions[] += {"ace_advanced_ballistics"}; +}; diff --git a/addons/common/XEH_postInit.sqf b/addons/common/XEH_postInit.sqf index 55a7cfde408..3a16ac9d431 100644 --- a/addons/common/XEH_postInit.sqf +++ b/addons/common/XEH_postInit.sqf @@ -257,4 +257,4 @@ if(isMultiplayer && { time > 0 || isNull player } ) then { diag_log text format ["[ACE] ERROR: %1", _errorMsg]; ["[ACE] ERROR", _errorMsg, {findDisplay 46 closeDisplay 0}] call FUNC(errorMessage); }; -} forEach ACE_DLLS; +} forEach getArray (configFile >> "ACE_Extensions" >> "extensions"); diff --git a/addons/common/config.cpp b/addons/common/config.cpp index 21d6a6facb2..16bd13fc0c5 100644 --- a/addons/common/config.cpp +++ b/addons/common/config.cpp @@ -160,3 +160,7 @@ class RscDisplayMain: RscStandardDisplay { onLoad = QUOTE([ARR_4(""onLoad"",_this,""RscDisplayMain"",'GUI')] call (uinamespace getvariable 'BIS_fnc_initDisplay'); [ARR_5('header','tail',{0},{},_this select 0)] call COMPILE_FILE(functions\fnc_errorMessage)); }; */ + +class ACE_Extensions { + extensions[] = {}; +}; diff --git a/addons/common/script_component.hpp b/addons/common/script_component.hpp index 398080f7ecc..7c266c169d4 100644 --- a/addons/common/script_component.hpp +++ b/addons/common/script_component.hpp @@ -11,6 +11,4 @@ #define DEBUG_SETTINGS DEBUG_SETTINGS_COMMON #endif -#include "\z\ace\addons\main\script_macros.hpp" - -#define ACE_DLLS ["ace_breakLine","ace_advanced_ballistics","ace_fcs"] +#include "\z\ace\addons\main\script_macros.hpp" \ No newline at end of file diff --git a/addons/fcs/config.cpp b/addons/fcs/config.cpp index 711cbbbd251..12edf02ba3d 100644 --- a/addons/fcs/config.cpp +++ b/addons/fcs/config.cpp @@ -20,3 +20,7 @@ class CfgPatches { #include "CfgWeapons.hpp" #include "CfgOptics.hpp" + +class ACE_Extensions { + extensions[] += {"ace_fcs"}; +}; diff --git a/addons/interact_menu/config.cpp b/addons/interact_menu/config.cpp index f87062bf6f4..26579ba05bb 100644 --- a/addons/interact_menu/config.cpp +++ b/addons/interact_menu/config.cpp @@ -30,3 +30,7 @@ class ACE_Settings { displayName = "$STR_ACE_Interact_Menu_UseListMenu"; }; }; + +class ACE_Extensions { + extensions[] += {"ace_breakLine"}; +}; From 9295393dd6d5c443b7ac4c3edf9f2756f86dc521 Mon Sep 17 00:00:00 2001 From: esteldunedain Date: Mon, 20 Apr 2015 13:54:20 -0300 Subject: [PATCH 051/104] Allow cursor for interactions --- addons/interact_menu/config.cpp | 6 ++++++ addons/interact_menu/functions/fnc_keyDown.sqf | 4 +++- addons/interact_menu/stringtable.xml | 6 ++++++ 3 files changed, 15 insertions(+), 1 deletion(-) diff --git a/addons/interact_menu/config.cpp b/addons/interact_menu/config.cpp index f87062bf6f4..139ff2db973 100644 --- a/addons/interact_menu/config.cpp +++ b/addons/interact_menu/config.cpp @@ -23,6 +23,12 @@ class ACE_Settings { isClientSettable = 1; displayName = "$STR_ACE_Interact_Menu_AlwaysUseCursorSelfInteraction"; }; + class GVAR(AlwaysUseCursorInteraction) { + value = 0; + typeName = "BOOL"; + isClientSettable = 1; + displayName = "$STR_ACE_Interact_Menu_AlwaysUseCursorInteraction"; + }; class GVAR(UseListMenu) { value = 0; typeName = "BOOL"; diff --git a/addons/interact_menu/functions/fnc_keyDown.sqf b/addons/interact_menu/functions/fnc_keyDown.sqf index 123c1d45e2b..1bd4d044747 100644 --- a/addons/interact_menu/functions/fnc_keyDown.sqf +++ b/addons/interact_menu/functions/fnc_keyDown.sqf @@ -33,7 +33,9 @@ GVAR(lastTimeSearchedActions) = -1000; GVAR(useCursorMenu) = (vehicle ACE_player != ACE_player) || visibleMap || - {(_menuType == 1) && {(isWeaponDeployed ACE_player) || GVAR(AlwaysUseCursorSelfInteraction) || {cameraView == "GUNNER"}}}; + {(_menuType == 1) && {(isWeaponDeployed ACE_player) || GVAR(AlwaysUseCursorSelfInteraction) || {cameraView == "GUNNER"}}} || + {(_menuType == 0) && GVAR(AlwaysUseCursorInteraction)}; + if (GVAR(useCursorMenu)) then { createDialog QGVAR(cursorMenu); // The dialog sets: diff --git a/addons/interact_menu/stringtable.xml b/addons/interact_menu/stringtable.xml index 083a02d0f64..0b37f40f5ef 100644 --- a/addons/interact_menu/stringtable.xml +++ b/addons/interact_menu/stringtable.xml @@ -12,6 +12,12 @@ Mindig legyen a saját cselekvés kurzorja látható Mostra sempre il cursore per le auto interazioni + + Always display cursor for interaction + Mostrar siempre el cursor para la interacción + Toujours afficher le curseur pour les interactions + Mostra sempre il cursore per le interazioni + Display interaction menus as lists Mostrar los menus de interacción como listas From a1afd873427bc924966e640bf6f2f3e4ab02f598 Mon Sep 17 00:00:00 2001 From: OnkelDisMaster Date: Mon, 20 Apr 2015 19:56:10 +0200 Subject: [PATCH 052/104] Update config.cpp --- optionals/asdg_comp/config.cpp | 54 +++++++++++++++------------------- 1 file changed, 24 insertions(+), 30 deletions(-) diff --git a/optionals/asdg_comp/config.cpp b/optionals/asdg_comp/config.cpp index 18ef70cb1c3..b485685c554 100644 --- a/optionals/asdg_comp/config.cpp +++ b/optionals/asdg_comp/config.cpp @@ -1,42 +1,36 @@ #include "script_component.hpp" -class CfgPatches -{ - class ADDON - { - units[] = {}; - weapons[] = {}; - requiredVersion = REQUIRED_VERSION; - requiredAddons[] = {"asdg_jointrails","ace_laserpointer","ace_optics"}; - author[]={"OnkelDisMaster"}; - authorUrl = "http://2.xn--gebirgsjgerkompanie-nwb.de/"; - VERSION_CONFIG; +class CfgPatches { + class ADDON { + units[] = {}; + weapons[] = {}; + requiredVersion = REQUIRED_VERSION; + requiredAddons[] = {"asdg_jointrails","ace_laserpointer","ace_optics"}; + author[]={"OnkelDisMaster"}; + authorUrl = "http://2.xn--gebirgsjgerkompanie-nwb.de/"; + VERSION_CONFIG; }; }; class asdg_SlotInfo; -class asdg_FrontSideRail: asdg_SlotInfo -{ - class compatibleItems - { - ACE_acc_pointer_red = 1; - ACE_acc_pointer_green = 1; +class asdg_FrontSideRail: asdg_SlotInfo { + class compatibleItems { + ACE_acc_pointer_red = 1; + ACE_acc_pointer_green = 1; }; }; class asdg_OpticRail; -class asdg_OpticRail1913: asdg_OpticRail -{ - class compatibleItems - { - ACE_optic_Hamr_2D = 1; - ACE_optic_Hamr_PIP = 1; - ACE_optic_Arco_2D = 1; - ACE_optic_Arco_PIP = 1; - ACE_optic_MRCO_2D = 1; - ACE_optic_SOS_2D = 1; - ACE_optic_SOS_PIP = 1; - ACE_optic_LRPS_2D = 1; - ACE_optic_LRPS_PIP = 1; +class asdg_OpticRail1913: asdg_OpticRail { + class compatibleItems { + ACE_optic_Hamr_2D = 1; + ACE_optic_Hamr_PIP = 1; + ACE_optic_Arco_2D = 1; + ACE_optic_Arco_PIP = 1; + ACE_optic_MRCO_2D = 1; + ACE_optic_SOS_2D = 1; + ACE_optic_SOS_PIP = 1; + ACE_optic_LRPS_2D = 1; + ACE_optic_LRPS_PIP = 1; }; }; From 51abafd09938ef6bc99bbe9235b021f335e9ad7d Mon Sep 17 00:00:00 2001 From: OnkelDisMaster Date: Mon, 20 Apr 2015 20:28:34 +0200 Subject: [PATCH 053/104] Added my name to AUTHORS.txt Added myself to the contirbutors, after #485 --- AUTHORS.txt | 1 + 1 file changed, 1 insertion(+) diff --git a/AUTHORS.txt b/AUTHORS.txt index 2f16aea49c5..05049978e6b 100644 --- a/AUTHORS.txt +++ b/AUTHORS.txt @@ -82,3 +82,4 @@ BlackPixxel Asgar Serran Kavinsky Coren +OnkelDisMaster From ae3c8e3d88e073cdb02bf1db771a7703d57844e1 Mon Sep 17 00:00:00 2001 From: commy2 Date: Mon, 20 Apr 2015 21:10:56 +0200 Subject: [PATCH 054/104] weapon select keys are optional --- addons/weaponselect/XEH_postInit.sqf | 48 ++++++++++++++-------------- 1 file changed, 24 insertions(+), 24 deletions(-) diff --git a/addons/weaponselect/XEH_postInit.sqf b/addons/weaponselect/XEH_postInit.sqf index ae6cfafb9d0..93813b4ed03 100644 --- a/addons/weaponselect/XEH_postInit.sqf +++ b/addons/weaponselect/XEH_postInit.sqf @@ -4,7 +4,7 @@ if !(hasInterface) exitWith {}; // Add keybinds -/*["ACE3", QGVAR(SelectPistol), localize "STR_ACE_WeaponSelect_SelectPistol", +["ACE3", QGVAR(SelectPistolNew), localize "STR_ACE_WeaponSelect_SelectPistol", { // Conditions: canInteract if !([ACE_player, ACE_player, ["isNotEscorting"]] call EFUNC(common,canInteractWith)) exitWith {false}; @@ -13,12 +13,12 @@ if !(hasInterface) exitWith {}; // Statement [ACE_player, handgunWeapon ACE_player] call FUNC(selectWeaponMode); - true + false }, {false}, -[2, [false, false, false]], false] call cba_fnc_addKeybind; //1 Key +[0, [false, false, false]], false] call cba_fnc_addKeybind; //1 Key -["ACE3", QGVAR(SelectRifle), localize "STR_ACE_WeaponSelect_SelectRifle", +["ACE3", QGVAR(SelectRifleNew), localize "STR_ACE_WeaponSelect_SelectRifle", { // Conditions: canInteract if !([ACE_player, ACE_player, ["isNotEscorting"]] call EFUNC(common,canInteractWith)) exitWith {false}; @@ -27,12 +27,12 @@ if !(hasInterface) exitWith {}; // Statement [ACE_player, primaryWeapon ACE_player] call FUNC(selectWeaponMode); - true + false }, {false}, -[3, [false, false, false]], false] call cba_fnc_addKeybind; //2 Key +[0, [false, false, false]], false] call cba_fnc_addKeybind; //2 Key -["ACE3", QGVAR(SelectRifleMuzzle), localize "STR_ACE_WeaponSelect_SelectRifleMuzzle", +["ACE3", QGVAR(SelectRifleMuzzleNew), localize "STR_ACE_WeaponSelect_SelectRifleMuzzle", { // Conditions: canInteract if !([ACE_player, ACE_player, ["isNotEscorting"]] call EFUNC(common,canInteractWith)) exitWith {false}; @@ -41,12 +41,12 @@ if !(hasInterface) exitWith {}; // Statement [ACE_player, primaryWeapon ACE_player] call FUNC(selectWeaponMuzzle); - true + false }, {false}, -[4, [false, false, false]], false] call cba_fnc_addKeybind; //3 Key +[0, [false, false, false]], false] call cba_fnc_addKeybind; //3 Key -["ACE3", QGVAR(SelectLauncher), localize "STR_ACE_WeaponSelect_SelectLauncher", +["ACE3", QGVAR(SelectLauncherNew), localize "STR_ACE_WeaponSelect_SelectLauncher", { // Conditions: canInteract if !([ACE_player, ACE_player, ["isNotEscorting"]] call EFUNC(common,canInteractWith)) exitWith {false}; @@ -55,12 +55,12 @@ if !(hasInterface) exitWith {}; // Statement [ACE_player, secondaryWeapon ACE_player] call FUNC(selectWeaponMode); - true + false }, {false}, -[5, [false, false, false]], false] call cba_fnc_addKeybind; //4 Key +[0, [false, false, false]], false] call cba_fnc_addKeybind; //4 Key -["ACE3", QGVAR(SelectBinocular), localize "STR_ACE_WeaponSelect_SelectBinocular", +["ACE3", QGVAR(SelectBinocularNew), localize "STR_ACE_WeaponSelect_SelectBinocular", { // Conditions: canInteract if !([ACE_player, ACE_player, ["isNotEscorting"]] call EFUNC(common,canInteractWith)) exitWith {false}; @@ -69,10 +69,10 @@ if !(hasInterface) exitWith {}; // Statement [ACE_player, binocular ACE_player] call FUNC(selectWeaponMode); - true + false }, {false}, -[6, [false, false, false]], false] call cba_fnc_addKeybind; //5 Key*/ +[0, [false, false, false]], false] call cba_fnc_addKeybind; //5 Key ["ACE3", QGVAR(SelectGrenadeFrag), localize "STR_ACE_WeaponSelect_SelectGrenadeFrag", { @@ -144,7 +144,7 @@ if !(hasInterface) exitWith {}; {false}, [2, [false, false, false]], false] call cba_fnc_addKeybind; //1 Key -/*["ACE3", QGVAR(SelectMainGun), localize "STR_ACE_WeaponSelect_SelectMainGun", +["ACE3", QGVAR(SelectMainGunNew), localize "STR_ACE_WeaponSelect_SelectMainGun", { // Conditions: canInteract if !([ACE_player, ACE_player, []] call EFUNC(common,canInteractWith)) exitWith {false}; @@ -153,12 +153,12 @@ if !(hasInterface) exitWith {}; // Statement [ACE_player, vehicle ACE_player, 0] call FUNC(selectWeaponVehicle); - true + false }, {false}, -[4, [false, false, false]], false] call cba_fnc_addKeybind; //3 Key +[0, [false, false, false]], false] call cba_fnc_addKeybind; //3 Key -["ACE3", QGVAR(SelectMachineGun), localize "STR_ACE_WeaponSelect_SelectMachineGun", +["ACE3", QGVAR(SelectMachineGunNew), localize "STR_ACE_WeaponSelect_SelectMachineGun", { // Conditions: canInteract if !([ACE_player, ACE_player, []] call EFUNC(common,canInteractWith)) exitWith {false}; @@ -167,12 +167,12 @@ if !(hasInterface) exitWith {}; // Statement [ACE_player, vehicle ACE_player, 1] call FUNC(selectWeaponVehicle); - true + false }, {false}, -[5, [false, false, false]], false] call cba_fnc_addKeybind; //4 Key +[0, [false, false, false]], false] call cba_fnc_addKeybind; //4 Key -["ACE3", QGVAR(SelectMissiles), localize "STR_ACE_WeaponSelect_SelectMissiles", +["ACE3", QGVAR(SelectMissilesNew), localize "STR_ACE_WeaponSelect_SelectMissiles", { // Conditions: canInteract if !([ACE_player, ACE_player, []] call EFUNC(common,canInteractWith)) exitWith {false}; @@ -181,10 +181,10 @@ if !(hasInterface) exitWith {}; // Statement [ACE_player, vehicle ACE_player, 2] call FUNC(selectWeaponVehicle); - true + false }, {false}, -[6, [false, false, false]], false] call cba_fnc_addKeybind; //5 Key*/ +[0, [false, false, false]], false] call cba_fnc_addKeybind; //5 Key ["ACE3", QGVAR(FireSmokeLauncher), localize "STR_ACE_WeaponSelect_FireSmokeLauncher", { From 8be7ccaab7989b717b6559f87816d59c71428a0e Mon Sep 17 00:00:00 2001 From: Glowbal Date: Mon, 20 Apr 2015 21:37:30 +0200 Subject: [PATCH 055/104] setting for moving unit from group on unconscious --- addons/medical/ACE_Settings.hpp | 10 +++++++--- addons/medical/functions/fnc_setUnconscious.sqf | 4 +++- addons/medical/functions/fnc_unconsciousPFH.sqf | 8 ++++++-- 3 files changed, 16 insertions(+), 6 deletions(-) diff --git a/addons/medical/ACE_Settings.hpp b/addons/medical/ACE_Settings.hpp index 0270bee89bb..e7f60a14e86 100644 --- a/addons/medical/ACE_Settings.hpp +++ b/addons/medical/ACE_Settings.hpp @@ -79,16 +79,16 @@ class ACE_Settings { displayName = "$STR_ACE_Medical_litterSimulationDetail"; description = "$STR_ACE_Medical_litterSimulationDetail_Desc"; typeName = "SCALAR"; - + value = 3; values[] = {"Off", "Low", "Medium", "High", "Ultra"}; _values[] = { 0, 50, 100, 1000, 5000 }; - + isClientSettable = 1; }; class GVAR(litterCleanUpDelay) { typeName = "SCALAR"; - value = 0; + value = 0; }; class GVAR(medicSetting_PAK) { typeName = "SCALAR"; @@ -139,4 +139,8 @@ class ACE_Settings { typeName = "BOOL"; value = 0; }; + class GVAR(moveUnitsFromGroupOnUnconscious) { + typeName = "BOOL"; + value = 0; + }; }; diff --git a/addons/medical/functions/fnc_setUnconscious.sqf b/addons/medical/functions/fnc_setUnconscious.sqf index ef9ccb246d4..e527215c513 100644 --- a/addons/medical/functions/fnc_setUnconscious.sqf +++ b/addons/medical/functions/fnc_setUnconscious.sqf @@ -73,7 +73,9 @@ _unit setUnitPos "DOWN"; // So the AI does not get stuck, we are moving the unit to a temp group on its own. //Unconscious units shouldn't be put in another group #527: -// [_unit, true, "ACE_isUnconscious", side group _unit] call EFUNC(common,switchToGroupSide); +if (GVAR(moveUnitsFromGroupOnUnconscious)) then { + [_unit, true, "ACE_isUnconscious", side group _unit] call EFUNC(common,switchToGroupSide); +}; [_unit, QGVAR(unconscious), true] call EFUNC(common,setCaptivityStatus); [_unit, [_unit] call EFUNC(common,getDeathAnim), 1, true] call EFUNC(common,doAnimation); diff --git a/addons/medical/functions/fnc_unconsciousPFH.sqf b/addons/medical/functions/fnc_unconsciousPFH.sqf index 406d0278c1c..1d7558e5fcf 100644 --- a/addons/medical/functions/fnc_unconsciousPFH.sqf +++ b/addons/medical/functions/fnc_unconsciousPFH.sqf @@ -24,6 +24,9 @@ _hasMovedOut = _args select 5; _parachuteCheck = _args select 6; if (!alive _unit) exitwith { + if (GVAR(moveUnitsFromGroupOnUnconscious)) then { + [_unit, false, "ACE_isUnconscious", side group _unit] call EFUNC(common,switchToGroupSide); + }; [_unit, QGVAR(unconscious), false] call EFUNC(common,setCaptivityStatus); [_unit, false] call EFUNC(common,disableAI); //_unit setUnitPos _originalPos; @@ -60,8 +63,9 @@ if !(_unit getvariable ["ACE_isUnconscious",false]) exitwith { // Swhich the unit back to its original group //Unconscious units shouldn't be put in another group #527: - // [_unit, false, "ACE_isUnconscious", side group _unit] call EFUNC(common,switchToGroupSide); - + if (GVAR(moveUnitsFromGroupOnUnconscious)) then { + [_unit, false, "ACE_isUnconscious", side group _unit] call EFUNC(common,switchToGroupSide); + }; [_unit, false] call EFUNC(common,disableAI); _unit setUnitPos _originalPos; // This is not position but stance (DOWN, MIDDLE, UP) From 90cf882e026fd310000b9598963c15dcf23ab8d1 Mon Sep 17 00:00:00 2001 From: Glowbal Date: Mon, 20 Apr 2015 21:58:27 +0200 Subject: [PATCH 056/104] Using setvar instead of event sync again --- addons/medical/script_component.hpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/addons/medical/script_component.hpp b/addons/medical/script_component.hpp index bac6744bc17..939a811a41e 100644 --- a/addons/medical/script_component.hpp +++ b/addons/medical/script_component.hpp @@ -11,4 +11,4 @@ #include "\z\ace\addons\main\script_macros.hpp" -#define USE_WOUND_EVENT_SYNC true +#define USE_WOUND_EVENT_SYNC false From 842bfe0b98360874e1c78354f469045549b19789 Mon Sep 17 00:00:00 2001 From: Glowbal Date: Mon, 20 Apr 2015 22:00:11 +0200 Subject: [PATCH 057/104] enabled advanced wounds setting --- .../medical/functions/fnc_treatmentAdvanced_bandageLocal.sqf | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/addons/medical/functions/fnc_treatmentAdvanced_bandageLocal.sqf b/addons/medical/functions/fnc_treatmentAdvanced_bandageLocal.sqf index 29bc6dc4d36..2884503599b 100644 --- a/addons/medical/functions/fnc_treatmentAdvanced_bandageLocal.sqf +++ b/addons/medical/functions/fnc_treatmentAdvanced_bandageLocal.sqf @@ -92,8 +92,7 @@ if (USE_WOUND_EVENT_SYNC) then { }; // Handle the reopening of bandaged wounds if (_impact > 0 && {GVAR(enableAdvancedWounds)}) then { -// TODO temp disabled until bandaged wounds are supported by event sync. -// [_target, _impact, _part, _mostEffectiveSpot, _mostEffectiveInjury, _bandage] call FUNC(handleBandageOpening); + [_target, _impact, _part, _mostEffectiveSpot, _mostEffectiveInjury, _bandage] call FUNC(handleBandageOpening); }; // If all wounds have been bandaged, we will reset all damage to 0, so the unit is not showing any blood on the model anymore. From afc8abce851bc66e3bce6b5fb911e08d386964dc Mon Sep 17 00:00:00 2001 From: commy2 Date: Mon, 20 Apr 2015 22:00:13 +0200 Subject: [PATCH 058/104] hide open bag option when it's not selected via scroll wheel --- addons/interact_menu/CfgActions.hpp | 7 +++++++ addons/interact_menu/config.cpp | 2 ++ 2 files changed, 9 insertions(+) create mode 100644 addons/interact_menu/CfgActions.hpp diff --git a/addons/interact_menu/CfgActions.hpp b/addons/interact_menu/CfgActions.hpp new file mode 100644 index 00000000000..79af4f09b22 --- /dev/null +++ b/addons/interact_menu/CfgActions.hpp @@ -0,0 +1,7 @@ + +class CfgActions { + class None; + class OpenBag: None { + showWindow = 0; + }; +}; diff --git a/addons/interact_menu/config.cpp b/addons/interact_menu/config.cpp index 81d2dc3f751..eeff688a1a4 100644 --- a/addons/interact_menu/config.cpp +++ b/addons/interact_menu/config.cpp @@ -14,6 +14,8 @@ class CfgPatches { #include "CfgEventHandlers.hpp" +#include "CfgActions.hpp" + #include "CursorMenus.hpp" class ACE_Settings { From f7719f0e0ae7a8564881dba89ae7022a5cc4520c Mon Sep 17 00:00:00 2001 From: Glowbal Date: Mon, 20 Apr 2015 22:08:31 +0200 Subject: [PATCH 059/104] tab --- addons/medical/functions/fnc_actionLoadUnit.sqf | 4 ++-- addons/medical/functions/fnc_handleLocal.sqf | 10 +++++----- addons/medical/functions/fnc_treatment_failure.sqf | 4 ++-- addons/medical/functions/fnc_treatment_success.sqf | 4 ++-- 4 files changed, 11 insertions(+), 11 deletions(-) diff --git a/addons/medical/functions/fnc_actionLoadUnit.sqf b/addons/medical/functions/fnc_actionLoadUnit.sqf index 5606f15d19e..990467521a6 100644 --- a/addons/medical/functions/fnc_actionLoadUnit.sqf +++ b/addons/medical/functions/fnc_actionLoadUnit.sqf @@ -23,10 +23,10 @@ if ([_target] call EFUNC(common,isAwake)) exitwith { ["displayTextStructured", [_caller], [["This person (%1) is awake and cannot be loaded", [_target] call EFUNC(common,getName)], 1.5, _caller]] call EFUNC(common,targetEvent); }; if ([_target] call FUNC(isBeingCarried)) then { - [_caller, _target] call FUNC(dropObject_carry); + [_caller, _target] call FUNC(dropObject_carry); }; if ([_target] call FUNC(isBeingDragged)) then { - [_caller, _target] call FUNC(dropObject); + [_caller, _target] call FUNC(dropObject); }; _vehicle = [_caller, _target] call EFUNC(common,loadPerson); diff --git a/addons/medical/functions/fnc_handleLocal.sqf b/addons/medical/functions/fnc_handleLocal.sqf index 98b390b51a5..f79c1c3a6d8 100644 --- a/addons/medical/functions/fnc_handleLocal.sqf +++ b/addons/medical/functions/fnc_handleLocal.sqf @@ -24,12 +24,12 @@ if (_local) then { }; if ((_unit getvariable ["ACE_isUnconscious",false]) && {count (_unit getvariable [QGVAR(unconsciousArguments), []]) >= 7}) then { - private "_arguments"; - _arguments = (_unit getvariable [QGVAR(unconsciousArguments), []]); - _arguments set [ 3, time]; + private "_arguments"; + _arguments = (_unit getvariable [QGVAR(unconsciousArguments), []]); + _arguments set [ 3, time]; - [DFUNC(unconsciousPFH), 0.1, _arguments ] call CBA_fnc_addPerFrameHandler; + [DFUNC(unconsciousPFH), 0.1, _arguments ] call CBA_fnc_addPerFrameHandler; - _unit setvariable [QGVAR(unconsciousArguments), nil, true]; + _unit setvariable [QGVAR(unconsciousArguments), nil, true]; }; }; diff --git a/addons/medical/functions/fnc_treatment_failure.sqf b/addons/medical/functions/fnc_treatment_failure.sqf index fe8bafb0c7b..33712956a00 100644 --- a/addons/medical/functions/fnc_treatment_failure.sqf +++ b/addons/medical/functions/fnc_treatment_failure.sqf @@ -36,9 +36,9 @@ _caller setvariable [QGVAR(treatmentPrevAnimCaller), nil]; _weaponSelect = (_caller getvariable [QGVAR(selectedWeaponOnTreatment), ""]); if (_weaponSelect != "") then { - _caller selectWeapon _weaponSelect; + _caller selectWeapon _weaponSelect; } else { - _caller action ["SwitchWeapon", _caller, _caller, 99]; + _caller action ["SwitchWeapon", _caller, _caller, 99]; }; { diff --git a/addons/medical/functions/fnc_treatment_success.sqf b/addons/medical/functions/fnc_treatment_success.sqf index 6822f674c73..66406a180a1 100644 --- a/addons/medical/functions/fnc_treatment_success.sqf +++ b/addons/medical/functions/fnc_treatment_success.sqf @@ -34,9 +34,9 @@ _caller setvariable [QGVAR(treatmentPrevAnimCaller), nil]; _weaponSelect = (_caller getvariable [QGVAR(selectedWeaponOnTreatment), ""]); if (_weaponSelect != "") then { - _caller selectWeapon _weaponSelect; + _caller selectWeapon _weaponSelect; } else { - _caller action ["SwitchWeapon", _caller, _caller, 99]; + _caller action ["SwitchWeapon", _caller, _caller, 99]; }; // Record specific callback From 1df42b17c201521bbf3a15529809a1c206093087 Mon Sep 17 00:00:00 2001 From: Glowbal Date: Mon, 20 Apr 2015 22:22:09 +0200 Subject: [PATCH 060/104] close all dialogs --- addons/medical/functions/fnc_setUnconscious.sqf | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/addons/medical/functions/fnc_setUnconscious.sqf b/addons/medical/functions/fnc_setUnconscious.sqf index e527215c513..c5809f8c8e5 100644 --- a/addons/medical/functions/fnc_setUnconscious.sqf +++ b/addons/medical/functions/fnc_setUnconscious.sqf @@ -37,7 +37,9 @@ _unit setUnconscious true; if (_unit == ACE_player) then { if (visibleMap) then {openMap false}; - closeDialog 0; + while {dialog} do { + closeDialog 0; + }; }; // if we have unconsciousness for AI disabled, we will kill the unit instead From 404eb876312659b0e75eb7b4220c9f3416f0f903 Mon Sep 17 00:00:00 2001 From: ulteq Date: Mon, 20 Apr 2015 22:24:37 +0200 Subject: [PATCH 061/104] Added some ammo class reference data --- extras/CfgAmmoReference.hpp | 2801 +++++++++++++++++++++++++++++++++++ 1 file changed, 2801 insertions(+) create mode 100644 extras/CfgAmmoReference.hpp diff --git a/extras/CfgAmmoReference.hpp b/extras/CfgAmmoReference.hpp new file mode 100644 index 00000000000..85201b92cc6 --- /dev/null +++ b/extras/CfgAmmoReference.hpp @@ -0,0 +1,2801 @@ +class CfgAmmo +{ + class BulletBase; + class B_556x45_Ball : BulletBase { + airFriction=-0.001265; + hit=8; + typicalSpeed=750; + ACE_caliber=0.224; + ACE_bulletLength=0.906; + ACE_bulletMass=62; + ACE_ammoTempMuzzleVelocityShifts[]={-27.20, -26.44, -23.76, -21.00, -17.54, -13.10, -7.95, -1.62, 6.24, 15.48, 27.75}; + ACE_ballisticCoefficients[]={0.151}; + ACE_velocityBoundaries[]={}; + ACE_standardAtmosphere="ASM"; + ACE_dragModel=7; + ACE_muzzleVelocities[]={723, 764, 796, 825, 843, 866, 878, 892, 906, 915, 922, 900}; + ACE_barrelLengths[]={8.3, 9.4, 10.6, 11.8, 13.0, 14.2, 15.4, 16.5, 17.7, 18.9, 20.0, 24.0}; + }; + class ACE_556x45_Ball_Mk262 : B_556x45_Ball { + airFriction=-0.001125; + caliber=0.6; + deflecting=18; + hit=11; + typicalSpeed=836; + ACE_caliber=0.224; + ACE_bulletLength=0.906; + ACE_bulletMass=77; + ACE_ammoTempMuzzleVelocityShifts[]={-26.55, -25.47, -22.85, -20.12, -16.98, -12.80, -7.64, -1.53, 5.96, 15.17, 26.19}; + ACE_ballisticCoefficients[]={0.361}; + ACE_velocityBoundaries[]={}; + ACE_standardAtmosphere="ASM"; + ACE_dragModel=1; + ACE_muzzleVelocities[]={624, 816, 832, 838}; + ACE_barrelLengths[]={7.5, 14.5, 18, 20}; + }; + class ACE_556x45_Ball_Mk318 : B_556x45_Ball { + airFriction=-0.001120; + caliber=0.6; + deflecting=18; + hit=9; + typicalSpeed=886; + ACE_caliber=0.224; + ACE_bulletLength=0.906; + ACE_bulletMass=62; + ACE_ammoTempMuzzleVelocityShifts[]={-26.55, -25.47, -22.85, -20.12, -16.98, -12.80, -7.64, -1.53, 5.96, 15.17, 26.19}; + ACE_ballisticCoefficients[]={0.307}; + ACE_velocityBoundaries[]={}; + ACE_standardAtmosphere="ASM"; + ACE_dragModel=1; + ACE_muzzleVelocities[]={780, 886, 950}; + ACE_barrelLengths[]={10, 15.5, 20}; + }; + class B_556x45_Ball_Tracer_Red; + class ACE_B_556x45_Ball_Tracer_Dim: B_556x45_Ball_Tracer_Red { + nvgOnly = 1; + }; + class ACE_545x39_Ball_7N6M : B_556x45_Ball { + airFriction=-0.001162; + caliber=0.5; + deflecting=18; + hit=7; + typicalSpeed=880; + ACE_caliber=0.220; + ACE_bulletLength=0.85; + ACE_bulletMass=52.9; + ACE_ammoTempMuzzleVelocityShifts[]={-26.55, -25.47, -22.85, -20.12, -16.98, -12.80, -7.64, -1.53, 5.96, 15.17, 26.19}; + ACE_ballisticCoefficients[]={0.168}; + ACE_velocityBoundaries[]={}; + ACE_standardAtmosphere="ICAO"; + ACE_dragModel=7; + ACE_muzzleVelocities[]={780, 880, 920}; + ACE_barrelLengths[]={10, 16.3, 20}; + }; + class B_556x45_Ball_Tracer_Yellow; + class ACE_545x39_Ball_7T3M : B_556x45_Ball_Tracer_Yellow { + airFriction=-0.001162; + caliber=0.5; + deflecting=18; + hit=7; + typicalSpeed=883; + ACE_caliber=0.220; + ACE_bulletLength=0.85; + ACE_bulletMass=49.8; + ACE_ammoTempMuzzleVelocityShifts[]={-26.55, -25.47, -22.85, -20.12, -16.98, -12.80, -7.64, -1.53, 5.96, 15.17, 26.19}; + ACE_ballisticCoefficients[]={0.168}; + ACE_velocityBoundaries[]={}; + ACE_standardAtmosphere="ICAO"; + ACE_dragModel=7; + ACE_muzzleVelocities[]={785, 883, 925}; + ACE_barrelLengths[]={10, 16.3, 20}; + }; + class B_65x39_Caseless : BulletBase { + airFriction=-0.000785; + typicalSpeed=800; + ACE_caliber=0.264; + ACE_bulletLength=1.295; + ACE_bulletMass=123; + ACE_ammoTempMuzzleVelocityShifts[]={-26.55, -25.47, -22.85, -20.12, -16.98, -12.80, -7.64, -1.53, 5.96, 15.17, 26.19}; + ACE_ballisticCoefficients[]={0.263}; + ACE_velocityBoundaries[]={}; + ACE_standardAtmosphere="ICAO"; + ACE_dragModel=7; + ACE_muzzleVelocities[]={730, 760, 788, 800, 810, 830}; + ACE_barrelLengths[]={10, 16, 20, 24, 26, 30}; + }; + class B_65x39_Case_yellow; + class ACE_65x39_Caseless_Tracer_Dim : B_65x39_Case_yellow { + nvgOnly = 1; + }; + class B_65x39_Caseless_green; + class ACE_65x39_Caseless_green_Tracer_Dim : B_65x39_Caseless_green { + nvgOnly = 1; + }; + class ACE_65x47_Ball_Scenar: B_65x39_Caseless + { + airFriction=-0.00078; + typicalSpeed=820 ; + ACE_caliber=0.264; + ACE_bulletLength=1.364; + ACE_bulletMass=139; + ACE_ammoTempMuzzleVelocityShifts[]={-26.55, -25.47, -22.85, -20.12, -16.98, -12.80, -7.64, -1.53, 5.96, 15.17, 26.19}; + ACE_ballisticCoefficients[]={0.290}; + ACE_velocityBoundaries[]={}; + ACE_standardAtmosphere="ICAO"; + ACE_dragModel=7; + ACE_muzzleVelocities[]={730, 760, 790, 820, 830}; + ACE_barrelLengths[]={10, 16, 20, 24, 26}; + }; + class B_762x51_Ball : BulletBase { + airFriction=-0.001035; + typicalSpeed=833; + hit=9; + ACE_caliber=0.308; + ACE_bulletLength=1.14; + ACE_bulletMass=146; + ACE_ammoTempMuzzleVelocityShifts[]={-26.55, -25.47, -22.85, -20.12, -16.98, -12.80, -7.64, -1.53, 5.96, 15.17, 26.19}; + ACE_ballisticCoefficients[]={0.2}; + ACE_velocityBoundaries[]={}; + ACE_standardAtmosphere="ICAO"; + ACE_dragModel=7; + ACE_muzzleVelocities[]={700, 800, 820, 833, 845}; + ACE_barrelLengths[]={10, 16, 20, 24, 26}; + }; + class B_762x51_Tracer_Yellow; + class ACE_B_762x51_Tracer_Dim: B_762x51_Tracer_Yellow { + nvgOnly = 1; + }; + class ACE_762x51_Ball_M118LR : B_762x51_Ball { + airFriction=-0.0008525; + caliber=1.05; + hit=16; + typicalSpeed=790; + ACE_caliber=0.308; + ACE_bulletLength=1.24; + ACE_bulletMass=175; + ACE_ammoTempMuzzleVelocityShifts[]={-26.55, -25.47, -22.85, -20.12, -16.98, -12.80, -7.64, -1.53, 5.96, 15.17, 26.19}; + ACE_ballisticCoefficients[]={0.243}; + ACE_velocityBoundaries[]={}; + ACE_standardAtmosphere="ICAO"; + ACE_dragModel=7; + ACE_muzzleVelocities[]={750, 780, 790, 794}; + ACE_barrelLengths[]={16, 20, 24, 26}; + }; + class ACE_762x51_Ball_Mk319_Mod_0 : B_762x51_Ball { + airFriction=-0.00103; + caliber=0.85; + hit=14; + typicalSpeed=890; + ACE_caliber=0.308; + ACE_bulletLength=1.24; + ACE_bulletMass=130; + ACE_ammoTempMuzzleVelocityShifts[]={-2.655, -2.547, -2.285, -2.012, -1.698, -1.280, -0.764, -0.153, 0.596, 1.517, 2.619}; + ACE_ballisticCoefficients[]={0.377}; + ACE_velocityBoundaries[]={}; + ACE_standardAtmosphere="ICAO"; + ACE_dragModel=1; + ACE_muzzleVelocities[]={838, 892, 910}; + ACE_barrelLengths[]={13, 16, 20}; + }; + class ACE_762x51_Ball_Subsonic : B_762x51_Ball { + airFriction=-0.000535; + caliber=0.5; + hit=6; + typicalSpeed=790; + ACE_caliber=0.308; + ACE_bulletLength=1.340; + ACE_bulletMass=200; + ACE_ammoTempMuzzleVelocityShifts[]={-2.655, -2.547, -2.285, -2.012, -1.698, -1.280, -0.764, -0.153, 0.596, 1.517, 2.619}; + ACE_ballisticCoefficients[]={0.235}; + ACE_velocityBoundaries[]={}; + ACE_standardAtmosphere="ICAO"; + ACE_dragModel=7; + ACE_muzzleVelocities[]={305, 325, 335, 340}; + ACE_barrelLengths[]={16, 20, 24, 26}; + }; + class ACE_762x67_Ball_Mk248_Mod_0 : B_762x51_Ball { + airFriction=-0.000830; + caliber=1.08; + hit=17; + typicalSpeed=900; + ACE_caliber=0.308; + ACE_bulletLength=1.353; + ACE_bulletMass=190; + ACE_ammoTempMuzzleVelocityShifts[]={-26.55, -25.47, -22.85, -20.12, -16.98, -12.80, -7.64, -1.53, 5.96, 15.17, 26.19}; + ACE_ballisticCoefficients[]={0.268}; + ACE_velocityBoundaries[]={}; + ACE_standardAtmosphere="ICAO"; + ACE_dragModel=7; + ACE_muzzleVelocities[]={865, 900, 924}; + ACE_barrelLengths[]={20, 24, 26}; + }; + class ACE_762x67_Ball_Mk248_Mod_1 : B_762x51_Ball { + airFriction=-0.000815; + caliber=1.12; + hit=18; + typicalSpeed=867; + ACE_caliber=0.308; + ACE_bulletLength=1.489; + ACE_bulletMass=220; + ACE_ammoTempMuzzleVelocityShifts[]={-26.55, -25.47, -22.85, -20.12, -16.98, -12.80, -7.64, -1.53, 5.96, 15.17, 26.19}; + ACE_ballisticCoefficients[]={0.310}; + ACE_velocityBoundaries[]={}; + ACE_standardAtmosphere="ICAO"; + ACE_dragModel=7; + ACE_muzzleVelocities[]={847, 867, 877}; + ACE_barrelLengths[]={20, 24, 26}; + }; + class ACE_762x67_Ball_Berger_Hybrid_OTM : B_762x51_Ball { + airFriction=-0.00076; + caliber=1.15; + hit=19; + typicalSpeed=853; + ACE_caliber=0.308; + ACE_bulletLength=1.602; + ACE_bulletMass=230; + ACE_ammoTempMuzzleVelocityShifts[]={-26.55, -25.47, -22.85, -20.12, -16.98, -12.80, -7.64, -1.53, 5.96, 15.17, 26.19}; + ACE_ballisticCoefficients[]={0.368}; + ACE_velocityBoundaries[]={}; + ACE_standardAtmosphere="ICAO"; + ACE_dragModel=7; + ACE_muzzleVelocities[]={800, 853, 884}; + ACE_barrelLengths[]={20, 24, 26}; + }; + class B_762x54_Ball: B_762x51_Ball { + airFriction=-0.001023; + typicalSpeed=820; + ACE_caliber=0.312; + ACE_bulletLength=1.14; + ACE_bulletMass=152; + ACE_ammoTempMuzzleVelocityShifts[]={-26.55, -25.47, -22.85, -20.12, -16.98, -12.80, -7.64, -1.53, 5.96, 15.17, 26.19}; + ACE_ballisticCoefficients[]={0.4}; + ACE_velocityBoundaries[]={}; + ACE_standardAtmosphere="ICAO"; + ACE_dragModel=1; + ACE_muzzleVelocities[]={700, 800, 820, 833}; + ACE_barrelLengths[]={16, 20, 24, 26}; + }; + class ACE_762x54_Ball_7N14 : B_762x51_Ball { + airFriction=-0.001023; + caliber=0.95; + hit=15; + typicalSpeed=820; + ACE_caliber=0.312; + ACE_bulletLength=1.14; + ACE_bulletMass=152; + ACE_ammoTempMuzzleVelocityShifts[]={-26.55, -25.47, -22.85, -20.12, -16.98, -12.80, -7.64, -1.53, 5.96, 15.17, 26.19}; + ACE_ballisticCoefficients[]={0.4}; + ACE_velocityBoundaries[]={}; + ACE_standardAtmosphere="ICAO"; + ACE_dragModel=1; + ACE_muzzleVelocities[]={700, 800, 820, 833}; + ACE_barrelLengths[]={16, 20, 24, 26}; + }; + class B_762x54_Tracer_Green; + class ACE_762x54_Ball_7T2 : B_762x54_Tracer_Green { + airFriction=-0.001023; + caliber=0.9; + hit=15; + typicalSpeed=800; + ACE_caliber=0.312; + ACE_bulletLength=1.14; + ACE_bulletMass=149; + ACE_ammoTempMuzzleVelocityShifts[]={-26.55, -25.47, -22.85, -20.12, -16.98, -12.80, -7.64, -1.53, 5.96, 15.17, 26.19}; + ACE_ballisticCoefficients[]={0.395}; + ACE_velocityBoundaries[]={}; + ACE_standardAtmosphere="ICAO"; + ACE_dragModel=1; + ACE_muzzleVelocities[]={680, 750, 798, 800}; + ACE_barrelLengths[]={16, 20, 24, 26}; + }; + class ACE_762x35_Ball : B_762x51_Ball { + airFriction=-0.000821; + caliber=0.9; + hit=11; + typicalSpeed=790; + ACE_caliber=0.308; + ACE_bulletLength=1.153; + ACE_bulletMass=125; + ACE_ammoTempMuzzleVelocityShifts[]={-26.55, -25.47, -22.85, -20.12, -16.98, -12.80, -7.64, -1.53, 5.96, 15.17, 26.19}; + ACE_ballisticCoefficients[]={0.349, 0.338, 0.330, 0.310}; + ACE_velocityBoundaries[]={792, 610, 488}; + ACE_standardAtmosphere="ICAO"; + ACE_dragModel=1; + ACE_muzzleVelocities[]={620, 655, 675}; + ACE_barrelLengths[]={9, 16, 20}; + }; + class ACE_762x39_Ball : B_762x51_Ball { + airFriction=-0.0015168; + hit=12; + typicalSpeed=716; + ACE_caliber=0.308; + ACE_bulletLength=1.14; + ACE_bulletMass=123; + ACE_ammoTempMuzzleVelocityShifts[]={-26.55, -25.47, -22.85, -20.12, -16.98, -12.80, -7.64, -1.53, 5.96, 15.17, 26.19}; + ACE_ballisticCoefficients[]={0.275}; + ACE_velocityBoundaries[]={}; + ACE_standardAtmosphere="ICAO"; + ACE_dragModel=1; + ACE_muzzleVelocities[]={650, 716, 750}; + ACE_barrelLengths[]={10, 16.3, 20}; + }; + class ACE_762x39_Ball_57N231P : B_762x51_Tracer_Yellow { + airFriction=-0.0015168; + hit=12; + typicalSpeed=716; + ACE_caliber=0.308; + ACE_bulletLength=1.14; + ACE_bulletMass=117; + ACE_ammoTempMuzzleVelocityShifts[]={-26.55, -25.47, -22.85, -20.12, -16.98, -12.80, -7.64, -1.53, 5.96, 15.17, 26.19}; + ACE_ballisticCoefficients[]={0.275}; + ACE_velocityBoundaries[]={}; + ACE_standardAtmosphere="ICAO"; + ACE_dragModel=1; + ACE_muzzleVelocities[]={650, 716, 750}; + ACE_barrelLengths[]={10, 16.3, 20}; + }; + class B_9x21_Ball : BulletBase { + airFriction=-0.00125; + typicalSpeed=390; + hit=6; + ACE_caliber=0.356; + ACE_bulletLength=0.610; + ACE_bulletMass=115; + ACE_ammoTempMuzzleVelocityShifts[]={-2.655, -2.547, -2.285, -2.012, -1.698, -1.280, -0.764, -0.153, 0.596, 1.517, 2.619}; + ACE_ballisticCoefficients[]={0.17}; + ACE_velocityBoundaries[]={}; + ACE_standardAtmosphere="ICAO"; + ACE_dragModel=1; + ACE_muzzleVelocities[]={440, 460, 480}; + ACE_barrelLengths[]={4, 5, 9}; + }; + class ACE_9x18_Ball_57N181S : B_9x21_Ball { + hit=5; + airFriction=-0.001234; + typicalSpeed=298; + ACE_caliber=0.365; + ACE_bulletLength=0.610; + ACE_bulletMass=92.6; + ACE_ammoTempMuzzleVelocityShifts[]={-2.655, -2.547, -2.285, -2.012, -1.698, -1.280, -0.764, -0.153, 0.596, 1.517, 2.619}; + ACE_ballisticCoefficients[]={0.125}; + ACE_velocityBoundaries[]={}; + ACE_standardAtmosphere="ICAO"; + ACE_dragModel=1; + ACE_muzzleVelocities[]={298, 330, 350}; + ACE_barrelLengths[]={3.8, 5, 9}; + }; + class ACE_9x19_Ball : B_9x21_Ball { + airFriction=-0.001234; + typicalSpeed=370; + hit=6; + ACE_caliber=0.355; + ACE_bulletLength=0.610; + ACE_bulletMass=124; + ACE_ammoTempMuzzleVelocityShifts[]={-2.655, -2.547, -2.285, -2.012, -1.698, -1.280, -0.764, -0.153, 0.596, 1.517, 2.619}; + ACE_ballisticCoefficients[]={0.165}; + ACE_velocityBoundaries[]={}; + ACE_standardAtmosphere="ASM"; + ACE_dragModel=1; + ACE_muzzleVelocities[]={340, 370, 400}; + ACE_barrelLengths[]={4, 5, 9}; + }; + class ACE_10x25_Ball : B_9x21_Ball { + airFriction=-0.00168; + typicalSpeed=425; + hit=7; + ACE_caliber=0.5; + ACE_bulletLength=0.764; + ACE_bulletMass=165; + ACE_ammoTempMuzzleVelocityShifts[]={-2.655, -2.547, -2.285, -2.012, -1.698, -1.280, -0.764, -0.153, 0.596, 1.517, 2.619}; + ACE_ballisticCoefficients[]={0.189}; + ACE_velocityBoundaries[]={}; + ACE_standardAtmosphere="ICAO"; + ACE_dragModel=1; + ACE_muzzleVelocities[]={360, 400, 430}; + ACE_barrelLengths[]={4, 4.61, 9}; + }; + class ACE_765x17_Ball: B_9x21_Ball { + airFriction=-0.001213; + typicalSpeed=282; + hit=7; + ACE_caliber=0.3125; + ACE_bulletLength=0.610; + ACE_bulletMass=65; + ACE_ammoTempMuzzleVelocityShifts[]={-2.655, -2.547, -2.285, -2.012, -1.698, -1.280, -0.764, -0.153, 0.596, 1.517, 2.619}; + ACE_ballisticCoefficients[]={0.118}; + ACE_velocityBoundaries[]={}; + ACE_standardAtmosphere="ASM"; + ACE_dragModel=1; + ACE_muzzleVelocities[]={282, 300, 320}; + ACE_barrelLengths[]={4, 5, 9}; + }; + class ACE_303_Ball : ACE_762x51_Ball_M118LR { + airFriction=-0.00083; + typicalSpeed=761; + ACE_caliber=0.311; + ACE_bulletLength=1.227; + ACE_bulletMass=174; + ACE_ammoTempMuzzleVelocityShifts[]={-26.55, -25.47, -22.85, -20.12, -16.98, -12.80, -7.64, -1.53, 5.96, 15.17, 26.19}; + ACE_ballisticCoefficients[]={0.499, 0.493, 0.48}; + ACE_velocityBoundaries[]={671, 549}; + ACE_standardAtmosphere="ASM"; + ACE_dragModel=1; + ACE_muzzleVelocities[]={748, 761, 765}; + ACE_barrelLengths[]={20, 24, 26}; + }; + class B_93x64_Ball : BulletBase { + airFriction=-0.00106; + typicalSpeed=880; + ACE_caliber=0.366; + ACE_bulletLength=1.350; + ACE_bulletMass=230; + ACE_transonicStabilityCoef=1; + ACE_ammoTempMuzzleVelocityShifts[]={-26.55, -25.47, -22.85, -20.12, -16.98, -12.80, -7.64, -1.53, 5.96, 15.17, 26.19}; + ACE_ballisticCoefficients[]={0.368}; + ACE_velocityBoundaries[]={}; + ACE_standardAtmosphere="ASM"; + ACE_dragModel=1; + ACE_muzzleVelocities[]={850, 870, 880}; + ACE_barrelLengths[]={20, 24.41, 26}; + }; + class B_408_Ball : BulletBase { + timeToLive=10; + airFriction=-0.000395; + typicalSpeed=910; + ACE_caliber=0.408; + ACE_bulletLength=2.126; + ACE_bulletMass=410; + ACE_transonicStabilityCoef=1; + ACE_ammoTempMuzzleVelocityShifts[]={-26.55, -25.47, -22.85, -20.12, -16.98, -12.80, -7.64, -1.53, 5.96, 15.17, 26.19}; + ACE_ballisticCoefficients[]={0.97}; + ACE_velocityBoundaries[]={}; + ACE_standardAtmosphere="ASM"; + ACE_dragModel=1; + ACE_muzzleVelocities[]={910}; + ACE_barrelLengths[]={29}; + }; + class ACE_106x83mm_Ball : B_408_Ball { + timeToLive=10; + ACE_caliber=0.416; + ACE_bulletLength=2.089; + ACE_bulletMass=398; + ACE_ammoTempMuzzleVelocityShifts[]={-26.55, -25.47, -22.85, -20.12, -16.98, -12.80, -7.64, -1.53, 5.96, 15.17, 26.19}; + ACE_ballisticCoefficients[]={0.72}; + ACE_velocityBoundaries[]={}; + ACE_standardAtmosphere="ASM"; + ACE_dragModel=1; + ACE_muzzleVelocities[]={960}; + ACE_barrelLengths[]={29}; + }; + class B_338_Ball : BulletBase { + timeToLive=10; + airFriction=-0.000606; + typicalSpeed=915; + ACE_caliber=0.338; + ACE_bulletLength=1.558; + ACE_bulletMass=250; + ACE_ammoTempMuzzleVelocityShifts[]={-26.55, -25.47, -22.85, -20.12, -16.98, -12.80, -7.64, -1.53, 5.96, 15.17, 26.19}; + ACE_ballisticCoefficients[]={0.322}; + ACE_velocityBoundaries[]={}; + ACE_standardAtmosphere="ICAO"; + ACE_dragModel=7; + ACE_muzzleVelocities[]={880, 915, 925}; + ACE_barrelLengths[]={20, 26, 28}; + }; + class B_338_NM_Ball : BulletBase { + airFriction=-0.000537; + typicalSpeed=820; + ACE_caliber=0.338; + ACE_bulletLength=1.70; + ACE_bulletMass=300; + ACE_ammoTempMuzzleVelocityShifts[]={-26.55, -25.47, -22.85, -20.12, -16.98, -12.80, -7.64, -1.53, 5.96, 15.17, 26.19}; + ACE_ballisticCoefficients[]={0.381}; + ACE_velocityBoundaries[]={}; + ACE_standardAtmosphere="ICAO"; + ACE_dragModel=7; + ACE_muzzleVelocities[]={790, 807, 820}; + ACE_barrelLengths[]={20, 24, 26}; + }; + class ACE_338_Ball : B_338_Ball { + timeToLive=10; + airFriction=-0.000535; + caliber=1.55; + typicalSpeed=826; + ACE_caliber=0.338; + ACE_bulletLength=1.70; + ACE_bulletMass=300; + ACE_ammoTempMuzzleVelocityShifts[]={-26.55, -25.47, -22.85, -20.12, -16.98, -12.80, -7.64, -1.53, 5.96, 15.17, 26.19}; + ACE_ballisticCoefficients[]={0.381}; + ACE_velocityBoundaries[]={}; + ACE_standardAtmosphere="ICAO"; + ACE_dragModel=7; + ACE_muzzleVelocities[]={800, 820, 826, 830}; + ACE_barrelLengths[]={20, 24, 26.5, 28}; + }; + class ACE_338_Ball_API526 : B_338_Ball { + timeToLive=10; + airFriction=-0.000673; + caliber=2.4; + typicalSpeed=826; + ACE_caliber=0.338; + ACE_bulletLength=1.535; + ACE_bulletMass=253; + ACE_ammoTempMuzzleVelocityShifts[]={-26.55, -25.47, -22.85, -20.12, -16.98, -12.80, -7.64, -1.53, 5.96, 15.17, 26.19}; + ACE_ballisticCoefficients[]={0.290}; + ACE_velocityBoundaries[]={}; + ACE_standardAtmosphere="ICAO"; + ACE_dragModel=7; + ACE_muzzleVelocities[]={880, 915, 925}; + ACE_barrelLengths[]={20, 26, 28}; + }; + class B_127x54_Ball : BulletBase { + airFriction=-0.00014; + typicalSpeed=300; + ACE_caliber=0.510; + ACE_bulletLength=2.540; + ACE_bulletMass=750; + ACE_ammoTempMuzzleVelocityShifts[]={-2.655, -2.547, -2.285, -2.012, -1.698, -1.280, -0.764, -0.153, 0.596, 1.517, 2.619}; + ACE_ballisticCoefficients[]={1.050}; + ACE_velocityBoundaries[]={}; + ACE_standardAtmosphere="ASM"; + ACE_dragModel=1; + ACE_muzzleVelocities[]={300}; + ACE_barrelLengths[]={17.2}; + }; + class B_127x99_Ball : BulletBase { + timeToLive=10; + airFriction=-0.0006; + typicalSpeed=853; + ACE_caliber=0.510; + ACE_bulletLength=2.310; + ACE_bulletMass=647; + ACE_ammoTempMuzzleVelocityShifts[]={-26.55, -25.47, -22.85, -20.12, -16.98, -12.80, -7.64, -1.53, 5.96, 15.17, 26.19}; + ACE_ballisticCoefficients[]={0.670}; + ACE_velocityBoundaries[]={}; + ACE_standardAtmosphere="ASM"; + ACE_dragModel=1; + ACE_muzzleVelocities[]={853}; + ACE_barrelLengths[]={29}; + }; + class ACE_127x99_Ball_AMAX : B_127x99_Ball { + timeToLive=10; + airFriction=-0.000374; + typicalSpeed=860; + ACE_caliber=0.510; + ACE_bulletLength=2.540; + ACE_bulletMass=750; + ACE_ammoTempMuzzleVelocityShifts[]={-26.55, -25.47, -22.85, -20.12, -16.98, -12.80, -7.64, -1.53, 5.96, 15.17, 26.19}; + ACE_ballisticCoefficients[]={1.050}; + ACE_velocityBoundaries[]={}; + ACE_standardAtmosphere="ASM"; + ACE_dragModel=1; + ACE_muzzleVelocities[]={860}; + ACE_barrelLengths[]={29}; + }; + class B_127x108_Ball : BulletBase { + timeToLive=10; + airFriction=-0.00064; + typicalSpeed=820; + ACE_caliber=0.511; + ACE_bulletLength=2.520; + ACE_bulletMass=745; + ACE_ammoTempMuzzleVelocityShifts[]={-26.55, -25.47, -22.85, -20.12, -16.98, -12.80, -7.64, -1.53, 5.96, 15.17, 26.19}; + ACE_ballisticCoefficients[]={0.63}; + ACE_velocityBoundaries[]={}; + ACE_standardAtmosphere="ASM"; + ACE_dragModel=1; + ACE_muzzleVelocities[]={820}; + ACE_barrelLengths[]={28.7}; + }; + class B_45ACP_Ball : BulletBase { + airFriction=-0.0007182; + typicalSpeed=250; + ACE_caliber=0.452; + ACE_bulletLength=0.68; + ACE_bulletMass=230; + ACE_ammoTempMuzzleVelocityShifts[]={-2.655, -2.547, -2.285, -2.012, -1.698, -1.280, -0.764, -0.153, 0.596, 1.517, 2.619}; + ACE_ballisticCoefficients[]={0.195}; + ACE_velocityBoundaries[]={}; + ACE_standardAtmosphere="ASM"; + ACE_dragModel=1; + ACE_muzzleVelocities[]={230, 250, 285}; + ACE_barrelLengths[]={4, 5, 9}; + }; + + class TMR_B_762x51_M118LR : B_762x51_Ball + { + ACE_caliber=0.308; + ACE_bulletLength=1.24; + ACE_bulletMass=175; + ACE_ammoTempMuzzleVelocityShifts[]={-26.55, -25.47, -22.85, -20.12, -16.98, -12.80, -7.64, -1.53, 5.96, 15.17, 26.19}; + ACE_ballisticCoefficients[]={0.505, 0.496, 0.485, 0.485, 0.485}; + ACE_velocityBoundaries[]={853, 549, 549, 549}; + ACE_standardAtmosphere="ICAO"; + ACE_dragModel=1; + ACE_muzzleVelocities[]={750, 780, 790, 794}; + ACE_barrelLengths[]={16, 20, 24, 26}; + }; + + class RH_50_AE_Ball: BulletBase + { + ACE_caliber=0.5; + ACE_bulletLength=1.110; + ACE_bulletMass=325; + ACE_ammoTempMuzzleVelocityShifts[]={-2.655, -2.547, -2.285, -2.012, -1.698, -1.280, -0.764, -0.153, 0.596, 1.517, 2.619}; + ACE_ballisticCoefficients[]={0.228}; + ACE_velocityBoundaries[]={}; + ACE_standardAtmosphere="ASM"; + ACE_dragModel=1; + ACE_muzzleVelocities[]={360, 398, 420}; + ACE_barrelLengths[]={4, 6, 9}; + }; + class RH_454_Casull: BulletBase + { + ACE_caliber=0.452; + ACE_bulletLength=0.895; + ACE_bulletMass=325; + ACE_ammoTempMuzzleVelocityShifts[]={-2.655, -2.547, -2.285, -2.012, -1.698, -1.280, -0.764, -0.153, 0.596, 1.517, 2.619}; + ACE_ballisticCoefficients[]={0.171}; + ACE_velocityBoundaries[]={}; + ACE_standardAtmosphere="ASM"; + ACE_dragModel=1; + ACE_muzzleVelocities[]={450, 490, 500}; + ACE_barrelLengths[]={4, 7.5, 9}; + }; + class RH_32ACP: BulletBase + { + ACE_caliber=0.3125; + ACE_bulletLength=0.610; + ACE_bulletMass=65; + ACE_ammoTempMuzzleVelocityShifts[]={-2.655, -2.547, -2.285, -2.012, -1.698, -1.280, -0.764, -0.153, 0.596, 1.517, 2.619}; + ACE_ballisticCoefficients[]={0.118}; + ACE_velocityBoundaries[]={}; + ACE_standardAtmosphere="ASM"; + ACE_dragModel=1; + ACE_muzzleVelocities[]={282, 300, 320}; + ACE_barrelLengths[]={4, 5, 9}; + }; + class RH_45ACP: BulletBase + { + ACE_caliber=0.452; + ACE_bulletLength=0.68; + ACE_bulletMass=230; + ACE_ammoTempMuzzleVelocityShifts[]={-2.655, -2.547, -2.285, -2.012, -1.698, -1.280, -0.764, -0.153, 0.596, 1.517, 2.619}; + ACE_ballisticCoefficients[]={0.195}; + ACE_velocityBoundaries[]={}; + ACE_standardAtmosphere="ASM"; + ACE_dragModel=1; + ACE_muzzleVelocities[]={230, 250, 285}; + ACE_barrelLengths[]={4, 5, 9}; + }; + class RH_B_40SW: BulletBase + { + ACE_caliber=0.4; + ACE_bulletLength=0.447; + ACE_bulletMass=135; + ACE_ammoTempMuzzleVelocityShifts[]={-2.655, -2.547, -2.285, -2.012, -1.698, -1.280, -0.764, -0.153, 0.596, 1.517, 2.619}; + ACE_ballisticCoefficients[]={0.105, 0.115, 0.120, 0.105}; + ACE_velocityBoundaries[]={365, 305, 259}; + ACE_standardAtmosphere="ASM"; + ACE_dragModel=1; + ACE_muzzleVelocities[]={360, 380, 400}; + ACE_barrelLengths[]={4, 6, 9}; + }; + class RH_44mag_ball: BulletBase + { + ACE_caliber=0.429; + ACE_bulletLength=0.804; + ACE_bulletMass=200; + ACE_ammoTempMuzzleVelocityShifts[]={-2.655, -2.547, -2.285, -2.012, -1.698, -1.280, -0.764, -0.153, 0.596, 1.517, 2.619}; + ACE_ballisticCoefficients[]={0.172}; + ACE_velocityBoundaries[]={}; + ACE_standardAtmosphere="ASM"; + ACE_dragModel=1; + ACE_muzzleVelocities[]={360, 390, 420}; + ACE_barrelLengths[]={4, 7.5, 9}; + }; + class RH_357mag_ball: BulletBase + { + ACE_caliber=0.357; + ACE_bulletLength=0.541; + ACE_bulletMass=125; + ACE_ammoTempMuzzleVelocityShifts[]={-2.655, -2.547, -2.285, -2.012, -1.698, -1.280, -0.764, -0.153, 0.596, 1.517, 2.619}; + ACE_ballisticCoefficients[]={0.148}; + ACE_velocityBoundaries[]={}; + ACE_standardAtmosphere="ASM"; + ACE_dragModel=1; + ACE_muzzleVelocities[]={490, 510, 535}; + ACE_barrelLengths[]={4, 6, 9}; + }; + class RH_762x25: BulletBase + { + ACE_caliber=0.310; + ACE_bulletLength=0.5455; + ACE_bulletMass=86; + ACE_ammoTempMuzzleVelocityShifts[]={-2.655, -2.547, -2.285, -2.012, -1.698, -1.280, -0.764, -0.153, 0.596, 1.517, 2.619}; + ACE_ballisticCoefficients[]={0.17}; + ACE_velocityBoundaries[]={}; + ACE_standardAtmosphere="ASM"; + ACE_dragModel=1; + ACE_muzzleVelocities[]={360, 380, 400}; + ACE_barrelLengths[]={4, 6, 9}; + }; + class RH_9x18_Ball: BulletBase + { + ACE_caliber=0.365; + ACE_bulletLength=0.610; + ACE_bulletMass=92.6; + ACE_ammoTempMuzzleVelocityShifts[]={-2.655, -2.547, -2.285, -2.012, -1.698, -1.280, -0.764, -0.153, 0.596, 1.517, 2.619}; + ACE_ballisticCoefficients[]={0.125}; + ACE_velocityBoundaries[]={}; + ACE_standardAtmosphere="ASM"; + ACE_dragModel=1; + ACE_muzzleVelocities[]={298, 330, 350}; + ACE_barrelLengths[]={3.8, 5, 9}; + }; + class RH_B_9x19_Ball: BulletBase + { + ACE_caliber=0.355; + ACE_bulletLength=0.610; + ACE_bulletMass=124; + ACE_ammoTempMuzzleVelocityShifts[]={-2.655, -2.547, -2.285, -2.012, -1.698, -1.280, -0.764, -0.153, 0.596, 1.517, 2.619}; + ACE_ballisticCoefficients[]={0.165}; + ACE_velocityBoundaries[]={}; + ACE_standardAtmosphere="ASM"; + ACE_dragModel=1; + ACE_muzzleVelocities[]={340, 370, 400}; + ACE_barrelLengths[]={4, 5, 9}; + }; + class RH_B_22LR_SD: BulletBase + { + ACE_caliber=0.223; + ACE_bulletLength=0.45; + ACE_bulletMass=38; + ACE_ammoTempMuzzleVelocityShifts[]={-2.655, -2.547, -2.285, -2.012, -1.698, -1.280, -0.764, -0.153, 0.596, 1.517, 2.619}; + ACE_ballisticCoefficients[]={0.111}; + ACE_velocityBoundaries[]={}; + ACE_standardAtmosphere="ASM"; + ACE_dragModel=1; + ACE_muzzleVelocities[]={330, 340, 360}; + ACE_barrelLengths[]={4, 6, 9}; + }; + class RH_57x28mm: BulletBase + { + ACE_caliber=0.224; + ACE_bulletLength=0.495; + ACE_bulletMass=28; + ACE_ammoTempMuzzleVelocityShifts[]={-2.655, -2.547, -2.285, -2.012, -1.698, -1.280, -0.764, -0.153, 0.596, 1.517, 2.619}; + ACE_ballisticCoefficients[]={0.144}; + ACE_velocityBoundaries[]={}; + ACE_standardAtmosphere="ASM"; + ACE_dragModel=1; + ACE_muzzleVelocities[]={550, 625, 720}; + ACE_barrelLengths[]={4, 6, 10.35}; + }; + + class RH_9x19_B_M822: BulletBase + { + ACE_caliber=0.355; + ACE_bulletLength=0.610; + ACE_bulletMass=124; + ACE_ammoTempMuzzleVelocityShifts[]={-2.655, -2.547, -2.285, -2.012, -1.698, -1.280, -0.764, -0.153, 0.596, 1.517, 2.619}; + ACE_ballisticCoefficients[]={0.165}; + ACE_velocityBoundaries[]={}; + ACE_standardAtmosphere="ASM"; + ACE_dragModel=1; + ACE_muzzleVelocities[]={340, 370, 400}; + ACE_barrelLengths[]={4, 5, 9}; + }; + class RH_9x19_B_HP: BulletBase + { + ACE_caliber=0.355; + ACE_bulletLength=0.610; + ACE_bulletMass=124; + ACE_ammoTempMuzzleVelocityShifts[]={-2.655, -2.547, -2.285, -2.012, -1.698, -1.280, -0.764, -0.153, 0.596, 1.517, 2.619}; + ACE_ballisticCoefficients[]={0.165}; + ACE_velocityBoundaries[]={}; + ACE_standardAtmosphere="ASM"; + ACE_dragModel=1; + ACE_muzzleVelocities[]={340, 370, 400}; + ACE_barrelLengths[]={4, 5, 9}; + }; + class RH_9x19_B_HPSB: BulletBase + { + ACE_caliber=0.355; + ACE_bulletLength=0.603; + ACE_bulletMass=147; + ACE_ammoTempMuzzleVelocityShifts[]={-2.655, -2.547, -2.285, -2.012, -1.698, -1.280, -0.764, -0.153, 0.596, 1.517, 2.619}; + ACE_ballisticCoefficients[]={0.212}; + ACE_velocityBoundaries[]={}; + ACE_standardAtmosphere="ASM"; + ACE_dragModel=1; + ACE_muzzleVelocities[]={295, 310, 330}; + ACE_barrelLengths[]={4, 5, 9}; + }; + class RH_B_6x35: BulletBase + { + ACE_caliber=0.224; + ACE_bulletLength=0.445; + ACE_bulletMass=65; + ACE_ammoTempMuzzleVelocityShifts[]={-26.55, -25.47, -22.85, -20.12, -16.98, -12.80, -7.64, -1.53, 5.96, 15.17, 26.19}; + ACE_ballisticCoefficients[]={0.26}; + ACE_velocityBoundaries[]={}; + ACE_standardAtmosphere="ASM"; + ACE_dragModel=1; + ACE_muzzleVelocities[]={730, 750, 760}; + ACE_barrelLengths[]={8, 10, 12}; + }; + class RH_556x45_B_M855A1 : B_556x45_Ball + { + ACE_caliber=0.224; + ACE_bulletLength=0.906; + ACE_bulletMass=62; + ACE_ammoTempMuzzleVelocityShifts[]={-27.20, -26.44, -23.76, -21.00, -17.54, -13.10, -7.95, -1.62, 6.24, 15.48, 27.75}; + ACE_ballisticCoefficients[]={0.152}; + ACE_velocityBoundaries[]={}; + ACE_standardAtmosphere="ASM"; + ACE_dragModel=7; + ACE_muzzleVelocities[]={723, 764, 796, 825, 843, 866, 878, 892, 906, 915, 922, 900}; + ACE_barrelLengths[]={8.3, 9.4, 10.6, 11.8, 13.0, 14.2, 15.4, 16.5, 17.7, 18.9, 20.0, 24.0}; + }; + class RH_556x45_B_Mk262 : B_556x45_Ball + { + ACE_caliber=0.224; + ACE_bulletLength=0.906; + ACE_bulletMass=77; + ACE_ammoTempMuzzleVelocityShifts[]={-26.55, -25.47, -22.85, -20.12, -16.98, -12.80, -7.64, -1.53, 5.96, 15.17, 26.19}; + ACE_ballisticCoefficients[]={0.361}; + ACE_velocityBoundaries[]={}; + ACE_standardAtmosphere="ASM"; + ACE_dragModel=1; + ACE_muzzleVelocities[]={624, 816, 832, 838}; + ACE_barrelLengths[]={7.5, 14.5, 18, 20}; + }; + class RH_556x45_B_Mk318 : B_556x45_Ball + { + ACE_caliber=0.224; + ACE_bulletLength=0.906; + ACE_bulletMass=62; + ACE_ammoTempMuzzleVelocityShifts[]={-26.55, -25.47, -22.85, -20.12, -16.98, -12.80, -7.64, -1.53, 5.96, 15.17, 26.19}; + ACE_ballisticCoefficients[]={0.307}; + ACE_velocityBoundaries[]={}; + ACE_standardAtmosphere="ASM"; + ACE_dragModel=1; + ACE_muzzleVelocities[]={780, 886, 950}; + ACE_barrelLengths[]={10, 15.5, 20}; + }; + class RH_68x43_B_FMJ: B_65x39_Caseless + { + ACE_caliber=0.277; + ACE_bulletLength=0.959; + ACE_bulletMass=115; + ACE_ammoTempMuzzleVelocityShifts[]={-26.55, -25.47, -22.85, -20.12, -16.98, -12.80, -7.64, -1.53, 5.96, 15.17, 26.19}; + ACE_ballisticCoefficients[]={0.162}; + ACE_velocityBoundaries[]={}; + ACE_standardAtmosphere="ICAO"; + ACE_dragModel=7; + ACE_muzzleVelocities[]={713, 785, 810, 850}; + ACE_barrelLengths[]={12, 16, 20, 24}; + }; + class RH_68x43_B_Match: B_65x39_Caseless + { + ACE_caliber=0.277; + ACE_bulletLength=1.250; + ACE_bulletMass=135; + ACE_ammoTempMuzzleVelocityShifts[]={-26.55, -25.47, -22.85, -20.12, -16.98, -12.80, -7.64, -1.53, 5.96, 15.17, 26.19}; + ACE_ballisticCoefficients[]={0.253}; + ACE_velocityBoundaries[]={}; + ACE_standardAtmosphere="ICAO"; + ACE_dragModel=7; + ACE_muzzleVelocities[]={700, 732, 750, 780}; + ACE_barrelLengths[]={12, 16, 20, 24}; + }; + class RH_762x35_B_FMJ: B_65x39_Caseless + { + ACE_caliber=0.308; + ACE_bulletLength=1.118; + ACE_bulletMass=147; + ACE_ammoTempMuzzleVelocityShifts[]={-26.55, -25.47, -22.85, -20.12, -16.98, -12.80, -7.64, -1.53, 5.96, 15.17, 26.19}; + ACE_ballisticCoefficients[]={0.398}; + ACE_velocityBoundaries[]={}; + ACE_standardAtmosphere="ICAO"; + ACE_dragModel=1; + ACE_muzzleVelocities[]={559, 609, 625}; + ACE_barrelLengths[]={6, 16, 20}; + }; + class RH_762x35_B_Match: B_65x39_Caseless + { + ACE_caliber=0.308; + ACE_bulletLength=1.153; + ACE_bulletMass=125; + ACE_ammoTempMuzzleVelocityShifts[]={-26.55, -25.47, -22.85, -20.12, -16.98, -12.80, -7.64, -1.53, 5.96, 15.17, 26.19}; + ACE_ballisticCoefficients[]={0.349, 0.338, 0.330, 0.310}; + ACE_velocityBoundaries[]={792, 610, 488}; + ACE_standardAtmosphere="ICAO"; + ACE_dragModel=1; + ACE_muzzleVelocities[]={590, 650, 665}; + ACE_barrelLengths[]={6, 16, 20}; + }; + class RH_762x35_B_MSB: B_65x39_Caseless + { + ACE_caliber=0.308; + ACE_bulletLength=1.489; + ACE_bulletMass=220; + ACE_ammoTempMuzzleVelocityShifts[]={-26.55, -25.47, -22.85, -20.12, -16.98, -12.80, -7.64, -1.53, 5.96, 15.17, 26.19}; + ACE_ballisticCoefficients[]={0.608}; + ACE_velocityBoundaries[]={}; + ACE_standardAtmosphere="ICAO"; + ACE_dragModel=1; + ACE_muzzleVelocities[]={300, 320, 340}; + ACE_barrelLengths[]={9, 16, 20}; + }; + class RH_762x51_B_M80A1 : B_762x51_Ball + { + ACE_caliber=0.308; + ACE_bulletLength=1.14; + ACE_bulletMass=146; + ACE_ammoTempMuzzleVelocityShifts[]={-26.55, -25.47, -22.85, -20.12, -16.98, -12.80, -7.64, -1.53, 5.96, 15.17, 26.19}; + ACE_ballisticCoefficients[]={0.2}; + ACE_velocityBoundaries[]={}; + ACE_standardAtmosphere="ICAO"; + ACE_dragModel=7; + ACE_muzzleVelocities[]={700, 800, 820, 833, 845}; + ACE_barrelLengths[]={10, 16, 20, 24, 26}; + }; + class RH_762x51_B_Mk316LR : B_762x51_Ball + { + ACE_caliber=0.308; + ACE_bulletLength=1.24; + ACE_bulletMass=175; + ACE_ammoTempMuzzleVelocityShifts[]={-2.655, -2.547, -2.285, -2.012, -1.698, -1.280, -0.764, -0.153, 0.596, 1.517, 2.619}; + ACE_ballisticCoefficients[]={0.243}; + ACE_velocityBoundaries[]={}; + ACE_standardAtmosphere="ICAO"; + ACE_dragModel=7; + ACE_muzzleVelocities[]={750, 780, 790, 794}; + ACE_barrelLengths[]={16, 20, 24, 26}; + }; + class RH_762x51_B_Mk319 : B_762x51_Ball + { + ACE_caliber=0.308; + ACE_bulletLength=1.074; + ACE_bulletMass=130; + ACE_ammoTempMuzzleVelocityShifts[]={-26.55, -25.47, -22.85, -20.12, -16.98, -12.80, -7.64, -1.53, 5.96, 15.17, 26.19}; + ACE_ballisticCoefficients[]={0.277}; + ACE_velocityBoundaries[]={}; + ACE_standardAtmosphere="ICAO"; + ACE_dragModel=1; + ACE_muzzleVelocities[]={838, 892, 920}; + ACE_barrelLengths[]={13, 16, 20}; + }; + class RH_762x51_B_LFMJSB: B_762x51_Ball + { + ACE_caliber=0.308; + ACE_bulletLength=1.340; + ACE_bulletMass=200; + ACE_ammoTempMuzzleVelocityShifts[]={-2.655, -2.547, -2.285, -2.012, -1.698, -1.280, -0.764, -0.153, 0.596, 1.517, 2.619}; + ACE_ballisticCoefficients[]={0.252}; + ACE_velocityBoundaries[]={}; + ACE_standardAtmosphere="ICAO"; + ACE_dragModel=7; + ACE_muzzleVelocities[]={305, 325, 335, 340}; + ACE_barrelLengths[]={16, 20, 24, 26}; + }; + + class HLC_556NATO_SOST: BulletBase + { + ACE_caliber=0.224; + ACE_bulletLength=0.906; + ACE_bulletMass=62; + ACE_ammoTempMuzzleVelocityShifts[]={-26.55, -25.47, -22.85, -20.12, -16.98, -12.80, -7.64, -1.53, 5.96, 15.17, 26.19}; + ACE_ballisticCoefficients[]={0.307}; + ACE_velocityBoundaries[]={}; + ACE_standardAtmosphere="ASM"; + ACE_dragModel=1; + ACE_muzzleVelocities[]={780, 886, 950}; + ACE_barrelLengths[]={10, 15.5, 20}; + }; + class HLC_556NATO_SPR: BulletBase + { + ACE_caliber=0.224; + ACE_bulletLength=0.906; + ACE_bulletMass=77; + ACE_ammoTempMuzzleVelocityShifts[]={-26.55, -25.47, -22.85, -20.12, -16.98, -12.80, -7.64, -1.53, 5.96, 15.17, 26.19}; + ACE_ballisticCoefficients[]={0.361}; + ACE_velocityBoundaries[]={}; + ACE_standardAtmosphere="ASM"; + ACE_dragModel=1; + ACE_muzzleVelocities[]={624, 816, 832, 838}; + ACE_barrelLengths[]={7.5, 14.5, 18, 20}; + }; + class HLC_556NATO_EPR: BulletBase + { + ACE_caliber=0.224; + ACE_bulletLength=0.906; + ACE_bulletMass=62; + ACE_ammoTempMuzzleVelocityShifts[]={-27.20, -26.44, -23.76, -21.00, -17.54, -13.10, -7.95, -1.62, 6.24, 15.48, 27.75}; + ACE_ballisticCoefficients[]={0.152}; + ACE_velocityBoundaries[]={}; + ACE_standardAtmosphere="ASM"; + ACE_dragModel=7; + ACE_muzzleVelocities[]={723, 764, 796, 825, 843, 866, 878, 892, 906, 915, 922, 900}; + ACE_barrelLengths[]={8.3, 9.4, 10.6, 11.8, 13.0, 14.2, 15.4, 16.5, 17.7, 18.9, 20.0, 24.0}; + }; + class HLC_300Blackout_Ball: BulletBase + { + ACE_caliber=0.308; + ACE_bulletLength=1.118; + ACE_bulletMass=147; + ACE_ammoTempMuzzleVelocityShifts[]={-26.55, -25.47, -22.85, -20.12, -16.98, -12.80, -7.64, -1.53, 5.96, 15.17, 26.19}; + ACE_ballisticCoefficients[]={0.398}; + ACE_velocityBoundaries[]={}; + ACE_standardAtmosphere="ICAO"; + ACE_dragModel=1; + ACE_muzzleVelocities[]={559, 609, 625}; + ACE_barrelLengths[]={6, 16, 20}; + }; + class HLC_300Blackout_SMK: BulletBase + { + ACE_caliber=0.308; + ACE_bulletLength=1.489; + ACE_bulletMass=220; + ACE_ammoTempMuzzleVelocityShifts[]={-26.55, -25.47, -22.85, -20.12, -16.98, -12.80, -7.64, -1.53, 5.96, 15.17, 26.19}; + ACE_ballisticCoefficients[]={0.608}; + ACE_velocityBoundaries[]={}; + ACE_standardAtmosphere="ICAO"; + ACE_dragModel=1; + ACE_muzzleVelocities[]={300, 320, 340}; + ACE_barrelLengths[]={9, 16, 20}; + }; + class HLC_762x51_BTSub: BulletBase + { + ACE_caliber=0.308; + ACE_bulletLength=1.340; + ACE_bulletMass=200; + ACE_ammoTempMuzzleVelocityShifts[]={-2.655, -2.547, -2.285, -2.012, -1.698, -1.280, -0.764, -0.153, 0.596, 1.517, 2.619}; + ACE_ballisticCoefficients[]={0.235}; + ACE_velocityBoundaries[]={}; + ACE_standardAtmosphere="ICAO"; + ACE_dragModel=7; + ACE_muzzleVelocities[]={305, 325, 335, 340}; + ACE_barrelLengths[]={16, 20, 24, 26}; + }; + class HLC_762x54_ball: BulletBase + { + ACE_caliber=0.312; + ACE_bulletLength=1.14; + ACE_bulletMass=152; + ACE_ammoTempMuzzleVelocityShifts[]={-26.55, -25.47, -22.85, -20.12, -16.98, -12.80, -7.64, -1.53, 5.96, 15.17, 26.19}; + ACE_ballisticCoefficients[]={0.4}; + ACE_velocityBoundaries[]={}; + ACE_standardAtmosphere="ICAO"; + ACE_dragModel=1; + ACE_muzzleVelocities[]={700, 800, 820, 833}; + ACE_barrelLengths[]={16, 20, 24, 26}; + }; + class HLC_762x54_tracer: BulletBase + { + ACE_caliber=0.312; + ACE_bulletLength=1.14; + ACE_bulletMass=149; + ACE_ammoTempMuzzleVelocityShifts[]={-26.55, -25.47, -22.85, -20.12, -16.98, -12.80, -7.64, -1.53, 5.96, 15.17, 26.19}; + ACE_ballisticCoefficients[]={0.395}; + ACE_velocityBoundaries[]={}; + ACE_standardAtmosphere="ICAO"; + ACE_dragModel=1; + ACE_muzzleVelocities[]={680, 750, 798, 800}; + ACE_barrelLengths[]={16, 20, 24, 26}; + }; + class HLC_303Brit_B: BulletBase + { + ACE_caliber=0.311; + ACE_bulletLength=1.227; + ACE_bulletMass=174; + ACE_ammoTempMuzzleVelocityShifts[]={-26.55, -25.47, -22.85, -20.12, -16.98, -12.80, -7.64, -1.53, 5.96, 15.17, 26.19}; + ACE_ballisticCoefficients[]={0.499, 0.493, 0.48}; + ACE_velocityBoundaries[]={671, 549}; + ACE_standardAtmosphere="ASM"; + ACE_dragModel=1; + ACE_muzzleVelocities[]={748, 761, 765}; + ACE_barrelLengths[]={20, 24, 26}; + }; + class HLC_792x57_Ball: BulletBase + { + ACE_caliber=0.318; + ACE_bulletLength=1.128; + ACE_bulletMass=196; + ACE_ammoTempMuzzleVelocityShifts[]={-26.55, -25.47, -22.85, -20.12, -16.98, -12.80, -7.64, -1.53, 5.96, 15.17, 26.19}; + ACE_ballisticCoefficients[]={0.315}; + ACE_velocityBoundaries[]={}; + ACE_standardAtmosphere="ASM"; + ACE_dragModel=1; + ACE_muzzleVelocities[]={785, 800, 815}; + ACE_barrelLengths[]={20, 23.62, 26}; + }; + class FH_545x39_Ball: BulletBase + { + ACE_caliber=0.220; + ACE_bulletLength=0.85; + ACE_bulletMass=52.9; + ACE_ammoTempMuzzleVelocityShifts[]={-26.55, -25.47, -22.85, -20.12, -16.98, -12.80, -7.64, -1.53, 5.96, 15.17, 26.19}; + ACE_ballisticCoefficients[]={0.168}; + ACE_velocityBoundaries[]={}; + ACE_standardAtmosphere="ASM"; + ACE_dragModel=7; + ACE_muzzleVelocities[]={780, 880, 920}; + ACE_barrelLengths[]={10, 16.3, 20}; + }; + class FH_545x39_7u1: FH_545x39_Ball + { + ACE_bulletMass=80; + ACE_ammoTempMuzzleVelocityShifts[]={-2.655, -2.547, -2.285, -2.012, -1.698, -1.280, -0.764, -0.153, 0.596, 1.517, 2.619}; + ACE_muzzleVelocities[]={260, 303, 320}; + ACE_barrelLengths[]={10, 16.3, 20}; + }; + class HLC_9x19_Ball: BulletBase + { + ACE_caliber=0.355; + ACE_bulletLength=0.610; + ACE_bulletMass=124; + ACE_ammoTempMuzzleVelocityShifts[]={-2.655, -2.547, -2.285, -2.012, -1.698, -1.280, -0.764, -0.153, 0.596, 1.517, 2.619}; + ACE_ballisticCoefficients[]={0.165}; + ACE_velocityBoundaries[]={}; + ACE_standardAtmosphere="ASM"; + ACE_dragModel=1; + ACE_muzzleVelocities[]={340, 370, 400}; + ACE_barrelLengths[]={4, 5, 9}; + }; + class HLC_9x19_GoldDot: HLC_9x19_Ball + { + ACE_muzzleVelocities[]={350, 380, 420}; + }; + class HLC_9x19_Subsonic: HLC_9x19_Ball + { + ACE_muzzleVelocities[]={300, 320, 340}; + }; + class HLC_10mm_FMJ: HLC_9x19_Ball + { + ACE_caliber=0.5; + ACE_bulletLength=0.764; + ACE_bulletMass=165; + ACE_ammoTempMuzzleVelocityShifts[]={-2.655, -2.547, -2.285, -2.012, -1.698, -1.280, -0.764, -0.153, 0.596, 1.517, 2.619}; + ACE_ballisticCoefficients[]={0.189}; + ACE_velocityBoundaries[]={}; + ACE_standardAtmosphere="ASM"; + ACE_dragModel=1; + ACE_muzzleVelocities[]={360, 400, 430}; + ACE_barrelLengths[]={4, 4.61, 9}; + }; + class HLC_9x19_M882_SMG: HLC_9x19_Ball + { + ACE_caliber=0.355; + ACE_bulletLength=0.610; + ACE_bulletMass=124; + ACE_ammoTempMuzzleVelocityShifts[]={-2.655, -2.547, -2.285, -2.012, -1.698, -1.280, -0.764, -0.153, 0.596, 1.517, 2.619}; + ACE_ballisticCoefficients[]={0.165}; + ACE_velocityBoundaries[]={}; + ACE_standardAtmosphere="ASM"; + ACE_dragModel=1; + ACE_muzzleVelocities[]={340, 370, 400}; + ACE_barrelLengths[]={4, 5, 9}; + }; + + class M_mas_545x39_Ball_7N6M : BulletBase + { + ACE_caliber=0.220; + ACE_bulletLength=0.85; + ACE_bulletMass=52.9; + ACE_ammoTempMuzzleVelocityShifts[]={-26.55, -25.47, -22.85, -20.12, -16.98, -12.80, -7.64, -1.53, 5.96, 15.17, 26.19}; + ACE_ballisticCoefficients[]={0.168}; + ACE_velocityBoundaries[]={}; + ACE_standardAtmosphere="ASM"; + ACE_dragModel=7; + ACE_muzzleVelocities[]={780, 880, 920}; + ACE_barrelLengths[]={10, 16.3, 20}; + }; + class M_mas_545x39_Ball_7T3M : BulletBase + { + ACE_caliber=0.220; + ACE_bulletLength=0.85; + ACE_bulletMass=49.8; + ACE_ammoTempMuzzleVelocityShifts[]={-26.55, -25.47, -22.85, -20.12, -16.98, -12.80, -7.64, -1.53, 5.96, 15.17, 26.19}; + ACE_ballisticCoefficients[]={0.168}; + ACE_velocityBoundaries[]={}; + ACE_standardAtmosphere="ASM"; + ACE_dragModel=7; + ACE_muzzleVelocities[]={785, 883, 925}; + ACE_barrelLengths[]={10, 16.3, 20}; + }; + class B_mas_556x45_Ball_Mk262 : B_556x45_Ball + { + ACE_caliber=0.224; + ACE_bulletLength=0.906; + ACE_bulletMass=77; + ACE_ammoTempMuzzleVelocityShifts[]={-26.55, -25.47, -22.85, -20.12, -16.98, -12.80, -7.64, -1.53, 5.96, 15.17, 26.19}; + ACE_ballisticCoefficients[]={0.361}; + ACE_velocityBoundaries[]={}; + ACE_standardAtmosphere="ASM"; + ACE_dragModel=1; + ACE_muzzleVelocities[]={624, 816, 832, 838}; + ACE_barrelLengths[]={7.5, 14.5, 18, 20}; + }; + class B_mas_9x18_Ball_57N181S : BulletBase + { + ACE_caliber=0.365; + ACE_bulletLength=0.610; + ACE_bulletMass=92.6; + ACE_ammoTempMuzzleVelocityShifts[]={-2.655, -2.547, -2.285, -2.012, -1.698, -1.280, -0.764, -0.153, 0.596, 1.517, 2.619}; + ACE_ballisticCoefficients[]={0.125}; + ACE_velocityBoundaries[]={}; + ACE_standardAtmosphere="ASM"; + ACE_dragModel=1; + ACE_muzzleVelocities[]={298, 330, 350}; + ACE_barrelLengths[]={3.8, 5, 9}; + }; + class B_mas_9x21p_Ball: BulletBase + { + ACE_caliber=0.355; + ACE_bulletLength=0.610; + ACE_bulletMass=124; + ACE_ammoTempMuzzleVelocityShifts[]={-2.655, -2.547, -2.285, -2.012, -1.698, -1.280, -0.764, -0.153, 0.596, 1.517, 2.619}; + ACE_ballisticCoefficients[]={0.165}; + ACE_velocityBoundaries[]={}; + ACE_standardAtmosphere="ASM"; + ACE_dragModel=1; + ACE_muzzleVelocities[]={340, 370, 400}; + ACE_barrelLengths[]={4, 5, 9}; + }; + class B_mas_9x21_Ball: BulletBase + { + ACE_caliber=0.355; + ACE_bulletLength=0.610; + ACE_bulletMass=124; + ACE_ammoTempMuzzleVelocityShifts[]={-2.655, -2.547, -2.285, -2.012, -1.698, -1.280, -0.764, -0.153, 0.596, 1.517, 2.619}; + ACE_ballisticCoefficients[]={0.165}; + ACE_velocityBoundaries[]={}; + ACE_standardAtmosphere="ASM"; + ACE_dragModel=1; + ACE_muzzleVelocities[]={340, 370, 400}; + ACE_barrelLengths[]={4, 5, 9}; + }; + class B_mas_9x21d_Ball: BulletBase + { + ACE_caliber=0.355; + ACE_bulletLength=0.610; + ACE_bulletMass=124; + ACE_ammoTempMuzzleVelocityShifts[]={-2.655, -2.547, -2.285, -2.012, -1.698, -1.280, -0.764, -0.153, 0.596, 1.517, 2.619}; + ACE_ballisticCoefficients[]={0.165}; + ACE_velocityBoundaries[]={}; + ACE_standardAtmosphere="ASM"; + ACE_dragModel=1; + ACE_muzzleVelocities[]={210, 250, 285}; + ACE_barrelLengths[]={4, 5, 9}; + }; + class B_mas_765x17_Ball: BulletBase + { + ACE_caliber=0.3125; + ACE_bulletLength=0.610; + ACE_bulletMass=65; + ACE_ammoTempMuzzleVelocityShifts[]={-2.655, -2.547, -2.285, -2.012, -1.698, -1.280, -0.764, -0.153, 0.596, 1.517, 2.619}; + ACE_ballisticCoefficients[]={0.118}; + ACE_velocityBoundaries[]={}; + ACE_standardAtmosphere="ASM"; + ACE_dragModel=1; + ACE_muzzleVelocities[]={282, 300, 320}; + ACE_barrelLengths[]={4, 5, 9}; + }; + class B_mas_762x39_Ball: BulletBase + { + ACE_caliber=0.308; + ACE_bulletLength=1.14; + ACE_bulletMass=123; + ACE_ammoTempMuzzleVelocityShifts[]={-26.55, -25.47, -22.85, -20.12, -16.98, -12.80, -7.64, -1.53, 5.96, 15.17, 26.19}; + ACE_ballisticCoefficients[]={0.275}; + ACE_velocityBoundaries[]={}; + ACE_standardAtmosphere="ICAO"; + ACE_dragModel=1; + ACE_muzzleVelocities[]={650, 716, 750}; + ACE_barrelLengths[]={10, 16.3, 20}; + }; + class B_mas_762x39_Ball_T: BulletBase + { + ACE_caliber=0.308; + ACE_bulletLength=1.14; + ACE_bulletMass=117; + ACE_ammoTempMuzzleVelocityShifts[]={-26.55, -25.47, -22.85, -20.12, -16.98, -12.80, -7.64, -1.53, 5.96, 15.17, 26.19}; + ACE_ballisticCoefficients[]={0.275}; + ACE_velocityBoundaries[]={}; + ACE_standardAtmosphere="ICAO"; + ACE_dragModel=1; + ACE_muzzleVelocities[]={650, 716, 750}; + ACE_barrelLengths[]={10, 16.3, 20}; + }; + class B_mas_762x51_Ball_M118LR : B_762x51_Ball + { + ACE_caliber=0.308; + ACE_bulletLength=1.24; + ACE_bulletMass=175; + ACE_ammoTempMuzzleVelocityShifts[]={-26.55, -25.47, -22.85, -20.12, -16.98, -12.80, -7.64, -1.53, 5.96, 15.17, 26.19}; + ACE_ballisticCoefficients[]={0.505, 0.496, 0.485, 0.485, 0.485}; + ACE_velocityBoundaries[]={853, 549, 549, 549}; + ACE_standardAtmosphere="ICAO"; + ACE_dragModel=1; + ACE_muzzleVelocities[]={750, 780, 790, 794}; + ACE_barrelLengths[]={16, 20, 24, 26}; + }; + class B_mas_762x67_Ball_Mk248_Mod_0 : B_762x51_Ball + { + ACE_caliber=0.308; + ACE_bulletLength=1.353; + ACE_bulletMass=190; + ACE_ammoTempMuzzleVelocityShifts[]={-26.55, -25.47, -22.85, -20.12, -16.98, -12.80, -7.64, -1.53, 5.96, 15.17, 26.19}; + ACE_ballisticCoefficients[]={0.268}; + ACE_velocityBoundaries[]={}; + ACE_standardAtmosphere="ICAO"; + ACE_dragModel=7; + ACE_muzzleVelocities[]={865, 900, 924}; + ACE_barrelLengths[]={20, 24, 26}; + }; + class B_mas_762x67_Ball_Mk248_Mod_1 : B_762x51_Ball + { + ACE_caliber=0.308; + ACE_bulletLength=1.489; + ACE_bulletMass=220; + ACE_ammoTempMuzzleVelocityShifts[]={-26.55, -25.47, -22.85, -20.12, -16.98, -12.80, -7.64, -1.53, 5.96, 15.17, 26.19}; + ACE_ballisticCoefficients[]={0.310}; + ACE_velocityBoundaries[]={}; + ACE_standardAtmosphere="ICAO"; + ACE_dragModel=7; + ACE_muzzleVelocities[]={820, 867, 900}; + ACE_barrelLengths[]={20, 24, 26}; + }; + class B_mas_762x67_Ball_Berger_Hybrid_OTM : B_762x51_Ball + { + ACE_caliber=0.308; + ACE_bulletLength=1.602; + ACE_bulletMass=230; + ACE_ammoTempMuzzleVelocityShifts[]={-26.55, -25.47, -22.85, -20.12, -16.98, -12.80, -7.64, -1.53, 5.96, 15.17, 26.19}; + ACE_ballisticCoefficients[]={0.368}; + ACE_velocityBoundaries[]={}; + ACE_standardAtmosphere="ICAO"; + ACE_dragModel=7; + ACE_muzzleVelocities[]={800, 853, 884}; + ACE_barrelLengths[]={20, 24, 26}; + }; + class B_mas_762x54_Ball : BulletBase + { + ACE_caliber=0.312; + ACE_bulletLength=1.14; + ACE_bulletMass=152; + ACE_ammoTempMuzzleVelocityShifts[]={-26.55, -25.47, -22.85, -20.12, -16.98, -12.80, -7.64, -1.53, 5.96, 15.17, 26.19}; + ACE_ballisticCoefficients[]={0.4}; + ACE_velocityBoundaries[]={}; + ACE_standardAtmosphere="ICAO"; + ACE_dragModel=1; + ACE_muzzleVelocities[]={700, 800, 820, 833}; + ACE_barrelLengths[]={16, 20, 24, 26}; + }; + class B_mas_762x54_Ball_T : BulletBase + { + ACE_caliber=0.312; + ACE_bulletLength=1.14; + ACE_bulletMass=149; + ACE_ammoTempMuzzleVelocityShifts[]={-26.55, -25.47, -22.85, -20.12, -16.98, -12.80, -7.64, -1.53, 5.96, 15.17, 26.19}; + ACE_ballisticCoefficients[]={0.395}; + ACE_velocityBoundaries[]={}; + ACE_standardAtmosphere="ICAO"; + ACE_dragModel=1; + ACE_muzzleVelocities[]={680, 750, 798, 800}; + ACE_barrelLengths[]={16, 20, 24, 26}; + }; + class BWA3_B_762x51_Ball_LR : BulletBase + { + ACE_caliber=0.308; + ACE_bulletLength=1.24; + ACE_bulletMass=175; + ACE_ammoTempMuzzleVelocityShifts[]={-26.55, -25.47, -22.85, -20.12, -16.98, -12.80, -7.64, -1.53, 5.96, 15.17, 26.19}; + ACE_ballisticCoefficients[]={0.505, 0.496, 0.485, 0.485, 0.485}; + ACE_velocityBoundaries[]={853, 549, 549, 549}; + ACE_standardAtmosphere="ICAO"; + ACE_dragModel=1; + ACE_muzzleVelocities[]={750, 780, 790, 794}; + ACE_barrelLengths[]={16, 20, 24, 26}; + }; + class BWA3_B_762x51_Ball_SD : BulletBase + { + ACE_caliber=0.308; + ACE_bulletLength=1.24; + ACE_bulletMass=175; + ACE_ammoTempMuzzleVelocityShifts[]={-2.655, -2.547, -2.285, -2.012, -1.698, -1.280, -0.764, -0.153, 0.596, 1.517, 2.619}; + ACE_ballisticCoefficients[]={0.2}; + ACE_velocityBoundaries[]={}; + ACE_standardAtmosphere="ICAO"; + ACE_dragModel=7; + ACE_muzzleVelocities[]={300, 340}; + ACE_barrelLengths[]={16, 24}; + }; + + class BWA3_B_46x30_Ball : BulletBase + { + ACE_caliber=0.193; + ACE_bulletLength=0.512; + ACE_bulletMass=31; + ACE_ammoTempMuzzleVelocityShifts[]={-26.55, -25.47, -22.85, -20.12, -16.98, -12.80, -7.64, -1.53, 5.96, 15.17, 26.19}; + ACE_ballisticCoefficients[]={0.1455}; + ACE_velocityBoundaries[]={}; + ACE_standardAtmosphere="ICAO"; + ACE_dragModel=1; + ACE_muzzleVelocities[]={680, 720, 730, 740}; + ACE_barrelLengths[]={4, 7, 9, 12}; + }; + + class Trixie_338_Ball : BulletBase + { + ACE_caliber=0.338; + ACE_bulletLength=1.70; + ACE_bulletMass=300; + ACE_ammoTempMuzzleVelocityShifts[]={-26.55, -25.47, -22.85, -20.12, -16.98, -12.80, -7.64, -1.53, 5.96, 15.17, 26.19}; + ACE_ballisticCoefficients[]={0.381}; + ACE_velocityBoundaries[]={}; + ACE_standardAtmosphere="ICAO"; + ACE_dragModel=7; + ACE_muzzleVelocities[]={820, 826, 830}; + ACE_barrelLengths[]={24, 26.5, 28}; + }; + class Trixie_303_Ball : BulletBase + { + ACE_caliber=0.311; + ACE_bulletLength=1.227; + ACE_bulletMass=174; + ACE_ammoTempMuzzleVelocityShifts[]={-26.55, -25.47, -22.85, -20.12, -16.98, -12.80, -7.64, -1.53, 5.96, 15.17, 26.19}; + ACE_ballisticCoefficients[]={0.499, 0.493, 0.48}; + ACE_velocityBoundaries[]={671, 549}; + ACE_standardAtmosphere="ASM"; + ACE_dragModel=1; + ACE_muzzleVelocities[]={748, 761, 765}; + ACE_barrelLengths[]={20, 24, 26}; + }; + + class rhs_ammo_556x45_Mk318_Ball : BulletBase + { + ACE_caliber=0.224; + ACE_bulletLength=0.906; + ACE_bulletMass=62; + ACE_ammoTempMuzzleVelocityShifts[]={-26.55, -25.47, -22.85, -20.12, -16.98, -12.80, -7.64, -1.53, 5.96, 15.17, 26.19}; + ACE_ballisticCoefficients[]={0.307}; + ACE_velocityBoundaries[]={}; + ACE_standardAtmosphere="ASM"; + ACE_dragModel=1; + ACE_muzzleVelocities[]={780, 886, 950}; + ACE_barrelLengths[]={10, 15.5, 20}; + }; + class rhs_ammo_556x45_Mk262_Ball : BulletBase + { + ACE_caliber=0.224; + ACE_bulletLength=0.906; + ACE_bulletMass=77; + ACE_ammoTempMuzzleVelocityShifts[]={-26.55, -25.47, -22.85, -20.12, -16.98, -12.80, -7.64, -1.53, 5.96, 15.17, 26.19}; + ACE_ballisticCoefficients[]={0.361}; + ACE_velocityBoundaries[]={}; + ACE_standardAtmosphere="ASM"; + ACE_dragModel=1; + ACE_muzzleVelocities[]={624, 816, 832, 838}; + ACE_barrelLengths[]={7.5, 14.5, 18, 20}; + }; + class rhsammo_762x51_Ball : BulletBase + { + ACE_caliber=0.308; + ACE_bulletLength=1.14; + ACE_bulletMass=146; + ACE_ammoTempMuzzleVelocityShifts[]={-26.55, -25.47, -22.85, -20.12, -16.98, -12.80, -7.64, -1.53, 5.96, 15.17, 26.19}; + ACE_ballisticCoefficients[]={0.2}; + ACE_velocityBoundaries[]={}; + ACE_standardAtmosphere="ICAO"; + ACE_dragModel=7; + ACE_muzzleVelocities[]={700, 800, 820, 833, 845}; + ACE_barrelLengths[]={10, 16, 20, 24, 26}; + }; + class rhs_B_545x39_Ball : BulletBase + { + ACE_caliber=0.220; + ACE_bulletLength=0.85; + ACE_bulletMass=52.9; + ACE_ammoTempMuzzleVelocityShifts[]={-26.55, -25.47, -22.85, -20.12, -16.98, -12.80, -7.64, -1.53, 5.96, 15.17, 26.19}; + ACE_ballisticCoefficients[]={0.168}; + ACE_velocityBoundaries[]={}; + ACE_standardAtmosphere="ASM"; + ACE_dragModel=7; + ACE_muzzleVelocities[]={780, 880, 920}; + ACE_barrelLengths[]={10, 16.3, 20}; + }; + class rhs_B_545x39_Ball_Tracer_Green : BulletBase + { + ACE_caliber=0.220; + ACE_bulletLength=0.85; + ACE_bulletMass=49.8; + ACE_ammoTempMuzzleVelocityShifts[]={-26.55, -25.47, -22.85, -20.12, -16.98, -12.80, -7.64, -1.53, 5.96, 15.17, 26.19}; + ACE_ballisticCoefficients[]={0.168}; + ACE_velocityBoundaries[]={}; + ACE_standardAtmosphere="ASM"; + ACE_dragModel=7; + ACE_muzzleVelocities[]={785, 883, 925}; + ACE_barrelLengths[]={10, 16.3, 20}; + }; + class rhs_ammo_762x51_M118_Special_Ball : BulletBase + { + ACE_caliber=0.308; + ACE_bulletLength=1.24; + ACE_bulletMass=175; + ACE_ammoTempMuzzleVelocityShifts[]={-26.55, -25.47, -22.85, -20.12, -16.98, -12.80, -7.64, -1.53, 5.96, 15.17, 26.19}; + ACE_ballisticCoefficients[]={0.243}; + ACE_velocityBoundaries[]={}; + ACE_standardAtmosphere="ICAO"; + ACE_dragModel=7; + ACE_muzzleVelocities[]={750, 780, 790, 794}; + ACE_barrelLengths[]={16, 20, 24, 26}; + }; + class rhs_B_762x54_Ball : BulletBase + { + ACE_caliber=0.312; + ACE_bulletLength=1.14; + ACE_bulletMass=152; + ACE_ammoTempMuzzleVelocityShifts[]={-26.55, -25.47, -22.85, -20.12, -16.98, -12.80, -7.64, -1.53, 5.96, 15.17, 26.19}; + ACE_ballisticCoefficients[]={0.4}; + ACE_velocityBoundaries[]={}; + ACE_standardAtmosphere="ICAO"; + ACE_dragModel=1; + ACE_muzzleVelocities[]={700, 800, 820, 833}; + ACE_barrelLengths[]={16, 20, 24, 26}; + }; + class rhs_B_762x54_Ball_Tracer_Green : BulletBase + { + ACE_caliber=0.312; + ACE_bulletLength=1.14; + ACE_bulletMass=149; + ACE_ammoTempMuzzleVelocityShifts[]={-26.55, -25.47, -22.85, -20.12, -16.98, -12.80, -7.64, -1.53, 5.96, 15.17, 26.19}; + ACE_ballisticCoefficients[]={0.395}; + ACE_velocityBoundaries[]={}; + ACE_standardAtmosphere="ICAO"; + ACE_dragModel=1; + ACE_muzzleVelocities[]={680, 750, 798, 800}; + ACE_barrelLengths[]={16, 20, 24, 26}; + }; + class rhs_B_762x39_Ball : BulletBase + { + ACE_caliber=0.308; + ACE_bulletLength=1.14; + ACE_bulletMass=123; + ACE_ammoTempMuzzleVelocityShifts[]={-26.55, -25.47, -22.85, -20.12, -16.98, -12.80, -7.64, -1.53, 5.96, 15.17, 26.19}; + ACE_ballisticCoefficients[]={0.275}; + ACE_velocityBoundaries[]={}; + ACE_standardAtmosphere="ICAO"; + ACE_dragModel=1; + ACE_muzzleVelocities[]={650, 716, 750}; + ACE_barrelLengths[]={10, 16.3, 20}; + }; + class rhs_B_762x39_Tracer : BulletBase + { + ACE_caliber=0.308; + ACE_bulletLength=1.14; + ACE_bulletMass=117; + ACE_ammoTempMuzzleVelocityShifts[]={-26.55, -25.47, -22.85, -20.12, -16.98, -12.80, -7.64, -1.53, 5.96, 15.17, 26.19}; + ACE_ballisticCoefficients[]={0.275}; + ACE_velocityBoundaries[]={}; + ACE_standardAtmosphere="ICAO"; + ACE_dragModel=1; + ACE_muzzleVelocities[]={650, 716, 750}; + ACE_barrelLengths[]={10, 16.3, 20}; + }; + class rhs_ammo_762x51_M80_Ball : BulletBase + { + ACE_caliber=0.308; + ACE_bulletLength=1.14; + ACE_bulletMass=146; + ACE_ammoTempMuzzleVelocityShifts[]={-26.55, -25.47, -22.85, -20.12, -16.98, -12.80, -7.64, -1.53, 5.96, 15.17, 26.19}; + ACE_ballisticCoefficients[]={0.2}; + ACE_velocityBoundaries[]={}; + ACE_standardAtmosphere="ICAO"; + ACE_dragModel=7; + ACE_muzzleVelocities[]={700, 800, 820, 833, 845}; + ACE_barrelLengths[]={10, 16, 20, 24, 26}; + }; + class rhsusf_B_300winmag : BulletBase + { + ACE_caliber=0.308; + ACE_bulletLength=1.489; + ACE_bulletMass=220; + ACE_ammoTempMuzzleVelocityShifts[]={-26.55, -25.47, -22.85, -20.12, -16.98, -12.80, -7.64, -1.53, 5.96, 15.17, 26.19}; + ACE_ballisticCoefficients[]={0.310}; + ACE_velocityBoundaries[]={}; + ACE_standardAtmosphere="ICAO"; + ACE_dragModel=7; + ACE_muzzleVelocities[]={847, 867, 877}; + ACE_barrelLengths[]={20, 24, 26}; + }; + + class R3F_9x19_Ball: BulletBase + { + ACE_caliber=0.355; + ACE_bulletLength=0.610; + ACE_bulletMass=124; + ACE_ammoTempMuzzleVelocityShifts[]={-2.655, -2.547, -2.285, -2.012, -1.698, -1.280, -0.764, -0.153, 0.596, 1.517, 2.619}; + ACE_ballisticCoefficients[]={0.165}; + ACE_velocityBoundaries[]={}; + ACE_standardAtmosphere="ASM"; + ACE_dragModel=1; + ACE_muzzleVelocities[]={340, 370, 400}; + ACE_barrelLengths[]={4, 5, 9}; + }; + class R3F_556x45_Ball: BulletBase + { + ACE_caliber=0.224; + ACE_bulletLength=0.906; + ACE_bulletMass=62; + ACE_ammoTempMuzzleVelocityShifts[]={-27.20, -26.44, -23.76, -21.00, -17.54, -13.10, -7.95, -1.62, 6.24, 15.48, 27.75}; + ACE_ballisticCoefficients[]={0.151}; + ACE_velocityBoundaries[]={}; + ACE_standardAtmosphere="ASM"; + ACE_dragModel=7; + ACE_muzzleVelocities[]={723, 764, 796, 825, 843, 866, 878, 892, 906, 915, 922, 900}; + ACE_barrelLengths[]={8.3, 9.4, 10.6, 11.8, 13.0, 14.2, 15.4, 16.5, 17.7, 18.9, 20.0, 24.0}; + }; + class R3F_762x51_Ball: BulletBase + { + ACE_caliber=0.308; + ACE_bulletLength=1.14; + ACE_bulletMass=146; + ACE_ammoTempMuzzleVelocityShifts[]={-26.55, -25.47, -22.85, -20.12, -16.98, -12.80, -7.64, -1.53, 5.96, 15.17, 26.19}; + ACE_ballisticCoefficients[]={0.2}; + ACE_velocityBoundaries[]={}; + ACE_standardAtmosphere="ICAO"; + ACE_dragModel=7; + ACE_muzzleVelocities[]={700, 800, 820, 833, 845}; + ACE_barrelLengths[]={10, 16, 20, 24, 26}; + }; + class R3F_762x51_Ball2: BulletBase + { + ACE_caliber=0.308; + ACE_bulletLength=1.24; + ACE_bulletMass=175; + ACE_ammoTempMuzzleVelocityShifts[]={-26.55, -25.47, -22.85, -20.12, -16.98, -12.80, -7.64, -1.53, 5.96, 15.17, 26.19}; + ACE_ballisticCoefficients[]={0.505, 0.496, 0.485, 0.485, 0.485}; + ACE_velocityBoundaries[]={853, 549, 549, 549}; + ACE_standardAtmosphere="ICAO"; + ACE_dragModel=1; + ACE_muzzleVelocities[]={750, 780, 790, 794}; + ACE_barrelLengths[]={16, 20, 24, 26}; + }; + class R3F_127x99_Ball: BulletBase + { + ACE_caliber=0.510; + ACE_bulletLength=2.310; + ACE_bulletMass=647; + ACE_ammoTempMuzzleVelocityShifts[]={-26.55, -25.47, -22.85, -20.12, -16.98, -12.80, -7.64, -1.53, 5.96, 15.17, 26.19}; + ACE_ballisticCoefficients[]={0.670}; + ACE_velocityBoundaries[]={}; + ACE_standardAtmosphere="ASM"; + ACE_dragModel=1; + ACE_muzzleVelocities[]={853}; + ACE_barrelLengths[]={29}; + }; + class R3F_127x99_Ball2: BulletBase + { + ACE_caliber=0.510; + ACE_bulletLength=2.310; + ACE_bulletMass=647; + ACE_ammoTempMuzzleVelocityShifts[]={-26.55, -25.47, -22.85, -20.12, -16.98, -12.80, -7.64, -1.53, 5.96, 15.17, 26.19}; + ACE_ballisticCoefficients[]={0.670}; + ACE_velocityBoundaries[]={}; + ACE_standardAtmosphere="ASM"; + ACE_dragModel=1; + ACE_muzzleVelocities[]={853}; + ACE_barrelLengths[]={29}; + }; + + class CUP_B_545x39_Ball: BulletBase + { + ACE_caliber=0.220; + ACE_bulletLength=0.85; + ACE_bulletMass=52.9; + ACE_ammoTempMuzzleVelocityShifts[]={-26.55, -25.47, -22.85, -20.12, -16.98, -12.80, -7.64, -1.53, 5.96, 15.17, 26.19}; + ACE_ballisticCoefficients[]={0.168}; + ACE_velocityBoundaries[]={}; + ACE_standardAtmosphere="ASM"; + ACE_dragModel=7; + ACE_muzzleVelocities[]={780, 880, 920}; + ACE_barrelLengths[]={10, 16.3, 20}; + }; + class CUP_B_545x39_Ball_Tracer_Green: BulletBase + { + ACE_caliber=0.220; + ACE_bulletLength=0.85; + ACE_bulletMass=49.8; + ACE_ammoTempMuzzleVelocityShifts[]={-26.55, -25.47, -22.85, -20.12, -16.98, -12.80, -7.64, -1.53, 5.96, 15.17, 26.19}; + ACE_ballisticCoefficients[]={0.168}; + ACE_velocityBoundaries[]={}; + ACE_standardAtmosphere="ASM"; + ACE_dragModel=7; + ACE_muzzleVelocities[]={785, 883, 925}; + ACE_barrelLengths[]={10, 16.3, 20}; + }; + class CUP_B_545x39_Ball_Tracer_Red: BulletBase + { + ACE_caliber=0.220; + ACE_bulletLength=0.85; + ACE_bulletMass=49.8; + ACE_ammoTempMuzzleVelocityShifts[]={-26.55, -25.47, -22.85, -20.12, -16.98, -12.80, -7.64, -1.53, 5.96, 15.17, 26.19}; + ACE_ballisticCoefficients[]={0.168}; + ACE_velocityBoundaries[]={}; + ACE_standardAtmosphere="ASM"; + ACE_dragModel=7; + ACE_muzzleVelocities[]={785, 883, 925}; + ACE_barrelLengths[]={10, 16.3, 20}; + }; + class CUP_B_545x39_Ball_Tracer_White: BulletBase + { + ACE_caliber=0.220; + ACE_bulletLength=0.85; + ACE_bulletMass=49.8; + ACE_ammoTempMuzzleVelocityShifts[]={-26.55, -25.47, -22.85, -20.12, -16.98, -12.80, -7.64, -1.53, 5.96, 15.17, 26.19}; + ACE_ballisticCoefficients[]={0.168}; + ACE_velocityBoundaries[]={}; + ACE_standardAtmosphere="ASM"; + ACE_dragModel=7; + ACE_muzzleVelocities[]={785, 883, 925}; + ACE_barrelLengths[]={10, 16.3, 20}; + }; + class CUP_B_545x39_Ball_Tracer_Yellow: BulletBase + { + ACE_caliber=0.220; + ACE_bulletLength=0.85; + ACE_bulletMass=49.8; + ACE_ammoTempMuzzleVelocityShifts[]={-26.55, -25.47, -22.85, -20.12, -16.98, -12.80, -7.64, -1.53, 5.96, 15.17, 26.19}; + ACE_ballisticCoefficients[]={0.168}; + ACE_velocityBoundaries[]={}; + ACE_standardAtmosphere="ASM"; + ACE_dragModel=7; + ACE_muzzleVelocities[]={785, 883, 925}; + ACE_barrelLengths[]={10, 16.3, 20}; + }; + class CUP_B_762x39_Ball: BulletBase + { + ACE_caliber=0.308; + ACE_bulletLength=1.14; + ACE_bulletMass=123; + ACE_ammoTempMuzzleVelocityShifts[]={-26.55, -25.47, -22.85, -20.12, -16.98, -12.80, -7.64, -1.53, 5.96, 15.17, 26.19}; + ACE_ballisticCoefficients[]={0.275}; + ACE_velocityBoundaries[]={}; + ACE_standardAtmosphere="ICAO"; + ACE_dragModel=1; + ACE_muzzleVelocities[]={650, 716, 750}; + ACE_barrelLengths[]={10, 16.3, 20}; + }; + class CUP_B_762x39_Ball_Tracer_Green: BulletBase + { + ACE_caliber=0.308; + ACE_bulletLength=1.14; + ACE_bulletMass=117; + ACE_ammoTempMuzzleVelocityShifts[]={-26.55, -25.47, -22.85, -20.12, -16.98, -12.80, -7.64, -1.53, 5.96, 15.17, 26.19}; + ACE_ballisticCoefficients[]={0.275}; + ACE_velocityBoundaries[]={}; + ACE_standardAtmosphere="ICAO"; + ACE_dragModel=1; + ACE_muzzleVelocities[]={650, 716, 750}; + ACE_barrelLengths[]={10, 16.3, 20}; + }; + class B_762x39mm_KLT: BulletBase + { + ACE_caliber=0.308; + ACE_bulletLength=1.14; + ACE_bulletMass=123; + ACE_ammoTempMuzzleVelocityShifts[]={-26.55, -25.47, -22.85, -20.12, -16.98, -12.80, -7.64, -1.53, 5.96, 15.17, 26.19}; + ACE_ballisticCoefficients[]={0.275}; + ACE_velocityBoundaries[]={}; + ACE_standardAtmosphere="ICAO"; + ACE_dragModel=1; + ACE_muzzleVelocities[]={650, 716, 750}; + ACE_barrelLengths[]={10, 16.3, 20}; + }; + class CUP_B_9x18_Ball: BulletBase + { + ACE_caliber=0.365; + ACE_bulletLength=0.610; + ACE_bulletMass=92.6; + ACE_ammoTempMuzzleVelocityShifts[]={-2.655, -2.547, -2.285, -2.012, -1.698, -1.280, -0.764, -0.153, 0.596, 1.517, 2.619}; + ACE_ballisticCoefficients[]={0.125}; + ACE_velocityBoundaries[]={}; + ACE_standardAtmosphere="ASM"; + ACE_dragModel=1; + ACE_muzzleVelocities[]={298, 330, 350}; + ACE_barrelLengths[]={3.8, 5, 9}; + }; + class CUP_B_9x18_Ball_Tracer_Green: BulletBase + { + ACE_caliber=0.365; + ACE_bulletLength=0.610; + ACE_bulletMass=92.6; + ACE_ammoTempMuzzleVelocityShifts[]={-2.655, -2.547, -2.285, -2.012, -1.698, -1.280, -0.764, -0.153, 0.596, 1.517, 2.619}; + ACE_ballisticCoefficients[]={0.125}; + ACE_velocityBoundaries[]={}; + ACE_standardAtmosphere="ASM"; + ACE_dragModel=1; + ACE_muzzleVelocities[]={298, 330, 350}; + ACE_barrelLengths[]={3.8, 5, 9}; + }; + class CUP_B_9x18_Ball_Tracer_Red: BulletBase + { + ACE_caliber=0.365; + ACE_bulletLength=0.610; + ACE_bulletMass=92.6; + ACE_ammoTempMuzzleVelocityShifts[]={-2.655, -2.547, -2.285, -2.012, -1.698, -1.280, -0.764, -0.153, 0.596, 1.517, 2.619}; + ACE_ballisticCoefficients[]={0.125}; + ACE_velocityBoundaries[]={}; + ACE_standardAtmosphere="ASM"; + ACE_dragModel=1; + ACE_muzzleVelocities[]={298, 330, 350}; + ACE_barrelLengths[]={3.8, 5, 9}; + }; + class CUP_B_9x18_Ball_Tracer_Yellow: BulletBase + { + ACE_caliber=0.365; + ACE_bulletLength=0.610; + ACE_bulletMass=92.6; + ACE_ammoTempMuzzleVelocityShifts[]={-2.655, -2.547, -2.285, -2.012, -1.698, -1.280, -0.764, -0.153, 0.596, 1.517, 2.619}; + ACE_ballisticCoefficients[]={0.125}; + ACE_velocityBoundaries[]={}; + ACE_standardAtmosphere="ASM"; + ACE_dragModel=1; + ACE_muzzleVelocities[]={298, 330, 350}; + ACE_barrelLengths[]={3.8, 5, 9}; + }; + class CUP_B_9x18_Ball_White_Tracer: BulletBase + { + ACE_caliber=0.365; + ACE_bulletLength=0.610; + ACE_bulletMass=92.6; + ACE_ammoTempMuzzleVelocityShifts[]={-2.655, -2.547, -2.285, -2.012, -1.698, -1.280, -0.764, -0.153, 0.596, 1.517, 2.619}; + ACE_ballisticCoefficients[]={0.125}; + ACE_velocityBoundaries[]={}; + ACE_standardAtmosphere="ASM"; + ACE_dragModel=1; + ACE_muzzleVelocities[]={298, 330, 350}; + ACE_barrelLengths[]={3.8, 5, 9}; + }; + class CUP_B_9x19_Ball: BulletBase + { + ACE_caliber=0.355; + ACE_bulletLength=0.610; + ACE_bulletMass=124; + ACE_ammoTempMuzzleVelocityShifts[]={-2.655, -2.547, -2.285, -2.012, -1.698, -1.280, -0.764, -0.153, 0.596, 1.517, 2.619}; + ACE_ballisticCoefficients[]={0.165}; + ACE_velocityBoundaries[]={}; + ACE_standardAtmosphere="ASM"; + ACE_dragModel=1; + ACE_muzzleVelocities[]={340, 370, 400}; + ACE_barrelLengths[]={4, 5, 9}; + }; + class CUP_B_762x51_noTracer: BulletBase + { + ACE_caliber=0.308; + ACE_bulletLength=1.14; + ACE_bulletMass=146; + ACE_ammoTempMuzzleVelocityShifts[]={-26.55, -25.47, -22.85, -20.12, -16.98, -12.80, -7.64, -1.53, 5.96, 15.17, 26.19}; + ACE_ballisticCoefficients[]={0.2}; + ACE_velocityBoundaries[]={}; + ACE_standardAtmosphere="ICAO"; + ACE_dragModel=7; + ACE_muzzleVelocities[]={700, 800, 820, 833, 845}; + ACE_barrelLengths[]={10, 16, 20, 24, 26}; + }; + class CUP_B_762x51_Red_Tracer_3RndBurst: BulletBase + { + ACE_caliber=0.308; + ACE_bulletLength=1.14; + ACE_bulletMass=146; + ACE_ammoTempMuzzleVelocityShifts[]={-26.55, -25.47, -22.85, -20.12, -16.98, -12.80, -7.64, -1.53, 5.96, 15.17, 26.19}; + ACE_ballisticCoefficients[]={0.2}; + ACE_velocityBoundaries[]={}; + ACE_standardAtmosphere="ICAO"; + ACE_dragModel=7; + ACE_muzzleVelocities[]={700, 800, 820, 833, 845}; + ACE_barrelLengths[]={10, 16, 20, 24, 26}; + }; + class CUP_B_762x51_White_Tracer_3RndBurst: BulletBase + { + ACE_caliber=0.308; + ACE_bulletLength=1.14; + ACE_bulletMass=146; + ACE_ammoTempMuzzleVelocityShifts[]={-26.55, -25.47, -22.85, -20.12, -16.98, -12.80, -7.64, -1.53, 5.96, 15.17, 26.19}; + ACE_ballisticCoefficients[]={0.2}; + ACE_velocityBoundaries[]={}; + ACE_standardAtmosphere="ICAO"; + ACE_dragModel=7; + ACE_muzzleVelocities[]={700, 800, 820, 833, 845}; + ACE_barrelLengths[]={10, 16, 20, 24, 26}; + }; + class CUP_B_303_Ball: BulletBase + { + ACE_caliber=0.311; + ACE_bulletLength=1.227; + ACE_bulletMass=174; + ACE_ammoTempMuzzleVelocityShifts[]={-26.55, -25.47, -22.85, -20.12, -16.98, -12.80, -7.64, -1.53, 5.96, 15.17, 26.19}; + ACE_ballisticCoefficients[]={0.499, 0.493, 0.48}; + ACE_velocityBoundaries[]={671, 549}; + ACE_standardAtmosphere="ASM"; + ACE_dragModel=1; + ACE_muzzleVelocities[]={748, 761, 765}; + ACE_barrelLengths[]={20, 24, 26}; + }; + class CUP_B_127x107_Ball_Green_Tracer: BulletBase + { + ACE_caliber=0.511; + ACE_bulletLength=2.520; + ACE_bulletMass=745; + ACE_ammoTempMuzzleVelocityShifts[]={-26.55, -25.47, -22.85, -20.12, -16.98, -12.80, -7.64, -1.53, 5.96, 15.17, 26.19}; + ACE_ballisticCoefficients[]={0.63}; + ACE_velocityBoundaries[]={}; + ACE_standardAtmosphere="ASM"; + ACE_dragModel=1; + ACE_muzzleVelocities[]={820}; + ACE_barrelLengths[]={28.7}; + }; + class CUP_B_127x108_Ball_Green_Tracer: BulletBase + { + ACE_caliber=0.511; + ACE_bulletLength=2.520; + ACE_bulletMass=745; + ACE_ammoTempMuzzleVelocityShifts[]={-26.55, -25.47, -22.85, -20.12, -16.98, -12.80, -7.64, -1.53, 5.96, 15.17, 26.19}; + ACE_ballisticCoefficients[]={0.63}; + ACE_velocityBoundaries[]={}; + ACE_standardAtmosphere="ASM"; + ACE_dragModel=1; + ACE_muzzleVelocities[]={820}; + ACE_barrelLengths[]={28.7}; + }; + class CUP_B_762x54_Ball_White_Tracer: BulletBase + { + ACE_caliber=0.312; + ACE_bulletLength=1.14; + ACE_bulletMass=149; + ACE_ammoTempMuzzleVelocityShifts[]={-26.55, -25.47, -22.85, -20.12, -16.98, -12.80, -7.64, -1.53, 5.96, 15.17, 26.19}; + ACE_ballisticCoefficients[]={0.395}; + ACE_velocityBoundaries[]={}; + ACE_standardAtmosphere="ICAO"; + ACE_dragModel=1; + ACE_muzzleVelocities[]={680, 750, 798, 800}; + ACE_barrelLengths[]={16, 20, 24, 26}; + }; + class CUP_B_762x54_Ball_Red_Tracer: BulletBase + { + ACE_caliber=0.312; + ACE_bulletLength=1.14; + ACE_bulletMass=149; + ACE_ammoTempMuzzleVelocityShifts[]={-26.55, -25.47, -22.85, -20.12, -16.98, -12.80, -7.64, -1.53, 5.96, 15.17, 26.19}; + ACE_ballisticCoefficients[]={0.395}; + ACE_velocityBoundaries[]={}; + ACE_standardAtmosphere="ICAO"; + ACE_dragModel=1; + ACE_muzzleVelocities[]={680, 750, 798, 800}; + ACE_barrelLengths[]={16, 20, 24, 26}; + }; + class CUP_B_762x54_Ball_Green_Tracer: BulletBase + { + ACE_caliber=0.312; + ACE_bulletLength=1.14; + ACE_bulletMass=149; + ACE_ammoTempMuzzleVelocityShifts[]={-26.55, -25.47, -22.85, -20.12, -16.98, -12.80, -7.64, -1.53, 5.96, 15.17, 26.19}; + ACE_ballisticCoefficients[]={0.395}; + ACE_velocityBoundaries[]={}; + ACE_standardAtmosphere="ICAO"; + ACE_dragModel=1; + ACE_muzzleVelocities[]={680, 750, 798, 800}; + ACE_barrelLengths[]={16, 20, 24, 26}; + }; + class CUP_B_762x54_Ball_Yellow_Tracer: BulletBase + { + ACE_caliber=0.312; + ACE_bulletLength=1.14; + ACE_bulletMass=149; + ACE_ammoTempMuzzleVelocityShifts[]={-26.55, -25.47, -22.85, -20.12, -16.98, -12.80, -7.64, -1.53, 5.96, 15.17, 26.19}; + ACE_ballisticCoefficients[]={0.395}; + ACE_velocityBoundaries[]={}; + ACE_standardAtmosphere="ICAO"; + ACE_dragModel=1; + ACE_muzzleVelocities[]={680, 750, 798, 800}; + ACE_barrelLengths[]={16, 20, 24, 26}; + }; + class CUP_B_9x39_SP5: BulletBase + { + ACE_caliber=0.364; + ACE_bulletLength=1.24; + ACE_bulletMass=250; + ACE_ammoTempMuzzleVelocityShifts[]={-2.655, -2.547, -2.285, -2.012, -1.698, -1.280, -0.764, -0.153, 0.596, 1.517, 2.619}; + ACE_ballisticCoefficients[]={0.275}; + ACE_velocityBoundaries[]={}; + ACE_standardAtmosphere="ICAO"; + ACE_dragModel=1; + ACE_muzzleVelocities[]={280, 300, 320}; + ACE_barrelLengths[]={10, 16.3, 20}; + }; + class CUP_B_762x51_Tracer_Green: BulletBase + { + ACE_caliber=0.308; + ACE_bulletLength=1.14; + ACE_bulletMass=146; + ACE_ammoTempMuzzleVelocityShifts[]={-26.55, -25.47, -22.85, -20.12, -16.98, -12.80, -7.64, -1.53, 5.96, 15.17, 26.19}; + ACE_ballisticCoefficients[]={0.2}; + ACE_velocityBoundaries[]={}; + ACE_standardAtmosphere="ICAO"; + ACE_dragModel=7; + ACE_muzzleVelocities[]={700, 800, 820, 833, 845}; + ACE_barrelLengths[]={10, 16, 20, 24, 26}; + }; + class CUP_B_762x51_Tracer_Red: BulletBase + { + ACE_caliber=0.308; + ACE_bulletLength=1.14; + ACE_bulletMass=146; + ACE_ammoTempMuzzleVelocityShifts[]={-26.55, -25.47, -22.85, -20.12, -16.98, -12.80, -7.64, -1.53, 5.96, 15.17, 26.19}; + ACE_ballisticCoefficients[]={0.2}; + ACE_velocityBoundaries[]={}; + ACE_standardAtmosphere="ICAO"; + ACE_dragModel=7; + ACE_muzzleVelocities[]={700, 800, 820, 833, 845}; + ACE_barrelLengths[]={10, 16, 20, 24, 26}; + }; + class CUP_B_762x51_Tracer_Yellow: BulletBase + { + ACE_caliber=0.308; + ACE_bulletLength=1.14; + ACE_bulletMass=146; + ACE_ammoTempMuzzleVelocityShifts[]={-26.55, -25.47, -22.85, -20.12, -16.98, -12.80, -7.64, -1.53, 5.96, 15.17, 26.19}; + ACE_ballisticCoefficients[]={0.2}; + ACE_velocityBoundaries[]={}; + ACE_standardAtmosphere="ICAO"; + ACE_dragModel=7; + ACE_muzzleVelocities[]={700, 800, 820, 833, 845}; + ACE_barrelLengths[]={10, 16, 20, 24, 26}; + }; + class CUP_B_762x51_Tracer_White: BulletBase + { + ACE_caliber=0.308; + ACE_bulletLength=1.14; + ACE_bulletMass=146; + ACE_ammoTempMuzzleVelocityShifts[]={-26.55, -25.47, -22.85, -20.12, -16.98, -12.80, -7.64, -1.53, 5.96, 15.17, 26.19}; + ACE_ballisticCoefficients[]={0.2}; + ACE_velocityBoundaries[]={}; + ACE_standardAtmosphere="ICAO"; + ACE_dragModel=7; + ACE_muzzleVelocities[]={700, 800, 820, 833, 845}; + ACE_barrelLengths[]={10, 16, 20, 24, 26}; + }; + class B_127x107_Ball: BulletBase + { + ACE_caliber=0.511; + ACE_bulletLength=2.520; + ACE_bulletMass=745; + ACE_ammoTempMuzzleVelocityShifts[]={-26.55, -25.47, -22.85, -20.12, -16.98, -12.80, -7.64, -1.53, 5.96, 15.17, 26.19}; + ACE_ballisticCoefficients[]={0.63}; + ACE_velocityBoundaries[]={}; + ACE_standardAtmosphere="ASM"; + ACE_dragModel=1; + ACE_muzzleVelocities[]={820}; + ACE_barrelLengths[]={28.7}; + }; + class CUP_B_9x18_SD: BulletBase + { + ACE_caliber=0.365; + ACE_bulletLength=0.610; + ACE_bulletMass=92.6; + ACE_ammoTempMuzzleVelocityShifts[]={-2.655, -2.547, -2.285, -2.012, -1.698, -1.280, -0.764, -0.153, 0.596, 1.517, 2.619}; + ACE_ballisticCoefficients[]={0.125}; + ACE_velocityBoundaries[]={}; + ACE_standardAtmosphere="ASM"; + ACE_dragModel=1; + ACE_muzzleVelocities[]={298, 330, 340}; + ACE_barrelLengths[]={3.8, 5, 9}; + }; + class CUP_B_765x17_Ball: BulletBase + { + ACE_caliber=0.3125; + ACE_bulletLength=0.610; + ACE_bulletMass=65; + ACE_ammoTempMuzzleVelocityShifts[]={-2.655, -2.547, -2.285, -2.012, -1.698, -1.280, -0.764, -0.153, 0.596, 1.517, 2.619}; + ACE_ballisticCoefficients[]={0.118}; + ACE_velocityBoundaries[]={}; + ACE_standardAtmosphere="ASM"; + ACE_dragModel=1; + ACE_muzzleVelocities[]={282, 300, 320}; + ACE_barrelLengths[]={4, 5, 9}; + }; + class CUP_B_145x115_AP_Green_Tracer: BulletBase + { + ACE_caliber=0.586; + ACE_bulletLength=2.00; + ACE_bulletMass=1010; + ACE_ammoTempMuzzleVelocityShifts[]={-26.55, -25.47, -22.85, -20.12, -16.98, -12.80, -7.64, -1.53, 5.96, 15.17, 26.19}; + ACE_ballisticCoefficients[]={0.620}; + ACE_velocityBoundaries[]={}; + ACE_standardAtmosphere="ASM"; + ACE_dragModel=1; + ACE_muzzleVelocities[]={1000}; + ACE_barrelLengths[]={53}; + }; + class CUP_B_127x99_Ball_White_Tracer: BulletBase + { + ACE_caliber=0.510; + ACE_bulletLength=2.310; + ACE_bulletMass=647; + ACE_ammoTempMuzzleVelocityShifts[]={-26.55, -25.47, -22.85, -20.12, -16.98, -12.80, -7.64, -1.53, 5.96, 15.17, 26.19}; + ACE_ballisticCoefficients[]={0.670}; + ACE_velocityBoundaries[]={}; + ACE_standardAtmosphere="ASM"; + ACE_dragModel=1; + ACE_muzzleVelocities[]={853}; + ACE_barrelLengths[]={29}; + }; + class CUP_B_86x70_Ball_noTracer: BulletBase + { + ACE_caliber=0.338; + ACE_bulletLength=1.70; + ACE_bulletMass=300; + ACE_ammoTempMuzzleVelocityShifts[]={-26.55, -25.47, -22.85, -20.12, -16.98, -12.80, -7.64, -1.53, 5.96, 15.17, 26.19}; + ACE_ballisticCoefficients[]={0.381}; + ACE_velocityBoundaries[]={}; + ACE_standardAtmosphere="ICAO"; + ACE_dragModel=7; + ACE_muzzleVelocities[]={820, 826, 830}; + ACE_barrelLengths[]={24, 26.5, 28}; + }; + + class VTN_9x18_Ball_FMJ: B_9x21_Ball + { + ACE_caliber=0.365; + ACE_bulletLength=0.610; + ACE_bulletMass=92.6; + ACE_ammoTempMuzzleVelocityShifts[]={-2.655, -2.547, -2.285, -2.012, -1.698, -1.280, -0.764, -0.153, 0.596, 1.517, 2.619}; + ACE_ballisticCoefficients[]={0.125}; + ACE_velocityBoundaries[]={}; + ACE_standardAtmosphere="ASM"; + ACE_dragModel=1; + ACE_muzzleVelocities[]={298, 330, 350}; + ACE_barrelLengths[]={3.8, 5, 9}; + }; + class VTN_9x18_Ball_SC: VTN_9x18_Ball_FMJ + { + ACE_caliber=0.365; + ACE_bulletLength=0.610; + ACE_bulletMass=92.6; + ACE_ammoTempMuzzleVelocityShifts[]={-2.655, -2.547, -2.285, -2.012, -1.698, -1.280, -0.764, -0.153, 0.596, 1.517, 2.619}; + ACE_ballisticCoefficients[]={0.125}; + ACE_velocityBoundaries[]={}; + ACE_standardAtmosphere="ASM"; + ACE_dragModel=1; + ACE_muzzleVelocities[]={298, 330, 350}; + ACE_barrelLengths[]={3.8, 5, 9}; + }; + class VTN_9x18_Ball_TRC: VTN_9x18_Ball_FMJ + { + ACE_caliber=0.365; + ACE_bulletLength=0.610; + ACE_bulletMass=92.6; + ACE_ammoTempMuzzleVelocityShifts[]={-2.655, -2.547, -2.285, -2.012, -1.698, -1.280, -0.764, -0.153, 0.596, 1.517, 2.619}; + ACE_ballisticCoefficients[]={0.125}; + ACE_velocityBoundaries[]={}; + ACE_standardAtmosphere="ASM"; + ACE_dragModel=1; + ACE_muzzleVelocities[]={298, 330, 350}; + ACE_barrelLengths[]={3.8, 5, 9}; + }; + class VTN_9x18_Ball_AP1: VTN_9x18_Ball_FMJ + { + ACE_caliber=0.365; + ACE_bulletLength=0.610; + ACE_bulletMass=92.6; + ACE_ammoTempMuzzleVelocityShifts[]={-2.655, -2.547, -2.285, -2.012, -1.698, -1.280, -0.764, -0.153, 0.596, 1.517, 2.619}; + ACE_ballisticCoefficients[]={0.125}; + ACE_velocityBoundaries[]={}; + ACE_standardAtmosphere="ASM"; + ACE_dragModel=1; + ACE_muzzleVelocities[]={298, 330, 350}; + ACE_barrelLengths[]={3.8, 5, 9}; + }; + class VTN_9x18_Ball_AP2: VTN_9x18_Ball_FMJ + { + ACE_caliber=0.365; + ACE_bulletLength=0.610; + ACE_bulletMass=92.6; + ACE_ammoTempMuzzleVelocityShifts[]={-2.655, -2.547, -2.285, -2.012, -1.698, -1.280, -0.764, -0.153, 0.596, 1.517, 2.619}; + ACE_ballisticCoefficients[]={0.125}; + ACE_velocityBoundaries[]={}; + ACE_standardAtmosphere="ASM"; + ACE_dragModel=1; + ACE_muzzleVelocities[]={298, 330, 350}; + ACE_barrelLengths[]={3.8, 5, 9}; + }; + class VTN_9x18_Ball_PRS: VTN_9x18_Ball_FMJ + { + ACE_caliber=0.365; + ACE_bulletLength=0.610; + ACE_bulletMass=92.6; + ACE_ammoTempMuzzleVelocityShifts[]={-2.655, -2.547, -2.285, -2.012, -1.698, -1.280, -0.764, -0.153, 0.596, 1.517, 2.619}; + ACE_ballisticCoefficients[]={0.125}; + ACE_velocityBoundaries[]={}; + ACE_standardAtmosphere="ASM"; + ACE_dragModel=1; + ACE_muzzleVelocities[]={298, 330, 350}; + ACE_barrelLengths[]={3.8, 5, 9}; + }; + class VTN_9x19_Ball_SC: VTN_9x18_Ball_FMJ + { + ACE_caliber=0.355; + ACE_bulletLength=0.610; + ACE_bulletMass=124; + ACE_ammoTempMuzzleVelocityShifts[]={-2.655, -2.547, -2.285, -2.012, -1.698, -1.280, -0.764, -0.153, 0.596, 1.517, 2.619}; + ACE_ballisticCoefficients[]={0.165}; + ACE_velocityBoundaries[]={}; + ACE_standardAtmosphere="ASM"; + ACE_dragModel=1; + ACE_muzzleVelocities[]={340, 370, 400}; + ACE_barrelLengths[]={4, 5, 9}; + }; + class VTN_9x19_Ball_TRC: VTN_9x19_Ball_SC + { + ACE_caliber=0.355; + ACE_bulletLength=0.610; + ACE_bulletMass=124; + ACE_ammoTempMuzzleVelocityShifts[]={-2.655, -2.547, -2.285, -2.012, -1.698, -1.280, -0.764, -0.153, 0.596, 1.517, 2.619}; + ACE_ballisticCoefficients[]={0.165}; + ACE_velocityBoundaries[]={}; + ACE_standardAtmosphere="ASM"; + ACE_dragModel=1; + ACE_muzzleVelocities[]={340, 370, 400}; + ACE_barrelLengths[]={4, 5, 9}; + }; + class VTN_9x19_Ball_AP: VTN_9x19_Ball_SC + { + ACE_caliber=0.355; + ACE_bulletLength=0.610; + ACE_bulletMass=124; + ACE_ammoTempMuzzleVelocityShifts[]={-2.655, -2.547, -2.285, -2.012, -1.698, -1.280, -0.764, -0.153, 0.596, 1.517, 2.619}; + ACE_ballisticCoefficients[]={0.165}; + ACE_velocityBoundaries[]={}; + ACE_standardAtmosphere="ASM"; + ACE_dragModel=1; + ACE_muzzleVelocities[]={340, 370, 400}; + ACE_barrelLengths[]={4, 5, 9}; + }; + class VTN_9x19_Ball_PRS: VTN_9x19_Ball_SC + { + ACE_caliber=0.355; + ACE_bulletLength=0.610; + ACE_bulletMass=124; + ACE_ammoTempMuzzleVelocityShifts[]={-2.655, -2.547, -2.285, -2.012, -1.698, -1.280, -0.764, -0.153, 0.596, 1.517, 2.619}; + ACE_ballisticCoefficients[]={0.165}; + ACE_velocityBoundaries[]={}; + ACE_standardAtmosphere="ASM"; + ACE_dragModel=1; + ACE_muzzleVelocities[]={340, 370, 400}; + ACE_barrelLengths[]={4, 5, 9}; + }; + class VTN_9x39_Ball_SC: B_9x21_Ball + { + ACE_caliber=0.364; + ACE_bulletLength=1.24; + ACE_bulletMass=250; + ACE_ammoTempMuzzleVelocityShifts[]={-2.655, -2.547, -2.285, -2.012, -1.698, -1.280, -0.764, -0.153, 0.596, 1.517, 2.619}; + ACE_ballisticCoefficients[]={0.275}; + ACE_velocityBoundaries[]={}; + ACE_standardAtmosphere="ICAO"; + ACE_dragModel=1; + ACE_muzzleVelocities[]={280, 300, 320}; + ACE_barrelLengths[]={10, 16.3, 20}; + }; + class VTN_9x39_Ball_AP: VTN_9x39_Ball_SC + { + ACE_caliber=0.364; + ACE_bulletLength=1.24; + ACE_bulletMass=250; + ACE_ammoTempMuzzleVelocityShifts[]={-2.655, -2.547, -2.285, -2.012, -1.698, -1.280, -0.764, -0.153, 0.596, 1.517, 2.619}; + ACE_ballisticCoefficients[]={0.275}; + ACE_velocityBoundaries[]={}; + ACE_standardAtmosphere="ICAO"; + ACE_dragModel=1; + ACE_muzzleVelocities[]={280, 300, 320}; + ACE_barrelLengths[]={10, 16.3, 20}; + }; + class VTN_545x39_Ball_SC: B_556x45_Ball + { + ACE_caliber=0.220; + ACE_bulletLength=0.85; + ACE_bulletMass=52.9; + ACE_ammoTempMuzzleVelocityShifts[]={-26.55, -25.47, -22.85, -20.12, -16.98, -12.80, -7.64, -1.53, 5.96, 15.17, 26.19}; + ACE_ballisticCoefficients[]={0.168}; + ACE_velocityBoundaries[]={}; + ACE_standardAtmosphere="ASM"; + ACE_dragModel=7; + ACE_muzzleVelocities[]={780, 880, 920}; + ACE_barrelLengths[]={10, 16.3, 20}; + }; + class VTN_545x39_Ball_TRC: VTN_545x39_Ball_SC + { + ACE_caliber=0.220; + ACE_bulletLength=0.85; + ACE_bulletMass=49.8; + ACE_ammoTempMuzzleVelocityShifts[]={-26.55, -25.47, -22.85, -20.12, -16.98, -12.80, -7.64, -1.53, 5.96, 15.17, 26.19}; + ACE_ballisticCoefficients[]={0.168}; + ACE_velocityBoundaries[]={}; + ACE_standardAtmosphere="ASM"; + ACE_dragModel=7; + ACE_muzzleVelocities[]={785, 883, 925}; + ACE_barrelLengths[]={10, 16.3, 20}; + }; + class VTN_545x39_Ball_AP: VTN_545x39_Ball_TRC + { + ACE_caliber=0.220; + ACE_bulletLength=0.85; + ACE_bulletMass=52.9; + ACE_ammoTempMuzzleVelocityShifts[]={-26.55, -25.47, -22.85, -20.12, -16.98, -12.80, -7.64, -1.53, 5.96, 15.17, 26.19}; + ACE_ballisticCoefficients[]={0.168}; + ACE_velocityBoundaries[]={}; + ACE_standardAtmosphere="ASM"; + ACE_dragModel=7; + ACE_muzzleVelocities[]={780, 880, 920}; + ACE_barrelLengths[]={10, 16.3, 20}; + }; + class VTN_545x39_Ball_AP2: VTN_545x39_Ball_AP + { + ACE_caliber=0.220; + ACE_bulletLength=0.85; + ACE_bulletMass=52.9; + ACE_ammoTempMuzzleVelocityShifts[]={-26.55, -25.47, -22.85, -20.12, -16.98, -12.80, -7.64, -1.53, 5.96, 15.17, 26.19}; + ACE_ballisticCoefficients[]={0.168}; + ACE_velocityBoundaries[]={}; + ACE_standardAtmosphere="ASM"; + ACE_dragModel=7; + ACE_muzzleVelocities[]={780, 880, 920}; + ACE_barrelLengths[]={10, 16.3, 20}; + }; + class VTN_545x39_Ball_SS: VTN_545x39_Ball_SC + { + ACE_caliber=0.220; + ACE_bulletLength=0.85; + ACE_bulletMass=52.9; + ACE_ammoTempMuzzleVelocityShifts[]={-2.655, -2.547, -2.285, -2.012, -1.698, -1.280, -0.764, -0.153, 0.596, 1.517, 2.619}; + ACE_ballisticCoefficients[]={0.168}; + ACE_velocityBoundaries[]={}; + ACE_standardAtmosphere="ASM"; + ACE_dragModel=7; + ACE_muzzleVelocities[]={300, 320, 340}; + ACE_barrelLengths[]={10, 16.3, 20}; + }; + class VTN_762x39_Ball_SC: B_762x51_Ball + { + ACE_caliber=0.308; + ACE_bulletLength=1.14; + ACE_bulletMass=123; + ACE_ammoTempMuzzleVelocityShifts[]={-26.55, -25.47, -22.85, -20.12, -16.98, -12.80, -7.64, -1.53, 5.96, 15.17, 26.19}; + ACE_ballisticCoefficients[]={0.275}; + ACE_velocityBoundaries[]={}; + ACE_standardAtmosphere="ICAO"; + ACE_dragModel=1; + ACE_muzzleVelocities[]={650, 716, 750}; + ACE_barrelLengths[]={10, 16.3, 20}; + }; + class VTN_762x39_Ball_TRC: VTN_762x39_Ball_SC + { + ACE_caliber=0.308; + ACE_bulletLength=1.14; + ACE_bulletMass=117; + ACE_ammoTempMuzzleVelocityShifts[]={-26.55, -25.47, -22.85, -20.12, -16.98, -12.80, -7.64, -1.53, 5.96, 15.17, 26.19}; + ACE_ballisticCoefficients[]={0.275}; + ACE_velocityBoundaries[]={}; + ACE_standardAtmosphere="ICAO"; + ACE_dragModel=1; + ACE_muzzleVelocities[]={650, 716, 750}; + ACE_barrelLengths[]={10, 16.3, 20}; + }; + class VTN_762x39_Ball_AP: VTN_762x39_Ball_TRC + { + ACE_caliber=0.308; + ACE_bulletLength=1.14; + ACE_bulletMass=123; + ACE_ammoTempMuzzleVelocityShifts[]={-26.55, -25.47, -22.85, -20.12, -16.98, -12.80, -7.64, -1.53, 5.96, 15.17, 26.19}; + ACE_ballisticCoefficients[]={0.275}; + ACE_velocityBoundaries[]={}; + ACE_standardAtmosphere="ICAO"; + ACE_dragModel=1; + ACE_muzzleVelocities[]={650, 716, 750}; + ACE_barrelLengths[]={10, 16.3, 20}; + }; + class VTN_762x39_Ball_INC: VTN_762x39_Ball_AP + { + ACE_caliber=0.308; + ACE_bulletLength=1.14; + ACE_bulletMass=123; + ACE_ammoTempMuzzleVelocityShifts[]={-26.55, -25.47, -22.85, -20.12, -16.98, -12.80, -7.64, -1.53, 5.96, 15.17, 26.19}; + ACE_ballisticCoefficients[]={0.275}; + ACE_velocityBoundaries[]={}; + ACE_standardAtmosphere="ICAO"; + ACE_dragModel=1; + ACE_muzzleVelocities[]={650, 716, 750}; + ACE_barrelLengths[]={10, 16.3, 20}; + }; + class VTN_762x39_Ball_API: VTN_762x39_Ball_INC + { + ACE_caliber=0.308; + ACE_bulletLength=1.14; + ACE_bulletMass=123; + ACE_ammoTempMuzzleVelocityShifts[]={-26.55, -25.47, -22.85, -20.12, -16.98, -12.80, -7.64, -1.53, 5.96, 15.17, 26.19}; + ACE_ballisticCoefficients[]={0.275}; + ACE_velocityBoundaries[]={}; + ACE_standardAtmosphere="ICAO"; + ACE_dragModel=1; + ACE_muzzleVelocities[]={650, 716, 750}; + ACE_barrelLengths[]={10, 16.3, 20}; + }; + class VTN_762x39_Ball_SS: VTN_762x39_Ball_SC + { + ACE_caliber=0.308; + ACE_bulletLength=1.14; + ACE_bulletMass=123; + ACE_ammoTempMuzzleVelocityShifts[]={-2.655, -2.547, -2.285, -2.012, -1.698, -1.280, -0.764, -0.153, 0.596, 1.517, 2.619}; + ACE_ballisticCoefficients[]={0.275}; + ACE_velocityBoundaries[]={}; + ACE_standardAtmosphere="ICAO"; + ACE_dragModel=1; + ACE_muzzleVelocities[]={300, 320, 340}; + ACE_barrelLengths[]={10, 16.3, 20}; + }; + class VTN_762x41_Ball_SS: B_762x51_Ball + { + ACE_caliber=0.308; + ACE_bulletLength=0.53; + ACE_bulletMass=143; + ACE_ammoTempMuzzleVelocityShifts[]={-2.655, -2.547, -2.285, -2.012, -1.698, -1.280, -0.764, -0.153, 0.596, 1.517, 2.619}; + ACE_ballisticCoefficients[]={0.275}; + ACE_velocityBoundaries[]={}; + ACE_standardAtmosphere="ICAO"; + ACE_dragModel=1; + ACE_muzzleVelocities[]={200, 210, 220}; + ACE_barrelLengths[]={4, 6, 8}; + }; + class VTN_762x54_Ball_SC: VTN_762x39_Ball_SC + { + ACE_caliber=0.312; + ACE_bulletLength=1.14; + ACE_bulletMass=152; + ACE_ammoTempMuzzleVelocityShifts[]={-26.55, -25.47, -22.85, -20.12, -16.98, -12.80, -7.64, -1.53, 5.96, 15.17, 26.19}; + ACE_ballisticCoefficients[]={0.4}; + ACE_velocityBoundaries[]={}; + ACE_standardAtmosphere="ICAO"; + ACE_dragModel=1; + ACE_muzzleVelocities[]={700, 800, 820, 833}; + ACE_barrelLengths[]={16, 20, 24, 26}; + }; + class VTN_762x54_Ball_TRC: VTN_762x54_Ball_SC + { + ACE_caliber=0.312; + ACE_bulletLength=1.14; + ACE_bulletMass=149; + ACE_ammoTempMuzzleVelocityShifts[]={-26.55, -25.47, -22.85, -20.12, -16.98, -12.80, -7.64, -1.53, 5.96, 15.17, 26.19}; + ACE_ballisticCoefficients[]={0.395}; + ACE_velocityBoundaries[]={}; + ACE_standardAtmosphere="ICAO"; + ACE_dragModel=1; + ACE_muzzleVelocities[]={680, 750, 798, 800}; + ACE_barrelLengths[]={16, 20, 24, 26}; + }; + class VTN_762x54_Ball_AP: VTN_762x54_Ball_TRC + { + ACE_caliber=0.312; + ACE_bulletLength=1.14; + ACE_bulletMass=152; + ACE_ammoTempMuzzleVelocityShifts[]={-26.55, -25.47, -22.85, -20.12, -16.98, -12.80, -7.64, -1.53, 5.96, 15.17, 26.19}; + ACE_ballisticCoefficients[]={0.4}; + ACE_velocityBoundaries[]={}; + ACE_standardAtmosphere="ICAO"; + ACE_dragModel=1; + ACE_muzzleVelocities[]={700, 800, 820, 833}; + ACE_barrelLengths[]={16, 20, 24, 26}; + }; + class VTN_762x54_Ball_INC: VTN_762x54_Ball_AP + { + ACE_caliber=0.312; + ACE_bulletLength=1.14; + ACE_bulletMass=152; + ACE_ammoTempMuzzleVelocityShifts[]={-26.55, -25.47, -22.85, -20.12, -16.98, -12.80, -7.64, -1.53, 5.96, 15.17, 26.19}; + ACE_ballisticCoefficients[]={0.4}; + ACE_velocityBoundaries[]={}; + ACE_standardAtmosphere="ICAO"; + ACE_dragModel=1; + ACE_muzzleVelocities[]={700, 800, 820, 833}; + ACE_barrelLengths[]={16, 20, 24, 26}; + }; + class VTN_762x54_Ball_API: VTN_762x54_Ball_INC + { + ACE_caliber=0.312; + ACE_bulletLength=1.14; + ACE_bulletMass=152; + ACE_ammoTempMuzzleVelocityShifts[]={-26.55, -25.47, -22.85, -20.12, -16.98, -12.80, -7.64, -1.53, 5.96, 15.17, 26.19}; + ACE_ballisticCoefficients[]={0.4}; + ACE_velocityBoundaries[]={}; + ACE_standardAtmosphere="ICAO"; + ACE_dragModel=1; + ACE_muzzleVelocities[]={700, 800, 820, 833}; + ACE_barrelLengths[]={16, 20, 24, 26}; + }; + class VTN_145x114_Ball_APT: B_127x108_Ball + { + ACE_caliber=0.586; + ACE_bulletLength=2.00; + ACE_bulletMass=1010; + ACE_ammoTempMuzzleVelocityShifts[]={-26.55, -25.47, -22.85, -20.12, -16.98, -12.80, -7.64, -1.53, 5.96, 15.17, 26.19}; + ACE_ballisticCoefficients[]={0.620}; + ACE_velocityBoundaries[]={}; + ACE_standardAtmosphere="ASM"; + ACE_dragModel=1; + ACE_muzzleVelocities[]={1000}; + ACE_barrelLengths[]={53}; + }; + class VTN_6mm_BB: B_65x39_Caseless + { + ACE_caliber=0.24; + ACE_bulletLength=0.24; + ACE_bulletMass=6; + ACE_ammoTempMuzzleVelocityShifts[]={}; + ACE_ballisticCoefficients[]={}; + ACE_velocityBoundaries[]={}; + ACE_standardAtmosphere="ICAO"; + ACE_dragModel=1; + ACE_muzzleVelocities[]={100}; + ACE_barrelLengths[]={15}; + }; + class VTN_9x19_Ball_FMJ: B_9x21_Ball + { + ACE_caliber=0.355; + ACE_bulletLength=0.610; + ACE_bulletMass=124; + ACE_ammoTempMuzzleVelocityShifts[]={-2.655, -2.547, -2.285, -2.012, -1.698, -1.280, -0.764, -0.153, 0.596, 1.517, 2.619}; + ACE_ballisticCoefficients[]={0.165}; + ACE_velocityBoundaries[]={}; + ACE_standardAtmosphere="ASM"; + ACE_dragModel=1; + ACE_muzzleVelocities[]={340, 370, 400}; + ACE_barrelLengths[]={4, 5, 9}; + }; + class VTN_556x45_Ball_FMJ: B_556x45_Ball + { + ACE_caliber=0.224; + ACE_bulletLength=0.906; + ACE_bulletMass=62; + ACE_ammoTempMuzzleVelocityShifts[]={-27.20, -26.44, -23.76, -21.00, -17.54, -13.10, -7.95, -1.62, 6.24, 15.48, 27.75}; + ACE_ballisticCoefficients[]={0.151}; + ACE_velocityBoundaries[]={}; + ACE_standardAtmosphere="ASM"; + ACE_dragModel=7; + ACE_muzzleVelocities[]={723, 764, 796, 825, 843, 866, 878, 892, 906, 915, 922, 900}; + ACE_barrelLengths[]={8.3, 9.4, 10.6, 11.8, 13.0, 14.2, 15.4, 16.5, 17.7, 18.9, 20.0, 24.0}; + }; + class VTN_556x45_Ball_TRC: VTN_556x45_Ball_FMJ + { + ACE_caliber=0.224; + ACE_bulletLength=0.906; + ACE_bulletMass=62; + ACE_ammoTempMuzzleVelocityShifts[]={-27.20, -26.44, -23.76, -21.00, -17.54, -13.10, -7.95, -1.62, 6.24, 15.48, 27.75}; + ACE_ballisticCoefficients[]={0.151}; + ACE_velocityBoundaries[]={}; + ACE_standardAtmosphere="ASM"; + ACE_dragModel=7; + ACE_muzzleVelocities[]={723, 764, 796, 825, 843, 866, 878, 892, 906, 915, 922, 900}; + ACE_barrelLengths[]={8.3, 9.4, 10.6, 11.8, 13.0, 14.2, 15.4, 16.5, 17.7, 18.9, 20.0, 24.0}; + }; + class VTN_556x45_Ball_TRCN: VTN_556x45_Ball_TRC + { + ACE_caliber=0.224; + ACE_bulletLength=0.906; + ACE_bulletMass=62; + ACE_ammoTempMuzzleVelocityShifts[]={-27.20, -26.44, -23.76, -21.00, -17.54, -13.10, -7.95, -1.62, 6.24, 15.48, 27.75}; + ACE_ballisticCoefficients[]={0.151}; + ACE_velocityBoundaries[]={}; + ACE_standardAtmosphere="ASM"; + ACE_dragModel=7; + ACE_muzzleVelocities[]={723, 764, 796, 825, 843, 866, 878, 892, 906, 915, 922, 900}; + ACE_barrelLengths[]={8.3, 9.4, 10.6, 11.8, 13.0, 14.2, 15.4, 16.5, 17.7, 18.9, 20.0, 24.0}; + }; + class VTN_556x45_Ball_SC: VTN_556x45_Ball_FMJ + { + ACE_caliber=0.224; + ACE_bulletLength=0.906; + ACE_bulletMass=62; + ACE_ammoTempMuzzleVelocityShifts[]={-27.20, -26.44, -23.76, -21.00, -17.54, -13.10, -7.95, -1.62, 6.24, 15.48, 27.75}; + ACE_ballisticCoefficients[]={0.151}; + ACE_velocityBoundaries[]={}; + ACE_standardAtmosphere="ASM"; + ACE_dragModel=7; + ACE_muzzleVelocities[]={723, 764, 796, 825, 843, 866, 878, 892, 906, 915, 922, 900}; + ACE_barrelLengths[]={8.3, 9.4, 10.6, 11.8, 13.0, 14.2, 15.4, 16.5, 17.7, 18.9, 20.0, 24.0}; + }; + class VTN_556x45_Ball_AP: VTN_556x45_Ball_TRC + { + ACE_caliber=0.224; + ACE_bulletLength=0.906; + ACE_bulletMass=62; + ACE_ammoTempMuzzleVelocityShifts[]={-27.20, -26.44, -23.76, -21.00, -17.54, -13.10, -7.95, -1.62, 6.24, 15.48, 27.75}; + ACE_ballisticCoefficients[]={0.151}; + ACE_velocityBoundaries[]={}; + ACE_standardAtmosphere="ASM"; + ACE_dragModel=7; + ACE_muzzleVelocities[]={723, 764, 796, 825, 843, 866, 878, 892, 906, 915, 922, 900}; + ACE_barrelLengths[]={8.3, 9.4, 10.6, 11.8, 13.0, 14.2, 15.4, 16.5, 17.7, 18.9, 20.0, 24.0}; + }; + class VTN_556x45_Ball_INC: VTN_556x45_Ball_AP + { + ACE_caliber=0.224; + ACE_bulletLength=0.906; + ACE_bulletMass=62; + ACE_ammoTempMuzzleVelocityShifts[]={-27.20, -26.44, -23.76, -21.00, -17.54, -13.10, -7.95, -1.62, 6.24, 15.48, 27.75}; + ACE_ballisticCoefficients[]={0.151}; + ACE_velocityBoundaries[]={}; + ACE_standardAtmosphere="ASM"; + ACE_dragModel=7; + ACE_muzzleVelocities[]={723, 764, 796, 825, 843, 866, 878, 892, 906, 915, 922, 900}; + ACE_barrelLengths[]={8.3, 9.4, 10.6, 11.8, 13.0, 14.2, 15.4, 16.5, 17.7, 18.9, 20.0, 24.0}; + }; + class VTN_556x45_Ball_LR: VTN_556x45_Ball_FMJ + { + ACE_caliber=0.224; + ACE_bulletLength=0.906; + ACE_bulletMass=77; + ACE_ammoTempMuzzleVelocityShifts[]={-26.55, -25.47, -22.85, -20.12, -16.98, -12.80, -7.64, -1.53, 5.96, 15.17, 26.19}; + ACE_ballisticCoefficients[]={0.361}; + ACE_velocityBoundaries[]={}; + ACE_standardAtmosphere="ASM"; + ACE_dragModel=1; + ACE_muzzleVelocities[]={624, 816, 832, 838}; + ACE_barrelLengths[]={7.5, 14.5, 18, 20}; + }; + class VTN_556x45_Ball_SS: B_556x45_Ball + { + ACE_caliber=0.224; + ACE_bulletLength=0.906; + ACE_bulletMass=62; + ACE_ammoTempMuzzleVelocityShifts[]={-2.655, -2.547, -2.285, -2.012, -1.698, -1.280, -0.764, -0.153, 0.596, 1.517, 2.619}; + ACE_ballisticCoefficients[]={0.151}; + ACE_velocityBoundaries[]={}; + ACE_standardAtmosphere="ASM"; + ACE_dragModel=7; + ACE_muzzleVelocities[]={300, 320, 340}; + ACE_barrelLengths[]={10, 20.0, 24.0}; + }; + class VTN_762x51_Ball_SC: B_762x51_Ball + { + ACE_caliber=0.308; + ACE_bulletLength=1.14; + ACE_bulletMass=146; + ACE_ammoTempMuzzleVelocityShifts[]={-26.55, -25.47, -22.85, -20.12, -16.98, -12.80, -7.64, -1.53, 5.96, 15.17, 26.19}; + ACE_ballisticCoefficients[]={0.2}; + ACE_velocityBoundaries[]={}; + ACE_standardAtmosphere="ICAO"; + ACE_dragModel=7; + ACE_muzzleVelocities[]={700, 800, 820, 833, 845}; + ACE_barrelLengths[]={10, 16, 20, 24, 26}; + }; + class VTN_762x51_Ball_TRC: VTN_762x51_Ball_SC + { + ACE_caliber=0.308; + ACE_bulletLength=1.14; + ACE_bulletMass=146; + ACE_ammoTempMuzzleVelocityShifts[]={-26.55, -25.47, -22.85, -20.12, -16.98, -12.80, -7.64, -1.53, 5.96, 15.17, 26.19}; + ACE_ballisticCoefficients[]={0.2}; + ACE_velocityBoundaries[]={}; + ACE_standardAtmosphere="ICAO"; + ACE_dragModel=7; + ACE_muzzleVelocities[]={700, 800, 820, 833, 845}; + ACE_barrelLengths[]={10, 16, 20, 24, 26}; + }; + class VTN_762x51_Ball_TRCN: VTN_762x51_Ball_TRC + { + ACE_caliber=0.308; + ACE_bulletLength=1.14; + ACE_bulletMass=146; + ACE_ammoTempMuzzleVelocityShifts[]={-26.55, -25.47, -22.85, -20.12, -16.98, -12.80, -7.64, -1.53, 5.96, 15.17, 26.19}; + ACE_ballisticCoefficients[]={0.2}; + ACE_velocityBoundaries[]={}; + ACE_standardAtmosphere="ICAO"; + ACE_dragModel=7; + ACE_muzzleVelocities[]={700, 800, 820, 833, 845}; + ACE_barrelLengths[]={10, 16, 20, 24, 26}; + }; + class VTN_762x51_Ball_AP: VTN_762x51_Ball_TRC + { + ACE_caliber=0.308; + ACE_bulletLength=1.14; + ACE_bulletMass=146; + ACE_ammoTempMuzzleVelocityShifts[]={-26.55, -25.47, -22.85, -20.12, -16.98, -12.80, -7.64, -1.53, 5.96, 15.17, 26.19}; + ACE_ballisticCoefficients[]={0.2}; + ACE_velocityBoundaries[]={}; + ACE_standardAtmosphere="ICAO"; + ACE_dragModel=7; + ACE_muzzleVelocities[]={700, 800, 820, 833, 845}; + ACE_barrelLengths[]={10, 16, 20, 24, 26}; + }; + class VTN_762x51_Ball_LR: VTN_762x51_Ball_SC + { + ACE_caliber=0.308; + ACE_bulletLength=1.24; + ACE_bulletMass=175; + ACE_ammoTempMuzzleVelocityShifts[]={-26.55, -25.47, -22.85, -20.12, -16.98, -12.80, -7.64, -1.53, 5.96, 15.17, 26.19}; + ACE_ballisticCoefficients[]={0.243}; + ACE_velocityBoundaries[]={}; + ACE_standardAtmosphere="ICAO"; + ACE_dragModel=7; + ACE_muzzleVelocities[]={750, 780, 790, 794}; + ACE_barrelLengths[]={16, 20, 24, 26}; + }; + class VTN_1143x23_Ball_FMJ: B_408_Ball + { + ACE_caliber=0.452; + ACE_bulletLength=0.68; + ACE_bulletMass=230; + ACE_ammoTempMuzzleVelocityShifts[]={-2.655, -2.547, -2.285, -2.012, -1.698, -1.280, -0.764, -0.153, 0.596, 1.517, 2.619}; + ACE_ballisticCoefficients[]={0.195}; + ACE_velocityBoundaries[]={}; + ACE_standardAtmosphere="ASM"; + ACE_dragModel=1; + ACE_muzzleVelocities[]={230, 250, 285}; + ACE_barrelLengths[]={4, 5, 9}; + }; + class VTN_1143x23_Ball_HP: VTN_1143x23_Ball_FMJ + { + ACE_caliber=0.452; + ACE_bulletLength=0.68; + ACE_bulletMass=230; + ACE_ammoTempMuzzleVelocityShifts[]={-2.655, -2.547, -2.285, -2.012, -1.698, -1.280, -0.764, -0.153, 0.596, 1.517, 2.619}; + ACE_ballisticCoefficients[]={0.195}; + ACE_velocityBoundaries[]={}; + ACE_standardAtmosphere="ASM"; + ACE_dragModel=1; + ACE_muzzleVelocities[]={230, 250, 285}; + ACE_barrelLengths[]={4, 5, 9}; + }; + class VTN_1143x23_Ball_JHP: VTN_1143x23_Ball_FMJ + { + ACE_caliber=0.452; + ACE_bulletLength=0.68; + ACE_bulletMass=230; + ACE_ammoTempMuzzleVelocityShifts[]={-2.655, -2.547, -2.285, -2.012, -1.698, -1.280, -0.764, -0.153, 0.596, 1.517, 2.619}; + ACE_ballisticCoefficients[]={0.195}; + ACE_velocityBoundaries[]={}; + ACE_standardAtmosphere="ASM"; + ACE_dragModel=1; + ACE_muzzleVelocities[]={230, 250, 285}; + ACE_barrelLengths[]={4, 5, 9}; + }; + class VTN_762x39_Ball_FMJ: B_762x51_Ball + { + ACE_caliber=0.308; + ACE_bulletLength=1.14; + ACE_bulletMass=123; + ACE_ammoTempMuzzleVelocityShifts[]={-26.55, -25.47, -22.85, -20.12, -16.98, -12.80, -7.64, -1.53, 5.96, 15.17, 26.19}; + ACE_ballisticCoefficients[]={0.275}; + ACE_velocityBoundaries[]={}; + ACE_standardAtmosphere="ICAO"; + ACE_dragModel=1; + ACE_muzzleVelocities[]={650, 716, 750}; + ACE_barrelLengths[]={10, 16.3, 20}; + }; + class VTN_45_Pellet: B_762x51_Ball + { + ACE_caliber=0.22; + ACE_bulletLength=0.23; + ACE_bulletMass=3; + ACE_ammoTempMuzzleVelocityShifts[]={}; + ACE_ballisticCoefficients[]={}; + ACE_velocityBoundaries[]={}; + ACE_standardAtmosphere="ICAO"; + ACE_dragModel=1; + ACE_muzzleVelocities[]={100, 138, 150}; + ACE_barrelLengths[]={5, 10, 16}; + }; +}; \ No newline at end of file From 387572c56018a4d965f94754bfea5be36ed1f7fd Mon Sep 17 00:00:00 2001 From: ulteq Date: Mon, 20 Apr 2015 22:29:15 +0200 Subject: [PATCH 062/104] Added some weapon class reference data --- extras/CfgWeaponsReference.hpp | 1894 ++++++++++++++++++++++++++++++++ 1 file changed, 1894 insertions(+) create mode 100644 extras/CfgWeaponsReference.hpp diff --git a/extras/CfgWeaponsReference.hpp b/extras/CfgWeaponsReference.hpp new file mode 100644 index 00000000000..77ce494e398 --- /dev/null +++ b/extras/CfgWeaponsReference.hpp @@ -0,0 +1,1894 @@ +class CfgWeapons +{ + class MGun; + class MGunCore; + class Pistol_Base_F; + class Rifle_Base_F; + class Rifle_Long_Base_F; + class arifle_MX_Base_F; + class PDW2000_Base_F; + class arifle_Katiba_Base_F; + class SDAR_base_F; + class SMG_02_Base_F; + class Tavor_base_F; + class SMG_01_Base; + class DMR_01_base_F; + class Mk20_Base_F; + class EBR_base_F; + class HMG_127; + class LRR_base_F; + class GM6_base_F; + class DMR_02_base_F; + class DMR_03_base_F; + class DMR_04_base_F; + class DMR_05_base_F; + class DMR_06_base_F; + class MMG_01_base_F; + class MMG_02_base_F; + class hgun_P07_F : Pistol_Base_F + { + ACE_barrelTwist=10; + ACE_barrelLength=4; + }; + class hgun_Rook40_F : Pistol_Base_F + { + ACE_barrelTwist=10; + ACE_barrelLength=4.4; + }; + class hgun_Pistol_heavy_01_F : Pistol_Base_F + { + ACE_barrelTwist=16; + ACE_barrelLength=4.5; + }; + class hgun_Pistol_heavy_02_F : Pistol_Base_F + { + ACE_barrelTwist=16; + ACE_barrelLength=3; + }; + class hgun_ACPC2_F : Pistol_Base_F + { + ACE_barrelTwist=16; + ACE_barrelLength=5; + }; + class hgun_PDW2000_F : PDW2000_Base_F + { + ACE_barrelTwist=9; + ACE_barrelLength=7; + }; + class arifle_Katiba_F : arifle_Katiba_Base_F + { + ACE_barrelTwist=8; + ACE_barrelLength=28.7; + }; + class arifle_Katiba_C_F : arifle_Katiba_Base_F + { + ACE_barrelTwist=8; + ACE_barrelLength=26.8; + }; + class arifle_Katiba_GL_F : arifle_Katiba_Base_F + { + ACE_barrelTwist=8; + ACE_barrelLength=28.7; + }; + class arifle_MX_F: arifle_MX_Base_F + { + ACE_barrelTwist=9; + ACE_barrelLength=14.5; + }; + class arifle_MX_GL_F: arifle_MX_Base_F + { + ACE_barrelTwist=9; + ACE_barrelLength=14.5; + }; + class arifle_MX_SW_F: arifle_MX_Base_F + { + ACE_barrelTwist=9; + ACE_barrelLength=16.0; + }; + class arifle_MXC_F: arifle_MX_Base_F + { + ACE_barrelTwist=8; + ACE_barrelLength=10.5; + }; + class arifle_MXM_F: arifle_MX_Base_F + { + ACE_barrelTwist=9; + ACE_barrelLength=18; + }; + class arifle_SDAR_F : SDAR_base_F + { + ACE_barrelTwist=11.25; + ACE_barrelLength=18; + }; + class SMG_02_F : SMG_02_Base_F + { + ACE_barrelTwist=10; + ACE_barrelLength=7.7; + }; + class arifle_TRG20_F : Tavor_base_F + { + ACE_barrelTwist=7; + ACE_barrelLength=15; + }; + class arifle_TRG21_F : Tavor_base_F + { + ACE_barrelTwist=7; + ACE_barrelLength=18.1; + }; + class LMG_Zafir_F : Rifle_Long_Base_F + { + ACE_barrelTwist=12; + ACE_barrelLength=18.1; + }; + class arifle_Mk20_F : Mk20_Base_F + { + ACE_barrelTwist=7; + ACE_barrelLength=17.4; + }; + class arifle_Mk20C_F : Mk20_Base_F + { + ACE_barrelTwist=7; + ACE_barrelLength=16; + }; + class arifle_Mk20_GL_F : Mk20_Base_F + { + ACE_barrelTwist=7; + ACE_barrelLength=16; + }; + class SMG_01_F : SMG_01_Base + { + ACE_barrelTwist=16; + ACE_barrelLength=5.5; + }; + class srifle_DMR_01_F : DMR_01_base_F + { + ACE_barrelTwist=9.5; + ACE_barrelLength=24; + }; + class srifle_EBR_F : EBR_base_F + { + ACE_barrelTwist=12; + ACE_barrelLength=24; + }; + class LMG_Mk200_F : Rifle_Long_Base_F + { + ACE_barrelTwist=7; + ACE_barrelLength=12.5; + }; + class srifle_LRR_F : LRR_base_F + { + ACE_barrelTwist=13; + ACE_barrelLength=29; + }; + class srifle_GM6_F : GM6_base_F + { + ACE_barrelTwist=15; + ACE_barrelLength=43.3; + }; + class srifle_DMR_02_F: DMR_02_base_F + { + ACE_barrelTwist=10; + ACE_barrelLength=26; + }; + class srifle_DMR_03_F: DMR_03_base_F + { + ACE_barrelTwist=10; + ACE_barrelLength=20; + }; + class srifle_DMR_04_F: DMR_04_base_F + { + ACE_barrelTwist=8; + ACE_barrelLength=17.72; + }; + class srifle_DMR_05_blk_F: DMR_05_base_F + { + ACE_barrelTwist=14.17; + ACE_barrelLength=24.41; + }; + class srifle_DMR_06_camo_F: DMR_06_base_F + { + ACE_barrelTwist=12; + ACE_barrelLength=22; + }; + class MMG_01_hex_F: MMG_01_base_F + { + ACE_barrelTwist=14.17; + ACE_barrelLength=21.65; + }; + class MMG_02_camo_F: MMG_02_base_F + { + ACE_barrelTwist=9.25; + ACE_barrelLength=24; + }; + class HMG_M2 : HMG_127 + { + ACE_barrelTwist=12; + ACE_barrelLength=45; + }; + + class RH_deagle : Pistol_Base_F + { + ACE_barrelTwist=19; + ACE_barrelLength=6; + }; + class RH_sw659 : Pistol_Base_F + { + ACE_barrelTwist=9.8; + ACE_barrelLength=7.44; + }; + class RH_usp : Pistol_Base_F + { + ACE_barrelTwist=16; + ACE_barrelLength=4.41; + }; + class RH_uspm : Pistol_Base_F + { + ACE_barrelTwist=16; + ACE_barrelLength=6; + }; + class RH_mak : Pistol_Base_F + { + ACE_barrelTwist=9.45; + ACE_barrelLength=3.68; + }; + class RH_m1911 : Pistol_Base_F + { + ACE_barrelTwist=16; + ACE_barrelLength=5; + }; + class RH_kimber : Pistol_Base_F + { + ACE_barrelTwist=16; + ACE_barrelLength=5; + }; + class RH_m9 : Pistol_Base_F + { + ACE_barrelTwist=9.8; + ACE_barrelLength=4.9; + }; + class RH_vz61 : Pistol_Base_F + { + ACE_barrelTwist=16; + ACE_barrelLength=4.5; + }; + class RH_tec9 : Pistol_Base_F + { + ACE_barrelTwist=9.8; + ACE_barrelLength=5; + }; + class RH_muzi : Pistol_Base_F + { + ACE_barrelTwist=9.8; + ACE_barrelLength=5; + }; + class RH_g18 : Pistol_Base_F + { + ACE_barrelTwist=9.8; + ACE_barrelLength=4.49; + }; + class RH_g17 : Pistol_Base_F + { + ACE_barrelTwist=9.8; + ACE_barrelLength=4.49; + }; + class RH_tt33 : Pistol_Base_F + { + ACE_barrelTwist=9.45; + ACE_barrelLength=4.6; + }; + class RH_mk2 : Pistol_Base_F + { + ACE_barrelTwist=16; + ACE_barrelLength=4; + }; + class RH_p226 : Pistol_Base_F + { + ACE_barrelTwist=9.8; + ACE_barrelLength=4.4; + }; + class RH_g19 : Pistol_Base_F + { + ACE_barrelTwist=9.8; + ACE_barrelLength=4; + }; + class RH_gsh18 : Pistol_Base_F + { + ACE_barrelTwist=9.8; + ACE_barrelLength=4.1; + }; + class RH_mateba : Pistol_Base_F + { + ACE_barrelTwist=14; + ACE_barrelLength=6; + }; + class RH_python : Pistol_Base_F + { + ACE_barrelTwist=14; + ACE_barrelLength=6; + }; + class RH_bull : Pistol_Base_F + { + ACE_barrelTwist=24; + ACE_barrelLength=6.5; + }; + class RH_ttracker : Pistol_Base_F + { + ACE_barrelTwist=12; + ACE_barrelLength=4; + }; + class RH_mp412 : Pistol_Base_F + { + ACE_barrelTwist=10; + ACE_barrelLength=6; + }; + class RH_fnp45 : Pistol_Base_F + { + ACE_barrelTwist=16; + ACE_barrelLength=4.5; + }; + class RH_fn57 : Pistol_Base_F + { + ACE_barrelTwist=9.1; + ACE_barrelLength=4.8; + }; + class RH_vp70 : Pistol_Base_F + { + ACE_barrelTwist=9.8; + ACE_barrelLength=4.6; + }; + class RH_cz75 : Pistol_Base_F + { + ACE_barrelTwist=9.7; + ACE_barrelLength=4.7; + }; + + class RH_PDW : Rifle_Base_F + { + ACE_barrelTwist=7; + ACE_barrelLength=10; + }; + + class RH_hb : Rifle_Base_F + { + ACE_barrelTwist=8; + ACE_barrelLength=6; + }; + class RH_sbr9 : Rifle_Base_F + { + ACE_barrelTwist=9.7; + ACE_barrelLength=9; + }; + class RH_ar10 : Rifle_Base_F + { + ACE_barrelTwist=11.25; + ACE_barrelLength=20.8; + }; + class RH_m4 : Rifle_Base_F + { + ACE_barrelTwist=7; + ACE_barrelLength=14.5; + }; + class RH_M4m : Rifle_Base_F + { + ACE_barrelTwist=7; + ACE_barrelLength=10.5; + }; + class RH_M4sbr : Rifle_Base_F + { + ACE_barrelTwist=7; + ACE_barrelLength=10.5; + }; + class RH_M16a1 : Rifle_Base_F + { + ACE_barrelTwist=14; + ACE_barrelLength=20; + }; + class RH_M16A2 : Rifle_Base_F + { + ACE_barrelTwist=7; + ACE_barrelLength=20; + }; + class RH_M16A3 : Rifle_Base_F + { + ACE_barrelTwist=7; + ACE_barrelLength=20; + }; + class RH_M16A4 : Rifle_Base_F + { + ACE_barrelTwist=7; + ACE_barrelLength=20; + }; + class RH_M16A6 : Rifle_Base_F + { + ACE_barrelTwist=7; + ACE_barrelLength=20; + }; + class RH_hk416 : Rifle_Base_F + { + ACE_barrelTwist=7; + ACE_barrelLength=14.5; + }; + class RH_hk416c : Rifle_Base_F + { + ACE_barrelTwist=7; + ACE_barrelLength=9; + }; + class RH_hk416s : Rifle_Base_F + { + ACE_barrelTwist=7; + ACE_barrelLength=10.4; + }; + class RH_m27iar : Rifle_Base_F + { + ACE_barrelTwist=7; + ACE_barrelLength=16.5; + }; + class RH_Mk12mod1 : Rifle_Base_F + { + ACE_barrelTwist=7; + ACE_barrelLength=18; + }; + class RH_SAMR : Rifle_Base_F + { + ACE_barrelTwist=7.7; + ACE_barrelLength=20; + }; + class RH_m110 : Rifle_Base_F + { + ACE_barrelTwist=10; + ACE_barrelLength=20; + }; + class RH_mk11 : Rifle_Base_F + { + ACE_barrelTwist=11.25; + ACE_barrelLength=24; + }; + class RH_sr25ec : Rifle_Base_F + { + ACE_barrelTwist=11.25; + ACE_barrelLength=20; + }; + + class hlc_rifle_ak74 : Rifle_Base_F + { + ACE_barrelTwist=7.87; + ACE_barrelLength=16.3; + }; + class hlc_rifle_aks74u : Rifle_Base_F + { + ACE_barrelTwist=6.3; + ACE_barrelLength=8.3; + }; + class hlc_rifle_ak47 : Rifle_Base_F + { + ACE_barrelTwist=9.45; + ACE_barrelLength=16.3; + }; + class hlc_rifle_akm : Rifle_Base_F + { + ACE_barrelTwist=7.87; + ACE_barrelLength=16.3; + }; + class hlc_rifle_rpk : Rifle_Base_F + { + ACE_barrelTwist=9.45; + ACE_barrelLength=23.2; + }; + class hlc_rifle_aek971 : Rifle_Base_F + { + ACE_barrelTwist=9.5; + ACE_barrelLength=17; + }; + class hlc_rifle_saiga12k : Rifle_Base_F + { + ACE_barrelTwist=0; + ACE_twistDirection=0; + ACE_barrelLength=16.9; + }; + class hlc_ar15_base : Rifle_Base_F + { + ACE_barrelTwist=7; + ACE_barrelLength=11.5; + }; + class hlc_rifle_bcmjack : Rifle_Base_F + { + ACE_barrelTwist=7; + ACE_barrelLength=14.5; + }; + class hlc_rifle_Bushmaster300 : Rifle_Base_F + { + ACE_barrelTwist=8; + ACE_barrelLength=16; + }; + class hlc_rifle_SAMR : Rifle_Base_F + { + ACE_barrelTwist=9; + ACE_barrelLength=16; + }; + class hlc_rifle_honeybase : Rifle_Base_F + { + ACE_barrelTwist=8; + ACE_barrelLength=6; + }; + class hlc_rifle_SLRchopmod : Rifle_Base_F + { + ACE_barrelTwist=12; + ACE_barrelLength=21; + }; + class hlc_rifle_LAR : Rifle_Base_F + { + ACE_barrelTwist=12; + ACE_barrelLength=21; + }; + class hlc_rifle_c1A1 : Rifle_Base_F + { + ACE_barrelTwist=12; + ACE_barrelLength=21.7; + }; + class hlc_rifle_FAL5061 : Rifle_Base_F + { + ACE_barrelTwist=12; + ACE_barrelLength=18; + }; + class hlc_rifle_STG58F : Rifle_Base_F + { + ACE_barrelTwist=12; + ACE_barrelLength=21; + }; + class hlc_rifle_SLR : Rifle_Base_F + { + ACE_barrelTwist=12; + ACE_barrelLength=21.7; + }; + class hlc_rifle_falosw : Rifle_Base_F + { + ACE_barrelTwist=12; + ACE_barrelLength=13; + }; + class hlc_rifle_psg1 : Rifle_Base_F + { + ACE_barrelTwist=12; + ACE_barrelLength=25.6; + }; + class hlc_rifle_g3sg1 : Rifle_Base_F + { + ACE_barrelTwist=12; + ACE_barrelLength=17.7; + }; + class hlc_rifle_hk51 : Rifle_Base_F + { + ACE_barrelTwist=12; + ACE_barrelLength=8.31; + }; + class hlc_rifle_hk53 : Rifle_Base_F + { + ACE_barrelTwist=7; + ACE_barrelLength=8.31; + }; + class hlc_rifle_g3a3 : Rifle_Base_F + { + ACE_barrelTwist=12; + ACE_barrelLength=17.7; + }; + class hlc_M14_base : Rifle_Base_F + { + ACE_barrelTwist=12; + ACE_barrelLength=22; + }; + class hlc_rifle_m14sopmod : Rifle_Base_F + { + ACE_barrelTwist=12; + ACE_barrelLength=18; + }; + class hlc_lmg_M60E4 : Rifle_Base_F + { + ACE_barrelTwist=12; + ACE_barrelLength=17; + }; + class hlc_lmg_m60 : Rifle_Base_F + { + ACE_barrelTwist=12; + ACE_barrelLength=22; + }; + + class hlc_smg_mp5k_PDW : Rifle_Base_F + { + ACE_barrelTwist=10; + ACE_barrelLength=4.5; + }; + class hlc_smg_mp5a2 : Rifle_Base_F + { + ACE_barrelTwist=10; + ACE_barrelLength=8.9; + }; + class hlc_smg_mp5a4 : Rifle_Base_F + { + ACE_barrelTwist=10; + ACE_barrelLength=8.9; + }; + class hlc_smg_mp5n : Rifle_Base_F + { + ACE_barrelTwist=10; + ACE_barrelLength=8.9; + }; + class hlc_smg_mp5sd5 : Rifle_Base_F + { + ACE_barrelTwist=10; + ACE_barrelLength=5.7; + }; + class hlc_smg_mp5sd6 : Rifle_Base_F + { + ACE_barrelTwist=10; + ACE_barrelLength=5.7; + }; + class hlc_smg_9mmar : Rifle_Base_F + { + ACE_barrelTwist=10; + ACE_barrelLength=8.9; + }; + class hlc_smg_mp510 : Rifle_Base_F + { + ACE_barrelTwist=15; + ACE_barrelLength=8.9; + }; + class hlc_smg_mp5a3 : Rifle_Base_F + { + ACE_barrelTwist=10; + ACE_barrelLength=8.9; + }; + + class hgun_mas_usp_F: Pistol_Base_F + { + ACE_barrelTwist=16; + ACE_barrelLength=4.41; + }; + class hgun_mas_m23_F: Pistol_Base_F + { + ACE_barrelTwist=16; + ACE_barrelLength=5.87; + }; + class hgun_mas_acp_F: Pistol_Base_F + { + ACE_barrelTwist=16; + ACE_barrelLength=5.03; + }; + class hgun_mas_m9_F: Pistol_Base_F + { + ACE_barrelTwist=10; + ACE_barrelLength=4.9; + }; + class hgun_mas_bhp_F: Pistol_Base_F + { + ACE_barrelTwist=10; + ACE_barrelLength=4.7; + }; + class hgun_mas_glock_F: Pistol_Base_F + { + ACE_barrelTwist=9.84; + ACE_barrelLength=4.48; + }; + class hgun_mas_glocksf_F: Pistol_Base_F + { + ACE_barrelTwist=15.75; + ACE_barrelLength=4.60; + }; + class hgun_mas_grach_F: Pistol_Base_F + { + ACE_barrelTwist=10; + ACE_barrelLength=4.4; + }; + class hgun_mas_mak_F: Pistol_Base_F + { + ACE_barrelTwist=9.45; + ACE_barrelLength=3.68; + }; + class hgun_mas_sa61_F: Pistol_Base_F + { + ACE_barrelTwist=16; + ACE_barrelLength=4.5; + }; + class hgun_mas_uzi_F: Pistol_Base_F + { + ACE_barrelTwist=10; + ACE_barrelLength=5.28; + }; + class arifle_mas_mk16 : Rifle_Base_F + { + ACE_barrelTwist=7; + ACE_barrelLength=13.8; + }; + class arifle_mas_mk16_l : Rifle_Base_F + { + ACE_barrelTwist=7; + ACE_barrelLength=18; + }; + class arifle_mas_mk17 : Rifle_Base_F + { + ACE_barrelTwist=12; + ACE_barrelLength=16; + }; + class srifle_mas_m110 : Rifle_Base_F + { + ACE_barrelTwist=10; + ACE_barrelLength=20; + }; + class arifle_mas_ak_74m : Rifle_Base_F + { + ACE_barrelTwist=7.87; + ACE_barrelLength=16.34; + }; + class arifle_mas_ak_74m_gl : Rifle_Base_F + { + ACE_barrelTwist=7.87; + ACE_barrelLength=16.34; + }; + class srifle_mas_svd : Rifle_Base_F + { + ACE_barrelTwist=9.4; + ACE_barrelLength=24.4; + }; + class srifle_mas_m91 : Rifle_Base_F + { + ACE_barrelTwist=10; + ACE_barrelLength=29; + }; + class srifle_mas_ksvk : Rifle_Base_F + { + ACE_barrelTwist=18; + ACE_barrelLength=39.37; + }; + class LMG_mas_rpk_F : Rifle_Base_F + { + ACE_barrelTwist=7.68; + ACE_barrelLength=23.2; + }; + class LMG_mas_pkm_F : Rifle_Base_F + { + ACE_barrelTwist=9.45; + ACE_barrelLength=25.4; + }; + class arifle_mas_aks74u : Rifle_Base_F + { + ACE_barrelTwist=6.3; + ACE_barrelLength=8.3; + }; + class arifle_mas_bizon : Rifle_Base_F + { + ACE_barrelTwist=9.45; + ACE_barrelLength=9.1; + }; + class arifle_mas_saiga : Rifle_Base_F + { + ACE_barrelTwist=0; + ACE_twistDirection=0; + ACE_barrelLength=16.93; + }; + class arifle_mas_hk416 : Rifle_Base_F + { + ACE_barrelTwist=7; + ACE_barrelLength=14.5; + }; + class arifle_mas_hk416_gl : Rifle_Base_F + { + ACE_barrelTwist=7; + ACE_barrelLength=14.5; + }; + class arifle_mas_hk416c : Rifle_Base_F + { + ACE_barrelTwist=7; + ACE_barrelLength=9.0; + }; + class arifle_mas_hk416_m203c : Rifle_Base_F + { + ACE_barrelTwist=7; + ACE_barrelLength=9.0; + }; + class arifle_mas_hk417c : Rifle_Base_F + { + ACE_barrelTwist=11; + ACE_barrelLength=13; + }; + class arifle_mas_m4 : Rifle_Base_F + { + ACE_barrelTwist=7; + ACE_barrelLength=14.5; + }; + class arifle_mas_m4c : Rifle_Base_F + { + ACE_barrelTwist=7; + ACE_barrelLength=10.3; + }; + class arifle_mas_l119 : Rifle_Base_F + { + ACE_barrelTwist=7; + ACE_barrelLength=16; + }; + class arifle_mas_l119_gl : Rifle_Base_F + { + ACE_barrelTwist=7; + ACE_barrelLength=16; + }; + class arifle_mas_l119_m203 : Rifle_Base_F + { + ACE_barrelTwist=7; + ACE_barrelLength=16; + }; + class arifle_mas_m16 : Rifle_Base_F + { + ACE_barrelTwist=7; + ACE_barrelLength=20; + }; + class arifle_mas_m16_gl : Rifle_Base_F + { + ACE_barrelTwist=7; + ACE_barrelLength=20; + }; + class srifle_mas_hk417 : Rifle_Base_F + { + ACE_barrelTwist=11; + ACE_barrelLength=16.5; + }; + class srifle_mas_sr25 : Rifle_Base_F + { + ACE_barrelTwist=11.25; + ACE_barrelLength=24; + }; + class srifle_mas_ebr : Rifle_Base_F + { + ACE_barrelTwist=12; + ACE_barrelLength=18; + }; + class srifle_mas_m24 : Rifle_Base_F + { + ACE_barrelTwist=11.25; + ACE_barrelLength=24; + }; + class arifle_mas_mp5 : Rifle_Base_F + { + ACE_barrelTwist=10; + ACE_barrelLength=8.9; + }; + class arifle_mas_mp5sd : Rifle_Base_F + { + ACE_barrelTwist=10; + ACE_barrelLength=5.7; + }; + class srifle_mas_m107 : Rifle_Base_F + { + ACE_barrelTwist=15; + ACE_barrelLength=29; + }; + class LMG_mas_M249_F : Rifle_Base_F + { + ACE_barrelTwist=7; + ACE_barrelLength=16.3; + }; + class LMG_mas_M249a_F : Rifle_Base_F + { + ACE_barrelTwist=7; + ACE_barrelLength=18; + }; + class LMG_mas_mk48_F : Rifle_Base_F + { + ACE_barrelTwist=12; + ACE_barrelLength=19.75; + }; + class LMG_mas_m240_F : Rifle_Base_F + { + ACE_barrelTwist=12; + ACE_barrelLength=24.8; + }; + class LMG_mas_mg3_F : Rifle_Base_F + { + ACE_barrelTwist=12; + ACE_barrelLength=22.2; + }; + class arifle_mas_g3 : Rifle_Base_F + { + ACE_barrelTwist=12; + ACE_barrelLength=17.7; + }; + class arifle_mas_g3_m203 : Rifle_Base_F + { + ACE_barrelTwist=12; + ACE_barrelLength=17.7; + }; + class arifle_mas_fal : Rifle_Base_F + { + ACE_barrelTwist=12; + ACE_barrelLength=21; + }; + class arifle_mas_fal_m203 : Rifle_Base_F + { + ACE_barrelTwist=12; + ACE_barrelLength=21; + }; + class arifle_mas_m1014 : Rifle_Base_F + { + ACE_barrelTwist=0; + ACE_twistDirection=0; + ACE_barrelLength=18.5; + }; + + class BWA3_P8 : Pistol_Base_F + { + ACE_barrelTwist=9.8; + ACE_barrelLength=4.25; + }; + class BWA3_MP7 : Pistol_Base_F + { + ACE_barrelTwist=6.3; + ACE_barrelLength=7.1; + }; + class BWA3_G36 : Rifle_Base_F + { + ACE_barrelTwist=7; + ACE_barrelLength=18.9; + }; + class BWA3_G36K : Rifle_Base_F + { + ACE_barrelTwist=7; + ACE_barrelLength=12.5; + }; + class BWA3_G28_Standard : Rifle_Long_Base_F + { + ACE_barrelTwist=12; + ACE_barrelLength=16.5; + }; + class BWA3_G27 : Rifle_Base_F + { + ACE_barrelTwist=12; + ACE_barrelLength=16; + }; + class BWA3_MG4 : Rifle_Long_Base_F + { + ACE_barrelTwist=7; + ACE_barrelLength=18.9; + }; + class BWA3_MG5 : Rifle_Long_Base_F + { + ACE_barrelTwist=12; + ACE_barrelLength=21.6; + }; + class BWA3_G82 : Rifle_Long_Base_F + { + ACE_barrelTwist=15; + ACE_barrelLength=29; + }; + + class Trixie_L131A1 : Pistol_Base_F + { + ACE_barrelTwist=9.8; + ACE_barrelLength=4.5; + }; + class Trixie_XM8_Carbine : Rifle_Base_F + { + ACE_barrelTwist=7; + ACE_barrelLength=12.5; + }; + class Trixie_XM8_Compact : Rifle_Base_F + { + ACE_barrelTwist=7; + ACE_barrelLength=9; + }; + class Trixie_XM8_SAW : Rifle_Base_F + { + ACE_barrelTwist=7; + ACE_barrelLength=20; + }; + class Trixie_XM8_SAW_NB : Rifle_Base_F + { + ACE_barrelTwist=7; + ACE_barrelLength=20; + }; + class Trixie_XM8_DMR : Rifle_Base_F + { + ACE_barrelTwist=7; + ACE_barrelLength=20; + }; + class Trixie_XM8_DMR_NB : Rifle_Base_F + { + ACE_barrelTwist=7; + ACE_barrelLength=20; + }; + class L129A1_base : Rifle_Base_F + { + ACE_barrelTwist=10; + ACE_barrelLength=16; + }; + class Trixie_Enfield : Rifle_Base_F + { + ACE_barrelTwist=10; + ACE_barrelLength=25.2; + }; + class Trixie_CZ550_Rail : Rifle_Base_F + { + ACE_barrelTwist=12; + ACE_barrelLength=23.622; + }; + class Trixie_FNFAL_Rail : Rifle_Base_F + { + ACE_barrelTwist=12; + ACE_barrelLength=21; + }; + + class Trixie_M110 : Rifle_Base_F + { + ACE_barrelTwist=11; + ACE_barrelLength=20; + }; + class Trixie_MK12 : Rifle_Base_F + { + ACE_barrelTwist=7; + ACE_barrelLength=18; + }; + class Trixie_LM308MWS : Rifle_Base_F + { + ACE_barrelTwist=11.25; + ACE_barrelLength=16; + }; + class Trixie_M14DMR : Rifle_Base_F + { + ACE_barrelTwist=12; + ACE_barrelLength=22; + }; + class Trixie_M14DMR_NG_Black_Short : Rifle_Base_F + { + ACE_barrelTwist=12; + ACE_barrelLength=18; + }; + class Trixie_M14DMR_NG_Short : Rifle_Base_F + { + ACE_barrelTwist=12; + ACE_barrelLength=18; + }; + class Trixie_M14 : Rifle_Base_F + { + ACE_barrelTwist=12; + ACE_barrelLength=22; + }; + class Trixie_M40A3 : Rifle_Base_F + { + ACE_barrelTwist=12; + ACE_barrelLength=24; + }; + class Trixie_CZ750 : Rifle_Base_F + { + ACE_barrelTwist=12; + ACE_barrelLength=26; + }; + class Trixie_M24 : Rifle_Base_F + { + ACE_barrelTwist=11.25; + ACE_barrelLength=24; + }; + class Trixie_AWM338 : Rifle_Base_F + { + ACE_barrelTwist=11; + ACE_barrelLength=27; + }; + class Trixie_M107 : Rifle_Base_F + { + ACE_barrelTwist=15; + ACE_barrelLength=29; + }; + class Trixie_AS50 : Rifle_Base_F + { + ACE_barrelTwist=15; + ACE_barrelLength=29; + }; + class L110A1_base : Rifle_Base_F + { + ACE_barrelTwist=7; + ACE_barrelLength=13.7; + }; + class Trixie_L86A2_base : Rifle_Base_F + { + ACE_barrelTwist=7; + ACE_barrelLength=25.4; + }; + class Trixie_l85a2_base : Rifle_Base_F + { + ACE_barrelTwist=7; + ACE_barrelLength=20.4; + }; + class L7A2_base : Rifle_Base_F + { + ACE_barrelTwist=12; + ACE_barrelLength=24.8; + }; + + class rhs_weap_pya : Pistol_Base_F + { + ACE_barrelTwist=10; + ACE_barrelLength=4.4; + }; + class rhs_weap_pkp : Rifle_Long_Base_F + { + ACE_barrelTwist=9.45; + ACE_barrelLength=25.9; + }; + class rhs_weap_pkm : Rifle_Long_Base_F + { + ACE_barrelTwist=9.45; + ACE_barrelLength=25.4; + }; + class rhs_weap_rpk74m : Rifle_Long_Base_F + { + ACE_barrelTwist=7.68; + ACE_barrelLength=23.2; + }; + class rhs_weap_rpk74 : Rifle_Long_Base_F + { + ACE_barrelTwist=7.68; + ACE_barrelLength=23.2; + }; + class rhs_weap_ak74m : Rifle_Base_F + { + ACE_barrelTwist=7.87; + ACE_barrelLength=16.3; + }; + class rhs_weap_aks74u : Rifle_Base_F + { + ACE_barrelTwist=6.3; + ACE_barrelLength=8.3; + }; + class rhs_weap_akm : Rifle_Base_F + { + ACE_barrelTwist=7.87; + ACE_barrelLength=16.3; + }; + class rhs_weap_svd : Rifle_Base_F + { + ACE_barrelTwist=9.4; + ACE_barrelLength=24.4; + }; + class rhs_weap_svds : Rifle_Base_F + { + ACE_barrelTwist=9.4; + ACE_barrelLength=22.2; + }; + class rhs_weap_m4_Base : Rifle_Base_F + { + ACE_barrelTwist=7; + ACE_barrelLength=14.5; + }; + class rhs_weap_m16a4 : Rifle_Base_F + { + ACE_barrelTwist=7; + ACE_barrelLength=20; + }; + class rhs_weap_m16a4_carryhandle : Rifle_Base_F + { + ACE_barrelTwist=7; + ACE_barrelLength=20; + }; + class rhs_weap_m16a4_grip : Rifle_Base_F + { + ACE_barrelTwist=7; + ACE_barrelLength=20; + }; + class rhs_weap_m240B : Rifle_Base_F + { + ACE_barrelTwist=12; + ACE_barrelLength=24.8; + }; + class rhs_weap_m249_pip : Rifle_Base_F + { + ACE_barrelTwist=7; + ACE_barrelLength=16.3; + }; + class rhs_weap_mk18 : Rifle_Base_F + { + ACE_barrelTwist=7; + ACE_barrelLength=10.3; + }; + class rhs_weap_M590_5RD : Rifle_Base_F + { + ACE_barrelTwist=0; + ACE_twistDirection=0; + ACE_barrelLength=18.5; + }; + class rhs_weap_M590_8RD : Rifle_Base_F + { + ACE_barrelTwist=0; + ACE_twistDirection=0; + ACE_barrelLength=20; + }; + class rhs_weap_sr25 : Rifle_Base_F + { + ACE_barrelTwist=11.25; + ACE_barrelLength=24; + }; + class rhs_weap_sr25_ec : Rifle_Base_F + { + ACE_barrelTwist=11.25; + ACE_barrelLength=20; + }; + class rhs_weap_XM2010_Base_F: Rifle_Base_F + { + ACE_barrelTwist=10; + ACE_barrelLength=24; + }; + + class R3F_PAMAS : Pistol_Base_F + { + ACE_barrelTwist=9.8; + ACE_barrelLength=4.9; + }; + class R3F_Famas_F1: Rifle_Base_F + { + ACE_barrelTwist=12; + ACE_barrelLength=19.2; + }; + class R3F_Famas_surb: Rifle_Base_F + { + ACE_barrelTwist=12; + ACE_barrelLength=15.9; + }; + class R3F_Minimi: Rifle_Base_F + { + ACE_barrelTwist=7; + ACE_barrelLength=13.7; + }; + class R3F_Minimi_762: Rifle_Base_F + { + ACE_barrelTwist=12; + ACE_barrelLength=19.8; + }; + class R3F_FRF2: Rifle_Base_F + { + ACE_barrelTwist=12; + ACE_barrelLength=25.59; + }; + class R3F_PGM_Hecate_II: Rifle_Base_F + { + ACE_barrelTwist=15; + ACE_barrelLength=27.6; + }; + class R3F_HK417S_HG : Rifle_Base_F + { + ACE_barrelTwist=11; + ACE_barrelLength=12; + }; + class R3F_HK417M : Rifle_Base_F + { + ACE_barrelTwist=11; + ACE_barrelLength=16; + }; + class R3F_HK417L : Rifle_Base_F + { + ACE_barrelTwist=11; + ACE_barrelLength=20; + }; + class R3F_M107 : Rifle_Base_F + { + ACE_barrelTwist=15; + ACE_barrelLength=29; + }; + class R3F_HK416M : Rifle_Base_F + { + ACE_barrelTwist=7; + ACE_barrelLength=14; + }; + class R3F_MP5SD : Rifle_Base_F + { + ACE_barrelTwist=10; + ACE_barrelLength=5.7; + }; + + class CUP_hgun_Colt1911 : Pistol_Base_F + { + ACE_barrelTwist=16; + ACE_barrelLength=5; + }; + class CUP_sgun_AA12 : Rifle_Base_F + { + ACE_barrelTwist=0; + ACE_twistDirection=0; + ACE_barrelLength=18; + }; + class CUP_arifle_AK_Base : Rifle_Base_F + { + ACE_barrelTwist=9.45; + ACE_barrelLength=16.3; + }; + class CUP_arifle_AK107_Base : Rifle_Base_F + { + ACE_barrelTwist=7.87; + ACE_barrelLength=16.3; + }; + class CUP_arifle_AKS_Base : Rifle_Base_F + { + ACE_barrelTwist=7.87; + ACE_barrelLength=16.3; + }; + class CUP_arifle_AKS74U : Rifle_Base_F + { + ACE_barrelTwist=6.3; + ACE_barrelLength=8.3; + }; + class CUP_arifle_RPK74 : Rifle_Long_Base_F + { + ACE_barrelTwist=7.68; + ACE_barrelLength=23.2; + }; + class CUP_srifle_AS50 : Rifle_Long_Base_F + { + ACE_barrelTwist=15; + ACE_barrelLength=29; + }; + class CUP_srifle_AWM_Base : Rifle_Long_Base_F + { + ACE_barrelTwist=11; + ACE_barrelLength=27; + }; + class CUP_smg_bizon : Rifle_Base_F + { + ACE_barrelTwist=9.45; + ACE_barrelLength=9.1; + }; + class CUP_hgun_Compact : Pistol_Base_F + { + ACE_barrelTwist=9.8; + ACE_barrelLength=3.74; + }; + class CUP_srifle_CZ750 : Rifle_Long_Base_F + { + ACE_barrelTwist=12; + ACE_barrelLength=26; + }; + class CUP_arifle_CZ805_Base : Rifle_Base_F + { + ACE_barrelTwist=12; + ACE_barrelLength=14; + }; + class CUP_arifle_CZ805_A1 : Rifle_Base_F + { + ACE_barrelTwist=12; + ACE_barrelLength=14; + }; + class CUP_arifle_CZ805_A2 : Rifle_Base_F + { + ACE_barrelTwist=12; + ACE_barrelLength=10.9; + }; + class CUP_srifle_DMR : Rifle_Base_F + { + ACE_barrelTwist=12; + ACE_barrelLength=22; + }; + class CUP_hgun_Duty : Pistol_Base_F + { + ACE_barrelTwist=9.8; + ACE_barrelLength=3.74; + }; + class CUP_arifle_FNFAL : Rifle_Base_F + { + ACE_barrelTwist=12; + ACE_barrelLength=21; + }; + class CUP_arifle_G36A : Rifle_Base_F + { + ACE_barrelTwist=7; + ACE_barrelLength=18.9; + }; + class CUP_arifle_G36K : Rifle_Base_F + { + ACE_barrelTwist=7; + ACE_barrelLength=12.5; + }; + class CUP_arifle_G36C : Rifle_Base_F + { + ACE_barrelTwist=7; + ACE_barrelLength=9; + }; + class CUP_arifle_MG36 : Rifle_Base_F + { + ACE_barrelTwist=7; + ACE_barrelLength=18.9; + }; + class CUP_hgun_Glock17 : Pistol_Base_F + { + ACE_barrelTwist=9.8; + ACE_barrelLength=4.49; + }; + class CUP_srifle_CZ550 : Rifle_Base_F + { + ACE_barrelTwist=12; + ACE_barrelLength=23.622; + }; + class CUP_srifle_ksvk : Rifle_Long_Base_F + { + ACE_barrelTwist=18; + ACE_barrelLength=39.37; + }; + class CUP_lmg_L7A2 : Rifle_Long_Base_F + { + ACE_barrelTwist=12; + ACE_barrelLength=24.8; + }; + class CUP_arifle_L85A2_Base : Rifle_Base_F + { + ACE_barrelTwist=7; + ACE_barrelLength=20.4; + }; + class CUP_lmg_L110A1 : Rifle_Long_Base_F + { + ACE_barrelTwist=7; + ACE_barrelLength=13.7; + }; + class CUP_srifle_LeeEnfield : Rifle_Base_F + { + ACE_barrelTwist=10; + ACE_barrelLength=25.2; + }; + class CUP_hgun_M9 : Pistol_Base_F + { + ACE_barrelTwist=9.8; + ACE_barrelLength=4.9; + }; + class CUP_srifle_M14 : Rifle_Base_F + { + ACE_barrelTwist=12; + ACE_barrelLength=22; + }; + class CUP_arifle_M16_Base : Rifle_Base_F + { + ACE_barrelTwist=14; + ACE_barrelLength=20; + }; + class CUP_arifle_M4_Base : Rifle_Base_F + { + ACE_barrelTwist=7; + ACE_barrelLength=14.5; + }; + class CUP_srifle_Mk12SPR : Rifle_Base_F + { + ACE_barrelTwist=7; + ACE_barrelLength=18; + }; + class CUP_srifle_M24_des : Rifle_Base_F + { + ACE_barrelTwist=11.25; + ACE_barrelLength=24; + }; + class CUP_lmg_M60A4 : Rifle_Long_Base_F + { + ACE_barrelTwist=12; + ACE_barrelLength=17; + }; + class CUP_srifle_M107_Base : Rifle_Long_Base_F + { + ACE_barrelTwist=15; + ACE_barrelLength=29; + }; + class CUP_srifle_M110 : Rifle_Base_F + { + ACE_barrelTwist=11; + ACE_barrelLength=20; + }; + class CUP_lmg_M240 : Rifle_Long_Base_F + { + ACE_barrelTwist=12; + ACE_barrelLength=24.8; + }; + class CUP_lmg_M249_para : Rifle_Long_Base_F + { + ACE_barrelTwist=7; + ACE_barrelLength=16.3; + }; + class CUP_lmg_M249 : Rifle_Long_Base_F + { + ACE_barrelTwist=7; + ACE_barrelLength=18; + }; + class CUP_sgun_M1014 : Rifle_Base_F + { + ACE_twistDirection=0; + ACE_barrelTwist=0; + ACE_barrelLength=18.5; + }; + class CUP_hgun_Makarov : Pistol_Base_F + { + ACE_barrelTwist=9.45; + ACE_barrelLength=3.68; + }; + class CUP_hgun_MicroUzi : Pistol_Base_F + { + ACE_barrelTwist=9.8; + ACE_barrelLength=5; + }; + class CUP_lmg_Mk48_Base : Rifle_Long_Base_F + { + ACE_barrelTwist=12; + ACE_barrelLength=19.75; + }; + class CUP_smg_MP5SD6 : Rifle_Base_F + { + ACE_barrelTwist=10; + ACE_barrelLength=5.7; + }; + class CUP_smg_MP5A5 : Rifle_Base_F + { + ACE_barrelTwist=10; + ACE_barrelLength=8.9; + }; + class CUP_hgun_PB6P9 : Rifle_Base_F + { + ACE_barrelTwist=9.45; + ACE_barrelLength=4.1; + }; + class CUP_hgun_Phantom : Rifle_Base_F + { + ACE_barrelTwist=9.7; + ACE_barrelLength=4.7; + }; + class CUP_lmg_PKM : Rifle_Long_Base_F + { + ACE_barrelTwist=9.45; + ACE_barrelLength=25.4; + }; + class CUP_lmg_Pecheneg : Rifle_Long_Base_F + { + ACE_barrelTwist=9.45; + ACE_barrelLength=25.9; + }; + class CUP_hgun_TaurusTracker455 : Pistol_Base_F + { + ACE_barrelTwist=12; + ACE_barrelLength=4; + }; + class CUP_arifle_Sa58P : Rifle_Base_F + { + ACE_barrelTwist=9.45; + ACE_barrelLength=15.4; + }; + class CUP_arifle_Sa58V : Rifle_Base_F + { + ACE_barrelTwist=9.45; + ACE_barrelLength=15.4; + }; + class CUP_hgun_SA61 : Pistol_Base_F + { + ACE_barrelTwist=16; + ACE_barrelLength=4.5; + }; + class CUP_sgun_Saiga12K: Rifle_Base_F + { + ACE_barrelTwist=0; + ACE_twistDirection=0; + ACE_barrelLength=16.9; + } + class CUP_arifle_Mk16_CQC : Rifle_Base_F + { + ACE_barrelTwist=7; + ACE_barrelLength=10; + }; + class CUP_arifle_Mk16_STD : Rifle_Base_F + { + ACE_barrelTwist=7; + ACE_barrelLength=14; + }; + class CUP_arifle_Mk16_SV : Rifle_Base_F + { + ACE_barrelTwist=7; + ACE_barrelLength=18; + }; + class CUP_arifle_Mk17_CQC : Rifle_Base_F + { + ACE_barrelTwist=12; + ACE_barrelLength=13; + }; + class CUP_arifle_Mk17_STD : Rifle_Base_F + { + ACE_barrelTwist=12; + ACE_barrelLength=16; + }; + class CUP_arifle_Mk20 : Rifle_Base_F + { + ACE_barrelTwist=12; + ACE_barrelLength=20; + }; + class CUP_srifle_SVD : Rifle_Base_F + { + ACE_barrelTwist=9.4; + ACE_barrelLength=24.4; + }; + class CUP_lmg_UK59 : Rifle_Long_Base_F + { + ACE_barrelTwist=15; + ACE_barrelLength=21.7; + }; + class CUP_DSHKM_W : MGun + { + ACE_barrelTwist=15; + ACE_barrelLength=42.1; + }; + class CUP_KPVT_W : MGun + { + ACE_barrelTwist=17.91; + ACE_barrelLength=53; + }; + class CUP_KPVB_W : MGun + { + ACE_barrelTwist=17.91; + ACE_barrelLength=53; + }; + class CUP_M134 : MGunCore + { + ACE_barrelTwist=12; + ACE_barrelLength=22; + }; + class CUP_M240_veh_W : Rifle_Long_Base_F + { + ACE_barrelTwist=12; + ACE_barrelLength=24.8; + }; + class CUP_PKT_W : MGun + { + ACE_barrelTwist=9.45; + ACE_barrelLength=28.43; + }; + class CUP_srifle_VSSVintorez : Rifle_Base_F + { + ACE_barrelTwist=8.3; + ACE_barrelLength=7.9; + }; + class CUP_arifle_XM8_Base : Rifle_Base_F + { + ACE_barrelTwist=7; + ACE_barrelLength=12.5; + }; + class CUP_arifle_XM8_Carbine : Rifle_Base_F + { + ACE_barrelTwist=7; + ACE_barrelLength=12.5; + }; + class CUP_arifle_xm8_sharpshooter : Rifle_Base_F + { + ACE_barrelTwist=7; + ACE_barrelLength=20; + }; + class CUP_arifle_xm8_SAW : Rifle_Base_F + { + ACE_barrelTwist=7; + ACE_barrelLength=20; + }; + class CUP_arifle_XM8_Compact : Rifle_Base_F + { + ACE_barrelTwist=7; + ACE_barrelLength=9; + }; + class CUP_arifle_XM8_Railed_Base : Rifle_Base_F + { + ACE_barrelTwist=7; + ACE_barrelLength=12.5; + }; + class CUP_arifle_XM8_Carbine_FG : Rifle_Base_F + { + ACE_barrelTwist=7; + ACE_barrelLength=12.5; + }; + + class VTN_AK_BASE: Rifle_Base_F + { + ACE_barrelTwist=7.87; + ACE_barrelLength=16.3; + }; + class VTN_AK74M: Rifle_Base_F + { + ACE_barrelTwist=7.87; + ACE_barrelLength=16.3; + }; + class VTN_AK74M_GP25: Rifle_Base_F + { + ACE_barrelTwist=7.87; + ACE_barrelLength=16.3; + }; + class VTN_AK74M_GP30M: Rifle_Base_F + { + ACE_barrelTwist=7.87; + ACE_barrelLength=16.3; + }; + class VTN_AKS74: Rifle_Base_F + { + ACE_barrelTwist=7.87; + ACE_barrelLength=16.3; + }; + class VTN_AKS74N: Rifle_Base_F + { + ACE_barrelTwist=7.87; + ACE_barrelLength=16.3; + }; + class VTN_AKS74N_76: Rifle_Base_F + { + ACE_barrelTwist=7.87; + ACE_barrelLength=16.3; + }; + class VTN_AK74_76: Rifle_Base_F + { + ACE_barrelTwist=7.87; + ACE_barrelLength=16.3; + }; + class VTN_AKMS_aa: Rifle_Base_F + { + ACE_barrelTwist=7.87; + ACE_barrelLength=10.3; + }; + class VTN_AKS74U_BASE: Rifle_Base_F + { + ACE_barrelTwist=6.3; + ACE_barrelLength=8.3; + }; + class VTN_AKM_BASE: Rifle_Base_F + { + ACE_barrelTwist=7.87; + ACE_barrelLength=16.3; + }; + class VTN_AKMS: Rifle_Base_F + { + ACE_barrelTwist=7.87; + ACE_barrelLength=16.3; + }; + class VTN_AKMS_T_P: Rifle_Base_F + { + ACE_barrelTwist=7.87; + ACE_barrelLength=16.3; + }; + class VTN_AK103_BASE: Rifle_Base_F + { + ACE_barrelTwist=9.45; + ACE_barrelLength=16.3; + }; + class VTN_AK104_BASE: Rifle_Base_F + { + ACE_barrelTwist=9.45; + ACE_barrelLength=12.4; + }; + class VTN_AK105_BASE: Rifle_Base_F + { + ACE_barrelTwist=10; + ACE_barrelLength=12.4; + }; + class VTN_AK105_P_BASE: Rifle_Base_F + { + ACE_barrelTwist=10; + ACE_barrelLength=12.4; + }; + class VTN_SVD_BASE: Rifle_Base_F + { + ACE_barrelTwist=9.4; + ACE_barrelLength=24.4; + }; + class VTN_SVD_63: Rifle_Base_F + { + ACE_barrelTwist=9.4; + ACE_barrelLength=24.4; + }; + class VTN_SVD_86: Rifle_Base_F + { + ACE_barrelTwist=9.4; + ACE_barrelLength=24.4; + }; + class VTN_SV98_BASE: Rifle_Base_F + { + ACE_barrelTwist=12.6; + ACE_barrelLength=25.59; + }; + class VTN_PKM_BAS: Rifle_Base_F + { + ACE_barrelTwist=9.45; + ACE_barrelLength=25.4; + }; + class VTN_PKP: Rifle_Base_F + { + ACE_barrelTwist=9.45; + ACE_barrelLength=25.9; + }; + class VTN_PYA: Pistol_Base_F + { + ACE_barrelTwist=10; + ACE_barrelLength=4.4; + }; + class VTN_PM: Pistol_Base_F + { + ACE_barrelTwist=9.45; + ACE_barrelLength=3.68; + }; + class VTN_PB: Pistol_Base_F + { + ACE_barrelTwist=9.45; + ACE_barrelLength=4.1; + }; + class VTN_GSH18: Pistol_Base_F + { + ACE_barrelTwist=9.8; + ACE_barrelLength=4.1; + }; + class VTN_PSS: Pistol_Base_F + { + ACE_barrelTwist=16; + ACE_barrelLength=1.4; + }; + class VTN_PKT: Rifle_Base_F + { + ACE_barrelTwist=9.45; + ACE_barrelLength=28.43; + }; + class VTN_KORD: Rifle_Base_F + { + ACE_barrelTwist=17.91; + ACE_barrelLength=53; + }; + class VTN_KPVT: Rifle_Base_F + { + ACE_barrelTwist=17.91; + ACE_barrelLength=53; + }; + class VTN_C_M4A1 : Rifle_Base_F + { + ACE_barrelTwist=7; + ACE_barrelLength=14.5; + }; + class VTN_MK18MOD0: Rifle_Base_F + { + ACE_barrelTwist=7; + ACE_barrelLength=10.3; + }; + class VTN_M16_BASE: Rifle_Base_F + { + ACE_barrelTwist=14; + ACE_barrelLength=20; + }; + class VTN_FN_SAMR_BASE: Rifle_Base_F + { + ACE_barrelTwist=7.7; + ACE_barrelLength=20; + }; + class VTN_M249_SAW_BASE: Rifle_Base_F + { + ACE_barrelTwist=7; + ACE_barrelLength=18; + }; + class VTN_M249_PARA: Rifle_Base_F + { + ACE_barrelTwist=7; + ACE_barrelLength=16.3; + }; + class VTN_M240G_BASE: Rifle_Base_F + { + ACE_barrelTwist=12; + ACE_barrelLength=24.8; + }; + class VTN_M9: Pistol_Base_F + { + ACE_barrelTwist=9.8; + ACE_barrelLength=4.9; + }; + class VTN_M45A1: Pistol_Base_F + { + ACE_barrelTwist=16; + ACE_barrelLength=5; + }; + class VTN_M24: Rifle_Base_F + { + ACE_barrelTwist=11.25; + ACE_barrelLength=24; + }; + class VTN_M240: Rifle_Base_F + { + ACE_barrelTwist=12; + ACE_barrelLength=24.8; + }; + class VTN_KO44: Rifle_Base_F + { + ACE_barrelTwist=9.5; + ACE_barrelLength=20.2; + }; + class VTN_SAIGA_MK03: Rifle_Base_F + { + ACE_twistDirection=9.45; + ACE_barrelLength=16.3; + }; +}; \ No newline at end of file From fdbd0c19057cefb52109fc5ed969c85561661ce9 Mon Sep 17 00:00:00 2001 From: PabstMirror Date: Mon, 20 Apr 2015 16:12:01 -0500 Subject: [PATCH 063/104] #777 - mDagr - Update map pos each frame. --- addons/microdagr/functions/fnc_mapOnDrawEH.sqf | 4 ++-- addons/microdagr/functions/fnc_openDisplay.sqf | 1 - addons/microdagr/functions/fnc_updateDisplay.sqf | 14 +++++++------- 3 files changed, 9 insertions(+), 10 deletions(-) diff --git a/addons/microdagr/functions/fnc_mapOnDrawEH.sqf b/addons/microdagr/functions/fnc_mapOnDrawEH.sqf index bff20a4b67c..644064d0697 100644 --- a/addons/microdagr/functions/fnc_mapOnDrawEH.sqf +++ b/addons/microdagr/functions/fnc_mapOnDrawEH.sqf @@ -49,11 +49,11 @@ if (GVAR(currentApplicationPage) == 1) then { } else { //Map Mode: if (GVAR(mapAutoTrackPosition)) then { - _theMap ctrlMapAnimAdd [0, (GVAR(mapZoom)/_mapSize), GVAR(gpsPositionASL)]; + _theMap ctrlMapAnimAdd [0, (GVAR(mapZoom)/_mapSize), (getPosASL ace_player)]; ctrlMapAnimCommit _theMap; }; _size = 48 * _mapSize; - _theMap drawIcon [QUOTE(PATHTO_R(images\icon_self.paa)), [0.533,0.769,0.76,0.75], GVAR(gpsPositionASL), _size, _size, (getDir ace_player), '', 0 ]; + _theMap drawIcon [QUOTE(PATHTO_R(images\icon_self.paa)), [0.533,0.769,0.76,0.75], (getPosASL ace_player), _size, _size, (getDir ace_player), '', 0 ]; if (GVAR(settingShowAllWaypointsOnMap)) then { _size = 32 * _mapSize; diff --git a/addons/microdagr/functions/fnc_openDisplay.sqf b/addons/microdagr/functions/fnc_openDisplay.sqf index ae5f7f47f59..b4cec0fe464 100644 --- a/addons/microdagr/functions/fnc_openDisplay.sqf +++ b/addons/microdagr/functions/fnc_openDisplay.sqf @@ -83,7 +83,6 @@ if ((_oldShowMode == DISPLAY_MODE_CLOSED) && {GVAR(currentShowMode) != DISPLAY_M }; [_pfID] call CBA_fnc_removePerFrameHandler; } else { - GVAR(gpsPositionASL) = getPosAsl ace_player; if (GVAR(currentShowMode) == DISPLAY_MODE_HIDDEN) then { //If display is hidden, and we can show, then swithc modes: if ([DISPLAY_MODE_DISPLAY] call FUNC(canShow)) then { diff --git a/addons/microdagr/functions/fnc_updateDisplay.sqf b/addons/microdagr/functions/fnc_updateDisplay.sqf index 2a5f34a12c6..26e5ef86389 100644 --- a/addons/microdagr/functions/fnc_updateDisplay.sqf +++ b/addons/microdagr/functions/fnc_updateDisplay.sqf @@ -44,7 +44,7 @@ case (APP_MODE_INFODISPLAY): { (_display displayCtrl IDC_MODEDISPLAY_NORTHING) ctrlSetText _northingText; //Elevation: - _numASL = (GVAR(gpsPositionASL) select 2) + GVAR(mapAltitude); + _numASL = ((getPosASL ace_player) select 2) + GVAR(mapAltitude); _aboveSeaLevelText = [_numASL, 5, 0] call CBA_fnc_formatNumber; _aboveSeaLevelText = if (_numASL > 0) then {"+" + _aboveSeaLevelText + " MSL"} else {_aboveSeaLevelText + " MSL"}; (_display displayCtrl IDC_MODEDISPLAY_ELEVATIONNUM) ctrlSetText _aboveSeaLevelText; @@ -88,13 +88,13 @@ case (APP_MODE_INFODISPLAY): { }; if (!(_targetPosLocationASL isEqualTo [])) then { - _bearing = [GVAR(gpsPositionASL), _targetPosLocationASL] call BIS_fnc_dirTo; + _bearing = [(getPosASL ace_player), _targetPosLocationASL] call BIS_fnc_dirTo; _bearingText = if (GVAR(settingUseMils)) then { [(floor ((6400 / 360) * (_bearing))), 4, 0] call CBA_fnc_formatNumber; } else { ([(floor (_bearing)), 3, 1] call CBA_fnc_formatNumber) + "°" //degree symbol is in UTF-8 }; - _2dDistanceKm = ((GVAR(gpsPositionASL) select [0,2]) distance (_targetPosLocationASL select [0,2])) / 1000; + _2dDistanceKm = (((getPosASL ace_player) select [0,2]) distance (_targetPosLocationASL select [0,2])) / 1000; _rangeText = format ["%1km", ([_2dDistanceKm, 1, 1] call CBA_fnc_formatNumber)]; _numASL = (_targetPosLocationASL select 2) + GVAR(mapAltitude); _aboveSeaLevelText = [_numASL, 5, 0] call CBA_fnc_formatNumber; @@ -125,7 +125,7 @@ case (APP_MODE_COMPASS): { (_display displayCtrl IDC_MODECOMPASS_RANGE) ctrlSetText ""; (_display displayCtrl IDC_MODECOMPASS_TARGET) ctrlSetText ""; } else { - _playerPos2d = GVAR(gpsPositionASL) select [0,2]; + _playerPos2d = (getPosASL ace_player) select [0,2]; _targetPosName = ""; _targetPosLocationASL = []; @@ -145,13 +145,13 @@ case (APP_MODE_COMPASS): { _rangeText = "---"; if (!(_targetPosLocationASL isEqualTo [])) then { - _bearing = [GVAR(gpsPositionASL), _targetPosLocationASL] call BIS_fnc_dirTo; + _bearing = [(getPosASL ace_player), _targetPosLocationASL] call BIS_fnc_dirTo; _bearingText = if (GVAR(settingUseMils)) then { [(floor ((6400 / 360) * (_bearing))), 4, 0] call CBA_fnc_formatNumber; } else { ([(floor (_bearing)), 3, 1] call CBA_fnc_formatNumber) + "°" //degree symbol is in UTF-8 }; - _2dDistanceKm = ((GVAR(gpsPositionASL) select [0,2]) distance (_targetPosLocationASL select [0,2])) / 1000; + _2dDistanceKm = (((getPosASL ace_player) select [0,2]) distance (_targetPosLocationASL select [0,2])) / 1000; _rangeText = format ["%1km", ([_2dDistanceKm, 1, 1] call CBA_fnc_formatNumber)]; }; @@ -169,7 +169,7 @@ case (APP_MODE_WAYPOINTS): { { EXPLODE_2_PVT(_x,_wpName,_wpPos); _wpListBox lbAdd _wpName; - _2dDistanceKm = ((GVAR(gpsPositionASL) select [0,2]) distance (_wpPos select [0,2])) / 1000; + _2dDistanceKm = (((getPosASL ace_player) select [0,2]) distance (_wpPos select [0,2])) / 1000; _wpListBox lbSetTextRight [_forEachIndex, (format ["%1km", ([_2dDistanceKm, 1, 1] call CBA_fnc_formatNumber)])]; } forEach _waypoints; From 90288b495ed5468866fb8a644881d4bf5cd06a43 Mon Sep 17 00:00:00 2001 From: esteldunedain Date: Mon, 20 Apr 2015 18:24:12 -0300 Subject: [PATCH 064/104] Interactions inside vehicles. Skip the "Main Interactions" level; mount its children intead. --- addons/interaction/functions/fnc_addPassengerActions.sqf | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/addons/interaction/functions/fnc_addPassengerActions.sqf b/addons/interaction/functions/fnc_addPassengerActions.sqf index 9e577ed7bbc..82e3b3b4fbb 100644 --- a/addons/interaction/functions/fnc_addPassengerActions.sqf +++ b/addons/interaction/functions/fnc_addPassengerActions.sqf @@ -24,6 +24,10 @@ _actionTrees = missionNamespace getVariable [_varName, []]; _actions = []; // Mount unit MainActions menu -_actions pushBack [(_actionTrees select 0) select 0, (_actionTrees select 0) select 1, _unit]; + +{ + EXPLODE_2_PVT(_x,_actionData,_children); + _actions pushBack [_actionData, _children, _unit]; +} forEach ((_actionTrees select 0) select 1); _actions From 96be881ea9bfc6ae2ff3edcdb9d25f7e84289428 Mon Sep 17 00:00:00 2001 From: PabstMirror Date: Mon, 20 Apr 2015 18:28:01 -0500 Subject: [PATCH 065/104] User changeable text/shadow colors for interaction --- addons/interact_menu/XEH_clientInit.sqf | 9 ++++ addons/interact_menu/XEH_preInit.sqf | 1 + addons/interact_menu/config.cpp | 24 +++++++++ .../functions/fnc_renderIcon.sqf | 25 ++++----- .../functions/fnc_renderMenu.sqf | 12 ++--- .../functions/fnc_setupTextColors.sqf | 52 +++++++++++++++++++ addons/interact_menu/stringtable.xml | 14 ++++- 7 files changed, 114 insertions(+), 23 deletions(-) create mode 100644 addons/interact_menu/functions/fnc_setupTextColors.sqf diff --git a/addons/interact_menu/XEH_clientInit.sqf b/addons/interact_menu/XEH_clientInit.sqf index ea4a971563a..b8a8fc899bb 100644 --- a/addons/interact_menu/XEH_clientInit.sqf +++ b/addons/interact_menu/XEH_clientInit.sqf @@ -3,6 +3,15 @@ if (!hasInterface) exitWith {}; +//Setup text/shadow color matrix +[] call FUNC(setupTextColors); +["SettingChanged", { + PARAMS_2(_name,_value); + if ((_name == QGVAR(colorTextMax)) || {_name == QGVAR(colorTextMin)} || {_name == QGVAR(colorShadowMax)} || {_name == QGVAR(colorShadowMin)}) then { + [] call FUNC(setupTextColors); + }; +}] call EFUNC(common,addEventhandler); + // Install the render EH on the main display addMissionEventHandler ["Draw3D", DFUNC(render)]; diff --git a/addons/interact_menu/XEH_preInit.sqf b/addons/interact_menu/XEH_preInit.sqf index 747da7083e1..65d5dd43057 100644 --- a/addons/interact_menu/XEH_preInit.sqf +++ b/addons/interact_menu/XEH_preInit.sqf @@ -21,6 +21,7 @@ PREP(renderBaseMenu); PREP(renderIcon); PREP(renderMenu); PREP(renderSelector); +PREP(setupTextColors); PREP(splitPath); GVAR(keyDown) = false; diff --git a/addons/interact_menu/config.cpp b/addons/interact_menu/config.cpp index eeff688a1a4..433c2388c23 100644 --- a/addons/interact_menu/config.cpp +++ b/addons/interact_menu/config.cpp @@ -37,6 +37,30 @@ class ACE_Settings { isClientSettable = 1; displayName = "$STR_ACE_Interact_Menu_UseListMenu"; }; + class GVAR(colorTextMax) { + value[] = {1, 1, 1, 1}; + typeName = "COLOR"; + isClientSettable = 1; + displayName = "$STR_ACE_Interact_Menu_ColorTextMax"; + }; + class GVAR(colorTextMin) { + value[] = {1, 1, 1, 0.25}; + typeName = "COLOR"; + isClientSettable = 1; + displayName = "$STR_ACE_Interact_Menu_ColorTextMin"; + }; + class GVAR(colorShadowMax) { + value[] = {1, 1, 1, 1}; + typeName = "COLOR"; + isClientSettable = 1; + displayName = "$STR_ACE_Interact_Menu_ColorShadowMax"; + }; + class GVAR(colorShadowMin) { + value[] = {1, 1, 1, 0.25}; + typeName = "COLOR"; + isClientSettable = 1; + displayName = "$STR_ACE_Interact_Menu_ColorShadowMin"; + }; }; class ACE_Extensions { diff --git a/addons/interact_menu/functions/fnc_renderIcon.sqf b/addons/interact_menu/functions/fnc_renderIcon.sqf index 3da1777bedd..9107b6d998c 100644 --- a/addons/interact_menu/functions/fnc_renderIcon.sqf +++ b/addons/interact_menu/functions/fnc_renderIcon.sqf @@ -4,12 +4,11 @@ * * Argument: * 0: Text - * 1: Color + * 1: Icon * 2: 2d position - * 3: ? - * 4: ? - * 5: ? - * 6: Icon + * 3: Color + * 4: Shadow Color + * 5: Icon Color * * Return value: * None @@ -18,11 +17,8 @@ */ #include "script_component.hpp" #define DEFAULT_ICON QUOTE(\z\ace\addons\interaction\ui\dot_ca.paa) -private ["_color", "_sPos", "_ctrl", "_icon"]; -_text = _this select 0; -_color = _this select 1; -_sPos = _this select 2; -_icon = _this select 6; +private ["_ctrl"]; +PARAMS_6(_text,_icon,_sPos,_textColor,_shadowColor,_iconColor); //systemChat format ["Icon %1 - %2,%3", _text, _sPos select 0, _sPos select 1]; @@ -37,16 +33,15 @@ if(_icon == "") then { }; _text = if (GVAR(UseListMenu)) then { - format ["%4", _icon, _color, _color, _text] + format ["%5", _icon, _iconColor, _textColor, _shadowColor, _text] } else { - format ["
%4", _icon, _color, _color, "ace_breakLine" callExtension _text]; + format ["
%5", _icon, _iconColor, _textColor, _shadowColor, "ace_breakLine" callExtension _text]; }; _ctrl ctrlSetStructuredText (parseText _text); _text = if (GVAR(UseListMenu)) then { - _ctrl ctrlSetPosition [(_sPos select 0)-(0.0095*SafeZoneW), (_sPos select 1)-(0.0095*SafeZoneW), 0.20*SafeZoneW, 0.035*SafeZoneW]; + _ctrl ctrlSetPosition [(_sPos select 0)-(0.0095*SafeZoneW), (_sPos select 1)-(0.0095*SafeZoneW), 0.20*SafeZoneW, 0.035*SafeZoneW]; } else { - _ctrl ctrlSetPosition [(_sPos select 0)-(0.0750*SafeZoneW), (_sPos select 1)-(0.0095*SafeZoneW), 0.15*SafeZoneW, 0.100*SafeZoneW]; + _ctrl ctrlSetPosition [(_sPos select 0)-(0.0750*SafeZoneW), (_sPos select 1)-(0.0095*SafeZoneW), 0.15*SafeZoneW, 0.100*SafeZoneW]; }; -//_ctrl ctrlSetBackgroundColor [0, 1, 0, 0.1]; _ctrl ctrlCommit 0; diff --git a/addons/interact_menu/functions/fnc_renderMenu.sqf b/addons/interact_menu/functions/fnc_renderMenu.sqf index b46740921e5..e80e9d41abb 100644 --- a/addons/interact_menu/functions/fnc_renderMenu.sqf +++ b/addons/interact_menu/functions/fnc_renderMenu.sqf @@ -45,19 +45,17 @@ _menuInSelectedPath = true; // Render icon // ARGB Color (First Hex Pair is transparancy) -_color = "#FFFFFFFF"; +_textColor = GVAR(colorSelected); +_shadowColor = GVAR(colorSelectedShadow); if(!_menuInSelectedPath) then { - if (_menuDepth > 0) then { - _color = format ["#%1FFFFFF", [255 * ((((count _path) - 1)/_menuDepth) max 0.25)] call EFUNC(common,toHex)]; - } else { - _color = format ["#%1FFFFFF", [255 * 0.75] call EFUNC(common,toHex)]; - }; + _textColor = (GVAR(colorNotSelectedMatrix) select (count _path)) select _menuDepth; + _shadowColor = (GVAR(colorShadowNotSelectedMatrix) select (count _path)) select _menuDepth; }; //END_COUNTER(constructing_colors); //BEGIN_COUNTER(fnc_renderIcons); -[_actionData select 1, _color, _sPos, 1, 1, 0, _actionData select 2, 0.5, 0.025, "TahomaB"] call FUNC(renderIcon); +[_actionData select 1, _actionData select 2, _sPos, _textColor, _shadowColor, "#FFFFFFFF"] call FUNC(renderIcon); //END_COUNTER(fnc_renderIcons); diff --git a/addons/interact_menu/functions/fnc_setupTextColors.sqf b/addons/interact_menu/functions/fnc_setupTextColors.sqf new file mode 100644 index 00000000000..5df9c589da9 --- /dev/null +++ b/addons/interact_menu/functions/fnc_setupTextColors.sqf @@ -0,0 +1,52 @@ +/* + * Author: PabstMirror + * Builds color strings needed for displaying interaction text + * + * Argument: + * None + * + * Return value: + * None + * + * Public: No + */ +#include "script_component.hpp" + +private ["_mixColor", "_rowT", "_rowS", "_menuDepth", "_pathCount", "_menuInSelectedPath", "_color", "_path"]; + +//Mixes 2 colors (number arrays) and makes a color string "#AARRGGBB" for structured text +_mixColor = { + PARAMS_3(_color1,_color2,_ratio); + private ["_return", "_mix", "_index"]; + _return = ""; + for "_index" from 0 to 3 do { + _mix = linearConversion [0, 1, _ratio, (_color1 select _index), (_color2 select _index)]; + if (_index != 3) then { + _return = _return + ([255 * _mix] call EFUNC(common,toHex)); + } else { + _return = "#" + ([255 * _mix] call EFUNC(common,toHex)) + _return; + }; + }; + _return +}; + +GVAR(colorSelected) = [GVAR(colorTextMin), GVAR(colorTextMax), 1] call _mixColor; +GVAR(colorSelectedShadow) = [GVAR(colorShadowMin), GVAR(colorShadowMax), 1] call _mixColor; +GVAR(colorNotSelectedMatrix) = []; +GVAR(colorShadowNotSelectedMatrix) = []; + +for "_pathCount" from 0 to 15 do { + _rowT = []; + _rowS = []; + for "_menuDepth" from 0 to 15 do { + if (_menuDepth > 0) then { + _rowT pushBack ([GVAR(colorTextMin), GVAR(colorTextMax), (((_pathCount - 1) / _menuDepth) max 0.25)] call _mixColor); + _rowS pushBack ([GVAR(colorShadowMin), GVAR(colorShadowMax), (((_pathCount - 1) / _menuDepth) max 0.25)] call _mixColor); + } else { + _rowT pushBack ([GVAR(colorTextMin), GVAR(colorTextMax), 0] call _mixColor); + _rowS pushBack ([GVAR(colorShadowMin), GVAR(colorShadowMax), 0] call _mixColor); + }; + }; + GVAR(colorNotSelectedMatrix) pushBack _rowT; + GVAR(colorShadowNotSelectedMatrix) pushBack _rowS; +}; diff --git a/addons/interact_menu/stringtable.xml b/addons/interact_menu/stringtable.xml index 0b37f40f5ef..55d67788f43 100644 --- a/addons/interact_menu/stringtable.xml +++ b/addons/interact_menu/stringtable.xml @@ -71,5 +71,17 @@ Járműves cselekvések Interazioni con veicoli
+ + Interaction - Text Max + + + Interaction - Text Min + + + Interaction - Shadow Max + + + Interaction - Shadow Min + - + \ No newline at end of file From 5e440686bbb9c52f5d71965b04a4e001181f38ba Mon Sep 17 00:00:00 2001 From: commy2 Date: Tue, 21 Apr 2015 04:43:24 +0200 Subject: [PATCH 066/104] put weapon on back without having to stand up --- addons/movement/CfgMoves.hpp | 13 +++++++++++-- 1 file changed, 11 insertions(+), 2 deletions(-) diff --git a/addons/movement/CfgMoves.hpp b/addons/movement/CfgMoves.hpp index 677ad3dc94c..f82ae207a23 100644 --- a/addons/movement/CfgMoves.hpp +++ b/addons/movement/CfgMoves.hpp @@ -5,10 +5,16 @@ class CfgMovesBasic { }; class Actions { - class RifleStandActionsNoAdjust; - class RifleLowStandActionsNoAdjust; + class RifleBaseStandActions; + class RifleKneelActions: RifleBaseStandActions { + Civil = "AmovPknlMstpSnonWnonDnon"; + }; + class RifleProneActions: RifleBaseStandActions { + Civil = "AmovPpneMstpSnonWnonDnon"; + }; // WEAPON RAISED - RUNNING + class RifleStandActionsNoAdjust; class RifleStandActionsRunF: RifleStandActionsNoAdjust { getOver = "AovrPercMrunSrasWrflDf"; }; @@ -18,6 +24,7 @@ class CfgMovesBasic { class RifleStandActionsRunFR: RifleStandActionsNoAdjust { getOver = "AovrPercMrunSrasWrflDf"; }; + // WEAPON RAISED - SPRINTING class RifleStandEvasiveActionsF: RifleStandActionsNoAdjust { getOver = "AovrPercMrunSrasWrflDf"; @@ -28,7 +35,9 @@ class CfgMovesBasic { class RifleStandEvasiveActionsFR: RifleStandActionsNoAdjust { getOver = "AovrPercMrunSrasWrflDf"; }; + // WEAPON LOWERED - RUNNING + class RifleLowStandActionsNoAdjust; class RifleLowStandActionsRunF: RifleLowStandActionsNoAdjust { getOver = "AovrPercMrunSrasWrflDf"; }; From de660cf45fad63d1950bfa7ed7e70e9d645d2fae Mon Sep 17 00:00:00 2001 From: commy2 Date: Tue, 21 Apr 2015 05:21:04 +0200 Subject: [PATCH 067/104] messing with animations --- addons/movement/CfgMoves.hpp | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/addons/movement/CfgMoves.hpp b/addons/movement/CfgMoves.hpp index f82ae207a23..5d7d17c5d47 100644 --- a/addons/movement/CfgMoves.hpp +++ b/addons/movement/CfgMoves.hpp @@ -11,6 +11,12 @@ class CfgMovesBasic { }; class RifleProneActions: RifleBaseStandActions { Civil = "AmovPpneMstpSnonWnonDnon"; + SecondaryWeapon = "AmovPpneMstpSrasWlnrDnon"; + }; + + class PistolStandActions; + class PistolProneActions: PistolStandActions { + SecondaryWeapon = "AmovPpneMstpSrasWlnrDnon"; }; // WEAPON RAISED - RUNNING From 50933077565d80812008455fc778408258d173a2 Mon Sep 17 00:00:00 2001 From: commy2 Date: Tue, 21 Apr 2015 06:10:30 +0200 Subject: [PATCH 068/104] experiment with launcher anim --- addons/movement/CfgMoves.hpp | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/addons/movement/CfgMoves.hpp b/addons/movement/CfgMoves.hpp index 5d7d17c5d47..bfa9908d92e 100644 --- a/addons/movement/CfgMoves.hpp +++ b/addons/movement/CfgMoves.hpp @@ -19,6 +19,19 @@ class CfgMovesBasic { SecondaryWeapon = "AmovPpneMstpSrasWlnrDnon"; }; + class LauncherKneelActions; + class LauncherStandActions: LauncherKneelActions { + PlayerProne = "AmovPpneMstpSrasWlnrDnon"; + Down = "AmovPpneMstpSrasWlnrDnon"; + }; + + class LauncherProneActions: LauncherKneelActions { + TurnL = "AmovPpneMstpSrasWlnrDnon_turnl"; + TurnLRelaxed = "AmovPpneMstpSrasWlnrDnon_turnl"; + TurnR = "AmovPpneMstpSrasWlnrDnon_turnr"; + TurnRRelaxed = "AmovPpneMstpSrasWlnrDnon_turnr"; + }; + // WEAPON RAISED - RUNNING class RifleStandActionsNoAdjust; class RifleStandActionsRunF: RifleStandActionsNoAdjust { From 616eee6aa48aecea1459189f7225b25ed767ef44 Mon Sep 17 00:00:00 2001 From: commy2 Date: Tue, 21 Apr 2015 06:22:41 +0200 Subject: [PATCH 069/104] remove broken launcher anim --- addons/movement/CfgMoves.hpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/addons/movement/CfgMoves.hpp b/addons/movement/CfgMoves.hpp index bfa9908d92e..bd9519b013e 100644 --- a/addons/movement/CfgMoves.hpp +++ b/addons/movement/CfgMoves.hpp @@ -20,10 +20,10 @@ class CfgMovesBasic { }; class LauncherKneelActions; - class LauncherStandActions: LauncherKneelActions { + /*class LauncherStandActions: LauncherKneelActions { PlayerProne = "AmovPpneMstpSrasWlnrDnon"; Down = "AmovPpneMstpSrasWlnrDnon"; - }; + };*/ class LauncherProneActions: LauncherKneelActions { TurnL = "AmovPpneMstpSrasWlnrDnon_turnl"; From 6c4b078dce761a73b4ae43e7dc8dbb59d5a2f393 Mon Sep 17 00:00:00 2001 From: ulteq Date: Tue, 21 Apr 2015 09:46:57 +0200 Subject: [PATCH 070/104] Updated the default gun profile used for adding new profiles --- addons/atragmx/functions/fnc_add_new_gun.sqf | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/addons/atragmx/functions/fnc_add_new_gun.sqf b/addons/atragmx/functions/fnc_add_new_gun.sqf index bac04c2e074..0a0c034f39e 100644 --- a/addons/atragmx/functions/fnc_add_new_gun.sqf +++ b/addons/atragmx/functions/fnc_add_new_gun.sqf @@ -19,7 +19,7 @@ private ["_gunName", "_gunProfileEntry"]; _gunName = ctrlText 11001; if (_gunName != "") then { - _gunProfileEntry = [_gunName, 850, 500, 0.280, -0.0010000, 3.81, 0, 0.338, 0.338, 120, 0, 0, 9.460, "", "", 0.393, 1, "ICAO"]; + _gunProfileEntry = [_gunName, 810, 100, 0.0679, -0.0010350, 3.81, 0, 2, 10, 120, 0, 0, 9.525, 7.82, 25.40, 0.393, 1, "ICAO"], GVAR(gunList) = GVAR(gunList) + [_gunProfileEntry]; From f98a0cdfae2593b20a68e81e977b2c0d639d1720 Mon Sep 17 00:00:00 2001 From: ulteq Date: Tue, 21 Apr 2015 11:24:59 +0200 Subject: [PATCH 071/104] Overworked the scope click number GUI --- addons/atragmx/RscTitles.hpp | 9 +++++++++ addons/atragmx/functions/fnc_restore_user_data.sqf | 1 - addons/atragmx/functions/fnc_show_main_page.sqf | 5 ++++- addons/atragmx/functions/fnc_store_user_data.sqf | 1 - addons/atragmx/functions/fnc_update_scope_unit.sqf | 11 ++++++++--- 5 files changed, 21 insertions(+), 6 deletions(-) diff --git a/addons/atragmx/RscTitles.hpp b/addons/atragmx/RscTitles.hpp index fe45ef67f50..8b576e42751 100644 --- a/addons/atragmx/RscTitles.hpp +++ b/addons/atragmx/RscTitles.hpp @@ -595,11 +595,20 @@ class ATragMX_Display { class TEXT_SCOPE_UNIT: TEXT_GUN_LIST { idc=2000; style=ST_CENTER; + w=0.06; x=0.550*safezoneW+safezoneX+0.205; colorBackground[]={0,0,0,0}; text="TMOA"; action=QUOTE(call FUNC(cycle_scope_unit)); }; + class TEXT_SCOPE_CLICK_NUMBER: TEXT_GUN_LIST { + idc=2001; + style=ST_CENTER; + w=0.03; + x=0.550*safezoneW+safezoneX+0.27; + text="4"; + action=""; + }; class TEXT_CALCULATE: TEXT_SCOPE_UNIT { idc=3000; style=ST_RIGHT; diff --git a/addons/atragmx/functions/fnc_restore_user_data.sqf b/addons/atragmx/functions/fnc_restore_user_data.sqf index 55b73cc5b50..7204f17426c 100644 --- a/addons/atragmx/functions/fnc_restore_user_data.sqf +++ b/addons/atragmx/functions/fnc_restore_user_data.sqf @@ -18,7 +18,6 @@ GVAR(currentUnit) = 0 max (profileNamespace getVariable ["ACE_ATragMX_currentUnit", 2]) min 2; [(profileNamespace getVariable ["ACE_ATragMX_currentGun", 0]), true, false] call FUNC(change_gun); GVAR(currentTarget) = 0 max (profileNamespace getVariable ["ACE_ATragMX_currentTarget", 0]) min 3; -GVAR(currentScopeUnit) = 0 max (profileNamespace getVariable ["ACE_ATragMX_currentScopeUnit", 0]) min 3; GVAR(atmosphereModeTBH) = profileNamespace getVariable ["ACE_ATragMX_atmosphereModeTBH", true]; GVAR(altitude) = -1000 max (profileNamespace getVariable ["ACE_ATragMX_altitude", 0]) min 20000; diff --git a/addons/atragmx/functions/fnc_show_main_page.sqf b/addons/atragmx/functions/fnc_show_main_page.sqf index ed999948b0a..580d111c8ff 100644 --- a/addons/atragmx/functions/fnc_show_main_page.sqf +++ b/addons/atragmx/functions/fnc_show_main_page.sqf @@ -18,7 +18,7 @@ GVAR(showMainPage) = _this; {ctrlShow [_x, _this]} forEach [10, 100, 11, 110, 12, 120, 13, 130, 14, 140, 20, 200, 21, 210, 22, 220, 23, 230, 30, 300, 31, 310, 32, 320, 33, 330, 34, 340, 40, 400, 401, 402, 403, 41, 410, 411, 412, 42, 420, - 500, 501, 502, 503, 600, 601, 602, 603, 1000, 1001, 1002, 1003, 1004, 2000, 3000, 4000, 4001, 4002, 4003, 4004, 4005, 4006, 4007, 4008]; + 500, 501, 502, 503, 600, 601, 602, 603, 1000, 1001, 1002, 1003, 1004, 2000, 2001, 3000, 4000, 4001, 4002, 4003, 4004, 4005, 4006, 4007, 4008]; if (_this) then { if (GVAR(atmosphereModeTBH)) then { @@ -26,4 +26,7 @@ if (_this) then { } else { {ctrlShow [_x, false]} forEach [21, 210, 22, 220]; }; + if (GVAR(currentScopeUnit) != 3) then { + {ctrlShow [_x, false]} forEach [2001]; + }; }; diff --git a/addons/atragmx/functions/fnc_store_user_data.sqf b/addons/atragmx/functions/fnc_store_user_data.sqf index 2045276426d..01a5810fe29 100644 --- a/addons/atragmx/functions/fnc_store_user_data.sqf +++ b/addons/atragmx/functions/fnc_store_user_data.sqf @@ -20,7 +20,6 @@ profileNamespace setVariable ["ACE_ATragMX_profileNamespaceVersion", ATRAGMX_PRO profileNamespace setVariable ["ACE_ATragMX_currentUnit", GVAR(currentUnit)]; profileNamespace setVariable ["ACE_ATragMX_currentGun", GVAR(currentGun)]; profileNamespace setVariable ["ACE_ATragMX_currentTarget", GVAR(currentTarget)]; -profileNamespace setVariable ["ACE_ATragMX_currentScopeUnit", GVAR(currentScopeUnit)]; profileNamespace setVariable ["ACE_ATragMX_atmosphereModeTBH", GVAR(atmosphereModeTBH)]; profileNamespace setVariable ["ACE_ATragMX_altitude", GVAR(altitude)]; diff --git a/addons/atragmx/functions/fnc_update_scope_unit.sqf b/addons/atragmx/functions/fnc_update_scope_unit.sqf index 72efeb772e7..46db8c40c40 100644 --- a/addons/atragmx/functions/fnc_update_scope_unit.sqf +++ b/addons/atragmx/functions/fnc_update_scope_unit.sqf @@ -15,10 +15,15 @@ */ #include "script_component.hpp" +ctrlSetText [2000, GVAR(scopeUnits) select GVAR(currentScopeUnit)]; +ctrlSetText [2001, Str(GVAR(currentScopeClickNumber))]; + if (GVAR(currentScopeUnit) == 3) then { - ctrlSetText [2000, format["Clicks=%1", GVAR(currentScopeClickNumber)]]; ctrlSetText [5000, format["Clicks=%1", GVAR(currentScopeClickNumber)]]; + if (GVAR(showMainPage)) then { + ctrlShow [2001, true]; + }; } else { - ctrlSetText [2000, GVAR(scopeUnits) select GVAR(currentScopeUnit)]; ctrlSetText [5000, GVAR(scopeUnits) select GVAR(currentScopeUnit)]; -}; + ctrlShow [2001, false]; +}; \ No newline at end of file From 0cf2374475e333bff88ada313050c120df8f61d2 Mon Sep 17 00:00:00 2001 From: ulteq Date: Tue, 21 Apr 2015 11:43:16 +0200 Subject: [PATCH 072/104] Atmospheric Calc Method GUI improvement --- addons/atragmx/RscTitles.hpp | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/addons/atragmx/RscTitles.hpp b/addons/atragmx/RscTitles.hpp index 8b576e42751..fca0a6fcfe8 100644 --- a/addons/atragmx/RscTitles.hpp +++ b/addons/atragmx/RscTitles.hpp @@ -1222,7 +1222,10 @@ class ATragMX_Display { }; class TEXT_ATMO_ENV_DATA_CALC_METHOD: TEXT_GUN_AMMO_DATA_BORE_HEIGHT { idc=13011; - x=0.550*safezoneW+safezoneX+0.24; + style=64; + w=0.14; + h=0.07; + x=0.550*safezoneW+safezoneX+0.235; y=0.265*safezoneH+safezoneY+0.29; text="Calc Method"; }; From c24586ce02f884882c053bfcc95eb96ea771e1b3 Mon Sep 17 00:00:00 2001 From: ulteq Date: Tue, 21 Apr 2015 11:53:28 +0200 Subject: [PATCH 073/104] Reworked the result output GUI on the main page --- addons/atragmx/RscTitles.hpp | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/addons/atragmx/RscTitles.hpp b/addons/atragmx/RscTitles.hpp index fca0a6fcfe8..5fd3339f283 100644 --- a/addons/atragmx/RscTitles.hpp +++ b/addons/atragmx/RscTitles.hpp @@ -523,9 +523,12 @@ class ATragMX_Display { x=0.550*safezoneW+safezoneX+0.32; text="Cur"; }; - class TEXT_ELEVATION_OUTPUT_ABSOLUTE: ATragMX_RscEdit { + class TEXT_ELEVATION_OUTPUT_ABSOLUTE: ATragMX_RscText { idc=400; - w=0.07; + style=160; + sizeEx=0.025; + w=0.065; + h=0.032; x=0.550*safezoneW+safezoneX+0.17; y=0.265*safezoneH+safezoneY+0.50; text=""; @@ -537,7 +540,6 @@ class ATragMX_Display { class TEXT_ELEVATION_INPUT_CURRENT: TEXT_ELEVATION_OUTPUT_ABSOLUTE { idc=402; x=0.550*safezoneW+safezoneX+0.323; - onKeyUp=QUOTE(if (_this select 1 == 28) then {call FUNC(parse_input); call FUNC(update_result)}); }; class TEXT_WINDAGE: TEXT_ELEVATION { idc=41; @@ -555,7 +557,6 @@ class ATragMX_Display { class TEXT_WINDAGE_INPUT_CURRENT: TEXT_WINDAGE_OUTPUT_ABSOLUTE { idc=412; x=0.550*safezoneW+safezoneX+0.323; - onKeyUp=QUOTE(if (_this select 1 == 28) then {call FUNC(parse_input); call FUNC(update_result)}); }; class TEXT_LEAD: TEXT_GUN { idc=42; From aabec2aea2a95ec0a386e563657d2196dfafcb89 Mon Sep 17 00:00:00 2001 From: ViperMaul Date: Tue, 21 Apr 2015 04:02:10 -0700 Subject: [PATCH 074/104] Converting Tabs to Spaces. Confirming UTF-8 --- tools/make.py | 1750 +++++++++++++++++++++++++------------------------ 1 file changed, 876 insertions(+), 874 deletions(-) diff --git a/tools/make.py b/tools/make.py index 5146a666bba..aaaf6501c58 100644 --- a/tools/make.py +++ b/tools/make.py @@ -1,4 +1,4 @@ -#!/usr/bin/env python +#!/usr/bin/env python # vim: set fileencoding=utf-8 : # make.py @@ -35,8 +35,8 @@ import sys if sys.version_info[0] == 2: - print("Python 3 is required.") - sys.exit(1) + print("Python 3 is required.") + sys.exit(1) import os import os.path @@ -52,7 +52,7 @@ import re if sys.platform == "win32": - import winreg + import winreg ######## GLOBALS ######### work_drive = "" @@ -70,369 +70,371 @@ # -1 -> Directory does not exist # -2 -> General error (see stack traceback) def get_directory_hash(directory): - directory_hash = hashlib.sha1() - if not os.path.exists (directory): - return -1 - - try: - for root, dirs, files in os.walk(directory): - for names in files: - path = os.path.join(root, names) - try: - f = open(path, 'rb') - except: - # You can't open the file for some reason - f.close() - continue - - while 1: - # Read file in as little chunks - buf = f.read(4096) - if not buf: break - new = hashlib.sha1(buf) - directory_hash.update(new.digest()) - f.close() - - except: - # Print the stack traceback - traceback.print_exc() - return -2 - - return directory_hash.hexdigest() + directory_hash = hashlib.sha1() + if not os.path.exists (directory): + return -1 + + try: + for root, dirs, files in os.walk(directory): + for names in files: + path = os.path.join(root, names) + try: + f = open(path, 'rb') + except: + # You can't open the file for some reason + f.close() + continue + + while 1: + # Read file in as little chunks + buf = f.read(4096) + if not buf: break + new = hashlib.sha1(buf) + directory_hash.update(new.digest()) + f.close() + + except: + # Print the stack traceback + traceback.print_exc() + return -2 + + return directory_hash.hexdigest() # Copyright (c) André Burgaud # http://www.burgaud.com/bring-colors-to-the-windows-console-with-python/ if sys.platform == "win32": - from ctypes import windll, Structure, c_short, c_ushort, byref - - SHORT = c_short - WORD = c_ushort - - class COORD(Structure): - """struct in wincon.h.""" - _fields_ = [ - ("X", SHORT), - ("Y", SHORT)] - - class SMALL_RECT(Structure): - """struct in wincon.h.""" - _fields_ = [ - ("Left", SHORT), - ("Top", SHORT), - ("Right", SHORT), - ("Bottom", SHORT)] - - class CONSOLE_SCREEN_BUFFER_INFO(Structure): - """struct in wincon.h.""" - _fields_ = [ - ("dwSize", COORD), - ("dwCursorPosition", COORD), - ("wAttributes", WORD), - ("srWindow", SMALL_RECT), - ("dwMaximumWindowSize", COORD)] - - # winbase.h - STD_INPUT_HANDLE = -10 - STD_OUTPUT_HANDLE = -11 - STD_ERROR_HANDLE = -12 - - # wincon.h - FOREGROUND_BLACK = 0x0000 - FOREGROUND_BLUE = 0x0001 - FOREGROUND_GREEN = 0x0002 - FOREGROUND_CYAN = 0x0003 - FOREGROUND_RED = 0x0004 - FOREGROUND_MAGENTA = 0x0005 - FOREGROUND_YELLOW = 0x0006 - FOREGROUND_GREY = 0x0007 - FOREGROUND_INTENSITY = 0x0008 # foreground color is intensified. - - BACKGROUND_BLACK = 0x0000 - BACKGROUND_BLUE = 0x0010 - BACKGROUND_GREEN = 0x0020 - BACKGROUND_CYAN = 0x0030 - BACKGROUND_RED = 0x0040 - BACKGROUND_MAGENTA = 0x0050 - BACKGROUND_YELLOW = 0x0060 - BACKGROUND_GREY = 0x0070 - BACKGROUND_INTENSITY = 0x0080 # background color is intensified. - - stdout_handle = windll.kernel32.GetStdHandle(STD_OUTPUT_HANDLE) - SetConsoleTextAttribute = windll.kernel32.SetConsoleTextAttribute - GetConsoleScreenBufferInfo = windll.kernel32.GetConsoleScreenBufferInfo - - def get_text_attr(): - """Returns the character attributes (colors) of the console screen - buffer.""" - csbi = CONSOLE_SCREEN_BUFFER_INFO() - GetConsoleScreenBufferInfo(stdout_handle, byref(csbi)) - return csbi.wAttributes - - def set_text_attr(color): - """Sets the character attributes (colors) of the console screen - buffer. Color is a combination of foreground and background color, - foreground and background intensity.""" - SetConsoleTextAttribute(stdout_handle, color) + from ctypes import windll, Structure, c_short, c_ushort, byref + + SHORT = c_short + WORD = c_ushort + + class COORD(Structure): + """struct in wincon.h.""" + _fields_ = [ + ("X", SHORT), + ("Y", SHORT)] + + class SMALL_RECT(Structure): + """struct in wincon.h.""" + _fields_ = [ + ("Left", SHORT), + ("Top", SHORT), + ("Right", SHORT), + ("Bottom", SHORT)] + + class CONSOLE_SCREEN_BUFFER_INFO(Structure): + """struct in wincon.h.""" + _fields_ = [ + ("dwSize", COORD), + ("dwCursorPosition", COORD), + ("wAttributes", WORD), + ("srWindow", SMALL_RECT), + ("dwMaximumWindowSize", COORD)] + + # winbase.h + STD_INPUT_HANDLE = -10 + STD_OUTPUT_HANDLE = -11 + STD_ERROR_HANDLE = -12 + + # wincon.h + FOREGROUND_BLACK = 0x0000 + FOREGROUND_BLUE = 0x0001 + FOREGROUND_GREEN = 0x0002 + FOREGROUND_CYAN = 0x0003 + FOREGROUND_RED = 0x0004 + FOREGROUND_MAGENTA = 0x0005 + FOREGROUND_YELLOW = 0x0006 + FOREGROUND_GREY = 0x0007 + FOREGROUND_INTENSITY = 0x0008 # foreground color is intensified. + + BACKGROUND_BLACK = 0x0000 + BACKGROUND_BLUE = 0x0010 + BACKGROUND_GREEN = 0x0020 + BACKGROUND_CYAN = 0x0030 + BACKGROUND_RED = 0x0040 + BACKGROUND_MAGENTA = 0x0050 + BACKGROUND_YELLOW = 0x0060 + BACKGROUND_GREY = 0x0070 + BACKGROUND_INTENSITY = 0x0080 # background color is intensified. + + stdout_handle = windll.kernel32.GetStdHandle(STD_OUTPUT_HANDLE) + SetConsoleTextAttribute = windll.kernel32.SetConsoleTextAttribute + GetConsoleScreenBufferInfo = windll.kernel32.GetConsoleScreenBufferInfo + + def get_text_attr(): + """Returns the character attributes (colors) of the console screen + buffer.""" + csbi = CONSOLE_SCREEN_BUFFER_INFO() + GetConsoleScreenBufferInfo(stdout_handle, byref(csbi)) + return csbi.wAttributes + + def set_text_attr(color): + """Sets the character attributes (colors) of the console screen + buffer. Color is a combination of foreground and background color, + foreground and background intensity.""" + SetConsoleTextAttribute(stdout_handle, color) ############################################################################### def find_bi_tools(work_drive): - """Find BI tools.""" - - reg = winreg.ConnectRegistry(None, winreg.HKEY_CURRENT_USER) - try: - k = winreg.OpenKey(reg, r"Software\bohemia interactive\arma 3 tools") - arma3tools_path = winreg.QueryValueEx(k, "path")[0] - winreg.CloseKey(k) - except: - raise Exception("BadTools","Arma 3 Tools are not installed correctly or the P: drive needs to be created.") - - addonbuilder_path = os.path.join(arma3tools_path, "AddonBuilder", "AddonBuilder.exe") - dssignfile_path = os.path.join(arma3tools_path, "DSSignFile", "DSSignFile.exe") - dscreatekey_path = os.path.join(arma3tools_path, "DSSignFile", "DSCreateKey.exe") - cfgconvert_path = os.path.join(arma3tools_path, "CfgConvert", "CfgConvert.exe") - - if os.path.isfile(addonbuilder_path) and os.path.isfile(dssignfile_path) and os.path.isfile(dscreatekey_path) and os.path.isfile(cfgconvert_path): - return [addonbuilder_path, dssignfile_path, dscreatekey_path, cfgconvert_path] - else: - raise Exception("BadTools","Arma 3 Tools are not installed correctly or the P: drive needs to be created.") + """Find BI tools.""" + + reg = winreg.ConnectRegistry(None, winreg.HKEY_CURRENT_USER) + try: + k = winreg.OpenKey(reg, r"Software\bohemia interactive\arma 3 tools") + arma3tools_path = winreg.QueryValueEx(k, "path")[0] + winreg.CloseKey(k) + except: + raise Exception("BadTools","Arma 3 Tools are not installed correctly or the P: drive needs to be created.") + + addonbuilder_path = os.path.join(arma3tools_path, "AddonBuilder", "AddonBuilder.exe") + dssignfile_path = os.path.join(arma3tools_path, "DSSignFile", "DSSignFile.exe") + dscreatekey_path = os.path.join(arma3tools_path, "DSSignFile", "DSCreateKey.exe") + cfgconvert_path = os.path.join(arma3tools_path, "CfgConvert", "CfgConvert.exe") + + if os.path.isfile(addonbuilder_path) and os.path.isfile(dssignfile_path) and os.path.isfile(dscreatekey_path) and os.path.isfile(cfgconvert_path): + return [addonbuilder_path, dssignfile_path, dscreatekey_path, cfgconvert_path] + else: + raise Exception("BadTools","Arma 3 Tools are not installed correctly or the P: drive needs to be created.") def find_depbo_tools(regKey): - """Use registry entries to find DePBO-based tools.""" - stop = False - - if regKey == "HKCU": - reg = winreg.ConnectRegistry(None, winreg.HKEY_CURRENT_USER) - stop = True - else: - reg = winreg.ConnectRegistry(None, winreg.HKEY_LOCAL_MACHINE) - - try: - try: - k = winreg.OpenKey(reg, r"Software\Wow6432Node\Mikero\pboProject") - except FileNotFoundError: - k = winreg.OpenKey(reg, r"Software\Mikero\pboProject") - try: - pboproject_path = winreg.QueryValueEx(k, "exe")[0] - winreg.CloseKey(k) - print("Found pboproject.") - except: - print_error("ERROR: Could not find pboProject.") - - try: - k = winreg.OpenKey(reg, r"Software\Wow6432Node\Mikero\rapify") - except FileNotFoundError: - k = winreg.OpenKey(reg, r"Software\Mikero\rapify") - try: - rapify_path = winreg.QueryValueEx(k, "exe")[0] - winreg.CloseKey(k) - print("Found rapify.") - except: - print_error("Could not find rapify.") - - try: - k = winreg.OpenKey(reg, r"Software\Wow6432Node\Mikero\MakePbo") - except FileNotFoundError: - k = winreg.OpenKey(reg, r"Software\Mikero\MakePbo") - try: - makepbo_path = winreg.QueryValueEx(k, "exe")[0] - winreg.CloseKey(k) - print("Found makepbo.") - except: - print_error("Could not find makepbo.") - except: - if stop == True: - raise Exception("BadDePBO", "DePBO tools not installed correctly") - return -1 - - - #Strip any quotations from the path due to a MikeRo tool bug which leaves a trailing space in some of its registry paths. - return [pboproject_path.strip('"'),rapify_path.strip('"'),makepbo_path.strip('"')] + """Use registry entries to find DePBO-based tools.""" + stop = False + + if regKey == "HKCU": + reg = winreg.ConnectRegistry(None, winreg.HKEY_CURRENT_USER) + stop = True + else: + reg = winreg.ConnectRegistry(None, winreg.HKEY_LOCAL_MACHINE) + + try: + try: + k = winreg.OpenKey(reg, r"Software\Wow6432Node\Mikero\pboProject") + except FileNotFoundError: + k = winreg.OpenKey(reg, r"Software\Mikero\pboProject") + try: + pboproject_path = winreg.QueryValueEx(k, "exe")[0] + winreg.CloseKey(k) + print("Found pboproject.") + except: + print_error("ERROR: Could not find pboProject.") + + try: + k = winreg.OpenKey(reg, r"Software\Wow6432Node\Mikero\rapify") + except FileNotFoundError: + k = winreg.OpenKey(reg, r"Software\Mikero\rapify") + try: + rapify_path = winreg.QueryValueEx(k, "exe")[0] + winreg.CloseKey(k) + print("Found rapify.") + except: + print_error("Could not find rapify.") + + try: + k = winreg.OpenKey(reg, r"Software\Wow6432Node\Mikero\MakePbo") + except FileNotFoundError: + k = winreg.OpenKey(reg, r"Software\Mikero\MakePbo") + try: + makepbo_path = winreg.QueryValueEx(k, "exe")[0] + winreg.CloseKey(k) + print("Found makepbo.") + except: + print_error("Could not find makepbo.") + except: + if stop == True: + raise Exception("BadDePBO", "DePBO tools not installed correctly") + return -1 + + + #Strip any quotations from the path due to a MikeRo tool bug which leaves a trailing space in some of its registry paths. + return [pboproject_path.strip('"'),rapify_path.strip('"'),makepbo_path.strip('"')] def color(color): - """Set the color. Works on Win32 and normal terminals.""" - if sys.platform == "win32": - if color == "green": - set_text_attr(FOREGROUND_GREEN | get_text_attr() & 0x0070 | FOREGROUND_INTENSITY) - elif color == "red": - set_text_attr(FOREGROUND_RED | get_text_attr() & 0x0070 | FOREGROUND_INTENSITY) - elif color == "blue": - set_text_attr(FOREGROUND_BLUE | get_text_attr() & 0x0070 | FOREGROUND_INTENSITY) - elif color == "reset": - set_text_attr(FOREGROUND_GREY | get_text_attr() & 0x0070) - elif color == "grey": - set_text_attr(FOREGROUND_GREY | get_text_attr() & 0x0070) - else : - if color == "green": - sys.stdout.write('\033[92m') - elif color == "red": - sys.stdout.write('\033[91m') - elif color == "blue": - sys.stdout.write('\033[94m') - elif color == "reset": - sys.stdout.write('\033[0m') + """Set the color. Works on Win32 and normal terminals.""" + if sys.platform == "win32": + if color == "green": + set_text_attr(FOREGROUND_GREEN | get_text_attr() & 0x0070 | FOREGROUND_INTENSITY) + elif color == "yellow": + set_text_attr(FOREGROUND_YELLOW | get_text_attr() & 0x0070 | FOREGROUND_INTENSITY) + elif color == "red": + set_text_attr(FOREGROUND_RED | get_text_attr() & 0x0070 | FOREGROUND_INTENSITY) + elif color == "blue": + set_text_attr(FOREGROUND_BLUE | get_text_attr() & 0x0070 | FOREGROUND_INTENSITY) + elif color == "reset": + set_text_attr(FOREGROUND_GREY | get_text_attr() & 0x0070) + elif color == "grey": + set_text_attr(FOREGROUND_GREY | get_text_attr() & 0x0070) + else : + if color == "green": + sys.stdout.write('\033[92m') + elif color == "red": + sys.stdout.write('\033[91m') + elif color == "blue": + sys.stdout.write('\033[94m') + elif color == "reset": + sys.stdout.write('\033[0m') def print_error(msg): - color("red") - print ("ERROR: " + msg) - color("reset") + color("red") + print ("ERROR: " + msg) + color("reset") def print_green(msg): - color("green") - print(msg) - color("reset") + color("green") + print(msg) + color("reset") def print_blue(msg): - color("blue") - print(msg) - color("reset") + color("blue") + print(msg) + color("reset") def print_yellow(msg): - color("yellow") - print(msg) - color("reset") + color("yellow") + print(msg) + color("reset") - + def copy_important_files(source_dir,destination_dir): - - originalDir = os.getcwd() - importantFiles = ["mod.cpp", - "README.md", - "AUTHORS.txt", - "LICENSE", - "logo_ace3_ca.paa" - ] - - print_yellow ("source_dir: " + source_dir) - print_yellow("destination_dir: " + destination_dir) - - #copy importantFiles - try: - print_blue("\nSearching for important files in " + source_dir) - for file in importantFiles: - print_green("Copying file => " + os.path.join(source_dir,file)) - shutil.copyfile(os.path.join(source_dir,file),os.path.join(destination_dir,file)) - except: - print_error("COPYING IMPORTANT FILES.") - raise - - #copy all extension dlls - try: - os.chdir(os.path.join(source_dir)) - print_blue("\nSearching for DLLs in " + os.getcwd()) - filenames = glob.glob("*.dll") - - if not filenames: - print ("Empty SET") - - for dll in filenames: - print_green("Copying dll => " + os.path.join(source_dir,dll)) - if os.path.isfile(dll): - shutil.copyfile(os.path.join(source_dir,dll),os.path.join(destination_dir,dll)) - except: - print_error("COPYING DLL FILES.") - raise - finally: - os.chdir(originalDir) + + originalDir = os.getcwd() + importantFiles = ["mod.cpp", + "README.md", + "AUTHORS.txt", + "LICENSE", + "logo_ace3_ca.paa" + ] + + print_yellow ("source_dir: " + source_dir) + print_yellow("destination_dir: " + destination_dir) + + #copy importantFiles + try: + print_blue("\nSearching for important files in " + source_dir) + for file in importantFiles: + print_green("Copying file => " + os.path.join(source_dir,file)) + shutil.copyfile(os.path.join(source_dir,file),os.path.join(destination_dir,file)) + except: + print_error("COPYING IMPORTANT FILES.") + raise + + #copy all extension dlls + try: + os.chdir(os.path.join(source_dir)) + print_blue("\nSearching for DLLs in " + os.getcwd()) + filenames = glob.glob("*.dll") + + if not filenames: + print ("Empty SET") + + for dll in filenames: + print_green("Copying dll => " + os.path.join(source_dir,dll)) + if os.path.isfile(dll): + shutil.copyfile(os.path.join(source_dir,dll),os.path.join(destination_dir,dll)) + except: + print_error("COPYING DLL FILES.") + raise + finally: + os.chdir(originalDir) def copy_optionals_for_building(mod,pbos): - src_directories = os.listdir(optionals_root) - current_dir = os.getcwd() - - print("") - try: - - #special server.pbo processing - files = glob.glob(os.path.join(release_dir, "@ace","optionals","*.pbo")) - for file in files: - file_name = os.path.basename(file) - print ("Adding the following file: " + file_name) - pbos.append(file_name) - pbo_path = os.path.join(release_dir, "@ace","optionals",file_name) - if (os.path.isfile(pbo_path)): - print("Moving " + pbo_path + " for processing.") - shutil.move(pbo_path, os.path.join(release_dir,"@ace","addons",file_name)) - - except: - print_error("Error in moving") - raise - finally: - os.chdir(current_dir) - - print("") - try: - for dir_name in src_directories: - mod.append(dir_name) - if (dir_name == "userconfig"): - destination = os.path.join(work_drive,dir_name) - else: - destination = os.path.join(module_root,dir_name) - - print("Temporarily copying " + os.path.join(optionals_root,dir_name) + " => " + destination + " for building.") - shutil.rmtree(destination, True) - shutil.copytree(os.path.join(optionals_root,dir_name), destination) - except: - print_error("Copy Optionals Failed") - raise - finally: - os.chdir(current_dir) - + src_directories = os.listdir(optionals_root) + current_dir = os.getcwd() + + print("") + try: + + #special server.pbo processing + files = glob.glob(os.path.join(release_dir, "@ace","optionals","*.pbo")) + for file in files: + file_name = os.path.basename(file) + print ("Adding the following file: " + file_name) + pbos.append(file_name) + pbo_path = os.path.join(release_dir, "@ace","optionals",file_name) + if (os.path.isfile(pbo_path)): + print("Moving " + pbo_path + " for processing.") + shutil.move(pbo_path, os.path.join(release_dir,"@ace","addons",file_name)) + + except: + print_error("Error in moving") + raise + finally: + os.chdir(current_dir) + + print("") + try: + for dir_name in src_directories: + mod.append(dir_name) + if (dir_name == "userconfig"): + destination = os.path.join(work_drive,dir_name) + else: + destination = os.path.join(module_root,dir_name) + + print("Temporarily copying " + os.path.join(optionals_root,dir_name) + " => " + destination + " for building.") + shutil.rmtree(destination, True) + shutil.copytree(os.path.join(optionals_root,dir_name), destination) + except: + print_error("Copy Optionals Failed") + raise + finally: + os.chdir(current_dir) + def cleanup_optionals(mod,pbos): - print("") - try: - for dir_name in mod: - if (dir_name == "userconfig"): - destination = os.path.join(work_drive,dir_name) - else: - destination = os.path.join(module_root,dir_name) - - print("Cleaning " + destination) - - try: - file_name = "ace_{}.pbo".format(dir_name) - src_file_path = os.path.join(release_dir, "@ace","addons",file_name) - dst_file_path = os.path.join(release_dir, "@ace","optionals",file_name) - if (os.path.isfile(src_file_path)): - #print("Preserving " + file_name) - os.renames(src_file_path,dst_file_path) - except FileExistsError: - print_error(file_name + " already exists") - continue - shutil.rmtree(destination) - - except: - print_error("Cleaning Optionals Failed") - raise + print("") + try: + for dir_name in mod: + if (dir_name == "userconfig"): + destination = os.path.join(work_drive,dir_name) + else: + destination = os.path.join(module_root,dir_name) + + print("Cleaning " + destination) + + try: + file_name = "ace_{}.pbo".format(dir_name) + src_file_path = os.path.join(release_dir, "@ace","addons",file_name) + dst_file_path = os.path.join(release_dir, "@ace","optionals",file_name) + if (os.path.isfile(src_file_path)): + #print("Preserving " + file_name) + os.renames(src_file_path,dst_file_path) + except FileExistsError: + print_error(file_name + " already exists") + continue + shutil.rmtree(destination) + + except: + print_error("Cleaning Optionals Failed") + raise ############################################################################### def main(argv): - """Build an Arma addon suite in a directory from rules in a make.cfg file.""" - print_blue(("\nmake.py for Arma, modified for Advanced Combat Environment v" + __version__)) - - if sys.platform != "win32": - print_error("Non-Windows platform (Cygwin?). Please re-run from cmd.") - sys.exit(1) - - reg = winreg.ConnectRegistry(None, winreg.HKEY_CURRENT_USER) - try: - k = winreg.OpenKey(reg, r"Software\bohemia interactive\arma 3 tools") - arma3tools_path = winreg.QueryValueEx(k, "path")[0] - winreg.CloseKey(k) - except: - raise Exception("BadTools","Arma 3 Tools are not installed correctly or the P: drive needs to be created.") - - # Default behaviors - test = False # Copy to Arma 3 directory? - arg_modules = False # Only build modules on command line? - make_release = False # Make zip file from the release? - release_version = 0 # Version of release - use_pboproject = True # Default to pboProject build tool - make_target = "DEFAULT" # Which section in make.cfg to use for the build - new_key = False # Make a new key and use it to sign? - quiet = False # Suppress output from build tool? - - # Parse arguments - if "help" in argv or "-h" in argv or "--help" in argv: - print (""" + """Build an Arma addon suite in a directory from rules in a make.cfg file.""" + print_blue(("\nmake.py for Arma, modified for Advanced Combat Environment v" + __version__)) + + if sys.platform != "win32": + print_error("Non-Windows platform (Cygwin?). Please re-run from cmd.") + sys.exit(1) + + reg = winreg.ConnectRegistry(None, winreg.HKEY_CURRENT_USER) + try: + k = winreg.OpenKey(reg, r"Software\bohemia interactive\arma 3 tools") + arma3tools_path = winreg.QueryValueEx(k, "path")[0] + winreg.CloseKey(k) + except: + raise Exception("BadTools","Arma 3 Tools are not installed correctly or the P: drive needs to be created.") + + # Default behaviors + test = False # Copy to Arma 3 directory? + arg_modules = False # Only build modules on command line? + make_release = False # Make zip file from the release? + release_version = 0 # Version of release + use_pboproject = True # Default to pboProject build tool + make_target = "DEFAULT" # Which section in make.cfg to use for the build + new_key = False # Make a new key and use it to sign? + quiet = False # Suppress output from build tool? + + # Parse arguments + if "help" in argv or "-h" in argv or "--help" in argv: + print (""" make.py [help] [test] [force] [key ] [target ] [release ] [module name] [module name] [...] @@ -463,539 +465,539 @@ def main(argv): See the make.cfg file for additional build options. """) - sys.exit(0) - - if "force" in argv: - argv.remove("force") - force_build = True - else: - force_build = False - - if "test" in argv: - test = True - argv.remove("test") - - if "release" in argv: - make_release = True - release_version = argv[argv.index("release") + 1] - argv.remove(release_version) - argv.remove("release") - - if "target" in argv: - make_target = argv[argv.index("target") + 1] - argv.remove("target") - argv.remove(make_target) - force_build = True - - if "key" in argv: - new_key = True - key_name = argv[argv.index("key") + 1] - argv.remove("key") - argv.remove(key_name) - - if "quiet" in argv: - quiet = True - argv.remove("quiet") - - if "checkexternal" in argv: - argv.remove("checkexternal") - check_external = True - else: - check_external = False - - # Get the directory the make script is in. - make_root = os.path.dirname(os.path.realpath(__file__)) - make_root_parent = os.path.abspath(os.path.join(os.getcwd(), os.pardir)) - os.chdir(make_root) - - # Get latest commit ID - try: - gitpath = os.path.join(os.path.dirname(make_root), ".git") - assert os.path.exists(gitpath) - - commit_id = subprocess.check_output(["git", "rev-parse", "HEAD"]) - commit_id = str(commit_id, "utf-8")[:8] - except: - print_error("FAILED TO DETERMINE COMMIT ID.") - commit_id = "NOGIT" - - cfg = configparser.ConfigParser(); - try: - global work_drive - global module_root - global release_dir - global module_root_parent - global optionals_root - - cfg.read(os.path.join(make_root, "make.cfg")) - - # Project name (with @ symbol) - project = cfg.get(make_target, "project", fallback="@"+os.path.basename(os.getcwd())) - - # Private key path - key = cfg.get(make_target, "key", fallback=None) - - # Project prefix (folder path) - prefix = cfg.get(make_target, "prefix", fallback="") - - # Should we autodetect modules on a complete build? - module_autodetect = cfg.getboolean(make_target, "module_autodetect", fallback=True) - - # Manual list of modules to build for a complete build - modules = cfg.get(make_target, "modules", fallback=None) - # Parse it out - if modules: - modules = [x.strip() for x in modules.split(',')] - else: - modules = [] - - # List of directories to ignore when detecting - ignore = [x.strip() for x in cfg.get(make_target, "ignore", fallback="release").split(',')] - - # BI Tools work drive on Windows - work_drive = cfg.get(make_target, "work_drive", fallback="P:\\") - - # Which build tool should we use? - build_tool = cfg.get(make_target, "build_tool", fallback="addonbuilder").lower() - - # Release/build directory, relative to script dir - release_dir = cfg.get(make_target, "release_dir", fallback="release") - - # Project PBO file prefix (files are renamed to prefix_name.pbo) - pbo_name_prefix = cfg.get(make_target, "pbo_name_prefix", fallback=None) - - # Project module Root - module_root_parent = os.path.abspath(os.path.join(os.path.join(work_drive, prefix), os.pardir)) - module_root = cfg.get(make_target, "module_root", fallback=os.path.join(make_root_parent, "addons")) - optionals_root = os.path.join(module_root_parent, "optionals") - print_green ("module_root: " + module_root) - - if (os.path.isdir(module_root)): - os.chdir(module_root) - else: - print_error ("Directory " + module_root + " does not exist.") - sys.exit() - - if (os.path.isdir(optionals_root)): - print_green ("optionals_root: " + optionals_root) - else: - print_error ("Directory " + optionals_root + " does not exist.") - sys.exit() - - print_green ("release_dir: " + release_dir) - - except: - raise - print_error("Could not parse make.cfg.") - sys.exit(1) - - # See if we have been given specific modules to build from command line. - if len(argv) > 1 and not make_release: - arg_modules = True - modules = argv[1:] - - # Find the tools we need. - try: - tools = find_bi_tools(work_drive) - addonbuilder = tools[0] - dssignfile = tools[1] - dscreatekey = tools[2] - cfgconvert = tools[3] - - except: - print_error("Arma 3 Tools are not installed correctly or the P: drive has not been created.") - sys.exit(1) - - if build_tool == "pboproject": - try: - depbo_tools = find_depbo_tools("HKLM") - if depbo_tools == -1: - depbo_tools = find_depbo_tools("HKCU") - pboproject = depbo_tools[0] - rapifyTool = depbo_tools[1] - makepboTool = depbo_tools[2] - except: - raise - print_error("Could not find dePBO tools. Download the needed tools from: https://dev.withsix.com/projects/mikero-pbodll/files") - sys.exit(1) - - # Try to open and deserialize build cache file. - try: - cache = {} - with open(os.path.join(make_root, "make.cache"), 'r') as f: - cache_raw = f.read() - - cache = json.loads(cache_raw) - - except: - print ("No cache found.") - cache = {} - - #Temporarily copy optionals_root for building. They will be removed later. - optionals_modules = [] - optional_files = [] - copy_optionals_for_building(optionals_modules,optional_files) - - # Get list of subdirs in make root. - dirs = next(os.walk(module_root))[1] - - # Autodetect what directories to build. - if module_autodetect and not arg_modules: - modules = [] - for path in dirs: - # Any dir that has a config.cpp in its root is an addon to build. - config_path = os.path.join(path, 'config.cpp') - if os.path.isfile(config_path) and not path in ignore: - modules.append(path) - - # Make the key specified from command line if necessary. - if new_key: - if not os.path.isfile(os.path.join(module_root, key_name + ".biprivatekey")): - print_green("\nRequested key does not exist.") - ret = subprocess.call([dscreatekey, key_name]) # Created in make_root - if ret == 0: - print_blue("Created: " + os.path.join(module_root, key_name + ".biprivatekey")) - else: - print_error("Failed to create key!") - - try: - print_blue("Copying public key to release directory.") - - try: - os.makedirs(os.path.join(module_root, release_dir, "Keys")) - except: - pass - - shutil.copyfile(os.path.join(module_root, key_name + ".bikey"), os.path.join(module_root, release_dir, "Keys", key_name + ".bikey")) - - except: - raise - print_error("Could not copy key to release directory.") - - else: - print_green("\nNOTE: Using key " + os.path.join(module_root, key_name + ".biprivatekey")) - - key = os.path.join(module_root, key_name + ".biprivatekey") - - - # For each module, prep files and then build. - for module in modules: - print_green("\nMaking " + module + "-"*max(1, (60-len(module)))) - missing = False - - # Cache check - if module in cache: - old_sha = cache[module] - else: - old_sha = "" - - #We always build ACE_common so we can properly show the correct version stamp in the RPT file. - if module == "common": - old_sha = "" - - # Hash the module - new_sha = get_directory_hash(os.path.join(module_root, module)) - - # Is the pbo file missing? - missing = not os.path.isfile(os.path.join(release_dir, project, "addons", "ace_{}.pbo".format(module))) - if missing: - print("ace_{}.pbo".format(module) + " is missing. Building...") - - # Check if it needs rebuilt - # print ("Hash:", new_sha) - if old_sha == new_sha and not missing: - if not force_build: - print("Module has not changed.") - # Skip everything else - continue - - # Only do this if the project isn't stored directly on the work drive. - # Split the path at the drive name and see if they are on the same drive (usually P:) - if os.path.splitdrive(module_root)[0] != os.path.splitdrive(work_drive)[0]: - try: - # Remove old work drive version (ignore errors) - shutil.rmtree(os.path.join(work_drive, prefix, module), True) - - # Copy module to the work drive - shutil.copytree(module, os.path.join(work_drive, prefix, module)) - - except: - raise - print_error("ERROR: Could not copy module to work drive. Does the module exist?") - input("Press Enter to continue...") - print("Resuming build...") - continue - #else: - #print("WARNING: Module is stored on work drive (" + work_drive + ").") - - try: - # Remove the old pbo, key, and log - old = os.path.join(module_root, release_dir, project, "Addons", module) + "*" - files = glob.glob(old) - for f in files: - os.remove(f) - - if pbo_name_prefix: - old = os.path.join(module_root, release_dir, project, "Addons", pbo_name_prefix+module) + "*" - files = glob.glob(old) - for f in files: - os.remove(f) - except: - raise - print_error("ERROR: Could not copy module to work drive. Does the module exist?") - input("Press Enter to continue...") - print("Resuming build...") - continue - - # Build the module into a pbo - print_blue("Building: " + os.path.join(work_drive, prefix, module)) - print_blue("Destination: " + os.path.join(module_root, release_dir, project, "Addons")) - - # Make destination folder (if needed) - try: - os.makedirs(os.path.join(module_root, release_dir, project, "Addons")) - except: - pass - - # Run build tool - build_successful = False - if build_tool == "pboproject": - try: - #PABST: Convert config (run the macro'd config.cpp through CfgConvert twice to produce a de-macro'd cpp that pboProject can read without fucking up: - shutil.copyfile(os.path.join(work_drive, prefix, module, "config.cpp"), os.path.join(work_drive, prefix, module, "config.backup")) - - os.chdir("P:\\") - - cmd = [os.path.join(arma3tools_path, "CfgConvert", "CfgConvert.exe"), "-bin", "-dst", os.path.join(work_drive, prefix, module, "config.bin"), os.path.join(work_drive, prefix, module, "config.cpp")] - ret = subprocess.call(cmd) - if ret != 0: - print_error("CfgConvert -bin return code == " + str(ret) + ". Usually means there is a syntax error within the config.cpp file.") - os.remove(os.path.join(work_drive, prefix, module, "config.cpp")) - shutil.copyfile(os.path.join(work_drive, prefix, module, "config.backup"), os.path.join(work_drive, prefix, module, "config.cpp")) - - cmd = [os.path.join(arma3tools_path, "CfgConvert", "CfgConvert.exe"), "-txt", "-dst", os.path.join(work_drive, prefix, module, "config.cpp"), os.path.join(work_drive, prefix, module, "config.bin")] - ret = subprocess.call(cmd) - if ret != 0: - print_error("CfgConvert -txt return code == " + str(ret) + ". Usually means there is a syntax error within the config.cpp file.") - os.remove(os.path.join(work_drive, prefix, module, "config.cpp")) - shutil.copyfile(os.path.join(work_drive, prefix, module, "config.backup"), os.path.join(work_drive, prefix, module, "config.cpp")) - - - # Include build number - try: - configpath = os.path.join(work_drive, prefix, module, "config.cpp") - f = open(configpath, "r") - configtext = f.read() - f.close() - - if configtext: - patchestext = re.search(r"class CfgPatches\n\{(.*?)\n\}", configtext, re.DOTALL).group(1) - patchestext = re.sub(r'version(.*?)="(.*?)"', r'version\1="\2-{}"'.format(commit_id), patchestext) - configtext = re.sub(r"class CfgPatches\n\{(.*?)\n\}", "class CfgPatches\n{"+patchestext+"\n}", configtext, flags=re.DOTALL) - f = open(configpath, "w") - f.write(configtext) - f.close() - else: - os.remove(os.path.join(work_drive, prefix, module, "config.cpp")) - os.rename(os.path.join(work_drive, prefix, module, "config.backup"), os.path.join(work_drive, prefix, module, "config.cpp")) - except: - raise - print_error("Failed to include build number") - continue - - if os.path.isfile(os.path.join(work_drive, prefix, module, "$NOBIN$")): - print_green("$NOBIN$ Found. Proceeding with non-binarizing!") - cmd = [makepboTool, "-P","-A","-L","-N","-G", os.path.join(work_drive, prefix, module),os.path.join(module_root, release_dir, project,"Addons")] - - else: - if check_external: - cmd = [pboproject, "-P", os.path.join(work_drive, prefix, module), "+Engine=Arma3", "-S","+Noisy", "+X", "+Clean", "+Mod="+os.path.join(module_root, release_dir, project), "-Key"] - else: - cmd = [pboproject, "-P", os.path.join(work_drive, prefix, module), "+Engine=Arma3", "-S","+Noisy", "-X", "+Clean", "+Mod="+os.path.join(module_root, release_dir, project), "-Key"] - - color("grey") - if quiet: - devnull = open(os.devnull, 'w') - ret = subprocess.call(cmd, stdout=devnull) - devnull.close() - else: - ret = subprocess.call(cmd) - color("reset") - - if ret == 0: - print_green("pboProject return code == " + str(ret)) - # Prettyprefix rename the PBO if requested. - if pbo_name_prefix: - try: - os.rename(os.path.join(module_root, release_dir, project, "Addons", module+".pbo"), os.path.join(module_root, release_dir, project, "Addons", pbo_name_prefix+module+".pbo")) - except: - raise - print_error("Could not rename built PBO with prefix.") - # Sign result - if key: - print("Signing with " + key + ".") - if pbo_name_prefix: - ret = subprocess.call([dssignfile, key, os.path.join(module_root, release_dir, project, "Addons", pbo_name_prefix + module + ".pbo")]) - else: - ret = subprocess.call([dssignfile, key, os.path.join(module_root, release_dir, project, "Addons", module + ".pbo")]) - - if ret == 0: - build_successful = True - else: - build_successful = True - - if not build_successful: - print_error("pboProject return code == " + str(ret)) - print_error("Module not successfully built/signed.") - print ("Resuming build...") - continue - - #PABST: cleanup config BS (you could comment this out to see the "de-macroed" cpp - #print_green("\Pabst (restoring): " + os.path.join(work_drive, prefix, module, "config.cpp")) - os.remove(os.path.join(work_drive, prefix, module, "config.cpp")) - os.remove(os.path.join(work_drive, prefix, module, "config.bin")) - os.rename(os.path.join(work_drive, prefix, module, "config.backup"), os.path.join(work_drive, prefix, module, "config.cpp")) - - # Back to the root - os.chdir(module_root) - - except: - raise - print_error("Could not run Addon Builder.") - input("Press Enter to continue...") - print ("Resuming build...") - continue - - elif build_tool== "addonbuilder": - # Detect $NOBIN$ and do not binarize if found. - if os.path.isfile(os.path.join(work_drive, prefix, module, "$NOBIN$")): - do_binarize = False - print("$NOBIN$ file found in module, packing only.") - else: - do_binarize = True - try: - # Call AddonBuilder - os.chdir("P:\\") - - cmd = [addonbuilder, os.path.join(work_drive, prefix, module), os.path.join(make_root, release_dir, project, "Addons"), "-clear", "-project="+work_drive] - if not do_binarize: - cmd.append("-packonly") - - if quiet: - previousDirectory = os.getcwd() - os.chdir(arma3tools_path) - devnull = open(os.devnull, 'w') - ret = subprocess.call(cmd, stdout=devnull) - devnull.close() - os.chdir(previousDirectory) - else: - previousDirectory = os.getcwd() - os.chdir(arma3tools_path) - print_error("Current directory - " + os.getcwd()) - ret = subprocess.call(cmd) - os.chdir(previousDirectory) - print_error("Current directory - " + os.getcwd()) - color("reset") - print_green("completed") - # Prettyprefix rename the PBO if requested. - if pbo_name_prefix: - try: - os.rename(os.path.join(make_root, release_dir, project, "Addons", module+".pbo"), os.path.join(make_root, release_dir, project, "Addons", pbo_name_prefix+module+".pbo")) - except: - raise - print_error("Could not rename built PBO with prefix.") - - if ret == 0: - # Sign result - if key: - print("Signing with " + key + ".") - if pbo_name_prefix: - ret = subprocess.call([dssignfile, key, os.path.join(make_root, release_dir, project, "Addons", pbo_name_prefix + module + ".pbo")]) - else: - ret = subprocess.call([dssignfile, key, os.path.join(make_root, release_dir, project, "Addons", module + ".pbo")]) - - if ret == 0: - build_successful = True - else: - build_successful = True - - if not build_successful: - print_error("Module not successfully built.") - - # Back to the root - os.chdir(make_root) - - except: - raise - print_error("Could not run Addon Builder.") - input("Press Enter to continue...") - print ("Resuming build...") - continue - - else: - print_error("Unknown build_tool " + build_tool + "!") - - # Update the hash for a successfully built module - if build_successful: - cache[module] = new_sha - - # Done building all modules! - - # Write out the cache state - cache_out = json.dumps(cache) - with open(os.path.join(make_root, "make.cache"), 'w') as f: - f.write(cache_out) - - # Delete the pboproject temp files if building a release. - if make_release and build_tool == "pboproject": - try: - shutil.rmtree(os.path.join(module_root, release_dir, project, "temp"), True) - except: - print_error("ERROR: Could not delete pboProject temp files.") - - print_green("\nDone.") - - # Make release - if make_release: - print_blue("\nMaking release: " + project + "-" + release_version + ".zip") - - try: - # Delete all log files - for root, dirs, files in os.walk(os.path.join(module_root, release_dir, project, "Addons")): - for currentFile in files: - if currentFile.lower().endswith("log"): - os.remove(os.path.join(root, currentFile)) - - # Create a zip with the contents of release/ in it - shutil.make_archive(project + "-" + release_version, "zip", os.path.join(module_root, release_dir)) - except: - raise - print_error("Could not make release.") - - # Copy to Arma 3 folder for testing - if test: - print_blue("\nCopying to Arma 3.") - - if sys.platform == "win32": - reg = winreg.ConnectRegistry(None, winreg.HKEY_LOCAL_MACHINE) - try: - k = winreg.OpenKey(reg, r"SOFTWARE\Wow6432Node\Bohemia Interactive\Arma 3") - a3_path = winreg.EnumValue(k, 1)[1] - winreg.CloseKey(k) - except: - print_error("Could not find Arma 3's directory in the registry.") - else: - a3_path = cygwin_a3path - - if os.path.exists(a3_path): - try: - shutil.rmtree(os.path.join(a3_path, project), True) - shutil.copytree(os.path.join(module_root, release_dir, project), os.path.join(a3_path, project)) - except: - print_error("Could not copy files. Is Arma 3 running?") - - copy_important_files(module_root_parent,os.path.join(release_dir, "@ace")) - cleanup_optionals(optionals_modules,optional_files) + sys.exit(0) + + if "force" in argv: + argv.remove("force") + force_build = True + else: + force_build = False + + if "test" in argv: + test = True + argv.remove("test") + + if "release" in argv: + make_release = True + release_version = argv[argv.index("release") + 1] + argv.remove(release_version) + argv.remove("release") + + if "target" in argv: + make_target = argv[argv.index("target") + 1] + argv.remove("target") + argv.remove(make_target) + force_build = True + + if "key" in argv: + new_key = True + key_name = argv[argv.index("key") + 1] + argv.remove("key") + argv.remove(key_name) + + if "quiet" in argv: + quiet = True + argv.remove("quiet") + + if "checkexternal" in argv: + argv.remove("checkexternal") + check_external = True + else: + check_external = False + + # Get the directory the make script is in. + make_root = os.path.dirname(os.path.realpath(__file__)) + make_root_parent = os.path.abspath(os.path.join(os.getcwd(), os.pardir)) + os.chdir(make_root) + + # Get latest commit ID + try: + gitpath = os.path.join(os.path.dirname(make_root), ".git") + assert os.path.exists(gitpath) + + commit_id = subprocess.check_output(["git", "rev-parse", "HEAD"]) + commit_id = str(commit_id, "utf-8")[:8] + except: + print_error("FAILED TO DETERMINE COMMIT ID.") + commit_id = "NOGIT" + + cfg = configparser.ConfigParser(); + try: + global work_drive + global module_root + global release_dir + global module_root_parent + global optionals_root + + cfg.read(os.path.join(make_root, "make.cfg")) + + # Project name (with @ symbol) + project = cfg.get(make_target, "project", fallback="@"+os.path.basename(os.getcwd())) + + # Private key path + key = cfg.get(make_target, "key", fallback=None) + + # Project prefix (folder path) + prefix = cfg.get(make_target, "prefix", fallback="") + + # Should we autodetect modules on a complete build? + module_autodetect = cfg.getboolean(make_target, "module_autodetect", fallback=True) + + # Manual list of modules to build for a complete build + modules = cfg.get(make_target, "modules", fallback=None) + # Parse it out + if modules: + modules = [x.strip() for x in modules.split(',')] + else: + modules = [] + + # List of directories to ignore when detecting + ignore = [x.strip() for x in cfg.get(make_target, "ignore", fallback="release").split(',')] + + # BI Tools work drive on Windows + work_drive = cfg.get(make_target, "work_drive", fallback="P:\\") + + # Which build tool should we use? + build_tool = cfg.get(make_target, "build_tool", fallback="addonbuilder").lower() + + # Release/build directory, relative to script dir + release_dir = cfg.get(make_target, "release_dir", fallback="release") + + # Project PBO file prefix (files are renamed to prefix_name.pbo) + pbo_name_prefix = cfg.get(make_target, "pbo_name_prefix", fallback=None) + + # Project module Root + module_root_parent = os.path.abspath(os.path.join(os.path.join(work_drive, prefix), os.pardir)) + module_root = cfg.get(make_target, "module_root", fallback=os.path.join(make_root_parent, "addons")) + optionals_root = os.path.join(module_root_parent, "optionals") + print_green ("module_root: " + module_root) + + if (os.path.isdir(module_root)): + os.chdir(module_root) + else: + print_error ("Directory " + module_root + " does not exist.") + sys.exit() + + if (os.path.isdir(optionals_root)): + print_green ("optionals_root: " + optionals_root) + else: + print_error ("Directory " + optionals_root + " does not exist.") + sys.exit() + + print_green ("release_dir: " + release_dir) + + except: + raise + print_error("Could not parse make.cfg.") + sys.exit(1) + + # See if we have been given specific modules to build from command line. + if len(argv) > 1 and not make_release: + arg_modules = True + modules = argv[1:] + + # Find the tools we need. + try: + tools = find_bi_tools(work_drive) + addonbuilder = tools[0] + dssignfile = tools[1] + dscreatekey = tools[2] + cfgconvert = tools[3] + + except: + print_error("Arma 3 Tools are not installed correctly or the P: drive has not been created.") + sys.exit(1) + + if build_tool == "pboproject": + try: + depbo_tools = find_depbo_tools("HKLM") + if depbo_tools == -1: + depbo_tools = find_depbo_tools("HKCU") + pboproject = depbo_tools[0] + rapifyTool = depbo_tools[1] + makepboTool = depbo_tools[2] + except: + raise + print_error("Could not find dePBO tools. Download the needed tools from: https://dev.withsix.com/projects/mikero-pbodll/files") + sys.exit(1) + + # Try to open and deserialize build cache file. + try: + cache = {} + with open(os.path.join(make_root, "make.cache"), 'r') as f: + cache_raw = f.read() + + cache = json.loads(cache_raw) + + except: + print ("No cache found.") + cache = {} + + #Temporarily copy optionals_root for building. They will be removed later. + optionals_modules = [] + optional_files = [] + copy_optionals_for_building(optionals_modules,optional_files) + + # Get list of subdirs in make root. + dirs = next(os.walk(module_root))[1] + + # Autodetect what directories to build. + if module_autodetect and not arg_modules: + modules = [] + for path in dirs: + # Any dir that has a config.cpp in its root is an addon to build. + config_path = os.path.join(path, 'config.cpp') + if os.path.isfile(config_path) and not path in ignore: + modules.append(path) + + # Make the key specified from command line if necessary. + if new_key: + if not os.path.isfile(os.path.join(module_root, key_name + ".biprivatekey")): + print_green("\nRequested key does not exist.") + ret = subprocess.call([dscreatekey, key_name]) # Created in make_root + if ret == 0: + print_blue("Created: " + os.path.join(module_root, key_name + ".biprivatekey")) + else: + print_error("Failed to create key!") + + try: + print_blue("Copying public key to release directory.") + + try: + os.makedirs(os.path.join(module_root, release_dir, "Keys")) + except: + pass + + shutil.copyfile(os.path.join(module_root, key_name + ".bikey"), os.path.join(module_root, release_dir, "Keys", key_name + ".bikey")) + + except: + raise + print_error("Could not copy key to release directory.") + + else: + print_green("\nNOTE: Using key " + os.path.join(module_root, key_name + ".biprivatekey")) + + key = os.path.join(module_root, key_name + ".biprivatekey") + + + # For each module, prep files and then build. + for module in modules: + print_green("\nMaking " + module + "-"*max(1, (60-len(module)))) + missing = False + + # Cache check + if module in cache: + old_sha = cache[module] + else: + old_sha = "" + + #We always build ACE_common so we can properly show the correct version stamp in the RPT file. + if module == "common": + old_sha = "" + + # Hash the module + new_sha = get_directory_hash(os.path.join(module_root, module)) + + # Is the pbo file missing? + missing = not os.path.isfile(os.path.join(release_dir, project, "addons", "ace_{}.pbo".format(module))) + if missing: + print("ace_{}.pbo".format(module) + " is missing. Building...") + + # Check if it needs rebuilt + # print ("Hash:", new_sha) + if old_sha == new_sha and not missing: + if not force_build: + print("Module has not changed.") + # Skip everything else + continue + + # Only do this if the project isn't stored directly on the work drive. + # Split the path at the drive name and see if they are on the same drive (usually P:) + if os.path.splitdrive(module_root)[0] != os.path.splitdrive(work_drive)[0]: + try: + # Remove old work drive version (ignore errors) + shutil.rmtree(os.path.join(work_drive, prefix, module), True) + + # Copy module to the work drive + shutil.copytree(module, os.path.join(work_drive, prefix, module)) + + except: + raise + print_error("ERROR: Could not copy module to work drive. Does the module exist?") + input("Press Enter to continue...") + print("Resuming build...") + continue + #else: + #print("WARNING: Module is stored on work drive (" + work_drive + ").") + + try: + # Remove the old pbo, key, and log + old = os.path.join(module_root, release_dir, project, "Addons", module) + "*" + files = glob.glob(old) + for f in files: + os.remove(f) + + if pbo_name_prefix: + old = os.path.join(module_root, release_dir, project, "Addons", pbo_name_prefix+module) + "*" + files = glob.glob(old) + for f in files: + os.remove(f) + except: + raise + print_error("ERROR: Could not copy module to work drive. Does the module exist?") + input("Press Enter to continue...") + print("Resuming build...") + continue + + # Build the module into a pbo + print_blue("Building: " + os.path.join(work_drive, prefix, module)) + print_blue("Destination: " + os.path.join(module_root, release_dir, project, "Addons")) + + # Make destination folder (if needed) + try: + os.makedirs(os.path.join(module_root, release_dir, project, "Addons")) + except: + pass + + # Run build tool + build_successful = False + if build_tool == "pboproject": + try: + #PABST: Convert config (run the macro'd config.cpp through CfgConvert twice to produce a de-macro'd cpp that pboProject can read without fucking up: + shutil.copyfile(os.path.join(work_drive, prefix, module, "config.cpp"), os.path.join(work_drive, prefix, module, "config.backup")) + + os.chdir("P:\\") + + cmd = [os.path.join(arma3tools_path, "CfgConvert", "CfgConvert.exe"), "-bin", "-dst", os.path.join(work_drive, prefix, module, "config.bin"), os.path.join(work_drive, prefix, module, "config.cpp")] + ret = subprocess.call(cmd) + if ret != 0: + print_error("CfgConvert -bin return code == " + str(ret) + ". Usually means there is a syntax error within the config.cpp file.") + os.remove(os.path.join(work_drive, prefix, module, "config.cpp")) + shutil.copyfile(os.path.join(work_drive, prefix, module, "config.backup"), os.path.join(work_drive, prefix, module, "config.cpp")) + + cmd = [os.path.join(arma3tools_path, "CfgConvert", "CfgConvert.exe"), "-txt", "-dst", os.path.join(work_drive, prefix, module, "config.cpp"), os.path.join(work_drive, prefix, module, "config.bin")] + ret = subprocess.call(cmd) + if ret != 0: + print_error("CfgConvert -txt return code == " + str(ret) + ". Usually means there is a syntax error within the config.cpp file.") + os.remove(os.path.join(work_drive, prefix, module, "config.cpp")) + shutil.copyfile(os.path.join(work_drive, prefix, module, "config.backup"), os.path.join(work_drive, prefix, module, "config.cpp")) + + + # Include build number + try: + configpath = os.path.join(work_drive, prefix, module, "config.cpp") + f = open(configpath, "r") + configtext = f.read() + f.close() + + if configtext: + patchestext = re.search(r"class CfgPatches\n\{(.*?)\n\}", configtext, re.DOTALL).group(1) + patchestext = re.sub(r'version(.*?)="(.*?)"', r'version\1="\2-{}"'.format(commit_id), patchestext) + configtext = re.sub(r"class CfgPatches\n\{(.*?)\n\}", "class CfgPatches\n{"+patchestext+"\n}", configtext, flags=re.DOTALL) + f = open(configpath, "w") + f.write(configtext) + f.close() + else: + os.remove(os.path.join(work_drive, prefix, module, "config.cpp")) + os.rename(os.path.join(work_drive, prefix, module, "config.backup"), os.path.join(work_drive, prefix, module, "config.cpp")) + except: + raise + print_error("Failed to include build number") + continue + + if os.path.isfile(os.path.join(work_drive, prefix, module, "$NOBIN$")): + print_green("$NOBIN$ Found. Proceeding with non-binarizing!") + cmd = [makepboTool, "-P","-A","-L","-N","-G", os.path.join(work_drive, prefix, module),os.path.join(module_root, release_dir, project,"Addons")] + + else: + if check_external: + cmd = [pboproject, "-P", os.path.join(work_drive, prefix, module), "+Engine=Arma3", "-S","+Noisy", "+X", "+Clean", "+Mod="+os.path.join(module_root, release_dir, project), "-Key"] + else: + cmd = [pboproject, "-P", os.path.join(work_drive, prefix, module), "+Engine=Arma3", "-S","+Noisy", "-X", "+Clean", "+Mod="+os.path.join(module_root, release_dir, project), "-Key"] + + color("grey") + if quiet: + devnull = open(os.devnull, 'w') + ret = subprocess.call(cmd, stdout=devnull) + devnull.close() + else: + ret = subprocess.call(cmd) + color("reset") + + if ret == 0: + print_green("pboProject return code == " + str(ret)) + # Prettyprefix rename the PBO if requested. + if pbo_name_prefix: + try: + os.rename(os.path.join(module_root, release_dir, project, "Addons", module+".pbo"), os.path.join(module_root, release_dir, project, "Addons", pbo_name_prefix+module+".pbo")) + except: + raise + print_error("Could not rename built PBO with prefix.") + # Sign result + if key: + print("Signing with " + key + ".") + if pbo_name_prefix: + ret = subprocess.call([dssignfile, key, os.path.join(module_root, release_dir, project, "Addons", pbo_name_prefix + module + ".pbo")]) + else: + ret = subprocess.call([dssignfile, key, os.path.join(module_root, release_dir, project, "Addons", module + ".pbo")]) + + if ret == 0: + build_successful = True + else: + build_successful = True + + if not build_successful: + print_error("pboProject return code == " + str(ret)) + print_error("Module not successfully built/signed.") + print ("Resuming build...") + continue + + #PABST: cleanup config BS (you could comment this out to see the "de-macroed" cpp + #print_green("\Pabst (restoring): " + os.path.join(work_drive, prefix, module, "config.cpp")) + os.remove(os.path.join(work_drive, prefix, module, "config.cpp")) + os.remove(os.path.join(work_drive, prefix, module, "config.bin")) + os.rename(os.path.join(work_drive, prefix, module, "config.backup"), os.path.join(work_drive, prefix, module, "config.cpp")) + + # Back to the root + os.chdir(module_root) + + except: + raise + print_error("Could not run Addon Builder.") + input("Press Enter to continue...") + print ("Resuming build...") + continue + + elif build_tool== "addonbuilder": + # Detect $NOBIN$ and do not binarize if found. + if os.path.isfile(os.path.join(work_drive, prefix, module, "$NOBIN$")): + do_binarize = False + print("$NOBIN$ file found in module, packing only.") + else: + do_binarize = True + try: + # Call AddonBuilder + os.chdir("P:\\") + + cmd = [addonbuilder, os.path.join(work_drive, prefix, module), os.path.join(make_root, release_dir, project, "Addons"), "-clear", "-project="+work_drive] + if not do_binarize: + cmd.append("-packonly") + + if quiet: + previousDirectory = os.getcwd() + os.chdir(arma3tools_path) + devnull = open(os.devnull, 'w') + ret = subprocess.call(cmd, stdout=devnull) + devnull.close() + os.chdir(previousDirectory) + else: + previousDirectory = os.getcwd() + os.chdir(arma3tools_path) + print_error("Current directory - " + os.getcwd()) + ret = subprocess.call(cmd) + os.chdir(previousDirectory) + print_error("Current directory - " + os.getcwd()) + color("reset") + print_green("completed") + # Prettyprefix rename the PBO if requested. + if pbo_name_prefix: + try: + os.rename(os.path.join(make_root, release_dir, project, "Addons", module+".pbo"), os.path.join(make_root, release_dir, project, "Addons", pbo_name_prefix+module+".pbo")) + except: + raise + print_error("Could not rename built PBO with prefix.") + + if ret == 0: + # Sign result + if key: + print("Signing with " + key + ".") + if pbo_name_prefix: + ret = subprocess.call([dssignfile, key, os.path.join(make_root, release_dir, project, "Addons", pbo_name_prefix + module + ".pbo")]) + else: + ret = subprocess.call([dssignfile, key, os.path.join(make_root, release_dir, project, "Addons", module + ".pbo")]) + + if ret == 0: + build_successful = True + else: + build_successful = True + + if not build_successful: + print_error("Module not successfully built.") + + # Back to the root + os.chdir(make_root) + + except: + raise + print_error("Could not run Addon Builder.") + input("Press Enter to continue...") + print ("Resuming build...") + continue + + else: + print_error("Unknown build_tool " + build_tool + "!") + + # Update the hash for a successfully built module + if build_successful: + cache[module] = new_sha + + # Done building all modules! + + # Write out the cache state + cache_out = json.dumps(cache) + with open(os.path.join(make_root, "make.cache"), 'w') as f: + f.write(cache_out) + + # Delete the pboproject temp files if building a release. + if make_release and build_tool == "pboproject": + try: + shutil.rmtree(os.path.join(module_root, release_dir, project, "temp"), True) + except: + print_error("ERROR: Could not delete pboProject temp files.") + + print_green("\nDone.") + + # Make release + if make_release: + print_blue("\nMaking release: " + project + "-" + release_version + ".zip") + + try: + # Delete all log files + for root, dirs, files in os.walk(os.path.join(module_root, release_dir, project, "Addons")): + for currentFile in files: + if currentFile.lower().endswith("log"): + os.remove(os.path.join(root, currentFile)) + + # Create a zip with the contents of release/ in it + shutil.make_archive(project + "-" + release_version, "zip", os.path.join(module_root, release_dir)) + except: + raise + print_error("Could not make release.") + + # Copy to Arma 3 folder for testing + if test: + print_blue("\nCopying to Arma 3.") + + if sys.platform == "win32": + reg = winreg.ConnectRegistry(None, winreg.HKEY_LOCAL_MACHINE) + try: + k = winreg.OpenKey(reg, r"SOFTWARE\Wow6432Node\Bohemia Interactive\Arma 3") + a3_path = winreg.EnumValue(k, 1)[1] + winreg.CloseKey(k) + except: + print_error("Could not find Arma 3's directory in the registry.") + else: + a3_path = cygwin_a3path + + if os.path.exists(a3_path): + try: + shutil.rmtree(os.path.join(a3_path, project), True) + shutil.copytree(os.path.join(module_root, release_dir, project), os.path.join(a3_path, project)) + except: + print_error("Could not copy files. Is Arma 3 running?") + + copy_important_files(module_root_parent,os.path.join(release_dir, "@ace")) + cleanup_optionals(optionals_modules,optional_files) if __name__ == "__main__": - main(sys.argv) + main(sys.argv) input("Press Enter to continue...") From 8a55c282e17eba4ae63957773597f3634ec335ee Mon Sep 17 00:00:00 2001 From: bux578 Date: Tue, 21 Apr 2015 13:27:45 +0200 Subject: [PATCH 075/104] add repair module icon --- extras/assets/icons/Icons_Modules.psd | Bin 2356619 -> 2326533 bytes .../png/Icon_Module/Icon_Module_Repair_ca.png | Bin 0 -> 1621 bytes 2 files changed, 0 insertions(+), 0 deletions(-) create mode 100644 extras/assets/icons/png/Icon_Module/Icon_Module_Repair_ca.png diff --git a/extras/assets/icons/Icons_Modules.psd b/extras/assets/icons/Icons_Modules.psd index 9dcfa6a38b961c88def30c9f968c6a33349eb68f..968664452112dd74a054a33c3115fa92130ef8a2 100644 GIT binary patch delta 23791 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 P-+t>5QIhgGTVDSQdR}wK delta 46144 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 literal 0 HcmV?d00001 From 483319386001ebdfbf6fe6346b5464c178d315e5 Mon Sep 17 00:00:00 2001 From: ulteq Date: Tue, 21 Apr 2015 15:01:23 +0200 Subject: [PATCH 076/104] Added a new solution setup menu --- addons/atragmx/RscTitles.hpp | 91 ++++++++++++++++++- addons/atragmx/XEH_preInit.sqf | 3 + .../atragmx/functions/fnc_create_dialog.sqf | 1 + .../functions/fnc_cycle_scope_unit.sqf | 1 + addons/atragmx/functions/fnc_init.sqf | 3 + .../functions/fnc_show_solution_setup.sqf | 20 ++++ .../functions/fnc_toggle_solution_setup.sqf | 38 ++++++++ .../functions/fnc_update_range_card.sqf | 17 ++-- .../atragmx/functions/fnc_update_result.sqf | 25 +++-- .../functions/fnc_update_solution_setup.sqf | 31 +++++++ .../functions/fnc_update_target_selection.sqf | 5 +- 11 files changed, 214 insertions(+), 21 deletions(-) create mode 100644 addons/atragmx/functions/fnc_show_solution_setup.sqf create mode 100644 addons/atragmx/functions/fnc_toggle_solution_setup.sqf create mode 100644 addons/atragmx/functions/fnc_update_solution_setup.sqf diff --git a/addons/atragmx/RscTitles.hpp b/addons/atragmx/RscTitles.hpp index 5fd3339f283..2194b2b27aa 100644 --- a/addons/atragmx/RscTitles.hpp +++ b/addons/atragmx/RscTitles.hpp @@ -608,7 +608,7 @@ class ATragMX_Display { w=0.03; x=0.550*safezoneW+safezoneX+0.27; text="4"; - action=""; + action=QUOTE(call FUNC(toggle_solution_setup)); }; class TEXT_CALCULATE: TEXT_SCOPE_UNIT { idc=3000; @@ -1368,5 +1368,94 @@ class ATragMX_Display { class TEXT_TARGET_DATA_NEXT: TEXT_TARGET_SPEED_ASSIST_NEXT { idc=14011; }; + + class TEXT_SOLUTION_SETUP_SHOW_RESULT_IN: TEXT_GUN_AMMO_DATA_BORE_HEIGHT { + idc=15000; + style=64; + w=0.25; + h=0.07; + x=0.550*safezoneW+safezoneX+0.13; + y=0.265*safezoneH+safezoneY+0.32; + text="Show result in"; + }; + class TEXT_SOLUTION_SETUP_SHOW_RESULT_IN_1: TEXT_TARGET_A { + idc=15001; + w=0.04; + x=0.550*safezoneW+safezoneX+0.14; + y=0.265*safezoneH+safezoneY+0.35; + text="1"; + action=QUOTE(GVAR(currentScopeClickNumberTemp) = 1; call FUNC(update_solution_setup)); + }; + class TEXT_SOLUTION_SETUP_SHOW_RESULT_IN_2: TEXT_SOLUTION_SETUP_SHOW_RESULT_IN_1 { + idc=15002; + x=0.550*safezoneW+safezoneX+0.18; + text="2"; + action=QUOTE(GVAR(currentScopeClickNumberTemp) = 2; call FUNC(update_solution_setup)); + }; + class TEXT_SOLUTION_SETUP_SHOW_RESULT_IN_3: TEXT_SOLUTION_SETUP_SHOW_RESULT_IN_1 { + idc=15003; + x=0.550*safezoneW+safezoneX+0.22; + text="3"; + action=QUOTE(GVAR(currentScopeClickNumberTemp) = 3; call FUNC(update_solution_setup)); + }; + class TEXT_SOLUTION_SETUP_SHOW_RESULT_IN_4: TEXT_SOLUTION_SETUP_SHOW_RESULT_IN_1 { + idc=15004; + x=0.550*safezoneW+safezoneX+0.26; + text="4"; + action=QUOTE(GVAR(currentScopeClickNumberTemp) = 4; call FUNC(update_solution_setup)); + }; + class TEXT_SOLUTION_SETUP_SHOW_RESULT_IN_8: TEXT_SOLUTION_SETUP_SHOW_RESULT_IN_1 { + idc=15005; + x=0.550*safezoneW+safezoneX+0.30; + text="8"; + action=QUOTE(GVAR(currentScopeClickNumberTemp) = 8; call FUNC(update_solution_setup)); + }; + class TEXT_SOLUTION_SETUP_SHOW_RESULT_IN_10: TEXT_SOLUTION_SETUP_SHOW_RESULT_IN_1 { + idc=15006; + x=0.550*safezoneW+safezoneX+0.34; + text="10"; + action=QUOTE(GVAR(currentScopeClickNumberTemp) = 10; call FUNC(update_solution_setup)); + }; + class TEXT_SOLUTION_SETUP_CLICKS_PER: TEXT_GUN_AMMO_DATA_BORE_HEIGHT { + idc=15007; + style=64; + w=0.25; + h=0.07; + x=0.550*safezoneW+safezoneX+0.13; + y=0.265*safezoneH+safezoneY+0.42; + text="Clicks per"; + }; + class TEXT_SOLUTION_SETUP_CLICKS_PER_TMOA: TEXT_TARGET_A { + idc=15008; + w=0.05; + x=0.550*safezoneW+safezoneX+0.15; + y=0.265*safezoneH+safezoneY+0.45; + text="TMOA"; + action=QUOTE(GVAR(currentScopeClickUnitTemp) = 0; call FUNC(update_solution_setup)); + }; + class TEXT_SOLUTION_SETUP_CLICKS_PER_SMOA: TEXT_SOLUTION_SETUP_CLICKS_PER_TMOA { + idc=15009; + x=0.550*safezoneW+safezoneX+0.23; + text="SMOA"; + action=QUOTE(GVAR(currentScopeClickUnitTemp) = 1; call FUNC(update_solution_setup)); + }; + class TEXT_SOLUTION_SETUP_CLICKS_PER_MILS: TEXT_SOLUTION_SETUP_CLICKS_PER_TMOA { + idc=15010; + x=0.550*safezoneW+safezoneX+0.31; + text="MILS"; + action=QUOTE(GVAR(currentScopeClickUnitTemp) = 2; call FUNC(update_solution_setup)); + }; + class TEXT_SOLUTION_SETUP_DONE: TEXT_TARGET_SPEED_ASSIST_DONE { + idc=15011; + x=0.550*safezoneW+safezoneX+0.18; + y=0.265*safezoneH+safezoneY+0.55; + action=QUOTE(1 call FUNC(toggle_solution_setup)); + }; + class TEXT_SOLUTION_SETUP_CANCEL: TEXT_TARGET_SPEED_ASSIST_CANCEL { + idc=15012; + x=0.550*safezoneW+safezoneX+0.26; + y=0.265*safezoneH+safezoneY+0.55; + action=QUOTE(0 call FUNC(toggle_solution_setup)); + }; }; }; \ No newline at end of file diff --git a/addons/atragmx/XEH_preInit.sqf b/addons/atragmx/XEH_preInit.sqf index b85e3254940..4718e6c31af 100644 --- a/addons/atragmx/XEH_preInit.sqf +++ b/addons/atragmx/XEH_preInit.sqf @@ -34,6 +34,7 @@ PREP(show_gun_list); PREP(show_main_page); PREP(show_range_card); PREP(show_range_card_setup); +PREP(show_solution_setup); PREP(show_target_data); PREP(show_target_range_assist); PREP(show_target_speed_assist); @@ -46,6 +47,7 @@ PREP(toggle_gun_ammo_data); PREP(toggle_gun_list); PREP(toggle_range_card); PREP(toggle_range_card_setup); +PREP(toggle_solution_setup); PREP(toggle_target_data); PREP(toggle_target_range_assist); PREP(toggle_target_speed_assist); @@ -59,6 +61,7 @@ PREP(update_range_card); PREP(update_relative_click_memory); PREP(update_result); PREP(update_scope_unit); +PREP(update_solution_setup); PREP(update_target); PREP(update_target_data); PREP(update_target_selection); diff --git a/addons/atragmx/functions/fnc_create_dialog.sqf b/addons/atragmx/functions/fnc_create_dialog.sqf index b4d51bd8940..09e413d5356 100644 --- a/addons/atragmx/functions/fnc_create_dialog.sqf +++ b/addons/atragmx/functions/fnc_create_dialog.sqf @@ -35,6 +35,7 @@ if (GVAR(showRangeCard)) then { [] call FUNC(update_range_card); }; GVAR(showRangeCardSetup) call FUNC(show_range_card_setup); +GVAR(showSolutionSetup) call FUNC(show_solution_setup); GVAR(showTargetData) call FUNC(show_target_data); GVAR(showTargetRangeAssist) call FUNC(show_target_range_assist); GVAR(showTargetSpeedAssist) call FUNC(show_target_speed_assist); diff --git a/addons/atragmx/functions/fnc_cycle_scope_unit.sqf b/addons/atragmx/functions/fnc_cycle_scope_unit.sqf index 36f704bd2dd..ea9e2bd8e87 100644 --- a/addons/atragmx/functions/fnc_cycle_scope_unit.sqf +++ b/addons/atragmx/functions/fnc_cycle_scope_unit.sqf @@ -18,6 +18,7 @@ [] call FUNC(parse_input); GVAR(currentScopeUnit) = (GVAR(currentScopeUnit) + 1) % (count GVAR(scopeUnits)); +GVAR(workingMemory) set [6, GVAR(currentScopeUnit)]; [] call FUNC(update_scope_unit); [] call FUNC(update_result); diff --git a/addons/atragmx/functions/fnc_init.sqf b/addons/atragmx/functions/fnc_init.sqf index 2e613ca9e65..16c0b7eb863 100644 --- a/addons/atragmx/functions/fnc_init.sqf +++ b/addons/atragmx/functions/fnc_init.sqf @@ -42,7 +42,9 @@ GVAR(currentGun) = 0; GVAR(currentTarget) = 0; GVAR(currentScopeUnit) = 0; GVAR(currentScopeClickUnit) = 2; +GVAR(currentScopeClickUnitTemp) = 2; GVAR(currentScopeClickNumber) = 10; +GVAR(currentScopeClickNumberTemp) = 10; GVAR(atmosphereModeTBH) = true; GVAR(altitude) = 0; @@ -74,6 +76,7 @@ GVAR(showGunAmmoData) = false; GVAR(showGunList) = false; GVAR(showRangeCard) = false; GVAR(showRangeCardSetup) = false; +GVAR(showSolutionSetup) = false; GVAR(showTargetData) = false; GVAR(showTargetRangeAssist) = false; GVAR(showTargetSpeedAssist) = false; diff --git a/addons/atragmx/functions/fnc_show_solution_setup.sqf b/addons/atragmx/functions/fnc_show_solution_setup.sqf new file mode 100644 index 00000000000..761df45e6f2 --- /dev/null +++ b/addons/atragmx/functions/fnc_show_solution_setup.sqf @@ -0,0 +1,20 @@ +/* + * Author: Ruthberg + * Shows/Hides the solution setup controls + * + * Arguments: + * visible - + * + * Return Value: + * Nothing + * + * Example: + * false call ace_atragmx_fnc_show_solution_setup + * + * Public: No + */ +#include "script_component.hpp" + +GVAR(showSolutionSetup) = _this; + +{ctrlShow [_x, _this]} forEach [15000, 15001, 15002, 15003, 15004, 15005, 15006, 15007, 15008, 15009, 15010, 15011, 15012]; diff --git a/addons/atragmx/functions/fnc_toggle_solution_setup.sqf b/addons/atragmx/functions/fnc_toggle_solution_setup.sqf new file mode 100644 index 00000000000..0e9f702383c --- /dev/null +++ b/addons/atragmx/functions/fnc_toggle_solution_setup.sqf @@ -0,0 +1,38 @@ +/* + * Author: Ruthberg + * Toggles the solution setup screen on/off + * + * Arguments: + * Apply new data? + * + * Return Value: + * Nothing + * + * Example: + * 1 call ace_atragmx_fnc_toggle_solution_setup + * + * Public: No + */ +#include "script_component.hpp" + +if (ctrlVisible 15000) then { + false call FUNC(show_solution_setup); + true call FUNC(show_main_page); + + if (_this == 1) then { + GVAR(currentScopeClickUnit) = GVAR(currentScopeClickUnitTemp); + GVAR(currentScopeClickNumber) = GVAR(currentScopeClickNumberTemp); + GVAR(workingMemory) set [7, GVAR(currentScopeClickUnit)]; + GVAR(workingMemory) set [8, GVAR(currentScopeClickNumber)]; + [] call FUNC(update_scope_unit); + [] call FUNC(update_result); + }; +} else { + true call FUNC(show_solution_setup); + false call FUNC(show_main_page); + + GVAR(currentScopeClickUnitTemp) = GVAR(currentScopeClickUnit); + GVAR(currentScopeClickNumberTemp) = GVAR(currentScopeClickNumber); + + [] call FUNC(update_solution_setup); +}; diff --git a/addons/atragmx/functions/fnc_update_range_card.sqf b/addons/atragmx/functions/fnc_update_range_card.sqf index 0c49b6f794e..7e19abc36e4 100644 --- a/addons/atragmx/functions/fnc_update_range_card.sqf +++ b/addons/atragmx/functions/fnc_update_range_card.sqf @@ -15,7 +15,7 @@ */ #include "script_component.hpp" -private ["_range", "_elevation", "_windage1", "_windage2", "_elevationScopeStep", "_windageScopeStep", "_lead", "_TOF", "_velocity", "_kineticEnergy", "_rangeOutput", "_elevationOutput", "_windageOutput", "_lastColumnOutput"]; +private ["_range", "_elevation", "_windage1", "_windage2", "_clickSize", "_clickNumber", "_clickInterval", "_lead", "_TOF", "_velocity", "_kineticEnergy", "_rangeOutput", "_elevationOutput", "_windageOutput", "_lastColumnOutput"]; _lastColumnOutput = ""; if (GVAR(showWind2) && GVAR(rangeCardCurrentColumn) == 0) then { @@ -54,12 +54,17 @@ lnbClear 5007; _windage2 = _windage2 * 1.047; }; case 3: { - _elevationScopeStep = (GVAR(workingMemory) select 7); - _windageScopeStep = (GVAR(workingMemory) select 8); + switch (GVAR(workingMemory) select 7) do { + case 0: { _clickSize = 1; }; + case 1: { _clickSize = 1 / 1.047; }; + case 2: { _clickSize = 3.38; }; + }; + _clickNumber = GVAR(workingMemory) select 8; + _clickInterval = _clickSize / _clickNumber; - _elevation = Round(_elevation / _elevationScopeStep); - _windage1 = Round(_windage1 / _windageScopeStep); - _windage2 = Round(_windage2 / _windageScopeStep); + _elevation = Round(_elevation / _clickInterval); + _windage1 = Round(_windage1 / _clickInterval); + _windage2 = Round(_windage2 / _clickInterval); }; }; diff --git a/addons/atragmx/functions/fnc_update_result.sqf b/addons/atragmx/functions/fnc_update_result.sqf index a86170fd45c..64f121bc863 100644 --- a/addons/atragmx/functions/fnc_update_result.sqf +++ b/addons/atragmx/functions/fnc_update_result.sqf @@ -15,7 +15,7 @@ */ #include "script_component.hpp" -private ["_elevationAbs", "_elevationRel", "_elevationCur", "_windageAbs", "_wind2", "_windageRel", "_windageCur", "_lead", "_elevationScopeStep", "_windageScopeStep"]; +private ["_elevationAbs", "_elevationRel", "_elevationCur", "_windageAbs", "_wind2", "_windageRel", "_windageCur", "_lead", "_clickSize", "_clickNumber", "_clickInterval"]; _elevationAbs = GVAR(elevationOutput) select GVAR(currentTarget); _windageAbs = GVAR(windage1Output) select GVAR(currentTarget); @@ -55,19 +55,24 @@ switch (GVAR(currentScopeUnit)) do { _windageCur = _windageCur * 1.047; }; case 3: { - _elevationScopeStep = (GVAR(workingMemory) select 7); - _windageScopeStep = (GVAR(workingMemory) select 8); + switch (GVAR(workingMemory) select 7) do { + case 0: { _clickSize = 1; }; + case 1: { _clickSize = 1 / 1.047; }; + case 2: { _clickSize = 3.38; }; + }; + _clickNumber = GVAR(workingMemory) select 8; + _clickInterval = _clickSize / _clickNumber; - _elevationAbs = Round(_elevationAbs / _elevationScopeStep); - _windageAbs = Round(_windageAbs / _windageScopeStep); + _elevationAbs = Round(_elevationAbs / _clickInterval); + _windageAbs = Round(_windageAbs / _clickInterval); - _wind2 = Round(_wind2 / _windageScopeStep); + _wind2 = Round(_wind2 / _clickInterval); - _elevationRel = Round(_elevationRel / _elevationScopeStep); - _windageRel = Round(_windageRel / _windageScopeStep); + _elevationRel = Round(_elevationRel / _clickInterval); + _windageRel = Round(_windageRel / _clickInterval); - _elevationCur = Round(_elevationCur / _elevationScopeStep); - _windageCur = Round(_windageCur / _windageScopeStep); + _elevationCur = Round(_elevationCur / _clickInterval); + _windageCur = Round(_windageCur / _clickInterval); }; }; diff --git a/addons/atragmx/functions/fnc_update_solution_setup.sqf b/addons/atragmx/functions/fnc_update_solution_setup.sqf new file mode 100644 index 00000000000..204a844c9d7 --- /dev/null +++ b/addons/atragmx/functions/fnc_update_solution_setup.sqf @@ -0,0 +1,31 @@ +/* + * Author: Ruthberg + * Updates all solution setup input fields + * + * Arguments: + * Nothing + * + * Return Value: + * Nothing + * + * Example: + * call ace_atragmx_fnc_update_solution_setup + * + * Public: No + */ +#include "script_component.hpp" + +{((uiNamespace getVariable "ATragMX_Display") displayCtrl _x) ctrlEnable true} forEach [15001, 15002, 15003, 15004, 15005, 15006, 15008, 15009, 15010]; + +switch (GVAR(currentScopeClickNumberTemp)) do { + case 1: { ((uiNamespace getVariable "ATragMX_Display") displayCtrl 15001) ctrlEnable false; }; + case 2: { ((uiNamespace getVariable "ATragMX_Display") displayCtrl 15002) ctrlEnable false; }; + case 3: { ((uiNamespace getVariable "ATragMX_Display") displayCtrl 15003) ctrlEnable false; }; + case 4: { ((uiNamespace getVariable "ATragMX_Display") displayCtrl 15004) ctrlEnable false; }; + case 8: { ((uiNamespace getVariable "ATragMX_Display") displayCtrl 15005) ctrlEnable false; }; + case 10: { ((uiNamespace getVariable "ATragMX_Display") displayCtrl 15006) ctrlEnable false; }; +}; + +((uiNamespace getVariable "ATragMX_Display") displayCtrl (15008 + GVAR(currentScopeClickUnitTemp))) ctrlEnable false; + +ctrlSetFocus ((uiNamespace getVariable "ATragMX_Display") displayCtrl 15011); diff --git a/addons/atragmx/functions/fnc_update_target_selection.sqf b/addons/atragmx/functions/fnc_update_target_selection.sqf index d63f84a90c1..d9fd6002c94 100644 --- a/addons/atragmx/functions/fnc_update_target_selection.sqf +++ b/addons/atragmx/functions/fnc_update_target_selection.sqf @@ -15,10 +15,7 @@ */ #include "script_component.hpp" -((uiNamespace getVariable "ATragMX_Display") displayCtrl 500) ctrlEnable true; -((uiNamespace getVariable "ATragMX_Display") displayCtrl 501) ctrlEnable true; -((uiNamespace getVariable "ATragMX_Display") displayCtrl 502) ctrlEnable true; -((uiNamespace getVariable "ATragMX_Display") displayCtrl 503) ctrlEnable true; +{((uiNamespace getVariable "ATragMX_Display") displayCtrl _x) ctrlEnable true} forEach [500, 501, 502, 503]; ((uiNamespace getVariable "ATragMX_Display") displayCtrl 500 + GVAR(currentTarget)) ctrlEnable false; From c27f3fb1317ed8478a5aba5e207927416b020a7c Mon Sep 17 00:00:00 2001 From: ulteq Date: Tue, 21 Apr 2015 15:46:53 +0200 Subject: [PATCH 077/104] Added target speed direction switch / Improved the solution result output --- addons/atragmx/RscTitles.hpp | 10 +++ addons/atragmx/XEH_preInit.sqf | 1 + .../atragmx/functions/fnc_clear_user_data.sqf | 1 + .../fnc_cycle_target_speed_direction.sqf | 22 +++++ addons/atragmx/functions/fnc_init.sqf | 1 + addons/atragmx/functions/fnc_parse_input.sqf | 7 +- .../functions/fnc_restore_user_data.sqf | 1 + .../functions/fnc_show_target_data.sqf | 2 +- .../atragmx/functions/fnc_store_user_data.sqf | 1 + .../atragmx/functions/fnc_update_result.sqf | 88 +++++++++++++++++-- .../functions/fnc_update_target_data.sqf | 5 ++ 11 files changed, 129 insertions(+), 10 deletions(-) create mode 100644 addons/atragmx/functions/fnc_cycle_target_speed_direction.sqf diff --git a/addons/atragmx/RscTitles.hpp b/addons/atragmx/RscTitles.hpp index 2194b2b27aa..94416aba235 100644 --- a/addons/atragmx/RscTitles.hpp +++ b/addons/atragmx/RscTitles.hpp @@ -1338,6 +1338,16 @@ class ATragMX_Display { idc=140050; y=0.265*safezoneH+safezoneY+0.480; }; + class TEXT_TARGET_DATA_TARGET_SPEED_DIRECTION: ATragMX_RscButton { + idc=140051; + colorBackground[]={0.15,0.21,0.23,0.3}; + colorFocused[]={0.15,0.21,0.23,0.2}; + w=0.0231; + x=0.550*safezoneW+safezoneX+0.305; + y=0.265*safezoneH+safezoneY+0.480; + text=">"; + action=QUOTE(call FUNC(cycle_target_speed_direction)); + }; class TEXT_TARGET_DATA_TARGET_RANGE: TEXT_TARGET_DATA_LATITUDE { idc=14006; y=0.265*safezoneH+safezoneY+0.520; diff --git a/addons/atragmx/XEH_preInit.sqf b/addons/atragmx/XEH_preInit.sqf index 4718e6c31af..6ec288b9c7d 100644 --- a/addons/atragmx/XEH_preInit.sqf +++ b/addons/atragmx/XEH_preInit.sqf @@ -20,6 +20,7 @@ PREP(cycle_num_ticks_units); PREP(cycle_range_card_columns); PREP(cycle_scope_unit); PREP(cycle_target_size_units); +PREP(cycle_target_speed_direction); PREP(delete_gun); PREP(init); PREP(parse_input); diff --git a/addons/atragmx/functions/fnc_clear_user_data.sqf b/addons/atragmx/functions/fnc_clear_user_data.sqf index f805ce66b10..308b5bbf128 100644 --- a/addons/atragmx/functions/fnc_clear_user_data.sqf +++ b/addons/atragmx/functions/fnc_clear_user_data.sqf @@ -36,6 +36,7 @@ profileNamespace setVariable ["ACE_ATragMX_windSpeed2", nil]; profileNamespace setVariable ["ACE_ATragMX_windDirection", nil]; profileNamespace setVariable ["ACE_ATragMX_inclinationAngle", nil]; profileNamespace setVariable ["ACE_ATragMX_targetSpeed", nil]; +profileNamespace setVariable ["ACE_ATragMX_targetSpeedDirection", nil]; profileNamespace setVariable ["ACE_ATragMX_targetRange", nil]; profileNamespace setVariable ["ACE_ATragMX_rangeCardStartRange", nil]; diff --git a/addons/atragmx/functions/fnc_cycle_target_speed_direction.sqf b/addons/atragmx/functions/fnc_cycle_target_speed_direction.sqf new file mode 100644 index 00000000000..3c77fab792d --- /dev/null +++ b/addons/atragmx/functions/fnc_cycle_target_speed_direction.sqf @@ -0,0 +1,22 @@ +/* + * Author: Ruthberg + * Cycles through the target directions left/right + * + * Arguments: + * Nothing + * + * Return Value: + * Nothing + * + * Example: + * call ace_atragmx_cycle_target_direction + * + * Public: No + */ +#include "script_component.hpp" + +if ((ctrlText 140051) == ">") then { + ctrlSetText [140051, "<"]; +} else { + ctrlSetText [140051, ">"]; +}; diff --git a/addons/atragmx/functions/fnc_init.sqf b/addons/atragmx/functions/fnc_init.sqf index 16c0b7eb863..e4fe1b67a46 100644 --- a/addons/atragmx/functions/fnc_init.sqf +++ b/addons/atragmx/functions/fnc_init.sqf @@ -59,6 +59,7 @@ GVAR(windSpeed2) = [0, 0, 0, 0]; GVAR(windDirection) = [12, 12, 12, 12]; GVAR(inclinationAngle) = [0, 0, 0, 0]; GVAR(targetSpeed) = [0, 0, 0, 0]; +GVAR(targetSpeedDirection) = [1, 1, 1, 1]; GVAR(targetRange) = [0, 0, 0, 0]; GVAR(showWind2) = false; diff --git a/addons/atragmx/functions/fnc_parse_input.sqf b/addons/atragmx/functions/fnc_parse_input.sqf index ca289302c91..25ff7d764c2 100644 --- a/addons/atragmx/functions/fnc_parse_input.sqf +++ b/addons/atragmx/functions/fnc_parse_input.sqf @@ -40,7 +40,12 @@ if (_inclinationAngleDegree != GVAR(inclinationAngle) select GVAR(currentTarget) GVAR(inclinationAngle) set [GVAR(currentTarget), round(acos(_inclinationAngleCosine))]; }; }; -GVAR(targetSpeed) set [GVAR(currentTarget), -50 max abs(parseNumber(ctrlText 140050)) min 50]; +GVAR(targetSpeed) set [GVAR(currentTarget), 0 max abs(parseNumber(ctrlText 140050)) min 50]; +if ((ctrlText 140051) == ">") then { + GVAR(targetSpeedDirection) set [GVAR(currentTarget), +1]; +} else { + GVAR(targetSpeedDirection) set [GVAR(currentTarget), -1]; +}; GVAR(targetRange) set [GVAR(currentTarget), 0 max abs(parseNumber(ctrlText 140060)) min 4000]; if (GVAR(currentUnit) != 2) then { GVAR(windSpeed1) set [GVAR(currentTarget), (GVAR(windSpeed1) select GVAR(currentTarget)) * 0.44704]; diff --git a/addons/atragmx/functions/fnc_restore_user_data.sqf b/addons/atragmx/functions/fnc_restore_user_data.sqf index 7204f17426c..896455ec7a1 100644 --- a/addons/atragmx/functions/fnc_restore_user_data.sqf +++ b/addons/atragmx/functions/fnc_restore_user_data.sqf @@ -33,6 +33,7 @@ GVAR(windSpeed2) = profileNamespace getVariable ["ACE_ATragMX_windSpeed2", [0, 0 GVAR(windDirection) = profileNamespace getVariable ["ACE_ATragMX_windDirection", [12, 12, 12, 12]]; GVAR(inclinationAngle) = profileNamespace getVariable ["ACE_ATragMX_inclinationAngle", [0, 0, 0, 0]]; GVAR(targetSpeed) = profileNamespace getVariable ["ACE_ATragMX_targetSpeed", [0, 0, 0, 0]]; +GVAR(targetSpeedDirection) = profileNamespace getVariable ["ACE_ATragMX_targetSpeedDirection", [1, 1, 1, 1]]; GVAR(targetRange) = profileNamespace getVariable ["ACE_ATragMX_targetRange", [0, 0, 0, 0]]; GVAR(rangeCardStartRange) = 0 max (profileNamespace getVariable ["ACE_ATragMX_rangeCardStartRange", 200]) min 3000; diff --git a/addons/atragmx/functions/fnc_show_target_data.sqf b/addons/atragmx/functions/fnc_show_target_data.sqf index 48e419f65f8..f1b432edf88 100644 --- a/addons/atragmx/functions/fnc_show_target_data.sqf +++ b/addons/atragmx/functions/fnc_show_target_data.sqf @@ -17,7 +17,7 @@ GVAR(showTargetData) = _this; -{ctrlShow [_x, _this]} forEach [14000, 140000, 14001, 140010, 14002, 141020, 140020, 141021, 140021, 14003, 140030, 14004, 140040, 141040, 141041, 140041, 14005, 140050, 14006, 140060, 140061, 14007, 14008, 14009, 14010, 14011]; +{ctrlShow [_x, _this]} forEach [14000, 140000, 14001, 140010, 14002, 141020, 140020, 141021, 140021, 14003, 140030, 14004, 140040, 141040, 141041, 140041, 14005, 140050, 140051, 14006, 140060, 140061, 14007, 14008, 14009, 14010, 14011]; if (_this) then { [] call FUNC(update_target_data); diff --git a/addons/atragmx/functions/fnc_store_user_data.sqf b/addons/atragmx/functions/fnc_store_user_data.sqf index 01a5810fe29..5cfe7f2ae01 100644 --- a/addons/atragmx/functions/fnc_store_user_data.sqf +++ b/addons/atragmx/functions/fnc_store_user_data.sqf @@ -35,6 +35,7 @@ profileNamespace setVariable ["ACE_ATragMX_windSpeed2", GVAR(windSpeed2)]; profileNamespace setVariable ["ACE_ATragMX_windDirection", GVAR(windDirection)]; profileNamespace setVariable ["ACE_ATragMX_inclinationAngle", GVAR(inclinationAngle)]; profileNamespace setVariable ["ACE_ATragMX_targetSpeed", GVAR(targetSpeed)]; +profileNamespace setVariable ["ACE_ATragMX_targetSpeedDirection", GVAR(targetSpeedDirection)]; profileNamespace setVariable ["ACE_ATragMX_targetRange", GVAR(targetRange)]; profileNamespace setVariable ["ACE_ATragMX_rangeCardStartRange", GVAR(rangeCardStartRange)]; diff --git a/addons/atragmx/functions/fnc_update_result.sqf b/addons/atragmx/functions/fnc_update_result.sqf index 64f121bc863..bb708efaab0 100644 --- a/addons/atragmx/functions/fnc_update_result.sqf +++ b/addons/atragmx/functions/fnc_update_result.sqf @@ -82,16 +82,88 @@ if (GVAR(showWind2)) then { ctrlSetText [42, "Lead"]; }; -ctrlSetText [400, Str(Round(_elevationAbs * 100) / 100)]; -ctrlSetText [401, Str(Round(_elevationRel * 100) / 100)]; -ctrlSetText [402, Str(Round(_elevationCur * 100) / 100)]; +_elevationAbs = Round(_elevationAbs * 100) / 100; +if (_elevationAbs > 0) then { + ctrlSetText [400, format["%1", abs(_elevationAbs)]]; +} else { + if (_elevationAbs < 0) then { + ctrlSetText [400, format["%1D", abs(_elevationAbs)]]; + } else { + ctrlSetText [400, "0.0"]; + }; +}; +_elevationRel = Round(_elevationRel * 100) / 100; +if (_elevationRel > 0) then { + ctrlSetText [401, format["%1", abs(_elevationRel)]]; +} else { + if (_elevationRel < 0) then { + ctrlSetText [401, format["%1D", abs(_elevationRel)]]; + } else { + ctrlSetText [401, "0.0"]; + }; +}; +_elevationCur = Round(_elevationCur * 100) / 100; +if (_elevationCur > 0) then { + ctrlSetText [402, format["%1", abs(_elevationCur)]]; +} else { + if (_elevationCur < 0) then { + ctrlSetText [402, format["%1D", abs(_elevationCur)]]; + } else { + ctrlSetText [402, "0.0"]; + }; +}; -ctrlSetText [410, Str(Round(_windageAbs * 100) / 100)]; -ctrlSetText [411, Str(Round(_windageRel * 100) / 100)]; -ctrlSetText [412, Str(Round(_windageCur * 100) / 100)]; +_windageAbs = Round(_windageAbs * 100) / 100; +if (_windageAbs > 0) then { + ctrlSetText [410, format["%1R", abs(_windageAbs)]]; +} else { + if (_windageAbs < 0) then { + ctrlSetText [410, format["%1L", abs(_windageAbs)]]; + } else { + ctrlSetText [410, "0.0"]; + }; +}; +_windageRel = Round(_windageRel * 100) / 100; +if (_windageRel > 0) then { + ctrlSetText [411, format["%1R", abs(_windageRel)]]; +} else { + if (_windageRel < 0) then { + ctrlSetText [411, format["%1L", abs(_windageRel)]]; + } else { + ctrlSetText [411, "0.0"]; + }; +}; +_windageCur = Round(_windageCur * 100) / 100; +if (_windageCur > 0) then { + ctrlSetText [412, format["%1R", abs(_windageCur)]]; +} else { + if (_windageCur < 0) then { + ctrlSetText [412, format["%1L", abs(_windageCur)]]; + } else { + ctrlSetText [412, "0.0"]; + }; +}; if (GVAR(showWind2)) then { - ctrlSetText [420, Str(Round(_wind2 * 100) / 100)]; + _wind2 = Round(_wind2 * 100) / 100; + if (_wind2 > 0) then { + ctrlSetText [420, format["%1R", abs(_wind2)]]; + } else { + if (_wind2 < 0) then { + ctrlSetText [420, format["%1L", abs(_wind2)]]; + } else { + ctrlSetText [420, "0.0"]; + }; + }; } else { - ctrlSetText [420, Str(Round(_lead * 100) / 100)]; + _lead = Round(_lead * 100) / 100; + if (_lead > 0) then { + if ((GVAR(targetSpeedDirection) select GVAR(currentTarget)) == 1) then { + ctrlSetText [420, format["%1R", abs(_lead)]]; + } else { + ctrlSetText [420, format["%1L", abs(_lead)]]; + }; + } else { + ctrlSetText [420, "0.0"]; + }; }; \ No newline at end of file diff --git a/addons/atragmx/functions/fnc_update_target_data.sqf b/addons/atragmx/functions/fnc_update_target_data.sqf index b5e6dcf85a2..6fa9035a620 100644 --- a/addons/atragmx/functions/fnc_update_target_data.sqf +++ b/addons/atragmx/functions/fnc_update_target_data.sqf @@ -32,6 +32,11 @@ if (GVAR(currentUnit) != 2) then { } else { ctrlSetText [140050, Str(Round((GVAR(targetSpeed) select GVAR(currentTarget)) * 100) / 100)]; }; +if ((GVAR(targetSpeedDirection) select GVAR(currentTarget)) == 1) then { + ctrlSetText [140051, ">"]; +} else { + ctrlSetText [140051, "<"]; +}; if (GVAR(currentUnit) == 1) then { ctrlSetText [140060, Str(Round((GVAR(targetRange) select GVAR(currentTarget)) * 1.0936133))]; } else { From e22a7e1aad4207e437a1a2ed1d256f1a2e4f3113 Mon Sep 17 00:00:00 2001 From: ulteq Date: Tue, 21 Apr 2015 16:01:53 +0200 Subject: [PATCH 078/104] Improved the range card column spacing --- addons/atragmx/RscTitles.hpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/addons/atragmx/RscTitles.hpp b/addons/atragmx/RscTitles.hpp index 94416aba235..76f06744dc0 100644 --- a/addons/atragmx/RscTitles.hpp +++ b/addons/atragmx/RscTitles.hpp @@ -128,7 +128,7 @@ class ATragMX_RscListBox { class ATragMX_RscListNBox: ATragMX_RscListBox { idc=-1; type=102; - columns[]={0.0, 0.225, 0.475, 0.725}; + columns[]={0.0, 0.225, 0.475, 0.7}; drawSideArrows=0; idcLeft=-1; idcRight=-1; From 7c57ad25bd35cc3db939b12fe89db9f5f7eb3cb2 Mon Sep 17 00:00:00 2001 From: ulteq Date: Tue, 21 Apr 2015 16:54:26 +0200 Subject: [PATCH 079/104] Fixes a recently introduced bug in the relative click memory --- addons/atragmx/functions/fnc_parse_input.sqf | 19 ++++++++++++------- 1 file changed, 12 insertions(+), 7 deletions(-) diff --git a/addons/atragmx/functions/fnc_parse_input.sqf b/addons/atragmx/functions/fnc_parse_input.sqf index 25ff7d764c2..504c45fb28c 100644 --- a/addons/atragmx/functions/fnc_parse_input.sqf +++ b/addons/atragmx/functions/fnc_parse_input.sqf @@ -95,9 +95,9 @@ if ((missionNamespace getVariable [QEGVAR(advanced_ballistics,enabled), false]) GVAR(workingMemory) set [1, _muzzleVelocity]; GVAR(workingMemory) set [2, _zeroRange]; -private ["_elevationCur", "_windageCur", "_elevationScopeStep", "_windageScopeStep"]; -_elevationCur = parseNumber(ctrlText 402); -_windageCur = parseNumber(ctrlText 412); +private ["_elevationCur", "_windageCur", "_clickSize", "_clickNumber", "_clickInterval"]; +_elevationCur = GVAR(workingMemory) select 10; +_windageCur = GVAR(workingMemory) select 11; switch (GVAR(currentScopeUnit)) do { case 0: { @@ -109,11 +109,16 @@ switch (GVAR(currentScopeUnit)) do { _windageCur = _windageCur / 1.047; }; case 3: { - _elevationScopeStep = (GVAR(workingMemory) select 7); - _windageScopeStep = (GVAR(workingMemory) select 8); + switch (GVAR(workingMemory) select 7) do { + case 0: { _clickSize = 1; }; + case 1: { _clickSize = 1 / 1.047; }; + case 2: { _clickSize = 3.38; }; + }; + _clickNumber = GVAR(workingMemory) select 8; + _clickInterval = _clickSize / _clickNumber; - _elevationCur = _elevationCur * _elevationScopeStep; - _windageCur = _windageCur * _windageScopeStep; + _elevationCur = Round(_elevationCur / _clickInterval); + _windageCur = Round(_windageCur / _clickInterval); }; }; From f888dcdb88e458f9845ab19680e40216cacd09eb Mon Sep 17 00:00:00 2001 From: jaynus Date: Tue, 21 Apr 2015 08:22:50 -0700 Subject: [PATCH 080/104] Carry & Drag documentation. --- documentation/framework/carry-drag.md | 27 +++++++++++++++++++++++++++ 1 file changed, 27 insertions(+) create mode 100644 documentation/framework/carry-drag.md diff --git a/documentation/framework/carry-drag.md b/documentation/framework/carry-drag.md new file mode 100644 index 00000000000..daaa9fb95af --- /dev/null +++ b/documentation/framework/carry-drag.md @@ -0,0 +1,27 @@ +--- +layout: wiki +title: Carry and Drag System +group: framework +order: 5 +parent: wiki +--- + +# 1. Config Values + +``` +class CfgVehicles { + class MyVehicle { + + + ace_dragging_canDrag = 1; // can this object be dragged?; 1 yes, 0 no (0 default) + ace_dragging_dragPosition[] = {0,1.2,0} // Offset of the model from the body while dragging, comparable to the offset in attachTo (It's the same actually) + ace_dragging_dragDirection = 0; // how much degrees is the model rotatated after dragging it (a global setDir after attachTo) + + ace_dragging_canCarry = 1; // can this object be carried?; 1 yes, 0 no (0 default) + ace_dragging_carryPosition[] = {0,1.2,0}; // Same as drag, but for carrying objects + ace_dragging_carryDirection = 0; // Same as drag, but for carrying objects + + }; +}; +``` + From cebe52051314c75cd78dbae55d4387702094a6c2 Mon Sep 17 00:00:00 2001 From: ViperMaul Date: Tue, 21 Apr 2015 08:47:55 -0700 Subject: [PATCH 081/104] Userconfig folder is now properly added to the release folder for final distribution. #783 --- tools/make.py | 14 +++++++++++--- 1 file changed, 11 insertions(+), 3 deletions(-) diff --git a/tools/make.py b/tools/make.py index aaaf6501c58..a5c3069887d 100644 --- a/tools/make.py +++ b/tools/make.py @@ -340,14 +340,14 @@ def copy_optionals_for_building(mod,pbos): src_directories = os.listdir(optionals_root) current_dir = os.getcwd() - print("") + print_blue("\nChecking Optionals folder...") try: #special server.pbo processing files = glob.glob(os.path.join(release_dir, "@ace","optionals","*.pbo")) for file in files: file_name = os.path.basename(file) - print ("Adding the following file: " + file_name) + #print ("Adding the following file: " + file_name) pbos.append(file_name) pbo_path = os.path.join(release_dir, "@ace","optionals",file_name) if (os.path.isfile(pbo_path)): @@ -364,13 +364,19 @@ def copy_optionals_for_building(mod,pbos): try: for dir_name in src_directories: mod.append(dir_name) + #userconfig requires special handling since it is not a PBO source folder. + #CfgConvert fails to build server.pbo if userconfig is not found in P:\ if (dir_name == "userconfig"): + if (os.path.exists(os.path.join(release_dir, "@ace","optionals",dir_name))): + shutil.rmtree(os.path.join(release_dir, "@ace","optionals",dir_name), True) + shutil.copytree(os.path.join(optionals_root,dir_name), os.path.join(release_dir, "@ace","optionals",dir_name)) destination = os.path.join(work_drive,dir_name) else: destination = os.path.join(module_root,dir_name) print("Temporarily copying " + os.path.join(optionals_root,dir_name) + " => " + destination + " for building.") - shutil.rmtree(destination, True) + if (os.path.exists(destination)): + shutil.rmtree(destination, True) shutil.copytree(os.path.join(optionals_root,dir_name), destination) except: print_error("Copy Optionals Failed") @@ -382,6 +388,7 @@ def cleanup_optionals(mod,pbos): print("") try: for dir_name in mod: + #userconfig requires special handling since it is not a PBO source folder. if (dir_name == "userconfig"): destination = os.path.join(work_drive,dir_name) else: @@ -681,6 +688,7 @@ def main(argv): # For each module, prep files and then build. + print_blue("\nBuilding...") for module in modules: print_green("\nMaking " + module + "-"*max(1, (60-len(module)))) missing = False From 7b4f451d8a3c21f0daf2440de8bb4729069593a7 Mon Sep 17 00:00:00 2001 From: bux578 Date: Tue, 21 Apr 2015 19:00:13 +0200 Subject: [PATCH 082/104] reduce m84 mass m84 weighs ~260g compared to a m18 with ~520g. Ingame the m18 has a mass of 4 but giving the m84 a mass of 2 seems odd to me. That's why I've reduced it from 10 to 4. --- addons/grenades/CfgMagazines.hpp | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/addons/grenades/CfgMagazines.hpp b/addons/grenades/CfgMagazines.hpp index 33392f41eee..968b8ed141b 100644 --- a/addons/grenades/CfgMagazines.hpp +++ b/addons/grenades/CfgMagazines.hpp @@ -1,6 +1,7 @@ class CfgMagazines { class HandGrenade; class ACE_HandFlare_Base: HandGrenade { + author = "$STR_ACE_Common_ACETeam"; value = 2; nameSoundWeapon = "smokeshell"; nameSound = "smokeshell"; @@ -41,19 +42,23 @@ class CfgMagazines { }; class ACE_M84: HandGrenade { ammo = "ACE_G_M84"; + author = "$STR_ACE_Common_ACETeam"; displayname = "$STR_ACE_Grenades_M84_Name"; descriptionshort = "$STR_ACE_Grenades_M84_Description"; displayNameShort = "M84"; + mass = 4; model = PATHTOF(models\ACE_m84.p3d); picture = PATHTOF(UI\ACE_m84_x_ca.paa); }; class 3Rnd_UGL_FlareGreen_F; class 6Rnd_GreenSignal_F: 3Rnd_UGL_FlareGreen_F { + author = "$STR_ACE_Common_ACETeam"; ammo = "F_40mm_Green"; initSpeed = 120; }; class 6Rnd_RedSignal_F: 6Rnd_GreenSignal_F { + author = "$STR_ACE_Common_ACETeam"; ammo = "F_40mm_Red"; initSpeed = 120; }; From ced0d3d5769b0cf588ae8c2ff2e5ea85f41e031a Mon Sep 17 00:00:00 2001 From: ViperMaul Date: Tue, 21 Apr 2015 10:02:56 -0700 Subject: [PATCH 083/104] Removing extra spaces from the end of line #783 --- tools/make.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tools/make.py b/tools/make.py index a5c3069887d..bdf04f6810d 100644 --- a/tools/make.py +++ b/tools/make.py @@ -386,7 +386,7 @@ def copy_optionals_for_building(mod,pbos): def cleanup_optionals(mod,pbos): print("") - try: + try: for dir_name in mod: #userconfig requires special handling since it is not a PBO source folder. if (dir_name == "userconfig"): From 55887b7cfecd8384d9919b1acf2e67fc74866466 Mon Sep 17 00:00:00 2001 From: Ivan Navarro Cabello Date: Tue, 21 Apr 2015 19:03:55 +0200 Subject: [PATCH 084/104] updated stringtable for spanish added some spanish translate --- addons/medical/stringtable.xml | 4 +++- addons/missileguidance/stringtable.xml | 1 + addons/optionsmenu/stringtable.xml | 3 ++- 3 files changed, 6 insertions(+), 2 deletions(-) diff --git a/addons/medical/stringtable.xml b/addons/medical/stringtable.xml index e85283c471d..f735de7ebf6 100644 --- a/addons/medical/stringtable.xml +++ b/addons/medical/stringtable.xml @@ -4,10 +4,12 @@ Litter Simulation Detail Detale zużytych medykamentów + Detalle de simulación de basura Litter simulation detail level sets the number of litter items which will be locally spawned in the client. Excessive amounts in local areas could cause FPS lag, so this is a client only setting. Opcja ta ustawia liczbę zużytych medykamentów, jakie pojawiają się lokalnie wokół gracza. Ich zbyt duża ilość może spowodować spadki FPS, dlatego jest to ustawienie tylko po stronie klienta. + Detalle simulación de basura establece el número de artículos de basura que se generan a nivel local en el cliente. Las cantidades excesivas en áreas locales podrían causar caída de rendimiento, así que esto es un ajuste de cliente únicamente. Inject Atropine @@ -1634,4 +1636,4 @@ Aberration chromatique - + \ No newline at end of file diff --git a/addons/missileguidance/stringtable.xml b/addons/missileguidance/stringtable.xml index 9311ac2c0bb..59a80df0dce 100644 --- a/addons/missileguidance/stringtable.xml +++ b/addons/missileguidance/stringtable.xml @@ -17,6 +17,7 @@ Advanced missile guidance, or AMG, provides multiple enhancements to missile locking and firing. It is also a framework required for missile weapon types. Zaawansowane namierzanie rakiet, lub ZNR, dostarcza wiele poprawek do systemu namierzania rakiet oraz dodaje nowe tryby strzału. Jest to wymagana opcja dla broni rakietowych. + Guía de misiles avanzada, o AMG en sus siglas en inglés, ofrece múltiples mejoras en el fijado y disparo de misiles. Es también un framework requerido para armas de tipo misil. Hydra-70 DAGR Missile diff --git a/addons/optionsmenu/stringtable.xml b/addons/optionsmenu/stringtable.xml index e65087936ef..bc8d6dcdeca 100644 --- a/addons/optionsmenu/stringtable.xml +++ b/addons/optionsmenu/stringtable.xml @@ -218,6 +218,7 @@ Option Menu UI Scaling Menu option: taille de l'UI Skalowanie UI menu ustawień + Opción de escalado del menú UI - + \ No newline at end of file From e605a8dbca1511ac8c852f311d386a121b58b8cd Mon Sep 17 00:00:00 2001 From: ViperMaul Date: Tue, 21 Apr 2015 10:05:11 -0700 Subject: [PATCH 085/104] Trimming more trailing spaces #783 --- tools/make.py | 50 +++++++++++++++++++++++++------------------------- 1 file changed, 25 insertions(+), 25 deletions(-) diff --git a/tools/make.py b/tools/make.py index bdf04f6810d..3b7bf9d94e1 100644 --- a/tools/make.py +++ b/tools/make.py @@ -293,9 +293,9 @@ def print_yellow(msg): print(msg) color("reset") - + def copy_important_files(source_dir,destination_dir): - + originalDir = os.getcwd() importantFiles = ["mod.cpp", "README.md", @@ -303,10 +303,10 @@ def copy_important_files(source_dir,destination_dir): "LICENSE", "logo_ace3_ca.paa" ] - + print_yellow ("source_dir: " + source_dir) print_yellow("destination_dir: " + destination_dir) - + #copy importantFiles try: print_blue("\nSearching for important files in " + source_dir) @@ -316,16 +316,16 @@ def copy_important_files(source_dir,destination_dir): except: print_error("COPYING IMPORTANT FILES.") raise - + #copy all extension dlls try: os.chdir(os.path.join(source_dir)) print_blue("\nSearching for DLLs in " + os.getcwd()) filenames = glob.glob("*.dll") - + if not filenames: print ("Empty SET") - + for dll in filenames: print_green("Copying dll => " + os.path.join(source_dir,dll)) if os.path.isfile(dll): @@ -339,10 +339,10 @@ def copy_important_files(source_dir,destination_dir): def copy_optionals_for_building(mod,pbos): src_directories = os.listdir(optionals_root) current_dir = os.getcwd() - + print_blue("\nChecking Optionals folder...") try: - + #special server.pbo processing files = glob.glob(os.path.join(release_dir, "@ace","optionals","*.pbo")) for file in files: @@ -383,7 +383,7 @@ def copy_optionals_for_building(mod,pbos): raise finally: os.chdir(current_dir) - + def cleanup_optionals(mod,pbos): print("") try: @@ -393,9 +393,9 @@ def cleanup_optionals(mod,pbos): destination = os.path.join(work_drive,dir_name) else: destination = os.path.join(module_root,dir_name) - + print("Cleaning " + destination) - + try: file_name = "ace_{}.pbo".format(dir_name) src_file_path = os.path.join(release_dir, "@ace","addons",file_name) @@ -407,7 +407,7 @@ def cleanup_optionals(mod,pbos): print_error(file_name + " already exists") continue shutil.rmtree(destination) - + except: print_error("Cleaning Optionals Failed") raise @@ -535,7 +535,7 @@ def main(argv): global release_dir global module_root_parent global optionals_root - + cfg.read(os.path.join(make_root, "make.cfg")) # Project name (with @ symbol) @@ -569,7 +569,7 @@ def main(argv): # Release/build directory, relative to script dir release_dir = cfg.get(make_target, "release_dir", fallback="release") - + # Project PBO file prefix (files are renamed to prefix_name.pbo) pbo_name_prefix = cfg.get(make_target, "pbo_name_prefix", fallback=None) @@ -578,7 +578,7 @@ def main(argv): module_root = cfg.get(make_target, "module_root", fallback=os.path.join(make_root_parent, "addons")) optionals_root = os.path.join(module_root_parent, "optionals") print_green ("module_root: " + module_root) - + if (os.path.isdir(module_root)): os.chdir(module_root) else: @@ -590,9 +590,9 @@ def main(argv): else: print_error ("Directory " + optionals_root + " does not exist.") sys.exit() - + print_green ("release_dir: " + release_dir) - + except: raise print_error("Could not parse make.cfg.") @@ -640,14 +640,14 @@ def main(argv): print ("No cache found.") cache = {} - #Temporarily copy optionals_root for building. They will be removed later. + #Temporarily copy optionals_root for building. They will be removed later. optionals_modules = [] optional_files = [] copy_optionals_for_building(optionals_modules,optional_files) - + # Get list of subdirs in make root. dirs = next(os.walk(module_root))[1] - + # Autodetect what directories to build. if module_autodetect and not arg_modules: modules = [] @@ -692,7 +692,7 @@ def main(argv): for module in modules: print_green("\nMaking " + module + "-"*max(1, (60-len(module)))) missing = False - + # Cache check if module in cache: old_sha = cache[module] @@ -705,7 +705,7 @@ def main(argv): # Hash the module new_sha = get_directory_hash(os.path.join(module_root, module)) - + # Is the pbo file missing? missing = not os.path.isfile(os.path.join(release_dir, project, "addons", "ace_{}.pbo".format(module))) if missing: @@ -789,7 +789,7 @@ def main(argv): print_error("CfgConvert -txt return code == " + str(ret) + ". Usually means there is a syntax error within the config.cpp file.") os.remove(os.path.join(work_drive, prefix, module, "config.cpp")) shutil.copyfile(os.path.join(work_drive, prefix, module, "config.backup"), os.path.join(work_drive, prefix, module, "config.cpp")) - + # Include build number try: @@ -807,7 +807,7 @@ def main(argv): f.close() else: os.remove(os.path.join(work_drive, prefix, module, "config.cpp")) - os.rename(os.path.join(work_drive, prefix, module, "config.backup"), os.path.join(work_drive, prefix, module, "config.cpp")) + os.rename(os.path.join(work_drive, prefix, module, "config.backup"), os.path.join(work_drive, prefix, module, "config.cpp")) except: raise print_error("Failed to include build number") From be031801ab34387045171441bb64db965e34a6a6 Mon Sep 17 00:00:00 2001 From: PabstMirror Date: Tue, 21 Apr 2015 12:09:58 -0500 Subject: [PATCH 086/104] #770 - m84 - don't add pain if strength is low --- addons/grenades/functions/fnc_flashbangExplosionEH.sqf | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/addons/grenades/functions/fnc_flashbangExplosionEH.sqf b/addons/grenades/functions/fnc_flashbangExplosionEH.sqf index 75e61dab569..67fb2ded9ca 100644 --- a/addons/grenades/functions/fnc_flashbangExplosionEH.sqf +++ b/addons/grenades/functions/fnc_flashbangExplosionEH.sqf @@ -80,7 +80,7 @@ _affected = _grenade nearEntities ["CAManBase", 20]; //Add ace_medical pain effect: - if ((isClass (configFile >> "CfgPatches" >> "ACE_Medical")) && {_strength > 0}) then { + if ((isClass (configFile >> "CfgPatches" >> "ACE_Medical")) && {_strength > 0.1}) then { [ACE_player, (_strength / 2)] call EFUNC(medical,adjustPainLevel); }; From 3897b73d569c33834707ea88fcc6409ee9ea62dd Mon Sep 17 00:00:00 2001 From: bux578 Date: Tue, 21 Apr 2015 19:16:54 +0200 Subject: [PATCH 087/104] remove author from items inheriting ACE_ItemCore --- addons/attach/CfgWeapons.hpp | 1 - addons/common/CfgWeapons.hpp | 3 ++- addons/explosives/CfgVehicles.hpp | 4 ++-- addons/logistics_wirecutter/CfgWeapons.hpp | 1 - addons/microdagr/CfgWeapons.hpp | 1 - addons/missileguidance/CfgVehicles.hpp | 2 +- addons/overheating/CfgWeapons.hpp | 1 - addons/vehiclelock/CfgWeapons.hpp | 1 - 8 files changed, 5 insertions(+), 9 deletions(-) diff --git a/addons/attach/CfgWeapons.hpp b/addons/attach/CfgWeapons.hpp index 9734ceb273d..d2df9487186 100644 --- a/addons/attach/CfgWeapons.hpp +++ b/addons/attach/CfgWeapons.hpp @@ -5,7 +5,6 @@ class CfgWeapons { class ACE_IR_Strobe_Item: ACE_ItemCore { ACE_attachable = "ACE_IR_Strobe_Effect"; - author = "$STR_ACE_Common_ACETeam"; scope = 2; displayName = "$STR_ACE_IrStrobe_Name"; descriptionShort = "$STR_ACE_IrStrobe_Description"; diff --git a/addons/common/CfgWeapons.hpp b/addons/common/CfgWeapons.hpp index cf8c06798e5..3e40f360feb 100644 --- a/addons/common/CfgWeapons.hpp +++ b/addons/common/CfgWeapons.hpp @@ -2,6 +2,7 @@ class CfgWeapons { class ItemCore; class ACE_ItemCore: ItemCore { + author = "$STR_ACE_Common_ACETeam"; type = 4096;//4; detectRange = -1; simulation = "ItemMineDetector"; @@ -13,6 +14,7 @@ class CfgWeapons { }; class ACE_FakePrimaryWeapon: Rifle_Base_F { + author = "$STR_ACE_Common_ACETeam"; scope = 2; scopeCurator = 1; @@ -30,7 +32,6 @@ class CfgWeapons { class InventoryItem_Base_F; class ACE_Banana: ACE_ItemCore { - author = "$STR_ACE_Common_ACETeam"; scope = 2; displayName = "$STR_ACE_Common_bananaDisplayName"; descriptionShort = "$STR_ACE_Common_bananaDescr"; diff --git a/addons/explosives/CfgVehicles.hpp b/addons/explosives/CfgVehicles.hpp index 30e1ff151d9..5aa62992fcf 100644 --- a/addons/explosives/CfgVehicles.hpp +++ b/addons/explosives/CfgVehicles.hpp @@ -50,7 +50,7 @@ class CfgVehicles { class Items_base_F; class ACE_DefuseObject: Items_base_F { XEH_ENABLED; - author = "ACE"; + author = "$STR_ACE_Common_ACETeam"; _generalMacro = "ACE_DefuseObject"; displayName = "ACE Defuse Helper"; mapSize = 0.2; @@ -80,7 +80,7 @@ class CfgVehicles { }; class ACE_Explosives_Place: Items_base_F { XEH_ENABLED; - author = "ACE"; + author = "$STR_ACE_Common_ACETeam"; _generalMacro = "ACE_Explosives_Place"; displayName = "Multi-meter"; mapSize = 0.2; diff --git a/addons/logistics_wirecutter/CfgWeapons.hpp b/addons/logistics_wirecutter/CfgWeapons.hpp index 648bc3a3f80..5cb2db02c2e 100644 --- a/addons/logistics_wirecutter/CfgWeapons.hpp +++ b/addons/logistics_wirecutter/CfgWeapons.hpp @@ -3,7 +3,6 @@ class CfgWeapons { class ACE_ItemCore; class ACE_wirecutter: ACE_ItemCore { - author = "$STR_ACE_Common_ACETeam"; displayName = "$STR_ACE_logistics_wirecutter_wirecutterName"; descriptionShort = "$STR_ACE_logistics_wirecutter_wirecutterDescription"; model = "\A3\weapons_F\ammo\mag_univ.p3d"; diff --git a/addons/microdagr/CfgWeapons.hpp b/addons/microdagr/CfgWeapons.hpp index 73615ea6b68..bf4fc95b5c7 100644 --- a/addons/microdagr/CfgWeapons.hpp +++ b/addons/microdagr/CfgWeapons.hpp @@ -3,7 +3,6 @@ class CfgWeapons { class InventoryItem_Base_F; class ACE_microDAGR: ACE_ItemCore { - author = "$STR_ACE_Common_ACETeam"; scope = 2; displayName = "$STR_ACE_microdagr_itemName"; descriptionShort = "$STR_ACE_microdagr_itemDescription"; diff --git a/addons/missileguidance/CfgVehicles.hpp b/addons/missileguidance/CfgVehicles.hpp index 301795b8d7a..bbb17682556 100644 --- a/addons/missileguidance/CfgVehicles.hpp +++ b/addons/missileguidance/CfgVehicles.hpp @@ -20,7 +20,7 @@ class CfgVehicles { class ACE_Comanche_Test : B_Heli_Attack_01_F { displayName = "ACE_Comanche_Test"; - author = "ACE Team"; + author = "$STR_ACE_Common_ACETeam"; class Library { libTextDesc = "ACE_Comanche_Test"; }; diff --git a/addons/overheating/CfgWeapons.hpp b/addons/overheating/CfgWeapons.hpp index 12ec43024fc..580564e864f 100644 --- a/addons/overheating/CfgWeapons.hpp +++ b/addons/overheating/CfgWeapons.hpp @@ -5,7 +5,6 @@ class CfgWeapons { class ACE_SpareBarrel: ACE_ItemCore { displayname = "$STR_ACE_Overheating_SpareBarrelName"; descriptionshort = "$STR_ACE_Overheating_SpareBarrelDescription"; - //model = ""; picture = QUOTE(PATHTOF(UI\spare_barrel_ca.paa)); scope = 2; class ItemInfo: InventoryItem_Base_F { diff --git a/addons/vehiclelock/CfgWeapons.hpp b/addons/vehiclelock/CfgWeapons.hpp index 4b20de15d70..f3d1422a84d 100644 --- a/addons/vehiclelock/CfgWeapons.hpp +++ b/addons/vehiclelock/CfgWeapons.hpp @@ -3,7 +3,6 @@ class CfgWeapons { class ACE_ItemCore; class ACE_key_master: ACE_ItemCore { - author = "$STR_ACE_Common_ACETeam"; displayName = "Vehicle Key: Master"; descriptionShort = "$STR_ACE_Vehicle_Item_Master_Description"; model = "\A3\weapons_F\ammo\mag_univ.p3d"; From 08203b26c76918917d68f7720de4000b773729bf Mon Sep 17 00:00:00 2001 From: jaynus Date: Tue, 21 Apr 2015 11:58:07 -0700 Subject: [PATCH 088/104] Illuminate map for gunner of helicopters. Fixes #558 --- addons/map/functions/fnc_determineMapLight.sqf | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/addons/map/functions/fnc_determineMapLight.sqf b/addons/map/functions/fnc_determineMapLight.sqf index a5168bd8a19..f1fffcf248c 100644 --- a/addons/map/functions/fnc_determineMapLight.sqf +++ b/addons/map/functions/fnc_determineMapLight.sqf @@ -72,7 +72,7 @@ _vehicle = vehicle _unit; // Do not obscure the map if the player is on a enclosed vehicle (assume internal illumination) if (_vehicle != _unit) then { // Player is in a vehicle - if (isTurnedOut _unit && {_vehicle isKindOf "Tank" || {_vehicle isKindOf "Wheeled_APC"}}) then { + if (isTurnedOut _unit && { _vehicle isKindOf "Tank" || { _vehicle isKindOf "Helicopter" && { (gunner _vehicle) == _unit } } || {_vehicle isKindOf "Wheeled_APC"}}) then { _isEnclosed = true; }; }; From b2f978da3ca6005bf47a7eea4655ad6325cfc0cc Mon Sep 17 00:00:00 2001 From: jaynus Date: Tue, 21 Apr 2015 12:01:30 -0700 Subject: [PATCH 089/104] Added unstabalized optic mode to comanche for following the chopper. Is the first optic, all other zoom levels are stabalized. Fixes #556 --- addons/aircraft/Heli_Attack_01_base_F.hpp | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) diff --git a/addons/aircraft/Heli_Attack_01_base_F.hpp b/addons/aircraft/Heli_Attack_01_base_F.hpp index 22f2da3833e..14ca7ef7cd1 100644 --- a/addons/aircraft/Heli_Attack_01_base_F.hpp +++ b/addons/aircraft/Heli_Attack_01_base_F.hpp @@ -891,6 +891,25 @@ class Heli_Attack_01_base_F: Helicopter_Base_F { class OpticsIn { + class WideUnstabalized + { + opticsDisplayName = "WU"; + initAngleX = 0; + minAngleX = -35; + maxAngleX = 10; + initAngleY = 0; + minAngleY = -100; + maxAngleY = 100; + initFov = 0.466; + minFov = 0.466; + maxFov = 0.466; + visionMode[] = {"Normal","Ti"}; + thermalMode[] = {0,1}; + gunnerOpticsColor[] = {0,0,0,1}; + directionStabilized = 0; + horizontallyStabilized = 1; + gunnerOpticsModel = "\A3\Weapons_F_Beta\Reticle\Heli_Attack_01_Optics_Gunner_wide_F"; + }; class Wide { opticsDisplayName = "W"; From 0ab25a28667b0c0258807a3cde5e921603ccff3a Mon Sep 17 00:00:00 2001 From: Glowbal Date: Tue, 21 Apr 2015 21:41:00 +0200 Subject: [PATCH 090/104] fixed #659 --- addons/dragging/functions/fnc_canCarry.sqf | 2 +- addons/dragging/functions/fnc_canDrag.sqf | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/addons/dragging/functions/fnc_canCarry.sqf b/addons/dragging/functions/fnc_canCarry.sqf index 4067b366d6d..0fc5c074d6f 100644 --- a/addons/dragging/functions/fnc_canCarry.sqf +++ b/addons/dragging/functions/fnc_canCarry.sqf @@ -22,4 +22,4 @@ if !([_unit, _target, []] call EFUNC(common,canInteractWith)) exitWith {false}; // a static weapon has to be empty for dragging if ((typeOf _target) isKindOf "StaticWeapon" && {count crew _target > 0}) exitWith {false}; -alive _target && {_target getVariable [QGVAR(canCarry), false]} && {animationState _target in ["", "unconscious"] || (_target getvariable ["ACE_isUnconscious", false]) || (_target isKindOf "CAManBase" && {(_target getHitPointDamage "HitLeftLeg") + (_target getHitPointDamage "HitRightLeg") > 0.4})} +alive _target && {_target getVariable [QGVAR(canCarry), false]} && {animationState _target in ["", "unconscious"] || (_target getvariable ["ACE_isUnconscious", false]) || (_target isKindOf "CAManBase" && {(_target getHitPointDamage "HitLegs") > 0.4})} diff --git a/addons/dragging/functions/fnc_canDrag.sqf b/addons/dragging/functions/fnc_canDrag.sqf index dc2d64168bb..92744553fdc 100644 --- a/addons/dragging/functions/fnc_canDrag.sqf +++ b/addons/dragging/functions/fnc_canDrag.sqf @@ -22,4 +22,4 @@ if !([_unit, _target, []] call EFUNC(common,canInteractWith)) exitWith {false}; // a static weapon has to be empty for dragging if ((typeOf _target) isKindOf "StaticWeapon" && {count crew _target > 0}) exitWith {false}; -alive _target && {_target getVariable [QGVAR(canDrag), false]} && {animationState _target in ["", "unconscious"] || (_target getvariable ["ACE_isUnconscious", false]) || (_target isKindOf "CAManBase" && {(_target getHitPointDamage "HitLeftLeg") + (_target getHitPointDamage "HitRightLeg") > 0.4})}; \ No newline at end of file +alive _target && {_target getVariable [QGVAR(canDrag), false]} && {animationState _target in ["", "unconscious"] || (_target getvariable ["ACE_isUnconscious", false]) || (_target isKindOf "CAManBase" && {(_target getHitPointDamage "HitLegs") > 0.4})}; \ No newline at end of file From d8d658602f2e3929dfcfc5c8771c2959f003ddef Mon Sep 17 00:00:00 2001 From: jaynus Date: Tue, 21 Apr 2015 12:50:42 -0700 Subject: [PATCH 091/104] Apply to all aircraft gunner and pilot --- addons/map/functions/fnc_determineMapLight.sqf | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/addons/map/functions/fnc_determineMapLight.sqf b/addons/map/functions/fnc_determineMapLight.sqf index f1fffcf248c..441dc8103a2 100644 --- a/addons/map/functions/fnc_determineMapLight.sqf +++ b/addons/map/functions/fnc_determineMapLight.sqf @@ -72,7 +72,7 @@ _vehicle = vehicle _unit; // Do not obscure the map if the player is on a enclosed vehicle (assume internal illumination) if (_vehicle != _unit) then { // Player is in a vehicle - if (isTurnedOut _unit && { _vehicle isKindOf "Tank" || { _vehicle isKindOf "Helicopter" && { (gunner _vehicle) == _unit } } || {_vehicle isKindOf "Wheeled_APC"}}) then { + if (isTurnedOut _unit && { _vehicle isKindOf "Tank" || { ( _vehicle isKindOf "Helicopter" || _vehicle isKindOf "Plane" ) && { (driver _vehicle) == _unit || { (gunner _vehicle) == _unit } } } || {_vehicle isKindOf "Wheeled_APC"}}) then { _isEnclosed = true; }; }; From a886afb7d0502b96e9c41989d5ae3da55a6b4623 Mon Sep 17 00:00:00 2001 From: ulteq Date: Tue, 21 Apr 2015 23:26:38 +0200 Subject: [PATCH 092/104] Added a model for the ACE_Box_Ammo --- addons/ballistics/CfgVehicles.hpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/addons/ballistics/CfgVehicles.hpp b/addons/ballistics/CfgVehicles.hpp index 4ea9fc87a2b..7ad864a1e44 100644 --- a/addons/ballistics/CfgVehicles.hpp +++ b/addons/ballistics/CfgVehicles.hpp @@ -164,7 +164,7 @@ class CfgVehicles { scope = 2; accuracy = 1000; displayName = "[ACE] Ammo Supply Crate"; - // TODO: model = "..."; + model = "\A3\weapons_F\AmmoBoxes\AmmoBox_F"; author = "$STR_ACE_Common_ACETeam"; class TransportMagazines { MACRO_ADDMAGAZINE(ACE_20Rnd_762x51_Mag_SD,4); From 1bfb13abacb0a11c42df73d75c8118ba49213ff9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Nicol=C3=A1s=20Badano?= Date: Tue, 21 Apr 2015 19:07:42 -0300 Subject: [PATCH 093/104] Revert "remove author from items inheriting ACE_ItemCore" --- addons/attach/CfgWeapons.hpp | 1 + addons/common/CfgWeapons.hpp | 3 +-- addons/explosives/CfgVehicles.hpp | 4 ++-- addons/logistics_wirecutter/CfgWeapons.hpp | 1 + addons/microdagr/CfgWeapons.hpp | 1 + addons/missileguidance/CfgVehicles.hpp | 2 +- addons/overheating/CfgWeapons.hpp | 1 + addons/vehiclelock/CfgWeapons.hpp | 1 + 8 files changed, 9 insertions(+), 5 deletions(-) diff --git a/addons/attach/CfgWeapons.hpp b/addons/attach/CfgWeapons.hpp index d2df9487186..9734ceb273d 100644 --- a/addons/attach/CfgWeapons.hpp +++ b/addons/attach/CfgWeapons.hpp @@ -5,6 +5,7 @@ class CfgWeapons { class ACE_IR_Strobe_Item: ACE_ItemCore { ACE_attachable = "ACE_IR_Strobe_Effect"; + author = "$STR_ACE_Common_ACETeam"; scope = 2; displayName = "$STR_ACE_IrStrobe_Name"; descriptionShort = "$STR_ACE_IrStrobe_Description"; diff --git a/addons/common/CfgWeapons.hpp b/addons/common/CfgWeapons.hpp index 3e40f360feb..cf8c06798e5 100644 --- a/addons/common/CfgWeapons.hpp +++ b/addons/common/CfgWeapons.hpp @@ -2,7 +2,6 @@ class CfgWeapons { class ItemCore; class ACE_ItemCore: ItemCore { - author = "$STR_ACE_Common_ACETeam"; type = 4096;//4; detectRange = -1; simulation = "ItemMineDetector"; @@ -14,7 +13,6 @@ class CfgWeapons { }; class ACE_FakePrimaryWeapon: Rifle_Base_F { - author = "$STR_ACE_Common_ACETeam"; scope = 2; scopeCurator = 1; @@ -32,6 +30,7 @@ class CfgWeapons { class InventoryItem_Base_F; class ACE_Banana: ACE_ItemCore { + author = "$STR_ACE_Common_ACETeam"; scope = 2; displayName = "$STR_ACE_Common_bananaDisplayName"; descriptionShort = "$STR_ACE_Common_bananaDescr"; diff --git a/addons/explosives/CfgVehicles.hpp b/addons/explosives/CfgVehicles.hpp index 5aa62992fcf..30e1ff151d9 100644 --- a/addons/explosives/CfgVehicles.hpp +++ b/addons/explosives/CfgVehicles.hpp @@ -50,7 +50,7 @@ class CfgVehicles { class Items_base_F; class ACE_DefuseObject: Items_base_F { XEH_ENABLED; - author = "$STR_ACE_Common_ACETeam"; + author = "ACE"; _generalMacro = "ACE_DefuseObject"; displayName = "ACE Defuse Helper"; mapSize = 0.2; @@ -80,7 +80,7 @@ class CfgVehicles { }; class ACE_Explosives_Place: Items_base_F { XEH_ENABLED; - author = "$STR_ACE_Common_ACETeam"; + author = "ACE"; _generalMacro = "ACE_Explosives_Place"; displayName = "Multi-meter"; mapSize = 0.2; diff --git a/addons/logistics_wirecutter/CfgWeapons.hpp b/addons/logistics_wirecutter/CfgWeapons.hpp index 5cb2db02c2e..648bc3a3f80 100644 --- a/addons/logistics_wirecutter/CfgWeapons.hpp +++ b/addons/logistics_wirecutter/CfgWeapons.hpp @@ -3,6 +3,7 @@ class CfgWeapons { class ACE_ItemCore; class ACE_wirecutter: ACE_ItemCore { + author = "$STR_ACE_Common_ACETeam"; displayName = "$STR_ACE_logistics_wirecutter_wirecutterName"; descriptionShort = "$STR_ACE_logistics_wirecutter_wirecutterDescription"; model = "\A3\weapons_F\ammo\mag_univ.p3d"; diff --git a/addons/microdagr/CfgWeapons.hpp b/addons/microdagr/CfgWeapons.hpp index bf4fc95b5c7..73615ea6b68 100644 --- a/addons/microdagr/CfgWeapons.hpp +++ b/addons/microdagr/CfgWeapons.hpp @@ -3,6 +3,7 @@ class CfgWeapons { class InventoryItem_Base_F; class ACE_microDAGR: ACE_ItemCore { + author = "$STR_ACE_Common_ACETeam"; scope = 2; displayName = "$STR_ACE_microdagr_itemName"; descriptionShort = "$STR_ACE_microdagr_itemDescription"; diff --git a/addons/missileguidance/CfgVehicles.hpp b/addons/missileguidance/CfgVehicles.hpp index bbb17682556..301795b8d7a 100644 --- a/addons/missileguidance/CfgVehicles.hpp +++ b/addons/missileguidance/CfgVehicles.hpp @@ -20,7 +20,7 @@ class CfgVehicles { class ACE_Comanche_Test : B_Heli_Attack_01_F { displayName = "ACE_Comanche_Test"; - author = "$STR_ACE_Common_ACETeam"; + author = "ACE Team"; class Library { libTextDesc = "ACE_Comanche_Test"; }; diff --git a/addons/overheating/CfgWeapons.hpp b/addons/overheating/CfgWeapons.hpp index 580564e864f..12ec43024fc 100644 --- a/addons/overheating/CfgWeapons.hpp +++ b/addons/overheating/CfgWeapons.hpp @@ -5,6 +5,7 @@ class CfgWeapons { class ACE_SpareBarrel: ACE_ItemCore { displayname = "$STR_ACE_Overheating_SpareBarrelName"; descriptionshort = "$STR_ACE_Overheating_SpareBarrelDescription"; + //model = ""; picture = QUOTE(PATHTOF(UI\spare_barrel_ca.paa)); scope = 2; class ItemInfo: InventoryItem_Base_F { diff --git a/addons/vehiclelock/CfgWeapons.hpp b/addons/vehiclelock/CfgWeapons.hpp index f3d1422a84d..4b20de15d70 100644 --- a/addons/vehiclelock/CfgWeapons.hpp +++ b/addons/vehiclelock/CfgWeapons.hpp @@ -3,6 +3,7 @@ class CfgWeapons { class ACE_ItemCore; class ACE_key_master: ACE_ItemCore { + author = "$STR_ACE_Common_ACETeam"; displayName = "Vehicle Key: Master"; descriptionShort = "$STR_ACE_Vehicle_Item_Master_Description"; model = "\A3\weapons_F\ammo\mag_univ.p3d"; From 1facca2ba90eb65495deded8c9b95c84e2dcfda8 Mon Sep 17 00:00:00 2001 From: commy2 Date: Wed, 22 Apr 2015 00:24:54 +0200 Subject: [PATCH 094/104] fix: missing authors on flares, remove inert duplicate of handgrenade from zeus --- addons/grenades/CfgMagazines.hpp | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-) diff --git a/addons/grenades/CfgMagazines.hpp b/addons/grenades/CfgMagazines.hpp index 968b8ed141b..23eb4cb7596 100644 --- a/addons/grenades/CfgMagazines.hpp +++ b/addons/grenades/CfgMagazines.hpp @@ -1,7 +1,7 @@ class CfgMagazines { class HandGrenade; class ACE_HandFlare_Base: HandGrenade { - author = "$STR_ACE_Common_ACETeam"; + scope = 1; value = 2; nameSoundWeapon = "smokeshell"; nameSound = "smokeshell"; @@ -9,6 +9,8 @@ class CfgMagazines { initSpeed = 22; }; class ACE_HandFlare_White: ACE_HandFlare_Base { + author = "$STR_ACE_Common_ACETeam"; + scope = 2; ammo = "ACE_F_Hand_White"; displayname = "$STR_ACE_Grenades_M127A1_White_Name"; descriptionshort = "$STR_ACE_Grenades_M127A1_White_Description"; @@ -17,6 +19,8 @@ class CfgMagazines { picture = "\A3\Weapons_F\Data\UI\gear_flare_white_ca.paa"; }; class ACE_HandFlare_Red: ACE_HandFlare_Base { + author = "$STR_ACE_Common_ACETeam"; + scope = 2; ammo = "ACE_F_Hand_Red"; displayname = "$STR_ACE_Grenades_M127A1_Red_Name"; descriptionshort = "$STR_ACE_Grenades_M127A1_Red_Description"; @@ -25,6 +29,8 @@ class CfgMagazines { picture = "\A3\Weapons_F\Data\UI\gear_flare_red_ca.paa"; }; class ACE_HandFlare_Green: ACE_HandFlare_Base { + author = "$STR_ACE_Common_ACETeam"; + scope = 2; ammo = "ACE_F_Hand_Green"; displayname = "$STR_ACE_Grenades_M127A1_Green_Name"; descriptionshort = "$STR_ACE_Grenades_M127A1_Green_Description"; @@ -33,6 +39,8 @@ class CfgMagazines { picture = "\A3\Weapons_F\Data\UI\gear_flare_green_ca.paa"; }; class ACE_HandFlare_Yellow: ACE_HandFlare_Base { + author = "$STR_ACE_Common_ACETeam"; + scope = 2; ammo = "ACE_F_Hand_Yellow"; displayname = "$STR_ACE_Grenades_M127A1_Yellow_Name"; descriptionshort = "$STR_ACE_Grenades_M127A1_Yellow_Description"; @@ -41,8 +49,8 @@ class CfgMagazines { picture = "\A3\Weapons_F\Data\UI\gear_flare_yellow_ca.paa"; }; class ACE_M84: HandGrenade { - ammo = "ACE_G_M84"; author = "$STR_ACE_Common_ACETeam"; + ammo = "ACE_G_M84"; displayname = "$STR_ACE_Grenades_M84_Name"; descriptionshort = "$STR_ACE_Grenades_M84_Description"; displayNameShort = "M84"; From 93bcf7e9a16ee82a2e5df76ddf3cc9896a8aea89 Mon Sep 17 00:00:00 2001 From: jaynus Date: Tue, 21 Apr 2015 16:49:30 -0700 Subject: [PATCH 095/104] Added versioning to build process and automated version/git integration. --- extensions/CMakeLists.txt | 28 +++++++++++ .../AdvancedBallistics.cpp | 4 +- extensions/advanced_ballistics/CMakeLists.txt | 2 +- extensions/breakLine/CMakeLists.txt | 2 +- extensions/breakLine/ace_breakLine.cpp | 4 +- extensions/common/ace_common.h | 2 +- extensions/common/ace_version.hpp.in | 4 ++ extensions/common/ace_version_win32.rc.in | 47 +++++++++++++++++++ extensions/fcs/CMakeLists.txt | 2 +- extensions/fcs/ace_fcs.cpp | 4 +- 10 files changed, 86 insertions(+), 13 deletions(-) create mode 100644 extensions/common/ace_version.hpp.in create mode 100644 extensions/common/ace_version_win32.rc.in diff --git a/extensions/CMakeLists.txt b/extensions/CMakeLists.txt index 60287715548..038bb71d5ca 100644 --- a/extensions/CMakeLists.txt +++ b/extensions/CMakeLists.txt @@ -25,6 +25,34 @@ file(GLOB ACE_COMMON_SOURCES common/*.h common/*.hpp common/*.c common/*.cpp) add_library(ace_common STATIC ${ACE_COMMON_SOURCES}) include_directories(AFTER "common") +string(TIMESTAMP ACE_BUILDSTAMP "%Y-%m-%dT%H:%M:%SZ") +set(ACE_VERSION_MAJOR 3) +set(ACE_VERSION_MINOR 0) +set(ACE_VERSION_REVISION 1) +EXECUTE_PROCESS(COMMAND git rev-parse --verify HEAD + OUTPUT_VARIABLE T_ACE_VERSION_BUILD + OUTPUT_STRIP_TRAILING_WHITESPACE +) +string(SUBSTRING ${T_ACE_VERSION_BUILD} 0 7 ACE_VERSION_BUILD ) + +message("Building for: " ${ACE_VERSION_MAJOR}.${ACE_VERSION_MINOR}.${ACE_VERSION_REVISION}-${ACE_VERSION_BUILD}) + +configure_file( + "${CMAKE_CURRENT_SOURCE_DIR}/common/ace_version.hpp.in" + "${CMAKE_CURRENT_BINARY_DIR}/common/ace_version.hpp" + @ONLY) + +if(MSVC) + configure_file( + "${CMAKE_CURRENT_SOURCE_DIR}/common/ace_version_win32.rc.in" + "${CMAKE_CURRENT_BINARY_DIR}/common/ace_version_win32.rc" + @ONLY) + set(GLOBAL_RC ${CMAKE_CURRENT_BINARY_DIR}/common/ace_version_win32.rc) +endif() + +include_directories(AFTER ${CMAKE_CURRENT_BINARY_DIR}/common) +set(GLOBAL_SOURCES ${GLOBAL_RC}) + # Add extensions to build here add_subdirectory(fcs) add_subdirectory(breakLine) diff --git a/extensions/advanced_ballistics/AdvancedBallistics.cpp b/extensions/advanced_ballistics/AdvancedBallistics.cpp index 2851d6576bd..4bc9a289334 100644 --- a/extensions/advanced_ballistics/AdvancedBallistics.cpp +++ b/extensions/advanced_ballistics/AdvancedBallistics.cpp @@ -19,8 +19,6 @@ #define STD_AIR_DENSITY_ICAO 1.22498 #define STD_AIR_DENSITY_ASM 1.20885 -static char version[] = "1.0"; - struct Bullet { double airFriction; double caliber; @@ -242,7 +240,7 @@ void __stdcall RVExtension(char *output, int outputSize, const char *function) { if (!strcmp(function, "version")) { - int n = sprintf_s(output, outputSize, "%s", version); + int n = sprintf_s(output, outputSize, "%s", ACE_FULL_VERSION_STR); return; } diff --git a/extensions/advanced_ballistics/CMakeLists.txt b/extensions/advanced_ballistics/CMakeLists.txt index f579339a04b..19b9fc41d96 100644 --- a/extensions/advanced_ballistics/CMakeLists.txt +++ b/extensions/advanced_ballistics/CMakeLists.txt @@ -1,7 +1,7 @@ set(ACE_EXTENSION_NAME "ace_advanced_ballistics") file(GLOB SOURCES *.h *.hpp *.c *.cpp) -add_library( ${ACE_EXTENSION_NAME} SHARED ${SOURCES}) +add_library( ${ACE_EXTENSION_NAME} SHARED ${GLOBAL_SOURCES} ${SOURCES}) add_dependencies(${ACE_EXTENSION_NAME} ace_common) SET_TARGET_PROPERTIES(${ACE_EXTENSION_NAME} PROPERTIES PREFIX "") diff --git a/extensions/breakLine/CMakeLists.txt b/extensions/breakLine/CMakeLists.txt index 8981ec487e8..d34ae1b58ec 100644 --- a/extensions/breakLine/CMakeLists.txt +++ b/extensions/breakLine/CMakeLists.txt @@ -1,7 +1,7 @@ set(ACE_EXTENSION_NAME "ace_breakLine") file(GLOB SOURCES *.h *.hpp *.c *.cpp) -add_library( ${ACE_EXTENSION_NAME} SHARED ${SOURCES}) +add_library( ${ACE_EXTENSION_NAME} SHARED ${GLOBAL_SOURCES} ${SOURCES}) add_dependencies(${ACE_EXTENSION_NAME} ace_common) SET_TARGET_PROPERTIES(${ACE_EXTENSION_NAME} PROPERTIES PREFIX "") diff --git a/extensions/breakLine/ace_breakLine.cpp b/extensions/breakLine/ace_breakLine.cpp index fb5775b861b..f84b95053d2 100644 --- a/extensions/breakLine/ace_breakLine.cpp +++ b/extensions/breakLine/ace_breakLine.cpp @@ -19,8 +19,6 @@ #define MAXCHARACTERS 14 -static char VERSION[] = "1.0"; - extern "C" { __declspec (dllexport) void __stdcall RVExtension(char *output, int outputSize, const char *function); }; @@ -68,7 +66,7 @@ std::string addLineBreaks(const std::vector &words) { void __stdcall RVExtension(char *output, int outputSize, const char *function) { if (!strcmp(function, "version")) { - strncpy(output, VERSION, outputSize); + strncpy(output, ACE_FULL_VERSION_STR, outputSize); } else { strncpy(output, addLineBreaks(splitString(function)).c_str(), outputSize); output[outputSize - 1] = '\0'; diff --git a/extensions/common/ace_common.h b/extensions/common/ace_common.h index 4a8847b2093..93f7b9af8a3 100644 --- a/extensions/common/ace_common.h +++ b/extensions/common/ace_common.h @@ -1,4 +1,4 @@ #pragma once #include "targetver.h" - +#include "ace_version.hpp" diff --git a/extensions/common/ace_version.hpp.in b/extensions/common/ace_version.hpp.in new file mode 100644 index 00000000000..853648497d6 --- /dev/null +++ b/extensions/common/ace_version.hpp.in @@ -0,0 +1,4 @@ +#pragma once + +#define ACE_VERSION_STR "@ACE_VERSION_MAJOR@.@ACE_VERSION_MINOR@.@ACE_VERSION_REVISION@" +#define ACE_FULL_VERSION_STR "@ACE_VERSION_MAJOR@.@ACE_VERSION_MINOR@.@ACE_VERSION_REVISION@-@ACE_VERSION_BUILD@" \ No newline at end of file diff --git a/extensions/common/ace_version_win32.rc.in b/extensions/common/ace_version_win32.rc.in new file mode 100644 index 00000000000..112f4046499 --- /dev/null +++ b/extensions/common/ace_version_win32.rc.in @@ -0,0 +1,47 @@ +#ifdef _WIN32 + + #include + + #ifndef DEBUG + #define VER_DEBUG 0 + #else + #define VER_DEBUG VS_FF_DEBUG + #endif + + VS_VERSION_INFO VERSIONINFO + FILEVERSION @ACE_VERSION_MAJOR@, @ACE_VERSION_MINOR@, @ACE_VERSION_REVISION@ + PRODUCTVERSION @ACE_VERSION_MAJOR@, @ACE_VERSION_MINOR@, @ACE_VERSION_REVISION@ + FILEFLAGSMASK VS_FFI_FILEFLAGSMASK + FILEFLAGS (VS_FF_PRIVATEBUILD|VS_FF_PRERELEASE|VER_DEBUG) + FILEOS VOS__WINDOWS32 + FILETYPE VFT_DLL + FILESUBTYPE VFT2_UNKNOWN + BEGIN + BLOCK "StringFileInfo" + BEGIN + BLOCK "040904E4" + BEGIN + VALUE "CompanyName", "ACE3 Team" + VALUE "FileDescription", "@ACE_VERSION_MAJOR@.@ACE_VERSION_MINOR@.@ACE_VERSION_REVISION@-@ACE_VERSION_BUILD@" + VALUE "FileVersion", "@ACE_VERSION_MAJOR@.@ACE_VERSION_MINOR@.@ACE_VERSION_REVISION@-@ACE_VERSION_BUILD@" + VALUE "ProductName", "ACE3" + VALUE "ProductVersion", "@ACE_VERSION_MAJOR@.@ACE_VERSION_MINOR@.@ACE_VERSION_REVISION@-@ACE_VERSION_BUILD@" + VALUE "Build Date", "@ACE_BUILDSTAMP@" + END + END + + BLOCK "VarFileInfo" + BEGIN + /* The following line should only be modified for localized versions. */ + /* It consists of any number of WORD,WORD pairs, with each pair */ + /* describing a language,codepage combination supported by the file. */ + /* */ + /* For example, a file might have values "0x409,1252" indicating that it */ + /* supports English language (0x409) in the Windows ANSI codepage (1252). */ + + VALUE "Translation", 0x409, 1252 + + END + END + +#endif \ No newline at end of file diff --git a/extensions/fcs/CMakeLists.txt b/extensions/fcs/CMakeLists.txt index 2b245425662..0a4ba1b064b 100644 --- a/extensions/fcs/CMakeLists.txt +++ b/extensions/fcs/CMakeLists.txt @@ -1,7 +1,7 @@ set(ACE_EXTENSION_NAME "ace_fcs") file(GLOB SOURCES *.h *.hpp *.c *.cpp) -add_library( ${ACE_EXTENSION_NAME} SHARED ${SOURCES}) +add_library( ${ACE_EXTENSION_NAME} SHARED ${GLOBAL_SOURCES} ${SOURCES}) add_dependencies(${ACE_EXTENSION_NAME} ace_common) SET_TARGET_PROPERTIES(${ACE_EXTENSION_NAME} PROPERTIES PREFIX "") diff --git a/extensions/fcs/ace_fcs.cpp b/extensions/fcs/ace_fcs.cpp index 9ab49390582..4aada29aff3 100644 --- a/extensions/fcs/ace_fcs.cpp +++ b/extensions/fcs/ace_fcs.cpp @@ -25,8 +25,6 @@ #define PRECISION 0.1 #define RADIANS(X) (X / (180 / M_PI)) -static char version[] = "1.0"; - extern "C" { __declspec (dllexport) void __stdcall RVExtension(char *output, int outputSize, const char *function); }; @@ -104,7 +102,7 @@ double getSolution(double initSpeed, double airFriction, double angleTarget, dou void __stdcall RVExtension(char *output, int outputSize, const char *function) { if (!strcmp(function, "version")) { - strncpy(output, version, outputSize); + strncpy(output, ACE_FULL_VERSION_STR, outputSize); } else { std::vector argStrings = splitString(function); double initSpeed = std::stod(argStrings[0]); From e96ba8835102966b2db0b705a9dd033cacf18dec Mon Sep 17 00:00:00 2001 From: jaynus Date: Tue, 21 Apr 2015 16:50:01 -0700 Subject: [PATCH 096/104] count type correction. --- extensions/breakLine/ace_breakLine.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/extensions/breakLine/ace_breakLine.cpp b/extensions/breakLine/ace_breakLine.cpp index f84b95053d2..89ea1cfd851 100644 --- a/extensions/breakLine/ace_breakLine.cpp +++ b/extensions/breakLine/ace_breakLine.cpp @@ -37,8 +37,8 @@ std::vector splitString(const std::string & input) { std::string addLineBreaks(const std::vector &words) { std::stringstream sstream; - int numChar = 0; - int i = 0; + size_t numChar = 0; + size_t i = 0; while (i < words.size()) { if (numChar == 0) { From 8aa79a579cb86e000fd1daf9172cc4af34b0ce09 Mon Sep 17 00:00:00 2001 From: jaynus Date: Tue, 21 Apr 2015 16:56:50 -0700 Subject: [PATCH 097/104] Extensions rebuilt with new versioning. --- ace_advanced_ballistics.dll | Bin 613888 -> 614400 bytes ace_breakLine.dll | Bin 712192 -> 712704 bytes ace_fcs.dll | Bin 787968 -> 788480 bytes 3 files changed, 0 insertions(+), 0 deletions(-) diff --git a/ace_advanced_ballistics.dll b/ace_advanced_ballistics.dll index 3349bb5b38df8a69b01736e1346a576c8ef4fcb4..8f1c62484fccd88ee868047cb0bed19e0397580d 100644 GIT binary patch delta 30660 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 F{|D?g&)5I} delta 29992 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 E18$66>;M1& diff --git a/ace_breakLine.dll b/ace_breakLine.dll index 428df80092994ec765c2ee73530a7c9e4c7a216f..a13e1a8da90ffdbde7e461068b703b9868878999 100644 GIT binary patch delta 62329 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

bCxccyoz_oVlykETzj&!pQiLwANJBPk=4 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 TuWroH*U6KzV~O%_LgN1mdk?$T diff --git a/ace_fcs.dll b/ace_fcs.dll index 9cef4549c76b8eb75bd9ad1e417e62ca58cb4bcc..71fbba7d924bed48d439068714078f3bfa864f62 100644 GIT binary patch delta 64776 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 From b384d62edda1f0791c914c482a8986eeb50289bf Mon Sep 17 00:00:00 2001 From: jaynus Date: Tue, 21 Apr 2015 17:02:50 -0700 Subject: [PATCH 098/104] Fixes typos in medical strings causing missing strings. --- addons/medical/stringtable.xml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/addons/medical/stringtable.xml b/addons/medical/stringtable.xml index f735de7ebf6..53c587bec06 100644 --- a/addons/medical/stringtable.xml +++ b/addons/medical/stringtable.xml @@ -1,12 +1,12 @@  - + Litter Simulation Detail Detale zużytych medykamentów Detalle de simulación de basura - + Litter simulation detail level sets the number of litter items which will be locally spawned in the client. Excessive amounts in local areas could cause FPS lag, so this is a client only setting. Opcja ta ustawia liczbę zużytych medykamentów, jakie pojawiają się lokalnie wokół gracza. Ich zbyt duża ilość może spowodować spadki FPS, dlatego jest to ustawienie tylko po stronie klienta. Detalle simulación de basura establece el número de artículos de basura que se generan a nivel local en el cliente. Las cantidades excesivas en áreas locales podrían causar caída de rendimiento, así que esto es un ajuste de cliente únicamente. From b2c5e5e9f13221d410c3deb41fa4d1a3132bf49b Mon Sep 17 00:00:00 2001 From: jaynus Date: Tue, 21 Apr 2015 17:04:16 -0700 Subject: [PATCH 099/104] Remove AB verison check until versioning is complete. --- addons/advanced_ballistics/XEH_postInit.sqf | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/addons/advanced_ballistics/XEH_postInit.sqf b/addons/advanced_ballistics/XEH_postInit.sqf index 41615696acc..8273859033b 100644 --- a/addons/advanced_ballistics/XEH_postInit.sqf +++ b/addons/advanced_ballistics/XEH_postInit.sqf @@ -33,6 +33,7 @@ GVAR(AtmosphericDensitySimulationEnabled) = true; GVAR(currentGrid) = 0; GVAR(INIT_MESSAGE_ENABLED) = false; +/* @TODO: Remove this until verisoning is in sync with cmake/build versioning GVAR(extensionVersion) = ("ace_advanced_ballistics" callExtension "version"); GVAR(extensionAvailable) = (GVAR(extensionVersion) == EXTENSION_REQUIRED_VERSION); if (!GVAR(extensionAvailable)) exitWith { @@ -42,5 +43,5 @@ if (!GVAR(extensionAvailable)) exitWith { diag_log text "[ACE] ERROR: ace_advanced_ballistics.dll is incompatible"; }; }; - +*/ [] call FUNC(initializeTerrainExtension); From 8ec86a337fd8b87fe0974c3b15b47bd9572111ed Mon Sep 17 00:00:00 2001 From: PabstMirror Date: Tue, 21 Apr 2015 19:35:04 -0500 Subject: [PATCH 100/104] Show Loaded Ammo for static weapons --- addons/reload/CfgActions.hpp | 1 - addons/reload/CfgEventHandlers.hpp | 1 - addons/reload/CfgVehicles.hpp | 6 +- addons/reload/XEH_postInit.sqf | 5 +- addons/reload/functions/fnc_canCheckAmmo.sqf | 7 +- addons/reload/functions/fnc_checkAmmo.sqf | 2 - addons/reload/functions/fnc_displayAmmo.sqf | 117 ++++++++++--------- 7 files changed, 70 insertions(+), 69 deletions(-) diff --git a/addons/reload/CfgActions.hpp b/addons/reload/CfgActions.hpp index bdef8adf284..a76be64ba30 100644 --- a/addons/reload/CfgActions.hpp +++ b/addons/reload/CfgActions.hpp @@ -1,4 +1,3 @@ - class CfgActions { class LoadMagazine; class LoadEmptyMagazine : LoadMagazine { diff --git a/addons/reload/CfgEventHandlers.hpp b/addons/reload/CfgEventHandlers.hpp index c93f74e0bd9..75c2280e244 100644 --- a/addons/reload/CfgEventHandlers.hpp +++ b/addons/reload/CfgEventHandlers.hpp @@ -1,4 +1,3 @@ - class Extended_PreInit_EventHandlers { class ADDON { init = QUOTE(call COMPILE_FILE(XEH_preInit)); diff --git a/addons/reload/CfgVehicles.hpp b/addons/reload/CfgVehicles.hpp index 84333a1a096..b6bd212015e 100644 --- a/addons/reload/CfgVehicles.hpp +++ b/addons/reload/CfgVehicles.hpp @@ -3,13 +3,13 @@ class CfgVehicles { class CAManBase: Man { class ACE_Actions { class ACE_Weapon { - class ACE_LinkBelt { + class GVAR(LinkBelt) { displayName = "$STR_ACE_Reload_LinkBelt"; distance = 2.0; condition = QUOTE([ARR_2(_player, _target)] call FUNC(canLinkBelt)); statement = QUOTE([ARR_2(_player, _target)] call FUNC(startLinkingBelt)); }; - class ACE_CheckAmmo { + class GVAR(CheckAmmo) { displayName = "$STR_ACE_Reload_checkAmmo"; distance = 2.0; condition = QUOTE([ARR_2(_player, _target)] call FUNC(canCheckAmmo)); @@ -23,7 +23,7 @@ class CfgVehicles { class StaticWeapon: LandVehicle { class ACE_Actions { class ACE_MainActions { - class ACE_CheckAmmo { + class GVAR(CheckAmmo) { displayName = "$STR_ACE_Reload_checkAmmo"; distance = 2.0; condition = QUOTE([ARR_2(_player, _target)] call FUNC(canCheckAmmo)); diff --git a/addons/reload/XEH_postInit.sqf b/addons/reload/XEH_postInit.sqf index faefbe449d3..422ea183d35 100644 --- a/addons/reload/XEH_postInit.sqf +++ b/addons/reload/XEH_postInit.sqf @@ -7,10 +7,9 @@ if !(hasInterface) exitWith {}; ["ACE3", QGVAR(checkAmmo), localize "STR_ACE_Reload_checkAmmo", { // Conditions: canInteract - if !([ACE_player, objNull, []] call EFUNC(common,canInteractWith)) exitWith {false}; + if !([ACE_player, (vehicle ACE_player), ["isNotInside"]] call EFUNC(common,canInteractWith)) exitWith {false}; // Conditions: specific - if !([ACE_player] call EFUNC(common,canUseWeapon) || - {(vehicle ACE_player) isKindOf 'StaticWeapon'}) exitWith {false}; + if !([ACE_player] call EFUNC(common,canUseWeapon) || {(vehicle ACE_player) isKindOf "StaticWeapon"}) exitWith {false}; // Statement [ACE_player] call FUNC(checkAmmo); diff --git a/addons/reload/functions/fnc_canCheckAmmo.sqf b/addons/reload/functions/fnc_canCheckAmmo.sqf index 4075e7a151a..95ac2582a27 100644 --- a/addons/reload/functions/fnc_canCheckAmmo.sqf +++ b/addons/reload/functions/fnc_canCheckAmmo.sqf @@ -7,7 +7,12 @@ * 1: Target * * Return value: - * Can link belt + * Can link belt + * + * Example: + * [player, bob] call ace_reload_fnc_canCheckAmmo + * + * Public: No */ #include "script_component.hpp" diff --git a/addons/reload/functions/fnc_checkAmmo.sqf b/addons/reload/functions/fnc_checkAmmo.sqf index a1001890cd9..2499a9a8934 100644 --- a/addons/reload/functions/fnc_checkAmmo.sqf +++ b/addons/reload/functions/fnc_checkAmmo.sqf @@ -33,8 +33,6 @@ if (count _this > 1) then { if (_unit == _target) then { _unit playActionNow "Gear"; -} else { - _unit playActionNow "PutDown"; }; [FUNC(displayAmmo), [_target], 1, 0.1] call EFUNC(common,waitAndExecute); diff --git a/addons/reload/functions/fnc_displayAmmo.sqf b/addons/reload/functions/fnc_displayAmmo.sqf index 06f3a39da39..ce08fbd0620 100644 --- a/addons/reload/functions/fnc_displayAmmo.sqf +++ b/addons/reload/functions/fnc_displayAmmo.sqf @@ -14,7 +14,7 @@ EXPLODE_1_PVT(_this,_target); -private ["_weapon","_muzzle","_magazine","_showNumber","_ammo","_maxRounds","_count","_text","_color","_picture", "_a", "_string"]; +private ["_weapon","_muzzle","_magazine","_showNumber","_ammo","_maxRounds","_count","_text","_color","_picture","_ammoBarsStructuredText", "_a", "_loadedName", "_string"]; _weapon = currentWeapon _target; _muzzle = currentMuzzle _target; @@ -22,23 +22,23 @@ _magazine = currentMagazine _target; // currentWeapon returns "" for static weapons before they are shot once if (_target isKindOf "StaticWeapon") then { - if (_weapon == "") then { - if (count (weapons _target) == 1) then { - _weapon = (weapons _target) select 0; - _muzzle = _weapon; - }; - }; - - if (_magazine == "") then { - // Try to get magazine using magazinesAmmoFull - private ["_magazines"]; - _magazines = magazinesAmmoFull _target; - { - if (_x select 2) exitWith { - _magazine = _x select 0; + if (_weapon == "") then { + if (count (weapons _target) == 1) then { + _weapon = (weapons _target) select 0; + _muzzle = _weapon; }; - } forEach _magazines; - }; + }; + + if (_magazine == "") then { + // Try to get magazine using magazinesAmmoFull + private ["_magazines"]; + _magazines = magazinesAmmoFull _target; + { + if (_x select 2) exitWith { + _magazine = _x select 0; + }; + } forEach _magazines; + }; }; if (_magazine == "") exitWith {}; @@ -52,55 +52,56 @@ _count = 0; // not grenade launcher if (_muzzle == _weapon) then { - _maxRounds = getNumber (configFile >> "CfgMagazines" >> _magazine >> "count") max 1; + _maxRounds = getNumber (configFile >> "CfgMagazines" >> _magazine >> "count") max 1; - _ammo = _target ammo _weapon; - if (_maxRounds >= COUNT_BARS) then { - _count = round (COUNT_BARS * _ammo / _maxRounds); + _ammo = _target ammo _weapon; + if (_maxRounds >= COUNT_BARS) then { + _count = round (COUNT_BARS * _ammo / _maxRounds); - if (_ammo > 0) then {_count = _count max 1}; - if (_ammo < _maxRounds) then {_count = _count min (COUNT_BARS - 1)}; - } else { - _count = _ammo; - }; + if (_ammo > 0) then {_count = _count max 1}; + if (_ammo < _maxRounds) then {_count = _count min (COUNT_BARS - 1)}; + } else { + _count = _ammo; + }; -// grenade launcher + // grenade launcher } else { - _showNumber = true; + _showNumber = true; - _count = if (_magazine != "") then { - {_x == _magazine} count (magazines _target + [_magazine]) - } else { - {_x in getArray (configFile >> "CfgWeapons" >> _weapon >> _muzzle >> "Magazines")} count magazines _target - }; + _count = if (_magazine != "") then { + {_x == _magazine} count (magazines _target + [_magazine]) + } else { + {_x in getArray (configFile >> "CfgWeapons" >> _weapon >> _muzzle >> "Magazines")} count magazines _target + }; }; -_text = if (_showNumber) then { - parseText format ["%1x", _count] +_ammoBarsStructuredText = if (_showNumber) then { + parseText format ["%1x", _count] } else { - _color = [ - 2 * (1 - _ammo / _maxRounds) min 1, - 2 * _ammo / _maxRounds min 1, - 00 - ]; - - _string = ""; - for "_a" from 1 to _count do { - _string = _string + "|"; - }; - _text = [_string, _color] call EFUNC(common,stringToColoredText); - - _string = ""; - for "_a" from (_count + 1) to (_maxRounds min COUNT_BARS) do { - _string = _string + "|"; - }; - - composeText [ - _text, - [_string, [0.5, 0.5, 0.5]] call EFUNC(common,stringToColoredText) - ] + _color = [((2 * (1 - _ammo / _maxRounds)) min 1), ((2 * _ammo / _maxRounds) min 1), 0]; + + _string = ""; + for "_a" from 1 to _count do { + _string = _string + "|"; + }; + _text = [_string, _color] call EFUNC(common,stringToColoredText); + + _string = ""; + for "_a" from (_count + 1) to (_maxRounds min COUNT_BARS) do { + _string = _string + "|"; + }; + + composeText [_text, [_string, [0.5, 0.5, 0.5]] call EFUNC(common,stringToColoredText)]; }; -_picture = getText (configFile >> "CfgMagazines" >> _magazine >> "picture"); -[_text, _picture] call EFUNC(common,displayTextPicture); +if (_target isKindOf "StaticWeapon") then { + //Vehicle mags (usualy) don't have pictures, so just show the text above ammo count + _loadedName = getText (configFile >> "CfgMagazines" >> _magazine >> "displaynameshort"); + _loadedName = parseText format ["%1", _loadedName]; + _text = composeText [_loadedName, linebreak, _ammoBarsStructuredText]; + [_text] call EFUNC(common,displayTextStructured); +} else { + _picture = getText (configFile >> "CfgMagazines" >> _magazine >> "picture"); + [_ammoBarsStructuredText, _picture] call EFUNC(common,displayTextPicture); +}; From e479557f8ac9db07e50bbf70a634b696f65eee18 Mon Sep 17 00:00:00 2001 From: ulteq Date: Wed, 22 Apr 2015 10:48:45 +0200 Subject: [PATCH 101/104] Some magazine Stringtable fixes --- addons/ballistics/CfgMagazines.hpp | 6 +++--- addons/ballistics/stringtable.xml | 6 +++--- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/addons/ballistics/CfgMagazines.hpp b/addons/ballistics/CfgMagazines.hpp index 9ce3ad3eb01..16f8b227fc1 100644 --- a/addons/ballistics/CfgMagazines.hpp +++ b/addons/ballistics/CfgMagazines.hpp @@ -42,9 +42,9 @@ class CfgMagazines { class ACE_30Rnd_65x39_caseless_green_mag_Tracer_Dim: 30Rnd_65x39_caseless_green_mag_Tracer { author = "$STR_ACE_Common_ACETeam"; ammo = "ACE_65x39_Caseless_green_Tracer_Dim"; - displayName = "$STR_ACE_30Rnd_65x39_caseless_mag_Tracer_DimName"; - displayNameShort = "$STR_ACE_30Rnd_65x39_caseless_mag_Tracer_DimNameShort"; - descriptionShort = "$STR_ACE_30Rnd_65x39_caseless_mag_Tracer_DimDescription"; + displayName = "$STR_ACE_30Rnd_65x39_caseless_green_mag_Tracer_DimName"; + displayNameShort = "$STR_ACE_30Rnd_65x39_caseless_green_mag_Tracer_DimNameShort"; + descriptionShort = "$STR_ACE_30Rnd_65x39_caseless_green_mag_Tracer_DimDescription"; }; class 30Rnd_556x45_Stanag: CA_Magazine { diff --git a/addons/ballistics/stringtable.xml b/addons/ballistics/stringtable.xml index c75ab6339d8..b2ec7db7288 100644 --- a/addons/ballistics/stringtable.xml +++ b/addons/ballistics/stringtable.xml @@ -743,7 +743,7 @@ 6,5 мм ИК-трассирующие - 6.5mm 100Rnd Tracer IR-DIM Mag + 6.5mm 100Rnd Tracer IR-DIM Mag<br />Rounds: 100<br />Used in: MX LSW Magazynek 6,5mm 100rd Smugacz IR-DIM Chargeur 6.5mm 100Rnd Traçante IR-DIM Cargador de 100 balas trazadoras IR-DIM de 6.5mm @@ -764,7 +764,7 @@ 6,5 мм ИК-трассирующие - 6.5mm 200Rnd Tracer IR-DIM Belt + 6.5mm 200Rnd Tracer IR-DIM Belt<br />Rounds: 200<br />Used in: Stoner 99 LMG Magazynek 6,5mm 200rd Smugacz IR-DIM Bande 6.5mm 200Cps Traçante IR-DIM Cinta de 200 balas trazadoras IR-DIM de 6.5mm @@ -974,7 +974,7 @@ 6,5 мм Scenar - Caliber: 6.5x47mm (HPBT Scenar)<br />Rounds: 30 + Caliber: 6.5x47mm (HPBT Scenar)<br />Rounds: 30<br />Used in: MXM Calibre: 6.5x47mm (HPBT Scenar)<br />Cartouches: 30 Calibre: 6.5x47mm (HPBT Scenar)<br />Balas: 30 Kaliber: 6,5x47 mm (HPBT Scenar)<br />Pociski: 30 From f8006eaac90c1d22e0545c8ee9291c77d974506e Mon Sep 17 00:00:00 2001 From: ulteq Date: Wed, 22 Apr 2015 11:31:11 +0200 Subject: [PATCH 102/104] Expanded the ammo database: *30-06 Springfield (.30 Cal M1 Ball 174 grain) *6.5 Creedmore (Berger .264 cal 140 grain Hybrid) *7mm Rem Mag (Berger .284 cal 180 grain Hybrid) *.243 Win (Berger .243 cal 105 grain Hybrid) --- addons/ballistics/CfgAmmo.hpp | 60 +++++++++++++++++++++++++++++++++++ 1 file changed, 60 insertions(+) diff --git a/addons/ballistics/CfgAmmo.hpp b/addons/ballistics/CfgAmmo.hpp index 76a3970063c..02f25a6c800 100644 --- a/addons/ballistics/CfgAmmo.hpp +++ b/addons/ballistics/CfgAmmo.hpp @@ -144,6 +144,21 @@ class CfgAmmo { ACE_muzzleVelocities[]={730, 760, 790, 820, 830}; ACE_barrelLengths[]={10, 16, 20, 24, 26}; }; + class ACE_65_Creedmore_Ball: B_65x39_Caseless + { + airFriction=-0.00078; + typicalSpeed=860 ; + ACE_caliber=0.264; + ACE_bulletLength=1.426; + ACE_bulletMass=140; + ACE_ammoTempMuzzleVelocityShifts[]={-26.55, -25.47, -22.85, -20.12, -16.98, -12.80, -7.64, -1.53, 5.96, 15.17, 26.19}; + ACE_ballisticCoefficients[]={0.317}; + ACE_velocityBoundaries[]={}; + ACE_standardAtmosphere="ICAO"; + ACE_dragModel=7; + ACE_muzzleVelocities[]={750, 830, 850, 860, 865}; + ACE_barrelLengths[]={10, 16, 20, 24, 26}; + }; class B_762x51_Ball : BulletBase { airFriction=-0.001035; typicalSpeed=833; @@ -211,6 +226,51 @@ class CfgAmmo { ACE_muzzleVelocities[]={305, 325, 335, 340}; ACE_barrelLengths[]={16, 20, 24, 26}; }; + class ACE_30_06_M1_Ball : B_762x51_Ball { + airFriction=-0.0009; + typicalSpeed=800; + hit=10; + ACE_caliber=0.308; + ACE_bulletLength=1.21; + ACE_bulletMass=174; + ACE_ammoTempMuzzleVelocityShifts[]={-26.55, -25.47, -22.85, -20.12, -16.98, -12.80, -7.64, -1.53, 5.96, 15.17, 26.19}; + ACE_ballisticCoefficients[]={0.494}; + ACE_velocityBoundaries[]={}; + ACE_standardAtmosphere="ASM"; + ACE_dragModel=1; + ACE_muzzleVelocities[]={700, 785, 800, 830, 840}; + ACE_barrelLengths[]={10, 16, 20, 24, 26}; + }; + class ACE_7_Remington_Magnum_Ball : B_762x51_Ball { + airFriction=-0.0008; + typicalSpeed=820; + hit=8; + ACE_caliber=0.284; + ACE_bulletLength=1.529; + ACE_bulletMass=180; + ACE_ammoTempMuzzleVelocityShifts[]={-26.55, -25.47, -22.85, -20.12, -16.98, -12.80, -7.64, -1.53, 5.96, 15.17, 26.19}; + ACE_ballisticCoefficients[]={0.345}; + ACE_velocityBoundaries[]={}; + ACE_standardAtmosphere="ICAO"; + ACE_dragModel=7; + ACE_muzzleVelocities[]={720, 780, 812, 822, 830}; + ACE_barrelLengths[]={10, 16, 20, 24, 26}; + }; + class ACE_243_Winchester_Ball : B_762x51_Ball { + airFriction=-0.00095; + typicalSpeed=915; + hit=6; + ACE_caliber=0.243; + ACE_bulletLength=1.282; + ACE_bulletMass=180; + ACE_ammoTempMuzzleVelocityShifts[]={-26.55, -25.47, -22.85, -20.12, -16.98, -12.80, -7.64, -1.53, 5.96, 15.17, 26.19}; + ACE_ballisticCoefficients[]={0.278}; + ACE_velocityBoundaries[]={}; + ACE_standardAtmosphere="ICAO"; + ACE_dragModel=7; + ACE_muzzleVelocities[]={830, 875, 900, 915, 920}; + ACE_barrelLengths[]={10, 16, 20, 24, 26}; + }; class ACE_762x67_Ball_Mk248_Mod_0 : B_762x51_Ball { airFriction=-0.000830; caliber=1.08; From 2ec95c2862ef768d498298649701b251853cd039 Mon Sep 17 00:00:00 2001 From: ulteq Date: Wed, 22 Apr 2015 11:32:16 +0200 Subject: [PATCH 103/104] Brackets --- addons/ballistics/CfgAmmo.hpp | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/addons/ballistics/CfgAmmo.hpp b/addons/ballistics/CfgAmmo.hpp index 02f25a6c800..3f2fdf0dede 100644 --- a/addons/ballistics/CfgAmmo.hpp +++ b/addons/ballistics/CfgAmmo.hpp @@ -129,8 +129,7 @@ class CfgAmmo { class ACE_65x39_Caseless_green_Tracer_Dim : B_65x39_Caseless_green { nvgOnly = 1; }; - class ACE_65x47_Ball_Scenar: B_65x39_Caseless - { + class ACE_65x47_Ball_Scenar: B_65x39_Caseless { airFriction=-0.00078; typicalSpeed=820 ; ACE_caliber=0.264; @@ -144,8 +143,7 @@ class CfgAmmo { ACE_muzzleVelocities[]={730, 760, 790, 820, 830}; ACE_barrelLengths[]={10, 16, 20, 24, 26}; }; - class ACE_65_Creedmore_Ball: B_65x39_Caseless - { + class ACE_65_Creedmore_Ball: B_65x39_Caseless { airFriction=-0.00078; typicalSpeed=860 ; ACE_caliber=0.264; From 1d108f42a72e473ac2e3a1bb494d29302a43a96a Mon Sep 17 00:00:00 2001 From: ulteq Date: Wed, 22 Apr 2015 11:53:22 +0200 Subject: [PATCH 104/104] Added a magazine for the new 6.5 Creedmor cartridge *Fixed the 65x47mm short name --- addons/ballistics/CfgAmmo.hpp | 7 ++++++- addons/ballistics/CfgMagazines.hpp | 7 +++++++ addons/ballistics/CfgVehicles.hpp | 9 +++++++++ addons/ballistics/CfgWeapons.hpp | 3 ++- addons/ballistics/stringtable.xml | 23 ++++++++++++++++++----- 5 files changed, 42 insertions(+), 7 deletions(-) diff --git a/addons/ballistics/CfgAmmo.hpp b/addons/ballistics/CfgAmmo.hpp index 3f2fdf0dede..3ccc84a7bc4 100644 --- a/addons/ballistics/CfgAmmo.hpp +++ b/addons/ballistics/CfgAmmo.hpp @@ -132,6 +132,7 @@ class CfgAmmo { class ACE_65x47_Ball_Scenar: B_65x39_Caseless { airFriction=-0.00078; typicalSpeed=820 ; + caliber=0.6; ACE_caliber=0.264; ACE_bulletLength=1.364; ACE_bulletMass=139; @@ -143,9 +144,10 @@ class CfgAmmo { ACE_muzzleVelocities[]={730, 760, 790, 820, 830}; ACE_barrelLengths[]={10, 16, 20, 24, 26}; }; - class ACE_65_Creedmore_Ball: B_65x39_Caseless { + class ACE_65_Creedmor_Ball: B_65x39_Caseless { airFriction=-0.00078; typicalSpeed=860 ; + caliber=0.7; ACE_caliber=0.264; ACE_bulletLength=1.426; ACE_bulletMass=140; @@ -227,6 +229,7 @@ class CfgAmmo { class ACE_30_06_M1_Ball : B_762x51_Ball { airFriction=-0.0009; typicalSpeed=800; + caliber=1.3; hit=10; ACE_caliber=0.308; ACE_bulletLength=1.21; @@ -242,6 +245,7 @@ class CfgAmmo { class ACE_7_Remington_Magnum_Ball : B_762x51_Ball { airFriction=-0.0008; typicalSpeed=820; + caliber=1.4; hit=8; ACE_caliber=0.284; ACE_bulletLength=1.529; @@ -257,6 +261,7 @@ class CfgAmmo { class ACE_243_Winchester_Ball : B_762x51_Ball { airFriction=-0.00095; typicalSpeed=915; + caliber=0.8; hit=6; ACE_caliber=0.243; ACE_bulletLength=1.282; diff --git a/addons/ballistics/CfgMagazines.hpp b/addons/ballistics/CfgMagazines.hpp index 16f8b227fc1..5e3f48c369e 100644 --- a/addons/ballistics/CfgMagazines.hpp +++ b/addons/ballistics/CfgMagazines.hpp @@ -179,6 +179,13 @@ class CfgMagazines { displayNameShort = "$STR_ACE_30Rnd_65x47_Scenar_mag_NameShort"; descriptionShort = "$STR_ACE_30Rnd_65x47_Scenar_mag_Description"; }; + class ACE_30Rnd_65_Creedmor_mag: 30Rnd_65x39_caseless_mag { + author = "$STR_ACE_Common_ACETeam"; + ammo = "ACE_65_Creedmor_Ball"; + displayName = "$STR_ACE_30Rnd_65_Creedmor_mag_Name"; + displayNameShort = "$STR_ACE_30Rnd_65_Creedmor_mag_NameShort"; + descriptionShort = "$STR_ACE_30Rnd_65_Creedmor_mag_Description"; + }; class 10Rnd_338_Mag; class ACE_10Rnd_338_300gr_HPBT_Mag: 10Rnd_338_Mag { author = "$STR_ACE_Common_ACETeam"; diff --git a/addons/ballistics/CfgVehicles.hpp b/addons/ballistics/CfgVehicles.hpp index 7ad864a1e44..b40ee12a725 100644 --- a/addons/ballistics/CfgVehicles.hpp +++ b/addons/ballistics/CfgVehicles.hpp @@ -14,6 +14,7 @@ class CfgVehicles { class Box_NATO_Wps_F: NATO_Box_Base { class TransportMagazines { MACRO_ADDMAGAZINE(ACE_30Rnd_65x47_Scenar_mag,4); + MACRO_ADDMAGAZINE(ACE_30Rnd_65_Creedmor_mag,4); }; }; @@ -33,6 +34,7 @@ class CfgVehicles { class Box_NATO_Ammo_F: NATO_Box_Base { class TransportMagazines { MACRO_ADDMAGAZINE(ACE_30Rnd_65x47_Scenar_mag,4); + MACRO_ADDMAGAZINE(ACE_30Rnd_65_Creedmor_mag,4); MACRO_ADDMAGAZINE(ACE_10Rnd_762x51_M118LR_Mag,4); MACRO_ADDMAGAZINE(ACE_20Rnd_762x51_M118LR_Mag,4); MACRO_ADDMAGAZINE(ACE_10Rnd_762x51_Mk319_Mod_0_Mag,4); @@ -64,6 +66,7 @@ class CfgVehicles { class B_supplyCrate_F: ReammoBox_F { class TransportMagazines { MACRO_ADDMAGAZINE(ACE_30Rnd_65x47_Scenar_mag,4); + MACRO_ADDMAGAZINE(ACE_30Rnd_65_Creedmor_mag,4); MACRO_ADDMAGAZINE(ACE_10Rnd_762x51_M118LR_Mag,4); MACRO_ADDMAGAZINE(ACE_20Rnd_762x51_M118LR_Mag,4); MACRO_ADDMAGAZINE(ACE_10Rnd_762x51_Mk319_Mod_0_Mag,4); @@ -76,6 +79,7 @@ class CfgVehicles { class Box_East_Wps_F: EAST_Box_Base { class TransportMagazines { MACRO_ADDMAGAZINE(ACE_30Rnd_65x47_Scenar_mag,4); + MACRO_ADDMAGAZINE(ACE_30Rnd_65_Creedmor_mag,4); MACRO_ADDMAGAZINE(ACE_10Rnd_762x54_Tracer_mag,4); }; }; @@ -85,6 +89,7 @@ class CfgVehicles { MACRO_ADDMAGAZINE(ACE_30Rnd_556x45_Stanag_Tracer_Dim,1); MACRO_ADDMAGAZINE(ACE_30Rnd_65x39_caseless_green_mag_Tracer_Dim,4); MACRO_ADDMAGAZINE(ACE_30Rnd_65x47_Scenar_mag,4); + MACRO_ADDMAGAZINE(ACE_30Rnd_65_Creedmor_mag,4); MACRO_ADDMAGAZINE(ACE_10Rnd_762x54_Tracer_mag,4); }; }; @@ -92,6 +97,7 @@ class CfgVehicles { class Box_East_Ammo_F: EAST_Box_Base { class TransportMagazines { MACRO_ADDMAGAZINE(ACE_30Rnd_65x47_Scenar_mag,4); + MACRO_ADDMAGAZINE(ACE_30Rnd_65_Creedmor_mag,4); MACRO_ADDMAGAZINE(ACE_10Rnd_762x54_Tracer_mag,4); }; }; @@ -99,6 +105,7 @@ class CfgVehicles { class Box_East_Support_F: EAST_Box_Base { class TransportMagazines { MACRO_ADDMAGAZINE(ACE_30Rnd_65x47_Scenar_mag,6); + MACRO_ADDMAGAZINE(ACE_30Rnd_65_Creedmor_mag,4); MACRO_ADDMAGAZINE(ACE_20Rnd_762x51_Mag_SD,3); MACRO_ADDMAGAZINE(ACE_10Rnd_762x54_Tracer_mag,4); }; @@ -157,6 +164,7 @@ class CfgVehicles { class C_supplyCrate_F: ReammoBox_F { class TransportMagazines { MACRO_ADDMAGAZINE(ACE_30Rnd_65x47_Scenar_mag,4); + MACRO_ADDMAGAZINE(ACE_30Rnd_65_Creedmor_mag,4); }; }; @@ -185,6 +193,7 @@ class CfgVehicles { MACRO_ADDMAGAZINE(ACE_100Rnd_65x39_caseless_mag_Tracer_Dim,4); MACRO_ADDMAGAZINE(ACE_200Rnd_65x39_cased_Box_Tracer_Dim,4); MACRO_ADDMAGAZINE(ACE_30Rnd_65x47_Scenar_mag,4); + MACRO_ADDMAGAZINE(ACE_30Rnd_65_Creedmor_mag,4); MACRO_ADDMAGAZINE(ACE_10Rnd_338_300gr_HPBT_Mag,4); MACRO_ADDMAGAZINE(ACE_10Rnd_338_API526_Mag,4); MACRO_ADDMAGAZINE(ACE_5Rnd_127x99_Mag,4); diff --git a/addons/ballistics/CfgWeapons.hpp b/addons/ballistics/CfgWeapons.hpp index 26b07303c06..e6ce5d4bfd3 100644 --- a/addons/ballistics/CfgWeapons.hpp +++ b/addons/ballistics/CfgWeapons.hpp @@ -88,7 +88,8 @@ class CfgWeapons { "30Rnd_65x39_caseless_mag", "30Rnd_65x39_caseless_mag_Tracer", "ACE_30Rnd_65x39_caseless_mag_Tracer_Dim", - "ACE_30Rnd_65x47_Scenar_mag" + "ACE_30Rnd_65x47_Scenar_mag", + "ACE_30Rnd_65_Creedmor_mag" }; initSpeed = -1.018; ACE_barrelTwist=9; diff --git a/addons/ballistics/stringtable.xml b/addons/ballistics/stringtable.xml index b2ec7db7288..2f89e12d008 100644 --- a/addons/ballistics/stringtable.xml +++ b/addons/ballistics/stringtable.xml @@ -967,11 +967,11 @@ Магазин из 30-ти 6,5x47 мм (HPBT Scenar) - 6.5mm Scenar - 6.5mm Scenar - 6.5mm Scenar - 6,5mm Scenar - 6,5 мм Scenar + 6.5mm Lapua + 6.5mm Lapua + 6.5mm Lapua + 6,5mm Lapua + 6,5 мм Lapua Caliber: 6.5x47mm (HPBT Scenar)<br />Rounds: 30<br />Used in: MXM @@ -980,6 +980,19 @@ Kaliber: 6,5x47 mm (HPBT Scenar)<br />Pociski: 30 Калибр: 6,5x47 мм (HPBT Scenar)<br />Патронов: 30 + + 6.5mm Creedmor 30Rnd Mag + + + 6.5mm CM + 6.5mm CM + 6.5mm CM + 6,5mm CM + 6,5 мм CM + + + Caliber: 6.5mm Creedmor<br />Rounds: 30<br />Used in: MXM + .338 10Rnd Mag (300gr Sierra MatchKing HPBT) .338 10 Cps (300gr Sierra MatchKing HPBT)