Reference · Updated 2552.08.07.08.17
Level 1 / MainMenu Import — state, delete list, and recovered data
Migration of Level1 and MainMenu from the UE 5.6 project at C:\3D-DEV\HaloProject\SystemLink into 5.7. Branch: level1-import. Started 2026-07-31.
Migration of Level1 and MainMenu from the UE 5.6 project at C:\3D-DEV\HaloProject\SystemLink into 5.7. Branch: level1-import. Started 2026-07-31.
Collision reference: Docs/CollisionMeshes.md.
#1. What was migrated
Two passes from the old editor's Migrate (dependency-filtered, not whole folders except Environment):
| Folder | Assets | Notes |
|---|---|---|
Levels | 151 | Level1, MainMenu, Meshes, Forerunner trim-sheet Materials |
Environment | 266 | Whole folder taken — the main source of orphans |
MasterChief | 141 | Pulled by MainMenu (only needs MasterChiefHead) |
Weapons | 73 | Pulled by MainMenu (only needs 3 *-static meshes) |
Generic | 66 | Decals, fonts, UI sounds |
LevelPrototyping | 9 | SM_Cube / SM_Cylinder / SM_ChamferCube |
Total ~706 assets. Deliberately NOT migrated: 3rdParty_Assets (3.8 GB, 12 demo maps), Blueprints (old gameplay + old menu UI).
The old project's Content is 5.2 GB. Never migrate it wholesale — let Migrate
compute the dependency closure and read the report before confirming.
#2. 🔎 The migration repaired a pre-existing bug
/Game/Generic did not exist in the 5.7 project before this import, yet the project's own CommonUI styles already referenced assets inside it:
| Asset | Referenced by |
|---|---|
Generic/Fonts/Microgramma_D_Extended_Bold_Font | SystemLink/UI/Styles/Text/Style_Text-DefaultLarge, -InfoMedium, -Small |
Generic/Sounds/UI/Click_on_Button_Cue | SystemLink/UI/Styles/Buttons/Style_ButtonSmall, XL, XXL |
Generic/Sounds/UI/Selection_Changes_Cue | the same three button styles |
The menus had been falling back to a default font and silent buttons. These three must never be deleted — they are the only orphans (by level-reachability) that the shipping project actually needs.
#3. Delete list — ✅ DONE 2026-08-01 (commit 730c0c0f)
345 orphans deleted, 172 MB, 699 migrated assets down to 354, plus 62 empty directories pruned. Fully revertible — it is all in git.
The count grew from 202 to 345 because deleting BP_MasterChief, its anim blueprints and the pickup chain cut loose everything they held alive: 60 MasterChief animations, 23 UI assets, 11 input assets and most of the old non-GAS weapons implementation. Recompute, never reuse — the list is a function of what else has been deleted.
Reachability now runs from three sets of roots:
- the two levels
- every asset outside the migrated folders — this is what protects
Generic/Fonts/Microgramma_D_Extended_Bold_Font and the two UI sound cues (§2), which no level reaches but SystemLink/UI/Styles does
- every CoreRedirect target
⚠ CoreRedirects are INVISIBLE to reference scanning. They live in
DefaultEngine.ini, not in any package's name table. Five crate assets (BP_Box_A2,
BP_Box_A3,SM_Barrel_B3,SM_Box_A2,SM_Box_A4) looked unreferenced because the
level points at the old3rdParty_Assetspaths and only the.inijoins them. Deleting
them would have broken MainMenu's 207 crate actors again and left the redirects
dangling. Any future orphan sweep must parse the redirect table first.
⚠ The sweep got two wrong — and the method is why. It read references by scanning
package name tables for /Game/ strings, with no editor needed. UE does not always store a
package reference as one contiguous string, soSitting_1andSitting_2scanned as
unreferenced and were deleted, leaving three ERROR! Sequence Players in
ABP_MasterChiefMenu (the menu Chief's fidget state). Sibling animations in the *same
folder* were kept correctly, which is what makes the failure so easy to miss.
Restored in 7b2b91fa.
The method had been validated against UE's asset registry earlier and agreed exactly — 329
on disk / 127 used / 202 orphaned — so it was trusted on a later, larger dataset. **That
agreement was a property of the first dataset, not of the method.**
Use AssetRegistry.get_dependencies() for anything that decides a deletion; the
registry found both immediately. Afterwards it confirmed only three unresolvable dependency
targets across the migrated folders, the third being pre-existing.
Script: scratchpad/recompute_orphans.py — convenient (no editor) but not authoritative; use it to draft a list, then confirm every entry against the registry before deleting.
<details><summary>Original pre-deletion breakdown (202 assets, Level1 as the only root)</summary>
Computed from UE's asset registry with both levels as roots, then re-checked so that nothing outside the orphan set references any entry. 207 safe, 3 to keep (§2).
| Folder | Count | Folder | Count | |
|---|---|---|---|---|
Environment/Textures | 39 | Environment/Crates | 9 | |
Levels/Materials | 29 | Levels/MainMenu | 9 | |
Environment/Panels | 23 | Levels/LevelPrototyping | 8 | |
Environment/Doors | 20 | Environment/DoorWall | 5 | |
Levels/Meshes | 20 | Environment/Hallway | 5 | |
Environment/Props | 16 | Environment/gaming | 5 |
Plus singles/pairs in OverShieldPickup (3), Lights (2), Materials (2), forrunner-door-1 (2), Barricade, FBX_HaloTech1, FBX_Tech, Teleporter, folding-tbl-chr, Generic/Textures, CRT_test, CRT_test_Tex.
The first pass (Level1 only) called 202 assets orphaned; adding MainMenu as a second root rescued gaming 40→5, Crates 27→9 and all of folding-tbl-chr.
</details>
⚠ Not yet verified in engine. Both levels should be opened once to confirm nothing
essential went with the 345. The analysis was double-gated and deliberately under-deletes,
but only loading the levels proves it.
#4. Recovered design data — weapon pickup placements
Captured before the actors were deleted from Level1, so GAS pickups can be re-placed:
| Class | Label | Location (X, Y, Z) |
|---|---|---|
BP_ShotgunPickup_C | BP_ShotgunPickup2 | −30.0, −300.0, −271.51 |
BP_ShotgunPickup_C | BP_ShotgunPickup4 | −30.0, 2180.0, 1518.49 |
BP_ShotgunPickup_C | BP_ShotgunPickup5 | 640.0, −1985.13, 203.79 |
BP_AssultRiflePickup_C | BP_AssultRiflePickup | 777.40, −1760.32, 0.0 |
BP_OverShieldPickup_C | BP_OverShieldPickup | 649.0, −1745.47, 211.79 |
BP_OverShieldPickup_C | BP_OverShieldPickup2 | 2142.51, −1049.47, 0.0 |
All yaw 0. The two OverShield actors are still in the level — they compile fine.
#5. Blueprint compile errors and the fix
Three Blueprints failed to compile, blocking PIE. None inherited from the old C++ module — the root cause was three missing Blueprint interfaces:
| Blueprint | Parent | Broken dependency |
|---|---|---|
BP_WeaponPickupBase | Engine.Actor | BPI_WeaponPickupHandler |
BP_MasterChief | Engine.Character | BPI_Interactable, BPI_WeaponPickupHandler, BPI_WeaponUser |
ABP_MasterChief | Engine.AnimInstance | CtrRig_TurnInPlace_Manny — exists at SystemLink/Characters/MasterChief/Anims/Rigs/ |
Chosen fix: remove them rather than migrate the old interfaces, since the GAS equivalents already exist. Alternative if ever needed: migrating the three tiny BPI_ assets would make all three compile.
Progress: 4 pickup actors removed from Level1 and the level saved · BP_AssultRiflePickup and BP_ShotgunPickup deleted · BP_WeaponPickupBase, BP_MasterChief, ABP_MasterChief, ABP_MasterChiefFirstPerson still to delete.
⚠ EditorAssetLibrary.delete_asset in a loop CRASHED the editor (2026-07-31):
EXCEPTION_ACCESS_VIOLATIONinBackground Worker #0on the third delete. It performs a
Force Delete (LogUObjectGlobals: Force Deleting 1 Package(s)), and a background
worker was still churning the registry from the previous one. **Delete one asset per
bridge call, not in a loop.** Nothing was lost — the level had already saved, and the
crash discarded the half-applied reference nulling.
#5a. MainMenu load errors — FIXED with CoreRedirects
MainMenu threw ~200 CreateExport: Failed to load Outer errors on load. Two causes, two fixes.
Cause 1 — 3rdParty_Assets was never migrated, but ~207 crate actors referenced /Game/3rdParty_Assets/Military_Crates/.... The identical assets were already in the project under Environment/Crates/MilitaryCrates/ (they arrived with the Environment folder). Rather than re-migrate a duplicate set, Config/DefaultEngine.ini gained a [CoreRedirects] block mapping the 9 old package paths to the existing ones, plus wildcard redirects for VFX_Muzzle_Flashes and MilitaryWeapDark/Sound → /Game/Library/… and one for T_Tech_Hex_Tile_N.
⚠ MatchSubstring= is deprecated in UE 5.7 — it warns on every startup. Use
MatchWildcard=truewith a trailing*on bothOldNameandNewName.
CoreRedirects are read at startup only — the editor must be restarted for a change to
take effect.
Cause 2 — BP_MainMenuPlayerController needed the old menu UI (WB_MainMenu, WB_RootContainer, three modals, IMC_UI_GenericActions), none of which were migrated because CommonUI replaces them. Fix: pointed BP_MainMenuGameMode.PlayerControllerClass at the engine default PlayerController, saved it, and deleted BP_MainMenuPlayerController. The menu logic gets rebuilt on CommonUI; the level keeps the diorama.
Result — verified by reloading the level:
| Before | After | |
|---|---|---|
CreateExport: Failed | ~200 | 0 |
dependent package … not available | 18 | 8 |
| Crate actors resolved | 0 | 207 |
MainMenu now loads 729 actors: 358 StaticMeshActors, 207 crates, 68 decals, 59 groups, 6 × BP_MasterChiefMenuGuy, 2 skeletal meshes, and the CineCameraActor + CameraRig_Rail for the LS_MainIntro cinematic, with full lighting/sky/fog. The level is not marked dirty by the redirects — saving it would bake the new paths in and let the crate redirects be retired later.
The 8 that remain (no local equivalent — need a small targeted migrate or replacement): MilitaryWeapDark/Weapons/{AssaultRifleB_Ammo, Grenade_Launcher_B, Shotgun_B} (props in the diorama), StarterContent/Materials/M_Tech_Hex_Tile, and UEShieldSystem/{M_ShieldMasterMaterial, T_DireNoise_01, T_ML_Rubber_Blue_01_D} (the OverShield visual).
#6. Still broken / still missing
53 broken references at last count; 28 of them already exist elsewhere in the project and only need repointing:
- 9 ×
Military_CratesBP/meshes →Environment/Crates/MilitaryCrates/…
- 9 ×
VFX_Muzzle_Flashes→Library/VFX_Muzzle_Flashes/…
- 8 ×
MilitaryWeapDarksounds →Library/MilitaryWeapDark/Sound/…
T_Tech_Hex_Tile_N,CtrRig_TurnInPlace_Manny→SystemLink/Characters/MasterChief/…
25 are genuinely absent: the old menu UI (WB_MainMenu, WB_RootContainer, modals, IMC_UI_GenericActions, BP_SystemLinkGameMode, 3 × BPI_) — absent by design, CommonUI replaces them — plus MilitaryWeapDark weapon props, StarterContent HDRI/Shape_Sphere, and UEShieldSystem's shield material.
Consequence: MainMenu gives you the diorama (set, lighting, Chief, LS_MainIntro cinematic), not working menu logic.
#7. Open decisions
- Are the migrated
/Game/Weapons(73) and/Game/MasterChief(141) wanted, or are they
duplicates of SystemLink/ content? This changes both the orphan list and whether the repointing in §6 is worth doing at all.
- Migrate the missing 3rdParty slices for the menu diorama's props, or restage it?
Levels/LevelPrototypingshows 8 orphans — the level references
/Game/LevelPrototyping/..., so check the second copy under Levels/ before deleting.
#8. Naming cleanup (deferred until after deletion)
Deleting first roughly halves this. Across the survivors: 52 assets carry the forrunner → Forerunner misspelling, 48 have hyphens, 66 lack a type prefix, and 19 use an FBX_ prefix where SM_ belongs. The Assult/Assualt typo already tracked in CurrentFocus.md arrived again with this import.