[MSFS2024] Option to disable random aircraft registrations

Please let us disable the randomly generated aircraft registrations introduced in MSFS 2024 and use the ones preset with the liveries in the atc_id parameter instead.
The random ones are making the in-game ATC use wrong registrations for liveries without dynamic regs.
The popular flight trackers are creating the aircraft based on this so they’ll create a random aircraft each time you use them.

10 Likes

You can get ATC to ignore the 2024 generated tail number. I use this method for liveries for aircraft with no dynamic tail number like the Lear 35, Cessna 414 and C-130. You place a comma in the airline field, and then place the tail number in the flight number field. You need to remove any hyphen from the tail number as ATC pronounced this as minus. So VH-ABC becomes VHABC. The only limitation of this process is that ATC will always use the full tail number and never truncate it to a shorter version.

In Australia ATC almost never uses the full tail number anyway, so you could just put the truncated tail number in the flight number field, ie ABC.

This method works equally well in the aircraft.cfg as when using the same process when selecting an aircraft.

Nite that this process doesn’t hide the dynamic tail number, but I have found a method to do that for some aircraft at least.

2 Likes

Yes, I know this method, it has been worked in 2020 too.
It’s just way too painful to do it every single time. My aim with the topic is to be no need to manually set anything on the idetification tab: Basically the same as in 2020.

1 Like

My PowerShell scripts in 2020 handle all of these issues. They truncate the aircraft registration number to three characters as needed as well as all kinds of other stuff. Even determines if the skin uses a dynamic or static registration number and sets the “atc_id” parameter correctly in the aircraft.cfg file. If it is a static aircraft registration the script injects this “  ” value in the “atc_id” parameter which shows up as null in the sim allowing the painted on reg to show up and disables the registration box on the skin. Also copies panel.cfg and model.cfg folders and their respective config files if/when needed. Or the proper line entries in those files where needed to achieve a dynamic or static registration number. Does everything with one click once you set the folder name to what is needed and plug in a few parameters for some of the aircraft specific entries in the “ENTER DEFAULT VARIABLES HERE” section of the script like fuel burn rate, etc., from the original default aircraft’s aircraft.cfg.

In 2024, with the new native format, scripting is out the window for now. I need to figure out how to get what I need in the livery.cfg file and determine how Asobo intends to straighten out the dynamic registration issues before I invest in that level of effort. Things are a bit of a mystery right now and until a direction is determined and implemented, it would be a massive waste of effort.

Last time I started setting up ps1 scripts in 2020, Asobo released a new SDK and I had to go back and fix hundreds of scripts. 2024 is so bad, they are going to have to change a ton of things to get things right. It’s going to take months at minimum. If they even fix these problems properly. Fundamentally, from a framework perspective, there’s a lot to fix. Most people have no clue about all this stuff. All they see is a cool plane in the menu and think all is fine. It’s like walking into a bed and breakfast after a long drive and being comforted that the room is so clean only to pull back the sheets and find a bed bug infestation. It’s bad. I truly cannot believe this was released in this state. Senior management must not be aware.

Here’s my script for the Carenado Cessna 182. All of this to solve the issues of inconsistent aircraft.cfg, panel.cfg, model.cfg files for skins that you get when you download a skin from FSto. Everyone does it differently to a degree. My scripts create continuity in that scenario.

Don’t bother trying to copy and run this, as there are certain things you need to have in place for all this to work and it can be different for different aircraft. All third-party devs do things differently. I only posted this to show what level of effort is required from a scripting perspective to correct the discontinuity across third-party skin creator’s liveries. They are all over the place. 2024 has made in tenfold more difficult in its current state.

##################################################################
#                                                                #
#              MSFS 2020 AIRCRAFT.CFG FILE CREATOR               #
#----------------------------------------------------------------#
#                                                                #
# This script will delete the existing "aircraft.cfg" file for   #
# each skin and rebuild it from scratch.                         #
#                                                                #
# IMPORTANT: This script will not run successfully unless you    #
# follow an explicit folder naming convention as shown below.    #
#                                                                #
#  Skin-"Aircraft Model"_"Airline Name" ("Registration Number")  #
#                                                                #
#  e.g., Skin-C172_Air Alliance (D-EAFD)                         #
#                                                                #
##################################################################

# SET ISE ENVIRONMENT
# -------------------
Remove-Variable * -ErrorAction SilentlyContinue; Remove-Module *; $error.Clear(); Clear-Host
$ScriptRoot = ($ScriptRoot, "$PSScriptRoot" -ne $null)[0]
$ParentPath = Get-ChildItem "$ScriptRoot\Skin*"


# ENTER DEFAULT VARIABLES HERE
# ----------------------------
$BaseContainerDefault = "Carenado_CT182T_Skylane_G1000"
$BaseFolderPrefix = "Skin-C182T_"
$MenuSortPrefix = "00_"

$Description_Default = "The Cessna 182 Skylane is an American four-seat, single-engined light airplane, built by Cessna of Wichita, Kansas. It has the option of adding two child seats, installed in the baggage area. Introduced in 1956, the 182 has been produced in a number of variants, including a version with retractable landing gear, and is the second most popular Cessna model, after the 172."
$KB_Checklist_Default = ""
$KB_Reference_Default = ""
$WIP_Indicator_Default = 0
$Short_Description_Default = "Cessna C182T Skylane."
                       
$UI_Type_Default = "CT182T Skylane"
$UI_TypeRole_Default = "Single Engine Prop"
$UI_Autonomy_Default = 5
$UI_Max_Range_Default = 930
$UI_CreatedBy_Default = "Carenado"
$UI_Manufacturer_Default = "Cessna"
$UI_ThumbnailFile_Default = ""
$UI_Fuel_Burn_Rate_Default = 16.1
$UI_Certified_Ceiling_Default = 18100
             
$ATC_Heavy_Default = 0
$ATC_Airline_Default = "Skylane"
$ATC_Parking_Types_Default = "RAMP"
$ATC_Parking_Codes_Default = ""
        
$ICAO_Airline_Default = "Cessna"

$IsAirTraffic_Default = 0
$IsUserSelectable_Default = 1
$CanBeUsedByAITraffic_Default = 0


# FILE SOURCES
# ------------
$SourcePath = "$ScriptRoot\0_Config_Replacements"
$ModelSource = "$SourcePath\Model\model.cfg"
$PanelSource = "$SourcePath\Panel\*"
$TextureSource = "$SourcePath\texture\texture.cfg"
$ManifestSource = "$SourcePath\Manifest\*"


# RENAME NEW SKIN FOLDERS
# -----------------
$ParentPath = Get-ChildItem "$ScriptRoot" 
$NewSkinsFolder = $ParentPath | Where-Object -FilterScript {($_.Name -ne "0_Config_Replacements") -and ($_.Name -notlike "Skin-*") -and ($_.Name -notlike "*.*") -and ($_.Name -notlike "ZZ*")}

Foreach ($Folder in $NewSkinsFolder){
         Remove-Item -Path "$Path\*.json"
         $NewFolderName = "$BaseFolderPrefix$Folder"
         $NewFolderName = $NewFolderName -replace ' ','_'
         Remove-Item -Path "$Folder\*.json"
         $SimObjectTest = Test-Path -Path "$Folder\SimObjects"
  
     If ($SimObjectTest -eq $False){
         $PurgeFolder = $Folder | Get-ChildItem -Directory
         $PurgeSimObjects = $PurgeFolder | Get-ChildItem -Directory -Filter "SimObjects" -Recurse 
         $PurgeSimObjects | Move-Item -Destination ".\$Folder"
         $PurgeHTML_ui = $PurgeFolder | Get-ChildItem -Directory -Filter "html_ui" -Recurse 
         $PurgeHTML_ui | Move-Item -Destination ".\$Folder"
         Remove-Item -Path $Folder\$PurgeFolder -Recurse -Force}

         $Folder = Rename-Item $Folder $NewFolderName} 

<#------REMARKED
Foreach ($Folder in $NewSkinsFolder){
         $NewFolderName = "$BaseFolderPrefix$Folder"
         $NewFolderName = $NewFolderName -replace ' ','_'
         $Folder = Rename-Item $Folder $NewFolderName}
------REMARKED#>

# FILE AND FOLDER MIGRATION
# -------------------------
$ParentPath = Get-ChildItem "$ScriptRoot" 
$ParentPath = $ParentPath | Where-Object -FilterScript {($_.Name -like "$BaseFolderPrefix*")}

Foreach ($Path in $ParentPath){
        Remove-Item -Path "$Path\*.json"
        $SimObjectTest = Test-Path -Path "$Path\SimObjects"
        $ContentInfoTest = Test-Path -Path "$Path\ContentInfo"

    If ($SimObjectTest -eq $False){
        New-Item -Path "$Path\SimObjects\Airplanes" -Name "$Path" -ItemType Directory -Force
        $TargetFiles = Get-ChildItem -File "$Path" | Where-Object -FilterScript {($_.Name -ne "SimObjects")} | Move-Item -Destination "$Path\SimObjects\Airplanes\$Path"
        $TargetFolders = Get-ChildItem -Directory "$Path" | Where-Object -FilterScript {($_.Name -ne "SimObjects")} | Move-Item -Destination "$Path\SimObjects\Airplanes\$Path"}
        
    If ($ContentInfoTest -eq $False){   
        New-Item -Path "$Path" -Name 'ContentInfo' -ItemType Directory -Force}
    }

$ParentPath = Get-ChildItem "$ScriptRoot" 
$ParentPath = $ParentPath | Where-Object -FilterScript {($_.Name -like "$BaseFolderPrefix*")}
Foreach ($Path in $ParentPath){

        Copy-Item -Path "$ManifestSource" -Destination $Path -Force
        $ManifestGet = "$Path\manifest.json.txt"
        $ManifestRename = "manifest.json"
        $ManifestRename = Rename-Item $ManifestGet $ManifestRename

        $UI_Variation = $Path -split "$BaseFolderPrefix"
        $UI_Variation = $UI_Variation[1]
        $UI_Variation = $UI_Variation -replace '_',' '

        $SubPath = Get-ChildItem "$Path\SimObjects\Airplanes\*\"
        $NewSubPath = $Path -split "Skin-"
        $NewSubPath = $NewSubPath[1]
        $NewSubPath = "$MenuSortPrefix$NewSubPath"
		
    If ($SubPath.Name -ne $NewSubPath){
        $SubPath = Rename-Item $SubPath $NewSubPath
        $SubPath = Get-ChildItem "$Path\SimObjects\Airplanes\*\"}

        $ACConfig = "$SubPath\aircraft.cfg"
        $ACConfigGet = (Get-Content $ACConfig)
    
        $ATC_ID = $UI_Variation
        $ATC_ID -match "(?<=\().*(?=\))"
        $ATC_ID = $Matches.Values

        $ATC_Flight_Number = $ATC_ID
        If ($ATC_Flight_Number -contains '-'){$ATC_Flight_Number = $ATC_Flight_Number -replace ('-',"$Null")}
        $ATC_Flight_Number = $ATC_Flight_Number.Substring($ATC_Flight_Number.Get_Length()-3) 
                           
        $ATC_Airline = $UI_Variation -split '[`(]'
        $ATC_Airline = $ATC_Airline[0]
        $ATC_Airline = $ATC_Airline.Trim()

    If ($ATC_Airline -like "*`'*"){$ATC_Airline = $ATC_Airline -replace ("`'","$Null")}
        $ATC_Airline_Name = $ATC_Airline

    If ($ATC_Airline_Name -like "*Private*"){$ATC_Airline_Name = "$ATC_Airline_Default"}

        #$ATC_ID = "`"$ATC_ID`""

         $ATC_IDGet = $ACConfigGet | Select-String 'ATC_ID =' | Select-Object -ExpandProperty Line
    
    If ($ATC_IDGet -eq 'ATC_ID = "Â Â Â " ; tail number' -or
        $ATC_IDGet -eq 'ATC_ID = "." ; tail number' -or
        $ATC_IDGet -eq 'ATC_ID = "Â Â Â "' -or
        $ATC_IDGet -eq 'ATC_ID = "Â Â "' -or
        $ATC_IDGet -eq 'ATC_ID = "Â "' -or
        $ATC_IDGet -eq 'ATC_ID = "Â"' -or
        $ATC_IDGet -eq 'ATC_ID = "."' -or
        $ATC_IDGet -eq 'ATC_ID="."' -or
        $ATC_IDGet -eq 'ATC_ID=""' -or
        $ATC_IDGet -eq '    ATC_ID=""' -or 
        $ATC_IDGet -eq '    ATC_ID="."' -or
        $ATC_IDGet -eq '    ATC_ID = "."' -or
        $ATC_IDGet -eq '    ATC_ID = "Â"' -or
        $ATC_IDGet -eq '    ATC_ID = "Â "' -or
        $ATC_IDGet -eq '    ATC_ID = "Â Â "' -or
        $ATC_IDGet -eq '    ATC_ID = "Â Â Â "' -or
        $ATC_IDGet -eq '    ATC_ID = "." ; tail number' -or
        $ATC_IDGet -eq '    ATC_ID = "Â Â Â " ; tail number'  -and 
        $ATC_IDGet -ne '    ATC_ID = "ATC_ID"'){
        $ATC_IDGet = $ATC_IDGet -split '[`=]'
        $ATC_IDGet = $ATC_IDGet[1]
        $ATC_IDGet = $ATC_IDGet.Trim()
        $ATC_ID = 'Â Â Â '}


# BUILD NEW CONFIG FOLDERS
# ------------------------
    $TextureFolderName = Get-ChildItem "$SubPath\Texture.*"
    $TextureFolderExtension = $TextureFolderName -split '[.]'
    $TextureFolderExtension = $TextureFolderExtension[1]
    $ThumbnailSource = "$Subpath\Texture.*\thumbnail.jpg"
    $ContentInfoFolder = "$Path\ContentInfo"

    Copy-Item -Path $TextureSource -Destination $TextureFolderName -Force
    Copy-Item -Path $ThumbnailSource -Destination "$ContentInfoFolder" -Force

    $PanelFolderName = Get-ChildItem "$SubPath\Panel.*"
    $PanelTest = Test-Path -Path "$SubPath\Panel.*"
    $Panel_Default = ""
    
        If ($PanelTest -eq $True){  
                $GetCurrentReg = Get-Content $PanelFolderName\panel.cfg -RAW
                $CurrentReg = ($GetCurrentReg | Select-String '(?smi)\[VPainting01\].*').Matches.Value
              
                Copy-Item -Path $PanelSource -Destination $PanelFolderName -Recurse -Force

                $GetTempReg = Get-Content "$PanelFolderName\panel.cfg" -RAW
                $TempReg = ($GetTempReg | Select-String '(?smi)\[VPainting01\].*').Matches.Value

                $GetTempReg.replace("$TempReg","$CurrentReg" ) | Set-Content "$PanelFolderName\panel.cfg"

                $PanelFolderName = Rename-Item $PanelFolderName PANEL.Temp
                $PanelFolderName = Get-ChildItem $SubPath\Panel*
                $PanelFolderName = Rename-Item $PanelFolderName PANEL.$TextureFolderExtension
                $PanelFolderName = Get-ChildItem $SubPath\Panel*
                $Panel_Default = $TextureFolderExtension}


        ElseIf ($PanelTest -ne $True){
                $PanelFolderName = New-Item -ItemType Directory -Path "$SubPath" -Name PANEL.$TextureFolderExtension
                Copy-Item -Path $PanelSource -Destination $PanelFolderName -Recurse -Force
                $Panel_Default = $Panel_Default}

    $ModelFolderName = Get-ChildItem "$SubPath\Model*"
    $ModelTest = Test-Path -Path "$SubPath\Model*"
    $Model_Default = ""
   

        If ($ModelTest -eq $True){
                $ModelFolderName = Rename-Item $ModelFolderName model.temp
                $ModelFolderName = Get-ChildItem "$SubPath\Model*"
                $ModelFolderName = Rename-Item $ModelFolderName MODEL.$TextureFolderExtension
                $Model_Default = $TextureFolderExtension}



        ElseIf ($ModelTest -ne $True){
                $ModelFolderName = New-Item -ItemType Directory -Path "$SubPath" -Name MODEL.$TextureFolderExtension
                Copy-Item -Path $ModelSource -Destination $ModelFolderName -Force
                $Model_Default = $TextureFolderExtension}


    $SoundFolderName = Get-ChildItem $Path\Sound*
    $SoundTest = Test-Path -Path "$SubPath\Sound*"
    $Sound_Default = ""
        
        If ($SoundTest -eq $True){
                $SoundFolderName = Rename-Item $SoundFolderName SOUND.Temp
                $SoundFolderName = Get-ChildItem $SubPath\Sound*
                $SoundFolderName = Rename-Item $SoundFolderName SOUND.$TextureFolderExtension
                $Sound_Default = $TextureFolderExtension}

        ElseIf ($SoundTest -ne $True){
            $Sound_Default = $Sound_Default}


# CREATE NEW AIRCRAFT.CFG
# -----------------------
  New-Item -Path $SubPath -Name 'aircraft.cfg' -ItemType File -Force


# BUILD NEW AIRCRAFT.CFG
# ----------------------
    $SetConfig = @"
    `[VERSION`]
    Major = 1
    Minor = 0

    `[VARIATION`]
    base_container = "..\$BaseContainerDefault"

;===================== FLTSIM =====================

    `[FLTSIM.0`]
    Title = "$UI_Manufacturer_Default $UI_Type_Default $UI_Variation"
    Model = "$Model_Default"
    Panel =  "$Panel_Default"
    Sound = "$Sound_Default"
    Texture = "$TextureFolderExtension"
    Description = "$Description_Default"
    KB_Checklist = "$KB_Checklist_Default"
    KB_Reference = "$KB_Reference_Default"
    WIP_Indicator = "$WIP_Indicator_Default"
    Short_Description = "$Short_Description_Default"

    UI_Type = "$UI_Type_Default"
    UI_TypeRole = "$UI_TypeRole_Default"
    UI_Autonomy = "$UI_Autonomy_Default"
    UI_Max_Range = "$UI_Max_Range_Default"
    UI_Variation = "$UI_Variation"
    UI_CreatedBy = "$UI_CreatedBy_Default"
    UI_Manufacturer = "$UI_Manufacturer_Default"
    UI_ThumbnailFile = "$UI_ThumbnailFile_Default"
    UI_Fuel_Burn_Rate = "$UI_Fuel_Burn_Rate_Default"
    UI_Certified_Ceiling = "$UI_Certified_Ceiling_Default"

    ATC_ID = "$ATC_ID"
    ATC_Heavy = "$ATC_Heavy"
    ATC_Airline = "$ATC_Airline_Name"
    ATC_Flight_Number = "$ATC_Flight_Number"
    ATC_Parking_Types = "$ATC_Parking_Types_Default"
    ATC_Parking_Codes = "$ATC_Parking_Codes_Default"

    ICAO_Airline = "$ICAO_Airline_Default"

    IsAirTraffic = "$IsAirTraffic_Default"
    IsUserSelectable = "$IsUserSelectable_Default"
    CanBeUsedByAITraffic = "$CanBeUsedByAITraffic_Default"
"@

Add-Content $ACConfig -Value `n$SetConfig | Set-Content $ACConfig

Start-Process -FilePath '.\MSFSLayoutGenerator.exe' "$Path\layout.json"

#Start-Sleep -Seconds 1

}

End result looks like this:

    [VERSION]
    Major = 1
    Minor = 0

    [VARIATION]
    base_container = "..\Carenado_CT182T_Skylane_G1000"

;===================== FLTSIM =====================

    [FLTSIM.0]
    Title = "Cessna CT182T Skylane Private (N245TA)"
    Model = "GG"
    Panel =  "GG"
    Sound = ""
    Texture = "GG"
    Description = "The Cessna 182 Skylane is an American four-seat, single-engined light airplane, built by Cessna of Wichita, Kansas. It has the option of adding two child seats, installed in the baggage area. Introduced in 1956, the 182 has been produced in a number of variants, including a version with retractable landing gear, and is the second most popular Cessna model, after the 172."
    KB_Checklist = ""
    KB_Reference = ""
    WIP_Indicator = "0"
    Short_Description = "Cessna C182T Skylane."

    UI_Type = "CT182T Skylane"
    UI_TypeRole = "Single Engine Prop"
    UI_Autonomy = "5"
    UI_Max_Range = "930"
    UI_Variation = "Private (N245TA)"
    UI_CreatedBy = "Carenado"
    UI_Manufacturer = "Cessna"
    UI_ThumbnailFile = ""
    UI_Fuel_Burn_Rate = "16.1"
    UI_Certified_Ceiling = "18100"

    ATC_ID = "N245TA"
    ATC_Heavy = ""
    ATC_Airline = "Skylane"
    ATC_Flight_Number = "5TA"
    ATC_Parking_Types = "RAMP"
    ATC_Parking_Codes = ""

    ICAO_Airline = "Cessna"

    IsAirTraffic = "0"
    IsUserSelectable = "1"
    CanBeUsedByAITraffic = "0"

It would be great if they could not overwrite our custom registrations. For example I type in OY-KBO. The sim makes it LN-NVK just because I fly from an airport in Norway. I specifically set it to OY-KBO because I want to use that registration.

Re: the automatic creation of planes, @gcs7e74205. If you’re using Volanta you could disable the ‘Create aircraft automatically’ setting found in App Settings > General.
image

Yeah I know about this feature in Volanta, but it won’t solve that it’s just not picking up the correct aircraft, you have to select manually.

1 Like

If its going to take months for Asobo to sort out this mess (applying random registration numbers to the aircraft) couldn’t they at least make simple adjustments to program the panel.cfg (which is hidden from us plebs for some untathomable reason) … eg. ensure that the font size is appropriate to the aircraft size, and give it a default stroke (plain white?) so that the registration number will stand out better against the colour/s and design of any chosen livery??? In the meantime those of us with painted tail numbers could simply create an alternative texture for our most-used liveries without the numbers. Much easier and less time-consuming than trying to figure what Asobo has done.