Without looking at too much what your code is doing, one area you may want to consider (unless I read it wrong):
void UCustomBlueprintNodes::SnapVectorToGrid(FVector Vector, float GridSize, FVector& SnappedVector)
{
float SnappedX = (float)((int)(Vector.X / GridSize))*GridSize;
float SnappedY = (float)((int)(Vector.Y / GridSize))*GridSize;
float SnappedZ = (float)((int)(Vector.Z / GridSize))*GridSize;
if (FMath::Fmod(Vector.X, GridSize) >= GridSize / 2)
SnappedX += GridSize;
if (FMath::Fmod(Vector.Y, GridSize) >= GridSize / 2)
SnappedY += GridSize;
if (FMath::Fmod(Vector.Z, GridSize) >= GridSize / 2)
SnappedZ += GridSize;
SnappedVector = FVector(SnappedX, SnappedY, SnappedZ);
}
Also I like to make sure that GridSize is not zero, and would precede the code with a check for zero and assign it one if so.