ArmaOverthrow

enforcescript-patterns

@ArmaOverthrow/enforcescript-patterns
ArmaOverthrow
84
36 forks
Updated 1/6/2026
View on GitHub

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

Installation

$skills install @ArmaOverthrow/enforcescript-patterns
Claude Code
Cursor
Copilot
Codex
Antigravity

Details

Path.claude/skills/enforcescript-patterns/SKILL.md
Branchmain
Scoped Name@ArmaOverthrow/enforcescript-patterns

Usage

After installing, this skill will be available to your AI coding assistant.

Verify installation:

skills list

Skill Instructions


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