haxis/Source/UnrealProject/Sound/MusicPlayer.cpp

127 lines
3.1 KiB
C++

// Project Lab - NHTV Igad
#include "UnrealProject.h"
#include "DefaultGameInstance.h"
#include "Prefs.h"
#include "MusicPlayer.h"
AMusicPlayer::AMusicPlayer()
{
PrimaryActorTick.bCanEverTick = true;
RootComponent = audioComponent = CreateDefaultSubobject<UAudioComponent>(TEXT("Audio"));
bReplicates = true;
m_setInCombat = false;
m_isInCombat = false;
}
void AMusicPlayer::BeginPlay()
{
Super::BeginPlay();
float volume = Cast<UDefaultGameInstance>(GetGameInstance())->GetPrefs()->musicVolume;
audioComponent->SetVolumeMultiplier(volume);
if (generalMusic.Num() > 0)
{
m_currentTrack = FMath::Rand() % generalMusic.Num();
audioComponent->SetSound(generalMusic[m_currentTrack]);
audioComponent->Play();
}
}
void AMusicPlayer::Tick( float DeltaTime )
{
Super::Tick( DeltaTime );
// Change the music combat state
if (m_setInCombat != m_isInCombat)
{
// Fade out the volume
m_changeTime += DeltaTime * 1.5f;
if (m_changeTime >= 1)
{
// Set next state
m_isInCombat = m_setInCombat;
audioComponent->Stop();
m_changeTime = 0;
}
}
float volume = Cast<UDefaultGameInstance>(GetGameInstance())->GetPrefs()->musicVolume;
audioComponent->SetVolumeMultiplier(volume * (1.0f - m_changeTime));
if (!audioComponent->IsPlaying())
m_SelectNextTrack();
}
void AMusicPlayer::m_SelectNextTrack()
{
// Regenerate the array of music (in case any tracks are NULL)
TArray<USoundBase*>& sampleFrom = (m_isInCombat ? combatMusic : generalMusic);
if (sampleFrom.Num() == 0)
return;
TArray<USoundBase*> availableTracks;
for (int32 i = 0; i < sampleFrom.Num(); i++)
{
if (sampleFrom[i])
availableTracks.Add(sampleFrom[i]);
}
if (availableTracks.Num() == 0)
return;
// Only select a random playlist if there are plenty of tracks
const int32 trackCount = availableTracks.Num();
if (trackCount > 5)
{
// Add the current track to the recently played list
m_lastTracks.Add(m_currentTrack);
while (m_lastTracks.Num() > 3)
m_lastTracks.RemoveAt(0);
// Select a random number
m_currentTrack = FMath::Rand() % availableTracks.Num();
while (true)
{
// Check in the array of recently played to see if we already played this
bool found = false;
for (int32 i = 0; i < m_lastTracks.Num(); i++)
{
if (m_currentTrack == m_lastTracks[i])
{
found = true;
break;
}
}
if (!found)
break;
// Pick the next track and see if we havent already played that
m_currentTrack = (m_currentTrack + 1) % availableTracks.Num();
}
}
else
m_currentTrack = (m_currentTrack + 1) % availableTracks.Num();
// Set the new track
audioComponent->SetSound(availableTracks[m_currentTrack]);
audioComponent->Play();
}
void AMusicPlayer::SetInCombat(bool inCombat)
{
check(Role == ROLE_Authority);
m_setInCombat = inCombat;
m_changeTime = 0;
}
void AMusicPlayer::GetLifetimeReplicatedProps(TArray<FLifetimeProperty>& OutLifetimeProps) const
{
Super::GetLifetimeReplicatedProps(OutLifetimeProps);
DOREPLIFETIME(AMusicPlayer, m_setInCombat);
}