sizraide 4 Posted December 1, 2021 Hello, I'm creating a singleplayer scenario. I created a GUI to choose difficulty for a singleplayer mission at the beginning of the mission. But the GUI can be closed by pressing ESC, I wonder if there's any countermeasures to avoid that? So the player can't close it until he chooses a difficulty. controls.hpp Spoiler class chooseDifficulty { idd = 1234; class controls { class baseFrame: RscFrame { idc = 1800; x = 0.386445 * safezoneW + safezoneX; y = 0.279 * safezoneH + safezoneY; w = 0.215156 * safezoneW; h = 0.476 * safezoneH; }; class textDifficulty: RscText { idc = 1000; text = "Choose difficulty"; //--- ToDo: Localize; x = 0.452187 * safezoneW + safezoneX; y = 0.313 * safezoneH + safezoneY; w = 0.0836719 * safezoneW; h = 0.034 * safezoneH; }; class easyDiff: RscButton { idc = 1600; text = "Easy peasy, lemon squeezy."; //--- ToDo: Localize; x = 0.416328 * safezoneW + safezoneX; y = 0.381 * safezoneH + safezoneY; w = 0.155391 * safezoneW; h = 0.068 * safezoneH; colorBackground[] = {0.5,0.7,0.5,0.8}; action = "diff = 1"; }; class mediumDiff: RscButton { idc = 1601; text = "Adventure Mode"; //--- ToDo: Localize; x = 0.416328 * safezoneW + safezoneX; y = 0.466 * safezoneH + safezoneY; w = 0.155391 * safezoneW; h = 0.068 * safezoneH; colorBackground[] = {0.5,0.7,0.5,0.8}; action = "diff = 2"; }; class hardDiff: RscButton { idc = 1602; text = "Hard as hell."; //--- ToDo: Localize; x = 0.416328 * safezoneW + safezoneX; y = 0.551 * safezoneH + safezoneY; w = 0.155391 * safezoneW; h = 0.068 * safezoneH; colorBackground[] = {0.5,0.7,0.5,0.8}; action = "diff = 3"; }; class confirmDiff: RscButton { idc = 1603; text = "Confirm"; //--- ToDo: Localize; x = 0.452187 * safezoneW + safezoneX; y = 0.67 * safezoneH + safezoneY; w = 0.0836719 * safezoneW; h = 0.051 * safezoneH; colorActive[] = {0.5,0.7,0.5,0.8}; action = "ok = true"; }; }; }; menuDiff.sqf Spoiler _menuLayer = ["difficultyFade"] call BIS_fnc_rscLayer; _menuLayer cutText ["", "BLACK FADED", 999]; // Enable borders [0, 0, false, true ] spawn BIS_fnc_cinemaBorder; // Create menu background private _camera = "camera" camCreate getPosATL screen; _camera cameraEffect ["internal", "back"]; _camera camPrepareTarget getPosATL screen; _camera camPrepareFOV 0.5; _camera camCommitPrepared 0; camCommitted _camera; sleep 3; _menuLayer cutText ["", "BLACK IN", 3]; sleep 3; // Open menu difficulty diff = 0; // Declare difficulty ok = false; // Open GUI _display = findDisplay 46 createDisplay "chooseDifficulty"; waitUntil{ok}; _display closeDisplay 1; execVM "sections\1.sqf"; _camera cameraEffect ["terminate", "back"]; camDestroy _camera; Share this post Link to post Share on other sites
killzone_kid 1326 Posted December 1, 2021 displayAddEventHandler ["keydown" .....] override escape key https://community.bistudio.com/wiki/User_Interface_Event_Handlers#onKeyDown Share this post Link to post Share on other sites
sizraide 4 Posted December 1, 2021 9 hours ago, killzone_kid said: displayAddEventHandler ["keydown" .....] override escape key https://community.bistudio.com/wiki/User_Interface_Event_Handlers#onKeyDown // Open GUI _display = findDisplay 46 createDisplay "chooseDifficulty"; // Add UI EventHandler _displayHandler = (findDisplay 46) displayAddEventhandler["KeyDown",{ params ["_display","_key"]; if (_key == 1) exitWith {true}; false }]; waitUntil{ok}; // Remove displayHandler (findDisplay 46) displayRemoveEventHandler ["KeyDown", _displayHandler]; I made an displayEventHandler, this doesn't seem to be working? Any clues? When I press ESC, it still closes the display. But no error pops up. Share this post Link to post Share on other sites
soldierXXXX 77 Posted December 1, 2021 Hi @sizraide Try this with your original code: // Add UI EventHandler _displayHandler = _display displayAddEventhandler["KeyDown",{ params ["_displayOrControl", "_key", "_shift", "_ctrl", "_alt"]; private _rewriteKey = FALSE; if (_key == 1) then {systemChat "button esc clicked";_rewriteKey = TRUE;}; _rewriteKey }]; // Remove displayHandler _display displayRemoveEventHandler ["KeyDown", _displayHandler]; I´ve added eventhandler to your created display instead of mission display for the clarity purposes. Just to be sure you might also consider using disableSerialization. I´m not sure if this is actually needed but i personally use it every time i work with scripts that are using UI elements. Let me know if that helped 🙂 Share this post Link to post Share on other sites
7erra 629 Posted December 2, 2021 5 hours ago, sizraide said: // Open GUI _display = findDisplay 46 createDisplay "chooseDifficulty"; // Add UI EventHandler _displayHandler = (findDisplay 46) displayAddEventhandler["KeyDown",{ params ["_display","_key"]; if (_key == 1) exitWith {true}; false }]; waitUntil{ok}; // Remove displayHandler (findDisplay 46) displayRemoveEventHandler ["KeyDown", _displayHandler]; I made an displayEventHandler, this doesn't seem to be working? Any clues? When I press ESC, it still closes the display. But no error pops up. For some reason exitWith will not overwrite the event. try if else instead: _displayHandler = (findDisplay 46) displayAddEventhandler["KeyDown",{ params ["_display","_key"]; if (_key == 1) then { true } else { false }; }]; // or even more simple: _displayHandler = (findDisplay 46) displayAddEventhandler["KeyDown",{ params ["_display","_key"]; _key == 1 }]; Share this post Link to post Share on other sites
sizraide 4 Posted December 2, 2021 17 hours ago, 7erra said: For some reason exitWith will not overwrite the event. try if else instead: _displayHandler = (findDisplay 46) displayAddEventhandler["KeyDown",{ params ["_display","_key"]; if (_key == 1) then { true } else { false }; }]; // or even more simple: _displayHandler = (findDisplay 46) displayAddEventhandler["KeyDown",{ params ["_display","_key"]; _key == 1 }]; Appreciate the help! I managed to fix it here: // Open GUI _display = findDisplay 46 createDisplay "chooseDifficulty"; // Add UI EventHandler _display displayAddEventhandler["KeyDown",{ params ["", "_key"]; _key == 1 }]; // Wait for confirmation waitUntil{ok}; // Enable borders [0, 0, false, true ] spawn BIS_fnc_cinemaBorder; // Remove displayHandler findDisplay 46 displayRemoveAllEventHandlers "KeyDown"; // Close display finally _display closeDisplay 1; Share this post Link to post Share on other sites