# เซิร์ฟเวอร์เกม PlayDrop: Colyseus, MongoDB และ SDK

ผู้เล่นหลายคนที่โฮสต์ให้แบบไม่บังคับ: อัปโหลด server.js ของ Colyseus พร้อม MongoDB ทดสอบด้วยผู้เล่นทดสอบ และใช้ SDK ฝั่งเซิร์ฟเวอร์สำหรับเพื่อนและ AI

Source: https://www.playdrop.ai/th/create/learn/server-sdk

เซิร์ฟเวอร์เกมไม่บังคับ เกมของคุณเรียกเซิร์ฟเวอร์ใดๆ ที่คุณรันเองได้ หากต้องการ PlayDrop โฮสต์เซิร์ฟเวอร์ Colyseus มาตรฐานพร้อมฐานข้อมูล MongoDB ให้เกมของคุณ: อัปโหลดเป็น `server.js` ข้าง `index.html` ผ่าน [PlayDrop Connector](https://www.playdrop.ai/th/create/connectors) หรือให้ [PlayDrop Cloud](https://www.playdrop.ai/th/create) สร้างให้ แพ็กเกจ `@playdrop/server` ก็ไม่บังคับเช่นกัน

## เขียนเซิร์ฟเวอร์ Colyseus มาตรฐาน

ส่งออกแมป `rooms` จาก `server.js` และระบุชื่อห้องใน [catalogue.json](https://www.playdrop.ai/th/create/learn/catalogue-json) เป็น `"server": { "rooms": ["game"] }` PlayDrop รันเซิร์ฟเวอร์ให้ ดังนั้นอย่าเริ่มเซิร์ฟเวอร์เอง เก็บข้อมูลด้วยไดรเวอร์ MongoDB มาตรฐานผ่าน `PLAYDROP_MONGO_URL` ภายในวงจรชีวิตของห้อง

```js
import { Room, defineRoom } from "colyseus";
import { MongoClient } from "mongodb";

class GameRoom extends Room {
  async onCreate() {
    this.mongo = new MongoClient(process.env.PLAYDROP_MONGO_URL);
    await this.mongo.connect();
  }
  onJoin(client) {
    // client.auth is the verified PlayDrop player, for example client.auth.userId.
  }
  async onDispose() { await this.mongo?.close(); }
}

export const rooms = { game: defineRoom(GameRoom) };
```

## กฎของเซิร์ฟเวอร์ที่โฮสต์ให้

- Colyseus 0.17 (`colyseus` 0.17.10, `@colyseus/schema` 4.0.30), ไดรเวอร์ MongoDB 7.5 และ Node 22
- โมดูล ES ที่ครบในตัวหนึ่งไฟล์ ขนาดไม่เกิน 2 MiB อาจนำเข้าได้เฉพาะ `colyseus`, `@colyseus/core`, `@colyseus/schema`, `mongodb` และ `@playdrop/server` รวมโค้ดอื่นทั้งหมดไว้ในไฟล์
- ไม่เกิน 2 ประเภทห้อง, 8 ผู้เล่นต่อห้อง, 4 ชั่วโมงต่อห้อง, 30 ข้อความต่อวินาทีต่อผู้เล่น และ 512 KiB ต่อข้อความ
- เซิร์ฟเวอร์เข้าถึงอินเทอร์เน็ตไม่ได้: เข้าถึงได้เฉพาะ MongoDB และบริการของ PlayDrop
- ผู้เล่นต้องเข้าสู่ระบบ PlayDrop ตรวจสอบผู้เล่นแต่ละคนเมื่อเข้าร่วม อย่าเขียน `onAuth`
- ฐานข้อมูล MongoDB หนึ่งชุดต่อเกม เก็บข้ามเวอร์ชันและนับรวมในโควตาพื้นที่จัดเก็บของคุณ อย่าส่งข้อมูลรับรองไปยังเบราว์เซอร์เด็ดขาด

## เชื่อมต่อเบราว์เซอร์และทดสอบ

ในเบราว์เซอร์ `sdk.multiplayer.getConnection()` จาก [SDK ฝั่งไคลเอนต์](https://www.playdrop.ai/th/create/learn/sdk) ส่งคืนที่อยู่เซิร์ฟเวอร์และโทเค็นของผู้เล่น เข้าร่วมด้วยไคลเอนต์ Colyseus (`@colyseus/sdk` 0.17) ระหว่างพัฒนา ให้รัน Colyseus 0.17 และ MongoDB 8 ในเครื่องและเชื่อมต่อกับเซิร์ฟเวอร์ในเครื่องโดยตรง หากต้องการทดสอบเซิร์ฟเวอร์ที่โฮสต์ ให้อัปโหลดเวอร์ชันส่วนตัว แล้วเปิด `https://www.playdrop.ai/create/games/<slug>/test?v=<version>&player=1` และลิงก์เดียวกันที่ `player=2` ในหน้าต่างที่สอง: แต่ละหน้าต่างเล่นเป็นบัญชีทดสอบแยกกัน ตั้งเวอร์ชันเป็นสาธารณะจากหน้าเกมเมื่อใช้งานได้

## SDK ฝั่งเซิร์ฟเวอร์แบบไม่บังคับ: เพื่อนและ AI

`@playdrop/server` เพิ่ม `playdrop.social` (เพื่อนที่เล่นเกมนี้และการ์ดเกมใน PlayDrop Chat) และ `playdrop.ai` (การสร้างข้อความ ภาพ 3D วิดีโอ เสียง เสียงพูด และเพลง โดยครีเอเตอร์เป็นผู้จ่าย) การเรียกเหล่านี้ใช้ได้เฉพาะกับเกมที่อัปโหลดแล้ว ไม่ใช่ในการพัฒนาในเครื่อง ดาวน์โหลดสื่อส่วนตัวที่สร้างขึ้นบนเซิร์ฟเวอร์ด้วย `playdrop.ai.tasks.downloadFile` และส่งไบต์ให้เฉพาะผู้เล่นที่ตั้งใจ คำขอเสียงพูดรับได้ไม่เกิน 40 คำ

## แชทเสียงของปาร์ตี้และห้อง

`await playdrop.social.getParty(client.auth)` อ่านสมาชิกปาร์ตี้ที่ได้รับอนุญาตในปัจจุบัน ไม่เปิดเผยแชทปาร์ตี้หรือกิจกรรมในเกมอื่น และไม่ให้สิทธิ์จัดการปาร์ตี้ API โซเชียลที่มีอยู่ยังทำงานเหมือนเดิม

แคตตาล็อกที่ประกาศ `roomVoice: true` เริ่มต้นด้วยนโยบายทั้งห้อง ไม่ต้องเรียกเซิร์ฟเวอร์สำหรับค่าเริ่มต้นนี้ หากต้องการปรับแต่ง ให้ผูก `const platform = playdrop.multiplayer.forRoom(this)` กับห้อง Colyseus จริง ใช้ `platform.voice.setPolicy("all" | "team" | "proximity" | "off", { range: 20 })`, `setTeam(client.auth, teamId)`, `setAudience(client.auth, audience)` และ `updatePositions([{ player: client.auth, position: { x, y, z } }])` ส่ง null เพื่อล้างการแทนที่ของทีมหรือผู้เล่น โหมดความใกล้เคียงต้องการตำแหน่งที่เชื่อถือได้และเป็นปัจจุบัน

รันไทม์ที่เชื่อถือได้รวมการเปลี่ยนแปลงสิทธิ์ สำรองที่ให้ผู้ติดตามปาร์ตี้ที่ได้รับการยอมรับหลังจากหัวหน้าเข้าร่วมตามปกติ และล้างสิทธิ์ เกมไม่ส่งเสียง ข้อมูลรับรองผู้ให้บริการ หรือคำขอไมโครโฟนเด็ดขาด ใช้ห้องเดิมตลอดทุกรอบ ใช้ผู้เล่นทดสอบส่วนตัวที่มีอยู่กับครีเอเตอร์ที่มีสิทธิ์เพื่อทดสอบการผสานรวมก่อนเผยแพร่ การเผยแพร่เพียงอย่างเดียวไม่เปิดใช้งานการเปิดตัวแบบทยอย

