Debug Help! I cannot find issue and don't know how to test. Multithreading.

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;
}

1 Like