]> git.xonotic.org Git - xonotic/xonotic-data.pk3dir.git/blob - qcsrc/server/monsters/monster/dog.qc
Rename tarbaby to slime & begin cleanup of monster_attack_melee function
[xonotic/xonotic-data.pk3dir.git] / qcsrc / server / monsters / monster / dog.qc
1 // size
2 const vector DOG_MIN = '-16 -16 -24';
3 const vector DOG_MAX = '16 16 12';
4
5 // model
6 string DOG_MODEL = "models/monsters/dog.dpm";
7
8 #ifdef SVQC
9 // cvars
10 float autocvar_g_monster_dog;
11 float autocvar_g_monster_dog_health;
12 float autocvar_g_monster_dog_bite_damage;
13 float autocvar_g_monster_dog_attack_jump_damage;
14 float autocvar_g_monster_dog_speed_walk;
15 float autocvar_g_monster_dog_speed_run;
16
17 // animations
18 const float dog_anim_idle       = 0;
19 const float dog_anim_walk       = 1;
20 const float dog_anim_run        = 2;
21 const float dog_anim_attack     = 3;
22 const float dog_anim_die        = 4;
23 const float dog_anim_pain       = 5;
24
25 void Dog_JumpTouch ()
26 {
27         if (self.health <= 0)
28                 return;
29
30         if (other.takedamage)
31         {
32                 if (vlen(self.velocity) > 300)
33                         Damage(self.enemy, self, self, autocvar_g_monster_dog_attack_jump_damage * monster_skill, DEATH_MONSTER_DOG_JUMP, self.enemy.origin, normalize(self.enemy.origin - self.origin));
34         }
35
36         if(self.flags & FL_ONGROUND)
37                 self.touch = MonsterTouch;
38 }
39
40 void dog_think ()
41 {
42         self.think = dog_think;
43         self.nextthink = time + self.ticrate;
44         
45         monster_move(autocvar_g_monster_dog_speed_run, autocvar_g_monster_dog_speed_walk, 50, dog_anim_run, dog_anim_walk, dog_anim_idle);
46 }
47
48 float dog_attack ()
49 {
50         monsters_setframe(dog_anim_attack);
51         self.attack_finished_single = time + 0.7;
52
53         monster_melee(self.enemy, autocvar_g_monster_dog_bite_damage, 0.2, DEATH_MONSTER_DOG_BITE, TRUE);
54         
55         return TRUE;
56 }
57
58 float dog_jump ()
59 {
60         makevectors(self.angles);
61         if(monster_leap(dog_anim_attack, Dog_JumpTouch, v_forward * 300 + '0 0 200', 0.8))
62                 return TRUE;
63                 
64         return FALSE;
65 }
66
67 void dog_die ()
68 {
69         Monster_CheckDropCvars ("dog");
70         
71         self.think = monster_dead_think;
72         self.nextthink = time + self.ticrate;
73         self.ltime = time + 5;
74         monsters_setframe(dog_anim_die);
75         
76         monster_hook_death(); // for post-death mods
77 }
78
79 void dog_spawn ()
80 {
81         if not(self.health)
82                 self.health = autocvar_g_monster_dog_health;
83
84         self.damageforcescale   = 0;
85         self.classname                  = "monster_dog";
86         self.attack_melee               = dog_attack;
87         self.attack_ranged              = dog_jump;
88         self.checkattack                = GenericCheckAttack;
89         self.nextthink                  = time + random() * 0.5 + 0.1;
90         self.think                              = dog_think;
91         
92         monsters_setframe(dog_anim_idle);
93         
94         monster_setupsounds("dog");
95         
96         monster_hook_spawn(); // for post-spawn mods
97 }
98
99 void spawnfunc_monster_dog ()
100 {       
101         if not(autocvar_g_monster_dog) { remove(self); return; }
102         
103         self.monster_spawnfunc = spawnfunc_monster_dog;
104         
105         if(Monster_CheckAppearFlags(self))
106                 return;
107         
108         if not (monster_initialize(
109                          "Cerberus", MONSTER_DOG,
110                          DOG_MIN, DOG_MAX,
111                          FALSE,
112                          dog_die, dog_spawn))
113         {
114                 remove(self);
115                 return;
116         }
117 }
118
119 #endif // SVQC