void EncryptionHandlerComponent::Outgoing(FBitWriter& Packet)
{
	switch (State)
	{
		case EEncryptionHandler::State::InitializingAsymmetric:
		{
			AsymmetricHandlerComponent->Outgoing(Packet);

			if (AsymmetricHandlerComponent->IsInitialized())
			{
				SetState(EEncryptionHandler::State::InitializingSymmetric);
			}
			break;
		}
		case EEncryptionHandler::State::InitializingSymmetric:
		{
			SymmetricHandlerComponent->Outgoing(Packet);
			AsymmetricHandlerComponent->Outgoing(Packet);
			break;
		}
		case EEncryptionHandler::State::Initialized:
		{
			if(Packet.GetNumBytes() > 0)
			{
				SymmetricHandlerComponent->Outgoing(Packet);
			}
			break;
		}
		default:
		{
			break;
		}
	}

	if (State != EEncryptionHandler::State::Initialized && SymmetricHandlerComponent->IsInitialized())
	{
		AsymmetricHandlerComponent->SetActive(false);
		Initialized();
		SetState(EEncryptionHandler::State::Initialized);
	}
}
void ReliabilityHandlerComponent::Outgoing(FBitWriter& Packet)
{
	switch (State)
	{
		case Handler::Component::State::Initialized:
		{
			FBitWriter Local;
			Local.AllowAppend(true);
			Local.SetAllowResize(true);

			if (IsActive() && IsValid())
			{
				bool PacketHasData = Packet.GetNumBytes() > 0;

				Local.Serialize(&PacketHasData, sizeof(bool));
				Local.SerializeIntPacked(RemotePacketID);

				// Save packet for reliability
				if (PacketHasData)
				{
					Local.SerializeIntPacked(LocalPacketID);
					Local.Serialize(Packet.GetData(), Packet.GetNumBytes());
					++LocalPacketID;

					BufferedPacket* ReliablePacket = new BufferedPacket;

					uint8* Data = new uint8[Packet.GetNumBytes()];
					memcpy(Data, Packet.GetData(), Packet.GetNumBytes());
					ReliablePacket->Data = Data;
					ReliablePacket->Id = LocalPacketID;
					ReliablePacket->BytesCount = Packet.GetNumBytes();
					ReliablePacket->SendTime = Handler->Time + ResendResolutionTime;
					BufferedPackets.Enqueue(ReliablePacket);
				}

				Packet = Local;
				break;
			}
		}
		default:
		{
			break;
		}
	}
}