示例#1
0
        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
            });
        }
示例#3
0
        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
                });
            }
        }
示例#4
0
        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
            });
        }