]> de.git.xonotic.org Git - xonotic/xonotic-data.pk3dir.git/blob - qcsrc/server/monsters/monster/demon.qc
Fix hell-knight .think usage
[xonotic/xonotic-data.pk3dir.git] / qcsrc / server / monsters / monster / demon.qc
1 #ifndef MENUQC
2 // size
3 const vector DEMON_MIN = '-32 -32 -24';
4 const vector DEMON_MAX = '32 32 24';
5
6 // model
7 string DEMON_MODEL = "models/monsters/demon.mdl";
8
9 #endif
10
11 #ifdef SVQC
12 // cvars
13 float autocvar_g_monster_demon;
14 float autocvar_g_monster_demon_health;
15 float autocvar_g_monster_demon_attack_jump_damage;
16 float autocvar_g_monster_demon_damage;
17 float autocvar_g_monster_demon_speed_walk;
18 float autocvar_g_monster_demon_speed_run;
19
20 // animations
21 const float demon_anim_stand    = 0;
22 const float demon_anim_walk             = 1;
23 const float demon_anim_run              = 2;
24 const float demon_anim_leap             = 3;
25 const float demon_anim_pain             = 4;
26 const float demon_anim_death    = 5;
27 const float demon_anim_attack   = 6;
28
29 void demon_think ()
30 {
31         self.think = demon_think;
32         self.nextthink = time + self.ticrate;
33         
34         monster_move(autocvar_g_monster_demon_speed_run, autocvar_g_monster_demon_speed_walk, 100, demon_anim_run, demon_anim_walk, demon_anim_stand);
35 }
36
37 void demon_attack_melee ()
38 {
39         monsters_setframe(demon_anim_attack);
40         self.attack_finished_single = time + 1;
41         
42         monster_melee(self.enemy, autocvar_g_monster_demon_damage, 0.3, DEATH_MONSTER_FIEND, TRUE);
43 }
44
45 void Demon_JumpTouch ()
46 {
47         if (self.health <= 0)
48                 return;
49                 
50         float bigdmg = autocvar_g_monster_demon_attack_jump_damage * self.scale;
51
52         if (monster_isvalidtarget(other, self))
53         {
54                 if (vlen(self.velocity) > 300)
55                 {
56                         Damage(other, self, self, bigdmg * monster_skill, DEATH_MONSTER_FIEND, other.origin, normalize(other.origin - self.origin));
57                         self.touch = MonsterTouch; // instantly turn it off to stop damage spam
58                 }
59         }
60
61         if(self.flags & FL_ONGROUND)
62                 self.touch = MonsterTouch;
63 }
64
65 float demon_jump ()
66 {
67         makevectors(self.angles);
68         if(monster_leap(demon_anim_leap, Demon_JumpTouch, v_forward * 700 + '0 0 300', 0.8))
69                 return TRUE;
70                 
71         return FALSE;
72 }
73
74 void demon_die ()
75 {
76         Monster_CheckDropCvars ("demon");
77         
78         self.think = monster_dead_think;
79         self.nextthink = time + self.ticrate;
80         self.ltime = time + 5;
81         monsters_setframe(demon_anim_death);
82         
83         monster_hook_death(); // for post-death mods
84 }
85
86 void demon_spawn ()
87 {
88         if not(self.health)
89                 self.health = autocvar_g_monster_demon_health * self.scale;
90
91         self.damageforcescale   = 0;
92         self.classname                  = "monster_demon";
93         self.checkattack                = GenericCheckAttack;
94         self.attack_melee               = demon_attack_melee;
95         self.attack_ranged              = demon_jump;
96         self.nextthink                  = time + random() * 0.5 + 0.1;
97         self.think                              = demon_think;
98         
99         monsters_setframe(demon_anim_stand);
100         
101         monster_setupsounds("demon");
102         
103         monster_hook_spawn(); // for post-spawn mods
104 }
105
106 void spawnfunc_monster_demon ()
107 {       
108         if not(autocvar_g_monster_demon) { remove(self); return; }
109         
110         self.monster_spawnfunc = spawnfunc_monster_demon;
111         
112         if(Monster_CheckAppearFlags(self))
113                 return;
114         
115         self.scale = 1.3;
116         
117         if not (monster_initialize(
118                          "Fiend", MONSTER_DEMON,
119                          DEMON_MIN, DEMON_MAX,
120                          FALSE,
121                          demon_die, demon_spawn))
122         {
123                 remove(self);
124                 return;
125         }
126 }
127
128 // Compatibility with old spawns
129 void spawnfunc_monster_demon1 () { spawnfunc_monster_demon(); }
130
131 #endif // SVQC