예제 #1
0
    void ServerUpdate()
    {
        foreach (var client in clientTanks.Keys)
        {
            var msg = new ServerToClientMessage();

            msg.bullets = new Dictionary <int, BulletInfo> ();
            foreach (var bulletObj in GameObject.FindObjectsOfType <Bullet>())
            {
                if (bulletObj.owner.GetInstanceID() == clientTanks[client].GetInstanceID())
                {
                    continue;
                }
                msg.bullets[bulletObj.id] = new BulletInfo(bulletObj);
            }

            msg.enemyTanks = new Dictionary <int, TankInfo>();

            foreach (var otherClient in clientTanks.Keys)
            {
                if (otherClient == client)
                {
                    continue;
                }
                msg.enemyTanks [otherClient] = new TankInfo(clientTanks[otherClient]);
            }

            msg.playerTank = new TankInfo(clientTanks [client]);

            byte err;
            var  stream = new MemoryStream();
            formatter.Serialize(stream, msg);
            NetworkTransport.Send(host, client, channel, stream.GetBuffer(), (int)stream.Length, out err);
        }
    }
예제 #2
0
 public void OnNext(ServerToClientMessage data, long sequence, bool endOfBatch)
 {
     if (data.ReceiverClientId > 0)
     {
         Publish(data.ReceiverClientId, data);
     }
     else if (data.ReceiverClientId == 0)
     {
         Publish(data);
     }
 }
예제 #3
0
        public void SerializeDeserializeTest()
        {
            var serializer = new ProtobufSerializer();
            var byteArray  = new RingbufferByteArray();

            var item = new ServerToClientMessage();

            item.Message     = "hello";
            item.MessageType = ServerToClientMessageTypeEnum.LimitOrderAccepted;

            byteArray.Set(serializer.Serialize(item));
            byte[] target = new byte[512];

            byteArray.GetContent(ref target);
            var deserialized = serializer.Deserialize <ServerToClientMessage>(target.Take(byteArray.ContentLength).ToArray());

            Assert.IsNotNull(deserialized);
            Assert.AreEqual("hello", deserialized.Message);
            Assert.AreEqual(ServerToClientMessageTypeEnum.LimitOrderAccepted, deserialized.MessageType);
        }
예제 #4
0
        public void DeSerializationPerformanceTest()
        {
            var sw         = new Stopwatch();
            var serializer = new ProtobufSerializer();
            var instance   = new ServerToClientMessage();
            var serialized = serializer.Serialize(instance);

            sw.Start();
            for (int i = 0; i < 5000000; i++)
            {
                serializer.Deserialize <ServerToClientMessage>(serialized);
            }

            sw.Stop();
            var elapsed = sw.ElapsedMilliseconds;

            double perItem = (double)elapsed / (double)5000000;

            Console.WriteLine("Total ms: " + elapsed);
            Console.WriteLine("Per item: " + perItem);
        }
예제 #5
0
        public void ShouldSerializeAndDeserializeSeriesOfItems()
        {
            var serializer = new ProtobufSerializer();

            for (int i = 0; i < 1000; i++)
            {
                var item = new ServerToClientMessage();
                item.Message                    = i.ToString();
                item.MessageType                = ServerToClientMessageTypeEnum.LimitOrderAccepted;
                item.LimitOrder                 = new LimitOrderDto();
                item.LimitOrder.ClientId        = i;
                item.LimitOrder.ExchangeOrderId = (uint)i;

                var serialized = serializer.Serialize(item);

                var deserialized = serializer.Deserialize <ServerToClientMessage>(serialized);

                Assert.IsNotNull(deserialized);
                Assert.AreEqual(i.ToString(), deserialized.Message);
                Assert.AreEqual(ServerToClientMessageTypeEnum.LimitOrderAccepted, deserialized.MessageType);
                Assert.AreEqual(i, deserialized.LimitOrder.ClientId);
                Assert.AreEqual(i, deserialized.LimitOrder.ExchangeOrderId);
            }
        }
예제 #6
0
 void OnCancelGameRequest(ClientToServerMessage message)
 {
     Server.OnCancelGameRequest(this);
     LoggedInState();
     ServerToClientMessage reply = new ServerToClientMessage(ServerToClientMessageType.CancelGameConfirmation);
     QueueMessage(reply);
 }
예제 #7
0
 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();
 }
예제 #8
0
 void BroadcastMessage(ServerToClientMessage message)
 {
     QueueMessage(message);
     Opponent.QueueMessage(message);
 }
예제 #9
0
 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);
 }
예제 #10
0
 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);
 }
예제 #11
0
 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);
 }
예제 #12
0
        public void Publish(ServerToClientMessage serverToClientMessage)
        {
            var serialized = serializer.Serialize(serverToClientMessage);

            publishSocket.SendMoreFrame("a").SendFrame(serialized);
        }
예제 #13
0
        public void Publish(int clientId, ServerToClientMessage serverToClientMessage)
        {
            var serialized = serializer.Serialize(serverToClientMessage);

            publishSocket.SendMoreFrame(clientId.ToString()).SendFrame(serialized);
        }
예제 #14
0
 public OutgoingQueue(ILogger logger, IMessagePublisher publisher)
 {
     this.logger           = logger;
     this.publisher        = publisher;
     serverToClientMessage = new ServerToClientMessage();
 }
예제 #15
0
    void HandleMessageClient(ServerToClientMessage msg)
    {
        foreach (var bulletID in msg.bullets.Keys)
        {
            var bulletInfo = msg.bullets [bulletID];

            if (!bulletImposters.ContainsKey(bulletID))
            {
                // Create local copy of new bullet imposter
                bulletImposters [bulletID] = Instantiate(bulletImposterPrefab).GetComponent <Rigidbody2D>();
            }

            // Local bullet object
            Rigidbody2D imposter = bulletImposters [bulletID];

            // TODO: -------------------------
            // Update position and velocity of local bullet imposter



            // -------------------------------
        }

        // Destroy local bullet imposters which no longer exist on the server
        var bulletKeysList = new List <int> (bulletImposters.Keys);

        foreach (var bulletID in bulletKeysList)
        {
            if (!msg.bullets.ContainsKey(bulletID))
            {
                Destroy(bulletImposters[bulletID].gameObject);
                bulletImposters.Remove(bulletID);
            }
        }

        foreach (var tankID in msg.enemyTanks.Keys)
        {
            var tankInfo = msg.enemyTanks [tankID];

            if (!peerTanks.ContainsKey(tankID))
            {
                // Create local copy of new enemy tank
                peerTanks [tankID] = (Tank)Instantiate(playerTankPrefab);
            }

            // Local tank object
            Tank tank = peerTanks [tankID];

            // TODO: -------------------------
            // Update local enemy tank properties



            // -------------------------------
        }

        // Destroy local tanks which no longer exist on the server
        var tankKeysList = new List <int> (peerTanks.Keys);

        foreach (var tankID in tankKeysList)
        {
            if (!msg.enemyTanks.ContainsKey(tankID))
            {
                Destroy(peerTanks[tankID].gameObject);
                peerTanks.Remove(tankID);
            }
        }

        // TODO: -------------------------
        // Update player tank (player.tank) properties



        // -------------------------------
    }
예제 #16
0
 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);
 }
예제 #17
0
 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);
 }
예제 #18
0
 public void NewTurn(bool isMyTurn, List<Unit> attritionUnits)
 {
     var attritionCasualties = attritionUnits.Select((Unit x) => new UnitCasualties(x.Id, x.Strength, !x.CanPerformAction)).ToList();
     var identifier = isMyTurn ? Identifier : Opponent.Identifier;
     NewTurnBroadcast newTurn = new NewTurnBroadcast(identifier, attritionCasualties);
     ServerToClientMessage message = new ServerToClientMessage(newTurn);
     QueueMessage(message);
     if(isMyTurn)
         InGameState(PlayerStateType.MyTurn, ClientToServerMessageType.MoveUnit, ClientToServerMessageType.EntrenchUnit, ClientToServerMessageType.AttackUnit, ClientToServerMessageType.DeployUnit, ClientToServerMessageType.ReinforceUnit, ClientToServerMessageType.PurchaseUnit, ClientToServerMessageType.UpgradeUnit, ClientToServerMessageType.EndTurn);
     else
         InGameState(PlayerStateType.OpponentTurn);
 }
예제 #19
0
 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);
 }
예제 #20
0
 public void OnGameEnd(GameEndBroadcast broadcast)
 {
     LoggedInState();
     ServerToClientMessage message = new ServerToClientMessage(broadcast);
     QueueMessage(message);
 }
예제 #21
0
 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);
 }
예제 #22
0
 public void OnOpponentLeftGame()
 {
     LoggedInState();
     ServerToClientMessage reply = new ServerToClientMessage(ServerToClientMessageType.OpponentLeftGame);
     QueueMessage(reply);
 }
예제 #23
0
 void QueueMessage(ServerToClientMessage message)
 {
     lock (SendQueue)
     {
         SendQueue.Add(message);
         SendEvent.Set();
     }
 }
예제 #24
0
        private void HandleServerMessage(ServerToClientMessage message)
        {
            switch (message.MessageType)
            {
            case ServerToClientMessageTypeEnum.StopLimitOrderSnapshot:
                EventHandler <List <StopLimitOrderDto> > stopLimitOrderSnapshotHandler = StopLimitOrderSnapshot;
                if (stopLimitOrderSnapshotHandler != null)
                {
                    stopLimitOrderSnapshotHandler(this, message.StopLimitOrderList);
                }
                break;

            case ServerToClientMessageTypeEnum.StopLimitOrderAccepted:
                EventHandler <StopLimitOrderDto> stopLimitOrderAcceptedHandler = StopLimitOrderAccepted;
                if (stopLimitOrderAcceptedHandler != null)
                {
                    stopLimitOrderAcceptedHandler(this, message.StopLimitOrder);
                }
                break;

            case ServerToClientMessageTypeEnum.StopLimitOrderChanged:
                EventHandler <StopLimitOrderDto> stopLimitOrderChangedHandler = StopLimitOrderChanged;
                if (stopLimitOrderChangedHandler != null)
                {
                    stopLimitOrderChangedHandler(this, message.StopLimitOrder);
                }
                break;

            case ServerToClientMessageTypeEnum.StopLimitOrderDeleted:
                EventHandler <StopLimitOrderDto> stopLimitOrderDeletedHandler = StopLimitOrderDeleted;
                if (stopLimitOrderDeletedHandler != null)
                {
                    stopLimitOrderDeletedHandler(this, message.StopLimitOrder);
                }
                break;

            case ServerToClientMessageTypeEnum.LimitOrderAccepted:
                EventHandler <LimitOrderDto> acceptedHandler = LimitOrderAccepted;
                if (acceptedHandler != null)
                {
                    acceptedHandler(this, message.LimitOrder);
                }
                break;

            case ServerToClientMessageTypeEnum.LimitOrderDeleted:
                EventHandler <LimitOrderDto> deletedHandler = LimitOrderDeleted;
                if (deletedHandler != null)
                {
                    deletedHandler(this, message.LimitOrder);
                }
                break;

            case ServerToClientMessageTypeEnum.LimitOrderChanged:
                EventHandler <LimitOrderDto> changedHandler = LimitOrderChanged;
                if (changedHandler != null)
                {
                    changedHandler(this, message.LimitOrder);
                }
                break;

            case ServerToClientMessageTypeEnum.LimitOrderSnapshot:
                EventHandler <List <LimitOrderDto> > snapshotHandler = LimitOrderSnapshot;
                if (snapshotHandler != null)
                {
                    snapshotHandler(this, message.LimitOrderList);
                }
                break;

            case ServerToClientMessageTypeEnum.Execution:
                EventHandler <ExecutionDto> executionHandler = NewExecution;
                if (executionHandler != null)
                {
                    executionHandler(this, message.Execution);
                }
                break;

            case ServerToClientMessageTypeEnum.Level1:
                EventHandler <MarketBestBidAskDto> level1Handler = Level1Updated;
                if (level1Handler != null)
                {
                    level1Handler(this, message.Level1);
                }
                break;
            }
        }