# Enforcescript Patterns

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

- Skill: `majiayu000/enforcescript-patterns` (Agent Skill, multi-file: 2 files)
- Install (CLI): `npx skillmds@latest add majiayu000/enforcescript-patterns`
- Raw SKILL.md: https://api.skillmd.com/api/skills/majiayu000/enforcescript-patterns/raw
- Safety review: pending (external: skill-scanner PASS, skillspector PASS)
- Works with: Claude Code, Claude.ai, OpenAI Codex
- Category: Web & Frontend
- Author: majiayu000 (https://skillmd.com/u/majiayu000)
- Updated: 2026-09-09
- Page: https://skillmd.com/skills/majiayu000/enforcescript-patterns

---


# 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.

