void Turret::fireProjectile(const FBox &target_box, const Weapon &weapon, float randomness) { if(isClient()) return; Segment best_ray = computeBestShootingRay(target_box, weapon); if(randomness > 0.0f) { float3 dir = perturbVector(best_ray.dir(), random(), random(), randomness); best_ray = Ray(best_ray.origin(), dir); } #ifdef DEBUG_SHOOTING { m_aiming_lines.clear(); m_aiming_lines.push_back(best_ray.origin()); Intersection isect = trace(best_ray, {Flags::all | Flags::colliding, ref()}); m_aiming_lines.push_back(best_ray.origin() + best_ray.dir() * isect.distance()); } #endif //TODO: spawned projectiles should be centered if( const ProjectileProto *proj_proto = weapon.projectileProto() ) addNewEntity<Projectile>(best_ray.origin(), *proj_proto, actualDirAngle(), best_ray.dir(), ref(), weapon.proto().damage_mod); }
const float2 Entity::actualDir() const { return angleToVector(actualDirAngle()); }