# Nhóm chơi trực tuyến và trò chuyện thoại trong game PlayDrop

Cho bạn bè chơi cùng nhau trực tuyến: khai báo quy mô nhóm chơi, mở cửa sổ nhóm chơi của PlayDrop, vào phòng đã giữ chỗ bằng sdk.multiplayer.join, điều khiển thoại phòng.

Source: https://www.playdrop.ai/vi/create/learn/online-party

Nhóm chơi PlayDrop là một nhóm bạn cùng nhau chuyển qua lại giữa các game. Khi một nhóm chơi khởi động game của bạn, PlayDrop giữ chỗ cho các thành viên trong một phòng trên máy chủ của bạn, để bạn bè vào cùng một trận thay vì bị tách ra. Trò chuyện thoại chạy trong PlayDrop, không chạy trong game của bạn.

## Những gì bạn cần

- Một [máy chủ game thời gian thực](https://www.playdrop.ai/vi/create/learn/game-servers): nhóm chơi chơi trong các phòng Colyseus của bạn.
- Người chơi đã đăng nhập: phòng từ chối khách.
- Các khai báo này trong [catalogue.json](https://www.playdrop.ai/vi/create/learn/catalogue-json):

```json
{
  "types": ["solo", "online", "party"],
  "party": { "online": [2, 3, 4] },
  "roomVoice": true,
  "server": { "entry": "server/index.mjs", "rooms": ["game"] }
}
```

`party.online` liệt kê chính xác các quy mô nhóm, tối đa 4, có thể cùng vào; `[2, 4]` loại trừ 3. Đây là quy mô của nhóm cùng vào, không phải sức chứa của phòng: hai nhóm chơi bốn người có thể dùng chung một phòng tám chỗ. `party` yêu cầu loại `party` và `party.online` yêu cầu `online`. `roomVoice: true` bật thoại phòng và yêu cầu `online`.

## Vào đúng phòng

```js
if (!sdk.me.isLoggedIn) {
  await sdk.me.promptLogin();
}
const room = await sdk.multiplayer.join("game", { mode: "versus" });
```

`join` dùng chỗ đã giữ cho người chơi trong nhóm chơi khi PlayDrop khởi chạy một nhóm chơi, nếu không thì vào phòng độc lập. Nếu việc vào phòng theo nhóm chơi thất bại, lệnh gọi bị từ chối; nó không bao giờ lặng lẽ đưa người chơi vào một phòng khác. Khách sẽ nhận `authentication_required` và PlayDrop hiển thị bước đăng nhập; hãy vào phòng lại từ `sdk.me.onAuthChange`. Giữ cùng một phòng qua các vòng chơi.

Sau khi tải lại trang, `sdk.multiplayer.reconnect(roomName, token)` khôi phục chỗ đã giữ bằng một token kết nối lại mà bạn đã lưu riêng tư cho game, phiên bản và người dùng này. Hãy bỏ token và gọi `join` khi gặp `multiplayer_reconnect_expired`, `multiplayer_reconnect_unavailable` hoặc `party_reconnect_mismatch`.

## Cửa sổ nhóm chơi

Từ một nút bấm, `sdk.social.openParty({ mode: "online" })` mở cửa sổ nhóm chơi của PlayDrop, nơi người chơi mời bạn bè và bật hoặc tắt thoại. Nhóm chơi hiện có sẽ được dùng lại. `openParty()` mở menu nhóm chơi và `openParty({ section: "voice" })` mở cài đặt thoại; đừng kết hợp `mode` và `section`. Promise hoàn tất khi cửa sổ đóng lại, kể cả khi người chơi hủy.

Đọc thông tin nhóm chơi bằng `sdk.social.getParty()` hoặc `sdk.social.onPartyChange(callback)`, hàm này gửi trạng thái hiện tại trước tiên: `{ partyId, leaderUserId, revision, members, launch }`. `launch.status` là `joining` hoặc `ready` khi nhóm chơi đang chơi game này. Chỉ là thành viên thì chưa có nghĩa là người chơi đang ở chung phòng; hãy dùng `join`.

Thành viên nhóm chơi do PlayDrop quản lý: game không thể thêm hay xóa thành viên nhóm chơi hoặc điều khiển micro, và người chơi mời bạn bè vào nhóm chơi từ cửa sổ này. Game vẫn có thể gửi thẻ mời hoặc thẻ thách đấu riêng cho một người bạn bằng `sdk.social.sendMessage`; xem [chia sẻ, bạn bè và lời mời](https://www.playdrop.ai/vi/create/learn/social).

## Thoại phòng

Với `roomVoice: true`, mọi người trong phòng đều nói chuyện được, không cần mã máy chủ. Để thay đổi ai nghe được ai, hãy gắn phòng trên máy chủ của bạn và đặt một chính sách:

```js
import { playdrop } from "@playdrop/server";

const platform = playdrop.multiplayer.forRoom(this);
platform.voice.setPolicy("team");
platform.voice.setTeam(client.auth, "red");
```

Các chính sách gồm `all`, `team`, `proximity` (kèm `{ range }`) và `off`. `setAudience(player, audience)` ghi đè cho một người chơi và `updatePositions([{ player, position: { x, y, z } }])` cung cấp vị trí cho chế độ khoảng cách; truyền `null` để xóa một đội hoặc một ghi đè. PlayDrop thực thi việc ai được nghe ai. Trong trình duyệt, `sdk.multiplayer.voice.updateSpatialState({ listener: { position, forward, up }, speakers: [{ userId, position }] })` chỉ điều chỉnh âm lượng và panning.

Thoại tuân theo sự đồng ý của người chơi, tắt tiếng và chặn, và phụ thuộc vào bản dựng của host và tiến độ triển khai.

## Tạm dừng

Thanh nhóm chơi không làm tạm dừng lối chơi. Việc tạm dừng của PlayDrop dừng client của bạn, nhưng phòng vẫn giữ kết nối và máy chủ của bạn vẫn tiếp tục chạy. Việc một người chơi tạm dừng không được làm dừng trận đấu của những người khác; hãy triển khai mọi cơ chế tạm dừng trận trên máy chủ.

## Thử nghiệm

Tải lên một phiên bản riêng tư, rồi mở liên kết thử nghiệm trong hai cửa sổ với `player=1` và `player=2`, như mô tả trong [máy chủ game thời gian thực](https://www.playdrop.ai/vi/create/learn/game-servers). Nhóm chơi cục bộ với tay cầm là một chế độ riêng: xem [nhóm chơi cục bộ và tay cầm](https://www.playdrop.ai/vi/create/learn/local-party).

## Hướng dẫn liên quan

- [Máy chủ game thời gian thực](https://www.playdrop.ai/vi/create/learn/game-servers): Chạy máy chủ Colyseus 0.17 được lưu trữ kèm cơ sở dữ liệu MongoDB cho game, kết nối từ trình duyệt bằng SDK, thử với hai người chơi và nắm rõ giới hạn.
- [Nhóm chơi cục bộ và tay cầm](https://www.playdrop.ai/vi/create/learn/local-party): Đọc tay cầm vật lý và tay cầm điện thoại PlayDrop qua sdk.device, theo dõi ô người chơi cục bộ, khai báo hỗ trợ tay cầm và quy mô nhóm chơi cục bộ.
- [Chia sẻ, bạn bè và lời mời](https://www.playdrop.ai/vi/create/learn/social): Chia sẻ game kèm ảnh hoặc đoạn video, đọc dữ liệu khởi chạy, chọn bạn bè, gửi thẻ mời và thẻ thách đấu trong PlayDrop Chat, và đề xuất game khác.
