Files
Aura-TopDownRPG-GAS/Source/Aura/Private/Player/AuraPlayerController.cpp

208 lines
5.3 KiB
C++
Raw Normal View History

2025-10-14 22:20:59 -04:00
// Copyright Echo Devgroup
2025-10-16 14:33:58 -04:00
#include "AbilitySystemBlueprintLibrary.h"
2025-10-14 22:20:59 -04:00
#include "Player/AuraPlayerController.h"
2025-10-16 14:33:58 -04:00
#include "AuraGameplayTags.h"
2025-10-14 22:20:59 -04:00
#include "EnhancedInputSubsystems.h"
2025-10-16 14:33:58 -04:00
#include "AbilitySystem/AuraAbilitySystemComponent.h"
#include "AbilitySystem/AuraAbilitySystemLibrary.h"
#include "Components/SplineComponent.h"
#include "Input/AuraInputComponent.h"
2025-10-14 22:20:59 -04:00
#include "Interact/EnemyInterface.h"
AAuraPlayerController::AAuraPlayerController()
{
bReplicates = true;
2025-10-16 14:33:58 -04:00
Spline = CreateDefaultSubobject<USplineComponent>("Spline");
2025-10-14 22:20:59 -04:00
}
void AAuraPlayerController::PlayerTick(float DeltaTime)
{
Super::PlayerTick(DeltaTime);
CursorTrace();
}
void AAuraPlayerController::CursorTrace()
{
FHitResult CursorHit;
GetHitResultUnderCursor(ECC_Visibility, false, CursorHit);
if (!CursorHit.bBlockingHit) return;
AActor* HitActor = CursorHit.GetActor();
IEnemyInterface* Enemy = Cast<IEnemyInterface>(HitActor);
2025-10-14 22:20:59 -04:00
LastActor = ThisActor;
ThisActor = Enemy;
2025-10-14 22:20:59 -04:00
/**
*Line trace from curso. There are several scenarios
* A. LastActor is null && ThisActor is null
* - Do nothing
* B. LastActor is null && ThisActor is valid
* - Highlight ThisActor
* C. LastActor is valid && ThisActor is null
* - UnHighlight LastActor
* D. LastAcrot is valid && ThisActor is valid but not equal
* - UnHighligh LastActor
* - Highlight ThisActor
* E. LastActor is same as ThisActor
* - Do Nothing
*/
if (LastActor == nullptr)
{
if (ThisActor != nullptr)
{
//Case B
2025-10-16 14:33:58 -04:00
ThisActor->HighlightActor();
2025-10-14 22:20:59 -04:00
//UE_LOG(LogTemp, Warning, TEXT("Case B"));
}
}
else //LastActor is Valid
{
if (ThisActor == nullptr)
{
2025-10-16 14:33:58 -04:00
LastActor->UnHighlightActor();
2025-10-14 22:20:59 -04:00
}
else
{
if (LastActor != ThisActor) // Case D
{
2025-10-16 14:33:58 -04:00
LastActor->UnHighlightActor();
ThisActor->HighlightActor();
2025-10-14 22:20:59 -04:00
}
}
}
}
2025-10-16 14:33:58 -04:00
void AAuraPlayerController::AbilityInputTagPressed(FGameplayTag InputTag)
{
//For Debug of key pressed
//GEngine->AddOnScreenDebugMessage(1, 3.f, FColor::Red, *InputTag.ToString());
//Are we targetting something?
if (InputTag.MatchesTagExact(FAuraGameplayTags::Get().Input_InputTag_LMB))
{
bTargeting = ThisActor ? true : false;
bAutoRunning = false;
}
}
void AAuraPlayerController::AbilityInputTagReleased(FGameplayTag InputTag)
{
//For Debug of Key Held
//GEngine->AddOnScreenDebugMessage(1, 3.f, FColor::Red, *InputTag.ToString());
if (GetASC() == nullptr) return;
GetASC()->AbilityInputTagReleased(InputTag);
}
void AAuraPlayerController::AbilityInputTagHeld(FGameplayTag InputTag)
{
//For Debug of Key Held
//GEngine->AddOnScreenDebugMessage(1, 3.f, FColor::Red, *InputTag.ToString());
if (!InputTag.MatchesTagExact(FAuraGameplayTags::Get().Input_InputTag_LMB))
{
if (GetASC() == nullptr) return;
GetASC()->AbilityInputTagHeld(InputTag);
}
if (bTargeting)
{
if (GetASC())
{
GetASC()->AbilityInputTagHeld(InputTag);
}
}
else
{
FollowTime += GetWorld()->GetDeltaSeconds(); //Add delta seconds to FollowTime
FHitResult Hit;
if (GetHitResultUnderCursor(ECC_Visibility, false, Hit))
{
CachedDestination = Hit.Location;
}
if (APawn* ControlledPawn = GetPawn())
{
const FVector WorldDirection = (CachedDestination - ControlledPawn->GetActorLocation()).GetSafeNormal();
ControlledPawn->AddMovementInput(WorldDirection);
}
}
}
UAuraAbilitySystemComponent* AAuraPlayerController::GetASC()
{
if (AuraAbilitySystemComponent == nullptr)
{
AuraAbilitySystemComponent = Cast<UAuraAbilitySystemComponent>(UAbilitySystemBlueprintLibrary::GetAbilitySystemComponent(GetPawn<APawn>()));
}
return AuraAbilitySystemComponent;
}
/* //cheated and skipped ahead to try and fix error :(
void AAuraPlayerController::HightlightActor(AActor* Actor)
{
}
void AAuraPlayerController::UnHightlightActor(AActor* Actor)
{
}
*/
2025-10-14 22:20:59 -04:00
void AAuraPlayerController::BeginPlay()
{
Super::BeginPlay();
check(AuraContext);
UEnhancedInputLocalPlayerSubsystem* Subsystem = ULocalPlayer::GetSubsystem<UEnhancedInputLocalPlayerSubsystem>(GetLocalPlayer());
if (Subsystem)
{
Subsystem->AddMappingContext(AuraContext,0);
}
bShowMouseCursor = true;
DefaultMouseCursor = EMouseCursor::Default;
FInputModeGameAndUI InputModeData;
InputModeData.SetLockMouseToViewportBehavior(EMouseLockMode::DoNotLock);
InputModeData.SetHideCursorDuringCapture(false);
SetInputMode(InputModeData);
}
void AAuraPlayerController::SetupInputComponent()
{
Super::SetupInputComponent();
2025-10-16 14:33:58 -04:00
UAuraInputComponent* AuraInputComponent = CastChecked<UAuraInputComponent>(InputComponent);
AuraInputComponent->BindAction(MoveAction, ETriggerEvent::Triggered, this, &AAuraPlayerController::Move);
2025-10-14 22:20:59 -04:00
2025-10-16 14:33:58 -04:00
AuraInputComponent->BindAbilityActions(InputConfig, this, &ThisClass::AbilityInputTagPressed, &ThisClass::AbilityInputTagHeld, &ThisClass::AbilityInputTagHeld);
2025-10-14 22:20:59 -04:00
}
void AAuraPlayerController::Move(const FInputActionValue& InputActionValue)
{
const FVector2D InputAxisVector = InputActionValue.Get<FVector2D>();
const FRotator Rotation = GetControlRotation();
const FRotator YawRotation(0.f, Rotation.Yaw, 0.f);
const FVector ForwardDirection = FRotationMatrix(YawRotation).GetUnitAxis(EAxis::X);
const FVector RightDirection = FRotationMatrix(YawRotation).GetUnitAxis(EAxis::Y);
if (APawn* ControlledPawn = GetPawn<APawn>())
{
ControlledPawn->AddMovementInput(ForwardDirection, InputAxisVector.Y);
ControlledPawn->AddMovementInput(RightDirection, InputAxisVector.X);
}
}