// 게임입장 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}"); }
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}"); }
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}"); }
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); }
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); } }
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}의 접속이 종료되었습니다."); }
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}"); }
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); } }