From e6c7758d3f9a01cee2a8cb59be1d572d909d8921 Mon Sep 17 00:00:00 2001 From: PabstMirror Date: Sun, 5 Apr 2015 01:57:24 -0500 Subject: [PATCH 01/22] Prototype - Show Mils on mk6 --- addons/mk6mortar/$PBOPREFIX$ | 1 + addons/mk6mortar/CfgEventHandlers.hpp | 10 +++ addons/mk6mortar/CfgMagazines.hpp | 3 + addons/mk6mortar/CfgVehicles.hpp | 21 +++++++ addons/mk6mortar/CfgWeapons.hpp | 3 + addons/mk6mortar/README.md | 10 +++ addons/mk6mortar/RscInGameUI.hpp | 34 ++++++++++ addons/mk6mortar/XEH_clientInit.sqf | 6 ++ addons/mk6mortar/XEH_preInit.sqf | 9 +++ addons/mk6mortar/config.cpp | 19 ++++++ .../mk6mortar/functions/fnc_handleFired.sqf | 29 +++++++++ .../fnc_handlePlayerVehicleChanged.sqf | 55 ++++++++++++++++ .../functions/fnc_turretDisplayLoaded.sqf | 62 +++++++++++++++++++ .../mk6mortar/functions/script_component.hpp | 1 + addons/mk6mortar/script_component.hpp | 12 ++++ addons/mk6mortar/stringtable.xml | 6 ++ 16 files changed, 281 insertions(+) create mode 100644 addons/mk6mortar/$PBOPREFIX$ create mode 100644 addons/mk6mortar/CfgEventHandlers.hpp create mode 100644 addons/mk6mortar/CfgMagazines.hpp create mode 100644 addons/mk6mortar/CfgVehicles.hpp create mode 100644 addons/mk6mortar/CfgWeapons.hpp create mode 100644 addons/mk6mortar/README.md create mode 100644 addons/mk6mortar/RscInGameUI.hpp create mode 100644 addons/mk6mortar/XEH_clientInit.sqf create mode 100644 addons/mk6mortar/XEH_preInit.sqf create mode 100644 addons/mk6mortar/config.cpp create mode 100644 addons/mk6mortar/functions/fnc_handleFired.sqf create mode 100644 addons/mk6mortar/functions/fnc_handlePlayerVehicleChanged.sqf create mode 100644 addons/mk6mortar/functions/fnc_turretDisplayLoaded.sqf create mode 100644 addons/mk6mortar/functions/script_component.hpp create mode 100644 addons/mk6mortar/script_component.hpp create mode 100644 addons/mk6mortar/stringtable.xml diff --git a/addons/mk6mortar/$PBOPREFIX$ b/addons/mk6mortar/$PBOPREFIX$ new file mode 100644 index 0000000000..a21eaf95f0 --- /dev/null +++ b/addons/mk6mortar/$PBOPREFIX$ @@ -0,0 +1 @@ +z\ace\Addons\mk6mortar \ No newline at end of file diff --git a/addons/mk6mortar/CfgEventHandlers.hpp b/addons/mk6mortar/CfgEventHandlers.hpp new file mode 100644 index 0000000000..3daad1425a --- /dev/null +++ b/addons/mk6mortar/CfgEventHandlers.hpp @@ -0,0 +1,10 @@ +class Extended_PreInit_EventHandlers { + class ADDON { + init = QUOTE(call COMPILE_FILE(XEH_preInit)); + }; +}; +class Extended_PostInit_EventHandlers { + class ADDON { + clientInit = QUOTE( call COMPILE_FILE(XEH_clientInit) ); + }; +}; diff --git a/addons/mk6mortar/CfgMagazines.hpp b/addons/mk6mortar/CfgMagazines.hpp new file mode 100644 index 0000000000..39f8bdd780 --- /dev/null +++ b/addons/mk6mortar/CfgMagazines.hpp @@ -0,0 +1,3 @@ +class CfgMagazines { + +}; diff --git a/addons/mk6mortar/CfgVehicles.hpp b/addons/mk6mortar/CfgVehicles.hpp new file mode 100644 index 0000000000..8399777054 --- /dev/null +++ b/addons/mk6mortar/CfgVehicles.hpp @@ -0,0 +1,21 @@ +class CfgVehicles { + class LandVehicle; + class StaticWeapon: LandVehicle { + class Turrets { + class MainTurret; + }; + }; + class StaticMortar: StaticWeapon { + class Turrets: Turrets { + class MainTurret: MainTurret { + }; + }; + }; + class Mortar_01_base_F: StaticMortar { + class Turrets: Turrets { + class MainTurret: MainTurret { + turretInfoType = "ACE_Mk6_RscWeaponRangeArtillery"; + }; + }; + }; +}; diff --git a/addons/mk6mortar/CfgWeapons.hpp b/addons/mk6mortar/CfgWeapons.hpp new file mode 100644 index 0000000000..9d03783519 --- /dev/null +++ b/addons/mk6mortar/CfgWeapons.hpp @@ -0,0 +1,3 @@ +class CfgWeapons { + +}; diff --git a/addons/mk6mortar/README.md b/addons/mk6mortar/README.md new file mode 100644 index 0000000000..84c7a6e984 --- /dev/null +++ b/addons/mk6mortar/README.md @@ -0,0 +1,10 @@ +ace_mk6mortar +========== + +Tweaks the mk6 mortar from Arma3 + +## Maintainers + +The people responsible for merging changes to this component or answering potential questions. + +- [PabstMirror](https://github.com/PabstMirror) diff --git a/addons/mk6mortar/RscInGameUI.hpp b/addons/mk6mortar/RscInGameUI.hpp new file mode 100644 index 0000000000..4082977a5c --- /dev/null +++ b/addons/mk6mortar/RscInGameUI.hpp @@ -0,0 +1,34 @@ +class RscControlsGroup; +class RscText; + +class RscInGameUI { + class RscWeaponRangeArtillery { + class CA_IGUI_elements_group: RscControlsGroup {}; + }; + class ACE_Mk6_RscWeaponRangeArtillery: RscWeaponRangeArtillery { + onLoad = QUOTE(uiNamespace setVariable [ARR_2('ACE_Mk6_RscWeaponRangeArtillery',(_this select 0))]; _this call FUNC(turretDisplayLoaded);); + controls[] = {"ACE_MILS_GROUP", "CA_IGUI_elements_group","CA_RangeElements_group"}; + class ACE_MILS_GROUP: CA_IGUI_elements_group { + idc = 80170; + class controls { + class CA_Elev_MILS: RscText { + idc = 80175; + style = 1; + sizeEx = "0.038*SafezoneH"; + colorText[] = {0.706,0.0745,0.0196,1}; + shadow = 0; + font = "EtelkaMonospacePro"; + text = "80.5"; + x = "36.8 * (0.01875 * SafezoneH)"; + y = "29.3 * (0.025 * SafezoneH)"; + w = "5.2 * (0.01875 * SafezoneH)"; + h = "1.2 * (0.025 * SafezoneH)"; + }; + class CA_Elev_Need_MILS: CA_Elev_MILS { + idc = 80176; + y = "30.8 * (0.025 * SafezoneH)"; + }; + }; + }; + }; +}; diff --git a/addons/mk6mortar/XEH_clientInit.sqf b/addons/mk6mortar/XEH_clientInit.sqf new file mode 100644 index 0000000000..36b39e58c4 --- /dev/null +++ b/addons/mk6mortar/XEH_clientInit.sqf @@ -0,0 +1,6 @@ +#include "script_component.hpp" + +if (!hasInterface) exitWith {}; + +["playerVehicleChanged", {_this call FUNC(handlePlayerVehicleChanged);}] call EFUNC(common,addEventHandler); + diff --git a/addons/mk6mortar/XEH_preInit.sqf b/addons/mk6mortar/XEH_preInit.sqf new file mode 100644 index 0000000000..ab2d8370d0 --- /dev/null +++ b/addons/mk6mortar/XEH_preInit.sqf @@ -0,0 +1,9 @@ +#include "script_component.hpp" + +ADDON = false; + +PREP(handleFired); +PREP(handlePlayerVehicleChanged); +PREP(turretDisplayLoaded); + +ADDON = true; diff --git a/addons/mk6mortar/config.cpp b/addons/mk6mortar/config.cpp new file mode 100644 index 0000000000..f7635d1fb6 --- /dev/null +++ b/addons/mk6mortar/config.cpp @@ -0,0 +1,19 @@ +#include "script_component.hpp" + +class CfgPatches { + class ADDON { + units[] = {}; + weapons[] = {}; + requiredVersion = REQUIRED_VERSION; + requiredAddons[] = {"ace_interaction"}; + author[] = {"PabstMirror"}; + authorUrl = "https://github.com/acemod"; + VERSION_CONFIG; + }; +}; + +#include "CfgEventHandlers.hpp" +#include "CfgMagazines.hpp" +#include "CfgVehicles.hpp" +#include "CfgWeapons.hpp" +#include "RscInGameUI.hpp" diff --git a/addons/mk6mortar/functions/fnc_handleFired.sqf b/addons/mk6mortar/functions/fnc_handleFired.sqf new file mode 100644 index 0000000000..7f1e00453d --- /dev/null +++ b/addons/mk6mortar/functions/fnc_handleFired.sqf @@ -0,0 +1,29 @@ +/* + * Author: PabstMirror + * + * Arguments: + * 0: mortar - Object the event handler is assigned to + * 1: weapon - Fired weapon + * 2: muzzle - Muzzle that was used + * 3: mode - Current mode of the fired weapon + * 4: ammo - Ammo used + * 5: magazine - magazine name which was used + * 6: projectile - Object of the projectile that was shot + * + * Return Value: + * Nothing + * + * Example: + * [clientFiredBIS-XEH] call ace_grenades_fnc_throwGrenade + * + * Public: No + */ +#include "script_component.hpp" + +disableSerialization; + +PARAMS_7(_vehicle,_weapon,_muzzle,_mode,_ammo,_magazine,_projectile); + + + + diff --git a/addons/mk6mortar/functions/fnc_handlePlayerVehicleChanged.sqf b/addons/mk6mortar/functions/fnc_handlePlayerVehicleChanged.sqf new file mode 100644 index 0000000000..a25bda21ff --- /dev/null +++ b/addons/mk6mortar/functions/fnc_handlePlayerVehicleChanged.sqf @@ -0,0 +1,55 @@ +/* + * Author: PabstMirror + * + * + * Arguments: + * + * Return Value: + * + * Example: + * + * Public: No + */ +#include "script_component.hpp" + +PARAMS_2(_player,_newVehicle); + +if (isNull _newVehicle) exitWith {}; +if (!(_newVehicle isKindOf "Mortar_01_base_F")) exitWith {}; + +[{ + PARAMS_2(_args,_pfID); + EXPLODE_1_PVT(_args,_veh); + + if ((vehicle ACE_player) != _veh) then { + [_pfID] call CBA_fnc_removePerFrameHandler; + } else { + _display = uiNamespace getVariable ["ACE_Mk6_RscWeaponRangeArtillery", displayNull]; + if (isNull _display) exitWith {systemChat "null";}; + + _hideRangefinder = false; + + _elevDeg = parseNumber ctrlText (_display displayCtrl 175); + if (true) then { + (_display displayCtrl 80175) ctrlSetText str round (_elevDeg * 6400 / 360); + hintSilent str (_elevDeg * 6400 / 360); + } else { + (_display displayCtrl 80175) ctrlSetText str _elevDeg; + }; + + if (_hideRangefinder) then { + (_display displayCtrl 80176) ctrlSetText ""; + } else { + _elevDeg = parseNumber ctrlText (_display displayCtrl 176); + if (_elevDeg <= 0) then { + (_display displayCtrl 80176) ctrlSetText (ctrlText (_display displayCtrl 176)); + } else { + if (true) then { + (_display displayCtrl 80176) ctrlSetText str round (_elevDeg * 6400 / 360); + } else { + (_display displayCtrl 80176) ctrlSetText str _elevDeg; + }; + }; + }; + }; +}, 0, [_newVehicle]] call CBA_fnc_addPerFrameHandler; \ No newline at end of file diff --git a/addons/mk6mortar/functions/fnc_turretDisplayLoaded.sqf b/addons/mk6mortar/functions/fnc_turretDisplayLoaded.sqf new file mode 100644 index 0000000000..dc3dda4038 --- /dev/null +++ b/addons/mk6mortar/functions/fnc_turretDisplayLoaded.sqf @@ -0,0 +1,62 @@ +/* + * Author: PabstMirror + * + * + * Arguments: + * + * Return Value: + * + * Example: + * + * Public: No + */ +#include "script_component.hpp" + +#define CTRL_CA_HEADING (configFile >> "RscInGameUI" >> "ACE_Mk6_RscWeaponRangeArtillery" >> "CA_IGUI_elements_group" >> "controls" >> "CA_Heading") +#define CTRL_CA_OPTICSPITCH (configFile >> "RscInGameUI" >> "ACE_Mk6_RscWeaponRangeArtillery" >> "CA_IGUI_elements_group" >> "controls" >> "CA_OPTICSPITCH") +#define CTRL_CA_OPTICSZOOM (configFile >> "RscInGameUI" >> "ACE_Mk6_RscWeaponRangeArtillery" >> "CA_IGUI_elements_group" >> "controls" >> "CA_OPTICSZOOM") +#define CTRL_CA_SOLUTION_TEXT (configFile >> "RscInGameUI" >> "ACE_Mk6_RscWeaponRangeArtillery" >> "CA_IGUI_elements_group" >> "controls" >> "CA_SOLUTION_TEXT") +#define CTRL_CA_DISTANCE_TEXT (configFile >> "RscInGameUI" >> "ACE_Mk6_RscWeaponRangeArtillery" >> "CA_IGUI_elements_group" >> "controls" >> "CA_DISTANCE_TEXT") +#define CTRL_CA_DISTANCE (configFile >> "RscInGameUI" >> "ACE_Mk6_RscWeaponRangeArtillery" >> "CA_IGUI_elements_group" >> "controls" >> "CA_DISTANCE") +#define CTRL_CA_TIME_TEXT (configFile >> "RscInGameUI" >> "ACE_Mk6_RscWeaponRangeArtillery" >> "CA_IGUI_elements_group" >> "controls" >> "CA_TIME_TEXT") +#define CTRL_CA_TIME (configFile >> "RscInGameUI" >> "ACE_Mk6_RscWeaponRangeArtillery" >> "CA_IGUI_elements_group" >> "controls" >> "CA_TIME") +#define CTRL_CA_ELEV_NEED_TEXT (configFile >> "RscInGameUI" >> "ACE_Mk6_RscWeaponRangeArtillery" >> "CA_IGUI_elements_group" >> "controls" >> "CA_ELEV_NEED_TEXT") +#define CTRL_CA_RANGEELEMENTS_GROUP (configFile >> "RscInGameUI" >> "ACE_Mk6_RscWeaponRangeArtillery" >> "CA_RangeElements_group") + +#define CTRL_CA_ELEV (configFile >> "RscInGameUI" >> "ACE_Mk6_RscWeaponRangeArtillery" >> "CA_IGUI_elements_group" >> "controls" >> "CA_ELEV") +#define CTRL_CA_ELEV_NEED (configFile >> "RscInGameUI" >> "ACE_Mk6_RscWeaponRangeArtillery" >> "CA_IGUI_elements_group" >> "controls" >> "CA_ELEV_NEED") + + +disableSerialization; + +// PARAMS_1(_display); +_display = uiNamespace getVariable ["ACE_Mk6_RscWeaponRangeArtillery", displayNull]; +if (isNull _display) exitWith {}; + +_hideRangefinder = true; + +_fnc_hideControl = { + PARAMS_2(_path,_hideCtrl); + _idc = getNumber (_path >> "IDC"); + _pos = []; + if (_hideCtrl) then { + _pos = [-9,-9,0,0]; + } else { + { + if (isNumber (_path >> _x)) then { + _pos pushBack (getNumber (_path >> _x)); + } else { + _pos pushBack (call compile (getText (_path >> _x))); + }; + } forEach ["x", "y", "w", "h"]; + }; + (_display displayCtrl _idc) ctrlSetPosition _pos; + (_display displayCtrl _idc) ctrlCommit 0; +}; + +{ + [_x, _hideRangefinder] call _fnc_hideControl; +} forEach [CTRL_CA_HEADING, CTRL_CA_OPTICSPITCH, CTRL_CA_OPTICSZOOM, CTRL_CA_SOLUTION_TEXT, CTRL_CA_DISTANCE_TEXT, CTRL_CA_DISTANCE, CTRL_CA_TIME_TEXT, CTRL_CA_TIME, CTRL_CA_ELEV_NEED_TEXT, CTRL_CA_RANGEELEMENTS_GROUP]; + +[CTRL_CA_ELEV, true] call _fnc_hideControl; +[CTRL_CA_ELEV_NEED, true] call _fnc_hideControl; diff --git a/addons/mk6mortar/functions/script_component.hpp b/addons/mk6mortar/functions/script_component.hpp new file mode 100644 index 0000000000..9980d4fc88 --- /dev/null +++ b/addons/mk6mortar/functions/script_component.hpp @@ -0,0 +1 @@ +#include "\z\ace\addons\mk6mortar\script_component.hpp" \ No newline at end of file diff --git a/addons/mk6mortar/script_component.hpp b/addons/mk6mortar/script_component.hpp new file mode 100644 index 0000000000..adf4a56946 --- /dev/null +++ b/addons/mk6mortar/script_component.hpp @@ -0,0 +1,12 @@ +#define COMPONENT mk6mortar +#include "\z\ace\Addons\main\script_mod.hpp" + +#ifdef DEBUG_ENABLED_MK6MORTAR + #define DEBUG_MODE_FULL +#endif + +#ifdef DEBUG_SETTINGS_MK6MORTAR + #define DEBUG_SETTINGS DEBUG_SETTINGS_MK6MORTAR +#endif + +#include "\z\ace\Addons\main\script_macros.hpp" \ No newline at end of file diff --git a/addons/mk6mortar/stringtable.xml b/addons/mk6mortar/stringtable.xml new file mode 100644 index 0000000000..0124da4007 --- /dev/null +++ b/addons/mk6mortar/stringtable.xml @@ -0,0 +1,6 @@ + + + + + + From dab4822876a8ef9e96a680447ed057d30fdb663f Mon Sep 17 00:00:00 2001 From: PabstMirror Date: Sun, 5 Apr 2015 02:18:51 -0500 Subject: [PATCH 02/22] Settings / Module --- addons/inventory/config.cpp | 2 +- addons/mk6mortar/CfgVehicles.hpp | 26 +++++++++++++++++++ addons/mk6mortar/XEH_preInit.sqf | 1 + addons/mk6mortar/config.cpp | 19 ++++++++++++++ .../fnc_handlePlayerVehicleChanged.sqf | 9 +++---- addons/mk6mortar/functions/fnc_moduleInit.sqf | 25 ++++++++++++++++++ .../functions/fnc_turretDisplayLoaded.sqf | 5 ++-- addons/mk6mortar/stringtable.xml | 7 +++-- 8 files changed, 82 insertions(+), 12 deletions(-) create mode 100644 addons/mk6mortar/functions/fnc_moduleInit.sqf diff --git a/addons/inventory/config.cpp b/addons/inventory/config.cpp index c7b6649be6..83b4a08126 100644 --- a/addons/inventory/config.cpp +++ b/addons/inventory/config.cpp @@ -15,7 +15,7 @@ class CfgPatches { #include "RscDisplayInventory.hpp" class ACE_Settings { - class GVAR(inventoryDisplaySize) { + class GVAR(useMils) { value = 0; typeName = "SCALAR"; isClientSetable = 1; diff --git a/addons/mk6mortar/CfgVehicles.hpp b/addons/mk6mortar/CfgVehicles.hpp index 8399777054..26552e3234 100644 --- a/addons/mk6mortar/CfgVehicles.hpp +++ b/addons/mk6mortar/CfgVehicles.hpp @@ -18,4 +18,30 @@ class CfgVehicles { }; }; }; + + class Logic; + class Module_F: Logic { + class ModuleDescription {}; + }; + class GVAR(module): Module_F { + author = "$STR_ACE_Common_ACETeam"; + category = "ACE"; + displayName = "MK6 Settings"; + function = QFUNC(moduleInit); + scope = 2; + isGlobal = 0; + // icon = QUOTE(PATHTOF(UI\Icon_.paa)); + functionPriority = 0; + class Arguments { + class noComputer { + displayName = "No Computer"; + description = "Removes Computer and Rangefinder"; + typeName = "BOOL"; + defaultValue = 1; + }; + }; + class ModuleDescription: ModuleDescription { + description = ""; + }; + }; }; diff --git a/addons/mk6mortar/XEH_preInit.sqf b/addons/mk6mortar/XEH_preInit.sqf index ab2d8370d0..d3fcaafa5a 100644 --- a/addons/mk6mortar/XEH_preInit.sqf +++ b/addons/mk6mortar/XEH_preInit.sqf @@ -4,6 +4,7 @@ ADDON = false; PREP(handleFired); PREP(handlePlayerVehicleChanged); +PREP(moduleInit); PREP(turretDisplayLoaded); ADDON = true; diff --git a/addons/mk6mortar/config.cpp b/addons/mk6mortar/config.cpp index f7635d1fb6..9d12dd8bf1 100644 --- a/addons/mk6mortar/config.cpp +++ b/addons/mk6mortar/config.cpp @@ -17,3 +17,22 @@ class CfgPatches { #include "CfgVehicles.hpp" #include "CfgWeapons.hpp" #include "RscInGameUI.hpp" + +class ACE_Settings { + class GVAR(useMils) { + value = 1; + typeName = "BOOL"; + isClientSetable = 1; + displayName = "$STR_ACE_mk6mortar_useMils"; + }; + // class GVAR(airResistance) { + // value = 0; + // typeName = "BOOL"; + // isClientSetable = 0; + // }; + class GVAR(noComputer) { + value = 0; + typeName = "BOOL"; + isClientSetable = 0; + }; +}; diff --git a/addons/mk6mortar/functions/fnc_handlePlayerVehicleChanged.sqf b/addons/mk6mortar/functions/fnc_handlePlayerVehicleChanged.sqf index a25bda21ff..94ba2fda55 100644 --- a/addons/mk6mortar/functions/fnc_handlePlayerVehicleChanged.sqf +++ b/addons/mk6mortar/functions/fnc_handlePlayerVehicleChanged.sqf @@ -27,24 +27,21 @@ if (!(_newVehicle isKindOf "Mortar_01_base_F")) exitWith {}; _display = uiNamespace getVariable ["ACE_Mk6_RscWeaponRangeArtillery", displayNull]; if (isNull _display) exitWith {systemChat "null";}; - _hideRangefinder = false; - _elevDeg = parseNumber ctrlText (_display displayCtrl 175); - if (true) then { + if (GVAR(useMils)) then { (_display displayCtrl 80175) ctrlSetText str round (_elevDeg * 6400 / 360); - hintSilent str (_elevDeg * 6400 / 360); } else { (_display displayCtrl 80175) ctrlSetText str _elevDeg; }; - if (_hideRangefinder) then { + if (GVAR(noComputer)) then { (_display displayCtrl 80176) ctrlSetText ""; } else { _elevDeg = parseNumber ctrlText (_display displayCtrl 176); if (_elevDeg <= 0) then { (_display displayCtrl 80176) ctrlSetText (ctrlText (_display displayCtrl 176)); } else { - if (true) then { + if (GVAR(useMils)) then { (_display displayCtrl 80176) ctrlSetText str round (_elevDeg * 6400 / 360); } else { (_display displayCtrl 80176) ctrlSetText str _elevDeg; diff --git a/addons/mk6mortar/functions/fnc_moduleInit.sqf b/addons/mk6mortar/functions/fnc_moduleInit.sqf new file mode 100644 index 0000000000..22f19da2d0 --- /dev/null +++ b/addons/mk6mortar/functions/fnc_moduleInit.sqf @@ -0,0 +1,25 @@ +/* + * Author: PabstMirror + * + * + * Arguments: + * 0: The Module Logic Object + * 1: synced objects + * 2: Activated + * + * Return Value: + * None + * + * Example: + * + * + * Public: No + */ +#include "script_component.hpp" + +PARAMS_3(_logic,_syncedUnits,_activated); + +if (!_activated) exitWith {WARNING("Module - placed but not active");}; +if (!isServer) exitWith {}; + +[_logic, QGVAR(noComputer), "noComputer"] call EFUNC(common,readSettingFromModule); diff --git a/addons/mk6mortar/functions/fnc_turretDisplayLoaded.sqf b/addons/mk6mortar/functions/fnc_turretDisplayLoaded.sqf index dc3dda4038..345d87c2e9 100644 --- a/addons/mk6mortar/functions/fnc_turretDisplayLoaded.sqf +++ b/addons/mk6mortar/functions/fnc_turretDisplayLoaded.sqf @@ -33,8 +33,6 @@ disableSerialization; _display = uiNamespace getVariable ["ACE_Mk6_RscWeaponRangeArtillery", displayNull]; if (isNull _display) exitWith {}; -_hideRangefinder = true; - _fnc_hideControl = { PARAMS_2(_path,_hideCtrl); _idc = getNumber (_path >> "IDC"); @@ -55,8 +53,9 @@ _fnc_hideControl = { }; { - [_x, _hideRangefinder] call _fnc_hideControl; + [_x, GVAR(noComputer)] call _fnc_hideControl; } forEach [CTRL_CA_HEADING, CTRL_CA_OPTICSPITCH, CTRL_CA_OPTICSZOOM, CTRL_CA_SOLUTION_TEXT, CTRL_CA_DISTANCE_TEXT, CTRL_CA_DISTANCE, CTRL_CA_TIME_TEXT, CTRL_CA_TIME, CTRL_CA_ELEV_NEED_TEXT, CTRL_CA_RANGEELEMENTS_GROUP]; +//Always hide these, handled by the mil convertions in handlePlayerVehChanged [CTRL_CA_ELEV, true] call _fnc_hideControl; [CTRL_CA_ELEV_NEED, true] call _fnc_hideControl; diff --git a/addons/mk6mortar/stringtable.xml b/addons/mk6mortar/stringtable.xml index 0124da4007..d105660bcd 100644 --- a/addons/mk6mortar/stringtable.xml +++ b/addons/mk6mortar/stringtable.xml @@ -1,6 +1,9 @@  - + + + Mk6 Mortar: Show Angle in MILS + - + \ No newline at end of file From 518f2077fe14b3810631537137d4dd2e55a4694f Mon Sep 17 00:00:00 2001 From: PabstMirror Date: Sun, 5 Apr 2015 02:27:13 -0500 Subject: [PATCH 03/22] Disable ArtyComputer --- .../mk6mortar/functions/fnc_handlePlayerVehicleChanged.sqf | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/addons/mk6mortar/functions/fnc_handlePlayerVehicleChanged.sqf b/addons/mk6mortar/functions/fnc_handlePlayerVehicleChanged.sqf index 94ba2fda55..c59a1d66a8 100644 --- a/addons/mk6mortar/functions/fnc_handlePlayerVehicleChanged.sqf +++ b/addons/mk6mortar/functions/fnc_handlePlayerVehicleChanged.sqf @@ -24,6 +24,11 @@ if (!(_newVehicle isKindOf "Mortar_01_base_F")) exitWith {}; if ((vehicle ACE_player) != _veh) then { [_pfID] call CBA_fnc_removePerFrameHandler; } else { + if (shownArtilleryComputer && GVAR(noComputer)) then { + //Don't like this solution + closeDialog 0; + [parseText "Computer Disabled"] call EFUNC(common,displayTextStructured); + }; _display = uiNamespace getVariable ["ACE_Mk6_RscWeaponRangeArtillery", displayNull]; if (isNull _display) exitWith {systemChat "null";}; From 1726b787f79c46931a6d4bd60b947dabb7148d4e Mon Sep 17 00:00:00 2001 From: PabstMirror Date: Sun, 5 Apr 2015 03:02:24 -0500 Subject: [PATCH 04/22] AirRestitance/Wind Effects --- .../mk6mortar/functions/fnc_handleFired.sqf | 34 ++++++++++++++++++- 1 file changed, 33 insertions(+), 1 deletion(-) diff --git a/addons/mk6mortar/functions/fnc_handleFired.sqf b/addons/mk6mortar/functions/fnc_handleFired.sqf index 7f1e00453d..6fd9caa1a5 100644 --- a/addons/mk6mortar/functions/fnc_handleFired.sqf +++ b/addons/mk6mortar/functions/fnc_handleFired.sqf @@ -14,7 +14,7 @@ * Nothing * * Example: - * [clientFiredBIS-XEH] call ace_grenades_fnc_throwGrenade + * [clientFiredBIS-XEH] call ace_ * * Public: No */ @@ -24,6 +24,38 @@ disableSerialization; PARAMS_7(_vehicle,_weapon,_muzzle,_mode,_ammo,_magazine,_projectile); +// if (_bullet isKindOf "BulletBase") then { +[{ + private ["_deltaT", "_bulletVelocity", "_bulletSpeed", "_trueVelocity", "_trueSpeed", "_dragRef", "_accelRef", "_drag", "_accel"]; + PARAMS_2(_args,_pfID); + EXPLODE_3_PVT(_args,_shell,_airFriction,_time); + if (isNull _shell || {!alive _shell}) exitwith { + [_pfID] call cba_fnc_removePerFrameHandler; + }; + _deltaT = time - _time; + _args set[2, time]; + + _bulletVelocity = velocity _shell; + _bulletSpeed = vectorMagnitude _bulletVelocity; + + if (vectorMagnitude ACE_wind > 0) then { + _trueVelocity = _bulletVelocity vectorDiff ACE_wind; + _trueSpeed = vectorMagnitude _trueVelocity; + + // _dragRef = _deltaT * _airFriction * _bulletSpeed * _bulletSpeed; + // _accelRef = (vectorNormalized _bulletVelocity) vectorMultiply (_dragRef); + // _bulletVelocity = _bulletVelocity vectorDiff _accelRef; + + _drag = _deltaT * _airFriction * _trueSpeed; + _accel = _trueVelocity vectorMultiply (_drag); + + _bulletVelocity = _bulletVelocity vectorAdd _accel; + }; + _shell setVelocity _bulletVelocity; + // TODO expand with advanced ballistics functionality. + +}, 0, [_projectile, -0.0001, time]] call CBA_fnc_addPerFrameHandler; +// }; From e71378f9b3be2626bb7ea462340e45a7490c7636 Mon Sep 17 00:00:00 2001 From: PabstMirror Date: Sun, 5 Apr 2015 12:40:48 -0500 Subject: [PATCH 05/22] AirResit Module Setting / Charge Display ctrl --- addons/mk6mortar/CfgVehicles.hpp | 12 ++++++--- addons/mk6mortar/UI/ui_charges.paa | Bin 0 -> 22016 bytes addons/mk6mortar/config.cpp | 12 ++++----- .../mk6mortar/functions/fnc_handleFired.sqf | 6 +++++ .../fnc_handlePlayerVehicleChanged.sqf | 25 ++++++++++++++---- addons/mk6mortar/functions/fnc_moduleInit.sqf | 3 ++- .../functions/fnc_turretDisplayLoaded.sqf | 2 +- 7 files changed, 44 insertions(+), 16 deletions(-) create mode 100644 addons/mk6mortar/UI/ui_charges.paa diff --git a/addons/mk6mortar/CfgVehicles.hpp b/addons/mk6mortar/CfgVehicles.hpp index 26552e3234..0c6b540cdc 100644 --- a/addons/mk6mortar/CfgVehicles.hpp +++ b/addons/mk6mortar/CfgVehicles.hpp @@ -33,9 +33,15 @@ class CfgVehicles { // icon = QUOTE(PATHTOF(UI\Icon_.paa)); functionPriority = 0; class Arguments { - class noComputer { - displayName = "No Computer"; - description = "Removes Computer and Rangefinder"; + class disableComputerRangefinder { + displayName = "Remove MK6 Computer/Rangefinder"; + description = "Removes Computer and Rangefinder (these should be removed if you enable air resistance)"; + typeName = "BOOL"; + defaultValue = 1; + }; + class airResistanceEnabled { + displayName = "Air Resitance"; + description = "For Player Shots, Model Air Restiance and Wind Effects"; typeName = "BOOL"; defaultValue = 1; }; diff --git a/addons/mk6mortar/UI/ui_charges.paa b/addons/mk6mortar/UI/ui_charges.paa new file mode 100644 index 0000000000000000000000000000000000000000..7041c654e0465d059d89ec5854bdd42b1bbf73ce GIT binary patch literal 22016 zcmc(H4OmoV-uFGjAOi!%1d4KVyW9% zXgv<(AGh-j{Dbys`zP|r`tWv4?`iiwCtsBq(G*%Na zL+hjYd{}_m$hJqDwPxnW!{=w(BGA0Em18qAGPk?Ab1HVbi5}6ZYDVpGcw~(CX+IoG z;|YTDJ`>v&Y-Hnjr2f~7<8|Uui{l?q6=8jecqHtKc4>{wl2a<5mkA;&&1X_ao76^* z1IH(!mNDMP0|KOq=TW4M(z-F9iY;?RFWVk1;sAR5t1;w73-ZhK$NoTnMgG4T-Y4q| zslR(V-pBXL>HW{J8RzTwZ_1a>zg|Q1^x?cjj3XsX=SSzI0m&6?VjPFz5jRBbGW{_l zFsDBs|Fu}q&th3FVsxSL21R~R8HfagCHl|VufqG--z5Ff2)svIq_tQY4TX$3)P|5xMb^fwd#1@PN9!F1ky zy`UdeH(e*5tD z@WXpR-$6WBAIX2Tv_4BD-@oQ&Bip#q=i`|8oz4UA7wg&!bwvLdJiw5DSM;lfBG6ya z7t^uLP(7u+*zoHq=X)(I2(Bse|4ryUg?`|dYtlc{#J4NT7rn2V)c>3xCiR^t??SRZ zNVBlr(cd1C5Dof10e#y-!k1dCKD!X~u~@<`hhO<+=aqQ&ZrZ?Xuh*-7eGtTCmjs9H z(8AHtQ6>!j`o^^1YFMp3HDzLA0y;xlg2Q$stD~dS$#GA4g0;1^)xxpIo?t~!8Q0kz zw$-awHz@7l)`EfpCR_xw^y%4f`HN|}xw-7v2l#=PivLIHUu-aIasCs0Jw;eg&iJ@&FG-)`ut!9C&nPzHJecLN zrAu%4WbxzoKmPFNB`Geg*Bci0z1MNxkb_!#^v$EAYW1nHWu7y@b@us7Iy%TvmS*tS zb=Jhh@p0iQFyyb+?oMMYKVKk;J6Rt=^mjVFUfw^$svm3tc>zzoH^6Z11tek!2WVxcuxwunW88 zm^z_LxRjh>J7}=vI-Oy4;D^wiU9T;SVo#Nqm5KHU@?Qvhg4dFz*+`#7vE*bKvT8#y z&d2NJ?bo9B^!9%d{bhQR{=iz?(7$&YgYGm=r~j+7$zE<;8Wh#;c;i8P^Z@kR1Hr+; z_k7s?`k9B`J~NaBddJ7d?;SAt>D1G$hZeSBK*0}-il^2#lobL0jGw>99&dFvH#c)! z3;I<+KMOvSsQ=Tg?`Ex}_a{z@?-TvK5GdY19rSO5zsRuz?~m$qI*w~?;Z`EGf)lKk z#>PgD9cT{?Xiv9>Tbu5^_g>yU4E?ef0?o0$(qnJV&9w+8nYccWeSQiFzy6g_a&w?B z_81C)gL2v@)QKZ3!HV-*xstXZJ_EDOSj!{#!#-?>JzB=;FWHMdu$Sb&mFDsO5?1`V z>6qfXK>zQX>VJ_xVdAFu2Y-@1(g%^V1rtrUc}QRbqW<>ZkeX&DeodS;0C`@q9rS&5 zc1uf3nBarI6-@H-ZrZ+m`_%lrAkWz#XPF>H1kn!AKR-V|m$#=|hq6HaAhaWXV2p4@ zMFsJTfzH5VAIie`Q}_ex8|3dhZ1LG3kIWCmKOlb?Z}-@1ZRlUcajnf^!}t{(_rN}c z;^DXj?^FE3vBQ==#l8@Kp;=zP2k*ljiRAr<%WLg{YqBaMw?Aqqr9d0#i ztE#HHRC=->ySfgNejR-j{*e?f1^Z+&ZBVrEl=YOC6P_E>UfxcwV z`H+Oez}cY>V|~!)55&Tsomjdweyl4j!Ex&I47(<(tt~Ne!1tF{V)zVOYFb2uB42c# z`}S?zDA8MOBzZr58t3iDeAuEc`$*c@m?FQmHeGf{M|?a#zaD!!>~mmyx;1e8TF}Gq zAC&2zZgXVQ`uY2{HdurJ`6v40yuXJ2&>+wj{C$c3Cr)ro^TAz_`HA=|H+O7|w|lVO zrAs?IIVStj*r@Q=qcsWEAl<}7j$OEzj9HQ@SH+f=I-SAa+um`qY9wSR&&&!6%F2RC z-e50Cz9&X9GlLkE??)fBz`knLYP+4&hv=`IHvMgC{3p_rcgCM0b}IiMVz;}A{|oGi zwqfr+ix%_OhyEgn@SxirtUos6wKHjNpE;7}GLSz1@T#QGGobGl;bp$x47Jp4 zdogW~!Loe$`)bzzGUB7hiT)+~_BBBti1A3ZHbuJ+{4VXD&T+c_HoWIGOa1<2%t&E`#8WjMVRY(Ei4Q2Yg5Jx@W`x)(f9O|IR>Svb-cMHa1q)=e-+- zXu0EjKd`Shh+Bk$9q^x=@_rrGcq{tL^j>2P&xZbN;{DUJb=l}F%P*uc+hQq@<&F3U z<178q-qh42>tE_07nc}7|8y(ZMdlZet=1Ok4?66%Q~2kC-9i3hfWMG#J#pehC0`%( zR~n9c{Gz|=i+NQ~s=+PLUt>9@l%euDss5@^G6SD zkYVCD9`+b8mgSvaJj?g_ot-r@kt-V#O&S6 zaZ+W1mAu8<-vj+m?tD+XgyKylzNC235|H2fs{B`r2~jmW{4%)|X802nfWp3f`u&G@ zX!d}AM)&S*UU+h``b(4k%LJ>5!JH=wCufQ}qt?DGB?A5VdK?rFAwK08@wLrD`h1d} z9$SJfB4EE{A1Q&t+X*9FljW1*bANz+t_8Mqb*)Cc#pXNJ&NbE}Sz!pcfeoseCg^u} z*4V^^BG2W}5ApGFeEc3@3Z6KwD^ItMGS;ZzTARh`l=p-AY|gT>GTz=>o?z1j_ zj$1xo^2b5`LOuiGsro;`I)DEB`*=I?JIrGo$GwQ}p+8p$m$8HT{hDy-Q|R+qyq)}I zuXj{l&-N{~_R&$~e<=QE%$QW;&cdIouX~TqY&&s&8ZA*{J8!~ViT#=_c!F&fUm^p)IkQH8UYA{x5($OQ`;)yA#b;7JF4z;Y1LF&_N5_vJm+cw( zj|hh=`1_eP8CL3l$6gR$7)|!T-v;@+)ZcSP^f`BRMMsJD0M~`mGoAi>kbmN1Q4fy8 zkI(o~Ap-jODSHgwhS=D1BVD`6fA`oor-A(Pc~d+?`{QH4U$VU&=nsM3g?M;7(LW+W zvA5*!%%A`E+q|9V9~YRHq()d(q;;ppvv=Ls(+2TgE~xEe;w%ur;-nX z{9DV)8XG_K&nruV3y^MGwj@8lsp%6R`}TQ=R66*fp+U(%P&|Y5p_A{w$F6%QG*m77 zPd)Y)TW+o*p+x_Rip)&jAO3goPGk3C z7vur@#SQ;?8^ycS?maOpIH>V2Pi(uX#PMQU_v}zOyq}yCb_-XwQaqcY4mh8d@Q zV7{$W-_fP4(w5uXIuPr^F2LVx|59=inrEZ;B16PW?_Xc+cO1^I`5 z662=>TVBi}@`w2r?Cc8lbsx#wV*vRB=)cDhnE!b`HYN&^BKwCNKU_SvRT$rm{XGyx z{rUVJ=wp!cG{>ax@xH7N$$n#dvOb5uWDAsk!dR|spOOEtm6nzsME(}}oN$(4-JFKu zox)Wqo=B>EHx2ZW$KSps-R5!~O!?lqsxN;~wXMrxH-h}9E5h;+4AnULSH+rHrEimk z@@2R`2&MSAt)rtujF(f@`-%Q}P|)&yF0fvoEQ>&j!8zqVh2m$wf22#rupSI~_HHx$ z>&W2OeGraibwaxB(A^-vEFZAfw!M2>!}$61Vt>#tD}~E_&In_*hT?(y?z>O6Un2d5 zPFbHOuJ_RS$o#EeuU~_Bf${N@Dr+epC7(Zy9~!EYE%>D!p7NBGl!G(BlkDs6^c`|Q z|AG7g^zWV>NdF(ju8LK>O~yDb{_z<2dpGj!t75;7{=^Tht%^J&|6!YT(~cc{y%PPE z_?GlT7y@YCPWt}f!IBb=6Ohjk zFg3-<%0}q^9+&5$yc*f)=t!4_y=?d;F!?hU#43UU_AfO#f{)Ew<57#h#W`Ua;?LR`#D+sb7EM6~#U#Rrc7+$`ttuEd% zOZU%*M0r>4b4mW`W2j8lJHOTZT6r#1j=? zid@gkiM;)RxTe$p0~HL!0fw0`0Eg1@R4*RwU&k|lKi z&sW%jd_r@xaz9P<7la|%A52=0_z(#a-kVudmDi{T2Nq<*O9^Px%YW2}OUcs~Il0 zcolzlT}_WYw_wEzzJAhQ8>>o7IlcgXp!))jkL~CI{X;{4?0;lLgAk{u`~gn?dMXJL z>5qC7sh+?UUBrywy#V@O1E;2tJ-5I-NRNmkWyng>&Vt^`cpM)Z80!@Ezg?RW3k%8D zOZk|J3MF6A1AW-s+yeSPGEyL1?Mw&#H?8jKI)1S$apLf9AH@SPG0J`^-x+8h*TEi4 zbSVDrI@pWxabJp7YQCOzHTv~&iAuhe-e0j|g&Z#qm-pE5 z$o9X-UTep3$o|ZMEj`GGg+@H}mT(acN%C;{pBIw+gu{PFeE#JNu|-D8rc%CJ_Wv?#U>^hg^B(v^ z@L!wx{f5Urn1<^dr!Yph$aEj!PKiM|6+bWd&)KHk-!$-j~IYYC#{-{F_vp!zGq#V9NHE!uy1f7_vt$=~Mlkv!{kt&07sbRZsf4)S*BLo4#FZ3=eSkk66*KM(u^#?+m> zo%{!BuxdE|x{(~5BYQ&9$g&K3R80oZS< zA64R+Yhn0vEI4>CQgG69_U<#YVL@bn;-6vrh_6>jTWj>dzsB`U2VcLTG6DMEE$ef# ze}VZi*aPg(eS-I={4&ygdX6vH>m+`eq~|dDBb=+^?Kti1f&xMAe{_eKFAB;V!LH#S z-MDL2Ec%xQpF(lTg7Ci76qg}0Gf&c6JMf6-A!ayKHy`(*e(5{_ia#aBKi`LDH8 z{HO5uI^0i+_p^L`sD}y6hv?TkY=eWa_;P!?wXJQ@A_Y6(4=esZ<-eOd0`tX`FPxe$ z0{P{5@zRbusEh7y)y2aj`s9l@WZ2D&^exx_R9{9OfJ9BHzVqv_2K7h5dlml?SPSyY z=k?F<%yWI$#kQCHvIO=cJ{jx3fEgh|NtGpOiHV9mH<15_1hANoT;|k}|KH?R^0}}N z*@68j9&`u9M;_!yn%v3B{QQn?aac!j!N~DlyPzMDFbMffxLg1enN%4aWm>&yQy4QH zz5Vd64=LVdgU64H@h(J!=l>-CiRu;M-+%%5d5QZKgozPNNc~MEGv_4OiVg9IpZR=- z8rXj@ILAF3!mUDnzMTIx)YRHHR#!jA+j}>_oKr1r$#r zym4|&^)@X5uNMNgZyQhg>)bK82lHP7Wbj@{g=xCjOqFQ zrsG!;-$9?q^)pnz3i8Y6@egqW9EQAh+nn~I{#8*X7C9H*U|_x^HHjOws?yA2$WmFJ9VFYr}oI?BCtEtHs`mf`PV+ zf-tY@3pM5Yn9rB5fBlh!E_HbSX50s_M!gZ}E5(Uf_={-m5|;t#E=Sk^)N{slrf@6WH^h1Kx`A=O zaA3=!yTig-Eo~y6t6EnBegOvxk+g)&dy;A%h=n<|gkG!~|7~bUAJvQDI^8>~3;C|! zJNiR#-?wsQj(opE{=7P^Aa^qV6-4!;9^@k>O!7aq{#T(tIXBAp2dZRN{LA*DIdp#z z3H=y<>F~#&GyO#8U zKdU&7#(FM69)rGDuQnkc{XlH7wgUxmQQg*{)xg@6f!T=|FRd;0+YI>Z-4Dc)L4Jz$ zt-S~Hy|&P0IEMf^l$na>0h2rju5VQ==>M1n{#)wy-vljbr2S=OrKD)s;zG)Q(RyMq zzJ@J3Naw@lpRdmh{%s79f5NmMu0M+LzA!N{I-;)HR(bf9Kb=E7oVaLFN6yHVUf+Li z_1D=C-K~p=knf{GU;CiTb)KIf?t^VHgM+d@r~H8q`{V88@13()Iyr{_Wc9|xgmH}f zJXzs`6s2{!Tw<=ChDH8Ltgj$_ z64;+lIWRj)`~0-|y1FjO{Am{b^`=H7D8&3HryqY`TrcuD98age=pW#~LRhG%zc>ye ze>y|rpFy{!0saH(-Crhshy7S`wB0$yF*8bnsNNtVqQ!C#>9>ikiyijpD7Ct|W3t|b z)!E<0eOz3C|DRzKgjQLfQ$BO)(hiH1-(|*a@GqhN3U2ufC|*H$2~7U~(dcSm(w}_4)DGU{`b$)?0-I^ZtYp4$F9w{tdjH`+po4!9P;GGu;0Z9ux#I|E;QDOZkBF zsLv4nN7J1m{qy47ZY{gJ{tYaF@@abT`^)D*-+NJ#DT9oGL8nCcaoJI8_n zjbuXW?0XF4U|n}X5Ta4C;;|PIxh(tOFB#C^1AiXo&JwzB>kbw0k*qyhT>m~M>93uC zszyCLL%@#p{TqF6L-yK&+YLn@i}8$n-$C+$``k!*zthgY=qp&%2eJy_^ycq#ES^8? z-xQ4Xa4h%7__+Q9{c%{-e{wz%|AYQf#DAz~416EQ3wlfTS$SW&?-2V#Qh0v}=UONp^lC!=WElIdG@jO|MLe(5u=*W;O5GVv-%t7Tb8>>1>DXe&OJe?R9QzT^ z2SZXm{{iSfV1rR5eP02Cr59#GAxr}c>X z82B51Zz=f41M)*$pQ|SIt%T+Ir+t4z^dkE6cA6jJ+R3pQ=jk5w2gob#8&OaqtzQlQ zQ|v#)`;-4+8NG6aW3fHJf1&w^Ujo}fK6$?B^e2B%v1XLF{R%dGeLMNXd^UQ2Ixf1# z_$04^@0&!-`JIo)?`IS&>0<>$|AXH+<|7Ki^zlhQ@>X%Z|6j1OKk0n<_l{VXP zEonc+;`sxM{D$v$rqM(0KiPim{i!gR3ICy-i9aVg;5G%g8UGB6W+1ixao#S9smT?6 zqQlJSeHAlbPs=8(k;E3uQZuC;ji^kXinnV{bQmY!CpSZFq;?a3KXf~=)UK=-X${`4 zx}L_Hw*Ifjbj)G6cH!fRZVkqpf*S&H6ug*0SEkJV>9dM(COxM!=}A3V_^t=cKQ^`x{m{2U!OTYg~X<@amF3MK?apr z#_Js$gPHqfwEek7)p*~MpNG_>^iUXp<*pRNy4P$;&&=Bq_GziCgku-fcwicY z(tvdB#M{kqgZSU+&#z*UVPIy7KBU%Zy*W*DM%o=ngCx1r%nVV@f_YaLYif(XK$)1C zjkdO`U-uPue-6)`KHD2@R-cm`D+AoZp{xbX<6iE#cum8`61DS!`kI_Qy%>j*faeW)2`Ge!+E7m+gWWw#DZB zZACA+{|;Nooh=b+s6S~2D)Z6ZarrV&`x72(dh z$^GtkIrbn;vS`tXT;cChnGannoz}kj=8Pks_-0{#1jR7RPS!#;c%%CEBUzxgr65zh z7Wv_J2Ze#|d~chw|040TV~+WLp_W87Li@#6>!ZQv+a33}uTG*eI1A#k+b^y@C0wD; zGBr^Pbb;Ola$1ydgD{xF+o|kxzPs}T$8;VjE0)6|(BFDFIT=SF^G9~8 zf77N5{@%HtKbn6RT_euFc&o3sd^6IFVGH>9R91VTb@l2G{YAg}{6F%3nt*H5I}(l~DIo0#@{rA#a?L>e zvt;-}X=#7eNP%#9cP7e!v%dKBQ}t~UKM2B}De^yn&s^xzNC^4kX;mc3$dP7SpjXOx zsO-GycW<``%x8W1{hea*&Wm_@0=uiac#O&t)y~G%xBsy! z^Q6nspMWys)Bb|TRFQWU_ZyrlO;nL~miMv8!aq9l#Bh75tp{bM@ojBh;R_6=A${r2 zI_-{MaM~X{2IhsnDM>l;c9W6MKa6XkMR&x(wdCiKZY?b|bqQXkHsPNrjZ$*>y;}3< z`ycCnePcg;1{^bQ-aIsk&nhYd#QuN#`?1Mu?IT&6fA-vSd_2-W-jA+a;+XW${P|7K zK%c7%F+vaMjV$blFriAK0ZASsHdlA+K5F&7gG$?>JeT&FXYwg6S^VxzKS$VDq;)tP zPeC4!BF%6k=^G3_A=*25=32UzZwQV#aSmlxkiTAhcE4ajs7|=*)byFu%V@q2R;>6d zU(Y)5e_Kb3tUof5R;aR^6Mcd(FdN&S^)2YjGpR3YC~a%; zMn-mhBJH29DV}|{=o9`vm8o30_$)LZ?T+?~vgfgXm*t)K|ASM1NP1&HxKxFk%5~tk zPoI49$)JR4`fRHIfhaTc;a);|o3UbqJucVJI?0}rzr^(q538u`Bsc+x@n>R!M;|VkN;IrA0(`8S7G%oBGu5J}B*q1F)2b2Nm*Vozx3j`NmFVR0ZSg#Mi zVe7^ZP$nw~XK4TPg1*&mv%;heVE>Uwn;kxLrBfK+DrACw=g(ul$^B9p)25U=kB8)gR$Ha$B@A5)n{67OX$4>34M-ce*4EaB%-lWEx107a(tjTKt^RRj5;UNXV6iL^cBAYCN4~B` zXWd*|izF1CH^a4Fx{d7_f;3B*uC-l5=Sw&y`a2K4`w;yY0P3+0WdQc`wZXdDa<6U)l>P00QyVdSAL=^tF_^qqdf=dnj=)nU2?lP4HW zW$`aI;j@Uz5j^;eiK*4q93S1X##)f;UGy}HBszu5A$RR^XZ`HcFEWEpRWI$|@4)`e z+IjP0B5~dn25YFyIbzgeS$t(s??3*;ncfY13_5*;tbd0$B-rN7U<$uuesJ*+pHII& z!&Wt1JIwL6EeTfen=W)~qVF$>zJvP8J%*Jll+W6wG=t(_lYf@KGFOnUDR#~#4F5Jc z{Oq5LU&S@sP*#z40sL_Tm0b_&Ydt7SW$Fc^Ezo4J7t!m$AA+E^EICRz`?_O0=BI?Y zDhj?e*1O~2?G8&5-aGXUC`Fx z^$cJ*RKoObz_pAzD3tFnsd6Z90;j{Vem%;d^Iuuy1&0X2)sUk*+-bV!KCKA)KR_O|IhLHfV77T1=>yV-i@aW$A1KUMqb^=`Q+sj$j6z1& zwD)-}miwMtR?N%X)yg+yIA0N^%~AIL(7#2eW+jlnI9@P5_N}w$o>h_o)x?(2V#q1lh)xgqte7-p!7ir@Hva{R_&ix&Y=lITM{PYM5;tuT>FT61N zpMsEJHL?~8J5J0Lhj7^77Bn@zC|r@$E>#aalh_=0&xI)8kHML>HdF^V8H+jA9?`#T zqSs?bSd_b>P&~F}>S&suvcsBKny=`dLr}X2dm>jKUpzc9hOZy&X6=H2uW=}h`}xkX z(_HN7>zzjTL;=ShxbX)*ZI1oBfMZX6sgbHZzU>co0p z-`FS4KWo-)={@Z~zGv~;%MOTHLmR%XL;jB*d@XIQb)S2Y!sbG3k$$?!MvT`ru%BKd4>}?)_<4zyA@xfa+VSZd`o(p+{!^ zQ8Xi>T3(rxn@enO#FoiySt282E=-KQnmo1@)p|pDB}MO)T*TX?M)m6l)6}fF<@pzr zeTS+hj?DSk%$8Kd#~r)y^x8{*Upp{dUaiFshl%0yQ&{se=h$N>QTMt^@k31qo z=KK=$LRj~17SSt5tp3$tez*-M#5tCLTSits}M$E_tL| z@bxD9#PeUWWJ&(~w#82jz!UP6*D zI+_bV9YaieK^#$@jLqXhfYM;VP+KT9!ape(0BJNbD;CQMS?%r`HWUBfZlF}4iY=yL zpg<`)ffzU3Hh^gO^lpe9v>#IX_n!gVR(*+&f=ukje8y(|iNxmCzPt7oX=5X2-4=Up zaq;Ej!~S%zaZE(0Dh2*Co)BXD%ekG8t^ecUM|fkm@E4G%C*XQ%&ssh2Qpm?y;Ao?29uR!BKer EA0g|``Tzg` literal 0 HcmV?d00001 diff --git a/addons/mk6mortar/config.cpp b/addons/mk6mortar/config.cpp index 9d12dd8bf1..a902354777 100644 --- a/addons/mk6mortar/config.cpp +++ b/addons/mk6mortar/config.cpp @@ -25,12 +25,12 @@ class ACE_Settings { isClientSetable = 1; displayName = "$STR_ACE_mk6mortar_useMils"; }; - // class GVAR(airResistance) { - // value = 0; - // typeName = "BOOL"; - // isClientSetable = 0; - // }; - class GVAR(noComputer) { + class GVAR(airResistanceEnabled) { + value = 0; + typeName = "BOOL"; + isClientSetable = 0; + }; + class GVAR(disableComputerRangefinder) { value = 0; typeName = "BOOL"; isClientSetable = 0; diff --git a/addons/mk6mortar/functions/fnc_handleFired.sqf b/addons/mk6mortar/functions/fnc_handleFired.sqf index 6fd9caa1a5..41929110d7 100644 --- a/addons/mk6mortar/functions/fnc_handleFired.sqf +++ b/addons/mk6mortar/functions/fnc_handleFired.sqf @@ -24,6 +24,12 @@ disableSerialization; PARAMS_7(_vehicle,_weapon,_muzzle,_mode,_ammo,_magazine,_projectile); +if (!GVAR(airResistanceEnabled)) exitWith {}; + +if (_unit distance ACE_player > 3000) exitWith {false}; // Large enough distance to not simulate any wind deflection. +if (!GVAR(EnableForAI) && !([_unit] call EFUNC(common,isPlayer))) exitWith {false}; + + // if (_bullet isKindOf "BulletBase") then { [{ private ["_deltaT", "_bulletVelocity", "_bulletSpeed", "_trueVelocity", "_trueSpeed", "_dragRef", "_accelRef", "_drag", "_accel"]; diff --git a/addons/mk6mortar/functions/fnc_handlePlayerVehicleChanged.sqf b/addons/mk6mortar/functions/fnc_handlePlayerVehicleChanged.sqf index c59a1d66a8..e573e74f6a 100644 --- a/addons/mk6mortar/functions/fnc_handlePlayerVehicleChanged.sqf +++ b/addons/mk6mortar/functions/fnc_handlePlayerVehicleChanged.sqf @@ -17,15 +17,30 @@ PARAMS_2(_player,_newVehicle); if (isNull _newVehicle) exitWith {}; if (!(_newVehicle isKindOf "Mortar_01_base_F")) exitWith {}; + + +_chargeText = (findDisplay 46) ctrlCreate ["RscStructuredText", 80085]; + +_xPos = (profilenamespace getvariable ["IGUI_GRID_WEAPON_X", ((safezoneX + safezoneW) - (12.4 * (((safezoneW / safezoneH) min 1.2) / 40)) - 0.5 * (((safezoneW / safezoneH) min 1.2) / 40))]); +_yPos = 2.5 * ((((safezoneW / safezoneH) min 1.2) / 1.2) / 25) + (profilenamespace getvariable ["IGUI_GRID_WEAPON_Y", (safezoneY + 0.5 * ((((safezoneW / safezoneH) min 1.2) / 1.2) / 25))]); +_wPos = 10 * (((safezoneW / safezoneH) min 1.2) / 40); +_hPos = 1 * ((((safezoneW / safezoneH) min 1.2) / 1.2) / 25); + +_chargeText ctrlSetPosition [_xPos, _yPos, _wPos, _hPos]; +_chargeText ctrlCommit 0; + [{ PARAMS_2(_args,_pfID); - EXPLODE_1_PVT(_args,_veh); + EXPLODE_2_PVT(_args,_veh,_chargeText); if ((vehicle ACE_player) != _veh) then { [_pfID] call CBA_fnc_removePerFrameHandler; + ctrlDelete _chargeText; } else { - if (shownArtilleryComputer && GVAR(noComputer)) then { - //Don't like this solution + _text = format ["%1: %2 ", "Charge", 1, QUOTE(PATHTOF(UI\ui_charges.paa))]; + _chargeText ctrlSetStructuredText parseText _text; + if (shownArtilleryComputer && GVAR(disableComputerRangefinder)) then { + //Don't like this solution, but it works closeDialog 0; [parseText "Computer Disabled"] call EFUNC(common,displayTextStructured); }; @@ -39,7 +54,7 @@ if (!(_newVehicle isKindOf "Mortar_01_base_F")) exitWith {}; (_display displayCtrl 80175) ctrlSetText str _elevDeg; }; - if (GVAR(noComputer)) then { + if (GVAR(disableComputerRangefinder)) then { (_display displayCtrl 80176) ctrlSetText ""; } else { _elevDeg = parseNumber ctrlText (_display displayCtrl 176); @@ -54,4 +69,4 @@ if (!(_newVehicle isKindOf "Mortar_01_base_F")) exitWith {}; }; }; }; -}, 0, [_newVehicle]] call CBA_fnc_addPerFrameHandler; \ No newline at end of file +}, 0, [_newVehicle, _chargeText]] call CBA_fnc_addPerFrameHandler; \ No newline at end of file diff --git a/addons/mk6mortar/functions/fnc_moduleInit.sqf b/addons/mk6mortar/functions/fnc_moduleInit.sqf index 22f19da2d0..81cf39a243 100644 --- a/addons/mk6mortar/functions/fnc_moduleInit.sqf +++ b/addons/mk6mortar/functions/fnc_moduleInit.sqf @@ -22,4 +22,5 @@ PARAMS_3(_logic,_syncedUnits,_activated); if (!_activated) exitWith {WARNING("Module - placed but not active");}; if (!isServer) exitWith {}; -[_logic, QGVAR(noComputer), "noComputer"] call EFUNC(common,readSettingFromModule); +[_logic, QGVAR(disableComputerRangefinder), "disableComputerRangefinder"] call EFUNC(common,readSettingFromModule); +[_logic, QGVAR(airResistanceEnabled), "airResistanceEnabled"] call EFUNC(common,readSettingFromModule); diff --git a/addons/mk6mortar/functions/fnc_turretDisplayLoaded.sqf b/addons/mk6mortar/functions/fnc_turretDisplayLoaded.sqf index 345d87c2e9..f47478133a 100644 --- a/addons/mk6mortar/functions/fnc_turretDisplayLoaded.sqf +++ b/addons/mk6mortar/functions/fnc_turretDisplayLoaded.sqf @@ -53,7 +53,7 @@ _fnc_hideControl = { }; { - [_x, GVAR(noComputer)] call _fnc_hideControl; + [_x, GVAR(disableComputerRangefinder)] call _fnc_hideControl; } forEach [CTRL_CA_HEADING, CTRL_CA_OPTICSPITCH, CTRL_CA_OPTICSZOOM, CTRL_CA_SOLUTION_TEXT, CTRL_CA_DISTANCE_TEXT, CTRL_CA_DISTANCE, CTRL_CA_TIME_TEXT, CTRL_CA_TIME, CTRL_CA_ELEV_NEED_TEXT, CTRL_CA_RANGEELEMENTS_GROUP]; //Always hide these, handled by the mil convertions in handlePlayerVehChanged From 0281897a3db12aa8867ef2ace37da767c13677c5 Mon Sep 17 00:00:00 2001 From: PabstMirror Date: Sun, 5 Apr 2015 14:34:39 -0500 Subject: [PATCH 06/22] Show Charge - Cleanup Settings --- addons/mk6mortar/CfgVehicles.hpp | 18 ++++++---- addons/mk6mortar/RscInGameUI.hpp | 24 ++++++++++--- addons/mk6mortar/config.cpp | 11 ++++-- .../fnc_handlePlayerVehicleChanged.sqf | 35 +++++++++++++++---- addons/mk6mortar/functions/fnc_moduleInit.sqf | 3 +- .../functions/fnc_turretDisplayLoaded.sqf | 9 +++-- 6 files changed, 77 insertions(+), 23 deletions(-) diff --git a/addons/mk6mortar/CfgVehicles.hpp b/addons/mk6mortar/CfgVehicles.hpp index 0c6b540cdc..9cfb17d364 100644 --- a/addons/mk6mortar/CfgVehicles.hpp +++ b/addons/mk6mortar/CfgVehicles.hpp @@ -33,18 +33,24 @@ class CfgVehicles { // icon = QUOTE(PATHTOF(UI\Icon_.paa)); functionPriority = 0; class Arguments { - class disableComputerRangefinder { - displayName = "Remove MK6 Computer/Rangefinder"; - description = "Removes Computer and Rangefinder (these should be removed if you enable air resistance)"; - typeName = "BOOL"; - defaultValue = 1; - }; class airResistanceEnabled { displayName = "Air Resitance"; description = "For Player Shots, Model Air Restiance and Wind Effects"; typeName = "BOOL"; defaultValue = 1; }; + class allowComputerRangefinder { + displayName = "Allow MK6 Computer/Rangefinder"; + description = "Show the Computer and Rangefinder (these should be removed if you enable air resistance)"; + typeName = "BOOL"; + defaultValue = 0; + }; + class allowCompass { + displayName = "Allow MK6 Compass"; + description = "Show the MK6 Digital Compass"; + typeName = "BOOL"; + defaultValue = 1; + }; }; class ModuleDescription: ModuleDescription { description = ""; diff --git a/addons/mk6mortar/RscInGameUI.hpp b/addons/mk6mortar/RscInGameUI.hpp index 4082977a5c..8de754bedd 100644 --- a/addons/mk6mortar/RscInGameUI.hpp +++ b/addons/mk6mortar/RscInGameUI.hpp @@ -11,6 +11,20 @@ class RscInGameUI { class ACE_MILS_GROUP: CA_IGUI_elements_group { idc = 80170; class controls { + class CA_Heading_MILS: RscText + { + idc = 80156; + style = 0; + colorText[] = {0.706,0.0745,0.0196,1}; + sizeEx = "0.028*SafezoneH"; + shadow = 0; + font = "EtelkaMonospacePro"; + text = "015"; + x = "25.3 * (0.01875 * SafezoneH)"; + y = "6.3 * (0.025 * SafezoneH)"; + w = "2.2 * (0.01875 * SafezoneH)"; + h = "1 * (0.025 * SafezoneH)"; + }; class CA_Elev_MILS: RscText { idc = 80175; style = 1; @@ -19,14 +33,14 @@ class RscInGameUI { shadow = 0; font = "EtelkaMonospacePro"; text = "80.5"; - x = "36.8 * (0.01875 * SafezoneH)"; - y = "29.3 * (0.025 * SafezoneH)"; - w = "5.2 * (0.01875 * SafezoneH)"; - h = "1.2 * (0.025 * SafezoneH)"; + x = "36.8 * (0.01875 * SafezoneH)"; + y = "29.3 * (0.025 * SafezoneH)"; + w = "5.2 * (0.01875 * SafezoneH)"; + h = "1.2 * (0.025 * SafezoneH)"; }; class CA_Elev_Need_MILS: CA_Elev_MILS { idc = 80176; - y = "30.8 * (0.025 * SafezoneH)"; + y = "30.8 * (0.025 * SafezoneH)"; }; }; }; diff --git a/addons/mk6mortar/config.cpp b/addons/mk6mortar/config.cpp index a902354777..e21fb1e6f9 100644 --- a/addons/mk6mortar/config.cpp +++ b/addons/mk6mortar/config.cpp @@ -25,13 +25,20 @@ class ACE_Settings { isClientSetable = 1; displayName = "$STR_ACE_mk6mortar_useMils"; }; + + //These settings effect gameplay difficutly: defaults will leave the mortar the same as vanilla class GVAR(airResistanceEnabled) { value = 0; typeName = "BOOL"; isClientSetable = 0; }; - class GVAR(disableComputerRangefinder) { - value = 0; + class GVAR(allowComputerRangefinder) { + value = 1; + typeName = "BOOL"; + isClientSetable = 0; + }; + class GVAR(allowCompass) { + value = 1; typeName = "BOOL"; isClientSetable = 0; }; diff --git a/addons/mk6mortar/functions/fnc_handlePlayerVehicleChanged.sqf b/addons/mk6mortar/functions/fnc_handlePlayerVehicleChanged.sqf index e573e74f6a..73f487fa62 100644 --- a/addons/mk6mortar/functions/fnc_handlePlayerVehicleChanged.sqf +++ b/addons/mk6mortar/functions/fnc_handlePlayerVehicleChanged.sqf @@ -29,24 +29,34 @@ _hPos = 1 * ((((safezoneW / safezoneH) min 1.2) / 1.2) / 25); _chargeText ctrlSetPosition [_xPos, _yPos, _wPos, _hPos]; _chargeText ctrlCommit 0; +_tubeWeaponName = (weapons _newVehicle) select 0; +_fireModes = getArray (configFile >> "CfgWeapons" >> _tubeWeaponName >> "modes"); + [{ PARAMS_2(_args,_pfID); - EXPLODE_2_PVT(_args,_veh,_chargeText); + EXPLODE_3_PVT(_args,_mortarVeh,_chargeText,_fireModes); - if ((vehicle ACE_player) != _veh) then { + if ((vehicle ACE_player) != _mortarVeh) then { [_pfID] call CBA_fnc_removePerFrameHandler; ctrlDelete _chargeText; } else { - _text = format ["%1: %2 ", "Charge", 1, QUOTE(PATHTOF(UI\ui_charges.paa))]; + + //Compute: 'charge' from weaponstate + _currentFireMode = (weaponState [_mortarVeh, [0]]) select 2; + _currentChargeMode = _fireModes find _currentFireMode; + + _text = format ["%1: %2 ", "Charge", _currentChargeMode, QUOTE(PATHTOF(UI\ui_charges.paa))]; _chargeText ctrlSetStructuredText parseText _text; - if (shownArtilleryComputer && GVAR(disableComputerRangefinder)) then { + if (shownArtilleryComputer && {!GVAR(allowComputerRangefinder)}) then { //Don't like this solution, but it works closeDialog 0; [parseText "Computer Disabled"] call EFUNC(common,displayTextStructured); }; + _display = uiNamespace getVariable ["ACE_Mk6_RscWeaponRangeArtillery", displayNull]; if (isNull _display) exitWith {systemChat "null";}; + //Update CurrentElevation Display: _elevDeg = parseNumber ctrlText (_display displayCtrl 175); if (GVAR(useMils)) then { (_display displayCtrl 80175) ctrlSetText str round (_elevDeg * 6400 / 360); @@ -54,7 +64,8 @@ _chargeText ctrlCommit 0; (_display displayCtrl 80175) ctrlSetText str _elevDeg; }; - if (GVAR(disableComputerRangefinder)) then { + //Update ElevationNeeded Display: + if (!GVAR(allowComputerRangefinder)) then { (_display displayCtrl 80176) ctrlSetText ""; } else { _elevDeg = parseNumber ctrlText (_display displayCtrl 176); @@ -68,5 +79,17 @@ _chargeText ctrlCommit 0; }; }; }; + + //Update Heading Display: + if (!GVAR(allowCompass)) then { + (_display displayCtrl 80156) ctrlSetText ""; + } else { + _elevDeg = parseNumber ctrlText (_display displayCtrl 156); + if (GVAR(useMils)) then { + (_display displayCtrl 80156) ctrlSetText str round (_elevDeg * 6400 / 360); + } else { + (_display displayCtrl 80156) ctrlSetText str _elevDeg; + }; + }; }; -}, 0, [_newVehicle, _chargeText]] call CBA_fnc_addPerFrameHandler; \ No newline at end of file +}, 0, [_newVehicle, _chargeText,_fireModes]] call CBA_fnc_addPerFrameHandler; \ No newline at end of file diff --git a/addons/mk6mortar/functions/fnc_moduleInit.sqf b/addons/mk6mortar/functions/fnc_moduleInit.sqf index 81cf39a243..e760e443a2 100644 --- a/addons/mk6mortar/functions/fnc_moduleInit.sqf +++ b/addons/mk6mortar/functions/fnc_moduleInit.sqf @@ -22,5 +22,6 @@ PARAMS_3(_logic,_syncedUnits,_activated); if (!_activated) exitWith {WARNING("Module - placed but not active");}; if (!isServer) exitWith {}; -[_logic, QGVAR(disableComputerRangefinder), "disableComputerRangefinder"] call EFUNC(common,readSettingFromModule); [_logic, QGVAR(airResistanceEnabled), "airResistanceEnabled"] call EFUNC(common,readSettingFromModule); +[_logic, QGVAR(allowComputerRangefinder), "allowComputerRangefinder"] call EFUNC(common,readSettingFromModule); +[_logic, QGVAR(allowCompass), "allowCompass"] call EFUNC(common,readSettingFromModule); diff --git a/addons/mk6mortar/functions/fnc_turretDisplayLoaded.sqf b/addons/mk6mortar/functions/fnc_turretDisplayLoaded.sqf index f47478133a..6a316743f1 100644 --- a/addons/mk6mortar/functions/fnc_turretDisplayLoaded.sqf +++ b/addons/mk6mortar/functions/fnc_turretDisplayLoaded.sqf @@ -12,7 +12,7 @@ */ #include "script_component.hpp" -#define CTRL_CA_HEADING (configFile >> "RscInGameUI" >> "ACE_Mk6_RscWeaponRangeArtillery" >> "CA_IGUI_elements_group" >> "controls" >> "CA_Heading") + #define CTRL_CA_OPTICSPITCH (configFile >> "RscInGameUI" >> "ACE_Mk6_RscWeaponRangeArtillery" >> "CA_IGUI_elements_group" >> "controls" >> "CA_OPTICSPITCH") #define CTRL_CA_OPTICSZOOM (configFile >> "RscInGameUI" >> "ACE_Mk6_RscWeaponRangeArtillery" >> "CA_IGUI_elements_group" >> "controls" >> "CA_OPTICSZOOM") #define CTRL_CA_SOLUTION_TEXT (configFile >> "RscInGameUI" >> "ACE_Mk6_RscWeaponRangeArtillery" >> "CA_IGUI_elements_group" >> "controls" >> "CA_SOLUTION_TEXT") @@ -23,6 +23,7 @@ #define CTRL_CA_ELEV_NEED_TEXT (configFile >> "RscInGameUI" >> "ACE_Mk6_RscWeaponRangeArtillery" >> "CA_IGUI_elements_group" >> "controls" >> "CA_ELEV_NEED_TEXT") #define CTRL_CA_RANGEELEMENTS_GROUP (configFile >> "RscInGameUI" >> "ACE_Mk6_RscWeaponRangeArtillery" >> "CA_RangeElements_group") +#define CTRL_CA_HEADING (configFile >> "RscInGameUI" >> "ACE_Mk6_RscWeaponRangeArtillery" >> "CA_IGUI_elements_group" >> "controls" >> "CA_Heading") #define CTRL_CA_ELEV (configFile >> "RscInGameUI" >> "ACE_Mk6_RscWeaponRangeArtillery" >> "CA_IGUI_elements_group" >> "controls" >> "CA_ELEV") #define CTRL_CA_ELEV_NEED (configFile >> "RscInGameUI" >> "ACE_Mk6_RscWeaponRangeArtillery" >> "CA_IGUI_elements_group" >> "controls" >> "CA_ELEV_NEED") @@ -54,8 +55,10 @@ _fnc_hideControl = { { [_x, GVAR(disableComputerRangefinder)] call _fnc_hideControl; -} forEach [CTRL_CA_HEADING, CTRL_CA_OPTICSPITCH, CTRL_CA_OPTICSZOOM, CTRL_CA_SOLUTION_TEXT, CTRL_CA_DISTANCE_TEXT, CTRL_CA_DISTANCE, CTRL_CA_TIME_TEXT, CTRL_CA_TIME, CTRL_CA_ELEV_NEED_TEXT, CTRL_CA_RANGEELEMENTS_GROUP]; +} forEach [CTRL_CA_OPTICSPITCH, CTRL_CA_OPTICSZOOM, CTRL_CA_SOLUTION_TEXT, CTRL_CA_DISTANCE_TEXT, CTRL_CA_DISTANCE, CTRL_CA_TIME_TEXT, CTRL_CA_TIME, CTRL_CA_ELEV_NEED_TEXT, CTRL_CA_RANGEELEMENTS_GROUP]; -//Always hide these, handled by the mil convertions in handlePlayerVehChanged +//Always hide these, handled by the mil convertions PFEH in handlePlayerVehChanged +[CTRL_CA_HEADING, true] call _fnc_hideControl; [CTRL_CA_ELEV, true] call _fnc_hideControl; [CTRL_CA_ELEV_NEED, true] call _fnc_hideControl; + From 34a86e0db3d688f0f3b3cc235a9b89f78710e2e5 Mon Sep 17 00:00:00 2001 From: PabstMirror Date: Sun, 5 Apr 2015 14:48:26 -0500 Subject: [PATCH 07/22] Fix Heading Mils --- addons/mk6mortar/CfgVehicles.hpp | 2 +- addons/mk6mortar/RscInGameUI.hpp | 9 ++++----- .../functions/fnc_handlePlayerVehicleChanged.sqf | 6 +++--- addons/mk6mortar/functions/fnc_turretDisplayLoaded.sqf | 2 +- 4 files changed, 9 insertions(+), 10 deletions(-) diff --git a/addons/mk6mortar/CfgVehicles.hpp b/addons/mk6mortar/CfgVehicles.hpp index 9cfb17d364..233a8be205 100644 --- a/addons/mk6mortar/CfgVehicles.hpp +++ b/addons/mk6mortar/CfgVehicles.hpp @@ -40,7 +40,7 @@ class CfgVehicles { defaultValue = 1; }; class allowComputerRangefinder { - displayName = "Allow MK6 Computer/Rangefinder"; + displayName = "Allow MK6 Computer"; description = "Show the Computer and Rangefinder (these should be removed if you enable air resistance)"; typeName = "BOOL"; defaultValue = 0; diff --git a/addons/mk6mortar/RscInGameUI.hpp b/addons/mk6mortar/RscInGameUI.hpp index 8de754bedd..3a3256e936 100644 --- a/addons/mk6mortar/RscInGameUI.hpp +++ b/addons/mk6mortar/RscInGameUI.hpp @@ -11,18 +11,17 @@ class RscInGameUI { class ACE_MILS_GROUP: CA_IGUI_elements_group { idc = 80170; class controls { - class CA_Heading_MILS: RscText - { + class CA_Heading_MILS: RscText { idc = 80156; - style = 0; + style = 2; colorText[] = {0.706,0.0745,0.0196,1}; sizeEx = "0.028*SafezoneH"; shadow = 0; font = "EtelkaMonospacePro"; text = "015"; - x = "25.3 * (0.01875 * SafezoneH)"; + x = "25.0 * (0.01875 * SafezoneH)"; y = "6.3 * (0.025 * SafezoneH)"; - w = "2.2 * (0.01875 * SafezoneH)"; + w = "3.3333 * (0.01875 * SafezoneH)"; h = "1 * (0.025 * SafezoneH)"; }; class CA_Elev_MILS: RscText { diff --git a/addons/mk6mortar/functions/fnc_handlePlayerVehicleChanged.sqf b/addons/mk6mortar/functions/fnc_handlePlayerVehicleChanged.sqf index 73f487fa62..f8a986cb25 100644 --- a/addons/mk6mortar/functions/fnc_handlePlayerVehicleChanged.sqf +++ b/addons/mk6mortar/functions/fnc_handlePlayerVehicleChanged.sqf @@ -84,11 +84,11 @@ _fireModes = getArray (configFile >> "CfgWeapons" >> _tubeWeaponName >> "modes") if (!GVAR(allowCompass)) then { (_display displayCtrl 80156) ctrlSetText ""; } else { - _elevDeg = parseNumber ctrlText (_display displayCtrl 156); + _rotationDegrees = ((getDir _mortarVeh) + (((-180 / PI) * (_mortarVeh animationPhase "mainTurret")) + 360)) % 360; if (GVAR(useMils)) then { - (_display displayCtrl 80156) ctrlSetText str round (_elevDeg * 6400 / 360); + (_display displayCtrl 80156) ctrlSetText str round (_rotationDegrees * 6400 / 360); } else { - (_display displayCtrl 80156) ctrlSetText str _elevDeg; + (_display displayCtrl 80156) ctrlSetText str _rotationDegrees; }; }; }; diff --git a/addons/mk6mortar/functions/fnc_turretDisplayLoaded.sqf b/addons/mk6mortar/functions/fnc_turretDisplayLoaded.sqf index 6a316743f1..860dea069a 100644 --- a/addons/mk6mortar/functions/fnc_turretDisplayLoaded.sqf +++ b/addons/mk6mortar/functions/fnc_turretDisplayLoaded.sqf @@ -54,7 +54,7 @@ _fnc_hideControl = { }; { - [_x, GVAR(disableComputerRangefinder)] call _fnc_hideControl; + [_x, (!GVAR(allowComputerRangefinder))] call _fnc_hideControl; } forEach [CTRL_CA_OPTICSPITCH, CTRL_CA_OPTICSZOOM, CTRL_CA_SOLUTION_TEXT, CTRL_CA_DISTANCE_TEXT, CTRL_CA_DISTANCE, CTRL_CA_TIME_TEXT, CTRL_CA_TIME, CTRL_CA_ELEV_NEED_TEXT, CTRL_CA_RANGEELEMENTS_GROUP]; //Always hide these, handled by the mil convertions PFEH in handlePlayerVehChanged From 3d9da5f142414f892607af1905bf4f78b6b32639 Mon Sep 17 00:00:00 2001 From: PabstMirror Date: Sun, 5 Apr 2015 15:00:59 -0500 Subject: [PATCH 08/22] Make Mils Toogle Self Action --- addons/mk6mortar/CfgVehicles.hpp | 10 +++++++++- addons/mk6mortar/XEH_preInit.sqf | 1 + addons/mk6mortar/config.cpp | 7 ------- .../fnc_handlePlayerVehicleChanged.sqf | 10 ++++++---- addons/mk6mortar/functions/fnc_toggleMils.sqf | 20 +++++++++++++++++++ 5 files changed, 36 insertions(+), 12 deletions(-) create mode 100644 addons/mk6mortar/functions/fnc_toggleMils.sqf diff --git a/addons/mk6mortar/CfgVehicles.hpp b/addons/mk6mortar/CfgVehicles.hpp index 233a8be205..ad7bf797f9 100644 --- a/addons/mk6mortar/CfgVehicles.hpp +++ b/addons/mk6mortar/CfgVehicles.hpp @@ -17,6 +17,14 @@ class CfgVehicles { turretInfoType = "ACE_Mk6_RscWeaponRangeArtillery"; }; }; + class ACE_SelfActions { + class GVAR(toggleMils) { + displayName = "Toggle MILS"; + condition = QUOTE(true); + statement = QUOTE(_this call FUNC(toggleMils)); + exceptions[] = {}; + }; + }; }; class Logic; @@ -44,7 +52,7 @@ class CfgVehicles { description = "Show the Computer and Rangefinder (these should be removed if you enable air resistance)"; typeName = "BOOL"; defaultValue = 0; - }; + }; class allowCompass { displayName = "Allow MK6 Compass"; description = "Show the MK6 Digital Compass"; diff --git a/addons/mk6mortar/XEH_preInit.sqf b/addons/mk6mortar/XEH_preInit.sqf index d3fcaafa5a..45a72e1528 100644 --- a/addons/mk6mortar/XEH_preInit.sqf +++ b/addons/mk6mortar/XEH_preInit.sqf @@ -5,6 +5,7 @@ ADDON = false; PREP(handleFired); PREP(handlePlayerVehicleChanged); PREP(moduleInit); +PREP(toggleMils); PREP(turretDisplayLoaded); ADDON = true; diff --git a/addons/mk6mortar/config.cpp b/addons/mk6mortar/config.cpp index e21fb1e6f9..cd849c9efd 100644 --- a/addons/mk6mortar/config.cpp +++ b/addons/mk6mortar/config.cpp @@ -19,13 +19,6 @@ class CfgPatches { #include "RscInGameUI.hpp" class ACE_Settings { - class GVAR(useMils) { - value = 1; - typeName = "BOOL"; - isClientSetable = 1; - displayName = "$STR_ACE_mk6mortar_useMils"; - }; - //These settings effect gameplay difficutly: defaults will leave the mortar the same as vanilla class GVAR(airResistanceEnabled) { value = 0; diff --git a/addons/mk6mortar/functions/fnc_handlePlayerVehicleChanged.sqf b/addons/mk6mortar/functions/fnc_handlePlayerVehicleChanged.sqf index f8a986cb25..6faeeaf415 100644 --- a/addons/mk6mortar/functions/fnc_handlePlayerVehicleChanged.sqf +++ b/addons/mk6mortar/functions/fnc_handlePlayerVehicleChanged.sqf @@ -41,6 +41,8 @@ _fireModes = getArray (configFile >> "CfgWeapons" >> _tubeWeaponName >> "modes") ctrlDelete _chargeText; } else { + _useMils = _mortarVeh getVariable [QGVAR(useMils), true]; + //Compute: 'charge' from weaponstate _currentFireMode = (weaponState [_mortarVeh, [0]]) select 2; _currentChargeMode = _fireModes find _currentFireMode; @@ -58,7 +60,7 @@ _fireModes = getArray (configFile >> "CfgWeapons" >> _tubeWeaponName >> "modes") //Update CurrentElevation Display: _elevDeg = parseNumber ctrlText (_display displayCtrl 175); - if (GVAR(useMils)) then { + if (_useMils) then { (_display displayCtrl 80175) ctrlSetText str round (_elevDeg * 6400 / 360); } else { (_display displayCtrl 80175) ctrlSetText str _elevDeg; @@ -72,7 +74,7 @@ _fireModes = getArray (configFile >> "CfgWeapons" >> _tubeWeaponName >> "modes") if (_elevDeg <= 0) then { (_display displayCtrl 80176) ctrlSetText (ctrlText (_display displayCtrl 176)); } else { - if (GVAR(useMils)) then { + if (_useMils) then { (_display displayCtrl 80176) ctrlSetText str round (_elevDeg * 6400 / 360); } else { (_display displayCtrl 80176) ctrlSetText str _elevDeg; @@ -85,10 +87,10 @@ _fireModes = getArray (configFile >> "CfgWeapons" >> _tubeWeaponName >> "modes") (_display displayCtrl 80156) ctrlSetText ""; } else { _rotationDegrees = ((getDir _mortarVeh) + (((-180 / PI) * (_mortarVeh animationPhase "mainTurret")) + 360)) % 360; - if (GVAR(useMils)) then { + if (_useMils) then { (_display displayCtrl 80156) ctrlSetText str round (_rotationDegrees * 6400 / 360); } else { - (_display displayCtrl 80156) ctrlSetText str _rotationDegrees; + (_display displayCtrl 80156) ctrlSetText (ctrlText (_display displayCtrl 156)); }; }; }; diff --git a/addons/mk6mortar/functions/fnc_toggleMils.sqf b/addons/mk6mortar/functions/fnc_toggleMils.sqf new file mode 100644 index 0000000000..98714836fc --- /dev/null +++ b/addons/mk6mortar/functions/fnc_toggleMils.sqf @@ -0,0 +1,20 @@ +/* + * Author: PabstMirror + * + * + * Arguments: + * + * Return Value: + * + * Example: + * + * Public: No + */ +#include "script_component.hpp" + +PARAMS_2(_mortarVeh,_unit); + +private "_currentSetting"; + +_currentSetting = _mortarVeh getVariable [QGVAR(useMils), true]; +_mortarVeh setVariable [QGVAR(useMils), (!_currentSetting)]; From 61a0ae1aec783270b39d5d0acd22028a107de925 Mon Sep 17 00:00:00 2001 From: PabstMirror Date: Sun, 5 Apr 2015 15:48:56 -0500 Subject: [PATCH 09/22] Rangetable Dialog --- addons/mk6mortar/CfgVehicles.hpp | 15 + addons/mk6mortar/RscInGameUI.hpp | 3 - addons/mk6mortar/RscRangeTable.hpp | 87 ++++++ addons/mk6mortar/UI/RangeTable_background.paa | Bin 0 -> 289652 bytes addons/mk6mortar/UI/icon_rangeTable.paa | Bin 0 -> 25789 bytes addons/mk6mortar/XEH_preInit.sqf | 3 + addons/mk6mortar/config.cpp | 11 + .../functions/fnc_rangeTableOpen.sqf | 42 +++ .../functions/fnc_rangeTablePageChange.sqf | 30 ++ .../fnc_rangeTablePreCalculatedValues.sqf | 285 ++++++++++++++++++ addons/mk6mortar/script_component.hpp | 4 +- 11 files changed, 476 insertions(+), 4 deletions(-) create mode 100644 addons/mk6mortar/RscRangeTable.hpp create mode 100644 addons/mk6mortar/UI/RangeTable_background.paa create mode 100644 addons/mk6mortar/UI/icon_rangeTable.paa create mode 100644 addons/mk6mortar/functions/fnc_rangeTableOpen.sqf create mode 100644 addons/mk6mortar/functions/fnc_rangeTablePageChange.sqf create mode 100644 addons/mk6mortar/functions/fnc_rangeTablePreCalculatedValues.sqf diff --git a/addons/mk6mortar/CfgVehicles.hpp b/addons/mk6mortar/CfgVehicles.hpp index ad7bf797f9..7c39aeafdd 100644 --- a/addons/mk6mortar/CfgVehicles.hpp +++ b/addons/mk6mortar/CfgVehicles.hpp @@ -1,4 +1,19 @@ class CfgVehicles { + class Man; + class CAManBase: Man { + class ACE_SelfActions { + class ACE_Equipment { + class GVAR(rangetable) { + displayName = "Open 82mm Rangetable"; + condition = QUOTE(true); + statement = QUOTE(call FUNC(rangeTableOpen)); + priority = 0; + icon = QUOTE(PATHTOF(UI\icon_rangeTable.paa)); + }; + }; + }; + }; + class LandVehicle; class StaticWeapon: LandVehicle { class Turrets { diff --git a/addons/mk6mortar/RscInGameUI.hpp b/addons/mk6mortar/RscInGameUI.hpp index 3a3256e936..102362216a 100644 --- a/addons/mk6mortar/RscInGameUI.hpp +++ b/addons/mk6mortar/RscInGameUI.hpp @@ -1,6 +1,3 @@ -class RscControlsGroup; -class RscText; - class RscInGameUI { class RscWeaponRangeArtillery { class CA_IGUI_elements_group: RscControlsGroup {}; diff --git a/addons/mk6mortar/RscRangeTable.hpp b/addons/mk6mortar/RscRangeTable.hpp new file mode 100644 index 0000000000..65598fd36d --- /dev/null +++ b/addons/mk6mortar/RscRangeTable.hpp @@ -0,0 +1,87 @@ +class ACE_82mm_RangeTable_Dialog +{ + idd = -1; + movingEnable = 1; + onLoad = "uiNamespace setVariable ['ACE_82mm_RangeTable_Dialog', _this select 0];"; + objects[] = {}; + + class ControlsBackground { + class TableBackground: RscPicture { + idc = -1; + text = QUOTE(PATHTOF(UI\RangeTable_background.paa)); + x = "18 *(safeZoneH / 40) + (safezoneX + (safezoneW - safeZoneH)/2)"; + y = "1 * ((safeZoneH / 1.2) / 25) + (safezoneY + (safezoneH - (safeZoneH / 1.2))/2)"; + w = "16.2634559672906 * (safeZoneH / 40)"; + h = "23 * ((safeZoneH / 1.2) / 25)"; + colorBackground[] = {1,1,1,1}; + }; + class ChargeBackground: RscText { + idc = -1; + x = "13 *(safeZoneH / 40) + (safezoneX + (safezoneW - safeZoneH)/2)"; + y = "1 * ((safeZoneH / 1.2) / 25) + (safezoneY + (safezoneH - (safeZoneH / 1.2))/2)"; + w = "5 * (safeZoneH / 40)"; + h = "5 * ((safeZoneH / 1.2) / 25)"; + colorBackground[] = {0,0,0,1}; + }; + }; + class controls { + class TheTable : RscListNBox { + idc = 20001; + // style = ST_CENTER + ST_MULTI + LB_TEXTURES; + // style = ST_LEFT + ST_MULTI + LB_TEXTURES; + // style = LB_MULTI + ST_LEFT; // Style + x = "18 *(safeZoneH / 40) + (safezoneX + (safezoneW - safeZoneH)/2)"; + y = "3.76 * ((safeZoneH / 1.2) / 25) + (safezoneY + (safezoneH - (safeZoneH / 1.2))/2)"; + w = "16.2634559672906 * (safeZoneH / 40)"; + h = "20.24 * ((safeZoneH / 1.2) / 25)"; + columns[] = {(10/792),(86/792),(172/792),(238/792),(329/792),(405/792),(462/792),(527/792),(588/792),(649/792),(710/792)}; + rowHeight = 0.015 * safeZoneH; + sizeEx = "0.014 * safeZoneH"; + font = "EtelkaMonospacePro"; + drawSideArrows = 1; + idcLeft = 14124; + idcRight = 412343243; + colorText[] = {0, 0, 0, 1}; + shadow = "0"; + // colorBorder[] = {1,0,0,1}; + // colorBackground[] = {1, 0, 0, 1}; + colorSelectBackground[] = {0, 0, 0, 0.025}; + colorSelectBackground2[] = {0, 0, 0, 0.025}; + colorScrollbar[] = {0.95,0,0.95,1}; + class ListScrollBar: ScrollBar{ + color[] = {0,0,0,0.6}; + }; + }; + class ChargeListBox: RscListbox { + idc = 1501; + style = ST_RIGHT; + x = "13 *(safeZoneH / 40) + (safezoneX + (safezoneW - safeZoneH)/2)"; + y = "1 * ((safeZoneH / 1.2) / 25) + (safezoneY + (safezoneH - (safeZoneH / 1.2))/2)"; + w = "5 * (safeZoneH / 40)"; + h = "5 * ((safeZoneH / 1.2) / 25)"; + onLBSelChanged = QUOTE(_this call FUNC(rangeTablePageChange)); + }; + class CloseBackground: RscText { + idc = -1; + x = "33.7634559672906 *(safeZoneH / 40) + (safezoneX + (safezoneW - safeZoneH)/2)"; + y = "1 * ((safeZoneH / 1.2) / 25) + (safezoneY + (safezoneH - (safeZoneH / 1.2))/2)"; + w = "0.5 * (safeZoneH / 40)"; + h = "0.5 * ((safeZoneH / 1.2) / 25)"; + colorBackground[] = {0,0,0,0.5}; + }; + class CloseActiveText: RscActiveText { + idc = -1; + style = 48; + color[] = {1,1,1,0.7}; + text = "A3\Ui_f\data\GUI\Rsc\RscDisplayArcadeMap\icon_exit_cross_ca.paa"; + x = "33.7634559672906 *(safeZoneH / 40) + (safezoneX + (safezoneW - safeZoneH)/2)"; + y = "1 * ((safeZoneH / 1.2) / 25) + (safezoneY + (safezoneH - (safeZoneH / 1.2))/2)"; + w = "0.5 * (safeZoneH / 40)"; + h = "0.5 * ((safeZoneH / 1.2) / 25)"; + colorText[] = {1,1,1,0.7}; + colorActive[] = {1,1,1,1}; + tooltip = "Close"; + onButtonClick = "closeDialog 0"; + }; + }; +}; \ No newline at end of file diff --git a/addons/mk6mortar/UI/RangeTable_background.paa b/addons/mk6mortar/UI/RangeTable_background.paa new file mode 100644 index 0000000000000000000000000000000000000000..a2a752ce6e563dad099d03be63140050cb06bb8d GIT binary patch literal 289652 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 literal 0 HcmV?d00001 diff --git a/addons/mk6mortar/UI/icon_rangeTable.paa b/addons/mk6mortar/UI/icon_rangeTable.paa new file mode 100644 index 0000000000000000000000000000000000000000..9273b849d735c0e83c02a483b9abec7b78ad947d GIT binary patch literal 25789 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 literal 0 HcmV?d00001 diff --git a/addons/mk6mortar/XEH_preInit.sqf b/addons/mk6mortar/XEH_preInit.sqf index 45a72e1528..eed38408ae 100644 --- a/addons/mk6mortar/XEH_preInit.sqf +++ b/addons/mk6mortar/XEH_preInit.sqf @@ -5,6 +5,9 @@ ADDON = false; PREP(handleFired); PREP(handlePlayerVehicleChanged); PREP(moduleInit); +PREP(rangeTableOpen); +PREP(rangeTablePageChange); +PREP(rangeTablePreCalculatedValues); PREP(toggleMils); PREP(turretDisplayLoaded); diff --git a/addons/mk6mortar/config.cpp b/addons/mk6mortar/config.cpp index cd849c9efd..5050bb2b32 100644 --- a/addons/mk6mortar/config.cpp +++ b/addons/mk6mortar/config.cpp @@ -16,7 +16,18 @@ class CfgPatches { #include "CfgMagazines.hpp" #include "CfgVehicles.hpp" #include "CfgWeapons.hpp" + +class RscText; +class RscListbox; +class RscListNBox; +class RscPicture; +class RscControlsGroup; +class ScrollBar; +class RscActiveText; + + #include "RscInGameUI.hpp" +#include "RscRangeTable.hpp" class ACE_Settings { //These settings effect gameplay difficutly: defaults will leave the mortar the same as vanilla diff --git a/addons/mk6mortar/functions/fnc_rangeTableOpen.sqf b/addons/mk6mortar/functions/fnc_rangeTableOpen.sqf new file mode 100644 index 0000000000..e3dbcffd1d --- /dev/null +++ b/addons/mk6mortar/functions/fnc_rangeTableOpen.sqf @@ -0,0 +1,42 @@ +/* + * Author: PabstMirror + * + * Arguments: + * Return Value: + * + * Example: + * + * Public: No + */ +#include "script_component.hpp" + +#define LIST_CHARGE ((uiNamespace getVariable "ACE_82mm_RangeTable_Dialog") displayCtrl 1501) + +_weaponName = "mortar_82mm"; + +if (dialog) exitWith {ERROR("Dialog Open");}; +createDialog "ACE_82mm_RangeTable_Dialog"; +if (isNull (uiNamespace getVariable ["ACE_82mm_RangeTable_Dialog", displayNull])) exitWith {ERROR("Dialog failed to open");}; + +//Get Magazine Types +_magazines = getArray (configFile >> "CfgWeapons" >> _weaponName >> "magazines"); + +//For now just get settings from first mag, all rounds have same flight characteristics: +if ((count _magazines) < 1) exitWith {ERROR("No Magazines for weapon");}; +_initSpeed = getNumber (configFile >> "CfgMagazines" >> (_magazines select 0) >> "initSpeed"); + +//Get Charge Modes +_fireModes = getArray (configFile >> "CfgWeapons" >> _weaponName >> "modes"); + +_muzzleVelocities = []; +{ + _showToPlayer = getNumber (configFile >> "CfgWeapons" >> _weaponName >> _x >> "showToPlayer"); + if (_showToPlayer == 1) then { + _artilleryCharge = getNumber (configFile >> "CfgWeapons" >> _weaponName >> _x >> "artilleryCharge"); + LIST_CHARGE lbAdd format ["%1: %2 [%3m/s]", "Charge", (count _muzzleVelocities), (_initSpeed * _artilleryCharge)]; + LIST_CHARGE lbSetData [(count _muzzleVelocities), str (_artilleryCharge * _initSpeed)]; + _muzzleVelocities pushBack _artilleryCharge; + }; +} forEach _fireModes; + +LIST_CHARGE lbSetCurSel 0; diff --git a/addons/mk6mortar/functions/fnc_rangeTablePageChange.sqf b/addons/mk6mortar/functions/fnc_rangeTablePageChange.sqf new file mode 100644 index 0000000000..c7f740ba15 --- /dev/null +++ b/addons/mk6mortar/functions/fnc_rangeTablePageChange.sqf @@ -0,0 +1,30 @@ +/* + * Author: PabstMirror + * + * + * Arguments: + * + * Return Value: + * + * Example: + * + * Public: No + */ +#include "script_component.hpp" + +#define RANGE_TABLE ((uiNamespace getVariable "ACE_82mm_RangeTable_Dialog") displayCtrl 20001) +#define LIST_CHARGE ((uiNamespace getVariable "ACE_82mm_RangeTable_Dialog") displayCtrl 1501) + +_listBoxData = LIST_CHARGE lbData (lbCurSel LIST_CHARGE); +if (isNil "_listBoxData" || {_listBoxData == ""}) exitWith {ERROR("lbCurSel out of bounds or no data");}; +_muzzleVelocity = parseNumber _listBoxData; + +_precalcArray = [_muzzleVelocity, MK6_82mm_AIR_FRICTION] call FUNC(rangeTablePreCalculatedValues); + +lnbClear RANGE_TABLE; +{ + RANGE_TABLE lnbAddRow _x; +} forEach _precalcArray; + +//put dummy line at end because scrolling is fucked and can't see last line +RANGE_TABLE lnbAddRow ["", "", "", "", "", "", "", "", "", "", ""]; diff --git a/addons/mk6mortar/functions/fnc_rangeTablePreCalculatedValues.sqf b/addons/mk6mortar/functions/fnc_rangeTablePreCalculatedValues.sqf new file mode 100644 index 0000000000..ff0f9b5407 --- /dev/null +++ b/addons/mk6mortar/functions/fnc_rangeTablePreCalculatedValues.sqf @@ -0,0 +1,285 @@ +/* + * Author: PabstMirror +Simple Lookup Table for various muzzle velocities and air frictions. +Use ACE_Artillery_fnc_dev_buildTable to build + * + * Arguments: + * 0: NUMBER - Muzzle Velocity +1: NUMBER - Air Friction + * Return Value: + * + * Example: + * + * Public: No + */ +#include "script_component.hpp" + +PARAMS_2(_muzzleVelocity,_airFriction); + +switch (true) do { + +case ((abs(_muzzleVelocity - 60) < 0.00001) && ((abs(_airFriction - -0.0001) < 0.00001))): { + [ + ["100","1455","16","12.0","2.4","0.3","-0.2","0.3","-0.3","-0.0","0.0"], + ["150","1379","26","11.8","1.6","0.3","-0.2","0.4","-0.4","-0.0","0.1"], + ["200","1296","39","11.6","1.2","0.4","-0.3","0.5","-0.5","-0.0","0.1"], + ["250","1204","57","11.2","1.0","0.4","-0.3","0.7","-0.7","-0.1","0.1"], + ["300","1089","88","10.6","0.8","0.4","-0.3","0.8","-0.8","-0.1","0.1"], + ["350","894","187","9.3","0.6","0.4","-0.3","0.9","-0.9","-0.1","0.1"] + ] + }; + +case ((abs(_muzzleVelocity - 120) < 0.00001) && ((abs(_airFriction - -0.0001) < 0.00001))): { + [ + ["200","1523","3","23.6","8.2","1.7","-1.6","0.5","-0.5","-0.2","0.2"], + ["250","1503","3","23.5","6.6","1.8","-1.6","0.6","-0.6","-0.2","0.2"], + ["300","1483","4","23.5","5.5","1.8","-1.6","0.7","-0.8","-0.3","0.3"], + ["350","1463","5","23.4","4.7","1.9","-1.7","0.9","-0.9","-0.4","0.3"], + ["400","1443","5","23.4","4.2","1.9","-1.7","1.0","-1.0","-0.4","0.4"], + ["450","1423","6","23.3","3.7","2.0","-1.7","1.1","-1.1","-0.5","0.4"], + ["500","1402","7","23.2","3.4","2.0","-1.8","1.2","-1.3","-0.5","0.5"], + ["550","1381","8","23.1","3.1","2.1","-1.8","1.4","-1.4","-0.6","0.5"], + ["600","1359","9","23.0","2.8","2.2","-1.9","1.5","-1.5","-0.6","0.6"], + ["650","1337","10","22.9","2.6","2.2","-1.9","1.6","-1.6","-0.7","0.7"], + ["700","1314","11","22.7","2.4","2.3","-2.0","1.7","-1.7","-0.7","0.7"], + ["750","1291","13","22.6","2.3","2.4","-2.0","1.9","-1.9","-0.8","0.8"], + ["800","1267","14","22.4","2.1","2.4","-2.1","2.0","-2.0","-0.8","0.8"], + ["850","1241","16","22.2","2.0","2.5","-2.1","2.1","-2.1","-0.9","0.9"], + ["900","1215","17","22.0","1.9","2.5","-2.2","2.2","-2.2","-0.9","0.9"], + ["950","1187","20","21.7","1.8","2.6","-2.3","2.3","-2.4","-1.0","1.0"], + ["1000","1158","23","21.5","1.7","2.6","-2.3","2.5","-2.5","-1.1","1.0"], + ["1050","1127","26","21.1","1.6","2.7","-2.4","2.6","-2.6","-1.1","1.1"], + ["1100","1092","30","20.8","1.5","2.7","-2.4","2.7","-2.8","-1.2","1.1"], + ["1150","1054","36","20.4","1.4","2.7","-2.4","2.9","-2.9","-1.2","1.2"], + ["1200","1011","45","19.8","1.3","2.7","-2.5","3.0","-3.0","-1.3","1.2"], + ["1250","957","59","19.1","1.2","2.7","-2.4","3.1","-3.1","-1.3","1.3"], + ["1300","876","94","18.0","1.1","2.6","-2.4","3.2","-3.3","-1.3","1.3"] + ] + }; + +case ((abs(_muzzleVelocity - 180) < 0.00001) && ((abs(_airFriction - -0.0001) < 0.00001))): { + [ + ["400","1523","1","34.0","11.7","4.9","-4.6","0.9","-0.9","-0.8","0.8"], + ["450","1513","1","34.0","10.5","4.9","-4.7","1.0","-1.0","-0.9","0.8"], + ["500","1504","2","34.0","9.4","5.0","-4.7","1.1","-1.1","-1.0","0.9"], + ["550","1494","2","33.9","8.6","5.1","-4.7","1.2","-1.2","-1.1","1.0"], + ["600","1484","2","33.9","7.9","5.1","-4.8","1.3","-1.4","-1.2","1.1"], + ["650","1474","2","33.9","7.3","5.2","-4.8","1.5","-1.5","-1.3","1.2"], + ["700","1464","2","33.8","6.8","5.2","-4.9","1.6","-1.6","-1.4","1.3"], + ["750","1454","2","33.8","6.3","5.3","-4.9","1.7","-1.7","-1.5","1.4"], + ["800","1444","3","33.7","6.0","5.4","-5.0","1.8","-1.8","-1.6","1.5"], + ["850","1433","3","33.7","5.6","5.4","-5.0","1.9","-1.9","-1.7","1.6"], + ["900","1423","3","33.6","5.3","5.5","-5.1","2.0","-2.0","-1.8","1.7"], + ["950","1413","3","33.6","5.0","5.6","-5.1","2.1","-2.1","-1.9","1.8"], + ["1000","1402","3","33.5","4.8","5.6","-5.2","2.2","-2.2","-2.0","1.9"], + ["1050","1392","4","33.4","4.6","5.7","-5.3","2.3","-2.4","-2.1","2.0"], + ["1100","1381","4","33.3","4.4","5.8","-5.3","2.5","-2.5","-2.2","2.1"], + ["1150","1370","4","33.3","4.2","5.8","-5.4","2.6","-2.6","-2.3","2.2"], + ["1200","1359","4","33.2","4.0","5.9","-5.5","2.7","-2.7","-2.4","2.3"], + ["1250","1348","5","33.1","3.9","6.0","-5.5","2.8","-2.8","-2.5","2.4"], + ["1300","1337","5","33.0","3.7","6.1","-5.6","2.9","-2.9","-2.6","2.5"], + ["1350","1326","5","32.9","3.6","6.1","-5.6","3.0","-3.0","-2.7","2.6"], + ["1400","1314","5","32.8","3.5","6.2","-5.7","3.1","-3.1","-2.8","2.7"], + ["1450","1302","6","32.7","3.3","6.3","-5.8","3.2","-3.2","-2.9","2.8"], + ["1500","1290","6","32.6","3.2","6.3","-5.9","3.3","-3.4","-3.1","2.9"], + ["1550","1278","6","32.5","3.1","6.4","-5.9","3.4","-3.5","-3.2","3.0"], + ["1600","1266","7","32.3","3.0","6.5","-6.0","3.5","-3.6","-3.3","3.1"], + ["1650","1253","7","32.2","2.9","6.6","-6.1","3.7","-3.7","-3.4","3.2"], + ["1700","1240","8","32.0","2.8","6.6","-6.1","3.8","-3.8","-3.5","3.3"], + ["1750","1227","8","31.9","2.8","6.7","-6.2","3.9","-3.9","-3.6","3.4"], + ["1800","1214","9","31.7","2.7","6.7","-6.3","4.0","-4.0","-3.7","3.5"], + ["1850","1200","9","31.6","2.6","6.8","-6.3","4.1","-4.1","-3.8","3.6"], + ["1900","1186","10","31.4","2.5","6.9","-6.4","4.2","-4.2","-3.9","3.7"], + ["1950","1171","10","31.2","2.4","6.9","-6.5","4.3","-4.3","-4.0","3.8"], + ["2000","1156","11","31.0","2.4","7.0","-6.5","4.4","-4.4","-4.1","3.9"], + ["2050","1141","12","30.8","2.3","7.0","-6.6","4.5","-4.6","-4.2","4.0"], + ["2100","1124","13","30.5","2.2","7.1","-6.6","4.7","-4.7","-4.3","4.1"], + ["2150","1108","14","30.3","2.2","7.1","-6.6","4.8","-4.8","-4.4","4.2"], + ["2200","1090","15","30.0","2.1","7.2","-6.7","4.9","-4.9","-4.5","4.3"], + ["2250","1071","17","29.7","2.0","7.2","-6.7","5.0","-5.0","-4.6","4.4"], + ["2300","1052","18","29.4","2.0","7.2","-6.8","5.1","-5.1","-4.7","4.5"], + ["2350","1030","20","29.0","1.9","7.2","-6.8","5.2","-5.2","-4.8","4.6"], + ["2400","1008","23","28.6","1.9","7.2","-6.8","5.3","-5.3","-4.9","4.7"], + ["2450","983","26","28.2","1.8","7.2","-6.8","5.4","-5.4","-5.0","4.8"], + ["2500","954","31","27.6","1.7","7.1","-6.8","5.6","-5.6","-5.1","4.9"], + ["2550","921","38","27.0","1.6","7.1","-6.7","5.7","-5.7","-5.2","4.9"], + ["2600","878","52","26.1","1.5","6.9","-6.6","5.8","-5.8","-5.2","5.0"] + ] + }; +case ((abs(_muzzleVelocity - 240) < 0.00001) && ((abs(_airFriction - -0.0001) < 0.00001))): { + [ + ["600","1526","1","43.3","15.3","9.5","-9.1","1.2","-1.2","-1.8","1.7"], + ["650","1519","1","43.3","14.1","9.5","-9.2","1.3","-1.3","-1.9","1.8"], + ["700","1513","1","43.3","13.2","9.6","-9.2","1.4","-1.4","-2.1","1.9"], + ["750","1507","1","43.2","12.3","9.6","-9.2","1.5","-1.5","-2.2","2.1"], + ["800","1500","1","43.2","11.5","9.7","-9.3","1.6","-1.6","-2.4","2.2"], + ["850","1494","1","43.2","10.9","9.7","-9.3","1.7","-1.7","-2.5","2.4"], + ["900","1488","1","43.2","10.3","9.8","-9.4","1.8","-1.8","-2.7","2.5"], + ["950","1481","1","43.1","9.8","9.9","-9.4","1.9","-1.9","-2.8","2.7"], + ["1000","1475","1","43.1","9.3","9.9","-9.5","2.0","-2.0","-3.0","2.8"], + ["1050","1468","1","43.1","8.9","10.0","-9.5","2.1","-2.1","-3.1","2.9"], + ["1100","1462","1","43.0","8.5","10.1","-9.6","2.2","-2.2","-3.3","3.1"], + ["1150","1455","1","43.0","8.1","10.1","-9.6","2.3","-2.3","-3.4","3.2"], + ["1200","1449","1","43.0","7.8","10.2","-9.7","2.4","-2.4","-3.6","3.4"], + ["1250","1442","2","42.9","7.5","10.3","-9.8","2.5","-2.5","-3.7","3.5"], + ["1300","1436","2","42.9","7.2","10.3","-9.8","2.6","-2.6","-3.9","3.6"], + ["1350","1429","2","42.8","6.9","10.4","-9.9","2.7","-2.7","-4.0","3.8"], + ["1400","1422","2","42.8","6.7","10.5","-10.0","2.8","-2.8","-4.2","3.9"], + ["1450","1416","2","42.7","6.5","10.5","-10.0","2.9","-2.9","-4.4","4.1"], + ["1500","1409","2","42.7","6.2","10.6","-10.1","3.0","-3.0","-4.5","4.2"], + ["1550","1402","2","42.6","6.0","10.7","-10.2","3.0","-3.1","-4.7","4.4"], + ["1600","1395","2","42.6","5.9","10.8","-10.2","3.1","-3.2","-4.8","4.5"], + ["1650","1388","2","42.5","5.7","10.8","-10.3","3.2","-3.3","-5.0","4.7"], + ["1700","1381","2","42.4","5.5","10.9","-10.4","3.3","-3.3","-5.1","4.8"], + ["1750","1374","2","42.4","5.4","11.0","-10.4","3.4","-3.4","-5.3","4.9"], + ["1800","1367","2","42.3","5.2","11.0","-10.5","3.5","-3.5","-5.4","5.1"], + ["1850","1360","3","42.2","5.1","11.1","-10.6","3.6","-3.6","-5.6","5.2"], + ["1900","1353","3","42.2","5.0","11.2","-10.6","3.7","-3.7","-5.8","5.4"], + ["1950","1346","3","42.1","4.8","11.3","-10.7","3.8","-3.8","-5.9","5.5"], + ["2000","1338","3","42.0","4.7","11.3","-10.8","3.9","-3.9","-6.1","5.7"], + ["2050","1331","3","41.9","4.6","11.4","-10.9","4.0","-4.0","-6.2","5.8"], + ["2100","1323","3","41.9","4.5","11.5","-10.9","4.1","-4.1","-6.4","6.0"], + ["2150","1316","3","41.8","4.4","11.6","-11.0","4.2","-4.2","-6.5","6.1"], + ["2200","1308","3","41.7","4.3","11.6","-11.1","4.3","-4.3","-6.7","6.3"], + ["2250","1301","3","41.6","4.2","11.7","-11.1","4.4","-4.4","-6.9","6.4"], + ["2300","1293","4","41.5","4.1","11.8","-11.2","4.5","-4.5","-7.0","6.6"], + ["2350","1285","4","41.4","4.0","11.9","-11.3","4.6","-4.6","-7.2","6.7"], + ["2400","1277","4","41.3","3.9","11.9","-11.3","4.7","-4.7","-7.3","6.9"], + ["2450","1269","4","41.2","3.8","12.0","-11.4","4.8","-4.8","-7.5","7.0"], + ["2500","1261","4","41.1","3.8","12.1","-11.5","4.9","-4.9","-7.7","7.1"], + ["2550","1253","4","41.0","3.7","12.1","-11.6","5.0","-5.0","-7.8","7.3"], + ["2600","1244","4","40.9","3.6","12.2","-11.6","5.1","-5.1","-8.0","7.4"], + ["2650","1236","5","40.7","3.5","12.3","-11.7","5.2","-5.2","-8.1","7.6"], + ["2700","1227","5","40.6","3.5","12.3","-11.8","5.3","-5.3","-8.3","7.7"], + ["2750","1219","5","40.5","3.4","12.4","-11.8","5.4","-5.4","-8.4","7.9"], + ["2800","1210","5","40.3","3.3","12.5","-11.9","5.5","-5.5","-8.6","8.0"], + ["2850","1201","5","40.2","3.3","12.5","-12.0","5.6","-5.6","-8.8","8.2"], + ["2900","1192","6","40.1","3.2","12.6","-12.0","5.7","-5.7","-8.9","8.3"], + ["2950","1182","6","39.9","3.1","12.6","-12.1","5.8","-5.8","-9.1","8.5"], + ["3000","1173","6","39.7","3.1","12.7","-12.2","5.9","-5.9","-9.2","8.6"], + ["3050","1163","6","39.6","3.0","12.7","-12.2","6.0","-6.0","-9.4","8.8"], + ["3100","1153","7","39.4","3.0","12.8","-12.3","6.1","-6.0","-9.5","8.9"], + ["3150","1143","7","39.2","2.9","12.8","-12.3","6.1","-6.2","-9.7","9.0"], + ["3200","1133","7","39.0","2.9","12.9","-12.4","6.3","-6.2","-9.8","9.2"], + ["3250","1122","8","38.8","2.8","12.9","-12.4","6.4","-6.3","-10.0","9.3"], + ["3300","1111","8","38.6","2.7","13.0","-12.5","6.4","-6.4","-10.2","9.5"], + ["3350","1100","9","38.4","2.7","13.0","-12.5","6.5","-6.5","-10.3","9.6"], + ["3400","1088","9","38.2","2.6","13.0","-12.5","6.6","-6.6","-10.5","9.8"], + ["3450","1076","10","38.0","2.6","13.0","-12.6","6.7","-6.7","-10.6","9.9"], + ["3500","1064","10","37.7","2.5","13.1","-12.6","6.9","-6.8","-10.7","10.0"], + ["3550","1051","11","37.4","2.5","13.1","-12.6","7.0","-6.9","-10.9","10.2"], + ["3600","1038","12","37.2","2.4","13.1","-12.6","7.0","-7.0","-11.0","10.3"], + ["3650","1024","13","36.9","2.4","13.1","-12.6","7.2","-7.1","-11.2","10.4"], + ["3700","1009","14","36.5","2.3","13.1","-12.6","7.2","-7.3","-11.3","10.5"], + ["3750","993","15","36.2","2.3","13.0","-12.6","7.4","-7.3","-11.4","10.7"], + ["3800","977","16","35.8","2.2","13.0","-12.6","7.5","-7.5","-11.6","10.8"], + ["3850","959","18","35.4","2.2","13.0","-12.6","7.6","-7.6","-11.7","10.9"], + ["3900","940","20","34.9","2.1","12.9","-12.5","7.7","-7.7","-11.8","11.0"], + ["3950","918","23","34.4","2.0","12.8","-12.4","7.8","-7.8","-11.9","11.1"], + ["4000","893","28","33.7","2.0","12.7","-12.3","7.9","-7.9","-12.0","11.2"], + ["4050","863","35","32.9","1.9","12.5","-12.1","8.0","-8.0","-12.0","11.2"], + ["4100","821","50","31.8","1.8","12.1","-11.8","8.2","-8.2","-12.0","11.2"] + ] + }; +case ((abs(_muzzleVelocity - 300) < 0.00001) && ((abs(_airFriction - -0.0001) < 0.00001))): { + [ + ["800","1527","0","51.4","18.2","15.0","-14.6","1.4","-1.4","-3.1","2.9"], + ["850","1522","1","51.4","17.2","15.0","-14.6","1.5","-1.5","-3.3","3.0"], + ["900","1517","1","51.4","16.2","15.0","-14.7","1.6","-1.6","-3.5","3.2"], + ["950","1513","1","51.4","15.4","15.1","-14.7","1.7","-1.6","-3.7","3.4"], + ["1000","1508","1","51.4","14.7","15.2","-14.8","1.7","-1.7","-3.9","3.6"], + ["1050","1503","1","51.3","14.0","15.2","-14.8","1.8","-1.8","-4.1","3.8"], + ["1100","1498","1","51.3","13.4","15.3","-14.8","1.9","-1.9","-4.3","3.9"], + ["1150","1494","1","51.3","12.8","15.3","-14.9","2.0","-2.0","-4.5","4.1"], + ["1200","1489","1","51.3","12.3","15.4","-14.9","2.1","-2.1","-4.7","4.3"], + ["1250","1484","1","51.2","11.8","15.5","-15.0","2.2","-2.2","-4.9","4.5"], + ["1300","1479","1","51.2","11.3","15.5","-15.0","2.3","-2.3","-5.1","4.7"], + ["1350","1475","1","51.2","10.9","15.6","-15.1","2.3","-2.3","-5.3","4.8"], + ["1400","1470","1","51.2","10.6","15.6","-15.1","2.4","-2.4","-5.5","5.0"], + ["1450","1465","1","51.1","10.2","15.7","-15.2","2.5","-2.5","-5.7","5.2"], + ["1500","1460","1","51.1","9.9","15.8","-15.3","2.6","-2.6","-5.9","5.4"], + ["1550","1455","1","51.1","9.5","15.8","-15.3","2.7","-2.7","-6.1","5.6"], + ["1600","1451","1","51.0","9.3","15.9","-15.4","2.8","-2.8","-6.3","5.8"], + ["1650","1446","1","51.0","9.0","16.0","-15.4","2.9","-2.9","-6.5","5.9"], + ["1700","1441","1","51.0","8.7","16.0","-15.5","3.0","-2.9","-6.7","6.1"], + ["1750","1436","1","50.9","8.5","16.1","-15.6","3.0","-3.0","-6.9","6.3"], + ["1800","1431","1","50.9","8.2","16.2","-15.6","3.1","-3.1","-7.1","6.5"], + ["1850","1426","1","50.8","8.0","16.2","-15.7","3.2","-3.2","-7.3","6.7"], + ["1900","1421","1","50.8","7.8","16.3","-15.8","3.3","-3.3","-7.5","6.9"], + ["1950","1416","1","50.7","7.6","16.4","-15.8","3.4","-3.4","-7.7","7.1"], + ["2000","1411","1","50.7","7.4","16.4","-15.9","3.5","-3.5","-7.9","7.2"], + ["2050","1406","1","50.7","7.3","16.5","-15.9","3.6","-3.5","-8.1","7.4"], + ["2100","1401","1","50.6","7.1","16.6","-16.0","3.6","-3.6","-8.3","7.6"], + ["2150","1396","1","50.6","6.9","16.6","-16.1","3.7","-3.7","-8.5","7.8"], + ["2200","1390","1","50.5","6.8","16.7","-16.1","3.8","-3.8","-8.7","8.0"], + ["2250","1385","2","50.5","6.6","16.8","-16.2","3.9","-3.9","-8.9","8.2"], + ["2300","1380","2","50.4","6.5","16.9","-16.3","4.0","-4.0","-9.1","8.3"], + ["2350","1375","2","50.3","6.3","16.9","-16.4","4.1","-4.1","-9.3","8.5"], + ["2400","1370","2","50.3","6.2","17.0","-16.4","4.2","-4.1","-9.5","8.7"], + ["2450","1364","2","50.2","6.1","17.1","-16.5","4.2","-4.2","-9.7","8.9"], + ["2500","1359","2","50.2","6.0","17.1","-16.6","4.3","-4.3","-9.9","9.1"], + ["2550","1354","2","50.1","5.8","17.2","-16.6","4.4","-4.4","-10.1","9.3"], + ["2600","1348","2","50.0","5.7","17.3","-16.7","4.5","-4.5","-10.3","9.5"], + ["2650","1343","2","50.0","5.6","17.3","-16.8","4.6","-4.6","-10.5","9.6"], + ["2700","1337","2","49.9","5.5","17.4","-16.8","4.7","-4.7","-10.7","9.8"], + ["2750","1332","2","49.8","5.4","17.5","-16.9","4.8","-4.7","-10.9","10.0"], + ["2800","1326","2","49.8","5.3","17.6","-17.0","4.8","-4.8","-11.1","10.2"], + ["2850","1321","2","49.7","5.2","17.6","-17.0","4.9","-4.9","-11.3","10.4"], + ["2900","1315","2","49.6","5.1","17.7","-17.1","5.0","-5.0","-11.5","10.6"], + ["2950","1309","2","49.5","5.0","17.8","-17.2","5.1","-5.1","-11.7","10.8"], + ["3000","1304","2","49.5","5.0","17.8","-17.3","5.2","-5.2","-11.9","10.9"], + ["3050","1298","2","49.4","4.9","17.9","-17.3","5.3","-5.2","-12.1","11.1"], + ["3100","1292","2","49.3","4.8","18.0","-17.4","5.3","-5.3","-12.3","11.3"], + ["3150","1286","3","49.2","4.7","18.0","-17.5","5.4","-5.4","-12.5","11.5"], + ["3200","1280","3","49.1","4.6","18.1","-17.5","5.5","-5.5","-12.7","11.7"], + ["3250","1274","3","49.0","4.6","18.2","-17.6","5.6","-5.6","-12.9","11.9"], + ["3300","1268","3","48.9","4.5","18.2","-17.7","5.7","-5.6","-13.1","12.1"], + ["3350","1262","3","48.8","4.4","18.3","-17.7","5.8","-5.7","-13.3","12.2"], + ["3400","1256","3","48.7","4.4","18.4","-17.8","5.9","-5.8","-13.5","12.4"], + ["3450","1250","3","48.6","4.3","18.4","-17.9","5.9","-5.9","-13.8","12.6"], + ["3500","1244","3","48.5","4.2","18.5","-17.9","6.0","-6.0","-14.0","12.8"], + ["3550","1237","3","48.4","4.2","18.6","-18.0","6.1","-6.1","-14.2","13.0"], + ["3600","1231","3","48.3","4.1","18.6","-18.1","6.2","-6.2","-14.4","13.2"], + ["3650","1224","3","48.2","4.0","18.7","-18.1","6.3","-6.3","-14.6","13.4"], + ["3700","1218","3","48.1","4.0","18.7","-18.2","6.4","-6.3","-14.8","13.5"], + ["3750","1211","4","48.0","3.9","18.8","-18.2","6.5","-6.4","-15.0","13.7"], + ["3800","1205","4","47.8","3.9","18.8","-18.3","6.5","-6.5","-15.2","13.9"], + ["3850","1198","4","47.7","3.8","18.9","-18.4","6.6","-6.6","-15.4","14.1"], + ["3900","1191","4","47.6","3.7","18.9","-18.4","6.7","-6.7","-15.6","14.3"], + ["3950","1184","4","47.5","3.7","19.0","-18.5","6.8","-6.8","-15.8","14.5"], + ["4000","1177","4","47.3","3.6","19.1","-18.5","6.9","-6.8","-16.0","14.7"], + ["4050","1170","4","47.2","3.6","19.1","-18.6","7.0","-6.9","-16.2","14.8"], + ["4100","1163","4","47.0","3.5","19.1","-18.6","7.1","-7.0","-16.4","15.0"], + ["4150","1155","5","46.9","3.5","19.2","-18.7","7.1","-7.1","-16.6","15.2"], + ["4200","1148","5","46.7","3.4","19.2","-18.7","7.2","-7.2","-16.8","15.4"], + ["4250","1140","5","46.6","3.4","19.3","-18.8","7.3","-7.3","-17.0","15.6"], + ["4300","1132","5","46.4","3.3","19.3","-18.8","7.4","-7.4","-17.2","15.7"], + ["4350","1124","5","46.2","3.3","19.3","-18.8","7.5","-7.5","-17.4","15.9"], + ["4400","1116","5","46.1","3.2","19.4","-18.9","7.6","-7.5","-17.6","16.1"], + ["4450","1108","6","45.9","3.2","19.4","-18.9","7.7","-7.6","-17.8","16.3"], + ["4500","1100","6","45.7","3.1","19.4","-19.0","7.8","-7.7","-17.9","16.4"], + ["4550","1091","6","45.5","3.1","19.4","-19.0","7.8","-7.8","-18.1","16.6"], + ["4600","1083","6","45.3","3.1","19.5","-19.0","7.9","-7.9","-18.3","16.8"], + ["4650","1074","7","45.1","3.0","19.5","-19.0","8.0","-8.0","-18.5","17.0"], + ["4700","1065","7","44.9","3.0","19.5","-19.1","8.1","-8.1","-18.7","17.1"], + ["4750","1055","7","44.6","2.9","19.5","-19.1","8.2","-8.2","-18.9","17.3"], + ["4800","1046","8","44.4","2.9","19.5","-19.1","8.3","-8.3","-19.1","17.5"], + ["4850","1036","8","44.2","2.8","19.5","-19.1","8.4","-8.3","-19.2","17.6"], + ["4900","1025","8","43.9","2.8","19.5","-19.1","8.5","-8.4","-19.4","17.8"], + ["4950","1015","9","43.6","2.7","19.5","-19.1","8.6","-8.5","-19.6","18.0"], + ["5000","1004","9","43.3","2.7","19.4","-19.1","8.7","-8.6","-19.8","18.1"], + ["5050","992","10","43.0","2.6","19.4","-19.0","8.8","-8.7","-19.9","18.3"], + ["5100","980","11","42.7","2.6","19.4","-19.0","8.9","-8.8","-20.1","18.4"], + ["5150","968","11","42.4","2.5","19.3","-18.9","9.0","-8.9","-20.2","18.6"], + ["5200","955","12","42.0","2.5","19.2","-18.9","9.1","-9.0","-20.4","18.7"], + ["5250","941","13","41.6","2.4","19.2","-18.8","9.1","-9.1","-20.6","18.8"], + ["5300","926","15","41.2","2.4","19.1","-18.8","9.2","-9.2","-20.7","19.0"], + ["5350","910","16","40.7","2.3","19.0","-18.6","9.4","-9.3","-20.8","19.1"], + ["5400","892","18","40.2","2.3","18.8","-18.5","9.5","-9.4","-20.9","19.2"], + ["5450","872","21","39.6","2.2","18.6","-18.3","9.6","-9.5","-21.0","19.3"], + ["5500","849","26","38.8","2.1","18.4","-18.1","9.7","-9.7","-21.1","19.3"], + ["5550","820","33","37.9","2.1","18.0","-17.8","9.8","-9.8","-21.1","19.4"] + ] + }; + default {systemChat "Error: MuzzleVelocity not found in LUT"; []}; +}; \ No newline at end of file diff --git a/addons/mk6mortar/script_component.hpp b/addons/mk6mortar/script_component.hpp index adf4a56946..cb74d552de 100644 --- a/addons/mk6mortar/script_component.hpp +++ b/addons/mk6mortar/script_component.hpp @@ -9,4 +9,6 @@ #define DEBUG_SETTINGS DEBUG_SETTINGS_MK6MORTAR #endif -#include "\z\ace\Addons\main\script_macros.hpp" \ No newline at end of file +#include "\z\ace\Addons\main\script_macros.hpp" + +#define MK6_82mm_AIR_FRICTION -0.0001 \ No newline at end of file From 3e77eb97371b4503a83d2e4becec60b4c2268eec Mon Sep 17 00:00:00 2001 From: PabstMirror Date: Sun, 5 Apr 2015 16:28:12 -0500 Subject: [PATCH 10/22] Rangetable Builder and Prepcalc --- addons/mk6mortar/XEH_preInit.sqf | 7 + .../functions/fnc_dev_buildTable.sqf | 77 +++++ .../functions/fnc_dev_formatNumber.sqf | 83 +++++ .../fnc_dev_simulateCalcRangeTableLine.sqf | 81 +++++ .../fnc_dev_simulateFindSolution.sqf | 57 ++++ .../functions/fnc_dev_simulateShot.sqf | 78 +++++ .../fnc_rangeTablePreCalculatedValues.sqf | 319 ++++-------------- 7 files changed, 447 insertions(+), 255 deletions(-) create mode 100644 addons/mk6mortar/functions/fnc_dev_buildTable.sqf create mode 100644 addons/mk6mortar/functions/fnc_dev_formatNumber.sqf create mode 100644 addons/mk6mortar/functions/fnc_dev_simulateCalcRangeTableLine.sqf create mode 100644 addons/mk6mortar/functions/fnc_dev_simulateFindSolution.sqf create mode 100644 addons/mk6mortar/functions/fnc_dev_simulateShot.sqf diff --git a/addons/mk6mortar/XEH_preInit.sqf b/addons/mk6mortar/XEH_preInit.sqf index eed38408ae..186a595896 100644 --- a/addons/mk6mortar/XEH_preInit.sqf +++ b/addons/mk6mortar/XEH_preInit.sqf @@ -2,6 +2,13 @@ ADDON = false; + +PREP(dev_buildTable); +PREP(dev_formatNumber); +PREP(dev_simulateCalcRangeTableLine); +PREP(dev_simulateFindSolution); +PREP(dev_simulateShot); + PREP(handleFired); PREP(handlePlayerVehicleChanged); PREP(moduleInit); diff --git a/addons/mk6mortar/functions/fnc_dev_buildTable.sqf b/addons/mk6mortar/functions/fnc_dev_buildTable.sqf new file mode 100644 index 0000000000..d36aa61819 --- /dev/null +++ b/addons/mk6mortar/functions/fnc_dev_buildTable.sqf @@ -0,0 +1,77 @@ +/* +Name: AGM_Artillery_fnc_dev_buildTable + +Author: Pabst Mirror + +Description: + DEV function to build mortar tables, very cpu intensive (never used durring normal gameplay) + +Parameters: (normal BIS "Fired" EH stuff) + 0: NUMBER - Muzzle Velocity + 1: NUMBER - Air Friction + +Returns: + Data in clipboard + +Example: + [100, -0.0001] spawn AGM_Artillery_fnc_dev_buildTable; //spawn (scheduled) is slower + [100, -0.0001] call AGM_Artillery_fnc_dev_buildTable; //faster, but will lock while processing +*/ +#include "script_component.hpp" + +private ["_muzzleVelocity", "_airFriction", "_stillInRange", "_currentRange", "_increasePerRow", "_outputArray", "_rangeToHit", "_lineElevation", "_lineHeightElevation", "_lineTimeOfFlight", "_lineCrosswindDeg", "_lineHeadwindMeters", "_lineTailWindMeters", "_lineTempDec", "_lineTempInc", "_lineAirDensDec", "_lineAirDensInc", "_result", "_outputString"]; + +_muzzleVelocity = _this select 0; +_airFriction = _this select 1; +_stillInRange = true; +_currentRange = 100; +_increasePerRow = 50; +_outputArray = []; + + +//[_rangeToHit, _lineElevation, _lineHeightElevation, _lineTimeOfFlight, _lineCrosswindDeg, _lineHeadwindMeters, _lineTailWindMeters, _lineTempDec, _lineTempInc, _lineAirDensDec, _lineAirDensInc] + +while {_stillInRange} do { + _result = [_muzzleVelocity, _currentRange, _airFriction] call FUNC(dev_simulateCalcRangeTableLine); + if (_result isEqualTo []) then { + _stillInRange = false; + } else { + if ((_result select 1) < 86) then { + _outputArray pushBack [ + ([(_result select 0), "meters", false] call FUNC(dev_formatNumber)), + ([(_result select 1), "mil", true] call FUNC(dev_formatNumber)), + ([(_result select 2), "mil", true] call FUNC(dev_formatNumber)), + ([(_result select 3), "sec", false] call FUNC(dev_formatNumber)), + ([(_result select 4), "milPrecise", true] call FUNC(dev_formatNumber)), + ([(_result select 5), "metersprecise", false] call FUNC(dev_formatNumber)), + ([(_result select 6), "metersprecise", false] call FUNC(dev_formatNumber)), + ([(_result select 7), "metersprecise", false] call FUNC(dev_formatNumber)), + ([(_result select 8), "metersprecise", false] call FUNC(dev_formatNumber)), + ([(_result select 9), "metersprecise", false] call FUNC(dev_formatNumber)), + ([(_result select 10), "metersprecise", false] call FUNC(dev_formatNumber)) + ]; + }; + _currentRange = _currentRange + _increasePerRow; + }; + hint str _currentRange; +}; + +//handle floating point rounding errors +_outputString = format ["case ((abs(_muzzleVelocity - %1) < 0.00001) && ((abs(_airFriction - %2) < 0.00001))): { +[ +", _muzzleVelocity, _airFriction]; + +{ + if (_forEachIndex < ((count _outputArray) - 1)) then { + _outputString = _outputString + format ["%1, + ", _x]; + } else { + _outputString = _outputString + format ["%1 + ] + };", _x]; + }; +} forEach _outputArray; + +copyToClipboard _outputString; + +hint "done"; \ No newline at end of file diff --git a/addons/mk6mortar/functions/fnc_dev_formatNumber.sqf b/addons/mk6mortar/functions/fnc_dev_formatNumber.sqf new file mode 100644 index 0000000000..47e9fc7fbf --- /dev/null +++ b/addons/mk6mortar/functions/fnc_dev_formatNumber.sqf @@ -0,0 +1,83 @@ +/* +Name: AGM_Artillery_fnc_formatNumber + +Author: Pabst Mirror + +Description: + Converts numbers into nicely formated strings. + +Parameters: + 0: NUMBER - Input number + 1: STRING - Output type (see case statement) + 2: BOOL - If output type is mil, convert input type from deg->mil + +Returns: + STRING - Formatted number + +Example: + [45, "mil4", true] call AGM_Artillery_fnc_formatNumber = "0800" +*/ +#include "script_component.hpp" + +private ["_theNumber", "_inputType", "_convertToMils", "_decimalPlaces", "_integerPlaces", "_prefix", "_return"]; + +_theNumber = _this select 0; +_inputType = _this select 1; +_convertToMils = _this select 2; + +_decimalPlaces = -1; +_integerPlaces = -1; + +switch (toLower _inputType) do { +case ("meters"): { + _decimalPlaces = 0; + _integerPlaces = 1; + }; +case ("metersprecise"): { + _decimalPlaces = 1; + _integerPlaces = 1; + }; +case ("meters4"): { + _decimalPlaces = 0; + _integerPlaces = 4; + }; +case ("deg3precise"): { + _decimalPlaces = 2; + _integerPlaces = 3; + }; +case ("mil"): { + _decimalPlaces = 0; + _integerPlaces = 1; + if (_convertToMils) then { + _theNumber = _theNumber * (6400 / 360); + }; + }; +case ("mil4"): { + _decimalPlaces = 0; + _integerPlaces = 4; + if (_convertToMils) then { + _theNumber = _theNumber * (6400 / 360); + }; + }; +case ("milprecise"): { + _decimalPlaces = 1; + _integerPlaces = 1; + if (_convertToMils) then { + _theNumber = _theNumber * (6400 / 360); + }; + }; +case ("sec"): { + _decimalPlaces = 1; + _integerPlaces = 1; + }; + default {systemChat format ["badtype %1", _inputType];}; +}; + + +//CBA_fnc_formatNumber is stupid: [-9.58545, 1, 1, false] call CBA_fnc_formatNumber == "-9.-6" + +_prefix = if (_theNumber < 0) then {"-"} else {""}; + +_return = [abs (_theNumber), _integerPlaces, _decimalPlaces, false] call CBA_fnc_formatNumber; + +(_prefix + _return) diff --git a/addons/mk6mortar/functions/fnc_dev_simulateCalcRangeTableLine.sqf b/addons/mk6mortar/functions/fnc_dev_simulateCalcRangeTableLine.sqf new file mode 100644 index 0000000000..24ebd909ed --- /dev/null +++ b/addons/mk6mortar/functions/fnc_dev_simulateCalcRangeTableLine.sqf @@ -0,0 +1,81 @@ +/* +Name: AGM_Artillery_fnc_simulateCalcRangeTableLine + +Author: Pabst Mirror + +Description: + Builds a rangeTable line for a certian range, given muzzle velocity and air friction, returns [] if out of range. + +Parameters: + 0: NUMBER - Muzzle Velocity + 1: NUMBER - Air Friction + 2: NUMBER - Range To Hit + +Returns: + ARRAY - Range Table Line Data (see return line) + +Example: + [300, -0.0001, 3000] call AGM_Artillery_fnc_simulateCalcRangeTableLine +*/ +#include "script_component.hpp" + +#define TIME_STEP (1/50) + +private ["_startTime", "_muzzleVelocity", "_rangeToHit", "_airFriction", "_vacElevation", "_radicand", "_maxElev", "_minElev", "_error", "_solutionElevation", "_lastTestResult", "_numberOfAttempts", "_lineElevation", "_lineTimeOfFlight", "_lineHeightElevation", "_lineHeightTime", "_lineCrosswindDeg", "_lineHeadwindMeters", "_lineTailWindMeters", "_result"]; + +_startTime = diag_tickTime; + +_muzzleVelocity = _this select 0; +_rangeToHit = _this select 1; +_airFriction = _this select 2; + +//Run Binary search for correct elevation +_solution = [_rangeToHit, 0, _muzzleVelocity, _airFriction, TIME_STEP] call FUNC(dev_simulateFindSolution); +if (_solution isEqualTo []) exitWith {[]}; + +//Real Elevation +_lineElevation = _solution select 0; + +//Time Of Flight: +_lineTimeOfFlight = _solution select 1; + +//Height Adjustment for -100m (another binary search) +_solution = [_rangeToHit, -100, _muzzleVelocity, _airFriction, TIME_STEP] call FUNC(dev_simulateFindSolution); +if (_solution isEqualTo []) exitWith {[]};//should never be triggered (lower elevation easier to hit) + +_lineHeightElevation = ((_solution select 0) - _lineElevation); +// _lineHeightTime = (_lastTestResult select 1) - _lineTimeOfFlight; + +//Compute for 10x and divide to minimize rounding errors + +//Crosswind +_lastTestResult = [_lineElevation, _muzzleVelocity, _airFriction, 15, 1, 0, 10, 0, TIME_STEP] call FUNC(dev_simulateShot); +_lineCrosswindDeg = (_lastTestResult select 2) / 10; + +//Headwind: +_lastTestResult = [_lineElevation, _muzzleVelocity, _airFriction, 15, 1, -10, 0, 0, TIME_STEP] call FUNC(dev_simulateShot); +_lineHeadwindMeters = (_rangeToHit - (_lastTestResult select 0)) / 10; + +//TailWind: +_lastTestResult = [_lineElevation, _muzzleVelocity, _airFriction, 15, 1, 10, 0, 0, TIME_STEP] call FUNC(dev_simulateShot); +_lineTailWindMeters = (_rangeToHit - (_lastTestResult select 0)) / 10; + +//Air Temp Dec +_lastTestResult = [_lineElevation, _muzzleVelocity, _airFriction, (15 - 10), 1, 0, 0, 0, TIME_STEP] call FUNC(dev_simulateShot); +_lineTempDec = (_rangeToHit - (_lastTestResult select 0)) / 10; + +//Air Temp Inc +_lastTestResult = [_lineElevation, _muzzleVelocity, _airFriction, (15 + 10), 1, 0, 0, 0, TIME_STEP] call FUNC(dev_simulateShot); +_lineTempInc = (_rangeToHit - (_lastTestResult select 0)) / 10; + +//Air Density Dec +_lastTestResult = [_lineElevation, _muzzleVelocity, _airFriction, 15, 0.9, 0, 0, 0, TIME_STEP] call FUNC(dev_simulateShot); +_lineAirDensDec = (_rangeToHit - (_lastTestResult select 0)) / 10; + +//Air Density Inc +_lastTestResult = [_lineElevation, _muzzleVelocity, _airFriction, 15, 1.1, 0, 0, 0, TIME_STEP] call FUNC(dev_simulateShot); +_lineAirDensInc = (_rangeToHit - (_lastTestResult select 0)) / 10; + +// systemChat format ["debug: Range %1 - in %2 sec", _rangeToHit, (diag_tickTime - _startTime)]; + +[_rangeToHit, _lineElevation, _lineHeightElevation, _lineTimeOfFlight, _lineCrosswindDeg, _lineHeadwindMeters, _lineTailWindMeters, _lineTempDec, _lineTempInc, _lineAirDensDec, _lineAirDensInc] diff --git a/addons/mk6mortar/functions/fnc_dev_simulateFindSolution.sqf b/addons/mk6mortar/functions/fnc_dev_simulateFindSolution.sqf new file mode 100644 index 0000000000..ddeab4015f --- /dev/null +++ b/addons/mk6mortar/functions/fnc_dev_simulateFindSolution.sqf @@ -0,0 +1,57 @@ +/* +Name: FUNC(simulateFindSolution) + +Author: Pabst Mirror + +Description: + Converts numbers into nicely formated strings. + +Parameters: + 0: NUMBER - Range to Hit (Meters) + 1: NUMBER - Height To Hit (Meters) + 2: NUMBER - Muzzle Velocity (M/S) + 3: NUMBER - Air Friction + 4: NUMBER - Time Step (seconds) (eg 1/50 will simulate 50 cycles per second) + +Returns: + ARRAY - [NUMBER - Elevation In Degrees, NUMBER - Shot Durration] + +Example: + [_rangeToHit, _heightToHit, _muzzleVelocity, _airFriction, TIME_STEP] call FUNC(simulateFindSolution); +*/ +#include "script_component.hpp" + +private ["_rangeToHit", "_heightToHit", "_muzzleVelocity", "_airFriction", "_maxElev", "_minElev", "_error", "_solutionElevation", "_lastTestResult", "_numberOfAttempts"]; + +#define MAX_ATTEMPTS 22 + +_rangeToHit = _this select 0; +_heightToHit = _this select 1; +_muzzleVelocity = _this select 2; +_airFriction = _this select 3; +_timeStep = _this select 4; + +_maxElev = 90; +_minElev = 45; //todo - Low Angle Howitzers??? + +_error = 10000; +_solutionElevation = -1; +_lastTestResult = []; +_numberOfAttempts = 0; + +//(binary search) +while {(_numberOfAttempts < MAX_ATTEMPTS) && ((abs _error) > 0.2)} do { + _numberOfAttempts = _numberOfAttempts + 1; + _solutionElevation = (_maxElev + _minElev) / 2; + _lastTestResult = [_solutionElevation, _muzzleVelocity, _airFriction, 15, 1, 0, 0, _heightToHit, _timeStep] call FUNC(dev_simulateShot); + _error = _rangeToHit - (_lastTestResult select 0); + if (_error > 0) then { + _maxElev = _solutionElevation; //test range was short + } else { + _minElev = _solutionElevation; //test range was long + }; +}; +if (_numberOfAttempts >= MAX_ATTEMPTS) exitWith {[]}; + +//return the elevation and time required +[_solutionElevation, (_lastTestResult select 1)] diff --git a/addons/mk6mortar/functions/fnc_dev_simulateShot.sqf b/addons/mk6mortar/functions/fnc_dev_simulateShot.sqf new file mode 100644 index 0000000000..a6c3761acb --- /dev/null +++ b/addons/mk6mortar/functions/fnc_dev_simulateShot.sqf @@ -0,0 +1,78 @@ +/* +Name: simulateShot + +Author: Pabst Mirror + +Description: + Simulates the path of a fired shell. + +Parameters: + 0: NUMBER - Shot Angle (degrees) + 1: NUMBER - Muzzle Velocity (m/s) + 2: NUMBER - Air Friction + 3: NUMBER - Tempeture (degres celcius) + 4: NUMBER - Relative Air Denisty + 5: NUMBER - Tail Wind (m/s) + 6: NUMBER - Cross Wind (m/s) + 7: NUMBER - Height Of Target (M) + 8: NUMBER - Time Step (fraction of a second) + +Returns: + ARRAY - + NUMBER - Distance Traveld + NUMBER - Shot Time + NUMBER - Offset (degrees) + +Example: + [45, 180, -0.0001, 15, 1, 10, 0, 0, 1/50] call simulateShot; +*/ +#include "script_component.hpp" + +private ["_angleDeg", "_muzzleVelocity", "_airFriction", "_temp", "_relDensity", "_tailWind", "_crosswind", "_heightOfTarget", "_wind", "_gravity", "_timeStep", "_currentPos", "_currentVelocity", "_currentTime", "_lastPos", "_kCoefficent", "_aparentWind", "_changeInVelocity", "_linConversion", "_middlePos", "_middlePosOld", "_middleTotalTravelTime", "_offsetDeg"]; + +_angleDeg = _this select 0; +_muzzleVelocity = _this select 1; +_airFriction = _this select 2; +_temp = _this select 3; +_relDensity = _this select 4; +_tailWind = _this select 5; +_crosswind = _this select 6; +_heightOfTarget = _this select 7; +_timeStep = _this select 8; + +_wind = [_crosswind, _tailWind, 0]; +_gravity = [0,0,-9.8]; + +_currentPos = [0,0,0]; +_muzzleVelocity = _muzzleVelocity * (1 + ((((_temp + 273.13) / 288.13 - 1) / 2.5 + 1 ) - 1)); +_currentVelocity = [0, (_muzzleVelocity * cos _angleDeg), (_muzzleVelocity * sin _angleDeg)]; + +_currentTime = 0; +_lastPos = _currentPos; + +_kCoefficent = -1 * _relDensity * _airFriction; //save time in the loop and compute once + +while {((_currentVelocity select 2) > 0) || ((_currentPos select 2) >= _heightOfTarget)} do { + _lastPos = _currentPos; + + _aparentWind = _wind vectorDiff _currentVelocity; + _changeInVelocity = _gravity vectorAdd (_aparentWind vectorMultiply ((vectorMagnitude _aparentWind) * _kCoefficent)); + + _currentVelocity = _currentVelocity vectorAdd (_changeInVelocity vectorMultiply _timeStep); + + _currentPos = _currentPos vectorAdd (_currentVelocity vectorMultiply _timeStep); + _currentTime = _currentTime + _timeStep; +}; + +//Uses linearConversion to get a weighted average betwen points before and after dropping below target height +_linConversion = linearConversion [(_lastPos select 2), (_currentPos select 2), _heightOfTarget, 0, 1, true]; +_middlePos = (_lastPos vectorMultiply (1 - _linConversion)) vectorAdd (_currentPos vectorMultiply (_linConversion)); +// _middlePosOld = (_lastPos vectorAdd _currentPos) vectorMultiply 0.5; + +//Same to find travel time +_middleTotalTravelTime = _currentTime - (_timeStep * (1-_linConversion)); + +//Find shot offset (from crosswind), in degrees + _offsetDeg = (_middlePos select 0) aTan2 (_middlePos select 1); + +[(_middlePos select 1), _middleTotalTravelTime, _offsetDeg] diff --git a/addons/mk6mortar/functions/fnc_rangeTablePreCalculatedValues.sqf b/addons/mk6mortar/functions/fnc_rangeTablePreCalculatedValues.sqf index ff0f9b5407..d11b9efdeb 100644 --- a/addons/mk6mortar/functions/fnc_rangeTablePreCalculatedValues.sqf +++ b/addons/mk6mortar/functions/fnc_rangeTablePreCalculatedValues.sqf @@ -18,268 +18,77 @@ PARAMS_2(_muzzleVelocity,_airFriction); switch (true) do { -case ((abs(_muzzleVelocity - 60) < 0.00001) && ((abs(_airFriction - -0.0001) < 0.00001))): { +case ((abs(_muzzleVelocity - 70) < 0.00001) && ((abs(_airFriction - -0.0001) < 0.00001))): { [ - ["100","1455","16","12.0","2.4","0.3","-0.2","0.3","-0.3","-0.0","0.0"], - ["150","1379","26","11.8","1.6","0.3","-0.2","0.4","-0.4","-0.0","0.1"], - ["200","1296","39","11.6","1.2","0.4","-0.3","0.5","-0.5","-0.0","0.1"], - ["250","1204","57","11.2","1.0","0.4","-0.3","0.7","-0.7","-0.1","0.1"], - ["300","1089","88","10.6","0.8","0.4","-0.3","0.8","-0.8","-0.1","0.1"], - ["350","894","187","9.3","0.6","0.4","-0.3","0.9","-0.9","-0.1","0.1"] + ["100","1493","9","14.0","3.7","0.4","-0.3","0.3","-0.3","-0.0","0.0"], + ["150","1438","14","13.9","2.5","0.4","-0.4","0.4","-0.4","-0.1","0.0"], + ["200","1381","20","13.8","1.9","0.5","-0.4","0.5","-0.5","-0.1","0.1"], + ["250","1321","27","13.6","1.5","0.5","-0.4","0.7","-0.7","-0.1","0.1"], + ["300","1256","36","13.3","1.3","0.6","-0.5","0.8","-0.8","-0.1","0.1"], + ["350","1183","49","12.9","1.1","0.6","-0.5","0.9","-0.9","-0.1","0.1"], + ["400","1097","70","12.4","0.9","0.6","-0.5","1.1","-1.1","-0.2","0.1"], + ["450","979","113","11.6","0.8","0.6","-0.5","1.2","-1.2","-0.2","0.2"] ] }; -case ((abs(_muzzleVelocity - 120) < 0.00001) && ((abs(_airFriction - -0.0001) < 0.00001))): { +case ((abs(_muzzleVelocity - 200) < 0.00001) && ((abs(_airFriction - -0.0001) < 0.00001))): { [ - ["200","1523","3","23.6","8.2","1.7","-1.6","0.5","-0.5","-0.2","0.2"], - ["250","1503","3","23.5","6.6","1.8","-1.6","0.6","-0.6","-0.2","0.2"], - ["300","1483","4","23.5","5.5","1.8","-1.6","0.7","-0.8","-0.3","0.3"], - ["350","1463","5","23.4","4.7","1.9","-1.7","0.9","-0.9","-0.4","0.3"], - ["400","1443","5","23.4","4.2","1.9","-1.7","1.0","-1.0","-0.4","0.4"], - ["450","1423","6","23.3","3.7","2.0","-1.7","1.1","-1.1","-0.5","0.4"], - ["500","1402","7","23.2","3.4","2.0","-1.8","1.2","-1.3","-0.5","0.5"], - ["550","1381","8","23.1","3.1","2.1","-1.8","1.4","-1.4","-0.6","0.5"], - ["600","1359","9","23.0","2.8","2.2","-1.9","1.5","-1.5","-0.6","0.6"], - ["650","1337","10","22.9","2.6","2.2","-1.9","1.6","-1.6","-0.7","0.7"], - ["700","1314","11","22.7","2.4","2.3","-2.0","1.7","-1.7","-0.7","0.7"], - ["750","1291","13","22.6","2.3","2.4","-2.0","1.9","-1.9","-0.8","0.8"], - ["800","1267","14","22.4","2.1","2.4","-2.1","2.0","-2.0","-0.8","0.8"], - ["850","1241","16","22.2","2.0","2.5","-2.1","2.1","-2.1","-0.9","0.9"], - ["900","1215","17","22.0","1.9","2.5","-2.2","2.2","-2.2","-0.9","0.9"], - ["950","1187","20","21.7","1.8","2.6","-2.3","2.3","-2.4","-1.0","1.0"], - ["1000","1158","23","21.5","1.7","2.6","-2.3","2.5","-2.5","-1.1","1.0"], - ["1050","1127","26","21.1","1.6","2.7","-2.4","2.6","-2.6","-1.1","1.1"], - ["1100","1092","30","20.8","1.5","2.7","-2.4","2.7","-2.8","-1.2","1.1"], - ["1150","1054","36","20.4","1.4","2.7","-2.4","2.9","-2.9","-1.2","1.2"], - ["1200","1011","45","19.8","1.3","2.7","-2.5","3.0","-3.0","-1.3","1.2"], - ["1250","957","59","19.1","1.2","2.7","-2.4","3.1","-3.1","-1.3","1.3"], - ["1300","876","94","18.0","1.1","2.6","-2.4","3.2","-3.3","-1.3","1.3"] + ["450","1527","1","37.3","13.4","6.3","-6.0","1.0","-1.0","-1.0","1.0"], + ["500","1519","1","37.2","12.1","6.3","-6.0","1.1","-1.1","-1.1","1.1"], + ["550","1510","1","37.2","11.0","6.4","-6.0","1.2","-1.2","-1.3","1.2"], + ["600","1502","1","37.2","10.1","6.4","-6.1","1.3","-1.3","-1.4","1.3"], + ["650","1494","1","37.2","9.4","6.5","-6.1","1.4","-1.4","-1.5","1.4"], + ["700","1485","2","37.1","8.7","6.5","-6.2","1.5","-1.5","-1.6","1.5"], + ["750","1477","2","37.1","8.2","6.6","-6.2","1.6","-1.6","-1.7","1.6"], + ["800","1468","2","37.0","7.7","6.7","-6.3","1.7","-1.7","-1.8","1.8"], + ["850","1460","2","37.0","7.2","6.7","-6.3","1.8","-1.8","-2.0","1.9"], + ["900","1451","2","37.0","6.8","6.8","-6.4","1.9","-2.0","-2.1","2.0"], + ["950","1443","2","36.9","6.5","6.9","-6.4","2.0","-2.1","-2.2","2.1"], + ["1000","1434","2","36.9","6.2","6.9","-6.5","2.1","-2.2","-2.3","2.2"], + ["1050","1425","2","36.8","5.9","7.0","-6.6","2.2","-2.3","-2.5","2.3"], + ["1100","1417","3","36.8","5.6","7.1","-6.6","2.3","-2.4","-2.6","2.4"], + ["1150","1408","3","36.7","5.4","7.1","-6.7","2.5","-2.5","-2.7","2.5"], + ["1200","1399","3","36.6","5.2","7.2","-6.7","2.6","-2.6","-2.8","2.7"], + ["1250","1390","3","36.6","5.0","7.3","-6.8","2.7","-2.7","-2.9","2.8"], + ["1300","1381","3","36.5","4.8","7.4","-6.9","2.8","-2.8","-3.0","2.9"], + ["1350","1372","3","36.4","4.6","7.4","-6.9","2.9","-2.9","-3.2","3.0"], + ["1400","1362","4","36.4","4.4","7.5","-7.0","3.0","-3.0","-3.3","3.1"], + ["1450","1353","4","36.3","4.3","7.6","-7.1","3.1","-3.1","-3.4","3.2"], + ["1500","1344","4","36.2","4.2","7.7","-7.1","3.2","-3.2","-3.5","3.4"], + ["1550","1334","4","36.1","4.0","7.7","-7.2","3.3","-3.3","-3.7","3.5"], + ["1600","1324","4","36.0","3.9","7.8","-7.3","3.4","-3.4","-3.8","3.6"], + ["1650","1314","4","35.9","3.8","7.9","-7.3","3.5","-3.5","-3.9","3.7"], + ["1700","1304","5","35.8","3.7","7.9","-7.4","3.6","-3.6","-4.0","3.8"], + ["1750","1294","5","35.7","3.6","8.0","-7.5","3.7","-3.7","-4.2","3.9"], + ["1800","1284","5","35.6","3.5","8.1","-7.6","3.8","-3.9","-4.3","4.0"], + ["1850","1274","5","35.5","3.4","8.2","-7.6","3.9","-4.0","-4.4","4.2"], + ["1900","1263","6","35.4","3.3","8.2","-7.7","4.0","-4.1","-4.5","4.3"], + ["1950","1253","6","35.2","3.2","8.3","-7.8","4.1","-4.2","-4.7","4.4"], + ["2000","1242","6","35.1","3.1","8.4","-7.8","4.3","-4.3","-4.8","4.5"], + ["2050","1231","7","35.0","3.0","8.4","-7.9","4.4","-4.4","-4.9","4.7"], + ["2100","1219","7","34.8","2.9","8.5","-8.0","4.5","-4.5","-5.0","4.8"], + ["2150","1208","7","34.7","2.9","8.5","-8.0","4.6","-4.6","-5.2","4.9"], + ["2200","1196","8","34.5","2.8","8.6","-8.1","4.7","-4.7","-5.3","5.0"], + ["2250","1184","8","34.3","2.7","8.7","-8.2","4.8","-4.8","-5.4","5.1"], + ["2300","1171","9","34.2","2.7","8.7","-8.2","4.9","-4.9","-5.5","5.2"], + ["2350","1158","9","34.0","2.6","8.8","-8.3","5.0","-5.0","-5.7","5.4"], + ["2400","1145","10","33.8","2.5","8.8","-8.3","5.1","-5.1","-5.8","5.5"], + ["2450","1132","10","33.6","2.5","8.9","-8.4","5.2","-5.2","-5.9","5.6"], + ["2500","1118","11","33.3","2.4","8.9","-8.4","5.3","-5.3","-6.0","5.7"], + ["2550","1103","12","33.1","2.4","9.0","-8.5","5.4","-5.4","-6.1","5.8"], + ["2600","1088","13","32.8","2.3","9.0","-8.5","5.5","-5.5","-6.2","5.9"], + ["2650","1072","14","32.6","2.2","9.0","-8.6","5.6","-5.6","-6.4","6.0"], + ["2700","1056","15","32.3","2.2","9.0","-8.6","5.7","-5.8","-6.5","6.1"], + ["2750","1038","16","31.9","2.1","9.1","-8.6","5.9","-5.9","-6.6","6.3"], + ["2800","1020","18","31.6","2.1","9.1","-8.6","6.0","-6.0","-6.7","6.4"], + ["2850","1000","20","31.2","2.0","9.1","-8.6","6.1","-6.1","-6.8","6.5"], + ["2900","978","22","30.8","1.9","9.0","-8.6","6.2","-6.2","-6.9","6.5"], + ["2950","954","26","30.3","1.9","9.0","-8.6","6.3","-6.3","-7.0","6.6"], + ["3000","927","31","29.7","1.8","8.9","-8.5","6.4","-6.4","-7.1","6.7"], + ["3050","894","38","29.0","1.7","8.8","-8.4","6.5","-6.6","-7.2","6.8"], + ["3100","849","54","27.9","1.6","8.5","-8.3","6.6","-6.7","-7.2","6.8"] ] }; -case ((abs(_muzzleVelocity - 180) < 0.00001) && ((abs(_airFriction - -0.0001) < 0.00001))): { - [ - ["400","1523","1","34.0","11.7","4.9","-4.6","0.9","-0.9","-0.8","0.8"], - ["450","1513","1","34.0","10.5","4.9","-4.7","1.0","-1.0","-0.9","0.8"], - ["500","1504","2","34.0","9.4","5.0","-4.7","1.1","-1.1","-1.0","0.9"], - ["550","1494","2","33.9","8.6","5.1","-4.7","1.2","-1.2","-1.1","1.0"], - ["600","1484","2","33.9","7.9","5.1","-4.8","1.3","-1.4","-1.2","1.1"], - ["650","1474","2","33.9","7.3","5.2","-4.8","1.5","-1.5","-1.3","1.2"], - ["700","1464","2","33.8","6.8","5.2","-4.9","1.6","-1.6","-1.4","1.3"], - ["750","1454","2","33.8","6.3","5.3","-4.9","1.7","-1.7","-1.5","1.4"], - ["800","1444","3","33.7","6.0","5.4","-5.0","1.8","-1.8","-1.6","1.5"], - ["850","1433","3","33.7","5.6","5.4","-5.0","1.9","-1.9","-1.7","1.6"], - ["900","1423","3","33.6","5.3","5.5","-5.1","2.0","-2.0","-1.8","1.7"], - ["950","1413","3","33.6","5.0","5.6","-5.1","2.1","-2.1","-1.9","1.8"], - ["1000","1402","3","33.5","4.8","5.6","-5.2","2.2","-2.2","-2.0","1.9"], - ["1050","1392","4","33.4","4.6","5.7","-5.3","2.3","-2.4","-2.1","2.0"], - ["1100","1381","4","33.3","4.4","5.8","-5.3","2.5","-2.5","-2.2","2.1"], - ["1150","1370","4","33.3","4.2","5.8","-5.4","2.6","-2.6","-2.3","2.2"], - ["1200","1359","4","33.2","4.0","5.9","-5.5","2.7","-2.7","-2.4","2.3"], - ["1250","1348","5","33.1","3.9","6.0","-5.5","2.8","-2.8","-2.5","2.4"], - ["1300","1337","5","33.0","3.7","6.1","-5.6","2.9","-2.9","-2.6","2.5"], - ["1350","1326","5","32.9","3.6","6.1","-5.6","3.0","-3.0","-2.7","2.6"], - ["1400","1314","5","32.8","3.5","6.2","-5.7","3.1","-3.1","-2.8","2.7"], - ["1450","1302","6","32.7","3.3","6.3","-5.8","3.2","-3.2","-2.9","2.8"], - ["1500","1290","6","32.6","3.2","6.3","-5.9","3.3","-3.4","-3.1","2.9"], - ["1550","1278","6","32.5","3.1","6.4","-5.9","3.4","-3.5","-3.2","3.0"], - ["1600","1266","7","32.3","3.0","6.5","-6.0","3.5","-3.6","-3.3","3.1"], - ["1650","1253","7","32.2","2.9","6.6","-6.1","3.7","-3.7","-3.4","3.2"], - ["1700","1240","8","32.0","2.8","6.6","-6.1","3.8","-3.8","-3.5","3.3"], - ["1750","1227","8","31.9","2.8","6.7","-6.2","3.9","-3.9","-3.6","3.4"], - ["1800","1214","9","31.7","2.7","6.7","-6.3","4.0","-4.0","-3.7","3.5"], - ["1850","1200","9","31.6","2.6","6.8","-6.3","4.1","-4.1","-3.8","3.6"], - ["1900","1186","10","31.4","2.5","6.9","-6.4","4.2","-4.2","-3.9","3.7"], - ["1950","1171","10","31.2","2.4","6.9","-6.5","4.3","-4.3","-4.0","3.8"], - ["2000","1156","11","31.0","2.4","7.0","-6.5","4.4","-4.4","-4.1","3.9"], - ["2050","1141","12","30.8","2.3","7.0","-6.6","4.5","-4.6","-4.2","4.0"], - ["2100","1124","13","30.5","2.2","7.1","-6.6","4.7","-4.7","-4.3","4.1"], - ["2150","1108","14","30.3","2.2","7.1","-6.6","4.8","-4.8","-4.4","4.2"], - ["2200","1090","15","30.0","2.1","7.2","-6.7","4.9","-4.9","-4.5","4.3"], - ["2250","1071","17","29.7","2.0","7.2","-6.7","5.0","-5.0","-4.6","4.4"], - ["2300","1052","18","29.4","2.0","7.2","-6.8","5.1","-5.1","-4.7","4.5"], - ["2350","1030","20","29.0","1.9","7.2","-6.8","5.2","-5.2","-4.8","4.6"], - ["2400","1008","23","28.6","1.9","7.2","-6.8","5.3","-5.3","-4.9","4.7"], - ["2450","983","26","28.2","1.8","7.2","-6.8","5.4","-5.4","-5.0","4.8"], - ["2500","954","31","27.6","1.7","7.1","-6.8","5.6","-5.6","-5.1","4.9"], - ["2550","921","38","27.0","1.6","7.1","-6.7","5.7","-5.7","-5.2","4.9"], - ["2600","878","52","26.1","1.5","6.9","-6.6","5.8","-5.8","-5.2","5.0"] - ] - }; -case ((abs(_muzzleVelocity - 240) < 0.00001) && ((abs(_airFriction - -0.0001) < 0.00001))): { - [ - ["600","1526","1","43.3","15.3","9.5","-9.1","1.2","-1.2","-1.8","1.7"], - ["650","1519","1","43.3","14.1","9.5","-9.2","1.3","-1.3","-1.9","1.8"], - ["700","1513","1","43.3","13.2","9.6","-9.2","1.4","-1.4","-2.1","1.9"], - ["750","1507","1","43.2","12.3","9.6","-9.2","1.5","-1.5","-2.2","2.1"], - ["800","1500","1","43.2","11.5","9.7","-9.3","1.6","-1.6","-2.4","2.2"], - ["850","1494","1","43.2","10.9","9.7","-9.3","1.7","-1.7","-2.5","2.4"], - ["900","1488","1","43.2","10.3","9.8","-9.4","1.8","-1.8","-2.7","2.5"], - ["950","1481","1","43.1","9.8","9.9","-9.4","1.9","-1.9","-2.8","2.7"], - ["1000","1475","1","43.1","9.3","9.9","-9.5","2.0","-2.0","-3.0","2.8"], - ["1050","1468","1","43.1","8.9","10.0","-9.5","2.1","-2.1","-3.1","2.9"], - ["1100","1462","1","43.0","8.5","10.1","-9.6","2.2","-2.2","-3.3","3.1"], - ["1150","1455","1","43.0","8.1","10.1","-9.6","2.3","-2.3","-3.4","3.2"], - ["1200","1449","1","43.0","7.8","10.2","-9.7","2.4","-2.4","-3.6","3.4"], - ["1250","1442","2","42.9","7.5","10.3","-9.8","2.5","-2.5","-3.7","3.5"], - ["1300","1436","2","42.9","7.2","10.3","-9.8","2.6","-2.6","-3.9","3.6"], - ["1350","1429","2","42.8","6.9","10.4","-9.9","2.7","-2.7","-4.0","3.8"], - ["1400","1422","2","42.8","6.7","10.5","-10.0","2.8","-2.8","-4.2","3.9"], - ["1450","1416","2","42.7","6.5","10.5","-10.0","2.9","-2.9","-4.4","4.1"], - ["1500","1409","2","42.7","6.2","10.6","-10.1","3.0","-3.0","-4.5","4.2"], - ["1550","1402","2","42.6","6.0","10.7","-10.2","3.0","-3.1","-4.7","4.4"], - ["1600","1395","2","42.6","5.9","10.8","-10.2","3.1","-3.2","-4.8","4.5"], - ["1650","1388","2","42.5","5.7","10.8","-10.3","3.2","-3.3","-5.0","4.7"], - ["1700","1381","2","42.4","5.5","10.9","-10.4","3.3","-3.3","-5.1","4.8"], - ["1750","1374","2","42.4","5.4","11.0","-10.4","3.4","-3.4","-5.3","4.9"], - ["1800","1367","2","42.3","5.2","11.0","-10.5","3.5","-3.5","-5.4","5.1"], - ["1850","1360","3","42.2","5.1","11.1","-10.6","3.6","-3.6","-5.6","5.2"], - ["1900","1353","3","42.2","5.0","11.2","-10.6","3.7","-3.7","-5.8","5.4"], - ["1950","1346","3","42.1","4.8","11.3","-10.7","3.8","-3.8","-5.9","5.5"], - ["2000","1338","3","42.0","4.7","11.3","-10.8","3.9","-3.9","-6.1","5.7"], - ["2050","1331","3","41.9","4.6","11.4","-10.9","4.0","-4.0","-6.2","5.8"], - ["2100","1323","3","41.9","4.5","11.5","-10.9","4.1","-4.1","-6.4","6.0"], - ["2150","1316","3","41.8","4.4","11.6","-11.0","4.2","-4.2","-6.5","6.1"], - ["2200","1308","3","41.7","4.3","11.6","-11.1","4.3","-4.3","-6.7","6.3"], - ["2250","1301","3","41.6","4.2","11.7","-11.1","4.4","-4.4","-6.9","6.4"], - ["2300","1293","4","41.5","4.1","11.8","-11.2","4.5","-4.5","-7.0","6.6"], - ["2350","1285","4","41.4","4.0","11.9","-11.3","4.6","-4.6","-7.2","6.7"], - ["2400","1277","4","41.3","3.9","11.9","-11.3","4.7","-4.7","-7.3","6.9"], - ["2450","1269","4","41.2","3.8","12.0","-11.4","4.8","-4.8","-7.5","7.0"], - ["2500","1261","4","41.1","3.8","12.1","-11.5","4.9","-4.9","-7.7","7.1"], - ["2550","1253","4","41.0","3.7","12.1","-11.6","5.0","-5.0","-7.8","7.3"], - ["2600","1244","4","40.9","3.6","12.2","-11.6","5.1","-5.1","-8.0","7.4"], - ["2650","1236","5","40.7","3.5","12.3","-11.7","5.2","-5.2","-8.1","7.6"], - ["2700","1227","5","40.6","3.5","12.3","-11.8","5.3","-5.3","-8.3","7.7"], - ["2750","1219","5","40.5","3.4","12.4","-11.8","5.4","-5.4","-8.4","7.9"], - ["2800","1210","5","40.3","3.3","12.5","-11.9","5.5","-5.5","-8.6","8.0"], - ["2850","1201","5","40.2","3.3","12.5","-12.0","5.6","-5.6","-8.8","8.2"], - ["2900","1192","6","40.1","3.2","12.6","-12.0","5.7","-5.7","-8.9","8.3"], - ["2950","1182","6","39.9","3.1","12.6","-12.1","5.8","-5.8","-9.1","8.5"], - ["3000","1173","6","39.7","3.1","12.7","-12.2","5.9","-5.9","-9.2","8.6"], - ["3050","1163","6","39.6","3.0","12.7","-12.2","6.0","-6.0","-9.4","8.8"], - ["3100","1153","7","39.4","3.0","12.8","-12.3","6.1","-6.0","-9.5","8.9"], - ["3150","1143","7","39.2","2.9","12.8","-12.3","6.1","-6.2","-9.7","9.0"], - ["3200","1133","7","39.0","2.9","12.9","-12.4","6.3","-6.2","-9.8","9.2"], - ["3250","1122","8","38.8","2.8","12.9","-12.4","6.4","-6.3","-10.0","9.3"], - ["3300","1111","8","38.6","2.7","13.0","-12.5","6.4","-6.4","-10.2","9.5"], - ["3350","1100","9","38.4","2.7","13.0","-12.5","6.5","-6.5","-10.3","9.6"], - ["3400","1088","9","38.2","2.6","13.0","-12.5","6.6","-6.6","-10.5","9.8"], - ["3450","1076","10","38.0","2.6","13.0","-12.6","6.7","-6.7","-10.6","9.9"], - ["3500","1064","10","37.7","2.5","13.1","-12.6","6.9","-6.8","-10.7","10.0"], - ["3550","1051","11","37.4","2.5","13.1","-12.6","7.0","-6.9","-10.9","10.2"], - ["3600","1038","12","37.2","2.4","13.1","-12.6","7.0","-7.0","-11.0","10.3"], - ["3650","1024","13","36.9","2.4","13.1","-12.6","7.2","-7.1","-11.2","10.4"], - ["3700","1009","14","36.5","2.3","13.1","-12.6","7.2","-7.3","-11.3","10.5"], - ["3750","993","15","36.2","2.3","13.0","-12.6","7.4","-7.3","-11.4","10.7"], - ["3800","977","16","35.8","2.2","13.0","-12.6","7.5","-7.5","-11.6","10.8"], - ["3850","959","18","35.4","2.2","13.0","-12.6","7.6","-7.6","-11.7","10.9"], - ["3900","940","20","34.9","2.1","12.9","-12.5","7.7","-7.7","-11.8","11.0"], - ["3950","918","23","34.4","2.0","12.8","-12.4","7.8","-7.8","-11.9","11.1"], - ["4000","893","28","33.7","2.0","12.7","-12.3","7.9","-7.9","-12.0","11.2"], - ["4050","863","35","32.9","1.9","12.5","-12.1","8.0","-8.0","-12.0","11.2"], - ["4100","821","50","31.8","1.8","12.1","-11.8","8.2","-8.2","-12.0","11.2"] - ] - }; -case ((abs(_muzzleVelocity - 300) < 0.00001) && ((abs(_airFriction - -0.0001) < 0.00001))): { - [ - ["800","1527","0","51.4","18.2","15.0","-14.6","1.4","-1.4","-3.1","2.9"], - ["850","1522","1","51.4","17.2","15.0","-14.6","1.5","-1.5","-3.3","3.0"], - ["900","1517","1","51.4","16.2","15.0","-14.7","1.6","-1.6","-3.5","3.2"], - ["950","1513","1","51.4","15.4","15.1","-14.7","1.7","-1.6","-3.7","3.4"], - ["1000","1508","1","51.4","14.7","15.2","-14.8","1.7","-1.7","-3.9","3.6"], - ["1050","1503","1","51.3","14.0","15.2","-14.8","1.8","-1.8","-4.1","3.8"], - ["1100","1498","1","51.3","13.4","15.3","-14.8","1.9","-1.9","-4.3","3.9"], - ["1150","1494","1","51.3","12.8","15.3","-14.9","2.0","-2.0","-4.5","4.1"], - ["1200","1489","1","51.3","12.3","15.4","-14.9","2.1","-2.1","-4.7","4.3"], - ["1250","1484","1","51.2","11.8","15.5","-15.0","2.2","-2.2","-4.9","4.5"], - ["1300","1479","1","51.2","11.3","15.5","-15.0","2.3","-2.3","-5.1","4.7"], - ["1350","1475","1","51.2","10.9","15.6","-15.1","2.3","-2.3","-5.3","4.8"], - ["1400","1470","1","51.2","10.6","15.6","-15.1","2.4","-2.4","-5.5","5.0"], - ["1450","1465","1","51.1","10.2","15.7","-15.2","2.5","-2.5","-5.7","5.2"], - ["1500","1460","1","51.1","9.9","15.8","-15.3","2.6","-2.6","-5.9","5.4"], - ["1550","1455","1","51.1","9.5","15.8","-15.3","2.7","-2.7","-6.1","5.6"], - ["1600","1451","1","51.0","9.3","15.9","-15.4","2.8","-2.8","-6.3","5.8"], - ["1650","1446","1","51.0","9.0","16.0","-15.4","2.9","-2.9","-6.5","5.9"], - ["1700","1441","1","51.0","8.7","16.0","-15.5","3.0","-2.9","-6.7","6.1"], - ["1750","1436","1","50.9","8.5","16.1","-15.6","3.0","-3.0","-6.9","6.3"], - ["1800","1431","1","50.9","8.2","16.2","-15.6","3.1","-3.1","-7.1","6.5"], - ["1850","1426","1","50.8","8.0","16.2","-15.7","3.2","-3.2","-7.3","6.7"], - ["1900","1421","1","50.8","7.8","16.3","-15.8","3.3","-3.3","-7.5","6.9"], - ["1950","1416","1","50.7","7.6","16.4","-15.8","3.4","-3.4","-7.7","7.1"], - ["2000","1411","1","50.7","7.4","16.4","-15.9","3.5","-3.5","-7.9","7.2"], - ["2050","1406","1","50.7","7.3","16.5","-15.9","3.6","-3.5","-8.1","7.4"], - ["2100","1401","1","50.6","7.1","16.6","-16.0","3.6","-3.6","-8.3","7.6"], - ["2150","1396","1","50.6","6.9","16.6","-16.1","3.7","-3.7","-8.5","7.8"], - ["2200","1390","1","50.5","6.8","16.7","-16.1","3.8","-3.8","-8.7","8.0"], - ["2250","1385","2","50.5","6.6","16.8","-16.2","3.9","-3.9","-8.9","8.2"], - ["2300","1380","2","50.4","6.5","16.9","-16.3","4.0","-4.0","-9.1","8.3"], - ["2350","1375","2","50.3","6.3","16.9","-16.4","4.1","-4.1","-9.3","8.5"], - ["2400","1370","2","50.3","6.2","17.0","-16.4","4.2","-4.1","-9.5","8.7"], - ["2450","1364","2","50.2","6.1","17.1","-16.5","4.2","-4.2","-9.7","8.9"], - ["2500","1359","2","50.2","6.0","17.1","-16.6","4.3","-4.3","-9.9","9.1"], - ["2550","1354","2","50.1","5.8","17.2","-16.6","4.4","-4.4","-10.1","9.3"], - ["2600","1348","2","50.0","5.7","17.3","-16.7","4.5","-4.5","-10.3","9.5"], - ["2650","1343","2","50.0","5.6","17.3","-16.8","4.6","-4.6","-10.5","9.6"], - ["2700","1337","2","49.9","5.5","17.4","-16.8","4.7","-4.7","-10.7","9.8"], - ["2750","1332","2","49.8","5.4","17.5","-16.9","4.8","-4.7","-10.9","10.0"], - ["2800","1326","2","49.8","5.3","17.6","-17.0","4.8","-4.8","-11.1","10.2"], - ["2850","1321","2","49.7","5.2","17.6","-17.0","4.9","-4.9","-11.3","10.4"], - ["2900","1315","2","49.6","5.1","17.7","-17.1","5.0","-5.0","-11.5","10.6"], - ["2950","1309","2","49.5","5.0","17.8","-17.2","5.1","-5.1","-11.7","10.8"], - ["3000","1304","2","49.5","5.0","17.8","-17.3","5.2","-5.2","-11.9","10.9"], - ["3050","1298","2","49.4","4.9","17.9","-17.3","5.3","-5.2","-12.1","11.1"], - ["3100","1292","2","49.3","4.8","18.0","-17.4","5.3","-5.3","-12.3","11.3"], - ["3150","1286","3","49.2","4.7","18.0","-17.5","5.4","-5.4","-12.5","11.5"], - ["3200","1280","3","49.1","4.6","18.1","-17.5","5.5","-5.5","-12.7","11.7"], - ["3250","1274","3","49.0","4.6","18.2","-17.6","5.6","-5.6","-12.9","11.9"], - ["3300","1268","3","48.9","4.5","18.2","-17.7","5.7","-5.6","-13.1","12.1"], - ["3350","1262","3","48.8","4.4","18.3","-17.7","5.8","-5.7","-13.3","12.2"], - ["3400","1256","3","48.7","4.4","18.4","-17.8","5.9","-5.8","-13.5","12.4"], - ["3450","1250","3","48.6","4.3","18.4","-17.9","5.9","-5.9","-13.8","12.6"], - ["3500","1244","3","48.5","4.2","18.5","-17.9","6.0","-6.0","-14.0","12.8"], - ["3550","1237","3","48.4","4.2","18.6","-18.0","6.1","-6.1","-14.2","13.0"], - ["3600","1231","3","48.3","4.1","18.6","-18.1","6.2","-6.2","-14.4","13.2"], - ["3650","1224","3","48.2","4.0","18.7","-18.1","6.3","-6.3","-14.6","13.4"], - ["3700","1218","3","48.1","4.0","18.7","-18.2","6.4","-6.3","-14.8","13.5"], - ["3750","1211","4","48.0","3.9","18.8","-18.2","6.5","-6.4","-15.0","13.7"], - ["3800","1205","4","47.8","3.9","18.8","-18.3","6.5","-6.5","-15.2","13.9"], - ["3850","1198","4","47.7","3.8","18.9","-18.4","6.6","-6.6","-15.4","14.1"], - ["3900","1191","4","47.6","3.7","18.9","-18.4","6.7","-6.7","-15.6","14.3"], - ["3950","1184","4","47.5","3.7","19.0","-18.5","6.8","-6.8","-15.8","14.5"], - ["4000","1177","4","47.3","3.6","19.1","-18.5","6.9","-6.8","-16.0","14.7"], - ["4050","1170","4","47.2","3.6","19.1","-18.6","7.0","-6.9","-16.2","14.8"], - ["4100","1163","4","47.0","3.5","19.1","-18.6","7.1","-7.0","-16.4","15.0"], - ["4150","1155","5","46.9","3.5","19.2","-18.7","7.1","-7.1","-16.6","15.2"], - ["4200","1148","5","46.7","3.4","19.2","-18.7","7.2","-7.2","-16.8","15.4"], - ["4250","1140","5","46.6","3.4","19.3","-18.8","7.3","-7.3","-17.0","15.6"], - ["4300","1132","5","46.4","3.3","19.3","-18.8","7.4","-7.4","-17.2","15.7"], - ["4350","1124","5","46.2","3.3","19.3","-18.8","7.5","-7.5","-17.4","15.9"], - ["4400","1116","5","46.1","3.2","19.4","-18.9","7.6","-7.5","-17.6","16.1"], - ["4450","1108","6","45.9","3.2","19.4","-18.9","7.7","-7.6","-17.8","16.3"], - ["4500","1100","6","45.7","3.1","19.4","-19.0","7.8","-7.7","-17.9","16.4"], - ["4550","1091","6","45.5","3.1","19.4","-19.0","7.8","-7.8","-18.1","16.6"], - ["4600","1083","6","45.3","3.1","19.5","-19.0","7.9","-7.9","-18.3","16.8"], - ["4650","1074","7","45.1","3.0","19.5","-19.0","8.0","-8.0","-18.5","17.0"], - ["4700","1065","7","44.9","3.0","19.5","-19.1","8.1","-8.1","-18.7","17.1"], - ["4750","1055","7","44.6","2.9","19.5","-19.1","8.2","-8.2","-18.9","17.3"], - ["4800","1046","8","44.4","2.9","19.5","-19.1","8.3","-8.3","-19.1","17.5"], - ["4850","1036","8","44.2","2.8","19.5","-19.1","8.4","-8.3","-19.2","17.6"], - ["4900","1025","8","43.9","2.8","19.5","-19.1","8.5","-8.4","-19.4","17.8"], - ["4950","1015","9","43.6","2.7","19.5","-19.1","8.6","-8.5","-19.6","18.0"], - ["5000","1004","9","43.3","2.7","19.4","-19.1","8.7","-8.6","-19.8","18.1"], - ["5050","992","10","43.0","2.6","19.4","-19.0","8.8","-8.7","-19.9","18.3"], - ["5100","980","11","42.7","2.6","19.4","-19.0","8.9","-8.8","-20.1","18.4"], - ["5150","968","11","42.4","2.5","19.3","-18.9","9.0","-8.9","-20.2","18.6"], - ["5200","955","12","42.0","2.5","19.2","-18.9","9.1","-9.0","-20.4","18.7"], - ["5250","941","13","41.6","2.4","19.2","-18.8","9.1","-9.1","-20.6","18.8"], - ["5300","926","15","41.2","2.4","19.1","-18.8","9.2","-9.2","-20.7","19.0"], - ["5350","910","16","40.7","2.3","19.0","-18.6","9.4","-9.3","-20.8","19.1"], - ["5400","892","18","40.2","2.3","18.8","-18.5","9.5","-9.4","-20.9","19.2"], - ["5450","872","21","39.6","2.2","18.6","-18.3","9.6","-9.5","-21.0","19.3"], - ["5500","849","26","38.8","2.1","18.4","-18.1","9.7","-9.7","-21.1","19.3"], - ["5550","820","33","37.9","2.1","18.0","-17.8","9.8","-9.8","-21.1","19.4"] - ] - }; default {systemChat "Error: MuzzleVelocity not found in LUT"; []}; }; \ No newline at end of file From c768ef65b2970c078d3486593ba885d610df37e1 Mon Sep 17 00:00:00 2001 From: PabstMirror Date: Sun, 5 Apr 2015 17:07:55 -0500 Subject: [PATCH 11/22] Tweaking PowderEffects/AirRestitance --- .../fnc_dev_simulateCalcRangeTableLine.sqf | 14 +- .../functions/fnc_dev_simulateShot.sqf | 2 +- .../mk6mortar/functions/fnc_handleFired.sqf | 25 ++- .../fnc_rangeTablePreCalculatedValues.sqf | 146 +++++++++++------- addons/mk6mortar/script_component.hpp | 2 +- 5 files changed, 121 insertions(+), 68 deletions(-) diff --git a/addons/mk6mortar/functions/fnc_dev_simulateCalcRangeTableLine.sqf b/addons/mk6mortar/functions/fnc_dev_simulateCalcRangeTableLine.sqf index 24ebd909ed..b30c542930 100644 --- a/addons/mk6mortar/functions/fnc_dev_simulateCalcRangeTableLine.sqf +++ b/addons/mk6mortar/functions/fnc_dev_simulateCalcRangeTableLine.sqf @@ -4,19 +4,19 @@ Name: AGM_Artillery_fnc_simulateCalcRangeTableLine Author: Pabst Mirror Description: - Builds a rangeTable line for a certian range, given muzzle velocity and air friction, returns [] if out of range. +Builds a rangeTable line for a certian range, given muzzle velocity and air friction, returns [] if out of range. Parameters: - 0: NUMBER - Muzzle Velocity - 1: NUMBER - Air Friction - 2: NUMBER - Range To Hit +0: NUMBER - Muzzle Velocity +1: NUMBER - Air Friction +2: NUMBER - Range To Hit Returns: - ARRAY - Range Table Line Data (see return line) +ARRAY - Range Table Line Data (see return line) Example: - [300, -0.0001, 3000] call AGM_Artillery_fnc_simulateCalcRangeTableLine -*/ +[300, -0.0001, 3000] call AGM_Artillery_fnc_simulateCalcRangeTableLine + */ #include "script_component.hpp" #define TIME_STEP (1/50) diff --git a/addons/mk6mortar/functions/fnc_dev_simulateShot.sqf b/addons/mk6mortar/functions/fnc_dev_simulateShot.sqf index a6c3761acb..170d23321a 100644 --- a/addons/mk6mortar/functions/fnc_dev_simulateShot.sqf +++ b/addons/mk6mortar/functions/fnc_dev_simulateShot.sqf @@ -44,7 +44,7 @@ _wind = [_crosswind, _tailWind, 0]; _gravity = [0,0,-9.8]; _currentPos = [0,0,0]; -_muzzleVelocity = _muzzleVelocity * (1 + ((((_temp + 273.13) / 288.13 - 1) / 2.5 + 1 ) - 1)); +_muzzleVelocity = _muzzleVelocity * (((_temp + 273.13) / 288.13 - 1) / 30 + 1); _currentVelocity = [0, (_muzzleVelocity * cos _angleDeg), (_muzzleVelocity * sin _angleDeg)]; _currentTime = 0; diff --git a/addons/mk6mortar/functions/fnc_handleFired.sqf b/addons/mk6mortar/functions/fnc_handleFired.sqf index 41929110d7..ae20b62b64 100644 --- a/addons/mk6mortar/functions/fnc_handleFired.sqf +++ b/addons/mk6mortar/functions/fnc_handleFired.sqf @@ -29,6 +29,27 @@ if (!GVAR(airResistanceEnabled)) exitWith {}; if (_unit distance ACE_player > 3000) exitWith {false}; // Large enough distance to not simulate any wind deflection. if (!GVAR(EnableForAI) && !([_unit] call EFUNC(common,isPlayer))) exitWith {false}; +//Hack Until these are intergrated: +if (isNil QEGVAR(weather,currentRelativeDensity)) then { + EGVAR(weather,currentRelativeDensity) = 1; +}; +if (isNil QEGVAR(weather,currentTemperature)) then { + EGVAR(weather,currentTemperature) = 20; +}; + +//powder effects: +_temperature = EGVAR(weather,currentTemperature); +_newMuzzleVelocityCoefficent = (((_temperature + 273.13) / 288.13 - 1) / 30 + 1); +if (_newMuzzleVelocityCoefficent != 1) then { + _bulletVelocity = velocity _projectile; + systemChat format ["Start Vel: %1", _bulletVelocity]; + _bulletSpeed = vectorMagnitude _bulletVelocity; + _bulletVelocity = (vectorNormalized _bulletVelocity) vectorMultiply (_bulletSpeed * _newMuzzleVelocityCoefficent); + systemChat format ["New Vel: %1", _bulletVelocity]; + _projectile setVelocity _bulletVelocity; + _muzzleVelocity = _muzzleVelocity + _muzzleVelocityShift; +}; + // if (_bullet isKindOf "BulletBase") then { [{ @@ -54,7 +75,7 @@ if (!GVAR(EnableForAI) && !([_unit] call EFUNC(common,isPlayer))) exitWith {fals // _accelRef = (vectorNormalized _bulletVelocity) vectorMultiply (_dragRef); // _bulletVelocity = _bulletVelocity vectorDiff _accelRef; - _drag = _deltaT * _airFriction * _trueSpeed; + _drag = _deltaT * _airFriction * _trueSpeed * EGVAR(weather,currentRelativeDensity); _accel = _trueVelocity vectorMultiply (_drag); _bulletVelocity = _bulletVelocity vectorAdd _accel; @@ -62,6 +83,6 @@ if (!GVAR(EnableForAI) && !([_unit] call EFUNC(common,isPlayer))) exitWith {fals _shell setVelocity _bulletVelocity; // TODO expand with advanced ballistics functionality. -}, 0, [_projectile, -0.0001, time]] call CBA_fnc_addPerFrameHandler; +}, 0, [_projectile, MK6_82mm_AIR_FRICTION, time]] call CBA_fnc_addPerFrameHandler; // }; diff --git a/addons/mk6mortar/functions/fnc_rangeTablePreCalculatedValues.sqf b/addons/mk6mortar/functions/fnc_rangeTablePreCalculatedValues.sqf index d11b9efdeb..3479e8cfa7 100644 --- a/addons/mk6mortar/functions/fnc_rangeTablePreCalculatedValues.sqf +++ b/addons/mk6mortar/functions/fnc_rangeTablePreCalculatedValues.sqf @@ -30,65 +30,97 @@ case ((abs(_muzzleVelocity - 70) < 0.00001) && ((abs(_airFriction - -0.0001) < 0 ["450","979","113","11.6","0.8","0.6","-0.5","1.2","-1.2","-0.2","0.2"] ] }; - -case ((abs(_muzzleVelocity - 200) < 0.00001) && ((abs(_airFriction - -0.0001) < 0.00001))): { +case ((abs(_muzzleVelocity - 140) < 0.00001) && ((abs(_airFriction - -0.0001) < 0.00001))): { [ - ["450","1527","1","37.3","13.4","6.3","-6.0","1.0","-1.0","-1.0","1.0"], - ["500","1519","1","37.2","12.1","6.3","-6.0","1.1","-1.1","-1.1","1.1"], - ["550","1510","1","37.2","11.0","6.4","-6.0","1.2","-1.2","-1.3","1.2"], - ["600","1502","1","37.2","10.1","6.4","-6.1","1.3","-1.3","-1.4","1.3"], - ["650","1494","1","37.2","9.4","6.5","-6.1","1.4","-1.4","-1.5","1.4"], - ["700","1485","2","37.1","8.7","6.5","-6.2","1.5","-1.5","-1.6","1.5"], - ["750","1477","2","37.1","8.2","6.6","-6.2","1.6","-1.6","-1.7","1.6"], - ["800","1468","2","37.0","7.7","6.7","-6.3","1.7","-1.7","-1.8","1.8"], - ["850","1460","2","37.0","7.2","6.7","-6.3","1.8","-1.8","-2.0","1.9"], - ["900","1451","2","37.0","6.8","6.8","-6.4","1.9","-2.0","-2.1","2.0"], - ["950","1443","2","36.9","6.5","6.9","-6.4","2.0","-2.1","-2.2","2.1"], - ["1000","1434","2","36.9","6.2","6.9","-6.5","2.1","-2.2","-2.3","2.2"], - ["1050","1425","2","36.8","5.9","7.0","-6.6","2.2","-2.3","-2.5","2.3"], - ["1100","1417","3","36.8","5.6","7.1","-6.6","2.3","-2.4","-2.6","2.4"], - ["1150","1408","3","36.7","5.4","7.1","-6.7","2.5","-2.5","-2.7","2.5"], - ["1200","1399","3","36.6","5.2","7.2","-6.7","2.6","-2.6","-2.8","2.7"], - ["1250","1390","3","36.6","5.0","7.3","-6.8","2.7","-2.7","-2.9","2.8"], - ["1300","1381","3","36.5","4.8","7.4","-6.9","2.8","-2.8","-3.0","2.9"], - ["1350","1372","3","36.4","4.6","7.4","-6.9","2.9","-2.9","-3.2","3.0"], - ["1400","1362","4","36.4","4.4","7.5","-7.0","3.0","-3.0","-3.3","3.1"], - ["1450","1353","4","36.3","4.3","7.6","-7.1","3.1","-3.1","-3.4","3.2"], - ["1500","1344","4","36.2","4.2","7.7","-7.1","3.2","-3.2","-3.5","3.4"], - ["1550","1334","4","36.1","4.0","7.7","-7.2","3.3","-3.3","-3.7","3.5"], - ["1600","1324","4","36.0","3.9","7.8","-7.3","3.4","-3.4","-3.8","3.6"], - ["1650","1314","4","35.9","3.8","7.9","-7.3","3.5","-3.5","-3.9","3.7"], - ["1700","1304","5","35.8","3.7","7.9","-7.4","3.6","-3.6","-4.0","3.8"], - ["1750","1294","5","35.7","3.6","8.0","-7.5","3.7","-3.7","-4.2","3.9"], - ["1800","1284","5","35.6","3.5","8.1","-7.6","3.8","-3.9","-4.3","4.0"], - ["1850","1274","5","35.5","3.4","8.2","-7.6","3.9","-4.0","-4.4","4.2"], - ["1900","1263","6","35.4","3.3","8.2","-7.7","4.0","-4.1","-4.5","4.3"], - ["1950","1253","6","35.2","3.2","8.3","-7.8","4.1","-4.2","-4.7","4.4"], - ["2000","1242","6","35.1","3.1","8.4","-7.8","4.3","-4.3","-4.8","4.5"], - ["2050","1231","7","35.0","3.0","8.4","-7.9","4.4","-4.4","-4.9","4.7"], - ["2100","1219","7","34.8","2.9","8.5","-8.0","4.5","-4.5","-5.0","4.8"], - ["2150","1208","7","34.7","2.9","8.5","-8.0","4.6","-4.6","-5.2","4.9"], - ["2200","1196","8","34.5","2.8","8.6","-8.1","4.7","-4.7","-5.3","5.0"], - ["2250","1184","8","34.3","2.7","8.7","-8.2","4.8","-4.8","-5.4","5.1"], - ["2300","1171","9","34.2","2.7","8.7","-8.2","4.9","-4.9","-5.5","5.2"], - ["2350","1158","9","34.0","2.6","8.8","-8.3","5.0","-5.0","-5.7","5.4"], - ["2400","1145","10","33.8","2.5","8.8","-8.3","5.1","-5.1","-5.8","5.5"], - ["2450","1132","10","33.6","2.5","8.9","-8.4","5.2","-5.2","-5.9","5.6"], - ["2500","1118","11","33.3","2.4","8.9","-8.4","5.3","-5.3","-6.0","5.7"], - ["2550","1103","12","33.1","2.4","9.0","-8.5","5.4","-5.4","-6.1","5.8"], - ["2600","1088","13","32.8","2.3","9.0","-8.5","5.5","-5.5","-6.2","5.9"], - ["2650","1072","14","32.6","2.2","9.0","-8.6","5.6","-5.6","-6.4","6.0"], - ["2700","1056","15","32.3","2.2","9.0","-8.6","5.7","-5.8","-6.5","6.1"], - ["2750","1038","16","31.9","2.1","9.1","-8.6","5.9","-5.9","-6.6","6.3"], - ["2800","1020","18","31.6","2.1","9.1","-8.6","6.0","-6.0","-6.7","6.4"], - ["2850","1000","20","31.2","2.0","9.1","-8.6","6.1","-6.1","-6.8","6.5"], - ["2900","978","22","30.8","1.9","9.0","-8.6","6.2","-6.2","-6.9","6.5"], - ["2950","954","26","30.3","1.9","9.0","-8.6","6.3","-6.3","-7.0","6.6"], - ["3000","927","31","29.7","1.8","8.9","-8.5","6.4","-6.4","-7.1","6.7"], - ["3050","894","38","29.0","1.7","8.8","-8.4","6.5","-6.6","-7.2","6.8"], - ["3100","849","54","27.9","1.6","8.5","-8.3","6.6","-6.7","-7.2","6.8"] + ["250","1527","2","27.2","9.9","2.6","-2.4","0.6","-0.6","-0.3","0.3"], + ["300","1512","2","27.2","8.3","2.7","-2.4","0.7","-0.7","-0.4","0.4"], + ["350","1497","3","27.1","7.1","2.7","-2.5","0.8","-0.9","-0.5","0.4"], + ["400","1482","3","27.1","6.2","2.7","-2.5","1.0","-1.0","-0.5","0.5"], + ["450","1467","3","27.0","5.6","2.8","-2.5","1.1","-1.1","-0.6","0.6"], + ["500","1451","4","27.0","5.0","2.9","-2.6","1.2","-1.2","-0.6","0.6"], + ["550","1436","4","26.9","4.6","2.9","-2.6","1.3","-1.3","-0.7","0.7"], + ["600","1420","5","26.8","4.2","3.0","-2.7","1.4","-1.5","-0.8","0.8"], + ["650","1404","5","26.8","3.9","3.0","-2.7","1.6","-1.6","-0.9","0.8"], + ["700","1388","6","26.7","3.6","3.1","-2.8","1.7","-1.7","-0.9","0.9"], + ["750","1372","6","26.6","3.4","3.2","-2.8","1.8","-1.8","-1.0","1.0"], + ["800","1355","7","26.5","3.2","3.2","-2.9","1.9","-1.9","-1.1","1.1"], + ["850","1338","8","26.4","3.0","3.3","-2.9","2.0","-2.1","-1.1","1.1"], + ["900","1321","8","26.2","2.8","3.4","-3.0","2.2","-2.2","-1.2","1.2"], + ["950","1303","9","26.1","2.7","3.4","-3.1","2.3","-2.3","-1.3","1.2"], + ["1000","1285","10","26.0","2.6","3.5","-3.1","2.4","-2.4","-1.4","1.3"], + ["1050","1266","11","25.8","2.4","3.5","-3.2","2.5","-2.5","-1.4","1.4"], + ["1100","1247","12","25.7","2.3","3.6","-3.3","2.6","-2.7","-1.5","1.4"], + ["1150","1228","13","25.5","2.2","3.7","-3.3","2.7","-2.8","-1.6","1.5"], + ["1200","1207","14","25.3","2.1","3.7","-3.4","2.9","-2.9","-1.7","1.6"], + ["1250","1186","15","25.1","2.0","3.8","-3.4","3.0","-3.0","-1.7","1.7"], + ["1300","1163","17","24.8","1.9","3.8","-3.5","3.1","-3.1","-1.8","1.7"], + ["1350","1140","19","24.6","1.9","3.9","-3.5","3.2","-3.2","-1.9","1.8"], + ["1400","1115","21","24.3","1.8","3.9","-3.6","3.4","-3.4","-1.9","1.9"], + ["1450","1088","24","23.9","1.7","4.0","-3.6","3.5","-3.5","-2.0","1.9"], + ["1500","1060","27","23.6","1.6","4.0","-3.7","3.6","-3.6","-2.1","2.0"], + ["1550","1028","32","23.1","1.5","4.0","-3.7","3.7","-3.7","-2.1","2.1"], + ["1600","991","38","22.6","1.5","4.0","-3.7","3.8","-3.9","-2.2","2.1"], + ["1650","947","49","21.9","1.4","4.0","-3.7","3.9","-4.0","-2.3","2.2"], + ["1700","888","71","21.0","1.3","3.9","-3.6","4.1","-4.1","-2.3","2.2"] + ] + }; +case ((abs(_muzzleVelocity - 200) < 0.00001) && ((abs(_airFriction - -0.0001) < 0.00001))): { + [ + ["450","1527","1","37.3","13.4","6.3","-6.0","0.2","-0.2","-1.0","1.0"], + ["500","1519","1","37.2","12.1","6.3","-6.0","0.2","-0.2","-1.1","1.1"], + ["550","1510","1","37.2","11.0","6.4","-6.0","0.2","-0.2","-1.3","1.2"], + ["600","1502","1","37.2","10.1","6.4","-6.1","0.2","-0.2","-1.4","1.3"], + ["650","1494","1","37.2","9.4","6.5","-6.1","0.2","-0.3","-1.5","1.4"], + ["700","1485","2","37.1","8.7","6.5","-6.2","0.2","-0.3","-1.6","1.5"], + ["750","1477","2","37.1","8.2","6.6","-6.2","0.3","-0.3","-1.7","1.6"], + ["800","1468","2","37.0","7.7","6.7","-6.3","0.3","-0.3","-1.8","1.8"], + ["850","1460","2","37.0","7.2","6.7","-6.3","0.3","-0.3","-2.0","1.9"], + ["900","1451","2","37.0","6.8","6.8","-6.4","0.3","-0.3","-2.1","2.0"], + ["950","1443","2","36.9","6.5","6.9","-6.4","0.3","-0.4","-2.2","2.1"], + ["1000","1434","2","36.9","6.2","6.9","-6.5","0.4","-0.4","-2.3","2.2"], + ["1050","1425","2","36.8","5.9","7.0","-6.6","0.4","-0.4","-2.5","2.3"], + ["1100","1417","3","36.8","5.6","7.1","-6.6","0.4","-0.4","-2.6","2.4"], + ["1150","1408","3","36.7","5.4","7.1","-6.7","0.4","-0.4","-2.7","2.5"], + ["1200","1399","3","36.6","5.2","7.2","-6.7","0.4","-0.4","-2.8","2.7"], + ["1250","1390","3","36.6","5.0","7.3","-6.8","0.4","-0.4","-2.9","2.8"], + ["1300","1381","3","36.5","4.8","7.4","-6.9","0.5","-0.5","-3.0","2.9"], + ["1350","1372","3","36.4","4.6","7.4","-6.9","0.5","-0.5","-3.2","3.0"], + ["1400","1362","4","36.4","4.4","7.5","-7.0","0.5","-0.5","-3.3","3.1"], + ["1450","1353","4","36.3","4.3","7.6","-7.1","0.5","-0.5","-3.4","3.2"], + ["1500","1344","4","36.2","4.2","7.7","-7.1","0.5","-0.5","-3.5","3.4"], + ["1550","1334","4","36.1","4.0","7.7","-7.2","0.6","-0.5","-3.7","3.5"], + ["1600","1324","4","36.0","3.9","7.8","-7.3","0.6","-0.6","-3.8","3.6"], + ["1650","1314","4","35.9","3.8","7.9","-7.3","0.6","-0.6","-3.9","3.7"], + ["1700","1304","5","35.8","3.7","7.9","-7.4","0.6","-0.6","-4.0","3.8"], + ["1750","1294","5","35.7","3.6","8.0","-7.5","0.6","-0.6","-4.2","3.9"], + ["1800","1284","5","35.6","3.5","8.1","-7.6","0.6","-0.7","-4.3","4.0"], + ["1850","1274","5","35.5","3.4","8.2","-7.6","0.7","-0.7","-4.4","4.2"], + ["1900","1263","6","35.4","3.3","8.2","-7.7","0.7","-0.7","-4.5","4.3"], + ["1950","1253","6","35.2","3.2","8.3","-7.8","0.7","-0.7","-4.7","4.4"], + ["2000","1242","6","35.1","3.1","8.4","-7.8","0.7","-0.7","-4.8","4.5"], + ["2050","1231","7","35.0","3.0","8.4","-7.9","0.7","-0.7","-4.9","4.7"], + ["2100","1219","7","34.8","2.9","8.5","-8.0","0.8","-0.7","-5.0","4.8"], + ["2150","1208","7","34.7","2.9","8.5","-8.0","0.8","-0.8","-5.2","4.9"], + ["2200","1196","8","34.5","2.8","8.6","-8.1","0.8","-0.8","-5.3","5.0"], + ["2250","1184","8","34.3","2.7","8.7","-8.2","0.8","-0.8","-5.4","5.1"], + ["2300","1171","9","34.2","2.7","8.7","-8.2","0.8","-0.8","-5.5","5.2"], + ["2350","1158","9","34.0","2.6","8.8","-8.3","0.8","-0.8","-5.7","5.4"], + ["2400","1145","10","33.8","2.5","8.8","-8.3","0.9","-0.8","-5.8","5.5"], + ["2450","1132","10","33.6","2.5","8.9","-8.4","0.9","-0.9","-5.9","5.6"], + ["2500","1118","11","33.3","2.4","8.9","-8.4","0.9","-0.9","-6.0","5.7"], + ["2550","1103","12","33.1","2.4","9.0","-8.5","0.9","-0.9","-6.1","5.8"], + ["2600","1088","13","32.8","2.3","9.0","-8.5","0.9","-0.9","-6.2","5.9"], + ["2650","1072","14","32.6","2.2","9.0","-8.6","0.9","-0.9","-6.4","6.0"], + ["2700","1056","15","32.3","2.2","9.0","-8.6","0.9","-1.0","-6.5","6.1"], + ["2750","1038","16","31.9","2.1","9.1","-8.6","1.0","-1.0","-6.6","6.3"], + ["2800","1020","18","31.6","2.1","9.1","-8.6","1.0","-1.0","-6.7","6.4"], + ["2850","1000","20","31.2","2.0","9.1","-8.6","1.0","-1.0","-6.8","6.5"], + ["2900","978","22","30.8","1.9","9.0","-8.6","1.0","-1.0","-6.9","6.5"], + ["2950","954","26","30.3","1.9","9.0","-8.6","1.0","-1.1","-7.0","6.6"], + ["3000","927","31","29.7","1.8","8.9","-8.5","1.1","-1.1","-7.1","6.7"], + ["3050","894","38","29.0","1.7","8.8","-8.4","1.1","-1.1","-7.2","6.8"], + ["3100","849","54","27.9","1.6","8.5","-8.3","1.1","-1.1","-7.2","6.8"] ] }; - default {systemChat "Error: MuzzleVelocity not found in LUT"; []}; }; \ No newline at end of file diff --git a/addons/mk6mortar/script_component.hpp b/addons/mk6mortar/script_component.hpp index cb74d552de..98b9d705e0 100644 --- a/addons/mk6mortar/script_component.hpp +++ b/addons/mk6mortar/script_component.hpp @@ -11,4 +11,4 @@ #include "\z\ace\Addons\main\script_macros.hpp" -#define MK6_82mm_AIR_FRICTION -0.0001 \ No newline at end of file +#define MK6_82mm_AIR_FRICTION -0.000075 \ No newline at end of file From 5c5b8f656e726f68c5aff8917ec48d6239374f40 Mon Sep 17 00:00:00 2001 From: PabstMirror Date: Sun, 5 Apr 2015 17:37:11 -0500 Subject: [PATCH 12/22] Tweak Air to match known data --- .../functions/fnc_dev_simulateShot.sqf | 2 +- .../mk6mortar/functions/fnc_handleFired.sqf | 6 +- .../fnc_rangeTablePreCalculatedValues.sqf | 189 +++++++++--------- addons/mk6mortar/script_component.hpp | 2 +- 4 files changed, 101 insertions(+), 98 deletions(-) diff --git a/addons/mk6mortar/functions/fnc_dev_simulateShot.sqf b/addons/mk6mortar/functions/fnc_dev_simulateShot.sqf index 170d23321a..42ceef21fd 100644 --- a/addons/mk6mortar/functions/fnc_dev_simulateShot.sqf +++ b/addons/mk6mortar/functions/fnc_dev_simulateShot.sqf @@ -44,7 +44,7 @@ _wind = [_crosswind, _tailWind, 0]; _gravity = [0,0,-9.8]; _currentPos = [0,0,0]; -_muzzleVelocity = _muzzleVelocity * (((_temp + 273.13) / 288.13 - 1) / 30 + 1); +_muzzleVelocity = _muzzleVelocity * (((_temp + 273.13) / 288.13 - 1) / 40 + 1); _currentVelocity = [0, (_muzzleVelocity * cos _angleDeg), (_muzzleVelocity * sin _angleDeg)]; _currentTime = 0; diff --git a/addons/mk6mortar/functions/fnc_handleFired.sqf b/addons/mk6mortar/functions/fnc_handleFired.sqf index ae20b62b64..c57f7bc7fe 100644 --- a/addons/mk6mortar/functions/fnc_handleFired.sqf +++ b/addons/mk6mortar/functions/fnc_handleFired.sqf @@ -24,6 +24,7 @@ disableSerialization; PARAMS_7(_vehicle,_weapon,_muzzle,_mode,_ammo,_magazine,_projectile); + if (!GVAR(airResistanceEnabled)) exitWith {}; if (_unit distance ACE_player > 3000) exitWith {false}; // Large enough distance to not simulate any wind deflection. @@ -39,13 +40,12 @@ if (isNil QEGVAR(weather,currentTemperature)) then { //powder effects: _temperature = EGVAR(weather,currentTemperature); -_newMuzzleVelocityCoefficent = (((_temperature + 273.13) / 288.13 - 1) / 30 + 1); +_newMuzzleVelocityCoefficent = (((_temperature + 273.13) / 288.13 - 1) / 40 + 1); +systemChat str _newMuzzleVelocityCoefficent; if (_newMuzzleVelocityCoefficent != 1) then { _bulletVelocity = velocity _projectile; - systemChat format ["Start Vel: %1", _bulletVelocity]; _bulletSpeed = vectorMagnitude _bulletVelocity; _bulletVelocity = (vectorNormalized _bulletVelocity) vectorMultiply (_bulletSpeed * _newMuzzleVelocityCoefficent); - systemChat format ["New Vel: %1", _bulletVelocity]; _projectile setVelocity _bulletVelocity; _muzzleVelocity = _muzzleVelocity + _muzzleVelocityShift; }; diff --git a/addons/mk6mortar/functions/fnc_rangeTablePreCalculatedValues.sqf b/addons/mk6mortar/functions/fnc_rangeTablePreCalculatedValues.sqf index 3479e8cfa7..e836018b2e 100644 --- a/addons/mk6mortar/functions/fnc_rangeTablePreCalculatedValues.sqf +++ b/addons/mk6mortar/functions/fnc_rangeTablePreCalculatedValues.sqf @@ -20,107 +20,110 @@ switch (true) do { case ((abs(_muzzleVelocity - 70) < 0.00001) && ((abs(_airFriction - -0.0001) < 0.00001))): { [ - ["100","1493","9","14.0","3.7","0.4","-0.3","0.3","-0.3","-0.0","0.0"], - ["150","1438","14","13.9","2.5","0.4","-0.4","0.4","-0.4","-0.1","0.0"], - ["200","1381","20","13.8","1.9","0.5","-0.4","0.5","-0.5","-0.1","0.1"], - ["250","1321","27","13.6","1.5","0.5","-0.4","0.7","-0.7","-0.1","0.1"], - ["300","1256","36","13.3","1.3","0.6","-0.5","0.8","-0.8","-0.1","0.1"], - ["350","1183","49","12.9","1.1","0.6","-0.5","0.9","-0.9","-0.1","0.1"], - ["400","1097","70","12.4","0.9","0.6","-0.5","1.1","-1.1","-0.2","0.1"], - ["450","979","113","11.6","0.8","0.6","-0.5","1.2","-1.2","-0.2","0.2"] + ["100","1493","9","14.0","3.7","0.4","-0.3","0.0","-0.0","-0.0","0.0"], + ["150","1438","14","13.9","2.5","0.4","-0.4","0.0","-0.0","-0.1","0.0"], + ["200","1381","20","13.8","1.9","0.5","-0.4","0.0","-0.0","-0.1","0.1"], + ["250","1321","27","13.6","1.5","0.5","-0.4","0.1","-0.1","-0.1","0.1"], + ["300","1256","36","13.3","1.3","0.6","-0.5","0.1","-0.1","-0.1","0.1"], + ["350","1183","49","12.9","1.1","0.6","-0.5","0.1","-0.1","-0.1","0.1"], + ["400","1097","70","12.4","0.9","0.6","-0.5","0.1","-0.1","-0.2","0.1"], + ["450","979","113","11.6","0.8","0.6","-0.5","0.1","-0.1","-0.2","0.2"] ] }; case ((abs(_muzzleVelocity - 140) < 0.00001) && ((abs(_airFriction - -0.0001) < 0.00001))): { [ - ["250","1527","2","27.2","9.9","2.6","-2.4","0.6","-0.6","-0.3","0.3"], - ["300","1512","2","27.2","8.3","2.7","-2.4","0.7","-0.7","-0.4","0.4"], - ["350","1497","3","27.1","7.1","2.7","-2.5","0.8","-0.9","-0.5","0.4"], - ["400","1482","3","27.1","6.2","2.7","-2.5","1.0","-1.0","-0.5","0.5"], - ["450","1467","3","27.0","5.6","2.8","-2.5","1.1","-1.1","-0.6","0.6"], - ["500","1451","4","27.0","5.0","2.9","-2.6","1.2","-1.2","-0.6","0.6"], - ["550","1436","4","26.9","4.6","2.9","-2.6","1.3","-1.3","-0.7","0.7"], - ["600","1420","5","26.8","4.2","3.0","-2.7","1.4","-1.5","-0.8","0.8"], - ["650","1404","5","26.8","3.9","3.0","-2.7","1.6","-1.6","-0.9","0.8"], - ["700","1388","6","26.7","3.6","3.1","-2.8","1.7","-1.7","-0.9","0.9"], - ["750","1372","6","26.6","3.4","3.2","-2.8","1.8","-1.8","-1.0","1.0"], - ["800","1355","7","26.5","3.2","3.2","-2.9","1.9","-1.9","-1.1","1.1"], - ["850","1338","8","26.4","3.0","3.3","-2.9","2.0","-2.1","-1.1","1.1"], - ["900","1321","8","26.2","2.8","3.4","-3.0","2.2","-2.2","-1.2","1.2"], - ["950","1303","9","26.1","2.7","3.4","-3.1","2.3","-2.3","-1.3","1.2"], - ["1000","1285","10","26.0","2.6","3.5","-3.1","2.4","-2.4","-1.4","1.3"], - ["1050","1266","11","25.8","2.4","3.5","-3.2","2.5","-2.5","-1.4","1.4"], - ["1100","1247","12","25.7","2.3","3.6","-3.3","2.6","-2.7","-1.5","1.4"], - ["1150","1228","13","25.5","2.2","3.7","-3.3","2.7","-2.8","-1.6","1.5"], - ["1200","1207","14","25.3","2.1","3.7","-3.4","2.9","-2.9","-1.7","1.6"], - ["1250","1186","15","25.1","2.0","3.8","-3.4","3.0","-3.0","-1.7","1.7"], - ["1300","1163","17","24.8","1.9","3.8","-3.5","3.1","-3.1","-1.8","1.7"], - ["1350","1140","19","24.6","1.9","3.9","-3.5","3.2","-3.2","-1.9","1.8"], - ["1400","1115","21","24.3","1.8","3.9","-3.6","3.4","-3.4","-1.9","1.9"], - ["1450","1088","24","23.9","1.7","4.0","-3.6","3.5","-3.5","-2.0","1.9"], - ["1500","1060","27","23.6","1.6","4.0","-3.7","3.6","-3.6","-2.1","2.0"], - ["1550","1028","32","23.1","1.5","4.0","-3.7","3.7","-3.7","-2.1","2.1"], - ["1600","991","38","22.6","1.5","4.0","-3.7","3.8","-3.9","-2.2","2.1"], - ["1650","947","49","21.9","1.4","4.0","-3.7","3.9","-4.0","-2.3","2.2"], - ["1700","888","71","21.0","1.3","3.9","-3.6","4.1","-4.1","-2.3","2.2"] + ["250","1527","2","27.2","9.9","2.6","-2.4","0.1","-0.0","-0.3","0.3"], + ["300","1512","2","27.2","8.3","2.7","-2.4","0.1","-0.1","-0.4","0.4"], + ["350","1497","3","27.1","7.1","2.7","-2.5","0.1","-0.1","-0.5","0.4"], + ["400","1482","3","27.1","6.2","2.7","-2.5","0.1","-0.1","-0.5","0.5"], + ["450","1467","3","27.0","5.6","2.8","-2.5","0.1","-0.1","-0.6","0.6"], + ["500","1451","4","27.0","5.0","2.9","-2.6","0.1","-0.1","-0.6","0.6"], + ["550","1436","4","26.9","4.6","2.9","-2.6","0.1","-0.1","-0.7","0.7"], + ["600","1420","5","26.8","4.2","3.0","-2.7","0.1","-0.1","-0.8","0.8"], + ["650","1404","5","26.8","3.9","3.0","-2.7","0.1","-0.1","-0.9","0.8"], + ["700","1388","6","26.7","3.6","3.1","-2.8","0.1","-0.1","-0.9","0.9"], + ["750","1372","6","26.6","3.4","3.2","-2.8","0.2","-0.1","-1.0","1.0"], + ["800","1355","7","26.5","3.2","3.2","-2.9","0.2","-0.1","-1.1","1.1"], + ["850","1338","8","26.4","3.0","3.3","-2.9","0.2","-0.2","-1.1","1.1"], + ["900","1321","8","26.2","2.8","3.4","-3.0","0.2","-0.2","-1.2","1.2"], + ["950","1303","9","26.1","2.7","3.4","-3.1","0.2","-0.2","-1.3","1.2"], + ["1000","1285","10","26.0","2.6","3.5","-3.1","0.2","-0.2","-1.4","1.3"], + ["1050","1266","11","25.8","2.4","3.5","-3.2","0.2","-0.2","-1.4","1.4"], + ["1100","1247","12","25.7","2.3","3.6","-3.3","0.2","-0.2","-1.5","1.4"], + ["1150","1228","13","25.5","2.2","3.7","-3.3","0.2","-0.2","-1.6","1.5"], + ["1200","1207","14","25.3","2.1","3.7","-3.4","0.2","-0.3","-1.7","1.6"], + ["1250","1186","15","25.1","2.0","3.8","-3.4","0.2","-0.3","-1.7","1.7"], + ["1300","1163","17","24.8","1.9","3.8","-3.5","0.3","-0.3","-1.8","1.7"], + ["1350","1140","19","24.6","1.9","3.9","-3.5","0.3","-0.3","-1.9","1.8"], + ["1400","1115","21","24.3","1.8","3.9","-3.6","0.3","-0.3","-1.9","1.9"], + ["1450","1088","24","23.9","1.7","4.0","-3.6","0.3","-0.3","-2.0","1.9"], + ["1500","1060","27","23.6","1.6","4.0","-3.7","0.3","-0.3","-2.1","2.0"], + ["1550","1028","32","23.1","1.5","4.0","-3.7","0.3","-0.3","-2.1","2.1"], + ["1600","991","38","22.6","1.5","4.0","-3.7","0.3","-0.3","-2.2","2.1"], + ["1650","947","49","21.9","1.4","4.0","-3.7","0.3","-0.3","-2.3","2.2"], + ["1700","888","71","21.0","1.3","3.9","-3.6","0.3","-0.3","-2.3","2.2"] ] }; case ((abs(_muzzleVelocity - 200) < 0.00001) && ((abs(_airFriction - -0.0001) < 0.00001))): { [ - ["450","1527","1","37.3","13.4","6.3","-6.0","0.2","-0.2","-1.0","1.0"], - ["500","1519","1","37.2","12.1","6.3","-6.0","0.2","-0.2","-1.1","1.1"], - ["550","1510","1","37.2","11.0","6.4","-6.0","0.2","-0.2","-1.3","1.2"], - ["600","1502","1","37.2","10.1","6.4","-6.1","0.2","-0.2","-1.4","1.3"], - ["650","1494","1","37.2","9.4","6.5","-6.1","0.2","-0.3","-1.5","1.4"], - ["700","1485","2","37.1","8.7","6.5","-6.2","0.2","-0.3","-1.6","1.5"], - ["750","1477","2","37.1","8.2","6.6","-6.2","0.3","-0.3","-1.7","1.6"], - ["800","1468","2","37.0","7.7","6.7","-6.3","0.3","-0.3","-1.8","1.8"], - ["850","1460","2","37.0","7.2","6.7","-6.3","0.3","-0.3","-2.0","1.9"], - ["900","1451","2","37.0","6.8","6.8","-6.4","0.3","-0.3","-2.1","2.0"], - ["950","1443","2","36.9","6.5","6.9","-6.4","0.3","-0.4","-2.2","2.1"], - ["1000","1434","2","36.9","6.2","6.9","-6.5","0.4","-0.4","-2.3","2.2"], - ["1050","1425","2","36.8","5.9","7.0","-6.6","0.4","-0.4","-2.5","2.3"], - ["1100","1417","3","36.8","5.6","7.1","-6.6","0.4","-0.4","-2.6","2.4"], - ["1150","1408","3","36.7","5.4","7.1","-6.7","0.4","-0.4","-2.7","2.5"], - ["1200","1399","3","36.6","5.2","7.2","-6.7","0.4","-0.4","-2.8","2.7"], - ["1250","1390","3","36.6","5.0","7.3","-6.8","0.4","-0.4","-2.9","2.8"], - ["1300","1381","3","36.5","4.8","7.4","-6.9","0.5","-0.5","-3.0","2.9"], - ["1350","1372","3","36.4","4.6","7.4","-6.9","0.5","-0.5","-3.2","3.0"], - ["1400","1362","4","36.4","4.4","7.5","-7.0","0.5","-0.5","-3.3","3.1"], - ["1450","1353","4","36.3","4.3","7.6","-7.1","0.5","-0.5","-3.4","3.2"], - ["1500","1344","4","36.2","4.2","7.7","-7.1","0.5","-0.5","-3.5","3.4"], - ["1550","1334","4","36.1","4.0","7.7","-7.2","0.6","-0.5","-3.7","3.5"], - ["1600","1324","4","36.0","3.9","7.8","-7.3","0.6","-0.6","-3.8","3.6"], - ["1650","1314","4","35.9","3.8","7.9","-7.3","0.6","-0.6","-3.9","3.7"], - ["1700","1304","5","35.8","3.7","7.9","-7.4","0.6","-0.6","-4.0","3.8"], - ["1750","1294","5","35.7","3.6","8.0","-7.5","0.6","-0.6","-4.2","3.9"], - ["1800","1284","5","35.6","3.5","8.1","-7.6","0.6","-0.7","-4.3","4.0"], - ["1850","1274","5","35.5","3.4","8.2","-7.6","0.7","-0.7","-4.4","4.2"], - ["1900","1263","6","35.4","3.3","8.2","-7.7","0.7","-0.7","-4.5","4.3"], - ["1950","1253","6","35.2","3.2","8.3","-7.8","0.7","-0.7","-4.7","4.4"], - ["2000","1242","6","35.1","3.1","8.4","-7.8","0.7","-0.7","-4.8","4.5"], - ["2050","1231","7","35.0","3.0","8.4","-7.9","0.7","-0.7","-4.9","4.7"], - ["2100","1219","7","34.8","2.9","8.5","-8.0","0.8","-0.7","-5.0","4.8"], - ["2150","1208","7","34.7","2.9","8.5","-8.0","0.8","-0.8","-5.2","4.9"], - ["2200","1196","8","34.5","2.8","8.6","-8.1","0.8","-0.8","-5.3","5.0"], - ["2250","1184","8","34.3","2.7","8.7","-8.2","0.8","-0.8","-5.4","5.1"], - ["2300","1171","9","34.2","2.7","8.7","-8.2","0.8","-0.8","-5.5","5.2"], - ["2350","1158","9","34.0","2.6","8.8","-8.3","0.8","-0.8","-5.7","5.4"], - ["2400","1145","10","33.8","2.5","8.8","-8.3","0.9","-0.8","-5.8","5.5"], - ["2450","1132","10","33.6","2.5","8.9","-8.4","0.9","-0.9","-5.9","5.6"], - ["2500","1118","11","33.3","2.4","8.9","-8.4","0.9","-0.9","-6.0","5.7"], - ["2550","1103","12","33.1","2.4","9.0","-8.5","0.9","-0.9","-6.1","5.8"], - ["2600","1088","13","32.8","2.3","9.0","-8.5","0.9","-0.9","-6.2","5.9"], - ["2650","1072","14","32.6","2.2","9.0","-8.6","0.9","-0.9","-6.4","6.0"], - ["2700","1056","15","32.3","2.2","9.0","-8.6","0.9","-1.0","-6.5","6.1"], - ["2750","1038","16","31.9","2.1","9.1","-8.6","1.0","-1.0","-6.6","6.3"], - ["2800","1020","18","31.6","2.1","9.1","-8.6","1.0","-1.0","-6.7","6.4"], - ["2850","1000","20","31.2","2.0","9.1","-8.6","1.0","-1.0","-6.8","6.5"], - ["2900","978","22","30.8","1.9","9.0","-8.6","1.0","-1.0","-6.9","6.5"], - ["2950","954","26","30.3","1.9","9.0","-8.6","1.0","-1.1","-7.0","6.6"], - ["3000","927","31","29.7","1.8","8.9","-8.5","1.1","-1.1","-7.1","6.7"], - ["3050","894","38","29.0","1.7","8.8","-8.4","1.1","-1.1","-7.2","6.8"], - ["3100","849","54","27.9","1.6","8.5","-8.3","1.1","-1.1","-7.2","6.8"] + ["450","1527","1","37.3","13.4","6.3","-6.0","0.1","-0.1","-1.0","1.0"], + ["500","1519","1","37.2","12.1","6.3","-6.0","0.1","-0.1","-1.1","1.1"], + ["550","1510","1","37.2","11.0","6.4","-6.0","0.1","-0.1","-1.3","1.2"], + ["600","1502","1","37.2","10.1","6.4","-6.1","0.1","-0.1","-1.4","1.3"], + ["650","1494","1","37.2","9.4","6.5","-6.1","0.1","-0.1","-1.5","1.4"], + ["700","1485","2","37.1","8.7","6.5","-6.2","0.1","-0.1","-1.6","1.5"], + ["750","1477","2","37.1","8.2","6.6","-6.2","0.1","-0.1","-1.7","1.6"], + ["800","1468","2","37.0","7.7","6.7","-6.3","0.1","-0.1","-1.8","1.8"], + ["850","1460","2","37.0","7.2","6.7","-6.3","0.2","-0.1","-2.0","1.9"], + ["900","1451","2","37.0","6.8","6.8","-6.4","0.1","-0.2","-2.1","2.0"], + ["950","1443","2","36.9","6.5","6.9","-6.4","0.2","-0.2","-2.2","2.1"], + ["1000","1434","2","36.9","6.2","6.9","-6.5","0.2","-0.2","-2.3","2.2"], + ["1050","1425","2","36.8","5.9","7.0","-6.6","0.2","-0.2","-2.5","2.3"], + ["1100","1417","3","36.8","5.6","7.1","-6.6","0.2","-0.2","-2.6","2.4"], + ["1150","1408","3","36.7","5.4","7.1","-6.7","0.2","-0.2","-2.7","2.5"], + ["1200","1399","3","36.6","5.2","7.2","-6.7","0.2","-0.2","-2.8","2.7"], + ["1250","1390","3","36.6","5.0","7.3","-6.8","0.2","-0.2","-2.9","2.8"], + ["1300","1381","3","36.5","4.8","7.4","-6.9","0.2","-0.2","-3.0","2.9"], + ["1350","1372","3","36.4","4.6","7.4","-6.9","0.2","-0.2","-3.2","3.0"], + ["1400","1362","4","36.4","4.4","7.5","-7.0","0.2","-0.3","-3.3","3.1"], + ["1450","1353","4","36.3","4.3","7.6","-7.1","0.2","-0.3","-3.4","3.2"], + ["1500","1344","4","36.2","4.2","7.7","-7.1","0.3","-0.3","-3.5","3.4"], + ["1550","1334","4","36.1","4.0","7.7","-7.2","0.3","-0.3","-3.7","3.5"], + ["1600","1324","4","36.0","3.9","7.8","-7.3","0.3","-0.3","-3.8","3.6"], + ["1650","1314","4","35.9","3.8","7.9","-7.3","0.3","-0.3","-3.9","3.7"], + ["1700","1304","5","35.8","3.7","7.9","-7.4","0.3","-0.3","-4.0","3.8"], + ["1750","1294","5","35.7","3.6","8.0","-7.5","0.3","-0.3","-4.2","3.9"], + ["1800","1284","5","35.6","3.5","8.1","-7.6","0.3","-0.3","-4.3","4.0"], + ["1850","1274","5","35.5","3.4","8.2","-7.6","0.3","-0.3","-4.4","4.2"], + ["1900","1263","6","35.4","3.3","8.2","-7.7","0.3","-0.3","-4.5","4.3"], + ["1950","1253","6","35.2","3.2","8.3","-7.8","0.3","-0.4","-4.7","4.4"], + ["2000","1242","6","35.1","3.1","8.4","-7.8","0.4","-0.3","-4.8","4.5"], + ["2050","1231","7","35.0","3.0","8.4","-7.9","0.4","-0.4","-4.9","4.7"], + ["2100","1219","7","34.8","2.9","8.5","-8.0","0.4","-0.4","-5.0","4.8"], + ["2150","1208","7","34.7","2.9","8.5","-8.0","0.4","-0.4","-5.2","4.9"], + ["2200","1196","8","34.5","2.8","8.6","-8.1","0.4","-0.4","-5.3","5.0"], + ["2250","1184","8","34.3","2.7","8.7","-8.2","0.4","-0.4","-5.4","5.1"], + ["2300","1171","9","34.2","2.7","8.7","-8.2","0.4","-0.4","-5.5","5.2"], + ["2350","1158","9","34.0","2.6","8.8","-8.3","0.4","-0.4","-5.7","5.4"], + ["2400","1145","10","33.8","2.5","8.8","-8.3","0.4","-0.4","-5.8","5.5"], + ["2450","1132","10","33.6","2.5","8.9","-8.4","0.4","-0.4","-5.9","5.6"], + ["2500","1118","11","33.3","2.4","8.9","-8.4","0.5","-0.4","-6.0","5.7"], + ["2550","1103","12","33.1","2.4","9.0","-8.5","0.4","-0.5","-6.1","5.8"], + ["2600","1088","13","32.8","2.3","9.0","-8.5","0.5","-0.4","-6.2","5.9"], + ["2650","1072","14","32.6","2.2","9.0","-8.6","0.5","-0.5","-6.4","6.0"], + ["2700","1056","15","32.3","2.2","9.0","-8.6","0.5","-0.5","-6.5","6.1"], + ["2750","1038","16","31.9","2.1","9.1","-8.6","0.5","-0.5","-6.6","6.3"], + ["2800","1020","18","31.6","2.1","9.1","-8.6","0.5","-0.5","-6.7","6.4"], + ["2850","1000","20","31.2","2.0","9.1","-8.6","0.5","-0.5","-6.8","6.5"], + ["2900","978","22","30.8","1.9","9.0","-8.6","0.5","-0.5","-6.9","6.5"], + ["2950","954","26","30.3","1.9","9.0","-8.6","0.5","-0.5","-7.0","6.6"], + ["3000","927","31","29.7","1.8","8.9","-8.5","0.5","-0.5","-7.1","6.7"], + ["3050","894","38","29.0","1.7","8.8","-8.4","0.5","-0.6","-7.2","6.8"], + ["3100","849","54","27.9","1.6","8.5","-8.3","0.5","-0.6","-7.2","6.8"] ] }; - default {systemChat "Error: MuzzleVelocity not found in LUT"; []}; + default { + ERROR("MuzzleVelocity not found in LUT"); + [] + }; }; \ No newline at end of file diff --git a/addons/mk6mortar/script_component.hpp b/addons/mk6mortar/script_component.hpp index 98b9d705e0..cb74d552de 100644 --- a/addons/mk6mortar/script_component.hpp +++ b/addons/mk6mortar/script_component.hpp @@ -11,4 +11,4 @@ #include "\z\ace\Addons\main\script_macros.hpp" -#define MK6_82mm_AIR_FRICTION -0.000075 \ No newline at end of file +#define MK6_82mm_AIR_FRICTION -0.0001 \ No newline at end of file From a8b000c159e267b4156044ffbd61b05653ae8501 Mon Sep 17 00:00:00 2001 From: PabstMirror Date: Sun, 5 Apr 2015 17:50:07 -0500 Subject: [PATCH 13/22] Some Headers --- addons/mk6mortar/RscRangeTable.hpp | 7 +++---- addons/mk6mortar/XEH_clientInit.sqf | 1 - addons/mk6mortar/XEH_preInit.sqf | 1 - addons/mk6mortar/config.cpp | 3 +-- addons/mk6mortar/functions/fnc_handleFired.sqf | 16 ++++++++-------- .../functions/fnc_handlePlayerVehicleChanged.sqf | 9 +++++---- addons/mk6mortar/functions/fnc_moduleInit.sqf | 4 ++-- .../mk6mortar/functions/fnc_rangeTableOpen.sqf | 7 ++++++- .../functions/fnc_rangeTablePageChange.sqf | 5 ++++- .../fnc_rangeTablePreCalculatedValues.sqf | 11 +++++++---- addons/mk6mortar/functions/fnc_toggleMils.sqf | 6 +++++- .../functions/fnc_turretDisplayLoaded.sqf | 6 +++--- 12 files changed, 44 insertions(+), 32 deletions(-) diff --git a/addons/mk6mortar/RscRangeTable.hpp b/addons/mk6mortar/RscRangeTable.hpp index 65598fd36d..96516779ac 100644 --- a/addons/mk6mortar/RscRangeTable.hpp +++ b/addons/mk6mortar/RscRangeTable.hpp @@ -1,5 +1,4 @@ -class ACE_82mm_RangeTable_Dialog -{ +class ACE_82mm_RangeTable_Dialog { idd = -1; movingEnable = 1; onLoad = "uiNamespace setVariable ['ACE_82mm_RangeTable_Dialog', _this select 0];"; @@ -25,7 +24,7 @@ class ACE_82mm_RangeTable_Dialog }; }; class controls { - class TheTable : RscListNBox { + class TheTable: RscListNBox { idc = 20001; // style = ST_CENTER + ST_MULTI + LB_TEXTURES; // style = ST_LEFT + ST_MULTI + LB_TEXTURES; @@ -84,4 +83,4 @@ class ACE_82mm_RangeTable_Dialog onButtonClick = "closeDialog 0"; }; }; -}; \ No newline at end of file +}; diff --git a/addons/mk6mortar/XEH_clientInit.sqf b/addons/mk6mortar/XEH_clientInit.sqf index 36b39e58c4..973772c96a 100644 --- a/addons/mk6mortar/XEH_clientInit.sqf +++ b/addons/mk6mortar/XEH_clientInit.sqf @@ -3,4 +3,3 @@ if (!hasInterface) exitWith {}; ["playerVehicleChanged", {_this call FUNC(handlePlayerVehicleChanged);}] call EFUNC(common,addEventHandler); - diff --git a/addons/mk6mortar/XEH_preInit.sqf b/addons/mk6mortar/XEH_preInit.sqf index 186a595896..a60fcb9ce6 100644 --- a/addons/mk6mortar/XEH_preInit.sqf +++ b/addons/mk6mortar/XEH_preInit.sqf @@ -2,7 +2,6 @@ ADDON = false; - PREP(dev_buildTable); PREP(dev_formatNumber); PREP(dev_simulateCalcRangeTableLine); diff --git a/addons/mk6mortar/config.cpp b/addons/mk6mortar/config.cpp index 5050bb2b32..b39b036416 100644 --- a/addons/mk6mortar/config.cpp +++ b/addons/mk6mortar/config.cpp @@ -25,7 +25,6 @@ class RscControlsGroup; class ScrollBar; class RscActiveText; - #include "RscInGameUI.hpp" #include "RscRangeTable.hpp" @@ -40,7 +39,7 @@ class ACE_Settings { value = 1; typeName = "BOOL"; isClientSetable = 0; - }; + }; class GVAR(allowCompass) { value = 1; typeName = "BOOL"; diff --git a/addons/mk6mortar/functions/fnc_handleFired.sqf b/addons/mk6mortar/functions/fnc_handleFired.sqf index c57f7bc7fe..679b689d6d 100644 --- a/addons/mk6mortar/functions/fnc_handleFired.sqf +++ b/addons/mk6mortar/functions/fnc_handleFired.sqf @@ -1,5 +1,6 @@ /* * Author: PabstMirror + * Called when the mortar is fired. * * Arguments: * 0: mortar - Object the event handler is assigned to @@ -14,7 +15,7 @@ * Nothing * * Example: - * [clientFiredBIS-XEH] call ace_ + * [clientFiredBIS-XEH] call ace_mk6mortars_fnc_handleFired * * Public: No */ @@ -24,11 +25,14 @@ disableSerialization; PARAMS_7(_vehicle,_weapon,_muzzle,_mode,_ammo,_magazine,_projectile); - if (!GVAR(airResistanceEnabled)) exitWith {}; if (_unit distance ACE_player > 3000) exitWith {false}; // Large enough distance to not simulate any wind deflection. -if (!GVAR(EnableForAI) && !([_unit] call EFUNC(common,isPlayer))) exitWith {false}; + +//AI will have no clue how to use: +_shooterMan = gunner _vehicle; +if (!([_shooterMan] call EFUNC(common,isPlayer))) exitWith {false}; + //Hack Until these are intergrated: if (isNil QEGVAR(weather,currentRelativeDensity)) then { @@ -38,6 +42,7 @@ if (isNil QEGVAR(weather,currentTemperature)) then { EGVAR(weather,currentTemperature) = 20; }; + //powder effects: _temperature = EGVAR(weather,currentTemperature); _newMuzzleVelocityCoefficent = (((_temperature + 273.13) / 288.13 - 1) / 40 + 1); @@ -71,17 +76,12 @@ if (_newMuzzleVelocityCoefficent != 1) then { _trueVelocity = _bulletVelocity vectorDiff ACE_wind; _trueSpeed = vectorMagnitude _trueVelocity; - // _dragRef = _deltaT * _airFriction * _bulletSpeed * _bulletSpeed; - // _accelRef = (vectorNormalized _bulletVelocity) vectorMultiply (_dragRef); - // _bulletVelocity = _bulletVelocity vectorDiff _accelRef; - _drag = _deltaT * _airFriction * _trueSpeed * EGVAR(weather,currentRelativeDensity); _accel = _trueVelocity vectorMultiply (_drag); _bulletVelocity = _bulletVelocity vectorAdd _accel; }; _shell setVelocity _bulletVelocity; - // TODO expand with advanced ballistics functionality. }, 0, [_projectile, MK6_82mm_AIR_FRICTION, time]] call CBA_fnc_addPerFrameHandler; // }; diff --git a/addons/mk6mortar/functions/fnc_handlePlayerVehicleChanged.sqf b/addons/mk6mortar/functions/fnc_handlePlayerVehicleChanged.sqf index 6faeeaf415..705105eed5 100644 --- a/addons/mk6mortar/functions/fnc_handlePlayerVehicleChanged.sqf +++ b/addons/mk6mortar/functions/fnc_handlePlayerVehicleChanged.sqf @@ -1,10 +1,13 @@ /* * Author: PabstMirror - * + * Handles player getting into new vehicle. Loads PFEG for mortar display if it is a mortar. * * Arguments: + * 0:Player + * 1: New Vehicle * * Return Value: + * No * * Example: * @@ -17,8 +20,6 @@ PARAMS_2(_player,_newVehicle); if (isNull _newVehicle) exitWith {}; if (!(_newVehicle isKindOf "Mortar_01_base_F")) exitWith {}; - - _chargeText = (findDisplay 46) ctrlCreate ["RscStructuredText", 80085]; _xPos = (profilenamespace getvariable ["IGUI_GRID_WEAPON_X", ((safezoneX + safezoneW) - (12.4 * (((safezoneW / safezoneH) min 1.2) / 40)) - 0.5 * (((safezoneW / safezoneH) min 1.2) / 40))]); @@ -42,7 +43,7 @@ _fireModes = getArray (configFile >> "CfgWeapons" >> _tubeWeaponName >> "modes") } else { _useMils = _mortarVeh getVariable [QGVAR(useMils), true]; - + //Compute: 'charge' from weaponstate _currentFireMode = (weaponState [_mortarVeh, [0]]) select 2; _currentChargeMode = _fireModes find _currentFireMode; diff --git a/addons/mk6mortar/functions/fnc_moduleInit.sqf b/addons/mk6mortar/functions/fnc_moduleInit.sqf index e760e443a2..c7301c074b 100644 --- a/addons/mk6mortar/functions/fnc_moduleInit.sqf +++ b/addons/mk6mortar/functions/fnc_moduleInit.sqf @@ -1,6 +1,6 @@ /* * Author: PabstMirror - * + * Loads settings from the module. * * Arguments: * 0: The Module Logic Object @@ -11,7 +11,7 @@ * None * * Example: - * + * * * Public: No */ diff --git a/addons/mk6mortar/functions/fnc_rangeTableOpen.sqf b/addons/mk6mortar/functions/fnc_rangeTableOpen.sqf index e3dbcffd1d..5ad6736e84 100644 --- a/addons/mk6mortar/functions/fnc_rangeTableOpen.sqf +++ b/addons/mk6mortar/functions/fnc_rangeTableOpen.sqf @@ -1,16 +1,21 @@ /* * Author: PabstMirror + * Opens the rangetable and fills the charge listbox. * * Arguments: + * No + * * Return Value: + * No * * Example: * + * * Public: No */ #include "script_component.hpp" -#define LIST_CHARGE ((uiNamespace getVariable "ACE_82mm_RangeTable_Dialog") displayCtrl 1501) +#define LIST_CHARGE ((uiNamespace getVariable "ACE_82mm_RangeTable_Dialog") displayCtrl 1501) _weaponName = "mortar_82mm"; diff --git a/addons/mk6mortar/functions/fnc_rangeTablePageChange.sqf b/addons/mk6mortar/functions/fnc_rangeTablePageChange.sqf index c7f740ba15..eb28b80e6f 100644 --- a/addons/mk6mortar/functions/fnc_rangeTablePageChange.sqf +++ b/addons/mk6mortar/functions/fnc_rangeTablePageChange.sqf @@ -1,13 +1,16 @@ /* * Author: PabstMirror - * + * Called when listbox selection changes. Updates the rangetable with new values. * * Arguments: + * No * * Return Value: + * No * * Example: * + * * Public: No */ #include "script_component.hpp" diff --git a/addons/mk6mortar/functions/fnc_rangeTablePreCalculatedValues.sqf b/addons/mk6mortar/functions/fnc_rangeTablePreCalculatedValues.sqf index e836018b2e..5c8489941f 100644 --- a/addons/mk6mortar/functions/fnc_rangeTablePreCalculatedValues.sqf +++ b/addons/mk6mortar/functions/fnc_rangeTablePreCalculatedValues.sqf @@ -1,14 +1,17 @@ /* * Author: PabstMirror -Simple Lookup Table for various muzzle velocities and air frictions. -Use ACE_Artillery_fnc_dev_buildTable to build + * Simple Lookup Table for various muzzle velocities and air frictions. + * Use ace_mk6mortar_fnc_dev_buildTable to build * * Arguments: - * 0: NUMBER - Muzzle Velocity -1: NUMBER - Air Friction + * 0: Muzzle Velocity + * 1: Air Friction + * * Return Value: + * * * Example: + * * * Public: No */ diff --git a/addons/mk6mortar/functions/fnc_toggleMils.sqf b/addons/mk6mortar/functions/fnc_toggleMils.sqf index 98714836fc..923a553f43 100644 --- a/addons/mk6mortar/functions/fnc_toggleMils.sqf +++ b/addons/mk6mortar/functions/fnc_toggleMils.sqf @@ -1,12 +1,16 @@ /* * Author: PabstMirror - * + * Toggles the mortart to show mils or degrees * * Arguments: + * 0: Vehicle + * 1: Player * * Return Value: + * No * * Example: + * [mortar,bob] call ace_mk6mortar_fnc_toggleMils; * * Public: No */ diff --git a/addons/mk6mortar/functions/fnc_turretDisplayLoaded.sqf b/addons/mk6mortar/functions/fnc_turretDisplayLoaded.sqf index 860dea069a..dcce66f089 100644 --- a/addons/mk6mortar/functions/fnc_turretDisplayLoaded.sqf +++ b/addons/mk6mortar/functions/fnc_turretDisplayLoaded.sqf @@ -1,10 +1,12 @@ /* * Author: PabstMirror - * + * Called when the mk6's in game UI is loaded. Hides rangefinder data if it is disabled. * * Arguments: + * None * * Return Value: + * None * * Example: * @@ -12,7 +14,6 @@ */ #include "script_component.hpp" - #define CTRL_CA_OPTICSPITCH (configFile >> "RscInGameUI" >> "ACE_Mk6_RscWeaponRangeArtillery" >> "CA_IGUI_elements_group" >> "controls" >> "CA_OPTICSPITCH") #define CTRL_CA_OPTICSZOOM (configFile >> "RscInGameUI" >> "ACE_Mk6_RscWeaponRangeArtillery" >> "CA_IGUI_elements_group" >> "controls" >> "CA_OPTICSZOOM") #define CTRL_CA_SOLUTION_TEXT (configFile >> "RscInGameUI" >> "ACE_Mk6_RscWeaponRangeArtillery" >> "CA_IGUI_elements_group" >> "controls" >> "CA_SOLUTION_TEXT") @@ -27,7 +28,6 @@ #define CTRL_CA_ELEV (configFile >> "RscInGameUI" >> "ACE_Mk6_RscWeaponRangeArtillery" >> "CA_IGUI_elements_group" >> "controls" >> "CA_ELEV") #define CTRL_CA_ELEV_NEED (configFile >> "RscInGameUI" >> "ACE_Mk6_RscWeaponRangeArtillery" >> "CA_IGUI_elements_group" >> "controls" >> "CA_ELEV_NEED") - disableSerialization; // PARAMS_1(_display); From 2ada87e3ac09e4a2ae3db6a5257a60e349ee436e Mon Sep 17 00:00:00 2001 From: PabstMirror Date: Sun, 5 Apr 2015 18:05:23 -0500 Subject: [PATCH 14/22] Rangetable Item --- addons/mk6mortar/CfgVehicles.hpp | 4 ++-- addons/mk6mortar/CfgWeapons.hpp | 12 +++++++++++ addons/mk6mortar/XEH_preInit.sqf | 1 + addons/mk6mortar/config.cpp | 2 +- .../functions/fnc_rangeTableCanUse.sqf | 21 +++++++++++++++++++ 5 files changed, 37 insertions(+), 3 deletions(-) create mode 100644 addons/mk6mortar/functions/fnc_rangeTableCanUse.sqf diff --git a/addons/mk6mortar/CfgVehicles.hpp b/addons/mk6mortar/CfgVehicles.hpp index 7c39aeafdd..b7d6ed9365 100644 --- a/addons/mk6mortar/CfgVehicles.hpp +++ b/addons/mk6mortar/CfgVehicles.hpp @@ -5,8 +5,8 @@ class CfgVehicles { class ACE_Equipment { class GVAR(rangetable) { displayName = "Open 82mm Rangetable"; - condition = QUOTE(true); - statement = QUOTE(call FUNC(rangeTableOpen)); + condition = QUOTE(_this call FUNC(rangeTableCanUse)); + statement = QUOTE(_this call FUNC(rangeTableOpen)); priority = 0; icon = QUOTE(PATHTOF(UI\icon_rangeTable.paa)); }; diff --git a/addons/mk6mortar/CfgWeapons.hpp b/addons/mk6mortar/CfgWeapons.hpp index 9d03783519..f628fe1717 100644 --- a/addons/mk6mortar/CfgWeapons.hpp +++ b/addons/mk6mortar/CfgWeapons.hpp @@ -1,3 +1,15 @@ class CfgWeapons { + class ACE_ItemCore; + class InventoryItem_Base_F; + class ACE_RangeTable_82mm: ACE_ItemCore { + author = "$STR_ACE_Common_ACETeam"; + scope = 2; + displayName = "82mm Rangetable"; + descriptionShort = "82mm Rangetable D"; + picture = QUOTE(PATHTOF(UI\icon_rangeTable.paa)); + class ItemInfo: InventoryItem_Base_F { + mass = 0.5; + }; + }; }; diff --git a/addons/mk6mortar/XEH_preInit.sqf b/addons/mk6mortar/XEH_preInit.sqf index a60fcb9ce6..9af89ccb35 100644 --- a/addons/mk6mortar/XEH_preInit.sqf +++ b/addons/mk6mortar/XEH_preInit.sqf @@ -11,6 +11,7 @@ PREP(dev_simulateShot); PREP(handleFired); PREP(handlePlayerVehicleChanged); PREP(moduleInit); +PREP(rangeTableCanUse); PREP(rangeTableOpen); PREP(rangeTablePageChange); PREP(rangeTablePreCalculatedValues); diff --git a/addons/mk6mortar/config.cpp b/addons/mk6mortar/config.cpp index b39b036416..a6e63c819b 100644 --- a/addons/mk6mortar/config.cpp +++ b/addons/mk6mortar/config.cpp @@ -3,7 +3,7 @@ class CfgPatches { class ADDON { units[] = {}; - weapons[] = {}; + weapons[] = {"ACE_RangeTable_82mm"}; requiredVersion = REQUIRED_VERSION; requiredAddons[] = {"ace_interaction"}; author[] = {"PabstMirror"}; diff --git a/addons/mk6mortar/functions/fnc_rangeTableCanUse.sqf b/addons/mk6mortar/functions/fnc_rangeTableCanUse.sqf new file mode 100644 index 0000000000..04ca9c3278 --- /dev/null +++ b/addons/mk6mortar/functions/fnc_rangeTableCanUse.sqf @@ -0,0 +1,21 @@ +/* + * Author: PabstMirror + * Can player open 82mm rangetable. + * + * Arguments: + * 0: Vehicle + * 1: Player + * + * Return Value: + * Can Open + * + * Example: + * [bob, bob] call ace_mk6mortar_fnc_rangeTableCanUse + * + * Public: No + */ +#include "script_component.hpp" + +PARAMS_2(_vehicle,_player); + +"ACE_RangeTable_82mm" in (items _player); \ No newline at end of file From d295ee6980914360bcd8e38ed19514461150616a Mon Sep 17 00:00:00 2001 From: PabstMirror Date: Mon, 6 Apr 2015 01:05:28 -0500 Subject: [PATCH 15/22] Localization / Headers --- addons/mk6mortar/CfgEventHandlers.hpp | 7 ++ addons/mk6mortar/CfgVehicles.hpp | 3 +- addons/mk6mortar/CfgWeapons.hpp | 4 +- .../functions/fnc_dev_buildTable.sqf | 89 +++++++++---------- .../functions/fnc_dev_formatNumber.sqf | 76 ++++++++-------- .../fnc_dev_simulateFindSolution.sqf | 57 ++++++------ .../functions/fnc_dev_simulateShot.sqf | 63 ++++++------- .../mk6mortar/functions/fnc_handleFired.sqf | 28 +++--- .../fnc_handlePlayerVehicleChanged.sqf | 28 +++--- addons/mk6mortar/functions/fnc_moduleInit.sqf | 2 +- .../functions/fnc_rangeTableOpen.sqf | 4 +- .../functions/fnc_rangeTablePageChange.sqf | 2 +- .../fnc_rangeTablePreCalculatedValues.sqf | 2 +- .../functions/fnc_turretDisplayLoaded.sqf | 3 +- addons/mk6mortar/stringtable.xml | 15 +++- 15 files changed, 200 insertions(+), 183 deletions(-) diff --git a/addons/mk6mortar/CfgEventHandlers.hpp b/addons/mk6mortar/CfgEventHandlers.hpp index 3daad1425a..34c6ecc22c 100644 --- a/addons/mk6mortar/CfgEventHandlers.hpp +++ b/addons/mk6mortar/CfgEventHandlers.hpp @@ -8,3 +8,10 @@ class Extended_PostInit_EventHandlers { clientInit = QUOTE( call COMPILE_FILE(XEH_clientInit) ); }; }; +class Extended_FiredBIS_EventHandlers { + class Mortar_01_base_F { + class ADDON { + firedBIS = QUOTE(_this call FUNC(handleFired)); + }; + }; +}; diff --git a/addons/mk6mortar/CfgVehicles.hpp b/addons/mk6mortar/CfgVehicles.hpp index b7d6ed9365..a40cc68efb 100644 --- a/addons/mk6mortar/CfgVehicles.hpp +++ b/addons/mk6mortar/CfgVehicles.hpp @@ -4,11 +4,12 @@ class CfgVehicles { class ACE_SelfActions { class ACE_Equipment { class GVAR(rangetable) { - displayName = "Open 82mm Rangetable"; + displayName = "$STR_ACE_MK6MORTAR_rangetable_action"; condition = QUOTE(_this call FUNC(rangeTableCanUse)); statement = QUOTE(_this call FUNC(rangeTableOpen)); priority = 0; icon = QUOTE(PATHTOF(UI\icon_rangeTable.paa)); + exceptions[] = {"notOnMap", "isNotInside"}; }; }; }; diff --git a/addons/mk6mortar/CfgWeapons.hpp b/addons/mk6mortar/CfgWeapons.hpp index f628fe1717..7d5153e9ad 100644 --- a/addons/mk6mortar/CfgWeapons.hpp +++ b/addons/mk6mortar/CfgWeapons.hpp @@ -5,8 +5,8 @@ class CfgWeapons { class ACE_RangeTable_82mm: ACE_ItemCore { author = "$STR_ACE_Common_ACETeam"; scope = 2; - displayName = "82mm Rangetable"; - descriptionShort = "82mm Rangetable D"; + displayName = "$STR_ACE_MK6MORTAR_rangetable_name"; + descriptionShort = "$STR_ACE_MK6MORTAR_rangetable_description"; picture = QUOTE(PATHTOF(UI\icon_rangeTable.paa)); class ItemInfo: InventoryItem_Base_F { mass = 0.5; diff --git a/addons/mk6mortar/functions/fnc_dev_buildTable.sqf b/addons/mk6mortar/functions/fnc_dev_buildTable.sqf index d36aa61819..b659cd1512 100644 --- a/addons/mk6mortar/functions/fnc_dev_buildTable.sqf +++ b/addons/mk6mortar/functions/fnc_dev_buildTable.sqf @@ -1,24 +1,23 @@ /* -Name: AGM_Artillery_fnc_dev_buildTable - -Author: Pabst Mirror - -Description: - DEV function to build mortar tables, very cpu intensive (never used durring normal gameplay) - -Parameters: (normal BIS "Fired" EH stuff) - 0: NUMBER - Muzzle Velocity - 1: NUMBER - Air Friction - -Returns: - Data in clipboard - -Example: - [100, -0.0001] spawn AGM_Artillery_fnc_dev_buildTable; //spawn (scheduled) is slower - [100, -0.0001] call AGM_Artillery_fnc_dev_buildTable; //faster, but will lock while processing -*/ + * Author: PabstMirror + * DEV function to build mortar tables, very cpu intensive (never used durring normal gameplay) + * + * Arguments: + * 0: Muzzle Velocity + * 1: Air Friction + * + * Return Value: + * + * + * Example: + * [100, -0.0001] spawn ace_mk6mortar_fnc_dev_buildTable; //spawn (scheduled) is slower + * [100, -0.0001] call ace_mk6mortar_fnc_dev_buildTable; //faster, but will lock while processing + * + * Public: No + */ #include "script_component.hpp" + private ["_muzzleVelocity", "_airFriction", "_stillInRange", "_currentRange", "_increasePerRow", "_outputArray", "_rangeToHit", "_lineElevation", "_lineHeightElevation", "_lineTimeOfFlight", "_lineCrosswindDeg", "_lineHeadwindMeters", "_lineTailWindMeters", "_lineTempDec", "_lineTempInc", "_lineAirDensDec", "_lineAirDensInc", "_result", "_outputString"]; _muzzleVelocity = _this select 0; @@ -32,28 +31,28 @@ _outputArray = []; //[_rangeToHit, _lineElevation, _lineHeightElevation, _lineTimeOfFlight, _lineCrosswindDeg, _lineHeadwindMeters, _lineTailWindMeters, _lineTempDec, _lineTempInc, _lineAirDensDec, _lineAirDensInc] while {_stillInRange} do { - _result = [_muzzleVelocity, _currentRange, _airFriction] call FUNC(dev_simulateCalcRangeTableLine); - if (_result isEqualTo []) then { - _stillInRange = false; - } else { - if ((_result select 1) < 86) then { - _outputArray pushBack [ - ([(_result select 0), "meters", false] call FUNC(dev_formatNumber)), - ([(_result select 1), "mil", true] call FUNC(dev_formatNumber)), - ([(_result select 2), "mil", true] call FUNC(dev_formatNumber)), - ([(_result select 3), "sec", false] call FUNC(dev_formatNumber)), - ([(_result select 4), "milPrecise", true] call FUNC(dev_formatNumber)), - ([(_result select 5), "metersprecise", false] call FUNC(dev_formatNumber)), - ([(_result select 6), "metersprecise", false] call FUNC(dev_formatNumber)), - ([(_result select 7), "metersprecise", false] call FUNC(dev_formatNumber)), - ([(_result select 8), "metersprecise", false] call FUNC(dev_formatNumber)), - ([(_result select 9), "metersprecise", false] call FUNC(dev_formatNumber)), - ([(_result select 10), "metersprecise", false] call FUNC(dev_formatNumber)) - ]; + _result = [_muzzleVelocity, _currentRange, _airFriction] call FUNC(dev_simulateCalcRangeTableLine); + if (_result isEqualTo []) then { + _stillInRange = false; + } else { + if ((_result select 1) < 86) then { + _outputArray pushBack [ + ([(_result select 0), "meters", false] call FUNC(dev_formatNumber)), + ([(_result select 1), "mil", true] call FUNC(dev_formatNumber)), + ([(_result select 2), "mil", true] call FUNC(dev_formatNumber)), + ([(_result select 3), "sec", false] call FUNC(dev_formatNumber)), + ([(_result select 4), "milPrecise", true] call FUNC(dev_formatNumber)), + ([(_result select 5), "metersprecise", false] call FUNC(dev_formatNumber)), + ([(_result select 6), "metersprecise", false] call FUNC(dev_formatNumber)), + ([(_result select 7), "metersprecise", false] call FUNC(dev_formatNumber)), + ([(_result select 8), "metersprecise", false] call FUNC(dev_formatNumber)), + ([(_result select 9), "metersprecise", false] call FUNC(dev_formatNumber)), + ([(_result select 10), "metersprecise", false] call FUNC(dev_formatNumber)) + ]; + }; + _currentRange = _currentRange + _increasePerRow; }; - _currentRange = _currentRange + _increasePerRow; - }; - hint str _currentRange; + hintSilent str _currentRange; }; //handle floating point rounding errors @@ -62,14 +61,14 @@ _outputString = format ["case ((abs(_muzzleVelocity - %1) < 0.00001) && ((abs(_a ", _muzzleVelocity, _airFriction]; { - if (_forEachIndex < ((count _outputArray) - 1)) then { - _outputString = _outputString + format ["%1, + if (_forEachIndex < ((count _outputArray) - 1)) then { + _outputString = _outputString + format ["%1, ", _x]; - } else { - _outputString = _outputString + format ["%1 - ] + } else { + _outputString = _outputString + format ["%1 + ] };", _x]; - }; + }; } forEach _outputArray; copyToClipboard _outputString; diff --git a/addons/mk6mortar/functions/fnc_dev_formatNumber.sqf b/addons/mk6mortar/functions/fnc_dev_formatNumber.sqf index 47e9fc7fbf..a8ad155eec 100644 --- a/addons/mk6mortar/functions/fnc_dev_formatNumber.sqf +++ b/addons/mk6mortar/functions/fnc_dev_formatNumber.sqf @@ -4,19 +4,19 @@ Name: AGM_Artillery_fnc_formatNumber Author: Pabst Mirror Description: - Converts numbers into nicely formated strings. +Converts numbers into nicely formated strings. Parameters: - 0: NUMBER - Input number - 1: STRING - Output type (see case statement) - 2: BOOL - If output type is mil, convert input type from deg->mil +0: NUMBER - Input number +1: STRING - Output type (see case statement) +2: BOOL - If output type is mil, convert input type from deg->mil Returns: - STRING - Formatted number +STRING - Formatted number Example: - [45, "mil4", true] call AGM_Artillery_fnc_formatNumber = "0800" -*/ +[45, "mil4", true] call AGM_Artillery_fnc_formatNumber = "0800" + */ #include "script_component.hpp" private ["_theNumber", "_inputType", "_convertToMils", "_decimalPlaces", "_integerPlaces", "_prefix", "_return"]; @@ -30,47 +30,47 @@ _integerPlaces = -1; switch (toLower _inputType) do { case ("meters"): { - _decimalPlaces = 0; - _integerPlaces = 1; - }; + _decimalPlaces = 0; + _integerPlaces = 1; + }; case ("metersprecise"): { - _decimalPlaces = 1; - _integerPlaces = 1; - }; + _decimalPlaces = 1; + _integerPlaces = 1; + }; case ("meters4"): { - _decimalPlaces = 0; - _integerPlaces = 4; - }; + _decimalPlaces = 0; + _integerPlaces = 4; + }; case ("deg3precise"): { - _decimalPlaces = 2; - _integerPlaces = 3; - }; + _decimalPlaces = 2; + _integerPlaces = 3; + }; case ("mil"): { - _decimalPlaces = 0; - _integerPlaces = 1; - if (_convertToMils) then { - _theNumber = _theNumber * (6400 / 360); + _decimalPlaces = 0; + _integerPlaces = 1; + if (_convertToMils) then { + _theNumber = _theNumber * (6400 / 360); + }; }; - }; case ("mil4"): { - _decimalPlaces = 0; - _integerPlaces = 4; - if (_convertToMils) then { - _theNumber = _theNumber * (6400 / 360); + _decimalPlaces = 0; + _integerPlaces = 4; + if (_convertToMils) then { + _theNumber = _theNumber * (6400 / 360); + }; }; - }; case ("milprecise"): { - _decimalPlaces = 1; - _integerPlaces = 1; - if (_convertToMils) then { - _theNumber = _theNumber * (6400 / 360); + _decimalPlaces = 1; + _integerPlaces = 1; + if (_convertToMils) then { + _theNumber = _theNumber * (6400 / 360); + }; }; - }; case ("sec"): { - _decimalPlaces = 1; - _integerPlaces = 1; - }; - default {systemChat format ["badtype %1", _inputType];}; + _decimalPlaces = 1; + _integerPlaces = 1; + }; + default {systemChat format ["badtype %1", _inputType];}; }; diff --git a/addons/mk6mortar/functions/fnc_dev_simulateFindSolution.sqf b/addons/mk6mortar/functions/fnc_dev_simulateFindSolution.sqf index ddeab4015f..29a44e3a51 100644 --- a/addons/mk6mortar/functions/fnc_dev_simulateFindSolution.sqf +++ b/addons/mk6mortar/functions/fnc_dev_simulateFindSolution.sqf @@ -1,26 +1,25 @@ /* -Name: FUNC(simulateFindSolution) - -Author: Pabst Mirror - -Description: - Converts numbers into nicely formated strings. - -Parameters: - 0: NUMBER - Range to Hit (Meters) - 1: NUMBER - Height To Hit (Meters) - 2: NUMBER - Muzzle Velocity (M/S) - 3: NUMBER - Air Friction - 4: NUMBER - Time Step (seconds) (eg 1/50 will simulate 50 cycles per second) - -Returns: - ARRAY - [NUMBER - Elevation In Degrees, NUMBER - Shot Durration] - -Example: - [_rangeToHit, _heightToHit, _muzzleVelocity, _airFriction, TIME_STEP] call FUNC(simulateFindSolution); -*/ + * Author: PabstMirror + * DEV to find a firing solution for a given range + * + * Arguments: + * 0: Range to Hit (Meters) + * 1: Height To Hit (Meters) + * 2: Muzzle Velocity (M/S) + * 3: Air Friction + * 4: Time Step (seconds) (eg 1/50 will simulate 50 cycles per second) + * + * Return Value: + * ARRAY - [NUMBER - Elevation In Degrees, NUMBER - Shot Durration] + * + * Example: + * [_rangeToHit, _heightToHit, _muzzleVelocity, _airFriction, TIME_STEP] call FUNC(simulateFindSolution); + * + * Public: No + */ #include "script_component.hpp" + private ["_rangeToHit", "_heightToHit", "_muzzleVelocity", "_airFriction", "_maxElev", "_minElev", "_error", "_solutionElevation", "_lastTestResult", "_numberOfAttempts"]; #define MAX_ATTEMPTS 22 @@ -41,15 +40,15 @@ _numberOfAttempts = 0; //(binary search) while {(_numberOfAttempts < MAX_ATTEMPTS) && ((abs _error) > 0.2)} do { - _numberOfAttempts = _numberOfAttempts + 1; - _solutionElevation = (_maxElev + _minElev) / 2; - _lastTestResult = [_solutionElevation, _muzzleVelocity, _airFriction, 15, 1, 0, 0, _heightToHit, _timeStep] call FUNC(dev_simulateShot); - _error = _rangeToHit - (_lastTestResult select 0); - if (_error > 0) then { - _maxElev = _solutionElevation; //test range was short - } else { - _minElev = _solutionElevation; //test range was long - }; + _numberOfAttempts = _numberOfAttempts + 1; + _solutionElevation = (_maxElev + _minElev) / 2; + _lastTestResult = [_solutionElevation, _muzzleVelocity, _airFriction, 15, 1, 0, 0, _heightToHit, _timeStep] call FUNC(dev_simulateShot); + _error = _rangeToHit - (_lastTestResult select 0); + if (_error > 0) then { + _maxElev = _solutionElevation; //test range was short + } else { + _minElev = _solutionElevation; //test range was long + }; }; if (_numberOfAttempts >= MAX_ATTEMPTS) exitWith {[]}; diff --git a/addons/mk6mortar/functions/fnc_dev_simulateShot.sqf b/addons/mk6mortar/functions/fnc_dev_simulateShot.sqf index 42ceef21fd..de8471726c 100644 --- a/addons/mk6mortar/functions/fnc_dev_simulateShot.sqf +++ b/addons/mk6mortar/functions/fnc_dev_simulateShot.sqf @@ -1,31 +1,26 @@ /* -Name: simulateShot - -Author: Pabst Mirror - -Description: - Simulates the path of a fired shell. - -Parameters: - 0: NUMBER - Shot Angle (degrees) - 1: NUMBER - Muzzle Velocity (m/s) - 2: NUMBER - Air Friction - 3: NUMBER - Tempeture (degres celcius) - 4: NUMBER - Relative Air Denisty - 5: NUMBER - Tail Wind (m/s) - 6: NUMBER - Cross Wind (m/s) - 7: NUMBER - Height Of Target (M) - 8: NUMBER - Time Step (fraction of a second) - -Returns: - ARRAY - - NUMBER - Distance Traveld - NUMBER - Shot Time - NUMBER - Offset (degrees) - -Example: - [45, 180, -0.0001, 15, 1, 10, 0, 0, 1/50] call simulateShot; -*/ + * Author: PabstMirror + * DEV function to build mortar tables, very cpu intensive (never used durring normal gameplay) + * + * Arguments: + * 0: Shot Angle (degrees) + * 1: Muzzle Velocity (m/s) + * 2: Air Friction + * 3: Tempeture (degres celcius) + * 4: Relative Air Denisty + * 5: Tail Wind (m/s) + * 6: Cross Wind (m/s) + * 7: Height Of Target (M) + * 8: Time Step (fraction of a second) + * + * Return Value: + * [Distance Traveled, Shot Time, Offset (degrees)] + * + * Example: + * [45, 180, -0.0001, 15, 1, 10, 0, 0, 1/50] call ace_mk6mortar_fnc_dev_simulateShot; + * + * Public: No + */ #include "script_component.hpp" private ["_angleDeg", "_muzzleVelocity", "_airFriction", "_temp", "_relDensity", "_tailWind", "_crosswind", "_heightOfTarget", "_wind", "_gravity", "_timeStep", "_currentPos", "_currentVelocity", "_currentTime", "_lastPos", "_kCoefficent", "_aparentWind", "_changeInVelocity", "_linConversion", "_middlePos", "_middlePosOld", "_middleTotalTravelTime", "_offsetDeg"]; @@ -53,15 +48,15 @@ _lastPos = _currentPos; _kCoefficent = -1 * _relDensity * _airFriction; //save time in the loop and compute once while {((_currentVelocity select 2) > 0) || ((_currentPos select 2) >= _heightOfTarget)} do { - _lastPos = _currentPos; + _lastPos = _currentPos; - _aparentWind = _wind vectorDiff _currentVelocity; - _changeInVelocity = _gravity vectorAdd (_aparentWind vectorMultiply ((vectorMagnitude _aparentWind) * _kCoefficent)); + _aparentWind = _wind vectorDiff _currentVelocity; + _changeInVelocity = _gravity vectorAdd (_aparentWind vectorMultiply ((vectorMagnitude _aparentWind) * _kCoefficent)); - _currentVelocity = _currentVelocity vectorAdd (_changeInVelocity vectorMultiply _timeStep); + _currentVelocity = _currentVelocity vectorAdd (_changeInVelocity vectorMultiply _timeStep); - _currentPos = _currentPos vectorAdd (_currentVelocity vectorMultiply _timeStep); - _currentTime = _currentTime + _timeStep; + _currentPos = _currentPos vectorAdd (_currentVelocity vectorMultiply _timeStep); + _currentTime = _currentTime + _timeStep; }; //Uses linearConversion to get a weighted average betwen points before and after dropping below target height @@ -73,6 +68,6 @@ _middlePos = (_lastPos vectorMultiply (1 - _linConversion)) vectorAdd (_currentP _middleTotalTravelTime = _currentTime - (_timeStep * (1-_linConversion)); //Find shot offset (from crosswind), in degrees - _offsetDeg = (_middlePos select 0) aTan2 (_middlePos select 1); +_offsetDeg = (_middlePos select 0) aTan2 (_middlePos select 1); [(_middlePos select 1), _middleTotalTravelTime, _offsetDeg] diff --git a/addons/mk6mortar/functions/fnc_handleFired.sqf b/addons/mk6mortar/functions/fnc_handleFired.sqf index 679b689d6d..555abcbe6f 100644 --- a/addons/mk6mortar/functions/fnc_handleFired.sqf +++ b/addons/mk6mortar/functions/fnc_handleFired.sqf @@ -15,7 +15,7 @@ * Nothing * * Example: - * [clientFiredBIS-XEH] call ace_mk6mortars_fnc_handleFired + * [clientFiredBIS-XEH] call ace_mk6mortar_fnc_handleFired * * Public: No */ @@ -26,27 +26,29 @@ disableSerialization; PARAMS_7(_vehicle,_weapon,_muzzle,_mode,_ammo,_magazine,_projectile); if (!GVAR(airResistanceEnabled)) exitWith {}; - -if (_unit distance ACE_player > 3000) exitWith {false}; // Large enough distance to not simulate any wind deflection. +// Large enough distance to not simulate any wind deflection +if (_unit distance ACE_player > 8000) exitWith {false}; //AI will have no clue how to use: _shooterMan = gunner _vehicle; if (!([_shooterMan] call EFUNC(common,isPlayer))) exitWith {false}; +//Should be zero, just make sure: +_bisAirFriction = getNumber (configFile >> "CfgAmmo" >> _ammo >> "airFriction"); +if (_bisAirFriction != 0) exitWith {ERROR("Non zero base airFriction");}; //Hack Until these are intergrated: if (isNil QEGVAR(weather,currentRelativeDensity)) then { EGVAR(weather,currentRelativeDensity) = 1; }; if (isNil QEGVAR(weather,currentTemperature)) then { - EGVAR(weather,currentTemperature) = 20; + EGVAR(weather,currentTemperature) = 15; }; //powder effects: _temperature = EGVAR(weather,currentTemperature); _newMuzzleVelocityCoefficent = (((_temperature + 273.13) / 288.13 - 1) / 40 + 1); -systemChat str _newMuzzleVelocityCoefficent; if (_newMuzzleVelocityCoefficent != 1) then { _bulletVelocity = velocity _projectile; _bulletSpeed = vectorMagnitude _bulletVelocity; @@ -55,8 +57,8 @@ if (_newMuzzleVelocityCoefficent != 1) then { _muzzleVelocity = _muzzleVelocity + _muzzleVelocityShift; }; +systemChat format ["PFEH for %1", _ammo]; -// if (_bullet isKindOf "BulletBase") then { [{ private ["_deltaT", "_bulletVelocity", "_bulletSpeed", "_trueVelocity", "_trueSpeed", "_dragRef", "_accelRef", "_drag", "_accel"]; PARAMS_2(_args,_pfID); @@ -72,17 +74,13 @@ if (_newMuzzleVelocityCoefficent != 1) then { _bulletVelocity = velocity _shell; _bulletSpeed = vectorMagnitude _bulletVelocity; - if (vectorMagnitude ACE_wind > 0) then { - _trueVelocity = _bulletVelocity vectorDiff ACE_wind; - _trueSpeed = vectorMagnitude _trueVelocity; + _trueVelocity = _bulletVelocity vectorDiff ACE_wind; + _trueSpeed = vectorMagnitude _trueVelocity; - _drag = _deltaT * _airFriction * _trueSpeed * EGVAR(weather,currentRelativeDensity); - _accel = _trueVelocity vectorMultiply (_drag); + _drag = _deltaT * _airFriction * _trueSpeed * EGVAR(weather,currentRelativeDensity); + _accel = _trueVelocity vectorMultiply (_drag); + _bulletVelocity = _bulletVelocity vectorAdd _accel; - _bulletVelocity = _bulletVelocity vectorAdd _accel; - }; _shell setVelocity _bulletVelocity; }, 0, [_projectile, MK6_82mm_AIR_FRICTION, time]] call CBA_fnc_addPerFrameHandler; -// }; - diff --git a/addons/mk6mortar/functions/fnc_handlePlayerVehicleChanged.sqf b/addons/mk6mortar/functions/fnc_handlePlayerVehicleChanged.sqf index 705105eed5..8fa11b1cda 100644 --- a/addons/mk6mortar/functions/fnc_handlePlayerVehicleChanged.sqf +++ b/addons/mk6mortar/functions/fnc_handlePlayerVehicleChanged.sqf @@ -10,6 +10,7 @@ * No * * Example: + * [bob, mortar] call ace_mk6mortar_fnc_handlePlayerVehicleChanged; * * Public: No */ @@ -48,7 +49,7 @@ _fireModes = getArray (configFile >> "CfgWeapons" >> _tubeWeaponName >> "modes") _currentFireMode = (weaponState [_mortarVeh, [0]]) select 2; _currentChargeMode = _fireModes find _currentFireMode; - _text = format ["%1: %2 ", "Charge", _currentChargeMode, QUOTE(PATHTOF(UI\ui_charges.paa))]; + _text = format ["%1: %2 ", (localize "STR_ACE_MK6MORTAR_rangetable_charge"), _currentChargeMode, QUOTE(PATHTOF(UI\ui_charges.paa))]; _chargeText ctrlSetStructuredText parseText _text; if (shownArtilleryComputer && {!GVAR(allowComputerRangefinder)}) then { //Don't like this solution, but it works @@ -57,22 +58,29 @@ _fireModes = getArray (configFile >> "CfgWeapons" >> _tubeWeaponName >> "modes") }; _display = uiNamespace getVariable ["ACE_Mk6_RscWeaponRangeArtillery", displayNull]; - if (isNull _display) exitWith {systemChat "null";}; + if (isNull _display) exitWith {}; //It may be null for the first frame + + //Hud should hidden in 3rd person + _notGunnerView = cameraView != "GUNNER"; //Update CurrentElevation Display: - _elevDeg = parseNumber ctrlText (_display displayCtrl 175); - if (_useMils) then { - (_display displayCtrl 80175) ctrlSetText str round (_elevDeg * 6400 / 360); + if (_notGunnerView) then { + (_display displayCtrl 80175) ctrlSetText ""; } else { - (_display displayCtrl 80175) ctrlSetText str _elevDeg; + _elevDeg = parseNumber ctrlText (_display displayCtrl 175); + if (_useMils) then { + (_display displayCtrl 80175) ctrlSetText str round (_elevDeg * 6400 / 360); + } else { + (_display displayCtrl 80175) ctrlSetText str _elevDeg; + }; }; //Update ElevationNeeded Display: - if (!GVAR(allowComputerRangefinder)) then { + if (_notGunnerView || (!GVAR(allowComputerRangefinder))) then { (_display displayCtrl 80176) ctrlSetText ""; } else { _elevDeg = parseNumber ctrlText (_display displayCtrl 176); - if (_elevDeg <= 0) then { + if (_elevDeg <= 0) then { //Bad data means "----" out of range (_display displayCtrl 80176) ctrlSetText (ctrlText (_display displayCtrl 176)); } else { if (_useMils) then { @@ -84,7 +92,7 @@ _fireModes = getArray (configFile >> "CfgWeapons" >> _tubeWeaponName >> "modes") }; //Update Heading Display: - if (!GVAR(allowCompass)) then { + if (_notGunnerView || (!GVAR(allowCompass))) then { (_display displayCtrl 80156) ctrlSetText ""; } else { _rotationDegrees = ((getDir _mortarVeh) + (((-180 / PI) * (_mortarVeh animationPhase "mainTurret")) + 360)) % 360; @@ -95,4 +103,4 @@ _fireModes = getArray (configFile >> "CfgWeapons" >> _tubeWeaponName >> "modes") }; }; }; -}, 0, [_newVehicle, _chargeText,_fireModes]] call CBA_fnc_addPerFrameHandler; \ No newline at end of file +}, 0, [_newVehicle, _chargeText,_fireModes]] call CBA_fnc_addPerFrameHandler; diff --git a/addons/mk6mortar/functions/fnc_moduleInit.sqf b/addons/mk6mortar/functions/fnc_moduleInit.sqf index c7301c074b..75bab4cee9 100644 --- a/addons/mk6mortar/functions/fnc_moduleInit.sqf +++ b/addons/mk6mortar/functions/fnc_moduleInit.sqf @@ -11,7 +11,7 @@ * None * * Example: - * + * [fromModule] call ace_mk6mortar_fnc_moduleInit * * Public: No */ diff --git a/addons/mk6mortar/functions/fnc_rangeTableOpen.sqf b/addons/mk6mortar/functions/fnc_rangeTableOpen.sqf index 5ad6736e84..67d33c2727 100644 --- a/addons/mk6mortar/functions/fnc_rangeTableOpen.sqf +++ b/addons/mk6mortar/functions/fnc_rangeTableOpen.sqf @@ -9,7 +9,7 @@ * No * * Example: - * + * [] call ace_mk6mortar_fnc_rangeTableOpen * * Public: No */ @@ -38,7 +38,7 @@ _muzzleVelocities = []; _showToPlayer = getNumber (configFile >> "CfgWeapons" >> _weaponName >> _x >> "showToPlayer"); if (_showToPlayer == 1) then { _artilleryCharge = getNumber (configFile >> "CfgWeapons" >> _weaponName >> _x >> "artilleryCharge"); - LIST_CHARGE lbAdd format ["%1: %2 [%3m/s]", "Charge", (count _muzzleVelocities), (_initSpeed * _artilleryCharge)]; + LIST_CHARGE lbAdd format ["%1: %2", (localize "STR_ACE_MK6MORTAR_rangetable_charge"), (count _muzzleVelocities)]; LIST_CHARGE lbSetData [(count _muzzleVelocities), str (_artilleryCharge * _initSpeed)]; _muzzleVelocities pushBack _artilleryCharge; }; diff --git a/addons/mk6mortar/functions/fnc_rangeTablePageChange.sqf b/addons/mk6mortar/functions/fnc_rangeTablePageChange.sqf index eb28b80e6f..6846640f25 100644 --- a/addons/mk6mortar/functions/fnc_rangeTablePageChange.sqf +++ b/addons/mk6mortar/functions/fnc_rangeTablePageChange.sqf @@ -9,7 +9,7 @@ * No * * Example: - * + * [] call ace_mk6mortar_fnc_rangeTablePageChange * * Public: No */ diff --git a/addons/mk6mortar/functions/fnc_rangeTablePreCalculatedValues.sqf b/addons/mk6mortar/functions/fnc_rangeTablePreCalculatedValues.sqf index 5c8489941f..7c34b6389f 100644 --- a/addons/mk6mortar/functions/fnc_rangeTablePreCalculatedValues.sqf +++ b/addons/mk6mortar/functions/fnc_rangeTablePreCalculatedValues.sqf @@ -11,7 +11,7 @@ * * * Example: - * + * [200, 0] call ace_mk6mortar_fnc_rangeTablePreCalculatedValues * * Public: No */ diff --git a/addons/mk6mortar/functions/fnc_turretDisplayLoaded.sqf b/addons/mk6mortar/functions/fnc_turretDisplayLoaded.sqf index dcce66f089..4972265528 100644 --- a/addons/mk6mortar/functions/fnc_turretDisplayLoaded.sqf +++ b/addons/mk6mortar/functions/fnc_turretDisplayLoaded.sqf @@ -9,6 +9,7 @@ * None * * Example: + * [] call ace_mk6mortar_fnc_turretDisplayLoaded * * Public: No */ @@ -28,9 +29,9 @@ #define CTRL_CA_ELEV (configFile >> "RscInGameUI" >> "ACE_Mk6_RscWeaponRangeArtillery" >> "CA_IGUI_elements_group" >> "controls" >> "CA_ELEV") #define CTRL_CA_ELEV_NEED (configFile >> "RscInGameUI" >> "ACE_Mk6_RscWeaponRangeArtillery" >> "CA_IGUI_elements_group" >> "controls" >> "CA_ELEV_NEED") + disableSerialization; -// PARAMS_1(_display); _display = uiNamespace getVariable ["ACE_Mk6_RscWeaponRangeArtillery", displayNull]; if (isNull _display) exitWith {}; diff --git a/addons/mk6mortar/stringtable.xml b/addons/mk6mortar/stringtable.xml index d105660bcd..da61afb03b 100644 --- a/addons/mk6mortar/stringtable.xml +++ b/addons/mk6mortar/stringtable.xml @@ -1,9 +1,18 @@  - + - - Mk6 Mortar: Show Angle in MILS + + 82mm Rangetable + + + Range Table for the MK6 82mm Mortar + + + Open 82mm Rangetable + + + Charge \ No newline at end of file From b9341033d7bcd3eb422bf825726a991894d545ce Mon Sep 17 00:00:00 2001 From: PabstMirror Date: Tue, 7 Apr 2015 19:19:08 -0500 Subject: [PATCH 16/22] Rangetable for vanilla ballistics --- addons/mk6mortar/RscRangeTable.hpp | 16 +- .../functions/fnc_dev_buildTable.sqf | 12 +- .../functions/fnc_rangeTablePageChange.sqf | 4 +- .../fnc_rangeTablePreCalculatedValues.sqf | 262 +++++++++++++----- 4 files changed, 220 insertions(+), 74 deletions(-) diff --git a/addons/mk6mortar/RscRangeTable.hpp b/addons/mk6mortar/RscRangeTable.hpp index 96516779ac..cb89b093e3 100644 --- a/addons/mk6mortar/RscRangeTable.hpp +++ b/addons/mk6mortar/RscRangeTable.hpp @@ -16,9 +16,9 @@ class ACE_82mm_RangeTable_Dialog { }; class ChargeBackground: RscText { idc = -1; - x = "13 *(safeZoneH / 40) + (safezoneX + (safezoneW - safeZoneH)/2)"; + x = "14 *(safeZoneH / 40) + (safezoneX + (safezoneW - safeZoneH)/2)"; y = "1 * ((safeZoneH / 1.2) / 25) + (safezoneY + (safezoneH - (safeZoneH / 1.2))/2)"; - w = "5 * (safeZoneH / 40)"; + w = "4 * (safeZoneH / 40)"; h = "5 * ((safeZoneH / 1.2) / 25)"; colorBackground[] = {0,0,0,1}; }; @@ -54,16 +54,16 @@ class ACE_82mm_RangeTable_Dialog { class ChargeListBox: RscListbox { idc = 1501; style = ST_RIGHT; - x = "13 *(safeZoneH / 40) + (safezoneX + (safezoneW - safeZoneH)/2)"; - y = "1 * ((safeZoneH / 1.2) / 25) + (safezoneY + (safezoneH - (safeZoneH / 1.2))/2)"; - w = "5 * (safeZoneH / 40)"; + x = "14 *(safeZoneH / 40) + (safezoneX + (safezoneW - safeZoneH)/2)"; + y = "1 * ((safeZoneH / 1.2) / 25) + (safezoneY + (safezoneH - (safeZoneH / 1.2))/2)"; + w = "4 * (safeZoneH / 40)"; h = "5 * ((safeZoneH / 1.2) / 25)"; onLBSelChanged = QUOTE(_this call FUNC(rangeTablePageChange)); }; class CloseBackground: RscText { idc = -1; - x = "33.7634559672906 *(safeZoneH / 40) + (safezoneX + (safezoneW - safeZoneH)/2)"; - y = "1 * ((safeZoneH / 1.2) / 25) + (safezoneY + (safezoneH - (safeZoneH / 1.2))/2)"; + x = "33.7634559672906 *(safeZoneH / 40) + (safezoneX + (safezoneW - safeZoneH)/2)"; + y = "1 * ((safeZoneH / 1.2) / 25) + (safezoneY + (safezoneH - (safeZoneH / 1.2))/2)"; w = "0.5 * (safeZoneH / 40)"; h = "0.5 * ((safeZoneH / 1.2) / 25)"; colorBackground[] = {0,0,0,0.5}; @@ -73,7 +73,7 @@ class ACE_82mm_RangeTable_Dialog { style = 48; color[] = {1,1,1,0.7}; text = "A3\Ui_f\data\GUI\Rsc\RscDisplayArcadeMap\icon_exit_cross_ca.paa"; - x = "33.7634559672906 *(safeZoneH / 40) + (safezoneX + (safezoneW - safeZoneH)/2)"; + x = "33.7634559672906 *(safeZoneH / 40) + (safezoneX + (safezoneW - safeZoneH)/2)"; y = "1 * ((safeZoneH / 1.2) / 25) + (safezoneY + (safezoneH - (safeZoneH / 1.2))/2)"; w = "0.5 * (safeZoneH / 40)"; h = "0.5 * ((safeZoneH / 1.2) / 25)"; diff --git a/addons/mk6mortar/functions/fnc_dev_buildTable.sqf b/addons/mk6mortar/functions/fnc_dev_buildTable.sqf index b659cd1512..a795b96776 100644 --- a/addons/mk6mortar/functions/fnc_dev_buildTable.sqf +++ b/addons/mk6mortar/functions/fnc_dev_buildTable.sqf @@ -35,7 +35,16 @@ while {_stillInRange} do { if (_result isEqualTo []) then { _stillInRange = false; } else { - if ((_result select 1) < 86) then { + if (_airFriction == 0) then { + _result set [4, 0]; + _result set [5, 0]; + _result set [6, 0]; + _result set [7, 0]; + _result set [8, 0]; + _result set [9, 0]; + _result set [10, 0]; + }; + if ((_result select 1) < 88) then { _outputArray pushBack [ ([(_result select 0), "meters", false] call FUNC(dev_formatNumber)), ([(_result select 1), "mil", true] call FUNC(dev_formatNumber)), @@ -72,5 +81,6 @@ _outputString = format ["case ((abs(_muzzleVelocity - %1) < 0.00001) && ((abs(_a } forEach _outputArray; copyToClipboard _outputString; +rangeTableOutput = _outputString; hint "done"; \ No newline at end of file diff --git a/addons/mk6mortar/functions/fnc_rangeTablePageChange.sqf b/addons/mk6mortar/functions/fnc_rangeTablePageChange.sqf index 6846640f25..c9ee241b7a 100644 --- a/addons/mk6mortar/functions/fnc_rangeTablePageChange.sqf +++ b/addons/mk6mortar/functions/fnc_rangeTablePageChange.sqf @@ -22,7 +22,9 @@ _listBoxData = LIST_CHARGE lbData (lbCurSel LIST_CHARGE); if (isNil "_listBoxData" || {_listBoxData == ""}) exitWith {ERROR("lbCurSel out of bounds or no data");}; _muzzleVelocity = parseNumber _listBoxData; -_precalcArray = [_muzzleVelocity, MK6_82mm_AIR_FRICTION] call FUNC(rangeTablePreCalculatedValues); +_airFriction = if (GVAR(airResistanceEnabled)) then {MK6_82mm_AIR_FRICTION} else {0}; + +_precalcArray = [_muzzleVelocity, _airFriction] call FUNC(rangeTablePreCalculatedValues); lnbClear RANGE_TABLE; { diff --git a/addons/mk6mortar/functions/fnc_rangeTablePreCalculatedValues.sqf b/addons/mk6mortar/functions/fnc_rangeTablePreCalculatedValues.sqf index 7c34b6389f..6752a87542 100644 --- a/addons/mk6mortar/functions/fnc_rangeTablePreCalculatedValues.sqf +++ b/addons/mk6mortar/functions/fnc_rangeTablePreCalculatedValues.sqf @@ -26,8 +26,8 @@ case ((abs(_muzzleVelocity - 70) < 0.00001) && ((abs(_airFriction - -0.0001) < 0 ["100","1493","9","14.0","3.7","0.4","-0.3","0.0","-0.0","-0.0","0.0"], ["150","1438","14","13.9","2.5","0.4","-0.4","0.0","-0.0","-0.1","0.0"], ["200","1381","20","13.8","1.9","0.5","-0.4","0.0","-0.0","-0.1","0.1"], - ["250","1321","27","13.6","1.5","0.5","-0.4","0.1","-0.1","-0.1","0.1"], - ["300","1256","36","13.3","1.3","0.6","-0.5","0.1","-0.1","-0.1","0.1"], + ["250","1321","27","13.6","1.5","0.5","-0.4","0.0","-0.0","-0.1","0.1"], + ["300","1256","36","13.3","1.3","0.6","-0.5","0.0","-0.1","-0.1","0.1"], ["350","1183","49","12.9","1.1","0.6","-0.5","0.1","-0.1","-0.1","0.1"], ["400","1097","70","12.4","0.9","0.6","-0.5","0.1","-0.1","-0.2","0.1"], ["450","979","113","11.6","0.8","0.6","-0.5","0.1","-0.1","-0.2","0.2"] @@ -35,9 +35,9 @@ case ((abs(_muzzleVelocity - 70) < 0.00001) && ((abs(_airFriction - -0.0001) < 0 }; case ((abs(_muzzleVelocity - 140) < 0.00001) && ((abs(_airFriction - -0.0001) < 0.00001))): { [ - ["250","1527","2","27.2","9.9","2.6","-2.4","0.1","-0.0","-0.3","0.3"], - ["300","1512","2","27.2","8.3","2.7","-2.4","0.1","-0.1","-0.4","0.4"], - ["350","1497","3","27.1","7.1","2.7","-2.5","0.1","-0.1","-0.5","0.4"], + ["250","1527","2","27.2","9.9","2.6","-2.4","0.0","-0.0","-0.3","0.3"], + ["300","1512","2","27.2","8.3","2.7","-2.4","0.1","-0.0","-0.4","0.4"], + ["350","1497","3","27.1","7.1","2.7","-2.5","0.0","-0.1","-0.5","0.4"], ["400","1482","3","27.1","6.2","2.7","-2.5","0.1","-0.1","-0.5","0.5"], ["450","1467","3","27.0","5.6","2.8","-2.5","0.1","-0.1","-0.6","0.6"], ["500","1451","4","27.0","5.0","2.9","-2.6","0.1","-0.1","-0.6","0.6"], @@ -45,25 +45,25 @@ case ((abs(_muzzleVelocity - 140) < 0.00001) && ((abs(_airFriction - -0.0001) < ["600","1420","5","26.8","4.2","3.0","-2.7","0.1","-0.1","-0.8","0.8"], ["650","1404","5","26.8","3.9","3.0","-2.7","0.1","-0.1","-0.9","0.8"], ["700","1388","6","26.7","3.6","3.1","-2.8","0.1","-0.1","-0.9","0.9"], - ["750","1372","6","26.6","3.4","3.2","-2.8","0.2","-0.1","-1.0","1.0"], - ["800","1355","7","26.5","3.2","3.2","-2.9","0.2","-0.1","-1.1","1.1"], - ["850","1338","8","26.4","3.0","3.3","-2.9","0.2","-0.2","-1.1","1.1"], - ["900","1321","8","26.2","2.8","3.4","-3.0","0.2","-0.2","-1.2","1.2"], - ["950","1303","9","26.1","2.7","3.4","-3.1","0.2","-0.2","-1.3","1.2"], - ["1000","1285","10","26.0","2.6","3.5","-3.1","0.2","-0.2","-1.4","1.3"], - ["1050","1266","11","25.8","2.4","3.5","-3.2","0.2","-0.2","-1.4","1.4"], - ["1100","1247","12","25.7","2.3","3.6","-3.3","0.2","-0.2","-1.5","1.4"], + ["750","1372","6","26.6","3.4","3.2","-2.8","0.1","-0.1","-1.0","1.0"], + ["800","1355","7","26.5","3.2","3.2","-2.9","0.1","-0.1","-1.1","1.1"], + ["850","1338","8","26.4","3.0","3.3","-2.9","0.1","-0.1","-1.1","1.1"], + ["900","1321","8","26.2","2.8","3.4","-3.0","0.1","-0.1","-1.2","1.2"], + ["950","1303","9","26.1","2.7","3.4","-3.1","0.1","-0.2","-1.3","1.2"], + ["1000","1285","10","26.0","2.6","3.5","-3.1","0.2","-0.1","-1.4","1.3"], + ["1050","1266","11","25.8","2.4","3.5","-3.2","0.1","-0.2","-1.4","1.4"], + ["1100","1247","12","25.7","2.3","3.6","-3.3","0.1","-0.2","-1.5","1.4"], ["1150","1228","13","25.5","2.2","3.7","-3.3","0.2","-0.2","-1.6","1.5"], - ["1200","1207","14","25.3","2.1","3.7","-3.4","0.2","-0.3","-1.7","1.6"], - ["1250","1186","15","25.1","2.0","3.8","-3.4","0.2","-0.3","-1.7","1.7"], - ["1300","1163","17","24.8","1.9","3.8","-3.5","0.3","-0.3","-1.8","1.7"], - ["1350","1140","19","24.6","1.9","3.9","-3.5","0.3","-0.3","-1.9","1.8"], - ["1400","1115","21","24.3","1.8","3.9","-3.6","0.3","-0.3","-1.9","1.9"], - ["1450","1088","24","23.9","1.7","4.0","-3.6","0.3","-0.3","-2.0","1.9"], - ["1500","1060","27","23.6","1.6","4.0","-3.7","0.3","-0.3","-2.1","2.0"], - ["1550","1028","32","23.1","1.5","4.0","-3.7","0.3","-0.3","-2.1","2.1"], - ["1600","991","38","22.6","1.5","4.0","-3.7","0.3","-0.3","-2.2","2.1"], - ["1650","947","49","21.9","1.4","4.0","-3.7","0.3","-0.3","-2.3","2.2"], + ["1200","1207","14","25.3","2.1","3.7","-3.4","0.2","-0.2","-1.7","1.6"], + ["1250","1186","15","25.1","2.0","3.8","-3.4","0.2","-0.2","-1.7","1.7"], + ["1300","1163","17","24.8","1.9","3.8","-3.5","0.2","-0.2","-1.8","1.7"], + ["1350","1140","19","24.6","1.9","3.9","-3.5","0.2","-0.2","-1.9","1.8"], + ["1400","1115","21","24.3","1.8","3.9","-3.6","0.2","-0.2","-1.9","1.9"], + ["1450","1088","24","23.9","1.7","4.0","-3.6","0.2","-0.2","-2.0","1.9"], + ["1500","1060","27","23.6","1.6","4.0","-3.7","0.2","-0.2","-2.1","2.0"], + ["1550","1028","32","23.1","1.5","4.0","-3.7","0.2","-0.2","-2.1","2.1"], + ["1600","991","38","22.6","1.5","4.0","-3.7","0.2","-0.2","-2.2","2.1"], + ["1650","947","49","21.9","1.4","4.0","-3.7","0.2","-0.3","-2.3","2.2"], ["1700","888","71","21.0","1.3","3.9","-3.6","0.3","-0.3","-2.3","2.2"] ] }; @@ -77,52 +77,186 @@ case ((abs(_muzzleVelocity - 200) < 0.00001) && ((abs(_airFriction - -0.0001) < ["700","1485","2","37.1","8.7","6.5","-6.2","0.1","-0.1","-1.6","1.5"], ["750","1477","2","37.1","8.2","6.6","-6.2","0.1","-0.1","-1.7","1.6"], ["800","1468","2","37.0","7.7","6.7","-6.3","0.1","-0.1","-1.8","1.8"], - ["850","1460","2","37.0","7.2","6.7","-6.3","0.2","-0.1","-2.0","1.9"], - ["900","1451","2","37.0","6.8","6.8","-6.4","0.1","-0.2","-2.1","2.0"], - ["950","1443","2","36.9","6.5","6.9","-6.4","0.2","-0.2","-2.2","2.1"], - ["1000","1434","2","36.9","6.2","6.9","-6.5","0.2","-0.2","-2.3","2.2"], - ["1050","1425","2","36.8","5.9","7.0","-6.6","0.2","-0.2","-2.5","2.3"], - ["1100","1417","3","36.8","5.6","7.1","-6.6","0.2","-0.2","-2.6","2.4"], + ["850","1460","2","37.0","7.2","6.7","-6.3","0.1","-0.1","-2.0","1.9"], + ["900","1451","2","37.0","6.8","6.8","-6.4","0.1","-0.1","-2.1","2.0"], + ["950","1443","2","36.9","6.5","6.9","-6.4","0.1","-0.1","-2.2","2.1"], + ["1000","1434","2","36.9","6.2","6.9","-6.5","0.1","-0.1","-2.3","2.2"], + ["1050","1425","2","36.8","5.9","7.0","-6.6","0.1","-0.2","-2.5","2.3"], + ["1100","1417","3","36.8","5.6","7.1","-6.6","0.1","-0.2","-2.6","2.4"], ["1150","1408","3","36.7","5.4","7.1","-6.7","0.2","-0.2","-2.7","2.5"], ["1200","1399","3","36.6","5.2","7.2","-6.7","0.2","-0.2","-2.8","2.7"], ["1250","1390","3","36.6","5.0","7.3","-6.8","0.2","-0.2","-2.9","2.8"], ["1300","1381","3","36.5","4.8","7.4","-6.9","0.2","-0.2","-3.0","2.9"], ["1350","1372","3","36.4","4.6","7.4","-6.9","0.2","-0.2","-3.2","3.0"], - ["1400","1362","4","36.4","4.4","7.5","-7.0","0.2","-0.3","-3.3","3.1"], - ["1450","1353","4","36.3","4.3","7.6","-7.1","0.2","-0.3","-3.4","3.2"], - ["1500","1344","4","36.2","4.2","7.7","-7.1","0.3","-0.3","-3.5","3.4"], - ["1550","1334","4","36.1","4.0","7.7","-7.2","0.3","-0.3","-3.7","3.5"], - ["1600","1324","4","36.0","3.9","7.8","-7.3","0.3","-0.3","-3.8","3.6"], - ["1650","1314","4","35.9","3.8","7.9","-7.3","0.3","-0.3","-3.9","3.7"], - ["1700","1304","5","35.8","3.7","7.9","-7.4","0.3","-0.3","-4.0","3.8"], - ["1750","1294","5","35.7","3.6","8.0","-7.5","0.3","-0.3","-4.2","3.9"], - ["1800","1284","5","35.6","3.5","8.1","-7.6","0.3","-0.3","-4.3","4.0"], - ["1850","1274","5","35.5","3.4","8.2","-7.6","0.3","-0.3","-4.4","4.2"], - ["1900","1263","6","35.4","3.3","8.2","-7.7","0.3","-0.3","-4.5","4.3"], - ["1950","1253","6","35.2","3.2","8.3","-7.8","0.3","-0.4","-4.7","4.4"], - ["2000","1242","6","35.1","3.1","8.4","-7.8","0.4","-0.3","-4.8","4.5"], - ["2050","1231","7","35.0","3.0","8.4","-7.9","0.4","-0.4","-4.9","4.7"], - ["2100","1219","7","34.8","2.9","8.5","-8.0","0.4","-0.4","-5.0","4.8"], - ["2150","1208","7","34.7","2.9","8.5","-8.0","0.4","-0.4","-5.2","4.9"], - ["2200","1196","8","34.5","2.8","8.6","-8.1","0.4","-0.4","-5.3","5.0"], - ["2250","1184","8","34.3","2.7","8.7","-8.2","0.4","-0.4","-5.4","5.1"], - ["2300","1171","9","34.2","2.7","8.7","-8.2","0.4","-0.4","-5.5","5.2"], - ["2350","1158","9","34.0","2.6","8.8","-8.3","0.4","-0.4","-5.7","5.4"], - ["2400","1145","10","33.8","2.5","8.8","-8.3","0.4","-0.4","-5.8","5.5"], - ["2450","1132","10","33.6","2.5","8.9","-8.4","0.4","-0.4","-5.9","5.6"], - ["2500","1118","11","33.3","2.4","8.9","-8.4","0.5","-0.4","-6.0","5.7"], - ["2550","1103","12","33.1","2.4","9.0","-8.5","0.4","-0.5","-6.1","5.8"], - ["2600","1088","13","32.8","2.3","9.0","-8.5","0.5","-0.4","-6.2","5.9"], - ["2650","1072","14","32.6","2.2","9.0","-8.6","0.5","-0.5","-6.4","6.0"], - ["2700","1056","15","32.3","2.2","9.0","-8.6","0.5","-0.5","-6.5","6.1"], - ["2750","1038","16","31.9","2.1","9.1","-8.6","0.5","-0.5","-6.6","6.3"], - ["2800","1020","18","31.6","2.1","9.1","-8.6","0.5","-0.5","-6.7","6.4"], - ["2850","1000","20","31.2","2.0","9.1","-8.6","0.5","-0.5","-6.8","6.5"], - ["2900","978","22","30.8","1.9","9.0","-8.6","0.5","-0.5","-6.9","6.5"], - ["2950","954","26","30.3","1.9","9.0","-8.6","0.5","-0.5","-7.0","6.6"], - ["3000","927","31","29.7","1.8","8.9","-8.5","0.5","-0.5","-7.1","6.7"], - ["3050","894","38","29.0","1.7","8.8","-8.4","0.5","-0.6","-7.2","6.8"], - ["3100","849","54","27.9","1.6","8.5","-8.3","0.5","-0.6","-7.2","6.8"] + ["1400","1362","4","36.4","4.4","7.5","-7.0","0.2","-0.2","-3.3","3.1"], + ["1450","1353","4","36.3","4.3","7.6","-7.1","0.2","-0.2","-3.4","3.2"], + ["1500","1344","4","36.2","4.2","7.7","-7.1","0.2","-0.2","-3.5","3.4"], + ["1550","1334","4","36.1","4.0","7.7","-7.2","0.2","-0.2","-3.7","3.5"], + ["1600","1324","4","36.0","3.9","7.8","-7.3","0.2","-0.2","-3.8","3.6"], + ["1650","1314","4","35.9","3.8","7.9","-7.3","0.2","-0.2","-3.9","3.7"], + ["1700","1304","5","35.8","3.7","7.9","-7.4","0.2","-0.2","-4.0","3.8"], + ["1750","1294","5","35.7","3.6","8.0","-7.5","0.2","-0.2","-4.2","3.9"], + ["1800","1284","5","35.6","3.5","8.1","-7.6","0.2","-0.3","-4.3","4.0"], + ["1850","1274","5","35.5","3.4","8.2","-7.6","0.2","-0.3","-4.4","4.2"], + ["1900","1263","6","35.4","3.3","8.2","-7.7","0.2","-0.3","-4.5","4.3"], + ["1950","1253","6","35.2","3.2","8.3","-7.8","0.2","-0.3","-4.7","4.4"], + ["2000","1242","6","35.1","3.1","8.4","-7.8","0.3","-0.3","-4.8","4.5"], + ["2050","1231","7","35.0","3.0","8.4","-7.9","0.3","-0.3","-4.9","4.7"], + ["2100","1219","7","34.8","2.9","8.5","-8.0","0.3","-0.3","-5.0","4.8"], + ["2150","1208","7","34.7","2.9","8.5","-8.0","0.3","-0.3","-5.2","4.9"], + ["2200","1196","8","34.5","2.8","8.6","-8.1","0.3","-0.3","-5.3","5.0"], + ["2250","1184","8","34.3","2.7","8.7","-8.2","0.3","-0.3","-5.4","5.1"], + ["2300","1171","9","34.2","2.7","8.7","-8.2","0.3","-0.3","-5.5","5.2"], + ["2350","1158","9","34.0","2.6","8.8","-8.3","0.3","-0.3","-5.7","5.4"], + ["2400","1145","10","33.8","2.5","8.8","-8.3","0.3","-0.3","-5.8","5.5"], + ["2450","1132","10","33.6","2.5","8.9","-8.4","0.3","-0.3","-5.9","5.6"], + ["2500","1118","11","33.3","2.4","8.9","-8.4","0.3","-0.3","-6.0","5.7"], + ["2550","1103","12","33.1","2.4","9.0","-8.5","0.3","-0.3","-6.1","5.8"], + ["2600","1088","13","32.8","2.3","9.0","-8.5","0.4","-0.3","-6.2","5.9"], + ["2650","1072","14","32.6","2.2","9.0","-8.6","0.4","-0.4","-6.4","6.0"], + ["2700","1056","15","32.3","2.2","9.0","-8.6","0.3","-0.4","-6.5","6.1"], + ["2750","1038","16","31.9","2.1","9.1","-8.6","0.4","-0.4","-6.6","6.3"], + ["2800","1020","18","31.6","2.1","9.1","-8.6","0.4","-0.4","-6.7","6.4"], + ["2850","1000","20","31.2","2.0","9.1","-8.6","0.4","-0.4","-6.8","6.5"], + ["2900","978","22","30.8","1.9","9.0","-8.6","0.4","-0.4","-6.9","6.5"], + ["2950","954","26","30.3","1.9","9.0","-8.6","0.4","-0.4","-7.0","6.6"], + ["3000","927","31","29.7","1.8","8.9","-8.5","0.4","-0.4","-7.1","6.7"], + ["3050","894","38","29.0","1.7","8.8","-8.4","0.4","-0.4","-7.2","6.8"], + ["3100","849","54","27.9","1.6","8.5","-8.3","0.4","-0.4","-7.2","6.8"] + ] + }; + +case ((abs(_muzzleVelocity - 70) < 0.00001) && ((abs(_airFriction - 0) < 0.00001))): { + [ + ["100","1497","9","14.2","0.0","0.0","0.0","0.0","0.0","0.0","0.0"], + ["150","1445","14","14.1","0.0","0.0","0.0","0.0","0.0","0.0","0.0"], + ["200","1390","19","14.0","0.0","0.0","0.0","0.0","0.0","0.0","0.0"], + ["250","1333","26","13.8","0.0","0.0","0.0","0.0","0.0","0.0","0.0"], + ["300","1272","34","13.5","0.0","0.0","0.0","0.0","0.0","0.0","0.0"], + ["350","1204","45","13.2","0.0","0.0","0.0","0.0","0.0","0.0","0.0"], + ["400","1127","61","12.8","0.0","0.0","0.0","0.0","0.0","0.0","0.0"], + ["450","1028","91","12.1","0.0","0.0","0.0","0.0","0.0","0.0","0.0"] + ] + }; +case ((abs(_muzzleVelocity - 140) < 0.00001) && ((abs(_airFriction - 0) < 0.00001))): { + [ + ["150","1562","1","28.5","0.0","0.0","0.0","0.0","0.0","0.0","0.0"], + ["200","1549","1","28.5","0.0","0.0","0.0","0.0","0.0","0.0","0.0"], + ["250","1536","2","28.5","0.0","0.0","0.0","0.0","0.0","0.0","0.0"], + ["300","1523","2","28.5","0.0","0.0","0.0","0.0","0.0","0.0","0.0"], + ["350","1510","2","28.4","0.0","0.0","0.0","0.0","0.0","0.0","0.0"], + ["400","1497","3","28.4","0.0","0.0","0.0","0.0","0.0","0.0","0.0"], + ["450","1484","3","28.4","0.0","0.0","0.0","0.0","0.0","0.0","0.0"], + ["500","1471","3","28.3","0.0","0.0","0.0","0.0","0.0","0.0","0.0"], + ["550","1458","4","28.3","0.0","0.0","0.0","0.0","0.0","0.0","0.0"], + ["600","1445","4","28.2","0.0","0.0","0.0","0.0","0.0","0.0","0.0"], + ["650","1431","4","28.2","0.0","0.0","0.0","0.0","0.0","0.0","0.0"], + ["700","1418","5","28.1","0.0","0.0","0.0","0.0","0.0","0.0","0.0"], + ["750","1404","5","28.0","0.0","0.0","0.0","0.0","0.0","0.0","0.0"], + ["800","1390","6","27.9","0.0","0.0","0.0","0.0","0.0","0.0","0.0"], + ["850","1376","6","27.9","0.0","0.0","0.0","0.0","0.0","0.0","0.0"], + ["900","1362","6","27.8","0.0","0.0","0.0","0.0","0.0","0.0","0.0"], + ["950","1348","7","27.7","0.0","0.0","0.0","0.0","0.0","0.0","0.0"], + ["1000","1333","7","27.6","0.0","0.0","0.0","0.0","0.0","0.0","0.0"], + ["1050","1318","8","27.5","0.0","0.0","0.0","0.0","0.0","0.0","0.0"], + ["1100","1303","9","27.3","0.0","0.0","0.0","0.0","0.0","0.0","0.0"], + ["1150","1288","9","27.2","0.0","0.0","0.0","0.0","0.0","0.0","0.0"], + ["1200","1272","10","27.1","0.0","0.0","0.0","0.0","0.0","0.0","0.0"], + ["1250","1256","11","26.9","0.0","0.0","0.0","0.0","0.0","0.0","0.0"], + ["1300","1239","12","26.8","0.0","0.0","0.0","0.0","0.0","0.0","0.0"], + ["1350","1222","13","26.6","0.0","0.0","0.0","0.0","0.0","0.0","0.0"], + ["1400","1205","13","26.4","0.0","0.0","0.0","0.0","0.0","0.0","0.0"], + ["1450","1187","15","26.2","0.0","0.0","0.0","0.0","0.0","0.0","0.0"], + ["1500","1168","16","26.0","0.0","0.0","0.0","0.0","0.0","0.0","0.0"], + ["1550","1148","18","25.8","0.0","0.0","0.0","0.0","0.0","0.0","0.0"], + ["1600","1127","19","25.5","0.0","0.0","0.0","0.0","0.0","0.0","0.0"], + ["1650","1105","21","25.2","0.0","0.0","0.0","0.0","0.0","0.0","0.0"], + ["1700","1082","24","24.9","0.0","0.0","0.0","0.0","0.0","0.0","0.0"], + ["1750","1057","27","24.6","0.0","0.0","0.0","0.0","0.0","0.0","0.0"], + ["1800","1029","31","24.2","0.0","0.0","0.0","0.0","0.0","0.0","0.0"], + ["1850","997","37","23.7","0.0","0.0","0.0","0.0","0.0","0.0","0.0"], + ["1900","960","46","23.1","0.0","0.0","0.0","0.0","0.0","0.0","0.0"], + ["1950","912","63","22.3","0.0","0.0","0.0","0.0","0.0","0.0","0.0"] + ] + }; +case ((abs(_muzzleVelocity - 200) < 0.00001) && ((abs(_airFriction - 0) < 0.00001))): { + [ + ["300","1563","0","40.8","0.0","0.0","0.0","0.0","0.0","0.0","0.0"], + ["350","1556","1","40.8","0.0","0.0","0.0","0.0","0.0","0.0","0.0"], + ["400","1550","1","40.7","0.0","0.0","0.0","0.0","0.0","0.0","0.0"], + ["450","1544","1","40.7","0.0","0.0","0.0","0.0","0.0","0.0","0.0"], + ["500","1537","1","40.7","0.0","0.0","0.0","0.0","0.0","0.0","0.0"], + ["550","1531","1","40.7","0.0","0.0","0.0","0.0","0.0","0.0","0.0"], + ["600","1525","1","40.7","0.0","0.0","0.0","0.0","0.0","0.0","0.0"], + ["650","1519","1","40.7","0.0","0.0","0.0","0.0","0.0","0.0","0.0"], + ["700","1512","1","40.6","0.0","0.0","0.0","0.0","0.0","0.0","0.0"], + ["750","1506","1","40.6","0.0","0.0","0.0","0.0","0.0","0.0","0.0"], + ["800","1499","1","40.6","0.0","0.0","0.0","0.0","0.0","0.0","0.0"], + ["850","1493","1","40.6","0.0","0.0","0.0","0.0","0.0","0.0","0.0"], + ["900","1487","1","40.5","0.0","0.0","0.0","0.0","0.0","0.0","0.0"], + ["950","1480","1","40.5","0.0","0.0","0.0","0.0","0.0","0.0","0.0"], + ["1000","1474","2","40.5","0.0","0.0","0.0","0.0","0.0","0.0","0.0"], + ["1050","1467","2","40.5","0.0","0.0","0.0","0.0","0.0","0.0","0.0"], + ["1100","1461","2","40.4","0.0","0.0","0.0","0.0","0.0","0.0","0.0"], + ["1150","1454","2","40.4","0.0","0.0","0.0","0.0","0.0","0.0","0.0"], + ["1200","1448","2","40.3","0.0","0.0","0.0","0.0","0.0","0.0","0.0"], + ["1250","1441","2","40.3","0.0","0.0","0.0","0.0","0.0","0.0","0.0"], + ["1300","1435","2","40.3","0.0","0.0","0.0","0.0","0.0","0.0","0.0"], + ["1350","1428","2","40.2","0.0","0.0","0.0","0.0","0.0","0.0","0.0"], + ["1400","1422","2","40.2","0.0","0.0","0.0","0.0","0.0","0.0","0.0"], + ["1450","1415","2","40.1","0.0","0.0","0.0","0.0","0.0","0.0","0.0"], + ["1500","1408","2","40.1","0.0","0.0","0.0","0.0","0.0","0.0","0.0"], + ["1550","1402","3","40.0","0.0","0.0","0.0","0.0","0.0","0.0","0.0"], + ["1600","1395","3","40.0","0.0","0.0","0.0","0.0","0.0","0.0","0.0"], + ["1650","1388","3","39.9","0.0","0.0","0.0","0.0","0.0","0.0","0.0"], + ["1700","1381","3","39.9","0.0","0.0","0.0","0.0","0.0","0.0","0.0"], + ["1750","1374","3","39.8","0.0","0.0","0.0","0.0","0.0","0.0","0.0"], + ["1800","1367","3","39.7","0.0","0.0","0.0","0.0","0.0","0.0","0.0"], + ["1850","1360","3","39.7","0.0","0.0","0.0","0.0","0.0","0.0","0.0"], + ["1900","1353","3","39.6","0.0","0.0","0.0","0.0","0.0","0.0","0.0"], + ["1950","1346","4","39.5","0.0","0.0","0.0","0.0","0.0","0.0","0.0"], + ["2000","1339","4","39.5","0.0","0.0","0.0","0.0","0.0","0.0","0.0"], + ["2050","1332","4","39.4","0.0","0.0","0.0","0.0","0.0","0.0","0.0"], + ["2100","1325","4","39.3","0.0","0.0","0.0","0.0","0.0","0.0","0.0"], + ["2150","1317","4","39.2","0.0","0.0","0.0","0.0","0.0","0.0","0.0"], + ["2200","1310","4","39.2","0.0","0.0","0.0","0.0","0.0","0.0","0.0"], + ["2250","1302","4","39.1","0.0","0.0","0.0","0.0","0.0","0.0","0.0"], + ["2300","1295","5","39.0","0.0","0.0","0.0","0.0","0.0","0.0","0.0"], + ["2350","1287","5","38.9","0.0","0.0","0.0","0.0","0.0","0.0","0.0"], + ["2400","1280","5","38.8","0.0","0.0","0.0","0.0","0.0","0.0","0.0"], + ["2450","1272","5","38.7","0.0","0.0","0.0","0.0","0.0","0.0","0.0"], + ["2500","1264","5","38.6","0.0","0.0","0.0","0.0","0.0","0.0","0.0"], + ["2550","1256","5","38.5","0.0","0.0","0.0","0.0","0.0","0.0","0.0"], + ["2600","1248","6","38.4","0.0","0.0","0.0","0.0","0.0","0.0","0.0"], + ["2650","1240","6","38.3","0.0","0.0","0.0","0.0","0.0","0.0","0.0"], + ["2700","1232","6","38.2","0.0","0.0","0.0","0.0","0.0","0.0","0.0"], + ["2750","1223","6","38.0","0.0","0.0","0.0","0.0","0.0","0.0","0.0"], + ["2800","1215","7","37.9","0.0","0.0","0.0","0.0","0.0","0.0","0.0"], + ["2850","1206","7","37.8","0.0","0.0","0.0","0.0","0.0","0.0","0.0"], + ["2900","1197","7","37.6","0.0","0.0","0.0","0.0","0.0","0.0","0.0"], + ["2950","1188","7","37.5","0.0","0.0","0.0","0.0","0.0","0.0","0.0"], + ["3000","1179","8","37.4","0.0","0.0","0.0","0.0","0.0","0.0","0.0"], + ["3050","1170","8","37.2","0.0","0.0","0.0","0.0","0.0","0.0","0.0"], + ["3100","1160","8","37.1","0.0","0.0","0.0","0.0","0.0","0.0","0.0"], + ["3150","1151","9","36.9","0.0","0.0","0.0","0.0","0.0","0.0","0.0"], + ["3200","1141","9","36.7","0.0","0.0","0.0","0.0","0.0","0.0","0.0"], + ["3250","1131","10","36.5","0.0","0.0","0.0","0.0","0.0","0.0","0.0"], + ["3300","1120","10","36.3","0.0","0.0","0.0","0.0","0.0","0.0","0.0"], + ["3350","1109","11","36.2","0.0","0.0","0.0","0.0","0.0","0.0","0.0"], + ["3400","1098","11","35.9","0.0","0.0","0.0","0.0","0.0","0.0","0.0"], + ["3450","1087","12","35.7","0.0","0.0","0.0","0.0","0.0","0.0","0.0"], + ["3500","1075","13","35.5","0.0","0.0","0.0","0.0","0.0","0.0","0.0"], + ["3550","1062","14","35.2","0.0","0.0","0.0","0.0","0.0","0.0","0.0"], + ["3600","1049","15","35.0","0.0","0.0","0.0","0.0","0.0","0.0","0.0"], + ["3650","1036","16","34.7","0.0","0.0","0.0","0.0","0.0","0.0","0.0"], + ["3700","1021","17","34.4","0.0","0.0","0.0","0.0","0.0","0.0","0.0"], + ["3750","1006","19","34.1","0.0","0.0","0.0","0.0","0.0","0.0","0.0"], + ["3800","990","21","33.7","0.0","0.0","0.0","0.0","0.0","0.0","0.0"], + ["3850","971","24","33.3","0.0","0.0","0.0","0.0","0.0","0.0","0.0"], + ["3900","952","27","32.8","0.0","0.0","0.0","0.0","0.0","0.0","0.0"], + ["3950","929","32","32.2","0.0","0.0","0.0","0.0","0.0","0.0","0.0"], + ["4000","900","40","31.5","0.0","0.0","0.0","0.0","0.0","0.0","0.0"], + ["4050","861","56","30.5","0.0","0.0","0.0","0.0","0.0","0.0","0.0"] ] }; default { From 65d61ad1e3bc3d40780670849f26247931244e2e Mon Sep 17 00:00:00 2001 From: PabstMirror Date: Tue, 7 Apr 2015 19:22:33 -0500 Subject: [PATCH 17/22] opps --- addons/inventory/config.cpp | 2 +- addons/mk6mortar/CfgMagazines.hpp | 3 --- addons/mk6mortar/config.cpp | 1 - addons/mk6mortar/functions/fnc_handleFired.sqf | 2 -- 4 files changed, 1 insertion(+), 7 deletions(-) delete mode 100644 addons/mk6mortar/CfgMagazines.hpp diff --git a/addons/inventory/config.cpp b/addons/inventory/config.cpp index 83b4a08126..c7b6649be6 100644 --- a/addons/inventory/config.cpp +++ b/addons/inventory/config.cpp @@ -15,7 +15,7 @@ class CfgPatches { #include "RscDisplayInventory.hpp" class ACE_Settings { - class GVAR(useMils) { + class GVAR(inventoryDisplaySize) { value = 0; typeName = "SCALAR"; isClientSetable = 1; diff --git a/addons/mk6mortar/CfgMagazines.hpp b/addons/mk6mortar/CfgMagazines.hpp deleted file mode 100644 index 39f8bdd780..0000000000 --- a/addons/mk6mortar/CfgMagazines.hpp +++ /dev/null @@ -1,3 +0,0 @@ -class CfgMagazines { - -}; diff --git a/addons/mk6mortar/config.cpp b/addons/mk6mortar/config.cpp index a6e63c819b..6751cea5fb 100644 --- a/addons/mk6mortar/config.cpp +++ b/addons/mk6mortar/config.cpp @@ -13,7 +13,6 @@ class CfgPatches { }; #include "CfgEventHandlers.hpp" -#include "CfgMagazines.hpp" #include "CfgVehicles.hpp" #include "CfgWeapons.hpp" diff --git a/addons/mk6mortar/functions/fnc_handleFired.sqf b/addons/mk6mortar/functions/fnc_handleFired.sqf index 555abcbe6f..491794ccc7 100644 --- a/addons/mk6mortar/functions/fnc_handleFired.sqf +++ b/addons/mk6mortar/functions/fnc_handleFired.sqf @@ -57,8 +57,6 @@ if (_newMuzzleVelocityCoefficent != 1) then { _muzzleVelocity = _muzzleVelocity + _muzzleVelocityShift; }; -systemChat format ["PFEH for %1", _ammo]; - [{ private ["_deltaT", "_bulletVelocity", "_bulletSpeed", "_trueVelocity", "_trueSpeed", "_dragRef", "_accelRef", "_drag", "_accel"]; PARAMS_2(_args,_pfID); From 71d609f8e052e5f0295317ab926df2c21ff7885f Mon Sep 17 00:00:00 2001 From: PabstMirror Date: Tue, 7 Apr 2015 19:30:07 -0500 Subject: [PATCH 18/22] Private Variables --- addons/mk6mortar/functions/fnc_dev_formatNumber.sqf | 3 +-- addons/mk6mortar/functions/fnc_dev_simulateFindSolution.sqf | 1 - addons/mk6mortar/functions/fnc_dev_simulateShot.sqf | 2 +- addons/mk6mortar/functions/fnc_handleFired.sqf | 4 +++- addons/mk6mortar/functions/fnc_handlePlayerVehicleChanged.sqf | 2 ++ addons/mk6mortar/functions/fnc_rangeTableOpen.sqf | 2 ++ addons/mk6mortar/functions/fnc_rangeTablePageChange.sqf | 2 ++ addons/mk6mortar/functions/fnc_turretDisplayLoaded.sqf | 2 ++ 8 files changed, 13 insertions(+), 5 deletions(-) diff --git a/addons/mk6mortar/functions/fnc_dev_formatNumber.sqf b/addons/mk6mortar/functions/fnc_dev_formatNumber.sqf index a8ad155eec..84697bbf4a 100644 --- a/addons/mk6mortar/functions/fnc_dev_formatNumber.sqf +++ b/addons/mk6mortar/functions/fnc_dev_formatNumber.sqf @@ -73,8 +73,7 @@ case ("sec"): { default {systemChat format ["badtype %1", _inputType];}; }; - -//CBA_fnc_formatNumber is stupid: [-9.58545, 1, 1, false] call CBA_fnc_formatNumber == "-9.-6" +//CBA_fnc_formatNumber is silly: [-9.58545, 1, 1, false] call CBA_fnc_formatNumber == "-9.-6" _prefix = if (_theNumber < 0) then {"-"} else {""}; diff --git a/addons/mk6mortar/functions/fnc_dev_simulateFindSolution.sqf b/addons/mk6mortar/functions/fnc_dev_simulateFindSolution.sqf index 29a44e3a51..edffa1beb2 100644 --- a/addons/mk6mortar/functions/fnc_dev_simulateFindSolution.sqf +++ b/addons/mk6mortar/functions/fnc_dev_simulateFindSolution.sqf @@ -19,7 +19,6 @@ */ #include "script_component.hpp" - private ["_rangeToHit", "_heightToHit", "_muzzleVelocity", "_airFriction", "_maxElev", "_minElev", "_error", "_solutionElevation", "_lastTestResult", "_numberOfAttempts"]; #define MAX_ATTEMPTS 22 diff --git a/addons/mk6mortar/functions/fnc_dev_simulateShot.sqf b/addons/mk6mortar/functions/fnc_dev_simulateShot.sqf index de8471726c..0e53807a6b 100644 --- a/addons/mk6mortar/functions/fnc_dev_simulateShot.sqf +++ b/addons/mk6mortar/functions/fnc_dev_simulateShot.sqf @@ -23,7 +23,7 @@ */ #include "script_component.hpp" -private ["_angleDeg", "_muzzleVelocity", "_airFriction", "_temp", "_relDensity", "_tailWind", "_crosswind", "_heightOfTarget", "_wind", "_gravity", "_timeStep", "_currentPos", "_currentVelocity", "_currentTime", "_lastPos", "_kCoefficent", "_aparentWind", "_changeInVelocity", "_linConversion", "_middlePos", "_middlePosOld", "_middleTotalTravelTime", "_offsetDeg"]; +private ["_angleDeg", "_muzzleVelocity", "_airFriction", "_temp", "_relDensity", "_tailWind", "_crosswind", "_heightOfTarget", "_timeStep", "_wind", "_gravity", "_currentPos", "_currentVelocity", "_currentTime", "_lastPos", "_kCoefficent", "_aparentWind", "_changeInVelocity", "_linConversion", "_middlePos", "_middlePosOld", "_middleTotalTravelTime", "_offsetDeg"]; _angleDeg = _this select 0; _muzzleVelocity = _this select 1; diff --git a/addons/mk6mortar/functions/fnc_handleFired.sqf b/addons/mk6mortar/functions/fnc_handleFired.sqf index 491794ccc7..72c8aa4bff 100644 --- a/addons/mk6mortar/functions/fnc_handleFired.sqf +++ b/addons/mk6mortar/functions/fnc_handleFired.sqf @@ -21,13 +21,15 @@ */ #include "script_component.hpp" +private ["_unit", "_shooterMan", "_bisAirFriction", "_temperature", "_newMuzzleVelocityCoefficent", "_bulletVelocity", "_bulletSpeed", "_muzzleVelocity", "_muzzleVelocityShift"]; + disableSerialization; PARAMS_7(_vehicle,_weapon,_muzzle,_mode,_ammo,_magazine,_projectile); if (!GVAR(airResistanceEnabled)) exitWith {}; // Large enough distance to not simulate any wind deflection -if (_unit distance ACE_player > 8000) exitWith {false}; +if (_vehicle distance ACE_player > 8000) exitWith {false}; //AI will have no clue how to use: _shooterMan = gunner _vehicle; diff --git a/addons/mk6mortar/functions/fnc_handlePlayerVehicleChanged.sqf b/addons/mk6mortar/functions/fnc_handlePlayerVehicleChanged.sqf index 8fa11b1cda..91657fdbe2 100644 --- a/addons/mk6mortar/functions/fnc_handlePlayerVehicleChanged.sqf +++ b/addons/mk6mortar/functions/fnc_handlePlayerVehicleChanged.sqf @@ -16,6 +16,8 @@ */ #include "script_component.hpp" +private ["_chargeText", "_xPos", "_yPos", "_wPos", "_hPos", "_tubeWeaponName", "_fireModes"]; + PARAMS_2(_player,_newVehicle); if (isNull _newVehicle) exitWith {}; diff --git a/addons/mk6mortar/functions/fnc_rangeTableOpen.sqf b/addons/mk6mortar/functions/fnc_rangeTableOpen.sqf index 67d33c2727..c78b00e72d 100644 --- a/addons/mk6mortar/functions/fnc_rangeTableOpen.sqf +++ b/addons/mk6mortar/functions/fnc_rangeTableOpen.sqf @@ -17,6 +17,8 @@ #define LIST_CHARGE ((uiNamespace getVariable "ACE_82mm_RangeTable_Dialog") displayCtrl 1501) +private ["_weaponName", "_magazines", "_initSpeed", "_fireModes", "_muzzleVelocities", "_showToPlayer", "_artilleryCharge"]; + _weaponName = "mortar_82mm"; if (dialog) exitWith {ERROR("Dialog Open");}; diff --git a/addons/mk6mortar/functions/fnc_rangeTablePageChange.sqf b/addons/mk6mortar/functions/fnc_rangeTablePageChange.sqf index c9ee241b7a..c0cc40ccdc 100644 --- a/addons/mk6mortar/functions/fnc_rangeTablePageChange.sqf +++ b/addons/mk6mortar/functions/fnc_rangeTablePageChange.sqf @@ -18,6 +18,8 @@ #define RANGE_TABLE ((uiNamespace getVariable "ACE_82mm_RangeTable_Dialog") displayCtrl 20001) #define LIST_CHARGE ((uiNamespace getVariable "ACE_82mm_RangeTable_Dialog") displayCtrl 1501) +private ["_listBoxData", "_muzzleVelocity", "_airFriction", "_precalcArray"]; + _listBoxData = LIST_CHARGE lbData (lbCurSel LIST_CHARGE); if (isNil "_listBoxData" || {_listBoxData == ""}) exitWith {ERROR("lbCurSel out of bounds or no data");}; _muzzleVelocity = parseNumber _listBoxData; diff --git a/addons/mk6mortar/functions/fnc_turretDisplayLoaded.sqf b/addons/mk6mortar/functions/fnc_turretDisplayLoaded.sqf index 4972265528..c81ff32132 100644 --- a/addons/mk6mortar/functions/fnc_turretDisplayLoaded.sqf +++ b/addons/mk6mortar/functions/fnc_turretDisplayLoaded.sqf @@ -29,6 +29,7 @@ #define CTRL_CA_ELEV (configFile >> "RscInGameUI" >> "ACE_Mk6_RscWeaponRangeArtillery" >> "CA_IGUI_elements_group" >> "controls" >> "CA_ELEV") #define CTRL_CA_ELEV_NEED (configFile >> "RscInGameUI" >> "ACE_Mk6_RscWeaponRangeArtillery" >> "CA_IGUI_elements_group" >> "controls" >> "CA_ELEV_NEED") +private ["_display", "_fnc_hideControl"]; disableSerialization; @@ -36,6 +37,7 @@ _display = uiNamespace getVariable ["ACE_Mk6_RscWeaponRangeArtillery", displayNu if (isNull _display) exitWith {}; _fnc_hideControl = { + private "_idc"; PARAMS_2(_path,_hideCtrl); _idc = getNumber (_path >> "IDC"); _pos = []; From 656fa8868ad8242f7407d98223cd95a18017b879 Mon Sep 17 00:00:00 2001 From: PabstMirror Date: Tue, 7 Apr 2015 19:37:46 -0500 Subject: [PATCH 19/22] Module Icons --- addons/mk6mortar/CfgVehicles.hpp | 4 ++-- addons/mk6mortar/UI/Icon_Module_mk6_ca.paa | Bin 0 -> 5625 bytes extras/assets/icons/png/Icon_Module_mk6_ca.png | Bin 0 -> 21458 bytes 3 files changed, 2 insertions(+), 2 deletions(-) create mode 100644 addons/mk6mortar/UI/Icon_Module_mk6_ca.paa create mode 100644 extras/assets/icons/png/Icon_Module_mk6_ca.png diff --git a/addons/mk6mortar/CfgVehicles.hpp b/addons/mk6mortar/CfgVehicles.hpp index a40cc68efb..1c90842d5f 100644 --- a/addons/mk6mortar/CfgVehicles.hpp +++ b/addons/mk6mortar/CfgVehicles.hpp @@ -54,7 +54,7 @@ class CfgVehicles { function = QFUNC(moduleInit); scope = 2; isGlobal = 0; - // icon = QUOTE(PATHTOF(UI\Icon_.paa)); + icon = QUOTE(PATHTOF(UI\Icon_Module_mk6_ca.paa)); functionPriority = 0; class Arguments { class airResistanceEnabled { @@ -65,7 +65,7 @@ class CfgVehicles { }; class allowComputerRangefinder { displayName = "Allow MK6 Computer"; - description = "Show the Computer and Rangefinder (these should be removed if you enable air resistance)"; + description = "Show the Computer and Rangefinder (these NEED to be removed if you enable air resistance)"; typeName = "BOOL"; defaultValue = 0; }; diff --git a/addons/mk6mortar/UI/Icon_Module_mk6_ca.paa b/addons/mk6mortar/UI/Icon_Module_mk6_ca.paa new file mode 100644 index 0000000000000000000000000000000000000000..8abfb4bdd31d81bc3505d2d3c49bacdb83bc9645 GIT binary patch literal 5625 zcmd^@eMl5(7{DK8Yc=~2>&mcf#U&~-E{gr5FUJCPBk|%cvm!`M%F8W+2=2;uE~zl6 zmaQnsGAQVu>n@LDpf7eIsQ##+f-=`g2=oq)5`{jXWqRHjpLgGR7k5~054vrbf&K0K zywB%5&&)ex^ookIA68Y=lsNz(8jY?qxVEf{v5p7hin2B3j5F|J{C#u*lr@tf`h#CoAb0+#&$@9U58qenb{fQ!qH6Rm%<{#JchGK>C% z%n~T(2N!>3Y`wElb_n_cxc*1YuPH6cvwudHx33plFEM{c>OZP|dwsG$nE!%C9+U3Gpf z@yqqd|FE-f^RuSQ6#rP(|GhyMu`Hi%?EGu*uKxQcK2f|24p&9*gg!kbPPcd`ne}y0 zeB-XKUa{oVhFaq0kDV<&r5$M-|J+wv<0Vgh1I3$lplfa9PhW(%XyB)Z_kLFQ6Q^7K z3r~8sIcu7qP<)G*YQBi(D<&=)e)IS3@^Rl1JC|z{BHGJ^#0!k|6Wfpc-||!ZVD_!> z)Mj4ql>>WsE%I#T+}@%8o{K4=cy|uzp%Sf*Gu+Mi4sZuT02hyBf-~w=f z8o~to2k%gt4TkyxVtE@5DjOM|MdJnwuhF175AU__giK43f_@+EgCT z-^lb>zHRg+D?fX{Q~&ne_8hW5=lP+Q?yi;>#L4PQR(|r2{r`l2E7?f)ruVj2^&CCM z;~k%5+s4l<_MZXJNwSxxx8~#v_s@)nUh`%}0TxU4`mPB^4;^7U{kixl5I-_1VO_7Q z9;zcVYUsVc^Zo8pVwdXwqeweBpBUw5MXK|-TT1ws4Di z7W*tZFu%5_=FyIuH0_!)?`-R`CT_N{U2EK=J@(MJ2Hq#`s)Iga2X<7<=M8{$!H=)` Iv)}agGf;wi%>V!Z literal 0 HcmV?d00001 diff --git a/extras/assets/icons/png/Icon_Module_mk6_ca.png b/extras/assets/icons/png/Icon_Module_mk6_ca.png new file mode 100644 index 0000000000000000000000000000000000000000..26c2966551eb3d9df8ddf5c5a5a410543a641584 GIT binary patch literal 21458 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 z76 Date: Tue, 7 Apr 2015 19:41:48 -0500 Subject: [PATCH 20/22] Remove Dialog Check so it works inside veh --- addons/mk6mortar/functions/fnc_rangeTableOpen.sqf | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/addons/mk6mortar/functions/fnc_rangeTableOpen.sqf b/addons/mk6mortar/functions/fnc_rangeTableOpen.sqf index c78b00e72d..dfb53842ab 100644 --- a/addons/mk6mortar/functions/fnc_rangeTableOpen.sqf +++ b/addons/mk6mortar/functions/fnc_rangeTableOpen.sqf @@ -19,9 +19,8 @@ private ["_weaponName", "_magazines", "_initSpeed", "_fireModes", "_muzzleVelocities", "_showToPlayer", "_artilleryCharge"]; -_weaponName = "mortar_82mm"; +_weaponName = "mortar_82mm"; //todo: work on other weapons -if (dialog) exitWith {ERROR("Dialog Open");}; createDialog "ACE_82mm_RangeTable_Dialog"; if (isNull (uiNamespace getVariable ["ACE_82mm_RangeTable_Dialog", displayNull])) exitWith {ERROR("Dialog failed to open");}; From 3b9b09a7afeeddefbc63420543e78881932c25ea Mon Sep 17 00:00:00 2001 From: PabstMirror Date: Fri, 24 Apr 2015 13:26:09 -0500 Subject: [PATCH 21/22] UpdateFiringTable-ChangesFromWeather --- addons/mk6mortar/RscRangeTable.hpp | 3 +- addons/mk6mortar/UI/RangeTable_background.paa | Bin 289652 -> 342488 bytes .../functions/fnc_dev_buildTable.sqf | 11 +- .../functions/fnc_dev_formatNumber.sqf | 4 +- .../fnc_dev_simulateCalcRangeTableLine.sqf | 10 +- .../fnc_dev_simulateFindSolution.sqf | 2 +- .../mk6mortar/functions/fnc_handleFired.sqf | 27 +- .../fnc_rangeTablePreCalculatedValues.sqf | 445 +++++++++--------- 8 files changed, 254 insertions(+), 248 deletions(-) diff --git a/addons/mk6mortar/RscRangeTable.hpp b/addons/mk6mortar/RscRangeTable.hpp index cb89b093e3..6bf0e51619 100644 --- a/addons/mk6mortar/RscRangeTable.hpp +++ b/addons/mk6mortar/RscRangeTable.hpp @@ -33,7 +33,8 @@ class ACE_82mm_RangeTable_Dialog { y = "3.76 * ((safeZoneH / 1.2) / 25) + (safezoneY + (safezoneH - (safeZoneH / 1.2))/2)"; w = "16.2634559672906 * (safeZoneH / 40)"; h = "20.24 * ((safeZoneH / 1.2) / 25)"; - columns[] = {(10/792),(86/792),(172/792),(238/792),(329/792),(405/792),(462/792),(527/792),(588/792),(649/792),(710/792)}; + columns[] = {(10/867),(86/867),(171/867),(238/867),(320/867),(405/867), + (485/867),(546/867),(607/867),(668/867),(729/867),(790/867)}; rowHeight = 0.015 * safeZoneH; sizeEx = "0.014 * safeZoneH"; font = "EtelkaMonospacePro"; diff --git a/addons/mk6mortar/UI/RangeTable_background.paa b/addons/mk6mortar/UI/RangeTable_background.paa index a2a752ce6e563dad099d03be63140050cb06bb8d..bf4b5ee04405312e94420ebebc7a0ba5fee08640 100644 GIT binary patch literal 342488 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 z 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 diff --git a/addons/mk6mortar/functions/fnc_dev_buildTable.sqf b/addons/mk6mortar/functions/fnc_dev_buildTable.sqf index a795b96776..7a60e91e68 100644 --- a/addons/mk6mortar/functions/fnc_dev_buildTable.sqf +++ b/addons/mk6mortar/functions/fnc_dev_buildTable.sqf @@ -28,7 +28,7 @@ _increasePerRow = 50; _outputArray = []; -//[_rangeToHit, _lineElevation, _lineHeightElevation, _lineTimeOfFlight, _lineCrosswindDeg, _lineHeadwindMeters, _lineTailWindMeters, _lineTempDec, _lineTempInc, _lineAirDensDec, _lineAirDensInc] +//[_rangeToHit, _lineElevation, _lineHeightElevation, _lineHeightTimeDelta, _lineTimeOfFlight, _lineCrosswindDeg, _lineHeadwindMeters, _lineTailWindMeters, _lineTempDec, _lineTempInc, _lineAirDensDec, _lineAirDensInc] while {_stillInRange} do { _result = [_muzzleVelocity, _currentRange, _airFriction] call FUNC(dev_simulateCalcRangeTableLine); @@ -50,13 +50,14 @@ while {_stillInRange} do { ([(_result select 1), "mil", true] call FUNC(dev_formatNumber)), ([(_result select 2), "mil", true] call FUNC(dev_formatNumber)), ([(_result select 3), "sec", false] call FUNC(dev_formatNumber)), - ([(_result select 4), "milPrecise", true] call FUNC(dev_formatNumber)), - ([(_result select 5), "metersprecise", false] call FUNC(dev_formatNumber)), + ([(_result select 4), "sec", false] call FUNC(dev_formatNumber)), + ([(_result select 5), "milPrecise", true] call FUNC(dev_formatNumber)), ([(_result select 6), "metersprecise", false] call FUNC(dev_formatNumber)), ([(_result select 7), "metersprecise", false] call FUNC(dev_formatNumber)), ([(_result select 8), "metersprecise", false] call FUNC(dev_formatNumber)), ([(_result select 9), "metersprecise", false] call FUNC(dev_formatNumber)), - ([(_result select 10), "metersprecise", false] call FUNC(dev_formatNumber)) + ([(_result select 10), "metersprecise", false] call FUNC(dev_formatNumber)), + ([(_result select 11), "metersprecise", false] call FUNC(dev_formatNumber)) ]; }; _currentRange = _currentRange + _increasePerRow; @@ -65,7 +66,7 @@ while {_stillInRange} do { }; //handle floating point rounding errors -_outputString = format ["case ((abs(_muzzleVelocity - %1) < 0.00001) && ((abs(_airFriction - %2) < 0.00001))): { +_outputString = format ["case ((abs(_muzzleVelocity - %1) < 0.00001) && {(abs(_airFriction - %2) < 0.00001)}): { [ ", _muzzleVelocity, _airFriction]; diff --git a/addons/mk6mortar/functions/fnc_dev_formatNumber.sqf b/addons/mk6mortar/functions/fnc_dev_formatNumber.sqf index 84697bbf4a..f89c3a1b8f 100644 --- a/addons/mk6mortar/functions/fnc_dev_formatNumber.sqf +++ b/addons/mk6mortar/functions/fnc_dev_formatNumber.sqf @@ -1,6 +1,4 @@ /* -Name: AGM_Artillery_fnc_formatNumber - Author: Pabst Mirror Description: @@ -15,7 +13,7 @@ Returns: STRING - Formatted number Example: -[45, "mil4", true] call AGM_Artillery_fnc_formatNumber = "0800" +[45, "mil4", true] call ace_mk6mortar_fnc_dev_formatNumber = "0800" */ #include "script_component.hpp" diff --git a/addons/mk6mortar/functions/fnc_dev_simulateCalcRangeTableLine.sqf b/addons/mk6mortar/functions/fnc_dev_simulateCalcRangeTableLine.sqf index b30c542930..d1e0a8dd05 100644 --- a/addons/mk6mortar/functions/fnc_dev_simulateCalcRangeTableLine.sqf +++ b/addons/mk6mortar/functions/fnc_dev_simulateCalcRangeTableLine.sqf @@ -1,6 +1,4 @@ /* -Name: AGM_Artillery_fnc_simulateCalcRangeTableLine - Author: Pabst Mirror Description: @@ -15,13 +13,13 @@ Returns: ARRAY - Range Table Line Data (see return line) Example: -[300, -0.0001, 3000] call AGM_Artillery_fnc_simulateCalcRangeTableLine +[300, -0.0001, 3000] call ace_mk6mortar_fnc_simulateCalcRangeTableLine */ #include "script_component.hpp" #define TIME_STEP (1/50) -private ["_startTime", "_muzzleVelocity", "_rangeToHit", "_airFriction", "_vacElevation", "_radicand", "_maxElev", "_minElev", "_error", "_solutionElevation", "_lastTestResult", "_numberOfAttempts", "_lineElevation", "_lineTimeOfFlight", "_lineHeightElevation", "_lineHeightTime", "_lineCrosswindDeg", "_lineHeadwindMeters", "_lineTailWindMeters", "_result"]; +private ["_startTime", "_muzzleVelocity", "_rangeToHit", "_airFriction", "_vacElevation", "_radicand", "_maxElev", "_minElev", "_error", "_solutionElevation", "_lastTestResult", "_numberOfAttempts", "_lineElevation", "_lineTimeOfFlight", "_lineHeightElevation", "_lineHeightTimeDelta", "_lineCrosswindDeg", "_lineHeadwindMeters", "_lineTailWindMeters", "_result"]; _startTime = diag_tickTime; @@ -44,7 +42,7 @@ _solution = [_rangeToHit, -100, _muzzleVelocity, _airFriction, TIME_STEP] call F if (_solution isEqualTo []) exitWith {[]};//should never be triggered (lower elevation easier to hit) _lineHeightElevation = ((_solution select 0) - _lineElevation); -// _lineHeightTime = (_lastTestResult select 1) - _lineTimeOfFlight; +_lineHeightTimeDelta = (_solution select 1) - _lineTimeOfFlight; //Compute for 10x and divide to minimize rounding errors @@ -78,4 +76,4 @@ _lineAirDensInc = (_rangeToHit - (_lastTestResult select 0)) / 10; // systemChat format ["debug: Range %1 - in %2 sec", _rangeToHit, (diag_tickTime - _startTime)]; -[_rangeToHit, _lineElevation, _lineHeightElevation, _lineTimeOfFlight, _lineCrosswindDeg, _lineHeadwindMeters, _lineTailWindMeters, _lineTempDec, _lineTempInc, _lineAirDensDec, _lineAirDensInc] +[_rangeToHit, _lineElevation, _lineHeightElevation, _lineHeightTimeDelta, _lineTimeOfFlight, _lineCrosswindDeg, _lineHeadwindMeters, _lineTailWindMeters, _lineTempDec, _lineTempInc, _lineAirDensDec, _lineAirDensInc] diff --git a/addons/mk6mortar/functions/fnc_dev_simulateFindSolution.sqf b/addons/mk6mortar/functions/fnc_dev_simulateFindSolution.sqf index edffa1beb2..a45c415b40 100644 --- a/addons/mk6mortar/functions/fnc_dev_simulateFindSolution.sqf +++ b/addons/mk6mortar/functions/fnc_dev_simulateFindSolution.sqf @@ -38,7 +38,7 @@ _lastTestResult = []; _numberOfAttempts = 0; //(binary search) -while {(_numberOfAttempts < MAX_ATTEMPTS) && ((abs _error) > 0.2)} do { +while {(_numberOfAttempts < MAX_ATTEMPTS) && {(abs _error) > 0.2}} do { _numberOfAttempts = _numberOfAttempts + 1; _solutionElevation = (_maxElev + _minElev) / 2; _lastTestResult = [_solutionElevation, _muzzleVelocity, _airFriction, 15, 1, 0, 0, _heightToHit, _timeStep] call FUNC(dev_simulateShot); diff --git a/addons/mk6mortar/functions/fnc_handleFired.sqf b/addons/mk6mortar/functions/fnc_handleFired.sqf index 72c8aa4bff..e2b440c520 100644 --- a/addons/mk6mortar/functions/fnc_handleFired.sqf +++ b/addons/mk6mortar/functions/fnc_handleFired.sqf @@ -21,7 +21,7 @@ */ #include "script_component.hpp" -private ["_unit", "_shooterMan", "_bisAirFriction", "_temperature", "_newMuzzleVelocityCoefficent", "_bulletVelocity", "_bulletSpeed", "_muzzleVelocity", "_muzzleVelocityShift"]; +private ["_shooterMan", "_bisAirFriction", "_temperature", "_newMuzzleVelocityCoefficent", "_bulletVelocity", "_bulletSpeed", "_muzzleVelocity", "_muzzleVelocityShift"]; disableSerialization; @@ -39,17 +39,19 @@ if (!([_shooterMan] call EFUNC(common,isPlayer))) exitWith {false}; _bisAirFriction = getNumber (configFile >> "CfgAmmo" >> _ammo >> "airFriction"); if (_bisAirFriction != 0) exitWith {ERROR("Non zero base airFriction");}; -//Hack Until these are intergrated: -if (isNil QEGVAR(weather,currentRelativeDensity)) then { - EGVAR(weather,currentRelativeDensity) = 1; -}; -if (isNil QEGVAR(weather,currentTemperature)) then { - EGVAR(weather,currentTemperature) = 15; -}; +//Calculate air density: +_altitude = (getPosASL _vehicle) select 2; +#define GET_TEMPERATURE_AT_HEIGHT(h) (EGVAR(weather,currentTemperature) - 0.0065 * (h)) +_temperature = GET_TEMPERATURE_AT_HEIGHT(_altitude); +_pressure = _altitude call EFUNC(weather,calculateBarometricPressure); +_relativeHumidity = EGVAR(weather,currentHumidity); +_airDensity = [_temperature, _pressure, _relativeHumidity] call EFUNC(weather,calculateAirDensity); +_relativeDensity = _airDensity / 1.225; + +TRACE_5("FiredWeather",_temperature,_pressure,_relativeHumidity,_airDensity,_relativeDensity); //powder effects: -_temperature = EGVAR(weather,currentTemperature); _newMuzzleVelocityCoefficent = (((_temperature + 273.13) / 288.13 - 1) / 40 + 1); if (_newMuzzleVelocityCoefficent != 1) then { _bulletVelocity = velocity _projectile; @@ -59,10 +61,11 @@ if (_newMuzzleVelocityCoefficent != 1) then { _muzzleVelocity = _muzzleVelocity + _muzzleVelocityShift; }; + [{ private ["_deltaT", "_bulletVelocity", "_bulletSpeed", "_trueVelocity", "_trueSpeed", "_dragRef", "_accelRef", "_drag", "_accel"]; PARAMS_2(_args,_pfID); - EXPLODE_3_PVT(_args,_shell,_airFriction,_time); + EXPLODE_4_PVT(_args,_shell,_airFriction,_time,_relativeDensity); if (isNull _shell || {!alive _shell}) exitwith { [_pfID] call cba_fnc_removePerFrameHandler; @@ -77,10 +80,10 @@ if (_newMuzzleVelocityCoefficent != 1) then { _trueVelocity = _bulletVelocity vectorDiff ACE_wind; _trueSpeed = vectorMagnitude _trueVelocity; - _drag = _deltaT * _airFriction * _trueSpeed * EGVAR(weather,currentRelativeDensity); + _drag = _deltaT * _airFriction * _trueSpeed * _relativeDensity; _accel = _trueVelocity vectorMultiply (_drag); _bulletVelocity = _bulletVelocity vectorAdd _accel; _shell setVelocity _bulletVelocity; -}, 0, [_projectile, MK6_82mm_AIR_FRICTION, time]] call CBA_fnc_addPerFrameHandler; +}, 0, [_projectile, MK6_82mm_AIR_FRICTION, time, _relativeDensity]] call CBA_fnc_addPerFrameHandler; diff --git a/addons/mk6mortar/functions/fnc_rangeTablePreCalculatedValues.sqf b/addons/mk6mortar/functions/fnc_rangeTablePreCalculatedValues.sqf index 6752a87542..d775b87365 100644 --- a/addons/mk6mortar/functions/fnc_rangeTablePreCalculatedValues.sqf +++ b/addons/mk6mortar/functions/fnc_rangeTablePreCalculatedValues.sqf @@ -21,242 +21,247 @@ PARAMS_2(_muzzleVelocity,_airFriction); switch (true) do { -case ((abs(_muzzleVelocity - 70) < 0.00001) && ((abs(_airFriction - -0.0001) < 0.00001))): { +case ((abs(_muzzleVelocity - 70) < 0.00001) && {(abs(_airFriction - -0.0001) < 0.00001)}): { [ - ["100","1493","9","14.0","3.7","0.4","-0.3","0.0","-0.0","-0.0","0.0"], - ["150","1438","14","13.9","2.5","0.4","-0.4","0.0","-0.0","-0.1","0.0"], - ["200","1381","20","13.8","1.9","0.5","-0.4","0.0","-0.0","-0.1","0.1"], - ["250","1321","27","13.6","1.5","0.5","-0.4","0.0","-0.0","-0.1","0.1"], - ["300","1256","36","13.3","1.3","0.6","-0.5","0.0","-0.1","-0.1","0.1"], - ["350","1183","49","12.9","1.1","0.6","-0.5","0.1","-0.1","-0.1","0.1"], - ["400","1097","70","12.4","0.9","0.6","-0.5","0.1","-0.1","-0.2","0.1"], - ["450","979","113","11.6","0.8","0.6","-0.5","0.1","-0.1","-0.2","0.2"] + ["100","1493","9","1.4","14.0","3.7","0.4","-0.3","0.0","-0.0","-0.0","0.0"], + ["150","1438","14","1.4","13.9","2.5","0.4","-0.4","0.0","-0.0","-0.1","0.0"], + ["200","1381","20","1.4","13.8","1.9","0.5","-0.4","0.0","-0.0","-0.1","0.1"], + ["250","1321","27","1.5","13.6","1.5","0.5","-0.4","0.0","-0.0","-0.1","0.1"], + ["300","1256","36","1.6","13.3","1.3","0.6","-0.5","0.0","-0.1","-0.1","0.1"], + ["350","1183","49","1.7","12.9","1.1","0.6","-0.5","0.1","-0.1","-0.1","0.1"], + ["400","1097","70","1.9","12.4","0.9","0.6","-0.5","0.1","-0.1","-0.2","0.1"], + ["450","979","113","2.3","11.6","0.8","0.6","-0.5","0.1","-0.1","-0.2","0.2"] ] }; -case ((abs(_muzzleVelocity - 140) < 0.00001) && ((abs(_airFriction - -0.0001) < 0.00001))): { +case ((abs(_muzzleVelocity - 140) < 0.00001) && {(abs(_airFriction - -0.0001) < 0.00001)}): { [ - ["250","1527","2","27.2","9.9","2.6","-2.4","0.0","-0.0","-0.3","0.3"], - ["300","1512","2","27.2","8.3","2.7","-2.4","0.1","-0.0","-0.4","0.4"], - ["350","1497","3","27.1","7.1","2.7","-2.5","0.0","-0.1","-0.5","0.4"], - ["400","1482","3","27.1","6.2","2.7","-2.5","0.1","-0.1","-0.5","0.5"], - ["450","1467","3","27.0","5.6","2.8","-2.5","0.1","-0.1","-0.6","0.6"], - ["500","1451","4","27.0","5.0","2.9","-2.6","0.1","-0.1","-0.6","0.6"], - ["550","1436","4","26.9","4.6","2.9","-2.6","0.1","-0.1","-0.7","0.7"], - ["600","1420","5","26.8","4.2","3.0","-2.7","0.1","-0.1","-0.8","0.8"], - ["650","1404","5","26.8","3.9","3.0","-2.7","0.1","-0.1","-0.9","0.8"], - ["700","1388","6","26.7","3.6","3.1","-2.8","0.1","-0.1","-0.9","0.9"], - ["750","1372","6","26.6","3.4","3.2","-2.8","0.1","-0.1","-1.0","1.0"], - ["800","1355","7","26.5","3.2","3.2","-2.9","0.1","-0.1","-1.1","1.1"], - ["850","1338","8","26.4","3.0","3.3","-2.9","0.1","-0.1","-1.1","1.1"], - ["900","1321","8","26.2","2.8","3.4","-3.0","0.1","-0.1","-1.2","1.2"], - ["950","1303","9","26.1","2.7","3.4","-3.1","0.1","-0.2","-1.3","1.2"], - ["1000","1285","10","26.0","2.6","3.5","-3.1","0.2","-0.1","-1.4","1.3"], - ["1050","1266","11","25.8","2.4","3.5","-3.2","0.1","-0.2","-1.4","1.4"], - ["1100","1247","12","25.7","2.3","3.6","-3.3","0.1","-0.2","-1.5","1.4"], - ["1150","1228","13","25.5","2.2","3.7","-3.3","0.2","-0.2","-1.6","1.5"], - ["1200","1207","14","25.3","2.1","3.7","-3.4","0.2","-0.2","-1.7","1.6"], - ["1250","1186","15","25.1","2.0","3.8","-3.4","0.2","-0.2","-1.7","1.7"], - ["1300","1163","17","24.8","1.9","3.8","-3.5","0.2","-0.2","-1.8","1.7"], - ["1350","1140","19","24.6","1.9","3.9","-3.5","0.2","-0.2","-1.9","1.8"], - ["1400","1115","21","24.3","1.8","3.9","-3.6","0.2","-0.2","-1.9","1.9"], - ["1450","1088","24","23.9","1.7","4.0","-3.6","0.2","-0.2","-2.0","1.9"], - ["1500","1060","27","23.6","1.6","4.0","-3.7","0.2","-0.2","-2.1","2.0"], - ["1550","1028","32","23.1","1.5","4.0","-3.7","0.2","-0.2","-2.1","2.1"], - ["1600","991","38","22.6","1.5","4.0","-3.7","0.2","-0.2","-2.2","2.1"], - ["1650","947","49","21.9","1.4","4.0","-3.7","0.2","-0.3","-2.3","2.2"], - ["1700","888","71","21.0","1.3","3.9","-3.6","0.3","-0.3","-2.3","2.2"] + ["150","1556","1","0.8","27.2","16.3","2.5","-2.4","0.0","-0.0","-0.2","0.2"], + ["200","1541","1","0.8","27.2","12.3","2.5","-2.4","0.0","-0.0","-0.3","0.2"], + ["250","1527","2","0.8","27.2","9.9","2.6","-2.4","0.0","-0.0","-0.3","0.3"], + ["300","1512","2","0.8","27.2","8.3","2.7","-2.4","0.1","-0.0","-0.4","0.4"], + ["350","1497","3","0.8","27.1","7.1","2.7","-2.5","0.0","-0.1","-0.5","0.4"], + ["400","1482","3","0.8","27.1","6.2","2.7","-2.5","0.1","-0.1","-0.5","0.5"], + ["450","1467","3","0.8","27.0","5.6","2.8","-2.5","0.1","-0.1","-0.6","0.6"], + ["500","1451","4","0.8","27.0","5.0","2.9","-2.6","0.1","-0.1","-0.6","0.6"], + ["550","1436","4","0.8","26.9","4.6","2.9","-2.6","0.1","-0.1","-0.7","0.7"], + ["600","1420","5","0.8","26.8","4.2","3.0","-2.7","0.1","-0.1","-0.8","0.8"], + ["650","1404","5","0.8","26.8","3.9","3.0","-2.7","0.1","-0.1","-0.9","0.8"], + ["700","1388","6","0.8","26.7","3.6","3.1","-2.8","0.1","-0.1","-0.9","0.9"], + ["750","1372","6","0.8","26.6","3.4","3.2","-2.8","0.1","-0.1","-1.0","1.0"], + ["800","1355","7","0.8","26.5","3.2","3.2","-2.9","0.1","-0.1","-1.1","1.1"], + ["850","1338","8","0.8","26.4","3.0","3.3","-2.9","0.1","-0.1","-1.1","1.1"], + ["900","1321","8","0.8","26.2","2.8","3.4","-3.0","0.1","-0.1","-1.2","1.2"], + ["950","1303","9","0.9","26.1","2.7","3.4","-3.1","0.1","-0.2","-1.3","1.2"], + ["1000","1285","10","0.9","26.0","2.6","3.5","-3.1","0.2","-0.1","-1.4","1.3"], + ["1050","1266","11","0.9","25.8","2.4","3.5","-3.2","0.1","-0.2","-1.4","1.4"], + ["1100","1247","12","0.9","25.7","2.3","3.6","-3.3","0.1","-0.2","-1.5","1.4"], + ["1150","1228","13","0.9","25.5","2.2","3.7","-3.3","0.2","-0.2","-1.6","1.5"], + ["1200","1207","14","1.0","25.3","2.1","3.7","-3.4","0.2","-0.2","-1.7","1.6"], + ["1250","1186","15","1.0","25.1","2.0","3.8","-3.4","0.2","-0.2","-1.7","1.7"], + ["1300","1163","17","1.0","24.8","1.9","3.8","-3.5","0.2","-0.2","-1.8","1.7"], + ["1350","1140","19","1.0","24.6","1.9","3.9","-3.5","0.2","-0.2","-1.9","1.8"], + ["1400","1115","21","1.1","24.3","1.8","3.9","-3.6","0.2","-0.2","-1.9","1.9"], + ["1450","1088","24","1.1","23.9","1.7","4.0","-3.6","0.2","-0.2","-2.0","1.9"], + ["1500","1060","27","1.2","23.6","1.6","4.0","-3.7","0.2","-0.2","-2.1","2.0"], + ["1550","1028","32","1.3","23.1","1.5","4.0","-3.7","0.2","-0.2","-2.1","2.1"], + ["1600","991","38","1.4","22.6","1.5","4.0","-3.7","0.2","-0.2","-2.2","2.1"], + ["1650","947","49","1.7","21.9","1.4","4.0","-3.7","0.2","-0.3","-2.3","2.2"], + ["1700","888","71","2.1","21.0","1.3","3.9","-3.6","0.3","-0.3","-2.3","2.2"] ] }; -case ((abs(_muzzleVelocity - 200) < 0.00001) && ((abs(_airFriction - -0.0001) < 0.00001))): { +case ((abs(_muzzleVelocity - 200) < 0.00001) && {(abs(_airFriction - -0.0001) < 0.00001)}): { [ - ["450","1527","1","37.3","13.4","6.3","-6.0","0.1","-0.1","-1.0","1.0"], - ["500","1519","1","37.2","12.1","6.3","-6.0","0.1","-0.1","-1.1","1.1"], - ["550","1510","1","37.2","11.0","6.4","-6.0","0.1","-0.1","-1.3","1.2"], - ["600","1502","1","37.2","10.1","6.4","-6.1","0.1","-0.1","-1.4","1.3"], - ["650","1494","1","37.2","9.4","6.5","-6.1","0.1","-0.1","-1.5","1.4"], - ["700","1485","2","37.1","8.7","6.5","-6.2","0.1","-0.1","-1.6","1.5"], - ["750","1477","2","37.1","8.2","6.6","-6.2","0.1","-0.1","-1.7","1.6"], - ["800","1468","2","37.0","7.7","6.7","-6.3","0.1","-0.1","-1.8","1.8"], - ["850","1460","2","37.0","7.2","6.7","-6.3","0.1","-0.1","-2.0","1.9"], - ["900","1451","2","37.0","6.8","6.8","-6.4","0.1","-0.1","-2.1","2.0"], - ["950","1443","2","36.9","6.5","6.9","-6.4","0.1","-0.1","-2.2","2.1"], - ["1000","1434","2","36.9","6.2","6.9","-6.5","0.1","-0.1","-2.3","2.2"], - ["1050","1425","2","36.8","5.9","7.0","-6.6","0.1","-0.2","-2.5","2.3"], - ["1100","1417","3","36.8","5.6","7.1","-6.6","0.1","-0.2","-2.6","2.4"], - ["1150","1408","3","36.7","5.4","7.1","-6.7","0.2","-0.2","-2.7","2.5"], - ["1200","1399","3","36.6","5.2","7.2","-6.7","0.2","-0.2","-2.8","2.7"], - ["1250","1390","3","36.6","5.0","7.3","-6.8","0.2","-0.2","-2.9","2.8"], - ["1300","1381","3","36.5","4.8","7.4","-6.9","0.2","-0.2","-3.0","2.9"], - ["1350","1372","3","36.4","4.6","7.4","-6.9","0.2","-0.2","-3.2","3.0"], - ["1400","1362","4","36.4","4.4","7.5","-7.0","0.2","-0.2","-3.3","3.1"], - ["1450","1353","4","36.3","4.3","7.6","-7.1","0.2","-0.2","-3.4","3.2"], - ["1500","1344","4","36.2","4.2","7.7","-7.1","0.2","-0.2","-3.5","3.4"], - ["1550","1334","4","36.1","4.0","7.7","-7.2","0.2","-0.2","-3.7","3.5"], - ["1600","1324","4","36.0","3.9","7.8","-7.3","0.2","-0.2","-3.8","3.6"], - ["1650","1314","4","35.9","3.8","7.9","-7.3","0.2","-0.2","-3.9","3.7"], - ["1700","1304","5","35.8","3.7","7.9","-7.4","0.2","-0.2","-4.0","3.8"], - ["1750","1294","5","35.7","3.6","8.0","-7.5","0.2","-0.2","-4.2","3.9"], - ["1800","1284","5","35.6","3.5","8.1","-7.6","0.2","-0.3","-4.3","4.0"], - ["1850","1274","5","35.5","3.4","8.2","-7.6","0.2","-0.3","-4.4","4.2"], - ["1900","1263","6","35.4","3.3","8.2","-7.7","0.2","-0.3","-4.5","4.3"], - ["1950","1253","6","35.2","3.2","8.3","-7.8","0.2","-0.3","-4.7","4.4"], - ["2000","1242","6","35.1","3.1","8.4","-7.8","0.3","-0.3","-4.8","4.5"], - ["2050","1231","7","35.0","3.0","8.4","-7.9","0.3","-0.3","-4.9","4.7"], - ["2100","1219","7","34.8","2.9","8.5","-8.0","0.3","-0.3","-5.0","4.8"], - ["2150","1208","7","34.7","2.9","8.5","-8.0","0.3","-0.3","-5.2","4.9"], - ["2200","1196","8","34.5","2.8","8.6","-8.1","0.3","-0.3","-5.3","5.0"], - ["2250","1184","8","34.3","2.7","8.7","-8.2","0.3","-0.3","-5.4","5.1"], - ["2300","1171","9","34.2","2.7","8.7","-8.2","0.3","-0.3","-5.5","5.2"], - ["2350","1158","9","34.0","2.6","8.8","-8.3","0.3","-0.3","-5.7","5.4"], - ["2400","1145","10","33.8","2.5","8.8","-8.3","0.3","-0.3","-5.8","5.5"], - ["2450","1132","10","33.6","2.5","8.9","-8.4","0.3","-0.3","-5.9","5.6"], - ["2500","1118","11","33.3","2.4","8.9","-8.4","0.3","-0.3","-6.0","5.7"], - ["2550","1103","12","33.1","2.4","9.0","-8.5","0.3","-0.3","-6.1","5.8"], - ["2600","1088","13","32.8","2.3","9.0","-8.5","0.4","-0.3","-6.2","5.9"], - ["2650","1072","14","32.6","2.2","9.0","-8.6","0.4","-0.4","-6.4","6.0"], - ["2700","1056","15","32.3","2.2","9.0","-8.6","0.3","-0.4","-6.5","6.1"], - ["2750","1038","16","31.9","2.1","9.1","-8.6","0.4","-0.4","-6.6","6.3"], - ["2800","1020","18","31.6","2.1","9.1","-8.6","0.4","-0.4","-6.7","6.4"], - ["2850","1000","20","31.2","2.0","9.1","-8.6","0.4","-0.4","-6.8","6.5"], - ["2900","978","22","30.8","1.9","9.0","-8.6","0.4","-0.4","-6.9","6.5"], - ["2950","954","26","30.3","1.9","9.0","-8.6","0.4","-0.4","-7.0","6.6"], - ["3000","927","31","29.7","1.8","8.9","-8.5","0.4","-0.4","-7.1","6.7"], - ["3050","894","38","29.0","1.7","8.8","-8.4","0.4","-0.4","-7.2","6.8"], - ["3100","849","54","27.9","1.6","8.5","-8.3","0.4","-0.4","-7.2","6.8"] + ["250","1559","1","0.6","37.3","23.8","6.1","-5.9","0.0","-0.0","-0.6","0.5"], + ["300","1551","1","0.6","37.3","20.0","6.1","-5.9","0.1","-0.0","-0.7","0.7"], + ["350","1543","1","0.6","37.3","17.2","6.2","-5.9","0.0","-0.1","-0.8","0.7"], + ["400","1535","1","0.6","37.3","15.1","6.2","-5.9","0.1","-0.0","-0.9","0.9"], + ["450","1527","1","0.6","37.3","13.4","6.3","-6.0","0.1","-0.1","-1.0","1.0"], + ["500","1519","1","0.6","37.2","12.1","6.3","-6.0","0.1","-0.1","-1.1","1.1"], + ["550","1510","1","0.6","37.2","11.0","6.4","-6.0","0.1","-0.1","-1.3","1.2"], + ["600","1502","1","0.6","37.2","10.1","6.4","-6.1","0.1","-0.1","-1.4","1.3"], + ["650","1494","1","0.6","37.2","9.4","6.5","-6.1","0.1","-0.1","-1.5","1.4"], + ["700","1485","2","0.6","37.1","8.7","6.5","-6.2","0.1","-0.1","-1.6","1.5"], + ["750","1477","2","0.6","37.1","8.2","6.6","-6.2","0.1","-0.1","-1.7","1.6"], + ["800","1468","2","0.6","37.0","7.7","6.7","-6.3","0.1","-0.1","-1.8","1.8"], + ["850","1460","2","0.6","37.0","7.2","6.7","-6.3","0.1","-0.1","-2.0","1.9"], + ["900","1451","2","0.6","37.0","6.8","6.8","-6.4","0.1","-0.1","-2.1","2.0"], + ["950","1443","2","0.6","36.9","6.5","6.9","-6.4","0.1","-0.1","-2.2","2.1"], + ["1000","1434","2","0.6","36.9","6.2","6.9","-6.5","0.1","-0.1","-2.3","2.2"], + ["1050","1425","2","0.6","36.8","5.9","7.0","-6.6","0.1","-0.2","-2.5","2.3"], + ["1100","1417","3","0.6","36.8","5.6","7.1","-6.6","0.1","-0.2","-2.6","2.4"], + ["1150","1408","3","0.6","36.7","5.4","7.1","-6.7","0.2","-0.2","-2.7","2.5"], + ["1200","1399","3","0.6","36.6","5.2","7.2","-6.7","0.2","-0.2","-2.8","2.7"], + ["1250","1390","3","0.6","36.6","5.0","7.3","-6.8","0.2","-0.2","-2.9","2.8"], + ["1300","1381","3","0.6","36.5","4.8","7.4","-6.9","0.2","-0.2","-3.0","2.9"], + ["1350","1372","3","0.6","36.4","4.6","7.4","-6.9","0.2","-0.2","-3.2","3.0"], + ["1400","1362","4","0.6","36.4","4.4","7.5","-7.0","0.2","-0.2","-3.3","3.1"], + ["1450","1353","4","0.6","36.3","4.3","7.6","-7.1","0.2","-0.2","-3.4","3.2"], + ["1500","1344","4","0.6","36.2","4.2","7.7","-7.1","0.2","-0.2","-3.5","3.4"], + ["1550","1334","4","0.6","36.1","4.0","7.7","-7.2","0.2","-0.2","-3.7","3.5"], + ["1600","1324","4","0.6","36.0","3.9","7.8","-7.3","0.2","-0.2","-3.8","3.6"], + ["1650","1314","4","0.7","35.9","3.8","7.9","-7.3","0.2","-0.2","-3.9","3.7"], + ["1700","1304","5","0.7","35.8","3.7","7.9","-7.4","0.2","-0.2","-4.0","3.8"], + ["1750","1294","5","0.7","35.7","3.6","8.0","-7.5","0.2","-0.2","-4.2","3.9"], + ["1800","1284","5","0.7","35.6","3.5","8.1","-7.6","0.2","-0.3","-4.3","4.0"], + ["1850","1274","5","0.7","35.5","3.4","8.2","-7.6","0.2","-0.3","-4.4","4.2"], + ["1900","1263","6","0.7","35.4","3.3","8.2","-7.7","0.2","-0.3","-4.5","4.3"], + ["1950","1253","6","0.7","35.2","3.2","8.3","-7.8","0.2","-0.3","-4.7","4.4"], + ["2000","1242","6","0.7","35.1","3.1","8.4","-7.8","0.3","-0.3","-4.8","4.5"], + ["2050","1231","7","0.7","35.0","3.0","8.4","-7.9","0.3","-0.3","-4.9","4.7"], + ["2100","1219","7","0.7","34.8","2.9","8.5","-8.0","0.3","-0.3","-5.0","4.8"], + ["2150","1208","7","0.7","34.7","2.9","8.5","-8.0","0.3","-0.3","-5.2","4.9"], + ["2200","1196","8","0.7","34.5","2.8","8.6","-8.1","0.3","-0.3","-5.3","5.0"], + ["2250","1184","8","0.7","34.3","2.7","8.7","-8.2","0.3","-0.3","-5.4","5.1"], + ["2300","1171","9","0.8","34.2","2.7","8.7","-8.2","0.3","-0.3","-5.5","5.2"], + ["2350","1158","9","0.8","34.0","2.6","8.8","-8.3","0.3","-0.3","-5.7","5.4"], + ["2400","1145","10","0.8","33.8","2.5","8.8","-8.3","0.3","-0.3","-5.8","5.5"], + ["2450","1132","10","0.8","33.6","2.5","8.9","-8.4","0.3","-0.3","-5.9","5.6"], + ["2500","1118","11","0.8","33.3","2.4","8.9","-8.4","0.3","-0.3","-6.0","5.7"], + ["2550","1103","12","0.8","33.1","2.4","9.0","-8.5","0.3","-0.3","-6.1","5.8"], + ["2600","1088","13","0.9","32.8","2.3","9.0","-8.5","0.4","-0.3","-6.2","5.9"], + ["2650","1072","14","0.9","32.6","2.2","9.0","-8.6","0.4","-0.4","-6.4","6.0"], + ["2700","1056","15","0.9","32.3","2.2","9.0","-8.6","0.3","-0.4","-6.5","6.1"], + ["2750","1038","16","1.0","31.9","2.1","9.1","-8.6","0.4","-0.4","-6.6","6.3"], + ["2800","1020","18","1.0","31.6","2.1","9.1","-8.6","0.4","-0.4","-6.7","6.4"], + ["2850","1000","20","1.1","31.2","2.0","9.1","-8.6","0.4","-0.4","-6.8","6.5"], + ["2900","978","22","1.1","30.8","1.9","9.0","-8.6","0.4","-0.4","-6.9","6.5"], + ["2950","954","26","1.2","30.3","1.9","9.0","-8.6","0.4","-0.4","-7.0","6.6"], + ["3000","927","31","1.4","29.7","1.8","8.9","-8.5","0.4","-0.4","-7.1","6.7"], + ["3050","894","38","1.6","29.0","1.7","8.8","-8.4","0.4","-0.4","-7.2","6.8"], + ["3100","849","54","2.0","27.9","1.6","8.5","-8.3","0.4","-0.4","-7.2","6.8"] ] }; - -case ((abs(_muzzleVelocity - 70) < 0.00001) && ((abs(_airFriction - 0) < 0.00001))): { +case ((abs(_muzzleVelocity - 70) < 0.00001) && {(abs(_airFriction - 0) < 0.00001)}): { [ - ["100","1497","9","14.2","0.0","0.0","0.0","0.0","0.0","0.0","0.0"], - ["150","1445","14","14.1","0.0","0.0","0.0","0.0","0.0","0.0","0.0"], - ["200","1390","19","14.0","0.0","0.0","0.0","0.0","0.0","0.0","0.0"], - ["250","1333","26","13.8","0.0","0.0","0.0","0.0","0.0","0.0","0.0"], - ["300","1272","34","13.5","0.0","0.0","0.0","0.0","0.0","0.0","0.0"], - ["350","1204","45","13.2","0.0","0.0","0.0","0.0","0.0","0.0","0.0"], - ["400","1127","61","12.8","0.0","0.0","0.0","0.0","0.0","0.0","0.0"], - ["450","1028","91","12.1","0.0","0.0","0.0","0.0","0.0","0.0","0.0"] + ["100","1497","9","1.3","0.0","0.0","0.0","0.0","0.0","0.0","0.0","-0.0"], + ["150","1445","14","1.3","0.0","0.0","0.0","0.0","0.0","0.0","0.0","-0.0"], + ["200","1390","19","1.4","0.0","0.0","0.0","0.0","0.0","0.0","0.0","0.0"], + ["250","1333","26","1.4","0.0","0.0","0.0","0.0","0.0","0.0","0.0","-0.0"], + ["300","1272","34","1.5","0.0","0.0","0.0","0.0","0.0","0.0","0.0","0.0"], + ["350","1204","45","1.6","0.0","0.0","0.0","0.0","0.0","0.0","0.0","-0.0"], + ["400","1127","61","1.8","0.0","0.0","0.0","0.0","0.0","0.0","0.0","-0.0"], + ["450","1028","91","2.1","0.0","0.0","0.0","0.0","0.0","0.0","0.0","0.0"] ] }; -case ((abs(_muzzleVelocity - 140) < 0.00001) && ((abs(_airFriction - 0) < 0.00001))): { +case ((abs(_muzzleVelocity - 140) < 0.00001) && {(abs(_airFriction - 0) < 0.00001)}): { [ - ["150","1562","1","28.5","0.0","0.0","0.0","0.0","0.0","0.0","0.0"], - ["200","1549","1","28.5","0.0","0.0","0.0","0.0","0.0","0.0","0.0"], - ["250","1536","2","28.5","0.0","0.0","0.0","0.0","0.0","0.0","0.0"], - ["300","1523","2","28.5","0.0","0.0","0.0","0.0","0.0","0.0","0.0"], - ["350","1510","2","28.4","0.0","0.0","0.0","0.0","0.0","0.0","0.0"], - ["400","1497","3","28.4","0.0","0.0","0.0","0.0","0.0","0.0","0.0"], - ["450","1484","3","28.4","0.0","0.0","0.0","0.0","0.0","0.0","0.0"], - ["500","1471","3","28.3","0.0","0.0","0.0","0.0","0.0","0.0","0.0"], - ["550","1458","4","28.3","0.0","0.0","0.0","0.0","0.0","0.0","0.0"], - ["600","1445","4","28.2","0.0","0.0","0.0","0.0","0.0","0.0","0.0"], - ["650","1431","4","28.2","0.0","0.0","0.0","0.0","0.0","0.0","0.0"], - ["700","1418","5","28.1","0.0","0.0","0.0","0.0","0.0","0.0","0.0"], - ["750","1404","5","28.0","0.0","0.0","0.0","0.0","0.0","0.0","0.0"], - ["800","1390","6","27.9","0.0","0.0","0.0","0.0","0.0","0.0","0.0"], - ["850","1376","6","27.9","0.0","0.0","0.0","0.0","0.0","0.0","0.0"], - ["900","1362","6","27.8","0.0","0.0","0.0","0.0","0.0","0.0","0.0"], - ["950","1348","7","27.7","0.0","0.0","0.0","0.0","0.0","0.0","0.0"], - ["1000","1333","7","27.6","0.0","0.0","0.0","0.0","0.0","0.0","0.0"], - ["1050","1318","8","27.5","0.0","0.0","0.0","0.0","0.0","0.0","0.0"], - ["1100","1303","9","27.3","0.0","0.0","0.0","0.0","0.0","0.0","0.0"], - ["1150","1288","9","27.2","0.0","0.0","0.0","0.0","0.0","0.0","0.0"], - ["1200","1272","10","27.1","0.0","0.0","0.0","0.0","0.0","0.0","0.0"], - ["1250","1256","11","26.9","0.0","0.0","0.0","0.0","0.0","0.0","0.0"], - ["1300","1239","12","26.8","0.0","0.0","0.0","0.0","0.0","0.0","0.0"], - ["1350","1222","13","26.6","0.0","0.0","0.0","0.0","0.0","0.0","0.0"], - ["1400","1205","13","26.4","0.0","0.0","0.0","0.0","0.0","0.0","0.0"], - ["1450","1187","15","26.2","0.0","0.0","0.0","0.0","0.0","0.0","0.0"], - ["1500","1168","16","26.0","0.0","0.0","0.0","0.0","0.0","0.0","0.0"], - ["1550","1148","18","25.8","0.0","0.0","0.0","0.0","0.0","0.0","0.0"], - ["1600","1127","19","25.5","0.0","0.0","0.0","0.0","0.0","0.0","0.0"], - ["1650","1105","21","25.2","0.0","0.0","0.0","0.0","0.0","0.0","0.0"], - ["1700","1082","24","24.9","0.0","0.0","0.0","0.0","0.0","0.0","0.0"], - ["1750","1057","27","24.6","0.0","0.0","0.0","0.0","0.0","0.0","0.0"], - ["1800","1029","31","24.2","0.0","0.0","0.0","0.0","0.0","0.0","0.0"], - ["1850","997","37","23.7","0.0","0.0","0.0","0.0","0.0","0.0","0.0"], - ["1900","960","46","23.1","0.0","0.0","0.0","0.0","0.0","0.0","0.0"], - ["1950","912","63","22.3","0.0","0.0","0.0","0.0","0.0","0.0","0.0"] + ["150","1562","1","0.7","0.0","0.0","0.0","0.0","0.0","0.0","0.0","-0.0"], + ["200","1549","1","0.7","0.0","0.0","0.0","0.0","0.0","0.0","0.0","-0.0"], + ["250","1536","2","0.7","0.0","0.0","0.0","0.0","0.0","0.0","0.0","0.0"], + ["300","1523","2","0.7","0.0","0.0","0.0","0.0","0.0","0.0","0.0","-0.0"], + ["350","1510","2","0.7","0.0","0.0","0.0","0.0","0.0","0.0","0.0","0.0"], + ["400","1497","3","0.7","0.0","0.0","0.0","0.0","0.0","0.0","0.0","-0.0"], + ["450","1484","3","0.7","0.0","0.0","0.0","0.0","0.0","0.0","0.0","0.0"], + ["500","1471","3","0.7","0.0","0.0","0.0","0.0","0.0","0.0","0.0","-0.0"], + ["550","1458","4","0.7","0.0","0.0","0.0","0.0","0.0","0.0","0.0","-0.0"], + ["600","1445","4","0.7","0.0","0.0","0.0","0.0","0.0","0.0","0.0","0.0"], + ["650","1431","4","0.7","0.0","0.0","0.0","0.0","0.0","0.0","0.0","-0.0"], + ["700","1418","5","0.7","0.0","0.0","0.0","0.0","0.0","0.0","0.0","0.0"], + ["750","1404","5","0.7","0.0","0.0","0.0","0.0","0.0","0.0","0.0","0.0"], + ["800","1390","6","0.7","0.0","0.0","0.0","0.0","0.0","0.0","0.0","-0.0"], + ["850","1376","6","0.7","0.0","0.0","0.0","0.0","0.0","0.0","0.0","-0.0"], + ["900","1362","6","0.8","0.0","0.0","0.0","0.0","0.0","0.0","0.0","0.0"], + ["950","1348","7","0.8","0.0","0.0","0.0","0.0","0.0","0.0","0.0","0.0"], + ["1000","1333","7","0.8","0.0","0.0","0.0","0.0","0.0","0.0","0.0","-0.0"], + ["1050","1318","8","0.8","0.0","0.0","0.0","0.0","0.0","0.0","0.0","-0.0"], + ["1100","1303","9","0.8","0.0","0.0","0.0","0.0","0.0","0.0","0.0","-0.0"], + ["1150","1288","9","0.8","0.0","0.0","0.0","0.0","0.0","0.0","0.0","-0.0"], + ["1200","1272","10","0.8","0.0","0.0","0.0","0.0","0.0","0.0","0.0","-0.0"], + ["1250","1256","11","0.8","0.0","0.0","0.0","0.0","0.0","0.0","0.0","0.0"], + ["1300","1239","12","0.8","0.0","0.0","0.0","0.0","0.0","0.0","0.0","-0.0"], + ["1350","1222","13","0.9","0.0","0.0","0.0","0.0","0.0","0.0","0.0","-0.0"], + ["1400","1205","13","0.9","0.0","0.0","0.0","0.0","0.0","0.0","0.0","-0.0"], + ["1450","1187","15","0.9","0.0","0.0","0.0","0.0","0.0","0.0","0.0","-0.0"], + ["1500","1168","16","0.9","0.0","0.0","0.0","0.0","0.0","0.0","0.0","-0.0"], + ["1550","1148","18","1.0","0.0","0.0","0.0","0.0","0.0","0.0","0.0","-0.0"], + ["1600","1127","19","1.0","0.0","0.0","0.0","0.0","0.0","0.0","0.0","-0.0"], + ["1650","1105","21","1.1","0.0","0.0","0.0","0.0","0.0","0.0","0.0","-0.0"], + ["1700","1082","24","1.1","0.0","0.0","0.0","0.0","0.0","0.0","0.0","-0.0"], + ["1750","1057","27","1.2","0.0","0.0","0.0","0.0","0.0","0.0","0.0","-0.0"], + ["1800","1029","31","1.3","0.0","0.0","0.0","0.0","0.0","0.0","0.0","0.0"], + ["1850","997","37","1.4","0.0","0.0","0.0","0.0","0.0","0.0","0.0","-0.0"], + ["1900","960","46","1.6","0.0","0.0","0.0","0.0","0.0","0.0","0.0","-0.0"], + ["1950","912","63","1.9","0.0","0.0","0.0","0.0","0.0","0.0","0.0","-0.0"] ] }; -case ((abs(_muzzleVelocity - 200) < 0.00001) && ((abs(_airFriction - 0) < 0.00001))): { +case ((abs(_muzzleVelocity - 200) < 0.00001) && {(abs(_airFriction - 0) < 0.00001)}): { [ - ["300","1563","0","40.8","0.0","0.0","0.0","0.0","0.0","0.0","0.0"], - ["350","1556","1","40.8","0.0","0.0","0.0","0.0","0.0","0.0","0.0"], - ["400","1550","1","40.7","0.0","0.0","0.0","0.0","0.0","0.0","0.0"], - ["450","1544","1","40.7","0.0","0.0","0.0","0.0","0.0","0.0","0.0"], - ["500","1537","1","40.7","0.0","0.0","0.0","0.0","0.0","0.0","0.0"], - ["550","1531","1","40.7","0.0","0.0","0.0","0.0","0.0","0.0","0.0"], - ["600","1525","1","40.7","0.0","0.0","0.0","0.0","0.0","0.0","0.0"], - ["650","1519","1","40.7","0.0","0.0","0.0","0.0","0.0","0.0","0.0"], - ["700","1512","1","40.6","0.0","0.0","0.0","0.0","0.0","0.0","0.0"], - ["750","1506","1","40.6","0.0","0.0","0.0","0.0","0.0","0.0","0.0"], - ["800","1499","1","40.6","0.0","0.0","0.0","0.0","0.0","0.0","0.0"], - ["850","1493","1","40.6","0.0","0.0","0.0","0.0","0.0","0.0","0.0"], - ["900","1487","1","40.5","0.0","0.0","0.0","0.0","0.0","0.0","0.0"], - ["950","1480","1","40.5","0.0","0.0","0.0","0.0","0.0","0.0","0.0"], - ["1000","1474","2","40.5","0.0","0.0","0.0","0.0","0.0","0.0","0.0"], - ["1050","1467","2","40.5","0.0","0.0","0.0","0.0","0.0","0.0","0.0"], - ["1100","1461","2","40.4","0.0","0.0","0.0","0.0","0.0","0.0","0.0"], - ["1150","1454","2","40.4","0.0","0.0","0.0","0.0","0.0","0.0","0.0"], - ["1200","1448","2","40.3","0.0","0.0","0.0","0.0","0.0","0.0","0.0"], - ["1250","1441","2","40.3","0.0","0.0","0.0","0.0","0.0","0.0","0.0"], - ["1300","1435","2","40.3","0.0","0.0","0.0","0.0","0.0","0.0","0.0"], - ["1350","1428","2","40.2","0.0","0.0","0.0","0.0","0.0","0.0","0.0"], - ["1400","1422","2","40.2","0.0","0.0","0.0","0.0","0.0","0.0","0.0"], - ["1450","1415","2","40.1","0.0","0.0","0.0","0.0","0.0","0.0","0.0"], - ["1500","1408","2","40.1","0.0","0.0","0.0","0.0","0.0","0.0","0.0"], - ["1550","1402","3","40.0","0.0","0.0","0.0","0.0","0.0","0.0","0.0"], - ["1600","1395","3","40.0","0.0","0.0","0.0","0.0","0.0","0.0","0.0"], - ["1650","1388","3","39.9","0.0","0.0","0.0","0.0","0.0","0.0","0.0"], - ["1700","1381","3","39.9","0.0","0.0","0.0","0.0","0.0","0.0","0.0"], - ["1750","1374","3","39.8","0.0","0.0","0.0","0.0","0.0","0.0","0.0"], - ["1800","1367","3","39.7","0.0","0.0","0.0","0.0","0.0","0.0","0.0"], - ["1850","1360","3","39.7","0.0","0.0","0.0","0.0","0.0","0.0","0.0"], - ["1900","1353","3","39.6","0.0","0.0","0.0","0.0","0.0","0.0","0.0"], - ["1950","1346","4","39.5","0.0","0.0","0.0","0.0","0.0","0.0","0.0"], - ["2000","1339","4","39.5","0.0","0.0","0.0","0.0","0.0","0.0","0.0"], - ["2050","1332","4","39.4","0.0","0.0","0.0","0.0","0.0","0.0","0.0"], - ["2100","1325","4","39.3","0.0","0.0","0.0","0.0","0.0","0.0","0.0"], - ["2150","1317","4","39.2","0.0","0.0","0.0","0.0","0.0","0.0","0.0"], - ["2200","1310","4","39.2","0.0","0.0","0.0","0.0","0.0","0.0","0.0"], - ["2250","1302","4","39.1","0.0","0.0","0.0","0.0","0.0","0.0","0.0"], - ["2300","1295","5","39.0","0.0","0.0","0.0","0.0","0.0","0.0","0.0"], - ["2350","1287","5","38.9","0.0","0.0","0.0","0.0","0.0","0.0","0.0"], - ["2400","1280","5","38.8","0.0","0.0","0.0","0.0","0.0","0.0","0.0"], - ["2450","1272","5","38.7","0.0","0.0","0.0","0.0","0.0","0.0","0.0"], - ["2500","1264","5","38.6","0.0","0.0","0.0","0.0","0.0","0.0","0.0"], - ["2550","1256","5","38.5","0.0","0.0","0.0","0.0","0.0","0.0","0.0"], - ["2600","1248","6","38.4","0.0","0.0","0.0","0.0","0.0","0.0","0.0"], - ["2650","1240","6","38.3","0.0","0.0","0.0","0.0","0.0","0.0","0.0"], - ["2700","1232","6","38.2","0.0","0.0","0.0","0.0","0.0","0.0","0.0"], - ["2750","1223","6","38.0","0.0","0.0","0.0","0.0","0.0","0.0","0.0"], - ["2800","1215","7","37.9","0.0","0.0","0.0","0.0","0.0","0.0","0.0"], - ["2850","1206","7","37.8","0.0","0.0","0.0","0.0","0.0","0.0","0.0"], - ["2900","1197","7","37.6","0.0","0.0","0.0","0.0","0.0","0.0","0.0"], - ["2950","1188","7","37.5","0.0","0.0","0.0","0.0","0.0","0.0","0.0"], - ["3000","1179","8","37.4","0.0","0.0","0.0","0.0","0.0","0.0","0.0"], - ["3050","1170","8","37.2","0.0","0.0","0.0","0.0","0.0","0.0","0.0"], - ["3100","1160","8","37.1","0.0","0.0","0.0","0.0","0.0","0.0","0.0"], - ["3150","1151","9","36.9","0.0","0.0","0.0","0.0","0.0","0.0","0.0"], - ["3200","1141","9","36.7","0.0","0.0","0.0","0.0","0.0","0.0","0.0"], - ["3250","1131","10","36.5","0.0","0.0","0.0","0.0","0.0","0.0","0.0"], - ["3300","1120","10","36.3","0.0","0.0","0.0","0.0","0.0","0.0","0.0"], - ["3350","1109","11","36.2","0.0","0.0","0.0","0.0","0.0","0.0","0.0"], - ["3400","1098","11","35.9","0.0","0.0","0.0","0.0","0.0","0.0","0.0"], - ["3450","1087","12","35.7","0.0","0.0","0.0","0.0","0.0","0.0","0.0"], - ["3500","1075","13","35.5","0.0","0.0","0.0","0.0","0.0","0.0","0.0"], - ["3550","1062","14","35.2","0.0","0.0","0.0","0.0","0.0","0.0","0.0"], - ["3600","1049","15","35.0","0.0","0.0","0.0","0.0","0.0","0.0","0.0"], - ["3650","1036","16","34.7","0.0","0.0","0.0","0.0","0.0","0.0","0.0"], - ["3700","1021","17","34.4","0.0","0.0","0.0","0.0","0.0","0.0","0.0"], - ["3750","1006","19","34.1","0.0","0.0","0.0","0.0","0.0","0.0","0.0"], - ["3800","990","21","33.7","0.0","0.0","0.0","0.0","0.0","0.0","0.0"], - ["3850","971","24","33.3","0.0","0.0","0.0","0.0","0.0","0.0","0.0"], - ["3900","952","27","32.8","0.0","0.0","0.0","0.0","0.0","0.0","0.0"], - ["3950","929","32","32.2","0.0","0.0","0.0","0.0","0.0","0.0","0.0"], - ["4000","900","40","31.5","0.0","0.0","0.0","0.0","0.0","0.0","0.0"], - ["4050","861","56","30.5","0.0","0.0","0.0","0.0","0.0","0.0","0.0"] + ["300","1563","0","0.5","0.0","0.0","0.0","0.0","0.0","0.0","0.0","-0.0"], + ["350","1556","1","0.5","0.0","0.0","0.0","0.0","0.0","0.0","0.0","-0.0"], + ["400","1550","1","0.5","0.0","0.0","0.0","0.0","0.0","0.0","0.0","0.0"], + ["450","1544","1","0.5","0.0","0.0","0.0","0.0","0.0","0.0","0.0","-0.0"], + ["500","1537","1","0.5","0.0","0.0","0.0","0.0","0.0","0.0","0.0","-0.0"], + ["550","1531","1","0.5","0.0","0.0","0.0","0.0","0.0","0.0","0.0","0.0"], + ["600","1525","1","0.5","0.0","0.0","0.0","0.0","0.0","0.0","0.0","-0.0"], + ["650","1519","1","0.5","0.0","0.0","0.0","0.0","0.0","0.0","0.0","-0.0"], + ["700","1512","1","0.5","0.0","0.0","0.0","0.0","0.0","0.0","0.0","-0.0"], + ["750","1506","1","0.5","0.0","0.0","0.0","0.0","0.0","0.0","0.0","0.0"], + ["800","1499","1","0.5","0.0","0.0","0.0","0.0","0.0","0.0","0.0","-0.0"], + ["850","1493","1","0.5","0.0","0.0","0.0","0.0","0.0","0.0","0.0","0.0"], + ["900","1487","1","0.5","0.0","0.0","0.0","0.0","0.0","0.0","0.0","0.0"], + ["950","1480","1","0.5","0.0","0.0","0.0","0.0","0.0","0.0","0.0","0.0"], + ["1000","1474","2","0.5","0.0","0.0","0.0","0.0","0.0","0.0","0.0","0.0"], + ["1050","1467","2","0.5","0.0","0.0","0.0","0.0","0.0","0.0","0.0","0.0"], + ["1100","1461","2","0.5","0.0","0.0","0.0","0.0","0.0","0.0","0.0","-0.0"], + ["1150","1454","2","0.5","0.0","0.0","0.0","0.0","0.0","0.0","0.0","-0.0"], + ["1200","1448","2","0.5","0.0","0.0","0.0","0.0","0.0","0.0","0.0","0.0"], + ["1250","1441","2","0.5","0.0","0.0","0.0","0.0","0.0","0.0","0.0","0.0"], + ["1300","1435","2","0.5","0.0","0.0","0.0","0.0","0.0","0.0","0.0","-0.0"], + ["1350","1428","2","0.5","0.0","0.0","0.0","0.0","0.0","0.0","0.0","-0.0"], + ["1400","1422","2","0.5","0.0","0.0","0.0","0.0","0.0","0.0","0.0","-0.0"], + ["1450","1415","2","0.5","0.0","0.0","0.0","0.0","0.0","0.0","0.0","0.0"], + ["1500","1408","2","0.5","0.0","0.0","0.0","0.0","0.0","0.0","0.0","0.0"], + ["1550","1402","3","0.5","0.0","0.0","0.0","0.0","0.0","0.0","0.0","-0.0"], + ["1600","1395","3","0.5","0.0","0.0","0.0","0.0","0.0","0.0","0.0","-0.0"], + ["1650","1388","3","0.5","0.0","0.0","0.0","0.0","0.0","0.0","0.0","-0.0"], + ["1700","1381","3","0.5","0.0","0.0","0.0","0.0","0.0","0.0","0.0","0.0"], + ["1750","1374","3","0.5","0.0","0.0","0.0","0.0","0.0","0.0","0.0","0.0"], + ["1800","1367","3","0.5","0.0","0.0","0.0","0.0","0.0","0.0","0.0","0.0"], + ["1850","1360","3","0.5","0.0","0.0","0.0","0.0","0.0","0.0","0.0","0.0"], + ["1900","1353","3","0.5","0.0","0.0","0.0","0.0","0.0","0.0","0.0","0.0"], + ["1950","1346","4","0.5","0.0","0.0","0.0","0.0","0.0","0.0","0.0","0.0"], + ["2000","1339","4","0.5","0.0","0.0","0.0","0.0","0.0","0.0","0.0","0.0"], + ["2050","1332","4","0.5","0.0","0.0","0.0","0.0","0.0","0.0","0.0","0.0"], + ["2100","1325","4","0.6","0.0","0.0","0.0","0.0","0.0","0.0","0.0","-0.0"], + ["2150","1317","4","0.6","0.0","0.0","0.0","0.0","0.0","0.0","0.0","-0.0"], + ["2200","1310","4","0.6","0.0","0.0","0.0","0.0","0.0","0.0","0.0","0.0"], + ["2250","1302","4","0.6","0.0","0.0","0.0","0.0","0.0","0.0","0.0","-0.0"], + ["2300","1295","5","0.6","0.0","0.0","0.0","0.0","0.0","0.0","0.0","-0.0"], + ["2350","1287","5","0.6","0.0","0.0","0.0","0.0","0.0","0.0","0.0","-0.0"], + ["2400","1280","5","0.6","0.0","0.0","0.0","0.0","0.0","0.0","0.0","0.0"], + ["2450","1272","5","0.6","0.0","0.0","0.0","0.0","0.0","0.0","0.0","0.0"], + ["2500","1264","5","0.6","0.0","0.0","0.0","0.0","0.0","0.0","0.0","0.0"], + ["2550","1256","5","0.6","0.0","0.0","0.0","0.0","0.0","0.0","0.0","-0.0"], + ["2600","1248","6","0.6","0.0","0.0","0.0","0.0","0.0","0.0","0.0","-0.0"], + ["2650","1240","6","0.6","0.0","0.0","0.0","0.0","0.0","0.0","0.0","0.0"], + ["2700","1232","6","0.6","0.0","0.0","0.0","0.0","0.0","0.0","0.0","0.0"], + ["2750","1223","6","0.6","0.0","0.0","0.0","0.0","0.0","0.0","0.0","-0.0"], + ["2800","1215","7","0.6","0.0","0.0","0.0","0.0","0.0","0.0","0.0","0.0"], + ["2850","1206","7","0.6","0.0","0.0","0.0","0.0","0.0","0.0","0.0","-0.0"], + ["2900","1197","7","0.6","0.0","0.0","0.0","0.0","0.0","0.0","0.0","-0.0"], + ["2950","1188","7","0.7","0.0","0.0","0.0","0.0","0.0","0.0","0.0","0.0"], + ["3000","1179","8","0.7","0.0","0.0","0.0","0.0","0.0","0.0","0.0","-0.0"], + ["3050","1170","8","0.7","0.0","0.0","0.0","0.0","0.0","0.0","0.0","0.0"], + ["3100","1160","8","0.7","0.0","0.0","0.0","0.0","0.0","0.0","0.0","-0.0"], + ["3150","1151","9","0.7","0.0","0.0","0.0","0.0","0.0","0.0","0.0","0.0"], + ["3200","1141","9","0.7","0.0","0.0","0.0","0.0","0.0","0.0","0.0","-0.0"], + ["3250","1131","10","0.7","0.0","0.0","0.0","0.0","0.0","0.0","0.0","0.0"], + ["3300","1120","10","0.7","0.0","0.0","0.0","0.0","0.0","0.0","0.0","0.0"], + ["3350","1109","11","0.8","0.0","0.0","0.0","0.0","0.0","0.0","0.0","0.0"], + ["3400","1098","11","0.8","0.0","0.0","0.0","0.0","0.0","0.0","0.0","-0.0"], + ["3450","1087","12","0.8","0.0","0.0","0.0","0.0","0.0","0.0","0.0","-0.0"], + ["3500","1075","13","0.8","0.0","0.0","0.0","0.0","0.0","0.0","0.0","-0.0"], + ["3550","1062","14","0.8","0.0","0.0","0.0","0.0","0.0","0.0","0.0","-0.0"], + ["3600","1049","15","0.9","0.0","0.0","0.0","0.0","0.0","0.0","0.0","0.0"], + ["3650","1036","16","0.9","0.0","0.0","0.0","0.0","0.0","0.0","0.0","-0.0"], + ["3700","1021","17","0.9","0.0","0.0","0.0","0.0","0.0","0.0","0.0","0.0"], + ["3750","1006","19","1.0","0.0","0.0","0.0","0.0","0.0","0.0","0.0","0.0"], + ["3800","990","21","1.1","0.0","0.0","0.0","0.0","0.0","0.0","0.0","0.0"], + ["3850","971","24","1.1","0.0","0.0","0.0","0.0","0.0","0.0","0.0","-0.0"], + ["3900","952","27","1.2","0.0","0.0","0.0","0.0","0.0","0.0","0.0","0.0"], + ["3950","929","32","1.4","0.0","0.0","0.0","0.0","0.0","0.0","0.0","0.0"], + ["4000","900","40","1.6","0.0","0.0","0.0","0.0","0.0","0.0","0.0","-0.0"], + ["4050","861","56","2.1","0.0","0.0","0.0","0.0","0.0","0.0","0.0","0.0"] ] }; default { From 94400f2b16a7797534d1fdae0ef5fcf4cb2b0908 Mon Sep 17 00:00:00 2001 From: Felix Wiegand Date: Sat, 25 Apr 2015 19:56:42 +0200 Subject: [PATCH 22/22] Change year in LICENSE --- LICENSE | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/LICENSE b/LICENSE index 0f013a10b9..b76b90e8fb 100644 --- a/LICENSE +++ b/LICENSE @@ -1,4 +1,4 @@ -Copyright (C) 2014 Felix "KoffeinFlummi" Wiegand +Copyright (C) 2015 Felix "KoffeinFlummi" Wiegand This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by