Guest User

SpawnCustomResourceNodeSolid

a guest
Nov 15th, 2024
50
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 5.43 KB | None | 0 0
  1. bool UResourceNodeSpawner::SpawnCustomResourceNodeSolid(UWorld* World, const FResourceNodeData& NodeData,
  2.                                                         const UResourceRouletteAssets* ResourceAssets)
  3. {
  4.     if (NodeData.ResourceClass.IsNone())
  5.     {
  6.         FResourceRouletteUtilityLog::Get().LogMessage(
  7.             FString::Printf(TEXT("Invalid ResourceClass for node at location: %s"), *NodeData.Location.ToString()),
  8.             ELogLevel::Warning
  9.         );
  10.         return false;
  11.     }
  12.  
  13.     // For now only Solid Nodes TODO Add other node types
  14.     const FName ResourceClassName = NodeData.ResourceClass;
  15.     const FString MeshPath = ResourceAssets->GetSolidMesh(ResourceClassName);
  16.     TArray<FString> MaterialPaths = ResourceAssets->GetSolidMaterial(ResourceClassName);
  17.     const FVector Offset = ResourceAssets->GetSolidOffset(ResourceClassName);
  18.     const FVector Scale = ResourceAssets->GetSolidScale(ResourceClassName);
  19.  
  20.     // Load the mesh asset
  21.     UStaticMesh* Mesh = Cast<UStaticMesh>(StaticLoadObject(UStaticMesh::StaticClass(), nullptr, *MeshPath));
  22.     if (!Mesh)
  23.     {
  24.         FResourceRouletteUtilityLog::Get().LogMessage(
  25.             FString::Printf(TEXT("Failed to load mesh for resource: %s"), *ResourceClassName.ToString()),
  26.             ELogLevel::Warning
  27.         );
  28.         return false;
  29.     }
  30.  
  31.     // Load materials
  32.     TArray<UMaterialInterface*> Materials;
  33.     for (const FString& MaterialPath : MaterialPaths)
  34.     {
  35.         if (UMaterialInterface* Material = Cast<UMaterialInterface>(
  36.             StaticLoadObject(UMaterialInterface::StaticClass(), nullptr, *MaterialPath)))
  37.         {
  38.             Materials.Add(Material);
  39.         }
  40.         else
  41.         {
  42.             FResourceRouletteUtilityLog::Get().LogMessage(
  43.                 FString::Printf(
  44.                     TEXT("Failed to load material for resource: %s, MaterialPath: %s"), *ResourceClassName.ToString(),
  45.                     *MaterialPath),
  46.                 ELogLevel::Warning);
  47.             return false;
  48.         }
  49.     }
  50.    
  51.     UClass* Classname = FindObject<UClass>(ANY_PACKAGE, *NodeData.Classname);
  52.     // TODO - Probably we should do something about the rotation
  53.  
  54.     AFGResourceNode* ResourceNode;
  55.     if (NodeData.IsRayCasted)
  56.     {
  57.         ResourceNode = World->SpawnActor<AFGResourceNode>(Classname, NodeData.Location,NodeData.Rotation);
  58.     }
  59.     else
  60.     {
  61.  
  62.         ResourceNode = World->SpawnActor<AFGResourceNode>(Classname, NodeData.Location,FRotator::ZeroRotator);
  63.     }
  64.     if (!ResourceNode)
  65.     {
  66.         FResourceRouletteUtilityLog::Get().LogMessage(
  67.             FString::Printf(TEXT("Failed to spawn AFGResourceNode at location: %s"), *NodeData.Location.ToString()),
  68.             ELogLevel::Warning);
  69.         return false;
  70.     }
  71.     // FResourceRouletteUtilityLog::Get().LogMessage(
  72.     //     FString::Printf(TEXT("Spawned Resource Node at location: %s"), *NodeData.Location.ToString()), ELogLevel::Debug);
  73.  
  74.     UClass* ResourceClass = FindObject<UClass>(ANY_PACKAGE, *NodeData.ResourceClass.ToString());
  75.     ResourceNode->InitResource(ResourceClass, NodeData.Amount, NodeData.Purity);
  76.     ResourceNode->SetActorScale3D(NodeData.Scale);
  77.     ResourceNode->mResourceNodeType = NodeData.ResourceNodeType;
  78.     ResourceNode->mCanPlacePortableMiner = NodeData.bCanPlaceResourceExtractor;
  79.     ResourceNode->mCanPlaceResourceExtractor = NodeData.bCanPlaceResourceExtractor;
  80.  
  81.     if (!ResourceNode->mResourceNodeRepresentation)
  82.     {
  83.         ResourceNode->mResourceNodeRepresentation = NewObject<UFGResourceNodeRepresentation>(ResourceNode);
  84.         ResourceNode->mResourceNodeRepresentation->SetupResourceNodeRepresentation(ResourceNode);
  85.     }
  86.  
  87.     ResourceNode->InitRadioactivity();
  88.     ResourceNode->UpdateRadioactivity();
  89.  
  90.     UStaticMeshComponent* MeshComponent = NewObject<UStaticMeshComponent>(ResourceNode);
  91.     if (!MeshComponent)
  92.     {
  93.         FResourceRouletteUtilityLog::Get().LogMessage(
  94.             FString::Printf(
  95.                 TEXT("Failed to spawn MeshComponent for resource node at location: %s"), *NodeData.Location.ToString()),
  96.             ELogLevel::Warning);
  97.         return false;
  98.     }
  99.  
  100.     MeshComponent->SetCollisionProfileName("ResourceMesh");
  101.     MeshComponent->SetCollisionEnabled(ECollisionEnabled::QueryAndPhysics);
  102.     MeshComponent->SetCollisionObjectType(ECC_WorldStatic);
  103.     MeshComponent->SetGenerateOverlapEvents(false);
  104.     MeshComponent->SetCollisionResponseToChannel(ECC_Visibility, ECR_Block);
  105.     MeshComponent->SetCollisionResponseToChannel(ECC_WorldStatic, ECR_Block);
  106.     MeshComponent->SetMobility(EComponentMobility::Movable);
  107.     MeshComponent->SetStaticMesh(Mesh);
  108.     MeshComponent->SetVisibility(true);
  109.     MeshComponent->ComponentTags.Add(ResourceRouletteTag);
  110.  
  111.     for (int32 i = 0; i < Materials.Num(); ++i)
  112.     {
  113.         MeshComponent->SetMaterial(i, Materials[i]);
  114.     }
  115.  
  116.     ResourceNode->SetRootComponent(MeshComponent);
  117.     MeshComponent->RegisterComponent();
  118.  
  119.     FVector Min, Max;
  120.     MeshComponent->GetLocalBounds(Min, Max);
  121.     const FVector MeshPivot = (Min + Max) / 2.0f;
  122.     FTransform MeshTransform = MeshComponent->GetComponentTransform();
  123.     FVector AdjustedPivot = MeshTransform.TransformPosition(MeshPivot);
  124.     FVector CorrectedLocation = NodeData.Location - (AdjustedPivot - MeshTransform.GetLocation()) + Offset;
  125.     MeshComponent->SetWorldLocation(CorrectedLocation);
  126.     // TODO resolve the rotation stuff, maybe it's better to go back to actor and raycast and set up "nice" node locations?
  127.     MeshComponent->SetWorldScale3D(Scale);
  128.     if (NodeData.IsRayCasted)
  129.     {
  130.         MeshComponent->SetWorldRotation(NodeData.Rotation);
  131.     }
  132.     else
  133.     {
  134.         MeshComponent->SetWorldRotation(FRotator::ZeroRotator);
  135.     }
  136.  
  137.     // FResourceRouletteUtilityLog::Get().LogMessage(
  138.     //     FString::Printf(TEXT("Spawned Mesh for Node at location: %s"), *NodeData.Location.ToString()), ELogLevel::Debug);
  139.  
  140.     SpawnedResourceNodes.Add(NodeData.NodeGUID, ResourceNode);
  141.    
  142.     return true;
  143. }
Advertisement
Add Comment
Please, Sign In to add comment