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);
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; } } }