Reworked Side Bounty Spawning Technique
Every Bounty now stores there own side bounties, however, the bounty director still spawns them in
This commit is contained in:
parent
7bf1f7b59d
commit
fa679b06b4
BIN
EndlessVendetta/Content/BountySystem/CC_ReturnToShip.uasset
(Stored with Git LFS)
BIN
EndlessVendetta/Content/BountySystem/CC_ReturnToShip.uasset
(Stored with Git LFS)
Binary file not shown.
BIN
EndlessVendetta/Content/BountySystem/TestBounties/Test_Bounty1/BC_TestBounty1.uasset
(Stored with Git LFS)
BIN
EndlessVendetta/Content/BountySystem/TestBounties/Test_Bounty1/BC_TestBounty1.uasset
(Stored with Git LFS)
Binary file not shown.
BIN
EndlessVendetta/Content/StarterContent/HDRI/HDRI_Epic_Courtyard_Daylight.uasset
(Stored with Git LFS)
BIN
EndlessVendetta/Content/StarterContent/HDRI/HDRI_Epic_Courtyard_Daylight.uasset
(Stored with Git LFS)
Binary file not shown.
@ -93,38 +93,4 @@ void ABountyClass::CollectRewards_Implementation()
|
|||||||
UE_LOG(LogTemp, Warning, TEXT("The player has gained $%d for completing the bounty!"), RewardMoney);
|
UE_LOG(LogTemp, Warning, TEXT("The player has gained $%d for completing the bounty!"), RewardMoney);
|
||||||
}
|
}
|
||||||
|
|
||||||
void ABountyClass::UpdateBountyCheckpoints(TMap<int, TSubclassOf<ACheckpointClass>> ReplacementCheckpoints)
|
|
||||||
{
|
|
||||||
if (ReplacementCheckpoints.IsEmpty())
|
|
||||||
{
|
|
||||||
UE_LOG(LogTemp, Warning, TEXT("No Replacement Steps found"));
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
FActorSpawnParameters SpawnParameters;
|
|
||||||
SpawnParameters.SpawnCollisionHandlingOverride = ESpawnActorCollisionHandlingMethod::AlwaysSpawn;
|
|
||||||
|
|
||||||
for (auto ReplacementCheckpoint : ReplacementCheckpoints)
|
|
||||||
{
|
|
||||||
BountyCheckpoints[ReplacementCheckpoint.Key]->Destroy();
|
|
||||||
ReplacementCheckpointClass = ReplacementCheckpoint.Value;
|
|
||||||
|
|
||||||
FVector Loc = ReplacementCheckpointClass.GetDefaultObject()->GetCheckpointSpawnTransform().GetLocation();
|
|
||||||
FRotator Rot = ReplacementCheckpointClass.GetDefaultObject()->GetCheckpointSpawnTransform().GetRotation().Rotator();
|
|
||||||
ACheckpointClass* SpawnedCheckpoint = Cast<ACheckpointClass>(GetWorld()->SpawnActor<AActor>(ReplacementCheckpoint.Value, Loc, Rot, SpawnParameters));
|
|
||||||
|
|
||||||
if (SpawnedCheckpoint == nullptr)
|
|
||||||
{
|
|
||||||
UE_LOG(LogTemp, Fatal, TEXT("The new checkpoint hasn't spawned in properly or can't be cast to"));
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
BountyCheckpoints[ReplacementCheckpoint.Key] = SpawnedCheckpoint;
|
|
||||||
if (ReplacementCheckpoint.Key == 0)
|
|
||||||
{
|
|
||||||
BountyCheckpoints[ReplacementCheckpoint.Key]->Active = true;
|
|
||||||
BountyCheckpoints[ReplacementCheckpoint.Key]->CompletedCheckpoint.AddDynamic(this, &ABountyClass::IncrementBountyCheckpoint);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
@ -23,6 +23,9 @@ protected:
|
|||||||
// ------- Properties Set in Editor --------------
|
// ------- Properties Set in Editor --------------
|
||||||
UPROPERTY(EditDefaultsOnly, Category = "Bounty")
|
UPROPERTY(EditDefaultsOnly, Category = "Bounty")
|
||||||
TArray<TSubclassOf<ACheckpointClass>> CheckpointsToSpawn;
|
TArray<TSubclassOf<ACheckpointClass>> CheckpointsToSpawn;
|
||||||
|
|
||||||
|
UPROPERTY(EditDefaultsOnly, Category = "Bounty")
|
||||||
|
TArray<TSubclassOf<ABountyClass>> SideBountiesToSpawn;
|
||||||
|
|
||||||
UPROPERTY(EditDefaultsOnly, Category = "Bounty")
|
UPROPERTY(EditDefaultsOnly, Category = "Bounty")
|
||||||
int RewardMoney = 0;
|
int RewardMoney = 0;
|
||||||
@ -62,6 +65,10 @@ public:
|
|||||||
return Completed;
|
return Completed;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
TArray<TSubclassOf<ABountyClass>> GetSideBountiesToSpawn()
|
||||||
|
{
|
||||||
|
return SideBountiesToSpawn;
|
||||||
|
}
|
||||||
FString GetBountyTitle()
|
FString GetBountyTitle()
|
||||||
{
|
{
|
||||||
return BountyTitle;
|
return BountyTitle;
|
||||||
@ -136,7 +143,4 @@ public:
|
|||||||
|
|
||||||
BountyCheckpoints[0]->Destroy();
|
BountyCheckpoints[0]->Destroy();
|
||||||
}
|
}
|
||||||
|
|
||||||
// Called by Bounty Director, replaces specified checkpoints to alter Bounty when player completes a side bounty
|
|
||||||
void UpdateBountyCheckpoints(TMap<int, TSubclassOf<ACheckpointClass>> ReplacementCheckpoints);
|
|
||||||
};
|
};
|
||||||
|
@ -34,14 +34,7 @@ void ABountyDirector::BeginPlay()
|
|||||||
if (!IsValid(BountyAttachmentPoint)) UE_LOG(LogTemp, Fatal, TEXT("There's no Bounty Attachment UArrowComponent on Players Char "));
|
if (!IsValid(BountyAttachmentPoint)) UE_LOG(LogTemp, Fatal, TEXT("There's no Bounty Attachment UArrowComponent on Players Char "));
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Setup up starting Side Bounty indexes
|
|
||||||
for (int Index = 0; Index < 3; Index++)
|
|
||||||
{
|
|
||||||
CurrentSideBountyIndexes.Add(Index);
|
|
||||||
}
|
|
||||||
|
|
||||||
ActiveSideBounties.SetNum(3);
|
|
||||||
SpawnBountyAndItsSideBounties();
|
SpawnBountyAndItsSideBounties();
|
||||||
UpdateBountyDisplay();
|
UpdateBountyDisplay();
|
||||||
}
|
}
|
||||||
@ -66,22 +59,16 @@ void ABountyDirector::SpawnBountyAndItsSideBounties()
|
|||||||
|
|
||||||
// WHEN MARCEL STOPS PLAYING WITH THE CHARACTER, ADD THIS BOUNTY TO PLAYERS ARRAY OF ACTIVE BOUNTIES!!!!!
|
// WHEN MARCEL STOPS PLAYING WITH THE CHARACTER, ADD THIS BOUNTY TO PLAYERS ARRAY OF ACTIVE BOUNTIES!!!!!
|
||||||
ActiveBounty->CompletedFirstCheckpoint.AddDynamic(this, &ABountyDirector::DestroyActiveSideBounties);
|
ActiveBounty->CompletedFirstCheckpoint.AddDynamic(this, &ABountyDirector::DestroyActiveSideBounties);
|
||||||
|
ActiveSideBounties.Reset();
|
||||||
// Spawn in Side Bounties which are linked to the Main Bounty
|
for (TSubclassOf<ABountyClass> SideBountyClass : ActiveBounty->GetSideBountiesToSpawn())
|
||||||
int ActiveSideBountyIndex = 0;
|
|
||||||
for (int CurrentSideBountyIndex : CurrentSideBountyIndexes)
|
|
||||||
{
|
{
|
||||||
if (SideBountyClassArray.Num() <= CurrentSideBountyIndex || !IsValid(SideBountyClassArray[CurrentSideBountyIndex])) continue;
|
if (!IsValid(SideBountyClass)) continue;
|
||||||
|
AActor* SideBountyActor = GetWorld()->SpawnActor<AActor>(SideBountyClass, PlayerChar->GetActorLocation(), PlayerChar->GetActorRotation(), SpawnParams);
|
||||||
AActor* SideBountyActor = GetWorld()->SpawnActor<AActor>(SideBountyClassArray[CurrentSideBountyIndex], PlayerChar->GetActorLocation(), PlayerChar->GetActorRotation(), SpawnParams);
|
SideBountyActor->AttachToComponent(BountyAttachmentPoint, AttachmentTransformRules);
|
||||||
ASideBountyClass* SideBounty = Cast<ASideBountyClass>(SideBountyActor);
|
ASideBountyClass* SideBounty = Cast<ASideBountyClass>(SideBountyActor);
|
||||||
SideBounty->AttachToComponent(BountyAttachmentPoint, AttachmentTransformRules);
|
if (!IsValid(SideBounty)) UE_LOG(LogTemp, Fatal, TEXT("A SideBounty for %s has been set to a wrong type"), *ActiveBounty->GetBountyTitle());
|
||||||
|
ActiveSideBounties.Add(SideBounty);
|
||||||
ActiveSideBounties[ActiveSideBountyIndex] = SideBounty;
|
|
||||||
SideBounty->ActiveSBC_Index = ActiveSideBountyIndex;
|
|
||||||
ActiveSideBounties[ActiveSideBountyIndex]->CompletedSideBounty.AddDynamic(this, &ABountyDirector::SideBountyCompleted);
|
|
||||||
// ONCE AGAIN WHEN MARCEL STOPS PLAYING WITH THE CHARACTER, ADD THIS SIDE BOUNTY TO PLAYERS ARRAY OF ACTIVE BOUNTIES!!!!!
|
// ONCE AGAIN WHEN MARCEL STOPS PLAYING WITH THE CHARACTER, ADD THIS SIDE BOUNTY TO PLAYERS ARRAY OF ACTIVE BOUNTIES!!!!!
|
||||||
ActiveSideBountyIndex++;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -103,10 +90,6 @@ void ABountyDirector::FinishActiveBounty()
|
|||||||
|
|
||||||
// Increment Main and Side Bounty Indexes
|
// Increment Main and Side Bounty Indexes
|
||||||
CurrentBountyIndex++;
|
CurrentBountyIndex++;
|
||||||
for (int i = 0; i < 3; i++)
|
|
||||||
{
|
|
||||||
CurrentSideBountyIndexes[i] += 3;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Game Completion Check
|
// Game Completion Check
|
||||||
if (CurrentBountyIndex >= BountyClassArray.Num())
|
if (CurrentBountyIndex >= BountyClassArray.Num())
|
||||||
@ -136,17 +119,5 @@ void ABountyDirector::DestroyActiveSideBounties()
|
|||||||
UpdateBountyDisplay();
|
UpdateBountyDisplay();
|
||||||
}
|
}
|
||||||
|
|
||||||
void ABountyDirector::SideBountyCompleted(int SideBountyIndex)
|
|
||||||
{
|
|
||||||
UE_LOG(LogTemp,Warning,TEXT("Updating Main Bounties Checkpoints"));
|
|
||||||
ActiveBounty->UpdateBountyCheckpoints(ActiveSideBounties[SideBountyIndex]->GetReplacementCheckpoints());
|
|
||||||
|
|
||||||
// WHEN MARCEL STOPS PLAYING WITH PLAYER CHAR, REMOVE THIS SIDE BOUNTY FROM ACTIVE BOUNTIES
|
|
||||||
ActiveSideBounties[SideBountyIndex]->CollectRewards();
|
|
||||||
ActiveSideBounties[SideBountyIndex]->DestroyCheckpoints();
|
|
||||||
ActiveSideBounties[SideBountyIndex]->Destroy();
|
|
||||||
|
|
||||||
UpdateBountyDisplay();
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
|
@ -23,14 +23,8 @@ class ENDLESSVENDETTA_API ABountyDirector : public AActor
|
|||||||
UPROPERTY(EditDefaultsOnly, Category = "Bounty")
|
UPROPERTY(EditDefaultsOnly, Category = "Bounty")
|
||||||
TArray<TSubclassOf<ABountyClass>> BountyClassArray;
|
TArray<TSubclassOf<ABountyClass>> BountyClassArray;
|
||||||
|
|
||||||
// Ordered Array of Side Bounties, in three's
|
|
||||||
UPROPERTY(EditDefaultsOnly, Category = "Bounty")
|
|
||||||
TArray<TSubclassOf<ASideBountyClass>> SideBountyClassArray;
|
|
||||||
|
|
||||||
int CurrentBountyIndex = 0;
|
int CurrentBountyIndex = 0;
|
||||||
|
|
||||||
TArray<int> CurrentSideBountyIndexes;
|
|
||||||
|
|
||||||
UPROPERTY(VisibleAnywhere, Category = "Bounty")
|
UPROPERTY(VisibleAnywhere, Category = "Bounty")
|
||||||
ABountyClass* ActiveBounty;
|
ABountyClass* ActiveBounty;
|
||||||
|
|
||||||
@ -54,11 +48,7 @@ protected:
|
|||||||
based on data from ActiveBC and ActiveSBC */
|
based on data from ActiveBC and ActiveSBC */
|
||||||
UFUNCTION(BlueprintImplementableEvent, Category = "bounty")
|
UFUNCTION(BlueprintImplementableEvent, Category = "bounty")
|
||||||
void UpdateBountyDisplay();
|
void UpdateBountyDisplay();
|
||||||
|
|
||||||
// Ran when a Side Bounty is completed and wants to update the active bounties checkpoints
|
|
||||||
UFUNCTION()
|
|
||||||
void SideBountyCompleted(int SideBountyIndex);
|
|
||||||
|
|
||||||
UFUNCTION()
|
UFUNCTION()
|
||||||
void DestroyActiveSideBounties();
|
void DestroyActiveSideBounties();
|
||||||
|
|
||||||
@ -93,6 +83,4 @@ public:
|
|||||||
{
|
{
|
||||||
return (SideBountyIndex > 2 || SideBountyIndex < 0 || !IsValid(ActiveSideBounties[SideBountyIndex])) ? FString("N/A") : ActiveSideBounties[SideBountyIndex]->GetBountyDesc();
|
return (SideBountyIndex > 2 || SideBountyIndex < 0 || !IsValid(ActiveSideBounties[SideBountyIndex])) ? FString("N/A") : ActiveSideBounties[SideBountyIndex]->GetBountyDesc();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
};
|
};
|
||||||
|
Loading…
Reference in New Issue
Block a user