İçeriğe atla

Oda barındırma

Kayıtlar ve tekrarlar

Maçları sunucunuzda kaydedin, kayıtları diske yazın ve geri okuyun.

Bir kayıt, bir maçı tam olarak tekrar oynatmak için gereken her şeyi içeren kompakt bir ikili dosyadır (.ball2drep): stadyum, her girdi ve komut ile oynatmayı doğrulayan kontrol noktaları.

Bir maçı kaydedin

JavaScript
import { writeFile } from 'node:fs/promises';

room.onGameStart = () => room.startRecording();

room.onGameStop = async () => {
  const blob = room.stopRecording();
  if (!blob) return;
  const bytes = Buffer.from(await blob.arrayBuffer());
  await writeFile(`recordings/${Date.now()}.ball2drep`, bytes);
};

startRecording() ve stopRecording() eşzamanlıdır. stopRecording() dosyayı doğrudan döndürür.

Odanın sonlandırdığı kayıtlar

Bazı olaylar sizin yerinize bir kaydı sonlandırır. Oda daha sonra kaydı onRecordingComplete'a iletir ve lastRecording içinde tutar:

NedenNe zaman
Recording limit reachedBir saatlik oyun, 30 MB veya komut sınırı
Stadium changedYeni bir stadyum yüklenmeden önce
Room closedOda kapandığında, close() dahil

Kayıt yaptığınız her durumda onRecordingComplete'i işleyin, böylece oda kapandığında sürmekte olan maçı kaybetmezsiniz:

JavaScript
room.onRecordingComplete = async (blob, reason) => {
  await writeFile(
    `recordings/${Date.now()}-auto.ball2drep`,
    Buffer.from(await blob.arrayBuffer()),
  );
};

Bir kaydı okuyun

readReplay(), bir dosyayı oda olmadan çözer ve doğrular:

JavaScript
import { readFile } from 'node:fs/promises';
import { readReplay } from 'ball2d/node';

const replay = await readReplay(
  new Blob([await readFile('final.ball2drep')]),
);
const seconds = (replay.end - replay.initial.tick) / 60;
console.log(
  `${seconds.toFixed(0)} s, ${replay.commands.length} commands`,
);

Çözülen Replay, stadyum kaynağını, başlangıç durumunu, komutları ve kadro değişikliklerini tutar.

Bir kayıt yalnızca onu oluşturan motor derlemesi tarafından okunabilir. Eski dosyaları daha sonra okumanız gerekiyorsa kayıt yaptığınız SDK sürümünü saklayın.