I didn't test it so there might be slight typos or small bugs, but basically you can do it like this:
- script MOB_MARKER -1,{
OnInit:
.map$ = "yourmap";
bindatcmd("markmobs", strnpcinfo(3) + "::OnMarkMobs");
bindatcmd("unmarkmobs", strnpcinfo(3) + "::OnUnmarkMobs");
end;
function unmark_mobs {
freeloop(1);
for(.@i = 0; .@i < getarraysize(.@viewpoints_x); .@i++) {
viewpoint(2, @viewpoints_x[.@i], @viewpoints_y[.@i], (.@i + 1), 0xFF0000);
}
freeloop(0);
deletearray(@viewpoints_x, getarraysize(@viewpoints_x));
deletearray(@viewpoints_y, getarraysize(@viewpoints_y));
return;
}
OnMarkMobs:
if(getarraysize(@viewpoints_x) > 0) {
unmark_mobs();
}
getmapunits(BL_MOB, .map$, .@mobs);
freeloop(1);
for(.@i=0; .@i < getarraysize(.@mobs); .@i++) {
getunitdata(.@mobs[.@i], .@unit_data);
viewpoint(1, .@unit_data[UMOB_X], .@unit_data[UMOB_Y], (.@i + 1), 0xFF0000);
@viewpoints_x[.@i] = .@unit_data[UMOB_X];
@viewpoints_y[.@i] = .@unit_data[UMOB_Y];
}
freeloop(0);
end;
OnUnmarkMobs:
if(getarraysize(@viewpoints_x) > 0) {
unmark_mobs();
}
}