Vector3 UnitAiMoonGuard::avoidParticles(const WorldInterface& world, const Vector3& originalVelocity) { Vector3 agentPosition = getShip().getPosition(); if (world.getRingDensity(agentPosition) <= 0) { return originalVelocity; } vector<WorldInterface::RingParticleData> particles = world.getRingParticles(agentPosition, SAFE_DISTANCE); unsigned int amount = particles.size(); if (amount == 0) { return originalVelocity; } WorldInterface::RingParticleData cloestParticle = particles[0]; double closestDistance = cloestParticle.m_position.getDistanceSquared(agentPosition); for (unsigned int i = 1; i < amount; i++) { WorldInterface::RingParticleData particle = particles[i]; double distance = particle.m_position.getDistanceSquared(agentPosition); if (distance < closestDistance) { cloestParticle = particle; closestDistance = distance; } } Vector3 avoidVelocity = m_steering_behaviour.avoid(world, avoidVelocity, cloestParticle.m_position, cloestParticle.m_radius, cloestParticle.m_radius, SAFE_DISTANCE); double speed = getShip().getSpeedMax() / amount * SAFE_DISTANCE / 100; return avoidVelocity.getCopyWithNorm(speed); }
void UnitAiMoonGuard::scan(const WorldInterface& world) { scanCount++; if (scanCount == SCAN_COUNT_MAX) { //printf("Scanning...\n"); Vector3 ship_pos = getShip().getPosition(); nearbyShips = world.getShipIds(ship_pos, SCAN_DISTANCE_SHIP); getClosestShip(world); getClosestEnemyShip(world); Vector3 position = ship_pos + (getShip().getForward() * 500.f); nearbyRingParticles = world.getRingParticles(position, SCAN_DISTANCE_RING_PARTICLE); nearestPlanetoid = world.getNearestPlanetoidId(ship_pos); scanCount = 0; } }