From e97a51f1bb4622b88b06e09080d8dd438c605c2b Mon Sep 17 00:00:00 2001 From: PabstMirror Date: Tue, 27 Jan 2026 15:23:15 -0600 Subject: [PATCH 1/5] MILR - Prototype --- addons/milr/$PBOPREFIX$ | 1 + addons/milr/CfgEventHandlers.hpp | 15 +++ addons/milr/CfgJointRails.hpp | 18 ++++ addons/milr/CfgWeapons.hpp | 39 ++++++++ addons/milr/README.md | 8 ++ addons/milr/XEH_PREP.hpp | 5 + addons/milr/XEH_clientInit.sqf | 55 +++++++++++ addons/milr/XEH_preInit.sqf | 9 ++ addons/milr/XEH_preStart.sqf | 3 + addons/milr/config.cpp | 31 ++++++ addons/milr/data/ace_milr.p3d | Bin 0 -> 66287 bytes addons/milr/data/plastic.rvmat | 92 ++++++++++++++++++ addons/milr/dev/blender_mem.py | 58 +++++++++++ addons/milr/dev/rails.py | 28 ++++++ addons/milr/functions/fnc_display_init.sqf | 41 ++++++++ addons/milr/functions/fnc_display_refresh.sqf | 40 ++++++++ addons/milr/functions/fnc_getRange.sqf | 31 ++++++ addons/milr/functions/fnc_keyPress.sqf | 42 ++++++++ addons/milr/functions/fnc_pfeh.sqf | 65 +++++++++++++ addons/milr/script_component.hpp | 27 +++++ .../functions/fnc_ballistics_calculator.sqf | 12 ++- .../functions/fnc_ballistics_getData.sqf | 24 +++-- 22 files changed, 626 insertions(+), 18 deletions(-) create mode 100644 addons/milr/$PBOPREFIX$ create mode 100644 addons/milr/CfgEventHandlers.hpp create mode 100644 addons/milr/CfgJointRails.hpp create mode 100644 addons/milr/CfgWeapons.hpp create mode 100644 addons/milr/README.md create mode 100644 addons/milr/XEH_PREP.hpp create mode 100644 addons/milr/XEH_clientInit.sqf create mode 100644 addons/milr/XEH_preInit.sqf create mode 100644 addons/milr/XEH_preStart.sqf create mode 100644 addons/milr/config.cpp create mode 100644 addons/milr/data/ace_milr.p3d create mode 100644 addons/milr/data/plastic.rvmat create mode 100644 addons/milr/dev/blender_mem.py create mode 100644 addons/milr/dev/rails.py create mode 100644 addons/milr/functions/fnc_display_init.sqf create mode 100644 addons/milr/functions/fnc_display_refresh.sqf create mode 100644 addons/milr/functions/fnc_getRange.sqf create mode 100644 addons/milr/functions/fnc_keyPress.sqf create mode 100644 addons/milr/functions/fnc_pfeh.sqf create mode 100644 addons/milr/script_component.hpp diff --git a/addons/milr/$PBOPREFIX$ b/addons/milr/$PBOPREFIX$ new file mode 100644 index 00000000000..85c833b6b80 --- /dev/null +++ b/addons/milr/$PBOPREFIX$ @@ -0,0 +1 @@ +z\ace\addons\milr diff --git a/addons/milr/CfgEventHandlers.hpp b/addons/milr/CfgEventHandlers.hpp new file mode 100644 index 00000000000..a86d374e7f5 --- /dev/null +++ b/addons/milr/CfgEventHandlers.hpp @@ -0,0 +1,15 @@ +class Extended_PreStart_EventHandlers { + class ADDON { + init = QUOTE(call COMPILE_SCRIPT(XEH_preStart)); + }; +}; +class Extended_PreInit_EventHandlers { + class ADDON { + init = QUOTE(call COMPILE_SCRIPT(XEH_preInit)); + }; +}; +class Extended_PostInit_EventHandlers { + class ADDON { + clientInit = QUOTE(call COMPILE_SCRIPT(XEH_clientInit)); + }; +}; diff --git a/addons/milr/CfgJointRails.hpp b/addons/milr/CfgJointRails.hpp new file mode 100644 index 00000000000..a76e4813f7f --- /dev/null +++ b/addons/milr/CfgJointRails.hpp @@ -0,0 +1,18 @@ +// lol +class SlotInfo; +class PointerSlot: SlotInfo { + compatibleItems[] += {QGVAR(base),QGVAR(000),QGVAR(002),QGVAR(004),QGVAR(006),QGVAR(008),QGVAR(010),QGVAR(012),QGVAR(014),QGVAR(016),QGVAR(018),QGVAR(020),QGVAR(022),QGVAR(024),QGVAR(026),QGVAR(028),QGVAR(030),QGVAR(032),QGVAR(034),QGVAR(036),QGVAR(038),QGVAR(040),QGVAR(042),QGVAR(044),QGVAR(046),QGVAR(048),QGVAR(050),QGVAR(052),QGVAR(054),QGVAR(056),QGVAR(058),QGVAR(060),QGVAR(062),QGVAR(064),QGVAR(066),QGVAR(068),QGVAR(070),QGVAR(072),QGVAR(074),QGVAR(076),QGVAR(078),QGVAR(080),QGVAR(082),QGVAR(084),QGVAR(086),QGVAR(088),QGVAR(090),QGVAR(092),QGVAR(094),QGVAR(096),QGVAR(098),QGVAR(100),QGVAR(110),QGVAR(120),QGVAR(130),QGVAR(140),QGVAR(150),QGVAR(160),QGVAR(170),QGVAR(180),QGVAR(190),QGVAR(200),QGVAR(210),QGVAR(220),QGVAR(230),QGVAR(240),QGVAR(250),QGVAR(260),QGVAR(270),QGVAR(280),QGVAR(290),QGVAR(300)}; +}; + +class PointerSlot_Rail: PointerSlot { + class compatibleItems { + GVAR(base)=1;GVAR(000)=1;GVAR(002)=1;GVAR(004)=1;GVAR(006)=1;GVAR(008)=1;GVAR(010)=1;GVAR(012)=1;GVAR(014)=1;GVAR(016)=1;GVAR(018)=1;GVAR(020)=1;GVAR(022)=1;GVAR(024)=1;GVAR(026)=1;GVAR(028)=1;GVAR(030)=1;GVAR(032)=1;GVAR(034)=1;GVAR(036)=1;GVAR(038)=1;GVAR(040)=1;GVAR(042)=1;GVAR(044)=1;GVAR(046)=1;GVAR(048)=1;GVAR(050)=1;GVAR(052)=1;GVAR(054)=1;GVAR(056)=1;GVAR(058)=1;GVAR(060)=1;GVAR(062)=1;GVAR(064)=1;GVAR(066)=1;GVAR(068)=1;GVAR(070)=1;GVAR(072)=1;GVAR(074)=1;GVAR(076)=1;GVAR(078)=1;GVAR(080)=1;GVAR(082)=1;GVAR(084)=1;GVAR(086)=1;GVAR(088)=1;GVAR(090)=1;GVAR(092)=1;GVAR(094)=1;GVAR(096)=1;GVAR(098)=1;GVAR(100)=1;GVAR(110)=1;GVAR(120)=1;GVAR(130)=1;GVAR(140)=1;GVAR(150)=1;GVAR(160)=1;GVAR(170)=1;GVAR(180)=1;GVAR(190)=1;GVAR(200)=1;GVAR(210)=1;GVAR(220)=1;GVAR(230)=1;GVAR(240)=1;GVAR(250)=1;GVAR(260)=1;GVAR(270)=1;GVAR(280)=1;GVAR(290)=1;GVAR(300)=1; + }; +}; + +class asdg_SlotInfo; +class asdg_FrontSideRail: asdg_SlotInfo { + class compatibleItems { + GVAR(base)=1;GVAR(000)=1;GVAR(002)=1;GVAR(004)=1;GVAR(006)=1;GVAR(008)=1;GVAR(010)=1;GVAR(012)=1;GVAR(014)=1;GVAR(016)=1;GVAR(018)=1;GVAR(020)=1;GVAR(022)=1;GVAR(024)=1;GVAR(026)=1;GVAR(028)=1;GVAR(030)=1;GVAR(032)=1;GVAR(034)=1;GVAR(036)=1;GVAR(038)=1;GVAR(040)=1;GVAR(042)=1;GVAR(044)=1;GVAR(046)=1;GVAR(048)=1;GVAR(050)=1;GVAR(052)=1;GVAR(054)=1;GVAR(056)=1;GVAR(058)=1;GVAR(060)=1;GVAR(062)=1;GVAR(064)=1;GVAR(066)=1;GVAR(068)=1;GVAR(070)=1;GVAR(072)=1;GVAR(074)=1;GVAR(076)=1;GVAR(078)=1;GVAR(080)=1;GVAR(082)=1;GVAR(084)=1;GVAR(086)=1;GVAR(088)=1;GVAR(090)=1;GVAR(092)=1;GVAR(094)=1;GVAR(096)=1;GVAR(098)=1;GVAR(100)=1;GVAR(110)=1;GVAR(120)=1;GVAR(130)=1;GVAR(140)=1;GVAR(150)=1;GVAR(160)=1;GVAR(170)=1;GVAR(180)=1;GVAR(190)=1;GVAR(200)=1;GVAR(210)=1;GVAR(220)=1;GVAR(230)=1;GVAR(240)=1;GVAR(250)=1;GVAR(260)=1;GVAR(270)=1;GVAR(280)=1;GVAR(290)=1;GVAR(300)=1; + }; +}; diff --git a/addons/milr/CfgWeapons.hpp b/addons/milr/CfgWeapons.hpp new file mode 100644 index 00000000000..77e39fcc405 --- /dev/null +++ b/addons/milr/CfgWeapons.hpp @@ -0,0 +1,39 @@ +#pragma hemtt suppress pw3_padded_arg file +#define CONCAT(a,b) a####b +#define ZERO(NUM) class GVAR(NUM): GVAR(base) { \ + scope = 1; \ + class ItemInfo: InventoryFlashLightItem_Base_F { \ + mass = 4; \ + class Pointer { \ + irLaserPos = "laser pos"; \ + irLaserEnd = QUOTE(CONCAT(laser ,NUM)); \ + irDistance = 5; \ + }; \ + class FlashLight {}; \ + }; \ +} + +class CfgWeapons { + class ItemCore; + class InventoryFlashLightItem_Base_F; + class GVAR(base): ItemCore { + scope = 2; + inertia = 0.1; + author = ECSTRING(common,ACETeam); + displayName = "MILR"; + descriptionUse = "y"; + descriptionShort = "z"; + picture = "\A3\weapons_F\Data\UI\gear_accv_pointer_CA.paa"; + model = QPATHTOF(data\ace_milr.p3d); + class ItemInfo: InventoryFlashLightItem_Base_F { // do not use inheritance on ItemInfo/Pointer as it breaks something + mass = 7; // big chonky box + class Pointer { + irLaserPos = "laser pos"; + irLaserEnd = "laser dir"; + irDistance = 5; + }; + class FlashLight {}; + }; + }; + ZERO(000);ZERO(002);ZERO(004);ZERO(006);ZERO(008);ZERO(010);ZERO(012);ZERO(014);ZERO(016);ZERO(018);ZERO(020);ZERO(022);ZERO(024);ZERO(026);ZERO(028);ZERO(030);ZERO(032);ZERO(034);ZERO(036);ZERO(038);ZERO(040);ZERO(042);ZERO(044);ZERO(046);ZERO(048);ZERO(050);ZERO(052);ZERO(054);ZERO(056);ZERO(058);ZERO(060);ZERO(062);ZERO(064);ZERO(066);ZERO(068);ZERO(070);ZERO(072);ZERO(074);ZERO(076);ZERO(078);ZERO(080);ZERO(082);ZERO(084);ZERO(086);ZERO(088);ZERO(090);ZERO(092);ZERO(094);ZERO(096);ZERO(098);ZERO(100);ZERO(110);ZERO(120);ZERO(130);ZERO(140);ZERO(150);ZERO(160);ZERO(170);ZERO(180);ZERO(190);ZERO(200);ZERO(210);ZERO(220);ZERO(230);ZERO(240);ZERO(250);ZERO(260);ZERO(270);ZERO(280);ZERO(290);ZERO(300); +}; diff --git a/addons/milr/README.md b/addons/milr/README.md new file mode 100644 index 00000000000..43fe0093b05 --- /dev/null +++ b/addons/milr/README.md @@ -0,0 +1,8 @@ +ace_milr +========== + +IR Pointer capable of rangefinding and adjusting beam zero based on ballistic calculations + + +#### Items Added: +`ace_milr_base` diff --git a/addons/milr/XEH_PREP.hpp b/addons/milr/XEH_PREP.hpp new file mode 100644 index 00000000000..52af24297c0 --- /dev/null +++ b/addons/milr/XEH_PREP.hpp @@ -0,0 +1,5 @@ +PREP(display_init); +PREP(display_refresh); +PREP(getRange); +PREP(keyPress); +PREP(pfeh); diff --git a/addons/milr/XEH_clientInit.sqf b/addons/milr/XEH_clientInit.sqf new file mode 100644 index 00000000000..d4e87dc43f0 --- /dev/null +++ b/addons/milr/XEH_clientInit.sqf @@ -0,0 +1,55 @@ +#include "script_component.hpp" +#include "\a3\ui_f\hpp\defineDIKCodes.inc" + +if (!hasInterface) exitWith {}; + +GVAR(currentPointer) = ""; +GVAR(pfid) = -1; +GVAR(data) = createHashMap; + +["ACE3 Equipment", QGVAR(range), [format ["MILR - %1", localize "str_a3_rscdisplayarsenal_stat_range"]], { + ["range", true] call FUNC(keyPress); +}, { + ["range", false] call FUNC(keyPress); +}, [DIK_TAB, [false, false, false]], false, 0] call CBA_fnc_addKeybind; + +private _fnc_updatePointer = { + params ["_player"]; + private _pointer = (_player weaponAccessories (currentWeapon _player)) param [1, ""]; + if (_pointer == GVAR(currentPointer)) exitWith {}; // fast exit if no change + GVAR(currentPointer) = _pointer; + + if (_pointer isKindOf [QGVAR(base), configFile >> "CfgWeapons"]) then { + if (GVAR(pfid) == -1) then { + TRACE_1("Adding PFEH",_pointer); + GVAR(pfid) = [LINKFUNC(pfeh), 0, []] call CBA_fnc_addPerFrameHandler; + }; + } else { + if (GVAR(pfid) != -1) then { + TRACE_1("Stopping PFEH",_pointer); + [GVAR(pfid)] call CBA_fnc_removePerFrameHandler; + GVAR(pfid) = -1; + }; + }; +}; +["loadout", _fnc_updatePointer] call CBA_fnc_addplayerEventHandler; +["weapon", _fnc_updatePointer, true] call CBA_fnc_addplayerEventHandler; + + +#ifdef ENABLE_QUICK_TESTING +player addPrimaryWeaponItem "ace_milr_base"; +[player] call CBA_fnc_addUnitTrackProjectiles; +player addItem "ace_rangecard"; + +["recompile", "recompile", "recompile", { + private _start = diag_tickTime; + [] call ACE_PREP_RECOMPILE; + [] call ace_common_fnc_dumpPerformanceCounters; + private _end = diag_tickTime; + systemChat format ["recompile took [%1 ms]", (1000 * (_end - _start)) toFixed 1]; + if (productVersion #4 == "Diag") then { + call compile "diag_mergeConfigFile ['P:\z\ace\addons\milr\config.cpp']"; + }; + false +}, {false}, [0x21, [false, false, false]], false] call CBA_fnc_addKeybind; // F Key +#endif diff --git a/addons/milr/XEH_preInit.sqf b/addons/milr/XEH_preInit.sqf new file mode 100644 index 00000000000..b47cf6628db --- /dev/null +++ b/addons/milr/XEH_preInit.sqf @@ -0,0 +1,9 @@ +#include "script_component.hpp" + +ADDON = false; + +PREP_RECOMPILE_START; +#include "XEH_PREP.hpp" +PREP_RECOMPILE_END; + +ADDON = true; diff --git a/addons/milr/XEH_preStart.sqf b/addons/milr/XEH_preStart.sqf new file mode 100644 index 00000000000..022888575ed --- /dev/null +++ b/addons/milr/XEH_preStart.sqf @@ -0,0 +1,3 @@ +#include "script_component.hpp" + +#include "XEH_PREP.hpp" diff --git a/addons/milr/config.cpp b/addons/milr/config.cpp new file mode 100644 index 00000000000..26eb61a8da3 --- /dev/null +++ b/addons/milr/config.cpp @@ -0,0 +1,31 @@ +#include "script_component.hpp" + +class CfgPatches { + class ADDON { + name = COMPONENT_NAME; + units[] = {}; + weapons[] = {QGVAR(base)}; + requiredVersion = REQUIRED_VERSION; + requiredAddons[] = {"ace_interaction"}; + author = ECSTRING(common,ACETeam); + authors[] = {"PabstMirror"}; + url = ECSTRING(main,URL); + VERSION_CONFIG; + }; +}; + +#include "CfgEventHandlers.hpp" +#include "CfgWeapons.hpp" +#include "CfgJointRails.hpp" + +class GVAR(display) { + onLoad = QUOTE(call FUNC(display_init)); + idd = -1; + class Controls {}; +}; +class RscStructuredText; +class GVAR(structuredText): RscStructuredText { + colorText[] = {0.7,0.7,0.7,1}; + size = 0.05; // not safezone scaled + shadow = 0; +}; diff --git a/addons/milr/data/ace_milr.p3d b/addons/milr/data/ace_milr.p3d new file mode 100644 index 0000000000000000000000000000000000000000..803c1840596f4a01bd8398cad0e395b6fafe3cc0 GIT binary patch literal 66287 zcmeI5378etmB(L$f`W<$w;++0Ru)CV(kzPo>LE6uvI*{@>>>(60OK0cBqr{Y7?r3K z9W%)oV;qvPL6V8ksKlU29L<<$q7!2@#*ERZV>V-8{=cewin_09`gOloo%z10;yZoL z|K3~oo;v3)=iXQEF?rI|6RN6mxz4#fSzL#h4Y( zO*_u;U%uV>xXWL;A;$OJaoL!mYtM`EnpszmdE$eMV*KMPZyqzFa9NCRs{YED{To)t zxb~iJk2(IgpNaAK{?Cj#Wyp0gzI4kQV>*r4(cWc`f37as{smvXy>4YfziF#)uIrpA zUvtzgb<-2|-P(9--MB=1pXzYCoxQGnZd8cLNB=!9{6vg-zWZih9%G*W`X4WkG4?q+cVUdN-&uuOF~+`6 ze=t47w1@piudRRIPdR^qL;E;?fw9k-&R<~cbE5MX82j{c{RfPF<~o0YvCq$(zrfgMtn(Kb z`>am1kA0H*VV@vT9{W6(s1N(hNwkN3lKNnui3xqN&l!p5!9IJq=j|$eu*VYDU-l5j zUjOa-6ZzZL2*e9tE_DkxEeeHR8UhHqrJ5l{{!{JXJ*Klh-?B7RCIoiYI zkKDAZE}5Uic7N5DC&n;7?f#s@c7HOT`z`;yC+{A<=6iF3x6XbiUy8hFSf|`v#@R6RzLC7TaK>QsmzaI;?h(o^>xhb18DKAKX3sn(xhN8gR}#`BLQL zhCkc*!P)O@`n>KbMV=u0_jrG0)4tNF6!`_&|AH;6nl9M1wXPKTjl25SJ|kaUB%hTc z&rtvQf^5Hs`cEnH!C&s*==9%Iiu{J`ufDd4K39r7=8E-=uK#bkz3=_8e3Rrm<@1+h z>me#*GSB$H#;qF{yXS39e&COFWapWpVKSbkmdETs=q`YS49@+A{4 zd2o^ZJ89F_jb|>J8_O3+zEJ7sDE+f4WAdJ>Z+eht9jIsS_V$`sK0q?#bd=KfR~eIE zU-A3KKYe%W#*eA4cfZkNoyl)W{%~ZsreCRy$*&JOY~2*~&93UBrN|nC>)d#3Dn;(J z^zlYF-kTQ4<|Z$bJY2S!D;xDt8I!**TivDpx&4*;rpd!Ptuy&7$=4`-U){4&WlaA4 zUH#V`^6=I=dtQ^@*7F7$7qUy!n<``SeXD0Ry7_QZDKc}L=CvT=t;=s~e(S1!b*pqO zMP|Get(iWPI|Kba^xzv4x;CP!fTDEY7Xq8F;$9O zO1o`+#$=tzdz0zq%Ab*MuNP6zYA4gyHInf==_7kJjF|V!CmNG7Ws>RN{Kmi$FS__4 zDX&eWZ(DZnhM{i_9YsCcB@c6QG9BATR}_=%N>2K#*gnr*np<~Z_pgNGac6RId26+$ zbaZY@nPhq7<-eIY^8Q~QKC&g5b`O2(mm}v+Ulx|>BYB>a`$}Hu-iAn zJ4-&dNZzLOo#~mh6*@fhje+Ye-dmrLEj?L2DJSiNT=$Eq>qoxverV@{>{*KIe_m^X=9$o6Ey-3-(w;3nZ*l#0FXeB)@%0glcN-k)e5d3kk~MdE>B;gt zlUu5PXX*A_)U#_jYAIPqYjSd~Y)yXQueYwJ1=ZP9icHz0ty`DdHt)$7O|%hRt;@Tq z;D@bvE|-7k(|^bxEUY7DuKX1%{+vHnLMPF+%QlDj7|EPVKRax5ex1ro%+(B-vwY#) zL8J9=_`rEf7cX5tV94MhLxv3E?}+g4&_P274;eIX>A>6-Gv~}(FmulQ`AaWeF>}eH z#mi^TpR;n#%w>z`tXR2d-r(gQUovN94$V#w!AITQC%Ej4ZTWGMcNe{I{Gq|OyKm1Q zCb^5lHCGgZYRO$i)0gxK&d-kxXNYt(>!nuq5b4TqoAGWQ8}1px$cEUco5*Z5T5@;M zPxsm!mY0~4&3dZly{KNAt?m5#Jeuwu!bnpz*+*oWXxY#82=h1RA5eM3bZpjJHSa50 zcwldNrVxBc@_wS)|NOpMEd=yA(jwdtU{9VVDj$u5bTq41EBlKc{(hf;9#6kJKxF-{ zTJnLSTy8dfD(Is>2LXjCkCcvPw90s#c*SFRdN^9q*S_@Zmi&>Uw3AWKz$+HeJi;NK2EW#|oyl=AvAHAUMEst%^v(8FPNi*hqR-kYuec+}% z>j7&ec;Z#p=dma82L0|NVLXX;p|@3DVoI7FubQz7W09G3tYqe_r+(HuVE$r;pm{L! z8#4%lmh#NR5>wKQaaIr!OJEbmA=(j-U47# z!`Kip9h=ePCxtCVJ)YQWvcq_j8Dxrx)#_SdM#NN+jR=V;X+~5yjp{Yi@|V@>6p^h~ z%w5wRW;J4Nn;{}f!ln{a(yW_mK9%Y%$pgesx$L zF&%HRdY>7#v^kGvtW;--h_2DBljO6*{9L}1o4?L+nDU6}XvS`1riigdD@4=hirm-? z*Ua-`+>mE|m?fh8&ksp6)*zypEg}*m$|2&JBVrw;W%gBbMXZxz;f`*eIOV}y>DY`2 zXugPbksgkw3q+=ASIOr)EEeuP7m8CJ%$1I2%n}!b_0JBNB^axV9A^GvEM6$GvB)fP zk;rBdi79Eu%(_@)Gb=V+A~G9xk$kbkV&VRMDMC&o#9iswjDEFDWc`ZB`(q-vzsy%j zULNCUKfglQ`klm-Y{o3HQe?9PEBqxQTj4uP{;5Yy3&UGP<|CHCCJxSw!XEFel;C9)WnDDsmcJGGLS zf@XN?L!t(e#rX|!v;KE`RTPKT(K8$`B$ zB=)#bWU&Xa#Z4iOVvB<0e{eXx{U-g4`Rj8co4=TOKQFSGm$7=Yh<;{cHH3*jmG5V0 zMi2i&*vgI`ev8A;t-dro*}GNPY2HC20L{2=3;%A;qX{$V8qunLoAcWTULNcr`HLdf zh+}@b<1-~C#aB8uLzCM@rU}~KA-eMR&G{D|xgubc+)3IgkK{KVb5#f0jF$f~(emz+ zza;wilOE02e)`1=uF#7^dwC)#Co_&MF6jmq3A*<0hL~eBo(Ch&bnjNcI0?q$bgeI%i?<6+6DsMA1 zqvf?CYk6n>9v0aM3A2j+q|?vPWMkM;b$})xk-SOth-_B%)A8Y%W0P>C zSro&D#S?$h(F~hx7MV@Z^brv@MAP1q9u;-GX4vR4k=f`_$y>l00sZpz;pds(6K1TA zdwg66&KiBx>f?!)t0jM5WS`)(BiSlS?nnf^D;;mr@)II!xv%6WMa&ZHm1-paK*XBB z=K&I%UFm2>%RdxZ%k--siL77Y?WaWMZHdjUbTnfp{2!tywkQPqOMY5J6oie~89yVk zow3AbS2~)Z$&W>*$pMo8Q$*y5H__}_QO9eBCO=7Na-ig&iiob+gQMAVqK?;$mY+|w z%n8iTM8vSn672eZE+TU5xN{9wCp39MWSV?f@{1z&PRwU$_Ftlo*9=X5Au>&RNq$MR zO8ZS#Cp7z|sN*$bzxlEVO^7Xsz<(vO9SQq{S46gBk=X1?XKYrfomWM+BViW#b&Lz4 z&0Z7kc$=}J|3+jhI+5b*B8wD>-+n8yNK#_6D;=A$2K=|k)&S=GH$*n)vwHnbWUH6N zW>-3zVUssSW)mXGx5Bog7#5rUUSu{6vx@$tqZu}OTVyusBl#VXMLpQ;T~Wu|>g#THTe5Xaw zyVB7NP5vS>O^%WLzR2FVJXZ2wMalDjLGMaOGg|&YWG#=8{5O$(GI5;bZ6a29dq+>u zyVB8&mbZ(n4&=sGeYc?9hAH(Z!^}& z-lE;rvPIVnzAiD&1!&qep((4^9x+bqGZdmAG}$wu$yniT!mJ6rv2?s}cVSj5yeru3 zs=Uq6jF$IGv^-9DZ((Ludi)8(`v~)CwY_hqB=1T`Gg|JEXt`c^UtxPU6wUV&?s%J_ z$%hh}j2G@HY;Rzq+5UeQ&Cuk4geDV&4+Oh+MGL|Q33JZTabuHyRuCPWX!&U24?D~{ z$_VKt9F5(MTsP6=kc1{5749u;Zzv5G{z$A@be63o?@DI`V3R}RmU97`_DN`pX4P?i zM{0(R4pYl!qanh5!R}qqp~5x7$#+_m2;vws#NEY{cJ1Gc*~Q(Bw$rQNs4-?@_{|h3(xc!Dd%F{fw56Nwhpj_*h|k z>x*6A7-8G>Ar)WgXvW^@IHw8U-eAX4Cu}-c>Dn((@aX~K@BAZ$ApG#mSO z(Tq6%c(rUh5_6aJ9<=B=ILikgdY%=7=A13;z$!m;o+1gv1R~2E--Y+uv+(L;3bO&=r;sr z@#6ur<}X^IpANWu(44vRG)0{{cEW_Jni&_&S-z}({=x+-YI2)*r;g~IVt6P1=-MM< z;oGZ-%wIH2I($#ZIne|6be!3RIyixV(=*`Q2Pe)Wk90WmBr$4{@9*S(;^^AV@$QcAsSu|0N&@9+3Qj`JL( zGrLoUbojxJ^I0som*bovQ^x_0QyxqgBke%PNe6Q}P8t|aEQ(D1aL)CSX$Ma1icEX( zW1Ku%9GjvqoX?@)1rcdrc#Y!>3(^jCypQ9DIZiq9Cx|FRK772Bs~x92dG(@d5g2}g zllwYOedLW3kp_kz@8q%Khl`GIoc;!;|H0{(@PUpGc6^jL_mB=}9KZ)Tjz7SZqfY9B zs1M>k=t#%89~ll&4}FyO;Pe+b_JbEh9jeZ8F|G|elPC4>Ohv=_x@{!>X z{TxntWH`^n^T6>toc=|caoQ)3{sE`oz{w{K4AH;f^gB5Dq=BJ2$4N(qQ+L5}{07F4 zaQa6f!RbGgAs@p3@Dm)bcbxmkBOM|gA|0ZhiJ}u7Kgsb)F70H;CySE@hEH+wRB_6Z z4<{X&bYyr{&9vo9mn~Sn^75KogYcY7RxX{l;Nq1FmJ77w!oTHQRW+xbK4Zbkn%vdh z<7&bm&k+iLB*!+e_Hm?r)L|ciz-#n+kG<%|eeQ=8!g}mJ`*@Rl_XVr4+>Z3<1FYrG+FA#q?IaF`wnvFH<`=qF6rV55({5M>_;+Q!?`?FA}38nAM4%r-%G?4)N5zl;y(OZ#@8Z79uOR*&6hn=9_i z>5H8^>WTD1KfVBJ+d1TVEi}%Np&e0kU-YG*=sE4VxGzeNUOlkGDcW^kSPoxF zKu_v*`o~)>(m6DxAK*_rM8)ouCmoKx(Z|Xq)5*8zg7e&_w>_uX#p;1a_iYZjwQF0x zh(||Ql(XkDKPkz69Kk)OeXtyVdCI;-6^}djQ$Ms9SiiAxZvD>sSqqul zm~s2^4|eBEKgRJRU%jz%hOJ&pH(aa-_P{^ZzpOuzPJeRt2}tLw7o_u*3*+|12m9KA zar@eVl{0LwC0V**d*z<-5WQ-@gJVb2gM6^PL=>eLn&n%%m9tl^?PVk5Hve0HFphrA zD?B&zjPc@nBYPGC>`OW8e}?e~^;o)L{KtH6>BjL_^a^+guJ2oEpa5`!~7wQYPb=1}g!?ym~_%?3i z9{cesgK_N2OBPm-@#6N(e-Y2Q_1d`gqg?23UgE$m)N7pQqFr0ZjoZ3wp*2itn#?AxK0n>lfA!%)f@MA6UBi-P*Hy%&x`$u;(@VnO)3Z z<|n(~%9&lQygipahu`iFyO@4fALX>}YFt!{j2FUjqHRNhlMjaHTzZmQI-K|=tT(|e zJuIgxqV-!sxUM?v>g9gY8}fF1WXDEI=L+{=91~U5)L%S*>iOdrEndL>HM)}jbJ8A4 zI#|@j<>`Os3IAu8t6sU`VUoc7Pbx{w|NQdKsWIC;P2C(Dy> zm^vdvM^bAtzc6YgOO$2A=xXg3Ppw?U8{+#~)5(>O^-}p(onZcImThu zmr23Vm5ye3YTvMdP_yt?0``k>A+!-Ejgj{Xp?7=6I2US{j%M^5&M2+l(1#9)aW2&C zz!1+yi_p6V#W<}I(EN;jcGzY-I^C#@e2gFIWpJK{9twtId1Ri8@kBn{#*>XB`2X26 zpe<6)UEyRPnGP<8MBORkI0I~){OZtY=G-X1;O=X1`Nl1smaLv?m7zYkrRUuJlqcOd z>EO7$-e>TO-U-au~ z9xg8b_{)BMoBrtI4c#Yu_kXL}$M=o!@t05X@tw1Le9KB7-*BCeufE&IpJ?>)C0l)b z@qhVv;k!Pb-PO0pnZ12{%1|GlG~UPK&hhba%Y0n>86O{gr;q!6)5m?b__)|#`@ZGp z@7Z~(Xa7zI`}nVeeEi;6AHR9Jk6*jU$1gSb`1#v>{LKA6ezM8Ok3H+-hkxti_1k>B zwx{18zc#?f_tg3Lj_E%B!a^V4aFvg*zS+mC?)CAd-}Ujbr+u7_55NCq}%eSiGS>~V@WU!8WikEa~tSNQlh*ZTP7yL|k@gFb%t`#yf^MIUc{$H$L$ znc?aG@F6~aXo!!$Rqx~b&-U?Gm-_hbt9^XO9X`Hgt&eYd%*WR}@8eIs>Eo+9o$BfT z@q>K)u|Yn*XsnOVKi$W(FY@s@4L&~oHXl#B-^V96`FQ-ZJ}&&$$78nnI9pG$^&}au zXYrQ5UL@C(Qua65c*@38HlB9u|BLr8*?98z|JiwfzkkWj1N`-;wex_sj;CaK&gY8v zH^uvt;{8SO{-8L%FOJWPd*Abe|D{pFF)w4I6sRAdgQbDE1SQP@lIRMGqd@~pMT1kkHXL4^uJ~< zSYEws>55$O$1~=pjJMkYMIU&zyPjNCL?Zqol;o4Kh)W0#Rp zAwR`#8kV`K3~#i2Yi0ZtyQwyFQ_Hq4C#NEQirq9ab5l9a*u}k-@Kfxj(V3feVd}E7 zD&Qw`)6gu0D9aVQyt#Zo#cs+%h+SH`yv(xw6uT)4Axb6vFUL=@o3aq1H8Yo;UxuGz zH)SD2*=}gHg7*68IFD zSqM=9CzMb{`}`EUDGMP=uyG}dw98Mio3aq15XvJj#&9w@Drw)!b{Qx-y$X5b2yYNMabO(U`p zqCyTRv6{B|DRxs9LX>FVN)>C9pJF#3nAKI+e#KK$xr5{QCSF4N!z!ju2TFIyD1AH+G5&@mMy_gv753GqN1j6 zQ)R9DDRxs9LbS=Ul`Y(=pJF#@-?rLX^OL!0bQVIi&9D_N-HM-LH)SD2g$>`v z>UQm?*iBgo(MG#gy7(^r6uT)4Au4V6w$`^RKgDj!LWs7Swc_P>;U{y`F7nWPW)tU%D%~-j>+3q zYjZ!Do3d{Uw#%R?-PFua=BDf$87W!3ebpBG$=sB^_1Zprrgc}5pUh3!n?-3Eyq)#> zelj;@pWe39oT=UB`N`arosg$y@Ag)l^pkVbu + * + * Return Value: + * None + * + * Example: + * [display, "abc"] call ace_milr_fnc_display_init + * + * Public: No + */ +params ["_display"]; +if (isNull _display) exitWith { ERROR("MILR display is null"); }; + +uiNamespace setVariable [QGVAR(display), _display]; + +private _ctrlBackground = _display ctrlCreate ["RscPicture", -1]; +_ctrlBackground ctrlSetText "#(argb,8,8,3)color(0.05,0.05,0.05,1)"; +_ctrlBackground ctrlSetPosition [0,0,1,1]; +_ctrlBackground ctrlCommit 0; + +// private _ctrlBackground = _display ctrlCreate ["RscPicture", -1]; // rough safezone +// _ctrlBackground ctrlSetText "#(argb,8,8,3)color(0.22352941,0.101960786,1,1)"; +// _ctrlBackground ctrlSetPosition [0.02,0.02,.95,.42]; +// _ctrlBackground ctrlCommit 0; + +private _ctrlRange = _display ctrlCreate [QGVAR(structuredText), IDC_MILR_RANGE]; +_ctrlRange ctrlSetPosition [0,0.025,0.95,0.3]; +_ctrlRange ctrlCommit 0; + +private _ctrlElev = _display ctrlCreate [QGVAR(structuredText), IDC_MILR_ELEV]; +_ctrlElev ctrlSetPosition [0.05,0.3,0.35,0.12]; +_ctrlElev ctrlSetBackgroundColor [0.9,0.9,0.9,1]; +_ctrlElev ctrlCommit 0; + +call FUNC(display_refresh); diff --git a/addons/milr/functions/fnc_display_refresh.sqf b/addons/milr/functions/fnc_display_refresh.sqf new file mode 100644 index 00000000000..8c1f3f041fe --- /dev/null +++ b/addons/milr/functions/fnc_display_refresh.sqf @@ -0,0 +1,40 @@ +#include "..\script_component.hpp" +/* + * Author: PabstMirror + * Refreshes the item's display + * + * Arguments: + * None + * + * Return Value: + * None + * + * Example: + * [] call ace_milr_fnc_display_refresh + * + * Public: No + */ +private _display = uiNamespace getVariable [QGVAR(display), displayNull]; +if (isNull _display) exitWith { ERROR("MILR display is null"); }; + +private _ctrlRange = _display displayCtrl IDC_MILR_RANGE; +private _range = GVAR(data) getOrDefault ["range", -1]; +private _rangeText = text (if (_range > 0) then { + format ["%1m", _range toFixed 0] +} else { + "----m" +}); +_rangeText setAttributes ["color", "#FFFFFF", "font", "EtelkaMonospacePro", "align", "right", "size", "5"]; +_ctrlRange ctrlSetStructuredText composeText [_rangeText]; + +private _ctrlElev = _display displayCtrl IDC_MILR_ELEV; +private _elev = GVAR(data) getOrDefault ["elevationMRAD", 0]; +private _elevText = text (call { + if (_range == RANGE_IN_PROGRESS) exitWith { "RANGING" }; + if (_elev <= 0) exitWith { "" }; + if (_elev < 30) exitWith { format ["%1 +", _elev toFixed 1] }; + format ["%1 !!!", _elev toFixed 0] // out of limits +}); +_elevText setAttributes ["color", "#000000", "font", "EtelkaMonospacePro", "align", "left", "size", "2.3"]; +_ctrlElev ctrlSetStructuredText composeText [_elevText]; +displayUpdate _display; diff --git a/addons/milr/functions/fnc_getRange.sqf b/addons/milr/functions/fnc_getRange.sqf new file mode 100644 index 00000000000..9c35c7d5ede --- /dev/null +++ b/addons/milr/functions/fnc_getRange.sqf @@ -0,0 +1,31 @@ +#include "..\script_component.hpp" +/* + * Author: PabstMirror + * Gets the range to the target the player's weapon is aiming at + * + * Arguments: + * 0: Player + * + * Return Value: + * None + * + * Example: + * [player] call ace_milr_fnc_getRange + * + * Public: No + */ +params ["_player"]; +private _posHandRel = _player selectionPosition "head"; +// for some fancy stuff see https://community.bistudio.com/wiki/selectionVectorDirAndUp +private _posHandASL = _player modelToWorldVisualWorld _posHandRel; +private _dir = _player weaponDirection currentWeapon _player; +private _posEndASL = _posHandASL vectorAdd (_dir vectorMultiply RANGEFINDER_MAX_RANGE); + +private _vehicle = vehicle _player; +private _intersects = lineIntersectsSurfaces [_posHandASL, _posEndASL, _player, _vehicle]; + +if (_intersects isEqualTo []) exitWith { RANGE_NO_RETURNS }; +(_intersects select 0) params ["_intersectPosASL"]; +private _distance = _posHandASL distance _intersectPosASL; +if (_distance < 10) exitWith { RANGE_TOO_CLOSE }; +_distance diff --git a/addons/milr/functions/fnc_keyPress.sqf b/addons/milr/functions/fnc_keyPress.sqf new file mode 100644 index 00000000000..529b64f97ec --- /dev/null +++ b/addons/milr/functions/fnc_keyPress.sqf @@ -0,0 +1,42 @@ +#include "..\script_component.hpp" +/* + * Author: PabstMirror + * Key Handler + * + * Arguments: + * 0: Key Function + * 1: Key Down + * + * Return Value: + * Key Handled + * + * Example: + * ["range", true] call ace_milr_fnc_keyPress + * + * Public: No + */ +if (GVAR(pfid) == -1) exitWith { false }; // fast exit if not equipped +params ["_func", "_keyDown"]; +private _player = ACE_player; +if !([_player, objNull, ["isNotInside"]] call EFUNC(common,canInteractWith)) exitWith { false }; +if !(_player call CBA_fnc_canUseWeapon) exitWith { false }; + +switch (_func) do { + case "range": { + if (_keyDown) then { + GVAR(data) set ["range", RANGE_IN_PROGRESS]; + GVAR(data) set ["range_keyDownStart", CBA_missionTime]; + } else { + private _holdTime = CBA_missionTime - (GVAR(data) getOrDefault ["range_keyDownStart", 0]); + // very long hold to clear + private _range = if (_holdTime < 5) then { [_player] call FUNC(getRange) } else { 0 }; + TRACE_1("Updating range",_range); + GVAR(data) set ["range", _range]; + // systemChat format ["DEBUG: range: %1 meters", _range]; + }; + }; + default { ERROR_1("Unknown keyPress function: %1",_func); }; +}; +call FUNC(display_refresh); + +true // return diff --git a/addons/milr/functions/fnc_pfeh.sqf b/addons/milr/functions/fnc_pfeh.sqf new file mode 100644 index 00000000000..e907facb76f --- /dev/null +++ b/addons/milr/functions/fnc_pfeh.sqf @@ -0,0 +1,65 @@ +#include "..\script_component.hpp" +/* + * Author: PabstMirror + * Updates the displaced laser when needed + * + * Arguments: + * 0: PFEH Data + * + * Return Value: + * None + * + * Example: + * [] call ace_milr_fnc_pfeh + * + * Public: No + */ + +params ["_pfData"]; // empty array on init +private _player = ACE_player; +private _range = GVAR(data) getOrDefault ["range", 0]; +private _zero = currentZeroing _player; +// possible ToDo ballistic tilt as well? + +if ([_range, _zero, GVAR(currentPointer)] isEqualTo _pfData) exitWith {}; // no state change + +private _player = ACE_player; +if !(_player call CBA_fnc_canUseWeapon) exitWith {}; // in vehicle etc + +private _item = if ((GVAR(data) getOrDefault ["range", 0]) == RANGE_IN_PROGRESS) then { + QGVAR(000) +} else { + private _elevationMRAD = if (_range <= 0) then { + 0 + } else { + ([_range, 0, 0, 0, GVAR(data)] call EFUNC(xm157,ballistics_calculator)) params ["_be","_bw"]; + TRACE_2("ballistics_calculator",_be,_bw); + // systemChat format ["DEBUG Ballistics: %1 - %2", _be, _bw]; + _be + }; + GVAR(data) set ["elevationMRAD", _elevationMRAD]; + + if (_elevationMRAD <= 0) exitWith { + QGVAR(000) // negative or zero, just use base item (see how much a problem this is with high weapon zeroing) + }; + _elevationMRAD = (_elevationMRAD max 0) min 30; // clamp + private _best10step = if (_elevationMRAD <= 10) then { // tenths of MRADs, variable precision + 2 * round (_elevationMRAD * 5); // 0-10 @ 2x increments + } else { + 10 * round (_elevationMRAD); // 10-30 @ 10x increments + }; + // get best item for the elevation + format ["%1_%2", QUOTE(ADDON), [_best10step, 3] call CBA_fnc_formatNumber]; +}; + +if (_item != GVAR(currentPointer)) then { + TRACE_1("Updating Item",_item); + // systemChat format ["DEBUG New Item: %1", _item]; + _player addPrimaryWeaponItem _item; +}; + +_pfData set [0, _range]; +_pfData set [1, _zero]; +_pfData set [2, GVAR(currentPointer)]; + +call FUNC(display_refresh); diff --git a/addons/milr/script_component.hpp b/addons/milr/script_component.hpp new file mode 100644 index 00000000000..cf1da4cd1ab --- /dev/null +++ b/addons/milr/script_component.hpp @@ -0,0 +1,27 @@ +#define COMPONENT milr +#define COMPONENT_BEAUTIFIED MILR +#include "\z\ace\addons\main\script_mod.hpp" + +#define DEBUG_MODE_FULL +#define DISABLE_COMPILE_CACHE +#define ENABLE_PERFORMANCE_COUNTERS +#define ENABLE_QUICK_TESTING + +#ifdef DEBUG_ENABLED_MILR + #define DEBUG_MODE_FULL +#endif + +#ifdef DEBUG_SETTINGS_MILR + #define DEBUG_SETTINGS DEBUG_SETTINGS_MILR +#endif + +#include "\z\ace\addons\main\script_macros.hpp" + +#define RANGEFINDER_MAX_RANGE 3000 + +#define IDC_MILR_RANGE 90001 +#define IDC_MILR_ELEV 90002 + +#define RANGE_NO_RETURNS -1 +#define RANGE_TOO_CLOSE -2 +#define RANGE_IN_PROGRESS -3 diff --git a/addons/xm157/functions/fnc_ballistics_calculator.sqf b/addons/xm157/functions/fnc_ballistics_calculator.sqf index e0b0dc9524b..45cc0dc68cf 100644 --- a/addons/xm157/functions/fnc_ballistics_calculator.sqf +++ b/addons/xm157/functions/fnc_ballistics_calculator.sqf @@ -8,6 +8,7 @@ * 1: Direction of Fire (deg) - Yaw * 2: Inlination (deg) - Pitch * 3: Bank (deg) - Roll + * 4: Custom Data (default: default data) * * Return Value: * Elevation and Windage in MRAD, Time Of Flight @@ -18,18 +19,19 @@ * Public: No */ -params ["_targetRange", "_directionOfFire", "_inclinationAngle", "_bank"]; +params ["_targetRange", "_directionOfFire", "_inclinationAngle", "_bank", ["_data", GVAR(data)]]; -private _weaponInfo = [] call FUNC(ballistics_getData); +private _zeroRange = _data getOrDefault ["zero_range", 100]; // 100 is the scope's `discreteDistance` so this doesn't need to be set explicitly +private _weaponInfo = [_zeroRange] call FUNC(ballistics_getData); if (_weaponInfo isEqualTo []) exitWith { [0,0,0] }; _weaponInfo params ["_scopeBaseAngle","_boreHeight","_airFriction","_muzzleVelocity","_bc", "_dragModel","_atmosphereModel","_barrelTwist","_twistDirection","_caliber","_bulletLength","_bulletMass"]; -private _latitude = GVAR(data) getOrDefault ["latitude", 0]; +private _latitude = _data getOrDefault ["latitude", 0]; // Get Wind -private _windSpeed = GVAR(data) getOrDefault ["wind_speed", 0]; -private _windDirection = 22.5 * (GVAR(data) getOrDefault ["wind_dir", 0]); +private _windSpeed = _data getOrDefault ["wind_speed", 0]; +private _windDirection = 22.5 * (_data getOrDefault ["wind_dir", 0]); private _wind = [sin (_directionOfFire-_windDirection) * _windSpeed, -cos (_directionOfFire-_windDirection) * _windSpeed, 0]; // Get atmosphere diff --git a/addons/xm157/functions/fnc_ballistics_getData.sqf b/addons/xm157/functions/fnc_ballistics_getData.sqf index 48b61bea9b0..1e7e8059a0f 100644 --- a/addons/xm157/functions/fnc_ballistics_getData.sqf +++ b/addons/xm157/functions/fnc_ballistics_getData.sqf @@ -4,28 +4,28 @@ * Gets ballistic info for a weapon, mag and ammo * * Arguments: - * None + * 0: Zeroing * * Return Value: * Weapon Info * * Example: - * [] call ace_xm157_fnc_ballistics_getData + * [100] call ace_xm157_fnc_ballistics_getData * * Public: No */ +params ["_zeroRange"]; + private _unit = ace_player; private _weaponClass = primaryWeapon _unit; private _magazineClass = (primaryWeaponMagazine _unit) param [0, ""]; -private _ammoClass = getText (configFile >> "CfgMagazines" >> _magazineClass >> "ammo"); +private _optic = (primaryWeaponItems _unit) param [2, ""]; -private _key = format ["weaponInfoCache-%1-%2-%3",_weaponClass,_magazineClass,_ammoClass]; -private _weaponInfo = GVAR(data) getOrDefault [_key, []]; -if ((_weaponInfo isEqualTo []) && {_magazineClass != ""}) then { - TRACE_3("new weapon/mag",_weaponClass,_magazineClass,_ammoClass); +GVAR(data) getOrDefaultCall [["ballistics", _weaponClass, _magazineClass, _optic, _zeroRange], { + private _ammoClass = getText (configFile >> "CfgMagazines" >> _magazineClass >> "ammo"); + TRACE_4("new",_weaponClass,_magazineClass,_optic,_zeroRange); - private _zeroRange = 100; private _boreHeight = [_unit, 0] call EFUNC(scopes,getBoreHeight); private _ammoConfig = _ammoClass call EFUNC(advanced_ballistics,readAmmoDataFromConfig); @@ -64,9 +64,7 @@ if ((_weaponInfo isEqualTo []) && {_magazineClass != ""}) then { 0 // shotshell will not have any vanilla zeroing applied, 0 is a reasonable default for now }; - _weaponInfo = [_scopeBaseAngle,_boreHeight,_airFriction,_muzzleVelocity,_bc,_dragModel,_atmosphereModel,_barrelTwist,_twistDirection,_caliber,_bulletLength,_bulletMass]; - GVAR(data) set [_key, _weaponInfo]; + private _weaponInfo = [_scopeBaseAngle,_boreHeight,_airFriction,_muzzleVelocity,_bc,_dragModel,_atmosphereModel,_barrelTwist,_twistDirection,_caliber,_bulletLength,_bulletMass]; TRACE_1("setting cache",_weaponInfo); -}; - -_weaponInfo + _weaponInfo +}, true] // return From a2dfeed3e8c754bf54e69fc81c36906504a370d0 Mon Sep 17 00:00:00 2001 From: PabstMirror Date: Thu, 29 Jan 2026 23:43:28 -0600 Subject: [PATCH 2/5] tabs --- addons/milr/CfgWeapons.hpp | 4 ++-- addons/milr/functions/fnc_pfeh.sqf | 1 + 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/addons/milr/CfgWeapons.hpp b/addons/milr/CfgWeapons.hpp index 77e39fcc405..82b5ff1f2d7 100644 --- a/addons/milr/CfgWeapons.hpp +++ b/addons/milr/CfgWeapons.hpp @@ -3,7 +3,7 @@ #define ZERO(NUM) class GVAR(NUM): GVAR(base) { \ scope = 1; \ class ItemInfo: InventoryFlashLightItem_Base_F { \ - mass = 4; \ + mass = 7; \ class Pointer { \ irLaserPos = "laser pos"; \ irLaserEnd = QUOTE(CONCAT(laser ,NUM)); \ @@ -23,7 +23,7 @@ class CfgWeapons { displayName = "MILR"; descriptionUse = "y"; descriptionShort = "z"; - picture = "\A3\weapons_F\Data\UI\gear_accv_pointer_CA.paa"; + picture = "\A3\weapons_F\Data\UI\gear_accv_pointer_CA.paa"; model = QPATHTOF(data\ace_milr.p3d); class ItemInfo: InventoryFlashLightItem_Base_F { // do not use inheritance on ItemInfo/Pointer as it breaks something mass = 7; // big chonky box diff --git a/addons/milr/functions/fnc_pfeh.sqf b/addons/milr/functions/fnc_pfeh.sqf index e907facb76f..738668ad76e 100644 --- a/addons/milr/functions/fnc_pfeh.sqf +++ b/addons/milr/functions/fnc_pfeh.sqf @@ -32,6 +32,7 @@ private _item = if ((GVAR(data) getOrDefault ["range", 0]) == RANGE_IN_PROGRESS) private _elevationMRAD = if (_range <= 0) then { 0 } else { + GVAR(data) set ["zero_range", _zero]; // set zero for xm157 ([_range, 0, 0, 0, GVAR(data)] call EFUNC(xm157,ballistics_calculator)) params ["_be","_bw"]; TRACE_2("ballistics_calculator",_be,_bw); // systemChat format ["DEBUG Ballistics: %1 - %2", _be, _bw]; From b87767b11fdd71e8d954ed315594dd32e504bfa5 Mon Sep 17 00:00:00 2001 From: PabstMirror Date: Fri, 6 Feb 2026 20:12:00 -0600 Subject: [PATCH 3/5] Update ace_milr.p3d --- addons/milr/data/ace_milr.p3d | Bin 66287 -> 93215 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/addons/milr/data/ace_milr.p3d b/addons/milr/data/ace_milr.p3d index 803c1840596f4a01bd8398cad0e395b6fafe3cc0..5f537eb37b77804b0595814892083bede766d635 100644 GIT binary patch delta 88 zcmaFg$};~3E2poIzY8NH0|U!O&bML0Pk;S4_GMsT$Ono5*+vy}-cEifCCRO00EC8m l20F?4o6W=D337lGf)s4l&CF!qD50In+|cQ=xvL;`5&){@BDDYj delta 34 qcmbP#gY|tY3y-glzY8NH0|PSy1H Date: Sat, 21 Feb 2026 10:37:54 -0600 Subject: [PATCH 4/5] cleanup --- addons/milr/functions/fnc_display_refresh.sqf | 2 +- addons/milr/functions/fnc_getRange.sqf | 2 +- addons/milr/script_component.hpp | 9 +++++---- 3 files changed, 7 insertions(+), 6 deletions(-) diff --git a/addons/milr/functions/fnc_display_refresh.sqf b/addons/milr/functions/fnc_display_refresh.sqf index 8c1f3f041fe..84b56191065 100644 --- a/addons/milr/functions/fnc_display_refresh.sqf +++ b/addons/milr/functions/fnc_display_refresh.sqf @@ -31,7 +31,7 @@ private _ctrlElev = _display displayCtrl IDC_MILR_ELEV; private _elev = GVAR(data) getOrDefault ["elevationMRAD", 0]; private _elevText = text (call { if (_range == RANGE_IN_PROGRESS) exitWith { "RANGING" }; - if (_elev <= 0) exitWith { "" }; + if (_elev <= 0) exitWith { "---" }; if (_elev < 30) exitWith { format ["%1 +", _elev toFixed 1] }; format ["%1 !!!", _elev toFixed 0] // out of limits }); diff --git a/addons/milr/functions/fnc_getRange.sqf b/addons/milr/functions/fnc_getRange.sqf index 9c35c7d5ede..35afcb83346 100644 --- a/addons/milr/functions/fnc_getRange.sqf +++ b/addons/milr/functions/fnc_getRange.sqf @@ -27,5 +27,5 @@ private _intersects = lineIntersectsSurfaces [_posHandASL, _posEndASL, _player, if (_intersects isEqualTo []) exitWith { RANGE_NO_RETURNS }; (_intersects select 0) params ["_intersectPosASL"]; private _distance = _posHandASL distance _intersectPosASL; -if (_distance < 10) exitWith { RANGE_TOO_CLOSE }; +if (_distance < RANGEFINDER_MIN_RANGE) exitWith { RANGE_TOO_CLOSE }; _distance diff --git a/addons/milr/script_component.hpp b/addons/milr/script_component.hpp index cf1da4cd1ab..9ea5e874cfd 100644 --- a/addons/milr/script_component.hpp +++ b/addons/milr/script_component.hpp @@ -2,10 +2,10 @@ #define COMPONENT_BEAUTIFIED MILR #include "\z\ace\addons\main\script_mod.hpp" -#define DEBUG_MODE_FULL -#define DISABLE_COMPILE_CACHE -#define ENABLE_PERFORMANCE_COUNTERS -#define ENABLE_QUICK_TESTING +// #define DEBUG_MODE_FULL +// #define DISABLE_COMPILE_CACHE +// #define ENABLE_PERFORMANCE_COUNTERS +// #define ENABLE_QUICK_TESTING #ifdef DEBUG_ENABLED_MILR #define DEBUG_MODE_FULL @@ -18,6 +18,7 @@ #include "\z\ace\addons\main\script_macros.hpp" #define RANGEFINDER_MAX_RANGE 3000 +#define RANGEFINDER_MIN_RANGE 10 #define IDC_MILR_RANGE 90001 #define IDC_MILR_ELEV 90002 From 92a545b448ebc6f1a1b0b15d2ed101b219a93400 Mon Sep 17 00:00:00 2001 From: PabstMirror Date: Mon, 23 Mar 2026 22:58:43 -0500 Subject: [PATCH 5/5] Fix descriptionShort --- addons/milr/CfgWeapons.hpp | 4 ++-- addons/milr/stringtable.xml | 8 ++++++++ 2 files changed, 10 insertions(+), 2 deletions(-) create mode 100644 addons/milr/stringtable.xml diff --git a/addons/milr/CfgWeapons.hpp b/addons/milr/CfgWeapons.hpp index 82b5ff1f2d7..ef25e212df7 100644 --- a/addons/milr/CfgWeapons.hpp +++ b/addons/milr/CfgWeapons.hpp @@ -21,8 +21,8 @@ class CfgWeapons { inertia = 0.1; author = ECSTRING(common,ACETeam); displayName = "MILR"; - descriptionUse = "y"; - descriptionShort = "z"; + descriptionUse = "$STR_A3_cfgWeapons_use_pointer_IR0"; + descriptionShort = CSTRING(descriptionShort); picture = "\A3\weapons_F\Data\UI\gear_accv_pointer_CA.paa"; model = QPATHTOF(data\ace_milr.p3d); class ItemInfo: InventoryFlashLightItem_Base_F { // do not use inheritance on ItemInfo/Pointer as it breaks something diff --git a/addons/milr/stringtable.xml b/addons/milr/stringtable.xml new file mode 100644 index 00000000000..b1b54609791 --- /dev/null +++ b/addons/milr/stringtable.xml @@ -0,0 +1,8 @@ + + + + + IR Laser Pointer and Rangefinder + + +