]> de.git.xonotic.org Git - xonotic/xonotic-data.pk3dir.git/blob - qcsrc/server/monsters/monster/slime.qc
8f73ceaea503137582ee4c1238bd5c3e88dbe3c8
[xonotic/xonotic-data.pk3dir.git] / qcsrc / server / monsters / monster / slime.qc
1 const vector SLIME_MIN = '-16 -16 -24';
2 const vector SLIME_MAX = '16 16 16';
3
4 string SLIME_MODEL = "models/monsters/slime.dpm";
5
6 #ifdef SVQC
7 float autocvar_g_monster_slime;
8 float autocvar_g_monster_slime_health;
9 float autocvar_g_monster_slime_speed_walk;
10 float autocvar_g_monster_slime_speed_run;
11
12 const float slime_anim_walk             = 0;
13 const float slime_anim_idle             = 1;
14 const float slime_anim_jump             = 2;
15 const float slime_anim_fly              = 3;
16 const float slime_anim_die              = 4;
17 const float slime_anim_pain             = 5;
18
19 void slime_think()
20 {
21         self.think = slime_think;
22         self.nextthink = time + self.ticrate;
23         
24         monster_move(autocvar_g_monster_slime_speed_run, autocvar_g_monster_slime_speed_walk, 20, slime_anim_walk, slime_anim_walk, slime_anim_idle);
25 }
26
27 void slime_touch_jump()
28 {
29         if(self.health > 0)
30         if(other.health > 0)
31         if(other.takedamage)
32         if(vlen(self.velocity) > 200)
33         {
34                 Damage (self, world, world, self.health + self.max_health + 200, DEATH_MONSTER_SLIME, self.origin, '0 0 0');
35                         
36                 return;
37         }
38
39         if(trace_dphitcontents)
40         {
41                 self.touch = MonsterTouch;
42                 self.movetype = MOVETYPE_WALK;
43         }
44 }
45
46 float slime_attack(float attack_type)
47 {
48         switch(attack_type)
49         {
50                 case MONSTER_ATTACK_MELEE:
51                 case MONSTER_ATTACK_RANGED:
52                 {
53                         makevectors(self.angles);
54                         if(monster_leap(slime_anim_jump, slime_touch_jump, v_forward * 600 + '0 0 200', 0.5))
55                                 return TRUE;
56                 }
57         }
58         
59         return FALSE;
60 }
61
62 void slime_explode()
63 {
64         RadiusDamage(self, self, 250 * monster_skill, 15, 250 * (monster_skill * 0.7), world, 250, DEATH_MONSTER_SLIME, world);
65         pointparticles(particleeffectnum("explosion_medium"), self.origin, '0 0 0', 1);
66         sound(self, CH_SHOTS, "weapons/rocket_impact.wav", VOL_BASE, ATTN_NORM);
67         
68         setmodel(self, "");
69 }
70
71 void slime_dead()
72 {
73         self.health = -100; // gibbed
74         slime_explode();
75         
76         Monster_CheckDropCvars ("slime"); // drop items after exploding to prevent player picking up item before dying
77         
78         self.deadflag = DEAD_DEAD;
79         self.think = Monster_Fade;
80         self.nextthink = time + 0.1;
81         
82         monster_hook_death();
83         
84         self.event_damage = func_null; // reset by monster_hook_death
85         self.takedamage = DAMAGE_NO;
86 }
87
88 void slime_die()
89 {
90         self.think                      = slime_dead;
91         self.nextthink          = time;
92         self.event_damage   = func_null;
93         self.movetype           = MOVETYPE_NONE;
94         self.enemy                      = world;
95         self.health                     = 0;
96         
97         self.SendFlags |= MSF_MOVE | MSF_STATUS;
98 }
99
100 void slime_spawn()
101 {
102         if not(self.health)
103                 self.health = autocvar_g_monster_slime_health;
104         
105         self.damageforcescale   = 0.003;
106         self.classname                  = "monster_slime";
107         self.monster_attackfunc = slime_attack;
108         self.nextthink                  = time + random() * 0.5 + 0.1;
109         self.think                              = slime_think;
110         
111         monsters_setframe(slime_anim_idle);
112         
113         monster_setupsounds("slime");
114         
115         monster_hook_spawn(); // for post-spawn mods
116 }
117
118 void spawnfunc_monster_slime()
119 {
120         if not(autocvar_g_monster_slime) { remove(self); return; }
121         
122         self.monster_spawnfunc = spawnfunc_monster_slime;
123         
124         if(Monster_CheckAppearFlags(self))
125                 return;
126         
127         if not (monster_initialize(
128                          "Slime", MONSTER_SLIME,
129                          SLIME_MIN, SLIME_MAX,
130                          FALSE,
131                          slime_die, slime_spawn))
132         {
133                 remove(self);
134                 return;
135         }
136 }
137
138 // compatibility with old spawns
139 void spawnfunc_monster_tarbaby() { spawnfunc_monster_slime(); }
140
141 #endif // SVQC