본문으로 건너뛰기

파티 시스템

파티는 친구들과 함께 게임에 참가하기 위한 그룹입니다. 파티원들은 함께 매치메이킹에 참가하고 같은 룸에 배정됩니다.

파티 생성

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)
  }
})