> For the complete documentation index, see [llms.txt](https://assetstore.essentialkit.voxelbusters.com/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://assetstore.essentialkit.voxelbusters.com/features/cloud-services/playmaker.md).

# PlayMaker

Store and sync key-value data across devices using platform cloud storage.

## Actions (14)

* Write/read: `CloudServicesSetValue`, `CloudServicesGetValue` (supports Bool/Int/Float/String)
* Snapshot helper: `CloudServicesGetSnapshot` (reads full snapshot as JSON)
* Existence: `CloudServicesHasKey` (checks current snapshot)
* Sync: `CloudServicesSynchronize` (fires `successEvent` / `failureEvent`)
* Change listener: `CloudServicesOnSavedDataChange` (persistent; fires `dataChangedEvent`)
* Change helper: `CloudServicesGetChangedKeys` (reads all cached changed keys as string array)
* Conflict helper: `CloudServicesGetCloudAndLocalCacheValues` (reads both cloud + local cache value for a key)
* User listener: `CloudServicesOnUserChange` (persistent; fires account status events)
* User helper: `CloudServicesGetUserInfo` (reads cached user id/status)
* Delete: `CloudServicesRemoveKey`, `CloudServicesRemoveAllKeys`
* Easy Save 3 sync (requires `ENABLE_VOXELBUSTERS_ESSENTIAL_KIT_EASY_SAVE_SUPPORT`):
  * `ES3EssentialKitCloudServicesSyncRawBytes`
  * `ES3EssentialKitCloudServicesSyncKeyValues`

## Key patterns

* **SetValue/GetValue are synchronous**. Use `CloudServicesSynchronize` when you want to push/pull changes and get a completion event.
* **Listener actions should stay active**:
  * `CloudServicesOnSavedDataChange` receives remote changes and provides `changedKeys` + `changeReason`.
  * `CloudServicesOnUserChange` reports account availability (signed in/out/restricted).

## Common flows

* Save: `SetValue` (one or more keys) → `Synchronize`
* Load with defaults: `HasKey` → `GetValue` (else keep local default)
* Multi-device: keep `OnSavedDataChange` active → on `dataChangedEvent`, loop keys and `GetValue`
* Reset: `RemoveKey`/`RemoveAllKeys` → `Synchronize`

## Use cases

Start here: `use-cases/README.md`
