Beispiel #1
0
void MeasureCalc::UpdateUniqueNumberList()
{
	const size_t range = (m_HighBound - m_LowBound) + 1;
	m_UniqueNumbers.resize(range);

	for (int i = 0; i < (int)range; ++i)
	{
		m_UniqueNumbers[i] = m_LowBound + i;
	}

	std::shuffle(m_UniqueNumbers.begin(), m_UniqueNumbers.end(), GetRandomEngine());
}
Beispiel #2
0
ACarlaWheeledVehicle* AVehicleSpawnerBase::SpawnVehicleAtSpawnPoint(
    const APlayerStart &SpawnPoint)
{
  ACarlaWheeledVehicle *Vehicle;
  SpawnVehicle(SpawnPoint.GetActorTransform(), Vehicle);
  if ((Vehicle != nullptr) && !Vehicle->IsPendingKill())
  {
    Vehicle->AIControllerClass = AWheeledVehicleAIController::StaticClass();
    Vehicle->SpawnDefaultController();
    auto Controller = GetController(Vehicle);
    if (Controller != nullptr) 
	{ // Sometimes fails...
      Controller->GetRandomEngine()->Seed(GetRandomEngine()->GenerateSeed());
      Controller->SetRoadMap(GetRoadMap());
      Controller->SetAutopilot(true);
      Vehicles.Add(Vehicle);
    } else {

      UE_LOG(LogCarla, Error, TEXT("Something went wrong creating the controller for the new vehicle"));
      Vehicle->Destroy();
    }
  }
  return Vehicle;
}
Beispiel #3
0
int MeasureCalc::GetRandom()
{
	if (m_LowBound == m_HighBound || m_LowBound > m_HighBound)
	{
		return m_LowBound;
	}
	else if (m_UniqueRandom)
	{
		if (m_UniqueNumbers.empty())
		{
			UpdateUniqueNumberList();
		}

		const int value = m_UniqueNumbers.back();
		m_UniqueNumbers.pop_back();
		return value;
	}
	else
	{
		const std::uniform_int_distribution<int> distribution(m_LowBound, m_HighBound);
		return distribution(GetRandomEngine());
	}
}
Beispiel #4
0
void AVehicleSpawnerBase::BeginPlay()
{
  Super::BeginPlay();

  NumberOfVehicles = FMath::Max(0, NumberOfVehicles);

  // Allocate space for walkers.
  Vehicles.Reserve(NumberOfVehicles);

  // Find spawn points present in level.
  for (TActorIterator<APlayerStart> It(GetWorld()); It; ++It) {
    SpawnPoints.Add(*It);
  }

  UE_LOG(LogCarla, Log, TEXT("Found %d PlayerStart positions for spawning vehicles"), SpawnPoints.Num());

  if (SpawnPoints.Num() < NumberOfVehicles && SpawnPoints.Num()>0) 
  {
    UE_LOG(LogCarla, Warning, TEXT("We don't have enough spawn points (PlayerStart) for vehicles!"));
	if(SpawnPoints.Num()==0)
	{
	  UE_LOG(LogCarla, Error, TEXT("At least one spawn point (PlayerStart) is needed to spawn vehicles!"));	
	} else
	{
	  UE_LOG(LogCarla, Log, 
	    TEXT("To cover the %d vehicles to spawn after beginplay, it will spawn one new vehicle each %f seconds"),
	    NumberOfVehicles - SpawnPoints.Num(),
		TimeBetweenSpawnAttemptsAfterBegin
	  )
;
	}
  }
  
  if(NumberOfVehicles==0||SpawnPoints.Num()==0) bSpawnVehicles = false;

  if (bSpawnVehicles) 
  {
	GetRandomEngine()->Shuffle(SpawnPoints); //to get a random spawn point from the map
    const int32 MaximumNumberOfAttempts = SpawnPoints.Num(); 
    int32 NumberOfAttempts = 0; 
    int32 SpawnIndexCount = 0;
    while ((NumberOfVehicles > Vehicles.Num()) && (NumberOfAttempts < MaximumNumberOfAttempts)) 
	{
      if(SpawnPoints.IsValidIndex(SpawnIndexCount))
      {
	     if(SpawnVehicleAtSpawnPoint(*SpawnPoints[SpawnIndexCount])){
            SpawnIndexCount++;
         }
      }
      NumberOfAttempts++;
    }
	bool bAllSpawned = false;
    if (NumberOfVehicles > SpawnIndexCount) 
	{
      UE_LOG(LogCarla, Warning, TEXT("Requested %d vehicles, but we were only able to spawn %d"), NumberOfVehicles, SpawnIndexCount);
    } else
    {
	  if(SpawnIndexCount == NumberOfVehicles)
	  {
        bAllSpawned = true;
	  } 
    }
    if(!bAllSpawned)
    {
      UE_LOG(LogCarla, Log, 
	    TEXT("Starting the timer to spawn the other %d vehicles, one per %f seconds"), 
	    NumberOfVehicles - SpawnIndexCount,
	    TimeBetweenSpawnAttemptsAfterBegin
	  );
	  GetWorld()->GetTimerManager().SetTimer(AttemptTimerHandle,this, &AVehicleSpawnerBase::SpawnVehicleAttempt, TimeBetweenSpawnAttemptsAfterBegin,false,-1);
    } else
    {
      UE_LOG(LogCarla, Log, TEXT("Spawned all %d requested vehicles"), NumberOfVehicles);
    }
  }
}
Beispiel #5
0
APlayerStart *AVehicleSpawnerBase::GetRandomSpawnPoint()
{
  return (SpawnPoints.Num() > 0 ? GetRandomEngine()->PickOne(SpawnPoints) : nullptr);
}