ew-progs/ew/monsters/wraith.qc
2011-09-06 00:00:00 +00:00

663 lines
22 KiB
C++

/*
==============================================================================
Wraith
coded by Michael Rogers
some code done by iD software
==============================================================================
*/
$cd /models/enemies
$origin 0 0 24
$base base
$skin base
$frame idle1001 idle1002 idle1003 idle1004 idle1005 idle1006 idle1007 idle1008 idle1009 idle1010
$frame idle1011 idle1012 idle1013 idle1014 idle1015 idle1016 idle1017 idle1018 idle1019 idle1020
$frame idle1021 idle1022 idle1023 idle1024 idle1025 idle1026 idle1027 idle1028 idle1029 idle1030
$frame idle1031 idle1032 idle1033 idle1034 idle1035 idle1036 idle1037 idle1038 idle1039 idle1040
$frame idle2001 idle2002 idle2003 idle2004 idle2005 idle2006 idle2007 idle2008 idle2009 idle2010
$frame idle2011 idle2012 idle2013 idle2014 idle2015 idle2016 idle2017 idle2018 idle2019 idle2020
$frame idle2021 idle2022 idle2023 idle2024 idle2025 idle2026 idle2027 idle2028 idle2029 idle2030
$frame idle2031 idle2032 idle2033 idle2034 idle2035 idle2036 idle2037 idle2038 idle2039 idle2040
$frame walk001 walk002 walk003 walk004 walk005 walk006 walk007 walk008 walk009 walk010
$frame walk011
$frame run001 run002 run003 run004 run005
$frame attack1001 attack1002 attack1003 attack1004 attack1005 attack1006
$frame attack2001 attack2002 attack2003 attack2004 attack2005 attack2006 attack2007 attack2008 attack2009
$frame attack3001 attack3002 attack3003 attack3004 attack3005 attack3006 attack3007 attack3008
$frame pain1001 pain1002 pain1003 pain1004
$frame pain2001 pain2002 pain2003 pain2004
$frame death001 death002 death003 death004 death005 death006 death007 death008 death009
void() wraith_pain;
void() wraith_idlesound;
void() wraith_painsound;
void() wraith_goinvisible;
void() wraith_govisible;
void() wraith_invisible;
void() wraith_teleport;
//=============================================================================
void() BoneTouch =
{
if (other == self.owner)
return; // don't explode on owner
T_Damage(self.enemy,self,self.owner,(30 + (random() * 10)));
sound (self, CHAN_WEAPON, "weapons/lock4.wav", 1, ATTN_NORM);
BecomeExplosion();
};
/*
================
CreateBoneShard
================
*/
void() CreateBoneShard =
{
local entity missile;
missile = spawn ();
missile.owner = self;
missile.movetype = MOVETYPE_FLYMISSILE;
missile.solid = SOLID_BBOX;
missile.classname = "boneshard";
// set missile duration
missile.nextthink = time + 5;
missile.think = BoneTouch;
makevectors (self.angles);
setorigin (missile, self.origin + (v_right * 28) + '0 0 10'); //28 units to his right
setmodel (missile, "models/weapons/gfx/bone.mdl");
setsize (missile, '0 0 0', '0 0 0');
//Tomaz special effects
missile.glow_size = 150;
missile.glow_red = 0;
missile.glow_green = 0;
missile.glow_blue = 0.5;
// set missile speed
missile.velocity = normalize(self.enemy.origin - missile.origin);
missile.velocity = missile.velocity * 800;
missile.angles = vectoangles(missile.velocity);
missile.touch = BoneTouch;
};
void() FireBlastTouch =
{
if (other == self.owner)
return; // don't explode on owner
//set everything but the world on fire
if (other != world && random() <= 0.2)
{
other.onfire = 1;
other.burningtime = time + 2 + random() * 2;
other.burninflictor = self.owner;
}
//damage them some
T_RadiusDamage (self, self.owner, (20 + (random() * 10)), world);
//make some noise
sound (self, CHAN_WEAPON, "weapons/lock4.wav", 1, ATTN_NORM);
//BecomeExplosion();
remove(self);
};
void() FireBlast_CheckStatus =
{
local float p;
//remove us if we are in water
//check for water, slime, or lava
makevectors(self.angles);
p = pointcontents(self.origin + v_forward*16);
if (p == CONTENT_WATER || p == CONTENT_SLIME || p == CONTENT_LAVA)
remove(self);
//if we've sat around too long
if (time > self.ltime)
{
//do appropriate action based on classname
if (self.classname == "fireblastp")
{
//lets do a little homing missile effect
self.nextthink = time + 0.1;
self.think = trinitystart;
//do something tricky ^_-
self.ltime = time + 5;
self.classname = "fireblastm";
}
else
{
self.nextthink = time + 0.1;
self.think = FireBlastTouch;
}
}
};
/*
================
FireBlast
float r: a set number of units to change the origin of the fire
================
*/
void(float r, float vmod) FireBlast =
{
local entity missile;
local vector dir;
missile = spawn ();
missile.owner = self;
missile.movetype = MOVETYPE_FLYMISSILE;
missile.solid = SOLID_BBOX;
//modified so the player can use this for secondary attack of ice shards
if (self.classname == "player" || self.classname == "xsniperbot")
{
makevectors (self.v_angle); // calculate forward angle for velocity
setorigin(missile, self.origin - v_right*r + '0 0 16' + v_forward*20);
missile.classname = "fireblastp";
missile.ltime = time + 1;
}
else
{
makevectors (self.angles);
setorigin (missile, self.origin - (v_right * r) + (v_forward * 20) + '0 0 5'); //r units to his left
missile.classname = "fireblastm";
missile.ltime = time + 5;
}
//check for water
missile.nextthink = time + 0.1;
missile.think = FireBlast_CheckStatus;
setmodel (missile, "progs/flame2.mdl");
setsize (missile, '0 0 0', '0 0 0');
//Tomaz special effects
missile.frame = 1;
missile.glow_size = 150;
missile.glow_red = 1;
missile.glow_green = 0.5;
missile.glow_blue = 0;
// set missile speed
//modified so the player can use this for secondary attack of ice shards
if (self.classname == "player" || self.classname == "xsniperbot")
{
//player aiming
if (self.classname == "player")
dir = aim (self, 1000);
else
dir = xsn_aim_at_enemy();
missile.velocity = dir;
}
else
missile.velocity = normalize(self.enemy.origin - missile.origin);
missile.velocity = missile.velocity * vmod;
//modified so the player can use this for secondary attack of ice shards
if (self.classname == "player" || self.classname == "xsniperbot")
missile.angles = vectoangles(dir);
else
missile.angles = vectoangles(missile.velocity);
missile.touch = FireBlastTouch;
};
//=============================================================================
void() wraith_standa1 =[ $idle1001, wraith_standa2 ] {ai_stand();wraith_idlesound();};
void() wraith_standa2 =[ $idle1002, wraith_standa3 ] {ai_stand();};
void() wraith_standa3 =[ $idle1003, wraith_standa4 ] {ai_stand();};
void() wraith_standa4 =[ $idle1004, wraith_standa5 ] {ai_stand();};
void() wraith_standa5 =[ $idle1005, wraith_standa6 ] {ai_stand();};
void() wraith_standa6 =[ $idle1006, wraith_standa7 ] {ai_stand();};
void() wraith_standa7 =[ $idle1007, wraith_standa8 ] {ai_stand();};
void() wraith_standa8 =[ $idle1008, wraith_standa9 ] {ai_stand();};
void() wraith_standa9 =[ $idle1009, wraith_standa10 ] {ai_stand();};
void() wraith_standa10 =[ $idle1010, wraith_standa11 ] {ai_stand();};
void() wraith_standa11 =[ $idle1011, wraith_standa12 ] {ai_stand();};
void() wraith_standa12 =[ $idle1012, wraith_standa13 ] {ai_stand();};
void() wraith_standa13 =[ $idle1013, wraith_standa14 ] {ai_stand();};
void() wraith_standa14 =[ $idle1014, wraith_standa15 ] {ai_stand();};
void() wraith_standa15 =[ $idle1015, wraith_standa16 ] {ai_stand();};
void() wraith_standa16 =[ $idle1016, wraith_standa17 ] {ai_stand();};
void() wraith_standa17 =[ $idle1017, wraith_standa18 ] {ai_stand();};
void() wraith_standa18 =[ $idle1018, wraith_standa19 ] {ai_stand();};
void() wraith_standa19 =[ $idle1019, wraith_standa20 ] {ai_stand();};
void() wraith_standa20 =[ $idle1020, wraith_standa21 ] {ai_stand();};
void() wraith_standa21 =[ $idle1021, wraith_standa22 ] {ai_stand();};
void() wraith_standa22 =[ $idle1022, wraith_standa23 ] {ai_stand();};
void() wraith_standa23 =[ $idle1023, wraith_standa24 ] {ai_stand();};
void() wraith_standa24 =[ $idle1024, wraith_standa25 ] {ai_stand();};
void() wraith_standa25 =[ $idle1025, wraith_standa26 ] {ai_stand();};
void() wraith_standa26 =[ $idle1026, wraith_standa27 ] {ai_stand();};
void() wraith_standa27 =[ $idle1027, wraith_standa28 ] {ai_stand();};
void() wraith_standa28 =[ $idle1028, wraith_standa29 ] {ai_stand();};
void() wraith_standa29 =[ $idle1029, wraith_standa30 ] {ai_stand();};
void() wraith_standa30 =[ $idle1030, wraith_standa31 ] {ai_stand();};
void() wraith_standa31 =[ $idle1031, wraith_standa32 ] {ai_stand();};
void() wraith_standa32 =[ $idle1032, wraith_standa33 ] {ai_stand();};
void() wraith_standa33 =[ $idle1033, wraith_standa34 ] {ai_stand();};
void() wraith_standa34 =[ $idle1034, wraith_standa35 ] {ai_stand();};
void() wraith_standa35 =[ $idle1035, wraith_standa36 ] {ai_stand();};
void() wraith_standa36 =[ $idle1036, wraith_standa37 ] {ai_stand();};
void() wraith_standa37 =[ $idle1037, wraith_standa38 ] {ai_stand();};
void() wraith_standa38 =[ $idle1038, wraith_standa39 ] {ai_stand();};
void() wraith_standa39 =[ $idle1039, wraith_standa40 ] {ai_stand();};
void() wraith_standa40 =[ $idle1040, wraith_standb1 ] {ai_stand();};
void() wraith_standb1 =[ $idle2001, wraith_standb2 ] {ai_stand();wraith_idlesound();};
void() wraith_standb2 =[ $idle2002, wraith_standb3 ] {ai_stand();};
void() wraith_standb3 =[ $idle2003, wraith_standb4 ] {ai_stand();};
void() wraith_standb4 =[ $idle2004, wraith_standb5 ] {ai_stand();};
void() wraith_standb5 =[ $idle2005, wraith_standb6 ] {ai_stand();};
void() wraith_standb6 =[ $idle2006, wraith_standb7 ] {ai_stand();};
void() wraith_standb7 =[ $idle2007, wraith_standb8 ] {ai_stand();};
void() wraith_standb8 =[ $idle2008, wraith_standb9 ] {ai_stand();};
void() wraith_standb9 =[ $idle2009, wraith_standb10 ] {ai_stand();};
void() wraith_standb10 =[ $idle2010, wraith_standb11 ] {ai_stand();};
void() wraith_standb11 =[ $idle2011, wraith_standb12 ] {ai_stand();};
void() wraith_standb12 =[ $idle2012, wraith_standb13 ] {ai_stand();};
void() wraith_standb13 =[ $idle2013, wraith_standb14 ] {ai_stand();};
void() wraith_standb14 =[ $idle2014, wraith_standb15 ] {ai_stand();};
void() wraith_standb15 =[ $idle2015, wraith_standb16 ] {ai_stand();};
void() wraith_standb16 =[ $idle2016, wraith_standb17 ] {ai_stand();};
void() wraith_standb17 =[ $idle2017, wraith_standb18 ] {ai_stand();};
void() wraith_standb18 =[ $idle2018, wraith_standb19 ] {ai_stand();};
void() wraith_standb19 =[ $idle2019, wraith_standb20 ] {ai_stand();};
void() wraith_standb20 =[ $idle2020, wraith_standb21 ] {ai_stand();};
void() wraith_standb21 =[ $idle2021, wraith_standb22 ] {ai_stand();};
void() wraith_standb22 =[ $idle2022, wraith_standb23 ] {ai_stand();};
void() wraith_standb23 =[ $idle2023, wraith_standb24 ] {ai_stand();};
void() wraith_standb24 =[ $idle2024, wraith_standb25 ] {ai_stand();};
void() wraith_standb25 =[ $idle2025, wraith_standb26 ] {ai_stand();};
void() wraith_standb26 =[ $idle2026, wraith_standb27 ] {ai_stand();};
void() wraith_standb27 =[ $idle2027, wraith_standb28 ] {ai_stand();};
void() wraith_standb28 =[ $idle2028, wraith_standb29 ] {ai_stand();};
void() wraith_standb29 =[ $idle2029, wraith_standb30 ] {ai_stand();};
void() wraith_standb30 =[ $idle2030, wraith_standb31 ] {ai_stand();};
void() wraith_standb31 =[ $idle2031, wraith_standb32 ] {ai_stand();};
void() wraith_standb32 =[ $idle2032, wraith_standb33 ] {ai_stand();};
void() wraith_standb33 =[ $idle2033, wraith_standb34 ] {ai_stand();};
void() wraith_standb34 =[ $idle2034, wraith_standb35 ] {ai_stand();};
void() wraith_standb35 =[ $idle2035, wraith_standb36 ] {ai_stand();};
void() wraith_standb36 =[ $idle2036, wraith_standb37 ] {ai_stand();};
void() wraith_standb37 =[ $idle2037, wraith_standb38 ] {ai_stand();};
void() wraith_standb38 =[ $idle2038, wraith_standb39 ] {ai_stand();};
void() wraith_standb39 =[ $idle2039, wraith_standb40 ] {ai_stand();};
void() wraith_standb40 =[ $idle2040, wraith_standa1 ] {ai_stand();};
//=============================================================================
void() wraith_walk1 =[ $walk001, wraith_walk2 ] {ai_walk(6);wraith_idlesound();};
void() wraith_walk2 =[ $walk002, wraith_walk3 ] {ai_walk(4);};
void() wraith_walk3 =[ $walk003, wraith_walk4 ] {ai_walk(0);};
void() wraith_walk4 =[ $walk004, wraith_walk5 ] {ai_walk(0);};
void() wraith_walk5 =[ $walk005, wraith_walk6 ] {ai_walk(0);};
void() wraith_walk6 =[ $walk006, wraith_walk7 ] {ai_walk(0);};
void() wraith_walk7 =[ $walk007, wraith_walk8 ] {ai_walk(5);};
void() wraith_walk8 =[ $walk008, wraith_walk9 ] {ai_walk(6);};
void() wraith_walk9 =[ $walk009, wraith_walk10 ] {ai_walk(5);};
void() wraith_walk10 =[ $walk010, wraith_walk11 ] {ai_walk(0);};
void() wraith_walk11 =[ $walk011, wraith_walk1 ] {ai_walk(5);};
//=============================================================================
void() wraith_run1 =[ $run001, wraith_run2 ] {ai_run(6);wraith_idlesound();};
void() wraith_run2 =[ $run002, wraith_run3 ] {ai_run(4);wraith_invisible();};
void() wraith_run3 =[ $run003, wraith_run4 ] {ai_run(4);wraith_teleport();};
void() wraith_run4 =[ $run004, wraith_run5 ] {ai_run(5);};
void() wraith_run5 =[ $run005, wraith_run1 ] {ai_run(5);};
//=============================================================================
void() wraith_attacka1 =[ $attack2001, wraith_attacka2 ] {ai_face();};
void() wraith_attacka2 =[ $attack2002, wraith_attacka3 ] {ai_face();};
void() wraith_attacka3 =[ $attack2003, wraith_attacka4 ] {ai_face();};
void() wraith_attacka4 =[ $attack2004, wraith_attacka5 ] {ai_face();};
void() wraith_attacka5 =[ $attack2005, wraith_attacka6 ] {ai_face();};
void() wraith_attacka6 =[ $attack2006, wraith_attacka7 ] {ai_face();};
void() wraith_attacka7 =[ $attack2007, wraith_attacka8 ] {CreateBoneShard();};
void() wraith_attacka8 =[ $attack2008, wraith_attacka9 ] {ai_face();};
void() wraith_attacka9 =[ $attack2009, wraith_run1 ] {};
//=============================================================================
void() wraith_attackb1 =[ $attack3001, wraith_attackb2 ] {ai_face();};
void() wraith_attackb2 =[ $attack3002, wraith_attackb3 ] {ai_face();};
void() wraith_attackb3 =[ $attack3003, wraith_attackb4 ] {ai_face();FireBlast(2,600);};
void() wraith_attackb4 =[ $attack3004, wraith_attackb5 ] {ai_face();FireBlast(4,600);};
void() wraith_attackb5 =[ $attack3003, wraith_attackb6 ] {ai_face();FireBlast(6,600);};
void() wraith_attackb6 =[ $attack3004, wraith_attackb7 ] {ai_face();FireBlast(2,600);};
void() wraith_attackb7 =[ $attack3003, wraith_attackb8 ] {ai_face();FireBlast(4,600);};
void() wraith_attackb8 =[ $attack3004, wraith_attackb9 ] {ai_face();FireBlast(6,600);};
void() wraith_attackb9 =[ $attack3005, wraith_attackb10 ] {ai_face();};
void() wraith_attackb10 =[ $attack3006, wraith_attackb11 ] {ai_face();};
void() wraith_attackb11 =[ $attack3007, wraith_attackb12 ] {ai_face();};
void() wraith_attackb12 =[ $attack3008, wraith_run1 ] {ai_face();};
//=============================================================================
void() wraith_attackc1 =[ $attack1001, wraith_attackc2 ] {ai_face();ai_charge(15);};
void() wraith_attackc2 =[ $attack1002, wraith_attackc3 ] {ai_charge(16);ai_melee();};
void() wraith_attackc3 =[ $attack1003, wraith_attackc4 ] {ai_charge(14);ai_melee();};
void() wraith_attackc4 =[ $attack1004, wraith_attackc5 ] {ai_charge(15);ai_melee();};
void() wraith_attackc5 =[ $attack1005, wraith_attackc6 ] {ai_charge(16);};
void() wraith_attackc6 =[ $attack1006, wraith_run1 ] {ai_charge(14);};
//=============================================================================
void() wraith_paina1 =[ $pain1001, wraith_paina2 ] {};
void() wraith_paina2 =[ $pain1002, wraith_paina3 ] {};
void() wraith_paina3 =[ $pain1003, wraith_paina4 ] {};
void() wraith_paina4 =[ $pain1004, wraith_run1 ] {};
//=============================================================================
void() wraith_painb1 =[ $pain2001, wraith_painb2 ] {};
void() wraith_painb2 =[ $pain2002, wraith_painb3 ] {};
void() wraith_painb3 =[ $pain2003, wraith_painb4 ] {};
void() wraith_painb4 =[ $pain2004, wraith_run1 ] {};
void() wraith_pain =
{
if (self.pain_finished > time)
return;
//play a random pain sound
wraith_painsound();
if (random() <= 0.5)
wraith_paina1 ();
else
wraith_painb1 ();
self.pain_finished = time + 3;
};
//=============================================================================
void() wraith_deathfinish =
{
spawn_tfog (self.origin);
spawn_tdeath (self.origin, self);
remove(self);
return;
};
void() wraith_death1 =[ $death001, wraith_death2 ] {};
void() wraith_death2 =[ $death002, wraith_death3 ] {};
void() wraith_death3 =[ $death003, wraith_death4 ] {};
void() wraith_death4 =[ $death004, wraith_death5 ] {};
void() wraith_death5 =[ $death005, wraith_death6 ] {};
void() wraith_death6 =[ $death006, wraith_death7 ] {};
void() wraith_death7 =[ $death007, wraith_death8 ] {};
void() wraith_death8 =[ $death008, wraith_death9 ] {};
void() wraith_death9 =[ $death009, wraith_death9 ] {wraith_deathfinish();};
void() wraith_die =
{
//gotta let people see me die
wraith_govisible();
sound (self, CHAN_VOICE, "enemy/wraith/death.wav", 1, ATTN_NORM);
wraith_death1();
self.solid = SOLID_NOT;
};
//=============================================================================
void() wraith_alertsound =
{
local float r;
//pick one of 3 alert sounds
r = random();
if (r <= 0.33)
sound (self, CHAN_VOICE, "enemy/wraith/alert1.wav", 1, ATTN_NORM);
else if (r <= 0.66)
sound (self, CHAN_VOICE, "enemy/wraith/alert2.wav", 1, ATTN_NORM);
else
sound (self, CHAN_VOICE, "enemy/wraith/alert3.wav", 1, ATTN_NORM);
};
void() wraith_attacksound =
{
local float r;
//pick one of 3 attack sounds
r = random();
if (r <= 0.33)
sound (self, CHAN_VOICE, "enemy/wraith/pain1.wav", 1, ATTN_NORM);
else if (r <= 0.66)
sound (self, CHAN_VOICE, "enemy/wraith/pain2.wav", 1, ATTN_NORM);
else
sound (self, CHAN_VOICE, "enemy/wraith/pain3.wav", 1, ATTN_NORM);
};
void() wraith_idlesound =
{
//don't always play idlesound
if (random() < 0.3)
sound (self, CHAN_VOICE, "enemy/wraith/dance.wav", 1, ATTN_IDLE);
};
void() wraith_painsound =
{
local float r;
//pick one of 2 pain sounds
r = random();
if (r <= 0.5)
sound (self, CHAN_VOICE, "enemy/wraith/pain4.wav", 1, ATTN_NORM);
else
sound (self, CHAN_VOICE, "enemy/wraith/pain5.wav", 1, ATTN_NORM);
};
void() wraith_goinvisible =
{
// setmodel (self, "");
// setsize (self, '-16 -16 -24', '16 16 40');
self.alpha = set_fade(0.2);
};
void() wraith_govisible =
{
// setmodel (self, "models/enemies/wraith.md2");
// setsize (self, '-16 -16 -24', '16 16 40');
self.alpha = 1;
};
float wraith_invis;
void() wraith_invisible =
{
//random chance of turning invisible or not
if (random () <= 0.3)
{
//if wraith_invis is set to 1 then turn invisible, otherwise turn visible
wraith_invis = wraith_invis + 1;
if (wraith_invis == 1)
wraith_goinvisible();
else
{
wraith_invis = 0;
wraith_govisible();
}
}
};
void() wraith_teleport =
{
//random chance of teleporting
if (random() <= 0.3)
monster_teleport(2); //teleport behind self.enemy
};
void() wraith_missileAttack =
{
//play a random attack sound
wraith_attacksound();
if (random() <= 0.5)
wraith_attacka1(); //Bone Shard Attack
else
wraith_attackb1(); //Fire Blast Attack
};
void() wraith_melee =
{
//wraith shouldnt rely on melee attack too much
if (random() <= 0.5)
{
wraith_attacksound(); //play a random attack sound
wraith_attackc1();
}
else
wraith_missileAttack();
};
//=================================================================
/*QUAKED monster_wraith (1 0 0) (-32 -32 -24) (32 32 48) Ambush
*/
void() monster_wraith =
{
if (deathmatch)
{
remove(self);
return;
}
precache_model ("models/enemies/wraith.md2");
precache_model ("models/weapons/gfx/bone.mdl");
precache_model ("progs/flame2.mdl");
precache_sound ("enemy/wraith/alert1.wav");
precache_sound ("enemy/wraith/alert2.wav");
precache_sound ("enemy/wraith/alert3.wav");
precache_sound ("enemy/wraith/dance.wav");
precache_sound ("enemy/wraith/death.wav");
precache_sound ("enemy/wraith/pain1.wav");
precache_sound ("enemy/wraith/pain2.wav");
precache_sound ("enemy/wraith/pain3.wav");
precache_sound ("enemy/wraith/pain4.wav");
precache_sound ("enemy/wraith/pain5.wav");
precache_sound ("enemy/wraith/spawn.wav");
precache_sound ("weapons/lock4.wav"); //used for missile touch function
self.solid = SOLID_SLIDEBOX;
self.movetype = MOVETYPE_STEP;
setmodel (self, "models/enemies/wraith.md2");
setsize (self, '-16 -16 -24', '16 16 40');
// setsize (self, VEC_HULL2_MIN, VEC_HULL2_MAX);
self.health = set_health(400);
self.speed = set_speed(300);
self.dtype = 3; //dodge type teleport
self.th_stand = wraith_standa1;
self.th_walk = wraith_walk1;
self.th_run = wraith_run1;
self.th_die = wraith_die;
self.th_pain = wraith_pain;
self.th_melee = wraith_melee;
self.th_missile = wraith_missileAttack;
//my new classname is?
self.classname = "monster_wraith";
//set up our monflag
self.monflag = "TRUE";
//difficulty optimization
remove_monster();
walkmonster_start ();
};
/*
=================
create_wraithbot
Creates a Wraith at the specified 'spot'.
This is used by demon portals in Flood Co-op.
=================
*/
void(vector spot) create_wraithbot =
{
local entity bot;
// start entity and place it in world
bot = spawn();
bot.angles = self.angles;
setorigin (bot, spot);
bot.fixangle = TRUE;
spawn_tfog (bot.origin);
spawn_tdeath (bot.origin, bot);
// set size and shape
bot.solid = SOLID_SLIDEBOX;
bot.movetype = MOVETYPE_STEP;
setmodel (bot, "models/enemies/wraith.md2");
setsize (bot, '-16 -16 -24', '16 16 40');
bot.flags = bot.flags | FL_MONSTER;
bot.takedamage = DAMAGE_AIM;
// define his animation
bot.th_stand = wraith_standa1;
bot.th_walk = wraith_walk1;
bot.th_run = wraith_run1;
bot.th_die = wraith_die;
bot.th_pain = wraith_pain;
bot.th_melee = wraith_melee;
bot.th_missile = wraith_missileAttack;
bot.health = set_health(400);
bot.speed = set_speed(300);
bot.dtype = 3; //dodge type teleport
bot.alpha = 1; //we aren't transparent
// polish him up
bot.classname = "monster_wraith";
bot.ideal_yaw = bot.angles * '0 1 0';
bot.yaw_speed = 120;
bot.view_ofs = '0 0 22';
//set up our monflag
bot.monflag = "TRUE";
// begin his thinking
bot.nextthink = time + 0.1 + random();
bot.think = th_stuck;
};