Exemplo n.º 1
0
        /// <summary>
        /// Handle data received by a client.
        /// </summary>
        /// <param name="packet">The client update packet to handle.</param>
        public void HandleClientPacket(ClientUpdatePacket packet)
        {
            // Execute corresponding packet handlers for normal packet data
            UnpackPacketDataDict(packet.GetPacketData(), ExecuteClientPacketHandler);

            // Execute corresponding packet handlers for addon packet data of each addon in the packet
            foreach (var idPacketDataPair in packet.GetAddonPacketData())
            {
                var addonId        = idPacketDataPair.Key;
                var packetDataDict = idPacketDataPair.Value.PacketData;

                UnpackPacketDataDict(
                    packetDataDict,
                    (packetId, packetData) => ExecuteClientAddonPacketHandler(addonId, packetId, packetData)
                    );
            }
        }
Exemplo n.º 2
0
        // TODO: make sure that resent data does not overwrite newer instance of later sent reliable data
        public void SetLostReliableData(ClientUpdatePacket lostPacket)
        {
            if (lostPacket.DataPacketIds.Contains(ClientPacketId.PlayerConnect))
            {
                Logger.Get().Info(this, "  Resending PlayerConnect data");

                DataPacketIds.Add(ClientPacketId.PlayerConnect);

                PlayerConnect.DataInstances.AddRange(lostPacket.PlayerConnect.DataInstances);
            }

            if (lostPacket.DataPacketIds.Contains(ClientPacketId.PlayerDisconnect))
            {
                Logger.Get().Info(this, "  Resending PlayerDisconnect data");

                DataPacketIds.Add(ClientPacketId.PlayerDisconnect);

                PlayerDisconnect.DataInstances.AddRange(lostPacket.PlayerDisconnect.DataInstances);
            }

            if (lostPacket.DataPacketIds.Contains(ClientPacketId.PlayerEnterScene))
            {
                Logger.Get().Info(this, "  Resending PlayerEnterScene data");

                DataPacketIds.Add(ClientPacketId.PlayerEnterScene);

                PlayerEnterScene.DataInstances.AddRange(lostPacket.PlayerEnterScene.DataInstances);
            }

            if (lostPacket.DataPacketIds.Contains(ClientPacketId.PlayerAlreadyInScene))
            {
                Logger.Get().Info(this, "  Resending PlayerAlreadyInScene data");

                DataPacketIds.Add(ClientPacketId.PlayerAlreadyInScene);

                PlayerAlreadyInScene.PlayerEnterSceneList.AddRange(lostPacket.PlayerAlreadyInScene
                                                                   .PlayerEnterSceneList);
            }

            if (lostPacket.DataPacketIds.Contains(ClientPacketId.PlayerLeaveScene))
            {
                Logger.Get().Info(this, "  Resending PlayerLeaveScene data");

                DataPacketIds.Add(ClientPacketId.PlayerLeaveScene);

                PlayerLeaveScene.DataInstances.AddRange(lostPacket.PlayerLeaveScene.DataInstances);
            }

            if (lostPacket.DataPacketIds.Contains(ClientPacketId.PlayerDeath))
            {
                Logger.Get().Info(this, "  Resending PlayerDeath data");

                DataPacketIds.Add(ClientPacketId.PlayerDeath);

                PlayerDeath.DataInstances.AddRange(lostPacket.PlayerDeath.DataInstances);
            }

            if (lostPacket.DataPacketIds.Contains(ClientPacketId.PlayerTeamUpdate))
            {
                Logger.Get().Info(this, "  Resending PlayerTeamUpdate data");

                DataPacketIds.Add(ClientPacketId.PlayerTeamUpdate);

                PlayerTeamUpdate.DataInstances.AddRange(lostPacket.PlayerTeamUpdate.DataInstances);
            }

            if (lostPacket.DataPacketIds.Contains(ClientPacketId.PlayerSkinUpdate))
            {
                // Only update if the current packet does not already contain another skin update
                // since we want the latest update to arrive
                if (!DataPacketIds.Contains(ClientPacketId.PlayerSkinUpdate))
                {
                    Logger.Get().Info(this, "  Resending PlayerSkinUpdate data");

                    DataPacketIds.Add(ClientPacketId.PlayerSkinUpdate);

                    PlayerSkinUpdate.DataInstances.AddRange(lostPacket.PlayerSkinUpdate.DataInstances);
                }
            }

            if (lostPacket.DataPacketIds.Contains(ClientPacketId.GameSettingsUpdated))
            {
                // Only update if the current packet does not already contain another settings update
                // since we want the latest update to arrive
                if (!DataPacketIds.Contains(ClientPacketId.GameSettingsUpdated))
                {
                    Logger.Get().Info(this, "  Resending GameSettingsUpdated data");

                    DataPacketIds.Add(ClientPacketId.GameSettingsUpdated);

                    GameSettingsUpdate = lostPacket.GameSettingsUpdate;
                }
            }
        }
Exemplo n.º 3
0
        /**
         * Handle data received by a client
         */
        public void HandleClientPacket(ClientUpdatePacket packet)
        {
            /*foreach (var item in packet.DataPacketIds)
             * {
             *  Logger.Info(this,$"client to handle {Enum.GetName(typeof(ClientPacketId), item)}");
             * }*/
            // Execute corresponding packet handlers
            if (packet.DataPacketIds.Contains(ClientPacketId.PlayerConnect))
            {
                foreach (var playerConnect in packet.PlayerConnect.DataInstances)
                {
                    ExecuteClientPacketHandler(ClientPacketId.PlayerConnect, playerConnect);
                }
            }

            if (packet.DataPacketIds.Contains(ClientPacketId.PlayerDisconnect))
            {
                foreach (var playerDisconnect in packet.PlayerDisconnect.DataInstances)
                {
                    ExecuteClientPacketHandler(ClientPacketId.PlayerDisconnect, playerDisconnect);
                }
            }

            if (packet.DataPacketIds.Contains(ClientPacketId.ServerShutdown))
            {
                ExecuteClientPacketHandler(ClientPacketId.ServerShutdown, null);
            }

            if (packet.DataPacketIds.Contains(ClientPacketId.PlayerEnterScene))
            {
                foreach (var playerEnterScene in packet.PlayerEnterScene.DataInstances)
                {
                    ExecuteClientPacketHandler(ClientPacketId.PlayerEnterScene, playerEnterScene);
                }
            }

            if (packet.DataPacketIds.Contains(ClientPacketId.PlayerAlreadyInScene))
            {
                ExecuteClientPacketHandler(ClientPacketId.PlayerAlreadyInScene, packet.PlayerAlreadyInScene);
            }

            if (packet.DataPacketIds.Contains(ClientPacketId.PlayerLeaveScene))
            {
                foreach (var playerLeaveScene in packet.PlayerLeaveScene.DataInstances)
                {
                    ExecuteClientPacketHandler(ClientPacketId.PlayerLeaveScene, playerLeaveScene);
                }
            }

            if (packet.DataPacketIds.Contains(ClientPacketId.PlayerUpdate))
            {
                foreach (var playerUpdate in packet.PlayerUpdates.DataInstances)
                {
                    ExecuteClientPacketHandler(ClientPacketId.PlayerUpdate, playerUpdate);
                }
            }

            if (packet.DataPacketIds.Contains(ClientPacketId.EntityUpdate))
            {
                foreach (var entityUpdate in packet.EntityUpdates.DataInstances)
                {
                    ExecuteClientPacketHandler(ClientPacketId.EntityUpdate, entityUpdate);
                }
            }

            if (packet.DataPacketIds.Contains(ClientPacketId.PlayerDeath))
            {
                foreach (var playerDeath in packet.PlayerDeath.DataInstances)
                {
                    ExecuteClientPacketHandler(ClientPacketId.PlayerDeath, playerDeath);
                }
            }

            if (packet.DataPacketIds.Contains(ClientPacketId.PlayerTeamUpdate))
            {
                foreach (var playerTeamUpdate in packet.PlayerTeamUpdate.DataInstances)
                {
                    ExecuteClientPacketHandler(ClientPacketId.PlayerTeamUpdate, playerTeamUpdate);
                }
            }

            if (packet.DataPacketIds.Contains(ClientPacketId.PlayerSkinUpdate))
            {
                foreach (var playerSkinUpdate in packet.PlayerSkinUpdate.DataInstances)
                {
                    ExecuteClientPacketHandler(ClientPacketId.PlayerSkinUpdate, playerSkinUpdate);
                }
            }

            if (packet.DataPacketIds.Contains(ClientPacketId.PlayerEmoteUpdate))
            {
                foreach (var playerEmoteUpdate in packet.PlayerEmoteUpdate.DataInstances)
                {
                    ExecuteClientPacketHandler(ClientPacketId.PlayerEmoteUpdate, playerEmoteUpdate);
                }
            }

            if (packet.DataPacketIds.Contains(ClientPacketId.GameSettingsUpdated))
            {
                ExecuteClientPacketHandler(ClientPacketId.GameSettingsUpdated, packet.GameSettingsUpdate);
            }
        }