Esempio n. 1
0
        private static async Task AnswerRequest(WorldServerRequest request, ushort instanceId)
        {
            await using var ctx = new NovaContext();

            var req = await ctx.WorldServerRequests.FirstAsync(r => r.Id == request.Id);

            req.SpecificationId = await StartWorld(request.ZoneId, default, instanceId);
Esempio n. 2
0
        private static async Task HandleRequest(WorldServerRequest request)
        {
            await using var ctx = new NovaContext();

            if (request.State == WorldServerRequestState.Unanswered)
            {
                //
                // Search for available server
                //

                foreach (var worldServer in WorldServers.Where(w => w.ZoneId == request.ZoneId))
                {
                    var specification = await ctx.Specifications.FirstAsync(s => s.Id == worldServer.Id);

                    if (specification.ActiveUserCount >= specification.MaxUserCount)
                    {
                        continue;
                    }

                    var req = await ctx.WorldServerRequests.FirstAsync(r => r.Id == request.Id);

                    req.SpecificationId = specification.Id;

                    req.State = WorldServerRequestState.Complete;

                    await ctx.SaveChangesAsync();

                    return;
                }

                //
                // Start new server
                //

                ushort instanceId = 0;

                for (var i = 0; i < ushort.MaxValue; i++)
                {
                    if (WorldServers.Any(w => w.InstanceId == instanceId))
                    {
                        instanceId++;

                        continue;
                    }

                    await AnswerRequest(request, instanceId);

                    break;
                }
            }
        }