diff --git a/addons/kestrel/$PBOPREFIX$ b/addons/kestrel/$PBOPREFIX$
deleted file mode 100644
index ca3fac2e96..0000000000
--- a/addons/kestrel/$PBOPREFIX$
+++ /dev/null
@@ -1 +0,0 @@
-z\ace\addons\kestrel
\ No newline at end of file
diff --git a/addons/kestrel/CfgEventHandlers.hpp b/addons/kestrel/CfgEventHandlers.hpp
deleted file mode 100644
index f0a9f14d91..0000000000
--- a/addons/kestrel/CfgEventHandlers.hpp
+++ /dev/null
@@ -1,6 +0,0 @@
-
-class Extended_PreInit_EventHandlers {
- class ADDON {
- init = QUOTE(call COMPILE_FILE(XEH_preInit));
- };
-};
diff --git a/addons/kestrel/CfgVehicles.hpp b/addons/kestrel/CfgVehicles.hpp
deleted file mode 100644
index 31aea38bda..0000000000
--- a/addons/kestrel/CfgVehicles.hpp
+++ /dev/null
@@ -1,47 +0,0 @@
-class CfgVehicles {
- class Man;
- class CAManBase: Man {
- class ACE_SelfActions {
- class ACE_OpenKestrel {
- displayName = "$STR_ACE_Wind_OpenKestrel";
- condition = QUOTE('ACE_Kestrel' in items _player && {!GVAR(isKestrel)});
- statement = QUOTE(call FUNC(openKestrel));
- showDisabled = 0;
- priority = 2;
- icon = PATHTOF(data\4500NV1.paa);
- hotkey = "K";
- };
- class ACE_CloseKestrel {
- displayName = "$STR_ACE_Wind_CloseKestrel";
- condition = QUOTE(GVAR(isKestrel));
- statement = QUOTE(call FUNC(closeKestrel));
- showDisabled = 0;
- priority = 2;
- icon = PATHTOF(data\4500NV1.paa);
- hotkey = "K";
- };
- };
- };
-
- class Item_Base_F;
- class ACE_Item_Kestrel: Item_Base_F {
- author = "$STR_ACE_Common_ACETeam";
- scope = 2;
- scopeCurator = 2;
- displayName = "$STR_ACE_Kestrel_Name";
- vehicleClass = "Items";
- class TransportItems {
- class ACE_Kestrel {
- name = "ACE_Kestrel";
- count = 1;
- };
- };
- };
-
- class Box_NATO_Support_F;
- class ACE_Box_Misc: Box_NATO_Support_F {
- class TransportItems {
- MACRO_ADDITEM(ACE_Kestrel,6);
- };
- };
-};
diff --git a/addons/kestrel/README.md b/addons/kestrel/README.md
deleted file mode 100644
index f5b91783c1..0000000000
--- a/addons/kestrel/README.md
+++ /dev/null
@@ -1,12 +0,0 @@
-ace_kestrel
-===========
-
-Adds the Kestrel weather and wind meter.
-
-
-## Maintainers
-
-The people responsible for merging changes to this component or answering potential questions.
-
-- [KoffeinFlummi](https://github.com/KoffeinFlummi)
-- [commy2](https://github.com/commy2)
diff --git a/addons/kestrel/RscTitles.hpp b/addons/kestrel/RscTitles.hpp
deleted file mode 100644
index 2530dbcda7..0000000000
--- a/addons/kestrel/RscTitles.hpp
+++ /dev/null
@@ -1,125 +0,0 @@
-
-class RscPicture;
-class RscText;
-
-class RscTitles {
- class ACE_Kestrel {
- onload = QUOTE(_this call FUNC(onLoadKestrel));
- //onunload = "";
- idd = -1;
- movingEnable = 0;
- enableDisplay = 1;
- duration = 1e+011;
- fadein = 0;
- fadeout = 0;
- enablesimulation = 1;
-
- class controls {
- // has to be first to be in the background
- class Wheel: RscPicture {
- idc = 3;
- type = 0;
- style = "48 + 0x800";
- text = "";
- x = "safeZoneX + 0.07";
- y = "safeZoneY + safeZoneH - 0.76";
- h = "0.15";
- w = "0.15";
- };
-
- class Kestrel1: RscPicture {
- idc = 1;
- text = PATHTOF(data\4500NV1.paa);
- style = "48 + 0x800";
- x = "safeZoneX - 0.25";
- y = "safeZoneY + safeZoneH - 0.8";
- h = "0.75";
- w = "0.75";
- };
- class Kestrel2: Kestrel1 {
- idc = 2;
- text = PATHTOF(data\4500NV2.paa);
- colorText[] = {0,0,0,1-(sunOrMoon*sunOrMoon+(moonIntensity/5))};
- };
-
- class HUD1: RscText {
- idc = 11;
- type = 0;
- style = 1;
- text = "";
- x = "safeZoneX + 0.08";
- y = "safeZoneY + safeZoneH - 0.51";
- h = "0.09";
- w = "0.108";
- shadow = 0;
- font = "PuristaMedium";
- sizeEx = 0.04;
- colorText[] = {0.0745,0.2196,0.1216,0.7};
- colorBackground[] = {0,0,0,0};
- lineSpacing = 1;
- };
- class HUD2: HUD1 {
- idc = 12;
- y = "safeZoneY + safeZoneH - 0.48";
- };
- class HUD3: HUD1 {
- idc = 13;
- y = "safeZoneY + safeZoneH - 0.45";
- };
- class HUD4: HUD1 {
- idc = 14;
- y = "safeZoneY + safeZoneH - 0.418";
- };
- };
- };
-
- // helper class to prevent flickering. Used together with preloadTitleRsc command.
- class ACE_Kestrel_Preload {
- idd = -1;
- movingEnable = 0;
- duration = 1e+011;
- fadein = 0;
- fadeout = 0;
- class controls {
- class Preload_0: RscPicture {
- text = PATHTOF(data\kestrel_0.paa);
- };
- class Preload_1: Preload_0 {
- text = PATHTOF(data\kestrel_1.paa);
- };
- class Preload_2: Preload_0 {
- text = PATHTOF(data\kestrel_2.paa);
- };
- class Preload_3: Preload_0 {
- text = PATHTOF(data\kestrel_3.paa);
- };
- class Preload_4: Preload_0 {
- text = PATHTOF(data\kestrel_4.paa);
- };
- class Preload_5: Preload_0 {
- text = PATHTOF(data\kestrel_5.paa);
- };
- class Preload_6: Preload_0 {
- text = PATHTOF(data\kestrel_6.paa);
- };
- class Preload_7: Preload_0 {
- text = PATHTOF(data\kestrel_7.paa);
- };
- class Preload_8: Preload_0 {
- text = PATHTOF(data\kestrel_8.paa);
- };
- class Preload_9: Preload_0 {
- text = PATHTOF(data\kestrel_9.paa);
- };
- /*class Preload_A: Preload_0 {
- text = PATHTOF(data\4500NV.paa);
- };
- class Preload_B: Preload_0 {
- text = PATHTOF(data\4500NV1.paa);
- };
- class Preload_C: Preload_0 {
- text = PATHTOF(data\4500NV2.paa);
- };*/
- };
- };
-};
diff --git a/addons/kestrel/XEH_preInit.sqf b/addons/kestrel/XEH_preInit.sqf
deleted file mode 100644
index 09d9b1a0ef..0000000000
--- a/addons/kestrel/XEH_preInit.sqf
+++ /dev/null
@@ -1,11 +0,0 @@
-#include "script_component.hpp"
-
-ADDON = false;
-
-PREP(onLoadKestrel);
-PREP(openKestrel);
-PREP(closeKestrel);
-
-GVAR(isKestrel) = false;
-
-ADDON = true;
diff --git a/addons/kestrel/config.cpp b/addons/kestrel/config.cpp
deleted file mode 100644
index bece90dd8d..0000000000
--- a/addons/kestrel/config.cpp
+++ /dev/null
@@ -1,18 +0,0 @@
-#include "script_component.hpp"
-
-class CfgPatches {
- class ADDON {
- units[] = {"ACE_Item_Kestrel"};
- weapons[] = {"ACE_Kestrel"};
- requiredVersion = REQUIRED_VERSION;
- requiredAddons[] = {"ace_interaction"};
- author[] = {"Falke","commy2","KoffeinFlummi","esteldunedain"};
- authorUrl = "https://github.com/KoffeinFlummi/";
- VERSION_CONFIG;
- };
-};
-
-#include "CfgEventHandlers.hpp"
-#include "CfgVehicles.hpp"
-#include "CfgWeapons.hpp"
-#include "RscTitles.hpp"
diff --git a/addons/kestrel/data/4500NV.paa b/addons/kestrel/data/4500NV.paa
deleted file mode 100644
index fd72433b9e..0000000000
Binary files a/addons/kestrel/data/4500NV.paa and /dev/null differ
diff --git a/addons/kestrel/data/4500NV1.paa b/addons/kestrel/data/4500NV1.paa
deleted file mode 100644
index 9a29b346fb..0000000000
Binary files a/addons/kestrel/data/4500NV1.paa and /dev/null differ
diff --git a/addons/kestrel/data/4500NV2.paa b/addons/kestrel/data/4500NV2.paa
deleted file mode 100644
index 992743a3a6..0000000000
Binary files a/addons/kestrel/data/4500NV2.paa and /dev/null differ
diff --git a/addons/kestrel/data/body.paa b/addons/kestrel/data/body.paa
deleted file mode 100644
index bec55bb418..0000000000
Binary files a/addons/kestrel/data/body.paa and /dev/null differ
diff --git a/addons/kestrel/data/kestrel_0.paa b/addons/kestrel/data/kestrel_0.paa
deleted file mode 100644
index 190c25f100..0000000000
Binary files a/addons/kestrel/data/kestrel_0.paa and /dev/null differ
diff --git a/addons/kestrel/data/kestrel_1.paa b/addons/kestrel/data/kestrel_1.paa
deleted file mode 100644
index fe757888e4..0000000000
Binary files a/addons/kestrel/data/kestrel_1.paa and /dev/null differ
diff --git a/addons/kestrel/data/kestrel_2.paa b/addons/kestrel/data/kestrel_2.paa
deleted file mode 100644
index 1b0fda0a65..0000000000
Binary files a/addons/kestrel/data/kestrel_2.paa and /dev/null differ
diff --git a/addons/kestrel/data/kestrel_3.paa b/addons/kestrel/data/kestrel_3.paa
deleted file mode 100644
index 659f4597a3..0000000000
Binary files a/addons/kestrel/data/kestrel_3.paa and /dev/null differ
diff --git a/addons/kestrel/data/kestrel_4.paa b/addons/kestrel/data/kestrel_4.paa
deleted file mode 100644
index abb1ed6580..0000000000
Binary files a/addons/kestrel/data/kestrel_4.paa and /dev/null differ
diff --git a/addons/kestrel/data/kestrel_5.paa b/addons/kestrel/data/kestrel_5.paa
deleted file mode 100644
index 800ed80d8b..0000000000
Binary files a/addons/kestrel/data/kestrel_5.paa and /dev/null differ
diff --git a/addons/kestrel/data/kestrel_6.paa b/addons/kestrel/data/kestrel_6.paa
deleted file mode 100644
index 784e441c21..0000000000
Binary files a/addons/kestrel/data/kestrel_6.paa and /dev/null differ
diff --git a/addons/kestrel/data/kestrel_7.paa b/addons/kestrel/data/kestrel_7.paa
deleted file mode 100644
index 9452286c2d..0000000000
Binary files a/addons/kestrel/data/kestrel_7.paa and /dev/null differ
diff --git a/addons/kestrel/data/kestrel_8.paa b/addons/kestrel/data/kestrel_8.paa
deleted file mode 100644
index 31fe71ce84..0000000000
Binary files a/addons/kestrel/data/kestrel_8.paa and /dev/null differ
diff --git a/addons/kestrel/data/kestrel_9.paa b/addons/kestrel/data/kestrel_9.paa
deleted file mode 100644
index 978506ef5d..0000000000
Binary files a/addons/kestrel/data/kestrel_9.paa and /dev/null differ
diff --git a/addons/kestrel/functions/fnc_closeKestrel.sqf b/addons/kestrel/functions/fnc_closeKestrel.sqf
deleted file mode 100644
index cfec327da6..0000000000
--- a/addons/kestrel/functions/fnc_closeKestrel.sqf
+++ /dev/null
@@ -1,6 +0,0 @@
-// by commy2
-#include "script_component.hpp"
-
-GVAR(isKestrel) = false;
-
-(["ACE_Kestrel"] call BIS_fnc_rscLayer) cutText ["", "PLAIN", 0, false];
diff --git a/addons/kestrel/functions/fnc_onLoadKestrel.sqf b/addons/kestrel/functions/fnc_onLoadKestrel.sqf
deleted file mode 100644
index cdfc325698..0000000000
--- a/addons/kestrel/functions/fnc_onLoadKestrel.sqf
+++ /dev/null
@@ -1,156 +0,0 @@
-// by Falke, commy2
-#include "script_component.hpp"
-
-GVAR(windHead) = 0;
-GVAR(wheelState) = 1;
-
-[{
-
- // exit loop
- if (!GVAR(isKestrel) || {!("ACE_Kestrel" in items ACE_player)}) exitWith {
- call FUNC(closeKestrel);
-
- [_this select 1] call CBA_fnc_removePerFrameHandler;
- };
-
- // get controls
- private ["_dlgKestrel", "_ctrlKestrel1", "_ctrlKestrelWheel", "_ctrlKestrel2", "_ctrlHUD1", "_ctrlHUD2", "_ctrlHUD3", "_ctrlHUD4"];
-
- disableSerialization;
- _dlgKestrel = _this select 0;
- _ctrlKestrel1 = _dlgKestrel displayCtrl 1;
- _ctrlKestrel2 = _dlgKestrel displayCtrl 2;
- _ctrlKestrelWheel = _dlgKestrel displayCtrl 3;
- _ctrlHUD1 = _dlgKestrel displayCtrl 11;
- _ctrlHUD2 = _dlgKestrel displayCtrl 12;
- _ctrlHUD3 = _dlgKestrel displayCtrl 13;
- _ctrlHUD4 = _dlgKestrel displayCtrl 14;
-
- // don't show the kestrel in gunner view
- private "_show";
- _show = cameraView != "GUNNER";
-
- _ctrlKestrel1 ctrlShow _show;
- _ctrlKestrel2 ctrlShow _show;
- _ctrlKestrelWheel ctrlShow _show;
- _ctrlHUD1 ctrlShow _show;
- _ctrlHUD2 ctrlShow _show;
- _ctrlHUD3 ctrlShow _show;
- _ctrlHUD4 ctrlShow _show;
-
- if !(_show) exitWith {};
-
- // handle shown values
- private ["_position", "_directon", "_windC", "_windD", "_windR", "_windB", "_windA"];
-
- _position = eyePos ACE_player;
- _directon = direction ACE_player;
-
- _windC = sqrt ((wind select 0) ^ 2 + (wind select 1) ^ 2);
- _windD = (wind select 0) atan2 (wind select 1);
-
- _windR = _directon - _windD;
-
- if (_windR < 0) then {
- _windR = _windR + 360;
- };
-
- _windB = _windC * sin _windR;
- _windA = sqrt (_windC ^ 2 - _windB ^ 2);
-
- if (_windR < 90) then {
- _windA = _windA - 2 * _windA;
- };
-
- if (_windR > 270) then {
- _windA = _windA - 2 * _windA;
- };
-
- // in building
- _intersects = 0;
- if (lineIntersects [_position, _position vectorAdd [0, 0, 15]]) then {_intersects = _intersects + 1};
-
- if (lineIntersects [_position, _position vectorAdd [- 15 * sin windDir, - 15 * cos windDir, 0]]) then {_intersects = _intersects + 1};
- if (lineIntersects [_position, _position vectorAdd [- 15 * sin (windDir - 90), - 15 * cos (windDir - 90), 0]]) then {_intersects = _intersects + 1};
- if (lineIntersects [_position, _position vectorAdd [- 15 * sin (windDir + 90), - 15 * cos (windDir + 90), 0]]) then {_intersects = _intersects + 1};
- if (lineIntersects [_position, _position vectorAdd [- 15 * sin (windDir + 180), - 15 * cos (windDir + 180), 0]]) then {_intersects = _intersects + 1};
-
- if (_intersects > 3) then {
- _windA = 99.99;
- _windB = 99.99;
- };
-
- // in wind direction
- _intersects = 0;
- if (lineIntersects [_position, _position vectorAdd [- 5 * sin windDir, - 5 * cos windDir, 0]]) then {_intersects = _intersects + 1};
- if (lineIntersects [_position, _position vectorAdd [- 5 * sin (windDir - 15), - 5 * cos (windDir - 15), 0]]) then {_intersects = _intersects + 1};
- if (lineIntersects [_position, _position vectorAdd [- 5 * sin (windDir + 15), - 5 * cos (windDir + 15), 0]]) then {_intersects = _intersects + 1};
-
- if (_intersects > 2) then {
- _windA = 99.99;
- _windB = 99.99;
- };
-
- if (ACE_player != vehicle ACE_player) then {
- _windA = 99.99;
- _windB = 99.99;
- };
-
- if (_windA == 99.99) then {
-
- GVAR(windHead) = 0;
-
- _windA = "0.00";
- _windB = "0.00";
-
- } else {
-
- GVAR(windHead) = _windA;
-
- if (_windA < 0) then {
- _windA = format ["-%1", [-1 * _windA, 1, 2] call CBA_fnc_formatNumber];
- } else {
- _windA = format [ "%1", [ _windA, 1, 2] call CBA_fnc_formatNumber];
- };
-
- if (_windB < 0) then {
- _windB = format ["-%1", [-1 * _windB, 1, 2] call CBA_fnc_formatNumber];
- } else {
- _windB = format [ "%1", [ _windB, 1, 2] call CBA_fnc_formatNumber];
- };
-
- };
-
- _directon = round _directon;
- if (_directon == 360) then {_directon = 0};
-
- _ctrlHUD1 ctrlSetText _windA;
- _ctrlHUD2 ctrlSetText _windB;
- _ctrlHUD3 ctrlSetText str _directon;
- _ctrlHUD4 ctrlSetText str ((round (EGVAR(weather,currentTemperature) * 10)) / 10);
-
- // adjust kestrel picture in the dark
- private "_brightness";
- _brightness = call EFUNC(common,ambientBrightness);
-
- _ctrlKestrel2 ctrlSetTextColor [0, 0, 0, 1 - _brightness];
-
- // handle wheel
- private ["_wheelState", "_wheelStateAdd"];
-
- _wheelState = GVAR(wheelState);
- _wheelStateAdd = ((round GVAR(windHead) * 2) min 5) max -5;
-
- _wheelState = _wheelState + _wheelStateAdd;
-
- if (_wheelState < 0) then {_wheelState = _wheelState + 9};
- if (_wheelState > 9) then {_wheelState = _wheelState - 9};
-
- GVAR(wheelState) = _wheelState;
-
- if (preloadTitleRsc ["ACE_Kestrel_Preload", "PLAIN"]) then {
- _ctrlKestrelWheel ctrlSetText format [QUOTE(PATHTOF(data\kestrel_%1.paa)), _wheelState];
- _ctrlKestrelWheel ctrlSetTextColor [_brightness, _brightness, _brightness, 1];
- };
-
-}, 0.01, _this select 0] call CBA_fnc_addPerFrameHandler;
diff --git a/addons/kestrel/functions/fnc_openKestrel.sqf b/addons/kestrel/functions/fnc_openKestrel.sqf
deleted file mode 100644
index 25ec9eba67..0000000000
--- a/addons/kestrel/functions/fnc_openKestrel.sqf
+++ /dev/null
@@ -1,6 +0,0 @@
-// by commy2
-#include "script_component.hpp"
-
-GVAR(isKestrel) = true;
-
-(["ACE_Kestrel"] call BIS_fnc_rscLayer) cutRsc ["ACE_Kestrel", "PLAIN", 0, false];
diff --git a/addons/kestrel/functions/script_component.hpp b/addons/kestrel/functions/script_component.hpp
deleted file mode 100644
index 528b26affc..0000000000
--- a/addons/kestrel/functions/script_component.hpp
+++ /dev/null
@@ -1 +0,0 @@
-#include "\z\ace\addons\kestrel\script_component.hpp"
\ No newline at end of file
diff --git a/addons/kestrel/kestrel4500.p3d b/addons/kestrel/kestrel4500.p3d
deleted file mode 100644
index 43cb6ce9d5..0000000000
Binary files a/addons/kestrel/kestrel4500.p3d and /dev/null differ
diff --git a/addons/kestrel/kestrel4500rad.p3d b/addons/kestrel/kestrel4500rad.p3d
deleted file mode 100644
index 7b2b62ccf5..0000000000
Binary files a/addons/kestrel/kestrel4500rad.p3d and /dev/null differ
diff --git a/addons/kestrel/script_component.hpp b/addons/kestrel/script_component.hpp
deleted file mode 100644
index a38231c511..0000000000
--- a/addons/kestrel/script_component.hpp
+++ /dev/null
@@ -1,12 +0,0 @@
-#define COMPONENT kestrel
-#include "\z\ace\addons\main\script_mod.hpp"
-
-#ifdef DEBUG_ENABLED_KESTREL
- #define DEBUG_MODE_FULL
-#endif
-
-#ifdef DEBUG_ENABLED_KESTREL
- #define DEBUG_SETTINGS DEBUG_ENABLED_KESTREL
-#endif
-
-#include "\z\ace\addons\main\script_macros.hpp"
\ No newline at end of file
diff --git a/addons/kestrel/stringtable.xml b/addons/kestrel/stringtable.xml
deleted file mode 100644
index c811633f75..0000000000
--- a/addons/kestrel/stringtable.xml
+++ /dev/null
@@ -1,63 +0,0 @@
-
-
-
-
- Approximate Temperature
- Ungefähre Temperatur
- Temperatura aproximada
- Estimer la température
- Przybliżona temperatura
- Odhadovaná teplota
- Hőmérséklet nagyábol
- Примерная температура
-
-
- Kestrel 4500NV
- Kestrel 4500NV
- Kestrel 4500NV
- Kestrel 4500NV
- Kestrel 4500NV
- Kestrel 4500NV
- Kestrel 4500NV
- Kestrel 4500NV
- Kestrel 4500NV
- Kestrel 4500NV
-
-
- Applied Ballistics Meter
- Applied Ballistics Meter
- Anemómetro balístico
- Applied Ballistics Meter
- Urządzenie do monitorowania pogody
- Zařízení pro měření větru
- Monitoraggio Balistico Attivo
- Applied Ballistics Meter
- Medidor Balístico Ativo
- Метеостанция
-
-
- Open Kestrel
- Kestrel öffnen
- Abrir Kestrel
- Ouvrir Kestrel
- Otwórz Kestrel
- Otevřít Kestrel
- Abrir Kestrel
- Apri Kestrel
- Kestrel bekapcsolása
- Открыть Kestrel
-
-
- Close Kestrel
- Kestrel schließen
- Cerrar Kestrel
- Fermer Kestrel
- Zamknij Kestrel
- Zavřít Kestrel
- Fechar Kestrel
- Chiudi Kestrel
- Kestrel kikapcsolása
- Закрыть Kestrel
-
-
-
diff --git a/addons/kestrel/ui/WindLight-01.paa b/addons/kestrel/ui/WindLight-01.paa
deleted file mode 100644
index 9865029c93..0000000000
Binary files a/addons/kestrel/ui/WindLight-01.paa and /dev/null differ
diff --git a/addons/kestrel/ui/WindLight-02.paa b/addons/kestrel/ui/WindLight-02.paa
deleted file mode 100644
index a02147e6ee..0000000000
Binary files a/addons/kestrel/ui/WindLight-02.paa and /dev/null differ
diff --git a/addons/kestrel/ui/WindLight-03.paa b/addons/kestrel/ui/WindLight-03.paa
deleted file mode 100644
index 340cfdcd6e..0000000000
Binary files a/addons/kestrel/ui/WindLight-03.paa and /dev/null differ
diff --git a/addons/kestrel/ui/WindLight-04.paa b/addons/kestrel/ui/WindLight-04.paa
deleted file mode 100644
index 6d8404fb86..0000000000
Binary files a/addons/kestrel/ui/WindLight-04.paa and /dev/null differ
diff --git a/addons/kestrel/ui/WindLight-05.paa b/addons/kestrel/ui/WindLight-05.paa
deleted file mode 100644
index 2de5cdbd74..0000000000
Binary files a/addons/kestrel/ui/WindLight-05.paa and /dev/null differ
diff --git a/addons/kestrel/ui/WindLight-06.paa b/addons/kestrel/ui/WindLight-06.paa
deleted file mode 100644
index c5e0a40af7..0000000000
Binary files a/addons/kestrel/ui/WindLight-06.paa and /dev/null differ
diff --git a/addons/kestrel/ui/WindLight-07.paa b/addons/kestrel/ui/WindLight-07.paa
deleted file mode 100644
index 4df57f7585..0000000000
Binary files a/addons/kestrel/ui/WindLight-07.paa and /dev/null differ
diff --git a/addons/kestrel/ui/WindLight-08.paa b/addons/kestrel/ui/WindLight-08.paa
deleted file mode 100644
index 8c5012502f..0000000000
Binary files a/addons/kestrel/ui/WindLight-08.paa and /dev/null differ
diff --git a/addons/kestrel/ui/WindLight-09.paa b/addons/kestrel/ui/WindLight-09.paa
deleted file mode 100644
index 15173a56ab..0000000000
Binary files a/addons/kestrel/ui/WindLight-09.paa and /dev/null differ
diff --git a/addons/kestrel/ui/WindLight-10.paa b/addons/kestrel/ui/WindLight-10.paa
deleted file mode 100644
index 83c860cecb..0000000000
Binary files a/addons/kestrel/ui/WindLight-10.paa and /dev/null differ
diff --git a/addons/kestrel/ui/WindLight-11.paa b/addons/kestrel/ui/WindLight-11.paa
deleted file mode 100644
index 8beeb80d98..0000000000
Binary files a/addons/kestrel/ui/WindLight-11.paa and /dev/null differ
diff --git a/addons/kestrel/ui/WindLight-12.paa b/addons/kestrel/ui/WindLight-12.paa
deleted file mode 100644
index d9a62f9e81..0000000000
Binary files a/addons/kestrel/ui/WindLight-12.paa and /dev/null differ
diff --git a/addons/kestrel/ui/WindLight-13.paa b/addons/kestrel/ui/WindLight-13.paa
deleted file mode 100644
index 87a8dfcca9..0000000000
Binary files a/addons/kestrel/ui/WindLight-13.paa and /dev/null differ
diff --git a/addons/kestrel/ui/WindLight-14.paa b/addons/kestrel/ui/WindLight-14.paa
deleted file mode 100644
index f9200aaf2d..0000000000
Binary files a/addons/kestrel/ui/WindLight-14.paa and /dev/null differ
diff --git a/addons/kestrel/ui/WindLight-15.paa b/addons/kestrel/ui/WindLight-15.paa
deleted file mode 100644
index e3ee52d21e..0000000000
Binary files a/addons/kestrel/ui/WindLight-15.paa and /dev/null differ
diff --git a/addons/kestrel/ui/WindLight-16.paa b/addons/kestrel/ui/WindLight-16.paa
deleted file mode 100644
index 9b835e62c4..0000000000
Binary files a/addons/kestrel/ui/WindLight-16.paa and /dev/null differ
diff --git a/addons/kestrel/ui/WindModerate-01.paa b/addons/kestrel/ui/WindModerate-01.paa
deleted file mode 100644
index fd4d255c35..0000000000
Binary files a/addons/kestrel/ui/WindModerate-01.paa and /dev/null differ
diff --git a/addons/kestrel/ui/WindModerate-02.paa b/addons/kestrel/ui/WindModerate-02.paa
deleted file mode 100644
index db6e8dcebc..0000000000
Binary files a/addons/kestrel/ui/WindModerate-02.paa and /dev/null differ
diff --git a/addons/kestrel/ui/WindModerate-03.paa b/addons/kestrel/ui/WindModerate-03.paa
deleted file mode 100644
index 300934ff37..0000000000
Binary files a/addons/kestrel/ui/WindModerate-03.paa and /dev/null differ
diff --git a/addons/kestrel/ui/WindModerate-04.paa b/addons/kestrel/ui/WindModerate-04.paa
deleted file mode 100644
index f7b8331dae..0000000000
Binary files a/addons/kestrel/ui/WindModerate-04.paa and /dev/null differ
diff --git a/addons/kestrel/ui/WindModerate-05.paa b/addons/kestrel/ui/WindModerate-05.paa
deleted file mode 100644
index a3b0a532ff..0000000000
Binary files a/addons/kestrel/ui/WindModerate-05.paa and /dev/null differ
diff --git a/addons/kestrel/ui/WindModerate-06.paa b/addons/kestrel/ui/WindModerate-06.paa
deleted file mode 100644
index 495ec6bc15..0000000000
Binary files a/addons/kestrel/ui/WindModerate-06.paa and /dev/null differ
diff --git a/addons/kestrel/ui/WindModerate-07.paa b/addons/kestrel/ui/WindModerate-07.paa
deleted file mode 100644
index d0471a4c4f..0000000000
Binary files a/addons/kestrel/ui/WindModerate-07.paa and /dev/null differ
diff --git a/addons/kestrel/ui/WindModerate-08.paa b/addons/kestrel/ui/WindModerate-08.paa
deleted file mode 100644
index 967e9d8ef7..0000000000
Binary files a/addons/kestrel/ui/WindModerate-08.paa and /dev/null differ
diff --git a/addons/kestrel/ui/WindModerate-09.paa b/addons/kestrel/ui/WindModerate-09.paa
deleted file mode 100644
index 54ef3eabf9..0000000000
Binary files a/addons/kestrel/ui/WindModerate-09.paa and /dev/null differ
diff --git a/addons/kestrel/ui/WindModerate-10.paa b/addons/kestrel/ui/WindModerate-10.paa
deleted file mode 100644
index e7608c2e02..0000000000
Binary files a/addons/kestrel/ui/WindModerate-10.paa and /dev/null differ
diff --git a/addons/kestrel/ui/WindModerate-11.paa b/addons/kestrel/ui/WindModerate-11.paa
deleted file mode 100644
index 6d1ce9418e..0000000000
Binary files a/addons/kestrel/ui/WindModerate-11.paa and /dev/null differ
diff --git a/addons/kestrel/ui/WindModerate-12.paa b/addons/kestrel/ui/WindModerate-12.paa
deleted file mode 100644
index 2b853dca89..0000000000
Binary files a/addons/kestrel/ui/WindModerate-12.paa and /dev/null differ
diff --git a/addons/kestrel/ui/WindModerate-13.paa b/addons/kestrel/ui/WindModerate-13.paa
deleted file mode 100644
index 56443ab4f9..0000000000
Binary files a/addons/kestrel/ui/WindModerate-13.paa and /dev/null differ
diff --git a/addons/kestrel/ui/WindModerate-14.paa b/addons/kestrel/ui/WindModerate-14.paa
deleted file mode 100644
index 06cb4610fb..0000000000
Binary files a/addons/kestrel/ui/WindModerate-14.paa and /dev/null differ
diff --git a/addons/kestrel/ui/WindModerate-15.paa b/addons/kestrel/ui/WindModerate-15.paa
deleted file mode 100644
index 5f548b6ac9..0000000000
Binary files a/addons/kestrel/ui/WindModerate-15.paa and /dev/null differ
diff --git a/addons/kestrel/ui/WindModerate-16.paa b/addons/kestrel/ui/WindModerate-16.paa
deleted file mode 100644
index 617e83193d..0000000000
Binary files a/addons/kestrel/ui/WindModerate-16.paa and /dev/null differ
diff --git a/addons/kestrel/ui/WindStrong-01.paa b/addons/kestrel/ui/WindStrong-01.paa
deleted file mode 100644
index 87c2db663c..0000000000
Binary files a/addons/kestrel/ui/WindStrong-01.paa and /dev/null differ
diff --git a/addons/kestrel/ui/WindStrong-02.paa b/addons/kestrel/ui/WindStrong-02.paa
deleted file mode 100644
index 8d29483635..0000000000
Binary files a/addons/kestrel/ui/WindStrong-02.paa and /dev/null differ
diff --git a/addons/kestrel/ui/WindStrong-03.paa b/addons/kestrel/ui/WindStrong-03.paa
deleted file mode 100644
index fc08f14e1b..0000000000
Binary files a/addons/kestrel/ui/WindStrong-03.paa and /dev/null differ
diff --git a/addons/kestrel/ui/WindStrong-04.paa b/addons/kestrel/ui/WindStrong-04.paa
deleted file mode 100644
index 3fbbd70302..0000000000
Binary files a/addons/kestrel/ui/WindStrong-04.paa and /dev/null differ
diff --git a/addons/kestrel/ui/WindStrong-05.paa b/addons/kestrel/ui/WindStrong-05.paa
deleted file mode 100644
index 2254b0d545..0000000000
Binary files a/addons/kestrel/ui/WindStrong-05.paa and /dev/null differ
diff --git a/addons/kestrel/ui/WindStrong-06.paa b/addons/kestrel/ui/WindStrong-06.paa
deleted file mode 100644
index 6054696d61..0000000000
Binary files a/addons/kestrel/ui/WindStrong-06.paa and /dev/null differ
diff --git a/addons/kestrel/ui/WindStrong-07.paa b/addons/kestrel/ui/WindStrong-07.paa
deleted file mode 100644
index d62308dfc9..0000000000
Binary files a/addons/kestrel/ui/WindStrong-07.paa and /dev/null differ
diff --git a/addons/kestrel/ui/WindStrong-08.paa b/addons/kestrel/ui/WindStrong-08.paa
deleted file mode 100644
index cce04ab099..0000000000
Binary files a/addons/kestrel/ui/WindStrong-08.paa and /dev/null differ
diff --git a/addons/kestrel/ui/WindStrong-09.paa b/addons/kestrel/ui/WindStrong-09.paa
deleted file mode 100644
index e2c53aec6f..0000000000
Binary files a/addons/kestrel/ui/WindStrong-09.paa and /dev/null differ
diff --git a/addons/kestrel/ui/WindStrong-10.paa b/addons/kestrel/ui/WindStrong-10.paa
deleted file mode 100644
index 609b54096a..0000000000
Binary files a/addons/kestrel/ui/WindStrong-10.paa and /dev/null differ
diff --git a/addons/kestrel/ui/WindStrong-11.paa b/addons/kestrel/ui/WindStrong-11.paa
deleted file mode 100644
index 705cc5bd10..0000000000
Binary files a/addons/kestrel/ui/WindStrong-11.paa and /dev/null differ
diff --git a/addons/kestrel/ui/WindStrong-12.paa b/addons/kestrel/ui/WindStrong-12.paa
deleted file mode 100644
index d8d585d6eb..0000000000
Binary files a/addons/kestrel/ui/WindStrong-12.paa and /dev/null differ
diff --git a/addons/kestrel/ui/WindStrong-13.paa b/addons/kestrel/ui/WindStrong-13.paa
deleted file mode 100644
index d903c832ab..0000000000
Binary files a/addons/kestrel/ui/WindStrong-13.paa and /dev/null differ
diff --git a/addons/kestrel/ui/WindStrong-14.paa b/addons/kestrel/ui/WindStrong-14.paa
deleted file mode 100644
index 91153a801b..0000000000
Binary files a/addons/kestrel/ui/WindStrong-14.paa and /dev/null differ
diff --git a/addons/kestrel/ui/WindStrong-15.paa b/addons/kestrel/ui/WindStrong-15.paa
deleted file mode 100644
index d0a34d79e4..0000000000
Binary files a/addons/kestrel/ui/WindStrong-15.paa and /dev/null differ
diff --git a/addons/kestrel/ui/WindStrong-16.paa b/addons/kestrel/ui/WindStrong-16.paa
deleted file mode 100644
index 1be25039e4..0000000000
Binary files a/addons/kestrel/ui/WindStrong-16.paa and /dev/null differ
diff --git a/addons/kestrel/ui/WindVeryLight-01.paa b/addons/kestrel/ui/WindVeryLight-01.paa
deleted file mode 100644
index 561e52ec88..0000000000
Binary files a/addons/kestrel/ui/WindVeryLight-01.paa and /dev/null differ
diff --git a/addons/kestrel/ui/WindVeryLight-02.paa b/addons/kestrel/ui/WindVeryLight-02.paa
deleted file mode 100644
index fbce91664a..0000000000
Binary files a/addons/kestrel/ui/WindVeryLight-02.paa and /dev/null differ
diff --git a/addons/kestrel/ui/WindVeryLight-03.paa b/addons/kestrel/ui/WindVeryLight-03.paa
deleted file mode 100644
index f20ced9770..0000000000
Binary files a/addons/kestrel/ui/WindVeryLight-03.paa and /dev/null differ
diff --git a/addons/kestrel/ui/WindVeryLight-04.paa b/addons/kestrel/ui/WindVeryLight-04.paa
deleted file mode 100644
index 6b104848da..0000000000
Binary files a/addons/kestrel/ui/WindVeryLight-04.paa and /dev/null differ
diff --git a/addons/kestrel/ui/WindVeryLight-05.paa b/addons/kestrel/ui/WindVeryLight-05.paa
deleted file mode 100644
index f8e30a0c64..0000000000
Binary files a/addons/kestrel/ui/WindVeryLight-05.paa and /dev/null differ
diff --git a/addons/kestrel/ui/WindVeryLight-06.paa b/addons/kestrel/ui/WindVeryLight-06.paa
deleted file mode 100644
index 3a11d94cba..0000000000
Binary files a/addons/kestrel/ui/WindVeryLight-06.paa and /dev/null differ
diff --git a/addons/kestrel/ui/WindVeryLight-07.paa b/addons/kestrel/ui/WindVeryLight-07.paa
deleted file mode 100644
index b956cb478b..0000000000
Binary files a/addons/kestrel/ui/WindVeryLight-07.paa and /dev/null differ
diff --git a/addons/kestrel/ui/WindVeryLight-08.paa b/addons/kestrel/ui/WindVeryLight-08.paa
deleted file mode 100644
index 090f630d8f..0000000000
Binary files a/addons/kestrel/ui/WindVeryLight-08.paa and /dev/null differ
diff --git a/addons/kestrel/ui/WindVeryLight-09.paa b/addons/kestrel/ui/WindVeryLight-09.paa
deleted file mode 100644
index d8b8b7eff1..0000000000
Binary files a/addons/kestrel/ui/WindVeryLight-09.paa and /dev/null differ
diff --git a/addons/kestrel/ui/WindVeryLight-10.paa b/addons/kestrel/ui/WindVeryLight-10.paa
deleted file mode 100644
index 0151ad3779..0000000000
Binary files a/addons/kestrel/ui/WindVeryLight-10.paa and /dev/null differ
diff --git a/addons/kestrel/ui/WindVeryLight-11.paa b/addons/kestrel/ui/WindVeryLight-11.paa
deleted file mode 100644
index 241980a1e0..0000000000
Binary files a/addons/kestrel/ui/WindVeryLight-11.paa and /dev/null differ
diff --git a/addons/kestrel/ui/WindVeryLight-12.paa b/addons/kestrel/ui/WindVeryLight-12.paa
deleted file mode 100644
index adcaf136fa..0000000000
Binary files a/addons/kestrel/ui/WindVeryLight-12.paa and /dev/null differ
diff --git a/addons/kestrel/ui/WindVeryLight-13.paa b/addons/kestrel/ui/WindVeryLight-13.paa
deleted file mode 100644
index d381f0cc9e..0000000000
Binary files a/addons/kestrel/ui/WindVeryLight-13.paa and /dev/null differ
diff --git a/addons/kestrel/ui/WindVeryLight-14.paa b/addons/kestrel/ui/WindVeryLight-14.paa
deleted file mode 100644
index 0e77f697e2..0000000000
Binary files a/addons/kestrel/ui/WindVeryLight-14.paa and /dev/null differ
diff --git a/addons/kestrel/ui/WindVeryLight-15.paa b/addons/kestrel/ui/WindVeryLight-15.paa
deleted file mode 100644
index ad283a4d76..0000000000
Binary files a/addons/kestrel/ui/WindVeryLight-15.paa and /dev/null differ
diff --git a/addons/kestrel/ui/WindVeryLight-16.paa b/addons/kestrel/ui/WindVeryLight-16.paa
deleted file mode 100644
index b7ae70a989..0000000000
Binary files a/addons/kestrel/ui/WindVeryLight-16.paa and /dev/null differ
diff --git a/addons/kestrel/ui/noWind.paa b/addons/kestrel/ui/noWind.paa
deleted file mode 100644
index 8fa262c286..0000000000
Binary files a/addons/kestrel/ui/noWind.paa and /dev/null differ
diff --git a/addons/kestrel4500/CfgEventHandlers.hpp b/addons/kestrel4500/CfgEventHandlers.hpp
new file mode 100644
index 0000000000..2a05b72298
--- /dev/null
+++ b/addons/kestrel4500/CfgEventHandlers.hpp
@@ -0,0 +1,11 @@
+class Extended_PreInit_EventHandlers {
+ class ADDON {
+ init = QUOTE( call COMPILE_FILE(XEH_preInit) );
+ };
+};
+
+class Extended_PostInit_EventHandlers {
+ class ADDON {
+ init = QUOTE( call COMPILE_FILE(XEH_postInit) );
+ };
+};
\ No newline at end of file
diff --git a/addons/kestrel4500/CfgSound.hpp b/addons/kestrel4500/CfgSound.hpp
new file mode 100644
index 0000000000..957863bc9d
--- /dev/null
+++ b/addons/kestrel4500/CfgSound.hpp
@@ -0,0 +1,39 @@
+class CfgSounds
+{
+ class kestrel4500_center_button_click
+ {
+ name="kestrel4500_center_button_click";
+ sound[]={PATHTOF(sound\kestrel_center_button_click.wav),1,1};
+ titles[]={};
+ };
+ class kestrel4500_top_button_click
+ {
+ name="kestrel4500_top_button_click";
+ sound[]={PATHTOF(sound\kestrel_top_button_click.wav),1,1};
+ titles[]={};
+ };
+ class kestrel4500_right_button_click
+ {
+ name="kestrel4500_right_button_click";
+ sound[]={PATHTOF(sound\kestrel_right_button_click.wav),1,1};
+ titles[]={};
+ };
+ class kestrel4500_bottom_button_click
+ {
+ name="kestrel4500_bottom_button_click";
+ sound[]={PATHTOF(sound\kestrel_bottom_button_click.wav),1,1};
+ titles[]={};
+ };
+ class kestrel4500_left_button_click
+ {
+ name="kestrel4500_left_button_click";
+ sound[]={PATHTOF(sound\kestrel_left_button_click.wav),1,1};
+ titles[]={};
+ };
+ class kestrel4500_exit_button_click
+ {
+ name="kestrel4500_exit_button_click";
+ sound[]={PATHTOF(sound\kestrel_exit_button_click.wav),1,1};
+ titles[]={};
+ };
+};
\ No newline at end of file
diff --git a/addons/kestrel4500/CfgVehicles.hpp b/addons/kestrel4500/CfgVehicles.hpp
new file mode 100644
index 0000000000..20d8bf5b62
--- /dev/null
+++ b/addons/kestrel4500/CfgVehicles.hpp
@@ -0,0 +1,58 @@
+class CfgVehicles {
+ class Man;
+ class CAManBase: Man {
+ class ACE_SelfActions {
+ class ACE_Equipment {
+ class GVAR(open) {
+ displayName = "$STR_ACE_Kestrel4500_OpenKestrel";
+ condition = QUOTE(call FUNC(canShow) && !GVAR(Kestrel4500));
+ statement = QUOTE(call FUNC(createKestrelDialog));
+ showDisabled = 0;
+ priority = 0.1;
+ icon = QUOTE(PATHTOF(UI\Kestrel4500_Icon.paa));
+ exceptions[] = {"notOnMap"};
+ };
+ class GVAR(show) {
+ displayName = "$STR_ACE_Kestrel4500_ShowKestrel";
+ condition = QUOTE(call FUNC(canShow) && !GVAR(Overlay));
+ statement = QUOTE(call FUNC(displayKestrel));
+ showDisabled = 0;
+ priority = 0.2;
+ icon = QUOTE(PATHTOF(UI\Kestrel4500_Icon.paa));
+ exceptions[] = {"notOnMap", "isNotInside"};
+ };
+ class GVAR(hide) {
+ displayName = "$STR_ACE_Kestrel4500_HideKestrel";
+ condition = QUOTE(GVAR(Overlay));
+ statement = QUOTE(call FUNC(displayKestrel));
+ showDisabled = 0;
+ priority = 0.3;
+ icon = QUOTE(PATHTOF(UI\Kestrel4500_Icon.paa));
+ exceptions[] = {"notOnMap", "isNotInside"};
+ };
+ };
+ };
+ };
+
+ class Item_Base_F;
+ class ACE_Item_Kestrel4500: Item_Base_F {
+ author = "Ruthberg";
+ scope = 2;
+ scopeCurator = 2;
+ displayName = "Kestrel 4500";
+ vehicleClass = "Items";
+ class TransportItems {
+ class ACE_Kestrel4500 {
+ name = "ACE_Kestrel4500";
+ count = 1;
+ };
+ };
+ };
+
+ class Box_NATO_Support_F;
+ class ACE_Box_Misc: Box_NATO_Support_F {
+ class TransportItems {
+ MACRO_ADDITEM(ACE_Kestrel4500,6);
+ };
+ };
+};
diff --git a/addons/kestrel/CfgWeapons.hpp b/addons/kestrel4500/CfgWeapons.hpp
similarity index 72%
rename from addons/kestrel/CfgWeapons.hpp
rename to addons/kestrel4500/CfgWeapons.hpp
index 6db0e4b7d4..881edca202 100644
--- a/addons/kestrel/CfgWeapons.hpp
+++ b/addons/kestrel4500/CfgWeapons.hpp
@@ -3,13 +3,13 @@ class CfgWeapons {
class ACE_ItemCore;
class InventoryItem_Base_F;
- class ACE_Kestrel: ACE_ItemCore {
- author = "$STR_ACE_Common_ACETeam";
+ class ACE_Kestrel4500: ACE_ItemCore {
+ author[] = {$STR_ACE_Common_ACETeam, "Ruthberg"};
scope = 2;
displayName = "$STR_ACE_Kestrel_Name";
descriptionShort = "$STR_ACE_Kestrel_Description";
model = PATHTOF(kestrel4500.p3d);
- picture = PATHTOF(data\4500NV.paa);
+ picture = PATHTOF(UI\Kestrel4500.paa);
icon = "iconObject_circle";
mapSize = 0.034;
diff --git a/addons/kestrel4500/README.md b/addons/kestrel4500/README.md
new file mode 100644
index 0000000000..36a324beb9
--- /dev/null
+++ b/addons/kestrel4500/README.md
@@ -0,0 +1,10 @@
+ace_kestrel4500
+===============
+
+Kestrel 4500 Pocket Weather Tracker
+
+## Maintainers
+
+The people responsible for merging changes to this component or answering potential questions.
+
+- [Ruthberg] (http://github.com/Ulteq)
\ No newline at end of file
diff --git a/addons/kestrel4500/RscTitles.hpp b/addons/kestrel4500/RscTitles.hpp
new file mode 100644
index 0000000000..defb954292
--- /dev/null
+++ b/addons/kestrel4500/RscTitles.hpp
@@ -0,0 +1,341 @@
+#define ST_LEFT 0
+#define ST_RIGHT 1
+#define ST_CENTER 2
+
+class Kestrel4500_RscText
+{
+ idc=-1;
+ type=0;
+ style=ST_CENTER;
+ colorDisabled[]={0,0,0,0};
+ colorBackground[]={0,0,0,0};
+ colorText[]={0,0,0,1};
+ text="";
+ x=0;
+ y=0;
+ w=0.1;
+ h=0.03;
+ font="TahomaB";
+ sizeEx=0.04;
+ shadow=0;
+};
+class Kestrel4500_RscButton
+{
+ text="";
+ colorText[]={0,0,0,1};
+ colorDisabled[]={0,0,0,0};
+ colorBackground[]={0,0,0,0};
+ colorBackgroundDisabled[]={0,0,0,0};
+ colorBackgroundActive[]={0,0,0,0};
+ colorFocused[]={0,0,0,0};
+ colorShadow[]={0,0,0,0};
+ colorBorder[]={0,0,0,1};
+ soundEnter[]={"",0,1};
+ soundPush[]={"",0,1};
+ soundClick[]={"",0,1};
+ soundEscape[]={"",0,1};
+ type=1;
+ style="0x02+0x100";
+ x=0;
+ y=0;
+ w=0.10;
+ h=0.03;
+ font="TahomaB";
+ SizeEx=0.025;
+ offsetX=0.003;
+ offsetY=0.003;
+ offsetPressedX=0.0020;
+ offsetPressedY=0.0020;
+ borderSize=0;
+ shadow=0;
+};
+class Kestrel4500_Display
+{
+ name="Kestrel4500_Display";
+ idd=-1;
+ onLoad="uiNamespace setVariable ['Kestrel4500_Display', (_this select 0)]";
+ movingEnable=1;
+ controlsBackground[]={};
+ objects[]={};
+ class controls
+ {
+ class BACKGROUND
+ {
+ moving=1;
+ type=0;
+ font="TahomaB";
+ SizeEX=0.025;
+ idc=74000;
+ style=48;
+ x=safezoneX;
+ y=safezoneY;
+ w=1.024;
+ h=1.024*4/3;
+ colorBackground[]={1,1,1,1};
+ colorText[]={1,1,1,1};
+ text=PATHTOF(UI\Kestrel4500.paa);
+ };
+ class POWER: Kestrel4500_RscButton
+ {
+ idc=-1;
+ x=safezoneX+0.385;
+ y=safezoneY+1.125;
+ w=0.042;
+ h=0.042*4/3;
+ action="closeDialog 0";
+ onMouseButtonDown = "playSound 'kestrel4500_exit_button_click'";
+ };
+ class ENTER: POWER
+ {
+ idc=-1;
+ x=safezoneX+0.46;
+ y=safezoneY+1.0;
+ w=0.1;
+ action=QUOTE(0 call FUNC(buttonPressed));
+ onMouseButtonDown = "playSound 'kestrel4500_center_button_click'";
+ };
+ class TOP: Kestrel4500_RscButton
+ {
+ idc=-1;
+ x=safezoneX+0.46;
+ y=safezoneY+0.93;
+ w=0.1;
+ h=0.03;
+ action=QUOTE(1 call FUNC(buttonPressed));
+ onMouseButtonDown = "playSound 'kestrel4500_top_button_click'";
+ };
+ class BOTTOM: TOP
+ {
+ idc=-1;
+ y=safezoneY+1.1;
+ action=QUOTE(2 call FUNC(buttonPressed));
+ onMouseButtonDown = "playSound 'kestrel4500_bottom_button_click'";
+ };
+ class LEFT: Kestrel4500_RscButton
+ {
+ idc=-1;
+ x=safezoneX+0.4;
+ y=safezoneY+0.97;
+ w=0.046;
+ h=0.11;
+ action=QUOTE(3 call FUNC(buttonPressed));
+ onMouseButtonDown = "playSound 'kestrel4500_left_button_click'";
+ };
+ class RIGHT: LEFT
+ {
+ idc=-1;
+ x=safezoneX+0.58;
+ action=QUOTE(4 call FUNC(buttonPressed));
+ onMouseButtonDown = "playSound 'kestrel4500_right_button_click'";
+ };
+ class MEMORY: Kestrel4500_RscButton
+ {
+ idc=-1;
+ x=safezoneX+0.395;
+ y=safezoneY+0.87;
+ w=0.05;
+ h=0.045*4/3;
+ action=QUOTE(5 call FUNC(buttonPressed));
+ };
+ class BACKLIGHT: MEMORY
+ {
+ idc=-1;
+ x=safezoneX+0.585;
+ action=QUOTE(6 call FUNC(buttonPressed));
+ };
+
+ class TEXT_TOP: Kestrel4500_RscText
+ {
+ idc=74100;
+ x=safezoneX+0.40;
+ y=safezoneY+0.58;
+ w=0.22;
+ h=0.04;
+ text="";
+ };
+ class TEXT_CENTER_BIG: TEXT_TOP
+ {
+ idc=74200;
+ y=safezoneY+0.61;
+ h=0.10;
+ SizeEx=0.06;
+ text="";
+ };
+ class TEXT_CENTER_LINE_1_LEFT: TEXT_TOP
+ {
+ idc=74300;
+ y=safezoneY+0.60;
+ style=ST_LEFT;
+ h=0.10;
+ SizeEx=0.05;
+ text="";
+ };
+ class TEXT_CENTER_LINE2_LEFT: TEXT_CENTER_LINE_1_LEFT
+ {
+ idc=74301;
+ y=safezoneY+0.64;
+ text="";
+ };
+ class TEXT_CENTER_LINE_3_LEFT: TEXT_CENTER_LINE2_LEFT
+ {
+ idc=74302;
+ y=safezoneY+0.68;
+ text="";
+ };
+ class TEXT_CENTER_LINE_1_RIGHT: TEXT_CENTER_LINE_1_LEFT
+ {
+ idc=74303;
+ style=ST_RIGHT;
+ };
+ class TEXT_CENTER_LINE2_RIGHT: TEXT_CENTER_LINE2_LEFT
+ {
+ idc=74304;
+ style=ST_RIGHT;
+ };
+ class TEXT_CENTER_LINE_3_RIGHT: TEXT_CENTER_LINE_3_LEFT
+ {
+ idc=74305;
+ style=ST_RIGHT;
+ };
+ class TEXT_INFO_LINE_1: TEXT_TOP
+ {
+ idc=74400;
+ y=safezoneY+0.69;
+ text="";
+ };
+ class TEXT_INFO_LINE_2: TEXT_TOP
+ {
+ idc=74401;
+ y=safezoneY+0.72;
+ text="";
+ };
+ };
+};
+class RscTitles
+{
+ class RscKestrel4500
+ {
+ idd=-1;
+ onLoad="with uiNameSpace do { RscKestrel4500 = _this select 0 };";
+ movingEnable=0;
+ duration=60;
+ fadeIn="false";
+ fadeOut="false";
+ class controls
+ {
+ class RscKestrel4500
+ {
+ idc=75000;
+ moving=0;
+ type=0;
+ font="TahomaB";
+ SizeEX=0.025*0.75;
+ style=48;
+ x=safezoneX+0.14;
+ y=safezoneY+0.7;
+ w=0.512*0.75;
+ h=1.024*4/3*0.75;
+ colorBackground[]={1,1,1,1};
+ colorText[]={1,1,1,1};
+ text=PATHTOF(UI\Kestrel4500_0.paa);
+ };
+ class RscTextTop: Kestrel4500_RscText
+ {
+ idc=75100;
+ x=safezoneX-0.05+0.40*0.75;
+ y=safezoneY+0.7+0.58*0.75;
+ w=0.22*0.75;
+ h=0.04*0.75;
+ SizeEx=0.04*0.75;
+ text="";
+ };
+ class RscTextCenterBig: RscTextTop
+ {
+ idc=75200;
+ y=safezoneY+0.7+0.61*0.75;
+ h=0.10*0.75;
+ SizeEx=0.06*0.75;
+ text="";
+ };
+ class RscTextCenterLine1Left: RscTextTop
+ {
+ idc=75300;
+ y=safezoneY+0.7+0.60*0.75;
+ style=ST_LEFT;
+ h=0.10*0.75;
+ SizeEx=0.05*0.75;
+ text="";
+ };
+ class RscTextCenterLine2Left: RscTextCenterLine1Left
+ {
+ idc=75301;
+ y=safezoneY+0.7+0.64*0.75;
+ text="";
+ };
+ class RscTextCenterLine3Left: RscTextCenterLine2Left
+ {
+ idc=75302;
+ y=safezoneY+0.7+0.68*0.75;
+ text="";
+ };
+ class RscTextCenterLine1Right: RscTextCenterLine1Left
+ {
+ idc=75303;
+ style=ST_RIGHT;
+ };
+ class RscTextCenterLine2Right: RscTextCenterLine2Left
+ {
+ idc=75304;
+ style=ST_RIGHT;
+ };
+ class RscTextCenterLine3Right: RscTextCenterLine3Left
+ {
+ idc=75305;
+ style=ST_RIGHT;
+ };
+ class RscTextInfoLine1: RscTextTop
+ {
+ idc=75400;
+ y=safezoneY+0.7+0.69*0.75;
+ text="";
+ };
+ class RscTextInfoLine2: RscTextTop
+ {
+ idc=75401;
+ y=safezoneY+0.7+0.72*0.75;
+ text="";
+ };
+ };
+ };
+
+ class RscKestrel4500_Preload {
+ idd = -1;
+ movingEnable = 0;
+ duration = 1e+011;
+ fadein = 0;
+ fadeout = 0;
+ class controls {
+ class Preload_0 {
+ text = PATHTOF(UI\Kestrel4500_0.paa);
+ };
+ class Preload_1 {
+ text = PATHTOF(UI\Kestrel4500_1.paa);
+ };
+ class Preload_2 {
+ text = PATHTOF(UI\Kestrel4500_2.paa);
+ };
+ class Preload_3 {
+ text = PATHTOF(UI\Kestrel4500_3.paa);
+ };
+ class Preload_4 {
+ text = PATHTOF(UI\Kestrel4500_4.paa);
+ };
+ class Preload_5 {
+ text = PATHTOF(UI\Kestrel4500_5.paa);
+ };
+ class Preload_6 {
+ text = PATHTOF(UI\Kestrel4500_6.paa);
+ };
+ };
+ };
+};
\ No newline at end of file
diff --git a/addons/kestrel4500/UI/Kestrel4500.paa b/addons/kestrel4500/UI/Kestrel4500.paa
new file mode 100644
index 0000000000..4fafe55cb2
Binary files /dev/null and b/addons/kestrel4500/UI/Kestrel4500.paa differ
diff --git a/addons/kestrel4500/UI/Kestrel4500_0.paa b/addons/kestrel4500/UI/Kestrel4500_0.paa
new file mode 100644
index 0000000000..6ff961c665
Binary files /dev/null and b/addons/kestrel4500/UI/Kestrel4500_0.paa differ
diff --git a/addons/kestrel4500/UI/Kestrel4500_1.paa b/addons/kestrel4500/UI/Kestrel4500_1.paa
new file mode 100644
index 0000000000..7b24fe2da8
Binary files /dev/null and b/addons/kestrel4500/UI/Kestrel4500_1.paa differ
diff --git a/addons/kestrel4500/UI/Kestrel4500_2.paa b/addons/kestrel4500/UI/Kestrel4500_2.paa
new file mode 100644
index 0000000000..199a37afba
Binary files /dev/null and b/addons/kestrel4500/UI/Kestrel4500_2.paa differ
diff --git a/addons/kestrel4500/UI/Kestrel4500_3.paa b/addons/kestrel4500/UI/Kestrel4500_3.paa
new file mode 100644
index 0000000000..9540042ff3
Binary files /dev/null and b/addons/kestrel4500/UI/Kestrel4500_3.paa differ
diff --git a/addons/kestrel4500/UI/Kestrel4500_4.paa b/addons/kestrel4500/UI/Kestrel4500_4.paa
new file mode 100644
index 0000000000..d336be67f1
Binary files /dev/null and b/addons/kestrel4500/UI/Kestrel4500_4.paa differ
diff --git a/addons/kestrel4500/UI/Kestrel4500_5.paa b/addons/kestrel4500/UI/Kestrel4500_5.paa
new file mode 100644
index 0000000000..8cb8dabbdc
Binary files /dev/null and b/addons/kestrel4500/UI/Kestrel4500_5.paa differ
diff --git a/addons/kestrel4500/UI/Kestrel4500_6.paa b/addons/kestrel4500/UI/Kestrel4500_6.paa
new file mode 100644
index 0000000000..649dbb1b63
Binary files /dev/null and b/addons/kestrel4500/UI/Kestrel4500_6.paa differ
diff --git a/addons/kestrel4500/UI/Kestrel4500_Icon.paa b/addons/kestrel4500/UI/Kestrel4500_Icon.paa
new file mode 100644
index 0000000000..062282115a
Binary files /dev/null and b/addons/kestrel4500/UI/Kestrel4500_Icon.paa differ
diff --git a/addons/kestrel4500/XEH_postInit.sqf b/addons/kestrel4500/XEH_postInit.sqf
new file mode 100644
index 0000000000..878f9ca0ce
--- /dev/null
+++ b/addons/kestrel4500/XEH_postInit.sqf
@@ -0,0 +1,25 @@
+#include "script_component.hpp"
+
+//#include "initKeybinds.sqf"
+
+GVAR(Menus) = ["Direction", "Wind SPD m/s", "CROSSWIND m/s", "HEADWIND m/s", "TEMP °C", "HUMIDITY %", "BARO hPA", "ALTITUDE m", "User Screen 1", "User Screen 2"];
+
+GVAR(TOTAL) = [0, 0, 0, 0, 0, 0, 0, 0];
+GVAR(ENTRIES) = [0, 0, 0, 0, 0, 0, 0, 0];
+
+GVAR(MinAvgMax) = false;
+GVAR(MinAvgMaxMode) = 0;
+
+GVAR(Menu) = 1;
+GVAR(Directions) = ["N", "NNE", "NE", "ENE", "E", "ESE", "SE", "SSE", "S", "SSW", "SW", "WSW", "W", "WNW", "NW", "NNW"];
+GVAR(Direction) = 0;
+
+GVAR(RefHeading) = 0;
+
+GVAR(updateTimer) = 0;
+GVAR(outputData) = ["", "", "", "", "", "", "", "", "", ""];
+GVAR(MeasuredWindSpeed) = 0;
+GVAR(ImpellerState) = 0;
+
+GVAR(Kestrel4500) = false;
+GVAR(Overlay) = false;
diff --git a/addons/kestrel4500/XEH_preInit.sqf b/addons/kestrel4500/XEH_preInit.sqf
new file mode 100644
index 0000000000..d081f485ec
--- /dev/null
+++ b/addons/kestrel4500/XEH_preInit.sqf
@@ -0,0 +1,16 @@
+#include "script_component.hpp"
+
+ADDON = false;
+
+PREP(buttonPressed);
+PREP(calculateWindSpeed);
+PREP(canShow);
+PREP(collectData);
+PREP(createKestrelDialog);
+PREP(displayKestrel);
+PREP(generateOutputData);
+PREP(measureWindSpeed);
+PREP(updateDisplay);
+PREP(updateImpellerState);
+
+ADDON = true;
diff --git a/addons/kestrel4500/config.cpp b/addons/kestrel4500/config.cpp
new file mode 100644
index 0000000000..8e558af44f
--- /dev/null
+++ b/addons/kestrel4500/config.cpp
@@ -0,0 +1,18 @@
+#include "script_component.hpp"
+
+class CfgPatches {
+ class ADDON {
+ units[] = {"ACE_Item_Kestrel4500"};
+ weapons[] = {"ACE_Kestrel4500"};
+ requiredVersion = REQUIRED_VERSION;
+ requiredAddons[] = {"ACE_common", "ACE_weather"};
+ author[] = {$STR_ACE_Common_ACETeam, "Ruthberg"};
+ VERSION_CONFIG;
+ };
+};
+
+#include "CfgEventHandlers.hpp"
+#include "CfgSound.hpp"
+#include "CfgVehicles.hpp"
+#include "CfgWeapons.hpp"
+#include "RscTitles.hpp"
\ No newline at end of file
diff --git a/addons/kestrel/data/arrow1.paa b/addons/kestrel4500/data/arrow1.paa
similarity index 100%
rename from addons/kestrel/data/arrow1.paa
rename to addons/kestrel4500/data/arrow1.paa
diff --git a/addons/kestrel4500/data/body.paa b/addons/kestrel4500/data/body.paa
new file mode 100644
index 0000000000..dfaa44723e
Binary files /dev/null and b/addons/kestrel4500/data/body.paa differ
diff --git a/addons/kestrel/data/gpstemp.paa b/addons/kestrel4500/data/gpstemp.paa
similarity index 100%
rename from addons/kestrel/data/gpstemp.paa
rename to addons/kestrel4500/data/gpstemp.paa
diff --git a/addons/kestrel/data/rad.paa b/addons/kestrel4500/data/rad.paa
similarity index 100%
rename from addons/kestrel/data/rad.paa
rename to addons/kestrel4500/data/rad.paa
diff --git a/addons/kestrel/data/tasten.paa b/addons/kestrel4500/data/tasten.paa
similarity index 100%
rename from addons/kestrel/data/tasten.paa
rename to addons/kestrel4500/data/tasten.paa
diff --git a/addons/kestrel/data/tasten1.paa b/addons/kestrel4500/data/tasten1.paa
similarity index 100%
rename from addons/kestrel/data/tasten1.paa
rename to addons/kestrel4500/data/tasten1.paa
diff --git a/addons/kestrel4500/functions/defines.h b/addons/kestrel4500/functions/defines.h
new file mode 100644
index 0000000000..bd59c23bd4
--- /dev/null
+++ b/addons/kestrel4500/functions/defines.h
@@ -0,0 +1 @@
+#define GET_TEMPERATURE_AT_HEIGHT(h) (EGVAR(weather,currentTemperature) - 0.0065 * (h))
\ No newline at end of file
diff --git a/addons/kestrel4500/functions/fnc_buttonPressed.sqf b/addons/kestrel4500/functions/fnc_buttonPressed.sqf
new file mode 100644
index 0000000000..f0f9a10db1
--- /dev/null
+++ b/addons/kestrel4500/functions/fnc_buttonPressed.sqf
@@ -0,0 +1,53 @@
+/*
+ * Author: Ruthberg
+ * Handles the Kestrel 4500 dialog button actions
+ *
+ * Arguments:
+ * buttonID
+ *
+ * Return Value:
+ * Nothing
+ *
+ * Example:
+ * 2 call ace_kestrel4500_fnc_buttonPressed
+ *
+ * Public: No
+ */
+#include "script_component.hpp"
+
+switch (_this) do {
+ case 0: { // Enter
+ if (!GVAR(MinAvgMax) && (GVAR(Menu) == 2 || GVAR(Menu) == 3)) then {
+ GVAR(RefHeading) = getDir ACE_player;
+ };
+ if (GVAR(MinAvgMax) && GVAR(Menu) > 0 && GVAR(Menu) < 4) then {
+ if (GVAR(MinAvgMaxMode) != 1) then {
+ {
+ GVAR(MIN) set [_x, 0];
+ GVAR(MAX) set [_x, 0];
+ GVAR(TOTAL) set [_x, 0];
+ GVAR(ENTRIES) set [_x, 0];
+ } forEach [1, 2, 3];
+ };
+ GVAR(MinAvgMaxMode) = (GVAR(MinAvgMaxMode) + 1) % 3;
+ };
+ };
+ case 1: { // Top
+ GVAR(Menu) = (GVAR(Menu) - 1 + (count GVAR(Menus))) % (count GVAR(Menus));
+ };
+ case 2: { // Bottom
+ GVAR(Menu) = (GVAR(Menu) + 1 + (count GVAR(Menus))) % (count GVAR(Menus));
+ };
+ case 3: { // Left
+ GVAR(MinAvgMax) = !GVAR(MinAvgMax);
+ };
+ case 4: { // Right
+ GVAR(MinAvgMax) = !GVAR(MinAvgMax);
+ };
+ case 5: { // Memory
+ };
+ case 6: { // Backlight
+ };
+};
+
+[] call FUNC(updateDisplay);
diff --git a/addons/kestrel4500/functions/fnc_calculateWindSpeed.sqf b/addons/kestrel4500/functions/fnc_calculateWindSpeed.sqf
new file mode 100644
index 0000000000..8267f7f729
--- /dev/null
+++ b/addons/kestrel4500/functions/fnc_calculateWindSpeed.sqf
@@ -0,0 +1,68 @@
+/*
+ * Author: Ruthberg
+ *
+ * Calculates the wind speed at a given world position
+ *
+ * Arguments:
+ * 0: _this - world position
+ *
+ * Return Value:
+ * 0: wind speed - m/s
+ *
+ * Public: No
+ */
+#include "script_component.hpp"
+
+private ["_windSpeed", "_windDir", "_newWindSpeed", "_windSource"];
+
+fnc_polar2vect = {
+ private ["_mag2D"];
+ _mag2D = (_this select 0) * cos((_this select 2));
+ [_mag2D * sin((_this select 1)), _mag2D * cos((_this select 1)), (_this select 0) * sin((_this select 2))];
+};
+
+_windSpeed = vectorMagnitude ACE_wind;
+_windDir = (ACE_wind select 0) atan2 (ACE_wind select 1);
+
+// Terrain effect on wind
+if (_windSpeed > 0.05) then {
+ _newWindSpeed = 0;
+ {
+ _windSource = [100, _windDir + 180, _x] call fnc_polar2vect;
+ if (!(terrainIntersectASL [_this, _this vectorAdd _windSource])) exitWith {
+ _newWindSpeed = cos(_x * 9) * _windSpeed;
+ };
+ _windSource = [100, _windDir + 180 + _x, 0] call fnc_polar2vect;
+ if (!(terrainIntersectASL [_this, _this vectorAdd _windSource])) exitWith {
+ _newWindSpeed = cos(_x * 9) * _windSpeed;
+ };
+ _windSource = [100, _windDir + 180 - _x, 0] call fnc_polar2vect;
+ if (!(terrainIntersectASL [_this, _this vectorAdd _windSource])) exitWith {
+ _newWindSpeed = cos(_x * 9) * _windSpeed;
+ };
+ } forEach [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10];
+ _windSpeed = _newWindSpeed;
+};
+
+// Obstacle effect on wind
+if (_windSpeed > 0.05) then {
+ _newWindSpeed = 0;
+ {
+ _windSource = [20, _windDir + 180, _x] call fnc_polar2vect;
+ if (!(lineIntersects [_this, _this vectorAdd _windSource])) exitWith {
+ _newWindSpeed = cos(_x * 2) * _windSpeed;
+ };
+ _windSource = [20, _windDir + 180 + _x, 0] call fnc_polar2vect;
+ if (!(lineIntersects [_this, _this vectorAdd _windSource])) exitWith {
+ _newWindSpeed = cos(_x * 2) * _windSpeed;
+ };
+ _windSource = [20, _windDir + 180 - _x, 0] call fnc_polar2vect;
+ if (!(lineIntersects [_this, _this vectorAdd _windSource])) exitWith {
+ _newWindSpeed = cos(_x * 2) * _windSpeed;
+ };
+ } forEach [0, 5, 10, 15, 20, 25, 30, 35, 40, 45];
+ _windSpeed = _newWindSpeed;
+};
+_windSpeed = 0 max _windSpeed;
+
+_windSpeed
diff --git a/addons/kestrel4500/functions/fnc_canShow.sqf b/addons/kestrel4500/functions/fnc_canShow.sqf
new file mode 100644
index 0000000000..0c9e29f9bc
--- /dev/null
+++ b/addons/kestrel4500/functions/fnc_canShow.sqf
@@ -0,0 +1,18 @@
+/*
+ * Authors: Ruthberg
+ * Tests if the Kestrel 4500 can be shown
+ *
+ * Arguments:
+ * Nothing
+ *
+ * Return Value:
+ * canShow (bool)
+ *
+ * Example:
+ * [mode] call ace_kestrel4500_fnc_canShow
+ *
+ * Public: No
+ */
+#include "script_component.hpp"
+
+("ACE_Kestrel4500" in (uniformItems ACE_player)) || ("ACE_Kestrel4500" in (vestItems ACE_player))
diff --git a/addons/kestrel4500/functions/fnc_collectData.sqf b/addons/kestrel4500/functions/fnc_collectData.sqf
new file mode 100644
index 0000000000..ef7be60cd8
--- /dev/null
+++ b/addons/kestrel4500/functions/fnc_collectData.sqf
@@ -0,0 +1,95 @@
+/*
+ * Author: Ruthberg
+ * Gathers the weather data for the Kestrel 4500
+ *
+ * Arguments:
+ * Nothing
+ *
+ * Return Value:
+ * Nothing
+ *
+ * Example:
+ *
+ * Public: No
+ */
+#include "script_component.hpp"
+#include "defines.h"
+
+private ["_playerDir", "_windSpeed", "_windDir", "_crosswind", "_headwind", "_humidity", "_temperature", "_humidity", "_barometricPressure", "_altitude"];
+
+if (isNil QGVAR(MIN) || isNil QGVAR(MAX)) then {
+ _temperature = GET_TEMPERATURE_AT_HEIGHT((getPosASL ACE_player) select 2);
+ _humidity = EGVAR(weather,currentHumidity);
+ _barometricPressure = 1013.25 * exp(-(EGVAR(weather,Altitude) + ((getPosASL ACE_player) select 2)) / 7990) - 10 * overcast;
+ _altitude = EGVAR(weather,Altitude) + ((getPosASL ACE_player) select 2);
+ GVAR(MIN) = [0, 0, 0, 0, _temperature, _humidity, _barometricPressure, _altitude];
+ GVAR(MAX) = [0, 0, 0, 0, _temperature, _humidity, _barometricPressure, _altitude];
+};
+
+{
+ GVAR(ENTRIES) set [_x, (GVAR(ENTRIES) select _x) + 1];
+} forEach [0, 4, 5, 6 ,7];
+
+// Direction
+_playerDir = getDir ACE_player;
+GVAR(MIN) set [0, (GVAR(MIN) select 0) min _playerDir];
+GVAR(MAX) set [0, _playerDir max (GVAR(MAX) select 0)];
+GVAR(TOTAL) set [0, (GVAR(TOTAL) select 0) + _playerDir];
+
+if (GVAR(MinAvgMaxMode) == 1) then {
+ {
+ GVAR(ENTRIES) set [_x, (GVAR(ENTRIES) select _x) + 1];
+ } forEach [1, 2, 3];
+
+ // Wind SPD
+ _windSpeed = call FUNC(measureWindSpeed);
+ GVAR(MIN) set [1, (GVAR(MIN) select 1) min abs(_windSpeed)];
+ GVAR(MAX) set [1, abs(_windSpeed) max (GVAR(MAX) select 1)];
+ GVAR(TOTAL) set [1, (GVAR(TOTAL) select 1) + abs(_windSpeed)];
+
+ // CROSSWIND
+ _crosswind = 0;
+ if (missionNamespace getVariable [QEGVAR(advanced_ballistics,enabled), false]) then {
+ _crosswind = abs(sin(GVAR(RefHeading) - _playerDir) * _windSpeed);
+ } else {
+ _crosswind = abs(sin(GVAR(RefHeading)) * _windSpeed);
+ };
+ GVAR(MIN) set [2, (GVAR(MIN) select 2) min _crosswind];
+ GVAR(MAX) set [2, _crosswind max (GVAR(MAX) select 2)];
+ GVAR(TOTAL) set [2, (GVAR(TOTAL) select 2) + _crosswind];
+
+ // HEADWIND
+ _headwind = 0;
+ if (missionNamespace getVariable [QEGVAR(advanced_ballistics,enabled), false]) then {
+ _headwind = abs(cos(GVAR(RefHeading) - _playerDir) * _windSpeed);
+ } else {
+ _headwind = abs(cos(GVAR(RefHeading)) * _windSpeed);
+ };
+ GVAR(MIN) set [3, (GVAR(MIN) select 3) min _headwind];
+ GVAR(MAX) set [3, _headwind max (GVAR(MAX) select 3)];
+ GVAR(TOTAL) set [3, (GVAR(TOTAL) select 3) + _headwind];
+};
+
+// TEMP
+_temperature = GET_TEMPERATURE_AT_HEIGHT((getPosASL ACE_player) select 2);
+GVAR(MIN) set [4, (GVAR(MIN) select 4) min _temperature];
+GVAR(MAX) set [4, _temperature max (GVAR(MAX) select 4)];
+GVAR(TOTAL) set [4, (GVAR(TOTAL) select 4) + _temperature];
+
+// HUMIDITY
+_humidity = EGVAR(weather,currentHumidity);
+GVAR(MIN) set [5, (GVAR(MIN) select 5) min _humidity];
+GVAR(MAX) set [5, _humidity max (GVAR(MAX) select 5)];
+GVAR(TOTAL) set [5, (GVAR(TOTAL) select 5) + _humidity];
+
+// BARO
+_barometricPressure = 1013.25 * exp(-(EGVAR(weather,Altitude) + ((getPosASL ACE_player) select 2)) / 7990) - 10 * overcast;
+GVAR(MIN) set [6, (GVAR(MIN) select 6) min _barometricPressure];
+GVAR(MAX) set [6, _barometricPressure max (GVAR(MAX) select 6)];
+GVAR(TOTAL) set [6, (GVAR(TOTAL) select 6) + _barometricPressure];
+
+// ALTITUDE
+_altitude = EGVAR(weather,Altitude) + ((getPosASL ACE_player) select 2);
+GVAR(MIN) set [7, (GVAR(MIN) select 7) min _altitude];
+GVAR(MAX) set [7, _altitude max (GVAR(MAX) select 7)];
+GVAR(TOTAL) set [7, (GVAR(TOTAL) select 7) + _altitude];
\ No newline at end of file
diff --git a/addons/kestrel4500/functions/fnc_createKestrelDialog.sqf b/addons/kestrel4500/functions/fnc_createKestrelDialog.sqf
new file mode 100644
index 0000000000..f9cd6cf04a
--- /dev/null
+++ b/addons/kestrel4500/functions/fnc_createKestrelDialog.sqf
@@ -0,0 +1,36 @@
+/*
+ * Author: Ruthberg
+ * Opens the Kestrel 4500 dialog
+ *
+ * Arguments:
+ * Nothing
+ *
+ * Return Value:
+ * Nothing
+ *
+ * Example:
+ *
+ * Public: No
+ */
+#include "script_component.hpp"
+
+//if (dialog) exitWith { false };
+if (underwater ACE_player) exitWith { false };
+if (!("ACE_Kestrel4500" in (uniformItems ACE_player)) && !("ACE_Kestrel4500" in (vestItems ACE_player))) exitWith { false };
+
+GVAR(Overlay) = false;
+3 cutText ["", "PLAIN"];
+
+GVAR(Kestrel4500) = true;
+createDialog 'Kestrel4500_Display';
+
+[{
+ if (!dialog || !GVAR(Kestrel4500)) exitWith {
+ GVAR(Kestrel4500) = false;
+ [_this select 1] call CBA_fnc_removePerFrameHandler;
+ };
+
+ [] call FUNC(updateDisplay);
+}, 1, _this select 0] call CBA_fnc_addPerFrameHandler;
+
+true
diff --git a/addons/kestrel4500/functions/fnc_displayKestrel.sqf b/addons/kestrel4500/functions/fnc_displayKestrel.sqf
new file mode 100644
index 0000000000..2c1241bb6c
--- /dev/null
+++ b/addons/kestrel4500/functions/fnc_displayKestrel.sqf
@@ -0,0 +1,85 @@
+/*
+ * Author: Ruthberg
+ * Shows the Kestrel 4500 as rsc title
+ *
+ * Arguments:
+ * Nothing
+ *
+ * Return Value:
+ * Nothing
+ *
+ * Example:
+ *
+ * Public: No
+ */
+#include "script_component.hpp"
+
+#define __dsp (uiNamespace getVariable "RscKestrel4500")
+#define __ctrlKestrel4500 (__dsp displayCtrl 75000)
+#define __ctrlTop (__dsp displayCtrl 75100)
+#define __ctrlCenterBig (__dsp displayCtrl 75200)
+#define __ctrlCenterLine1Left (__dsp displayCtrl 75300)
+#define __ctrlCenterLine2Left (__dsp displayCtrl 75301)
+#define __ctrlCenterLine3Left (__dsp displayCtrl 75302)
+#define __ctrlCenterLine1Right (__dsp displayCtrl 75303)
+#define __ctrlCenterLine2Right (__dsp displayCtrl 75304)
+#define __ctrlCenterLine3Right (__dsp displayCtrl 75305)
+#define __ctrlInfoLine1 (__dsp displayCtrl 75400)
+#define __ctrlInfoLine2 (__dsp displayCtrl 75401)
+
+if (GVAR(Overlay)) exitWith {
+ GVAR(Overlay) = false;
+ 3 cutText ["", "PLAIN"];
+ true
+};
+if (underwater ACE_player) exitWith { true };
+if (!("ACE_Kestrel4500" in (uniformItems ACE_player)) && !("ACE_Kestrel4500" in (vestItems ACE_player))) exitWith { true };
+
+if (GVAR(Kestrel4500) && dialog) then {
+ GVAR(Kestrel4500) = false;
+ closeDialog 0;
+};
+
+GVAR(Overlay) = true;
+
+[{
+ private ["_outputData", "_updateTimer"];
+
+ // abort condition
+ if (!GVAR(Overlay) || {!(("ACE_Kestrel4500" in (uniformItems ACE_player)) || ("ACE_Kestrel4500" in (vestItems ACE_player)))}) exitWith {
+ GVAR(Overlay) = false;
+ 3 cutText ["", "PLAIN"];
+ [_this select 1] call CBA_fnc_removePerFrameHandler;
+ };
+
+ if (diag_tickTime > GVAR(updateTimer)) then {
+ GVAR(updateTimer) = diag_tickTime + 1;
+
+ _outputData = [] call FUNC(generateOutputData);
+
+ 3 cutRsc ["RscKestrel4500", "PLAIN", 1, false];
+
+ __ctrlTop ctrlSetText (_outputData select 0);
+ __ctrlCenterBig ctrlSetText (_outputData select 1);
+
+ __ctrlTop ctrlSetText (_outputData select 0);
+ __ctrlCenterBig ctrlSetText (_outputData select 1);
+
+ __ctrlCenterLine1Left ctrlSetText (_outputData select 2);
+ __ctrlCenterLine2Left ctrlSetText (_outputData select 3);
+ __ctrlCenterLine3Left ctrlSetText (_outputData select 4);
+
+ __ctrlCenterLine1Right ctrlSetText (_outputData select 5);
+ __ctrlCenterLine2Right ctrlSetText (_outputData select 6);
+ __ctrlCenterLine3Right ctrlSetText (_outputData select 7);
+
+ __ctrlInfoLine1 ctrlSetText (_outputData select 8);
+ __ctrlInfoLine2 ctrlSetText (_outputData select 9);
+ };
+
+ call FUNC(updateImpellerState);
+ __ctrlKestrel4500 ctrlSetText format [QUOTE(PATHTOF(UI\Kestrel4500_%1.paa)), floor(GVAR(ImpellerState) % 7)];
+
+}, 0.01, []] call CBA_fnc_addPerFrameHandler;
+
+true
diff --git a/addons/kestrel4500/functions/fnc_generateOutputData.sqf b/addons/kestrel4500/functions/fnc_generateOutputData.sqf
new file mode 100644
index 0000000000..954b886eff
--- /dev/null
+++ b/addons/kestrel4500/functions/fnc_generateOutputData.sqf
@@ -0,0 +1,218 @@
+/*
+ * Author: Ruthberg
+ * Generates the Kestrel 4500 output text.
+ *
+ * Arguments:
+ * Nothing
+ *
+ * Return Value:
+ * [top , centerBig , CenterLine1Left , CenterLine2Left , CenterLine3Left , CenterLine1Right , CenterLine2Right , CenterLine3Right , InfoLine1 , InfoLine2 ]
+ *
+ * Example:
+ *
+ * Public: No
+ */
+#include "script_component.hpp"
+#include "defines.h"
+
+private ["_playerDir", "_textTop", "_textCenterBig", "_textCenterLine1Left", "_textCenterLine2Left", "_textCenterLine3Left", "_textCenterLine1Right", "_textCenterLine2Right", "_textCenterLine3Right", "_textInfoLine1", "_textInfoLine2", "_temperature", "_humidity", "_windSpeed", "_windDir", "_newWindSpeed", "_windSource", "_height"];
+
+[] call FUNC(collectData);
+
+_textTop = GVAR(Menus) select GVAR(Menu);
+_textCenterBig = "";
+
+_textCenterLine1Left = "";
+_textCenterLine2Left = "";
+_textCenterLine3Left = "";
+_textCenterLine1Right = "";
+_textCenterLine2Right = "";
+_textCenterLine3Right = "";
+
+_textInfoLine1 = "";
+_textInfoLine2 = "";
+
+_windSpeed = call FUNC(measureWindSpeed);
+_windDir = (ACE_wind select 0) atan2 (ACE_wind select 1);
+
+_temperature = GET_TEMPERATURE_AT_HEIGHT((getPosASL ACE_player) select 2);
+_humidity = EGVAR(weather,currentHumidity);
+
+_playerDir = getDir ACE_player;
+
+GVAR(Direction) = 4 * floor(_playerDir / 90);
+if (_playerDir % 90 > 10) then { GVAR(Direction) = GVAR(Direction) + 1};
+if (_playerDir % 90 > 35) then { GVAR(Direction) = GVAR(Direction) + 1};
+if (_playerDir % 90 > 55) then { GVAR(Direction) = GVAR(Direction) + 1};
+if (_playerDir % 90 > 80) then { GVAR(Direction) = GVAR(Direction) + 1};
+GVAR(Direction) = GVAR(Direction) % 16;
+
+switch (GVAR(Menu)) do {
+ case 0: { // Direction
+ if (!GVAR(MinAvgMax)) then {
+ _textCenterBig = format["%1", format["%1 %2", GVAR(Directions) select GVAR(Direction), round(_playerDir)]];
+ } else {
+ _textCenterLine1Left = "Min";
+ _textCenterLine2Left = "Avg";
+ _textCenterLine3Left = "Max";
+ _textCenterLine1Right = "N/A";
+ _textCenterLine2Right = "N/A";
+ _textCenterLine3Right = "N/A";
+ };
+ };
+ case 1: { // Wind SPD
+ if (!GVAR(MinAvgMax)) then {
+ _textCenterBig = Str(round(abs(_windSpeed) * 10) / 10);
+ } else {
+ _textCenterLine1Left = "Max";
+ _textCenterLine2Left = "Avg";
+ switch (GVAR(MinAvgMaxMode)) do {
+ case 0: {
+ _textCenterLine1Right = "--. -";
+ _textCenterLine2Right = "--. -";
+ _textInfoLine2 = "- average";
+ };
+ case 1: {
+ _textCenterLine1Right = Str(round((GVAR(Max) select 1) * 10) / 10);
+ _textCenterLine2Right = Str(round((GVAR(Total) select 1) / (GVAR(Entries) select 1) * 10) / 10);
+ _textInfoLine2 = "- stop";
+ };
+ case 2: {
+ _textCenterLine1Right = Str(round((GVAR(Max) select 1) * 10) / 10);
+ _textCenterLine2Right = Str(round((GVAR(Total) select 1) / (GVAR(Entries) select 1) * 10) / 10);
+ _textInfoLine2 = "- clear";
+ };
+ };
+ };
+ };
+ case 2: { // CROSSWIND
+ if (!GVAR(MinAvgMax)) then {
+ if (missionNamespace getVariable [QEGVAR(advanced_ballistics,enabled), false]) then {
+ _textCenterBig = Str(round(abs(sin(GVAR(RefHeading) - _playerDir) * _windSpeed) * 10) / 10);
+ _textInfoLine1 = format["%1 m/s @ %2", round((cos(_playerDir - _windDir) * _windSpeed) * 10) / 10, round(_playerDir)];
+ } else {
+ _textCenterBig = Str(round(abs(sin(GVAR(RefHeading)) * _windSpeed) * 10) / 10);
+ _textInfoLine1 = format["%1 m/s @ %2", round(_windSpeed * 10) / 10, round(_windDir)];
+ };
+ _textInfoLine2 = "- set heading";
+ } else {
+ _textCenterLine1Left = "Max";
+ _textCenterLine2Left = "Avg";
+ switch (GVAR(MinAvgMax)Mode) do {
+ case 0: {
+ _textCenterLine1Right = "--. -";
+ _textCenterLine2Right = "--. -";
+ _textInfoLine2 = "- average";
+ };
+ case 1: {
+ _textCenterLine1Right = Str(round((GVAR(Max) select 2) * 10) / 10);
+ _textCenterLine2Right = Str(round((GVAR(Total) select 2) / (GVAR(Entries) select 2) * 10) / 10);
+ _textInfoLine2 = "- stop";
+ };
+ case 2: {
+ _textCenterLine1Right = Str(round((GVAR(Max) select 2) * 10) / 10);
+ _textCenterLine2Right = Str(round((GVAR(Total) select 2) / (GVAR(Entries) select 2) * 10) / 10);
+ _textInfoLine2 = "- clear";
+ };
+ };
+ };
+ };
+ case 3: { // HEADWIND
+ if (!GVAR(MinAvgMax)) then {
+ if (missionNamespace getVariable [QEGVAR(advanced_ballistics,enabled), false]) then {
+ _textCenterBig = Str(round(abs(cos(GVAR(RefHeading) - _playerDir) * _windSpeed) * 10) / 10);
+ _textInfoLine1 = format["%1 m/s @ %2", round((cos(_playerDir - _windDir) * _windSpeed) * 10) / 10, round(_playerDir)];
+ } else {
+ _textCenterBig = Str(round(abs(cos(GVAR(RefHeading)) * _windSpeed) * 10) / 10);
+ _textInfoLine1 = format["%1 m/s @ %2", round(_windSpeed * 10) / 10, round(_windDir)];
+ };
+ _textInfoLine2 = "- set heading";
+ } else {
+ _textCenterLine1Left = "Max";
+ _textCenterLine2Left = "Avg";
+ switch (GVAR(MinAvgMax)Mode) do {
+ case 0: {
+ _textCenterLine1Right = "--. -";
+ _textCenterLine2Right = "--. -";
+ _textInfoLine2 = "- average";
+ };
+ case 1: {
+ _textCenterLine1Right = Str(round((GVAR(Max) select 3) * 10) / 10);
+ _textCenterLine2Right = Str(round((GVAR(Total) select 3) / (GVAR(Entries) select 3) * 10) / 10);
+ _textInfoLine2 = "- stop";
+ };
+ case 2: {
+ _textCenterLine1Right = Str(round((GVAR(Max) select 3) * 10) / 10);
+ _textCenterLine2Right = Str(round((GVAR(Total) select 3) / (GVAR(Entries) select 3) * 10) / 10);
+ _textInfoLine2 = "- clear";
+ };
+ };
+ };
+ };
+ case 4: { // TEMP
+ if (!GVAR(MinAvgMax)) then {
+ _textCenterBig = Str(round(_temperature * 10) / 10);
+ } else {
+ _textCenterLine1Left = "Min";
+ _textCenterLine2Left = "Avg";
+ _textCenterLine3Left = "Max";
+ _textCenterLine1Right = Str(round((GVAR(Min) select 4) * 10) / 10);
+ _textCenterLine2Right = Str(round((GVAR(Total) select 4) / (GVAR(Entries) select 4) * 10) / 10);
+ _textCenterLine3Right = Str(round((GVAR(Max) select 4) * 10) / 10);
+ };
+ };
+ case 5: { // HUMIDITY
+ if (!GVAR(MinAvgMax)) then {
+ _textCenterBig = Str(round(_humidity * 100 * 10) / 10);
+ } else {
+ _textCenterLine1Left = "Min";
+ _textCenterLine2Left = "Avg";
+ _textCenterLine3Left = "Max";
+ _textCenterLine1Right = Str(round((GVAR(Min) select 5) * 10) / 10);
+ _textCenterLine2Right = Str(round((GVAR(Total) select 5) / (GVAR(Entries) select 5) * 10) / 10);
+ _textCenterLine3Right = Str(round((GVAR(Max) select 5) * 10) / 10);
+ };
+ };
+ case 6: { // BARO
+ if (!GVAR(MinAvgMax)) then {
+ _textCenterBig = Str(round((1013.25 * exp(-(EGVAR(weather,Altitude) + ((getPosASL ACE_player) select 2)) / 7990) - 10 * overcast) * 10) / 10);
+ } else {
+ _textCenterLine1Left = "Min";
+ _textCenterLine2Left = "Avg";
+ _textCenterLine3Left = "Max";
+ _textCenterLine1Right = Str(round((GVAR(Min) select 6) * 10) / 10);
+ _textCenterLine2Right = Str(round((GVAR(Total) select 6) / (GVAR(Entries) select 6) * 10) / 10);
+ _textCenterLine3Right = Str(round((GVAR(Max) select 6) * 10) / 10);
+ };
+ };
+ case 7: { // ALTITUDE
+ if (!GVAR(MinAvgMax)) then {
+ _textCenterBig = Str(round(EGVAR(weather,Altitude) + ((getPosASL ACE_player) select 2)));
+ } else {
+ _textCenterLine1Left = "Min";
+ _textCenterLine2Left = "Avg";
+ _textCenterLine3Left = "Max";
+ _textCenterLine1Right = Str(round(GVAR(Min) select 7));
+ _textCenterLine2Right = Str(round((GVAR(Total) select 7) / (GVAR(Entries) select 7)));
+ _textCenterLine3Right = Str(round(GVAR(Max) select 7));
+ };
+ };
+ case 8: { // User Screen 1
+ _textCenterLine1Left = Str(round(_playerDir));
+ _textCenterLine2Left = Str(round(EGVAR(weather,Altitude) + ((getPosASL ACE_player) select 2)));
+ _textCenterLine3Left = Str(round(abs(_windSpeed) * 10) / 10);
+ _textCenterLine1Right = GVAR(Directions) select GVAR(Direction);
+ _textCenterLine2Right = "m";
+ _textCenterLine3Right = "m/s";
+ };
+ case 9: { // User Screen 2
+ _textCenterLine1Left = Str(round(_temperature * 10) / 10);
+ _textCenterLine2Left = Str(round(_humidity * 100 * 10) / 10);
+ _textCenterLine3Left = Str(round((1013.25 * exp(-(EGVAR(weather,Altitude) + ((getPosASL ACE_player) select 2)) / 7990) - 10 * overcast) * 10) / 10);
+ _textCenterLine1Right = "C";
+ _textCenterLine2Right = "%";
+ _textCenterLine3Right = "hPA";
+ };
+};
+
+[_textTop, _textCenterBig, _textCenterLine1Left, _textCenterLine2Left, _textCenterLine3Left, _textCenterLine1Right, _textCenterLine2Right, _textCenterLine3Right, _textInfoLine1, _textInfoLine2]
diff --git a/addons/kestrel4500/functions/fnc_measureWindSpeed.sqf b/addons/kestrel4500/functions/fnc_measureWindSpeed.sqf
new file mode 100644
index 0000000000..7c18499e7d
--- /dev/null
+++ b/addons/kestrel4500/functions/fnc_measureWindSpeed.sqf
@@ -0,0 +1,42 @@
+/*
+ * Author: Ruthberg
+ * Measures the wind speed, stores the information in GVAR(MeasuredWindSpeed) and updates GVAR(ImpellerState)
+ *
+ * Arguments:
+ * Nothing
+ *
+ * Return Value:
+ * wind speed
+ *
+ * Example:
+ *
+ * Public: No
+ */
+#include "script_component.hpp"
+#include "defines.h"
+
+private ["_playerDir", "_windSpeed", "_windDir"];
+
+_playerDir = getDir ACE_player;
+_windSpeed = vectorMagnitude ACE_wind;
+_windDir = (ACE_wind select 0) atan2 (ACE_wind select 1);
+
+if (missionNamespace getVariable [QEGVAR(advanced_ballistics,enabled), false]) then {
+ _windSpeed = (eyePos ACE_player) call EFUNC(advanced_ballistics,calculateWindSpeed);
+ _windSpeed = abs(cos(_playerDir - _windDir)) * _windSpeed;
+} else {
+ _windSpeed = (eyePos ACE_player) call FUNC(calculateWindSpeed);
+};
+
+hintSilent format["%1, %2", GVAR(MeasuredWindSpeed), _windSpeed];
+
+if (_windSpeed > 0.3 || {GVAR(MeasuredWindSpeed) > 0.1 && _windSpeed > 0.125}) then {
+ GVAR(MeasuredWindSpeed) = _windSpeed;
+} else {
+ GVAR(MeasuredWindSpeed) = GVAR(MeasuredWindSpeed) * 0.99;
+ if (GVAR(MeasuredWindSpeed) < 0.05) then {
+ GVAR(MeasuredWindSpeed) = 0;
+ };
+};
+
+GVAR(MeasuredWindSpeed)
diff --git a/addons/kestrel4500/functions/fnc_updateDisplay.sqf b/addons/kestrel4500/functions/fnc_updateDisplay.sqf
new file mode 100644
index 0000000000..0f8be4f873
--- /dev/null
+++ b/addons/kestrel4500/functions/fnc_updateDisplay.sqf
@@ -0,0 +1,33 @@
+/*
+ * Author: Ruthberg
+ * Updates the Kestrel 4500 dialog text boxes.
+ *
+ * Arguments:
+ * Nothing
+ *
+ * Return Value:
+ * Nothing
+ *
+ * Example:
+ *
+ * Public: No
+ */
+#include "script_component.hpp"
+
+private ["_outputData"];
+
+_outputData = [] call FUNC(generateOutputData);
+
+ctrlSetText [74100, _outputData select 0];
+ctrlSetText [74200, _outputData select 1];
+
+ctrlSetText [74300, _outputData select 2];
+ctrlSetText [74301, _outputData select 3];
+ctrlSetText [74302, _outputData select 4];
+
+ctrlSetText [74303, _outputData select 5];
+ctrlSetText [74304, _outputData select 6];
+ctrlSetText [74305, _outputData select 7];
+
+ctrlSetText [74400, _outputData select 8];
+ctrlSetText [74401, _outputData select 9];
\ No newline at end of file
diff --git a/addons/kestrel4500/functions/fnc_updateImpellerState.sqf b/addons/kestrel4500/functions/fnc_updateImpellerState.sqf
new file mode 100644
index 0000000000..075ed80080
--- /dev/null
+++ b/addons/kestrel4500/functions/fnc_updateImpellerState.sqf
@@ -0,0 +1,22 @@
+/*
+ * Author: Ruthberg
+ * Updates the Kestrel 4500 Impeller state
+ *
+ * Arguments:
+ * Nothing
+ *
+ * Return Value:
+ * Nothing
+ *
+ * Example:
+ *
+ * Public: No
+ */
+#include "script_component.hpp"
+
+private ["_windSpeed"];
+
+_windSpeed = call FUNC(measureWindSpeed);
+
+GVAR(ImpellerState) = GVAR(ImpellerState) + (ceil(_windSpeed) min 1) max _windSpeed;
+if (GVAR(ImpellerState) > 1000) then { GVAR(ImpellerState) = 0 };
diff --git a/addons/kestrel4500/functions/script_component.hpp b/addons/kestrel4500/functions/script_component.hpp
new file mode 100644
index 0000000000..32c774cd89
--- /dev/null
+++ b/addons/kestrel4500/functions/script_component.hpp
@@ -0,0 +1 @@
+#include "\z\ace\addons\kestrel4500\script_component.hpp"
\ No newline at end of file
diff --git a/addons/kestrel4500/initKeybinds.sqf b/addons/kestrel4500/initKeybinds.sqf
new file mode 100644
index 0000000000..657e10d907
--- /dev/null
+++ b/addons/kestrel4500/initKeybinds.sqf
@@ -0,0 +1,23 @@
+["ACE3", QGVAR(KestrelDialogKey), localize "STR_ACE_Kestrel4500_KestrelDialogKey",
+{
+ // Conditions: canInteract
+ if !([ACE_player, objNull, []] call EFUNC(common,canInteractWith)) exitWith {false};
+
+ // Statement
+ [] call FUNC(createKestrelDialog);
+ false
+},
+{false},
+[70, [false, false, false]], false, 0] call CBA_fnc_addKeybind; // (SCROLL)
+
+["ACE3", QGVAR(DisplayKestrelKey), localize "STR_ACE_Kestrel4500_DisplayKestrelKey",
+{
+ // Conditions: canInteract
+ if !([ACE_player, objNull, []] call EFUNC(common,canInteractWith)) exitWith {false};
+
+ // Statement
+ [] call FUNC(displayKestrel);
+ false
+},
+{false},
+[70, [true, false, false]], false, 0] call CBA_fnc_addKeybind; // (SHIFT + SCROLL)
diff --git a/addons/kestrel4500/kestrel4500.p3d b/addons/kestrel4500/kestrel4500.p3d
new file mode 100644
index 0000000000..bb4edd2706
Binary files /dev/null and b/addons/kestrel4500/kestrel4500.p3d differ
diff --git a/addons/kestrel4500/script_component.hpp b/addons/kestrel4500/script_component.hpp
new file mode 100644
index 0000000000..3c4d599c2a
--- /dev/null
+++ b/addons/kestrel4500/script_component.hpp
@@ -0,0 +1,12 @@
+#define COMPONENT kestrel4500
+#include "\z\ace\addons\main\script_mod.hpp"
+
+#ifdef DEBUG_ENABLED_KESTREL4500
+ #define DEBUG_MODE_FULL
+#endif
+
+#ifdef DEBUG_SETTINGS_KESTREL4500
+ #define DEBUG_SETTINGS DEBUG_SETTINGS_KESTREL4500
+#endif
+
+#include "\z\ace\addons\main\script_macros.hpp"
\ No newline at end of file
diff --git a/addons/kestrel4500/sound/kestrel_bottom_button_click.wav b/addons/kestrel4500/sound/kestrel_bottom_button_click.wav
new file mode 100644
index 0000000000..1f5a2ddeb1
Binary files /dev/null and b/addons/kestrel4500/sound/kestrel_bottom_button_click.wav differ
diff --git a/addons/kestrel4500/sound/kestrel_center_button_click.wav b/addons/kestrel4500/sound/kestrel_center_button_click.wav
new file mode 100644
index 0000000000..ce34a645c3
Binary files /dev/null and b/addons/kestrel4500/sound/kestrel_center_button_click.wav differ
diff --git a/addons/kestrel4500/sound/kestrel_exit_button_click.wav b/addons/kestrel4500/sound/kestrel_exit_button_click.wav
new file mode 100644
index 0000000000..1f5a2ddeb1
Binary files /dev/null and b/addons/kestrel4500/sound/kestrel_exit_button_click.wav differ
diff --git a/addons/kestrel4500/sound/kestrel_left_button_click.wav b/addons/kestrel4500/sound/kestrel_left_button_click.wav
new file mode 100644
index 0000000000..a880e76dc1
Binary files /dev/null and b/addons/kestrel4500/sound/kestrel_left_button_click.wav differ
diff --git a/addons/kestrel4500/sound/kestrel_right_button_click.wav b/addons/kestrel4500/sound/kestrel_right_button_click.wav
new file mode 100644
index 0000000000..14ff2e0689
Binary files /dev/null and b/addons/kestrel4500/sound/kestrel_right_button_click.wav differ
diff --git a/addons/kestrel4500/sound/kestrel_top_button_click.wav b/addons/kestrel4500/sound/kestrel_top_button_click.wav
new file mode 100644
index 0000000000..e4ef1df50d
Binary files /dev/null and b/addons/kestrel4500/sound/kestrel_top_button_click.wav differ
diff --git a/addons/kestrel4500/stringtable.xml b/addons/kestrel4500/stringtable.xml
new file mode 100644
index 0000000000..eeb2995dbb
--- /dev/null
+++ b/addons/kestrel4500/stringtable.xml
@@ -0,0 +1,35 @@
+
+
+
+
+ Kestrel 4500NV
+ Kestrel 4500NV
+ Kestrel 4500NV
+ Kestrel 4500NV
+ Kestrel 4500NV
+ Kestrel 4500NV
+ Kestrel 4500NV
+ Kestrel 4500NV
+ Kestrel 4500NV
+ Kestrel 4500NV
+
+
+ Kestrel 4500 Pocket Weather Tracker
+
+
+ Open Kestrel 4500
+
+
+ Show Kestrel 4500
+
+
+ Hide Kestrel 4500
+
+
+ Open Kestrel 4500
+
+
+ Show Kestrel 4500
+
+
+