//---------------------------------------------------------------------------------------------------- /// <summary> /// 데이터 수신 처리 /// </summary> /// <param name="client">cClient 인스턴스</param> /// <param name="data">수신 데이터</param> /// <param name="size">수신 데이터 크기</param> //---------------------------------------------------------------------------------------------------- void OnRecv( cClient client, byte[] data, int size ) { if( client.UseCryptogram ) data = cCryptogram.Decrypt( data, size, client.DataIV, client.DataKey ); cBitStream bits = new cBitStream(); bits.Write( data, 0, size ); bits.Position = 0; cNetwork.eOrder order = cNetwork.ReadOrder( bits ); cNetwork.eResult result = cNetwork.ReadResult( bits ); if( result != cNetwork.eResult.SUCCESS ) { Error( order + " : " + result + " : \n" + bits.ToString() ); } else { Print( order + " : " + result + " : \n" + bits.ToString() ); } switch( order ) { case cNetwork.eOrder.SERVER_LOGIN: RecvServerLogin( result, bits ); break; case cNetwork.eOrder.SERVER_IN: RecvServerIn( result, bits ); break; case cNetwork.eOrder.SERVER_OUT: RecvServerOut( result, bits ); break; case cNetwork.eOrder.CLIENT_INFO_DEFAULT: RecvClientInfoDefault( result, bits ); break; case cNetwork.eOrder.CHANNEL_LIST: RecvChannelList( result, bits ); break; case cNetwork.eOrder.CHANNEL_IN: RecvChannelIn( result, bits ); break; case cNetwork.eOrder.CHANNEL_OUT: RecvChannelOut( result, bits ); break; case cNetwork.eOrder.CHANNEL_CHAT: RecvChannelChat( result, bits ); break; case cNetwork.eOrder.PARTY_CHAT: RecvPartyChat( result, bits ); break; case cNetwork.eOrder.STAGE_LIST: RecvStageList( result, bits ); break; case cNetwork.eOrder.STAGE_IN_REQUEST: RecvStageInRequest( result, bits ); break; case cNetwork.eOrder.STAGE_IN_ACCEPT: RecvStageInAccept( result, bits ); break; case cNetwork.eOrder.STAGE_USER_IN: RecvStageUserIn( result, bits ); break; case cNetwork.eOrder.STAGE_USER_OUT: RecvStageUserOut( result, bits ); break; case cNetwork.eOrder.STAGE_USER_MOVE: RecvStageUserMove( result, bits ); break; case cNetwork.eOrder.STAGE_USER_ATTACK_MONSTER: RecvStageUserAttackMonster( result, bits ); break; case cNetwork.eOrder.STAGE_USER_SKILL_SELF: RecvStageUserSkillSelf( result, bits ); break; case cNetwork.eOrder.STAGE_USER_SKILL_MONSTER: RecvStageUserSkillMonster( result, bits ); break; case cNetwork.eOrder.STAGE_USER_SKILL_POS: RecvStageUserSkillPos( result, bits ); break; case cNetwork.eOrder.STAGE_USER_DAMAGE: RecvStageUserDemage( result, bits ); break; case cNetwork.eOrder.STAGE_USER_ITEM_USE_SELF: RecvStageUserItemUseSelf( result, bits ); break; case cNetwork.eOrder.STAGE_USER_TRIGGER_ON: RecvStageUserTriggerOn( result, bits ); break; case cNetwork.eOrder.STAGE_MON_IN: RecvStageMonIn( result, bits ); break; case cNetwork.eOrder.STAGE_MON_MOVE: RecvStageMonMove( result, bits ); break; case cNetwork.eOrder.STAGE_MON_ATTACK_USER: RecvStageMonAttackUser( result, bits ); break; case cNetwork.eOrder.STAGE_MON_SKILL_SELF: RecvStageMonSkillSelf( result, bits ); break; case cNetwork.eOrder.STAGE_MON_SKILL_ACTOR: RecvStageMonSkillUser( result, bits ); break; case cNetwork.eOrder.STAGE_MON_SKILL_POS: RecvStageMonSkillPos( result, bits ); break; case cNetwork.eOrder.STAGE_MON_DAMAGE: RecvStageMonDemage( result, bits ); break; case cNetwork.eOrder.STAGE_DATA: RecvStageData( result, bits ); break; default: client.Disconnect(); break; } }
//---------------------------------------------------------------------------------------------------- /// <summary> /// 수신된 데이터를 파싱한다. /// 주의 : 이 함수는 상속 받아서 클라이언트마다 각자 프로토콜을 정의해서 사용한다. /// </summary> /// <param name="client">수신 클라이언트</param> /// <param name="data">수신 데이터</param> /// <param name="size">수신 데이터 크기</param> //---------------------------------------------------------------------------------------------------- protected virtual void OnRecv( cClient client, byte[] data, int size ) { cBitStream bits = new cBitStream(); bits.Write( data, 0, size ); Print( bits.ToString() ); eOrder order = ReadOrder( bits ); eResult result = ReadResult( bits ); Print( order + " : '"+client.Name+"'" ); // 파싱 switch( order ) { case eOrder.OBJECT_UPDATE: RecvObjectUpdate( client, result, bits ); break; default: Error( client.Name + ":" + order ); break; } }
//---------------------------------------------------------------------------------------------------- /// <summary> /// 송신 : 스테이지 : 커스텀 데이터 /// </summary> /// <param name="in_bits">커스텀 데이터</param> //---------------------------------------------------------------------------------------------------- public void SendStageData( cBitStream in_bits ) { cBitStream bits = new cBitStream(); WriteOrder( bits, eOrder.STAGE_DATA ); bits.Write( in_bits.ToByteArray() ); Send( bits ); }
///---------------------------------------------------------------------------------------------------- /// <summary> /// Unity오브젝트를 갱신한다..(미완성) /// </summary> ///---------------------------------------------------------------------------------------------------- public void UpdateUnityObject() { cBitStream bits = new cBitStream(); WriteOrder( bits, eOrder.OBJECT_UPDATE ); WriteResult( bits, eResult.SUCCESS ); bits.Write( m_master ); bits.Write( false ); lock( cUnityObject.Instances ) { foreach( KeyValuePair<uint,cUnityObject> entry in cUnityObject.Instances ) { cUnityObject value = entry.Value; Type ctype = value.GetType(); NETCLASSAttribute cattribute = GetNetClassAttribute( ctype ); if( cattribute != null ) { if( cattribute.IsSync( UnityEngine.Time.time )==false ) return; } FieldInfo finfo = ctype.GetField("m_id",BindingFlags.NonPublic|BindingFlags.Public|BindingFlags.Instance); uint object_id = (uint)finfo.GetValue(value); bits.Write( object_id, MAX_OBJECT_ID ); foreach( FieldInfo field in ctype.GetFields(BindingFlags.NonPublic|BindingFlags.Public|BindingFlags.Instance) ) { if( m_master ) { HOSTAttribute attrib=GetHostAttribute( field ); if( attrib != null ) { bits.Write( field.GetValue(value), attrib.MaxSize, attrib.MaxPoint ); } } else { GUESTAttribute attrib=GetGuestAttribute( field ); if( attrib != null ) { bits.Write( field.GetValue(value), attrib.MaxSize, attrib.MaxPoint ); } } } } } if( bits.Length > 0 ) { Send( bits ); } }