Crovea

Untitled

Aug 8th, 2022
426
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 1.92 KB | None | 0 0
  1. ==== HEADER
  2.  
  3. #pragma once
  4.  
  5. #include "CoreMinimal.h"
  6. #include "EnvironmentQuery/EnvQueryTest.h"
  7.  
  8. #include "EnvQueryTest_InsideWater.generated.h"
  9.  
  10. UCLASS()
  11. class YOURGAME_API UEnvQueryTest_InsideWater : public UEnvQueryTest
  12. {
  13. GENERATED_UCLASS_BODY()
  14.  
  15. virtual void RunTest(FEnvQueryInstance& QueryInstance) const override;
  16.  
  17. virtual FText GetDescriptionDetails() const override;
  18.  
  19. private:
  20. float WaterLevel = 95.f;
  21. };
  22.  
  23.  
  24.  
  25. ===== CPP
  26.  
  27. #include "EnvQueryTest_InsideWater.h"
  28.  
  29. #include "EnvironmentQuery/Items/EnvQueryItemType_VectorBase.h"
  30. #include "Kismet/KismetMathLibrary.h"
  31.  
  32. EnvQueryTest_InsideWater::EnvQueryTest_InsideWater(const FObjectInitializer& ObjectInitializer)
  33. : Super(ObjectInitializer)
  34. {
  35. Cost = EEnvTestCost::High;
  36. ValidItemType = UEnvQueryItemType_VectorBase::StaticClass();
  37. SetWorkOnFloatValues(false);
  38. }
  39.  
  40. void EnvQueryTest_InsideWater::RunTest(FEnvQueryInstance& QueryInstance) const
  41. {
  42. BoolValue.BindData(QueryInstance.Owner.Get(), QueryInstance.QueryID);
  43. const bool bWantsInside = BoolValue.GetValue();
  44.  
  45.  
  46. for (FEnvQueryInstance::ItemIterator It(this, QueryInstance); It; ++It)
  47. {
  48. const FVector ItemLocation = GetItemLocation(QueryInstance, It.GetIndex());
  49.  
  50. bool bInside = false;
  51.  
  52. FHitResult RV_Hit(ForceInit);
  53.  
  54. FCollisionQueryParams RV_TraceParams = FCollisionQueryParams(FName(TEXT("RV_Trace")), true);
  55. RV_TraceParams.bTraceComplex = true;
  56. RV_TraceParams.bReturnPhysicalMaterial = false;
  57.  
  58. bool hit = GetWorld()->LineTraceSingleByChannel(
  59. RV_Hit, //result
  60. ItemLocation, //start
  61. ItemLocation - FVector(0,0,10000), //end
  62. ECC_Visibility, //collision channel
  63. RV_TraceParams
  64. );
  65.  
  66. if (hit)
  67. {
  68. bInside = RV_Hit.Location.Z < WaterLevel;
  69. }
  70.  
  71. It.SetScore(TestPurpose, FilterType, bInside, bWantsInside);
  72. }
  73.  
  74. }
  75.  
  76. FText EnvQueryTest_InsideWater::GetDescriptionDetails() const
  77. {
  78. return DescribeBoolTestParams("inside water body");
  79. }
  80.  
Advertisement
Add Comment
Please, Sign In to add comment