public static void S_SpawnHandler(PacketSession session, IMessage packet) { S_Spawn spawnPacket = packet as S_Spawn; foreach (ObjectInfo obj in spawnPacket.Objects) { Managers.Object.Add(obj, myPlayer: false); } }
public static void S_SpawnHandler(PacketSession session, IMessage packet) { S_Spawn SpawnPacket = packet as S_Spawn; ServerSession serverSession = session as ServerSession; foreach (ObjectInfo player in SpawnPacket.Objects) { Managers.Object.Add(player, myPlayer: false); } }
public static void S_SpawnHandler(PacketSession session, IMessage packet)// ㅎㅇ { S_Spawn spawnPacket = packet as S_Spawn; foreach (ObjectInfo obj in spawnPacket.Objects) { //Debug.Log($"S_MoveHandler ::\n\t{obj.ObjectId} :: CellPos ({obj.PosInfo.PosX},{obj.PosInfo.PosY}) | Dir : {obj.PosInfo.MoveDir}"); Managers.Object.Add(obj, myPlayer: false); } }
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 EnterGame(GameObject gameObject, bool randomPos) { if (gameObject == null) { return; } if (randomPos) { Vector2Int respawnPos; while (true) { respawnPos.x = _rand.Next(Map.MinX, Map.MaxX + 1); respawnPos.y = _rand.Next(Map.MinY, Map.MaxY + 1); if (Map.Find(respawnPos) == null) { gameObject.CellPos = respawnPos; break; } } } GameObjectType type = ObjectManager.GetObjectTypeById(gameObject.Id); if (type == GameObjectType.Player) { Player player = gameObject as Player; _players.Add(gameObject.Id, player); player.Room = this; player.RefreshAdditionalStat(); Map.ApplyMove(player, new Vector2Int(player.CellPos.x, player.CellPos.y)); GetZone(player.CellPos).Players.Add(player); // 본인한테 정보 전송 { S_EnterGame enterPacket = new S_EnterGame(); enterPacket.Player = player.Info; player.Session.Send(enterPacket); player.Vision.Update(); } } else if (type == GameObjectType.Monster) { Monster monster = gameObject as Monster; _monster.Add(gameObject.Id, monster); monster.Room = this; GetZone(monster.CellPos).Monsters.Add(monster); Map.ApplyMove(monster, new Vector2Int(monster.CellPos.x, monster.CellPos.y)); monster.Update(); } else if (type == GameObjectType.Projectile) { Projectile projectile = gameObject as Projectile; _Projectiles.Add(gameObject.Id, projectile); projectile.Room = this; GetZone(projectile.CellPos).Projectiles.Add(projectile); projectile.Update(); } // 타인한테 정보 전송 { S_Spawn spawnPacket = new S_Spawn(); spawnPacket.Objects.Add(gameObject.Info); Broadcast(gameObject.CellPos, spawnPacket); } }
public void EnterGame(GameObject gameObject) { if (gameObject == null) { return; } GameObjectType type = ObjectManager.GetObjectTypeById(gameObject.Id); if (type == GameObjectType.Player) { Player player = gameObject as Player; _players.Add(gameObject.Id, player); player.Room = this; Map.ApplyMove(player, new Vector2Int(player.CellPos.x, player.CellPos.y)); // 본인한테 정보 전송 { S_EnterGame enterPacket = new S_EnterGame(); enterPacket.Player = player.Info; player.Session.Send(enterPacket); S_Spawn spawnPacket = new S_Spawn(); foreach (Player p in _players.Values) { if (player != p) { spawnPacket.Objects.Add(p.Info); } } foreach (Monster m in _monsters.Values) { spawnPacket.Objects.Add(m.Info); } foreach (Projectile p in _projectiles.Values) { spawnPacket.Objects.Add(p.Info); } player.Session.Send(spawnPacket); } } else if (type == GameObjectType.Monster) { Monster monster = gameObject as Monster; _monsters.Add(gameObject.Id, monster); monster.Room = this; Map.ApplyMove(monster, new Vector2Int(monster.CellPos.x, monster.CellPos.y)); } else if (type == GameObjectType.Projectile) { Projectile projectile = gameObject as Projectile; _projectiles.Add(gameObject.Id, projectile); projectile.Room = this; } // 타인한테 정보 전송 { S_Spawn spawnPacket = new S_Spawn(); spawnPacket.Objects.Add(gameObject.Info); foreach (Player p in _players.Values) { if (p.Id != gameObject.Id) { p.Session.Send(spawnPacket); } } } }
public static void S_SpawnHandler(PacketSession session, IMessage packet)// ㅎㅇ { S_Spawn spawnPacket = packet as S_Spawn; }
public void EnterGame(GameObject gameObject) { if (gameObject == null) { return; } GameObjectType type = ObjectManager.GetObjectTypeById(gameObject.Id); // 각 오브젝트 타입별 처리 if (type == GameObjectType.Player) { Player player = gameObject as Player; _players.Add(gameObject.Id, player); // 해당하는 아이디와 플레이어를 딕셔너리에 삽입 player.Room = this; // 이거 안하고 스폰 후 가만히 있으면, 화살같은거 안박히는 버그남 Map.ApplyMove(player, new Vector2Int(player.CellPos.x, player.CellPos.y)); // 맵에다가 나를 이동시켜달라 요청 // 본인에게 스폰됐다는 정보 전송 { S_EnterGame enterPacket = new S_EnterGame(); // 패킷 보낼때마다 new 해서 Player 만들어줘도 되지만 // 받는쪽에서는 Player 자체가 아니라 그 플레이어의 정보만 궁금함 enterPacket.Player = player.Info; player.Session.Send(enterPacket); // 나에게 내 정보 전송 // 입장한 플레이어에게 // 접속중인 다른 플레이어뿐만 아니라 몬스터나 투사체들의 정보도 던져줘야 한다. S_Spawn spawnPacket = new S_Spawn(); foreach (Player p in _players.Values) { // 내 정보는 위에서 보냈으니, 내가 아닌 플레이어들의 정보만 담는다 if (player != p) { spawnPacket.Objects.Add(p.Info); } } foreach (Monster m in _monsters.Values) { spawnPacket.Objects.Add(m.Info); } foreach (Projectile p in _projectiles.Values) { spawnPacket.Objects.Add(p.Info); } player.Session.Send(spawnPacket); // 나에게 현재 게임에 있는 타인의 정보를 알린다. } } else if (type == GameObjectType.Monster) { Monster monster = gameObject as Monster; _monsters.Add(gameObject.Id, monster); monster.Room = this; Map.ApplyMove(monster, new Vector2Int(monster.CellPos.x, monster.CellPos.y)); // 맵에다가 나를 이동시켜달라 요청 } else if (type == GameObjectType.Projectile) // 투사체 { Projectile projectile = gameObject as Projectile; _projectiles.Add(gameObject.Id, projectile); projectile.Room = this; } // 타인에게 새로운 오브젝트가 스폰됐음을 알림 { S_Spawn spawnPacket = new S_Spawn(); spawnPacket.Objects.Add(gameObject.Info); // 신규유저의 정보를 기존에 접속중인 모두에게 알림 foreach (Player p in _players.Values) { // 본인의 정보 (MyPlayer)는 S_EnterGame 패킷으로 받기로 했기 때문이기도 하다. if (p.Id != gameObject.Id) // 위에서 생성한게 나 자신이 아닐때만 알림 -> 나 자신일때는 이미 위에서 알렸음 { p.Session.Send(spawnPacket); } } } }
// 오브젝트 룸에서 생성해욧 public void EnterGame(GameObject gameObject, bool randomPos = true) { if (gameObject == null) { return; } GameObjectType type = ObjectManager.GetObjectTypeById(gameObject.Id); if (randomPos) { Random _rand = new Random(); Vector2Int respawnPos; while (true) { respawnPos.x = _rand.Next(Map.MinX, Map.MaxX + 1); respawnPos.y = _rand.Next(Map.MinY, Map.MaxY + 1); if (Map.Find(respawnPos) == null) { gameObject.CellPos = respawnPos; break; } } } // 오브젝트 타입이 Player일때 if (type == GameObjectType.Player) { // 플레이어 룸 스폰 Player player = gameObject as Player; // 플레이어가 룸안에 들어옴 _players.Add(gameObject.Id, player); player.Room = this; player.RefreshAdditionalStat(); Map.ApplyMove(player, new Vector2Int(player.CellPos.x, player.CellPos.y)); GetZone(player.CellPos).Players.Add(player); // 클라이언트에게 Room 에서 처리하고 있는 맵을 로드하라! { S_ChangeMap changeMapPacket = new S_ChangeMap(); changeMapPacket.MapId = this.Map.MapID; player.Session.Send(changeMapPacket); } // 본인한테 Room 에 있던 player정보 전송 { S_EnterGame enterPacket = new S_EnterGame(); enterPacket.Player = player.Info; player.Session.Send(enterPacket); player.Vision.Update(); } } // 오브젝트 타입이 Monster else if (type == GameObjectType.Monster) { // 몬스터 룸 스폰 Monster monster = gameObject as Monster; _monsters.Add(gameObject.Id, monster); monster.Room = this; GetZone(monster.CellPos).Monsters.Add(monster); Map.ApplyMove(monster, new Vector2Int(monster.CellPos.x, monster.CellPos.y)); // 업데이트 한번실행 monster.Update(); } // 오브젝트 타입이 Projectile else if (type == GameObjectType.Projectile) { // 투사체 룸 스폰 Projectile projectile = gameObject as Projectile; _projectiles.Add(gameObject.Id, projectile); projectile.Room = this; GetZone(projectile.CellPos).Projectiles.Add(projectile); // 업데이트 한번실행 projectile.Update(); } // 타인에게 정보 전송 { S_Spawn spawnPacket = new S_Spawn(); spawnPacket.Objects.Add(gameObject.Info); Broadcast(gameObject.CellPos, spawnPacket); } }