Claude Code Plugins

Community-maintained marketplace

Feedback

enforcescript-patterns

@ArmaOverthrow/Overthrow.Arma4
80
0

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

Install Skill

1Download skill
2Enable skills in Claude

Open claude.ai/settings/capabilities and find the "Skills" section

3Upload to Claude

Click "Upload skill" and select the downloaded ZIP file

Note: Please verify skill by going through its instructions before using it.

SKILL.md

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.