Entries, phases, and AI spots
A community entry answers three different questions:
Who can spawn? characterRecordId
In which authored mode? phaseName + appearance + time period
Where can they act? spotNodeRefs -> worldAISpotNode -> workspot resource
Keeping those questions separate makes failures diagnosable. Changing the character record does not move the spot. Moving the spot does not change the appearance. Activating an entry with the wrong phase name does not fall back to a similarly named workspot.
Vanilla references
These focused base-game resources are useful comparisons. Extract them from your own installation; they are references, not files to copy into the project.
base\open_world\minor_activities\westbrook\japantown\
ma_wbr_jpn_13\community\ma_wbr_jpn_013_claws_com.community
Registry-side entry shape
In the retained registry item, template data has this focused shape:
communityCommunityTemplateData
entries[]
communitySpawnEntry
characterRecordId: TweakDBID
entryName: CName
phases[]
communitySpawnPhase
phaseName: CName
appearances[]: CName
timePeriods[]
communityPhaseTimePeriod
hour: CName-like period selector
isSequence: Bool
quantity: Int32
spotNodeRefs[]: NodeRef
The important properties are:
| Property | Meaning in the inspected shape |
|---|---|
characterRecordId | TweakDB record used to create the actor. It can lead to an entity template, appearances, gameplay packages, faction data, and other dependencies; it is not a world identity. |
entryName | Community-local name used by activation and scene acquisition. It is a CName, not the actor’s display name. |
phaseName | Community-local mode selected by initial state or a Spawn Manager action. |
appearances | Names the spawn phase can request from the selected character/template chain. |
hour | Selects the authored time-period row. Day in one fixture is not a rule that communities only work during daytime. |
isSequence | Tells this period whether its spot list represents sequenced use in the inspected model. |
quantity | Requested quantity for that period; it is not a readiness timeout or scene performer count. |
spotNodeRefs | Full or context-valid world references to AI spots. |
entryActiveOnStart, stored under the registry item’s initial state rather
than the spawn entry itself, decides whether quest logic begins with that entry
active. For a controlled quest contact, false plus an explicit activation
edge gives the graph a reviewable owner.
Area-side mirror
The compiled area does not repeat the character record. It repeats the topology needed to bind the entry/phase/time period to placed spot identities:
| Registry template | Compiled area |
|---|---|
communitySpawnEntry.entryName | communityCommunityEntrySpotsData.entryName |
communitySpawnPhase.phaseName | communityCommunityEntryPhaseSpotsData.entryPhaseName |
communityPhaseTimePeriod.hour | communityCommunityEntryPhaseTimePeriodData.periodName |
communityPhaseTimePeriod.isSequence | communityCommunityEntryPhaseTimePeriodData.isSequence |
communityPhaseTimePeriod.spotNodeRefs | communityCommunityEntryPhaseTimePeriodData.spotNodeIds |
The values describe the same intended route through different serialized types. A valid character entry with a stale area mirror can activate but never obtain its intended spot.
When reviewing serialized sectors, do not pair rows merely because they are
adjacent. Follow the entry name, phase name, full spot NodeRef, world-global
spot ID, and sector NodeIndex. Later source snapshots can reorder nodes or
change a workspot without changing a nearby debug string.
worldAISpotNode owns the placed activity
The AI spot is a concrete world node. Its decisive focused structure is:
worldAISpotNode
isWorkspotInfinite
isWorkspotStatic
lookAtTarget
spot -> AIActionSpot
resource -> ResourcePath to .workspot
snapToGround
useClippingSpace
The sector’s nodeData owns its transform and binds the concrete node to the
registered NodeRef. The worldAISpotNode owns the activity configuration. A
workspot resource supplies animation/behavior data; it does not supply the
world position.
| Concern | Owner |
|---|---|
| World position and orientation | The spot node’s matching nodeData placement |
| Quest-prefab child identity | Full/local NodeRef chain and QuestPrefabRefHash |
| Workspot behavior | AIActionSpot.resource depot path |
| Finite versus continuing use | isWorkspotInfinite together with the community period design |
| Ordered movement between spots | A validated sequence using isSequence, multiple spot identities, and compatible AI behavior |
| Actor selection | communitySpawnEntry.characterRecordId |
Do not introduce a patrol merely by adding two points. Sequenced workspots, AI roles, navigation, interruption, combat, and cleanup are separate runtime surfaces. A single stationary contact spot is the smaller Lab 5 search surface.
Character record, entity, and appearance are separate
The community stores a TweakDBID, for example:
Character.jpn_tyger_claws_biker2_ranged2_copperhead_wa
That record is not an .ent depot path. It can refer onward to a character
entity template and other gameplay records. The spawn phase’s appearance
CName must be valid for the selected template chain. An appearance name that
worked for a different record is not inherited because both entries say
default.
For a first contact fixture, prefer a generic population/combat record whose bounded spawn behavior is retained over a story-unique character record. This reduces conflict with vanilla quest ownership, but it does not make every appearance, faction, voice, or AI behavior appropriate. Inspect the selected record and verify the actor in game.
Choosing a workspot
Choose a workspot from evidence tied to the exact record and candidate, then validate it at the new placement. Check:
- the resource exists at the exact depot path;
- the spot transform leaves enough clearance for the actor;
- the surface is reachable and supports the intended ground contact;
- the actor does not clip into walls, props, or the player approach lane;
- the broad setup route streams the area before the scene needs the actor;
- each named pre-scene seed load in Cases 3, 4, and 7 reacquires the same passive contact without duplication;
- normal exit, post-
contact_donereload, completed reload, and delayed deactivation do not leave the actor stuck in the workspot.
Check the workspot at its actual transform. A pose that works at one location can intersect geometry or lack a usable approach at another.
Common failures
| Symptom | Inspect first |
|---|---|
| Entry activates but uses the wrong actor | characterRecordId, entry name, registry item, and saved activation history |
| Actor is invisible or malformed | Requested appearance, record-to-entity path, dependencies, and expansion requirements |
| Actor appears at an unexpected sibling spot | Registry spotNodeRefs, area spotNodeIds, and world-global ID uniqueness |
| Actor clips or faces away | Spot nodeData position/orientation, workspot semantics, clearance, and navmesh |
| Sequence never advances | isSequence, finite/infinite settings, spot ordering, AI behavior, and navigation evidence |
| Scene asks for an entry that exists only in another community | Scene community reference and entry CName; entry names are community-local |