Claude-skill-registry enforcescript-patterns

EnforceScript component patterns, networking, persistence, and memory management for Enfusion engine

install
source · Clone the upstream repo
git clone https://github.com/majiayu000/claude-skill-registry
Claude Code · Install into ~/.claude/skills/
T=$(mktemp -d) && git clone --depth=1 https://github.com/majiayu000/claude-skill-registry "$T" && mkdir -p ~/.claude/skills && cp -r "$T/skills/data/enforcescript-patterns" ~/.claude/skills/majiayu000-claude-skill-registry-enforcescript-patterns && rm -rf "$T"
manifest: skills/data/enforcescript-patterns/SKILL.md
source content

EnforceScript Patterns

Quick reference for EnforceScript development in Arma Reforger. For detailed patterns, see resource files below.


When to Use This Skill

Use this skill when:

  • Creating entity components (Managers, Controllers, Components)
  • Implementing network replication (RplProp, RPC, JIP)
  • Setting up persistence with EPF (save/load patterns)
  • Managing memory (strong refs, garbage collection)
  • Building UI contexts and layouts
  • Troubleshooting common EnforceScript pitfalls

Quick Reference

Component Patterns

Three main component types in Overthrow: Managers (singletons on game mode), Controllers (instance managers), and Components (sub-systems). Each has specific lifecycle and registration patterns.

See:

component-patterns.md
for detailed patterns and examples

Network Replication

Use RplProp for simple value synchronization, RPC for server/client communication, and JIP for late-join state sync. Never replicate EntityID - use RplId instead.

See:

networking.md
for comprehensive replication patterns

Persistence

EPF requires SaveData classes that extend EPF_ComponentSaveDataClass. ReadFrom extracts data, ApplyTo restores it. Console platforms require PLATFORM_CONSOLE guards.

See:

persistence.md
for EPF save/load patterns

Memory Management

All Managed class references must use

ref
keyword to prevent garbage collection. Store EntityID instead of IEntity for long-term references. Check entity existence before use.

See:

memory-management.md
for garbage collection patterns

UI Patterns

UI contexts extend OVT_UIContext with m_Layout property. Activate contexts via OVT_Global.GetUI().ShowContext(). Each context manages its own .layout file lifecycle.

See:

ui-patterns.md
for UI context patterns

Common Pitfalls

EnforceScript has unique constraints: no ternary operators, specific replication patterns, strict typing. Knowing these pitfalls saves debugging time.

See:

common-pitfalls.md
for anti-patterns and solutions


Critical Constraints

  • No ternary operators - Use full if/else statements always
  • Strong refs for Managed - Always use
    ref
    keyword for arrays/maps of Managed classes
  • ⚠️ EntityID vs RplId - Use RplId for network entity references, EntityID locally only
  • Check entity existence - Always verify entity still exists before using it
  • Don't replicate entities - Never use RplProp on IEntity or EntityID
  • Server authority - Server drives game state, clients receive updates
  • ⚠️ RPC direction - RpcAsk = client→server, RpcDo = server→client(s)

Resource Files

Detailed documentation organized by concern:

  1. component-patterns.md - Manager, Controller, and Component class patterns
  2. networking.md - RplProp, RPC, JIP replication, and optimization
  3. persistence.md - EPF save/load patterns and console platform handling
  4. memory-management.md - Strong refs, garbage collection, entity lifecycle
  5. ui-patterns.md - OVT_UIContext, layout activation, UI manager integration
  6. common-pitfalls.md - Ternary operators, weak refs, replication gotchas

Language-Specific Notes

EnforceScript is a C++ variant with unique characteristics:

  • Strongly typed with type inference limited
  • No ternary operator support (use if/else)
  • Garbage collection for Managed classes
  • Native entity-component architecture
  • Built-in replication system via Rpl attributes
  • No null coalescing operator

Pattern: Start here for quick reference, dive into resource files for implementation details.