I've gotten questions from a lot of people on how to incorporate an interactive cockpit into their addon that I've determined that it's about time to make a tutorial explaining the mechanics behind it. At it's core it's not that complex, it just requires that the script is able to run faster than the virtual machine scheduler runs most scripts and so must be run on a per frame handler - you can use ArmA3's functionality, CBA, or a custom map mechanic (note that if you're doing this for ArmA2 you can only use CBA or the custom map mechanic; their usage is outside of the scope of this tutorial). I do recommend making some changes to your model's memory LOD which I'll cover here, but I'll also cover mechanics to work without needing to do that. First step: memory LOD in your model. To get more precision and make it easier to track your controls, I recommend creating a set of points to reference key positions in the cockpit. Place your point where you want the control to be in memory LOD and give them a unique name - I used the prefix ctrlref_ for all of my points - and repeat for all the controls you want. Alternative: If you don't want to or cannot make points in the model, you can use an alternative scripting mechanic, which I'll get into later. Second step: The script is the next part and it determines what controls you have, what you want them to do, and what conditions for the interaction. Here is a variation of the script: //if the player is in a vehicle then we don't run this if(vehicle player iskindof "Man") then { _nearestvehs = nearestobjects [player, ["car","tank","boat","plane","helicopter"], 10]; //check for these vehicle classes if(count _nearestvehs < 1) exitwith {}; if(isNil "button_clicked") then {button_clicked = 0;}; //keeps our key from constantly having an effect - that is, press it once and it won't do anything again until released and pressed again _nearestveh = _nearestvehs select 0; _getinpos = _nearestveh modelToWorld (_nearestveh selectionposition "pos driver dir"); //the vehicle's driver point _getinpos = worldtoscreen _getinpos; //convert the above to screen coordinates if(count _getinpos < 2) then {_getinpos = [-100,-100];}; //if the point is outside of our FOV then set it to something ridiculous _getinpos2 = _nearestveh modelToWorld (_nearestveh selectionposition "pos gunner dir"); _getinpos2 = worldtoscreen _getinpos2; if(count _getinpos2 < 2) then {_getinpos2 = [-100,-100];}; _getinpos3 = _nearestveh modelToWorld (_nearestveh selectionposition "pos commander dir"); _getinpos3 = worldtoscreen _getinpos3; if(count _getinpos3 < 2) then {_getinpos3 = [-100,-100];}; _getinpos4 = _nearestveh modelToWorld (_nearestveh selectionposition "pos cargo dir"); _getinpos4 = worldtoscreen _getinpos4; if(count _getinpos4 < 2) then {_getinpos4 = [-100,-100];}; _hinttext = "No Action"; //basic hint to indicate what we're looking at if(_getinpos distance [0.5,0.5] < 0.4) then {_hinttext = "Get in as Driver";}; //change hint to driver if the match is for the driver point if(_getinpos2 distance [0.5,0.5] < 0.4) then {_hinttext = "Get in as Gunner";}; if(_getinpos3 distance [0.5,0.5] < 0.4) then {_hinttext = "Get in as Commander";}; if(_getinpos4 distance [0.5,0.5] < 0.4) then {_hinttext = "Get in as Cargo";}; if(!(_hinttext == "")) then {hintsilent format ["%1",_hinttext];}; //set our hint text if(_hinttext == "No Action") exitwith {}; //if no action available then we don't need to do anything so quit //check to see if our action is within the right parameters and that the key has been pressed, then do something if(inputaction "User20" > 0.5 && button_clicked == 0 && _getinpos distance [0.5,0.5] < 0.4) then { player action ["getInDriver", _nearestveh]; button_clicked = 1; }; if(inputaction "User20" > 0.5 && button_clicked == 0 && _getinpos2 distance [0.5,0.5] < 0.4) then { player action ["getInGunner", _nearestveh]; button_clicked = 1; }; if(inputaction "User20" > 0.5 && button_clicked == 0 && _getinpos3 distance [0.5,0.5] < 0.4) then { player action ["getInCommander", _nearestveh]; button_clicked = 1; }; if(inputaction "User20" > 0.5 && button_clicked == 0 && _getinpos4 distance [0.5,0.5] < 0.4) then { player action ["getInCargo", _nearestveh]; button_clicked = 1; }; //clear our key press if it's not being pressed if(inputaction "User20" < 0.5) then { button_clicked = 0; }; }; In this particular script, interaction is only for man class units and allows one to get into a particular vehicle position based upon distance to a vehicle and whether they are looking at a relevant point on the model (in this case, pos * dir points). It is called by placing the following in an init line: my_clickaction = compile preprocessFileLineNumbers "pfh_click.sqf"; ["my_clickid", "onEachFrame", "my_clickaction"] call BIS_fnc_addStackedEventHandler; Now, instead of a basic getin/getout script for all vehicles, what if you want a cockpit interaction script instead? Similar mechanics apply, we simply change the conditions and results. //if the player isn't in a helicopter then we don't run this if(vehicle player iskindof "Helicopter") then { _heli = vehicle player; if(isNil "button_clicked") then {button_clicked = 0;}; //keeps our key from constantly having an effect - that is, press it once and it won't do anything again until released and pressed again _controlpos = _heli modelToWorld (_heli selectionposition "ctrlref_p_rtrbrake"); //our desired control point _controlpos = worldtoscreen _controlpos; //convert the above to screen coordinates if(count _controlpos < 2) then {_controlpos = [-100,-100];}; //if the point is outside of our FOV then set it to something ridiculous _hinttext = "No Action"; //basic hint to indicate what we're looking at if(_controlpos distance [0.5,0.5] < 0.4) then {_hinttext = "Toggle Engine";}; //change hint to engine on if(!(_hinttext == "")) then {hintsilent format ["%1",_hinttext];}; //set our hint text if(_hinttext == "No Action") exitwith {}; //if no action available then we don't need to do anything so quit //check to see if our action is within the right parameters and that the key has been pressed, then do something if(inputaction "User20" > 0.5 && button_clicked == 0 && _controlpos distance [0.5,0.5] < 0.4) then { if(isengineon _heli) then { player action ["EngineOff", _heli]; } else { player action ["EngineOn", _heli]; }; button_clicked = 1; }; //clear our key press if it's not being pressed if(inputaction "User20" < 0.5) then { button_clicked = 0; }; }; This script is called the same way as the previous one. Now, say we don't have points in the memory LOD we can use. What then? We can use modelToWorld to select an arbitrary model position and use that as a positional reference instead. This method is difficult because you have to trial and error til you get your control to the approximate position you want it in. //if the player isn't in a helicopter then we don't run this if(vehicle player iskindof "Helicopter") then { _heli = vehicle player; if(isNil "button_clicked") then {button_clicked = 0;}; //keeps our key from constantly having an effect - that is, press it once and it won't do anything again until released and pressed again _controlpos = _heli modelToWorld [0,2,0]; //our desired control point tailored for AH-9 _controlpos = worldtoscreen _controlpos; //convert the above to screen coordinates if(count _controlpos < 2) then {_controlpos = [-100,-100];}; //if the point is outside of our FOV then set it to something ridiculous _hinttext = "No Action"; //basic hint to indicate what we're looking at //player sidechat format ["%1",_controlpos]; //debugging - shows position of a control on screen coordinates; the closer to 0.5,0.5, the closer it is to the center of the screen if(_controlpos distance [0.5,0.5] < 0.4) then {_hinttext = "Toggle Engine";}; //change hint to engine on if(!(_hinttext == "")) then {hintsilent format ["%1",_hinttext];}; //set our hint text if(_hinttext == "No Action") exitwith {}; //if no action available then we don't need to do anything so quit //check to see if our action is within the right parameters and that the key has been pressed, then do something if(inputaction "User20" > 0.5 && button_clicked == 0 && _controlpos distance [0.5,0.5] < 0.4) then { if(isengineon _heli) then { player action ["EngineOff", _heli]; } else { player action ["EngineOn", _heli]; }; button_clicked = 1; }; //clear our key press if it's not being pressed if(inputaction "User20" < 0.5) then { button_clicked = 0; }; }; This is all the pure basics of the interaction mechanic we have on the Apache; further items like onscreen hint text, cursors, mouse capability, etc. hinge upon the demand for tutorials of those items. Happy scripting!