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); }
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; } }
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; } }
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; } }
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()); } }
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()); } }
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)); }
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()); } } }
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()); }
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)); }
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); } } }
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); } }
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); }); }
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); }
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); // 이동패킷 처리를 안전하게 }
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); // 들어와있는 모든 유저에게 알림 }