# Własne formaty zasobów i twórczość graczy w PlayDrop

Zdefiniuj format zasobu, zadeklaruj formaty czytane lub zapisywane przez grę i pozwól graczom zapisywać i publikować dzieła przez sdk.assets.custom.

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

Specyfikacje zasobów pozwalają grze zdefiniować własny rodzaj zasobu, taki jak poziom, postać czy talia, jako kontrakt plików. Gracze mogą wtedy tworzyć, zapisywać i publikować dzieła w tym formacie, a inne gry, które go obsługują, mogą je otwierać.

## Zdefiniuj specyfikację zasobu

Specyfikację zasobu deklaruje się na liście `assetSpecs` w catalogue.json, obok `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"
  }]
}
```

Kontrakt wskazuje pliki każdego zasobu i sposób ich sprawdzania:

```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" }
  ]
}
```

Role mogą zawierać schemat JSON, który PlayDrop sprawdza przy każdym zapisie. Gdy format się zmienia, opublikuj nową wersję specyfikacji; stare zasoby zachowują swoją wersję.

## Zadeklaruj, co gra obsługuje

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

Możliwości to `READ`, `WRITE`, `EDIT`, `PREVIEW` i `IMPORT`.

## Zapisuj i wczytuj twórczość graczy

```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` zachowuje prywatny szkic; `publish` czyni go publicznym. Oba wymagają kompletnego zestawu plików.
- Odwołania do zasobów wyglądają jak `asset:creator/name@r2`. `loadJson`, `loadText` i `downloadFile` odczytują opublikowane zasoby; `loadOwned`, `loadOwnedJson` i `loadOwnedFile` odczytują własne zasoby gracza, łącznie ze szkicami.
- `supports(versionRef, capability)` sprawdza obsługę przed otwarciem zasobu z innej wersji.
- Błędy używają kodów takich jak `custom_asset_capability_unsupported` i `custom_asset_role_type_mismatch`.

Gracze muszą być zalogowani, aby zapisywać. Sprawdzaj to, co publikują gracze, tak jak wszelkie treści użytkowników: obowiązuje je polityka treści PlayDrop.

## Co przyjmuje konektor

Własne zasoby i specyfikacje zawierające tylko dane przesyła się jak inne pliki. Modele wykonywalne, czyli zasoby `MODEL_3D` z podkategorią `procedural` lub w formacie `CUSTOM`, konektor odrzuca, ponieważ API nie uruchamia kodu twórców; wypal je albo odwołaj się do opublikowanej wersji. Zobacz [zasoby gry](https://www.playdrop.ai/pl/create/learn/game-assets).

## Powiązane poradniki

- [Zasoby gry](https://www.playdrop.ai/pl/create/learn/game-assets): Dodaj do gry obrazy, dźwięk, wideo i 3D: pliki w pakiecie, zasoby należące do gry, publiczne zasoby i pakiety oraz wyszukiwanie przez sdk.assets.
- [catalogue.json](https://www.playdrop.ai/pl/create/learn/catalogue-json): Pola catalogue.json gier PlayDrop: tożsamość, strona gry, tryby gry, powierzchnie, logowanie, Instant, wstępne ładowanie, media, tłumaczenia, wyniki i serwery.
- [SDK klienta](https://www.playdrop.ai/pl/create/learn/sdk): SDK PlayDrop w przeglądarce: cykl życia hosta, gracz i zapisy, kontrolery, funkcje społecznościowe, gra wieloosobowa, sklep, reklamy, rankingi, zasoby i AI.
