float CombatSubsystem::GetAimGunPitch(const Vector& target)
{
  Vector GunPos, GunForward, GunRight, GunUp;

  // Get our Gun Data
  GetGunPositionData(&GunPos, &GunForward, &GunRight, &GunUp);
  
  auto TagToTarget = target - GunPos;
  return AngleNormalize180(TagToTarget.toAngles()[PITCH] - GunForward.toAngles()[PITCH]);
}
float CombatSubsystem::GetAimGunYaw(const Vector& target)
{
  Vector GunPos, GunForward, GunRight, GunUp;

  // Get our Gun Data
  GetGunPositionData(&GunPos, &GunForward, &GunRight, &GunUp);

  // Get Vectors to Gun and To Target;
  auto GunPosToOrigin = act->origin - GunPos;
  auto OriginToGunPos = GunPos - act->origin;
  auto OriginToTarget = target - act->origin;

  // Zero out the Z
  GunPosToOrigin.z = 0.0f;
  OriginToTarget.z = 0.0f;
  OriginToGunPos.z = 0.0f;

  // Get Lengths
  auto a = GunPosToOrigin.length();
  auto d = OriginToTarget.length();

  // Get Angle Difference
  auto TagForwardAngles = GunForward.toAngles();
  auto GunToOriginAngles = GunPosToOrigin.toAngles();
  auto OriginToGunAngles = OriginToGunPos.toAngles();
  auto OriginToTargetAngles = OriginToTarget.toAngles();

  auto AngleDiff = AngleNormalize180(GunToOriginAngles[YAW] - TagForwardAngles[YAW]);
  AngleDiff = 180.0f - AngleDiff;

  auto r = a * sin(DEG2RAD(AngleDiff));
  auto angleA = RAD2DEG(acos ( r / d ));
  auto angleB = RAD2DEG(acos ( r / a ));
  auto angleC = AngleNormalize180(OriginToTargetAngles[YAW] - OriginToGunAngles[YAW]);
  auto totalAngle = angleB + angleC;
  auto finalAngle = totalAngle - angleA;

  return AngleNormalize180(finalAngle);
}
void toAngles( quat_t &src, angles_t &dst ) {
	mat3_t temp;

	toMatrix( src, temp );
	toAngles( temp, dst );
}