]> de.git.xonotic.org Git - xonotic/xonotic-data.pk3dir.git/blob - qcsrc/server/monsters/monster/knight.qc
67ef1576b503edc127b2b186d0e0e98338795fc8
[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)
81         {
82                 remove(self);
83                 return;
84         }
85         
86         self.monster_spawnfunc = spawnfunc_monster_knight;
87         
88         if(self.spawnflags & MONSTERFLAG_APPEAR)
89         {
90                 self.think = func_null;
91                 self.nextthink = -1;
92                 self.use = Monster_Appear;
93                 return;
94         }
95         
96         self.scale = 1.3;
97         
98         if not (monster_initialize(
99                          "Knight",
100                          "models/monsters/knight.mdl",
101                          KNIGHT_MIN, KNIGHT_MAX,
102                          FALSE,
103                          knight_die, knight_spawn))
104         {
105                 remove(self);
106                 return;
107         }
108 }