Пример #1
0
        // 게임입장
        public void HandleEnterGame(C_EnterGame enterGamePacket)
        {
            if (ServerState != PlayerServerState.ServerStateLobby)
            {
                return;
            }

            LobbyPlayerInfo playerInfo = LobbyPlayers.Find(p => p.Name == enterGamePacket.Name);

            if (playerInfo == null)
            {
                return;
            }

            // 로비에서 캐릭터 선택완료
            MyPlayer = Game.ObjectManager.Instance.Add <Player>();
            {
                MyPlayer.PlayerDbId           = playerInfo.PlayerDbId;
                MyPlayer.Info.Name            = playerInfo.Name;
                MyPlayer.Info.PosInfo.State   = CreatureState.Idle;
                MyPlayer.Info.PosInfo.MoveDir = MoveDir.Down;
                MyPlayer.Info.PosInfo.PosX    = 0;
                MyPlayer.Info.PosInfo.PosY    = 0;
                MyPlayer.Stat.MergeFrom(playerInfo.StatInfo);
                MyPlayer.Session = this;

                S_ItemList itemListPacket = new S_ItemList();

                using (AppDbContext db = new AppDbContext())
                {
                    List <ItemDb> items = db.Items
                                          .Where(i => i.OwnerDbId == playerInfo.PlayerDbId)
                                          .ToList();
                    foreach (ItemDb itemDb in items)
                    {
                        Item item = Item.MakeItem(itemDb);
                        if (item != null)
                        {
                            // 인벤에 넣어주기
                            MyPlayer.Inven.Add(item);

                            // 아이템 정보
                            ItemInfo info = new ItemInfo();
                            info.MergeFrom(item.info);
                            itemListPacket.Items.Add(info);
                        }
                    }
                    // 클라에게 아이템 목록보내기
                    Send(itemListPacket);
                }
            }

            ServerState = PlayerServerState.ServerStateGame;
            // TODO 룸번호 바꾸기
            GameLogic.Instance.Push(() =>
            {
                GameRoom room = GameLogic.Instance.Find(1);
                room.Push(room.EnterGame, MyPlayer, true);
            });
        }
        public override void OnConnected(EndPoint endPoint)
        {
            Console.WriteLine($"OnConnected : {endPoint}");

            {
                S_Connected connectedPacket = new S_Connected();
                Send(connectedPacket);
            }

            //TODO : 로비에서 캐릭터 선택
            MyPlayer = ObjectManager.Instance.Add <Player>();
            {
                MyPlayer.Info.Name            = $"Player_{MyPlayer.Info.ObjectId}";
                MyPlayer.Info.PosInfo.State   = CreatureState.Idle;
                MyPlayer.Info.PosInfo.MoveDir = MoveDir.Down;
                MyPlayer.Info.PosInfo.PosX    = 0;
                MyPlayer.Info.PosInfo.PosY    = 0;

                StatInfo stat = null;
                DataManager.StatDict.TryGetValue(1, out stat);
                MyPlayer.Stat.MergeFrom(stat);

                MyPlayer.Session = this;
            }

            //TODO : 입장 요청 들어오면 실행

            GameRoom room = RoomManager.Instance.Find(1);

            room.Push(room.EnterGame, MyPlayer);
        }
        static void Main(string[] args)
        {
            Console.WriteLine("----- Server -----");

            string      host     = Dns.GetHostName();
            IPHostEntry ipHost   = Dns.GetHostEntry(host);
            IPAddress   ipAdr    = ipHost.AddressList[0];
            IPEndPoint  endPoint = new IPEndPoint(ipAdr, 7777);

            _listener.Init(endPoint, SessionManager.Instance.Generate);

            // * 수정된 부분
            // 스레드가 0.25초 쉬는 것이 아니라, Tick을 체크해서 일정 시간이 지났으면 패킷을 보낼수도 있다.
            // 여러 작업이 있다면 체크할 Tick 변수를 추가하면 된다. 코드가 길어지지만 직관적이라는 장점이 있다.
            // 단점은 보내는 주기가 아무리 길어도 매 반복주기마다 Tick을 계산하고 비교하는 작업이 일어난다는 것.

            int roomTick = 0;

            // int ~~Tick = 0;
            // ...
            // ...
            while (true)
            {
                int now = System.Environment.TickCount;
                if (roomTick < now)
                {
                    Room.Push(Room.Flush);
                    roomTick = now + 250;
                }

                // if(~~Tick < now) ...
                // ...
            }
        }
        public override void OnConnected(EndPoint endPoint)
        {
            Console.WriteLine($"OnConnected : {endPoint}");


            MyPlayer = ObjectManager.Instance.Add <Player>();
            {
                MyPlayer.Info.Name            = $"Player_{MyPlayer.Info.ObjectId}";
                MyPlayer.Info.PosInfo.State   = CreatureState.Idle;
                MyPlayer.Info.PosInfo.Movedir = MoveDir.Down;
                MyPlayer.Info.PosInfo.PosX    = 0;
                MyPlayer.Info.PosInfo.PosY    = 0;


                StatInfo stat = null;
                DataManager.StatDict.TryGetValue(1, out stat);
                MyPlayer.Stat.MergeFrom(stat);


                MyPlayer.Session = this;
            }

            GameRoom room = RoomManager.Instance.Find(1);

            room.Push(room.EnterGame, MyPlayer);

            //S_Chat chat2 = new S_Chat();
            //chat2.MergeFrom(sendBuffer, 4, sendBuffer.Length - 4);
            //////////////////////////
            //////////////////////////
            //Program.Room.Push(() => Program.Room.Enter(this));
        }
        public override void OnConnected(EndPoint endPoint)
        {
            Console.WriteLine($"OnConnected : {endPoint}");

            // 클라이언트가 서버에 접속성공
            // DB를 긁어 플레이어 정보를 가져와서 클라에 보내주고..
            MyPlayer = ObjectManager.Instance.Add <Player>();            // 플레이어 생성
            {
                MyPlayer.Info.Name            = $"Player_{MyPlayer.Info.ObjectId}";
                MyPlayer.Info.PosInfo.State   = CreatureState.Idle;
                MyPlayer.Info.PosInfo.MoveDir = MoveDir.Down;                 // 처음에 쳐다보고 있는 방향
                // 초기값이 0인 경우에는 디버깅할때 값 자체가 안떠서 버그처럼 보이는데 버그는 아님.
                MyPlayer.Info.PosInfo.PosX = 0;
                MyPlayer.Info.PosInfo.PosY = 0;

                StatInfo stat = null;
                DataManager.StatDict.TryGetValue(1, out stat);
                MyPlayer.Stat.MergeFrom(stat);                 // stat에 있는 정보를 MyPlayer.Stat에 하나하나 대입

                MyPlayer.Session = this;
            }

            // 지금 방이 1번방밖에 없다
            GameRoom room = RoomManager.Instance.Find(1);

            room.Push(room.EnterGame, MyPlayer);
        }
 static void FlushRoom()
 {
     Room.Push(() =>
     {
         Room.Flush();
     });
     JobTimer.Instance.Push(FlushRoom, 250);
 }
        public override void OnDisconnected(EndPoint endPoint)
        {
            SessionManager.Instance.Remove(this);

            GameRoom room = RoomManager.Instance.Find(1);

            room.Push(room.LeaveGame, MyPlayer.Info.ObjectId);

            Console.WriteLine($"OnDisconnected : {endPoint}");
        }
Пример #8
0
 public override void OnDisConnected(EndPoint endPoint)
 {
     SessionManager.Instance.Remove(this);
     if (Room != null)
     {
         GameRoom room = Room; // 이렇게 함으로 인해 잡큐에 작업자가 Room이 null이 되도 room에 있는 정보로 보기때문에 문제 되지않음.
         room.Push(() => room.Leave(this));
         Room = null;
     }
     Console.WriteLine($"OnDisConnected : {endPoint}");
 }
Пример #9
0
 public override void OnDisconnected(EndPoint endPoint)
 {
     SessionManager.Instance.Remove(this);
     if (Room != null)
     {
         GameRoom room = Room;
         room.Push(() => room.Leave(this));
         Room = null;
     }
     Console.WriteLine($"OnDisconnected : {endPoint}");
 }
Пример #10
0
        public override void OnDisconnected(EndPoint endPoint)
        {
            GameLogic.Instance.Push(() =>
            {
                if (MyPlayer != null)
                {
                    return;
                }

                GameRoom room = GameLogic.Instance.Find(1);
                room.Push(room.LeaveGame, MyPlayer.Info.ObjectId);
            });

            SessionManager.Instance.Remove(this);
        }
Пример #11
0
        static void Main(string[] args)
        {
            //DNS(Domain Name System)
            string      host      = Dns.GetHostName();               // dns를 받아옴
            IPHostEntry hostEntry = Dns.GetHostEntry(host);          // dns를 통해 ip를 받아옴
            IPAddress   iPAddress = hostEntry.AddressList[0];        // ip리스트 중 첫번째 아이피를 받아옴
            IPEndPoint  endPoint  = new IPEndPoint(iPAddress, 7777); // 최종적으로 아이피와 포트번호를 저장

            listener.Init(endPoint, () => { return(SessionManager.Instance.Create()); });
            Console.WriteLine("Waiting...");
            while (true)
            {
                Room.Push(() => Room.Flush());
                Thread.Sleep(250);
            }
        }
Пример #12
0
        public override void OnDisconnected(EndPoint endPoint)
        {
            SessionManager.Instance.Remove(this);
            if (Room != null)
            {
                // * 수정된 부분
                // 이제 Leave를 바로 실행하지 않고, 해야 할 작업으로 JobQueue에 넘겨준다.
                // GameRoom을 별고로 선언, Room을 저장해둬서 클라이언트가 종료되어도 참조 카운트가 유지되게 한다.
                // (그렇지 않으면 클라 종료 후 Room이 null이 되어 JobQueue에서 작업을 처리하려 할 때 크래시가 난다)
                GameRoom room = Room;
                room.Push(() => room.Leave(this));
                Room = null;
            }

            Console.WriteLine($"{endPoint}의 접속이 종료되었습니다.");
        }
Пример #13
0
        public override void OnDisconnected(EndPoint endPoint)
        {
            // TEMP 1번룸만 존재
            //RoomManager.Instance.Find(1).LeaveGame(MyPlayer.Info.ObjectId);
            GameLogic.Instance.Push(() =>
            {
                if (MyPlayer == null)
                {
                    return;
                }

                GameRoom room = GameLogic.Instance.Find(1);
                room.Push(room.LeaveGame, MyPlayer.Info.ObjectId);
            });
            SessionManager.Instance.Remove(this);

            //Console.WriteLine($"OnDisconnected : {endPoint}");
        }
Пример #14
0
        static void Main(string[] args)
        {
            Console.WriteLine("----- Server -----");

            string      host     = Dns.GetHostName();
            IPHostEntry ipHost   = Dns.GetHostEntry(host);
            IPAddress   ipAdr    = ipHost.AddressList[0];
            IPEndPoint  endPoint = new IPEndPoint(ipAdr, 7777);

            _listener.Init(endPoint, SessionManager.Instance.Generate);

            while (true)
            {
                // + 추가된 부분
                // 0.25초에 한 번씩 쌓인 패킷들을 전송하게 한다.
                // 이 동작 또한 JobQueue를 통해 실행한다.
                Room.Push(Room.Flush);
                Thread.Sleep(250);
            }
        }