# Eigen assetformaten en creaties van spelers op PlayDrop

Definieer een eigen assetformaat met een assetspec, geef aan wat een game leest of schrijft en laat spelers creaties opslaan en publiceren met sdk.assets.custom.

Source: https://www.playdrop.ai/nl/create/learn/custom-assets

Met assetspecs kan een game een eigen soort asset definiëren, zoals een level, een personage of een kaartspel, als een contract van bestanden. Spelers kunnen dan creaties in dat formaat maken, opslaan en publiceren, en andere games die het ondersteunen kunnen ze openen.

## Een assetspec definiëren

Een assetspec wordt gedeclareerd in de lijst `assetSpecs` van catalogue.json, naast `apps`:

```json
{
  "assetSpecs": [{
    "name": "moon-level",
    "version": "1.0.0",
    "displayName": "Moon Jump level",
    "symbol": "specs/moon-level.svg",
    "contract": "specs/moon-level.contract.json"
  }]
}
```

Het contract noemt de bestanden van elke asset en hoe ze worden gecontroleerd:

```json
{
  "primaryRole": "level",
  "roles": [
    { "name": "level", "required": true, "contentTypes": ["application/json"], "mode": "TEXT",
      "jsonSchema": { "type": "object", "required": ["tiles"], "properties": { "tiles": { "type": "array" } } } },
    { "name": "thumbnail", "required": false, "contentTypes": ["image/png"], "mode": "BINARY" }
  ]
}
```

Rollen kunnen een JSON Schema bevatten, dat PlayDrop bij elke save controleert. Publiceer een nieuwe versie van de spec als het formaat verandert; oude assets behouden hun versie.

## Aangeven wat een game ondersteunt

```json
{
  "assetSpecSupport": [
    { "assetSpec": "asset-spec:your-name/moon-level", "versionRange": "^1.0.0", "capabilities": ["READ", "WRITE"] }
  ]
}
```

De mogelijkheden zijn `READ`, `WRITE`, `EDIT`, `PREVIEW` en `IMPORT`.

## Creaties van spelers opslaan en laden

```js
const levels = sdk.assets.custom.forSpec("asset-spec:your-name/moon-level");

await levels.saveDraft({ assetName: "crater-run", displayName: "Crater run",
  files: { level: new Blob([JSON.stringify(level)], { type: "application/json" }) } });
await levels.publish({ assetName: "crater-run", displayName: "Crater run", files: { level: levelBlob, thumbnail: pngBlob } });

const mine = await levels.listMine();
const latest = mine[0]?.latestPublicVersion;
if (latest) startLevel(await levels.loadJson({ assetRef: latest.assetRef, role: "level" }));

const community = await levels.listPublic({ limit: 20 }); // { assets, pagination }
```

- `saveDraft` bewaart een privéconcept; `publish` maakt het openbaar. Beide hebben de volledige set bestanden nodig.
- Assetverwijzingen zien eruit als `asset:creator/name@r2`. `loadJson`, `loadText` en `downloadFile` lezen gepubliceerde assets; `loadOwned`, `loadOwnedJson` en `loadOwnedFile` lezen die van de speler zelf, concepten inbegrepen.
- `supports(versionRef, capability)` controleert dit voordat je een asset uit een andere versie opent.
- Fouten gebruiken codes zoals `custom_asset_capability_unsupported` en `custom_asset_role_type_mismatch`.

Spelers moeten ingelogd zijn om op te slaan. Controleer wat spelers publiceren zoals je elke gebruikersinhoud zou controleren: het inhoudsbeleid van PlayDrop is erop van toepassing.

## Wat de connector accepteert

Eigen assets en specs die alleen uit gegevens bestaan, upload je zoals andere bestanden. Uitvoerbare modellen, dus `MODEL_3D`-assets met de subcategorie `procedural` of het formaat `CUSTOM`, worden door de connector geweigerd omdat de API geen code van makers uitvoert; bak ze of verwijs naar een gepubliceerde versie. Zie [game-assets](https://www.playdrop.ai/nl/create/learn/game-assets).

## Gerelateerde gidsen

- [Game-assets](https://www.playdrop.ai/nl/create/learn/game-assets): Lever afbeeldingen, geluid, video en 3D mee: meegeleverde bestanden, eigen assets in catalogue.json, openbare assets en pakketten, en opzoeken met sdk.assets.
- [catalogue.json](https://www.playdrop.ai/nl/create/learn/catalogue-json): De catalogue.json-velden die games gebruiken: identiteit, gamepagina, speelwijzen, weergaven, inloggen, Instant, vooraf laden, media, vertalingen, scores en servers.
- [Client-SDK](https://www.playdrop.ai/nl/create/learn/sdk): De PlayDrop-browser-SDK: init, host, speler en saves, controllers, sociaal, multiplayer, winkel, advertenties, ranglijsten, prestaties, assets en AI.
