| name | enforcescript-patterns |
| description | EnforceScript component patterns, networking, persistence, and memory management for Enfusion engine |
| version | 1.0.0 |
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
refkeyword 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:
- component-patterns.md - Manager, Controller, and Component class patterns
- networking.md - RplProp, RPC, JIP replication, and optimization
- persistence.md - EPF save/load patterns and console platform handling
- memory-management.md - Strong refs, garbage collection, entity lifecycle
- ui-patterns.md - OVT_UIContext, layout activation, UI manager integration
- 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.