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