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):

FolderAssetsNotes
Levels151Level1, MainMenu, Meshes, Forerunner trim-sheet Materials
Environment266Whole folder taken — the main source of orphans
MasterChief141Pulled by MainMenu (only needs MasterChiefHead)
Weapons73Pulled by MainMenu (only needs 3 *-static meshes)
Generic66Decals, fonts, UI sounds
LevelPrototyping9SM_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:

AssetReferenced by
Generic/Fonts/Microgramma_D_Extended_Bold_FontSystemLink/UI/Styles/Text/Style_Text-DefaultLarge, -InfoMedium, -Small
Generic/Sounds/UI/Click_on_Button_CueSystemLink/UI/Styles/Buttons/Style_ButtonSmall, XL, XXL
Generic/Sounds/UI/Selection_Changes_Cuethe 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:

  1. the two levels
  1. every asset outside the migrated folders — this is what protects
  2. Generic/Fonts/Microgramma_D_Extended_Bold_Font and the two UI sound cues (§2), which no level reaches but SystemLink/UI/Styles does

  1. 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 old 3rdParty_Assets paths and only the .ini joins 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, so Sitting_1 and Sitting_2 scanned 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).

FolderCountFolderCount
Environment/Textures39Environment/Crates9
Levels/Materials29Levels/MainMenu9
Environment/Panels23Levels/LevelPrototyping8
Environment/Doors20Environment/DoorWall5
Levels/Meshes20Environment/Hallway5
Environment/Props16Environment/gaming5

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:

ClassLabelLocation (X, Y, Z)
BP_ShotgunPickup_CBP_ShotgunPickup2−30.0, −300.0, −271.51
BP_ShotgunPickup_CBP_ShotgunPickup4−30.0, 2180.0, 1518.49
BP_ShotgunPickup_CBP_ShotgunPickup5640.0, −1985.13, 203.79
BP_AssultRiflePickup_CBP_AssultRiflePickup777.40, −1760.32, 0.0
BP_OverShieldPickup_CBP_OverShieldPickup649.0, −1745.47, 211.79
BP_OverShieldPickup_CBP_OverShieldPickup22142.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:

BlueprintParentBroken dependency
BP_WeaponPickupBaseEngine.ActorBPI_WeaponPickupHandler
BP_MasterChiefEngine.CharacterBPI_Interactable, BPI_WeaponPickupHandler, BPI_WeaponUser
ABP_MasterChiefEngine.AnimInstanceCtrRig_TurnInPlace_Mannyexists 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_VIOLATION in Background Worker #0 on 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=true with a trailing * on both OldName and NewName.
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:

BeforeAfter
CreateExport: Failed~2000
dependent package … not available188
Crate actors resolved0207

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_Crates BP/meshes → Environment/Crates/MilitaryCrates/…
  • 9 × VFX_Muzzle_FlashesLibrary/VFX_Muzzle_Flashes/…
  • 8 × MilitaryWeapDark sounds → Library/MilitaryWeapDark/Sound/…
  • T_Tech_Hex_Tile_N, CtrRig_TurnInPlace_MannySystemLink/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

  1. Are the migrated /Game/Weapons (73) and /Game/MasterChief (141) wanted, or are they
  2. duplicates of SystemLink/ content? This changes both the orphan list and whether the repointing in §6 is worth doing at all.

  1. Migrate the missing 3rdParty slices for the menu diorama's props, or restage it?
  1. Levels/LevelPrototyping shows 8 orphans — the level references
  2. /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 forrunnerForerunner 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.