You error was in GetValidTileNeighbors, you forgot to check if the passed in parameter Data is a null pointer. This would cause the engine to crash once you tried to access it and if it was invalid
I added in a check. Best to debug the algorithm and see if the proper data is being passed on
TArray<FPathfindingDataCPP> FAsyncPathfinder::GetValidTileNeighbors(FIntPoint Index, bool IncludeDiagonals, const TArray<ETileTypeCPP>& ValidTypes)
{
int32 None = 0;
int32 Normal = 1;
int32 Obstacle = 0;
int32 TowerGround = 1;
int32 TowerFlyer = 1;
int32 TowerEth = 1;
int32 FlyerOnly = 1;
int32 Trap = 1;
int32 Spawn = 1;
int32 Goal = 1;
int32 DoubleC = 2;
int32 TripleC = 3;
int32 SelectedValue;
TArray<FPathfindingDataCPP> Ret;
FTileDataCPP* InputData = CurrentGrid.Find(Index);
TArray<FIntPoint> Neighbors = GetNeighborIndexes(Index, true);
for (auto& Item : Neighbors)
{
FTileDataCPP* Data = CurrentGrid.Find(Item);
if (Data != nullptr)
{
if (ValidTypes.Contains(Data->Type)) {
switch (Data->Type)
{
case ETileTypeCPP::ED_None:
SelectedValue = None;
break;
case ETileTypeCPP::ED_Normal:
SelectedValue = Normal;
break;
case ETileTypeCPP::ED_Obstacle:
SelectedValue = Obstacle;
break;
case ETileTypeCPP::ED_TowerGround:
SelectedValue = TowerGround;
break;
case ETileTypeCPP::ED_TowerFlyer:
SelectedValue = TowerFlyer;
break;
case ETileTypeCPP::ED_TowerEthereal:
SelectedValue = TowerEth;
break;
case ETileTypeCPP::ED_FlyerOnly:
SelectedValue = FlyerOnly;
break;
case ETileTypeCPP::ED_Trap:
SelectedValue = Trap;
break;
case ETileTypeCPP::ED_Spawn:
SelectedValue = Spawn;
break;
case ETileTypeCPP::ED_Goal:
SelectedValue = Goal;
break;
case ETileTypeCPP::ED_DoubleCost:
SelectedValue = DoubleC;
break;
case ETileTypeCPP::ED_TripleCost:
SelectedValue = TripleC;
break;
default:
SelectedValue = 999; // Handle invalid case
break;
}
FPathfindingDataCPP TempPFD;
TempPFD.Index = Data->Index;
TempPFD.CostToEnterTile = SelectedValue;
TempPFD.CostFromStart = 999999;
TempPFD.MinimumCostToTarget = 999999;
TempPFD.PreviousIndex = Index;
Ret.Add(TempPFD);
}
}
}
return Ret;
}