Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- if (isDedicated || {!hasInterface}) exitWith {};
- // ==== получить текущую карту nav-панели ====
- qs_fnc_gpszoom_getmap = {
- disableSerialization;
- private _navDisplay = uiNamespace getVariable ["RscCustomInfoMiniMap", displayNull];
- if (isNull _navDisplay) exitWith { objNull };
- private _group = _navDisplay displayCtrl 13301;
- if (isNull _group) exitWith { objNull };
- _group controlsGroupCtrl 101
- };
- // ==== снять текущую копию фичи ====
- qs_fnc_gpszoom_remove = {
- missionNamespace setVariable ["qs_gpszoom_manual", false];
- missionNamespace setVariable ["qs_gpszoom_enabled", false];
- private _map = missionNamespace getVariable ["qs_gpszoom_map", controlNull];
- private _drawEh = missionNamespace getVariable ["qs_gpszoom_draweh", -1];
- if (
- !isNull _map &&
- {_drawEh isNotEqualTo -1}
- ) then {
- _map ctrlRemoveEventHandler ["Draw", _drawEh];
- };
- missionNamespace setVariable ["qs_gpszoom_map", controlNull];
- missionNamespace setVariable ["qs_gpszoom_draweh", -1];
- missionNamespace setVariable ["qs_gpszoom_target", -1];
- diag_log "[qs gps zoom] nav zoom disabled";
- };
- // ==== включить фичу (сама блокировка масштаба цепляется по первому нажатию зума) ====
- qs_fnc_gpszoom_install = {
- call qs_fnc_gpszoom_remove;
- missionNamespace setVariable ["qs_gpszoom_enabled", true];
- diag_log "[qs gps zoom] nav zoom enabled";
- };
- // ==== переключатель вкл/выкл — единственное место, где фича меняет состояние по явному действию игрока ====
- qs_fnc_gpszoom_toggle = {
- if (missionNamespace getVariable ["qs_gpszoom_enabled", false]) then {
- call qs_fnc_gpszoom_remove;
- systemChat localize "STR_QS_GPSZOOM_DISABLED";
- } else {
- call qs_fnc_gpszoom_install;
- systemChat localize "STR_QS_GPSZOOM_ENABLED";
- };
- true
- };
- // ==== один шаг зума (_dir: 1 — приблизить, -1 — отдалить) ====
- qs_fnc_gpszoom_step = {
- params ["_dir"];
- if !(missionNamespace getVariable ["qs_gpszoom_enabled", false]) exitWith { false };
- // карту резолвим один раз за сессию, дальше берём из кэша
- private _map = missionNamespace getVariable ["qs_gpszoom_map", controlNull];
- if (isNull _map) then {
- _map = call qs_fnc_gpszoom_getmap;
- };
- if (isNull _map) exitWith { false };
- // первый раз цепляем постоянный draw-хендлер, который держит масштаб каждый кадр
- if !(missionNamespace getVariable ["qs_gpszoom_manual", false]) then {
- missionNamespace setVariable ["qs_gpszoom_manual", true];
- missionNamespace setVariable ["qs_gpszoom_target", ctrlMapScale _map];
- missionNamespace setVariable ["qs_gpszoom_map", _map];
- private _drawEh = _map ctrlAddEventHandler [
- "Draw",
- {
- params ["_ctrl"];
- if !(missionNamespace getVariable ["qs_gpszoom_manual", false]) exitWith {};
- private _target = missionNamespace getVariable ["qs_gpszoom_target", -1];
- if (_target < 0) exitWith {};
- ctrlMapAnimClear _ctrl;
- _ctrl ctrlMapAnimAdd [0, _target, getPosASLVisual player];
- ctrlMapAnimCommit _ctrl;
- }
- ];
- missionNamespace setVariable ["qs_gpszoom_draweh", _drawEh];
- };
- private _oldTarget = missionNamespace getVariable ["qs_gpszoom_target", ctrlMapScale _map];
- private _newTarget = if (_dir > 0) then { _oldTarget / 1.5 } else { _oldTarget * 1.5 };
- _newTarget = (_newTarget max 0.01) min 1;
- missionNamespace setVariable ["qs_gpszoom_target", _newTarget];
- true
- };
- // ==== кейбинды — игрок сам назначает клавиши: Configure -> Controls -> Configure Addons -> QS GPS Zoom ====
- // по умолчанию клавиши не назначены, чтобы не конфликтовать ни с чем штатным
- ["QS GPS Zoom", "qs_gpszoom_toggle", localize "STR_QS_GPSZOOM_KEYBIND_TOGGLE", {call qs_fnc_gpszoom_toggle}, ""] call CBA_fnc_addKeybind;
- ["QS GPS Zoom", "qs_gpszoom_in", localize "STR_QS_GPSZOOM_KEYBIND_IN", {[1] call qs_fnc_gpszoom_step}, ""] call CBA_fnc_addKeybind;
- ["QS GPS Zoom", "qs_gpszoom_out", localize "STR_QS_GPSZOOM_KEYBIND_OUT", {[-1] call qs_fnc_gpszoom_step}, ""] call CBA_fnc_addKeybind;
- // ==== следим за visibleGPS: жпс открыли — включаем фичу, жпс убрали с экрана — выключаем ====
- missionNamespace setVariable ["qs_gpszoom_gpsvisible", false];
- [
- {
- private _visible = visibleGPS;
- private _wasVisible = missionNamespace getVariable ["qs_gpszoom_gpsvisible", false];
- if (_visible == _wasVisible) exitWith {};
- missionNamespace setVariable ["qs_gpszoom_gpsvisible", _visible];
- if (_visible) then {
- call qs_fnc_gpszoom_install;
- // разовая подсказка про настройку клавиш — показывается один раз на профиль игрока
- if (isNil {profileNamespace getVariable "qs_gpszoom_hint_shown"}) then {
- hint localize "STR_QS_GPSZOOM_HINT";
- profileNamespace setVariable ["qs_gpszoom_hint_shown", true];
- saveProfileNamespace;
- };
- } else {
- call qs_fnc_gpszoom_remove;
- };
- },
- 0.25
- ] call CBA_fnc_addPerFrameHandler;
Advertisement
Add Comment
Please, Sign In to add comment