Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- ==== HEADER
- #pragma once
- #include "CoreMinimal.h"
- #include "EnvironmentQuery/EnvQueryTest.h"
- #include "EnvQueryTest_InsideWater.generated.h"
- UCLASS()
- class YOURGAME_API UEnvQueryTest_InsideWater : public UEnvQueryTest
- {
- GENERATED_UCLASS_BODY()
- virtual void RunTest(FEnvQueryInstance& QueryInstance) const override;
- virtual FText GetDescriptionDetails() const override;
- private:
- float WaterLevel = 95.f;
- };
- ===== CPP
- #include "EnvQueryTest_InsideWater.h"
- #include "EnvironmentQuery/Items/EnvQueryItemType_VectorBase.h"
- #include "Kismet/KismetMathLibrary.h"
- EnvQueryTest_InsideWater::EnvQueryTest_InsideWater(const FObjectInitializer& ObjectInitializer)
- : Super(ObjectInitializer)
- {
- Cost = EEnvTestCost::High;
- ValidItemType = UEnvQueryItemType_VectorBase::StaticClass();
- SetWorkOnFloatValues(false);
- }
- void EnvQueryTest_InsideWater::RunTest(FEnvQueryInstance& QueryInstance) const
- {
- BoolValue.BindData(QueryInstance.Owner.Get(), QueryInstance.QueryID);
- const bool bWantsInside = BoolValue.GetValue();
- for (FEnvQueryInstance::ItemIterator It(this, QueryInstance); It; ++It)
- {
- const FVector ItemLocation = GetItemLocation(QueryInstance, It.GetIndex());
- bool bInside = false;
- FHitResult RV_Hit(ForceInit);
- FCollisionQueryParams RV_TraceParams = FCollisionQueryParams(FName(TEXT("RV_Trace")), true);
- RV_TraceParams.bTraceComplex = true;
- RV_TraceParams.bReturnPhysicalMaterial = false;
- bool hit = GetWorld()->LineTraceSingleByChannel(
- RV_Hit, //result
- ItemLocation, //start
- ItemLocation - FVector(0,0,10000), //end
- ECC_Visibility, //collision channel
- RV_TraceParams
- );
- if (hit)
- {
- bInside = RV_Hit.Location.Z < WaterLevel;
- }
- It.SetScore(TestPurpose, FilterType, bInside, bWantsInside);
- }
- }
- FText EnvQueryTest_InsideWater::GetDescriptionDetails() const
- {
- return DescribeBoolTestParams("inside water body");
- }
Advertisement
Add Comment
Please, Sign In to add comment