I liked your idea for the action so I implemented it, and reworked it, so that it was in working order again, although it has the same problem, here is the tweaked code. Code:
 string enemydot_mdl = <enemydot.mdl>;
var enemydot_pos[3];

entity* actors_pointer;
var actors_index = 0;
var my_actors[50];

entity* crosshair_pointer;
var my_crosshair[50];

var move_crosshair[3];

action enemydots
{
my_crosshair[actors_index] = handle(my); //actor already added one
crosshair_pointer = ptr_for_handle(my_crosshair[actors_index]);
crosshair_pointer.unlit = on;
crosshair_pointer.ambient = 100;
crosshair_pointer.passable = on;
crosshair_pointer.visible = on;
crosshair_pointer.z = 145;

while(1)
{
wait(4);
move_crosshair.x = actors_pointer.x - crosshair_pointer.x;
move_crosshair.y = actors_pointer.y - crosshair_pointer.y;
move_crosshair.z = 0;
ent_move(move_crosshair, nullvector);
}
}

function create_enemydot(actors_index1)
{
sleep(.5); //ent_create can't happen until .5 secs after level loads
actors_pointer = ptr_for_handle(my_actors[actors_index1]); //minus 1, actor added one already
enemydot_pos.x = actors_pointer.x;
enemydot_pos.y = actors_pointer.y;
enemydot_pos.z = 145;
actors_index = actors_index1;
ent_create(enemydot_mdl, enemydot_pos, enemydots);
}

action actor_walk_fight
{
my_actors[actors_index] = handle(my); //pointer to each actor
actors_index += 1; //put in the next number for the next actor
...main part of the actor's code here....
create_enemydot(actors_index - 1);
}




A clever person solves a problem.
A wise person avoids it.
--Einstein

Currently Codeing: Free Lite-C