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