Exemple #1
0
    /**
     * @brief 패킷 분석
     */
    public void ParsePacket(int len)
    {
        string msg = Encoding.UTF8.GetString(this.buf, 2, len - 2);

        string[] txt = msg.Split(':');

        // 상대가 타일을 누를때
        if (txt[0].Equals("SELECTING"))
        {
            if (!GameMng.I.myTurn)
            {
                GameMng.I.enemyClickTile(int.Parse(txt[1]), int.Parse(txt[2]));
            }
        }
        // 턴 넘김
        else if (txt[0].Equals("TURN"))
        {
            GameMng.I.turnManage(int.Parse(txt[1]));
        }
        else if (txt[0].Equals("CREATE_UNIT"))
        {
            // x값, y값, 유닛 코드, 생성자, 건물 x값, 건물 y값
            GameMng.I._BuiltGM.CreateUnit(int.Parse(txt[1]), int.Parse(txt[2]), int.Parse(txt[3]), int.Parse(txt[4]), int.Parse(txt[5]), int.Parse(txt[6]));
        }
        else if (txt[0].Equals("CREATE_BUILT"))
        {
            // x값, y값, 건물 코드, 생성자, 건물 x값, 건물 y값
            GameMng.I._UnitGM.CreateBuilt(int.Parse(txt[1]), int.Parse(txt[2]), int.Parse(txt[3]), int.Parse(txt[4]), int.Parse(txt[5]), int.Parse(txt[6]));
        }
        else if (txt[0].Equals("CREATE_AIRDROP"))
        {
            // 보급이 생성될 배열의 번호, 보급이 떨어질 곳의 코드 값
            GameMng.I._BuiltGM.CreateAirDrop(int.Parse(txt[1]), int.Parse(txt[2]));
        }
        else if (txt[0].Equals("MOVE_UNIT"))
        {
            // 현재 x값, y값, 이동할 x값, y값
            StartCoroutine(GameMng.I._UnitGM.MovingUnit(int.Parse(txt[1]), int.Parse(txt[2]), int.Parse(txt[3]), int.Parse(txt[4])));
        }
        else if (txt[0].Equals("ATTACK"))
        {
            // 오브젝트 x값, y값, 공격할 x값, y값
            // 현재 오브젝트를 찾아서 공격력 찾은 다음 대상 위치의 hp 를 깎음
            GameMng.I.attack(int.Parse(txt[1]), int.Parse(txt[2]), int.Parse(txt[3]), int.Parse(txt[4]), int.Parse(txt[5]));
        }
        else if (txt[0].Equals("ATTACK_TURRET"))
        {
            // 오브젝트 x값, y값, 공격 대미지
            // 공격한 터렛 오브젝트를 찾아서 범위 안의 유닛의 hp 를 깎음
            GameMng.I.TurretAttack(int.Parse(txt[1]), int.Parse(txt[2]), int.Parse(txt[3]), int.Parse(txt[4]));
        }
        else if (txt[0].Equals("CHAT"))
        {
            GameMng.I._chat.newMessage(txt[1], txt[2]);
        }
        else if (txt[0].Equals("PLUNDER"))
        {
            Debug.Log(txt[1] + "," + txt[2] + "," + txt[3] + "," + txt[4]);
            // 공격한 사람 고유번호, 공격당한 사람 고유번호, 약달한 자원, 약탈한 자원종류, 공격당한 posX, 공격당한 posY
            string attackername = GameMng.I.getUserName(int.Parse(txt[2]));
            switch (int.Parse(txt[4]))
            {
            case 0:
                if (uniqueNumber.Equals(int.Parse(txt[1])))
                {
                    GameMng.I.addActMessage(string.Format("{0}에게 골드를 {1} 약탈했습니다.", attackername, txt[3]), int.Parse(txt[5]), int.Parse(txt[6]));
                    GameMng.I.addLogMessage(attackername, string.Format("에게 골드를 {0} 약탈했습니다.", txt[3]));
                    GameMng.I.addGold(int.Parse(txt[3]));
                }
                else if (uniqueNumber.Equals(int.Parse(txt[2])))
                {
                    GameMng.I.addActMessage(string.Format("{0}에게 골드를 {1} 약탈당했습니다.", attackername, txt[3]), int.Parse(txt[5]), int.Parse(txt[6]));
                    GameMng.I.addLogMessage(attackername, string.Format("에게 골드를 {0} 약탈당했습니다.", txt[3]));
                    GameMng.I.minGold(int.Parse(txt[3]));
                }
                break;

            case 1:
                if (uniqueNumber.Equals(int.Parse(txt[1])))
                {
                    GameMng.I.addActMessage(string.Format("{0}에게 식량을 {1} 약탈했습니다.", attackername, txt[3]), int.Parse(txt[5]), int.Parse(txt[6]));
                    GameMng.I.addLogMessage(attackername, string.Format("에게 식량을 {0} 약탈했습니다.", txt[3]));
                    GameMng.I.addFood(int.Parse(txt[3]));
                }
                else if (uniqueNumber.Equals(int.Parse(txt[2])))
                {
                    GameMng.I.addActMessage(string.Format("{0}에게 식량을 {1} 약탈당했습니다.", attackername, txt[3]), int.Parse(txt[5]), int.Parse(txt[6]));
                    GameMng.I.addLogMessage(attackername, string.Format("에게 식량을 {0} 약탈당했습니다.", txt[3]));
                    GameMng.I.minFood(int.Parse(txt[3]));
                }
                break;
            }
        }
        else if (txt[0].Equals("DIE_UNIT"))
        {
            GameMng.I._hextile.GetCell(int.Parse(txt[1]), int.Parse(txt[2]))._unitObj.DestroyMyself();
            GameMng.I._hextile.GetCell(int.Parse(txt[1]), int.Parse(txt[2]))._unitObj = null;
            GameMng.I._hextile.TilecodeClear(int.Parse(txt[1]), int.Parse(txt[2]));
        }
        else if (txt[0].Equals("DESTROY_BUILT"))
        {
            GameMng.I._BuiltGM.DestroyBuilt(int.Parse(txt[1]), int.Parse(txt[2]));
        }
        // 방에 있던 사람 중 누군가 나감
        else if (txt[0].Equals("SOMEONE_EXIT"))
        {
            if (uniqueNumber.Equals(int.Parse(txt[1])))
            {
                v_user.Clear();
                return;
            }

            int i;
            for (i = 0; i < v_user.Count; i++)
            {
                if (v_user[i].uniqueNumber.Equals(int.Parse(txt[1])))
                {
                    break;
                }
            }
            v_user.RemoveAt(i);

            _roomGM.roomRefresh();
        }
        // 게임 도중 방에 있던 사람 중 누군가 나감 SOMEONE_EXIT 와는 상황이 조금 다름
        else if (txt[0].Equals("LOGOUT"))
        {
            if (v_user.Count == 0)
            {
                return;
            }

            if (firstPlayerUniqueNumber != -1)
            {
                GameMng.I.UserExit(int.Parse(txt[1]));
            }

            //int i;
            //for (i = 0; i < v_user.Count; i++)
            //{
            //    if (v_user[i].uniqueNumber.Equals(int.Parse(txt[1])))
            //    {
            //        break;
            //    }
            //}

            //v_user.RemoveAt(i);

            if (firstPlayerUniqueNumber == -1)    // 인게임이라면 사용안함
            {
                _roomGM.roomRefresh();
            }
        }
        // 직접 방 생성후 이동
        else if (txt[0].Equals("CHANGE_ROOM"))
        {
            myRoom = int.Parse(txt[1]);
            // 광장이 아닐때
            if (!myRoom.Equals(0))
            {
                _roomGM.changeRoom();
            }
        }
        // 방 정보 받음
        else if (txt[0].Equals("FOUND_ROOM"))
        {
            _roomGM.makeGate(txt[1], txt[2], txt[3], txt[4], txt[5]);
        }
        // 방에 접속 시도후 받음
        else if (txt[0].Equals("ENTER_ROOM"))
        {
            if (txt[1].Equals("IN"))
            {
                for (int k = 0; k < (txt.Length - 2) / 4; k++)
                {
                    UserInfo userInfo = new UserInfo
                    {
                        nickName     = txt[3 + k * 4],
                        uniqueNumber = int.Parse(txt[4 + k * 4]),
                        tribe        = int.Parse(txt[5 + k * 4]),
                        color        = int.Parse(txt[6 + k * 4])
                    };
                    v_user.Add(userInfo);

                    if (uniqueNumber.Equals(int.Parse(txt[4 + k * 4])))
                    {
                        myColor = (COLOR)(int.Parse(txt[6 + k * 4]));
                    }
                }
                _roomGM.intoRoom(txt[2]);
                _roomGM.roomRefresh();
            }
            else if (txt[1].Equals("LIMIT"))
            {
                myRoom = 0;
            }
            else if (txt[1].Equals("MISS"))
            {
                myRoom = 0;
            }
        }
        // 누군가 대기 방에서 나갔을때 방 주인 변경
        else if (txt[0].Equals("NOW_ROOM_OWNER"))
        {
            roomOwner = true;
            _roomGM.nowRoomOwner();
        }
        // 누군가 게임 도중 나갔을때 방 주인을 변경할때 호출됨
        else if (txt[0].Equals("CHANGE_ROOM_OWNER"))
        {
            roomOwner = true;
        }
        else if (txt[0].Equals("LOSE"))
        {
            for (int i = 0; i < v_user.Count; i++)
            {
                if (v_user[i].uniqueNumber.Equals(int.Parse(txt[1])))
                {
                    GameMng.I.addActMessage(
                        string.Format("● {0}님이 패배했습니다. ●", GameMng.I.getUserName(int.Parse(txt[1]))),
                        GameMng.I._hextile.starttile[v_user[i].startPos].PosX,
                        GameMng.I._hextile.starttile[v_user[i].startPos].PosZ);
                    GameMng.I.addLogMessage(GameMng.I.getUserName(int.Parse(txt[1])), "패배했습니다.");
                    break;
                }
            }

            // Tab UI 에서 죽은 유저로 표시하기
            GameMng.I.UserExit(int.Parse(txt[1]));
        }
        else if (txt[0].Equals("WIN"))
        {
            GameMng.I.winUI.SetActive(true);
        }
        else if (txt[0].Equals("TRIBE"))
        {
            // 종족을 변경하는 유저의 코드와 변경하는 종족의 코드
            _roomGM.changeTribe(int.Parse(txt[1]), int.Parse(txt[2]));
        }
        else if (txt[0].Equals("COLOR"))
        {
            // 색상을 변경하는 유저의 코드와 변경하는 색상의 코드
            _roomGM.changeColor(int.Parse(txt[1]), int.Parse(txt[2]));
        }
        else if (txt[0].Equals("GAME_START"))
        {
            Debug.Log(msg);

            //uniqueNumber = int.Parse(txt[1]);

            Debug.Log("GAME START !!!");
            _soundGM.waitBGM();
            Debug.Log("txt 메세지 사이즈 (2개 + 3*인원수 여야됨) : " + txt.Length);

            // 1: 고유번호, 2: 첫 시작 위치
            for (int k = 0; k < (txt.Length - 1) / 2; k++)
            {
                for (int j = 0; j < v_user.Count; j++)
                {
                    if (v_user[j].uniqueNumber == int.Parse(txt[1 + k * 2]))
                    {
                        UserInfo info = v_user[j];
                        info.startPos = int.Parse(txt[2 + k * 2]);
                        v_user[j]     = info;
                        break;
                    }
                }
            }

            firstPlayerUniqueNumber = int.Parse(txt[1]);
            SceneManager.LoadScene("InGame");
        }
        else if (txt[0].Equals("UNIQUE"))
        {
            uniqueNumber = int.Parse(txt[1]);
        }
        // 접속 - 첫 로그인
        else if (txt[0].Equals("CONNECT"))
        {
            Debug.Log("Connected.");
            SendMsg(string.Format("LOGIN:{0}", nickName));
            profileNickname.text = nickName;
        }
        // 누군가 들어올때 받음
        else if (txt[0].Equals("SOMEONE_ENTER"))
        {
            UserInfo tempUser = new UserInfo
            {
                nickName     = txt[1],
                uniqueNumber = int.Parse(txt[2]),
                tribe        = int.Parse(txt[3]),
                color        = int.Parse(txt[4])
            };
            v_user.Add(tempUser);
            _roomGM.roomRefresh();
        }
    }