vampires/Source/vampires/VampirePlayerController.cpp

253 lines
6.7 KiB
C++
Raw Normal View History

2025-02-05 23:12:03 +00:00
// Louis Hobbs | 2024-2025
2024-06-12 00:34:11 +01:00
#include "VampirePlayerController.h"
#include "EnhancedInputComponent.h"
#include "EnhancedInputSubsystems.h"
#include "EXPComponent.h"
2025-02-08 15:36:29 +00:00
#include "GoldComponent.h"
#include "Inputable.h"
#include "VampireGameInstance.h"
2024-11-17 20:02:59 +00:00
#include "VampireGameMode.h"
#include "Weapon.h"
#include "WeaponInventoryComponent.h"
#include "Blueprint/UserWidget.h"
2025-01-25 18:46:56 +00:00
#include "Blueprint/WidgetBlueprintLibrary.h"
2024-11-17 20:02:59 +00:00
#include "Kismet/GameplayStatics.h"
2025-07-31 21:04:43 +01:00
#include "Widgets/GameOverWidget.h"
#include "Widgets/HUDWidget.h"
2025-01-25 20:55:35 +00:00
#include "Widgets/LevelUpWidget.h"
2025-01-25 18:46:56 +00:00
#include "Widgets/PauseWidget.h"
void AVampirePlayerController::OnPossess(APawn* aPawn)
{
Super::OnPossess(aPawn);
2025-07-29 22:06:42 +01:00
if (UEnhancedInputLocalPlayerSubsystem* Subsystem = ULocalPlayer::GetSubsystem<UEnhancedInputLocalPlayerSubsystem>(
GetLocalPlayer()))
{
if (UKismetSystemLibrary::DoesImplementInterface(aPawn, UInputable::StaticClass()))
{
2025-07-29 22:06:42 +01:00
Subsystem->AddMappingContext(IInputable::Execute_Input_GetInputMappingContext(aPawn), 0);
}
}
2025-07-29 22:06:42 +01:00
if (PlayerHUD)
{
2025-07-29 22:06:42 +01:00
CurrentPlayerHUD = CreateWidget<UHUDWidget, AVampirePlayerController*>(this, PlayerHUD.Get());
2025-07-29 22:06:42 +01:00
if (UEXPComponent* ExpComponent = aPawn->GetComponentByClass<UEXPComponent>())
2024-11-16 02:22:41 +00:00
{
2025-07-29 22:06:42 +01:00
ExpComponent->OnEXPGained.AddUniqueDynamic(this, &AVampirePlayerController::UpdatePlayerEXPHUD);
ExpComponent->OnEXPLevelUp.AddUniqueDynamic(this, &AVampirePlayerController::UpdatePlayerLevelHUD);
ExpComponent->OnEXPLevelUp.AddUniqueDynamic(this, &AVampirePlayerController::ShowLevelUpScreen);
UpdatePlayerEXPHUD(ExpComponent->GetCurrentEXP(), ExpComponent->GetCurrentLevelPercent());
UpdatePlayerLevelHUD(ExpComponent->GetCurrentLevel());
2024-11-17 20:02:59 +00:00
}
2024-11-17 21:47:10 +00:00
2025-07-29 22:06:42 +01:00
if (UGoldComponent* GoldComponent = aPawn->GetComponentByClass<UGoldComponent>())
2025-02-08 15:36:29 +00:00
{
2025-07-29 22:06:42 +01:00
GoldComponent->OnGoldGained.AddUniqueDynamic(this, &AVampirePlayerController::UpdateGoldCountHUD);
UpdateGoldCountHUD(GoldComponent->GetCurrentGold());
2025-02-08 15:36:29 +00:00
}
2025-07-29 22:06:42 +01:00
if (AVampireGameMode* Gamemode = Cast<AVampireGameMode>(UGameplayStatics::GetGameMode(GetWorld())))
2024-11-17 20:02:59 +00:00
{
2025-07-29 22:06:42 +01:00
Gamemode->OnEnemyDeathCountIncrementDelegate.
AddDynamic(this, &AVampirePlayerController::UpdateKillCountHUD);
UpdateKillCountHUD(Gamemode->GetEnemyDeathCount());
2024-11-16 02:22:41 +00:00
}
2025-07-29 22:06:42 +01:00
if (CurrentPlayerHUD)
{
2025-07-29 22:06:42 +01:00
CurrentPlayerHUD->AddToViewport();
}
}
2025-07-29 22:06:42 +01:00
if (UVampireGameInstance* GameInstance = Cast<UVampireGameInstance>(GetGameInstance()))
{
2025-07-29 22:06:42 +01:00
UWeaponInventoryComponent* WeaponInventoryComponent = aPawn->GetComponentByClass<
UWeaponInventoryComponent>();
2025-07-29 22:06:42 +01:00
if (WeaponInventoryComponent && GameInstance->StarterWeapon)
{
WeaponInventoryComponent->InitialInventory.Add(GameInstance->StarterWeapon);
}
}
}
2024-11-17 21:45:29 +00:00
void AVampirePlayerController::OnUnPossess()
{
Super::OnUnPossess();
2025-07-29 22:06:42 +01:00
GetWorld()->GetTimerManager().ClearTimer(PawnLifeTimeHandle);
2024-11-17 21:45:29 +00:00
}
void AVampirePlayerController::SetupInputComponent()
{
Super::SetupInputComponent();
if (UEnhancedInputComponent* EIP = CastChecked<UEnhancedInputComponent>(InputComponent))
{
EIP->BindAction(MovementAction, ETriggerEvent::Triggered, this, &AVampirePlayerController::Move);
2025-01-24 22:35:12 +00:00
EIP->BindAction(PauseAction, ETriggerEvent::Triggered, this, &AVampirePlayerController::OnPause);
}
}
void AVampirePlayerController::Move(const FInputActionValue& MovementInput)
{
2025-07-29 22:06:42 +01:00
FVector2D Movement = MovementInput.Get<FVector2D>();
if (APawn* pawn = GetPawn())
{
if (UKismetSystemLibrary::DoesImplementInterface(pawn, UInputable::StaticClass()))
{
2025-07-29 22:06:42 +01:00
IInputable::Execute_Input_Move(pawn, Movement);
}
}
}
2025-01-24 22:35:12 +00:00
void AVampirePlayerController::OnPause(const FInputActionValue& PauseInput)
{
if (APawn* pawn = GetPawn())
{
if (UKismetSystemLibrary::DoesImplementInterface(pawn, UInputable::StaticClass()))
{
IInputable::Execute_Input_Pause(pawn);
}
}
2025-07-29 22:06:42 +01:00
2025-01-25 20:55:35 +00:00
if (PauseUI)
2025-01-24 22:35:12 +00:00
{
2025-01-25 20:55:35 +00:00
if (SetPause(true))
2025-01-25 18:46:56 +00:00
{
2025-07-29 22:06:42 +01:00
CurrentPauseUI = CreateWidget<UPauseWidget, AVampirePlayerController*>(this, PauseUI.Get());
if (CurrentPauseUI)
2025-01-25 18:46:56 +00:00
{
2025-07-29 22:06:42 +01:00
CurrentPauseUI->AddToViewport();
UWidgetBlueprintLibrary::SetInputMode_UIOnlyEx(this, CurrentPauseUI, EMouseLockMode::LockInFullscreen);
2025-01-25 18:46:56 +00:00
bShowMouseCursor = true;
}
2025-07-29 22:06:42 +01:00
}
2025-01-24 22:35:12 +00:00
}
}
2025-07-31 21:04:43 +01:00
void AVampirePlayerController::OnDeath(FDamageInfo DamageInfo)
{
if (GameOverUI)
{
if (CurrentPlayerHUD) { CurrentPlayerHUD->RemoveFromParent(); }
if (CurrentLevelUpUI) { CurrentLevelUpUI->RemoveFromParent(); }
if (CurrentPauseUI) { CurrentPauseUI->RemoveFromParent(); }
CurrentGameOverUI = CreateWidget<UGameOverWidget, AVampirePlayerController*>(this, GameOverUI.Get());
if (CurrentGameOverUI)
{
CurrentGameOverUI->AddToViewport();
UWidgetBlueprintLibrary::SetInputMode_UIOnlyEx(this, CurrentPauseUI, EMouseLockMode::LockInFullscreen);
bShowMouseCursor = true;
int Level = -1;
if (UEXPComponent* EXPComponent = GetPawn()->GetComponentByClass<UEXPComponent>())
{
Level = EXPComponent->GetCurrentLevel();
}
int Kills = -1;
if (AVampireGameMode* GameMode = Cast<AVampireGameMode>(UGameplayStatics::GetGameMode(GetWorld())))
{
Kills = GameMode->GetEnemyDeathCount();
}
int Gold = -1;
if (UGoldComponent* GoldComponent = GetPawn()->GetComponentByClass<UGoldComponent>())
{
Gold = GoldComponent->GetCurrentGold();
}
CurrentGameOverUI->SetGameInfo(Level, ElapsedTime, Kills, Gold);
2025-07-31 21:04:43 +01:00
}
}
}
2025-07-29 22:06:42 +01:00
void AVampirePlayerController::UpdatePlayerEXPHUD(int Exp, float CurrentLevelPercent)
2024-11-16 02:22:41 +00:00
{
2025-07-29 22:06:42 +01:00
if (CurrentPlayerHUD)
2024-11-16 02:22:41 +00:00
{
2025-07-29 22:06:42 +01:00
CurrentPlayerHUD->UpdateEXPBar(CurrentLevelPercent);
2024-11-16 02:22:41 +00:00
}
}
2024-11-17 20:02:59 +00:00
2025-07-29 22:06:42 +01:00
void AVampirePlayerController::ShowLevelUpScreen(int Level)
2025-01-25 20:55:35 +00:00
{
APawn* pawn = GetPawn();
if (!pawn)
{
return;
}
2025-07-29 22:06:42 +01:00
UEXPComponent* ExpComponent = pawn->GetComponentByClass<UEXPComponent>();
if (!ExpComponent || ExpComponent->GetCurrentLevel() == 0)
2025-01-25 20:55:35 +00:00
{
return;
}
2025-07-29 22:06:42 +01:00
2025-01-25 20:55:35 +00:00
if (LevelUpUI)
{
if (SetPause(true))
{
2025-07-29 22:06:42 +01:00
CurrentLevelUpUI = CreateWidget<ULevelUpWidget, AVampirePlayerController*>(this, LevelUpUI.Get());
if (CurrentLevelUpUI)
2025-01-25 20:55:35 +00:00
{
2025-07-29 22:06:42 +01:00
CurrentLevelUpUI->AddToViewport();
UWidgetBlueprintLibrary::SetInputMode_UIOnlyEx(this, CurrentLevelUpUI,
EMouseLockMode::LockInFullscreen);
2025-01-25 20:55:35 +00:00
bShowMouseCursor = true;
}
2025-07-29 22:06:42 +01:00
}
2025-01-25 20:55:35 +00:00
}
}
2025-07-29 22:06:42 +01:00
void AVampirePlayerController::UpdatePlayerLevelHUD(int Level)
2024-11-17 20:02:59 +00:00
{
2025-07-29 22:06:42 +01:00
if (CurrentPlayerHUD)
2024-11-17 20:02:59 +00:00
{
2025-07-29 22:06:42 +01:00
CurrentPlayerHUD->UpdateLevelBlock(Level);
2024-11-17 20:02:59 +00:00
}
}
2025-07-29 22:06:42 +01:00
void AVampirePlayerController::UpdateTimerHUD(float DeltaTime)
2024-11-17 21:43:49 +00:00
{
2025-07-29 22:06:42 +01:00
if (CurrentPlayerHUD)
2024-11-17 21:43:49 +00:00
{
2025-07-29 22:06:42 +01:00
CurrentPlayerHUD->UpdateTimerBlock(DeltaTime);
2024-11-17 21:43:49 +00:00
}
}
2025-07-29 22:06:42 +01:00
void AVampirePlayerController::UpdateKillCountHUD(int KillCount)
2024-11-17 20:02:59 +00:00
{
2025-07-29 22:06:42 +01:00
if (CurrentPlayerHUD)
2024-11-17 20:02:59 +00:00
{
2025-07-29 22:06:42 +01:00
CurrentPlayerHUD->UpdateKillBlock(KillCount);
2024-11-17 20:02:59 +00:00
}
}
2025-02-08 15:36:29 +00:00
2025-07-29 22:06:42 +01:00
void AVampirePlayerController::UpdateGoldCountHUD(int GoldCount)
2025-02-08 15:36:29 +00:00
{
2025-07-29 22:06:42 +01:00
if (CurrentPlayerHUD)
2025-02-08 15:36:29 +00:00
{
2025-07-29 22:06:42 +01:00
CurrentPlayerHUD->UpdateGoldBlock(GoldCount);
2025-02-08 15:36:29 +00:00
}
}
2025-04-04 22:08:11 +01:00
2025-07-29 22:06:42 +01:00
void AVampirePlayerController::UpdateTimerHUDElement_Implementation(float DeltaTime)
2025-04-04 22:08:11 +01:00
{
ElapsedTime = DeltaTime;
2025-07-29 22:06:42 +01:00
if (CurrentPlayerHUD)
2025-04-04 22:08:11 +01:00
{
2025-07-29 22:06:42 +01:00
CurrentPlayerHUD->UpdateTimerBlock(DeltaTime);
2025-04-04 22:08:11 +01:00
}
}