AMRAC — Advanced Medium-Range Air Combat

What it adds
- 14 aircraft and 15 missiles, each with its own flight characteristics and performance
- Beyond-visual-range combat out to 40+ km, built for multiplayer servers
- Physics-based aerodynamics and flight model
- Editable, customizable aircraft and missile profiles, with real-time sync
- AI pilots with rank-based skill and aggression
- Support infrastructure: runways, hangars, missile loaders, GPS
- Radar/IR detection and countermeasure mechanics
Aircraft & Missiles
<div style="display:flex; flex-wrap:wrap; gap:12px; align-items:flex-start;"> <div style="flex:1 1 320px; min-width:280px;"> <img src="" rel="noopener nofollow" target="_blank">https://cdn.modrinth.com/data/cached_images/95e97b9854897dcbb4187322ffa8a7800cad972e.jpeg" alt="Aircraft" style="width:100%; height:auto;"> </div> <div style="flex:1 1 320px; min-width:280px;"> <img src="" rel="noopener nofollow" target="_blank">https://cdn.modrinth.com/data/cached_images/8ed56cd14850d4ebf45513bc293cf92b41fcf873.jpeg" alt="Missiles" style="width:100%; height:auto;"> </div> </div>
Aircraft
- US: F-4J, F-16, F-15/F-15E, F/A-18C
- USSR: MiG-21, MiG-23, MiG-29, Su-27/Su-30
- EU: Rafale, Typhoon
- CN: J-8II, J-10C
Missiles
- SARH: AIM-7, R-27
- IR: AIM-9, R-73, PL-8, PL-10
- ARH I: AIM-120, R-77, PL-12
- ARH II: AIM-120L, R-77-1, PL-12A, MICA-EM
- ARH III: Meteor, PL-15
Higher-tier missiles get a stronger motor, a sharper seeker, and an advanced datalink.
<div style="display:flex; flex-wrap:wrap; gap:12px; align-items:flex-start;"> <div style="flex:1 1 320px; min-width:280px; text-align:center;"> <a href="" rel="noopener nofollow" target="_blank">https://youtu.be/_2JSUnvX8s0"> <img src="" rel="noopener nofollow" target="_blank">https://img.youtube.com/vi/_2JSUnvX8s0/hqdefault.jpg" alt="PL-15 victim" style="width:100%; aspect-ratio:16/9; object-fit:cover;"> </a> <p><strong>PL-15 victim</strong></p> </div> <div style="flex:1 1 320px; min-width:280px; text-align:center;"> <a href="" rel="noopener nofollow" target="_blank">https://youtu.be/_M-zQcNJoVI"> <img src="" rel="noopener nofollow" target="_blank">https://img.youtube.com/vi/_M-zQcNJoVI/hqdefault.jpg" alt="PL-15 missile" style="width:100%; aspect-ratio:16/9; object-fit:cover;"> </a> <p><strong>PL-15 missile</strong></p> </div> </div>
AI Pilots
Ranks & capabilities
- Trainee — flies the F-4J and MiG-21; won't engage, cruises at 2,000 m
- Elementary — flies the F-4J, MiG-21 and MiG-23; engages, cruises at 3,000 m
- Advanced — flies the F-16, MiG-29 and J-8II; engages and can notch, cruises at 4,500 m
- Veteran — flies the F-15/F-15E, Su-27/Su-30, Rafale and F/A-18C; aggressive, good at notching, cruises at 5,500 m
- Ace — flies the J-10C and Typhoon; very aggressive, excellent at notching, cruises at 7,000 m
Deploying AI
- Junior AI Pilot — Trainee or Elementary
- Senior AI Pilot — Advanced, Veteran or Ace
- AI Command Block — redstone-triggered launch; sets aircraft, rank, team, fuel, loadout, position and heading
/amrac ai start <pos> <radius>— launches every AI pilot in range- Engagement range: 6 km (Elementary), 14 km (Advanced), 22 km (Veteran), 32 km (Ace)
Radar & Countermeasures
Sensors
- Radar — each aircraft has its own scan cone and range; low targets hide in ground clutter
- SARH — needs your radar lock until impact
- ARH — datalink midcourse, own seeker in the terminal phase; free to turn away once it goes active
- Two-way datalink — AIM-120L, R-77-1, PL-12A, Meteor and PL-15 can be re-guided if the seeker loses the target
- IR — tracks heat; flares work less well while your afterburner is lit
- Seeker view — look through the missile's seeker before you fire
Countermeasures
- Missile warning — RWR sounds when a missile is inbound; an ARH missile stays silent until its seeker goes active
- Notching — beam a radar missile to drop into its Doppler gate and break the lock
- Chaff — can pull a radar missile off you while you are in the notch
- Flares — decoy IR seekers
<div style="display:flex; flex-wrap:wrap; gap:12px; align-items:flex-start;"> <div style="flex:1 1 320px; min-width:280px; text-align:center;"> <a href="" rel="noopener nofollow" target="_blank">https://youtu.be/jpyYY0sX_wE"> <img src="" rel="noopener nofollow" target="_blank">https://img.youtube.com/vi/jpyYY0sX_wE/hqdefault.jpg" alt="IR victim" style="width:100%; aspect-ratio:16/9; object-fit:cover;"> </a> <p><strong>IR victim</strong></p> </div> <div style="flex:1 1 320px; min-width:280px; text-align:center;"> <a href="" rel="noopener nofollow" target="_blank">https://youtu.be/OTTTKLizZ7g"> <img src="" rel="noopener nofollow" target="_blank">https://img.youtube.com/vi/OTTTKLizZ7g/hqdefault.jpg" alt="IR missile" style="width:100%; aspect-ratio:16/9; object-fit:cover;"> </a> <p><strong>IR missile</strong></p> </div> </div>
Flight Model
- Lift, drag and thrust from air density; thrust varies with altitude and Mach
- Control authority fades as the air thins or speed drops
- AoA limiter (on by default) and stick limiter; switch them off for unrestricted high-AoA manoeuvring
- Structural speed limit for each aircraft, varying with altitude; exceed it and the airframe breaks up
- Fuel has weight and can be dumped in flight; run dry and you glide
- Flaps, speed brake, wheel brake and retractable gear
Console & Profiles
<div style="display:flex; flex-wrap:wrap; gap:12px; align-items:flex-start;"> <div style="flex:1 1 320px; min-width:280px;"> <img src="" rel="noopener nofollow" target="_blank">https://cdn.modrinth.com/data/cached_images/e589657504516daeb3fbb87875da3671fbf5996b.jpeg" alt="Console" style="width:100%; height:auto;"> </div> <div style="flex:1 1 320px; min-width:280px;"> <img src="" rel="noopener nofollow" target="_blank">https://cdn.modrinth.com/data/cached_images/74a621dde82df541815200b1f3629aab2dde4f25.jpeg" alt="Screen" style="width:100%; height:auto;"> </div> </div>
- Console + Screen — link a console to a screen for a big-screen map or live charts
- Aircraft charts — turn rate vs speed, SEP vs speed, max speed vs altitude
- Missile charts — speed vs time, available G vs speed, NEZ vs speed
- Profiles — every aircraft and missile is a JSON file; edit it in game and it syncs to every client in real time
- Only operators can apply changes
Multiplayer
- Teams —
/amrac team create|join|leave; AI pilots fight for a team and only engage other teams - Physics and missile guidance are server-authoritative
- AI aircraft keep flying on a lightweight simulation when no player is nearby
Controls
Mouse steering is on by default. All keys can be changed on the Aircraft Controls screen (I).
| Action | Key |
|---|---|
| Pitch / roll | Mouse, or W / S and Q / E |
| Rudder | A / D |
| Throttle | Left Shift / Left Ctrl |
| Gear / Flaps | G / F |
| Speed brake / Wheel brake | H / Left Ctrl |
| AoA limiter / Stick limiter / Auto level | L / 1 / 2 |
| Radar | R |
| Cannon | Left mouse |
| Launch missile / Switch missile | Space / X |
| Seeker view (hold) | Z |
| Chaff / Flare | C / V |
| GPS / GPS range | M / N |
| Dump fuel (hold) | J |
| Leave aircraft | Left Alt |
Commands
/amrac summon <aircraft> [pos] [fuel%] [loadout]— spawn an aircraft/amrac ai start <pos> <radius>/ai list— launch or list AI pilots/amrac team create|join|leave <name>— manage teams/amrac trace start|stop|status— record an engagement/amrac clear [radius]/purge— remove aircraft
All commands except team join and team leave need operator permission.
Getting Started
- Take items from the AMRAC creative tab
- Build a runway with the Runway Kit and place an aircraft on it
- Right-click the aircraft with Fuel, then with missiles, rounds, chaff or flares
- Right-click with an empty hand to board, throttle up with Left Shift
- Press R for radar, lock a target, Space to fire
Engagement Videos
<div style="display:flex; flex-wrap:wrap; gap:12px; align-items:flex-start;"> <div style="flex:1 1 320px; min-width:280px; text-align:center;"> <a href="" rel="noopener nofollow" target="_blank">https://youtu.be/-S0JmIzexcg"> <img src="" rel="noopener nofollow" target="_blank">https://img.youtube.com/vi/-S0JmIzexcg/hqdefault.jpg" alt="F-15 vs Typhoon replay" style="width:100%; aspect-ratio:16/9; object-fit:cover;"> </a> <p><strong>F-15 vs Typhoon (replay)</strong></p> </div> <div style="flex:1 1 320px; min-width:280px; text-align:center;"> <a href="" rel="noopener nofollow" target="_blank">https://youtu.be/KFjSNiFGhkc"> <img src="" rel="noopener nofollow" target="_blank">https://img.youtube.com/vi/KFjSNiFGhkc/hqdefault.jpg" alt="F-15 vs Typhoon POV" style="width:100%; aspect-ratio:16/9; object-fit:cover;"> </a> <p><strong>F-15 vs Typhoon (POV)</strong></p> </div> </div>
Requirements
- Minecraft 26.2
- Fabric Loader 0.19.3+
- Fabric API
- Java 25
- Install on both server and client
- HVS companion mod
Credits
- nonamenov6638, EmanonTheBeauty, uumatter: Architecture, Programming, Code review, Art design
- AntsHsu, uumatter: 3D modelling, Art design
- Claude Code: Programming, 3D modelling
License
- Source code: LGPL-3.0-only
- All other assets: All Rights Reserved
Appendix and others
Default Performance Samples
- Aircraft
<div style="display:flex; flex-wrap:wrap; gap:12px; align-items:flex-start;"> <div style="flex:1 1 320px; min-width:280px;"> <img src="" rel="noopener nofollow" target="_blank">https://cdn.modrinth.com/data/cached_images/d517083fab15bbe4922c8eb82a5640f28e190cf8.png" alt="aircraft-instantaneous-turn" style="width:100%; height:auto;"> </div> <div style="flex:1 1 320px; min-width:280px;"> <img src="" rel="noopener nofollow" target="_blank">https://cdn.modrinth.com/data/cached_images/20b296de07f4e6a64876baca64683a0cb666b9a4.png" alt="aircraft-sustained-turn" style="width:100%; height:auto;"> </div> <div style="flex:1 1 320px; min-width:280px;"> <img src="" rel="noopener nofollow" target="_blank">https://cdn.modrinth.com/data/cached_images/18113fb79d93f74e947c6b113c64d3e3c0e9092a.png" alt="aircraft-sep" style="width:100%; height:auto;"> </div> <div style="flex:1 1 320px; min-width:280px;"> <img src="" rel="noopener nofollow" target="_blank">https://cdn.modrinth.com/data/cached_images/14baa5e1a8680336f12662c6d46a233e28a68b42.png" alt="aircraft-max-speed" style="width:100%; height:auto;"> </div> </div>
- Missiles
<div style="display:flex; flex-wrap:wrap; gap:12px; align-items:flex-start;"> <div style="flex:1 1 320px; min-width:280px;"> <img src="" rel="noopener nofollow" target="_blank">https://cdn.modrinth.com/data/cached_images/93d860b31d834e32819de0de56db08b366be3ceb.png" alt="missile-speed-time" style="width:100%; height:auto;"> </div> <div style="flex:1 1 320px; min-width:280px;"> <img src="" rel="noopener nofollow" target="_blank">https://cdn.modrinth.com/data/cached_images/c1b2e9fae10525e5d35ff1da8c1c4abfb973bbc7.png" alt="missile-available-load" style="width:100%; height:auto;"> </div> <div style="flex:1 1 320px; min-width:280px;"> <img src="" rel="noopener nofollow" target="_blank">https://cdn.modrinth.com/data/cached_images/814b75808a5467b0c749ab08e9453852cb5544e2.png" alt="missile-nez" style="width:100%; height:auto;"> </div> <div style="flex:1 1 320px; min-width:280px;"> <img src="" rel="noopener nofollow" target="_blank">https://cdn.modrinth.com/data/cached_images/3864bef3d7a368609f65c422c67b94ebec641961.png" alt="missile-motor-thrust" style="width:100%; height:auto;"> </div> </div>
Alt: 7000m, Launching Speed: 400m/s, Target speed: 400m/s
Speed Scaling/HVS
- HVS pre-baking is required for chunks to stream in below 700 m altitude. If you don't care about the ground, pre-baking is unnecessary; just make sure to climb above 700 m as soon as possible after takeoff.
- Even with our dedicated optimization mod, the experience may still not be ideal for everyone. We therefore offer 1/2 and 1/4 speed scaling profiles; use one to replace the original flightmodel files. https://github.com/uumatte/AMRAC-Tools
Version Support
We are working on 1.20.1 NeoForge/Fabric versions of this mod and will publish them after testing and debugging.
JSON Files
- Location:
config/amrac/flightmodel/(client and server alike) - Curves are linearly interpolated
- Environment JSON
{
"altitudeScale": 1.0,
"seaLevelY": 63.0,
"gravity": 9.81,
"densityCurve": [
[0, 1.225], [1000, 1.1117], [2000, 1.0066], [3000, 0.9093], [4000, 0.8194], [5000, 0.7364],
[6000, 0.6601], [7000, 0.59], [8000, 0.5258], [9000, 0.4671], [10000, 0.4135], [11000, 0.3639],
[12000, 0.3119], [13000, 0.2666], [14000, 0.2279], [16000, 0.1665], [18000, 0.1216],
[20000, 0.0889], [24000, 0.0469], [28000, 0.0251]
],
"speedOfSoundCurve": [
[0, 340.0], [1000, 336.4], [2000, 332.6], [3000, 328.6], [4000, 324.6], [5000, 320.6],
[6000, 316.4], [7000, 312.4], [8000, 308.2], [9000, 303.8], [10000, 299.6], [11000, 295.2],
[20000, 295.2], [28000, 300.0]
],
"debug": {
"telemetry": false,
"intervalTicks": 20
}
}
- Aircraft JSON
{
"id": "typhoon",
"mass": 14198,
"wingArea": 51.2,
"engine": {
"thrustAltitudeCurve": [
[0, 120000.0], [1000, 111901.0], [2000, 104179.0], [3000, 96826.0], [4000, 89834.0],
[5000, 83185.0], [6000, 76885.0], [7000, 70915.0], [8000, 65270.0], [9000, 59937.0],
[10000, 54902.0], [11000, 50076.0], [12000, 44814.0], [14000, 35752.0], [16000, 28519.0],
[18000, 22744.0], [20000, 18152.0], [24000, 11454.0]
],
"afterburnerThrustMultiplier": 1.5,
"thrustMachCurve": [
[0.0, 1.0], [0.3, 0.97], [0.6, 0.99], [0.9, 1.05], [1.0, 1.11], [1.2, 1.29], [1.4, 1.47],
[1.6, 1.62], [1.8, 1.74], [2.0, 1.81], [2.2, 1.9], [2.5, 2.02], [3.0, 2.15]
]
},
"aerodynamics": {
"liftCoefficientCurve": [
[-90.0, 0.0], [-90.0, -0.0], [-70.0, -0.6778], [-55.0, -1.0176], [-49.6, -1.311],
[-43.2, -1.4689], [-37.9, -1.6045], [-34.0, -1.716], [-30.1, -1.6216], [-26.2, -1.4758],
[-20.9, -1.2235], [-15.7, -0.9524], [-10.5, -0.6692], [-7.9, -0.5148], [-5.3, -0.3604],
[-3.4, -0.2557], [-1.7, -0.1596], [0.0, 0.0814], [1.7, 0.2046], [3.4, 0.3278], [5.3, 0.462],
[7.9, 0.66], [10.5, 0.858], [15.7, 1.221], [20.9, 1.5686], [26.2, 1.892], [30.1, 2.079],
[34.0, 2.2], [37.9, 2.057], [43.2, 1.8832], [49.6, 1.6808], [55.0, 1.3046], [70.0, 0.869],
[90.0, 0.0]
],
"dragCoefficientCurve": [
[-90.0, 2.12974], [-90.0, 2.12974], [-70.0, 1.53985], [-55.0, 1.20017], [-49.6, 1.10414],
[-43.2, 1.01243], [-37.9, 0.95918], [-34.0, 0.57848], [-30.1, 0.51837], [-26.2, 0.43222],
[-20.9, 0.30231], [-15.7, 0.18978], [-10.5, 0.10217], [-7.9, 0.0673], [-5.3, 0.04152],
[-3.4, 0.02921], [-1.7, 0.0216], [0.0, 0.018], [1.7, 0.02473], [3.4, 0.03724], [5.3, 0.05746],
[7.9, 0.09984], [10.5, 0.15717], [15.7, 0.30114], [20.9, 0.48612], [26.2, 0.69962],
[30.1, 0.84128], [34.0, 0.94005], [37.9, 0.95918], [43.2, 1.01243], [49.6, 1.10414],
[55.0, 1.20017], [70.0, 1.53985], [90.0, 2.12974]
],
"waveDragMachCurve": [
[0.0, 0.0], [0.579, 0.0], [0.724, 0.0018], [0.82, 0.00509], [0.888, 0.00957],
[0.945, 0.01594], [1.013, 0.02381], [1.1, 0.0283], [1.2, 0.02993], [1.3, 0.02765],
[1.4, 0.02544], [1.6, 0.02128], [1.8, 0.02079], [2.0, 0.02036], [2.2, 0.01997],
[2.5, 0.01946], [3.0, 0.01877]
],
"liftAltitudeMultiplierCurve": [
[0, 1.0], [8391.0, 1.0], [8591.0, 0.972], [8791.0, 0.896], [8991.0, 0.784], [9191.0, 0.648],
[9391.0, 0.5], [9591.0, 0.352], [9791.0, 0.216], [9991.0, 0.104], [10191.0, 0.028],
[10391.0, 0.0], [28000, 0.0]
]
},
"limits": {
"maxPositiveG": 12,
"maxNegativeG": -3,
"limiterAngleOfAttack": 28,
"limiterSoftStartAngleOfAttack": 22,
"structuralSpeedLimitCurve": [
[0, 405.0], [1000, 405.0], [2000, 429.0], [3000, 470.0], [4000, 511.0], [5000, 540.0],
[6000, 557.0], [7000, 574.0], [8000, 589.0], [9000, 607.6], [10000, 607.6], [11000, 599.2],
[13000, 590.4], [15000, 590.4], [18000, 590.4], [21000, 591.6]
]
},
"response": {
"maxPitchRate": 100,
"maxRollRate": 200,
"maxYawRate": 15,
"pitchRateResponse": 0.65,
"rollRateResponse": 0.75,
"yawRateResponse": 0.35,
"controlAuthorityReferenceSpeed": 90,
"minimumControlAuthority": 0.07,
"postStallControlAuthority": 0.4
},
"stability": {
"pitchStability": 0.4,
"yawStability": 0.8,
"maxPitchStabilityRate": 25,
"maxYawStabilityRate": 18
},
"ground": {
"rollingResistance": 0.02,
"lateralGrip": 6,
"thrustFactor": 0.85
},
"publishedSpeeds": {
"militaryLevelSpeed": 333,
"afterburnerLevelSpeed": 390
},
"radar": {
"horizontalScan": 200,
"verticalScan": 180,
"scanRateHz": 40,
"lockRange": 41823,
"trackMemorySeconds": 3,
"maxContacts": 12,
"acquireMargin": 0.94,
"velocityGate": 10,
"velocityGateLookDownOnly": false
},
"fuel": {
"capacityLitres": 6245,
"referenceFuelFraction": 0.5,
"throttleThrustCurve": [
[0, 0.06], [0.2, 0.17], [0.4, 0.34], [0.6, 0.54], [0.8, 0.77], [1, 1]
],
"throttleFlowCurve": [
[0, 0.146], [0.2, 0.624], [0.4, 0.958], [0.6, 1.27], [0.8, 1.645], [1, 2.082]
],
"afterburnerFlowMultiplier": 3.84
},
"flaps": {
"liftIncrement": 0.35,
"dragIncrement": 0.045,
"placardSpeed": 130,
"travelTicks": 22
},
"countermeasures": {
"capacity": 352,
"chaff": 320,
"flare": 32
},
"flightControl": {
"fullAuthoritySpeed": 145,
"rollTaperOnsetSpeed": 270,
"rollHighPressureTaper": 0.2,
"pitchAuthorityExponent": 0.7,
"rollAuthorityExponent": 0.55,
"yawAuthorityExponent": 0.88,
"angleOfAttackCaptureSeconds": 0.22,
"limitSoftness": 0.2,
"storesAsymmetryTrim": 0.75
},
"inertia": {
"rollInertia": 24769,
"pitchInertia": 160489,
"yawInertia": 199930,
"rollControlMoment": 360251.0,
"pitchControlMoment": 700265.0,
"yawControlMoment": 65427,
"rollDamping": 432,
"pitchDamping": 1120,
"yawDamping": 2053,
"stationSpanMetres": [-4.2, 4.2, -2.9, 2.9, -1.4, 1.4],
"storesArmMetres": 0.55,
"fuelRollArmMetres": 1.64,
"fuelPitchArmMetres": 2.05
},
"postStall": {
"fadeBandDegrees": 10,
"pitchAuthority": 0,
"rollAuthority": 0,
"yawAuthority": 0,
"recoveryMoment": 0,
"recoveryPressureFloor": 0.15,
"rateCommandFade": 0
}
}
- Missile JSON
{
"id": "METEOR",
"mass": 190,
"referenceArea": 0.0249,
"length": 3.65,
"motor": {
"thrustCurve": [
[0, 45244.43736], [5.25, 45244.43736], [5.45, 5500], [38.65, 5500],
[38.85, 0], [199.65, 0]
]
},
"aerodynamics": {
"dragCoefficientCurve": [
[0, 1.22163], [0.6, 1.26304], [0.8, 1.38734], [0.9, 1.73931], [0.95, 2.42259],
[1.05, 2.94025], [1.2, 2.77459], [1.5, 2.12235], [2, 1.72893], [2.5, 1.53226], [3, 1.42872],
[3.5, 1.3666], [4, 1.34587], [5, 1.32517], [6, 1.31469]
],
"normalForceCoefficientCurve": [
[0, 0], [2, 2.5], [5, 6.45], [10, 13.5], [15, 21], [20, 28.875], [25, 36], [30, 40.5],
[40, 43.625]
],
"controlAuthorityCurve": [
[0.0, 0.42], [0.5, 0.64], [0.8, 0.88], [1.0, 0.99], [1.2, 1.0], [2.0, 1.0], [2.8, 0.99],
[3.5, 0.96], [4.5, 0.92], [5.5, 0.88]
]
},
"limits": {
"maxG": 40,
"maxAoA": 27,
"maxGRate": 150
},
"launch": {
"maxRange": 41823,
"minRange": 24,
"cooldownTicks": 30,
"warmupSeconds": 2.0,
"carried": 4,
"rearmTicks": 60
},
"seeker": {
"gimbalDegrees": 32,
"navigationConstant": 3.3,
"maxLeadTicks": 92,
"activeHoming": true,
"type": "ARH",
"fovDegrees": 6,
"activationRange": 18000,
"velocityGate": 10,
"velocityGateLookDownOnly": false,
"chaffSusceptibility": 0.2,
"extrapolateOnLoss": true,
"extrapolateAfterDecoy": false,
"twoWayDatalink": true,
"datalinkUpdateSeconds": 0.5,
"datalinkErrorDegrees": 0.3,
"scanRateDegreesPerSecond": 1200,
"reacquireSeconds": 0.5,
"confirmSeconds": 0.2,
"gimbalMemorySeconds": 0.25,
"gimbalConfirmSeconds": 0.1,
"inertialDriftMetresPerSecond": 0.8,
"burnThroughRange": 1500
},
"loft": {
"angleDegrees": 4,
"fullRange": 16730,
"minRange": 5580,
"ceiling": 22000
},
"warhead": {
"explosionPower": 3,
"proximityFuseRadius": 11,
"armingDistance": 24
},
"carriage": {
"dragArea": 0.026
},
"lifetimeTicks": 1300,
"inducedDrag": {
"factor": 1.0,
"speedLossPerG2": 0,
"speedLossCap": 0.05
},
"referenceShot": {
"altitude": 8000,
"launchSpeed": 500,
"targetSpeed": 500
}
}