Ach, das würde ich ganz einfach halten.
Da du ja, für jeden Gegner eine Box erstellt hast oder eine die in etwa, für alle Gegner konform ist, ist das Problem schon mal gelöst.
Ich versuch das mal Stichwortartig grob zu beschreiben:
Als erstes erstellen wir die Entitys.
ENTITY* NewEnemy = ent_create("gegner.mdl",vector(x,y,z),Enemy)
ENTITY* NewEnemyBox = ent_create("gegner_boxes.mdl",vector(x,y,z),EnemyBox)
Damit später der Gegner selektiert werden kann, übergeben wir das Handle der zum Gegner gehörigen Box.
NewEnemyBox.skill1 = handle(NewEnemy);
Somit ist das Gegner-Handle jetzt in der entsprechenden Gegner-Box hinterlegt.
In der FUNCTION von der EnemyBox musst du natürlich auch dafür sorgen, dass diese Box dem Gegner folgt, also ständig die 1zu1 Vektoren inne hat. Der einfachste Weg herfür ist auch das entsprechende Handle zu benutzen.
void EnemyBox()
{
ENTITY* pMyEnemy = ptr_for_handle(my.skill1);
while(1)
{
vec_set(my.x,pMyEnemy.x);
wait(1);
}
}
Damit die Box klickbar wird, fehlt noch folgendes in dieser FUNCTION.
void EnemyBox()
{
...
my.emask |= (ENABLE_CLICK);
my.event = EnemyBoxEvent;
...
}
EVENT-FUNCTION dazu:
void EnemyBoxEvent()
{
switch(event_type)
{
case EVENT_CLICK:
{
ENTITY* ClickedEnemy = ptr_for_handle(my.skill1);
MakeSomethingWithTheSelectedEnemy(ClickedEnemy);
break;
}
}
}
So, im Ganzen dürfte das es schon gewesen sein.
Es wird jedesmal, wenn die Box angeklickt wird, das Handle aus der Box gelesen und in einen Pointer für den entsprechenden Feind konvertiert und anschließend in eine Funktion übergeben.
Diese Funktion dürfte dann die "normale" Funktion sein, die du für deine klickbaren-Gegner, ohne klickbare-Box, benutzen würdest.
Damit diese Box dann relativ unsichtbar wird, sollte noch das TRANSLUCENT Flag gesetzt werden.
set(my,TRANSLUCENT);
my.alpha = 0.1;