//--------------------------------------------------------
        // Handler.
        //--------------------------------------------------------
        public void on_receive(CPlayer owner, CPacket msg)
        {
            PROTOCOL protocol = (PROTOCOL)msg.pop_protocol_id();

            /*if (is_received(owner.player_index, protocol))
             * {
             *  // 플레이어가 이미 해당 프로토콜을 전송했다. 중복 처리 하지 않고 리턴한다.
             *  return;
             * }*/

            // 프로토콜을 받았다고 기록한다.
            checked_protocol(owner.player_index, protocol);

            // 상태 매니저에 패킷을 보낸 플레이어와 패킷 내용을 전달한다.
            // 이후 게임 로직은 상태 매니저를 통해 현재 수행중인 상태 객체에서 처리된다.
            //this.state_manager.send_state_message((PROTOCOL)msg.protocol_id, owner, msg);
            //this.state_manager.send_state_message(protocol, owner, msg);
            this.current_room_state.on_receive(protocol, owner, msg);
        }
 /// <summary>
 /// 어플 실행 후 서버 접속시 닉네임과 함께 CPlayer 객체 생성
 /// </summary>
 /// <param name="player_name"></param>
 public void enter_lobby(string player_name)
 {
     this.player = new CPlayer(this, player_name);
 }
        /// <summary>
        /// 매칭 성공 후 플레이어들을 방에 입장 시킨다.
        /// </summary>
        /// <param name="player1"></param>
        /// <param name="player2"></param>
        public void enter_gameroom(CPlayer player1, CPlayer player2, CPlayer player3, CPlayer player4)
        {
            if (player1 == null || player2 == null || player3 == null || player4 == null)
            {
                throw new Exception("Player cannot be null.");
            }

            if (this.players.Count >= 4)
            {
                throw new Exception("This room is not empty.");
            }

            add_player(player1);
            add_player(player2);
            add_player(player3);
            add_player(player4);

            {
                this.players.ForEach(player =>
                {
                    CPacket reply = CPacket.create((short)PROTOCOL.START_LOADING);
                    reply.push((int)player.player_index);  // 본인의 플레이어 인덱스를 알려준다.
                    player.send(reply);
                });
            }
        }
 public void error(CPlayer player)
 {
     player.disconnect();
 }
 public void remove_player(CPlayer oldbie)
 {
     this.players.Remove(oldbie);
 }
 public void add_player(CPlayer newbie)
 {
     this.players.Add(newbie);
 }