2 const vector DEMON_MIN = '-41 -41 -31';
3 const vector DEMON_MAX = '41 41 31';
6 string DEMON_MODEL = "models/monsters/demon.mdl";
10 float autocvar_g_monster_demon;
11 float autocvar_g_monster_demon_health;
12 float autocvar_g_monster_demon_attack_jump_damage;
13 float autocvar_g_monster_demon_damage;
14 float autocvar_g_monster_demon_speed_walk;
15 float autocvar_g_monster_demon_speed_run;
18 const float demon_anim_stand = 0;
19 const float demon_anim_walk = 1;
20 const float demon_anim_run = 2;
21 const float demon_anim_leap = 3;
22 const float demon_anim_pain = 4;
23 const float demon_anim_death = 5;
24 const float demon_anim_attack = 6;
28 self.think = demon_think;
29 self.nextthink = time + self.ticrate;
31 monster_move(autocvar_g_monster_demon_speed_run, autocvar_g_monster_demon_speed_walk, 100, demon_anim_run, demon_anim_walk, demon_anim_stand);
34 float demon_attack_melee ()
36 monsters_setframe(demon_anim_attack);
37 self.attack_finished_single = time + 1;
39 monster_melee(self.enemy, autocvar_g_monster_demon_damage, 0.3, DEATH_MONSTER_FIEND, TRUE);
44 void Demon_JumpTouch ()
49 if (monster_isvalidtarget(other, self))
51 if (vlen(self.velocity) > 300)
53 Damage(other, self, self, autocvar_g_monster_demon_attack_jump_damage * monster_skill, DEATH_MONSTER_FIEND, other.origin, normalize(other.origin - self.origin));
54 self.touch = MonsterTouch; // instantly turn it off to stop damage spam
58 if(self.flags & FL_ONGROUND)
59 self.touch = MonsterTouch;
64 makevectors(self.angles);
65 if(monster_leap(demon_anim_leap, Demon_JumpTouch, v_forward * 700 + '0 0 300', 0.8))
73 Monster_CheckDropCvars ("demon");
75 self.think = monster_dead_think;
76 self.nextthink = time + self.ticrate;
77 self.ltime = time + 5;
78 monsters_setframe(demon_anim_death);
80 monster_hook_death(); // for post-death mods
86 self.health = autocvar_g_monster_demon_health;
88 self.damageforcescale = 0;
89 self.classname = "monster_demon";
90 self.checkattack = GenericCheckAttack;
91 self.attack_melee = demon_attack_melee;
92 self.attack_ranged = demon_jump;
93 self.nextthink = time + random() * 0.5 + 0.1;
94 self.think = demon_think;
96 monsters_setframe(demon_anim_stand);
98 monster_setupsounds("demon");
100 monster_hook_spawn(); // for post-spawn mods
103 void spawnfunc_monster_demon ()
105 if not(autocvar_g_monster_demon) { remove(self); return; }
107 self.monster_spawnfunc = spawnfunc_monster_demon;
109 if(Monster_CheckAppearFlags(self))
114 if not (monster_initialize(
115 "Fiend", MONSTER_DEMON,
116 DEMON_MIN, DEMON_MAX,
118 demon_die, demon_spawn))
125 // compatibility with old spawns
126 void spawnfunc_monster_demon1() { spawnfunc_monster_demon(); }