]> de.git.xonotic.org Git - xonotic/xonotic-data.pk3dir.git/blob - qcsrc/server/monsters/monster/knight.qc
Merge branch 'master' into mario/monsters
[xonotic/xonotic-data.pk3dir.git] / qcsrc / server / monsters / monster / knight.qc
1 // size
2 const vector KNIGHT_MIN = '-16 -16 -24';
3 const vector KNIGHT_MAX = '16 16 32';
4         
5 // cvars
6 float autocvar_g_monster_knight;
7 float autocvar_g_monster_knight_health;
8 float autocvar_g_monster_knight_melee_damage;
9 float autocvar_g_monster_knight_speed_walk;
10 float autocvar_g_monster_knight_speed_run;
11
12 // animations
13 #define knight_anim_stand               0
14 #define knight_anim_run                 1
15 #define knight_anim_runattack   2
16 #define knight_anim_pain1               3
17 #define knight_anim_pain2               4
18 #define knight_anim_attack              5
19 #define knight_anim_walk                6
20 #define knight_anim_kneel               7
21 #define knight_anim_standing    8
22 #define knight_anim_death1              9
23 #define knight_anim_death2              10
24
25 void knight_think ()
26 {
27         self.think = knight_think;
28         self.nextthink = time + 0.1;
29         
30         monster_move(autocvar_g_monster_knight_speed_run, autocvar_g_monster_knight_speed_walk, 50, knight_anim_run, knight_anim_walk, knight_anim_stand);
31 }
32
33 void knight_attack ()
34 {
35         local float len = vlen(self.velocity);
36
37         self.frame = ((len < 50) ? knight_anim_attack : knight_anim_runattack);
38         
39         self.attack_finished_single = time + 0.9;
40         
41         monster_melee(self.enemy, autocvar_g_monster_knight_melee_damage, 80, DEATH_MONSTER_MELEE);
42 }
43
44 void knight_die ()
45 {
46         Monster_CheckDropCvars ("knight");
47                 
48         self.frame                      = ((random() > 0.5) ? knight_anim_death1 : knight_anim_death2);
49         self.solid                      = SOLID_NOT;
50         self.takedamage         = DAMAGE_NO;
51         self.event_damage   = func_null;
52         self.enemy                      = world;
53         self.think                      = Monster_Fade;
54         self.movetype           = MOVETYPE_TOSS;
55         self.nextthink          = time + 2.1;
56         self.pain_finished  = self.nextthink;
57         
58         monster_hook_death(); // for post-death mods
59 }
60
61 void knight_spawn ()
62 {
63         if not(self.health)
64                 self.health = autocvar_g_monster_knight_health * self.scale;
65
66         self.damageforcescale   = 0.003;
67         self.classname                  = "monster_knight";
68         self.checkattack                = GenericCheckAttack;
69         self.attack_melee               = knight_attack;
70         self.nextthink                  = time + random() * 0.5 + 0.1;
71         self.think                              = knight_think;
72         self.sprite_height              = 30 * self.scale;
73         self.frame                              = knight_anim_stand;
74         
75         monster_hook_spawn(); // for post-spawn mods
76 }
77
78 void spawnfunc_monster_knight ()
79 {       
80         if not(autocvar_g_monster_knight) { remove(self); return; }
81         
82         self.monster_spawnfunc = spawnfunc_monster_knight;
83         
84         if(self.spawnflags & MONSTERFLAG_APPEAR)
85         {
86                 self.think = func_null;
87                 self.nextthink = -1;
88                 self.use = Monster_Appear;
89                 return;
90         }
91         
92         self.scale = 1.3;
93         
94         if not (monster_initialize(
95                          "Knight",
96                          "models/monsters/knight.mdl",
97                          KNIGHT_MIN, KNIGHT_MAX,
98                          FALSE,
99                          knight_die, knight_spawn))
100         {
101                 remove(self);
102                 return;
103         }
104 }