示例#1
0
        public BotController(GameController gameController, IClientEventReceiver clientEventReceiver)
        {
            _gameController = gameController;

            _clientEventReceiver = clientEventReceiver;
            //_serverEventSender = serverEventSender;
        }
示例#2
0
        public GameController(IClientEventReceiver clientEventReceiver, IServerEventSender serverEventSender, GameSettings settings)
        {
            var gameEventController = new GameEventController();

            SetupGameEventHandlers(gameEventController);
            SetupClientEventHandlers(clientEventReceiver);

            _eventSender = serverEventSender;
            _minPlayers  = settings.MinPlayers;

            _game          = new GameEngine(gameEventController, settings);
            _botController = new BotController(this, clientEventReceiver);

            _worldBroadcastThread = new Thread(delegate()
            {
                while (true)
                {
                    if (DateTime.UtcNow < _nextWorldUpdate)
                    {
                        continue;
                    }
                    Task.Run(() => BroadcastWorldUpdate());
                    _nextWorldUpdate = DateTime.UtcNow.AddMilliseconds(BroadcastWorldInterval);
                }
            });

            _broadcastCounterThread = new Thread(delegate()
            {
                while (true)
                {
                    Thread.Sleep(1000);
                    Console.WriteLine($"{WorldBroadcastsPerSecond} world broadcasts per second");
                    WorldBroadcastsPerSecond = 0;
                }
            });
            Start();
        }
示例#3
0
 public BotController(GameController gameController, IClientEventReceiver clientEventReceiver)
 {
     _gameController      = gameController;
     _clientEventReceiver = clientEventReceiver;
     _bots = new List <Bot>();
 }
示例#4
0
 /// <summary>
 /// Subscribes to the event.
 /// </summary>
 /// <param name="iClientEventReceiver">An instance of the IClientEventReceiver class that will receive server events.</param>
 public void Subscribe(IClientEventReceiver iClientEventReceiver)
 {
     _dispatcher.Add((MarshalByRefObject)iClientEventReceiver);
 }
示例#5
0
 public SignalHub(IClientEventReceiver clientEventReceiver)
 {
     _clientEventReceiver = clientEventReceiver;
 }
示例#6
0
        private void SetupClientEventHandlers(IClientEventReceiver clientEventReceiver)
        {
            clientEventReceiver.Event += (sender, args) =>
            {
                var player = _game.GetPlayer(args.PlayerId);
                switch (args.Event)
                {
                case ClientEvent.Hello:
                    var helloDto = new HelloDto
                    {
                        GameSettings = new GameSettingsDto
                        {
                            GameTickMs = _game.GetGameTickMs()
                        },
                        World = _game.GetWorldDto()
                    };

                    _eventSender.SendEvent(ServerEvent.Hello, helloDto, args.PlayerId);
                    break;

                case ClientEvent.ChatMessage:
                    var messageDto   = (ClientChatMessageDto)args.Dto;
                    var colour       = player.GetBike().GetColour();
                    var sourceColour = $"rgba({colour.R:X2},{colour.G:X2},{colour.B:X2},%A%)";
                    var dto          = new ChatMessageDto
                    {
                        IsSystemMessage = false,
                        Message         = messageDto.Message,
                        SourceColour    = sourceColour,
                        Source          = player.GetName(),
                        Timestamp       = DateTimeOffset.UtcNow.ToUnixTimeSeconds()
                    };
                    _eventSender.SendEvent(ServerEvent.ChatMessage, dto, null);
                    break;

                case ClientEvent.KeepAlive:
                    _eventSender.SendEvent(ServerEvent.KeepAliveAck, args.PlayerId);
                    break;

                case ClientEvent.RequestJoinGame:
                    RequestGameJoin(args.PlayerId, (ClientGameJoinDto)args.Dto);
                    break;

                case ClientEvent.RequestRespawn:
                    _game.RequestRespawn(player);
                    break;

                case ClientEvent.Update:
                    var updateDto = (ClientUpdateDto)args.Dto;
                    _game.HandleClientUpdate(updateDto);
                    break;

                case ClientEvent.UsePowerup:
                    if (player.GetCurrentPowerUpType() == PowerUpType.Nothing)
                    {
                        return;     // player doesn't have a powerup
                    }
                    _game.RequestUsePowerUp(player);
                    break;

                default:
                    throw new ArgumentOutOfRangeException();
                }
            };
        }