public void AddPlayer(GameSession sender, IFieldObject <Player> player) { Debug.Assert(player.ObjectId > 0, "Player was added to field without initialized objectId."); player.Coord = player.Value.Coord; player.Value.MapId = MapId; // TODO: Determine new coordinates for player as well lock (Sessions) { Sessions.Add(sender); } // TODO: Send the initialization state of the field foreach (IFieldObject <Player> existingPlayer in State.Players.Values) { sender.Send(FieldPacket.AddPlayer(existingPlayer)); sender.Send(FieldObjectPacket.LoadPlayer(existingPlayer)); } foreach (IFieldObject <Item> existingItem in State.Items.Values) { sender.Send(FieldPacket.AddItem(existingItem, 123456)); } foreach (IFieldObject <Npc> existingNpc in State.Npcs.Values) { sender.Send(FieldPacket.AddNpc(existingNpc)); sender.Send(FieldObjectPacket.LoadNpc(existingNpc)); } foreach (IFieldObject <Portal> existingPortal in State.Portals.Values) { sender.Send(FieldPacket.AddPortal(existingPortal)); } foreach (IFieldObject <Mob> existingMob in State.Mobs.Values) { sender.Send(FieldPacket.AddMob(existingMob)); sender.Send(FieldObjectPacket.LoadMob(existingMob)); } if (State.InteractObjects.Values.Count > 0) { ICollection <IFieldObject <InteractObject> > balloons = State.InteractObjects.Values.Where(x => x.Value.Type == InteractObjectType.AdBalloon).ToList(); if (balloons.Count > 0) { foreach (IFieldObject <InteractObject> balloon in balloons) { sender.Send(InteractObjectPacket.AddAdBallons(balloon)); } } ICollection <IFieldObject <InteractObject> > objects = State.InteractObjects.Values.Where(x => x.Value.Type != InteractObjectType.AdBalloon).ToList(); if (objects.Count > 0) { sender.Send(InteractObjectPacket.AddInteractObjects(objects)); } } if (State.Cubes.Values.Count > 0) { sender.Send(CubePacket.LoadCubes(State.Cubes.Values)); } foreach (IFieldObject <GuideObject> guide in State.Guide.Values) { sender.Send(GuideObjectPacket.Add(guide)); } foreach (IFieldObject <HealingSpot> healingSpot in State.HealingSpots.Values) { sender.Send(RegionSkillPacket.Send(healingSpot.ObjectId, healingSpot.Value.Coord, new SkillCast(70000018, 1, 0, 1))); } foreach (IFieldObject <Instrument> instrument in State.Instruments.Values) { if (instrument.Value.Improvise) { sender.Send(InstrumentPacket.StartImprovise(instrument)); } else { sender.Send(InstrumentPacket.PlayScore(instrument)); } } State.AddPlayer(player); if (MapLoopTask == null) { MapLoopTask = StartMapLoop(); //TODO: find a better place to initialise MapLoopTask } // Broadcast new player to all players in map Broadcast(session => { session.Send(FieldPacket.AddPlayer(player)); session.Send(FieldObjectPacket.LoadPlayer(player)); }); }
public void AddPlayer(GameSession sender, IFieldObject <Player> player) { Debug.Assert(player.ObjectId > 0, "Player was added to field without initialized objectId."); player.Coord = player.Value.Coord; player.Value.MapId = MapId; // TODO: Determine new coordinates for player as well lock (Sessions) { Sessions.Add(sender); } // TODO: Send the initialization state of the field foreach (IFieldObject <Player> existingPlayer in State.Players.Values) { sender.Send(FieldPacket.AddPlayer(existingPlayer)); sender.Send(FieldObjectPacket.LoadPlayer(existingPlayer)); } foreach (IFieldObject <Item> existingItem in State.Items.Values) { sender.Send(FieldPacket.AddItem(existingItem, 123456)); } foreach (IFieldObject <Npc> existingNpc in State.Npcs.Values) { sender.Send(FieldPacket.AddNpc(existingNpc)); sender.Send(FieldObjectPacket.LoadNpc(existingNpc)); } foreach (IFieldObject <Portal> existingPortal in State.Portals.Values) { sender.Send(FieldPacket.AddPortal(existingPortal)); } foreach (IFieldObject <Mob> existingMob in State.Mobs.Values) { sender.Send(FieldPacket.AddMob(existingMob)); sender.Send(FieldObjectPacket.LoadMob(existingMob)); } if (State.InteractActors.Values.Count > 0) { sender.Send(InteractActorPacket.AddInteractActors(State.InteractActors.Values)); } if (State.Cubes.Values.Count > 0) { sender.Send(CubePacket.LoadCubes(State.Cubes.Values)); } foreach (IFieldObject <GuideObject> guide in State.Guide.Values) { sender.Send(GuideObjectPacket.Add(guide)); } if (MapEntityStorage.HasHealingSpot(MapId)) { if (HealingSpotThread == null || HealingSpotThread.IsCompleted) { HealingSpotThread = StartHealingSpot(sender, player); } sender.Send(RegionSkillPacket.Send(player, MapEntityStorage.GetHealingSpot(MapId), new SkillCast(70000018, 1, 0, 1))); } State.AddPlayer(player); // Broadcast new player to all players in map Broadcast(session => { session.Send(FieldPacket.AddPlayer(player)); session.Send(FieldObjectPacket.LoadPlayer(player)); }); }