파티 시스템
파티는 친구들과 함께 게임에 참가하기 위한 그룹입니다. 파티원들은 함께 매치메이킹에 참가하고 같은 룸에 배정됩니다.
파티 생성
typescript
const game = new GameRoom({
appId: 'YOUR_APP_ID',
clientId: 'player_123',
publicKey: 'cb_pk_...'
})
await game.connect()
// 파티 룸 생성
const partyState = await game.createRoom({
roomId: `party_${Date.now()}`,
maxPlayers: 5, // 파티 최대 인원
metadata: {
type: 'party',
leaderId: 'player_123',
status: 'idle' // idle | searching | in_game
}
})
// 초대 코드 생성
const inviteCode = partyState.roomId.substring(6)
console.log('초대 코드:', inviteCode)파티 참가
typescript
// 초대 코드로 파티 참가
async function joinParty(inviteCode: string) {
const partyRoomId = `party_${inviteCode}`
await game.joinRoom(partyRoomId, {
nickname: 'Player2'
})
}파티 상태 관리
typescript
interface PartyState {
leaderId: string
status: 'idle' | 'searching' | 'in_game'
members: {
id: string
nickname: string
ready: boolean
}[]
gameRoomId?: string // 게임 중일 때 실제 게임 룸 ID
}
// 파티 리더가 매치메이킹 시작
function startSearching() {
game.sendAction({
type: 'start_search',
data: { gameMode: 'ranked' }
})
}
// 매치 발견 시 처리
game.on('onStateUpdate', (state) => {
const party = state.state as PartyState
if (party.status === 'in_game' && party.gameRoomId) {
// 파티 전체가 게임 룸으로 이동
leavePartyAndJoinGame(party.gameRoomId)
}
})파티 채팅
typescript
// 파티 내 채팅
game.sendChat('준비됐어!')
game.on('onChat', (msg) => {
const member = partyMembers.find(m => m.id === msg.clientId)
addPartyChat({
sender: member?.nickname || msg.clientId,
message: msg.message
})
})파티 리더 권한
typescript
// 파티 리더만 할 수 있는 작업
function kickMember(memberId: string) {
if (game.state?.state.leaderId !== myClientId) {
alert('파티 리더만 추방할 수 있습니다')
return
}
game.sendAction({
type: 'kick_member',
data: { memberId }
})
}
// 리더 위임
function transferLeadership(newLeaderId: string) {
game.sendAction({
type: 'transfer_leader',
data: { newLeaderId }
})
}파티 설정
typescript
// 파티 공개/비공개 설정
game.sendAction({
type: 'update_party_settings',
data: {
isPublic: false,
requireApproval: true, // 참가 승인 필요
autoStart: true // 정원 차면 자동 시작
}
})
// 참가 요청 승인 (리더)
game.sendAction({
type: 'approve_join_request',
data: { requesterId: 'player_456' }
})파티와 게임 룸 연동
typescript
// 파티로 게임 시작
async function startGameAsParty() {
// 1. 게임 룸 생성
const gameRoom = new GameRoom({
appId: 'YOUR_APP_ID',
clientId: myClientId,
publicKey: 'cb_pk_...'
})
await gameRoom.connect()
const gameState = await gameRoom.createRoom({
maxPlayers: 10,
metadata: { partyId: partyRoomId }
})
// 2. 파티 상태 업데이트
game.sendAction({
type: 'game_started',
data: { gameRoomId: gameState.roomId }
})
// 3. 파티원들은 상태 변경 감지하여 게임 룸 참가
}
// 파티원 측
game.on('onStateUpdate', async (state) => {
const party = state.state as PartyState
if (party.gameRoomId && party.status === 'in_game') {
// 게임 룸에 참가
const gameRoom = new GameRoom({
appId: 'YOUR_APP_ID',
clientId: myClientId,
publicKey: 'cb_pk_...'
})
await gameRoom.connect()
await gameRoom.joinRoom(party.gameRoomId)
}
})