예제 #1
0
    public static void C_MoveHandler(PacketSession session, IMessage packet)
    {
        // 클라에서 뭔가 움직임!
        C_Move        movePacket    = packet as C_Move;
        ClientSession clientSession = session as ClientSession;

        //Console.WriteLine($"{clientSession.MyPlayer.Info.ObjectId} : C_MOVE ({movePacket.PosInfo.PosX}, {movePacket.PosInfo.PosY}) Dir : {clientSession.MyPlayer.Info.PosInfo.MoveDir}");

        Player player = clientSession.MyPlayer;

        if (player == null)
        {
            return;
        }

        GameRoom room = clientSession.MyPlayer.Room;

        if (room == null)
        {
            return;
        }

        //room.HandleMove(player, movePacket);
        room.Push(room.HandleMove, player, movePacket);
    }
예제 #2
0
        public void HandleMove(Player player, C_Move movePacket)
        {
            if (player == null)
            {
                return;
            }

            // 일단 서버에서 좌표 이동
            PositionInfo MovePosinfo = movePacket.PosInfo;
            ObjectInfo   info        = player.Info;

            // 다른 좌표로 이동할 경우, 갈 수 있는지 체크
            if (MovePosinfo.PosX != info.PosInfo.PosX || MovePosinfo.PosY != info.PosInfo.PosY)
            {
                if (_Map.CanGo(new Vector2int(MovePosinfo.PosX, MovePosinfo.PosY)) == false)
                {
                    return;
                }
            }

            info.PosInfo.State   = MovePosinfo.State;
            info.PosInfo.Movedir = MovePosinfo.Movedir;
            _Map.ApplyMove(player, new Vector2int(MovePosinfo.PosX, MovePosinfo.PosY));

            // 다른 플레이어한테도 알려준다.
            S_Move resMovePacket = new S_Move();

            resMovePacket.ObjectId = player.Info.ObjectId;
            resMovePacket.PosInfo  = movePacket.PosInfo;

            BroadCast(resMovePacket);
        }
        public void HandleMove(Player player, C_Move movePacket)
        {
            if (player == null)
            {
                return;
            }

            // TODO : 검증
            PositionInfo movePosInfo = movePacket.PosInfo;
            ObjectInfo   info        = player.Info;

            // 다른 좌표로 이동할 경우, 갈 수 있는지 체크
            if (movePosInfo.PosX != info.PosInfo.PosX || movePosInfo.PosY != info.PosInfo.PosY)
            {
                if (Map.CanGo(new Vector2Int(movePosInfo.PosX, movePosInfo.PosY)) == false)
                {
                    return;
                }
            }

            info.PosInfo.State   = movePosInfo.State;
            info.PosInfo.MoveDir = movePosInfo.MoveDir;
            Map.ApplyMove(player, new Vector2Int(movePosInfo.PosX, movePosInfo.PosY));

            // 다른 플레이어한테도 알려준다
            S_Move resMovePacket = new S_Move();

            resMovePacket.ObjectId = player.Info.ObjectId;
            resMovePacket.PosInfo  = movePacket.PosInfo;

            Broadcast(resMovePacket);
        }
    public static void C_MoveHandler(PacketSession session, IMessage packet)
    {
        C_Move        movePacket    = packet as C_Move;
        ClientSession clientSession = session as ClientSession;

        //Console.WriteLine($"C_Move({movePacket.PosInfo.PosX}, {movePacket.PosInfo.PosY})");

        if (clientSession.MyPlayer == null)
        {
            return;
        }
        if (clientSession.MyPlayer.Room == null)
        {
            return;
        }

        //TODO : 검증
        //서버에서 좌표 이동
        PlayerInfo info = clientSession.MyPlayer.Info;

        info.PosInfo = movePacket.PosInfo;

        //다른 플레이어한테도 알려준다
        S_Move resMovePacket = new S_Move();

        resMovePacket.PlayerId = clientSession.MyPlayer.Info.PlayerId;
        resMovePacket.PosInfo  = movePacket.PosInfo;

        clientSession.MyPlayer.Room.Broadcast(resMovePacket);
    }
 protected override void CheckUpdatedFlag()
 {
     if (_updated)
     {
         C_Move movePacket = new C_Move();
         movePacket.PosInfo = PosInfo;
         Managers.Network.Send(movePacket);
         _updated = false;
     }
 }
예제 #6
0
 protected override void CheckUpdatedFlag()
 {
     if (_updated)
     {
         // 정말 갱신사항이 있으면 서버에다가 변경사항을 보냄
         C_Move movePacket = new C_Move();
         movePacket.PosInfo = PosInfo;      // xyz좌표 및 state정보를 한번에
         Managers.Network.Send(movePacket); // 클라에서 서버로(C_Move) 보내기
         _updated = false;
     }
 }
예제 #7
0
 protected override void CheckUpdateFlag()
 {
     if (_updated)
     {
         C_Move movePacket = new C_Move();
         movePacket.PosInfo = PosInfo;
         //Debug.Log($"{transform.name} : C_MOVE({movePacket.PosInfo.PosX}, {movePacket.PosInfo.PosY})");
         Managers.Network.Send(movePacket);
         _updated = false;
     }
 }
예제 #8
0
    IEnumerator CoSendPacket()
    {
        while (true)
        {
            yield return(new WaitForSeconds(0.25f));

            C_Move movePacket = new C_Move();
            movePacket.posX = Random.Range(-50, 50);
            movePacket.posY = 0;
            movePacket.posZ = Random.Range(-50, 50);

            _network.Send(movePacket.Write());
        }
    }
예제 #9
0
    IEnumerator CoSendPacket()
    {
        while (true)
        {
            yield return(new WaitForSeconds(3f));

            C_Move movePacket = new C_Move();
            movePacket.posX = UnityEngine.Random.Range(-50, 50);
            movePacket.posY = 1f;
            movePacket.posZ = UnityEngine.Random.Range(-50, 50);

            _networkManager.Send(movePacket.Write());
        }
    }
예제 #10
0
    public static void C_MoveHandler(PacketSession session, IPacket packet)
    {
        C_Move        movePacket    = packet as C_Move;
        ClientSession clientSession = session as ClientSession;

        if (clientSession.Room == null)
        {
            return;
        }

        GameRoom room = clientSession.Room;

        room.Push(() => room.Move(clientSession, movePacket));
    }
예제 #11
0
 public void SendForEach()
 {
     lock (_lock)
     {
         foreach (var session in _sessions)
         {
             C_Move movePacket = new C_Move();
             movePacket.posX = _rand.Next(-50, 50);
             movePacket.posY = 0;
             movePacket.posZ = _rand.Next(-50, 50);
             session.Send(movePacket.Write());
         }
     }
 }
예제 #12
0
        public void Move(ClientSession session, C_Move packet)
        {
            // 좌표 바꿔주고
            session.PosX = packet.posX;
            session.PosY = packet.posY;
            session.PosZ = packet.posZ;
            // 모두에게 알림
            S_BroadcastMove move = new S_BroadcastMove();

            move.playerId = session.SessionId;
            move.posX     = session.PosX;
            move.posY     = session.PosY;
            move.posZ     = session.PosZ;
            Broadcast(move.Write());
        }
예제 #13
0
    public static void C_MoveHandler(PacketSession session, IPacket packet)
    {
        C_Move        movePacket    = packet as C_Move;
        ClientSession clientSession = session as ClientSession;

        if (clientSession.Room == null)
        {
            return;
        }

        //Console.WriteLine($"X:{movePacket.posX}\tY:{movePacket.posY}\tZ:{movePacket.posZ}");

        GameRoom room = clientSession.Room;

        room.Push(() => room.Move(clientSession, movePacket));
    }
예제 #14
0
        public void SendForEach()
        {
            lock (_lock)
            {
                foreach (ServerSession session in _sessions)
                {
                    C_Move movePacket = new C_Move();
                    movePacket.posX = _rand.Next(-50, 50);
                    movePacket.posY = 0;
                    movePacket.posZ = _rand.Next(-50, 50);

                    ArraySegment <byte> segment = movePacket.Write();

                    session.Send(segment);
                }
            }
        }
예제 #15
0
    IEnumerator CoSendPacket()
    {
        while (true)
        {
            yield return(new WaitForSeconds(0.25f));

            C_Move movePacket = new C_Move();

            movePacket.posX = UnityEngine.Random.Range(-50, 50);
            movePacket.posY = UnityEngine.Random.Range(-50, 50);
            movePacket.posZ = UnityEngine.Random.Range(-50, 50);


            ArraySegment <byte> segment = movePacket.Write();

            networkManager.Send(segment);
        }
    }
예제 #16
0
    public static void C_MoveHandler(PacketSession sesion, IPacket packet)
    {
        C_Move        movePacket    = packet as C_Move;
        ClientSession clientsession = sesion as ClientSession;

        if (clientsession.Room == null)
        {
            return;
        }

        //Console.WriteLine($"{movePacket.posX}, {movePacket.posY}, {movePacket.posZ}");

        GameRoom room = clientsession.Room;

        room.Push(() =>
        {
            //room.BroadCast(clientsession, p.chat);
            room.Move(clientsession, movePacket);
        });
    }
예제 #17
0
    public static void C_MoveHandler(PacketSession session, IMessage packet)
    {
        C_Move        movePacket    = packet as C_Move;
        ClientSession clientSession = session as ClientSession;

        //Console.WriteLine($"C_Move ({movePacket.PosInfo.PosX}, {movePacket.PosInfo.PosY})");

        Player player = clientSession.MyPlayer;

        if (player == null)
        {
            return;
        }

        GameRoom room = player.Room;

        if (room == null)
        {
            return;
        }

        room.Push(room.HandleMove, player, movePacket);
    }
예제 #18
0
    public static void C_MoveHandler(PacketSession session, IMessage packet)
    {
        C_Move        movePacket    = packet as C_Move;
        ClientSession clientSession = session as ClientSession;

        //Console.WriteLine($"C_Move ({movePacket.PosInfo.PosX}, {movePacket.PosInfo.PosY})");

        // lock 처리 안하고 멀티쓰레드 방어

        Player player = clientSession.MyPlayer;         // 내가 꺼내오는 시점의 플레이어를 따로 변수로 뺌

        if (player == null)
        {
            return;
        }

        // 아래부터는 MyPlayer가 null 아니라고 확신하고 작성한 코드들이지만
        // 멀티쓰레드일때는 보장할수가 없다.
        // 그래서 플레이어가 내가 꺼내오는 시점에서 있다면? 따로 변수로 빼놓고 쓰자

        // 만약 다른 쓰레드에서 LeaveGame() 해버리면 null이 아니라고 체크하고 들어가도
        // 하단에서 터질수가 있음
        // 그니깐 플레이어처럼 내가 체크하는 시점에서 따로 빼놓음
        GameRoom room = player.Room;

        if (room == null)
        {
            return;
        }

        // JobQueue 방식을 사용했기 때문에 이동패킷에 대한 응답에 딜레이가 생겼음 (room.HandleMove)
        // 그런데 내가 조작하는 플레이어는 이미 이동을 해버렸는데 서버 응답은 즉시가 아님
        // 클라이언트의 S_MoveHandler을 보면 서버 응답을 받고 내가 조작하는 플레이어의 상태까지 변경해버리기 때문에
        // 위에 응답 딜레이와 합쳐져서 부자연스러운 움직임을 보이게 됨,
        // 난 이미 이동했지만 서버는 직전 좌표를 던져줘서 나를 강제로 이동시킬수가 있다.
        room.Push(room.HandleMove, player, movePacket);         // 이동패킷 처리를 안전하게
    }
예제 #19
0
        public void HandleMove(Player player, C_Move movePacket)
        {
            if (player == null)
            {
                return;
            }

            // 검증
            PositionInfo movePosInfo = movePacket.PosInfo; // 이동하려는 목적지 좌표
            ObjectInfo   info        = player.Info;        // 이동하기 전의 플레이어 좌표

            // 다른 좌표로 이동할 경우, 갈 수 있는지 체크
            if (movePosInfo.PosX != info.PosInfo.PosX || movePosInfo.PosY != info.PosInfo.PosY)
            {
                if (Map.CanGo(new Vector2Int(movePosInfo.PosX, movePosInfo.PosY)) == false)
                {
                    return; // 플레이어가 가려고 요청한 곳에 갈 수 있는지를 실제 맵 데이터와 대조
                }
            }

            // 좌표가 바뀌지 않고 상태만 바뀌었을 경우 아래만 실행
            info.PosInfo.State   = movePosInfo.State;
            info.PosInfo.MoveDir = movePosInfo.MoveDir;
            // 이동하는 부분을 GameRoom에서 하지않고 map 클래스에서 처리
            // 왜냐면 map이 들고있는 플레이어 좌표 배열에 가서 기존 위치를 null 처리하고
            // 이동시켜야 하기 떄문에 map클래스 안에서 하는게 편하다
            Map.ApplyMove(player, new Vector2Int(movePosInfo.PosX, movePosInfo.PosY)); // 맵에다가 나를 이동시켜달라 요청

            // 다른 플레이어에게도 알려준다
            S_Move resMovePacket = new S_Move();

            resMovePacket.ObjectId = player.Info.ObjectId; // 움직이는 사람의 id
            resMovePacket.PosInfo  = movePacket.PosInfo;

            Broadcast(resMovePacket); // 들어와있는 모든 유저에게 알림
        }