Add building ghost preview

This commit is contained in:
2026-05-18 11:02:02 -07:00
parent 27be644ae6
commit 6baeca2783
5 changed files with 113 additions and 2 deletions
@@ -2,13 +2,14 @@
#include "AgrarianBuildingPlacementComponent.h"
#include "AgrarianInventoryComponent.h"
#include "DrawDebugHelpers.h"
#include "GameFramework/Pawn.h"
#include "GameFramework/Controller.h"
#include "Engine/World.h"
UAgrarianBuildingPlacementComponent::UAgrarianBuildingPlacementComponent()
{
PrimaryComponentTick.bCanEverTick = false;
PrimaryComponentTick.bCanEverTick = true;
SetIsReplicatedByDefault(true);
}
@@ -55,6 +56,16 @@ bool UAgrarianBuildingPlacementComponent::GetPlacementPreview(FTransform& OutTra
return true;
}
bool UAgrarianBuildingPlacementComponent::GetPlacementPreviewState(FTransform& OutTransform, FText& FailureReason) const
{
if (!GetPlacementPreview(OutTransform, FailureReason))
{
return false;
}
return CanPlaceAtTransform(ActiveBuildClass, OutTransform, FailureReason);
}
bool UAgrarianBuildingPlacementComponent::CanPlaceAtTransform(TSubclassOf<AActor> BuildClass, const FTransform& PlacementTransform, FText& FailureReason) const
{
if (!BuildClass)
@@ -148,6 +159,38 @@ void UAgrarianBuildingPlacementComponent::ServerPlaceBuildable_Implementation(TS
OnBuildPlaced.Broadcast(PlacedActor);
}
void UAgrarianBuildingPlacementComponent::TickComponent(float DeltaTime, ELevelTick TickType, FActorComponentTickFunction* ThisTickFunction)
{
Super::TickComponent(DeltaTime, TickType, ThisTickFunction);
if (!bShowGhostPreview || !ActiveBuildClass || !GetWorld())
{
return;
}
FTransform PreviewTransform;
FText FailureReason;
const bool bCanPlace = GetPlacementPreviewState(PreviewTransform, FailureReason);
const FColor PreviewColor = bCanPlace ? ValidGhostPreviewColor : InvalidGhostPreviewColor;
const FVector PreviewExtent(
FMath::Max(PlacementProbeRadius, 25.0f),
FMath::Max(PlacementProbeRadius, 25.0f),
FMath::Max(PlacementProbeRadius * 0.5f, 25.0f));
DrawDebugBox(
GetWorld(),
PreviewTransform.GetLocation() + FVector(0.0f, 0.0f, PreviewExtent.Z),
PreviewExtent,
PreviewTransform.GetRotation(),
PreviewColor,
false,
GhostPreviewLifetimeSeconds,
0,
GhostPreviewLineThickness);
OnBuildPreviewUpdated.Broadcast(bCanPlace, PreviewTransform, FailureReason);
}
bool UAgrarianBuildingPlacementComponent::HasPlacementCost(FText& FailureReason) const
{
const UAgrarianInventoryComponent* Inventory = GetOwner() ? GetOwner()->FindComponentByClass<UAgrarianInventoryComponent>() : nullptr;