UE5.5, How the hell do one set particle position from C++? Why there is no index parameter for the map for node's output?

This is based from these tutorials

So in my case:
I have an array of stars. And I am sending it from the cpp class containing an Niagara component

UNiagaraDataInterfaceArrayFunctionLibrary::SetNiagaraArrayVector(NiagaraSystemComp, FName("ArrayPosition"), Positions);

So Positions is already a TArray<FVector>

I copy all the Niagara system structure in the video ,eg, the Emitter Update scratch script module

I wire the outpu1 into Map Set and get a local name scape “input”, I changed that to emitter name space name"spawn info".

For particle spawn:

  1. The map set either takes particle:position paramter or position array parameter
  2. But, is there a way to convert an vector array to an position array?
  3. If I choose to wire my vector cordinates into map set’s particle input node, I need to use index to loop and retrieve all the star cordinates in the Vector Array user parameter. But there is no such current index node from Map for loop, why the hell?
  4. If I choose to use position array data, I cannot find a node to convert vector array to position array.
  5. Why there isn’t a fast convert just like float to position convert?
    If you use this node called “Map for index” it will fail

And if I copy the method in video: Using a “remove last elem” node, it still spawn all my particles at world zero position

particles spawning at world zero with the remove-last-elem approach points at the array write not landing where the system reads it. the checklist:

  1. the array must be a user parameter on the system, of vector array type, and your set call must target the live component, not the system asset. c++ side that is UNiagaraComponent::SetNiagaraArrayVector (or the variable variant through UNiagaraDataInterfaceArrayFunctionLibrary, which works on any component). if you set it on the system template asset, spawned components never see it.
  2. ordering: set the array before the system activates. if the emitter already spawned its burst, a late set does nothing for particles that already exist. use spawn burst instant re-triggering, or set before activate.
  3. the index sampling: in particle spawn, read the array with the engine provided spawned index and write it to particles position. if instead each particle samples index 0 or a random index, you get clumping. all-zero output means the array itself is empty at read time: verify by writing the array size to a user float and printing it, or by making the emitter spawn count follow the array length (set the burst count from the array size in blueprint after the set call).
  4. the remove-last-elem pattern from the video mutates a blueprint array and pushes one element per spawn, which breaks ordering with bursts. for a one shot spawn, write the whole array once, then burst count = array length.
    the reason this is awkward in blueprint: stock blueprint has no array setter nodes for niagara at all (only c++ has the UNiagaraDataInterfaceArrayFunctionLibrary family), so the usual route is a small c++ function library wrapper, or a plugin exposing the array setters as blueprint nodes.