Phayriosis Reborn Continued - Meteor Defender Spawn Reliability Repair
Build: 0.1.4 (hotfix, no internal version increment)
Target runtime: Minecraft 1.20.1, Forge 47.4.x, Java 17
Author remains: leo_san

Problem report
- Meteor landings out of player render distance lacked their exterior defenders.
- Ordinary animals or unrelated mobs occasionally appeared near the meteor with 100 maximum health.

Root causes and findings
1) Exterior defender arrays requested phayriosisreborn:assaulter (twice)
   and phayriosisreborn:spitter (twice), but entity registration contains
   primal_assaulter and primal_spitter. The former had the 0.1.3 elite equivalent,
   but the names in these four older slots were invalid.
2) spawnEntity used ForgeRegistries.ENTITY_TYPES.getValue() and checked only
   the returned value for null. A registry can return a default entity for
   unknown names. The result was not compared against its requested registry ID,
   so fallback animals could be spawned and subsequently given the 100-HP floor.
3) Meteor defenders were ordinary mobs without persistence-required enabled.
   Distant despawn/unloading could prevent exterior defenders from being present
   when the player returned. Entity spawning might also transiently fail while
   impacted chunks are being prepared; the old path made only one attempt.
4) The fast whitelist used by the In Control exemption retained the old
   'spitter' path and did not recognize 'primal_spitter'.

Implementation
- Replaced the two 'assaulter' slots with 'primal_assaulter', and two
  'spitter' slots with 'primal_spitter'; total exterior defender attempts
  remains 26, with the existing elite guard pool left in place.
- Replaced entity lookup with exact requested registry key comparison,
  restricted to the phayriosisreborn namespace; invalid IDs never spawn.
- Kept the original EntityType.spawn -> MeteorSpawnScope spawn mechanism,
  marker, In Control injections, and one-entity context intact.
- Added a MeteorDefenderSpawnManager helper for exterior defenders only.
  On success, it requires the meteor-origin marker, then enables Mob
  persistence and applies the previous 100-HP minimum helper.
- Added a maximum of 3 extra server-thread spawn attempts, two ticks apart,
  only when an exterior spawn returns null or lacks the marker. This stays
  within the original meteor ticking-chunk lease and prevents runaway retries.
- Updated the marker whitelist lookup to recognize 'primal_spitter'. This
  updates both the exact string and its Java hash-switch key; lookup for
  unrelated mobs still does not touch persistent NBT.
- Preserved Nucleus creation and its separate 500-HP adjustment entirely.
- Did not change meteor crater placement, block effects, configuration,
  meteor schedule, chunk ticket count, mob AI, or natural spawn rules.

Verification
- Java 17 compiler accepted the new source helper.
- ASM parsed both patched classes, verified expected patch-point counts.
- Exact registry and source identifier inspection validated old/new IDs.
- Structural bytecode checks confirm exterior guard calls use the new helper,
  Nucleus still uses the original entity spawning path, and the existing
  meteor In Control mixin configuration remains byte-identical.
- Live integrated Forge testing is NOT performed by these checks.

Testing next
1. In a world with the existing In Control day limits, land a meteor far
   outside any player's view. Approach later and verify all exterior mob types,
   including Primal Spitters, remain present and have at least 100 max HP.
2. Ensure non-Phay animals at/near the impact do not get meteor boosts.
3. Verify Nucleus stays at 500 max HP inside the meteor.
4. Inspect latest.log for '[Phayriosis Meteor] defender spawn failed...'
   if exterior defenders are still missing and capture forced-chunk logs.

Known limitations
- Forge-integrated offscreen lifecycle behavior must be validated in-game.
- Failed spawns are retried three times at two-tick intervals; permanent
  failures are logged without infinite loops or chunk forcing beyond the
  existing impact lease.
- The old 'assaulter' whitelist remains in the generated fast lookup but
  no longer causes spawns; it is inert and is not broadened to non-Phay mobs.
