Пример #1
0
        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}");
        }
Пример #2
0
        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
                });
            }
        }