action enemy_missile()
{
if (connection & CONNECT_SERVER) my.smask |= NOSEND_FRAME | NOSEND_ALPHA | NOSEND_COLOR | NOSEND_FLAGS | NOSEND_SCALE;
while(connection != 0 && my.client_id < 0) wait(1);
my.group = 1; //projectiles
...
my.STATE = 1;
my.LIFETIME = 200;
...
wait(1);
c_setminmax(me);
while(1)
{
// state 1: flying ///////////////////////////////////////////
if (my.STATE == 1)
{
//on server
if ((connection & CONNECT_SERVER) || connection == 0) {
my.LIFETIME -= time_step *4;
my.GRAVITY_SUM -= my.GRAVITY * time_step;
if (my.LIFETIME <= 0) my.STATE = 2; //go to STATE 2
//go to STATE 2
if (global_timer_cscan == 1 || global_timer_cscan == 3) {
c_ignore(1,3,4,0);
if (c_scan(my.x, my.pan, vector(360, 360, my.AREAOFEFFECT), SCAN_ENTS | SCAN_FLAG2 | IGNORE_ME) > 0)
{ my.STATE = 2; send_skill(my.STATE,SEND_ALL); }
}
//move projectile
c_ignore(1,2,3,4,0);
c_move(me,vector(my.MOVEMENTSPEED*time_step,0,0),vector(0,0,my.GRAVITY_SUM),IGNORE_PASSABLE);
//go to STATE 2
if (HIT_TARGET && my.STATE == 1) { my.STATE = 2; send_skill(my.STATE,SEND_ALL); }
}
//on client
else {
//move projectile
c_ignore(1,2,3,4,0);
c_move(me,vector(my.MOVEMENTSPEED*time_step,0,0),vector(0,0,my.GRAVITY_SUM),IGNORE_PASSABLE);
if (global_timer_cscan == 1 || global_timer_cscan == 3) {
c_ignore(1,3,4,0); c_scan(my.x, my.pan, vector(360, 360, my.AREAOFEFFECT), SCAN_ENTS | SCAN_FLAG2 | IGNORE_ME); }
}
}
// state 2: exploding ////////////////////////////////////////
if (my.STATE == 2)
{
my.smask |= NOSEND;
break;
}
wait(1);
}
ent_remove(me);
}