3752a24eab
Created camera function which pans the camera to the object and raises FOV, Fixed multiple bugs to do with disabling input, Created BuyItem function which raises the TraceDistance temporarily so user can purchase at longer distances
187 lines
5.8 KiB
C++
187 lines
5.8 KiB
C++
// Fill out your copyright notice in the Description page of Project Settings.
|
|
|
|
#include "TempCharacter.h"
|
|
|
|
#include "Blueprint/UserWidget.h"
|
|
#include "the_twilight_abyss/BaseItems/InventoryComponent.h"
|
|
#include "the_twilight_abyss/BaseItems/Items/BaseItem.h"
|
|
#include "the_twilight_abyss/MerchantInteraction/Interaction.h"
|
|
|
|
|
|
// CONSTRUCTOR
|
|
ATempCharacter::ATempCharacter()
|
|
{
|
|
// Set this character to call Tick() every frame. You can turn this off to improve performance if you don't need it.
|
|
PrimaryActorTick.bCanEverTick = true;
|
|
Inventory = CreateDefaultSubobject<UInventoryComponent>("Inventory");
|
|
Inventory->MaxItemSlots = 10;
|
|
GoldBalance = GoldBalance;
|
|
Health = Health;
|
|
}
|
|
|
|
// Called when the game starts or when spawned
|
|
void ATempCharacter::BeginPlay()
|
|
{
|
|
Super::BeginPlay();
|
|
Health = 100;
|
|
}
|
|
|
|
//Binds the input we made in the setup player component to the forward vector
|
|
void ATempCharacter::ForwardInput(float Axis)
|
|
{
|
|
AddMovementInput(GetActorForwardVector() * Axis);
|
|
}
|
|
//Binds the input we made in the setup player component to the right vector
|
|
void ATempCharacter::RightMoveInput(float Axis)
|
|
{
|
|
AddMovementInput(GetActorRightVector() * Axis);
|
|
}
|
|
|
|
|
|
// Called every frame
|
|
void ATempCharacter::Tick(float DeltaTime)
|
|
{
|
|
Super::Tick(DeltaTime);
|
|
}
|
|
|
|
// Gives the character the functionality
|
|
void ATempCharacter::SetupPlayerInputComponent(UInputComponent* PlayerInputComponent)
|
|
{
|
|
Super::SetupPlayerInputComponent(PlayerInputComponent);
|
|
PlayerInputComponent->BindAxis(TEXT("Move Forward / Backward"), this, &ATempCharacter::ForwardInput);
|
|
PlayerInputComponent->BindAxis(TEXT("Move Right / Left"), this, &ATempCharacter::RightMoveInput);
|
|
PlayerInputComponent->BindAxis(TEXT("Turn Right / Left Mouse"), this, &ATempCharacter::AddControllerYawInput);
|
|
PlayerInputComponent->BindAxis(TEXT("Look Up / Down Mouse"), this, &ATempCharacter::AddControllerPitchInput);
|
|
PlayerInputComponent->BindAction("Interact", IE_Pressed, this, &ATempCharacter::KeyPressed);
|
|
}
|
|
|
|
// When the player presses the E key
|
|
void ATempCharacter::KeyPressed()
|
|
{
|
|
LineTraceLogic();
|
|
}
|
|
|
|
// Line trace logic
|
|
void ATempCharacter::LineTraceLogic()
|
|
{
|
|
UE_LOG(LogTemp, Display, TEXT("LineTraceLogic firing"));
|
|
float GlobalTrace = TraceDistance;
|
|
FHitResult OutHit;
|
|
ThisCamera = Cast<UCameraComponent>(this->FindComponentByClass<UCameraComponent>());
|
|
FVector Start = ThisCamera->GetComponentLocation();
|
|
FVector End = Start + GlobalTrace * ThisCamera->GetForwardVector();
|
|
FCollisionQueryParams TraceParams;
|
|
|
|
TraceParams.AddIgnoredActor(this);
|
|
|
|
bHit = GetWorld()->LineTraceSingleByChannel(OutHit, Start, End, ECC_Visibility, TraceParams);
|
|
if (bHit)
|
|
{
|
|
//we store the GetItem function from InventoryComponent into ItemArray variable
|
|
|
|
if(OutHit.GetActor() == nullptr)
|
|
{
|
|
return;
|
|
}
|
|
if(OutHit.GetActor()->FindComponentByClass<UInventoryComponent>())
|
|
{
|
|
auto ItemArray = OutHit.GetActor()->FindComponentByClass<UInventoryComponent>()->GetItem(0);
|
|
if(GoldBalance >= ItemArray->ItemCostPrice)
|
|
{
|
|
GoldBalance -= ItemArray->ItemCostPrice;
|
|
Inventory->AddItem(ItemArray);
|
|
UE_LOG(LogTemp, Display, TEXT("Item Purchased"));
|
|
}
|
|
if(GoldBalance <= 0)
|
|
{
|
|
UE_LOG(LogTemp, Display, TEXT("Not Enough Gold"));
|
|
}
|
|
}
|
|
// if the actor hit has the interaction component/script then it will activate the code
|
|
|
|
if (AInteraction* MyInteractable = Cast<AInteraction>(OutHit.GetActor()))
|
|
{
|
|
DrawDebugLine(GetWorld(), Start, End, FColor::Green, false, 1.0f);
|
|
MyInteractable->OnInteract();
|
|
UE_LOG(LogTemp, Display, TEXT("OnInteract activated"));
|
|
UE_LOG(LogTemp, Display, TEXT("HIT: %s"), *OutHit.GetActor()->GetName());
|
|
|
|
// While loop to check bisDisabled var until it changes to true
|
|
while (MyInteractable->bisDisabled == false || MyInteractable->bDisableShopDialMove == false)
|
|
{
|
|
if (MyInteractable->bisDisabled == true || MyInteractable->bDisableShopDialMove == true)
|
|
{
|
|
InputDisabler();
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
void ATempCharacter::InputDisabler()
|
|
{
|
|
UE_LOG(LogTemp, Display, TEXT("Disabling playermovement"));
|
|
GetWorld()->GetFirstPlayerController()->SetIgnoreLookInput(true);
|
|
GetWorld()->GetFirstPlayerController()->SetIgnoreMoveInput(true);
|
|
GetWorld()->GetFirstPlayerController()->bShowMouseCursor = true;
|
|
GetWorld()->GetFirstPlayerController()->bEnableClickEvents = true;
|
|
GetWorld()->GetFirstPlayerController()->bEnableMouseOverEvents = true;
|
|
ThisCamera = Cast<UCameraComponent>(this->FindComponentByClass<UCameraComponent>());
|
|
if (ThisCamera == nullptr)
|
|
{
|
|
return;
|
|
}
|
|
else
|
|
{
|
|
OriginalCameraLocation = ThisCamera->GetComponentLocation();
|
|
OriginalCameraRotation = ThisCamera->GetComponentRotation();
|
|
OriginalCameraFOV = ThisCamera->FieldOfView;
|
|
//ulog the originalcameralocation value
|
|
UE_LOG(LogTemp, Display, TEXT("Original Camera Location: %s"), *OriginalCameraLocation.ToString());
|
|
}
|
|
}
|
|
|
|
void ATempCharacter::InputEnabler()
|
|
{
|
|
UE_LOG(LogTemp, Display, TEXT("Enabling Inputs"));
|
|
GetWorld()->GetFirstPlayerController()->SetIgnoreLookInput(false);
|
|
GetWorld()->GetFirstPlayerController()->SetIgnoreMoveInput(false);
|
|
GetWorld()->GetFirstPlayerController()->bShowMouseCursor = false;
|
|
GetWorld()->GetFirstPlayerController()->bEnableClickEvents = false;
|
|
GetWorld()->GetFirstPlayerController()->bEnableMouseOverEvents = false;
|
|
ThisCamera = Cast<UCameraComponent>(this->FindComponentByClass<UCameraComponent>());
|
|
if (ThisCamera == nullptr)
|
|
{
|
|
return;
|
|
}
|
|
else
|
|
{
|
|
ThisCamera->SetWorldLocation(OriginalCameraLocation);
|
|
ThisCamera->SetWorldRotation(OriginalCameraRotation);
|
|
ThisCamera->FieldOfView = OriginalCameraFOV;
|
|
|
|
//ulog the originalcameralocation value
|
|
UE_LOG(LogTemp, Display, TEXT("Original Camera Location: %s"), *OriginalCameraLocation.ToString());
|
|
}
|
|
}
|
|
|
|
void ATempCharacter::UseItem(class UBaseItem* Item)
|
|
{
|
|
if(Item)
|
|
{
|
|
Item->Use(this);
|
|
Item->OnUse(this); //Blueprint Version
|
|
}
|
|
}
|
|
|
|
void ATempCharacter::BuyItem()
|
|
{
|
|
TraceDistance = 1000;
|
|
LineTraceLogic();
|
|
}
|
|
|
|
|
|
|
|
|