示例#1
0
        public CruMessage ExtractDatas(CruNetworkProtocol.MSG_TYPE type, byte[] buffer, int offset, int buffersize)
        {
            CruMessage result;

            object[] datas;
            int[]    datasizelist;
            CruNetworkProtocol.DATA_TYPE[] typelist;
            int bufferIdx   = 0;
            int setDataSize = 0;

            datasizelist = CruNetworkProtocol.GetMessageSizeList(type);
            typelist     = CruNetworkProtocol.GetMessageTypeList(type);

            datas = new object[datasizelist.Length - 1];

            for (int i = 1; i < datasizelist.Length; ++i)
            {
                setDataSize = offset + bufferIdx;

                // 다음에 처리할 사이즈가 총 버퍼의 사이즈를 넘어간다면,
                if (setDataSize + datasizelist[i] > buffersize)
                {
                    throw new SystemException("버퍼 사이즈를 넘겼습니다.");
                }

                // 데이터 Get
                switch (typelist[i])
                {
                case CruNetworkProtocol.DATA_TYPE.BOOLEAN:
                    datas[i - 1] = BitConverter.ToBoolean(buffer, setDataSize);
                    break;

                case CruNetworkProtocol.DATA_TYPE.SHORT:
                    datas[i - 1] = BitConverter.ToInt16(buffer, setDataSize);
                    break;

                case CruNetworkProtocol.DATA_TYPE.INT:
                    datas[i - 1] = BitConverter.ToInt32(buffer, setDataSize);
                    break;

                case CruNetworkProtocol.DATA_TYPE.FLOAT:
                    datas[i - 1] = BitConverter.ToSingle(buffer, setDataSize);
                    break;

                case CruNetworkProtocol.DATA_TYPE.DOUBLE:
                    datas[i - 1] = BitConverter.ToDouble(buffer, setDataSize);
                    break;

                // string어디까지 읽을건지가 안적혀있구나... 이거... 그냥 앞에 데이터타입을 붙여야하나?
                case CruNetworkProtocol.DATA_TYPE.STRING:
                {
                    int stringsize = BitConverter.ToInt16(buffer, setDataSize);
                    datas[i - 1] = Encoding.ASCII.GetString(buffer, bufferIdx + CruNetworkProtocol.Head.HEADSIZE_STRING, stringsize);
                }
                break;

                default:
                    break;
                }

                setDataSize += datasizelist[i];
            }

            // 변화한 데이터 사이즈가, 총량을 넘어갔을 때 ㅇㅇ
            if (setDataSize > datasizelist[0])
            {
                return(null);
            }

            result = new CruMessage(type, datas);

            return(result);
        }
示例#2
0
 public CruMessage(CruNetworkProtocol.MSG_TYPE type, object[] datas)
 {
     _type  = (short)type;
     _datas = datas;
 }
示例#3
0
        // bool 형으로 만들어서 제대로 처리되었는지 확인해야할까...?
        public void MessageHandle(CruMessage msg, int clientNum)
        {
            CruNetworkProtocol.MSG_TYPE type = (CruNetworkProtocol.MSG_TYPE)msg.Type;

            switch (type)
            {
            case CruNetworkProtocol.MSG_TYPE.LOGIN_REQUEST:
                onLoginRequestEvent(msg, clientNum);
                break;

            case CruNetworkProtocol.MSG_TYPE.LOGIN_ACK:
                onLoginACKEvent(msg, clientNum);
                break;

            case CruNetworkProtocol.MSG_TYPE.CHECK_USER:
                onCheckUserEvent(msg, clientNum);
                break;

            case CruNetworkProtocol.MSG_TYPE.CHECK_USER_ACK:
                onCheckUserACKEvent(msg, clientNum);
                break;

            case CruNetworkProtocol.MSG_TYPE.PLAYER_DATA:
                onPlayerDataEvent(msg, clientNum);
                break;

            case CruNetworkProtocol.MSG_TYPE.CUSTOM_PLAYER_DATA:
                onCustomPlayerDataEvent(msg, clientNum);
                break;

            case CruNetworkProtocol.MSG_TYPE.PLAYER_LOCATION:
                onPlayerLocation(msg, clientNum);
                break;

            case CruNetworkProtocol.MSG_TYPE.ITEM_DATA:
                onItemDataEvent(msg, clientNum);
                break;

            case CruNetworkProtocol.MSG_TYPE.MOVE:
                onMoveEvent(msg, clientNum);
                break;

            case CruNetworkProtocol.MSG_TYPE.LOOK:
                onLookEvent(msg, clientNum);
                break;

            case CruNetworkProtocol.MSG_TYPE.ITEM_BUY:
                onItemBuyEvent(msg, clientNum);
                break;

            case CruNetworkProtocol.MSG_TYPE.REQUEST_PLAYERS_LOCATION:
                onRequestPlayersLocation(msg, clientNum);
                break;

            case CruNetworkProtocol.MSG_TYPE.RESULT_GETEXP:
                onResultGetEXPEvent(msg, clientNum);
                break;

            case CruNetworkProtocol.MSG_TYPE.RESULT_LEVELUP:
                onResultLevelUpEvent(msg, clientNum);
                break;

            case CruNetworkProtocol.MSG_TYPE.RESULT_ATTACK:
                onResultAttackEvent(msg, clientNum);
                break;

            default:
                throw new SystemException("해당 명령이 존재하지 않습니다.");
            }
        }