Guest User

Untitled

a guest
Sep 27th, 2026
42
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
SQF 5.33 KB | None | 0 0
  1. if (isDedicated || {!hasInterface}) exitWith {};
  2.  
  3. // ==== получить текущую карту nav-панели ====
  4. qs_fnc_gpszoom_getmap = {
  5.     disableSerialization;
  6.  
  7.     private _navDisplay = uiNamespace getVariable ["RscCustomInfoMiniMap", displayNull];
  8.  
  9.     if (isNull _navDisplay) exitWith { objNull };
  10.  
  11.     private _group = _navDisplay displayCtrl 13301;
  12.  
  13.     if (isNull _group) exitWith { objNull };
  14.  
  15.     _group controlsGroupCtrl 101
  16. };
  17.  
  18. // ==== снять текущую копию фичи ====
  19. qs_fnc_gpszoom_remove = {
  20.     missionNamespace setVariable ["qs_gpszoom_manual", false];
  21.     missionNamespace setVariable ["qs_gpszoom_enabled", false];
  22.  
  23.     private _map = missionNamespace getVariable ["qs_gpszoom_map", controlNull];
  24.     private _drawEh = missionNamespace getVariable ["qs_gpszoom_draweh", -1];
  25.  
  26.     if (
  27.         !isNull _map &&
  28.         {_drawEh isNotEqualTo -1}
  29.     ) then {
  30.         _map ctrlRemoveEventHandler ["Draw", _drawEh];
  31.     };
  32.  
  33.     missionNamespace setVariable ["qs_gpszoom_map", controlNull];
  34.     missionNamespace setVariable ["qs_gpszoom_draweh", -1];
  35.     missionNamespace setVariable ["qs_gpszoom_target", -1];
  36.  
  37.     diag_log "[qs gps zoom] nav zoom disabled";
  38. };
  39.  
  40. // ==== включить фичу (сама блокировка масштаба цепляется по первому нажатию зума) ====
  41. qs_fnc_gpszoom_install = {
  42.     call qs_fnc_gpszoom_remove;
  43.  
  44.     missionNamespace setVariable ["qs_gpszoom_enabled", true];
  45.  
  46.     diag_log "[qs gps zoom] nav zoom enabled";
  47. };
  48.  
  49. // ==== переключатель вкл/выкл — единственное место, где фича меняет состояние по явному действию игрока ====
  50. qs_fnc_gpszoom_toggle = {
  51.     if (missionNamespace getVariable ["qs_gpszoom_enabled", false]) then {
  52.         call qs_fnc_gpszoom_remove;
  53.         systemChat localize "STR_QS_GPSZOOM_DISABLED";
  54.     } else {
  55.         call qs_fnc_gpszoom_install;
  56.         systemChat localize "STR_QS_GPSZOOM_ENABLED";
  57.     };
  58.  
  59.     true
  60. };
  61.  
  62. // ==== один шаг зума (_dir: 1 — приблизить, -1 — отдалить) ====
  63. qs_fnc_gpszoom_step = {
  64.     params ["_dir"];
  65.  
  66.     if !(missionNamespace getVariable ["qs_gpszoom_enabled", false]) exitWith { false };
  67.  
  68.     // карту резолвим один раз за сессию, дальше берём из кэша
  69.     private _map = missionNamespace getVariable ["qs_gpszoom_map", controlNull];
  70.  
  71.     if (isNull _map) then {
  72.         _map = call qs_fnc_gpszoom_getmap;
  73.     };
  74.  
  75.     if (isNull _map) exitWith { false };
  76.  
  77.     // первый раз цепляем постоянный draw-хендлер, который держит масштаб каждый кадр
  78.     if !(missionNamespace getVariable ["qs_gpszoom_manual", false]) then {
  79.         missionNamespace setVariable ["qs_gpszoom_manual", true];
  80.         missionNamespace setVariable ["qs_gpszoom_target", ctrlMapScale _map];
  81.         missionNamespace setVariable ["qs_gpszoom_map", _map];
  82.  
  83.         private _drawEh = _map ctrlAddEventHandler [
  84.             "Draw",
  85.             {
  86.                 params ["_ctrl"];
  87.  
  88.                 if !(missionNamespace getVariable ["qs_gpszoom_manual", false]) exitWith {};
  89.  
  90.                 private _target = missionNamespace getVariable ["qs_gpszoom_target", -1];
  91.  
  92.                 if (_target < 0) exitWith {};
  93.  
  94.                 ctrlMapAnimClear _ctrl;
  95.                 _ctrl ctrlMapAnimAdd [0, _target, getPosASLVisual player];
  96.                 ctrlMapAnimCommit _ctrl;
  97.             }
  98.         ];
  99.  
  100.         missionNamespace setVariable ["qs_gpszoom_draweh", _drawEh];
  101.     };
  102.  
  103.     private _oldTarget = missionNamespace getVariable ["qs_gpszoom_target", ctrlMapScale _map];
  104.  
  105.     private _newTarget = if (_dir > 0) then { _oldTarget / 1.5 } else { _oldTarget * 1.5 };
  106.  
  107.     _newTarget = (_newTarget max 0.01) min 1;
  108.  
  109.     missionNamespace setVariable ["qs_gpszoom_target", _newTarget];
  110.  
  111.     true
  112. };
  113.  
  114. // ==== кейбинды — игрок сам назначает клавиши: Configure -> Controls -> Configure Addons -> QS GPS Zoom ====
  115. // по умолчанию клавиши не назначены, чтобы не конфликтовать ни с чем штатным
  116. ["QS GPS Zoom", "qs_gpszoom_toggle", localize "STR_QS_GPSZOOM_KEYBIND_TOGGLE", {call qs_fnc_gpszoom_toggle}, ""] call CBA_fnc_addKeybind;
  117. ["QS GPS Zoom", "qs_gpszoom_in", localize "STR_QS_GPSZOOM_KEYBIND_IN", {[1] call qs_fnc_gpszoom_step}, ""] call CBA_fnc_addKeybind;
  118. ["QS GPS Zoom", "qs_gpszoom_out", localize "STR_QS_GPSZOOM_KEYBIND_OUT", {[-1] call qs_fnc_gpszoom_step}, ""] call CBA_fnc_addKeybind;
  119.  
  120. // ==== следим за visibleGPS: жпс открыли — включаем фичу, жпс убрали с экрана — выключаем ====
  121. missionNamespace setVariable ["qs_gpszoom_gpsvisible", false];
  122.  
  123. [
  124.     {
  125.         private _visible = visibleGPS;
  126.         private _wasVisible = missionNamespace getVariable ["qs_gpszoom_gpsvisible", false];
  127.  
  128.         if (_visible == _wasVisible) exitWith {};
  129.  
  130.         missionNamespace setVariable ["qs_gpszoom_gpsvisible", _visible];
  131.  
  132.         if (_visible) then {
  133.             call qs_fnc_gpszoom_install;
  134.  
  135.             // разовая подсказка про настройку клавиш — показывается один раз на профиль игрока
  136.             if (isNil {profileNamespace getVariable "qs_gpszoom_hint_shown"}) then {
  137.                 hint localize "STR_QS_GPSZOOM_HINT";
  138.                 profileNamespace setVariable ["qs_gpszoom_hint_shown", true];
  139.                 saveProfileNamespace;
  140.             };
  141.         } else {
  142.             call qs_fnc_gpszoom_remove;
  143.         };
  144.     },
  145.     0.25
  146. ] call CBA_fnc_addPerFrameHandler;
  147.  
Advertisement
Add Comment
Please, Sign In to add comment