Keyboard shortcuts

Press ← or → to navigate between chapters

Press S or / to search in the book

Press ? to show this help

Press Esc to hide this help

İçerik grupları

Bu sayfa araçlar, silahlar, NPC’ler ya da polis birimleri gibi oyun verisini kod yayımlamadan değiştirmenizi sağlayan içerik gruplarını anlatır. Verinin panelde nasıl tanımlanıp yayınlandığını ve oyunun onu nasıl okuduğunu öğrenmek istiyorsanız okuyun.

Ne işe yarar

İçerik grubu, sizin tanımladığınız tipli bir tablodur: grubun alanları (ör. hiz, hasar, renk, model) vardır ve her kayıt (ör. sedan) bu alanlar için değer taşır. Operatör değeri panelde düzenler ve yayınlar; oyun yalnızca yayınlanmış güncel hâli okur. Böylece bir değeri değiştirmek için oyunu yeniden dağıtmanız gerekmez.

İçerik grupları çekirdektir: ayrı bir modül anahtarı yoktur ve her ortamda çalışır.

Panelde nerede

Ne yapacaksınızPanel sayfası
Grup oluşturmak, alan eklemek, şablondan başlamakİçerik, Grup düzenle
Kayıt eklemek, değerleri düzenlemek, kaydı yayına almak ya da arşivlemekKayıt düzenle
Yayın geçmişini ve farkı görmek, değişiklikleri oyuna göndermekİçerik › Yayınla
Model alanına 3B model bağlamak3D modeller

Veri modeli (düz dille)

  • Grup: key (^[a-z][a-z0-9_]{1,47}$, yani 2–48 karakter), ad ve alanlar. Anahtar oluşturulduktan sonra değişmez.

  • Alan: key (aynı kural) ve bir tür. On tür vardır:

    Tür (kind)Ne tutarAyarlar
    integerTam sayı (isteğe bağlı ondalık gösterim ölçeği)min, max, scale (0–3), unit (en çok 12 karakter), default
    percentBaz puan yüzde (10000 = %100)min_bp, max_bp, default_bp
    textMetinmax_chars (en çok 512), multiline
    boolEvet/hayırdefault
    selectSeçenek(ler)options (en çok 64), multiple
    colorRenk#rrggbb
    model3B modelmodel kütüphanesi kimliği
    imageGörselvarlığın sha256 değeri
    referenceBaşka kayda bağlantıhedef: başka bir grup, yerleşik eşya ya da yerleşik karakter
    tableTekrarlanan satırlı matriscolumns (1–8), min_rows, max_rows (en çok 100)
  • Görünürlük (audience): Her alan player (oyuncuya gider) ya da server (yalnız sunucu anahtarı görür) olabilir.

  • Kayıt (entry): key (^[a-z0-9][a-z0-9_-]{0,63}$) ve alan değerleri. Durumu: Yayında, Taslak değişikliği var, Arşivli, Henüz yayınlanmadı.

  • Yayın: Panelde “Değişiklikleri oyuna gönder” ile yapılır; en çok 280 karakterlik bir not alır ve sıralı bir yayın sayacı (seq) üretir. Bir sonraki yayın öncekini değiştirmez, yenisini ekler; geçmiş ve fark panelde görünür. Siz bakarken biri yayınladıysa panel farkı yeniler ve yeniden onay ister.

  • Sayılar: Tamsayıdır; kesirli ya da üslü gösterim (40.0, 1e2) reddedilir. Ölçekli tamsayıyı oyunda formatScaled ile gösterin.

Not

Eşya ve karakter şablonları da panelde yerleşik gruplar olarak görünür; onlar “kaydedince hemen oyunda” davranır ve yayın adımı istemez. Kullanıcı tanımlı gruplar yayın ister.

Sınırlar: ortamda en çok 64 grup, grupta 48 alan ve 1000 kayıt; bir kaydın tablo verisi 128 KiB’ı, sunucu kitlesi için yayın görüntüsü 1 MiB’ı aşamaz.

Katalog: eşya ve karakter

Oyun, eşya ve karakter tanımlarını (anahtar, ad, tipli veri satırları ve 3B model adresi) katalog uçlarından okur:

Yöntem ve yolNe döner
GET /v1/catalog/items, GET /v1/catalog/items/{key}Eşya manifestleri
GET /v1/catalog/characters, GET /v1/catalog/characters/{key}Karakter manifestleri

Bunlar items ve characters modüllerine bağlıdır; modül kapalıysa 404. Liste sayfalıdır (limit 1–100, varsayılan 50; cursor). Her manifest kind, key, name, definition_version, data (tipli satırlar), model (yoksa null) ve content_sha256 taşır. Ayrıntı, ETag ile izleme ve three ile model gösterme: Oyun katalog entegrasyonu (docs/oyun-katalog-entegrasyonu.md) ve Scene, görsel ve 3B modeller.

Oyunun yaptığı çağrılar (içerik grupları)

İçerik grupları salt okunur bir yüzeyle sunulur; oyun taslağa ulaşamaz. İki kimlik türü vardır:

  • Oyuncu oturumu (çerez ya da oturum belirteci + x-crx-env: <ortam uuid>): yalnız visibility = player alanları ve değerlerini görür.
  • Sunucu anahtarı (Authorization: Bearer crx_live_<önek>_<gizli>): bütün alanları görünürlükleriyle ve seq ile görür. Geçersiz bir Bearer crx_… anahtarı geçerli bir çerezle bile 401 alır; çereze düşülmez.
Yöntem ve yolNe döner
GET /v1/catalog/groupsYayınlanmış grupların anahtarı, adı ve kitleye göre content_sha256 değeri
GET /v1/catalog/groups/{group}Grubun güncel yayını: group, fields, entries, seq
GET /v1/catalog/groups/{group}/entries/{key}Aynı şekil, yalnız o kayıt

Başlıklar:

BaşlıkAnlamı
x-crx-envOyuncu oturumunda zorunlu; sunucu anahtarında ortam anahtardan gelir
If-None-MatchElinizdeki ETag; eşleşirse 304 ve gövde yoktur

Yanıtlar kitleye özgü ETag taşır. Oyuncu ETag’i ve content_sha256 değeri süzülmüş gövdeden hesaplanır; bu yüzden yalnız-sunucu bir alanı değiştirmek oyuncu tarafında hiçbir değişiklik göstermez. Hiç yayınlanmamış ya da olmayan grup 404 döner.

Not

Yalnız-sunucu satırlar bir sır deposu değildir: panelde operatörler ve sunucu anahtarı tutanlar görür. Parola, anahtar ya da kişisel veri koymayın.

Tablo alanı

table alanı bir kayıtta tekrarlanan satırları tutar (silahın seviye → hasar tablosu, NPC ganimet listesi). Sütun türleri integer, percent, text, bool, select ve reference’tır. Değer, satır sırasını koruyan nesne dizisidir; sırayı değiştirmek yeni bir yayın özeti demektir. Yalnız-sunucu tablo oyuncu gövdesinde hiç yoktur.

Oyundan okumak

TypeScript SDK’sı iki kitle için de tipli okuyucu sağlar (player.catalog.groups, sunucuda CrxClient.catalog.groups; list, get, entry). İzleme için watchCatalogGroup ve ölçekli sayıyı göstermek için formatScaled vardır. Unity SDK’sında katalog yoktur; ham REST kullanılır.

Sürümleme ve tekrar güvenliği

  • Okuma uçlarında Idempotency-Key ya da If-Match yoktur; If-None-Match ile koşullu okuma yaparsınız.
  • Yayın sayacı (seq) her yayında artar; seq değişmediyse içerik değişmemiştir.
  • Grup, alan ve kayıt anahtarları oluşturulduktan sonra değişmez; alan türü değişimi denetlenir ve panel sorunları yayın öncesinde listeler.

Olaylar

İçerik grubu yayını outbox’a olay yazmaz (yalnız denetim kaydı düşer), dolayısıyla webhook üretmez. Değişikliği oyunda yakalamak için ETag ile yoklayın: değişim oyuncuya en geç bir yoklama aralığı sonra ulaşır; bir dakikalık aralık yeterlidir.

Sınırlar

  • 64 grup / 48 alan / 1000 kayıt; tablo en çok 8 sütun ve 100 satır; kayıt tablo verisi 128 KiB; sunucu yayın görüntüsü 1 MiB.
  • Metin alanı en çok 512 karakter; seçim alanı en çok 64 seçenek.
  • Yayın notu en çok 280 karakter.

Sık görülen hatalar

BelirtiNedenÇözüm
404 (grup)Grup hiç yayınlanmadı ya da yokPanelde grubu yayınlayın
401Kimlik yok ya da geçersiz Bearer crx_…; oyuncu oturumunda x-crx-env eksikKimliği ve başlığı düzeltin
Panelde yayın reddedildiBaşvuru (reference) hedefi yok; tablo ya da yayın boyutu aşıldıPanelin listelediği sorunları giderin
Değeri değiştirdim, oyun görmüyorTaslak yayınlanmadı ya da alan server görünürlüklüYayınlayın; görünürlüğü kontrol edin
304ETag eşleştiBeklenen davranış; elinizdeki kopya güncel

Çalışan örnek

weapons grubunun güncel yayınını ETag ile okuma:

/** İçerik grubunu (panelde yayınlanan oyun verisi) oyuncu oturumuyla okur; ETag ile değişmediyse 304 döner. */
import type { PlayerClient } from "@ferdiunal/open-play-ts";

/** `weapons` grubunun güncel yayınındaki kayıt anahtarlarını döndürür; değişmediyse boş liste. */
export async function readWeapons(player: PlayerClient, previousEtag?: string): Promise<readonly string[]> {
  const result = await player.catalog.groups.get("weapons", previousEtag === undefined ? {} : { ifNoneMatch: previousEtag });
  if (result.status === 304) return [];
  return result.value.entries.map((entry) => entry.key);
}

İlgili sayfalar