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 ); }