public async Task ClientLoadCompleteHandler(ClientLoadCompletePacket packet, IRakConnection connection) { Logger.Information($"{connection.EndPoint}'s client load completed..."); var session = UchuServer.SessionCache.GetSession(connection.EndPoint); await using var ctx = new UchuContext(); var character = await ctx.Characters .Include(c => c.Flags) .Include(c => c.Items) .Include(c => c.User) .Include(c => c.Missions) .ThenInclude(m => m.Tasks) .ThenInclude(m => m.Values) .SingleAsync(c => c.Id == session.CharacterId); var zoneId = (ZoneId)character.LastZone; if (zoneId == 0) { zoneId = 1000; character.LastZone = zoneId; await ctx.SaveChangesAsync(); } Logger.Information("[55%] Setting session zone."); UchuServer.SessionCache.SetZone(connection.EndPoint, zoneId); // Zone should already be initialized at this point. Logger.Information("[55%] Getting zone from worldserver."); var zone = await((WorldUchuServer)UchuServer).GetZoneAsync(zoneId); // Send the character init XML data for this world to the client Logger.Information("[55%] Sending XML client info."); await SendCharacterXmlDataToClient(character, connection, session); Logger.Information("[55%] Constructing player."); var player = await Player.ConstructAsync(character, connection, zone); Logger.Information("[55%] Checking rocket landing conditions."); if (character.LandingByRocket) { Logger.Information("[55%] Player landed by rocket, saving changes."); character.LandingByRocket = false; await ctx.SaveChangesAsync(); } Logger.Information("[55%] Player is ready to join world."); player.Message(new PlayerReadyMessage { Associate = player }); Logger.Information("[55%] Server is done loading object."); player.Message(new DoneLoadingObjectsMessage { Associate = player }); }
public async Task HandleClientLoaded(ClientLoadCompletePacket packet, Connection connection) { await using var ctx = new NovaContext(); var account = await ctx.Accounts .Include(a => a.Characters) .FirstOrDefaultAsync(a => a.Username == connection.Username); if (account == default) { connection.Send(new DisconnectNotifyPacket { ErrorCode = 1 }); return; } var character = account.Characters.FirstOrDefault(c => c.ObjectId == account.SelectedCharacter); if (character == default) { connection.Send(new DisconnectNotifyPacket { ErrorCode = 1 }); return; } SendCharacterData(connection, character); connection.Send(new CharacterEndMarkerPacket { ServerOnline = true }); }
public async Task ClientLoadCompleteHandler(ClientLoadCompletePacket packet, IRakConnection connection) { Logger.Information($"{connection.EndPoint}'s client load completed..."); var session = Server.SessionCache.GetSession(connection.EndPoint); await using var ctx = new UchuContext(); var character = await ctx.Characters .Include(c => c.Items) .Include(c => c.User) .Include(c => c.Missions) .ThenInclude(m => m.Tasks).ThenInclude(m => m.Values) .SingleAsync(c => c.CharacterId == session.CharacterId); var zoneId = (ZoneId)character.LastZone; if (zoneId == ZoneId.VentureExplorerCinematic) { zoneId = ZoneId.VentureExplorer; character.LastZone = (int)zoneId; await ctx.SaveChangesAsync(); } Server.SessionCache.SetZone(connection.EndPoint, zoneId); // Zone should already be initialized at this point. var zone = await((WorldServer)Server).GetZoneAsync(zoneId); // Send the character init XML data for this world to the client await SendCharacterXmlDataToClient(character, connection, session); var player = await Player.ConstructAsync(character, connection, zone); if (character.LandingByRocket) { character.LandingByRocket = false; await ctx.SaveChangesAsync(); } player.Message(new PlayerReadyMessage { Associate = player }); player.Message(new DoneLoadingObjectsMessage { Associate = player }); var relations = ctx.Friends.Where(f => f.FriendTwoId == character.CharacterId ).ToArray(); foreach (var friend in relations.Where(f => !f.RequestHasBeenSent)) { connection.Send(new NotifyFriendRequestPacket { FriendName = (await ctx.Characters.SingleAsync(c => c.CharacterId == friend.FriendTwoId)).Name, IsBestFriendRequest = friend.RequestingBestFriend }); } }
public async Task ClientLoadCompleteHandler(ClientLoadCompletePacket packet, IRakConnection connection) { Logger.Information($"{connection.EndPoint}'s client load completed..."); var session = UchuServer.SessionCache.GetSession(connection.EndPoint); // This info is required for the detailed user info packet, although this information is available in the // player as well we can't instantiate the player first as that sends certain GMs that crash the client's // world loading if no prior XML info is sent await using var uchuContext = new UchuContext(); var character = await uchuContext.Characters .Include(c => c.Flags) .Include(c => c.Items) .Include(c => c.User) .Include(c => c.Missions) .ThenInclude(m => m.Tasks) .ThenInclude(m => m.Values) .AsSplitQuery() .SingleAsync(c => c.Id == session.CharacterId); // Zone Id might be 0 on first load, set it to venture explorer var zoneId = (ZoneId)character.LastZone; if (zoneId == 0) { zoneId = 1000; character.LastZone = zoneId; await uchuContext.SaveChangesAsync(); } Logger.Information("[55%] Setting session zone."); UchuServer.SessionCache.SetZone(connection.EndPoint, zoneId); // Zone should already be initialized at this point. Logger.Information("[55%] Getting zone from worldserver."); var zone = await((WorldUchuServer)UchuServer).GetZoneAsync((ZoneId)session.ZoneId); // Send the character init XML data for this world to the client Logger.Information("[55%] Sending XML client info."); await SendCharacterXmlDataToClient(connection, character); Logger.Information("[55%] Constructing player."); var player = await Player.Instantiate(connection, zone, (ObjectId)session.CharacterId); Logger.Information("[55%] Checking rocket landing conditions."); var characterComponent = player.GetComponent <CharacterComponent>(); if (characterComponent.LandingByRocket) { characterComponent.LandingByRocket = false; } Logger.Information("[55%] Player is ready to join world."); player.Message(new PlayerReadyMessage { Associate = player }); player.Message(new PlayerReadyMessage { Associate = player.Zone.ZoneControlObject }); Logger.Information("[55%] Server is done loading object."); player.Message(new DoneLoadingObjectsMessage { Associate = player }); }