예제 #1
0
        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);
                    }
                }
            }
        }
예제 #2
0
    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);
                    }
                }
            }
        }
예제 #4
0
        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);
        }
예제 #5
0
        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);
        }
예제 #6
0
        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);
            }
        }
예제 #7
0
 public static void S_DespawnHandler(PacketSession session, IMessage packet)// ㅂㅇ
 {
     S_Despawn despawnPacket = packet as S_Despawn;
 }