public Game(ClientObject client, IMediusRequest createGame, Channel chatChannel, DMEObject dmeServer) { if (createGame is MediusCreateGameRequest r) { FromCreateGameRequest(r); } else if (createGame is MediusCreateGameRequest1 r1) { FromCreateGameRequest1(r1); } Id = IdCounter++; WorldStatus = MediusWorldStatus.WorldPendingCreation; utcTimeCreated = DateTime.UtcNow; utcTimeEmpty = null; DMEServer = dmeServer; ChatChannel = chatChannel; ChatChannel?.RegisterGame(this); Host = client; Logger.Info($"Game {Id}:{GameName}: Created by {client}"); }
public void CreateGame(ClientObject client, IMediusRequest request) { string gameName = null; if (request is MediusCreateGameRequest r) { gameName = r.GameName; } else if (request is MediusCreateGameRequest1 r1) { gameName = r1.GameName; } // Ensure the name is unique // If the host leaves then we unreserve the name if (_gameIdToGame.Select(x => x.Value).Any(x => x.WorldStatus != MediusWorldStatus.WorldClosed && x.WorldStatus != MediusWorldStatus.WorldInactive && x.GameName == gameName && x.Host != null && x.Host.IsConnected)) { client.Queue(new RT_MSG_SERVER_APP() { Message = new MediusCreateGameResponse() { MessageID = request.MessageID, MediusWorldID = -1, StatusCode = MediusCallbackStatus.MediusGameNameExists } }); return; } // Try to get next free dme server // If none exist, return error to clist var dme = Program.ProxyServer.GetFreeDme(); if (dme == null) { client.Queue(new MediusCreateGameResponse() { MessageID = request.MessageID, MediusWorldID = -1, StatusCode = MediusCallbackStatus.MediusExceedsMaxWorlds }); return; } // Create and add try { var game = new Game(client, request, client.CurrentChannel, dme); AddGame(game); // Send create game request to dme server dme.Queue(new MediusServerCreateGameWithAttributesRequest() { MessageID = new MessageId($"{game.Id}-{client.AccountId}-{request.MessageID}"), MediusWorldUID = (uint)game.Id, Attributes = game.Attributes, ApplicationID = client.ApplicationId, MaxClients = game.MaxPlayers }); } catch (Exception e) { // Logger.Error(e); // Failure adding game for some reason client.Queue(new MediusCreateGameResponse() { MessageID = request.MessageID, MediusWorldID = -1, StatusCode = MediusCallbackStatus.MediusFail }); } }