public void LeaveGame(int objectId) { GameObjectType type = ObjectManager.GetObjectTypeById(objectId); // objectId를 통해 타입 추출 // 각 오브젝트 타입별 처리 if (type == GameObjectType.Player) { Player player = null; if (_players.Remove(objectId, out player) == false) // 딕셔너리에서 지우고 { return; // 지울 플레이어가 없다. } // room이 null이면 ApplyLeave 처리가 안됨 Map.ApplyLeave(player); // 맵에다가도 내가 나갔음을 처리 player.Room = null; // player에 지정된 룸을 밀고 // 본인에게 정보 전송 { S_LeaveGame leavePacket = new S_LeaveGame(); player.Session.Send(leavePacket); } } else if (type == GameObjectType.Monster) { Monster monster = null; if (_monsters.Remove(objectId, out monster) == false) { return; } // Room이 null인지 체크하는것 때문에 순서 바꿈 -> 다른 작업자가 안햇갈릴수 있음? Map.ApplyLeave(monster); monster.Room = null; } else if (type == GameObjectType.Projectile) { Projectile projectile = null; if (_projectiles.Remove(objectId, out projectile) == false) { return; // 못 찾음 } // 찾음 projectile.Room = null; // 화살은 충돌대상이 아니라 맵에다가 알리지는 않았음 } // 타인에게 정보 전송 { // 누군가가 나갔다고 알려줄 패킷 생성 S_Despawn despawnPacket = new S_Despawn(); despawnPacket.ObjectIds.Add(objectId); foreach (Player p in _players.Values) { if (p.Id != objectId) // 자기자신 빼고 모두에게 알림 { p.Session.Send(despawnPacket); } } } }
public static void S_DespawnHandler(PacketSession session, IMessage packet) { S_Despawn despawnPacket = packet as S_Despawn; foreach (int id in despawnPacket.ObjectIds) { Managers.Object.Remove(id); } }
public void LeaveGame(int objectId) { GameObjectType type = ObjectManager.GetObjectTypeById(objectId); if (type == GameObjectType.Player) { Player player = null; if (_players.Remove(objectId, out player) == false) { return; } Map.ApplyLeave(player); player.Room = null; // 본인한테 정보 전송 { S_LeaveGame leavePacket = new S_LeaveGame(); player.Session.Send(leavePacket); } } else if (type == GameObjectType.Monster) { Monster monster = null; if (_monsters.Remove(objectId, out monster) == false) { return; } Map.ApplyLeave(monster); monster.Room = null; } else if (type == GameObjectType.Projectile) { Projectile projectile = null; if (_projectiles.Remove(objectId, out projectile) == false) { return; } projectile.Room = null; } // 타인한테 정보 전송 { S_Despawn despawnPacket = new S_Despawn(); despawnPacket.ObjectIds.Add(objectId); foreach (Player p in _players.Values) { if (p.Id != objectId) { p.Session.Send(despawnPacket); } } } }
public void Update() { if (Owner == null || Owner.Room == null) { return; } HashSet <GameObject> currentObjects = GatherObjects(); // 기존에 없었는데 새로 생김 // currentObjects - PreviousObjects // Spawn List <GameObject> added = currentObjects.Except(PreviousObjects).ToList(); // 새로 생긴 것 이 있다면 if (added.Count > 0) { // Spawn S_Spawn spawnPacket = new S_Spawn(); foreach (GameObject gameObject in added) { ObjectInfo info = new ObjectInfo(); info.MergeFrom(gameObject.Info); spawnPacket.Objects.Add(info); } Owner.Session.Send(spawnPacket); } // 기존에 있었는데 사라짐 // PreviousObjects - currentObjects // Despawn List <GameObject> removed = PreviousObjects.Except(currentObjects).ToList(); // 사라진 것 이 있다면 if (removed.Count > 0) { // Despawn S_Despawn despawnPacket = new S_Despawn(); foreach (GameObject gameObject in removed) { despawnPacket.ObjectIds.Add(gameObject.Id); } Owner.Session.Send(despawnPacket); } // 갱신 PreviousObjects = currentObjects; // 0.1초뒤에 다시 호출 _job = Owner.Room.PushAfter(100, Update); }
public void Update() { if (Owner == null || Owner.Room == null) { return; } HashSet <GameObject> currentObjects = GatherObjects(); // 기존엔 없었는데 새로 생긴 애들 Spawn 처리 List <GameObject> added = currentObjects.Except(PreviousObjects).ToList(); if (added.Count > 0) { S_Spawn spawnPacket = new S_Spawn(); foreach (GameObject gameObject in added) { ObjectInfo info = new ObjectInfo(); info.MergeFrom(gameObject.Info); spawnPacket.Objects.Add(info); } Owner.Session.Send(spawnPacket); } // 기존엔 있었는데 사라진 애들 Despawn 처리 List <GameObject> removed = PreviousObjects.Except(currentObjects).ToList(); if (removed.Count > 0) { S_Despawn despawnPacket = new S_Despawn(); foreach (GameObject gameObject in removed) { despawnPacket.ObjectIds.Add(gameObject.Id); } Owner.Session.Send(despawnPacket); } PreviousObjects = currentObjects; Owner.Room.PushAfter(100, Update); }
public void LeaveGame(int objectId) { GameObjectType type = ObjectManager.GetObjectTypeById(objectId); Vector2Int cellPos; if (type == GameObjectType.Player) { Player player = null; if (_players.Remove(objectId, out player) == false) { return; } cellPos = player.CellPos; player.OnLeaveGame(); Map.ApplyLeave(player); player.Room = null; // 본인한테 정보 전송 { S_LeaveGame leavePacket = new S_LeaveGame(); player.Session.Send(leavePacket); } } else if (type == GameObjectType.Monster) { Monster monster = null; if (_monster.Remove(objectId, out monster) == false) { return; } cellPos = monster.CellPos; Map.ApplyLeave(monster); monster.Room = null; } else if (type == GameObjectType.Projectile) { Projectile projectile = null; if (_Projectiles.Remove(objectId, out projectile) == false) { return; } cellPos = projectile.CellPos; Map.ApplyLeave(projectile); projectile.Room = null; } else { return; } // 타인한테 정보 전송 { S_Despawn despawnPacket = new S_Despawn(); despawnPacket.ObjectIds.Add(objectId); Broadcast(cellPos, despawnPacket); } }
public static void S_DespawnHandler(PacketSession session, IMessage packet)// ㅂㅇ { S_Despawn despawnPacket = packet as S_Despawn; }