Exemple #1
0
    public void SendClientUpdate(ClientToServerMessage msg)
    {
        byte err;
        var  stream = new MemoryStream();

        formatter.Serialize(stream, msg);
        NetworkTransport.Send(host, serverConnection, channel, stream.GetBuffer(), (int)stream.Length, out err);
    }
        public void ServerInputQueueShouldReceiveClientMessage()
        {
            var newMessage = new ClientToServerMessage
            {
                ClientId    = 90,
                MessageType = ClientToServerMessageTypeEnum.NotSet
            };

            clientMessageConnection.SendMessage(newMessage);

            Thread.Sleep(150);
            incomingMessageQueueMock.AssertWasCalled(a => a.Enqueue(Arg <byte[]> .Is.Anything),
                                                     options => options.Repeat.Once());
        }
        public void ShouldUpdateData()
        {
            var original = new ClientToServerMessage();

            original.ClientId    = 99;
            original.MessageType = ClientToServerMessageTypeEnum.CancelLimitOrder;

            var newMessage = new ClientToServerMessage();

            newMessage.ClientId    = 50;
            newMessage.MessageType = ClientToServerMessageTypeEnum.RequestOpenLimitOrders;

            original.Update(newMessage);

            Assert.AreEqual(original.ClientId, newMessage.ClientId);
            Assert.AreEqual(original.MessageType, newMessage.MessageType);
        }
        public void SendMessage(ClientToServerMessage message)
        {
            if (message == null)
            {
                return;
            }

            if (ctx == null || pushSocket == null)
            {
                return;
            }

            try
            {
                pushSocket.Send(serializer.Serialize(message));
            }
            catch (Exception ex)
            {
                logger.Error(ex, "Exception while sending message to server.");
            }
        }
Exemple #5
0
    void HandleMessageServer(int connection, ClientToServerMessage msg)
    {
        Tank tank = clientTanks [connection];

        tank.cannon.transform.up = msg.cannonDirection;

        if (msg.turned)
        {
            tank.TurnToward(msg.turnDirection);
        }
        if (msg.movedBackward)
        {
            tank.MoveBackward();
        }
        if (msg.movedForward)
        {
            tank.MoveForward();
        }
        if (msg.fired)
        {
            tank.cannon.Fire();
        }
    }
Exemple #6
0
        public void SendMessage(ClientToServerMessage message)
        {
            if (message == null)
            {
                return;
            }

            if (pushSocket == null)
            {
                return;
            }

            try
            {
                var data = serializer.Serialize(message);
                var msg  = new Msg();
                msg.InitGC(data, 0, data.Length);
                pushSocket.Send(ref msg, false);
            }
            catch (Exception ex)
            {
                logger.Error(ex, "Exception while sending message to server.");
            }
        }
 void OnJoinGameRequest(ClientToServerMessage message)
 {
     JoinGameRequest request = message.JoinGameRequest;
     if (request == null)
         throw new ServerClientException("Invalid join game request");
     // Defaults to false so lazy/afk players lose the first turn privilege
     _RequestedFirstTurn = false;
     InitialiseArmy(request.Army);
     Faction faction = Server.GetFaction(request.Army.FactionId);
     bool success = Server.OnJoinGameRequest(this, request, out _Game);
     if (success)
     {
         _PlayerState = new PanzerKontrol.PlayerState(Game, faction, PlayerIdentifier.Player2);
         InGameState(PlayerStateType.DeployingUnits, ClientToServerMessageType.InitialDeployment);
     }
     else
     {
         ServerToClientMessage reply = new ServerToClientMessage(ServerToClientMessageType.NoSuchGame);
         QueueMessage(reply);
     }
     Game.OnOpponentFound(this);
 }
 void OnInitialDeployment(ClientToServerMessage message)
 {
     Map map = Game.Map;
     InitialDeploymentRequest deployment = message.InitialDeploymentSubmission;
     if (deployment == null)
         throw new ServerClientException("Invalid initial deployment");
     // Reset the deployment state/position of all units to enable players to re-submit their initial deployment
     PlayerState.ResetUnitDeploymentState();
     foreach (var unitPosition in deployment.Units)
     {
         Unit unit = PlayerState.GetUnit(unitPosition.UnitId);
         if (unit == null)
             throw new ServerClientException("Encountered an invalid unit ID in the initial deployment");
         PlayerState.InitialUnitDeployment(unit, unitPosition.Position);
     }
     _RequestedFirstTurn = deployment.RequestedFirstTurn;
     PlayerState.State = PlayerStateType.HasDeployedUnits;
     if (Opponent.HasDeployed())
     {
         // The opponent has already submitted their deployment
         // Both players are ready, start the game
         Game.StartGame();
     }
 }
 void OnError(ClientToServerMessage message)
 {
     ShuttingDown = true;
     WriteLine("A client experienced an error: {0}", message.ErrorMessage.Message);
 }
 void OnEntrenchUnit(ClientToServerMessage message)
 {
     UnitEntrenched entrenchUnit = message.EntrenchUnit;
     if (entrenchUnit == null)
         throw new ServerClientException("Invalid entrench unit request");
     Unit unit = PlayerState.GetUnit(entrenchUnit.UnitId);
     if (unit == null)
         throw new ServerClientException("Encountered an invalid unit ID in a move request");
     PlayerState.EntrenchUnit(unit);
     ServerToClientMessage broadcast = new ServerToClientMessage(entrenchUnit);
     BroadcastMessage(broadcast);
 }
 void OnEndTurn(ClientToServerMessage message)
 {
     Game.NewTurn();
 }
Exemple #12
0
    void FixedUpdate()
    {
        var updateMsg = new ClientToServerMessage();

        // TODO: -------------------------
        // Set fields in updateMsg corresponding to user input

        var direction = Vector3.zero;

        if (Input.GetKey(KeyCode.W))
        {
            direction += Vector3.up;
        }
        if (Input.GetKey(KeyCode.A))
        {
            direction -= Vector3.right;
        }
        if (Input.GetKey(KeyCode.S))
        {
            direction -= Vector3.up;
        }
        if (Input.GetKey(KeyCode.D))
        {
            direction += Vector3.right;
        }

        direction.Normalize();

        var moveForward = Vector3.Dot(direction, transform.up) > 0;

        if (direction.magnitude > Mathf.Epsilon)
        {
            tank.TurnToward(direction);

            if (moveForward)
            {
                tank.MoveForward();
            }
            else
            {
                tank.MoveBackward();
            }
        }

        var mousePos = camera.ScreenToWorldPoint(Input.mousePosition);

        mousePos.z = 0;

        tank.cannon.AimToward((mousePos - transform.position).normalized);

        if (Input.GetMouseButtonDown(0))
        {
            tank.cannon.Fire();
        }

        var newCameraPos = transform.position;

        newCameraPos.z            = camera.transform.position.z;
        camera.transform.position = newCameraPos;

        // -------------------------------

        manager.SendClientUpdate(updateMsg);
    }
 void OnViewPublicGamesRequest(ClientToServerMessage message)
 {
     ViewPublicGamesReply reply = Server.OnViewPublicGamesRequest();
     QueueMessage(new ServerToClientMessage(reply));
 }
 void OnSurrender(ClientToServerMessage message)
 {
     Server.OnGameEnd(Game, GameOutcomeType.Surrender, Opponent);
 }
 void OnPurchaseUnit(ClientToServerMessage message)
 {
     PurchaseUnitRequest request = message.PurchaseUnitRequest;
     if (request == null)
         throw new ServerClientException("Invalid purchase request");
     if (request.Unit.FactionId != PlayerState.Faction.Id)
         throw new ServerClientException("Tried to purchase a unit from another faction");
     Unit unit = new Unit(PlayerState, Game.GetUnitId(), request.Unit, Server);
     PlayerState.PurchaseUnit(unit);
     // Update the unit ID prior to broadcasting the purchase information
     UnitConfiguration unitConfiguration = request.Unit;
     unitConfiguration.UnitId = unit.Id;
     UnitPurchasedBroadcast unitPurchased = new UnitPurchasedBroadcast(new ReinforcementState(PlayerState), request.Unit);
     ServerToClientMessage broadcast = new ServerToClientMessage(unitPurchased);
     BroadcastMessage(broadcast);
 }
 void OnLoginRequest(ClientToServerMessage message)
 {
     LoginRequest request = message.LoginRequest;
     if (request == null)
         throw new ServerClientException("Invalid login request");
     LoginReply reply = Server.OnLoginRequest(request);
     if (reply.Type == LoginReplyType.Success)
     {
         _Name = request.Name;
         LoggedInState();
     }
     QueueMessage(new ServerToClientMessage(reply));
 }
        public void OnNext(RingbufferByteArray data, long sequence, bool endOfBatch)
        {
            data.StartProcessTime = dateService.UtcNow();

            data.GetContent(ref queueBuffer);
            deserializedMessage = serializer.Deserialize <ClientToServerMessage>(queueBuffer, data.ContentLength);

            if (deserializedMessage == null)
            {
                return;
            }

            switch (deserializedMessage.MessageType)
            {
            case ClientToServerMessageTypeEnum.ModifyStopLimitOrder:
                if (deserializedMessage.ClientId <= 0)
                {
                    break;
                }

                var stopLimitOrderToModify = ordeRepository.TryGetStopLimitOrder(deserializedMessage.StopLimitOrder.ExchangeOrderId);
                if (stopLimitOrderToModify == null)
                {
                    return;
                }

                stopLimitOrderToModify.Modify(deserializedMessage.StopLimitOrder.TriggerPrice, deserializedMessage.StopLimitOrder.LimitPrice, deserializedMessage.StopLimitOrder.Quantity);
                outgoingQueue.EnqueueUpdatedStopLimitOrder(stopLimitOrderToModify);

                break;

            case ClientToServerMessageTypeEnum.RequestOpenStopLimitOrders:
                if (deserializedMessage.ClientId <= 0)
                {
                    break;
                }

                var orders = ordeRepository.GetClientStopLimitOrders(deserializedMessage.ClientId);
                if (orders.Count == 0)
                {
                    return;
                }

                outgoingQueue.EnqueueStopLimitOrderSnapshot(deserializedMessage.ClientId, orders);
                break;

            case ClientToServerMessageTypeEnum.CancelStopLimitOrder:
                var stopOrderToCancel = ordeRepository.TryGetStopLimitOrder(deserializedMessage.StopLimitOrder.ExchangeOrderId);

                if (stopOrderToCancel != null)
                {
                    stopOrderToCancel.Delete();
                    outgoingQueue.EnqueueDeletedStopLimitOrder(stopOrderToCancel);
                }
                break;

            case ClientToServerMessageTypeEnum.PlaceStopLimitOrder:
                if (!deserializedMessage.StopLimitOrder.ValidateForAdd())
                {
                    return;
                }

                var newStopLimitOrder = ordeRepository.NewStopLimitOrder(deserializedMessage.StopLimitOrder);
                dispatcher.HandleAddStopLimitOrder(newStopLimitOrder);
                break;


            case ClientToServerMessageTypeEnum.PlaceMarketOrder:
                if (!deserializedMessage.MarketOrder.ValidateForExecute())
                {
                    return;
                }

                var newMarketOrder = ordeRepository.NewMarketOrder(deserializedMessage.MarketOrder);
                dispatcher.HandleMarketOrder(newMarketOrder);
                break;

            case ClientToServerMessageTypeEnum.PlaceLimitOrder:
                if (!deserializedMessage.LimitOrder.ValidatesForAdd())
                {
                    outgoingQueue.EnqueueMessage(deserializedMessage.ClientId, "Error: Limit order was rejected.");
                    break;
                }

                var newLimitOrder = ordeRepository.NewLimitOrder(deserializedMessage.LimitOrder);
                newLimitOrder.RegisterDeleteNotificationHandler(outgoingQueue.EnqueueDeletedLimitOrder);
                newLimitOrder.RegisterModifyNotificationHandler(outgoingQueue.EnqueueUpdatedLimitOrder);
                newLimitOrder.RegisterFilledNotification(outgoingQueue.EnqueueDeletedLimitOrder);
                newLimitOrder.RegisterFilledNotification((order) => order.Delete());

                dispatcher.HandleAddLimitOrder(newLimitOrder);
                break;

            case ClientToServerMessageTypeEnum.CancelLimitOrder:
                if (!deserializedMessage.LimitOrder.ValidateForDelete())
                {
                    outgoingQueue.EnqueueMessage(deserializedMessage.ClientId, "Error: Cancellation of limit order was rejected.");
                    break;
                }

                var orderToDelete = ordeRepository.TryGetLimitOrder(deserializedMessage.LimitOrder.ExchangeOrderId);
                if (orderToDelete != null)
                {
                    orderToDelete.Delete();
                    outgoingQueue.EnqueueDeletedLimitOrder(orderToDelete);
                }
                break;

            case ClientToServerMessageTypeEnum.ModifyLimitOrder:
                if (!deserializedMessage.LimitOrder.ValidatesForModify())
                {
                    outgoingQueue.EnqueueMessage(deserializedMessage.ClientId, "Error: Modification of limit order was rejected.");
                    break;
                }

                var orderToModify = ordeRepository.TryGetLimitOrder(deserializedMessage.LimitOrder.ExchangeOrderId);
                if (orderToModify != null)
                {
                    orderToModify.Modify(deserializedMessage.LimitOrder.Quantity, deserializedMessage.LimitOrder.Price);
                }
                break;

            case ClientToServerMessageTypeEnum.RequestOpenLimitOrders:
                if (deserializedMessage.ClientId <= 0)
                {
                    break;
                }

                var orderList = ordeRepository.GetClientStopLimitOrders(deserializedMessage.ClientId);
                outgoingQueue.EnqueueStopLimitOrderSnapshot(deserializedMessage.ClientId, orderList);
                break;


            case ClientToServerMessageTypeEnum.DuoLimitOrderUpdate:
                var order1ToModify = ordeRepository.TryGetLimitOrder(deserializedMessage.DuoLimitOrder.LimitOrder1.ExchangeOrderId);
                var order2ToModify = ordeRepository.TryGetLimitOrder(deserializedMessage.DuoLimitOrder.LimitOrder2.ExchangeOrderId);

                if (order1ToModify == null || order2ToModify == null)
                {
                    return;
                }

                if (order1ToModify.Symbol != order2ToModify.Symbol)
                {
                    return;
                }

                dispatcher.HandDuoLimitOrderUpdate(
                    order1ToModify,
                    deserializedMessage.DuoLimitOrder.LimitOrder1.Price,
                    deserializedMessage.DuoLimitOrder.LimitOrder1.Quantity,
                    order2ToModify,
                    deserializedMessage.DuoLimitOrder.LimitOrder2.Price,
                    deserializedMessage.DuoLimitOrder.LimitOrder2.Quantity);

                break;
            }

            deserializedMessage.Reset();
        }
 public void Update(ClientToServerMessage otherMessage)
 {
     Message.Update(otherMessage);
 }
 public ClientToServerMessageQueueItem()
 {
     Message = new ClientToServerMessage();
 }
 void OnMoveUnit(ClientToServerMessage message)
 {
     MoveUnitRequest request = message.MoveUnitRequest;
     if (request == null)
         throw new ServerClientException("Invalid move unit request");
     Unit unit = PlayerState.GetUnit(request.UnitId);
     if (unit == null)
         throw new ServerClientException("Encountered an invalid unit ID in a move request");
     int movementPointsLeft;
     List<Hex> captures;
     PlayerState.MoveUnit(unit, request.NewPosition, out movementPointsLeft, out captures);
     UnitMoveBroadcast move = new UnitMoveBroadcast(unit.Id, movementPointsLeft);
     foreach (var hex in captures)
         move.Captures.Add(hex.Position);
     ServerToClientMessage broadcast = new ServerToClientMessage(move);
     BroadcastMessage(broadcast);
 }
 void OnAttackUnit(ClientToServerMessage message)
 {
     AttackUnitRequest request = message.AttackUnitRequest;
     if (request == null)
         throw new ServerClientException("Invalid attack unit request");
     Unit attacker = PlayerState.GetUnit(request.AttackerUnitId);
     if (attacker == null)
         throw new ServerClientException("Encountered an invalid attacking unit ID in an attack request");
     Unit defender = Opponent.PlayerState.GetUnit(request.DefenderUnitId);
     if (defender == null)
         throw new ServerClientException("Encountered an invalid target unit ID in an attack request");
     PlayerState.AttackUnit(attacker, defender);
     UnitCasualties attackerCasualties = new UnitCasualties(attacker.Id, attacker.Strength);
     UnitCasualties defenderCasualties = new UnitCasualties(defender.Id, defender.Strength);
     UnitCombatBroadcast casualties = new UnitCombatBroadcast(attackerCasualties, defenderCasualties);
     ServerToClientMessage broadcast = new ServerToClientMessage(casualties);
     BroadcastMessage(broadcast);
     AnnihilationCheck();
 }
 void OnReinforceUnit(ClientToServerMessage message)
 {
     ReinforceUnitRequest request = message.ReinforceUnitRequest;
     if (request == null)
         throw new ServerClientException("Invalid unit reinforcement request");
     Unit unit = PlayerState.GetUnit(request.UnitId);
     if (unit == null)
         throw new ServerClientException("Encountered an invalid unit ID in a reinforcement request");
     PlayerState.ReinforceUnit(unit);
     UnitReinforcementBroadcast unitReinforced = new UnitReinforcementBroadcast(new ReinforcementState(PlayerState), unit.Id, unit.Strength);
     ServerToClientMessage broadcast = new ServerToClientMessage(unitReinforced);
     BroadcastMessage(broadcast);
 }
 void OnCancelGameRequest(ClientToServerMessage message)
 {
     Server.OnCancelGameRequest(this);
     LoggedInState();
     ServerToClientMessage reply = new ServerToClientMessage(ServerToClientMessageType.CancelGameConfirmation);
     QueueMessage(reply);
 }
 void OnUpgradeUnit(ClientToServerMessage message)
 {
     UpgradeUnitRequest request = message.UpgradeUnitRequest;
     if (request == null)
         throw new ServerClientException("Invalid upgrade unit request");
     Unit unit = PlayerState.GetUnit(request.UnitId);
     if (unit == null)
         throw new ServerClientException("Encountered an invalid unit ID in an upgrade request");
     PlayerState.UpgradeUnit(unit, unit.GetUpgrade(request.UpgradeId));
     UnitUpgradedBroadcast unitUpgraded = new UnitUpgradedBroadcast(new ReinforcementState(PlayerState), unit.Id);
     ServerToClientMessage broadcast = new ServerToClientMessage(unitUpgraded);
     BroadcastMessage(broadcast);
 }
 void OnCreateGameRequest(ClientToServerMessage message)
 {
     CreateGameRequest request = message.CreateGameRequest;
     if (request == null)
         throw new ServerClientException("Invalid game creation request");
     // Defaults to false so lazy/afk players lose the first turn privilege
     _RequestedFirstTurn = false;
     InitialiseArmy(request.Army);
     Faction faction = Server.GetFaction(request.Army.FactionId);
     CreateGameReply reply = Server.OnCreateGameRequest(this, request, out _Game);
     QueueMessage(new ServerToClientMessage(reply));
     _PlayerState = new PanzerKontrol.PlayerState(Game, faction, PlayerIdentifier.Player1);
     WaitingForOpponentState();
 }
 void ProcessMessage(ClientToServerMessage message)
 {
     if (!IsExpectedMessageType(message.Type))
     {
         // Ignore unexpected messages
         // These are usually the result of network delay
         // However, they could also be the result of broken client implementations so log it anyways
         WriteLine("Encountered an unexpected message type: {0}", message.Type);
         return;
     }
     MessageHandler handler;
     if(!MessageHandlerMap.TryGetValue(message.Type, out handler))
         throw new Exception("Encountered an unknown server to client message type");
 }
 void OnDeployUnit(ClientToServerMessage message)
 {
     UnitDeployment deployment = message.UnitDeployment;
     if (deployment == null)
         throw new ServerClientException("Invalid unit deployment");
     Unit unit = PlayerState.GetUnit(deployment.Unit.UnitId);
     if (unit == null)
         throw new ServerClientException("Encountered an invalid unit ID in a deployment request");
     PlayerState.DeployUnit(unit, deployment.Unit.Position);
     ServerToClientMessage broadcast = new ServerToClientMessage(deployment);
     BroadcastMessage(broadcast);
 }