Chain2D.Channels
한 게임 서버는 채널을 여럿 돌리고, 채널마다 이 스크립트가 한 벌씩 돕니다. 같은 게임의 다른 방이라고 생각하면 됩니다. 여기 있는 것은 사람을 다른 채널로 보내는 하나뿐입니다.
Channels.move
Chain2D.Channels.move(player: Player, targetOrdinal: number)| player | Player | 이 채널에 접속해 있는 Player. `Players` 가 건넨 표 자체여야 하고, 같은 `id` 를 담아 새로 만든 표는 거부됩니다. |
| targetOrdinal | number | 보낼 채널 번호. 1 이상의 정수여야 하고, 이 사람이 지금 있는 채널과 같으면 거부됩니다. 이 게임 서버가 실제로 돌리는 채널 수를 넘는 번호는 이 호출이 거부하지 않지만 GameHost 가 결함으로 보고 채널 그룹 전체를 세웁니다. 채널이 몇 개인지 묻는 API 는 없으므로 그 수는 게임이 알고 있어야 하고, 채널을 하나만 돌리는 게임에는 보낼 곳이 없습니다. |
사람을 다른 채널로 보냅니다. 부르는 순간 이 스크립트에서는 나간 것으로 처리됩니다 — `playerRemoving` 이 불리고, 이 사람의 Data 문서가 저장되고, `getPlayers` 와 `getPlayerById` 에서 사라집니다. 그 다음에 이동이 요청됩니다. 나가는 것으로 치는 쪽은 이 스크립트이고, 진짜 접속 종료에서 엔진이 하는 정리는 여기서 일어나지 않습니다. `playerRemoving` 은 불리니 몸을 내리는 일은 거기서 하던 대로 되지만, 이 사람이 원래 맵에 있다는 사실은 엔진 쪽에 남습니다 — 그 맵의 `playerCount` 는 떠난 사람을 계속 세고, 그것을 되돌리는 호출은 없습니다. 채널 이동으로 사람이 빠져나가는 맵에서는 인원수를 `playerCount` 대신 게임이 세는 편이 맞습니다. 목적지 채널에서는 새 접속으로 도착하고, 그쪽 스크립트의 `playerAdded` 가 불립니다. 채널마다 스크립트가 한 벌씩 따로 돌기 때문에 넘어가는 것은 저장된 Data 뿐이고, 이 스크립트가 이 사람에 대해 들고 있던 표는 넘어가지 않습니다. 이동했는지는 값으로 돌아오지 않습니다. 이동을 적용하지 못해도 그 사람의 연결은 원래 채널에 그대로 남지만, 이 스크립트는 이미 그를 잊은 뒤이고 되돌리는 길은 없습니다 — 그 뒤로 그 사람이 보내는 메시지도, 그 사람이 나가는 것도 이 스크립트에게는 모르는 Player 의 일이 되어 오류가 됩니다. 가는 곳이 있는 번호일 때만 부릅니다.
Chain2D.Network.on("goLobby", function(player)
if player.channelOrdinal ~= 1 then
Chain2D.Channels.move(player, 1)
end
end)